ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC5odG1sCmluZGV4IGIzNWE3ZTQuLmJlNjEwOGUgMTAwNjQ0Ci0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoLmh0bWwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2guaHRtbApAQCAtNCw0MCArNCwxNyBAQAogPGhlYWQ+CiA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KIDxtZXRhIG5hbWU9IkJ1aWxkIiBjb250ZW50PSJCdWlsZCI+Ci08dGl0bGU+V1RQIDMuMC41IFBhdGNoZXM8L3RpdGxlPgorPHRpdGxlPldUUCAzLjIuNCBQYXRjaGVzPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMT5XVFAgMy4wLjUgUGF0Y2hlczwvaDE+Cis8aDE+V1RQIDMuMi40IFBhdGNoZXM8L2gxPgogCi08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI3NjUzOCc+Mjc2NTM4PC9hPi4gQW50IGNvbnNvbGUgb3V0cHV0IHNlZW1zIHRvIGltcGx5IHRoYXQgcGFyYW1ldGVyIGNhbiBiZSBzZXQgYnV0IHJlYWxseSBpdCBzaG91bGQgbm90IGJlPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODMzMTInPjI4MzMxMjwvYT4uIEFOVCBDbGllbnQgZ2VuLSBtZXNzYWdlIG1pc3Npbmcgc2VydmVyIG5hbWUgc3Vic3QuIHZhcmlhYmxlPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODMzOTknPjI4MzM5OTwvYT4uIFdlYiBTZXJ2aWNlcyA+IFNlcnZlciAmIFJ1bnRpbWUgcHJlZmVyZW5jZSB1bmRlZmluZWQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4Njg1OSc+Mjg2ODU5PC9hPi4gRUpCIFByb2plY3RzIGNyZWF0ZWQgYnkgd2ViIFNlcnZpY2UgV2l6YXJkcyBkb2VzIG5vdCBhZGQgdGhlIGVqYk1vZHVsZSBhcyBhIHNvdXJjZSBmb2xkZXI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4NTkzMyc+Mjg1OTMzPC9hPi4gU09BUEVsZW1lbnRTYXhIYW5kbGVyIHRvIGNyZWF0ZSB0ZXh0IG5vZGVzIHJlc3VsdHMgaW4gbnVsbCByZXR1cm4gZm9yIGNoYXIgc2l6ZSAxPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTEwNzUnPjI5MTA3NTwvYT4uIHJlbW92ZSBhdXRvIGJ1aWxkIGpvaW4gY2FsbHM8L3A+Ci08cD5CdWcgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MTE0MyI+MjkxMTQzPC9hPi4gTWVjaGFuaXNtIHRvIGV4cG9zZSBXRUItSU5GL2xpYiBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkxMjI1Jz4yOTEyMjU8L2E+LiBPdXRwdXQgZm9sZGVyIHN1cHBvcnQgaW4gSmF2YUVFIHByb2plY3RzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTI1NzEnPjI5MjU3MTwvYT4uIEphdmFFRSBFTUYgY29udGVudCBwcm92aWRlciBpbXByb3Blcmx5IHN5bmNocm9uaXppbmcgZHVyaW5nIG5vdGlmaWNhdGlvbjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkzNDk3Jz4yOTM0OTc8L2E+LiBVdGlsaXR5IGphcnMgcmVtb3ZlZCBmcm9tIHRoZSBwcm9wZXJ0aWVzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTkwNTknPjI5OTA1OTwvYT4uIENoZWNrIGZvciBNYWluLUNsYXNzIGluIE1BTklGRVNULk1GIHNob3VsZCBub3QgYWx3YXlzIG9jY3VyPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTk0MzInPjI5OTQzMjwvYT4uIEoyRUUgRGVwbG95bWVudCBmcmFtZXdvcmsgZG9lc24ndCBhbGxvdyBmYWNldCBleGNsdXNpb25zPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTk3NjQnPjI5OTc2NDwvYT4uIEV4Y2VwdGlvbiBmcm9tIEpFRTVDb250ZW50UHJvdmlkZXI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMDA5OCc+MzAwMDk4PC9hPi4gJ0luIExpYiBEaXInIGNoZWNrYm94IGJlaW5nIGlnbm9yZWQgd2hlbiBhIGphciBkZXBlbmRlbmN5IGlzIGFkZGVkIHRvIGFuIEVBUjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAyMDA5Jz4zMDIwMDk8L2E+LiBDbGFzc0Nhc3RFeGNlcHRpb24gd2hlbiBvcmcuZWNsaXBzZS53c3Qud3MuaWZpbGUydXJpY29udmVydGVyIHBsdWdnZWQgaW48L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwNDM4NSc+MzA0Mzg1PC9hPi4gQWxsb3cgdXNlcnMgdG8gZGlzYWJsZSBjb3B5aW5nIGF4aXMgamFyczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzE5MzExJz4zMTkzMTE8L2E+LiBKYXJzIGV4cG9ydGVkIGFzIHZhcmlhYmxlIG5hbWVzIGluc3RlYWQgb2YgamFyIG5hbWVzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjAxMzQnPjMyMDEzNDwvYT4uIEphdmEgZmFjZXQgdmVyc2lvbiBjaGFuZ2VzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjA0MzYnPjMyMDQzNjwvYT4uIGphcidzIHBsYWNlZCBpbiBKYXZhIEVFIDUgRWFyJ3MgbGliIGRpcmVjdG9yeSBzaG91bGQgbmV2ZXIgYmUgY29uc2lkZXJlZCAibW9kdWxlcyI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMDUzNic+MzIwNTM2PC9hPi4gVXNlciBkZWZpbmVkIGxvY2F0aW9uIHBhdGggZm9yIG5ldyBFYXIgbW9kdWxlcyBub3QgYmVpbmcgdXNlZCB1c2VkLjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIxNjU1Jz4zMjE2NTU8L2E+LiBaaXAgZmlsZSByZWZlcmVuY2VzIGFkZGVkIHRvIEVBUiBhcmUgZXhwb3J0ZWQgd2l0aCBleHRlbnNpb24gLnppcC5qYXI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMTg4NCc+MzIxODg0PC9hPi4gQmFja3BvcnQgMjg5MTEzOiBMaW51eDogdXNhYmlsaXR5IGlzc3VlIHdoZW4gc2VsZWN0aW5nIGEgSmF2YSBQcm9qZWN0IGluIHRoZSBTcGVjaWZ5IENsaWVudCBQcm9qZWN0IFNldHRpbmdzIGRpYWxvZzwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIyNDM2Jz4zMjI0MzY8L2E+LiBBZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzUGFnZS51cGRhdGVMaWJEaXIoKSBtZXRob2Qgc2hvdWxkIGNhbGwgZ2V0TW9kZWxPYmplY3QoKSBtZXRob2QgZnJvbSBpbnNpZGUgbW9kaWZ5IGJsb2NrPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjI5MzgnPjMyMjkzODwvYT4uIEludGVybmFsIGNvbXBvbmVudCBwYXRoIGluZm8gYmxlZWRpbmcgdGhyb3VnaCBFQVIgSjJFRSBNb2R1bGUgRGVwZW5kZW5jaWVzIHByb3BlcnRpZXMgcGFnZTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzI4MDkzJz4zMjgwOTM8L2E+LiBFQVIgTGlicmFyeSBEaXJlY3RvcnkgZmllbGQgc2hvdWxkIG5vdCBoYXZlIHByZWNlZGluZyBzbGFzaDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzI4NjUyJz4zMjg2NTI8L2E+LiBTYW1wbGUgSlNQczogU09BUEVsZW1lbnQgb3IgRWxlbWVudCBwYXJhbWV0ZXJzIHJlc3VsdCBpbiBjb21waWxlIGVycm9ycyBpbiBzYW1wbGU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMzNjI5NSc+MzM2Mjk1PC9hPi4gQWRkaW5nIGEgamFyIHdpdGggbWFpbi1jbGFzcyBpbiBNQU5JRkVTVC5NRiB0byBFQVIgMS40IGlzIGRldGVjdGVkIGFzIGFwcGxpY2F0aW9uIGNsaWVudDwvcD4KKzxoMj5vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlPC9oMj4KKworPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNDQ3MzMnPjM0NDczMzwvYT4uIFtKQVgtUlNdIFVwb24gc2VsZWN0aW9uLCB0aGUgSkFYLVJTIENvbmZpZ3VyYXRpb24gcGFnZSBpcyBibGFuayB3aGVuIFByb2plY3QgRmFjZXRzIHBhZ2UgaGFzIHVuYXBwbGllZCBjaGFuZ2VzPC9wPgorPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNDU2NjcnPjM0NTY2NzwvYT4uIE5QRSB3aGVuIGNyZWF0aW5nIGEgc2VydmxldCBpZiBjcmVhdGVkIGluIGEgc291cmNlIGZvbGRlciB3aXRoIGphdmEgYnVpbGQgcGF0aCBleGNsdXNpb24gcGF0dGVyczwvcD4KIAogPC9ib2R5PgogPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKaW5kZXggZWQ0YjE5Ni4uYWJlZWNjNCAxMDA2NDQKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKQEAgLTEsMzI4ICsxLDI2MiBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KIDx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIGJvZHkgeworICAgIHNpemU6IDguNWluIDExLjBpbjsKKyAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47CisgICAgdGFiLWludGVydmFsOiAwLjVpbjsKKyAgICB9CisgIHAgeyAgCQorICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICB9CisgIHAubGlzdCB7CisgIAltYXJnaW4tbGVmdDogMC41aW47CisgICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07CisgICAgfQorICA8L3N0eWxlPgorCiA8L2hlYWQ+CiAKLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KKzxib2R5IGxhbmc9IkVOLVVTIj4KIAotPGRpdiBjbGFzcz1TZWN0aW9uMT4KKzxoMj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2gyPgogCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Cis8cD5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQorUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUworQUdSRUVNRU5ULjwvcD4KIAotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Cis8cD48Yj4xLiBERUZJTklUSU9OUzwvYj48L3A+CiAKLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KKzxwPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3A+CiAKLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Cis8cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCitjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KIAotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Cis8cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KK29yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCitDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCitQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAorQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCitjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKK2FyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+CiAKLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgorPHA+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcwordGhlIFByb2dyYW0uPC9wPgogCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgorPHA+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyZxdW90OyBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhCitDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMKK0NvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uPC9wPgogCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorPHA+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlCit3aXRoIHRoaXMgQWdyZWVtZW50LjwvcD4KIAotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgorPHA+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIKK3RoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+CiAKLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Cis8cD48Yj4yLiBHUkFOVCBPRiBSSUdIVFM8L2I+PC9wPgogCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgorPHAgY2xhc3M9Imxpc3QiPmEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCitDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3Jrcworb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlCitDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbgorc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uPC9wPgogCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsCitvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudAorbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCitQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwKK3N1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCitieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKK2NvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLjwvcD4KIAotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5jKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yCitncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMKK2FyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKK3BhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2gKK0NvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkKK2FueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKK29yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZCBsaWNlbnNlcworZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8KK3NlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yCitleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudAordG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZQordGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9wPgogCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0CitoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKK3RoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuPC9wPgogCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgorPHA+PGI+My4gUkVRVUlSRU1FTlRTPC9iPjwvcD4KIAotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Cis8cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZQorZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KIAotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQ7IGFuZDwvcD4KIAotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9wPgogCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Cis8cCBjbGFzcz0ibGlzdCI+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKK29yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IKK2NvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L3A+CiAKLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKK2FsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAoraW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czs8L3A+CiAKLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMKK0FncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyCitwYXJ0eTsgYW5kPC9wPgogCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5pdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZQorZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhCityZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlCitleGNoYW5nZS48L3A+CiAKLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KKzxwPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L3A+CiAKLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgorPHAgY2xhc3M9Imxpc3QiPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvcD4KIAotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5iKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2gKK2NvcHkgb2YgdGhlIFByb2dyYW0uPC9wPgogCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KKzxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCit3aXRoaW4gdGhlIFByb2dyYW0uPC9wPgogCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Cis8cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cworQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAorUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KIAotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorPHA+PGI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2I+PC9wPgogCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKzxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgorcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlCitsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YKK3RoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlCitwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvcgoraW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygmcXVvdDtDb21tZXJjaWFsIENvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKK2luZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspCithZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KQorYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkCitwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUKK2FjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQorb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluCitvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkKK3RoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZQorSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24KK2V4cGVuc2UuPC9wPgogCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KKzxwPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKK2NsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKK2Fsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8KK2RlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UKK3BlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyCitDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCittdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvcD4KIAotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgorPHA+PGI+NS4gTk8gV0FSUkFOVFk8L2I+PC9wPgogCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Cis8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMKK1BST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUworT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCitBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkKK09SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKK3Jlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCitleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCit0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLAorZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKK2ludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLjwvcD4KIAotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Cis8cD48Yj42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvYj48L3A+CiAKLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KKzxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVAorTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKK0lOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcKK1dJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECitIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvcD4KIAotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KKzxwPjxiPjcuIEdFTkVSQUw8L2I+PC9wPgogCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Cis8cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCit0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24KK2J5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0KK2V4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgogCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Cis8cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyhpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZQorUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlcgorc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZQorZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuPC9wPgogCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKKzxwPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0CitmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcworQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUKK2FmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cwordW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCiBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KK1JlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS48L3A+CiAKLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgorPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKK0FncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKK0FncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCityZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKK0FncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQorRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKK2Fzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKK3N1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKK2dpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKK0NvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCitleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubworcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCit0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCitBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KIAotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Cis8cD5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkKK3RvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZQordGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMKK3JpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvcD4KIAogPC9ib2R5PgogCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCBmOGJkYjkzLi40NTAwYWY3IDEwMDY0NAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMTgsNyArMTgsNyBAQAogZmVhdHVyZU5hbWU9V1RQIFBhdGNoZXMgZm9yIG9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUKIAogIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCitwcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KIAogIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQogdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKQEAgLTI4LDM4ICsyOCwxMyBAQAogXG5cCiBUaGUgZml4ZXMgYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIGJ1Z3ppbGxhIGVudHJpZXM6XG5cCiBcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjc2NTM4IEFudCBjb25zb2xlIG91dHB1dCBzZWVtcyB0byBpbXBseSB0aGF0IHBhcmFtZXRlciBjYW4gYmUgc2V0IGJ1dCByZWFsbHkgaXQgc2hvdWxkIG5vdCBiZVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODMzMTIgQU5UIENsaWVudCBnZW4tIG1lc3NhZ2UgbWlzc2luZyBzZXJ2ZXIgbmFtZSBzdWJzdC4gdmFyaWFibGVcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgzMzk5IFdlYiBTZXJ2aWNlcyA+IFNlcnZlciAmIFJ1bnRpbWUgcHJlZmVyZW5jZSB1bmRlZmluZWRcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg2ODU5IEVKQiBQcm9qZWN0cyBjcmVhdGVkIGJ5IHdlYiBTZXJ2aWNlIFdpemFyZHMgZG9lcyBub3QgYWRkIHRoZSBlamJNb2R1bGUgYXMgYSBzb3VyY2UgZm9sZGVyXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4NTkzMyBTT0FQRWxlbWVudFNheEhhbmRsZXIgdG8gY3JlYXRlIHRleHQgbm9kZXMgcmVzdWx0cyBpbiBudWxsIHJldHVybiBmb3IgY2hhciBzaXplIDFcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkxMDc1IHJlbW92ZSBhdXRvIGJ1aWxkIGpvaW4gY2FsbHNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkxMTQzIE1lY2hhbmlzbSB0byBleHBvc2UgV0VCLUlORi9saWIgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkxMjI1IE91dHB1dCBmb2xkZXIgc3VwcG9ydCBpbiBKYXZhRUUgcHJvamVjdHNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkyNTcxIEphdmFFRSBFTUYgY29udGVudCBwcm92aWRlciBpbXByb3Blcmx5IHN5bmNocm9uaXppbmcgZHVyaW5nIG5vdGlmaWNhdGlvblxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTM0OTcgVXRpbGl0eSBqYXJzIHJlbW92ZWQgZnJvbSB0aGUgcHJvcGVydGllc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTkwNTkgQ2hlY2sgZm9yIE1haW4tQ2xhc3MgaW4gTUFOSUZFU1QuTUYgc2hvdWxkIG5vdCBhbHdheXMgb2NjdXJcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5NDMyIEoyRUUgRGVwbG95bWVudCBmcmFtZXdvcmsgZG9lc24ndCBhbGxvdyBmYWNldCBleGNsdXNpb25zXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTc2NCBFeGNlcHRpb24gZnJvbSBKRUU1Q29udGVudFByb3ZpZGVyXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMDA5OCAnSW4gTGliIERpcicgY2hlY2tib3ggYmVpbmcgaWdub3JlZCB3aGVuIGEgamFyIGRlcGVuZGVuY3kgaXMgYWRkZWQgdG8gYW4gRUFSXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMjAwOSBDbGFzc0Nhc3RFeGNlcHRpb24gd2hlbiBvcmcuZWNsaXBzZS53c3Qud3MuaWZpbGUydXJpY29udmVydGVyIHBsdWdnZWQgaW5cblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzA0Mzg1IEFsbG93IHVzZXJzIHRvIGRpc2FibGUgY29weWluZyBheGlzIGphcnNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzE5MzExIEphcnMgZXhwb3J0ZWQgYXMgdmFyaWFibGUgbmFtZXMgaW5zdGVhZCBvZiBqYXIgbmFtZXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIwMTM0IEphdmEgZmFjZXQgdmVyc2lvbiBjaGFuZ2VzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMDQzNiBqYXIncyBwbGFjZWQgaW4gSmF2YSBFRSA1IEVhcidzIGxpYiBkaXJlY3Rvcnkgc2hvdWxkIG5ldmVyIGJlIGNvbnNpZGVyZWQgIm1vZHVsZXMiXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMDUzNiBVc2VyIGRlZmluZWQgbG9jYXRpb24gcGF0aCBmb3IgbmV3IEVhciBtb2R1bGVzIG5vdCBiZWluZyB1c2VkIHVzZWQuXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMTY1NSBaaXAgZmlsZSByZWZlcmVuY2VzIGFkZGVkIHRvIEVBUiBhcmUgZXhwb3J0ZWQgd2l0aCBleHRlbnNpb24gLnppcC5qYXJcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIxODg0IEJhY2twb3J0IDI4OTExMzogTGludXg6IHVzYWJpbGl0eSBpc3N1ZSB3aGVuIHNlbGVjdGluZyBhIEphdmEgUHJvamVjdCBpbiB0aGUgU3BlY2lmeSBDbGllbnQgUHJvamVjdCBTZXR0aW5ncyBkaWFsb2dcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIyNDM2IEFkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlLnVwZGF0ZUxpYkRpcigpIG1ldGhvZCBzaG91bGQgY2FsbCBnZXRNb2RlbE9iamVjdCgpIG1ldGhvZCBmcm9tIGluc2lkZSBtb2RpZnkgYmxvY2tcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIyOTM4IEludGVybmFsIGNvbXBvbmVudCBwYXRoIGluZm8gYmxlZWRpbmcgdGhyb3VnaCBFQVIgSjJFRSBNb2R1bGUgRGVwZW5kZW5jaWVzIHByb3BlcnRpZXMgcGFnZVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjgwOTMgRUFSIExpYnJhcnkgRGlyZWN0b3J5IGZpZWxkIHNob3VsZCBub3QgaGF2ZSBwcmVjZWRpbmcgc2xhc2hcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzI4NjUyIFNhbXBsZSBKU1BzOiBTT0FQRWxlbWVudCBvciBFbGVtZW50IHBhcmFtZXRlcnMgcmVzdWx0IGluIGNvbXBpbGUgZXJyb3JzIGluIHNhbXBsZVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMzYyOTUgQWRkaW5nIGEgamFyIHdpdGggbWFpbi1jbGFzcyBpbiBNQU5JRkVTVC5NRiB0byBFQVIgMS40IGlzIGRldGVjdGVkIGFzIGFwcGxpY2F0aW9uIGNsaWVudFxuXAorQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNDQ3MzMgW0pBWC1SU10gVXBvbiBzZWxlY3Rpb24sIHRoZSBKQVgtUlMgQ29uZmlndXJhdGlvbiBwYWdlIGlzIGJsYW5rIHdoZW4gUHJvamVjdCBGYWNldHMgcGFnZSBoYXMgdW5hcHBsaWVkIGNoYW5nZXNcblwKK0J1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzQ1NjY3IE5QRSB3aGVuIGNyZWF0aW5nIGEgc2VydmxldCBpZiBjcmVhdGVkIGluIGEgc291cmNlIGZvbGRlciB3aXRoIGphdmEgYnVpbGQgcGF0aCBleGNsdXNpb24gcGF0dGVyc1xuXAogXG5cCiAKICMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgogY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKK0NvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKQEAgLTc2LDggKzUxLDggQEAKICMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1BdWd1c3QsIDIwMDhcblwKK0VjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAorQXByaWwgMTQsIDIwMTBcblwKIFxuXAogVXNhZ2UgT2YgQ29udGVudFxuXAogXG5cCkBAIC04NSw0MiArNjAsMzggQEAKIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAogVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCiBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKK05PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCiBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCiBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK09SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAogVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAogT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKK0VjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCit0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAorcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAogRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKIENvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAorZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCityZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCiBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKKyAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCisgICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCisgICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAorICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCisgICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAorICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCisgICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCisgICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKKyAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCiBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKQEAgLTEyOSw0NyArMTAwLDc3IEBACiBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCiBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKIFxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKyAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKyAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKyAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKyAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAogTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAorUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAorVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAogSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCiB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK3RoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKK3Rlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKK2dvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAogU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCisgICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKyAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKyAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAorICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKIFxuXAogSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKK1RPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAogaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAorXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKK2J1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCit0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKK290aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAordGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCitJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAorXG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCitZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCittYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorXG5cCisgICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAorICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAorICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisgICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAorICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCisgICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKKyAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAorICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAorICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKKyAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKKyAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCisgICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorXG5cCiBDcnlwdG9ncmFwaHlcblwKIFxuXAogQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCiBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCiBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCiB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKK3JlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCiBcblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCiAjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCmluZGV4IDZmZDRiMWYuLjY5ZmVhZDIgMTAwNjQ0Ci0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaCIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuNS5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSIzLjIuNC5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uPgpAQCAtMTgsNDUgKzE4LDEwIEBACiAgICA8L2xpY2Vuc2U+CiAKICAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjUudjIwMDkwNDA3MDAzMC03WTdCRlRCRVBPd1FRaFA5LV9VWEZ4UkJRdld3IiBwYXRjaD0idHJ1ZSIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV91aS5mZWF0dXJlIiB2ZXJzaW9uPSIzLjIuNC52MjAxMTA0MjAxNDE3LTdiN0hIZllGU0syV0R2U0hCMHBUeU5aN1RwWW8iIHBhdGNoPSJ0cnVlIi8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuYXhpcy5jb25zdW1wdGlvbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgogICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpIgogICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKICAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKQEAgLTY0LDM0ICsyOSw3IEBACiAgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CiAKICAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpIgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy5qYXhycy51aSIKICAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCiAgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCiAgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3VpLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKaW5kZXggMjM0NzA2MC4uYzE4NGNhMyAxMDA2NDQKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdWkuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKQEAgLTEsOTMgKzEsMTA3IEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Cis8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KIAotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5BcHJpbCAxNCwgMjAxMDwvcD4KIAotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKKyAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorCis8dWw+CisgICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKyAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisgICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKzwvdWw+CisKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisgICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisgICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKyAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisgICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworCis8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKKyAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKyAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKyAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KKworPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQorICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisgICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCis8b2w+CisgICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAorICAgICAgIHByb2R1Y3QuPC9saT4KKyAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisgICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKyAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCisgICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKKyAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgorPC9vbD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisKKzxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvYnVpbGRub3Rlc19vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC5odG1sCmluZGV4IGQ5M2MyODYuLmY2YTZiODUgMTAwNjQ0Ci0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2guaHRtbAorKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoLmh0bWwKQEAgLTksMTI0ICs5LDEzIEBACiAKIDxib2R5PgogCi08aDE+V1RQIDMuMC41IFBhdGNoZXM8L2gxPgorPGgxPldUUCAzLjIuNCBQYXRjaGVzPC9oMT4KIAotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yNzIzODknPjI3MjM4OTwvYT4uIHRva2VuaXplcnMgc3R1Y2sgaW4gbG9vcCB3aGVuIGlucHV0IG5vdCBtYXRjaGVkPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yNzgxMzEnPjI3ODEzMTwvYT4uIFN0YWNrT3ZlcmZsb3cgdGhyb3duIGluIEpET01TZWFyY2hIZWxwZXIuZmluZElubmVySmF2YUVsZW1lbnQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI3OTAzOCc+Mjc5MDM4PC9hPi4gSlNQIG9wZW5zIGRpcnR5IGlmIGNvbnRlbnQgdHlwZSBoZWFkZXIgbWlzc3BlbGxzICJjaGFyc2V0IjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjc5MTc1Jz4yNzkxNzU8L2E+LiBBbiBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZCBkdXJpbmc6ICJWYWxpZGF0aW9uIFRlc3RFSkIiLjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgxMTQ3Jz4yODExNDc8L2E+LiBwcm9ibGVtIGFkZGluZyBlZTUgbGlicyB0byBjb250YWluZXI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4MTU2Mic+MjgxNTYyPC9hPi4gVW5zYWZlIEpEVCBjYWxscyBpbiBjbGFzc3BhdGggY29udGFpbmVyIGNvZGU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4MzE3Nic+MjgzMTc2PC9hPi4gTlBFIGluIEVBUkFydGlmYWN0RWRpdC5nZXRNb2R1bGVCeU1hbmlmZXN0VVJJKFN0cmluZyB1cmkpPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODMyMDknPjI4MzIwOTwvYT4uICFNRVNTQUdFIEV4Y2VwdGlvbiB3aGlsZSByZWFkaW5nIC9FQVI1Q2xpZW50Ly5jbGFzc3BhdGg8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4MzMxOCc+MjgzMzE4PC9hPi4gU2luZ2xlIHJvb3QgY2hlY2sgZmFpbGluZyB3aGVuIHNvdXJjZSBmb2xkZXIgbWFwcGVkIGJ1dCBkZWxldGVkPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODM1ODAnPjI4MzU4MDwvYT4uIEVBUiA1LjAgbGlicyBwZXJmb3JtYW5jZSBhbmQgbWlzc2luZyB1cGRhdGVzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODM2MDEnPjI4MzYwMTwvYT4uIEZvciBXZWIgUHJvamVjdCB2ZXJpZnkgc291cmNlIGZvbGRlcnMgYW5kIHdlYiBjb250ZW50IGRvIG5vdCBjb2xsaWRlPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODM2MzInPjI4MzYzMjwvYT4uIEVKYiByZWYgdmFsaWRhdGlvbiBpbiBFQVIgdmFsaWRhdG9yIG5lZWQgdG8gdGhyb3cgZXJyb3IgbWVzc2FnZTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg0MzAyJz4yODQzMDI8L2E+LiBNZW1vcnkgbGVha3MgaW4gSUFyY2hpdmUgY2xhc3NlczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg0MzI3Jz4yODQzMjc8L2E+LiBNZW1vcnkgbGVha3MgYmVjYXVzZSBvZiBmaW5hbCBzdGF0aWMgY29uc3RhbnRzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODQ5MzInPjI4NDkzMjwvYT4uIFRhZ2xpYkluZGV4IG9wdGltaXphdGlvbiBpZ25vcmVzIGltcG9ydGFudCByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODUwODcnPjI4NTA4NzwvYT4uIEpTUCBUcmFuc2xhdG9yIGRvZXMgbm90IHN1cHBvcnQgSXRlcmF0aW9uVGFnIGNvbnN0cnVjdHM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4NjkzNyc+Mjg2OTM3PC9hPi4gRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIGZyb20gVGFnbGliSGVscGVyLmlzSXRlcmF0aW9uVGFnIGluIGxvZzwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg2OTY5Jz4yODY5Njk8L2E+LiBKYXZhIHN0cmluZyBjb25zdGFudHMgY29udGFpbmluZyBlbnRpdHkgcmVmZXJlbmNlcyBnZXQgZGVjb2RlZDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg3NzQyJz4yODc3NDI8L2E+LiBFQVIgaW1wb3J0IHNob3dpbmcgZWpiIGNsaWVudCBqYXJzIG9uIHNlY29uZCBwYWdlIHdoZW4gaXQgc2hvdWxkIG5vdDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg3NzQ5Jz4yODc3NDk8L2E+LiBDb3JlIGV4Y2VwdGlvbnMgZHVyaW5nIEVBUiBpbXBvcnQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4ODE4NCc+Mjg4MTg0PC9hPi4gRWFyIGltcG9ydCBmYWlscyBpZiB0d28gRUpCIG1vZHVsZXMgdXNlIHNhbWUgY2xpZW50IGphcjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg4ODMyJz4yODg4MzI8L2E+LiBJQXJjaGl2ZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyB3aXRoIGxhcmdlIGFtb3VudCBvZiBmaWxlcyB3aXRoaW4gc2luZ2xlIGFyY2hpdmU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4OTIwMyc+Mjg5MjAzPC9hPi4gRmFjZXQgY2xhc3NwYXRoIHV0aWxpdHkgbm90IHByb3Blcmx5IG1pZ3JhdGluZyBsZWdhY3kgcHJvamVjdHM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4ODI5MCc+Mjg4MjkwPC9hPi4gTlBFcyBpbiBUTERDTURvY3VtZW50TWFuYWdlcjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg5MjU3Jz4yODkyNTc8L2E+LiBbdHJhbnNsYXRpb25dIEpTUFRyYW5zbGF0b3Igc2hvdWxkIGhhbmRsZSBhc3NpZ25tZW50IGluIEpTUCBleHByZXNzaW9uczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkwODMyJz4yOTA4MzI8L2E+LiBCYWNrcG9ydCB0aGUgZml4IGZvciBidWd6aWxsYSMyNjA5MzEgdG8gd3RwIDMuMC41PC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTA3MzgnPjI5MDczODwvYT4uIEZhbHNlIGVycm9ycy93YXJuaW5ncyB3aGVuIHZhbGlkYXRpbmcgZXhwcmVzc2lvbnMgd2l0aCBtYXBzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTA1NDMnPjI5MDU0MzwvYT4uIEJhY2twb3J0IHRoZSBmaXggZm9yIGJ1Z2lsbGEjMjgyOTM2IHRvIHd0cCAzLjAuNTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkwNDEyJz4yOTA0MTI8L2E+LiBQZXJmb3JtYW5jZSBwcm9ibGVtIGluIG1ldGhvZCBUeXBlVXRpbC5yZXNvbHZlSW5QYXJlbnRzKCk8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDU4MSc+MjkwNTgxPC9hPi4gTWFudWFsIHZhbGlkYXRpb24gaXMgY2xlYW5pbmcgdXAgdGhlIGFscmVhZHkgdmFsaWRhdGVkIGNhY2hlIG9uIGV2ZXJ5IGNhbGw8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDc0Mic+MjkwNzQyPC9hPi4gRUFSIEV4cG9ydCBub3QgcHJvcGVybHkgY2xvc2luZyAxLjQgYXJjaGl2ZXM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDc1Nyc+MjkwNzU3PC9hPi4gJ1ByZXBhcmUgZm9yIERlcGxveW1lbnQnIGVycm9yIG1lc3NhZ2Ugc3RhdGVzICJKMkVFRGVwbG95T3BlcmF0aW9uXzJfVUlfIjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkwODM3Jz4yOTA4Mzc8L2E+LiBFeGNlcHRpb25zIGZyb20gSkVNIGluIGFkb3B0ZXIgcHJvZHVjdDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkwOTY2Ij4yOTA5NjY8L2E+LiBKU1AgaW5jbHVkZSBkaXJlY3RpdmVzIGRvIG5vdCBoYW5kbGUgbm9uLUpTUCBjb250ZW50IHR5cGVzPC9wPgotPHA+QnVnIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTExNDMiPjI5MTE0MzwvYT4uIE1lY2hhbmlzbSB0byBleHBvc2UgV0VCLUlORi9saWIgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MTIyNSc+MjkxMjI1PC9hPi4gT3V0cHV0IGZvbGRlciBzdXBwb3J0IGluIEphdmFFRSBwcm9qZWN0czwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkxMjUxJz4yOTEyNTE8L2E+LiBBUEkgbmVlZGVkIHRvIGRldGVybWluZSBpZiBwcm9qZWN0IGhhcyBubyBzaW5nbGUgcm9vdCBhbmQgcmVhc29ucyB3aHk8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MTI2Nic+MjkxMjY2PC9hPi4gRGVsZXRpbmcgamF2YSBzb3VyY2UgZm9sZGVycyBzaG91bGQgcmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGFydGlmYWN0cyBmcm9tIHRoZSAuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQgZmlsZTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkxNTM2Jz4yOTE1MzY8L2E+LiBTZXNzaW9uIEJlYW4gcmVtb3RlIGludGVyZmFjZSB2YWxpZGF0aW9uIHNob3VsZCBiZSBlcnJvciBmb3IgbWlzc2luZyBtZXRob2RzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yNDkwNDQnPjI0OTA0NDwvYT4uIFdlYiBtb2R1bGUncyBqYXIgbW9kdWxlcyBmcm9tIGFub3RoZXIgcHJvamVjdCBhcmUgbm90IHB1Ymxpc2hlZCBmb3IgVG9tY2F0LjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjcyMDEzJz4yNzIwMTM8L2E+LiBKRU0gSmVtUHJvamVjdFV0aWxpdGllcyNnZXRDbGFzc3BhdGhBc1VSTEFycmF5KElKYXZhUHJvamVjdCkgZmFpbHMgdG8gaGFuZGxlIGNsYXNzIGZvbGRlcnM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDczOSc+MjkwNzM5PC9hPi4gRG9uJ3QgdmFsaWRhdGUgdGhlIGV4cHJlc3Npb24gc2VnbWVudHMgYWZ0ZXIgdGhlIG1hcCBpZiB0aGUgbWFwIHZhbHVlIHR5cGUgaXMgT2JqZWN0PC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTIwNzknPjI5MjA3OTwvYT4uIFtwYXJzZXJdIFNjcmlwdGxldCBpbiBzY3JpcHQgYXR0cmlidXRlIHRhZ3MgY2FuIGNhdXNlIHRoZSByZWdpb24gdG8gbm90IGJlIGJsb2NrIHRleHQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MjA4MSc+MjkyMDgxPC9hPi4gW3RyYW5zbGF0aW9uXSBKYXZhc2NyaXB0IGNhbiBjYXVzZSBjdXN0b20gdGFncyB0byBub3QgYmUgdHJhbnNsYXRlZDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkyMTYyJz4yOTIxNjI8L2E+LiBpc1NpbmdsZVJvb3QgQVBJIHNob3VsZCBhbGxvdyBub24gSmF2YSBzcmMgZm9sZGVyIGFzIG91dHB1dCBmb3IgSkNBPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTIxNzcnPjI5MjE3NzwvYT4uIFt2YWxpZGF0aW9uXSBKU1BEaXJlY3RpdmVWYWxpZGF0b3IjcHJvY2Vzc1RhZ2xpYkRpcmVjdGl2ZSBzaG91bGQgaGFuZGxlIFVSTCBUYWdsaWIgUmVjb3JkczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkyMTg2Jz4yOTIxODY8L2E+LiBXZWJMaWIgUXVpY2sgZml4ZXMgcmV2ZXJ0aW5nIGV4Y2x1c2lvbnM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MzA0Nyc+MjkzMDQ3PC9hPi4gUHJvYmxlbSB3aXRoIFdUUFdvcmtpbmdDb3B5TWFuYWdlciBhbmQgZGVsZXRpbmcgcHJvamVjdHM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MzUwMic+MjkzNTAyPC9hPi4gUGVyZm9ybWFuY2UgZGVncmFkYXRpb24gYmVjYXVzZSBvZiBKYXZhTGl0ZSBjYWxsczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkzNjg1Jz4yOTM2ODU8L2E+LiBKQVgtUlBDIGNsaWVudCBKU1BzOiBKU1BHMDAzNkU6IEZhaWxlZCB0byBmaW5kIHJlc291cmNlIC9zYW1wbGVFY2hvUHJveHkvVGVzdENsaWVudC5qc3A8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5Mzk5Mic+MjkzOTkyPC9hPi4gW3ZhbGlkYXRpb25dIEpTUEJhdGNoVmFsaWRhdG9yIGlzIHRha2luZyBzdWJzdGFudGlhbGx5IGxvbmdlciB3aGVuIG5lZWRlZCB0YWdsaWJzIGFyZSBub3Qgb24gY2xhc3MgcGF0aDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkzOTgxJz4yOTM5ODE8L2E+LiBbdmFsaWRhdGlvbl0gQXR0cmlidXRlcyBkbyBub3QgaW5kaWNhdGUgcHJvYmxlbXMgd2l0aCBkeW5hbWljIGNvbnRlbnQgaW4gcnRleHBydmFsdWUgYXR0cmlidXRlczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk0MzY5Jz4yOTQzNjk8L2E+LiBFQVIgNS4wIExpYiB1dGlsaXR5IGRlcGxveW1lbnQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5NDQ5MCc+Mjk0NDkwPC9hPi4gRUFSIExpYnJhcmllcyBjb250YWluZXIgbWlzY29tcHV0aW5nIGJlY2F1c2Ugb2Ygc3RhbGUgSUphdmFMaXRlPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTMyMTEnPjI5MzIxMTwvYT4uIFBlcmZvcm1hbmNlIHByb2JsZW0gd2hlbiB2YWxpZGF0ZSBtYW5hZ2VkIHByb3BlcnRpZXM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5NDYyNyc+Mjk0NjI3PC9hPi4gRGVsZXRpbmcgZm9sZGVycyBzaG91bGQgcmVtb3ZlIGVudHJ5IGZyb20gLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50IGZpbGU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5NTM1Myc+Mjk1MzUzPC9hPi4gQWRkaW5nIG1vZHVsZSB0byBhcHBsaWNhdGlvbi54bWwgbm8gbG9uZ2VyIGdlbmVyYXRpbmcgImlkIiBhdHRyaWJ1dGVzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTQ3MTYnPjI5NDcxNjwvYT4uIENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlciBtYXkgY2F1c2UgU0FYUGFyc2VFeGNlcHRpb248L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5NTYxNyc+Mjk1NjE3PC9hPi4gV2ViIHByb2plY3QgY3JlYXRpb24gZG9lcyBub3QgaG9ub3VyIHVzZXIgaW5wdXQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5NTcyOCc+Mjk1NzI4PC9hPi4gRGVmZXJyZWQgRUwgZXhwcmVzc2lvbnMgYXJlIGJlaW5nIG1hcmtlZCB3aXRoIHZhbGlkYXRpb24gcHJvYmxlbXM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5NjcxOSc+Mjk2NzE5PC9hPi4gUnVudGltZSBDaGFuZ2UgRGVsZWdhdGUgdGhyb3dzIE5QRSB3aGVuIGNoYW5naW5nIGZyb20gVW5rbm93biBSdW50aW1lIHR5cGU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5ODc5Nic+Mjk4Nzk2PC9hPi4gaXNTaW5nbGVSb290IEFQSSBzaG91bGQgbm90IHJlcXVpcmUgYSBKYXZhIHNyYyBmb2xkZXI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MzUwNCc+MjkzNTA0PC9hPi4gW3ZhbGlkYXRpb25dIEpTUCBzeW50YXggdmFsaWRhdG9yIHJlcXVpcmVzIGJyYWNrZXRzIGFmdGVyIElGIHN0YXRlbWVudDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk3ODUyJz4yOTc4NTI8L2E+LiBFcnJvciBsb2cgZW50cnkgZm9yIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiByZWxhdGVkIHRvIEFubm90YXRpb25zIGFuZCBFTUY8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5ODg5MSc+Mjk4ODkxPC9hPi4gQ2xhc3NwYXRoIGluaXRpYWxpemF0aW9uIGlzIHZlcnkgc2xvdyBmb3IgY29tcGxleCBFQVJzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTkxNTYnPjI5OTE1NjwvYT4uIFtwYXJzZXJdIEpTUFRva2VuaXplciBkb2VzIG5vdCBkZXRlY3QgVW5pY29kZSBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBhcyB5b3UgdHlwZTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5MzkzJz4yOTkzOTM8L2E+LiBWYWxpZGF0aW9uIG9mIHJ1bnRpbWUgZXhwcmVzc2lvbnMgaW4gSlNQIGN1c3RvbSB0YWcgYXR0cmlidXRlczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5NDMyJz4yOTk0MzI8L2E+LiBKMkVFIERlcGxveW1lbnQgZnJhbWV3b3JrIGRvZXNuJ3QgYWxsb3cgZmFjZXQgZXhjbHVzaW9uczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5NDM3Jz4yOTk0Mzc8L2E+LiBOUEVzIGxvZ2dlZCBkdWUgdG8gYnVnIDI5NTM1MzwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5NDg4Jz4yOTk0ODg8L2E+LiBbdHJhbnNsYXRpb25dIFhNTEpTUFJlZ2lvbkhlbHBlciNkZWNvZGVSZW1haW5pbmdSZWdpb25zIGNhbiBjYXVzZSBOUEU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTQ4OSc+Mjk5NDg5PC9hPi4gW2NvbnRlbnQgbW9kZWxdIENNRG9jdW1lbnRGYWN0b3J5VExEI2dldENvbnRhaW5lZFRleHQgY2FuIGNhdXNlIE5QRTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5NTQxJz4yOTk1NDE8L2E+LiBFeGNlc3NpdmUgbG9nZ2luZyBpbiBUYWdsaWJDbGFzc0xvYWRlcjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5NjU1Jz4yOTk2NTU8L2E+LiBDbGFzc3BhdGhTZWxlY3Rpb24gbmVlZHMgYmV0dGVyIGVycm9yIGhhbmRsaW5nPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTk3ODUnPjI5OTc4NTwvYT4uIEhUTUwgY2F1c2VzIHZhbGlkYXRpb24gZXJyb3JzIGluIFRhZyBmaWxlczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAwMDYyJz4zMDAwNjI8L2E+LiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvZiBWaXJ0dWFsQ29tcG9uZW50IGNhY2hpbmc8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMDA5OCc+MzAwMDk4PC9hPi4gJ0luIExpYiBEaXInIGNoZWNrYm94IGJlaW5nIGlnbm9yZWQgd2hlbiBhIGphciBkZXBlbmRlbmN5IGlzIGFkZGVkIHRvIGFuIEVBUjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAwMTgzJz4zMDAxODM8L2E+LiBDb21wb25lbnRjb3JlLmNyZWF0ZUNvbXBvbmVudCByZXR1cm5zIGEgbnVsbCB2YWx1ZSB3aGVuIGNhbGxlZCBmcm9tIGFkb3B0ZXIgcHJvZHVjdDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAwMzg3Jz4zMDAzODc8L2E+LiBOZWVkIHRvIHByb3RlY3QgYWdhaW5zdCBOUEUgaW4gYWRvcHRlciBKMkVFRWxlbWVudENoYW5nZWRMaXN0ZW5lcjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAxNDE5Jz4zMDE0MTk8L2E+LiBJbGxlZ2FsRXhjZXB0aW9uIHRocm93biBkdXJpbmcgZGVwbG95bWVudDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAxNDc3Jz4zMDE0Nzc8L2E+LiBFQVIgTGlicmFyaWVzIGNvbnRhaW5lciBtaXNzaW5nIGVudHJpZXMgb24gcmVzdGFydDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAxNTQwJz4zMDE1NDA8L2E+LiBJbmNvcnJlY3QgcmVwb3J0aW5nIG9mIEpTUCBwcm9ibGVtczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAxNTk4Jz4zMDE1OTg8L2E+LiBbdHJhbnNsYXRpb25dIENhbm5vdCBiZSByZXNvbHZlZCBlcnJvcnMgd2hlbiBTdHJ1dHMgPGJlYW46ZGVmaW5lPiBpcyBkZWZpbmVkIHdpdGhpbiBpbnB1dCB0eXBlIEhUTUwgdGFnPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDMwNzAnPjMwMzA3MDwvYT4uIHJhbmRvbSBidWlsZC9jb21waWxlIGVycm9yIGR1ZSB0byBvdXQgb2Ygc3luYyBkZXBsb3ltZW50IGRlc2NyaXB0b3I8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMzE0MCc+MzAzMTQwPC9hPi4gQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIGluY29ycmVjdGx5IGhhbmRsZXMgLnNldHRpbmdzIGZpbGVzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDMxMzEnPjMwMzEzMTwvYT4uIEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIuZ2V0RUFSTGliRGlyIHNob3VsZCBjaGVjayBib3RoIEREIGFuZCBmYWNldCB2ZXJzaW9uPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDM5NjMnPjMwMzk2MzwvYT4uIEVycm9yIEV4Y2VwdGlvbiBsb2dnZWQgZHVyaW5nIGRlcGxveTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzA1MjUyJz4zMDUyNTI8L2E+LiBDbGFzc0Nhc3RFeGNlcHRpb246ajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCBpbmNvbXBhdGlibGUgd2l0aCBqYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb248L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwNTI1Myc+MzA1MjUzPC9hPi4gUGVyZm9ybWFuY2UgaXNzdWUgaW4gTWFudWFsIEVBUiB2YWxpZGF0aW9uPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDYwNTgnPjMwNjA1ODwvYT4uIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGNvbWluZyBmcm9tIHRoZSBUYWdsaWJIZWxwZXI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxMzE4MSc+MzEzMTgxPC9hPi4gSmF2YSBFRSBpbXBvcnQgZmFpbHMgaWYgemlwIGVudHJpZXMgY29udGFpbiBsZWFkaW5nIHNsYXNoZXM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxMzM5OSc+MzEzMzk5PC9hPi4gT3BlbmVyIG9mIEFyY2hpdmUgZGlkbid0IGNsb3NlIGEgZmlsZTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzEzNjA4Jz4zMTM2MDg8L2E+LiByYW5kb20gYnVpbGQvY29tcGlsZSBlcnJvciBkdWUgdG8gb3V0IG9mIHN5bmMgZmlsZXM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxMzYzMCc+MzEzNjMwPC9hPi4gVjEgVmFsaWRhdG9yIGV4dGVuc2lvbiBwb2ludCBjaGFuZ2VzIGZvciBwZXJmb3JtYW5jZTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzE2MjIyJz4zMTYyMjI8L2E+LiBbcGFyc2VyXSA8IG9yID4gaW4gYXR0cmlidXRlIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzE2MjkxJz4zMTYyOTE8L2E+LiBbaG90YnVnXSBCYWNrcG9ydCAyOTI5NDMgdG8gd3RwIDMuMC41UGF0Y2g8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxNzU2MCc+MzE3NTYwPC9hPi4gRXJyb3JzIGZsYWdnZWQgYnkgZXJyb3IgYW5ub3RhdGlvbnMgbm90IHJlZmxlY3RlZCBpbiB0aGUgUHJvYmxlbXMsIEV4cGxvcmVyLCBhbmQvb3IgTmF2aWdhdG9yIHZpZXdzLjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzE4NzM2Jz4zMTg3MzY8L2E+LiBJbXBvcnREYXRhTW9kZWwgdW5zYWZlbHkgY2hlY2tzIGphdmEgZmFjZXQgbmFtZTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzE5MzExJz4zMTkzMTE8L2E+LiBKYXJzIGV4cG9ydGVkIGFzIHZhcmlhYmxlIG5hbWVzIGluc3RlYWQgb2YgamFyIG5hbWVzPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTk0MzknPjMxOTQzOTwvYT4uIEVBUiBWYWxpZGF0aW9uIHRocm93cyBleGNlcHRpb25zIG9uIHByb2plY3QgY2xvc2U8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxOTczNSc+MzE5NzM1PC9hPi4gVW53YW50ZWQgbmV3bGluZXMgYmVmb3JlIGRpc3BsYXkgbmFtZSB2YWx1ZTwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIwMzEyJz4zMjAzMTI8L2E+LiBOTFMgbWlzc2luZyBtZXNzYWdlcyBpbiAubG9nPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjAzMjInPjMyMDMyMjwvYT4uIFt2YWxpZGF0aW9uXSBKU1Agc291cmNlIHZhbGlkYXRvcnMgcnVubmluZyBldmVuIHdoZW4gcmVzcGVjdGl2ZSBiYXRjaCB2YWxpZGF0b3JzIGhhdmUgYmVlbiB0dXJuZWQgb2ZmPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjA0MzYnPjMyMDQzNjwvYT4uIGphcidzIHBsYWNlZCBpbiBKYXZhIEVFIDUgRWFyJ3MgbGliIGRpcmVjdG9yeSBzaG91bGQgbmV2ZXIgYmUgY29uc2lkZXJlZCAibW9kdWxlcyI8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMjE3Myc+MzIyMTczPC9hPi4gSjJFRURlcGxveU9wZXJhdGlvbiBkb2VzIG5vdCBhbGxvdyBjYWxsZXJzIHRvIGdldCBhIGxpc3Qgb2YgYWZmZWN0ZWQgcHJvamVjdHM8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMjQxMSc+MzIyNDExPC9hPi4gV2VibGliIGNsYXNzcGF0aCBkZXBlbmRlbmNpZXMgbm90IHJldHVybmVkIGZyb20gbWVtYmVycygpIHdoZW4gc2luZ2xlLXJvb3Q8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMjY3OCc+MzIyNjc4PC9hPi4gSW4gRUFSVmlydHVhbENvbXBvbmVudC5nZXRIYXJkUmVmZXJlbmNlcywgbmVlZCB0byBnZXQgdGhlIGFyY2hpdmVOYW1lIGRpcmVjdGx5IGZyb20gdGhlIHJlZmVyZW5jZWRDb21wb25lbnQsIGluc3RlYWQgb2YgZ2V0dGluZyBpdCBmcm9tIHRoZSBkZXBlbmRlbnRPYmplY3Q8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMjk1Myc+MzIyOTUzPC9hPi4gSjJFRURlcGxveU9wZXJhdGlvbiBhZmZlY3QgcHJvamVjdHMgc3VwcG9ydCBuZWVkcyBhIHdheSB0byB0ZWxsIGlmIGFueSBkZXBsb3llciBkbyBub3QgcHJvdmlkZSB0aGF0IGluZm88L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyNDIyMSc+MzI0MjIxPC9hPi4gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5pbkxpYkRpciBuZWVkcyB0byBjb25zaWRlciBjb21wb25lbnQgcGFyYW1ldGVyIHdoaWxlIHJldHVybmluZyByZXN1bHQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyNTgwMyc+MzI1ODAzPC9hPi4gTlBFIGluIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLlhNTEpTUFJlZ2lvbkhlbHBlci5kZWNvZGVSZW1haW5pbmdSZWdpb25zKFhNTEpTUFJlZ2lvbkhlbHBlci5qYXZhOjI3OCk8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyNjAxNSc+MzI2MDE1PC9hPi4gRWFyVmlydHVhbENvbXBvbmVudCBuZWVkcyB0byBjb250aW51ZSB0byB1c2UgY29tcGxldGUgQXJjaGl2ZU5hbWU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyODA5Myc+MzI4MDkzPC9hPi4gRUFSIExpYnJhcnkgRGlyZWN0b3J5IGZpZWxkIHNob3VsZCBub3QgaGF2ZSBwcmVjZWRpbmcgc2xhc2g8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMzNDE1MSc+MzM0MTUxPC9hPi4gTmVlZCB0byBiYWNrIG91dCBidWcgMjk0NjI3PC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMzQ1NTYnPjMzNDU1NjwvYT4uIE5lZWQgdG8gcmVzdG9yZSBzdXBwb3J0IGZhbGxiYWNrIHRvIGRlcGVuZGVudE9iamVjdCBpbiBtYWludGVuYW5jZSBzdHJlYW08L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMzOTMwNyc+MzM5MzA3PC9hPi4gTmFtZSBjb2xsaXNpb25zIG5vdCBwcm9wZXJseSBoYW5kbGVkIG9uIEVBUiBpbXBvcnQ8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM0Mjc0Nyc+MzQyNzQ3PC9hPi4gUmVndWxhciBqYXJzIGFyZSBpbXBvcnRlZCBhcyBBcHAgQ2xpZW50IHByb2plY3RzIHdoZW4gaW1wb3J0aW5nIGFuIEVBUiA1LjAgaWYgamFycyBoYXZlIE1BSU4tQ0xBU1MgYXR0cmlidXRlIGluIE1BTklGRVNULk1GPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNDM1NTknPjM0MzU1OTwvYT4uIEpFTSBuZWVkcyB0byBoYW5kbGUgYSBmbHVzaCBiZXR0ZXI8L3A+Cis8aDI+b3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmU8L2gyPgorCis8cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM0NTc3OCc+MzQ1Nzc4PC9hPi4gRHVwbGljYXRlIHRsZCBlbnRyaWVzIGluIHRhZ2xpYiBpbmRleDwvcD4KKzxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzUyNTE1Jz4zNTI1MTU8L2E+LiBDb250YWluZXJJbXBsI2dldEZpbGUoU3RyaW5nIFVSSSkgd2lsbCBub3QgYWx3YXlzIGZpbmQgYSBmaWxlIChldmVuIGlmIHRoZSBjb250YWluZXIgaGFzIHRoZSBmaWxlKTwvcD4KKzxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzYyMzA4Jz4zNjIzMDg8L2E+LiBEZWFkbG9jayB3aGVuIGNoYW5naW5nIHRoZSB0YXJnZXQgcnVudGltZSBvZiBFQVIgcHJvamVjdCBhbmQgaXRzIG1vZHVsZXMgZHVyaW5nIGF1dG9idWlsZDwvcD4KIAogPC9ib2R5PgogPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbAppbmRleCBlMDZhZDYyLi5hYmVlY2M0IDEwMDY0NAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCkBAIC0xMSwxMyArMTEsMTMgQEAKICAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47CiAgICAgdGFiLWludGVydmFsOiAwLjVpbjsKICAgICB9Ci0gIHAgeyAgIAorICBwIHsgIAkKICAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgICBtYXJnaW4tdG9wOiAgMC41ZW07CiAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CiAgICAgfQogICBwLmxpc3QgewotICAgIG1hcmdpbi1sZWZ0OiAwLjVpbjsKKyAgCW1hcmdpbi1sZWZ0OiAwLjVpbjsKICAgICBtYXJnaW4tdG9wOiAgMC4wNWVtOwogICAgIG1hcmdpbi1ib3R0b206IDAuMDVlbTsKICAgICB9CkBAIC0yNyw3ICsyNyw3IEBACiAKIDxib2R5IGxhbmc9IkVOLVVTIj4KIAotPHAgYWxpZ249Y2VudGVyPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj48L3A+Cis8aDI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9oMj4KIAogPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCAwOWI0YzFmLi5kYzQ4NjhlIDEwMDY0NAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0xOCw3ICsxOCw3IEBACiBmZWF0dXJlTmFtZT1XVFAgUGF0Y2hlcyBmb3Igb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUKIAogIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCitwcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KIAogIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQogdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKQEAgLTI3LDEyNiArMjcsMTMgQEAKIGRlc2NyaXB0aW9uPVwKIFRoZSBidWdzIGFuZCBmaXhlcyBhcmUgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgYnVnemlsbGEgZW50cmllczpcblwKIFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yNzIzODkgdG9rZW5pemVycyBzdHVjayBpbiBsb29wIHdoZW4gaW5wdXQgbm90IG1hdGNoZWRcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjc4MTMxIFN0YWNrT3ZlcmZsb3cgdGhyb3duIGluIEpET01TZWFyY2hIZWxwZXIuZmluZElubmVySmF2YUVsZW1lbnRcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjc5MDM4IEpTUCBvcGVucyBkaXJ0eSBpZiBjb250ZW50IHR5cGUgaGVhZGVyIG1pc3NwZWxscyAiY2hhcnNldCJcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjc5MTc1IEFuIGludGVybmFsIGVycm9yIG9jY3VycmVkIGR1cmluZzogIlZhbGlkYXRpb24gVGVzdEVKQiIuXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4MTE0NyBwcm9ibGVtIGFkZGluZyBlZTUgbGlicyB0byBjb250YWluZXJcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgxNTYyIFVuc2FmZSBKRFQgY2FsbHMgaW4gY2xhc3NwYXRoIGNvbnRhaW5lciBjb2RlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4MzE3NiBOUEUgaW4gRUFSQXJ0aWZhY3RFZGl0LmdldE1vZHVsZUJ5TWFuaWZlc3RVUkkoU3RyaW5nIHVyaSlcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgzMjA5ICFNRVNTQUdFIEV4Y2VwdGlvbiB3aGlsZSByZWFkaW5nIC9FQVI1Q2xpZW50Ly5jbGFzc3BhdGhcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgzMzE4IFNpbmdsZSByb290IGNoZWNrIGZhaWxpbmcgd2hlbiBzb3VyY2UgZm9sZGVyIG1hcHBlZCBidXQgZGVsZXRlZFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODM1ODAgRUFSIDUuMCBsaWJzIHBlcmZvcm1hbmNlIGFuZCBtaXNzaW5nIHVwZGF0ZXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjgzNjAxIEZvciBXZWIgUHJvamVjdCB2ZXJpZnkgc291cmNlIGZvbGRlcnMgYW5kIHdlYiBjb250ZW50IGRvIG5vdCBjb2xsaWRlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4MzYzMiBFSmIgcmVmIHZhbGlkYXRpb24gaW4gRUFSIHZhbGlkYXRvciBuZWVkIHRvIHRocm93IGVycm9yIG1lc3NhZ2VcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg0MzAyIE1lbW9yeSBsZWFrcyBpbiBJQXJjaGl2ZSBjbGFzc2VzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4NDMyNyBNZW1vcnkgbGVha3MgYmVjYXVzZSBvZiBmaW5hbCBzdGF0aWMgY29uc3RhbnRzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4NDkzMiBUYWdsaWJJbmRleCBvcHRpbWl6YXRpb24gaWdub3JlcyBpbXBvcnRhbnQgcmVzb3VyY2UgY2hhbmdlIGV2ZW50c1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODUwODcgSlNQIFRyYW5zbGF0b3IgZG9lcyBub3Qgc3VwcG9ydCBJdGVyYXRpb25UYWcgY29uc3RydWN0c1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODY5MzcgRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yIGZyb20gVGFnbGliSGVscGVyLmlzSXRlcmF0aW9uVGFnIGluIGxvZ1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODY5NjkgSmF2YSBzdHJpbmcgY29uc3RhbnRzIGNvbnRhaW5pbmcgZW50aXR5IHJlZmVyZW5jZXMgZ2V0IGRlY29kZWRcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg3NzQyIEVBUiBpbXBvcnQgc2hvd2luZyBlamIgY2xpZW50IGphcnMgb24gc2Vjb25kIHBhZ2Ugd2hlbiBpdCBzaG91bGQgbm90XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4Nzc0OSBDb3JlIGV4Y2VwdGlvbnMgZHVyaW5nIEVBUiBpbXBvcnRcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg4MTg0IEVhciBpbXBvcnQgZmFpbHMgaWYgdHdvIEVKQiBtb2R1bGVzIHVzZSBzYW1lIGNsaWVudCBqYXJcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg4ODMyIElBcmNoaXZlIHBlcmZvcm1hbmNlIHByb2JsZW1zIHdpdGggbGFyZ2UgYW1vdW50IG9mIGZpbGVzIHdpdGhpbiBzaW5nbGUgYXJjaGl2ZVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODkyMDMgRmFjZXQgY2xhc3NwYXRoIHV0aWxpdHkgbm90IHByb3Blcmx5IG1pZ3JhdGluZyBsZWdhY3kgcHJvamVjdHNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg4MjkwIE5QRXMgaW4gVExEQ01Eb2N1bWVudE1hbmFnZXJcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg5MjU3IFt0cmFuc2xhdGlvbl0gSlNQVHJhbnNsYXRvciBzaG91bGQgaGFuZGxlIGFzc2lnbm1lbnQgaW4gSlNQIGV4cHJlc3Npb25zXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDgzMiBCYWNrcG9ydCB0aGUgZml4IGZvciBidWd6aWxsYSMyNjA5MzEgdG8gd3RwIDMuMC41XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDczOCBGYWxzZSBlcnJvcnMvd2FybmluZ3Mgd2hlbiB2YWxpZGF0aW5nIGV4cHJlc3Npb25zIHdpdGggbWFwc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTA1NDMgQmFja3BvcnQgdGhlIGZpeCBmb3IgYnVnaWxsYSMyODI5MzYgdG8gd3RwIDMuMC41XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDQxMiBQZXJmb3JtYW5jZSBwcm9ibGVtIGluIG1ldGhvZCBUeXBlVXRpbC5yZXNvbHZlSW5QYXJlbnRzKClcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkwNTgxIE1hbnVhbCB2YWxpZGF0aW9uIGlzIGNsZWFuaW5nIHVwIHRoZSBhbHJlYWR5IHZhbGlkYXRlZCBjYWNoZSBvbiBldmVyeSBjYWxsXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MDc0MiBFQVIgRXhwb3J0IG5vdCBwcm9wZXJseSBjbG9zaW5nIDEuNCBhcmNoaXZlc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTA3NTcgJ1ByZXBhcmUgZm9yIERlcGxveW1lbnQnIGVycm9yIG1lc3NhZ2Ugc3RhdGVzICJKMkVFRGVwbG95T3BlcmF0aW9uXzJfVUlfIlxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTA4MzcgRXhjZXB0aW9ucyBmcm9tIEpFTSBpbiBhZG9wdGVyIHByb2R1Y3RcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkwOTY2IEpTUCBpbmNsdWRlIGRpcmVjdGl2ZXMgZG8gbm90IGhhbmRsZSBub24tSlNQIGNvbnRlbnQgdHlwZXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkxMTQzIE1lY2hhbmlzbSB0byBleHBvc2UgV0VCLUlORi9saWIgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkxMjI1IE91dHB1dCBmb2xkZXIgc3VwcG9ydCBpbiBKYXZhRUUgcHJvamVjdHNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkxMjUxIEFQSSBuZWVkZWQgdG8gZGV0ZXJtaW5lIGlmIHByb2plY3QgaGFzIG5vIHNpbmdsZSByb290IGFuZCByZWFzb25zIHdoeVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTEyNjYgRGVsZXRpbmcgamF2YSBzb3VyY2UgZm9sZGVycyBzaG91bGQgcmVtb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGFydGlmYWN0cyBmcm9tIHRoZSAuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQgZmlsZVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTE1MzYgU2Vzc2lvbiBCZWFuIHJlbW90ZSBpbnRlcmZhY2UgdmFsaWRhdGlvbiBzaG91bGQgYmUgZXJyb3IgZm9yIG1pc3NpbmcgbWV0aG9kc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yNDkwNDQgV2ViIG1vZHVsZSdzIGphciBtb2R1bGVzIGZyb20gYW5vdGhlciBwcm9qZWN0IGFyZSBub3QgcHVibGlzaGVkIGZvciBUb21jYXQuXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI3MjAxMyBKRU0gSmVtUHJvamVjdFV0aWxpdGllcyNnZXRDbGFzc3BhdGhBc1VSTEFycmF5KElKYXZhUHJvamVjdCkgZmFpbHMgdG8gaGFuZGxlIGNsYXNzIGZvbGRlcnNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkwNzM5IERvbid0IHZhbGlkYXRlIHRoZSBleHByZXNzaW9uIHNlZ21lbnRzIGFmdGVyIHRoZSBtYXAgaWYgdGhlIG1hcCB2YWx1ZSB0eXBlIGlzIE9iamVjdFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTIwNzkgW3BhcnNlcl0gU2NyaXB0bGV0IGluIDxzY3JpcHQ+IGF0dHJpYnV0ZSB0YWdzIGNhbiBjYXVzZSB0aGUgcmVnaW9uIHRvIG5vdCBiZSBibG9jayB0ZXh0XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MjA4MSBbdHJhbnNsYXRpb25dIEphdmFzY3JpcHQgY2FuIGNhdXNlIGN1c3RvbSB0YWdzIHRvIG5vdCBiZSB0cmFuc2xhdGVkXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MjE2MiBpc1NpbmdsZVJvb3QgQVBJIHNob3VsZCBhbGxvdyBub24gSmF2YSBzcmMgZm9sZGVyIGFzIG91dHB1dCBmb3IgSkNBXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MjE3NyBbdmFsaWRhdGlvbl0gSlNQRGlyZWN0aXZlVmFsaWRhdG9yI3Byb2Nlc3NUYWdsaWJEaXJlY3RpdmUgc2hvdWxkIGhhbmRsZSBVUkwgVGFnbGliIFJlY29yZHNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkyMTg2IFdlYkxpYiBRdWljayBmaXhlcyByZXZlcnRpbmcgZXhjbHVzaW9uc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTMwNDcgUHJvYmxlbSB3aXRoIFdUUFdvcmtpbmdDb3B5TWFuYWdlciBhbmQgZGVsZXRpbmcgcHJvamVjdHNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkzNTAyIFBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGJlY2F1c2Ugb2YgSmF2YUxpdGUgY2FsbHNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjkzNjg1IEpBWC1SUEMgY2xpZW50IEpTUHM6IEpTUEcwMDM2RTogRmFpbGVkIHRvIGZpbmQgcmVzb3VyY2UgL3NhbXBsZUVjaG9Qcm94eS9UZXN0Q2xpZW50LmpzcFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTM5OTIgW3ZhbGlkYXRpb25dIEpTUEJhdGNoVmFsaWRhdG9yIGlzIHRha2luZyBzdWJzdGFudGlhbGx5IGxvbmdlciB3aGVuIG5lZWRlZCB0YWdsaWJzIGFyZSBub3Qgb24gY2xhc3MgcGF0aFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTM5ODEgW3ZhbGlkYXRpb25dIEF0dHJpYnV0ZXMgZG8gbm90IGluZGljYXRlIHByb2JsZW1zIHdpdGggZHluYW1pYyBjb250ZW50IGluIHJ0ZXhwcnZhbHVlIGF0dHJpYnV0ZXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk0MzY5IEVBUiA1LjAgTGliIHV0aWxpdHkgZGVwbG95bWVudFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTQ0OTAgRUFSIExpYnJhcmllcyBjb250YWluZXIgbWlzY29tcHV0aW5nIGJlY2F1c2Ugb2Ygc3RhbGUgSUphdmFMaXRlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5MzIxMSBQZXJmb3JtYW5jZSBwcm9ibGVtIHdoZW4gdmFsaWRhdGUgbWFuYWdlZCBwcm9wZXJ0aWVzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5NDYyNyBEZWxldGluZyBmb2xkZXJzIHNob3VsZCByZW1vdmUgZW50cnkgZnJvbSAuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQgZmlsZVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTUzNTMgQWRkaW5nIG1vZHVsZSB0byBhcHBsaWNhdGlvbi54bWwgbm8gbG9uZ2VyIGdlbmVyYXRpbmcgImlkIiBhdHRyaWJ1dGVzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5NDcxNiBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIgbWF5IGNhdXNlIFNBWFBhcnNlRXhjZXB0aW9uXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5NTYxNyBXZWIgcHJvamVjdCBjcmVhdGlvbiBkb2VzIG5vdCBob25vdXIgdXNlciBpbnB1dFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTU3MjggRGVmZXJyZWQgRUwgZXhwcmVzc2lvbnMgYXJlIGJlaW5nIG1hcmtlZCB3aXRoIHZhbGlkYXRpb24gcHJvYmxlbXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk2NzE5IFJ1bnRpbWUgQ2hhbmdlIERlbGVnYXRlIHRocm93cyBOUEUgd2hlbiBjaGFuZ2luZyBmcm9tIFVua25vd24gUnVudGltZSB0eXBlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5ODc5NiBpc1NpbmdsZVJvb3QgQVBJIHNob3VsZCBub3QgcmVxdWlyZSBhIEphdmEgc3JjIGZvbGRlclxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTM1MDQgW3ZhbGlkYXRpb25dIEpTUCBzeW50YXggdmFsaWRhdG9yIHJlcXVpcmVzIGJyYWNrZXRzIGFmdGVyIElGIHN0YXRlbWVudFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTc4NTIgRXJyb3IgbG9nIGVudHJ5IGZvciBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gcmVsYXRlZCB0byBBbm5vdGF0aW9ucyBhbmQgRU1GXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5ODg5MSBDbGFzc3BhdGggaW5pdGlhbGl6YXRpb24gaXMgdmVyeSBzbG93IGZvciBjb21wbGV4IEVBUnNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5MTU2IFtwYXJzZXJdIEpTUFRva2VuaXplciBkb2VzIG5vdCBkZXRlY3QgVW5pY29kZSBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBhcyB5b3UgdHlwZVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTkzOTMgVmFsaWRhdGlvbiBvZiBydW50aW1lIGV4cHJlc3Npb25zIGluIEpTUCBjdXN0b20gdGFnIGF0dHJpYnV0ZXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjk5NDMyIEoyRUUgRGVwbG95bWVudCBmcmFtZXdvcmsgZG9lc24ndCBhbGxvdyBmYWNldCBleGNsdXNpb25zXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTQzNyBOUEVzIGxvZ2dlZCBkdWUgdG8gYnVnIDI5NTM1M1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTk0ODggW3RyYW5zbGF0aW9uXSBYTUxKU1BSZWdpb25IZWxwZXIjZGVjb2RlUmVtYWluaW5nUmVnaW9ucyBjYW4gY2F1c2UgTlBFXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTQ4OSBbY29udGVudCBtb2RlbF0gQ01Eb2N1bWVudEZhY3RvcnlUTEQjZ2V0Q29udGFpbmVkVGV4dCBjYW4gY2F1c2UgTlBFXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI5OTU0MSBFeGNlc3NpdmUgbG9nZ2luZyBpbiBUYWdsaWJDbGFzc0xvYWRlclxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTk2NTUgQ2xhc3NwYXRoU2VsZWN0aW9uIG5lZWRzIGJldHRlciBlcnJvciBoYW5kbGluZ1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yOTk3ODUgSFRNTCBjYXVzZXMgdmFsaWRhdGlvbiBlcnJvcnMgaW4gVGFnIGZpbGVzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMDA2MiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvZiBWaXJ0dWFsQ29tcG9uZW50IGNhY2hpbmdcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAwMDk4ICdJbiBMaWIgRGlyJyBjaGVja2JveCBiZWluZyBpZ25vcmVkIHdoZW4gYSBqYXIgZGVwZW5kZW5jeSBpcyBhZGRlZCB0byBhbiBFQVJcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAwMTgzIENvbXBvbmVudGNvcmUuY3JlYXRlQ29tcG9uZW50IHJldHVybnMgYSBudWxsIHZhbHVlIHdoZW4gY2FsbGVkIGZyb20gYWRvcHRlciBwcm9kdWN0XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMDM4NyBOZWVkIHRvIHByb3RlY3QgYWdhaW5zdCBOUEUgaW4gYWRvcHRlciBKMkVFRWxlbWVudENoYW5nZWRMaXN0ZW5lclxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDE0MTkgSWxsZWdhbEV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIGRlcGxveW1lbnRcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAxNDc3IEVBUiBMaWJyYXJpZXMgY29udGFpbmVyIG1pc3NpbmcgZW50cmllcyBvbiByZXN0YXJ0XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMTU0MCBJbmNvcnJlY3QgcmVwb3J0aW5nIG9mIEpTUCBwcm9ibGVtc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDE1OTggW3RyYW5zbGF0aW9uXSBDYW5ub3QgYmUgcmVzb2x2ZWQgZXJyb3JzIHdoZW4gU3RydXRzIDxiZWFuOmRlZmluZT4gaXMgZGVmaW5lZCB3aXRoaW4gPGlucHV0IHR5cGU+IEhUTUwgdGFnXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMzA3MCByYW5kb20gYnVpbGQvY29tcGlsZSBlcnJvciBkdWUgdG8gb3V0IG9mIHN5bmMgZGVwbG95bWVudCBkZXNjcmlwdG9yXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMzE0MCBDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIgaW5jb3JyZWN0bHkgaGFuZGxlcyAuc2V0dGluZ3MgZmlsZXNcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzAzMTMxIEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIuZ2V0RUFSTGliRGlyIHNob3VsZCBjaGVjayBib3RoIEREIGFuZCBmYWNldCB2ZXJzaW9uXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwMzk2MyBFcnJvciBFeGNlcHRpb24gbG9nZ2VkIGR1cmluZyBkZXBsb3lcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzA1MjUyIENsYXNzQ2FzdEV4Y2VwdGlvbjpqMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsIGluY29tcGF0aWJsZSB3aXRoIGphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMDUyNTMgUGVyZm9ybWFuY2UgaXNzdWUgaW4gTWFudWFsIEVBUiB2YWxpZGF0aW9uXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMwNjA1OCBOb0NsYXNzRGVmRm91bmRFcnJvciBjb21pbmcgZnJvbSB0aGUgVGFnbGliSGVscGVyXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxMzE4MSBKYXZhIEVFIGltcG9ydCBmYWlscyBpZiB6aXAgZW50cmllcyBjb250YWluIGxlYWRpbmcgc2xhc2hlc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTMzOTkgT3BlbmVyIG9mIEFyY2hpdmUgZGlkbid0IGNsb3NlIGEgZmlsZVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTM2MDggcmFuZG9tIGJ1aWxkL2NvbXBpbGUgZXJyb3IgZHVlIHRvIG91dCBvZiBzeW5jIGZpbGVzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxMzYzMCBWMSBWYWxpZGF0b3IgZXh0ZW5zaW9uIHBvaW50IGNoYW5nZXMgZm9yIHBlcmZvcm1hbmNlXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxNjIyMiBbcGFyc2VyXSA8IG9yID4gaW4gYXR0cmlidXRlIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTYyOTEgW2hvdGJ1Z10gQmFja3BvcnQgMjkyOTQzIHRvIHd0cCAzLjAuNVBhdGNoXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxNzU2MCBFcnJvcnMgZmxhZ2dlZCBieSBlcnJvciBhbm5vdGF0aW9ucyBub3QgcmVmbGVjdGVkIGluIHRoZSBQcm9ibGVtcywgRXhwbG9yZXIsIGFuZC9vciBOYXZpZ2F0b3Igdmlld3MuXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxODczNiBJbXBvcnREYXRhTW9kZWwgdW5zYWZlbHkgY2hlY2tzIGphdmEgZmFjZXQgbmFtZVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTkzMTEgSmFycyBleHBvcnRlZCBhcyB2YXJpYWJsZSBuYW1lcyBpbnN0ZWFkIG9mIGphciBuYW1lc1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTk0MzkgRUFSIFZhbGlkYXRpb24gdGhyb3dzIGV4Y2VwdGlvbnMgb24gcHJvamVjdCBjbG9zZVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMTk3MzUgVW53YW50ZWQgbmV3bGluZXMgYmVmb3JlIGRpc3BsYXkgbmFtZSB2YWx1ZVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjAzMTIgTkxTIG1pc3NpbmcgbWVzc2FnZXMgaW4gLmxvZ1xuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjAzMjIgW3ZhbGlkYXRpb25dIEpTUCBzb3VyY2UgdmFsaWRhdG9ycyBydW5uaW5nIGV2ZW4gd2hlbiByZXNwZWN0aXZlIGJhdGNoIHZhbGlkYXRvcnMgaGF2ZSBiZWVuIHR1cm5lZCBvZmZcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIwNDM2IGphcidzIHBsYWNlZCBpbiBKYXZhIEVFIDUgRWFyJ3MgbGliIGRpcmVjdG9yeSBzaG91bGQgbmV2ZXIgYmUgY29uc2lkZXJlZCAibW9kdWxlcyJcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIyMTczIEoyRUVEZXBsb3lPcGVyYXRpb24gZG9lcyBub3QgYWxsb3cgY2FsbGVycyB0byBnZXQgYSBsaXN0IG9mIGFmZmVjdGVkIHByb2plY3RzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyMjQxMSBXZWJsaWIgY2xhc3NwYXRoIGRlcGVuZGVuY2llcyBub3QgcmV0dXJuZWQgZnJvbSBtZW1iZXJzKCkgd2hlbiBzaW5nbGUtcm9vdFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjI2NzggSW4gRUFSVmlydHVhbENvbXBvbmVudC5nZXRIYXJkUmVmZXJlbmNlcywgbmVlZCB0byBnZXQgdGhlIGFyY2hpdmVOYW1lIGRpcmVjdGx5IGZyb20gdGhlIHJlZmVyZW5jZWRDb21wb25lbnQsIGluc3RlYWQgb2YgZ2V0dGluZyBpdCBmcm9tIHRoZSBkZXBlbmRlbnRPYmplY3RcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIyOTUzIEoyRUVEZXBsb3lPcGVyYXRpb24gYWZmZWN0IHByb2plY3RzIHN1cHBvcnQgbmVlZHMgYSB3YXkgdG8gdGVsbCBpZiBhbnkgZGVwbG95ZXIgZG8gbm90IHByb3ZpZGUgdGhhdCBpbmZvXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyNDIyMSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmluTGliRGlyIG5lZWRzIHRvIGNvbnNpZGVyIGNvbXBvbmVudCBwYXJhbWV0ZXIgd2hpbGUgcmV0dXJuaW5nIHJlc3VsdFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjU4MDMgTlBFIGluIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLlhNTEpTUFJlZ2lvbkhlbHBlci5kZWNvZGVSZW1haW5pbmdSZWdpb25zKFhNTEpTUFJlZ2lvbkhlbHBlci5qYXZhOjI3OClcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzI2MDE1IEVhclZpcnR1YWxDb21wb25lbnQgbmVlZHMgdG8gY29udGludWUgdG8gdXNlIGNvbXBsZXRlIEFyY2hpdmVOYW1lXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyODA5MyBFQVIgTGlicmFyeSBEaXJlY3RvcnkgZmllbGQgc2hvdWxkIG5vdCBoYXZlIHByZWNlZGluZyBzbGFzaFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMzQxNTEgTmVlZCB0byBiYWNrIG91dCBidWcgMjk0NjI3XG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMzNDU1NiBOZWVkIHRvIHJlc3RvcmUgc3VwcG9ydCBmYWxsYmFjayB0byBkZXBlbmRlbnRPYmplY3QgaW4gbWFpbnRlbmFuY2Ugc3RyZWFtXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMzOTMwNyBOYW1lIGNvbGxpc2lvbnMgbm90IHByb3Blcmx5IGhhbmRsZWQgb24gRUFSIGltcG9ydFxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNDI3NDcgUmVndWxhciBqYXJzIGFyZSBpbXBvcnRlZCBhcyBBcHAgQ2xpZW50IHByb2plY3RzIHdoZW4gaW1wb3J0aW5nIGFuIEVBUiA1LjAgaWYgamFycyBoYXZlIE1BSU4tQ0xBU1MgYXR0cmlidXRlIGluIE1BTklGRVNULk1GXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM0MzU1OSBKRU0gbmVlZHMgdG8gaGFuZGxlIGEgZmx1c2ggYmV0dGVyXG5cCitCdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM0NTc3OCBEdXBsaWNhdGUgdGxkIGVudHJpZXMgaW4gdGFnbGliIGluZGV4XG5cCitCdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzM1OTg5MiBDb250YWluZXJJbXBsI2dldEZpbGUoU3RyaW5nIFVSSSkgd2lsbCBub3QgYWx3YXlzIGZpbmQgYSBmaWxlIChldmVuIGlmIHRoZSBjb250YWluZXIgaGFzIHRoZSBmaWxlKVxuXAorQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zNjIzMDggRGVhZGxvY2sgd2hlbiBjaGFuZ2luZyB0aGUgdGFyZ2V0IHJ1bnRpbWUgb2YgRUFSIHByb2plY3QgYW5kIGl0cyBtb2R1bGVzIGR1cmluZyBhdXRvYnVpbGRcblwKIFxuXAogIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCiBjb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAorQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXApAQCAtMTYzLDggKzUwLDggQEAKICMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1BdWd1c3QsIDIwMDhcblwKK0VjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAorQXByaWwgMTQsIDIwMTBcblwKIFxuXAogVXNhZ2UgT2YgQ29udGVudFxuXAogXG5cCkBAIC0xNzIsNDIgKzU5LDM4IEBACiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAogQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCitOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAogQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAogQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCiBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCitFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAordGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKK3Byb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCiBDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAorcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAogYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCisgICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAorICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAorICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKyAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKKyAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKyAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAorICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKKyAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAorICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCisgICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKIFxuXAogVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAogY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCkBAIC0yMTYsNDcgKzk5LDc3IEBACiBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCiBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKIFxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKyAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKyAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKyAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKyAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAogTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAorUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAorVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAogSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCiB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK3RoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKK3Rlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKK2dvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAogU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCisgICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKyAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKyAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAorICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKIFxuXAogSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKK1RPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAogaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAorXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKK2J1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCit0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKK290aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAordGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCitJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAorXG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCitZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCittYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorXG5cCisgICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAorICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAorICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisgICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAorICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCisgICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKKyAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAorICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAorICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKKyAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKKyAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCisgICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorXG5cCiBDcnlwdG9ncmFwaHlcblwKIFxuXAogQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCiBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCiBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCiB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKK3JlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCiBcblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCiAjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKaW5kZXggZTE2NTZjYi4uODJhYWE5ZCAxMDA2NDQKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC41LnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjMuMi40LnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24+CkBAIC0xOCw1MSArMTgsMTYgQEAKICAgIDwvbGljZW5zZT4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjUudjIwMDkwNDI0MjEzMS03UTdBRWZKRUhoSGVoUGxXNlNhRTR1IiBwYXRjaD0idHJ1ZSIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZSIgdmVyc2lvbj0iMy4yLjQudjIwMTEwMzIzMTgzOC03UTdCRzdPRkU5TGVBQkJYNWpiNEx0b2pxei03b0VwajU5NjMiIHBhdGNoPSJ0cnVlIi8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgogICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSIKICAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCiAgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCiAgICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKICAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQorICAgICAgICAgCiAgICA8cGx1Z2luCiAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSIKICAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCkBAIC03NywzMiArNDIsNCBAQAogICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCiAgICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CiAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzZi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzZi5jb21tb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNmLnN0YW5kYXJkLnRhZ3N1cHBvcnQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KIDwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfY29yZS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbAppbmRleCAyMzQ3MDYwLi5jMTg0Y2EzIDEwMDY0NAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX2NvcmUuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl9jb3JlLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sCkBAIC0xLDkzICsxLDEwNyBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgorPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CiAKLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+QXByaWwgMTQsIDIwMTA8L3A+CiAKLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAorPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAorPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgogCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CiAKLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCisgICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KKworPHVsPgorICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisgICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisgICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPgorCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisgICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisgICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKworPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisgICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKyAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKworPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCisgICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKyAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisgICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisgICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKyAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+CisKKzxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKKyAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKyAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKworPG9sPgorICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKyAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKKyAgICAgICBwcm9kdWN0LjwvbGk+CisgICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKyAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKyAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisgICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgorICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCisgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KKzwvb2w+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCis8cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoLmh0bWwKaW5kZXggYjEwN2E3YS4uOTI2MzY3OCAxMDA2NDQKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoLmh0bWwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoLmh0bWwKQEAgLTQsMTkgKzQsMTcgQEAKIDxoZWFkPgogPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+CiA8bWV0YSBuYW1lPSJCdWlsZCIgY29udGVudD0iQnVpbGQiPgotPHRpdGxlPldUUCAzLjAuNSBQYXRjaGVzPC90aXRsZT4KKzx0aXRsZT5XVFAgMy4yLjIgUGF0Y2hlczwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDE+V1RQIDMuMC41IFBhdGNoZXM8L2gxPgorPGgxPldUUCAzLjIuMiBQYXRjaGVzPC9oMT4KIAotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yODA0ODMnPjI4MDQ4MzwvYT4uICJBIGhhbmRsZXIgY29uZmxpY3Qgb2NjdXJyZWQuIFRoaXMgbWF5IGRpc2FibGUgc29tZSBjb21tYW5kcy4iIHdhcm5pbmcgb24gcmVzdGFydDwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg1Mjg0Jz4yODUyODQ8L2E+LiBSZW1vdmluZyBjb21tZW50IGVuZCB0YWcgYW5kIGFkZGluZyBpdCBiYWNrIGxlYXZlcyB2YWxpZGF0aW9uIGVycm9yczwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzE2NDMxJz4zMTY0MzE8L2E+LiBFcnJvciBhbm5vdGF0aW9ucyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBKU1Agc3RydWN0dXJlZCB0ZXh0IGVkaXRvciB1cG9uIHJlc29sdXRpb248L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxNzU2MCc+MzE3NTYwPC9hPi4gRXJyb3JzIGZsYWdnZWQgYnkgZXJyb3IgYW5ub3RhdGlvbnMgbm90IHJlZmxlY3RlZCBpbiB0aGUgUHJvYmxlbXMsIEV4cGxvcmVyLCBhbmQvb3IgTmF2aWdhdG9yIHZpZXdzLjwvcD4KLTxwPkJ1ZyA8YSBocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIzMjg0Jz4zMjMyODQ8L2E+LiBQcmVmZXJlbmNlIGluaXRpYWxpemVycyBhcmUgbG9hZGluZyB0ZW1wbGF0ZSBzdG9yZXMgYWRkaW5nIHRvIGVkaXRvciBsb2FkaW5nIHRpbWU8L3A+Ci08cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyNzY4MCc+MzI3NjgwPC9hPi4gU3RydWN0dXJlZCBNb2RlbCBhY3F1aXJlZCB3aXRob3V0IGJlaW5nIHJlbGVhc2VkPC9wPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMzQ2OTYnPjMzNDY5NjwvYT4uIFZhbGlkYXRpb24gcnVsZSBub3QgYmVpbmcgcmVzcGVjdGVkLjwvcD4KKzxoMj5vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmU8L2gyPgorCis8cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyNjA2Mic+MzI2MDYyPC9hPi4gTm8gY29udGVudCBhc3Npc3QgaW4gYXR0cmlidXRlLWVtYmVkZGVkIHNjcmlwdGxldHM8L3A+Cis8cD5CdWcgPGEgaHJlZj0naHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyNjYwMic+MzI2NjAyPC9hPi4gQXV0byBhY3RpdmF0aW9uIGRvZXMgbm90IHdvcmsgaW4gamF2YXNjcmlwdCByZWdpb25zIGluIHdlYnBhZ2VzPC9wPgorCiA8L2JvZHk+CiA8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9lcGwtdjEwLmh0bWwKaW5kZXggZWQ0YjE5Ni4uYWJlZWNjNCAxMDA2NDQKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2VwbC12MTAuaHRtbAorKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZXBsLXYxMC5odG1sCkBAIC0xLDMyOCArMSwyNjIgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Cis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICBib2R5IHsKKyAgICBzaXplOiA4LjVpbiAxMS4waW47CisgICAgbWFyZ2luOiAwLjI1aW4gMC41aW4gMC4yNWluIDAuNWluOworICAgIHRhYi1pbnRlcnZhbDogMC41aW47CisgICAgfQorICBwIHsgIAkKKyAgICBtYXJnaW4tbGVmdDogYXV0bzsKKyAgICBtYXJnaW4tdG9wOiAgMC41ZW07CisgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CisgICAgfQorICBwLmxpc3QgeworICAJbWFyZ2luLWxlZnQ6IDAuNWluOworICAgIG1hcmdpbi10b3A6ICAwLjA1ZW07CisgICAgbWFyZ2luLWJvdHRvbTogMC4wNWVtOworICAgIH0KKyAgPC9zdHlsZT4KKwogPC9oZWFkPgogCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Cis8Ym9keSBsYW5nPSJFTi1VUyI+CiAKLTxkaXYgY2xhc3M9U2VjdGlvbjE+Cis8aDI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9oMj4KIAotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgorPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKK1BVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKK0FHUkVFTUVOVC48L3A+CiAKLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgorPHA+PGI+MS4gREVGSU5JVElPTlM8L2I+PC9wPgogCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Cis8cD4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9wPgogCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgorPHAgY2xhc3M9Imxpc3QiPmEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbAorY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPC9wPgorPHAgY2xhc3M9Imxpc3QiPmIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3A+CiAKLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Cis8cCBjbGFzcz0ibGlzdCI+aSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9wPgorPHAgY2xhc3M9Imxpc3QiPmlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9wPgorPHAgY2xhc3M9Imxpc3QiPndoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtCitvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQQorQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZQorUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2gKK0NvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKK1Byb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbgorY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpCithcmUgbm90IGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uPC9wPgogCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KKzxwPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMKK3RoZSBQcm9ncmFtLjwvcD4KIAotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KKzxwPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMmcXVvdDsgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQorQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCitDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KIAotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKzxwPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZQord2l0aCB0aGlzIEFncmVlbWVudC48L3A+CiAKLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KKzxwPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyCit0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgogCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgorPHA+PGI+Mi4gR1JBTlQgT0YgUklHSFRTPC9iPjwvcD4KIAotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MKK29mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZQorQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4KK3NvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvcD4KIAotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Cis8cCBjbGFzcz0ibGlzdCI+YikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKK0NvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLAorb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCitDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQKK2xpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZQorUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsCitzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZAorYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCitjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKK2xpY2Vuc2VkIGhlcmV1bmRlci48L3A+CiAKLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Cis8cCBjbGFzcz0ibGlzdCI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvcgorZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzCithcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCitwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoCitDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5Cithbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCitvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMKK2dyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvCitzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvcgorZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQKK3RvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKK3RoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvcD4KIAotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Cis8cCBjbGFzcz0ibGlzdCI+ZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdAoraGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50Cit0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LjwvcD4KIAotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KKzxwPjxiPjMuIFJFUVVJUkVNRU5UUzwvYj48L3A+CiAKLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgorPHA+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUKK2Zvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3A+CiAKLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Cis8cCBjbGFzcz0ibGlzdCI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcworQWdyZWVtZW50OyBhbmQ8L3A+CiAKLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Cis8cCBjbGFzcz0ibGlzdCI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvcD4KIAotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgorPHAgY2xhc3M9Imxpc3QiPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycworYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCitvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgogCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Cis8cCBjbGFzcz0ibGlzdCI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgogCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Cis8cCBjbGFzcz0ibGlzdCI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzCitBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgorcGFydHk7IGFuZDwvcD4KIAotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Cis8cCBjbGFzcz0ibGlzdCI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUKK2Zyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYQorcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZQorZXhjaGFuZ2UuPC9wPgogCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Cis8cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgogCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5hKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3A+CiAKLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Cis8cCBjbGFzcz0ibGlzdCI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoCitjb3B5IG9mIHRoZSBQcm9ncmFtLjwvcD4KIAotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Cis8cD5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZAord2l0aGluIHRoZSBQcm9ncmFtLjwvcD4KIAotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgorPHA+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMKK0NvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzIHN1YnNlcXVlbnQKK1JlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi48L3A+CiAKLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KKzxwPjxiPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9iPjwvcD4KIAotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Cis8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KK3Jlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQorbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mCit0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZQorcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IKK2luY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoJnF1b3Q7Q29tbWVyY2lhbCBDb250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kCitpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KQorYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykKK2FyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZAorcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlCithY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cworZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbgorb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5Cit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUKK0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duCitleHBlbnNlLjwvcD4KIAotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Cis8cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCitDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKK2NsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCitjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5CithbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCitkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlCitwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgorQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgorbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3A+CiAKLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KKzxwPjxiPjUuIE5PIFdBUlJBTlRZPC9iPjwvcD4KIAotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgorPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCitQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAorQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCitPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwordGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKK2RhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCitpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+CiAKLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgorPHA+PGI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2I+PC9wPgogCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Cis8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQKK05PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCitXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCitESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3A+CiAKLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Cis8cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KIAotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgorPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgordGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCitieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCitleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KIAotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgorPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKK1Byb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKK3NvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKK2RhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KIAotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCis8cD5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdAorZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lCithZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMKK3VuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCiBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAogUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgogCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KKzxwPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzCitBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKK2NvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlCitBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZworcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlCitBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UKK0ZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Cithc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhCitzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlCitnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nCitDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlCitBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbgorb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcworZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8KK3JpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlcgordGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKK290aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcworQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3A+CiAKLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgorPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Cit0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKK3RoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCityaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+CiAKIDwvYm9keT4KIAotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IDQzYmZhNjQuLmVkMzhkMTYgMTAwNjQ0Ci0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMSw1ICsxLDUgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNSwxMCArMTUsMTAgQEAKICMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgogCiAjICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XVFAgUGF0Y2ggZm9yIGpzdC53ZWJfdWkKK2ZlYXR1cmVOYW1lPVdUUCBQYXRjaGVzIGZvciBvcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUKIAogIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCitwcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KIAogIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQogdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKQEAgLTI2LDE4ICsyNiwxMiBAQAogIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKIGRlc2NyaXB0aW9uPVwKIFRoaXMgcGF0Y2ggZml4ZXMgcHJvYmxlbXMgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgYnVnczogXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzI4MDQ4MyAiQSBoYW5kbGVyIGNvbmZsaWN0IG9jY3VycmVkLiBUaGlzIG1heSBkaXNhYmxlIHNvbWUgY29tbWFuZHMuIiB3YXJuaW5nIG9uIHJlc3RhcnRcblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMjg1Mjg0IFJlbW92aW5nIGNvbW1lbnQgZW5kIHRhZyBhbmQgYWRkaW5nIGl0IGJhY2sgbGVhdmVzIHZhbGlkYXRpb24gZXJyb3JzXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMxNjQzMSBFcnJvciBhbm5vdGF0aW9ucyBub3QgcmVtb3ZlZCBmcm9tIHRoZSBKU1Agc3RydWN0dXJlZCB0ZXh0IGVkaXRvciB1cG9uIHJlc29sdXRpb25cblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzE3NTYwIEVycm9ycyBmbGFnZ2VkIGJ5IGVycm9yIGFubm90YXRpb25zIG5vdCByZWZsZWN0ZWQgaW4gdGhlIFByb2JsZW1zLCBFeHBsb3JlciwgYW5kL29yIE5hdmlnYXRvciB2aWV3cy5cblwKLUJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzIzMjg0IFByZWZlcmVuY2UgaW5pdGlhbGl6ZXJzIGFyZSBsb2FkaW5nIHRlbXBsYXRlIHN0b3JlcyBhZGRpbmcgdG8gZWRpdG9yIGxvYWRpbmcgdGltZVxuXAotQnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8zMjc2ODAgU3RydWN0dXJlZCBNb2RlbCBhY3F1aXJlZCB3aXRob3V0IGJlaW5nIHJlbGVhc2VkXG5cCi1CdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMzNDY5NiBWYWxpZGF0aW9uIHJ1bGUgbm90IGJlaW5nIHJlc3BlY3RlZC5cblwKK0J1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvMzI2MDYyIE5vIGNvbnRlbnQgYXNzaXN0IGluIGF0dHJpYnV0ZS1lbWJlZGRlZCBzY3JpcHRsZXRzXG5cCitCdWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnLzMyNjYwMiBBdXRvIGFjdGl2YXRpb24gZG9lcyBub3Qgd29yayBpbiBqYXZhc2NyaXB0IHJlZ2lvbnMgaW4gd2VicGFnZXNcblwKIFxuXAotCiAjICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKIGNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCitDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCkBAIC01NCw4ICs0OCw4IEBACiAjICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSwgMjAwOFxuXAorRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCitBcHJpbCAxNCwgMjAxMFxuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKQEAgLTYzLDQyICs1NywzOCBAQAogT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAorTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCiBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCiBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAogQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAogXG5cCiBBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCiBcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAorRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKK3RoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCitwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKIFxuXAogQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCitkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKK3JlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAogXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAorICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKKyAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKKyAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCisgICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCisgICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCisgICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKKyAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCisgICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKKyAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKyAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAorICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXApAQCAtMTA3LDQ3ICs5Nyw3NyBAQAogTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAogaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCiBcblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCisgICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKyAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCisgICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCisgICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCisgICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCiBcblwKIE5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKK1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKK1VwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCiB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAogeW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCit0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCit0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCitnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKKyAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCisgICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCisgICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKKyAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKIElUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCitUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCiBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCiBcblwKK1xuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAorXG5cCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCitidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAordGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCitvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKK3RoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAorSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAoraHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKK1xuXAorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCitJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAoraW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAorbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1xuXAorICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKKyAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKKyAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKKyAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKKyAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAorICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCisgICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKKyAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKKyAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCisgICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCisgICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAorICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKK1xuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKIENvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAogY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAogYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAogdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK3JlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCityZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAogXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgogIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvZmVhdHVyZS54bWwKaW5kZXggN2NkZDg4MC4uMjRkNzIwNSAxMDA2NDQKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2ZlYXR1cmUueG1sCisrKyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC41LnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjMuMi4yLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24+CkBAIC0xOCwxMCArMTgsMTcgQEAKICAgIDwvbGljZW5zZT4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUiIHZlcnNpb249IjMuMC41LnYyMDA5MDMzMDAwMzEtN0U0RUF6RGd6LVkxaXRCaTc0dDRDVW1YN1RiRiIgcGF0Y2g9InRydWUiLz4KKyAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlIiB2ZXJzaW9uPSIzLjIuMi52MjAxMDA4MTcwMDI5LTdGNzdGSlNDMjVUa2R5MW5xZ2xQanFMQW9EZ2giIHBhdGNoPSJ0cnVlIi8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmpzZHQud2ViLnN1cHBvcnQuanNwIgorICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorCisgICA8cGx1Z2luCiAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIKICAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCiAgICAgICAgICBpbnN0YWxsLXNpemU9IjAiCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl91aS5mZWF0dXJlLnBhdGNoL2xpY2Vuc2UuaHRtbAppbmRleCAyMzQ3MDYwLi5jMTg0Y2EzIDEwMDY0NAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3VpLmZlYXR1cmUucGF0Y2gvbGljZW5zZS5odG1sCisrKyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdWkuZmVhdHVyZS5wYXRjaC9saWNlbnNlLmh0bWwKQEAgLTEsOTMgKzEsMTA3IEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Cis8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KIAotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5BcHJpbCAxNCwgMjAxMDwvcD4KIAotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgorPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKKyAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorCis8dWw+CisgICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKyAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisgICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKzwvdWw+CisKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisgICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisgICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKyAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisgICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworCis8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKKyAgIFVwZGF0ZSBNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKyAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKyAgICAgICBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorICAgKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLjwvcD4KKworPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQorICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisgICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCis8b2w+CisgICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcgUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorICAgICAgIG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAorICAgICAgIHByb2R1Y3QuPC9saT4KKyAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisgICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorICAgICAgIFNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKyAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCisgICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKKyAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgorPC9vbD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisKKzxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkM2EyMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id29ya2JlbmNoLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5YmE5OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLUBkb3QKLW9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2hfMi4wLjEwMC4yMDA4MDYwMzEzMDQuamFyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZjczNTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyNjY2YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIEFwciAxNSAyMToxNTo1NCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkyYWVjNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLSNTYXQgTWFyIDMxIDIyOjU1OjIyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOGUxYmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNUdWUgRmViIDIxIDEwOjA5OjE5IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZm9ybWF0dGVyX3Byb2ZpbGU9X2p2ZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTAKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9amF2YTtqYXZheDtvcmc7b3JnLmVjbGlwc2Uud3RwO29yZy5lY2xpcHNlLmplbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZG07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RlO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmpjbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qYXZhO29yZy5lY2xpcHNlLnZlO2NvbTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWVlZjFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMTA0LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8sb3JnLmVjbGlwc2UuamVtLnRlc3RzIiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamVtO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNlYTU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+PGhlYWQ+PHRpdGxlPkFib3V0PC90aXRsZT4KLQotCi0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPjwvaGVhZD48Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZTQ4MmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi0KLXNvdXJjZS4uID0gd29ya2JlbmNoLwotb3V0cHV0Li4gPSBiaW4vCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMzIyMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC9wbHVnaW4ucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjE6MTM6NTMgJAotIwotCi0KLXBsdWdpbk5hbWU9SmF2YSBFTUYgTW9kZWwgV29ya2JlbmNoIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi0KLUphdmFFTUZOYXR1cmVOYW1lPUphdmFFTUZOYXR1cmUgUHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwODkwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJKYXZhRU1GTmF0dXJlIgotICAgICAgICAgbmFtZT0iJUphdmFFTUZOYXR1cmVOYW1lIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm5hdHVyZXMiPgotICAgICAgPHJ1bnRpbWU+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhRU1GTmF0dXJlIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9ydW50aW1lPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC5uYXR1cmVfcmVnaXN0cmF0aW9uIj4KLSAgICAgIDxuYXR1cmUKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLkphdmFFTUZOYXR1cmUiPgotICAgICAgPC9uYXR1cmU+Ci0gICA8L2V4dGVuc2lvbj4gICAKLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01BZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0pET01BZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZWRmMjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZGYWN0b3J5SW1wbDsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQyOjUwIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSkRPTUFkYXB0b3IgZXh0ZW5kcyBKYXZhUmVmbGVjdGlvbkFkYXB0b3IgewotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBKYXZhUmVmUGFja2FnZSBKQVZBX1BBQ0sgPSBKYXZhUmVmRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpOwotCXByb3RlY3RlZCBJSmF2YVByb2plY3Qgc291cmNlUHJvamVjdDsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBJTlZBTElEX0xJTkVOTyA9IC0xOwotCWZpbmFsIHByb3RlY3RlZCBJbnRlZ2VyIGZMSU5FTk9Mb2NrID0gbmV3IEludGVnZXIoSU5WQUxJRF9MSU5FTk8pOwotCS8vIFRoaXMgb2JqZWN0IGlzIG5vdCBzdGF0aWMsIGFzIGl0IGlzIHVzZWQgYXMgc3luY2hyb25pemF0aW9uIGVsZW1lbnQuCi0JcHJpdmF0ZSBpbnQgZlJlc29sdmVkTGluZU5vID0gSU5WQUxJRF9MSU5FTk87IC8vIExpbmUgb2Zmc2V0IGluIHNvdXJjZSBmaWxlCi0JcHJpdmF0ZSBpbnQgZlJlc29sdmVkQ29sTm8gPSBJTlZBTElEX0xJTkVOTzsgLy8gQ29sdW1uIG9mZnNldCBpbiBzb3VyY2UgZmlsZQotCXB1YmxpYyBKRE9NQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIElKYXZhUHJvamVjdCB3b3JraW5nUHJvamVjdCkgewotCQlzdXBlcih0YXJnZXQpOwotCQlzZXRTb3VyY2VQcm9qZWN0KHdvcmtpbmdQcm9qZWN0KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgY2xlYXJTb3VyY2UoKSB7Ci0JCS8vIFRvIGJlIG92ZXJpZGRlbiBpZiBuZWVkZWQuCi0JfQotCQotCS8qKgotCSAqIENhbGxlZCBieSBzdWJjbGFzc2VzIGluIGNhblJlZmxlY3QoKS4gSWYgdGhlIHRhcmdldCBpcyBub3QgaW4gYSByZXNvdXJjZSwgb3IgdGhlCi0JICogcmVzb3VyY2UgaXMgbm90IGxvYWRlZCwgdGhlbiBpdCBjYW4ndCByZWZsZWN0LiBNdXN0bid0IHJlZmxlY3QgaWYgdGhlIHRhcmdldAotCSAqIGhhcyBiZWVuIHVubG9hZGVkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jlc291cmNlTG9hZGVkKCkgewotCQlSZXNvdXJjZSByZXMgPSAoKEVPYmplY3QpIGdldFRhcmdldCgpKS5lUmVzb3VyY2UoKTsKLQkJcmV0dXJuIHJlcyAhPSBudWxsICYmIHJlcy5pc0xvYWRlZCgpOwotCX0KLQkKLQkvKioKLQkgKiBTY2FuIGZvciBDUnMgYW5kIExGcyB3aXRoaW4gYSBjaGFyYWN0ZXIgYnVmZmVyCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMTcvMjAwMSAyOjE0OjEzIFBNKQotCSAqIEByZXR1cm4gaW50ICBMaW5lTm8gYXQgY2hhck9mZnNldAotCSAqIEBwYXJhbSBjaGFyT2Zmc2V0IGludAotCSAqIEBwYXJhbSBidWZmZXIgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUJ1ZmZlcgotCSAqLwotCXByaXZhdGUgdm9pZCBjb21wdXRlTGluZU9mZnNldChpbnQgY2hhck9mZnNldCwgSUJ1ZmZlciBidWZmZXIpIHsKLQotCQlmUmVzb2x2ZWRDb2xObyA9IGZSZXNvbHZlZExpbmVObyA9IElOVkFMSURfTElORU5POwotCi0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQljaGFyW10gY2hhckJ1ZmYgPSBidWZmZXIuZ2V0Q2hhcmFjdGVycygpOwotCi0JCWlmIChjaGFyQnVmZiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBMaW5lQ291bnQgPSAwOwotCQlpbnQgQ29sTm8gPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8PSBjaGFyT2Zmc2V0OyBpKyspIHsKLQkJCUNvbE5vKys7Ci0JCQlpZiAoY2hhckJ1ZmZbaV0gPT0gJ1xyJykgewotCQkJCUxpbmVDb3VudCsrOwotCQkJCUNvbE5vID0gMDsKLQkJCQlpZiAoY2hhckJ1ZmZbaSArIDFdID09ICdcbicpCi0JCQkJCWkrKzsgLy8gc2tpcCBMaW5lRmVlZCBmb2xsb3dlZCAgYSBDUgotCQkJfSBlbHNlIGlmIChjaGFyQnVmZltpXSA9PSAnXG4nKSB7Ci0JCQkJTGluZUNvdW50Kys7Ci0JCQkJQ29sTm8gPSAwOwotCQkJfQotCi0JCX0KLQkJZlJlc29sdmVkQ29sTm8gPSBDb2xObzsKLQkJZlJlc29sdmVkTGluZU5vID0gTGluZUNvdW50OwotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kSUQgLSBnZW5lcmF0ZSB0aGUgdW5pcXVlIElEIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBtZXRob2QuCi0JICogU2ltaWxhciB0byBhIFNpZ25hdHVyZSwgYnV0IGhvcGVmdWxseSBtb3JlIHJlYWRhYmxlLgotCSAqIFRoZSBuYW1lIGZvcm1hdCB3aWxsIGJlOgotCSAqIAlzaW1wbGVUeXBlTmFtZS5tZXRob2ROYW1lKG15LnBhY2thZ2UuUGFybV9UeXBlMSxwYXJtVHlwZTIKLQkgKiBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHRpZ2h0bHkgY291cGxlZCB3aXRoIFJlZmxlY3Rpb25BZGFwdGVyLmdldFR5cGVOYW1lc0Zyb21NZXRob2RJRCgpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVNZXRob2RJRChJTWV0aG9kIGpkb21NZXRob2QpIHsKLQkJcmV0dXJuIGNvbXB1dGVNZXRob2RJRChqZG9tTWV0aG9kLCBqZG9tTWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKSwgbnVsbCk7Ci0JfQotCS8qKgotCSAqIGNvbXB1dGVNZXRob2RJRCAtIGdlbmVyYXRlIHRoZSB1bmlxdWUgSUQgdG8gYmUgdXNlZCB0byBpZGVudGlmeSBhIG1ldGhvZC4KLQkgKiBTaW1pbGFyIHRvIGEgU2lnbmF0dXJlLCBidXQgaG9wZWZ1bGx5IG1vcmUgcmVhZGFibGUuCi0JICogVGhlIG5hbWUgZm9ybWF0IHdpbGwgYmU6Ci0JICogCXNpbXBsZVR5cGVOYW1lLm1ldGhvZE5hbWUobXkucGFja2FnZS5QYXJtX1R5cGUxLHBhcm1UeXBlMgotCSAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGlnaHRseSBjb3VwbGVkIHdpdGggUmVmbGVjdGlvbkFkYXB0ZXIuZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZElEKElNZXRob2QgamRvbU1ldGhvZCwgSVR5cGUgdHlwZSwgTWFwIHR5cGVDYWNoZSkgewotCQlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlvdXQuYXBwZW5kKHR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKSk7Ci0JCW91dC5hcHBlbmQoQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQkJb3V0LmFwcGVuZChqZG9tTWV0aG9kLmdldEVsZW1lbnROYW1lKCkpOwotCQlvdXQuYXBwZW5kKENfTUVUSE9EX1BBUk1fREVMSU1JVEVSKTsKLQkJU3RyaW5nW10gcGFybVR5cGVOYW1lcyA9IGpkb21NZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJU3RyaW5nIHBhcm1OYW1lOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCXBhcm1OYW1lID0gY29udmVydEpET010eXBlTmFtZShwYXJtVHlwZU5hbWVzW2ldKTsKLQkJCXBhcm1OYW1lID0gSkRPTVNlYXJjaEhlbHBlci5nZXRSZXNvbHZlZFR5cGVOYW1lKHBhcm1OYW1lLCB0eXBlLCB0eXBlQ2FjaGUpOwotCQkJb3V0LmFwcGVuZChwYXJtTmFtZSk7Ci0JCQlpZiAoaSA8IChwYXJtVHlwZU5hbWVzLmxlbmd0aCAtIDEpKQotCQkJCW91dC5hcHBlbmQoQ19QQVJNX1BBUk1fREVMSU1JVEVSKTsKLQkJfQotCQl0cnkgewotCQkJaWYgKGpkb21NZXRob2QuaXNDb25zdHJ1Y3RvcigpKQotCQkJCW91dC5hcHBlbmQoU19DT05TVFJVQ1RPUl9UT0tFTik7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kTmFtZSAtIGdlbmVyYXRlIHRoZSBuYW1lIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBtZXRob2QuCi0JICogRm9yIHRoZSBtb21lbnQsIG5hbWVzIGFyZSBzaW1wbGUsIGFuZCBVVUlEJ3MgYXJlIGNvbXBsZXguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZE5hbWUoSU1ldGhvZCBqZG9tTWV0aG9kKSB7Ci0JCXJldHVybiBqZG9tTWV0aG9kLmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCS8qKgotCSAqIEphdmEgY29udGVudCBoYXMgY2hhbmdlZCwgYnV0IG5vIHN0cnVjdHVyYWwgY2hhbmdlcyB0aGF0IHJlcXVpcmUKLQkgKiB0byByZWZsZWN0VmFsdWVzKCk7ICBlLmcuLCB0aGUgYm9keSBvZiBhIG1ldGhvZCBoYXMgY2hhbmdlZC4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoOC8xNy8yMDAxIDEwOjQ3OjU4IEFNKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRlbnRDaGFuZ2VkKCkgewotCQlzeW5jaHJvbml6ZWQgKGZMSU5FTk9Mb2NrKSB7Ci0JCQlmUmVzb2x2ZWRMaW5lTm8gPSBJTlZBTElEX0xJTkVOTzsKLQkJCWZSZXNvbHZlZENvbE5vID0gSU5WQUxJRF9MSU5FTk87Ci0JCX0KLQl9Ci0JLyoqCi0JICogY29tcHV0ZU1ldGhvZElEIC0gZ2VuZXJhdGUgdGhlIHVuaXF1ZSBJRCB0byBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgbWV0aG9kLgotCSAqIFNpbWlsYXIgdG8gYSBTaWduYXR1cmUsIGJ1dCBob3BlZnVsbHkgbW9yZSByZWFkYWJsZS4KLQkgKiBUaGUgbmFtZSBmb3JtYXQgd2lsbCBiZToKLQkgKiAJbWV0aG9kTmFtZV9wYXJtVHlwZTFfcGFybVR5cGUyCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEpET010eXBlTmFtZShTdHJpbmcgamRvbVR5cGVOYW1lKSB7Ci0JCXJldHVybiBzaWduYXR1cmVUb1N0cmluZyhqZG9tVHlwZU5hbWUpOwotCX0KLQkvKioKLQkgKiBjcmVhdGVKYXZhRmllbGQgLSBpbnN0YW50aWF0ZSBhIEphdmEgRmllbGQgYmFzZWQgb24gdGhlIHBhc3NlZCBKYXZhIE1vZGVsIElGaWVsZAotCSAqIFdlIGFyZSBkZWZlcnJpbmcgZmllbGQgY29udGVudHMgYXNzdW1pbmcgdGhhdCBpdHMgYWRhcHRvciB3aWxsIHJlZmxlY3QgaXRzIGRldGFpbHMuCi0JICovCi0JcHVibGljIEZpZWxkIGNyZWF0ZUphdmFGaWVsZChJRmllbGQgamRvbUZpZWxkLCBYTUlSZXNvdXJjZSByZXNvdXJjZSkgewotCQlTdHJpbmcgbmFtZSA9IGpkb21GaWVsZC5nZXRFbGVtZW50TmFtZSgpOwotCQlGaWVsZCBuZXdGaWVsZCA9IGdldEphdmFGYWN0b3J5KCkuY3JlYXRlRmllbGQoKTsKLQkJbmV3RmllbGQuc2V0TmFtZShuYW1lKTsKLQkJcmVzb3VyY2Uuc2V0SUQobmV3RmllbGQsICgoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKSkuZ2V0TmFtZSgpICsgQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSICsgbmFtZSk7Ci0JCXJldHVybiBuZXdGaWVsZDsKLQl9Ci0JLyoqCi0JICogY3JlYXRlSmF2YU1ldGhvZCAtIGluc3RhbnRpYXRlIGEgSmF2YSBNZXRob2QgYmFzZWQgb24gdGhlIHBhc3NlZCBKYXZhIE1vZGVsIElNZXRob2QKLQkgKiBXZSBhcmUgZGVmZXJyaW5nIG1ldGhvZCBjb250ZW50cyBhc3N1bWluZyB0aGF0IGl0cyBhZGFwdG9yIHdpbGwgcmVmbGVjdCBpdHMgZGV0YWlscy4KLQkgKiBXZSBuZWVkIHRvIHN0b3JlIGVub3VnaCBpbmZvIGluIHRoZSBlbXB0eSBNZXRob2QgdG8gZmluZCBpdHMgSmF2YSBzb3VyY2UuCi0JICogVGhlIFVVSUQgd2lsbCBldmVudHVhbGx5IGhvbGQgZW5vdWdoIGluZm8gdG8gaWRlbnRpZnkgdGhlIHNvdXJjZSwgc28gd2UgdXNlIGl0LgotCSAqLwotCXB1YmxpYyBNZXRob2QgY3JlYXRlSmF2YU1ldGhvZChJTWV0aG9kIGpkb21NZXRob2QsIFhNSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCU1ldGhvZCBuZXdNZXRob2QgPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZCgpOwotCQkvLyBXZSB1c2UgYSBzaW1wbGUgbmFtZSwgYnV0IGEgY29tcGxleCBJRCAKLQkJbmV3TWV0aG9kLnNldE5hbWUoY29tcHV0ZU1ldGhvZE5hbWUoamRvbU1ldGhvZCkpOwotCQlyZXNvdXJjZS5zZXRJRChuZXdNZXRob2QsIGNvbXB1dGVNZXRob2RJRChqZG9tTWV0aG9kLCBnZXRUeXBlKCksIGdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSkpOwotCQlyZXR1cm4gbmV3TWV0aG9kOwotCX0KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0QmluYXJ5UGF0aEZyb21RdWFsaWZpZWROYW1lKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCXJldHVybiBuZXcgUGF0aChxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCXB1YmxpYyBJVHlwZSBnZXRCaW5hcnlUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0U291cmNlUHJvamVjdCgpICE9IG51bGwpIHsKLQkJCQlJSmF2YUVsZW1lbnQgZm91bmQgPSBnZXRTb3VyY2VQcm9qZWN0KCkuZmluZEVsZW1lbnQoZ2V0QmluYXJ5UGF0aEZyb21RdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUpKTsKLQkJCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCQkJcmV0dXJuICgoSUNsYXNzRmlsZSkgZm91bmQpLmdldFR5cGUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgcXVhbGlmaWVkTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3IgbG9va2luZyB1cCB0eXBlOiAiCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIENvbXB1dGUgYSBjb2x1bW4gbnVtYmVyIGZyb20gdGhlIElTb3VyY2VSYW5nZSBvZmZzZXQKLQkgKiBDYWNoZSB0aGUgbGluZSBudW1iZXIgdGhlcmVhZnRlci4gIFNvdXJjZSBjaGFuZ2Ugd2lsbAotCSAqIEludm9rZSB0aGUgY29udGVudENoYW5nZWQoKSBtZXRob2QuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMTcvMjAwMSAxMToxNjo1MSBBTSkKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29sTm8oKSB7Ci0KLQkJc3luY2hyb25pemVkIChmTElORU5PTG9jaykgewotCQkJaWYgKGZSZXNvbHZlZENvbE5vID09IElOVkFMSURfTElORU5PKQotCQkJCXJlc29sdmVMaW5lQ29sTm8oKTsKLQkJfQotCQlyZXR1cm4gZlJlc29sdmVkQ29sTm87Ci0JfQotCS8qKgotCSAqIENvbXB1dGUgYSBsaW5lIG51bWJlciBmcm9tIHRoZSBJU291cmNlUmFuZ2Ugb2Zmc2V0Ci0JICogQ2FjaGUgdGhlIGxpbmUgbnVtYmVyIHRoZXJlYWZ0ZXIuICBTb3VyY2UgY2hhbmdlIHdpbGwKLQkgKiBJbnZva2UgdGhlIGNvbnRlbnRDaGFuZ2VkKCkgbWV0aG9kLgotCSAqIENyZWF0aW9uIGRhdGU6ICg4LzE3LzIwMDEgMTE6MTY6NTEgQU0pCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVObygpIHsKLQotCQlzeW5jaHJvbml6ZWQgKGZMSU5FTk9Mb2NrKSB7Ci0JCQlpZiAoZlJlc29sdmVkTGluZU5vID09IElOVkFMSURfTElORU5PKQotCQkJCXJlc29sdmVMaW5lQ29sTm8oKTsKLQkJfQotCQlyZXR1cm4gZlJlc29sdmVkTGluZU5vOwotCX0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMTcvMjAwMSAxOjE4OjI5IFBNKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpOwotCS8qIAotCSAqIFJlc29sdmUgYSB0eXBlIG5hbWUgaW4gdGhlIGNvbnRleHQgb2YgYSBUeXBlLgotCSAqIChCb3Jyb3dlZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC51aS5jb2RlbWFuaXB1bGF0aW9uLlN0dWJVdGlsaXR5LmdldFJlc29sdmVkVHlwZU5hbWUoKSkKLQkgKiBUaGUgaW5wdXQgaXMgYSBzaW1wbGUgb3IgcXVhbGlmaWVkIG5hbWUsIE5PVCBhIHNpZ25hdHVyZQotCSAqIFRoZSBvdXRwdXQgd2lsbCBiZSBhIHF1YWxpZmllZCBuYW1lLCBOT1QgYSBzaWduYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvbHZlZFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSwgSVR5cGUgZGVjbGFyaW5nVHlwZSkgewotCQlTdHJpbmcgbmFtZSA9IHR5cGVOYW1lOwotCQl0cnkgewotCQkJbmFtZSA9IEpET01TZWFyY2hIZWxwZXIucmVzb2x2ZVNpbXBsZVR5cGVOYW1lKGRlY2xhcmluZ1R5cGUsIHR5cGVOYW1lKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0U291cmNlUHJvamVjdCgpIHsKLQkJcmV0dXJuIHNvdXJjZVByb2plY3Q7Ci0JfQotCXByb3RlY3RlZCBhYnN0cmFjdCBJVHlwZSBnZXRUeXBlKCk7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IE1hcCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCk7Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlU291cmNlVHlwZSgpIHsKLQkJZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSh0cnVlKTsgLy8gaW5kdWNlIGNsaWVudHMgdG8gZ2V0IE5vdGlmaWVkLgotCX0KLQotCXB1YmxpYyBOb3RpZmljYXRpb24gcmVsZWFzZVNvdXJjZVR5cGVOb05vdGlmaWNhdGlvbigpIHsKLQkJcmV0dXJuIGZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbih0cnVlKTsgLy8gaW5kdWNlIGNsaWVudHMgdG8gZ2V0IE5vdGlmaWVkLgotCX0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICogQ3JlYXRpb24gZGF0ZTogKDgvMjEvMjAwMSA4OjA5OjM0IEFNKQotCSAqLwotCXByaXZhdGUgdm9pZCByZXNvbHZlTGluZUNvbE5vKCkgewotCi0JCUlNZW1iZXIgcnMgPSAoSU1lbWJlcikgZ2V0UmVmbGVjdGlvblNvdXJjZSgpOwotCQlpZiAocnMgIT0gbnVsbCkgewotCQkJaW50IG9mZnNldCA9IElOVkFMSURfTElORU5POwotCQkJdHJ5IHsKLQkJCQlJU291cmNlUmFuZ2Ugc3IgPSBycy5nZXROYW1lUmFuZ2UoKTsKLQkJCQlpZiAoc3IuZ2V0TGVuZ3RoKCkgPD0gMCkKLQkJCQkJcmV0dXJuOwotCQkJCW9mZnNldCA9IHNyLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGplKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHJzLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlJQnVmZmVyIGJ1ZmZlciA9IGN1LmdldEJ1ZmZlcigpOwotCQkJCQljb21wdXRlTGluZU9mZnNldChvZmZzZXQsIGJ1ZmZlcik7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGplKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNldFNvdXJjZVByb2plY3QoSUphdmFQcm9qZWN0IHdvcmtpbmdQcm9qZWN0KSB7Ci0JCXNvdXJjZVByb2plY3QgPSB3b3JraW5nUHJvamVjdDsKLQl9Ci0JLyoqCi0JICogQ29udmVydHMgYSB0eXBlIHNpZ25hdHVyZSB0byBhIHJlYWRhYmxlIHN0cmluZy4KLQkgKgotCSAqIFVzZXMgU2lnbmF0dXJlLnRvU3RyaW5nKCksIHRoZW4gdHJpZXMgdG8gdW5kbyBiYWQgcmVwbGFjZW1lbnQgZm9yIGlubmVyIGNsYXNzZXMuCi0JICogCi0JICogQnVnOiAxNjYyMjYgW2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjYyMjZdCi0JICogVXBkYXRlIHRvIHVzZSB0aGUgZXJhc3VyZSB0eXBlIGZyb20gdGhlIHNpZ25hdHVyZSBpbiBvcmRlciB0byAKLQkgKiB0b2xlcmF0ZSBKREsgNSBnZW5lcmljcy4KLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNpZ25hdHVyZVRvU3RyaW5nKFN0cmluZyBzaWduYXR1cmUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlib29sZWFuIGhhc0RvbGxhciA9IChzaWduYXR1cmUuaW5kZXhPZihTaWduYXR1cmUuQ19ET0xMQVIpICE9IC0xKTsKLQkJLy9iZWdpbiAxNjYyMjYgZml4Ci0JCVN0cmluZyByZXN1bHQgPSBTaWduYXR1cmUuZ2V0VHlwZUVyYXN1cmUoc2lnbmF0dXJlKTsKLQkJcmVzdWx0ID0gU2lnbmF0dXJlLnRvU3RyaW5nKHJlc3VsdCk7Ci0JCS8vZW5kIDE2NjIyNiBmaXgKLQkJaWYgKGhhc0RvbGxhcikgewotCQkJaW50IG5ld1BvcyA9IHJlc3VsdC5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobmV3UG9zICE9IC0xKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZygwLCBuZXdQb3MpICsgIiQiICsgcmVzdWx0LnN1YnN0cmluZyhuZXdQb3MgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCS8qKgotCSAqIHNldFR5cGUgLSBzZXQgb3VyIHR5cGUgaGVyZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZU5hbWVGcm9tU2lnbmF0dXJlKFN0cmluZyBzaWcpIHsKLQkJcmV0dXJuIHR5cGVOYW1lRnJvbVNpZ25hdHVyZShzaWcsIGdldFR5cGUoKSk7Ci0JfQotCS8qKgotCSAqIHNldFR5cGUgLSBzZXQgb3VyIHR5cGUgaGVyZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZU5hbWVGcm9tU2lnbmF0dXJlKFN0cmluZyBzaWcsIElUeXBlIHBhcmVudCkgewotCQlyZXR1cm4gdHlwZU5hbWVGcm9tU2lnbmF0dXJlKHNpZywgcGFyZW50LCBnZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCkpOwotCX0KLQkvKioKLQkgKiBzZXRUeXBlIC0gc2V0IG91ciB0eXBlIGhlcmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlTmFtZUZyb21TaWduYXR1cmUoU3RyaW5nIHNpZywgSVR5cGUgcGFyZW50LCBNYXAgdHlwZUNhY2hlKSB7Ci0JCVN0cmluZyByZXN1bHQ7Ci0JCVN0cmluZyBjb21wb25lbnRTaWduYXR1cmUgPSBTaWduYXR1cmUuZ2V0RWxlbWVudFR5cGUoc2lnKTsKLQkJaW50IGFycmF5RGltZW5zaW9ucyA9IFNpZ25hdHVyZS5nZXRBcnJheUNvdW50KHNpZyk7Ci0JCXJlc3VsdCA9IEpET01TZWFyY2hIZWxwZXIuZ2V0UmVzb2x2ZWRUeXBlTmFtZShzaWduYXR1cmVUb1N0cmluZyhjb21wb25lbnRTaWduYXR1cmUpLCBwYXJlbnQsIHR5cGVDYWNoZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlEaW1lbnNpb25zOyBpKyspIHsKLQkJCXJlc3VsdCA9IHJlc3VsdCArICJbXSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSkRPTVNlYXJjaEhlbHBlciNmaW5kVHlwZShTdHJpbmcsIGJvb2xlYW4sIElKYXZhUHJvamVjdCwgSkRPTUFkYXB0b3IpCi0JICovCi0JcHVibGljIElUeXBlIGdldFR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJcmV0dXJuIEpET01TZWFyY2hIZWxwZXIuZmluZFR5cGUocXVhbGlmaWVkTmFtZSwgZmFsc2UsIGdldFNvdXJjZVByb2plY3QoKSwgdGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NQ2xhc3NGaW5kZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTUNsYXNzRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMzY5OWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NQ2xhc3NGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg4LzE2LzIwMDAgMTE6MDY6NDYgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKRE9NQ2xhc3NGaW5kZXIgewotCQotCXByaXZhdGUgc3RhdGljIEpET01DbGFzc0ZpbmRlciBpbnN0YW5jZTsKLS8qKgotICogSkRPTUNsYXNzRmluZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKRE9NQ2xhc3NGaW5kZXIoKSB7Ci0Jc3VwZXIoKTsKLX0KLXByb3RlY3RlZCBJUGF0aCBnZXRCaW5hcnlQYXRoRnJvbVF1YWxpZmllZE5hbWUoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQlyZXR1cm4gbmV3IFBhdGgocXVhbGlmaWVkTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuY2xhc3MiKTsvLyROT04tTkxTLTEkCi19Ci1wdWJsaWMgSVR5cGUgZ2V0QmluYXJ5VHlwZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQotCUlKYXZhRWxlbWVudCBmb3VuZCA9IGdldEphdmFFbGVtZW50KHF1YWxpZmllZE5hbWUpOwotCWlmIChmb3VuZCAhPSBudWxsKQotCQlyZXR1cm4gKChJQ2xhc3NGaWxlKSBmb3VuZCkuZ2V0VHlwZSgpOwotCXJldHVybiBudWxsOwotfQotcHVibGljIElKYXZhRWxlbWVudCBnZXRKYXZhRWxlbWVudChTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCXRyeSB7Ci0JCWlmIChnZXRTb3VyY2VQcm9qZWN0KCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRTb3VyY2VQcm9qZWN0KCkuZmluZEVsZW1lbnQoZ2V0UGF0aEZyb21RdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUpKTsKLQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvcl9Mb29raW5nX1VwX1R5cGVfRVJST1JfIiwgKG5ldyBPYmplY3RbXSB7cXVhbGlmaWVkTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3IgbG9va2luZyB1cCB0eXBlOiAiCi0JfQotCXJldHVybiBudWxsOwotfQotcHJvdGVjdGVkIElQYXRoIGdldFBhdGhGcm9tUXVhbGlmaWVkTmFtZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCXJldHVybiBuZXcgUGF0aChxdWFsaWZpZWROYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5qYXZhIik7Ly8kTk9OLU5MUy0xJAotfQotcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRTb3VyY2VQcm9qZWN0KCkgewotCS8vcmV0dXJuIChJSmF2YVByb2plY3QpICgoSmF2YVJlZlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YVJlZlBhY2thZ2UuZU5TX1VSSSkpLmdldEphdmFSZWZGYWN0b3J5KCkuZ2V0SmF2YUNvbnRleHQoKTsKLQlyZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBJVHlwZSBnZXRUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCUlKYXZhRWxlbWVudCBmb3VuZCA9IGdldEphdmFFbGVtZW50KHF1YWxpZmllZE5hbWUpOwotCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCWlmIChmb3VuZCBpbnN0YW5jZW9mIElDbGFzc0ZpbGUpCi0JCQkJcmV0dXJuICgoSUNsYXNzRmlsZSkgZm91bmQpLmdldFR5cGUoKTsKLQkJCWVsc2UKLQkJCQlpZiAoZm91bmQgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQkJCUlDb21waWxhdGlvblVuaXQgZm91bmRDVSA9IChJQ29tcGlsYXRpb25Vbml0KSBmb3VuZDsKLQkJCQkJLy8gc3RyaXAgdGhlICIuamF2YSIsIGxpZnRlZCBmcm9tIENvbXBpbGF0aW9uVW5pdC5nZXRNYWluVHlwZU5hbWUoKQotCQkJCQlTdHJpbmcgY3VNYWluVHlwZU5hbWUgPSBmb3VuZENVLmdldEVsZW1lbnROYW1lKCk7Ci0JCQkJCWN1TWFpblR5cGVOYW1lID0gY3VNYWluVHlwZU5hbWUuc3Vic3RyaW5nKDAsIGN1TWFpblR5cGVOYW1lLmxlbmd0aCgpIC0gNSk7Ci0JCQkJCXJldHVybiBmb3VuZENVLmdldFR5cGUoY3VNYWluVHlwZU5hbWUpOwotCQkJCX0KLQlyZXR1cm4gbnVsbDsKLX0KLS8qKgotICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDgvMTYvMjAwMCAxMToxOTo0OCBQTSkKLSAqIEByZXR1cm4gY29tLmlibS5ldG9vbHMuamF2YS5hZGFwdGVycy5KRE9NQ2xhc3NGaW5kZXIKLSAqLwotcHVibGljIHN0YXRpYyBKRE9NQ2xhc3NGaW5kZXIgaW5zdGFuY2UoKSB7Ci0JaWYgKGluc3RhbmNlID09IG51bGwpCi0JCWluc3RhbmNlID0gbmV3IEpET01DbGFzc0ZpbmRlcigpOwotCXJldHVybiBpbnN0YW5jZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSkRPTVNlYXJjaEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NU2VhcmNoSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyOWEwYzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KRE9NU2VhcmNoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg5LzI2LzIwMDEgMTE6MDk6MzAgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKRE9NU2VhcmNoSGVscGVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT0xWRURfTkFNRSA9ICIgOjogUkVTT0xWRURfTkFNRSA6OiAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUklPRCA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT09MRUFOID0gImJvb2xlYW4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJZVEUgPSAiYnl0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBUiA9ICJjaGFyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVCA9ICJzaG9ydCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UID0gImludCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9ORyA9ICJsb25nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTE9BVCA9ICJmbG9hdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFID0gImRvdWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRCA9ICJ2b2lkIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEpET01TZWFyY2hIZWxwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSkRPTVNlYXJjaEhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogSWYgdGhlIEBzaW1wbGVOYW1lIGlzIGFuIGlubmVyIGNsYXNzLCB3ZSBuZWVkIHRvIHJlc29sdmUgb25seSB0aGUgZGVjbGFyaW5nIGNsYXNzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdW10gZ2V0VHlwZU5hbWVJbmZvKElUeXBlIHR5cGUsIFN0cmluZyBzaW1wbGVOYW1lLCBib29sZWFuIGlzRm9yUmVmbGVjdGlvbikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdW10gcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGRlY2xhcmluZ05hbWUsIHR5cGVOYW1lOwotCQl0eXBlTmFtZSA9IHNpbXBsZU5hbWU7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCWlmIChpc0ZvclJlZmxlY3Rpb24pCi0JCQkJdHlwZU5hbWUgPSB0eXBlTmFtZS5yZXBsYWNlKCcuJywgJyQnKTsKLQkJCWludCBpbmRleCA9IHR5cGVOYW1lLmluZGV4T2YoIiQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCWRlY2xhcmluZ05hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCXJlc3VsdCA9IHR5cGUucmVzb2x2ZVR5cGUoZGVjbGFyaW5nTmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJCWlmIChpc0ZvclJlZmxlY3Rpb24pCi0JCQkJCQlyZXN1bHRbMF1bMV0gPSByZXN1bHRbMF1bMV0ucmVwbGFjZSgnLicsICckJyk7Ci0JCQkJCXJlc3VsdFswXVsxXSArPSB0eXBlTmFtZS5zdWJzdHJpbmcoaW5kZXgsIHR5cGVOYW1lLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4ID0gdHlwZU5hbWUuaW5kZXhPZigiWyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCQlkZWNsYXJpbmdOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQkJcmVzdWx0ID0gdHlwZS5yZXNvbHZlVHlwZShkZWNsYXJpbmdOYW1lKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCQkJcmVzdWx0WzBdWzFdID0gcmVzdWx0WzBdWzFdICsgdHlwZU5hbWUuc3Vic3RyaW5nKGluZGV4KTsKLQkJCQl9IGVsc2UKLQkJCQkJcmVzdWx0ID0gdHlwZS5yZXNvbHZlVHlwZSh0eXBlTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIGlzIGEgcHJpbWl0aXZlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKEJPT0xFQU4uZXF1YWxzKHR5cGUpIHx8IElOVC5lcXVhbHModHlwZSkgfHwgQ0hBUi5lcXVhbHModHlwZSkgfHwgU0hPUlQuZXF1YWxzKHR5cGUpIHx8IExPTkcuZXF1YWxzKHR5cGUpIHx8IEZMT0FULmVxdWFscyh0eXBlKSB8fCBET1VCTEUuZXF1YWxzKHR5cGUpIHx8IEJZVEUuZXF1YWxzKHR5cGUpKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIGlzIGEgcHJpbWl0aXZlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZU9yVm9pZChTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gaXNQcmltaXRpdmUodHlwZSkgfHwgaXNWb2lkKHR5cGUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR5cGUgaXMgYSBwcmltaXRpdmUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzVm9pZChTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gVk9JRC5lcXVhbHModHlwZSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIHNpZ25hdHVyZXMgbWF0Y2ggd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoVHlwZVNpZ25hdHVyZXMoSVR5cGUgdHlwZSwgU3RyaW5nIHNpZ25hdHVyZTEsIFN0cmluZyBzaWduYXR1cmUyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1hdGNoVHlwZVNpZ25hdHVyZXModHlwZSwgc2lnbmF0dXJlMSwgc2lnbmF0dXJlMiwgbnVsbCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIHNpZ25hdHVyZXMgbWF0Y2ggd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG1hdGNoVHlwZVNpZ25hdHVyZXMoSVR5cGUgdHlwZSwgU3RyaW5nIHNpZ25hdHVyZTEsIFN0cmluZyBzaWduYXR1cmUyLCBNYXAgcmVzb2x2ZWROYW1lQ2FjaGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlTdHJpbmcgc2lnMSA9IHNpZ25hdHVyZTE7Ci0JCVN0cmluZyBzaWcyID0gc2lnbmF0dXJlMjsKLQkJLy8gRmlyc3QgY2hlY2sgYXJyYXkgY291bnQuCi0JCWlmIChTaWduYXR1cmUuZ2V0QXJyYXlDb3VudChzaWcxKSA9PSBTaWduYXR1cmUuZ2V0QXJyYXlDb3VudChzaWcyKSkgewotCQkJLy8gV2UgaGF2ZSB0aGUgc2FtZSBhcnJheSBjb3VudCwgZ2V0IHRoZSBlbGVtZW50IHR5cGVzIGZvciBjb25zaWRlcmF0aW9uLgotCQkJc2lnMSA9IFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZShzaWcxKTsKLQkJCXNpZzIgPSBTaWduYXR1cmUuZ2V0RWxlbWVudFR5cGUoc2lnMik7Ci0KLQkJCS8vIFRoZXJlIGFyZSB0aHJlZSBjYXNlczoKLQkJCS8vCQkxKSBCb3RoIGFyZSB1bnF1YWxpZmllZCAoYm90aCBiZWluZyBwcmltaXRpdmUgd2lsbCBmYWxsIGludG8gdGhpcyksCi0JCQkvLwkJMikgQm90aCBhcmUgcXVhbGlmaWVkLCBhbmQKLQkJCS8vCQkzKSBPbmUgaXMgcXVhbGlmaWVkIGFuZCB0aGUgb3RoZXIgaXMgbm90IChvbmUgY291bGQgYmUgcHJpbWl0aXZlKS4KLQotCQkJLy8gRm9yIHRoZSBmaXJzdCB0d28gY2FzZXMgYSBjb21wYXJlIG9mIHRoZSByZWFkYWJsZSBuYW1lcyB3aWxsIGFsd2F5cyBkby4KLQkJCWlmICghKChzaWcxLmluZGV4T2YoJy4nKSA9PSAtMSkgXiAoc2lnMi5pbmRleE9mKCcuJykgPT0gLTEpKSkgewotCQkJCXJlc3VsdCA9IFNpZ25hdHVyZS50b1N0cmluZyhzaWcxKS5lcXVhbHMoU2lnbmF0dXJlLnRvU3RyaW5nKHNpZzIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gVGhpcyBpcyBjYXNlIDMuCi0JCQkJLy8gRmlyc3Qgcm9vdCBvdXQgb25lIGJlaW5nIHByaW1pdGl2ZS4KLQkJCQlpZiAoKChzaWcxLmNoYXJBdCgwKSA9PSAnUScpIHx8IChzaWcxLmNoYXJBdCgwKSA9PSAnTCcpKSAmJiAoKHNpZzIuY2hhckF0KDApID09ICdRJykgfHwgKHNpZzIuY2hhckF0KDApID09ICdMJykpKSB7Ci0JCQkJCS8vIEdldCB0aGUgcmVhZGFibGUgbmFtZSBvZiB0aGUgcXVhbGlmaWVkIHNpZ25hdHVyZQotCQkJCQkvLyBhbmQgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBvdGhlci4KLQkJCQkJU3RyaW5nIHF1YWxpZmllZE5hbWUgPSBudWxsOwotCQkJCQlTdHJpbmcgc2ltcGxlTmFtZSA9IG51bGw7Ci0JCQkJCWlmIChzaWcxLmluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJCQkJcXVhbGlmaWVkTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyhzaWcyKTsKLQkJCQkJCXNpbXBsZU5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcoc2lnMSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlxdWFsaWZpZWROYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKHNpZzEpOwotCQkJCQkJc2ltcGxlTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyhzaWcyKTsKLQkJCQkJfQotCi0JCQkJCS8vIElmIHRoZSBzaW1wbGUgbmFtZSByZXNvbHZlcyB0byB0aGUgcXVhbGlmaWVkIG5hbWUsIHdlIGhhdmUgYSBtYXRjaC4KLQkJCQkJcmVzdWx0ID0gcXVhbGlmaWVkTmFtZS5lcXVhbHMocmVzb2x2ZVNpbXBsZVR5cGVOYW1lKHR5cGUsIHNpbXBsZU5hbWUsIHJlc29sdmVkTmFtZUNhY2hlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBuZWVkc1RvUmVzb2x2ZU5hbWUoSVR5cGUgdHlwZSwgU3RyaW5nIHNpbXBsZU5hbWUsIGJvb2xlYW4gaXNGb3JSZWZsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gcmV0VmFsID0gZmFsc2U7Ci0JCWlmICh0eXBlICE9IG51bGwpCi0JCXsKLQkJCXJldFZhbCA9ICEodHlwZS5pc0JpbmFyeSgpIHx8ICghaXNGb3JSZWZsZWN0aW9uICYmIHNpbXBsZU5hbWUuaW5kZXhPZihQRVJJT0QpID4gLTEpIHx8IGlzUHJpbWl0aXZlT3JWb2lkKHNpbXBsZU5hbWUpKTsKLQkJfQotCQlyZXR1cm4gcmV0VmFsOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNpbXBsZSBuYW1lIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIHR5cGUuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZSBuYW1lIGNhbiBub3QgYmUgcmVzb2x2ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVNpbXBsZVR5cGVOYW1lKElUeXBlIHR5cGUsIFN0cmluZyBzaW1wbGVOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJlc29sdmVTaW1wbGVUeXBlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCBudWxsKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBzaW1wbGUgbmFtZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSB0eXBlLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgbmFtZSBjYW4gbm90IGJlIHJlc29sdmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVTaW1wbGVUeXBlTmFtZShJVHlwZSB0eXBlLCBTdHJpbmcgc2ltcGxlTmFtZSwgTWFwIHJlc29sdmVkTmFtZUNhY2hlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHJlc29sdmVTaW1wbGVUeXBlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCByZXNvbHZlZE5hbWVDYWNoZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgc2ltcGxlIG5hbWUgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgdHlwZS4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG5hbWUgY2FuIG5vdCBiZSByZXNvbHZlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlU2ltcGxlVHlwZU5hbWUoSVR5cGUgdHlwZSwgU3RyaW5nIHNpbXBsZU5hbWUsIE1hcCByZXNvbHZlZE5hbWVDYWNoZSwgYm9vbGVhbiBpc0ZvclJlZmxlY3Rpb24pIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAoIW5lZWRzVG9SZXNvbHZlTmFtZSh0eXBlLCBzaW1wbGVOYW1lLCBpc0ZvclJlZmxlY3Rpb24pKQotCQkJcmV0dXJuIHNpbXBsZU5hbWU7Ci0JCVN0cmluZyBrZXkgPSBudWxsLCBxdWFsaWZpZWROYW1lID0gbnVsbDsKLQkJaWYgKHJlc29sdmVkTmFtZUNhY2hlICE9IG51bGwpIHsKLQkJCWtleSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgKyBSRVNPTFZFRF9OQU1FICsgc2ltcGxlTmFtZTsKLQkJCXF1YWxpZmllZE5hbWUgPSAoU3RyaW5nKSByZXNvbHZlZE5hbWVDYWNoZS5nZXQoa2V5KTsKLQkJfQotCQlpZiAocXVhbGlmaWVkTmFtZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmdbXVtdIHJlc3VsdCA9IGdldFR5cGVOYW1lSW5mbyh0eXBlLCBzaW1wbGVOYW1lLCBpc0ZvclJlZmxlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHBhY2tOYW1lID0gcmVzdWx0WzBdWzBdOwotCQkJCWlmIChwYWNrTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXF1YWxpZmllZE5hbWUgPSByZXN1bHRbMF1bMV07Ci0JCQkJCWlmIChpc0ZvclJlZmxlY3Rpb24pCi0JCQkJCQlxdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZS5yZXBsYWNlKCcuJywgJyQnKTsJCQkJCQotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQliLmFwcGVuZChyZXN1bHRbMF1bMF0pLmFwcGVuZChQRVJJT0QpOwotCQkJCQlTdHJpbmcgdHlwZU5hbWUgPSByZXN1bHRbMF1bMV07Ci0JCQkJCWlmIChpc0ZvclJlZmxlY3Rpb24pCi0JCQkJCQl0eXBlTmFtZSA9IHR5cGVOYW1lLnJlcGxhY2UoJy4nLCAnJCcpOwotCQkJCQliLmFwcGVuZCh0eXBlTmFtZSk7Ci0JCQkJCXF1YWxpZmllZE5hbWUgPSBiLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlxdWFsaWZpZWROYW1lID0gc2ltcGxlTmFtZTsKLQkJCX0KLQkJCWlmIChyZXNvbHZlZE5hbWVDYWNoZSAhPSBudWxsKQotCQkJCXJlc29sdmVkTmFtZUNhY2hlLnB1dChrZXksIHF1YWxpZmllZE5hbWUpOwotCQl9Ci0JCXJldHVybiBxdWFsaWZpZWROYW1lOwotCX0KLQkvKioKLQkgKiBTZWFyY2hlcyBmb3IgYSBtYXRjaGluZyBtZXRob2QgYW5kIHNldHMgaXQgaW4gdGhlCi0JICogZGVzY3JpcHRvciBpZiBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZXRob2Qgc2VhcmNoRm9yTWF0Y2hpbmdNZXRob2QoSVR5cGUgdHlwZSwgU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZ1tdIHBhcm1TaWdzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHNlYXJjaEZvck1hdGNoaW5nTWV0aG9kKHR5cGUsIG1ldGhvZE5hbWUsIHBhcm1TaWdzLCBudWxsKTsKLQl9Ci0JLyoqCi0JICogU2VhcmNoZXMgZm9yIGEgbWF0Y2hpbmcgbWV0aG9kIGFuZCBzZXRzIGl0IGluIHRoZQotCSAqIGRlc2NyaXB0b3IgaWYgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTWV0aG9kIHNlYXJjaEZvck1hdGNoaW5nTWV0aG9kKElUeXBlIHR5cGUsIFN0cmluZyBtZXRob2ROYW1lLCBTdHJpbmdbXSBwYXJtU2lncywgTWFwIHJlc29sdmVkTmFtZUNhY2hlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCQkvLyBGaXJzdCBnZXQgYWxsIHRoZSBtZXRob2RzIGJ5IHRoaXMgbmFtZSBhbmQgd2l0aCB0aGlzIG1hbnkgcGFybXMuCi0JCUlNZXRob2RbXSBhbGxNZXRob2RzID0gdHlwZS5nZXRNZXRob2RzKCk7Ci0JCUxpc3QgY2FuZGlkYXRlTWV0aG9kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxNZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgcGFybVNpZ3NMZW5ndGggPSAocGFybVNpZ3MgIT0gbnVsbCA/IHBhcm1TaWdzLmxlbmd0aCA6IDApOwotCQkJaWYgKChhbGxNZXRob2RzW2ldLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSAmJiAoYWxsTWV0aG9kc1tpXS5nZXROdW1iZXJPZlBhcmFtZXRlcnMoKSA9PSBwYXJtU2lnc0xlbmd0aCkpCi0JCQkJY2FuZGlkYXRlTWV0aG9kcy5hZGQoYWxsTWV0aG9kc1tpXSk7Ci0JCX0KLQotCQkvLyBGb3IgZWFjaCBjYW5kaWRhdGUgY29uc2lkZXIgZWFjaCBwYXJtIGZvciBhIG1hdGNoLgotCQkvLyBUYWtlIHRoZSBmaXJzdCBvbmUgdGhhdCBtYXRjaGVzIG9uIGFsbCBwYXJtcy4KLQkJSU1ldGhvZCBuZXh0ID0gbnVsbDsKLQkJU3RyaW5nW10gbmV4dFBhcm1TaWdzID0gbnVsbDsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlJdGVyYXRvciBjYW5kaWRhdGVJdGVyID0gY2FuZGlkYXRlTWV0aG9kcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoIWZvdW5kICYmIChjYW5kaWRhdGVJdGVyLmhhc05leHQoKSkpIHsKLQkJCW5leHQgPSAoSU1ldGhvZCkgY2FuZGlkYXRlSXRlci5uZXh0KCk7Ci0JCQluZXh0UGFybVNpZ3MgPSBuZXh0LmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQlmb3VuZCA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMDsoZm91bmQgJiYgKGkgPCBuZXh0UGFybVNpZ3MubGVuZ3RoKSk7IGkrKykKLQkJCQlmb3VuZCAmPSBtYXRjaFR5cGVTaWduYXR1cmVzKHR5cGUsIHBhcm1TaWdzW2ldLCBuZXh0UGFybVNpZ3NbaV0sIHJlc29sdmVkTmFtZUNhY2hlKTsKLQkJfQotCQlyZXR1cm4gZm91bmQgPyBuZXh0IDogbnVsbDsKLQl9Ci0KLQkvKioKLQkqIFRoZSByZXR1cm5lZCBPYmplY3RbXSB3aWxsIGNvbnRhaW4gdHdvIGVudHJpZXMuICBUaGUKLQkqIGZpcnN0IHdpbGwgYmUgdGhlIElKYXZhRWxlbWVudCB0aGF0IHdhcyBmb3VuZCBhbmQgdGhlCi0JKiBzZWNvbmQgd2lsbCBiZSB0aGUgcXVhbGlmaWVkTmFtZSB1c2VkIHRvIGZpbmQgaXQuCi0JKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdFtdIGZpbmRBY3R1YWxKYXZhRWxlbWVudChTdHJpbmcgcXVhbGlmaWVkTmFtZSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMl07Ci0JCWlmIChhZGFwdG9yID09IG51bGwpCi0JCQlyZXN1bHRbMV0gPSBxdWFsaWZpZWROYW1lOwotCQllbHNlIAotCQkJLy9FbnN1cmUgdGhlIG5hbWUgaXMgcXVhbGlmaWVkCi0JCQlyZXN1bHRbMV0gPSBnZXRSZXNvbHZlZFR5cGVOYW1lKHF1YWxpZmllZE5hbWUsIGFkYXB0b3IuZ2V0VHlwZSgpLCBhZGFwdG9yLmdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSk7Ci0JCQotCQlyZXN1bHRbMF0gPSBmaW5kSmF2YUVsZW1lbnQoKFN0cmluZykgcmVzdWx0WzFdLCBqYXZhUHJvamVjdCwgYWRhcHRvcik7Ci0JCWlmIChyZXN1bHRbMF0gPT0gbnVsbCkKLQkJCWZpbmRJbm5lckphdmFFbGVtZW50KHJlc3VsdCwgamF2YVByb2plY3QsIGFkYXB0b3IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSByZXR1cm5lZCBPYmplY3RbXSB3aWxsIGNvbnRhaW4gdHdvIGVudHJpZXMuICBUaGUKLQkgKiBmaXJzdCB3aWxsIGJlIHRoZSBJSmF2YUVsZW1lbnQgdGhhdCB3YXMgZm91bmQgYW5kIHRoZQotCSAqIHNlY29uZCB3aWxsIGJlIHRoZSBxdWFsaWZpZWROYW1lIHVzZWQgdG8gZmluZCBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZmluZElubmVySmF2YUVsZW1lbnQoT2JqZWN0W10gaW5mbywgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBKRE9NQWRhcHRvciBhZGFwdG9yKSB7Ci0JCVN0cmluZyBxdWFsaWZpZWROYW1lLCBpbm5lck5hbWU7Ci0JCXF1YWxpZmllZE5hbWUgPSAoU3RyaW5nKSBpbmZvWzFdOwotCQlpbnQgaW5kZXggPSBxdWFsaWZpZWROYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJaW5uZXJOYW1lID0gcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJU3RyaW5nIHBrZ05hbWUgPSBpbm5lck5hbWU7Ci0JCQlpbm5lck5hbWUgKz0gIiQiOyAvLyROT04tTkxTLTEkCi0JCQlpbm5lck5hbWUgKz0gcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBxdWFsaWZpZWROYW1lLmxlbmd0aCgpKTsKLQkJCWlmIChhZGFwdG9yICE9IG51bGwpIHsKLQkJCQkvL0Vuc3VyZSB0aGUgbmFtZSBpcyBxdWFsaWZpZWQgd2hpY2ggaXQgbWF5IG5vdCBiZSBpZiBhbiBpbm5lciBjbGFzcwotCQkJCWlubmVyTmFtZSA9IGdldFJlc29sdmVkVHlwZU5hbWUoaW5uZXJOYW1lLCBhZGFwdG9yLmdldFR5cGUoKSwgYWRhcHRvci5nZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCkpOwotCQkJCWlmIChxdWFsaWZpZWROYW1lLmVxdWFscyhpbm5lck5hbWUpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlpbmZvWzFdID0gaW5uZXJOYW1lOwotCQkJaW5mb1swXSA9IGZpbmRKYXZhRWxlbWVudChpbm5lck5hbWUsIGphdmFQcm9qZWN0LCBhZGFwdG9yKTsKLQkJCWlmIChqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkmJiBpbmZvWzBdID09IG51bGwpIHsKLQkJCQlpbmRleCA9IGlubmVyTmFtZS5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGluZGV4ID4gMCAmJiBpbm5lck5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KS5lcXVhbHMocGtnTmFtZSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlmaW5kSW5uZXJKYXZhRWxlbWVudChpbmZvLCBqYXZhUHJvamVjdCwgYWRhcHRvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElKYXZhRWxlbWVudCBmaW5kSmF2YUVsZW1lbnQoU3RyaW5nIHF1YWxpZmllZE5hbWUsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSkRPTUFkYXB0b3IgYWRhcHRvcikgewotCQl0cnkgewotCQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUocXVhbGlmaWVkTmFtZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvcl9Mb29raW5nX1VwX1R5cGVfRVJST1JfIiwgKG5ldyBPYmplY3RbXSB7IHF1YWxpZmllZE5hbWUsIGptZS5nZXRNZXNzYWdlKCl9KSkpOyAvLyROT04tTkxTLTEkID0gIkVycm9yIGxvb2tpbmcgdXAgdHlwZTogIgotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIElQYXRoIGdldFBhdGhGcm9tUXVhbGlmaWVkTmFtZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlyZXR1cm4gbmV3IFBhdGgocXVhbGlmaWVkTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuamF2YSIpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qIAotCSogUmVzb2x2ZSBhIHR5cGUgbmFtZSBpbiB0aGUgY29udGV4dCBvZiBhIFR5cGUuCi0JKiAoQm9ycm93ZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQudWkuY29kZW1hbmlwdWxhdGlvbi5TdHViVXRpbGl0eS5nZXRSZXNvbHZlZFR5cGVOYW1lKCkpCi0JKiBUaGUgaW5wdXQgaXMgYSBzaW1wbGUgb3IgcXVhbGlmaWVkIG5hbWUsIE5PVCBhIHNpZ25hdHVyZQotCSogVGhlIG91dHB1dCB3aWxsIGJlIGEgcXVhbGlmaWVkIG5hbWUsIE5PVCBhIHNpZ25hdHVyZQotCSovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb2x2ZWRUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUsIElUeXBlIGRlY2xhcmluZ1R5cGUsIE1hcCB0eXBlQ2FjaGUpIHsKLQkJU3RyaW5nIG5hbWUgPSB0eXBlTmFtZTsKLQkJdHJ5IHsKLQkJCW5hbWUgPSBKRE9NU2VhcmNoSGVscGVyLnJlc29sdmVTaW1wbGVUeXBlTmFtZShkZWNsYXJpbmdUeXBlLCB0eXBlTmFtZSwgdHlwZUNhY2hlLCB0cnVlKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVR5cGUgZmluZFR5cGUoU3RyaW5nIHF1YWxpZmllZE5hbWUsIGJvb2xlYW4gdXNlQWR2YW5jZWRGb3JJbm5lcnMsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSkRPTUFkYXB0b3IgYWRhcHRvcikgewotCQkKLQkJSUphdmFFbGVtZW50IGZvdW5kID0gbnVsbDsKLQkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IHF1YWxpZmllZE5hbWU7Ci0JCWlmICh1c2VBZHZhbmNlZEZvcklubmVycykgewotCQkJT2JqZWN0W10gcmVzdWx0ID0gZmluZEFjdHVhbEphdmFFbGVtZW50KHF1YWxpZmllZE5hbWUsIGphdmFQcm9qZWN0LCBhZGFwdG9yKTsKLQkJCWZvdW5kID0gKElKYXZhRWxlbWVudCkgcmVzdWx0WzBdOwotCQkJcmVzb2x2ZWROYW1lID0gKFN0cmluZykgcmVzdWx0WzFdOwotCQl9IGVsc2UKLQkJCWZvdW5kID0gZmluZEphdmFFbGVtZW50KHF1YWxpZmllZE5hbWUsIGphdmFQcm9qZWN0LCBhZGFwdG9yKTsKLQkJaWYgKGZvdW5kICE9IG51bGwpCi0JCQlpZiAoZm91bmQgaW5zdGFuY2VvZiBJQ2xhc3NGaWxlKQotCQkJCXJldHVybiAoKElDbGFzc0ZpbGUpIGZvdW5kKS5nZXRUeXBlKCk7Ci0JCQllbHNlIGlmIChmb3VuZCBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IGZvdW5kQ1UgPSAoSUNvbXBpbGF0aW9uVW5pdCkgZm91bmQ7Ci0JCQkJLy8gc3RyaXAgdGhlICIuamF2YSIsIGxpZnRlZCBmcm9tIENvbXBpbGF0aW9uVW5pdC5nZXRNYWluVHlwZU5hbWUoKQotCQkJCVN0cmluZyBjdU1haW5UeXBlTmFtZSA9IGZvdW5kQ1UuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQljdU1haW5UeXBlTmFtZSA9IGN1TWFpblR5cGVOYW1lLnN1YnN0cmluZygwLCBjdU1haW5UeXBlTmFtZS5sZW5ndGgoKSAtIDUpOwotCQkJCXJldHVybiBmb3VuZENVLmdldFR5cGUoY3VNYWluVHlwZU5hbWUpOwotCQkJfSBlbHNlIGlmIChmb3VuZCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQkJSVR5cGUgdHlwZSA9ICgoSVR5cGUpIGZvdW5kKTsKLQkJCQlpZiAoIXR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJykuZXF1YWxzKHJlc29sdmVkTmFtZSkpIHsKLQkJCQkJLy8gSSBkb24ndCBrbm93IHdoeSB0aGlzIGlzIGhlcmUuIFNvbWV0aW1lIGluIHRoZSBwYXN0IGZvciBhbiBpbm5lciBjbGFzcywgdGhlCi0JCQkJCS8vIElUeXBlIHJldHVybmVkIHdhcyBmb3IgdGhlIG91dGVyIGNsYXNzLCBzbyB5b3Ugd291bGQgbmVlZCB0byBzZWFyY2ggYWdhaW4KLQkJCQkJLy8gZm9yIHRoZSBpbm5lciBjbGFzcyBhZ2FpbnN0IHRoZSBvdXRlciBjbGFzcy4gSSBkb24ndCBrbm93IGhvdyB0aGlzIG5vdyBjYW4KLQkJCQkJLy8gaGFwcGVuLiBUaGUgY29kZSBmb2xsb3dlZCBhYm92ZSBpcyBleHRyZW1lbGx5IGNvbXBsaWNhdGVkLCBlc3BlY2lhbGx5IHdoZW4KLQkJCQkJLy8gaXQgaXMgYW4gaW5uZXIgY2xhc3MgdGhhdCBpc24ndCBmdWxseS1xdWFsaWZpZWQgdGhhdCBpcyBpbnNpZGUgYSBzb3VyY2UgZmlsZS4KLQkJCQkJLy8gSXQgZ29lcyB0aHJvdWdoIHNvbWUgZ3lyYXRpb25zIGZvciB0aGF0LiBJIGRvbid0IGtub3cgd2hhdCBpdCB3b3VsZAotCQkJCQkvLyByZXR1cm4gaW4gdGhhdCBjYXNlLiBCdXQganVzdCBpbiBjYXNlLCB0aGUgdGVzdCBpcyBoZXJlIHRvIGJlIHNhZmUuCi0JCQkJCWludCBpbmRleCA9IHJlc29sdmVkTmFtZS5sYXN0SW5kZXhPZignJCcpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpbmRleCA+IC0xKQotCQkJCQkJcmV0dXJuIHR5cGUuZ2V0VHlwZShyZXNvbHZlZE5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgcmVzb2x2ZWROYW1lLmxlbmd0aCgpKSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiB0eXBlOwotCQkJCX0gZWxzZQotCQkJCQlyZXR1cm4gdHlwZTsKLQkJCX0KLQkJCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVR5cGUgZmluZFR5cGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgcXVhbGlmaWVkVHlwZU5hbWUsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQl0cnkgewotCQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUocGFja2FnZU5hbWUsIHF1YWxpZmllZFR5cGVOYW1lLnJlcGxhY2UoJyQnLCAnLicpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0xvb2tpbmdfVXBfVHlwZV9FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgcGFja2FnZU5hbWUgKyAiLiIgKyBxdWFsaWZpZWRUeXBlTmFtZSwgam1lLmdldE1lc3NhZ2UoKX0pKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCA9ICJFcnJvciBsb29raW5nIHVwIHR5cGU6ICIKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUNsYXNzSkRPTUFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YUNsYXNzSkRPTUFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5ZmZiMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFDbGFzc0pET01BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuVGltZXJUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5VSUNvbnRleHREZXRlcm1pbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci0KLQotcHVibGljIGNsYXNzIEphdmFDbGFzc0pET01BZGFwdG9yIGV4dGVuZHMgSkRPTUFkYXB0b3IgaW1wbGVtZW50cyBJSmF2YUNsYXNzQWRhcHRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSkVDVF9UWVBFX05BTUUgPSAiamF2YS5sYW5nLk9iamVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogU3RlcCBpZHMgdXNlZCBmb3IgVGltZXJUZXN0cyBvZiBwZXJmb3JtYW5jZSB0ZXN0aW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkxFQ1RfQ0xBU1MgPSAiUmVmbGVjdCBKRE9NIENsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkxFQ1RfTUVUSE9EUyA9ICJSZWZsZWN0IGFsbCBKRE9NIG1ldGhvZHMgZm9yIGEgY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGTEVDVF9GSUVMRFMgPSAiUmVmbGVjdCBhbGwgSkRPTSBmaWVsZHMgZm9yIGEgY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHJvdGVjdGVkIElUeXBlIHNvdXJjZVR5cGUgPSBudWxsOwotCXByb3RlY3RlZCBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgTWFwIHR5cGVSZXNvbHV0aW9uQ2FjaGUgPSBuZXcgSGFzaE1hcCgyNSk7Ci0JcHJpdmF0ZSBib29sZWFuIGhhc1JlZmxlY3RlZEZpZWxkcywgaXNSZWZsZWN0aW5nRmllbGRzOwotCXByaXZhdGUgYm9vbGVhbiBoYXNSZWZsZWN0ZWRNZXRob2RzLCBpc1JlZmxlY3RpbmdNZXRob2RzOwotCQotCXB1YmxpYyBKYXZhQ2xhc3NKRE9NQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIElKYXZhUHJvamVjdCB3b3JraW5nUHJvamVjdCwgSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSBpbkZhY3RvcnkpIHsKLQkJc3VwZXIodGFyZ2V0LCB3b3JraW5nUHJvamVjdCk7Ci0JCXNldEFkYXB0ZXJGYWN0b3J5KGluRmFjdG9yeSk7Ci0JfQotCQotCXByaXZhdGUgTWFwIGV4aXN0aW5nRmllbGRzID0gbmV3IEhhc2hNYXAoKTsgCi0JLyoKLQkgKiBhZGRGaWVsZHMgLSByZWZsZWN0IG91ciBmaWVsZHMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaWVsZHMoKSB7Ci0KLQkJLy8gVGhlIGFsZ29yaXRobSB3ZSB3aWxsIHVzZSBpczoKLQkJLy8gMSkgUGFzcyB0aHJvdWdoIHRoZSBJRmllbGQncyBvZiB0aGlzIGNsYXNzCi0JCS8vICAgIGEpIElmIGl0IGlzIGluIGV4aXN0aW5nRmllbGRzLCB0aGVuIGFkZCB0byBuZXdFeGlzdGluZyB0aGUgZW50cnkgZnJvbQotCQkvLyAgICAgICBvbGRFeGlzdGluZyAoZGVsZXRpbmcgZnJvbSBvbGRFeGlzdGluZyBhdCB0aGUgc2FtZSB0aW1lKSwgYW5kIGZsdXNoIHRoZSBmaWVsZC4gVGhpcyBpcyBzbyBuZXh0IHdlIHJlLWdldCBhbnkgY2hhbmdlZCBwYXJ0cyBvZiBpdC4KLQkJLy8gICAgYikgZWxzZSBub3QgZXhpc3RpbmcsIHRoZW4gY3JlYXRlIG5ldyBmaWVsZCBhbmQgYWRkIHRvIHRoZSBuZXcgZmllbGRzIGxpc3QuCi0JCS8vIDIpIFJlbW92ZSBmcm9tIHRoZSBmaWVsZHMgbGlzdCBhbnkgc3RpbGwgbGVmdCBpbiBvbGRFeGlzdGluZy4gVGhlc2UgYXJlIG9uZXMgdGhhdCBubyBsb25nZXIgZXhpc3QuCi0JCS8vIDMpIEFkZCBhbGwgb2YgdGhlIG5ld3Mgb25lcyB0byB0aGUgZmllbGRzLgotCQkvLyAgICAgICAKLQkJSUZpZWxkW10gZmllbGRzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpZWxkcyA9IGdldFNvdXJjZVR5cGUoKS5nZXRGaWVsZHMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSwgTGV2ZWwuV0FSTklORyk7Ci0JCQlyZXR1cm4gZmFsc2U7CQotCQl9Ci0JCVhNSVJlc291cmNlIHJlc291cmNlID0gKFhNSVJlc291cmNlKSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5lUmVzb3VyY2UoKTsJCQotCQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0JCUphdmFGaWVsZEpET01BZGFwdG9yIGFkYXB0ZXIgPSBudWxsOwotCQlNYXAgbmV3RXhpc3RpbmcgPSBuZXcgSGFzaE1hcChmaWVsZHMubGVuZ3RoKTsKLQkJTGlzdCBuZXdGaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmllbGQgaWZpZWxkID0gZmllbGRzW2ldOwotCQkJZmllbGQgPSAoRmllbGQpIGV4aXN0aW5nRmllbGRzLnJlbW92ZShpZmllbGQpOwkvLyBHZXQgdGhlIGV4aXN0aW5nIGZpZWxkICh3aGljaCBpcyB0aGUgdmFsdWUpIGZyb20gdGhlIGNvbGxlY3Rpb24ga2V5ZWQgYnkgSUZpZWxkLgotCQkJaWYgKGZpZWxkICE9IG51bGwpIHsKLQkJCQkvLyBJdCBpcyBhbiBleGlzdGluZyBtZXRob2QuIFNvIGp1c3QgcHV0IG92ZXIgdG8gbmV3RXhpc3RpbmcuIFRoZW4gZmx1c2ggaXQuCi0JCQkJbmV3RXhpc3RpbmcucHV0KGlmaWVsZCwgZmllbGQpOwotCQkJCS8vIFNpbmNlIHRoaXMgaXMgYSBuZXcgbWV0aG9kLCBpdCBpcyBub3QgYXR0YWNoZWQgdG8gYSByZXNvdXJjZSwgc28gd2UgbmVlZCB0byBleHBsaWNpdGx5IGNyZWF0ZSB0aGUgYWRhcHRlci4KLQkJCQlhZGFwdGVyID0gKEphdmFGaWVsZEpET01BZGFwdG9yKSBFY29yZVV0aWwuZ2V0RXhpc3RpbmdBZGFwdGVyKGZpZWxkLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCQkJYWRhcHRlciA9IChKYXZhRmllbGRKRE9NQWRhcHRvcikgZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdE5ldyhmaWVsZCwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJCWVsc2UKLQkJCQkJYWRhcHRlci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24odHJ1ZSk7Ci0JCQkJYWRhcHRlci5zZXRTb3VyY2VGaWVsZChpZmllbGQpOwkvLyBHaXZlIGl0IHRoaXMgbmV3IElGaWVsZAotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdCBpcyBhIG5ldyBtZXRob2QuIENyZWF0ZSB0aGUgbmV3IG1ldGhvZCwgYWRkIHRvIG5ld0V4aXN0aW5nLCBhbmQgYWRkIHRvIG5ld01ldGhvZHMgbGlzdC4KLQkJCQlmaWVsZCA9IGNyZWF0ZUphdmFGaWVsZChpZmllbGQsIHJlc291cmNlKTsKLQkJCQluZXdFeGlzdGluZy5wdXQoaWZpZWxkLCBmaWVsZCk7CQkJCQotCQkJCW5ld0ZpZWxkcy5hZGQoZmllbGQpOwotCQkJCWFkYXB0ZXIgPSAoSmF2YUZpZWxkSkRPTUFkYXB0b3IpIGdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHROZXcoZmllbGQsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlhZGFwdGVyLnNldFNvdXJjZUZpZWxkKGlmaWVsZCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUJhc2ljRUxpc3QgZmllbGRzTGlzdCA9IChCYXNpY0VMaXN0KSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRGaWVsZHNHZW4oKTsKLQkJaWYgKCFleGlzdGluZ0ZpZWxkcy5pc0VtcHR5KCkpIHsKLQkJCS8vIE5vdyBhbnkgc3RpbGwgbGVmdCBpbiBvbGQgZXhpc3RpbmcgYXJlIGRlbGV0ZWQuIFNvIHdlIG1ha2UgdGhlbSBwcm94aWVzIGFuZCB0aGVuIHJlbW92ZSB0aGVtIGZyb20gZmllbGRzIGxpc3QuCQkJCi0JCQlVUkkgYmFzZVVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJQ29sbGVjdGlvbiB0b0RlbGV0ZSA9IGV4aXN0aW5nRmllbGRzLnZhbHVlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdHIgPSB0b0RlbGV0ZS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJCUludGVybmFsRU9iamVjdCBtID0gKEludGVybmFsRU9iamVjdCkgaXRyLm5leHQoKTsKLQkJCQlTdHJpbmcgaWQgPSByZXNvdXJjZS5nZXRJRChtKTsKLQkJCQlpZiAoaWQgIT0gbnVsbCkKLQkJCQkJbS5lU2V0UHJveHlVUkkoYmFzZVVSSS5hcHBlbmRGcmFnbWVudChpZCkpOwotCQkJfQotCQkJZmllbGRzTGlzdC5yZW1vdmVBbGwodG9EZWxldGUpOwotCQl9Ci0JCQotCQlpZiAoIW5ld0ZpZWxkcy5pc0VtcHR5KCkpIHsKLQkJCS8vIE5vdyBhZGQgaW4gdGhlIG5ld3Mgb25lcwotCQkJZmllbGRzTGlzdC5hZGRBbGxVbmlxdWUobmV3RmllbGRzKTsKLQkJfQotCQkKLQkJLy8gRmluYWxseSBzZXQgY3VycmVudCBleGlzdGluZyB0byB0aGUgbmV3IG1hcCB3ZSBjcmVhdGVkLgotCQlleGlzdGluZ0ZpZWxkcyA9IG5ld0V4aXN0aW5nOwotCQlyZXR1cm4gdHJ1ZTsJCQkKLQl9Ci0JCi0JcHJpdmF0ZSBNYXAgZXhpc3RpbmdNZXRob2RzID0gbmV3IEhhc2hNYXAoKTsgCi0JLyoKLQkgKiBhZGRNZXRob2RzIC0gcmVmbGVjdCBvdXIgbWV0aG9kcy4gTWVyZ2UgaW4gd2l0aCB0aGUgcHJldmlvdXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkTWV0aG9kcygpIHsKLQkJLy8gVGhlIGFsZ29yaXRobSB3ZSB3aWxsIHVzZSBpczoKLQkJLy8gMSkgUGFzcyB0aHJvdWdoIHRoZSBJTWV0aG9kJ3Mgb2YgdGhpcyBjbGFzcwotCQkvLyAgICBhKSBJZiBpdCBpcyBpbiBleGlzdGluZ01ldGhvZHMsIHRoZW4gYWRkIHRvIG5ld0V4aXN0aW5nIHRoZSBlbnRyeSBmcm9tCi0JCS8vICAgICAgIG9sZEV4aXN0aW5nIChkZWxldGluZyBmcm9tIG9sZEV4aXN0aW5nIGF0IHRoZSBzYW1lIHRpbWUpLCBhbmQgZmx1c2ggdGhlIG1ldGhvZC4gVGhpcyBpcyBzbyBuZXh0IHdlIHJlLWdldCBhbnkgY2hhbmdlZCBwYXJ0cyBvZiBpdC4KLQkJLy8gICAgYikgZWxzZSBub3QgZXhpc3RpbmcsIHRoZW4gY3JlYXRlIG5ldyBtZXRob2QgYW5kIGFkZCB0byB0aGUgbmV3IG1ldGhvZHMgbGlzdC4KLQkJLy8gMikgUmVtb3ZlIGZyb20gdGhlIG1ldGhvZHMgbGlzdCBhbnkgc3RpbGwgbGVmdCBpbiBvbGRFeGlzdGluZy4gVGhlc2UgYXJlIG9uZXMgdGhhdCBubyBsb25nZXIgZXhpc3QuCi0JCS8vIDMpIEFkZCBhbGwgb2YgdGhlIG5ld3Mgb25lcyB0byB0aGUgbWV0aG9kcy4KLQkJLy8gICAgICAgCi0JCUlNZXRob2RbXSBtZXRob2RzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1ldGhvZHMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0TWV0aG9kcygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlLCBMZXZlbC5XQVJOSU5HKTsKLQkJCXJldHVybiBmYWxzZTsJCi0JCX0KLQkJWE1JUmVzb3VyY2UgcmVzb3VyY2UgPSAoWE1JUmVzb3VyY2UpIGdldEphdmFDbGFzc1RhcmdldCgpLmVSZXNvdXJjZSgpOwkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlKYXZhTWV0aG9kSkRPTUFkYXB0b3IgYWRhcHRlciA9IG51bGw7Ci0JCU1hcCBuZXdFeGlzdGluZyA9IG5ldyBIYXNoTWFwKG1ldGhvZHMubGVuZ3RoKTsKLQkJTGlzdCBuZXdNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLQkJCUlNZXRob2QgaW0gPSBtZXRob2RzW2ldOwotCQkJbWV0aG9kID0gKE1ldGhvZCkgZXhpc3RpbmdNZXRob2RzLnJlbW92ZShpbSk7CS8vIEdldCB0aGUgZXhpc3RpbmcgbWV0aG9kICh3aGljaCBpcyB0aGUgdmFsdWUpIGZyb20gdGhlIGNvbGxlY3Rpb24ga2V5ZWQgYnkgSU1ldGhvZC4KLQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCS8vIEl0IGlzIGFuIGV4aXN0aW5nIG1ldGhvZC4gU28ganVzdCBwdXQgb3ZlciB0byBuZXdFeGlzdGluZy4gVGhlbiBmbHVzaCBpdC4KLQkJCQluZXdFeGlzdGluZy5wdXQoaW0sIG1ldGhvZCk7Ci0JCQkJYWRhcHRlciA9IChKYXZhTWV0aG9kSkRPTUFkYXB0b3IpIHJldHJpZXZlQWRhcHRvckZyb20obWV0aG9kKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKHRydWUpOwotCQkJCQlhZGFwdGVyLnNldFNvdXJjZU1ldGhvZChpbSk7CS8vIEdpdmUgaXQgdGhpcyBuZXcgSU1ldGhvZAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSXQgaXMgYSBuZXcgbWV0aG9kLiBDcmVhdGUgdGhlIG5ldyBtZXRob2QsIGFkZCB0byBuZXdFeGlzdGluZywgYW5kIGFkZCB0byBuZXdNZXRob2RzIGxpc3QuCi0JCQkJbWV0aG9kID0gY3JlYXRlSmF2YU1ldGhvZChpbSwgcmVzb3VyY2UpOwotCQkJCW5ld0V4aXN0aW5nLnB1dChpbSwgbWV0aG9kKTsJCQkJCi0JCQkJbmV3TWV0aG9kcy5hZGQobWV0aG9kKTsKLQkJCQkvLyBTaW5jZSB0aGlzIGlzIGEgbmV3IG1ldGhvZCwgaXQgaXMgbm90IGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UsIHNvIHdlIG5lZWQgdG8gZXhwbGljaXRseSBjcmVhdGUgdGhlIGFkYXB0ZXIuCi0JCQkJYWRhcHRlciA9IChKYXZhTWV0aG9kSkRPTUFkYXB0b3IpIGdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHROZXcobWV0aG9kLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJYWRhcHRlci5zZXRTb3VyY2VNZXRob2QobWV0aG9kc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUJhc2ljRUxpc3QgbWV0aG9kc0xpc3QgPSAoQmFzaWNFTGlzdCkgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0TWV0aG9kc0dlbigpOwotCQlpZiAoIWV4aXN0aW5nTWV0aG9kcy5pc0VtcHR5KCkpIHsKLQkJCS8vIE5vdyBhbnkgc3RpbGwgbGVmdCBpbiBvbGQgZXhpc3RpbmcgYXJlIGRlbGV0ZWQuIFNvIHdlIG1ha2UgdGhlbSBwcm94aWVzIGFuZCB0aGVuIHJlbW92ZSB0aGVtIGZyb20gbWV0aG9kcyBsaXN0LgotCQkJVVJJIGJhc2VVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCUNvbGxlY3Rpb24gdG9EZWxldGUgPSBleGlzdGluZ01ldGhvZHMudmFsdWVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHRvRGVsZXRlLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG0gPSAoSW50ZXJuYWxFT2JqZWN0KSBpdHIubmV4dCgpOwotCQkJCVN0cmluZyBpZCA9IHJlc291cmNlLmdldElEKG0pOwotCQkJCWlmIChpZCAhPSBudWxsKQotCQkJCQltLmVTZXRQcm94eVVSSShiYXNlVVJJLmFwcGVuZEZyYWdtZW50KGlkKSk7Ci0JCQl9Ci0JCQltZXRob2RzTGlzdC5yZW1vdmVBbGwodG9EZWxldGUpOwotCQl9Ci0JCQotCQlpZiAoIW5ld01ldGhvZHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBOb3cgYWRkIGluIHRoZSBuZXdzIG9uZXMKLQkJCW1ldGhvZHNMaXN0LmFkZEFsbFVuaXF1ZShuZXdNZXRob2RzKTsKLQkJfQotCQkKLQkJLy8gRmluYWxseSBzZXQgY3VycmVudCBleGlzdGluZyB0byB0aGUgbmV3IG1hcCB3ZSBjcmVhdGVkLgotCQlleGlzdGluZ01ldGhvZHMgPSBuZXdFeGlzdGluZzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIENsZWFyIHNvdXJjZSBUeXBlIDsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclNvdXJjZSgpIHsKLQkJc291cmNlVHlwZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHJlZmxlY3RlZCBmaWVsZHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaEZpZWxkcygpIHsKLQkJLy8gRmlyc3QgdHVybiB0aGVtIGFsbCBpbnRvIHByb3hpZXMgc28gdGhhdCBhbnkgaG9sZGVycyB3aWxsIHJlLXJlc29sdmUgdG8gbWF5YmUgdGhlIG5ldyBvbmUgaWYgY2xhc3MgY29tZXMgYmFjay4KLQkJZXhpc3RpbmdGaWVsZHMuY2xlYXIoKTsKLQkJWE1JUmVzb3VyY2UgcmVzID0gKFhNSVJlc291cmNlKSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5lUmVzb3VyY2UoKTsKLQkJVVJJIGJhc2VVUkkgPSByZXMuZ2V0VVJJKCk7Ci0JCUxpc3QgZmllbGRzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RmllbGRzR2VuKCk7Ci0JCWludCBtc2l6ZSA9IGZpZWxkcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbXNpemU7IGkrKykgewotCQkJSW50ZXJuYWxFT2JqZWN0IGYgPSAoSW50ZXJuYWxFT2JqZWN0KSBmaWVsZHMuZ2V0KGkpOwotCQkJU3RyaW5nIGlkID0gcmVzLmdldElEKGYpOwotCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJZi5lU2V0UHJveHlVUkkoYmFzZVVSSS5hcHBlbmRGcmFnbWVudChpZCkpOwotCQl9Ci0JCWZpZWxkcy5jbGVhcigpOwkvLyBOb3cgd2UgY2FuIGNsZWFyIGl0LgotCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCS8qKgotCSAqIENsZWFyIHRoZSBpbXBsZW1lbnRzIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hJbXBsZW1lbnRzKCkgewotCQlnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiBDbGVhciB0aGUgcmVmbGVjdGVkIG1ldGhvZHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaE1ldGhvZHMoKSB7Ci0JCS8vIEZpcnN0IHR1cm4gdGhlbSBhbGwgaW50byBwcm94aWVzIHNvIHRoYXQgYW55IGhvbGRlcnMgd2lsbCByZS1yZXNvbHZlIHRvIG1heWJlIHRoZSBuZXcgb25lIGlmIGNsYXNzIGNvbWVzIGJhY2suCi0JCWV4aXN0aW5nTWV0aG9kcy5jbGVhcigpOwotCQlYTUlSZXNvdXJjZSByZXMgPSAoWE1JUmVzb3VyY2UpIGdldEphdmFDbGFzc1RhcmdldCgpLmVSZXNvdXJjZSgpOwotCQlVUkkgYmFzZVVSSSA9IHJlcy5nZXRVUkkoKTsKLQkJTGlzdCBtZXRob2RzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0TWV0aG9kc0dlbigpOwotCQlpbnQgbXNpemUgPSBtZXRob2RzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtc2l6ZTsgaSsrKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgbSA9IChJbnRlcm5hbEVPYmplY3QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJU3RyaW5nIGlkID0gcmVzLmdldElEKG0pOwotCQkJaWYgKGlkICE9IG51bGwpCi0JCQkJbS5lU2V0UHJveHlVUkkoYmFzZVVSSS5hcHBlbmRGcmFnbWVudChpZCkpOwotCQl9Ci0JCW1ldGhvZHMuY2xlYXIoKTsJLy8gTm93IHdlIGNhbiBjbGVhciBpdC4KLQkJcmV0dXJuIHRydWU7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoTW9kaWZpZXJzKCkgewotCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRBYnN0cmFjdChmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRGaW5hbChmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRQdWJsaWMoZmFsc2UpOwotCQlqYXZhQ2xhc3NUYXJnZXQuc2V0S2luZChUeXBlS2luZC5VTkRFRklORURfTElURVJBTCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaElubmVyQ2xhc3NlcygpIHsKLQkJZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoQW5kQ2xlYXJDYWNoZWRNb2RlbE9iamVjdDsKLQkKLQkvKioKLQkgKiBDbGVhciB0aGUgcmVmbGVjdGVkIHZhbHVlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaFJlZmxlY3RlZFZhbHVlcyhib29sZWFuIGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQkJZmx1c2hBbmRDbGVhckNhY2hlZE1vZGVsT2JqZWN0ID0gY2xlYXJDYWNoZWRNb2RlbE9iamVjdDsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qCi0JICogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIGEgcmVmbGVjdCBpZiBhIHJlYWwgZmx1c2ggaXMgbmVlZGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBmbHVzaE5vdygpIHsKLQkJaWYgKGZsdXNoQW5kQ2xlYXJDYWNoZWRNb2RlbE9iamVjdCkKLQkJCXNldFNvdXJjZVR5cGUobnVsbCk7Ci0JCXR5cGVSZXNvbHV0aW9uQ2FjaGUuY2xlYXIoKTsKLQkJZmx1c2hNb2RpZmllcnMoKTsKLQkJZmx1c2hTdXBlcigpOwotCQlmbHVzaEltcGxlbWVudHMoKTsKLQkJaWYgKGZsdXNoQW5kQ2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCQkJLy8gRG9uJ3QgZmx1c2ggdGhlc2UgeWV0LiBXZSB3aWxsIHRyeSB0byByZXVzZSB0aGVtIG9uIHRoZSBuZXh0IHJlZmx1c2guIElmIGNsZWFyIG1vZGVsIHRvbywgdGhlbiBmbHVzaCB0aGVtLiBUaGlzIHVzdWFsbHkgbWVhbnMgY2xhc3MgaGFzIGJlZW4gZGVsZXRlZCwgc28gd2h5IGtlZXAgdGhlbSBhcm91bmQuCi0JCQlmbHVzaE1ldGhvZHMoKTsKLQkJCWZsdXNoRmllbGRzKCk7Ci0JCX0KLQkJLy8gRXZlbiBpZiB3ZSBkaWRuJ3QgZmx1c2ggdGhlIGZpZWxkcy9tZXRob2RzLCB3ZSBkbyBuZWVkIHRvIG1hcmsgYXMgbm90IHJlZmxlY3RlZCBzbyBvbiBuZXh0IHVzYWdlIHdlIHdpbGwgbWVyZ2UgaW4gdGhlIGNoYW5nZXMuCi0JCWhhc1JlZmxlY3RlZE1ldGhvZHMgPSBmYWxzZTsKLQkJaGFzUmVmbGVjdGVkRmllbGRzID0gZmFsc2U7Ci0JCQotCQlmbHVzaElubmVyQ2xhc3NlcygpOwotCQlmbHVzaEFuZENsZWFyQ2FjaGVkTW9kZWxPYmplY3QgPSBmYWxzZTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjcG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGJvb2xlYW4gaXNFeGlzdGluZykgewotCQlnZXRKYXZhQ2xhc3NUYXJnZXQoKS5zZXRSZWZsZWN0ZWQoZmFsc2UpOwotCQlzdXBlci5wb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShpc0V4aXN0aW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHN1cGVydHlwZSB0byBiZSBudWxsLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoU3VwZXIoKSB7Ci0JCUxpc3QgdGFyZ2V0U3VwZXJzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkucHJpbUdldEVTdXBlclR5cGVzKCk7Ci0JCXRhcmdldFN1cGVycy5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHJvdGVjdGVkIEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0JLyoqCi0JICogZ2V0QmluYXJ5VHlwZSAtIHJldHVybiB0aGUgSVR5cGUgd2hpY2ggZGVzY3JpYmVzIG91ciBleGlzdGluZyBKYXZhIGNsYXNzIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgZ2V0QmluYXJ5VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QmluYXJ5VHlwZSgoKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCkpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JfQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFyZ2V0IHR5cGVkIHRvIGEgSmF2YUNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3NJbXBsIGdldEphdmFDbGFzc1RhcmdldCgpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3NJbXBsKSBnZXRUYXJnZXQoKTsKLQl9Ci0JcHVibGljIE9iamVjdCBnZXRSZWZsZWN0aW9uU291cmNlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlVHlwZSgpOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjaGFzUmVmbGVjdGlvblNvdXJjZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZVR5cGUgIT0gbnVsbDsKLSAgICB9Ci0JLyoqCi0JICogZ2V0U291cmNlVHlwZSAtIHJldHVybiB0aGUgSVR5cGUgd2hpY2ggZGVzY3JpYmVzIG91ciBleGlzdGluZyBKYXZhIGNsYXNzIG9yIHNvdXJjZSBmaWxlCi0JICovCi0JcHVibGljIElUeXBlIGdldFNvdXJjZVR5cGUoKSB7Ci0JCWlmIChzb3VyY2VUeXBlID09IG51bGwgfHwgZmx1c2hBbmRDbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JCQlKYXZhQ2xhc3NJbXBsIGphdmFDbGFzcyA9IChKYXZhQ2xhc3NJbXBsKSBnZXRUYXJnZXQoKTsKLQkJCXNvdXJjZVR5cGUgPSBKRE9NU2VhcmNoSGVscGVyLmZpbmRUeXBlKGphdmFDbGFzcy5nZXRKYXZhUGFja2FnZSgpLmdldE5hbWUoKSwgamF2YUNsYXNzLnByaW1HZXROYW1lKCksIGdldFNvdXJjZVByb2plY3QoKSk7Ci0JCQkvKgotCQkJICogSWYgdGhlIHNvdXJjZVR5cGUgd2FzIGZvdW5kIGFuZCB3ZSBhcmUgbm90IGluIHRoZSBtaWRkbGUgb2YKLQkJCSAqIHJlZmxlY3RpbmcgaXQgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBoYXNSZWZsZWN0ZWQKLQkJCSAqIGlzIHNldCBiYWNrIHRvIGZhbHNlLiAgSWYgdGhpcyBpcyBub3QgZG9uZSB0aGVuIHRoZSBzeXN0ZW0KLQkJCSAqIGFzc3VtZXMgdGhhdCB0aGUgY29udGVudCBpbiB0aGUgdGFyZ2V0IG1vZGVsIG9iamVjdCBoYXMgYmVlbgotCQkJICogcmVmbGVjdGVkIGZyb20gdGhpcyBmb3VuZCBzb3VyY2VUeXBlIHdoaWNoIGlzIG5vdCB0aGUgY2FzZS4KLQkJCSAqLwotCQkJaWYgKGhhc1ZhbGlkUmVmbGVjdGlvbigpKQotCQkJCWZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbihmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZVR5cGU7Ci0JfQotCS8qKgotCSAqIGdldFNvdXJjZVR5cGUgLSByZXR1cm4gdGhlIElUeXBlIHdoaWNoIGRlc2NyaWJlcyBvdXIgZXhpc3RpbmcgSmF2YSBjbGFzcyBvciBzb3VyY2UgZmlsZQotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlVHlwZSgpOwotCX0KLQlwcm90ZWN0ZWQgTWFwIGdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSB7Ci0JCXJldHVybiB0eXBlUmVzb2x1dGlvbkNhY2hlOwotCX0KLQkvKioKLQkgKiBnZXRWYWx1ZUluIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVJbihFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBhdHRyaWJ1dGUpIHsKLQkJLy8gQXQgdGhpcyBwb2ludCwgdGhpcyBhZGFwdGVyIGRvZXMgbm90IGR5bmFtaWNhbGx5IGNvbXB1dGUgYW55IHZhbHVlcywKLQkJLy8gYWxsIHZhbHVlcyBhcmUgcHVzaGVkIGJhY2sgaW50byB0aGUgdGFyZ2V0IG9uIHRoZSBpbml0aWFsIGNhbGwuCi0JCXJldHVybiBzdXBlci5nZXRWYWx1ZUluKG9iamVjdCwgYXR0cmlidXRlKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHNvdXJjZVR5cGUgaXMgbnVsbCBvciBpZgotCSAqIGl0IGlzIGEgYmluYXJ5IHR5cGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTb3VyY2VUeXBlRnJvbUJpbmFyeSgpIHsKLQkJaWYgKGdldFNvdXJjZVR5cGUoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOyAvL211c3QgYmUgbmV3PwotCQlyZXR1cm4gZ2V0U291cmNlVHlwZSgpLmlzQmluYXJ5KCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHJlZmxlY3RKYXZhQ2xhc3MoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJSVR5cGUgdHlwZSA9IEpET01TZWFyY2hIZWxwZXIuZmluZFR5cGUocXVhbGlmaWVkTmFtZSwgdHJ1ZSwgZ2V0U291cmNlUHJvamVjdCgpLCB0aGlzKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkKLQkJCXJldHVybiByZWZsZWN0SmF2YUNsYXNzKHR5cGUpOwotCQllbHNlCi0JCQlyZXR1cm4gY3JlYXRlSmF2YUNsYXNzUmVmKHF1YWxpZmllZE5hbWUpOwotCX0KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIHJlZmxlY3RKYXZhQ2xhc3MoSVR5cGUgYVR5cGUpIHsKLQkJaWYgKGFUeXBlICE9IG51bGwpIHsKLQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoYVR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIChFT2JqZWN0KSBnZXRUYXJnZXQoKSk7Ci0JCQlpZiAoamF2YUNsYXNzICE9IG51bGwpIHsKLQkJCQlKYXZhQ2xhc3NKRE9NQWRhcHRvciBhZGFwdG9yID0gKEphdmFDbGFzc0pET01BZGFwdG9yKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihqYXZhQ2xhc3MuZUFkYXB0ZXJzKCksIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCQlpZiAoYWRhcHRvciAhPSBudWxsKQotCQkJCQlhZGFwdG9yLnNldFNvdXJjZVR5cGUoYVR5cGUpOwotCQkJfQotCQkJcmV0dXJuIGphdmFDbGFzczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogcmVmbGVjdFZhbHVlcyAtIHRlbXBsYXRlIG1ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkZSB0byBwdW1wIHZhbHVlcyBpbnRvIHRhcmdldC4KLQkgKiBvbiBlbnRyeTogbmFtZSwgY29udGFpbmluZyBwYWNrYWdlIChhbmQgcXVhbGlmaWVkIG5hbWUpLCBhbmQgZG9jdW1lbnQgbXVzdCBiZSBzZXQuCi0JICogUmV0dXJuIHRydWUgYWx3YXlzIGFuZCB0aGUgSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIgd2lsbCBmbHVzaCB3aXRoIHRoZSB0eXBlIGNhbgotCSAqIGJlIGZvdW5kIGFnYWluLiAgSW4gaGVhZGxlc3MgbW9kZSwgcmV0dXJuIHRydWUgb25seSBpZiB0aGUgdHlwZSBpcyBmb3VuZC4gIFRoaXMgaXMKLQkgKiBuZWVkZWQgYmVjYXVjZSBtb3N0IGhlYWRsZXNzIHRhc2tzIGFyZSBkb25lIHVuZGVyIG9uZSBvcGVyYXRpb24gYW5kIHRoZSBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplcgotCSAqIG1heSBub3QgaGF2ZSBhIGNoYW5jZSB0byBmbHVzaCBhIGJhZCByZWZsZWN0aW9uIGJlZm9yZSB0aGUgcmVhbCB0eXBlIG5lZWRzIHRvIGJlIGZvdW5kIGFuZCBjYW4gYmUgZm91bmQuCi0JICogSmF2YUNsYXNzIGFkYXB0b3I6Ci0JICogLSBzZXQgbW9kaWZpZXJzCi0JICogLSBzZXQgbmFtZQotCSAqIC0gc2V0IHJlZmVyZW5jZSB0byBzdXBlcgotCSAqIC0gY3JlYXRlIG1ldGhvZHMKLQkgKiAtIGNyZWF0ZSBmaWVsZHMKLQkgKiAtIGFkZCBpbXBvcnRzCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpIHsKLQkJaWYgKGhhc0ZsdXNoZWQpIHsKLQkJCS8vIFdlIGZsdXNoIHNvbWV0aW1lIGluIHRoZSBwYXN0IHNpbmNlIGxhc3QgcmVmbGVjdC4gU28gbm93IGRvIHRoZSBhY3R1YWwgZmx1c2guCi0JCQlmbHVzaE5vdygpOwotCQl9Ci0JCXN1cGVyLnJlZmxlY3RWYWx1ZXMoKTsKLQkJYm9vbGVhbiBpc0hlYWRsZXNzID0gVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5nZXRDdXJyZW50Q29udGV4dCgpID09IFVJQ29udGV4dERldGVybWluYXRpb24uSEVBRExFU1NfQ09OVEVYVDsKLQkJaWYgKGNhblJlZmxlY3QoKSkgewotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRDdW11bGF0aXZlU3RlcChSRUZMRUNUX0NMQVNTKTsKLQkJCXRyeSB7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldFNvdXJjZVR5cGUoKS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQlib29sZWFuIGlzV0MgPSBjdSAhPSBudWxsID8gY3UuaXNXb3JraW5nQ29weSgpIDogZmFsc2U7Ci0JCQkJSVJlc291cmNlIHJlcyA9IGlzV0MgPyBnZXRTb3VyY2VUeXBlKCkuZ2V0UmVzb3VyY2UoKSA6IG51bGw7Ci0JCQkJLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBwaHlzaWNhbCBjbGFzc2VzLiBJZiBzdGlsbCBqdXN0IGluIHdvcmtpbmcgY29weSBhbmQgbm90IHlldCBwdXQgb3V0IHRvCi0JCQkJLy8gZGlzaywgd2UgZG9uJ3Qgc2hvdWxkIHRyZWF0IGFzIG5vdCBleGlzdC4gQW55dGhpbmcgZWxzZSBpcyBjb25zaWRlcmVkIGV4aXN0aW5nIGJlY2F1c2Ugd2UgZ290IHBhc3QKLQkJCQkvLyBnZXRTb3VyY2VUeXBlLmV4aXN0cy4gVGhpcyB3aWxsIHJldHVybiB0aGUgdHJ1dGggZm9yIG5vbi13Yy4gQnV0IGZvciB3YyB0eXBlcyBpdCB3aWxsIHJldHVybiB0cnVlLAotCQkJCS8vIGV2ZW4gdGhvdWdoIG5vdCBwaHlzaWNhbGx5IG9uIGRpc2sgKHN1Y2ggYXMganVzdCBjcmVhdGluZyBpdCBhbmQgaGFkbid0IHNhdmVkIGl0IHlldCkuIFNvIGZvciB3YyB0eXBlcwotCQkJCS8vIHdlIG5lZWQgdG8gdGVzdCB0aGUgYWN0dWFsIHJlc291cmNlLgotCQkJCS8vIFRlc3QgaXMgT0sgaWYgbm90IHdjLCBvciBpZiB3YywgdGhlbiB0aGVyZSBpcyBhIHJlcy4gYW5kIGl0IGlzIGFjY2Vzc2libGUuCi0JCQkJaWYgKCFpc1dDIHx8IChyZXMgIT0gbnVsbCAmJiByZXMuaXNBY2Nlc3NpYmxlKCkpKSB7Ci0JCQkJCXNldE1vZGlmaWVycygpOwotCQkJCQlzZXROYW1pbmcoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXNldFN1cGVyKCk7Ci0JCQkJCX0gY2F0Y2ggKEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24gZSkgewotCQkJCQkJSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJCQl9Ci0JCQkJCXNldEltcGxlbWVudHMoKTsKLQkJCQkJcmVmbGVjdElubmVyQ2xhc3NlcygpOwotCQkJCQlzZXREZWNsYXJpbmdDbGFzcygpOwotCQkJCQkvL2FkZEltcG9ydHMoKTsKLQkJCQkJaWYgKGlzSGVhZGxlc3MpIHsKLQkJCQkJCXJlZ2lzdGVyV2l0aEZhY3RvcnkoKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9DTEFTUyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzSGVhZGxlc3MpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UgewotCQkJcmVnaXN0ZXJXaXRoRmFjdG9yeSgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVjbGFyaW5nQ2xhc3MoKSB7Ci0JCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0RGVjbGFyaW5nVHlwZSgpOwotCQlpZiAoZGVjbGFyaW5nVHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBOZWVkIHRvIGdldCBpdCBhbmQgcmVmbGVjdCBpdCBzbyB0aGF0IHRoZSBkZWNsYXJlZCB0eXBlIG9mIHRoaXMgdGFyZ2V0IGlzIHNldCBjb3JyZWN0bHkuIFdlIGNhbiBqdXN0Ci0JCQkvLyBzZXQgaXQgb3Vyc2VsdmVzIGRpcmVjdGx5IGJlY2F1c2UgRUNvcmUgd291bGQgdHJ5IHRvIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBpbm5lciBjbGFzc2VzIG9mIHRoZSBkZWNsYXJpbmcgdHlwZS4gVGhpcwotCQkJLy8gd291bGQgY2F1c2UgaXQgdG8gYmUgYWRkZWQgdHdpY2UsIG9uY2UgZnJvbSB0aGUgcmVmbGVjdGlvbiBjYXVzZWQgYnkgdGhlIGludmVyc2Ugc2V0dGluZywgYW5kIG9uY2UgZnJvbSBvdXIgZG9pbmcKLQkJCS8vIHRoZSBpbnZlcnNlIHNldHRpbmcgaXRzZWxmLgotCQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0VGFyZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZGVjbGFyaW5nVHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQkJSmF2YUNsYXNzSW1wbCBkZWNsYXJpbmdDbGFzcyA9IChKYXZhQ2xhc3NJbXBsKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUocGFja2FnZU5hbWUsIGRlY2xhcmluZ1R5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKSwgc2V0KTsKLQkJCWRlY2xhcmluZ0NsYXNzLmdldERlY2xhcmVkQ2xhc3NlcygpOwkvLyBUaGlzIHdpbGwgY2F1c2UgaXQgdG8gcHV0IHVzIGludG8gaXRzIGxpc3QgYW5kIGFsc28gc2V0IG91ciBkZWNsYXJpbmcgY2xhc3MgdG8gdGhpcyBkZWNsYXJpbmcgdHlwZS4KLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhblJlZmxlY3QoKSB7Ci0JCXJldHVybiBpc1Jlc291cmNlTG9hZGVkKCkgJiYgZ2V0U291cmNlUHJvamVjdCgpICE9IG51bGwgJiYgZ2V0U291cmNlVHlwZSgpICE9IG51bGwgJiYgZ2V0U291cmNlVHlwZSgpLmV4aXN0cygpOwotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVmbGVjdEZpZWxkc0lmTmVjZXNzYXJ5KCkgewotCQlpZiAocmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCkgJiYgY2FuUmVmbGVjdCgpKSB7Ci0JCQlpZiAoIWhhc1JlZmxlY3RlZEZpZWxkcyAmJiAhaXNSZWZsZWN0aW5nRmllbGRzKSB7Ci0JCQkJaXNSZWZsZWN0aW5nRmllbGRzID0gdHJ1ZTsKLQkJCQl0cnkgewotCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdGFydEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfRklFTERTKTsKLQkJCQkJYWRkRmllbGRzKCk7Ci0JCQkJCWhhc1JlZmxlY3RlZEZpZWxkcyA9IHRydWU7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaGFzUmVmbGVjdGVkRmllbGRzID0gZmFsc2U7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuV0FSTklORykpIHsKLQkJCQkJCWxvZ2dlci5sb2coUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRmFpbGVkX3JlZmxlY3RpbmdfdmFsdWVzX0VSUk9SXyIpLCBMZXZlbC5XQVJOSU5HKTsgLy8kTk9OLU5MUy0xJCA9ICJGYWlsZWQgcmVmbGVjdGluZyB2YWx1ZXMhISEiCi0JCQkJCQlsb2dnZXIubG9nV2FybmluZyhlKTsgCi0JCQkJCX0JCQkJCQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlzUmVmbGVjdGluZ0ZpZWxkcyA9IGZhbHNlOwotCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9GSUVMRFMpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBoYXNSZWZsZWN0ZWRGaWVsZHM7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGZhbHNlOwkvLyBDb3VsZG4ndCByZWZsZWN0IHRoZSBiYXNlIHZhbHVlcywgc28gY291bGRuJ3QgZG8gZmllbGRzIGVpdGhlcgotCX0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVmbGVjdE1ldGhvZHNJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpICYmIGNhblJlZmxlY3QoKSkgewotCQkJaWYgKCFoYXNSZWZsZWN0ZWRNZXRob2RzICYmICFpc1JlZmxlY3RpbmdNZXRob2RzKSB7Ci0JCQkJaXNSZWZsZWN0aW5nTWV0aG9kcyA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RhcnRDdW11bGF0aXZlU3RlcChSRUZMRUNUX01FVEhPRFMpOwotCQkJCQloYXNSZWZsZWN0ZWRNZXRob2RzID0gYWRkTWV0aG9kcygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWhhc1JlZmxlY3RlZE1ldGhvZHMgPSBmYWxzZTsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5XQVJOSU5HKSkgewotCQkJCQkJbG9nZ2VyLmxvZyhSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGYWlsZWRfcmVmbGVjdGluZ192YWx1ZXNfRVJST1JfIiksIExldmVsLldBUk5JTkcpOyAvLyROT04tTkxTLTEkID0gIkZhaWxlZCByZWZsZWN0aW5nIHZhbHVlcyEhISIKLQkJCQkJCWxvZ2dlci5sb2dXYXJuaW5nKGUpOyAKLQkJCQkJfQkJCQkJCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJaXNSZWZsZWN0aW5nTWV0aG9kcyA9IGZhbHNlOwotCQkJCQlpZiAoIWhhc1JlZmxlY3RlZCkKLQkJCQkJCWZsdXNoTWV0aG9kcygpOwkvLyBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLCBzbyB3ZSB3aWxsIGRvIGEgY29tcGxldGUgZmx1c2ggdG8gYmUgb24gc2FmZSBzaWRlLgotCQkJCQlUaW1lclRlc3RzLmJhc2ljVGVzdC5zdG9wQ3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9NRVRIT0RTKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaGFzUmVmbGVjdGVkTWV0aG9kczsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7CS8vIENvdWxkbid0IHJlZmxlY3QgdGhlIGJhc2UgdmFsdWVzLCBzbyBjb3VsZG4ndCBkbyBmaWVsZHMgZWl0aGVyCi0JfQotCQotCXByaXZhdGUgdm9pZCByZWdpc3RlcldpdGhGYWN0b3J5KCkgewotCQlnZXRBZGFwdGVyRmFjdG9yeSgpLnJlZ2lzdGVyUmVmbGVjdGlvbihnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3Ijbm90aWZ5Q2hhbmdlZChuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClOb3RpZmllciwgaW50LChFU3RydWN0dXJhbEZlYXR1cmUpIEVPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBpbnQpKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRU1PVklOR19BREFQVEVSCi0JCQkmJiBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSA9PSB0aGlzCi0JCQkmJiBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSA9PSBnZXRUYXJnZXQoKSkKLQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkudW5yZWdpc3RlclJlZmxlY3Rpb24oZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBZGFwdGVyRmFjdG9yeShKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IGluRmFjdG9yeSkgewotCQlhZGFwdGVyRmFjdG9yeSA9IGluRmFjdG9yeTsKLQl9Ci0JLyoqCi0JICogc2V0SW1wbGVtZW50cyAtIHNldCBvdXIgaW1wbGVtZW50ZWQvc3VwZXIgaW50ZXJmYWNlcyBoZXJlCi0JICogRm9yIGFuIGludGVyZmFjZSwgdGhlc2UgYXJlIHN1cGVyY2xhc3Nlcy4KLQkgKiBGb3IgYSBjbGFzcywgdGhlc2UgYXJlIGltcGxlbWVudGVkIGludGVyZmFjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW1wbGVtZW50cygpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZ1tdIGludGVyZmFjZU5hbWVzID0gZ2V0U291cmNlVHlwZSgpLmdldFN1cGVySW50ZXJmYWNlTmFtZXMoKTsKLQkJCUphdmFDbGFzcyByZWY7Ci0JCQkvLyBuZWVkcyB3b3JrLCB0aGUgbmFtZXMgYWJvdmUgd2lsbCBiZSBzaW1wbGUgbmFtZXMgaWYgd2UgYXJlIHJlbGZlY3RpbmcgZnJvbSBhIHNvdXJjZSBmaWxlCi0JCQlMaXN0IGxpc3QgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gaW50ZXJmYWNlTmFtZXNbaV07Ci0JCQkJLy8gaWYgYSBjbGFzcyBpbXBsZW1lbnRzIGFuIGludGVyZmFjZSB0aGF0IGlzIGFjdHVhbGx5IGFuIGlubmVyIGludGVyZmFjZSwgdGhlIGlubmVyIGludGVyZmFjZQotCQkJCS8vIHBhY2thZ2UgaXMgbm90IHJlc29sdmVkIGNvcnJlY3RseSB3aXRob3V0IGdldHRpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lLiBGb3IgZXhhbXBsZSwKLQkJCQkvLyBwdWJsaWMgY2xhc3MgVGVzdEJlYW4gaW1wbGVtZW50cyBTb21lT3RoZXJTaW1wbGVDbGFzcy5Tb21lSW50ZXJmYWNlCi0JCQkJLy8gd2l0aG91dCBnZXR0aW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgd2UgYXJlIHVzaW5nIFNvbWVPdGhlclNpbXBsZUNsYXNzIGFzIHRoZSAKLQkJCQkvLyBwYWNrYWdlIG5hbWUgd2hpY2ggaXMgaW5jb3JyZWN0LgotCQkJCVN0cmluZyBpbm5lcnR5cGVOYW1lID0gSkRPTVNlYXJjaEhlbHBlci5nZXRSZXNvbHZlZFR5cGVOYW1lKG5hbWUsIGdldFR5cGUoKSwgZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpKTsKLQkJCQlpZiAoaW5uZXJ0eXBlTmFtZSAhPSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBpbm5lcnR5cGVOYW1lOwotCQkJCX0KLQkJCQlyZWYgPSByZWZsZWN0SmF2YUNsYXNzKG5hbWUpOwotCQkJCWxpc3QuYWRkKHJlZik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCS8vIG5hbWUgc3RheXMgbnVsbCBhbmQgd2UgY2Fycnkgb24KLQkJfQotCX0KLQkvKioKLQkgKiBzZXRNb2RpZmllcnMgLSBzZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgcmVsYXRlZCB0byBtb2RpZmllcnMgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGlmaWVycygpIHsKLQkJSmF2YUNsYXNzIGphdmFDbGFzc1RhcmdldCA9IChKYXZhQ2xhc3MpIGdldFRhcmdldCgpOwotCQl0cnkgewotCQkJamF2YUNsYXNzVGFyZ2V0LnNldEFic3RyYWN0KEZsYWdzLmlzQWJzdHJhY3QoZ2V0U291cmNlVHlwZSgpLmdldEZsYWdzKCkpKTsKLQkJCWphdmFDbGFzc1RhcmdldC5zZXRGaW5hbChGbGFncy5pc0ZpbmFsKGdldFNvdXJjZVR5cGUoKS5nZXRGbGFncygpKSk7Ci0JCQlqYXZhQ2xhc3NUYXJnZXQuc2V0UHVibGljKEZsYWdzLmlzUHVibGljKGdldFNvdXJjZVR5cGUoKS5nZXRGbGFncygpKSk7Ci0JCQkvLyBTZXQgdHlwZSB0byBjbGFzcyBvciBpbnRlcmZhY2UsIG5vdCB5ZXQgaGFuZGxpbmcgRVhDRVBUSU9OCi0JCQlpZiAoZ2V0U291cmNlVHlwZSgpLmlzQ2xhc3MoKSkKLQkJCQlqYXZhQ2xhc3NUYXJnZXQuc2V0S2luZChUeXBlS2luZC5DTEFTU19MSVRFUkFMKTsKLQkJCWVsc2UKLQkJCQlqYXZhQ2xhc3NUYXJnZXQuc2V0S2luZChUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuV0FSTklORykpCi0JCQkJbG9nZ2VyLmxvZyhSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvcl9JbnRyb3NwZWN0aW5nX0ZsYWdzX0VSUk9SXyIsIG5ldyBPYmplY3RbXSB7IGphdmFDbGFzc1RhcmdldC5nZXRRdWFsaWZpZWROYW1lKCksIG5wZS5nZXRNZXNzYWdlKCl9KSwgTGV2ZWwuV0FSTklORyk7IC8vJE5PTi1OTFMtMSQgPSAiZXJyb3IgaW50cm9zcGVjdGluZyBmbGFncyBvbiB7MH0iCi0JCX0KLQl9Ci0JLyoqCi0JICogc2V0TmFtaW5nIC0gc2V0IHRoZSBuYW1pbmcgdmFsdWVzIGhlcmUKLQkgKiAJLSBxdWFsaWZpZWQgbmFtZSAocGFja2FnZSBuYW1lICsgbmFtZSkgbXVzdCBiZSBzZXQgZmlyc3QsIHRoYXQgaXMgdGhlIHBhdGggdG8gdGhlIHJlYWwgSmF2YSBjbGFzcwotCSAqCS0gSUQgLSBzaW1wbGUgbmFtZSwgaWRlbnRpdHkgd2l0aGluIGEgcGFja2FnZSBkb2N1bWVudAotCSAqIAktIG51bGwgVVVJRAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWluZygpIHsKLQkJLyogTmFtaW5nIGhhcyBiZWVuIHByb3ZpZGVkIGJ5IHRoZSBKYXZhUmVmbGVjdGlvbktleSAKLQkJSmF2YUNsYXNzIGphdmFDbGFzc1RhcmdldCA9IChKYXZhQ2xhc3MpIGdldFRhcmdldCgpOwotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnJlZlNldFVVSUQoKFN0cmluZyludWxsKTsKLQkJKChYTUlSZXNvdXJjZSlqYXZhQ2xhc3NUYXJnZXQuZVJlc291cmNlKCkpLnNldElEKGphdmFDbGFzc1RhcmdldCxnZXRTb3VyY2VUeXBlKCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCSovCi0JfQotCXByb3RlY3RlZCB2b2lkIHNldFNvdXJjZVR5cGUoSVR5cGUgYVR5cGUpIHsKLQkJc291cmNlVHlwZSA9IGFUeXBlOwotCX0KLQkvKioKLQkgKiBzZXRTdXBlciAtIHNldCBvdXIgc3VwZXJ0eXBlIGhlcmUsIGltcGxlbWVudGVkIGludGVyZmFjZSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VwZXIoKSB0aHJvd3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzdXBlck5hbWUgPSBudWxsOwotCQlJVHlwZSBzdXBlclR5cGUgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKCFnZXRTb3VyY2VUeXBlKCkuaXNJbnRlcmZhY2UoKSkgewotCQkJCXN1cGVyTmFtZSA9IGdldFNvdXJjZVR5cGUoKS5nZXRTdXBlcmNsYXNzTmFtZSgpOwotCQkJCS8vIGJpbmFyeSB0eXBlcyB3aWxsIGFsd2F5cyBoYXZlIGZ1bGx5LXF1YWxpZmllZCBzdXBlciBuYW1lcywgc28gbm8gbmVlZCB0byBkbyBhbnkgc2VhcmNoaW5nLgotCQkJCWlmICghZ2V0U291cmNlVHlwZSgpLmlzQmluYXJ5KCkgJiYgc3VwZXJOYW1lICE9IG51bGwgJiYgaXNUYXJnZXRJbm5lcigpKSB7Ci0JCQkJCUlUeXBlIGRlY2xhcmluZ1R5cGUgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0RGVjbGFyaW5nVHlwZSgpOwotCQkJCQlpZiAoZGVjbGFyaW5nVHlwZSAhPSBudWxsKSB7Ci0JCQkJCQkvL0dldCBhbGwgcGFyZW50IElubmVyVHlwZXMKLQkJCQkJCUlUeXBlW10gaW5uZXJzID0gZGVjbGFyaW5nVHlwZS5nZXRUeXBlcygpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbm5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlJVHlwZSB0eXBlID0gaW5uZXJzW2ldOwotCQkJCQkJCWlmIChzdXBlck5hbWUuZXF1YWxzKHR5cGUuZ2V0RWxlbWVudE5hbWUoKSkpIHsKLQkJCQkJCQkJc3VwZXJOYW1lID0gZGVjbGFyaW5nVHlwZS5nZXRFbGVtZW50TmFtZSgpICsgJy4nICsgc3VwZXJOYW1lOwotCQkJCQkJCQlyZWZsZWN0SW5uZXJDbGFzc2VzKGRlY2xhcmluZ1R5cGUpOwotCQkJCQkJCQlzdXBlclR5cGUgPSB0eXBlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy9Tb3VyY2UgZmlsZXMgcmV0dXJuIG51bGwgaWYgZXh0ZW5kcyBkb2VzIG5vdCBleGlzdC4KLQkJCQlpZiAoc3VwZXJOYW1lID09IG51bGwgJiYgIWdldFNvdXJjZVR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoT0JKRUNUX1RZUEVfTkFNRSkpCi0JCQkJCXN1cGVyTmFtZSA9IE9CSkVDVF9UWVBFX05BTUU7Ci0JCQkJaWYgKHN1cGVyTmFtZSAhPSBudWxsKSB7Ci0JCQkJCUphdmFDbGFzcyBqYXZhQ2xhc3NUYXJnZXQgPSAoSmF2YUNsYXNzKSBnZXRUYXJnZXQoKTsKLQkJCQkJaWYgKHN1cGVyVHlwZSAhPSBudWxsKQotCQkJCQkJamF2YUNsYXNzVGFyZ2V0LnNldFN1cGVydHlwZShyZWZsZWN0SmF2YUNsYXNzKHN1cGVyVHlwZSkpOwotCQkJCQllbHNlCi0JCQkJCQlqYXZhQ2xhc3NUYXJnZXQuc2V0U3VwZXJ0eXBlKHJlZmxlY3RKYXZhQ2xhc3Moc3VwZXJOYW1lKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBib29sZWFuIGlzVGFyZ2V0SW5uZXIoKSB7Ci0JCUphdmFDbGFzc0ltcGwgamF2YUNsYXNzID0gKEphdmFDbGFzc0ltcGwpIGdldFRhcmdldCgpOwotCQlyZXR1cm4gKGphdmFDbGFzcy5nZXROYW1lKCkuaW5kZXhPZignJCcpICE9IC0xKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHNvdXJjZVR5cGUgY2FuIGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNvdXJjZVR5cGVFeGlzdHMoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCkgIT0gbnVsbDsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdElubmVyQ2xhc3NlcygpIHsKLQkJSVR5cGVbXSBpbm5lckNsYXNzZXMgPSBudWxsOwotCQl0cnkgewotCQkJaW5uZXJDbGFzc2VzID0gZ2V0U291cmNlVHlwZSgpLmdldFR5cGVzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaWYgKGlubmVyQ2xhc3NlcyAhPSBudWxsICYmIGlubmVyQ2xhc3Nlcy5sZW5ndGggIT0gMCkgewotCQkJTGlzdCBkZWNsYXJlZENsYXNzZXMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXREZWNsYXJlZENsYXNzZXNHZW4oKTsKLQkJCUphdmFDbGFzcyBpbm5lcjsKLQkJCVJlc291cmNlU2V0IHNldCA9IGdldFRhcmdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFNvdXJjZVR5cGUoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbm5lckNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbm5lciA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShwYWNrYWdlTmFtZSwgaW5uZXJDbGFzc2VzW2ldLmdldFR5cGVRdWFsaWZpZWROYW1lKCksIHNldCk7Ci0JCQkJZGVjbGFyZWRDbGFzc2VzLmFkZChpbm5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdElubmVyQ2xhc3NlcyhJVHlwZSBhVHlwZSkgewotCQlJVHlwZVtdIGlubmVyQ2xhc3NlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbm5lckNsYXNzZXMgPSBhVHlwZS5nZXRUeXBlcygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmIChpbm5lckNsYXNzZXMgIT0gbnVsbCAmJiBpbm5lckNsYXNzZXMubGVuZ3RoICE9IDApIHsKLQkJCVJlc291cmNlU2V0IHNldCA9IGdldFRhcmdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IGFUeXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlKYXZhQ2xhc3NJbXBsIHBhcmVudFR5cGUgPSAoSmF2YUNsYXNzSW1wbCkgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKHBhY2thZ2VOYW1lLCBhVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpLCBzZXQpOwotCQkJTGlzdCBkZWNsYXJlZENsYXNzZXMgPSBwYXJlbnRUeXBlLmdldERlY2xhcmVkQ2xhc3Nlc0dlbigpOwotCQkJSmF2YUNsYXNzIGlubmVyOwotCQkJCi0JCQkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5uZXJDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaW5uZXIgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUocGFja2FnZU5hbWUsIGlubmVyQ2xhc3Nlc1tpXS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpLCBzZXQpOwotCQkJCWRlY2xhcmVkQ2xhc3Nlcy5hZGQoaW5uZXIpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgaWYgd2UgaGF2ZSBhIHZhbGlkIHNvdXJjZSBhbmQgaGFzIGJlZW4gcmVmbGVjdGVkLiBUaGlzIGlzIHRvIG9ubHkKLQkgKiB0byBiZSB1c2VkIGJ5IHRoaXMgYWRhcHRlciBhbmQgYnkgdGhlIEpET00gYWRhcHRlciBmYWN0b3J5LiBJdCBoYXMgYSAKLQkgKiB2ZXJ5IHNwZWNpZmljIG1lYW5pbmcgYW5kIG1heSBjaGFuZ2UgYXMgbmVlZGVkLiBJdCBzaG91bGQgbm90IGJlIHVzZWQKLQkgKiBmb3IgYW55IG90aGVyIHB1cnBvc2UuIEl0IGlzIG5vdCBhbiBBUEkuCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXN5bmNocm9uaXplZCBib29sZWFuIGhhc1ZhbGlkUmVmbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNvdXJjZVR5cGUgIT0gbnVsbCAmJiBoYXNSZWZsZWN0ZWQgJiYgIWlzUmVmbGVjdGluZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFGaWVsZEpET01BZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFGaWVsZEpET01BZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMDFkZjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhRmllbGRKRE9NQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVhZEFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuRmllbGRJbXBsOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRmllbGRKRE9NQWRhcHRvciBleHRlbmRzIEpET01BZGFwdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVHSU5fQ09NTUVOVCA9ICIvKiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX0NPTU1FTlQgPSAiKi8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElGaWVsZCBzb3VyY2VGaWVsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIElUeXBlIHBhcmVudFR5cGUgPSBudWxsOwotCXB1YmxpYyBKYXZhRmllbGRKRE9NQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIElKYXZhUHJvamVjdCB3b3JraW5nUHJvamVjdCkgewotCQlzdXBlcih0YXJnZXQsIHdvcmtpbmdQcm9qZWN0KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgY2xlYXJTb3VyY2UoKSB7Ci0JCXNvdXJjZUZpZWxkID0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoYm9vbGVhbiBjbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JCWlmIChjbGVhckNhY2hlZE1vZGVsT2JqZWN0KQotCQkJY2xlYXJTb3VyY2UoKTsKLQkJRmllbGRJbXBsIGZpZWxkID0gZ2V0VGFyZ2V0RmllbGQoKTsKLQkJZmllbGQuc2V0SW5pdGlhbGl6ZXIobnVsbCk7Ci0JCWZpZWxkLnNldEZpbmFsKGZhbHNlKTsKLQkJZmllbGQuc2V0U3RhdGljKGZhbHNlKTsKLQkJZmllbGQuc2V0VHJhbnNpZW50KGZhbHNlKTsKLQkJZmllbGQuc2V0Vm9sYXRpbGUoZmFsc2UpOwotCQlmaWVsZC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpOwotCQlmaWVsZC5zZXRFVHlwZShudWxsKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGJvb2xlYW4gaXNFeGlzdGluZykgewotCQlnZXRUYXJnZXRGaWVsZCgpLnNldFJlZmxlY3RlZChmYWxzZSk7Ci0JCXN1cGVyLnBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGlzRXhpc3RpbmcpOwotCX0KLQkvKioKLQkgKiBSZXR1cm4gYSBTdHJpbmcgZm9yIHRoZSBzb3VyY2Ugc3RhcnRpbmcgYWZ0ZXIgdGhlIGZpZWxkJ3MgbmFtZSB0byB0aGUgZW5kIG9mCi0JICogdGhlIHNvdXJjZSByYW5nZS4gIFRoaXMgd2lsbCBiZSB0aGUgc291cmNlIGFmdGVyIHRoZSBuYW1lIHdoaWNoIGNvdWxkIGluY2x1ZGUgY29tbWVudHMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWVsZEluaXRpYWxpemVyU291cmNlKCkgewotCQlJT3BlbmFibGUgb3BlbmFibGUgPSBnZXRTb3VyY2VGaWVsZCgpLmdldE9wZW5hYmxlKCk7Ci0JCXRyeSB7Ci0JCQlJU291cmNlUmFuZ2UgbmFtZVJhbmdlLCBzb3VyY2VSYW5nZTsKLQkJCWludCBzdGFydCA9IC0xLCBsZW5ndGggPSAwOwotCQkJSUJ1ZmZlciBidWZmZXIgPSBvcGVuYWJsZS5nZXRCdWZmZXIoKTsKLQkJCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJbmFtZVJhbmdlID0gZ2V0U291cmNlRmllbGQoKS5nZXROYW1lUmFuZ2UoKTsKLQkJCXN0YXJ0ID0gbmFtZVJhbmdlLmdldE9mZnNldCgpICsgbmFtZVJhbmdlLmdldExlbmd0aCgpOwotCQkJaWYgKHN0YXJ0ICE9IC0xKSB7Ci0JCQkJc291cmNlUmFuZ2UgPSBnZXRTb3VyY2VGaWVsZCgpLmdldFNvdXJjZVJhbmdlKCk7Ci0JCQkJaWYgKHNvdXJjZVJhbmdlLmdldE9mZnNldCgpICE9IC0xKQotCQkJCQlsZW5ndGggPSBzb3VyY2VSYW5nZS5nZXRPZmZzZXQoKSArIHNvdXJjZVJhbmdlLmdldExlbmd0aCgpIC0gc3RhcnQ7Ci0JCQkJcmV0dXJuIGJ1ZmZlci5nZXRUZXh0KHN0YXJ0LCBsZW5ndGgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpZWxkIHNvdXJjZSBzdHJpbmcgd2l0aG91dCBjb21tZW50cwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmllbGRJbml0aWFsaXplclNvdXJjZVdpdGhvdXRDb21tZW50cygpIHsKLQkJU3RyaW5nIHMgPSBnZXRGaWVsZEluaXRpYWxpemVyU291cmNlKCk7Ci0JCWludCBzdGFydCA9IDA7Ci0JCWludCBzdGFydENvbW1lbnQgPSAtMTsKLQkJaW50IGVuZENvbW1lbnQgPSAtMTsKLQkJd2hpbGUgKHN0YXJ0IDwgcy5sZW5ndGgoKSkgewotCQkJc3RhcnRDb21tZW50ID0gcy5pbmRleE9mKEJFR0lOX0NPTU1FTlQsIHN0YXJ0KTsKLQkJCWlmIChzdGFydENvbW1lbnQgPiAwKSB7Ci0JCQkJU3RyaW5nIG5ld1N0cmluZzsKLQkJCQllbmRDb21tZW50ID0gcy5pbmRleE9mKEVORF9DT01NRU5ULCBzdGFydCk7Ci0JCQkJbmV3U3RyaW5nID0gcy5zdWJzdHJpbmcoc3RhcnQsIHN0YXJ0Q29tbWVudCk7Ci0JCQkJcyA9IG5ld1N0cmluZyArIHMuc3Vic3RyaW5nKGVuZENvbW1lbnQgKyBFTkRfQ09NTUVOVC5sZW5ndGgoKSwgcy5sZW5ndGgoKSk7Ci0JCQkJc3RhcnQgPSAwOwotCQkJCXN0YXJ0Q29tbWVudCA9IC0xOwotCQkJCWVuZENvbW1lbnQgPSAtMTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhcnQgPSBzLmxlbmd0aCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzOwotCX0KLQkvKioKLQkgKiBnZXRGaWVsZEluaXRpYWxpemVyU3RyaW5nIC0gcGFyc2UgdGhlIHNvdXJjZSBmb3Igb3VyIHNvdXJjZSBmaWVsZCAKLQkgKiAJYW5kIHJldHVybiB0aGUgaW5pdGlhbGl6YXRpb24gc3RyaW5nLgotCSAqICBSZXR1cm4gbnVsbCBpZiBubyBpbml0aWFsaXphdGlvbiBzdHJpbmcgb3IgY29uc3RhbnQgdmFsdWUgaXMgcHJlc2VudC4KLQkgKiBpLmUuIC0gcHVibGljIFN0cmluZyBmb28gPSAiZm9vIGRlZmF1bHQiOyBzaG91bGQgcmV0dXJuICJmb28gZGVmYXVsdCIgKGluY2x1ZGluZyBxdW90ZXMpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWVsZEluaXRpYWxpemVyU3RyaW5nKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICghZ2V0UGFyZW50VHlwZSgpLmlzQmluYXJ5KCkpIHsKLQkJCQlTdHJpbmcgc291cmNlID0gZ2V0RmllbGRJbml0aWFsaXplclNvdXJjZVdpdGhvdXRDb21tZW50cygpOwotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UubGVuZ3RoKCkgIT0gMCkgewotCQkJCQlpbnQgZXF1YWxzUG9zID0gc291cmNlLmluZGV4T2YoJz0nKTsvLyROT04tTkxTLTEkCi0JCQkJCWludCBlbmRQb3MgPSBzb3VyY2UuaW5kZXhPZignLCcpOy8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGVuZFBvcyA9PSAtMSkKLQkJCQkJCWVuZFBvcyA9IHNvdXJjZS5sZW5ndGgoKSAtIDE7Ci0JCQkJCWlmIChlcXVhbHNQb3MgIT0gLTEgJiYgZXF1YWxzUG9zIDwgZW5kUG9zKSB7Ci0JCQkJCQkvLyBDb3B5IGZyb20gYWZ0ZXIgIj0iIHRvIGJlZm9yZSAiOyIgb3IgIiwiCi0JCQkJCQlyZXN1bHQgPSBzb3VyY2Uuc3Vic3RyaW5nKGVxdWFsc1BvcyArIDEsIGVuZFBvcyk7Ci0JCQkJCQlyZXN1bHQgPSByZXN1bHQudHJpbSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBCaW5hcnkgdHlwZSwgc2VlIGlmIHdlIGNhbiB1c2UgdGhlIGNvbnN0YW50Ci0JCQkJLy8gaXQncyBub3QgY2xlYXIgZnJvbSB0aGUgQVBJJ3MsIGJ1dCB0aGlzIGlzIHByb2JhYmx5IG9ubHkKLQkJCQkvLyBhdmFpbGFibGUgZm9yIHN0YXRpY3MuCi0JCQkJT2JqZWN0IGNvbnN0YW50VmFsdWUgPSBnZXRTb3VyY2VGaWVsZCgpLmdldENvbnN0YW50KCk7Ci0JCQkJLy8gTmVlZCB0byBjb252ZXJ0IHRoZSBjb25zdGFudCB0byBhIFN0cmluZwotCQkJCWlmIChjb25zdGFudFZhbHVlICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gY29uc3RhbnRWYWx1ZS50b1N0cmluZygpOwotCQkJCQlpZiAoY29uc3RhbnRWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQkJcmVzdWx0ID0gIlwiIiArIHJlc3VsdCArICJcIiI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwdW50Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogZ2V0UGFyZW50VHlwZSAtIHJldHVybiB0aGUgSVR5cGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gb3VyIHBhcmVudCBKYXZhQ2xhc3MKLQkgKiB3ZSdyZSBnb2luZyB0byBkbyB0aGlzIGEgbG90LCBzbyBjYWNoZSBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgZ2V0UGFyZW50VHlwZSgpIHsKLQkJaWYgKHBhcmVudFR5cGUgPT0gbnVsbCkgewotCQkJRmllbGQgdGFyZ2V0RmllbGQgPSAoRmllbGQpIGdldFRhcmdldCgpOwotCQkJSmF2YUNsYXNzIHBhcmVudEphdmFDbGFzcyA9IHRhcmdldEZpZWxkLmdldEphdmFDbGFzcygpOwotCQkJaWYgKHBhcmVudEphdmFDbGFzcyAhPSBudWxsKSB7Ci0JCQkJSmF2YUNsYXNzSkRPTUFkYXB0b3IgcGEgPSAoSmF2YUNsYXNzSkRPTUFkYXB0b3IpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKHBhcmVudEphdmFDbGFzcy5lQWRhcHRlcnMoKSwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJCWlmIChwYSAhPSBudWxsKQotCQkJCQlwYXJlbnRUeXBlID0gcGEuZ2V0U291cmNlVHlwZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJlbnRUeXBlOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VGaWVsZCgpOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjaGFzUmVmbGVjdGlvblNvdXJjZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZUZpZWxkICE9IG51bGw7Ci0gICAgfQotCQotCS8qCi0JICogVXNlZCBieSBKYXZhIENsYXNzIEpET00gYWRhcHRlciB0byBjcmVhdGUgYW5kIHNldCB3aXRoIGEgc291cmNlIGZpZWxkCi0JICovCQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZUZpZWxkKElGaWVsZCBmaWVsZCkgewotCQlzb3VyY2VGaWVsZCA9IGZpZWxkOwotCX0JCi0JLyoqCi0JICogZ2V0U291cmNlRmllbGQgLSByZXR1cm4gdGhlIElGaWVsZCB3aGljaCBkZXNjcmliZXMgb3VyIGltcGxlbWVudGluZyBmaWVsZAotCSAqLwotCXByb3RlY3RlZCBJRmllbGQgZ2V0U291cmNlRmllbGQoKSB7Ci0JCWlmIChzb3VyY2VGaWVsZCA9PSBudWxsIHx8ICFzb3VyY2VGaWVsZC5leGlzdHMoKSkgewotCQkJSVR5cGUgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnRUeXBlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQkJc291cmNlRmllbGQgPSBwYXJlbnQuZ2V0RmllbGQoKChGaWVsZCkgZ2V0VGFyZ2V0KCkpLmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZUZpZWxkOwotCX0KLQlwdWJsaWMgRmllbGRJbXBsIGdldFRhcmdldEZpZWxkKCkgewotCQlyZXR1cm4gKEZpZWxkSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0JfQotCXByb3RlY3RlZCBJVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50VHlwZSgpOwotCX0KLQlwcm90ZWN0ZWQgTWFwIGdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSB7Ci0JCUZpZWxkIGZpZWxkID0gZ2V0VGFyZ2V0RmllbGQoKTsKLQkJaWYgKGZpZWxkICE9IG51bGwpIHsKLQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBmaWVsZC5nZXRKYXZhQ2xhc3MoKTsKLQkJCWlmIChqYXZhQ2xhc3MgIT0gbnVsbCkgewotCQkJCUpET01BZGFwdG9yIGNsYXNzQWRhcHRvciA9IChKRE9NQWRhcHRvcikgcmV0cmlldmVBZGFwdG9yRnJvbShqYXZhQ2xhc3MpOwotCQkJCWlmIChjbGFzc0FkYXB0b3IgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGNsYXNzQWRhcHRvci5nZXRUeXBlUmVzb2x1dGlvbkNhY2hlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIGdldFZhbHVlSW4gbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZUluKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSkgewotCQkvLyBBdCB0aGlzIHBvaW50LCB0aGlzIGFkYXB0ZXIgZG9lcyBub3QgZHluYW1pY2FsbHkgY29tcHV0ZSBhbnkgdmFsdWVzLAotCQkvLyBhbGwgdmFsdWVzIGFyZSBwdXNoZWQgYmFjayBpbnRvIHRoZSB0YXJnZXQgb24gdGhlIGluaXRpYWwgY2FsbC4KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlSW4ob2JqZWN0LCBhdHRyaWJ1dGUpOwotCX0KLQkvKioKLQkgKiByZWZsZWN0VmFsdWVzIC0gdGVtcGxhdGUgbWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRlIHRvIHB1bXAgdmFsdWVzIGludG8gdGFyZ2V0LgotCSAqIG9uIGVudHJ5OiBuYW1lLCBjb250YWluaW5nIHBhY2thZ2UgKGFuZCBxdWFsaWZpZWQgbmFtZSksIGFuZCBkb2N1bWVudCBtdXN0IGJlIHNldC4KLQkgKiBKYXZhQ2xhc3MgYWRhcHRvcjoKLQkgKgktIHNldCBtb2RpZmllcnMKLQkgKgktIHNldCBuYW1lCi0JICogCS0gc2V0IHR5cGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0VmFsdWVzKCkgewotCQlzdXBlci5yZWZsZWN0VmFsdWVzKCk7Ci0JCWlmIChpc1Jlc291cmNlTG9hZGVkKCkgJiYgZ2V0U291cmNlUHJvamVjdCgpICE9IG51bGwgJiYgZ2V0U291cmNlRmllbGQoKSAhPSBudWxsKSB7Ci0JCQlzZXRNb2RpZmllcnMoKTsKLQkJCS8vCXNldE5hbWluZygpOwotCQkJc2V0VHlwZSgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBzZXRNb2RpZmllcnMgLSBzZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgcmVsYXRlZCB0byBtb2RpZmllcnMgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGlmaWVycygpIHsKLQkJRmllbGQgamF2YUZpZWxkVGFyZ2V0ID0gKEZpZWxkKSBnZXRUYXJnZXQoKTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBpbml0aWFsaXplciA9IGdldEZpZWxkSW5pdGlhbGl6ZXJTdHJpbmcoKTsKLQkJCWlmIChpbml0aWFsaXplciAhPSBudWxsKQotCQkJCWphdmFGaWVsZFRhcmdldC5zZXRJbml0aWFsaXplcihjcmVhdGVCbG9jayhqYXZhRmllbGRUYXJnZXQuZ2V0TmFtZSgpLCBpbml0aWFsaXplcikpOwotCQkJaW50IGZsYWdzID0gZ2V0U291cmNlRmllbGQoKS5nZXRGbGFncygpOwotCQkJamF2YUZpZWxkVGFyZ2V0LnNldEZpbmFsKEZsYWdzLmlzRmluYWwoZmxhZ3MpKTsKLQkJCWphdmFGaWVsZFRhcmdldC5zZXRTdGF0aWMoRmxhZ3MuaXNTdGF0aWMoZmxhZ3MpKTsKLQkJCWphdmFGaWVsZFRhcmdldC5zZXRUcmFuc2llbnQoRmxhZ3MuaXNUcmFuc2llbnQoZmxhZ3MpKTsKLQkJCWphdmFGaWVsZFRhcmdldC5zZXRWb2xhdGlsZShGbGFncy5pc1ZvbGF0aWxlKGZsYWdzKSk7Ci0JCQkvLyBTZXQgdmlzaWJpbGl0eQotCQkJaWYgKEZsYWdzLmlzUHVibGljKGZsYWdzKSkKLQkJCQlqYXZhRmllbGRUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJCWVsc2UgaWYgKEZsYWdzLmlzUHJpdmF0ZShmbGFncykpCi0JCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUklWQVRFX0xJVEVSQUwpOwotCQkJZWxzZSBpZiAoRmxhZ3MuaXNQcm90ZWN0ZWQoZmxhZ3MpKQotCQkJCWphdmFGaWVsZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUFJPVEVDVEVEX0xJVEVSQUwpOwotCQkJZWxzZQotCQkJCWphdmFGaWVsZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUEFDS0FHRV9MSVRFUkFMKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkVycm9yX0ludHJvc3BlY3RpbmdfRmxhZ3NfRVJST1JfIiwgbmV3IE9iamVjdFtdIHsoKFhNSVJlc291cmNlKSBqYXZhRmllbGRUYXJnZXQuZVJlc291cmNlKCkpLmdldElEKGphdmFGaWVsZFRhcmdldCksIG5wZS5nZXRNZXNzYWdlKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiZXJyb3IgaW50cm9zcGVjdGluZyBmbGFncyBvbiB7MH0iCi0JCX0KLQl9Ci0JLyoqCi0JICogc2V0TmFtaW5nIC0gc2V0IHRoZSBuYW1pbmcgdmFsdWVzIGhlcmUKLQkgKiAJLSBxdWFsaWZpZWQgbmFtZSBtdXN0IGJlIHNldCBmaXJzdCwgdGhhdCBpcyB0aGUgcGF0aCB0byB0aGUgcmVhbCBKYXZhIGNsYXNzCi0JICoJLSBJRAotCSAqIAktIG51bGwgVVVJRAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWluZygpIHsKLQkJRmllbGQgamF2YUZpZWxkVGFyZ2V0ID0gKEZpZWxkKSBnZXRUYXJnZXQoKTsKLQkJSmF2YUNsYXNzIHBhcmVudCA9IGphdmFGaWVsZFRhcmdldC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0JCSgoWE1JUmVzb3VyY2UpIGphdmFGaWVsZFRhcmdldC5lUmVzb3VyY2UoKSkuc2V0SUQoamF2YUZpZWxkVGFyZ2V0LCBwYXJlbnQuZ2V0TmFtZSgpICsgIl8iICsgamF2YUZpZWxkVGFyZ2V0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqCi0JICogc2V0VHlwZSAtIHNldCBvdXIgdHlwZSBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHlwZSgpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXR5cGVOYW1lID0gdHlwZU5hbWVGcm9tU2lnbmF0dXJlKGdldFNvdXJjZUZpZWxkKCkuZ2V0VHlwZVNpZ25hdHVyZSgpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIG5wZSkgewotCQkJLy8gbmFtZSBzdGF5cyBudWxsIGFuZCB3ZSBjYXJyeSBvbgotCQl9Ci0JCXNldEZpZWxkVHlwZShnZXRUYXJnZXRGaWVsZCgpLCB0eXBlTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFKRE9NQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1NzRkYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFKRE9NQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlZmxlY3Rpb25BZGFwdG9yOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvMTMvMjAwMCAxOjIwOjMxIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUpET01BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkgewotCQotCXByb3RlY3RlZCBKYXZhUmVmbGVjdGlvblN5bmNocm9uaXplciBzeW5jaHJvbml6ZXI7Ci0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLS8qKgotICogSmF2YUpET01BZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSmF2YUpET01BZGFwdGVyRmFjdG9yeSgpIHsKLQlzdXBlcigpOwotfQotLyoqCi0gKiBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5KElKYXZhUHJvamVjdCBhSmF2YVByb2plY3QpIHsKLQl0aGlzKCk7Ci0Jc2V0SmF2YVByb2plY3QoYUphdmFQcm9qZWN0KTsKLX0KLXByb3RlY3RlZCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhQ2xhc3NBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCXJldHVybiBuZXcgSmF2YUNsYXNzSkRPTUFkYXB0b3IodGFyZ2V0LCBnZXRKYXZhUHJvamVjdCgpLCB0aGlzKTsKLX0KLXByb3RlY3RlZCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhRmllbGRBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCXJldHVybiBuZXcgSmF2YUZpZWxkSkRPTUFkYXB0b3IodGFyZ2V0LCBnZXRKYXZhUHJvamVjdCgpKTsKLX0KLXByb3RlY3RlZCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhTWV0aG9kQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIHsKLQlyZXR1cm4gbmV3IEphdmFNZXRob2RKRE9NQWRhcHRvcih0YXJnZXQsIGdldEphdmFQcm9qZWN0KCkpOwotfQotLyoqCi0gKiAgRmx1c2ggQUxMIGFkYXB0ZXJzLCB3b3JzdCBjYXNlCi0gKiBXZSBhbHNvIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIHNvdXJjZSB0eXBlcyBhcmUgYWxzbyBjbGVhcmVkCi0gKiBpbiB0aGlzIHdvcnN0IGNhc2Ugc2NlbmFyaW8uCi0gKi8KLXB1YmxpYyB2b2lkIGZsdXNoQWxsKCkgewotCWRvRmx1c2gocmVmbGVjdGVkLnZhbHVlcygpLHRydWUsIHRydWUpOwotfQotCi1wdWJsaWMgTGlzdCBmbHVzaEFsbE5vTm90aWZpY2F0aW9uKCkgewotCXJldHVybiBkb0ZsdXNoKHJlZmxlY3RlZC52YWx1ZXMoKSx0cnVlLCBmYWxzZSk7Ci19Ci0KLXB1YmxpYyB2b2lkIGZsdXNoUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gbm9GbHVzaElmU291cmNlRm91bmQpIHsKLQlMaXN0IGFkYXB0b3JzID0gZ2V0UmVmbGVjdGVkRm9yUGFja2FnZShwYWNrYWdlTmFtZSwgbm9GbHVzaElmU291cmNlRm91bmQpOwotCWRvRmx1c2goYWRhcHRvcnMsIHRydWUsIHRydWUpOwotfQotcHVibGljIExpc3QgZmx1c2hQYWNrYWdlTm9Ob3RpZmljYXRpb24oU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIG5vRmx1c2hJZlNvdXJjZUZvdW5kKSB7Ci0JTGlzdCBhZGFwdG9ycyA9IGdldFJlZmxlY3RlZEZvclBhY2thZ2UocGFja2FnZU5hbWUsIG5vRmx1c2hJZlNvdXJjZUZvdW5kKTsKLQlyZXR1cm4gZG9GbHVzaChhZGFwdG9ycywgdHJ1ZSwgZmFsc2UpOwotfQotLyoqCi0gKiBSZXR1cm4gYSBMaXN0IG9mIHJlZmxlY3Rpb24gYWRhcHRvcnMgdGhhdCBiZWxvbmcgdG8gCi0gKiB0aGUgcGFja2FnZU5hbWUuCi0gKiBAcGFyYW0gcGFja2FnZU5hbWUKLSAqIEByZXR1cm4KLSAqLwotcHJpdmF0ZSBMaXN0IGdldFJlZmxlY3RlZEZvclBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIGZpbHRlckZvdW5kVHlwZXMpIHsKLQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiAhcmVmbGVjdGVkLmlzRW1wdHkoKSkgewotCQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSB0cnVlOwotCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJdGVyYXRvciBpdCA9IHJlZmxlY3RlZC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQlNYXAuRW50cnkgZW50cnk7Ci0JCQlTdHJpbmcga2V5OwotCQkJSmF2YUNsYXNzSkRPTUFkYXB0b3IgYWRhcHRvcjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlhZGFwdG9yID0gKEphdmFDbGFzc0pET01BZGFwdG9yKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCS8qCi0JCQkJICogRW5zdXJlIHRoYXQgdGhlIHRoZSBhZGFwdG9yIGlzIG9ubHkgZmlsdGVyZWQgb3V0IGlmIGl0IGhhcwotCQkJCSAqIGFjdHVhbGx5IHJlZmxlY3RlZCB0aGUgY29udGVudC4gIEl0IGlzIG5vdCBnb29kIGVub3VnaCBqdXN0Ci0JCQkJICogdG8gdGVzdCBmb3IgdGhlIHNvdXJjZVR5cGUuCi0JCQkJICovCi0JCQkJaWYgKGZpbHRlckZvdW5kVHlwZXMgJiYgYWRhcHRvci5oYXNWYWxpZFJlZmxlY3Rpb24oKSkKLQkJCQkJY29udGludWU7Ci0JCQkJa2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJaWYgKGtleS5zdGFydHNXaXRoKHBhY2thZ2VOYW1lKSAmJiBrZXkuaW5kZXhPZignLicsIHBhY2thZ2VOYW1lLmxlbmd0aCgpICsgMSkgPCAwKSB7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJcmVzdWx0LmFkZChlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9CQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKTsKLQkJfQotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLX0KLXByaXZhdGUgTGlzdCBkb0ZsdXNoKENvbGxlY3Rpb24gYWRhcHRvcnMsIGJvb2xlYW4gY2xlYXJTb3VyY2VUeXBlLCBib29sZWFuIGRvTm90aWZ5KSB7Ci0JaWYgKCFhZGFwdG9ycy5pc0VtcHR5KCkpIHsKLQkJaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkID0gdHJ1ZTsKLQkJTGlzdCBub3RpZmljYXRpb25zID0gZG9Ob3RpZnkgPyBudWxsIDogbmV3IEFycmF5TGlzdChhZGFwdG9ycy5zaXplKCkpOwotCQl0cnkgewotCQkJTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbjsKLQkJCUl0ZXJhdG9yIGkgPSBhZGFwdG9ycy5pdGVyYXRvcigpOwotCQkJSkRPTUFkYXB0b3IgYWRhcHRvcjsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCWFkYXB0b3IgPSAoSkRPTUFkYXB0b3IpIGkubmV4dCgpOwotCQkJCWlmIChkb05vdGlmeSkKLQkJCQkJYWRhcHRvci5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGNsZWFyU291cmNlVHlwZSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCW5vdGlmaWNhdGlvbiA9IGFkYXB0b3IuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKGNsZWFyU291cmNlVHlwZSk7Ci0JCQkJCWlmIChub3RpZmljYXRpb24gIT0gbnVsbCkKLQkJCQkJCW5vdGlmaWNhdGlvbnMuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKTsKLQkJfQotCQlyZXR1cm4gbm90aWZpY2F0aW9uczsKLQl9Ci0JcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci19Ci0vLyBGbHVzaCB0aGUgYWRhcHRlciBmb3IgYSBzb3VyY2Ugb2JqZWN0Ci1wdWJsaWMgdm9pZCBmbHVzaFJlZmxlY3Rpb24oU3RyaW5nIHNvdXJjZSkgewotCUpET01BZGFwdG9yIGEgPSAoSkRPTUFkYXB0b3IpIHJlZmxlY3RlZC5nZXQoc291cmNlKTsKLQlpZiAoYSAhPSBudWxsKQotCQlhLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoKTsKLX0KLXB1YmxpYyBOb3RpZmljYXRpb24gZmx1c2hSZWZsZWN0aW9uTm9Ob3RpZmljYXRpb24oU3RyaW5nIHNvdXJjZSkgewotCUpET01BZGFwdG9yIGEgPSAoSkRPTUFkYXB0b3IpIHJlZmxlY3RlZC5nZXQoc291cmNlKTsKLQlpZiAoYSAhPSBudWxsKQotCQlyZXR1cm4gYS5mbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24oZmFsc2UpOwotCXJldHVybiBudWxsOwotfQotCi1wdWJsaWMgTm90aWZpY2F0aW9uIGZsdXNoUmVmbGVjdGlvblBsdXNJbm5lck5vTm90aWZpY2F0aW9uKFN0cmluZyBzb3VyY2UpIHsKLQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSB0cnVlOwotCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBudWxsOwotCXRyeSB7Ci0JCVN0cmluZyBpbm5lck5hbWUgPSBzb3VyY2UgKyAnJCc7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVmbGVjdGVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTWFwLkVudHJ5IGVudHJ5OwotCQlTdHJpbmcga2V5OwotCQlKYXZhUmVmbGVjdGlvbkFkYXB0b3IgYWRhcHRvcjsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCWlmIChrZXkuZXF1YWxzKHNvdXJjZSkgfHwga2V5LnN0YXJ0c1dpdGgoaW5uZXJOYW1lKSkgewotCQkJCWFkYXB0b3IgPSAoSmF2YVJlZmxlY3Rpb25BZGFwdG9yKSByZWZsZWN0ZWQuZ2V0KGtleSk7Ci0JCQkJaWYgKGFkYXB0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAobm90aWZpY2F0aW9uID09IG51bGwpCi0JCQkJCQlub3RpZmljYXRpb24gPSBhZGFwdG9yLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnlOb05vdGlmaWNhdGlvbihmYWxzZSk7Ci0JCQkJCWVsc2UKLQkJCQkJCSgoTm90aWZpY2F0aW9uQ2hhaW4pIG5vdGlmaWNhdGlvbikuYWRkKGFkYXB0b3IuZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKGZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBmaW5hbGx5IHsKLQkJZmluaXNoZWRJdGVyYXRpbmdSZWZsZWN0ZWQoKTsKLQl9Ci0JcmV0dXJuIG5vdGlmaWNhdGlvbjsKLQotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMi8yMDAwIDM6MDI6MzEgUE0pCi0gKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmFwaS5JSmF2YVByb2plY3QKLSAqLwotcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQlyZXR1cm4gamF2YVByb2plY3Q7Ci19Ci0vKioKLSAqIENyZWF0ZSBhIEphdmEgTW9kZWwgbGlzdGVuZXIgd2hpY2ggd2lsbCBmbHVzaCBpbnZhbGlkYXRlZCBhZGFwdG9ycy4KLSAqIFRoaXMgd2lsbCBjYXVzZSB0aG9zZSBhZGFwdGVycyB0byByZS1yZWZsZWN0IHRoZWlyIHRhcmdldCBvYmplY3QncyBjb250ZW50cy4KLSAqLwotcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVN5bmNocm9uaXplcigpIHsKLQlzeW5jaHJvbml6ZXIgPSBuZXcgSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIodGhpcyk7Ci19Ci0vKioKLSAqIE5vdGlmeSBhbGwgSkRPTUFkYXB0ZXJzIHdoaWNoIHVzZSB0aGUgc2FtZSB0YXJnZXQgSUNvbXBpbGF0aW9uVW5pdAotICogQ3JlYXRpb24gZGF0ZTogKDgvMTcvMjAwMSA0OjQ1OjQzIFBNKQotICovCi1wdWJsaWMgdm9pZCBub3RpZnlDb250ZW50Q2hhbmdlZChJQ29tcGlsYXRpb25Vbml0IHRhcmdldENVKSB7Ci0KLQlpZiAodGFyZ2V0Q1UgPT0gbnVsbCB8fCByZWZsZWN0ZWQudmFsdWVzKCk9PW51bGwpIHJldHVybiA7Ci0JaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkID0gdHJ1ZTsKLQl0cnkgewotCQlJdGVyYXRvciBpID0gcmVmbGVjdGVkLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGEgPSBpLm5leHQoKSA7Ci0JCQlpZiAoYSBpbnN0YW5jZW9mIEpET01BZGFwdG9yKSB7Ci0JCQkJSkRPTUFkYXB0b3IgYWRhcHRvciA9IChKRE9NQWRhcHRvcikgYTsKLQkJCQlJTWVtYmVyIHJlZmxlY3Rpb25Tb3VyY2UgPSAoSU1lbWJlcikgYWRhcHRvci5nZXRSZWZsZWN0aW9uU291cmNlKCk7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCBhZGFwdGVyQ1UgPSBudWxsIDsKLQkJCQlpZiAocmVmbGVjdGlvblNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCSAgIGFkYXB0ZXJDVSA9IHJlZmxlY3Rpb25Tb3VyY2UuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCQl9Ci0JCQkJaWYgKGFkYXB0ZXJDVSAhPSBudWxsICYmIHRhcmdldENVLmVxdWFscyhhZGFwdGVyQ1UpKSB7Ci0JCQkgICAgICAgYWRhcHRvci5jb250ZW50Q2hhbmdlZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZmluYWxseSB7Ci0JCWZpbmlzaGVkSXRlcmF0aW5nUmVmbGVjdGVkKCk7ICAJCi0JfQotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMi8yMDAwIDM6MDI6MzEgUE0pCi0gKiBAcGFyYW0gbmV3SmF2YVByb2plY3Qgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ci0gKi8KLXB1YmxpYyB2b2lkIHNldEphdmFQcm9qZWN0KElKYXZhUHJvamVjdCBuZXdKYXZhUHJvamVjdCkgewotCWphdmFQcm9qZWN0ID0gbmV3SmF2YVByb2plY3Q7Ci0JaWYgKG5ld0phdmFQcm9qZWN0ICE9IG51bGwgJiYgc3luY2hyb25pemVyID09IG51bGwpCi0JCWluaXRpYWxpemVTeW5jaHJvbml6ZXIoKTsKLX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YU1ldGhvZEpET01BZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFNZXRob2RKRE9NQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTdiNThmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YU1ldGhvZEpET01BZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhTWV0aG9kQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5NZXRob2RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlRpbWVyVGVzdHM7Ci0KLS8qKgotICogSmF2YSBNZXRob2QgUmVmbGVjdGlvbiBBZGFwdGVyIGZvciBKRE9NIChpLmUuIEpEVCBtb2RlbCkKLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQyOjUwIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YU1ldGhvZEpET01BZGFwdG9yIGV4dGVuZHMgSkRPTUFkYXB0b3IgaW1wbGVtZW50cyBJSmF2YU1ldGhvZEFkYXB0ZXIgIHsKLQotCS8qCi0JICogU3RlcCBpZHMgdXNlZCBmb3IgVGltZXJUZXN0cyBvZiBwZXJmb3JtYW5jZSB0ZXN0aW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkxFQ1RfTUVUSE9EID0gIlJlZmxlY3QgSkRPTSBNZXRob2QiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgSU1ldGhvZCBzb3VyY2VNZXRob2QgPSBudWxsOwotCi0JcHJvdGVjdGVkIElUeXBlIHBhcmVudFR5cGUgPSBudWxsOwotCi0JcHVibGljIEphdmFNZXRob2RKRE9NQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIElKYXZhUHJvamVjdCB3b3JraW5nUHJvamVjdCkgewotCQlzdXBlcih0YXJnZXQsIHdvcmtpbmdQcm9qZWN0KTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaFJlZmxlY3RlZFZhbHVlcyhib29sZWFuIGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQkJaWYgKGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpCi0JCQljbGVhclNvdXJjZSgpOwotCQlNZXRob2RJbXBsIG1ldGhvZCA9IChNZXRob2RJbXBsKSBnZXRUYXJnZXQoKTsKLQkJbWV0aG9kLnNldElzR2VuZXJhdGVkKGZhbHNlKTsKLQkJbWV0aG9kLnNldEZpbmFsKGZhbHNlKTsKLQkJbWV0aG9kLnNldE5hdGl2ZShmYWxzZSk7Ci0JCW1ldGhvZC5zZXRTdGF0aWMoZmFsc2UpOwotCQltZXRob2Quc2V0U3luY2hyb25pemVkKGZhbHNlKTsKLQkJbWV0aG9kLnNldENvbnN0cnVjdG9yKGZhbHNlKTsKLQkJbWV0aG9kLnNldEFic3RyYWN0KGZhbHNlKTsKLQkJbWV0aG9kLnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCk7Ci0JCW1ldGhvZC5zZXRFVHlwZShudWxsKTsKLQkJbWV0aG9kLmdldFBhcmFtZXRlcnNHZW4oKS5jbGVhcigpOwotCQltZXRob2QuZ2V0SmF2YUV4Y2VwdGlvbnNHZW4oKS5jbGVhcigpOwkJCi0JCXBhcmVudFR5cGUgPSBudWxsOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoYm9vbGVhbiBpc0V4aXN0aW5nKSB7Ci0JCSgoTWV0aG9kSW1wbCkgZ2V0VGFyZ2V0KCkpLnNldFJlZmxlY3RlZChmYWxzZSk7Ci0JCXN1cGVyLnBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGlzRXhpc3RpbmcpOwotCX0JCi0JLyoqCi0JICogYWRkRXhjZXB0aW9ucyAtIHJlZmxlY3Qgb3VyIGV4Y2VwdGlvbiBsaXN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXhjZXB0aW9ucygpIHsKLQkJdHJ5IHsKLQkJCUlNZXRob2Qgc291cmNlTWV0aG9kID0gZ2V0U291cmNlTWV0aG9kKCk7Ci0JCQlTdHJpbmdbXSBleGNlcHRpb25OYW1lcyA9IHNvdXJjZU1ldGhvZC5nZXRFeGNlcHRpb25UeXBlcygpOwotCQkJTGlzdCBleGNlcHRpb25zID0gKChNZXRob2RJbXBsKSBnZXRUYXJnZXQoKSkuZ2V0SmF2YUV4Y2VwdGlvbnNHZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9uTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlleGNlcHRpb25zLmFkZChjcmVhdGVKYXZhQ2xhc3NSZWYodHlwZU5hbWVGcm9tU2lnbmF0dXJlKGV4Y2VwdGlvbk5hbWVzW2ldKSkpOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQkvLyBuYW1lIHN0YXlzIG51bGwgYW5kIHdlIGNhcnJ5IG9uCi0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcmFtZXRlck5hbWVzKCkgewotCQlTdHJpbmdbXSBwYXJtTmFtZXMgPSBuZXcgU3RyaW5nWzBdLCBwYXJtVHlwZU5hbWVzID0gZ2V0U291cmNlTWV0aG9kKCkuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJdHJ5IHsKLQkJCXBhcm1OYW1lcyA9IGdldFNvdXJjZU1ldGhvZCgpLmdldFBhcmFtZXRlck5hbWVzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBucGUpIHsKLQkJCS8vIG5hbWUgc3RheXMgbnVsbCBhbmQgd2UgY2Fycnkgb24KLQkJfQotCQkvLyBUZW1wIGhhY2sgdG8gd29yayBhcm91bmQgYSBKYXZhTW9kZWwgYnVnLCBhYm92ZSBjYWxsIG9uIGEgQmluYXJ5IG1ldGhvZCBtYXkgcmV0dXJuIG51bGwKLQkJaWYgKHBhcm1OYW1lcyA9PSBudWxsIHx8IHBhcm1OYW1lcy5sZW5ndGggPT0gMCkgewotCQkJcGFybU5hbWVzID0gbmV3IFN0cmluZ1twYXJtVHlwZU5hbWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlwYXJtTmFtZXNbaV0gPSAiYXJnIiArIGk7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9CQotCQlyZXR1cm4gcGFybU5hbWVzOwotCX0KLQotCS8qKgotCSAqIGFkZFBhcmFtZXRlcnMgLSByZWZsZWN0IG91ciBwYXJtcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtZXRlcnMoKSB7Ci0JCVN0cmluZ1tdIHBhcm1UeXBlTmFtZXMgPSBnZXRTb3VyY2VNZXRob2QoKS5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlNZXRob2RJbXBsIGphdmFNZXRob2RUYXJnZXQgPSAoTWV0aG9kSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0JCUxpc3QgcGFyYW1zID0gamF2YU1ldGhvZFRhcmdldC5nZXRQYXJhbWV0ZXJzR2VuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFybVR5cGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJcGFyYW1zLmFkZChjcmVhdGVKYXZhUGFyYW1ldGVyKGphdmFNZXRob2RUYXJnZXQsIG51bGwsIHR5cGVOYW1lRnJvbVNpZ25hdHVyZShwYXJtVHlwZU5hbWVzW2ldKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJTb3VyY2UoKSB7Ci0JCXNvdXJjZU1ldGhvZCA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRDb250YWluaW5nSmF2YUNsYXNzKCkgewotCQlyZXR1cm4gKChNZXRob2QpIGdldFRhcmdldCgpKS5nZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0UGFyZW50VHlwZSAtIHJldHVybiB0aGUgSVR5cGUgd2hpY2ggY29ycmVzcG9uZHMgdG8gb3VyIHBhcmVudCBKYXZhQ2xhc3Mgd2UncmUgZ29pbmcgdG8gZG8gdGhpcyBhIGxvdCwgc28gY2FjaGUgaXQuCi0JICovCi0JcHJvdGVjdGVkIElUeXBlIGdldFBhcmVudFR5cGUoKSB7Ci0JCWlmIChwYXJlbnRUeXBlID09IG51bGwpIHsKLQkJCU1ldGhvZCB0YXJnZXRNZXRob2QgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJCWlmKHRhcmdldE1ldGhvZCAhPSBudWxsKXsKLQkJCQlKYXZhQ2xhc3MgcGFyZW50SmF2YUNsYXNzID0gdGFyZ2V0TWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQkJCQlKYXZhQ2xhc3NKRE9NQWRhcHRvciBwYSA9IChKYXZhQ2xhc3NKRE9NQWRhcHRvcikgRWNvcmVVdGlsLmdldEFkYXB0ZXIocGFyZW50SmF2YUNsYXNzLmVBZGFwdGVycygpLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCQkJaWYgKHBhICE9IG51bGwpCi0JCQkJCXBhcmVudFR5cGUgPSBwYS5nZXRTb3VyY2VUeXBlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UGFybVR5cGVTaWduYXR1cmVzIC0gcmV0dXJuIGFuIGFycmF5IG9mIFN0cmluZ3MgKGluIFNpZ25hdHVyZSBmb3JtYXQpIGZvciBvdXIgcGFyYW1ldGVyIHR5cGVzIEZvciByZWZsZWN0aW9uIHB1cnBvc2VzLCB3ZSBjYW4gb25seSByZWx5IG9uCi0JICogb3VyIFVVSUQsIHNpbmNlIG91ciBwYXJtcyBtYXkgbm90IHlldCBiZSBrbm93bi4gc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNvdXJjZU1hcHBlci5jb252ZXJ0VHlwZU5hbWVzVG9TaWdzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGFybVR5cGVTaWduYXR1cmVzKCkgewotCQlNZXRob2QgamF2YU1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQlTdHJpbmdbXSB0eXBlTmFtZXMgPSBnZXRUeXBlTmFtZXNGcm9tTWV0aG9kSUQoKChYTUlSZXNvdXJjZSkgamF2YU1ldGhvZFRhcmdldC5lUmVzb3VyY2UoKSkuZ2V0SUQoamF2YU1ldGhvZFRhcmdldCkpOwotCQlpZiAodHlwZU5hbWVzID09IG51bGwpCi0JCQlyZXR1cm4gZW1wdHlTdHJpbmdBcnJheTsKLQkJaW50IG4gPSB0eXBlTmFtZXMubGVuZ3RoOwotCQlpZiAobiA9PSAwKQotCQkJcmV0dXJuIGVtcHR5U3RyaW5nQXJyYXk7Ci0JCVN0cmluZ1tdIHR5cGVTaWdzID0gbmV3IFN0cmluZ1tuXTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCQkJdHlwZVNpZ3NbaV0gPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZShuZXcgU3RyaW5nKHR5cGVOYW1lc1tpXSksIGdldFBhcmVudFR5cGUoKS5pc0JpbmFyeSgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVTaWdzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZU1ldGhvZCgpOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjaGFzUmVmbGVjdGlvblNvdXJjZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZU1ldGhvZCAhPSBudWxsOwotICAgIH0KLQotCS8qCi0JICogVXNlZCBieSBKYXZhIENsYXNzIEpET00gYWRhcHRlciB0byBjcmVhdGUgYW5kIHNldCB3aXRoIGEgc291cmNlIG1ldGhvZC8KLQkgKi8JCi0JcHVibGljIHZvaWQgcHJpbVNldE1ldGhvZChJTWV0aG9kIG1ldGhvZCkgewotCQlzb3VyY2VNZXRob2QgPSBtZXRob2Q7Ci0JfQotCS8qKgotCSAqIGdldHNvdXJjZU1ldGhvZCAtIHJldHVybiB0aGUgSU1ldGhvZCB3aGljaCBkZXNjcmliZXMgb3VyIGltcGxlbWVudGluZyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgSU1ldGhvZCBnZXRTb3VyY2VNZXRob2QoKSB7Ci0JCWlmICgoc291cmNlTWV0aG9kID09IG51bGwpIHx8ICghc291cmNlTWV0aG9kLmV4aXN0cygpKSkgewotCQkJdHJ5IHsKLQkJCQlJVHlwZSBwYXJlbnQgPSB0aGlzLmdldFBhcmVudFR5cGUoKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nW10gcGFybU5hbWVzID0gdGhpcy5nZXRQYXJtVHlwZVNpZ25hdHVyZXMoKTsKLQkJCQkJc291cmNlTWV0aG9kID0gSkRPTVNlYXJjaEhlbHBlci5zZWFyY2hGb3JNYXRjaGluZ01ldGhvZChwYXJlbnQsICgoTWV0aG9kKSBnZXRUYXJnZXQoKSkuZ2V0TmFtZSgpLCBwYXJtTmFtZXMpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9kbyBub3RoaW5nCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZU1ldGhvZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudFR5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwIGdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gbWV0aG9kLmdldEphdmFDbGFzcygpOwotCQkJaWYgKGphdmFDbGFzcyAhPSBudWxsKSB7Ci0JCQkJSkRPTUFkYXB0b3IgY2xhc3NBZGFwdG9yID0gKEpET01BZGFwdG9yKSByZXRyaWV2ZUFkYXB0b3JGcm9tKGphdmFDbGFzcyk7Ci0JCQkJaWYgKGNsYXNzQWRhcHRvciAhPSBudWxsKQotCQkJCQlyZXR1cm4gY2xhc3NBZGFwdG9yLmdldFR5cGVSZXNvbHV0aW9uQ2FjaGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZUluIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVJbihFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBhdHRyaWJ1dGUpIHsKLQkJLy8gQXQgdGhpcyBwb2ludCwgdGhpcyBhZGFwdGVyIGRvZXMgbm90IGR5bmFtaWNhbGx5IGNvbXB1dGUgYW55IHZhbHVlcywKLQkJLy8gYWxsIHZhbHVlcyBhcmUgcHVzaGVkIGJhY2sgaW50byB0aGUgdGFyZ2V0IG9uIHRoZSBpbml0aWFsIGNhbGwuCi0JCXJldHVybiBzdXBlci5nZXRWYWx1ZUluKG9iamVjdCwgYXR0cmlidXRlKTsKLQl9Ci0KLQkvKioKLQkgKiByZWZsZWN0VmFsdWVzIC0gdGVtcGxhdGUgbWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRlIHRvIHB1bXAgdmFsdWVzIGludG8gdGFyZ2V0LiBvbiBlbnRyeTogVVVJRCwgbmFtZSwgY29udGFpbmluZyBwYWNrYWdlIChhbmQgcXVhbGlmaWVkIG5hbWUpLAotCSAqIGFuZCBkb2N1bWVudCBtdXN0IGJlIHNldC4gTWV0aG9kIGFkYXB0b3I6IC0gc2V0IG1vZGlmaWVycyAtIHNldCBuYW1lIC0gc2V0IHJldHVybiB0eXBlIC0gYWRkIHBhcmFtZXRlcnMgLSBhZGQgZXhjZXB0aW9ucwotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCXN1cGVyLnJlZmxlY3RWYWx1ZXMoKTsKLQkJdHJ5IHsKLQkJCVRpbWVyVGVzdHMuYmFzaWNUZXN0LnN0YXJ0Q3VtdWxhdGl2ZVN0ZXAoUkVGTEVDVF9NRVRIT0QpOwotCQkJaWYgKGlzUmVzb3VyY2VMb2FkZWQoKSAmJiBnZXRTb3VyY2VQcm9qZWN0KCkgIT0gbnVsbCAmJiBnZXRTb3VyY2VNZXRob2QoKSAhPSBudWxsICYmIHNvdXJjZU1ldGhvZC5leGlzdHMoKSkgewotCQkJCXNldE1vZGlmaWVycygpOwotCQkJCXNldE5hbWluZygpOwotCQkJCXNldFJldHVyblR5cGUoKTsKLQkJCQlhZGRQYXJhbWV0ZXJzKCk7Ci0JCQkJYWRkRXhjZXB0aW9ucygpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJVGltZXJUZXN0cy5iYXNpY1Rlc3Quc3RvcEN1bXVsYXRpdmVTdGVwKFJFRkxFQ1RfTUVUSE9EKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBnZW5lcmF0ZWQgZmxhZyBpZiBAZ2VuZXJhdGVkIGlzIGZvdW5kIGluIHRoZSBzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0R2VuZXJhdGVkRmxhZygpIHsKLQkJTWV0aG9kIG1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQl0cnkgewotCQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZU1ldGhvZCgpLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaW50IGluZGV4ID0gc291cmNlLmluZGV4T2YoTWV0aG9kLkdFTkVSQVRFRF9DT01NRU5UX1RBRyk7Ci0JCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJbWV0aG9kVGFyZ2V0LnNldElzR2VuZXJhdGVkKHRydWUpOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFcnJvcl9TZXR0aW5nX0dlbkZsYWdfRVJST1JfIiwgbmV3IE9iamVjdFtdCi0JCQkvLyB7KChYTUlSZXNvdXJjZSltZXRob2RUYXJnZXQuZVJlc291cmNlKCkpLmdldElEKG1ldGhvZFRhcmdldCksIG5wZS5nZXRNZXNzYWdlKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiZXJyb3Igc2V0dGluZyB0aGUgZ2VuZXJhdGVkIGZsYWcgb24KLQkJCS8vIHswfSwgZXhjZXB0aW9uOiB7MX0iCi0JCX0KLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YU1ldGhvZEFkYXB0ZXIjcmVmbGVjdEdlbmVyYXRlZElmTmVjZXNzYXJ5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0R2VuZXJhdGVkSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChyZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKSkgewotCQkJc2V0R2VuZXJhdGVkRmxhZygpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0UGFyYW1OYW1lc0lmTmVjZXNzYXJ5KCkgewotCQlpZiAocmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCkpIHsKLQkJCVN0cmluZyBbXSBwYXJhbU5hbWVzID0gZ2V0UGFyYW1ldGVyTmFtZXMoKTsKLQkJCUxpc3QgcGFyYW0gPSAoKE1ldGhvZEltcGwpZ2V0VGFyZ2V0KCkpLmdldFBhcmFtZXRlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCSgoSmF2YVBhcmFtZXRlcilwYXJhbS5nZXQoaSkpLnNldE5hbWUocGFyYW1OYW1lc1tpXSk7CQkJCQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBzZXRNb2RpZmllcnMgLSBzZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgcmVsYXRlZCB0byBtb2RpZmllcnMgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGlmaWVycygpIHsKLQkJTWV0aG9kIG1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQl0cnkgewotCQkJbWV0aG9kVGFyZ2V0LnNldEZpbmFsKEZsYWdzLmlzRmluYWwoZ2V0U291cmNlTWV0aG9kKCkuZ2V0RmxhZ3MoKSkpOwotCQkJbWV0aG9kVGFyZ2V0LnNldE5hdGl2ZShGbGFncy5pc05hdGl2ZShnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSk7Ci0JCQltZXRob2RUYXJnZXQuc2V0U3RhdGljKEZsYWdzLmlzU3RhdGljKGdldFNvdXJjZU1ldGhvZCgpLmdldEZsYWdzKCkpKTsKLQkJCW1ldGhvZFRhcmdldC5zZXRTeW5jaHJvbml6ZWQoRmxhZ3MuaXNTeW5jaHJvbml6ZWQoZ2V0U291cmNlTWV0aG9kKCkuZ2V0RmxhZ3MoKSkpOwotCQkJbWV0aG9kVGFyZ2V0LnNldENvbnN0cnVjdG9yKGdldFNvdXJjZU1ldGhvZCgpLmlzQ29uc3RydWN0b3IoKSk7Ci0KLQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBnZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0JCQkvL1NldCBhYnN0cmFjdAotCQkJaWYgKGphdmFDbGFzcy5nZXRLaW5kKCkuZ2V0VmFsdWUoKSA9PSBUeXBlS2luZC5JTlRFUkZBQ0UpCi0JCQkJbWV0aG9kVGFyZ2V0LnNldEFic3RyYWN0KHRydWUpOwotCQkJZWxzZQotCQkJCW1ldGhvZFRhcmdldC5zZXRBYnN0cmFjdChGbGFncy5pc0Fic3RyYWN0KGdldFNvdXJjZU1ldGhvZCgpLmdldEZsYWdzKCkpKTsKLQkJCS8vIFNldCB2aXNpYmlsaXR5Ci0JCQlpZiAoamF2YUNsYXNzLmdldEtpbmQoKS5nZXRWYWx1ZSgpID09IFR5cGVLaW5kLklOVEVSRkFDRSB8fCBGbGFncy5pc1B1YmxpYyhnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSkKLQkJCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBVQkxJQ19MSVRFUkFMKTsKLQkJCWVsc2UgaWYgKEZsYWdzLmlzUHJpdmF0ZShnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSkKLQkJCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBSSVZBVEVfTElURVJBTCk7Ci0JCQllbHNlIGlmIChGbGFncy5pc1Byb3RlY3RlZChnZXRTb3VyY2VNZXRob2QoKS5nZXRGbGFncygpKSkKLQkJCQltZXRob2RUYXJnZXQuc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kLlBST1RFQ1RFRF9MSVRFUkFMKTsKLQkJCWVsc2UKLQkJCQkvL1Zpc2liaWxpdHkgbXVzdCBiZSBwYWNrYWdlCi0JCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QQUNLQUdFX0xJVEVSQUwpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKFJlc291cmNlSGFuZGxlcgotCQkJCQkJCS5nZXRTdHJpbmcoCi0JCQkJCQkJCQkiRXJyb3JfSW50cm9zcGVjdGluZ19GbGFnc19FUlJPUl8iLCAobmV3IE9iamVjdFtdIHsgKChYTUlSZXNvdXJjZSkgbWV0aG9kVGFyZ2V0LmVSZXNvdXJjZSgpKS5nZXRJRChtZXRob2RUYXJnZXQpLCBucGUuZ2V0TWVzc2FnZSgpfSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJlcnJvciBpbnRyb3NwZWN0aW5nIGZsYWdzIG9uIHswfSwgZXhjZXB0aW9uOiB7MX0iCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXROYW1pbmcgLSBzZXQgdGhlIG5hbWluZyB2YWx1ZXMgaGVyZSAtIHF1YWxpZmllZCBuYW1lIG11c3QgYmUgc2V0IGZpcnN0LCB0aGF0IGlzIHRoZSBwYXRoIHRvIHRoZSByZWFsIEphdmEgY2xhc3MgLSBJRCAtIG5hbWUtYmFzZWQgVVVJRAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWluZygpIHsKLQkJLy8KLQkJLy8JbmFtaW5nIGlzIGN1cnJlbnRseSBhIG5vLW9wIHNpbmNlIHRoZSBuYW1lIGFuZCBVVUlEIG11c3QgYmUgc2V0IHByaW9yIHRvIHJlZmxlY3Rpb24KLQkJLy8JLi4uYW5kIElEIGlzIHJlZHVuZGFudCB3aXRoIFVVSUQuCi0JCS8vCWphdmFGaWVsZFRhcmdldC5zZXRJRChwYXJlbnQuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIl8iICsgamF2YUZpZWxkVGFyZ2V0LmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogc2V0VHlwZSAtIHNldCBvdXIgcmV0dXJuIHR5cGUgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJldHVyblR5cGUoKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0eXBlTmFtZSA9IHR5cGVOYW1lRnJvbVNpZ25hdHVyZShnZXRTb3VyY2VNZXRob2QoKS5nZXRSZXR1cm5UeXBlKCkpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gbnBlKSB7Ci0JCQkvLyBuYW1lIHN0YXlzIG51bGwgYW5kIHdlIGNhcnJ5IG9uCi0JCX0KLQkJaWYgKHR5cGVOYW1lICE9IG51bGwpIHsKLQkJCU1ldGhvZCBqYXZhTWV0aG9kVGFyZ2V0ID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCQlqYXZhTWV0aG9kVGFyZ2V0LnNldEVUeXBlKGNyZWF0ZUphdmFDbGFzc1JlZih0eXBlTmFtZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMy8yMDAxIDEwOjA4OjM0IEFNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdTb3VyY2VNZXRob2QKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VNZXRob2Qob3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZCBuZXdTb3VyY2VNZXRob2QpIHsKLQkJc291cmNlTWV0aG9kID0gbmV3U291cmNlTWV0aG9kOwotCX0KLQkKLQkvKgotCSAqIE92ZXJyaWRlIHRvIHRvbGVyYXRlIEpESyA1IHZhcmlhYmxlIHR5cGVzLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSkRPTUFkYXB0b3IjdHlwZU5hbWVGcm9tU2lnbmF0dXJlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlTmFtZUZyb21TaWduYXR1cmUoU3RyaW5nIHR5cGVTaWduYXR1cmUpIHsKLQkJU3RyaW5nIGVyYXN1cmUgPSBudWxsOwotCQl0cnkgewotCQkJZXJhc3VyZSA9IFNpZ25hdHVyZS5nZXRUeXBlRXJhc3VyZSh0eXBlU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vVGhlIHNpZ25hdHVyZSBpcyBub3QgdGhlIGNvcnJlY3QgZm9ybWF0IGZvciBhIHZhcmlhYmxlLgotCQl9Ci0JCWlmIChlcmFzdXJlICE9IG51bGwpIHsKLQkJCVN0cmluZyB2YXJpYWJsZU5hbWUgPSBudWxsOwotCQkJU3RyaW5nIHJlc29sdmVkVmFyaWFibGUgPSBudWxsOwotCQkJCi0JCQlpbnQgYXJyYXlDb3VudCA9IFNpZ25hdHVyZS5nZXRBcnJheUNvdW50KGVyYXN1cmUpOwotCQkJaWYgKGFycmF5Q291bnQgPiAwKSB7Ci0JCQkJLy9XZSBoYXZlIGFuIGFycmF5LiAgQ2hlY2sgaWYgdGhlIGVsZW1lbnQgdHlwZSBpcyBhIHZhcmlhYmxlLgotCQkJCVN0cmluZyBlbGVtZW50VHlwZU5hbWUgPSBTaWduYXR1cmUuZ2V0RWxlbWVudFR5cGUoZXJhc3VyZSk7Ci0JCQkJdmFyaWFibGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKGVsZW1lbnRUeXBlTmFtZSk7Ci0JCQkJcmVzb2x2ZWRWYXJpYWJsZSA9IHJlc29sdmVWYXJpYWJsZU5hbWUoZXJhc3VyZSwgdmFyaWFibGVOYW1lKTsKLQkJCQlpZiAocmVzb2x2ZWRWYXJpYWJsZSAhPSBudWxsKSB7Ci0JCQkJCS8vQWRkIGFycmF5IGluZm8uCi0JCQkJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcihyZXNvbHZlZFZhcmlhYmxlKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUNvdW50OyBpKyspIHsKLQkJCQkJCWIuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmVzb2x2ZWRWYXJpYWJsZSA9IGIudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXZhcmlhYmxlTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyhlcmFzdXJlKTsKLQkJCQkvL05lZWQgdG8gcmVzb2x2ZSB0aGUgdmFyaWFibGUuCi0JCQkJcmVzb2x2ZWRWYXJpYWJsZSA9IHJlc29sdmVWYXJpYWJsZU5hbWUoZXJhc3VyZSwgdmFyaWFibGVOYW1lKTsKLQkJCX0KLQkJCWlmIChyZXNvbHZlZFZhcmlhYmxlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gc3VwZXIudHlwZU5hbWVGcm9tU2lnbmF0dXJlKGVyYXN1cmUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gcmVzb2x2ZWRWYXJpYWJsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIudHlwZU5hbWVGcm9tU2lnbmF0dXJlKHR5cGVTaWduYXR1cmUpOwotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVZhcmlhYmxlTmFtZShTdHJpbmcgZXJhc3VyZSwgU3RyaW5nIHZhcmlhYmxlTmFtZSkgewotCQlJTWV0aG9kIG1ldGhvZCA9IGdldFNvdXJjZU1ldGhvZCgpOwotCQlJVHlwZVBhcmFtZXRlcltdIHR5cGVQYXJhbWV0ZXJzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXR5cGVQYXJhbWV0ZXJzID0gbWV0aG9kLmdldFR5cGVQYXJhbWV0ZXJzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlMSkgewotCQkJLy9GYWlsZWQgdG8gcmV0cmlldmUgdHlwZSBwYXJhbWV0ZXJzIGZvciBhbnkgbnVtYmVyIG9mIHJlYXNvbnMuCi0JCX0KLQkJSVR5cGVQYXJhbWV0ZXIgdHlwZVBhcmFtID0gbnVsbDsKLQkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwgJiYgdHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh0eXBlUGFyYW1ldGVyc1tpXS5leGlzdHMoKSAmJiB2YXJpYWJsZU5hbWUuZXF1YWxzKHR5cGVQYXJhbWV0ZXJzW2ldLmdldEVsZW1lbnROYW1lKCkpKSB7Ci0JCQkJCXR5cGVQYXJhbSA9IHR5cGVQYXJhbWV0ZXJzW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodHlwZVBhcmFtICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBib3VuZHMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWJvdW5kcyA9IHR5cGVQYXJhbS5nZXRCb3VuZHMoKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkge30KLQkJCQlpZiAoYm91bmRzICE9IG51bGwgJiYgYm91bmRzLmxlbmd0aCA+IDApIHsKLQkJCQkJcmV0dXJuIEpET01TZWFyY2hIZWxwZXIuZ2V0UmVzb2x2ZWRUeXBlTmFtZShib3VuZHNbMF0sIGdldFR5cGUoKSwgZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gImphdmEubGFuZy5PYmplY3QiOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlKYXZhRWxlbWVudCBwYXJlbnQgPSBtZXRob2QuZ2V0UGFyZW50KCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJVHlwZSkKLQkJewotCQkJdHJ5IHsKLQkJCQl0eXBlUGFyYW1ldGVycyA9ICgoSVR5cGUpcGFyZW50KS5nZXRUeXBlUGFyYW1ldGVycygpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy9GYWlsZWQgdG8gcmV0cmlldmUgdHlwZSBwYXJhbWV0ZXJzIGZvciBhbnkgbnVtYmVyIG9mIHJlYXNvbnMuCi0JCQl9Ci0JCX0KLQkJaWYgKHR5cGVQYXJhbWV0ZXJzICE9IG51bGwgJiYgdHlwZVBhcmFtZXRlcnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh0eXBlUGFyYW1ldGVyc1tpXS5leGlzdHMoKSAmJiB2YXJpYWJsZU5hbWUuZXF1YWxzKHR5cGVQYXJhbWV0ZXJzW2ldLmdldEVsZW1lbnROYW1lKCkpKSB7Ci0JCQkJCXR5cGVQYXJhbSA9IHR5cGVQYXJhbWV0ZXJzW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodHlwZVBhcmFtICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBib3VuZHMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWJvdW5kcyA9IHR5cGVQYXJhbS5nZXRCb3VuZHMoKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkge30KLQkJCQlpZiAoYm91bmRzICE9IG51bGwgJiYgYm91bmRzLmxlbmd0aCA+IDApIHsKLQkJCQkJcmV0dXJuIEpET01TZWFyY2hIZWxwZXIuZ2V0UmVzb2x2ZWRUeXBlTmFtZShib3VuZHNbMF0sIGdldFR5cGUoKSwgZ2V0VHlwZVJlc29sdXRpb25DYWNoZSgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gImphdmEubGFuZy5PYmplY3QiOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFNb2RlbExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9hZGFwdGVycy9qZG9tL0phdmFNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNTA4YzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhTW9kZWxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tOwotLyoKLQotCi0gKi8KLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvMzEvMjAwMCAxOjEzOjEyIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmF2YU1vZGVsTGlzdGVuZXJ9IGluc3RlYWQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhTW9kZWxMaXN0ZW5lciBleHRlbmRzIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KYXZhTW9kZWxMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgSmF2YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGV2ZW50c1RvTGlzdGVuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIEphdmFNb2RlbExpc3RlbmVyKGludCBldmVudHNUb0xpc3RlbikgewotCQlzdXBlcihldmVudHNUb0xpc3Rlbik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhUmVmbGVjdGlvblN5bmNocm9uaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYWRhcHRlcnMvamRvbS9KYXZhUmVmbGVjdGlvblN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWFkNWI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2FkYXB0ZXJzL2pkb20vSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb207Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnBsdWdpbi5KYXZhUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkphdmFNb2RlbExpc3RlbmVyOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTEvMS8yMDAwIDExOjQyOjA1IEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIgZXh0ZW5kcyBKYXZhTW9kZWxMaXN0ZW5lciB7Ci0JCi0JcHJvdGVjdGVkIEphdmFKRE9NQWRhcHRlckZhY3RvcnkgZkFkYXB0ZXJGYWN0b3J5OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hlZEFsbCA9IGZhbHNlOwotCXByb3RlY3RlZCBMaXN0IGZsdXNoVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIExpc3QgZmx1c2hUeXBlUGx1c0lubmVyID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBMaXN0IG5vdGlmaWNhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLyoqCi0JICogSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIoSmF2YUpET01BZGFwdGVyRmFjdG9yeSBzeW5jaHJvbml6ZWUpIHsKLQkJc3VwZXIoKTsKLQkJZkFkYXB0ZXJGYWN0b3J5ID0gc3luY2hyb25pemVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhTW9kZWxMaXN0ZW5lciNnZXRKYXZhUHJvamVjdCgpCi0JICovCi0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXJGYWN0b3J5KCkuZ2V0SmF2YVByb2plY3QoKTsKLQl9CQotCS8qKgotCSAqIFRlbGwgdGhlIHJlZmxlY3Rpb24gZmFjdG9yeSB0byBmbHVzaCB0aGUgcGFzc2VkIElUeXBlCi0JICovCi0JcHJvdGVjdGVkIE5vdGlmaWNhdGlvbiBkb0ZsdXNoKElUeXBlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXJGYWN0b3J5KCkuZmx1c2hSZWZsZWN0aW9uTm9Ob3RpZmljYXRpb24oZWxlbWVudC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JfQotCQotCS8qCi0JICogRmx1c2ggdGhlIGNvbXBpbGF0aW9uIHVuaXQgYW5kIGFueSBpbm5lciBjbGFzc2VzIHNpbmNlIHdlIGRvbid0IGlmIHRoZXkgbWF5IG9yIG1heSBub3Qgb2YgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgTm90aWZpY2F0aW9uIGRvRmx1c2goSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyRmFjdG9yeSgpLmZsdXNoUmVmbGVjdGlvblBsdXNJbm5lck5vTm90aWZpY2F0aW9uKGdldEZ1bGxOYW1lRnJvbUVsZW1lbnQoZWxlbWVudCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBmbHVzaChJVHlwZSBlbGVtZW50KSB7Ci0JCWlmICghZmx1c2hUeXBlcy5jb250YWlucyhlbGVtZW50KSkKLQkJCWZsdXNoVHlwZXMuYWRkKGVsZW1lbnQpOwotCX0KLQkvKgotCSAqIGZsdXNoIHRoZSBjb21waWxhdGlvbiB1bml0LiBTaW5jZSB3ZSBkb24ndCBrbm93IGlmIGlubmVyIGNsYXNzZXMgbWF5IGFsc28KLQkgKiBvZiBiZWVuIGFmZmVjdGVkLCB0aGV5IHRvIHdpbGwgYmUgZmx1c2hlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmbHVzaChJQ29tcGlsYXRpb25Vbml0IGVsZW1lbnQpIHsKLQkJaWYgKCFmbHVzaFR5cGVQbHVzSW5uZXIuY29udGFpbnMoZWxlbWVudCkpCi0JCQlmbHVzaFR5cGVQbHVzSW5uZXIuYWRkKGVsZW1lbnQpOwkJCi0JfQotCXByb3RlY3RlZCB2b2lkIGZsdXNoUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIGJvb2xlYW4gbm9GbHVzaElmU291cmNlRm91bmQpIHsKLQkJbm90aWZpY2F0aW9ucy5hZGRBbGwoZ2V0QWRhcHRlckZhY3RvcnkoKS5mbHVzaFBhY2thZ2VOb05vdGlmaWNhdGlvbihwYWNrYWdlTmFtZSwgbm9GbHVzaElmU291cmNlRm91bmQpKTsKLQl9Ci0JcHJvdGVjdGVkIEphdmFKRE9NQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBmQWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY2hhbmdlIGZvciBhIHNpbmdsZSBlbGVtZW50LCBjaGlsZHJlbiB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEIDogewotCQkJCS8vIEEgZmlsZSBzYXZlIGhhZCBvY2N1cnJlZC4gSXQgZG9lc24ndCBtYXR0ZXIgaWYgY3VycmVudGx5IHdvcmtpbmcgY29weSBvciBub3QuCi0JCQkJLy8gSXQgbWVhbnMgc29tZXRoaW5nIGhhcyBjaGFuZ2VkIHRvIHRoZSBmaWxlIG9uIGRpc2ssIGJ1dCBkb24ndCBrbm93IHdoYXQuCi0JCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1JFU09VUkNFKSAhPSAwKSB7Ci0JCQkJCWZsdXNoKGVsZW1lbnQpOwkvLyBGbHVzaCBldmVyeXRoaW5nLCBpbmNsdWRpbmcgaW5uZXIgY2xhc3Nlcy4JCQkJCQotCQkJCX0gZWxzZSBpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NPTlRFTlQpID09IDAgJiYgCi0JCQkJCQkoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pICE9IDApICAvL0EgdHlwZSBtYXkgaGF2ZSBiZWVuIGFkZGVkIG9yIHJlbW92ZWQuCi0JCQkJCXByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgOgotCQkJY2FzZSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCA6Ci0JCQkJaWYgKCFlbGVtZW50LmlzV29ya2luZ0NvcHkoKSkKLQkJCQkJZGlzQXNzb2NpYXRlU291cmNlUGx1c0lubmVyKGdldEZ1bGxOYW1lRnJvbUVsZW1lbnQoZWxlbWVudCkpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY2hhbmdlIGZvciBhIHNpbmdsZSBlbGVtZW50LCBjaGlsZHJlbiB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUphdmFQcm9qZWN0IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChpc0luQ2xhc3NwYXRoKGVsZW1lbnQpKSB7Ci0JCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgfHwgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEICYmIChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTE9TRUQpICE9IDApKSB7Ci0JCQkJaWYgKGVsZW1lbnQuZXF1YWxzKGdldEFkYXB0ZXJGYWN0b3J5KCkuZ2V0SmF2YVByb2plY3QoKSkpCi0JCQkJCXN0b3BTeW5jaHJvbml6ZXIoKTsKLQkJCQllbHNlCi0JCQkJCWZsdXNoQWxsKCk7IC8vYW5vdGhlciBkZXBlbmRlbnQgcHJvamVjdCBoYXMgY2hhbmdlZCBzbyBmbHVzaCBhbGwgdG8gYmUgc2FmZQotCQkJCXJldHVybjsKLQkJCX0gZWxzZSBpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEIHx8IGlzQ2xhc3NwYXRoUmVzb3VyY2VDaGFuZ2UoZGVsdGEpKSB7Ci0JCQkJZmx1c2hBbGwoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotCQl9Ci0JfQotCS8qKgotCSAqIEhhbmRsZSB0aGUgY2hhbmdlIGZvciBhIHNpbmdsZSBlbGVtZW50LCBjaGlsZHJlbiB3aWxsIGJlIGhhbmRsZWQgc2VwYXJhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElDbGFzc0ZpbGUgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCWlmIChraW5kID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQgfHwga2luZCA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCkgewotCQkJLy8gSXQgZG9lc24ndCBtYXR0ZXIgaWYgdG90YWxseSByZW1vdmVkIG9yIGp1c3QgbW92ZWQgc29tZXdoZXJlIGVsc2UsIHdlIHdpbGwgY2xlYXIgb3V0IGFuZCByZW1vdmUgdGhlCi0JCQkvLyBhZGFwdGVyIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgYSByZW5hbWUgd2hpY2ggd291bGQgYmUgYSBkaWZmZXJlbnQgY2xhc3MuCi0JCQkvLyBDdXJyZW50bHkgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBkZWxldGVkIGFuZCB0aGVyZSBpcyBubyB3YXkgdG8gZmluZCB0aGUgdHlwZXMgaW4gdGhlIHVuaXQgdG8gcmVtb3ZlLgotCQkJLy8gU28gaW5zdGVhZCB3ZSBhc2sgZmFjdG9yeSB0byByZW1vdmUgYWxsIGl0IGFueSB0aGF0IHN0YXJ0IHdpdGggaXQgcGx1cyBmb3IgaW5uZXIgY2xhc3Nlcy4KLQkJCWRpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihnZXRGdWxsTmFtZUZyb21FbGVtZW50KGVsZW1lbnQpKTsKLQkJCXJldHVybjsgLy8gU2luY2UgdGhlIGNsYXNzZmlsZSB3YXMgcmVtb3ZlZCB3ZSBkb24ndCBuZWVkIHRvIHByb2Nlc3MgdGhlIGNoaWxkcmVuIChhY3R1YWxseSB0aGUgY2hpbGRyZW4gbGlzdCB3aWxsIGJlIGVtcHR5Ci0JCX0KLQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IGNoaWxkcmVuLmxlbmd0aDsgaWkrKykgewotCQkJcHJvY2Vzc0RlbHRhKGNoaWxkcmVuW2lpXSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJUGFja2FnZUZyYWdtZW50Um9vdCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpZiAoZmx1c2hlZEFsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQ2xhc3NQYXRoQ2hhbmdlKGRlbHRhKSkKLQkJCWZsdXNoQWxsKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLnByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoZWxlbWVudCwgZGVsdGEpOwotCX0KLQkKLQkvKiAKLQkgKiBXZSB3aWxsIGZvcmNlIHRoZSBmbHVzaGluZyBvZiBhbGwgYWRhcHRvcnMgZm9yIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUuCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgaWYgYSB0eXBlIHdhcyByZWZsZWN0ZWQgcHJpb3IgdG8gdGhlIHBhY2thZ2UgZXhpc3Rpbmcgb3IKLQkgKiBpZiB0aGUgcGFja2FnZSBpcyBkZWxldGVkLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50LCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuQURERUQgOiAKLQkJCQkvLyBFdmVuIHRob3VnaCBhZGRlZCB0aGVyZSBpcyBwb3NzaWJpbGl0eSB0aGF0IHBhY2thZ2UgZXhpc3RzIGluIG90aGVyIHJvb3QgYnV0IHRoaXMKLQkJCQkvLyBvbmUgbWF5IG5vdyB0YWtlIHByaW9yaXR5LCBzbyB3ZSB3aWxsIGNsZWFyIHRoZSBwYWNrYWdlIGFueXdheS4KLQkJCQlmbHVzaFBhY2thZ2UoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCksIGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCA6Ci0JCQkJZ2V0QWRhcHRlckZhY3RvcnkoKS5mbHVzaFBhY2thZ2UoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCksIGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXN1cGVyLnByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoZWxlbWVudCwgZGVsdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIHRoZSBjaGFuZ2UgZm9yIGEgc2luZ2xlIGVsZW1lbnQsIGNoaWxkcmVuIHdpbGwgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJVHlwZSBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJaWYgKGtpbmQgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCB8fCBraW5kID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKSB7Ci0JCQlkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoZWxlbWVudC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmbHVzaChlbGVtZW50KTsKLQkJCXByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JCQkvLyBOb3RlLCBpZiBhIG1ldGhvZCBlbGVtZW50IG9yIGEgZmllbGQgd2FzIGNoYW5nZWQsIHRoZXJlIG1heSBiZSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkKLQkJCS8vICAgICAgIHRoYXQgd2lsbCBoYXZlIHRvIGJlIHByb2Nlc3NlZCBpZiB3ZSBhcmUgdG8gdXBkYXRlIHRoZSBKYXZhTWV0aG9kL0phdmFGaWVsZCBKRE9NQWRhcHRvciBzLgkKLQkJfQotCX0KLQkvKioKLQkgKiBHaXZlbiB0aGF0IGFuIElUeXBlIGRvZXMgbm90IGV4aXN0cyBhbnltb3JlLCBhc3N1bWUKLQkgKiB0aGF0IHRoZSB0eXBlJ3MgbmFtZSBpcyBwYWNrYWdlLmZpbGVuYW1lICh3aXRob3V0IHRoZSAuamF2YSkKLQkgKiBJZiB3ZSBhcmUgd3JvbmcgKGlmLCB0aGVuIGEgcmFyZSBjYXNlKSwgIHdlIHdpbGwgZmx1c2guCi0JICogTmV4dCBhY2Nlc3Mgd2lsbCBpbmR1Y2UgYSByZWZsZWN0aW9uIGF0dGVtcHQuCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBkb2Vzbid0IGxvb2sgbGlrZSBpdCBpcyBldmVyIGNhbGxlZC4gSXQgc29tZW9uZSBlbHNlIGNhbGxzIGl0LCBwbGVhc2UgY29udGFjdCBkZXZlbG9wbWVudCB0byBzZWUgaWYgcmlnaHQgbWV0aG9kIHRvIGJlIGNhbGxlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUmVtb3ZlT3JBZGQoSUNvbXBpbGF0aW9uVW5pdCBlbGVtZW50KSB7Ci0JCWRpc0Fzc29jaWF0ZVNvdXJjZShnZXRGdWxsTmFtZUZyb21FbGVtZW50KGVsZW1lbnQpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGdWxsTmFtZUZyb21FbGVtZW50KElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJSVR5cGUgcHJpbWFyeSA9IGN1LmZpbmRQcmltYXJ5VHlwZSgpOwotCQlpZiAocHJpbWFyeSAhPSBudWxsKQotCQkJcmV0dXJuIHByaW1hcnkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCWVsc2UgewotCQkJU3RyaW5nIGZpbGVuYW1lID0gY3UuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCS8vIEp1c3Qgc3RyaXAgb2ZmIGV4dGVuc2lvbi4gVGhlcmUgaXMgYWN0dWFsbHkgYSBtb3JlIGNvbXBsaWNhdGVkIHRlc3QgZm9yICJqYXZhIGxpa2UgZXh0ZW5zdGlvbnMiIGJ1dCBKRFQgaGFzIHRoYXQgaGlkZGVuXAotCQkJLy8gc28gd2Ugd2lsbCBqdXN0IGd1ZXNzIGFuZCB0YWtlIG9mZiB0aGUgZXh0ZW5zaW9uLgotCQkJaW50IGlkeCA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQlpZiAoaWR4ICE9IC0xKQotCQkJCWZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGlkeCk7Ci0JCQlyZXR1cm4gKChJUGFja2FnZUZyYWdtZW50KSBjdS5nZXRQYXJlbnQoKSkuZ2V0RWxlbWVudE5hbWUoKSsnLicrZmlsZW5hbWU7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGdWxsTmFtZUZyb21FbGVtZW50KElDbGFzc0ZpbGUgY2YpIHsKLQkJCi0JCXJldHVybiBjZi5nZXRUeXBlKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGxOYW1lRnJvbUVsZW1lbnQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA8PSA1IHx8ICFuYW1lLnN1YnN0cmluZyhuYW1lLmxlbmd0aCgpIC0gNSkuZXF1YWxzKCIuamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFNob3VsZCBub3QgYmUgaGVyZSwgCi0JCQlMb2dnZXIgbG9nZ2VyID0gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKQotCQkJCWxvZ2dlci5sb2coIkludmFsaWQgLmphdmEgZmlsZTogIiArIG5hbWUsIExldmVsLkZJTkUpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBNYWtlIGEgZ3Vlc3MsIGF0IHdvcnN0IGNhc2UsIG5vdGhpbmcgd2lsbCBjb21lIG91dCBvZiB0aGlzLgotCQkJaW50IGluZGV4ID0gbmFtZS5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5kZXggPj0gMCkKLQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpICsgIi5qYXZhIjsgLy8gcmVuYW1lIHRoZSBleHRlbnNpb24gdG8gLmphdmEgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCW5hbWUgPSBuYW1lICsgIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlbGVtZW50LmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkgPT0gbnVsbCB8fCBlbGVtZW50LmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gNSk7Ci0JCWVsc2UKLQkJCXJldHVybiBlbGVtZW50LmdldFBhcmVudCgpLmdldEVsZW1lbnROYW1lKCkgKyAiLiIgKyBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gNSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqCi0JICogU3RvcCB0aGUgc3luY2hyb25pemVyIGZyb20gbGlzdGVuaW5nIHRvIGFueSBtb3JlIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcFN5bmNocm9uaXplcigpIHsKLQkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhTW9kZWxMaXN0ZW5lciNlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJdHJ5IHsKLQkJCWZsdXNoVHlwZXMuY2xlYXIoKTsKLQkJCWZsdXNoVHlwZVBsdXNJbm5lci5jbGVhcigpOwotCQkJbm90aWZpY2F0aW9ucy5jbGVhcigpOwotCQkJc3VwZXIuZWxlbWVudENoYW5nZWQoZXZlbnQpOwotCQkJZmx1c2hUeXBlcygpOwotCQkJcHJvY2Vzc05vdGlmaWNhdGlvbnMoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZsdXNoZWRBbGwgPSBmYWxzZTsKLQkJCWZsdXNoVHlwZXMuY2xlYXIoKTsKLQkJCWZsdXNoVHlwZVBsdXNJbm5lci5jbGVhcigpOwotCQkJbm90aWZpY2F0aW9ucy5jbGVhcigpOwotCQl9Ci0JfQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBmbHVzaFR5cGVzKCkgewotCQlpZiAoIWZsdXNoVHlwZXMuaXNFbXB0eSgpKSB7Ci0JCQlJVHlwZSB0eXBlID0gbnVsbDsKLQkJCU5vdGlmaWNhdGlvbiBub3Q7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZsdXNoVHlwZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQl0eXBlID0gKElUeXBlKSBmbHVzaFR5cGVzLmdldChpKTsKLQkJCQlub3QgPSBkb0ZsdXNoKHR5cGUpOwotCQkJCWlmIChub3QgIT0gbnVsbCkKLQkJCQkJbm90aWZpY2F0aW9ucy5hZGQobm90KTsKLQkJCX0KLQkJfQotCQlpZiAoIWZsdXNoVHlwZVBsdXNJbm5lci5pc0VtcHR5KCkpIHsKLQkJCUlDb21waWxhdGlvblVuaXQgdW5pdCA9IG51bGw7Ci0JCQlOb3RpZmljYXRpb24gbm90OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbHVzaFR5cGVQbHVzSW5uZXIuc2l6ZSgpOyBpKyspIHsKLQkJCQl1bml0ID0gKElDb21waWxhdGlvblVuaXQpIGZsdXNoVHlwZVBsdXNJbm5lci5nZXQoaSk7Ci0JCQkJbm90ID0gZG9GbHVzaCh1bml0KTsKLQkJCQlpZiAobm90ICE9IG51bGwpCi0JCQkJCW5vdGlmaWNhdGlvbnMuYWRkKG5vdCk7Ci0JCQl9Ci0JCX0JCQotCX0KLQkvKioKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzTm90aWZpY2F0aW9ucygpIHsKLQkJTm90aWZpZXIgbm90aWZpZXI7Ci0JCU5vdGlmaWNhdGlvbiBub3Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm90aWZpY2F0aW9ucy5zaXplKCk7IGkrKykgewotCQkJbm90ID0gKE5vdGlmaWNhdGlvbikgbm90aWZpY2F0aW9ucy5nZXQoaSk7Ci0JCQlub3RpZmllciA9IChOb3RpZmllcikgbm90LmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAobm90aWZpZXIgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlub3RpZmllci5lTm90aWZ5KG5vdCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nKGUpOyAvL2NhdGNoIGV4Y2VwdGlvbnMgc28gYWxsIG5vdGlmaWNhdGlvbnMgYXJlIHByb2Nlc3NlZAotCQkJCX0gCi0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZGlzQXNzb2NpYXRlU291cmNlKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCU5vdGlmaWNhdGlvbiBub3QgPSBnZXRBZGFwdGVyRmFjdG9yeSgpLmRpc0Fzc29jaWF0ZVNvdXJjZShxdWFsaWZpZWROYW1lLCBmYWxzZSk7Ci0JCWlmIChub3QgIT0gbnVsbCkKLQkJCW5vdGlmaWNhdGlvbnMuYWRkKG5vdCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlOb3RpZmljYXRpb24gbm90ID0gZ2V0QWRhcHRlckZhY3RvcnkoKS5kaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIocXVhbGlmaWVkTmFtZSwgZmFsc2UpOwotCQlpZiAobm90ICE9IG51bGwpCi0JCQlub3RpZmljYXRpb25zLmFkZChub3QpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBmbHVzaEFsbCgpIHsKLQkJbm90aWZpY2F0aW9ucy5hZGRBbGwoZ2V0QWRhcHRlckZhY3RvcnkoKS5mbHVzaEFsbE5vTm90aWZpY2F0aW9uKCkpOwotCQlmbHVzaGVkQWxsID0gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhTW9kZWxMaXN0ZW5lciNwcm9jZXNzQ2hpbGRyZW4oSUphdmFFbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ2hpbGRyZW4oSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmICghZmx1c2hlZEFsbCkKLQkJCXN1cGVyLnByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YU1vZGVsTGlzdGVuZXIjcHJvY2Vzc0RlbHRhKElKYXZhRWxlbWVudERlbHRhKQotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3NEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpZiAoIWZsdXNoZWRBbGwpCi0JCQlzdXBlci5wcm9jZXNzRGVsdGEoZGVsdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9JSmF2YVByb2plY3RJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSUphdmFQcm9qZWN0SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2EzMTA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9JSmF2YVByb2plY3RJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW47Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwNS8wNy8wMSAxMDowNjoyOCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YVByb2plY3RJbmZvIHsKLXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlUGF0aCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0phdmFFTUZOYXR1cmUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhRU1GTmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NmJjOWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0phdmFFTUZOYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW47Ci0vKgotICogJFJDU2ZpbGU6IEphdmFFTUZOYXR1cmUuamF2YSx2ICQgJFJldmlzaW9uOiAxLjE3ICQgJERhdGU6IDIwMDYvMDkvMTQgMTg6MzE6MDggJAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSmF2YVhNSUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0QmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZS5FTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LklKYXZhRU1GTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVNRk5hdHVyZSBleHRlbmRzIEVNRk5hdHVyZSBpbXBsZW1lbnRzIElKYXZhRU1GTmF0dXJlIHsKLS8qKgotICogSmF2YU1PRk5hdHVyZVJ1bnRpbWUgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEphdmFFTUZOYXR1cmUoKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogR2V0IGEgSUphdmFNT0ZOYXR1cmVSdW50aW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHN1cHBsaWVkIHByb2plY3QuCi0gKiBAcmV0dXJuIElKYXZhTU9GTmF0dXJlUnVudGltZQotICogQHBhcmFtIHByb2plY3QgY29tLmlibS5pdHAuY29yZS5hcGkucmVzb3VyY2VzLklQcm9qZWN0Ci0gKi8KLXB1YmxpYyBzdGF0aWMgSmF2YUVNRk5hdHVyZSBjcmVhdGVSdW50aW1lKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQlpZighaGFzUnVudGltZShwcm9qZWN0KSkKLQkJaWYgKEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KS5leGlzdHMoKSkKLQkJCWFkZE5hdHVyZVRvUHJvamVjdChwcm9qZWN0LCBJSmF2YUVNRk5hdHVyZS5OQVRVUkVfSUQpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQotCXJldHVybiBnZXRSdW50aW1lKHByb2plY3QpOwotfQotCi0vKioKLSAqIFJldHVybiB0aGUgbmF0dXJlJ3MgSUQuCi0gKi8KLXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE5hdHVyZUlEKCkgewotCXJldHVybiBJSmF2YUVNRk5hdHVyZS5OQVRVUkVfSUQ7Ci19Ci0vKioKLSAqIFJldHVybiB0aGUgSUQgb2YgdGhlIHBsdWdpbiB0aGF0IHRoaXMgbmF0dXJlIGlzIGNvbnRhaW5lZCB3aXRoaW4uCi0gKi8KLXByb3RlY3RlZCBqYXZhLmxhbmcuU3RyaW5nIGdldFBsdWdpbklEKCkgewotCXJldHVybiBKYXZhUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLX0KLS8qKgotICogR2V0IGEgSUphdmFNT0ZOYXR1cmVSdW50aW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHN1cHBsaWVkIHByb2plY3QuCi0gKiBGaXJzdCBjaGVjayBmb3IgcmVnaXN0ZXJlZCBuYXR1cmVzLgotICogQHJldHVybiBJSmF2YU1PRk5hdHVyZVJ1bnRpbWUKLSAqIEBwYXJhbSBwcm9qZWN0IGNvbS5pYm0uaXRwLmNvcmUuYXBpLnJlc291cmNlcy5JUHJvamVjdAotICovCi1wdWJsaWMgc3RhdGljIEphdmFFTUZOYXR1cmUgZ2V0UnVudGltZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JSmF2YUVNRk5hdHVyZSBuYXR1cmUgPSBudWxsOwotCUxpc3QgcnVudGltZXMgPSBFTUZOYXR1cmUuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzKHByb2plY3QpOwotCWZvciAoaW50IGk9MDsgaTxydW50aW1lcy5zaXplKCk7IGkrKykgewotCQlpZiAocnVudGltZXMuZ2V0KGkpIGluc3RhbmNlb2YgSmF2YUVNRk5hdHVyZSkKLQkJCW5hdHVyZSA9IChKYXZhRU1GTmF0dXJlKSBydW50aW1lcy5nZXQoaSk7Ci0JfQotCWlmIChuYXR1cmUgPT0gbnVsbCkKLQkJbmF0dXJlID0gcHJpbUdldFJ1bnRpbWUocHJvamVjdCk7Ci0JcmV0dXJuIG5hdHVyZTsKLX0KLS8qKgotICogUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBwcm9qZWN0IGhhcyBhIHJ1bnRpbWUgY3JlYXRlZCBvbiBpdC4KLSAqIENoZWNrIGZvciByZWdpc3RlcmVkIG5hdHVyZXMgZmlyc3QuCi0gKiBAcmV0dXJuIGJvb2xlYW4KLSAqIEBwYXJhbSBwcm9qZWN0IGNvbS5pYm0uaXRwLmNvcmUuYXBpLnJlc291cmNlcy5JUHJvamVjdAotICovCi1wdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUnVudGltZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JSmF2YUVNRk5hdHVyZSBuYXR1cmUgPSBudWxsOwotCUxpc3QgcnVudGltZXMgPSBFTUZOYXR1cmUuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWVzKHByb2plY3QpOwotCWZvciAoaW50IGk9MDsgaTxydW50aW1lcy5zaXplKCk7IGkrKykgewotCQlpZiAocnVudGltZXMuZ2V0KGkpIGluc3RhbmNlb2YgSmF2YUVNRk5hdHVyZSkKLQkJCW5hdHVyZSA9IChKYXZhRU1GTmF0dXJlKSBydW50aW1lcy5nZXQoaSk7Ci0JfQotCWlmIChuYXR1cmUgPT0gbnVsbCkKLQkJcmV0dXJuIHByaW1IYXNSdW50aW1lKHByb2plY3QpOwotCWVsc2UKLQkJcmV0dXJuIHRydWU7Ci0KLX0KLS8qKgotICogR2V0IGEgSUphdmFNT0ZOYXR1cmVSdW50aW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHN1cHBsaWVkIHByb2plY3QuCi0gKiBEbyBub3QgY2hlY2sgZm9yIG90aGVyIHJlZ2lzdGVyZWQgdHlwZXMuCi0gKiBAcmV0dXJuIElKYXZhTU9GTmF0dXJlUnVudGltZQotICogQHBhcmFtIHByb2plY3QgY29tLmlibS5pdHAuY29yZS5hcGkucmVzb3VyY2VzLklQcm9qZWN0Ci0gKi8KLXB1YmxpYyBzdGF0aWMgSmF2YUVNRk5hdHVyZSBwcmltR2V0UnVudGltZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JdHJ5IHsKLQkJcmV0dXJuIChKYXZhRU1GTmF0dXJlKSBwcm9qZWN0LmdldE5hdHVyZShJSmF2YUVNRk5hdHVyZS5OQVRVUkVfSUQpOwotCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0vKioKLSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgcHJvamVjdCBoYXMgYSBydW50aW1lIGNyZWF0ZWQgb24gaXQuCi0gKiBEbyBub3QgY2hlY2sgZm9yIHJlZ2lzdGVyZWQgbmF0dXJlIGlkcy4KLSAqIEByZXR1cm4gYm9vbGVhbgotICogQHBhcmFtIHByb2plY3QgY29tLmlibS5pdHAuY29yZS5hcGkucmVzb3VyY2VzLklQcm9qZWN0Ci0gKi8KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcmltSGFzUnVudGltZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JdHJ5IHsKLQkJcmV0dXJuIHByb2plY3QuaGFzTmF0dXJlKElKYXZhRU1GTmF0dXJlLk5BVFVSRV9JRCk7Ci0JfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0KLS8qKgotICogcHJpbWFyeSBjb250cmlidXRlIHRvIGNvbnRleHQKLSAqLwotcHVibGljIHZvaWQgcHJpbWFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgYU5hdHVyZSkgewotCWlmIChlbWZDb250ZXh0ID09IGFOYXR1cmUpIHJldHVybjsKLQllbWZDb250ZXh0ID0gYU5hdHVyZTsKLQlSZXNvdXJjZVNldCBzZXQgPSBhTmF0dXJlLmdldFJlc291cmNlU2V0KCk7Ci0Jc2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0UHJvdG9jb2xUb0ZhY3RvcnlNYXAoKS5wdXQoSmF2YVhNSUZhY3RvcnkuU0NIRU1FLCBKYXZhWE1JRmFjdG9yeS5JTlNUQU5DRSk7CQotCVdvcmtiZW5jaFVSSUNvbnZlcnRlciBjb252ID0gKFdvcmtiZW5jaFVSSUNvbnZlcnRlcikgc2V0LmdldFVSSUNvbnZlcnRlcigpOwotCWNvbmZpZ3VyZVVSSUNvbnZlcnRlcihjb252KTsKLQlhZGRBZGFwdGVyRmFjdG9yaWVzKHNldCk7CQotfQotCi0vKioKLSAqIHNlY29uZGFyeSBjb250cmlidXRlIHRvIGNvbnRleHQKLSAqLwotcHVibGljIHZvaWQgc2Vjb25kYXJ5Q29udHJpYnV0ZVRvQ29udGV4dChFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBhTmF0dXJlKSB7Ci0JcHJpbWFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoYU5hdHVyZSk7Ci19Ci0KLS8qKgotICogUmVtb3ZlIHRoZSBwcm9qZWN0IGFzIGEgY29udGFpbmVyIGZyb20gdGhlIGNvbnZlcnRlciBhbmQgYWRkCi0gKiB0aGUgc291cmNlIGZvbGRlci4KLSAqLwotcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVVJJQ29udmVydGVyKFdvcmtiZW5jaFVSSUNvbnZlcnRlciBjb252KSB7Ci0JY29udi5yZW1vdmVJbnB1dENvbnRhaW5lcihnZXRQcm9qZWN0KCkpOwotCWNvbnYuYWRkSW5wdXRDb250YWluZXIoZ2V0RU1GUm9vdCgpKTsKLX0KLQotLyoqCi0gKiBBZGQgQWRhcHRvciBmYWN0b3JpZXMgdG8gYUNvbnRleHQgd2hpY2ggaXMgbm93Ci0gKiBiZWluZyB1c2VkIGZvciB0aGlzIG5hdHVyZS4KLSAqLwotcHJvdGVjdGVkIHZvaWQgYWRkQWRhcHRlckZhY3RvcmllcyhSZXNvdXJjZVNldCBhU2V0KSB7Ci0JYWRkSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yaWVzKGFTZXQpOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBhZGRKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3JpZXMoUmVzb3VyY2VTZXQgYVNldCkgewotCUxpc3QgZmFjdG9yaWVzID0gYVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JLy8gVGhlIGNvbnRleHQgbWF5IGFscmVhZHkgaGF2ZSBhIEphdmFSZWZsZWN0aW9uIGFkYXB0b3IgZmFjdG9yeSwgc28gcmVtb3ZlIGl0Ci0JLy8gVGhpcyBzaG91bGQgbWF5YmUgYmUgY29uc2lkZXJlZCBhIGxvZ2ljIGVycm9yLCBidXQgd2UgY2FuIHJlY292ZXIgZWFzaWx5Ci0JaWYgKCFmYWN0b3JpZXMuaXNFbXB0eSgpKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBFY29yZVV0aWwuZ2V0QWRhcHRlckZhY3RvcnkoZmFjdG9yaWVzLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQlmYWN0b3JpZXMucmVtb3ZlKGZhY3RvcnkpOwotCX0KLQotCWZhY3Rvcmllcy5hZGQoYWRhcHRlckZhY3RvcnkpOwotfQotCi1wcml2YXRlIEphdmFKRE9NQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5uYXR1cmUuRU1GTmF0dXJlI3NldFByb2plY3Qob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QpCi0gKi8KLXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgbmV3UHJvamVjdCkgewotCXN1cGVyLnNldFByb2plY3QobmV3UHJvamVjdCk7Ci0JYWRhcHRlckZhY3RvcnkgPSBuZXcgSmF2YUpET01BZGFwdGVyRmFjdG9yeShKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0phdmFQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL3BsdWdpbi9KYXZhUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNmIwYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0phdmFQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luOwotLyoKLSAqICRSQ1NmaWxlOiBKYXZhUGx1Z2luLmphdmEsdiAkICRSZXZpc2lvbjogMS4xMyAkICREYXRlOiAyMDA2LzA1LzE3IDIwOjEzOjU4ICQKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFKRE9NQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrLkphdmFKREtBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS51dGlsLkphdmFDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkVjbGlwc2VMb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyBhIHRvcC1sZXZlbCBjbGFzcyBvZiB0aGUgamF2YSBwbHVnaW4gdG9vbC4KLSAqIAotICogQHNlZSBBYnN0cmFjdFVJUGx1Z2luIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIFVJIHBsdWdpbnMKLSAqLwotCi1wdWJsaWMgY2xhc3MgSmF2YVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBKYXZhUGx1Z2luIElOU1RBTkNFOwotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgSmF2YSBwbHVnaW4gYW5kIGNhY2hlIGl0cyBkZWZhdWx0IGluc3RhbmNlCi0JICovCi0JcHVibGljIEphdmFQbHVnaW4oKSB7Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKQotCQkJbG9nZ2VyID0gRWNsaXBzZUxvZ2dlci5nZXRFY2xpcHNlTG9nZ2VyKHRoaXMpOwotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcGx1Z2luIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIEphdmFQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JCUphdmFDb250ZXh0LnNldFJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeUNsYXNzKEphdmFKRE9NQWRhcHRlckZhY3RvcnkuY2xhc3MpOwotCQlKRU1VdGlsUGx1Z2luLmdldFBsdWdpblJlc291cmNlU2V0KCkuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgSmF2YUpES0FkYXB0ZXJGYWN0b3J5KCkpOwkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YVByb2plY3RJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9wbHVnaW4vSmF2YVByb2plY3RJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNmU1NzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvcGx1Z2luL0phdmFQcm9qZWN0SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luOwotLyoKLQotCi0gKi8KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwNS8wNy8wMSAxMDowOToyNiBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFQcm9qZWN0SW5mbyBpbXBsZW1lbnRzIElKYXZhUHJvamVjdEluZm8gewotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfSkFWQV9PVVRQVVRfUEFUSCA9ICJiaW4iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX1NPVVJDRV9QQVRIID0gInNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgc291cmNlUGF0aDsKLS8qKgotICogSmF2YVByb2plY3RJbmZvIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBKYXZhUHJvamVjdEluZm8oKSB7Ci0Jc3VwZXIoKTsKLX0KLS8qKgotICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYXMgbmVjZXNzYXJ5Ci0gKi8KLXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFNvdXJjZVBhdGgoKSB7Ci0JcmV0dXJuIERFRkFVTFRfU09VUkNFX1BBVEg7Ci19Ci0vKioKLSAqIEdldCB0aGUgY2xhc3MgcGF0aCBmb3IgdGhlIHJlY2lldmVyLiBCeSBkZWZhdWx0IGFzayB0aGUgdGVtcGxhdGUKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgU3RyaW5nIGdldFNvdXJjZVBhdGgoKSB7Ci0JaWYgKHNvdXJjZVBhdGggPT0gbnVsbCkKLQkJc291cmNlUGF0aCA9IGdldERlZmF1bHRTb3VyY2VQYXRoKCk7Ci0JcmV0dXJuIHNvdXJjZVBhdGg7Ci19Ci1wdWJsaWMgdm9pZCBzZXRTb3VyY2VQYXRoKFN0cmluZyBwYXRoKSB7Ci0Jc291cmNlUGF0aCA9IHBhdGg7Ci19Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9BU1RCb3VuZFJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9BU1RCb3VuZFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZmY0ZTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvQVNUQm91bmRSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb247Ci0gCi0vKioKLSAqIFRoaXMgd29ya3Mgb24gcmVzb2x2ZWQgQVNUIG5vZGVzLiBJZiB0aGUgbm9kZXMgaGFkIG5vdCBiZWVuIHJlc29sdmVkLCB0aGlzIHdpbGwgcmV0dXJuIG5vdGluZy4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBU1RCb3VuZFJlc29sdmVyIGV4dGVuZHMgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULlJlc29sdmVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuSVJlc29sdmVyI3Jlc29sdmVOYW1lKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lKQotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gcmVzb2x2ZU5hbWUoTmFtZSBuYW1lKSB7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSBuYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWlmIChiaW5kaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXN3aXRjaCAoYmluZGluZy5nZXRLaW5kKCkpIHsKLQkJCWNhc2UgSUJpbmRpbmcuVFlQRToKLQkJCQlTdHJpbmcgdHlwZW5hbWUgPSBnZXRUeXBlTmFtZSgoSVR5cGVCaW5kaW5nKSBiaW5kaW5nKTsKLQkJCQlQVE5hbWUgcHRuYW1lID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUTmFtZSgpOwotCQkJCXB0bmFtZS5zZXROYW1lKHR5cGVuYW1lKTsKLQkJCQlyZXR1cm4gcHRuYW1lOwotCQkJY2FzZSBJQmluZGluZy5WQVJJQUJMRToKLQkJCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IChJVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOwotCQkJCWlmICh2YXJpYWJsZUJpbmRpbmcuaXNGaWVsZCgpKSB7Ci0JCQkJCWlmIChNb2RpZmllci5pc1N0YXRpYyh2YXJpYWJsZUJpbmRpbmcuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0JCQkJCQlQVEZpZWxkQWNjZXNzIGZhID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBURmllbGRBY2Nlc3MoKTsKLQkJCQkJCS8vIElmIGp1c3QgYSBzaW1wbGUgbmFtZSwgdGhlbiBpdCBpcyBsaWtlIHRoaXMuZmllbGQsIHNvIG5vIHJlY2VpdmVyLiBOb3Qgc3VyZSBob3cgdG8gaGFuZGxlIHRoaXMgeWV0LgotCQkJCQkJaWYgKG5hbWUuaXNRdWFsaWZpZWROYW1lKCkpIHsKLQkJCQkJCQkvLyBUaGVyZSBhcmUgcGFydHMgYmVmb3JlIHRoaXMgb25lLiBHZXQgdGhlbSBhcyBhbiBleHByZXNzaW9uIChlaXRoZXIgYSBuYW1lLCBvciBhbm90aGVyIGZpZWxkIGFjY2VzcykKLQkJCQkJCQlmYS5zZXRSZWNlaXZlcihyZXNvbHZlTmFtZSgoKFF1YWxpZmllZE5hbWUpIG5hbWUpLmdldFF1YWxpZmllcigpKSk7Ci0JCQkJCQl9Ci0JCQkJCQlmYS5zZXRGaWVsZCh2YXJpYWJsZUJpbmRpbmcuZ2V0TmFtZSgpKTsKLQkJCQkJCXJldHVybiBmYTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRocm93SW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLkFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxGaWVsZF9FWENfLCBuZXcgT2JqZWN0W117dmFyaWFibGVCaW5kaW5nLmdldE5hbWUoKX0pKTsgCi0vLwkJCQkJCXB1c2gobmV3IFB1c2hGaWVsZFZhcmlhYmxlKHZhcmlhYmxlSWQsIGdldFR5cGVTaWduYXR1cmUoZGVjbGFyaW5nVHlwZUJpbmRpbmcpLCBmQ291bnRlcikpOwotLy8JCQkJCQlwdXNoKG5ldyBQdXNoVGhpcyhnZXRFbmNsb3NpbmdMZXZlbChub2RlLCBkZWNsYXJpbmdUeXBlQmluZGluZykpKTsKLS8vCQkJCQkJc3RvcmVJbnN0cnVjdGlvbigpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3dJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChXb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMuQVNUQm91bmRSZXNvbHZlcl9DYW5ub3RIYW5kbGVMb2NhbFZhcmlhYmxlX0VYQ18sIG5ldyBPYmplY3RbXXt2YXJpYWJsZUJpbmRpbmcuZ2V0TmFtZSgpfSkpOyAKLS8vCQkJCQlwdXNoKG5ldyBQdXNoTG9jYWxWYXJpYWJsZSh2YXJpYWJsZUlkKSk7Ci0JCQkJfQkJCQkKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSVJlc29sdmVyI3Jlc29sdmVUeXBlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVR5cGUoVHlwZSB0eXBlKSB7Ci0JCUlUeXBlQmluZGluZyBiaW5kaW5nID0gdHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlyZXR1cm4gKGJpbmRpbmcgIT0gbnVsbCkgPyBnZXRUeXBlTmFtZShiaW5kaW5nKSA6IG51bGw7IAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULlJlc29sdmVyI3Jlc29sdmVUeXBlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVR5cGUoTmFtZSBuYW1lKSB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24gewotCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IG5hbWUucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCXJldHVybiAoYmluZGluZyAhPSBudWxsKSA/IGdldFR5cGVOYW1lKGJpbmRpbmcpIDogbnVsbDsgCi0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZU5hbWUoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBuYW1lOwotCQlpZiAodHlwZUJpbmRpbmcuaXNBcnJheSgpKSB7Ci0JCQluYW1lPSBuZXcgU3RyaW5nQnVmZmVyKGdldFR5cGVOYW1lKHR5cGVCaW5kaW5nLmdldEVsZW1lbnRUeXBlKCkpKTsKLQkJCWludCBkaW1lbnNpb25zPSB0eXBlQmluZGluZy5nZXREaW1lbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZGltZW5zaW9uczsgaSsrKSB7Ci0JCQkJbmFtZS5hcHBlbmQoIltdIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBuYW1lLnRvU3RyaW5nKCk7Ci0JCX0KLQkJbmFtZT0gbmV3IFN0cmluZ0J1ZmZlcih0eXBlQmluZGluZy5nZXROYW1lKCkpOwotCQlJUGFja2FnZUJpbmRpbmcgcGFja2FnZUJpbmRpbmc9IHR5cGVCaW5kaW5nLmdldFBhY2thZ2UoKTsKLQkJdHlwZUJpbmRpbmc9IHR5cGVCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0JCXdoaWxlKHR5cGVCaW5kaW5nICE9IG51bGwpIHsKLQkJCW5hbWUuaW5zZXJ0KDAsICckJykuaW5zZXJ0KDAsIHR5cGVCaW5kaW5nLmdldE5hbWUoKSk7Ci0JCQl0eXBlQmluZGluZz0gdHlwZUJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQkJfQotCQlpZiAocGFja2FnZUJpbmRpbmcgIT0gbnVsbCAmJiAhcGFja2FnZUJpbmRpbmcuaXNVbm5hbWVkKCkpIHsKLQkJCW5hbWUuaW5zZXJ0KDAsICcuJykuaW5zZXJ0KDAsIHBhY2thZ2VCaW5kaW5nLmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWUudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5SZXNvbHZlciNyZXNvbHZlVGhpcygpCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiByZXNvbHZlVGhpcygpIHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRUaGlzTGl0ZXJhbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L0lKYXZhRU1GTmF0dXJlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9JSmF2YUVNRk5hdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODg4NTNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L0lKYXZhRU1GTmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHk7Ci0gCi0vKioKLSAqIEludGVyZmFjZSBmb3IgSmF2YSBFTUYgTmF0dXJlIGNvbnN0YW50cy4KLSAqIAotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFFTUZOYXR1cmUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX0lEID0gIm9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2guSmF2YUVNRk5hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvSmF2YU1vZGVsTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L0phdmFNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNTI3ZjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvSmF2YU1vZGVsTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eTsKLQotLyoKLSAqICRSQ1NmaWxlOiBKYXZhTW9kZWxMaXN0ZW5lci5qYXZhLHYgJCAkUmV2aXNpb246IDEuNi42LjEgJCAkRGF0ZTogMjAwOC8wNi8xOSAwMTo1ODo0NyAkCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5jb3JlLkpFTVBsdWdpbjsKLQotLyoqCi0gKiBBbiBlbGVtZW50IGNoYW5nZSBsaXN0ZW5lciB0byBsaXN0ZW4gZm9yIEphdmEgTW9kZWwgY2hhbmdlcy4gSXQgYnJlYWtzIHRoZSBub3RpZmljYXRpb24gdXAgaW50byBpbmRpdmlkdWFsIG1ldGhvZCBjYWxscyB0byBtYWtlIGl0IGVhc2llciB0byB3YWxrCi0gKiB0aGUgbm90aWZpY2F0aW9uIHRyZWUuCi0gKiAKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YU1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCBsaXN0ZW5pbmcgb25seSBmb3Ige0BsaW5rIEVsZW1lbnRDaGFuZ2VkRXZlbnQjUE9TVF9DSEFOR0V9IGV2ZW50cy4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgcmVzb2x2ZWRDb250YWluZXJzID0gbmV3IEhhc2hNYXAoKTsKLQlwdWJsaWMgSmF2YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCXRoaXMoRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggc3VwcGx5aW5nIHRoZSB0eXBlIG9mIGV2ZW50cyB0byBsaXN0ZW4gZm9yLgotCSAqIAotCSAqIEBwYXJhbSBldmVudHNUb0xpc3RlbgotCSAqICAgICAgICAgICAgb3InZCB0b2dldGhlciBldmVudCBsaXN0ZW5pbmcgdHlwZXMuIFNlZSB7QGxpbmsgRWxlbWVudENoYW5nZWRFdmVudH0gZm9yIHRoZSB0eXBlcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgSmF2YU1vZGVsTGlzdGVuZXIoaW50IGV2ZW50c1RvTGlzdGVuKSB7Ci0JCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcywgZXZlbnRzVG9MaXN0ZW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIjZWxlbWVudENoYW5nZWQob3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQotCQlwcm9jZXNzRGVsdGEoKElKYXZhRWxlbWVudERlbHRhKSBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQotCX0KLQotCS8qKgotCSAqIEdlbmVyYWxseSBkaXNwYXRjaCB0aGUgY2hpbGRyZW4gb2YgdGhlIGRlbHRhLiBOb3JtYWxseSB0aGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIG92ZXJyaWRkZW4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ2hpbGRyZW4oSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXByb2Nlc3NEZWx0YShjaGlsZHJlbltpXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTb3VyY2UgY29udGVudCBoYXMgY2hhbmdlZC4gVGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gcGVyZm9ybSBvd24gZnVuY3Rpb25zLgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDb250ZW50Q2hhbmdlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCX0KLQotCS8qKgotCSAqIERpc3BhdGNoIHRoZSBqYXZhIGVsZW1lbnQgZGVsdGEuIFRoaXMgbWV0aG9kIHNob3VsZCBub3JtYWxseSBub3QgYmUgb3ZlcnJpZGRlbi4gT25lCi0JICogdXNhZ2Ugd291bGQgYmUgdG8gYWRkIGRlbHRhIHR5cGVzIHRoYXQgYXJlIHRvIGJlIHByb2Nlc3NlZCBhbmQgZGlzcGF0Y2hlZCBieSB0aGUKLQkgKiBzdWJjbGFzc2VzLiBGb3IgZXhhbXBsZSBhbHNvIGRpc3BhdGNoIG9uIHtAbGluayBJSmF2YUVsZW1lbnQjSU1QT1JUX0NPTlRBSU5FUn0uIFN1YmNsYXNzZXMKLQkgKiBzaG91bGQgY2FsbCA8Y29kZT5zdXBlci5wcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEpPC9jb2RlPiBpZiBpdCBpcyBub3Qgb25lIHRoZXkKLQkgKiBhcmUgaW50ZXJlc3RlZCBpbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9jZXNzRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCS8vIGlmIHRoZSBjbGFzcyBwYXRoIGhhcyBjaGFuZ2VkIHdlIHJlZnJlc2ggdGhlIHJlc29sdmVkIGNvbnRhaW5lciBjYWNoZQotCQlpbnQgZmxhZ3M9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCWlmICgoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRCkgIT0gMCkgJiYgIXJlc29sdmVkQ29udGFpbmVycy5pc0VtcHR5KCkpewotCQkJcmVzb2x2ZWRDb250YWluZXJzLmNsZWFyKCk7CQkJCi0JCX0KLQotCQlzd2l0Y2ggKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9NT0RFTDoKLQkJCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJSmF2YU1vZGVsKSBlbGVtZW50LCBkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1Q6Ci0JCQkJcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZCgoSUphdmFQcm9qZWN0KSBlbGVtZW50LCBkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1Q6Ci0JCQkJcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZCgoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGVsZW1lbnQsIGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQ6Ci0JCQkJcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZCgoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudCwgZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVDoKLQkJCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJQ29tcGlsYXRpb25Vbml0KSBlbGVtZW50LCBkZWx0YSk7Ci0JCQkJcHJvY2Vzc0NvbnRlbnRDaGFuZ2VkKGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LkNMQVNTX0ZJTEU6Ci0JCQkJcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZCgoSUNsYXNzRmlsZSkgZWxlbWVudCwgZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuVFlQRToKLQkJCQlwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKChJVHlwZSkgZWxlbWVudCwgZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJLy8gTm90ZTogaWYgd2UgYXJlIHRvIHVwZGF0ZSB0aGUgTWV0aG9kL0ZpZWxkIGFkYXB0ZXJzLCB3ZSBzaG91bGQgcHJvY2VzcyB0aGUKLQkJCS8vIElKYXZhRWxlbWVudC5NRVRIT0QgYW5kIElKYXZhRWxlbWVudC5GSUVMRAotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgY2xhc3NmaWxlIGNoYW5nZWQgZXZlbnQuIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuIEl0IHdpbGwgbm90IHdhbGsgYW55IGNoaWxkcmVuIG9mIHRoZSBkZWx0YSBlaXRoZXIuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCi0JICogdG8gcGVyZm9ybSB0aGVpciBvd24gZnVuY3Rpb25zLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGRlbHRhCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJQ2xhc3NGaWxlIGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgY29tcGlsYXRpb24gdW5pdCBjaGFuZ2VkIGV2ZW50LiBUaGUgZGVmYXVsdCBpcyB0byBwcm9jZXNzIHRoZSBjaGlsZHJlbiBvZiB0aGUgZGVsdGEuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHBlcmZvcm0gdGhlaXIgb3duCi0JICogZnVuY3Rpb25zLiBJZiB0aGV5IHdpc2ggdG8gd2FsayB0aGUgY2hpbGRyZW4gdGhleSBzaG91bGQgdGhlbiBhbHNvIGNhbGwKLQkgKiA8Y29kZT5zdXBlci5wcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElDb21waWxhdGlvblVuaXQsIElKYXZhRWxlbWVudERlbHRhKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElDb21waWxhdGlvblVuaXQgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBqYXZhIG1vZGVsIGNoYW5nZWQgZXZlbnQuIFRoZSBkZWZhdWx0IGlzIHRvIHByb2Nlc3MgdGhlIGNoaWxkcmVuIG9mIHRoZSBkZWx0YS4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gcGVyZm9ybSB0aGVpciBvd24KLQkgKiBmdW5jdGlvbnMuIElmIHRoZXkgd2lzaCB0byB3YWxrIHRoZSBjaGlsZHJlbiB0aGV5IHNob3VsZCB0aGVuIGFsc28gY2FsbAotCSAqIDxjb2RlPnN1cGVyLnByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUphdmFNb2RlbCwgSUphdmFFbGVtZW50RGVsdGEpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUphdmFNb2RlbCBlbGVtZW50LCBJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlwcm9jZXNzQ2hpbGRyZW4oZWxlbWVudCwgZGVsdGEpOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIGphdmEgcHJvamVjdCBjaGFuZ2VkIGV2ZW50LiBUaGUgZGVmYXVsdCBpcyB0byBwcm9jZXNzIHRoZSBjaGlsZHJlbiBvZiB0aGUgZGVsdGEuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHBlcmZvcm0gdGhlaXIgb3duCi0JICogZnVuY3Rpb25zLiBJZiB0aGV5IHdpc2ggdG8gd2FsayB0aGUgY2hpbGRyZW4gdGhleSBzaG91bGQgdGhlbiBhbHNvIGNhbGwKLQkgKiA8Y29kZT5zdXBlci5wcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElKYXZhUHJvamVjdCwgSUphdmFFbGVtZW50RGVsdGEpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSUphdmFQcm9qZWN0IGVsZW1lbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCXByb2Nlc3NDaGlsZHJlbihlbGVtZW50LCBkZWx0YSk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgcGFja2FnZSBmcmFnbWVudCBjaGFuZ2VkIGV2ZW50LiBUaGUgZGVmYXVsdCBpcyB0byBwcm9jZXNzIHRoZSBjaGlsZHJlbiBvZiB0aGUgZGVsdGEuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHBlcmZvcm0gdGhlaXIgb3duCi0JICogZnVuY3Rpb25zLiBJZiB0aGV5IHdpc2ggdG8gd2FsayB0aGUgY2hpbGRyZW4gdGhleSBzaG91bGQgdGhlbiBhbHNvIGNhbGwKLQkgKiA8Y29kZT5zdXBlci5wcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnQsIElKYXZhRWxlbWVudERlbHRhKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnQgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgY2hhbmdlZCBldmVudC4gVGhlIGRlZmF1bHQgaXMgdG8gcHJvY2VzcyB0aGUgY2hpbGRyZW4gb2YgdGhlIGRlbHRhLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0byBwZXJmb3JtIHRoZWlyCi0JICogb3duIGZ1bmN0aW9ucy4gSWYgdGhleSB3aXNoIHRvIHdhbGsgdGhlIGNoaWxkcmVuIHRoZXkgc2hvdWxkIHRoZW4gYWxzbyBjYWxsCi0JICogPGNvZGU+c3VwZXIucHJvY2Vzc0phdmFFbGVtZW50Q2hhbmdlZChJUGFja2FnZUZyYWdtZW50Um9vdCwgSUphdmFFbGVtZW50RGVsdGEpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVBhY2thZ2VGcmFnbWVudFJvb3QgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJcHJvY2Vzc0NoaWxkcmVuKGVsZW1lbnQsIGRlbHRhKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBJVHlwZSBjaGFuZ2VkIGV2ZW50LiBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLiBJdCB3aWxsIG5vdCB3YWxrIGFueSBjaGlsZHJlbiBvZiB0aGUgZGVsdGEgZWl0aGVyLiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0bwotCSAqIHBlcmZvcm0gdGhlaXIgb3duIGZ1bmN0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBkZWx0YQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhRWxlbWVudENoYW5nZWQoSVR5cGUgZWxlbWVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIHdoZXRoZXIgdGhpcyBlbGVtZW50IGRlbHRhIGlzIGEgY2xhc3NwYXRoIGNoYW5nZS4gSS5lLiBzb21ldGhpbmcgYWRkZWQvcmVtb3ZlZC9tb3ZlZCBhcm91bmQgZm9yIHRoZSBjbGFzc3BhdGguIFRoaXMgc2hvdWxkIG9ubHkgYmUKLQkgKiBjYWxsZWQgZm9yIGEgZGVsdGEgdGhhdCBpcyBmb3IgYW4ge0BsaW5rIElQYWNrYWdlRnJhZ21lbnRSb290fS4gU2hvdWxkIGJlIGNhbGxlZCBmcm9tIGFuIG92ZXJyaWRlIG9mCi0JICoge0BsaW5rICNwcm9jZXNzSmF2YUVsZW1lbnRDaGFuZ2VkKElQYWNrYWdlRnJhZ21lbnRSb290LCBJSmF2YUVsZW1lbnREZWx0YSl9Ci0JICogCi0JICogQHBhcmFtIGRlbHRhCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBpcyBjbGFzc3BhdGggY2hhbmdlIG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbGFzc1BhdGhDaGFuZ2UoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJcmV0dXJuIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCAmJiAoKGZsYWdzICYgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpICE9IDApCi0JCQkJfHwgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCkgIT0gMCkgfHwgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVPUkRFUikgIT0gMCkpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoZSBjaGFuZ2UgaXMgdGhpcyBpcyBhIHJhdyBjbGFzc3BhdGggY2hhbmdlLCBvciBpZiBhIGZpbGUgdGhhdCBpcyBpbiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdCB3YXMgY2hhbmdlZCB0aGF0IGFsc28gY2FuIG1lYW4gYQotCSAqIHJhdyBjbGFzc3BhdGggY2hhbmdlLiBUaGlzIG11c3Qgb25seSBiZSBjYWxsZWQgZm9yIGEgZGVsdGEgdGhhdCBpcyBmb3IgYW4ge0BsaW5rIElKYXZhUHJvamVjdH0uCi0JICogPHA+Ci0JICogU2VlIHtAbGluayBJSmF2YUVsZW1lbnREZWx0YS4jRl9DTEFTU1BBVEhfQ0hBTkdFRH0gYW5kIHtAbGluayAjaXNBbHNvQ2xhc3NwYXRoQ2hhbmdlKElQYXRoKX0gZm9yIGRldGFpbHMuCi0JICogCi0JICogQHBhcmFtIGRlbHRhCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2xhc3NwYXRoUmVzb3VyY2VDaGFuZ2UoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTEFTU1BBVEhfQ0hBTkdFRCkgIT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQlJUmVzb3VyY2VEZWx0YVtdIHJlc291cmNlcyA9IGRlbHRhLmdldFJlc291cmNlRGVsdGFzKCk7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVzb3VyY2VzW2ldLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSB7Ci0JCQkJcGF0aCA9IHJlc291cmNlc1tpXS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQkJaWYgKGlzQWxzb0NsYXNzcGF0aENoYW5nZShwYXRoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFuc3dlcnMgd2hldGhlciB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgdGhlIHBhdGggaXMgb25lIHRoYXQgd2hlbiBjaGFuZ2VkIGNhbiByZXN1bHQgaW4gYSBjbGFzc3BhdGggY2hhbmdlLiBUaGlzIGlzIGNhbGxlZCBmcm9tCi0JICoge0BsaW5rICNpc0NsYXNzcGF0aFJlc291cmNlQ2hhbmdlKElKYXZhRWxlbWVudERlbHRhKX0uIFRoZSBmaWxlIG11c3QgYmUgaW4gdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBmaWxlIGJlaW5nIGNoYW5nZWQgd291bGQgcmVzdWx0IGluIGEgY2xhc3NwYXRoIGNoYW5nZSwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fsc29DbGFzc3BhdGhDaGFuZ2UoSVBhdGggcGF0aCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VycyB3aGV0aGVyIHRoZSBnaXZlbiBqYXZhIHByb2plY3QgaXMgaW4gdGhlIGNsYXNzcGF0aCAoaW5jbHVkaW5nIHJlY3Vyc2l2ZSkuIFRoaXMgY3VycmVudGx5IHdpbGwgbm90IHdhbGsgdGhyb3VnaCBjb250YWluZXJzIChzdWNoIGFzIHRoZQotCSAqIFBERSBjb250YWluZXIpLiBPbmx5IHRocm91Z2ggdGhlIGRpcmVjdCBhbmQgcmVjdXJzaXZlIHByb2plY3QgcmVmZXJlbmNlcy4gVGhlIGphdmEgcHJvamVjdCBpcyBkZXRlcm1pbmVkIGJ5IHN1YmNsYXNzZXMsIHNlZQotCSAqIHtAbGluayAjZ2V0SmF2YVByb2plY3QoKX0uCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwcm9qZWN0IGlzIGluIGNsYXNzcGF0aCBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5DbGFzc3BhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCUlKYXZhUHJvamVjdCBsaXN0ZW5lckphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoKTsKLQkJaWYgKGphdmFQcm9qZWN0LmVxdWFscyhsaXN0ZW5lckphdmFQcm9qZWN0KSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gaXNJbkNsYXNzcGF0aChqYXZhUHJvamVjdCwgbGlzdGVuZXJKYXZhUHJvamVjdCwgdHJ1ZSwgbmV3IEhhc2hTZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGphdmEgcHJvamVjdCBmb3IgdGhpcyBsaXN0ZW5lci4gU3ViY2xhc3NlcyBtdXN0IHByb3ZpZGUgYSBqYXZhIHByb2plY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgamF2YSBwcm9qZWN0LiA8Y29kZT5udWxsPC9jb2RlPiBpcyBub3QgdmFsaWQuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotCi0JLyoKLQkgKiB0ZXN0IHRvIHNlZSBpZiB0aGUgdGVzdFByb2plY3QgaXMgaW4gdGhlIGNsYXNzcGF0aCAoaW5jbHVkaW5nIGZyb20gYW55IHJlZmVyZW5jZWQgcHJvamVjdHMpIG9mIHRoZSB0YXJnZXQgcHJvamVjdC4gS2VlcCB0cmFjayBvZiB0aG9zZSBhbHJlYWR5Ci0JICogdmlzaXRlZCBzbyBhcyBub3QgdG8gdmlzaXQgYWdhaW4uIFRvbyBsYXRlIHRvIG1ha2UgcHJpdmF0ZS4gQnV0IGl0IHNob3VsZCBub3QgYmUgb3ZlcnJpZGRlbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luQ2xhc3NwYXRoKElKYXZhUHJvamVjdCB0ZXN0UHJvamVjdCwgSUphdmFQcm9qZWN0IHRhcmdldFByb2plY3QsIGJvb2xlYW4gaXNGaXJzdExldmVsLCBTZXQgdmlzaXRlZCkgewotCQlpZiAodmlzaXRlZC5jb250YWlucyh0YXJnZXRQcm9qZWN0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJdmlzaXRlZC5hZGQodGFyZ2V0UHJvamVjdCk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBudWxsOwotCQl0cnkgewotCQkJZW50cmllcyA9IHRhcmdldFByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTGlzdCBwcm9qZWN0cyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5OwotCQkJZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJc3dpdGNoIChlbnRyeS5nZXRFbnRyeUtpbmQoKSkgewotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOgotCQkJCQlJSmF2YVByb2plY3QgZW50cnlQcm9qZWN0ID0gZ2V0VmlzaWJsZUphdmFQcm9qZWN0KGVudHJ5LCBpc0ZpcnN0TGV2ZWwpOwotCQkJCQlpZiAoZW50cnlQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCWlmIChlbnRyeVByb2plY3QuZXF1YWxzKHRlc3RQcm9qZWN0KSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAocHJvamVjdHMgPT0gbnVsbCkgewotCQkJCQkJCQlwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcHJvamVjdHMuYWRkKGVudHJ5UHJvamVjdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJLy9BIGNvbnRhaW5lciBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvIHByb2plY3RzLgotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgOgotCQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoZW50cnkuZ2V0UGF0aCgpLCB0YXJnZXRQcm9qZWN0KTsKLQkJCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUpFTVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCQlpZiAoY29udGFpbmVyID09IG51bGwgfHwgY29udGFpbmVyLmdldEtpbmQoKSAhPSBJQ2xhc3NwYXRoQ29udGFpbmVyLktfQVBQTElDQVRJT04pCi0JCQkJCQlicmVhazsKLQkJCQkJLy9GaXJzdCBzZWUgaWYgd2UgYWxyZWFkeSByZXNvbHZlZAotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjb250YWluZXJFbnRyaWVzID0gbnVsbDsKLQkJCQkJY29udGFpbmVyRW50cmllcyA9IChJQ2xhc3NwYXRoRW50cnlbXSlyZXNvbHZlZENvbnRhaW5lcnMuZ2V0KGNvbnRhaW5lcik7Ci0JCQkJCWlmIChjb250YWluZXJFbnRyaWVzID09IG51bGwpIHsKLQkJCQkJCWNvbnRhaW5lckVudHJpZXMgPSBjb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotCQkJCQkJcmVzb2x2ZWRDb250YWluZXJzLnB1dChjb250YWluZXIsIGNvbnRhaW5lckVudHJpZXMpOwotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29udGFpbmVyRW50cmllcy5sZW5ndGg7IGorKykgewotCQkJCQkJaWYgKGNvbnRhaW5lckVudHJpZXNbal0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUKSB7Ci0JCQkJCQkJSUphdmFQcm9qZWN0IGNvbkVudHJ5UHJvamVjdCA9IGdldFZpc2libGVKYXZhUHJvamVjdChjb250YWluZXJFbnRyaWVzW2pdLCBpc0ZpcnN0TGV2ZWwpOwotCQkJCQkJCWlmIChjb25FbnRyeVByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAoY29uRW50cnlQcm9qZWN0LmVxdWFscyh0ZXN0UHJvamVjdCkpIHsKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKHByb2plY3RzID09IG51bGwpIHsKLQkJCQkJCQkJCQlwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCXByb2plY3RzLmFkZChjb25FbnRyeVByb2plY3QpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc0luQ2xhc3NwYXRoKHRlc3RQcm9qZWN0LCBwcm9qZWN0cywgZmFsc2UsIHZpc2l0ZWQpOwotCX0KLQkKLQkvKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmV0dXJuIGFuIElKYXZhUHJvamVjdCB0aGF0IGlzIHJlc29sdmVkIGZyb20gdGhlIGVudHJ5Ci0JICogaWYgaXQgaXMgY3VycmVudGx5IHZpc2libGUgdG8gZG93bnN0cmVhbSBwcm9qZWN0cy4KLQkgKi8KLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRWaXNpYmxlSmF2YVByb2plY3QoSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCBib29sZWFuIGlzRmlyc3RMZXZlbCkgewotCQlpZiAoaXNGaXJzdExldmVsIHx8IGVudHJ5LmlzRXhwb3J0ZWQoKSkgewotCQkJSUNsYXNzcGF0aEVudHJ5IHJlc0VudHJ5ID0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeShlbnRyeSk7Ci0JCQlyZXR1cm4gZ2V0SmF2YVByb2plY3QocmVzRW50cnkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogU2VlIGlmIHRoZSB0ZXN0UHJvamVjdCBpcyBpbiB0aGUgY2xhc3NwYXRoIG9mIGFueSBvZiB0aGUgbGlzdCBvZiBwcm9qZWN0cyBvciBpbiBhbnkgcHJvamVjdCB0aGF0IGFuIGVudHJ5IGluIHRoZSBsaXN0IG1heSBvZiB2aXNpdGVkLiBUb28gbGF0ZQotCSAqIHRvIG1ha2UgcHJpdmF0ZS4gQnV0IGl0IHNob3VsZCBub3QgYmUgb3ZlcnJpZGRlbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luQ2xhc3NwYXRoKElKYXZhUHJvamVjdCB0ZXN0UHJvamVjdCwgTGlzdCBzb21lSmF2YVByb2plY3RzLCBib29sZWFuIGlzRmlyc3RMZXZlbCwgU2V0IHZpc2l0ZWQpIHsKLQkJaWYgKHNvbWVKYXZhUHJvamVjdHMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IHNpemUgPSBzb21lSmF2YVByb2plY3RzLnNpemUoKTsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWphdmFQcm9qID0gKElKYXZhUHJvamVjdCkgc29tZUphdmFQcm9qZWN0cy5nZXQoaSk7Ci0JCQlyZXR1cm4gaXNJbkNsYXNzcGF0aCh0ZXN0UHJvamVjdCwgamF2YVByb2osIGlzRmlyc3RMZXZlbCwgdmlzaXRlZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgamF2YSBwcm9qZWN0IHRoYXQgY2xhc3NwYXRoIGVudHJ5IGlzIGZvci4gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gY2xhc3NwYXRoIGVudHJpZXMgb2YgdHlwZSB7QGxpbmsgSUNsYXNzcGF0aEVudHJ5I0NQRV9QUk9KRUNUfQotCSAqIAotCSAqIEBwYXJhbSBlbnRyeQotCSAqICAgICAgICAgICAgY2xhc3NwYXRoIGVudHJ5IG9mIHR5cGUge0BsaW5rIElDbGFzc3BhdGhFbnRyeSNDUEVfUFJPSkVDVH0uCi0JICogQHJldHVybiB0aGUgamF2YSBwcm9qZWN0IGZvciB0aGlzIGVudHJ5LiBUaGUgcHJvamVjdCBtaWdodCBub3QgYWN0dWFsbHkgZXhpc3QuIFRoYXQgaXMgbm90IHZlcmlmaWVkLgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0JCUlQcm9qZWN0IHByb2ogPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChlbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSk7Ci0JCWlmIChwcm9qICE9IG51bGwpCi0JCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2opOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHdvcmtzcGFjZSByb290LiBBIHV0aWxpdHkgbWV0aG9kLgotCSAqIEByZXR1cm4gdGhlIHdvcmtzcGFjZSByb290LgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9KZW1Qcm9qZWN0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9KZW1Qcm9qZWN0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYWVjMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvSmVtUHJvamVjdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5OwotLyoKLSAqICRSQ1NmaWxlOiBKZW1Qcm9qZWN0VXRpbGl0aWVzLmphdmEsdiAkICRSZXZpc2lvbjogMS4xMS4yLjEuMi4xICQgJERhdGU6IDIwMDkvMTAvMjIgMTk6MDg6MTMgJAotICovCi0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFFTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLm5hdHVyZS5FTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwucGx1Z2luLkpFTVV0aWxQbHVnaW47Ci0KLS8qKgotICogUHJvamVjdCBVdGlsaXRpZXMgZm9yIEpFTSBhbmQgSmF2YS4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKZW1Qcm9qZWN0VXRpbGl0aWVzIGV4dGVuZHMgUHJvamVjdFV0aWxpdGllcyB7Ci0JCi0JcHJpdmF0ZSBKZW1Qcm9qZWN0VXRpbGl0aWVzKCl7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBuYXR1cmUgaWQgZm9yIEpFTSBOYXR1cmUuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkVNX0VNRl9OYXR1cmVJRCA9IElKYXZhRU1GTmF0dXJlLk5BVFVSRV9JRDsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIEVNRiBuYXR1cmUgZm9yIEpFTSBmb3IgdGhlIHByb2plY3QuIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIGFkZE5hdHVyZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBhZGQgdGhlIG5hdHVyZSB0byB0aGUgcHJvamVjdCBpZiBub3Qgc2V0LiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgZG9uJ3QgYWRkIG5hdHVyZSBpZiBub3QgYWxyZWFkeSBvbiBwcm9qZWN0LgotCSAqIEByZXR1cm4gdGhlIEVNRk5hdHVyZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQgYW5kIGFkZE5hdHVyZSB3YXMgPGNvZGU+ZmFsc2U8L2NvZGU+IG9yIGl0IHdhcyBub3QgYSBqYXZhIHByb2plY3QuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU1GTmF0dXJlIGdldEpFTV9FTUZfTmF0dXJlKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gYWRkTmF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhZGROYXR1cmUgPyBKYXZhRU1GTmF0dXJlLmNyZWF0ZVJ1bnRpbWUocHJvamVjdCkgOiBKYXZhRU1GTmF0dXJlLmdldFJ1bnRpbWUocHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBKYXZhQ2xhc3MgZnJvbSBhbiBJRmlsZS4KLQkgKiBAcGFyYW0gYUZpbGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKElGaWxlIGFGaWxlKSB7Ci0JCWlmIChhRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBhRmlsZS5nZXRQcm9qZWN0KCk7Ci0JCUxpc3QgZm9sZGVycyA9IGdldFNvdXJjZUNvbnRhaW5lcnMocHJvamVjdCk7Ci0JCWZvbGRlcnMuYWRkQWxsKGdldExpYnJhcnlDb250YWluZXJzKHByb2plY3QpKTsKLQkJSUNvbnRhaW5lciBmb2xkZXIgPSBudWxsOwotCQlJUGF0aCBmb2xkZXJQYXRoLCBmaWxlUGF0aCwgamF2YVBhdGg7Ci0JCWZpbGVQYXRoID0gYUZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQlpZiAoZm9sZGVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZvbGRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlmb2xkZXIgPSAoSUNvbnRhaW5lcikgZm9sZGVycy5nZXQoaSk7Ci0JCQkJZm9sZGVyUGF0aCA9IGZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQkJaW50IHNlZ21lbnRzID0gZmlsZVBhdGgubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKGZvbGRlclBhdGgpOwotCQkJCWlmIChzZWdtZW50cyA+IDApIHsKLQkJCQkJamF2YVBhdGggPSBmaWxlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHNlZ21lbnRzKTsKLQkJCQkJamF2YVBhdGggPSBqYXZhUGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCk7Ci0JCQkJCVN0cmluZyBxdWFsaWZpZWROYW1lID0gamF2YVBhdGgudG9TdHJpbmcoKS5yZXBsYWNlKCcvJywgJy4nKTsKLQkJCQkJcmV0dXJuIChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShxdWFsaWZpZWROYW1lLCBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQocHJvamVjdCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHNvdXJjZSBjb250YWluZXJzIGZvciB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEByZXR1cm4gbGlzdCBvZiBzb3VyY2UgY29udGFpbmVycy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U291cmNlQ29udGFpbmVycyhJUHJvamVjdCBwKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0IHNvdXJjZUNvbnRhaW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IHNvdXJjZVBhdGhzID0gZ2V0U291cmNlUGF0aHMocCk7Ci0JCQlpZiAoc291cmNlUGF0aHMgIT0gbnVsbCAmJiAhc291cmNlUGF0aHMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VQYXRocy5zaXplKCk7IGkrKykgewotCQkJCQlJUGF0aCBwYXRoID0gKElQYXRoKSBzb3VyY2VQYXRocy5nZXQoaSk7Ci0JCQkJCWlmIChwYXRoLmlzRW1wdHkoKSkKLQkJCQkJCXNvdXJjZUNvbnRhaW5lcnMuYWRkKHApOwotCQkJCQllbHNlCi0JCQkJCQlzb3VyY2VDb250YWluZXJzLmFkZChwLmdldEZvbGRlcihwYXRoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHNvdXJjZUNvbnRhaW5lcnM7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGdldFNvdXJjZVBhdGhzKElQcm9qZWN0IHApIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gZ2V0SmF2YVByb2plY3QocCk7Ci0JCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNwID0gamF2YVByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSkVNVXRpbFBsdWdpbi5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlMaXN0IHNvdXJjZVBhdGhzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY3BbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQlzb3VyY2VQYXRocy5hZGQoY3BbaV0uZ2V0UGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2VQYXRoczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgSUNvbnRhaW5lcnMgdGhhdCBhcmUgTGlicmFyaWVzIGluIHRoZSBjbGFzc3BhdGguCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgbGlicmFyeSBJQ29udGFpbmVycy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TGlicmFyeUNvbnRhaW5lcnMoSVByb2plY3QgcCkgewotCQl0cnkgewotCQkJTGlzdCBsaWJyYXJ5Q29udGFpbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3QgbGlicmFyeVBhdGhzID0gZ2V0bGlicmFyeVBhdGhzKHApOwotCQkJaWYgKGxpYnJhcnlQYXRocyAhPSBudWxsICYmICFsaWJyYXJ5UGF0aHMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJyYXJ5UGF0aHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVBhdGggcGF0aCA9IChJUGF0aCkgbGlicmFyeVBhdGhzLmdldChpKTsKLQkJCQkJaWYgKHBhdGguaXNFbXB0eSgpKQotCQkJCQkJbGlicmFyeUNvbnRhaW5lcnMuYWRkKHApOwotCQkJCQllbHNlCi0JCQkJCQlsaWJyYXJ5Q29udGFpbmVycy5hZGQocC5nZXRGb2xkZXIocGF0aCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBsaWJyYXJ5Q29udGFpbmVyczsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgZ2V0bGlicmFyeVBhdGhzKElQcm9qZWN0IHApIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gZ2V0SmF2YVByb2plY3QocCk7Ci0JCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNwID0gamF2YVByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSkVNVXRpbFBsdWdpbi5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlMaXN0IGxpYnJhcnlQYXRocyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNwW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgewotCQkJCWxpYnJhcnlQYXRocy5hZGQoY3BbaV0uZ2V0UGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaWJyYXJ5UGF0aHM7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgamF2YSBwcm9qZWN0IG5hdHVyZSBmb3IgdGhlIGdpdmVuIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcmV0dXJuIHRoZSBqYXZhIHByb2plY3QgbmF0dXJlIGZvciB0aGUgcHJvamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYSBqYXZhIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVByb2plY3QgcCkgewotCQlpZiAocCAhPSBudWxsKQotCQl7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoSUphdmFQcm9qZWN0KSBwLmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUb3VjaCBjbGFzc3BhdGguIEl0IHNpbXBseSB0YWtlcyB0aGUgY2xhc3NwYXRoIGFuZCBzZXRzIGl0IGJhY2sgaW4uCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0Ci0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlQ2xhc3NwYXRoKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKQotCQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBiaW5hcnkgb3V0cHV0IGZpbGVzIGZvciB0aGUgSmF2YVByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcmV0dXJuIHBhdGggdG8gYmluYXJ5IG91dHB1dCBmb2xkZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGphdmEgcHJvamVjdCBvciBvdGhlciBwcm9ibGVtLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmF2YVByb2plY3RPdXRwdXRMb2NhdGlvbihJUHJvamVjdCBwKSB7Ci0JCXRyeSB7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBnZXRKYXZhUHJvamVjdChwKTsKLQkJCWlmIChqYXZhUHJvaiA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKCFqYXZhUHJvai5pc09wZW4oKSkKLQkJCQlqYXZhUHJvai5vcGVuKG51bGwpOwotCQkJcmV0dXJuIGphdmFQcm9qLmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcHJvamVjdCdzIGJpbmFyeSBvdXRwdXQgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiBwcm9qZWN0J3Mgb3V0cHV0IGNvbnRhaW5lciBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgamF2YSBwcm9qZWN0IG9yIHNvbWUgb3RoZXIgZXJyb3IuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIGdldEphdmFQcm9qZWN0T3V0cHV0Q29udGFpbmVyKElQcm9qZWN0IHApIHsKLQkJSVBhdGggcGF0aCA9IGdldEphdmFQcm9qZWN0T3V0cHV0TG9jYXRpb24ocCk7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPT0gMSkKLQkJCXJldHVybiBwOwotCQlyZXR1cm4gcC5nZXRGb2xkZXIocGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJpbmFyeSBvdXRwdXQgYWJzb2x1dGUgKGxvY2FsIGZpbGUgc3lzdGVtKSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHJldHVybiBwcm9qZWN0J3Mgb3V0cHV0IHBhdGggb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGphdmEgcHJvamVjdCBvciBzb21lIG90aGVyIGVycm9yLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmF2YVByb2plY3RPdXRwdXRBYnNvbHV0ZUxvY2F0aW9uKElQcm9qZWN0IHApIHsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBnZXRKYXZhUHJvamVjdE91dHB1dENvbnRhaW5lcihwKTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKQotCQkJcmV0dXJuIGNvbnRhaW5lci5nZXRMb2NhdGlvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIEpEVCBKYXZhTW9kZWwuCi0JICogCi0JICogQHJldHVybiBKRFQncyBKYXZhTW9kZWwKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElKYXZhTW9kZWwgZ2V0SmF2YU1vZGVsKCkgewotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgc291cmNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdHMuCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qCi0JICogQHJldHVybiBzb3VyY2UgcGFja2FnZSBmcmFnbWVudCByb290cwotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3RzKElKYXZhUHJvamVjdCBqYXZhUHJvaikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gamF2YVByb2ouZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IHJvb3RzW2ldOwotCQkJaWYgKHJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKQotCQkJCXJlc3VsdC5hZGQocm9vdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHJlc291cmNlIGZyb20gdGhlIGNsYXNzcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHBhcmFtIHJlcwotCSAqICAgICAgICAgICAgcmVzb3VyY2UKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChJUHJvamVjdCBwLCBJUmVzb3VyY2UgcmVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHJlcy5nZXRGdWxsUGF0aCgpLCBudWxsLCBudWxsKTsKLQkJcmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgocCwgZW50cnkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgcGF0aCBmcm9tIHRoZSBjbGFzc3BhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBwYXRoIHRvIHJlbW92ZQotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKElQcm9qZWN0IHAsIElQYXRoIHBhdGgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSBmID0gcC5nZXRGaWxlKHBhdGgpOwotCQlyZW1vdmVGcm9tSmF2YUNsYXNzUGF0aChwLCBmKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGNsYXNzcGF0aCBlbnRyeSBmcm9tIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogQHBhcmFtIGVudHJ5Ci0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoSVByb2plY3QgcCwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgcC5nZXROYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJfQotCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgocHJpbVJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKGNsYXNzcGF0aCwgZW50cnkpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgbGlzdCBvZiBlbnRyaWVzIGZyb20gdGhlIGNsYXNzcGF0aCBvZiB0aGUgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEBwYXJhbSBlbnRyaWVzCi0JICogICAgICAgICAgICBsaXN0IG9mIElDbGFzc1BhdGhFbnRyeSdzCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoSVByb2plY3QgcCwgTGlzdCBlbnRyaWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgcC5nZXROYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJfQotCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgocHJpbVJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKGNsYXNzcGF0aCwgZW50cmllcyksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnlbXSBwcmltUmVtb3ZlRnJvbUphdmFDbGFzc1BhdGgoSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYm9vbGVhbiBkaWRSZW1vdmUgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBjcEVudHJ5ID0gY2xhc3NwYXRoW2ldOwotCQkJaWYgKCFlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKGNsYXNzcGF0aFtpXS5nZXRQYXRoKCkpKQotCQkJCXJlc3VsdC5hZGQoY3BFbnRyeSk7Ci0JCQllbHNlCi0JCQkJZGlkUmVtb3ZlID0gdHJ1ZTsKLQkJfQotCQlpZiAoIWRpZFJlbW92ZSkKLQkJCXJldHVybiBjbGFzc3BhdGg7Ci0JCXJldHVybiAoSUNsYXNzcGF0aEVudHJ5W10pIHJlc3VsdC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5W10gcHJpbVJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKElDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aCwgTGlzdCBlbnRyaWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJTGlzdCBhcnJheUxpc3QgPSBBcnJheXMuYXNMaXN0KGNsYXNzcGF0aCk7Ci0JCUxpc3QgcmVtb3ZlYWJsZSA9IG5ldyBBcnJheUxpc3QoYXJyYXlMaXN0KTsKLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5OwotCQlib29sZWFuIGRpZFJlbW92ZSA9IGZhbHNlOwotCQlpbnQgc2l6ZSA9IGVudHJpZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJZW50cnkgPSAoSUNsYXNzcGF0aEVudHJ5KSBlbnRyaWVzLmdldChpKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2xhc3NwYXRoLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5IGNwRW50cnkgPSBjbGFzc3BhdGhbal07Ci0JCQkJaWYgKGVudHJ5LmdldFBhdGgoKS5lcXVhbHMoY2xhc3NwYXRoW2pdLmdldFBhdGgoKSkpIHsKLQkJCQkJaWYgKHJlbW92ZWFibGUucmVtb3ZlKGNwRW50cnkpKQotCQkJCQkJZGlkUmVtb3ZlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFkaWRSZW1vdmUpCi0JCQlyZXR1cm4gY2xhc3NwYXRoOwotCQlyZXR1cm4gKElDbGFzc3BhdGhFbnRyeVtdKSByZW1vdmVhYmxlLnRvQXJyYXkobmV3IElDbGFzc3BhdGhFbnRyeVtyZW1vdmVhYmxlLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY2xhc3NwYXRoIGFzIGFuIGFycmF5IG9yIFVSTCdzLgotCSAqIAotCSAqIEBwYXJhbSBqYXZhUHJvamVjdAotCSAqIEByZXR1cm4gYXJyYXkgb2YgVVJMJ3Mgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgamF2YVByb2plY3Qgd2FzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMW10gZ2V0Q2xhc3NwYXRoQXNVUkxBcnJheShJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU2V0IHZpc2l0ZWQgPSBuZXcgSGFzaFNldCgpOwotCQlMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KDIwKTsKLQkJY29sbGVjdENsYXNzcGF0aFVSTHMoamF2YVByb2plY3QsIHVybHMsIHZpc2l0ZWQsIHRydWUpOwotCQlVUkxbXSByZXN1bHQgPSBuZXcgVVJMW3VybHMuc2l6ZSgpXTsKLQkJdXJscy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb2xsZWN0Q2xhc3NwYXRoVVJMcyhJSmF2YVByb2plY3QgamF2YVByb2plY3QsIExpc3QgdXJscywgU2V0IHZpc2l0ZWQsIGJvb2xlYW4gaXNGaXJzdFByb2plY3QpIHsKLQkJaWYgKHZpc2l0ZWQuY29udGFpbnMoamF2YVByb2plY3QpKQotCQkJcmV0dXJuOwotCQl2aXNpdGVkLmFkZChqYXZhUHJvamVjdCk7Ci0JCUlQYXRoIG91dFBhdGggPSBnZXRKYXZhUHJvamVjdE91dHB1dEFic29sdXRlTG9jYXRpb24oamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJb3V0UGF0aCA9IG91dFBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkJVVJMIG91dCA9IFByb2plY3RVdGlsaXRpZXMuY3JlYXRlRmlsZVVSTChvdXRQYXRoKTsKLQkJdXJscy5hZGQob3V0KTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWVudHJ5ID0gZW50cmllc1tpXTsKLQkJCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWToKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSOgotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRToKLQkJCQkJY29sbGVjdENsYXNzcGF0aEVudHJ5VVJMKGVudHJ5LCB1cmxzKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1Q6IHsKLQkJCQkJaWYgKGlzRmlyc3RQcm9qZWN0IHx8IGVudHJ5LmlzRXhwb3J0ZWQoKSkKLQkJCQkJCWNvbGxlY3RDbGFzc3BhdGhVUkxzKGdldEphdmFQcm9qZWN0KGVudHJ5KSwgdXJscywgdmlzaXRlZCwgZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbGxlY3RDbGFzc3BhdGhFbnRyeVVSTChJQ2xhc3NwYXRoRW50cnkgZW50cnksIExpc3QgdXJscykgewotCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQlpZiAobnVsbCA9PSBwYXRoLmdldERldmljZSgpKSB7Ci0JCQkvLyB3b3Jrc3BhY2UgcmVzb3VyY2UgLSBpcyB0aGUgSVBhdGggYSBmaWxlLCBmb2xkZXIsIG9yIGEgY2xhc3MgZm9sZGVyIHdob3NlIGxvY2F0aW9uIGlzIHRoZSBwcm9qZWN0IHJvb3Q/Ci0JCQlpZihwYXRoLnNlZ21lbnRDb3VudCgpID09IDEpIHsKLQkJCQkvLyBJdCdzIGEgY2xhc3MgZm9sZGVyIHdob3NlIGxvY2F0aW9uIGlzIHRoZSBwcm9qZWN0IHJvb3QKLQkJCQlwYXRoID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGgubGFzdFNlZ21lbnQoKSkuZ2V0TG9jYXRpb24oKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIEl0J3MgYSBmaWxlIG9yIGZvbGRlciAtIGNhcHR1cmUgaXQncyBhYnNvbHV0ZSBsb2NhdGlvbgotCQkJCUlGaWxlIGphckZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQkJaWYoamFyRmlsZS5leGlzdHMoKSl7Ci0JCQkJCXBhdGggPSBqYXJGaWxlLmdldExvY2F0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJVVJMIHVybCA9IFByb2plY3RVdGlsaXRpZXMuY3JlYXRlRmlsZVVSTChwYXRoKTsKLQkJaWYgKHVybCAhPSBudWxsKQotCQkJdXJscy5hZGQodXJsKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdChJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJSVByb2plY3QgcHJvaiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChlbnRyeS5nZXRQYXRoKCkuc2VnbWVudCgwKSk7Ci0JCWlmIChwcm9qICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0SmF2YVByb2plY3QocHJvaik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIElzIHRoaXMgcHJvamVjdCBhIGJpbmFyeSBwcm9qZWN0LgotCSAqIDxwPgotCSAqIFR5cGljYWxseSBhIEphdmEgcHJvamVjdCBpcyBjb25zaWRlcmVkIGJpbmFyeSBpZiBpdCBkb2VzIG5vdCBoYXZlIGEgc291cmNlIGVudHJ5IGluIHRoZSBjbGFzc3BhdGguCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIFByb2plY3QgdG8gdGVzdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcHJvamVjdCBpcyBhIGJpbmFyeSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JpbmFyeVByb2plY3QoSVByb2plY3QgYVByb2plY3QpIHsKLQkKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gZ2V0SmF2YVByb2plY3QoYVByb2plY3QpOwotCQlpZiAoamF2YVByb2ogPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbnRyaWVzID0gamF2YVByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0byBqYXZhIGNsYXNzIHBhdGguCi0JICogPHA+Ci0JICogQXBwZW5kIGEgbGlzdCBvZiBJQ2xhc3NwYXRoRW50cnkncyB0byB0aGUgYnVpbGQgcGF0aCBvZiB0aGUgcGFzc2VkIHByb2plY3QuIFVwZGF0ZWQgdG8gcmVtb3ZlIGV4aXN0aW5nIG9jY3VycmVuY2VzIG9mIHRoZSBwYXNzZWQgZW50cmllcyBiZWZvcmUKLQkgKiBhcHBlbmRpbmcuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHBhcmFtIGFwcGVuZENsYXNzcGF0aEVudHJpZXMKLQkgKiAgICAgICAgICAgIGxpc3Qgb2YgZW50cmllcwotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZEphdmFDbGFzc1BhdGgoSVByb2plY3QgcCwgTGlzdCBhcHBlbmRDbGFzc3BhdGhFbnRyaWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgcC5nZXROYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBpZ25vcmUpIHsKLQkJfQotCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlMaXN0IG5ld1BhdGhMaXN0ID0gbmV3IEFycmF5TGlzdChjbGFzc3BhdGgubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOwotCQkJCS8vIFNraXAgZW50cmllcyB3aGljaCBhcmUgaW4gdGhlIGFwcGVuZCBsaXN0Ci0JCQkJaWYgKGFwcGVuZENsYXNzcGF0aEVudHJpZXMuaW5kZXhPZihlbnRyeSkgPCAwKQotCQkJCQluZXdQYXRoTGlzdC5hZGQoZW50cnkpOwotCQkJfQotCQkJbmV3UGF0aExpc3QuYWRkQWxsKGFwcGVuZENsYXNzcGF0aEVudHJpZXMpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3Q2xhc3NwYXRoID0gKElDbGFzc3BhdGhFbnRyeVtdKSBuZXdQYXRoTGlzdC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbbmV3UGF0aExpc3Quc2l6ZSgpXSk7Ci0JCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCBjbGFzc3BhdGggZW50cnkuCi0JICogPHA+Ci0JICogQXBwZW5kIG9uZSBJQ2xhc3NwYXRoRW50cnkgdG8gdGhlIGJ1aWxkIHBhdGggb2YgdGhlIHBhc3NlZCBwcm9qZWN0LiBJZiBhIGNsYXNzcGF0aCBlbnRyeSBoYXZpbmcgdGhlIHNhbWUgcGF0aCBhcyB0aGUgcGFyYW1ldGVyIGFscmVhZHkgZXhpc3RzLAotCSAqIHRoZW4gZG9lcyBub3RoaW5nLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgUHJvamVjdAotCSAqIEBwYXJhbSBuZXdFbnRyeQotCSAqICAgICAgICAgICAgRW50cnkKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRKYXZhQ2xhc3NQYXRoKElQcm9qZWN0IHAsIElDbGFzc3BhdGhFbnRyeSBuZXdFbnRyeSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KHApOwotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCUxpc3QgbmV3UGF0aExpc3QgPSBuZXcgQXJyYXlMaXN0KGNsYXNzcGF0aC5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aC5sZW5ndGg7IGkrKykgewotCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY2xhc3NwYXRoW2ldOwotCQkJLy8gZml4IGR1cCBjbGFzcyBwYXRoIGVudHJ5IGZvciAuSkVURW1pdHRlciBwcm9qZWN0Ci0JCQkvLyBTa2lwIHRoZSBlbnRyeSB0byBiZSBhZGRlZCBpZiBpdCBhbHJlYWR5IGV4aXN0cwotCQkJaWYgKFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKFBsYXRmb3JtLk9TX1dJTjMyKSkgewotCQkJCWlmICghZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShuZXdFbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKSkpCi0JCQkJCW5ld1BhdGhMaXN0LmFkZChlbnRyeSk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWlmICghZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhuZXdFbnRyeS5nZXRQYXRoKCkpKQotCQkJCQluZXdQYXRoTGlzdC5hZGQoZW50cnkpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCW5ld1BhdGhMaXN0LmFkZChuZXdFbnRyeSk7Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIG5ld0NsYXNzcGF0aCA9IChJQ2xhc3NwYXRoRW50cnlbXSkgbmV3UGF0aExpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W25ld1BhdGhMaXN0LnNpemUoKV0pOwotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNvdXJjZSBwYXRoIG1hdGNoaW5nIHRoZSBwYXJhbWV0ZXI7IGlmIHRoZSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgaWYgdGhlIHNvdXJjZSBmb2xkZXIgaXMgbm90IG9uIHRoZSBjbGFzc3BhdGgsIHJldHVybiB0aGUgZmlyc3QKLQkgKiBzb3VyY2UgcGF0aCBvbiB0aGUgY2xhc3NwYXRoCi0JICogCi0JICogQHBhcmFtIHAKLQkgKiAgICAgICAgICAgIHByb2plY3QKLQkgKiBAcGFyYW0gZGVmYXVsdFNvdXJjZU5hbWUKLQkgKiAgICAgICAgICAgIHNvdXJjZSBmb2xkZXIgdG8gZmluZCBpZiBvbiBjbGFzc3BhdGgsIG9yIGlmIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBmaXJzdCBmb2xkZXIKLQkgKiBAcmV0dXJuIHBhdGggc2VhcmNoZWQgZm9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBqYXZhIHByb2plY3Qgb3Igc29tZSBvdGhlciBwcm9ibGVtLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0U291cmNlUGF0aE9yRmlyc3QoSVByb2plY3QgcCwgU3RyaW5nIGRlZmF1bHRTb3VyY2VOYW1lKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KHApOwotCQlpZiAoamF2YVByb2ogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBjcCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljcCA9IGphdmFQcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUNsYXNzcGF0aEVudHJ5IGZpcnN0U291cmNlID0gbnVsbDsKLQkJSVBhdGggZGVmYXVsdFNvdXJjZVBhdGggPSBudWxsOwotCQlpZiAoZGVmYXVsdFNvdXJjZU5hbWUgIT0gbnVsbCkKLQkJCWRlZmF1bHRTb3VyY2VQYXRoID0gUHJvamVjdFV0aWxpdGllcy5jcmVhdGVQYXRoKHAsIGRlZmF1bHRTb3VyY2VOYW1lKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNwW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJaWYgKGZpcnN0U291cmNlID09IG51bGwpIHsKLQkJCQkJZmlyc3RTb3VyY2UgPSBjcFtpXTsKLQkJCQkJaWYgKGRlZmF1bHRTb3VyY2VQYXRoID09IG51bGwpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGNwW2ldLmdldFBhdGgoKS5lcXVhbHMoZGVmYXVsdFNvdXJjZVBhdGgpKQotCQkJCQlyZXR1cm4gZGVmYXVsdFNvdXJjZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCX0KLQkJfQotCQlpZiAoZmlyc3RTb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZmlyc3RTb3VyY2UuZ2V0UGF0aCgpLnNlZ21lbnQoMCkuZXF1YWxzKHAuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBmaXJzdFNvdXJjZS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSGFjayB0byBmb3JjZSBhIHJlbG9hZCBvZiB0aGUgLmNsYXNzcGF0aCBmaWxlCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHByb2plY3QgdG8gcmVsb2FkCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZvcmNlQ2xhc3NwYXRoUmVsb2FkKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVByb2plY3QgamF2YVByb2ogPSBnZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJaWYgKGphdmFQcm9qICE9IG51bGwpIHsKLQkJCUlDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBqYXZhUHJvai5yZWFkUmF3Q2xhc3NwYXRoKCk7Ci0JCQlpZiAoZW50cmllcyAhPSBudWxsKSB7Ci0JCQkJSVBhdGggb3V0cHV0ID0gamF2YVByb2oucmVhZE91dHB1dExvY2F0aW9uKCk7Ci0JCQkJaWYgKG91dHB1dCAhPSBudWxsKQotCQkJCQlqYXZhUHJvai5zZXRSYXdDbGFzc3BhdGgoZW50cmllcywgb3V0cHV0LCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgcGF0aHMgb2YgYWxsIG9mIHRoZSBsb2NhbCBqYXJzIGluIHRoZSBjbGFzc3BhdGggZm9yIHRoZSBwcm9qZWN0LiBJdCBkb2VzIG5vdCByZWN1cnNlIGludG8gcmVmZXJlbmNlZCBwcm9qZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvagotCSAqICAgICAgICAgICAgcHJvamVjdCB0byBzZWFyY2ggKHNob3VsZCBiZSBhIGphdmEgcHJvamVjdCkuCi0JICogQHJldHVybiBBIGxpc3Qgb2YgSVBhdGgsIHdoZXJlIGVhY2ggZW50cnkgaXMgYSBwcm9qZWN0IHJlbGF0aXZlIHBhdGggdG8gYSBKQVIgY29udGFpbmVkIGluIHRoZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRMb2NhbEpBUlBhdGhzRnJvbUNsYXNzcGF0aChJUHJvamVjdCBwcm9qKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvaiA9IGdldEphdmFQcm9qZWN0KHByb2opOwotCQlpZiAoamF2YVByb2ogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IHByb2ouZ2V0RnVsbFBhdGgoKTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpIHsKLQkJCQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJaW50IHNlZ21lbnRzID0gcGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMocHJvamVjdFBhdGgpOwotCQkJCQlpZiAoc2VnbWVudHMgPiAwKQotCQkJCQkJcmVzdWx0LmFkZChwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoc2VnbWVudHMpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKRU1VdGlsUGx1Z2luLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNvdXJjZSBmb2xkZXIgbWF0Y2hpbmcgdGhlIHBhcmFtZXRlcjsgaWYgdGhlIHBhcmFtZXRlciBpcyBudWxsLCBvciBpZiB0aGUgc291cmNlIGZvbGRlciBpcyBub3Qgb24gdGhlIGNsYXNzcGF0aCwgcmV0dXJuIHRoZSBmaXJzdAotCSAqIHNvdXJjZSBmb2xkZXIgb24gdGhlIGNsYXNzcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICBwcm9qZWN0Ci0JICogQHBhcmFtIGRlZmF1bHRTb3VyY2VOYW1lCi0JICogICAgICAgICAgICBzb3VyY2UgZm9sZGVyIHRvIGZpbmQgaWYgb24gY2xhc3NwYXRoLCBvciBpZiA8Y29kZT5udWxsPC9jb2RlPiB0aGUgZmlyc3QgZm9sZGVyCi0JICogQHJldHVybiBjb250YWluZXIgc2VhcmNoZWQgZm9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBqYXZhIHByb2plY3Qgb3Igc29tZSBvdGhlciBwcm9ibGVtLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBnZXRTb3VyY2VGb2xkZXJPckZpcnN0KElQcm9qZWN0IHAsIFN0cmluZyBkZWZhdWx0U291cmNlTmFtZSkgewotCQl0cnkgewotCQkJSVBhdGggc291cmNlUGF0aCA9IGdldFNvdXJjZVBhdGhPckZpcnN0KHAsIGRlZmF1bHRTb3VyY2VOYW1lKTsKLQkJCWlmIChzb3VyY2VQYXRoID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQllbHNlIGlmIChzb3VyY2VQYXRoLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gcDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gcC5nZXRGb2xkZXIoc291cmNlUGF0aCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBJRm9sZGVyIHRoYXQgcmVwcmVzZW50cyBlYWNoIHNvdXJjZSBmb2xkZXIgaW4gYSBqYXZhIHByb2plY3QKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRTb3VyY2VDb250YWluZXJzKElQcm9qZWN0KX1iZWNhdXNlIHRoZSBwcm9qZWN0IGl0c2VsZiBtaWdodCBiZSBhIHNvdXJjZSBjb250YWluZXIKLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqICAgICAgICAgICAgcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U291cmNlRm9sZGVycyhJUHJvamVjdCBwKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0IHNvdXJjZUZvbGRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IHNvdXJjZVBhdGhzID0gZ2V0U291cmNlUGF0aHMocCk7Ci0JCQlpZiAoc291cmNlUGF0aHMgIT0gbnVsbCAmJiAhc291cmNlUGF0aHMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VQYXRocy5zaXplKCk7IGkrKykgewotCQkJCQlJUGF0aCBwYXRoID0gKElQYXRoKSBzb3VyY2VQYXRocy5nZXQoaSk7Ci0JCQkJCWlmICghcGF0aC5pc0VtcHR5KCkpCi0JCQkJCQlzb3VyY2VGb2xkZXJzLmFkZChwLmdldEZvbGRlcihwYXRoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHNvdXJjZUZvbGRlcnM7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvTm9BU1RSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvTm9BU1RSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjI4NTIzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L05vQVNUUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb247Ci0gCi0KLS8qKgotICogVGhpcyBpcyB1c2VkIGZvciBBU1QgUmVzb2x1dGlvbiwgYnV0IGl0IHNpbXBseSB0dXJucyBOYW1lIGludG8gUFROYW1lLiBVc2VmdWwgd2hlbgotICoganVzdCBjcmVhdGluZyBhIHBhcnNlIHRyZWUgd2hlcmUgd2Uga25vdyB0aGUgbmFtZXMgYXJlIG9rIGFuZCBqdXN0IHR5cGVzLiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTm9BU1RSZXNvbHZlciBleHRlbmRzIEFTVEJvdW5kUmVzb2x2ZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC5SZXNvbHZlciNyZXNvbHZlTmFtZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZSkKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIHJlc29sdmVOYW1lKE5hbWUgbmFtZSkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVE5hbWUobmFtZS50b1N0cmluZygpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULlJlc29sdmVyI3Jlc29sdmVUeXBlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVR5cGUoVHlwZSB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLnRvU3RyaW5nKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuUmVzb2x2ZXIjcmVzb2x2ZVR5cGUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWUpCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlVHlwZShOYW1lIG5hbWUpIHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuYW1lLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNULmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlNThhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotIAotLyoqCi0gKiBDcmVhdGUgYSBwYXJzZSB0cmVlIGZyb20gYW4gQVNUIG5vZGUuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVCBleHRlbmRzIEFTVFZpc2l0b3IgewotCXByb3RlY3RlZCBmaW5hbCBSZXNvbHZlciByZXNvbHZlcjsKLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGV4cHJlc3Npb247CS8vIEVhY2ggdmlzaXQgKG9yIGVuZHZpc2l0KSB3aWxsIHB1dCBpbnRvIGV4cHJlc3Npb24gdGhlIHJlc3VsdCBvZiB0aGUgdmlzaXQgaWYgaXQgcHJvZHVjZWQgYW4gZXhwcmVzc2lvbi4KLQkKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIHVzZWQgYnkgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUIHRvIHJlc29sdmUgdGhlIHR5cGVzIHRvIHRoZSBhcHByb3ByaWF0ZQotCSAqIHR5cGVzIChlLmcuICJTdHJpbmciIHRvICJqYXZhLmxhbmcuU3RyaW5nIikuIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUmVzb2x2ZXIgewotCQkKLQkJLyoqCi0JCSAqIFJlc29sdmUgdGhlIE5hbWUuIEl0IGNhbiByZXR1cm4gZWl0aGVyIGEgUFROYW1lIGlmIGl0IGlzIGp1c3QgYSBjbGFzc25hbWUsCi0JCSAqIG9yIGEgUFRGaWVsZEFjY2VzcyBpZiBpdCByZXNvbHZlcyB0byBhIFBURmllbGRBY2Nlc3MuIFRoZSBQVEZpZWxkQWNjZXNzIHNob3VsZAotCQkgKiBiZSBjb21wbGV0ZS4gZS5nIHdlIGhhdmUgY2xhc3MgbGlrZToKLQkJICogPGNvZGU+Ci0JCSAqIAlwYWNrYWdlIHh5ejsgCi0JCSAqIAlwdWJsaWMgY2xhc3MgQUNsYXNzIHsKLQkJICogCQlwdWJsaWMgamF2YS5hd3QuUmVjdGFuZ2xlIHJlY3Q7Ci0JCSAqIAl9IAotCQkgKiA8L2NvZGU+Ci0JCSAqIFRoZW4gYSBOYW1lIGxpa2UgPGNvZGU+QUNsYXNzLnJlY3QueDwvY29kZT4gc2hvdWxkIHJlc29sdmUgdG86Ci0JCSAqIAotCQkgKiBQVEZpZWxkQWNjZXNzOgotCQkgKiAJcmVjZWl2ZXI6IAotCQkgKiAJCVBURmllbGRBY2Nlc3MKLQkJICogCQkJcmVjZWl2ZXI6IHh5ei5BQ2xhc3MKLQkJICogCQkJZmllbGQ6ICJyZWN0IgotCQkgKiAJZmllbGQ6ICJ4IgotCQkgKgotCQkgKiBBY3R1YWxseSBpdCBjYW4gcmV0dXJuIGFueSB2YWxpZCBleHByZXNzaW9uIHRoYXQgaGFzIGEgdmFsdWUgKGkuZS4gaXQgY2Fubm90IGJlIGEgbWV0aG9kIGludm9jYXRpb24gd2l0aCBhIDxjb2RlPnZvaWQ8L2NvZGU+IHJldHVybiB0eXBlKS4gCi0JCSAqIAotCQkgKiBAcGFyYW0gbmFtZQotCQkgKiBAcmV0dXJuIEVpdGhlciBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lIChhcyBhIFBUTmFtZSkgb3IgYSBQVEZpZWxkQWNjZXNzLCBhbnkgb3RoZXIgdHlwZSBvZiBleHByZXNzaW9uLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgYWJzdHJhY3QgUFRFeHByZXNzaW9uIHJlc29sdmVOYW1lKE5hbWUgbmFtZSkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uOwotCQkKLQkJLyoqCi0JCSAqIFJlc29sdmUgdGhlIHR5cGUuIElmIGl0IGlzIGFuIGFycmF5IHR5cGUgcmV0dXJuIGl0IGluIGZvcm1hdCAidHlwZVtdW10iLgotCQkgKiAKLQkJICogQHBhcmFtIHR5cGUKLQkJICogQHJldHVybiBUaGUgdHlwZSBuYW1lLCBpbmNsdWRpbmcgYnJhY2tldHMgaWYgYXJyYXkgdHlwZS4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IFN0cmluZyByZXNvbHZlVHlwZShUeXBlIHR5cGUpIHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLQkJCi0JCS8qKgotCQkgKiBUaGlzIGlzIGZvciByZXNvbHZpbmcgInRoaXMiIGxpdGVyYWwuIEl0IHNob3VsZCBlaXRoZXIgcmV0dXJuIGEgUFRUaGlzTGl0ZXJhbCwgaWYgaXQKLQkJICogY2FuJ3QgZG8gcmVzb2x2ZSwgb3Igc29tZSBQVEV4cHJlc3Npb24gdGhhdCBjYW4gcmVzb2x2ZSB0byAidGhpcyIgZm9yIGV2YWx1YXRpb24uCi0JCSAqIAotCQkgKiBAcmV0dXJuIElmIHJlc29sdmFibGUsIGEgUFRFeHByZXNzaW9uLCBlbHNlIGEgUFRUaGlzTGl0ZXJhbCBpZiBub3QgcmVzb2x2YWJsZS4KLQkJICogQHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgYWJzdHJhY3QgUFRFeHByZXNzaW9uIHJlc29sdmVUaGlzKCkgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uOwotCQkKLQkJLyoqCi0JCSAqIFJlc29sdmUgdGhlIHR5cGUgc3BlY2lmaWVkIGFzIGEgTmFtZS4gSXQgbWF5IGJlIGEgc2ltcGxlIG5hbWUgb3IgaXQgbWF5IGJlCi0JCSAqIGEgcXVhbGlmaWVkIG5hbWUuIFRoaXMgaXMgdXNlZCB3aGVuIHdlIGhhdmUgTmFtZSB0aGF0IHdlIGtub3cgbXVzdCBiZSBhCi0JCSAqIHR5cGUuIFRoaXMgaXMgc28gdGhhdCB0aGVyZSBpcyBubyBjb25mdXNpb24gd2l0aCBpdCBwb3NzaWJseSBiZWluZyBhIGZpZWxkIG9yIHZhcmlhYmxlCi0JCSAqIHRoYXQgaGFzIHRoZSBzYW1lIGNhc2UgYW5kIHNwZWxsaW5nIGFzIGEgdHlwZSBuYW1lLgotCQkgKiBAcGFyYW0gbmFtZQotCQkgKiBAcmV0dXJuIHRoZSB0eXBlIG5hbWUuCi0JCSAqIEB0aHJvd3MgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24KLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IFN0cmluZyByZXNvbHZlVHlwZShOYW1lIG5hbWUpIHRocm93cyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbjsKLQkJCi0JCS8qKgotCQkgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIHJlc29sdmVyIGlmIGl0IGNhbid0IHJlc29sdmUgZm9yIHNvbWUgcmVhc29uLiBUaGlzIHdpbGwgdGhyb3cKLQkJICogYW4gaW52YWxpZCBleHByZXNzaW9uIGV4Y2VwdGlvbiB3aGljaCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVC4KLQkJICogCi0JCSAqIEBwYXJhbSBtc2cgTWVzc2FnZSB0byBiZSBwdXQgaW50byB0aGUgZXhjZXB0aW9uLgotCQkgKiBAdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uCi0JCSAqIAotCQkgKiBAc2luY2UgMS4wLjAKLQkJICovCi0JCXByb3RlY3RlZCBmaW5hbCB2b2lkIHRocm93SW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oU3RyaW5nIG1zZykgdGhyb3dzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIHsKLQkJCXRocm93IG5ldyBJbnZhbGlkRXhwcmVzc2lvbkV4Y2VwdGlvbihtc2cpOwotCQl9Ci0JfQotCQotCS8qCi0JICogV2hlbiBhbiBpbnZhbGlkIGV4cHJlc3Npb24gaGFzIGJlZW4gZm91bmQgdGhpcyBleGNlcHRpb24gc2hvdWxkIGJlIHRocm93bi4gSXQgd2lsbAotCSAqIGJlIGNhdWdodCBhdCB0aGUgdG9wIGFuZCBjb252ZXJ0ZWQgaW50byBhbiBJbnZhbGlkRXhwcmVzc2lvbiBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBhcnNlIHRyZWUgd2lsbCBiZQotCSAqIHRocm93biBhd2F5LiAKLQkgKiAKLQkgKiBUaGUgbWVzc2FnZSB3aWxsIGJlIGEgbWVzc2FnZSBhcyB0byB3aHkgaXQgaXMgaW52YWxpZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNDI5ODQ1NjMxOTE1MjA2Njc4TDsKLQotCQkvKioKLQkJICogQHBhcmFtIHMgVGhlIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiB0aGUgZmluYWwgaW52YWxpZCBleHByZXNzaW9uLgotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJCXN1cGVyKHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggdGhlIGdpdmVuIHJlc29sdmVyLgotCSAqIAotCSAqIEBwYXJhbSByZXNvbHZlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1QoUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLQkJdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIFByb2Nlc3MgdGhlIEFTVCBFeHByZXNzaW9uIGFuZCByZXR1cm4gYSBQVEV4cHJlc3Npb24uIElmIGFueSBwYXJ0IHdhcyBpbnZhbGlkLCB0aGVuCi0JICogb25seSBhbiBQVEludmFsaWRFeHByZXNzaW9uIHdpbGwgYmUgcmV0dXJuZWQuCi0JICogCi0JICogQHBhcmFtIGFzdEV4cHJlc3Npb24KLQkgKiBAcmV0dXJuIFRoZSBQVEV4cHJlc3Npb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGZpbmFsIFBURXhwcmVzc2lvbiBjcmVhdGVFeHByZXNzaW9uKEV4cHJlc3Npb24gYXN0RXhwcmVzc2lvbikgewotCQl0cnkgewotCQkJcmV0dXJuIHBlcmZvcm0oYXN0RXhwcmVzc2lvbik7Ci0JCX0gY2F0Y2ggKEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIENyZWF0ZSBhIG1zZyB0aGF0IGlzIGZvcm1lZCBvZiB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgYW5kIHRoZSBmdWxsIGluaXQgc3RyaW5nLgotCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFdvcmtiZW5jaFV0aWxpdHlNZXNzYWdlcy5QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfMCwgbmV3IE9iamVjdFtdIHtlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgYXN0RXhwcmVzc2lvbi50b1N0cmluZygpfSk7IAotCQkJUFRJbnZhbGlkRXhwcmVzc2lvbiBleHAgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCQkJZXhwLnNldE1lc3NhZ2UobXNnKTsKLQkJCXJldHVybiBleHA7Ci0JCX0JCi0JfQotCQotCS8qCi0JICogVmlzaXQgdGhlIEFTVCBleHByZXNzaW9uIGFuZCBnZXQgdGhlIFBhcnNlVHJlZSBFeHByZXNzaW9uLgotCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgaW5kaXZpZHVhbCB2aXNpdHMgd2hlbiBwYXJzaW5nIGEgdHJlZS4KLQkgKiBJdCBwYXNzZXMgdG8gdGhlIHRvcCBtZXRob2QgKGNyZWF0ZUV4cHJlc3Npb24pLCB3aGljaCBjYW4KLQkgKiBoYW5kbGUgdGhlIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uLgotCSAqIAotCSAqIElmIGFueSB2aXNpdCBkb2Vzbid0IHJldHVybiBhbiBleHByZXNzaW9uLCB0aGVuIGFuIGludmFsaWQKLQkgKiBleHByZXNzaW9uIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biB0byBpbmRpY2F0ZSB0aGlzLiBJZiB0aGUKLQkgKiBpbmNvbWluZyBleHByZXNzaW9uIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHJldHVybiBvZiA8Y29kZT5udWxsPC9jb2RlPiBpcyBvayBiZWNhdXNlCi0JICogdGhpcyB3b3VsZCBiZSBmb3IgYW4gb3B0aW9uYWwgZXhwcmVzc2lvbiB3aGljaCBkaWRuJ3QgZXhpc3QuCi0JICogCi0JICogQHJldHVybiBUaGUgbmV3IFBhcnNlVHJlZSBFeHByZXNzaW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGluY29taW5nIGV4cHJlc3Npb24gd2FzIG51bGwuIAotCSAqIAotCSAqIEBzZWUgY3JlYXRlRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbikKLQkgKiBAZXhjZXB0aW9uIEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFBURXhwcmVzc2lvbiBwZXJmb3JtKEV4cHJlc3Npb24gYXN0RXhwcmVzc2lvbikgewotCQlpZiAoYXN0RXhwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQlleHByZXNzaW9uID0gbnVsbDsKLQkJCWFzdEV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwotCQkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF9FeHByZXNzaW9uVG9vQ29tcGxpY2F0ZWRfRVhDXywgbmV3IE9iamVjdFtdIHthc3RFeHByZXNzaW9uLnRvU3RyaW5nKCl9KSk7IAotCQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7CS8vIFRoaXMgaXMgb2suIEl0IG1lYW5zIGFuIG9wdGlvbmFsIGV4cHJlc3Npb24gd2FzIGJlaW5nIHByb2Nlc3NlZCBhbmQgdGhlIGV4cHJlc3Npb24gZGlkbid0IGV4aXN0LgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUFjY2VzcyBub2RlKSB7Ci0JCVBUQXJyYXlBY2Nlc3MgYWEgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRBcnJheUFjY2VzcygpOwotCQlMaXN0IGluZGV4ZXMgPSBhYS5nZXRJbmRleGVzKCk7Ci0JCUV4cHJlc3Npb24gYXJyYXlFeHAgPSBub2RlOwotCQl3aGlsZSAoYXJyYXlFeHAuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0FDQ0VTUykgewotCQkJLy8gVmlzaXQgdGhlIGluZGV4IHRvIGdldCB0aGUgaW5kZXggZXhwcmVzc2lvbi4KLQkJCUFycmF5QWNjZXNzIGFycmF5ID0gKEFycmF5QWNjZXNzKSBhcnJheUV4cDsgCi0JCQlpbmRleGVzLmFkZCgwLCBwZXJmb3JtKGFycmF5LmdldEluZGV4KCkpKTsJLy8gV2UncmUgdHJ5aW5nIHRvIGNyZWF0ZSB0aGUgZmluYWwgZXhwcmVzc2lvbiBmcm9tIGluc2lkZSBvdXQsIHRoZSBpbmRleGVzIGFyZSBjcmVhdGVkIGluIHJldmVyc2Ugb3JkZXIuCi0JCQlhcnJheUV4cCA9IGFycmF5LmdldEFycmF5KCk7Ci0JCX0KLQkJYWEuc2V0QXJyYXkocGVyZm9ybShhcnJheUV4cCkpOwkvLyBGaW5hbCBhcnJheUV4cCBpcyB0aGUgdHJ1ZSBleHByZXNzaW9uLgotCQlleHByZXNzaW9uID0gYWE7CS8vIFNldCB0aGUgcmV0dXJuIGV4cHJlc3Npb24gZm9yIHRoaXMgdmlzaXQuCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5Q3JlYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlDcmVhdGlvbiBub2RlKSB7Ci0JCVBUQXJyYXlDcmVhdGlvbiBhYyA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVEFycmF5Q3JlYXRpb24oKTsKLQkJYWMuc2V0VHlwZShyZXNvbHZlci5yZXNvbHZlVHlwZShub2RlLmdldFR5cGUoKSkpOwotCQlMaXN0IGFjRGltcyA9IGFjLmdldERpbWVuc2lvbnMoKTsKLQkJTGlzdCBuRGltcyA9IG5vZGUuZGltZW5zaW9ucygpOwotCQlpbnQgbnNpemUgPSBuRGltcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnNpemU7IGkrKykgewotCQkJYWNEaW1zLmFkZChwZXJmb3JtKChFeHByZXNzaW9uKSBuRGltcy5nZXQoaSkpKTsKLQkJfQotCQlhYy5zZXRJbml0aWFsaXplcigoUFRBcnJheUluaXRpYWxpemVyKSBwZXJmb3JtKG5vZGUuZ2V0SW5pdGlhbGl6ZXIoKSkpOwotCQlleHByZXNzaW9uID0gYWM7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKLQkJUFRBcnJheUluaXRpYWxpemVyIGFpID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcigpOwotCQlMaXN0IGV4cHMgPSBub2RlLmV4cHJlc3Npb25zKCk7Ci0JCUxpc3QgYWlleHBzID0gYWkuZ2V0RXhwcmVzc2lvbnMoKTsKLQkJaW50IG5leHAgPSBleHBzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXhwOyBpKyspIHsKLQkJCWFpZXhwcy5hZGQocGVyZm9ybSgoRXhwcmVzc2lvbikgZXhwcy5nZXQoaSkpKTsKLQkJfQotCQlleHByZXNzaW9uID0gYWk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXNzaWdubWVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBc3NpZ25tZW50IG5vZGUpIHsKLQkJcmV0dXJuIGZhbHNlOwkvLyBXZSBjYW4ndCBoYW5kbGUgYXNzaWdubWVudC4KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQlQVEJvb2xlYW5MaXRlcmFsIGJsID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQm9vbGVhbkxpdGVyYWwoKTsKLQkJYmwuc2V0Qm9vbGVhblZhbHVlKG5vZGUuYm9vbGVhblZhbHVlKCkpOwotCQlleHByZXNzaW9uID0gYmw7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2FzdEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQlQVENhc3RFeHByZXNzaW9uIGN0CT0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oKTsKLQkJY3Quc2V0VHlwZShyZXNvbHZlci5yZXNvbHZlVHlwZShub2RlLmdldFR5cGUoKSkpOwotCQljdC5zZXRFeHByZXNzaW9uKHBlcmZvcm0obm9kZS5nZXRFeHByZXNzaW9uKCkpKTsKLQkJZXhwcmVzc2lvbiA9IGN0OwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNoYXJhY3RlckxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCVBUQ2hhcmFjdGVyTGl0ZXJhbCBjbCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoKTsKLQkJY2wuc2V0RXNjYXBlZFZhbHVlKG5vZGUuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCQljbC5zZXRDaGFyVmFsdWUobm9kZS5jaGFyVmFsdWUoKSk7Ci0JCWV4cHJlc3Npb24gPSBjbDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DbGFzc0luc3RhbmNlQ3JlYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpICE9IG51bGwpIHsgCi0JCQlQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gYWRlY2wgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQlhZGVjbC5zZXREZWNsYXJhdGlvbihub2RlLnRvU3RyaW5nKCkpOwotCQkJZXhwcmVzc2lvbiA9IGFkZWNsOwotCQl9IGVsc2UgewotCQkJUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2ljID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQkvLyBJZiBhc3QgbGV2ZWwgPSAyLCB0aGVuIHlvdSBtdXN0IHVzZSBnZXROYW1lLCBidXQgdGhlIG5hbWUgbmVlZHMgdG8gYmUgdHVybmVkIGludG8gYSB0eXBlCi0JCQkvLyBzbyB0aGF0IGl0IGNhbiBiZSByZXNvbHZlZC4gSWYgYXN0IGxldmVsID4gMiwgdGhlbiBpdCB3aWxsIHJldHVybiBhIHR5cGUgdG8gYmUgcmVzb2x2ZWQuCi0JCQkvLyBOb3RlOiBjYW4ndCBqdXN0IHVzZSByZXNvbHZlIG5hbWUgb24gdGhlIG5hbWUgYmVjYXVzZSBpZiBhIGZpZWxkIGFuZCBhIGNsYXNzIHdlcmUgc3BlbGxlZAotCQkJLy8gdGhlIHNhbWUgdGhlbiB0aGUgY29kZWdlbiByZXNvbHZlciB3b3VsZCByZXR1cm4gYW4gaW5zdGFuY2UgcmVmIHRvIHRoZSBmaWVsZCBpbnN0ZWFkLgotCQkJU3RyaW5nIHR5cGUgPSBub2RlLmdldEFTVCgpLmFwaUxldmVsKCkgPT0gQVNULkpMUzIgPyByZXNvbHZlci5yZXNvbHZlVHlwZShub2RlLmdldE5hbWUoKSkgOiByZXNvbHZlci5yZXNvbHZlVHlwZShub2RlLmdldFR5cGUoKSk7Ci0JCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJdHlwZSA9IG5vZGUuZ2V0QVNUKCkuYXBpTGV2ZWwoKSA9PSBBU1QuSkxTMiA/IG5vZGUuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIDogbm9kZS5nZXRUeXBlKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWNpYy5zZXRUeXBlKHR5cGUpOwotCQkJTGlzdCBhcmdzID0gY2ljLmdldEFyZ3VtZW50cygpOwotCQkJTGlzdCBuYXJncyA9IG5vZGUuYXJndW1lbnRzKCk7Ci0JCQlpbnQgbnNpemUgPSBuYXJncy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5zaXplOyBpKyspIHsKLQkJCQlhcmdzLmFkZChwZXJmb3JtKChFeHByZXNzaW9uKSBuYXJncy5nZXQoaSkpKTsKLQkJCX0KLQkJCWV4cHJlc3Npb24gPSBjaWM7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29uZGl0aW9uYWxFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JCVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNlID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7Ci0JCWNlLnNldENvbmRpdGlvbihwZXJmb3JtKG5vZGUuZ2V0RXhwcmVzc2lvbigpKSk7Ci0JCWNlLnNldFRydWUocGVyZm9ybShub2RlLmdldFRoZW5FeHByZXNzaW9uKCkpKTsKLQkJY2Uuc2V0RmFsc2UocGVyZm9ybShub2RlLmdldEVsc2VFeHByZXNzaW9uKCkpKTsKLQkJZXhwcmVzc2lvbiA9IGNlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkQWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJZXhwcmVzc2lvbiA9IGNyZWF0ZUZpZWxkQWNjZXNzKG5vZGUuZ2V0TmFtZSgpLmdldElkZW50aWZpZXIoKSwgcGVyZm9ybShub2RlLmdldEV4cHJlc3Npb24oKSkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gY3JlYXRlRmllbGRBY2Nlc3MoU3RyaW5nIG5hbWUsIFBURXhwcmVzc2lvbiByZWNlaXZlcikgewotCQlQVEZpZWxkQWNjZXNzIGZhID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBURmllbGRBY2Nlc3MoKTsKLQkJZmEuc2V0UmVjZWl2ZXIocmVjZWl2ZXIpOwotCQlmYS5zZXRGaWVsZChuYW1lKTsKLQkJcmV0dXJuIGZhOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEhhc2hNYXAgaW5maXhPcGVyVG9QYXJzZU9wZXI7Ci0JcHJpdmF0ZSBmaW5hbCBQVEluZml4T3BlcmF0b3IgZ2V0UGFyc2VJbmZpeChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3Igb3BlcmF0b3IpIHsKLQkJaWYgKHByZWZpeE9wZXJUb1BhcnNlT3BlciA9PSBudWxsKSB7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3BlciA9IG5ldyBIYXNoTWFwKDUpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5BTkQsIFBUSW5maXhPcGVyYXRvci5BTkRfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkNPTkRJVElPTkFMX0FORCwgUFRJbmZpeE9wZXJhdG9yLkNPTkRJVElPTkFMX0FORF9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuQ09ORElUSU9OQUxfT1IsIFBUSW5maXhPcGVyYXRvci5DT05ESVRJT05BTF9PUl9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuRElWSURFLCBQVEluZml4T3BlcmF0b3IuRElWSURFX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5FUVVBTFMsIFBUSW5maXhPcGVyYXRvci5FUVVBTFNfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkdSRUFURVJfRVFVQUxTLCBQVEluZml4T3BlcmF0b3IuR1JFQVRFUl9FUVVBTFNfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLkdSRUFURVIsIFBUSW5maXhPcGVyYXRvci5HUkVBVEVSX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5MRUZUX1NISUZULCBQVEluZml4T3BlcmF0b3IuTEVGVF9TSElGVF9MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVTU19FUVVBTFMsIFBUSW5maXhPcGVyYXRvci5MRVNTX0VRVUFMU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTEVTUywgUFRJbmZpeE9wZXJhdG9yLkxFU1NfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLk1JTlVTLCBQVEluZml4T3BlcmF0b3IuTUlOVVNfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLk5PVF9FUVVBTFMsIFBUSW5maXhPcGVyYXRvci5OT1RfRVFVQUxTX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5PUiwgUFRJbmZpeE9wZXJhdG9yLk9SX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTLCBQVEluZml4T3BlcmF0b3IuUExVU19MSVRFUkFMKTsKLQkJCWluZml4T3BlclRvUGFyc2VPcGVyLnB1dChJbmZpeEV4cHJlc3Npb24uT3BlcmF0b3IuUkVNQUlOREVSLCBQVEluZml4T3BlcmF0b3IuUkVNQUlOREVSX0xJVEVSQUwpOwotCQkJaW5maXhPcGVyVG9QYXJzZU9wZXIucHV0KEluZml4RXhwcmVzc2lvbi5PcGVyYXRvci5SSUdIVF9TSElGVF9TSUdORUQsIFBUSW5maXhPcGVyYXRvci5SSUdIVF9TSElGVF9TSUdORURfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlJJR0hUX1NISUZUX1VOU0lHTkVELCBQVEluZml4T3BlcmF0b3IuUklHSFRfU0hJRlRfVU5TSUdORURfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlRJTUVTLCBQVEluZml4T3BlcmF0b3IuVElNRVNfTElURVJBTCk7Ci0JCQlpbmZpeE9wZXJUb1BhcnNlT3Blci5wdXQoSW5maXhFeHByZXNzaW9uLk9wZXJhdG9yLlhPUiwgUFRJbmZpeE9wZXJhdG9yLlhPUl9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gKFBUSW5maXhPcGVyYXRvcikgaW5maXhPcGVyVG9QYXJzZU9wZXIuZ2V0KG9wZXJhdG9yKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkluZml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlQVEluZml4RXhwcmVzc2lvbiBpbmYgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRJbmZpeEV4cHJlc3Npb24oKTsKLQkJaW5mLnNldExlZnRPcGVyYW5kKHBlcmZvcm0obm9kZS5nZXRMZWZ0T3BlcmFuZCgpKSk7Ci0JCVBUSW5maXhPcGVyYXRvciBpbm9wZXIgPSBnZXRQYXJzZUluZml4KG5vZGUuZ2V0T3BlcmF0b3IoKSk7Ci0JCWlmIChpbm9wZXIgPT0gbnVsbCkgewotCQkJLy8gSXQgaXMgbm90IG9uZSB3ZSBjYW4gaGFuZGxlLgotCQkJdGhyb3cgbmV3IEludmFsaWRFeHByZXNzaW9uRXhjZXB0aW9uKAotCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChXb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMuUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX09wZXJhdG9yVG9vQ29tcGxpY2F0ZWRUb0hhbmRsZV9FWENfLCBuZXcgT2JqZWN0W10geyBub2RlLmdldE9wZXJhdG9yKCkudG9TdHJpbmcoKSB9KSk7IAotCQl9Ci0JCWluZi5zZXRPcGVyYXRvcihpbm9wZXIpOwotCQlpbmYuc2V0UmlnaHRPcGVyYW5kKHBlcmZvcm0obm9kZS5nZXRSaWdodE9wZXJhbmQoKSkpOwotCQlMaXN0IGVvcHMgPSBpbmYuZ2V0RXh0ZW5kZWRPcGVyYW5kcygpOwotCQlMaXN0IG5lb3BzID0gbm9kZS5leHRlbmRlZE9wZXJhbmRzKCk7Ci0JCWludCBuc2l6ZSA9IG5lb3BzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuc2l6ZTsgaSsrKSB7Ci0JCQllb3BzLmFkZChwZXJmb3JtKChFeHByZXNzaW9uKSBuZW9wcy5nZXQoaSkpKTsKLQkJfQotCQlleHByZXNzaW9uID0gaW5mOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkluc3RhbmNlb2ZFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KEluc3RhbmNlb2ZFeHByZXNzaW9uIG5vZGUpIHsKLQkJUFRJbnN0YW5jZW9mIGlub2YgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRJbnN0YW5jZW9mKCk7Ci0JCWlub2Yuc2V0T3BlcmFuZChwZXJmb3JtKG5vZGUuZ2V0TGVmdE9wZXJhbmQoKSkpOwotCQlpbm9mLnNldFR5cGUocmVzb2x2ZXIucmVzb2x2ZVR5cGUobm9kZS5nZXRSaWdodE9wZXJhbmQoKSkpOwotCQlleHByZXNzaW9uID0gaW5vZjsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Qb3N0Zml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQb3N0Zml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiBmYWxzZTsJLy8gV2UgY2FuJ3QgaGFuZGxlIHBvc3QgZml4LgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2RJbnZvY2F0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQlleHByZXNzaW9uID0gY3JlYXRlTWV0aG9kSW52b2NhdGlvbihub2RlLmdldE5hbWUoKS5nZXRJZGVudGlmaWVyKCksIHBlcmZvcm0obm9kZS5nZXRFeHByZXNzaW9uKCkpLCBub2RlLmFyZ3VtZW50cygpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG1ldGhvZCBpbnZvY2F0aW9uIHVzaW5nIHRoZSBnaXZpbmcgcmVjZWl2ZXIsIG5hbWUsIGFyZ3MuCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJvdGVjdGVkIFBUTWV0aG9kSW52b2NhdGlvbiBjcmVhdGVNZXRob2RJbnZvY2F0aW9uKFN0cmluZyBuYW1lLCBQVEV4cHJlc3Npb24gcmVjZWl2ZXIsIExpc3QgYXJnRXhwcmVzc2lvbnMpIHsKLQkJUFRNZXRob2RJbnZvY2F0aW9uIG1pID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbigpOwotCQltaS5zZXRSZWNlaXZlcihyZWNlaXZlcik7Ci0JCW1pLnNldE5hbWUobmFtZSk7Ci0JCUxpc3QgYXJncyA9IG1pLmdldEFyZ3VtZW50cygpOwotCQlpbnQgbnNpemUgPSBhcmdFeHByZXNzaW9ucy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnNpemU7IGkrKykgewotCQkJYXJncy5hZGQocGVyZm9ybSgoRXhwcmVzc2lvbikgYXJnRXhwcmVzc2lvbnMuZ2V0KGkpKSk7Ci0JCX0KLQkJcmV0dXJuIG1pOwotCX0KLQkKLQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdWxsTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCWV4cHJlc3Npb24gPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFROdWxsTGl0ZXJhbCgpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JCVBUTnVtYmVyTGl0ZXJhbCBubCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVE51bWJlckxpdGVyYWwoKTsKLQkJbmwuc2V0VG9rZW4obm9kZS5nZXRUb2tlbigpKTsKLQkJZXhwcmVzc2lvbiA9IG5sOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBwZSA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCXBlLnNldEV4cHJlc3Npb24ocGVyZm9ybShub2RlLmdldEV4cHJlc3Npb24oKSkpOwotCQlleHByZXNzaW9uID0gcGU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwIHByZWZpeE9wZXJUb1BhcnNlT3BlcjsKLQlwcml2YXRlIGZpbmFsIFBUUHJlZml4T3BlcmF0b3IgZ2V0UGFyc2VQcmVmaXgoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvciBvcGVyYXRvcikgewotCQlpZiAocHJlZml4T3BlclRvUGFyc2VPcGVyID09IG51bGwpIHsKLQkJCXByZWZpeE9wZXJUb1BhcnNlT3BlciA9IG5ldyBIYXNoTWFwKDUpOwotCQkJcHJlZml4T3BlclRvUGFyc2VPcGVyLnB1dChQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLkNPTVBMRU1FTlQsIFBUUHJlZml4T3BlcmF0b3IuQ09NUExFTUVOVF9MSVRFUkFMKTsKLQkJCXByZWZpeE9wZXJUb1BhcnNlT3Blci5wdXQoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5NSU5VUywgUFRQcmVmaXhPcGVyYXRvci5NSU5VU19MSVRFUkFMKTsKLQkJCXByZWZpeE9wZXJUb1BhcnNlT3Blci5wdXQoUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5OT1QsIFBUUHJlZml4T3BlcmF0b3IuTk9UX0xJVEVSQUwpOwotCQkJcHJlZml4T3BlclRvUGFyc2VPcGVyLnB1dChQcmVmaXhFeHByZXNzaW9uLk9wZXJhdG9yLlBMVVMsIFBUUHJlZml4T3BlcmF0b3IuUExVU19MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gKFBUUHJlZml4T3BlcmF0b3IpIHByZWZpeE9wZXJUb1BhcnNlT3Blci5nZXQob3BlcmF0b3IpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUHJlZml4RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQcmVmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0T3BlcmFuZCgpLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5OVU1CRVJfTElURVJBTCkgewotCQkJLy8gRm9yIG51bWJlciBsaXRlcmFscyB3ZSBzZWUgaWYgaXQgaXMgYSAiKyIgb3IgIi0iIHByZWZpeCwgYW5kIGlmIGl0IGlzLCB3ZSBzaW1wbHkKLQkJCS8vIGNyZWF0ZSBhIFBUTnVtYmVyTGl0ZXJhbCB3aXRoIHRoZSBvcGVyYXRvciBhbHJlYWR5IGluIGl0LiBJdCBpcyBhIHNpbXBsaWZpY2F0aW9uLgotCQkJLy8gQW55IG90aGVyIG9wZXJhdG9yIHdlJ3ZlIGxlZnQgYWxvbmUgc2luY2UgdGhvc2Ugd29uJ3QgYmUgZGVjb2RlZCBzaW1wbHkgYnkgdGhlCi0JCQkvLyBOdW1iZXIgZGVjb2Rlci4KLQkJCS8vIElmIG5vdCBhIG51bWJlciBsaXRlcmFsLCB0aGVuIGxlYXZlIGFsb25lIHNpbmNlIG5lZWRzIHRvIGJlIGhhbmRsZWQgYXMgYSBwcmVmaXgKLQkJCS8vIG9wZXJhdGlvbi4KLQkJCVByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3Igb3BlcmF0b3IgPSBub2RlLmdldE9wZXJhdG9yKCk7Ci0JCQlpZiAob3BlcmF0b3IgPT0gUHJlZml4RXhwcmVzc2lvbi5PcGVyYXRvci5QTFVTIHx8IG9wZXJhdG9yID09IFByZWZpeEV4cHJlc3Npb24uT3BlcmF0b3IuTUlOVVMpIHsKLQkJCQlQVE51bWJlckxpdGVyYWwgbm0gPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFROdW1iZXJMaXRlcmFsKCk7Ci0JCQkJbm0uc2V0VG9rZW4ob3BlcmF0b3IudG9TdHJpbmcoKSArICgoTnVtYmVyTGl0ZXJhbCkgbm9kZS5nZXRPcGVyYW5kKCkpLmdldFRva2VuKCkpOwotCQkJCWV4cHJlc3Npb24gPSBubTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlQVFByZWZpeEV4cHJlc3Npb24gcGUgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKCk7Ci0JCVBUUHJlZml4T3BlcmF0b3IgcHRvcGVyID0gZ2V0UGFyc2VQcmVmaXgobm9kZS5nZXRPcGVyYXRvcigpKTsKLQkJaWYgKHB0b3BlciA9PSBudWxsKSB7Ci0JCQkvLyBJdCBpcyBub3Qgb25lIHdlIGNhbiBoYW5kbGUuCi0JCQl0aHJvdyBuZXcgSW52YWxpZEV4cHJlc3Npb25FeGNlcHRpb24oCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLlBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVF9PcGVyYXRvclRvb0NvbXBsaWNhdGVkVG9IYW5kbGVfRVhDXywgbmV3IE9iamVjdFtdIHsgbm9kZS5nZXRPcGVyYXRvcigpLnRvU3RyaW5nKCkgfSkpOyAKLQkJfQotCQlwZS5zZXRPcGVyYXRvcihwdG9wZXIpOwotCQlwZS5zZXRFeHByZXNzaW9uKHBlcmZvcm0obm9kZS5nZXRPcGVyYW5kKCkpKTsKLQkJZXhwcmVzc2lvbiA9IHBlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZE5hbWUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkTmFtZSBub2RlKSB7Ci0JCWV4cHJlc3Npb24gPSByZXNvbHZlci5yZXNvbHZlTmFtZShub2RlKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW1wbGVOYW1lIG5vZGUpIHsKLQkJZXhwcmVzc2lvbiA9IHJlc29sdmVyLnJlc29sdmVOYW1lKG5vZGUpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU3RyaW5nTGl0ZXJhbCBub2RlKSB7Ci0JCVBUU3RyaW5nTGl0ZXJhbCBzbCA9IEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQVFN0cmluZ0xpdGVyYWwoKTsKLQkJc2wuc2V0RXNjYXBlZFZhbHVlKG5vZGUuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCQlzbC5zZXRMaXRlcmFsVmFsdWUobm9kZS5nZXRMaXRlcmFsVmFsdWUoKSk7Ci0JCWV4cHJlc3Npb24gPSBzbDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdXBlckZpZWxkQWNjZXNzKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN1cGVyRmllbGRBY2Nlc3Mgbm9kZSkgewotCQlleHByZXNzaW9uID0gY3JlYXRlRmllbGRBY2Nlc3Mobm9kZS5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLCByZXNvbHZlci5yZXNvbHZlVGhpcygpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdXBlck1ldGhvZEludm9jYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJZXhwcmVzc2lvbiA9IGNyZWF0ZU1ldGhvZEludm9jYXRpb24obm9kZS5nZXROYW1lKCkuZ2V0SWRlbnRpZmllcigpLCByZXNvbHZlci5yZXNvbHZlVGhpcygpLCBub2RlLmFyZ3VtZW50cygpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UaGlzRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUaGlzRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWV4cHJlc3Npb24gPSByZXNvbHZlci5yZXNvbHZlVGhpcygpOwotCQlyZXR1cm4gZmFsc2U7CQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCVBUVHlwZUxpdGVyYWwgcHRsID0gSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBUVHlwZUxpdGVyYWwoKTsKLQkJcHRsLnNldFR5cGUocmVzb2x2ZXIucmVzb2x2ZVR5cGUobm9kZS5nZXRUeXBlKCkpKTsKLQkJZXhwcmVzc2lvbiA9IHB0bDsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9Xb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNmMDllMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gvd29ya2JlbmNoL29yZy9lY2xpcHNlL2plbS93b3JrYmVuY2gvdXRpbGl0eS9Xb3JrYmVuY2hVdGlsaXR5TWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfRXhwcmVzc2lvblRvb0NvbXBsaWNhdGVkX0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX09wZXJhdG9yVG9vQ29tcGxpY2F0ZWRUb0hhbmRsZV9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxGaWVsZF9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxWYXJpYWJsZV9FWENfOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgV29ya2JlbmNoVXRpbGl0eU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC93b3JrYmVuY2gvb3JnL2VjbGlwc2UvamVtL3dvcmtiZW5jaC91dGlsaXR5L21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MTdmMzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoL3dvcmtiZW5jaC9vcmcvZWNsaXBzZS9qZW0vd29ya2JlbmNoL3V0aWxpdHkvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gezB9IC0gezF9Ci1QYXJzZVRyZWVDcmVhdGlvbkZyb21BU1RfRXhwcmVzc2lvblRvb0NvbXBsaWNhdGVkX0VYQ18gICAgICAgICAgID0gSVdBVjAxNzdFIEV4cHJlc3Npb24gInswfSIgaXMgdG9vIGNvbXBsaWNhdGVkLgotUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUX09wZXJhdG9yVG9vQ29tcGxpY2F0ZWRUb0hhbmRsZV9FWENfICAgICA9IElXQVYwMTc5RSBPcGVyYXRvciAiezB9IiBpcyB0b28gY29tcGxpY2F0ZWQgdG8gaGFuZGxlLgotQVNUQm91bmRSZXNvbHZlcl9DYW5ub3RIYW5kbGVMb2NhbEZpZWxkX0VYQ189Q2Fubm90IGhhbmRsZSBsb2NhbCBmaWVsZCBhY2Nlc3Mgb2YgInswfSIKLUFTVEJvdW5kUmVzb2x2ZXJfQ2Fubm90SGFuZGxlTG9jYWxWYXJpYWJsZV9FWENfPUNhbm5vdCBoYW5kbGUgbG9jYWwgdmFyaWFibGUgYWNjZXNzIG9mICJ7MH0iCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3NDU1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqYXZhaW5zdC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtb2ZqYXZhLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Njc0MDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLUBkb3QKLW9yZy5lY2xpcHNlLmplbV8yLjAuMjAwLjIwMDgwNjAzMTMwNC5qYXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5vcHRpb25zIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5M2Y4ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLW9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2d0cmFjZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZW0vZGVidWcvbG9ndHJhY2VmaWxlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2dsZXZlbD1kZWZhdWx0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxMzk5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotICAgIDxuYW1lPm9yZy5lY2xpcHNlLmplbTwvbmFtZT4KLSAgICA8Y29tbWVudD48L2NvbW1lbnQ+Ci0gICAgPHByb2plY3RzPjwvcHJvamVjdHM+Ci0gICAgPGJ1aWxkU3BlYz4KLSAgICAgICAgPGJ1aWxkQ29tbWFuZD4KLSAgICAgICAgICAgIDxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotICAgICAgICAgICAgPGFyZ3VtZW50cz48L2FyZ3VtZW50cz4KLSAgICAgICAgPC9idWlsZENvbW1hbmQ+Ci0gICAgICAgIDxidWlsZENvbW1hbmQ+Ci0gICAgICAgICAgICA8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotICAgICAgICAgICAgPGFyZ3VtZW50cz48L2FyZ3VtZW50cz4KLSAgICAgICAgPC9idWlsZENvbW1hbmQ+Ci0gICAgICAgIDxidWlsZENvbW1hbmQ+Ci0gICAgICAgICAgICA8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLSAgICAgICAgICAgIDxhcmd1bWVudHM+PC9hcmd1bWVudHM+Ci0gICAgICAgIDwvYnVpbGRDb21tYW5kPgotICAgIDwvYnVpbGRTcGVjPgotICAgIDxuYXR1cmVzPgotICAgICAgICA8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLSAgICAgICAgPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0gICAgPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNTA0NjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIEFwciAxNSAyMToxNDozNiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MDJlODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLSNTYXQgTWFyIDMxIDIzOjA4OjAzIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTE1MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWIzMmNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNUdWUgRmViIDIxIDEwOjA5OjAzIEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZm9ybWF0dGVyX3Byb2ZpbGU9X2p2ZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTAKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9amF2YTtqYXZheDtvcmc7b3JnLmVjbGlwc2Uud3RwO29yZy5lY2xpcHNlLmplbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZG07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RlO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmpjbTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qYXZhO29yZy5lY2xpcHNlLnZlO2NvbTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzMTdmNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZW07IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMC4yMDQucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuY29yZS5KRU1QbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5jb3JlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyxvcmcuZWNsaXBzZS5qZW0ucHJveHksb3JnLmVjbGlwc2UuamVtLnRlc3RzLG9yZy5lY2xpcHNlLmplbS51aSxvcmcuZWNsaXBzZS5qZW0udXRpbCxvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvLG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2giLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkazt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIiwKLSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaCIsCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYmVhbmluZm8sCi0gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8iLAotIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24sCi0gb3JnLmVjbGlwc2UuamVtLmphdmEsCi0gb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMsCi0gb3JnLmVjbGlwc2UuamVtLmphdmEuaW1wbCwKLSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyxvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIiwKLSBvcmcuZWNsaXBzZS5qZW0uamF2YS51dGlsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMy4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnByb3h5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0ICJhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL1JFQURfTUVfQkVGT1JFX0NIQU5HSU5HX01BTklGRVNUXDA0MVwwNDFcMDQxIiAiYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9SRUFEX01FX0JFRk9SRV9DSEFOR0lOR19NQU5JRkVTVFwwNDFcMDQxXDA0MSIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZDZiMmUuLjAwMDAwMDAKLS0tICJhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL1JFQURfTUVfQkVGT1JFX0NIQU5HSU5HX01BTklGRVNUXDA0MVwwNDFcMDQxIgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotRG8gbm90IGluY2x1ZGUgYSBuZXcgZGVwZW5kZW5jeSBwbHVnaW4gdG8gdGhlIE1BTklGRVNUIGZvciB0aGlzIHBsdWdpbmQhISEKLQotVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoaXMgcGx1Z2luIGlzIGFsc28gZXhlY3V0ZWQgb3V0c2lkZSBvZiBFY2xpcHNlIGZyYW1ld29yaywgc3VjaCBJQk0gV2Vic3BoZXJlIEFwcGxpY2F0aW9uIFNlcnZlciAoYykgSUJNLiBXZSBjYW5ub3QgYWRkCi1uZXcgZGVwZW5kZW5jaWVzIHRvIHRoZSBwbHVnaW4gYmVjYXVzZSB0aGUgY3VycmVudCBzZXQgaXMgY29uc2lkZXJlZCB0byBiZSBBUEkuIEFkZGluZyBhIG5ldyBzZXQgd2l0aG91dCBjb25zdWx0aW5nIHRob3NlIHVzZXJzIHdvdWxkIGJyZWFrCi10aGVtLgotCi1UaGUgZXh0ZXJuYWwgQVBJIGlzIGFueXRoaW5nIGluIHRoZSBtb2ZqYXZhIGZvbGRlci4gSWYgaXQgaXMgb25seSBmb3IgYSBjbGFzcyBpbiB0aGUgb3RoZXIgc291cmNlIGZvbGRlcihzKSBpdCBtYXkgYmUgT0sgc2luY2UgdGhleSB3b3VsZCBub3QgYmUgCi11c2luZyB0aGF0IGNvZGUuIEJ1dCBpdCB3b3VsZCBiZSBiZXN0IHRvIGNvbnN1bHQgd2l0aCB0aGVtIGZpcnN0LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNlYTU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD48aGVhZD48dGl0bGU+QWJvdXQ8L3RpdGxlPgotCi0KLQotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+PC9oZWFkPjxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPFA+SnVuZSwgMjAwODwvUD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQuaW5pIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTMxNDg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQubWFwcGluZ3MgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNlNTE2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgJFNvdXJjZTogL2N2c3Jvb3Qvd2VidG9vbHMvamVldG9vbHMubW92ZS93ZWJ0b29scy5qYXZhZWUuZ2l0L3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2Fib3V0LnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA2LzA1LzE4IDE5OjA5OjU4ICQKLSMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9SmF2YSBFTUYgTW9kZWxcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMuIDIwMDAsIDIwMDYuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy92ZXAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDlhZGQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc3JjLmV4Y2x1ZGVzID0gKiovLmN2c2lnbm9yZQotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5wbmcsXAotICAgICAgICAgICAgICAgb3ZlcnJpZGVzLyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBtb2RlbC8KLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgbW9kZWwvLFwKLSAgICAgICAgICAgICAgIHJvc2UvCi1vdXRwdXQuLiA9IGJpbi8KLXNvdXJjZS4uID0gbW9mamF2YS8sXAotICAgICAgICAgICBqYXZhaW5zdC8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2NvbXBvbmVudC54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTZlYmI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmplbSI+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZW0iIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mbyIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamVtLnByb3h5IiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZW0udWkiIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmplbS51dGlsIiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2VjbGlwc2UzMi5wbmcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhmYWMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbXBsaWNpdEFsbG9jYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0ltcGxpY2l0QWxsb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWQwNGRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0ltcGxpY2l0QWxsb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkltcGxpY2l0IEFsbG9jYXRpb248L2I+PC9lbT4nLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIGZvciBhbiBpbXBsaWNpdCBhbGxvY2F0aW9uIHdoZXJlIHRoZSBvYmplY3QgY29tZXMgZnJvbSB0aGUgZmVhdHVyZSBvZiBhbm90aGVyIG9iamVjdC4gSXQgaXMgdGhlIGxpdmUgSmF2YSB2YWx1ZSBmcm9tIHRoZSByZW1vdGUgdm0uCi0gKiA8L3A+IAotICogQHNpbmNlIDEuMC4wCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgaXMgZm9yIGFuIGltcGxpY2l0IGFsbG9jYXRpb24gd2hlcmUgdGhlIG9iamVjdCBjb21lcyBmcm9tIHRoZSBmZWF0dXJlIG9mIGFub3RoZXIgb2JqZWN0LiBJdCBpcyB0aGUgbGl2ZSBKYXZhIHZhbHVlIGZyb20gdGhlIHJlbW90ZSB2bS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24jZ2V0UGFyZW50IDxlbT5QYXJlbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRGZWF0dXJlIDxlbT5GZWF0dXJlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRJbXBsaWNpdEFsbG9jYXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW1wbGljaXRBbGxvY2F0aW9uIGV4dGVuZHMgSmF2YUFsbG9jYXRpb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBUaGUgcGFyZW50IHdobyBpcyB0byBnaXZlIHVwIHRoZSB2YWx1ZS4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQYXJlbnQoRU9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldEltcGxpY2l0QWxsb2NhdGlvbl9QYXJlbnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRU9iamVjdCBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkltcGxpY2l0QWxsb2NhdGlvbiNnZXRQYXJlbnQgPGVtPlBhcmVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmVudChFT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZlYXR1cmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIFRoZSBmZWF0dXJlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHF1ZXJ5IHRoZSBsaXZlIHZhbHVlLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GZWF0dXJlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldEltcGxpY2l0QWxsb2NhdGlvbl9GZWF0dXJlKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24jZ2V0RmVhdHVyZSA8ZW0+RmVhdHVyZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmVhdHVyZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RmVhdHVyZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgdmFsdWUpOwotCi19IC8vIEltcGxpY2l0QWxsb2NhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5pdFN0cmluZ0FsbG9jYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luaXRTdHJpbmdBbGxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjhjNWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vSW5pdFN0cmluZ0FsbG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Jbml0IFN0cmluZyBBbGxvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDxwPgotICogVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGFsbG9jYXRpb24gc3RyaW5nIGNhbiBiZSBwYXJzZWQgYnkgdGhlIHJlbW90ZSB2bS4gSXQgdXNlcyB0aGUgYWxsb2NTdHJpbmcuIAotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbiNnZXRBbGxvY1N0cmluZygpCi0gKiBAc2luY2UgMS4wLjAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGFsbG9jYXRpb24gc3RyaW5nIGNhbiBiZSBwYXJzZWQgYnkgdGhlIHJlbW90ZSB2bS4gSXQgdXNlcyB0aGUgYWxsb2NTdHJpbmcuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5pdFN0cmluZ0FsbG9jYXRpb24jZ2V0SW5pdFN0cmluZyA8ZW0+SW5pdCBTdHJpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldEluaXRTdHJpbmdBbGxvY2F0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluaXRTdHJpbmdBbGxvY2F0aW9uIGV4dGVuZHMgSmF2YUFsbG9jYXRpb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdCBTdHJpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXQgU3RyaW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXMgdGhlIGluaXRpYWxpemF0aW9uIHN0cmluZyBmb3IgdGhpcyBvYmplY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgU3RyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbml0U3RyaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldEluaXRTdHJpbmdBbGxvY2F0aW9uX0luaXRTdHJpbmcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SW5pdFN0cmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5pdFN0cmluZ0FsbG9jYXRpb24jZ2V0SW5pdFN0cmluZyA8ZW0+SW5pdCBTdHJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgU3RyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbml0U3RyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbml0U3RyaW5nKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW5pdFN0cmluZ0FsbG9jYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luc3RhbnRpYXRpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGVhMzNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luc3RhbnRpYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbnN0YW50aWF0aW9uRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5ewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW5zdGFudGlhdGlvbkZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluaXQgU3RyaW5nIEFsbG9jYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluaXQgU3RyaW5nIEFsbG9jYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUluaXRTdHJpbmdBbGxvY2F0aW9uIGNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkltcGxpY2l0IEFsbG9jYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkltcGxpY2l0IEFsbG9jYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUltcGxpY2l0QWxsb2NhdGlvbiBjcmVhdGVJbXBsaWNpdEFsbG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyc2UgVHJlZSBBbGxvY2F0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJzZSBUcmVlIEFsbG9jYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBhcnNlVHJlZUFsbG9jYXRpb24gY3JlYXRlUGFyc2VUcmVlQWxsb2NhdGlvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBwYXJzZSB0cmVlIGFsbG9jYXRpb24gd2l0aCBhbiBleHByZXNzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHJldHVybiBUaGUgbmV3IHBhcnNlIHRyZWUgYWxsb2NhdGlvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQYXJzZVRyZWVBbGxvY2F0aW9uIGNyZWF0ZVBhcnNlVHJlZUFsbG9jYXRpb24oUFRFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQXJyYXkgQWNjZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBBcnJheSBBY2Nlc3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQXJyYXlBY2Nlc3MgY3JlYXRlUFRBcnJheUFjY2VzcygpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgYXJyYXkgYWNjZXNzIHdpdGggdGhlIGFycmF5IGFuZCBpbmRleGVzLgotCSAqIAotCSAqIEBwYXJhbSBhcnJheQotCSAqIEBwYXJhbSBpbmRleGVzIGxpc3Qgb2YgaW5kZXggZXhwcmVzc2lvbnMKLQkgKiBAcmV0dXJuIFRoZSBuZXcgYXJyYXkgYWNjZXNzLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUQXJyYXlBY2Nlc3MgY3JlYXRlUFRBcnJheUFjY2VzcyhQVEV4cHJlc3Npb24gYXJyYXksIExpc3QgaW5kZXhlcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEFycmF5IENyZWF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBBcnJheSBDcmVhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRBcnJheUNyZWF0aW9uIGNyZWF0ZVBUQXJyYXlDcmVhdGlvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYW4gYXJyYXkgY3JlYXRpb24gd2l0aCB0aGUgdHlwZSwgZGltZW5zaW9ucywgYW5kIGluaXRpYWxpemVyLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlLCBlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+LgotCSAqIEBwYXJhbSBkaW1lbnNpb25zIFRoZSBkaW1lbnNpb24gZXhwcmVzc2lvbnMsIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGRpbWVuc2lvbiBleHByZXNzaW9ucy4KLQkgKiBAcGFyYW0gaW5pdGlhbGl6ZXIgVGhlIGluaXRpYWxpemVyLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbml0aWFsaXplci4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgYXJyYXkgY3JlYXRpb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRBcnJheUNyZWF0aW9uIGNyZWF0ZVBUQXJyYXlDcmVhdGlvbihTdHJpbmcgdHlwZSwgTGlzdCBkaW1lbnNpb25zLCBQVEFycmF5SW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBBcnJheSBJbml0aWFsaXplcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQXJyYXkgSW5pdGlhbGl6ZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQXJyYXlJbml0aWFsaXplciBjcmVhdGVQVEFycmF5SW5pdGlhbGl6ZXIoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGFuIGFycmF5IGluaXRpbGl6ZXIgd2l0aCBpbml0aWFsaXplIGV4cGVzc2lvbnMuCi0JICogQHBhcmFtIGV4cHJlc3Npb25zIFRoZSBsaXN0IG9mIGV4cHJlc3Npb25zLCA8Y29kZT5udWxsPC9jb2RlPiBpZiBlbXB0eSBhcnJheSBpbml0aWFsaXplci4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgYXJyYXkgaW5pdGlhbGl6ZXIuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRBcnJheUluaXRpYWxpemVyIGNyZWF0ZVBUQXJyYXlJbml0aWFsaXplcihMaXN0IGV4cHJlc3Npb25zKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQm9vbGVhbiBMaXRlcmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBCb29sZWFuIExpdGVyYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQm9vbGVhbkxpdGVyYWwgY3JlYXRlUFRCb29sZWFuTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBib29sZWFuIGxpdGVyYWwgd2l0aCBhIGdpdmVuIHZhbHVlLgotCSAqIEBwYXJhbSBib29sZWFuVmFsdWUKLQkgKiBAcmV0dXJuIFRoZSBuZXcgYm9vbGVhbiBsaXRlcmFsLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUQm9vbGVhbkxpdGVyYWwgY3JlYXRlUFRCb29sZWFuTGl0ZXJhbChib29sZWFuIGJvb2xlYW5WYWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBDYXN0IEV4cHJlc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIENhc3QgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRDYXN0RXhwcmVzc2lvbiBjcmVhdGVQVENhc3RFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBjYXN0IGV4cHJlc3Npb24uCi0JICogCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24sIGUuZy4gPGNvZGU+c2hvcnQ8L2NvZGU+IG9yIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+Ci0JICogQHBhcmFtIGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gYmVpbmcgY2FzdC4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgY2FzdCBleHByZXNzaW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUQ2FzdEV4cHJlc3Npb24gY3JlYXRlUFRDYXN0RXhwcmVzc2lvbihTdHJpbmcgdHlwZSwgUFRFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBDaGFyYWN0ZXIgTGl0ZXJhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQ2hhcmFjdGVyIExpdGVyYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQ2hhcmFjdGVyTGl0ZXJhbCBjcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IGNoYXJhY3RlciBsaXRlcmFsLgotCSAqIEBwYXJhbSBlc2NhcGVkVmFsdWUgVGhlIGVzY2FwZWQgdmFsdWUgdG8gdXNlLgotCSAqIEByZXR1cm4gVGhlIG5ldyBjaGFyYWN0ZXIgbGl0ZXJhbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVENoYXJhY3RlckxpdGVyYWwgY3JlYXRlUFRDaGFyYWN0ZXJMaXRlcmFsKFN0cmluZyBlc2NhcGVkVmFsdWUpOwkKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgQ2xhc3MgSW5zdGFuY2UgQ3JlYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIENsYXNzIEluc3RhbmNlIENyZWF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBjcmVhdGVQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgY2xhc3MgaW5zdGFuY2UgY3JlYXRpb24uCi0JICogCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIGNsYXNzLCBlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmc8L2NvZGU+LgotCSAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgZm9yIGFyZ3VtZW50cywgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIG5vIGFyZ3MuCi0JICogQHJldHVybiBUaGUgbmV3IGNsYXNzIGluc3RhbmNlIGNyZWF0aW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNyZWF0ZVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKFN0cmluZyB0eXBlLCBMaXN0IGFyZ3VtZW50cyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIENvbmRpdGlvbmFsIEV4cHJlc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIENvbmRpdGlvbmFsIEV4cHJlc3Npb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIGNyZWF0ZVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBjb25kaXRpb25hbCBleHByZXNzaW9uIHdpdGggdGhlIGNvbmRpdGlvbiBhbmQgdHJ1ZS9mYWxzZSBleHByZXNzaW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZGl0aW9uCi0JICogQHBhcmFtIHRydWVFeHByZXNzb2luCi0JICogQHBhcmFtIGZhbHNlRXhwcmVzc2lvbgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbihQVEV4cHJlc3Npb24gY29uZGl0aW9uLCBQVEV4cHJlc3Npb24gdHJ1ZUV4cHJlc3NvaW4sIFBURXhwcmVzc2lvbiBmYWxzZUV4cHJlc3Npb24pOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBGaWVsZCBBY2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEZpZWxkIEFjY2VzczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRGaWVsZEFjY2VzcyBjcmVhdGVQVEZpZWxkQWNjZXNzKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBmaWVsZCBhY2Nlc3Mgd2l0aCByZWNlaXZlciBhbmQgZmllbGQgbmFtZS4KLQkgKiBAcGFyYW0gcmVjZWl2ZXIgVGhlIHJlY2VpdmVyIGV4cHJlc3Npb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICogQHBhcmFtIGZpZWxkIFRoZSBmaWVsZCBuYW1lLgotCSAqIEByZXR1cm4gVGhlIG5ldyBmaWVsZCBhY2Nlc3MuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRGaWVsZEFjY2VzcyBjcmVhdGVQVEZpZWxkQWNjZXNzKFBURXhwcmVzc2lvbiByZWNlaXZlciwgU3RyaW5nIGZpZWxkKTsJCi0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEluZml4IEV4cHJlc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEluZml4IEV4cHJlc3Npb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUSW5maXhFeHByZXNzaW9uIGNyZWF0ZVBUSW5maXhFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBpbmZpeCBleHByZXNzaW9uIHdpdGggdGhlIGxlZnQvcmlnaHQvZXh0ZW5kZWQgb3BlcmFuZHMgYW5kIHRoZSBvcGVyYXRvci4KLQkgKiBAcGFyYW0gbGVmdE9wZXJhbmQKLQkgKiBAcGFyYW0gb3BlcmF0b3IKLQkgKiBAcGFyYW0gcmlnaHRPcGVyYW5kCi0JICogQHBhcmFtIGV4dGVuZGVkT3BlcmFuZHMgVGhlIGxpc3Qgb2YgZXh0ZW5kZWQgb3BlcmFuZHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGV4dGVuZGVkIG9wZXJhbmRzLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVEluZml4RXhwcmVzc2lvbiBjcmVhdGVQVEluZml4RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbGVmdE9wZXJhbmQsIFBUSW5maXhPcGVyYXRvciBvcGVyYXRvciwgUFRFeHByZXNzaW9uIHJpZ2h0T3BlcmFuZCwgTGlzdCBleHRlbmRlZE9wZXJhbmRzKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW5zdGFuY2VvZjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW5zdGFuY2VvZjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRJbnN0YW5jZW9mIGNyZWF0ZVBUSW5zdGFuY2VvZigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2Ygd2l0aCBhbiBvcGVyYW5kIGFuZCBhIHR5cGUuCi0JICogQHBhcmFtIG9wZXJhbmQKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSBvZi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVEluc3RhbmNlb2YgY3JlYXRlUFRJbnN0YW5jZW9mKFBURXhwcmVzc2lvbiBvcGVyYW5kLCBTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIE1ldGhvZCBJbnZvY2F0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBNZXRob2QgSW52b2NhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRNZXRob2RJbnZvY2F0aW9uIGNyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgbWV0aG9kIGludm9jYXRpb24gd2l0aCBhIHJlY2VpdmVyLCBuYW1lLCBhbmQgYXJndW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSByZWNlaXZlciBUaGUgcmVjZWl2ZXIgZXhwcmVzc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcmVjZWl2ZXIuCi0JICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZC4KLQkgKiBAcGFyYW0gYXJndW1lbnRzIFRoZSBsaXN0IG9mIGFyZ3VtZW50IGV4cHJlc3Npb25zLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhcmd1bWVudHMuCi0JICogQHJldHVybiBUaGUgbmV3IG1ldGhvZCBpbnZvY2F0aW9uLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUTWV0aG9kSW52b2NhdGlvbiBjcmVhdGVQVE1ldGhvZEludm9jYXRpb24oUFRFeHByZXNzaW9uIHJlY2VpdmVyLCBTdHJpbmcgbmFtZSwgTGlzdCBhcmd1bWVudHMpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBOYW1lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBOYW1lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVE5hbWUgY3JlYXRlUFROYW1lKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBuYW1lIHdpdGggdGhlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFRoZSBuZXcgbmFtZS4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVE5hbWUgY3JlYXRlUFROYW1lKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgTnVsbCBMaXRlcmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBOdWxsIExpdGVyYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUTnVsbExpdGVyYWwgY3JlYXRlUFROdWxsTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBOdW1iZXIgTGl0ZXJhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgTnVtYmVyIExpdGVyYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUTnVtYmVyTGl0ZXJhbCBjcmVhdGVQVE51bWJlckxpdGVyYWwoKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IG51bWJlciBsaXRlcmFsIHdpdGggdGhlIHRva2VuLgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4gVGhlIG5ldyBudW1iZXIgbGl0ZXJhbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVE51bWJlckxpdGVyYWwgY3JlYXRlUFROdW1iZXJMaXRlcmFsKFN0cmluZyB0b2tlbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFBhcmVudGhlc2l6ZWQgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgUGFyZW50aGVzaXplZCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIGNyZWF0ZVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiB3aXRoIHRoZSBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBleHByZXNzaW9uIFRoZSBleHByZXNzaW9uIHRoYXQgaXMgaW4gdGhlIHBhcmVudGhlc2lzLgotCSAqIEByZXR1cm4gVGhlIG5ldyBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBjcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBleHByZXNzaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgUHJlZml4IEV4cHJlc3Npb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFByZWZpeCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVFByZWZpeEV4cHJlc3Npb24gY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBwcmVmaXggZXhwcmVzc2lvbiBnaXZlbiBhbiBvcGVyYXRvciBhbmQgZXhwcmVzc2lvbi4KLQkgKiBAcGFyYW0gb3BlcmF0b3IKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqIEByZXR1cm4gVGhlIG5ldyBwcmVmaXggZXhwcmVzc2lvbi4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVFByZWZpeEV4cHJlc3Npb24gY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKFBUUHJlZml4T3BlcmF0b3Igb3BlcmF0b3IsIFBURXhwcmVzc2lvbiBleHByZXNzaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgU3RyaW5nIExpdGVyYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFN0cmluZyBMaXRlcmFsPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVFN0cmluZ0xpdGVyYWwgY3JlYXRlUFRTdHJpbmdMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBzdHJpbmcgbGl0ZXJhbCBnaXZlbiB0aGUgZXNjYXBlZCBsaXRlcmFsIHN0cmluZy4KLQkgKiBAcGFyYW0gZXNjYXBlTGl0ZXJhbAotCSAqIEByZXR1cm4gVGhlIG5ldyBzdHJpbmcgbGl0ZXJhbC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlQVFN0cmluZ0xpdGVyYWwgY3JlYXRlUFRTdHJpbmdMaXRlcmFsKFN0cmluZyBlc2NhcGVMaXRlcmFsKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgVGhpcyBMaXRlcmFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBUaGlzIExpdGVyYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUVGhpc0xpdGVyYWwgY3JlYXRlUFRUaGlzTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBUeXBlIExpdGVyYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIFR5cGUgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRUeXBlTGl0ZXJhbCBjcmVhdGVQVFR5cGVMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBVdGlsaXR5IHRvIGNyZWF0ZSBhIG5ldyB0eXBlIGxpdGVyYWwgZ2l2ZW4gdGhlIHR5cGUuCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIFRoZSBuZXcgdHlwZSBsaXRlcmFsLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBUVHlwZUxpdGVyYWwgY3JlYXRlUFRUeXBlTGl0ZXJhbChTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEludmFsaWQgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW52YWxpZCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEludmFsaWRFeHByZXNzaW9uIGNyZWF0ZVBUSW52YWxpZEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW5zdGFuY2UgUmVmZXJlbmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBUSW5zdGFuY2VSZWZlcmVuY2UgY3JlYXRlUFRJbnN0YW5jZVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QVCBBbm9ueW1vdXMgQ2xhc3MgRGVjbGFyYXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBUIEFub255bW91cyBDbGFzcyBEZWNsYXJhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGNyZWF0ZVBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjcmVhdGUgYSBuZXcgUFRJbnN0YW5jZVJlZmVyZW5jZSB3aXRoIGEgcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YW5jZQotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UFQgSW5zdGFuY2UgUmVmZXJlbmNlPC9lbT4nLgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCVBUSW5zdGFuY2VSZWZlcmVuY2UgY3JlYXRlUFRJbnN0YW5jZVJlZmVyZW5jZShJSmF2YUluc3RhbmNlIGluc3RhbmNlKTsKLQotCS8qKgotCSAqIFV0aWxpdHkgdG8gY3JlYXRlIGEgbmV3IGludmFsaWQgZXhwcmVzc2lvbiB3aXRoIGEgbWVzc2FnZS4KLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEByZXR1cm4gVGhlIG5ldyBpbnZhbGlkIGV4cHJlc3Npb24uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JUFRJbnZhbGlkRXhwcmVzc2lvbiBjcmVhdGVQVEludmFsaWRFeHByZXNzaW9uKFN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1wbGljaXQgQWxsb2NhdGlvbjwvZW0+JyBhcwotCSAqIHV0aWxpdHkgd2l0aCBhIGdpdmVuIGluaXQgc3RyaW5nLgotCSAqIEBwYXJhbSBpbml0U3RyaW5nIC0gU3RyaW5nIHRvIHB1dCBpbnRvIGluaXRpYWxpemF0aW9uLgotCSAqIEByZXR1cm4gVGhlIGFsbG9jYXRpb24gaW5pdGlhbGl6ZWQuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JSW5pdFN0cmluZ0FsbG9jYXRpb24gY3JlYXRlSW5pdFN0cmluZ0FsbG9jYXRpb24oU3RyaW5nIGluaXRTdHJpbmcpOwotCQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1wbGljaXQgQWxsb2NhdGlvbjwvZW0+JyBhcwotCSAqIHV0aWxpdHkgd2l0aCBhIGdpdmVuIHBhcmVudCBhbmQgZmVhdHVyZS4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBzb3VyY2UgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tLgotCSAqIEBwYXJhbSBzZiBUaGUgZmVhdHVyZSBvbiB0aGUgc291cmNlIGZvciB0aGUgdmFsdWUuCi0JICogQHJldHVybiBUaGUgYWxsb2NhdGlvbiBpbml0aWFsaXplZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlJbXBsaWNpdEFsbG9jYXRpb24gY3JlYXRlSW1wbGljaXRBbGxvY2F0aW9uKEVPYmplY3QgcGFyZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgc2YpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnN0YW50aWF0aW9uUGFja2FnZSBnZXRJbnN0YW50aWF0aW9uUGFja2FnZSgpOwotCi19IC8vSW5zdGFudGlhdGlvbkZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luc3RhbnRpYXRpb25QYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9JbnN0YW50aWF0aW9uUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2U3NDM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0luc3RhbnRpYXRpb25QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogSmF2YSBJbnN0YW50aWF0aW9uIFBhY2thZ2UKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluc3RhbnRpYXRpb25QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAiaW5zdGFudGlhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnN0YW50aWF0aW9uUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZSA8ZW0+SUphdmEgSW5zdGFuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2UKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldElKYXZhSW5zdGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUpBVkFfSU5TVEFOQ0UgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSmF2YSBJbnN0YW5jZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJSkFWQV9JTlNUQU5DRV9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlIDxlbT5JSmF2YSBPYmplY3QgSW5zdGFuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldElKYXZhT2JqZWN0SW5zdGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUpBVkFfT0JKRUNUX0lOU1RBTkNFID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2UgPGVtPklKYXZhIERhdGEgVHlwZSBJbnN0YW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRJSmF2YURhdGFUeXBlSW5zdGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSUpBVkFfREFUQV9UWVBFX0lOU1RBTkNFID0gMDsKLQotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5JSmF2YSBEYXRhIFR5cGUgSW5zdGFuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSUpBVkFfREFUQV9UWVBFX0lOU1RBTkNFX0ZFQVRVUkVfQ09VTlQgPSBJSkFWQV9JTlNUQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SUphdmEgT2JqZWN0IEluc3RhbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElKQVZBX09CSkVDVF9JTlNUQU5DRV9GRUFUVVJFX0NPVU5UID0gSUpBVkFfSU5TVEFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSmF2YUFsbG9jYXRpb25JbXBsIDxlbT5KYXZhIEFsbG9jYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkphdmFBbGxvY2F0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0SmF2YUFsbG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSkFWQV9BTExPQ0FUSU9OID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SmF2YSBBbGxvY2F0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5Jbml0U3RyaW5nQWxsb2NhdGlvbkltcGwgPGVtPkluaXQgU3RyaW5nIEFsbG9jYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluaXRTdHJpbmdBbGxvY2F0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU5JVF9TVFJJTkdfQUxMT0NBVElPTiA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBTdHJpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTklUX1NUUklOR19BTExPQ0FUSU9OX19JTklUX1NUUklORyA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW5pdCBTdHJpbmcgQWxsb2NhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTklUX1NUUklOR19BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgPSBKQVZBX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW1wbGljaXRBbGxvY2F0aW9uSW1wbCA8ZW0+SW1wbGljaXQgQWxsb2NhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW1wbGljaXRBbGxvY2F0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0SW1wbGljaXRBbGxvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IElNUExJQ0lUX0FMTE9DQVRJT04gPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNUExJQ0lUX0FMTE9DQVRJT05fX1BBUkVOVCA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZWF0dXJlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1QTElDSVRfQUxMT0NBVElPTl9fRkVBVFVSRSA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+SW1wbGljaXQgQWxsb2NhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTVBMSUNJVF9BTExPQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgPSBKQVZBX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QYXJzZVRyZWVBbGxvY2F0aW9uSW1wbCA8ZW0+UGFyc2UgVHJlZSBBbGxvY2F0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QYXJzZVRyZWVBbGxvY2F0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQQVJTRV9UUkVFX0FMTE9DQVRJT04gPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT04gPSBKQVZBX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBhcnNlIFRyZWUgQWxsb2NhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQVJTRV9UUkVFX0FMTE9DQVRJT05fRkVBVFVSRV9DT1VOVCA9IEpBVkFfQUxMT0NBVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEV4cHJlc3Npb25JbXBsIDxlbT5QVCBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEV4cHJlc3Npb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfRVhQUkVTU0lPTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEV4cHJlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5QWNjZXNzSW1wbCA8ZW0+UFQgQXJyYXkgQWNjZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5QWNjZXNzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRBcnJheUFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9BUlJBWV9BQ0NFU1MgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFycmF5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQUNDRVNTX19BUlJBWSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5kZXhlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQUNDRVNTX19JTkRFWEVTID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQXJyYXkgQWNjZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FSUkFZX0FDQ0VTU19GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5Q3JlYXRpb25JbXBsIDxlbT5QVCBBcnJheSBDcmVhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUNyZWF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRBcnJheUNyZWF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0FSUkFZX0NSRUFUSU9OID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfQ1JFQVRJT05fX1RZUEUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpbWVuc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FSUkFZX0NSRUFUSU9OX19ESU1FTlNJT05TID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsaXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEFycmF5IENyZWF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FSUkFZX0NSRUFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlJbml0aWFsaXplckltcGwgPGVtPlBUIEFycmF5IEluaXRpYWxpemVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5SW5pdGlhbGl6ZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEFycmF5SW5pdGlhbGl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfSU5JVElBTElaRVIgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHByZXNzaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQXJyYXkgSW5pdGlhbGl6ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQVJSQVlfSU5JVElBTElaRVJfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRCb29sZWFuTGl0ZXJhbEltcGwgPGVtPlBUIEJvb2xlYW4gTGl0ZXJhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRCb29sZWFuTGl0ZXJhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQm9vbGVhbkxpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQk9PTEVBTl9MSVRFUkFMID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9vbGVhbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0JPT0xFQU5fTElURVJBTF9fQk9PTEVBTl9WQUxVRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEJvb2xlYW4gTGl0ZXJhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9CT09MRUFOX0xJVEVSQUxfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDYXN0RXhwcmVzc2lvbkltcGwgPGVtPlBUIENhc3QgRXhwcmVzc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDYXN0RXhwcmVzc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQ2FzdEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfQ0FTVF9FWFBSRVNTSU9OID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NBU1RfRVhQUkVTU0lPTl9fVFlQRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwcmVzc2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIENhc3QgRXhwcmVzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DQVNUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbCA8ZW0+UFQgQ2hhcmFjdGVyIExpdGVyYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQ2hhcmFjdGVyTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9DSEFSQUNURVJfTElURVJBTCA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzY2FwZWQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DSEFSQUNURVJfTElURVJBTF9fRVNDQVBFRF9WQUxVRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhciBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NIQVJBQ1RFUl9MSVRFUkFMX19DSEFSX1ZBTFVFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQ2hhcmFjdGVyIExpdGVyYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0hBUkFDVEVSX0xJVEVSQUxfRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsIDxlbT5QVCBDbGFzcyBJbnN0YW5jZSBDcmVhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTiA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXJndW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fQVJHVU1FTlRTID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQ2xhc3MgSW5zdGFuY2UgQ3JlYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsIDxlbT5QVCBDb25kaXRpb25hbCBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT04gPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT04gPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRydWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GYWxzZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgQ29uZGl0aW9uYWwgRXhwcmVzc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBURmllbGRBY2Nlc3NJbXBsIDxlbT5QVCBGaWVsZCBBY2Nlc3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBURmllbGRBY2Nlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEZpZWxkQWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0ZJRUxEX0FDQ0VTUyA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlY2VpdmVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9GSUVMRF9BQ0NFU1NfX0ZJRUxEID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgRmllbGQgQWNjZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0ZJRUxEX0FDQ0VTU19GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluZml4RXhwcmVzc2lvbkltcGwgPGVtPlBUIEluZml4IEV4cHJlc3Npb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5maXhFeHByZXNzaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRJbmZpeEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfSU5GSVhfRVhQUkVTU0lPTiA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlZnQgT3BlcmFuZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3BlcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTkZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmlnaHQgT3BlcmFuZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIE9wZXJhbmRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTkZJWF9FWFBSRVNTSU9OX19FWFRFTkRFRF9PUEVSQU5EUyA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEluZml4IEV4cHJlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5GSVhfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluc3RhbmNlb2ZJbXBsIDxlbT5QVCBJbnN0YW5jZW9mPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluc3RhbmNlb2ZJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEluc3RhbmNlb2YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfSU5TVEFOQ0VPRiA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wZXJhbmQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTlNUQU5DRU9GX19PUEVSQU5EID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5TVEFOQ0VPRl9fVFlQRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEluc3RhbmNlb2Y8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5TVEFOQ0VPRl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE1ldGhvZEludm9jYXRpb25JbXBsIDxlbT5QVCBNZXRob2QgSW52b2NhdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRNZXRob2RJbnZvY2F0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRNZXRob2RJbnZvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX01FVEhPRF9JTlZPQ0FUSU9OID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjZWl2ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVIgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9NRVRIT0RfSU5WT0NBVElPTl9fTkFNRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXJndW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9NRVRIT0RfSU5WT0NBVElPTl9fQVJHVU1FTlRTID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgTWV0aG9kIEludm9jYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfTUVUSE9EX0lOVk9DQVRJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFROYW1lSW1wbCA8ZW0+UFQgTmFtZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFROYW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX05BTUUgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfTkFNRV9fTkFNRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIE5hbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfTkFNRV9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE51bGxMaXRlcmFsSW1wbCA8ZW0+UFQgTnVsbCBMaXRlcmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE51bGxMaXRlcmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFROdWxsTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9OVUxMX0xJVEVSQUwgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgTnVsbCBMaXRlcmFsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX05VTExfTElURVJBTF9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE51bWJlckxpdGVyYWxJbXBsIDxlbT5QVCBOdW1iZXIgTGl0ZXJhbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFROdW1iZXJMaXRlcmFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFROdW1iZXJMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX05VTUJFUl9MSVRFUkFMID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9rZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9OVU1CRVJfTElURVJBTF9fVE9LRU4gPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBOdW1iZXIgTGl0ZXJhbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9OVU1CRVJfTElURVJBTF9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbCA8ZW0+UFQgUGFyZW50aGVzaXplZCBFeHByZXNzaW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04gPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgUGFyZW50aGVzaXplZCBFeHByZXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFByZWZpeEV4cHJlc3Npb25JbXBsIDxlbT5QVCBQcmVmaXggRXhwcmVzc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRQcmVmaXhFeHByZXNzaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRQcmVmaXhFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX1BSRUZJWF9FWFBSRVNTSU9OID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3BlcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9QUkVGSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1IgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIFByZWZpeCBFeHByZXNzaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1BSRUZJWF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUU3RyaW5nTGl0ZXJhbEltcGwgPGVtPlBUIFN0cmluZyBMaXRlcmFsPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFN0cmluZ0xpdGVyYWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVFN0cmluZ0xpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFRfU1RSSU5HX0xJVEVSQUwgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc2NhcGVkIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfU1RSSU5HX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpdGVyYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9TVFJJTkdfTElURVJBTF9fTElURVJBTF9WQUxVRSA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIFN0cmluZyBMaXRlcmFsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX1NUUklOR19MSVRFUkFMX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUVGhpc0xpdGVyYWxJbXBsIDxlbT5QVCBUaGlzIExpdGVyYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUVGhpc0xpdGVyYWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVFRoaXNMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX1RISVNfTElURVJBTCA9IDI2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBUaGlzIExpdGVyYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfVEhJU19MSVRFUkFMX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUVHlwZUxpdGVyYWxJbXBsIDxlbT5QVCBUeXBlIExpdGVyYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUVHlwZUxpdGVyYWxJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVFR5cGVMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX1RZUEVfTElURVJBTCA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9UWVBFX0xJVEVSQUxfX1RZUEUgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBUeXBlIExpdGVyYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfVFlQRV9MSVRFUkFMX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW52YWxpZEV4cHJlc3Npb25JbXBsIDxlbT5QVCBJbnZhbGlkIEV4cHJlc3Npb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW52YWxpZEV4cHJlc3Npb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEludmFsaWRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0lOVkFMSURfRVhQUkVTU0lPTiA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9JTlZBTElEX0VYUFJFU1NJT05fX01FU1NBR0UgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5QVCBJbnZhbGlkIEV4cHJlc3Npb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFRfSU5WQUxJRF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5zdGFuY2VSZWZlcmVuY2VJbXBsIDxlbT5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5zdGFuY2VSZWZlcmVuY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCNnZXRQVEluc3RhbmNlUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0lOU1RBTkNFX1JFRkVSRU5DRSA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UFQgSW5zdGFuY2UgUmVmZXJlbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0lOU1RBTkNFX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UID0gUFRfRVhQUkVTU0lPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsIDxlbT5QVCBBbm9ueW1vdXMgQ2xhc3MgRGVjbGFyYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsI2dldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT04gPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWNsYXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fREVDTEFSQVRJT04gPSBQVF9FWFBSRVNTSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcG9ydHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fSU1QT1JUUyA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBUIEFub255bW91cyBDbGFzcyBEZWNsYXJhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fRkVBVFVSRV9DT1VOVCA9IFBUX0VYUFJFU1NJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhPcGVyYXRvciA8ZW0+UFQgSW5maXggT3BlcmF0b3I8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhPcGVyYXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRJbmZpeE9wZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBUX0lORklYX09QRVJBVE9SID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4T3BlcmF0b3IgPGVtPlBUIFByZWZpeCBPcGVyYXRvcjwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbnN0YW50aWF0aW9uUGFja2FnZUltcGwjZ2V0UFRQcmVmaXhPcGVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQVF9QUkVGSVhfT1BFUkFUT1IgPSAzMjsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlIDxlbT5JSmF2YSBPYmplY3QgSW5zdGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SUphdmEgT2JqZWN0IEluc3RhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFPYmplY3RJbnN0YW5jZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElKYXZhT2JqZWN0SW5zdGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkphdmFBbGxvY2F0aW9uIDxlbT5KYXZhIEFsbG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SmF2YSBBbGxvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSmF2YUFsbG9jYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEphdmFBbGxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5Jbml0U3RyaW5nQWxsb2NhdGlvbiA8ZW0+SW5pdCBTdHJpbmcgQWxsb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Jbml0IFN0cmluZyBBbGxvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5pdFN0cmluZ0FsbG9jYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEluaXRTdHJpbmdBbGxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluaXRTdHJpbmdBbGxvY2F0aW9uI2dldEluaXRTdHJpbmcgPGVtPkluaXQgU3RyaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5pdCBTdHJpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5Jbml0U3RyaW5nQWxsb2NhdGlvbiNnZXRJbml0U3RyaW5nKCkKLQkgKiBAc2VlICNnZXRJbml0U3RyaW5nQWxsb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb25fSW5pdFN0cmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uIDxlbT5JbXBsaWNpdCBBbGxvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkltcGxpY2l0IEFsbG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEltcGxpY2l0QWxsb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24jZ2V0UGFyZW50IDxlbT5QYXJlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QYXJlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb24jZ2V0UGFyZW50KCkKLQkgKiBAc2VlICNnZXRJbXBsaWNpdEFsbG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEltcGxpY2l0QWxsb2NhdGlvbl9QYXJlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uI2dldEZlYXR1cmUgPGVtPkZlYXR1cmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5GZWF0dXJlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uI2dldEZlYXR1cmUoKQotCSAqIEBzZWUgI2dldEltcGxpY2l0QWxsb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW1wbGljaXRBbGxvY2F0aW9uX0ZlYXR1cmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVHJlZUFsbG9jYXRpb24gPGVtPlBhcnNlIFRyZWUgQWxsb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYXJzZSBUcmVlIEFsbG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVRyZWVBbGxvY2F0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQYXJzZVRyZWVBbGxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVHJlZUFsbG9jYXRpb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVRyZWVBbGxvY2F0aW9uI2dldEV4cHJlc3Npb24oKQotCSAqIEBzZWUgI2dldFBhcnNlVHJlZUFsbG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBhcnNlVHJlZUFsbG9jYXRpb25fRXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uIDxlbT5QVCBFeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBURXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcyA8ZW0+UFQgQXJyYXkgQWNjZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEFycmF5IEFjY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUQXJyYXlBY2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcyNnZXRBcnJheSA8ZW0+QXJyYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BcnJheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MjZ2V0QXJyYXkoKQotCSAqIEBzZWUgI2dldFBUQXJyYXlBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUQXJyYXlBY2Nlc3NfQXJyYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzI2dldEluZGV4ZXMgPGVtPkluZGV4ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkluZGV4ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzI2dldEluZGV4ZXMoKQotCSAqIEBzZWUgI2dldFBUQXJyYXlBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUQXJyYXlBY2Nlc3NfSW5kZXhlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uIDxlbT5QVCBBcnJheSBDcmVhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBBcnJheSBDcmVhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRBcnJheUNyZWF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRQVEFycmF5Q3JlYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUQXJyYXlDcmVhdGlvbl9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldERpbWVuc2lvbnMgPGVtPkRpbWVuc2lvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpbWVuc2lvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24jZ2V0RGltZW5zaW9ucygpCi0JICogQHNlZSAjZ2V0UFRBcnJheUNyZWF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVEFycmF5Q3JlYXRpb25fRGltZW5zaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24jZ2V0SW5pdGlhbGl6ZXIgPGVtPkluaXRpYWxpemVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5pdGlhbGl6ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24jZ2V0SW5pdGlhbGl6ZXIoKQotCSAqIEBzZWUgI2dldFBUQXJyYXlDcmVhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRBcnJheUNyZWF0aW9uX0luaXRpYWxpemVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXIgPGVtPlBUIEFycmF5IEluaXRpYWxpemVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEFycmF5IEluaXRpYWxpemVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEFycmF5SW5pdGlhbGl6ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXIjZ2V0RXhwcmVzc2lvbnMgPGVtPkV4cHJlc3Npb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHByZXNzaW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplciNnZXRFeHByZXNzaW9ucygpCi0JICogQHNlZSAjZ2V0UFRBcnJheUluaXRpYWxpemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVEFycmF5SW5pdGlhbGl6ZXJfRXhwcmVzc2lvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWwgPGVtPlBUIEJvb2xlYW4gTGl0ZXJhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBCb29sZWFuIExpdGVyYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEJvb2xlYW5MaXRlcmFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEJvb2xlYW5MaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWwjaXNCb29sZWFuVmFsdWUgPGVtPkJvb2xlYW4gVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Cb29sZWFuIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRCb29sZWFuTGl0ZXJhbCNpc0Jvb2xlYW5WYWx1ZSgpCi0JICogQHNlZSAjZ2V0UFRCb29sZWFuTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRCb29sZWFuTGl0ZXJhbF9Cb29sZWFuVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24gPGVtPlBUIENhc3QgRXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBDYXN0IEV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVENhc3RFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFBUQ2FzdEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUQ2FzdEV4cHJlc3Npb25fVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uKCkKLQkgKiBAc2VlICNnZXRQVENhc3RFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVENhc3RFeHByZXNzaW9uX0V4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCA8ZW0+UFQgQ2hhcmFjdGVyIExpdGVyYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgQ2hhcmFjdGVyIExpdGVyYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUQ2hhcmFjdGVyTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwjZ2V0RXNjYXBlZFZhbHVlIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCNnZXRFc2NhcGVkVmFsdWUoKQotCSAqIEBzZWUgI2dldFBUQ2hhcmFjdGVyTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsX0VzY2FwZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwjZ2V0Q2hhclZhbHVlIDxlbT5DaGFyIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhciBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCNnZXRDaGFyVmFsdWUoKQotCSAqIEBzZWUgI2dldFBUQ2hhcmFjdGVyTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsX0NoYXJWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gPGVtPlBUIENsYXNzIEluc3RhbmNlIENyZWF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIENsYXNzIEluc3RhbmNlIENyZWF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24jZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbiNnZXRBcmd1bWVudHMgPGVtPkFyZ3VtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXJndW1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24jZ2V0QXJndW1lbnRzKCkKLQkgKiBAc2VlICNnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb25fQXJndW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiA8ZW0+UFQgQ29uZGl0aW9uYWwgRXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBDb25kaXRpb25hbCBFeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldENvbmRpdGlvbiA8ZW0+Q29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0Q29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fQ29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldFRydWUgPGVtPlRydWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5UcnVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0VHJ1ZSgpCi0JICogQHNlZSAjZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX1RydWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0RmFsc2UgPGVtPkZhbHNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RmFsc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRGYWxzZSgpCi0JICogQHNlZSAjZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX0ZhbHNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzIDxlbT5QVCBGaWVsZCBBY2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgRmllbGQgQWNjZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRGaWVsZEFjY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzI2dldFJlY2VpdmVyIDxlbT5SZWNlaXZlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlY2VpdmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzcyNnZXRSZWNlaXZlcigpCi0JICogQHNlZSAjZ2V0UFRGaWVsZEFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRGaWVsZEFjY2Vzc19SZWNlaXZlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEZpZWxkQWNjZXNzI2dldEZpZWxkIDxlbT5GaWVsZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzcyNnZXRGaWVsZCgpCi0JICogQHNlZSAjZ2V0UFRGaWVsZEFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRGaWVsZEFjY2Vzc19GaWVsZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24gPGVtPlBUIEluZml4IEV4cHJlc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgSW5maXggRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVEluZml4RXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRMZWZ0T3BlcmFuZCA8ZW0+TGVmdCBPcGVyYW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TGVmdCBPcGVyYW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0TGVmdE9wZXJhbmQoKQotCSAqIEBzZWUgI2dldFBUSW5maXhFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVEluZml4RXhwcmVzc2lvbl9MZWZ0T3BlcmFuZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRPcGVyYXRvciA8ZW0+T3BlcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcGVyYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldE9wZXJhdG9yKCkKLQkgKiBAc2VlICNnZXRQVEluZml4RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRJbmZpeEV4cHJlc3Npb25fT3BlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0UmlnaHRPcGVyYW5kIDxlbT5SaWdodCBPcGVyYW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmlnaHQgT3BlcmFuZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldFJpZ2h0T3BlcmFuZCgpCi0JICogQHNlZSAjZ2V0UFRJbmZpeEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUSW5maXhFeHByZXNzaW9uX1JpZ2h0T3BlcmFuZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldEV4dGVuZGVkT3BlcmFuZHMgPGVtPkV4dGVuZGVkIE9wZXJhbmRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlbmRlZCBPcGVyYW5kczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldEV4dGVuZGVkT3BlcmFuZHMoKQotCSAqIEBzZWUgI2dldFBUSW5maXhFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVEluZml4RXhwcmVzc2lvbl9FeHRlbmRlZE9wZXJhbmRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YgPGVtPlBUIEluc3RhbmNlb2Y8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgSW5zdGFuY2VvZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRJbnN0YW5jZW9mKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZiNnZXRPcGVyYW5kIDxlbT5PcGVyYW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+T3BlcmFuZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZiNnZXRPcGVyYW5kKCkKLQkgKiBAc2VlICNnZXRQVEluc3RhbmNlb2YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUSW5zdGFuY2VvZl9PcGVyYW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZiNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRQVEluc3RhbmNlb2YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUSW5zdGFuY2VvZl9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24gPGVtPlBUIE1ldGhvZCBJbnZvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIE1ldGhvZCBJbnZvY2F0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVE1ldGhvZEludm9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uI2dldFJlY2VpdmVyIDxlbT5SZWNlaXZlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlY2VpdmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uI2dldFJlY2VpdmVyKCkKLQkgKiBAc2VlICNnZXRQVE1ldGhvZEludm9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUTWV0aG9kSW52b2NhdGlvbl9SZWNlaXZlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0UFRNZXRob2RJbnZvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVE1ldGhvZEludm9jYXRpb25fTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXRBcmd1bWVudHMgPGVtPkFyZ3VtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXJndW1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uI2dldEFyZ3VtZW50cygpCi0JICogQHNlZSAjZ2V0UFRNZXRob2RJbnZvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQVE1ldGhvZEludm9jYXRpb25fQXJndW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWUgPGVtPlBUIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTmFtZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTmFtZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTmFtZSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRQVE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUTmFtZV9OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bGxMaXRlcmFsIDxlbT5QVCBOdWxsIExpdGVyYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgTnVsbCBMaXRlcmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdWxsTGl0ZXJhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFROdWxsTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsIDxlbT5QVCBOdW1iZXIgTGl0ZXJhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBOdW1iZXIgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVtYmVyTGl0ZXJhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFROdW1iZXJMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVtYmVyTGl0ZXJhbCNnZXRUb2tlbiA8ZW0+VG9rZW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ub2tlbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVtYmVyTGl0ZXJhbCNnZXRUb2tlbigpCi0JICogQHNlZSAjZ2V0UFROdW1iZXJMaXRlcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVE51bWJlckxpdGVyYWxfVG9rZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gPGVtPlBUIFBhcmVudGhlc2l6ZWQgRXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBQYXJlbnRoZXNpemVkIEV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkV4cHJlc3Npb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uI2dldEV4cHJlc3Npb24oKQotCSAqIEBzZWUgI2dldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25fRXhwcmVzc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uIDxlbT5QVCBQcmVmaXggRXhwcmVzc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBQcmVmaXggRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRQcmVmaXhFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbiNnZXRPcGVyYXRvciA8ZW0+T3BlcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcGVyYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbiNnZXRPcGVyYXRvcigpCi0JICogQHNlZSAjZ2V0UFRQcmVmaXhFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVFByZWZpeEV4cHJlc3Npb25fT3BlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FeHByZXNzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uI2dldEV4cHJlc3Npb24oKQotCSAqIEBzZWUgI2dldFBUUHJlZml4RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UFRQcmVmaXhFeHByZXNzaW9uX0V4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCA8ZW0+UFQgU3RyaW5nIExpdGVyYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgU3RyaW5nIExpdGVyYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUU3RyaW5nTGl0ZXJhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWwjZ2V0RXNjYXBlZFZhbHVlIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRFc2NhcGVkVmFsdWUoKQotCSAqIEBzZWUgI2dldFBUU3RyaW5nTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRTdHJpbmdMaXRlcmFsX0VzY2FwZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWwjZ2V0TGl0ZXJhbFZhbHVlIDxlbT5MaXRlcmFsIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGl0ZXJhbCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUU3RyaW5nTGl0ZXJhbCNnZXRMaXRlcmFsVmFsdWUoKQotCSAqIEBzZWUgI2dldFBUU3RyaW5nTGl0ZXJhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRTdHJpbmdMaXRlcmFsX0xpdGVyYWxWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUaGlzTGl0ZXJhbCA8ZW0+UFQgVGhpcyBMaXRlcmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIFRoaXMgTGl0ZXJhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVGhpc0xpdGVyYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUVGhpc0xpdGVyYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWwgPGVtPlBUIFR5cGUgTGl0ZXJhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBUeXBlIExpdGVyYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFR5cGVMaXRlcmFsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQVFR5cGVMaXRlcmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFR5cGVMaXRlcmFsI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFBUVHlwZUxpdGVyYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBUVHlwZUxpdGVyYWxfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbiA8ZW0+UFQgSW52YWxpZCBFeHByZXNzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBUIEludmFsaWQgRXhwcmVzc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW52YWxpZEV4cHJlc3Npb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUSW52YWxpZEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbiNnZXRNZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWVzc2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW52YWxpZEV4cHJlc3Npb24jZ2V0TWVzc2FnZSgpCi0JICogQHNlZSAjZ2V0UFRJbnZhbGlkRXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRJbnZhbGlkRXhwcmVzc2lvbl9NZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlUmVmZXJlbmNlIDxlbT5QVCBJbnN0YW5jZSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UFQgSW5zdGFuY2UgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZVJlZmVyZW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UFRJbnN0YW5jZVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlUmVmZXJlbmNlI2dldFJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZVJlZmVyZW5jZSNnZXRSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldFBUSW5zdGFuY2VSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBUSW5zdGFuY2VSZWZlcmVuY2VfUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gPGVtPlBUIEFub255bW91cyBDbGFzcyBEZWNsYXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QVCBBbm9ueW1vdXMgQ2xhc3MgRGVjbGFyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24jZ2V0RGVjbGFyYXRpb24gPGVtPkRlY2xhcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVjbGFyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24jZ2V0RGVjbGFyYXRpb24oKQotCSAqIEBzZWUgI2dldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uX0RlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uI2dldEltcG9ydHMgPGVtPkltcG9ydHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkltcG9ydHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24jZ2V0SW1wb3J0cygpCi0JICogQHNlZSAjZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25fSW1wb3J0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3IgPGVtPlBUIEluZml4IE9wZXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+UFQgSW5maXggT3BlcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0UFRJbmZpeE9wZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4T3BlcmF0b3IgPGVtPlBUIFByZWZpeCBPcGVyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlBUIFByZWZpeCBPcGVyYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4T3BlcmF0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0UFRQcmVmaXhPcGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2UgPGVtPklKYXZhIERhdGEgVHlwZSBJbnN0YW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSmF2YSBEYXRhIFR5cGUgSW5zdGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhRGF0YVR5cGVJbnN0YW5jZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldElKYXZhRGF0YVR5cGVJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlIDxlbT5JSmF2YSBJbnN0YW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JSmF2YSBJbnN0YW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFJbnN0YW5jZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRJSmF2YUluc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnN0YW50aWF0aW9uRmFjdG9yeSBnZXRJbnN0YW50aWF0aW9uRmFjdG9yeSgpOwotCi19IC8vSW5zdGFudGlhdGlvblBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0phdmFBbGxvY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9KYXZhQWxsb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWU2NThiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL0phdmFBbGxvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBBbGxvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiB0aGUgYWxsb2NhdGlvbiBjbGFzcy4gSXQgaXMgdGhlIHZhbHVlIG9mIHRoZSAiYWxsb2NhdGlvbiIgcHJvcGVydHkgb24gYSBKYXZhIE9iamVjdCBzbyB0aGF0IHRoZSBhY3R1YWwgYWxsb2NhdGlvbiBjYW4gYmUgY29udHJvbGxlZC4gRm9yIGV4YW1wbGUsIHRoZXJlIGNvdWxkIGJlIG9uZSBmb3IganVzdCBpbml0IHN0cmluZywgb3Igb25lIGZvciBzZXJpYWxpemVkLgotICogPC9wPgotICogQHNpbmNlIDEuMC4wCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgdGhlIGFsbG9jYXRpb24gY2xhc3MuIEl0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgImFsbG9jYXRpb24iIHByb3BlcnR5IG9uIGEgSmF2YSBPYmplY3Qgc28gdGhhdCB0aGUgYWN0dWFsIGFsbG9jYXRpb24gY2FuIGJlIGNvbnRyb2xsZWQuIEZvciBleGFtcGxlLCB0aGVyZSBjb3VsZCBiZSBvbmUgZm9yIGp1c3QgaW5pdCBzdHJpbmcsIG9yIG9uZSBmb3Igc2VyaWFsaXplZC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRKYXZhQWxsb2NhdGlvbigpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUFsbG9jYXRpb24gZXh0ZW5kcyBFT2JqZWN0ewotCQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoZSBhbGxvY2F0aW9uIGlzIGEgcGFyc2UgdHJlZSBhbGxvY2F0aW9uLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcGFyc2UgdHJlZSBhbGxvY2F0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzZVRyZWUoKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGUgYWxsb2NhdGlvbiBpcyBhbiBpbXBsaWNpdCBhbGxvY2F0aW9uLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaW1wbGljaXQgYWxsb2NhdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXQoKTsKLX0gLy8gSmF2YUFsbG9jYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYjZiOGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi5qYXZhLHYgMS4xIDIwMDUvMTAvMjggMjI6NTY6NDYgcmt1bHAgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QVCBBbm9ueW1vdXMgQ2xhc3MgRGVjbGFyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhbm9ueW1vdXMgY2xhc3MgZGVjbGFyYXRpb24uIEN1cnJlbnRseSB3ZSBvbmx5IHN0b3JlIHRoZSAKLSAqIGVudGlyZSBkZWNsYXJhdGlvbiBhcyBhIHN0cmluZywgaW5jbHVkaW5nIHRoZSAibmV3IEFDbGFzcygpIHsuLi59Ii4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24jZ2V0RGVjbGFyYXRpb24gPGVtPkRlY2xhcmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24jZ2V0SW1wb3J0cyA8ZW0+SW1wb3J0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWNsYXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlY2xhcmF0aW9uIHRleHQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlY2xhcmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWNsYXJhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25fRGVjbGFyYXRpb24oKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiNnZXREZWNsYXJhdGlvbiA8ZW0+RGVjbGFyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlY2xhcmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWNsYXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVjbGFyYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcG9ydHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXMgdGhlIGltcG9ydHMgbmVlZGVkIGluIHRoZSBtYWluIGNsYXNzIGJ5IHRoaXMgZGVjbGFyYXRpb24uIFRoaXMgaXMgYSB0cmFuc2llbnQgYXR0cmlidXRlLiBJdCBpcyBub3Qgc2VyaWFsaXplZCwgbm9yIGlzIGl0IHBhcnNlZCBpbnRvIGZyb20gZXhpc3RpbmcgY29kZS4gSXRzIG9ubHkgcHVycG9zZSBpcyB0byBoZWxwIGNvZGUgZ2VuZXJhdGlvbiBvbiBhIGJyYW5kIG5ldyBkZWNsYXJhdGlvbiB0byBrbm93IHdoYXQgaW1wb3J0cyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIG1haW4gY2xhc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkltcG9ydHM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25fSW1wb3J0cygpCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0SW1wb3J0cygpOwotCi19IC8vIFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUFjY2Vzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUFjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTI3MmMxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQXJyYXlBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJyYXkgQWNjZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQXJyYXkgYWNjZXNzLiBlLmcuIHhbM10uIAotICogCi0gKiBVbmxpa2UgQVNULCB0aGUgZW50aXJlIGV4cHJlc3Npb24gb2YgdHlwZSB4WzNdWzRdIHdpbGwgYmUgZG9uZSBpbiBvbmUgZXhwcmVzc2lvbiByYXRoZXIgdGhhbiBoYXZpbmcgYSBzZXBhcmF0ZSBBcnJheUFjY2VzcyBmb3IgZWFjaCBkaW1lbnNpb24uIFRoaXMgaXMganVzdCBhIHNpbXBsaWZpY2F0aW9uLiBUaGlzIGNhbiBvbmx5IGJlIHVzZWQgaWYgaXQgaXMgYSBzaW1wbGUgYXJyYXkgYWNjZXNzIHdoZXJlIGl0IGlzIG9mIHRoZSBmb3JtIHtleHByZXNzaW9ufVtleHByZXNzaW9uXVtleHByZXNzaW9uXS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzI2dldEFycmF5IDxlbT5BcnJheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUFjY2VzcyNnZXRJbmRleGVzIDxlbT5JbmRleGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFycmF5QWNjZXNzKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQXJyYXlBY2Nlc3MgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXJyYXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgYXJyYXkgdG8gYWNjZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcnJheTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXJyYXkoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBcnJheUFjY2Vzc19BcnJheSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0QXJyYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MjZ2V0QXJyYXkgPGVtPkFycmF5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BcnJheTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QXJyYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFycmF5KFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmRleGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBleHByZXNzaW9ucyByZXByZXNlbnRpbmcgdGhlIGluZGV4ZXMgb2YgdGhlIGFjY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXhlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQXJyYXlBY2Nlc3NfSW5kZXhlcygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRJbmRleGVzKCk7Ci0KLX0gLy8gQXJyYXlBY2Nlc3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQXJyYXlDcmVhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUNyZWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOGNhYTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRBcnJheUNyZWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnJheSBDcmVhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFycmF5IENyZWF0aW9uIGV4cHJlc3Npb24sIGUuZy4gbmV3IGludFszXSBvciBuZXcgamF2YS5sYW5nU3RyaW5nW11bXSB7eyJhIn0sIHsiYiJ9fQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24jZ2V0RGltZW5zaW9ucyA8ZW0+RGltZW5zaW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uI2dldEluaXRpYWxpemVyIDxlbT5Jbml0aWFsaXplcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRBcnJheUNyZWF0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQXJyYXlDcmVhdGlvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZnVsbHktcXVhbGlmaWVkIHR5cGUsIGUuZy4gaW50W11bXSBvciBqYXZhLmxhbmcuU3RyaW5nW10sIGluY2x1ZGluZyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbiBicmFja2V0cy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFycmF5Q3JlYXRpb25fVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5Q3JlYXRpb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGltZW5zaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGlzdCBvZiBleHByZXNzaW9ucyBmb3IgdGhlIGRpbWVuc2lvbnMuIFlvdSBjYW4gaGF2ZSBbM11bNF1bXSBidXQgW11bMzNdIGlzIGludmFsaWQuIFNvIGZvciBlYWNoIGRpbWVuc2lvbiB0aGF0IGhhcyBhbiBleHByZXNzaW9uLCB0aGVyZSB3aWxsIGJlIGFuIGVudHJ5IGluIHRoZSBsaXN0LCBpbiB0aGUgY29ycmVjdCBvcmRlci4gV2hlbiB5b3UgcmVhY2ggdGhlIGVtcHR5IGRpbWVuc2lvbnMsIHRoZSBsaXN0IHdpbGwgZW5kIHRvby4gCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpbWVuc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFycmF5Q3JlYXRpb25fRGltZW5zaW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERpbWVuc2lvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXRpYWxpemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSBpbml0aWFsaXplciwgaWYgYW55LCBmb3IgdGhpcyBhcnJheS4gRS5nLiBuZXcgaW50W10gezIsM30uIEl0IGlzIHRoZSB7MiwzfS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbGl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEluaXRpYWxpemVyKFBUQXJyYXlJbml0aWFsaXplcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQXJyYXlDcmVhdGlvbl9Jbml0aWFsaXplcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEFycmF5SW5pdGlhbGl6ZXIgZ2V0SW5pdGlhbGl6ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbiNnZXRJbml0aWFsaXplciA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWxpemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbml0aWFsaXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5pdGlhbGl6ZXIoUFRBcnJheUluaXRpYWxpemVyIHZhbHVlKTsKLQotfSAvLyBBcnJheUNyZWF0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEFycmF5SW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQXJyYXlJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzZmNWY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQXJyYXlJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnJheSBJbml0aWFsaXplcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFycmF5IGluaXRpYWxpemF0aW9uIGV4cHJlc3Npb24uIFRoaXMgaXMgdGhlIGVudGlyZSBleHByZXNzaW9uLCBlLmcuIHsyLCAzfSwgb3Ige3syLDN9LCA0fS4gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgezIsM30gd2lsbCBiZSBhbiBBcnJheUluaXRpYWxpemVyIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGV4cHJlc3Npb25zIGxpc3QgZm9yIHRoZSB0b3AgQXJyYXlJbml0aWFsaXplci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXIjZ2V0RXhwcmVzc2lvbnMgPGVtPkV4cHJlc3Npb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEFycmF5SW5pdGlhbGl6ZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRBcnJheUluaXRpYWxpemVyIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4cHJlc3Npb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXN0aGUgbGlzdCBvZiBleHByZXNzaW9ucyB3aXRoaW4gdGhlIGluaXRpYWxpemVyLCBlLmcuIHsyLCAzfSwgb3Ige3syLDN9LCA0fS4gSW4gdGhlIGZpcnN0IGNhc2UgaXQgd2lsbCBiZSB0d28gTnVtYmVyTGl0ZXJhbHMuIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlIHsyLDN9IHdpbGwgYmUgYW4gQXJyYXlJbml0aWFsaXplciwgZm9sbG93ZWQgYnkgYSBOdW1iZXJMaXRlcmFsLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHByZXNzaW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQXJyYXlJbml0aWFsaXplcl9FeHByZXNzaW9ucygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4cHJlc3Npb25zKCk7Ci0KLX0gLy8gQXJyYXlJbml0aWFsaXplcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRCb29sZWFuTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRCb29sZWFuTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTU2ZGVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQm9vbGVhbkxpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Cb29sZWFuIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgYm9vbGVhbiBsaXRlcmFsLCBpLmUuIHRydWUgb3IgZmFsc2UgZGlyZWN0bHkgaW4gdGhlIGNvZGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRCb29sZWFuTGl0ZXJhbCNpc0Jvb2xlYW5WYWx1ZSA8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRCb29sZWFuTGl0ZXJhbCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEJvb2xlYW5MaXRlcmFsIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJvb2xlYW4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgbGl0ZXJhbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Qm9vbGVhblZhbHVlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEJvb2xlYW5MaXRlcmFsX0Jvb2xlYW5WYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNCb29sZWFuVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWwjaXNCb29sZWFuVmFsdWUgPGVtPkJvb2xlYW4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJvb2xlYW4gVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzQm9vbGVhblZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCb29sZWFuVmFsdWUoYm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gQm9vbGVhbkxpdGVyYWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ2FzdEV4cHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ2FzdEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliZDIwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENhc3RFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIENhc3QgZXhwcmVzc2lvbiwgZS5nLiAoc2hvcnQpIDEwCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ2FzdEV4cHJlc3Npb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRDYXN0RXhwcmVzc2lvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSBvZiB0aGUgY2FzdCwgZS5nLiBpbnQgb3IgamF2YS5sYW5nLlN0cmluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ2FzdEV4cHJlc3Npb25fVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBleHByZXNzaW9uIGJlaW5nIGNhc3RlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVENhc3RFeHByZXNzaW9uX0V4cHJlc3Npb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gdmFsdWUpOwotCi19IC8vIENhc3QKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ2hhcmFjdGVyTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDaGFyYWN0ZXJMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMjFkNmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDaGFyYWN0ZXJMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcmFjdGVyIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGlzIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgY2hhcmFjdGVyIGV4cHJlc3Npb24sIGUuZy4gJ2EnIG9yICdccicuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsI2dldEVzY2FwZWRWYWx1ZSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsI2dldENoYXJWYWx1ZSA8ZW0+Q2hhciBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQ2hhcmFjdGVyTGl0ZXJhbCBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc2NhcGVkIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4gSW4gb3RoZXIgd29yZHMgdGhlIGxpdGVyYWwgZXhhY3RseSBhcyBpdCBpcyBpbiB0aGUgamF2YSBmaWxlLiBFLmcuICdhJyBvciAnXHInLiBJbmNsdWRpbmcgdGhlIHN1cnJvdW5kaW5nIHNpbmdsZSBxdW90ZXMgdGhlbXNlbHZlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXNjYXBlZFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ2hhcmFjdGVyTGl0ZXJhbF9Fc2NhcGVkVmFsdWUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXNjYXBlZFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwjZ2V0RXNjYXBlZFZhbHVlIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Fc2NhcGVkIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFc2NhcGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVzY2FwZWRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhciBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBwcmltaXRpdmUgY2hhcmFjdGVyIHdpdGhvdXQgdGhlIHF1b3Rlcy4gRXNjYXBlIGFyZSBldmFsdWF0ZWQgYW5kIHR1cm5lZCBpbnRvIHRoZWlyIGNoYXJhY3RlciB2YWx1ZS4gVGhpcyBpcyBhIHRyYW5zaWVudCBmaWVsZC4gSWYgbm90IHNldCB3aGVuIGNyZWF0ZWQgd2hlbiBxdWVyaWVkIGl0IHdpbGwgY3JlYXRlIGl0LiBUeXBpY2FsbHkgaXQgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGVkIGZyb20gYW4gQVNUIG5vZGUgc2luY2UgdGhlIG5vZGUgYWxyZWFkeSBoYXMgZXZhbHVhdGVkIGl0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFyIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFyVmFsdWUoY2hhcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ2hhcmFjdGVyTGl0ZXJhbF9DaGFyVmFsdWUoKQotCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWNoYXIgZ2V0Q2hhclZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWwjZ2V0Q2hhclZhbHVlIDxlbT5DaGFyIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFyIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDaGFyVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENoYXJWYWx1ZShjaGFyIHZhbHVlKTsKLQotfSAvLyBDaGFyYWN0ZXJMaXRlcmFsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENsYXNzSW5zdGFuY2VDcmVhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxZTMxMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVENsYXNzSW5zdGFuY2VDcmVhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DbGFzcyBJbnN0YW5jZSBDcmVhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIENsYXNzIGluc3RhbmNlIGNyZWF0aW9uIGV4cHJlc3Npb24uIEUuZy4gbmV3IFN0cmluZygiYSIpCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24jZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24jZ2V0QXJndW1lbnRzIDxlbT5Bcmd1bWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXMgdGhlIHR5cGUgb2YgdGhlIGNsYXNzLiBFLmcuIGphdmEubGFuZy5TdHJpbmcuIFRoaXMgc2hvdWxkIGJlIGZ1bGx5LXF1YWxpZmllZCBmb3IgYWxsb2NhdGlvbiBwdXJwb3Nlcy4gSXQgc2hvdWxkIGFsc28gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gaWYgWCBpcyBhbiBpbm5lciBjbGFzcyBvZiBqLlksIHRoZW4gdGhlIHR5cGUgaGVyZSBzaG91bGQgYmUgImouWSRYIi4gCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb25fVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbiNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bcmd1bWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3IuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFyZ3VtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uX0FyZ3VtZW50cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEFyZ3VtZW50cygpOwotCi19IC8vIENsYXNzSW5zdGFuY2VDcmVhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDb25kaXRpb25hbEV4cHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMjE1YWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRDb25kaXRpb25hbEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uZGl0aW9uYWwgRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSB0ZXN0IEV4cHJlc3NvbiwgZS5nLiAoeD0zKSA/IDEgOiAyCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0Q29uZGl0aW9uIDxlbT5Db25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldFRydWUgPGVtPlRydWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldEZhbHNlIDxlbT5GYWxzZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRDb25kaXRpb25hbEV4cHJlc3Npb24gZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29uZGl0aW9uIGV4cHJlc3Npb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29uZGl0aW9uKFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX0NvbmRpdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0Q29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbiNnZXRDb25kaXRpb24gPGVtPkNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbmRpdGlvbihQVEV4cHJlc3Npb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJ1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRydWUgZXhwcmVzc2lvbgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcnVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUcnVlKFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX1RydWUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldFRydWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uI2dldFRydWUgPGVtPlRydWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRydWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRydWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRydWUoUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZhbHNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZmFsc2UgZXhwcmVzc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmFsc2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEZhbHNlKFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX0ZhbHNlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRGYWxzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24jZ2V0RmFsc2UgPGVtPkZhbHNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GYWxzZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RmFsc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZhbHNlKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLX0gLy8gQ29uZGl0aW9uYWxFeHByZXNzaW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEV4cHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BURXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjE2YzI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BURXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRFeHByZXNzaW9uKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEV4cHJlc3Npb24gZXh0ZW5kcyBFT2JqZWN0ewotCS8qKgotCSAqIEFjY2VwdHMgdGhlIGdpdmVuIHZpc2l0b3Igb24gYSB2aXNpdCBvZiB0aGUgY3VycmVudCBub2RlLgotCSAqIAotCSAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yIG9iamVjdAotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB2aXNpdG9yIGlzIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHQoUGFyc2VWaXNpdG9yIHZpc2l0b3IpOwotfSAvLyBFeHByZXNzaW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEZpZWxkQWNjZXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEZpZWxkQWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDdmYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRGaWVsZEFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZpZWxkIEFjY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFjY2VzcyBhIGZpZWxkIGV4cHJlc3Npb24sIGUuZy4gamF2YS5hd3QuQ29sb3IucmVkCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzcyNnZXRSZWNlaXZlciA8ZW0+UmVjZWl2ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MjZ2V0RmllbGQgPGVtPkZpZWxkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEZpZWxkQWNjZXNzKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBURmllbGRBY2Nlc3MgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVjZWl2ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgb2JqZWN0IHRoYXQgdGhlIGZpZWxkIGlzIGluLCBlLmcuIGphdmEuYXd0LkNvbG9yLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWNlaXZlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVjZWl2ZXIoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRGaWVsZEFjY2Vzc19SZWNlaXZlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0UmVjZWl2ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MjZ2V0UmVjZWl2ZXIgPGVtPlJlY2VpdmVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWNlaXZlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVjZWl2ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlY2VpdmVyKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIGFjY2Vzc2VkLCBlLmcuIHJlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBURmllbGRBY2Nlc3NfRmllbGQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MjZ2V0RmllbGQgPGVtPkZpZWxkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRmllbGRBY2Nlc3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5maXhFeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluZml4RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTY2YzNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5maXhFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbmZpeCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gZXhwcmVzc2lvbiB3aXRoIGFuIG9wZXJhdG9yIHRoYXQgaGFzIHR3byBvcGVyYW5kcywgZS5nLiAzICsgNC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRMZWZ0T3BlcmFuZCA8ZW0+TGVmdCBPcGVyYW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRPcGVyYXRvciA8ZW0+T3BlcmF0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldFJpZ2h0T3BlcmFuZCA8ZW0+UmlnaHQgT3BlcmFuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb24jZ2V0RXh0ZW5kZWRPcGVyYW5kcyA8ZW0+RXh0ZW5kZWQgT3BlcmFuZHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW5maXhFeHByZXNzaW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUSW5maXhFeHByZXNzaW9uIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxlZnQgT3BlcmFuZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGVmdCBPcGVyYW5kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxlZnQgT3BlcmFuZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TGVmdE9wZXJhbmQoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbmZpeEV4cHJlc3Npb25fTGVmdE9wZXJhbmQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldExlZnRPcGVyYW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRMZWZ0T3BlcmFuZCA8ZW0+TGVmdCBPcGVyYW5kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZWZ0IE9wZXJhbmQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldExlZnRPcGVyYW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZWZ0T3BlcmFuZChQVEV4cHJlc3Npb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3BlcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4T3BlcmF0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG9wZXJhdG9yLCBlLmcuICsKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3BlcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yCi0JICogQHNlZSAjc2V0T3BlcmF0b3IoUFRJbmZpeE9wZXJhdG9yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbmZpeEV4cHJlc3Npb25fT3BlcmF0b3IoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEluZml4T3BlcmF0b3IgZ2V0T3BlcmF0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uI2dldE9wZXJhdG9yIDxlbT5PcGVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3BlcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yCi0JICogQHNlZSAjZ2V0T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9wZXJhdG9yKFBUSW5maXhPcGVyYXRvciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SaWdodCBPcGVyYW5kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmlnaHQgZXhwcmVzc2lvbi4gaS5lLiA0IG9mICIzICsgNCIKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmlnaHQgT3BlcmFuZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmlnaHRPcGVyYW5kKFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW5maXhFeHByZXNzaW9uX1JpZ2h0T3BlcmFuZCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0UmlnaHRPcGVyYW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNnZXRSaWdodE9wZXJhbmQgPGVtPlJpZ2h0IE9wZXJhbmQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJpZ2h0IE9wZXJhbmQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJpZ2h0T3BlcmFuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmlnaHRPcGVyYW5kKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlbmRlZCBPcGVyYW5kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBVc2VkIHdoZW4gdGhlcmUgYXJlIGEgc2VyaWVzIG9mIGluZml4IG9wZXJhdGlvbnMgb2YgdGhlIHNhbWUgb3BlcmF0b3IsIGUuZy4gMSArIDIgKyAzICsgNC4gMSBhbmQgMiB3aWxsIGdvIGludG8gbGVmdCBhbmQgcmlnaHQsIHdoaWxlIHszLCA0fSB3aWxsIGdvIGludG8gdGhlIGV4dGVuZGVkIG9wZXJhbmRzLiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgT3BlcmFuZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluZml4RXhwcmVzc2lvbl9FeHRlbmRlZE9wZXJhbmRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXh0ZW5kZWRPcGVyYW5kcygpOwotCi0JLyoqCi0JICogQ29tcHJlc3MgdGhlIGV4cHJlc3Npb24KLQkgKiBJZiB0aGVyZSBpcyBubyBsZWZ0IG9wZXJhbmQgYW5kIGEgcmlnaHQgb3BlcmFuZCwgb3IgdmljZSB2ZXJzYSwgYW5kIG5vIGV4dGVuZGVkIG9wZXJhbmRzCi0JICogcmV0dXJuIHRoZSByZW1haW5pbmcgc2luZ2xlIG9wZXJhbmQKLQkgKiBJZiB0aGVyZSBpcyBubyBsZWZ0IG9wZXJhbmQgYW5kIGEgcmlnaHQgYW5kIHNvbWUgZXh0ZW5kZWQgb25lcyBzaHVmZmxlIGV2ZXJ5dGhpbmcgYWxvbmcKLQkgKiBzbyB0aGF0IHRoZSByaWdodCBiZWNvbWVzIHRoZSBsZWZ0IGFuZCB0aGUgZmlyc3QgZXh0ZW5kZWQgbW92ZXMgaW50byB0aGUgcmlnaHQKLQkgKiBvciBpZiBubyByaWdodCBhbmQgYSBsZWZ0IHRoZW4ganVzdCBtb3ZlIHRoZSBmaXJzdCBleHRlbmRlZCBpbnRvIHRoZSByaWdodAotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCVBURXhwcmVzc2lvbiBhc0NvbXByZXNzZWRFeHByZXNzaW9uKCk7Ci0KLX0gLy8gSW5maXhFeHByZXNzaW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluZml4T3BlcmF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5maXhPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDdjMTQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5maXhPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+SW5maXggT3BlcmF0b3I8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogRW51bWVyYXRvciBmb3IgdGhlIG9wZXJhdG9yIG9uIGFuIEluZml4RXhwcmVzc2lvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbmZpeE9wZXJhdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUFRJbmZpeE9wZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqICogb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjVElNRVNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVTID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRJVklERTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIC8gb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjRElWSURFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVZJREUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVNQUlOREVSPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogJSBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNSRU1BSU5ERVJfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTUFJTkRFUiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QTFVTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogKyBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNQTFVTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTFVTID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk1JTlVTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogLSBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNNSU5VU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOVVMgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TEVGVCBTSElGVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIDw8IG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0xFRlRfU0hJRlRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfU0hJRlQgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UklHSFQgU0hJRlQgU0lHTkVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPj4gb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjUklHSFRfU0hJRlRfU0lHTkVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSSUdIVF9TSElGVF9TSUdORUQgPSA2OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UklHSFQgU0hJRlQgVU5TSUdORUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiA+Pj4gb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjUklHSFRfU0hJRlRfVU5TSUdORURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUX1NISUZUX1VOU0lHTkVEID0gNzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxFU1M8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiA8ICBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNMRVNTX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMRVNTID0gODsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkdSRUFURVI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiA+IG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0dSRUFURVJfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdSRUFURVIgPSA5OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TEVTUyBFUVVBTFM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiA8PSBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNMRVNTX0VRVUFMU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVTU19FUVVBTFMgPSAxMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkdSRUFURVIgRVFVQUxTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogPj0gb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjR1JFQVRFUl9FUVVBTFNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdSRUFURVJfRVFVQUxTID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FUVVBTFM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiA9PSBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNFUVVBTFNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVRVUFMUyA9IDEyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9UIEVRVUFMUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqICE9IG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI05PVF9FUVVBTFNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVF9FUVVBTFMgPSAxMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlhPUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIF4gb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjWE9SX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYT1IgPSAxNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFORDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqICYgb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjQU5EX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTkQgPSAxNTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9SPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogfCAgb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjT1JfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DT05ESVRJT05BTCBBTkQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAmJiBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNDT05ESVRJT05BTF9BTkRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTkRJVElPTkFMX0FORCA9IDE3OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q09ORElUSU9OQUwgT1I8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiB8fCBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNDT05ESVRJT05BTF9PUl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORElUSU9OQUxfT1IgPSAxODsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUVTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1RJTUVTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgVElNRVNfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoVElNRVMsICJUSU1FUyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RElWSURFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0RJVklERQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIERJVklERV9MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihESVZJREUsICJESVZJREUiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFTUFJTkRFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRU1BSU5ERVIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBSRU1BSU5ERVJfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoUkVNQUlOREVSLCAiUkVNQUlOREVSIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QTFVTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BMVVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBQTFVTX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKFBMVVMsICJQTFVTIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5NSU5VUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNNSU5VUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIE1JTlVTX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKE1JTlVTLCAiTUlOVVMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxFRlQgU0hJRlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTEVGVF9TSElGVAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIExFRlRfU0hJRlRfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoTEVGVF9TSElGVCwgIkxFRlRfU0hJRlQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJJR0hUIFNISUZUIFNJR05FRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSSUdIVF9TSElGVF9TSUdORUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBSSUdIVF9TSElGVF9TSUdORURfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoUklHSFRfU0hJRlRfU0lHTkVELCAiUklHSFRfU0hJRlRfU0lHTkVEIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SSUdIVCBTSElGVCBVTlNJR05FRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSSUdIVF9TSElGVF9VTlNJR05FRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIFJJR0hUX1NISUZUX1VOU0lHTkVEX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKFJJR0hUX1NISUZUX1VOU0lHTkVELCAiUklHSFRfU0hJRlRfVU5TSUdORUQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxFU1M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTEVTUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIExFU1NfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoTEVTUywgIkxFU1MiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkdSRUFURVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjR1JFQVRFUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIEdSRUFURVJfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoR1JFQVRFUiwgIkdSRUFURVIiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxFU1MgRVFVQUxTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xFU1NfRVFVQUxTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgTEVTU19FUVVBTFNfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoTEVTU19FUVVBTFMsICJMRVNTX0VRVUFMUyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+R1JFQVRFUiBFUVVBTFM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjR1JFQVRFUl9FUVVBTFMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBHUkVBVEVSX0VRVUFMU19MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihHUkVBVEVSX0VRVUFMUywgIkdSRUFURVJfRVFVQUxTIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FUVVBTFM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVFVQUxTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgRVFVQUxTX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKEVRVUFMUywgIkVRVUFMUyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9UIEVRVUFMUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT1RfRVFVQUxTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVEluZml4T3BlcmF0b3IgTk9UX0VRVUFMU19MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihOT1RfRVFVQUxTLCAiTk9UX0VRVUFMUyIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+WE9SPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1hPUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIFhPUl9MSVRFUkFMID0gbmV3IFBUSW5maXhPcGVyYXRvcihYT1IsICJYT1IiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFORDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBTkQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBBTkRfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoQU5ELCAiQU5EIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIE9SX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKE9SLCAiT1IiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNPTkRJVElPTkFMIEFORDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05ESVRJT05BTF9BTkQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBDT05ESVRJT05BTF9BTkRfTElURVJBTCA9IG5ldyBQVEluZml4T3BlcmF0b3IoQ09ORElUSU9OQUxfQU5ELCAiQ09ORElUSU9OQUxfQU5EIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DT05ESVRJT05BTCBPUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDT05ESVRJT05BTF9PUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yIENPTkRJVElPTkFMX09SX0xJVEVSQUwgPSBuZXcgUFRJbmZpeE9wZXJhdG9yKENPTkRJVElPTkFMX09SLCAiQ09ORElUSU9OQUxfT1IiKTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5QVCBJbmZpeCBPcGVyYXRvcjwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUFRJbmZpeE9wZXJhdG9yW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFBUSW5maXhPcGVyYXRvcltdIHsKLQkJCVRJTUVTX0xJVEVSQUwsCi0JCQlESVZJREVfTElURVJBTCwKLQkJCVJFTUFJTkRFUl9MSVRFUkFMLAotCQkJUExVU19MSVRFUkFMLAotCQkJTUlOVVNfTElURVJBTCwKLQkJCUxFRlRfU0hJRlRfTElURVJBTCwKLQkJCVJJR0hUX1NISUZUX1NJR05FRF9MSVRFUkFMLAotCQkJUklHSFRfU0hJRlRfVU5TSUdORURfTElURVJBTCwKLQkJCUxFU1NfTElURVJBTCwKLQkJCUdSRUFURVJfTElURVJBTCwKLQkJCUxFU1NfRVFVQUxTX0xJVEVSQUwsCi0JCQlHUkVBVEVSX0VRVUFMU19MSVRFUkFMLAotCQkJRVFVQUxTX0xJVEVSQUwsCi0JCQlOT1RfRVFVQUxTX0xJVEVSQUwsCi0JCQlYT1JfTElURVJBTCwKLQkJCUFORF9MSVRFUkFMLAotCQkJT1JfTElURVJBTCwKLQkJCUNPTkRJVElPTkFMX0FORF9MSVRFUkFMLAotCQkJQ09ORElUSU9OQUxfT1JfTElURVJBTCwKLQkJfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPUEVSQVRPUl9TVFJJTkc7Ci0Jc3RhdGljIHsKLQkJT1BFUkFUT1JfU1RSSU5HID0gbmV3IFN0cmluZ1tWQUxVRVNfQVJSQVkubGVuZ3RoXTsKLQkJT1BFUkFUT1JfU1RSSU5HW1RJTUVTXSA9ICIqIjsKLQkJT1BFUkFUT1JfU1RSSU5HW0RJVklERV0gPSAiLyI7Ci0JCU9QRVJBVE9SX1NUUklOR1tSRU1BSU5ERVJdID0gIiUiOwotCQlPUEVSQVRPUl9TVFJJTkdbUExVU10gPSAiKyI7Ci0JCU9QRVJBVE9SX1NUUklOR1tNSU5VU10gPSAiLSI7Ci0JCU9QRVJBVE9SX1NUUklOR1tMRUZUX1NISUZUXSA9ICI8IjsKLQkJT1BFUkFUT1JfU1RSSU5HW1JJR0hUX1NISUZUX1NJR05FRF0gPSAiPj4iOwotCQlPUEVSQVRPUl9TVFJJTkdbUklHSFRfU0hJRlRfVU5TSUdORURdID0gIj4+PiI7Ci0JCU9QRVJBVE9SX1NUUklOR1tMRVNTXSA9ICI8IjsKLQkJT1BFUkFUT1JfU1RSSU5HW0dSRUFURVJdID0gIj4iOwotCQlPUEVSQVRPUl9TVFJJTkdbTEVTU19FUVVBTFNdID0gIjw9IjsKLQkJT1BFUkFUT1JfU1RSSU5HW0dSRUFURVJfRVFVQUxTXSA9ICI+PSI7Ci0JCU9QRVJBVE9SX1NUUklOR1tFUVVBTFNdID0gIj09IjsKLQkJT1BFUkFUT1JfU1RSSU5HW05PVF9FUVVBTFNdID0gIiE9IjsKLQkJT1BFUkFUT1JfU1RSSU5HW1hPUl0gPSAiXiI7Ci0JCU9QRVJBVE9SX1NUUklOR1tBTkRdID0gIiYiOwotCQlPUEVSQVRPUl9TVFJJTkdbT1JdID0gInwiOwotCQlPUEVSQVRPUl9TVFJJTkdbQ09ORElUSU9OQUxfQU5EXSA9ICImJiI7Ci0JCU9QRVJBVE9SX1NUUklOR1tDT05ESVRJT05BTF9PUl0gPSAifHwiOwotCX0KLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5QVCBJbmZpeCBPcGVyYXRvcjwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UFQgSW5maXggT3BlcmF0b3I8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQVEluZml4T3BlcmF0b3IgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlQVEluZml4T3BlcmF0b3IgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5QVCBJbmZpeCBPcGVyYXRvcjwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQVEluZml4T3BlcmF0b3IgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFRJTUVTOiByZXR1cm4gVElNRVNfTElURVJBTDsKLQkJCWNhc2UgRElWSURFOiByZXR1cm4gRElWSURFX0xJVEVSQUw7Ci0JCQljYXNlIFJFTUFJTkRFUjogcmV0dXJuIFJFTUFJTkRFUl9MSVRFUkFMOwotCQkJY2FzZSBQTFVTOiByZXR1cm4gUExVU19MSVRFUkFMOwotCQkJY2FzZSBNSU5VUzogcmV0dXJuIE1JTlVTX0xJVEVSQUw7Ci0JCQljYXNlIExFRlRfU0hJRlQ6IHJldHVybiBMRUZUX1NISUZUX0xJVEVSQUw7Ci0JCQljYXNlIFJJR0hUX1NISUZUX1NJR05FRDogcmV0dXJuIFJJR0hUX1NISUZUX1NJR05FRF9MSVRFUkFMOwotCQkJY2FzZSBSSUdIVF9TSElGVF9VTlNJR05FRDogcmV0dXJuIFJJR0hUX1NISUZUX1VOU0lHTkVEX0xJVEVSQUw7Ci0JCQljYXNlIExFU1M6IHJldHVybiBMRVNTX0xJVEVSQUw7Ci0JCQljYXNlIEdSRUFURVI6IHJldHVybiBHUkVBVEVSX0xJVEVSQUw7Ci0JCQljYXNlIExFU1NfRVFVQUxTOiByZXR1cm4gTEVTU19FUVVBTFNfTElURVJBTDsKLQkJCWNhc2UgR1JFQVRFUl9FUVVBTFM6IHJldHVybiBHUkVBVEVSX0VRVUFMU19MSVRFUkFMOwotCQkJY2FzZSBFUVVBTFM6IHJldHVybiBFUVVBTFNfTElURVJBTDsKLQkJCWNhc2UgTk9UX0VRVUFMUzogcmV0dXJuIE5PVF9FUVVBTFNfTElURVJBTDsKLQkJCWNhc2UgWE9SOiByZXR1cm4gWE9SX0xJVEVSQUw7Ci0JCQljYXNlIEFORDogcmV0dXJuIEFORF9MSVRFUkFMOwotCQkJY2FzZSBPUjogcmV0dXJuIE9SX0xJVEVSQUw7Ci0JCQljYXNlIENPTkRJVElPTkFMX0FORDogcmV0dXJuIENPTkRJVElPTkFMX0FORF9MSVRFUkFMOwotCQkJY2FzZSBDT05ESVRJT05BTF9PUjogcmV0dXJuIENPTkRJVElPTkFMX09SX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFBUSW5maXhPcGVyYXRvcihpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9wZXJhdG9yIHN0cmluZyAoaS5lLiBmb3IgUExVUyByZXR1cm4gIisiKS4KLQkgKiBAcmV0dXJuIFRoZSBvcGVyYXRvciBzdHJpbmcuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcGVyYXRvcigpIHsKLQkJcmV0dXJuIE9QRVJBVE9SX1NUUklOR1tnZXRWYWx1ZSgpXTsKLQl9Ci0KLX0gLy9JbmZpeE9wZXJhdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluc3RhbmNlUmVmZXJlbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEluc3RhbmNlUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjUxNmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbnN0YW5jZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBUIEluc3RhbmNlIFJlZmVyZW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlUmVmZXJlbmNlI2dldFJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluc3RhbmNlUmVmZXJlbmNlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUSW5zdGFuY2VSZWZlcmVuY2UgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZWZlcmVuY2UoSUphdmFJbnN0YW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUSW5zdGFuY2VSZWZlcmVuY2VfUmVmZXJlbmNlKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUlKYXZhSW5zdGFuY2UgZ2V0UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlUmVmZXJlbmNlI2dldFJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVmZXJlbmNlKElKYXZhSW5zdGFuY2UgdmFsdWUpOwotCi19IC8vIFBUSW5zdGFuY2VSZWZlcmVuY2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW5zdGFuY2VvZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbnN0YW5jZW9mLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYzY5YmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRJbnN0YW5jZW9mLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW5zdGFuY2VvZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEluc3RhbmNlb2YgZXhwcmVzc2lvbiwgZS5nLiB4IGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZwotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZiNnZXRPcGVyYW5kIDxlbT5PcGVyYW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbnN0YW5jZW9mKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUSW5zdGFuY2VvZiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcGVyYW5kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgdG8gdGVzdCwgZS5nLiB4IGluIHggaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wZXJhbmQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE9wZXJhbmQoUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbnN0YW5jZW9mX09wZXJhbmQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldE9wZXJhbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZiNnZXRPcGVyYW5kIDxlbT5PcGVyYW5kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcGVyYW5kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPcGVyYW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPcGVyYW5kKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgdGVzdCwgZS5nLiBqYXZhLmxhbmcuU3RyaW5nLiBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4gSWYgaXQgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG5lZWRzIHRvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIFkgaXMgaW5uZXIgY2xhc3Mgb2Ygai5YLCB0aGVuIGEgcmVmZXJlbmNlIHRvIFkgbXVzdCBiZSBqLlgkWS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEluc3RhbmNlb2ZfVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIEluc3RhbmNlb2YKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW52YWxpZEV4cHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUSW52YWxpZEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxMDk4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVEludmFsaWRFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW52YWxpZCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBzb21lIGV4cHJlc3Npb24gd2UganVzdCBjYW4ndCBldmFsdWF0ZSBmb3Igb3VyIHB1cnBvc2VzLiBJdCBhbGxvd3MgdXMgdG8gdGVsbCB0aGUgZXZhbHVhdGlvbiB3aGF0IGlzIGFjdHVhbGx5IHdyb25nLiBJdCBzaG91bGQgYmUgcGxhY2VkIGFzIHRoZSByb290IGV4cHJlc3Npb24gdG8gcHJldmVudCBwcm9jZXNzaW5nIG11Y2ggb2YgdGhlIHRyZWUgYW5kIHRoZW4gZmluYWxseSBmYWlsLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW52YWxpZEV4cHJlc3Npb24jZ2V0TWVzc2FnZSA8ZW0+TWVzc2FnZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRJbnZhbGlkRXhwcmVzc2lvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVEludmFsaWRFeHByZXNzaW9uIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgbWVzc2FnZSBhcyB0byB3aHkgaXQgaXMgaW52YWxpZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWVzc2FnZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVEludmFsaWRFeHByZXNzaW9uX01lc3NhZ2UoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWVzc2FnZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbiNnZXRNZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNZXNzYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNZXNzYWdlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gSW52YWxpZEV4cHJlc3Npb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTWV0aG9kSW52b2NhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRNZXRob2RJbnZvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjI1YjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRNZXRob2RJbnZvY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgSW52b2NhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIE1ldGhvZEludm9jYXRpb24gZXhwcmVzc2lvbiwgZS5nLiB4LmdldFkoMykKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0UmVjZWl2ZXIgPGVtPlJlY2VpdmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uI2dldEFyZ3VtZW50cyA8ZW0+QXJndW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVE1ldGhvZEludm9jYXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRNZXRob2RJbnZvY2F0aW9uIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlY2VpdmVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaG8gdGhlIG1ldGhvZCBpcyBpbnZva2VkIGFnYWluc3QuIFRoaXMgbWF5IGJlIG5vdCBzZXQsIHdoaWNoIG1lYW5zICJ0aGlzIi4gSXQgbWF5IGFsc28gYmUgYSBOYW1lLCB3aGljaCB3b3VsZCBtZWFuIGEgY2xhc3MgbGlrZSAiamF2YS5sYW5nLlN0cmluZyIKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVjZWl2ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlY2VpdmVyKFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTWV0aG9kSW52b2NhdGlvbl9SZWNlaXZlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQVEV4cHJlc3Npb24gZ2V0UmVjZWl2ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbiNnZXRSZWNlaXZlciA8ZW0+UmVjZWl2ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlY2VpdmVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZWNlaXZlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVjZWl2ZXIoUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgYmVpbmcgaW52b2tlZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVE1ldGhvZEludm9jYXRpb25fTmFtZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXJndW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsaXN0IG9mIGFyZ3VtZW50cywgaWYgYW55LCB0byB0aGUgbWV0aG9kLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bcmd1bWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVE1ldGhvZEludm9jYXRpb25fQXJndW1lbnRzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXJndW1lbnRzKCk7Ci0KLX0gLy8gTWV0aG9kSW52b2NhdGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFROYW1lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3Y2JlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGhpcyByZXByZXNlbnRzIGEgbmFtZS4gVGhpcyBjYW4gaGFwcGVuIGZvciB0aGUgcmVjZWl2ZXIgb2YgYSBtZXRob2QgaW52b2NhdGlvbiwgZS5nLiB4LmdldFkoKSBvciBqYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoMTApLiBJbiB0aGVzZSBjYXNlcyB5b3Ugd291bGQgaGF2ZSBhIG5hbWUgb2YgIngiIG9yICJqYXZhLmxhbmcuU3RyaW5nIi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFROYW1lKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUTmFtZSBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSwgd2hpY2ggY2FuIGJlIGEgdHlwZSBvciBhIHZhcmlhYmxlLiBJZiBpdCBpcyBhIHR5cGUsIHRoZW4gIGl0IG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLiBJZiBpdCBpcyBhbiBpbm5lciBjbGFzcywgaXQgbmVlZHMgdG8gYmUgaW4gcmVmbGVjdGlvbiBmb3JtYXQsIGkuZS4gWSBpcyBpbm5lciBjbGFzcyBvZiBqLlgsIHRoZW4gYSByZWZlcmVuY2UgdG8gWSBtdXN0IGJlIGouWCRZLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTmFtZV9OYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTmFtZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFROdWxsTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFROdWxsTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmYwNmFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTnVsbExpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OdWxsIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSZXByZXNlbnRzIHRoZSBleHByZXNzaW9uICJudWxsIgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTnVsbExpdGVyYWwoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFROdWxsTGl0ZXJhbCBleHRlbmRzIFBURXhwcmVzc2lvbnsKLX0gLy8gTnVsbExpdGVyYWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUTnVtYmVyTGl0ZXJhbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFROdW1iZXJMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZDQyM2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFROdW1iZXJMaXRlcmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OdW1iZXIgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFJlcHJlc2VudCBhIG51bWJlciBwcmltaXRpdmUgbGl0ZXJhbCwgZS5nLiAxMC4gT25lIG9wdGltaXphdGlvbiB0aGF0IHdpbGwgYmUgcGVyZm9ybWVkIGlzIHRoYXQgaWYgYW4gZXhwcmVzc2lvbiBpcyBvZiB0aGUgZm9ybSArbnVtYmVyIG9yIC1udW1iZXIsIGl0IHdpbGwgYmUgY29udmVydGVkIGZyb20gYSBQcmVmaXhFeHByZXNzaW9uIHdpdGggYSBOdW1iZXJMaXRlcmFsIHRvIGp1c3QgYSBOdW1iZXJMaXRlcmFsLiBUaGlzIHdpbGwgc2ltcGxpZnkgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVtYmVyTGl0ZXJhbCNnZXRUb2tlbiA8ZW0+VG9rZW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTnVtYmVyTGl0ZXJhbCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVE51bWJlckxpdGVyYWwgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG9rZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b2tlbiB2YWx1ZSwgZS5nLiAxMCwgMTBkLCBvciAtMTAuNzUKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG9rZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRva2VuKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUTnVtYmVyTGl0ZXJhbF9Ub2tlbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUb2tlbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsI2dldFRva2VuIDxlbT5Ub2tlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG9rZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRva2VuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUb2tlbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIE51bWJlckxpdGVyYWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUUGFyZW50aGVzaXplZEV4cHJlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUUGFyZW50aGVzaXplZEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmOWViNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyZW50aGVzaXplZCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gZXhwcmVzc2lvbiB3aXRoaW4gcGFyZW50aGVzaXMsIGUuZy4gKHgrMykKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHByZXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZXhwcmVzc2lvbiB3cmFwcGVkIGJ5IHRoZSBwYXJlbnRoZXNpcywgZS5nLiAoeCszKSB0aGVuIHRoZSBleHByZXNzaW9uIGlzICJ4KzMiCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9FeHByZXNzaW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIHZhbHVlKTsKLQotfSAvLyBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRQcmVmaXhFeHByZXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFByZWZpeEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5MDQxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFByZWZpeEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmVmaXggRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgb25lIG9wZXJhbmQgb3BlcmF0b3IsIHdoZXJlIHRoZSBvcGVyYXRvciBjb21lcyBiZWZvcmUgdGhlIG9wZXJhbmQsIGUuZy4gLSAoeCszKS4gSW4gQVNULCBldmVuIC0zIGlzIG1vZGVsZWQgYXMgYSBQcmVmaXhFeHByZXNzaW9uIG9mIG9wZXJhdG9yICItIiBhbmQgZXhwcmVzc2lvbiBvZiBOdW1iZXJMaXRlcmFsKDMpLiBCdXQgd2Ugb3B0aW1pemUgdGhpcyBhd2F5IGFuZCBqdXN0IHVzZSBhIE51bWJlckxpdGVyYWwoLTMpIGRpcmVjdGx5IGluc3RlYWQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uI2dldE9wZXJhdG9yIDxlbT5PcGVyYXRvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBUUHJlZml4RXhwcmVzc2lvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVFByZWZpeEV4cHJlc3Npb24gZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3BlcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBvcGVyYXRvciBvZiB0aGlzIGV4cHJlc3Npb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wZXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4T3BlcmF0b3IKLQkgKiBAc2VlICNzZXRPcGVyYXRvcihQVFByZWZpeE9wZXJhdG9yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRQcmVmaXhFeHByZXNzaW9uX09wZXJhdG9yKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRQcmVmaXhPcGVyYXRvciBnZXRPcGVyYXRvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uI2dldE9wZXJhdG9yIDxlbT5PcGVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3BlcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvcgotCSAqIEBzZWUgI2dldE9wZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPcGVyYXRvcihQVFByZWZpeE9wZXJhdG9yIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBleHByZXNzaW9uIHRoYXQgdGhlIG9wZXJhdG9yIGlzIGFwcGxpZWQgdG8uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRQcmVmaXhFeHByZXNzaW9uX0V4cHJlc3Npb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbiNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHByZXNzaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLX0gLy8gUHJlZml4RXhwcmVzc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRQcmVmaXhPcGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRQcmVmaXhPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTVkNGI3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUUHJlZml4T3BlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlByZWZpeCBPcGVyYXRvcjwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgcHJlZml4IGV4cHJlc3Npb24gb3BlcmF0b3IuIFdlIGFyZSBub3QgbW9kZWxpbmcgKysgYW5kIC0tLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFByZWZpeE9wZXJhdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUFRQcmVmaXhPcGVyYXRvciBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+UExVUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqICsgb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjUExVU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExVUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5NSU5VUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIC0gb3BlcmF0b3IKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjTUlOVVNfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTlVTID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNPTVBMRU1FTlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiB+IG9wZXJhdG9yCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0NPTVBMRU1FTlRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRU1FTlQgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogISBvcGVyYXRvcgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNOT1RfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QTFVTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BMVVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUUHJlZml4T3BlcmF0b3IgUExVU19MSVRFUkFMID0gbmV3IFBUUHJlZml4T3BlcmF0b3IoUExVUywgIlBMVVMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk1JTlVTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI01JTlVTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQVFByZWZpeE9wZXJhdG9yIE1JTlVTX0xJVEVSQUwgPSBuZXcgUFRQcmVmaXhPcGVyYXRvcihNSU5VUywgIk1JTlVTIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DT01QTEVNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTVBMRU1FTlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUUHJlZml4T3BlcmF0b3IgQ09NUExFTUVOVF9MSVRFUkFMID0gbmV3IFBUUHJlZml4T3BlcmF0b3IoQ09NUExFTUVOVCwgIkNPTVBMRU1FTlQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT1QKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBUUHJlZml4T3BlcmF0b3IgTk9UX0xJVEVSQUwgPSBuZXcgUFRQcmVmaXhPcGVyYXRvcihOT1QsICJOT1QiKTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5QVCBQcmVmaXggT3BlcmF0b3I8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBUUHJlZml4T3BlcmF0b3JbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgUFRQcmVmaXhPcGVyYXRvcltdIHsKLQkJCVBMVVNfTElURVJBTCwKLQkJCU1JTlVTX0xJVEVSQUwsCi0JCQlDT01QTEVNRU5UX0xJVEVSQUwsCi0JCQlOT1RfTElURVJBTCwKLQkJfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBPUEVSQVRPUl9TVFJJTkc7Ci0Jc3RhdGljIHsKLQkJT1BFUkFUT1JfU1RSSU5HID0gbmV3IFN0cmluZ1tWQUxVRVNfQVJSQVkubGVuZ3RoXTsKLQkJT1BFUkFUT1JfU1RSSU5HW1BMVVNdID0gIisiOwotCQlPUEVSQVRPUl9TVFJJTkdbTUlOVVNdID0gIi0iOwotCQlPUEVSQVRPUl9TVFJJTkdbQ09NUExFTUVOVF0gPSAifiI7Ci0JCU9QRVJBVE9SX1NUUklOR1tOT1RdID0gIiEiOwotCX0KLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5QVCBQcmVmaXggT3BlcmF0b3I8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlBUIFByZWZpeCBPcGVyYXRvcjwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBUUHJlZml4T3BlcmF0b3IgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlQVFByZWZpeE9wZXJhdG9yIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UFQgUHJlZml4IE9wZXJhdG9yPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBUUHJlZml4T3BlcmF0b3IgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIFBMVVM6IHJldHVybiBQTFVTX0xJVEVSQUw7Ci0JCQljYXNlIE1JTlVTOiByZXR1cm4gTUlOVVNfTElURVJBTDsKLQkJCWNhc2UgQ09NUExFTUVOVDogcmV0dXJuIENPTVBMRU1FTlRfTElURVJBTDsKLQkJCWNhc2UgTk9UOiByZXR1cm4gTk9UX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFBUUHJlZml4T3BlcmF0b3IoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvcGVyYXRvciBzdHJpbmcgKGkuZS4gZm9yIFBMVVMgcmV0dXJuICIrIikuCi0JICogQHJldHVybiBUaGUgb3BlcmF0b3Igc3RyaW5nLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBPUEVSQVRPUl9TVFJJTkdbZ2V0VmFsdWUoKV07Ci0JfQotfSAvL1ByZWZpeE9wZXJhdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFN0cmluZ0xpdGVyYWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUU3RyaW5nTGl0ZXJhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmE1ZWNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BUU3RyaW5nTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0cmluZyBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUmVwcmVzZW50YXRpb24gb2YgYSBzdHJpbmcgbGl0ZXJhbCwgZS5nLiAiYXNkZiIuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsI2dldEVzY2FwZWRWYWx1ZSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsI2dldExpdGVyYWxWYWx1ZSA8ZW0+TGl0ZXJhbCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRTdHJpbmdMaXRlcmFsKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUU3RyaW5nTGl0ZXJhbCBleHRlbmRzIFBURXhwcmVzc2lvbnsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc2NhcGVkIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGlzIHRoZSBlc2NhcGVkIHN0cmluZy4gSW4gb3RoZXIgd29yZHMgdGhlIGxpdGVyYWwgZXhhY3RseSBhcyBpdCBpcyBpbiB0aGUgamF2YSBmaWxlLiBFLmcuICJhYiIgb3IgImNcciIuIEluY2x1ZGluZyB0aGUgc3Vycm91bmRpbmcgcXVvdGVzIHRoZW1zZWx2ZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzY2FwZWQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVzY2FwZWRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFN0cmluZ0xpdGVyYWxfRXNjYXBlZFZhbHVlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVzY2FwZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsI2dldEVzY2FwZWRWYWx1ZSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXNjYXBlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc2NhcGVkVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpdGVyYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgc3RyaW5nIHdpdGhvdXQgdGhlIHF1b3Rlcy4gRXNjYXBlIGFyZSBldmFsdWF0ZWQgYW5kIHR1cm5lZCBpbnRvIHRoZWlyIGNoYXJhY3RlciB2YWx1ZS4gVGhpcyBpcyBhIHRyYW5zaWVudCBmaWVsZC4gSWYgbm90IHNldCB3aGVuIGNyZWF0ZWQgd2hlbiBxdWVyaWVkIGl0IHdpbGwgY3JlYXRlIGl0LiBUeXBpY2FsbHkgaXQgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGVkIGZyb20gYW4gQVNUIG5vZGUgc2luY2UgdGhlIG5vZGUgYWxyZWFkeSBoYXMgZXZhbHVhdGVkIGl0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaXRlcmFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMaXRlcmFsVmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRTdHJpbmdMaXRlcmFsX0xpdGVyYWxWYWx1ZSgpCi0JICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExpdGVyYWxWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsI2dldExpdGVyYWxWYWx1ZSA8ZW0+TGl0ZXJhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGl0ZXJhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGl0ZXJhbFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaXRlcmFsVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBTdHJpbmdMaXRlcmFsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFRoaXNMaXRlcmFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFRoaXNMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzljYTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRUaGlzTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRoaXMgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFJlcHJlc2VudHMgInRoaXMiLCBlLmcuIHRoaXMuZ2V0WCgpIHdpbGwgYmUgYSBNZXRob2RJbnZvY2F0aW9uIHdpdGggdGhlIHJlY2VpdmVyIGJlaW5nIGEgVGhpc0xpdGVyYWwuIFdlIGNhbid0IGhhbmRsZSB0aGUgZm9ybWF0IFhZWi50aGlzIGJlY2F1c2UgdGhhdCBpcyBmb3IgaW5uZXIgY2xhc3NlcyBhbmQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGF0IHJpZ2h0IG5vdy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNnZXRQVFRoaXNMaXRlcmFsKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBUVGhpc0xpdGVyYWwgZXh0ZW5kcyBQVEV4cHJlc3Npb257Ci19IC8vIFRoaXNMaXRlcmFsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFR5cGVMaXRlcmFsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QVFR5cGVMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYTkxN2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUFRUeXBlTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGUgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoaXMgcmVwcmVzZW50cyBhIGxpdGVyYWwgb2YgdGhlIGZvcm0gai5YWVouY2xhc3MuIEZvciBpbnN0YW5jZSBpbiBhIG1ldGhvZCBpbnZvY2F0aW9uIHguZ2V0WChqWFlaLmNsYXNzKSB0aGUgYXJndW1lbnQgd2lsbCBiZSBhIFR5cGVMaXRlcmFsLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRUeXBlTGl0ZXJhbCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQVFR5cGVMaXRlcmFsIGV4dGVuZHMgUFRFeHByZXNzaW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIHRoZSBsaXRlcmFsLiAgSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2UjZ2V0UFRUeXBlTGl0ZXJhbF9UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVHlwZUxpdGVyYWwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFR5cGVMaXRlcmFsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QYXJzZVRyZWVBbGxvY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9QYXJzZVRyZWVBbGxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMzU2YjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUGFyc2VUcmVlQWxsb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhcnNlIFRyZWUgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFsbG9jYXRpb25zIHZpYSBQYXJzZSBUcmVlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVRyZWVBbGxvY2F0aW9uI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBhcnNlVHJlZUFsbG9jYXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFyc2VUcmVlQWxsb2NhdGlvbiBleHRlbmRzIEphdmFBbGxvY2F0aW9uewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4cHJlc3Npb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHByZXNzaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlI2dldFBhcnNlVHJlZUFsbG9jYXRpb25fRXhwcmVzc2lvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUFRFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVHJlZUFsbG9jYXRpb24jZ2V0RXhwcmVzc2lvbiA8ZW0+RXhwcmVzc2lvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhwcmVzc2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gdmFsdWUpOwotCi19IC8vIFBhcnNlVHJlZUFsbG9jYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL1BhcnNlVmlzaXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUGFyc2VWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MmE0MzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vUGFyc2VWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb247Ci0gCi0vKioKLSAqIEEgdmlzaXRvciBmb3IgYWJzdHJhY3QgcGFyc2UgZXhwcmVzc2lvbiB0cmVlcy4KLSAqIDxwPgotICogRm9yIGVhY2ggZGlmZmVyZW50IGNvbmNyZXRlIEV4cHJlc3Npb24gbm9kZSB0eXBlIDxpdD5UPC9pdD4gdGhlcmUgYXJlCi0gKiBhIHBhaXIgb2YgbWV0aG9kczoKLSAqIDx1bD4KLSAqIDxsaT48Y29kZT5wdWJsaWMgYm9vbGVhbiB2aXNpdCg8aXQ+VDwvaXQ+IG5vZGUpPC9jb2RlPiAtIFZpc2l0cwotICogdGhlIGdpdmVuIG5vZGUgdG8gcGVyZm9ybSBzb21lIGFyYml0cmFyeSBvcGVyYXRpb24uIElmIDxjb2RlPnRydWU8L2NvZGU+Ci0gKiBpcyByZXR1cm5lZCwgdGhlIGdpdmVuIG5vZGUncyBjaGlsZCBub2RlcyB3aWxsIGJlIHZpc2l0ZWQgbmV4dDsgaG93ZXZlciwKLSAqIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiBpcyByZXR1cm5lZCwgdGhlIGdpdmVuIG5vZGUncyBjaGlsZCBub2RlcyB3aWxsIAotICogbm90IGJlIHZpc2l0ZWQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MgZG9lcwotICogbm90aGluZyBhbmQgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4gU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQKLSAqIHRoaXMgbWV0aG9kIGFzIG5lZWRlZC48L2xpPgotICogPGxpPjxjb2RlPnB1YmxpYyB2b2lkIGVuZFZpc2l0KDxpdD5UPC9pdD4gbm9kZSk8L2NvZGU+IC0gVmlzaXRzCi0gKiB0aGUgZ2l2ZW4gbm9kZSB0byBwZXJmb3JtIHNvbWUgYXJiaXRyYXJ5IG9wZXJhdGlvbi4gV2hlbiB1c2VkIGluIHRoZQotICogY29udmVudGlvbmFsIHdheSwgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGFsbCBvZiB0aGUgZ2l2ZW4gbm9kZSdzCi0gKiBjaGlsZHJlbiBoYXZlIGJlZW4gdmlzaXRlZCAob3IgaW1tZWRpYXRlbHksIGlmIDxjb2RlPnZpc2l0PC9jb2RlPiByZXR1cm5lZAotICogPGNvZGU+ZmFsc2U8L2NvZGU+KS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhpcyBjbGFzcyBkb2VzCi0gKiBub3RoaW5nLiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudCB0aGlzIG1ldGhvZCBhcyBuZWVkZWQuPC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiBJbiBhZGRpdGlvbiwgdGhlcmUgYXJlIGEgcGFpciBvZiBtZXRob2RzIGZvciB2aXNpdGluZyBBU1Qgbm9kZXMgaW4gdGhlIAotICogYWJzdHJhY3QsIHJlZ2FyZGxlc3Mgb2Ygbm9kZSB0eXBlOgotICogPHVsPgotICogPGxpPjxjb2RlPnB1YmxpYyB2b2lkIHByZVZpc2l0KEFTVE5vZGUgbm9kZSk8L2NvZGU+IC0gVmlzaXRzCi0gKiB0aGUgZ2l2ZW4gbm9kZSB0byBwZXJmb3JtIHNvbWUgYXJiaXRyYXJ5IG9wZXJhdGlvbi4gCi0gKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIHByaW9yIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlLXNwZWNpZmljCi0gKiA8Y29kZT52aXNpdDwvY29kZT4gbWV0aG9kLgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QgYXMgbmVlZGVkLjwvbGk+Ci0gKiA8bGk+PGNvZGU+cHVibGljIHZvaWQgcG9zdFZpc2l0KEFTVE5vZGUgbm9kZSk8L2NvZGU+IC0gVmlzaXRzCi0gKiB0aGUgZ2l2ZW4gbm9kZSB0byBwZXJmb3JtIHNvbWUgYXJiaXRyYXJ5IG9wZXJhdGlvbi4gCi0gKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGFmdGVyIHRoZSBhcHByb3ByaWF0ZSB0eXBlLXNwZWNpZmljCi0gKiA8Y29kZT5lbmRWaXNpdDwvY29kZT4gbWV0aG9kLgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QgYXMgbmVlZGVkLjwvbGk+Ci0gKiA8L3VsPgotICogPHA+Ci0gKiBGb3Igbm9kZXMgd2l0aCBsaXN0LXZhbHVlZCBwcm9wZXJ0aWVzLCB0aGUgY2hpbGQgbm9kZXMgd2l0aGluIHRoZSBsaXN0Ci0gKiBhcmUgdmlzaXRlZCBpbiBvcmRlci4gRm9yIG5vZGVzIHdpdGggbXVsdGlwbGUgcHJvcGVydGllcywgdGhlIGNoaWxkIG5vZGVzCi0gKiBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgdGhhdCBtb3N0IGNsb3NlbHkgY29ycmVzcG9uZHMgdG8gdGhlIGxleGljYWwKLSAqIHJlYWRpbmcgb3JkZXIgb2YgdGhlIHNvdXJjZSBwcm9ncmFtLiBGb3IgaW5zdGFuY2UsIGZvciBhIHR5cGUgZGVjbGFyYXRpb24KLSAqIG5vZGUsIHRoZSBjaGlsZCBvcmRlcmluZyBpczogbmFtZSwgc3VwZXJjbGFzcywgc3VwZXJpbnRlcmZhY2VzLCBhbmQgCi0gKiBib2R5IGRlY2xhcmF0aW9ucy4KLSAqIDwvcD4KLSAqIDxwPgotICogV2hpbGUgaXQgaXMgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSB0cmVlIGluIHRoZSB2aXNpdG9yLCBjYXJlIGlzIHJlcXVpcmVkIHRvCi0gKiBlbnN1cmUgdGhhdCB0aGUgY29uc2VxdWVuY2VzIGFyZSBhcyBleHBlY3RlZCBhbmQgZGVzaXJhYmxlLgotICogRHVyaW5nIHRoZSBjb3Vyc2Ugb2YgYW4gb3JkaW5hcnkgdmlzaXQgc3RhcnRpbmcgYXQgYSBnaXZlbiBub2RlLCBldmVyeSBub2RlCi0gKiBpbiB0aGUgc3VidHJlZSBpcyB2aXNpdGVkIGV4YWN0bHkgdHdpY2UsIGZpcnN0IHdpdGggPGNvZGU+dmlzaXQ8L2NvZGU+IGFuZAotICogdGhlbiB3aXRoIDxjb2RlPmVuZFZpc2l0PC9jb2RlPi4gRHVyaW5nIGEgdHJhdmVyc2FsIG9mIGEgc3RhdGlvbmFyeSB0cmVlLCAKLSAqIGVhY2ggbm9kZSBpcyBlaXRoZXIgYmVoaW5kIChhZnRlciA8Y29kZT5lbmRWaXNpdDwvY29kZT4pLCBhaGVhZCAoYmVmb3JlIAotICogPGNvZGU+dmlzaXQ8L2NvZGU+KSwgb3IgaW4gcHJvZ3Jlc3MgKGJldHdlZW4gPGNvZGU+dmlzaXQ8L2NvZGU+IGFuZAotICogdGhlIG1hdGNoaW5nIDxjb2RlPmVuZFZpc2l0PC9jb2RlPikuIENoYW5nZXMgdG8gdGhlICJiZWhpbmQiIHJlZ2lvbiBvZiB0aGUKLSAqIHRyZWUgYXJlIG9mIG5vIGNvbnNlcXVlbmNlIHRvIHRoZSB2aXNpdCBpbiBwcm9ncmVzcy4gQ2hhbmdlcyB0byB0aGUgImFoZWFkIgotICogcmVnaW9uIHdpbGwgYmUgdGFrZW4gaW4gc3RyaWRlLiBDaGFuZ2VzIHRvIHRoZSAiaW4gcHJvZ3Jlc3MiIHBvcnRpb24gYXJlCi0gKiB0aGUgbW9yZSBpbnRlcmVzdGluZyBjYXNlcy4gV2l0aCBhIG5vZGUsIHRoZSB2YXJpb3VzIHByb3BlcnRpZXMgYXJlIGFycmFuZ2VkCi0gKiBpbiBhIGxpbmVhciBsaXN0LCB3aXRoIGEgY3Vyc29yIHRoYXQgc2VwYXJhdGVzIHRoZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZQotICogYmVlbiB2aXNpdGVkIGZyb20gdGhlIG9uZXMgdGhhdCBhcmUgc3RpbGwgdG8gYmUgdmlzaXRlZCAodGhlIGN1cnNvcgotICogaXMgYmV0d2VlbiB0aGUgZWxlbWVudHMsIHJhdGhlciB0aGFuIG9uIGFuIGVsZW1lbnQpLiBUaGUgY3Vyc29yIG1vdmVzIGZyb20KLSAqIHRoZSBoZWFkIHRvIHRoZSB0YWlsIG9mIHRoaXMgbGlzdCwgYWR2YW5jaW5nIHRvIHRoZSBuZXh0IHBvc2l0aW9uIGp1c3QKLSAqIDxpdD5iZWZvcmU8L2l0PiA8Y29kZT52aXNpdDwvY29kZT4gaWYgY2FsbGVkIGZvciB0aGF0IGNoaWxkLiBBZnRlciB0aGUgY2hpbGQKLSAqIHN1YnRyZWUgaGFzIGJlZW4gY29tcGxldGVseSB2aXNpdGVkLCB0aGUgdmlzaXQgbW92ZXMgb24gdGhlIGNoaWxkIAotICogaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGN1cnNvci4gUmVtb3ZpbmcgYSBjaGlsZCB3aGlsZSBpdCBpcyBiZWluZyB2aXNpdGVkCi0gKiBkb2VzIG5vdCBhbHRlciB0aGUgY291cnNlIG9mIHRoZSB2aXNpdC4gQnV0IGFueSBjaGlsZHJlbiBhZGRlZCBhdCBwb3NpdGlvbnMKLSAqIGFmdGVyIHRoZSBjdXJzb3IgYXJlIGNvbnNpZGVyZWQgaW4gdGhlICJhaGVhZCIgcG9ydGlvbiBhbmQgd2lsbCBiZSB2aXNpdGVkLgotICogPC9wPgotICogPHA+Ci0gKiBDYXNlcyB0byB3YXRjaCBvdXQgZm9yOgotICogPHVsPgotICogPGxpPk1vdmluZyBhIGNoaWxkIG5vZGUgZnVydGhlciBkb3duIHRoZSBsaXN0LiBUaGlzIGNvdWxkIHJlc3VsdCBpbiB0aGUKLSAqIGNoaWxkIHN1YnRyZWUgYmVpbmcgdmlzaXRlZCBtdWx0aXBsZSB0aW1lczsgdGhlc2UgdmlzaXRzIGFyZSBzZXF1ZW50aWFsLjwvbGk+Ci0gKiA8bGk+TW92aW5nIGEgY2hpbGQgbm9kZSB1cCBpbnRvIGFuIGFuY2VzdG9yLiBJZiB0aGUgbmV3IGhvbWUgZm9yCi0gKiB0aGUgbm9kZSBpcyBpbiB0aGUgImFoZWFkIiBwb3J0aW9uLCB0aGUgc3VidHJlZSB3aWxsIGJlIHZpc2l0ZWQgCi0gKiBhIHNlY29uZCB0aW1lOyBhZ2FpbiwgdGhlc2UgdmlzaXRzIGFyZSBzZXF1ZW50aWFsLjwvbGk+Ci0gKiA8bGk+TW92aW5nIGEgbm9kZSBkb3duIGludG8gYSBjaGlsZC4gSWYgdGhlIG5ldyBob21lIGZvcgotICogdGhlIG5vZGUgaXMgaW4gdGhlICJhaGVhZCIgcG9ydGlvbiwgdGhlIHN1YnRyZWUgd2lsbCBiZSB2aXNpdGVkIAotICogYSBzZWNvbmQgdGltZTsgaW4gdGhpcyBjYXNlLCB0aGUgdmlzaXRzIHdpbGwgYmUgbmVzdGVkLiBJbiBzb21lIGNhc2VzLAotICogdGhpcyBjYW4gbGVhZCB0byBhIHN0YWNrIG92ZXJmbG93IG9yIG91dCBvZiBtZW1vcnkgY29uZGl0aW9uLjwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIE5vdGU6IFRoaXMgaXMgYmFzZWQgdXBvbiB0aGUgdmlzaXQgY29uY2VwdCBpbiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvci4gCi0gKgotICogQHNlZSBFeHByZXNzaW9uI2FjY2VwdAotICogIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZVZpc2l0b3IgewotCQotCS8qKgotCSAqIEV4Y2VwdGlvbiB0byB0aHJvdyB0byBqdXN0IHN0b3AgdmlzaXRpbmcgYSBwYXJzZSB2aXNpdC4gSXQgZG9lc24ndCBtZWFuIGVycm9yLCBpdAotCSAqIGp1c3QgbWVhbnMgc3RvcCB2aXNpdGluZy4gUGFyc2VWaXNpdG9ycyBzaG91bGQgdGhyb3cgdGhpcyB3aGVuIHRoZXkgd2FudCB0byBzdG9wCi0JICogdmlzaXRpbmcgZnVydGhlciB3aXRob3V0IGFuIGV4cGxpY2l0IGVycm9yLgotCSAqIDxwPgotCSAqIElmIHRoZXkgd2FudCB0byBpbmRpY2F0ZSBhbiBlcnJvciwgcGFyc2UgdmlzaXRvcnMgY2FuIHRocm93IGFueSBvdGhlciBSdW50aW1lRXhjZXB0aW9uLiAKLQkgKiBUaG9zZSB3aWxsIGFsc28gc3RvcCB2aXNpdGluZywgYnV0IHRoZSBleGNlcHRpb24gd2lsbCBiZSBwYXNzZWQgb24gb3V0IG9mIHRoZSAKLQkgKiB7QGxpbmsgUFRFeHByZXNzaW9uI2FjY2VwdChQYXJzZVZpc2l0b3IpfS4gU3RvcFZpc2l0aW5nIHdpbGwgbm90IGJlIHBhc3NlZCBvbgotCSAqIGJ1dCB3aWxsIGJlIGNhdWdodCBpbnNpZGUgYWNjZXB0LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMC4xCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdG9wVmlzaXRpbmcgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMC4xCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTI0Njg2MDgwNjU2ODM1NTUyMEw7Ci0JCQotCX0KLQkvKioKLQkgKiBWaXNpdHMgdGhlIGdpdmVuIHBhcnNlIG5vZGUgcHJpb3IgdG8gdGhlIHR5cGUtc3BlY2lmaWMgdmlzaXQuIChiZWZvcmUgPGNvZGU+dmlzaXQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGhlIG5vZGUgdG8gdmlzaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVWaXNpdChQVEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogVmlzaXRzIHRoZSBnaXZlbiBwYXJzZSBub2RlIGZvbGxvd2luZyB0aGUgdHlwZS1zcGVjaWZpYyB2aXNpdCAoYWZ0ZXIgPGNvZGU+ZW5kVmlzaXQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgdGhlIG5vZGUgdG8gdmlzaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0VmlzaXQoUFRFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5QWNjZXNzIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlDcmVhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRCb29sZWFuTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW5zdGFuY2VvZiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE5hbWUgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE51bWJlckxpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUVGhpc0xpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEluc3RhbmNlUmVmZXJlbmNlIG5vZGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRBcnJheUFjY2VzcyBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRBcnJheUNyZWF0aW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEluZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRJbnN0YW5jZW9mIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVEludmFsaWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUTmFtZSBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFROdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFROdW1iZXJMaXRlcmFsIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjogZG8gbm90aGluZwotCX0KLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQVFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uOiBkbyBub3RoaW5nCi0JfQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBUU3RyaW5nTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRUaGlzTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JcHVibGljIHZvaWQgZW5kVmlzaXQoUFRJbnN0YW5jZVJlZmVyZW5jZSBub2RlKSB7Ci0JCS8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb246IGRvIG5vdGhpbmcKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0ZlYXR1cmVWYWx1ZVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0ZlYXR1cmVWYWx1ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOTY5MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9GZWF0dXJlVmFsdWVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEltcGxlbWVudGVycyBvZiB0aGlzIGludGVyZmFjZSAoYW4gRU1GIEVPYmplY3Qgc3ViY2xhc3MpIHByb3ZpZGUgYSB2aXNpdGVyCi0gKiBjYXBhYmlsaXR5IHRvIHRoZSBzZXQgZmVhdHVyZXMgb24gdGhlIEVPYmplY3QuIFRoaXMgd2F5IG9ubHkgdGhlIHNldCBmZWF0dXJlcwotICogYXJlIHByZXNlbnRlZCB0byB0aGUgdmlzaXRvci4gVGhpcyBjYW4gc2F2ZSBhIGxvdCBvZiB0aW1lLgotICogCi0gKiBAc2luY2UgMS4xLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBGZWF0dXJlVmFsdWVQcm92aWRlciB7Ci0JCi0JLyoqCi0JICogQSBoZWxwZXIgY2xhc3MgZm9yIEZlYXR1cmVWYWx1ZVByb3ZpZGVyLgotCSAqIAotCSAqIEBzZWUgRmVhdHVyZVZhbHVlUHJvdmlkZXJIZWxwZXIjdmlzaXRTZXRGZWF0dXJlcyhFT2JqZWN0LCBWaXNpdG9yKQotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRmVhdHVyZVZhbHVlUHJvdmlkZXJIZWxwZXIgewotCQkKLQkJLyoqCi0JCSAqIEEgaGVscGVyIHRvIGhhbmRsZSB3aGVyZSB0aGUgb2JqZWN0IG1heSBvciBtYXkgbm90IGJlCi0JCSAqIGltcGxlbWVudCBGZWF0dXJlVmFsdWVQcm92aWRlci4gVGhpcyB3YXkgaXQgY2FuIGJlIGEKLQkJICogY29tbW9uIGFjY2VzcyB0byBkbyBpdC4KLQkJICogCi0JCSAqIEBwYXJhbSBlb2JqZWN0Ci0JCSAqIEBwYXJhbSB2aXNpdG9yCi0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBPYmplY3QgdmlzaXRTZXRGZWF0dXJlcyhFT2JqZWN0IGVvYmplY3QsIFZpc2l0b3IgdmlzaXRvcikgewotCQkJaWYgKGVvYmplY3QgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVQcm92aWRlcikKLQkJCQlyZXR1cm4gKChGZWF0dXJlVmFsdWVQcm92aWRlcillb2JqZWN0KS52aXNpdFNldEZlYXR1cmVzKHZpc2l0b3IpOwotCQkJZWxzZSB7Ci0JCQkJLy8gTm90IGEgRmVhdHVyZVZhbHVlUHJvdmlkZXIsIHNvIGRvIG5vcm1hbC4KLQkJCQlJdGVyYXRvciBmZWF0dXJlcyA9IGVvYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUoZmVhdHVyZXMuaGFzTmV4dCgpKXsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHNmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlcy5uZXh0KCk7Ci0JCQkJCWlmKGVvYmplY3QuZUlzU2V0KHNmKSl7Ci0JCQkJCQlPYmplY3QgcmVzdWx0ID0gdmlzaXRvci5pc1NldChzZiwgZW9iamVjdC5lR2V0KHNmKSk7Ci0JCQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJLyoqCi0JCSAqIEFuc3dlcnMgd2hldGhlciBhbnkgZmVhdHVyZSBpcyBzZXQgb3Igbm90LgotCQkgKiA8cD4KLQkJICogPGI+Tm90ZTo8L2I+IFRoaXMgU0hPVUxEIE5PVCBiZSB1c2VkIGFzIGEgdGVzdCBiZWZvcmUgZGVjaWRpbmcgd2hldGhlciB0byBkbyB2aXNpdFNldEZlYXR1cmVzIG9yIG5vdC4gSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8ganVzdCBjYWxsCi0JCSAqIHZpc2l0U2V0RmVhdHVyZXMuIEl0IHNob3VsZCBiZSB1c2VkIG9ubHkgdG8gc2VlIGlmIGFueSBmZWF0dXJlcyBhcmUgc2V0LgotCQkgKiAKLQkJICogQHBhcmFtIGVvYmplY3QKLQkJICogQHJldHVybgotCQkgKiAKLQkJICogQHNpbmNlIDEuMS4wCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbnlGZWF0dXJlU2V0KEVPYmplY3QgZW9iamVjdCkgewotCQkJaWYgKGVvYmplY3QgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVQcm92aWRlcikKLQkJCQlyZXR1cm4gKChGZWF0dXJlVmFsdWVQcm92aWRlcillb2JqZWN0KS5pc0FueUZlYXR1cmVTZXQoKTsKLQkJCWVsc2UgewotCQkJCS8vIE5vdCBhIEZlYXR1cmVWYWx1ZVByb3ZpZGVyLCBzbyBkbyBub3JtYWwuCi0JCQkJSXRlcmF0b3IgZmVhdHVyZXMgPSBlb2JqZWN0LmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGZlYXR1cmVzLmhhc05leHQoKSl7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZXMubmV4dCgpOwotCQkJCQlpZihlb2JqZWN0LmVJc1NldChzZikpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQkJCQotCQl9Ci0JCQotCQlwcml2YXRlIEZlYXR1cmVWYWx1ZVByb3ZpZGVySGVscGVyKCkgewotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB2aXNpdGVyIGNhbGxiYWNrLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgVmlzaXRvcnsKLQkJLyoqCi0JCSAqIENhbGxlZCBmb3IgZWFjaCBzZXQgZmVhdHVyZSBvbiB0aGUgRmVhdHVyZVZhbHVlUHJvdmlkZXIuCi0JCSAqIAotCQkgKiBAcGFyYW0gZmVhdHVyZQotCQkgKiBAcGFyYW0gdmFsdWUKLQkJICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiB0byBjb250aW51ZSB0byBuZXh0IHNldHRpbmcsIG9yIGEgdmFsdWUgdG8gc3RvcCB2aXNpdGluZyBhbmQgcmV0dXJuIHRoYXQgdmFsdWUgYmUgdGhlIHJlYWwgZXhjZXB0aW9uLgotCQkgKiBAc2luY2UgMS4xLjAKLQkJICovCi0JCU9iamVjdCBpc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKTsKLQl9CQotCi0JLyoqCi0JICogVmlzaXQgdGhlIHNldCBmZWF0dXJlcy4KLQkgKiBAcGFyYW0gYVZpc2l0b3IKLQkgKiBAcGFyYW0gPGNvZGU+bnVsbDwvY29kZT4gaWYgYWxsIHNldHRpbmdzIHZpc2l0ZWQsIG9yIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIHRoZSB2aXNpdCAoaXNTZXQpIHRoYXQgcmV0dXJuZWQgYSBub24tbnVsbFNlLgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXRTZXRGZWF0dXJlcyhWaXNpdG9yIGFWaXNpdG9yKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXJzIHdoZXRoZXIgYW55IGZlYXR1cmUgaXMgc2V0IG9yIG5vdC4KLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBTSE9VTEQgTk9UIGJlIHVzZWQgYXMgYSB0ZXN0IGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIHRvIGRvIHZpc2l0U2V0RmVhdHVyZXMgb3Igbm90LiBJdCBpcwotCSAqIG1vcmUgZWZmaWNpZW50IHRvIGp1c3QgY2FsbCB2aXNpdFNldEZlYXR1cmVzLiBJdCBzaG91bGQgYmUgdXNlZCBvbmx5IHRvIHNlZSBpZiBhbnkgZmVhdHVyZXMgYXJlIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSBmZWF0dXJlcyBhcmUgc2V0LgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQW55RmVhdHVyZVNldCgpOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YURhdGFUeXBlSW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFEYXRhVHlwZUluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NGY3N2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YURhdGFUeXBlSW5zdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0KLQotICovCi0KLS8qKgotICogSW50ZXJmYWNlIGZvciBpbnN0YW5jZXMgb2YgamF2YSBkYXRhIHR5cGVzLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFEYXRhVHlwZUluc3RhbmNlIGV4dGVuZHMgSUphdmFJbnN0YW5jZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFJbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YUluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDRhNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YUluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSW5zdGFuY2U7Ci0vKioKLSAqIEEgY29tbW9uIGludGVyZmFjZSBmb3IgSmF2YSBpbnN0YW5jZXMuIEl0IHdpbGwgYmUKLSAqIHNoYXJlZCBieSBKYXZhIE9iamVjdHMgYW5kIEphdmEgRGF0YVR5cGUgaW5zdGFuY2VzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhSW5zdGFuY2UgZXh0ZW5kcyBFT2JqZWN0LCBGZWF0dXJlVmFsdWVQcm92aWRlciwgSUluc3RhbnRpYXRpb25JbnN0YW5jZSB7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBhbGxvY2F0aW9uIG9iamVjdC4KLQkgKiBAcmV0dXJuIFRoZSBhbGxvY2F0aW9uIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgSmF2YUFsbG9jYXRpb24gZ2V0QWxsb2NhdGlvbigpOwotCQotCS8qKgotCSAqIFNldCB0aGUgYWxsb2NhdGlvbiBmb3IgdGhpcyBvYmplY3QgaW5zdGFuY2UuCi0JICogQHBhcmFtIGFsbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvY2F0aW9uKEphdmFBbGxvY2F0aW9uIGFsbG9jYXRpb24pOwkKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYWxsb2NhdGlvbiBoYXMgYmVlbiBzZXQgb3Igbm90LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc2V0LiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEFsbG9jYXRpb24oKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXIgdHJ1ZSBpZiB3ZSBhcmUgYW4gaW5zdGFuY2Ugb2Ygb25lIG9mIEphdmEncyBwcmltaXRpdmUgZGF0YSB0eXBlcy4KLQkgKiBlLmcuIGJvb2xlYW4sIGNoYXIgLSB0cnVlIG90aGVyd2lzZSwgZS5nLiBqYXZhLmxhbmcuQm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCk7Ci0JCi0JLyoqCi0JICogQW5zd2VyIHdoZXRoZXIgdGhpcyBoYXMgYW4gaW1wbGljaXQgYWxsb2NhdGlvbi4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGltcGxpY2l0IGFsbG9jYXRpb24uIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3Qgc2V0IG9yIG5vdCBpbXBsaWNpdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0QWxsb2NhdGlvbigpOwotCQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoaXMgaGFzIGFuIHBhcnNldHJlZSBhbGxvY2F0aW9uLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcGFyc2V0cmVlIGFsbG9jYXRpb24uIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3Qgc2V0IG9yIG5vdCBwYXJzZXRyZWUuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzZVRyZWVBbGxvY2F0aW9uKCk7Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSUphdmFPYmplY3RJbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YU9iamVjdEluc3RhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzI3NzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JSmF2YU9iamVjdEluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogSW50ZXJmYWNlIGZvciBqYXZhIG9iamVjdCBpbnN0YW5jZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFPYmplY3RJbnN0YW5jZSBleHRlbmRzIElKYXZhSW5zdGFuY2UgewotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9JbnN0YW50aWF0aW9uQmFzZU1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0luc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1MjQ1MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0luc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEluc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yX0N1cnJlbnRseVRoaXNOb3RTdXBwb3J0ZWRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3JfQ2Fubm90UHJvY2Vzc0Fub255bW91c0RlY2xhcmF0aW9uc19FWENfOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSW5zdGFudGlhdGlvbkJhc2VNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YURhdGFUeXBlSW5zdGFuY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YURhdGFUeXBlSW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0YjUzMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFEYXRhVHlwZUluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZiBhIEphdmEgTW9kZWwgRGF0YXR5cGUgKGkuZS4gcHJpbWl0aXZlKS4KLSAqIEl0IGNhbiBiZSBjcmVhdGVkIGZyb20gYSBzdHJpbmcsIHdoaWNoIGJlY29tZXMgdGhlIGluaXRpYWxpemF0aW9uIHN0cmluZwotICogZm9yIHRoZSBpbnN0YW5jZS4gSXQncyB0b1N0cmluZyB3aWxsIGJlIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcuCi0gKgotICogSXQgc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkIGRpcmVjdGx5LCB0aGUgSUphdmFEYXRhVHlwZUluc3RhbmNlIGludGVyZmFjZSBzaG91bGQgYmUKLSAqIHVzZWQgaW5zdGVhZC4gSXQgaXMgcHVibGljIHNvIHRoYXQgaXQgY2FuIGJlIHN1YmNsYXNzZWQuIAotICovCi1wdWJsaWMgY2xhc3MgSmF2YURhdGFUeXBlSW5zdGFuY2UgZXh0ZW5kcyBKYXZhSW5zdGFuY2UgaW1wbGVtZW50cyBJSmF2YURhdGFUeXBlSW5zdGFuY2UgewotCi0JcHJvdGVjdGVkIEphdmFEYXRhVHlwZUluc3RhbmNlKCkgewotCX0KLQkJCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKXsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhRmFjdG9yeUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUZhY3RvcnlIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkN2VjMzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhRmFjdG9yeUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXI7Ci0KLS8qKgotICogQWRhcHRlciBvbiBKYXZhRmFjdG9yeUltcGwgdG8gZG8gaW5zdGFudGlhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEphdmFGYWN0b3J5SGFuZGxlciBpbXBsZW1lbnRzIElJbnN0YW50aWF0aW9uSGFuZGxlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIEphdmFGYWN0b3J5SGFuZGxlciBJTlNUQU5DRSA9IG5ldyBKYXZhRmFjdG9yeUhhbmRsZXIoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKYXZhRmFjdG9yeUFkYXB0ZXIuCi0JICovCi0JcHJvdGVjdGVkIEphdmFGYWN0b3J5SGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSGFuZGxlciNoYW5kbGVzQ2xhc3Mob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVzQ2xhc3MoRUNsYXNzIHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgaW5zdGFuY2VvZiBKYXZhQ2xhc3MgfHwgdHlwZSBpbnN0YW5jZW9mIEphdmFEYXRhVHlwZTsKLQkJLy8gRHVyaW5nIFhNSSBsb2FkaW5nLCBpdCBjYW4ndCB0ZWxsIHRoZSBKYXZhRGF0YVR5cGUgaXMgZGlmZmVyZW50IHRoYW4gSmF2YUNsYXNzLgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyI2hhbmRsZXNEYXRhVHlwZShvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRGF0YVR5cGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlc0RhdGFUeXBlKEphdmFEYXRhVHlwZSB0eXBlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyI2NyZWF0ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgamF2YUNsYXNzKSB7Ci0JCUVPYmplY3QgcmVzdWx0ID0gamF2YUNsYXNzIGluc3RhbmNlb2YgSmF2YUNsYXNzID8gKEVPYmplY3QpIG5ldyBKYXZhT2JqZWN0SW5zdGFuY2UoKSA6IG5ldyBKYXZhRGF0YVR5cGVJbnN0YW5jZSgpOwotCQkoKEludGVybmFsRU9iamVjdCkgcmVzdWx0KS5lU2V0Q2xhc3MoamF2YUNsYXNzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjViMTQ5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFJbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotLyoKLSAqICAkUkNTZmlsZSQKLSAqICAkUmV2aXNpb24kICAkRGF0ZSQgCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUuSW50ZXJuYWwuRHluYW1pY1ZhbHVlSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVTdHJ1Y3R1cmFsRmVhdHVyZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5KYXZhQWxsb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGluc3RhbmNlIGZvciBqYXZhIG1vZGVsIG9iamVjdHMuCi0gKiBJdCBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgZGlyZWN0bHksIHRoZSBJSmF2YU9iamVjdEluc3RhbmNlIGludGVyZmFjZSBzaG91bGQgYmUKLSAqIHVzZWQgaW5zdGVhZC4gSXQgaXMgcHVibGljIHNvIHRoYXQgaXQgY2FuIGJlIHN1YmNsYXNzZWQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhSW5zdGFuY2UgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIElKYXZhSW5zdGFuY2UgewotCQotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRKYXZhVHlwZSgpewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKSBlQ2xhc3MoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFBbGxvY2F0aW9uIGdldEFsbG9jYXRpb24oKSB7Ci0JCXJldHVybiBpc1NldEFsbG9jYXRpb24oKSA/IChKYXZhQWxsb2NhdGlvbikgZUdldChKYXZhSW5zdGFudGlhdGlvbi5nZXRBbGxvY2F0aW9uRmVhdHVyZSh0aGlzKSkgOiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0QWxsb2NhdGlvbigpIHsKLQkJcmV0dXJuIGlzU2V0QWxsb2NhdGlvbigpICYmIGdldEFsbG9jYXRpb24oKS5pc0ltcGxpY2l0KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUGFyc2VUcmVlQWxsb2NhdGlvbigpIHsKLQkJcmV0dXJuIGlzU2V0QWxsb2NhdGlvbigpICYmIGdldEFsbG9jYXRpb24oKS5pc1BhcnNlVHJlZSgpOwotCX0KLQkKLQkvKiogCi0JICogVmlzaXQgdGhlIGFyZ3VtZW50IHdpdGggYWxsIG9mIHRoZSBzZXQgZmVhdHVyZXMgaW4gYW4gb3B0aW1pemVkIGZhc2hpb24gCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgT2JqZWN0IE5JTCA9IEVTdHJ1Y3R1cmFsRmVhdHVyZUltcGwuSW50ZXJuYWxTZXR0aW5nRGVsZWdhdGVTaW5nbGUuTklMOwotCXB1YmxpYyBPYmplY3QgdmlzaXRTZXRGZWF0dXJlcyhWaXNpdG9yIGFWaXNpdG9yKSB7Ci0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAoZUhhc1NldHRpbmdzKCkpIHsKLQkJCUphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIgc2V0dGluZ3MgPSAoSmF2YUluc3RhbmNlUHJvcGVydGllc0hvbGRlcikgZVNldHRpbmdzKCk7Ci0KLQkJCU9iamVjdFtdIHNldFByb3BlcnR5VmFsdWVzID0gc2V0dGluZ3MuZVNldHRpbmdzKCk7Ci0JCQlpZiAoc2V0UHJvcGVydHlWYWx1ZXMgIT0gbnVsbCkgewotCQkJCUxpc3QgYWxsRmVhdHVyZXMgPSBzZXR0aW5ncy5nZXRBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNldFByb3BlcnR5VmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBwcm9wZXJ0eVZhbHVlID0gc2V0UHJvcGVydHlWYWx1ZXNbaV07Ci0JCQkJCWlmIChwcm9wZXJ0eVZhbHVlICE9IG51bGwpIHsKLQkJCQkJCS8vIDxudWxsPiBpcyBoYW5kbGVkIGJ5IHRoZSBwbGFjZWhvbGRlciBOSUwuIEEgc2V0dGluZyBvZiB0cnVlIG51bGwgbWVhbnMgbm90IHNldC4gQSBzZXR0aW5nIG9mIE5JTCBtZWFucyBzZXQgdG8gbnVsbC4KLQkJCQkJCWlmIChwcm9wZXJ0eVZhbHVlID09IE5JTCkKLQkJCQkJCQlwcm9wZXJ0eVZhbHVlID0gbnVsbDsKLQkJCQkJCWlmICgocmVzdWx0ID0gYVZpc2l0b3IuaXNTZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgYWxsRmVhdHVyZXMuZ2V0KGkpLCBwcm9wZXJ0eVZhbHVlKSkgIT0gbnVsbCkKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBbnlGZWF0dXJlU2V0KCkgewotCQlpZiAoZUhhc1NldHRpbmdzKCkpIHsKLQkJCUphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIgc2V0dGluZ3MgPSAoSmF2YUluc3RhbmNlUHJvcGVydGllc0hvbGRlcikgZVNldHRpbmdzKCk7Ci0KLQkJCU9iamVjdFtdIHNldFByb3BlcnR5VmFsdWVzID0gc2V0dGluZ3MuZVNldHRpbmdzKCk7Ci0JCQlpZiAoc2V0UHJvcGVydHlWYWx1ZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2V0UHJvcGVydHlWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJT2JqZWN0IHByb3BlcnR5VmFsdWUgPSBzZXRQcm9wZXJ0eVZhbHVlc1tpXTsKLQkJCQkJaWYgKHByb3BlcnR5VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IAotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGlzU2V0QWxsb2NhdGlvbigpIHsKLQkJRVJlZmVyZW5jZSBhbGxvY2F0aW9uRmVhdHVyZSA9IEphdmFJbnN0YW50aWF0aW9uLmdldEFsbG9jYXRpb25GZWF0dXJlKHRoaXMpOwotCQlyZXR1cm4gYWxsb2NhdGlvbkZlYXR1cmUgIT0gbnVsbCAmJiBlSXNTZXQoYWxsb2NhdGlvbkZlYXR1cmUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBbGxvY2F0aW9uKEphdmFBbGxvY2F0aW9uIGFsbG9jYXRpb24pIHsKLQkJRVJlZmVyZW5jZSBhbGxvY2F0aW9uRmVhdHVyZSA9IEphdmFJbnN0YW50aWF0aW9uLmdldEFsbG9jYXRpb25GZWF0dXJlKHRoaXMpOwotCQlpZiAoYWxsb2NhdGlvbkZlYXR1cmUgIT0gbnVsbCkKLQkJCWVTZXQoYWxsb2NhdGlvbkZlYXR1cmUsIGFsbG9jYXRpb24pOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkvLyBFT2JqZWN0J3MgdG9TdHJpbmcgaXMgdG9vIGJpZyBmb3IgdXMsIHNvIHdlIGRvIGEgY3VzdG9taXplZCBvbmUuCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJcmVzdWx0LmFwcGVuZCgnQCcpOwotCQlyZXN1bHQuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoaGFzaENvZGUoKSkpOwotCQkKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCXsKLQkJICByZXN1bHQuYXBwZW5kKCIgKGVQcm94eVVSSTogIik7IC8vJE5PTi1OTFMtMSQKLQkJICByZXN1bHQuYXBwZW5kKGVQcm94eVVSSSgpKTsKLQkJICByZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJaWYoZ2V0SmF2YVR5cGUoKSAhPSBudWxsKXsKLQkJCXJlc3VsdC5hcHBlbmQoJ3snKTsKLQkJCXJlc3VsdC5hcHBlbmQoZ2V0SmF2YVR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJcmVzdWx0LmFwcGVuZCgnfScpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJSmF2YUFsbG9jYXRpb24gYWxsb2NhdGlvbiA9IGdldEFsbG9jYXRpb24oKTsKLQkJCWlmIChhbGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQlyZXN1bHQuYXBwZW5kKCc6Jyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKGFsbG9jYXRpb24udG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgY2FuIG9jY3VyIGJlY2F1c2Ugc29tZXRpbWVzIHRoaXMgZUNsYXNzIGNhbid0IGJlIGNvbnN0cnVjdGVkIHJpZ2h0IGFuZCB3b24ndCBoYXZlIGFuIGluaXRzdHJpbmcgZmVhdHVyZS4KLQkJCS8vIEluIHRoYXQgY2FzZSBhbiBOUEUgaXMgdGhyb3duLgotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyIGV4dGVuZHMgRVByb3BlcnRpZXNIb2xkZXJJbXBsIHsKLQkJcHJpdmF0ZSBFTGlzdCBhbGxTdHJ1Y3R1cmFsRmVhdHVyZXM7Ci0JCQotCQlwdWJsaWMgSmF2YUluc3RhbmNlUHJvcGVydGllc0hvbGRlcigpIHsKLQkJfQotCQkKLQkJcHVibGljIE9iamVjdFtdIGVTZXR0aW5ncygpIHsKLQkJCXJldHVybiBlU2V0dGluZ3M7Ci0JCX0KLQotCQlwdWJsaWMgRUxpc3QgZ2V0QWxsU3RydWN0dXJhbEZlYXR1cmVzKCkgewotCQkJcmV0dXJuIGFsbFN0cnVjdHVyYWxGZWF0dXJlczsKLQkJfQotCQkKLQkJLyoKLQkJICogQ2xlYXIgdGhlIGNhY2hlLiBUaGlzIGlzIGR1ZSB0byAKLQkJICogc3RydWN0dXJhbCBmZWF0dXJlcyBoYXZlIGNoYW5nZWQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgewotCQkJZVNldHRpbmdzID0gbnVsbDsKLQkJCXNldEVDb250ZW50cyhudWxsKTsKLQkJCXNldEVDcm9zc1JlZmVyZW5jZXMobnVsbCk7Ci0JCQlhbGxTdHJ1Y3R1cmFsRmVhdHVyZXMgPSBudWxsOwkJCQotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsLkVQcm9wZXJ0aWVzSG9sZGVySW1wbCNhbGxvY2F0ZVNldHRpbmdzKGludCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFsbG9jYXRlU2V0dGluZ3MoaW50IG1heGltdW1EeW5hbWljRmVhdHVyZUlEKSB7Ci0JCQlpZiAoYWxsU3RydWN0dXJhbEZlYXR1cmVzID09IG51bGwpCi0JCQkJYWxsU3RydWN0dXJhbEZlYXR1cmVzID0gZ2V0RUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwkJCQotCQkJc3VwZXIuYWxsb2NhdGVTZXR0aW5ncyhtYXhpbXVtRHluYW1pY0ZlYXR1cmVJRCk7Ci0JCX0KLQkJCi0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsLkVQcm9wZXJ0aWVzSG9sZGVySW1wbCNzZXRFQ29udGVudHMob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RUNvbnRlbnRzKEVMaXN0IGVDb250ZW50cykgewotCQkJaWYgKGFsbFN0cnVjdHVyYWxGZWF0dXJlcyA9PSBudWxsKQotCQkJCWFsbFN0cnVjdHVyYWxGZWF0dXJlcyA9IGdldEVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCXN1cGVyLnNldEVDb250ZW50cyhlQ29udGVudHMpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsLkVQcm9wZXJ0aWVzSG9sZGVySW1wbCNzZXRFQ3Jvc3NSZWZlcmVuY2VzKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEVDcm9zc1JlZmVyZW5jZXMoRUxpc3QgZUNyb3NzUmVmZXJlbmNlcykgewotCQkJaWYgKGFsbFN0cnVjdHVyYWxGZWF0dXJlcyA9PSBudWxsKQotCQkJCWFsbFN0cnVjdHVyYWxGZWF0dXJlcyA9IGdldEVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCXN1cGVyLnNldEVDcm9zc1JlZmVyZW5jZXMoZUNyb3NzUmVmZXJlbmNlcyk7Ci0JCX0KLQotCX0KLQkKLQlwcm90ZWN0ZWQgRVByb3BlcnRpZXNIb2xkZXIgZVByb3BlcnRpZXMoKQotCXsKLQkgIGlmIChlUHJvcGVydGllcyA9PSBudWxsKQotCSAgewotCQllUHJvcGVydGllcyA9IG5ldyBKYXZhSW5zdGFuY2VQcm9wZXJ0aWVzSG9sZGVyKCk7Ci0JICB9Ci0JICByZXR1cm4gZVByb3BlcnRpZXM7Ci0JfQotCQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QjZVNldENsYXNzKEVDbGFzcykKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0Q2xhc3MoRUNsYXNzIGVDbGFzcykgewotCQlzdXBlci5lU2V0Q2xhc3MoZUNsYXNzKTsKLQkJbWlncmF0ZSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdFQ2xhc3MgTmV3IGVDbGFzcyBzZXQgdG8uIChudWxsKSB3aGVuIG1pZ3JhdGluZyB3aGlsZSBub3Qgc2V0dGluZyBhIG5ldyBFQ2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWlncmF0ZSgpIHsKLQkJLy8gTm90ZTogVGhpcyBpcyBleHRyZW1lbGx5IGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4gSXQgbWF5IGNoYW5nZSBmb3IgYW55IGltcGxlbWVudGF0aW9uIG9mIEVNRi4JCi0JCWlmIChlUHJvcGVydGllcyAhPSBudWxsICYmIChlUHJvcGVydGllcy5oYXNTZXR0aW5ncygpIHx8IGVQcm9wZXJ0aWVzLmdldEVDb250ZW50cygpICE9IG51bGwgfHwgZVByb3BlcnRpZXMuZ2V0RUNyb3NzUmVmZXJlbmNlcygpICE9IG51bGwpKSB7Ci0JCQkvLyBNYXliZSBuZWVkIHRvIHJlY29uc3RydWN0IHNldHRpbmdzIG9yIGNsZWFyIGNhY2hlLgotCQkJSmF2YUluc3RhbmNlUHJvcGVydGllc0hvbGRlciBwcm9wZXJ0aWVzID0gKEphdmFJbnN0YW5jZVByb3BlcnRpZXNIb2xkZXIpIGVQcm9wZXJ0aWVzOwotCQkJRUxpc3Qgb2xkQWxsRmVhdHVyZXMgPSBwcm9wZXJ0aWVzLmdldEFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQkJCi0JCQkvLyBTZWUgaWYgbWlncmF0aW9uIG5lZWRlZC4KLQkJCWlmIChwcm9wZXJ0aWVzLmdldEVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSA9PSBvbGRBbGxGZWF0dXJlcykKLQkJCQlyZXR1cm47CS8vIE5vIG1pZ3JhdGlvbiBuZWVkZWQuCi0JCQkKLQkJCU9iamVjdFtdIG9sZFNldHRpbmdzID0gcHJvcGVydGllcy5lU2V0dGluZ3MoKTsJCQkKLQkJCXByb3BlcnRpZXMuY2xlYXJDYWNoZSgpOwkvLyBDbGVhciB0aGUgY2FjaGUgc28gd2UgY2FuIHJlYnVpbGQgaXQuCi0JCQlpZiAob2xkU2V0dGluZ3MgPT0gbnVsbCkgewotCQkJCXJldHVybjsJLy8gSXQgd2FzIGp1c3QgZWl0aGVyIGNvbnRlbnRzIG9yIGNyb3NzcmVmcywgYW5kIHRoZXkgaGF2ZSBiZWVuIGFwcHJvcHJpYXRlbHkgY2xlYXJlZC4JCQkKLQkJCX0KLQkJCQotCQkJLy8gSXQgaXMgYXNzdW1lZCB0aGF0IGFueSBTRiB0aGF0IChieSBpZGVudGl0eSkgaXMgaW4KLQkJCS8vIGJvdGggdGhlIG9sZCBhbmQgdGhlIG5ldyBlQ2xhc3MsIHRoZW4gaXQgZG9lc24ndCBoYXZlIGFueSBpbnRlcm5hbCBjaGFuZ2VzLiBJdCBzaW1wbHkgY2hhbmdlZCBwb3NpdGlvbgotCQkJLy8gaW4gdGhlIHNldHRpbmdzIGxpc3QuIE90aGVyd2lzZSwgbmVlZCB0byBzZWUgaWYgY29tcGF0aWJsZSBieSBzYW1lIG5hbWUsIGFuZCBpZiBzbywgbW92ZSBpdC4JCQkKLQkJCWVTZXR0aW5ncygpOwkvLyBDcmVhdGUgbmV3IHNldHRpbmdzCi0JCQlPYmplY3RbXSBuZXdTZXR0aW5ncyA9IHByb3BlcnRpZXMuZVNldHRpbmdzKCk7Ci0JCQlpbnQgc3RhdGljRmVhdHVyZUNudCA9IGVTdGF0aWNGZWF0dXJlQ291bnQoKTsJCQkKLQkJCWZvciAoaW50IG9sZEluZGV4ID0gMDsgb2xkSW5kZXggPCBvbGRTZXR0aW5ncy5sZW5ndGg7IG9sZEluZGV4KyspIHsKLQkJCQlpZiAob2xkU2V0dGluZ3Nbb2xkSW5kZXhdICE9IG51bGwpIHsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHNmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgb2xkQWxsRmVhdHVyZXMuZ2V0KG9sZEluZGV4K3N0YXRpY0ZlYXR1cmVDbnQpOwotCQkJCQlpbnQgbmV3SW5kZXggPSBzdXBlci5lRHluYW1pY0ZlYXR1cmVJRChzZik7CS8vIFRvIGF2b2lkIHJlY3Vyc2Ugb24gbWlncmF0ZS4KLQkJCQkJaWYgKG5ld0luZGV4ID4gLTEpIHsKLQkJCQkJCW1vdmVFU2V0dGluZyhvbGRTZXR0aW5ncywgbmV3U2V0dGluZ3MsIG9sZEluZGV4LCBzZiwgbmV3SW5kZXgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gU2VlIGlmIGl0IGV4aXN0cyBieSBuYW1lIGFuZCBpcyBjb21wYXRpYmxlLgotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIG5ld1NGID0gcHJvcGVydGllcy5nZXRFQ2xhc3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoc2YuZ2V0TmFtZSgpKTsKLQkJCQkJCWlmIChuZXdTRiAhPSBudWxsICYmIG5ld1NGLmdldENsYXNzKCkuZXF1YWxzKHNmLmdldENsYXNzKCkpICYmCi0JCQkJCQkJbmV3U0YuaXNNYW55KCkgPT0gc2YuaXNNYW55KCkgJiYgbmV3U0YuaXNDaGFuZ2VhYmxlKCkgPT0gc2YuaXNDaGFuZ2VhYmxlKCkpIHsKLQkJCQkJCQlib29sZWFuIGNvbXBhdGlibGUgPSBuZXdTRi5pc1VuaXF1ZSgpID09IHNmLmlzVW5pcXVlKCkgfHwgIW5ld1NGLmlzVW5pcXVlKCk7CS8vIElmIG5ldyBpcyBub3QgdW5pcXVlLCB0aGVuIGRvZXNuJ3QgbWF0dGVyIGlmIG9sZCBhbmQgbmV3IGFyZSB0aGUgc2FtZQotCQkJCQkJCWlmIChuZXdTRiBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQkJCQkJRVJlZmVyZW5jZSBuZXdSZWYgPSAoRVJlZmVyZW5jZSkgbmV3U0Y7Ci0JCQkJCQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIHNmOwotCQkJCQkJCQljb21wYXRpYmxlID0gbmV3UmVmLmlzQ29udGFpbm1lbnQoKSA9PSByZWYuaXNDb250YWlubWVudCgpICYmIG5ld1JlZi5nZXRFUmVmZXJlbmNlVHlwZSgpLmlzU3VwZXJUeXBlT2YocmVmLmdldEVSZWZlcmVuY2VUeXBlKCkpOwotCQkJCQkJCX0gZWxzZQotCQkJCQkJCQljb21wYXRpYmxlID0gbmV3U0YuZ2V0RVR5cGUoKS5lcXVhbHMoc2YuZ2V0RVR5cGUoKSk7Ci0JCQkJCQkJCQotCQkJCQkJCWlmIChjb21wYXRpYmxlKSB7Ci0JCQkJCQkJCW5ld0luZGV4ID0gZUR5bmFtaWNGZWF0dXJlSUQobmV3U0YpOwotCQkJCQkJCQltb3ZlRVNldHRpbmcob2xkU2V0dGluZ3MsIG5ld1NldHRpbmdzLCBvbGRJbmRleCwgbmV3U0YsIG5ld0luZGV4KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gCi0JfQotCi0JcHJpdmF0ZSB2b2lkIG1vdmVFU2V0dGluZyhPYmplY3RbXSBvbGRTZXR0aW5ncywgT2JqZWN0W10gbmV3U2V0dGluZ3MsIGludCBvbGRJbmRleCwgRVN0cnVjdHVyYWxGZWF0dXJlIHNmLCBpbnQgbmV3SW5kZXgpIHsKLQkJLy8gU2VlIGlmIHNpbmdsZSB2cyBtYW55LgotCQlpZiAoIXNmLmlzTWFueSgpKQotCQkJbmV3U2V0dGluZ3NbbmV3SW5kZXhdID0gb2xkU2V0dGluZ3Nbb2xkSW5kZXhdOwkvLyBHcmVhdCwgd2UgY2FuIGp1c3QgbW92ZSBpdCBvdmVyLgotCQllbHNlIHsKLQkJCS8vIE1hbnkgaXMgbW9yZSBkaWZmaWN1bHQuIE5lZWQgdG8gY3JlYXRlIGEgbmV3IGR5bmFtaWMgbGlzdCBvZiByaWdodCB0eXBlLCBhbmQKLQkJCS8vIHRoZW4ganVzdCBjb3B5IG92ZXIgdGhlIGRhdGEgZnJvbSB0aGUgb2xkIG9uZS4gV2UgY3JlYXRlIG5ldyBvbmUgYnkgZG9pbmcgYSBzaW1wbGUgZUdldC4KLQkJCS8vIFRoaXMgd2lsbCBjb25zdHJ1Y3QgYW4gZW1wdHkgb25lIHdpdGggbm8gbm90aWZpY2F0aW9ucyBnb2luZyBvdXQuCi0JCQkvLyBOb3RlOiBUaGlzIGlzIGV4dHJlbWVsbHkgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiBXZSB3aWxsIGJlIHRocm93aW5nIGF3YXkgdGhlIG9sZAotCQkJLy8gb2xkTWFueSwgc28gaXQgaXMgb2sgdG8gcmV1c2UgdGhlIGFjdHVhbCBhcnJheSBvZiBkYXRhIGZvciB0aGUgbmV3TWFueS4KLQkJCUJhc2ljRUxpc3QgbmV3TWFueSA9IChCYXNpY0VMaXN0KSBlR2V0KHNmKTsKLQkJCUJhc2ljRUxpc3Qgb2xkTWFueSA9IChCYXNpY0VMaXN0KSBvbGRTZXR0aW5nc1tvbGRJbmRleF07Ci0JCQluZXdNYW55LnNldERhdGEob2xkTWFueS5zaXplKCksIG9sZE1hbnkuZGF0YSgpKTsgCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIER5bmFtaWNWYWx1ZUhvbGRlciBlU2V0dGluZ3MoKSB7Ci0JCW1pZ3JhdGUoKTsKLQkJcmV0dXJuIHN1cGVyLmVTZXR0aW5ncygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFudGlhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFudGlhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjUzYTA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUluc3RhbnRpYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2U7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBqYXZhIG1vZGVsIGluc3RhbnRpYXRpb24gY29kZSBhbmQgdG8gYWNjZXNzIGR5bmFtaWMgZmVhdHVyZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhSW5zdGFudGlhdGlvbiB7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT0NBVElPTiA9ICJhbGxvY2F0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdldCBhIHN0cnVjdHVyYWwgZmVhdHVyZSBmcm9tIGFuIGluc3RhbmNlIG9mIGFuIElKYXZhT2JqZWN0SW5zdGFuY2UsIHdoZXJlIHRoZSBmZWF0dXJlCi0JICogaXMgc3BlY2lmaWVkIGJ5IGl0cyBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldFNGZWF0dXJlKElKYXZhT2JqZWN0SW5zdGFuY2Ugam9iamVjdCwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXJldHVybiBqb2JqZWN0LmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShmZWF0dXJlTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBhIHJlZmVyZW5jZSBmcm9tIGFuIGluc3RhbmNlIG9mIGFuIElKYXZhT2JqZWN0SW5zdGFuY2UsIHdoZXJlIHRoZSBmZWF0dXJlCi0JICogaXMgc3BlY2lmaWVkIGJ5IGl0cyBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoSUphdmFPYmplY3RJbnN0YW5jZSBqb2JqZWN0LCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBnZXRTRmVhdHVyZShqb2JqZWN0LCBmZWF0dXJlTmFtZSk7Ci0JfQkKLQkKLQkvKioKLQkgKiBHZXQgYSBzdHJ1Y3R1cmFsIGZlYXR1cmUgZnJvbSBhbiBpbnN0YW5jZSBvZiBhbiBJSmF2YU9iamVjdEluc3RhbmNlLCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgVVJJIChlLmcuICJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0L2NsYXNzIikuCi0JICovCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0U0ZlYXR1cmUoSUphdmFPYmplY3RJbnN0YW5jZSBqb2JqZWN0LCBVUkkgc2ZVUkkpIHsKLQkJcmV0dXJuIGdldFNGZWF0dXJlKChKYXZhQ2xhc3MpIGpvYmplY3QuZ2V0SmF2YVR5cGUoKSwgc2ZVUkkpOwotCX0KLQotCS8qKgotCSAqIEdldCBhIHN0cnVjdHVyYWwgZmVhdHVyZSBmcm9tIGEgSmF2YUNsYXNzLCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgVVJJIChlLmcuICJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0L2NsYXNzIikuCi0JICovCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0U0ZlYXR1cmUoSmF2YUNsYXNzIGpjbGFzcywgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiBnZXRTRmVhdHVyZShqY2xhc3MuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSwgc2ZVUkkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgYSBzdHJ1Y3R1cmFsIGZlYXR1cmUgZnJvbSBhIFJlc291cmNlU2V0LCB3aGVyZSB0aGUgZmVhdHVyZQotCSAqIGlzIHNwZWNpZmllZCBieSBpdHMgVVJJIChlLmcuICJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0L2NsYXNzIikuCi0JICovCi0JcHVibGljIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0U0ZlYXR1cmUoUmVzb3VyY2VTZXQgcnNldCwgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiAoRVN0cnVjdHVyYWxGZWF0dXJlKSByc2V0LmdldEVPYmplY3Qoc2ZVUkksIHRydWUpOwotCX0JCi0JCi0JLyoqCi0JICogR2V0IGEgcmVmZXJlbmNlIGZyb20gYW4gaW5zdGFuY2Ugb2YgYW4gSUphdmFPYmplY3RJbnN0YW5jZSwgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIFVSSSAoZS5nLiAiamF2YTovamF2YS5sYW5nI09iamVjdC9jbGFzcyIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoSUphdmFPYmplY3RJbnN0YW5jZSBqb2JqZWN0LCBVUkkgc2ZVUkkpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBnZXRTRmVhdHVyZSgoSmF2YUNsYXNzKSBqb2JqZWN0LmdldEphdmFUeXBlKCksIHNmVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSByZWZlcmVuY2UgZnJvbSBhIEphdmFDbGFzcywgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIFVSSSAoZS5nLiAiamF2YTovamF2YS5sYW5nI09iamVjdC9jbGFzcyIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoSmF2YUNsYXNzIGpjbGFzcywgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ2V0U0ZlYXR1cmUoamNsYXNzLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCksIHNmVVJJKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgcmVmZXJlbmNlIGZyb20gYSBSZXNvdXJjZVNldCwgd2hlcmUgdGhlIGZlYXR1cmUKLQkgKiBpcyBzcGVjaWZpZWQgYnkgaXRzIFVSSSAoZS5nLiAiamF2YTovamF2YS5sYW5nI09iamVjdC9jbGFzcyIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoUmVzb3VyY2VTZXQgcnNldCwgVVJJIHNmVVJJKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcnNldC5nZXRFT2JqZWN0KHNmVVJJLCB0cnVlKTsKLQl9CQotCQotCS8qKgotCSAqIEdldCB0aGUgYWxsb2NhdGlvbiBGZWF0dXJlIGZvciB0aGlzIG9iamVjdC4gU2luY2UgaXQgZGVwZW5kcwotCSAqIG9uIHdoYXQgcmVzb3VyY2UgdGhhdCB0aGUgbWV0YWNsYXNzIGlzIGRlZmluZWQgaW4sIHdlIG11c3QgbG9vayBmb3IgaXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBFUmVmZXJlbmNlIGdldEFsbG9jYXRpb25GZWF0dXJlKElKYXZhSW5zdGFuY2Ugamluc3RhbmNlKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgamluc3RhbmNlLmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZShBTExPQ0FUSU9OKTsKLQl9Ci0JCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShSZXNvdXJjZVNldCByc2V0KSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihyc2V0LCBJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5BREFQVEVSX0tFWSkgPT0gbnVsbCkKLQkJCQlyc2V0LmVBZGFwdGVycygpLmFkZChuZXcgSmF2YUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9KYXZhSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmYzYmE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcjsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgaXMgYXR0YWNoZWQgdG8gdGhlIHJlc291cmNlIHNldCBmb3IgYSBqYXZhIG1vZGVsLiBUaGUKLSAqIEphdmFYTUlGYWN0b3J5IHdpbGwgYXNrIGZvciB0aGlzIGFkYXB0ZXIgYW5kIGFzayBpdCBmb3IgdGhlIElJbnN0YW50aWF0aW9uSGFuZGxlci4KLSAqLwotcHVibGljIGNsYXNzIEphdmFJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSmF2YUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuCi0JICovCi0JcHVibGljIEphdmFJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIjZ2V0SW5zdGFudGlhdGlvbkhhbmRsZXIoSmF2YUZhY3RvcnlJbXBsKQotCSAqLwotCXB1YmxpYyBJSW5zdGFudGlhdGlvbkhhbmRsZXIgZ2V0SW5zdGFudGlhdGlvbkhhbmRsZXIoSmF2YUZhY3RvcnlJbXBsIGZhY3RvcnkpIHsKLQkJcmV0dXJuIEphdmFGYWN0b3J5SGFuZGxlci5JTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuQURBUFRFUl9LRVkgPT0gdHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YU9iamVjdEluc3RhbmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9iYXNlL0phdmFPYmplY3RJbnN0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWYyYjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvSmF2YU9iamVjdEluc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotIAotCi0vKioKLSAqIEphdmEgT2JqZWN0IEluc3RhbmNlIGltcGxlbWVudGF0aW9uLgotICogQHNpbmNlIDEuMS4wLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFPYmplY3RJbnN0YW5jZSBleHRlbmRzIEphdmFJbnN0YW5jZSBpbXBsZW1lbnRzIElKYXZhT2JqZWN0SW5zdGFuY2UgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlI2lzUHJpbWl0aXZlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9QYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzgzNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9QYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS4qOwotIAotLyoqCi0gKiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBwYXJzZSB2aXNpdG9yIGZvciBpbnN0YW50aWF0aW5nIGEgYmVhbiBwcm94eSBmcm9tIGEgamF2YSBwYXJzZSB0cmVlIGFsbG9jYXRpb24uCi0gKiBJdCBjYW4gYmUgcmV1c2VkLCBidXQgaXMgbm90IHRocmVhZC1zYWZlLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvciBleHRlbmRzIFBhcnNlVmlzaXRvciB7Ci0JCQotCS8qKgotCSAqIFRoZSBleHByZXNzaW9uIHRoYXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgZXZhbHVhdGVkLgotCSAqLwotCXByaXZhdGUgSUV4cHJlc3Npb24gZXhwcmVzc2lvbjsKLQkKLQkvKgotCSAqIFRoZSBuZXh0IGV4cHJlc3Npb24gdHlwZSB0aGF0IHNob3VsZCBiZSB1c2VkLiBJdCBpcyB1c2VkIHdoZW4gb25lIGV4cHJlc3Npb24gaXMgc2VuZGluZyB0aGUKLQkgKiB2aXNpdGF0aW9uIHRvIHRoZSBuZXh0IGV4cHJlc3Npb24uIEl0IHdpbGwgc2V0IHRoaXMgdG8gd2hhdCB0aGF0IGV4cHJlc3Npb24gc2hvdWxkIGJlIHVzaW5nLiBUaGlzCi0JICogaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIG5leHQgZXhwcmVzc2lvbiBkb2Vzbid0IGtub3cgd2hhdCBpdCBzaG91bGQgYmUuCi0JICovCi0JcHJpdmF0ZSBGb3JFeHByZXNzaW9uIG5leHRFeHByZXNzaW9uID0gRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTjsKLQkKLQkvKioKLQkgKiBBbiBleGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3NpbmcuIEl0IGlzIGEgUnVudGltZUV4Y2VwdGlvbiBiZWNhdXNlCi0JICogaXQgY2FuIGJlIHRocm93biBhdCBhbnkgdGltZS4gSXQgd3JhcHBlcnMgYW5vdGhlciBleGNlcHRpb24uIFRoYXQgZXhjZXB0aW9uCi0JICogY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBjYXVzZSBvZiB0aGUgUHJvY2Vzc2luZ0V4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAc2VlIFRocm93YWJsZSNnZXRDYXVzZSgpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzaW5nRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCQotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTI2ODYyNDIyMjQ5MDQwNjY0M0w7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBjYXVzZQotCQkgKiAKLQkJICogQHNpbmNlIDEuMC4wCi0JCSAqLwotCQlwdWJsaWMgUHJvY2Vzc2luZ0V4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJCXN1cGVyKGNhdXNlKTsKLQkJfQotCX0KLQkKLQlzdGF0aWMgZmluYWwgSW5maXhPcGVyYXRvcltdIElORklYVE9QUk9YWTsKLQlzdGF0aWMgewotCQlJTkZJWFRPUFJPWFkgPSBuZXcgSW5maXhPcGVyYXRvcltQVEluZml4T3BlcmF0b3IuVkFMVUVTLnNpemUoKV07Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuQU5EXSA9IEluZml4T3BlcmF0b3IuSU5fQU5EOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkNPTkRJVElPTkFMX0FORF0gPSBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX0FORDsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5DT05ESVRJT05BTF9PUl0gPSBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX09SOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLkRJVklERV0gPSBJbmZpeE9wZXJhdG9yLklOX0RJVklERTsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5FUVVBTFNdID0gSW5maXhPcGVyYXRvci5JTl9FUVVBTFM7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuR1JFQVRFUl0gPSBJbmZpeE9wZXJhdG9yLklOX0dSRUFURVI7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuR1JFQVRFUl9FUVVBTFNdID0gSW5maXhPcGVyYXRvci5JTl9HUkVBVEVSX0VRVUFMUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5MRUZUX1NISUZUXSA9IEluZml4T3BlcmF0b3IuSU5fTEVGVF9TSElGVDsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5MRVNTXSA9IEluZml4T3BlcmF0b3IuSU5fTEVTUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5MRVNTX0VRVUFMU10gPSBJbmZpeE9wZXJhdG9yLklOX0xFU1NfRVFVQUxTOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLk1JTlVTXSA9IEluZml4T3BlcmF0b3IuSU5fTUlOVVM7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuTk9UX0VRVUFMU10gPSBJbmZpeE9wZXJhdG9yLklOX05PVF9FUVVBTFM7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuT1JdID0gSW5maXhPcGVyYXRvci5JTl9PUjsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5QTFVTXSA9IEluZml4T3BlcmF0b3IuSU5fUExVUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5SRU1BSU5ERVJdID0gSW5maXhPcGVyYXRvci5JTl9SRU1BSU5ERVI7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuUklHSFRfU0hJRlRfU0lHTkVEXSA9IEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfU0lHTkVEOwotCQlJTkZJWFRPUFJPWFlbUFRJbmZpeE9wZXJhdG9yLlJJR0hUX1NISUZUX1VOU0lHTkVEXSA9IEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfVU5TSUdORUQ7Ci0JCUlORklYVE9QUk9YWVtQVEluZml4T3BlcmF0b3IuVElNRVNdID0gSW5maXhPcGVyYXRvci5JTl9USU1FUzsKLQkJSU5GSVhUT1BST1hZW1BUSW5maXhPcGVyYXRvci5YT1JdID0gSW5maXhPcGVyYXRvci5JTl9YT1I7Ci0JfQotCQotCS8qKgotCSAqIEEgaGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBwYXJzZSB0cmVlJ3MgaW5maXggb3BlcmF0b3IgdG8gdGhlIFByb3h5IGluZml4IG9wZXJhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRvcgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluZml4T3BlcmF0b3IgY29udmVydFBUSW5maXhPcGVyYXRvclRvUHJveHlJbmZpeE9wZXJhdG9yKFBUSW5maXhPcGVyYXRvciBvcGVyYXRvcikgewotCQlyZXR1cm4gSU5GSVhUT1BST1hZW29wZXJhdG9yLmdldFZhbHVlKCldOwotCX0KLQotCXN0YXRpYyBmaW5hbCBQcmVmaXhPcGVyYXRvcltdIFBSRUZJWFRPUFJPWFk7Ci0Jc3RhdGljIHsKLQkJUFJFRklYVE9QUk9YWSA9IG5ldyBQcmVmaXhPcGVyYXRvcltQVFByZWZpeE9wZXJhdG9yLlZBTFVFUy5zaXplKCldOwotCQlQUkVGSVhUT1BST1hZW1BUUHJlZml4T3BlcmF0b3IuQ09NUExFTUVOVF0gPSBQcmVmaXhPcGVyYXRvci5QUkVfQ09NUExFTUVOVDsKLQkJUFJFRklYVE9QUk9YWVtQVFByZWZpeE9wZXJhdG9yLk1JTlVTXSA9IFByZWZpeE9wZXJhdG9yLlBSRV9NSU5VUzsKLQkJUFJFRklYVE9QUk9YWVtQVFByZWZpeE9wZXJhdG9yLk5PVF0gPSBQcmVmaXhPcGVyYXRvci5QUkVfTk9UOwotCQlQUkVGSVhUT1BST1hZW1BUUHJlZml4T3BlcmF0b3IuUExVU10gPSBQcmVmaXhPcGVyYXRvci5QUkVfUExVUzsKLQl9Ci0JCi0JLyoqCi0JICogQSBoZWxwZXIgbWV0aG9kIHRvIGNvbnZlcnQgdGhlIHBhcnNlIHRyZWUncyBwcmVmaXggb3BlcmF0b3IgdG8gdGhlIFByb3h5IHByZWZpeCBvcGVyYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0b3IKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyBQcmVmaXhPcGVyYXRvciBjb252ZXJ0UFRQcmVmaXhPcGVyYXRvclRvUHJveHlQcmVmaXhPcGVyYXRvcihQVFByZWZpeE9wZXJhdG9yIG9wZXJhdG9yKSB7Ci0JCXJldHVybiBQUkVGSVhUT1BST1hZW29wZXJhdG9yLmdldFZhbHVlKCldOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIHZpc2l0b3Igd2l0aCB0aGUgZ2l2ZW4gcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5Ci0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50IHJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBleHByZXNzaW9uLmdldFJlZ2lzdHJ5KCk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudCBleHByZXNzaW9uLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSUV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQkKLQotCS8qKgotCSAqIEdldCB0aGUgYmVhbnByb3h5IGZvciB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgcmVnaXN0cnkuIEl0IHdpbGwgZXZhbHVhdGUgaW1tZWRpYXRlbHkuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiBAcGFyYW0gcmVnaXN0cnkKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFRocm93YWJsZVByb3h5Ci0JICogQHRocm93cyBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBJQmVhblByb3h5IGdldEJlYW5Qcm94eShQVEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uLCBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKLQkJdGhpcy5leHByZXNzaW9uID0gcmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCXRyeSB7Ci0JCQlleHByZXNzaW9uLmFjY2VwdCh0aGlzKTsKLQkJfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBIYW5kbGUgdGhlIG1vc3QgY29tbW9uIHRoYXQgbWFrZSBzZW5zZSB0byBiZSBrbm93IGRpc3RpbmN0bHkgYW5kIHRocm93IHRoZW0gaW5zdGVhZCBvZiBQcm9jZXNzaW5nRXhjZXB0aW9uLgotCQkJVGhyb3dhYmxlIHQgPSBlLmdldENhdXNlKCk7Ci0JCQlpZiAodCBpbnN0YW5jZW9mIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uKQotCQkJCXRocm93IChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbikgdDsKLQkJCWVsc2UgaWYgKHQgaW5zdGFuY2VvZiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24pCi0JCQkJdGhyb3cgKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbikgdDsKLQkJCWVsc2UKLQkJCQl0aHJvdyBlOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBVc2luZyB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBwcm9jZXNzb3IgYWxsb2NhdGUgdGhlIHByb3h5LiBJdCB3aWxsIG5vdCBldmFsdWF0ZSBpbW1lZGlhdGVseSwgYnV0IGp1c3QgcHVzaCBvbnRvIHRoZSBleHByZXNzaW9uLgotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogQHBhcmFtIGV4cHJlc3Npb25Qcm9jZXNzb3IKLQkgKiBAcmV0dXJuIHRoZSBFeHByZXNzaW9uUHJveHkgZm9yIHRoZSBhbGxvY2F0aW9uLgotCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRXhwcmVzc2lvblByb3h5IGdldFByb3h5KFBURXhwcmVzc2lvbiBleHByZXNzaW9uLCBJRXhwcmVzc2lvbiBleHByZXNzaW9uUHJvY2Vzc29yKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFByb2Nlc3NpbmdFeGNlcHRpb24gewotCQl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uUHJvY2Vzc29yOwotCQl0cnkgewotCQkJRXhwcmVzc2lvblByb3h5IHByb3h5ID0gZXhwcmVzc2lvblByb2Nlc3Nvci5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hUKTsKLQkJCWV4cHJlc3Npb24uYWNjZXB0KHRoaXMpOwotCQkJcmV0dXJuIHByb3h5OwotCQl9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEhhbmRsZSB0aGUgbW9zdCBjb21tb24gdGhhdCBtYWtlIHNlbnNlIHRvIGJlIGtub3cgZGlzdGluY3RseSBhbmQgdGhyb3cgdGhlbSBpbnN0ZWFkIG9mIFByb2Nlc3NpbmdFeGNlcHRpb24uCi0JCQlUaHJvd2FibGUgdCA9IGUuZ2V0Q2F1c2UoKTsKLQkJCWlmICh0IGluc3RhbmNlb2YgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKQotCQkJCXRocm93IChJbGxlZ2FsU3RhdGVFeGNlcHRpb24pIHQ7Ci0JCQllbHNlCi0JCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIFNldCB0aGUgbmV4dCBleHByZXNzaW9uIHR5cGUuIChpLmUuIHRoZSA8Y29kZT5mb3JFeHByZXNzaW9uPC9jb2RlPiBmaWVsZCBvZiBtb3N0IG9mIHRoZSBjcmVhdGUgZXhwcmVzc2lvbiBtZXRob2RzLgotCSAqIAotCSAqIEBwYXJhbSBuZXh0RXhwcmVzc2lvbgotCSAqIAotCSAqIEBzZWUgSUV4cHJlc3Npb24jY3JlYXRlSW5maXhFeHByZXNzaW9uKGludCwgaW50LCBpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbiBuZXh0RXhwcmVzc2lvbikgewotCQl0aGlzLm5leHRFeHByZXNzaW9uID0gbmV4dEV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuZXh0IGV4cHJlc3Npb24gdHlwZS4gKGkuZS4gdGhlIDxjb2RlPmZvckV4cHJlc3Npb248L2NvZGU+IGZpZWxkIG9mIG1vc3Qgb2YgdGhlIGNyZWF0ZSBleHByZXNzaW9uIG1ldGhvZHMuCi0JICogCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzZWUgSUV4cHJlc3Npb24jY3JlYXRlSW5maXhFeHByZXNzaW9uKGludCwgaW50LCBpbnQpCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEZvckV4cHJlc3Npb24gZ2V0TmV4dEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXh0RXhwcmVzc2lvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEluc3RhbnRpYXRpb25CYXNlTWVzc2FnZXMuUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yX0Nhbm5vdFByb2Nlc3NBbm9ueW1vdXNEZWNsYXJhdGlvbnNfRVhDXywgbmV3IE9iamVjdFtdIHtub2RlLmdldERlY2xhcmF0aW9uKCl9KSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUFjY2VzcyBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVBcnJheUFjY2VzcyhnZXROZXh0RXhwcmVzc2lvbigpLCBub2RlLmdldEluZGV4ZXMoKS5zaXplKCkpOwotCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0FSUkFZKTsKLQkJbm9kZS5nZXRBcnJheSgpLmFjY2VwdCh0aGlzKTsKLQkJTGlzdCBpZHggPSBub2RlLmdldEluZGV4ZXMoKTsKLQkJaW50IHMgPSBpZHguc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHM7IGkrKykgewotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19JTkRFWCk7Ci0JCQkoKFBURXhwcmVzc2lvbikgaWR4LmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlDcmVhdGlvbiBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVBcnJheUNyZWF0aW9uKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0VHlwZSgpLCBub2RlLmdldERpbWVuc2lvbnMoKS5zaXplKCkpOwotCQlpZiAobm9kZS5nZXREaW1lbnNpb25zKCkuaXNFbXB0eSgpKSB7Ci0JCQlub2RlLmdldEluaXRpYWxpemVyKCkuYWNjZXB0KHRoaXMpOwkvLyBBcnJheSBpbml0aWFsaXplciBkb2Vzbid0IHJlcXVpcmUgYSBuZXh0IGV4cHJlc3Npb24uCi0JCX0gZWxzZSB7Ci0JCQlMaXN0IGRpbXMgPSBub2RlLmdldERpbWVuc2lvbnMoKTsKLQkJCWludCBzID0gZGltcy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHM7IGkrKykgewotCQkJCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlDUkVBVElPTl9ESU1FTlNJT04pOwotCQkJCSgoUFRFeHByZXNzaW9uKSBkaW1zLmdldChpKSkuYWNjZXB0KHRoaXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVBcnJheUluaXRpYWxpemVyKG5vZGUuZ2V0RXhwcmVzc2lvbnMoKS5zaXplKCkpOwotCQlMaXN0IGV4cHMgPSBub2RlLmdldEV4cHJlc3Npb25zKCk7Ci0JCWludCBzID0gZXhwcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7Ci0JCQlzZXROZXh0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZSU5JVElBTElaRVJfRVhQUkVTU0lPTik7Ci0JCQkoKFBURXhwcmVzc2lvbikgZXhwcy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRCb29sZWFuTGl0ZXJhbCBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuaXNCb29sZWFuVmFsdWUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDYXN0RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUNhc3RFeHByZXNzaW9uKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0VHlwZSgpKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DQVNUX0VYUFJFU1NJT04pOwotCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDaGFyYWN0ZXJMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0Q2hhclZhbHVlKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihnZXROZXh0RXhwcmVzc2lvbigpLCBub2RlLmdldFR5cGUoKSwgbm9kZS5nZXRBcmd1bWVudHMoKS5zaXplKCkpOwotCQlMaXN0IGFyZ3MgPSBub2RlLmdldEFyZ3VtZW50cygpOwotCQlpbnQgcyA9IGFyZ3Muc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHM7IGkrKykgewotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQpOwotCQkJKChQVEV4cHJlc3Npb24pIGFyZ3MuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oZ2V0TmV4dEV4cHJlc3Npb24oKSk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfQ09ORElUSU9OKTsKLQkJbm9kZS5nZXRDb25kaXRpb24oKS5hY2NlcHQodGhpcyk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfVFJVRSk7Ci0JCW5vZGUuZ2V0VHJ1ZSgpLmFjY2VwdCh0aGlzKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9GQUxTRSk7Ci0JCW5vZGUuZ2V0RmFsc2UoKS5hY2NlcHQodGhpcyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzcykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUZpZWxkQWNjZXNzKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0RmllbGQoKSwgbm9kZS5nZXRSZWNlaXZlcigpICE9IG51bGwpOwotCQlpZiAobm9kZS5nZXRSZWNlaXZlcigpICE9IG51bGwpIHsKLQkJCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIpOwotCQkJbm9kZS5nZXRSZWNlaXZlcigpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUluZml4RXhwcmVzc2lvbihnZXROZXh0RXhwcmVzc2lvbigpLCBjb252ZXJ0UFRJbmZpeE9wZXJhdG9yVG9Qcm94eUluZml4T3BlcmF0b3Iobm9kZS5nZXRPcGVyYXRvcigpKSwgbm9kZS5nZXRFeHRlbmRlZE9wZXJhbmRzKCkuc2l6ZSgpKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZUKTsKLQkJbm9kZS5nZXRMZWZ0T3BlcmFuZCgpLmFjY2VwdCh0aGlzKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCk7Ci0JCW5vZGUuZ2V0UmlnaHRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOwotCQlMaXN0IGV4dGVuZGVkID0gbm9kZS5nZXRFeHRlbmRlZE9wZXJhbmRzKCk7Ci0JCWludCBzID0gZXh0ZW5kZWQuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHM7IGkrKykgewotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCk7Ci0JCQkoKFBURXhwcmVzc2lvbikgZXh0ZW5kZWQuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbnN0YW5jZW9mIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZUluc3RhbmNlb2ZFeHByZXNzaW9uKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0VHlwZSgpKTsKLQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTlNUQU5DRU9GX1ZBTFVFKTsKLQkJbm9kZS5nZXRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW52YWxpZEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbnZhbGlkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obm9kZS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE1ldGhvZEludm9jYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgbm9kZS5nZXROYW1lKCksIG5vZGUuZ2V0UmVjZWl2ZXIoKSAhPSBudWxsLCBub2RlLmdldEFyZ3VtZW50cygpLnNpemUoKSk7Ci0JCWlmIChub2RlLmdldFJlY2VpdmVyKCkgIT0gbnVsbCkgewotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfUkVDRUlWRVIpOwotCQkJbm9kZS5nZXRSZWNlaXZlcigpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlMaXN0IGFyZ3MgPSBub2RlLmdldEFyZ3VtZW50cygpOwotCQlpbnQgcyA9IGFyZ3Muc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHM7IGkrKykgewotCQkJc2V0TmV4dEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfQVJHVU1FTlQpOwotCQkJKChQVEV4cHJlc3Npb24pIGFyZ3MuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE5hbWUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROYW1lIG5vZGUpIHsKLQkJLy8gVGhpcyBpcyBzcGVjaWFsIGluIHRoZSBQVE5hbWUgY2FuIG9ubHkgYmUgdXNlZCBhcyBhIHR5cGUgcmVjZWl2ZXIgYXQgdGhpcyB0aW1lLgotCQlnZXRFeHByZXNzaW9uKCkuY3JlYXRlVHlwZVJlY2VpdmVyKG5vZGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bGxMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTnVsbExpdGVyYWwgbm9kZSkgewotCQkvLyBUaGlzIGlzIHNwZWNpYWwgaW4gdGhlIFBUTmFtZSBjYW4gb25seSBiZSB1c2VkIGFzIGEgdHlwZSByZWNlaXZlciBhdCB0aGlzIHRpbWUuCi0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVOdWxsKGdldE5leHRFeHByZXNzaW9uKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVtYmVyTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE51bWJlckxpdGVyYWwgbm9kZSkgewotCQkvLyBJdCBpcyBhc3N1bWVkIHRoZSB0b2tlbnMgYXJlIHRyaW1tZWQuCi0JCVN0cmluZyBsaXQgPSBub2RlLmdldFRva2VuKCk7Ci0JCWNoYXIgbGFzdENoYXIgPSBsaXQuY2hhckF0KGxpdC5sZW5ndGgoKS0xKTsKLQkJaWYgKGxhc3RDaGFyID09ICdsJyB8fCBsYXN0Q2hhciA9PSAnTCcgKSB7Ci0JCQkvLyBJdCBpcyBkZWZpbml0ZWx5IGEgbG9uZy4KLQkJCS8vIFVzaW5nIGRlY29kZSBzbyB0aGF0IHRoaW5ncyBsaWtlIDB4MyB3aWxsIGJlIHBhcnNlZC4gcGFyc2VMb25nIHdvbid0IHJlY29nbml6ZSB0aG9zZS4KLQkJCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKGdldE5leHRFeHByZXNzaW9uKCksIExvbmcuZGVjb2RlKGxpdC5zdWJzdHJpbmcoMCwgbGl0Lmxlbmd0aCgpLTEpKS5sb25nVmFsdWUoKSk7Ci0JCX0gZWxzZSBpZiAobGFzdENoYXIgPT0gJ0YnIHx8IGxhc3RDaGFyID09ICdmJykgewotCQkJLy8gSXQgaXMgZGVmaW5pdGVseSBhIGZsb2F0LgotCQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgRmxvYXQucGFyc2VGbG9hdChsaXQuc3Vic3RyaW5nKDAsIGxpdC5sZW5ndGgoKS0xKSkpOwotCQl9IGVsc2UgaWYgKGxhc3RDaGFyID09ICdEJyB8fCBsYXN0Q2hhciA9PSAnZCcpICB7Ci0JCQkvLyBJdCBpcyBkZWZpbml0ZWx5IGEgZG91YmxlLgotCQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgRG91YmxlLnBhcnNlRG91YmxlKGxpdC5zdWJzdHJpbmcoMCwgbGl0Lmxlbmd0aCgpLTEpKSk7Ci0JCX0gZWxzZSBpZiAobGl0LmluZGV4T2YoJy4nKSAhPSAtMSB8fCBsaXQuaW5kZXhPZignZScpICE9IC0xIHx8IGxpdC5pbmRleE9mKCdFJykgIT0gLTEpIHsKLQkJCQkvLyBJdCBpcyBkZWZpbml0ZWx5IGEgZG91YmxlLiAoaGFzIGEgcGVyaW9kIG9yIGFuIGV4cG9uZW50LCBidXQgZG9lcyBub3QgaGF2ZSBhbiAnZicgb24gdGhlIGVuZCBpcyBhbHdheXMgYSBkb3VibGUpLgotCQkJCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKGdldE5leHRFeHByZXNzaW9uKCksIERvdWJsZS5wYXJzZURvdWJsZShsaXQuc3Vic3RyaW5nKDAsIGxpdC5sZW5ndGgoKSkpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFVzaW5nIGRlY29kZSBzbyB0aGF0IHRoaW5ncyBsaWtlIDB4MyB3aWxsIGJlIHBhcnNlZC4gcGFyc2VJbnQgd29uJ3QgcmVjb2duaXplIHRob3NlLgotCQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoZ2V0TmV4dEV4cHJlc3Npb24oKSwgSW50ZWdlci5kZWNvZGUobGl0KS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCW5vZGUuZ2V0RXhwcmVzc2lvbigpLmFjY2VwdCh0aGlzKTsJLy8gRm9yIGluc3RhbnRpYXRpb24gcHVycG9zZXMsIHRoZSBwYXJlbnRoZXNpcyBjYW4gYmUgaWdub3JlZC4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRQcmVmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVByZWZpeEV4cHJlc3Npb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgY29udmVydFBUUHJlZml4T3BlcmF0b3JUb1Byb3h5UHJlZml4T3BlcmF0b3Iobm9kZS5nZXRPcGVyYXRvcigpKSk7Ci0JCXNldE5leHRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUFJFRklYX09QRVJBTkQpOwotCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUU3RyaW5nTGl0ZXJhbCBub2RlKSB7Ci0JCWdldEV4cHJlc3Npb24oKS5jcmVhdGVQcm94eUV4cHJlc3Npb24oZ2V0TmV4dEV4cHJlc3Npb24oKSwgZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChub2RlLmdldExpdGVyYWxWYWx1ZSgpKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUaGlzTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFRoaXNMaXRlcmFsIG5vZGUpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihJbnN0YW50aWF0aW9uQmFzZU1lc3NhZ2VzLlBhcnNlVHJlZUFsbG9jYXRpb25JbnN0YW50aWF0aW9uVmlzaXRvcl9DdXJyZW50bHlUaGlzTm90U3VwcG9ydGVkX0VYQ18pOyAKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFR5cGVMaXRlcmFsIG5vZGUpIHsKLQkJZ2V0RXhwcmVzc2lvbigpLmNyZWF0ZVR5cGVMaXRlcmFsKGdldE5leHRFeHByZXNzaW9uKCksIG5vZGUuZ2V0VHlwZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vYmFzZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2UxZjE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2Jhc2UvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1QYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3JfQ3VycmVudGx5VGhpc05vdFN1cHBvcnRlZF9FWENfID0gSVdBVjAwMDFFIEN1cnJlbnRseSAidGhpcyIgaXMgbm90IHN1cHBvcnRlZAotUGFyc2VUcmVlQWxsb2NhdGlvbkluc3RhbnRpYXRpb25WaXNpdG9yX0Nhbm5vdFByb2Nlc3NBbm9ueW1vdXNEZWNsYXJhdGlvbnNfRVhDXyA9IENhbm5vdCBwcm9jZXNzIGFub255bW91cyBkZWNsYXJhdGlvbnM6ICJ7MH0iCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0ltcGxpY2l0QWxsb2NhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW1wbGljaXRBbGxvY2F0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjNkZTVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW1wbGljaXRBbGxvY2F0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW1wbGljaXRBbGxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW1wbGljaXQgQWxsb2NhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5JbXBsaWNpdEFsbG9jYXRpb25JbXBsI2dldFBhcmVudCA8ZW0+UGFyZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkltcGxpY2l0QWxsb2NhdGlvbkltcGwjZ2V0RmVhdHVyZSA8ZW0+RmVhdHVyZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEltcGxpY2l0QWxsb2NhdGlvbkltcGwgZXh0ZW5kcyBKYXZhQWxsb2NhdGlvbkltcGwgaW1wbGVtZW50cyBJbXBsaWNpdEFsbG9jYXRpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudCgpIDxlbT5QYXJlbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgcGFyZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZlYXR1cmUoKSA8ZW0+RmVhdHVyZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmVhdHVyZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbXBsaWNpdEFsbG9jYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEltcGxpY2l0QWxsb2NhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5lSXNQcm94eSgpKSB7Ci0JCQlFT2JqZWN0IG9sZFBhcmVudCA9IHBhcmVudDsKLQkJCXBhcmVudCA9IGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClwYXJlbnQpOwotCQkJaWYgKHBhcmVudCAhPSBvbGRQYXJlbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19QQVJFTlQsIG9sZFBhcmVudCwgcGFyZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBiYXNpY0dldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoRU9iamVjdCBuZXdQYXJlbnQpIHsKLQkJRU9iamVjdCBvbGRQYXJlbnQgPSBwYXJlbnQ7Ci0JCXBhcmVudCA9IG5ld1BhcmVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5ULCBvbGRQYXJlbnQsIHBhcmVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJaWYgKGZlYXR1cmUgIT0gbnVsbCAmJiBmZWF0dXJlLmVJc1Byb3h5KCkpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBvbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJCWZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClmZWF0dXJlKTsKLQkJCWlmIChmZWF0dXJlICE9IG9sZEZlYXR1cmUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19GRUFUVVJFLCBvbGRGZWF0dXJlLCBmZWF0dXJlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBiYXNpY0dldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG5ld0ZlYXR1cmUpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIG9sZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlmZWF0dXJlID0gbmV3RmVhdHVyZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fRkVBVFVSRSwgb2xkRmVhdHVyZSwgZmVhdHVyZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5UOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0UGFyZW50KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0UGFyZW50KCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX0ZFQVRVUkU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRGZWF0dXJlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RmVhdHVyZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5UOgotCQkJCXNldFBhcmVudCgoRU9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19GRUFUVVJFOgotCQkJCXNldEZlYXR1cmUoKEVTdHJ1Y3R1cmFsRmVhdHVyZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTl9fUEFSRU5UOgotCQkJCXNldFBhcmVudCgoRU9iamVjdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLklNUExJQ0lUX0FMTE9DQVRJT05fX0ZFQVRVUkU6Ci0JCQkJc2V0RmVhdHVyZSgoRVN0cnVjdHVyYWxGZWF0dXJlKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19QQVJFTlQ6Ci0JCQkJcmV0dXJuIHBhcmVudCAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTVBMSUNJVF9BTExPQ0FUSU9OX19GRUFUVVJFOgotCQkJCXJldHVybiBmZWF0dXJlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSW1wbGljaXRBbGxvY2F0aW9uKCIgKyBnZXRQYXJlbnQoKSArICItIiArIGdldEZlYXR1cmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi19IC8vSW1wbGljaXRBbGxvY2F0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9Jbml0U3RyaW5nQWxsb2NhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NDJhYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9Jbml0U3RyaW5nQWxsb2NhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5pdFN0cmluZ0FsbG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Jbml0IFN0cmluZyBBbGxvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkluaXRTdHJpbmdBbGxvY2F0aW9uSW1wbCNnZXRJbml0U3RyaW5nIDxlbT5Jbml0IFN0cmluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRTdHJpbmdBbGxvY2F0aW9uSW1wbCBleHRlbmRzIEphdmFBbGxvY2F0aW9uSW1wbCBpbXBsZW1lbnRzIEluaXRTdHJpbmdBbGxvY2F0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdFN0cmluZygpIDxlbT5Jbml0IFN0cmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdFN0cmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVF9TVFJJTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdFN0cmluZygpIDxlbT5Jbml0IFN0cmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdFN0cmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpbml0U3RyaW5nID0gSU5JVF9TVFJJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW5pdFN0cmluZ0FsbG9jYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRTdHJpbmdBbGxvY2F0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0U3RyaW5nKCkgewotCQlyZXR1cm4gaW5pdFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0U3RyaW5nKFN0cmluZyBuZXdJbml0U3RyaW5nKSB7Ci0JCVN0cmluZyBvbGRJbml0U3RyaW5nID0gaW5pdFN0cmluZzsKLQkJaW5pdFN0cmluZyA9IG5ld0luaXRTdHJpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLklOSVRfU1RSSU5HX0FMTE9DQVRJT05fX0lOSVRfU1RSSU5HLCBvbGRJbml0U3RyaW5nLCBpbml0U3RyaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTklUX1NUUklOR19BTExPQ0FUSU9OX19JTklUX1NUUklORzoKLQkJCQlyZXR1cm4gZ2V0SW5pdFN0cmluZygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU5JVF9TVFJJTkdfQUxMT0NBVElPTl9fSU5JVF9TVFJJTkc6Ci0JCQkJc2V0SW5pdFN0cmluZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTklUX1NUUklOR19BTExPQ0FUSU9OX19JTklUX1NUUklORzoKLQkJCQlzZXRJbml0U3RyaW5nKElOSVRfU1RSSU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU5JVF9TVFJJTkdfQUxMT0NBVElPTl9fSU5JVF9TVFJJTkc6Ci0JCQkJcmV0dXJuIElOSVRfU1RSSU5HX0VERUZBVUxUID09IG51bGwgPyBpbml0U3RyaW5nICE9IG51bGwgOiAhSU5JVF9TVFJJTkdfRURFRkFVTFQuZXF1YWxzKGluaXRTdHJpbmcpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcmVzdWx0LmFwcGVuZCgiSW5pdFN0cmluZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW5pdFN0cmluZyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Jbml0U3RyaW5nQWxsb2NhdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luc3RhbnRpYXRpb25GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWNmMmUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFudGlhdGlvbkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgSW5zdGFudGlhdGlvbkZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluc3RhbnRpYXRpb25GYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5JTklUX1NUUklOR19BTExPQ0FUSU9OOiByZXR1cm4gY3JlYXRlSW5pdFN0cmluZ0FsbG9jYXRpb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuSU1QTElDSVRfQUxMT0NBVElPTjogcmV0dXJuIGNyZWF0ZUltcGxpY2l0QWxsb2NhdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT046IHJldHVybiBjcmVhdGVQYXJzZVRyZWVBbGxvY2F0aW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTUzogcmV0dXJuIGNyZWF0ZVBUQXJyYXlBY2Nlc3MoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT046IHJldHVybiBjcmVhdGVQVEFycmF5Q3JlYXRpb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfSU5JVElBTElaRVI6IHJldHVybiBjcmVhdGVQVEFycmF5SW5pdGlhbGl6ZXIoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQk9PTEVBTl9MSVRFUkFMOiByZXR1cm4gY3JlYXRlUFRCb29sZWFuTGl0ZXJhbCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT046IHJldHVybiBjcmVhdGVQVENhc3RFeHByZXNzaW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMOiByZXR1cm4gY3JlYXRlUFRDaGFyYWN0ZXJMaXRlcmFsKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OOiByZXR1cm4gY3JlYXRlUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTjogcmV0dXJuIGNyZWF0ZVBUQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTUzogcmV0dXJuIGNyZWF0ZVBURmllbGRBY2Nlc3MoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTjogcmV0dXJuIGNyZWF0ZVBUSW5maXhFeHByZXNzaW9uKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0Y6IHJldHVybiBjcmVhdGVQVEluc3RhbmNlb2YoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT046IHJldHVybiBjcmVhdGVQVE1ldGhvZEludm9jYXRpb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTkFNRTogcmV0dXJuIGNyZWF0ZVBUTmFtZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OVUxMX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVE51bGxMaXRlcmFsKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05VTUJFUl9MSVRFUkFMOiByZXR1cm4gY3JlYXRlUFROdW1iZXJMaXRlcmFsKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTjogcmV0dXJuIGNyZWF0ZVBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT046IHJldHVybiBjcmVhdGVQVFByZWZpeEV4cHJlc3Npb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVFN0cmluZ0xpdGVyYWwoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfVEhJU19MSVRFUkFMOiByZXR1cm4gY3JlYXRlUFRUaGlzTGl0ZXJhbCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9UWVBFX0xJVEVSQUw6IHJldHVybiBjcmVhdGVQVFR5cGVMaXRlcmFsKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOVkFMSURfRVhQUkVTU0lPTjogcmV0dXJuIGNyZWF0ZVBUSW52YWxpZEV4cHJlc3Npb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VfUkVGRVJFTkNFOiByZXR1cm4gY3JlYXRlUFRJbnN0YW5jZVJlZmVyZW5jZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT046IHJldHVybiBjcmVhdGVQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX09QRVJBVE9SOiB7Ci0JCQkJUFRJbmZpeE9wZXJhdG9yIHJlc3VsdCA9IFBUSW5maXhPcGVyYXRvci5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfT1BFUkFUT1I6IHsKLQkJCQlQVFByZWZpeE9wZXJhdG9yIHJlc3VsdCA9IFBUUHJlZml4T3BlcmF0b3IuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX09QRVJBVE9SOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfT1BFUkFUT1I6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5pdFN0cmluZ0FsbG9jYXRpb24gY3JlYXRlSW5pdFN0cmluZ0FsbG9jYXRpb24oKSB7Ci0JCUluaXRTdHJpbmdBbGxvY2F0aW9uSW1wbCBpbml0U3RyaW5nQWxsb2NhdGlvbiA9IG5ldyBJbml0U3RyaW5nQWxsb2NhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGluaXRTdHJpbmdBbGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbXBsaWNpdEFsbG9jYXRpb24gY3JlYXRlSW1wbGljaXRBbGxvY2F0aW9uKCkgewotCQlJbXBsaWNpdEFsbG9jYXRpb25JbXBsIGltcGxpY2l0QWxsb2NhdGlvbiA9IG5ldyBJbXBsaWNpdEFsbG9jYXRpb25JbXBsKCk7Ci0JCXJldHVybiBpbXBsaWNpdEFsbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlVHJlZUFsbG9jYXRpb24gY3JlYXRlUGFyc2VUcmVlQWxsb2NhdGlvbigpIHsKLQkJUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwgcGFyc2VUcmVlQWxsb2NhdGlvbiA9IG5ldyBQYXJzZVRyZWVBbGxvY2F0aW9uSW1wbCgpOwotCQlyZXR1cm4gcGFyc2VUcmVlQWxsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRBcnJheUFjY2VzcyBjcmVhdGVQVEFycmF5QWNjZXNzKCkgewotCQlQVEFycmF5QWNjZXNzSW1wbCBwdEFycmF5QWNjZXNzID0gbmV3IFBUQXJyYXlBY2Nlc3NJbXBsKCk7Ci0JCXJldHVybiBwdEFycmF5QWNjZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEFycmF5Q3JlYXRpb24gY3JlYXRlUFRBcnJheUNyZWF0aW9uKCkgewotCQlQVEFycmF5Q3JlYXRpb25JbXBsIHB0QXJyYXlDcmVhdGlvbiA9IG5ldyBQVEFycmF5Q3JlYXRpb25JbXBsKCk7Ci0JCXJldHVybiBwdEFycmF5Q3JlYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQXJyYXlJbml0aWFsaXplciBjcmVhdGVQVEFycmF5SW5pdGlhbGl6ZXIoKSB7Ci0JCVBUQXJyYXlJbml0aWFsaXplckltcGwgcHRBcnJheUluaXRpYWxpemVyID0gbmV3IFBUQXJyYXlJbml0aWFsaXplckltcGwoKTsKLQkJcmV0dXJuIHB0QXJyYXlJbml0aWFsaXplcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRCb29sZWFuTGl0ZXJhbCBjcmVhdGVQVEJvb2xlYW5MaXRlcmFsKCkgewotCQlQVEJvb2xlYW5MaXRlcmFsSW1wbCBwdEJvb2xlYW5MaXRlcmFsID0gbmV3IFBUQm9vbGVhbkxpdGVyYWxJbXBsKCk7Ci0JCXJldHVybiBwdEJvb2xlYW5MaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVENhc3RFeHByZXNzaW9uIGNyZWF0ZVBUQ2FzdEV4cHJlc3Npb24oKSB7Ci0JCVBUQ2FzdEV4cHJlc3Npb25JbXBsIHB0Q2FzdEV4cHJlc3Npb24gPSBuZXcgUFRDYXN0RXhwcmVzc2lvbkltcGwoKTsKLQkJcmV0dXJuIHB0Q2FzdEV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUQ2hhcmFjdGVyTGl0ZXJhbCBjcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoKSB7Ci0JCVBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwgcHRDaGFyYWN0ZXJMaXRlcmFsID0gbmV3IFBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwoKTsKLQkJcmV0dXJuIHB0Q2hhcmFjdGVyTGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gY3JlYXRlUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKSB7Ci0JCVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbCBwdENsYXNzSW5zdGFuY2VDcmVhdGlvbiA9IG5ldyBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwoKTsKLQkJcmV0dXJuIHB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBjcmVhdGVQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpIHsKLQkJUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsIHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uID0gbmV3IFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gcHRDb25kaXRpb25hbEV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURmllbGRBY2Nlc3MgY3JlYXRlUFRGaWVsZEFjY2VzcygpIHsKLQkJUFRGaWVsZEFjY2Vzc0ltcGwgcHRGaWVsZEFjY2VzcyA9IG5ldyBQVEZpZWxkQWNjZXNzSW1wbCgpOwotCQlyZXR1cm4gcHRGaWVsZEFjY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRJbmZpeEV4cHJlc3Npb24gY3JlYXRlUFRJbmZpeEV4cHJlc3Npb24oKSB7Ci0JCVBUSW5maXhFeHByZXNzaW9uSW1wbCBwdEluZml4RXhwcmVzc2lvbiA9IG5ldyBQVEluZml4RXhwcmVzc2lvbkltcGwoKTsKLQkJcmV0dXJuIHB0SW5maXhFeHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEluc3RhbmNlb2YgY3JlYXRlUFRJbnN0YW5jZW9mKCkgewotCQlQVEluc3RhbmNlb2ZJbXBsIHB0SW5zdGFuY2VvZiA9IG5ldyBQVEluc3RhbmNlb2ZJbXBsKCk7Ci0JCXJldHVybiBwdEluc3RhbmNlb2Y7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUTWV0aG9kSW52b2NhdGlvbiBjcmVhdGVQVE1ldGhvZEludm9jYXRpb24oKSB7Ci0JCVBUTWV0aG9kSW52b2NhdGlvbkltcGwgcHRNZXRob2RJbnZvY2F0aW9uID0gbmV3IFBUTWV0aG9kSW52b2NhdGlvbkltcGwoKTsKLQkJcmV0dXJuIHB0TWV0aG9kSW52b2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFROYW1lIGNyZWF0ZVBUTmFtZSgpIHsKLQkJUFROYW1lSW1wbCBwdE5hbWUgPSBuZXcgUFROYW1lSW1wbCgpOwotCQlyZXR1cm4gcHROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVE51bGxMaXRlcmFsIGNyZWF0ZVBUTnVsbExpdGVyYWwoKSB7Ci0JCVBUTnVsbExpdGVyYWxJbXBsIHB0TnVsbExpdGVyYWwgPSBuZXcgUFROdWxsTGl0ZXJhbEltcGwoKTsKLQkJcmV0dXJuIHB0TnVsbExpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUTnVtYmVyTGl0ZXJhbCBjcmVhdGVQVE51bWJlckxpdGVyYWwoKSB7Ci0JCVBUTnVtYmVyTGl0ZXJhbEltcGwgcHROdW1iZXJMaXRlcmFsID0gbmV3IFBUTnVtYmVyTGl0ZXJhbEltcGwoKTsKLQkJcmV0dXJuIHB0TnVtYmVyTGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBjcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCkgewotCQlQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbCBwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uID0gbmV3IFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsKCk7Ci0JCXJldHVybiBwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVFByZWZpeEV4cHJlc3Npb24gY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKCkgewotCQlQVFByZWZpeEV4cHJlc3Npb25JbXBsIHB0UHJlZml4RXhwcmVzc2lvbiA9IG5ldyBQVFByZWZpeEV4cHJlc3Npb25JbXBsKCk7Ci0JCXJldHVybiBwdFByZWZpeEV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUU3RyaW5nTGl0ZXJhbCBjcmVhdGVQVFN0cmluZ0xpdGVyYWwoKSB7Ci0JCVBUU3RyaW5nTGl0ZXJhbEltcGwgcHRTdHJpbmdMaXRlcmFsID0gbmV3IFBUU3RyaW5nTGl0ZXJhbEltcGwoKTsKLQkJcmV0dXJuIHB0U3RyaW5nTGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRUaGlzTGl0ZXJhbCBjcmVhdGVQVFRoaXNMaXRlcmFsKCkgewotCQlQVFRoaXNMaXRlcmFsSW1wbCBwdFRoaXNMaXRlcmFsID0gbmV3IFBUVGhpc0xpdGVyYWxJbXBsKCk7Ci0JCXJldHVybiBwdFRoaXNMaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVFR5cGVMaXRlcmFsIGNyZWF0ZVBUVHlwZUxpdGVyYWwoKSB7Ci0JCVBUVHlwZUxpdGVyYWxJbXBsIHB0VHlwZUxpdGVyYWwgPSBuZXcgUFRUeXBlTGl0ZXJhbEltcGwoKTsKLQkJcmV0dXJuIHB0VHlwZUxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUSW52YWxpZEV4cHJlc3Npb24gY3JlYXRlUFRJbnZhbGlkRXhwcmVzc2lvbigpIHsKLQkJUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwgcHRJbnZhbGlkRXhwcmVzc2lvbiA9IG5ldyBQVEludmFsaWRFeHByZXNzaW9uSW1wbCgpOwotCQlyZXR1cm4gcHRJbnZhbGlkRXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRJbnN0YW5jZVJlZmVyZW5jZSBjcmVhdGVQVEluc3RhbmNlUmVmZXJlbmNlKCkgewotCQlQVEluc3RhbmNlUmVmZXJlbmNlSW1wbCBwdEluc3RhbmNlUmVmZXJlbmNlID0gbmV3IFBUSW5zdGFuY2VSZWZlcmVuY2VJbXBsKCk7Ci0JCXJldHVybiBwdEluc3RhbmNlUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gY3JlYXRlUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCkgewotCQlQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsIHB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiA9IG5ldyBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsKCk7Ci0JCXJldHVybiBwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb247Ci0JfQotCi0JcHVibGljIFBUSW5zdGFuY2VSZWZlcmVuY2UgY3JlYXRlUFRJbnN0YW5jZVJlZmVyZW5jZShJSmF2YUluc3RhbmNlIGluc3RhbmNlKSB7Ci0JCVBUSW5zdGFuY2VSZWZlcmVuY2UgcHRJbnN0YW5jZVJlZmVyZW5jZSA9IGNyZWF0ZVBUSW5zdGFuY2VSZWZlcmVuY2UoKTsKLQkJcHRJbnN0YW5jZVJlZmVyZW5jZS5zZXRSZWZlcmVuY2UoaW5zdGFuY2UpOwotCQlyZXR1cm4gcHRJbnN0YW5jZVJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5zdGFudGlhdGlvblBhY2thZ2UgZ2V0SW5zdGFudGlhdGlvblBhY2thZ2UoKSB7Ci0JCXJldHVybiAoSW5zdGFudGlhdGlvblBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5zdGFudGlhdGlvblBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVJbXBsaWNpdEFsbG9jYXRpb24ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIEltcGxpY2l0QWxsb2NhdGlvbiBjcmVhdGVJbXBsaWNpdEFsbG9jYXRpb24oRU9iamVjdCBwYXJlbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzZikgewotCQlJbXBsaWNpdEFsbG9jYXRpb24gYWxsb2MgPSBjcmVhdGVJbXBsaWNpdEFsbG9jYXRpb24oKTsKLQkJYWxsb2Muc2V0UGFyZW50KHBhcmVudCk7Ci0JCWFsbG9jLnNldEZlYXR1cmUoc2YpOwotCQlyZXR1cm4gYWxsb2M7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlSW5pdFN0cmluZ0FsbG9jYXRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSW5pdFN0cmluZ0FsbG9jYXRpb24gY3JlYXRlSW5pdFN0cmluZ0FsbG9jYXRpb24oU3RyaW5nIGluaXRTdHJpbmcpIHsKLQkJSW5pdFN0cmluZ0FsbG9jYXRpb24gYWxsb2MgPSBjcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbigpOwotCQlhbGxvYy5zZXRJbml0U3RyaW5nKGluaXRTdHJpbmcpOwotCQlyZXR1cm4gYWxsb2M7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUGFyc2VUcmVlQWxsb2NhdGlvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIFBhcnNlVHJlZUFsbG9jYXRpb24gY3JlYXRlUGFyc2VUcmVlQWxsb2NhdGlvbihQVEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlQYXJzZVRyZWVBbGxvY2F0aW9uIGEgPSBjcmVhdGVQYXJzZVRyZWVBbGxvY2F0aW9uKCk7Ci0JCWEuc2V0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRBcnJheUFjY2VzcyhvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBQVEFycmF5QWNjZXNzIGNyZWF0ZVBUQXJyYXlBY2Nlc3MoUFRFeHByZXNzaW9uIGFycmF5LCBMaXN0IGluZGV4ZXMpIHsKLQkJUFRBcnJheUFjY2VzcyBhID0gY3JlYXRlUFRBcnJheUFjY2VzcygpOwotCQlhLnNldEFycmF5KGFycmF5KTsKLQkJYS5nZXRJbmRleGVzKCkuYWRkQWxsKGluZGV4ZXMpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEFycmF5Q3JlYXRpb24oamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3QsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplcikKLQkgKi8KLQlwdWJsaWMgUFRBcnJheUNyZWF0aW9uIGNyZWF0ZVBUQXJyYXlDcmVhdGlvbihTdHJpbmcgdHlwZSwgTGlzdCBkaW1lbnNpb25zLCBQVEFycmF5SW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXIpIHsKLQkJUFRBcnJheUNyZWF0aW9uIGEgPSBjcmVhdGVQVEFycmF5Q3JlYXRpb24oKTsKLQkJYS5zZXRUeXBlKHR5cGUpOwotCQlpZiAoZGltZW5zaW9ucyAhPSBudWxsKQotCQkJYS5nZXREaW1lbnNpb25zKCkuYWRkQWxsKGRpbWVuc2lvbnMpOwotCQlhLnNldEluaXRpYWxpemVyKGluaXRpYWxpemVyKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRBcnJheUluaXRpYWxpemVyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBQVEFycmF5SW5pdGlhbGl6ZXIgY3JlYXRlUFRBcnJheUluaXRpYWxpemVyKExpc3QgZXhwcmVzc2lvbnMpIHsKLQkJUFRBcnJheUluaXRpYWxpemVyIGEgPSBjcmVhdGVQVEFycmF5SW5pdGlhbGl6ZXIoKTsKLQkJaWYgKGV4cHJlc3Npb25zICE9IG51bGwpCi0JCQlhLmdldEV4cHJlc3Npb25zKCkuYWRkQWxsKGV4cHJlc3Npb25zKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRCb29sZWFuTGl0ZXJhbChib29sZWFuKQotCSAqLwotCXB1YmxpYyBQVEJvb2xlYW5MaXRlcmFsIGNyZWF0ZVBUQm9vbGVhbkxpdGVyYWwoYm9vbGVhbiBib29sZWFuVmFsdWUpIHsKLQkJUFRCb29sZWFuTGl0ZXJhbCBhID0gY3JlYXRlUFRCb29sZWFuTGl0ZXJhbCgpOwotCQlhLnNldEJvb2xlYW5WYWx1ZShib29sZWFuVmFsdWUpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVENhc3RFeHByZXNzaW9uKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgUFRDYXN0RXhwcmVzc2lvbiBjcmVhdGVQVENhc3RFeHByZXNzaW9uKFN0cmluZyB0eXBlLCBQVEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlQVENhc3RFeHByZXNzaW9uIGEgPSBjcmVhdGVQVENhc3RFeHByZXNzaW9uKCk7Ci0JCWEuc2V0VHlwZSh0eXBlKTsKLQkJYS5zZXRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVENoYXJhY3RlckxpdGVyYWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgUFRDaGFyYWN0ZXJMaXRlcmFsIGNyZWF0ZVBUQ2hhcmFjdGVyTGl0ZXJhbChTdHJpbmcgZXNjYXBlZFZhbHVlKSB7Ci0JCVBUQ2hhcmFjdGVyTGl0ZXJhbCBhID0gY3JlYXRlUFRDaGFyYWN0ZXJMaXRlcmFsKCk7Ci0JCWEuc2V0RXNjYXBlZFZhbHVlKGVzY2FwZWRWYWx1ZSk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiBjcmVhdGVQVENsYXNzSW5zdGFuY2VDcmVhdGlvbihTdHJpbmcgdHlwZSwgTGlzdCBhcmd1bWVudHMpIHsKLQkJUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gYSA9IGNyZWF0ZVBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCWEuc2V0VHlwZSh0eXBlKTsKLQkJaWYgKGFyZ3VtZW50cyAhPSBudWxsKQotCQkJYS5nZXRBcmd1bWVudHMoKS5hZGRBbGwoYXJndW1lbnRzKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRDb25kaXRpb25hbEV4cHJlc3Npb24ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgUFRDb25kaXRpb25hbEV4cHJlc3Npb24gY3JlYXRlUFRDb25kaXRpb25hbEV4cHJlc3Npb24oCi0JCVBURXhwcmVzc2lvbiBjb25kaXRpb24sCi0JCVBURXhwcmVzc2lvbiB0cnVlRXhwcmVzc29pbiwKLQkJUFRFeHByZXNzaW9uIGZhbHNlRXhwcmVzc2lvbikgewotCQlQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBhID0gY3JlYXRlUFRDb25kaXRpb25hbEV4cHJlc3Npb24oKTsKLQkJYS5zZXRDb25kaXRpb24oY29uZGl0aW9uKTsKLQkJYS5zZXRUcnVlKHRydWVFeHByZXNzb2luKTsKLQkJYS5zZXRGYWxzZShmYWxzZUV4cHJlc3Npb24pOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEZpZWxkQWNjZXNzKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgUFRGaWVsZEFjY2VzcyBjcmVhdGVQVEZpZWxkQWNjZXNzKFBURXhwcmVzc2lvbiByZWNlaXZlciwgU3RyaW5nIGZpZWxkKSB7Ci0JCVBURmllbGRBY2Nlc3MgYSA9IGNyZWF0ZVBURmllbGRBY2Nlc3MoKTsKLQkJYS5zZXRSZWNlaXZlcihyZWNlaXZlcik7Ci0JCWEuc2V0RmllbGQoZmllbGQpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVEluZml4RXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24sIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhPcGVyYXRvciwgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uLCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgUFRJbmZpeEV4cHJlc3Npb24gY3JlYXRlUFRJbmZpeEV4cHJlc3Npb24oCi0JCVBURXhwcmVzc2lvbiBsZWZ0T3BlcmFuZCwKLQkJUFRJbmZpeE9wZXJhdG9yIG9wZXJhdG9yLAotCQlQVEV4cHJlc3Npb24gcmlnaHRPcGVyYW5kLAotCQlMaXN0IGV4dGVuZGVkT3BlcmFuZHMpIHsKLQkJUFRJbmZpeEV4cHJlc3Npb24gYSA9IGNyZWF0ZVBUSW5maXhFeHByZXNzaW9uKCk7Ci0JCWEuc2V0TGVmdE9wZXJhbmQobGVmdE9wZXJhbmQpOwotCQlhLnNldE9wZXJhdG9yKG9wZXJhdG9yKTsKLQkJYS5zZXRSaWdodE9wZXJhbmQocmlnaHRPcGVyYW5kKTsKLQkJaWYgKGV4dGVuZGVkT3BlcmFuZHMgIT0gbnVsbCkKLQkJCWEuZ2V0RXh0ZW5kZWRPcGVyYW5kcygpLmFkZEFsbChleHRlbmRlZE9wZXJhbmRzKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRJbnN0YW5jZW9mKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbiwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgUFRJbnN0YW5jZW9mIGNyZWF0ZVBUSW5zdGFuY2VvZihQVEV4cHJlc3Npb24gb3BlcmFuZCwgU3RyaW5nIHR5cGUpIHsKLQkJUFRJbnN0YW5jZW9mIGEgPSBjcmVhdGVQVEluc3RhbmNlb2YoKTsKLQkJYS5zZXRPcGVyYW5kKG9wZXJhbmQpOwotCQlhLnNldFR5cGUodHlwZSk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUSW52YWxpZEV4cHJlc3Npb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgUFRJbnZhbGlkRXhwcmVzc2lvbiBjcmVhdGVQVEludmFsaWRFeHByZXNzaW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVBUSW52YWxpZEV4cHJlc3Npb24gYSA9IGNyZWF0ZVBUSW52YWxpZEV4cHJlc3Npb24oKTsKLQkJYS5zZXRNZXNzYWdlKG1lc3NhZ2UpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVE1ldGhvZEludm9jYXRpb24ob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgUFRNZXRob2RJbnZvY2F0aW9uIGNyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbihQVEV4cHJlc3Npb24gcmVjZWl2ZXIsIFN0cmluZyBuYW1lLCBMaXN0IGFyZ3VtZW50cykgewotCQlQVE1ldGhvZEludm9jYXRpb24gYSA9IGNyZWF0ZVBUTWV0aG9kSW52b2NhdGlvbigpOwotCQlhLnNldFJlY2VpdmVyKHJlY2VpdmVyKTsKLQkJYS5zZXROYW1lKG5hbWUpOwotCQlpZiAoYXJndW1lbnRzICE9IG51bGwpCi0JCQlhLmdldEFyZ3VtZW50cygpLmFkZEFsbChhcmd1bWVudHMpOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVE5hbWUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgUFROYW1lIGNyZWF0ZVBUTmFtZShTdHJpbmcgbmFtZSkgewotCQlQVE5hbWUgYSA9IGNyZWF0ZVBUTmFtZSgpOwotCQlhLnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiBhOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5I2NyZWF0ZVBUTnVtYmVyTGl0ZXJhbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVE51bWJlckxpdGVyYWwgY3JlYXRlUFROdW1iZXJMaXRlcmFsKFN0cmluZyB0b2tlbikgewotCQlQVE51bWJlckxpdGVyYWwgYSA9IGNyZWF0ZVBUTnVtYmVyTGl0ZXJhbCgpOwotCQlhLnNldFRva2VuKHRva2VuKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24gY3JlYXRlUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihQVEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIGEgPSBjcmVhdGVQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCk7Ci0JCWEuc2V0RXhwcmVzc2lvbihleHByZXNzaW9uKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRQcmVmaXhFeHByZXNzaW9uKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4T3BlcmF0b3IsIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgUFRQcmVmaXhFeHByZXNzaW9uIGNyZWF0ZVBUUHJlZml4RXhwcmVzc2lvbihQVFByZWZpeE9wZXJhdG9yIG9wZXJhdG9yLCBQVEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlQVFByZWZpeEV4cHJlc3Npb24gYSA9IGNyZWF0ZVBUUHJlZml4RXhwcmVzc2lvbigpOwotCQlhLnNldE9wZXJhdG9yKG9wZXJhdG9yKTsKLQkJYS5zZXRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCQlyZXR1cm4gYTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeSNjcmVhdGVQVFN0cmluZ0xpdGVyYWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgUFRTdHJpbmdMaXRlcmFsIGNyZWF0ZVBUU3RyaW5nTGl0ZXJhbChTdHJpbmcgZXNjYXBlTGl0ZXJhbCkgewotCQlQVFN0cmluZ0xpdGVyYWwgYSA9IGNyZWF0ZVBUU3RyaW5nTGl0ZXJhbCgpOwotCQlhLnNldEVzY2FwZWRWYWx1ZShlc2NhcGVMaXRlcmFsKTsKLQkJcmV0dXJuIGE7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3RvcnkjY3JlYXRlUFRUeXBlTGl0ZXJhbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBQVFR5cGVMaXRlcmFsIGNyZWF0ZVBUVHlwZUxpdGVyYWwoU3RyaW5nIHR5cGUpIHsKLQkJUFRUeXBlTGl0ZXJhbCBhID0gY3JlYXRlUFRUeXBlTGl0ZXJhbCgpOwotCQlhLnNldFR5cGUodHlwZSk7Ci0JCXJldHVybiBhOwotCX0KLQotfSAvL0luc3RhbnRpYXRpb25GYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9JbnN0YW50aWF0aW9uSW1wbE1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luc3RhbnRpYXRpb25JbXBsTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRlYmUxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luc3RhbnRpYXRpb25JbXBsTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEluc3RhbnRpYXRpb25JbXBsTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW5zdGFudGlhdGlvbkltcGxNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmFpdmVFeHByZXNzaW9uRmxhdHRlbmVyX0ludmFsaWRFeHByZXNzaW9uOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSW5zdGFudGlhdGlvbkltcGxNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0luc3RhbnRpYXRpb25QYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTNkNzhmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVjb3JlUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5QWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlDcmVhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRCb29sZWFuTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENhc3RFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENvbmRpdGlvbmFsRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbXBsaWNpdEFsbG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbmZpeE9wZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5pdFN0cmluZ0FsbG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnN0YW5jZW9mOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW52YWxpZEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSmF2YUFsbG9jYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRNZXRob2RJbnZvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bGxMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVtYmVyTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVHJlZUFsbG9jYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhPcGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUaGlzTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFR5cGVMaXRlcmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFPYmplY3RJbnN0YW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YW50aWF0aW9uUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBJbnN0YW50aWF0aW9uUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaUphdmFEYXRhVHlwZUluc3RhbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGlKYXZhT2JqZWN0SW5zdGFuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgamF2YUFsbG9jYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW5pdFN0cmluZ0FsbG9jYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRFeHByZXNzaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0QXJyYXlBY2Nlc3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRBcnJheUNyZWF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0QXJyYXlJbml0aWFsaXplckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEJvb2xlYW5MaXRlcmFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0Q2FzdEV4cHJlc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0Q29uZGl0aW9uYWxFeHByZXNzaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0RmllbGRBY2Nlc3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRJbnN0YW5jZW9mRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdE5hbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHROdWxsTGl0ZXJhbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdE51bWJlckxpdGVyYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRTdHJpbmdMaXRlcmFsRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0VGhpc0xpdGVyYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRUeXBlTGl0ZXJhbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwdEludmFsaWRFeHByZXNzaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHB0SW5zdGFuY2VSZWZlcmVuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gcHRJbmZpeE9wZXJhdG9yRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBwdFByZWZpeE9wZXJhdG9yRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgaUphdmFJbnN0YW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnN0YW50aWF0aW9uUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoSW5zdGFudGlhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSW5zdGFudGlhdGlvblBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlJbnN0YW50aWF0aW9uUGFja2FnZUltcGwgdGhlSW5zdGFudGlhdGlvblBhY2thZ2UgPSAoSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEluc3RhbnRpYXRpb25QYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUluc3RhbnRpYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlSW5zdGFudGlhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlSW5zdGFudGlhdGlvblBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUluc3RhbnRpYXRpb25QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SUphdmFPYmplY3RJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGlKYXZhT2JqZWN0SW5zdGFuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhQWxsb2NhdGlvbigpIHsKLQkJcmV0dXJuIGphdmFBbGxvY2F0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SW5pdFN0cmluZ0FsbG9jYXRpb24oKSB7Ci0JCXJldHVybiBpbml0U3RyaW5nQWxsb2NhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbml0U3RyaW5nQWxsb2NhdGlvbl9Jbml0U3RyaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5pdFN0cmluZ0FsbG9jYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEltcGxpY2l0QWxsb2NhdGlvbigpIHsKLQkJcmV0dXJuIGltcGxpY2l0QWxsb2NhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbXBsaWNpdEFsbG9jYXRpb25fUGFyZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW1wbGljaXRBbGxvY2F0aW9uX0ZlYXR1cmUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhcnNlVHJlZUFsbG9jYXRpb24oKSB7Ci0JCXJldHVybiBwYXJzZVRyZWVBbGxvY2F0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBhcnNlVHJlZUFsbG9jYXRpb25fRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXBhcnNlVHJlZUFsbG9jYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBURXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHB0RXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUQXJyYXlBY2Nlc3MoKSB7Ci0JCXJldHVybiBwdEFycmF5QWNjZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQXJyYXlBY2Nlc3NfQXJyYXkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEFycmF5QWNjZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRBcnJheUFjY2Vzc19JbmRleGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRBcnJheUFjY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRBcnJheUNyZWF0aW9uKCkgewotCQlyZXR1cm4gcHRBcnJheUNyZWF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQXJyYXlDcmVhdGlvbl9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRBcnJheUNyZWF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRBcnJheUNyZWF0aW9uX0RpbWVuc2lvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEFycmF5Q3JlYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEFycmF5Q3JlYXRpb25fSW5pdGlhbGl6ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEFycmF5Q3JlYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUQXJyYXlJbml0aWFsaXplcigpIHsKLQkJcmV0dXJuIHB0QXJyYXlJbml0aWFsaXplckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEFycmF5SW5pdGlhbGl6ZXJfRXhwcmVzc2lvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEFycmF5SW5pdGlhbGl6ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUQm9vbGVhbkxpdGVyYWwoKSB7Ci0JCXJldHVybiBwdEJvb2xlYW5MaXRlcmFsRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUQm9vbGVhbkxpdGVyYWxfQm9vbGVhblZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRCb29sZWFuTGl0ZXJhbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRDYXN0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHB0Q2FzdEV4cHJlc3Npb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRDYXN0RXhwcmVzc2lvbl9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRDYXN0RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQ2FzdEV4cHJlc3Npb25fRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0Q2FzdEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUQ2hhcmFjdGVyTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHB0Q2hhcmFjdGVyTGl0ZXJhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVENoYXJhY3RlckxpdGVyYWxfRXNjYXBlZFZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsX0NoYXJWYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0Q2hhcmFjdGVyTGl0ZXJhbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb24oKSB7Ci0JCXJldHVybiBwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbl9Bcmd1bWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9Db25kaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX1RydWUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uX0ZhbHNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBURmllbGRBY2Nlc3MoKSB7Ci0JCXJldHVybiBwdEZpZWxkQWNjZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBURmllbGRBY2Nlc3NfUmVjZWl2ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEZpZWxkQWNjZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRGaWVsZEFjY2Vzc19GaWVsZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0RmllbGRBY2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUSW5maXhFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcHRJbmZpeEV4cHJlc3Npb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRJbmZpeEV4cHJlc3Npb25fTGVmdE9wZXJhbmQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEluZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBUSW5maXhFeHByZXNzaW9uX09wZXJhdG9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEluZml4RXhwcmVzc2lvbl9SaWdodE9wZXJhbmQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEluZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUSW5maXhFeHByZXNzaW9uX0V4dGVuZGVkT3BlcmFuZHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdEluZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRJbnN0YW5jZW9mKCkgewotCQlyZXR1cm4gcHRJbnN0YW5jZW9mRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUSW5zdGFuY2VvZl9PcGVyYW5kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHRJbnN0YW5jZW9mRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRJbnN0YW5jZW9mX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdEluc3RhbmNlb2ZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUTWV0aG9kSW52b2NhdGlvbigpIHsKLQkJcmV0dXJuIHB0TWV0aG9kSW52b2NhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVE1ldGhvZEludm9jYXRpb25fUmVjZWl2ZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVE1ldGhvZEludm9jYXRpb25fTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBUTWV0aG9kSW52b2NhdGlvbl9Bcmd1bWVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdE1ldGhvZEludm9jYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUTmFtZSgpIHsKLQkJcmV0dXJuIHB0TmFtZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVE5hbWVfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0TmFtZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFROdWxsTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHB0TnVsbExpdGVyYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVE51bWJlckxpdGVyYWwoKSB7Ci0JCXJldHVybiBwdE51bWJlckxpdGVyYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFROdW1iZXJMaXRlcmFsX1Rva2VuKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHROdW1iZXJMaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcHRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0V4cHJlc3Npb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVFByZWZpeEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRQcmVmaXhFeHByZXNzaW9uX09wZXJhdG9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRQcmVmaXhFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UFRQcmVmaXhFeHByZXNzaW9uX0V4cHJlc3Npb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwdFByZWZpeEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUU3RyaW5nTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHB0U3RyaW5nTGl0ZXJhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVFN0cmluZ0xpdGVyYWxfRXNjYXBlZFZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHRTdHJpbmdMaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UFRTdHJpbmdMaXRlcmFsX0xpdGVyYWxWYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0U3RyaW5nTGl0ZXJhbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UFRUaGlzTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHB0VGhpc0xpdGVyYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVFR5cGVMaXRlcmFsKCkgewotCQlyZXR1cm4gcHRUeXBlTGl0ZXJhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVFR5cGVMaXRlcmFsX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdFR5cGVMaXRlcmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEludmFsaWRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gcHRJbnZhbGlkRXhwcmVzc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVEludmFsaWRFeHByZXNzaW9uX01lc3NhZ2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdEludmFsaWRFeHByZXNzaW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQVEluc3RhbmNlUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcHRJbnN0YW5jZVJlZmVyZW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQVEluc3RhbmNlUmVmZXJlbmNlX1JlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXB0SW5zdGFuY2VSZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25fRGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25fSW1wb3J0cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRQVEluZml4T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBwdEluZml4T3BlcmF0b3JFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0UFRQcmVmaXhPcGVyYXRvcigpIHsKLQkJcmV0dXJuIHB0UHJlZml4T3BlcmF0b3JFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElKYXZhRGF0YVR5cGVJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGlKYXZhRGF0YVR5cGVJbnN0YW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldElKYXZhSW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpSmF2YUluc3RhbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnN0YW50aWF0aW9uRmFjdG9yeSBnZXRJbnN0YW50aWF0aW9uRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChJbnN0YW50aWF0aW9uRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlpSmF2YURhdGFUeXBlSW5zdGFuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUpBVkFfREFUQV9UWVBFX0lOU1RBTkNFKTsKLQotCQlpSmF2YUluc3RhbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElKQVZBX0lOU1RBTkNFKTsKLQotCQlpSmF2YU9iamVjdEluc3RhbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKElKQVZBX09CSkVDVF9JTlNUQU5DRSk7Ci0KLQkJamF2YUFsbG9jYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSkFWQV9BTExPQ0FUSU9OKTsKLQotCQlpbml0U3RyaW5nQWxsb2NhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTklUX1NUUklOR19BTExPQ0FUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbml0U3RyaW5nQWxsb2NhdGlvbkVDbGFzcywgSU5JVF9TVFJJTkdfQUxMT0NBVElPTl9fSU5JVF9TVFJJTkcpOwotCi0JCWltcGxpY2l0QWxsb2NhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTVBMSUNJVF9BTExPQ0FUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3MsIElNUExJQ0lUX0FMTE9DQVRJT05fX1BBUkVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW1wbGljaXRBbGxvY2F0aW9uRUNsYXNzLCBJTVBMSUNJVF9BTExPQ0FUSU9OX19GRUFUVVJFKTsKLQotCQlwYXJzZVRyZWVBbGxvY2F0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBUlNFX1RSRUVfQUxMT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocGFyc2VUcmVlQWxsb2NhdGlvbkVDbGFzcywgUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OKTsKLQotCQlwdEV4cHJlc3Npb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfRVhQUkVTU0lPTik7Ci0KLQkJcHRBcnJheUFjY2Vzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9BUlJBWV9BQ0NFU1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0QXJyYXlBY2Nlc3NFQ2xhc3MsIFBUX0FSUkFZX0FDQ0VTU19fQVJSQVkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0QXJyYXlBY2Nlc3NFQ2xhc3MsIFBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUyk7Ci0KLQkJcHRBcnJheUNyZWF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0FSUkFZX0NSRUFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdEFycmF5Q3JlYXRpb25FQ2xhc3MsIFBUX0FSUkFZX0NSRUFUSU9OX19UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEFycmF5Q3JlYXRpb25FQ2xhc3MsIFBUX0FSUkFZX0NSRUFUSU9OX19ESU1FTlNJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEFycmF5Q3JlYXRpb25FQ2xhc3MsIFBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUik7Ci0KLQkJcHRBcnJheUluaXRpYWxpemVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0FSUkFZX0lOSVRJQUxJWkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEFycmF5SW5pdGlhbGl6ZXJFQ2xhc3MsIFBUX0FSUkFZX0lOSVRJQUxJWkVSX19FWFBSRVNTSU9OUyk7Ci0KLQkJcHRCb29sZWFuTGl0ZXJhbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9CT09MRUFOX0xJVEVSQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0Qm9vbGVhbkxpdGVyYWxFQ2xhc3MsIFBUX0JPT0xFQU5fTElURVJBTF9fQk9PTEVBTl9WQUxVRSk7Ci0KLQkJcHRDYXN0RXhwcmVzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9DQVNUX0VYUFJFU1NJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHB0Q2FzdEV4cHJlc3Npb25FQ2xhc3MsIFBUX0NBU1RfRVhQUkVTU0lPTl9fVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRDYXN0RXhwcmVzc2lvbkVDbGFzcywgUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OKTsKLQotCQlwdENoYXJhY3RlckxpdGVyYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfQ0hBUkFDVEVSX0xJVEVSQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0Q2hhcmFjdGVyTGl0ZXJhbEVDbGFzcywgUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0Q2hhcmFjdGVyTGl0ZXJhbEVDbGFzcywgUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0NIQVJfVkFMVUUpOwotCi0JCXB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcywgUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRUNsYXNzLCBQVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fQVJHVU1FTlRTKTsKLQotCQlwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcywgUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcywgUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MsIFBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFKTsKLQotCQlwdEZpZWxkQWNjZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0ZJRUxEX0FDQ0VTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRGaWVsZEFjY2Vzc0VDbGFzcywgUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRGaWVsZEFjY2Vzc0VDbGFzcywgUFRfRklFTERfQUNDRVNTX19GSUVMRCk7Ci0KLQkJcHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfSU5GSVhfRVhQUkVTU0lPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUX0lORklYX0VYUFJFU1NJT05fX09QRVJBVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEluZml4RXhwcmVzc2lvbkVDbGFzcywgUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRJbmZpeEV4cHJlc3Npb25FQ2xhc3MsIFBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTKTsKLQotCQlwdEluc3RhbmNlb2ZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfSU5TVEFOQ0VPRik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRJbnN0YW5jZW9mRUNsYXNzLCBQVF9JTlNUQU5DRU9GX19PUEVSQU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdEluc3RhbmNlb2ZFQ2xhc3MsIFBUX0lOU1RBTkNFT0ZfX1RZUEUpOwotCi0JCXB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9NRVRIT0RfSU5WT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzLCBQVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcywgUFRfTUVUSE9EX0lOVk9DQVRJT05fX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcywgUFRfTUVUSE9EX0lOVk9DQVRJT05fX0FSR1VNRU5UUyk7Ci0KLQkJcHROYW1lRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHB0TmFtZUVDbGFzcywgUFRfTkFNRV9fTkFNRSk7Ci0KLQkJcHROdWxsTGl0ZXJhbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9OVUxMX0xJVEVSQUwpOwotCi0JCXB0TnVtYmVyTGl0ZXJhbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9OVU1CRVJfTElURVJBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHROdW1iZXJMaXRlcmFsRUNsYXNzLCBQVF9OVU1CRVJfTElURVJBTF9fVE9LRU4pOwotCi0JCXB0UGFyZW50aGVzaXplZEV4cHJlc3Npb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uRUNsYXNzLCBQVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT04pOwotCi0JCXB0UHJlZml4RXhwcmVzc2lvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9QUkVGSVhfRVhQUkVTU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRQcmVmaXhFeHByZXNzaW9uRUNsYXNzLCBQVF9QUkVGSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHB0UHJlZml4RXhwcmVzc2lvbkVDbGFzcywgUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT04pOwotCi0JCXB0U3RyaW5nTGl0ZXJhbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9TVFJJTkdfTElURVJBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRTdHJpbmdMaXRlcmFsRUNsYXNzLCBQVF9TVFJJTkdfTElURVJBTF9fRVNDQVBFRF9WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRTdHJpbmdMaXRlcmFsRUNsYXNzLCBQVF9TVFJJTkdfTElURVJBTF9fTElURVJBTF9WQUxVRSk7Ci0KLQkJcHRUaGlzTGl0ZXJhbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQVF9USElTX0xJVEVSQUwpOwotCi0JCXB0VHlwZUxpdGVyYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfVFlQRV9MSVRFUkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdFR5cGVMaXRlcmFsRUNsYXNzLCBQVF9UWVBFX0xJVEVSQUxfX1RZUEUpOwotCi0JCXB0SW52YWxpZEV4cHJlc3Npb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfSU5WQUxJRF9FWFBSRVNTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdEludmFsaWRFeHByZXNzaW9uRUNsYXNzLCBQVF9JTlZBTElEX0VYUFJFU1NJT05fX01FU1NBR0UpOwotCi0JCXB0SW5zdGFuY2VSZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFRfSU5TVEFOQ0VfUkVGRVJFTkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwdEluc3RhbmNlUmVmZXJlbmNlRUNsYXNzLCBQVF9JTlNUQU5DRV9SRUZFUkVOQ0VfX1JFRkVSRU5DRSk7Ci0KLQkJcHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uRUNsYXNzLCBQVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0RFQ0xBUkFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb25FQ2xhc3MsIFBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fSU1QT1JUUyk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCXB0SW5maXhPcGVyYXRvckVFbnVtID0gY3JlYXRlRUVudW0oUFRfSU5GSVhfT1BFUkFUT1IpOwotCQlwdFByZWZpeE9wZXJhdG9yRUVudW0gPSBjcmVhdGVFRW51bShQVF9QUkVGSVhfT1BFUkFUT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlFY29yZVBhY2thZ2VJbXBsIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2VJbXBsKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWlKYXZhRGF0YVR5cGVJbnN0YW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldElKYXZhSW5zdGFuY2UoKSk7Ci0JCWlKYXZhT2JqZWN0SW5zdGFuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRJSmF2YUluc3RhbmNlKCkpOwotCQlpbml0U3RyaW5nQWxsb2NhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFBbGxvY2F0aW9uKCkpOwotCQlpbXBsaWNpdEFsbG9jYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKYXZhQWxsb2NhdGlvbigpKTsKLQkJcGFyc2VUcmVlQWxsb2NhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFBbGxvY2F0aW9uKCkpOwotCQlwdEFycmF5QWNjZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdEFycmF5Q3JlYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0QXJyYXlJbml0aWFsaXplckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRCb29sZWFuTGl0ZXJhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRDYXN0RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdENsYXNzSW5zdGFuY2VDcmVhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRDb25kaXRpb25hbEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0RmllbGRBY2Nlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0SW5maXhFeHByZXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdEluc3RhbmNlb2ZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0TWV0aG9kSW52b2NhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHROYW1lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdE51bGxMaXRlcmFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdE51bWJlckxpdGVyYWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0UGFyZW50aGVzaXplZEV4cHJlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0JCXB0UHJlZml4RXhwcmVzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBURXhwcmVzc2lvbigpKTsKLQkJcHRTdHJpbmdMaXRlcmFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdFRoaXNMaXRlcmFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdFR5cGVMaXRlcmFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdEludmFsaWRFeHByZXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdEluc3RhbmNlUmVmZXJlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UFRFeHByZXNzaW9uKCkpOwotCQlwdEFub255bW91c0NsYXNzRGVjbGFyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQVEV4cHJlc3Npb24oKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhpSmF2YURhdGFUeXBlSW5zdGFuY2VFQ2xhc3MsIElKYXZhRGF0YVR5cGVJbnN0YW5jZS5jbGFzcywgIklKYXZhRGF0YVR5cGVJbnN0YW5jZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoaUphdmFJbnN0YW5jZUVDbGFzcywgSUphdmFJbnN0YW5jZS5jbGFzcywgIklKYXZhSW5zdGFuY2UiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGlKYXZhT2JqZWN0SW5zdGFuY2VFQ2xhc3MsIElKYXZhT2JqZWN0SW5zdGFuY2UuY2xhc3MsICJJSmF2YU9iamVjdEluc3RhbmNlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhqYXZhQWxsb2NhdGlvbkVDbGFzcywgSmF2YUFsbG9jYXRpb24uY2xhc3MsICJKYXZhQWxsb2NhdGlvbiIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoaW5pdFN0cmluZ0FsbG9jYXRpb25FQ2xhc3MsIEluaXRTdHJpbmdBbGxvY2F0aW9uLmNsYXNzLCAiSW5pdFN0cmluZ0FsbG9jYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEluaXRTdHJpbmdBbGxvY2F0aW9uX0luaXRTdHJpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImluaXRTdHJpbmciLCBudWxsLCAwLCAxLCBJbml0U3RyaW5nQWxsb2NhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGltcGxpY2l0QWxsb2NhdGlvbkVDbGFzcywgSW1wbGljaXRBbGxvY2F0aW9uLmNsYXNzLCAiSW1wbGljaXRBbGxvY2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRJbXBsaWNpdEFsbG9jYXRpb25fUGFyZW50KCksIHRoZUVjb3JlUGFja2FnZS5nZXRFT2JqZWN0KCksIG51bGwsICJwYXJlbnQiLCBudWxsLCAxLCAxLCBJbXBsaWNpdEFsbG9jYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEltcGxpY2l0QWxsb2NhdGlvbl9GZWF0dXJlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSwgbnVsbCwgImZlYXR1cmUiLCBudWxsLCAxLCAxLCBJbXBsaWNpdEFsbG9jYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwYXJzZVRyZWVBbGxvY2F0aW9uRUNsYXNzLCBQYXJzZVRyZWVBbGxvY2F0aW9uLmNsYXNzLCAiUGFyc2VUcmVlQWxsb2NhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFyc2VUcmVlQWxsb2NhdGlvbl9FeHByZXNzaW9uKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJleHByZXNzaW9uIiwgbnVsbCwgMSwgMSwgUGFyc2VUcmVlQWxsb2NhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0RXhwcmVzc2lvbkVDbGFzcywgUFRFeHByZXNzaW9uLmNsYXNzLCAiUFRFeHByZXNzaW9uIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwdEFycmF5QWNjZXNzRUNsYXNzLCBQVEFycmF5QWNjZXNzLmNsYXNzLCAiUFRBcnJheUFjY2VzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRBcnJheUFjY2Vzc19BcnJheSgpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiYXJyYXkiLCBudWxsLCAwLCAxLCBQVEFycmF5QWNjZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEFycmF5QWNjZXNzX0luZGV4ZXMoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImluZGV4ZXMiLCBudWxsLCAxLCAtMSwgUFRBcnJheUFjY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0QXJyYXlDcmVhdGlvbkVDbGFzcywgUFRBcnJheUNyZWF0aW9uLmNsYXNzLCAiUFRBcnJheUNyZWF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVEFycmF5Q3JlYXRpb25fVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIFBUQXJyYXlDcmVhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRBcnJheUNyZWF0aW9uX0RpbWVuc2lvbnMoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImRpbWVuc2lvbnMiLCBudWxsLCAwLCAtMSwgUFRBcnJheUNyZWF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEFycmF5Q3JlYXRpb25fSW5pdGlhbGl6ZXIoKSwgdGhpcy5nZXRQVEFycmF5SW5pdGlhbGl6ZXIoKSwgbnVsbCwgImluaXRpYWxpemVyIiwgbnVsbCwgMCwgMSwgUFRBcnJheUNyZWF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRBcnJheUluaXRpYWxpemVyRUNsYXNzLCBQVEFycmF5SW5pdGlhbGl6ZXIuY2xhc3MsICJQVEFycmF5SW5pdGlhbGl6ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUQXJyYXlJbml0aWFsaXplcl9FeHByZXNzaW9ucygpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZXhwcmVzc2lvbnMiLCBudWxsLCAwLCAtMSwgUFRBcnJheUluaXRpYWxpemVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRCb29sZWFuTGl0ZXJhbEVDbGFzcywgUFRCb29sZWFuTGl0ZXJhbC5jbGFzcywgIlBUQm9vbGVhbkxpdGVyYWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQm9vbGVhbkxpdGVyYWxfQm9vbGVhblZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiYm9vbGVhblZhbHVlIiwgbnVsbCwgMCwgMSwgUFRCb29sZWFuTGl0ZXJhbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0Q2FzdEV4cHJlc3Npb25FQ2xhc3MsIFBUQ2FzdEV4cHJlc3Npb24uY2xhc3MsICJQVENhc3RFeHByZXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVENhc3RFeHByZXNzaW9uX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBQVENhc3RFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVENhc3RFeHByZXNzaW9uX0V4cHJlc3Npb24oKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImV4cHJlc3Npb24iLCBudWxsLCAwLCAxLCBQVENhc3RFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRDaGFyYWN0ZXJMaXRlcmFsRUNsYXNzLCBQVENoYXJhY3RlckxpdGVyYWwuY2xhc3MsICJQVENoYXJhY3RlckxpdGVyYWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQ2hhcmFjdGVyTGl0ZXJhbF9Fc2NhcGVkVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVzY2FwZWRWYWx1ZSIsIG51bGwsIDAsIDEsIFBUQ2hhcmFjdGVyTGl0ZXJhbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRDaGFyYWN0ZXJMaXRlcmFsX0NoYXJWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUNoYXIoKSwgImNoYXJWYWx1ZSIsIG51bGwsIDAsIDEsIFBUQ2hhcmFjdGVyTGl0ZXJhbC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRDbGFzc0luc3RhbmNlQ3JlYXRpb25FQ2xhc3MsIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uLmNsYXNzLCAiUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRDbGFzc0luc3RhbmNlQ3JlYXRpb25fQXJndW1lbnRzKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJhcmd1bWVudHMiLCBudWxsLCAwLCAtMSwgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdENvbmRpdGlvbmFsRXhwcmVzc2lvbkVDbGFzcywgUFRDb25kaXRpb25hbEV4cHJlc3Npb24uY2xhc3MsICJQVENvbmRpdGlvbmFsRXhwcmVzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fQ29uZGl0aW9uKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJjb25kaXRpb24iLCBudWxsLCAwLCAxLCBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRDb25kaXRpb25hbEV4cHJlc3Npb25fVHJ1ZSgpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAidHJ1ZSIsIG51bGwsIDAsIDEsIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbl9GYWxzZSgpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZmFsc2UiLCBudWxsLCAwLCAxLCBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0RmllbGRBY2Nlc3NFQ2xhc3MsIFBURmllbGRBY2Nlc3MuY2xhc3MsICJQVEZpZWxkQWNjZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEZpZWxkQWNjZXNzX1JlY2VpdmVyKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJyZWNlaXZlciIsIG51bGwsIDAsIDEsIFBURmllbGRBY2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBURmllbGRBY2Nlc3NfRmllbGQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZpZWxkIiwgbnVsbCwgMCwgMSwgUFRGaWVsZEFjY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0SW5maXhFeHByZXNzaW9uRUNsYXNzLCBQVEluZml4RXhwcmVzc2lvbi5jbGFzcywgIlBUSW5maXhFeHByZXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVEluZml4RXhwcmVzc2lvbl9MZWZ0T3BlcmFuZCgpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAibGVmdE9wZXJhbmQiLCBudWxsLCAwLCAxLCBQVEluZml4RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRJbmZpeEV4cHJlc3Npb25fT3BlcmF0b3IoKSwgdGhpcy5nZXRQVEluZml4T3BlcmF0b3IoKSwgIm9wZXJhdG9yIiwgbnVsbCwgMCwgMSwgUFRJbmZpeEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUSW5maXhFeHByZXNzaW9uX1JpZ2h0T3BlcmFuZCgpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAicmlnaHRPcGVyYW5kIiwgbnVsbCwgMCwgMSwgUFRJbmZpeEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUSW5maXhFeHByZXNzaW9uX0V4dGVuZGVkT3BlcmFuZHMoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImV4dGVuZGVkT3BlcmFuZHMiLCBudWxsLCAwLCAtMSwgUFRJbmZpeEV4cHJlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwdEluc3RhbmNlb2ZFQ2xhc3MsIFBUSW5zdGFuY2VvZi5jbGFzcywgIlBUSW5zdGFuY2VvZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UFRJbnN0YW5jZW9mX09wZXJhbmQoKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgIm9wZXJhbmQiLCBudWxsLCAwLCAxLCBQVEluc3RhbmNlb2YuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUSW5zdGFuY2VvZl9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgUFRJbnN0YW5jZW9mLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRNZXRob2RJbnZvY2F0aW9uRUNsYXNzLCBQVE1ldGhvZEludm9jYXRpb24uY2xhc3MsICJQVE1ldGhvZEludm9jYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUTWV0aG9kSW52b2NhdGlvbl9SZWNlaXZlcigpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAicmVjZWl2ZXIiLCBudWxsLCAwLCAxLCBQVE1ldGhvZEludm9jYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUTWV0aG9kSW52b2NhdGlvbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgUFRNZXRob2RJbnZvY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVE1ldGhvZEludm9jYXRpb25fQXJndW1lbnRzKCksIHRoaXMuZ2V0UFRFeHByZXNzaW9uKCksIG51bGwsICJhcmd1bWVudHMiLCBudWxsLCAwLCAtMSwgUFRNZXRob2RJbnZvY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHROYW1lRUNsYXNzLCBQVE5hbWUuY2xhc3MsICJQVE5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUTmFtZV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgUFROYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHROdWxsTGl0ZXJhbEVDbGFzcywgUFROdWxsTGl0ZXJhbC5jbGFzcywgIlBUTnVsbExpdGVyYWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwdE51bWJlckxpdGVyYWxFQ2xhc3MsIFBUTnVtYmVyTGl0ZXJhbC5jbGFzcywgIlBUTnVtYmVyTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFROdW1iZXJMaXRlcmFsX1Rva2VuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0b2tlbiIsIG51bGwsIDAsIDEsIFBUTnVtYmVyTGl0ZXJhbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0UGFyZW50aGVzaXplZEV4cHJlc3Npb25FQ2xhc3MsIFBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24uY2xhc3MsICJQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0V4cHJlc3Npb24oKSwgdGhpcy5nZXRQVEV4cHJlc3Npb24oKSwgbnVsbCwgImV4cHJlc3Npb24iLCBudWxsLCAwLCAxLCBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRQcmVmaXhFeHByZXNzaW9uRUNsYXNzLCBQVFByZWZpeEV4cHJlc3Npb24uY2xhc3MsICJQVFByZWZpeEV4cHJlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUUHJlZml4RXhwcmVzc2lvbl9PcGVyYXRvcigpLCB0aGlzLmdldFBUUHJlZml4T3BlcmF0b3IoKSwgIm9wZXJhdG9yIiwgbnVsbCwgMCwgMSwgUFRQcmVmaXhFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQVFByZWZpeEV4cHJlc3Npb25fRXhwcmVzc2lvbigpLCB0aGlzLmdldFBURXhwcmVzc2lvbigpLCBudWxsLCAiZXhwcmVzc2lvbiIsIG51bGwsIDAsIDEsIFBUUHJlZml4RXhwcmVzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0U3RyaW5nTGl0ZXJhbEVDbGFzcywgUFRTdHJpbmdMaXRlcmFsLmNsYXNzLCAiUFRTdHJpbmdMaXRlcmFsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVFN0cmluZ0xpdGVyYWxfRXNjYXBlZFZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlc2NhcGVkVmFsdWUiLCBudWxsLCAwLCAxLCBQVFN0cmluZ0xpdGVyYWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBUU3RyaW5nTGl0ZXJhbF9MaXRlcmFsVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxpdGVyYWxWYWx1ZSIsIG51bGwsIDAsIDEsIFBUU3RyaW5nTGl0ZXJhbC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRUaGlzTGl0ZXJhbEVDbGFzcywgUFRUaGlzTGl0ZXJhbC5jbGFzcywgIlBUVGhpc0xpdGVyYWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwdFR5cGVMaXRlcmFsRUNsYXNzLCBQVFR5cGVMaXRlcmFsLmNsYXNzLCAiUFRUeXBlTGl0ZXJhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UFRUeXBlTGl0ZXJhbF9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgUFRUeXBlTGl0ZXJhbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0SW52YWxpZEV4cHJlc3Npb25FQ2xhc3MsIFBUSW52YWxpZEV4cHJlc3Npb24uY2xhc3MsICJQVEludmFsaWRFeHByZXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVEludmFsaWRFeHByZXNzaW9uX01lc3NhZ2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1lc3NhZ2UiLCBudWxsLCAwLCAxLCBQVEludmFsaWRFeHByZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHRJbnN0YW5jZVJlZmVyZW5jZUVDbGFzcywgUFRJbnN0YW5jZVJlZmVyZW5jZS5jbGFzcywgIlBUSW5zdGFuY2VSZWZlcmVuY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBUSW5zdGFuY2VSZWZlcmVuY2VfUmVmZXJlbmNlKCksIHRoaXMuZ2V0SUphdmFJbnN0YW5jZSgpLCBudWxsLCAicmVmZXJlbmNlIiwgbnVsbCwgMSwgMSwgUFRJbnN0YW5jZVJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHB0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkVDbGFzcywgUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmNsYXNzLCAiUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25fRGVjbGFyYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlY2xhcmF0aW9uIiwgbnVsbCwgMCwgMSwgUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25fSW1wb3J0cygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW1wb3J0cyIsIG51bGwsIDAsIC0xLCBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0ocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5jbGFzcywgIlBUSW5maXhPcGVyYXRvciIpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5USU1FU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuRElWSURFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5SRU1BSU5ERVJfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLlBMVVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLk1JTlVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5MRUZUX1NISUZUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5SSUdIVF9TSElGVF9TSUdORURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLlJJR0hUX1NISUZUX1VOU0lHTkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5MRVNTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5HUkVBVEVSX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5MRVNTX0VRVUFMU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuR1JFQVRFUl9FUVVBTFNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkVRVUFMU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuTk9UX0VRVUFMU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0SW5maXhPcGVyYXRvckVFbnVtLCBQVEluZml4T3BlcmF0b3IuWE9SX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5BTkRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLk9SX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRJbmZpeE9wZXJhdG9yRUVudW0sIFBUSW5maXhPcGVyYXRvci5DT05ESVRJT05BTF9BTkRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdEluZml4T3BlcmF0b3JFRW51bSwgUFRJbmZpeE9wZXJhdG9yLkNPTkRJVElPTkFMX09SX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShwdFByZWZpeE9wZXJhdG9yRUVudW0sIFBUUHJlZml4T3BlcmF0b3IuY2xhc3MsICJQVFByZWZpeE9wZXJhdG9yIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChwdFByZWZpeE9wZXJhdG9yRUVudW0sIFBUUHJlZml4T3BlcmF0b3IuUExVU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0UHJlZml4T3BlcmF0b3JFRW51bSwgUFRQcmVmaXhPcGVyYXRvci5NSU5VU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHB0UHJlZml4T3BlcmF0b3JFRW51bSwgUFRQcmVmaXhPcGVyYXRvci5DT01QTEVNRU5UX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocHRQcmVmaXhPcGVyYXRvckVFbnVtLCBQVFByZWZpeE9wZXJhdG9yLk5PVF9MSVRFUkFMKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vSW5zdGFudGlhdGlvblBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0phdmFBbGxvY2F0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9KYXZhQWxsb2NhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5YjM5My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL0phdmFBbGxvY2F0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLSAKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkphdmFBbGxvY2F0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBBbGxvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUFsbG9jYXRpb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBKYXZhQWxsb2NhdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFBbGxvY2F0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhQWxsb2NhdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNlVHJlZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW1wbGljaXQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0gLy9KYXZhQWxsb2NhdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvTmFpdmVFeHByZXNzaW9uRmxhdHRlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL05haXZlRXhwcmVzc2lvbkZsYXR0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGUxMDQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvTmFpdmVFeHByZXNzaW9uRmxhdHRlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLSAKLS8qKgotICogVGhpcyBuYWl2ZWx5IGZsYXR0ZW5zIHRoZSBQYXJzZVRyZWUuIEl0IGp1c3Qgd29ya3Mgd2l0aCB3aGF0J3MgdGhlcmUuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgTmFpdmVFeHByZXNzaW9uRmxhdHRlbmVyIGV4dGVuZHMgUGFyc2VWaXNpdG9yIHsKLQkKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0J1ZmZlciBnZXRTdHJpbmdCdWZmZXIoKSB7Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyaW5nIHJlc3VsdCBvZiB0aGUgZmxhdHRlbmluZy4KLQkgKiBAcmV0dXJuIFRoZSBmbGF0dGVuZWQgc3RyaW5nLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJlc2V0IHRoZSByZXN1bHQgc28gdGhhdCBmbGF0dGVuZXIgY2FuIGJlIHVzZWQgYWdhaW4uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCWJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChub2RlLmdldERlY2xhcmF0aW9uKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3MpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRBcnJheUFjY2VzcyBub2RlKSB7Ci0JCW5vZGUuZ2V0QXJyYXkoKS5hY2NlcHQodGhpcyk7Ci0JCWlmICghbm9kZS5nZXRJbmRleGVzKCkuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGluZGV4ZXMgPSBub2RlLmdldEluZGV4ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhlcy5zaXplKCk7IGkrKykgewotCQkJCWJ1ZmZlci5hcHBlbmQoJ1snKTsKLQkJCQkoKFBURXhwcmVzc2lvbikgaW5kZXhlcy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJCQlidWZmZXIuYXBwZW5kKCddJyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlDcmVhdGlvbiBub2RlKSB7Ci0gICAgICAgIFN0cmluZyBhcnJheVR5cGUgPSBub2RlLmdldFR5cGUoKTsKLSAgICAgICAgaW50IG9iID0gYXJyYXlUeXBlLmluZGV4T2YoJ1snKTsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBoYW5kbGVRdWFsaWZpZWROYW1lKGFycmF5VHlwZS5zdWJzdHJpbmcoMCwgb2IpKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZCgibmV3ICIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGJ1ZmZlci5hcHBlbmQodHlwZSk7Ci0gICAgICAgIGludCByZWFsZGltcyA9IDA7Ci0gICAgICAgIHdoaWxlIChvYiAhPSAtMSkgewotICAgICAgICAgICAgICAgIHJlYWxkaW1zKys7Ci0gICAgICAgICAgICAgICAgb2IgPSBhcnJheVR5cGUuaW5kZXhPZignWycsb2IrMSk7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdCBkaW1zID0gbm9kZS5nZXREaW1lbnNpb25zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGltcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJ1snKTsKLSAgICAgICAgICAgICAgICAoKFBURXhwcmVzc2lvbikgZGltcy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCddJyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaT1kaW1zLnNpemUoKTsgaSA8IHJlYWxkaW1zOyBpKyspIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJbXSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBpZiAobm9kZS5nZXRJbml0aWFsaXplcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCcgJyk7Ci0gICAgICAgICAgICAgICAgKChQVEV4cHJlc3Npb24pIG5vZGUuZ2V0SW5pdGlhbGl6ZXIoKSkuYWNjZXB0KHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUluaXRpYWxpemVyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoJ3snKTsKLQkJTGlzdCBleHAgPSBub2RlLmdldEV4cHJlc3Npb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwLnNpemUoKTsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKQotCQkJCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCSgoUFRFeHByZXNzaW9uKSBleHAuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgnfScpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRCb29sZWFuTGl0ZXJhbCBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5pc0Jvb2xlYW5WYWx1ZSgpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDYXN0RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJYnVmZmVyLmFwcGVuZChoYW5kbGVRdWFsaWZpZWROYW1lKG5vZGUuZ2V0VHlwZSgpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIikgIik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVENoYXJhY3RlckxpdGVyYWwgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKG5vZGUuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZCgibmV3ICIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoaGFuZGxlUXVhbGlmaWVkTmFtZShub2RlLmdldFR5cGUoKSkpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCUxpc3QgYXJncyA9IG5vZGUuZ2V0QXJndW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewotCQkJaWYgKGkgIT0gMCkKLQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkoKFBURXhwcmVzc2lvbikgYXJncy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRDb25kaXRpb25hbEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewotCQlub2RlLmdldENvbmRpdGlvbigpLmFjY2VwdCh0aGlzKTsKLQkJYnVmZmVyLmFwcGVuZCgiID8gIik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZS5nZXRUcnVlKCkuYWNjZXB0KHRoaXMpOwotCQlidWZmZXIuYXBwZW5kKCIgOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlLmdldEZhbHNlKCkuYWNjZXB0KHRoaXMpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURmllbGRBY2Nlc3MpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCW5vZGUuZ2V0UmVjZWl2ZXIoKS5hY2NlcHQodGhpcyk7Ci0JCWJ1ZmZlci5hcHBlbmQoJy4nKTsKLQkJYnVmZmVyLmFwcGVuZChub2RlLmdldEZpZWxkKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJbm9kZS5nZXRMZWZ0T3BlcmFuZCgpLmFjY2VwdCh0aGlzKTsKLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlTdHJpbmcgb3BlciA9IG5vZGUuZ2V0T3BlcmF0b3IoKS5nZXRPcGVyYXRvcigpOwotCQlidWZmZXIuYXBwZW5kKG9wZXIpOwotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCW5vZGUuZ2V0UmlnaHRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOwotCQlMaXN0IGV4dCA9IG5vZGUuZ2V0RXh0ZW5kZWRPcGVyYW5kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dC5zaXplKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJYnVmZmVyLmFwcGVuZChvcGVyKTsKLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCSgoUFRFeHByZXNzaW9uKSBleHQuZ2V0KGkpKS5hY2NlcHQodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlb2YpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRJbnN0YW5jZW9mIG5vZGUpIHsKLQkJbm9kZS5nZXRPcGVyYW5kKCkuYWNjZXB0KHRoaXMpOwotCQlidWZmZXIuYXBwZW5kKCIgaW5zdGFuY2VvZiAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGhhbmRsZVF1YWxpZmllZE5hbWUobm9kZS5nZXRUeXBlKCkpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEludmFsaWRFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUSW52YWxpZEV4cHJlc3Npb24gbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEluc3RhbnRpYXRpb25JbXBsTWVzc2FnZXMuTmFpdmVFeHByZXNzaW9uRmxhdHRlbmVyX0ludmFsaWRFeHByZXNzaW9uLCBuZXcgT2JqZWN0W117bm9kZS5nZXRNZXNzYWdlKCl9KSk7IAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQlpZiAobm9kZS5nZXRSZWNlaXZlcigpICE9IG51bGwpIHsKLQkJCW5vZGUuZ2V0UmVjZWl2ZXIoKS5hY2NlcHQodGhpcyk7Ci0JCQlidWZmZXIuYXBwZW5kKCcuJyk7Ci0JCX0KLQkJCi0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXROYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCUxpc3QgYXJncyA9IG5vZGUuZ2V0QXJndW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewotCQkJaWYgKGkgIT0gMCkKLQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkoKFBURXhwcmVzc2lvbikgYXJncy5nZXQoaSkpLmFjY2VwdCh0aGlzKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBmYWxzZTsJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTmFtZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVE5hbWUgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKGhhbmRsZVF1YWxpZmllZE5hbWUobm9kZS5nZXROYW1lKCkpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bGxMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUTnVsbExpdGVyYWwgbm9kZSkgewotCQlidWZmZXIuYXBwZW5kKCJudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVE51bWJlckxpdGVyYWwpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFROdW1iZXJMaXRlcmFsIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChub2RlLmdldFRva2VuKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yI3Zpc2l0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoJygnKTsKLQkJbm9kZS5nZXRFeHByZXNzaW9uKCkuYWNjZXB0KHRoaXMpOwotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRQcmVmaXhFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXRPcGVyYXRvcigpLmdldE9wZXJhdG9yKCkpOwotCQlub2RlLmdldEV4cHJlc3Npb24oKS5hY2NlcHQodGhpcyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRTdHJpbmdMaXRlcmFsKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBUU3RyaW5nTGl0ZXJhbCBub2RlKSB7Ci0JCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXRFc2NhcGVkVmFsdWUoKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUaGlzTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFRoaXNMaXRlcmFsIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZCgidGhpcyIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQVFR5cGVMaXRlcmFsIG5vZGUpIHsKLQkJYnVmZmVyLmFwcGVuZChoYW5kbGVRdWFsaWZpZWROYW1lKG5vZGUuZ2V0VHlwZSgpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZW5hYmxlcyBvbmUgdG8gb3ZlcmlkZSB0aGUgaGFuZGxpbmcgb2YgcXVhbGlmaWVkIG5hbWVzLgotCSAqIFRoZSBkZWZhdWx0IG9wZXJhdGlvbiBpcyB0byBkbyBub3RoaW5nLgotCSAqIAotCSAqIE92ZXJyaWRlcnMgbWF5IGNob29zZSB0byB1c2Ugc2hvcnQgbmFtZXMsIHJlbHlpbmcgb24gaW1wb3J0IHN0YXRlbWVudCBoYW5kbGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcU5hbWUgIAotCSAqIEByZXR1cm4gTmFtZSB0byB1c2UgZm9yIHRoZSBmbGF0dGVuZWQgcmVzdWx0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBoYW5kbGVRdWFsaWZpZWROYW1lKFN0cmluZyBxTmFtZSkgewotCQlyZXR1cm4gcU5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzlkOGM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBUIEFub255bW91cyBDbGFzcyBEZWNsYXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsI2dldERlY2xhcmF0aW9uIDxlbT5EZWNsYXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsI2dldEltcG9ydHMgPGVtPkltcG9ydHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb25JbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlY2xhcmF0aW9uKCkgPGVtPkRlY2xhcmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWNsYXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDTEFSQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVjbGFyYXRpb24oKSA8ZW0+RGVjbGFyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlY2xhcmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY2xhcmF0aW9uID0gREVDTEFSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBvcnRzKCkgPGVtPkltcG9ydHM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wb3J0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGltcG9ydHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlY2xhcmF0aW9uKFN0cmluZyBuZXdEZWNsYXJhdGlvbikgewotCQlTdHJpbmcgb2xkRGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKLQkJZGVjbGFyYXRpb24gPSBuZXdEZWNsYXJhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19ERUNMQVJBVElPTiwgb2xkRGVjbGFyYXRpb24sIGRlY2xhcmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEltcG9ydHMoKSB7Ci0JCWlmIChpbXBvcnRzID09IG51bGwpIHsKLQkJCWltcG9ydHMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0lNUE9SVFMpOwotCQl9Ci0JCXJldHVybiBpbXBvcnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19ERUNMQVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVjbGFyYXRpb24oKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19JTVBPUlRTOgotCQkJCXJldHVybiBnZXRJbXBvcnRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0RFQ0xBUkFUSU9OOgotCQkJCXNldERlY2xhcmF0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19JTVBPUlRTOgotCQkJCWdldEltcG9ydHMoKS5jbGVhcigpOwotCQkJCWdldEltcG9ydHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FOT05ZTU9VU19DTEFTU19ERUNMQVJBVElPTl9fREVDTEFSQVRJT046Ci0JCQkJc2V0RGVjbGFyYXRpb24oREVDTEFSQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OX19JTVBPUlRTOgotCQkJCWdldEltcG9ydHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0RFQ0xBUkFUSU9OOgotCQkJCXJldHVybiBERUNMQVJBVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVjbGFyYXRpb24gIT0gbnVsbCA6ICFERUNMQVJBVElPTl9FREVGQVVMVC5lcXVhbHMoZGVjbGFyYXRpb24pOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BTk9OWU1PVVNfQ0xBU1NfREVDTEFSQVRJT05fX0lNUE9SVFM6Ci0JCQkJcmV0dXJuIGltcG9ydHMgIT0gbnVsbCAmJiAhaW1wb3J0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZWNsYXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVjbGFyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGltcG9ydHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGltcG9ydHMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCi19IC8vUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5QWNjZXNzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5QWNjZXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGIwYzc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUFjY2Vzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJyYXkgQWNjZXNzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlBY2Nlc3NJbXBsI2dldEFycmF5IDxlbT5BcnJheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5QWNjZXNzSW1wbCNnZXRJbmRleGVzIDxlbT5JbmRleGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRBcnJheUFjY2Vzc0ltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRBcnJheUFjY2VzcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJyYXkoKSA8ZW0+QXJyYXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFycmF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGFycmF5ID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluZGV4ZXMoKSA8ZW0+SW5kZXhlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbmRleGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5kZXhlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRBcnJheUFjY2Vzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRBcnJheUFjY2VzcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0QXJyYXkoKSB7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBcnJheShQVEV4cHJlc3Npb24gbmV3QXJyYXksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZEFycmF5ID0gYXJyYXk7Ci0JCWFycmF5ID0gbmV3QXJyYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVksIG9sZEFycmF5LCBuZXdBcnJheSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXJyYXkoUFRFeHByZXNzaW9uIG5ld0FycmF5KSB7Ci0JCWlmIChuZXdBcnJheSAhPSBhcnJheSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXJyYXkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYXJyYXkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBcnJheSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBcnJheSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QXJyYXkobmV3QXJyYXksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWSwgbmV3QXJyYXksIG5ld0FycmF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEluZGV4ZXMoKSB7Ci0JCWlmIChpbmRleGVzID09IG51bGwpIHsKLQkJCWluZGV4ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUFRFeHByZXNzaW9uLmNsYXNzLCB0aGlzLCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0lOREVYRVMpOwotCQl9Ci0JCXJldHVybiBpbmRleGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWToKLQkJCQkJcmV0dXJuIGJhc2ljU2V0QXJyYXkobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0lOREVYRVM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5kZXhlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVk6Ci0JCQkJcmV0dXJuIGdldEFycmF5KCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUzoKLQkJCQlyZXR1cm4gZ2V0SW5kZXhlcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQUNDRVNTX19BUlJBWToKLQkJCQlzZXRBcnJheSgoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUzoKLQkJCQlnZXRJbmRleGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmRleGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0FSUkFZOgotCQkJCXNldEFycmF5KChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9BQ0NFU1NfX0lOREVYRVM6Ci0JCQkJZ2V0SW5kZXhlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fQVJSQVk6Ci0JCQkJcmV0dXJuIGFycmF5ICE9IG51bGw7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0FDQ0VTU19fSU5ERVhFUzoKLQkJCQlyZXR1cm4gaW5kZXhlcyAhPSBudWxsICYmICFpbmRleGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRBcnJheSgpKTsKLQkJCWlmIChpbmRleGVzICE9IG51bGwpCi0JCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgaW5kZXhlcyk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9CQotCi19IC8vQXJyYXlBY2Nlc3NJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQXJyYXlDcmVhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUNyZWF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmE4YjNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUNyZWF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRBcnJheUNyZWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnJheSBDcmVhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEFycmF5Q3JlYXRpb25JbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUNyZWF0aW9uSW1wbCNnZXREaW1lbnNpb25zIDxlbT5EaW1lbnNpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQXJyYXlDcmVhdGlvbkltcGwjZ2V0SW5pdGlhbGl6ZXIgPGVtPkluaXRpYWxpemVyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRBcnJheUNyZWF0aW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEFycmF5Q3JlYXRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGltZW5zaW9ucygpIDxlbT5EaW1lbnNpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpbWVuc2lvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaW1lbnNpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxpemVyKCkgPGVtPkluaXRpYWxpemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0aWFsaXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBUQXJyYXlJbml0aWFsaXplciBpbml0aWFsaXplciA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRBcnJheUNyZWF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEFycmF5Q3JlYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGltZW5zaW9ucygpIHsKLQkJaWYgKGRpbWVuc2lvbnMgPT0gbnVsbCkgewotCQkJZGltZW5zaW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQVEV4cHJlc3Npb24uY2xhc3MsIHRoaXMsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19ESU1FTlNJT05TKTsKLQkJfQotCQlyZXR1cm4gZGltZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRBcnJheUluaXRpYWxpemVyIGdldEluaXRpYWxpemVyKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5pdGlhbGl6ZXIoUFRBcnJheUluaXRpYWxpemVyIG5ld0luaXRpYWxpemVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBUQXJyYXlJbml0aWFsaXplciBvbGRJbml0aWFsaXplciA9IGluaXRpYWxpemVyOwotCQlpbml0aWFsaXplciA9IG5ld0luaXRpYWxpemVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVIsIG9sZEluaXRpYWxpemVyLCBuZXdJbml0aWFsaXplcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6ZXIoUFRBcnJheUluaXRpYWxpemVyIG5ld0luaXRpYWxpemVyKSB7Ci0JCWlmIChuZXdJbml0aWFsaXplciAhPSBpbml0aWFsaXplcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5pdGlhbGl6ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0luaXRpYWxpemVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luaXRpYWxpemVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0lOSVRJQUxJWkVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEluaXRpYWxpemVyKG5ld0luaXRpYWxpemVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUiwgbmV3SW5pdGlhbGl6ZXIsIG5ld0luaXRpYWxpemVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fRElNRU5TSU9OUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaW1lbnNpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0SW5pdGlhbGl6ZXIobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19ESU1FTlNJT05TOgotCQkJCXJldHVybiBnZXREaW1lbnNpb25zKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUjoKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fRElNRU5TSU9OUzoKLQkJCQlnZXREaW1lbnNpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREaW1lbnNpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUjoKLQkJCQlzZXRJbml0aWFsaXplcigoUFRBcnJheUluaXRpYWxpemVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlM6Ci0JCQkJZ2V0RGltZW5zaW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9BUlJBWV9DUkVBVElPTl9fSU5JVElBTElaRVI6Ci0JCQkJc2V0SW5pdGlhbGl6ZXIoKFBUQXJyYXlJbml0aWFsaXplciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfQ1JFQVRJT05fX0RJTUVOU0lPTlM6Ci0JCQkJcmV0dXJuIGRpbWVuc2lvbnMgIT0gbnVsbCAmJiAhZGltZW5zaW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0NSRUFUSU9OX19JTklUSUFMSVpFUjoKLQkJCQlyZXR1cm4gaW5pdGlhbGl6ZXIgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgZGltZW5zaW9ucyk7Ci0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRJbml0aWFsaXplcigpKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0JCi19IC8vQXJyYXlDcmVhdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRBcnJheUluaXRpYWxpemVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5SW5pdGlhbGl6ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZWJhOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEFycmF5SW5pdGlhbGl6ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJyYXkgSW5pdGlhbGl6ZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRBcnJheUluaXRpYWxpemVySW1wbCNnZXRFeHByZXNzaW9ucyA8ZW0+RXhwcmVzc2lvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEFycmF5SW5pdGlhbGl6ZXJJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUQXJyYXlJbml0aWFsaXplciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhwcmVzc2lvbnMoKSA8ZW0+RXhwcmVzc2lvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHByZXNzaW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRBcnJheUluaXRpYWxpemVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEFycmF5SW5pdGlhbGl6ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXhwcmVzc2lvbnMoKSB7Ci0JCWlmIChleHByZXNzaW9ucyA9PSBudWxsKSB7Ci0JCQlleHByZXNzaW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQVEV4cHJlc3Npb24uY2xhc3MsIHRoaXMsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0FSUkFZX0lOSVRJQUxJWkVSX19FWFBSRVNTSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEV4cHJlc3Npb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TOgotCQkJCXJldHVybiBnZXRFeHByZXNzaW9ucygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TOgotCQkJCWdldEV4cHJlc3Npb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFeHByZXNzaW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TOgotCQkJCWdldEV4cHJlc3Npb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQVJSQVlfSU5JVElBTElaRVJfX0VYUFJFU1NJT05TOgotCQkJCXJldHVybiBleHByZXNzaW9ucyAhPSBudWxsICYmICFleHByZXNzaW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJYWNjZXB0Q2hpbGRyZW4odmlzaXRvciwgZXhwcmVzc2lvbnMpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotfSAvL0FycmF5SW5pdGlhbGl6ZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQm9vbGVhbkxpdGVyYWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQm9vbGVhbkxpdGVyYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZjNkY2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEJvb2xlYW5MaXRlcmFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Cb29sZWFuIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRCb29sZWFuTGl0ZXJhbEltcGwjaXNCb29sZWFuVmFsdWUgPGVtPkJvb2xlYW4gVmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVEJvb2xlYW5MaXRlcmFsSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEJvb2xlYW5MaXRlcmFsIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNCb29sZWFuVmFsdWUoKSA8ZW0+Qm9vbGVhbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNCb29sZWFuVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBCT09MRUFOX1ZBTFVFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Jvb2xlYW5WYWx1ZSgpIDxlbT5Cb29sZWFuIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Jvb2xlYW5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQk9PTEVBTl9WQUxVRV9FRkxBRyA9IDEgPDwgODsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEJvb2xlYW5MaXRlcmFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVEJvb2xlYW5MaXRlcmFsKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCb29sZWFuVmFsdWUoKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgQk9PTEVBTl9WQUxVRV9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb29sZWFuVmFsdWUoYm9vbGVhbiBuZXdCb29sZWFuVmFsdWUpIHsKLQkJYm9vbGVhbiBvbGRCb29sZWFuVmFsdWUgPSAoZUZsYWdzICYgQk9PTEVBTl9WQUxVRV9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0Jvb2xlYW5WYWx1ZSkgZUZsYWdzIHw9IEJPT0xFQU5fVkFMVUVfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5CT09MRUFOX1ZBTFVFX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9CT09MRUFOX0xJVEVSQUxfX0JPT0xFQU5fVkFMVUUsIG9sZEJvb2xlYW5WYWx1ZSwgbmV3Qm9vbGVhblZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9CT09MRUFOX0xJVEVSQUxfX0JPT0xFQU5fVkFMVUU6Ci0JCQkJcmV0dXJuIGlzQm9vbGVhblZhbHVlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQk9PTEVBTl9MSVRFUkFMX19CT09MRUFOX1ZBTFVFOgotCQkJCXNldEJvb2xlYW5WYWx1ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9CT09MRUFOX0xJVEVSQUxfX0JPT0xFQU5fVkFMVUU6Ci0JCQkJc2V0Qm9vbGVhblZhbHVlKEJPT0xFQU5fVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9CT09MRUFOX0xJVEVSQUxfX0JPT0xFQU5fVkFMVUU6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQk9PTEVBTl9WQUxVRV9FRkxBRykgIT0gMCkgIT0gQk9PTEVBTl9WQUxVRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQotfSAvL0Jvb2xlYW5MaXRlcmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENhc3RFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENhc3RFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTEzNGJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDYXN0RXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2FzdEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENhc3RFeHByZXNzaW9uSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2FzdEV4cHJlc3Npb25JbXBsI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVENhc3RFeHByZXNzaW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVENhc3RFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4cHJlc3Npb24oKSA8ZW0+RXhwcmVzc2lvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBleHByZXNzaW9uID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVENhc3RFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVENhc3RFeHByZXNzaW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0JCWV4cHJlc3Npb24gPSBuZXdFeHByZXNzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG9sZEV4cHJlc3Npb24sIG5ld0V4cHJlc3Npb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIG5ld0V4cHJlc3Npb24pIHsKLQkJaWYgKG5ld0V4cHJlc3Npb24gIT0gZXhwcmVzc2lvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClleHByZXNzaW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdFeHByZXNzaW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0V4cHJlc3Npb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RXhwcmVzc2lvbihuZXdFeHByZXNzaW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbmV3RXhwcmVzc2lvbiwgbmV3RXhwcmVzc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRFeHByZXNzaW9uKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXJldHVybiBnZXRFeHByZXNzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DQVNUX0VYUFJFU1NJT05fX1RZUEU6Ci0JCQkJc2V0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlzZXRFeHByZXNzaW9uKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXNldEV4cHJlc3Npb24oKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0FTVF9FWFBSRVNTSU9OX19UWVBFOgotCQkJCXJldHVybiBUWVBFX0VERUZBVUxUID09IG51bGwgPyB0eXBlICE9IG51bGwgOiAhVFlQRV9FREVGQVVMVC5lcXVhbHModHlwZSk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NBU1RfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlyZXR1cm4gZXhwcmVzc2lvbiAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRFeHByZXNzaW9uKCkpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotfSAvL0Nhc3RJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2hhcmFjdGVyTGl0ZXJhbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2ExZDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ2hhcmFjdGVyTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJhY3RlciBMaXRlcmFsPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwjZ2V0RXNjYXBlZFZhbHVlIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ2hhcmFjdGVyTGl0ZXJhbEltcGwjZ2V0Q2hhclZhbHVlIDxlbT5DaGFyIFZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVENoYXJhY3RlckxpdGVyYWwgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc2NhcGVkVmFsdWUoKSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXNjYXBlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzY2FwZWRWYWx1ZSgpIDxlbT5Fc2NhcGVkIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc2NhcGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXNjYXBlZFZhbHVlID0gRVNDQVBFRF9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFyVmFsdWUoKSA8ZW0+Q2hhciBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhclZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgQ0hBUl9WQUxVRV9FREVGQVVMVCA9ICdcdTAwMDAnOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhclZhbHVlKCkgPGVtPkNoYXIgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYXJWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGNoYXIgY2hhclZhbHVlID0gQ0hBUl9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVENoYXJhY3RlckxpdGVyYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUQ2hhcmFjdGVyTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXNjYXBlZFZhbHVlKCkgewotCQlyZXR1cm4gZXNjYXBlZFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVzY2FwZWRWYWx1ZShTdHJpbmcgbmV3RXNjYXBlZFZhbHVlKSB7Ci0JCWNoYXJWYWx1ZVNldCA9IGZhbHNlOwotCQlzZXRDaGFyVmFsdWVHZW4oQ0hBUl9WQUxVRV9FREVGQVVMVCk7Ci0JCXNldEVzY2FwZWRWYWx1ZUdlbihuZXdFc2NhcGVkVmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFc2NhcGVkVmFsdWVHZW4oU3RyaW5nIG5ld0VzY2FwZWRWYWx1ZSkgewotCQlTdHJpbmcgb2xkRXNjYXBlZFZhbHVlID0gZXNjYXBlZFZhbHVlOwotCQllc2NhcGVkVmFsdWUgPSBuZXdFc2NhcGVkVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMX19FU0NBUEVEX1ZBTFVFLCBvbGRFc2NhcGVkVmFsdWUsIGVzY2FwZWRWYWx1ZSkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGFyVmFsdWVTZXQ7Ci0JCi0JcHVibGljIGNoYXIgZ2V0Q2hhclZhbHVlKCkgewotCQlpZiAoIWNoYXJWYWx1ZVNldCAmJiBlc2NhcGVkVmFsdWUgIT0gRVNDQVBFRF9WQUxVRV9FREVGQVVMVCkgewotCQkJU3RyaW5nIHMgPSBnZXRFc2NhcGVkVmFsdWUoKTsKLQkJCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA8IDIgfHwgcy5jaGFyQXQoMCkgIT0gJ1wnJyB8fCBzLmNoYXJBdChsZW4tMSkgIT0gJ1wnJyApIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQljaGFyIGMgPSBzLmNoYXJBdCgxKTsKLQkJCWlmIChjID09ICdcJycpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoYyA9PSAnXFwnKSB7Ci0JCQkJaWYgKGxlbiA9PSA0KSB7Ci0JCQkJCXNldENoYXJWYWx1ZUdlbihnZXRDaGFyRXNjYXBlZChzLmNoYXJBdCgyKSkpOwotCQkJCX0gZWxzZSBpZiAobGVuID09IDgpIHsKLQkJCQkJLy9oYW5kbGUgdGhlIGNhc2Ugb2YgdW5pY29kZS4KLQkJCQkJaW50IGN1cnJlbnRQb3NpdGlvbiA9IDI7Ci0JCQkJCWludCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwLCBjNCA9IDA7Ci0JCQkJCWlmIChzLmNoYXJBdChjdXJyZW50UG9zaXRpb24rKykgPT0gJ3UnKSB7Ci0JCQkJCQlpZiAoKGMxID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdChjdXJyZW50UG9zaXRpb24rKykpKSA+IDE1Ci0JCQkJCQkJCXx8IGMxIDwgMAotCQkJCQkJCQl8fCAoYzIgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KGN1cnJlbnRQb3NpdGlvbisrKSkpID4gMTUKLQkJCQkJCQkJfHwgYzIgPCAwCi0JCQkJCQkJCXx8IChjMyA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoY3VycmVudFBvc2l0aW9uKyspKSkgPiAxNQotCQkJCQkJCQl8fCBjMyA8IDAKLQkJCQkJCQkJfHwgKGM0ID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdChjdXJyZW50UG9zaXRpb24rKykpKSA+IDE1Ci0JCQkJCQkJCXx8IGM0IDwgMCl7Ci0JCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBjaGFyYWN0ZXIgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc2V0Q2hhclZhbHVlR2VuKChjaGFyKSAoKChjMSAqIDE2ICsgYzIpICogMTYgKyBjMykgKiAxNiArIGM0KSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIGNoYXJhY3RlciBsaXRlcmFsIik7Ly8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBjaGFyYWN0ZXIgbGl0ZXJhbCIpOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQlzZXRDaGFyVmFsdWVHZW4oYyk7Ci0JCQkKLQkJCWNoYXJWYWx1ZVNldCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGdldENoYXJWYWx1ZUdlbigpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNoYXIgZ2V0Q2hhckVzY2FwZWQoY2hhciBuZXh0Q2hhcikgewotCQlzd2l0Y2gobmV4dENoYXIpIHsKLQkJCWNhc2UgJ2InIDoKLQkJCQlyZXR1cm4gJ1xiJzsKLQkJCWNhc2UgJ3QnIDoKLQkJCQlyZXR1cm4gJ1x0JzsKLQkJCWNhc2UgJ24nIDoKLQkJCQlyZXR1cm4gJ1xuJzsKLQkJCWNhc2UgJ2YnIDoKLQkJCQlyZXR1cm4gJ1xmJzsKLQkJCWNhc2UgJ3InIDoKLQkJCQlyZXR1cm4gJ1xyJzsKLQkJCWNhc2UgJ1wiJzoKLQkJCQlyZXR1cm4gJ1wiJzsKLQkJCWNhc2UgJ1wnJzoKLQkJCQlyZXR1cm4gJ1wnJzsKLQkJCWNhc2UgJ1xcJzoKLQkJCQlyZXR1cm4gJ1xcJzsKLQkJCWNhc2UgJzAnIDoKLQkJCQlyZXR1cm4gJ1wwJzsKLQkJCWNhc2UgJzEnIDoKLQkJCQlyZXR1cm4gJ1wxJzsKLQkJCWNhc2UgJzInIDoKLQkJCQlyZXR1cm4gJ1wyJzsKLQkJCWNhc2UgJzMnIDoKLQkJCQlyZXR1cm4gJ1wzJzsKLQkJCWNhc2UgJzQnIDoKLQkJCQlyZXR1cm4gJ1w0JzsKLQkJCWNhc2UgJzUnIDoKLQkJCQlyZXR1cm4gJ1w1JzsKLQkJCWNhc2UgJzYnIDoKLQkJCQlyZXR1cm4gJ1w2JzsKLQkJCWNhc2UgJzcnIDoKLQkJCQlyZXR1cm4gJ1w3JzsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWxsZWdhbCBjaGFyYWN0ZXIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRDaGFyVmFsdWVHZW4oKSB7Ci0JCXJldHVybiBjaGFyVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hhclZhbHVlKGNoYXIgbmV3Q2hhclZhbHVlKSB7CQkKLQkJY2hhclZhbHVlU2V0ID0gdHJ1ZTsKLQkJc2V0Q2hhclZhbHVlR2VuKG5ld0NoYXJWYWx1ZSk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoOCk7Ci0JCWIuYXBwZW5kKCdcJycpOyAvLyBvcGVuaW5nIGRlbGltaXRlcgotCQlhcHBlbmRDaGFyYWN0ZXIobmV3Q2hhclZhbHVlLCBiKTsKLQkJYi5hcHBlbmQoJ1wnJyk7IC8vIGNsb3NpbmcgZGVsaW1pdGVyCi0JCXNldEVzY2FwZWRWYWx1ZUdlbihiLnRvU3RyaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kQ2hhcmFjdGVyKGNoYXIgY2hhcmFjdGVyLCBTdHJpbmdCdWZmZXIgYikgewotCQlzd2l0Y2goY2hhcmFjdGVyKSB7Ci0JCQljYXNlICdcYicgOgotCQkJCWIuYXBwZW5kKCJcXGIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHQnIDoKLQkJCQliLmFwcGVuZCgiXFx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xuJyA6Ci0JCQkJYi5hcHBlbmQoIlxcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcZicgOgotCQkJCWIuYXBwZW5kKCJcXGYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHInIDoKLQkJCQliLmFwcGVuZCgiXFxyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wiJzoKLQkJCQliLmFwcGVuZCgiXFxcIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcJyc6Ci0JCQkJYi5hcHBlbmQoIlxcXCciKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXFwnOgotCQkJCWIuYXBwZW5kKCJcXFxcIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wwJyA6Ci0JCQkJYi5hcHBlbmQoIlxcMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcMScgOgotCQkJCWIuYXBwZW5kKCJcXDEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDInIDoKLQkJCQliLmFwcGVuZCgiXFwyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wzJyA6Ci0JCQkJYi5hcHBlbmQoIlxcMyIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcNCcgOgotCQkJCWIuYXBwZW5kKCJcXDQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAnXDUnIDoKLQkJCQliLmFwcGVuZCgiXFw1Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1w2JyA6Ci0JCQkJYi5hcHBlbmQoIlxcNiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlICdcNycgOgotCQkJCWIuYXBwZW5kKCJcXDciKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwkJCQotCQkJZGVmYXVsdDoKLQkJCQliLmFwcGVuZChjaGFyYWN0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhclZhbHVlR2VuKGNoYXIgbmV3Q2hhclZhbHVlKSB7Ci0JCWNoYXIgb2xkQ2hhclZhbHVlID0gY2hhclZhbHVlOwotCQljaGFyVmFsdWUgPSBuZXdDaGFyVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMX19DSEFSX1ZBTFVFLCBvbGRDaGFyVmFsdWUsIGNoYXJWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0hBUkFDVEVSX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldEVzY2FwZWRWYWx1ZSgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fQ0hBUl9WQUxVRToKLQkJCQlyZXR1cm4gbmV3IENoYXJhY3RlcihnZXRDaGFyVmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlzZXRFc2NhcGVkVmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fQ0hBUl9WQUxVRToKLQkJCQlzZXRDaGFyVmFsdWUoKChDaGFyYWN0ZXIpbmV3VmFsdWUpLmNoYXJWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fRVNDQVBFRF9WQUxVRToKLQkJCQlzZXRFc2NhcGVkVmFsdWUoRVNDQVBFRF9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fQ0hBUl9WQUxVRToKLQkJCQlzZXRDaGFyVmFsdWUoQ0hBUl9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NIQVJBQ1RFUl9MSVRFUkFMX19FU0NBUEVEX1ZBTFVFOgotCQkJCXJldHVybiBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBlc2NhcGVkVmFsdWUgIT0gbnVsbCA6ICFFU0NBUEVEX1ZBTFVFX0VERUZBVUxULmVxdWFscyhlc2NhcGVkVmFsdWUpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DSEFSQUNURVJfTElURVJBTF9fQ0hBUl9WQUxVRToKLQkJCQlyZXR1cm4gY2hhclZhbHVlICE9IENIQVJfVkFMVUVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci19IC8vQ2hhcmFjdGVyTGl0ZXJhbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDdkNGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDbGFzc0luc3RhbmNlQ3JlYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DbGFzcyBJbnN0YW5jZSBDcmVhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwjZ2V0QXJndW1lbnRzIDxlbT5Bcmd1bWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVENsYXNzSW5zdGFuY2VDcmVhdGlvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJndW1lbnRzKCkgPGVtPkFyZ3VtZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcmd1bWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhcmd1bWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVENsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBcmd1bWVudHMoKSB7Ci0JCWlmIChhcmd1bWVudHMgPT0gbnVsbCkgewotCQkJYXJndW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBURXhwcmVzc2lvbi5jbGFzcywgdGhpcywgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGFyZ3VtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19BUkdVTUVOVFM6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QXJndW1lbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlyZXR1cm4gZ2V0QXJndW1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DTEFTU19JTlNUQU5DRV9DUkVBVElPTl9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlnZXRBcmd1bWVudHMoKS5jbGVhcigpOwotCQkJCWdldEFyZ3VtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NMQVNTX0lOU1RBTkNFX0NSRUFUSU9OX19BUkdVTUVOVFM6Ci0JCQkJZ2V0QXJndW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ0xBU1NfSU5TVEFOQ0VfQ1JFQVRJT05fX0FSR1VNRU5UUzoKLQkJCQlyZXR1cm4gYXJndW1lbnRzICE9IG51bGwgJiYgIWFyZ3VtZW50cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkcmVuKHZpc2l0b3IsIGFyZ3VtZW50cyk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci19IC8vQ2xhc3NJbnN0YW5jZUNyZWF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MzMxODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmRpdGlvbmFsIEV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRDb25kaXRpb25hbEV4cHJlc3Npb25JbXBsI2dldENvbmRpdGlvbiA8ZW0+Q29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbCNnZXRUcnVlIDxlbT5UcnVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbCNnZXRGYWxzZSA8ZW0+RmFsc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVENvbmRpdGlvbmFsRXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRDb25kaXRpb25hbEV4cHJlc3Npb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmRpdGlvbigpIDxlbT5Db25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBjb25kaXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJ1ZSgpIDxlbT5UcnVlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcnVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIHRydWVfID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZhbHNlKCkgPGVtPkZhbHNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGYWxzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBmYWxzZV8gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUQ29uZGl0aW9uYWxFeHByZXNzaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0Q29uZGl0aW9uKCkgewotCQlyZXR1cm4gY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbmRpdGlvbihQVEV4cHJlc3Npb24gbmV3Q29uZGl0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRDb25kaXRpb24gPSBjb25kaXRpb247Ci0JCWNvbmRpdGlvbiA9IG5ld0NvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OLCBvbGRDb25kaXRpb24sIG5ld0NvbmRpdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZGl0aW9uKFBURXhwcmVzc2lvbiBuZXdDb25kaXRpb24pIHsKLQkJaWYgKG5ld0NvbmRpdGlvbiAhPSBjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb25kaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29uZGl0aW9uKG5ld0NvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT04sIG5ld0NvbmRpdGlvbiwgbmV3Q29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRUcnVlKCkgewotCQlyZXR1cm4gdHJ1ZV87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VHJ1ZShQVEV4cHJlc3Npb24gbmV3VHJ1ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkVHJ1ZSA9IHRydWVfOwotCQl0cnVlXyA9IG5ld1RydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUUsIG9sZFRydWUsIG5ld1RydWUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRydWUoUFRFeHByZXNzaW9uIG5ld1RydWUpIHsKLQkJaWYgKG5ld1RydWUgIT0gdHJ1ZV8pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRydWVfICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXRydWVfKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VHJ1ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUcnVlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUcnVlKG5ld1RydWUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRSwgbmV3VHJ1ZSwgbmV3VHJ1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0RmFsc2UoKSB7Ci0JCXJldHVybiBmYWxzZV87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RmFsc2UoUFRFeHByZXNzaW9uIG5ld0ZhbHNlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRGYWxzZSA9IGZhbHNlXzsKLQkJZmFsc2VfID0gbmV3RmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFLCBvbGRGYWxzZSwgbmV3RmFsc2UpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZhbHNlKFBURXhwcmVzc2lvbiBuZXdGYWxzZSkgewotCQlpZiAobmV3RmFsc2UgIT0gZmFsc2VfKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChmYWxzZV8gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZmFsc2VfKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0UsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0ZhbHNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0ZhbHNlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0UsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RmFsc2UobmV3RmFsc2UsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0UsIG5ld0ZhbHNlLCBuZXdGYWxzZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRDb25kaXRpb24obnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRUcnVlKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0U6Ci0JCQkJCXJldHVybiBiYXNpY1NldEZhbHNlKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19DT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldENvbmRpdGlvbigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9DT05ESVRJT05BTF9FWFBSRVNTSU9OX19UUlVFOgotCQkJCXJldHVybiBnZXRUcnVlKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFOgotCQkJCXJldHVybiBnZXRGYWxzZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OOgotCQkJCXNldENvbmRpdGlvbigoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUU6Ci0JCQkJc2V0VHJ1ZSgoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0ZBTFNFOgotCQkJCXNldEZhbHNlKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX0NPTkRJVElPTjoKLQkJCQlzZXRDb25kaXRpb24oKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0NPTkRJVElPTkFMX0VYUFJFU1NJT05fX1RSVUU6Ci0JCQkJc2V0VHJ1ZSgoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0U6Ci0JCQkJc2V0RmFsc2UoKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fQ09ORElUSU9OOgotCQkJCXJldHVybiBjb25kaXRpb24gIT0gbnVsbDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fVFJVRToKLQkJCQlyZXR1cm4gdHJ1ZV8gIT0gbnVsbDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfQ09ORElUSU9OQUxfRVhQUkVTU0lPTl9fRkFMU0U6Ci0JCQkJcmV0dXJuIGZhbHNlXyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldENvbmRpdGlvbigpKTsKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFRydWUoKSk7Ci0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRGYWxzZSgpKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0JCi0KLX0gLy9Db25kaXRpb25hbEV4cHJlc3Npb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BURXhwcmVzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmIxMjNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRFeHByZXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQVEV4cHJlc3Npb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBQVEV4cHJlc3Npb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBURXhwcmVzc2lvbigpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkV4cHJlc3Npb24jYWNjZXB0KG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhY2NlcHQoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdHJ5IHsKLQkJCWNoaWxkQWNjZXB0MCh2aXNpdG9yKTsKLQkJfSBjYXRjaCAoUGFyc2VWaXNpdG9yLlN0b3BWaXNpdGluZyBlKSB7Ci0JCQkvLyBEbyBub3RoaW5nLCB0aGlzIGlzIGEgbm9ybWFsIHdheSB0byBqdXN0IHN0b3AgdmlzaXRpbmcuCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBY2NlcHRzIHRoZSBnaXZlbiB2aXNpdG9yIG9uIGEgdHlwZS1zcGVjaWZpYyB2aXNpdCBvZiB0aGUgY3VycmVudCBub2RlLgotCSAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gYWxsIGNvbmNyZXRlIEV4cHJlc3Npb24gbm9kZSB0eXBlcy4KLQkgKiA8cD4KLQkgKiBHZW5lcmFsIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRhdGlvbiBvbiBlYWNoIGNvbmNyZXRlIEFTVE5vZGUgY2xhc3M6Ci0JICogPHByZT4KLQkgKiA8Y29kZT4KLQkgKiBib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCSAqIGlmICh2aXNpdENoaWxkcmVuKSB7Ci0JICogICAgLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCSAqICAgIGFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFByb3BlcnR5MSgpKTsKLQkgKiAgICBhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCByYXdMaXN0UHJvcGVydHkpOwotCSAqICAgIGFjY2VwdENoaWxkKHZpc2l0b3IsIGdldFByb3BlcnR5MigpKTsKLQkgKiB9Ci0JICogdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQkgKiA8L2NvZGU+Ci0JICogPC9wcmU+Ci0JICogTm90ZSB0aGF0IHRoZSBjYWxsZXIgKDxjb2RlPmFjY2VwdDwvY29kZT4pIHRha2UgY2FyZXMgb2YgaW52b2tpbmcKLQkgKiA8Y29kZT52aXNpdG9yLnByZVZpc2l0KHRoaXMpPC9jb2RlPiBhbmQgPGNvZGU+dmlzaXRvci5wb3N0VmlzaXQodGhpcyk8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdmlzaXRvciB0aGUgdmlzaXRvciBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKTsKLQotCS8qKgotCSAqIEFjY2VwdHMgdGhlIGdpdmVuIHZpc2l0b3Igb24gYSB2aXNpdCBvZiB0aGUgY3VycmVudCBub2RlLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YKLQkgKiA8Y29kZT5hY2NlcHQwPC9jb2RlPiB0byB0cmF2ZXJzZSBvcHRpb25hbCBwcm9wZXJ0aWVzLiBFcXVpdmFsZW50Ci0JICogdG8gPGNvZGU+Y2hpbGQuYWNjZXB0KHZpc2l0b3IpPC9jb2RlPiBpZiA8Y29kZT5jaGlsZDwvY29kZT4KLQkgKiBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB2aXNpdG9yIHRoZSB2aXNpdG9yIG9iamVjdAotCSAqIEBwYXJhbSBjaGlsZCB0aGUgY2hpbGQgRXhwcmVzc2lvbiBub2RlIHRvIGRpc3BhdGNoIHRvbywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICBpZiBub25lLiBJdCBhY3R1YWxseSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFBURXhwcmVzc2lvbkltcGwsIGJ1dCAKLQkgKiAgICBpdCB3b3VsZCBiZSB0b28gZGlmZmljdWx0IHRvIHB1dCB0aGUgY2FzdCBpbiBlYWNoIGNhbGwgdG8gYWNjZXB0Q2hpbGQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWNjZXB0Q2hpbGQoUGFyc2VWaXNpdG9yIHZpc2l0b3IsIFBURXhwcmVzc2lvbiBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCSgoUFRFeHByZXNzaW9uSW1wbCkgY2hpbGQpLmNoaWxkQWNjZXB0MCh2aXNpdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIE9OTFkgYnkgUFRFeHByZXNzaW9uSW1wbCBmb3IgdGhlIGNoaWxkIHRvIGFjY2VwdCB0aGUgdmlzaXRvciwgYnV0Ci0JICogaXQgZG9lc24ndCBjYXRjaCBTdG9wVmlzaXRpbmcuCi0JICogQHBhcmFtIHZpc2l0b3IKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAuMQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGNoaWxkQWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlpZiAodmlzaXRvciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gYmVnaW4gd2l0aCB0aGUgZ2VuZXJpYyBwcmUtdmlzaXQKLQkJdmlzaXRvci5wcmVWaXNpdCh0aGlzKTsKLQkJLy8gZHluYW1pYyBkaXNwYXRjaCB0byBpbnRlcm5hbCBtZXRob2QgZm9yIHR5cGUtc3BlY2lmaWMgdmlzaXQvZW5kVmlzaXQKLQkJYWNjZXB0MCh2aXNpdG9yKTsKLQkJLy8gZW5kIHdpdGggdGhlIGdlbmVyaWMgcG9zdC12aXNpdAotCQl2aXNpdG9yLnBvc3RWaXNpdCh0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQWNjZXB0cyB0aGUgZ2l2ZW4gdmlzaXRvciBvbiBhIHZpc2l0IG9mIHRoZSBnaXZlbiBsaXZlIGxpc3Qgb2YKLQkgKiBjaGlsZCBub2Rlcy4gCi0JICogQHBhcmFtIHZpc2l0b3IgdGhlIHZpc2l0b3Igb2JqZWN0Ci0JICogQHBhcmFtIGNoaWxkcmVuIHRoZSBjaGlsZCBFeHByZXNzaW9uIG5vZGVzIHRvIGRpc3BhdGNoIHRvLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFjY2VwdENoaWxkcmVuKFBhcnNlVmlzaXRvciB2aXNpdG9yLCBMaXN0IGNoaWxkcmVuKSB7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgKFBURXhwcmVzc2lvbikgY2hpbGRyZW4uZ2V0KGkpKTsKLQkJCX0KLQkJfSAKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJLy8gYWxsb2NhdGUgYSBidWZmZXIgdGhhdCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbiBhdmVyYWdlIGNvbXBpbGF0aW9uIHVuaXQKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoNjAwMCk7Ci0JCWludCBwID0gYnVmZmVyLmxlbmd0aCgpOwotCQl0cnkgewotCQkJYXBwZW5kRGVidWdTdHJpbmcoYnVmZmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaW5jZSBkZWJ1Z2dlciBzb21ldGltZXMgY2FsbCB0b1N0cmluZyBtZXRob2RzLCBwcm9ibGVtcyBjYW4gZWFzaWx5IGhhcHBlbiB3aGVuCi0JCQkvLyB0b1N0cmluZyBpcyBjYWxsZWQgb24gYW4gaW5zdGFuY2UgdGhhdCBpcyBiZWluZyBpbml0aWFsaXplZAotCQkJYnVmZmVyLnNldExlbmd0aChwKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIiEiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChzdGFuZGFyZFRvU3RyaW5nKCkpOwotCQl9Ci0JCS8vIGNvbnZlcnQgdG8gYSBzdHJpbmcsIGJ1dCBsb3NlIHRoZSBleHRyYSBzcGFjZSBpbiB0aGUgc3RyaW5nIGJ1ZmZlciBieSBjb3B5aW5nCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBzdGFuZGFyZFRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kRGVidWdTdHJpbmcoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQkvLyBwcmludCB0aGUgc3VidHJlZSBieSBkZWZhdWx0Ci0JCWFwcGVuZFByaW50U3RyaW5nKGJ1ZmZlcik7Ci0JfQotCQotCS8qCi0JICogQXBwZW5kcyBhIHN0YW5kYXJkIEphdmEgc291cmNlIGNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzdWJ0cmVlIHRvIHRoZSBnaXZlbgotCSAqIHN0cmluZyBidWZmZXIuCi0JICogCi0JICogQHBhcmFtIGJ1ZmZlciB0aGUgc3RyaW5nIGJ1ZmZlciB0byBhcHBlbmQgdG8KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhcHBlbmRQcmludFN0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCU5haXZlRXhwcmVzc2lvbkZsYXR0ZW5lciBwcmludGVyID0gbmV3IE5haXZlRXhwcmVzc2lvbkZsYXR0ZW5lcigpOwotCQl0aGlzLmFjY2VwdChwcmludGVyKTsKLQkJYnVmZmVyLmFwcGVuZChwcmludGVyLmdldFJlc3VsdCgpKTsKLQl9CQotCi19IC8vRXhwcmVzc2lvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRGaWVsZEFjY2Vzc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRGaWVsZEFjY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxMTRlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BURmllbGRBY2Nlc3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRGaWVsZEFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZpZWxkIEFjY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEZpZWxkQWNjZXNzSW1wbCNnZXRSZWNlaXZlciA8ZW0+UmVjZWl2ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRGaWVsZEFjY2Vzc0ltcGwjZ2V0RmllbGQgPGVtPkZpZWxkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRGaWVsZEFjY2Vzc0ltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRGaWVsZEFjY2VzcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVjZWl2ZXIoKSA8ZW0+UmVjZWl2ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlY2VpdmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIHJlY2VpdmVyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZCgpIDxlbT5GaWVsZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkKCkgPGVtPkZpZWxkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZCA9IEZJRUxEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBURmllbGRBY2Nlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBURmllbGRBY2Nlc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldFJlY2VpdmVyKCkgewotCQlyZXR1cm4gcmVjZWl2ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVjZWl2ZXIoUFRFeHByZXNzaW9uIG5ld1JlY2VpdmVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRSZWNlaXZlciA9IHJlY2VpdmVyOwotCQlyZWNlaXZlciA9IG5ld1JlY2VpdmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSLCBvbGRSZWNlaXZlciwgbmV3UmVjZWl2ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlY2VpdmVyKFBURXhwcmVzc2lvbiBuZXdSZWNlaXZlcikgewotCQlpZiAobmV3UmVjZWl2ZXIgIT0gcmVjZWl2ZXIpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlY2VpdmVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlY2VpdmVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVjZWl2ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVjZWl2ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlY2VpdmVyKG5ld1JlY2VpdmVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVIsIG5ld1JlY2VpdmVyLCBuZXdSZWNlaXZlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGQoKSB7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZChTdHJpbmcgbmV3RmllbGQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkID0gZmllbGQ7Ci0JCWZpZWxkID0gbmV3RmllbGQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fRklFTEQsIG9sZEZpZWxkLCBmaWVsZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUjoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UmVjZWl2ZXIobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fUkVDRUlWRVI6Ci0JCQkJcmV0dXJuIGdldFJlY2VpdmVyKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0ZJRUxEX0FDQ0VTU19fRklFTEQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSOgotCQkJCXNldFJlY2VpdmVyKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19GSUVMRDoKLQkJCQlzZXRGaWVsZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX1JFQ0VJVkVSOgotCQkJCXNldFJlY2VpdmVyKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9GSUVMRF9BQ0NFU1NfX0ZJRUxEOgotCQkJCXNldEZpZWxkKEZJRUxEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19SRUNFSVZFUjoKLQkJCQlyZXR1cm4gcmVjZWl2ZXIgIT0gbnVsbDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfRklFTERfQUNDRVNTX19GSUVMRDoKLQkJCQlyZXR1cm4gRklFTERfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkICE9IG51bGwgOiAhRklFTERfRURFRkFVTFQuZXF1YWxzKGZpZWxkKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0UmVjZWl2ZXIoKSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9CQotCi19IC8vRmllbGRBY2Nlc3NJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5maXhFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVEluZml4RXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlNmQyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5maXhFeHByZXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5maXhPcGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluZml4IEV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbmZpeEV4cHJlc3Npb25JbXBsI2dldExlZnRPcGVyYW5kIDxlbT5MZWZ0IE9wZXJhbmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbmZpeEV4cHJlc3Npb25JbXBsI2dldE9wZXJhdG9yIDxlbT5PcGVyYXRvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEluZml4RXhwcmVzc2lvbkltcGwjZ2V0UmlnaHRPcGVyYW5kIDxlbT5SaWdodCBPcGVyYW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5maXhFeHByZXNzaW9uSW1wbCNnZXRFeHRlbmRlZE9wZXJhbmRzIDxlbT5FeHRlbmRlZCBPcGVyYW5kczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUSW5maXhFeHByZXNzaW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVEluZml4RXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGVmdE9wZXJhbmQoKSA8ZW0+TGVmdCBPcGVyYW5kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZWZ0T3BlcmFuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBsZWZ0T3BlcmFuZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3BlcmF0b3IoKSA8ZW0+T3BlcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBUSW5maXhPcGVyYXRvciBPUEVSQVRPUl9FREVGQVVMVCA9IFBUSW5maXhPcGVyYXRvci5USU1FU19MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3BlcmF0b3IoKSA8ZW0+T3BlcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRJbmZpeE9wZXJhdG9yIG9wZXJhdG9yID0gT1BFUkFUT1JfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSaWdodE9wZXJhbmQoKSA8ZW0+UmlnaHQgT3BlcmFuZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmlnaHRPcGVyYW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIHJpZ2h0T3BlcmFuZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZE9wZXJhbmRzKCkgPGVtPkV4dGVuZGVkIE9wZXJhbmRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuZGVkT3BlcmFuZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHRlbmRlZE9wZXJhbmRzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEluZml4RXhwcmVzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRJbmZpeEV4cHJlc3Npb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldExlZnRPcGVyYW5kKCkgewotCQlyZXR1cm4gbGVmdE9wZXJhbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TGVmdE9wZXJhbmQoUFRFeHByZXNzaW9uIG5ld0xlZnRPcGVyYW5kLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRMZWZ0T3BlcmFuZCA9IGxlZnRPcGVyYW5kOwotCQlsZWZ0T3BlcmFuZCA9IG5ld0xlZnRPcGVyYW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQsIG9sZExlZnRPcGVyYW5kLCBuZXdMZWZ0T3BlcmFuZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVmdE9wZXJhbmQoUFRFeHByZXNzaW9uIG5ld0xlZnRPcGVyYW5kKSB7Ci0JCWlmIChuZXdMZWZ0T3BlcmFuZCAhPSBsZWZ0T3BlcmFuZCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobGVmdE9wZXJhbmQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbGVmdE9wZXJhbmQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0xlZnRPcGVyYW5kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0xlZnRPcGVyYW5kKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5ELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldExlZnRPcGVyYW5kKG5ld0xlZnRPcGVyYW5kLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORCwgbmV3TGVmdE9wZXJhbmQsIG5ld0xlZnRPcGVyYW5kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUSW5maXhPcGVyYXRvciBnZXRPcGVyYXRvcigpIHsKLQkJcmV0dXJuIG9wZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wZXJhdG9yKFBUSW5maXhPcGVyYXRvciBuZXdPcGVyYXRvcikgewotCQlQVEluZml4T3BlcmF0b3Igb2xkT3BlcmF0b3IgPSBvcGVyYXRvcjsKLQkJb3BlcmF0b3IgPSBuZXdPcGVyYXRvciA9PSBudWxsID8gT1BFUkFUT1JfRURFRkFVTFQgOiBuZXdPcGVyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fT1BFUkFUT1IsIG9sZE9wZXJhdG9yLCBvcGVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0UmlnaHRPcGVyYW5kKCkgewotCQlyZXR1cm4gcmlnaHRPcGVyYW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJpZ2h0T3BlcmFuZChQVEV4cHJlc3Npb24gbmV3UmlnaHRPcGVyYW5kLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRSaWdodE9wZXJhbmQgPSByaWdodE9wZXJhbmQ7Ci0JCXJpZ2h0T3BlcmFuZCA9IG5ld1JpZ2h0T3BlcmFuZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORCwgb2xkUmlnaHRPcGVyYW5kLCBuZXdSaWdodE9wZXJhbmQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJpZ2h0T3BlcmFuZChQVEV4cHJlc3Npb24gbmV3UmlnaHRPcGVyYW5kKSB7Ci0JCWlmIChuZXdSaWdodE9wZXJhbmQgIT0gcmlnaHRPcGVyYW5kKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyaWdodE9wZXJhbmQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmlnaHRPcGVyYW5kKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmlnaHRPcGVyYW5kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JpZ2h0T3BlcmFuZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmlnaHRPcGVyYW5kKG5ld1JpZ2h0T3BlcmFuZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5ELCBuZXdSaWdodE9wZXJhbmQsIG5ld1JpZ2h0T3BlcmFuZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRFeHRlbmRlZE9wZXJhbmRzKCkgewotCQlpZiAoZXh0ZW5kZWRPcGVyYW5kcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZE9wZXJhbmRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBURXhwcmVzc2lvbi5jbGFzcywgdGhpcywgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fRVhURU5ERURfT1BFUkFORFMpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZE9wZXJhbmRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5EOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRMZWZ0T3BlcmFuZChudWxsLCBtc2dzKTsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQ6Ci0JCQkJCXJldHVybiBiYXNpY1NldFJpZ2h0T3BlcmFuZChudWxsLCBtc2dzKTsKLQkJCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0VYVEVOREVEX09QRVJBTkRTOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEV4dGVuZGVkT3BlcmFuZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQ6Ci0JCQkJcmV0dXJuIGdldExlZnRPcGVyYW5kKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX09QRVJBVE9SOgotCQkJCXJldHVybiBnZXRPcGVyYXRvcigpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19SSUdIVF9PUEVSQU5EOgotCQkJCXJldHVybiBnZXRSaWdodE9wZXJhbmQoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fRVhURU5ERURfT1BFUkFORFM6Ci0JCQkJcmV0dXJuIGdldEV4dGVuZGVkT3BlcmFuZHMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX0xFRlRfT1BFUkFORDoKLQkJCQlzZXRMZWZ0T3BlcmFuZCgoUFRFeHByZXNzaW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX09QRVJBVE9SOgotCQkJCXNldE9wZXJhdG9yKChQVEluZml4T3BlcmF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fUklHSFRfT1BFUkFORDoKLQkJCQlzZXRSaWdodE9wZXJhbmQoKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19FWFRFTkRFRF9PUEVSQU5EUzoKLQkJCQlnZXRFeHRlbmRlZE9wZXJhbmRzKCkuY2xlYXIoKTsKLQkJCQlnZXRFeHRlbmRlZE9wZXJhbmRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19MRUZUX09QRVJBTkQ6Ci0JCQkJc2V0TGVmdE9wZXJhbmQoKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX09QRVJBVE9SOgotCQkJCXNldE9wZXJhdG9yKE9QRVJBVE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQ6Ci0JCQkJc2V0UmlnaHRPcGVyYW5kKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19FWFRFTkRFRF9PUEVSQU5EUzoKLQkJCQlnZXRFeHRlbmRlZE9wZXJhbmRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5GSVhfRVhQUkVTU0lPTl9fTEVGVF9PUEVSQU5EOgotCQkJCXJldHVybiBsZWZ0T3BlcmFuZCAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUjoKLQkJCQlyZXR1cm4gb3BlcmF0b3IgIT0gT1BFUkFUT1JfRURFRkFVTFQ7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lORklYX0VYUFJFU1NJT05fX1JJR0hUX09QRVJBTkQ6Ci0JCQkJcmV0dXJuIHJpZ2h0T3BlcmFuZCAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTkZJWF9FWFBSRVNTSU9OX19FWFRFTkRFRF9PUEVSQU5EUzoKLQkJCQlyZXR1cm4gZXh0ZW5kZWRPcGVyYW5kcyAhPSBudWxsICYmICFleHRlbmRlZE9wZXJhbmRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0TGVmdE9wZXJhbmQoKSk7Ci0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRSaWdodE9wZXJhbmQoKSk7Ci0JCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBleHRlbmRlZE9wZXJhbmRzKTsKLQkJfQotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluZml4RXhwcmVzc2lvbiNhc0NvbXByZXNzZWRFeHByZXNzaW9uKCkKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGFzQ29tcHJlc3NlZEV4cHJlc3Npb24oKSB7Ci0JCS8vIElmIG5vIGxlZnQgYW5kIG5vIHJpZ2h0Ci0JCWlmKGdldExlZnRPcGVyYW5kKCkgPT0gbnVsbCAmJiBnZXRSaWdodE9wZXJhbmQoKSAhPSBudWxsKXsKLQkJCS8vIG5vIGV4dGVuZHMgc28ganVzdCB1c2UgdGhlIHJpZ2h0IG9wZXJhbmQKLQkJCWlmKGdldEV4dGVuZGVkT3BlcmFuZHMoKS5pc0VtcHR5KCkpewotCQkJCXJldHVybiBnZXRSaWdodE9wZXJhbmQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gVGhlIHJpZ2h0IGJlY29tZXMgdGhlIG5ldyBsZWZ0Ci0JCQkJc2V0TGVmdE9wZXJhbmQoZ2V0UmlnaHRPcGVyYW5kKCkpOwotCQkJCS8vIFRoZSBmaXJzdCBvcGVyYW5kIGJlY29tZXMgdGhlIHJpZ2h0IG9uZQotCQkJCXNldFJpZ2h0T3BlcmFuZCgoUFRFeHByZXNzaW9uKSBnZXRFeHRlbmRlZE9wZXJhbmRzKCkucmVtb3ZlKDApKTsKLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0KLQkJfSBlbHNlIGlmIChnZXRSaWdodE9wZXJhbmQoKSA9PSBudWxsICYmIGdldExlZnRPcGVyYW5kKCkgIT0gbnVsbCl7Ci0JCQkvLyBubyBleHRlbmRzIHNvIGp1c3QgdXNlIHRoZSBsZWZ0IG9wZXJhbmQKLQkJCWlmKGdldEV4dGVuZGVkT3BlcmFuZHMoKS5pc0VtcHR5KCkpewotCQkJCXJldHVybiBnZXRMZWZ0T3BlcmFuZCgpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBUaGUgcmlnaHQgYmVjb21lcyB0aGUgZmlyc3QgZXh0ZW5kZWQKLQkJCQlzZXRSaWdodE9wZXJhbmQoKFBURXhwcmVzc2lvbilnZXRFeHRlbmRlZE9wZXJhbmRzKCkucmVtb3ZlKDApKTsKLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0JCQkKLQkJfQkKLQkJcmV0dXJuIHRoaXM7Ci0JfQotfSAvL0luZml4RXhwcmVzc2lvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZmNWQwZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5zdGFuY2VSZWZlcmVuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJVclCi0gKiBAdmVyc2lvbiAlSSUgJUglCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEluc3RhbmNlUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UFQgSW5zdGFuY2UgUmVmZXJlbmNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5zdGFuY2VSZWZlcmVuY2VJbXBsI2dldFJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRJbnN0YW5jZVJlZmVyZW5jZUltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRJbnN0YW5jZVJlZmVyZW5jZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlKCkgPGVtPlJlZmVyZW5jZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUphdmFJbnN0YW5jZSByZWZlcmVuY2UgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUSW5zdGFuY2VSZWZlcmVuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUSW5zdGFuY2VSZWZlcmVuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUphdmFJbnN0YW5jZSBnZXRSZWZlcmVuY2UoKSB7Ci0JCWlmIChyZWZlcmVuY2UgIT0gbnVsbCAmJiByZWZlcmVuY2UuZUlzUHJveHkoKSkgewotCQkJSUphdmFJbnN0YW5jZSBvbGRSZWZlcmVuY2UgPSByZWZlcmVuY2U7Ci0JCQlyZWZlcmVuY2UgPSAoSUphdmFJbnN0YW5jZSllUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpcmVmZXJlbmNlKTsKLQkJCWlmIChyZWZlcmVuY2UgIT0gb2xkUmVmZXJlbmNlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX19SRUZFUkVOQ0UsIG9sZFJlZmVyZW5jZSwgcmVmZXJlbmNlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUphdmFJbnN0YW5jZSBiYXNpY0dldFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIHJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2UoSUphdmFJbnN0YW5jZSBuZXdSZWZlcmVuY2UpIHsKLQkJSUphdmFJbnN0YW5jZSBvbGRSZWZlcmVuY2UgPSByZWZlcmVuY2U7Ci0JCXJlZmVyZW5jZSA9IG5ld1JlZmVyZW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX19SRUZFUkVOQ0UsIG9sZFJlZmVyZW5jZSwgcmVmZXJlbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRV9SRUZFUkVOQ0VfX1JFRkVSRU5DRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFJlZmVyZW5jZSgpOwotCQkJCXJldHVybiBiYXNpY0dldFJlZmVyZW5jZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VfUkVGRVJFTkNFX19SRUZFUkVOQ0U6Ci0JCQkJc2V0UmVmZXJlbmNlKChJSmF2YUluc3RhbmNlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRV9SRUZFUkVOQ0VfX1JFRkVSRU5DRToKLQkJCQlzZXRSZWZlcmVuY2UoKElKYXZhSW5zdGFuY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFX1JFRkVSRU5DRV9fUkVGRVJFTkNFOgotCQkJCXJldHVybiByZWZlcmVuY2UgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJJbnN0YW5jZVJlZnsiICsgcmVmZXJlbmNlICsgIn0iOwotCX0KLQotfSAvL1BUSW5zdGFuY2VSZWZlcmVuY2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW5zdGFuY2VvZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbnN0YW5jZW9mSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzZmMTYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbnN0YW5jZW9mSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUSW5zdGFuY2VvZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluc3RhbmNlb2Y8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRJbnN0YW5jZW9mSW1wbCNnZXRPcGVyYW5kIDxlbT5PcGVyYW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUSW5zdGFuY2VvZkltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUSW5zdGFuY2VvZkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRJbnN0YW5jZW9mIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcGVyYW5kKCkgPGVtPk9wZXJhbmQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wZXJhbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gb3BlcmFuZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVEluc3RhbmNlb2ZJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUSW5zdGFuY2VvZigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0T3BlcmFuZCgpIHsKLQkJcmV0dXJuIG9wZXJhbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T3BlcmFuZChQVEV4cHJlc3Npb24gbmV3T3BlcmFuZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkT3BlcmFuZCA9IG9wZXJhbmQ7Ci0JCW9wZXJhbmQgPSBuZXdPcGVyYW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5ELCBvbGRPcGVyYW5kLCBuZXdPcGVyYW5kKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcGVyYW5kKFBURXhwcmVzc2lvbiBuZXdPcGVyYW5kKSB7Ci0JCWlmIChuZXdPcGVyYW5kICE9IG9wZXJhbmQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG9wZXJhbmQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb3BlcmFuZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld09wZXJhbmQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T3BlcmFuZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0T3BlcmFuZChuZXdPcGVyYW5kLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQsIG5ld09wZXJhbmQsIG5ld09wZXJhbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0T3BlcmFuZChudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORDoKLQkJCQlyZXR1cm4gZ2V0T3BlcmFuZCgpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19PUEVSQU5EOgotCQkJCXNldE9wZXJhbmQoKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fT1BFUkFORDoKLQkJCQlzZXRPcGVyYW5kKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlNUQU5DRU9GX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOU1RBTkNFT0ZfX09QRVJBTkQ6Ci0JCQkJcmV0dXJuIG9wZXJhbmQgIT0gbnVsbDsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5TVEFOQ0VPRl9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCWJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCWlmICh2aXNpdENoaWxkcmVuKSB7Ci0JCQkvLyB2aXNpdCBjaGlsZHJlbiBpbiBub3JtYWwgbGVmdCB0byByaWdodCByZWFkaW5nIG9yZGVyCi0JCQlhY2NlcHRDaGlsZCh2aXNpdG9yLCBnZXRPcGVyYW5kKCkpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCi19IC8vSW5zdGFuY2VvZkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4YzU0MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUSW52YWxpZEV4cHJlc3Npb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRJbnZhbGlkRXhwcmVzc2lvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkludmFsaWQgRXhwcmVzc2lvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVEludmFsaWRFeHByZXNzaW9uSW1wbCNnZXRNZXNzYWdlIDxlbT5NZXNzYWdlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRJbnZhbGlkRXhwcmVzc2lvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2UoKSA8ZW0+TWVzc2FnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWVzc2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVTU0FHRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlKCkgPGVtPk1lc3NhZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1lc3NhZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZSA9IE1FU1NBR0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRJbnZhbGlkRXhwcmVzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRJbnZhbGlkRXhwcmVzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSkgewotCQlTdHJpbmcgb2xkTWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCW1lc3NhZ2UgPSBuZXdNZXNzYWdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9JTlZBTElEX0VYUFJFU1NJT05fX01FU1NBR0UsIG9sZE1lc3NhZ2UsIG1lc3NhZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOVkFMSURfRVhQUkVTU0lPTl9fTUVTU0FHRToKLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5WQUxJRF9FWFBSRVNTSU9OX19NRVNTQUdFOgotCQkJCXNldE1lc3NhZ2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfSU5WQUxJRF9FWFBSRVNTSU9OX19NRVNTQUdFOgotCQkJCXNldE1lc3NhZ2UoTUVTU0FHRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX0lOVkFMSURfRVhQUkVTU0lPTl9fTUVTU0FHRToKLQkJCQlyZXR1cm4gTUVTU0FHRV9FREVGQVVMVCA9PSBudWxsID8gbWVzc2FnZSAhPSBudWxsIDogIU1FU1NBR0VfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2UpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCi19IC8vSW52YWxpZEV4cHJlc3Npb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTWV0aG9kSW52b2NhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRNZXRob2RJbnZvY2F0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjdhNjBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRNZXRob2RJbnZvY2F0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTWV0aG9kSW52b2NhdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBJbnZvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTWV0aG9kSW52b2NhdGlvbkltcGwjZ2V0UmVjZWl2ZXIgPGVtPlJlY2VpdmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUTWV0aG9kSW52b2NhdGlvbkltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE1ldGhvZEludm9jYXRpb25JbXBsI2dldEFyZ3VtZW50cyA8ZW0+QXJndW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRNZXRob2RJbnZvY2F0aW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVE1ldGhvZEludm9jYXRpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlY2VpdmVyKCkgPGVtPlJlY2VpdmVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWNlaXZlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiByZWNlaXZlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFyZ3VtZW50cygpIDxlbT5Bcmd1bWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXJndW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXJndW1lbnRzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQVE1ldGhvZEludm9jYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSW5zdGFudGlhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFBUTWV0aG9kSW52b2NhdGlvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0UmVjZWl2ZXIoKSB7Ci0JCXJldHVybiByZWNlaXZlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZWNlaXZlcihQVEV4cHJlc3Npb24gbmV3UmVjZWl2ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZFJlY2VpdmVyID0gcmVjZWl2ZXI7Ci0JCXJlY2VpdmVyID0gbmV3UmVjZWl2ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUiwgb2xkUmVjZWl2ZXIsIG5ld1JlY2VpdmVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWNlaXZlcihQVEV4cHJlc3Npb24gbmV3UmVjZWl2ZXIpIHsKLQkJaWYgKG5ld1JlY2VpdmVyICE9IHJlY2VpdmVyKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZWNlaXZlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZWNlaXZlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVjZWl2ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVjZWl2ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVjZWl2ZXIobmV3UmVjZWl2ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSLCBuZXdSZWNlaXZlciwgbmV3UmVjZWl2ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXJndW1lbnRzKCkgewotCQlpZiAoYXJndW1lbnRzID09IG51bGwpIHsKLQkJCWFyZ3VtZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQVEV4cHJlc3Npb24uY2xhc3MsIHRoaXMsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFMpOwotCQl9Ci0JCXJldHVybiBhcmd1bWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVI6Ci0JCQkJCXJldHVybiBiYXNpY1NldFJlY2VpdmVyKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX0FSR1VNRU5UUzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBcmd1bWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fUkVDRUlWRVI6Ci0JCQkJcmV0dXJuIGdldFJlY2VpdmVyKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFM6Ci0JCQkJcmV0dXJuIGdldEFyZ3VtZW50cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSOgotCQkJCXNldFJlY2VpdmVyKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFM6Ci0JCQkJZ2V0QXJndW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRBcmd1bWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19SRUNFSVZFUjoKLQkJCQlzZXRSZWNlaXZlcigoUFRFeHByZXNzaW9uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX01FVEhPRF9JTlZPQ0FUSU9OX19BUkdVTUVOVFM6Ci0JCQkJZ2V0QXJndW1lbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTUVUSE9EX0lOVk9DQVRJT05fX1JFQ0VJVkVSOgotCQkJCXJldHVybiByZWNlaXZlciAhPSBudWxsOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9NRVRIT0RfSU5WT0NBVElPTl9fQVJHVU1FTlRTOgotCQkJCXJldHVybiBhcmd1bWVudHMgIT0gbnVsbCAmJiAhYXJndW1lbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CS8vIFJlYWxseSB3YW50IHRvU3RyaW5nIHRvIGJlIGZpbmFsIGF0IFBURXhwcmVzc2lvbiwgYnV0IEVNRiBkb2Vzbid0IGFsbG93IGl0LgotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQlib29sZWFuIHZpc2l0Q2hpbGRyZW4gPSB2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQlpZiAodmlzaXRDaGlsZHJlbikgewotCQkJLy8gdmlzaXQgY2hpbGRyZW4gaW4gbm9ybWFsIGxlZnQgdG8gcmlnaHQgcmVhZGluZyBvcmRlcgotCQkJYWNjZXB0Q2hpbGQodmlzaXRvciwgZ2V0UmVjZWl2ZXIoKSk7Ci0JCQlhY2NlcHRDaGlsZHJlbih2aXNpdG9yLCBhcmd1bWVudHMpOwotCQl9Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotfSAvL01ldGhvZEludm9jYXRpb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTmFtZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROYW1lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWY1Nzg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROYW1lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVE5hbWVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVE5hbWVJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUTmFtZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFROYW1lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTkFNRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTkFNRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTkFNRV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05BTUVfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTkFNRV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCi19IC8vTmFtZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROdWxsTGl0ZXJhbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROdWxsTGl0ZXJhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhODY2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUTnVsbExpdGVyYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUTnVsbExpdGVyYWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OdWxsIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVE51bGxMaXRlcmFsSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVE51bGxMaXRlcmFsIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFROdWxsTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFROdWxsTGl0ZXJhbCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0JCi0KLX0gLy9OdWxsTGl0ZXJhbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFROdW1iZXJMaXRlcmFsSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE51bWJlckxpdGVyYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTlhNjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVE51bWJlckxpdGVyYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFROdW1iZXJMaXRlcmFsOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TnVtYmVyIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFROdW1iZXJMaXRlcmFsSW1wbCNnZXRUb2tlbiA8ZW0+VG9rZW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVE51bWJlckxpdGVyYWxJbXBsIGV4dGVuZHMgUFRFeHByZXNzaW9uSW1wbCBpbXBsZW1lbnRzIFBUTnVtYmVyTGl0ZXJhbCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRva2VuKCkgPGVtPlRva2VuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb2tlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9rZW4oKSA8ZW0+VG9rZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRva2VuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRva2VuID0gVE9LRU5fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFROdW1iZXJMaXRlcmFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVE51bWJlckxpdGVyYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRva2VuKCkgewotCQlyZXR1cm4gdG9rZW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9rZW4oU3RyaW5nIG5ld1Rva2VuKSB7Ci0JCVN0cmluZyBvbGRUb2tlbiA9IHRva2VuOwotCQl0b2tlbiA9IG5ld1Rva2VuOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9OVU1CRVJfTElURVJBTF9fVE9LRU4sIG9sZFRva2VuLCB0b2tlbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTlVNQkVSX0xJVEVSQUxfX1RPS0VOOgotCQkJCXJldHVybiBnZXRUb2tlbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfTlVNQkVSX0xJVEVSQUxfX1RPS0VOOgotCQkJCXNldFRva2VuKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05VTUJFUl9MSVRFUkFMX19UT0tFTjoKLQkJCQlzZXRUb2tlbihUT0tFTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX05VTUJFUl9MSVRFUkFMX19UT0tFTjoKLQkJCQlyZXR1cm4gVE9LRU5fRURFRkFVTFQgPT0gbnVsbCA/IHRva2VuICE9IG51bGwgOiAhVE9LRU5fRURFRkFVTFQuZXF1YWxzKHRva2VuKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRva2VuOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b2tlbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0KLX0gLy9OdW1iZXJMaXRlcmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmMyODUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyZW50aGVzaXplZCBFeHByZXNzaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHByZXNzaW9uKCkgPGVtPkV4cHJlc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4cHJlc3Npb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQVEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQVEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlQVEV4cHJlc3Npb24gb2xkRXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0JCWV4cHJlc3Npb24gPSBuZXdFeHByZXNzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG9sZEV4cHJlc3Npb24sIG5ld0V4cHJlc3Npb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIG5ld0V4cHJlc3Npb24pIHsKLQkJaWYgKG5ld0V4cHJlc3Npb24gIT0gZXhwcmVzc2lvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClleHByZXNzaW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdFeHByZXNzaW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0V4cHJlc3Npb24pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RXhwcmVzc2lvbihuZXdFeHByZXNzaW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbmV3RXhwcmVzc2lvbiwgbmV3RXhwcmVzc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRFeHByZXNzaW9uKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGdldEV4cHJlc3Npb24oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlzZXRFeHByZXNzaW9uKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlzZXRFeHByZXNzaW9uKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BBUkVOVEhFU0laRURfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlyZXR1cm4gZXhwcmVzc2lvbiAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEV4cHJlc3Npb24oKSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9CQotCi19IC8vUGFyZW50aGVzaXplZEV4cHJlc3Npb25JbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUUHJlZml4RXhwcmVzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRQcmVmaXhFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDY4YWVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRQcmVmaXhFeHByZXNzaW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUUHJlZml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFByZWZpeE9wZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlZml4IEV4cHJlc3Npb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRQcmVmaXhFeHByZXNzaW9uSW1wbCNnZXRPcGVyYXRvciA8ZW0+T3BlcmF0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuUFRQcmVmaXhFeHByZXNzaW9uSW1wbCNnZXRFeHByZXNzaW9uIDxlbT5FeHByZXNzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRQcmVmaXhFeHByZXNzaW9uSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVFByZWZpeEV4cHJlc3Npb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcGVyYXRvcigpIDxlbT5PcGVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3BlcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUFRQcmVmaXhPcGVyYXRvciBPUEVSQVRPUl9FREVGQVVMVCA9IFBUUHJlZml4T3BlcmF0b3IuUExVU19MSVRFUkFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3BlcmF0b3IoKSA8ZW0+T3BlcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRQcmVmaXhPcGVyYXRvciBvcGVyYXRvciA9IE9QRVJBVE9SX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhwcmVzc2lvbigpIDxlbT5FeHByZXNzaW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBUUHJlZml4RXhwcmVzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRQcmVmaXhFeHByZXNzaW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBUUHJlZml4T3BlcmF0b3IgZ2V0T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBvcGVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcGVyYXRvcihQVFByZWZpeE9wZXJhdG9yIG5ld09wZXJhdG9yKSB7Ci0JCVBUUHJlZml4T3BlcmF0b3Igb2xkT3BlcmF0b3IgPSBvcGVyYXRvcjsKLQkJb3BlcmF0b3IgPSBuZXdPcGVyYXRvciA9PSBudWxsID8gT1BFUkFUT1JfRURFRkFVTFQgOiBuZXdPcGVyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX09QRVJBVE9SLCBvbGRPcGVyYXRvciwgb3BlcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUFRFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIG5ld0V4cHJlc3Npb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUFRFeHByZXNzaW9uIG9sZEV4cHJlc3Npb24gPSBleHByZXNzaW9uOwotCQlleHByZXNzaW9uID0gbmV3RXhwcmVzc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG9sZEV4cHJlc3Npb24sIG5ld0V4cHJlc3Npb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cHJlc3Npb24oUFRFeHByZXNzaW9uIG5ld0V4cHJlc3Npb24pIHsKLQkJaWYgKG5ld0V4cHJlc3Npb24gIT0gZXhwcmVzc2lvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZXhwcmVzc2lvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClleHByZXNzaW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0V4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RXhwcmVzc2lvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEV4cHJlc3Npb24obmV3RXhwcmVzc2lvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTiwgbmV3RXhwcmVzc2lvbiwgbmV3RXhwcmVzc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJCXJldHVybiBiYXNpY1NldEV4cHJlc3Npb24obnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0T3BlcmF0b3IoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfUFJFRklYX0VYUFJFU1NJT05fX0VYUFJFU1NJT046Ci0JCQkJcmV0dXJuIGdldEV4cHJlc3Npb24oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUjoKLQkJCQlzZXRPcGVyYXRvcigoUFRQcmVmaXhPcGVyYXRvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlzZXRFeHByZXNzaW9uKChQVEV4cHJlc3Npb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUjoKLQkJCQlzZXRPcGVyYXRvcihPUEVSQVRPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9QUkVGSVhfRVhQUkVTU0lPTl9fRVhQUkVTU0lPTjoKLQkJCQlzZXRFeHByZXNzaW9uKChQVEV4cHJlc3Npb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19PUEVSQVRPUjoKLQkJCQlyZXR1cm4gb3BlcmF0b3IgIT0gT1BFUkFUT1JfRURFRkFVTFQ7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1BSRUZJWF9FWFBSRVNTSU9OX19FWFBSRVNTSU9OOgotCQkJCXJldHVybiBleHByZXNzaW9uICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwkvLyBSZWFsbHkgd2FudCB0b1N0cmluZyB0byBiZSBmaW5hbCBhdCBQVEV4cHJlc3Npb24sIGJ1dCBFTUYgZG9lc24ndCBhbGxvdyBpdC4KLQl9Ci0KLQkvKgotCSAqICAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLkV4cHJlc3Npb25JbXBsI2FjY2VwdDAob3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUGFyc2VWaXNpdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjY2VwdDAoUGFyc2VWaXNpdG9yIHZpc2l0b3IpIHsKLQkJYm9vbGVhbiB2aXNpdENoaWxkcmVuID0gdmlzaXRvci52aXNpdCh0aGlzKTsKLQkJaWYgKHZpc2l0Q2hpbGRyZW4pIHsKLQkJCS8vIHZpc2l0IGNoaWxkcmVuIGluIG5vcm1hbCBsZWZ0IHRvIHJpZ2h0IHJlYWRpbmcgb3JkZXIKLQkJCWFjY2VwdENoaWxkKHZpc2l0b3IsIGdldEV4cHJlc3Npb24oKSk7Ci0JCX0KLQkJdmlzaXRvci5lbmRWaXNpdCh0aGlzKTsKLQl9Ci0KLX0gLy9QcmVmaXhFeHByZXNzaW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QVFN0cmluZ0xpdGVyYWxJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUU3RyaW5nTGl0ZXJhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFiMTcxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUU3RyaW5nTGl0ZXJhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVFN0cmluZ0xpdGVyYWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdHJpbmcgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFN0cmluZ0xpdGVyYWxJbXBsI2dldEVzY2FwZWRWYWx1ZSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFN0cmluZ0xpdGVyYWxJbXBsI2dldExpdGVyYWxWYWx1ZSA8ZW0+TGl0ZXJhbCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBUU3RyaW5nTGl0ZXJhbEltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRTdHJpbmdMaXRlcmFsIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXNjYXBlZFZhbHVlKCkgPGVtPkVzY2FwZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzY2FwZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNDQVBFRF9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc2NhcGVkVmFsdWUoKSA8ZW0+RXNjYXBlZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXNjYXBlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVzY2FwZWRWYWx1ZSA9IEVTQ0FQRURfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGl0ZXJhbFZhbHVlKCkgPGVtPkxpdGVyYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpdGVyYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElURVJBTF9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaXRlcmFsVmFsdWUoKSA8ZW0+TGl0ZXJhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGl0ZXJhbFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxpdGVyYWxWYWx1ZSA9IExJVEVSQUxfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRTdHJpbmdMaXRlcmFsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQVFN0cmluZ0xpdGVyYWwoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVzY2FwZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGVzY2FwZWRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFc2NhcGVkVmFsdWUoU3RyaW5nIG5ld0VzY2FwZWRWYWx1ZSkgewotCQlzdHJpbmdMaXRlcmFsU2V0ID0gZmFsc2U7Ci0JCXNldExpdGVyYWxWYWx1ZUdlbihMSVRFUkFMX1ZBTFVFX0VERUZBVUxUKTsKLQkJc2V0RXNjYXBlZFZhbHVlR2VuKG5ld0VzY2FwZWRWYWx1ZSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXNjYXBlZFZhbHVlR2VuKFN0cmluZyBuZXdFc2NhcGVkVmFsdWUpIHsKLQkJU3RyaW5nIG9sZEVzY2FwZWRWYWx1ZSA9IGVzY2FwZWRWYWx1ZTsKLQkJZXNjYXBlZFZhbHVlID0gbmV3RXNjYXBlZFZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fRVNDQVBFRF9WQUxVRSwgb2xkRXNjYXBlZFZhbHVlLCBlc2NhcGVkVmFsdWUpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3RyaW5nTGl0ZXJhbFNldDsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWxWYWx1ZSgpIHsKLQkJaWYgKCFzdHJpbmdMaXRlcmFsU2V0ICYmIGVzY2FwZWRWYWx1ZSAhPSBFU0NBUEVEX1ZBTFVFX0VERUZBVUxUKSB7Ci0JCQlTdHJpbmcgcyA9IGdldEVzY2FwZWRWYWx1ZSgpOwotCQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCQlpZiAobGVuIDwgMiB8fCBzLmNoYXJBdCgwKSAhPSAnXCInIHx8IHMuY2hhckF0KGxlbi0xKSAhPSAnXCInICkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuKTsKLQkJCWludCBzdG9wID0gbGVuLTE7Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8IHN0b3A7IGkrKykgewotCQkJCWNoYXIgYXRpID0gcy5jaGFyQXQoaSk7Ci0JCQkJaWYgKGF0aSA9PSAnXFwnKSB7Ci0JCQkJCWlmICgrK2kgPCBzdG9wKSB7Ci0JCQkJCQlhdGkgPSBzLmNoYXJBdChpKTsKLQkJCQkJCWlmIChhdGkgPT0gJ3UnKSB7Ci0JCQkJCQkJaW50IGMxID0gMCwgYzIgPSAwLCBjMyA9IDAsIGM0ID0gMDsKLQkJCQkJCQlpZiAoaSs0ID49IHN0b3AKLQkJCQkJCQkJCXx8IChjMSA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoKytpKSkpID4gMTUKLQkJCQkJCQkJCXx8IGMxIDwgMAotCQkJCQkJCQkJfHwgKGMyID0gQ2hhcmFjdGVyLmdldE51bWVyaWNWYWx1ZShzLmNoYXJBdCgrK2kpKSkgPiAxNQotCQkJCQkJCQkJfHwgYzIgPCAwCi0JCQkJCQkJCQl8fCAoYzMgPSBDaGFyYWN0ZXIuZ2V0TnVtZXJpY1ZhbHVlKHMuY2hhckF0KCsraSkpKSA+IDE1Ci0JCQkJCQkJCQl8fCBjMyA8IDAKLQkJCQkJCQkJCXx8IChjNCA9IENoYXJhY3Rlci5nZXROdW1lcmljVmFsdWUocy5jaGFyQXQoKytpKSkpID4gMTUKLQkJCQkJCQkJCXx8IGM0IDwgMCl7Ci0JCQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImlsbGVnYWwgc3RyaW5nIGxpdGVyYWwiKTsvLyROT04tTkxTLTEkCi0JCQkJCQkJfSBlbHNlCi0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQoKGNoYXIpICgoKGMxICogMTYgKyBjMikgKiAxNiArIGMzKSAqIDE2ICsgYzQpKTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbC5nZXRDaGFyRXNjYXBlZChhdGkpKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbGxlZ2FsIHN0cmluZyBsaXRlcmFsIik7Ly8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZQotCQkJCQlidWZmZXIuYXBwZW5kKGF0aSk7CQotCQkJfQotCQkJCi0JCQlzdHJpbmdMaXRlcmFsU2V0ID0gdHJ1ZTsKLQkJCXNldExpdGVyYWxWYWx1ZUdlbihidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBnZXRMaXRlcmFsVmFsdWVHZW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsVmFsdWVHZW4oKSB7Ci0JCXJldHVybiBsaXRlcmFsVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGl0ZXJhbFZhbHVlKFN0cmluZyBuZXdMaXRlcmFsVmFsdWUpIHsKLQkJc3RyaW5nTGl0ZXJhbFNldCA9IHRydWU7Ci0JCXNldExpdGVyYWxWYWx1ZUdlbihuZXdMaXRlcmFsVmFsdWUpOwotCQkKLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKG5ld0xpdGVyYWxWYWx1ZS5sZW5ndGgoKSsyKTsKLQkJYi5hcHBlbmQoJ1wiJyk7IC8vIG9wZW5pbmcgZGVsaW1pdGVyCi0JCWludCBzdG9wID0gbmV3TGl0ZXJhbFZhbHVlLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0b3A7IGkrKykgewotCQkJUFRDaGFyYWN0ZXJMaXRlcmFsSW1wbC5hcHBlbmRDaGFyYWN0ZXIobmV3TGl0ZXJhbFZhbHVlLmNoYXJBdChpKSwgYik7CQotCQl9Ci0JCWIuYXBwZW5kKCdcIicpOyAvLyBjbG9zaW5nIGRlbGltaXRlcgotCQlzZXRFc2NhcGVkVmFsdWVHZW4oYi50b1N0cmluZygpKTsKLQkJCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGl0ZXJhbFZhbHVlR2VuKFN0cmluZyBuZXdMaXRlcmFsVmFsdWUpIHsKLQkJU3RyaW5nIG9sZExpdGVyYWxWYWx1ZSA9IGxpdGVyYWxWYWx1ZTsKLQkJbGl0ZXJhbFZhbHVlID0gbmV3TGl0ZXJhbFZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9TVFJJTkdfTElURVJBTF9fTElURVJBTF9WQUxVRSwgb2xkTGl0ZXJhbFZhbHVlLCBsaXRlcmFsVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19FU0NBUEVEX1ZBTFVFOgotCQkJCXJldHVybiBnZXRFc2NhcGVkVmFsdWUoKTsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0xJVEVSQUxfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldExpdGVyYWxWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUU6Ci0JCQkJc2V0RXNjYXBlZFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0xJVEVSQUxfVkFMVUU6Ci0JCQkJc2V0TGl0ZXJhbFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19FU0NBUEVEX1ZBTFVFOgotCQkJCXNldEVzY2FwZWRWYWx1ZShFU0NBUEVEX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19MSVRFUkFMX1ZBTFVFOgotCQkJCXNldExpdGVyYWxWYWx1ZShMSVRFUkFMX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfU1RSSU5HX0xJVEVSQUxfX0VTQ0FQRURfVkFMVUU6Ci0JCQkJcmV0dXJuIEVTQ0FQRURfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGVzY2FwZWRWYWx1ZSAhPSBudWxsIDogIUVTQ0FQRURfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGVzY2FwZWRWYWx1ZSk7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1NUUklOR19MSVRFUkFMX19MSVRFUkFMX1ZBTFVFOgotCQkJCXJldHVybiBMSVRFUkFMX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBsaXRlcmFsVmFsdWUgIT0gbnVsbCA6ICFMSVRFUkFMX1ZBTFVFX0VERUZBVUxULmVxdWFscyhsaXRlcmFsVmFsdWUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotCi19IC8vU3RyaW5nTGl0ZXJhbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRUaGlzTGl0ZXJhbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRUaGlzTGl0ZXJhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1MzcwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUVGhpc0xpdGVyYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBUVGhpc0xpdGVyYWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaGlzIExpdGVyYWw8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQVFRoaXNMaXRlcmFsSW1wbCBleHRlbmRzIFBURXhwcmVzc2lvbkltcGwgaW1wbGVtZW50cyBQVFRoaXNMaXRlcmFsIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRUaGlzTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRUaGlzTGl0ZXJhbCgpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGwuRXhwcmVzc2lvbkltcGwjYWNjZXB0MChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVZpc2l0b3IpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0MChQYXJzZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCQl2aXNpdG9yLmVuZFZpc2l0KHRoaXMpOwotCX0JCi0KLX0gLy9UaGlzTGl0ZXJhbEltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRUeXBlTGl0ZXJhbEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUFRUeXBlTGl0ZXJhbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkNWI3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL1BUVHlwZUxpdGVyYWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uUFRUeXBlTGl0ZXJhbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGUgTGl0ZXJhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5QVFR5cGVMaXRlcmFsSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUFRUeXBlTGl0ZXJhbEltcGwgZXh0ZW5kcyBQVEV4cHJlc3Npb25JbXBsIGltcGxlbWVudHMgUFRUeXBlTGl0ZXJhbCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUFRUeXBlTGl0ZXJhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBJbnN0YW50aWF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UFRUeXBlTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBJbnN0YW50aWF0aW9uUGFja2FnZS5QVF9UWVBFX0xJVEVSQUxfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1RZUEVfTElURVJBTF9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfVFlQRV9MSVRFUkFMX19UWVBFOgotCQkJCXNldFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUFRfVFlQRV9MSVRFUkFMX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBUX1RZUEVfTElURVJBTF9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsJLy8gUmVhbGx5IHdhbnQgdG9TdHJpbmcgdG8gYmUgZmluYWwgYXQgUFRFeHByZXNzaW9uLCBidXQgRU1GIGRvZXNuJ3QgYWxsb3cgaXQuCi0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uaW1wbC5FeHByZXNzaW9uSW1wbCNhY2NlcHQwKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBhcnNlVmlzaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQwKFBhcnNlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JCXZpc2l0b3IuZW5kVmlzaXQodGhpcyk7Ci0JfQotfSAvL1R5cGVMaXRlcmFsSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QYXJzZVRyZWVBbGxvY2F0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3Qvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24vaW1wbC9QYXJzZVRyZWVBbGxvY2F0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmI1Y2M3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmltcGw7Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLlBURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QYXJzZVRyZWVBbGxvY2F0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyc2UgVHJlZSBBbGxvY2F0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5pbXBsLlBhcnNlVHJlZUFsbG9jYXRpb25JbXBsI2dldEV4cHJlc3Npb24gPGVtPkV4cHJlc3Npb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZVRyZWVBbGxvY2F0aW9uSW1wbCBleHRlbmRzIEphdmFBbGxvY2F0aW9uSW1wbCBpbXBsZW1lbnRzIFBhcnNlVHJlZUFsbG9jYXRpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4cHJlc3Npb24oKSA8ZW0+RXhwcmVzc2lvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBURXhwcmVzc2lvbiBleHByZXNzaW9uID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQYXJzZVRyZWVBbGxvY2F0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEluc3RhbnRpYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQYXJzZVRyZWVBbGxvY2F0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBURXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFeHByZXNzaW9uKFBURXhwcmVzc2lvbiBuZXdFeHByZXNzaW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVBURXhwcmVzc2lvbiBvbGRFeHByZXNzaW9uID0gZXhwcmVzc2lvbjsKLQkJZXhwcmVzc2lvbiA9IG5ld0V4cHJlc3Npb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTiwgb2xkRXhwcmVzc2lvbiwgbmV3RXhwcmVzc2lvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwcmVzc2lvbihQVEV4cHJlc3Npb24gbmV3RXhwcmVzc2lvbikgewotCQlpZiAobmV3RXhwcmVzc2lvbiAhPSBleHByZXNzaW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChleHByZXNzaW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4cHJlc3Npb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT04sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0V4cHJlc3Npb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RXhwcmVzc2lvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFeHByZXNzaW9uKG5ld0V4cHJlc3Npb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OLCBuZXdFeHByZXNzaW9uLCBuZXdFeHByZXNzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBJbnN0YW50aWF0aW9uUGFja2FnZS5QQVJTRV9UUkVFX0FMTE9DQVRJT05fX0VYUFJFU1NJT046Ci0JCQkJCXJldHVybiBiYXNpY1NldEV4cHJlc3Npb24obnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIEluc3RhbnRpYXRpb25QYWNrYWdlLlBBUlNFX1RSRUVfQUxMT0NBVElPTl9fRVhQUkVTU0lPTjoKLQkJCQlyZXR1cm4gZ2V0RXhwcmVzc2lvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OOgotCQkJCXNldEV4cHJlc3Npb24oKFBURXhwcmVzc2lvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OOgotCQkJCXNldEV4cHJlc3Npb24oKFBURXhwcmVzc2lvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgSW5zdGFudGlhdGlvblBhY2thZ2UuUEFSU0VfVFJFRV9BTExPQ0FUSU9OX19FWFBSRVNTSU9OOgotCQkJCXJldHVybiBleHByZXNzaW9uICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRFeHByZXNzaW9uKCkgIT0gbnVsbCA/IGdldEV4cHJlc3Npb24oKS50b1N0cmluZygpIDogc3VwZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNlVHJlZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19IC8vUGFyc2VUcmVlQWxsb2NhdGlvbkltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL2phdmFpbnN0L29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uL2ltcGwvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNiNDRhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9qYXZhaW5zdC9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi9pbXBsL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotTmFpdmVFeHByZXNzaW9uRmxhdHRlbmVyX0ludmFsaWRFeHByZXNzaW9uPSBpbnZhbGlkOiAiezB9IgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvaW5zdGFuY2UuZWNvcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9pbnN0YW5jZS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0ZmY5Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9pbnN0YW5jZS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJpbnN0YW50aWF0aW9uIgotICAgIG5zVVJJPSJodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24iPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSmF2YSBJbnN0YW50aWF0aW9uIFBhY2thZ2UiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUphdmFEYXRhVHlwZUluc3RhbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2UiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vSUphdmFJbnN0YW5jZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IklKYXZhSW5zdGFuY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhSW5zdGFuY2UiCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSUphdmFPYmplY3RJbnN0YW5jZSIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFPYmplY3RJbnN0YW5jZSIKLSAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9JSmF2YUluc3RhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGludGVyZmFjZSBpcyB0aGUgaW5zdGFuY2Ugb2YgYW4gamF2YSBvYmplY3QgaW4gdGhlIGphdmEgbW9kZWwuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFBbGxvY2F0aW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyBpcyB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiB0aGUgYWxsb2NhdGlvbiBjbGFzcy4gSXQgaXMgdGhlIHZhbHVlIG9mIHRoZSAmcXVvdDthbGxvY2F0aW9uJnF1b3Q7IHByb3BlcnR5IG9uIGEgSmF2YSBPYmplY3Qgc28gdGhhdCB0aGUgYWN0dWFsIGFsbG9jYXRpb24gY2FuIGJlIGNvbnRyb2xsZWQuIEZvciBleGFtcGxlLCB0aGVyZSBjb3VsZCBiZSBvbmUgZm9yIGp1c3QgaW5pdCBzdHJpbmcsIG9yIG9uZSBmb3Igc2VyaWFsaXplZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW5pdFN0cmluZ0FsbG9jYXRpb24iIGVTdXBlclR5cGVzPSIjLy9KYXZhQWxsb2NhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGFsbG9jYXRpb24gc3RyaW5nIGNhbiBiZSBwYXJzZWQgYnkgdGhlIHJlbW90ZSB2bS4gSXQgdXNlcyB0aGUgYWxsb2NTdHJpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluaXRTdHJpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcgZm9yIHRoaXMgb2JqZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbXBsaWNpdEFsbG9jYXRpb24iIGVTdXBlclR5cGVzPSIjLy9KYXZhQWxsb2NhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjbGFzcyBpcyBmb3IgYW4gaW1wbGljaXQgYWxsb2NhdGlvbiB3aGVyZSB0aGUgb2JqZWN0IGNvbWVzIGZyb20gdGhlIGZlYXR1cmUgb2YgYW5vdGhlciBvYmplY3QuIEl0IGlzIHRoZSBsaXZlIEphdmEgdmFsdWUgZnJvbSB0aGUgcmVtb3RlIHZtLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJlbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmZWF0dXJlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJ1Y3R1cmFsRmVhdHVyZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYXJzZVRyZWVBbGxvY2F0aW9uIiBlU3VwZXJUeXBlcz0iIy8vSmF2YUFsbG9jYXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFsbG9jYXRpb25zIHZpYSBQYXJzZSBUcmVlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhwcmVzc2lvbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRFeHByZXNzaW9uIiBhYnN0cmFjdD0idHJ1ZSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQXJyYXlBY2Nlc3MiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFycmF5IGFjY2Vzcy4gZS5nLiB4WzNdLiAmI3hEOyYjeEE7JiN4RDsmI3hBO1VubGlrZSBBU1QsIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiBvZiB0eXBlIHhbM11bNF0gd2lsbCBiZSBkb25lIGluIG9uZSBleHByZXNzaW9uIHJhdGhlciB0aGFuIGhhdmluZyBhIHNlcGFyYXRlIEFycmF5QWNjZXNzIGZvciBlYWNoIGRpbWVuc2lvbi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxpZmljYXRpb24uIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBpZiBpdCBpcyBhIHNpbXBsZSBhcnJheSBhY2Nlc3Mgd2hlcmUgaXQgaXMgb2YgdGhlIGZvcm0ge2V4cHJlc3Npb259W2V4cHJlc3Npb25dW2V4cHJlc3Npb25dLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhcnJheSIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGFycmF5IHRvIGFjY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5kZXhlcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4cHJlc3Npb25zIHJlcHJlc2VudGluZyB0aGUgaW5kZXhlcyBvZiB0aGUgYWNjZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEFycmF5Q3JlYXRpb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFycmF5IENyZWF0aW9uIGV4cHJlc3Npb24sIGUuZy4gbmV3IGludFszXSBvciBuZXcgamF2YS5sYW5nU3RyaW5nW11bXSB7eyZxdW90O2EmcXVvdDt9LCB7JnF1b3Q7YiZxdW90O319Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZnVsbHktcXVhbGlmaWVkIHR5cGUsIGUuZy4gaW50W11bXSBvciBqYXZhLmxhbmcuU3RyaW5nW10sIGluY2x1ZGluZyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbiBicmFja2V0cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGltZW5zaW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgZm9yIHRoZSBkaW1lbnNpb25zLiBZb3UgY2FuIGhhdmUgWzNdWzRdW10gYnV0IFtdWzMzXSBpcyBpbnZhbGlkLiBTbyBmb3IgZWFjaCBkaW1lbnNpb24gdGhhdCBoYXMgYW4gZXhwcmVzc2lvbiwgdGhlcmUgd2lsbCBiZSBhbiBlbnRyeSBpbiB0aGUgbGlzdCwgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIFdoZW4geW91IHJlYWNoIHRoZSBlbXB0eSBkaW1lbnNpb25zLCB0aGUgbGlzdCB3aWxsIGVuZCB0b28uICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbml0aWFsaXplciIgZVR5cGU9IiMvL1BUQXJyYXlJbml0aWFsaXplciIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBpbml0aWFsaXplciwgaWYgYW55LCBmb3IgdGhpcyBhcnJheS4gRS5nLiBuZXcgaW50W10gezIsM30uIEl0IGlzIHRoZSB7MiwzfS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRBcnJheUluaXRpYWxpemVyIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBcnJheSBpbml0aWFsaXphdGlvbiBleHByZXNzaW9uLiBUaGlzIGlzIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiwgZS5nLiB7MiwgM30sIG9yIHt7MiwzfSwgNH0uIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlIHsyLDN9IHdpbGwgYmUgYW4gQXJyYXlJbml0aWFsaXplciBjb250YWluZWQgd2l0aGluIHRoZSBleHByZXNzaW9ucyBsaXN0IGZvciB0aGUgdG9wIEFycmF5SW5pdGlhbGl6ZXIuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4cHJlc3Npb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzdGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgd2l0aGluIHRoZSBpbml0aWFsaXplciwgZS5nLiB7MiwgM30sIG9yIHt7MiwzfSwgNH0uIEluIHRoZSBmaXJzdCBjYXNlIGl0IHdpbGwgYmUgdHdvIE51bWJlckxpdGVyYWxzLiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSB7MiwzfSB3aWxsIGJlIGFuIEFycmF5SW5pdGlhbGl6ZXIsIGZvbGxvd2VkIGJ5IGEgTnVtYmVyTGl0ZXJhbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRCb29sZWFuTGl0ZXJhbCIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyByZXByZXNlbnRzIGEgcHJpbWl0aXZlIGJvb2xlYW4gbGl0ZXJhbCwgaS5lLiB0cnVlIG9yIGZhbHNlIGRpcmVjdGx5IGluIHRoZSBjb2RlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib29sZWFuVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIHRoZSBsaXRlcmFsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVENhc3RFeHByZXNzaW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDYXN0IGV4cHJlc3Npb24sIGUuZy4gKHNob3J0KSAxMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB0aGUgZnVsbHktcXVhbGlmaWVkIHR5cGUgb2YgdGhlIGNhc3QsIGUuZy4gaW50IG9yIGphdmEubGFuZy5TdHJpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhwcmVzc2lvbiIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZXhwcmVzc2lvbiBiZWluZyBjYXN0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUQ2hhcmFjdGVyTGl0ZXJhbCIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyByZXByZXNlbnRzIGEgcHJpbWl0aXZlIGNoYXJhY3RlciBleHByZXNzaW9uLCBlLmcuICdhJyBvciAnXHInLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc2NhcGVkVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4gSW4gb3RoZXIgd29yZHMgdGhlIGxpdGVyYWwgZXhhY3RseSBhcyBpdCBpcyBpbiB0aGUgamF2YSBmaWxlLiBFLmcuICdhJyBvciAnXHInLiBJbmNsdWRpbmcgdGhlIHN1cnJvdW5kaW5nIHNpbmdsZSBxdW90ZXMgdGhlbXNlbHZlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhclZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQ2hhciIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBwcmltaXRpdmUgY2hhcmFjdGVyIHdpdGhvdXQgdGhlIHF1b3Rlcy4gRXNjYXBlIGFyZSBldmFsdWF0ZWQgYW5kIHR1cm5lZCBpbnRvIHRoZWlyIGNoYXJhY3RlciB2YWx1ZS4gVGhpcyBpcyBhIHRyYW5zaWVudCBmaWVsZC4gSWYgbm90IHNldCB3aGVuIGNyZWF0ZWQgd2hlbiBxdWVyaWVkIGl0IHdpbGwgY3JlYXRlIGl0LiBUeXBpY2FsbHkgaXQgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGVkIGZyb20gYW4gQVNUIG5vZGUgc2luY2UgdGhlIG5vZGUgYWxyZWFkeSBoYXMgZXZhbHVhdGVkIGl0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbi4gRS5nLiBuZXcgU3RyaW5nKCZxdW90O2EmcXVvdDspIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSB0eXBlIG9mIHRoZSBjbGFzcy4gRS5nLiBqYXZhLmxhbmcuU3RyaW5nLiBUaGlzIHNob3VsZCBiZSBmdWxseS1xdWFsaWZpZWQgZm9yIGFsbG9jYXRpb24gcHVycG9zZXMuIEl0IHNob3VsZCBhbHNvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIGlmIFggaXMgYW4gaW5uZXIgY2xhc3Mgb2Ygai5ZLCB0aGVuIHRoZSB0eXBlIGhlcmUgc2hvdWxkIGJlICZxdW90O2ouWSRYJnF1b3Q7LiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXJndW1lbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYXJndW1lbnRzIHRvIHRoZSBjb25zdHJ1Y3Rvci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRDb25kaXRpb25hbEV4cHJlc3Npb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0ZXN0IEV4cHJlc3NvbiwgZS5nLiAoeD0zKSA/IDEgOiAyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmRpdGlvbiIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29uZGl0aW9uIGV4cHJlc3Npb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRydWUiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRydWUgZXhwcmVzc2lvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmYWxzZSIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmFsc2UgZXhwcmVzc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRGaWVsZEFjY2VzcyIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQWNjZXNzIGEgZmllbGQgZXhwcmVzc2lvbiwgZS5nLiBqYXZhLmF3dC5Db2xvci5yZWQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVjZWl2ZXIiIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBvYmplY3QgdGhhdCB0aGUgZmllbGQgaXMgaW4sIGUuZy4gamF2YS5hd3QuQ29sb3IuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIGFjY2Vzc2VkLCBlLmcuIHJlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRJbmZpeEV4cHJlc3Npb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4cHJlc3Npb24gd2l0aCBhbiBvcGVyYXRvciB0aGF0IGhhcyB0d28gb3BlcmFuZHMsIGUuZy4gMyArIDQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxlZnRPcGVyYW5kIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcGVyYXRvciIgZVR5cGU9IiMvL1BUSW5maXhPcGVyYXRvciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvcGVyYXRvciwgZS5nLiArIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJpZ2h0T3BlcmFuZCIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmlnaHQgZXhwcmVzc2lvbi4gaS5lLiA0IG9mICZxdW90OzMgKyA0JnF1b3Q7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkT3BlcmFuZHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIiBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVzZWQgd2hlbiB0aGVyZSBhcmUgYSBzZXJpZXMgb2YgaW5maXggb3BlcmF0aW9ucyBvZiB0aGUgc2FtZSBvcGVyYXRvciwgZS5nLiAxICsgMiArIDMgKyA0LiAxIGFuZCAyIHdpbGwgZ28gaW50byBsZWZ0IGFuZCByaWdodCwgd2hpbGUgezMsIDR9IHdpbGwgZ28gaW50byB0aGUgZXh0ZW5kZWQgb3BlcmFuZHMuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlBUSW5maXhPcGVyYXRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRW51bWVyYXRvciBmb3IgdGhlIG9wZXJhdG9yIG9uIGFuIEluZml4RXhwcmVzc2lvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlRJTUVTIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iKiBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJESVZJREUiIHZhbHVlPSIxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iLyBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSRU1BSU5ERVIiIHZhbHVlPSIyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJSBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJQTFVTIiB2YWx1ZT0iMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Iisgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTUlOVVMiIHZhbHVlPSI0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iLSBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJMRUZUX1NISUZUIiB2YWx1ZT0iNSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiZsdDsmbHQ7IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJJR0hUX1NISUZUX1NJR05FRCIgdmFsdWU9IjYiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSI+PiBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJSSUdIVF9TSElGVF9VTlNJR05FRCIgdmFsdWU9IjciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSI+Pj4gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTEVTUyIgdmFsdWU9IjgiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImbHQ7ICBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJHUkVBVEVSIiB2YWx1ZT0iOSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ij4gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTEVTU19FUVVBTFMiIHZhbHVlPSIxMCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiZsdDs9IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkdSRUFURVJfRVFVQUxTIiB2YWx1ZT0iMTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSI+PSBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJFUVVBTFMiIHZhbHVlPSIxMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ij09IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PVF9FUVVBTFMiIHZhbHVlPSIxMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiE9IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlhPUiIgdmFsdWU9IjE0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iXiBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJBTkQiIHZhbHVlPSIxNSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiZhbXA7IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9SIiB2YWx1ZT0iMTYiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJ8ICBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDT05ESVRJT05BTF9BTkQiIHZhbHVlPSIxNyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiZhbXA7JmFtcDsgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ09ORElUSU9OQUxfT1IiIHZhbHVlPSIxOCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Inx8IG9wZXJhdG9yIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRJbnN0YW5jZW9mIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJbnN0YW5jZW9mIGV4cHJlc3Npb24sIGUuZy4geCBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3BlcmFuZCIgZVR5cGU9IiMvL1BURXhwcmVzc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgdG8gdGVzdCwgZS5nLiB4IGluIHggaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgdGVzdCwgZS5nLiBqYXZhLmxhbmcuU3RyaW5nLiBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4gSWYgaXQgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG5lZWRzIHRvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIFkgaXMgaW5uZXIgY2xhc3Mgb2Ygai5YLCB0aGVuIGEgcmVmZXJlbmNlIHRvIFkgbXVzdCBiZSBqLlgkWS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRNZXRob2RJbnZvY2F0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJNZXRob2RJbnZvY2F0aW9uIGV4cHJlc3Npb24sIGUuZy4geC5nZXRZKDMpIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlY2VpdmVyIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldobyB0aGUgbWV0aG9kIGlzIGludm9rZWQgYWdhaW5zdC4gVGhpcyBtYXkgYmUgbm90IHNldCwgd2hpY2ggbWVhbnMgJnF1b3Q7dGhpcyZxdW90Oy4gSXQgbWF5IGFsc28gYmUgYSBOYW1lLCB3aGljaCB3b3VsZCBtZWFuIGEgY2xhc3MgbGlrZSAmcXVvdDtqYXZhLmxhbmcuU3RyaW5nJnF1b3Q7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGludm9rZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFyZ3VtZW50cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxpc3Qgb2YgYXJndW1lbnRzLCBpZiBhbnksIHRvIHRoZSBtZXRob2QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUTmFtZSIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyByZXByZXNlbnRzIGEgbmFtZS4gVGhpcyBjYW4gaGFwcGVuIGZvciB0aGUgcmVjZWl2ZXIgb2YgYSBtZXRob2QgaW52b2NhdGlvbiwgZS5nLiB4LmdldFkoKSBvciBqYXZhLmxhbmcuU3RyaW5nLnZhbHVlT2YoMTApLiBJbiB0aGVzZSBjYXNlcyB5b3Ugd291bGQgaGF2ZSBhIG5hbWUgb2YgJnF1b3Q7eCZxdW90OyBvciAmcXVvdDtqYXZhLmxhbmcuU3RyaW5nJnF1b3Q7LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUsIHdoaWNoIGNhbiBiZSBhIHR5cGUgb3IgYSB2YXJpYWJsZS4gSWYgaXQgaXMgYSB0eXBlLCB0aGVuICBpdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4gSWYgaXQgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG5lZWRzIHRvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIFkgaXMgaW5uZXIgY2xhc3Mgb2Ygai5YLCB0aGVuIGEgcmVmZXJlbmNlIHRvIFkgbXVzdCBiZSBqLlgkWS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFROdWxsTGl0ZXJhbCIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwcmVzZW50cyB0aGUgZXhwcmVzc2lvbiAmcXVvdDtudWxsJnF1b3Q7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUTnVtYmVyTGl0ZXJhbCIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmVwcmVzZW50IGEgbnVtYmVyIHByaW1pdGl2ZSBsaXRlcmFsLCBlLmcuIDEwLiBPbmUgb3B0aW1pemF0aW9uIHRoYXQgd2lsbCBiZSBwZXJmb3JtZWQgaXMgdGhhdCBpZiBhbiBleHByZXNzaW9uIGlzIG9mIHRoZSBmb3JtICtudW1iZXIgb3IgLW51bWJlciwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbSBhIFByZWZpeEV4cHJlc3Npb24gd2l0aCBhIE51bWJlckxpdGVyYWwgdG8ganVzdCBhIE51bWJlckxpdGVyYWwuIFRoaXMgd2lsbCBzaW1wbGlmeSB0aGUgbW9kZWwuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRva2VuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRva2VuIHZhbHVlLCBlLmcuIDEwLCAxMGQsIG9yIC0xMC43NSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBleHByZXNzaW9uIHdpdGhpbiBwYXJlbnRoZXNpcywgZS5nLiAoeCszKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHByZXNzaW9uIiBlVHlwZT0iIy8vUFRFeHByZXNzaW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHByZXNzaW9uIHdyYXBwZWQgYnkgdGhlIHBhcmVudGhlc2lzLCBlLmcuICh4KzMpIHRoZW4gdGhlIGV4cHJlc3Npb24gaXMgJnF1b3Q7eCszJnF1b3Q7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUUHJlZml4RXhwcmVzc2lvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBvbmUgb3BlcmFuZCBvcGVyYXRvciwgd2hlcmUgdGhlIG9wZXJhdG9yIGNvbWVzIGJlZm9yZSB0aGUgb3BlcmFuZCwgZS5nLiAtICh4KzMpLiBJbiBBU1QsIGV2ZW4gLTMgaXMgbW9kZWxlZCBhcyBhIFByZWZpeEV4cHJlc3Npb24gb2Ygb3BlcmF0b3IgJnF1b3Q7LSZxdW90OyBhbmQgZXhwcmVzc2lvbiBvZiBOdW1iZXJMaXRlcmFsKDMpLiBCdXQgd2Ugb3B0aW1pemUgdGhpcyBhd2F5IGFuZCBqdXN0IHVzZSBhIE51bWJlckxpdGVyYWwoLTMpIGRpcmVjdGx5IGluc3RlYWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9wZXJhdG9yIiBlVHlwZT0iIy8vUFRQcmVmaXhPcGVyYXRvciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvcGVyYXRvciBvZiB0aGlzIGV4cHJlc3Npb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4cHJlc3Npb24iIGVUeXBlPSIjLy9QVEV4cHJlc3Npb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4cHJlc3Npb24gdGhhdCB0aGUgb3BlcmF0b3IgaXMgYXBwbGllZCB0by4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJQVFByZWZpeE9wZXJhdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJlZml4IGV4cHJlc3Npb24gb3BlcmF0b3IuIFdlIGFyZSBub3QgbW9kZWxpbmcgKysgYW5kIC0tLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUExVUyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Iisgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTUlOVVMiIHZhbHVlPSIxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iLSBvcGVyYXRvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDT01QTEVNRU5UIiB2YWx1ZT0iMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9In4gb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTk9UIiB2YWx1ZT0iMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiEgb3BlcmF0b3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVFN0cmluZ0xpdGVyYWwiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nIGxpdGVyYWwsIGUuZy4gJnF1b3Q7YXNkZiZxdW90Oy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXNjYXBlZFZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB0aGUgZXNjYXBlZCBzdHJpbmcuIEluIG90aGVyIHdvcmRzIHRoZSBsaXRlcmFsIGV4YWN0bHkgYXMgaXQgaXMgaW4gdGhlIGphdmEgZmlsZS4gRS5nLiAmcXVvdDthYiZxdW90OyBvciAmcXVvdDtjXHImcXVvdDsuIEluY2x1ZGluZyB0aGUgc3Vycm91bmRpbmcgcXVvdGVzIHRoZW1zZWx2ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpdGVyYWxWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBzdHJpbmcgd2l0aG91dCB0aGUgcXVvdGVzLiBFc2NhcGUgYXJlIGV2YWx1YXRlZCBhbmQgdHVybmVkIGludG8gdGhlaXIgY2hhcmFjdGVyIHZhbHVlLiBUaGlzIGlzIGEgdHJhbnNpZW50IGZpZWxkLiBJZiBub3Qgc2V0IHdoZW4gY3JlYXRlZCB3aGVuIHF1ZXJpZWQgaXQgd2lsbCBjcmVhdGUgaXQuIFR5cGljYWxseSBpdCB3aWxsIGJlIHNldCB3aGVuIGNyZWF0ZWQgZnJvbSBhbiBBU1Qgbm9kZSBzaW5jZSB0aGUgbm9kZSBhbHJlYWR5IGhhcyBldmFsdWF0ZWQgaXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUVGhpc0xpdGVyYWwiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJlcHJlc2VudHMgJnF1b3Q7dGhpcyZxdW90OywgZS5nLiB0aGlzLmdldFgoKSB3aWxsIGJlIGEgTWV0aG9kSW52b2NhdGlvbiB3aXRoIHRoZSByZWNlaXZlciBiZWluZyBhIFRoaXNMaXRlcmFsLiBXZSBjYW4ndCBoYW5kbGUgdGhlIGZvcm1hdCBYWVoudGhpcyBiZWNhdXNlIHRoYXQgaXMgZm9yIGlubmVyIGNsYXNzZXMgYW5kIHdlIGRvbid0IHN1cHBvcnQgdGhhdCByaWdodCBub3cuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBUVHlwZUxpdGVyYWwiIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgcmVwcmVzZW50cyBhIGxpdGVyYWwgb2YgdGhlIGZvcm0gai5YWVouY2xhc3MuIEZvciBpbnN0YW5jZSBpbiBhIG1ldGhvZCBpbnZvY2F0aW9uIHguZ2V0WChqWFlaLmNsYXNzKSB0aGUgYXJndW1lbnQgd2lsbCBiZSBhIFR5cGVMaXRlcmFsLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgdGhlIGxpdGVyYWwuICBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4gSWYgaXQgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG5lZWRzIHRvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIFkgaXMgaW5uZXIgY2xhc3Mgb2Ygai5YLCB0aGVuIGEgcmVmZXJlbmNlIHRvIFkgbXVzdCBiZSBqLlgkWS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUFRJbnZhbGlkRXhwcmVzc2lvbiIgZVN1cGVyVHlwZXM9IiMvL1BURXhwcmVzc2lvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBzb21lIGV4cHJlc3Npb24gd2UganVzdCBjYW4ndCBldmFsdWF0ZSBmb3Igb3VyIHB1cnBvc2VzLiBJdCBhbGxvd3MgdXMgdG8gdGVsbCB0aGUgZXZhbHVhdGlvbiB3aGF0IGlzIGFjdHVhbGx5IHdyb25nLiBJdCBzaG91bGQgYmUgcGxhY2VkIGFzIHRoZSByb290IGV4cHJlc3Npb24gdG8gcHJldmVudCBwcm9jZXNzaW5nIG11Y2ggb2YgdGhlIHRyZWUgYW5kIHRoZW4gZmluYWxseSBmYWlsLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXNzYWdlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBtZXNzYWdlIGFzIHRvIHdoeSBpdCBpcyBpbnZhbGlkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEluc3RhbmNlUmVmZXJlbmNlIiBlU3VwZXJUeXBlcz0iIy8vUFRFeHByZXNzaW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vSUphdmFJbnN0YW5jZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9QVEV4cHJlc3Npb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFub255bW91cyBjbGFzcyBkZWNsYXJhdGlvbi4gQ3VycmVudGx5IHdlIG9ubHkgc3RvcmUgdGhlICYjeEQ7JiN4QTtlbnRpcmUgZGVjbGFyYXRpb24gYXMgYSBzdHJpbmcsIGluY2x1ZGluZyB0aGUgJnF1b3Q7bmV3IEFDbGFzcygpIHsuLi59JnF1b3Q7LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWNsYXJhdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWNsYXJhdGlvbiB0ZXh0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBvcnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBpcyB0aGUgaW1wb3J0cyBuZWVkZWQgaW4gdGhlIG1haW4gY2xhc3MgYnkgdGhpcyBkZWNsYXJhdGlvbi4gVGhpcyBpcyBhIHRyYW5zaWVudCBhdHRyaWJ1dGUuIEl0IGlzIG5vdCBzZXJpYWxpemVkLCBub3IgaXMgaXQgcGFyc2VkIGludG8gZnJvbSBleGlzdGluZyBjb2RlLiBJdHMgb25seSBwdXJwb3NlIGlzIHRvIGhlbHAgY29kZSBnZW5lcmF0aW9uIG9uIGEgYnJhbmQgbmV3IGRlY2xhcmF0aW9uIHRvIGtub3cgd2hhdCBpbXBvcnRzIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgbWFpbiBjbGFzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvaW5zdGFuY2UuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9pbnN0YW5jZS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFjNzY0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2RlbC9pbnN0YW5jZS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qZW0vamF2YWluc3QiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmplbS5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuamVtLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0iIiBtb2RlbE5hbWU9Imluc3RhbmNlIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLnByb3ZpZGVyLmluc3RhbmNlRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24ucHJlc2VudGF0aW9uLmluc3RhbmNlRWRpdG9yUGx1Z2luIgotICAgIHVwZGF0ZUNsYXNzcGF0aD0iZmFsc2UiIGJvb2xlYW5GbGFnc0ZpZWxkPSJlRmxhZ3MiIGJvb2xlYW5GbGFnc1Jlc2VydmVkQml0cz0iOCIKLSAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIucm9zZSIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZSI+Ci0gIDxmb3JlaWduTW9kZWw+Li5ccm9zZVxpbnN0YW5jZS5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5Xb3Jrc3BhY2VSb290PC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+Li4vLi48L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iSW5zdGFudGlhdGlvbiIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbCIgYWRhcHRlckZhY3Rvcnk9ImZhbHNlIgotICAgICAgZWNvcmVQYWNrYWdlPSJpbnN0YW5jZS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvciI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL1RJTUVTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0RJVklERSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9SRU1BSU5ERVIiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvUExVUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9NSU5VUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9MRUZUX1NISUZUIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL1JJR0hUX1NISUZUX1NJR05FRCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9SSUdIVF9TSElGVF9VTlNJR05FRCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9MRVNTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0dSRUFURVIiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvTEVTU19FUVVBTFMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvR1JFQVRFUl9FUVVBTFMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvRVFVQUxTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL05PVF9FUVVBTFMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvWE9SIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeE9wZXJhdG9yL0FORCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9PUiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhPcGVyYXRvci9DT05ESVRJT05BTF9BTkQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4T3BlcmF0b3IvQ09ORElUSU9OQUxfT1IiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09Imluc3RhbmNlLmVjb3JlIy8vUFRQcmVmaXhPcGVyYXRvciI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRQcmVmaXhPcGVyYXRvci9QTFVTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Imluc3RhbmNlLmVjb3JlIy8vUFRQcmVmaXhPcGVyYXRvci9NSU5VUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUUHJlZml4T3BlcmF0b3IvQ09NUExFTUVOVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJpbnN0YW5jZS5lY29yZSMvL1BUUHJlZml4T3BlcmF0b3IvTk9UIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL0lKYXZhRGF0YVR5cGVJbnN0YW5jZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vSUphdmFJbnN0YW5jZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vSUphdmFPYmplY3RJbnN0YW5jZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL0luaXRTdHJpbmdBbGxvY2F0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL0luaXRTdHJpbmdBbGxvY2F0aW9uL2luaXRTdHJpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9JbXBsaWNpdEFsbG9jYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vSW1wbGljaXRBbGxvY2F0aW9uL3BhcmVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vSW1wbGljaXRBbGxvY2F0aW9uL2ZlYXR1cmUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QYXJzZVRyZWVBbGxvY2F0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QYXJzZVRyZWVBbGxvY2F0aW9uL2V4cHJlc3Npb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEV4cHJlc3Npb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUQXJyYXlBY2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUQXJyYXlBY2Nlc3MvYXJyYXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEFycmF5QWNjZXNzL2luZGV4ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEFycmF5Q3JlYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRBcnJheUNyZWF0aW9uL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVEFycmF5Q3JlYXRpb24vZGltZW5zaW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUQXJyYXlDcmVhdGlvbi9pbml0aWFsaXplciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUQXJyYXlJbml0aWFsaXplciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRBcnJheUluaXRpYWxpemVyL2V4cHJlc3Npb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRCb29sZWFuTGl0ZXJhbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVEJvb2xlYW5MaXRlcmFsL2Jvb2xlYW5WYWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUQ2FzdEV4cHJlc3Npb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRDYXN0RXhwcmVzc2lvbi90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRDYXN0RXhwcmVzc2lvbi9leHByZXNzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRDaGFyYWN0ZXJMaXRlcmFsIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUQ2hhcmFjdGVyTGl0ZXJhbC9lc2NhcGVkVmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUQ2hhcmFjdGVyTGl0ZXJhbC9jaGFyVmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVENsYXNzSW5zdGFuY2VDcmVhdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVENsYXNzSW5zdGFuY2VDcmVhdGlvbi90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRDbGFzc0luc3RhbmNlQ3JlYXRpb24vYXJndW1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRDb25kaXRpb25hbEV4cHJlc3Npb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uL2NvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUQ29uZGl0aW9uYWxFeHByZXNzaW9uL3RydWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVENvbmRpdGlvbmFsRXhwcmVzc2lvbi9mYWxzZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BURmllbGRBY2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BURmllbGRBY2Nlc3MvcmVjZWl2ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BURmllbGRBY2Nlc3MvZmllbGQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEluZml4RXhwcmVzc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeEV4cHJlc3Npb24vbGVmdE9wZXJhbmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUSW5maXhFeHByZXNzaW9uL29wZXJhdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeEV4cHJlc3Npb24vcmlnaHRPcGVyYW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRJbmZpeEV4cHJlc3Npb24vZXh0ZW5kZWRPcGVyYW5kcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUSW5zdGFuY2VvZiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRJbnN0YW5jZW9mL29wZXJhbmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUSW5zdGFuY2VvZi90eXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRNZXRob2RJbnZvY2F0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVE1ldGhvZEludm9jYXRpb24vcmVjZWl2ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUTWV0aG9kSW52b2NhdGlvbi9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRNZXRob2RJbnZvY2F0aW9uL2FyZ3VtZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUTmFtZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVE5hbWUvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUTnVsbExpdGVyYWwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUTnVtYmVyTGl0ZXJhbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVE51bWJlckxpdGVyYWwvdG9rZW4iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgaW5zdGFuY2UuZWNvcmUjLy9QVFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uL2V4cHJlc3Npb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVFByZWZpeEV4cHJlc3Npb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRQcmVmaXhFeHByZXNzaW9uL29wZXJhdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGluc3RhbmNlLmVjb3JlIy8vUFRQcmVmaXhFeHByZXNzaW9uL2V4cHJlc3Npb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVFN0cmluZ0xpdGVyYWwiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRTdHJpbmdMaXRlcmFsL2VzY2FwZWRWYWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRTdHJpbmdMaXRlcmFsL2xpdGVyYWxWYWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUVGhpc0xpdGVyYWwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJpbnN0YW5jZS5lY29yZSMvL1BUVHlwZUxpdGVyYWwiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRUeXBlTGl0ZXJhbC90eXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRJbnZhbGlkRXhwcmVzc2lvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgaW5zdGFuY2UuZWNvcmUjLy9QVEludmFsaWRFeHByZXNzaW9uL21lc3NhZ2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iaW5zdGFuY2UuZWNvcmUjLy9QVEluc3RhbmNlUmVmZXJlbmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBpbnN0YW5jZS5lY29yZSMvL1BUSW5zdGFuY2VSZWZlcmVuY2UvcmVmZXJlbmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Imluc3RhbmNlLmVjb3JlIy8vUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBpbnN0YW5jZS5lY29yZSMvL1BUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbi9kZWNsYXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGluc3RhbmNlLmVjb3JlIy8vUFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uL2ltcG9ydHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmEuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmOGFhMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJqYXZhIgotICAgIG5zVVJJPSJqYXZhLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmplbS5qYXZhIj4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNoYW5nZXMgdG8gc3luY2ggdXAgd2l0aCBKYXZhM2U6JiN4RDsmI3hBOy0gZGVsZXRlZCBKYXZhRWxlbWVudCwgQm9keUVsZW1lbnQgd2hpY2ggZGlkbid0IGFkZCBhbnl0aGluZyB1c2VmdWwmI3hEOyYjeEE7LSBkZWxldGVkIE5lc3RlZENsYXNzIGFuZCB0aGUgYXNzb2NpYXRpb24gd2hpY2ggZGVzY3JpYmVkIG5lc3RpbmcsIGNvbnRlbnRzIGNhbiBiZSB1c2VkIGluc3RlYWQmI3hEOyYjeEE7LSBkZWxldGVkIGV4dGVuZHMvZXh0ZW5kZWRCeSB3aGljaCBpcyByZXBsYWNlZCB3aXRoIE1PRiBzdWJ0eXBlL3N1cGVydHlwZSYjeEQ7JiN4QTstIGRlbGV0ZWQgdGhlIGNsdW1zeSBtYWluIGRpYWdyYW0mI3hEOyYjeEE7LSBtb3ZlZCB0aGUgTU9GIGluaGVyaXRhbmNlIGRldGFpbHMgdG8gdGhlIE1PRiBiaW5kaW5nIGRpYWdyYW0mI3hEOyYjeEE7LSBkZWxldGVkICZxdW90O2ZpbmFsJnF1b3Q7IG9uIEphdmFQYXJhbWV0ZXIsIGRvbid0IGtub3cgd2hhdCB0aGF0IHdhcyBzdXBwb3NlZCB0byBiZSYjeEQ7JiN4QTstIGRlbGV0ZWQgdGhlIENhdGVnb3J5IGp1bmsmI3hEOyYjeEE7LSBjaGFuZ2VkIHRoZSBCbG9jay10eXBlZCBhdHRyaWJ1dGVzIG9uIEZpZWxkLCBNZXRob2QsIEluaXRpYWxpemVyIHRvIGJlIGFzc29jaWF0aW9ucyB0byBCbG9jayYjeEQ7JiN4QTsmI3hEOyYjeEE7T3V0c3RhbmRpbmcgcXVlc3Rpb25zL2lzc3VlczomI3hEOyYjeEE7LSBKYXZhUGFyYW1ldGVyS2luZCBzaG91bGQgZ28gYXdheSBpZiB3ZSBnZXQgdGhlIGJhc2UgUGFyYW1ldGVyIGtpbmQgZml4ZWQgdXAmI3hEOyYjeEE7Ii8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkphdmFDbGFzcyIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VDbGFzcyI+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzTmVzdGVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRGaWVsZCIgZVR5cGU9IiMvL0ZpZWxkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGFuIEZpZWxkIHdpdGggdGhlIHBhc3NlZCBuYW1lLCBvciBudWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZmllbGROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RmllbGRFeHRlbmRlZCIgZVR5cGU9IiMvL0ZpZWxkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iIFJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSBmcm9tIHRoaXMgSmF2YUNsYXNzIG9yIGFueSBzdXBlcnR5cGVzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7UmV0dXJuIG51bGwgaWYgYSBGaWVsZCBuYW1lZCBmaWVsZE5hbWUgaXMgbm90IGZvdW5kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZmllbGROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RmllbGROYW1lZCIgZVR5cGU9IiMvL0ZpZWxkIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGFuIEZpZWxkIHdpdGggdGhlIHBhc3NlZCBuYW1lLCBvciBudWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iZmllbGROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0RmllbGRzRXh0ZW5kZWQiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYWxsIGZpZWxkcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1ldGhvZCIgZVR5cGU9IiMvL01ldGhvZCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdldCB0aGUgbWV0aG9kIG9mIHRoaXMgbmFtZSBhbmQgdGhlc2UgcGFyYW1ldGVycy4gSXQgd2lsbCBub3QgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im1ldGhvZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJhbWV0ZXJUeXBlcyIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0IG9mIHBhcmFtZXRlciB0eXBlcy4iLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2VQYXJhbWV0ZXJzPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmVzIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGEgTGlzdCBvZiBTdHJpbmdzIHRoYXQgcmVwcmVzZW50IE1ldGhvZEVsZW1lbnQgc2lnbmF0dXJlcyBmcm9tIG1vc3QgZ2VuZXJhbCB0byBtb3N0IHNwZWNpZmljLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0TWV0aG9kRXh0ZW5kZWQiIGVUeXBlPSIjLy9NZXRob2QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im1ldGhvZE5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJwYXJhbWV0ZXJUeXBlcyIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0IG9mIHBhcmFtZXRlciB0eXBlcy4iLz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8L2VQYXJhbWV0ZXJzPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1ldGhvZHNFeHRlbmRlZCIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhbGwgbWV0aG9kcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE9ubHlTcGVjaWZpY01ldGhvZHMiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYSBMaXN0IG9mIE1ldGhvZHMgdGhhdCBiZWdpbnMgd2l0aCBAYU1ldGhvZE5hbWVQcmVmaXggYW5kIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQGV4Y2x1ZGVkTmFtZXMgbGlzdC4gSWYgQGFNZXRob2ROYW1lUHJlZml4IGlzIG51bGwsIGFsbCBtZXRob2RzIHdpbGwgYmUgcmV0dXJuZWQuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0iYU1ldGhvZE5hbWVQcmVmaXgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJleGNsdWRlZE5hbWVzIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ii8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UHVibGljTWV0aG9kIiBlVHlwZT0iIy8vTWV0aG9kIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGEgbWV0aG9kIG1hdGNoaW5nIHRoZSBuYW1lLCBhbmQgbm9uLXJldHVybiBwYXJhbWV0ZXJzIHdpdGggZnVsbHkgcXVhbGlmaWVkIHR5cGVzIG1hdGNoaW5nIGFsbCB0aGUgdHlwZXMgaW4gdGhlIGxpc3QsIGlmIGl0IGV4aXN0cy4gIEl0IHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJtZXRob2ROYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFyYW1ldGVyVHlwZXMiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTGlzdCBvZiBwYXJhbWV0ZXIgdHlwZXMuIi8+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPC9lUGFyYW1ldGVycz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQdWJsaWNNZXRob2RzIiBlVHlwZT0iIy8vSlR5cGVMaXN0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGFsbCBtZXRob2RzLCBpdCB3aWxsIG5vdCBnbyB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFB1YmxpY01ldGhvZHNFeHRlbmRlZCIgZVR5cGU9IiMvL0pUeXBlTGlzdCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhbGwgcHVibGljIG1ldGhvZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQdWJsaWNNZXRob2RzTmFtZWQiIGVUeXBlPSIjLy9KVHlwZUxpc3QiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvbiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLCBoYXZpbmcgYSBuYW1lIGVxdWFsIHRvIHRoYXQgb2YgdGhlIHBhcmFtZXRlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRTdXBlcnR5cGUiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaW1wbGVtZW50c0ludGVyZmFjZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUZXN0IHdoZXRoZXIgdGhlIHJlY2VpdmVyIGltcGxlbWVudHMgdGhlIHBhc3NlZCBpbnRlcmZhY2UgKG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJpbnRlcmZhY2VUeXBlIiBlVHlwZT0iIy8vSmF2YUNsYXNzIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaW5mb1N0cmluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJldHVybiBhIHN0cmluZyBzaG93aW5nIG91ciBkZXRhaWxzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaW5oZXJpdHNGcm9tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRlc3RzIHdoZXRoZXIgdGhpcyBjbGFzcyBpbmhlcml0cyBmcm9tIHRoZSBwYXNzZWQgaW4gY2xhc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJqYXZhQ2xhc3MiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc0V4aXN0aW5nVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEb2VzIHRoaXMgdHlwZSBleGlzdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzSW50ZXJmYWNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklzIHRoaXMgYW4gaW50ZXJmYWNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0U3VwZXJ0eXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2V0IHRoZSBzdXBlcnR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJqYXZhY2xhc3MiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiLz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJraW5kIiBlVHlwZT0iIy8vVHlwZUtpbmQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVibGljIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5hbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wbGVtZW50c0ludGVyZmFjZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNsYXNzSW1wb3J0IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYWNrYWdlSW1wb3J0cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWVsZHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRmllbGQiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0ZpZWxkL2phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTWV0aG9kL2phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbml0aWFsaXplcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSW5pdGlhbGl6ZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0luaXRpYWxpemVyL2phdmFDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWNsYXJlZENsYXNzZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YUNsYXNzIiBlT3Bwb3NpdGU9IiMvL0phdmFDbGFzcy9kZWNsYXJpbmdDbGFzcyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWNsYXJpbmdDbGFzcyIgZVR5cGU9IiMvL0phdmFDbGFzcyIKLSAgICAgICAgZU9wcG9zaXRlPSIjLy9KYXZhQ2xhc3MvZGVjbGFyZWRDbGFzc2VzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImphdmFQYWNrYWdlIiBlVHlwZT0iIy8vSmF2YVBhY2thZ2UiCi0gICAgICAgIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0phdmFQYWNrYWdlL2phdmFDbGFzc2VzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV2ZW50cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhRXZlbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFsbEV2ZW50cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9KYXZhRXZlbnQiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW5pdGlhbGl6ZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N0YXRpYyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iamF2YUNsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vSmF2YUNsYXNzL2luaXRpYWxpemVycyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGVUeXBlPSIjLy9CbG9jayIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhUGFyYW1ldGVyIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVBhcmFtZXRlciI+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImlzQXJyYXkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXMgdGhpcyBwYXJhbWV0ZXIgdHlwZSBhbiBhcnJheSB0eXBlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNSZXR1cm4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXMgdGhpcyBhIHJldHVybiBwYXJhbWV0ZXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRKYXZhVHlwZSIgZVR5cGU9IiMvL0pUeXBlSmF2YUhlbHBlcnMiLz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UXVhbGlmaWVkTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5hbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGFyYW1ldGVyS2luZCIgZVR5cGU9IiMvL0phdmFQYXJhbWV0ZXJLaW5kIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VPcGVyYXRpb24iPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRDb250YWluaW5nSmF2YUNsYXNzIiBlVHlwZT0iIy8vSmF2YUNsYXNzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIHRoZSBqYXZhIGNsYXNzIHRoYXQgdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBpbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgdGhlIG1ldGhvZCBuYW1lIGFuZCBpdHMgcGFyYW1ldGVycy4gZS5nLiAmbHQ7Y29kZT4gc2V0Rmlyc3ROYW1lKGphdmEubGFuZy5TdHJpbmcpICZsdDsvY29kZT4gLiYjeEQ7JiN4QTsgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXRQYXJhbWV0ZXIiIGVUeXBlPSIjLy9KYXZhUGFyYW1ldGVyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJuIGEgUGFyYW1ldGVyIHdpdGggdGhlIHBhc3NlZCBuYW1lLCBvciBudWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZVBhcmFtZXRlcnMgbmFtZT0icGFyYW1ldGVyTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFJldHVyblR5cGUiIGVUeXBlPSIjLy9KVHlwZUphdmFIZWxwZXJzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0IHRoZSByZXR1cm4gdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9InNldFJldHVyblR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTZXQgdGhlIHJldHVybiB0eXBlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJ0eXBlIiBlVHlwZT0iIy8vSlR5cGVKYXZhSGVscGVycyIvPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldFNpZ25hdHVyZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJlcGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QudG9TdHJpbmcoKS4mI3hEOyYjeEE7JiN4RDsmI3hBO1JldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIE1ldGhvZC4gIFRoZSBzdHJpbmcgaXMgZm9ybWF0dGVkIGFzIHRoZSBtZXRob2QgYWNjZXNzIG1vZGlmaWVycywgaWYgYW55LCBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIHJldHVybiB0eXBlLCBmb2xsb3dlZCBieSBhIHNwYWNlLCBmb2xsb3dlZCBieSB0aGUgY2xhc3MgZGVjbGFyaW5nIHRoZSBtZXRob2QsIGZvbGxvd2VkIGJ5IGEgcGVyaW9kLCBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIG5hbWUsIGZvbGxvd2VkIGJ5IGEgcGFyZW50aGVzaXplZCwgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIG1ldGhvZCdzIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBtZXRob2QgdGhyb3dzIGNoZWNrZWQgZXhjZXB0aW9ucywgdGhlIHBhcmFtZXRlciBsaXN0IGlzIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSB3b3JkIHRocm93cyBmb2xsb3dlZCBieSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB0aHJvd24gZXhjZXB0aW9uIHR5cGVzLiYjeEQ7JiN4QTsmI3hEOyYjeEE7Rm9yIGV4YW1wbGU6JiN4RDsmI3hBOyYjeEQ7JiN4QTsgICAgcHVibGljIGJvb2xlYW4gamF2YS5sYW5nLk9iamVjdC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkmI3hEOyYjeEE7JiN4RDsmI3hBO1RoZSBhY2Nlc3MgbW9kaWZpZXJzIGFyZSBwbGFjZWQgaW4gY2Fub25pY2FsIG9yZGVyIGFzIHNwZWNpZmllZCBieSAmcXVvdDtUaGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uJnF1b3Q7LiAgVGhpcyBpcyBwdWJsaWMsICZsdDt0dD5wcm90ZWN0ZWQmbHQ7L3R0PiBvciAmbHQ7dHQ+cHJpdmF0ZSZsdDsvdHQ+IGZpcnN0LCBhbmQgdGhlbiBvdGhlciBtb2RpZmllcnMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogJmx0O3R0PmFic3RyYWN0Jmx0Oy90dD4sICZsdDt0dD5zdGF0aWMmbHQ7L3R0PiwgJmx0O3R0PmZpbmFsJmx0Oy90dD4sICZsdDt0dD5zeW5jaHJvbml6ZWQmbHQ7L3R0PiAmbHQ7dHQ+bmF0aXZlJmx0Oy90dD4uJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNHZW5lcmF0ZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRob2QgaXMgc3lzdGVtIGdlbmVyYXRlZC4mI3hEOyYjeEE7VGhpcyBpcyB1c3VhbGx5IGRldGVybWluZWQgYnkgdGhlIEBnZW5lcmF0ZWQgdGFnIGluIHRoZSBjb21tZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0ic2V0SXNHZW5lcmF0ZWQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTZXQgdGhlIGlzR2VuZXJhdGVkIGZsYWcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJnZW5lcmF0ZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iaXNWb2lkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklzIHRoaXMgYSB2b2lkIHJldHVybiB0eXBlIG1ldGhvZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFic3RyYWN0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYXRpdmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN5bmNocm9uaXplZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnN0cnVjdG9yIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGF0aWMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImphdmFWaXNpYmlsaXR5IiBlVHlwZT0iIy8vSmF2YVZpc2liaWxpdHlLaW5kIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmFtZXRlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YVBhcmFtZXRlciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iamF2YUV4Y2VwdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YUNsYXNzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImphdmFDbGFzcyIgZVR5cGU9IiMvL0phdmFDbGFzcyIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0phdmFDbGFzcy9tZXRob2RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvdXJjZSIgZVR5cGU9IiMvL0Jsb2NrIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZpZWxkIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVR5cGVkRWxlbWVudCI+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldENvbnRhaW5pbmdKYXZhQ2xhc3MiIGVUeXBlPSIjLy9KYXZhQ2xhc3MiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHZXQgdGhlIGNsYXNzIHRoYXQgdGhpcyBmaWVsZCBpcyB3aXRoaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc0FycmF5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklzIHRoaXMgZmllbGQgYW4gYXJyYXkgdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGF0aWMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImphdmFWaXNpYmlsaXR5IiBlVHlwZT0iIy8vSmF2YVZpc2liaWxpdHlLaW5kIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRyYW5zaWVudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idm9sYXRpbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImphdmFDbGFzcyIgZVR5cGU9IiMvL0phdmFDbGFzcyIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0phdmFDbGFzcy9maWVsZHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5pdGlhbGl6ZXIiIGVUeXBlPSIjLy9CbG9jayIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJUeXBlS2luZCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU5ERUZJTkVEPTEgQ0xBU1M9MiBJTlRFUkZBQ0U9MyBFWENFUFRJT049NCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVU5ERUZJTkVEIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDTEFTUyIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOVEVSRkFDRSIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkVYQ0VQVElPTiIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmxvY2siPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzb3VyY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CbG9jayIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tbWVudCIgZVN1cGVyVHlwZXM9IiMvL0Jsb2NrIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhdGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vQmxvY2siLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhUGFja2FnZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VQYWNrYWdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iamF2YUNsYXNzZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vSmF2YUNsYXNzIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9KYXZhQ2xhc3MvamF2YVBhY2thZ2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJKYXZhVmlzaWJpbGl0eUtpbmQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBBQ0tBR0U9MSYjeEQ7JiN4QTtQVUJMSUM9MiYjeEQ7JiN4QTtQUklWQVRFPTMmI3hEOyYjeEE7UFJPVEVDVEVEPTQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlBVQkxJQyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUFJJVkFURSIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlBST1RFQ1RFRCIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlBBQ0tBR0UiIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iSmF2YVBhcmFtZXRlcktpbmQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklOPTAmI3hEOyYjeEE7T1VUPTEmI3hEOyYjeEE7SU5PVVQ9MiYjeEQ7JiN4QTtSRVRVUk49MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU4iLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9VVCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOT1VUIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iUkVUVVJOIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhRGF0YVR5cGUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQ2xhc3MiPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJnZXREZWZhdWx0VmFsdWVTdHJpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJpbWl0aXZlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJyYXlUeXBlIiBlU3VwZXJUeXBlcz0iIy8vSmF2YUNsYXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgYSBKYXZhIEFycmF5IHR5cGUmI3hEOyYjeEE7ICAgRm9yIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cywgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgY29tcG9uZW50IHR5cGUgd2lsbCBiZSYjeEQ7JiN4QTsgICBzcGVjaWZpZWQgZGlyZWN0bHkuICBUaGlzIHdvdWxkIHJlcXVpcmUgaW5zdGFudGlhdGluZyBhIGNoYWluIG9mIGNvbXBvbmVudCB0eXBlcyYjeEQ7JiN4QTsgICBzdWNoIGFzIFN0cmluZ1tdW11bXVtdLT5TdHJpbmdbXVtdW10tPlN0cmluZ1tdW10tPlN0cmluZ1tdLT5TdHJpbmcuJiN4RDsmI3hBOyYjeEQ7JiN4QTsgIFRoZSBjb21wb25lbnQgdHlwZSByZWxhdGlvbnNoaXAgd2lsbCBiZSBjb21wdXRlZCBpZiB0aGUgZmluYWxDb21wb25lbnRUeXBlJiN4RDsmI3hBOyAgYW5kIGFycmF5IGRpbWVuc2lvbnMgaXMgc3BlY2lmaWVkLiYjeEQ7JiN4QTsgJiN4RDsmI3hBOyAgRm9yIHRoaXMgcmVhc29uLCB0aGUgcHJlZmVycmVkIHdheSB0byBjcmVhdGUgaXMgdGhyb3VnaCB0aGUgSmF2YVJlZkZhY3RvcnkgZmFjdG9yeSBtZXRob2Q6JiN4RDsmI3hBOyAgICAgICBjcmVhdGVBcnJheVR5cGUoSmF2YUNsYXNzIGZpbmFsQ29tcG9uZW50VHlwZSwgaW50IGRpbWVuc2lvbnMpIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldEZpbmFsQ29tcG9uZW50VHlwZSIgZVR5cGU9IiMvL0pUeXBlSmF2YUhlbHBlcnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHZXQgdGhlIGZpbmFsIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIEFycmF5IFR5cGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTtJbiBvcmRlciB0byBlbnN1cmUgYSB1bmlxdWUgaW5zdGFuY2UsIHdlIHdpbGwgcmVzb2x2ZSB0aGlzIHR5cGUgdXNpbmcgcmVmbGVjdGlvbi4gSXQgdHVybnMgb3V0IHRvIGJlIG1vc3QgZWZmaWNpZW50IHRvIGp1c3QgZG8gdGhpcyBieSB0cmltbWluZyB0aGUgbmFtZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZU9wZXJhdGlvbnM+Ci0gICAgPGVPcGVyYXRpb25zIG5hbWU9ImdldENvbXBvbmVudFR5cGVBc0hlbHBlciIgZVR5cGU9IiMvL0pUeXBlSmF2YUhlbHBlcnMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHZXQgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoaXMgYXJyYXkuICYjeEQ7JiN4QTsmI3hEOyYjeEE7SWYgdGhpcyBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5LCB0aGUgY29tcG9uZW50IHR5cGUgd2lsbCBiZSB0aGUgbmVzdGVkIGFycmF5IHR5cGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJpc1ByaW1pdGl2ZUFycmF5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklzIHRoaXMgYW4gYXJyYXkgb2YgamF2YSBwcmltaXRpdmVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VPcGVyYXRpb25zPgotICAgIDxlT3BlcmF0aW9ucyBuYW1lPSJzZXRDb21wb25lbnRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU2V0IHRoZSBjb21wb25lbnQgdHlwZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVQYXJhbWV0ZXJzIG5hbWU9ImhlbHBlckNvbXBvbmVudFR5cGUiIGVUeXBlPSIjLy9KVHlwZUphdmFIZWxwZXJzIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXJyYXlEaW1lbnNpb25zIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbXBvbmVudFR5cGUiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUNsYXNzaWZpZXIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSlR5cGVKYXZhSGVscGVycyIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGludGVyZmFjZSBpcyBhIGNvbW1vbiBpbnRlcmZhY2UgYmV0d2VlbiBKYXZhQ2xhc3MgYW5kIEphdmFEYXRhVHlwZSBwbHVzIHNvbWUgY29tbW9uIGhlbHBlciBtZXRob2RzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJKVHlwZUxpc3QiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iamF2YS51dGlsLkxpc3QgdHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJKYXZhRXZlbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRVN0cnVjdHVyYWxGZWF0dXJlIi8+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YU1vZGVsLmdlbm1vZGVsIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9kZWwvamF2YU1vZGVsLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTRmZDZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmFNb2RlbC5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YSIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuamVtLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qZW0uZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSIiIG1vZGVsTmFtZT0iSmF2YSIgbW9kZWxQbHVnaW5DbGFzcz0iIiBlZGl0UGx1Z2luQ2xhc3M9ImphdmEucHJvdmlkZXIuSmF2YUVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9ImphdmEucHJlc2VudGF0aW9uLkphdmFFZGl0b3JQbHVnaW4iIHVwZGF0ZUNsYXNzcGF0aD0iZmFsc2UiCi0gICAgYm9vbGVhbkZsYWdzRmllbGQ9ImVGbGFncyIgYm9vbGVhbkZsYWdzUmVzZXJ2ZWRCaXRzPSI4IiB1c2VkR2VuUGFja2FnZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlIj4KLSAgPGZvcmVpZ25Nb2RlbD4uLlxyb3NlXGphdmFNb2RlbC5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPGZvcmVpZ25Nb2RlbD5Xb3Jrc3BhY2VSb290PC9mb3JlaWduTW9kZWw+Ci0gIDxmb3JlaWduTW9kZWw+Li4vLi48L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iSmF2YVJlZiIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmplbSIgY2xhc3NQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC5pbXBsIgotICAgICAgZWNvcmVQYWNrYWdlPSJqYXZhLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImphdmEuZWNvcmUjLy9UeXBlS2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9UeXBlS2luZC9VTkRFRklORUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL1R5cGVLaW5kL0NMQVNTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9UeXBlS2luZC9JTlRFUkZBQ0UiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iamF2YS5lY29yZSMvL1R5cGVLaW5kL0VYQ0VQVElPTiIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0iamF2YS5lY29yZSMvL0phdmFWaXNpYmlsaXR5S2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9KYXZhVmlzaWJpbGl0eUtpbmQvUFVCTElDIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9KYXZhVmlzaWJpbGl0eUtpbmQvUFJJVkFURSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vSmF2YVZpc2liaWxpdHlLaW5kL1BST1RFQ1RFRCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vSmF2YVZpc2liaWxpdHlLaW5kL1BBQ0tBR0UiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyS2luZCI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyS2luZC9JTiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlcktpbmQvT1VUIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyS2luZC9JTk9VVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlcktpbmQvUkVUVVJOIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImphdmEuZWNvcmUjLy9KVHlwZUphdmFIZWxwZXJzIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJqYXZhLmVjb3JlIy8vSlR5cGVMaXN0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0phdmFDbGFzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0phdmFDbGFzcy9raW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0phdmFDbGFzcy9wdWJsaWMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2ZpbmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvaW1wbGVtZW50c0ludGVyZmFjZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0phdmFDbGFzcy9jbGFzc0ltcG9ydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL3BhY2thZ2VJbXBvcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZmllbGRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvbWV0aG9kcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2luaXRpYWxpemVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2RlY2xhcmVkQ2xhc3NlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2RlY2xhcmluZ0NsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2phdmFQYWNrYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZXZlbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvYWxsRXZlbnRzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9pc05lc3RlZCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0RmllbGQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRGaWVsZC9maWVsZE5hbWUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldEZpZWxkRXh0ZW5kZWQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRGaWVsZEV4dGVuZGVkL2ZpZWxkTmFtZSIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0RmllbGROYW1lZCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldEZpZWxkTmFtZWQvZmllbGROYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRGaWVsZHNFeHRlbmRlZCIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0TWV0aG9kIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0TWV0aG9kL21ldGhvZE5hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0TWV0aG9kL3BhcmFtZXRlclR5cGVzIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0TWV0aG9kRXh0ZW5kZWQiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRNZXRob2RFeHRlbmRlZC9tZXRob2ROYW1lIi8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE1ldGhvZEV4dGVuZGVkL3BhcmFtZXRlclR5cGVzIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRNZXRob2RzRXh0ZW5kZWQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE9ubHlTcGVjaWZpY01ldGhvZHMiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRPbmx5U3BlY2lmaWNNZXRob2RzL2FNZXRob2ROYW1lUHJlZml4Ii8+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldE9ubHlTcGVjaWZpY01ldGhvZHMvZXhjbHVkZWROYW1lcyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0UHVibGljTWV0aG9kIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0UHVibGljTWV0aG9kL21ldGhvZE5hbWUiLz4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3MvZ2V0UHVibGljTWV0aG9kL3BhcmFtZXRlclR5cGVzIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRQdWJsaWNNZXRob2RzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFB1YmxpY01ldGhvZHNOYW1lZCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2dldFB1YmxpY01ldGhvZHNOYW1lZC9uYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9nZXRTdXBlcnR5cGUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2ltcGxlbWVudHNJbnRlcmZhY2UiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9pbXBsZW1lbnRzSW50ZXJmYWNlL2ludGVyZmFjZVR5cGUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2luZm9TdHJpbmciLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2luaGVyaXRzRnJvbSI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2luaGVyaXRzRnJvbS9qYXZhQ2xhc3MiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YUNsYXNzL2lzRXhpc3RpbmdUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFDbGFzcy9pc0ludGVyZmFjZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3Mvc2V0U3VwZXJ0eXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9KYXZhQ2xhc3Mvc2V0U3VwZXJ0eXBlL2phdmFjbGFzcyIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vSW5pdGlhbGl6ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9Jbml0aWFsaXplci9pc1N0YXRpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSW5pdGlhbGl6ZXIvamF2YUNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSW5pdGlhbGl6ZXIvc291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlci9maW5hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyL3BhcmFtZXRlcktpbmQiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlci9pc0FycmF5Ii8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFQYXJhbWV0ZXIvaXNSZXR1cm4iLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vSmF2YVBhcmFtZXRlci9nZXRKYXZhVHlwZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9KYXZhUGFyYW1ldGVyL2dldFF1YWxpZmllZE5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL01ldGhvZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL01ldGhvZC9hYnN0cmFjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9NZXRob2QvbmF0aXZlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL01ldGhvZC9zeW5jaHJvbml6ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vTWV0aG9kL2ZpbmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL01ldGhvZC9jb25zdHJ1Y3RvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9NZXRob2Qvc3RhdGljIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL01ldGhvZC9qYXZhVmlzaWJpbGl0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vTWV0aG9kL3BhcmFtZXRlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL01ldGhvZC9qYXZhRXhjZXB0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vTWV0aG9kL2phdmFDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL01ldGhvZC9zb3VyY2UiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL2dldENvbnRhaW5pbmdKYXZhQ2xhc3MiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL2dldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL2dldFBhcmFtZXRlciI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vTWV0aG9kL2dldFBhcmFtZXRlci9wYXJhbWV0ZXJOYW1lIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9nZXRSZXR1cm5UeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9zZXRSZXR1cm5UeXBlIj4KLSAgICAgICAgPGdlblBhcmFtZXRlcnMgZWNvcmVQYXJhbWV0ZXI9ImphdmEuZWNvcmUjLy9NZXRob2Qvc2V0UmV0dXJuVHlwZS90eXBlIi8+Ci0gICAgICA8L2dlbk9wZXJhdGlvbnM+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9nZXRTaWduYXR1cmUiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vTWV0aG9kL2lzR2VuZXJhdGVkIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL01ldGhvZC9zZXRJc0dlbmVyYXRlZCI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJqYXZhLmVjb3JlIy8vTWV0aG9kL3NldElzR2VuZXJhdGVkL2dlbmVyYXRlZCIvPgotICAgICAgPC9nZW5PcGVyYXRpb25zPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9NZXRob2QvaXNWb2lkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9GaWVsZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0ZpZWxkL2ZpbmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0ZpZWxkL3N0YXRpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9GaWVsZC9qYXZhVmlzaWJpbGl0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9GaWVsZC90cmFuc2llbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBqYXZhLmVjb3JlIy8vRmllbGQvdm9sYXRpbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgamF2YS5lY29yZSMvL0ZpZWxkL2phdmFDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vRmllbGQvaW5pdGlhbGl6ZXIiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vRmllbGQvZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9GaWVsZC9pc0FycmF5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9CbG9jayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0Jsb2NrL3NvdXJjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGphdmEuZWNvcmUjLy9CbG9jay9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9CbG9jay9jb250ZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vQ29tbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImphdmEuZWNvcmUjLy9TdGF0ZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJqYXZhLmVjb3JlIy8vSmF2YVBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBqYXZhLmVjb3JlIy8vSmF2YVBhY2thZ2UvamF2YUNsYXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0phdmFEYXRhVHlwZSI+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0phdmFEYXRhVHlwZS9nZXREZWZhdWx0VmFsdWVTdHJpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0FycmF5VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgamF2YS5lY29yZSMvL0FycmF5VHlwZS9hcnJheURpbWVuc2lvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGphdmEuZWNvcmUjLy9BcnJheVR5cGUvY29tcG9uZW50VHlwZSIvPgotICAgICAgPGdlbk9wZXJhdGlvbnMgZWNvcmVPcGVyYXRpb249ImphdmEuZWNvcmUjLy9BcnJheVR5cGUvZ2V0RmluYWxDb21wb25lbnRUeXBlIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0iamF2YS5lY29yZSMvL0FycmF5VHlwZS9nZXRDb21wb25lbnRUeXBlQXNIZWxwZXIiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vQXJyYXlUeXBlL2lzUHJpbWl0aXZlQXJyYXkiLz4KLSAgICAgIDxnZW5PcGVyYXRpb25zIGVjb3JlT3BlcmF0aW9uPSJqYXZhLmVjb3JlIy8vQXJyYXlUeXBlL3NldENvbXBvbmVudFR5cGUiPgotICAgICAgICA8Z2VuUGFyYW1ldGVycyBlY29yZVBhcmFtZXRlcj0iamF2YS5lY29yZSMvL0FycmF5VHlwZS9zZXRDb21wb25lbnRUeXBlL2hlbHBlckNvbXBvbmVudFR5cGUiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iamF2YS5lY29yZSMvL0phdmFFdmVudCIvPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvamF2YWFkYXB0ZXJzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL2phdmFhZGFwdGVycy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjUxYjU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvamF2YWFkYXB0ZXJzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9qYXZhYWRhcHRlcnMucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDgvMDMvMjUgMTM6MTI6NTIgJAotIwotCi1GYWlsZWRfcmVmbGVjdGluZ192YWx1ZXNfRVJST1JfICAgICAgID0gSVdBVjAwMDJFIEZhaWxlZCByZWZsZWN0aW5nIHZhbHVlcy4gQ2hlY2sgY2xhc3NwYXRoLgotQ291bGRfTm90X1JlZmxlY3RfTWV0aG9kc19FUlJPUl8gICAgICA9IElXQVYwMDAzRSBDb3VsZCBub3QgcmVmbGVjdCBtZXRob2RzIGZvciB7MH0gYmVjYXVzZSBvbmUgb2YgdGhlIG1ldGhvZHMgcmVmZXJlbmNlcyBhIHR5cGUgdGhhdCBjb3VsZCBub3QgYmUgbG9hZGVkLiAgRXhjZXB0aW9uOiB7MX0gQ2hlY2sgY2xhc3NwYXRoLgotQ291bGRfTm90X1JlZmxlY3RfQ29uc3RydWN0b3JzX0VSUk9SXyA9IElXQVYwMTQyRSBDb3VsZCBub3QgcmVmbGVjdCBjb25zdHJ1Y3RvcnMgZm9yIHswfSBiZWNhdXNlIG9uZSBvZiB0aGUgbWV0aG9kcyByZWZlcmVuY2VzIGEgdHlwZSB0aGF0IGNvdWxkIG5vdCBiZSBsb2FkZWQuICBFeGNlcHRpb246IHsxfSBDaGVjayBjbGFzc3BhdGguCi1Db3VsZF9Ob3RfUmVmbGVjdF9GaWVsZHNfRVJST1JfICAgICAgID0gSVdBVjAxNDNFIENvdWxkIG5vdCByZWZsZWN0IGZpZWxkcyBmb3IgezB9IGJlY2F1c2Ugb25lIG9mIHRoZSBmaWVsZHMgaXMgYSB0eXBlIHRoYXQgY291bGQgbm90IGJlIGxvYWRlZC4gRXhjZXB0aW9uOiB7MX0gQ2hlY2sgY2xhc3NwYXRoLgotRXJyb3JfTG9va2luZ19VcF9UeXBlX0VSUk9SXyAgICAgICAgICA9IElXQVYwMTQ0RSBFcnJvciBsb29raW5nIHVwIHR5cGUgezB9LiAgRXhjZXB0aW9uOiB7MX0gQ2hlY2sgY2xhc3NwYXRoLgotRXJyb3JfSW50cm9zcGVjdGluZ19GbGFnc19FUlJPUl8gICAgICA9IElXQVYwMTQ1RSBFcnJvciBpbnRyb3NwZWN0aW5nIGZsYWdzIG9uIHswfS4gIEV4Y2VwdGlvbjogezF9Ci1FcnJvcl9TZXR0aW5nX0dlbkZsYWdfRVJST1JfICAgICAgICAgID0gSVdBVjAxNTNFIEVycm9yIHNldHRpbmcgdGhlIGdlbmVyYXRlZCBmbGFnIG9uIHswfS4gIEV4Y2VwdGlvbjogezF9Ci1KYXZhX0luaF9DeWNsZV9FUlJPUl8gICAgICAgICAgICAgICAgID0gSVdBVjAxNTRFIERldGVjdGVkIGFuIGluaGVyaXRhbmNlIGN5Y2xlIHdoZW4gezB9IHRyeXMgdG8gZXh0ZW5kIHsxfS4KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2NvcmUvSkVNUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9jb3JlL0pFTVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWNlNmNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2NvcmUvSkVNUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eXJlbmRlci5FY2xpcHNlTG9nZ2VyOwotCi0KLS8qKgotICogb3JnLmVjbGlwc2UuamVtIHBsdWdpbgotICovCi1wdWJsaWMgY2xhc3MgSkVNUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCXByaXZhdGUgc3RhdGljIEpFTVBsdWdpbiBQTFVHSU47Ci0JcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuamVtIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBKRU1QbHVnaW4oKSB7Ci0JCVBMVUdJTiA9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSkVNUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIFBMVUdJTjsKLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlsb2dnZXIgPSBFY2xpcHNlTG9nZ2VyLmdldEVjbGlwc2VMb2dnZXIodGhpcyk7CQkKLQl9Ci0JCi0JcHVibGljIExvZ2dlciBnZXRMb2dnZXIoKSB7Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBQTFVHSU5fSUQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIG1lc3NhZ2UgLCBleGNlcHRpb24pKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSAsIGV4Y2VwdGlvbikpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0lKYXZhQ2xhc3NBZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0lKYXZhQ2xhc3NBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MDY2NzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JSmF2YUNsYXNzQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0KLQotICovCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoOC8yNy8yMDAxIDE6MTc6NDYgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFDbGFzc0FkYXB0b3IgewotLyoqCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlVHlwZSBpcyBudWxsIG9yIGlmCi0gKiBpdCBpcyBhIGJpbmFyeSB0eXBlLgotICovCi1ib29sZWFuIGlzU291cmNlVHlwZUZyb21CaW5hcnkoKSA7Ci0vKioKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBzb3VyY2VUeXBlIGNhbiBiZSBmb3VuZC4KLSAqLwotYm9vbGVhbiBzb3VyY2VUeXBlRXhpc3RzKCkgOwotCi0vKioKLSAqIFJlZmxlY3QgdGhlIGZpZWxkcwotICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWZsZWN0aW9uIG9jY3VycmVkLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotYm9vbGVhbiByZWZsZWN0RmllbGRzSWZOZWNlc3NhcnkoKTsJCi0KLS8qKgotICogUmVmbGVjdCB0aGUgbWV0aG9kcy4KLSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVmbGVjdGlvbiBvY2N1cnJlZC4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLWJvb2xlYW4gcmVmbGVjdE1ldGhvZHNJZk5lY2Vzc2FyeSgpOwotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0lKYXZhTWV0aG9kQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JSmF2YU1ldGhvZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhkYjAwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0lKYXZhTWV0aG9kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0gCi0KLS8qKgotICogVXNlZCB0byByZWZsZWN0IG1ldGhvZHMKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhTWV0aG9kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBSZWZsZWN0IHRoZSBnZW5lcmF0ZWQgaWYgbmVjZXNzYXJ5LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVmbGVjdGlvbiBvY2N1cnJlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0R2VuZXJhdGVkSWZOZWNlc3NhcnkoKTsKLQkKLQkvKioKLQkgKiBSZWZsZWN0IHRoZSBuYW1lcyBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcmVmbGVjdGlvbiBvY2N1cnJlZC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0UGFyYW1OYW1lc0lmTmVjZXNzYXJ5KCk7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0ludGVybmFsUmVhZEFkYXB0YWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9JbnRlcm5hbFJlYWRBZGFwdGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjNDc0ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0ludGVybmFsUmVhZEFkYXB0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVyczsKLS8qCi0KLQotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSW50ZXJuYWxSZWFkQWRhcHRhYmxlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIgewotLyoqCi0gKiBJbXBsZW1lbnRlcnMgb2YgdGhpcyBpbnRlcmZhY2UgbmVlZCB0byBjb250YWluIHRoZSBmb2xsb3dpbmcgbWV0aG9kCi0gKiBpbXBsZW1lbnRhdGlvbnM6Ci0gKiBwdWJsaWMgT2JqZWN0IHByaW1SZWZWYWx1ZShFT2JqZWN0IGEpIHsKLSAqCXJldHVybiBzdXBlci5nZXRWYWx1ZShhKTsKLSAqIH0KLSAqIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoRU9iamVjdCBhKSB7Ci0gKglyZXR1cm4gUmVmbGVjdGlvbkFkYXB0b3IuZ2V0VmFsdWUodGhpcywgYSk7Ci0gKiB9Ci0gKi8KLS8vcHVibGljIE9iamVjdCBwcmltUmVmVmFsdWUoRU9iamVjdCBhKTsKLXZvaWQgc2V0UmVmbGVjdGVkKGJvb2xlYW4gYUJvb2xlYW4pOwotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFBcnJheVR5cGVSZWZsZWN0aW9uQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhQXJyYXlUeXBlUmVmbGVjdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhlMWE2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFBcnJheVR5cGVSZWZsZWN0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuQXJyYXlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuQXJyYXlUeXBlSW1wbDsKLQotLyoqCi0gKiBBcnJheSB0eXBlIHJlZmxlY3Rpb24gYWRhcHRlci4gU2luY2UgYXJyYXlzIGFyZSB2ZXJ5IGNvbnN0YW50IHdlIGRvbid0IG5lZWQgYW55IGZhbmN5IHJlZmxlY3Rpb24gdG8gdGhlIHNvdXJjZSB0eXBlIChjbGFzcyBvYmplY3QpLiBJdCByZWFsbHkKLSAqIGRvZXNuJ3QgZG8gYW55dGhpbmcuIEl0IGlzIGp1c3QgaGVyZSBzbyB0aGF0IGl0IGV4aXN0cy4gRXZlcnl0aGluZyBpcyBjb25zdGFudCBvciBkZXBlbmRzIG9uIHRoZSBmaW5hbCBjb21wb25lbnQgdHlwZS4KLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQXJyYXlUeXBlUmVmbGVjdGlvbkFkYXB0ZXIgZXh0ZW5kcyBKYXZhUmVmbGVjdGlvbkFkYXB0b3IgaW1wbGVtZW50cyBJSmF2YUNsYXNzQWRhcHRvciB7Ci0KLQlwdWJsaWMgSmF2YUFycmF5VHlwZVJlZmxlY3Rpb25BZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlzdXBlcih0YXJnZXQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2dldFJlZmxlY3Rpb25Tb3VyY2UoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIG51bGw7IC8vIFRoZXJlIGlzbid0IGFueSBmb3IgYXJyYXlzLgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2hhc1JlZmxlY3Rpb25Tb3VyY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1JlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHZhbGlkLCBzbyB3ZSBwYXNzIG9uIHRvIHVzZSB0aGUgZmluYWwgY29tcG9uZW50LgotCQlBcnJheVR5cGUgamggPSAoQXJyYXlUeXBlKSBnZXRUYXJnZXQoKTsKLQkJSmF2YUhlbHBlcnMgZmMgPSBqaC5nZXRGaW5hbENvbXBvbmVudFR5cGUoKTsKLQkJcmV0dXJuIChmYy5pc1ByaW1pdGl2ZSgpIHx8ICgoSmF2YUNsYXNzKSBmYykuaXNFeGlzdGluZ1R5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCUFycmF5VHlwZSBqaCA9IChBcnJheVR5cGUpIGdldFRhcmdldCgpOwotCQlKYXZhSGVscGVycyBmYyA9IGpoLmdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQlpZihmYy5pc1ByaW1pdGl2ZSgpKQotCQkgICAgcmV0dXJuIHRydWU7Ci0JCWVsc2UgewotCQkgICAgSmF2YVJlZmxlY3Rpb25BZGFwdG9yIHJlZmxlY3Rpb25BZGFwdG9yID0gKEphdmFSZWZsZWN0aW9uQWRhcHRvcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihmYywgUmVmbGVjdGlvbkFkYXB0b3IuVFlQRV9LRVkpOwotCQkgICAgcmV0dXJuIChyZWZsZWN0aW9uQWRhcHRvciAhPSBudWxsKSA/IHJlZmxlY3Rpb25BZGFwdG9yLmhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKSA6IGZhbHNlOwkJICAgIAotCQl9IAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3IjcmVmbGVjdFZhbHVlcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpIHsKLQkJQXJyYXlUeXBlSW1wbCBhdCA9IChBcnJheVR5cGVJbXBsKSBnZXRUYXJnZXQoKTsKLQotCQkvLyBBcnJheXMgYXJlIGFsd2F5czoKLQkJLy8JCWZpbmFsCi0JCS8vCQlTdXBlcnR5cGUgb2YgamF2YS5sYW5nLk9iamVjdAotCQkvLwkJaW1wbGVtZW50cyBqYXZhLmxhbmcuQ2xvbmVhYmxlLCBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCQlhdC5zZXRGaW5hbCh0cnVlKTsKLQkJdHJ5IHsKLQkJCWF0LnNldFN1cGVydHlwZSgoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImphdmEubGFuZy5PYmplY3QiLCAoRU9iamVjdCkgZ2V0VGFyZ2V0KCkpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlMaXN0IGxpc3QgPSBhdC5nZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpOwotCQlsaXN0LmFkZChKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEubGFuZy5DbG9uZWFibGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbGlzdC5hZGQoSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmlvLlNlcmlhbGl6YWJsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3VwZXIucmVmbGVjdFZhbHVlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2ZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoYm9vbGVhbiBjbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JCUFycmF5VHlwZUltcGwgYXQgPSAoQXJyYXlUeXBlSW1wbCkgZ2V0VGFyZ2V0KCk7Ci0JCWF0LmdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFDbGFzc0FkYXB0b3IjaXNTb3VyY2VUeXBlRnJvbUJpbmFyeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTb3VyY2VUeXBlRnJvbUJpbmFyeSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhQ2xhc3NBZGFwdG9yI3JlZmxlY3RGaWVsZHNJZk5lY2Vzc2FyeSgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlZmxlY3RGaWVsZHNJZk5lY2Vzc2FyeSgpIHsKLQkJcmV0dXJuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhQ2xhc3NBZGFwdG9yI3JlZmxlY3RNZXRob2RzSWZOZWNlc3NhcnkoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZWZsZWN0TWV0aG9kc0lmTmVjZXNzYXJ5KCkgewotCQlyZXR1cm4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JLyoKLQkgKiAgKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFDbGFzc0FkYXB0b3Ijc291cmNlVHlwZUV4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc291cmNlVHlwZUV4aXN0cygpIHsKLQkJcmV0dXJuIGhhc1JlZmxlY3Rpb25Tb3VyY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODEzNzZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvLyBNYWludGFpbiBhIG1hcHBpbmcgb2YgdGhlIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBhZGFwdG9ycyB3aGljaCBoYXZlCi0JLy8gcmVsZmVjdGVkIGZyb20gdGhlbS4gIFRoaXMgYWxsb3dzIGEgZmx1c2ggb3BlcmF0aW9uIHRvIGZvcmNlIHRob3NlCi0JLy8gYWRhcHRlcnMgdG8gcmUtcmVmbGVjdC4KLQlwcm90ZWN0ZWQgSGFzaE1hcCByZWZsZWN0ZWQgPSBuZXcgSGFzaE1hcCgpOwotCS8qKgotCSAqIEtleSBmb3IgdGhlIHR5cGUgb2YgYWRhcHRlcnMgdGhhdCB0aGlzIGZhY3RvcnkgY3JlYXRlcy4gKFVzZWQgaW4gaXNGYWN0b3J5Rm9yVHlwZSgpKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0tFWSA9IFJlYWRBZGFwdG9yLlRZUEVfS0VZOwotCXByb3RlY3RlZCBib29sZWFuIGlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBNYXAgcmVnaXN0ZXJRdWV1ZTsKLQlwcm90ZWN0ZWQgTGlzdCB1bnJlZ2lzdGVyUXVldWU7Ci0vKioKLSAqIEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkoKSB7Ci0Jc3VwZXIoKTsKLX0KLXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JUmVmbGVjdGlvbkFkYXB0b3IgYWRhcHRlciA9IG51bGw7Ci0JRU9iamVjdCBvYmplY3QgPSAoRU9iamVjdCkgdGFyZ2V0OwotCUphdmFSZWZQYWNrYWdlIHBhY2sgPSBnZXRKYXZhUmVmUGFja2FnZSgpOwotCWlmIChvYmplY3QuZUNsYXNzKCkgPT0gcGFjay5nZXRKYXZhQ2xhc3MoKSkKLQkJYWRhcHRlciA9IGNyZWF0ZUphdmFDbGFzc0FkYXB0b3IodGFyZ2V0KTsKLQllbHNlCi0JCWlmIChvYmplY3QuZUNsYXNzKCkgPT0gcGFjay5nZXRBcnJheVR5cGUoKSkKLQkJCWFkYXB0ZXIgPSBjcmVhdGVBcnJheVR5cGVBZGFwdG9yKHRhcmdldCk7Ci0JCWVsc2UKLQkJCWlmIChvYmplY3QuZUNsYXNzKCkgPT0gcGFjay5nZXRNZXRob2QoKSkKLQkJCQlhZGFwdGVyID0gY3JlYXRlSmF2YU1ldGhvZEFkYXB0b3IodGFyZ2V0KTsKLQkJCWVsc2UKLQkJCQlpZiAob2JqZWN0LmVDbGFzcygpID09IHBhY2suZ2V0RmllbGQoKSkKLQkJCQkJYWRhcHRlciA9IGNyZWF0ZUphdmFGaWVsZEFkYXB0b3IodGFyZ2V0KTsKLQlyZXR1cm4gYWRhcHRlcjsKLX0KLQotcHJvdGVjdGVkIFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUFycmF5VHlwZUFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JcmV0dXJuIG5ldyBKYXZhQXJyYXlUeXBlUmVmbGVjdGlvbkFkYXB0ZXIodGFyZ2V0KTsKLX0KLQotcHJvdGVjdGVkIGFic3RyYWN0IFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFDbGFzc0FkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSA7Ci1wcm90ZWN0ZWQgYWJzdHJhY3QgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlSmF2YUZpZWxkQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIDsKLXByb3RlY3RlZCBhYnN0cmFjdCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhTWV0aG9kQWRhcHRvcihOb3RpZmllciB0YXJnZXQpIDsKLS8vIEZsdXNoIHRoZSBhZGFwdGVyIGZvciBhIHNvdXJjZSBvYmplY3QKLXB1YmxpYyBOb3RpZmljYXRpb24gZGlzQXNzb2NpYXRlU291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQlyZXR1cm4gZGlzQXNzb2NpYXRlU291cmNlKHNvdXJjZSwgdHJ1ZSk7Ci19Ci0KLXB1YmxpYyBOb3RpZmljYXRpb24gZGlzQXNzb2NpYXRlU291cmNlKFN0cmluZyBzb3VyY2UsIGJvb2xlYW4gZG9Ob3RpZnkpIHsKLQlKYXZhUmVmbGVjdGlvbkFkYXB0b3IgYSA9IChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIHJlZmxlY3RlZC5nZXQoc291cmNlKTsKLQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbnVsbDsKLQlpZiAoYSAhPSBudWxsKSB7Ci0JCWlmIChkb05vdGlmeSkKLQkJCWEucmVsZWFzZVNvdXJjZVR5cGUoKTsKLQkJZWxzZQotCQkJbm90aWZpY2F0aW9uID0gYS5yZWxlYXNlU291cmNlVHlwZU5vTm90aWZpY2F0aW9uKCk7Ci0JfQotCXJldHVybiBub3RpZmljYXRpb247Ci19Ci1wdWJsaWMgdm9pZCBmbHVzaEFsbCgpIHt9Ci0vLyBGbHVzaCB0aGUgYWRhcHRlciBmb3IgYSBzb3VyY2Ugb2JqZWN0Ci1wdWJsaWMgdm9pZCBmbHVzaFJlZmxlY3Rpb24oU3RyaW5nIHNvdXJjZSkge30KLXByb3RlY3RlZCBKYXZhUmVmUGFja2FnZSBnZXRKYXZhUmVmUGFja2FnZSgpIHsKLQlyZXR1cm4gKEphdmFSZWZQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLX0KLXB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVmbGVjdGlvbihTdHJpbmcgc291cmNlLCBSZWZsZWN0aW9uQWRhcHRvciBhZGFwdGVyKSB7Ci0JaWYgKGlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCkgewotCQlpZiAocmVnaXN0ZXJRdWV1ZSA9PSBudWxsKQotCQkJcmVnaXN0ZXJRdWV1ZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJlZ2lzdGVyUXVldWUucHV0KHNvdXJjZSwgYWRhcHRlcik7Ci0JfSBlbHNlCi0JCXJlZmxlY3RlZC5wdXQoc291cmNlLCBhZGFwdGVyKTsKLX0KLXB1YmxpYyB2b2lkIHVucmVnaXN0ZXJSZWZsZWN0aW9uKFN0cmluZyBzb3VyY2UpIHsKLQlpZiAoaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkKSB7Ci0JCWlmICh1bnJlZ2lzdGVyUXVldWUgPT0gbnVsbCkKLQkJCXVucmVnaXN0ZXJRdWV1ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdW5yZWdpc3RlclF1ZXVlLmFkZChzb3VyY2UpOwotCX0gZWxzZQotCQlyZWZsZWN0ZWQucmVtb3ZlKHNvdXJjZSk7Ci19Ci1wdWJsaWMgdm9pZCBkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoU3RyaW5nIHNvdXJjZSkgewotCWRpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihzb3VyY2UsIHRydWUpOwotfQotCi1wdWJsaWMgTm90aWZpY2F0aW9uIGRpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihTdHJpbmcgc291cmNlLCBib29sZWFuIGRvTm90aWZ5KSB7Ci0JaXNCdXN5SXRlcmF0aW5nUmVmbGVjdGVkID0gdHJ1ZTsKLQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gbnVsbDsKLQl0cnkgewotCQlTdHJpbmcgaW5uZXJOYW1lID0gc291cmNlICsgJyQnOwotCQlJdGVyYXRvciBpdCA9IHJlZmxlY3RlZC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCU1hcC5FbnRyeSBlbnRyeTsKLQkJU3RyaW5nIGtleTsKLQkJSmF2YVJlZmxlY3Rpb25BZGFwdG9yIGFkYXB0b3I7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJa2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlpZiAoa2V5LmVxdWFscyhzb3VyY2UpIHx8IGtleS5zdGFydHNXaXRoKGlubmVyTmFtZSkpIHsKLQkJCQlhZGFwdG9yID0gKEphdmFSZWZsZWN0aW9uQWRhcHRvcikgcmVmbGVjdGVkLmdldChrZXkpOwotCQkJCWlmIChhZGFwdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGRvTm90aWZ5KQotCQkJCQkJYWRhcHRvci5yZWxlYXNlU291cmNlVHlwZSgpOwotCQkJCQllbHNlCi0JCQkJCQlub3RpZmljYXRpb24gPSBhZGFwdG9yLnJlbGVhc2VTb3VyY2VUeXBlTm9Ob3RpZmljYXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGZpbmFsbHkgewotCQlmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpOwotCX0KLQlyZXR1cm4gbm90aWZpY2F0aW9uOwotfQotCi1wcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZEl0ZXJhdGluZ1JlZmxlY3RlZCgpIHsKLQlpc0J1c3lJdGVyYXRpbmdSZWZsZWN0ZWQgPSBmYWxzZTsKLQlpZiAodW5yZWdpc3RlclF1ZXVlICE9IG51bGwgJiYgIXVucmVnaXN0ZXJRdWV1ZS5pc0VtcHR5KCkpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bnJlZ2lzdGVyUXVldWUuc2l6ZSgpOyBpKyspIHsKLQkJCXJlZmxlY3RlZC5yZW1vdmUodW5yZWdpc3RlclF1ZXVlLmdldChpKSk7Ci0JCX0KLQkJdW5yZWdpc3RlclF1ZXVlLmNsZWFyKCk7Ci0JfQotCWlmIChyZWdpc3RlclF1ZXVlICE9IG51bGwgJiYgIXJlZ2lzdGVyUXVldWUuaXNFbXB0eSgpKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVnaXN0ZXJRdWV1ZS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCU1hcC5FbnRyeSBlbnRyeTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlyZWZsZWN0ZWQucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJfQotCQlyZWdpc3RlclF1ZXVlLmNsZWFyKCk7Ci0JfQotfQotcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCXJldHVybiBUWVBFX0tFWS5lcXVhbHModHlwZSk7Ci19Ci19Ci0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbkFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25BZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWY3Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhUmVmbGVjdGlvbkFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFSZWZsZWN0aW9uQWRhcHRvciBleHRlbmRzIFJlZmxlY3Rpb25BZGFwdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ19NRVRIT0RfREVGQVVMVF9DVE9SID0gU3RyaW5nLnZhbHVlT2YoQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIpICsgU19DT05TVFJVQ1RPUl9UT0tFTjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMRUZUX0JSQUNLRVQgPSAiWyI7Ly8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFNwZWNpYWwgbm90aWZpY2F0aW9uIGV2ZW50IHR5cGUuIFRoaXMgaXMgc2VudCBhZ2FpbnN0IGEgSmF2YUNsYXNzIChhcyB0aGUgdGFyZ2V0KSB3aGVuZXZlciBmbHVzaCBvZiB0aGUgcmVmbGVjdGlvbiBvY2N1cnMuIEl0IHdpbGwgYmUKLQkgKiBzZW50IHVuZGVyIHRoZSBub3RpZmljYXRpb24gZXZlbnQgdHlwZSBvZiBSRUZMRUNUSU9OX0VWRU5ULgotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBGTFVTSF9SRUZMRUNUSU9OX0VWRU5UID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFY29yZUZhY3RvcnkoKS5jcmVhdGVFQXR0cmlidXRlKCk7Ci0JCi0JLyoqCi0JICogU3BlY2lhbCBub3RpZmljYXRpb24gZXZlbnQgdHlwZS4gVGhpcyBpcyBzZW50IGFnYWluc3QgYSBKYXZhQ2xhc3MgKGFzIHRoZSB0YXJnZXQpIHdoZW5ldmVyIGZsdXNoIG9mIGEgbmV3IGNsYXNzIChpLmUuIAotCSAqIG5vIHNvdXJjZSB3YXMgZm91bmQpIG9mIHRoZSByZWZsZWN0aW9uIG9jY3Vycy4gSXQgd2lsbCBiZQotCSAqIHNlbnQgdW5kZXIgdGhlIG5vdGlmaWNhdGlvbiBldmVudCB0eXBlIG9mIFJFRkxFQ1RJT05fRVZFTlQuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEZMVVNIX05FV19SRUZMRUNUSU9OX0VWRU5UID0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFY29yZUZhY3RvcnkoKS5jcmVhdGVFQXR0cmlidXRlKCk7Ci0KLQkvKgotCSAqIEZpbGwgaW4gdGhlIG5hbWUuIE5vdCByZWFsbHkgbmVlZGVkIGJ1dCBpdCB3b3VsZCBiZSBuaWNlLgotCSAqLwotCXN0YXRpYyB7Ci0JCUZMVVNIX1JFRkxFQ1RJT05fRVZFTlQuc2V0TmFtZSgiZmx1c2hSZWZsZWN0ZWRWYWx1ZXMiKTsgICAgLy8kTk9OLU5MUy0xJAotCQlGTFVTSF9ORVdfUkVGTEVDVElPTl9FVkVOVC5zZXROYW1lKCJmbHVzaE5ld1JlZmxlY3RlZFZhbHVlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCXByb3RlY3RlZCBib29sZWFuIGhhc0ZsdXNoZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZsdXNoaW5nID0gZmFsc2U7Ci0vKioKLSAqIEphdmFSZWZsZWN0aW9uQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICovCi1wdWJsaWMgSmF2YVJlZmxlY3Rpb25BZGFwdG9yKCkgewotCXN1cGVyKCk7Ci19Ci0vKioKLSAqIEphdmFSZWZsZWN0aW9uQWRhcHRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIHRhcmdldCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcgotICovCi1wdWJsaWMgSmF2YVJlZmxlY3Rpb25BZGFwdG9yKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyIHRhcmdldCkgewotCXN1cGVyKHRhcmdldCk7Ci19Ci0vKioKLSAqIGNyZWF0ZUJsb2NrIC0gaW5zdGFudGlhdGUgYSBCbG9jayBjb250YWluaW5nIHRoZSBwYXNzZWQgc291cmNlCi0gKi8KLXB1YmxpYyBCbG9jayBjcmVhdGVCbG9jayhTdHJpbmcgbmFtZSwgU3RyaW5nIHNvdXJjZVN0cmluZykgewotCUJsb2NrIG5ld0Jsb2NrID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVCbG9jaygpOwotCW5ld0Jsb2NrLnNldE5hbWUobmFtZSArICJfIiArICJibG9jayIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JbmV3QmxvY2suc2V0U291cmNlKHNvdXJjZVN0cmluZyk7Ci0JcmV0dXJuIG5ld0Jsb2NrOwotfQotLyoqCi0gKiBzZXRTdXBlciAtIHNldCBvdXIgc3VwZXJ0eXBlIGhlcmUsIGltcGxlbWVudGVkIGludGVyZmFjZSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5Ci0gKi8KLXB1YmxpYyBKYXZhQ2xhc3MgY3JlYXRlSmF2YUNsYXNzUmVmKFN0cmluZyB0YXJnZXROYW1lKSB7Ci0JcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLX0KLS8qKgotICogY3JlYXRlSmF2YVBhcmFtZXRlciAtIGluc3RhbnRpYXRlIGEgSmF2YSBQYXJhbWV0ZXIgYmFzZWQgb24gdGhlIHBhc3NlZCBuYW1lIGFuZCB0eXBlIG5hbWUgKGEgc2ltcGxlIG5hbWUsIE5PVCBBIFNJR05BVFVSRSEhISkKLSAqIFRoZSBpZCBmb3IgYSBwYXJhbWV0ZXIgaGFzIHRvIGJlIGNvbXBsZXggaW4gb3JkZXIgdG8gYmUgcGFyc2FibGUgaW50byBjbGFzcywgbWV0aG9kLCBhbmQgcGFybS4KLSAqIEl0IGlzIGNyZWF0ZWQgYnkgYXBwZW5kaW5nIHRoZSBwYXJtIG5hbWUgdG8gdGhlIG1ldGhvZCBpZCwgd2l0aCBhIGtub3duIHNlcGFyYXRvci4KLSAqIEl0IHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSAiRm9vLmRvU29tZXRoaW5nKGphdmEubGFuZy5JbnRlZ2VyLWFyZzAiCi0gKi8KLXB1YmxpYyBKYXZhUGFyYW1ldGVyIGNyZWF0ZUphdmFQYXJhbWV0ZXIoTWV0aG9kIHBhcmVudE1ldGhvZCwgU3RyaW5nIHBhcm1OYW1lLCBTdHJpbmcgcGFybVR5cGVOYW1lKSB7Ci0JSmF2YVBhcmFtZXRlciBuZXdQYXJtID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0JaWYgKHBhcm1OYW1lIT1udWxsKQotCSAgIG5ld1Bhcm0uc2V0TmFtZShwYXJtTmFtZSk7Ci0vLyAoKEludGVybmFsRU9iamVjdCluZXdQYXJtKS5lU2V0SUQocGFyZW50TWV0aG9kLmVJRCgpICsgQ19NRVRIT0RJRF9QQVJNSURfREVMSU1JVEVSICsgcGFybU5hbWUpOwotCVN0cmluZyBjbGFzc1JlZlN0cmluZyA9IHBhcm1UeXBlTmFtZTsKLQluZXdQYXJtLnNldEVUeXBlKGNyZWF0ZUphdmFDbGFzc1JlZihjbGFzc1JlZlN0cmluZykpOwotCXJldHVybiBuZXdQYXJtOwotfQotLyoqCi0gKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBhIExpc3Qgb2YgZGltZW5zaW9ucyBmb3IgYSB0eXBlTmFtZS4KLSAqIEZvciBleGFtcGxlICJmb29bXVtdIiB3b3VsZCByZXR1cm4gYSBMaXN0IG9mIEludGVnZXJzCi0gKiAxLCAxLiAgQXQgc29tZSBwb2ludCB3ZSBtYXkgd2FudCB0byBhY3R1YWxseSBjYXB0dXJlIHRoZSBzaXplCi0gKiBmb3IgRmllbGRzIGJ1dCB3ZSB3b3VsZCBuZWVkIHRoZSBpbml0aWFsaXplciBzb3VyY2UgdG8gZGV0ZXJtaW5lIHRoYXQuCi0gKi8KLXB1YmxpYyBMaXN0IGdldEFycmF5RGltZW5zaW9ucyhTdHJpbmcgdHlwZU5hbWUpIHsKLQlMaXN0IGRpbWVuc2lvbnMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpOwotCWlmICh0eXBlTmFtZSAhPSBudWxsKSB7Ci0JCWludCBiZWdpbiA9IDA7Ci0JCWludCBpbmRleCA9IC0xOwotCQl3aGlsZSAoYmVnaW4gPCB0eXBlTmFtZS5sZW5ndGgoKSkgewotCQkJaW5kZXggPSB0eXBlTmFtZS5pbmRleE9mKExFRlRfQlJBQ0tFVCwgYmVnaW4pOwotCQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCQlkaW1lbnNpb25zLmFkZChuZXcgSW50ZWdlcigxKSk7Ci0JCQkJYmVnaW4gPSBpbmRleCArIDE7Ci0JCQl9IGVsc2UgewotCQkJCWJlZ2luID0gdHlwZU5hbWUubGVuZ3RoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGRpbWVuc2lvbnM7Ci19Ci0vKiBHZXQgdGhlIEphdmEgRmFjdG9yeQotICovCi1wcm90ZWN0ZWQgc3RhdGljIEphdmFSZWZGYWN0b3J5IGdldEphdmFGYWN0b3J5KCkgewotCXJldHVybiAoKG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlLmVOU19VUkkpKS5nZXRKYXZhUmVmRmFjdG9yeSgpOwotfQotcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRSZWZsZWN0aW9uU291cmNlKCk7Ci0vKioKLSAqIGdldFR5cGVOYW1lc0Zyb21NZXRob2RVVUlEIC0gUHVsbCB0aGUgcGFybSB0eXBlIG5hbWVzIG91dCBvZiBhIG1ldGhvZCBJRAotICogCQlJdCB3aWxsIGJlIGluIHRoZSBmb3JtOiAic2ltcGxlY2xhc3MubWV0aG9kTmFtZShjb20uZnJvbmsuUGFybTFfdHlwZSxwYXJtMnR5cGUiCi0gKi8KLXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKFN0cmluZyBtZXRob2RJRCkgewotCWlmIChtZXRob2RJRC5jaGFyQXQobWV0aG9kSUQubGVuZ3RoKCktMSkgPT0gQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIgfHwgbWV0aG9kSUQuZW5kc1dpdGgoQ19NRVRIT0RfREVGQVVMVF9DVE9SKSkKLQkJcmV0dXJuIGVtcHR5U3RyaW5nQXJyYXk7Ci0JCQotCS8vIENvdW50IHRoZSBwYXJtcyBmaXJzdC4gIFRoZSBudW1iZXIgb2YgcGFybXMgaXMgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiAnLCcgKyAxCi0JaW50IG51bVBhcm1zID0gMTsKLQlpbnQgcG9zID0gLTE7Ci0JLy8gU2tpcCB0aGUgJy4nIGFmdGVyIGNsYXNzbmFtZQotCXBvcyA9IG1ldGhvZElELmluZGV4T2YoQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSLCArK3Bvcyk7Ci0JLy8gTG9vayBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBwYXJtcwotCWludCBwYXJtUG9zID0gbWV0aG9kSUQuaW5kZXhPZihDX01FVEhPRF9QQVJNX0RFTElNSVRFUiwgKytwb3MpOwotCXBvcyA9IHBhcm1Qb3M7Ci0Jd2hpbGUgKChwb3MgPSBtZXRob2RJRC5pbmRleE9mKENfUEFSTV9QQVJNX0RFTElNSVRFUiwgKytwb3MpKSAhPSAtMSkKLQkJbnVtUGFybXMrKzsKLQlTdHJpbmdbXSBwYXJtVHlwZU5hbWVzID0gbmV3IFN0cmluZ1tudW1QYXJtc107Ci0JLy8gbm93IGNvbGxlY3QgdGhlIHBhcm0gbmFtZXMKLQkvLyBza2lwIHRoZSBtZXRob2QgbmFtZQotCXBvcyA9IHBhcm1Qb3M7Ci0JaW50IGkgPSAwLCBlbmQ7Ci0JZG8gewotCQllbmQgPSBtZXRob2RJRC5pbmRleE9mKENfUEFSTV9QQVJNX0RFTElNSVRFUiwgcG9zICsgMSk7Ci0JCS8vIFRoaXMgaXMgdGhlIGxhc3QgcGFyYW1ldGVyLCB3ZSBtYXkgbmVlZCB0byBzdHJpcCBhIHRyYWlsaW5nICZWIGZvciBhIGNvbnN0cnVjdG9yCi0JCWlmIChlbmQgPT0gLTEpCi0JCQllbmQgPSBtZXRob2RJRC5pbmRleE9mKFNfQ09OU1RSVUNUT1JfVE9LRU4sIHBvcyArIDEpOwotCQkvLyBvdGhlcndpc2UgdGFrZSB0aGUgcmVzdCBvZiB0aGUgSUQKLQkJaWYgKGVuZCA9PSAtMSkKLQkJCWVuZCA9IG1ldGhvZElELmxlbmd0aCgpOwotCQlwYXJtVHlwZU5hbWVzW2krK10gPSBtZXRob2RJRC5zdWJzdHJpbmcocG9zICsgMSwgZW5kKTsKLQl9IHdoaWxlICgocG9zID0gbWV0aG9kSUQuaW5kZXhPZihDX1BBUk1fUEFSTV9ERUxJTUlURVIsICsrcG9zKSkgIT0gLTEpOwotCXJldHVybiBwYXJtVHlwZU5hbWVzOwotfQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpOwotCi1wdWJsaWMgYm9vbGVhbiBoYXNSZWZsZWN0aW9uU291cmNlKCkgewotICAgIHJldHVybiBnZXRSZWZsZWN0aW9uU291cmNlKCkgIT0gbnVsbDsKLX0KLQotLyoqCi0gKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZS4KLSAqCi0gKi8KLXB1YmxpYyB2b2lkIHJlbGVhc2VTb3VyY2VUeXBlKCl7Ci19Ci0KLS8qKgotICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCi0gKiBAcmV0dXJuCi0gKi8KLXB1YmxpYyBOb3RpZmljYXRpb24gcmVsZWFzZVNvdXJjZVR5cGVOb05vdGlmaWNhdGlvbigpIHsKLQlyZXR1cm4gbnVsbDsKLX0KLQotcHVibGljIHN0YXRpYyB2b2lkIHJlbGVhc2VTb3VyY2VUeXBlKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQlpZiAoamF2YUNsYXNzID09IG51bGwpCi0JCXJldHVybjsKLQotCUphdmFSZWZsZWN0aW9uQWRhcHRvciBleGlzdGluZyA9IChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIHJldHJpZXZlQWRhcHRvckZyb20oamF2YUNsYXNzKTsKLQlpZiAoZXhpc3RpbmcgIT0gbnVsbCkKLQkJZXhpc3RpbmcucmVsZWFzZVNvdXJjZVR5cGUoKTsKLX0KLS8qCi0gKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgYSBGaWVsZCBBZGFwdG9yIHRvIHNldCB0aGUgdHlwZSBvZiBhRmllbGQKLSAqIHRvIGJlIGFUeXBlTmFtZS4gIGFUeXBlTmFtZSBtYXkgY29udGFpbiBhcnJheSBicmFja2V0cyB3aGljaCBuZWVkCi0gKiB0byBiZSBkZXRlY3RlZCBpbiBvcmRlciB0byBzZXQgdGhlIGFycmF5IGRpbWVuc2lvbnMgb24gYUZpZWxkLgotICovCi1wcm90ZWN0ZWQgdm9pZCBzZXRGaWVsZFR5cGUoRmllbGQgYUZpZWxkLCBTdHJpbmcgYVR5cGVOYW1lKSB7Ci0JaWYgKGFGaWVsZCAhPSBudWxsICYmIGFUeXBlTmFtZSAhPSBudWxsKSB7Ci0JCVN0cmluZyBjbGFzc1JlZlN0cmluZyA9IGFUeXBlTmFtZTsKLQkJYUZpZWxkLnNldEVUeXBlKGNyZWF0ZUphdmFDbGFzc1JlZihjbGFzc1JlZlN0cmluZykpOwotCX0KLX0KLXB1YmxpYyBmaW5hbCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoKSB7Ci0JcmV0dXJuIGZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoZmFsc2UpOwotfQotcHVibGljIGZpbmFsIGJvb2xlYW4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShib29sZWFuIGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpIHsKLQlOb3RpZmljYXRpb24gbm90ID0gZmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeU5vTm90aWZpY2F0aW9uKGNsZWFyQ2FjaGVkTW9kZWxPYmplY3QpOwotCWlmIChub3QgIT0gbnVsbCkKLQkJZ2V0VGFyZ2V0KCkuZU5vdGlmeShub3QpOwotCXJldHVybiBoYXNGbHVzaGVkOwotfQotCi1wdWJsaWMgc3luY2hyb25pemVkIE5vdGlmaWNhdGlvbiBmbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5Tm9Ob3RpZmljYXRpb24oYm9vbGVhbiBjbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JaWYgKCFoYXNGbHVzaGVkICYmICFpc0ZsdXNoaW5nKSB7Ci0JCWJvb2xlYW4gaXNFeGlzdGluZyA9IGhhc0NhY2hlZFJlZmxlY3Rpb25Tb3VyY2UoKTsKLQkJdHJ5IHsKLQkJCWlzRmx1c2hpbmcgPSB0cnVlOwotCQkJaGFzUmVmbGVjdGVkID0gZmFsc2U7Ci0JCQloYXNGbHVzaGVkID0gZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoY2xlYXJDYWNoZWRNb2RlbE9iamVjdCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQloYXNGbHVzaGVkID0gZmFsc2U7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQotCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKSBlOwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKQotCQkJCXRocm93IChFcnJvcikgZTsKLQkJCWVsc2UKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpc0ZsdXNoaW5nID0gZmFsc2U7Ci0JCQlwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShpc0V4aXN0aW5nKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlRmx1c2hOb3RpZmljYXRpb24oaXNFeGlzdGluZyk7Ci0JfQotCXJldHVybiBudWxsOwotfQotCi0vKioKLSAqIEBwYXJhbSBpc0V4aXN0aW5nCi0gKiBAcmV0dXJuCi0gKi8KLXByb3RlY3RlZCBOb3RpZmljYXRpb24gY3JlYXRlRmx1c2hOb3RpZmljYXRpb24oYm9vbGVhbiBpc0V4aXN0aW5nKSB7Ci0JRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBpc0V4aXN0aW5nID8gRkxVU0hfUkVGTEVDVElPTl9FVkVOVCA6IEZMVVNIX05FV19SRUZMRUNUSU9OX0VWRU5UOwotCXJldHVybiBuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClnZXRUYXJnZXQoKSxFVkVOVCwgZmVhdHVyZSwgbnVsbCwgbnVsbCk7Ci19Ci1wcm90ZWN0ZWQgdm9pZCBwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeShib29sZWFuIGlzRXhpc3RpbmcpIHsKLX0KLS8qKgotICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGNsZWFyaW5nIG9mIHRoZSB2YWx1ZXMuCi0gKi8KLXByb3RlY3RlZCBib29sZWFuIGZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4gY2xlYXJDYWNoZWRNb2RlbE9iamVjdCkgewotCXJldHVybiB0cnVlOwotfQotLyoqCi0gKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciByZWZsZWN0aW9uIGhhZCBvY2N1cnJlZC4KLSAqLwotcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCkgewotCWlmIChpc0ZsdXNoaW5nKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHN1cGVyLnJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotfQotCi0vKioKLSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQKLSAqLwotcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpIHsKLQloYXNGbHVzaGVkID0gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci19Ci19Ci0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25LZXkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVJlZmxlY3Rpb25LZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjNDgyZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL0phdmFSZWZsZWN0aW9uS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5DaGFyYWN0ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLkNoYXJhY3RlclV0aWwuU3RyaW5nSXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyBrZXkgaGFuZGxlcyBKYXZhIFJlZmxlY3Rpb24uIEl0IGNyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIHR5cGUgb2YgZW50cmllcyBpZgotICogdGhleSBhcmUgbm90IGFscmVhZHkgaW4gdGhlIHJlc291cmNlLiBUaGVyZSBpcyBhbiBleHRlbnNpb24gbWVjaGFuaXNtIGZvciBvdGhlcgotICogdHlwZXMgb2YgaWRzIHRoYXQgYXJlIG5vdCByZWNvZ25pemVkIGJ5IHRoaXMga2V5LiBUaGV5IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlCi0gKiBKYXZhWE1JRmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIHRoZXNlIGtleXMsIGFuZCB0aGUgZmFjdG9yeSB3aWxsIHBhc3MgaW4KLSAqIGEgTGlzdCBvZiB0aGVzZSByZWdpc3RlcmVkIGV4dGVuc2lvbiBwcm9jZXNzZXJzIChJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24pLgotICogCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvNC8yMDAwIDg6MjQ6MzYgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVmbGVjdGlvbktleSBpbXBsZW1lbnRzIElKYXZhUmVmbGVjdGlvbktleSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBQUklNSVRJVkVTID0gbmV3IEFycmF5TGlzdCg4KTsKLQotCXN0YXRpYyB7IGluaXRpYWxpemVQcmltaXRpdmVzQ29sbGVjdGlvbigpOyB9Ci0JCi0JcHJvdGVjdGVkIEphdmFYTUlGYWN0b3J5SW1wbC5KYXZhWE1JUmVzb3VyY2UgcmVzb3VyY2U7IC8vRkIKLQlwcm90ZWN0ZWQgTGlzdCBleHRlbnNpb25zOwotCi1wdWJsaWMgSmF2YVJlZmxlY3Rpb25LZXkoTGlzdCBleHRlbnNpb25zLCBKYXZhWE1JRmFjdG9yeUltcGwuSmF2YVhNSVJlc291cmNlIHJlc291cmNlKSB7Ci0gIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7Ci0gIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLX0KLS8vRkIgRU5ECi0KLS8qIAotICogQ3JlYXRlIGFuIEFycmF5VHlwZSBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotICovCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNjcmVhdGVBcnJheVR5cGUoKQotICovCi1wdWJsaWMgQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZSgpIHsKLQlyZXR1cm4gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVBcnJheVR5cGUoKTsKLX0KLS8qIAotICogQ3JlYXRlIGEgSmF2YUNsYXNzIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0gKiBIYW5kbGVzIHRoZSBwdXNoIGFuZCBwb3Agb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0gKi8KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2NyZWF0ZUphdmFDbGFzcygpCi0gKi8KLXB1YmxpYyBKYXZhQ2xhc3MgY3JlYXRlSmF2YUNsYXNzKCkgewotCXJldHVybiBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUphdmFDbGFzcygpOwotfQotLyoqCi0gKiBDcmVhdGUgYSBkYXRhIHR5cGUgYW5kIHB1dCBpdCBpbiB0aGUgcHJpbWl0aXZlcyByZXNvdXJjZQotICovCi1wcm90ZWN0ZWQgRUNsYXNzaWZpZXIgZ2V0SmF2YURhdGFUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCUphdmFEYXRhVHlwZSByZXN1bHQgPSBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUphdmFEYXRhVHlwZSgpOwotCXJlc3VsdC5zZXROYW1lKHR5cGVOYW1lKTsKLQkvLyAoKEludGVybmFsRU9iamVjdClyZXN1bHQpLmVTZXRJRCh0eXBlTmFtZSk7Ci0JLy9yZXN1bHQuZVNldFVVSUQoKFVVSUQpIG51bGwpOwotCS8vcmVzdWx0LnNldEVQYWNrYWdlKGdldFBhY2thZ2UoKSk7Ci0JZ2V0UGFja2FnZSgpLmdldEVDbGFzc2lmaWVycygpLmFkZChyZXN1bHQpOwotCXJlc291cmNlLnNldElEKHJlc3VsdCwgdHlwZU5hbWUpOwkKLQlyZXR1cm4gcmVzdWx0OwotfQotLyogCi0gKiBDcmVhdGUgYSBGaWVsZCBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotICovCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNjcmVhdGVKYXZhRmllbGQoKQotICovCi1wdWJsaWMgRmllbGQgY3JlYXRlSmF2YUZpZWxkKCkgewotCXJldHVybiBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUZpZWxkKCk7Ci19Ci0vKiAKLSAqIENyZWF0ZSBhIE1ldGhvZCBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotICovCi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNjcmVhdGVKYXZhTWV0aG9kKCkKLSAqLwotcHVibGljIE1ldGhvZCBjcmVhdGVKYXZhTWV0aG9kKCkgewotCXJldHVybiBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZCgpOwotfQotLyogCi0gKiBDcmVhdGUgYSBKYXZhUGFyYW1ldGVyIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0gKi8KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2NyZWF0ZUphdmFQYXJhbWV0ZXIoKQotICovCi1wdWJsaWMgSmF2YVBhcmFtZXRlciBjcmVhdGVKYXZhUGFyYW1ldGVyKCkgewotCXJldHVybiBnZXRKYXZhRmFjdG9yeSgpLmNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLX0KLS8vRkIvKioKLS8vRkIgKiBPdmVycmlkZSB0byB0cnkgdG8gaW50cm9zcGVjdCBvYmplY3RzCi0vL0ZCICogdGhhdCBhcmVuJ3QgZm91bmQgdXNpbmcgdGhlIGRlZmF1bHQgbWVjaGFuaXNtLgotLy9GQiAqLwotLy9GQnB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLS8vRkIgCU9iamVjdCBqYXZhT2JqZWN0ID0gc3VwZXIuZ2V0KGtleSk7Ci0vL0ZCIAlpZiAoamF2YU9iamVjdCA9PSBudWxsKSB7Ci0vL0ZCIAkJamF2YU9iamVjdCA9IGdldE9iamVjdEZyb21FeHRlbnNpb25zKChTdHJpbmcpIGtleSk7Ci0vL0ZCIAkJaWYgKGphdmFPYmplY3QgPT0gbnVsbCkKLS8vRkIgCQkJamF2YU9iamVjdCA9IGdldEphdmFPYmplY3QoKFN0cmluZykga2V5KTsKLS8vRkIgCX0KLS8vRkIJcmV0dXJuIGphdmFPYmplY3Q7Ci0vL0ZCfQotCi0vL0ZCIEFEREVECi0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNnZXQoamF2YS5sYW5nLlN0cmluZykKLSAqLwotcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIGtleSkgewotCU9iamVjdCBqYXZhT2JqZWN0ID0gZ2V0T2JqZWN0RnJvbUV4dGVuc2lvbnMoa2V5KTsKLQlpZiAoamF2YU9iamVjdCA9PSBudWxsKQotCQlqYXZhT2JqZWN0ID0gZ2V0SmF2YU9iamVjdChrZXkpOwotCXJldHVybiBqYXZhT2JqZWN0OwotfQotLy9GQiBFTkQKLQotLyoKLSAqIEluc3RhbnRpYXRlIHRoZSBuYW1lZCBjbGFzcy4KLSAqIElmIHdlIG1ha2UgaXQgdG8gdGhpcyBwb2ludCwgdGhlIGNsYXNzIGhhcyBub3QgeWV0IGJlZW4gaW5zdGFudGlhdGVkIG9yIHJlZmxlY3RlZC4KLSAqLwotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjZ2V0QXJyYXlUeXBlKGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBFQ2xhc3NpZmllciBnZXRBcnJheVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JQXJyYXlUeXBlIGFycmF5VHlwZSA9IHRoaXMuY3JlYXRlQXJyYXlUeXBlKCk7Ci0JYXJyYXlUeXBlLnNldE5hbWUodHlwZU5hbWUpOwotCS8vICgoSW50ZXJuYWxFT2JqZWN0KWFycmF5VHlwZSkuZVNldElEKHR5cGVOYW1lKTsKLQkvL2FycmF5VHlwZS5lU2V0VVVJRCgoVVVJRCkgbnVsbCk7Ci0JaW50IHBvcyA9IC0xLCBicmFjZXMgPSAwOwotCWRvIHsKLQkJcG9zID0gdHlwZU5hbWUuaW5kZXhPZigiWyIsIHBvcysxKTsvLyROT04tTkxTLTEkCi0JCWlmIChwb3MgIT0gLTEpCi0JCQlicmFjZXMrKzsKLQl9IHdoaWxlIChwb3MgIT0gLTEpOwotCWFycmF5VHlwZS5zZXRBcnJheURpbWVuc2lvbnMoYnJhY2VzKTsKLQkvL2FycmF5VHlwZS5zZXRFUGFja2FnZShnZXRQYWNrYWdlKCkpOwotCWdldFBhY2thZ2UoKS5nZXRFQ2xhc3NpZmllcnMoKS5hZGQoYXJyYXlUeXBlKTsKLQlyZXNvdXJjZS5zZXRJRChhcnJheVR5cGUsIHR5cGVOYW1lKTsJCi0JcmV0dXJuIGFycmF5VHlwZTsKLX0KLS8qCi0gKiBJbnN0YW50aWF0ZSB0aGUgbmFtZWQgY2xhc3MuCi0gKiBJZiB3ZSBtYWtlIGl0IHRvIHRoaXMgcG9pbnQsIHRlaCBjbGFzcyBoYXMgbm90IHlldCBiZWVuIGluc3RhbnRpYXRlZCBvciByZWZsZWN0ZWQuCi0gKi8KLS8qIChub24tSmF2YWRvYykKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFSZWZsZWN0aW9uS2V5I2dldEphdmFDbGFzcyhqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgRUNsYXNzaWZpZXIgZ2V0SmF2YUNsYXNzKFN0cmluZyB0eXBlTmFtZSkgewotCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSB0aGlzLmNyZWF0ZUphdmFDbGFzcygpOwotCWphdmFDbGFzcy5zZXROYW1lKHR5cGVOYW1lKTsKLQkvLyAoKEludGVybmFsRU9iamVjdClqYXZhQ2xhc3MpLmVTZXRJRChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkvL2phdmFDbGFzcy5lU2V0VVVJRCgoVVVJRCkgbnVsbCk7Ci0JLy8gamF2YUNsYXNzLnNldEVQYWNrYWdlKGdldFBhY2thZ2UoKSk7Ci0JZ2V0UGFja2FnZSgpLmdldEVDbGFzc2lmaWVycygpLmFkZChqYXZhQ2xhc3MpOwotCXJlc291cmNlLnNldElEKGphdmFDbGFzcywgdHlwZU5hbWUpOwotCXJldHVybiBqYXZhQ2xhc3M7Ci19Ci0vKiBHZXQgdGhlIEphdmEgRmFjdG9yeQotICovCi1wcm90ZWN0ZWQgc3RhdGljIEphdmFSZWZGYWN0b3J5IGdldEphdmFGYWN0b3J5KCkgewotCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0U7Ci19Ci0vKioKLSAqIFRoaXMgYWxsb3dzIGZvciB0aGUgZGlyZWN0IHJldHJpZXZhbCBvZiBmaWVsZHMgd2l0aCB0aGUgZm9sbG93aW5nIG5vdGF0aW9uOgotICogZmllbGQ6IGphdmE6L2NvbS5pYm0uZm9vI1Rlc3QuZm9vCi0gKiAKLSAqLwotcHJvdGVjdGVkIEZpZWxkIGdldEphdmFGaWVsZChTdHJpbmcga2V5VmFsdWUpIHsKLQlGaWVsZCByZXN1bHQgPSBudWxsOwotCVN0cmluZyBjbGFzc05hbWUsIG1lbWJlck5hbWU7Ci0JaW50IG1lbWJlckRlbGltaXRlciA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQljbGFzc05hbWUgPSBrZXlWYWx1ZS5zdWJzdHJpbmcoMCwgbWVtYmVyRGVsaW1pdGVyKTsKLQltZW1iZXJOYW1lID0ga2V5VmFsdWUuc3Vic3RyaW5nKG1lbWJlckRlbGltaXRlciArIDEpOwotCUVDbGFzc2lmaWVyIGphdmFDbGFzcyA9IChFQ2xhc3NpZmllcikgcHJpbUdldChjbGFzc05hbWUpOwotCS8vIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBpbnN0YW50aWF0ZWQgdGhlIGNvbnRhaW5pbmcgY2xhc3MsIHRoZW4gZ28gZG8gaXQuCi0JaWYgKGphdmFDbGFzcyA9PSBudWxsKQotCQlqYXZhQ2xhc3MgPSBnZXRKYXZhVHlwZShjbGFzc05hbWUpOwotCWlmICgoamF2YUNsYXNzICE9IG51bGwpICYmICEoKEphdmFIZWxwZXJzKSBqYXZhQ2xhc3MpLmlzUHJpbWl0aXZlKCkpIHsKLQkJLy8gV2UgaGF2ZSBhIGNsYXNzLiBOb3cgd2UgbmVlZCB0byBmb3JjZSByZWZsZWN0aW9uLCB0aGlzIHdpbGwgY2F1c2UKLQkJLy8gdGhlIEphdmFSZWZsZWN0aW9uS2V5IHRvIGJlIHVwZGF0ZWQgYW5kIGhhdmUgdGhlIG1lbWJlciBhZGRlZCB0byB0aGUKLQkJLy8gbGlzdC4KLQkJKChKYXZhQ2xhc3MpIGphdmFDbGFzcykuZ2V0RmllbGRzKCk7Ci0JCS8vRkIgcmVzdWx0ID0gKEZpZWxkKSBzdXBlci5nZXQoa2V5VmFsdWUpOyAvLyBJdCBzaG91bGQgbm93IGJlIHJlZ2lzdGVyZWQuCi0JCXJlc3VsdCA9IChGaWVsZCkgcHJpbUdldChrZXlWYWx1ZSk7IC8vIEl0IHNob3VsZCBub3cgYmUgcmVnaXN0ZXJlZC4KLQkJCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJRmllbGQgdGVtcEZpZWxkID0gY3JlYXRlSmF2YUZpZWxkKCk7Ci0JCQl0ZW1wRmllbGQuc2V0TmFtZShtZW1iZXJOYW1lKTsKLQkJCS8vICgoSW50ZXJuYWxFT2JqZWN0KXRlbXBGaWVsZCkuZVNldElEKGtleVZhbHVlKTsKLQkJCS8vdGVtcEZpZWxkLmVTZXRVVUlEKChVVUlEKSBudWxsKTsKLQkJCSgoSmF2YUNsYXNzKSBqYXZhQ2xhc3MpLmdldEZpZWxkcygpLmFkZCh0ZW1wRmllbGQpOwotCQkJcmVzdWx0ID0gdGVtcEZpZWxkOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0vKioKLSAqIFRoaXMgYWxsb3dzIGZvciB0aGUgcmV0cmlldmFsIG9mIG1ldGhvZHMgd2l0aCB0aGUgZm9sbG93aW5nIG5vdGF0aW9uOgotICogbWV0aG9kOiBqYXZhOi9jb20uaWJtLmZvbyNUZXN0LmZvb2ZvbygKLSAqIAotICovCi1wcm90ZWN0ZWQgTWV0aG9kIGdldEphdmFNZXRob2QoU3RyaW5nIGtleVZhbHVlKSB7Ci0JTWV0aG9kIHJlc3VsdCA9IG51bGw7Ci0JU3RyaW5nIGNsYXNzTmFtZSwgbWVtYmVyTmFtZTsKLQlpbnQgbWVtYmVyRGVsaW1pdGVyID0ga2V5VmFsdWUuaW5kZXhPZihSZWZsZWN0aW9uQWRhcHRvci5DX0NMQVNTX01FTUJFUl9ERUxJTUlURVIpOwotCWNsYXNzTmFtZSA9IGtleVZhbHVlLnN1YnN0cmluZygwLCBtZW1iZXJEZWxpbWl0ZXIpOwotCWludCBwYXJtRGVsaW1pdGVyID0ga2V5VmFsdWUuaW5kZXhPZihSZWZsZWN0aW9uQWRhcHRvci5DX01FVEhPRF9QQVJNX0RFTElNSVRFUiwgbWVtYmVyRGVsaW1pdGVyKTsKLQltZW1iZXJOYW1lID0ga2V5VmFsdWUuc3Vic3RyaW5nKG1lbWJlckRlbGltaXRlciArIDEsIHBhcm1EZWxpbWl0ZXIpOwotCUVDbGFzc2lmaWVyIGphdmFDbGFzcyA9IChFQ2xhc3NpZmllcikgcHJpbUdldChjbGFzc05hbWUpOwotCS8vIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBpbnN0YW50aWF0ZWQgdGhlIGNvbnRhaW5pbmcgY2xhc3MsIHRoZW4gZ28gZG8gaXQuCi0JaWYgKGphdmFDbGFzcyA9PSBudWxsKQotCQlqYXZhQ2xhc3MgPSBnZXRKYXZhVHlwZShjbGFzc05hbWUpOwotCWlmICgoamF2YUNsYXNzICE9IG51bGwpICYmICEoKEphdmFIZWxwZXJzKSBqYXZhQ2xhc3MpLmlzUHJpbWl0aXZlKCkpIHsKLQkJLy8gV2UgaGF2ZSBhIGNsYXNzLiBOb3cgd2UgbmVlZCB0byBmb3JjZSByZWZsZWN0aW9uLCB0aGlzIHdpbGwgY2F1c2UKLQkJLy8gdGhlIEphdmFSZWZsZWN0aW9uS2V5IHRvIGJlIHVwZGF0ZWQgYW5kIGhhdmUgdGhlIG1lbWJlciBhZGRlZCB0byB0aGUKLQkJLy8gbGlzdC4KLQkJKChKYXZhQ2xhc3MpIGphdmFDbGFzcykuZ2V0TWV0aG9kcygpOwotCQlyZXN1bHQgPSAoTWV0aG9kKSBwcmltR2V0KGtleVZhbHVlKTsgLy8gSXQgc2hvdWxkIG5vdyBiZSByZWdpc3RlcmVkLgotCQkKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlNZXRob2QgdGVtcE1ldGhvZCA9IGNyZWF0ZUphdmFNZXRob2QoKTsKLQkJCXRlbXBNZXRob2Quc2V0TmFtZShtZW1iZXJOYW1lKTsKLQkJCXJlc291cmNlLnNldElEKHRlbXBNZXRob2QsIGtleVZhbHVlKTsKLQkJCSgoSmF2YUNsYXNzKSBqYXZhQ2xhc3MpLmdldE1ldGhvZHMoKS5hZGQodGVtcE1ldGhvZCk7Ci0JCQlyZXN1bHQgPSB0ZW1wTWV0aG9kOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNnZXRKYXZhT2JqZWN0KGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBFT2JqZWN0IGdldEphdmFPYmplY3QoU3RyaW5nIGtleVZhbHVlKSB7Ci0JRU9iamVjdCByZXN1bHQgPSBudWxsOwotCWludCBpbmRleCA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQlpZiAoaW5kZXggPiAwKSB7Ci0JCS8vIFRoZSByZWZlcmVuY2UgaXMgdG8gYSBtZW1iZXI6IGZpZWxkLCBtZXRob2QsIG9yIHBhcmFtZXRlci4KLQkJLy8gVGFrZSB0aGUgbW9zdCBzcGVjaWZpYyBjYXNlIGZpcnN0LCBhIHBhcmFtZXRlci4KLQkJLy8gT25seSBhIHBhcmFtZXRlciBzaG91bGQgY29udGFpbiB0aGUgbWV0aG9kSUQgdG8gcGFybUlEIGRlbGltaXRlci4KLQkJYm9vbGVhbiBpc1BhcmFtZXRlciA9IChrZXlWYWx1ZS5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfTUVUSE9ESURfUEFSTUlEX0RFTElNSVRFUiwgaW5kZXgpICE9IC0xKTsKLQkJaWYgKGlzUGFyYW1ldGVyKSB7Ci0JCQlyZXN1bHQgPSBnZXRKYXZhUGFyYW1ldGVyKGtleVZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFRoZSB0YXJnZXQgaXMgYSBmaWVsZCBvciBtZXRob2QuIElmIGl0IGhhcyBhICIoIiwgdGhlbiBpdCBpcyBhIG1ldGhvZC4KLQkJCS8vIElmIGl0IGlzIG5vdCBmb3VuZCwgdGhlbiB3ZSB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBvYmplY3QuCi0JCQlpbnQgcGFybVN0YXJ0ID0ga2V5VmFsdWUuaW5kZXhPZihSZWZsZWN0aW9uQWRhcHRvci5DX01FVEhPRF9QQVJNX0RFTElNSVRFUiwgaW5kZXgpOwotCQkJYm9vbGVhbiBpc0ZpZWxkID0gcGFybVN0YXJ0ID09IC0xOwotCQkJaWYgKGlzRmllbGQpIHsKLQkJCQlyZXN1bHQgPSBnZXRKYXZhRmllbGQoa2V5VmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgPSBnZXRKYXZhTWV0aG9kKGtleVZhbHVlKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IGdldEphdmFUeXBlKGtleVZhbHVlKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBTZWUgaWYgdGhlIGV4dGVuc2lvbnMgY2FuIHJlc29sdmUgdGhpcyBmaXJzdC4KLSAqLwotcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3RGcm9tRXh0ZW5zaW9ucyhTdHJpbmcga2V5VmFsdWUpIHsKLQlpZiAoZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gZXh0ZW5zaW9uID0gKElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbikgaXRlci5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqID0gZXh0ZW5zaW9uLmdldE9iamVjdChrZXlWYWx1ZSwgdGhpcyk7Ci0JCQlpZiAob2JqICE9IG51bGwpCi0JCQkJcmV0dXJuIG9iajsKLQkJfQotCX0KLQotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBUaGlzIGFsbG93cyBmb3IgdGhlIHJldHJpZXZhbCBvZiBwYXJhbWV0ZXJzIHdpdGggdGhlIGZvbGxvd2luZyBub3RhdGlvbjoKLSAqIHBhcmFtZXRlcjogamF2YTovY29tLmlibS5mb28jVGVzdC5mb29mb28oLWFyZzAKLSAqIAotICovCi1wcm90ZWN0ZWQgSmF2YVBhcmFtZXRlciBnZXRKYXZhUGFyYW1ldGVyKFN0cmluZyBrZXlWYWx1ZSkgewotCUphdmFQYXJhbWV0ZXIgcmVzdWx0ID0gbnVsbDsKLQlTdHJpbmcgcGFybU5hbWU7Ci0JaW50IG1lbWJlckRlbGltaXRlciA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19DTEFTU19NRU1CRVJfREVMSU1JVEVSKTsKLQlpbnQgcGFybURlbGltaXRlciA9IGtleVZhbHVlLmluZGV4T2YoUmVmbGVjdGlvbkFkYXB0b3IuQ19NRVRIT0RJRF9QQVJNSURfREVMSU1JVEVSLCBtZW1iZXJEZWxpbWl0ZXIpOwotCXBhcm1OYW1lID0ga2V5VmFsdWUuc3Vic3RyaW5nKHBhcm1EZWxpbWl0ZXIgKyAxKTsKLQkvLyBnZXRNZXRob2QoKSB3aWxsIGZpbmQgb3IgY3JlYXRlIGEgbWV0aG9kCi0JTWV0aG9kIG1ldGhvZCA9IHRoaXMuZ2V0SmF2YU1ldGhvZChrZXlWYWx1ZS5zdWJzdHJpbmcocGFybURlbGltaXRlcikpOwotCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQlyZXN1bHQgPSBtZXRob2QuZ2V0UGFyYW1ldGVyKHBhcm1OYW1lKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlKYXZhUGFyYW1ldGVyIHRlbXBQYXJhbWV0ZXIgPSBjcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0JCQl0ZW1wUGFyYW1ldGVyLnNldE5hbWUocGFybU5hbWUpOwotCQkJLy8gKChJbnRlcm5hbEVPYmplY3QpdGVtcFBhcmFtZXRlcikuZVNldElEKGtleVZhbHVlKTsKLQkJCS8vIHRlbXBQYXJhbWV0ZXIuZVNldFVVSUQoKFVVSUQpIG51bGwpOwotCQkJbWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQodGVtcFBhcmFtZXRlcik7Ci0JCQlyZXN1bHQgPSB0ZW1wUGFyYW1ldGVyOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0vKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhUmVmbGVjdGlvbktleSNnZXRKYXZhVHlwZShqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgRUNsYXNzaWZpZXIgZ2V0SmF2YVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JaWYgKGlzUHJpbWl0aXZlKHR5cGVOYW1lKSkKLQkJcmV0dXJuIGdldEphdmFEYXRhVHlwZSh0eXBlTmFtZSk7Ci0JZWxzZSBpZiAoaXNBcnJheSh0eXBlTmFtZSkpCi0JCXJldHVybiBnZXRBcnJheVR5cGUodHlwZU5hbWUpOwotCWVsc2UgaWYgKGlzVmFsaWRKYXZhSWRlbnRpZmllcih0eXBlTmFtZSkpCi0JCXJldHVybiBnZXRKYXZhQ2xhc3ModHlwZU5hbWUpOwotCXJldHVybiBudWxsOwotfQotCi1wcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkSmF2YUlkZW50aWZpZXIoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JaWYgKHR5cGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQlTdHJpbmdJdGVyYXRvciBjaGFySXRlciA9IG5ldyBTdHJpbmdJdGVyYXRvcih0eXBlTmFtZSk7Ci0JCWlmIChDaGFyYWN0ZXJVdGlsLmlzSmF2YUlkZW50aWZpZXJTdGFydChjaGFySXRlci5uZXh0KCkpKSB7Ci0JCQkvLyBTdGFydHMgd2l0aCBhIHZhbGlkIGphdmEgaWRlbnRpZmllciBjaGFyYWN0ZXIuCi0JCQkvLyBOb3cgc2VlIGlmIHRoZSByZXN0IGFyZSB2YWxpZC4KLQkJCXdoaWxlIChjaGFySXRlci5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoIUNoYXJhY3RlclV0aWwuaXNKYXZhSWRlbnRpZmllclBhcnQoY2hhckl0ZXIubmV4dCgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBOb3QgdmFsaWQKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjcHJpbUdldChqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgT2JqZWN0IHByaW1HZXQoU3RyaW5nIGtleSkgewotCXJldHVybiByZXNvdXJjZS5wcmltR2V0RU9iamVjdChrZXkpOwotfQotcHJvdGVjdGVkIEVQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JLy9GQiByZXR1cm4gKEVQYWNrYWdlKSBzdXBlci5nZXQoSmF2YVBhY2thZ2UuUEFDS0FHRV9JRCk7Ci0JLy8gcmV0dXJuIChFUGFja2FnZSkgcmVzb3VyY2UuZ2V0RU9iamVjdChKYXZhUGFja2FnZS5QQUNLQUdFX0lEKTsgLy9GQgotCS8vcmV0dXJuIChFUGFja2FnZSkgcmVzb3VyY2UuZ2V0RU9iamVjdChKYXZhUGFja2FnZS5QQUNLQUdFX0lEKTsgLy9GQgotCXJldHVybiAoRVBhY2thZ2UpRWNvcmVVdGlsLmdldE9iamVjdEJ5VHlwZShyZXNvdXJjZS5nZXRDb250ZW50cygpLCBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVQYWNrYWdlKCkpOwotfQotLyoqCi0gKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTAvNC8yMDAwIDk6NTY6NTMgQU0pCi0gKi8KLXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZVByaW1pdGl2ZXNDb2xsZWN0aW9uKCkgewotCVBSSU1JVElWRVMuYWRkKE5fVk9JRCk7Ci0JUFJJTUlUSVZFUy5hZGQoTl9CT09MRUFOKTsKLQlQUklNSVRJVkVTLmFkZChOX0JZVEUpOwotCVBSSU1JVElWRVMuYWRkKE5fQ0hBUik7Ci0JUFJJTUlUSVZFUy5hZGQoTl9ET1VCTEUpOwotCVBSSU1JVElWRVMuYWRkKE5fRkxPQVQpOwotCVBSSU1JVElWRVMuYWRkKE5fSU5UKTsKLQlQUklNSVRJVkVTLmFkZChOX0xPTkcpOwotCVBSSU1JVElWRVMuYWRkKE5fU0hPUlQpOwotfQotLyogKG5vbi1KYXZhZG9jKQotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YVJlZmxlY3Rpb25LZXkjaXNBcnJheShqYXZhLmxhbmcuU3RyaW5nKQotICovCi1wdWJsaWMgYm9vbGVhbiBpc0FycmF5KFN0cmluZyB0eXBlTmFtZSkgewotCXJldHVybiB0eXBlTmFtZS5lbmRzV2l0aCgiW10iKTsvLyROT04tTkxTLTEkCi19Ci0vKioKLSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMC80LzIwMDAgOTo1NDoyMyBBTSkKLSAqIEByZXR1cm4gYm9vbGVhbgotICogQHBhcmFtIHR5cGVOYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHJpdmF0ZSBib29sZWFuIGlzUHJpbWl0aXZlKFN0cmluZyB0eXBlTmFtZSkgewotCXJldHVybiBQUklNSVRJVkVTLmNvbnRhaW5zKHR5cGVOYW1lKTsKLX0KLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhWE1JRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvSmF2YVhNSUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNmU5YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9KYXZhWE1JRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhRmFjdG9yeUltcGw7Ci0KLS8qKgotICogRmFjdG9yeSB0byBjcmVhdGUgdGhlIFJlc291cmNlIGZvciB0aGUgSmF2YSBwcm90b2NvbC4KLSAqIAotICogSXQgYWxsb3dzIGV4dGVuc2lvbnMgdG8gdGhlIHJlZmxlY3Rpb24ga2V5IHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBpdC4KLSAqIAotICogQ3JlYXRpb24gZGF0ZTogKDEwLzQvMjAwMCA4OjIyOjIzIEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YVhNSUZhY3RvcnlJbXBsIGV4dGVuZHMgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIEphdmFYTUlGYWN0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX1NFUEVSQVRPUiA9ICI6LyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgTGlzdCBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogSmF2YVhNSUZhY3RvcnlJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEphdmFYTUlGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCByZWdpc3RlclJlZmxlY3Rpb25LZXlFeHRlbnNpb24oSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQlleHRlbnNpb25zLmFkZChleHRlbnNpb24pOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIGRlcmVnaXN0ZXJSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uKElKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbiBleHRlbnNpb24pIHsKLQkJZXh0ZW5zaW9ucy5yZW1vdmUoZXh0ZW5zaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVKYXZhUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB4bWl1cmksIFJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vIGNoYW5nZWQgdG8gYWxsb3cgYSB6ZXJvLWxlbmd0aCBwYWNrYWdlIG5hbWUgCi0JCS8vIGZvciB0aGUgc3BlY2lhbCBjYXNlIG9mICJqYXZhOi8jaW50IiwgZXRjLgotCQlKYXZhUmVmRmFjdG9yeSBqZmFjID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFOwotCQlKYXZhUGFja2FnZSBwYWNrID0gamZhYy5jcmVhdGVKYXZhUGFja2FnZSgpOwotCQkvLyBOZWVkIHRvIGNyZWF0ZSBhbmQgYWRkIHNwZWNpYWwgSmF2YUZhY3RvcnkgZm9yIGluc3RhbnRpYXRpb24gdG8gd29yay4KLQkJSmF2YUZhY3RvcnlJbXBsIGZhY3QgPSBuZXcgSmF2YUZhY3RvcnlJbXBsKCk7Ci0JCXBhY2suc2V0RUZhY3RvcnlJbnN0YW5jZShmYWN0KTsKLQkJaWYgKHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gU3RhbmRhcmQgSmF2YSBwYWNrYWdlCi0JCQlwYWNrLnNldE5zUHJlZml4KHBhY2thZ2VOYW1lKTsKLQkJCXBhY2suc2V0TmFtZShwYWNrYWdlTmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBQcmltaXRpdmUgcGFja2FnZQotCQkJcGFjay5zZXROc1ByZWZpeChKYXZhUGFja2FnZS5QUklNSVRJVkVfUEFDS0FHRV9OQU1FKTsKLQkJCXBhY2suc2V0TmFtZShKYXZhUGFja2FnZS5QUklNSVRJVkVfUEFDS0FHRV9OQU1FKTsKLQkJfQotCi0JCXBhY2suc2V0TnNVUkkoeG1pdXJpKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocGFjayk7Ci0JCSgoWE1JUmVzb3VyY2UpIHBhY2suZVJlc291cmNlKCkpLnNldElEKHBhY2ssIEphdmFQYWNrYWdlLlBBQ0tBR0VfSUQpOwotCX0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEphdmFYTUlSZXNvdXJjZSBleHRlbmRzIFhNSVJlc291cmNlSW1wbCB7Ci0JCXByb3RlY3RlZCBJSmF2YVJlZmxlY3Rpb25LZXkgcmVmbGVjdGlvbktleTsKLQotCQlwdWJsaWMgSmF2YVhNSVJlc291cmNlKFVSSSB1cmkpIHsKLQkJCXN1cGVyKHVyaSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRSZWZsZWN0aW9uS2V5KElKYXZhUmVmbGVjdGlvbktleSBrZXkpIHsKLQkJCXJlZmxlY3Rpb25LZXkgPSBrZXk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsb2FkKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJdHJ5IHsKLQkJCQlzdXBlci5sb2FkKG9wdGlvbnMpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJfQotCQl9Ci0KLQkJcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChTdHJpbmcgdXJpRnJhZ21lbnQpIHsKLQkJCUVPYmplY3QgcmVzdWx0ID0gc3VwZXIuZ2V0RU9iamVjdCh1cmlGcmFnbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwgJiYgcmVmbGVjdGlvbktleSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gKEVPYmplY3QpIHJlZmxlY3Rpb25LZXkuZ2V0KHVyaUZyYWdtZW50KTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBVc2VkIGJ5IEphdmFSZWZsZWN0aW9uS2V5IHRvIGxvb2sgZGlyZWN0bHkgaW50byBJRCB0YWJsZSB0byBieXBhc3MgYW4gaW5maW5pdGUgbG9vcC4gSXQgd2lsbCAKLQkJICogY2FsbCBoZXJlIGJlY2F1c2UgaXQgbWF5IG5vdCBvZiBmaXJzdCBiZWVuIGZvdW5kLCBidXQgdGhlbiBhZGRlZCwgc28gbm93IGlzIGZvdW5kLgotCQkgKiAKLQkJICogQHBhcmFtIHVyaUZyYWdtZW50Ci0JCSAqIEByZXR1cm4KLQkJICogCi0JCSAqIEBzaW5jZSAxLjEuMAotCQkgKi8KLQkJRU9iamVjdCBwcmltR2V0RU9iamVjdChTdHJpbmcgdXJpRnJhZ21lbnQpIHsKLQkJCXJldHVybiBzdXBlci5nZXRFT2JqZWN0KHVyaUZyYWdtZW50KTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjdXNlSURBdHRyaWJ1dGVzKCkKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUlEQXR0cmlidXRlcygpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJSmF2YVhNSVJlc291cmNlIHJlc291cmNlID0gbmV3IEphdmFYTUlSZXNvdXJjZSh1cmkpOwotCQlyZXNvdXJjZS5zZXRSZWZsZWN0aW9uS2V5KG5ldyBKYXZhUmVmbGVjdGlvbktleShleHRlbnNpb25zLCByZXNvdXJjZSkpOwotCi0JCVN0cmluZyB1cmlTdHJpbmcgPSB1cmkudG9TdHJpbmcoKTsKLQkJY3JlYXRlSmF2YVBhY2thZ2Uoc3RyaXBTY2hlbWUodXJpU3RyaW5nKSwgdXJpU3RyaW5nLCByZXNvdXJjZSk7Ci0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpIHsKLQkJUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRQcm90b2NvbFRvRmFjdG9yeU1hcCgpLnB1dChKYXZhWE1JRmFjdG9yeS5TQ0hFTUUsIEphdmFYTUlGYWN0b3J5LklOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJpcCB0aGUgdHJhaWxpbmcgaWRlbnRpZmllciwgaWYgYW55LCBmcm9tIHRoZSB1cmkuICBBbiBpZGVudGlmaWVyCi0JICogYmVnaW5zIHdpdGggIyBvciB8LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHN0cmlwU2NoZW1lKFN0cmluZyB1cmkpIHsKLQkJaW50IGluZGV4ID0gdXJpLmluZGV4T2YoU0NIRU1BX1NFUEVSQVRPUik7Ci0JCWlmIChpbmRleCAhPSAtMSkKLQkJCXJldHVybiB1cmkuc3Vic3RyaW5nKGluZGV4ICsgU0NIRU1BX1NFUEVSQVRPUi5sZW5ndGgoKSwgdXJpLmxlbmd0aCgpKTsKLQkJZWxzZQotCQkJcmV0dXJuIHVyaTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvUmVhZEFkYXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvUmVhZEFkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczZGFmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL1JlYWRBZGFwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotLyoqCi0gKiBFeHRlbmRlZCBBZGFwdG9yIGludGVyZmFjZSB3aGljaCBhZGRzIHN1cHBvcnQgZm9yIGFuIGFkYXB0ZXIKLSAqIHByb3ZpZGluZyBkZWZhdWx0IHZhbHVlcyBmb3IgYXR0cmlidXRlcy4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQxOjE5IFBNKQotICogQGF1dGhvcjogU2NvdHQgUmljaAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYWRBZGFwdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9LRVkgPSAiSmF2YVJlZmxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZUluKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSk7Ci0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7IC8vRkIKLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9SZWZsZWN0aW9uQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9SZWZsZWN0aW9uQWRhcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzg5Y2EzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvUmVmbGVjdGlvbkFkYXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnM7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuY29yZS5KRU1QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMubmxzLlJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotLyoqCi0gKiBSZWZsZWN0aW9uQWRhcHRvciAtIGEgcmVhZCBhZGFwdG9yIGJhc2UgaW1wbGVtZW50YXRpb24gd2hpY2ggZG9lcyBhIGJ1bGsKLSAqIAlsb2FkIG9mIHJlbGZsZWN0ZWQgdmFsdWVzIG9uIHRoZSBmaXJzdCByZXF1ZXN0LgotICogCVN1YmNsYXNzZXMgY2FuIG9wdGltaXplIHRvIGRlZmVyIHNvbWUgcHJvcGVydGllcy4KLSAqIAlQcm9wZXJ0aWVzIG1heSBhbHNvIGJlIGRlZmVycmVkIGJ5IHNldHRpbmcgdGhlaXIgdmFsdWVzIHdpdGggcHJveHkgcmVmZXJlbmNlcywKLSAqIAlmb3IgZXhhbXBsZSwgZm9yIHN1cGVydHlwZSBhbmQgb3RoZXIgcmVmZXJlbmNlZCB0eXBlcy4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQyOjUwIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmbGVjdGlvbkFkYXB0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsIGltcGxlbWVudHMgUmVhZEFkYXB0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX0NMQVNTX01FTUJFUl9ERUxJTUlURVIgPSAnLic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfTUVUSE9EX1BBUk1fREVMSU1JVEVSID0gJygnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDX01FVEhPRElEX1BBUk1JRF9ERUxJTUlURVIgPSAnLSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENfUEFSTV9QQVJNX0RFTElNSVRFUiA9ICcsJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUEFUSF9ERUxJTUlURVIgPSAnLyc7Ci0JLy8gU1cgaWQgY29udGFpbnMgJiBpbiB4bWwgZmlsZSBjYXN1ZXMgZXhjZXB0aW9uIHRocm93IGR1cmluZyBsb2FkCi0gICAgICAgIC8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNfQ09OU1RSVUNUT1JfVE9LRU4gPSAiJlYiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTX0NPTlNUUlVDVE9SX1RPS0VOID0gIl9WIjsvLyROT04tTkxTLTEkIC8vIFNXCi0JLy8gY2FjaGUgYSBzdGF0aWMgZW1wdHkgU3RyaW5nW10gZm9yIG5vIHBhcm0gbWV0aG9kcwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gZW1wdHlTdHJpbmdBcnJheSA9IG5ldyBTdHJpbmdbMF07Ci0JCi0JCi0JLyoqCi0JICogTm90aWZpY2F0aW9uIGV2ZW50IHR5cGUgZm9yIHNwZWNpYWwgUmVmbGVjdGlvbiBub3RpZmljYXRpb25zLiBUaGlzIHdpbGwgYmUgdGhlIGV2ZW50IHR5cGUgZm9yIHRoZSBzcGVjaWFsIG9uZXMsIGxpa2UgUkVGTEVDVElPTl9FVkVOVC4KLQkgKiBUaGUgbGlzdGVuZXIgc2hvdWxkIGxpc3RlbiBmb3IgdGhpcyBldmVudCB0eXBlLCBhbmQgdGhlbiBjaGVjayB0aGUgZmVhdHVyZSBmb3IgdGhlIHR5cGUgb2Ygc3BlY2lhbCBldmVudCAobGlrZSBSRUZMRUNUSU9OX0VWRU5UKS4KLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVkVOVCA9IC0zNDU2OwkvLyBVc2luZyBhIGZ1bm55IG51bWJlciB0byB0cnkgdG8gZWxpbWluYXRlIGNvbmZsaWN0aW9uIHdpdGggYW55IG90aGVyIHNwZWNpYWxzIHRoYXQgbWF5IG9mIG9jY3VyIGZyb20gb3RoZXIgY29kZSBvbiB0aGUgSmF2YUNsYXNzLgotCQotCS8qKgotCSAqIFNwZWNpYWwgbm90aWZpY2F0aW9uIGV2ZW50IHR5cGUuIFRoaXMgaXMgc2VudCBhZ2FpbnN0IGEgSmF2YUNsYXNzIChhcyB0aGUgdGFyZ2V0KSB3aGVuZXZlciByZWZsZWN0aW9uIG9jY3Vycy4gSXQgd2lsbCBiZQotCSAqIHNlbnQgdW5kZXIgdGhlIG5vdGlmaWNhdGlvbiBldmVudCB0eXBlIG9mIFJFRkxFQ1RJT05fRVZFTlQuCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFJFRkxFQ1RJT05fRVZFTlQgPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVBdHRyaWJ1dGUoKTsKLQotCS8qCi0JICogRmlsbCBpbiB0aGUgbmFtZS4gTm90IHJlYWxseSBuZWVkZWQgYnV0IGl0IHdvdWxkIGJlIG5pY2UuCi0JICovCi0Jc3RhdGljIHtSRUZMRUNUSU9OX0VWRU5ULnNldE5hbWUoInJlZmxlY3RWYWx1ZXMiKTt9IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNSZWZsZWN0ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlZmxlY3RpbmcgPSBmYWxzZTsKLXB1YmxpYyBSZWZsZWN0aW9uQWRhcHRvcigpIHsKLQlzdXBlcigpOwotfQotcHVibGljIFJlZmxlY3Rpb25BZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCXN1cGVyKCk7Ci0Jc2V0VGFyZ2V0KHRhcmdldCk7Ci19Ci0vKioKLSAqIEhlbHBlciBtZXRob2QgdG8gZW5zdXJlIGZ1bGwgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhcmdldC4gIFJlcXVpcmVkCi0gKiBmb3Igc2VyaWFsaXphdGlvbi4KLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIGZvcmNlRGVmZXJyZWRSZWFkRm9yKEVPYmplY3QgdGFyZ2V0KSB7Ci0JUmVmbGVjdGlvbkFkYXB0b3IgYWRhcHRvciA9IHJldHJpZXZlQWRhcHRvckZyb20odGFyZ2V0KTsKLQlpZiAoYWRhcHRvciAhPSBudWxsKSB7Ci0JCWFkYXB0b3IucmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotfQotcHJvdGVjdGVkIFJlc291cmNlIGdldFRhcmdldFJlc291cmNlKCkgewotCWlmIChnZXRUYXJnZXQoKSAhPSBudWxsKQotCQlyZXR1cm4gKChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZ2V0VGFyZ2V0KCkpLmVSZXNvdXJjZSgpOwotCXJldHVybiBudWxsOwotfQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kIHRvIGZldGNoIHRoZSBhZGFwdG9yIGZyb20gdGhlIG9iamVjdCwgYW5kIGlmIGl0IGV4aXN0cywgZ2V0IHRoZSBhZGFwdGVkCi0gKiB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4gIE92ZXJsb2FkZWQgZm9yIG1hbnktc2lkZWQgYXR0cmlidXRlcyB3aGVyZSB0aGUgcmV0dXJuIHZhbHVlIHdvdWxkCi0gKiBvdGhlcndpc2UgYmUgYW4gZW51bWVyYXRpb247IGluIHRoaXMgY2FzZSB3aWxsIHJldHVybiBhbiBBcnJheSBpbnN0ZWFkLiAKLSAqLwotcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VmFsdWUoRU9iamVjdCBvYmplY3QsIEVSZWZlcmVuY2UgYXR0cmlidXRlKSB7CQotLy9GQglSZWZsZWN0aW9uQWRhcHRvciBhZGFwdG9yID0gcmV0cmlldmVBZGFwdG9yRnJvbShvYmplY3QpOwotLy9GQglpZiAoYWRhcHRvciAhPSBudWxsKQotLy9GQgkJcmV0dXJuIGFkYXB0b3IuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0vL0ZCCXJldHVybiAoKElSZWFkQWRhcHRhYmxlKSBvYmplY3QpLnByaW1SZWZWYWx1ZShhdHRyaWJ1dGUpOwotCXJldHVybiBvYmplY3QuZUdldChhdHRyaWJ1dGUpOyAvL0ZCCi0JCi19Ci0vKkhlbHBlciBtZXRob2QgdG8gZmV0Y2ggdGhlIGFkYXB0b3IgZnJvbSB0aGUgb2JqZWN0LCBhbmQgaWYgaXQgZXhpc3RzLCBnZXQgdGhlIGFkYXB0ZWQKLSAqdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUuCi0gKi8KLXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFZhbHVlKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSkgewkKLS8vRkIJUmVmbGVjdGlvbkFkYXB0b3IgYWRhcHRvciA9IHJldHJpZXZlQWRhcHRvckZyb20ob2JqZWN0KTsKLS8vRkIJaWYgKGFkYXB0b3IgIT0gbnVsbCkKLS8vRkIJCXJldHVybiBhZGFwdG9yLmdldFZhbHVlSW4ob2JqZWN0LCBhdHRyaWJ1dGUpOwotLy9GQglyZXR1cm4gKChJUmVhZEFkYXB0YWJsZSkgb2JqZWN0KS5wcmltUmVmVmFsdWUoYXR0cmlidXRlKTsKLQlyZXR1cm4gb2JqZWN0LmVHZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSlhdHRyaWJ1dGUpOyAvL0ZCCi19Ci0vKioKLSAqIGdldFZhbHVlSW4gbWV0aG9kIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVJbihFT2JqZWN0IG9iamVjdCwgRU9iamVjdCBhdHRyaWJ1dGUpIHsKLS8vRkIJcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0vL0ZCCXJldHVybiAoKElSZWFkQWRhcHRhYmxlKSBvYmplY3QpLnByaW1SZWZWYWx1ZShhdHRyaWJ1dGUpOwotCXJldHVybiBvYmplY3QuZUdldCgoRVN0cnVjdHVyYWxGZWF0dXJlKWF0dHJpYnV0ZSk7IC8vRkIKLX0KLS8qKgotICogaXNBZGFwdG9yRm9yVHlwZSBtZXRob2QgY29tbWVudC4KLSAqLwotcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCXJldHVybiAodHlwZSA9PSBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci19Ci0vKioKLSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQKLSAqLwotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpOwotLyoqCi0gKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciByZWZsZWN0aW9uIGhhZCBvY2N1cnJlZC4KLSAqLwotcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpIHsKLQlpZiAoIWhhc1JlZmxlY3RlZCAmJiAhaXNSZWZsZWN0aW5nKSB7Ci0JCXRyeSB7Ci0JCQlpc1JlZmxlY3RpbmcgPSB0cnVlOwotCQkJRU9iamVjdCBldGFyZ2V0ID0gKEVPYmplY3QpZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAoIWV0YXJnZXQuZUlzUHJveHkoKSAmJiBldGFyZ2V0LmVSZXNvdXJjZSgpICE9IG51bGwgJiYgZXRhcmdldC5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpICE9IG51bGwpCi0JCQkJaGFzUmVmbGVjdGVkID0gcmVmbGVjdFZhbHVlcygpOwotCQkJZWxzZQotCQkJCWhhc1JlZmxlY3RlZCA9IGZhbHNlOwkvLyBBUyBsb25nIHdlIGFyZSBhIHByb3h5IG9yIGlzIG5vdCBpbiBhIHZhbGlkIHJlc291cmNlIG9yIHNldCwgd2Ugd29uJ3QgcmVmbGVjdC4KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhc1JlZmxlY3RlZCA9IGZhbHNlOwotCQkJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuV0FSTklORykpIHsKLQkJCQlsb2dnZXIubG9nKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZhaWxlZF9yZWZsZWN0aW5nX3ZhbHVlc19FUlJPUl8iKSwgTGV2ZWwuV0FSTklORyk7IC8vJE5PTi1OTFMtMSQgPSAiRmFpbGVkIHJlZmxlY3RpbmcgdmFsdWVzISEhIgotCQkJCWxvZ2dlci5sb2dXYXJuaW5nKGUpOwotCQkJCUpFTVBsdWdpbi5sb2dXYXJuaW5nKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZhaWxlZF9yZWZsZWN0aW5nX3ZhbHVlc19FUlJPUl8iKSwgZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpc1JlZmxlY3RpbmcgPSBmYWxzZTsKLQkJCWdldFRhcmdldCgpLmVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpZ2V0VGFyZ2V0KCksIEVWRU5ULCBSRUZMRUNUSU9OX0VWRU5ULCBudWxsLCBudWxsLCBOb3RpZmljYXRpb24uTk9fSU5ERVgpKTsKLQkJfQotCX0KLQlyZXR1cm4gaGFzUmVmbGVjdGVkOwotfQotcHVibGljIHN0YXRpYyBSZWZsZWN0aW9uQWRhcHRvciByZXRyaWV2ZUFkYXB0b3JGcm9tKEVPYmplY3Qgb2JqZWN0KSB7Ci0Jc3luY2hyb25pemVkIChvYmplY3QpIHsKLQkJcmV0dXJuIChSZWZsZWN0aW9uQWRhcHRvcilFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIob2JqZWN0LCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JfQotfQotfQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KREtBZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KREtBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYzE2ZTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSkRLQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvcjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQyOjUwIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSkRLQWRhcHRvciBleHRlbmRzIEphdmFSZWZsZWN0aW9uQWRhcHRvciB7Ci0JcHVibGljIEphdmFKREtBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwdWJsaWMgSkRLQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIEphdmFKREtBZGFwdGVyRmFjdG9yeSBhbkFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JCXNldEFkYXB0ZXJGYWN0b3J5KGFuQWRhcHRlckZhY3RvcnkpOwotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kSUQgLSBnZW5lcmF0ZSB0aGUgdW5pcXVlIElEIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBjb25zdHJ1Y3Rvci4KLQkgKiBTaW1pbGFyIHRvIGEgU2lnbmF0dXJlLCBidXQgaG9wZWZ1bGx5IG1vcmUgcmVhZGFibGUuCi0JICogVGhlIG5hbWUgZm9ybWF0IHdpbGwgYmU6Ci0JICogCXNpbXBsZUNsYXNzTmFtZS5zaW1wbGVDbGFzc05hbWUoY29tLmZyb25rLlBhcm1UeXBlMV9wYXJtVHlwZTImVgotCSAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGlnaHRseSBjb3VwbGVkIHdpdGggUmVmbGVjdGlvbkFkYXB0ZXIuZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKCkuCi0JICoKLQkgKiBJdCBoYXMgdG8gYmUgZG9uZSBzZXBhcmF0ZWx5IGZvciBKREsgYmVjYXVzZSBDb25zdHJ1Y3RvcnMgYW5kIE1ldGhvZHMgYXJlIGRpZmZlcmVudCBjbGFzc2VzLgotCSAqIEhvd2V2ZXIsIGluIHRoZSBKYXZhIE1vZGVsIHRoZXkgYXJlIGJvdGgganVzdCBNZXRob2RzIHdpdGggYSBmbGFnIGluZGljYXRpbmcgQ29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZElEKGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGpka0NvbnN0cnVjdG9yKSB7Ci0JCVN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBnZXRTaW1wbGVOYW1lKGpka0NvbnN0cnVjdG9yLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJb3V0LmFwcGVuZChjbGFzc05hbWUpOwotCQlvdXQuYXBwZW5kKENfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JCW91dC5hcHBlbmQoY29tcHV0ZU1ldGhvZE5hbWUoamRrQ29uc3RydWN0b3IpKTsKLQkJb3V0LmFwcGVuZChDX01FVEhPRF9QQVJNX0RFTElNSVRFUik7Ci0JCUNsYXNzW10gcGFybVR5cGVzID0gamRrQ29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJtVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCW91dC5hcHBlbmQocGFybVR5cGVzW2ldLmdldE5hbWUoKSk7Ci0JCQlpZiAoaSA8IHBhcm1UeXBlcy5sZW5ndGggLSAxKQotCQkJCW91dC5hcHBlbmQoQ19QQVJNX1BBUk1fREVMSU1JVEVSKTsKLQkJfQotCQlvdXQuYXBwZW5kKFNfQ09OU1RSVUNUT1JfVE9LRU4pOyAvL0l0J3MgYSBjb25zdHJ1Y3RvcgotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIGNvbXB1dGVNZXRob2RJRCAtIGdlbmVyYXRlIHRoZSB1bmlxdWUgSUQgdG8gYmUgdXNlZCB0byBpZGVudGlmeSBhIG1ldGhvZC4KLQkgKiBTaW1pbGFyIHRvIGEgU2lnbmF0dXJlLCBidXQgaG9wZWZ1bGx5IG1vcmUgcmVhZGFibGUuCi0JICogSWYgdGhlcmUgYXJlIG5vIHBhcm1zLCBpdCB3aWxsIGVuZCB3aXRoIGEgIigiIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3RpY3RpdmUgZnJvbSBhIGZpZWxkLgotCSAqIFRoZSBuYW1lIGZvcm1hdCB3aWxsIGJlOgotCSAqIAlzaW1wbGVDbGFzc05hbWUubWV0aG9kTmFtZShjb20uZnJvbmsuUGFybVR5cGUxX3Bhcm1UeXBlMgotCSAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgdGlnaHRseSBjb3VwbGVkIHdpdGggUmVmbGVjdGlvbkFkYXB0ZXIuZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZElEKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBqZGtNZXRob2QpIHsKLQkJU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldFNpbXBsZU5hbWUoamRrTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJb3V0LmFwcGVuZChjbGFzc05hbWUpOwotCQlvdXQuYXBwZW5kKENfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JCW91dC5hcHBlbmQoY29tcHV0ZU1ldGhvZE5hbWUoamRrTWV0aG9kKSk7Ci0JCW91dC5hcHBlbmQoQ19NRVRIT0RfUEFSTV9ERUxJTUlURVIpOwotCQlDbGFzc1tdIHBhcm1UeXBlcyA9IGpka01ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJb3V0LmFwcGVuZChwYXJtVHlwZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCWlmIChpIDwgcGFybVR5cGVzLmxlbmd0aCAtIDEpCi0JCQkJb3V0LmFwcGVuZChDX1BBUk1fUEFSTV9ERUxJTUlURVIpOwotCQl9Ci0JCWlmIChqZGtNZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKGpka01ldGhvZC5nZXROYW1lKCkpKQotCQkJb3V0LmFwcGVuZChTX0NPTlNUUlVDVE9SX1RPS0VOKTsgLy9JdCdzIGEgY29uc3RydWN0b3IKLQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBjb21wdXRlTWV0aG9kTmFtZSAtIGdlbmVyYXRlIHRoZSBuYW1lIHRvIGJlIHVzZWQgdG8gaWRlbnRpZnkgYSBjb25zdHJ1Y3Rvci4KLQkgKiBGb3IgdGhlIG1vbWVudCwgbmFtZXMgYXJlIHNpbXBsZSwgYW5kIFVVSUQncyBhcmUgY29tcGxleC4KLQkgKgotCSAqIEl0IGhhcyB0byBiZSBkb25lIHNlcGFyYXRlbHkgZm9yIEpESyBiZWNhdXNlIENvbnN0cnVjdG9ycyBhbmQgTWV0aG9kcyBhcmUgZGlmZmVyZW50IGNsYXNzZXMuCi0JICogSG93ZXZlciwgaW4gdGhlIEphdmEgTW9kZWwgdGhleSBhcmUgYm90aCBqdXN0IE1ldGhvZHMgd2l0aCBhIGZsYWcgaW5kaWNhdGluZyBDb25zdHJ1Y3Rvci4gCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU1ldGhvZE5hbWUoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgamRrQ29uc3RydWN0b3IpIHsKLQkJcmV0dXJuIGdldFNpbXBsZU5hbWUoamRrQ29uc3RydWN0b3IuZ2V0TmFtZSgpKTsgLy8gQ1RPUiBuYW1lcyBjb21lIGJhY2sgZnVsbHktcXVhbGlmaWVkIHdpdGggcGFja2FnZS4KLQl9Ci0JLyoqCi0JICogY29tcHV0ZU1ldGhvZE5hbWUgLSBnZW5lcmF0ZSB0aGUgbmFtZSB0byBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgbWV0aG9kLgotCSAqIEZvciB0aGUgbW9tZW50LCBuYW1lcyBhcmUgc2ltcGxlLCBhbmQgVVVJRCdzIGFyZSBjb21wbGV4LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXB1dGVNZXRob2ROYW1lKGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBqZGtNZXRob2QpIHsKLQkJcmV0dXJuIGpka01ldGhvZC5nZXROYW1lKCk7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUphdmFGaWVsZCAtIGluc3RhbnRpYXRlIGEgSmF2YSBGaWVsZCBiYXNlZCBvbiB0aGUgcGFzc2VkIEZpZWxkCi0JICogV2UgYXJlIGRlZmVycmluZyBmaWVsZCBjb250ZW50cyBhc3N1bWluZyB0aGF0IGl0cyBhZGFwdG9yIHdpbGwgcmVmbGVjdCBpdHMgZGV0YWlscy4KLQkgKi8KLQlwdWJsaWMgRmllbGQgY3JlYXRlSmF2YUZpZWxkKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIHJlZmxlY3RlZEZpZWxkLCBYTUlSZXNvdXJjZSByZXNvdXJjZSkgewotCQlGaWVsZCBuZXdGaWVsZCA9IGdldEphdmFGYWN0b3J5KCkuY3JlYXRlRmllbGQoKTsKLQkJbmV3RmllbGQuc2V0TmFtZShyZWZsZWN0ZWRGaWVsZC5nZXROYW1lKCkpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0U2ltcGxlTmFtZShyZWZsZWN0ZWRGaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXJlc291cmNlLnNldElEKG5ld0ZpZWxkLCBjbGFzc05hbWUgKyBDX0NMQVNTX01FTUJFUl9ERUxJTUlURVIgKyByZWZsZWN0ZWRGaWVsZC5nZXROYW1lKCkpOwotCQlyZXR1cm4gbmV3RmllbGQ7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUphdmFNZXRob2QgLSBpbnN0YW50aWF0ZSBhIEphdmEgTWV0aG9kIGJhc2VkIG9uIHRoZSBwYXNzZWQgSmF2YSBSZWZsZWN0aW9uIENvbnN0cnVjdG9yCi0JICogV2UgYXJlIGRlZmVycmluZyBtZXRob2QgY29udGVudHMgYXNzdW1pbmcgdGhhdCBpdHMgYWRhcHRvciB3aWxsIHJlZmxlY3QgaXRzIGRldGFpbHMuCi0JICogV2UgbmVlZCB0byBzdG9yZSBlbm91Z2ggaW5mbyBpbiB0aGUgZW1wdHkgTWV0aG9kIHRvIGZpbmQgaXRzIEphdmEgc291cmNlLgotCSAqIFRoZSBJRCB3aWxsIGV2ZW50dWFsbHkgaG9sZCBlbm91Z2ggaW5mbyB0byBpZGVudGlmeSB0aGUgc291cmNlLCBzbyB3ZSB1c2UgaXQuCi0JICovCi0JcHVibGljIE1ldGhvZCBjcmVhdGVKYXZhTWV0aG9kKGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yIGpka0NvbnN0cnVjdG9yLCBYTUlSZXNvdXJjZSByZXNvdXJjZSkgewotCQlNZXRob2QgbmV3TWV0aG9kID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVNZXRob2QoKTsKLQkJLy8gV2UgdXNlIGEgc2ltcGxlIG5hbWUsIGJ1dCBhIGNvbXBsZXggSUQgCi0JCW5ld01ldGhvZC5zZXROYW1lKGNvbXB1dGVNZXRob2ROYW1lKGpka0NvbnN0cnVjdG9yKSk7Ci0JCXJlc291cmNlLnNldElEKG5ld01ldGhvZCwgY29tcHV0ZU1ldGhvZElEKGpka0NvbnN0cnVjdG9yKSk7Ci0JCXJldHVybiBuZXdNZXRob2Q7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUphdmFNZXRob2QgLSBpbnN0YW50aWF0ZSBhIEphdmEgTWV0aG9kIGJhc2VkIG9uIHRoZSBwYXNzZWQgSmF2YSBSZWZsZWN0aW9uIE1ldGhvZAotCSAqIFdlIGFyZSBkZWZlcnJpbmcgbWV0aG9kIGNvbnRlbnRzIGFzc3VtaW5nIHRoYXQgaXRzIGFkYXB0b3Igd2lsbCByZWZsZWN0IGl0cyBkZXRhaWxzLgotCSAqIFdlIG5lZWQgdG8gc3RvcmUgZW5vdWdoIGluZm8gaW4gdGhlIGVtcHR5IE1ldGhvZCB0byBmaW5kIGl0cyBKYXZhIHNvdXJjZS4KLQkgKiBUaGUgSUQgd2lsbCBldmVudHVhbGx5IGhvbGQgZW5vdWdoIGluZm8gdG8gaWRlbnRpZnkgdGhlIHNvdXJjZSwgc28gd2UgdXNlIGl0LgotCSAqLwotCXB1YmxpYyBNZXRob2QgY3JlYXRlSmF2YU1ldGhvZChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgamRrTWV0aG9kLCBYTUlSZXNvdXJjZSByZXNvdXJjZSkgewotCQlNZXRob2QgbmV3TWV0aG9kID0gZ2V0SmF2YUZhY3RvcnkoKS5jcmVhdGVNZXRob2QoKTsKLQkJLy8gV2UgdXNlIGEgc2ltcGxlIG5hbWUsIGJ1dCBhIGNvbXBsZXggSUQgCi0JCW5ld01ldGhvZC5zZXROYW1lKGNvbXB1dGVNZXRob2ROYW1lKGpka01ldGhvZCkpOwotCQlyZXNvdXJjZS5zZXRJRChuZXdNZXRob2QsIGNvbXB1dGVNZXRob2RJRChqZGtNZXRob2QpKTsKLQkJcmV0dXJuIG5ld01ldGhvZDsKLQl9Ci0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMS8wNy8wMCAzOjQzOjU1IFBNKQotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSmF2YUpES0FkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEphdmFKREtBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQlwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0QWx0ZXJuYXRlQ2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyRmFjdG9yeSgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCX0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIE1ldGhvZCB0byBjb252ZXJ0IHRoZSB0ZXh0dWFsIGZvcm0gb2YgYSBwcmltaXRpdmUgdHlwZSBpbnRvIGl0cyBDbGFzcyBvYmplY3QKLQkqCi0JKiBAcGFyYW0gdHlwZSBUaGUgcHJpbWl0aXZlIHR5cGUncyB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uCi0JKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzIGdldFByaW1pdGl2ZVR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJQ2xhc3MgYyA9IG51bGw7Ci0KLQkJaWYgKHR5cGUuZXF1YWxzKGJ5dGUuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGJ5dGUuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoc2hvcnQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IHNob3J0LmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gaW50LmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGxvbmcuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGxvbmcuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGZsb2F0LmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGRvdWJsZS5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gZG91YmxlLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGJvb2xlYW4uY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoY2hhci5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gY2hhci5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSB2b2lkLmNsYXNzOwotCQl9Ci0KLQkJcmV0dXJuIGM7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxhc3Qgc2VnbWVudCBvZiBhICcuJy1zZXBhcmF0ZWQgcXVhbGlmaWVkIG5hbWUuCi0JICogUmV0dXJucyB0aGUgZ2l2ZW4gbmFtZSBpZiBpdCBpcyBub3QgcXVhbGlmaWVkLgotCSAqIEZvciBleGFtcGxlOgotCSAqIDxwcmU+Ci0JICogZ2V0U2ltcGxlTmFtZSgiamF2YS5sYW5nLk9iamVjdCIpIC0+ICJPYmplY3QiCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlpbnQgbGFzdERvdCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGxhc3REb3QgPT0gLTEpCi0JCQlyZXR1cm4gbmFtZTsKLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGxhc3REb3QgKyAxKTsKLQl9Ci0JcHVibGljIENsYXNzIGdldFR5cGUoSmF2YUhlbHBlcnMgbW9kZWxDbGFzcykgewotCQlDbGFzcyByZXN1bHQgPSBudWxsOwotCQlpZiAobW9kZWxDbGFzcy5pc0FycmF5KCkpIHsKLQkJCUFycmF5VHlwZSBhcnJheVR5cGUgPSAoQXJyYXlUeXBlKSBtb2RlbENsYXNzOwotCQkJQ2xhc3MgY29tcG9uZW50Q2xhc3MgPSBnZXRUeXBlKGFycmF5VHlwZS5nZXRGaW5hbENvbXBvbmVudFR5cGUoKSk7Ci0JCQlyZXN1bHQgPSAoQXJyYXkubmV3SW5zdGFuY2UoY29tcG9uZW50Q2xhc3MsIG5ldyBpbnRbYXJyYXlUeXBlLmdldEFycmF5RGltZW5zaW9ucygpXSkpLmdldENsYXNzKCk7Ci0JCX0gZWxzZSBpZiAobW9kZWxDbGFzcy5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQlyZXN1bHQgPSBnZXRUeXBlKG1vZGVsQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGdldFR5cGUoKChKYXZhQ2xhc3MpIG1vZGVsQ2xhc3MpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXB1YmxpYyBDbGFzcyBnZXRUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCS8vIFRyeSBmb3IgYSBwcmltaXRpdmUgdHlwZSAoImludCIsImNoYXIiLGV0Yy4pIGZpcnN0Ci0JCUNsYXNzIHByaW1UeXBlID0gZ2V0UHJpbWl0aXZlVHlwZShxdWFsaWZpZWROYW1lKTsKLQkJaWYgKHByaW1UeXBlID09IG51bGwpIHsKLQkJCS8vIENoYW5nZWQgZm9yIGRlZmVjdCAjMjEyMTQ3IGJvdHBAYXVzYWl4MTkuYXVzdGluLmlibS5jb21ANzYzMCBzeXN0ZW0uCi0JCQkvLwotCQkJLy8gU2VhcmNoIG9ubHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2xhc3Nsb2FkZXJzICh0aGUgZmlyc3Qgb25lIHRoYXQgZXhpc3RzKSBpbiB0aGlzIG9yZGVyLiBJZiBub3QgZm91bmQKLQkJCS8vIGluIGEgY2xhc3Nsb2FkZXIsIGl0IHdpbGwgbm90IHJvbGwtb3ZlciB0byBhbm90aGVyIGNsYXNzIGxvYWRlci4gVGhpcyBpcyB0byBhdm9pZCBwcm9ibGVtcyB3aGVyZSBhCi0JCQkvLyBjbGFzcyBtYXkgZXhpc3QgaW4gbW9yZSB0aGFuIG9uZSBjbGFzc2xvYWRlci4gWW91IGdldCBlcnJvcnMgd2hlbiB0aGlzIGhhcHBlbnMgZHVlIHRvIG9uZSBjbGFzcyB0aGF0Ci0JCQkvLyB3YXMgZm91bmQgaW4gb25seSBvbmUgY2xhc3Nsb2FkZXIgdGhhdCByZWZlcnMgdG8gYW5vdGhlciBjbGFzcyB0aGF0IHdhcyBmb3VuZCBpbiBib3RoIGNsYXNzbG9hZGVycy4KLQkJCS8vIFRoZXkgZG9uJ3QgbWF0Y2ggd2hlbiB0cnlpbmcgdG8gcmVmbGVjdCBsYXRlci4KLQkJCS8vIDEpIEFsdGVybmF0ZSBjbGFzc2xvYWRlciAoaWYgZXhpc3RzKQotCQkJLy8gMikgVGhyZWFkIGNvbnRleHQgY2xhc3Nsb2FkZXIgKGlmIGV4aXN0cykKLQkJCS8vIDMpIFN5c3RlbSBjbGFzc2xvYWRlciAoaWYgZXhpc3RzKQotCQkJLy8gNCkgQ2xhc3MuZm9yTmFtZSgpLgotCQkJaWYgKGdldEFsdGVybmF0ZUNsYXNzTG9hZGVyKCkgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBnZXRBbHRlcm5hdGVDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhxdWFsaWZpZWROYW1lKTsKLQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZjIpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQkJaWYgKGNvbnRleHRDbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIGNvbnRleHRDbGFzc0xvYWRlci5sb2FkQ2xhc3MocXVhbGlmaWVkTmFtZSk7Ci0JCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJQ2xhc3NMb2FkZXIgc3lzdGVtQ2xhc3NMb2FkZXIgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOwotCQkJaWYgKHN5c3RlbUNsYXNzTG9hZGVyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gc3lzdGVtQ2xhc3NMb2FkZXIubG9hZENsYXNzKHF1YWxpZmllZE5hbWUpOwotCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIENsYXNzLmZvck5hbWUocXVhbGlmaWVkTmFtZSk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSBlbHNlCi0JCQlyZXR1cm4gcHJpbVR5cGU7Ci0JfQotCS8qCi0JICogVXRpbGl0eSByb3V0aW5lIHRvIHBhcGVyIG92ZXIgYXJyYXkgdHlwZSBuYW1lcwotCSAqIEJvcnJvd2VkIGZyb20gYSBwYWNrYWdlLXZpc2liaWxpdHkgaGVscGVyIG9uIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZShDbGFzcyB0eXBlKSB7Ci0JCWlmICh0eXBlLmlzQXJyYXkoKSkgewotCQkJdHJ5IHsKLQkJCQlDbGFzcyBjbCA9IHR5cGU7Ci0JCQkJaW50IGRpbWVuc2lvbnMgPSAwOwotCQkJCXdoaWxlIChjbC5pc0FycmF5KCkpIHsKLQkJCQkJZGltZW5zaW9ucysrOwotCQkJCQljbCA9IGNsLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQl9Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXNiLmFwcGVuZChjbC5nZXROYW1lKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGltZW5zaW9uczsgaSsrKSB7Ci0JCQkJCXNiLmFwcGVuZCgiW10iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IC8qRkFMTFRIUlUqLwotCQkJfQotCQl9Ci0JCXJldHVybiB0eXBlLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIE1ldGhvZCB0byBjb252ZXJ0IHRoZSB0ZXh0dWFsIGZvcm0gb2YgYSBwcmltaXRpdmUgdHlwZSBpbnRvIGl0cyBDbGFzcyBvYmplY3QKLQkqCi0JKiBAcGFyYW0gdHlwZSBUaGUgcHJpbWl0aXZlIHR5cGUncyB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uCi0JKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzIHByaW1pdGl2ZUZvck5hbWUoU3RyaW5nIHR5cGUpIHsKLQkJQ2xhc3MgYyA9IG51bGw7Ci0KLQkJaWYgKHR5cGUuZXF1YWxzKGJ5dGUuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGJ5dGUuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoc2hvcnQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IHNob3J0LmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gaW50LmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGxvbmcuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGxvbmcuY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGZsb2F0LmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGRvdWJsZS5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gZG91YmxlLmNsYXNzOwotCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJYyA9IGJvb2xlYW4uY2xhc3M7Ci0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoY2hhci5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQljID0gY2hhci5jbGFzczsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCWMgPSB2b2lkLmNsYXNzOwotCQl9Ci0KLQkJcmV0dXJuIGM7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMS8wNy8wMCAzOjQzOjU1IFBNKQotCSAqIEBwYXJhbSBuZXdBZGFwdGVyRmFjdG9yeSBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVycy5KYXZhSkRLQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGFwdGVyRmFjdG9yeShKYXZhSkRLQWRhcHRlckZhY3RvcnkgbmV3QWRhcHRlckZhY3RvcnkpIHsKLQkJYWRhcHRlckZhY3RvcnkgPSBuZXdBZGFwdGVyRmFjdG9yeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhQ2xhc3NKREtBZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhQ2xhc3NKREtBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNmY5OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUNsYXNzSkRLQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhQ2xhc3NBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLm5scy5SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotLyoqCi0gKiBSZWZsZWN0IHRoZSBjbGFzcyB1c2luZyBzdGFuZGFyZCBqYXZhLnJlZmxlY3QgbWV0aG9kcy4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQyOjUwIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUNsYXNzSkRLQWRhcHRvciBleHRlbmRzIEpES0FkYXB0b3IgaW1wbGVtZW50cyBJSmF2YUNsYXNzQWRhcHRvciB7Ci0KLQlwcm90ZWN0ZWQgQ2xhc3Mgc291cmNlVHlwZSA9IG51bGw7Ci0KLQlwdWJsaWMgSmF2YUNsYXNzSkRLQWRhcHRvcihOb3RpZmllciB0YXJnZXQsIEphdmFKREtBZGFwdGVyRmFjdG9yeSBhbkFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHRhcmdldCwgYW5BZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogYWRkRmllbGRzIC0gcmVmbGVjdCBvdXIgZmllbGRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmllbGRzKCkgewotCQlYTUlSZXNvdXJjZSByZXNvdXJjZSA9IChYTUlSZXNvdXJjZSkgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZVJlc291cmNlKCk7Ci0JCUxpc3QgdGFyZ2V0RmllbGRzID0gZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RmllbGRzR2VuKCk7Ci0JCXRhcmdldEZpZWxkcy5jbGVhcigpOwotCQlqYXZhLmxhbmcucmVmbGVjdC5GaWVsZFtdIGZpZWxkcyA9IHt9OwotCQl0cnkgewotCQkJZmllbGRzID0gZ2V0U291cmNlVHlwZSgpLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCX0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGVycm9yKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygKLQkJCQkJIkNvdWxkX05vdF9SZWZsZWN0X0ZpZWxkc19FUlJPUl8iLCBuZXcgT2JqZWN0W10geyBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRRdWFsaWZpZWROYW1lKCksIGVycm9yLmdldE1lc3NhZ2UoKX0pKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0YXJnZXRGaWVsZHMuYWRkKGNyZWF0ZUphdmFGaWVsZChmaWVsZHNbaV0sIHJlc291cmNlKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhZGRNZXRob2RzIC0gcmVmbGVjdCBvdXIgbWV0aG9kcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGhvZHMoKSB7Ci0JCS8vIFdlIG5lZWQgdG8gZmlyc3QgZG8gbWV0aG9kcyBhbmQgdGhlbiBkbyBjb25zdHJ1Y3RvcnMgYmVjYXVzZSB0aGUgSkRLIHRyZWF0cyB0aGVtIGFzIHR3bwotCQkvLyBkaWZmZXJlbnQgb2JqZWN0cywgd2hpY2ggdGhlIEphdmEgTW9kZWwgdHJlYXRzIHRoZW0gYXMgYm90aCBNZXRob2Qncy4KLQkJWE1JUmVzb3VyY2UgcmVzb3VyY2UgPSAoWE1JUmVzb3VyY2UpIGdldEphdmFDbGFzc1RhcmdldCgpLmVSZXNvdXJjZSgpOwotCQlMaXN0IHRhcmdldE1ldGhvZHMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRNZXRob2RzR2VuKCk7Ci0JCXRhcmdldE1ldGhvZHMuY2xlYXIoKTsKLQkJamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kW10gbWV0aG9kcyA9IHt9OwotCQl0cnkgewotCQkJbWV0aG9kcyA9IGdldFNvdXJjZVR5cGUoKS5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJfSBjYXRjaCAoTm9DbGFzc0RlZkZvdW5kRXJyb3IgZXJyb3IpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKSB7Ci0JCQkJbG9nZ2VyCi0JCQkJCQkubG9nKAotCQkJCQkJCQlSZXNvdXJjZUhhbmRsZXIKLQkJCQkJCQkJCQkuZ2V0U3RyaW5nKAotCQkJCQkJCQkJCQkJIkNvdWxkX05vdF9SZWZsZWN0X01ldGhvZHNfRVJST1JfIiwgbmV3IE9iamVjdFtdIHsgZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0UXVhbGlmaWVkTmFtZSgpLCBlcnJvci50b1N0cmluZygpfSksIExldmVsLldBUk5JTkcpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0YXJnZXRNZXRob2RzLmFkZChjcmVhdGVKYXZhTWV0aG9kKG1ldGhvZHNbaV0sIHJlc291cmNlKSk7Ci0JCX0KLQotCQkvLyBOb3cgZG8gdGhlIGNvbnN0cnVjdG9ycwotCQlqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcltdIGN0b3JzID0ge307Ci0JCXRyeSB7Ci0JCQljdG9ycyA9IGdldFNvdXJjZVR5cGUoKS5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpOwotCQl9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlcnJvcikgewotCQkJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuV0FSTklORykpIHsKLQkJCQlsb2dnZXIKLQkJCQkJCS5sb2coCi0JCQkJCQkJCVJlc291cmNlSGFuZGxlcgotCQkJCQkJCQkJCS5nZXRTdHJpbmcoCi0JCQkJCQkJCQkJCQkiQ291bGRfTm90X1JlZmxlY3RfQ29uc3RydWN0b3JzX0VSUk9SXyIsIG5ldyBPYmplY3RbXSB7IGdldEphdmFDbGFzc1RhcmdldCgpLmdldFF1YWxpZmllZE5hbWUoKSwgZXJyb3IuZ2V0TWVzc2FnZSgpfSksIExldmVsLldBUk5JTkcpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJdGFyZ2V0TWV0aG9kcy5hZGQoY3JlYXRlSmF2YU1ldGhvZChjdG9yc1tpXSwgcmVzb3VyY2UpKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHJlZmxlY3RlZCBmaWVsZHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaEZpZWxkcygpIHsKLQkJZ2V0SmF2YUNsYXNzVGFyZ2V0KCkuZ2V0RmllbGRzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIGltcGxlbWVudHMgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmbHVzaEltcGxlbWVudHMoKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLmdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHJlZmxlY3RlZCBtZXRob2RzIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hNZXRob2RzKCkgewotCQlnZXRKYXZhQ2xhc3NUYXJnZXQoKS5nZXRNZXRob2RzR2VuKCkuY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hJbm5lckNsYXNzZXMoKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLmdldERlY2xhcmVkQ2xhc3Nlc0dlbigpLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGZsdXNoTW9kaWZpZXJzKCkgewotCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRBYnN0cmFjdChmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRGaW5hbChmYWxzZSk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRQdWJsaWMoZmFsc2UpOwotCQlqYXZhQ2xhc3NUYXJnZXQuc2V0S2luZChUeXBlS2luZC5VTkRFRklORURfTElURVJBTCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdG9yI2ZsdXNoUmVmbGVjdGVkVmFsdWVzKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hSZWZsZWN0ZWRWYWx1ZXMoYm9vbGVhbiBjbGVhckNhY2hlZE1vZGVsT2JqZWN0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmx1c2hNb2RpZmllcnMoKTsKLQkJcmVzdWx0ICY9IGZsdXNoU3VwZXIoKTsKLQkJcmVzdWx0ICY9IGZsdXNoSW1wbGVtZW50cygpOwotCQlyZXN1bHQgJj0gZmx1c2hNZXRob2RzKCk7Ci0JCXJlc3VsdCAmPSBmbHVzaEZpZWxkcygpOwotCQlyZXN1bHQgJj0gZmx1c2hJbm5lckNsYXNzZXMoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNwb3N0Rmx1c2hSZWZsZWN0ZWRWYWx1ZXNJZk5lY2Vzc2FyeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoYm9vbGVhbiBpc0V4aXN0aW5nKSB7Ci0JCWdldEphdmFDbGFzc1RhcmdldCgpLnNldFJlZmxlY3RlZChmYWxzZSk7Ci0JCXN1cGVyLnBvc3RGbHVzaFJlZmxlY3RlZFZhbHVlc0lmTmVjZXNzYXJ5KGlzRXhpc3RpbmcpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3VwZXJ0eXBlIHRvIGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmx1c2hTdXBlcigpIHsKLQkJTGlzdCB0YXJnZXRTdXBlcnMgPSBnZXRKYXZhQ2xhc3NUYXJnZXQoKS5wcmltR2V0RVN1cGVyVHlwZXMoKTsKLQkJdGFyZ2V0U3VwZXJzLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFyZ2V0IHR5cGVkIHRvIGEgSmF2YUNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3NJbXBsIGdldEphdmFDbGFzc1RhcmdldCgpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3NJbXBsKSBnZXRUYXJnZXQoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmxlY3Rpb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCk7Ci0JfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotICAgICAgICByZXR1cm4gc291cmNlVHlwZSAhPSBudWxsOwotICAgIH0KLQotCS8qKgotCSAqIGdldFNvdXJjZVR5cGUgLSByZXR1cm4gdGhlIGphdmEubGFuZy5DbGFzcyB3aGljaCBkZXNjcmliZXMgb3VyIGV4aXN0aW5nIEphdmEgY2xhc3MKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0U291cmNlVHlwZSgpIHsKLQkJaWYgKHNvdXJjZVR5cGUgPT0gbnVsbCkgewotCQkJc291cmNlVHlwZSA9IGdldFR5cGUoKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCkpOwotCQl9Ci0JCXJldHVybiBzb3VyY2VUeXBlOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlSW4gbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZUluKEVPYmplY3Qgb2JqZWN0LCBFT2JqZWN0IGF0dHJpYnV0ZSkgewotCQkvLyBBdCB0aGlzIHBvaW50LCB0aGlzIGFkYXB0ZXIgZG9lcyBub3QgZHluYW1pY2FsbHkgY29tcHV0ZSBhbnkgdmFsdWVzLAotCQkvLyBhbGwgdmFsdWVzIGFyZSBwdXNoZWQgYmFjayBpbnRvIHRoZSB0YXJnZXQgb24gdGhlIGluaXRpYWwgY2FsbC4KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlSW4ob2JqZWN0LCBhdHRyaWJ1dGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBzb3VyY2VUeXBlIGlzIG51bGwgb3IgaWYgaXQgaXMgYSBiaW5hcnkgdHlwZS4gUmVmbGVjdGlvbiBmcm9tIHRoZSBKREsgaXMgYWx3YXlzIGZyb20gYmluYXJ5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU291cmNlVHlwZUZyb21CaW5hcnkoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQuIG9uIGVudHJ5OiBuYW1lLCBjb250YWluaW5nIHBhY2thZ2UgKGFuZCBxdWFsaWZpZWQgbmFtZSksIGFuZAotCSAqIGRvY3VtZW50IG11c3QgYmUgc2V0LiBSZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsIEphdmFDbGFzcyBhZGFwdG9yOiAtIHNldCBtb2RpZmllcnMgLSBzZXQgbmFtZSAtIHNldCByZWZlcmVuY2UgdG8gc3VwZXIgLSBjcmVhdGUgbWV0aG9kcyAtCi0JICogY3JlYXRlIGZpZWxkcyAtIGFkZCBpbXBvcnRzCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpIHsKLQkJc3VwZXIucmVmbGVjdFZhbHVlcygpOwotCQl0cnkgewotCQkJaWYgKGdldFNvdXJjZVR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJc2V0TW9kaWZpZXJzKCk7Ci0JCQkJc2V0TmFtaW5nKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc2V0U3VwZXIoKTsKLQkJCQl9IGNhdGNoIChJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKLQkJCQl9Ci0JCQkJc2V0SW1wbGVtZW50cygpOwotCQkJCWFkZE1ldGhvZHMoKTsKLQkJCQlhZGRGaWVsZHMoKTsKLQkJCQlyZWZsZWN0SW5uZXJDbGFzc2VzKCk7Ci0JCQkJc2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLnJlZ2lzdGVyUmVmbGVjdGlvbihnZXRTb3VyY2VUeXBlKCkuZ2V0TmFtZSgpLCB0aGlzKTsKLQkJCQkvLwlhZGRJbXBvcnRzKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQkvL0Rvbid0IGNhY2hlIHRoZSBjbGFzcyBiZXlvbmQgdGhlIG9wZXJhdGlvbiBvZiByZWZsZWN0IHZhbHVlczsKLQkJCS8vdGhpcyBlbmFibGVzIGR5bmFtaWMgc3dhcHBpbmcgb2YgdGhlIGFsdGVybmF0ZSBjbGFzcyBsb2FkZXIKLQkJCS8vZm9yIGphdmEgcmVmbGVjdGlvbiwgYXMgd2VsbCBhcyBhdm9pZHMgcG90ZW50aWFsIG1lbW9yeSBsZWFrYWdlCi0JCQlzb3VyY2VUeXBlID0gbnVsbDsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWNsYXJpbmdDbGFzcygpIHsKLQkJQ2xhc3MgZGVjbGFyaW5nVHlwZSA9IGdldFNvdXJjZVR5cGUoKS5nZXREZWNsYXJpbmdDbGFzcygpOwotCQlpZiAoZGVjbGFyaW5nVHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBOZWVkIHRvIGdldCBpdCBhbmQgcmVmbGVjdCBpdCBzbyB0aGF0IHRoZSBkZWNsYXJlZCB0eXBlIG9mIHRoaXMgdGFyZ2V0IGlzIHNldCBjb3JyZWN0bHkuIFdlIGNhbiBqdXN0Ci0JCQkvLyBzZXQgaXQgb3Vyc2VsdmVzIGRpcmVjdGx5IGJlY2F1c2UgRUNvcmUgd291bGQgdHJ5IHRvIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBpbm5lciBjbGFzc2VzIG9mIHRoZSBkZWNsYXJpbmcgdHlwZS4gVGhpcwotCQkJLy8gd291bGQgY2F1c2UgaXQgdG8gYmUgYWRkZWQgdHdpY2UsIG9uY2UgZnJvbSB0aGUgcmVmbGVjdGlvbiBjYXVzZWQgYnkgdGhlIGludmVyc2Ugc2V0dGluZywgYW5kIG9uY2UgZnJvbSBvdXIgZG9pbmcKLQkJCS8vIHRoZSBpbnZlcnNlIHNldHRpbmcgaXRzZWxmLgotCQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0VGFyZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJSmF2YUNsYXNzSW1wbCBkZWNsYXJpbmdDbGFzcyA9IChKYXZhQ2xhc3NJbXBsKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoZGVjbGFyaW5nVHlwZS5nZXROYW1lKCksIHNldCk7Ci0JCQlkZWNsYXJpbmdDbGFzcy5nZXREZWNsYXJlZENsYXNzZXMoKTsJLy8gVGhpcyB3aWxsIGNhdXNlIGl0IHRvIHB1dCB1cyBpbnRvIGl0cyBsaXN0IGFuZCBhbHNvIHNldCBvdXIgZGVjbGFyaW5nIGNsYXNzIHRvIHRoaXMgZGVjbGFyaW5nIHR5cGUuCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdElubmVyQ2xhc3NlcygpIHsKLQkJQ2xhc3NbXSBpbm5lckNsYXNzZXMgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0Q2xhc3NlcygpOwotCQlpZiAoaW5uZXJDbGFzc2VzLmxlbmd0aCAhPSAwKSB7Ci0JCQlMaXN0IGRlY2xhcmVkQ2xhc3NlcyA9IGdldEphdmFDbGFzc1RhcmdldCgpLmdldERlY2xhcmVkQ2xhc3Nlc0dlbigpOwotCQkJSmF2YUNsYXNzIGlubmVyOwotCQkJUmVzb3VyY2VTZXQgc2V0ID0gZ2V0VGFyZ2V0UmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbm5lckNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbm5lciA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShpbm5lckNsYXNzZXNbaV0uZ2V0TmFtZSgpLCBzZXQpOwotCQkJCWRlY2xhcmVkQ2xhc3Nlcy5hZGQoaW5uZXIpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBzZXRJbXBsZW1lbnRzIC0gc2V0IG91ciBpbXBsZW1lbnRlZC9zdXBlciBpbnRlcmZhY2VzIGhlcmUgRm9yIGFuIGludGVyZmFjZSwgdGhlc2UgYXJlIHN1cGVyY2xhc3Nlcy4gRm9yIGEgY2xhc3MsIHRoZXNlIGFyZSBpbXBsZW1lbnRlZAotCSAqIGludGVyZmFjZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW1wbGVtZW50cygpIHsKLQkJQ2xhc3NbXSBpbnRlcmZhY2VzID0gZ2V0U291cmNlVHlwZSgpLmdldEludGVyZmFjZXMoKTsKLQkJLy8gbmVlZHMgd29yaywgdGhlIG5hbWVzIGFib3ZlIHdpbGwgYmUgc2ltcGxlIG5hbWVzIGlmIHdlIGFyZSByZWxmZWN0aW5nIGZyb20gYSBzb3VyY2UgZmlsZQotCQlKYXZhQ2xhc3NJbXBsIGphdmFDbGFzc1RhcmdldCA9IChKYXZhQ2xhc3NJbXBsKSBnZXRUYXJnZXQoKTsKLQkJSmF2YUNsYXNzIHJlZjsKLQkJTGlzdCBpbnRMaXN0ID0gamF2YUNsYXNzVGFyZ2V0LmdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCk7Ci0JCWludExpc3QuY2xlYXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZWYgPSBjcmVhdGVKYXZhQ2xhc3NSZWYoaW50ZXJmYWNlc1tpXS5nZXROYW1lKCkpOwotCQkJaW50TGlzdC5hZGQocmVmKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHNldE1vZGlmaWVycyAtIHNldCB0aGUgYXR0cmlidXRlIHZhbHVlcyByZWxhdGVkIHRvIG1vZGlmaWVycyBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKCkgewotCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCWphdmFDbGFzc1RhcmdldC5zZXRBYnN0cmFjdChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc0Fic3RyYWN0KGdldFNvdXJjZVR5cGUoKS5nZXRNb2RpZmllcnMoKSkpOwotCQlqYXZhQ2xhc3NUYXJnZXQuc2V0RmluYWwoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNGaW5hbChnZXRTb3VyY2VUeXBlKCkuZ2V0TW9kaWZpZXJzKCkpKTsKLQkJamF2YUNsYXNzVGFyZ2V0LnNldFB1YmxpYyhqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1B1YmxpYyhnZXRTb3VyY2VUeXBlKCkuZ2V0TW9kaWZpZXJzKCkpKTsKLQkJLy8gU2V0IHR5cGUgdG8gY2xhc3Mgb3IgaW50ZXJmYWNlLCBub3QgeWV0IGhhbmRsaW5nIEVYQ0VQVElPTgotCQlpZiAoZ2V0U291cmNlVHlwZSgpLmlzSW50ZXJmYWNlKCkpCi0JCQlqYXZhQ2xhc3NUYXJnZXQuc2V0S2luZChUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCk7Ci0JCWVsc2UKLQkJCWphdmFDbGFzc1RhcmdldC5zZXRLaW5kKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwpOwotCX0KLQotCS8qKgotCSAqIHNldE5hbWluZyAtIHNldCB0aGUgbmFtaW5nIHZhbHVlcyBoZXJlIC0gcXVhbGlmaWVkIG5hbWUgKHBhY2thZ2UgbmFtZSArIG5hbWUpIG11c3QgYmUgc2V0IGZpcnN0LCB0aGF0IGlzIHRoZSBwYXRoIHRvIHRoZSByZWFsIEphdmEgY2xhc3MgLSBJRCAtCi0JICogc2ltcGxlIG5hbWUsIGlkZW50aXR5IHdpdGhpbiBhIHBhY2thZ2UgZG9jdW1lbnQgLSBOTyBVVUlEISEhCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtaW5nKCkgewotCQkvLwlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCS8vCWphdmFDbGFzc1RhcmdldC5yZWZTZXRVVUlEKChTdHJpbmcpIG51bGwpOwotCQkvLwkoKFhNSVJlc291cmNlKWphdmFDbGFzc1RhcmdldC5lUmVzb3VyY2UoKSkuc2V0SUQoamF2YUNsYXNzVGFyZ2V0LGdldFNpbXBsZU5hbWUoZ2V0U291cmNlVHlwZSgpLmdldE5hbWUoKSkpOwotCX0KLQotCS8qKgotCSAqIHNldFN1cGVyIC0gc2V0IG91ciBzdXBlcnR5cGUgaGVyZSwgaW1wbGVtZW50ZWQgaW50ZXJmYWNlIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdXBlcigpIHRocm93cyBJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uIHsKLQkJQ2xhc3Mgc3VwZXJDbGFzcyA9IG51bGw7Ci0JCXN1cGVyQ2xhc3MgPSBnZXRTb3VyY2VUeXBlKCkuZ2V0U3VwZXJjbGFzcygpOwotCQlpZiAoc3VwZXJDbGFzcyAhPSBudWxsKSB7Ci0JCQlKYXZhQ2xhc3MgamF2YUNsYXNzVGFyZ2V0ID0gKEphdmFDbGFzcykgZ2V0VGFyZ2V0KCk7Ci0JCQlqYXZhQ2xhc3NUYXJnZXQuc2V0U3VwZXJ0eXBlKGNyZWF0ZUphdmFDbGFzc1JlZihzdXBlckNsYXNzLmdldE5hbWUoKSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHNvdXJjZVR5cGUgY2FuIGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNvdXJjZVR5cGVFeGlzdHMoKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VUeXBlKCkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0RmllbGRzSWZOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiByZWZsZWN0VmFsdWVzSWZOZWNlc3NhcnkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0TWV0aG9kc0lmTmVjZXNzYXJ5KCkgewotCQlyZXR1cm4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhRmllbGRKREtBZGFwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhRmllbGRKREtBZGFwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NDY5MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUZpZWxkSkRLQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWFkQWRhcHRvcjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzYvMjAwMCA0OjQyOjUwIFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUZpZWxkSkRLQWRhcHRvciBleHRlbmRzIEpES0FkYXB0b3IgewotCXByb3RlY3RlZCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZCBzb3VyY2VGaWVsZCA9IG51bGw7Ci0JcHJvdGVjdGVkIENsYXNzIHBhcmVudFR5cGUgPSBudWxsOwotCXB1YmxpYyBKYXZhRmllbGRKREtBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCwgSmF2YUpES0FkYXB0ZXJGYWN0b3J5IGFuQWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodGFyZ2V0LCBhbkFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JLyoqCi0JICogZ2V0UGFyZW50VHlwZSAtIHJldHVybiB0aGUgQ2xhc3Mgd2hpY2ggY29ycmVzcG9uZHMgdG8gb3VyIHBhcmVudCBKYXZhQ2xhc3MKLQkgKiB3ZSdyZSBnb2luZyB0byBkbyB0aGlzIGEgbG90LCBzbyBjYWNoZSBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0UGFyZW50VHlwZSgpIHsKLQkJaWYgKHBhcmVudFR5cGUgPT0gbnVsbCkgewotCQkJRmllbGQgdGFyZ2V0RmllbGQgPSAoRmllbGQpIGdldFRhcmdldCgpOwotCQkJSmF2YUNsYXNzIHBhcmVudEphdmFDbGFzcyA9IHRhcmdldEZpZWxkLmdldEphdmFDbGFzcygpOwotCQkJSmF2YUNsYXNzSkRLQWRhcHRvciBwYSA9IChKYXZhQ2xhc3NKREtBZGFwdG9yKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihwYXJlbnRKYXZhQ2xhc3MuZUFkYXB0ZXJzKCksIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKLQkJCWlmIChwYSAhPSBudWxsKQotCQkJCXBhcmVudFR5cGUgPSBwYS5nZXRTb3VyY2VUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudFR5cGU7Ci0JfQotCXB1YmxpYyBPYmplY3QgZ2V0UmVmbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZUZpZWxkKCk7Ci0JfQotCQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvciNoYXNSZWZsZWN0aW9uU291cmNlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDYWNoZWRSZWZsZWN0aW9uU291cmNlKCkgewotICAgICAgICByZXR1cm4gc291cmNlRmllbGQgIT0gbnVsbDsKLSAgICB9Ci0JLyoqCi0JICogZ2V0U291cmNlRmllbGQgLSByZXR1cm4gdGhlIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIHdoaWNoIGRlc2NyaWJlcyBvdXIgaW1wbGVtZW50aW5nIGZpZWxkCi0JICovCi0JcHJvdGVjdGVkIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGdldFNvdXJjZUZpZWxkKCkgewotCQlpZiAoc291cmNlRmllbGQgPT0gbnVsbCkgewotCQkJQ2xhc3MgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnRUeXBlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlzb3VyY2VGaWVsZCA9IHBhcmVudC5nZXREZWNsYXJlZEZpZWxkKCgoRmllbGQpIGdldFRhcmdldCgpKS5nZXROYW1lKCkpOwotCQkJCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gT0ssIGNhcnJ5IG9uCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2VGaWVsZDsKLQl9Ci0JcHVibGljIEZpZWxkIGdldFRhcmdldEZpZWxkKCkgewotCQlyZXR1cm4gKEZpZWxkKSBnZXRUYXJnZXQoKTsKLQl9Ci0JLyoqCi0JICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgYWRhcHRlciBkb2VzIG5vdCBkeW5hbWljYWxseSBjb21wdXRlIGFueSB2YWx1ZXMsCi0JCS8vIGFsbCB2YWx1ZXMgYXJlIHB1c2hlZCBiYWNrIGludG8gdGhlIHRhcmdldCBvbiB0aGUgaW5pdGlhbCBjYWxsLgotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0JfQotCS8qKgotCSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQuCi0JICogb24gZW50cnk6IG5hbWUsIGNvbnRhaW5pbmcgcGFja2FnZSAoYW5kIHF1YWxpZmllZCBuYW1lKSwgYW5kIGRvY3VtZW50IG11c3QgYmUgc2V0LgotCSAqIEphdmFDbGFzcyBhZGFwdG9yOgotCSAqCS0gc2V0IG1vZGlmaWVycwotCSAqCS0gc2V0IG5hbWUKLQkgKiAJLSBzZXQgdHlwZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RWYWx1ZXMoKSB7Ci0JCWlmIChnZXRTb3VyY2VGaWVsZCgpICE9IG51bGwpIHsKLQkJCXNldE1vZGlmaWVycygpOwotCQkJc2V0VHlwZSgpOwotCQkJc2V0SW5pdGlhbGl6ZXJJZlBvc3NpYmxlKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFVzZWQgZm9yIHRoZSB2ZXJ5IG5hcnJvdyBjYXNlIG9mIGZpbmFsIHN0YXRpYyBTdHJpbmdzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5pdGlhbGl6ZXJJZlBvc3NpYmxlKCkgewotCQlpZiAoIShnZXRUYXJnZXRGaWVsZCgpLmlzU3RhdGljKCkgJiYgZ2V0VGFyZ2V0RmllbGQoKS5pc0ZpbmFsKCkgJiYgImphdmEubGFuZy5TdHJpbmciLmVxdWFscygoKEphdmFIZWxwZXJzKSBnZXRUYXJnZXRGaWVsZCgpLmdldEVUeXBlKCkpLmdldFF1YWxpZmllZE5hbWUoKSkpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXZhbHVlID0gKFN0cmluZykgZ2V0U291cmNlRmllbGQoKS5nZXQobnVsbCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlCi0JCQl2YWx1ZSA9ICJcIiIuY29uY2F0KHZhbHVlKS5jb25jYXQoIlwiIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJQmxvY2sgYUJsb2NrID0gY3JlYXRlQmxvY2soZ2V0VGFyZ2V0RmllbGQoKS5nZXROYW1lKCksIHZhbHVlKTsKLQkJZ2V0VGFyZ2V0RmllbGQoKS5zZXRJbml0aWFsaXplcihhQmxvY2spOwotCX0KLQkvKioKLQkgKiBzZXRNb2RpZmllcnMgLSBzZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMgcmVsYXRlZCB0byBtb2RpZmllcnMgaGVyZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGlmaWVycygpIHsKLQkJRmllbGQgamF2YUZpZWxkVGFyZ2V0ID0gKEZpZWxkKSBnZXRUYXJnZXQoKTsKLQkJLy8gRm9yIEpESyByZWZsZWN0aW9uLCBJIGRvbid0IHRoaW5rIHdlIGNhbiBzZXQgdGhlIGluaXRpYWxpemVyCi0JCWludCBtb2RpZmllcnMgPSBnZXRTb3VyY2VGaWVsZCgpLmdldE1vZGlmaWVycygpOwotCQlqYXZhRmllbGRUYXJnZXQuc2V0U3RhdGljKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzU3RhdGljKG1vZGlmaWVycykpOwotCQlqYXZhRmllbGRUYXJnZXQuc2V0VHJhbnNpZW50KGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzVHJhbnNpZW50KG1vZGlmaWVycykpOwotCQlqYXZhRmllbGRUYXJnZXQuc2V0Vm9sYXRpbGUoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNWb2xhdGlsZShtb2RpZmllcnMpKTsKLQkJamF2YUZpZWxkVGFyZ2V0LnNldEZpbmFsKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzRmluYWwobW9kaWZpZXJzKSk7Ci0JCS8vIFNldCB2aXNpYmlsaXR5Ci0JCWlmIChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKQotCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCk7Ci0JCWVsc2UgaWYgKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpKQotCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUklWQVRFX0xJVEVSQUwpOwotCQllbHNlIGlmIChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpKQotCQkJamF2YUZpZWxkVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUk9URUNURURfTElURVJBTCk7Ci0JCWVsc2UKLQkJCWphdmFGaWVsZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUEFDS0FHRV9MSVRFUkFMKTsKLQl9Ci0JLyoqCi0JICogc2V0VHlwZSAtIHNldCBvdXIgdHlwZSBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHlwZSgpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0VHlwZU5hbWUoZ2V0U291cmNlRmllbGQoKS5nZXRUeXBlKCkpOwotCQlzZXRGaWVsZFR5cGUoZ2V0VGFyZ2V0RmllbGQoKSwgdHlwZU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvamRrL0phdmFKREtBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUpES0FkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OTRlYjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YUpES0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkazsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWZsZWN0aW9uQWRhcHRvcjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICg2LzEzLzIwMDAgMToyMDozMSBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEphdmFKREtBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkgewotCXByb3RlY3RlZCBDbGFzc0xvYWRlciBjb250ZXh0Q2xhc3NMb2FkZXI7Ci0JLyoqCi0JICogSmF2YUpET01BZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKYXZhSkRLQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vYWRhcHRlcktleSA9IFRZUEVfTkFNRTsKLQl9Ci0JLyoqCi0JICogSmF2YUpET01BZGFwdGVyRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKYXZhSkRLQWRhcHRlckZhY3RvcnkoQ2xhc3NMb2FkZXIgYUNsYXNzTG9hZGVyKSB7Ci0JCXRoaXMoKTsKLQkJc2V0Q29udGV4dENsYXNzTG9hZGVyKGFDbGFzc0xvYWRlcik7Ci0JfQotCXByb3RlY3RlZCBSZWZsZWN0aW9uQWRhcHRvciBjcmVhdGVKYXZhQ2xhc3NBZGFwdG9yKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gbmV3IEphdmFDbGFzc0pES0FkYXB0b3IodGFyZ2V0LCB0aGlzKTsKLQl9Ci0JcHJvdGVjdGVkIFJlZmxlY3Rpb25BZGFwdG9yIGNyZWF0ZUphdmFGaWVsZEFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiBuZXcgSmF2YUZpZWxkSkRLQWRhcHRvcih0YXJnZXQsIHRoaXMpOwotCX0KLQlwcm90ZWN0ZWQgUmVmbGVjdGlvbkFkYXB0b3IgY3JlYXRlSmF2YU1ldGhvZEFkYXB0b3IoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiBuZXcgSmF2YU1ldGhvZEpES0FkYXB0b3IodGFyZ2V0LCB0aGlzKTsKLQl9Ci0JLy8gRmx1c2ggQUxMIGFkYXB0ZXJzLCB3b3JzdCBjYXNlCi0JcHVibGljIHZvaWQgZmx1c2hBbGwoKSB7Ci0JCWlzQnVzeUl0ZXJhdGluZ1JlZmxlY3RlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlJdGVyYXRvciBpID0gcmVmbGVjdGVkLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpCi0JCQkJICgoSmF2YUNsYXNzSkRLQWRhcHRvcikgaS5uZXh0KCkpLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZpbmlzaGVkSXRlcmF0aW5nUmVmbGVjdGVkKCk7Ci0JCX0KLQl9Ci0JLy8gRmx1c2ggdGhlIGFkYXB0ZXIgZm9yIGEgc291cmNlIG9iamVjdAotCXB1YmxpYyB2b2lkIGZsdXNoUmVmbGVjdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JCUphdmFDbGFzc0pES0FkYXB0b3IgYSA9IChKYXZhQ2xhc3NKREtBZGFwdG9yKSByZWZsZWN0ZWQuZ2V0KHNvdXJjZSk7Ci0JCWlmIChhICE9IG51bGwpCi0JCQlhLmZsdXNoUmVmbGVjdGVkVmFsdWVzSWZOZWNlc3NhcnkoKTsKLQl9Ci0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqIENyZWF0aW9uIGRhdGU6ICgxMS8wNy8wMCAzOjM4OjEyIFBNKQotCSAqIEByZXR1cm4gamF2YS5sYW5nLkNsYXNzTG9hZGVyCi0JICovCi0JcHVibGljIGphdmEubGFuZy5DbGFzc0xvYWRlciBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBjb250ZXh0Q2xhc3NMb2FkZXI7Ci0JfQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTEvMDcvMDAgMzozODoxMiBQTSkKLQkgKiBAcGFyYW0gbmV3Q29udGV4dENsYXNzTG9hZGVyIGphdmEubGFuZy5DbGFzc0xvYWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRleHRDbGFzc0xvYWRlcihqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgbmV3Q29udGV4dENsYXNzTG9hZGVyKSB7Ci0JCWNvbnRleHRDbGFzc0xvYWRlciA9IG5ld0NvbnRleHRDbGFzc0xvYWRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhTWV0aG9kSkRLQWRhcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9hZGFwdGVycy9qZGsvSmF2YU1ldGhvZEpES0FkYXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3MzVjZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL2pkay9KYXZhTWV0aG9kSkRLQWRhcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuamRrOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5JSmF2YU1ldGhvZEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVhZEFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5NZXRob2RJbXBsOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvNi8yMDAwIDQ6NDI6NTAgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhTWV0aG9kSkRLQWRhcHRvciBleHRlbmRzIEpES0FkYXB0b3IgaW1wbGVtZW50cyBJSmF2YU1ldGhvZEFkYXB0ZXIgewotCXByb3RlY3RlZCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0IHNvdXJjZUFjY2Vzc2libGUgPSBudWxsOyAvLyBDb3VsZCBiZSBtZXRob2Qgb3IgY3Rvci4KLQlwcm90ZWN0ZWQgQ2xhc3MgcGFyZW50VHlwZSA9IG51bGw7Ci0JLy8gY2FjaGUgYSBzdGF0aWMgZW1wdHkgQ2xhc3NbXSBmb3Igbm8gcGFybSBtZXRob2RzCi0JcHJvdGVjdGVkIHN0YXRpYyBDbGFzc1tdIGVtcHR5Q2xhc3NBcnJheSA9IG5ldyBDbGFzc1swXTsKLQkvLyBjYWNoZSBhIHN0YXRpYyBlbXB0eSBTdHJpbmdbXSwgdG9vCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBlbXB0eVN0cmluZ0FycmF5ID0gbmV3IFN0cmluZ1swXTsKLQlwdWJsaWMgSmF2YU1ldGhvZEpES0FkYXB0b3IoTm90aWZpZXIgdGFyZ2V0LCBKYXZhSkRLQWRhcHRlckZhY3RvcnkgYW5BZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih0YXJnZXQsIGFuQWRhcHRlckZhY3RvcnkpOwotCX0KLQkvKioKLQkgKiBhZGRFeGNlcHRpb25zIC0gcmVmbGVjdCBvdXIgZXhjZXB0aW9uIGxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeGNlcHRpb25zKCkgewotCQlDbGFzc1tdIGV4Y2VwdGlvbnMgPQotCQkJKGdldFNvdXJjZUFjY2Vzc2libGUoKSBpbnN0YW5jZW9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKLQkJCQk/ICgoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKSBnZXRTb3VyY2VBY2Nlc3NpYmxlKCkpLmdldEV4Y2VwdGlvblR5cGVzKCkKLQkJCQk6ICgoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0RXhjZXB0aW9uVHlwZXMoKTsKLQkJLy8JRUxpc3QgZXhMaXN0ID0gKEVMaXN0KSBqYXZhTWV0aG9kVGFyZ2V0LnByaW1SZWZWYWx1ZShKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kX0phdmFFeGNlcHRpb25zKCkpOwotCQlMaXN0IGV4TGlzdCA9IGdldE1ldGhvZFRhcmdldCgpLmdldEphdmFFeGNlcHRpb25zR2VuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjZXB0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJZXhMaXN0LmFkZChjcmVhdGVKYXZhQ2xhc3NSZWYoZXhjZXB0aW9uc1tpXS5nZXROYW1lKCkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBNZXRob2RJbXBsIGdldE1ldGhvZFRhcmdldCgpIHsKLQkJcmV0dXJuIChNZXRob2RJbXBsKSBnZXRUYXJnZXQoKTsKLQl9Ci0JLyoqCi0JICogYWRkUGFyYW1ldGVycyAtIHJlZmxlY3Qgb3VyIHBhcm1zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1ldGVycygpIHsKLQkJQ2xhc3NbXSBwYXJtVHlwZXMgPQotCQkJKGdldFNvdXJjZUFjY2Vzc2libGUoKSBpbnN0YW5jZW9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKLQkJCQk/ICgoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKSBnZXRTb3VyY2VBY2Nlc3NpYmxlKCkpLmdldFBhcmFtZXRlclR5cGVzKCkKLQkJCQk6ICgoamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJTWV0aG9kSW1wbCBqYXZhTWV0aG9kVGFyZ2V0ID0gZ2V0TWV0aG9kVGFyZ2V0KCk7Ci0JCS8vIAlMaXN0IHBMaXN0ID0gKExpc3QpIGphdmFNZXRob2RUYXJnZXQucHJpbVJlZlZhbHVlKEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RfUGFyYW1ldGVycygpKTsKLQkJTGlzdCBwTGlzdCA9IGphdmFNZXRob2RUYXJnZXQuZ2V0UGFyYW1ldGVyc0dlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcm1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJcExpc3QuYWRkKGNyZWF0ZUphdmFQYXJhbWV0ZXIoamF2YU1ldGhvZFRhcmdldCwgImFyZyIgKyBpLCBnZXRUeXBlTmFtZShwYXJtVHlwZXNbaV0pKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoKE1ldGhvZCkgZ2V0VGFyZ2V0KCkpLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQl9Ci0JLyoqCi0JICogZ2V0UGFyZW50VHlwZSAtIHJldHVybiB0aGUgQ2xhc3Mgd2hpY2ggY29ycmVzcG9uZHMgdG8gb3VyIHBhcmVudCBKYXZhQ2xhc3MKLQkgKiB3ZSdyZSBnb2luZyB0byBkbyB0aGlzIGEgbG90LCBzbyBjYWNoZSBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0UGFyZW50VHlwZSgpIHsKLQkJaWYgKHBhcmVudFR5cGUgPT0gbnVsbCkgewotCQkJTWV0aG9kIHRhcmdldE1ldGhvZCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQkJSmF2YUNsYXNzIHBhcmVudEphdmFDbGFzcyA9IHRhcmdldE1ldGhvZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0JCQlKYXZhQ2xhc3NKREtBZGFwdG9yIHBhID0gKEphdmFDbGFzc0pES0FkYXB0b3IpIEVjb3JlVXRpbC5nZXRBZGFwdGVyKHBhcmVudEphdmFDbGFzcy5lQWRhcHRlcnMoKSwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJaWYgKHBhICE9IG51bGwpCi0JCQkJcGFyZW50VHlwZSA9IHBhLmdldFNvdXJjZVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gcGFyZW50VHlwZTsKLQl9Ci0JLyoqCi0JICogZ2V0UGFybVR5cGVTaWduYXR1cmVzIC0gcmV0dXJuIGFuIGFycmF5IG9mIENsYXNzZXMgZm9yIG91ciBwYXJhbWV0ZXIgdHlwZXMKLQkgKiAJRm9yIHJlZmxlY3Rpb24gcHVycG9zZXMsIHdlIGNhbiBvbmx5IHJlbHkgb24gb3VyIElELCBzaW5jZSBvdXIgcGFybXMgbWF5Ci0JICogIG5vdCB5ZXQgYmUga25vd24uCi0JICovCi0JcHJvdGVjdGVkIENsYXNzW10gZ2V0UGFybVR5cGVzKCkgewotCQlNZXRob2QgamF2YU1ldGhvZFRhcmdldCA9IChNZXRob2QpIGdldFRhcmdldCgpOwotCQlTdHJpbmcgaWQgPSAoKFhNSVJlc291cmNlKSBqYXZhTWV0aG9kVGFyZ2V0LmVSZXNvdXJjZSgpKS5nZXRJRChqYXZhTWV0aG9kVGFyZ2V0KTsKLQkJU3RyaW5nW10gdHlwZU5hbWVzID0gZ2V0VHlwZU5hbWVzRnJvbU1ldGhvZElEKGlkKTsKLQkJaWYgKHR5cGVOYW1lcyA9PSBudWxsKQotCQkJcmV0dXJuIGVtcHR5Q2xhc3NBcnJheTsKLQkJaW50IG4gPSB0eXBlTmFtZXMubGVuZ3RoOwotCQlpZiAobiA9PSAwKQotCQkJcmV0dXJuIGVtcHR5Q2xhc3NBcnJheTsKLQkJQ2xhc3NbXSB0eXBlcyA9IG5ldyBDbGFzc1tuXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJCXR5cGVzW2ldID0gZ2V0VHlwZSh0eXBlTmFtZXNbaV0pOwotCQl9Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0JcHVibGljIE9iamVjdCBnZXRSZWZsZWN0aW9uU291cmNlKCkgewotCQlyZXR1cm4gZ2V0U291cmNlQWNjZXNzaWJsZSgpOwotCX0KLQkKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0b3IjaGFzUmVmbGVjdGlvblNvdXJjZSgpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2FjaGVkUmVmbGVjdGlvblNvdXJjZSgpIHsgCi0gICAgICAgIHJldHVybiBzb3VyY2VBY2Nlc3NpYmxlICE9IG51bGw7Ci0gICAgfQotCS8qKgotCSAqIGdldHNvdXJjZU1ldGhvZCAtIHJldHVybiB0aGUgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIHdoaWNoIGRlc2NyaWJlcyBvdXIgaW1wbGVtZW50aW5nIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0IGdldFNvdXJjZUFjY2Vzc2libGUoKSB7Ci0JCWlmIChzb3VyY2VBY2Nlc3NpYmxlID09IG51bGwpIHsKLQkJCUNsYXNzIHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50VHlwZSgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJQ2xhc3NbXSBwYXJtVHlwZXMgPSB0aGlzLmdldFBhcm1UeXBlcygpOwotCQkJCXRyeSB7Ci0JCQkJCXNvdXJjZUFjY2Vzc2libGUgPSBwYXJlbnQuZ2V0RGVjbGFyZWRNZXRob2QoKChNZXRob2QpIGdldFRhcmdldCgpKS5nZXROYW1lKCksIHBhcm1UeXBlcyk7Ci0JCQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gT0ssIGNhbid0IHJlZmxlY3QgaXQKLQkJCQl9Ci0KLQkJCQlpZiAoc291cmNlQWNjZXNzaWJsZSA9PSBudWxsKSB7Ci0JCQkJCS8vIEl0IHdhc24ndCBhIG1ldGhvZCwgdHJ5IGZvciBjb25zdHJ1Y3Rvci4KLQkJCQkJdHJ5IHsKLQkJCQkJCXNvdXJjZUFjY2Vzc2libGUgPSBwYXJlbnQuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihwYXJtVHlwZXMpOwotCQkJCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gT0ssIGNhbid0IHJlZmxlY3QgaXQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlQWNjZXNzaWJsZTsKLQl9Ci0JLyoqCi0JICogZ2V0VmFsdWVJbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlSW4oRU9iamVjdCBvYmplY3QsIEVPYmplY3QgYXR0cmlidXRlKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQsIHRoaXMgYWRhcHRlciBkb2VzIG5vdCBkeW5hbWljYWxseSBjb21wdXRlIGFueSB2YWx1ZXMsCi0JCS8vIGFsbCB2YWx1ZXMgYXJlIHB1c2hlZCBiYWNrIGludG8gdGhlIHRhcmdldCBvbiB0aGUgaW5pdGlhbCBjYWxsLgotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWVJbihvYmplY3QsIGF0dHJpYnV0ZSk7Ci0JfQotCS8qKgotCSAqIHJlZmxlY3RWYWx1ZXMgLSB0ZW1wbGF0ZSBtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdG8gcHVtcCB2YWx1ZXMgaW50byB0YXJnZXQuCi0JICogb24gZW50cnk6IFVVSUQsIG5hbWUsIGNvbnRhaW5pbmcgcGFja2FnZSAoYW5kIHF1YWxpZmllZCBuYW1lKSwgYW5kIGRvY3VtZW50IG11c3QgYmUgc2V0LgotCSAqIE1ldGhvZCBhZGFwdG9yOgotCSAqCS0gc2V0IG1vZGlmaWVycwotCSAqCS0gc2V0IG5hbWUKLQkgKiAJLSBzZXQgcmV0dXJuIHR5cGUKLQkgKiAJLSBhZGQgcGFyYW1ldGVycwotCSAqIAktIGFkZCBleGNlcHRpb25zCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVmbGVjdFZhbHVlcygpIHsKLQkJaWYgKGdldFNvdXJjZUFjY2Vzc2libGUoKSAhPSBudWxsKSB7Ci0JCQkoKE1ldGhvZCkgZ2V0VGFyZ2V0KCkpLnNldElzR2VuZXJhdGVkKGZhbHNlKTsKLQkJCXNldE1vZGlmaWVycygpOwotCQkJc2V0TmFtaW5nKCk7Ci0JCQlzZXRSZXR1cm5UeXBlKCk7Ci0JCQlhZGRQYXJhbWV0ZXJzKCk7Ci0JCQlhZGRFeGNlcHRpb25zKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLklKYXZhTWV0aG9kQWRhcHRlciNyZWZsZWN0R2VuZXJhdGVkSWZOZWNlc3NhcnkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlZmxlY3RHZW5lcmF0ZWRJZk5lY2Vzc2FyeSgpIHsKLQkJcmV0dXJuIHJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWZsZWN0UGFyYW1OYW1lc0lmTmVjZXNzYXJ5KCkgewotCQlyZXR1cm4gcmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JfQotCQotCS8qKgotCSAqIHNldE1vZGlmaWVycyAtIHNldCB0aGUgYXR0cmlidXRlIHZhbHVlcyByZWxhdGVkIHRvIG1vZGlmaWVycyBoZXJlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kaWZpZXJzKCkgewotCQlNZXRob2QgbWV0aG9kVGFyZ2V0ID0gKE1ldGhvZCkgZ2V0VGFyZ2V0KCk7Ci0JCWludCBtb2RpZmllcnMgPQotCQkJKGdldFNvdXJjZUFjY2Vzc2libGUoKSBpbnN0YW5jZW9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCkKLQkJCQk/ICgoamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKSBnZXRTb3VyY2VBY2Nlc3NpYmxlKCkpLmdldE1vZGlmaWVycygpCi0JCQkJOiAoKGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yKSBnZXRTb3VyY2VBY2Nlc3NpYmxlKCkpLmdldE1vZGlmaWVycygpOwotCQltZXRob2RUYXJnZXQuc2V0QWJzdHJhY3QoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNBYnN0cmFjdChtb2RpZmllcnMpKTsKLQkJbWV0aG9kVGFyZ2V0LnNldEZpbmFsKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzRmluYWwobW9kaWZpZXJzKSk7Ci0JCW1ldGhvZFRhcmdldC5zZXROYXRpdmUoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNOYXRpdmUobW9kaWZpZXJzKSk7Ci0JCW1ldGhvZFRhcmdldC5zZXRTdGF0aWMoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKSk7Ci0JCW1ldGhvZFRhcmdldC5zZXRTeW5jaHJvbml6ZWQoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNTeW5jaHJvbml6ZWQobW9kaWZpZXJzKSk7Ci0JCW1ldGhvZFRhcmdldC5zZXRDb25zdHJ1Y3RvcihnZXRTb3VyY2VBY2Nlc3NpYmxlKCkgaW5zdGFuY2VvZiBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3Rvcik7Ci0JCS8vIFNldCB2aXNpYmlsaXR5Ci0JCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSBnZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0JCWlmICgoamF2YUNsYXNzLmdldEtpbmQoKSA9PSBUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCkgfHwgKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpKQotCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCk7Ci0JCWVsc2UgaWYgKGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpKQotCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUklWQVRFX0xJVEVSQUwpOwotCQllbHNlIGlmIChqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpKQotCQkJbWV0aG9kVGFyZ2V0LnNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZC5QUk9URUNURURfTElURVJBTCk7Ci0JCWVsc2UKLQkJCS8vVmlzaWJpbGl0eSBtdXN0IGJlIHBhY2thZ2UKLQkJCW1ldGhvZFRhcmdldC5zZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQuUEFDS0FHRV9MSVRFUkFMKTsKLQl9Ci0JLyoqCi0JICogc2V0TmFtaW5nIC0gc2V0IHRoZSBuYW1pbmcgdmFsdWVzIGhlcmUKLQkgKiAJLSBxdWFsaWZpZWQgbmFtZSBtdXN0IGJlIHNldCBmaXJzdCwgdGhhdCBpcyB0aGUgcGF0aCB0byB0aGUgcmVhbCBKYXZhIGNsYXNzCi0JICoJLSBJRAotCSAqIAktIG5hbWUtYmFzZWQgVVVJRAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWluZygpIHsKLQkJLy8KLQkJLy8JbmFtaW5nIGlzIGN1cnJlbnRseSBhIG5vLW9wIHNpbmNlIHRoZSBuYW1lIGFuZCBVVUlEIG11c3QgYmUgc2V0IHByaW9yIHRvIHJlZmxlY3Rpb24KLQkJLy8JLi4uYW5kIElEIGlzIHJlZHVuZGFudCB3aXRoIFVVSUQuCi0JCS8vCWphdmFGaWVsZFRhcmdldC5zZXRJRChwYXJlbnQuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIl8iICsgamF2YUZpZWxkVGFyZ2V0LmdldE5hbWUoKSk7Ci0JfQotCS8qKgotCSAqIHNldFR5cGUgLSBzZXQgb3VyIHJldHVybiB0eXBlIGhlcmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZXR1cm5UeXBlKCkgewotCQlpZiAoZ2V0U291cmNlQWNjZXNzaWJsZSgpIGluc3RhbmNlb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kKSB7Ci0JCQlDbGFzcyB0eXBlID0gKChqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QpIGdldFNvdXJjZUFjY2Vzc2libGUoKSkuZ2V0UmV0dXJuVHlwZSgpOwotCQkJTWV0aG9kIGphdmFNZXRob2RUYXJnZXQgPSAoTWV0aG9kKSBnZXRUYXJnZXQoKTsKLQkJCS8qCi0JCQkJCUphdmFQYXJhbWV0ZXIgbmV3UGFyYW1ldGVyID0gY3JlYXRlSmF2YVBhcmFtZXRlcihqYXZhTWV0aG9kVGFyZ2V0LCAicmVzdWx0IiwgZ2V0VHlwZU5hbWUodHlwZSkpOy8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3UGFyYW1ldGVyLnNldFBhcmFtZXRlcktpbmQoTWV0YUphdmFQYXJhbWV0ZXJLaW5kLlJFVFVSTik7Ci0JCQkJCWphdmFNZXRob2RUYXJnZXQuZ2V0UGFyYW1ldGVycygpLmFkZChuZXdQYXJhbWV0ZXIpOwotCQkJKi8KLQkJCWphdmFNZXRob2RUYXJnZXQuc2V0RVR5cGUoY3JlYXRlSmF2YUNsYXNzUmVmKGdldFR5cGVOYW1lKHR5cGUpKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2FkYXB0ZXJzL25scy9SZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvbmxzL1Jlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWZlMjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYWRhcHRlcnMvbmxzL1Jlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHM7Ci0vKgotCi0KLSAqLwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiamF2YWFkYXB0ZXJzIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcsIFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChmZ1Jlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCWZnUmVzb3VyY2VCdW5kbGU9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQkJCi0JCWlmIChmZ1Jlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZnUmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQl0cnkge3JldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7fQotCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkge3JldHVybiBnZXRTdHJpbmcoa2V5KTt9Ci0KLX0KLX0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9iZWFuaW5mby9JSW50cm9zcGVjdGlvbkFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2phdmEvYmVhbmluZm8vSUludHJvc3BlY3Rpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MmY5NWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9iZWFuaW5mby9JSW50cm9zcGVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYmVhbmluZm87Ci0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSBCZWFuaW5mbyBhZGFwdGVyLiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uCi0gKiBpcyBpbiBhIHNlcGFyYXRlIHByb2plY3Qgc28gdGhhdCBiZWFuaW5mbyBjb2RlIHdpbGwgbm90IGJlIGxvYWRlZAotICogdW5sZXNzIGl0IG5lZWRzIHRvIGJlLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUludHJvc3BlY3Rpb25BZGFwdGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBBREFQVEVSX0tFWSA9IElJbnRyb3NwZWN0aW9uQWRhcHRlci5jbGFzczsKLQlwdWJsaWMgdm9pZCBpbnRyb3NwZWN0SWZOZWNlc3NhcnkoKTsKLQlwdWJsaWMgYm9vbGVhbiBpc1N0YWxlKCk7Ci0JcHVibGljIEVMaXN0IGdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQlwdWJsaWMgRUxpc3QgZ2V0RU9wZXJhdGlvbnMoKTsKLQlwdWJsaWMgQmFzaWNFTGlzdCBnZXRFQWxsT3BlcmF0aW9ucygpOwotCXB1YmxpYyBFTGlzdCBnZXRFdmVudHMoKTsKLQlwdWJsaWMgRUxpc3QgZ2V0QWxsRXZlbnRzKCk7Ci0JcHVibGljIEVMaXN0IGdldEFsbFByb3BlcnRpZXMoKTsJCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbml0L0phdmFJbml0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luaXQvSmF2YUluaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2ZjFjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luaXQvSmF2YUluaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVhNSUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIEluaXRpYWxpemUgdGhlIEphdmEgUmVmbGVjdGlvbiBtZWNoYW5pc21zLiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFJbml0IHsKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gcGx1Z2luX2luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKLQkJaW5pdCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdChib29sZWFuIHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkgewotCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJaWYgKHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpIHsKLQkJCQlwcmVSZWdpc3RlclBhY2thZ2VzKCk7Ci0JCQkJc2V0RGVmYXVsdFJlc291cmNlRmFjdG9yeSgpOwotCQkJfQotCQkJLy9SZWdpc3RlciByZXNvdXJjZSBmYWN0b3J5Ci0JCQlKYXZhWE1JRmFjdG9yeUltcGwucmVnaXN0ZXIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJlUmVnaXN0ZXJQYWNrYWdlcygpIHsKLQkJLy9lY29yZQotCQlpZiAoIUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmNvbnRhaW5zS2V5KCJlY29yZS54bWkiKSkgLy8kTk9OLU5MUy0xJAotCQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KCJlY29yZS54bWkiLCBFY29yZVBhY2thZ2UuZUlOU1RBTkNFKTsgLy8kTk9OLU5MUy0xJAotCQkvL2phdmEKLQkJaWYgKCFFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5jb250YWluc0tleSgiamF2YS54bWkiKSkgLy8kTk9OLU5MUy0xJAotCQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KCJqYXZhLnhtaSIsIEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldERlZmF1bHRSZXNvdXJjZUZhY3RvcnkoKSB7Ci0JCS8vVGhpcyBpcyBub3QgZG9uZSBvdXRzaWRlIG9mIEVjbGlwc2UKLQkJaWYgKFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkuZ2V0KFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04pID09IG51bGwpCi0JCQlSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgKLQkJCQlSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LkRFRkFVTFRfRVhURU5TSU9OLAotCQkJCW5ldyBYTUlSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQbHVnaW5Jbml0KGJvb2xlYW4gYlBsdWdpbkluaXQpIHsKLQkJLy8gSGVyZSdzIHdoZXJlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgd291bGQgYmUgcmVhZC4KLQkJcGx1Z2luX2luaXRpYWxpemVkID0gYlBsdWdpbkluaXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luc3RhbnRpYXRpb24vSUluc3RhbnRpYXRpb25IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luc3RhbnRpYXRpb24vSUluc3RhbnRpYXRpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NDg5NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFEYXRhVHlwZTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgSW5zdGFudGlhdGlvbiBoYW5kbGVyLiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uCi0gKiBpcyBpbiBhIHNlcGFyYXRlIHByb2plY3Qgc28gdGhhdCBpbnN0YW50aWF0aW9uIGNvZGUgd2lsbCBub3QgYmUgbG9hZGVkCi0gKiB1bmxlc3MgaXQgbmVlZHMgdG8gYmUuCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJSW5zdGFudGlhdGlvbkhhbmRsZXIgewotCS8qKgotCSAqIEFuc3dlcnMgd2hldGhlciB0aGUgYWRhcHRlciBoYW5kbGVzIHRoZSBkYXRhdHlwZQotCSAqIG9yIHdoZXRoZXIgdGhlIHN0YW5kYXJkIEVGYWN0b3J5IGRvZXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlc0RhdGFUeXBlKEphdmFEYXRhVHlwZSB0eXBlKTsKLQkKLQkvKioKLQkgKiBBbnN3ZXJzIHdoZXRoZXIgdGhlIGFkYXB0ZXIgaGFuZGxlcyB0aGUgRUNsYXNzIG9yIHRoZQotCSAqIHN0YW5kYXJkIEVGYWN0b3J5IGRvZXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFuZGxlc0NsYXNzKEVDbGFzcyB0eXBlKTsKLQkKLQkvKioKLQkgKiBJZiBhZGFwdGVySGFuZGxlc0luc3RhbmNlIHJldHVybnMgdHJ1ZSwgdGhlbgotCSAqIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHRvIGNyZWF0ZSB0aGUgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBqYXZhQ2xhc3MpOwotCi19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSGFuZGxlckZhY3RvcnlBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luc3RhbnRpYXRpb24vSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0ZTVkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luc3RhbnRpYXRpb24vSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbjsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUZhY3RvcnlJbXBsOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBpcyBhIGZhY3RvcnkgZm9yIElJbnN0YW50aWF0aW9uSGFuZGxlcidzLiBJdCBpcyBhdHRhY2hlZCBhcwotICogYW4gYWRhcHRlciBvbiB0aGUgUmVzb3VyY2VTZXQgdGhhdCBjb250YWlucyB0aGUgamF2YSBtb2RlbC4gSmF2YVhNSUZhY3RvcnkKLSAqIHdpbGwgdXNlIGl0IHRvIHJldHJpZXZlIGl0cyBJSW5zdGFudGlhdGlvbkhhbmRsZXIuIElmIHRoZSBhZGFwdGVyIGlzIG5vdAotICogZm91bmQsIHRoZW4gbm8gaW5zdGFudGlhdGlvbiBoYW5kbGVyIGV4aXN0cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlciBleHRlbmRzIEFkYXB0ZXIgewotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgQ2xhc3MgQURBUFRFUl9LRVkgPSBJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5jbGFzczsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gSUluc3RhbnRpYXRpb25IYW5kbGVyLgotCSAqLwotCXB1YmxpYyBJSW5zdGFudGlhdGlvbkhhbmRsZXIgZ2V0SW5zdGFudGlhdGlvbkhhbmRsZXIoSmF2YUZhY3RvcnlJbXBsIGZhY3RvcnkpOwotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luc3RhbnRpYXRpb24vSUluc3RhbnRpYXRpb25JbnN0YW5jZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvamF2YS9pbnN0YW50aWF0aW9uL0lJbnN0YW50aWF0aW9uSW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRlOTU2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9qYXZhL2luc3RhbnRpYXRpb24vSUluc3RhbnRpYXRpb25JbnN0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhbiBpbnN0YW5jZS4gVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbgotICogaXMgaW4gYSBzZXBhcmF0ZSBwcm9qZWN0IHNvIHRoYXQgaW5zdGFudGlhdGlvbiBjb2RlIHdpbGwgbm90IGJlIGxvYWRlZAotICogdW5sZXNzIGl0IG5lZWRzIHRvIGJlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnN0YW50aWF0aW9uSW5zdGFuY2UgewotCS8qKgotCSAqIEByZXR1cm4gVGhlIEphdmFIZWxwZXJzIGZvciB0aGUgamF2YSB0eXBlIG9mIHRoZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0SmF2YVR5cGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9BcnJheVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQXJyYXlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NWY2OTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9BcnJheVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci0vKioKLSAqIERlc2NyaWJlcyBhIEphdmEgQXJyYXkgdHlwZQotICogICAgRm9yIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cywgaXQgaXMgdW5saWtlbHkgdGhhdCB0aGUgY29tcG9uZW50IHR5cGUgd2lsbCBiZQotICogICAgc3BlY2lmaWVkIGRpcmVjdGx5LiAgVGhpcyB3b3VsZCByZXF1aXJlIGluc3RhbnRpYXRpbmcgYSBjaGFpbiBvZiBjb21wb25lbnQgdHlwZXMKLSAqICAgIHN1Y2ggYXMgU3RyaW5nW11bXVtdW10tPlN0cmluZ1tdW11bXS0+U3RyaW5nW11bXS0+U3RyaW5nW10tPlN0cmluZy4KLSAqIAotICogICBUaGUgY29tcG9uZW50IHR5cGUgcmVsYXRpb25zaGlwIHdpbGwgYmUgY29tcHV0ZWQgaWYgdGhlIGZpbmFsQ29tcG9uZW50VHlwZQotICogICBhbmQgYXJyYXkgZGltZW5zaW9ucyBpcyBzcGVjaWZpZWQuCi0gKiAgCi0gKiAgIEZvciB0aGlzIHJlYXNvbiwgdGhlIHByZWZlcnJlZCB3YXkgdG8gY3JlYXRlIGlzIHRocm91Z2ggdGhlIEphdmFSZWZGYWN0b3J5IGZhY3RvcnkgbWV0aG9kOgotICogICAgICAgIGNyZWF0ZUFycmF5VHlwZShKYXZhQ2xhc3MgZmluYWxDb21wb25lbnRUeXBlLCBpbnQgZGltZW5zaW9ucykKLSAqLwotcHVibGljIGludGVyZmFjZSBBcnJheVR5cGUgZXh0ZW5kcyBKYXZhQ2xhc3N7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgQXJyYXlEaW1lbnNpb25zIGF0dHJpYnV0ZQotCSAqLwotCWludCBnZXRBcnJheURpbWVuc2lvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBBcnJheURpbWVuc2lvbnMgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRBcnJheURpbWVuc2lvbnMoaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIENvbXBvbmVudFR5cGUgcmVmZXJlbmNlCi0JICovCi0JRUNsYXNzaWZpZXIgZ2V0Q29tcG9uZW50VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuQXJyYXlUeXBlI2dldENvbXBvbmVudFR5cGUgPGVtPkNvbXBvbmVudCBUeXBlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21wb25lbnQgVHlwZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29tcG9uZW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29tcG9uZW50VHlwZShFQ2xhc3NpZmllciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBHZXQgdGhlIGZpbmFsIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIEFycmF5IFR5cGUuCi0JICogCi0JICogSW4gb3JkZXIgdG8gZW5zdXJlIGEgdW5pcXVlIGluc3RhbmNlLCB3ZSB3aWxsIHJlc29sdmUgdGhpcyB0eXBlIHVzaW5nCi0JICogcmVmbGVjdGlvbi4gSXQgdHVybnMgb3V0IHRvIGJlIG1vc3QgZWZmaWNpZW50IHRvIGp1c3QgZG8gdGhpcyBieSB0cmltbWluZyB0aGUKLQkgKiBuYW1lLgotCSAqLwotCUphdmFIZWxwZXJzIGdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogR2V0IHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGlzIGFycmF5LiAKLQkgKiAKLQkgKiBJZiB0aGlzIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXksIHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlIHRoZSBuZXN0ZWQKLQkgKiBhcnJheSB0eXBlLgotCSAqLwotCUphdmFIZWxwZXJzIGdldENvbXBvbmVudFR5cGVBc0hlbHBlcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogSXMgdGhpcyBhbiBhcnJheSBvZiBqYXZhIHByaW1pdGl2ZXMKLQkgKi8KLQlib29sZWFuIGlzUHJpbWl0aXZlQXJyYXkoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFNldCB0aGUgY29tcG9uZW50IHR5cGUuCi0JICovCi0Jdm9pZCBzZXRDb21wb25lbnRUeXBlKEphdmFIZWxwZXJzIGhlbHBlckNvbXBvbmVudFR5cGUpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9CbG9jay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9CbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmY4OWEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQmxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCbG9jayBleHRlbmRzIEVPYmplY3R7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgU291cmNlIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBTb3VyY2UgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRTb3VyY2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBOYW1lIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTmFtZSBhdHRyaWJ1dGUKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgQ29udGVudHMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldENvbnRlbnRzKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0NvbW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQ29tbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODY3NzFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvQ29tbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWVudCBleHRlbmRzIEJsb2NrIHsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvRmllbGQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkYTg1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0ZpZWxkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmllbGQgZXh0ZW5kcyBFVHlwZWRFbGVtZW50ewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzRmluYWwgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc0ZpbmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzU3RhdGljIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNTdGF0aWMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzU3RhdGljIDxlbT5TdGF0aWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXRpYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTdGF0aWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXRpYyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBKYXZhVmlzaWJpbGl0eSBhdHRyaWJ1dGUKLQkgKi8KLQlKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0SmF2YVZpc2liaWxpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2dldEphdmFWaXNpYmlsaXR5IDxlbT5KYXZhIFZpc2liaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgVmlzaWJpbGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhVmlzaWJpbGl0eUtpbmQKLQkgKiBAc2VlICNnZXRKYXZhVmlzaWJpbGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SmF2YVZpc2liaWxpdHkoSmF2YVZpc2liaWxpdHlLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRyYW5zaWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHJhbnNpZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zaWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHJhbnNpZW50KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRGaWVsZF9UcmFuc2llbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzVHJhbnNpZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1RyYW5zaWVudCA8ZW0+VHJhbnNpZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2llbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzVHJhbnNpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUcmFuc2llbnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Wb2xhdGlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Vm9sYXRpbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Vm9sYXRpbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZvbGF0aWxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRGaWVsZF9Wb2xhdGlsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNWb2xhdGlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNWb2xhdGlsZSA8ZW0+Vm9sYXRpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZvbGF0aWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1ZvbGF0aWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWb2xhdGlsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEphdmFDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNnZXRKYXZhQ2xhc3MgPGVtPkphdmEgQ2xhc3M8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIENsYXNzPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEluaXRpYWxpemVyIHJlZmVyZW5jZQotCSAqLwotCUJsb2NrIGdldEluaXRpYWxpemVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNnZXRJbml0aWFsaXplciA8ZW0+SW5pdGlhbGl6ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWxpemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbml0aWFsaXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5pdGlhbGl6ZXIoQmxvY2sgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogR2V0IHRoZSBjbGFzcyB0aGF0IHRoaXMgZmllbGQgaXMgd2l0aGluLgotCSAqLwotCUphdmFDbGFzcyBnZXRDb250YWluaW5nSmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBJcyB0aGlzIGZpZWxkIGFuIGFycmF5IHR5cGUuCi0JICovCi0JYm9vbGVhbiBpc0FycmF5KCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0luaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGIyZmU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5ubHMuUmVzb3VyY2VIYW5kbGVyOwotCi0vKioKLSAqIEBhdXRob3IgREFCRVJHCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIzODU2OTA4NDc0Mjc4OTc2NTZMOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNU0dfUEFUVEVSTiA9IFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkphdmFfSW5oX0N5Y2xlX0VSUk9SXyIpOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uKEphdmFDbGFzcyBhU3ViY2xhc3MsIEphdmFDbGFzcyBhU3VwZXJjbGFzcykgewotCQl0aGlzKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KE1TR19QQVRURVJOLCBuZXcgT2JqZWN0W117YVN1YmNsYXNzLmdldFF1YWxpZmllZE5hbWUoKSwgYVN1cGVyY2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpfSkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0luaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0luaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZTg4OTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9Jbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluaXRpYWxpemVyIGV4dGVuZHMgRU9iamVjdHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc1N0YXRpYyBhdHRyaWJ1dGUKLQkgKi8KLQlCb29sZWFuIGdldElzU3RhdGljKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgSXNTdGF0aWMgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRJc1N0YXRpYyhCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEphdmFDbGFzcyByZWZlcmVuY2UKLQkgKi8KLQlKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5Jbml0aWFsaXplciNnZXRKYXZhQ2xhc3MgPGVtPkphdmEgQ2xhc3M8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIENsYXNzPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIFNvdXJjZSByZWZlcmVuY2UKLQkgKi8KLQlCbG9jayBnZXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkluaXRpYWxpemVyI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2U8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U291cmNlKEJsb2NrIHZhbHVlKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUNsYXNzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzI3YWQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEBleHRlbmRzIEphdmFIZWxwZXJzCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzUHVibGljIDxlbT5QdWJsaWM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEltcGxlbWVudHNJbnRlcmZhY2VzIDxlbT5JbXBsZW1lbnRzIEludGVyZmFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRDbGFzc0ltcG9ydCA8ZW0+Q2xhc3MgSW1wb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0UGFja2FnZUltcG9ydHMgPGVtPlBhY2thZ2UgSW1wb3J0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEZpZWxkcyA8ZW0+RmllbGRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0TWV0aG9kcyA8ZW0+TWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEluaXRpYWxpemVycyA8ZW0+SW5pdGlhbGl6ZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0RGVjbGFyZWRDbGFzc2VzIDxlbT5EZWNsYXJlZCBDbGFzc2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0RGVjbGFyaW5nQ2xhc3MgPGVtPkRlY2xhcmluZyBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEphdmFQYWNrYWdlIDxlbT5KYXZhIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRFdmVudHMgPGVtPkV2ZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEFsbEV2ZW50cyA8ZW0+QWxsIEV2ZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0SmF2YUNsYXNzKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFDbGFzcyBleHRlbmRzIEVDbGFzcywgSmF2YUhlbHBlcnN7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX01FVEhPRF9OQU1FID0gIioiOwotCS8qKgotCSAqIFJldHVybiBhIG1ldGhvZCBtYXRjaGluZyB0aGUgbmFtZSwgYW5kIG5vbi1yZXR1cm4gcGFyYW1ldGVycyB3aXRoIGZ1bGx5IHF1YWxpZmllZCB0eXBlcyBtYXRjaGluZyBhbGwgdGhlIHR5cGVzIGluIHRoZSBsaXN0LCBpZiBpdCBleGlzdHMuICBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0UHVibGljTWV0aG9kRXh0ZW5kZWQoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpIDsKLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvbiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLCBoYXZpbmcgYSBuYW1lIGVxdWFsIHRvIHRoYXQgb2YgdGhlIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWROYW1lZChTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyBvdXIgRmllbGRzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIGZpZWxkcy4KLQkgKiBUaGUgZmllbGQgcmVsYXRpb25zaGlwIGlzIGRlcml2ZWQgZnJvbSBjb250ZW50cy4KLQkgKi8gIAotCXB1YmxpYyBGaWVsZFtdIGxpc3RGaWVsZEV4dGVuZGVkKCk7Ci0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGxpc3Rpbmcgb3VyIE1ldGhvZHMsIGluY2x1ZGluZyBpbmhlcml0ZWQgbWV0aG9kcy4KLQkgKiBUaGUgbWV0aG9kIHJlbGF0aW9uc2hpcCBpcyBkZXJpdmVkIGZyb20gY29udGVudHMuCi0JICovICAKLQlwdWJsaWMgTWV0aG9kW10gbGlzdE1ldGhvZEV4dGVuZGVkKCk7Ci0vL0ZCICAgLyoqCi0vL0ZCICAgICogVGhpcyBpcyByZXF1aXJlZCBmb3IgaW50ZXJuYWwgcmVmbGVjdGlvbi4gRG8gbm90IHVzZS4KLS8vRkIgICAgKi8KLS8vRkIgICBPYmplY3QgcHJpbVJlZlZhbHVlKEVPYmplY3QgZmVhdHVyZSk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIEtpbmQgYXR0cmlidXRlCi0JICovCi0JVHlwZUtpbmQgZ2V0S2luZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuVHlwZUtpbmQKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRLaW5kKFR5cGVLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc1B1YmxpYyBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzUHVibGljKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNQdWJsaWMgPGVtPlB1YmxpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGljPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1B1YmxpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVibGljKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzRmluYWwgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc0ZpbmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5hbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgSW1wbGVtZW50c0ludGVyZmFjZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIENsYXNzSW1wb3J0IHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRDbGFzc0ltcG9ydCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBQYWNrYWdlSW1wb3J0cyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0UGFja2FnZUltcG9ydHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRmllbGRzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXRGaWVsZHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgTWV0aG9kcyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TWV0aG9kcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBJbml0aWFsaXplcnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEluaXRpYWxpemVycygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgRGVjbGFyaW5nQ2xhc3MgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldERlY2xhcmluZ0NsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjZ2V0RGVjbGFyaW5nQ2xhc3MgPGVtPkRlY2xhcmluZyBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVjbGFyaW5nIENsYXNzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREZWNsYXJpbmdDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVjbGFyaW5nQ2xhc3MoSmF2YUNsYXNzIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgRGVjbGFyZWRDbGFzc2VzIHJlZmVyZW5jZXMKLQkgKi8KLQlFTGlzdCBnZXREZWNsYXJlZENsYXNzZXMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIEphdmFQYWNrYWdlIHJlZmVyZW5jZQotCSAqLwotCUphdmFQYWNrYWdlIGdldEphdmFQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEV2ZW50cyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0RXZlbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGwgRXZlbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUV2ZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFsbCBFdmVudHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgRXZlbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0SmF2YUNsYXNzX0FsbEV2ZW50cygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFFdmVudCIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QWxsRXZlbnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlib29sZWFuIGlzTmVzdGVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JRmllbGQgZ2V0RmllbGQoU3RyaW5nIGZpZWxkTmFtZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiAgUmV0dXJuIGFuIEZpZWxkIHdpdGggdGhlIHBhc3NlZCBuYW1lIGZyb20gdGhpcyBKYXZhQ2xhc3Mgb3IgYW55IHN1cGVydHlwZXMuCi0JICogCi0JICogUmV0dXJuIG51bGwgaWYgYSBGaWVsZCBuYW1lZCBmaWVsZE5hbWUgaXMgbm90IGZvdW5kLgotCSAqLwotCUZpZWxkIGdldEZpZWxkRXh0ZW5kZWQoU3RyaW5nIGZpZWxkTmFtZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JRmllbGQgZ2V0RmllbGROYW1lZChTdHJpbmcgZmllbGROYW1lKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhbGwgZmllbGRzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLgotCSAqLwotCUxpc3QgZ2V0RmllbGRzRXh0ZW5kZWQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEdldCB0aGUgbWV0aG9kIG9mIHRoaXMgbmFtZSBhbmQgdGhlc2UgcGFyYW1ldGVycy4gSXQgd2lsbCBub3QgbG9vayB1cCB0aGUKLQkgKiBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCU1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIGEgTGlzdCBvZiBTdHJpbmdzIHRoYXQgcmVwcmVzZW50IE1ldGhvZEVsZW1lbnQgc2lnbmF0dXJlcyBmcm9tIG1vc3QKLQkgKiBnZW5lcmFsIHRvIG1vc3Qgc3BlY2lmaWMuCi0JICovCi0JTGlzdCBnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIGxvb2sgdXAgdGhlIHN1cGVydHlwZSAKLQkgKiBoaWVyYXJjaHkuCi0JICovCi0JTWV0aG9kIGdldE1ldGhvZEV4dGVuZGVkKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhbGwgbWV0aG9kcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4KLQkgKi8KLQlMaXN0IGdldE1ldGhvZHNFeHRlbmRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzIGV4Y2x1ZGluZyBwYXJ0aWN1bGFyIGNsYXNzZXMgYW5kIG1ldGhvZHMuCi0JICogQHBhcmFtIGV4Y2x1ZGVkQ2xhc3NlcyAtIEEgbGlzdCBvZiBKYXZhQ2xhc3MgaW5zdGFuY2VzIHRvIGJlIGlnbm9yZWQuCi0JICogQHBhcmFtIGV4Y2x1ZGVkTWV0aG9kcyAtIEEgbGlzdCBvZiBNZXRob2QgaW5zdGFuY2VzIHRvIGJlIGlnbm9yZWQuCi0JICovCi0JTGlzdCBnZXRNZXRob2RzRXh0ZW5kZWRXaXRoRmlsdGVycyhMaXN0IGV4Y2x1ZGVkQ2xhc3NlcywgTGlzdCBleGNsdWRlZE1ldGhvZHMpIDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhIExpc3Qgb2YgTWV0aG9kcyB0aGF0IGJlZ2lucyB3aXRoIEBhTWV0aG9kTmFtZVByZWZpeCBhbmQgaXMgbm90Ci0JICogaW5jbHVkZWQgaW4gdGhlIEBleGNsdWRlZE5hbWVzIGxpc3QuIElmIEBhTWV0aG9kTmFtZVByZWZpeCBpcyBudWxsLCBhbGwgbWV0aG9kcyAKLQkgKiB3aWxsIGJlIHJldHVybmVkLgotCi0JICovCi0JTGlzdCBnZXRPbmx5U3BlY2lmaWNNZXRob2RzKFN0cmluZyBhTWV0aG9kTmFtZVByZWZpeCwgTGlzdCBleGNsdWRlZE5hbWVzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhIG1ldGhvZCBtYXRjaGluZyB0aGUgbmFtZSwgYW5kIG5vbi1yZXR1cm4gcGFyYW1ldGVycyB3aXRoIGZ1bGx5Ci0JICogcXVhbGlmaWVkIHR5cGVzIG1hdGNoaW5nIGFsbCB0aGUgdHlwZXMgaW4gdGhlIGxpc3QsIGlmIGl0IGV4aXN0cy4gIEl0IHdpbGwgbm90Ci0JICogbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlNZXRob2QgZ2V0UHVibGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhbGwgbWV0aG9kcywgaXQgd2lsbCBub3QgZ28gdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JTGlzdCBnZXRQdWJsaWNNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYWxsIHB1YmxpYyBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLgotCSAqLwotCUxpc3QgZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvbiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLCBoYXZpbmcgYSBuYW1lIGVxdWFsIHRvCi0JICogdGhhdCBvZiB0aGUgcGFyYW1ldGVyLgotCSAqLwotCUxpc3QgZ2V0UHVibGljTWV0aG9kc05hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCUphdmFDbGFzcyBnZXRTdXBlcnR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFRlc3Qgd2hldGhlciB0aGUgcmVjZWl2ZXIgaW1wbGVtZW50cyB0aGUgcGFzc2VkIGludGVyZmFjZSAob3Igb25lIG9mIGl0cwotCSAqIHN1cGVydHlwZXMpLgotCSAqLwotCWJvb2xlYW4gaW1wbGVtZW50c0ludGVyZmFjZShKYXZhQ2xhc3MgaW50ZXJmYWNlVHlwZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYSBzdHJpbmcgc2hvd2luZyBvdXIgZGV0YWlscy4KLQkgKi8KLQlTdHJpbmcgaW5mb1N0cmluZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogVGVzdHMgd2hldGhlciB0aGlzIGNsYXNzIGluaGVyaXRzIGZyb20gdGhlIHBhc3NlZCBpbiBjbGFzcy4KLQkgKi8KLQlib29sZWFuIGluaGVyaXRzRnJvbShKYXZhQ2xhc3MgamF2YUNsYXNzKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIERvZXMgdGhpcyB0eXBlIGV4aXN0LgotCSAqLwotCWJvb2xlYW4gaXNFeGlzdGluZ1R5cGUoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElzIHRoaXMgYW4gaW50ZXJmYWNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAbW9kZWwga2luZD0ib3BlcmF0aW9uIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgYm9vbGVhbiBpc0ludGVyZmFjZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogU2V0IHRoZSBzdXBlcnR5cGUuCi0JICovCi0Jdm9pZCBzZXRTdXBlcnR5cGUoSmF2YUNsYXNzIGphdmFjbGFzcykgdGhyb3dzIEluaGVyaXRhbmNlQ3ljbGVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGFzc2VkIEphdmFDbGFzcyBjYW4gYmUgc2V0IGFzIHRoZSBzdXBlcnR5cGUKLQkgKiBvZiB0aGlzIEphdmFDbGFzcy4gIFRoaXMgbWV0aG9kIHdpbGwgdGVzdCB0byBzZWUgaWYgYUphdmFDbGFzcyB3aWxsCi0JICogY3JlYXRlIGEgY3ljbGUgaW4gdGhlIGluaGVyaXRhbmNlIHN0cnVjdHVyZS4gIFJldHVybiB0cnVlIGlmIG5vCi0JICogaW5oZXJpdGFuY2UgY3ljbGUgd2lsbCBiZSBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRTdXBlcnR5cGUoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIDsKLQotCS8qKgotCSAqIEdldCB0aGUgRVN0cnVjdHVyYWxGZWF0dXJlcyB0aGF0IHJlcHJlc2VudCB0aGUgQmVhbkluZm8gcHJvcGVydGllcyBmb3IKLQkgKiBqdXN0IHRoaXMgSmF2YSBjbGFzcywgbm90IGluY2x1ZGluZyBpbmhlcml0ZWQuIEl0IHdpbGwgcmV0dXJuIGFueSBFU3RydWN0dXJhbEZlYXR1cmUKLQkgKiB0aGF0IHdhcyBzcGVjaWZpZWQgYXMgYmVpbmcgYXQgdGhpcyBjbGFzcyBlaXRoZXIgdGhyb3VnaCB0aGUgWE1JIG92ZXJyaWRlIGRvY3VtZW50IG9yCi0JICogdGhyb3VnaCB0aGUgQmVhbkluZm8uIFN0cnVjdHVyYWwgZmVhdHVyZXMgdGhyb3VnaCB0aGUgWE1JIG1heSBub3QgYmUgYmVhbiBwcm9wZXJ0aWVzLAotCSAqIGJ1dCB0aGV5IGFyZSBwYXJ0IG9mIHRoZSBmZWF0dXJlcyBhdmFpbGFibGUgYXQgdGhpcyBjbGFzcyBvbmx5LiAKLQkgKiAKLQkgKiBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgZ2V0RUF0dHJpYnV0ZXMoKSBhbmQgZ2V0RVJlZmVyZW5jZXMoKS4KLQkgKiAKLQkgKiBUbyByZXRyaWV2ZSBvbmx5IHRoZSBCZWFuIFByb3BlcnRpZXMsIHRoZW4gdXNlIEJlYW5pbmZvIAotCSAqIFV0aWxpdGllcy5nZXRQcm9wZXJ0aWVzSXRlcmF0b3IoamF2YWNsYXNzLmdldFByb3BlcnRpZXMoKSkgYW5kIHRoaXMgd2lsbCBpdGVyYXRlIG92ZXIKLQkgKiB0aGUgQmVhbiBQcm9wZXJ0eURlY29yYXRvcnMsIGFuZCBmaWx0ZXIgb3V0IHRoZSBub24tYmVhbiBmZWF0dXJlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHByb3BlcnRpZXMgKGFzIEVTdHJ1Y3R1cmFsRmVhdHVyZSdzKSBmb3IgdGhpcyBqYXZhIGNsYXNzLiBUaGlzIGxpc3QgaXMKLQkgKiBub3QgbW9kaWZpYWJsZS4KLQkgKi8KLQlFTGlzdCBnZXRQcm9wZXJ0aWVzKCk7Ci0JCi0JLyoqCi0JICogR2V0IGFsbCBvZiB0aGUgRVN0cnVjdHVyYWxGZWF0dXJlcyB0aGF0IHJlcHJlc2VudCB0aGUgQmVhbkluZm8gcHJvcGVydGllcyBmb3IKLQkgKiBqdXN0IHRoaXMgSmF2YSBjbGFzcywgaW5jbHVkaW5nIGluaGVyaXRlZC4gSXQgd2lsbCByZXR1cm4gYW55IEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIHRoYXQgd2FzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBYTUkgb3ZlcnJpZGUgZG9jdW1lbnQgb3IKLQkgKiB0aHJvdWdoIHRoZSBCZWFuSW5mby4gU3RydWN0dXJhbCBmZWF0dXJlcyB0aHJvdWdoIHRoZSBYTUkgbWF5IG5vdCBiZSBiZWFuIHByb3BlcnRpZXMsCi0JICogYnV0IHRoZXkgYXJlIHBhcnQgb2YgdGhlIGZlYXR1cmVzIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBUaGUgaXMgbGlrZSBnZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkgZXhjZXB0IHRoYXQgaWYgQmVhbkluZm8gaGlkZXMgYW55IGJlYW4gcHJvcGVydGllcwotCSAqIGZyb20gdGhlIHN1cGVyIGNsYXNzLCB0aGlzIGxpc3Qgd2lsbCBhbHNvIGhpZGUgdGhlbSwgd2hpbGUgZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcwotCSAqIHdpbGwgbm90LgotCSAqIAotCSAqIFRvIHJldHJpZXZlIG9ubHkgdGhlIEJlYW4gUHJvcGVydGllcywgdGhlbiB1c2UgQmVhbmluZm8gCi0JICogVXRpbGl0aWVzLmdldFByb3BlcnRpZXNJdGVyYXRvcihqYXZhY2xhc3MuZ2V0QWxsUHJvcGVydGllcygpKSBhbmQgdGhpcyB3aWxsIGl0ZXJhdGUgb3ZlcgotCSAqIHRoZSBCZWFuIFByb3BlcnR5RGVjb3JhdG9ycywgYW5kIGZpbHRlciBvdXQgdGhlIG5vbi1iZWFuIGZlYXR1cmVzLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgYWxsIHByb3BlcnRpZXMsIGluY2x1ZGluZyBpbmhlcml0ZWQsIChhcyBFU3RydWN0dXJhbEZlYXR1cmUncykgZm9yIHRoaXMgY2xhc3MuIFRoaXMgbGlzdCBpcwotCSAqIG5vdCBtb2RpZmlhYmxlLgotCSAqLwotCUVMaXN0IGdldEFsbFByb3BlcnRpZXMoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZmxlY3Rpb24gdHlwZSwgaWYgaXQgZXhpc3RzLCBmb3IgdGhpcyBjbGFzcy4gSWYgcnVubmluZyB3aXRoaW4gRWNsaXBzZSB0aGlzCi0JICogd2lsbCBiZSBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGV9LCBvciBydW5uaW5nIG91dHNpZGUgb2YgRWNsaXBzZSBpdCB3aWxsIGJlIGEge0BsaW5rIGphdmEubGFuZy5DbGFzc30uCi0JICogCi0JICogQHJldHVybiBJVHlwZSBpZiBpbiBFY2xpcHNlLCBDbGFzcyBpZiBvdXRzaWRlIEVjbGlwc2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHR5cGUgbm90IGZvdW5kLgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCU9iamVjdCBnZXRSZWZsZWN0aW9uVHlwZSgpOwotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhRGF0YVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YURhdGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YzBiNWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhRGF0YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQGV4dGVuZHMgSmF2YUhlbHBlcnMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldEphdmFEYXRhVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRGF0YVR5cGUgZXh0ZW5kcyBFQ2xhc3MsIEphdmFIZWxwZXJzewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByaW1pdGl2ZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1ZTk1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBFdmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRKYXZhRXZlbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFFdmVudCBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZXsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUhlbHBlcnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YUhlbHBlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IyZmYxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFIZWxwZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDYvMjcvMjAwMCA0OjQyOjA0IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFIZWxwZXJzIGV4dGVuZHMgRUNsYXNzIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0xFQU5fTkFNRSA9ICJqYXZhLmxhbmcuQm9vbGVhbiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJBQ1RFUl9OQU1FID0gImphdmEubGFuZy5DaGFyYWN0ZXIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBCWVRFX05BTUUgPSAiamF2YS5sYW5nLkJ5dGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfTkFNRSA9ICJqYXZhLmxhbmcuRG91YmxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRkxPQVRfTkFNRSA9ICJqYXZhLmxhbmcuRmxvYXQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFR0VSX05BTUUgPSAiamF2YS5sYW5nLkludGVnZXIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX05BTUUgPSAiamF2YS5sYW5nLkxvbmciOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBTSE9SVF9OQU1FID0gImphdmEubGFuZy5TaG9ydCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1fQk9PTEVBTl9OQU1FID0gImJvb2xlYW4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0NIQVJBQ1RFUl9OQU1FID0gImNoYXIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0JZVEVfTkFNRSA9ICJieXRlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9ET1VCTEVfTkFNRSA9ICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0ZMT0FUX05BTUUgPSAiZmxvYXQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0lOVEVHRVJfTkFNRSA9ICJpbnQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUklNX0xPTkdfTkFNRSA9ICJsb25nIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTV9TSE9SVF9OQU1FID0gInNob3J0IjsgLy8kTk9OLU5MUy0xJAotCQotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9OT1RfSUQgPSAwOwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9CT09MRUFOX0lEID0gMTsKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fQ0hBUkFDVEVSX0lEID0gMjsKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fQllURV9JRCA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBQUklNX0RPVUJMRV9JRCA9IDQ7Ci0Jc3RhdGljIGZpbmFsIGludCBQUklNX0ZMT0FUX0lEID0gNTsKLQlzdGF0aWMgZmluYWwgaW50IFBSSU1fSU5URUdFUl9JRCA9IDY7Ci0Jc3RhdGljIGZpbmFsIGludCBQUklNX0xPTkdfSUQgPSA3OwotCXN0YXRpYyBmaW5hbCBpbnQgUFJJTV9TSE9SVF9JRCA9IDg7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBxdWFsaWZpZWQgbmFtZSAod2l0aCB1c2luZyAnLicgZm9yIGlubmVyIGNsYXNzZXMpLiBXaWxsIHJldHVybiB0aGUgbmFtZSBpZiBwcmltaXRpdmUgdG9vIChlLmcuICJib29sZWFuIikKLQkgKiBOb3RlOiBUaGlzIHNob3VsZCBvZiBiZWVuIGdldCB0aGUgc2ltcGxlIG5hbWUgYW5kIG5vdCB0aGUgcXVhbGlmZWQgbmFtZSwgYnV0IGl0IGlzIHRvbyBsYXRlIGFuZCBoYXMgYmVlbiBlc3RhYmxpc2hlZAotCSAqIGFzIHRoZSBBUEkuIFVzZSA8Y29kZT5nZXRTaW1wbGVOYW1lKCk8L2NvZGU+IGluc3RlYWQgaWYgeW91IHdhbnQgdGhlIG5hbWUgbm90IHF1YWxpZmllZC4KLQkgKiBAcmV0dXJuIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdHlwZS4KLQkgKiBAc2VlIEphdmFIZWxwZXJzI2dldFNpbXBsZU5hbWUoKQotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YU5hbWUoKTsKLQkvKioKLQkgKiBHZXQgdGhlIHNpbXBsZSBuYW1lLiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmltaXRpdmUsIG9yIGlmIGEgY2xhc3MsIHRoZSBuYW1lIHdpdGhvdXQgdGhlIHBhY2thZ2UuIEFuZCBpZiBpdCBpcyBhbgotCSAqIGlubmVyIGNsYXNzLCBpdCB3aWxsIHVzZSAnLicgaW5zdGVhZCBvZiAnJCcuIElmIHlvdSB3YW50IHRoZSBzaW1wbGUgbmFtZSBmb3IgcmVmbGVjdGlvbiAoaS5lLiB3aXRoICckJykgdXNlIDxjb2RlPmdldE5hbWUoKTwvY29kZT4uCi0JICogQHJldHVybiB0aGUgc2ltcGxlIG5hbWUgKG5vIHBhY2thZ2UpIG9mIHRoZSB0eXBlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpOwotCi0JLyoqCi0JICogR2V0IHRoZSBwcmltaXRpdmUgdHlwZSB0aGF0IHRoaXMgaGVscGVyIHdyYXBwZXJzIG9yIGlzIChlLmcuICJqYXZhLmxhbmcuSW50ZWdlciIgYW5kICJpbnQiIHR5cGVzIHJldHVybiAiaW50IiB0eXBlKS4gSWYgbm90IGEgcHJpbWl0aXZlCi0JICogb3IgYSB3cmFwcGVyIGZvciBhIHByaW1pdGl2ZSwgdGhlbiByZXR1cm4gbnVsbC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEphdmFEYXRhVHlwZSBnZXRQcmltaXRpdmUoKTsKLQkKLQkvKioKLQkgKiBHZXQgdGhlIHByaW1pdGl2ZSBpZCB0aGF0IHRoaXMgaGVscGVyIHdyYXBwZXJzIG9yIGlzIChlLmcuICJqYXZhLmxhbmcuSW50ZWdlciIgYW5kICJpbnQiIHdpbGwgcmV0dXJuIHtAbGluayBKYXZhSGVscGVycyNQUklNX0lOVEVHRVJfSUR9KS4gSWYKLQkgKiBub3QgYSB3cmFwcGVyIGZvciBhIHByaW1pdGl2ZSB0aGVuIHJldHVybiB7QGxpbmsgSmF2YUhlbHBlcnMjUFJJTV9OT1RfSUR9LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByaW1pdGl2ZUlEKCk7Ci0JLyoqCi0JICogVG8gYmUgdXNlZCBieSBwZW9wbGUgdGhhdCBuZWVkIHRvIGdldCB0aGUgcXVhbGlmaWVkIG5hbWUuIFRoaXMgd291bGQgdXNlICcuJyBmb3IgaW5uZXIgY2xhc3NlcwotCSAqIGFuZCBpbmNsdWRlIHRoZSBwYWNrYWdlIG5hbWUuCi0JICogQHJldHVybiB0aGUgcXVhbGlmaWVkIG5hbWUsIGluY2x1ZGluZyBwYWNrYWdlLgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwkKLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKTsKLQlwdWJsaWMgSmF2YUNsYXNzIGdldFdyYXBwZXIoKTsKLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCk7Ci0JLyoqCi0JICogQ2FuIGFuIG9iamVjdCBvZiB0aGUgcGFzc2VkIGluIGNsYXNzIGJlIGFzc2lnbmVkIHRvIGFuCi0JICogb2JqZWN0IG9mIHRoaXMgY2xhc3M/IEluIG90aGVyIHdvcmRzIGlzIHRoaXMgY2xhc3MgYQotCSAqIHN1cGVydHlwZSBvZiB0aGUgcGFzc2VkIGluIGNsYXNzLCBvciBpcyBpdCBzdXBlcmludGVyZmFjZQotCSAqIG9mIGl0PyBPciBpbiB0aGUgY2FzZSBvZiBwcmltaXRpdmVzLCBhcmUgdGhleSB0aGUgc2FtZS4gCi0JICogQHBhcmFtIGFDbGFzcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXNzaWduYWJsZSBmcm9tIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKEVDbGFzc2lmaWVyIGFDbGFzcyk7Ci0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKTsKLQotCS8qKgotCSAqIFRvIGJlIHVzZWQgYnkgcGVvcGxlIHRoYXQgbmVlZCB0byBnZXQgdGhlIHF1YWxpZmllZCBuYW1lIHVzZWQgZm9yIHJlZmxlY3Rpb24uIFRoaXMgd291bGQgdXNlICckJyBpbnN0ZWFkIG9mICcuJyBmb3IgaW5uZXIgY2xhc3NlcwotCSAqIGFuZCBpbmNsdWRlIHRoZSBwYWNrYWdlIG5hbWUuCi0JICogVHlwaWNhbGx5IGJlYW4gaW5mbyB3b3VsZCBuZWVkIHRvIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzLgotCSAqIEByZXR1cm4gdGhlIHF1YWxpZmllZCBuYW1lLCB1c2UgJyQnIGZvciBpbm5lciBjbGFzc2VzCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpIDsJCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2MzNzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLS8qCi0KLQotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2V7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9JRCA9ICIqcGFja2FnZSI7CS8vIFRoZSBpZCAodGhlIHBhcnQgdGhhdCBnb2VzIGFmdGVyIHRoZSAnIycgZm9yIGEgamF2YSBwYWNrYWdlLikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkvLyBUaGVyZSB3aWxsIG9ubHkgYmUgb25lIHBhY2thZ2UgcGVyIGphdmEgcmVzb3VyY2Ugc28gaXQKLQkJCQkJCQkJCQkJCQkJLy8gY2FuIGJlIHVuaXF1ZS4gTm8gamF2YSB0eXBlcywgbWV0aG9kcywgZmllbGRzIGlkcyBjYW4KLQkJCQkJCQkJCQkJCQkJLy8gc3RhcnQgd2l0aCBhbiBhc3RlcmljayBzbyB3aWxsIGJlIHVuaXF1ZS4KLQkJCQkJCQkJCQkJCQkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUlUSVZFX1BBQ0tBR0VfTkFNRSA9ICJfLWphdmFwcmltIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgSmF2YUNsYXNzZXMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEphdmFDbGFzc2VzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgOwotCi19IC8vSmF2YVBhY2thZ2UKLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFQYXJhbWV0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhcmFtZXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Y0MmRjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFyYW1ldGVyOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUGFyYW1ldGVyIGV4dGVuZHMgRVBhcmFtZXRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNGaW5hbCBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzRmluYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXIjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5hbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBQYXJhbWV0ZXJLaW5kIGF0dHJpYnV0ZQotCSAqLwotCUphdmFQYXJhbWV0ZXJLaW5kIGdldFBhcmFtZXRlcktpbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXIjZ2V0UGFyYW1ldGVyS2luZCA8ZW0+UGFyYW1ldGVyIEtpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtZXRlciBLaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXJLaW5kCi0JICogQHNlZSAjZ2V0UGFyYW1ldGVyS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyYW1ldGVyS2luZChKYXZhUGFyYW1ldGVyS2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBJcyB0aGlzIHBhcmFtZXRlciB0eXBlIGFuIGFycmF5IHR5cGUuCi0JICovCi0JYm9vbGVhbiBpc0FycmF5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBJcyB0aGlzIGEgcmV0dXJuIHBhcmFtZXRlci4KLQkgKi8KLQlib29sZWFuIGlzUmV0dXJuKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlKYXZhSGVscGVycyBnZXRKYXZhVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKTsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhcmFtZXRlcktpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVBhcmFtZXRlcktpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjMjRlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFQYXJhbWV0ZXJLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLQotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkphdmEgUGFyYW1ldGVyIEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogSU49MAotICogT1VUPTEKLSAqIElOT1VUPTIKLSAqIFJFVFVSTj0zCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlI2dldEphdmFQYXJhbWV0ZXJLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YVBhcmFtZXRlcktpbmQgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBzZWUgI0lOX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTiA9IDA7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjT1VUX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVQgPSAxOwotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOT1VUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjSU5PVVRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOT1VUID0gMjsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVRVUk48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAc2VlICNSRVRVUk5fTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFVFVSTiA9IDM7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjSU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhUGFyYW1ldGVyS2luZCBJTl9MSVRFUkFMID0gbmV3IEphdmFQYXJhbWV0ZXJLaW5kKElOLCAiSU4iLCAiSU4iKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjT1VUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVBhcmFtZXRlcktpbmQgT1VUX0xJVEVSQUwgPSBuZXcgSmF2YVBhcmFtZXRlcktpbmQoT1VULCAiT1VUIiwgIk9VVCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8cD4KLSAgICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTk9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjSU5PVVQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhUGFyYW1ldGVyS2luZCBJTk9VVF9MSVRFUkFMID0gbmV3IEphdmFQYXJhbWV0ZXJLaW5kKElOT1VULCAiSU5PVVQiLCAiSU5PVVQiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFVFVSTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJFVFVSTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQHNlZSAjUkVUVVJOCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVBhcmFtZXRlcktpbmQgUkVUVVJOX0xJVEVSQUwgPSBuZXcgSmF2YVBhcmFtZXRlcktpbmQoUkVUVVJOLCAiUkVUVVJOIiwgIlJFVFVSTiIpOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkphdmEgUGFyYW1ldGVyIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IAotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4gCi0JICogQGdlbmVyYXRlZAotCSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhUGFyYW1ldGVyS2luZFtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBKYXZhUGFyYW1ldGVyS2luZFtdIHsKLQkJCUlOX0xJVEVSQUwsCi0JCQlPVVRfTElURVJBTCwKLQkJCUlOT1VUX0xJVEVSQUwsCi0JCQlSRVRVUk5fTElURVJBTCwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5KYXZhIFBhcmFtZXRlciBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SmF2YSBQYXJhbWV0ZXIgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiAKLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+IAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBKYXZhUGFyYW1ldGVyS2luZCBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUphdmFQYXJhbWV0ZXJLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SmF2YSBQYXJhbWV0ZXIgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFQYXJhbWV0ZXJLaW5kIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJSmF2YVBhcmFtZXRlcktpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkphdmEgUGFyYW1ldGVyIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gCi0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgSmF2YVBhcmFtZXRlcktpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIElOOiByZXR1cm4gSU5fTElURVJBTDsKLQkJCWNhc2UgT1VUOiByZXR1cm4gT1VUX0xJVEVSQUw7Ci0JCQljYXNlIElOT1VUOiByZXR1cm4gSU5PVVRfTElURVJBTDsKLQkJCWNhc2UgUkVUVVJOOiByZXR1cm4gUkVUVVJOX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEphdmFQYXJhbWV0ZXJLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9KYXZhUGFyYW1ldGVyS2luZAotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVJlZkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVJlZkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2MWIzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFSZWZGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlZkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUphdmFSZWZGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZkZhY3RvcnlJbXBsLmluaXQoKTsKLQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJveHkgcmVmZXJlbmNlIHRvIHRoZSBjbGFzcyBuYW1lLgotCSAqIEBwYXJhbSB0YXJnZXROYW1lIENsYXNzbmFtZSB0byBjcmVhdGUgYSBwcm94eSByZWZlcmVuY2UgdG8uIFRoaXMgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuCi0JICogQHJldHVybiBBIHByb3h5IHJlZmVyZW5jZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgY3JlYXRlQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpOwotCQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgamF2YSB0eXBlIChjbGFzcyBvciBwcmltaXRpdmUpIGZvciBhIGdpdmVuIHF1YWxpZmllZCBuYW1lLgotCSAqIDxwPklmIHRoZSBwYWNrYWdlIG9yIHR5cGUgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaAotCSAqIHRoZSByZWZsZWN0aW9uIG1lY2hhbmlzbS4KLQkgKiA8cD5Mb29rdXAgdGhlIEphdmFDbGFzcyBpbiB0aGUgY29udGV4dCBvZiB0aGUgcGFzc2VkIG9iamVjdCwgaGFuZGxpbmcgc29tZSBlcnJvciBjYXNlcy4KLQkgKiBAcGFyYW0gYVF1YWxpZmllZE5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgY2xhc3Mgb3IgcHJpbWl0aXZlIChlLmcuIDxjb2RlPmphdmEubGFuZy5PYmplY3Q8L2NvZGU+IG9yIDxjb2RlPmludDwvY29kZT4KLQkgKiBAcGFyYW0gcmVsYXRlZE9iamVjdCBFT2JqZWN0IHRoYXQgaXQgd2lsbCBiZSByZWxhdGVkIHRvbyAoaXQgd2lsbCBsb29rIHRocm91Z2ggdGhlIHJlc291cmNlIHNldCdzIHByb2plY3Qgb2YgdGhlIEVPYmplY3QpCi0JICogQHJldHVybiBUaGUgdHlwZS4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbmFtZSBpcyBub3Qgb2YgY29ycmVjdCBmb3JtYXQsIHJlbGF0ZWRPYmplY3QgaXMgbm90IGNvbnRhaW5lZCBieSBhIHJlc291cmNlIHNldCwgb3IgcmVzb3VyY2Ugc2V0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBwcm9qZWN0LgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyByZWZsZWN0VHlwZShTdHJpbmcgYVF1YWxpZmllZE5hbWUsIEVPYmplY3QgcmVsYXRlZE9iamVjdCk7Ci0JCi0JCi0JLyoqCi0JICogcmVmbGVjdCAtIHJlZmxlY3QgYSBqYXZhIHR5cGUgKGNsYXNzIG9yIHByaW1pdGl2ZSkgZm9yIGEgZ2l2ZW4gcXVhbGlmaWVkIG5hbWUuCi0JICogPHA+SWYgdGhlIHBhY2thZ2Ugb3IgY2xhc3MgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaAotCSAqIHRoZSByZWZsZWN0aW9uIG1lY2hhbmlzbS4KLQkgKiBAcGFyYW0gYVF1YWxpZmllZE5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgY2xhc3Mgb3IgcHJpbWl0aXZlIChlLmcuIDxjb2RlPmphdmEubGFuZy5PYmplY3Q8L2NvZGU+IG9yIDxjb2RlPmludDwvY29kZT4uIAotCSAqIEBwYXJhbSBzZXQgUmVzb3VyY2Ugc2V0IHRvIHVzZS4gSXRzIHByb2plY3Qgd2lsbCBiZSB1c2VkIHRvIGZpbmQgdGhlIHR5cGUuCi0JICogQHJldHVybiBUaGUgdHlwZS4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbmFtZSBpcyBub3Qgb2YgY29ycmVjdCBmb3JtYXQsIG9yIHJlc291cmNlIHNldCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgcmVmbGVjdFR5cGUoU3RyaW5nIGFRdWFsaWZpZWROYW1lLCBSZXNvdXJjZVNldCBzZXQpOwkKLQkKLQkKLQkvKioKLQkgKiByZWZsZWN0IC0gcmVmbGVjdCBhIHR5cGUgZm9yIGEgZ2l2ZW4gcGFja2FnZSBuYW1lIGFuZCBjbGFzcyBuYW1lLgotCSAqIDxwPklmIHRoZSBwYWNrYWdlIG9yIGNsYXNzIGRvZXMgbm90IGV4aXN0LCBvbmUgd2lsbCBiZSBjcmVhdGVkIHRocm91Z2gKLQkgKiB0aGUgcmVmbGVjdGlvbiBtZWNoYW5pc20uCi0JICogQHBhcmFtIGFQYWNrYWdlTmFtZSBQYWNrYWdlIG5hbWUKLQkgKiBAcGFyYW0gYVR5cGVOYW1lIFR5cGUgbmFtZSAKLQkgKiBAcGFyYW0gc2V0IFJlc291cmNlIHNldCB0byB1c2UuIEl0cyBwcm9qZWN0IHdpbGwgYmUgdXNlZCB0byBmaW5kIHRoZSB0eXBlLgotCSAqIEByZXR1cm4gVGhlIHR5cGUuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5hbWUgaXMgbm90IG9mIGNvcnJlY3QgZm9ybWF0LCBvciByZXNvdXJjZSBzZXQgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHByb2plY3QuCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIHJlZmxlY3RUeXBlKFN0cmluZyBhUGFja2FnZU5hbWUsIFN0cmluZyBhVHlwZU5hbWUsIFJlc291cmNlU2V0IHNldCk7Ci0JCi0JLyoqCi0JICogcmVmbGVjdCAtIHJlZmxlY3QgYSBKYXZhIHBhY2thZ2UgZm9yIGEgZ2l2ZW4gcGFja2FnZSBuYW1lLgotCSAqIDxwPklmIHRoZSBwYWNrYWdlIGRvZXMgbm90IGV4aXN0LCBvbmUgd2lsbCBiZSBjcmVhdGVkIHRocm91Z2gKLQkgKiB0aGUgcmVmbGVjdGlvbiBtZWNoYW5pc20uCi0JICogQHBhcmFtIHBhY2thZ2VOYW1lIE5hbWUgb2YgcGFja2FnZQotCSAqIEBwYXJhbSBzZXQgUmVzb3VyY2Ugc2V0IHRvIHVzZS4gSXRzIHByb2plY3Qgd2lsbCBiZSB1c2VkIHRvIGZpbmQgdGhlIHBhY2thZ2UuCi0JICogQHJldHVybiBUaGUgcGFja2FnZS4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbmFtZSBpcyBub3Qgb2YgY29ycmVjdCBmb3JtYXQsIG9yIHJlc291cmNlIHNldCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgSmF2YVBhY2thZ2UgcmVmbGVjdFBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBSZXNvdXJjZVNldCBzZXQpOwotCQotCS8qKgotCSAqIFRoZSBzY2hlbWUgZm9yIGEgamF2YSBVUkkuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9QUk9UT0NPTF9VUklfU0NIRU1FID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBVUkkgZm9yIGFjY2Vzc2luZyBhIHR5cGUgdGhyb3VnaCB7QGxpbmsgUmVzb3VyY2VTZXQjZ2V0RU9iamVjdChVUkksIGJvb2xlYW4pfS4KLQkgKiBAcGFyYW0gYVF1YWxpZmllZE5hbWUKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFVSSSBjcmVhdGVUeXBlVVJJKFN0cmluZyBhUXVhbGlmaWVkTmFtZSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBVUkkgZm9yIGFjY2Vzc2luZyBhIHR5cGUgdGhyb3VnaCB7QGxpbmsgUmVzb3VyY2VTZXQjZ2V0RU9iamVjdChVUkksIGJvb2xlYW4pfS4KLQkgKiBAcGFyYW0gcGFja2FnZU5hbWUgcGFja2FnZSBuYW1lIChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gb3IgPGNvZGU+IiI8L2NvZGU+IGZvciBwcmltaXRpdmVzIG9yIGRlZmF1bHQgcGFja2FnZSkKLQkgKiBAcGFyYW0gdHlwZU5hbWUgdHlwZSBuYW1lCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBVUkkgY3JlYXRlVHlwZVVSSShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB0eXBlTmFtZSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBVUkkgZm9yIGFjY2Vzc2luZyBhIHBhY2thZ2UgdGhyb3VnaCB7QGxpbmsgUmVzb3VyY2VTZXQjZ2V0RU9iamVjdChVUkksIGJvb2xlYW4pfS4KLQkgKiBAcGFyYW0gcGFja2FnZU5hbWUgcGFja2FnZSBuYW1lIChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gb3IgPGNvZGU+IiI8L2NvZGU+IGZvciBwcmltaXRpdmVzIG9yIGRlZmF1bHQgcGFja2FnZSkKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFVSSSBjcmVhdGVQYWNrYWdlVVJJKFN0cmluZyBwYWNrYWdlTmFtZSk7Ci0JCi0JLyoqCi0JICogR2V0IGp1c3QgdGhlIHR5cGUgbmFtZSB3aXRob3V0IHRoZSBwYWNrYWdlIG5hbWUuCi0JICogQHBhcmFtIHR5cGVVUkkKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG5hbWUgb3IgPGNvZGU+IiI8L2NvZGU+IGlmIG5vdCBhIHZhbGlkIHR5cGUgVVJJCi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbm90IGEgdmFsaWQgdHlwZSBVUkkKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKFVSSSB0eXBlVVJJKTsKLQkKLQkvKioKLQkgKiBHZXQganVzdCB0aGUgcGFja2FnZSBuYW1lLgotCSAqIEBwYXJhbSBqYXZhVVJJIGVpdGhlciBhIHR5cGUgb3IgYSBwYWNrYWdlIFVSSS4KLQkgKiBAcmV0dXJuIHBhY2thZ2UgbmFtZSBvciA8Y29kZT4iIjwvY29kZT4gaWYgZGVmYXVsdCBwYWNrYWdlIG9yIHByaW1pdGl2ZS4KLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBub3QgYSB2YWxpZCBwYWNrYWdlIG9yIHR5cGUgVVJJCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShVUkkgamF2YVVSSSk7Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lLgotCSAqIEBwYXJhbSB0eXBlVVJJCi0JICogQHJldHVybiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvciA8Y29kZT4iIjwvY29kZT4gaWYgbm90IGEgdmFsaWQgdHlwZSBVUkkKLQkgKiAKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBub3QgYSB2YWxpZCB0eXBlIFVSSQotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFR5cGVOYW1lKFVSSSB0eXBlVVJJKTsKLQkKLQkvKioKLQkgKiBJcyB0aGlzIGEgdmFsaWQgamF2YSB1cmkuCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0phdmFVUkkoVVJJIHVyaSk7Ci0KLQkvKioKLQkgKiBJcyB0aGlzIGEgdmFsaWQgdHlwZSB1cmkuCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1R5cGVVUkkoVVJJIHVyaSk7Ci0JCi0JLyoqCi0JICogSXMgdGhpcyBhIHZhbGlkIHBhY2thZ2UgdXJpLgotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWNrYWdlVVJJKFVSSSB1cmkpOwotCQotCS8qKgotCSAqIEByZXR1cm4gQXJyYXlUeXBlIHZhbHVlIHdpdGggYW4gYXJyYXkgb2YgdGhlIGNvbXBvbmVudCB0eXBlCi0JICovCi0JcHVibGljIEFycmF5VHlwZSBjcmVhdGVBcnJheVR5cGUoSmF2YUhlbHBlcnMgY29tcG9uZW50VHlwZSk7Ci0JLyoqCi0JICogQHJldHVybiBBcnJheVR5cGUgdmFsdWUgd2l0aCBhbiBhcnJheSBvZiB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbnMgYW5kIGZpbmFsIGNvbXBvbmVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKEphdmFIZWxwZXJzIGZpbmFsQ29tcG9uZW50VHlwZSwgaW50IGRpbWVuc2lvbnMpOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWV0aG9kIHZhbHVlCi0JICovCi0JTWV0aG9kIGNyZWF0ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhQ2xhc3MgdmFsdWUKLQkgKi8KLQlKYXZhQ2xhc3MgY3JlYXRlSmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEZpZWxkIHZhbHVlCi0JICovCi0JRmllbGQgY3JlYXRlRmllbGQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gQmxvY2sgdmFsdWUKLQkgKi8KLQlCbG9jayBjcmVhdGVCbG9jaygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb21tZW50IHZhbHVlCi0JICovCi0JQ29tbWVudCBjcmVhdGVDb21tZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFN0YXRlbWVudCB2YWx1ZQotCSAqLwotCVN0YXRlbWVudCBjcmVhdGVTdGF0ZW1lbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSW5pdGlhbGl6ZXIgdmFsdWUKLQkgKi8KLQlJbml0aWFsaXplciBjcmVhdGVJbml0aWFsaXplcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhUGFyYW1ldGVyIHZhbHVlCi0JICovCi0JSmF2YVBhcmFtZXRlciBjcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEFycmF5VHlwZSB2YWx1ZQotCSAqLwotCUFycmF5VHlwZSBjcmVhdGVBcnJheVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YURhdGFUeXBlIHZhbHVlCi0JICovCi0JSmF2YURhdGFUeXBlIGNyZWF0ZUphdmFEYXRhVHlwZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhUGFja2FnZSB2YWx1ZQotCSAqLwotCUphdmFQYWNrYWdlIGNyZWF0ZUphdmFQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlKYXZhUmVmUGFja2FnZSBnZXRKYXZhUmVmUGFja2FnZSgpOwotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFSZWZQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFSZWZQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhM2FmNGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhUmVmUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotCi0KLS8qKgotICogQGxhc3RnZW4gaW50ZXJmYWNlIEphdmFSZWZQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2Uge30KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVmUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJqYXZhIjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19JTlNUQU5DRV9DTEFTU19OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19JTlNUQU5DRV9DTEFTUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgVHlwZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fSU5TVEFOQ0VfVFlQRV9OQU1FID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfVFlQRV9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYWNrYWdlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VQQUNLQUdFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVBBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGUgUGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRVRZUEVfUEFSQU1FVEVSUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VUWVBFX1BBUkFNRVRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19BQlNUUkFDVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0lOVEVSRkFDRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOVEVSRkFDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VTVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VTVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRU9QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBTExfQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBTExfUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRVJFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRUFUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIENvbnRhaW5tZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRUFMTF9DT05UQUlOTUVOVFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX0NPTlRBSU5NRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIE9wZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBTExfT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX19FQUxMX1NVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FSUQgQXR0cmlidXRlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIGludCBKQVZBX0NMQVNTX19FSURfQVRUUklCVVRFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUlEX0FUVFJJQlVURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3RydWN0dXJhbCBGZWF0dXJlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1RSVUNUVVJBTF9GRUFUVVJFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FR2VuZXJpYyBTdXBlciBUeXBlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRUdFTkVSSUNfU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FR0VORVJJQ19TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIEdlbmVyaWMgU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0VBTExfR0VORVJJQ19TVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfR0VORVJJQ19TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19LSU5EID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGljPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fUFVCTElDID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0ZJTkFMID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19JTVBMRU1FTlRTX0lOVEVSRkFDRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19DTEFTU19JTVBPUlQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19QQUNLQUdFX0lNUE9SVFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19GSUVMRFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19NRVRIT0RTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fSU5JVElBTElaRVJTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0NMQVNTX19KQVZBX1BBQ0tBR0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9DTEFTU19fRVZFTlRTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMTI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfQ0xBU1NfX0FMTF9FVkVOVFMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SmF2YSBDbGFzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0NMQVNTX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUVMRCA9IDQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRCA9IDM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSID0gMjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEUgPSAxMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEUgPSA5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX0VWRU5UID0gMTE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRSA9IDg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEJMT0NLID0gNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09NTUVOVCA9IDY7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNUQVRFTUVOVCA9IDc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElOSVRJQUxJWkVSID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSU5JVElBTElaRVJfX0lTX1NUQVRJQyA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IElOSVRJQUxJWkVSX19KQVZBX0NMQVNTID0gMTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSU5JVElBTElaRVJfX1NPVVJDRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW5pdGlhbGl6ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU5JVElBTElaRVJfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fTkFNRSA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX09SREVSRUQgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fT1JERVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fVU5JUVVFID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19MT1dFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19MT1dFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19VUFBFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19VUFBFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX01BTlkgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19SRVFVSVJFRCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19FVFlQRSA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX19FVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FR2VuZXJpYyBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfX0VHRU5FUklDX1RZUEUgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9fRUdFTkVSSUNfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FT3BlcmF0aW9uPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFSQU1FVEVSX19FT1BFUkFUSU9OID0gRWNvcmVQYWNrYWdlLkVQQVJBTUVURVJfX0VPUEVSQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fRklOQUwgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9fUEFSQU1FVEVSX0tJTkQgPSBFY29yZVBhY2thZ2UuRVBBUkFNRVRFUl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SmF2YSBQYXJhbWV0ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQVJBTUVURVJfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FUEFSQU1FVEVSX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9fTkFNRSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19PUkRFUkVEID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX09SREVSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19VTklRVUUgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19MT1dFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19MT1dFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fVVBQRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fVVBQRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fTUFOWSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19SRVFVSVJFRCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRVRZUEUgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRVRZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUdlbmVyaWMgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRUdFTkVSSUNfVFlQRSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX19FR0VORVJJQ19UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVDb250YWluaW5nIENsYXNzPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRUNPTlRBSU5JTkdfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRUNPTlRBSU5JTkdfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGUgUGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19FVFlQRV9QQVJBTUVURVJTID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0VUWVBFX1BBUkFNRVRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRVBBUkFNRVRFUlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRVBBUkFNRVRFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUV4Y2VwdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fRUVYQ0VQVElPTlMgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9fRUVYQ0VQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUdlbmVyaWMgRXhjZXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19FR0VORVJJQ19FWENFUFRJT05TID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fX0VHRU5FUklDX0VYQ0VQVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX0FCU1RSQUNUID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmF0aXZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19OQVRJVkUgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeW5jaHJvbml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfX1NZTkNIUk9OSVpFRCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19GSU5BTCA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnN0cnVjdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX19DT05TVFJVQ1RPUiA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXRpYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9fU1RBVElDID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFkgPSBFY29yZVBhY2thZ2UuRU9QRVJBVElPTl9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgTUVUSE9EX19QQVJBTUVURVJTID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9fSkFWQV9FWENFUFRJT05TID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1FVEhPRF9fSkFWQV9DTEFTUyA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNRVRIT0RfX1NPVVJDRSA9IEVjb3JlUGFja2FnZS5FT1BFUkFUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVPUEVSQVRJT05fRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEZJRUxEX19OQU1FID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX09SREVSRUQgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfX09SREVSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX1VOSVFVRSA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX0xPV0VSX0JPVU5EID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19MT1dFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19VUFBFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fVVBQRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19NQU5ZID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX1JFUVVJUkVEID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19FVFlQRSA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9fRVRZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUdlbmVyaWMgVHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19FR0VORVJJQ19UWVBFID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX19FR0VORVJJQ19UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX0ZJTkFMID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXRpYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19TVEFUSUMgPSBFY29yZVBhY2thZ2UuRVRZUEVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklFTERfX0pBVkFfVklTSUJJTElUWSA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRklFTERfX1RSQU5TSUVOVCA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Wb2xhdGlsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEZJRUxEX19WT0xBVElMRSA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBGSUVMRF9fSkFWQV9DTEFTUyA9IEVjb3JlUGFja2FnZS5FVFlQRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgRklFTERfX0lOSVRJQUxJWkVSID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5GaWVsZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGSUVMRF9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVUWVBFRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEJMT0NLX19TT1VSQ0UgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBCTE9DS19fTkFNRSA9IDE7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEJMT0NLX19DT05URU5UUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QmxvY2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkxPQ0tfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09NTUVOVF9fU09VUkNFID0gQkxPQ0tfX1NPVVJDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQ09NTUVOVF9fTkFNRSA9IEJMT0NLX19OQU1FOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBDT01NRU5UX19DT05URU5UUyA9IEJMT0NLX19DT05URU5UUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTU1FTlRfRkVBVFVSRV9DT1VOVCA9IEJMT0NLX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNUQVRFTUVOVF9fU09VUkNFID0gQkxPQ0tfX1NPVVJDRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgU1RBVEVNRU5UX19OQU1FID0gQkxPQ0tfX05BTUU7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFNUQVRFTUVOVF9fQ09OVEVOVFMgPSBCTE9DS19fQ09OVEVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3RhdGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNUQVRFTUVOVF9GRUFUVVJFX0NPVU5UID0gQkxPQ0tfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfX0VBTk5PVEFUSU9OUyA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fTkFNRSA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fTkFNRTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19OU19VUkkgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX05TX1VSSTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnMgUHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19OU19QUkVGSVggPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX05TX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FRmFjdG9yeSBJbnN0YW5jZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fRUZBQ1RPUllfSU5TVEFOQ0UgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VGQUNUT1JZX0lOU1RBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVDbGFzc2lmaWVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19FQ0xBU1NJRklFUlMgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfX0VDTEFTU0lGSUVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3VicGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfUEFDS0FHRV9fRVNVQlBBQ0tBR0VTID0gRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FU1VCUEFDS0FHRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVN1cGVyIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19FU1VQRVJfUEFDS0FHRSA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRVNVUEVSX1BBQ0tBR0U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9QQUNLQUdFX19KQVZBX0NMQVNTRVMgPSBFY29yZVBhY2thZ2UuRVBBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkphdmEgUGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBDbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTU19OQU1FOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19JTlNUQU5DRV9DTEFTUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0RFRkFVTFRfVkFMVUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIFR5cGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19JTlNUQU5DRV9UWVBFX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9UWVBFX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VQQUNLQUdFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVBBQ0tBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGUgUGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VUWVBFX1BBUkFNRVRFUlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FVFlQRV9QQVJBTUVURVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0FCU1RSQUNUID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0lOVEVSRkFDRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOVEVSRkFDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VPUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQXR0cmlidXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBTExfQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FQUxMX1JFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1JFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FUkVGRVJFTkNFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VSRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIENvbnRhaW5tZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBTExfQ09OVEFJTk1FTlRTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9DT05UQUlOTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBPcGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFMTF9PUEVSQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9PUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3RydWN0dXJhbCBGZWF0dXJlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN1cGVyIFR5cGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9fRUFMTF9TVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUlEIEF0dHJpYnV0ZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FSURfQVRUUklCVVRFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUlEX0FUVFJJQlVURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3RydWN0dXJhbCBGZWF0dXJlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVNUUlVDVFVSQUxfRkVBVFVSRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUdlbmVyaWMgU3VwZXIgVHlwZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfREFUQV9UWVBFX19FR0VORVJJQ19TVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VHRU5FUklDX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgR2VuZXJpYyBTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9EQVRBX1RZUEVfX0VBTExfR0VORVJJQ19TVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfR0VORVJJQ19TVVBFUl9UWVBFUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KYXZhIERhdGEgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0RBVEFfVFlQRV9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVDTEFTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VBTk5PVEFUSU9OUyA9IEpBVkFfQ0xBU1NfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19OQU1FID0gSkFWQV9DTEFTU19fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgPSBKQVZBX0NMQVNTX19JTlNUQU5DRV9DTEFTU19OQU1FOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0lOU1RBTkNFX0NMQVNTID0gSkFWQV9DTEFTU19fSU5TVEFOQ0VfQ0xBU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19ERUZBVUxUX1ZBTFVFID0gSkFWQV9DTEFTU19fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW5jZSBUeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19JTlNUQU5DRV9UWVBFX05BTUUgPSBKQVZBX0NMQVNTX19JTlNUQU5DRV9UWVBFX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRVBBQ0tBR0UgPSBKQVZBX0NMQVNTX19FUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZSBQYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FVFlQRV9QQVJBTUVURVJTID0gSkFWQV9DTEFTU19fRVRZUEVfUEFSQU1FVEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0FCU1RSQUNUID0gSkFWQV9DTEFTU19fQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fSU5URVJGQUNFID0gSkFWQV9DTEFTU19fSU5URVJGQUNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRVNVUEVSX1RZUEVTID0gSkFWQV9DTEFTU19fRVNVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FT1BFUkFUSU9OUyA9IEpBVkFfQ0xBU1NfX0VPUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQXR0cmlidXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFMTF9BVFRSSUJVVEVTID0gSkFWQV9DTEFTU19fRUFMTF9BVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFMTF9SRUZFUkVOQ0VTID0gSkFWQV9DTEFTU19fRUFMTF9SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FUkVGRVJFTkNFUyA9IEpBVkFfQ0xBU1NfX0VSRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQVRUUklCVVRFUyA9IEpBVkFfQ0xBU1NfX0VBVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQ29udGFpbm1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FQUxMX0NPTlRBSU5NRU5UUyA9IEpBVkFfQ0xBU1NfX0VBTExfQ09OVEFJTk1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgT3BlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFMTF9PUEVSQVRJT05TID0gSkFWQV9DTEFTU19fRUFMTF9PUEVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3RydWN0dXJhbCBGZWF0dXJlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTID0gSkFWQV9DTEFTU19fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0VBTExfU1VQRVJfVFlQRVMgPSBKQVZBX0NMQVNTX19FQUxMX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJRCBBdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgaW50IEFSUkFZX1RZUEVfX0VJRF9BVFRSSUJVVEUgPSBKQVZBX0NMQVNTX19FSURfQVRUUklCVVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FU1RSVUNUVVJBTF9GRUFUVVJFUyA9IEpBVkFfQ0xBU1NfX0VTVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVHZW5lcmljIFN1cGVyIFR5cGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19FR0VORVJJQ19TVVBFUl9UWVBFUyA9IEpBVkFfQ0xBU1NfX0VHRU5FUklDX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgR2VuZXJpYyBTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fRUFMTF9HRU5FUklDX1NVUEVSX1RZUEVTID0gSkFWQV9DTEFTU19fRUFMTF9HRU5FUklDX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0tJTkQgPSBKQVZBX0NMQVNTX19LSU5EOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdWJsaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19QVUJMSUMgPSBKQVZBX0NMQVNTX19QVUJMSUM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlJBWV9UWVBFX19GSU5BTCA9IEpBVkFfQ0xBU1NfX0ZJTkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0lNUExFTUVOVFNfSU5URVJGQUNFUyA9IEpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fQ0xBU1NfSU1QT1JUID0gSkFWQV9DTEFTU19fQ0xBU1NfSU1QT1JUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19QQUNLQUdFX0lNUE9SVFMgPSBKQVZBX0NMQVNTX19QQUNLQUdFX0lNUE9SVFM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0ZJRUxEUyA9IEpBVkFfQ0xBU1NfX0ZJRUxEUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fTUVUSE9EUyA9IEpBVkFfQ0xBU1NfX01FVEhPRFM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0lOSVRJQUxJWkVSUyA9IEpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fREVDTEFSRURfQ0xBU1NFUyA9IEpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0RFQ0xBUklOR19DTEFTUyA9IEpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fSkFWQV9QQUNLQUdFID0gSkFWQV9DTEFTU19fSkFWQV9QQUNLQUdFOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19FVkVOVFMgPSBKQVZBX0NMQVNTX19FVkVOVFM7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEFSUkFZX1RZUEVfX0FMTF9FVkVOVFMgPSBKQVZBX0NMQVNTX19BTExfRVZFTlRTOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBBUlJBWV9UWVBFX19BUlJBWV9ESU1FTlNJT05TID0gSkFWQV9DTEFTU19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgQVJSQVlfVFlQRV9fQ09NUE9ORU5UX1RZUEUgPSBKQVZBX0NMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcnJheSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSUkFZX1RZUEVfRkVBVFVSRV9DT1VOVCA9IEpBVkFfQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX05BTUUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX09SREVSRUQgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fT1JERVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19VTklRVUUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvd2VyIEJvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fTE9XRVJfQk9VTkQgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fTE9XRVJfQk9VTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBwZXIgQm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19VUFBFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19VUFBFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fTUFOWSA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19NQU5ZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fUkVRVUlSRUQgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fUkVRVUlSRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19FVFlQRSA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19FVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FR2VuZXJpYyBUeXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fRUdFTkVSSUNfVFlQRSA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19FR0VORVJJQ19UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19DSEFOR0VBQkxFID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0NIQU5HRUFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Vm9sYXRpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19WT0xBVElMRSA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19WT0xBVElMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19UUkFOU0lFTlQgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fVFJBTlNJRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWUgTGl0ZXJhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX0RFRkFVTFRfVkFMVUVfTElURVJBTCA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEpBVkFfRVZFTlRfX0RFRkFVTFRfVkFMVUUgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbnNldHRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fVU5TRVRUQUJMRSA9IEVjb3JlUGFja2FnZS5FU1RSVUNUVVJBTF9GRUFUVVJFX19VTlNFVFRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlcml2ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX19ERVJJVkVEID0gRWNvcmVQYWNrYWdlLkVTVFJVQ1RVUkFMX0ZFQVRVUkVfX0RFUklWRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUNvbnRhaW5pbmcgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSkFWQV9FVkVOVF9fRUNPTlRBSU5JTkdfQ0xBU1MgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9fRUNPTlRBSU5JTkdfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SmF2YSBFdmVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBKQVZBX0VWRU5UX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRVNUUlVDVFVSQUxfRkVBVFVSRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1ZJU0lCSUxJVFlfS0lORCA9IDEzOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBKQVZBX1BBUkFNRVRFUl9LSU5EID0gMTQ7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5KVHlwZSBKYXZhIEhlbHBlcnM8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0SlR5cGVKYXZhSGVscGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBKVFlQRV9KQVZBX0hFTFBFUlMgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SlR5cGUgTGlzdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRKVHlwZUxpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSlRZUEVfTElTVCA9IDE2OwotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVFlQRV9LSU5EID0gMTI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiamF2YS54bWkiOwotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmplbS5qYXZhIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSmF2YVJlZlBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBKYXZhQ2xhc3Mgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEphdmFDbGFzcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKYXZhQ2xhc3NfS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNQdWJsaWMgPGVtPlB1YmxpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlB1YmxpYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc1B1YmxpYygpCi0JICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRKYXZhQ2xhc3NfUHVibGljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2lzRmluYWwoKQotCSAqIEBzZWUgI2dldEphdmFDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SmF2YUNsYXNzX0ZpbmFsKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19JbXBsZW1lbnRzSW50ZXJmYWNlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfQ2xhc3NJbXBvcnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX1BhY2thZ2VJbXBvcnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFDbGFzc19GaWVsZHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX01ldGhvZHMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0luaXRpYWxpemVycygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRGVjbGFyaW5nQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0RlY2xhcmVkQ2xhc3NlcygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfSmF2YVBhY2thZ2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0V2ZW50cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfQWxsRXZlbnRzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEZpZWxkIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRGaWVsZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNGaW5hbCgpCi0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpZWxkX0ZpbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzU3RhdGljIDxlbT5TdGF0aWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGF0aWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1N0YXRpYygpCi0JICogQHNlZSAjZ2V0RmllbGQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEZpZWxkX1N0YXRpYygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWVsZF9KYXZhVmlzaWJpbGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZCNpc1RyYW5zaWVudCA8ZW0+VHJhbnNpZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnNpZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNUcmFuc2llbnQoKQotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWVsZF9UcmFuc2llbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuRmllbGQjaXNWb2xhdGlsZSA8ZW0+Vm9sYXRpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Wb2xhdGlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkI2lzVm9sYXRpbGUoKQotCSAqIEBzZWUgI2dldEZpZWxkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRGaWVsZF9Wb2xhdGlsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRGaWVsZF9KYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RmllbGRfSW5pdGlhbGl6ZXIoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gTWV0aG9kIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzQWJzdHJhY3QgPGVtPkFic3RyYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWJzdHJhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNBYnN0cmFjdCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RfQWJzdHJhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzTmF0aXZlIDxlbT5OYXRpdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYXRpdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNOYXRpdmUoKQotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kX05hdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNTeW5jaHJvbml6ZWQgPGVtPlN5bmNocm9uaXplZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN5bmNocm9uaXplZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc1N5bmNocm9uaXplZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RfU3luY2hyb25pemVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzRmluYWwoKQotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kX0ZpbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc0NvbnN0cnVjdG9yIDxlbT5Db25zdHJ1Y3RvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbnN0cnVjdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzQ29uc3RydWN0b3IoKQotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kX0NvbnN0cnVjdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNpc1N0YXRpYyA8ZW0+U3RhdGljPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhdGljPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzU3RhdGljKCkKLQkgKiBAc2VlICNnZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZF9TdGF0aWMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kX0phdmFWaXNpYmlsaXR5KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZF9QYXJhbWV0ZXJzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZF9KYXZhRXhjZXB0aW9ucygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RfSmF2YUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZF9Tb3VyY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YVBhcmFtZXRlciBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0SmF2YVBhcmFtZXRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyI2lzRmluYWwgPGVtPkZpbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyI2lzRmluYWwoKQotCSAqIEBzZWUgI2dldEphdmFQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEphdmFQYXJhbWV0ZXJfRmluYWwoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SmF2YVBhcmFtZXRlcl9QYXJhbWV0ZXJLaW5kKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEFycmF5VHlwZSBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0QXJyYXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldEFycmF5VHlwZV9BcnJheURpbWVuc2lvbnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXJyYXlUeXBlX0NvbXBvbmVudFR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YURhdGFUeXBlIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRKYXZhRGF0YVR5cGUoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YUV2ZW50IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRKYXZhRXZlbnQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YVBhY2thZ2Ugb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldEphdmFQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEphdmFQYWNrYWdlX0phdmFDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEJsb2NrIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRCbG9jaygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCbG9ja19Tb3VyY2UoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmxvY2tfTmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCbG9ja19Db250ZW50cygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBDb21tZW50IG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRDb21tZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFN0YXRlbWVudCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0U3RhdGVtZW50KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEluaXRpYWxpemVyIG9iamVjdAotCSAqLwotCUVDbGFzcyBnZXRJbml0aWFsaXplcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbml0aWFsaXplcl9Jc1N0YXRpYygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRJbml0aWFsaXplcl9KYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCUVSZWZlcmVuY2UgZ2V0SW5pdGlhbGl6ZXJfU291cmNlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIEphdmFWaXNpYmlsaXR5S2luZCBvYmplY3QKLQkgKi8KLQlFRW51bSBnZXRKYXZhVmlzaWJpbGl0eUtpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSmF2YVBhcmFtZXRlcktpbmQgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0SmF2YVBhcmFtZXRlcktpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVHlwZUtpbmQgb2JqZWN0Ci0JICovCi0JRUVudW0gZ2V0VHlwZUtpbmQoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSlR5cGVMaXN0IG9iamVjdAotCSAqLwotCUVEYXRhVHlwZSBnZXRKVHlwZUxpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gSlR5cGVKYXZhSGVscGVycyBvYmplY3QKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SlR5cGVKYXZhSGVscGVycygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JSmF2YVJlZkZhY3RvcnkgZ2V0SmF2YVJlZkZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCA8ZW0+SmF2YSBDbGFzczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEphdmFDbGFzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBKQVZBX0NMQVNTID0gZUlOU1RBTkNFLmdldEphdmFDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpBVkFfQ0xBU1NfX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0tpbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1YmxpYzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpBVkFfQ0xBU1NfX1BVQkxJQyA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfUHVibGljKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaW5hbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpBVkFfQ0xBU1NfX0ZJTkFMID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19GaW5hbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wbGVtZW50cyBJbnRlcmZhY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX0NMQVNTX19JTVBMRU1FTlRTX0lOVEVSRkFDRVMgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0ltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBJbXBvcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVCA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfQ2xhc3NJbXBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2UgSW1wb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19QYWNrYWdlSW1wb3J0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmllbGRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX0NMQVNTX19GSUVMRFMgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0ZpZWxkcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSkFWQV9DTEFTU19fTUVUSE9EUyA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfTWV0aG9kcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbGl6ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX0NMQVNTX19JTklUSUFMSVpFUlMgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0luaXRpYWxpemVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVjbGFyZWQgQ2xhc3NlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUyA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfRGVjbGFyZWRDbGFzc2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWNsYXJpbmcgQ2xhc3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0RlY2xhcmluZ0NsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIFBhY2thZ2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX0NMQVNTX19KQVZBX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzX0phdmFQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FdmVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEpBVkFfQ0xBU1NfX0VWRU5UUyA9IGVJTlNUQU5DRS5nZXRKYXZhQ2xhc3NfRXZlbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbGwgRXZlbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBKQVZBX0NMQVNTX19BTExfRVZFTlRTID0gZUlOU1RBTkNFLmdldEphdmFDbGFzc19BbGxFdmVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSW5pdGlhbGl6ZXJJbXBsIDxlbT5Jbml0aWFsaXplcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSW5pdGlhbGl6ZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0SW5pdGlhbGl6ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSU5JVElBTElaRVIgPSBlSU5TVEFOQ0UuZ2V0SW5pdGlhbGl6ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFN0YXRpYzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIElOSVRJQUxJWkVSX19JU19TVEFUSUMgPSBlSU5TVEFOQ0UuZ2V0SW5pdGlhbGl6ZXJfSXNTdGF0aWMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSU5JVElBTElaRVJfX0pBVkFfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0SW5pdGlhbGl6ZXJfSmF2YUNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBJTklUSUFMSVpFUl9fU09VUkNFID0gZUlOU1RBTkNFLmdldEluaXRpYWxpemVyX1NvdXJjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUGFyYW1ldGVySW1wbCA8ZW0+SmF2YSBQYXJhbWV0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFQYXJhbWV0ZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0SmF2YVBhcmFtZXRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBKQVZBX1BBUkFNRVRFUiA9IGVJTlNUQU5DRS5nZXRKYXZhUGFyYW1ldGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaW5hbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpBVkFfUEFSQU1FVEVSX19GSU5BTCA9IGVJTlNUQU5DRS5nZXRKYXZhUGFyYW1ldGVyX0ZpbmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXIgS2luZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORCA9IGVJTlNUQU5DRS5nZXRKYXZhUGFyYW1ldGVyX1BhcmFtZXRlcktpbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuTWV0aG9kSW1wbCA8ZW0+TWV0aG9kPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5NZXRob2RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0TWV0aG9kKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRCA9IGVJTlNUQU5DRS5nZXRNZXRob2QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX19BQlNUUkFDVCA9IGVJTlNUQU5DRS5nZXRNZXRob2RfQWJzdHJhY3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hdGl2ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9fTkFUSVZFID0gZUlOU1RBTkNFLmdldE1ldGhvZF9OYXRpdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN5bmNocm9uaXplZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9fU1lOQ0hST05JWkVEID0gZUlOU1RBTkNFLmdldE1ldGhvZF9TeW5jaHJvbml6ZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX19GSU5BTCA9IGVJTlNUQU5DRS5nZXRNZXRob2RfRmluYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnN0cnVjdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX19DT05TVFJVQ1RPUiA9IGVJTlNUQU5DRS5nZXRNZXRob2RfQ29uc3RydWN0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXRpYzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9fU1RBVElDID0gZUlOU1RBTkNFLmdldE1ldGhvZF9TdGF0aWMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgVmlzaWJpbGl0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9fSkFWQV9WSVNJQklMSVRZID0gZUlOU1RBTkNFLmdldE1ldGhvZF9KYXZhVmlzaWJpbGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX19QQVJBTUVURVJTID0gZUlOU1RBTkNFLmdldE1ldGhvZF9QYXJhbWV0ZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIEV4Y2VwdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9fSkFWQV9FWENFUFRJT05TID0gZUlOU1RBTkNFLmdldE1ldGhvZF9KYXZhRXhjZXB0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmF2YSBDbGFzczwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfX0pBVkFfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kX0phdmFDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX19TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kX1NvdXJjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5GaWVsZEltcGwgPGVtPkZpZWxkPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5GaWVsZEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRGaWVsZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBGSUVMRCA9IGVJTlNUQU5DRS5nZXRGaWVsZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmluYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUVMRF9fRklOQUwgPSBlSU5TVEFOQ0UuZ2V0RmllbGRfRmluYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXRpYzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEZJRUxEX19TVEFUSUMgPSBlSU5TVEFOQ0UuZ2V0RmllbGRfU3RhdGljKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KYXZhIFZpc2liaWxpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUVMRF9fSkFWQV9WSVNJQklMSVRZID0gZUlOU1RBTkNFLmdldEZpZWxkX0phdmFWaXNpYmlsaXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUVMRF9fVFJBTlNJRU5UID0gZUlOU1RBTkNFLmdldEZpZWxkX1RyYW5zaWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Vm9sYXRpbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBGSUVMRF9fVk9MQVRJTEUgPSBlSU5TVEFOQ0UuZ2V0RmllbGRfVm9sYXRpbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRklFTERfX0pBVkFfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0RmllbGRfSmF2YUNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsaXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZJRUxEX19JTklUSUFMSVpFUiA9IGVJTlNUQU5DRS5nZXRGaWVsZF9Jbml0aWFsaXplcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5CbG9ja0ltcGwgPGVtPkJsb2NrPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5CbG9ja0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRCbG9jaygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBCTE9DSyA9IGVJTlNUQU5DRS5nZXRCbG9jaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQkxPQ0tfX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRCbG9ja19Tb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCTE9DS19fTkFNRSA9IGVJTlNUQU5DRS5nZXRCbG9ja19OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250ZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQkxPQ0tfX0NPTlRFTlRTID0gZUlOU1RBTkNFLmdldEJsb2NrX0NvbnRlbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkNvbW1lbnRJbXBsIDxlbT5Db21tZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5Db21tZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldENvbW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09NTUVOVCA9IGVJTlNUQU5DRS5nZXRDb21tZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLlN0YXRlbWVudEltcGwgPGVtPlN0YXRlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuU3RhdGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldFN0YXRlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTVEFURU1FTlQgPSBlSU5TVEFOQ0UuZ2V0U3RhdGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFQYWNrYWdlSW1wbCA8ZW0+SmF2YSBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRKYXZhUGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBKQVZBX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0SmF2YVBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgQ2xhc3NlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgSkFWQV9QQUNLQUdFX19KQVZBX0NMQVNTRVMgPSBlSU5TVEFOQ0UuZ2V0SmF2YVBhY2thZ2VfSmF2YUNsYXNzZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YURhdGFUeXBlSW1wbCA8ZW0+SmF2YSBEYXRhIFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFEYXRhVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRKYXZhRGF0YVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSkFWQV9EQVRBX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SmF2YURhdGFUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkFycmF5VHlwZUltcGwgPGVtPkFycmF5IFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkFycmF5VHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRBcnJheVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVJSQVlfVFlQRSA9IGVJTlNUQU5DRS5nZXRBcnJheVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFycmF5IERpbWVuc2lvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUlJBWV9UWVBFX19BUlJBWV9ESU1FTlNJT05TID0gZUlOU1RBTkNFLmdldEFycmF5VHlwZV9BcnJheURpbWVuc2lvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbXBvbmVudCBUeXBlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVJSQVlfVFlQRV9fQ09NUE9ORU5UX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0QXJyYXlUeXBlX0NvbXBvbmVudFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUV2ZW50SW1wbCA8ZW0+SmF2YSBFdmVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUV2ZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsI2dldEphdmFFdmVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBKQVZBX0VWRU5UID0gZUlOU1RBTkNFLmdldEphdmFFdmVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuVHlwZUtpbmQgPGVtPlR5cGUgS2luZDwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuVHlwZUtpbmQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRUeXBlS2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFRZUEVfS0lORCA9IGVJTlNUQU5DRS5nZXRUeXBlS2luZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kIDxlbT5KYXZhIFZpc2liaWxpdHkgS2luZDwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0SmF2YVZpc2liaWxpdHlLaW5kKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gSkFWQV9WSVNJQklMSVRZX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0SmF2YVZpc2liaWxpdHlLaW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyS2luZCA8ZW0+SmF2YSBQYXJhbWV0ZXIgS2luZDwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcktpbmQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCNnZXRKYXZhUGFyYW1ldGVyS2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIEpBVkFfUEFSQU1FVEVSX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0SmF2YVBhcmFtZXRlcktpbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkpUeXBlIEphdmEgSGVscGVyczwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0SlR5cGVKYXZhSGVscGVycygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBKVFlQRV9KQVZBX0hFTFBFUlMgPSBlSU5TVEFOQ0UuZ2V0SlR5cGVKYXZhSGVscGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+SlR5cGUgTGlzdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwjZ2V0SlR5cGVMaXN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEpUWVBFX0xJU1QgPSBlSU5TVEFOQ0UuZ2V0SlR5cGVMaXN0KCk7Ci0KLQl9Ci0KLX0gLy9KYXZhUmVmUGFja2FnZQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhVVJMLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFVUkwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjMTIwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL0phdmFVUkwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0vKgotCi0KLSAqLwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgSmF2YVJlZkZhY3Rvcnl9IFVSSSBtZXRob2RzIGluc3RlYWQuCi0gKiAKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVVSTCBleHRlbmRzIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuVVJMIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1BST1RPQ09MX1VSSV9QUkVGSVggPSAiamF2YTovIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEphdmFVUkwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gdXJsU3RyaW5nIGphdmEubGFuZy5TdHJpbmcKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEphdmFSZWZGYWN0b3J5I2NyZWF0ZVR5cGVVUkkoU3RyaW5nKX0gb3Ige0BsaW5rIEphdmFSZWZGYWN0b3J5I2NyZWF0ZVBhY2thZ2VVUkkoU3RyaW5nKX0KLQkgKi8KLQlwdWJsaWMgSmF2YVVSTChTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JCXN1cGVyKHVybFN0cmluZyk7Ci0JfQotCS8qKgotCSAqIEphdmFVUkwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gbmFtZVNwYWNlTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGlEIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEphdmFSZWZGYWN0b3J5I2NyZWF0ZVR5cGVVUkkoU3RyaW5nLCBTdHJpbmcpfQotCSAqIAotCSAqLwotCXB1YmxpYyBKYXZhVVJMKFN0cmluZyBuYW1lU3BhY2VOYW1lLCBTdHJpbmcgaUQpIHsKLQkJc3VwZXIobnVsbCwgbnVsbCk7Ci0JCWluaXRpYWxpemVOYW1lc3BhY2VTdHJpbmcobmFtZVNwYWNlTmFtZSk7Ci0JCXRoaXMuSUQgPSBpRDsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgSmF2YVJlZkZhY3RvcnkjZ2V0VHlwZU5hbWUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSl9IAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gSUQ7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdhcyBjcmVhdGVkIGluIFZpc3VhbEFnZS4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEphdmFSZWZGYWN0b3J5I2dldEZ1bGxUeXBlTmFtZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKX0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChuYW1lc3BhY2VOYW1lICE9IG51bGwpIHsKLQkJCWJ1Zi5hcHBlbmQobmFtZXNwYWNlTmFtZSk7Ci0JCQlpZiAoSUQgIT0gbnVsbCkKLQkJCQlidWYuYXBwZW5kKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoSUQgIT0gbnVsbCkKLQkJCWJ1Zi5hcHBlbmQoSUQpOwotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEphdmFSZWZGYWN0b3J5I2dldFBhY2thZ2VOYW1lKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpfQotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCVN0cmluZyBpbnRlcm5hbE5hbWUgPSBuYW1lc3BhY2VOYW1lLnN1YnN0cmluZyhKQVZBX1BST1RPQ09MX1VSSV9QUkVGSVgubGVuZ3RoKCksIG5hbWVzcGFjZU5hbWUubGVuZ3RoKCkpOwotCQlyZXR1cm4gSmF2YVBhY2thZ2UuUFJJTUlUSVZFX1BBQ0tBR0VfTkFNRS5lcXVhbHMoaW50ZXJuYWxOYW1lKSA/ICIiIDogaW50ZXJuYWxOYW1lOyAvLyROT04tTkxTLTEkCi0JfQotCS8qIElmIHdlIGRvbid0IGhhdmUgYSAjIHNpZ24gdG8gZGVsaW1pdCB0aGUgc3RhcnQgb2YgdGhlIGphdmEgcGFja2FnZSB1cyB0aGUgaW5oZXJpdGVkIGJlaGF2aW9yCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21TdHJpbmcoU3RyaW5nIHVybCkgewotCQlpZiAodXJsLmluZGV4T2YoIiMiKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21TdHJpbmcodXJsKTsKLQkJZWxzZSB7Ci0JCQlpbnQgZW5kT2ZQYWNrYWdlTmFtZSA9IHVybC5sYXN0SW5kZXhPZignLicpOwotCQkJaWYgKGVuZE9mUGFja2FnZU5hbWUgPT0gLTEpCi0JCQkJaW5pdGlhbGl6ZU5hbWVzcGFjZVN0cmluZyhudWxsKTsKLQkJCWVsc2UKLQkJCQlpbml0aWFsaXplTmFtZXNwYWNlU3RyaW5nKHVybC5zdWJzdHJpbmcoMCwgZW5kT2ZQYWNrYWdlTmFtZSkpOwotCQkJSUQgPSB1cmwuc3Vic3RyaW5nKGVuZE9mUGFja2FnZU5hbWUgKyAxKTsKLQkJfQotCi0JfQotCS8qIAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVOYW1lc3BhY2VTdHJpbmcoU3RyaW5nIGFOYW1lc3BhY2VOYW1lKSB7Ci0JCWlmIChhTmFtZXNwYWNlTmFtZSA9PSBudWxsKQotCQkJbmFtZXNwYWNlTmFtZSA9IEpBVkFfUFJPVE9DT0xfVVJJX1BSRUZJWDsKLQkJZWxzZQotCQkJbmFtZXNwYWNlTmFtZSA9IEpBVkFfUFJPVE9DT0xfVVJJX1BSRUZJWCArIGFOYW1lc3BhY2VOYW1lOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYVVybFN0cmluZwotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEphdmFSZWZGYWN0b3J5I2lzSmF2YVVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKX0gCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YVVSTChTdHJpbmcgYVVybFN0cmluZykgewotCQlpZiAoYVVybFN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYVVybFN0cmluZy5zdGFydHNXaXRoKEpBVkFfUFJPVE9DT0xfVVJJX1BSRUZJWCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJVUkwoIiArIGdldEZ1bGxTdHJpbmcoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhVmlzaWJpbGl0eUtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvSmF2YVZpc2liaWxpdHlLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYzYzYzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9KYXZhVmlzaWJpbGl0eUtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkphdmEgVmlzaWJpbGl0eSBLaW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFBBQ0tBR0U9MQotICogUFVCTElDPTIKLSAqIFBSSVZBVEU9MwotICogUFJPVEVDVEVEPTQKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UjZ2V0SmF2YVZpc2liaWxpdHlLaW5kKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YVZpc2liaWxpdHlLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+UFVCTElDPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BVQkxJQ19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBVQkxJQyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QUklWQVRFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BSSVZBVEVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklWQVRFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBST1RFQ1RFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQUk9URUNURURfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9URUNURUQgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UEFDS0FHRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQQUNLQUdFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEFDS0FHRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QVUJMSUM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBVQkxJQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQVUJMSUMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBKYXZhVmlzaWJpbGl0eUtpbmQgUFVCTElDX0xJVEVSQUwgPSBuZXcgSmF2YVZpc2liaWxpdHlLaW5kKFBVQkxJQywgIlBVQkxJQyIsICJQVUJMSUMiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBSSVZBVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBSSVZBVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUFJJVkFURQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFWaXNpYmlsaXR5S2luZCBQUklWQVRFX0xJVEVSQUwgPSBuZXcgSmF2YVZpc2liaWxpdHlLaW5kKFBSSVZBVEUsICJQUklWQVRFIiwgIlBSSVZBVEUiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlBST1RFQ1RFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UFJPVEVDVEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BST1RFQ1RFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFWaXNpYmlsaXR5S2luZCBQUk9URUNURURfTElURVJBTCA9IG5ldyBKYXZhVmlzaWJpbGl0eUtpbmQoUFJPVEVDVEVELCAiUFJPVEVDVEVEIiwgIlBST1RFQ1RFRCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UEFDS0FHRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UEFDS0FHRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQQUNLQUdFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVZpc2liaWxpdHlLaW5kIFBBQ0tBR0VfTElURVJBTCA9IG5ldyBKYXZhVmlzaWJpbGl0eUtpbmQoUEFDS0FHRSwgIlBBQ0tBR0UiLCAiUEFDS0FHRSIpOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkphdmEgVmlzaWJpbGl0eSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFWaXNpYmlsaXR5S2luZFtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBKYXZhVmlzaWJpbGl0eUtpbmRbXSB7Ci0JCQlQVUJMSUNfTElURVJBTCwKLQkJCVBSSVZBVEVfTElURVJBTCwKLQkJCVBST1RFQ1RFRF9MSVRFUkFMLAotCQkJUEFDS0FHRV9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkphdmEgVmlzaWJpbGl0eSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkphdmEgVmlzaWJpbGl0eSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlKYXZhVmlzaWJpbGl0eUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5KYXZhIFZpc2liaWxpdHkgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFWaXNpYmlsaXR5S2luZCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCUphdmFWaXNpYmlsaXR5S2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SmF2YSBWaXNpYmlsaXR5IEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIEphdmFWaXNpYmlsaXR5S2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgUFVCTElDOiByZXR1cm4gUFVCTElDX0xJVEVSQUw7Ci0JCQljYXNlIFBSSVZBVEU6IHJldHVybiBQUklWQVRFX0xJVEVSQUw7Ci0JCQljYXNlIFBST1RFQ1RFRDogcmV0dXJuIFBST1RFQ1RFRF9MSVRFUkFMOwotCQkJY2FzZSBQQUNLQUdFOiByZXR1cm4gUEFDS0FHRV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBKYXZhVmlzaWJpbGl0eUtpbmQoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOwotCX0KLQotfSAvL0phdmFWaXNpYmlsaXR5S2luZApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9NZXRob2QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvTWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Y2E1YzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9NZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhOwotCi0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kIGV4dGVuZHMgRU9wZXJhdGlvbnsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFRF9DT01NRU5UX1RBRyA9ICJAZ2VuZXJhdGVkIjsKLQkvKioKLQkgKiBMaXN0cyBhbGwgdGhlIHBhcmFtZXRlcnMsIGV4Y2x1ZGluZyB0aGUgcmV0dXJuIHR5cGUKLQkgKi8gCi0JcHVibGljIEphdmFQYXJhbWV0ZXJbXSBsaXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc0Fic3RyYWN0IGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNBYnN0cmFjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzQWJzdHJhY3QgPGVtPkFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BYnN0cmFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWJzdHJhY3QoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNOYXRpdmUgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc05hdGl2ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzTmF0aXZlIDxlbT5OYXRpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hdGl2ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNOYXRpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hdGl2ZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc1N5bmNocm9uaXplZCBhdHRyaWJ1dGUKLQkgKi8KLQlib29sZWFuIGlzU3luY2hyb25pemVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNTeW5jaHJvbml6ZWQgPGVtPlN5bmNocm9uaXplZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3luY2hyb25pemVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1N5bmNocm9uaXplZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3luY2hyb25pemVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIElzRmluYWwgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc0ZpbmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2QjaXNGaW5hbCA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5hbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBJc0NvbnN0cnVjdG9yIGF0dHJpYnV0ZQotCSAqLwotCWJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzQ29uc3RydWN0b3IgPGVtPkNvbnN0cnVjdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25zdHJ1Y3RvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNDb25zdHJ1Y3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29uc3RydWN0b3IoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgSXNTdGF0aWMgYXR0cmlidXRlCi0JICovCi0JYm9vbGVhbiBpc1N0YXRpYygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2lzU3RhdGljIDxlbT5TdGF0aWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXRpYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTdGF0aWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXRpYyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBKYXZhVmlzaWJpbGl0eSBhdHRyaWJ1dGUKLQkgKi8KLQlKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0SmF2YVZpc2liaWxpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCNnZXRKYXZhVmlzaWJpbGl0eSA8ZW0+SmF2YSBWaXNpYmlsaXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIFZpc2liaWxpdHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVZpc2liaWxpdHlLaW5kCi0JICogQHNlZSAjZ2V0SmF2YVZpc2liaWxpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIFBhcmFtZXRlcnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFBhcmFtZXRlcnMoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgSmF2YUV4Y2VwdGlvbnMgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldEphdmFFeGNlcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBAcmV0dXJuIFRoZSBKYXZhQ2xhc3MgcmVmZXJlbmNlCi0JICovCi0JSmF2YUNsYXNzIGdldEphdmFDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2dldEphdmFDbGFzcyA8ZW0+SmF2YSBDbGFzczwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkphdmEgQ2xhc3M8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRKYXZhQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEphdmFDbGFzcyhKYXZhQ2xhc3MgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogQHJldHVybiBUaGUgU291cmNlIHJlZmVyZW5jZQotCSAqLwotCUJsb2NrIGdldFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2U8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U291cmNlKEJsb2NrIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiB0aGUgamF2YSBjbGFzcyB0aGF0IHRoaXMgbWV0aG9kIGlzIGRlZmluZWQgaW4uCi0JICovCi0JSmF2YUNsYXNzIGdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqIFJldHVybiBhIFN0cmluZyB3aXRoIHRoZSB0aGUgbWV0aG9kIG5hbWUgYW5kIGl0cyBwYXJhbWV0ZXJzLiBlLmcuIDxjb2RlPgotCSAqIHNldEZpcnN0TmFtZShqYXZhLmxhbmcuU3RyaW5nKSA8Ly9jb2RlPiAuCi0JICogIAotCSAqLwotCVN0cmluZyBnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm4gYSBQYXJhbWV0ZXIgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JSmF2YVBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtZXRlck5hbWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogR2V0IHRoZSByZXR1cm4gdHlwZS4KLQkgKi8KLQlKYXZhSGVscGVycyBnZXRSZXR1cm5UeXBlKCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNldCB0aGUgcmV0dXJuIHR5cGUKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQG1vZGVsIHR5cGVEYXRhVHlwZT0ib3JnLmVjbGlwc2UuamVtLmphdmEuSlR5cGVKYXZhSGVscGVycyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXR1cm5UeXBlKEphdmFIZWxwZXJzIHR5cGUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogUmVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC50b1N0cmluZygpLgotCSAqIAotCSAqIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIE1ldGhvZC4gIFRoZSBzdHJpbmcgaXMgZm9ybWF0dGVkIGFzIHRoZSBtZXRob2QgCi0JICogYWNjZXNzIG1vZGlmaWVycywgaWYgYW55LCBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIHJldHVybiB0eXBlLCBmb2xsb3dlZCBieSBhCi0JICogc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSBjbGFzcyBkZWNsYXJpbmcgdGhlIG1ldGhvZCwgZm9sbG93ZWQgYnkgYSBwZXJpb2QsCi0JICogZm9sbG93ZWQgYnkgdGhlIG1ldGhvZCBuYW1lLCBmb2xsb3dlZCBieSBhIHBhcmVudGhlc2l6ZWQsIGNvbW1hLXNlcGFyYXRlZCBsaXN0Ci0JICogb2YgdGhlIG1ldGhvZCdzIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBtZXRob2QgdGhyb3dzIGNoZWNrZWQKLQkgKiBleGNlcHRpb25zLCB0aGUgcGFyYW1ldGVyIGxpc3QgaXMgZm9sbG93ZWQgYnkgYSBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIHdvcmQKLQkgKiB0aHJvd3MgZm9sbG93ZWQgYnkgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgdGhyb3duIGV4Y2VwdGlvbiB0eXBlcy4KLQkgKiAKLQkgKiBGb3IgZXhhbXBsZToKLQkgKiAKLQkgKiAgICAgcHVibGljIGJvb2xlYW4gamF2YS5sYW5nLk9iamVjdC5lcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKiAKLQkgKiBUaGUgYWNjZXNzIG1vZGlmaWVycyBhcmUgcGxhY2VkIGluIGNhbm9uaWNhbCBvcmRlciBhcyBzcGVjaWZpZWQgYnkgIlRoZSBKYXZhCi0JICogTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiIuICBUaGlzIGlzIHB1YmxpYywgPHR0PnByb3RlY3RlZDwvL3R0PiBvcgotCSAqIDx0dD5wcml2YXRlPC8vdHQ+IGZpcnN0LCBhbmQgdGhlbiBvdGhlciBtb2RpZmllcnMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKLQkgKiA8dHQ+YWJzdHJhY3Q8Ly90dD4sIDx0dD5zdGF0aWM8Ly90dD4sIDx0dD5maW5hbDwvL3R0PiwgPHR0PnN5bmNocm9uaXplZDwvL3R0PgotCSAqIDx0dD5uYXRpdmU8Ly90dD4uCi0KLQkgKi8KLQlTdHJpbmcgZ2V0U2lnbmF0dXJlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBzeXN0ZW0gZ2VuZXJhdGVkLgotCSAqIFRoaXMgaXMgdXN1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSBAZ2VuZXJhdGVkIHRhZyBpbiB0aGUgY29tbWVudC4KLQkgKi8KLQlib29sZWFuIGlzR2VuZXJhdGVkKCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNldCB0aGUgaXNHZW5lcmF0ZWQgZmxhZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNHZW5lcmF0ZWQoYm9vbGVhbiBnZW5lcmF0ZWQpOwotCi0gICAgLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICogSXMgdGhpcyBhIHZvaWQgcmV0dXJuIHR5cGUgbWV0aG9kLgotCSAqLwotCWJvb2xlYW4gaXNWb2lkKCk7Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL1N0YXRlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9TdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2MmRlOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL1N0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmE7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXRlbWVudCBleHRlbmRzIEJsb2NrIHsKLQotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvVHlwZUtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvVHlwZUtpbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxMzNjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL1R5cGVLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YTsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5UeXBlIEtpbmQ8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU5ERUZJTkVEPTEgQ0xBU1M9MiBJTlRFUkZBQ0U9MyBFWENFUFRJT049NAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZSNnZXRUeXBlS2luZCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFR5cGVLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+VU5ERUZJTkVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1VOREVGSU5FRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVGSU5FRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DTEFTUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDTEFTU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOVEVSRkFDRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTlRFUkZBQ0VfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUkZBQ0UgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVhDRVBUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYQ0VQVElPTl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYQ0VQVElPTiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5VTkRFRklORUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDxwPgotICAgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVOREVGSU5FRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0gICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICogPC9wPgotICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNVTkRFRklORUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlS2luZCBVTkRFRklORURfTElURVJBTCA9IG5ldyBUeXBlS2luZChVTkRFRklORUQsICJVTkRFRklORUQiLCAiVU5ERUZJTkVEIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DTEFTUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0xBU1M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAqIDwvcD4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0xBU1MKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlS2luZCBDTEFTU19MSVRFUkFMID0gbmV3IFR5cGVLaW5kKENMQVNTLCAiQ0xBU1MiLCAiQ0xBU1MiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOVEVSRkFDRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5URVJGQUNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOVEVSRkFDRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVLaW5kIElOVEVSRkFDRV9MSVRFUkFMID0gbmV3IFR5cGVLaW5kKElOVEVSRkFDRSwgIklOVEVSRkFDRSIsICJJTlRFUkZBQ0UiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVYQ0VQVElPTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RVhDRVBUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLSAgICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotICAgKiA8L3A+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYQ0VQVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVLaW5kIEVYQ0VQVElPTl9MSVRFUkFMID0gbmV3IFR5cGVLaW5kKEVYQ0VQVElPTiwgIkVYQ0VQVElPTiIsICJFWENFUFRJT04iKTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UeXBlIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZUtpbmRbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgVHlwZUtpbmRbXSB7Ci0JCQlVTkRFRklORURfTElURVJBTCwKLQkJCUNMQVNTX0xJVEVSQUwsCi0JCQlJTlRFUkZBQ0VfTElURVJBTCwKLQkJCUVYQ0VQVElPTl9MSVRFUkFMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlR5cGUgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UeXBlIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIFR5cGVLaW5kIGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVHlwZUtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UeXBlIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUeXBlS2luZCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVR5cGVLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UeXBlIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICBwdWJsaWMgc3RhdGljIFR5cGVLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBVTkRFRklORUQ6IHJldHVybiBVTkRFRklORURfTElURVJBTDsKLQkJCWNhc2UgQ0xBU1M6IHJldHVybiBDTEFTU19MSVRFUkFMOwotCQkJY2FzZSBJTlRFUkZBQ0U6IHJldHVybiBJTlRFUkZBQ0VfTElURVJBTDsKLQkJCWNhc2UgRVhDRVBUSU9OOiByZXR1cm4gRVhDRVBUSU9OX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFR5cGVLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKLQl9Ci0KLX0gLy9UeXBlS2luZApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9JSmF2YVJlZmxlY3Rpb25LZXkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSUphdmFSZWZsZWN0aW9uS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZmU4MWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9hZGFwdGVycy9JSmF2YVJlZmxlY3Rpb25LZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFSZWZsZWN0aW9uS2V5IHsKLQotCS8qIENvbnN0YW50cyBmb3IgdGhlIHByaW1pdGl2ZSB0eXBlIG5hbWVzCi0JICogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgd2hpY2ggYXJlIHVzZWQgdG8gcmVmZXIgdG8gYSBwcmltaXRpdmUgdHlwZSwKLQkgKiBpLmUuIG5ldyBKYXZhVVJMKCJpbnQiKSAgb3IgbmV3IFVSTCgiamF2YTovLyNpbnQiKQotCSAqIFRoZXNlIHR5cGVzIGFyZSBjYWNoZWQgYnkgcHJlLWxvYWRpbmcgZG9jdW1lbnRzIGZvciB0aGUgcHJpbWl0aXZlcywKLQkgKiBpbiAiamF2YTovLyIsIGFuZCBmb3IgdGhlIGphdmEubGFuZyAoT2JqZWN0IGFuZCBTdHJpbmcpIGNsYXNzZXMKLQkgKi8KLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX1ZPSUQgPSAidm9pZCI7CSAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9JTlQgPSAiaW50IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9CT09MRUFOID0gImJvb2xlYW4iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX0NIQVIgPSAiY2hhciI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBwdWJsaWMgU3RyaW5nIE5fQllURSA9ICJieXRlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9MT05HID0gImxvbmciOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBOX0ZMT0FUID0gImZsb2F0IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9ET1VCTEUgPSAiZG91YmxlIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgTl9TSE9SVCA9ICJzaG9ydCI7Ly8kTk9OLU5MUy0xJAotCi0JLyogCi0JICogQ3JlYXRlIGFuIEFycmF5VHlwZSBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotCSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZSgpOwotCi0JLyogCi0JICogQ3JlYXRlIGEgSmF2YUNsYXNzIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0JICogSGFuZGxlcyB0aGUgcHVzaCBhbmQgcG9wIG9mIHRoZSBjdXJyZW50IGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBKYXZhQ2xhc3MgY3JlYXRlSmF2YUNsYXNzKCk7Ci0KLQkvKiAKLQkgKiBDcmVhdGUgYSBGaWVsZCBpbnN0YW5jZSBpbiB0aGUgY3VycmVudCBkb2N1bWVudAotCSAqIEhhbmRsZXMgdGhlIHB1c2ggYW5kIHBvcCBvZiB0aGUgY3VycmVudCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRmllbGQgY3JlYXRlSmF2YUZpZWxkKCk7Ci0KLQkvKiAKLQkgKiBDcmVhdGUgYSBNZXRob2QgaW5zdGFuY2UgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQKLQkgKiBIYW5kbGVzIHRoZSBwdXNoIGFuZCBwb3Agb2YgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IE1ldGhvZCBjcmVhdGVKYXZhTWV0aG9kKCk7Ci0KLQkvKiAKLQkgKiBDcmVhdGUgYSBKYXZhUGFyYW1ldGVyIGluc3RhbmNlIGluIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IEphdmFQYXJhbWV0ZXIgY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotCi0JLy9GQi8qKgotCS8vRkIgKiBPdmVycmlkZSB0byB0cnkgdG8gaW50cm9zcGVjdCBvYmplY3RzCi0JLy9GQiAqIHRoYXQgYXJlbid0IGZvdW5kIHVzaW5nIHRoZSBkZWZhdWx0IG1lY2hhbmlzbS4KLQkvL0ZCICovCi0JLy9GQnB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkpIHsKLQkvL0ZCIAlPYmplY3QgamF2YU9iamVjdCA9IHN1cGVyLmdldChrZXkpOwotCS8vRkIgCWlmIChqYXZhT2JqZWN0ID09IG51bGwpIHsKLQkvL0ZCIAkJamF2YU9iamVjdCA9IGdldE9iamVjdEZyb21FeHRlbnNpb25zKChTdHJpbmcpIGtleSk7Ci0JLy9GQiAJCWlmIChqYXZhT2JqZWN0ID09IG51bGwpCi0JLy9GQiAJCQlqYXZhT2JqZWN0ID0gZ2V0SmF2YU9iamVjdCgoU3RyaW5nKSBrZXkpOwotCS8vRkIgCX0KLQkvL0ZCCXJldHVybiBqYXZhT2JqZWN0OwotCS8vRkJ9Ci0KLQkvL0ZCIEFEREVECi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXQoU3RyaW5nIGtleSk7Ci0KLQkvL0ZCIEVORAotCi0JLyoKLQkgKiBJbnN0YW50aWF0ZSB0aGUgbmFtZWQgY2xhc3MuCi0JICogSWYgd2UgbWFrZSBpdCB0byB0aGlzIHBvaW50LCB0aGUgY2xhc3MgaGFzIG5vdCB5ZXQgYmVlbiBpbnN0YW50aWF0ZWQgb3IgcmVmbGVjdGVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBFQ2xhc3NpZmllciBnZXRBcnJheVR5cGUoU3RyaW5nIHR5cGVOYW1lKTsKLQotCS8qCi0JICogSW5zdGFudGlhdGUgdGhlIG5hbWVkIGNsYXNzLgotCSAqIElmIHdlIG1ha2UgaXQgdG8gdGhpcyBwb2ludCwgdGVoIGNsYXNzIGhhcyBub3QgeWV0IGJlZW4gaW5zdGFudGlhdGVkIG9yIHJlZmxlY3RlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgRUNsYXNzaWZpZXIgZ2V0SmF2YUNsYXNzKFN0cmluZyB0eXBlTmFtZSk7Ci0KLQkvKioKLQkgKiBUaGlzIGFsbG93cyBmb3IgdGhlIHJldHJpZXZhbCBvZiBhdHRyaWJ1dGVzL21ldGhvZHMgd2l0aCB0aGUgZm9sbG93aW5nIG5vdGF0aW9uOgotCSAqIGZpZWxkOiBqYXZhOi9jb20uaWJtLmZvbyNUZXN0LmZvbwotCSAqIG1ldGhvZDogamF2YTovY29tLmlibS5mb28jVGVzdC5mb29mb28oCi0JICogcGFyYW1ldGVyOiBqYXZhOi9jb20uaWJtLmZvbyNUZXN0LmZvb2ZvbygtYXJnMAotCSAqIAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBFT2JqZWN0IGdldEphdmFPYmplY3QoU3RyaW5nIGtleVZhbHVlKTsKLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiBDcmVhdGlvbiBkYXRlOiAoMTAvNC8yMDAwIDk6NTI6MjggQU0pCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXIKLQkgKiBAcGFyYW0gdHlwZU5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBFQ2xhc3NpZmllciBnZXRKYXZhVHlwZShTdHJpbmcgdHlwZU5hbWUpOwotCi0JLyoqCi0JICogR2V0IHRoZSBvYmplY3QgZnJvbSB0aGUga2V5IGJ1dCBkb24ndCBkbyBhbnkgCi0JICogdHJpZXMgYXQgY3JlYXRpb24gb2YgdGhlIGtleSBpZiBub3QgZm91bmQuCi0JICogVGhlIEtleSBtdXN0IGJlIGFuIElEIGZvciBpdCB0byBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IHByaW1HZXQoU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGFzc2VkIHR5cGUgcmVwcmVzZW50cyBhIEphdmEgQXJyYXkgdHlwZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQXJyYXkoU3RyaW5nIHR5cGVOYW1lKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2FkYXB0ZXJzL0lKYXZhUmVmbGVjdGlvbktleUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDk3ZmM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVyczsKLQotLyoqCi0gKiBFeHRlbnNpb24gaW50ZXJmYWNlIHRvIGFkZCBhbiBhZGRpdGlvbmFsIHJlZmxlY3Rpb24ga2V5IGluIHRvIGhhbmRsZQotICogb3RoZXIgdHlwZXMgb2Yga2V5J3Mgbm90IHNwZWNpZmljYWxseSBoYW5kbGVkLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gewotCi0JLyoqCi0JICogR2V0IHRoZSBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaWQuCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHJlZmxlY3Rpb25LZXkKLQkgKiBAcmV0dXJuIHRoZSBvYmplY3QgKGl0IHNob3VsZCBhZGQgdGhlIGlkIHdpdGggb2JqZWN0IHRvIHRoZSByZXNvdXJjZSdzIGlkIHRhYmxlIGJlZm9yZSByZXR1cm5pbmcgaXQpIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBvbmUgaXQgaGFuZGxlcy4KLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdChTdHJpbmcgaWQsIElKYXZhUmVmbGVjdGlvbktleSByZWZsZWN0aW9uS2V5KTsKLQkKLX0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSmF2YVhNSUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvYWRhcHRlcnMvSmF2YVhNSUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiZmFlNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2FkYXB0ZXJzL0phdmFYTUlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5hZGFwdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFYTUlGYWN0b3J5SW1wbDsKLSAKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBKYXZhIFhNSSBSZXNvdXJjZXMuCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhWE1JRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBTY2hlbWUgdXNlZCBpbiBVUkkncyBmb3IgamVtIGVsZW1lbnRzLgotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVhNSUZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgSmF2YVhNSUZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZWdpc3RlciB0aGUgcmVmbGVjdGlvbiBrZXkgZXh0ZW5zaW9uLgotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlclJlZmxlY3Rpb25LZXlFeHRlbnNpb24oSUphdmFSZWZsZWN0aW9uS2V5RXh0ZW5zaW9uIGV4dGVuc2lvbik7Ci0JCi0JLyoqCi0JICogRGVyZWdpc3RlciB0aGUgcmVmbGVjdGlvbiBrZXkgZXh0ZW5zaW9uLgotCSAqIEBwYXJhbSBleHRlbnNpb24KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXJlZ2lzdGVyUmVmbGVjdGlvbktleUV4dGVuc2lvbihJSmF2YVJlZmxlY3Rpb25LZXlFeHRlbnNpb24gZXh0ZW5zaW9uKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW1wbC9KYXZhUmVmUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW1wbC9KYXZhUmVmUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwOTA0NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ltcGwvSmF2YVJlZlBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotCi0KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci0KLSAKLQotLyoqCi0gKiAKLSAqIERvIG5vdCB1c2UuIFRoaXMgaXMgaGVyZSBvbmx5IGZvciB0aGUgb2xkZXIgcHJlLUVNRiAyLjIgZ2VuZXJhdGVkIGNvZGUgdGhhdCBhY2Nlc3NlcyB0aGUgcGFja2FnZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHRocm91Z2ggdGhlIGludGVyZmFjZS4KLSAqIFRoaXMgaXMga2luZCBvZiBBUEkgYW5kIG11c3Qgbm90IGdvIGF3YXksIGJ1dCBuZXcgY2xpZW50cyBzaG91bGQgbm90IHJlZmVyZW5jZSB0aGlzIGNsYXNzLgotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVmUGFja2FnZUltcGwgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCB7Ci0KLQlwdWJsaWMgSmF2YVJlZlBhY2thZ2VJbXBsKCkgewotCQlzdXBlcih0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogRG8gbm90IHVzZS4gVGhpcyBpcyBoZXJlIG9ubHkgZm9yIHRoZSBvbGRlciBwcmUtRU1GIDIuMiBnZW5lcmF0ZWQgY29kZSB0aGF0IGFjY2Vzc2VzIHRoZSBwYWNrYWdlIGRpcmVjdGx5IGluc3RlYWQgb2YgdGhyb3VnaCB0aGUgaW50ZXJmYWNlLgotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlLiBUaGlzIGlzIGhlcmUgb25seSBmb3IgdGhlIG9sZGVyIHByZS1FTUYgMi4yIGdlbmVyYXRlZCBjb2RlIHRoYXQgYWNjZXNzZXMgdGhlIHBhY2thZ2UgZGlyZWN0bHkgaW5zdGVhZCBvZiB0aHJvdWdoIHRoZSBpbnRlcmZhY2UuCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhUmVmUGFja2FnZSBpbml0KCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmUGFja2FnZUltcGwuaW5pdCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0FycmF5VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9BcnJheVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOThiOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0FycmF5VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLQotLyoqCi0gKiBEZXNjcmliZXMgYSBKYXZhIEFycmF5IHR5cGUKLSAqICAgIEZvciBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMsIGl0IGlzIHVubGlrZWx5IHRoYXQgdGhlIGNvbXBvbmVudCB0eXBlIHdpbGwgYmUKLSAqICAgIHNwZWNpZmllZCBkaXJlY3RseS4gIFRoaXMgd291bGQgcmVxdWlyZSBpbnN0YW50aWF0aW5nIGEgY2hhaW4gb2YgY29tcG9uZW50IHR5cGVzCi0gKiAgICBzdWNoIGFzIFN0cmluZ1tdW11bXVtdLT5TdHJpbmdbXVtdW10tPlN0cmluZ1tdW10tPlN0cmluZ1tdLT5TdHJpbmcuCi0gKiAKLSAqICAgVGhlIGNvbXBvbmVudCB0eXBlIHJlbGF0aW9uc2hpcCB3aWxsIGJlIGNvbXB1dGVkIGlmIHRoZSBmaW5hbENvbXBvbmVudFR5cGUKLSAqICAgYW5kIGFycmF5IGRpbWVuc2lvbnMgaXMgc3BlY2lmaWVkLgotICogIAotICogICBGb3IgdGhpcyByZWFzb24sIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGNyZWF0ZSBpcyB0aHJvdWdoIHRoZSBKYXZhUmVmRmFjdG9yeSBmYWN0b3J5IG1ldGhvZDoKLSAqICAgICAgICBjcmVhdGVBcnJheVR5cGUoSmF2YUNsYXNzIGZpbmFsQ29tcG9uZW50VHlwZSwgaW50IGRpbWVuc2lvbnMpCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheVR5cGVJbXBsIGV4dGVuZHMgSmF2YUNsYXNzSW1wbCBpbXBsZW1lbnRzIEFycmF5VHlwZSwgSmF2YUNsYXNzIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcnJheURpbWVuc2lvbnMoKSA8ZW0+QXJyYXkgRGltZW5zaW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXJyYXlEaW1lbnNpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBBUlJBWV9ESU1FTlNJT05TX0VERUZBVUxUID0gMDsKLQotCQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBpbnQgYXJyYXlEaW1lbnNpb25zID0gQVJSQVlfRElNRU5TSU9OU19FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21wb25lbnRUeXBlKCkgPGVtPkNvbXBvbmVudCBUeXBlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wb25lbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzaWZpZXIgY29tcG9uZW50VHlwZSA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIEphdmFIZWxwZXJzIGZpbmFsQ29tcG9uZW50VHlwZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5MaXRlcmFscy5BUlJBWV9UWVBFOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGUgdGhlIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIGFycmF5IHR5cGUgZnJvbSBvdXIgdHlwZSBuYW1lLgotCSAqIFRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGlzIGFycmF5IHR5cGUgaXMgZXNzZW50aWFsbHk6IG5ldyBBcnJheVR5cGVJbXBsKGZpbmFsQ29tcG9uZW50VHlwZSwgYXJyYXlEaW1lbnNpb25zLTEpCi0JICogdW5sZXNzIG91ciBhcnJheSBkaW1lbnNpb24gaXMgMSwgaW4gd2hpY2ggY2FzZSBpdCBpcyBvbmx5IG91ciBmaW5hbCBjb21wb25lbnQgdHlwZS4KLQkgKgotCSAqIEluIG9yZGVyIHRvIGVuc3VyZSBhIHVuaXF1ZSBpbnN0YW5jZSwgd2Ugd2lsbCByZXNvbHZlIHRoaXMgdHlwZSB1c2luZyByZWZsZWN0aW9uLgotCSAqICJqYXZhLmxhbmcuU3RyaW5nW11bXSIgY29tcG9uZW50IHR5cGUgaXMgImphdmEubGFuZy5TdHJpbmdbXSIKLQkgKgotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyBjb21wdXRlQ29tcG9uZW50VHlwZSgpIHsKLQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkvLyBTdHJpcCB0aGUgbGFzdCBbXSBmb3JtIG15IG5hbWUgdG8gZ2V0IG15IGNvbXBvbmVudCB0eXBlJ3MgbmFtZQotCQljb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZS5zdWJzdHJpbmcoMCwgY29tcG9uZW50TmFtZS5sZW5ndGgoKSAtIDIpOwotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGNvbXBvbmVudE5hbWUsIHRoaXMpOwotCX0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBwZXJmb3JtIHNvbWUgbGF6eSBpbml0aWFsaXphdGlvbgotCSAqLwotCXB1YmxpYyBFQ2xhc3NpZmllciBnZXRDb21wb25lbnRUeXBlKCkgewotCQkvLyBJZiB3ZSBkbyBub3QgaGF2ZSBhIGNvbXBvbmVudCB0eXBlIHNldCwgYnV0IHdlIGhhdmUgYSBuYW1lICh3aGljaCBjb250YWlucyBvdXIgY29tcG9uZW50IHR5cGUgbmFtZSkKLQkJLy8gd2UgY2FuIGNvbXB1dGUgdGhlIGNvbXBvbmVudCB0eXBlLgotCQlpZiAoKHRoaXMuZ2V0Q29tcG9uZW50VHlwZUdlbigpID09IG51bGwpICYmICh0aGlzLmdldE5hbWUoKSAhPSBudWxsKSkgewotCQkJY29tcG9uZW50VHlwZSA9IGNvbXB1dGVDb21wb25lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGdldENvbXBvbmVudFR5cGVHZW4oKTsKLQl9Ci0JLyoqCi0JICogR2V0IHRoZSBjb21wb25lbnQgdHlwZSBvZiB0aGlzIGFycmF5LiAKLQkgKiAKLQkgKiBJZiB0aGlzIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXksIHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlIHRoZSBuZXN0ZWQgYXJyYXkgdHlwZS4KLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyKCkgewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKSBnZXRDb21wb25lbnRUeXBlKCk7Ci0JfQotCS8qKgotCSAqIEdldCB0aGUgZmluYWwgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgQXJyYXkgVHlwZS4KLQkgKiAKLQkgKiBJbiBvcmRlciB0byBlbnN1cmUgYSB1bmlxdWUgaW5zdGFuY2UsIHdlIHdpbGwgcmVzb2x2ZSB0aGlzIHR5cGUgdXNpbmcgcmVmbGVjdGlvbi4gSXQgdHVybnMgb3V0IHRvIGJlIG1vc3QgZWZmaWNpZW50IHRvIGp1c3QgZG8gdGhpcyBieSB0cmltbWluZyB0aGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0RmluYWxDb21wb25lbnRUeXBlKCkgewotCQlpZiAoZmluYWxDb21wb25lbnRUeXBlID09IG51bGwpIHsKLQkJCVN0cmluZyBjb21wb25lbnROYW1lID0gZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJCS8vIFN0cmlwIGFsbCB0aGUgW10gZnJvbSBteSBuYW1lIHRvIGdldCBteSBGSU5BTCBjb21wb25lbnQgdHlwZSdzIG5hbWUKLQkJCWNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lLnN1YnN0cmluZygwLCBjb21wb25lbnROYW1lLmluZGV4T2YoIlsiKSk7Ci0JCQlmaW5hbENvbXBvbmVudFR5cGUgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoY29tcG9uZW50TmFtZSwgdGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZpbmFsQ29tcG9uZW50VHlwZTsKLQl9Ci0JLyoqCi0JICogKEphdmFIZWxwZXJzKWlzQXJyYXkgLSBBcnJheVR5cGVzIGFyZSBhcnJheXMKLQkgKiBPdmVycmlkZSBmcm9tIEphdmFDbGFzcy4KLQkgKi8gICAgCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIElzIHRoaXMgYW4gYXJyYXkgb2YgamF2YSBwcmltaXRpdmVzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmVBcnJheSgpIHsKLQkJcmV0dXJuIGdldEZpbmFsQ29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCk7Ci0JfQotCS8qKgotCSAqIFNldCB0aGUgY29tcG9uZW50IHR5cGUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZShKYXZhSGVscGVycyBoZWxwZXJDb21wb25lbnRUeXBlKSB7Ci0JCXNldENvbXBvbmVudFR5cGUoKEVDbGFzc2lmaWVyKSBoZWxwZXJDb21wb25lbnRUeXBlKTsJCQotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FSUkFZX0RJTUVOU0lPTlM6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldEFycmF5RGltZW5zaW9ucygpKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQ09NUE9ORU5UX1RZUEU6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0FSUkFZX0RJTUVOU0lPTlM6Ci0JCQkJc2V0QXJyYXlEaW1lbnNpb25zKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRToKLQkJCQlzZXRDb21wb25lbnRUeXBlKChFQ2xhc3NpZmllciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQVJSQVlfRElNRU5TSU9OUzoKLQkJCQlzZXRBcnJheURpbWVuc2lvbnMoQVJSQVlfRElNRU5TSU9OU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5BUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRToKLQkJCQlzZXRDb21wb25lbnRUeXBlKChFQ2xhc3NpZmllciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQVJSQVlfRElNRU5TSU9OUzoKLQkJCQlyZXR1cm4gYXJyYXlEaW1lbnNpb25zICE9IEFSUkFZX0RJTUVOU0lPTlNfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0NPTVBPTkVOVF9UWVBFOgotCQkJCXJldHVybiBjb21wb25lbnRUeXBlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXJyYXlEaW1lbnNpb25zKCkgewotCQlyZXR1cm4gYXJyYXlEaW1lbnNpb25zOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFycmF5RGltZW5zaW9ucyhpbnQgbmV3QXJyYXlEaW1lbnNpb25zKSB7Ci0JCWludCBvbGRBcnJheURpbWVuc2lvbnMgPSBhcnJheURpbWVuc2lvbnM7Ci0JCWFycmF5RGltZW5zaW9ucyA9IG5ld0FycmF5RGltZW5zaW9uczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRV9fQVJSQVlfRElNRU5TSU9OUywgb2xkQXJyYXlEaW1lbnNpb25zLCBhcnJheURpbWVuc2lvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXJyYXlEaW1lbnNpb25zOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhcnJheURpbWVuc2lvbnMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUNsYXNzaWZpZXIgZ2V0Q29tcG9uZW50VHlwZUdlbigpIHsKLQkJaWYgKGNvbXBvbmVudFR5cGUgIT0gbnVsbCAmJiBjb21wb25lbnRUeXBlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRDb21wb25lbnRUeXBlID0gKEludGVybmFsRU9iamVjdCljb21wb25lbnRUeXBlOwotCQkJY29tcG9uZW50VHlwZSA9IChFQ2xhc3NpZmllcillUmVzb2x2ZVByb3h5KG9sZENvbXBvbmVudFR5cGUpOwotCQkJaWYgKGNvbXBvbmVudFR5cGUgIT0gb2xkQ29tcG9uZW50VHlwZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0NPTVBPTkVOVF9UWVBFLCBvbGRDb21wb25lbnRUeXBlLCBjb21wb25lbnRUeXBlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbXBvbmVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzc2lmaWVyIGJhc2ljR2V0Q29tcG9uZW50VHlwZSgpIHsKLQkJcmV0dXJuIGNvbXBvbmVudFR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZShFQ2xhc3NpZmllciBuZXdDb21wb25lbnRUeXBlKSB7Ci0JCWZpbmFsQ29tcG9uZW50VHlwZSA9IG51bGw7Ci0JCXNldENvbXBvbmVudFR5cGVHZW4obmV3Q29tcG9uZW50VHlwZSk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBvbmVudFR5cGVHZW4oRUNsYXNzaWZpZXIgbmV3Q29tcG9uZW50VHlwZSkgewotCQlFQ2xhc3NpZmllciBvbGRDb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTsKLQkJY29tcG9uZW50VHlwZSA9IG5ld0NvbXBvbmVudFR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEVfX0NPTVBPTkVOVF9UWVBFLCBvbGRDb21wb25lbnRUeXBlLCBjb21wb25lbnRUeXBlKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzI2dldEtpbmQoKQotCSAqLwotCXB1YmxpYyBUeXBlS2luZCBnZXRLaW5kKCkgewotCQkvLyBPdmVycmlkZSB0byBhbHdheXMgcmV0dXJuIHRoZSBjbGFzcyBpZiBmaW5hbCB0eXBlIGlzIHZhbGlkLgotCQlKYXZhSGVscGVycyBmdCA9IGdldEZpbmFsQ29tcG9uZW50VHlwZSgpOwotCQlpZiAoIWZ0LmlzUHJpbWl0aXZlKCkpIHsKLQkJCVR5cGVLaW5kIGZ0S2luZCA9ICgoSmF2YUNsYXNzKSBmdCkuZ2V0S2luZCgpOyAKLQkJCXJldHVybiAgZnRLaW5kICE9IFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMID8gVHlwZUtpbmQuQ0xBU1NfTElURVJBTCA6IFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMOwotCQl9IGVsc2UKLQkJCXJldHVybiBUeXBlS2luZC5DTEFTU19MSVRFUkFMOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MjaXNQdWJsaWMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGljKCkgewotCQkvLyBPdmVycmlkZSB0byByZXR1cm4gdGhlIGtpbmQgb2YgdGhlIGZpbmFsIGNvbXBvbmVudCwgYmVjYXVzZSB0aGF0IGRldGVybWluZXMgaXQuCi0JCUphdmFIZWxwZXJzIGZ0ID0gZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7Ci0JCWlmICghZnQuaXNQcmltaXRpdmUoKSkgewotCQkJcmV0dXJuICgoSmF2YUNsYXNzKSBmdCkuaXNQdWJsaWMoKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0Jsb2NrSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0Jsb2NrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjMzNDIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9CbG9ja0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0KLS8qCi0KLQotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5CbG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCbG9ja0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEJsb2NrIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb3VyY2UoKSA8ZW0+U291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNvdXJjZSA9IFNPVVJDRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGVudHMoKSA8ZW0+Q29udGVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjb250ZW50cyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQmxvY2tJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLkJMT0NLOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShTdHJpbmcgbmV3U291cmNlKSB7Ci0JCVN0cmluZyBvbGRTb3VyY2UgPSBzb3VyY2U7Ci0JCXNvdXJjZSA9IG5ld1NvdXJjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q29udGVudHMoKSB7Ci0JCWlmIChjb250ZW50cyA9PSBudWxsKSB7Ci0JCQljb250ZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChCbG9jay5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX0NPTlRFTlRTKTsKLQkJfQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDb250ZW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19DT05URU5UUzoKLQkJCQlyZXR1cm4gZ2V0Q29udGVudHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fQ09OVEVOVFM6Ci0JCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCWdldENvbnRlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fU09VUkNFOgotCQkJCXNldFNvdXJjZShTT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0tfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19DT05URU5UUzoKLQkJCQlnZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkJMT0NLX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIFNPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gc291cmNlICE9IG51bGwgOiAhU09VUkNFX0VERUZBVUxULmVxdWFscyhzb3VyY2UpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5CTE9DS19fQ09OVEVOVFM6Ci0JCQkJcmV0dXJuIGNvbnRlbnRzICE9IG51bGwgJiYgIWNvbnRlbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNvdXJjZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc291cmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0NvbW1lbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvQ29tbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViNjdkZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvQ29tbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLQotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5Db21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50SW1wbCBleHRlbmRzIEJsb2NrSW1wbCBpbXBsZW1lbnRzIENvbW1lbnQgewotCi0JCi0JcHJvdGVjdGVkIENvbW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLkNPTU1FTlQ7Ci0JfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0ZpZWxkSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0ZpZWxkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTc5ZTdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9GaWVsZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVR5cGVkRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNyb3NzUmVmZXJlbmNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVhZEFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuUmVmbGVjdGlvbkFkYXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWVsZEltcGwgZXh0ZW5kcyBFVHlwZWRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEZpZWxkIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbmFsKCkgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRklOQUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEZJTkFMX0VGTEFHID0gMSA8PCAxMDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N0YXRpYygpIDxlbT5TdGF0aWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3RhdGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1RBVElDX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N0YXRpYygpIDxlbT5TdGF0aWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3RhdGljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTVEFUSUNfRUZMQUcgPSAxIDw8IDExOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFWaXNpYmlsaXR5KCkgPGVtPkphdmEgVmlzaWJpbGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmF2YVZpc2liaWxpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YVZpc2liaWxpdHlLaW5kIEpBVkFfVklTSUJJTElUWV9FREVGQVVMVCA9IEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBKYXZhVmlzaWJpbGl0eUtpbmQgamF2YVZpc2liaWxpdHkgPSBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNUcmFuc2llbnQoKSA8ZW0+VHJhbnNpZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1RyYW5zaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSQU5TSUVOVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNUcmFuc2llbnQoKSA8ZW0+VHJhbnNpZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1RyYW5zaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNJRU5UX0VGTEFHID0gMSA8PCAxMjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZvbGF0aWxlKCkgPGVtPlZvbGF0aWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1ZvbGF0aWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVk9MQVRJTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVm9sYXRpbGUoKSA8ZW0+Vm9sYXRpbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVm9sYXRpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZPTEFUSUxFX0VGTEFHID0gMSA8PCAxMzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxpemVyKCkgPGVtPkluaXRpYWxpemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0aWFsaXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJsb2NrIGluaXRpYWxpemVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBGaWVsZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhUmVmUGFja2FnZS5MaXRlcmFscy5GSUVMRDsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVGaWVsZFJlZiAtIHJldHVybiBhIEphdmFVUkwgcmVmZXJlbmNlIHRvIHRoZSBuYW1lZCBmaWVsZCBpbiB0aGUgbmFtZWQgSmF2YSBjbGFzcyBpbiB0aGUgZm9ybSAicGFja2FnZS5jbGFzc19maWVsZCIKLQkgKiBAZGVwcmVjYXRlZCBubyByZXBsYWNlbWVudCBhdCB0aGlzIHRpbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBjcmVhdGVGaWVsZFJlZihTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCUZpZWxkIHJlZiA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWVsZCgpOwotCQlVUkkgY2xhc3NVUkkgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZVVSSShjbGFzc05hbWUpOwotCQkoKEludGVybmFsRU9iamVjdCkgcmVmKS5lU2V0UHJveHlVUkkoVVJJLmNyZWF0ZVVSSShjbGFzc1VSSS50b1N0cmluZygpK1JlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUitmaWVsZE5hbWUpKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNsYXNzIHRoYXQgdGhpcyBmaWVsZCBpcyB3aXRoaW4uCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRDb250YWluaW5nSmF2YUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhQ2xhc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZXMgdG8gcGVyZm9ybSBsYXp5IGluaXRpYWxpemF0aW9ucy9yZWZsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3NpZmllciBnZXRFVHlwZSgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgQmxvY2sgZ2V0SW5pdGlhbGl6ZXIoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGdldEluaXRpYWxpemVyR2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNGaW5hbEdlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3RhdGljKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc1N0YXRpY0dlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc1RyYW5zaWVudEdlbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ZvbGF0aWxlKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc1ZvbGF0aWxlR2VuKCk7Ci0JfQkKLQotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRKYXZhVHlwZSgpIHsKLQkJcmV0dXJuIChKYXZhSGVscGVycykgZ2V0RVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVZpc2liaWxpdHlLaW5kIGdldEphdmFWaXNpYmlsaXR5KCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBnZXRKYXZhVmlzaWJpbGl0eUdlbigpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUmVhZEFkYXB0b3IgZ2V0UmVhZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoUmVhZEFkYXB0b3IpIEVjb3JlVXRpbC5nZXRSZWdpc3RlcmVkQWRhcHRlcih0aGlzLCBSZWFkQWRhcHRvci5UWVBFX0tFWSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUmVmbGVjdGVkID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0VmFsdWVzKCkgewotCQkvLyBXZSBvbmx5IHdhbnQgdGhlIHRlc3Rpbmcgb2YgdGhlIGhhc1JlZmxlY3RlZCBhbmQgZ2V0IHJlYWRhZGFwdGVyIHRvIGJlIHN5bmModGhpcykgc28gdGhhdAotCQkvLyBpdCBpcyBzaG9ydCBhbmQgbm8gZGVhZGxvY2sgcG9zc2liaWxpdHkgKHRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlIG1ldGhvZCByZWZsZWN0aW9uIGFkYXB0ZXIgbWF5IGdvCi0JCS8vIGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgamF2YSBjbGFzcyB0byBnZXQgaXRzIHJlZmxlY3Rpb24gYWRhcHRlciwgd2hpY2ggd291bGQgbG9jayBvbiBpdHNlbGYuIFNvCi0JCS8vIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2VjdGlvbnMgdGhhdCBhcmUgc3luYyh0aGlzKSB0byBub3QgYmUgZGVhZGxvY2thYmxlIGJ5IG5vdCBkb2luZyBzaWduaWZpY2FudCB3b3JrCi0JCS8vIGR1cmluZyB0aGUgc3luYy4KLQkJUmVhZEFkYXB0b3IgcmVhZEFkYXB0b3IgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICghaGFzUmVmbGVjdGVkKSB7Ci0JCQkJcmVhZEFkYXB0b3IgPSBnZXRSZWFkQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCWlmIChyZWFkQWRhcHRvciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHNldFJlZmxlY3RlZCA9IHJlYWRBZGFwdG9yLnJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJLy8gRG9uJ3Qgd2FudCB0byBzZXQgaXQgZmFsc2UuIFRoYXQgaXMgam9iIG9mIHJlZmxlY3Rpb24gYWRhcHRlci4gT3RoZXJ3aXNlIHdlIGNvdWxkIGhhdmUgYSByYWNlLgotCQkJCWlmIChzZXRSZWZsZWN0ZWQpCi0JCQkJCWhhc1JlZmxlY3RlZCA9IHNldFJlZmxlY3RlZDsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogVXNlZCBieSByZWZsZWN0aW9uIGFkYXB0ZXIgdG8gY2xlYXIgdGhlIHJlZmxlY3Rpb24uIFRoaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXJzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZWZsZWN0ZWQoYm9vbGVhbiByZWZsZWN0ZWQpIHsKLQkJaGFzUmVmbGVjdGVkID0gcmVmbGVjdGVkOwotCX0KLQotCS8qKgotCSAqIElzIHRoaXMgZmllbGQgYW4gYXJyYXkgdHlwZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gZ2V0SmF2YVR5cGUoKS5pc0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUzoKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SmF2YUNsYXNzKChKYXZhQ2xhc3Mpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBiYXNpY1NldEphdmFDbGFzcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0lOSVRJQUxJWkVSOgotCQkJCXJldHVybiBiYXNpY1NldEluaXRpYWxpemVyKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRklOQUw6Ci0JCQkJcmV0dXJuIGlzRmluYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19TVEFUSUM6Ci0JCQkJcmV0dXJuIGlzU3RhdGljKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9WSVNJQklMSVRZOgotCQkJCXJldHVybiBnZXRKYXZhVmlzaWJpbGl0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVFJBTlNJRU5UOgotCQkJCXJldHVybiBpc1RyYW5zaWVudCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1ZPTEFUSUxFOgotCQkJCXJldHVybiBpc1ZvbGF0aWxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUjoKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbGl6ZXIoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fRklOQUw6Ci0JCQkJc2V0RmluYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fU1RBVElDOgotCQkJCXNldFN0YXRpYygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJc2V0SmF2YVZpc2liaWxpdHkoKEphdmFWaXNpYmlsaXR5S2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fVFJBTlNJRU5UOgotCQkJCXNldFRyYW5zaWVudCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19WT0xBVElMRToKLQkJCQlzZXRWb2xhdGlsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTOgotCQkJCXNldEphdmFDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUjoKLQkJCQlzZXRJbml0aWFsaXplcigoQmxvY2spbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19GSU5BTDoKLQkJCQlzZXRGaW5hbChGSU5BTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fU1RBVElDOgotCQkJCXNldFN0YXRpYyhTVEFUSUNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfVklTSUJJTElUWToKLQkJCQlzZXRKYXZhVmlzaWJpbGl0eShKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1RSQU5TSUVOVDoKLQkJCQlzZXRUcmFuc2llbnQoVFJBTlNJRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19WT0xBVElMRToKLQkJCQlzZXRWb2xhdGlsZShWT0xBVElMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUzoKLQkJCQlzZXRKYXZhQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUjoKLQkJCQlzZXRJbml0aWFsaXplcigoQmxvY2spbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19GSU5BTDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCkgIT0gRklOQUxfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19TVEFUSUM6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwKSAhPSBTVEFUSUNfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJcmV0dXJuIGphdmFWaXNpYmlsaXR5ICE9IEpBVkFfVklTSUJJTElUWV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1RSQU5TSUVOVDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBUUkFOU0lFTlRfRUZMQUcpICE9IDApICE9IFRSQU5TSUVOVF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX1ZPTEFUSUxFOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFZPTEFUSUxFX0VGTEFHKSAhPSAwKSAhPSBWT0xBVElMRV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEphdmFDbGFzcygpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUjoKLQkJCQlyZXR1cm4gaW5pdGlhbGl6ZXIgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0byBwcmV2ZW50IHRoZSByZWZsZWN0aW9uIG9mIHRoZSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZUNvbnRlbnRzKCkgewotCQlFTGlzdCByZXN1bHRzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJLy9GQgotCQkvL0ZCIEVMaXN0IGNvbnRhaW5tZW50cyA9IGVDbGFzcygpLmdldEVBbGxDb250YWlubWVudHMoKTsKLQkJLy9GQiBpZiAoY29udGFpbm1lbnRzICE9IG51bGwpIHsKLQkJLy9GQiBJdGVyYXRvciBpID0gY29udGFpbm1lbnRzLml0ZXJhdG9yKCk7Ci0JCS8vRkIgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCS8vRkIgRVN0cnVjdHVyYWxGZWF0dXJlIHNmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaS5uZXh0KCk7Ci0JCS8vRkIgLy9DaGFuZ2UgZnJvbSBzdXBlciB0byBwcmltUmVmVmFsdWUKLQkJLy9GQiBPYmplY3QgdmFsdWUgPSBwcmltUmVmVmFsdWUoc2YpOwotCQkvL0ZCIC8vRW5kQ2hhbmdlCi0JCS8vRkIgaWYgKHZhbHVlICE9IG51bGwpCi0JCS8vRkIgaWYgKHNmLmlzTWFueSgpKQotCQkvL0ZCIHJlc3VsdHMuYWRkQWxsKChDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0JCS8vRkIgZWxzZQotCQkvL0ZCIHJlc3VsdHMuYWRkKHZhbHVlKTsKLQkJLy9GQiB9Ci0JCS8vRkIgfQotCQlpZiAoZ2V0SW5pdGlhbGl6ZXJHZW4oKSAhPSBudWxsKQotCQkJcmVzdWx0cy5hZGQoZ2V0SW5pdGlhbGl6ZXJHZW4oKSk7IC8vRkIKLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiAiICsgIigiICsgZ2V0TmFtZSgpICsgIikiOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0SmF2YVZpc2liaWxpdHlHZW4oKSB7Ci0JCXJldHVybiBqYXZhVmlzaWJpbGl0eTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmFsR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmFsKGJvb2xlYW4gbmV3RmluYWwpIHsKLQkJYm9vbGVhbiBvbGRGaW5hbCA9IChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0ZpbmFsKSBlRmxhZ3MgfD0gRklOQUxfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5GSU5BTF9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX0ZJTkFMLCBvbGRGaW5hbCwgbmV3RmluYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpY0dlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBTVEFUSUNfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhdGljKGJvb2xlYW4gbmV3U3RhdGljKSB7Ci0JCWJvb2xlYW4gb2xkU3RhdGljID0gKGVGbGFncyAmIFNUQVRJQ19FRkxBRykgIT0gMDsKLQkJaWYgKG5ld1N0YXRpYykgZUZsYWdzIHw9IFNUQVRJQ19FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gflNUQVRJQ19FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX1NUQVRJQywgb2xkU3RhdGljLCBuZXdTdGF0aWMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhVmlzaWJpbGl0eShKYXZhVmlzaWJpbGl0eUtpbmQgbmV3SmF2YVZpc2liaWxpdHkpIHsKLQkJSmF2YVZpc2liaWxpdHlLaW5kIG9sZEphdmFWaXNpYmlsaXR5ID0gamF2YVZpc2liaWxpdHk7Ci0JCWphdmFWaXNpYmlsaXR5ID0gbmV3SmF2YVZpc2liaWxpdHkgPT0gbnVsbCA/IEpBVkFfVklTSUJJTElUWV9FREVGQVVMVCA6IG5ld0phdmFWaXNpYmlsaXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9WSVNJQklMSVRZLCBvbGRKYXZhVmlzaWJpbGl0eSwgamF2YVZpc2liaWxpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudEdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBUUkFOU0lFTlRfRUZMQUcpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNpZW50KGJvb2xlYW4gbmV3VHJhbnNpZW50KSB7Ci0JCWJvb2xlYW4gb2xkVHJhbnNpZW50ID0gKGVGbGFncyAmIFRSQU5TSUVOVF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld1RyYW5zaWVudCkgZUZsYWdzIHw9IFRSQU5TSUVOVF9FRkxBRzsgZWxzZSBlRmxhZ3MgJj0gflRSQU5TSUVOVF9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX1RSQU5TSUVOVCwgb2xkVHJhbnNpZW50LCBuZXdUcmFuc2llbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZvbGF0aWxlR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFZPTEFUSUxFX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZvbGF0aWxlKGJvb2xlYW4gbmV3Vm9sYXRpbGUpIHsKLQkJYm9vbGVhbiBvbGRWb2xhdGlsZSA9IChlRmxhZ3MgJiBWT0xBVElMRV9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld1ZvbGF0aWxlKSBlRmxhZ3MgfD0gVk9MQVRJTEVfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5WT0xBVElMRV9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX1ZPTEFUSUxFLCBvbGRWb2xhdGlsZSwgbmV3Vm9sYXRpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1MpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKEphdmFDbGFzcyllQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SmF2YUNsYXNzKEphdmFDbGFzcyBuZXdKYXZhQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0phdmFDbGFzcywgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1MsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhQ2xhc3MoSmF2YUNsYXNzIG5ld0phdmFDbGFzcykgewotCQlpZiAobmV3SmF2YUNsYXNzICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEphdmFSZWZQYWNrYWdlLkZJRUxEX19KQVZBX0NMQVNTICYmIG5ld0phdmFDbGFzcyAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0phdmFDbGFzcykpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0phdmFDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MpLmVJbnZlcnNlQWRkKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEphdmFDbGFzcyhuZXdKYXZhQ2xhc3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX0pBVkFfQ0xBU1MsIG5ld0phdmFDbGFzcywgbmV3SmF2YUNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEJsb2NrIGdldEluaXRpYWxpemVyR2VuKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5pdGlhbGl6ZXIoQmxvY2sgbmV3SW5pdGlhbGl6ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQmxvY2sgb2xkSW5pdGlhbGl6ZXIgPSBpbml0aWFsaXplcjsKLQkJaW5pdGlhbGl6ZXIgPSBuZXdJbml0aWFsaXplcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuRklFTERfX0lOSVRJQUxJWkVSLCBvbGRJbml0aWFsaXplciwgbmV3SW5pdGlhbGl6ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemVyKEJsb2NrIG5ld0luaXRpYWxpemVyKSB7Ci0JCWlmIChuZXdJbml0aWFsaXplciAhPSBpbml0aWFsaXplcikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaW5pdGlhbGl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5pdGlhbGl6ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSU5JVElBTElaRVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0luaXRpYWxpemVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luaXRpYWxpemVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF2YVJlZlBhY2thZ2UuRklFTERfX0lOSVRJQUxJWkVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEluaXRpYWxpemVyKG5ld0luaXRpYWxpemVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkZJRUxEX19JTklUSUFMSVpFUiwgbmV3SW5pdGlhbGl6ZXIsIG5ld0luaXRpYWxpemVyKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZ0dlbigpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZpbmFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXRpYzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFNUQVRJQ19FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgamF2YVZpc2liaWxpdHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGphdmFWaXNpYmlsaXR5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0cmFuc2llbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBUUkFOU0lFTlRfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZvbGF0aWxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgVk9MQVRJTEVfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkgIEBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDcm9zc1JlZmVyZW5jZXMoKQotCSAgewotCSAgICBpZiAoZUNyb3NzUmVmZXJlbmNlcyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgZUNyb3NzUmVmZXJlbmNlcyA9IEVDcm9zc1JlZmVyZW5jZUVMaXN0LmNyZWF0ZUVDcm9zc1JlZmVyZW5jZUVMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ3Jvc3NSZWZlcmVuY2VzOwotCSAgfQotCi19Ci0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9Jbml0aWFsaXplckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9Jbml0aWFsaXplckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyNDI0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSW5pdGlhbGl6ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxpemVySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzU3RhdGljKCkgPGVtPklzIFN0YXRpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNTdGF0aWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19TVEFUSUNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNTdGF0aWMgPSBJU19TVEFUSUNfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U291cmNlKCkgPGVtPlNvdXJjZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmxvY2sgc291cmNlID0gbnVsbDsKLQotCXByb3RlY3RlZCBJbml0aWFsaXplckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuTGl0ZXJhbHMuSU5JVElBTElaRVI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNTdGF0aWMoKSB7Ci0JCXJldHVybiBpc1N0YXRpYzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1N0YXRpYyhCb29sZWFuIG5ld0lzU3RhdGljKSB7Ci0JCUJvb2xlYW4gb2xkSXNTdGF0aWMgPSBpc1N0YXRpYzsKLQkJaXNTdGF0aWMgPSBuZXdJc1N0YXRpYzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0lTX1NUQVRJQywgb2xkSXNTdGF0aWMsIGlzU3RhdGljKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEphdmFDbGFzcyhKYXZhQ2xhc3MgbmV3SmF2YUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MsIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmF2YUNsYXNzKEphdmFDbGFzcyBuZXdKYXZhQ2xhc3MpIHsKLQkJaWYgKG5ld0phdmFDbGFzcyAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUyAmJiBuZXdKYXZhQ2xhc3MgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdKYXZhQ2xhc3MpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOwotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdKYXZhQ2xhc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SmF2YUNsYXNzKS5lSW52ZXJzZUFkZCh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTklUSUFMSVpFUlMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRKYXZhQ2xhc3MobmV3SmF2YUNsYXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTLCBuZXdKYXZhQ2xhc3MsIG5ld0phdmFDbGFzcykpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBCbG9jayBnZXRTb3VyY2UoKSB7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFNvdXJjZSA9IChJbnRlcm5hbEVPYmplY3Qpc291cmNlOwotCQkJc291cmNlID0gKEJsb2NrKWVSZXNvbHZlUHJveHkob2xkU291cmNlKTsKLQkJCWlmIChzb3VyY2UgIT0gb2xkU291cmNlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX1NPVVJDRSwgb2xkU291cmNlLCBzb3VyY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCbG9jayBiYXNpY0dldFNvdXJjZSgpIHsKLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoQmxvY2sgbmV3U291cmNlKSB7Ci0JCUJsb2NrIG9sZFNvdXJjZSA9IHNvdXJjZTsKLQkJc291cmNlID0gbmV3U291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fU09VUkNFLCBvbGRTb3VyY2UsIHNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1M6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldEphdmFDbGFzcygoSmF2YUNsYXNzKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRKYXZhQ2xhc3MobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19JU19TVEFUSUM6Ci0JCQkJcmV0dXJuIGdldElzU3RhdGljKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX1NPVVJDRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFNvdXJjZSgpOwotCQkJCXJldHVybiBiYXNpY0dldFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19JU19TVEFUSUM6Ci0JCQkJc2V0SXNTdGF0aWMoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0pBVkFfQ0xBU1M6Ci0JCQkJc2V0SmF2YUNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKEJsb2NrKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSVNfU1RBVElDOgotCQkJCXNldElzU3RhdGljKElTX1NUQVRJQ19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUzoKLQkJCQlzZXRKYXZhQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLklOSVRJQUxJWkVSX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChCbG9jayludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX0lTX1NUQVRJQzoKLQkJCQlyZXR1cm4gSVNfU1RBVElDX0VERUZBVUxUID09IG51bGwgPyBpc1N0YXRpYyAhPSBudWxsIDogIUlTX1NUQVRJQ19FREVGQVVMVC5lcXVhbHMoaXNTdGF0aWMpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUNsYXNzKCkgIT0gbnVsbDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVJfX1NPVVJDRToKLQkJCQlyZXR1cm4gc291cmNlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc1N0YXRpYzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaXNTdGF0aWMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUNsYXNzSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFDbGFzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMzNzk3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUNsYXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0KLQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUNvbGxlY3Rpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYmVhbmluZm8uSUludHJvc3BlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmluc3RhbnRpYXRpb24uSUluc3RhbnRpYXRpb25JbnN0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2lzUHVibGljIDxlbT5QdWJsaWM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNpc0ZpbmFsIDxlbT5GaW5hbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldEltcGxlbWVudHNJbnRlcmZhY2VzIDxlbT5JbXBsZW1lbnRzIEludGVyZmFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRDbGFzc0ltcG9ydCA8ZW0+Q2xhc3MgSW1wb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0UGFja2FnZUltcG9ydHMgPGVtPlBhY2thZ2UgSW1wb3J0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldEZpZWxkcyA8ZW0+RmllbGRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0TWV0aG9kcyA8ZW0+TWV0aG9kczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldEluaXRpYWxpemVycyA8ZW0+SW5pdGlhbGl6ZXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0RGVjbGFyZWRDbGFzc2VzIDxlbT5EZWNsYXJlZCBDbGFzc2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGwjZ2V0RGVjbGFyaW5nQ2xhc3MgPGVtPkRlY2xhcmluZyBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldEphdmFQYWNrYWdlIDxlbT5KYXZhIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbCNnZXRFdmVudHMgPGVtPkV2ZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsI2dldEFsbEV2ZW50cyA8ZW0+QWxsIEV2ZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFDbGFzc0ltcGwgZXh0ZW5kcyBFQ2xhc3NJbXBsIGltcGxlbWVudHMgSmF2YUNsYXNzIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLaW5kKCkgPGVtPktpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVHlwZUtpbmQgS0lORF9FREVGQVVMVCA9IFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFR5cGVLaW5kIGtpbmQgPSBLSU5EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHVibGljKCkgPGVtPlB1YmxpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNQdWJsaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQVUJMSUNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHVibGljKCkgPGVtPlB1YmxpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNQdWJsaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFBVQkxJQ19FRkxBRyA9IDEgPDwgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJTkFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbmFsKCkgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSU5BTF9FRkxBRyA9IDEgPDwgMTE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpIDxlbT5JbXBsZW1lbnRzIEludGVyZmFjZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbXBsZW1lbnRzSW50ZXJmYWNlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc0ltcG9ydCgpIDxlbT5DbGFzcyBJbXBvcnQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NJbXBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjbGFzc0ltcG9ydCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWNrYWdlSW1wb3J0cygpIDxlbT5QYWNrYWdlIEltcG9ydHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnZUltcG9ydHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwYWNrYWdlSW1wb3J0cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZHMoKSA8ZW0+RmllbGRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGZpZWxkcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RzKCkgPGVtPk1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZHMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbGl6ZXJzKCkgPGVtPkluaXRpYWxpemVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0aWFsaXplcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbml0aWFsaXplcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVjbGFyZWRDbGFzc2VzKCkgPGVtPkRlY2xhcmVkIENsYXNzZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVjbGFyZWRDbGFzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVjbGFyZWRDbGFzc2VzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlY2xhcmluZ0NsYXNzKCkgPGVtPkRlY2xhcmluZyBDbGFzczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVjbGFyaW5nQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZGVjbGFyaW5nQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXZlbnRzKCkgPGVtPkV2ZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFdmVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBldmVudHMgPSBudWxsOwotCi0JcHJvdGVjdGVkIEphdmFDbGFzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBFTGlzdCBnZXRFQW5ub3RhdGlvbnNJbnRlcm5hbCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEVBbm5vdGF0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuTGl0ZXJhbHMuSkFWQV9DTEFTUzsKLQl9Ci0KLQkvKioKLQkgKiBQcm90ZWN0ZWQgaGVscGVyIG1ldGhvZHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdEZpZWxkc0V4dGVuZGVkKExpc3QgZmllbGRzKSB7Ci0JCWZpZWxkcy5hZGRBbGwoZ2V0RmllbGRzKCkpOwotCQlJdGVyYXRvciBpdDsKLQkJaXQgPSBnZXRFeHRlbmRlZExvb2t1cEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpCi0JCQkoKEphdmFDbGFzc0ltcGwpIGl0Lm5leHQoKSkuY29sbGVjdEZpZWxkc0V4dGVuZGVkKGZpZWxkcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE1ldGhvZHNFeHRlbmRlZChNYXAgbWV0aG9kcywgYm9vbGVhbiBvbmx5UHVibGljLCBMaXN0IGV4Y2x1ZGVkQ2xhc3NlcywgTGlzdCBleGNsdWRlZE1ldGhvZHMpIHsKLQkJSXRlcmF0b3IgaXQxLCBpdDI7Ci0JCWl0MiA9IGdldEV4dGVuZGVkTG9va3VwSXRlcmF0b3IoKTsKLQkJSmF2YUNsYXNzSW1wbCBqYXZhQ2xhc3M7Ci0JCXdoaWxlIChpdDIuaGFzTmV4dCgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzSW1wbCkgaXQyLm5leHQoKTsKLQkJCWlmICghZXhjbHVkZWRDbGFzc2VzLmNvbnRhaW5zKGphdmFDbGFzcykpCi0JCQkJamF2YUNsYXNzLmNvbGxlY3RNZXRob2RzRXh0ZW5kZWQobWV0aG9kcywgb25seVB1YmxpYywgZXhjbHVkZWRDbGFzc2VzLCBleGNsdWRlZE1ldGhvZHMpOwotCQl9Ci0JCQotCQlMaXN0IGFsbE1ldGhvZHMgPSBudWxsOwotCQlpZihvbmx5UHVibGljKXsKLQkJCWFsbE1ldGhvZHMgPSBnZXRQdWJsaWNNZXRob2RzKCk7Ci0JCX0gZWxzZXsKLQkJCWFsbE1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzeW5jaHJvbml6ZWQoZ2V0TWV0aG9kcygpKXsKLQkJCQlhbGxNZXRob2RzLmFkZEFsbChnZXRNZXRob2RzKCkpOwotCQkJfQotCQl9Ci0JCWl0MSA9IGFsbE1ldGhvZHMuaXRlcmF0b3IoKTsKLQkJTWV0aG9kIG5leHRNZXRob2Q7Ci0JCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0JCQluZXh0TWV0aG9kID0gKE1ldGhvZCkgaXQxLm5leHQoKTsKLQkJCWlmICghZXhjbHVkZWRNZXRob2RzLmNvbnRhaW5zKG5leHRNZXRob2QpKQotCQkJCW1ldGhvZHMucHV0KG5leHRNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpLCBuZXh0TWV0aG9kKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUNsYXNzUmVmIC0gcmV0dXJuIGEgSmF2YVVSTCByZWZlcmVuY2UgdG8gdGhlIG5hbWVkIEphdmEgY2xhc3MKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZUNsYXNzUmVmKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQ2xhc3MgY3JlYXRlQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZih0YXJnZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIGZpbmRDbGFzc01ldGhvZEV4dGVuZGVkKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCU1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlpZiAobWV0aG9kICE9IG51bGwpCi0JCQlyZXR1cm4gbWV0aG9kOwotCQllbHNlIHsKLQkJCUphdmFDbGFzc0ltcGwgbXlTdXBlcjsKLQkJCW15U3VwZXIgPSAoSmF2YUNsYXNzSW1wbCkgZ2V0U3VwZXJ0eXBlKCk7Ci0JCQlpZiAobXlTdXBlciAhPSBudWxsKQotCQkJCXJldHVybiBteVN1cGVyLmZpbmRDbGFzc01ldGhvZEV4dGVuZGVkKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kIGZpbmRJbnRlcmZhY2VNZXRob2RFeHRlbmRlZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcykgewotCQlNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJaWYgKG1ldGhvZCAhPSBudWxsKQotCQkJcmV0dXJuIG1ldGhvZDsKLQkJZWxzZSB7Ci0JCQlKYXZhQ2xhc3NJbXBsIHN1cGVySW50ZXJmYWNlOwotCQkJTGlzdCBsaXN0ID0gZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCXN1cGVySW50ZXJmYWNlID0gKEphdmFDbGFzc0ltcGwpIGxpc3QuZ2V0KGkpOwotCQkJCW1ldGhvZCA9IHN1cGVySW50ZXJmYWNlLmZpbmRJbnRlcmZhY2VNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCQkJaWYgKG1ldGhvZCAhPSBudWxsKQotCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCBJZiBhbnlvbmUgaXMgcmVmZXJlbmNpbmcgdGhpcywgcGxlYXNlIHVzZSBnZXRFQWxsU3VwZXJUeXBlcygpIGluc3RlYWQuIFRoaXMgd2FzIHBsYWNlZCBoZXJlIGFuZCBtaXNzcGVsbGVkIGJ5IG1pc3Rha2UuCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFsbFN1cGVydHlwZXMoKSB7Ci0JCWdldEVTdXBlclR5cGVzKCk7IC8vRm9yY2UgcmVmbGVjdGlvbiwgaWYgbmVlZGVkLCBiZWZvcmUgZ2V0dGluZyBhbGwgc3VwZXJ0eXBlcy4KLQkJcmV0dXJuIHN1cGVyLmdldEVBbGxTdXBlclR5cGVzKCk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGVzIHRvIHBlcmZvcm0gcmVmbGVjdGlvbiBpZiBuZWNlc3NhcnkKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0Q2xhc3NJbXBvcnQoKSB7Ci0JCXJlZmxlY3RCYXNlKCk7Ci0JCXJldHVybiBnZXRDbGFzc0ltcG9ydEdlbigpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFQWxsT3BlcmF0aW9ucygpIHsKLQkJSUludHJvc3BlY3Rpb25BZGFwdGVyIGlhID0gZ2V0SW50cm9zcGVjdGlvbkFkYXB0ZXIoKTsKLQkJaWYgKGlhID09IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0RUFsbE9wZXJhdGlvbnMoKTsgLy8gTm8gaW50cm9zcGVjdGlvbiwgZG8gbm9ybWFsLgotCQlpZiAoZUFsbE9wZXJhdGlvbnMgPT0gbnVsbCkKLQkJCWVBbGxPcGVyYXRpb25zID0gaWEuZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJcmV0dXJuIGVBbGxPcGVyYXRpb25zOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IG90aGVycy4gSXQgaXMgaGVyZSBzbyB0aGF0IEJlYW5JbmZvIGFkYXB0ZXIgY2FuIGFjY2VzcwotCSAqIHVuLWludHJvc3BlY3RlZCBhbGwgb3BlcmF0aW9ucy4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIEVMaXN0IHByaW1HZXRFQWxsT3BlcmF0aW9ucygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEVBbGxPcGVyYXRpb25zKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEVPcGVyYXRpb25zKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgYWRhcHRlciA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRFT3BlcmF0aW9ucygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RU9wZXJhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBieSBvdGhlcnMuIEl0IGlzIGhlcmUgc28gdGhhdCBCZWFuSW5mbyBhZGFwdGVycyBjYW4gZ28gdG8KLQkgKiB0aGUgbm9uLWludHJvc3BlY3RlZCBvcGVyYXRpb25zLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RU9wZXJhdGlvbnNJbnRlcm5hbCgpIHsKLQkJLy8gQW4gaW50ZXJuYWwgbWV0aG9kIGZvciByZXR1cm5pbmcgYWN0dWFsIHdvIGZsdWZmaW5nIHVwLgotCQlyZXR1cm4gc3VwZXIuZ2V0RU9wZXJhdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RUFubm90YXRpb25zKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgYWRhcHRlciA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlhZGFwdGVyLmludHJvc3BlY3RJZk5lY2Vzc2FyeSgpOyAvLyBUbyBjYXVzZSBpbnRyb3NwZWN0aW9uIHNvIHRoZSBhcHByb3ByaWF0ZSBkZWNvcmF0b3IgaXMgYWRkZWQuCi0JCXJldHVybiBzdXBlci5nZXRFQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpIHsKLQkJSUludHJvc3BlY3Rpb25BZGFwdGVyIGFkYXB0ZXIgPSBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlyZXR1cm4gc3VwZXIuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFU3RydWN0dXJhbEZlYXR1cmVzSW50ZXJuYWwoKSB7Ci0JCS8vIEFuIGludGVybmFsIG1ldGhvZCBmb3IgcmV0dXJuaW5nIGFjdHVhbCB3byBmbHVmZmluZyB1cC4KLQkJcmV0dXJuIHN1cGVyLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb24gdGhlIGltcGxlbW50c0luZmVyZmFjZSBMaXN0IGlmIHRoaXMgaXMgYW4gaW50ZXJmYWNlIGNsYXNzIG9yIG9uIHRoZSBzdXBlciBMaXN0IGlmIGl0IGlzIGEgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldEV4dGVuZGVkTG9va3VwSXRlcmF0b3IoKSB7Ci0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuaXRlcmF0b3IoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldEVTdXBlclR5cGVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkKFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJamF2YS51dGlsLkxpc3QgZmllbGRzID0gZ2V0RmllbGRzKCk7Ci0JCUZpZWxkIGZpZWxkOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgewotCQkJZmllbGQgPSAoRmllbGQpIGZpZWxkcy5nZXQoaSk7Ci0JCQlpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhmaWVsZE5hbWUpKQotCQkJCXJldHVybiBmaWVsZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUgZnJvbSB0aGlzIEphdmFDbGFzcyBvciBhbnkgc3VwZXJ0eXBlcy4KLQkgKiAKLQkgKiBSZXR1cm4gbnVsbCBpZiBhIEZpZWxkIG5hbWVkIGZpZWxkTmFtZSBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkRXh0ZW5kZWQoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlGaWVsZCBmaWVsZCA9IGdldEZpZWxkTmFtZWQoZmllbGROYW1lKTsKLQkJaWYgKGZpZWxkICE9IG51bGwpCi0JCQlyZXR1cm4gZmllbGQ7Ci0JCUl0ZXJhdG9yIGl0ID0gZ2V0RXh0ZW5kZWRMb29rdXBJdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlGaWVsZCByZXN1bHQgPSAoKEphdmFDbGFzcykgaXQubmV4dCgpKS5nZXRGaWVsZEV4dGVuZGVkKGZpZWxkTmFtZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUsIG9yIG51bGwuCi0JICovCi0JcHVibGljIEZpZWxkIGdldEZpZWxkTmFtZWQoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlyZXR1cm4gZ2V0RmllbGQoZmllbGROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RmllbGRzKCkgewotCQlyZWZsZWN0RmllbGRzKCk7Ci0JCXJldHVybiBnZXRGaWVsZHNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIGZpZWxkcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGaWVsZHNFeHRlbmRlZCgpIHsKLQkJTGlzdCBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNvbGxlY3RGaWVsZHNFeHRlbmRlZChmaWVsZHMpOwotCQlyZXR1cm4gZmllbGRzOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRJbXBsZW1lbnRzSW50ZXJmYWNlcygpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGdldEltcGxlbWVudHNJbnRlcmZhY2VzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIEludHJvc3BlY3Rpb25BZGFwdG9yIHdoaWNoIGNhbiBpbnRyb3NwZWN0IG91ciBKYXZhIHByb3BlcnRpZXMKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIElJbnRyb3NwZWN0aW9uQWRhcHRlciBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpIHsKLQkJLy8gTmVlZCB0byBzeW5jIHRoaXMgYmVjYXVzZSB3ZSBhcmUgbm93IGluIG11bHRpLXRocmVhZCBlbnYuCi0JCXJldHVybiAoSUludHJvc3BlY3Rpb25BZGFwdGVyKSBFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIodGhpcywgSUludHJvc3BlY3Rpb25BZGFwdGVyLkFEQVBURVJfS0VZKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFOYW1lKCkgewotCQlyZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQotCS8qCi0JICogIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzI2dldFNpbXBsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpIHsKLQkJcmV0dXJuIHByaW1HZXROYW1lKCkucmVwbGFjZSgnJCcsICcuJyk7Ci0JfQotCS8qKgotCSAqIGdldEphdmFQYWNrYWdlLiBUaGlzIGlzIGEgZGVyaXZlZCByZWxhdGlvbnNoaXAsIHNvIHdlIG11c3QgaW1wbGVtZW50IGl0IGhlcmUgdG8gZ2V0IHRoZSBFUGFja2FnZSB0aGF0IHRoaXMgb2JqZWN0IGlzIGNvbnRhaW5lZCBpbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhY2thZ2UgZ2V0SmF2YVBhY2thZ2UoKSB7Ci0JCXJldHVybiAoSmF2YVBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBtZXRob2Qgb2YgdGhpcyBuYW1lIGFuZCB0aGVzZSBwYXJhbWV0ZXJzLiBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LgotCSAqLwotCXB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBnZXRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGdldE1ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMsIExpc3QgbWV0aG9kTGlzdCkgewotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCU1ldGhvZCBtZXRob2Q7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kTGlzdC5zaXplKCk7IGkrKykgewotCQkJbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kTGlzdC5nZXQoaSk7Ci0JCQlKYXZhUGFyYW1ldGVyW10gcGFyYW1zOwotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcGFyYW1zID0gbWV0aG9kLmxpc3RQYXJhbWV0ZXJzV2l0aG91dFJldHVybigpOwotCQkJCWlmIChwYXJhbXMubGVuZ3RoID09IHBhcmFtZXRlclR5cGVzLnNpemUoKSkgewotCQkJCQlmb3VuZCA9IHRydWU7IC8vTWF5YmU7IHdlIG5lZWQgbW9yZSBpbmZvCi0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcGFyYW1zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkvL2lmIGFueSBvbmUgb2YgdGhlIHBhcmFtZXRlcnMgZG9lc24ndCBtYXRjaCB0aGVuIGZsaXAgYmFjayB0byBmYWxzZQotCQkJCQkJSmF2YUhlbHBlcnMgamggPSAoSmF2YUhlbHBlcnMpIHBhcmFtc1tqXS5nZXRFVHlwZSgpOwotCQkJCQkJaWYgKCFqaC5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHBhcmFtZXRlclR5cGVzLmdldChqKSkpIHsKLQkJCQkJCQlmb3VuZCA9IGZhbHNlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfSAvLyBlbmQgaWYgcGFyYW1zIGVxdWFsCi0JCQkJCX0gLy8gZW5kIGNvbXBhcmUgYWxsIHBhcmFtcwotCQkJCQlpZiAoZm91bmQpIC8vc2hvcnQgY2lyY3VpdCBvdXQgb2YgdGhpcyBsb29wIGFuZCByZXR1cm4gdGhlIHdpbm5lcgotCQkJCQkJcmV0dXJuIG1ldGhvZDsKLQkJCQl9IC8vIGVuZCBjb21wYXJlIGxlbmd0aHMKLQkJCX0gLy8gZW5kIGNvbXBhcmUgbmFtZXMKLQkJfSAvLyBlbmQgbG9vcCB0aHJvdWdoIGFsbCBtZXRob2RMaXN0Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIExpc3Qgb2YgU3RyaW5ncyB0aGF0IHJlcHJlc2VudCBNZXRob2RFbGVtZW50IHNpZ25hdHVyZXMgZnJvbSBtb3N0IGdlbmVyYWwgdG8gbW9zdCBzcGVjaWZpYy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcygpIHsKLQkJTGlzdCBtZXRob2RzLCBzaWduYXR1cmVzLCBzYW1lTmFtZXM7Ci0JCW1ldGhvZHMgPSBnZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJc2FtZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzaWduYXR1cmVzID0gbmV3IEFycmF5TGlzdChtZXRob2RzLnNpemUoKSArIDEpOwotCQlzaWduYXR1cmVzLmFkZChERUZBVUxUX01FVEhPRF9OQU1FKTsKLQkJSXRlcmF0b3IgaXQgPSBtZXRob2RzLml0ZXJhdG9yKCk7Ci0JCU1ldGhvZCBhTWV0aG9kOwotCQlTdHJpbmcgbWV0aG9kTmFtZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYU1ldGhvZCA9IChNZXRob2QpIGl0Lm5leHQoKTsKLQkJCW1ldGhvZE5hbWUgPSBhTWV0aG9kLmdldE5hbWUoKTsKLQkJCWlmIChzYW1lTmFtZXMuY29udGFpbnMobWV0aG9kTmFtZSkpIHsKLQkJCQlpZiAoIXNpZ25hdHVyZXMuY29udGFpbnMobWV0aG9kTmFtZSkpCi0JCQkJCXNpZ25hdHVyZXMuYWRkKG1ldGhvZE5hbWUpOwotCQkJfSBlbHNlCi0JCQkJc2FtZU5hbWVzLmFkZChtZXRob2ROYW1lKTsKLQkJCXNpZ25hdHVyZXMuYWRkKGFNZXRob2QuZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZSgpKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHNpZ25hdHVyZXMpOwotCQlyZXR1cm4gc2lnbmF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kIGdldE1ldGhvZEV4dGVuZGVkKFN0cmluZyBtZXRob2ROYW1lLCBMaXN0IHBhcmFtZXRlclR5cGVzKSB7Ci0JCWlmIChpc0ludGVyZmFjZSgpKQotCQkJcmV0dXJuIGZpbmRJbnRlcmZhY2VNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCWVsc2UKLQkJCXJldHVybiBmaW5kQ2xhc3NNZXRob2RFeHRlbmRlZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldE1ldGhvZHMoKSB7Ci0JCXJlZmxlY3RNZXRob2RzKCk7Ci0JCXJldHVybiBnZXRNZXRob2RzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZHNFeHRlbmRlZCgpIHsKLQkJTWFwIG1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOwotCQljb2xsZWN0TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHMsIGZhbHNlLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QobWV0aG9kcy52YWx1ZXMoKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIGdldE1ldGhvZHNFeHRlbmRlZFdpdGhGaWx0ZXJzKExpc3QsIExpc3QpIG9uIEphdmFDbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RzRXh0ZW5kZWRXaXRoRmlsdGVycyhMaXN0IGV4Y2x1ZGVkQ2xhc3NlcywgTGlzdCBleGNsdWRlZE1ldGhvZHMpIHsKLQkJTWFwIG1ldGhvZHMgPSBuZXcgSGFzaE1hcCgpOwotCQljb2xsZWN0TWV0aG9kc0V4dGVuZGVkKG1ldGhvZHMsIGZhbHNlLCBleGNsdWRlZENsYXNzZXMsIGV4Y2x1ZGVkTWV0aG9kcyk7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KG1ldGhvZHMudmFsdWVzKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IHRoaXMucHJpbUdldE5hbWUoKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIGVJc1Byb3h5KCkpIHsKLQkJCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuZ2V0VHlwZU5hbWUoZVByb3h5VVJJKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCBvZiBNZXRob2RzIHRoYXQgYmVnaW5zIHdpdGggQGFNZXRob2ROYW1lUHJlZml4IGFuZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEBleGNsdWRlZE5hbWVzIGxpc3QuIElmIEBhTWV0aG9kTmFtZVByZWZpeCBpcyBudWxsLCBhbGwgbWV0aG9kcyB3aWxsIGJlIHJldHVybmVkLgotCSAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRPbmx5U3BlY2lmaWNNZXRob2RzKFN0cmluZyBhTWV0aG9kTmFtZVByZWZpeCwgTGlzdCBleGNsdWRlZE5hbWVzKSB7Ci0JCUxpc3QgbWV0aG9kcywgc3BlY2lmaWM7Ci0JCW1ldGhvZHMgPSBnZXRNZXRob2RzRXh0ZW5kZWQoKTsKLQkJc3BlY2lmaWMgPSBuZXcgQXJyYXlMaXN0KG1ldGhvZHMuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXQgPSBtZXRob2RzLml0ZXJhdG9yKCk7Ci0JCU1ldGhvZCBhTWV0aG9kOwotCQlTdHJpbmcgbWV0aG9kTmFtZTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYU1ldGhvZCA9IChNZXRob2QpIGl0Lm5leHQoKTsKLQkJCW1ldGhvZE5hbWUgPSBhTWV0aG9kLmdldE5hbWUoKTsKLQkJCWlmIChhTWV0aG9kTmFtZVByZWZpeCAhPSBudWxsICYmIG1ldGhvZE5hbWUuc3RhcnRzV2l0aChhTWV0aG9kTmFtZVByZWZpeCkgJiYgZXhjbHVkZWROYW1lcyAhPSBudWxsICYmICFleGNsdWRlZE5hbWVzLmNvbnRhaW5zKG1ldGhvZE5hbWUpKQotCQkJCXNwZWNpZmljLmFkZChhTWV0aG9kKTsKLQkJfQotCQlyZXR1cm4gc3BlY2lmaWM7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldFBhY2thZ2VJbXBvcnRzKCkgewotCQlyZWZsZWN0QmFzZSgpOwotCQlyZXR1cm4gZ2V0UGFja2FnZUltcG9ydHNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQcmltaXRpdmUgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEphdmFEYXRhVHlwZSBnZXRQcmltaXRpdmUoKSB7Ci0JCVN0cmluZyBwcmltaXRpdmVOYW1lID0gZ2V0UHJpbWl0aXZlTmFtZSgpOwotCQlpZiAocHJpbWl0aXZlTmFtZSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSBlUmVzb3VyY2UoKTsKLQkJCXJldHVybiAoSmF2YURhdGFUeXBlKSBKYXZhQ2xhc3NJbXBsLnJlZmxlY3QocHJpbWl0aXZlTmFtZSwgcmVzLmdldFJlc291cmNlU2V0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycyNnZXRQcmltaXRpdmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRQcmltaXRpdmVJRCgpIHsKLQkJU3RyaW5nIG15TmFtZSA9IGdldFF1YWxpZmllZE5hbWUoKTsKLQkJaWYgKG15TmFtZS5lcXVhbHMoSU5URUdFUl9OQU1FKSkKLQkJCXJldHVybiBQUklNX0lOVEVHRVJfSUQ7Ci0JCWlmIChteU5hbWUuZXF1YWxzKEJPT0xFQU5fTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9CT09MRUFOX0lEOwotCQlpZiAobXlOYW1lLmVxdWFscyhCWVRFX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQllURV9JRDsKLQkJaWYgKG15TmFtZS5lcXVhbHMoU0hPUlRfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9TSE9SVF9JRDsKLQkJaWYgKG15TmFtZS5lcXVhbHMoTE9OR19OQU1FKSkKLQkJCXJldHVybiBQUklNX0xPTkdfSUQ7Ci0JCWlmIChteU5hbWUuZXF1YWxzKEZMT0FUX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fRkxPQVRfSUQ7Ci0JCWlmIChteU5hbWUuZXF1YWxzKERPVUJMRV9OQU1FKSkKLQkJCXJldHVybiBQUklNX0RPVUJMRV9JRDsKLQkJaWYgKG15TmFtZS5lcXVhbHMoQ0hBUkFDVEVSX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQ0hBUkFDVEVSX0lEOwotCQlyZXR1cm4gUFJJTV9OT1RfSUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmltaXRpdmUgbmFtZSBmb3IgdGhpcyB0eXBlIGlmIG9uZSBleGlzdHMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmltaXRpdmVOYW1lKCkgewotCQlTdHJpbmcgbXlOYW1lID0gZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQlpZiAobXlOYW1lLmVxdWFscyhJTlRFR0VSX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fSU5URUdFUl9OQU1FOwotCQlpZiAobXlOYW1lLmVxdWFscyhCT09MRUFOX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQk9PTEVBTl9OQU1FOwotCQlpZiAobXlOYW1lLmVxdWFscyhCWVRFX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fQllURV9OQU1FOwotCQlpZiAobXlOYW1lLmVxdWFscyhTSE9SVF9OQU1FKSkKLQkJCXJldHVybiBQUklNX1NIT1JUX05BTUU7Ci0JCWlmIChteU5hbWUuZXF1YWxzKExPTkdfTkFNRSkpCi0JCQlyZXR1cm4gUFJJTV9MT05HX05BTUU7Ci0JCWlmIChteU5hbWUuZXF1YWxzKEZMT0FUX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fRkxPQVRfTkFNRTsKLQkJaWYgKG15TmFtZS5lcXVhbHMoRE9VQkxFX05BTUUpKQotCQkJcmV0dXJuIFBSSU1fRE9VQkxFX05BTUU7Ci0JCWlmIChteU5hbWUuZXF1YWxzKENIQVJBQ1RFUl9OQU1FKSkKLQkJCXJldHVybiBQUklNX0NIQVJBQ1RFUl9OQU1FOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBtZXRob2QgbWF0Y2hpbmcgdGhlIG5hbWUsIGFuZCBub24tcmV0dXJuIHBhcmFtZXRlcnMgd2l0aCBmdWxseSBxdWFsaWZpZWQgdHlwZXMgbWF0Y2hpbmcgYWxsIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzLiBJdAotCSAqIHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRQdWJsaWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIExpc3QgcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgZ2V0UHVibGljTWV0aG9kcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBtZXRob2QgbWF0Y2hpbmcgdGhlIG5hbWUsIGFuZCBub24tcmV0dXJuIHBhcmFtZXRlcnMgd2l0aCBmdWxseSBxdWFsaWZpZWQgdHlwZXMgbWF0Y2hpbmcgYWxsIHRoZSB0eXBlcyBpbiB0aGUgbGlzdCwgaWYgaXQgZXhpc3RzLiBJdAotCSAqIHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuCi0JICovCi0JcHVibGljIE1ldGhvZCBnZXRQdWJsaWNNZXRob2RFeHRlbmRlZChTdHJpbmcgbWV0aG9kTmFtZSwgTGlzdCBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBtZXRob2RzLCBpdCB3aWxsIG5vdCBnbyB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQdWJsaWNNZXRob2RzKCkgewotCQlMaXN0IHB1YmxpY01ldGhvZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdGhlTWV0aG9kcyA9IGdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVNZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2QgbSA9IChNZXRob2QpIHRoZU1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUNfTElURVJBTCA9PSBtLmdldEphdmFWaXNpYmlsaXR5KCkpCi0JCQkJcHVibGljTWV0aG9kcy5hZGQobSk7Ci0JCX0KLQkJcmV0dXJuIHB1YmxpY01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBwdWJsaWMgbWV0aG9kcywgaW5jbHVkaW5nIHRob3NlIGZyb20gc3VwZXJ0eXBlcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKSB7Ci0JCU1hcCBtZXRob2RzID0gbmV3IEhhc2hNYXAoKTsKLQkJY29sbGVjdE1ldGhvZHNFeHRlbmRlZChtZXRob2RzLCB0cnVlLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QobWV0aG9kcy52YWx1ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGZpbHRlcmVkIGxpc3Qgb24gdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcywgaGF2aW5nIGEgbmFtZSBlcXVhbCB0byB0aGF0IG9mIHRoZSBwYXJhbWV0ZXIuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJTGlzdCBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRoZU1ldGhvZHMgPSBnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGVNZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2QgbSA9IChNZXRob2QpIHRoZU1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG0uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlwdWJsaWNNZXRob2RzLmFkZChtKTsKLQkJfQotCQlyZXR1cm4gcHVibGljTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvbiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLCBoYXZpbmcgYSBuYW1lIGVxdWFsIHRvIHRoYXQgb2YgdGhlIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQdWJsaWNNZXRob2RzTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJTGlzdCBwdWJsaWNNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRoZU1ldGhvZHMgPSBnZXRQdWJsaWNNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlTWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kIG0gPSAoTWV0aG9kKSB0aGVNZXRob2RzLmdldChpKTsKLQkJCWlmIChtLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcHVibGljTWV0aG9kcy5hZGQobSk7Ci0JCX0KLQkJcmV0dXJuIHB1YmxpY01ldGhvZHM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGVJc1Byb3h5KCkpIHsKLQkJCXJlc3VsdCA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5nZXRGdWxsVHlwZU5hbWUoZVByb3h5VVJJKCkpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gcHJpbUdldFF1YWxpZmllZE5hbWUoKTsKLQkJfQotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZSgnJCcsICcuJyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgdXNlZCBieSBwZW9wbGUgdGhhdCBuZWVkIHRvIGdldCB0aGUgcXVhbGlmaWVkIG5hbWUgdXNlZCBmb3IgcmVmbGVjdGlvbi4gVHlwaWNhbGx5IGJlYW4gaW5mbyB3b3VsZCBuZWVkIHRvIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKSB7Ci0JCXJldHVybiBwcmltR2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFJlYWRBZGFwdG9yIHdoaWNoIGNhbiByZWZsZWN0IG91ciBKYXZhIHByb3BlcnRpZXMKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIFJlYWRBZGFwdG9yIGdldFJlYWRBZGFwdGVyKCkgewotCQkvLyBOZWVkIHRvIHN5bmMgYmVjYXVzZSBub3cgaW4gYSBtdWx0aS10aHJlYWQgZW52LgotCQlyZXR1cm4gKFJlYWRBZGFwdG9yKSBFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIodGhpcywgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RfUkVGTEVDVEVEID0gMHgwLCBSRUZMRUNURURfQkFTRSA9IDB4MSwgUkVGTEVDVEVEX01FVEhPRFMgPSAweDIsIFJFRkxFQ1RFRF9GSUVMRFMgPSAweDQ7Ci0KLQlwcm90ZWN0ZWQgaW50IHJlZmxlY3Rpb25TdGF0dXMgPSBOT1RfUkVGTEVDVEVEOwotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdEJhc2UoKSB7Ci0JCS8vIFdlIG9ubHkgd2FudCB0aGUgdGVzdGluZyBvZiB0aGUgaGFzUmVmbGVjdGVkIGFuZCBnZXQgcmVhZGFkYXB0ZXIgdG8gYmUgc3luYyh0aGlzKSBzbyB0aGF0Ci0JCS8vIGl0IGlzIHNob3J0IGFuZCBubyBkZWFkbG9jayBwb3NzaWJpbGl0eSAodGhpcyBpcyBiZWNhdXNlIHRoZSB0aGUgbWV0aG9kIHJlZmxlY3Rpb24gYWRhcHRlciBtYXkgZ28KLQkJLy8gYmFjayB0byB0aGUgY29udGFpbmluZyBqYXZhIGNsYXNzIHRvIGdldCBpdHMgcmVmbGVjdGlvbiBhZGFwdGVyLCB3aGljaCB3b3VsZCBsb2NrIG9uIGl0c2VsZi4gU28KLQkJLy8gd2UgbmVlZCB0byBrZWVwIHRoZSBzZWN0aW9ucyB0aGF0IGFyZSBzeW5jKHRoaXMpIHRvIG5vdCBiZSBkZWFkbG9ja2FibGUgYnkgbm90IGRvaW5nIHNpZ25pZmljYW50IHdvcmsKLQkJLy8gZHVyaW5nIHRoZSBzeW5jLgotCQlSZWFkQWRhcHRvciByZWFkQWRhcHRvciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKChyZWZsZWN0aW9uU3RhdHVzICYgUkVGTEVDVEVEX0JBU0UpID09IDApIHsKLQkJCQlyZWFkQWRhcHRvciA9IGdldFJlYWRBZGFwdGVyKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlYWRBZGFwdG9yICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc2V0UmVmbGVjdGVkID0gcmVhZEFkYXB0b3IucmVmbGVjdFZhbHVlc0lmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSBSRUZMRUNURURfQkFTRTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RGaWVsZHMoKSB7Ci0JCS8vIFdlIG9ubHkgd2FudCB0aGUgdGVzdGluZyBvZiB0aGUgaGFzUmVmbGVjdGVkIGFuZCBnZXQgcmVhZGFkYXB0ZXIgdG8gYmUgc3luYyh0aGlzKSBzbyB0aGF0Ci0JCS8vIGl0IGlzIHNob3J0IGFuZCBubyBkZWFkbG9jayBwb3NzaWJpbGl0eSAodGhpcyBpcyBiZWNhdXNlIHRoZSB0aGUgbWV0aG9kIHJlZmxlY3Rpb24gYWRhcHRlciBtYXkgZ28KLQkJLy8gYmFjayB0byB0aGUgY29udGFpbmluZyBqYXZhIGNsYXNzIHRvIGdldCBpdHMgcmVmbGVjdGlvbiBhZGFwdGVyLCB3aGljaCB3b3VsZCBsb2NrIG9uIGl0c2VsZi4gU28KLQkJLy8gd2UgbmVlZCB0byBrZWVwIHRoZSBzZWN0aW9ucyB0aGF0IGFyZSBzeW5jKHRoaXMpIHRvIG5vdCBiZSBkZWFkbG9ja2FibGUgYnkgbm90IGRvaW5nIHNpZ25pZmljYW50IHdvcmsKLQkJLy8gZHVyaW5nIHRoZSBzeW5jLgotCQlSZWFkQWRhcHRvciByZWFkQWRhcHRvciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJaWYgKChyZWZsZWN0aW9uU3RhdHVzICYgUkVGTEVDVEVEX0ZJRUxEUykgPT0gMCkgewotCQkJCXJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAocmVhZEFkYXB0b3IgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZXRSZWZsZWN0ZWQgPSAoKElKYXZhQ2xhc3NBZGFwdG9yKSByZWFkQWRhcHRvcikucmVmbGVjdEZpZWxkc0lmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSAoUkVGTEVDVEVEX0ZJRUxEUyB8IFJFRkxFQ1RFRF9CQVNFKTsgLy8gV2UgY2FuIGJlIGNlcnRhaW4gYmFzZSB3aWxsIGJlIGRvbmUgYnkgcmVmbGVjdCBmaWVsZHMgaWYgbm90IGFscmVhZHkKLQkJCQkJCQkJCQkJCQkJCQkJCQkgLy8gZG9uZS4KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZmxlY3RNZXRob2RzKCkgewotCQkvLyBXZSBvbmx5IHdhbnQgdGhlIHRlc3Rpbmcgb2YgdGhlIGhhc1JlZmxlY3RlZCBhbmQgZ2V0IHJlYWRhZGFwdGVyIHRvIGJlIHN5bmModGhpcykgc28gdGhhdAotCQkvLyBpdCBpcyBzaG9ydCBhbmQgbm8gZGVhZGxvY2sgcG9zc2liaWxpdHkgKHRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlIG1ldGhvZCByZWZsZWN0aW9uIGFkYXB0ZXIgbWF5IGdvCi0JCS8vIGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgamF2YSBjbGFzcyB0byBnZXQgaXRzIHJlZmxlY3Rpb24gYWRhcHRlciwgd2hpY2ggd291bGQgbG9jayBvbiBpdHNlbGYuIFNvCi0JCS8vIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2VjdGlvbnMgdGhhdCBhcmUgc3luYyh0aGlzKSB0byBub3QgYmUgZGVhZGxvY2thYmxlIGJ5IG5vdCBkb2luZyBzaWduaWZpY2FudCB3b3JrCi0JCS8vIGR1cmluZyB0aGUgc3luYy4KLQkJUmVhZEFkYXB0b3IgcmVhZEFkYXB0b3IgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICgocmVmbGVjdGlvblN0YXR1cyAmIFJFRkxFQ1RFRF9NRVRIT0RTKSA9PSAwKSB7Ci0JCQkJcmVhZEFkYXB0b3IgPSBnZXRSZWFkQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCWlmIChyZWFkQWRhcHRvciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHNldFJlZmxlY3RlZCA9ICgoSUphdmFDbGFzc0FkYXB0b3IpIHJlYWRBZGFwdG9yKS5yZWZsZWN0TWV0aG9kc0lmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSAoUkVGTEVDVEVEX01FVEhPRFMgfCBSRUZMRUNURURfQkFTRSk7IC8vIFdlIGNhbiBiZSBjZXJ0YWluIGJhc2Ugd2lsbCBiZSBkb25lIGJ5IHJlZmxlY3QgZmllbGRzIGlmIG5vdCBhbHJlYWR5Ci0JCQkJCQkJCQkJCQkJCQkJCQkJICAvLyBkb25lLgotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEphdmFDbGFzcyBnZXRTdXBlcnR5cGUoKSB7Ci0JCS8vIElmIHRoaXMgaXMgYW4gaW50ZXJmYWNlLCB0aGVyZSBpcyBubyBzdXBlcnR5cGUuIEhvd2V2ZXIsIHRoZSBlU3VwZXJUeXBlcyBJUyBmaWxsZWQgaW4gd2l0aCBhbnkgaW50ZXJmYWNlIHRoYXQgdGhpcyBleHRlbmRzLiAKLQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBsaXN0ID0gZ2V0RVN1cGVyVHlwZXMoKTsKLQkJcmV0dXJuICghbGlzdC5pc0VtcHR5KCkpID8gKEphdmFDbGFzcykgbGlzdC5nZXQoMCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGVzdCB3aGV0aGVyIHRoZSByZWNlaXZlciBpbXBsZW1lbnRzIHRoZSBwYXNzZWQgaW50ZXJmYWNlIChvciBvbmUgb2YgaXRzIHN1cGVydHlwZXMpLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGltcGxlbWVudHNJbnRlcmZhY2UoSmF2YUNsYXNzIGludGVyZmFjZVR5cGUpIHsKLQkJaWYgKHRoaXMgPT0gaW50ZXJmYWNlVHlwZSkKLQkJCXJldHVybiB0cnVlOwotCQlFTGlzdCBpbXBsZW1lbnRlZCA9IGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JCUphdmFDbGFzcyBhbkludGVyZmFjZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBsZW1lbnRlZC5zaXplKCk7IGkrKykgewotCQkJYW5JbnRlcmZhY2UgPSAoSmF2YUNsYXNzKSBpbXBsZW1lbnRlZC5nZXQoaSk7Ci0JCQlpZiAoYW5JbnRlcmZhY2UuaW1wbGVtZW50c0ludGVyZmFjZShpbnRlcmZhY2VUeXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZ2V0U3VwZXJ0eXBlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRTdXBlcnR5cGUoKS5pbXBsZW1lbnRzSW50ZXJmYWNlKGludGVyZmFjZVR5cGUpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHNob3dpbmcgb3VyIGRldGFpbHMuCi0JICovCi0JcHVibGljIFN0cmluZyBpbmZvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgb3V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyB0cmlwIGNsYXNzIHJlZmxlY3Rpb24KLQkJLy9GQiB0aGlzLmVHZXQoSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFDbGFzc19QdWJsaWMoKSk7Ci0JCXJlZmxlY3RCYXNlKCk7IC8vRkIKLQkJb3V0LmFwcGVuZCgiSmF2YSBjbGFzczogIiArIGdldFF1YWxpZmllZE5hbWUoKSArICJcbiIpOwotCQlvdXQuYXBwZW5kKCIgIHN1cGVyY2xhc3M6ICIgKyB0aGlzLmdldFN1cGVydHlwZSgpICsgIlxuIik7Ci0JCUVMaXN0IGZpZWxkcyA9IGdldEZpZWxkcygpOwotCQlGaWVsZCBmaWVsZDsKLQkJaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0JCQlvdXQuYXBwZW5kKCIgIEZpZWxkczpcbiIpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlmaWVsZCA9IChGaWVsZCkgZmllbGRzLmdldChpKTsKLQkJCQlvdXQuYXBwZW5kKCIgICAgIiArICgoSmF2YUhlbHBlcnMpIGZpZWxkLmdldEVUeXBlKCkpLmdldEphdmFOYW1lKCkgKyAiICIgKyBmaWVsZC5nZXROYW1lKCkgKyAiXG4iKTsKLQkJCX0KLQkJfQotCQlFTGlzdCBtZXRob2RzID0gZ2V0TWV0aG9kcygpOwotCQlNZXRob2QgbWV0aG9kOwotCQlpZiAobWV0aG9kcy5zaXplKCkgPiAwKSB7Ci0JCQlvdXQuYXBwZW5kKCIgIE1ldGhvZHM6XG4iKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJCW1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJCS8vIHRyaXAgbWV0aG9kIHJlZmxlY3Rpb24KLQkJCQltZXRob2QuaXNTdGF0aWMoKTsKLQkJCQlpZiAobWV0aG9kLmdldFJldHVyblR5cGUoKSAhPSBudWxsKQotCQkJCQlvdXQuYXBwZW5kKCIgICAgIiArIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuZ2V0SmF2YU5hbWUoKSArICIgIik7Ci0JCQkJZWxzZQotCQkJCQlvdXQuYXBwZW5kKCIgICAgdm9pZCAiKTsKLQkJCQlvdXQuYXBwZW5kKG1ldGhvZC5nZXROYW1lKCkgKyAiKCIpOwotCQkJCUVMaXN0IHBhcm1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQkJCQlKYXZhUGFyYW1ldGVyIHBhcm07Ci0JCQkJaWYgKHBhcm1zLnNpemUoKSA+IDApIHsKLQkJCQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHBhcm1zLnNpemUoKTsgaWkrKykgewotCQkJCQkJcGFybSA9IChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoaWkpOwotCQkJCQkJLy9GQiBpZiAoIXBhcm0uaXNSZXR1cm4oKSkgewotCQkJCQkJb3V0LmFwcGVuZCgoKEphdmFIZWxwZXJzKSBwYXJtLmdldEVUeXBlKCkpLmdldEphdmFOYW1lKCkgKyAiICIgKyBwYXJtLmdldE5hbWUoKSk7Ci0JCQkJCQlpZiAoaWkgPCBwYXJtcy5zaXplKCkgLSAxKQotCQkJCQkJCW91dC5hcHBlbmQoIiwgIik7Ci0JCQkJCQkvL0ZCIH0KLQkJCQkJfQotCQkJCX0KLQkJCQlvdXQuYXBwZW5kKCIpXG4iKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3V0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGlzIGNsYXNzIGluaGVyaXRzIGZyb20gdGhlIHBhc3NlZCBpbiBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmhlcml0c0Zyb20oSmF2YUNsYXNzIGphdmFDbGFzcykgewotCQlpZiAodGhpcyA9PSBqYXZhQ2xhc3MpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoZ2V0U3VwZXJ0eXBlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRTdXBlcnR5cGUoKS5pbmhlcml0c0Zyb20oamF2YUNsYXNzKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDYW4gYW4gb2JqZWN0IG9mIHRoZSBwYXNzZWQgaW4gY2xhc3MgYmUgYXNzaWduZWQgdG8gYW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MuIEluIG90aGVyIHdvcmRzIGlzIHRoaXMgY2xhc3MgYSBzdXBlcnR5cGUgb2YgdGhlIHBhc3NlZCBpbiBjbGFzcywKLQkgKiBvciBpcyBpdCBzdXBlcmludGVyZmFjZSBvZiBpdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKEVDbGFzc2lmaWVyIGFDbGFzcykgewotCQlpZiAoYUNsYXNzIGluc3RhbmNlb2YgSmF2YUNsYXNzKSB7Ci0JCQlKYXZhQ2xhc3MgdGhlQ2xhc3MgPSAoSmF2YUNsYXNzKSBhQ2xhc3M7Ci0JCQkvLyBJZiBlaXRoZXIgdGhpcyBjbGFzcyBvciBhQ2xhc3Mga2luZCBpcyB1bmtub3duIHRoZW4gaXQgaXNuJ3QgYXNzaWduYWJsZUZyb20uCi0JCQlpZiAoZ2V0S2luZCgpID09IFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMIHx8IHRoZUNsYXNzLmdldEtpbmQoKSA9PSBUeXBlS2luZC5VTkRFRklORURfTElURVJBTCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBJZiB0aGUgImFDbGFzcyIgaXMgbm90IGEgSmF2YUNsYXNzIChpLmUuIGl0IGlzIGVpdGhlciBhIEphdmFEYXRhdHlwZSBvcgotCQkJLy8gc29tZSBvdGhlciBraW5kIG9mIE1PRiBjbGFzc2lmaWVyKSwgdGhlbiBpdCBjYW5ub3QgYmUKLQkJCS8vIGFzc2lnbmVkIHRvIHNvbWV0aGluZyBvZiB0aGlzIGNsYXNzLgotCQkJaWYgKGdldEtpbmQoKSAhPSBUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCkKLQkJCQlpZiAodGhlQ2xhc3MuZ2V0S2luZCgpICE9IFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMKQotCQkJCQlyZXR1cm4gdGhlQ2xhc3MuaW5oZXJpdHNGcm9tKHRoaXMpOwotCQkJCWVsc2UgewotCQkJCQkvLyBhQ2xhc3MgaXMgYW4gaW50ZXJmYWNlLCBzbyBpdCBpcyBhc3NpZ25hYmxlIG9ubHkgaWYKLQkJCQkJLy8gInRoaXMiIGlzICJqYXZhLmxhbmcuT2JqZWN0Ii4KLQkJCQkJcmV0dXJuIGdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5PYmplY3QiKTsKLQkJCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRoZUNsYXNzLmltcGxlbWVudHNJbnRlcmZhY2UodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIERvZXMgdGhpcyB0eXBlIGV4aXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhpc3RpbmdUeXBlKCkgewotCQkvLyBUT0RPOiBUZW1wb3JhcnksIGluZWZmaWNpZW50IGltcGxlbWVudGF0aW9uCi0JCUphdmFSZWZsZWN0aW9uQWRhcHRvciBhZGFwdGVyID0gKEphdmFSZWZsZWN0aW9uQWRhcHRvcikgZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJICAgIHJldHVybiAoYWRhcHRlcikuaGFzUmVmbGVjdGlvblNvdXJjZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2VlIGlmIHRoaXMgaXMgdmFsaWQgb2JqZWN0IG9mIHRoaXMgdHlwZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbmNlKE9iamVjdCBvKSB7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgSUluc3RhbnRpYXRpb25JbnN0YW5jZSA/IGlzQXNzaWduYWJsZUZyb20oKChJSW5zdGFudGlhdGlvbkluc3RhbmNlKSBvKS5nZXRKYXZhVHlwZSgpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIElzIHRoaXMgYW4gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gZ2V0S2luZCgpID09IFR5cGVLaW5kLklOVEVSRkFDRV9MSVRFUkFMOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTmVzdGVkKCkgewotCQlyZXR1cm4gZ2V0RGVjbGFyaW5nQ2xhc3MoKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGxpc3Rpbmcgb3VyIGZpZWxkcywgaW5jbHVkaW5nIGluaGVyaXRlZCBmaWVsZHMuIFRoZSBmaWVsZCByZWxhdGlvbnNoaXAgaXMgZGVyaXZlZCBmcm9tIGNvbnRlbnRzLiBUaGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24KLQkgKiB0aGUgYXNzdW1wdGlvbiB0aGF0IHN1cGVydHlwZXMgYWJvdmUgSmF2YUNsYXNzIHdpbGwgaG9sZCBBdHRyaWJ1dGVzIHJhdGhlciB0aGFuIEZpZWxkcy4KLQkgKi8KLQlwdWJsaWMgRmllbGRbXSBsaXN0RmllbGRFeHRlbmRlZCgpIHsKLQkJTGlzdCBmaWVsZHMgPSBnZXRGaWVsZHNFeHRlbmRlZCgpOwotCQlGaWVsZFtdIHJlc3VsdCA9IG5ldyBGaWVsZFtmaWVsZHMuc2l6ZSgpXTsKLQkJZmllbGRzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyBvdXIgTWV0aG9kcywgaW5jbHVkaW5nIGluaGVyaXRlZCBtZXRob2RzLiBUaGUgbWV0aG9kIHJlbGF0aW9uc2hpcCBpcyBkZXJpdmVkIGZyb20gY29udGVudHMuIFRoaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kcwotCSAqIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgc3VwZXJ0eXBlcyBhYm92ZSBKYXZhQ2xhc3Mgd2lsbCBob2xkIE9wZXJhdGlvbnMgcmF0aGVyIHRoYW4gTWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kW10gbGlzdE1ldGhvZEV4dGVuZGVkKCkgewotCQlqYXZhLnV0aWwuTGlzdCBtZXRob2RzID0gZ2V0TWV0aG9kc0V4dGVuZGVkKCk7Ci0JCU1ldGhvZFtdIHJlc3VsdCA9IG5ldyBNZXRob2RbbWV0aG9kcy5zaXplKCldOwotCQltZXRob2RzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBpbnRlcm5hbCByZWZsZWN0aW9uIGRvIG5vdCB1c2UuCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0TmFtZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHJlcXVpcmVkIGZvciBpbnRlcm5hbCByZWZsZWN0aW9uIGRvIG5vdCB1c2UuCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOwotCQlpZiAoZUlzUHJveHkoKSkgewotCQkJcmVzdWx0ID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmdldEZ1bGxUeXBlTmFtZShlUHJveHlVUkkoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlKYXZhUGFja2FnZSBwYWNrID0gZ2V0SmF2YVBhY2thZ2UoKTsKLQkJCWlmIChwYWNrICE9IG51bGwgJiYgcGFjay5nZXRQYWNrYWdlTmFtZSgpLmxlbmd0aCgpICE9IDApCi0JCQkJcmVzdWx0ID0gcGFjay5nZXRQYWNrYWdlTmFtZSgpICsgIi4iICsgKChKYXZhUmVmRmFjdG9yeUltcGwpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRSkucHJpbUdldFR5cGVOYW1lKHRoaXMucHJpbUdldE5hbWUoKSk7Ci0JCQllbHNlCi0JCQkJcmVzdWx0ID0gdGhpcy5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiByZWZsZWN0IC0gcmVmbGVjdCBhIEphdmFDbGFzcyBmb3IgYSBnaXZlbiBxdWFsaWZpZWQgbmFtZS4gSWYgdGhlIHBhY2thZ2Ugb3IgY2xhc3MgZG9lcyBub3QgZXhpc3QsIG9uZSB3aWxsIGJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUgcmVmbGVjdGlvbgotCSAqIG1lY2hhbmlzbS4gTG9va3VwIHRoZSBKYXZhQ2xhc3MgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHBhc3NlZCBvYmplY3QsIGhhbmRsaW5nIHNvbWUgZXJyb3IgY2FzZXMuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNyZWZsZWN0VHlwZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiAgCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyByZWZsZWN0KFN0cmluZyBhUXVhbGlmaWVkTmFtZSwgRU9iamVjdCByZWxhdGVkT2JqZWN0KSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoYVF1YWxpZmllZE5hbWUsIHJlbGF0ZWRPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YUNsYXNzIGZvciBhIGdpdmVuIHF1YWxpZmllZCBuYW1lLiBJZiB0aGUgcGFja2FnZSBvciBjbGFzcyBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoIHRoZSByZWZsZWN0aW9uCi0JICogbWVjaGFuaXNtLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUhlbHBlcnMgcmVmbGVjdChTdHJpbmcgYVF1YWxpZmllZE5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKGFRdWFsaWZpZWROYW1lLCBzZXQpOwotCX0KLQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YUNsYXNzIGZvciBhIGdpdmVuIHBhY2thZ2UgbmFtZSBvciBjbGFzcyBuYW1lLiBJZiB0aGUgcGFja2FnZSBvciBjbGFzcyBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoIHRoZQotCSAqIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyByZWZsZWN0KFN0cmluZyBhUGFja2FnZU5hbWUsIFN0cmluZyBhQ2xhc3NOYW1lLCBSZXNvdXJjZVNldCBzZXQpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShhUGFja2FnZU5hbWUsIGFDbGFzc05hbWUsIHNldCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3VwZXJ0eXBlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB0aHJvd3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiB7Ci0JCXZhbGlkYXRlU3VwZXJ0eXBlKGFKYXZhQ2xhc3MpOwotCQlMaXN0IHMgPSBzdXBlci5nZXRFU3VwZXJUeXBlcygpOwotCQlzLmNsZWFyKCk7Ci0JCWlmIChhSmF2YUNsYXNzICE9IG51bGwpCi0JCQlzLmFkZChhSmF2YUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpZWxkcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdGlhbGl6ZXJzKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlY2xhcmVkQ2xhc3NlcygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlpZiAoZGVjbGFyaW5nQ2xhc3MgIT0gbnVsbCkKLQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRlY2xhcmluZ0NsYXNzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTLCBKYXZhQ2xhc3MuY2xhc3MsIG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldERlY2xhcmluZ0NsYXNzKChKYXZhQ2xhc3Mpb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEZpZWxkcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdGlhbGl6ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlY2xhcmVkQ2xhc3NlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXREZWNsYXJpbmdDbGFzcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXZlbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19LSU5EOgotCQkJCXJldHVybiBnZXRLaW5kKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX1BVQkxJQzoKLQkJCQlyZXR1cm4gaXNQdWJsaWMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJTkFMOgotCQkJCXJldHVybiBpc0ZpbmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTVBMRU1FTlRTX0lOVEVSRkFDRVM6Ci0JCQkJcmV0dXJuIGdldEltcGxlbWVudHNJbnRlcmZhY2VzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVDoKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NJbXBvcnQoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTOgotCQkJCXJldHVybiBnZXRQYWNrYWdlSW1wb3J0cygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFM6Ci0JCQkJcmV0dXJuIGdldEZpZWxkcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRNZXRob2RzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbGl6ZXJzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGdldERlY2xhcmVkQ2xhc3NlcygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREZWNsYXJpbmdDbGFzcygpOwotCQkJCXJldHVybiBiYXNpY0dldERlY2xhcmluZ0NsYXNzKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0pBVkFfUEFDS0FHRToKLQkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEphdmFQYWNrYWdlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0SmF2YVBhY2thZ2UoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTOgotCQkJCXJldHVybiBnZXRFdmVudHMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQUxMX0VWRU5UUzoKLQkJCQlyZXR1cm4gZ2V0QWxsRXZlbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fS0lORDoKLQkJCQlzZXRLaW5kKChUeXBlS2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QVUJMSUM6Ci0JCQkJc2V0UHVibGljKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklOQUw6Ci0JCQkJc2V0RmluYWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTVBMRU1FTlRTX0lOVEVSRkFDRVM6Ci0JCQkJZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5jbGVhcigpOwotCQkJCWdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVDoKLQkJCQlnZXRDbGFzc0ltcG9ydCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2xhc3NJbXBvcnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTOgotCQkJCWdldFBhY2thZ2VJbXBvcnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRQYWNrYWdlSW1wb3J0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFM6Ci0JCQkJZ2V0RmllbGRzKCkuY2xlYXIoKTsKLQkJCQlnZXRGaWVsZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTUVUSE9EUzoKLQkJCQlnZXRNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzoKLQkJCQlnZXRJbml0aWFsaXplcnMoKS5jbGVhcigpOwotCQkJCWdldEluaXRpYWxpemVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTOgotCQkJCWdldERlY2xhcmVkQ2xhc3NlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVjbGFyZWRDbGFzc2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlzZXREZWNsYXJpbmdDbGFzcygoSmF2YUNsYXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VWRU5UUzoKLQkJCQlnZXRFdmVudHMoKS5jbGVhcigpOwotCQkJCWdldEV2ZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19BTExfRVZFTlRTOgotCQkJCWdldEFsbEV2ZW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0QWxsRXZlbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19LSU5EOgotCQkJCXNldEtpbmQoS0lORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QVUJMSUM6Ci0JCQkJc2V0UHVibGljKFBVQkxJQ19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSU5BTDoKLQkJCQlzZXRGaW5hbChGSU5BTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTVBMRU1FTlRTX0lOVEVSRkFDRVM6Ci0JCQkJZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fQ0xBU1NfSU1QT1JUOgotCQkJCWdldENsYXNzSW1wb3J0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX1BBQ0tBR0VfSU1QT1JUUzoKLQkJCQlnZXRQYWNrYWdlSW1wb3J0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSUVMRFM6Ci0JCQkJZ2V0RmllbGRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJZ2V0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19JTklUSUFMSVpFUlM6Ci0JCQkJZ2V0SW5pdGlhbGl6ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJZ2V0RGVjbGFyZWRDbGFzc2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUzoKLQkJCQlzZXREZWNsYXJpbmdDbGFzcygoSmF2YUNsYXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRVZFTlRTOgotCQkJCWdldEV2ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19BTExfRVZFTlRTOgotCQkJCWdldEFsbEV2ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0tJTkQ6Ci0JCQkJcmV0dXJuIGtpbmQgIT0gS0lORF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUFVCTElDOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFBVQkxJQ19FRkxBRykgIT0gMCkgIT0gUFVCTElDX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19GSU5BTDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCkgIT0gRklOQUxfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUzoKLQkJCQlyZXR1cm4gaW1wbGVtZW50c0ludGVyZmFjZXMgIT0gbnVsbCAmJiAhaW1wbGVtZW50c0ludGVyZmFjZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19DTEFTU19JTVBPUlQ6Ci0JCQkJcmV0dXJuIGNsYXNzSW1wb3J0ICE9IG51bGwgJiYgIWNsYXNzSW1wb3J0LmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTOgotCQkJCXJldHVybiBwYWNrYWdlSW1wb3J0cyAhPSBudWxsICYmICFwYWNrYWdlSW1wb3J0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJRUxEUzoKLQkJCQlyZXR1cm4gZmllbGRzICE9IG51bGwgJiYgIWZpZWxkcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFM6Ci0JCQkJcmV0dXJuIG1ldGhvZHMgIT0gbnVsbCAmJiAhbWV0aG9kcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUzoKLQkJCQlyZXR1cm4gaW5pdGlhbGl6ZXJzICE9IG51bGwgJiYgIWluaXRpYWxpemVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGRlY2xhcmVkQ2xhc3NlcyAhPSBudWxsICYmICFkZWNsYXJlZENsYXNzZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19ERUNMQVJJTkdfQ0xBU1M6Ci0JCQkJcmV0dXJuIGRlY2xhcmluZ0NsYXNzICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0pBVkFfUEFDS0FHRToKLQkJCQlyZXR1cm4gYmFzaWNHZXRKYXZhUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0VWRU5UUzoKLQkJCQlyZXR1cm4gZXZlbnRzICE9IG51bGwgJiYgIWV2ZW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0FMTF9FVkVOVFM6Ci0JCQkJcmV0dXJuICFnZXRBbGxFdmVudHMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBwYXNzZWQgSmF2YUNsYXNzIGlzIGEgdmFsaWQgc3VwZXIgY2xhc3MgKGkuZS4sIGl0IGRvZXMgbm90IGNyZWF0ZSBhbnkgY3ljbGVzIGluIHRoZSBpbmhlcml0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYUphdmFDbGFzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU3VwZXJ0eXBlKEphdmFDbGFzcyBhSmF2YUNsYXNzKSB0aHJvd3MgSW5oZXJpdGFuY2VDeWNsZUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNWYWxpZFN1cGVydHlwZShhSmF2YUNsYXNzKSkKLQkJCXRocm93IG5ldyBJbmhlcml0YW5jZUN5Y2xlRXhjZXB0aW9uKHRoaXMsIGFKYXZhQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRTdXBlcnR5cGUoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIHsKLQkJaWYgKGFKYXZhQ2xhc3MgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZXF1YWxzKGFKYXZhQ2xhc3MpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiBleHRlbmRlZElzVmFsaWRTdXBlcnR5cGUoZ2V0U3VidHlwZXMoKSwgYUphdmFDbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN1YnR5cGVzCi0JICogQHBhcmFtIGFKYXZhQ2xhc3MKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5kZWRJc1ZhbGlkU3VwZXJ0eXBlKExpc3Qgc3VidHlwZXMsIEphdmFDbGFzcyBhSmF2YUNsYXNzKSB7Ci0JCWlmICghYmFzaWNJc1ZhbGlkU3VwZXJ0eXBlKHN1YnR5cGVzLCBhSmF2YUNsYXNzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSmF2YUNsYXNzIHN1YnR5cGU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VidHlwZXMuc2l6ZSgpOyBpKyspIHsKLQkJCXN1YnR5cGUgPSAoSmF2YUNsYXNzKSBzdWJ0eXBlcy5nZXQoaSk7Ci0JCQlpZiAoIXN1YnR5cGUuaXNWYWxpZFN1cGVydHlwZShhSmF2YUNsYXNzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJhc2ljSXNWYWxpZFN1cGVydHlwZShMaXN0IHN1YnR5cGVzLCBKYXZhQ2xhc3MgYUphdmFDbGFzcykgewotCQlKYXZhQ2xhc3Mgc3VidHlwZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWJ0eXBlcy5zaXplKCk7IGkrKykgewotCQkJc3VidHlwZSA9IChKYXZhQ2xhc3MpIHN1YnR5cGVzLmdldChpKTsKLQkJCWlmIChzdWJ0eXBlLmVxdWFscyhhSmF2YUNsYXNzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0U3VidHlwZXMoKSB7Ci0JCXJldHVybiBnZXRFU3VwZXJBZGFwdGVyKCkuZ2V0U3ViY2xhc3NlcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICIoIiArIGdldFF1YWxpZmllZE5hbWUoKSArICIpIjsKLQl9Ci0KLQlwdWJsaWMgVHlwZUtpbmQgZ2V0S2luZCgpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGdldEtpbmRHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLaW5kKFR5cGVLaW5kIG5ld0tpbmQpIHsKLQkJVHlwZUtpbmQgb2xkS2luZCA9IGtpbmQ7Ci0JCWtpbmQgPSBuZXdLaW5kID09IG51bGwgPyBLSU5EX0VERUZBVUxUIDogbmV3S2luZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fS0lORCwgb2xkS2luZCwga2luZCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHVibGljKCkgewotCQlyZWZsZWN0QmFzZSgpOwotCQlyZXR1cm4gaXNQdWJsaWNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWMoYm9vbGVhbiBuZXdQdWJsaWMpIHsKLQkJYm9vbGVhbiBvbGRQdWJsaWMgPSAoZUZsYWdzICYgUFVCTElDX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3UHVibGljKSBlRmxhZ3MgfD0gUFVCTElDX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+UFVCTElDX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19QVUJMSUMsIG9sZFB1YmxpYywgbmV3UHVibGljKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIGlzRmluYWxHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5hbChib29sZWFuIG5ld0ZpbmFsKSB7Ci0JCWJvb2xlYW4gb2xkRmluYWwgPSAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdGaW5hbCkgZUZsYWdzIHw9IEZJTkFMX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RklOQUxfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0ZJTkFMLCBvbGRGaW5hbCwgbmV3RmluYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHlwZUtpbmQgZ2V0S2luZEdlbigpIHsKLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaWNHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgUFVCTElDX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmluYWxHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEluaXRpYWxpemVycygpIHsKLQkJaWYgKGluaXRpYWxpemVycyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChJbml0aWFsaXplci5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fSU5JVElBTElaRVJTLAotCQkJCQlKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUl9fSkFWQV9DTEFTUyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRpYWxpemVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWNsYXJpbmdDbGFzcyhKYXZhQ2xhc3MgbmV3RGVjbGFyaW5nQ2xhc3MpIHsKLQkJaWYgKG5ld0RlY2xhcmluZ0NsYXNzICE9IGRlY2xhcmluZ0NsYXNzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChkZWNsYXJpbmdDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClkZWNsYXJpbmdDbGFzcykuZUludmVyc2VSZW1vdmUodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdEZWNsYXJpbmdDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEZWNsYXJpbmdDbGFzcykuZUludmVyc2VBZGQodGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSRURfQ0xBU1NFUywgSmF2YUNsYXNzLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldERlY2xhcmluZ0NsYXNzKG5ld0RlY2xhcmluZ0NsYXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUywgbmV3RGVjbGFyaW5nQ2xhc3MsIG5ld0RlY2xhcmluZ0NsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEphdmFDbGFzcyBnZXREZWNsYXJpbmdDbGFzcygpIHsKLQkJaWYgKGRlY2xhcmluZ0NsYXNzICE9IG51bGwgJiYgZGVjbGFyaW5nQ2xhc3MuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZERlY2xhcmluZ0NsYXNzID0gKEludGVybmFsRU9iamVjdClkZWNsYXJpbmdDbGFzczsKLQkJCWRlY2xhcmluZ0NsYXNzID0gKEphdmFDbGFzcyllUmVzb2x2ZVByb3h5KG9sZERlY2xhcmluZ0NsYXNzKTsKLQkJCWlmIChkZWNsYXJpbmdDbGFzcyAhPSBvbGREZWNsYXJpbmdDbGFzcykgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUywgb2xkRGVjbGFyaW5nQ2xhc3MsIGRlY2xhcmluZ0NsYXNzKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlY2xhcmluZ0NsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgYmFzaWNHZXREZWNsYXJpbmdDbGFzcygpIHsKLQkJcmV0dXJuIGRlY2xhcmluZ0NsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERlY2xhcmluZ0NsYXNzKEphdmFDbGFzcyBuZXdEZWNsYXJpbmdDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlKYXZhQ2xhc3Mgb2xkRGVjbGFyaW5nQ2xhc3MgPSBkZWNsYXJpbmdDbGFzczsKLQkJZGVjbGFyaW5nQ2xhc3MgPSBuZXdEZWNsYXJpbmdDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fREVDTEFSSU5HX0NMQVNTLCBvbGREZWNsYXJpbmdDbGFzcywgbmV3RGVjbGFyaW5nQ2xhc3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXREZWNsYXJlZENsYXNzZXMoKSB7Ci0JCXJlZmxlY3RCYXNlKCk7Ci0JCXJldHVybiBnZXREZWNsYXJlZENsYXNzZXNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RGVjbGFyZWRDbGFzc2VzR2VuKCkgewotCQlpZiAoZGVjbGFyZWRDbGFzc2VzID09IG51bGwpIHsKLQkJCWRlY2xhcmVkQ2xhc3NlcyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUkVEX0NMQVNTRVMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUyk7Ci0JCX0KLQkJcmV0dXJuIGRlY2xhcmVkQ2xhc3NlczsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsgLy8gQXMgb2YgRU1GIDIuMCwgbG9jYWwgcHJvcGVydGllcyBhcmUgdGhlIGxvY2FsIGZlYXR1cmVzLiBVc2VkIHRvIGJlIGEgbWVyZ2Ugb2YgZWF0dHJpYnV0ZXMgYW5kIGVyZWZlcmVuY2VzLgotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFdmVudHMoKSB7Ci0JCUlJbnRyb3NwZWN0aW9uQWRhcHRlciBhZGFwdGVyID0gZ2V0SW50cm9zcGVjdGlvbkFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmdldEV2ZW50cygpOwotCQlyZXR1cm4gZ2V0RXZlbnRzR2VuKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV2ZW50c0dlbigpIHsKLQkJaWYgKGV2ZW50cyA9PSBudWxsKSB7Ci0JCQlldmVudHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSmF2YUV2ZW50LmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5KQVZBX0NMQVNTX19FVkVOVFMpOwotCQl9Ci0JCXJldHVybiBldmVudHM7Ci0JfQotCi0JcHJpdmF0ZSBFTGlzdCBhbGxFdmVudHM7Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsRXZlbnRzKCkgewotCQlJSW50cm9zcGVjdGlvbkFkYXB0ZXIgaWEgPSBnZXRJbnRyb3NwZWN0aW9uQWRhcHRlcigpOwotCQlpZiAoaWEgPT0gbnVsbCkKLQkJCXJldHVybiBFQ29sbGVjdGlvbnMuRU1QVFlfRUxJU1Q7IC8vIE5vIGludHJvc3BlY3Rpb24sIGRvIG5vcm1hbC4KLQkJcmV0dXJuIGFsbEV2ZW50cyA9IGlhLmdldEFsbEV2ZW50cygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRBbGxFdmVudHNHZW4oKSB7Ci0JCXJldHVybiBhbGxFdmVudHM7Ci0JfQotCi0JcHJpdmF0ZSBFTGlzdCBhbGxQcm9wZXJ0aWVzOwotCi0JcHVibGljIEVMaXN0IGdldEFsbFByb3BlcnRpZXMoKSB7Ci0JCUlJbnRyb3NwZWN0aW9uQWRhcHRlciBpYSA9IGdldEludHJvc3BlY3Rpb25BZGFwdGVyKCk7Ci0JCWlmIChpYSA9PSBudWxsKQotCQkJcmV0dXJuIEVDb2xsZWN0aW9ucy5FTVBUWV9FTElTVDsgLy8gTm8gaW50cm9zcGVjdGlvbiwgZG8gbm9ybWFsLgotCQlyZXR1cm4gYWxsUHJvcGVydGllcyA9IGlhLmdldEFsbFByb3BlcnRpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsUHJvcGVydGllc0dlbigpIHsKLQkJcmV0dXJuIGFsbFByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRJbXBsZW1lbnRzSW50ZXJmYWNlc0dlbigpIHsKLQkJaWYgKGltcGxlbWVudHNJbnRlcmZhY2VzID09IG51bGwpIHsKLQkJCWltcGxlbWVudHNJbnRlcmZhY2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUykgewotCi0JCQkJLyoqCi0JCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkgKiAKLQkJCQkgKiBAc2luY2UgMS4xLjAKLQkJCQkgKi8KLQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0KGludCBpbmRleCkgewotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5nZXQoaW5kZXgpOyAvL2ZvcmNlIHJlc29sdXRpb24gc28gdGhlIEVTdXBlckFkYXB0ZXIgd2lsbCBiZSB1cGRhdGVkIGNvcnJlY3RseQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0KGluZGV4KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCQkJc3VwZXIuY2xlYXIoKTsKLQkJCQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQkJCQlnZXRJbnRlcmZhY2VTdXBlclR5cGVzKCkuY2xlYXIoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IHN1cGVyLnJlbW92ZShpbmRleCk7Ci0JCQkJCWlmIChpc0ludGVyZmFjZSgpKQotCQkJCQkJZ2V0SW50ZXJmYWNlU3VwZXJUeXBlcygpLnJlbW92ZShpbmRleCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucmVtb3ZlQWxsKGNvbGxlY3Rpb24pOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5yZW1vdmVBbGwoY29sbGVjdGlvbik7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkgewotCQkJCQlzdXBlci5hZGQoaW5kZXgsIG9iamVjdCk7Ci0JCQkJCWlmIChpc0ludGVyZmFjZSgpKQotCQkJCQkJZ2V0SW50ZXJmYWNlU3VwZXJUeXBlcygpLmFkZChpbmRleCwgb2JqZWN0KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhZGQoT2JqZWN0IG9iamVjdCkgewotCQkJCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLmFkZChvYmplY3QpOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5hZGQob2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuYWRkQWxsKGNvbGxlY3Rpb24pOwotCQkJCQlpZiAoaXNJbnRlcmZhY2UoKSkKLQkJCQkJCWdldEludGVyZmFjZVN1cGVyVHlwZXMoKS5hZGRBbGwoY29sbGVjdGlvbik7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQkJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuYWRkQWxsKGluZGV4LCBjb2xsZWN0aW9uKTsKLQkJCQkJaWYgKGlzSW50ZXJmYWNlKCkpCi0JCQkJCQlnZXRJbnRlcmZhY2VTdXBlclR5cGVzKCkuYWRkQWxsKGluZGV4LCBjb2xsZWN0aW9uKTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBpbXBsZW1lbnRzSW50ZXJmYWNlczsKLQl9Ci0KLQlwcml2YXRlIEVMaXN0IGdldEludGVyZmFjZVN1cGVyVHlwZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRFU3VwZXJUeXBlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDbGFzc0ltcG9ydEdlbigpIHsKLQkJaWYgKGNsYXNzSW1wb3J0ID09IG51bGwpIHsKLQkJCWNsYXNzSW1wb3J0ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX0NMQVNTX0lNUE9SVCk7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzSW1wb3J0OwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFQWxsU3VwZXJUeXBlcygpIHsKLQkJcmVmbGVjdEJhc2UoKTsvL0ZvcmNlIHJlZmxlY3Rpb24sIGlmIG5lZWRlZCwgYmVmb3JlIGdldHRpbmcgYWxsIHN1cGVydHlwZXMuCi0JCXJldHVybiBzdXBlci5nZXRFQWxsU3VwZXJUeXBlcygpOwotCX0KLQotCXB1YmxpYyBFTGlzdCBnZXRFU3VwZXJUeXBlcygpIHsKLQkJcmVmbGVjdEJhc2UoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVTdXBlclR5cGVzKCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IG90aGVycy4gSXQgaXMgaGVyZSBzbyB0aGF0IHRoZSByZWZsZWN0aW9uCi0JICogYWRhcHRlcnMgY2FuIHJlZmVyZW5jZSB0aGUgdW5yZWZsZWN0ZWQgc3VwZXJ0eXBlcy4KLQkgKiAgCi0JICogQHJldHVybgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXB1YmxpYyBFTGlzdCBwcmltR2V0RVN1cGVyVHlwZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRFU3VwZXJUeXBlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRQYWNrYWdlSW1wb3J0c0dlbigpIHsKLQkJaWYgKHBhY2thZ2VJbXBvcnRzID09IG51bGwpIHsKLQkJCXBhY2thZ2VJbXBvcnRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhUGFja2FnZS5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTKTsKLQkJfQotCQlyZXR1cm4gcGFja2FnZUltcG9ydHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEZpZWxkc0dlbigpIHsKLQkJaWYgKGZpZWxkcyA9PSBudWxsKSB7Ci0JCQlmaWVsZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChGaWVsZC5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fRklFTERTLCBKYXZhUmVmUGFja2FnZS5GSUVMRF9fSkFWQV9DTEFTUyk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWV0aG9kc0dlbigpIHsKLQkJaWYgKG1ldGhvZHMgPT0gbnVsbCkgewotCQkJbWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KE1ldGhvZC5jbGFzcywgdGhpcywgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTU19fTUVUSE9EUywgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YVBhY2thZ2UgZ2V0SmF2YVBhY2thZ2VHZW4oKSB7Ci0JCUphdmFQYWNrYWdlIGphdmFQYWNrYWdlID0gYmFzaWNHZXRKYXZhUGFja2FnZSgpOwotCQlyZXR1cm4gamF2YVBhY2thZ2UgIT0gbnVsbCAmJiBqYXZhUGFja2FnZS5lSXNQcm94eSgpID8gKEphdmFQYWNrYWdlKWVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClqYXZhUGFja2FnZSkgOiBqYXZhUGFja2FnZTsKLQl9Ci0KLQkvKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBKYXZhUGFja2FnZSBiYXNpY0dldEphdmFQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0SmF2YVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nR2VuKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoa2luZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoa2luZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHVibGljOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgUFVCTElDX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5hbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgd2l0aCB0cnVlLiBJdCBpcyBiYXNpY2FsbHkgb25seSBmb3IgcmVzZXQgb2YgcmVmbGVjdGlvbiwgbm90IHRvIHNldCBhIHBhcnRpY3VsYXIgc3RhdGUuIEJ1dCBJbnRlcm5hbFJlYWRBZGFwdGFibGUKLQkgKiBtYXkgYmUgdXNlZCBieSBzb21lb25lIHRoYXQgc2hvdWxkbid0IHNvIHRvIGJlIGJlIHNhZmUgd2Uga2VlcCBpdC4gVE9ETyBSZW1vdmUgSW50ZXJuYWxSZWFkQWRhcHRhYmxlIGluIG5leHQgdmVyc2lvbi4gTmVlZCB0byB3YWl0IGJlY2F1c2Ugd2UKLQkgKiBuZWVkIHRpbWUgdG8gbm90aWZ5IGV2ZXJ5b25lLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuYWRhcHRlcnMuSW50ZXJuYWxSZWFkQWRhcHRhYmxlI3NldFJlZmxlY3RlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZWZsZWN0ZWQoYm9vbGVhbiBhQm9vbGVhbikgewotCQlpZiAoIWFCb29sZWFuKQotCQkJcmVmbGVjdGlvblN0YXR1cyA9IE5PVF9SRUZMRUNURUQ7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzcyNnZXRSZWZsZWN0aW9uVHlwZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWZsZWN0aW9uVHlwZSgpIHsKLQkJSmF2YVJlZmxlY3Rpb25BZGFwdG9yIGphID0gKChKYXZhUmVmbGVjdGlvbkFkYXB0b3IpIGdldFJlYWRBZGFwdGVyKCkpOwotCQlyZXR1cm4gamEgIT0gbnVsbCA/IGphLmdldFJlZmxlY3Rpb25Tb3VyY2UoKSA6IG51bGw7Ci0JfQotCUBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDb250ZW50cygpCi0JICB7Ci0JICAgIGlmIChlQ29udGVudHMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDb250ZW50cyA9IEVDb250ZW50c0VMaXN0LmNyZWF0ZUVDb250ZW50c0VMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ29udGVudHM7Ci0JICB9Ci0KLQkgIEBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDcm9zc1JlZmVyZW5jZXMoKQotCSAgewotCSAgICBpZiAoZUNyb3NzUmVmZXJlbmNlcyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgZUNyb3NzUmVmZXJlbmNlcyA9IEVDcm9zc1JlZmVyZW5jZUVMaXN0LmNyZWF0ZUVDcm9zc1JlZmVyZW5jZUVMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ3Jvc3NSZWZlcmVuY2VzOwotCSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFEYXRhVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhRGF0YVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDZhYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFEYXRhVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGw7Ci0vKgotCi0KLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNyb3NzUmVmZXJlbmNlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5pbnN0YW50aWF0aW9uLklJbnN0YW50aWF0aW9uSW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YURhdGFUeXBlSW1wbCBleHRlbmRzIEVDbGFzc0ltcGwgaW1wbGVtZW50cyBKYXZhRGF0YVR5cGUgewotCi0JCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfWkVSTyA9ICIwLjAiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRkxPQVRfWkVSTyA9ICIwLjBmIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJfWkVSTyA9ICInMCciOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgWkVSTyA9ICIwIjsKLQkKLQlwcml2YXRlIGludCBwcmltaXRpdmVfdHlwZSA9IFBSSU1fTk9UX0lEOwotCQotCXByb3RlY3RlZCBKYXZhRGF0YVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLkpBVkFfREFUQV9UWVBFOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmltaXRpdmUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IGdldEphdmFOYW1lKCk7Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoUFJJTV9CT09MRUFOX05BTUUpKQotCQkJcmV0dXJuIEZBTFNFOwotCQlpZiAodHlwZU5hbWUuZXF1YWxzKFBSSU1fRE9VQkxFX05BTUUpKQotCQkJcmV0dXJuIERPVUJMRV9aRVJPOwotCQlpZiAodHlwZU5hbWUuZXF1YWxzKFBSSU1fRkxPQVRfTkFNRSkpCi0JCQlyZXR1cm4gRkxPQVRfWkVSTzsJCQkKLQkJaWYgKHR5cGVOYW1lLmVxdWFscyhQUklNX0NIQVJBQ1RFUl9OQU1FKSkKLQkJCXJldHVybiBDSEFSX1pFUk87Ci0JCXJldHVybiBaRVJPOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFOYW1lKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQlwdWJsaWMgSmF2YURhdGFUeXBlIGdldFByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzI2dldFByaW1pdGl2ZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFByaW1pdGl2ZUlEKCkgewotCQlpZiAocHJpbWl0aXZlX3R5cGUgPT0gUFJJTV9OT1RfSUQpIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fQk9PTEVBTl9OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fQk9PTEVBTl9JRDsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX0NIQVJBQ1RFUl9OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fQ0hBUkFDVEVSX0lEOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fQllURV9OQU1FKSkKLQkJCQlwcmltaXRpdmVfdHlwZSA9IFBSSU1fQllURV9JRDsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX1NIT1JUX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9TSE9SVF9JRDsKLQkJCWlmIChuYW1lLmVxdWFscyhQUklNX0lOVEVHRVJfTkFNRSkpCi0JCQkJcHJpbWl0aXZlX3R5cGUgPSBQUklNX0lOVEVHRVJfSUQ7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUFJJTV9MT05HX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9MT05HX0lEOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fRkxPQVRfTkFNRSkpCi0JCQkJcHJpbWl0aXZlX3R5cGUgPSBQUklNX0ZMT0FUX0lEOwotCQkJaWYgKG5hbWUuZXF1YWxzKFBSSU1fRE9VQkxFX05BTUUpKQotCQkJCXByaW1pdGl2ZV90eXBlID0gUFJJTV9ET1VCTEVfSUQ7Ci0JCX0KLQkJcmV0dXJuIHByaW1pdGl2ZV90eXBlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIGdldEphdmFOYW1lKCk7Ci0JfQotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0V3JhcHBlcigpIHsKLQkJU3RyaW5nIHdyYXBwZXJOYW1lID0gZ2V0V3JhcHBlclF1YWxpZmllZE5hbWUoKTsKLQkJaWYgKHdyYXBwZXJOYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUod3JhcHBlck5hbWUsIHRoaXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBnZXRXcmFwcGVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0V3JhcHBlclF1YWxpZmllZE5hbWUoKSB7Ci0JCXN3aXRjaCAoZ2V0UHJpbWl0aXZlSUQoKSkgewotCQkJY2FzZSBQUklNX0lOVEVHRVJfSUQ6Ci0JCQkJcmV0dXJuIElOVEVHRVJfTkFNRTsKLQkJCWNhc2UgUFJJTV9DSEFSQUNURVJfSUQ6Ci0JCQkJcmV0dXJuIENIQVJBQ1RFUl9OQU1FOwotCQkJY2FzZSBQUklNX0JPT0xFQU5fSUQ6Ci0JCQkJcmV0dXJuIEJPT0xFQU5fTkFNRTsKLQkJCWNhc2UgUFJJTV9CWVRFX0lEOgotCQkJCXJldHVybiBCWVRFX05BTUU7Ci0JCQljYXNlIFBSSU1fU0hPUlRfSUQ6Ci0JCQkJcmV0dXJuIFNIT1JUX05BTUU7Ci0JCQljYXNlIFBSSU1fTE9OR19JRDoKLQkJCQlyZXR1cm4gTE9OR19OQU1FOwotCQkJY2FzZSBQUklNX0ZMT0FUX0lEOgotCQkJCXJldHVybiBGTE9BVF9OQU1FOwotCQkJY2FzZSBQUklNX0RPVUJMRV9JRDoKLQkJCQlyZXR1cm4gRE9VQkxFX05BTUU7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCS8qCi0JICogSmF2YUhlbHBlcnMuaXNBcnJheSgpIC0gYXJyYXkgdHlwZXMgYXJlIGFsd2F5cyBKYXZhQ2xhc3NlcywgZXZlbiBpZiB0aGVpciBjb21wb25lbnQgdHlwZSBpcwotCSAqCQlhIHByaW1pdGl2ZSBkYXRhIHR5cGUuIFJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIENhbiBhbiBvYmplY3Qgb2YgdGhlIHBhc3NlZCBpbiBjbGFzcyBiZSBhc3NpZ25lZCB0byBhbgotCSAqIG9iamVjdCBvZiB0aGlzIGNsYXNzPyBJbiB0aGUgY2FzZSBvZiBwcmltaXRpdmVzLCBhcmUgdGhleSB0aGUgc2FtZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKEVDbGFzc2lmaWVyIGFDbGFzcykgewotCQlyZXR1cm4gdGhpcyA9PSBhQ2xhc3M7Ci0JfQotCS8qKgotCSAqIFNlZSBpZiB0aGlzIGlzIHZhbGlkIG9iamVjdCBvZiB0aGlzIHR5cGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnN0YW5jZShPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIElJbnN0YW50aWF0aW9uSW5zdGFuY2UgPyBpc0Fzc2lnbmFibGVGcm9tKCgoSUluc3RhbnRpYXRpb25JbnN0YW5jZSkgbykuZ2V0SmF2YVR5cGUoKSkgOiBmYWxzZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycyNnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpIHsKLQkJcmV0dXJuIGdldEphdmFOYW1lKCk7Ci0JfQotCUBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDb250ZW50cygpCi0JICB7Ci0JICAgIGlmIChlQ29udGVudHMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDb250ZW50cyA9IEVDb250ZW50c0VMaXN0LmNyZWF0ZUVDb250ZW50c0VMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ29udGVudHM7Ci0JICB9Ci0KLQkgIEBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDcm9zc1JlZmVyZW5jZXMoKQotCSAgewotCSAgICBpZiAoZUNyb3NzUmVmZXJlbmNlcyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgZUNyb3NzUmVmZXJlbmNlcyA9IEVDcm9zc1JlZmVyZW5jZUVMaXN0LmNyZWF0ZUVDcm9zc1JlZmVyZW5jZUVMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ3Jvc3NSZWZlcmVuY2VzOwotCSAgfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFFdmVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhRXZlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhN2E1Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFFdmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RydWN0dXJhbEZlYXR1cmVJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBFdmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFFdmVudEltcGwgZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmVJbXBsIGltcGxlbWVudHMgSmF2YUV2ZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUV2ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLkpBVkFfRVZFTlQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNmZhYmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5zdGFudGlhdGlvbi5JSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcjsKLQotLyoqCi0gKiBUaGUgZmFjdG9yeSB0byB1c2UgSmF2YVJlZiBwYWNrYWdlcy4gSXQgd2lsbCB1c2UgdGhlCi0gKiBJSW5zdGFudGlhdGlvbkhhbmRsZXIsIGlmIHRoZXJlIGlzIG9uZSwgdG8gZG8gdGhlCi0gKiBmYWN0b3J5IHJlcXVlc3RzLiBFbHNlIGl0IHdpbGwgbGV0IHRoZSBzdXBlcmNsYXNzIGhhbmRsZSBpdC4KLSAqLwotcHVibGljIGNsYXNzIEphdmFGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCB7Ci0JCi0JcHJpdmF0ZSBJSW5zdGFudGlhdGlvbkhhbmRsZXIgaW5zdGFudGlhdGlvbkhhbmRsZXI7Ci0JcHJpdmF0ZSBib29sZWFuIHJldHJpZXZlZEhhbmRsZXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSmF2YUZhY3RvcnlJbXBsLgotCSAqLwotCXB1YmxpYyBKYXZhRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElJbnN0YW50aWF0aW9uSGFuZGxlciBnZXRJbnN0YW50aWF0aW9uSGFuZGxlcigpIHsKLQkJaWYgKCFyZXRyaWV2ZWRIYW5kbGVyKSB7Ci0JCQkvLyBOZWVkIHRvIHJldHJpZXZlIGhhbmRsZXIgbGF6aWx5IGJlY2F1c2Ugd2hlbiBmYWN0b3J5IGlzIGNyZWF0ZWQgaXQgZG9lcyBub3QgeWV0IGtub3cgd2hhdCBSZXNvdXJjZVNldCBpdCBpcyBpbi4KLQkJCS8vIENhbid0IGtub3cgdGhhdCB1bnRpbCB0aGUgZmlyc3QgdGltZSB3ZSBuZWVkIGEgaGFuZGxlci4KLQkJCVJlc291cmNlU2V0IHJzZXQgPSBnZXRFUGFja2FnZSgpLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZiAocnNldCAhPSBudWxsKSB7Ci0JCQkJcmV0cmlldmVkSGFuZGxlciA9IHRydWU7Ci0JCQkJSUluc3RhbnRpYXRpb25IYW5kbGVyRmFjdG9yeUFkYXB0ZXIgZmFjdG9yeSA9IChJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihyc2V0LCBJSW5zdGFudGlhdGlvbkhhbmRsZXJGYWN0b3J5QWRhcHRlci5BREFQVEVSX0tFWSk7Ci0JCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkKLQkJCQkJaW5zdGFudGlhdGlvbkhhbmRsZXIgPSBmYWN0b3J5LmdldEluc3RhbnRpYXRpb25IYW5kbGVyKHRoaXMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW50aWF0aW9uSGFuZGxlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3RvcnkjY3JlYXRlKEVDbGFzcykKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlJSW5zdGFudGlhdGlvbkhhbmRsZXIgaWEgPSBnZXRJbnN0YW50aWF0aW9uSGFuZGxlcigpOwotCQlpZiAoaWEgPT0gbnVsbCB8fCAhaWEuaGFuZGxlc0NsYXNzKGVDbGFzcykpCi0JCQlyZXR1cm4gc3VwZXIuY3JlYXRlKGVDbGFzcyk7Ci0JCWVsc2UKLQkJCXJldHVybiBpYS5jcmVhdGUoZUNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkNmEzOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLQotCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FQ29sbGVjdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNyb3NzUmVmZXJlbmNlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi1wdWJsaWMgY2xhc3MgSmF2YVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSmF2YVBhY2thZ2UsIEVQYWNrYWdlIHsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuTGl0ZXJhbHMuSkFWQV9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbGlzdCBvZiBjbGFzc2VzIHRoYXQgdGhpcyBwYWNrYWdlIGNvbnRhaW5zLgotCSAqIFNpbmNlIHRoaXMgaXMgYSBkZXJpdmVkIHJlbGF0aW9uc2hpcCwgd2UgbmVlZCB0byBpbXBsZW1lbnQKLQkgKiBpdCBoZXJlLiBJdCB3aWxsIGdldCB0aGUgbWV0YW9iamVjdHMgbGlzdC4gVGhlc2UgYXJlIHRoZQotCSAqIGphdmEgY2xhc3NlcyB0aGlzIHBhY2thZ2UgY29udGFpbnMuCi0JICoKLQkgKiBJZiB0aGlzIGlzIHRoZSBwcmltaXRpdmVzIHBhY2thZ2UsIHRoZW4gaXQgbXVzdCByZXR1cm4KLQkgKiBhbiBlbXB0eSBsaXN0IGJlY2F1c2UgaXQgZG9lc24ndCBjb250YWluIGFueSBjbGFzc2VzLgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRKYXZhQ2xhc3NlcygpIHsKLQkJcmV0dXJuICFQUklNSVRJVkVfUEFDS0FHRV9OQU1FLmVxdWFscyhnZXROYW1lKCkpID8KLQkJCUVDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVFTGlzdChnZXRFQ2xhc3NpZmllcnMoKSkgOgotCQkJRUNvbGxlY3Rpb25zLkVNUFRZX0VMSVNUOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fSkFWQV9DTEFTU0VTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3NlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFDS0FHRV9fSkFWQV9DTEFTU0VTOgotCQkJCXJldHVybiAhZ2V0SmF2YUNsYXNzZXMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotLyoqCi0gKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoaXMgcGFja2FnZS4KLSAqIFdlIGRvIG5vdCB3YW50IHRvIGV4cG9zZSB0aGUgLmphdmFwcmltIHBhY2thZ2UKLSAqIHNpbmNlIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgcGFja2FnZS4KLSAqLwotcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCWlmIChpc0RlZmF1bHQoKSkKLQkJcmV0dXJuICIiOwotCWVsc2UKLQkJcmV0dXJuIHN1cGVyLmdldE5hbWUoKTsKLX0KLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCi0JU3RyaW5nIGludGVybmFsTmFtZSA9IHN1cGVyLmdldE5hbWUoKSA7Ci0JcmV0dXJuIEphdmFQYWNrYWdlLlBSSU1JVElWRV9QQUNLQUdFX05BTUUuZXF1YWxzKGludGVybmFsTmFtZSkgPyAiIiA6IGludGVybmFsTmFtZSA7CQotfQotcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCXJldHVybiBKYXZhUGFja2FnZS5QUklNSVRJVkVfUEFDS0FHRV9OQU1FLmVxdWFscyhzdXBlci5nZXROYW1lKCkpOwkKLX0KLQkvKioKLQkgKiBTaW5jZSBjbGFzc2VzIGFyZSBsb2FkZWQgZHluYW1pY2FsbHkgYW5kIG5vdCBmcm9tIGEgc2NoZW1hLCBhCi0JICogY2xhc3MgY291bGQgYmUgYXNrZWQgZm9yIHRocm91Z2ggdGhpcyBtZXRob2QsIGFuZCBpZiBub3QgeWV0IHJlZmxlY3RlZCwKLQkgKiBpdCB3b3VsZG4ndCBiZSBmb3VuZC4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbnkgY2xhc3MgYXNrZWQgZm9yCi0JICogaW4gdGhpcyBwYWNrYWdlIGlzIGZvdW5kIChpLmUuIHBvb2ZlZCB1cCkuIE90aGVyd2lzZSBsb2FkaW5nIGFuIGluc3RhbmNlCi0JICogZG9jdW1lbnQgdGhhdCByZWZlcnMgdG8gamF2YSBjbGFzcyB0aHJvdWdoIG5hbWVzcGFjZXMgd29uJ3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIEVDbGFzc2lmaWVyIGdldEVDbGFzc2lmaWVyKFN0cmluZyBjbGFzc05hbWUpIHsJCQkKLQkJLy8gVHJ5IHRvIGdldCB0aGUgY2xhc3MgZnJvbSB0aGUgcmVzb3VyY2UgdGhhdCB0aGlzIHBhY2thZ2UgaXMgaW4uCi0JCS8vIFRoaXMgd2lsbCBjcmVhdGUgaXQgaWYgbm90IGZvdW5kLiBUaGlzIHdvcmtzIGJlY2F1c2UgdGhlCi0JCS8vIHN0cnVjdHVyZSBpcyB0aGVyZSBpcyBvbmUgamF2YSBwYWNrYWdlIHBlciByZXNvdXJjZSwgYW5kCi0JCS8vIHRoZSBpZCBvZiB0aGUgY2xhc3MgaXMgdGhlIGNsYXNzIG5hbWUgd2l0aG91dCB0aGUgcGFja2FnZQotCQkvLyBwb3J0aW9uLCB3aGljaCBpcyB3aGF0IGNsYXNzTmFtZSBhYm92ZSBpcy4KLQkJT2JqZWN0IHJlc3VsdCA9IGVSZXNvdXJjZSgpLmdldEVPYmplY3QoY2xhc3NOYW1lKTsKLQkJcmV0dXJuIChyZXN1bHQgaW5zdGFuY2VvZiBFQ2xhc3NpZmllcikgPyAoRUNsYXNzaWZpZXIpIHJlc3VsdCA6IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIHJlZmxlY3QgLSByZWZsZWN0IGEgSmF2YSBwYWNrYWdlIGZvciBhIGdpdmVuIHBhY2thZ2UgbmFtZS4KLQkgKiBJZiB0aGUgcGFja2FnZSBkb2VzIG5vdCBleGlzdCwgb25lIHdpbGwgYmUgY3JlYXRlZCB0aHJvdWdoCi0JICogdGhlIHJlZmxlY3Rpb24gbWVjaGFuaXNtLgotCSAqIEBkZXByZWNhdGVkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNyZWZsZWN0UGFja2FnZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVBhY2thZ2UgcmVmbGVjdChTdHJpbmcgcGFja2FnZU5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RQYWNrYWdlKHBhY2thZ2VOYW1lLCBzZXQpOwotICAgIH0KLQlAT3ZlcnJpZGUKLQkgIHB1YmxpYyBFTGlzdDxFT2JqZWN0PiBlQ29udGVudHMoKQotCSAgewotCSAgICBpZiAoZUNvbnRlbnRzID09IG51bGwpCi0JICAgIHsKLQkgICAgICBlQ29udGVudHMgPSBFQ29udGVudHNFTGlzdC5jcmVhdGVFQ29udGVudHNFTGlzdCh0aGlzKTsKLQkgICAgfQotCSAgICByZXR1cm4gZUNvbnRlbnRzOwotCSAgfQotCi0JICBAT3ZlcnJpZGUKLQkgIHB1YmxpYyBFTGlzdDxFT2JqZWN0PiBlQ3Jvc3NSZWZlcmVuY2VzKCkKLQkgIHsKLQkgICAgaWYgKGVDcm9zc1JlZmVyZW5jZXMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDcm9zc1JlZmVyZW5jZXMgPSBFQ3Jvc3NSZWZlcmVuY2VFTGlzdC5jcmVhdGVFQ3Jvc3NSZWZlcmVuY2VFTGlzdCh0aGlzKTsKLQkgICAgfQotCSAgICByZXR1cm4gZUNyb3NzUmVmZXJlbmNlczsKLQkgIH0KLQotfSAvL0phdmFQYWNrYWdlSW1wbAotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUGFyYW1ldGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFQYXJhbWV0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MmIyY2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFQYXJhbWV0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotCi0vKgotCi0KLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFyYW1ldGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSUphdmFNZXRob2RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlYWRBZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVBhcmFtZXRlckltcGwgZXh0ZW5kcyBFUGFyYW1ldGVySW1wbCBpbXBsZW1lbnRzIEphdmFQYXJhbWV0ZXIgewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmluYWwoKSA8ZW0+RmluYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRmluYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBGSU5BTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRklOQUxfRUZMQUcgPSAxIDw8IDEwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtZXRlcktpbmQoKSA8ZW0+UGFyYW1ldGVyIEtpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtZXRlcktpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YVBhcmFtZXRlcktpbmQgUEFSQU1FVEVSX0tJTkRfRURFRkFVTFQgPSBKYXZhUGFyYW1ldGVyS2luZC5JTl9MSVRFUkFMOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEphdmFQYXJhbWV0ZXJLaW5kIHBhcmFtZXRlcktpbmQgPSBQQVJBTUVURVJfS0lORF9FREVGQVVMVDsKLQlwcm90ZWN0ZWQgSmF2YVBhcmFtZXRlckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gSmF2YVJlZlBhY2thZ2UuTGl0ZXJhbHMuSkFWQV9QQVJBTUVURVI7Ci0JfQotCi0JcHVibGljIEphdmFIZWxwZXJzIGdldEphdmFUeXBlKCkgewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKWdldEVUeXBlKCk7Ci0JfQotICBwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoKSB7Ci0gICAgcmV0dXJuIChlQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBNZXRob2QpID8gKChNZXRob2QpZUNvbnRhaW5lcigpKS5nZXROYW1lKCkgKyAiLiIgKyB0aGlzLmdldE5hbWUoKSA6IHRoaXMuZ2V0TmFtZSgpOwotICB9Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9fRklOQUw6Ci0JCQkJcmV0dXJuIGlzRmluYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORDoKLQkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVyS2luZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19GSU5BTDoKLQkJCQlzZXRGaW5hbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORDoKLQkJCQlzZXRQYXJhbWV0ZXJLaW5kKChKYXZhUGFyYW1ldGVyS2luZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0ZJTkFMOgotCQkJCXNldEZpbmFsKEZJTkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19QQVJBTUVURVJfS0lORDoKLQkJCQlzZXRQYXJhbWV0ZXJLaW5kKFBBUkFNRVRFUl9LSU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX0ZJTkFMOgotCQkJCXJldHVybiAoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKSAhPSBGSU5BTF9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1BBUkFNRVRFUl9LSU5EOgotCQkJCXJldHVybiBwYXJhbWV0ZXJLaW5kICE9IFBBUkFNRVRFUl9LSU5EX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBJcyB0aGlzIHBhcmFtZXRlciB0eXBlIGFuIGFycmF5IHR5cGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIGdldEphdmFUeXBlKCkuaXNBcnJheSgpOwotCX0KLQkvKioKLQkgKiBJcyB0aGlzIGEgcmV0dXJuIHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JldHVybigpIHsKLQkJcmV0dXJuIEphdmFQYXJhbWV0ZXJLaW5kLlJFVFVSTiA9PSBnZXRQYXJhbWV0ZXJLaW5kKCkuZ2V0VmFsdWUoKTsKLQl9Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5hbChib29sZWFuIG5ld0ZpbmFsKSB7Ci0JCWJvb2xlYW4gb2xkRmluYWwgPSAoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdGaW5hbCkgZUZsYWdzIHw9IEZJTkFMX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+RklOQUxfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX19GSU5BTCwgb2xkRmluYWwsIG5ld0ZpbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFQYXJhbWV0ZXJLaW5kIGdldFBhcmFtZXRlcktpbmQoKSB7Ci0JCXJldHVybiBwYXJhbWV0ZXJLaW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcktpbmQoSmF2YVBhcmFtZXRlcktpbmQgbmV3UGFyYW1ldGVyS2luZCkgewotCQlKYXZhUGFyYW1ldGVyS2luZCBvbGRQYXJhbWV0ZXJLaW5kID0gcGFyYW1ldGVyS2luZDsKLQkJcGFyYW1ldGVyS2luZCA9IG5ld1BhcmFtZXRlcktpbmQgPT0gbnVsbCA/IFBBUkFNRVRFUl9LSU5EX0VERUZBVUxUIDogbmV3UGFyYW1ldGVyS2luZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQVJBTUVURVJfX1BBUkFNRVRFUl9LSU5ELCBvbGRQYXJhbWV0ZXJLaW5kLCBwYXJhbWV0ZXJLaW5kKSk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIG5vdCBtZWFudCB0byBiZSB1c2VkIG91dHNpZGUgb2YgdGhlIHJlZmxlY3Rpb24gYWRhcHRlcnMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBSZWFkQWRhcHRvciBnZXRSZWFkQWRhcHRlcigpIHsKLQkJcmV0dXJuIChSZWFkQWRhcHRvcikgRWNvcmVVdGlsLmdldFJlZ2lzdGVyZWRBZGFwdGVyKGVDb250YWluZXIoKSwgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIFJFRkxFQ1RFRF9CQVNFID0gMHgxLCBSRUZMRUNURURfUEFSQU1fTkFNRSA9IDB4MjsKLQotCXByb3RlY3RlZCBpbnQgcmVmbGVjdGlvblN0YXR1cyA9IFJFRkxFQ1RFRF9CQVNFOyAgLy8gQXQgdGhpcyB0aW1lIGJhc2UgcmVmbGVjdGlvbgotCQkJCQkJCQkJCQkJCSAgLy8gaXMgcGVyZm9ybWVkIGF0IGNyZWF0aW9uLgotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdFBhcmFtTmFtZSgpIHsKLQkJLy8gV2Ugb25seSB3YW50IHRoZSB0ZXN0aW5nIG9mIHRoZSBoYXNSZWZsZWN0ZWQgYW5kIGdldCByZWFkYWRhcHRlciB0byBiZSBzeW5jKHRoaXMpIHNvIHRoYXQKLQkJLy8gaXQgaXMgc2hvcnQgYW5kIG5vIGRlYWRsb2NrIHBvc3NpYmlsaXR5ICh0aGlzIGlzIGJlY2F1c2UgdGhlIHRoZSBtZXRob2QgcmVmbGVjdGlvbiBhZGFwdGVyIG1heSBnbwotCQkvLyBiYWNrIHRvIHRoZSBjb250YWluaW5nIGphdmEgY2xhc3MgdG8gZ2V0IGl0cyByZWZsZWN0aW9uIGFkYXB0ZXIsIHdoaWNoIHdvdWxkIGxvY2sgb24gaXRzZWxmLiBTbwotCQkvLyB3ZSBuZWVkIHRvIGtlZXAgdGhlIHNlY3Rpb25zIHRoYXQgYXJlIHN5bmModGhpcykgdG8gbm90IGJlIGRlYWRsb2NrYWJsZSBieSBub3QgZG9pbmcgc2lnbmlmaWNhbnQgd29yawotCQkvLyBkdXJpbmcgdGhlIHN5bmMuCi0JCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gbnVsbDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoKHJlZmxlY3Rpb25TdGF0dXMgJiBSRUZMRUNURURfUEFSQU1fTkFNRSkgPT0gMCkgewotCQkJCXJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCX0KLQkJfQotCQlpZiAocmVhZEFkYXB0b3IgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzZXRSZWZsZWN0ZWQgPSAoKElKYXZhTWV0aG9kQWRhcHRlcikgcmVhZEFkYXB0b3IpLnJlZmxlY3RQYXJhbU5hbWVzSWZOZWNlc3NhcnkoKTsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCS8vIERvbid0IHdhbnQgdG8gc2V0IGl0IGZhbHNlLiBUaGF0IGlzIGpvYiBvZiByZWZsZWN0aW9uIGFkYXB0ZXIuIE90aGVyd2lzZSB3ZSBjb3VsZCBoYXZlIGEgcmFjZS4KLQkJCQkvLyBOb3JtYWxseSB3ZSB3b3VsZG4ndCBuZWVkIHRvIHNldCB0aGlzIGJlY2F1c2UgaXQgd291bGQgYmUgc2V0IGR1cmluZyB0aGUgcmVmbGVjdFBhcmFtTmFtZXNJZk5lY2Vzc2FyeSwgYnV0Ci0JCQkJLy8gaW4gY2FzZSB0aGVyZSB3YXMgYSBwcm9ibGVtIHdlIG1hcmsgaXQgc3RpbGwgcmVmbGVjdGVkIHNvIHdlIGRvbid0IHRyeSBhZ2Fpbi4KLQkJCQlpZiAoc2V0UmVmbGVjdGVkKQotCQkJCQlyZWZsZWN0aW9uU3RhdHVzIHw9IChSRUZMRUNURURfQkFTRSB8IFJFRkxFQ1RFRF9QQVJBTV9OQU1FKTsgLy8gV2UgY2FuIGJlIGNlcnRhaW4gYmFzZSB3aWxsIGJlIGRvbmUgYnkgcmVmbGVjdCBnZW5lcmF0ZWQgaWYgbm90IGFscmVhZHkKLQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGRvbmUuCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZWZsZWN0UGFyYW1OYW1lKCk7Ci0JCXJldHVybiBzdXBlci5nZXROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIuc2V0TmFtZShuYW1lKTsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCSAgIHJlZmxlY3Rpb25TdGF0dXMgfD0gKFJFRkxFQ1RFRF9QQVJBTV9OQU1FKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaW5hbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbWV0ZXJLaW5kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJhbWV0ZXJLaW5kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCUBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDb250ZW50cygpCi0JICB7Ci0JICAgIGlmIChlQ29udGVudHMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDb250ZW50cyA9IEVDb250ZW50c0VMaXN0LmNyZWF0ZUVDb250ZW50c0VMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ29udGVudHM7Ci0JICB9Ci0KLQkgIEBPdmVycmlkZQotCSAgcHVibGljIEVMaXN0PEVPYmplY3Q+IGVDcm9zc1JlZmVyZW5jZXMoKQotCSAgewotCSAgICBpZiAoZUNyb3NzUmVmZXJlbmNlcyA9PSBudWxsKQotCSAgICB7Ci0JICAgICAgZUNyb3NzUmVmZXJlbmNlcyA9IEVDcm9zc1JlZmVyZW5jZUVMaXN0LmNyZWF0ZUVDcm9zc1JlZmVyZW5jZUVMaXN0KHRoaXMpOwotCSAgICB9Ci0JICAgIHJldHVybiBlQ3Jvc3NSZWZlcmVuY2VzOwotCSAgfQotCi19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhkM2YzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9KYXZhUmVmRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLlJlZmxlY3Rpb25BZGFwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEudXRpbC5KYXZhQ29udGV4dDsKLQotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVJlZkZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgSmF2YVJlZkZhY3RvcnkgewotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFSZWZGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlKYXZhUmVmRmFjdG9yeSB0aGVKYXZhUmVmRmFjdG9yeSA9IChKYXZhUmVmRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiamF2YS54bWkiKTsgCi0JCQlpZiAodGhlSmF2YVJlZkZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVKYXZhUmVmRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBKYXZhUmVmRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlcyBhYm91dCBUeXBlIFVSSSdzLgotCSAqIDxwPgotCSAqIFRoZSBmb3JtYXQgb2YgYSB0eXBlIHVyaSBpczogImphdmE6L3BhY2thZ2UjY2xhc3NuYW1lIi4gInBhY2thZ2UiIGlzIGVpdGhlciB0aGUgcGFja2FnZSBuYW1lLAotCSAqIHdpdGggJy4nIGZvciBwYWNrYWdlIHNlcGFyYXRvciAoZS5nLiAiamF2YTovYS5iI1hZWiIpLiBPciBmb3IgcHJpbWl0aXZlIChlLmcuICJqYXZhOi8jaW50Iikgb3IKLQkgKiBmb3IgZGVmYXVsdCBwYWNrYWdlIChlLmcuICJqYXZhOi8jWFlaIikuCi0JICogPHA+Ci0JICogVGhlIGNsYXNzbmFtZSBoYXMgc29tZSBzcGVjaWFsIGNoYW5nZXMuIEZpcnN0IGl0IG11c3QgdXNlIHJlZmxlY3Rpb24gZm9ybWF0IHdoaWNoIG1lYW5zCi0JICogdGhhdCBhbnkgaW5uZXIgY2xhc3MgbXVzdCB1c2UgdGhlICckJyBmb3JtYXQsIGkuZS4gIkEuQiIgbXVzdCBiZSAiQSRCIi4KLQkgKiA8cD4KLQkgKiBOZXh0IGlmIHRoZXJlIGlzCi0JICogYSBnZW5lcmljIGludm9sdmVkIHRoZW4gaXQgbXVzdCBiZSBjaGFuZ2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5OiAiQTw/IGV4dGVuZHMgYS5CPiIgd2lsbAotCSAqIGJlIGNoYW5nZWQgdG8gIkF7PyBleHRlbmRzIGEhQn0iLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIGZpcnN0IHRoYXQgJzwnIGFuZCAnPicgYXJlCi0JICogaW52YWxpZCBpbiBhIGZyYWdtZW50IChpZCkgb2YgYSBVUkkuIFNvIHdlIHJlcGxhY2UgdGhlbSB3aXRoICd7fScuIE5leHQgYmVjYXVzZSB3ZSB1c2UKLQkgKiB0aGUgZnJhZ21lbnQgIkEuZmllbGQiIG9yICJBLm1ldGhvZCgiIHRvIG1lYW4gYSBmaWVsZCBvciBtZXRob2QgaWQsIHdlIGNhbid0IGhhdmUgdGhlCi0JICogJy4nIGluIHRoZSBnZW5lcmljIHBvcnRpb24uIElmIGl0IHdhcyB0aGVyZSB3ZSBjb3VsZG4ndCBxdWlja2x5IGZpbmQgdGhlIGFwcHJvcHJpYXRlIG5lc3RpbmcKLQkgKiBvZiB0aGUgZ2VuZXJpYydzICd7fScgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBhbm90aGVyIGdlbmVyaWMgd2l0aGluIHRoZSBnZW5lcmljLCBhbmQgdGhlbgotCSAqIHNheSB0byBmaW5kIHRoZSAnLicgYWZ0ZXIgdGhhdCBuZXN0ZWQgc2V0LgotCSAqLwotCi0JCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+R0VORVJJQ19JRF9TRVBBUkFUT1I8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBHRU5FUklDX0lEX1NFUEFSQVRPUiA9ICchJzsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5HRU5FUklDX1NFUEFSQVRPUjwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIEdFTkVSSUNfU0VQQVJBVE9SID0gJy4nOwotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPkdFTkVSSUNfSURfRU5EPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgR0VORVJJQ19JRF9FTkQgPSAnfSc7Ci0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+R0VORVJJQ19FTkQ8L2NvZGU+Ci0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBHRU5FUklDX0VORCA9ICc+JzsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5HRU5FUklDX0lEX1NUQVJUPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgR0VORVJJQ19JRF9TVEFSVCA9ICd7JzsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5HRU5FUklDX1NUQVJUPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgR0VORVJJQ19TVEFSVCA9ICc8JzsKLQkKLQotCXB1YmxpYyBKYXZhUmVmRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1M6IHJldHVybiBjcmVhdGVKYXZhQ2xhc3MoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSU5JVElBTElaRVI6IHJldHVybiBjcmVhdGVJbml0aWFsaXplcigpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUjogcmV0dXJuIGNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EOiByZXR1cm4gY3JlYXRlTWV0aG9kKCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkZJRUxEOiByZXR1cm4gY3JlYXRlRmllbGQoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0s6IHJldHVybiBjcmVhdGVCbG9jaygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5DT01NRU5UOiByZXR1cm4gY3JlYXRlQ29tbWVudCgpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5TVEFURU1FTlQ6IHJldHVybiBjcmVhdGVTdGF0ZW1lbnQoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9QQUNLQUdFOiByZXR1cm4gY3JlYXRlSmF2YVBhY2thZ2UoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9EQVRBX1RZUEU6IHJldHVybiBjcmVhdGVKYXZhRGF0YVR5cGUoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQVJSQVlfVFlQRTogcmV0dXJuIGNyZWF0ZUFycmF5VHlwZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuVFlQRV9LSU5EOgotCQkJCXJldHVybiBjcmVhdGVUeXBlS2luZEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1ZJU0lCSUxJVFlfS0lORDoKLQkJCQlyZXR1cm4gY3JlYXRlSmF2YVZpc2liaWxpdHlLaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfUEFSQU1FVEVSX0tJTkQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFQYXJhbWV0ZXJLaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpUWVBFX0pBVkFfSEVMUEVSUzoKLQkJCQlyZXR1cm4gY3JlYXRlSlR5cGVKYXZhSGVscGVyc0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KVFlQRV9MSVNUOgotCQkJCXJldHVybiBjcmVhdGVKVHlwZUxpc3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLlRZUEVfS0lORDoKLQkJCQlyZXR1cm4gY29udmVydFR5cGVLaW5kVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9WSVNJQklMSVRZX0tJTkQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRKYXZhVmlzaWJpbGl0eUtpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUl9LSU5EOgotCQkJCXJldHVybiBjb252ZXJ0SmF2YVBhcmFtZXRlcktpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KVFlQRV9KQVZBX0hFTFBFUlM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRKVHlwZUphdmFIZWxwZXJzVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSlRZUEVfTElTVDoKLQkJCQlyZXR1cm4gY29udmVydEpUeXBlTGlzdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQXJyYXlUeXBlIGNyZWF0ZUFycmF5VHlwZShKYXZhSGVscGVycyBjb21wb25lbnRUeXBlKSB7Ci0JCUFycmF5VHlwZSBhdCA9IGNyZWF0ZUFycmF5VHlwZSgpOwotCQkKLQkJU3RyaW5nIGNvbXB1dGVkTmFtZSA9IGNvbXBvbmVudFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpICsgIltdIjsKLQkJYXQuc2V0TmFtZShjb21wdXRlZE5hbWUpOwotCQlyZXR1cm4gYXQ7Ci0JfQotCXB1YmxpYyBBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKEphdmFIZWxwZXJzIGZpbmFsQ29tcG9uZW50VHlwZSwgaW50IGRpbWVuc2lvbnMpIHsKLQkJQXJyYXlUeXBlIGF0ID0gY3JlYXRlQXJyYXlUeXBlKCk7Ci0JCQotCQlTdHJpbmcgY29tcHV0ZWROYW1lID0gZmluYWxDb21wb25lbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaW1lbnNpb25zOyBpKyspewotCQkJY29tcHV0ZWROYW1lID0gY29tcHV0ZWROYW1lICsgIltdIjsKLQkJfQotCQlhdC5zZXROYW1lKGNvbXB1dGVkTmFtZSk7Ci0JCXJldHVybiBhdDsKLQl9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgamF2YSBjb250ZXh0Ci0gICAqIEByZXR1cm4KLSAgICogCi0gICAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQVBJIHtAbGluayBKYXZhQ29udGV4dCNjcmVhdGVKYXZhQ29udGV4dCgpfSBpbnN0ZWFkLgotICAgKiBAc2luY2UgMS4yLjAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgY3JlYXRlSmF2YUNvbnRleHQoKSB7Ci0gICAgcmV0dXJuIEphdmFDb250ZXh0LmNyZWF0ZUphdmFDb250ZXh0KCk7Ci0gIH0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENsYXNzIGZvciB0aGUgSmF2YSByZWZlY3Rpb24gYWRhcHRlciBmYWN0b3J5LgotCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQVBJIHtAbGluayBKYXZhQ29udGV4dCNnZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcygpfSBpbnN0ZWFkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0UmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5Q2xhc3MoKSB7Ci0JCXJldHVybiBKYXZhQ29udGV4dC5nZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcygpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIENsYXNzIGZvciB0aGUgSmF2YSByZWZlY3Rpb24gYWRhcHRlciBmYWN0b3J5LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQVBJIHtAbGluayBKYXZhQ29udGV4dCNzZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcyhDbGFzcyl9IGluc3RlYWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeUNsYXNzKENsYXNzIGphdmFSZWZsZWN0aW9uRmFjdG9yeUNsYXNzKSB7Ci0JCUphdmFDb250ZXh0LnNldFJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeUNsYXNzKGphdmFSZWZsZWN0aW9uRmFjdG9yeUNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1ldGhvZCBjcmVhdGVNZXRob2QoKSB7Ci0JCU1ldGhvZEltcGwgbWV0aG9kID0gbmV3IE1ldGhvZEltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGNyZWF0ZUphdmFDbGFzcygpIHsKLQkJSmF2YUNsYXNzSW1wbCBqYXZhQ2xhc3MgPSBuZXcgSmF2YUNsYXNzSW1wbCgpOwotCQlyZXR1cm4gamF2YUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBGaWVsZCBjcmVhdGVGaWVsZCgpIHsKLQkJRmllbGRJbXBsIGZpZWxkID0gbmV3IEZpZWxkSW1wbCgpOwotCQlyZXR1cm4gZmllbGQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEJsb2NrIGNyZWF0ZUJsb2NrKCkgewotCQlCbG9ja0ltcGwgYmxvY2sgPSBuZXcgQmxvY2tJbXBsKCk7Ci0JCXJldHVybiBibG9jazsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29tbWVudCBjcmVhdGVDb21tZW50KCkgewotCQlDb21tZW50SW1wbCBjb21tZW50ID0gbmV3IENvbW1lbnRJbXBsKCk7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdGF0ZW1lbnQgY3JlYXRlU3RhdGVtZW50KCkgewotCQlTdGF0ZW1lbnRJbXBsIHN0YXRlbWVudCA9IG5ldyBTdGF0ZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBzdGF0ZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEluaXRpYWxpemVyIGNyZWF0ZUluaXRpYWxpemVyKCkgewotCQlJbml0aWFsaXplckltcGwgaW5pdGlhbGl6ZXIgPSBuZXcgSW5pdGlhbGl6ZXJJbXBsKCk7Ci0JCXJldHVybiBpbml0aWFsaXplcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhcmFtZXRlciBjcmVhdGVKYXZhUGFyYW1ldGVyKCkgewotCQlKYXZhUGFyYW1ldGVySW1wbCBqYXZhUGFyYW1ldGVyID0gbmV3IEphdmFQYXJhbWV0ZXJJbXBsKCk7Ci0JCXJldHVybiBqYXZhUGFyYW1ldGVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBcnJheVR5cGUgY3JlYXRlQXJyYXlUeXBlKCkgewotCQlBcnJheVR5cGVJbXBsIGFycmF5VHlwZSA9IG5ldyBBcnJheVR5cGVJbXBsKCk7Ci0JCXJldHVybiBhcnJheVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFR5cGVLaW5kIGNyZWF0ZVR5cGVLaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCVR5cGVLaW5kIHJlc3VsdCA9IFR5cGVLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUeXBlS2luZFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhVmlzaWJpbGl0eUtpbmQgY3JlYXRlSmF2YVZpc2liaWxpdHlLaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCUphdmFWaXNpYmlsaXR5S2luZCByZXN1bHQgPSBKYXZhVmlzaWJpbGl0eUtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEphdmFWaXNpYmlsaXR5S2luZFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhUGFyYW1ldGVyS2luZCBjcmVhdGVKYXZhUGFyYW1ldGVyS2luZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlKYXZhUGFyYW1ldGVyS2luZCByZXN1bHQgPSBKYXZhUGFyYW1ldGVyS2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SmF2YVBhcmFtZXRlcktpbmRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgY3JlYXRlSlR5cGVKYXZhSGVscGVyc0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEpUeXBlSmF2YUhlbHBlcnNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgY3JlYXRlSlR5cGVMaXN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoTGlzdClzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRKVHlwZUxpc3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEphdmFEYXRhVHlwZSBjcmVhdGVKYXZhRGF0YVR5cGUoKSB7Ci0JCUphdmFEYXRhVHlwZUltcGwgamF2YURhdGFUeXBlID0gbmV3IEphdmFEYXRhVHlwZUltcGwoKTsKLQkJcmV0dXJuIGphdmFEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhY2thZ2UgY3JlYXRlSmF2YVBhY2thZ2UoKSB7Ci0JCUphdmFQYWNrYWdlSW1wbCBqYXZhUGFja2FnZSA9IG5ldyBKYXZhUGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIGphdmFQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBKYXZhUmVmUGFja2FnZSBnZXRKYXZhUmVmUGFja2FnZSgpIHsKLQkJcmV0dXJuIChKYXZhUmVmUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVJlZlBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEphdmFSZWZGYWN0b3J5IGdldEFjdGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeSNjcmVhdGVDbGFzc1JlZihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgY3JlYXRlQ2xhc3NSZWYoU3RyaW5nIHRhcmdldE5hbWUpIHsKLQkJSmF2YUNsYXNzIHJlZiA9IGNyZWF0ZUphdmFDbGFzcygpOwotCQkoKEludGVybmFsRU9iamVjdCkgcmVmKS5lU2V0UHJveHlVUkkoY3JlYXRlVHlwZVVSSSh0YXJnZXROYW1lKSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIEphdmFIZWxwZXJzIHJlZmxlY3RUeXBlKFN0cmluZyBhUXVhbGlmaWVkTmFtZSwgRU9iamVjdCByZWxhdGVkT2JqZWN0KSB7Ci0JCVJlc291cmNlIHIgPSByZWxhdGVkT2JqZWN0LmVSZXNvdXJjZSgpOwotCQlpZiAociAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZVNldCBycyA9IHIuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmIChycyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlZmxlY3RUeXBlKGFRdWFsaWZpZWROYW1lLCBycyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFR5cGUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyByZWZsZWN0VHlwZShTdHJpbmcgYVF1YWxpZmllZE5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlpZiAoYVF1YWxpZmllZE5hbWUgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gYVF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQkJCWlmIChpbmRleCA+IDApCi0JCQkJcmV0dXJuIHJlZmxlY3RUeXBlKGFRdWFsaWZpZWROYW1lLnN1YnN0cmluZygwLCBpbmRleCksIGFRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhpbmRleCArIDEsIGFRdWFsaWZpZWROYW1lLmxlbmd0aCgpKSwgc2V0KTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gcmVmbGVjdFR5cGUoIiIsIGFRdWFsaWZpZWROYW1lLCBzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I3JlZmxlY3RUeXBlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKLQkgKi8KLQlwdWJsaWMgSmF2YUhlbHBlcnMgcmVmbGVjdFR5cGUoU3RyaW5nIGFQYWNrYWdlTmFtZSwgU3RyaW5nIGFUeXBlTmFtZSwgUmVzb3VyY2VTZXQgc2V0KSB7Ci0JCWlmIChhVHlwZU5hbWUgIT0gbnVsbCAmJiBhUGFja2FnZU5hbWUgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdC5KYXZhSW5pdC5pbml0KCk7Ci0JCQlyZXR1cm4gKEphdmFIZWxwZXJzKSBzZXQuZ2V0RU9iamVjdChjcmVhdGVUeXBlVVJJKGFQYWNrYWdlTmFtZSwgYVR5cGVOYW1lKSwgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjcmVmbGVjdFBhY2thZ2UoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqLwotCXB1YmxpYyBKYXZhUGFja2FnZSByZWZsZWN0UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUsIFJlc291cmNlU2V0IHNldCkgewotCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdC5KYXZhSW5pdC5pbml0KCk7Ci0JCQlyZXR1cm4gKEphdmFQYWNrYWdlKSBzZXQuZ2V0RU9iamVjdChjcmVhdGVQYWNrYWdlVVJJKHBhY2thZ2VOYW1lKSwgdHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZVR5cGVVUkkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgVVJJIGNyZWF0ZVR5cGVVUkkoU3RyaW5nIGFRdWFsaWZpZWROYW1lKSB7Ci0JCS8vIGZvciBuZWVkIHRvIGp1c3QgdG9sZXJhdGUgZ2VuZXJpY3MgKGkuZS4gIjwuLi4+Ii4gRnVsbHkgc3VwcG9ydCBsYXRlci4KLQkJLy9JbiB0aGlzIGNhc2UgdG9sZXJhdGUgbWVhbnMgaWdub3JlIHRoZSBwYXJhbWV0ZXIgdHlwZXMuCi0JCWludCBnZW5OZHggPSBhUXVhbGlmaWVkTmFtZS5pbmRleE9mKEdFTkVSSUNfU1RBUlQpOwotCQlpbnQgcGtnTmR4ID0gZ2VuTmR4ID09IC0xID8gYVF1YWxpZmllZE5hbWUubGFzdEluZGV4T2YoJy4nKSA6IGFRdWFsaWZpZWROYW1lLmxhc3RJbmRleE9mKCcuJywgZ2VuTmR4KTsKLQkJaWYgKHBrZ05keCA+IC0xKQotCQkJcmV0dXJuIGNyZWF0ZVR5cGVVUkkoYVF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKDAsIHBrZ05keCksIGdlbk5keCA9PSAtMSA/IGFRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhwa2dOZHgrMSkgOiBhUXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcocGtnTmR4KzEsIGdlbk5keCkpOwotCQllbHNlCi0JCQlyZXR1cm4gY3JlYXRlVHlwZVVSSShudWxsLCBhUXVhbGlmaWVkTmFtZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZVR5cGVVUkkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgVVJJIGNyZWF0ZVR5cGVVUkkoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJU3RyaW5nW10gcGtnbmFtZSA9IG51bGw7Ci0JCWlmIChwYWNrYWdlTmFtZSAhPSBudWxsICYmIHBhY2thZ2VOYW1lLmxlbmd0aCgpID4gMCkKLQkJCXBrZ25hbWUgPSBuZXcgU3RyaW5nW10ge3BhY2thZ2VOYW1lfTsKLQkJcmV0dXJuIFVSSS5jcmVhdGVIaWVyYXJjaGljYWxVUkkoSkFWQV9QUk9UT0NPTF9VUklfU0NIRU1FLCBudWxsLCBudWxsLCBwa2duYW1lLCBudWxsLCBjcmVhdGVUeXBlTmFtZSh0eXBlTmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBVUkknZCB0eXBlIG5hbWUgZnJvbSBhIHJlZ3VsYXIgdHlwZW5hbWUuCi0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGZyaWVuZHMgb2YgdGhlIEltcGwgcGFja2FnZS4KLQkgKiBAcGFyYW0gdHlwZU5hbWUgdHlwZSBuYW1lLCBubyBwYWNrYWdlIGFsbG93ZWQsIGFuZCBtdXN0IGJlIGluIGZvcm0gZm9yIHJlZmxlY3Rpb24gKGkuZS4gJyQnIG5vdCAnLicgdG8gc2VwYXJhdGUgb3V0ZXIgYW5kIGlubmVyIGNsYXNzZXMpLgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSkgewotCi0JCWludCBnZW5TdGFydCA9IHR5cGVOYW1lLmluZGV4T2YoR0VORVJJQ19TVEFSVCk7Ci0JCWlmIChnZW5TdGFydCA+IC0xKSB7Ci0JCQljaGFyW10gY2hOYW1lID0gbmV3IGNoYXJbdHlwZU5hbWUubGVuZ3RoKCldOwotCQkJdHlwZU5hbWUuZ2V0Q2hhcnMoMCwgY2hOYW1lLmxlbmd0aCwgY2hOYW1lLCAwKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hOYW1lLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3dpdGNoIChjaE5hbWVbaV0pIHsKLQkJCQkJY2FzZSBHRU5FUklDX1NUQVJUOgotCQkJCQkJY2hOYW1lW2ldID0gR0VORVJJQ19JRF9TVEFSVDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEdFTkVSSUNfRU5EOgotCQkJCQkJY2hOYW1lW2ldID0gR0VORVJJQ19JRF9FTkQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBHRU5FUklDX1NFUEFSQVRPUjoKLQkJCQkJCWNoTmFtZVtpXSA9IEdFTkVSSUNfSURfU0VQQVJBVE9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQl0eXBlTmFtZSA9IG5ldyBTdHJpbmcoY2hOYW1lKTsKLQkJfQotCQlyZXR1cm4gdHlwZU5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2dldFR5cGVOYW1lKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZShVUkkgdHlwZVVSSSkgewotCQlpZiAoaXNUeXBlVVJJKHR5cGVVUkkpKSB7Ci0JCQlyZXR1cm4gcHJpbUdldFR5cGVOYW1lKHR5cGVVUkkuZnJhZ21lbnQoKSk7Ci0JCX0gZWxzZQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0eXBlVVJJLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgdHlwZSBuYW1lIGZyb20gVVJJJ2QgdHlwZW5hbWUuCi0JICogPHA+Ci0JICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGZyaWVuZHMgb2YgdGhlIEltcGwgcGFja2FnZS4KLQkgKiBAcGFyYW0gdHlwZSB1cmkgZnJhZ21lbnQgdmFsdWUgZm9yIHR5cGUgbmFtZS4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBwcmltR2V0VHlwZU5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCWludCBnZW5TdGFydCA9IHR5cGVOYW1lLmluZGV4T2YoR0VORVJJQ19JRF9TVEFSVCk7Ci0JCWlmIChnZW5TdGFydCA+IC0xKSB7Ci0JCQljaGFyW10gY2hOYW1lID0gbmV3IGNoYXJbdHlwZU5hbWUubGVuZ3RoKCldOwotCQkJdHlwZU5hbWUuZ2V0Q2hhcnMoMCwgY2hOYW1lLmxlbmd0aCwgY2hOYW1lLCAwKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hOYW1lLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3dpdGNoIChjaE5hbWVbaV0pIHsKLQkJCQkJY2FzZSBHRU5FUklDX0lEX1NUQVJUOgotCQkJCQkJY2hOYW1lW2ldID0gR0VORVJJQ19TVEFSVDsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEdFTkVSSUNfSURfRU5EOgotCQkJCQkJY2hOYW1lW2ldID0gR0VORVJJQ19FTkQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBHRU5FUklDX0lEX1NFUEFSQVRPUjoKLQkJCQkJCWNoTmFtZVtpXSA9IEdFTkVSSUNfU0VQQVJBVE9SOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQl0eXBlTmFtZSA9IG5ldyBTdHJpbmcoY2hOYW1lKTsKLQkJfQotCQlyZXR1cm4gdHlwZU5hbWU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2dldFBhY2thZ2VOYW1lKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShVUkkgamF2YVVSSSkgewotCQlpZiAoaXNUeXBlVVJJKGphdmFVUkkpIHx8IGlzUGFja2FnZVVSSShqYXZhVVJJKSkgewotCQkJaWYgKGphdmFVUkkuc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJCXJldHVybiBqYXZhVVJJLnNlZ21lbnQoMCk7Ci0JCQl9IGVsc2UgaWYgKGphdmFVUkkuc2VnbWVudENvdW50KCkgPT0gMCkKLQkJCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQJCi0JCQllbHNlCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqYXZhVVJJLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oamF2YVVSSS50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3RvcnkjZ2V0RnVsbFR5cGVOYW1lKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVHlwZU5hbWUoVVJJIHR5cGVVUkkpIHsKLQkJU3RyaW5nIHBrZ05hbWUgPSBnZXRQYWNrYWdlTmFtZSh0eXBlVVJJKTsKLQkJaWYgKCFpc1R5cGVVUkkodHlwZVVSSSkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHR5cGVVUkkudG9TdHJpbmcoKSk7Ci0JCQotCQlpZiAocGtnTmFtZS5sZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gcGtnTmFtZSsnLicrZ2V0VHlwZU5hbWUodHlwZVVSSSk7Ci0JCWVsc2UKLQkJCXJldHVybiB0eXBlVVJJLmZyYWdtZW50KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2NyZWF0ZVBhY2thZ2VVUkkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgVVJJIGNyZWF0ZVBhY2thZ2VVUkkoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCVN0cmluZ1tdIHBrZ25hbWUgPSBudWxsOwotCQlpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJiBwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApCi0JCQlwa2duYW1lID0gbmV3IFN0cmluZ1tdIHtwYWNrYWdlTmFtZX07Ci0JCXJldHVybiBVUkkuY3JlYXRlSGllcmFyY2hpY2FsVVJJKEpBVkFfUFJPVE9DT0xfVVJJX1NDSEVNRSwgbnVsbCwgbnVsbCwgcGtnbmFtZSwgbnVsbCwgSmF2YVBhY2thZ2UuUEFDS0FHRV9JRCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2lzSmF2YVVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSmF2YVVSSShVUkkgdXJpKSB7Ci0JCXJldHVybiBKQVZBX1BST1RPQ09MX1VSSV9TQ0hFTUUuZXF1YWxzKHVyaS5zY2hlbWUoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2lzVHlwZVVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHlwZVVSSShVUkkgdXJpKSB7Ci0JCWlmIChpc0phdmFVUkkodXJpKSkgewotCQkJU3RyaW5nIGZyYWcgPSB1cmkuZnJhZ21lbnQoKTsKLQkJCWlmIChmcmFnICE9IG51bGwgJiYgIUphdmFQYWNrYWdlLlBBQ0tBR0VfSUQuZXF1YWxzKGZyYWcpKSB7Ci0JCQkJaW50IGRlbGltTmR4ID0gZnJhZy5pbmRleE9mKFJlZmxlY3Rpb25BZGFwdG9yLkNfQ0xBU1NfTUVNQkVSX0RFTElNSVRFUik7Ci0JCQkJaWYgKGRlbGltTmR4ICE9IC0xKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZGVsaW1OZHggPSBmcmFnLmluZGV4T2YoJy8nKTsJLy8gRnJvbSBiZWFuaW5mbyBmb3IgcHJvcGVydHkuCi0JCQkJaWYgKGRlbGltTmR4ICE9IC0xKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5I2lzUGFja2FnZVVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFja2FnZVVSSShVUkkgdXJpKSB7Ci0JCXJldHVybiBpc0phdmFVUkkodXJpKSAmJiBKYXZhUGFja2FnZS5QQUNLQUdFX0lELmVxdWFscyh1cmkuZnJhZ21lbnQoKSk7Ci0JfQotCi19Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVJlZlBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvSmF2YVJlZlBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNGQ1MTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL0phdmFSZWZQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgSmF2YVJlZlBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgSmF2YVJlZlBhY2thZ2UsIEVQYWNrYWdlIHt9Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVmUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBKYXZhUmVmUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgamF2YUNsYXNzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGluaXRpYWxpemVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFQYXJhbWV0ZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGZpZWxkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJsb2NrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc3RhdGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGphdmFEYXRhVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcnJheVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgamF2YUV2ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdHlwZUtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGphdmFWaXNpYmlsaXR5S2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gamF2YVBhcmFtZXRlcktpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBqVHlwZUphdmFIZWxwZXJzRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGpUeXBlTGlzdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkJICAgLyoqCi0JCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCQkgKi8KLQlwcml2YXRlIEphdmFSZWZQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyBub3QgdXNlLiBUaGlzIGlzIGhlcmUgb25seSBmb3IgdGhlIHVzZSBvZiB0aGUgb2xkZXIgZGVwcmVjYXRlZCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbC4KLQkgKiBAcGFyYW0gYgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXByb3RlY3RlZCBKYXZhUmVmUGFja2FnZUltcGwoYm9vbGVhbiBiKSB7Ci0JCXRoaXMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGhlcmUgb25seSBmb3Igb2xkZXIgcHJlLUVNRiAyLjIgZ2VuZXJhdGVkIGNvZGUgdGhhdCBhY2Nlc3NlcyB0aGUgcGFja2FnZSBkaXJlY3RseSBpbnN0ZWFkIG9mIHRocm91Z2ggdGhlIGludGVyZmFjZS4gTmV3Ci0JICogY29kZSBzaG91bGQgbm90IHVzZSB0aGlzIGRpcmVjdGx5LgotCSAqIEByZXR1cm4KLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFSZWZQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBOb3RlOiBOZWVkIHRvIGJlIGNhcmVmdWwgaGVyZS4gSWYgRU1GIGV2ZXIgY2hhbmdlcyBob3cgaXQgZ2VuZXJhdGVzIHRoZSBpbml0IG1ldGhvZCBhbmQgYXNzaWducyB0aGUKLQkJLy8gcGFja2FnZSBpbiBhIGRpZmZlcmVudCB3YXkgdGhlbiB0aGlzIHdpbGwgbmVlZCB0byBjaGFuZ2UgdG9vLgotCQlpZiAoIShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmplbS5qYXZhLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsKSkKLQkJCW5ldyBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbXBsLkphdmFSZWZQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gaW5pdEdlbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVJlZlBhY2thZ2UgaW5pdEdlbigpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEphdmFSZWZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJSmF2YVJlZlBhY2thZ2VJbXBsIHRoZUphdmFSZWZQYWNrYWdlID0gKEphdmFSZWZQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBKYXZhUmVmUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBKYXZhUmVmUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUphdmFSZWZQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlSmF2YVJlZlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlSmF2YVJlZlBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZUphdmFSZWZQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewotCQlyZXR1cm4gamF2YUNsYXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFDbGFzc19LaW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YUNsYXNzX1B1YmxpYygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEphdmFDbGFzc19GaW5hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19JbXBsZW1lbnRzSW50ZXJmYWNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19DbGFzc0ltcG9ydCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19QYWNrYWdlSW1wb3J0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19GaWVsZHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfTWV0aG9kcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19Jbml0aWFsaXplcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRGVjbGFyaW5nQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SmF2YUNsYXNzX0RlY2xhcmVkQ2xhc3NlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19KYXZhUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWphdmFDbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRKYXZhQ2xhc3NfRXZlbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YUNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFDbGFzc19BbGxFdmVudHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlqYXZhQ2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGaWVsZCgpIHsKLQkJcmV0dXJuIGZpZWxkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX0ZpbmFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWVsZF9TdGF0aWMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX0phdmFWaXNpYmlsaXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWVsZF9UcmFuc2llbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpZWxkX1ZvbGF0aWxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRGaWVsZF9KYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWVsZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEZpZWxkX0luaXRpYWxpemVyKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZmllbGRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RfQWJzdHJhY3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RfTmF0aXZlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kX1N5bmNocm9uaXplZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9GaW5hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9Db25zdHJ1Y3RvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZF9TdGF0aWMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RfSmF2YVZpc2liaWxpdHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RfUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZF9KYXZhRXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZF9KYXZhQ2xhc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RfU291cmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SmF2YVBhcmFtZXRlcigpIHsKLQkJcmV0dXJuIGphdmFQYXJhbWV0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SmF2YVBhcmFtZXRlcl9GaW5hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWphdmFQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKYXZhUGFyYW1ldGVyX1BhcmFtZXRlcktpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqYXZhUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnJheVR5cGUoKSB7Ci0JCXJldHVybiBhcnJheVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJyYXlUeXBlX0FycmF5RGltZW5zaW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFycmF5VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFycmF5VHlwZV9Db21wb25lbnRUeXBlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXJyYXlUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhRGF0YVR5cGUoKSB7Ci0JCXJldHVybiBqYXZhRGF0YVR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhRXZlbnQoKSB7Ci0JCXJldHVybiBqYXZhRXZlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKYXZhUGFja2FnZSgpIHsKLQkJcmV0dXJuIGphdmFQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEphdmFQYWNrYWdlX0phdmFDbGFzc2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpamF2YVBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJsb2NrKCkgewotCQlyZXR1cm4gYmxvY2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmxvY2tfU291cmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmxvY2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCbG9ja19OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYmxvY2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCbG9ja19Db250ZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWJsb2NrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21tZW50KCkgewotCQlyZXR1cm4gY29tbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIHN0YXRlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEluaXRpYWxpemVyKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SW5pdGlhbGl6ZXJfSXNTdGF0aWMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlpbml0aWFsaXplckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEluaXRpYWxpemVyX0phdmFDbGFzcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWluaXRpYWxpemVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW5pdGlhbGl6ZXJfU291cmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW5pdGlhbGl6ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0SmF2YVZpc2liaWxpdHlLaW5kKCkgewotCQlyZXR1cm4gamF2YVZpc2liaWxpdHlLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVFbnVtIGdldEphdmFQYXJhbWV0ZXJLaW5kKCkgewotCQlyZXR1cm4gamF2YVBhcmFtZXRlcktpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0VHlwZUtpbmQoKSB7Ci0JCXJldHVybiB0eXBlS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SlR5cGVMaXN0KCkgewotCQlyZXR1cm4galR5cGVMaXN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SlR5cGVKYXZhSGVscGVycygpIHsKLQkJcmV0dXJuIGpUeXBlSmF2YUhlbHBlcnNFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEphdmFSZWZGYWN0b3J5IGdldEphdmFSZWZGYWN0b3J5KCkgewotCQlyZXR1cm4gKEphdmFSZWZGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWphdmFDbGFzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0tJTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fUFVCTElDKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0ZJTkFMKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0lNUExFTUVOVFNfSU5URVJGQUNFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19DTEFTU19JTVBPUlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fUEFDS0FHRV9JTVBPUlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0ZJRUxEUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19NRVRIT0RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0lOSVRJQUxJWkVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19ERUNMQVJFRF9DTEFTU0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0RFQ0xBUklOR19DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoamF2YUNsYXNzRUNsYXNzLCBKQVZBX0NMQVNTX19KQVZBX1BBQ0tBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGphdmFDbGFzc0VDbGFzcywgSkFWQV9DTEFTU19fRVZFTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhQ2xhc3NFQ2xhc3MsIEpBVkFfQ0xBU1NfX0FMTF9FVkVOVFMpOwotCi0JCWluaXRpYWxpemVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOSVRJQUxJWkVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShpbml0aWFsaXplckVDbGFzcywgSU5JVElBTElaRVJfX0lTX1NUQVRJQyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoaW5pdGlhbGl6ZXJFQ2xhc3MsIElOSVRJQUxJWkVSX19KQVZBX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShpbml0aWFsaXplckVDbGFzcywgSU5JVElBTElaRVJfX1NPVVJDRSk7Ci0KLQkJamF2YVBhcmFtZXRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX1BBUkFNRVRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoamF2YVBhcmFtZXRlckVDbGFzcywgSkFWQV9QQVJBTUVURVJfX0ZJTkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqYXZhUGFyYW1ldGVyRUNsYXNzLCBKQVZBX1BBUkFNRVRFUl9fUEFSQU1FVEVSX0tJTkQpOwotCi0JCW1ldGhvZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19BQlNUUkFDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX05BVElWRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX1NZTkNIUk9OSVpFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRUNsYXNzLCBNRVRIT0RfX0ZJTkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fQ09OU1RSVUNUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19TVEFUSUMpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVDbGFzcywgTUVUSE9EX19QQVJBTUVURVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fSkFWQV9FWENFUFRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFQ2xhc3MsIE1FVEhPRF9fSkFWQV9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRUNsYXNzLCBNRVRIT0RfX1NPVVJDRSk7Ci0KLQkJZmllbGRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRklFTEQpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkRUNsYXNzLCBGSUVMRF9fRklOQUwpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkRUNsYXNzLCBGSUVMRF9fU1RBVElDKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShmaWVsZEVDbGFzcywgRklFTERfX0pBVkFfVklTSUJJTElUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZmllbGRFQ2xhc3MsIEZJRUxEX19UUkFOU0lFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkRUNsYXNzLCBGSUVMRF9fVk9MQVRJTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZpZWxkRUNsYXNzLCBGSUVMRF9fSkFWQV9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZmllbGRFQ2xhc3MsIEZJRUxEX19JTklUSUFMSVpFUik7Ci0KLQkJYmxvY2tFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQkxPQ0spOwotCQljcmVhdGVFQXR0cmlidXRlKGJsb2NrRUNsYXNzLCBCTE9DS19fU09VUkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShibG9ja0VDbGFzcywgQkxPQ0tfX05BTUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJsb2NrRUNsYXNzLCBCTE9DS19fQ09OVEVOVFMpOwotCi0JCWNvbW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NTUVOVCk7Ci0KLQkJc3RhdGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFNUQVRFTUVOVCk7Ci0KLQkJamF2YVBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSkFWQV9QQUNLQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShqYXZhUGFja2FnZUVDbGFzcywgSkFWQV9QQUNLQUdFX19KQVZBX0NMQVNTRVMpOwotCi0JCWphdmFEYXRhVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhKQVZBX0RBVEFfVFlQRSk7Ci0KLQkJYXJyYXlUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSUkFZX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGFycmF5VHlwZUVDbGFzcywgQVJSQVlfVFlQRV9fQVJSQVlfRElNRU5TSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXJyYXlUeXBlRUNsYXNzLCBBUlJBWV9UWVBFX19DT01QT05FTlRfVFlQRSk7Ci0KLQkJamF2YUV2ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEpBVkFfRVZFTlQpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl0eXBlS2luZEVFbnVtID0gY3JlYXRlRUVudW0oVFlQRV9LSU5EKTsKLQkJamF2YVZpc2liaWxpdHlLaW5kRUVudW0gPSBjcmVhdGVFRW51bShKQVZBX1ZJU0lCSUxJVFlfS0lORCk7Ci0JCWphdmFQYXJhbWV0ZXJLaW5kRUVudW0gPSBjcmVhdGVFRW51bShKQVZBX1BBUkFNRVRFUl9LSU5EKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQlqVHlwZUphdmFIZWxwZXJzRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEpUWVBFX0pBVkFfSEVMUEVSUyk7Ci0JCWpUeXBlTGlzdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShKVFlQRV9MSVNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJRWNvcmVQYWNrYWdlIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJamF2YUNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFQ2xhc3MoKSk7Ci0JCWphdmFQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVQYXJhbWV0ZXIoKSk7Ci0JCW1ldGhvZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RU9wZXJhdGlvbigpKTsKLQkJZmllbGRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVUeXBlZEVsZW1lbnQoKSk7Ci0JCWNvbW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCbG9jaygpKTsKLQkJc3RhdGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QmxvY2soKSk7Ci0JCWphdmFQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFUGFja2FnZSgpKTsKLQkJamF2YURhdGFUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFQ2xhc3MoKSk7Ci0JCWFycmF5VHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEphdmFDbGFzcygpKTsKLQkJamF2YUV2ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhqYXZhQ2xhc3NFQ2xhc3MsIEphdmFDbGFzcy5jbGFzcywgIkphdmFDbGFzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YUNsYXNzX0tpbmQoKSwgdGhpcy5nZXRUeXBlS2luZCgpLCAia2luZCIsIG51bGwsIDAsIDEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YUNsYXNzX1B1YmxpYygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInB1YmxpYyIsIG51bGwsIDAsIDEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YUNsYXNzX0ZpbmFsKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZmluYWwiLCBudWxsLCAwLCAxLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19JbXBsZW1lbnRzSW50ZXJmYWNlcygpLCB0aGlzLmdldEphdmFDbGFzcygpLCBudWxsLCAiaW1wbGVtZW50c0ludGVyZmFjZXMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfQ2xhc3NJbXBvcnQoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImNsYXNzSW1wb3J0IiwgbnVsbCwgMCwgLTEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX1BhY2thZ2VJbXBvcnRzKCksIHRoaXMuZ2V0SmF2YVBhY2thZ2UoKSwgbnVsbCwgInBhY2thZ2VJbXBvcnRzIiwgbnVsbCwgMCwgLTEsIEphdmFDbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YUNsYXNzX0ZpZWxkcygpLCB0aGlzLmdldEZpZWxkKCksIHRoaXMuZ2V0RmllbGRfSmF2YUNsYXNzKCksICJmaWVsZHMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfTWV0aG9kcygpLCB0aGlzLmdldE1ldGhvZCgpLCB0aGlzLmdldE1ldGhvZF9KYXZhQ2xhc3MoKSwgIm1ldGhvZHMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfSW5pdGlhbGl6ZXJzKCksIHRoaXMuZ2V0SW5pdGlhbGl6ZXIoKSwgdGhpcy5nZXRJbml0aWFsaXplcl9KYXZhQ2xhc3MoKSwgImluaXRpYWxpemVycyIsIG51bGwsIDAsIC0xLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19EZWNsYXJlZENsYXNzZXMoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgdGhpcy5nZXRKYXZhQ2xhc3NfRGVjbGFyaW5nQ2xhc3MoKSwgImRlY2xhcmVkQ2xhc3NlcyIsIG51bGwsIDAsIC0xLCBKYXZhQ2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFDbGFzc19EZWNsYXJpbmdDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzc19EZWNsYXJlZENsYXNzZXMoKSwgImRlY2xhcmluZ0NsYXNzIiwgbnVsbCwgMCwgMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfSmF2YVBhY2thZ2UoKSwgdGhpcy5nZXRKYXZhUGFja2FnZSgpLCB0aGlzLmdldEphdmFQYWNrYWdlX0phdmFDbGFzc2VzKCksICJqYXZhUGFja2FnZSIsIG51bGwsIDAsIDEsIEphdmFDbGFzcy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgIUlTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfRXZlbnRzKCksIHRoaXMuZ2V0SmF2YUV2ZW50KCksIG51bGwsICJldmVudHMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhQ2xhc3NfQWxsRXZlbnRzKCksIHRoaXMuZ2V0SmF2YUV2ZW50KCksIG51bGwsICJhbGxFdmVudHMiLCBudWxsLCAwLCAtMSwgSmF2YUNsYXNzLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlFT3BlcmF0aW9uIG9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNOZXN0ZWQiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEZpZWxkKCksICJnZXRGaWVsZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGROYW1lIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRGaWVsZCgpLCAiZ2V0RmllbGRFeHRlbmRlZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGROYW1lIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRGaWVsZCgpLCAiZ2V0RmllbGROYW1lZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmllbGROYW1lIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldEZpZWxkc0V4dGVuZGVkIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRNZXRob2QoKSwgImdldE1ldGhvZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWV0aG9kTmFtZSIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAicGFyYW1ldGVyVHlwZXMiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAiZ2V0TWV0aG9kRWxlbWVudFNpZ25hdHVyZXMiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldE1ldGhvZCgpLCAiZ2V0TWV0aG9kRXh0ZW5kZWQiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1ldGhvZE5hbWUiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKVHlwZUxpc3QoKSwgInBhcmFtZXRlclR5cGVzIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldE1ldGhvZHNFeHRlbmRlZCIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVMaXN0KCksICJnZXRPbmx5U3BlY2lmaWNNZXRob2RzIiwgMCwgMSk7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhTWV0aG9kTmFtZVByZWZpeCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAiZXhjbHVkZWROYW1lcyIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0TWV0aG9kKCksICJnZXRQdWJsaWNNZXRob2QiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1ldGhvZE5hbWUiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKVHlwZUxpc3QoKSwgInBhcmFtZXRlclR5cGVzIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldFB1YmxpY01ldGhvZHMiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCB0aGlzLmdldEpUeXBlTGlzdCgpLCAiZ2V0UHVibGljTWV0aG9kc0V4dGVuZGVkIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgdGhpcy5nZXRKVHlwZUxpc3QoKSwgImdldFB1YmxpY01ldGhvZHNOYW1lZCIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIHRoaXMuZ2V0SmF2YUNsYXNzKCksICJnZXRTdXBlcnR5cGUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImltcGxlbWVudHNJbnRlcmZhY2UiLCAwLCAxKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgImludGVyZmFjZVR5cGUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5mb1N0cmluZyIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaW5oZXJpdHNGcm9tIiwgMCwgMSk7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SmF2YUNsYXNzKCksICJqYXZhQ2xhc3MiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YUNsYXNzRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzRXhpc3RpbmdUeXBlIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFDbGFzc0VDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc0ludGVyZmFjZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhQ2xhc3NFQ2xhc3MsIG51bGwsICJzZXRTdXBlcnR5cGUiKTsKLQkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgImphdmFjbGFzcyIsIDAsIDEpOwotCi0JCWluaXRFQ2xhc3MoaW5pdGlhbGl6ZXJFQ2xhc3MsIEluaXRpYWxpemVyLmNsYXNzLCAiSW5pdGlhbGl6ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEluaXRpYWxpemVyX0lzU3RhdGljKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbk9iamVjdCgpLCAiaXNTdGF0aWMiLCBudWxsLCAwLCAxLCBJbml0aWFsaXplci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5pdGlhbGl6ZXJfSmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzX0luaXRpYWxpemVycygpLCAiamF2YUNsYXNzIiwgbnVsbCwgMCwgMSwgSW5pdGlhbGl6ZXIuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEluaXRpYWxpemVyX1NvdXJjZSgpLCB0aGlzLmdldEJsb2NrKCksIG51bGwsICJzb3VyY2UiLCBudWxsLCAwLCAxLCBJbml0aWFsaXplci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIEphdmFQYXJhbWV0ZXIuY2xhc3MsICJKYXZhUGFyYW1ldGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhUGFyYW1ldGVyX0ZpbmFsKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZmluYWwiLCBudWxsLCAwLCAxLCBKYXZhUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhUGFyYW1ldGVyX1BhcmFtZXRlcktpbmQoKSwgdGhpcy5nZXRKYXZhUGFyYW1ldGVyS2luZCgpLCAicGFyYW1ldGVyS2luZCIsIG51bGwsIDAsIDEsIEphdmFQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNBcnJheSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihqYXZhUGFyYW1ldGVyRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzUmV0dXJuIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGphdmFQYXJhbWV0ZXJFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiZ2V0SmF2YVR5cGUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YVBhcmFtZXRlckVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldFF1YWxpZmllZE5hbWUiLCAwLCAxKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZEVDbGFzcywgTWV0aG9kLmNsYXNzLCAiTWV0aG9kIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RfQWJzdHJhY3QoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJhYnN0cmFjdCIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX05hdGl2ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgIm5hdGl2ZSIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX1N5bmNocm9uaXplZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN5bmNocm9uaXplZCIsIG51bGwsIDAsIDEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kX0ZpbmFsKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZmluYWwiLCBudWxsLCAwLCAxLCBNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZF9Db25zdHJ1Y3RvcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImNvbnN0cnVjdG9yIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RfU3RhdGljKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAic3RhdGljIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RfSmF2YVZpc2liaWxpdHkoKSwgdGhpcy5nZXRKYXZhVmlzaWJpbGl0eUtpbmQoKSwgImphdmFWaXNpYmlsaXR5IiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RfUGFyYW1ldGVycygpLCB0aGlzLmdldEphdmFQYXJhbWV0ZXIoKSwgbnVsbCwgInBhcmFtZXRlcnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RfSmF2YUV4Y2VwdGlvbnMoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImphdmFFeGNlcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kX0phdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzcygpLCB0aGlzLmdldEphdmFDbGFzc19NZXRob2RzKCksICJqYXZhQ2xhc3MiLCBudWxsLCAwLCAxLCBNZXRob2QuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZF9Tb3VyY2UoKSwgdGhpcy5nZXRCbG9jaygpLCBudWxsLCAic291cmNlIiwgbnVsbCwgMCwgMSwgTWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIHRoaXMuZ2V0SmF2YUNsYXNzKCksICJnZXRDb250YWluaW5nSmF2YUNsYXNzIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCB0aGlzLmdldEphdmFQYXJhbWV0ZXIoKSwgImdldFBhcmFtZXRlciIsIDAsIDEpOwotCQlhZGRFUGFyYW1ldGVyKG9wLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1ldGVyTmFtZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiZ2V0UmV0dXJuVHlwZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIG51bGwsICJzZXRSZXR1cm5UeXBlIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAidHlwZSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihtZXRob2RFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJnZXRTaWduYXR1cmUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24obWV0aG9kRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImlzR2VuZXJhdGVkIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgbnVsbCwgInNldElzR2VuZXJhdGVkIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZ2VuZXJhdGVkIiwgMCwgMSk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKG1ldGhvZEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc1ZvaWQiLCAwLCAxKTsKLQotCQlpbml0RUNsYXNzKGZpZWxkRUNsYXNzLCBGaWVsZC5jbGFzcywgIkZpZWxkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWVsZF9GaW5hbCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImZpbmFsIiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpZWxkX1N0YXRpYygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN0YXRpYyIsIG51bGwsIDAsIDEsIEZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWVsZF9KYXZhVmlzaWJpbGl0eSgpLCB0aGlzLmdldEphdmFWaXNpYmlsaXR5S2luZCgpLCAiamF2YVZpc2liaWxpdHkiLCBudWxsLCAwLCAxLCBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmllbGRfVHJhbnNpZW50KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidHJhbnNpZW50IiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpZWxkX1ZvbGF0aWxlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidm9sYXRpbGUiLCBudWxsLCAwLCAxLCBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmllbGRfSmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzKCksIHRoaXMuZ2V0SmF2YUNsYXNzX0ZpZWxkcygpLCAiamF2YUNsYXNzIiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpZWxkX0luaXRpYWxpemVyKCksIHRoaXMuZ2V0QmxvY2soKSwgbnVsbCwgImluaXRpYWxpemVyIiwgbnVsbCwgMCwgMSwgRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGZpZWxkRUNsYXNzLCB0aGlzLmdldEphdmFDbGFzcygpLCAiZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihmaWVsZEVDbGFzcywgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc0FycmF5IiwgMCwgMSk7Ci0KLQkJaW5pdEVDbGFzcyhibG9ja0VDbGFzcywgQmxvY2suY2xhc3MsICJCbG9jayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmxvY2tfU291cmNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzb3VyY2UiLCBudWxsLCAwLCAxLCBCbG9jay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QmxvY2tfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEJsb2NrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRCbG9ja19Db250ZW50cygpLCB0aGlzLmdldEJsb2NrKCksIG51bGwsICJjb250ZW50cyIsIG51bGwsIDAsIC0xLCBCbG9jay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbW1lbnRFQ2xhc3MsIENvbW1lbnQuY2xhc3MsICJDb21tZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Moc3RhdGVtZW50RUNsYXNzLCBTdGF0ZW1lbnQuY2xhc3MsICJTdGF0ZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhqYXZhUGFja2FnZUVDbGFzcywgSmF2YVBhY2thZ2UuY2xhc3MsICJKYXZhUGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVBhY2thZ2VfSmF2YUNsYXNzZXMoKSwgdGhpcy5nZXRKYXZhQ2xhc3MoKSwgdGhpcy5nZXRKYXZhQ2xhc3NfSmF2YVBhY2thZ2UoKSwgImphdmFDbGFzc2VzIiwgbnVsbCwgMCwgLTEsIEphdmFQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCAhSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqYXZhRGF0YVR5cGVFQ2xhc3MsIEphdmFEYXRhVHlwZS5jbGFzcywgIkphdmFEYXRhVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oamF2YURhdGFUeXBlRUNsYXNzLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIiwgMCwgMSk7Ci0KLQkJaW5pdEVDbGFzcyhhcnJheVR5cGVFQ2xhc3MsIEFycmF5VHlwZS5jbGFzcywgIkFycmF5VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJyYXlUeXBlX0FycmF5RGltZW5zaW9ucygpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiYXJyYXlEaW1lbnNpb25zIiwgbnVsbCwgMCwgMSwgQXJyYXlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcnJheVR5cGVfQ29tcG9uZW50VHlwZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXIoKSwgbnVsbCwgImNvbXBvbmVudFR5cGUiLCBudWxsLCAxLCAxLCBBcnJheVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJb3AgPSBhZGRFT3BlcmF0aW9uKGFycmF5VHlwZUVDbGFzcywgdGhpcy5nZXRKVHlwZUphdmFIZWxwZXJzKCksICJnZXRGaW5hbENvbXBvbmVudFR5cGUiLCAwLCAxKTsKLQotCQlvcCA9IGFkZEVPcGVyYXRpb24oYXJyYXlUeXBlRUNsYXNzLCB0aGlzLmdldEpUeXBlSmF2YUhlbHBlcnMoKSwgImdldENvbXBvbmVudFR5cGVBc0hlbHBlciIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihhcnJheVR5cGVFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNQcmltaXRpdmVBcnJheSIsIDAsIDEpOwotCi0JCW9wID0gYWRkRU9wZXJhdGlvbihhcnJheVR5cGVFQ2xhc3MsIG51bGwsICJzZXRDb21wb25lbnRUeXBlIik7Ci0JCWFkZEVQYXJhbWV0ZXIob3AsIHRoaXMuZ2V0SlR5cGVKYXZhSGVscGVycygpLCAiaGVscGVyQ29tcG9uZW50VHlwZSIsIDAsIDEpOwotCi0JCWluaXRFQ2xhc3MoamF2YUV2ZW50RUNsYXNzLCBKYXZhRXZlbnQuY2xhc3MsICJKYXZhRXZlbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0odHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuY2xhc3MsICJUeXBlS2luZCIpOwotCQlhZGRFRW51bUxpdGVyYWwodHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHlwZUtpbmRFRW51bSwgVHlwZUtpbmQuQ0xBU1NfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0eXBlS2luZEVFbnVtLCBUeXBlS2luZC5JTlRFUkZBQ0VfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0eXBlS2luZEVFbnVtLCBUeXBlS2luZC5FWENFUFRJT05fTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGphdmFWaXNpYmlsaXR5S2luZEVFbnVtLCBKYXZhVmlzaWJpbGl0eUtpbmQuY2xhc3MsICJKYXZhVmlzaWJpbGl0eUtpbmQiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGphdmFWaXNpYmlsaXR5S2luZEVFbnVtLCBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVZpc2liaWxpdHlLaW5kRUVudW0sIEphdmFWaXNpYmlsaXR5S2luZC5QUklWQVRFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVZpc2liaWxpdHlLaW5kRUVudW0sIEphdmFWaXNpYmlsaXR5S2luZC5QUk9URUNURURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqYXZhVmlzaWJpbGl0eUtpbmRFRW51bSwgSmF2YVZpc2liaWxpdHlLaW5kLlBBQ0tBR0VfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGphdmFQYXJhbWV0ZXJLaW5kRUVudW0sIEphdmFQYXJhbWV0ZXJLaW5kLmNsYXNzLCAiSmF2YVBhcmFtZXRlcktpbmQiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGphdmFQYXJhbWV0ZXJLaW5kRUVudW0sIEphdmFQYXJhbWV0ZXJLaW5kLklOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVBhcmFtZXRlcktpbmRFRW51bSwgSmF2YVBhcmFtZXRlcktpbmQuT1VUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoamF2YVBhcmFtZXRlcktpbmRFRW51bSwgSmF2YVBhcmFtZXRlcktpbmQuSU5PVVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqYXZhUGFyYW1ldGVyS2luZEVFbnVtLCBKYXZhUGFyYW1ldGVyS2luZC5SRVRVUk5fTElURVJBTCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoalR5cGVKYXZhSGVscGVyc0VEYXRhVHlwZSwgSmF2YUhlbHBlcnMuY2xhc3MsICJKVHlwZUphdmFIZWxwZXJzIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVEYXRhVHlwZShqVHlwZUxpc3RFRGF0YVR5cGUsIExpc3QuY2xhc3MsICJKVHlwZUxpc3QiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0KLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9NZXRob2RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvTWV0aG9kSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDJlZDYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvaW50ZXJuYWwvaW1wbC9NZXRob2RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbDsKLQotLyoKLQotCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT3BlcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEltcGwgZXh0ZW5kcyBFT3BlcmF0aW9uSW1wbCBpbXBsZW1lbnRzIE1ldGhvZCB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNpZ25hdHVyZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Fic3RyYWN0KCkgPGVtPkFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQUJTVFJBQ1RfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWJzdHJhY3QoKSA8ZW0+QWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX0VGTEFHID0gMSA8PCAxMDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05hdGl2ZSgpIDxlbT5OYXRpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmF0aXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTkFUSVZFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05hdGl2ZSgpIDxlbT5OYXRpdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmF0aXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOQVRJVkVfRUZMQUcgPSAxIDw8IDExOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3luY2hyb25pemVkKCkgPGVtPlN5bmNocm9uaXplZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTeW5jaHJvbml6ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTWU5DSFJPTklaRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3luY2hyb25pemVkKCkgPGVtPlN5bmNocm9uaXplZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTeW5jaHJvbml6ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNZTkNIUk9OSVpFRF9FRkxBRyA9IDEgPDwgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaW5hbCgpIDxlbT5GaW5hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaW5hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJTkFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbmFsKCkgPGVtPkZpbmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ZpbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBGSU5BTF9FRkxBRyA9IDEgPDwgMTM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDb25zdHJ1Y3RvcigpIDxlbT5Db25zdHJ1Y3RvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDb25zdHJ1Y3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENPTlNUUlVDVE9SX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZmxhZyByZXByZXNlbnRpbmcgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NvbnN0cnVjdG9yKCkgPGVtPkNvbnN0cnVjdG9yPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0NvbnN0cnVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT05TVFJVQ1RPUl9FRkxBRyA9IDEgPDwgMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdGF0aWMoKSA8ZW0+U3RhdGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNUQVRJQ19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdGF0aWMoKSA8ZW0+U3RhdGljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N0YXRpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElDX0VGTEFHID0gMSA8PCAxNTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXZhVmlzaWJpbGl0eSgpIDxlbT5KYXZhIFZpc2liaWxpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEphdmFWaXNpYmlsaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFWaXNpYmlsaXR5S2luZCBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQgPSBKYXZhVmlzaWJpbGl0eUtpbmQuUFVCTElDX0xJVEVSQUw7Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGlzR2VuZXJhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVZpc2liaWxpdHlLaW5kIGphdmFWaXNpYmlsaXR5ID0gSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyYW1ldGVycygpIDxlbT5QYXJhbWV0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcmFtZXRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwYXJhbWV0ZXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFFeGNlcHRpb25zKCkgPGVtPkphdmEgRXhjZXB0aW9uczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhRXhjZXB0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGphdmFFeGNlcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZSgpIDxlbT5Tb3VyY2U8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJsb2NrIHNvdXJjZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0R2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFic3RyYWN0KGJvb2xlYW4gbmV3QWJzdHJhY3QpIHsKLQkJYm9vbGVhbiBvbGRBYnN0cmFjdCA9IChlRmxhZ3MgJiBBQlNUUkFDVF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0Fic3RyYWN0KSBlRmxhZ3MgfD0gQUJTVFJBQ1RfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5BQlNUUkFDVF9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19BQlNUUkFDVCwgb2xkQWJzdHJhY3QsIG5ld0Fic3RyYWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOYXRpdmVHZW4oKSB7Ci0JCXJldHVybiAoZUZsYWdzICYgTkFUSVZFX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hdGl2ZShib29sZWFuIG5ld05hdGl2ZSkgewotCQlib29sZWFuIG9sZE5hdGl2ZSA9IChlRmxhZ3MgJiBOQVRJVkVfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdOYXRpdmUpIGVGbGFncyB8PSBOQVRJVkVfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5OQVRJVkVfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fTkFUSVZFLCBvbGROYXRpdmUsIG5ld05hdGl2ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFNZTkNIUk9OSVpFRF9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6ZWQoYm9vbGVhbiBuZXdTeW5jaHJvbml6ZWQpIHsKLQkJYm9vbGVhbiBvbGRTeW5jaHJvbml6ZWQgPSAoZUZsYWdzICYgU1lOQ0hST05JWkVEX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3U3luY2hyb25pemVkKSBlRmxhZ3MgfD0gU1lOQ0hST05JWkVEX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+U1lOQ0hST05JWkVEX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NZTkNIUk9OSVpFRCwgb2xkU3luY2hyb25pemVkLCBuZXdTeW5jaHJvbml6ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmFsR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIEZJTkFMX0VGTEFHKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmFsKGJvb2xlYW4gbmV3RmluYWwpIHsKLQkJYm9vbGVhbiBvbGRGaW5hbCA9IChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMDsKLQkJaWYgKG5ld0ZpbmFsKSBlRmxhZ3MgfD0gRklOQUxfRUZMQUc7IGVsc2UgZUZsYWdzICY9IH5GSU5BTF9FRkxBRzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19GSU5BTCwgb2xkRmluYWwsIG5ld0ZpbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvckdlbigpIHsKLQkJcmV0dXJuIChlRmxhZ3MgJiBDT05TVFJVQ1RPUl9FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25zdHJ1Y3Rvcihib29sZWFuIG5ld0NvbnN0cnVjdG9yKSB7Ci0JCWJvb2xlYW4gb2xkQ29uc3RydWN0b3IgPSAoZUZsYWdzICYgQ09OU1RSVUNUT1JfRUZMQUcpICE9IDA7Ci0JCWlmIChuZXdDb25zdHJ1Y3RvcikgZUZsYWdzIHw9IENPTlNUUlVDVE9SX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+Q09OU1RSVUNUT1JfRUZMQUc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQ09OU1RSVUNUT1IsIG9sZENvbnN0cnVjdG9yLCBuZXdDb25zdHJ1Y3RvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3RhdGljR2VuKCkgewotCQlyZXR1cm4gKGVGbGFncyAmIFNUQVRJQ19FRkxBRykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0aWMoYm9vbGVhbiBuZXdTdGF0aWMpIHsKLQkJYm9vbGVhbiBvbGRTdGF0aWMgPSAoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwOwotCQlpZiAobmV3U3RhdGljKSBlRmxhZ3MgfD0gU1RBVElDX0VGTEFHOyBlbHNlIGVGbGFncyAmPSB+U1RBVElDX0VGTEFHOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NUQVRJQywgb2xkU3RhdGljLCBuZXdTdGF0aWMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGphdmEgY2xhc3MgdGhhdCB0aGlzIG1ldGhvZCBpcyBkZWZpbmVkIGluLgotCSAqLwotCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0Q29udGFpbmluZ0phdmFDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YUNsYXNzKCk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGVzIHRvIGVuc3VyZSByZWZsZWN0aW9uIGlzIGRvbmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHsKLQkJcmVmbGVjdFZhbHVlcygpOwotCQlyZXR1cm4gaXNBYnN0cmFjdEdlbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzQ29uc3RydWN0b3JHZW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmFsKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBpc0ZpbmFsR2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOYXRpdmUoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzTmF0aXZlR2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzU3RhdGljR2VuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGlzU3luY2hyb25pemVkR2VuKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEphdmFFeGNlcHRpb25zKCkgewotCQlyZWZsZWN0VmFsdWVzKCk7Ci0JCXJldHVybiBnZXRKYXZhRXhjZXB0aW9uc0dlbigpOwotCX0KLQotCXB1YmxpYyBKYXZhVmlzaWJpbGl0eUtpbmQgZ2V0SmF2YVZpc2liaWxpdHkoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGdldEphdmFWaXNpYmlsaXR5R2VuKCk7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldFBhcmFtZXRlcnMoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIGdldFBhcmFtZXRlcnNHZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50I2dldEVUeXBlKCkKLQkgKi8KLQlwdWJsaWMgRUNsYXNzaWZpZXIgZ2V0RVR5cGUoKSB7Ci0JCXJlZmxlY3RWYWx1ZXMoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgU3RyaW5nIHdpdGggdGhlIHRoZSBtZXRob2QgbmFtZSBhbmQgaXRzIHBhcmFtZXRlcnMuIGUuZy4gPGNvZGU+IHNldEZpcnN0TmFtZShqYXZhLmxhbmcuU3RyaW5nKSA8Ly9jb2RlPiAuCi0JICoKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoNzUpOwotCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQkJc2IuYXBwZW5kKCIoIik7Ci0JCUxpc3QgcGFyYW1zID0gZ2V0UGFyYW1ldGVycygpOwotCQlKYXZhUGFyYW1ldGVyIHBhcmFtOwotCQlpbnQgcGFybVNpemUgPSBwYXJhbXMuc2l6ZSgpOwotCQlpbnQgY29tbWFUZXN0ID0gMDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJtU2l6ZTsgaisrKSB7Ci0JCQlpZiAoaiA+IGNvbW1hVGVzdCkgewotCQkJCXNiLmFwcGVuZCgiLCIpOwotCQkJfQotCQkJcGFyYW0gPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldChqKTsKLQkJCS8vRkIgaWYgKHBhcmFtLmlzUmV0dXJuKCkpIHsKLQkJCS8vRkIgY29tbWFUZXN0ICsrOwotCQkJLy9GQiBjb250aW51ZTsKLQkJCS8vRkIgfQotCQkJc2IuYXBwZW5kKCgoSmF2YUhlbHBlcnMpIHBhcmFtLmdldEVUeXBlKCkpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCIpIik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIFBhcmFtZXRlciB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4KLQkgKi8KLQlwdWJsaWMgSmF2YVBhcmFtZXRlciBnZXRQYXJhbWV0ZXIoU3RyaW5nIHBhcmFtZXRlck5hbWUpIHsKLQkJTGlzdCBwYXJtcyA9IGdldFBhcmFtZXRlcnMoKTsKLQkJSmF2YVBhcmFtZXRlciBwYXJtOwotCQlpbnQgcGFybVNpemUgPSBwYXJtcy5zaXplKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcGFybVNpemU7IGorKykgewotCQkJcGFybSA9IChKYXZhUGFyYW1ldGVyKSBwYXJtcy5nZXQoaik7Ci0JCQlpZiAocGFybS5nZXROYW1lKCkuZXF1YWxzKHBhcmFtZXRlck5hbWUpKQotCQkJCXJldHVybiBwYXJtOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RfUkVGTEVDVEVEID0gMHgwLCBSRUZMRUNURURfQkFTRSA9IDB4MSwgUkVGTEVDVEVEX0dFTkVSQVRFRCA9IDB4MjsKLQotCXByb3RlY3RlZCBpbnQgcmVmbGVjdGlvblN0YXR1cyA9IE5PVF9SRUZMRUNURUQ7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsZWN0VmFsdWVzKCkgewotCQkvLyBXZSBvbmx5IHdhbnQgdGhlIHRlc3Rpbmcgb2YgdGhlIGhhc1JlZmxlY3RlZCBhbmQgZ2V0IHJlYWRhZGFwdGVyIHRvIGJlIHN5bmModGhpcykgc28gdGhhdAotCQkvLyBpdCBpcyBzaG9ydCBhbmQgbm8gZGVhZGxvY2sgcG9zc2liaWxpdHkgKHRoaXMgaXMgYmVjYXVzZSB0aGUgdGhlIG1ldGhvZCByZWZsZWN0aW9uIGFkYXB0ZXIgbWF5IGdvCi0JCS8vIGJhY2sgdG8gdGhlIGNvbnRhaW5pbmcgamF2YSBjbGFzcyB0byBnZXQgaXRzIHJlZmxlY3Rpb24gYWRhcHRlciwgd2hpY2ggd291bGQgbG9jayBvbiBpdHNlbGYuIFNvCi0JCS8vIHdlIG5lZWQgdG8ga2VlcCB0aGUgc2VjdGlvbnMgdGhhdCBhcmUgc3luYyh0aGlzKSB0byBub3QgYmUgZGVhZGxvY2thYmxlIGJ5IG5vdCBkb2luZyBzaWduaWZpY2FudCB3b3JrCi0JCS8vIGR1cmluZyB0aGUgc3luYy4KLQkJUmVhZEFkYXB0b3IgcmVhZEFkYXB0b3IgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWlmICgocmVmbGVjdGlvblN0YXR1cyAmIFJFRkxFQ1RFRF9CQVNFKSA9PSAwKSB7Ci0JCQkJcmVhZEFkYXB0b3IgPSBnZXRSZWFkQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCWlmIChyZWFkQWRhcHRvciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHNldFJlZmxlY3RlZCA9IHJlYWRBZGFwdG9yLnJlZmxlY3RWYWx1ZXNJZk5lY2Vzc2FyeSgpOwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJLy8gRG9uJ3Qgd2FudCB0byBzZXQgaXQgZmFsc2UuIFRoYXQgaXMgam9iIG9mIHJlZmxlY3Rpb24gYWRhcHRlci4gT3RoZXJ3aXNlIHdlIGNvdWxkIGhhdmUgYSByYWNlLgotCQkJCWlmIChzZXRSZWZsZWN0ZWQpCi0JCQkJCXJlZmxlY3Rpb25TdGF0dXMgfD0gUkVGTEVDVEVEX0JBU0U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoaXMgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgb3V0c2lkZSBvZiB0aGUgcmVmbGVjdGlvbiBhZGFwdGVycy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFJlYWRBZGFwdG9yIGdldFJlYWRBZGFwdGVyKCkgewotCQlyZXR1cm4gKFJlYWRBZGFwdG9yKSBFY29yZVV0aWwuZ2V0UmVnaXN0ZXJlZEFkYXB0ZXIodGhpcywgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCX0KLQotCS8qCi0JICogVXNlZCBieSByZWZsZWN0aW9uIGFkYXB0ZXIgdG8gY2xlYXIgdGhlIHJlZmxlY3Rpb24uIFRoaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYnkgb3RoZXJzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZWZsZWN0ZWQoYm9vbGVhbiByZWZsZWN0ZWQpIHsKLQkJaWYgKCFyZWZsZWN0ZWQpCi0JCQlyZWZsZWN0aW9uU3RhdHVzID0gTk9UX1JFRkxFQ1RFRDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJldHVybiB0eXBlLgotCSAqLwotCXB1YmxpYyBKYXZhSGVscGVycyBnZXRSZXR1cm5UeXBlKCkgewotCQlyZXR1cm4gKEphdmFIZWxwZXJzKSBnZXRFVHlwZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgewotCQlpZiAoc2lnbmF0dXJlID09IG51bGwpCi0JCQlzaWduYXR1cmUgPSBkb0dldFNpZ25hdHVyZSgpOwotCQlyZXR1cm4gc2lnbmF0dXJlOwotCX0KLQotCS8qKgotCSAqIFJlcGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QudG9TdHJpbmcoKS4KLQkgKiAKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBNZXRob2QuIFRoZSBzdHJpbmcgaXMgZm9ybWF0dGVkIGFzIHRoZSBtZXRob2QgYWNjZXNzIG1vZGlmaWVycywgaWYgYW55LCBmb2xsb3dlZCBieSB0aGUgbWV0aG9kIHJldHVybiB0eXBlLAotCSAqIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSBjbGFzcyBkZWNsYXJpbmcgdGhlIG1ldGhvZCwgZm9sbG93ZWQgYnkgYSBwZXJpb2QsIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgbmFtZSwgZm9sbG93ZWQgYnkgYQotCSAqIHBhcmVudGhlc2l6ZWQsIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBtZXRob2QncyBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgbWV0aG9kIHRocm93cyBjaGVja2VkIGV4Y2VwdGlvbnMsIHRoZSBwYXJhbWV0ZXIgbGlzdCBpcwotCSAqIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSB3b3JkIHRocm93cyBmb2xsb3dlZCBieSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB0aHJvd24gZXhjZXB0aW9uIHR5cGVzLgotCSAqIAotCSAqIEZvciBleGFtcGxlOgotCSAqIAotCSAqIHB1YmxpYyBib29sZWFuIGphdmEubGFuZy5PYmplY3QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICogCi0JICogVGhlIGFjY2VzcyBtb2RpZmllcnMgYXJlIHBsYWNlZCBpbiBjYW5vbmljYWwgb3JkZXIgYXMgc3BlY2lmaWVkIGJ5ICJUaGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIi4gVGhpcyBpcyBwdWJsaWMsCi0JICogPHR0PnByb3RlY3RlZDwvL3R0PiBvciA8dHQ+cHJpdmF0ZTwvL3R0PiBmaXJzdCwgYW5kIHRoZW4gb3RoZXIgbW9kaWZpZXJzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6IDx0dD5hYnN0cmFjdDwvL3R0PiwgPHR0PnN0YXRpYzwvL3R0PiwgPHR0PmZpbmFsPC8vdHQ+LCA8dHQ+c3luY2hyb25pemVkPC8vdHQ+IDx0dD5uYXRpdmU8Ly90dD4uCi0KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRvR2V0U2lnbmF0dXJlKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXN3aXRjaCAoZ2V0SmF2YVZpc2liaWxpdHkoKS5nZXRWYWx1ZSgpKSB7Ci0JCQljYXNlIEphdmFWaXNpYmlsaXR5S2luZC5QVUJMSUM6Ci0JCQkJc2IuYXBwZW5kKCJQdWJsaWMgIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEphdmFWaXNpYmlsaXR5S2luZC5QUk9URUNURUQ6Ci0JCQkJc2IuYXBwZW5kKCJQcm90ZWN0ZWQgIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEphdmFWaXNpYmlsaXR5S2luZC5QUklWQVRFOgotCQkJCXNiLmFwcGVuZCgiUHJpdmF0ZSAiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSmF2YVZpc2liaWxpdHlLaW5kLlBBQ0tBR0U6Ci0JCQkJc2IuYXBwZW5kKCJQYWNrYWdlICIpOwotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpc0Fic3RyYWN0KCkpCi0JCQlzYi5hcHBlbmQoImFic3RyYWN0ICIpOwotCQlpZiAoaXNTdGF0aWMoKSkKLQkJCXNiLmFwcGVuZCgic3RhdGljICIpOwotCQlpZiAoaXNGaW5hbCgpKQotCQkJc2IuYXBwZW5kKCJmaW5hbCAiKTsKLQkJaWYgKGlzU3luY2hyb25pemVkKCkpCi0JCQlzYi5hcHBlbmQoInN5bmNocm9uaXplZCAiKTsKLQkJaWYgKGlzTmF0aXZlKCkpCi0JCQlzYi5hcHBlbmQoIm5hdGl2ZSAiKTsKLQkJaWYgKGlzVm9pZCgpKQotCQkJc2IuYXBwZW5kKCJ2b2lkICIpOwotCQllbHNlCi0JCQlzYi5hcHBlbmQoZ2V0UmV0dXJuVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSArICIgIik7Ci0JCXNiLmFwcGVuZChnZXRDb250YWluaW5nSmF2YUNsYXNzKCkuZ2V0SmF2YU5hbWUoKSArICIuIik7Ci0JCXNiLmFwcGVuZChnZXROYW1lKCkgKyAiKCIpOwotCQlMaXN0IHBhcmFtcyA9IGdldFBhcmFtZXRlcnMoKTsKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTsKLQkJaW50IHBhcm1TaXplID0gcGFyYW1zLnNpemUoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXJtU2l6ZTsgaisrKSB7Ci0JCQlwYXJhbSA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KGopOwotCQkJLy9GQiBpZiAocGFyYW0uaXNSZXR1cm4oKSkKLQkJCS8vRkIgY29udGludWU7IC8vIGxpc3RQYXJhbWV0ZXJzKCkgaW5jbHVkZXMgcmV0dXJuIHR5cGUgaW4gYXJyYXkKLQkJCXNiLmFwcGVuZCgoKEphdmFIZWxwZXJzKSBwYXJhbS5nZXRFVHlwZSgpKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJaWYgKGogPCAocGFyYW1zLnNpemUoKSAtIDEpKSB7Ci0JCQkJc2IuYXBwZW5kKCIsIik7Ci0JCQl9Ci0JCX0KLQkJc2IuYXBwZW5kKCIpIik7Ci0JCUxpc3QgZXhjZXB0aW9ucyA9IGdldEphdmFFeGNlcHRpb25zKCk7Ci0JCUphdmFDbGFzcyBleGNlcHRpb247Ci0JCWlmIChleGNlcHRpb25zLnNpemUoKSA+IDApIHsKLQkJCXNiLmFwcGVuZCgiIHRocm93cyAiKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgZXhjZXB0aW9ucy5zaXplKCk7IGsrKykgewotCQkJCWV4Y2VwdGlvbiA9IChKYXZhQ2xhc3MpIGV4Y2VwdGlvbnMuZ2V0KGspOwotCQkJCXNiLmFwcGVuZChleGNlcHRpb24uZ2V0SmF2YU5hbWUoKSk7Ci0JCQkJaWYgKGsgPCAoZXhjZXB0aW9ucy5zaXplKCkgLSAxKSkgewotCQkJCQlzYi5hcHBlbmQoIiwiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdEdlbmVyYXRlZCgpIHsKLQkJLy8gV2Ugb25seSB3YW50IHRoZSB0ZXN0aW5nIG9mIHRoZSBoYXNSZWZsZWN0ZWQgYW5kIGdldCByZWFkYWRhcHRlciB0byBiZSBzeW5jKHRoaXMpIHNvIHRoYXQKLQkJLy8gaXQgaXMgc2hvcnQgYW5kIG5vIGRlYWRsb2NrIHBvc3NpYmlsaXR5ICh0aGlzIGlzIGJlY2F1c2UgdGhlIHRoZSBtZXRob2QgcmVmbGVjdGlvbiBhZGFwdGVyIG1heSBnbwotCQkvLyBiYWNrIHRvIHRoZSBjb250YWluaW5nIGphdmEgY2xhc3MgdG8gZ2V0IGl0cyByZWZsZWN0aW9uIGFkYXB0ZXIsIHdoaWNoIHdvdWxkIGxvY2sgb24gaXRzZWxmLiBTbwotCQkvLyB3ZSBuZWVkIHRvIGtlZXAgdGhlIHNlY3Rpb25zIHRoYXQgYXJlIHN5bmModGhpcykgdG8gbm90IGJlIGRlYWRsb2NrYWJsZSBieSBub3QgZG9pbmcgc2lnbmlmaWNhbnQgd29yawotCQkvLyBkdXJpbmcgdGhlIHN5bmMuCi0JCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gbnVsbDsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpZiAoKHJlZmxlY3Rpb25TdGF0dXMgJiBSRUZMRUNURURfR0VORVJBVEVEKSA9PSAwKSB7Ci0JCQkJcmVhZEFkYXB0b3IgPSBnZXRSZWFkQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCWlmIChyZWFkQWRhcHRvciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHNldFJlZmxlY3RlZCA9ICgoSUphdmFNZXRob2RBZGFwdGVyKSByZWFkQWRhcHRvcikucmVmbGVjdEdlbmVyYXRlZElmTmVjZXNzYXJ5KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkvLyBEb24ndCB3YW50IHRvIHNldCBpdCBmYWxzZS4gVGhhdCBpcyBqb2Igb2YgcmVmbGVjdGlvbiBhZGFwdGVyLiBPdGhlcndpc2Ugd2UgY291bGQgaGF2ZSBhIHJhY2UuCi0JCQkJaWYgKHNldFJlZmxlY3RlZCkKLQkJCQkJcmVmbGVjdGlvblN0YXR1cyB8PSAoUkVGTEVDVEVEX0dFTkVSQVRFRCB8IFJFRkxFQ1RFRF9CQVNFKTsgLy8gV2UgY2FuIGJlIGNlcnRhaW4gYmFzZSB3aWxsIGJlIGRvbmUgYnkgcmVmbGVjdCBnZW5lcmF0ZWQgaWYgbm90IGFscmVhZHkKLQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIGRvbmUuCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZCBpcyBzeXN0ZW0gZ2VuZXJhdGVkLiBUaGlzIGlzIHVzdWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgImdlbmVyYXRlZCIgdGFnIGluIHRoZSBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVkKCkgewotCQlyZWZsZWN0R2VuZXJhdGVkKCk7Ci0JCXJldHVybiBpc0dlbmVyYXRlZDsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlZEdlbigpIHsKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhpcyBhIHZvaWQgcmV0dXJuIHR5cGUgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVm9pZCgpIHsKLQkJLy9GQiByZXR1cm4gKGdldFJldHVyblBhcmFtZXRlcigpID09IG51bGwgfHwgInZvaWQiLmVxdWFscyhnZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpKSk7Ci0JCXJldHVybiAoZ2V0UmV0dXJuVHlwZSgpID09IG51bGwgfHwgInZvaWQiLmVxdWFscyhnZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1M6Ci0JCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCXJldHVybiBiYXNpY1NldEphdmFDbGFzcygoSmF2YUNsYXNzKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1BBUkFNRVRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQYXJhbWV0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTOgotCQkJCUphdmFDbGFzcyBuZXdDb250YWluZXIgPSBudWxsOwotCQkJCVJlYWRBZGFwdG9yIHJlYWRBZGFwdG9yID0gZ2V0UmVhZEFkYXB0ZXIoKTsKLQkJCQlpZiAocmVhZEFkYXB0b3IgaW5zdGFuY2VvZiBKYXZhUmVmbGVjdGlvbkFkYXB0b3IgJiYgb3RoZXJFbmQgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpCi0JCQkJewotCQkJCQluZXdDb250YWluZXIgPSAoKEphdmFSZWZsZWN0aW9uQWRhcHRvcilyZWFkQWRhcHRvcikuY3JlYXRlSmF2YUNsYXNzUmVmKCgoSmF2YUNsYXNzKW90aGVyRW5kKS5nZXRKYXZhTmFtZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SmF2YUNsYXNzKG5ld0NvbnRhaW5lciwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gaXNBYnN0cmFjdCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQVRJVkU6Ci0JCQkJcmV0dXJuIGlzTmF0aXZlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NZTkNIUk9OSVpFRDoKLQkJCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRklOQUw6Ci0JCQkJcmV0dXJuIGlzRmluYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQ09OU1RSVUNUT1I6Ci0JCQkJcmV0dXJuIGlzQ29uc3RydWN0b3IoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1RBVElDOgotCQkJCXJldHVybiBpc1N0YXRpYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJcmV0dXJuIGdldEphdmFWaXNpYmlsaXR5KCk7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVycygpOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfRVhDRVBUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0SmF2YUV4Y2VwdGlvbnMoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TT1VSQ0U6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRTb3VyY2UoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0FCU1RSQUNUOgotCQkJCXNldEFic3RyYWN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19OQVRJVkU6Ci0JCQkJc2V0TmF0aXZlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TWU5DSFJPTklaRUQ6Ci0JCQkJc2V0U3luY2hyb25pemVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19GSU5BTDoKLQkJCQlzZXRGaW5hbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQ09OU1RSVUNUT1I6Ci0JCQkJc2V0Q29uc3RydWN0b3IoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NUQVRJQzoKLQkJCQlzZXRTdGF0aWMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfVklTSUJJTElUWToKLQkJCQlzZXRKYXZhVmlzaWJpbGl0eSgoSmF2YVZpc2liaWxpdHlLaW5kKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUEFSQU1FVEVSUzoKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9FWENFUFRJT05TOgotCQkJCWdldEphdmFFeGNlcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRKYXZhRXhjZXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0pBVkFfQ0xBU1M6Ci0JCQkJc2V0SmF2YUNsYXNzKChKYXZhQ2xhc3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChCbG9jayluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19BQlNUUkFDVDoKLQkJCQlzZXRBYnN0cmFjdChBQlNUUkFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX05BVElWRToKLQkJCQlzZXROYXRpdmUoTkFUSVZFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1lOQ0hST05JWkVEOgotCQkJCXNldFN5bmNocm9uaXplZChTWU5DSFJPTklaRURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19GSU5BTDoKLQkJCQlzZXRGaW5hbChGSU5BTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0NPTlNUUlVDVE9SOgotCQkJCXNldENvbnN0cnVjdG9yKENPTlNUUlVDVE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU1RBVElDOgotCQkJCXNldFN0YXRpYyhTVEFUSUNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX1ZJU0lCSUxJVFk6Ci0JCQkJc2V0SmF2YVZpc2liaWxpdHkoSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUEFSQU1FVEVSUzoKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9FWENFUFRJT05TOgotCQkJCWdldEphdmFFeGNlcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUzoKLQkJCQlzZXRKYXZhQ2xhc3MoKEphdmFDbGFzcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFOgotCQkJCXNldFNvdXJjZSgoQmxvY2spbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQUJTVFJBQ1RfRUZMQUcpICE9IDApICE9IEFCU1RSQUNUX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX05BVElWRToKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBOQVRJVkVfRUZMQUcpICE9IDApICE9IE5BVElWRV9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TWU5DSFJPTklaRUQ6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgU1lOQ0hST05JWkVEX0VGTEFHKSAhPSAwKSAhPSBTWU5DSFJPTklaRURfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fRklOQUw6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgRklOQUxfRUZMQUcpICE9IDApICE9IEZJTkFMX0VERUZBVUxUOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX0NPTlNUUlVDVE9SOgotCQkJCXJldHVybiAoKGVGbGFncyAmIENPTlNUUlVDVE9SX0VGTEFHKSAhPSAwKSAhPSBDT05TVFJVQ1RPUl9FREVGQVVMVDsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19TVEFUSUM6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwKSAhPSBTVEFUSUNfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9WSVNJQklMSVRZOgotCQkJCXJldHVybiBqYXZhVmlzaWJpbGl0eSAhPSBKQVZBX1ZJU0lCSUxJVFlfRURFRkFVTFQ7Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gcGFyYW1ldGVycyAhPSBudWxsICYmICFwYXJhbWV0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0VYQ0VQVElPTlM6Ci0JCQkJcmV0dXJuIGphdmFFeGNlcHRpb25zICE9IG51bGwgJiYgIWphdmFFeGNlcHRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBnZXRKYXZhQ2xhc3MoKSAhPSBudWxsOwotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1NPVVJDRToKLQkJCQlyZXR1cm4gc291cmNlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCXB1YmxpYyBKYXZhUGFyYW1ldGVyW10gbGlzdFBhcmFtZXRlcnNXaXRob3V0UmV0dXJuKCkgewotCQlDb2xsZWN0aW9uIHYgPSBnZXRQYXJhbWV0ZXJzKCk7Ci0JCUphdmFQYXJhbWV0ZXJbXSByZXN1bHQgPSBuZXcgSmF2YVBhcmFtZXRlclt2LnNpemUoKV07Ci0JCXYudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBFTGlzdCBlQ29udGVudHMoKSB7Ci0JCUVMaXN0IHJlc3VsdHMgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQlyZXN1bHRzLmFkZEFsbChnZXRQYXJhbWV0ZXJzR2VuKCkpOyAvL0ZCCi0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgaXNHZW5lcmF0ZWQgZmxhZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0dlbmVyYXRlZChib29sZWFuIGdlbmVyYXRlZCkgewotCQlpc0dlbmVyYXRlZCA9IGdlbmVyYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHJldHVybiB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZShKYXZhSGVscGVycyB0eXBlKSB7Ci0JCXRoaXMuc2V0RVR5cGUodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCi0JICovCi0JcHVibGljIEphdmFWaXNpYmlsaXR5S2luZCBnZXRKYXZhVmlzaWJpbGl0eUdlbigpIHsKLQkJcmV0dXJuIGphdmFWaXNpYmlsaXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFWaXNpYmlsaXR5KEphdmFWaXNpYmlsaXR5S2luZCBuZXdKYXZhVmlzaWJpbGl0eSkgewotCQlKYXZhVmlzaWJpbGl0eUtpbmQgb2xkSmF2YVZpc2liaWxpdHkgPSBqYXZhVmlzaWJpbGl0eTsKLQkJamF2YVZpc2liaWxpdHkgPSBuZXdKYXZhVmlzaWJpbGl0eSA9PSBudWxsID8gSkFWQV9WSVNJQklMSVRZX0VERUZBVUxUIDogbmV3SmF2YVZpc2liaWxpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9WSVNJQklMSVRZLCBvbGRKYXZhVmlzaWJpbGl0eSwgamF2YVZpc2liaWxpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTKSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEphdmFDbGFzcyhKYXZhQ2xhc3MgbmV3SmF2YUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUywgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFDbGFzcyhKYXZhQ2xhc3MgbmV3SmF2YUNsYXNzKSB7Ci0JCWlmIChuZXdKYXZhQ2xhc3MgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gSmF2YVJlZlBhY2thZ2UuTUVUSE9EX19KQVZBX0NMQVNTICYmIG5ld0phdmFDbGFzcyAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0phdmFDbGFzcykpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0phdmFDbGFzcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdKYXZhQ2xhc3MpLmVJbnZlcnNlQWRkKHRoaXMsIEphdmFSZWZQYWNrYWdlLkpBVkFfQ0xBU1NfX01FVEhPRFMsIEphdmFDbGFzcy5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRKYXZhQ2xhc3MobmV3SmF2YUNsYXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9DTEFTUywgbmV3SmF2YUNsYXNzLCBuZXdKYXZhQ2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgQmxvY2sgZ2V0U291cmNlKCkgewotCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRTb3VyY2UgPSAoSW50ZXJuYWxFT2JqZWN0KXNvdXJjZTsKLQkJCXNvdXJjZSA9IChCbG9jayllUmVzb2x2ZVByb3h5KG9sZFNvdXJjZSk7Ci0JCQlpZiAoc291cmNlICE9IG9sZFNvdXJjZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFLCBvbGRTb3VyY2UsIHNvdXJjZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJsb2NrIGJhc2ljR2V0U291cmNlKCkgewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShCbG9jayBuZXdTb3VyY2UpIHsKLQkJQmxvY2sgb2xkU291cmNlID0gc291cmNlOwotCQlzb3VyY2UgPSBuZXdTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fU09VUkNFLCBvbGRTb3VyY2UsIHNvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhYnN0cmFjdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIEFCU1RSQUNUX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYXRpdmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBOQVRJVkVfRUZMQUcpICE9IDApOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN5bmNocm9uaXplZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoKGVGbGFncyAmIFNZTkNIUk9OSVpFRF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBGSU5BTF9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29uc3RydWN0b3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKChlRmxhZ3MgJiBDT05TVFJVQ1RPUl9FRkxBRykgIT0gMCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhdGljOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCgoZUZsYWdzICYgU1RBVElDX0VGTEFHKSAhPSAwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqYXZhVmlzaWJpbGl0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoamF2YVZpc2liaWxpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0UGFyYW1ldGVyc0dlbigpIHsKLQkJaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCkgewotCQkJcGFyYW1ldGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChKYXZhUGFyYW1ldGVyLmNsYXNzLCB0aGlzLCBKYXZhUmVmUGFja2FnZS5NRVRIT0RfX1BBUkFNRVRFUlMpOwotCQl9Ci0JCXJldHVybiBwYXJhbWV0ZXJzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uIAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRKYXZhRXhjZXB0aW9uc0dlbigpIHsKLQkJaWYgKGphdmFFeGNlcHRpb25zID09IG51bGwpIHsKLQkJCWphdmFFeGNlcHRpb25zID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdChKYXZhQ2xhc3MuY2xhc3MsIHRoaXMsIEphdmFSZWZQYWNrYWdlLk1FVEhPRF9fSkFWQV9FWENFUFRJT05TKTsKLQkJfQotCQlyZXR1cm4gamF2YUV4Y2VwdGlvbnM7Ci0JfQotCi0JICBAT3ZlcnJpZGUKLQkgIHB1YmxpYyBFTGlzdDxFT2JqZWN0PiBlQ3Jvc3NSZWZlcmVuY2VzKCkKLQkgIHsKLQkgICAgaWYgKGVDcm9zc1JlZmVyZW5jZXMgPT0gbnVsbCkKLQkgICAgewotCSAgICAgIGVDcm9zc1JlZmVyZW5jZXMgPSBFQ3Jvc3NSZWZlcmVuY2VFTGlzdC5jcmVhdGVFQ3Jvc3NSZWZlcmVuY2VFTGlzdCh0aGlzKTsKLQkgICAgfQotCSAgICByZXR1cm4gZUNyb3NzUmVmZXJlbmNlczsKLQkgIH0KLQotfQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvU3RhdGVtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1N0YXRlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiZmU3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvU3RhdGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuU3RhdGVtZW50OwotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZW1lbnRJbXBsIGV4dGVuZHMgQmxvY2tJbXBsIGltcGxlbWVudHMgU3RhdGVtZW50IHsKLQotCXByb3RlY3RlZCBTdGF0ZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIEphdmFSZWZQYWNrYWdlLkxpdGVyYWxzLlNUQVRFTUVOVDsKLQl9Ci0KLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvVVJMLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL2ludGVybmFsL2ltcGwvVVJMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZmQzMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS9pbnRlcm5hbC9pbXBsL1VSTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsOwotLyoKLQotCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgVVJMIHsKLQlwdWJsaWMgU3RyaW5nIG5hbWVzcGFjZU5hbWU7Ci0JcHVibGljIFN0cmluZyBJRDsKLQlMaXN0IGF0dHJpYnV0ZU5hbWVzOwotLyoqCi0gKiBVUkwgY29uc3RydWN0b3IgY29tbWVudC4KLSAqLwotcHVibGljIFVSTChTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JaW5pdGlhbGl6ZUZyb21TdHJpbmcodXJsU3RyaW5nKTsKLX0KLS8qKgotICogVVJMIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKi8KLXB1YmxpYyBVUkwoU3RyaW5nIG5hbWVTcGFjZU5hbWUsIFN0cmluZyBhbklEKSB7Ci0JdGhpcy5uYW1lc3BhY2VOYW1lID0gbmFtZVNwYWNlTmFtZTsKLQl0aGlzLklEID0gYW5JRDsKLX0KLXB1YmxpYyBMaXN0IGdldEF0dHJpYnV0ZU5hbWVzKCkgewotCXJldHVybiBhdHRyaWJ1dGVOYW1lczsKLX0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tU3RyaW5nKFN0cmluZyB1cmxTdHJpbmcpIHsKLQlpbnQgcG91bmRJbnggPSB1cmxTdHJpbmcubGFzdEluZGV4T2YoJyMnKTsKLQlpZiAocG91bmRJbnggPiAtMSkgewotCQluYW1lc3BhY2VOYW1lID0gdXJsU3RyaW5nLnN1YnN0cmluZygwLCBwb3VuZElueCk7Ci0JCXVybFN0cmluZyA9IHVybFN0cmluZy5zdWJzdHJpbmcocG91bmRJbnggKyAxKTsKLQkJaW50IGRvdEluZGV4ID0gdXJsU3RyaW5nLmluZGV4T2YoIi0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRvdEluZGV4ID4gLTEpIHsKLQkJCUlEID0gdXJsU3RyaW5nLnN1YnN0cmluZygwLCBkb3RJbmRleCk7Ci0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZVN0cmluZyA9IHVybFN0cmluZy5zdWJzdHJpbmcoZG90SW5kZXggKyAyKTsKLQkJCWF0dHJpYnV0ZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZG8gewotCQkJCWRvdEluZGV4ID0gYXR0cmlidXRlTmFtZVN0cmluZy5pbmRleE9mKCItPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGRvdEluZGV4ID4gLTEpIHsKLQkJCQkJYXR0cmlidXRlTmFtZXMuYWRkKGF0dHJpYnV0ZU5hbWVTdHJpbmcuc3Vic3RyaW5nKDAsIGRvdEluZGV4KSk7Ci0JCQkJCWF0dHJpYnV0ZU5hbWVTdHJpbmcgPSBhdHRyaWJ1dGVOYW1lU3RyaW5nLnN1YnN0cmluZyhkb3RJbmRleCArIDIpOwotCQkJCX0gZWxzZQotCQkJCQlhdHRyaWJ1dGVOYW1lcy5hZGQoYXR0cmlidXRlTmFtZVN0cmluZyk7Ci0JCQl9IHdoaWxlIChkb3RJbmRleCA+IC0xKTsKLQkJfSBlbHNlIHsKLQkJCUlEID0gdXJsU3RyaW5nOwotCQl9Ci0JfSBlbHNlIHsKLQkJLy8gYXNzdW1lIHRoYXQgYW55IFVSTCBzdHJpbmcgdGhhdCBlbmRzIHdpdGggLnhtaSBpcyBhIG5hbWVzcGFjZS4KLQkJaWYgKHVybFN0cmluZy5lbmRzV2l0aCgiLnhtaSIpKXsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZXNwYWNlTmFtZSA9IHVybFN0cmluZzsKLQkJCUlEID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCW5hbWVzcGFjZU5hbWUgPSAiP2RlZmF1bHRVUkw/IjsgLy8kTk9OLU5MUy0xJAotCQkJSUQgPSB1cmxTdHJpbmc7Ci0JCX0KLQl9Ci19Ci1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCXJldHVybiAiVVJMKCIgKyAoKG5hbWVzcGFjZU5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWVzcGFjZU5hbWUgKyAiIyIpICsgKChJRCA9PSBudWxsKSA/ICIiIDogSUQpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLX0KLX0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvSmF2YUNvbnRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9KYXZhQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzM4NmYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9KYXZhQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5qZGsuSmF2YUpES0FkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIFN0YXRpYyBoZWxwZXIgY2xhc3MgdG8gaGFuZGxlIHRoZSBqYXZhIGNvbnRleHQuIFRoZSBqYXZhIGNvbnRleHQgaXMgYSByZXNvdXJjZSBzZXQKLSAqIHRoYXQgaGFzIHRoZSBhcHByb3ByaWF0ZSByZWZsZWN0aW9uIGFkYXB0ZXIgYXR0YWNoZWQsIGVpdGhlciBmb3IgamF2YSByZWZsZWN0aW9uIG9yCi0gKiBmb3IgSkRUIHJlZmxlY3Rpb24uIFRoZSBkZWZhdWx0IGlzIGZvciBqYXZhIHJlZmxlY3Rpb24uIFdoZW4gcnVubmluZyBpbiBFY2xpcHNlIGl0Ci0gKiB3aWxsIGJlIHRoZSBKRFQgcmVmbGVjdGlvbi4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+VGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGN1c3RvbWVycyB0aGF0IGFyZSBub3QgZG9pbmcgbm9ybWFsIEVjbGlwc2UgSkRUIEpFTQotICogcmVmbGVjdGlvbi4gTm9ybWFsIEpFTSBzaG91bGQgYmUgdXNpbmcgdGhlIEpFTSBFTUYgbmF0dXJlIGFjY2VzcyBpbnN0ZWFkLgotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQ29udGV4dCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDbGFzcyBSZWZsZWN0aW9uRmFjdG9yeUNsYXNzID0gSmF2YUpES0FkYXB0ZXJGYWN0b3J5LmNsYXNzOwotCQotCXByaXZhdGUgSmF2YUNvbnRleHQoKSB7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgdGhlIGphdmEgY29udGV4dC4gVG8gYmUgdXNlZCBvdXRzaWRlIG9mIEVjbGlwc2UuCi0JICogV2l0aGluIG5vcm1hbCBFY2xpcHNlIEpFTSB1c2FnZSB0aGUgSkVNIEVNRiBuYXR1cmUgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KLQkgKiBAcmV0dXJuCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVNldCBjcmVhdGVKYXZhQ29udGV4dCgpIHsKLQkJb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdC5KYXZhSW5pdC5pbml0KCk7Ci0JCVJlc291cmNlU2V0IHNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQkJc2V0LmdldEFkYXB0ZXJGYWN0b3JpZXMoKS5hZGQoY3JlYXRlSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSgpKTsKLQkJcmV0dXJuIHNldDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQWRhcHRlckZhY3RvcnkgY3JlYXRlSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeUluc3RhbmNlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChnZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcygpICE9IG51bGwpCi0JCQkJZmFjdG9yeUluc3RhbmNlID0gKEFkYXB0ZXJGYWN0b3J5KSBnZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcygpLm5ld0luc3RhbmNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBSZWZsZWN0aW9uIG9yIGluc3RhbnRpYXRpb24gcHJvYmxlbXMuCi0JCQkvLyBPSywgY2FuJ3QgZG8gSmF2YSBNb2RlbCByZWZsZWN0aW9uCi0JCX0KLQkJcmV0dXJuIGZhY3RvcnlJbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENsYXNzIGZvciB0aGUgSmF2YSByZWZlY3Rpb24gYWRhcHRlciBmYWN0b3J5LgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzIGdldFJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gUmVmbGVjdGlvbkZhY3RvcnlDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIENsYXNzIGZvciB0aGUgSmF2YSByZWZlY3Rpb24gYWRhcHRlciBmYWN0b3J5LiBXaXRoaW4gRWNsaXBzZSB0aGlzIHNob3VsZCBub3QKLQkgKiBiZSBzZXQgYnkgY3VzdG9tZXJzLgotCSAqIAotCSAqIEBwYXJhbSBqYXZhUmVmbGVjdGlvbkZhY3RvcnlDbGFzcwotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnlDbGFzcyhDbGFzcyBqYXZhUmVmbGVjdGlvbkZhY3RvcnlDbGFzcykgewotCQlSZWZsZWN0aW9uRmFjdG9yeUNsYXNzID0gamF2YVJlZmxlY3Rpb25GYWN0b3J5Q2xhc3M7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvSmF2YVJlZkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvSmF2YVJlZkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzZlNzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFSZWZBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEudXRpbDsKLS8qCi0KLQotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS4qOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVJlZkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSmF2YVJlZlBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKYXZhUmVmQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFSZWZTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgSmF2YVJlZlN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFDbGFzcyhKYXZhQ2xhc3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFDbGFzc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUluaXRpYWxpemVyKEluaXRpYWxpemVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJbml0aWFsaXplckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFQYXJhbWV0ZXIoSmF2YVBhcmFtZXRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlSmF2YVBhcmFtZXRlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZChNZXRob2Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUZpZWxkKEZpZWxkIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVGaWVsZEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUJsb2NrKEJsb2NrIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVCbG9ja0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbW1lbnQoQ29tbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29tbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVN0YXRlbWVudChTdGF0ZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVN0YXRlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFQYWNrYWdlKEphdmFQYWNrYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVKYXZhUGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFEYXRhVHlwZShKYXZhRGF0YVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFEYXRhVHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFycmF5VHlwZShBcnJheVR5cGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFycmF5VHlwZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFFdmVudChKYXZhRXZlbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUphdmFFdmVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVNb2RlbEVsZW1lbnQoRU1vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzc2lmaWVyKEVDbGFzc2lmaWVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFQ2xhc3NpZmllckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzcyhFQ2xhc3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVDbGFzc0FkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVUeXBlZEVsZW1lbnQoRVR5cGVkRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRVR5cGVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVQYXJhbWV0ZXIoRVBhcmFtZXRlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRVBhcmFtZXRlckFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVPcGVyYXRpb24oRU9wZXJhdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9wZXJhdGlvbkFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVQYWNrYWdlKEVQYWNrYWdlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFUGFja2FnZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKLQkJCX0KLQkJfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdGFyZ2V0IHRoZSBvYmplY3QgdG8gYWRhcHQuCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MgPGVtPkphdmEgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFDbGFzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSW5pdGlhbGl6ZXIgPGVtPkluaXRpYWxpemVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkluaXRpYWxpemVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUluaXRpYWxpemVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyIDxlbT5KYXZhIFBhcmFtZXRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUphdmFQYXJhbWV0ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmplbS5qYXZhLkZpZWxkIDxlbT5GaWVsZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVGaWVsZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuQmxvY2sgPGVtPkJsb2NrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkJsb2NrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJsb2NrQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5Db21tZW50IDxlbT5Db21tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkNvbW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuU3RhdGVtZW50IDxlbT5TdGF0ZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuU3RhdGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YXRlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhY2thZ2UgPGVtPkphdmEgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YURhdGFUeXBlIDxlbT5KYXZhIERhdGEgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRGF0YVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YURhdGFUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qZW0uamF2YS5BcnJheVR5cGUgPGVtPkFycmF5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmphdmEuQXJyYXlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFycmF5VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUV2ZW50IDxlbT5KYXZhIEV2ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFFdmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhRXZlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50IDxlbT5FTW9kZWwgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFTW9kZWxFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudCA8ZW0+RU5hbWVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyIDxlbT5FQ2xhc3NpZmllcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUNsYXNzaWZpZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MgPGVtPkVDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVDbGFzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQgPGVtPkVUeXBlZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFyYW1ldGVyIDxlbT5FUGFyYW1ldGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFyYW1ldGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVQYXJhbWV0ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uIDxlbT5FT3BlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPcGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUgPGVtPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZSA8ZW0+RVBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0phdmFSZWZBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFSZWZTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9KYXZhUmVmU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZjQyODAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vbW9mamF2YS9vcmcvZWNsaXBzZS9qZW0vamF2YS91dGlsL0phdmFSZWZTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS5qYXZhLnV0aWw7Ci0KLS8qCi0KLQotICovCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaCBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVmU3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEphdmFSZWZQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YVJlZlN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9DTEFTUzogewotCQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKYXZhQ2xhc3MoamF2YUNsYXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFQ2xhc3MoamF2YUNsYXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFQ2xhc3NpZmllcihqYXZhQ2xhc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoamF2YUNsYXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGphdmFDbGFzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5JTklUSUFMSVpFUjogewotCQkJCUluaXRpYWxpemVyIGluaXRpYWxpemVyID0gKEluaXRpYWxpemVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbml0aWFsaXplcihpbml0aWFsaXplcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBUkFNRVRFUjogewotCQkJCUphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlciA9IChKYXZhUGFyYW1ldGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKYXZhUGFyYW1ldGVyKGphdmFQYXJhbWV0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVQYXJhbWV0ZXIoamF2YVBhcmFtZXRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRVR5cGVkRWxlbWVudChqYXZhUGFyYW1ldGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGphdmFQYXJhbWV0ZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoamF2YVBhcmFtZXRlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5NRVRIT0Q6IHsKLQkJCQlNZXRob2QgbWV0aG9kID0gKE1ldGhvZCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kKG1ldGhvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU9wZXJhdGlvbihtZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVUeXBlZEVsZW1lbnQobWV0aG9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KG1ldGhvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChtZXRob2QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuRklFTEQ6IHsKLQkJCQlGaWVsZCBmaWVsZCA9IChGaWVsZCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRmllbGQoZmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVUeXBlZEVsZW1lbnQoZmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoZmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoZmllbGQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQkxPQ0s6IHsKLQkJCQlCbG9jayBibG9jayA9IChCbG9jayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQmxvY2soYmxvY2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuQ09NTUVOVDogewotCQkJCUNvbW1lbnQgY29tbWVudCA9IChDb21tZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDb21tZW50KGNvbW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJsb2NrKGNvbW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuU1RBVEVNRU5UOiB7Ci0JCQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IChTdGF0ZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVN0YXRlbWVudChzdGF0ZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJsb2NrKHN0YXRlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBKYXZhUmVmUGFja2FnZS5KQVZBX1BBQ0tBR0U6IHsKLQkJCQlKYXZhUGFja2FnZSBqYXZhUGFja2FnZSA9IChKYXZhUGFja2FnZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSmF2YVBhY2thZ2UoamF2YVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVQYWNrYWdlKGphdmFQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGphdmFQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGphdmFQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkpBVkFfREFUQV9UWVBFOiB7Ci0JCQkJSmF2YURhdGFUeXBlIGphdmFEYXRhVHlwZSA9IChKYXZhRGF0YVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUphdmFEYXRhVHlwZShqYXZhRGF0YVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVDbGFzcyhqYXZhRGF0YVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVDbGFzc2lmaWVyKGphdmFEYXRhVHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChqYXZhRGF0YVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoamF2YURhdGFUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIEphdmFSZWZQYWNrYWdlLkFSUkFZX1RZUEU6IHsKLQkJCQlBcnJheVR5cGUgYXJyYXlUeXBlID0gKEFycmF5VHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXJyYXlUeXBlKGFycmF5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlSmF2YUNsYXNzKGFycmF5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUNsYXNzKGFycmF5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRUNsYXNzaWZpZXIoYXJyYXlUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGFycmF5VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChhcnJheVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgSmF2YVJlZlBhY2thZ2UuSkFWQV9FVkVOVDogewotCQkJCUphdmFFdmVudCBqYXZhRXZlbnQgPSAoSmF2YUV2ZW50KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VKYXZhRXZlbnQoamF2YUV2ZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoamF2YUV2ZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KGphdmFFdmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChqYXZhRXZlbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoamF2YUV2ZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBDbGFzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhQ2xhc3MoSmF2YUNsYXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5pdGlhbGl6ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5pdGlhbGl6ZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUluaXRpYWxpemVyKEluaXRpYWxpemVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBQYXJhbWV0ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBQYXJhbWV0ZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUphdmFQYXJhbWV0ZXIoSmF2YVBhcmFtZXRlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZChNZXRob2Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GaWVsZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GaWVsZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRmllbGQoRmllbGQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CbG9jazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CbG9jazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQmxvY2soQmxvY2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNvbW1lbnQoQ29tbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN0YXRlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0ZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVN0YXRlbWVudChTdGF0ZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhUGFja2FnZShKYXZhUGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgRGF0YSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkphdmEgRGF0YSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhRGF0YVR5cGUoSmF2YURhdGFUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJyYXkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnJheSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcnJheVR5cGUoQXJyYXlUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SmF2YSBFdmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5KYXZhIEV2ZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKYXZhRXZlbnQoSmF2YUV2ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVNb2RlbEVsZW1lbnQoRU1vZGVsRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVOYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVOYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZWRFbGVtZW50KEVOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FQ2xhc3NpZmllcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FQ2xhc3NpZmllcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUNsYXNzaWZpZXIoRUNsYXNzaWZpZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FQ2xhc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUNsYXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3MoRUNsYXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVR5cGVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVR5cGVkIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVUeXBlZEVsZW1lbnQoRVR5cGVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVQYXJhbWV0ZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RVBhcmFtZXRlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVBhcmFtZXRlcihFUGFyYW1ldGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9wZXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT3BlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFT3BlcmF0aW9uKEVPcGVyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FU3RydWN0dXJhbCBGZWF0dXJlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVTdHJ1Y3R1cmFsIEZlYXR1cmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVBhY2thZ2UoRVBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL0phdmFSZWZTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9Ob3RpZmljYXRpb25VdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9tb2ZqYXZhL29yZy9lY2xpcHNlL2plbS9qYXZhL3V0aWwvTm90aWZpY2F0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDkyNjExLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL21vZmphdmEvb3JnL2VjbGlwc2UvamVtL2phdmEvdXRpbC9Ob3RpZmljYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLQotCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLmphdmEudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5SZWZsZWN0aW9uQWRhcHRvcjsKLSAKLQotLyoqCi0gKiBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyBvZiBzdGF0aWMgbWV0aG9kcyBmb3IgaGFuZGxpbmcgc3BlY2lhbCBKRU0gbm90aWZpY2F0aW9ucy4KLSAqIAotICogQHNpbmNlIDEuMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25VdGlsIHsKLQkvKgotCSAqIE5vdCBtZWFudCB0byBiZSBjb25zdHJ1Y3RlZC4KLQkgKi8KLQlwcml2YXRlIE5vdGlmaWNhdGlvblV0aWwoKSB7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGlzIG5vdGlmaWNhdGlvbiBpcyBhIHJlZmxlY3Rpb24gbm90aWZpY2F0aW9uLiBJZiBpdCBpcywgdGhlbiBpdCBtZWFucyB0aGF0IHRoZSBKYXZhQ2xhc3MgaGFzCi0JICoganVzdCBoYWQgcmVmbGVjdGlvbiBwZXJmb3JtZWQgb24gaXQuCi0JICogQHBhcmFtIG1zZwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHJlZmxlY3Rpb24gZXZlbnQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVmbGVjdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmV0dXJuIG1zZy5nZXRFdmVudFR5cGUoKSA9PSBSZWZsZWN0aW9uQWRhcHRvci5FVkVOVCAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IFJlZmxlY3Rpb25BZGFwdG9yLlJFRkxFQ1RJT05fRVZFTlQ7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciB3aGV0aGVyIHRoaXMgbm90aWZpY2F0aW9uIGlzIGEgcmVmbGVjdGlvbiBmbHVzaCBldmVudCBvZiBhIEphdmFDbGFzcyB3aXRoIGV4aXN0aW5nIGNvZGUuIElmIGl0IGlzLCB0aGVuIGl0IG1lYW5zIHRoYXQgdGhlIAotCSAqIEphdmFDbGFzcyBoYXMganVzdCBoYWQgdGhlIHJlZmxlY3Rpb24gcmVzdWx0cyBmbHVzaGVkLCBBTkQgdGhpcyB3YXMgYSBjbGFzcyB0aGF0IGhhZCBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBjb2RlIG9uIGl0Li4KLQkgKiBAcGFyYW0gbXNnCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGEgZmx1c2ggZXZlbnQuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmx1c2hFdmVudChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJldHVybiBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gUmVmbGVjdGlvbkFkYXB0b3IuRVZFTlQgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBKYXZhUmVmbGVjdGlvbkFkYXB0b3IuRkxVU0hfUkVGTEVDVElPTl9FVkVOVDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgd2hldGhlciB0aGlzIG5vdGlmaWNhdGlvbiBpcyBhIHJlZmxlY3Rpb24gZmx1c2ggZXZlbnQgb2YgYSBKYXZhQ2xhc3MgdGhhdCBpcyBuZXcgYW5kIGRvZXNuJ3QgaGF2ZSBleGlzdGluZyBjb2RlLgotCSAqIElmIGl0IGlzLCB0aGVuIGl0IG1lYW5zIHRoYXQgdGhlIEphdmFDbGFzcyBoYXMganVzdCBoYWQgdGhlIHJlZmxlY3Rpb24gcmVzdWx0cyBmbHVzaGVkLCBBTkQgdGhpcyB3YXMgYSBjbGFzcyB0aGF0IHdhcyBuZXcgYW5kCi0JICogaGFkIG5vIGNvZGUgYmVoaW5kIGl0LgotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBmbHVzaCBldmVudCBvZiBuZXcgY2xhc3MuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmx1c2hOZXdFdmVudChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJldHVybiBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gUmVmbGVjdGlvbkFkYXB0b3IuRVZFTlQgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBKYXZhUmVmbGVjdGlvbkFkYXB0b3IuRkxVU0hfTkVXX1JFRkxFQ1RJT05fRVZFTlQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9vdmVycmlkZXMvLi5ST09ULi4ub3ZlcnJpZGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9vdmVycmlkZXMvLi5ST09ULi4ub3ZlcnJpZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTRhZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vb3ZlcnJpZGVzLy4uUk9PVC4uLm92ZXJyaWRlCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGFuZ2U6Q2hhbmdlRGVzY3JpcHRpb24geG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6Y2hhbmdlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL0NoYW5nZSIgeG1pOnZlcnNpb249IjIuMCI+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9Ilg6Uk9PVCMvL0Byb290Ij4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgICAgPCEtLSB0b28gcmVtaW5kIHVzIHRoYXQgdGhlc2UgYXJlIG5lZWQgdG8gYmUgZG9uZSB5ZXQgaW4gdGhlIG5ldyBhbGxvY2F0aW9uIHNjaGVtZS4gCi0gIDxhZGRlZEVPYmplY3RzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnN0YW50aWF0ZVVzaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDxhZGRlZEVPYmplY3RzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXJpYWxpemVEYXRhIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0tLT4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSMvL0phdmFBbGxvY2F0aW9uIiBuYW1lPSJhbGxvY2F0aW9uIiB4bWk6aWQ9Il9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotPC9jaGFuZ2U6Q2hhbmdlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9vdmVycmlkZXMvamF2YS9sYW5nL09iamVjdC5vdmVycmlkZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL292ZXJyaWRlcy9qYXZhL2xhbmcvT2JqZWN0Lm92ZXJyaWRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTg5MmZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL292ZXJyaWRlcy9qYXZhL2xhbmcvT2JqZWN0Lm92ZXJyaWRlCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGFuZ2U6Q2hhbmdlRGVzY3JpcHRpb24geG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5iZWFuaW5mbz0iaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvYmVhbmluZm8vYmVhbmluZm8uZWNvcmUiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6Y2hhbmdlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL0NoYW5nZSIgeG1pOnZlcnNpb249IjIuMCI+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9Ilg6Uk9PVCMvL0Byb290Ij4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJfZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDwhLS0gVHVybiBjbGFzcyBwcm9wZXJ0eSB0byBhIGhpZGRlbiBhbmQgbm90IGludHJvc3BlY3RlZCBwcm9wZXJ0eS4gVGhpcyBpcyBiZWNhdXNlIHdlIGRvbid0IGhhbmRsZSBKYXZhIDEuNSB0ZW1wbGF0ZXMKLSAgICAgICAgeWV0IGFzIHZhbGlkIEphdmFDbGFzc2VzIGFuZCBpdCBjYXVzZXMgWE1JIHNlcmlhbGl6YXRpb24gZXJyb3JzIGJlY2F1c2UgaXQgaW5jbHVkZXMgdGhlICI8IiBpbiB0aGUgc2VyaWFsaXphdGlvbiBvZiB0aGUgY2xhc3MgbmFtZQotICAgICAgICBmb3IgdGhlIHN0YW5kYXJkIGphdmEgY2xhc3Mgd2hpY2ggaXM6ICJqYXZhOi9qYXZhLmxhbmcjQ2xhc3M8PyBleHRlbmRzIENsYXNzPiIuIHRoaXMgaXMgaW52YWxpZCBpbiB0aGUgc2VyaWFsaXphdGlvbi4gLS0+Ci0gICAgICAgIAotICAgPG9iamVjdHNUb0F0dGFjaCBuYW1lPSJjbGFzcyIgeG1pOmlkPSJfZVN0cnVjdHVyYWxGZWF0dXJlcyIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VPYmplY3QiPgotICAgICA8ZUFubm90YXRpb25zIGhpZGRlbj0idHJ1ZSIgbWVyZ2VJbnRyb3NwZWN0aW9uPSJmYWxzZSIgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5iZWFuaW5mbzpQcm9wZXJ0eURlY29yYXRvciIvPgotICAgPC9vYmplY3RzVG9BdHRhY2g+Ci0gICAKLSAgIDwhLS0gCi0gICAgICBUaGlzIGlzIGtpbmQgb2YgY2hlYXQsIGJ1dCBkYXRhdHlwZXMgYXJlIG5ldmVyIGludHJvc3BlY3RlZCwgc28gd2UgY2FuJ3QgZ2V0IHRoZXNlIGF0dHJpYnV0ZXMKLSAgICAgIGFkZGVkIHRvIHRoZW0gaW4gYSBub3JtYWwgd2F5LiBCeSBkb2luZyBpdCBoZXJlLCB3aGVuIGphdmEubGFuZy5PYmplY3QgaXMgaW50cm9zcGVjdGVkLCB0aGVzZQotICAgICAgd2lsbCBiZSBkb25lIGF0IHRoZSBzYW1lIHRpbWUuIEFuZCBzaW5jZSBPYmplY3QgbmVlZHMgdG8gYmUgaW50cm9zcGVjdGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlCi0gICAgICBjYW4gYmUgZG9uZSwgdGhlc2Ugd2lsbCBiZSBkb25lIGJlZm9yZSBhbnl0aGluZyBuZWVkcyB0aGVtLiAtLT4KLSAgIDxvYmplY3RDaGFuZ2VzIGtleT0iamF2YTovI2Jvb2xlYW4iPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9ImJvb2xlYW5fZVN0cnVjdHVyYWxGZWF0dXJlcyIvPgotICAgICAgPC92YWx1ZT4KLSAgIDwvb2JqZWN0Q2hhbmdlcz4KLSAgIDxvYmplY3RzVG9BdHRhY2ggY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIy8vSmF2YUFsbG9jYXRpb24iIG5hbWU9ImFsbG9jYXRpb24iIHhtaTppZD0iYm9vbGVhbl9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jY2hhciI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0iY2hhcl9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJjaGFyX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNpbnQiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9ImludF9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJpbnRfZVN0cnVjdHVyYWxGZWF0dXJlcyIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiLz4KLSAgIDxvYmplY3RDaGFuZ2VzIGtleT0iamF2YTovI2Zsb2F0Ij4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJmbG9hdF9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJmbG9hdF9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jc2hvcnQiPgotICAgICAgPHZhbHVlIGZlYXR1cmVOYW1lPSJlU3RydWN0dXJhbEZlYXR1cmVzIj4KLSAgICAgICAgIDxsaXN0Q2hhbmdlcyByZWZlcmVuY2VWYWx1ZXM9InNob3J0X2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSMvL0phdmFBbGxvY2F0aW9uIiBuYW1lPSJhbGxvY2F0aW9uIiB4bWk6aWQ9InNob3J0X2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9ImphdmE6LyNsb25nIj4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJsb25nX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSMvL0phdmFBbGxvY2F0aW9uIiBuYW1lPSJhbGxvY2F0aW9uIiB4bWk6aWQ9ImxvbmdfZVN0cnVjdHVyYWxGZWF0dXJlcyIgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiLz4KLSAgIDxvYmplY3RDaGFuZ2VzIGtleT0iamF2YTovI2RvdWJsZSI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0iZG91YmxlX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovLy9vcmcvZWNsaXBzZS9qZW0vaW50ZXJuYWwvaW5zdGFudGlhdGlvbi5lY29yZSMvL0phdmFBbGxvY2F0aW9uIiBuYW1lPSJhbGxvY2F0aW9uIiB4bWk6aWQ9ImRvdWJsZV9lU3RydWN0dXJhbEZlYXR1cmVzIiB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIvPgotICAgPG9iamVjdENoYW5nZXMga2V5PSJqYXZhOi8jYnl0ZSI+Ci0gICAgICA8dmFsdWUgZmVhdHVyZU5hbWU9ImVTdHJ1Y3R1cmFsRmVhdHVyZXMiPgotICAgICAgICAgPGxpc3RDaGFuZ2VzIHJlZmVyZW5jZVZhbHVlcz0iYnl0ZV9lU3RydWN0dXJhbEZlYXR1cmVzIi8+Ci0gICAgICA8L3ZhbHVlPgotICAgPC9vYmplY3RDaGFuZ2VzPgotICAgPG9iamVjdHNUb0F0dGFjaCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly8vb3JnL2VjbGlwc2UvamVtL2ludGVybmFsL2luc3RhbnRpYXRpb24uZWNvcmUjLy9KYXZhQWxsb2NhdGlvbiIgbmFtZT0iYWxsb2NhdGlvbiIgeG1pOmlkPSJieXRlX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIi8+Ci08L2NoYW5nZTpDaGFuZ2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYmVhODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyAkU291cmNlOiAvY3Zzcm9vdC93ZWJ0b29scy9qZWV0b29scy5tb3ZlL3dlYnRvb2xzLmphdmFlZS5naXQvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjIwOjI1ICQKLSMKLQotCi1wbHVnaW5OYW1lID0gSmF2YSBFTUYgTW9kZWwKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3MzQ1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25QYWNrYWdlIgotICAgICAgICAgICAgZ2VuTW9kZWw9Im1vZGVsL2luc3RhbmNlLmdlbm1vZGVsIgotICAgICAgICAgICAgdXJpPSJodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2UiCi0gICAgICAgICAgICBnZW5Nb2RlbD0ibW9kZWwvamF2YU1vZGVsLmdlbm1vZGVsIgotICAgICAgICAgICAgdXJpPSJqYXZhLnhtaSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8ucmVnaXN0cmF0aW9ucyI+Ci0gICAgICA8cmVnaXN0cmF0aW9uIGNvbnRhaW5lcj0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIj4KLSAgICAgICAgPG92ZXJyaWRlCi0gICAgICAgICAgICBwYWNrYWdlPSJqYXZhLmxhbmciCi0gICAgICAgICAgICBwYXRoPSJvdmVycmlkZXMvamF2YS9sYW5nIj4KLSAgICAgICAgPC9vdmVycmlkZT4KLSAgICAgICAgPG92ZXJyaWRlCi0gICAgICAgICAgICBwYWNrYWdlPSIuLlJPT1QuLiIKLSAgICAgICAgICAgIHBhdGg9Im92ZXJyaWRlcyI+Ci0gICAgICAgIDwvb3ZlcnJpZGU+Ci0gICAgICA8L3JlZ2lzdHJhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlM2EzNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSoubWR+Ci0qLmNhfgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvZWRvY2phdmEyLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvZWRvY2phdmEyLmNhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViMWVlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2Vkb2NqYXZhMi5jYXQKKysrIC9kZXYvbnVsbApAQCAtMSw1NjEzICswLDAgQEAKLQotKG9iamVjdCBQZXRhbAotICAgIHZlcnNpb24gICAgCTQ3Ci0gICAgX3dyaXR0ZW4gICAJIlJvc2UgOC4wLjAzMDMuMTQwMCIKLSAgICBjaGFyU2V0ICAgIAkwKQotCi0ob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJqYXZhIgotICAgIGlzX3VuaXQgICAgCVRSVUUKLSAgICBpc19sb2FkZWQgIAlUUlVFCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJJREwiCi0JICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDAwLTAwNWQ5ZTZhZGVjNDoxIikpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qZW0iKSkKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JICAgIG5hbWUgICAgICAgCSJwcmVmaXgiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJKYXZhUmVmIikpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkibnNVUkkiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJqYXZhLnhtaSIpKSkKLSAgICBxdWlkICAgICAgIAkiMzY1NDlGMkMwMDRFIgotICAgIGRvY3VtZW50YXRpb24gCQotfENoYW5nZXMgdG8gc3luY2ggdXAgd2l0aCBKYXZhM2U6Ci18LSBkZWxldGVkIEphdmFFbGVtZW50LCBCb2R5RWxlbWVudCB3aGljaCBkaWRuJ3QgYWRkIGFueXRoaW5nIHVzZWZ1bAotfC0gZGVsZXRlZCBOZXN0ZWRDbGFzcyBhbmQgdGhlIGFzc29jaWF0aW9uIHdoaWNoIGRlc2NyaWJlZCBuZXN0aW5nLCBjb250ZW50cyBjYW4gYmUgdXNlZCBpbnN0ZWFkCi18LSBkZWxldGVkIGV4dGVuZHMvZXh0ZW5kZWRCeSB3aGljaCBpcyByZXBsYWNlZCB3aXRoIE1PRiBzdWJ0eXBlL3N1cGVydHlwZQotfC0gZGVsZXRlZCB0aGUgY2x1bXN5IG1haW4gZGlhZ3JhbQotfC0gbW92ZWQgdGhlIE1PRiBpbmhlcml0YW5jZSBkZXRhaWxzIHRvIHRoZSBNT0YgYmluZGluZyBkaWFncmFtCi18LSBkZWxldGVkICJmaW5hbCIgb24gSmF2YVBhcmFtZXRlciwgZG9uJ3Qga25vdyB3aGF0IHRoYXQgd2FzIHN1cHBvc2VkIHRvIGJlCi18LSBkZWxldGVkIHRoZSBDYXRlZ29yeSBqdW5rCi18LSBjaGFuZ2VkIHRoZSBCbG9jay10eXBlZCBhdHRyaWJ1dGVzIG9uIEZpZWxkLCBNZXRob2QsIEluaXRpYWxpemVyIHRvIGJlIGFzc29jaWF0aW9ucyB0byBCbG9jawotfAotfE91dHN0YW5kaW5nIHF1ZXN0aW9ucy9pc3N1ZXM6Ci18LSBKYXZhUGFyYW1ldGVyS2luZCBzaG91bGQgZ28gYXdheSBpZiB3ZSBnZXQgdGhlIGJhc2UgUGFyYW1ldGVyIGtpbmQgZml4ZWQgdXAKLXwKLSAgICAKLSAgICBzdGVyZW90eXBlIAkibWV0YW1vZGVsIgotICAgIHZpc2libGVfY2F0ZWdvcmllcyAJKGxpc3QgdmlzaWJpbGl0eV9yZWxhdGlvbnNoaXBfbGlzdAotCShvYmplY3QgVmlzaWJpbGl0eV9SZWxhdGlvbnNoaXAKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwMS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MURERjQ3MDI3MSIKLQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6bW9mIgotCSAgICBxdWlkdSAgICAgIAkiMzc0QUE4RjkwMjhFIikKLQkob2JqZWN0IFZpc2liaWxpdHlfUmVsYXRpb25zaGlwCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDItMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOUJEMzY2MDAwRkUiCi0JICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlIgotCSAgICBxdWlkdSAgICAgIAkiMzlBNUVEMDQwMDRFIikpCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3MgIkphdmFDbGFzcyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwMy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzk5MDk1MDAwMEIzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNOZXN0ZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0E5RDdDMjEwMUQ2IgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RmllbGQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI1QjMwMDQ0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZmllbGROYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQUEiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIkZpZWxkIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRGaWVsZEV4dGVuZGVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNjI1MDExQSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfCBSZXR1cm4gYW4gRmllbGQgd2l0aCB0aGUgcGFzc2VkIG5hbWUgZnJvbSB0aGlzIEphdmFDbGFzcyBvciBhbnkgc3VwZXJ0eXBlcy4KLXwKLXxSZXR1cm4gbnVsbCBpZiBhIEZpZWxkIG5hbWVkIGZpZWxkTmFtZSBpcyBub3QgZm91bmQuCi0JCSAgICAKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJmaWVsZE5hbWUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFBQyIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikpCi0JCSAgICByZXN1bHQgICAgIAkiRmllbGQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGOEYwMjgwIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldEZpZWxkTmFtZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI2NjcwMjU1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhbiBGaWVsZCB3aXRoIHRoZSBwYXNzZWQgbmFtZSwgb3IgbnVsbC4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiZmllbGROYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQUUiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIkZpZWxkIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRGaWVsZHNFeHRlbmRlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjY4QTAzMjgiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGFsbCBmaWVsZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuIgotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0TWV0aG9kIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCOTExMDIxQSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbm90IGxvb2sgdXAgdGhlIHN1cGVydHlwZSBoaWVyYXJjaHkuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgIm1ldGhvZE5hbWUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFCMSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCShvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJUeXBlcyIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUIyIgotCQkJICAgIGRvY3VtZW50YXRpb24gCSJMaXN0IG9mIHBhcmFtZXRlciB0eXBlcy4iCi0JCQkgICAgdHlwZSAgICAgICAJIkpUeXBlTGlzdCIKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikpCi0JCSAgICByZXN1bHQgICAgIAkiTWV0aG9kIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QjlFQTAzQ0EiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGEgTGlzdCBvZiBTdHJpbmdzIHRoYXQgcmVwcmVzZW50IE1ldGhvZEVsZW1lbnQgc2lnbmF0dXJlcyBmcm9tIG1vc3QgZ2VuZXJhbCB0byBtb3N0IHNwZWNpZmljLiIKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE1ldGhvZEV4dGVuZGVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCQTUxMDExNSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJHZXQgdGhlIG1ldGhvZCBvZiB0aGlzIG5hbWUgYW5kIHRoZXNlIHBhcmFtZXRlcnMuIEl0IHdpbGwgbG9vayB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibWV0aG9kTmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUI1IgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKQotCQkJKG9iamVjdCBQYXJhbWV0ZXIgInBhcmFtZXRlclR5cGVzIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQjYiCi0JCQkgICAgZG9jdW1lbnRhdGlvbiAJIkxpc3Qgb2YgcGFyYW1ldGVyIHR5cGVzLiIKLQkJCSAgICB0eXBlICAgICAgIAkiSlR5cGVMaXN0IgotCQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJNZXRob2QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE1ldGhvZHNFeHRlbmRlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkE3RDAzNTQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGFsbCBtZXRob2RzLCBpbmNsdWRpbmcgdGhvc2UgZnJvbSBzdXBlcnR5cGVzLiIKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldE9ubHlTcGVjaWZpY01ldGhvZHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJBQzMwMjFFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18UmV0dXJuIGEgTGlzdCBvZiBNZXRob2RzIHRoYXQgYmVnaW5zIHdpdGggQGFNZXRob2ROYW1lUHJlZml4IGFuZCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIEBleGNsdWRlZE5hbWVzIGxpc3QuIElmIEBhTWV0aG9kTmFtZVByZWZpeCBpcyBudWxsLCBhbGwgbWV0aG9kcyB3aWxsIGJlIHJldHVybmVkLgotfAotCQkgICAgCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiYU1ldGhvZE5hbWVQcmVmaXgiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFCOSIKLQkJCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIikKLQkJCShvYmplY3QgUGFyYW1ldGVyICJleGNsdWRlZE5hbWVzIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQkEiCi0JCQkgICAgdHlwZSAgICAgICAJIkpUeXBlTGlzdCIKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikpCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQdWJsaWNNZXRob2QiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJCQzkwMzgzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhIG1ldGhvZCBtYXRjaGluZyB0aGUgbmFtZSwgYW5kIG5vbi1yZXR1cm4gcGFyYW1ldGVycyB3aXRoIGZ1bGx5IHF1YWxpZmllZCB0eXBlcyBtYXRjaGluZyBhbGwgdGhlIHR5cGVzIGluIHRoZSBsaXN0LCBpZiBpdCBleGlzdHMuICBJdCB3aWxsIG5vdCBsb29rIHVwIHRoZSBzdXBlcnR5cGUgaGllcmFyY2h5LiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJtZXRob2ROYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQkMiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpCi0JCQkob2JqZWN0IFBhcmFtZXRlciAicGFyYW1ldGVyVHlwZXMiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFCRCIKLQkJCSAgICBkb2N1bWVudGF0aW9uIAkiTGlzdCBvZiBwYXJhbWV0ZXIgdHlwZXMuIgotCQkJICAgIHR5cGUgICAgICAgCSJKVHlwZUxpc3QiCi0JCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpKQotCQkgICAgcmVzdWx0ICAgICAJIk1ldGhvZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUU5MTAyNzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHVibGljTWV0aG9kcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkMzRDAzNEUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGFsbCBtZXRob2RzLCBpdCB3aWxsIG5vdCBnbyB1cCB0aGUgc3VwZXJ0eXBlIGhpZXJhcmNoeS4iCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVMaXN0IgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVCODc2MDJDMSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRQdWJsaWNNZXRob2RzRXh0ZW5kZWQiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJDNjMwMzIwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhbGwgcHVibGljIG1ldGhvZHMsIGluY2x1ZGluZyB0aG9zZSBmcm9tIHN1cGVydHlwZXMuIgotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlTGlzdCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0UHVibGljTWV0aG9kc05hbWVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCQ0FBMDA1QiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvbiB0aGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLCBoYXZpbmcgYSBuYW1lIGVxdWFsIHRvIHRoYXQgb2YgdGhlIHBhcmFtZXRlci4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAibmFtZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUMxIgotCQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciKSkKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUxpc3QiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUI4NzYwMkMxIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFN1cGVydHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkNGOTAwQ0QiCi0JCSAgICByZXN1bHQgICAgIAkiSmF2YUNsYXNzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJpbXBsZW1lbnRzSW50ZXJmYWNlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRDM5MDA5RCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUZXN0IHdoZXRoZXIgdGhlIHJlY2VpdmVyIGltcGxlbWVudHMgdGhlIHBhc3NlZCBpbnRlcmZhY2UgKG9yIG9uZSBvZiBpdHMgc3VwZXJ0eXBlcykuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImludGVyZmFjZVR5cGUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFDNCIKLQkJCSAgICB0eXBlICAgICAgIAkiSmF2YUNsYXNzIgotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImluZm9TdHJpbmciCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJEODIwMkQzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlJldHVybiBhIHN0cmluZyBzaG93aW5nIG91ciBkZXRhaWxzLiIKLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaW5oZXJpdHNGcm9tIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRDlFMDJFNyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUZXN0cyB3aGV0aGVyIHRoaXMgY2xhc3MgaW5oZXJpdHMgZnJvbSB0aGUgcGFzc2VkIGluIGNsYXNzLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJqYXZhQ2xhc3MiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFDNyIKLQkJCSAgICB0eXBlICAgICAgIAkiSmF2YUNsYXNzIgotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzRXhpc3RpbmdUeXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRTExMDEyMCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJEb2VzIHRoaXMgdHlwZSBleGlzdC4iCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc0ludGVyZmFjZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkUyRjAxMzciCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSXMgdGhpcyBhbiBpbnRlcmZhY2UuIgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAic2V0U3VwZXJ0eXBlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRTdCMDBBMCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJTZXQgdGhlIHN1cGVydHlwZS4iCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAiamF2YWNsYXNzIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxQ0IiCi0JCQkgICAgdHlwZSAgICAgICAJIkphdmFDbGFzcyIKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIikpCi0JCSAgICByZXN1bHQgICAgIAkidm9pZCIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJraW5kIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEE0NUUwMjMyIgotCQkgICAgdHlwZSAgICAgICAJIlR5cGVLaW5kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRCNDYwMDJCRiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwdWJsaWMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwNi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBGOENFODAyMEMiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDA4LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEY4RjlDMDJENyIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkibm9uZSIpCi0JKG9iamVjdCBDbGFzcyAiSW5pdGlhbGl6ZXIiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMDktMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0QTVEQzAwQkIiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImlzU3RhdGljIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMGEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEE4NjUwMDBGIgotCQkgICAgdHlwZSAgICAgICAJIkJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpCi0JICAgIGxhbmd1YWdlICAgCSJub25lIikKLQkob2JqZWN0IENsYXNzICJKYXZhUGFyYW1ldGVyIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDBiLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEFENzgwMjgwIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0I3ODE4QjAwMTg2IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVQYXJhbWV0ZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0U2MTUwMTA0IikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzQXJyYXkiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUJGRDQwMzRGIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIklzIHRoaXMgcGFyYW1ldGVyIHR5cGUgYW4gYXJyYXkgdHlwZS4iCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc1JldHVybiIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QkZFRjAwMDUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiSXMgdGhpcyBhIHJldHVybiBwYXJhbWV0ZXIuIgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0SmF2YVR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUM4RTcwMDFBIgotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlSmF2YUhlbHBlcnMiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUFERTQwM0E2IikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFF1YWxpZmllZE5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUM5MjYwMDJGIgotCQkgICAgcmVzdWx0ICAgICAJIlN0cmluZyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDBjLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRCNjQ3MDJBRiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcmFtZXRlcktpbmQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAwZS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTFDMUVCNDAwQzIiCi0JCSAgICB0eXBlICAgICAgIAkiSmF2YVBhcmFtZXRlcktpbmQiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkxQzFFOEYwMTIzIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKQotCSAgICBsYW5ndWFnZSAgIAkibm9uZSIpCi0JKG9iamVjdCBDbGFzcyAiTWV0aG9kIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDBmLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEFFOTEwMjcxIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxMC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTkwOTUzODAzQUQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RU9wZXJhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzOTA0REFBMjAwQTAiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0Q29udGFpbmluZ0phdmFDbGFzcyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzA0MjAyQTMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIHRoZSBqYXZhIGNsYXNzIHRoYXQgdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBpbi4iCi0JCSAgICByZXN1bHQgICAgIAkiSmF2YUNsYXNzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRNZXRob2RFbGVtZW50U2lnbmF0dXJlIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMDc2MDEzRiIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFJldHVybiBhIFN0cmluZyB3aXRoIHRoZSB0aGUgbWV0aG9kIG5hbWUgYW5kIGl0cyBwYXJhbWV0ZXJzLiBlLmcuIDxjb2RlPiBzZXRGaXJzdE5hbWUoamF2YS5sYW5nLlN0cmluZykgPC9jb2RlPiAuCi18IAotCQkgICAgCi0JCSAgICByZXN1bHQgICAgIAkiU3RyaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFBhcmFtZXRlciIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzBCODAxMUMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiUmV0dXJuIGEgUGFyYW1ldGVyIHdpdGggdGhlIHBhc3NlZCBuYW1lLCBvciBudWxsLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJwYXJhbWV0ZXJOYW1lIgotCQkJICAgIHF1aWQgICAgICAgCSIzQzYyRkFCOTAxRTMiCi0JCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIpKQotCQkgICAgcmVzdWx0ICAgICAJIkphdmFQYXJhbWV0ZXIiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFENzgwMjgwIikKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFJldHVyblR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMxNDcwMDEzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkdldCB0aGUgcmV0dXJuIHR5cGUuIgotCQkgICAgcmVzdWx0ICAgICAJIkpUeXBlSmF2YUhlbHBlcnMiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwCi0JCSAgICBxdWlkdSAgICAgIAkiM0I2NUFERTQwM0E2IikKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldFJldHVyblR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUMyNzQwM0NFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNldCB0aGUgcmV0dXJuIHR5cGUiCi0JCSAgICBwYXJhbWV0ZXJzIAkobGlzdCBQYXJhbWV0ZXJzCi0JCQkob2JqZWN0IFBhcmFtZXRlciAidHlwZSIKLQkJCSAgICBxdWlkICAgICAgIAkiM0M2MkZBQjkwMUU4IgotCQkJICAgIHR5cGUgICAgICAgCSJKVHlwZUphdmFIZWxwZXJzIgotCQkJICAgIHF1aWR1ICAgICAgCSIzQjY1QURFNDAzQTYiKSkKLQkJICAgIHJlc3VsdCAgICAgCSJ2b2lkIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldFNpZ25hdHVyZSIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzE3RDAwNDMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxSZXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kLnRvU3RyaW5nKCkuCi18Ci18UmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgTWV0aG9kLiAgVGhlIHN0cmluZyBpcyBmb3JtYXR0ZWQgYXMgdGhlIG1ldGhvZCBhY2Nlc3MgbW9kaWZpZXJzLCBpZiBhbnksIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgcmV0dXJuIHR5cGUsIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIGZvbGxvd2VkIGJ5IHRoZSBjbGFzcyBkZWNsYXJpbmcgdGhlIG1ldGhvZCwgZm9sbG93ZWQgYnkgYSBwZXJpb2QsIGZvbGxvd2VkIGJ5IHRoZSBtZXRob2QgbmFtZSwgZm9sbG93ZWQgYnkgYSBwYXJlbnRoZXNpemVkLCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgbWV0aG9kJ3MgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG1ldGhvZCB0aHJvd3MgY2hlY2tlZCBleGNlcHRpb25zLCB0aGUgcGFyYW1ldGVyIGxpc3QgaXMgZm9sbG93ZWQgYnkgYSBzcGFjZSwgZm9sbG93ZWQgYnkgdGhlIHdvcmQgdGhyb3dzIGZvbGxvd2VkIGJ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHRocm93biBleGNlcHRpb24gdHlwZXMuCi18Ci18Rm9yIGV4YW1wbGU6Ci18Ci18ICAgIHB1YmxpYyBib29sZWFuIGphdmEubGFuZy5PYmplY3QuZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi18Ci18VGhlIGFjY2VzcyBtb2RpZmllcnMgYXJlIHBsYWNlZCBpbiBjYW5vbmljYWwgb3JkZXIgYXMgc3BlY2lmaWVkIGJ5ICJUaGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIi4gIFRoaXMgaXMgcHVibGljLCA8dHQ+cHJvdGVjdGVkPC90dD4gb3IgPHR0PnByaXZhdGU8L3R0PiBmaXJzdCwgYW5kIHRoZW4gb3RoZXIgbW9kaWZpZXJzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6IDx0dD5hYnN0cmFjdDwvdHQ+LCA8dHQ+c3RhdGljPC90dD4sIDx0dD5maW5hbDwvdHQ+LCA8dHQ+c3luY2hyb25pemVkPC90dD4gPHR0Pm5hdGl2ZTwvdHQ+LgotfAotCQkgICAgCi0JCSAgICByZXN1bHQgICAgIAkiU3RyaW5nIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gImlzR2VuZXJhdGVkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMUZDMDA2RSIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfFJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIGlzIHN5c3RlbSBnZW5lcmF0ZWQuCi18VGhpcyBpcyB1c3VhbGx5IGRldGVybWluZWQgYnkgdGhlIEBnZW5lcmF0ZWQgdGFnIGluIHRoZSBjb21tZW50LgotCQkgICAgCi0JCSAgICByZXN1bHQgICAgIAkiYm9vbGVhbiIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTApCi0JCShvYmplY3QgT3BlcmF0aW9uICJzZXRJc0dlbmVyYXRlZCIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QzI0NDAzN0YiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiU2V0IHRoZSBpc0dlbmVyYXRlZCBmbGFnLiIKLQkJICAgIHBhcmFtZXRlcnMgCShsaXN0IFBhcmFtZXRlcnMKLQkJCShvYmplY3QgUGFyYW1ldGVyICJnZW5lcmF0ZWQiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDFFQyIKLQkJCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIpKQotCQkgICAgcmVzdWx0ICAgICAJInZvaWQiCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiaXNWb2lkIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVDMjE4MDM4RiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJJcyB0aGlzIGEgdm9pZCByZXR1cm4gdHlwZSBtZXRob2QuIgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYWJzdHJhY3QiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxMS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBGOTBCQzAyMkIiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJuYXRpdmUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxMi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBGOTBEMTAzNjQiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzeW5jaHJvbml6ZWQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxMy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBGOTBEQjAzQzEiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmaW5hbCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDE0LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNkUwMDAzMyIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbnN0cnVjdG9yIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkxQUREMjgwMjQ1IgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3RhdGljIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMTYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyOUM2RTQwMzUwIgotCQkgICAgdHlwZSAgICAgICAJImJvb2xlYW4iCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiamF2YVZpc2liaWxpdHkiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxNy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzZFQjAzOTciCi0JCSAgICB0eXBlICAgICAgIAkiSmF2YVZpc2liaWxpdHlLaW5kIgotCQkgICAgcXVpZHUgICAgICAJIjM4MjMzM0JFMDMyRSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIm5vbmUiKQotCShvYmplY3QgQ2xhc3MgIkZpZWxkIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDE4LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEFGOEYwMjgwIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwNDg3RjkwMzM0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVUeXBlZEVsZW1lbnQiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RjYwMzk4IikpCi0JICAgIG9wZXJhdGlvbnMgCShsaXN0IE9wZXJhdGlvbnMKLQkJKG9iamVjdCBPcGVyYXRpb24gImdldENvbnRhaW5pbmdKYXZhQ2xhc3MiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI1MTIwMDI0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkdldCB0aGUgY2xhc3MgdGhhdCB0aGlzIGZpZWxkIGlzIHdpdGhpbi4iCi0JCSAgICByZXN1bHQgICAgIAkiSmF2YUNsYXNzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc0FycmF5IgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNTVGMDFFNyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJJcyB0aGlzIGZpZWxkIGFuIGFycmF5IHR5cGUuIgotCQkgICAgcmVzdWx0ICAgICAJImJvb2xlYW4iCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZmluYWwiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxZC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzZCRTAyNkYiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzdGF0aWMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAxZS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzZDMjAyRUQiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJqYXZhVmlzaWJpbGl0eSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDFmLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNkM3MDM0RiIKLQkJICAgIHR5cGUgICAgICAgCSJKYXZhVmlzaWJpbGl0eUtpbmQiCi0JCSAgICBxdWlkdSAgICAgIAkiMzgyMzMzQkUwMzJFIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRyYW5zaWVudCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA0ODgwMTAzQjgiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ2b2xhdGlsZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA0ODgwODAxMkQiCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIm5vbmUiKQotCShvYmplY3QgQ2xhc3MgIlR5cGVLaW5kIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDIwLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzY1NEI0NjAwMkJGIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVU5ERUZJTkVEPTEgQ0xBU1M9MiBJTlRFUkZBQ0U9MyBFWENFUFRJT049NCIKLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJVTkRFRklORUQiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyMS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBCOUUzNjAxQTEiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQ0xBU1MiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyMi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODBCOUU0NDAyNUQiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiSU5URVJGQUNFIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwQjlFNTYwMTI0IgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkVYQ0VQVElPTiIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDI0LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MEI5RTY1MDFBMSIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIm5vbmUiKQotCShvYmplY3QgQ2xhc3MgIkJsb2NrIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDI1LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgwRjg4MzcwMTUwIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJzb3VyY2UiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyNi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODEwRTdGQzAyMzkiCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiM0E2QzUzRTEwMDI5IgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiQ29tbWVudCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyNy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MEY4ODlCMDJCOCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMjgtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRjg4RDYwMEE1IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIikpKQotCShvYmplY3QgQ2xhc3MgIlN0YXRlbWVudCIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyOS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MEY4OEI5MDI1QSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMmEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgwRjg4REEwMDU2IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIikpKQotCShvYmplY3QgQ2xhc3MgIkphdmFQYWNrYWdlIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDJiLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgxMDhFMDMwMUQyIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAyYy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTkwOTRENzAwNDYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RVBhY2thZ2UiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwNUMzRjcwMDBBIikpCi0JICAgIGxhbmd1YWdlICAgCSJKYXZhIikKLQkob2JqZWN0IENsYXNzICJKYXZhVmlzaWJpbGl0eUtpbmQiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzAtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODIzMzNCRTAzMkUiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfFBBQ0tBR0U9MQotfFBVQkxJQz0yCi18UFJJVkFURT0zCi18UFJPVEVDVEVEPTQKLQkgICAgCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUFVCTElDIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyMzMzRTIwMjJDIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlBSSVZBVEUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzMi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODIzMzNFNzAwM0UiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUFJPVEVDVEVEIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyMzMzRTgwMzg5IgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlBBQ0tBR0UiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzNC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODIzMzNFQTAzOEMiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkphdmFQYXJhbWV0ZXJLaW5kIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDM1LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkxQzFFOEYwMTIzIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxJTj0wCi18T1VUPTEKLXxJTk9VVD0yCi18UkVUVVJOPTMKLQkgICAgCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiSU4iCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzNi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTFDMUVGQzAyRUMiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiT1VUIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzctMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkxQzFFRkYwMTZBIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIklOT1VUIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwMzgtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkxQzFGMDEwMDQwIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlJFVFVSTiIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDM5LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MUMyMTk0MDM4NyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiSmF2YURhdGFUeXBlIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDNhLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzk1OTEzMzQwMzE2IgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0U1MjY4RTIwMUIxIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiKSkKLQkgICAgb3BlcmF0aW9ucyAJKGxpc3QgT3BlcmF0aW9ucwotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCRjkxMDMwMyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJSZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJpbWl0aXZlLiIKLQkJICAgIHJlc3VsdCAgICAgCSJTdHJpbmciCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkpCi0JKG9iamVjdCBDbGFzcyAiQXJyYXlUeXBlIgotCSAgICBxdWlkICAgICAgIAkiM0E5RDc5RUQwMURGIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxEZXNjcmliZXMgYSBKYXZhIEFycmF5IHR5cGUKLXwgICBGb3IgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLCBpdCBpcyB1bmxpa2VseSB0aGF0IHRoZSBjb21wb25lbnQgdHlwZSB3aWxsIGJlCi18ICAgc3BlY2lmaWVkIGRpcmVjdGx5LiAgVGhpcyB3b3VsZCByZXF1aXJlIGluc3RhbnRpYXRpbmcgYSBjaGFpbiBvZiBjb21wb25lbnQgdHlwZXMKLXwgICBzdWNoIGFzIFN0cmluZ1tdW11bXVtdLT5TdHJpbmdbXVtdW10tPlN0cmluZ1tdW10tPlN0cmluZ1tdLT5TdHJpbmcuCi18Ci18ICBUaGUgY29tcG9uZW50IHR5cGUgcmVsYXRpb25zaGlwIHdpbGwgYmUgY29tcHV0ZWQgaWYgdGhlIGZpbmFsQ29tcG9uZW50VHlwZQotfCAgYW5kIGFycmF5IGRpbWVuc2lvbnMgaXMgc3BlY2lmaWVkLgotfCAKLXwgIEZvciB0aGlzIHJlYXNvbiwgdGhlIHByZWZlcnJlZCB3YXkgdG8gY3JlYXRlIGlzIHRocm91Z2ggdGhlIEphdmFSZWZGYWN0b3J5IGZhY3RvcnkgbWV0aG9kOgotfCAgICAgICBjcmVhdGVBcnJheVR5cGUoSmF2YUNsYXNzIGZpbmFsQ29tcG9uZW50VHlwZSwgaW50IGRpbWVuc2lvbnMpCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiM0E5RDc5RkQwMTBGIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIpKQotCSAgICBvcGVyYXRpb25zIAkobGlzdCBPcGVyYXRpb25zCi0JCShvYmplY3QgT3BlcmF0aW9uICJnZXRGaW5hbENvbXBvbmVudFR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0E5RDdBODIwMTkzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18R2V0IHRoZSBmaW5hbCBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBBcnJheSBUeXBlLgotfAotfEluIG9yZGVyIHRvIGVuc3VyZSBhIHVuaXF1ZSBpbnN0YW5jZSwgd2Ugd2lsbCByZXNvbHZlIHRoaXMgdHlwZSB1c2luZyByZWZsZWN0aW9uLiBJdCB0dXJucyBvdXQgdG8gYmUgbW9zdCBlZmZpY2llbnQgdG8ganVzdCBkbyB0aGlzIGJ5IHRyaW1taW5nIHRoZSBuYW1lLgotCQkgICAgCi0JCSAgICByZXN1bHQgICAgIAkiSlR5cGVKYXZhSGVscGVycyIKLQkJICAgIGNvbmN1cnJlbmN5IAkiU2VxdWVudGlhbCIKLQkJICAgIG9wRXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQkJICAgIHVpZCAgICAgICAgCTAKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1QURFNDAzQTYiKQotCQkob2JqZWN0IE9wZXJhdGlvbiAiZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyIgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVBRjk4MDEzNiIKLQkJICAgIGRvY3VtZW50YXRpb24gCQotfEdldCB0aGUgY29tcG9uZW50IHR5cGUgb2YgdGhpcyBhcnJheS4gCi18Ci18SWYgdGhpcyBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5LCB0aGUgY29tcG9uZW50IHR5cGUgd2lsbCBiZSB0aGUgbmVzdGVkIGFycmF5IHR5cGUuCi0JCSAgICAKLQkJICAgIHJlc3VsdCAgICAgCSJKVHlwZUphdmFIZWxwZXJzIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMAotCQkgICAgcXVpZHUgICAgICAJIjNCNjVBREU0MDNBNiIpCi0JCShvYmplY3QgT3BlcmF0aW9uICJpc1ByaW1pdGl2ZUFycmF5IgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCNDE3MDJCOCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJJcyB0aGlzIGFuIGFycmF5IG9mIGphdmEgcHJpbWl0aXZlcyIKLQkJICAgIHJlc3VsdCAgICAgCSJib29sZWFuIgotCQkgICAgY29uY3VycmVuY3kgCSJTZXF1ZW50aWFsIgotCQkgICAgb3BFeHBvcnRDb250cm9sIAkiUHVibGljIgotCQkgICAgdWlkICAgICAgICAJMCkKLQkJKG9iamVjdCBPcGVyYXRpb24gInNldENvbXBvbmVudFR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiM0I2NUI0NTUwM0JDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlNldCB0aGUgY29tcG9uZW50IHR5cGUuIgotCQkgICAgcGFyYW1ldGVycyAJKGxpc3QgUGFyYW1ldGVycwotCQkJKG9iamVjdCBQYXJhbWV0ZXIgImhlbHBlckNvbXBvbmVudFR5cGUiCi0JCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUI5MDIyNiIKLQkJCSAgICB0eXBlICAgICAgIAkiSlR5cGVKYXZhSGVscGVycyIKLQkJCSAgICBxdWlkdSAgICAgIAkiM0I2NUFERTQwM0E2IikpCi0JCSAgICBjb25jdXJyZW5jeSAJIlNlcXVlbnRpYWwiCi0JCSAgICBvcEV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JCSAgICB1aWQgICAgICAgIAkwKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiYXJyYXlEaW1lbnNpb25zIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkJCSAgICBuYW1lICAgICAgIAkiRmluYWwiCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkJICAgIG5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCQkgICAgbmFtZSAgICAgICAJIlRyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JCQkgICAgbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkJICAgIG5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQkgICAgdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJKYXZhIgotCQkJICAgIG5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJICAgIHZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkpCi0JCSAgICBxdWlkICAgICAgIAkiM0E5RDdBQzgwMjg0IgotCQkgICAgdHlwZSAgICAgICAJImludCIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkKLQkgICAgbGFuZ3VhZ2UgICAJIkphdmEiKQotCShvYmplY3QgQ2xhc3MgIkpUeXBlSmF2YUhlbHBlcnMiCi0JICAgIHF1aWQgICAgICAgCSIzQjY1QURFNDAzQTYiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGludGVyZmFjZSBpcyBhIGNvbW1vbiBpbnRlcmZhY2UgYmV0d2VlbiBKYXZhQ2xhc3MgYW5kIEphdmFEYXRhVHlwZSBwbHVzIHNvbWUgY29tbW9uIGhlbHBlciBtZXRob2RzLiIKLQkgICAgc3RlcmVvdHlwZSAJImRhdGF0eXBlIgotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVycyIKLQkJICAgIHF1aWQgICAgICAgCSIzQjY1QUUxNzAyNjkiCi0JCSAgICBzdGVyZW90eXBlIAkiamF2YWNsYXNzIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJKVHlwZUxpc3QiCi0JICAgIHF1aWQgICAgICAgCSIzQjY1Qjg3NjAyQzEiCi0JICAgIGRvY3VtZW50YXRpb24gCSJqYXZhLnV0aWwuTGlzdCB0eXBlIgotCSAgICBzdGVyZW90eXBlIAkiZGF0YXR5cGUiCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImphdmEudXRpbC5MaXN0IgotCQkgICAgcXVpZCAgICAgICAJIjNCNjVCODhGMDM5OSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkphdmFFdmVudCIKLQkgICAgcXVpZCAgICAgICAJIjNDNjJGQUYxMDNDOCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNERjRDRTgzMDM5MCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1OUQwMjMwIikpCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiSW1wbGVtZW50cyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDAzYy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM2NTRBMEQ3MDI0MiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkNvbnN0cmFpbnQgLSBTb3VyY2Ugb2YgaW1wbGVtZW50cyBpcyBvZiBUeXBlS2luZCBDTEFTU1RZUEUgYW5kIHRhcmdldCBpcyBJTlRFUkZBQ0VUWVBFIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJpbXBsZW1lbnRzSW50ZXJmYWNlcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDNkLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRBMERBMDEwOSIKLQkJICAgIGxhYmVsICAgICAgCSJpbXBsZW1lbnRzSW50ZXJmYWNlcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiaW1wbGVtZW50ZWRCeSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDNlLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM2NTRBMERBMDEzOCIKLQkJICAgIGxhYmVsICAgICAgCSJpbXBsZW1lbnRlZEJ5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICJNZXRob2RIYXMiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwM2YtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0QUYwMzAyQ0UiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgInBhcmFtZXRlcnMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0MC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QUYwODAxOTYiCi0JCSAgICBsYWJlbCAgICAgIAkicGFyYW1ldGVycyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYXJhbWV0ZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFENzgwMjgwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29uc3RyYWludHMgCSJvcmRlcmVkIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJtZXRob2QiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0MS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzNjU0QUYwODAxOTciCi0JCSAgICBsYWJlbCAgICAgIAkibWV0aG9kIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDItMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzNjU0QjA4ODAxQTUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIi90eXBlIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDMtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEIwOTEwMDdEIgotCQkgICAgbGFiZWwgICAgICAJIi90eXBlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIvdHlwZWRFbGVtZW50IgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDQtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzY1NEIwOTEwMDhDIgotCQkgICAgbGFiZWwgICAgICAJIi90eXBlZEVsZW1lbnQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFyYW1ldGVyIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRDc4MDI4MCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICJNZXRob2RUaHJvd3MiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzODEwQjYxQjAxNzgiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUYXJnZXQgbXVzdCBiZSBvZiBraW5kIEVYQ0VQVElPTlRZUEUiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImphdmFFeGNlcHRpb25zIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNDYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgxMEI2MUUwMUMzIgotCQkgICAgbGFiZWwgICAgICAJImphdmFFeGNlcHRpb25zIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJtZXRob2QiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0Ny0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODEwQjYxRTAyMjciCi0JCSAgICBsYWJlbCAgICAgIAkibWV0aG9kIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICJDb250ZW50cyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0OC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MTBFNjA4MDI2OCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiY29udGFpbmVkQnkiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0OS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODEwRTYwRTAxNDQiCi0JCSAgICBsYWJlbCAgICAgIAkiY29udGFpbmVkQnkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpCbG9jayIKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODgzNzAxNTAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiY29udGVudHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0YS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODEwRTYwRTAxNjIiCi0JCSAgICBsYWJlbCAgICAgIAkiY29udGVudHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpCbG9jayIKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODgzNzAxNTAiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiQ2xhc3NJbXBvcnRzIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDRiLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgyOUM0QkYwMDBEIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJjbGFzc0ltcG9ydCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDRjLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNEJGMDAwRSIKLQkJICAgIGxhYmVsICAgICAgCSJjbGFzc0ltcG9ydCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiaW1wb3J0ZWRCeSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDRkLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNEJGMDAwRiIKLQkJICAgIGxhYmVsICAgICAgCSJpbXBvcnRlZEJ5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICJQYWNrYWdlSW1wb3J0cyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0ZS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MjlDNEVDMDIwNyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicGFja2FnZUltcG9ydHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA0Zi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODI5QzRFRTAwRkIiCi0JCSAgICBsYWJlbCAgICAgIAkicGFja2FnZUltcG9ydHMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFja2FnZSIKLQkJICAgIHF1aWR1ICAgICAgCSIzODEwOEUwMzAxRDIiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb25zdHJhaW50cyAJIm9yZGVyZWQiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiaW1wb3J0ZWRCeSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDUwLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MjlDNEVFMDEwNSIKLQkJICAgIGxhYmVsICAgICAgCSJpbXBvcnRlZEJ5IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDUxLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzgyQTI5QkQwMjE5IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJmaWVsZHMiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1Mi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODJBMjlCRTAzNTAiCi0JCSAgICBsYWJlbCAgICAgIAkiZmllbGRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6RmllbGQiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGOEYwMjgwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJqYXZhQ2xhc3MiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1My0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzODJBMjlCRTAzQkYiCi0JCSAgICBsYWJlbCAgICAgIAkiamF2YUNsYXNzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1NC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM4MkEyOUMwMDE3RCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAibWV0aG9kcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDU1LTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM4MkEyOUMxMDE3NCIKLQkJICAgIGxhYmVsICAgICAgCSJtZXRob2RzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6TWV0aG9kIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiamF2YUNsYXNzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzgyQTI5QzEwMjBBIgotCQkgICAgbGFiZWwgICAgICAJImphdmFDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDMiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNTctMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBOUVCNDAzQzYiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIi9zdXBlcnR5cGUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1OC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBOUVCODAzQjciCi0JCSAgICBsYWJlbCAgICAgIAkiL3N1cGVydHlwZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiL3N1YnR5cGUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1OS0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBOUVCOTAwOTgiCi0JCSAgICBsYWJlbCAgICAgIAkiL3N1YnR5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNWEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBOUYwMzAxQUMiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgIi9zdXBlcnR5cGUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1Yi0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBOUYwOTAzMjgiCi0JCSAgICBsYWJlbCAgICAgIAkiL3N1cGVydHlwZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiL3N1YnR5cGUiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1Yy0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBOUYwQTAwMUMiCi0JCSAgICBsYWJlbCAgICAgIAkiL3N1YnR5cGUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNSIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA1ZC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MkFBMDk1MDNFNSIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiaW5pdGlhbGl6ZXJzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNWUtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUEwOTcwMTUzIgotCQkgICAgbGFiZWwgICAgICAJImluaXRpYWxpemVycyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkluaXRpYWxpemVyIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBNURDMDBCQiIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiamF2YUNsYXNzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNWYtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUEwOTcwMTVEIgotCQkgICAgbGFiZWwgICAgICAJImphdmFDbGFzcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDYiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjAtMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBQTIxMjAwQzIiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImRlY2xhcmVkQ2xhc3NlcyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDYxLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBMjE3MDFEOCIKLQkJICAgIGxhYmVsICAgICAgCSJkZWNsYXJlZENsYXNzZXMiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImRlY2xhcmluZ0NsYXNzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjItMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUEyMTcwMkRDIgotCQkgICAgbGFiZWwgICAgICAJImRlY2xhcmluZ0NsYXNzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi4xIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNyIKLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2My0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkgICAgcXVpZCAgICAgICAJIjM5MkFBMkE3MDFDMSIKLQkgICAgc3RlcmVvdHlwZSAJImRlcml2ZWQiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImphdmFDbGFzc2VzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjQtMDA1ZDllNmFkZWM0OjEiKSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVm9sYXRpbGUiCi0JCQkgICAgdmFsdWUgICAgICAJVFJVRSkKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQkgICAgdmFsdWUgICAgICAJRkFMU0UpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBMkE4MDM2NyIKLQkJICAgIGxhYmVsICAgICAgCSJqYXZhQ2xhc3NlcyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiamF2YVBhY2thZ2UiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2NS0wMDVkOWU2YWRlYzQ6MSIpKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlGQUxTRSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUEyQTkwMDgzIgotCQkgICAgbGFiZWwgICAgICAJImphdmFQYWNrYWdlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhY2thZ2UiCi0JCSAgICBxdWlkdSAgICAgIAkiMzgxMDhFMDMwMUQyIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4IgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDY2LTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQUFDMzMwMzZBIgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJzb3VyY2UiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ1MjVhMC04ODI2LTExZTEtMDA2Ny0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQUMzODAxNDAiCi0JCSAgICBsYWJlbCAgICAgIAkic291cmNlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgImluaXRpYWxpemVyIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjgtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUFDMzgwMTY4IgotCQkgICAgbGFiZWwgICAgICAJImluaXRpYWxpemVyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SW5pdGlhbGl6ZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEE1REMwMEJCIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkiCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNjktMDA1ZDllNmFkZWM0OjEiKSkpCi0JICAgIHF1aWQgICAgICAgCSIzOTJBQUM1NjAyQTIiCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdAotCQkob2JqZWN0IFJvbGUgImluaXRpYWxpemVyIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiSURMIgotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIgotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6Yzc0NTI1YTAtODgyNi0xMWUxLTAwNmEtMDA1ZDllNmFkZWM0OjEiKSkpCi0JCSAgICBxdWlkICAgICAgIAkiMzkyQUFDNTcwMkRGIgotCQkgICAgbGFiZWwgICAgICAJImluaXRpYWxpemVyIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBWYWx1ZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICJmaWVsZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDZiLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBQzU3MDMwNyIKLQkJICAgIGxhYmVsICAgICAgCSJmaWVsZCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkZpZWxkIgotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEwIgotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCShvYmplY3QgQXR0cmlidXRlCi0JCSAgICB0b29sICAgICAgIAkiSURMIgotCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDUyNWEwLTg4MjYtMTFlMS0wMDZjLTAwNWQ5ZTZhZGVjNDoxIikpKQotCSAgICBxdWlkICAgICAgIAkiMzkyQUFDQTUwMUU3IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJzb3VyY2UiCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTpjNzQ2YWM0MC04ODI2LTExZTEtMDAwMC0wMDVkOWU2YWRlYzQ6MSIpKSkKLQkJICAgIHF1aWQgICAgICAgCSIzOTJBQUNBNzAxN0MiCi0JCSAgICBsYWJlbCAgICAgIAkic291cmNlIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QmxvY2siCi0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIm1ldGhvZCIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIklETCIKLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCIKLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOmM3NDZhYzQwLTg4MjYtMTFlMS0wMDAxLTAwNWQ5ZTZhZGVjNDoxIikpKQotCQkgICAgcXVpZCAgICAgICAJIjM5MkFBQ0E3MDFCOCIKLQkJICAgIGxhYmVsICAgICAgCSJtZXRob2QiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiCi0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExIgotCSAgICBxdWlkICAgICAgIAkiM0M2MkZCRTAwMTY4IgotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QKLQkJKG9iamVjdCBSb2xlICJldmVudHMiCi0JCSAgICBxdWlkICAgICAgIAkiM0M2MkZCRTIwMDhGIgotCQkgICAgbGFiZWwgICAgICAJImV2ZW50cyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFFdmVudCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQzYyRkFGMTAzQzgiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDEyIgotCQkgICAgcXVpZCAgICAgICAJIjNDNjJGQkUyMDA5MSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxMyIKLQkgICAgcXVpZCAgICAgICAJIjNDODkzODc3MDI1MyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiYWxsRXZlbnRzIgotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJKG9iamVjdCBBdHRyaWJ1dGUKLQkJCSAgICB0b29sICAgICAgIAkiRWNvcmUiCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50IgotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSIKLQkJCSAgICBuYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSIzQzg5Mzg3ODAyQ0MiCi0JCSAgICBsYWJlbCAgICAgIAkiYWxsRXZlbnRzIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUV2ZW50IgotCQkgICAgcXVpZHUgICAgICAJIjNDNjJGQUYxMDNDOCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikKLQkJICAgIENvbnRhaW5tZW50IAkiQnkgUmVmZXJlbmNlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE0IgotCQkgICAgcXVpZCAgICAgICAJIjNDODkzODc4MDJDRSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFDbGFzcyIKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpKSkKLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSIKLQkgICAgcXVpZCAgICAgICAJIjNERjRDQUFEMDFBMyIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiY29tcG9uZW50VHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSIzREY0Q0FBRTAxRUIiCi0JCSAgICBsYWJlbCAgICAgIAkiY29tcG9uZW50VHlwZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFQ2xhc3NpZmllciIKLQkJICAgIHF1aWR1ICAgICAgCSIzQUNFNEZFRTAzNzEiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYiCi0JCSAgICBxdWlkICAgICAgIAkiM0RGNENBQUUwMUY1IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6amF2YTo6QXJyYXlUeXBlIgotCQkgICAgcXVpZHUgICAgICAJIjNBOUQ3OUVEMDFERiIpKSkpCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkVjb3JlIGJpbmRpbmciCi0JICAgIHF1aWQgICAgICAgCSIzODEwOUMwRjAwOUIiCi0JICAgIHRpdGxlICAgICAgCSJFY29yZSBiaW5kaW5nIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJMAotCSAgICBvcmlnaW5feSAgIAk0MDk0Ci0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6RmllbGQiIEAxCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgU2hvd09wZXJhdGlvblNpZ25hdHVyZSAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDExMDQsIDU3NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMQotCQkJbG9jYXRpb24gICAJKDY4OSwgMzY4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTgzMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkZpZWxkIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUY4RjAyODAiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxCi0JCQlsb2NhdGlvbiAgIAkoNjg5LCA0MjQpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJOAotCQkJbWF4X3dpZHRoICAJNzA5KQotCQkgICAgd2lkdGggICAgICAJODQ4Ci0JCSAgICBoZWlnaHQgICAgIAk0MzgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YVBhY2thZ2UiIEAyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE5MiwgNDgwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyCi0JCQlsb2NhdGlvbiAgIAkoMzEsIDQzNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhUGFja2FnZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM4MTA4RTAzMDFEMiIKLQkJICAgIHdpZHRoICAgICAgCTM0MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFUGFja2FnZSIgQDMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkyLCAxNDQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDMKLQkJCWxvY2F0aW9uICAgCSgxMDMsIDQ1KQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTc4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRVBhY2thZ2UiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJICAgIHF1aWR1ICAgICAgCSIzOTA1QzNGNzAwMEEiCi0JCSAgICB3aWR0aCAgICAgIAkxOTYKLQkJICAgIGhlaWdodCAgICAgCTIyMgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5OTA5NEQ3MDA0NiIKLQkJICAgIGNsaWVudCAgICAgCUAyCi0JCSAgICBzdXBwbGllciAgIAlAMwotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIiBANQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzI4LCAxODI0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1Ci0JCQlsb2NhdGlvbiAgIAkoMTQ2NSwgMTYxNSkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTUyNgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVDbGFzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDUKLQkJCWxvY2F0aW9uICAgCSgxNDY1LCAxNzE1KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNgotCQkJbWF4X3dpZHRoICAJNDUyKQotCQkgICAgd2lkdGggICAgICAJNTQ0Ci0JCSAgICBoZWlnaHQgICAgIAk0NDAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVPcGVyYXRpb24iIEA2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIzMjAsIDE0NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANgotCQkJbG9jYXRpb24gICAJKDIyMzEsIDQ1KQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTc4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRU9wZXJhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDREQUEyMDBBMCIKLQkJICAgIHdpZHRoICAgICAgCTE5NgotCQkgICAgaGVpZ2h0ICAgICAJMjIyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFEYXRhVHlwZSIgQDcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzUyLCAxMjE2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3Ci0JCQlsb2NhdGlvbiAgIAkoMTEsIDExNDMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjgyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YURhdGFUeXBlIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzk1OTEzMzQwMzE2IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANwotCQkJbG9jYXRpb24gICAJKDExLCAxMTk5KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTU4NSkKLQkJICAgIHdpZHRoICAgICAgCTcwMAotCQkgICAgaGVpZ2h0ICAgICAJMTY4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIgQDgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjMzNiwgNzY4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4Ci0JCQlsb2NhdGlvbiAgIAkoMTczNiwgMzU3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTEyMDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJNZXRob2QiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRTkxMDI3MSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDgKLQkJCWxvY2F0aW9uICAgCSgxNzM2LCA0MTMpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMTcKLQkJCW1heF93aWR0aCAgCTEwMjcpCi0JCSAgICB3aWR0aCAgICAgIAkxMjE4Ci0JCSAgICBoZWlnaHQgICAgIAk4NDQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTkwOTUzODAzQUQiCi0JCSAgICBjbGllbnQgICAgIAlAOAotCQkgICAgc3VwcGxpZXIgICAJQDYKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjM3NiwgMzQ2KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIzNzYsIDI1NSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMTAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTMxMiwgMjg2NCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTAKLQkJCWxvY2F0aW9uICAgCSgzMzAsIDIyNzMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTk2NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDEwCi0JCQlsb2NhdGlvbiAgIAkoMzMwLCAyMzI5KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTI1Ci0JCQltYXhfd2lkdGggIAkxNjgwKQotCQkgICAgd2lkdGggICAgICAJMTk4MgotCQkgICAgaGVpZ2h0ICAgICAJMTIwNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTEKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5OTA5NTAwMDBCMyIKLQkJICAgIGNsaWVudCAgICAgCUAxMAotCQkgICAgc3VwcGxpZXIgICAJQDUKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU5NCwgMjI2MikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNTk0LCAyMDQ0KSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFyYW1ldGVyIiBAMTIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAwOCwgMTQ3MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTIKLQkJCWxvY2F0aW9uICAgCSg2MDgsIDEyODYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJODAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVBhcmFtZXRlciIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRDc4MDI4MCIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDEyCi0JCQlsb2NhdGlvbiAgIAkoNjA4LCAxMzQyKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTcKLQkJCW1heF93aWR0aCAgCTY4NSkKLQkJICAgIHdpZHRoICAgICAgCTgxOAotCQkgICAgaGVpZ2h0ICAgICAJMzk0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFUGFyYW1ldGVyIiBAMTMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAwOCwgOTYwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMwotCQkJbG9jYXRpb24gICAJKDkxOSwgODYxKQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTc4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRVBhcmFtZXRlciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0U2MTUwMTA0IgotCQkgICAgd2lkdGggICAgICAJMTk2Ci0JCSAgICBoZWlnaHQgICAgIAkyMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I3ODE4QjAwMTg2IgotCQkgICAgY2xpZW50ICAgICAJQDEyCi0JCSAgICBzdXBwbGllciAgIAlAMTMKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIgQDE1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDMyMCwgODE2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNQotCQkJbG9jYXRpb24gICAJKDU2LCA2MzApCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1MjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENUJGMDAwQSIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE1Ci0JCQlsb2NhdGlvbiAgIAkoNTYsIDczMCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTYKLQkJCW1heF93aWR0aCAgCTQ1MikKLQkJICAgIHdpZHRoICAgICAgCTU0NgotCQkgICAgaGVpZ2h0ICAgICAJMzk0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNFNTI2OEUyMDFCMSIKLQkJICAgIGNsaWVudCAgICAgCUA3Ci0JCSAgICBzdXBwbGllciAgIAlAMTUKLQkJICAgIGxpbmVfc3R5bGUgCTApCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVUeXBlZEVsZW1lbnQiIEAxNwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTA0LCAxMTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTcKLQkJCWxvY2F0aW9uICAgCSg5MTYsIDQxKQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzc2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRVR5cGVkRWxlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RjYwMzk4IgotCQkgICAgd2lkdGggICAgICAJMzk0Ci0JCSAgICBoZWlnaHQgICAgIAkxNjQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDE4Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwNDg3RjkwMzM0IgotCQkgICAgY2xpZW50ICAgICAJQDEKLQkJICAgIHN1cHBsaWVyICAgCUAxNwotCQkgICAgbGluZV9zdHlsZSAJMCkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJQb2x5bW9ycGhpc20iCi0JICAgIHF1aWQgICAgICAgCSIzODEwOUQwMDAzNzMiCi0JICAgIHRpdGxlICAgICAgCSJQb2x5bW9ycGhpc20iCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEAxOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0OTYsIDU3NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTkKLQkJCWxvY2F0aW9uICAgCSgzNjUsIDUzMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTQ5RkNDMDBGQSIKLQkJICAgIHdpZHRoICAgICAgCTI4MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMyIgQDIwCi0JCSAgICBsb2NhdGlvbiAgIAkoMTY2LCA1MzcpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkyQTlFQjQwM0M2IgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIvc3VwZXJ0eXBlIiBAMjEKLQkJCSAgICBQYXJlbnRfVmlldyAJQDIwCi0JCQkgICAgbG9jYXRpb24gICAJKC0zMzAsIDIxNykKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyCi0JCQkJUGFyZW50X1ZpZXcgCUAyMQotCQkJCWxvY2F0aW9uICAgCSgyMzQsIDQ4MCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjI2Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrL3N1cGVydHlwZSIKLQkJCQlwY3REaXN0ICAgIAkwLjQxOTE5MgotCQkJCWhlaWdodCAgICAgCTM4Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQTlFQjgwM0I3IgotCQkJICAgIGNsaWVudCAgICAgCUAyMAotCQkJICAgIHN1cHBsaWVyICAgCUAxOQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxNjYsIDUzNykKLQkJCQkoMTY2LCA1MTcpCi0JCQkJKDM1NiwgNTE3KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjYsIDUzNykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU2LCA1MTcpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjMKLQkJCQlQYXJlbnRfVmlldyAJQDIxCi0JCQkJbG9jYXRpb24gICAJKDMzNCwgNDY0KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiL3N1YnR5cGUiIEAyNAotCQkJICAgIFBhcmVudF9WaWV3IAlAMjAKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTMzMCwgMjE3KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjUKLQkJCQlQYXJlbnRfVmlldyAJQDI0Ci0JCQkJbG9jYXRpb24gICAJKDI1NywgNTgyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxODgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIisvc3VidHlwZSIKLQkJCQlwY3REaXN0ICAgIAkwLjUzMjQ2OAotCQkJCWhlaWdodCAgICAgCTI0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQTlFQjkwMDk4IgotCQkJICAgIGNsaWVudCAgICAgCUAyMAotCQkJICAgIHN1cHBsaWVyICAgCUAxOQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxNjYsIDUzNykKLQkJCQkoMTY2LCA1NTgpCi0JCQkJKDM1NiwgNTU4KSkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNjYsIDUzNykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzU2LCA1NTgpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjYKLQkJCQlQYXJlbnRfVmlldyAJQDI0Ci0JCQkJbG9jYXRpb24gICAJKDMzNCwgNjEyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBAMjcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM5MiwgNTc2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyNwotCQkJbG9jYXRpb24gICAJKDEyNjEsIDUzMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyNjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQ2xhc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICB3aWR0aCAgICAgIAkyODAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIkltcGxlbWVudHMiIEAyOAotCQkgICAgbG9jYXRpb24gICAJKDk0NCwgNTIxKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBMEQ3MDI0MiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiaW1wbGVtZW50c0ludGVyZmFjZXMiIEAyOQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDMwLCAtNTQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMAotCQkJCVBhcmVudF9WaWV3IAlAMjkKLQkJCQlsb2NhdGlvbiAgIAkoODM5LCA0ODgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTQwNwotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2ltcGxlbWVudHNJbnRlcmZhY2VzIgotCQkJCXBjdERpc3QgICAgCS0wLjM0MzU1OAotCQkJCWhlaWdodCAgICAgCTM0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NEEwREEwMTA5IgotCQkJICAgIGNsaWVudCAgICAgCUAyOAotCQkJICAgIHN1cHBsaWVyICAgCUAyNwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk0NCwgNTIxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjUyLCA1MjEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzEKLQkJCQlQYXJlbnRfVmlldyAJQDI5Ci0JCQkJbG9jYXRpb24gICAJKDExODEsIDQ4NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC43NzMwMDYKLQkJCQloZWlnaHQgICAgIAkzNwotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImltcGxlbWVudGVkQnkiIEAzMgotCQkJICAgIFBhcmVudF9WaWV3IAlAMjgKLQkJCSAgICBsb2NhdGlvbiAgIAkoNDMwLCAtNTQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzMwotCQkJCVBhcmVudF9WaWV3IAlAMzIKLQkJCQlsb2NhdGlvbiAgIAkoMTA4NywgNTc1KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkzMTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbXBsZW1lbnRlZEJ5IgotCQkJCXBjdERpc3QgICAgCS0wLjQ3MDc2OQotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NEEwREEwMTM4IgotCQkJICAgIGNsaWVudCAgICAgCUAyOAotCQkJICAgIHN1cHBsaWVyICAgCUAxOQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk0NCwgNTIxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MzYsIDUyMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNAotCQkJCVBhcmVudF9WaWV3IAlAMzIKLQkJCQlsb2NhdGlvbiAgIAkoNjg0LCA1NjQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuODQzMjMwCi0JCQkJaGVpZ2h0ICAgICAJNDMKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDQiIEAzNQotCQkgICAgbG9jYXRpb24gICAJKDE3NTAsIDYwMSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTJBOUYwMzAxQUMiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIi9zdXBlcnR5cGUiIEAzNgotCQkJICAgIFBhcmVudF9WaWV3IAlAMzUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzU4LCAyNjUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNwotCQkJCVBhcmVudF9WaWV3IAlAMzYKLQkJCQlsb2NhdGlvbiAgIAkoMTcyMSwgNjQwKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMjYKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIisvc3VwZXJ0eXBlIgotCQkJCXBjdERpc3QgICAgCTAuMjI3MjczCi0JCQkJaGVpZ2h0ICAgICAJMTMKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBOUYwOTAzMjgiCi0JCQkgICAgY2xpZW50ICAgICAJQDM1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE3NTAsIDYwMSkKLQkJCQkoMTc1MCwgNjI3KQotCQkJCSgxNTMyLCA2MjcpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDYwMSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUzMiwgNjI3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM4Ci0JCQkJUGFyZW50X1ZpZXcgCUAzNgotCQkJCWxvY2F0aW9uICAgCSgxNTU3LCA1NzQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIvc3VidHlwZSIgQDM5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzNQotCQkJICAgIGxvY2F0aW9uICAgCSgzNTgsIDI2NSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQwCi0JCQkJUGFyZW50X1ZpZXcgCUAzOQotCQkJCWxvY2F0aW9uICAgCSgxNjI2LCA1NTMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE4OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiKy9zdWJ0eXBlIgotCQkJCXBjdERpc3QgICAgCTAuNjE1OTcwCi0JCQkJaGVpZ2h0ICAgICAJMjQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBOUYwQTAwMUMiCi0JCQkgICAgY2xpZW50ICAgICAJQDM1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDI3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDE3NTAsIDYwMSkKLQkJCQkoMTc1MCwgNTc2KQotCQkJCSgxNTMyLCA1NzYpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3NTAsIDYwMSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTUzMiwgNTc2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDQxCi0JCQkJUGFyZW50X1ZpZXcgCUAzOQotCQkJCWxvY2F0aW9uICAgCSgxNTU3LCA2MzApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkpKQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgotCSAgICBxdWlkICAgICAgIAkiMzgxMDlGOTIwMDBCIgotCSAgICB0aXRsZSAgICAgIAkiTWFpbiIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMjc2MAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IE5vdGVWaWV3IEA0MgotCQkgICAgbG9jYXRpb24gICAJKDg0OCwgMTg0MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDIKLQkJCWxvY2F0aW9uICAgCSg1NTEsIDE3MTgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJNAotCQkJbWF4X3dpZHRoICAJNTU5Ci0JCQlsYWJlbCAgICAgIAkiVGhpcyBzaG91bGQgcmVhbGx5IGJlIEphdmFDbGFzcyBhbmQgSmF2YURhdGFUeXBlLCBlQ2xhc3NpZmllciBpcyB0aGVpciBjbG9zZXN0IGNvbW1vbiBhbmNlc3Rvci4iKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJODQyMTYzMQotCQkgICAgd2lkdGggICAgICAJNjE5Ci0JCSAgICBoZWlnaHQgICAgIAkyNTYpCi0JCShvYmplY3QgTm90ZVZpZXcgQDQzCi0JCSAgICBsb2NhdGlvbiAgIAkoMjcyLCAzMjApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQzCi0JCQlsb2NhdGlvbiAgIAkoMTA3LCAxNjYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJNgotCQkJbWF4X3dpZHRoICAJMjk1Ci0JCQlsYWJlbCAgICAgIAkiVGhlIGNsYXNzZXMgd2lsbCBiZSBjb250YWluZWQgYnkgdGhlIHN0YW5kYXJkIEVQYWNrYWdlIG1ldGFPYmplY3RzIHJlbGF0aW9uc2hpcC4iKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTM1NQotCQkgICAgaGVpZ2h0ICAgICAJMzIwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkZpZWxkIiBANDQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc3NiwgNDgwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0NAotCQkJbG9jYXRpb24gICAJKDE2ODAsIDQzNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxOTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJGaWVsZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGOEYwMjgwIgotCQkgICAgd2lkdGggICAgICAJMjEwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SW5pdGlhbGl6ZXIiIEA0NQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNTY4LCAyMjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ1Ci0JCQlsb2NhdGlvbiAgIAkoMTM2MywgMTUxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQxMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkluaXRpYWxpemVyIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QTVEQzAwQkIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA0NQotCQkJbG9jYXRpb24gICAJKDEzNjMsIDIwNykKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkzNDUpCi0JCSAgICB3aWR0aCAgICAgIAk0MjgKLQkJICAgIGhlaWdodCAgICAgCTE2OAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFja2FnZSIgQDQ2Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDYwOCwgOTYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ2Ci0JCQlsb2NhdGlvbiAgIAkoNDQ3LCA1MCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhUGFja2FnZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM4MTA4RTAzMDFEMiIKLQkJICAgIHdpZHRoICAgICAgCTM0MAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYXJhbWV0ZXIiIEA0NwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzQ0LCAxNTg0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0NwotCQkJbG9jYXRpb24gICAJKDEzNDQsIDE0ODgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJODAwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YVBhcmFtZXRlciIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRDc4MDI4MCIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDQ3Ci0JCQlsb2NhdGlvbiAgIAkoMTM0NCwgMTU0NCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAk2NzgpCi0JCSAgICB3aWR0aCAgICAgIAk4MTgKLQkJICAgIGhlaWdodCAgICAgCTIxNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpNZXRob2QiIEA0OAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNzEyLCA5OTIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQ4Ci0JCQlsb2NhdGlvbiAgIAkoMTYxMywgOTQ2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE5OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIk1ldGhvZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgd2lkdGggICAgICAJMjE2Ci0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJNZXRob2RIYXMiIEA0OQotCQkgICAgbG9jYXRpb24gICAJKDE3MDAsIDEyNjIpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFGMDMwMkNFIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJtZXRob2QiIEA1MAotCQkJICAgIFBhcmVudF9WaWV3IAlANDkKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA4LCAyMzgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QUYwODAxOTciCi0JCQkgICAgY2xpZW50ICAgICAJQDQ5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTcwMCwgMTI2MikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTcwMCwgMTA0OSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MQotCQkJCVBhcmVudF9WaWV3IAlANTAKLQkJCQlsb2NhdGlvbiAgIAkoMTYzMywgMTA5NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC43ODE2NTkKLQkJCQloZWlnaHQgICAgIAk2OAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgInBhcmFtZXRlcnMiIEA1MgotCQkJICAgIFBhcmVudF9WaWV3IAlANDkKLQkJCSAgICBsb2NhdGlvbiAgIAkoMzA4LCAyMzgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA1MwotCQkJCVBhcmVudF9WaWV3IAlANTIKLQkJCQlsb2NhdGlvbiAgIAkoMTgzNywgMTQzMykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjM1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcGFyYW1ldGVycyIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMzU2NQotCQkJCWhlaWdodCAgICAgCTEzNwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjA4MDE5NiIKLQkJCSAgICBjbGllbnQgICAgIAlANDkKLQkJCSAgICBzdXBwbGllciAgIAlANDcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzAwLCAxMjYyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzAwLCAxNDc2KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU0Ci0JCQkJUGFyZW50X1ZpZXcgCUA1MgotCQkJCWxvY2F0aW9uICAgCSgxNjM2LCAxNDU2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwNTEyOAotCQkJCWhlaWdodCAgICAgCTY1Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANTUKLQkJCQlQYXJlbnRfVmlldyAJQDUyCi0JCQkJbG9jYXRpb24gICAJKDE1OTIsIDEzOTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1OQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuNjI4ODIxCi0JCQkJaGVpZ2h0ICAgICAJMTA5Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUV2ZW50IiBANTYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBTaG93T3BlcmF0aW9uU2lnbmF0dXJlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE5MiwgNjU2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDU2Ci0JCQlsb2NhdGlvbiAgIAkoMjA2NCwgNjA3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI1NgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFFdmVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0M2MkZBRjEwM0M4IgotCQkgICAgd2lkdGggICAgICAJMjc0Ci0JCSAgICBoZWlnaHQgICAgIAkxMjIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SmF2YUNsYXNzIiBANTcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNTYwLCA2NzIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDU3Ci0JCQlsb2NhdGlvbiAgIAkoMzc0LCA1NTQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YUNsYXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0OUZDQzAwRkEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA1NwotCQkJbG9jYXRpb24gICAJKDM3NCwgNjEwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTQKLQkJCW1heF93aWR0aCAgCTMxMykKLQkJICAgIHdpZHRoICAgICAgCTM5MAotCQkgICAgaGVpZ2h0ICAgICAJMjU4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMSIgQDU4Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTIxMywgNTM4KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM4MkEyOUJEMDIxOSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZmllbGRzIiBANTkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDU4Ci0JCQkgICAgbG9jYXRpb24gICAJKDczMywgMjgyKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjAKLQkJCQlQYXJlbnRfVmlldyAJQDU5Ci0JCQkJbG9jYXRpb24gICAJKDE1MTEsIDUxMykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTkyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZmllbGRzIgotCQkJCXBjdERpc3QgICAgCTAuNjUzMDE3Ci0JCQkJaGVpZ2h0ICAgICAJMjYKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODJBMjlCRTAzNTAiCi0JCQkgICAgY2xpZW50ICAgICAJQDU4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ0Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIxMywgNTM4KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjcxLCA1MzgpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANjEKLQkJCQlQYXJlbnRfVmlldyAJQDU5Ci0JCQkJbG9jYXRpb24gICAJKDE2MjQsIDQ4NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgImphdmFDbGFzcyIgQDYyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1OAotCQkJICAgIGxvY2F0aW9uICAgCSg3MzMsIDI4MikKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODJBMjlCRTAzQkYiCi0JCQkgICAgY2xpZW50ICAgICAJQDU4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIxMywgNTM4KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTUsIDUzOCkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEA2MwotCQkgICAgbG9jYXRpb24gICAJKDkxNiwgMzA3KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMDk1MDNFNSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiaW5pdGlhbGl6ZXJzIiBANjQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDYzCi0JCQkgICAgbG9jYXRpb24gICAJKDI3NiwgOTkpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA2NQotCQkJCVBhcmVudF9WaWV3IAlANjQKLQkJCQlsb2NhdGlvbiAgIAkoMTA5NiwgMjE2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitpbml0aWFsaXplcnMiCi0JCQkJcGN0RGlzdCAgICAJMC40MTA3MTkKLQkJCQloZWlnaHQgICAgIAk5MgotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMDk3MDE1MyIKLQkJCSAgICBjbGllbnQgICAgIAlANjMKLQkJCSAgICBzdXBwbGllciAgIAlANDUKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MTYsIDMwNykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM1NCwgMzA3KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDY2Ci0JCQkJUGFyZW50X1ZpZXcgCUA2NAotCQkJCWxvY2F0aW9uICAgCSgxMzQ1LCAzNjgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTc5Njg3Ci0JCQkJaGVpZ2h0ICAgICAJNjEKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJqYXZhQ2xhc3MiIEA2NwotCQkJICAgIFBhcmVudF9WaWV3IAlANjMKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc2LCA5OSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTA5NzAxNUQiCi0JCQkgICAgY2xpZW50ICAgICAJQDYzCi0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDkxNiwgMzA3KQotCQkJCSg3MTMsIDMwNykKLQkJCQkoNzEzLCA1NDMpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDkxNiwgMzA3KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MTMsIDU0MykpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEA2OAotCQkgICAgbG9jYXRpb24gICAJKDIwNiwgNjQyKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMjEyMDBDMiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZGVjbGFyZWRDbGFzc2VzIiBANjkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDY4Ci0JCQkgICAgbG9jYXRpb24gICAJKC01NzgsIDI3NCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDcwCi0JCQkJUGFyZW50X1ZpZXcgCUA2OQotCQkJCWxvY2F0aW9uICAgCSgyNDAsIDU4MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzI1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrZGVjbGFyZWRDbGFzc2VzIgotCQkJCXBjdERpc3QgICAgCTAuMzQzMTk1Ci0JCQkJaGVpZ2h0ICAgICAJMzEKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTIxNzAxRDgiCi0JCQkgICAgY2xpZW50ICAgICAJQDY4Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDIwNiwgNjQyKQotCQkJCSgyMDYsIDYxMikKLQkJCQkoMzY1LCA2MTIpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwNiwgNjQyKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgzNjUsIDYxMikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MQotCQkJCVBhcmVudF9WaWV3IAlANjkKLQkJCQlsb2NhdGlvbiAgIAkoMzQ3LCA1NTYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAyMzY3Ci0JCQkJaGVpZ2h0ICAgICAJNTcKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJkZWNsYXJpbmdDbGFzcyIgQDcyCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA2OAotCQkJICAgIGxvY2F0aW9uICAgCSgtNTc4LCAyNzQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3MwotCQkJCVBhcmVudF9WaWV3IAlANzIKLQkJCQlsb2NhdGlvbiAgIAkoMjU4LCA2NzUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI5OAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2RlY2xhcmluZ0NsYXNzIgotCQkJCXBjdERpc3QgICAgCTAuNDM0Mjg2Ci0JCQkJaGVpZ2h0ICAgICAJMwotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMjE3MDJEQyIKLQkJCSAgICBjbGllbnQgICAgIAlANjgKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMjA2LCA2NDIpCi0JCQkJKDIwNiwgNjcyKQotCQkJCSgzNjUsIDY3MikpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjA2LCA2NDIpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM2NSwgNjcyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDc0Ci0JCQkJUGFyZW50X1ZpZXcgCUA3MgotCQkJCWxvY2F0aW9uICAgCSgzNDUsIDcyNikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNyIgQDc1Ci0JCSAgICBsb2NhdGlvbiAgIAkoNjAzLCAzNDcpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgU2VnTGFiZWwgQDc2Ci0JCQlQYXJlbnRfVmlldyAJQDc1Ci0JCQlsb2NhdGlvbiAgIAkoNjAzLCAyMjgpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJYW5jaG9yICAgICAJMTAKLQkJCWFuY2hvcl9sb2MgCTEKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ1MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8ZGVyaXZlZD4+IgotCQkJcGN0RGlzdCAgICAJMC41MDAwMDAKLQkJCWhlaWdodCAgICAgCTEyMAotCQkJb3JpZW50YXRpb24gCTApCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkyQUEyQTcwMUMxIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJqYXZhQ2xhc3NlcyIgQDc3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA3NQotCQkJICAgIGxvY2F0aW9uICAgCSgyNywgMjE5KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzgKLQkJCQlQYXJlbnRfVmlldyAJQDc3Ci0JCQkJbG9jYXRpb24gICAJKDcyMCwgNDE5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNDgKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitqYXZhQ2xhc3NlcyIKLQkJCQlwY3REaXN0ICAgIAkwLjM2NzUyMQotCQkJCWhlaWdodCAgICAgCTExNwotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM5MkFBMkE4MDM2NyIKLQkJCSAgICBjbGllbnQgICAgIAlANzUKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2MDMsIDM0NykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjAzLCA1NDMpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzkKLQkJCQlQYXJlbnRfVmlldyAJQDc3Ci0JCQkJbG9jYXRpb24gICAJKDY1NywgNTIyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiamF2YVBhY2thZ2UiIEA4MAotCQkJICAgIFBhcmVudF9WaWV3IAlANzUKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjcsIDIxOSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgxCi0JCQkJUGFyZW50X1ZpZXcgCUA4MAotCQkJCWxvY2F0aW9uICAgCSg0ODIsIDE3OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMjYzCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIramF2YVBhY2thZ2UiCi0JCQkJcGN0RGlzdCAgICAJMC44NjI5MDMKLQkJCQloZWlnaHQgICAgIAkxMjIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQTJBOTAwODMiCi0JCQkgICAgY2xpZW50ICAgICAJQDc1Ci0JCQkgICAgc3VwcGxpZXIgICAJQDQ2Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjAzLCAzNDcpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDYwMywgMTUyKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDgyCi0JCQkJUGFyZW50X1ZpZXcgCUA4MAotCQkJCWxvY2F0aW9uICAgCSg2NTcsIDE3MikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQotCQkob2JqZWN0IEF0dGFjaFZpZXcgIiIgQDgzCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBjbGllbnQgICAgIAlANDMKLQkJICAgIHN1cHBsaWVyICAgCUA3NQotCQkgICAgbGluZV9zdHlsZSAJMCkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEA4NAotCQkgICAgbG9jYXRpb24gICAJKDYxNiwgMTUyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODUKLQkJCVBhcmVudF9WaWV3IAlAODQKLQkJCWxvY2F0aW9uICAgCSg2MTYsIDE0NjUpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQloaWRkZW4gICAgIAlUUlVFCi0JCQlhbmNob3IgICAgIAkxCi0JCQlhbmNob3JfbG9jIAkxCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSIiCi0JCQlwY3REaXN0ICAgIAkwLjUwMDAwMAotCQkJaGVpZ2h0ICAgICAJNjAKLQkJCW9yaWVudGF0aW9uIAkwKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRCMDg4MDFBNSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiL3R5cGVkRWxlbWVudCIgQDg2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA4NAotCQkJICAgIGxvY2F0aW9uICAgCSg1NiwgOTQ4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzY1NEIwOTEwMDhDIgotCQkJICAgIGNsaWVudCAgICAgCUA4NAotCQkJICAgIHN1cHBsaWVyICAgCUA0NwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg2MTYsIDE1MjQpCi0JCQkJKDYxNiwgMTU4NCkKLQkJCQkoMTMzNSwgMTU4NCkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjE2LCAxNTI0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMzM1LCAxNTg0KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg3Ci0JCQkJUGFyZW50X1ZpZXcgCUA4NgotCQkJCWxvY2F0aW9uICAgCSgxMjU2LCAxNTMxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiL3R5cGUiIEA4OAotCQkJICAgIFBhcmVudF9WaWV3IAlAODQKLQkJCSAgICBsb2NhdGlvbiAgIAkoNTYsIDk0OCkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDg5Ci0JCQkJUGFyZW50X1ZpZXcgCUA4OAotCQkJCWxvY2F0aW9uICAgCSg2OTcsIDEwOTkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTExNgotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiKy90eXBlIgotCQkJCXBjdERpc3QgICAgCTAuNTg4MTYxCi0JCQkJaGVpZ2h0ICAgICAJODEKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QjA5MTAwN0QiCi0JCQkgICAgY2xpZW50ICAgICAJQDg0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDU3Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjE2LCAxNTI0KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2MTYsIDgwMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEA5MAotCQkgICAgbG9jYXRpb24gICAJKDEwODgsIDk2MSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODJBMjlDMDAxN0QiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZHMiIEA5MQotCQkJICAgIFBhcmVudF9WaWV3IAlAOTAKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjA4LCA3MDUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5MgotCQkJCVBhcmVudF9WaWV3IAlAOTEKLQkJCQlsb2NhdGlvbiAgIAkoMTQwOSwgODg5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxOTIKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIittZXRob2RzIgotCQkJCXBjdERpc3QgICAgCTAuNjI0MDIzCi0JCQkJaGVpZ2h0ICAgICAJNzMKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODJBMjlDMTAxNzQiCi0JCQkgICAgY2xpZW50ICAgICAJQDkwCi0JCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA4OCwgOTYxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjA0LCA5NjEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTMKLQkJCQlQYXJlbnRfVmlldyAJQDkxCi0JCQkJbG9jYXRpb24gICAJKDE0ODMsIDEwMTcpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuNzY2MDQwCi0JCQkJaGVpZ2h0ICAgICAJNTYKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJqYXZhQ2xhc3MiIEA5NAotCQkJICAgIFBhcmVudF9WaWV3IAlAOTAKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjA4LCA3MDUpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzgyQTI5QzEwMjBBIgotCQkJICAgIGNsaWVudCAgICAgCUA5MAotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMDg4LCA5NjEpCi0JCQkJKDczMiwgOTYxKQotCQkJCSg3MzIsIDgwMSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTA4OCwgOTYxKQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MzIsIDgwMSkpKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIk1ldGhvZFRocm93cyIgQDk1Ci0JCSAgICBsb2NhdGlvbiAgIAkoMTA0NywgOTgxKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM4MTBCNjFCMDE3OCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAibWV0aG9kIiBAOTYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDk1Ci0JCQkgICAgbG9jYXRpb24gICAJKDQ4NywgNDA1KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MTBCNjFFMDIyNyIKLQkJCSAgICBjbGllbnQgICAgIAlAOTUKLQkJCSAgICBzdXBwbGllciAgIAlANDgKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMDQ3LCA5ODEpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE2MDQsIDk4MSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJqYXZhRXhjZXB0aW9ucyIgQDk3Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUA5NQotCQkJICAgIGxvY2F0aW9uICAgCSg0ODcsIDQwNSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk4Ci0JCQkJUGFyZW50X1ZpZXcgCUA5NwotCQkJCWxvY2F0aW9uICAgCSg3MzMsIDk0NSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzEyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIramF2YUV4Y2VwdGlvbnMiCi0JCQkJcGN0RGlzdCAgICAJMC41NjM2NjQKLQkJCQloZWlnaHQgICAgIAkzNwotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MTBCNjFFMDFDMyIKLQkJCSAgICBjbGllbnQgICAgIAlAOTUKLQkJCSAgICBzdXBwbGllciAgIAlANTcKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTA0NywgOTgxKQotCQkJCSg2NjksIDk4MSkKLQkJCQkoNjY5LCA4MDEpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNDcsIDk4MSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjY5LCA4MDEpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTkKLQkJCQlQYXJlbnRfVmlldyAJQDk3Ci0JCQkJbG9jYXRpb24gICAJKDcyMywgODU3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMSIgQDEwMAotCQkgICAgbG9jYXRpb24gICAJKDE1NDEsIDgwNikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNDNjJGQkUwMDE2OCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiZXZlbnRzIiBAMTAxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDAKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTgxLCAxMzQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDIKLQkJCQlQYXJlbnRfVmlldyAJQDEwMQotCQkJCWxvY2F0aW9uICAgCSgyMTY5LCA3NjUpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE0NAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2V2ZW50cyIKLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMAotCQkJCWhlaWdodCAgICAgCTQyCi0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiM0M2MkZCRTIwMDhGIgotCQkJICAgIGNsaWVudCAgICAgCUAxMDAKLQkJCSAgICBzdXBwbGllciAgIAlANTYKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoMTU0MSwgODA2KQotCQkJCSgyMjM4LCA4MDYpCi0JCQkJKDIyMzgsIDcxNykpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU0MSwgODA2KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjM4LCA3MTcpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDEKLQkJCQlsb2NhdGlvbiAgIAkoMjI5MiwgNzk2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4ubiIKLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMAotCQkJCWhlaWdodCAgICAgCTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTIiIEAxMDQKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwMAotCQkJICAgIGxvY2F0aW9uICAgCSg5ODEsIDEzNCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzYyRkJFMjAwOTEiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwMAotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE1NDEsIDgwNikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzU1LCA4MDYpKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMyIgQDEwNQotCQkgICAgbG9jYXRpb24gICAJKDE0MDUsIDY2MykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNDODkzODc3MDI1MyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiYWxsRXZlbnRzIiBAMTA2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUKLQkJCSAgICBsb2NhdGlvbiAgIAkoODQ1LCAtOSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwNwotCQkJCVBhcmVudF9WaWV3IAlAMTA2Ci0JCQkJbG9jYXRpb24gICAJKDE5MjUsIDYyMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTkzCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrYWxsRXZlbnRzIgotCQkJCXBjdERpc3QgICAgCTAuODAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNDIKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzg5Mzg3ODAyQ0MiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwNQotCQkJICAgIHN1cHBsaWVyICAgCUA1NgotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MDUsIDY2MykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjA1NSwgNjYzKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOAotCQkJCVBhcmVudF9WaWV3IAlAMTA2Ci0JCQkJbG9jYXRpb24gICAJKDE5NzUsIDcwMikKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC44NzYzMzYKLQkJCQloZWlnaHQgICAgIAkzOQotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE0IiBAMTA5Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMDUKLQkJCSAgICBsb2NhdGlvbiAgIAkoODQ1LCAtOSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzQzg5Mzg3ODAyQ0UiCi0JCQkgICAgY2xpZW50ICAgICAJQDEwNQotCQkJICAgIHN1cHBsaWVyICAgCUA1NwotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MDUsIDY2MykKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNzU1LCA2NjMpKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzc2lmaWVyIiBAMTEwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDQ0OCwgMjI1NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMTAKLQkJCWxvY2F0aW9uICAgCSgxMzAsIDIwNTkpCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MzYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFQ2xhc3NpZmllciIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiM0FDRTRGRUUwMzcxIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTEwCi0JCQlsb2NhdGlvbiAgIAkoMTMwLCAyMTYyKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk2Ci0JCQltYXhfd2lkdGggIAk1MzgpCi0JCSAgICB3aWR0aCAgICAgIAk2NTQKLQkJICAgIGhlaWdodCAgICAgCTQxOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpBcnJheVR5cGUiIEAxMTEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzUyLCAxMzI4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMTEKLQkJCWxvY2F0aW9uICAgCSgxMTIsIDEyNTUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDgwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiQXJyYXlUeXBlIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0E5RDc5RUQwMURGIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTExCi0JCQlsb2NhdGlvbiAgIAkoMTEyLCAxMzExKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTQwNSkKLQkJICAgIHdpZHRoICAgICAgCTQ5OAotCQkgICAgaGVpZ2h0ICAgICAJMTY4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTIKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzQTlENzlGRDAxMEYiCi0JCSAgICBjbGllbnQgICAgIAlAMTExCi0JCSAgICBzdXBwbGllciAgIAlANTcKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDMxLCAxMjQzKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQzMSwgODAxKSkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDE1IiBAMTEzCi0JCSAgICBsb2NhdGlvbiAgIAkoMzkzLCAxNzI5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0RGNENBQUQwMUEzIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJjb21wb25lbnRUeXBlIiBAMTE0Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU1LCAzODUpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTUKLQkJCQlQYXJlbnRfVmlldyAJQDExNAotCQkJCWxvY2F0aW9uICAgCSgzNzgsIDE5ODYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTMyOAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2NvbXBvbmVudFR5cGUiCi0JCQkJcGN0RGlzdCAgICAJMC44MDAwMDAKLQkJCQloZWlnaHQgICAgIAk0MgotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNERjRDQUFFMDFFQiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTEzCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMAotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYKLQkJCQlQYXJlbnRfVmlldyAJQDExNAotCQkJCWxvY2F0aW9uICAgCSg0NzcsIDIwMDgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxNiIgQDExNwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTEzCi0JCQkgICAgbG9jYXRpb24gICAJKC01NSwgMzg1KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNERjRDQUFFMDFGNSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTEzCi0JCQkgICAgc3VwcGxpZXIgICAJQDExMQotCQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlIiBAMTE4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIyMjQsIDIyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxMTgKLQkJCWxvY2F0aW9uICAgCSgyMDMzLCAxNDUpCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzODIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFU3RydWN0dXJhbEZlYXR1cmUiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENTlEMDIzMCIKLQkJICAgIHdpZHRoICAgICAgCTQwMAotCQkgICAgaGVpZ2h0ICAgICAJMTgyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMTkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzREY0Q0U4MzAzOTAiCi0JCSAgICBjbGllbnQgICAgIAlANTYKLQkJICAgIHN1cHBsaWVyICAgCUAxMTgKLQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiSW1wb3J0cyIKLQkgICAgcXVpZCAgICAgICAJIjM4MTBBMERDMDE1RCIKLQkgICAgdGl0bGUgICAgICAJIkltcG9ydHMiCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhQ2xhc3MiIEAxMjAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMzIwLCA2NzIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEyMAotCQkJbG9jYXRpb24gICAJKDE4OSwgNjI2KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI2MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkphdmFDbGFzcyIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NDlGQ0MwMEZBIgotCQkgICAgd2lkdGggICAgICAJMjgwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJDbGFzc0ltcG9ydHMiIEAxMjEKLQkJICAgIGxvY2F0aW9uICAgCSg2NDMsIDExMTUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMgotCQkJUGFyZW50X1ZpZXcgCUAxMjEKLQkJCWxvY2F0aW9uICAgCSg2NzcsIDEwNDApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCVRSVUUKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlhbmNob3IgICAgIAkxCi0JCQlhbmNob3JfbG9jIAkxCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk2MDAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJDbGFzc0ltcG9ydHMiCi0JCQlwY3REaXN0ICAgIAkxLjA2NjY2NwotCQkJaGVpZ2h0ICAgICAJNzYKLQkJCW9yaWVudGF0aW9uIAkwKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM4MjlDNEJGMDAwRCIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiY2xhc3NJbXBvcnQiIEAxMjMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMQotCQkJICAgIGxvY2F0aW9uICAgCSgyMjcsIDMzMSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNAotCQkJCVBhcmVudF9WaWV3IAlAMTIzCi0JCQkJbG9jYXRpb24gICAJKDY2NSwgNjcxKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyNDAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitjbGFzc0ltcG9ydCIKLQkJCQlwY3REaXN0ICAgIAkwLjcyNzE1NAotCQkJCWhlaWdodCAgICAgCTIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzODI5QzRCRjAwMEUiCi0JCQkgICAgY2xpZW50ICAgICAJQDEyMQotCQkJICAgIHN1cHBsaWVyICAgCUAxMjAKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNjQzLCAxMTE1KQotCQkJCSg3MDMsIDExMTUpCi0JCQkJKDcwMywgNjcyKQotCQkJCSg0NjAsIDY3MikpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjQzLCAxMTE1KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg0NjAsIDY3MikKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUKLQkJCQlQYXJlbnRfVmlldyAJQDEyMwotCQkJCWxvY2F0aW9uICAgCSg1MjUsIDcyMykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MTQ2NzYKLQkJCQloZWlnaHQgICAgIAk1MQotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyNgotCQkJCVBhcmVudF9WaWV3IAlAMTIzCi0JCQkJbG9jYXRpb24gICAJKDc0MiwgNzM3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkzCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIntvcmRlcmVkfSIKLQkJCQlwY3REaXN0ICAgIAkwLjU4NzQ2NwotCQkJCWhlaWdodCAgICAgCTM5Ci0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiaW1wb3J0ZWRCeSIgQDEyNwotCQkJICAgIFBhcmVudF9WaWV3IAlAMTIxCi0JCQkgICAgbG9jYXRpb24gICAJKDIyNywgMzMxKQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI4Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMjcKLQkJCQlsb2NhdGlvbiAgIAkoMzMwLCA5MzYpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI0MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2ltcG9ydGVkQnkiCi0JCQkJcGN0RGlzdCAgICAJMC43MDgwNDAKLQkJCQloZWlnaHQgICAgIAkxMAotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MjlDNEJGMDAwRiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTIxCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyMAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSg2NDMsIDExMTUpCi0JCQkJKDMyMCwgMTExNSkKLQkJCQkoMzIwLCA3MjkpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY0MywgMTExNSkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzIwLCA3MjkpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI5Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMjcKLQkJCQlsb2NhdGlvbiAgIAkoMjgwLCA4MDIpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuODk3NjExCi0JCQkJaGVpZ2h0ICAgICAJNDEKLQkJCQlvcmllbnRhdGlvbiAJMCkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKYXZhUGFja2FnZSIgQDEzMAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNDA4LCAyMjQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDEzMAotCQkJbG9jYXRpb24gICAJKDEyNDcsIDE3OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzMjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhUGFja2FnZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgxMDhFMDMwMUQyIgotCQkgICAgd2lkdGggICAgICAJMzQwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICJQYWNrYWdlSW1wb3J0cyIgQDEzMQotCQkgICAgbG9jYXRpb24gICAJKDEwMjMsIDM4MikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTMyCi0JCQlQYXJlbnRfVmlldyAJQDEzMQotCQkJbG9jYXRpb24gICAJKDEwMzgsIDQxOSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJVFJVRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWFuY2hvciAgICAgCTEKLQkJCWFuY2hvcl9sb2MgCTEKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTYwMAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBhY2thZ2VJbXBvcnRzIgotCQkJcGN0RGlzdCAgICAJMC43NTAwMDAKLQkJCWhlaWdodCAgICAgCTM3Ci0JCQlvcmllbnRhdGlvbiAJMSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODI5QzRFQzAyMDciCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImltcG9ydGVkQnkiIEAxMzMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEzMQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDE3LCAtMzA2KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTM0Ci0JCQkJUGFyZW50X1ZpZXcgCUAxMzMKLQkJCQlsb2NhdGlvbiAgIAkoNjQ4LCA0MzApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTI0MAotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK2ltcG9ydGVkQnkiCi0JCQkJcGN0RGlzdCAgICAJMC42NDY1MjYKLQkJCQloZWlnaHQgICAgIAk0MQotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MjlDNEVFMDEwNSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMxCi0JCQkgICAgc3VwcGxpZXIgICAJQDEyMAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMDIzLCAzODIpCi0JCQkJKDEwMjMsIDI1NSkKLQkJCQkoNDEzLCA2MTQpKQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzUKLQkJCQlQYXJlbnRfVmlldyAJQDEzMwotCQkJCWxvY2F0aW9uICAgCSg1MTIsIDYxOCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iCi0JCQkJcGN0RGlzdCAgICAJMC45MDAwMDAKLQkJCQloZWlnaHQgICAgIAk1NAotCQkJCW9yaWVudGF0aW9uIAkwKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgInBhY2thZ2VJbXBvcnRzIiBAMTM2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMzEKLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQxNywgLTMwNikKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzNwotCQkJCVBhcmVudF9WaWV3IAlAMTM2Ci0JCQkJbG9jYXRpb24gICAJKDEyMjMsIDU3OSkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMzEyCi0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcGFja2FnZUltcG9ydHMiCi0JCQkJcGN0RGlzdCAgICAJMC41MjI0NzIKLQkJCQloZWlnaHQgICAgIAk0MAotCQkJCW9yaWVudGF0aW9uIAkwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjM4MjlDNEVFMDBGQiIKLQkJCSAgICBjbGllbnQgICAgIAlAMTMxCi0JCQkgICAgc3VwcGxpZXIgICAJQDEzMAotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJCSgxMDIzLCAzODIpCi0JCQkJKDEwMjMsIDYxOCkKLQkJCQkoMTI2NSwgNjE4KQotCQkJCSgxMzg2LCAyODEpKQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzgKLQkJCQlQYXJlbnRfVmlldyAJQDEzNgotCQkJCWxvY2F0aW9uICAgCSgxNDA5LCAzNzgpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi5uIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMzkKLQkJCQlQYXJlbnRfVmlldyAJQDEzNgotCQkJCWxvY2F0aW9uICAgCSgxNDI0LCA1MDApCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTMKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1OQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9IgotCQkJCXBjdERpc3QgICAgCTAuNzY5NjYzCi0JCQkJaGVpZ2h0ICAgICAJMTA5Ci0JCQkJb3JpZW50YXRpb24gCTEpKSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiU291cmNlIGNvZGUiCi0JICAgIHF1aWQgICAgICAgCSIzODEwQTEzQjAxNTkiCi0JICAgIHRpdGxlICAgICAgCSJTb3VyY2UgY29kZSIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkNvbW1lbnQiIEAxNDAKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNTkyLCA2ODgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE0MAotCQkJbG9jYXRpb24gICAJKDQ3NSwgNjQyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTIzNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkNvbW1lbnQiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM4MEY4ODlCMDJCOCIKLQkJICAgIHdpZHRoICAgICAgCTI1MgotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OlN0YXRlbWVudCIgQDE0MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTA0LCA2ODgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE0MQotCQkJbG9jYXRpb24gICAJKDk4MywgNjQyKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTI0MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlN0YXRlbWVudCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4QjkwMjVBIgotCQkgICAgd2lkdGggICAgICAJMjYwCi0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SW5pdGlhbGl6ZXIiIEAxNDIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ0LCAyODgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE0MgotCQkJbG9jYXRpb24gICAJKDMzLCAyNDIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMjIyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSW5pdGlhbGl6ZXIiKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QTVEQzAwQkIiCi0JCSAgICB3aWR0aCAgICAgIAkyNDAKLQkJICAgIGhlaWdodCAgICAgCTExNAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpGaWVsZCIgQDE0MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNTYsIDExMikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTQzCi0JCQlsb2NhdGlvbiAgIAkoMTYwLCA2NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkxOTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJGaWVsZCIpCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjM2NTRBRjhGMDI4MCIKLQkJICAgIHdpZHRoICAgICAgCTIxMAotCQkgICAgaGVpZ2h0ICAgICAJMTE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkJsb2NrIiBAMTQ0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDg2NCwgMzUyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNDQKLQkJCWxvY2F0aW9uICAgCSg2OTIsIDI1NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJCbG9jayIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzgwRjg4MzcwMTUwIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTQ0Ci0JCQlsb2NhdGlvbiAgIAkoNjkyLCAzMTIpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMwotCQkJbWF4X3dpZHRoICAJMjkwKQotCQkgICAgd2lkdGggICAgICAJMzYyCi0JCSAgICBoZWlnaHQgICAgIAkyMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxNDUKLQkJICAgIGxvY2F0aW9uICAgCSg4NjQsIDU4MCkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMTQ0Ci0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSg4NjQsIDU4MCkKLQkJCSg4NjQsIDQ1OSkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODhENjAwQTUiCi0JCSAgICBjbGllbnQgICAgIAlAMTQwCi0JCSAgICBzdXBwbGllciAgIAlAMTQ0Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU4MSwgNjMxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU4MSwgNTgwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMTQ1KQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDcKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzODBGODhEQTAwNTYiCi0JCSAgICBjbGllbnQgICAgIAlAMTQxCi0JCSAgICBzdXBwbGllciAgIAlAMTQ0Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDExMjEsIDYzMCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMTIxLCA1ODApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxNDUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4IiBAMTQ4Ci0JCSAgICBsb2NhdGlvbiAgIAkoNDczLCAzMDApCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDMzMwMzZBIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJzb3VyY2UiIEAxNDkKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE0OAotCQkJICAgIGxvY2F0aW9uICAgCSgxNTMsIC0zODgpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTAKLQkJCQlQYXJlbnRfVmlldyAJQDE0OQotCQkJCWxvY2F0aW9uICAgCSg1OTksIDI2NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTQ1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrc291cmNlIgotCQkJCXBjdERpc3QgICAgCTAuNTk5MzkzCi0JCQkJaGVpZ2h0ICAgICAJMzQKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUMzODAxNDAiCi0JCQkgICAgY2xpZW50ICAgICAJQDE0OAotCQkJICAgIHN1cHBsaWVyICAgCUAxNDQKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NzMsIDMwMCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjgzLCAzMDApCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUxCi0JCQkJUGFyZW50X1ZpZXcgCUAxNDkKLQkJCQlsb2NhdGlvbiAgIAkoNjA1LCAzMzQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIwLi4xIgotCQkJCXBjdERpc3QgICAgCTAuNjM1MjY2Ci0JCQkJaGVpZ2h0ICAgICAJMzQKLQkJCQlvcmllbnRhdGlvbiAJMSkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJpbml0aWFsaXplciIgQDE1MgotCQkJICAgIFBhcmVudF9WaWV3IAlAMTQ4Ci0JCQkgICAgbG9jYXRpb24gICAJKDE1MywgLTM4OCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUMzODAxNjgiCi0JCQkgICAgY2xpZW50ICAgICAJQDE0OAotCQkJICAgIHN1cHBsaWVyICAgCUAxNDIKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NzMsIDMwMCkKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjY0LCAzMDApKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5IiBAMTUzCi0JCSAgICBsb2NhdGlvbiAgIAkoNjcxLCAxMTQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NAotCQkJUGFyZW50X1ZpZXcgCUAxNTMKLQkJCWxvY2F0aW9uICAgCSg2NzEsIDU1KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlUUlVFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaGlkZGVuICAgICAJVFJVRQotCQkJYW5jaG9yICAgICAJMQotCQkJYW5jaG9yX2xvYyAJMQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjAKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSIiCi0JCQlwY3REaXN0ICAgIAkwLjUwMDAwMAotCQkJaGVpZ2h0ICAgICAJNjAKLQkJCW9yaWVudGF0aW9uIAkwKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQzU2MDJBMiIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAiaW5pdGlhbGl6ZXIiIEAxNTUKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MwotCQkJICAgIGxvY2F0aW9uICAgCSgzMTksIC0zMzQpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNTYKLQkJCQlQYXJlbnRfVmlldyAJQDE1NQotCQkJCWxvY2F0aW9uICAgCSg5NTQsIDIxMCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTk1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIraW5pdGlhbGl6ZXIiCi0JCQkJcGN0RGlzdCAgICAJMC44OTE4MjcKLQkJCQloZWlnaHQgICAgIAkxMDQKLQkJCQlvcmllbnRhdGlvbiAJMCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUM1NzAyREYiCi0JCQkgICAgY2xpZW50ICAgICAJQDE1MwotCQkJICAgIHN1cHBsaWVyICAgCUAxNDQKLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCQkoNjcxLCAxMTQpCi0JCQkJKDg1MCwgMTE0KQotCQkJCSg4NTAsIDI0NSkpCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjcxLCAxMTQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDg1MCwgMjQ1KQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE1NwotCQkJCVBhcmVudF9WaWV3IAlAMTU1Ci0JCQkJbG9jYXRpb24gICAJKDc5MCwgMjE4KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMC4uMSIKLQkJCQlwY3REaXN0ICAgIAkwLjkxMzQ2MgotCQkJCWhlaWdodCAgICAgCTYxCi0JCQkJb3JpZW50YXRpb24gCTEpKQotCQkJKG9iamVjdCBSb2xlVmlldyAiZmllbGQiIEAxNTgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE1MwotCQkJICAgIGxvY2F0aW9uICAgCSgzMTksIC0zMzQpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDNTcwMzA3IgotCQkJICAgIGNsaWVudCAgICAgCUAxNTMKLQkJCSAgICBzdXBwbGllciAgIAlAMTQzCi0JCQkgICAgbGluZV9zdHlsZSAJMwotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNjcxLCAxMTQpCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDM2MSwgMTE0KSkpKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6Ok1ldGhvZCIgQDE1OQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyODgsIDQ5NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTU5Ci0JCQlsb2NhdGlvbiAgIAkoMTkwLCA0NTApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTk2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiTWV0aG9kIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzY1NEFFOTEwMjcxIgotCQkgICAgd2lkdGggICAgICAJMjE0Ci0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxMCIgQDE2MAotCQkgICAgbG9jYXRpb24gICAJKDU5NiwgNDk2KQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjM5MkFBQ0E1MDFFNyIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAic291cmNlIiBAMTYxCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxNjAKLQkJCSAgICBsb2NhdGlvbiAgIAkoMjc2LCAtNDQ4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTYyCi0JCQkJUGFyZW50X1ZpZXcgCUAxNjEKLQkJCQlsb2NhdGlvbiAgIAkoNjkwLCA0NjMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTEKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE0NQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiK3NvdXJjZSIKLQkJCQlwY3REaXN0ICAgIAkwLjQ3NDc3NwotCQkJCWhlaWdodCAgICAgCTM0Ci0JCQkJb3JpZW50YXRpb24gCTApCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiMzkyQUFDQTcwMTdDIgotCQkJICAgIGNsaWVudCAgICAgCUAxNjAKLQkJCSAgICBzdXBwbGllciAgIAlAMTQ0Ci0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkJKDU5NiwgNDk2KQotCQkJCSg3NTksIDQ5NikKLQkJCQkoNzU5LCA0NTkpKQotCQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU5NiwgNDk2KQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NTksIDQ1OSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNjMKLQkJCQlQYXJlbnRfVmlldyAJQDE2MQotCQkJCWxvY2F0aW9uICAgCSg4MTcsIDQ3NykKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMgotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTUKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiCi0JCQkJcGN0RGlzdCAgICAJMC45MTUzNjcKLQkJCQloZWlnaHQgICAgIAk1OAotCQkJCW9yaWVudGF0aW9uIAkxKSkKLQkJCShvYmplY3QgUm9sZVZpZXcgIm1ldGhvZCIgQDE2NAotCQkJICAgIFBhcmVudF9WaWV3IAlAMTYwCi0JCQkgICAgbG9jYXRpb24gICAJKDI3NiwgLTQ0OCkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzOTJBQUNBNzAxQjgiCi0JCQkgICAgY2xpZW50ICAgICAJQDE2MAotCQkJICAgIHN1cHBsaWVyICAgCUAxNTkKLQkJCSAgICBsaW5lX3N0eWxlIAkzCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1OTYsIDQ5NikKLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMzk1LCA0OTYpKSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiRGF0YSBUeXBlcyIKLQkgICAgcXVpZCAgICAgICAJIjM4MTBBMUNFMDJFQiIKLQkgICAgdGl0bGUgICAgICAJIkRhdGEgVHlwZXMiCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkwCi0JICAgIG9yaWdpbl95ICAgCTAKLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpUeXBlS2luZCIgQDE2NQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNDAsIDIyNCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY1Ci0JCQlsb2NhdGlvbiAgIAkoNzcsIDg0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyNgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlR5cGVLaW5kIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2NQotCQkJbG9jYXRpb24gICAJKDc3LCAzOSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzI2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzNjU0QjQ2MDAyQkYiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNjUKLQkJCWxvY2F0aW9uICAgCSg3NywgMTQwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTUKLQkJCW1heF93aWR0aCAgCTI3NykKLQkJICAgIHdpZHRoICAgICAgCTM0NAotCQkgICAgaGVpZ2h0ICAgICAJMzkyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFWaXNpYmlsaXR5S2luZCIgQDE2NgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNDAsIDY0MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY2Ci0JCQlsb2NhdGlvbiAgIAkoNjgsIDUwMCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNDQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhVmlzaWJpbGl0eUtpbmQiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY2Ci0JCQlsb2NhdGlvbiAgIAkoNjgsIDQ1NSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzQ0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzODIzMzNCRTAzMkUiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNjYKLQkJCWxvY2F0aW9uICAgCSg2OCwgNTU2KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTUKLQkJCW1heF93aWR0aCAgCTI5MikKLQkJICAgIHdpZHRoICAgICAgCTM2MgotCQkgICAgaGVpZ2h0ICAgICAJMzkyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IE5vdGVWaWV3IEAxNjcKLQkJICAgIGxvY2F0aW9uICAgCSgxMjk2LCAyMDgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2NwotCQkJbG9jYXRpb24gICAJKDg4NywgNTIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJNgotCQkJbWF4X3dpZHRoICAJNzgzCi0JCQlsYWJlbCAgICAgIAkKLXxUaGUgSmF2YSBwcmltaXRpdmUgdHlwZXMgYXJlIGluc3RhbmNlcyBvZiBKYXZhRGF0YVR5cGUuICBUaGUgY29tbW9uIHBhcmVudCBjbGFzcyB3aXRoIEphdmFDbGFzcyBpcyBDbGFzc2lmaWVyLiAgVGhlIHByaW1pdGl2ZSB0eXBlcyBjYW4gYmUgb2J0YWluZWQgdmlhIGEgSmF2YVVSTCgiaW50IiksIHdoaWNoIHJlc29sdmVzIHRvIGEgcmVmZXJlbmNlIGxpa2U6ICJqYXZhOi8jaW50IgotCQkJKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTg0MwotCQkgICAgaGVpZ2h0ICAgICAJMzI1KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFQYXJhbWV0ZXJLaW5kIiBAMTY4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDI1NiwgMTA4OCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTY4Ci0JCQlsb2NhdGlvbiAgIAkoNjMsIDk0OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzODYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhUGFyYW1ldGVyS2luZCIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjgKLQkJCWxvY2F0aW9uICAgCSg2MywgOTAzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzODYKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkgICAgaWNvbl9zdHlsZSAJIkxhYmVsIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzOTFDMUU4RjAxMjMiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNjgKLQkJCWxvY2F0aW9uICAgCSg2MywgMTAwNCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAk1Ci0JCQltYXhfd2lkdGggIAkyMDcpCi0JCSAgICB3aWR0aCAgICAgIAk0MDQKLQkJICAgIGhlaWdodCAgICAgCTM5MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBOb3RlVmlldyBAMTY5Ci0JCSAgICBsb2NhdGlvbiAgIAkoNzY4LCAxMTIwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNjkKLQkJCWxvY2F0aW9uICAgCSg1NzQsIDEwMTcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJNAotCQkJbWF4X3dpZHRoICAJMzUyCi0JCQlsYWJlbCAgICAgIAkiVGVtcG9yYXJ5IGVudW0gZm9yIEphdmEgcGFyYW1ldGVyIGtpbmQgdW50aWwgd2UgZ2V0IHRoZSBiYXNlIHNvcnRlZCBvdXQiKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTQxMgotCQkgICAgaGVpZ2h0ICAgICAJMjE5KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmphdmE6OkphdmFEYXRhVHlwZSIgQDE3MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMTY4LCAxNDA4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNzAKLQkJCWxvY2F0aW9uICAgCSg5OTksIDEzNjIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzM4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSmF2YURhdGFUeXBlIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiMzk1OTEzMzQwMzE2IgotCQkgICAgd2lkdGggICAgICAJMzU2Ci0JCSAgICBoZWlnaHQgICAgIAkxMTQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVEYXRhVHlwZSIgQDE3MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMDg4LCA2NDApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE3MQotCQkJbG9jYXRpb24gICAJKDgxMiwgNTExKQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTUyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiRURhdGFUeXBlIikKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1MjUwMzNFIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMTcxCi0JCQlsb2NhdGlvbiAgIAkoODEyLCA2MTEpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1MjIpCi0JCSAgICB3aWR0aCAgICAgIAk1NzAKLQkJICAgIGhlaWdodCAgICAgCTI4MgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxNzIKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGNsaWVudCAgICAgCUAxNjkKLQkJICAgIHN1cHBsaWVyICAgCUAxNjgKLQkJICAgIGxpbmVfc3R5bGUgCTApKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiSmF2YSBUeXBlcyIKLQkgICAgcXVpZCAgICAgICAJIjNCNjVCODIzMDIwRCIKLQkgICAgdGl0bGUgICAgICAJIkphdmEgVHlwZXMiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGNsYXNzIGRpYWdyYW0gY29udGFpbnMgdGhlIEphdmEgVHlwZXMgdGhhdCBhcmUgbm90IEVNRiBjbGFzc2VzIGJ1dCBhcmUgcmVmZXJlbmNlZCBpbiB0aGlzIGRpYWdyYW0uIgotCSAgICB6b29tICAgICAgIAkxMDAKLQkgICAgbWF4X2hlaWdodCAJMjgzNTAKLQkgICAgbWF4X3dpZHRoICAJMjE2MDAKLQkgICAgb3JpZ2luX3ggICAJNDc4Ci0JICAgIG9yaWdpbl95ICAgCTM1Ci0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6amF2YTo6SlR5cGVKYXZhSGVscGVycyIgQDE3MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDIwOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTczCi0JCQlsb2NhdGlvbiAgIAkoMzk4LCAxNTQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTAyOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkpUeXBlSmF2YUhlbHBlcnMiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTczCi0JCQlsb2NhdGlvbiAgIAkoMzk4LCAxMDkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTEwMjgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PGRhdGF0eXBlPj4iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCNjVBREU0MDNBNiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDE3MwotCQkJbG9jYXRpb24gICAJKDM5OCwgMjEwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTg3MykKLQkJICAgIHdpZHRoICAgICAgCTEwNDYKLQkJICAgIGhlaWdodCAgICAgCTIyMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpqYXZhOjpKVHlwZUxpc3QiIEAxNzQKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoODgwLCA1NzYpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE3NAotCQkJbG9jYXRpb24gICAJKDYyOCwgNTIzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTUwNAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkpUeXBlTGlzdCIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNzQKLQkJCWxvY2F0aW9uICAgCSg2MjgsIDQ3OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTA0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxkYXRhdHlwZT4+IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzQjY1Qjg3NjAyQzEiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUAxNzQKLQkJCWxvY2F0aW9uICAgCSg2MjgsIDU3OSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk1MDcpCi0JCSAgICB3aWR0aCAgICAgIAk1MjIKLQkJICAgIGhlaWdodCAgICAgCTIxOAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkpKSkpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2luc3RhbmNlLm1kbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvaW5zdGFuY2UubWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTAwN2U1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvaW5zdGFuY2UubWRsCisrKyAvZGV2L251bGwKQEAgLTEsODY2OSArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0NwotICAgIF93cml0dGVuICAgCSJSb3NlIDguMC4wMzAzLjE0MDAiCi0gICAgY2hhclNldCAgICAJMCkKLQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIklERSIKLQkgICAgdmFsdWUgICAgICAJIkludGVybmFsIEVkaXRvciIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyIKLQkgICAgdmFsdWUgICAgICAJIiIpKQotICAgIHF1aWQgICAgICAgCSIzQTc5RUJBNTAzMzEiCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cwotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMAotCWxlZnRNYXJnaW4gCTAuMjUwMDAwCi0JdG9wTWFyZ2luICAJMC4yNTAwMDAKLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwCi0JY2xpcEljb25MYWJlbHMgCVRSVUUKLQlhdXRvUmVzaXplIAlUUlVFCi0Jc25hcFRvR3JpZCAJRkFMU0UKLQlncmlkWCAgICAgIAkxNgotCWdyaWRZICAgICAgCTE2Ci0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udAotCSAgICBzaXplICAgICAgIAkxMAotCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JICAgIGJvbGQgICAgICAgCUZBTFNFCi0JICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JICAgIHVuZGVybGluZSAgCUZBTFNFCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JICAgIGNvbG9yICAgICAgCTAKLQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQlzaG93TWVzc2FnZU51bSAJMQotCXNob3dDbGFzc09mT2JqZWN0IAlUUlVFCi0Jbm90YXRpb24gICAJIlVuaWZpZWQiKQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3IgotCXF1aWQgICAgICAgCSIzQTc5OTlBRDAyOTciCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzQTc5OTlCNzAyRjYiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyIKLQlxdWlkICAgICAgIAkiM0E3OTk5QUQwMjhFIgotCWV4cG9ydENvbnRyb2wgCSJQdWJsaWMiCi0JZ2xvYmFsICAgICAJVFJVRQotCXN1YnN5c3RlbSAgCSJDb21wb25lbnQgVmlldyIKLQlxdWlkdSAgICAgIAkiM0I4NkYxNzIwMTZGIgotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImluc3RhbnRpYXRpb24iCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXb3Jrc3BhY2VSb290XFxvcmcuZWNsaXBzZS5qZW1cXHJvc2VcXGluc3RhbnRpYXRpb24uY2F0IgotCQlxdWlkICAgICAgIAkiM0I4NkYxNzIwMTgwIikKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZWNvcmUiCi0JCWlzX3VuaXQgICAgCVRSVUUKLQkJaXNfbG9hZGVkICAJRkFMU0UKLQkJZmlsZV9uYW1lICAJIiRXb3Jrc3BhY2VSb290XFxvcmcuZWNsaXBzZS5lbWYuZWNvcmVcXG1vZGVsXFxvcmcuZWNsaXBzZS5lbWYuRWNvcmUuY2F0IgotCQlxdWlkICAgICAgIAkiMzlBNUVEMDQwMDRFIikpCi0JbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgotCQlxdWlkICAgICAgIAkiM0I4NkYxNzIwMTczIgotCQl0aXRsZSAgICAgIAkiTWFpbiIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbiIgQDEKLQkJCWxvY2F0aW9uICAgCSgzMzQsIDI0MCkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMQotCQkJICAgIGxvY2F0aW9uICAgCSgxOTAsIDE1NikKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJImluc3RhbnRpYXRpb24iKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjNCODZGMTcyMDE4MCIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKSkpCi0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJEZXBlbmRlbmNpZXMgKERvbid0IGVkaXQpIgotCQlxdWlkICAgICAgIAkiM0I4NkYzMUYwMjgxIgotCQl0aXRsZSAgICAgIAkiRGVwZW5kZW5jaWVzIChEb24ndCBlZGl0KSIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkgICAgKG9iamVjdCBOb3RlVmlldyBAMgotCQkJbG9jYXRpb24gICAJKDc1MywgNjg1KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyCi0JCQkgICAgbG9jYXRpb24gICAJKDMwNSwgNTM5KQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJNgotCQkJICAgIG1heF93aWR0aCAgCTg2MAotCQkJICAgIGxhYmVsICAgICAgCSJUaGVzZSBhcmUgdGhlIGRlcGVuZGVuY2llcy4gVGhleSBhcmUgbm90IHRvIGJlIGVkaXRlZC4gVGhleSBtdXN0IG9ubHkgYmUgZWRpdGVkIGJ5IHRoZWlyIG93bmVyIG1vZGVscy4iKQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJODQyMTYzMQotCQkJd2lkdGggICAgICAJOTIwCi0JCQloZWlnaHQgICAgIAkzMDUpCi0JCSAgICAob2JqZWN0IENhdGVnb3J5VmlldyAiTG9naWNhbCBWaWV3OjplY29yZSIgQDMKLQkJCWxvY2F0aW9uICAgCSgyNjMsIDE4NSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJICAgIFBhcmVudF9WaWV3IAlAMwotCQkJICAgIGxvY2F0aW9uICAgCSgxMTksIDEwMSkKLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJICAgIG5saW5lcyAgICAgCTIKLQkJCSAgICBtYXhfd2lkdGggIAkyODgKLQkJCSAgICBqdXN0aWZ5ICAgIAkwCi0JCQkgICAgbGFiZWwgICAgICAJImVjb3JlIikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzOUE1RUQwNDAwNEUiCi0JCQl3aWR0aCAgICAgIAkzMDAKLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpCi0gICAgcm9vdF9zdWJzeXN0ZW0gCShvYmplY3QgU3ViU3lzdGVtICJDb21wb25lbnQgVmlldyIKLQlxdWlkICAgICAgIAkiM0I4NkYxNzIwMTZGIgotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlwaHlzaWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0Ci0JICAgIChvYmplY3QgTW9kdWxlX0RpYWdyYW0gIk1haW4iCi0JCXF1aWQgICAgICAgCSIzQjg2RjE3MjAxNzYiCi0JCXRpdGxlICAgICAgCSJNYWluIgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb2Nlc3Nfc3RydWN0dXJlIAkob2JqZWN0IFByb2Nlc3NlcwotCXF1aWQgICAgICAgCSIzQjg2RjE3MjAxNzAiCi0JUHJvY3NORGV2cyAJKGxpc3QKLQkgICAgKG9iamVjdCBQcm9jZXNzX0RpYWdyYW0gIkRlcGxveW1lbnQgVmlldyIKLQkJcXVpZCAgICAgICAJIjNCODZGMTcyMDE3MiIKLQkJdGl0bGUgICAgICAJIkRlcGxveW1lbnQgVmlldyIKLQkJem9vbSAgICAgICAJMTAwCi0JCW1heF9oZWlnaHQgCTI4MzUwCi0JCW1heF93aWR0aCAgCTIxNjAwCi0JCW9yaWdpbl94ICAgCTAKLQkJb3JpZ2luX3kgICAJMAotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkKLSAgICBwcm9wZXJ0aWVzIAkob2JqZWN0IFByb3BlcnRpZXMKLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ0RpcmVjdG9yaWVzQXNQYWNrYWdlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbkZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdIZWFkZXJGaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOZXdJbXBsZW1lbnRhdGlvbkZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiRmlsZUNhcGl0YWxpemF0aW9uU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJKCJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTdHJpcENsYXNzUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJUYWJXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTQpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NJbmRlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCS0yKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlcyIKLQkJCXZhbHVlICAgICAgCSgiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJQYWdlV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzTWVtYmVyT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkoIk1lbWJlck9yZGVyU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk9uZVBhcmFtZXRlclBlckxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZUJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjEiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMyIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjQiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI1IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keSIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdW5jdGlvbkJvZHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJEZWZhdWx0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJTb3VyY2VGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCb2R5U291cmNlRmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQU5TSSBDKysgRXZlbnQgV2F0Y2hlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQU5TSUNvbnZlcnQiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZGEiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWQjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE4M19TT1VSQ0UiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzTmFtZSIKLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0FjY2VzcyIKLQkJCXZhbHVlICAgICAgCSgiSW1wbGVtZW50YXRpb25TZXQiIDQzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUG9seW1vcnBoaWNVbml0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkhhbmRsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSGFuZGxlQWNjZXNzIgotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJUaGVfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIlRoaXMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlDb25zdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb3B5IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkZyZWUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzRXF1YWxpdHlPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSGFuZGxlRXF1YWxpdHlPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNUYXNrIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJMaW1pdGVkUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzU3VidW5pdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlbmFtZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJNb2RlIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJNb2RlU2V0IiAyMDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIiR7ZGVmYXVsdH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJTcGVjIgotCQkJCXZhbHVlICAgICAgCTIyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiQm9keSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlNlcGFyYXRlIgotCQkJCXZhbHVlICAgICAgCTIyMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJNb2RlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJJbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkluT3V0IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb25SZXR1cm4iCi0JCQkJdmFsdWUgICAgICAJMjA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJVc2VDb2xvbk5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk2MCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJVc2VGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE5NV9TT1VSQ0UiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVJbXBsZW1lbnRhdGlvblNldCIgMjA4KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2wiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVDb250cm9sU2V0IiAyMjUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ29udHJvbGxlZF8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZURlZmluaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIgMjA5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkS2luZFBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7Y2xhc3N9X1JlY29yZF9LaW5kcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzTGltaXRlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJUeXBlVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NUeXBlRGVmaW5pdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQ2xhc3NXaWRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTWF5YmVBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IiAxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmVudENsYXNzTmFtZSIKLQkJCXZhbHVlICAgICAgCSJTdXBlcmNsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4IgotCQkJdmFsdWUgICAgICAJIkFfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZUeXBlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7YWNjZXNzX3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZkFjY2Vzc1R5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFycmF5SW5kZXhEZWZpbml0aW9uIgotCQkJdmFsdWUgICAgICAJIlBvc2l0aXZlIHJhbmdlIDw+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIlRoaXMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQ3JlYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb3B5IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVUeXBlRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUVxdWFsaXR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3F1b3RlfT0ke3F1b3RlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlRhZ2dlZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlJlY29yZCIKLQkJCQl2YWx1ZSAgICAgIAkyMTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk1peGluIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJUYXNrIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVHlwZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk11bHRpcGxlVHlwZXMiCi0JCQkJdmFsdWUgICAgICAJMjEzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiVW5jb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAkyMTQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMjI1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbml0aWFsaXphdGlvbk9ubHkiCi0JCQkJdmFsdWUgICAgICAJMjI2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50RmluYWxpemF0aW9uT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMjcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkyMjgpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBbHdheXMiCi0JCQkJdmFsdWUgICAgICAJMjI5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBdXRvIgotCQkJCXZhbHVlICAgICAgCTIzMCkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyaWNGb3JtYWxQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzUHJpdmF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVuYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRpbmciCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck1vZGUiCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyQ2xhc3NXaWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVudHJ5QmFycmllckNvbmRpdGlvbiIKLQkJCXZhbHVlICAgICAgCSJUcnVlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiU3BlYyIKLQkJCQl2YWx1ZSAgICAgIAkyMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkJvZHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nQXNCb2R5IgotCQkJCXZhbHVlICAgICAgCTIzMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkluIgotCQkJCXZhbHVlICAgICAgCTIwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiT3V0IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiSW5PdXQiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3MiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiIDIxNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTIxNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpc3NvY2lhdGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIgotCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkNvbXBvbmVudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTIxNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiR2VuZXJpYyIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJXaW5kb3dzU2hlbGwiCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcmRlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIgotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ2xlYXJDYXNlIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJInByb2plY3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJWaWV3Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEb21haW5Db3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNQUGFja2FnZUNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5kZXhDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5Q291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJKb2luQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJjT05UQUlORVJDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJWaWV3UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEb21haW5QcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkluZGV4UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yZWlnbktleVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGF0YWJhc2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhcmdldERhdGFiYXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZVNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEZWF1bHQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkJ1ZmZlclBvb2wiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkV4dGVudFNpemUiCi0JCQl2YWx1ZSAgICAgIAkxKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJlZmV0Y2hTaXplIgotCQkJdmFsdWUgICAgICAJMSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhZ2VTaXplIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk1hbmFnZWRCeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyTGlzdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtU2NoZW1hIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbURvbWFpblBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpblBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUm9vdFNjaGVtYSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSb290RG9tYWluUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWFQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEYXRhYmFzZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEQk1TIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNUYWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNWaWV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTUFBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN5bm9ueW1ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29ycmVsYXRpb25OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGVja09wdGlvbiIKLQkJCXZhbHVlICAgICAgCSJOb25lIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU25hcFNob3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGlzdGluY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBlcnNpc3RUb1NlcnZlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk9yZGluYWwiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJZGVudGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiTmF0aXZlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk9JRCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUmVsYXRpb25zaGlwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VJZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUklNZXRob2QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBhcmVudFVwZGF0ZVJ1bGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJETU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVHJpZ2dlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTdG9yZWRQcm9jZWR1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzQ2x1c3RlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRmlsbEZhY3RvciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJLZXlMaXN0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGVja1ByZWRpY2F0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmVyYWxNb2RlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ2hlY2tUaW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJbnNlcnRFdmVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVFdmVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEZWxldGVFdmVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmT2xkVGFibGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk5ld1RhYmxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZPbGRSb3ciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk5ld1JvdyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSb3ciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIldoZW5DbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxhbmd1YWdlIgotCQkJdmFsdWUgICAgICAJIlNRTCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcm9jVHlwZSIKLQkJCXZhbHVlICAgICAgCSJQcm9jZWR1cmUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEZXRlcm1pbmlzdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJTdHlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuZWROdWxsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbWV0ZXIiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0luUGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzT3V0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklEIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIENvbW11bmljYXRvciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJvb3REaXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlUHJlZml4ZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5vdFNob3dSb3NlSUREbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTaG93Q29kZWdlbkRsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUm9zZUlEIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jRGVmYXVsdEF1dGhvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0VmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0U2luY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkxIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jTnVtQXN0ZXJpc2tzIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNYXhOdW1DaGFycyIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVkaXRvciIKLQkJCXZhbHVlICAgICAgCSgiRWRpdG9yVHlwZSIgMTAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWTSIKLQkJCXZhbHVlICAgICAgCSgiVk1UeXBlIiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNsYXNzUGF0aCIKLQkJCXZhbHVlICAgICAgCSI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxjaGFyc2V0cy5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxqY2UuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcanNzZS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxydC5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxzdW5yc2FzaWduLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcZG5zbnMuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcZXh0XFxsZGFwc2VjLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcbG9jYWxlZGF0YS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxleHRcXHN1bmpjZV9wcm92aWRlci5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxzZWN1cml0eVxcbG9jYWxfcG9saWN5LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXHNlY3VyaXR5XFxVU19leHBvcnRfcG9saWN5LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcbGliXFxkdC5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGxpYlxcaHRtbGNvbnZlcnRlci5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGxpYlxcdG9vbHMuamFyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWZlcmVuY2VDbGFzc3BhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWTVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3VuIgotCQkJCXZhbHVlICAgICAgCTIwMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZBSmF2YVdvcmtpbmdGb2xkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NWYXJpYWJsZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRPcGVyYXRpb25SZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJInZvaWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5vQ2xhc3NDdXN0b21EbGciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHbG9iYWxJbXBvcnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZUNsYXNzU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk9wZW5CcmFjZU1ldGhvZFN0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlU3BhY2VzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTcGFjaW5nSXRlbXMiCi0JCQl2YWx1ZSAgICAgIAkzKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJvc2VEZWZhdWx0Q29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJBc3Rlcmlza0NvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YUNvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0F1dGhvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NTaW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5TdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZW1vdGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZW1vdGVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJIb21lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSG9tZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5U3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRFRETG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RFRETG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdEoyRUVKYXZhZG9jIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lSmF2YURvY1RhZ3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU291cmNlQ29udHJvbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ1NlbGVjdGVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdFNvdXJjZVJvb3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NQcm9qZWN0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ0NvbW1lbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVfWE1MX0REIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbXBGaWVsZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNueEZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQk5hbWVJbkpBUiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVsZXNzIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiIDIxMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIyMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIyMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiCi0JCQkJdmFsdWUgICAgICAJMjIyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVlbnRyYW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblN5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJKCJFSkJWZXJzaW9uX1NldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIyLjAiCi0JCQkJdmFsdWUgICAgICAJMjMwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjEueCIKLQkJCQl2YWx1ZSAgICAgIAkyMzEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiRGVmYXVsdF9TZXJ2bGV0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMi4wIgotCQkJCXZhbHVlICAgICAgCTIzMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIxLngiCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJIkh0dHBfU2VydmxldF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9ySXMiCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHVibGljIgotCQkJCXZhbHVlICAgICAgCTYyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk2MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTY0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInBhY2thZ2UiCi0JCQkJdmFsdWUgICAgICAJNjUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZpbmFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc3RhbmNlSW5pdGlhbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X0VKQl9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc1NpbmdsZVRocmVhZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJc1NlY3VyZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVySW5jbHVkZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJGb3J3YXJkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Z2V0SW5mbyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRYTUxGaWxlUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXJOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW50SGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldERhdGVIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yQ29va2llIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRlbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOYXRpdmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkZpbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVHJhbnNpZW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJlYW5Qcm9wZXJ0eV9TZXQiIDcxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCZWFuUHJvcGVydHlfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTcxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAk3MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCb3VuZCIKLQkJCQl2YWx1ZSAgICAgIAk3MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCIKLQkJCQl2YWx1ZSAgICAgIAk3NCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkluZGl2aWR1YWxDaGFuZ2VNZ3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlIgotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgJiBXcml0ZSIKLQkJCQl2YWx1ZSAgICAgIAk4MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRUeXBlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIgotCQkJdmFsdWUgICAgICAJIkRETDEuU1FMIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJEcm9wQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiX0lEIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uVHlwZSIKLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSwwKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmlld05hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9JRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIldoZXJlQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZVByZWNpc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uT2ZSRUZTIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIgotCQkJdmFsdWUgICAgICAJKCJNZXRob2RLaW5kU2V0IiAxOTAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPdmVybG9hZElEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vRGF0YVN0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNTZWxmaXNoIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJFdmVudFNldCIgMTYwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyUmVmZXJlbmNpbmdOYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIgotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRm9yRWFjaFNldCIgMTcwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlcldoZW5DbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAkxOTAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTE5MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTkwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMTkwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJPcGVyYXRvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlRyaWdnZXIiCi0JCQkJdmFsdWUgICAgICAJMTkwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJDYWxjdWxhdGVkIgotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJBRlRFUiIKLQkJCQl2YWx1ZSAgICAgIAkxODAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkJFRk9SRSIKLQkJCQl2YWx1ZSAgICAgIAkxODAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiCi0JCQkJdmFsdWUgICAgICAJMTgwMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlJPVyIKLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCIKLQkJCQl2YWx1ZSAgICAgIAkxNzAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckV2ZW50U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCIKLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkRFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIE9SIERFTEVURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk51bGxzQWxsb3dlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiUHJlY2lzaW9uIgotCQkJdmFsdWUgICAgICAJIjIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIjYiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1ByaW1hcnlLZXkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb21wb3NpdGVVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ29tcG9uZW50VGVzdCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUmVxdWlzaXRlUHJvIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVc2VNU1ZDIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJjb21waWxlcjIuMV9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSwkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2UoJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2UoJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2Uoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMy4wX19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93UHJvdGVjdGVkSW5oZXJpdGFuY2UiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPbmVCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIk9wdGlvbmFsQnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ2xhc3NLZXkiCi0JCQl2YWx1ZSAgICAgIAkiY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlB1dEJvZGllc0luU3BlYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29weUNvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXRDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ25tZW50S2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHlPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVJlbGF0aW9uYWxPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3JhZ2VNZ210VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0VmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU3Vic2NyaXB0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVJlc3VsdFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVJbmRpcmVjdGlvbk9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RyZWFtVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdHJlYW1PcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJEZWNsYXJlT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRvTm90RGVjbGFyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZU9yZGVyIgotCQkJdmFsdWUgICAgICAJIkFNSVIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIklubGluaW5nU3R5bGVTZXQiIDIwNykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluaW5nU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZvbGxvd2luZ0NsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA3KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlR5cGVzRGVmaW5lZCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgJVElICVaJSAlVyUiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHRlbnNpb25sZXNzRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IAotfC8vICRwYWNrYWdlCi18I2luY2x1ZGUgIiRmaWxlIgotfAotCQkJKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZCIKLQkJCXZhbHVlICAgICAgCSgiT3BlcmF0aW9uS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFic3RyYWN0Qm9keSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZEJvZHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGcmllbmREZWNsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNwZWNpYWxEZWNsUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzRXhwbGljaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kcmVsYXRpb25zaGlwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhhc1JlbFR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluc3RhbmNlQXJndW1lbnRzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2V0IgotCQkJdmFsdWUgICAgICAJIiRkYXRhLmdldCgka2V5cykiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0NvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkc3VwcGxpZXIgKiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAkoIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19HZXRTZXRCeVJlZmVyZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVF1YWxpZmllZFNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0RhdGFNZW1iZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck11dGFiaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jQ2xhc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jQ2xhc3NTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc1NldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk0NSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTQ0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXRBdHRyaWJ1dGVWaXNpYmlsaXR5IgotCQkJCXZhbHVlICAgICAgCTIxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Vc2VzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvZHlSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5SXNPblNlYXJjaExpc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHJlY29tcGlsZWRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRlbnQiCi0JCQl2YWx1ZSAgICAgIAkyKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFsbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSI1LjAiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZV9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ2xhc3NfRmFjdG9yeSIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09iamVjdEZ1bmN0aW9uYWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluYW1pYyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlNlcmlhbCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfREFUQV9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmllbGRHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTWVzc2FnZUdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0X2luIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTGljZW5zZWQiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ3RsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNYWpvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcFBhZ2VJRHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydGllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0Z1bmN0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNwSWRFbnVtIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BfSURfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIklOVEVSRkFDRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbml0SW50ZXJmYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJTdG9ja0V2ZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50U2lua01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJJbmhlcml0YW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1GQ0ltcGxlbWVudHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ09NTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09NX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ09OTkVDVElPTl9QT0lOVF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1zZ01hcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BlcnR5TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUFJPUEVSVFlfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDT3BlcmF0aW9uVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ09wZXJhdGlvblR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbF9PdmVycmlkZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lc3NhZ2VfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9GaXJpbmdfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJFdmVudF9TaW5rX0hhbmRsZXIiCi0JCQkJdmFsdWUgICAgICAJNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCIKLQkJCQl2YWx1ZSAgICAgIAk2KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkNvbW1hbmRfUGFyc2VyIgotCQkJCXZhbHVlICAgICAgCTcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfR2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfTm90aWZ5X0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTEwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1hY3JvX0dlbmVyYXRlZF9GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJCb2R5SW1hZ2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vcm1hbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkdldF9TZXRfUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEaWFsb2dfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTdG9ja19Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0RJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiUG9pbnRlckJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrUHJvcGVydHlJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJNU1ZDIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfSU5DTFVERVNfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluc2VydExvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlJvc2UgTW9kZWwgSW50ZWdyYXRvciIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUm9zZSBXZWIgUHVibGlzaGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJTb0RBIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJUb3BMaW5rIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJUeXBlS2luZHMiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJlbnVtIgotCQkJCXZhbHVlICAgICAgCTEwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJInJlY29yZCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJtb2R1bGUiCi0JCQkJdmFsdWUgICAgICAJMTAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiaW50ZXJmYWNlIgotCQkJCXZhbHVlICAgICAgCTEwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImRpc3BpbnRlcmZhY2UiCi0JCQkJdmFsdWUgICAgICAJMTA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiY29jbGFzcyIKLQkJCQl2YWx1ZSAgICAgIAkxMDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJhbGlhcyIKLQkJCQl2YWx1ZSAgICAgIAkxMDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJ1bmlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJtYXgiCi0JCQkJdmFsdWUgICAgICAJMTA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIgotCQkJCXZhbHVlICAgICAgCTEwOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkia2luZCIKLQkJCXZhbHVlICAgICAgCSgiVHlwZUtpbmRzIiAxMDkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidXVpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscGNvbnRleHQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImRsbG5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImFsaWFzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiZmlsZW5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImxpYnJhcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInV1aWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJInZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBmaWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkibGNpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZ1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIgotCQkJCXZhbHVlICAgICAgCTIxMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxTaW5nbGVVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjE5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiR2xvYmFsTXVsdGlVc2UiCi0JCQkJdmFsdWUgICAgICAJMjIwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJCYXNlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIgotCQkJCXZhbHVlICAgICAgCTIyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIjAiCi0JCQkJdmFsdWUgICAgICAJMjIzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiMSIKLQkJCQl2YWx1ZSAgICAgIAkyMjQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiCi0JCQl2YWx1ZSAgICAgIAkoIkJhc2VTZXQiIDIyMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25FeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25Db21wYXJlIgotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZyIKLQkJCXZhbHVlICAgICAgCSgiSW5zdGFuY2luZ1NldCIgMjE5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkNvbXBhcmVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiQmluYXJ5IgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIlRleHQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkFsaWFzTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSXNTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdCb2R5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Qm9keSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJOZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIldpdGhFdmVudHMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Jbmhlcml0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQnlWYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkJ5UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUGFyYW1BcnJheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvamVjdEZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiSW1wb3J0UmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJRdWlja0ltcG9ydCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBvcnRCaW5hcnkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWxTdHVkaW8iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIldlYiBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1N5c3RlbUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1B1YmxpY0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25WYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkludGVybmFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJFbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFeHRlcm5hbEVudGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uX1N5c3RlbUlEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fUHVibGljSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHREZWNsVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJBc3NpZ24gQWxsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiQ29tcG9uZW50UGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nUm9vdERpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJSZXZFbmdEaXJlY3Rvcmllc0FzUGFja2FnZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiLmgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb25GaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5jcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SGVhZGVyRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmV3SW1wbGVtZW50YXRpb25GaWxlRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGaWxlQ2FwaXRhbGl6YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkZpbGVDYXBpdGFsaXphdGlvblNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCSgiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXNTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3RyaXBDbGFzc1ByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiVGFiV2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk4KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5kZW50V2lkdGgiCi0JCQl2YWx1ZSAgICAgIAk0KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzSW5kZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAktMikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1vZGVsSWRDb21tZW50UnVsZXMiCi0JCQl2YWx1ZSAgICAgIAkoIk1vZGVsSWRDb21tZW50UnVsZXNTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUGFnZVdpZHRoIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc01lbWJlck9yZGVyIgotCQkJdmFsdWUgICAgICAJKCJNZW1iZXJPcmRlclNldCIgMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJPbmVQYXJhbWV0ZXJQZXJMaW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJOYW1lc3BhY2VCcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbkJyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEJvZHlJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUGFja2FnZXMiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkJyYWNlU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIzIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNCIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjUiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTWVtYmVyT3JkZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyIGJ5IGtpbmQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIgotCQkJCXZhbHVlICAgICAgCTMpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGVwbG95IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWZXJzaW9uIENvbnRyb2wiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJjbGFzc2lmaWVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJjb25zdHJhaW50cyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbENvbnRlbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb250ZW50S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkNvbnRlbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbXB0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiTWl4ZWQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudE9ubHkiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm9wZXJhdGlvbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0lEIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZlYXR1cmVLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJBdHRyaWJ1dGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInJlZmVyZW5jZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc0NoYW5nZWFibGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNSZXNvbHZlUHJveGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC1vbmx5IHVuc2V0dGFibGUiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiUmVhZC13cml0ZSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkZlYXR1cmVLaW5kIiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiRmVhdHVyZUtpbmQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlVuc3BlY2lmaWVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlNpbXBsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJBdHRyaWJ1dGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImFubm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY5IikpCi0JcXVpZCAgICAgICAJIjNCODZGMTcyMDE3MSIpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9pbnN0YW50aWF0aW9uLmNhdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuamVtL3Jvc2UvaW5zdGFudGlhdGlvbi5jYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYWQwZDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9pbnN0YW50aWF0aW9uLmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDI5NTMgKzAsMCBAQAotCi0ob2JqZWN0IFBldGFsCi0gICAgdmVyc2lvbiAgICAJNDcKLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA4LjAuMDMwMy4xNDAwIgotICAgIGNoYXJTZXQgICAgCTApCi0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImluc3RhbnRpYXRpb24iCi0gICAgaXNfdW5pdCAgICAJVFJVRQotICAgIGlzX2xvYWRlZCAgCVRSVUUKLSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCSAgICBuYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwiKSkpCi0gICAgcXVpZCAgICAgICAJIjNCODZGMTcyMDE4MCIKLSAgICBkb2N1bWVudGF0aW9uIAkiSmF2YSBJbnN0YW50aWF0aW9uIFBhY2thZ2UiCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLSAgICBsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3MgIklKYXZhRGF0YVR5cGVJbnN0YW5jZSIKLQkgICAgcXVpZCAgICAgICAJIjNCOEFCMTc4MDJCMSIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNFNTI5NTYyMDE0RSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OklKYXZhSW5zdGFuY2UiCi0JCSAgICBxdWlkdSAgICAgIAkiM0U1MTU3NUEwMkQ0IikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSUphdmFEYXRhVHlwZUluc3RhbmNlIgotCQkgICAgcXVpZCAgICAgICAJIjNCOEFCMTkxMDBDMiIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSUphdmFJbnN0YW5jZSIKLQkgICAgcXVpZCAgICAgICAJIjNFNTE1NzVBMDJENCIKLQkgICAgc3RlcmVvdHlwZSAJIkludGVyZmFjZSIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YUluc3RhbmNlIgotCQkgICAgcXVpZCAgICAgICAJIjNFNTE1Nzc4MDJCOSIKLQkJICAgIHN0ZXJlb3R5cGUgCSJqYXZhY2xhc3MiKSkpCi0JKG9iamVjdCBDbGFzcyAiSUphdmFPYmplY3RJbnN0YW5jZSIKLQkgICAgcXVpZCAgICAgICAJIjNCNzgyRDc5MDI5NiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaW50ZXJmYWNlIGlzIHRoZSBpbnN0YW5jZSBvZiBhbiBqYXZhIG9iamVjdCBpbiB0aGUgamF2YSBtb2RlbC4iCi0JICAgIHN0ZXJlb3R5cGUgCSJJbnRlcmZhY2UiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRTUxNTdEQTAzREQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJSmF2YUluc3RhbmNlIgotCQkgICAgcXVpZHUgICAgICAJIjNFNTE1NzVBMDJENCIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5iYXNlLklKYXZhT2JqZWN0SW5zdGFuY2UiCi0JCSAgICBxdWlkICAgICAgIAkiM0I3ODMwMTgwMUM5IgotCQkgICAgc3RlcmVvdHlwZSAJImphdmFjbGFzcyIpKSkKLQkob2JqZWN0IENsYXNzICJKYXZhQWxsb2NhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNGRDlFNjkwMDA2MSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBjbGFzcyBpcyB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiB0aGUgYWxsb2NhdGlvbiBjbGFzcy4gSXQgaXMgdGhlIHZhbHVlIG9mIHRoZSAiYWxsb2NhdGlvbiIgcHJvcGVydHkgb24gYSBKYXZhIE9iamVjdCBzbyB0aGF0IHRoZSBhY3R1YWwgYWxsb2NhdGlvbiBjYW4gYmUgY29udHJvbGxlZC4gRm9yIGV4YW1wbGUsIHRoZXJlIGNvdWxkIGJlIG9uZSBmb3IganVzdCBpbml0IHN0cmluZywgb3Igb25lIGZvciBzZXJpYWxpemVkLgotCSAgICAKLQkgICAgYWJzdHJhY3QgICAJVFJVRSkKLQkob2JqZWN0IENsYXNzICJJbml0U3RyaW5nQWxsb2NhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNGRDlFQUY5MDAxRSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXMgdXNlZCB3aGVuIHRoZSBhbGxvY2F0aW9uIHN0cmluZyBjYW4gYmUgcGFyc2VkIGJ5IHRoZSByZW1vdGUgdm0uIEl0IHVzZXMgdGhlIGFsbG9jU3RyaW5nLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjNGRDlFQjc1MDJEQSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OkphdmFBbGxvY2F0aW9uIgotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFNjkwMDA2MSIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbml0U3RyaW5nIgotCQkgICAgcXVpZCAgICAgICAJIjNGRkRFMURFMDMyRSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGlzIGlzIHRoZSBpbml0aWFsaXphdGlvbiBzdHJpbmcgZm9yIHRoaXMgb2JqZWN0LiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIkltcGxpY2l0QWxsb2NhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjNGRDlFQzE0MDI0MiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgY2xhc3MgaXMgZm9yIGFuIGltcGxpY2l0IGFsbG9jYXRpb24gd2hlcmUgdGhlIG9iamVjdCBjb21lcyBmcm9tIHRoZSBmZWF0dXJlIG9mIGFub3RoZXIgb2JqZWN0LiBJdCBpcyB0aGUgbGl2ZSBKYXZhIHZhbHVlIGZyb20gdGhlIHJlbW90ZSB2bS4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSIzRkQ5RUM0NzAwRTciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpKYXZhQWxsb2NhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RTY5MDAwNjEiKSkpCi0JKG9iamVjdCBDbGFzcyAiUGFyc2VUcmVlQWxsb2NhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgyQzkxMDAwNSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIkFsbG9jYXRpb25zIHZpYSBQYXJzZSBUcmVlcy4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4MkNCNzAxRDYiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpKYXZhQWxsb2NhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RTY5MDAwNjEiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODJEMEEwMUNCIgotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQotCShvYmplY3QgQ2xhc3MgIlBUQXJyYXlBY2Nlc3MiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4MkUxNDAyNTAiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfEFycmF5IGFjY2Vzcy4gZS5nLiB4WzNdLiAKLXwKLXxVbmxpa2UgQVNULCB0aGUgZW50aXJlIGV4cHJlc3Npb24gb2YgdHlwZSB4WzNdWzRdIHdpbGwgYmUgZG9uZSBpbiBvbmUgZXhwcmVzc2lvbiByYXRoZXIgdGhhbiBoYXZpbmcgYSBzZXBhcmF0ZSBBcnJheUFjY2VzcyBmb3IgZWFjaCBkaW1lbnNpb24uIFRoaXMgaXMganVzdCBhIHNpbXBsaWZpY2F0aW9uLiBUaGlzIGNhbiBvbmx5IGJlIHVzZWQgaWYgaXQgaXMgYSBzaW1wbGUgYXJyYXkgYWNjZXNzIHdoZXJlIGl0IGlzIG9mIHRoZSBmb3JtIHtleHByZXNzaW9ufVtleHByZXNzaW9uXVtleHByZXNzaW9uXS4KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4MkU2RjAxRjciCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFycmF5IgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgyRThFMDIzNyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGFycmF5IHRvIGFjY2Vzcy4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJpbmRleGVzIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgyRTlCMDA3RCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZXhwcmVzc2lvbnMgcmVwcmVzZW50aW5nIHRoZSBpbmRleGVzIG9mIHRoZSBhY2Nlc3MuIgotCQkgICAgc3RlcmVvdHlwZSAJIjEuLioiCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRBcnJheUNyZWF0aW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODM3MTIwMjVBIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxBcnJheSBDcmVhdGlvbiBleHByZXNzaW9uLCBlLmcuIG5ldyBpbnRbM10gb3IgbmV3IGphdmEubGFuZ1N0cmluZ1tdW10ge3siYSJ9LCB7ImIifX0KLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4MzcyMTAwNDkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM3RTkwMkJEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBmdWxseS1xdWFsaWZpZWQgdHlwZSwgZS5nLiBpbnRbXVtdIG9yIGphdmEubGFuZy5TdHJpbmdbXSwgaW5jbHVkaW5nIHRoZSBudW1iZXIgb2YgZGltZW5zaW9uIGJyYWNrZXRzLiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGltZW5zaW9ucyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4Mzg5NTAxRTgiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGxpc3Qgb2YgZXhwcmVzc2lvbnMgZm9yIHRoZSBkaW1lbnNpb25zLiBZb3UgY2FuIGhhdmUgWzNdWzRdW10gYnV0IFtdWzMzXSBpcyBpbnZhbGlkLiBTbyBmb3IgZWFjaCBkaW1lbnNpb24gdGhhdCBoYXMgYW4gZXhwcmVzc2lvbiwgdGhlcmUgd2lsbCBiZSBhbiBlbnRyeSBpbiB0aGUgbGlzdCwgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIFdoZW4geW91IHJlYWNoIHRoZSBlbXB0eSBkaW1lbnNpb25zLCB0aGUgbGlzdCB3aWxsIGVuZCB0b28uICIKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW5pdGlhbGl6ZXIiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM5N0MwMjMxIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXMgdGhlIGluaXRpYWxpemVyLCBpZiBhbnksIGZvciB0aGlzIGFycmF5LiBFLmcuIG5ldyBpbnRbXSB7MiwzfS4gSXQgaXMgdGhlIHsyLDN9LiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEFycmF5SW5pdGlhbGl6ZXIiCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODM5NjgwMTRDIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEFycmF5SW5pdGlhbGl6ZXIiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4Mzk2ODAxNEMiCi0JICAgIGRvY3VtZW50YXRpb24gCSJBcnJheSBpbml0aWFsaXphdGlvbiBleHByZXNzaW9uLiBUaGlzIGlzIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiwgZS5nLiB7MiwgM30sIG9yIHt7MiwzfSwgNH0uIEluIHRoZSBzZWNvbmQgY2FzZSwgdGhlIHsyLDN9IHdpbGwgYmUgYW4gQXJyYXlJbml0aWFsaXplciBjb250YWluZWQgd2l0aGluIHRoZSBleHByZXNzaW9ucyBsaXN0IGZvciB0aGUgdG9wIEFycmF5SW5pdGlhbGl6ZXIuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM5NzkwMDM4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHByZXNzaW9ucyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4M0E1NzAwRUIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpc3RoZSBsaXN0IG9mIGV4cHJlc3Npb25zIHdpdGhpbiB0aGUgaW5pdGlhbGl6ZXIsIGUuZy4gezIsIDN9LCBvciB7ezIsM30sIDR9LiBJbiB0aGUgZmlyc3QgY2FzZSBpdCB3aWxsIGJlIHR3byBOdW1iZXJMaXRlcmFscy4gSW4gdGhlIHNlY29uZCBjYXNlLCB0aGUgezIsM30gd2lsbCBiZSBhbiBBcnJheUluaXRpYWxpemVyLCBmb2xsb3dlZCBieSBhIE51bWJlckxpdGVyYWwuIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRCb29sZWFuTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgzQUU3MDI0NyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSBib29sZWFuIGxpdGVyYWwsIGkuZS4gdHJ1ZSBvciBmYWxzZSBkaXJlY3RseSBpbiB0aGUgY29kZS4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4M0IxRDAwMDAiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImJvb2xlYW5WYWx1ZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4M0IzRDAwMUEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHZhbHVlIG9mIHRoZSBsaXRlcmFsLiIKLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVENhc3RFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODNCNkYwMDU4IgotCSAgICBkb2N1bWVudGF0aW9uIAkiQ2FzdCBleHByZXNzaW9uLCBlLmcuIChzaG9ydCkgMTAiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4M0JENjAzMDkiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODNCOTYwMEY0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXMgdGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG9mIHRoZSBjYXN0LCBlLmcuIGludCBvciBqYXZhLmxhbmcuU3RyaW5nIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJleHByZXNzaW9uIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDgzQkI2MDMzRiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgZXhwcmVzc2lvbiBiZWluZyBjYXN0ZWQuIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUQ2hhcmFjdGVyTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg0REYxMDI3NyIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSBjaGFyYWN0ZXIgZXhwcmVzc2lvbiwgZS5nLiAnYScgb3IgJ1xccicuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODRFMTMwMUVBIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlc2NhcGVkVmFsdWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODRFMzkwMTRFIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgaXMgdGhlIGVzY2FwZWQgY2hhcmFjdGVyLiBJbiBvdGhlciB3b3JkcyB0aGUgbGl0ZXJhbCBleGFjdGx5IGFzIGl0IGlzIGluIHRoZSBqYXZhIGZpbGUuIEUuZy4gJ2EnIG9yICdcXHInLiBJbmNsdWRpbmcgdGhlIHN1cnJvdW5kaW5nIHNpbmdsZSBxdW90ZXMgdGhlbXNlbHZlcy4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNoYXJWYWx1ZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NEVCNzAyQ0MiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGFjdHVhbCBwcmltaXRpdmUgY2hhcmFjdGVyIHdpdGhvdXQgdGhlIHF1b3Rlcy4gRXNjYXBlIGFyZSBldmFsdWF0ZWQgYW5kIHR1cm5lZCBpbnRvIHRoZWlyIGNoYXJhY3RlciB2YWx1ZS4gVGhpcyBpcyBhIHRyYW5zaWVudCBmaWVsZC4gSWYgbm90IHNldCB3aGVuIGNyZWF0ZWQgd2hlbiBxdWVyaWVkIGl0IHdpbGwgY3JlYXRlIGl0LiBUeXBpY2FsbHkgaXQgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGVkIGZyb20gYW4gQVNUIG5vZGUgc2luY2UgdGhlIG5vZGUgYWxyZWFkeSBoYXMgZXZhbHVhdGVkIGl0LiIKLQkJICAgIHR5cGUgICAgICAgCSJjaGFyIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg0RjQwMDI2RiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18Q2xhc3MgaW5zdGFuY2UgY3JlYXRpb24gZXhwcmVzc2lvbi4gRS5nLiBuZXcgU3RyaW5nKCJhIikKLQkgICAgCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NEY0QzAyRjgiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInR5cGUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODRGQUQwMjk0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBpcyB0aGUgdHlwZSBvZiB0aGUgY2xhc3MuIEUuZy4gamF2YS5sYW5nLlN0cmluZy4gVGhpcyBzaG91bGQgYmUgZnVsbHktcXVhbGlmaWVkIGZvciBhbGxvY2F0aW9uIHB1cnBvc2VzLiBJdCBzaG91bGQgYWxzbyBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBpZiBYIGlzIGFuIGlubmVyIGNsYXNzIG9mIGouWSwgdGhlbiB0aGUgdHlwZSBoZXJlIHNob3VsZCBiZSAiai5ZJFgiLiAKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJhcmd1bWVudHMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUxNUUwMTM4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yLiIKLQkJICAgIHN0ZXJlb3R5cGUgCSIwLi4qIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUQ29uZGl0aW9uYWxFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODUxRkIwMjZBIgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHRlc3QgRXhwcmVzc29uLCBlLmcuICh4PTMpID8gMSA6IDIiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTI3NDAxMkUiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbmRpdGlvbiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTIxRDAyQUYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGNvbmRpdGlvbiBleHByZXNzaW9uLiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInRydWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUyNDEwMzMzIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSB0cnVlIGV4cHJlc3Npb24iCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJmYWxzZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTI1RjAyOTYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGZhbHNlIGV4cHJlc3Npb24uIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBURmllbGRBY2Nlc3MiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NTJERjAyMDQiCi0JICAgIGRvY3VtZW50YXRpb24gCSJBY2Nlc3MgYSBmaWVsZCBleHByZXNzaW9uLCBlLmcuIGphdmEuYXd0LkNvbG9yLnJlZCIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1MzVEMDI0MSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVjZWl2ZXIiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODUzMTMwMTJDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgb2JqZWN0IHRoYXQgdGhlIGZpZWxkIGlzIGluLCBlLmcuIGphdmEuYXd0LkNvbG9yLiIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImZpZWxkIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1MzQ1MDBBQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgbmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgYWNjZXNzZWQsIGUuZy4gcmVkLiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUSW5maXhFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODUzOEIwMTQzIgotCSAgICBkb2N1bWVudGF0aW9uIAkiQW4gZXhwcmVzc2lvbiB3aXRoIGFuIG9wZXJhdG9yIHRoYXQgaGFzIHR3byBvcGVyYW5kcywgZS5nLiAzICsgNC4iCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTU3MDAwMzIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxlZnRPcGVyYW5kIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1M0FDMDAwMCIKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9wZXJhdG9yIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1M0I2MDBENyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgb3BlcmF0b3IsIGUuZy4gKyIKLQkJICAgIHR5cGUgICAgICAgCSJQVEluZml4T3BlcmF0b3IiCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODUzRTEwMzU5IgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInJpZ2h0T3BlcmFuZCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTQwRDAxODYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgcmlnaHQgZXhwcmVzc2lvbi4gaS5lLiA0IG9mICIzICsgNCIKLQkJICAgIAotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXh0ZW5kZWRPcGVyYW5kcyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTUxMTAzOUMiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVXNlZCB3aGVuIHRoZXJlIGFyZSBhIHNlcmllcyBvZiBpbmZpeCBvcGVyYXRpb25zIG9mIHRoZSBzYW1lIG9wZXJhdG9yLCBlLmcuIDEgKyAyICsgMyArIDQuIDEgYW5kIDIgd2lsbCBnbyBpbnRvIGxlZnQgYW5kIHJpZ2h0LCB3aGlsZSB7MywgNH0gd2lsbCBnbyBpbnRvIHRoZSBleHRlbmRlZCBvcGVyYW5kcy4gIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRJbmZpeE9wZXJhdG9yIgotCSAgICBxdWlkICAgICAgIAkiNDAwODUzRTEwMzU5IgotCSAgICBkb2N1bWVudGF0aW9uIAkiRW51bWVyYXRvciBmb3IgdGhlIG9wZXJhdG9yIG9uIGFuIEluZml4RXhwcmVzc2lvbi4iCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiVElNRVMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2ODMwMjQwIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIiogb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiRElWSURFIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NjhFMDFFMiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSIvIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlJFTUFJTkRFUiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTY5MjAyQkEiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiJSBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJQTFVTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1Njk3MDM5RCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSIrIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk1JTlVTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NjlDMDFEOCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSItIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkxFRlRfU0hJRlQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2QjUwMjc0IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIjw8IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlJJR0hUX1NISUZUX1NJR05FRCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZCQTAwQ0QiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPj4gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiUklHSFRfU0hJRlRfVU5TSUdORUQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU2QzMwMzhEIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIj4+PiBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJMRVNTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkNDMDNDQyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI8ICBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJHUkVBVEVSIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkQ5MDAxRCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI+IG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkxFU1NfRVFVQUxTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkREMDA0QiIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI8PSBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJHUkVBVEVSX0VRVUFMUyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTZFNTAyOUIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiPj0gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiRVFVQUxTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkVDMDI3MyIKLQkJICAgIGRvY3VtZW50YXRpb24gCSI9PSBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJOT1RfRVFVQUxTIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NkY5MDM5RSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSIhPSBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJYT1IiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU3MDEwMzI4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIl4gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQU5EIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NzEyMDM0QSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSImIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIk9SIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NzA0MDJGQSIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJ8ICBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJDT05ESVRJT05BTF9BTkQiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU3MTYwMDc1IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIiYmIG9wZXJhdG9yIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIkNPTkRJVElPTkFMX09SIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1NzI2MDJCRCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJ8fCBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRJbnN0YW5jZW9mIgotCSAgICBxdWlkICAgICAgIAkiNDAwODU3RDMwM0EyIgotCSAgICBkb2N1bWVudGF0aW9uIAkiSW5zdGFuY2VvZiBleHByZXNzaW9uLCBlLmcuIHggaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODU4OTEwM0FGIgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcGVyYW5kIgotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1ODA3MDIzNCIKLQkJICAgIGRvY3VtZW50YXRpb24gCSJUaGUgdmFsdWUgdG8gdGVzdCwgZS5nLiB4IGluIHggaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nIgotCQkgICAgdHlwZSAgICAgICAJIlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NTgyQTAyMjAiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlIHRlc3QsIGUuZy4gamF2YS5sYW5nLlN0cmluZy4gSXQgbXVzdCBiZSBmdWxseS1xdWFsaWZpZWQuIElmIGl0IGlzIGFuIGlubmVyIGNsYXNzLCBpdCBuZWVkcyB0byBiZSBpbiByZWZsZWN0aW9uIGZvcm1hdCwgaS5lLiBZIGlzIGlubmVyIGNsYXNzIG9mIGouWCwgdGhlbiBhIHJlZmVyZW5jZSB0byBZIG11c3QgYmUgai5YJFkuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRNZXRob2RJbnZvY2F0aW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODU4QjYwMThCIgotCSAgICBkb2N1bWVudGF0aW9uIAkiTWV0aG9kSW52b2NhdGlvbiBleHByZXNzaW9uLCBlLmcuIHguZ2V0WSgzKSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1QjlEMDA2NyIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAicmVjZWl2ZXIiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVCMEEwMUVDIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18V2hvIHRoZSBtZXRob2QgaXMgaW52b2tlZCBhZ2FpbnN0LiBUaGlzIG1heSBiZSBub3Qgc2V0LCB3aGljaCBtZWFucyAidGhpcyIuIEl0IG1heSBhbHNvIGJlIGEgTmFtZSwgd2hpY2ggd291bGQgbWVhbiBhIGNsYXNzIGxpa2UgImphdmEubGFuZy5TdHJpbmciCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm5hbWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVCNjEwMEQ5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBuYW1lIG9mIHRoZSBtZXRob2QgYmVpbmcgaW52b2tlZC4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImFyZ3VtZW50cyIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUI2OTAyRUQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGxpc3Qgb2YgYXJndW1lbnRzLCBpZiBhbnksIHRvIHRoZSBtZXRob2QuIgotCQkgICAgc3RlcmVvdHlwZSAJIjAuLioiCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFROYW1lIgotCSAgICBxdWlkICAgICAgIAkiNDAwODU4RUEwMjgwIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGlzIHJlcHJlc2VudHMgYSBuYW1lLiBUaGlzIGNhbiBoYXBwZW4gZm9yIHRoZSByZWNlaXZlciBvZiBhIG1ldGhvZCBpbnZvY2F0aW9uLCBlLmcuIHguZ2V0WSgpIG9yIGphdmEubGFuZy5TdHJpbmcudmFsdWVPZigxMCkuIEluIHRoZXNlIGNhc2VzIHlvdSB3b3VsZCBoYXZlIGEgbmFtZSBvZiAieCIgb3IgImphdmEubGFuZy5TdHJpbmciLgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1QkExMDBEQiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibmFtZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDBDMTEwNDAxQkUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIG5hbWUsIHdoaWNoIGNhbiBiZSBhIHR5cGUgb3IgYSB2YXJpYWJsZS4gSWYgaXQgaXMgYSB0eXBlLCB0aGVuICBpdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4gSWYgaXQgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG5lZWRzIHRvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIFkgaXMgaW5uZXIgY2xhc3Mgb2Ygai5YLCB0aGVuIGEgcmVmZXJlbmNlIHRvIFkgbXVzdCBiZSBqLlgkWS4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVE51bGxMaXRlcmFsIgotCSAgICBxdWlkICAgICAgIAkiNDAwODVCQkYwMDIwIgotCSAgICBkb2N1bWVudGF0aW9uIAkKLXxSZXByZXNlbnRzIHRoZSBleHByZXNzaW9uICJudWxsIgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1QkQ0MDJGMSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFROdW1iZXJMaXRlcmFsIgotCSAgICBxdWlkICAgICAgIAkiNDAwODVDNDAwMzVCIgotCSAgICBkb2N1bWVudGF0aW9uIAkiUmVwcmVzZW50IGEgbnVtYmVyIHByaW1pdGl2ZSBsaXRlcmFsLCBlLmcuIDEwLiBPbmUgb3B0aW1pemF0aW9uIHRoYXQgd2lsbCBiZSBwZXJmb3JtZWQgaXMgdGhhdCBpZiBhbiBleHByZXNzaW9uIGlzIG9mIHRoZSBmb3JtICtudW1iZXIgb3IgLW51bWJlciwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbSBhIFByZWZpeEV4cHJlc3Npb24gd2l0aCBhIE51bWJlckxpdGVyYWwgdG8ganVzdCBhIE51bWJlckxpdGVyYWwuIFRoaXMgd2lsbCBzaW1wbGlmeSB0aGUgbW9kZWwuIgotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODVDRUYwMjQ0IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJ0b2tlbiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUNBQTAyNEYiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHRva2VuIHZhbHVlLCBlLmcuIDEwLCAxMGQsIG9yIC0xMC43NSIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NUNGOTAwN0MiCi0JICAgIGRvY3VtZW50YXRpb24gCSJBbiBleHByZXNzaW9uIHdpdGhpbiBwYXJlbnRoZXNpcywgZS5nLiAoeCszKSIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg1RjRFMDNFMSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhwcmVzc2lvbiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NUYyMjAxMkIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkKLXxUaGUgZXhwcmVzc2lvbiB3cmFwcGVkIGJ5IHRoZSBwYXJlbnRoZXNpcywgZS5nLiAoeCszKSB0aGVuIHRoZSBleHByZXNzaW9uIGlzICJ4KzMiCi0JCSAgICAKLQkJICAgIHR5cGUgICAgICAgCSJQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVFByZWZpeEV4cHJlc3Npb24iCi0JICAgIHF1aWQgICAgICAgCSI0MDA4NUZBRDAwOEIiCi0JICAgIGRvY3VtZW50YXRpb24gCQotfEEgb25lIG9wZXJhbmQgb3BlcmF0b3IsIHdoZXJlIHRoZSBvcGVyYXRvciBjb21lcyBiZWZvcmUgdGhlIG9wZXJhbmQsIGUuZy4gLSAoeCszKS4gSW4gQVNULCBldmVuIC0zIGlzIG1vZGVsZWQgYXMgYSBQcmVmaXhFeHByZXNzaW9uIG9mIG9wZXJhdG9yICItIiBhbmQgZXhwcmVzc2lvbiBvZiBOdW1iZXJMaXRlcmFsKDMpLiBCdXQgd2Ugb3B0aW1pemUgdGhpcyBhd2F5IGFuZCBqdXN0IHVzZSBhIE51bWJlckxpdGVyYWwoLTMpIGRpcmVjdGx5IGluc3RlYWQuCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYyREMwMUQ3IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJvcGVyYXRvciIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjBCQzAxOTkiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIG9wZXJhdG9yIG9mIHRoaXMgZXhwcmVzc2lvbi4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRQcmVmaXhPcGVyYXRvciIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjAyNDAwRDIiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZXhwcmVzc2lvbiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjBDNTAwNjUiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGV4cHJlc3Npb24gdGhhdCB0aGUgb3BlcmF0b3IgaXMgYXBwbGllZCB0by4iCi0JCSAgICB0eXBlICAgICAgIAkiUFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRQcmVmaXhPcGVyYXRvciIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg2MDI0MDBEMiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBwcmVmaXggZXhwcmVzc2lvbiBvcGVyYXRvci4gV2UgYXJlIG5vdCBtb2RlbGluZyArKyBhbmQgLS0uIgotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0Ci0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIlBMVVMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYwNkYwMUI2IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIisgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiTUlOVVMiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYwNzIwM0I5IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIi0gb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiQ09NUExFTUVOVCIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjA3ODAwQUIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkifiBvcGVyYXRvciIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJOT1QiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYwN0QwMTQ4IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIiEgb3BlcmF0b3IiCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUU3RyaW5nTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg2MUUyMDAwQiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18UmVwcmVzZW50YXRpb24gb2YgYSBzdHJpbmcgbGl0ZXJhbCwgZS5nLiAiYXNkZiIuCi0JICAgIAotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0Ci0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYyRDcwMzM4IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIgotCQkgICAgcXVpZHUgICAgICAJIjQwMDgyRDBBMDFDQiIpKQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdAotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJlc2NhcGVkVmFsdWUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODYxRkMwMUNCIgotCQkgICAgZG9jdW1lbnRhdGlvbiAJCi18VGhpcyBpcyB0aGUgZXNjYXBlZCBzdHJpbmcuIEluIG90aGVyIHdvcmRzIHRoZSBsaXRlcmFsIGV4YWN0bHkgYXMgaXQgaXMgaW4gdGhlIGphdmEgZmlsZS4gRS5nLiAiYWIiIG9yICJjXHIiLiBJbmNsdWRpbmcgdGhlIHN1cnJvdW5kaW5nIHF1b3RlcyB0aGVtc2VsdmVzLgotCQkgICAgCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImxpdGVyYWxWYWx1ZSIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjIwQTAwQkQiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIGFjdHVhbCBzdHJpbmcgd2l0aG91dCB0aGUgcXVvdGVzLiBFc2NhcGUgYXJlIGV2YWx1YXRlZCBhbmQgdHVybmVkIGludG8gdGhlaXIgY2hhcmFjdGVyIHZhbHVlLiBUaGlzIGlzIGEgdHJhbnNpZW50IGZpZWxkLiBJZiBub3Qgc2V0IHdoZW4gY3JlYXRlZCB3aGVuIHF1ZXJpZWQgaXQgd2lsbCBjcmVhdGUgaXQuIFR5cGljYWxseSBpdCB3aWxsIGJlIHNldCB3aGVuIGNyZWF0ZWQgZnJvbSBhbiBBU1Qgbm9kZSBzaW5jZSB0aGUgbm9kZSBhbHJlYWR5IGhhcyBldmFsdWF0ZWQgaXQuIgotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyIKLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRUaGlzTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg2M0E3MDBDQiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18UmVwcmVzZW50cyAidGhpcyIsIGUuZy4gdGhpcy5nZXRYKCkgd2lsbCBiZSBhIE1ldGhvZEludm9jYXRpb24gd2l0aCB0aGUgcmVjZWl2ZXIgYmVpbmcgYSBUaGlzTGl0ZXJhbC4gV2UgY2FuJ3QgaGFuZGxlIHRoZSBmb3JtYXQgWFlaLnRoaXMgYmVjYXVzZSB0aGF0IGlzIGZvciBpbm5lciBjbGFzc2VzIGFuZCB3ZSBkb24ndCBzdXBwb3J0IHRoYXQgcmlnaHQgbm93LgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2NDE4MDE5RiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkpCi0JKG9iamVjdCBDbGFzcyAiUFRUeXBlTGl0ZXJhbCIKLQkgICAgcXVpZCAgICAgICAJIjQwMDg2NDk1MDE4MSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoaXMgcmVwcmVzZW50cyBhIGxpdGVyYWwgb2YgdGhlIGZvcm0gai5YWVouY2xhc3MuIEZvciBpbnN0YW5jZSBpbiBhIG1ldGhvZCBpbnZvY2F0aW9uIHguZ2V0WChqWFlaLmNsYXNzKSB0aGUgYXJndW1lbnQgd2lsbCBiZSBhIFR5cGVMaXRlcmFsLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2NTRDMDAwOCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidHlwZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjRENzAzN0IiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhlIHR5cGUgb2YgdGhlIGxpdGVyYWwuICBJdCBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4gSWYgaXQgaXMgYW4gaW5uZXIgY2xhc3MsIGl0IG5lZWRzIHRvIGJlIGluIHJlZmxlY3Rpb24gZm9ybWF0LCBpLmUuIFkgaXMgaW5uZXIgY2xhc3Mgb2Ygai5YLCB0aGVuIGEgcmVmZXJlbmNlIHRvIFkgbXVzdCBiZSBqLlgkWS4iCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIgotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkKLQkob2JqZWN0IENsYXNzICJQVEludmFsaWRFeHByZXNzaW9uIgotCSAgICBxdWlkICAgICAgIAkiNDAwODY1QUYwMjA5IgotCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpcyB1c2VkIHdoZW4gd2UgaGF2ZSBzb21lIGV4cHJlc3Npb24gd2UganVzdCBjYW4ndCBldmFsdWF0ZSBmb3Igb3VyIHB1cnBvc2VzLiBJdCBhbGxvd3MgdXMgdG8gdGVsbCB0aGUgZXZhbHVhdGlvbiB3aGF0IGlzIGFjdHVhbGx5IHdyb25nLiBJdCBzaG91bGQgYmUgcGxhY2VkIGFzIHRoZSByb290IGV4cHJlc3Npb24gdG8gcHJldmVudCBwcm9jZXNzaW5nIG11Y2ggb2YgdGhlIHRyZWUgYW5kIHRoZW4gZmluYWxseSBmYWlsLiIKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQwMDg2NkY1MDI1OCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAibWVzc2FnZSIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4NjZFNDAyOTkiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiQSBtZXNzYWdlIGFzIHRvIHdoeSBpdCBpcyBpbnZhbGlkLiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQotCShvYmplY3QgQ2xhc3MgIlBUSW5zdGFuY2VSZWZlcmVuY2UiCi0JICAgIHF1aWQgICAgICAgCSI0MDE3REIxODAyQjMiCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QKLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXAKLQkJICAgIHF1aWQgICAgICAgCSI0MDE3REI0QTAzNDEiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEV4cHJlc3Npb24iCi0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIikpKQotCShvYmplY3QgQ2xhc3MgIlBUQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiIKLQkgICAgcXVpZCAgICAgICAJIjQzNjI3QzE0MDM5NiIKLQkgICAgZG9jdW1lbnRhdGlvbiAJCi18QW4gYW5vbnltb3VzIGNsYXNzIGRlY2xhcmF0aW9uLiBDdXJyZW50bHkgd2Ugb25seSBzdG9yZSB0aGUgCi18ZW50aXJlIGRlY2xhcmF0aW9uIGFzIGEgc3RyaW5nLCBpbmNsdWRpbmcgdGhlICJuZXcgQUNsYXNzKCkgey4uLn0iLgotCSAgICAKLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdAotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcAotCQkgICAgcXVpZCAgICAgICAJIjQzNjI3RDRFMDBEMCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiKSkKLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVjbGFyYXRpb24iCi0JCSAgICBxdWlkICAgICAgIAkiNDM2MjdENjkwMTQ3IgotCQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBkZWNsYXJhdGlvbiB0ZXh0LiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikKLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiaW1wb3J0cyIKLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCShvYmplY3QgQXR0cmlidXRlCi0JCQkgICAgdG9vbCAgICAgICAJIkVjb3JlIgotCQkJICAgIG5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkKLQkJICAgIHF1aWQgICAgICAgCSI0MzYyODlFNTAzNEIiCi0JCSAgICBkb2N1bWVudGF0aW9uIAkiVGhpcyBpcyB0aGUgaW1wb3J0cyBuZWVkZWQgaW4gdGhlIG1haW4gY2xhc3MgYnkgdGhpcyBkZWNsYXJhdGlvbi4gVGhpcyBpcyBhIHRyYW5zaWVudCBhdHRyaWJ1dGUuIEl0IGlzIG5vdCBzZXJpYWxpemVkLCBub3IgaXMgaXQgcGFyc2VkIGludG8gZnJvbSBleGlzdGluZyBjb2RlLiBJdHMgb25seSBwdXJwb3NlIGlzIHRvIGhlbHAgY29kZSBnZW5lcmF0aW9uIG9uIGEgYnJhbmQgbmV3IGRlY2xhcmF0aW9uIHRvIGtub3cgd2hhdCBpbXBvcnRzIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgbWFpbiBjbGFzcy4iCi0JCSAgICBzdGVyZW90eXBlIAkiMC4uKiIKLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciCi0JCSAgICBleHBvcnRDb250cm9sIAkiSW1wbGVtZW50YXRpb24iKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMCIKLQkgICAgcXVpZCAgICAgICAJIjNGRDlFRDcxMDNENSIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBwYXJlbnQgd2hvIGlzIHRvIGdpdmUgdXAgdGhlIHZhbHVlLiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicGFyZW50IgotCQkgICAgcXVpZCAgICAgICAJIjNGRDlFRDcyMDM5MCIKLQkJICAgIGxhYmVsICAgICAgCSJwYXJlbnQiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RU9iamVjdCIKLQkJICAgIHF1aWR1ICAgICAgCSIzQzRGMUM4NjAxMjMiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFJlZmVyZW5jZSIKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxIgotCQkgICAgcXVpZCAgICAgICAJIjNGRDlFRDcyMDM5QSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OkltcGxpY2l0QWxsb2NhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUMxNDAyNDIiKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMiIKLQkgICAgcXVpZCAgICAgICAJIjNGRDlFREQwMDA4OCIKLQkgICAgZG9jdW1lbnRhdGlvbiAJIlRoZSBmZWF0dXJlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHF1ZXJ5IHRoZSBsaXZlIHZhbHVlLiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZmVhdHVyZSIKLQkJICAgIHF1aWQgICAgICAgCSIzRkQ5RUREMTAxNDgiCi0JCSAgICBsYWJlbCAgICAgIAkiZmVhdHVyZSIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFU3RydWN0dXJhbEZlYXR1cmUiCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1OUQwMjMwIgotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMyIKLQkJICAgIHF1aWQgICAgICAgCSIzRkQ5RUREMTAxNTIiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJbXBsaWNpdEFsbG9jYXRpb24iCi0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVDMTQwMjQyIikpKQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDQiCi0JICAgIHF1aWQgICAgICAgCSI0MDA4MzRDRTAwMUIiCi0JICAgIGRvY3VtZW50YXRpb24gCSJUaGUgcm9vdCBleHByZXNzaW9uIG9mIHRoZSBwYXJzZSB0cmVlLiBUaGUgcmVzdWx0IG9mIGl0IGlzIHRoZSBhbGxvY2F0aW9uLiIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAiZXhwcmVzc2lvbiIKLQkJICAgIHF1aWQgICAgICAgCSI0MDA4MzRDRjAyRTQiCi0JCSAgICBsYWJlbCAgICAgIAkiZXhwcmVzc2lvbiIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDUiCi0JCSAgICBxdWlkICAgICAgIAkiNDAwODM0Q0YwMkU2IgotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UGFyc2VUcmVlQWxsb2NhdGlvbiIKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkM5MTAwMDUiCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIgotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKSkpCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiIKLQkgICAgcXVpZCAgICAgICAJIjQwMTdEQkUzMDEzOCIKLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0Ci0JCShvYmplY3QgUm9sZSAicmVmZXJlbmNlIgotCQkgICAgcXVpZCAgICAgICAJIjQwMTdEQkU2MDAwNiIKLQkJICAgIGxhYmVsICAgICAgCSJyZWZlcmVuY2UiCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJSmF2YUluc3RhbmNlIgotCQkgICAgcXVpZHUgICAgICAJIjNFNTE1NzVBMDJENCIKLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikKLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkKLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ3IgotCQkgICAgcXVpZCAgICAgICAJIjQwMTdEQkU2MDE2NCIKLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUSW5zdGFuY2VSZWZlcmVuY2UiCi0JCSAgICBxdWlkdSAgICAgIAkiNDAxN0RCMTgwMkIzIgotCQkgICAgQ29udGFpbm1lbnQgCSJCeSBSZWZlcmVuY2UiKSkpKQotICAgIGxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCShvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIgotCSAgICBxdWlkICAgICAgIAkiM0I3ODJEMUIwMzRGIgotCSAgICB0aXRsZSAgICAgIAkiTWFpbiIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IE5vdGVWaWV3IEAxCi0JCSAgICBsb2NhdGlvbiAgIAkoNzQ3LCAxMDA4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxCi0JCQlsb2NhdGlvbiAgIAkoMzQyLCA4NTQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJNgotCQkJbWF4X3dpZHRoICAJNzc1Ci0JCQlsYWJlbCAgICAgIAkiVGhpcyBpcyB1c2VkIGFzIHRoZSBFQ2xhc3NpZmllciB3aGVuIHlvdSB3YW50IGEgY29kZS1nZW5lcmF0ZWQgY2xhc3MgdG8gcG9pbnQgdG8gYW4gaW5zdGFuY2Ugb2YgYSBJSmF2YU9iamVjdEluc3RhbmNlIGltcGxlbWVudGVyLiAoV2hpY2ggaXMgYW4gaW5zdGFuY2Ugb2YgYSBqYXZhIG1vZGVsIGphdmEgb2JqZWN0KS4iKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHdpZHRoICAgICAgCTgzNQotCQkgICAgaGVpZ2h0ICAgICAJMzIwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OklKYXZhRGF0YVR5cGVJbnN0YW5jZSIgQDIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjY1OSwgNjY0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAyCi0JCQlsb2NhdGlvbiAgIAkoMTc3NywgNjA1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTE3NjQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJSmF2YURhdGFUeXBlSW5zdGFuY2UiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMgotCQkJbG9jYXRpb24gICAJKDE3NzcsIDU1NSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTc2NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0I4QUIxNzgwMkIxIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAMgotCQkJbG9jYXRpb24gICAJKDE3NzcsIDY2NikKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkxNTEyKQotCQkgICAgd2lkdGggICAgICAJMTc4MgotCQkgICAgaGVpZ2h0ICAgICAJMjQyCi0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IE5vdGVWaWV3IEAzCi0JCSAgICBsb2NhdGlvbiAgIAkoMjM3OCwgMTA1MykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMwotCQkJbG9jYXRpb24gICAJKDE5NzAsIDg4OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAk3Ci0JCQltYXhfd2lkdGggIAk3ODAKLQkJCWxhYmVsICAgICAgCSJUaGlzIGlzIHVzZWQgYXMgdGhlIEVDbGFzc2lmaWVyIHdoZW4geW91IHdhbnQgYSBjb2RlLWdlbmVyYXRlZCBjbGFzcyB0byBwb2ludCB0byBhbiBpbnN0YW5jZSBvZiBhbiBJSmF2YURhdGFUeXBlSW5zdGFuY2UgaW1wbGVtZW50ZXIuIChXaGljaCBpcyBhbiBpbnN0YW5jZSBvZiBhIGphdmEgbW9kZWwgamF2YSBwcmltaXRpdmUpLiIpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgd2lkdGggICAgICAJODQwCi0JCSAgICBoZWlnaHQgICAgIAkzNDApCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBANAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgY2xpZW50ICAgICAJQDIKLQkJICAgIHN1cHBsaWVyICAgCUAzCi0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OklKYXZhSW5zdGFuY2UiIEA1Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE1ODQsIDE2NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANQotCQkJbG9jYXRpb24gICAJKDgwNCwgODUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMTU2MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklKYXZhSW5zdGFuY2UiKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJOb25lIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUxNTc1QTAyRDQiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA1Ci0JCQlsb2NhdGlvbiAgIAkoODA0LCAxNDYpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMTM0MCkKLQkJICAgIHdpZHRoICAgICAgCTE1NzgKLQkJICAgIGhlaWdodCAgICAgCTE4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDYKLQkJICAgIGxvY2F0aW9uICAgCSgxNTg0LCA0NTUpCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDUKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDE1ODQsIDQ1NSkKLQkJCSgxNTg0LCAyNTkpKSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpJSmF2YU9iamVjdEluc3RhbmNlIiBANwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIFNob3dPcGVyYXRpb25TaWduYXR1cmUgCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg4NTgsIDY2NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANwotCQkJbG9jYXRpb24gICAJKDYyNywgNjE0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ4MAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIklKYXZhT2JqZWN0SW5zdGFuY2UiKQotCQkgICAgc3RlcmVvdHlwZSAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANwotCQkJbG9jYXRpb24gICAJKDYyNywgNTY0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NjIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PEludGVyZmFjZT4+IikKLQkJICAgIGljb24gICAgICAgCSJJbnRlcmZhY2UiCi0JCSAgICBpY29uX3N0eWxlIAkiTGFiZWwiCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNCNzgyRDc5MDI5NiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDcKLQkJCWxvY2F0aW9uICAgCSg2MjcsIDY3NSkKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTE2Nzc3MjE1Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkxNDU5KQotCQkgICAgd2lkdGggICAgICAJNDgwCi0JCSAgICBoZWlnaHQgICAgIAkyMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQXR0YWNoVmlldyAiIiBAOAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgY2xpZW50ICAgICAJQDEKLQkJICAgIHN1cHBsaWVyICAgCUA3Ci0JCSAgICBsaW5lX3N0eWxlIAkwKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U1MTU3REEwM0REIgotCQkgICAgY2xpZW50ICAgICAJQDcKLQkJICAgIHN1cHBsaWVyICAgCUA1Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc5NSwgNTUyKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDc5NSwgNDU1KQotCQkgICAgZHJhd1N1cHBsaWVyIAlANikKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTAKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRTUyOTU2MjAxNEUiCi0JCSAgICBjbGllbnQgICAgIAlAMgotCQkgICAgc3VwcGxpZXIgICAJQDUKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjY1OSwgNTQzKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2NTksIDQ1NSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDYpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiSmF2YSBDb25zdHJ1Y3RvcnMiCi0JICAgIHF1aWQgICAgICAgCSIzRkQ5RTY2RDAwN0YiCi0JICAgIHRpdGxlICAgICAgCSJKYXZhIENvbnN0cnVjdG9ycyIKLQkgICAgem9vbSAgICAgICAJMTAwCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwCi0JICAgIG1heF93aWR0aCAgCTIxNjAwCi0JICAgIG9yaWdpbl94ICAgCTAKLQkgICAgb3JpZ2luX3kgICAJMAotCSAgICBpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdAotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OkphdmFBbGxvY2F0aW9uIiBAMTEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTA3MywgMTIwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDExCi0JCQlsb2NhdGlvbiAgIAkoOTAyLCA2OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzNDIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJKYXZhQWxsb2NhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUU2OTAwMDYxIgotCQkgICAgd2lkdGggICAgICAJMzYwCi0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SW5pdFN0cmluZ0FsbG9jYXRpb24iIEAxMgotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg1NTMsIDQ5NSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMTIKLQkJCWxvY2F0aW9uICAgCSgzMjksIDQxNCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0NDgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbml0U3RyaW5nQWxsb2NhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0ZEOUVBRjkwMDFFIgotCQkgICAgd2lkdGggICAgICAJNDY2Ci0JCSAgICBoZWlnaHQgICAgIAkxODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEAxMwotCQkgICAgbG9jYXRpb24gICAJKDEwNzMsIDMyMykKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMTEKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDEwNzMsIDMyMykKLQkJCSgxMDczLCAxODMpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUI3NTAyREEiCi0JCSAgICBjbGllbnQgICAgIAlAMTIKLQkJICAgIHN1cHBsaWVyICAgCUAxMQotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg2NjgsIDQwMSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NjgsIDMyMykKLQkJICAgIGRyYXdTdXBwbGllciAJQDEzKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjpFT2JqZWN0IiBAMTUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTc1MSwgOTQyKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNQotCQkJbG9jYXRpb24gICAJKDE2NDUsIDg5NikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkyMTIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJFT2JqZWN0IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzY5NjAKLQkJICAgIHF1aWR1ICAgICAgCSIzQzRGMUM4NjAxMjMiCi0JCSAgICB3aWR0aCAgICAgIAkyMzAKLQkJICAgIGhlaWdodCAgICAgCTExNwotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RVN0cnVjdHVyYWxGZWF0dXJlIiBAMTYKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE0MiwgOTI3KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDE2Ci0JCQlsb2NhdGlvbiAgIAkoMTkxOCwgODgxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTQ0OAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIkVTdHJ1Y3R1cmFsRmVhdHVyZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc2OTYwCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1OUQwMjMwIgotCQkgICAgd2lkdGggICAgICAJNDY2Ci0JCSAgICBoZWlnaHQgICAgIAkxMTcKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6SW1wbGljaXRBbGxvY2F0aW9uIiBAMTcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjAxOCwgNTEwKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAxNwotCQkJbG9jYXRpb24gICAJKDE4MTksIDQ1OCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzOTgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJJbXBsaWNpdEFsbG9jYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFQzE0MDI0MiIKLQkJICAgIHdpZHRoICAgICAgCTQxNgotCQkgICAgaGVpZ2h0ICAgICAJMTI4Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxOAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFQzQ3MDBFNyIKLQkJICAgIGNsaWVudCAgICAgCUAxNwotCQkgICAgc3VwcGxpZXIgICAJQDExCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIwMjMsIDQ0NikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMDIzLCAzMjMpCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAxMykKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDAiIEAxOQotCQkgICAgbG9jYXRpb24gICAJKDE4ODEsIDcyOCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjNGRDlFRDcxMDNENSIKLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cwotCQkJKG9iamVjdCBSb2xlVmlldyAicGFyZW50IiBAMjAKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Ci0JCQkgICAgbG9jYXRpb24gICAJKDcxNiwgMjI4KQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCXNpemUgICAgICAgCTEwCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQkJY29sb3IgICAgICAJMAotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMjEKLQkJCQlQYXJlbnRfVmlldyAJQDIwCi0JCQkJbG9jYXRpb24gICAJKDE3MjcsIDg0NCkKLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQkJYW5jaG9yICAgICAJMQotCQkJCWFuY2hvcl9sb2MgCTEKLQkJCQlubGluZXMgICAgIAkxCi0JCQkJbWF4X3dpZHRoICAJMTM3Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIrcGFyZW50IgotCQkJCXBjdERpc3QgICAgCTAuOTkxMjI0Ci0JCQkJaGVpZ2h0ICAgICAJNzIKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUQ3MjAzOTAiCi0JCQkgICAgY2xpZW50ICAgICAJQDE5Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE1Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDIyCi0JCQkJUGFyZW50X1ZpZXcgCUAyMAotCQkJCWxvY2F0aW9uICAgCSgxODcxLCA3OTQpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuMzM3ODE3Ci0JCQkJaGVpZ2h0ICAgICAJMjYKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxIiBAMjMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDE5Ci0JCQkgICAgbG9jYXRpb24gICAJKDcxNiwgMjI4KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGRDlFRDcyMDM5QSIKLQkJCSAgICBjbGllbnQgICAgIAlAMTkKLQkJCSAgICBzdXBwbGllciAgIAlAMTcKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQyIiBAMjQKLQkJICAgIGxvY2F0aW9uICAgCSgyMDgwLCA3MjEpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUREMDAwODgiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgImZlYXR1cmUiIEAyNQotCQkJICAgIFBhcmVudF9WaWV3IAlAMjQKLQkJCSAgICBsb2NhdGlvbiAgIAkoOTE1LCAyMjEpCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAyNgotCQkJCVBhcmVudF9WaWV3IAlAMjUKLQkJCQlsb2NhdGlvbiAgIAkoMjAyOCwgNzY2KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNTkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitmZWF0dXJlIgotCQkJCXBjdERpc3QgICAgCTAuMTgxMzQ2Ci0JCQkJaGVpZ2h0ICAgICAJNjQKLQkJCQlvcmllbnRhdGlvbiAJMSkKLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJICAgIHF1aWR1ICAgICAgCSIzRkQ5RUREMTAxNDgiCi0JCQkgICAgY2xpZW50ICAgICAJQDI0Ci0JCQkgICAgc3VwcGxpZXIgICAJQDE2Ci0JCQkgICAgbGluZV9zdHlsZSAJMAotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDI3Ci0JCQkJUGFyZW50X1ZpZXcgCUAyNQotCQkJCWxvY2F0aW9uICAgCSgyMTcyLCA4MzkpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQzIiBAMjgKLQkJCSAgICBQYXJlbnRfVmlldyAJQDI0Ci0JCQkgICAgbG9jYXRpb24gICAJKDkxNSwgMjIxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjNGRDlFREQxMDE1MiIKLQkJCSAgICBjbGllbnQgICAgIAlAMjQKLQkJCSAgICBzdXBwbGllciAgIAlAMTcKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIiBAMjkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI2NCwgNzc2KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDI5Ci0JCQlsb2NhdGlvbiAgIAkoMTA5NSwgNzI1KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBURXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjE1OTM1Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgd2lkdGggICAgICAJMzU2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UGFyc2VUcmVlQWxsb2NhdGlvbiIgQDMwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyNjUsIDQ5NSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzAKLQkJCWxvY2F0aW9uICAgCSgxMDMyLCA0NDMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNDY2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUGFyc2VUcmVlQWxsb2NhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJDOTEwMDA1IgotCQkgICAgd2lkdGggICAgICAJNDg0Ci0JCSAgICBoZWlnaHQgICAgIAkxMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDMxCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJDQjcwMUQ2IgotCQkgICAgY2xpZW50ICAgICAJQDMwCi0JCSAgICBzdXBwbGllciAgIAlAMTEKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI2NSwgNDMxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjUsIDMyMykKLQkJICAgIGRyYXdTdXBwbGllciAJQDEzKQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkNCIgQDMyCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI2NCwgNjM1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODM0Q0UwMDFCIgotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJleHByZXNzaW9uIiBAMzMKLQkJCSAgICBQYXJlbnRfVmlldyAJQDMyCi0JCQkgICAgbG9jYXRpb24gICAJKC0xLCAxNDApCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJc2l6ZSAgICAgICAJMTAKLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCQljb2xvciAgICAgIAkwCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNAotCQkJCVBhcmVudF9WaWV3IAlAMzMKLQkJCQlsb2NhdGlvbiAgIAkoMTExMSwgNjcyKQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkyMjAKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIitleHByZXNzaW9uIgotCQkJCXBjdERpc3QgICAgCTAuNDkyNTM3Ci0JCQkJaGVpZ2h0ICAgICAJMTU0Ci0JCQkJb3JpZW50YXRpb24gCTEpCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJCSAgICBxdWlkdSAgICAgIAkiNDAwODM0Q0YwMkU0IgotCQkJICAgIGNsaWVudCAgICAgCUAzMgotCQkJICAgIHN1cHBsaWVyICAgCUAyOQotCQkJICAgIGxpbmVfc3R5bGUgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAzNQotCQkJCVBhcmVudF9WaWV3IAlAMzMKLQkJCQlsb2NhdGlvbiAgIAkoMTMwNywgNjc5KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkyCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxNQotCQkJCWp1c3RpZnkgICAgCTAKLQkJCQlsYWJlbCAgICAgIAkiMSIKLQkJCQlwY3REaXN0ICAgIAkwLjU2NzE2NAotCQkJCWhlaWdodCAgICAgCTQzCi0JCQkJb3JpZW50YXRpb24gCTApKQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkNSIgQDM2Ci0JCQkgICAgUGFyZW50X1ZpZXcgCUAzMgotCQkJICAgIGxvY2F0aW9uICAgCSgtMSwgMTQwKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQwMDgzNENGMDJFNiIKLQkJCSAgICBjbGllbnQgICAgIAlAMzIKLQkJCSAgICBzdXBwbGllciAgIAlAMzAKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpKSkKLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiUGFyc2UgVHJlZSBFeHByZXNzaW9ucyIKLQkgICAgcXVpZCAgICAgICAJIjQwMDgyQ0MyMDE0NiIKLQkgICAgdGl0bGUgICAgICAJIlBhcnNlIFRyZWUgRXhwcmVzc2lvbnMiCi0JICAgIHpvb20gICAgICAgCTEwMAotCSAgICBtYXhfaGVpZ2h0IAkyODM1MAotCSAgICBtYXhfd2lkdGggIAkyMTYwMAotCSAgICBvcmlnaW5feCAgIAkyNQotCSAgICBvcmlnaW5feSAgIAk1NzY4Ci0JICAgIGl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0Ci0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIiBAMzcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM0OCwgMTI0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCVRSVUUKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDM3Ci0JCQlsb2NhdGlvbiAgIAkoMTE3OSwgNzMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzM4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICB3aWR0aCAgICAgIAkzNTYKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEFycmF5QWNjZXNzIiBAMzgKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMjIzNSwgNTQ0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUAzOAotCQkJbG9jYXRpb24gICAJKDE4NDgsIDQxMykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk3NzQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEFycmF5QWNjZXNzIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkUxNDAyNTAiCi0JCSAgICB3aWR0aCAgICAgIAk3OTIKLQkJICAgIGhlaWdodCAgICAgCTI4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEFycmF5Q3JlYXRpb24iIEAzOQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg0MzQsIDUxOSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAMzkKLQkJCWxvY2F0aW9uICAgCSg5LCAzNjMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJODUwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRBcnJheUNyZWF0aW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MzcxMjAyNUEiCi0JCSAgICB3aWR0aCAgICAgIAk4NjgKLQkJICAgIGhlaWdodCAgICAgCTMzNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEFycmF5SW5pdGlhbGl6ZXIiIEA0MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMzYxLCA1MTkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQwCi0JCQlsb2NhdGlvbiAgIAkoOTI5LCA0MzgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJODY0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRBcnJheUluaXRpYWxpemVyIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4Mzk2ODAxNEMiCi0JCSAgICB3aWR0aCAgICAgIAk4ODIKLQkJICAgIGhlaWdodCAgICAgCTE4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEJvb2xlYW5MaXRlcmFsIiBANDEKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoOTk3LCA4NzApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDQxCi0JCQlsb2NhdGlvbiAgIAkoNzE5LCA3OTApCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNTU2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRCb29sZWFuTGl0ZXJhbCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODNBRTcwMjQ3IgotCQkgICAgd2lkdGggICAgICAJNTc0Ci0JCSAgICBoZWlnaHQgICAgIAkxODQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRDYXN0RXhwcmVzc2lvbiIgQDQyCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3OTEsIDg4OSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDIKLQkJCWxvY2F0aW9uICAgCSgxNDc0LCA3NTgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNjM0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRDYXN0RXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODNCNkYwMDU4IgotCQkgICAgd2lkdGggICAgICAJNjUyCi0JCSAgICBoZWlnaHQgICAgIAkyODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA0MwotCQkgICAgbG9jYXRpb24gICAJKDEzNDgsIDMzMCkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlAMzcKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDEzNDgsIDMzMCkKLQkJCSgxMzQ4LCAxODcpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDQKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4Mzk3OTAwMzgiCi0JCSAgICBjbGllbnQgICAgIAlANDAKLQkJICAgIHN1cHBsaWVyICAgCUAzNwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzgxLCA0MjUpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTM4MSwgMzMwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDMpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ1Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODNCMUQwMDAwIgotCQkgICAgY2xpZW50ICAgICAJQDQxCi0JCSAgICBzdXBwbGllciAgIAlAMzcKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoOTE4LCA3NzgpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTE4LCAzMzApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA0MykKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDYKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4M0JENjAzMDkiCi0JCSAgICBjbGllbnQgICAgIAlANDIKLQkJICAgIHN1cHBsaWVyICAgCUAzNwotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNzkxLCA3NDYpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc5MSwgMzMwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDMpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ3Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJFNkYwMUY3IgotCQkgICAgY2xpZW50ICAgICAJQDM4Ci0JCSAgICBzdXBwbGllciAgIAlAMzcKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjIzNSwgNDAxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIyMzUsIDMzMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDQzKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURXhwcmVzc2lvbiIgQDQ4Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEzNzIsIDEwOTUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJVFJVRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANDgKLQkJCWxvY2F0aW9uICAgCSgxMjAzLCAxMDQ0KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMzOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBURXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEyNjE1OTM1Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODJEMEEwMUNCIgotCQkgICAgd2lkdGggICAgICAJMzU2Ci0JCSAgICBoZWlnaHQgICAgIAkxMjYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRDaGFyYWN0ZXJMaXRlcmFsIiBANDkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoNDMwLCAxNDM4KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA0OQotCQkJbG9jYXRpb24gICAJKDE2NCwgMTMzMikKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk1MzIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVENoYXJhY3RlckxpdGVyYWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg0REYxMDI3NyIKLQkJICAgIHdpZHRoICAgICAgCTU1MAotCQkgICAgaGVpZ2h0ICAgICAJMjM2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1MAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDgzNzIxMDA0OSIKLQkJICAgIGNsaWVudCAgICAgCUAzOQotCQkgICAgc3VwcGxpZXIgICAJQDM3Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDU2MSwgMzUxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDU2MSwgMzMwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANDMpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRDbGFzc0luc3RhbmNlQ3JlYXRpb24iIEA1MQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxMzQ2LCAxNDY0KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1MQotCQkJbG9jYXRpb24gICAJKDkzMCwgMTMzMykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAk4MzIKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVENsYXNzSW5zdGFuY2VDcmVhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODRGNDAwMjZGIgotCQkgICAgd2lkdGggICAgICAJODUwCi0JCSAgICBoZWlnaHQgICAgIAkyODYKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1MgotCQkgICAgbG9jYXRpb24gICAJKDEzNzIsIDEyNjApCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMKLQkJCSgxMzcyLCAxMjYwKQotCQkJKDEzNzIsIDExNTgpKSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTMKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NEUxMzAxRUEiCi0JCSAgICBjbGllbnQgICAgIAlANDkKLQkJICAgIHN1cHBsaWVyICAgCUA0OAotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg1NjQsIDEzMTkpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNTY0LCAxMjYwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANTIpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDU0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODRGNEMwMkY4IgotCQkgICAgY2xpZW50ICAgICAJQDUxCi0JCSAgICBzdXBwbGllciAgIAlANDgKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI2NywgMTMyMCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxMjY3LCAxMjYwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANTIpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRDb25kaXRpb25hbEV4cHJlc3Npb24iIEA1NQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMTY5LCAxNDgxKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA1NQotCQkJbG9jYXRpb24gICAJKDE4NzIsIDEzMjUpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTk0Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRDb25kaXRpb25hbEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1MUZCMDI2QSIKLQkJICAgIHdpZHRoICAgICAgCTYxMgotCQkgICAgaGVpZ2h0ICAgICAJMzM2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1NgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1Mjc0MDEyRSIKLQkJICAgIGNsaWVudCAgICAgCUA1NQotCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIxNjgsIDEzMTMpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE2OCwgMTI2MCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDUyKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBURmllbGRBY2Nlc3MiIEA1NwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg3NjEsIDE3OTQpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDU3Ci0JCQlsb2NhdGlvbiAgIAkoNDc5LCAxNjYzKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTU2NAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBURmllbGRBY2Nlc3MiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1MkRGMDIwNCIKLQkJICAgIHdpZHRoICAgICAgCTU4MgotCQkgICAgaGVpZ2h0ICAgICAJMjg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1OAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1MzVEMDI0MSIKLQkJICAgIGNsaWVudCAgICAgCUA1NwotCQkgICAgc3VwcGxpZXIgICAJQDQ4Ci0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDc2MCwgMTY1MSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3NjAsIDEyNjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1MikKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEluZml4RXhwcmVzc2lvbiIgQDU5Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDE3OTAsIDE4NDUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDU5Ci0JCQlsb2NhdGlvbiAgIAkoMTI4NiwgMTY2NCkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkyCi0JCQltYXhfd2lkdGggIAkxMDA4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRJbmZpeEV4cHJlc3Npb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1MzhCMDE0MyIKLQkJICAgIHdpZHRoICAgICAgCTEwMjYKLQkJICAgIGhlaWdodCAgICAgCTM4NgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEluZml4T3BlcmF0b3IiIEA2MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyNjYwLCAyMjA3KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2MAotCQkJbG9jYXRpb24gICAJKDIzNDUsIDE2OTkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjMwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRJbmZpeE9wZXJhdG9yIikKLQkJICAgIHN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDYwCi0JCQlsb2NhdGlvbiAgIAkoMjM0NSwgMTY0OSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkxMAotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJNjMwCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiPDxlbnVtZXJhdGlvbj4+IikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTNFMTAzNTkiCi0JCSAgICB3aWR0aCAgICAgIAk2NDgKLQkJICAgIGhlaWdodCAgICAgCTExNDAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDYxCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODU1NzAwMDMyIgotCQkgICAgY2xpZW50ICAgICAJQDU5Ci0JCSAgICBzdXBwbGllciAgIAlANDgKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTc4OSwgMTY1MikKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzg5LCAxMjYwKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANTIpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIiBANjIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI3MiwgMjg1MykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA2MgotCQkJbG9jYXRpb24gICAJKDExMDMsIDI4MDIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzM4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTI2MTU5MzUKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICB3aWR0aCAgICAgIAkzNTYKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVEluc3RhbmNlb2YiIEA2MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgzNzEsIDMyNTUpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDYzCi0JCQlsb2NhdGlvbiAgIAkoODUsIDMxMjQpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTcyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRJbnN0YW5jZW9mIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NTdEMzAzQTIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA2MwotCQkJbG9jYXRpb24gICAJKDg1LCAzMTg1KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTMKLQkJCW1heF93aWR0aCAgCTQ5MykKLQkJICAgIHdpZHRoICAgICAgCTU5MAotCQkgICAgaGVpZ2h0ICAgICAJMjg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUTWV0aG9kSW52b2NhdGlvbiIgQDY0Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDEyNDYsIDMyNTgpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDY0Ci0JCQlsb2NhdGlvbiAgIAkoODYwLCAzMTE3KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTc3MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUTWV0aG9kSW52b2NhdGlvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODU4QjYwMThCIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANjQKLQkJCWxvY2F0aW9uICAgCSg4NjAsIDMxNzgpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNAotCQkJbWF4X3dpZHRoICAJNzE1KQotCQkgICAgd2lkdGggICAgICAJNzkwCi0JCSAgICBoZWlnaHQgICAgIAkzMDQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFROYW1lIiBANjUKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTk2MiwgMzIxMikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANjUKLQkJCWxvY2F0aW9uICAgCSgxODA5LCAzMTIxKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMwNwotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUTmFtZSIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODU4RUEwMjgwIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANjUKLQkJCWxvY2F0aW9uICAgCSgxODA5LCAzMTgyKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTMwMykKLQkJICAgIHdpZHRoICAgICAgCTMyNQotCQkgICAgaGVpZ2h0ICAgICAJMjA1Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjYKLQkJICAgIGxvY2F0aW9uICAgCSgxMjcyLCAzMDYxKQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHN1cHBsaWVyICAgCUA2MgotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzCi0JCQkoMTI3MiwgMzA2MSkKLQkJCSgxMjcyLCAyOTE2KSkpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDY3Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODU4OTEwM0FGIgotCQkgICAgY2xpZW50ICAgICAJQDYzCi0JCSAgICBzdXBwbGllciAgIAlANjIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNDc0LCAzMTEyKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ3NCwgMzA2MSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDY2KQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1QjlEMDA2NyIKLQkJICAgIGNsaWVudCAgICAgCUA2NAotCQkgICAgc3VwcGxpZXIgICAJQDYyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyNDUsIDMxMDYpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI0NSwgMzA2MSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDY2KQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA2OQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1QkExMDBEQiIKLQkJICAgIGNsaWVudCAgICAgCUA2NQotCQkgICAgc3VwcGxpZXIgICAJQDYyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5MDUsIDMxMTApCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkwNSwgMzA2MSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDY2KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUTnVsbExpdGVyYWwiIEA3MAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMzI4LCAzMTk1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3MAotCQkJbG9jYXRpb24gICAJKDIxNzAsIDMxNDMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzE2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFROdWxsTGl0ZXJhbCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODVCQkYwMDIwIgotCQkgICAgd2lkdGggICAgICAJMzM0Ci0JCSAgICBoZWlnaHQgICAgIAkxMjgKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcxCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODVCRDQwMkYxIgotCQkgICAgY2xpZW50ICAgICAJQDcwCi0JCSAgICBzdXBwbGllciAgIAlANjIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjI5NywgMzEzMSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMjk3LCAzMDYxKQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjYpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRFeHByZXNzaW9uIiBANzIKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI0MywgMzg2NykKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlUUlVFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3MgotCQkJbG9jYXRpb24gICAJKDEwNzQsIDM4MTYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzM4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRFeHByZXNzaW9uIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTI2MTU5MzUKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4MkQwQTAxQ0IiCi0JCSAgICB3aWR0aCAgICAgIAkzNTYKLQkJICAgIGhlaWdodCAgICAgCTEyNgotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVE51bWJlckxpdGVyYWwiIEA3MwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSg4MDIsIDM1ODMpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDczCi0JCQlsb2NhdGlvbiAgIAkoNjE5LCAzNDg5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTM2NwotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUTnVtYmVyTGl0ZXJhbCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODVDNDAwMzVCIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANzMKLQkJCWxvY2F0aW9uICAgCSg2MTksIDM1NTApCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJMzAzKQotCQkgICAgd2lkdGggICAgICAJMzg1Ci0JCSAgICBoZWlnaHQgICAgIAkyMTAKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDc0Ci0JCSAgICBzdGVyZW90eXBlIAlUUlVFCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODVDRUYwMjQ0IgotCQkgICAgY2xpZW50ICAgICAJQDczCi0JCSAgICBzdXBwbGllciAgIAlANjIKLQkJICAgIGxpbmVfc3R5bGUgCTMKLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNzMwLCAzNDc4KQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDczMCwgMzA2MSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDY2KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUUGFyZW50aGVzaXplZEV4cHJlc3Npb24iIEA3NQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNjc5LCAzNjA5KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3NQotCQkJbG9jYXRpb24gICAJKDEzODEsIDM1MTMpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMgotCQkJbWF4X3dpZHRoICAJNTk2Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODVDRjkwMDdDIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANzUKLQkJCWxvY2F0aW9uICAgCSgxMzgxLCAzNTc0KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTU0NikKLQkJICAgIHdpZHRoICAgICAgCTYxNAotCQkgICAgaGVpZ2h0ICAgICAJMjE0Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA3NgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg1RjRFMDNFMSIKLQkJICAgIGNsaWVudCAgICAgCUA3NQotCQkgICAgc3VwcGxpZXIgICAJQDYyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2NzcsIDM1MDIpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY3NywgMzA2MSkKLQkJICAgIGRyYXdTdXBwbGllciAJQDY2KQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUUHJlZml4RXhwcmVzc2lvbiIgQDc3Ci0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDMzMCwgNDIyMSkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzcKLQkJCWxvY2F0aW9uICAgCSg5LCA0MDkwKQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTY0MgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUUHJlZml4RXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODVGQUQwMDhCIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlANzcKLQkJCWxvY2F0aW9uICAgCSg5LCA0MTUxKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTMKLQkJCW1heF93aWR0aCAgCTU1MykKLQkJICAgIHdpZHRoICAgICAgCTY2MAotCQkgICAgaGVpZ2h0ICAgICAJMjg2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUUHJlZml4T3BlcmF0b3IiIEA3OAotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMzMsIDQ2MDIpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDc4Ci0JCQlsb2NhdGlvbiAgIAkoMzQsIDQ0NjgpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzk4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRQcmVmaXhPcGVyYXRvciIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA3OAotCQkJbG9jYXRpb24gICAJKDM0LCA0NDE4KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTEwCi0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAkzOTgKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSI8PGVudW1lcmF0aW9uPj4iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2MDI0MDBEMiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDc4Ci0JCQlsb2NhdGlvbiAgIAkoMzQsIDQ1MjkpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQotCQkJYW5jaG9yICAgICAJMgotCQkJbmxpbmVzICAgICAJNQotCQkJbWF4X3dpZHRoICAJMzQzKQotCQkgICAgd2lkdGggICAgICAJNDE2Ci0JCSAgICBoZWlnaHQgICAgIAkzOTIKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRTdHJpbmdMaXRlcmFsIiBANzkKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTAyNSwgNDE5NikKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlANzkKLQkJCWxvY2F0aW9uICAgCSg4NDksIDQwOTIpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzUyCi0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRTdHJpbmdMaXRlcmFsIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDA4NjFFMjAwMEIiCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudAotCQkJUGFyZW50X1ZpZXcgCUA3OQotCQkJbG9jYXRpb24gICAJKDg0OSwgNDE1MykKLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIgotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkgICAgY29sb3IgICAgICAJMAotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCQlpY29uX3N0eWxlIAkiSWNvbiIKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlhbmNob3IgICAgIAkyCi0JCQlubGluZXMgICAgIAkzCi0JCQltYXhfd2lkdGggIAk0NTkpCi0JCSAgICB3aWR0aCAgICAgIAkzNzAKLQkJICAgIGhlaWdodCAgICAgCTIzMAotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDgwCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI0MywgNDAyMCkKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBzdXBwbGllciAgIAlANzIKLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cwotCQkJKDEyNDMsIDQwMjApCi0JCQkoMTI0MywgMzkzMCkpKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4MQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2MkQ3MDMzOCIKLQkJICAgIGNsaWVudCAgICAgCUA3OQotCQkgICAgc3VwcGxpZXIgICAJQDcyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwMDgsIDQwODEpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTAwOCwgNDAyMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDgwKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4MgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2MkRDMDFENyIKLQkJICAgIGNsaWVudCAgICAgCUA3NwotCQkgICAgc3VwcGxpZXIgICAJQDcyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI5NywgNDA3OCkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyOTcsIDQwMjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MCkKLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjppbnN0YW50aWF0aW9uOjpQVFRoaXNMaXRlcmFsIiBAODMKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoMTY1NSwgNDE4MCkKLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJc2l6ZSAgICAgICAJMTAKLQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCWJvbGQgICAgICAgCUZBTFNFCi0JCQlpdGFsaWNzICAgIAlGQUxTRQotCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCXN0cmlrZSAgICAgCUZBTFNFCi0JCQljb2xvciAgICAgIAkwCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCVBhcmVudF9WaWV3IAlAODMKLQkJCWxvY2F0aW9uICAgCSgxNDk0LCA0MTI5KQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyMgotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIlBUVGhpc0xpdGVyYWwiKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2M0E3MDBDQiIKLQkJICAgIHdpZHRoICAgICAgCTM0MAotCQkgICAgaGVpZ2h0ICAgICAJMTI2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2NDE4MDE5RiIKLQkJICAgIGNsaWVudCAgICAgCUA4MwotCQkgICAgc3VwcGxpZXIgICAJQDcyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE2MjcsIDQxMTcpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTYyNywgNDAyMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDgwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUVHlwZUxpdGVyYWwiIEA4NQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMjU2LCA0MjAxKQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4NQotCQkJbG9jYXRpb24gICAJKDIwOTMsIDQxMDYpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzI3Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRUeXBlTGl0ZXJhbCIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODY0OTUwMTgxIgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAODUKLQkJCWxvY2F0aW9uICAgCSgyMDkzLCA0MTY3KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTI4MSkKLQkJICAgIHdpZHRoICAgICAgCTM0NQotCQkgICAgaGVpZ2h0ICAgICAJMjE1Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4NgotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2NTRDMDAwOCIKLQkJICAgIGNsaWVudCAgICAgCUA4NQotCQkgICAgc3VwcGxpZXIgICAJQDcyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIxOTcsIDQwOTMpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE5NywgNDAyMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDgwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OlBUSW52YWxpZEV4cHJlc3Npb24iIEA4NwotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgxNDU3LCA0NTQ1KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4NwotCQkJbG9jYXRpb24gICAJKDEyNzksIDQ0NDkpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzU3Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiUFRJbnZhbGlkRXhwcmVzc2lvbiIpCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiNDAwODY1QUYwMjA5IgotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQKLQkJCVBhcmVudF9WaWV3IAlAODcKLQkJCWxvY2F0aW9uICAgCSgxMjc5LCA0NTEwKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTIKLQkJCW1heF93aWR0aCAgCTM2OCkKLQkJICAgIHdpZHRoICAgICAgCTM3NQotCQkgICAgaGVpZ2h0ICAgICAJMjE1Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4OAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQwMDg2NkY1MDI1OCIKLQkJICAgIGNsaWVudCAgICAgCUA4NwotCQkgICAgc3VwcGxpZXIgICAJQDcyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0MTMsIDQ0MzgpCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQxMywgNDAyMCkKLQkJICAgIGRyYXdTdXBwbGllciAJQDgwKQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6Omluc3RhbnRpYXRpb246OklKYXZhSW5zdGFuY2UiIEA4OQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUKLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUKLQkJICAgIGxvY2F0aW9uICAgCSgyMzAxLCA0OTE3KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4OQotCQkJbG9jYXRpb24gICAJKDIxMzcsIDQ4ODcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJbmxpbmVzICAgICAJMQotCQkJbWF4X3dpZHRoICAJMzI4Ci0JCQlqdXN0aWZ5ICAgIAkwCi0JCQlsYWJlbCAgICAgIAkiSUphdmFJbnN0YW5jZSIpCi0JCSAgICBzdGVyZW90eXBlIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA4OQotCQkJbG9jYXRpb24gICAJKDIxMzcsIDQ4MzcpCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJYW5jaG9yICAgICAJMTAKLQkJCW5saW5lcyAgICAgCTEKLQkJCW1heF93aWR0aCAgCTMyOAotCQkJanVzdGlmeSAgICAJMAotCQkJbGFiZWwgICAgICAJIjw8SW50ZXJmYWNlPj4iKQotCQkgICAgaWNvbiAgICAgICAJIkludGVyZmFjZSIKLQkJICAgIGljb25fc3R5bGUgCSJMYWJlbCIKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCSAgICBxdWlkdSAgICAgIAkiM0U1MTU3NUEwMkQ0IgotCQkgICAgd2lkdGggICAgICAJMzQ2Ci0JCSAgICBoZWlnaHQgICAgIAkxODQKLQkJICAgIGFubm90YXRpb24gCTgKLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRJbnN0YW5jZVJlZmVyZW5jZSIgQDkwCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQotCQkgICAgbG9jYXRpb24gICAJKDIwMDUsIDQ1MDkpCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQlQYXJlbnRfVmlldyAJQDkwCi0JCQlsb2NhdGlvbiAgIAkoMTgwNSwgNDM5MykKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk0MDEKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEluc3RhbmNlUmVmZXJlbmNlIikKLQkJICAgIGljb25fc3R5bGUgCSJJY29uIgotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDE3REIxODAyQjMiCi0JCSAgICB3aWR0aCAgICAgIAk0MTkKLQkJICAgIGhlaWdodCAgICAgCTI1NwotCQkgICAgYW5ub3RhdGlvbiAJOAotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkKLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAOTEKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDE3REI0QTAzNDEiCi0JCSAgICBjbGllbnQgICAgIAlAOTAKLQkJICAgIHN1cHBsaWVyICAgCUA3MgotCQkgICAgbGluZV9zdHlsZSAJMwotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTQzLCA0MzgxKQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5NDMsIDQwMjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MCkKLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEA5MgotCQkgICAgbG9jYXRpb24gICAJKDIxNjUsIDQ3MzApCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCXNpemUgICAgICAgCTEwCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiCi0JCQlib2xkICAgICAgIAlGQUxTRQotCQkJaXRhbGljcyAgICAJRkFMU0UKLQkJCXVuZGVybGluZSAgCUZBTFNFCi0JCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJY29sb3IgICAgICAJMAotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkKLQkJICAgIHF1aWR1ICAgICAgCSI0MDE3REJFMzAxMzgiCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MKLQkJCShvYmplY3QgUm9sZVZpZXcgInJlZmVyZW5jZSIgQDkzCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5MgotCQkJICAgIGxvY2F0aW9uICAgCSgyMjcsIDI1OSkKLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCQlzaXplICAgICAgIAkxMAotCQkJCWZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQlib2xkICAgICAgIAlGQUxTRQotCQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UKLQkJCQlzdHJpa2UgICAgIAlGQUxTRQotCQkJCWNvbG9yICAgICAgCTAKLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk0Ci0JCQkJUGFyZW50X1ZpZXcgCUA5MwotCQkJCWxvY2F0aW9uICAgCSgyMTIwLCA0Nzk3KQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udAotCQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFCi0JCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCQlhbmNob3IgICAgIAkxCi0JCQkJYW5jaG9yX2xvYyAJMQotCQkJCW5saW5lcyAgICAgCTEKLQkJCQltYXhfd2lkdGggIAkxODkKLQkJCQlqdXN0aWZ5ICAgIAkwCi0JCQkJbGFiZWwgICAgICAJIityZWZlcmVuY2UiCi0JCQkJcGN0RGlzdCAgICAJMC4yMzE5NjAKLQkJCQloZWlnaHQgICAgIAk3NwotCQkJCW9yaWVudGF0aW9uIAkxKQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQwMTdEQkU2MDAwNiIKLQkJCSAgICBjbGllbnQgICAgIAlAOTIKLQkJCSAgICBzdXBwbGllciAgIAlAODkKLQkJCSAgICBsaW5lX3N0eWxlIAkwCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTUKLQkJCQlQYXJlbnRfVmlldyAJQDkzCi0JCQkJbG9jYXRpb24gICAJKDIyNzAsIDQ3ODMpCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkJICAgIHNpemUgICAgICAgCTEwCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCQkgICAgY29sb3IgICAgICAJMAotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJCWFuY2hvciAgICAgCTIKLQkJCQlhbmNob3JfbG9jIAkxCi0JCQkJbmxpbmVzICAgICAJMQotCQkJCW1heF93aWR0aCAgCTE1Ci0JCQkJanVzdGlmeSAgICAJMAotCQkJCWxhYmVsICAgICAgCSIxIgotCQkJCXBjdERpc3QgICAgCTAuOTAwMDAwCi0JCQkJaGVpZ2h0ICAgICAJNTQKLQkJCQlvcmllbnRhdGlvbiAJMCkpCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQ3IiBAOTYKLQkJCSAgICBQYXJlbnRfVmlldyAJQDkyCi0JCQkgICAgbG9jYXRpb24gICAJKDIyNywgMjU5KQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUKLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQkgICAgcXVpZHUgICAgICAJIjQwMTdEQkU2MDE2NCIKLQkJCSAgICBjbGllbnQgICAgIAlAOTIKLQkJCSAgICBzdXBwbGllciAgIAlAOTAKLQkJCSAgICBsaW5lX3N0eWxlIAkwKSkpCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6aW5zdGFudGlhdGlvbjo6UFRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIiBAOTcKLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFCi0JCSAgICBsb2NhdGlvbiAgIAkoODUyLCA0NTc3KQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQlzaXplICAgICAgIAkxMAotCQkJZmFjZSAgICAgICAJIkFyaWFsIgotCQkJYm9sZCAgICAgICAJRkFMU0UKLQkJCWl0YWxpY3MgICAgCUZBTFNFCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQotCQkJc3RyaWtlICAgICAJRkFMU0UKLQkJCWNvbG9yICAgICAgCTAKLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbAotCQkJUGFyZW50X1ZpZXcgCUA5NwotCQkJbG9jYXRpb24gICAJKDQ5NSwgNDQ3MSkKLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQlubGluZXMgICAgIAkxCi0JCQltYXhfd2lkdGggIAk3MTQKLQkJCWp1c3RpZnkgICAgCTAKLQkJCWxhYmVsICAgICAgCSJQVEFub255bW91c0NsYXNzRGVjbGFyYXRpb24iKQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkgICAgcXVpZHUgICAgICAJIjQzNjI3QzE0MDM5NiIKLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50Ci0JCQlQYXJlbnRfVmlldyAJQDk3Ci0JCQlsb2NhdGlvbiAgIAkoNDk1LCA0NTMyKQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCWFuY2hvciAgICAgCTIKLQkJCW5saW5lcyAgICAgCTMKLQkJCW1heF93aWR0aCAgCTUwMykKLQkJICAgIHdpZHRoICAgICAgCTczMgotCQkgICAgaGVpZ2h0ICAgICAJMjM2Ci0JCSAgICBhbm5vdGF0aW9uIAk4Ci0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA5OAotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQotCQkgICAgcXVpZHUgICAgICAJIjQzNjI3RDRFMDBEMCIKLQkJICAgIGNsaWVudCAgICAgCUA5NwotCQkgICAgc3VwcGxpZXIgICAJQDcyCi0JCSAgICBsaW5lX3N0eWxlIAkzCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY3NywgNDQ1OSkKLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg2NzcsIDQwMjApCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MCkpKSkpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2phdmFNb2RlbC5tZGwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmplbS9yb3NlL2phdmFNb2RlbC5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZmI5MmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qZW0vcm9zZS9qYXZhTW9kZWwubWRsCisrKyAvZGV2L251bGwKQEAgLTEsODgxOSArMCwwIEBACi0KLShvYmplY3QgUGV0YWwKLSAgICB2ZXJzaW9uICAgIAk0NwotICAgIF93cml0dGVuICAgCSJSb3NlIDguMC4wMzAzLjE0MDAiCi0gICAgY2hhclNldCAgICAJMCkKLQotKG9iamVjdCBEZXNpZ24gIkxvZ2ljYWwgVmlldyIKLSAgICBpc191bml0ICAgIAlUUlVFCi0gICAgaXNfbG9hZGVkICAJVFJVRQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIklERSIKLQkgICAgdmFsdWUgICAgICAJIkludGVybmFsIEVkaXRvciIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIgotCSAgICB2YWx1ZSAgICAgIAkiIikKLQkob2JqZWN0IEF0dHJpYnV0ZQotCSAgICB0b29sICAgICAgIAkiSmF2YSIKLQkgICAgbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMyIKLQkgICAgdmFsdWUgICAgICAJIiIpCi0JKG9iamVjdCBBdHRyaWJ1dGUKLQkgICAgdG9vbCAgICAgICAJIkphdmEiCi0JICAgIG5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiCi0JICAgIHZhbHVlICAgICAgCSIiKQotCShvYmplY3QgQXR0cmlidXRlCi0JICAgIHRvb2wgICAgICAgCSJKYXZhIgotCSAgICBuYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyIKLQkgICAgdmFsdWUgICAgICAJIiIpKQotICAgIHF1aWQgICAgICAgCSIzOUVERkJFMDAzQjQiCi0gICAgZGVmYXVsdHMgICAJKG9iamVjdCBkZWZhdWx0cwotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMAotCWxlZnRNYXJnaW4gCTAuMjUwMDAwCi0JdG9wTWFyZ2luICAJMC4yNTAwMDAKLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwCi0JcGFnZU92ZXJsYXAgCTAuMjUwMDAwCi0JY2xpcEljb25MYWJlbHMgCVRSVUUKLQlhdXRvUmVzaXplIAlUUlVFCi0Jc25hcFRvR3JpZCAJVFJVRQotCWdyaWRYICAgICAgCTE2Ci0JZ3JpZFkgICAgICAJMTYKLQlkZWZhdWx0Rm9udCAJKG9iamVjdCBGb250Ci0JICAgIHNpemUgICAgICAgCTEwCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkgICAgaXRhbGljcyAgICAJRkFMU0UKLQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkgICAgY29sb3IgICAgICAJMAotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCXNob3dNZXNzYWdlTnVtIAkxCi0Jc2hvd0NsYXNzT2ZPYmplY3QgCVRSVUUKLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpCi0gICAgcm9vdF91c2VjYXNlX3BhY2thZ2UgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIlVzZSBDYXNlIFZpZXciCi0JcXVpZCAgICAgICAJIjM5RURGQkUwMDNCNiIKLQlleHBvcnRDb250cm9sIAkiUHVibGljIgotCWdsb2JhbCAgICAgCVRSVUUKLQlsb2dpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkKLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBVc2VDYXNlRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjM5RURGQkUyMDA4RCIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcm9vdF9jYXRlZ29yeSAJKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiTG9naWNhbCBWaWV3IgotCXF1aWQgICAgICAgCSIzOUVERkJFMDAzQjUiCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIKLQlnbG9iYWwgICAgIAlUUlVFCi0Jc3Vic3lzdGVtICAJIkNvbXBvbmVudCBWaWV3IgotCXF1aWR1ICAgICAgCSIzOUVERkJFMDAzQjciCi0JbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiamF2YSIKLQkJaXNfdW5pdCAgICAJVFJVRQotCQlpc19sb2FkZWQgIAlGQUxTRQotCQlmaWxlX25hbWUgIAkiJFdvcmtzcGFjZVJvb3RcXG9yZy5lY2xpcHNlLmplbVxccm9zZVxcZWRvY2phdmEyLmNhdCIKLQkJcXVpZCAgICAgICAJIjM2NTQ5RjJDMDA0RSIpCi0JICAgIChvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImVjb3JlIgotCQlpc191bml0ICAgIAlUUlVFCi0JCWlzX2xvYWRlZCAgCUZBTFNFCi0JCWZpbGVfbmFtZSAgCSIkV29ya3NwYWNlUm9vdFxcb3JnLmVjbGlwc2UuZW1mLmVjb3JlXFxtb2RlbFxcb3JnLmVjbGlwc2UuZW1mLkVjb3JlLmNhdCIKLQkJcXVpZCAgICAgICAJIjM5QTVFRDA0MDA0RSIpKQotCWxvZ2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdAotCSAgICAob2JqZWN0IENsYXNzRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjM5RURGQkUyMDA4RSIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmphdmEiIEAxCi0JCQlsb2NhdGlvbiAgIAkoNzg0LCA1MjgpCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQKLQkJCSAgICBzaXplICAgICAgIAkxMAotCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCIKLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFCi0JCQkgICAgdW5kZXJsaW5lICAJRkFMU0UKLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQotCQkJICAgIGNvbG9yICAgICAgCTAKLQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwKLQkJCSAgICBQYXJlbnRfVmlldyAJQDEKLQkJCSAgICBsb2NhdGlvbiAgIAkoNjMwLCA0OTMpCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCSAgICBubGluZXMgICAgIAkyCi0JCQkgICAgbWF4X3dpZHRoICAJMzA4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSJqYXZhIikKLQkJCXN0ZXJlb3R5cGUgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxCi0JCQkgICAgbG9jYXRpb24gICAJKDYzMCwgNDQzKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgYW5jaG9yICAgICAJMTAKLQkJCSAgICBubGluZXMgICAgIAkxCi0JCQkgICAgbWF4X3dpZHRoICAJMzA4Ci0JCQkgICAganVzdGlmeSAgICAJMAotCQkJICAgIGxhYmVsICAgICAgCSI8PG1ldGFtb2RlbD4+IikKLQkJCWljb25fc3R5bGUgCSJJY29uIgotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkKLQkJCXF1aWR1ICAgICAgCSIzNjU0OUYyQzAwNEUiCi0JCQl3aWR0aCAgICAgIAkzMjAKLQkJCWhlaWdodCAgICAgCTE4MikKLQkJICAgIChvYmplY3QgQ2F0ZWdvcnlWaWV3ICJMb2dpY2FsIFZpZXc6OmVjb3JlIiBAMgotCQkJbG9jYXRpb24gICAJKDMwNCwgNTQ0KQotCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250Ci0JCQkgICAgc2l6ZSAgICAgICAJMTAKLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiCi0JCQkgICAgYm9sZCAgICAgICAJRkFMU0UKLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFCi0JCQkgICAgc3RyaWtlICAgICAJRkFMU0UKLQkJCSAgICBjb2xvciAgICAgIAkwCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkKLQkJCWxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyCi0JCQkgICAgbG9jYXRpb24gICAJKDE2MCwgNDYwKQotCQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5Ci0JCQkgICAgbmxpbmVzICAgICAJMgotCQkJICAgIG1heF93aWR0aCAgCTI4OAotCQkJICAgIGp1c3RpZnkgICAgCTAKLQkJCSAgICBsYWJlbCAgICAgIAkiZWNvcmUiKQotCQkJaWNvbl9zdHlsZSAJIkljb24iCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5Ci0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQotCQkJcXVpZHUgICAgICAJIjM5QTVFRDA0MDA0RSIKLQkJCXdpZHRoICAgICAgCTMwMAotCQkJaGVpZ2h0ICAgICAJMTgwKSkpKSkKLSAgICByb290X3N1YnN5c3RlbSAJKG9iamVjdCBTdWJTeXN0ZW0gIkNvbXBvbmVudCBWaWV3IgotCXF1aWQgICAgICAgCSIzOUVERkJFMDAzQjciCi0JcGh5c2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQotCXBoeXNpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QKLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiIKLQkJcXVpZCAgICAgICAJIjM5RURGQkUyMDA4QyIKLQkJdGl0bGUgICAgICAJIk1haW4iCi0JCXpvb20gICAgICAgCTEwMAotCQltYXhfaGVpZ2h0IAkyODM1MAotCQltYXhfd2lkdGggIAkyMTYwMAotCQlvcmlnaW5feCAgIAkwCi0JCW9yaWdpbl95ICAgCTAKLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzCi0JcXVpZCAgICAgICAJIjM5RURGQkUwMDNCOCIKLQlQcm9jc05EZXZzIAkobGlzdAotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3IgotCQlxdWlkICAgICAgIAkiMzlFREZCRTAwM0JBIgotCQl0aXRsZSAgICAgIAkiRGVwbG95bWVudCBWaWV3IgotCQl6b29tICAgICAgIAkxMDAKLQkJbWF4X2hlaWdodCAJMjgzNTAKLQkJbWF4X3dpZHRoICAJMjE2MDAKLQkJb3JpZ2luX3ggICAJMAotCQlvcmlnaW5feSAgIAkwCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0KSkpKQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcwotCWF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkicm9zZUlkIgotCQl2YWx1ZSAgICAgIAkiNzUzMTE3NTQwIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2OSIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInBhY2thZ2VOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImJhc2VQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNVUkkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm5zVVJJIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJiYXNlUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJuc05hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkibnNQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiYW5ub3RhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJFY29yZSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1VuaXF1ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNJRCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ2aXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbEZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJImlzVW5zZXR0YWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJpc1Jlc29sdmVQcm94aWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkicmVmZXJlbmNlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ2aXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIlZpc2liaWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJSZWFkLXdyaXRlIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtb25seSB1bnNldHRhYmxlIgotCQkJCXZhbHVlICAgICAgCTQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQtd3JpdGUgdW5zZXR0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAk1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkieG1sTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbEZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGZWF0dXJlS2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkZlYXR1cmVLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiQXR0cmlidXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQkJbmFtZSAgICAgICAJIkVsZW1lbnQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvbnN0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAkiQysrIFJldmVyc2UgRW5naW5lZXJlZCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsSGVhZGVySW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQm9keUluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nUm9vdERpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5oIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIgotCQkJdmFsdWUgICAgICAJOCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0luZGVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJLTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIgotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NNZW1iZXJPcmRlciIKLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0JyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmFtZXNwYWNlcyIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUGFja2FnZXMiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiU2FtZSBhcyBtb2RlbCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiVXBwZXIgY2FzZSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTG93ZXIgY2FzZSB3aXRoIHVuZGVyc2NvcmVzIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkJyYWNlU3R5bGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjIiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIzIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCNCIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjUiCi0JCQkJdmFsdWUgICAgICAJNSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTWVtYmVyT3JkZXJTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUgRmlyc3QiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk9yZGVyIGJ5IGtpbmQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZCIKLQkJCQl2YWx1ZSAgICAgIAk0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQ29kZSBnZW5lcmF0aW9uIG9ubHkiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBhbmQgcmV2ZXJzZSBlbmdpbmVlcmluZyIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiTmV2ZXIgZ2VuZXJhdGUgbW9kZWwgSURzIgotCQkJCXZhbHVlICAgICAgCTMpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENvZGVCb2R5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVuY3Rpb25Cb2R5IgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUZ1bmN0aW9uQm9keVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bmN0aW9uQm9keVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkRlZmF1bHQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkhlYWRlclNvdXJjZUZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkJvZHlTb3VyY2VGaWxlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBTlNJIEMrKyBFdmVudCBXYXRjaGVyIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBTlNJQ29udmVydCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWR+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTgzX1NPVVJDRSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NOYW1lIgotCQkJdmFsdWUgICAgICAJIk9iamVjdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNsYXNzQWNjZXNzIgotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQb2x5bW9ycGhpY1VuaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSGFuZGxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJIYW5kbGVBY2Nlc3MiCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJWYXJpYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJBXyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4IgotCQkJdmFsdWUgICAgICAJIlRoZV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvcktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiQ29uc3RydWN0b3JLaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNvcHkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRnJlZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NFcXVhbGl0eU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJIYW5kbGVFcXVhbGl0eU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc1Rhc2siCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkxpbWl0ZWRQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhODMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNTdWJ1bml0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1JbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiUmVuYW1lcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1BhcmFtZXRlck1vZGUiCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIwMykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsQ29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlNwZWMiCi0JCQkJdmFsdWUgICAgICAJMjI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJCb2R5IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIgotCQkJCXZhbHVlICAgICAgCTIyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiU2VwYXJhdGUiCi0JCQkJdmFsdWUgICAgICAJMjIzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkluIgotCQkJCXZhbHVlICAgICAgCTIwNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiT3V0IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCQluYW1lICAgICAgIAkiSW5PdXQiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvblJldHVybiIKLQkJCQl2YWx1ZSAgICAgIAkyMDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJWYXJpYW50IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke2Fzc29jaWF0aW9ufSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSIKLQkJCXZhbHVlICAgICAgCSJEaXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7dGFyZ2V0fSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhODMiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE4MyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTgzIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MzgzMjYyMDAiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjEuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMS5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTcGVjRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIjIuYWRhIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMi5hZH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJCb2R5RmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlVzZUNvbG9uTm90YXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiCi0JCQl2YWx1ZSAgICAgIAkiW3N0YXRlbWVudF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCIKLQkJCXZhbHVlICAgICAgCTYwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUFEQTk1X1NPVVJDRSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiT2JqZWN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0MykpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiVHlwZUltcGxlbWVudGF0aW9uU2V0IiAyMDgpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbCIKLQkJCXZhbHVlICAgICAgCSgiVHlwZUNvbnRyb2xTZXQiIDIyNSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDb250cm9sbGVkXyR7dHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlRGVmaW5pdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEltcGxlbWVudGF0aW9uU2V0IiAyMDkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRLaW5kUGFja2FnZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHtjbGFzc31fUmVjb3JkX0tpbmRzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNMaW1pdGVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlQWNjZXNzVHlwZVNldCIgMjMwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiSGFuZGxlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVEZWZpbml0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NDbGFzc1dpZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJNYXliZUFsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiIDExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyZW50Q2xhc3NOYW1lIgotCQkJdmFsdWUgICAgICAJIlN1cGVyY2xhc3MiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJFbnVtZXJhdGlvbkxpdGVyYWxQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSJUaGVfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZlR5cGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFycmF5X09mXyR7dHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7dHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBcnJheU9mQWNjZXNzVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mQWNjZXNzVHlwZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQWNjZXNzX0FycmF5X09mXyR7YWNjZXNzX3R5cGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQXJyYXlJbmRleERlZmluaXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiUG9zaXRpdmUgcmFuZ2UgPD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbXBsaWNpdFBhcmFtZXRlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJDcmVhdGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIlN1YnByb2dyYW1LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIkNvcHkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSJGcmVlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVzdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVR5cGVFcXVhbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlRXF1YWxpdHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiR7cXVvdGV9PSR7cXVvdGV9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiVGFnZ2VkIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUmVjb3JkIgotCQkJCXZhbHVlICAgICAgCTIxMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiTWl4aW4iCi0JCQkJdmFsdWUgICAgICAJMjExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlRhc2siCi0JCQkJdmFsdWUgICAgICAJMjEyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVUeXBlIgotCQkJCXZhbHVlICAgICAgCTIwOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiTXVsdGlwbGVUeXBlcyIKLQkJCQl2YWx1ZSAgICAgIAkyMTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyaXplZEltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIgotCQkJCXZhbHVlICAgICAgCTExKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJVbmNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTIxNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIgotCQkJCXZhbHVlICAgICAgCTQzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlN1YnByb2dyYW1LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJUeXBlQ29udHJvbFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkluaXRpYWxpemF0aW9uT25seSIKLQkJCQl2YWx1ZSAgICAgIAkyMjYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRGaW5hbGl6YXRpb25Pbmx5IgotCQkJCXZhbHVlICAgICAgCTIyNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTIyOCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFsd2F5cyIKLQkJCQl2YWx1ZSAgICAgIAkyMjkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkF1dG8iCi0JCQkJdmFsdWUgICAgICAJMjMwKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNQcml2YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJldHVyblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbFdpdGhzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtSW1wbGVtZW50YXRpb25TZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZW5hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT3ZlcnJpZGluZyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTW9kZSIKLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXJDbGFzc1dpZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRXhpdENvZGUiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSIKLQkJCXZhbHVlICAgICAgCSIke2RlZmF1bHR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRW50cnlCYXJyaWVyQ29uZGl0aW9uIgotCQkJdmFsdWUgICAgICAJIlRydWUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJTcGVjIgotCQkJCXZhbHVlICAgICAgCTIyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQm9keSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlJlbmFtaW5nIgotCQkJCXZhbHVlICAgICAgCTIyMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUmVuYW1pbmdBc0JvZHkiCi0JCQkJdmFsdWUgICAgICAJMjMxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyTW9kZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiSW4iCi0JCQkJdmFsdWUgICAgICAJMjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJPdXQiCi0JCQkJdmFsdWUgICAgICAJMjA1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJJbk91dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkFjY2VzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIgMjE2KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGROYW1lIgotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0IgotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc1NldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHtyZWxhdGlvbnNoaXB9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNBbGlhc2VkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyIKLQkJCXZhbHVlICAgICAgCSJMaXN0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50IgotCQkJCXZhbHVlICAgICAgCTIxNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjE3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIgotCQkJCXZhbHVlICAgICAgCTExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTE5OSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSIKLQkJCXZhbHVlICAgICAgCSIke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2F0dHJpYnV0ZX0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXR0cmlidXRlfSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZVNldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50IgotCQkJCXZhbHVlICAgICAgCTIxNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldCIKLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIgotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzc29jaWF0ZSIKLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJUaGVfJHt0YXJnZXRDbGFzc30iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NHZXQiCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0IgotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIgotCQkJdmFsdWUgICAgICAJIkxpc3QiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50IgotCQkJCXZhbHVlICAgICAgCTIxNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQWNjZXNzRGlzY3JpbWluYW50IgotCQkJCXZhbHVlICAgICAgCTIxOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjE3KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJHZW5lcmljIgotCQkJCXZhbHVlICAgICAgCTExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTk5KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1IgotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQWRhOTUiCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJBZGE5NSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCIKLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICVRJSAlWiUgJVclIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCIKLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJbmFtZSAgICAgICAJIk9yZGVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZvcndhcmRSZWZlcmVuY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJPcmRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkFzc29jVHlwZVNldCIgNDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQkJbmFtZSAgICAgICAJIkFycmF5IgotCQkJCXZhbHVlICAgICAgCTI0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSIKLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT1JCQSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09SQkEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPUkJBIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDbGVhckNhc2UiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkicHJvamVjdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlZpZXdDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRvbWFpbkNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU1BQYWNrYWdlQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyQ291bnRlciIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJbmRleENvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludENvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU3RvcmVQcm9jZWR1cmVDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkpvaW5Db3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VDb3VudGVyIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImNPTlRBSU5FUkNvdW50ZXIiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFibGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlZpZXdQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRvbWFpblByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5kZXhQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5UHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNEYXRhYmFzZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVGFyZ2V0RGF0YWJhc2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxvY2F0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlU3BhY2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0RlYXVsdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQnVmZmVyUG9vbCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRXh0ZW50U2l6ZSIKLQkJCXZhbHVlICAgICAgCTEpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQcmVmZXRjaFNpemUiCi0JCQl2YWx1ZSAgICAgIAkxKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFnZVNpemUiCi0JCQl2YWx1ZSAgICAgIAk0KQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTWFuYWdlZEJ5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJMaXN0IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiZG1TY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtRG9tYWluUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRG9tYWluUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNSb290U2NoZW1hIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1Jvb3REb21haW5QYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NjaGVtYVBhY2thZ2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRhdGFiYXNlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRCTVMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1RhYmxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1ZpZXciCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRG9tYWluIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1NQUGFja2FnZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU3lub255bW5zIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb3JyZWxhdGlvbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdENsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVhYmxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoZWNrT3B0aW9uIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU25hcFNob3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGlzdGluY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlBlcnNpc3RUb1NlcnZlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJUYWJsZVNwYWNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1VwZGF0YWJsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPcmRpbmFsIgotCQkJdmFsdWUgICAgICAJMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSWRlbnRpdHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJOdWxsc0FsbG93ZWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkxlbmd0aCIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCTApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5hdGl2ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZUlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPSUQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1JlbGF0aW9uc2hpcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNvdXJjZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJJTWV0aG9kIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNoaWxkSW5zZXJ0UmVzdHJpY3ROYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hpbGRNdWx0aXBsaWNpdHlOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJImRtSXRlbSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0luZGV4IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc1RyaWdnZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzU3RvcmVkUHJvY2VkdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc0NsdXN0ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkZpbGxGYWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiS2V5TGlzdCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiQ2hlY2tQcmVkaWNhdGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZlcmFsTW9kZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENoZWNrVGltZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzSW5zZXJ0RXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGVsZXRlRXZlbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJlZk9sZFRhYmxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZOZXdUYWJsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUmVmT2xkUm93IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJSZWZOZXdSb3ciCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzUm93IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJXaGVuQ2xhdXNlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMYW5ndWFnZSIKLQkJCXZhbHVlICAgICAgCSJTUUwiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUHJvY1R5cGUiCi0JCQl2YWx1ZSAgICAgIAkiUHJvY2VkdXJlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIklzRGV0ZXJtaW5pc3RpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiUGFyYW1ldGVyU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlJldHVybmVkTnVsbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIlNjYWxlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJGb3JCaXREYXRhIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUGFyYW1ldGVyIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIgotCQkJbmFtZSAgICAgICAJIkRNTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiSXNJblBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJJc091dFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiT3JkaW5hbCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25JRCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciBDb21tdW5pY2F0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUm9vdERpciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VQcmVmaXhlcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTm90U2hvd1Jvc2VJRERsZyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNob3dDb2RlZ2VuRGxnIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSb3NlSUQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdFJldHVybkxpbmUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0QXV0aG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRTaW5jZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDEiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NOdW1Bc3Rlcmlza3MiCi0JCQl2YWx1ZSAgICAgIAkwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIgotCQkJdmFsdWUgICAgICAJODApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRWRpdG9yIgotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZNIgotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIgotCQkJdmFsdWUgICAgICAJIjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGNoYXJzZXRzLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGpjZS5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxqc3NlLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXHJ0LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXHN1bnJzYXNpZ24uamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcZXh0XFxkbnNucy5qYXI7RDpcXFByb2dyYW0gRmlsZXNcXFN1blxcamRrMS40LjJfMDJcXGpyZVxcbGliXFxleHRcXGxkYXBzZWMuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcZXh0XFxsb2NhbGVkYXRhLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXGV4dFxcc3VuamNlX3Byb3ZpZGVyLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcanJlXFxsaWJcXHNlY3VyaXR5XFxsb2NhbF9wb2xpY3kuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxqcmVcXGxpYlxcc2VjdXJpdHlcXFVTX2V4cG9ydF9wb2xpY3kuamFyO0Q6XFxQcm9ncmFtIEZpbGVzXFxTdW5cXGpkazEuNC4yXzAyXFxsaWJcXGR0LmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcbGliXFxodG1sY29udmVydGVyLmphcjtEOlxcUHJvZ3JhbSBGaWxlc1xcU3VuXFxqZGsxLjQuMl8wMlxcbGliXFx0b29scy5qYXIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlZmVyZW5jZUNsYXNzcGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIgotCQkJCXZhbHVlICAgICAgCTEwMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZNVHlwZSIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdW4iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIk1pY3Jvc29mdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiSUJNIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZBSmF2YVdvcmtpbmdGb2xkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jZVZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJIm1fIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4IgotCQkJdmFsdWUgICAgICAJInNfIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0QXR0cmlidXRlRGF0YVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJ2b2lkIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJOb0NsYXNzQ3VzdG9tRGxnIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2xvYmFsSW1wb3J0cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VDbGFzc1N0eWxlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VNZXRob2RTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiVXNlVGFicyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlVzZVNwYWNlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3BhY2luZ0l0ZW1zIgotCQkJdmFsdWUgICAgICAJMykKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSb3NlRGVmYXVsdENvbW1lbnRTdHlsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQXN0ZXJpc2tDb21tZW50U3R5bGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJKYXZhQ29tbWVudFN0eWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0F1dGhvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NTaW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkphdmFkb2NWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5TdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZW1vdGVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZW1vdGVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJIb21lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSG9tZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5U3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRFRETG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RFRETG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0RUpCVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRTZXJ2bGV0VmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdEoyRUVKYXZhZG9jIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lSmF2YURvY1RhZ3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJMb2NhbFByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkxvY2FsU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTG9jYWxIb21lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU291cmNlQ29udHJvbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ1NlbGVjdGVkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU0NDUHJvamVjdFNvdXJjZVJvb3QiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTQ0NQcm9qZWN0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNDQ0NvbW1lbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZE9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlc05hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdEF0dHJpYnV0ZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0UGFyYW1ldGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JIZWFkZXJzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXREYXRlSGVhZGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvb2tpZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZW50VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSFRNTCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ21wRmllbGQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJFbnZpcm9ubWVudFByb3BlcnRpZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUmVmZXJlbmNlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlY3VyaXR5Um9sZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCU2Vzc2lvblR5cGVfU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlNlc3Npb25UeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlbGVzcyIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU3RhdGVmdWwiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIgotCQkJdmFsdWUgICAgICAJKCJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IiAyMTEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIxMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJCZWFuIgotCQkJCXZhbHVlICAgICAgCTIxMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIgMjIwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIiIKLQkJCQl2YWx1ZSAgICAgIAkyMjApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29udGFpbmVyIgotCQkJCXZhbHVlICAgICAgCTIyMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJNUF9FeHRlbmRfQ01QIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X1NlcnZsZXRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJIdHRwX1NlcnZsZXRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb25zdHJ1Y3RvcklzIgotCQkJdmFsdWUgICAgICAJKCJDdG9yX1NldCIgNjIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkN0b3JfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyIKLQkJCQl2YWx1ZSAgICAgIAk2MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk2NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIgotCQkJCXZhbHVlICAgICAgCTY1KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaW5hbGl6ZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YXRpY0luaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNhYmxlQXV0b1N5bmMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb250ZXh0UmVmIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbml0UGFyYW1ldGVyTmFtZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdERpc3BhdGNoZXJQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaGVyRm9yd2FyZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJEZWZhdWx0X0VKQl9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZV9YTUxfREQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCRW52aXJvbm1lbnRQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCQ254RmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZWN1cml0eVJvbGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCTmFtZUluSkFSIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlNlc3Npb25UeXBlX1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uVHlwZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlN0YXRlZnVsIgotCQkJCXZhbHVlICAgICAgCTIwMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlRyYW5zYWN0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQmVhbiIKLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiIDIyMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRUpCUGVyc2lzdGVuY2VUeXBlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSIiCi0JCQkJdmFsdWUgICAgICAJMjIwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iCi0JCQkJdmFsdWUgICAgICAJMjIxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lciIKLQkJCQl2YWx1ZSAgICAgIAkyMjIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJSZWVudHJhbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb24iCi0JCQl2YWx1ZSAgICAgIAkoIkVKQlZlcnNpb25fU2V0IiAyMzApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlZlcnNpb25fU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIjIuMCIKLQkJCQl2YWx1ZSAgICAgIAkyMzApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiMS54IgotCQkJCXZhbHVlICAgICAgCTIzMSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkVKQlhNTEZpbGVQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyIKLQkJCXZhbHVlICAgICAgCSgiQ3Rvcl9TZXQiIDYyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDdG9yX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJwdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNjIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIgotCQkJCXZhbHVlICAgICAgCTYzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJInByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkicGFja2FnZSIKLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGF0aWNJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zdGFuY2VJbml0aWFsaXplciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzYWJsZUF1dG9TeW5jIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGV4dFJlZiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIklzU2luZ2xlVGhyZWFkIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SW5pdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldElzU2VjdXJlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyUGF0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoZXJJbmNsdWRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0U2VjdXJpdHlSb2xlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRnZXRJbmZvIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RBdHRyaWJ1dGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RBdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3RQYXJhbWV0ZXIiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9yUmVxdWVzdFBhcmFtZXRlcnMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SGVhZGVyIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiTWV0aG9kRm9ySGVhZGVycyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRJbnRIZWFkZXIiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRDb29raWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JDb29raWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUhUTUwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJCTVBfRXh0ZW5kX0NNUCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWRPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiU3RyaWN0ZnAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0WE1MRmlsZVBhdGgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiSmF2YSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIk5hdGl2ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnVsbHlRdWFsaWZpZWRSZXR1cm4iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZXBsYWNlRXhpc3RpbmdDb2RlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJTdHJpY3RmcCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJKYXZhIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiRmluYWwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJWb2xhdGlsZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5VHlwZSIKLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiTm90IEEgUHJvcGVydHkiCi0JCQkJdmFsdWUgICAgICAJNzEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIgotCQkJCXZhbHVlICAgICAgCTcyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIgotCQkJCXZhbHVlICAgICAgCTczKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbmVkIgotCQkJCXZhbHVlICAgICAgCTc0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiSW5kaXZpZHVhbENoYW5nZU1ndCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiCi0JCQl2YWx1ZSAgICAgIAkoIlJlYWQvV3JpdGVfU2V0IiA4MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZV9TZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCAmIFdyaXRlIgotCQkJCXZhbHVlICAgICAgCTgxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSIKLQkJCQl2YWx1ZSAgICAgIAk4MikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJXcml0ZSBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGdWxseVF1YWxpZmllZFR5cGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJGaW5hbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlRyYW5zaWVudCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJbmFtZSAgICAgICAJIlZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIgotCQkJdmFsdWUgICAgICAJKCJCZWFuUHJvcGVydHlfU2V0IiA3MSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiQmVhblByb3BlcnR5X1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJOb3QgQSBQcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAk3MSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJNzIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQm91bmQiCi0JCQkJdmFsdWUgICAgICAJNzMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RyYWluZWQiCi0JCQkJdmFsdWUgICAgICAJNzQpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQluYW1lICAgICAgIAkiUmVhZC9Xcml0ZSIKLQkJCXZhbHVlICAgICAgCSgiUmVhZC9Xcml0ZV9TZXQiIDgxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJSZWFkL1dyaXRlX1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJKYXZhIgotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiCi0JCQkJdmFsdWUgICAgICAJODEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCQluYW1lICAgICAgIAkiUmVhZCBPbmx5IgotCQkJCXZhbHVlICAgICAgCTgyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkphdmEiCi0JCQkJbmFtZSAgICAgICAJIldyaXRlIE9ubHkiCi0JCQkJdmFsdWUgICAgICAJODMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiSmF2YSIKLQkJCW5hbWUgICAgICAgCSJJc05hdmlnYWJsZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkphdmEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiMzYwMDAwMDAyIikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiRERMU2NyaXB0RmlsZW5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmltYXJ5S2V5Q29sdW1uTmFtZSIKLQkJCXZhbHVlICAgICAgCSJfSUQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIgotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NoZW1hTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lUHJlZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHlwZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZpZXdOYW1lU3VmZml4IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVmFycmF5TmFtZVByZWZpeCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJOZXN0ZWRUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVTdWZmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiT0lEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJDb2xsZWN0aW9uVHlwZUxlbmd0aCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvblR5cGVTY2FsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25PZlJFRlMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIk1ldGhvZEtpbmRTZXQiIDE5MDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk92ZXJsb2FkSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUmVhZE5vRGF0YVN0YXRlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNSZWFkTm9Qcm9jZXNzU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9Qcm9jZXNzU3RhdGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJJc1NlbGZpc2giCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlclR5cGVTZXQiIDE4MDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudCIKLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckV2ZW50U2V0IiAxNjAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2giCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJGb3JFYWNoU2V0IiAxNzAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyV2hlbkNsYXVzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiTWFwTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTE5MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiT3JkZXJNZXRob2QiCi0JCQkJdmFsdWUgICAgICAJMTkwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkxOTAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSIKLQkJCQl2YWx1ZSAgICAgIAkxOTA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIk9wZXJhdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiCi0JCQkJdmFsdWUgICAgICAJMTkwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yIgotCQkJCXZhbHVlICAgICAgCTE5MDcpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVHJpZ2dlciIKLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiCi0JCQkJdmFsdWUgICAgICAJMTkwOSkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIkFGVEVSIgotCQkJCXZhbHVlICAgICAgCTE4MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIgotCQkJCXZhbHVlICAgICAgCTE4MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TVEVBRCBPRiIKLQkJCQl2YWx1ZSAgICAgIAkxODAzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckZvckVhY2hTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiUk9XIgotCQkJCXZhbHVlICAgICAgCTE3MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiU1RBVEVNRU5UIgotCQkJCXZhbHVlICAgICAgCTE3MDIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIgotCQkJCXZhbHVlICAgICAgCTE2MDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiVVBEQVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSIKLQkJCQl2YWx1ZSAgICAgIAkxNjA0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQkJbmFtZSAgICAgICAJIklOU0VSVCBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJCW5hbWUgICAgICAgCSJVUERBVEUgT1IgREVMRVRFIgotCQkJCXZhbHVlICAgICAgCTE2MDYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiCi0JCQkJdmFsdWUgICAgICAJMTYwNykpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIk9yZGVyTnVtYmVyIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJMZW5ndGgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCIKLQkJCW5hbWUgICAgICAgCSJQcmVjaXNpb24iCi0JCQl2YWx1ZSAgICAgIAkiMiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiU2NhbGUiCi0JCQl2YWx1ZSAgICAgIAkiNiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiCi0JCQluYW1lICAgICAgIAkiSXNJbmRleCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIklzUHJpbWFyeUtleSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDb21wb25lbnRUZXN0IgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSZXF1aXNpdGVQcm8iCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJofiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcHAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJjcCMiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0IgotCQkJdmFsdWUgICAgICAJMzApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0IgotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSIKLQkJCXZhbHVlICAgICAgCSJpbnQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1RlbXBsYXRlcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNjApCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMi4xX19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyVmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImh+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSJoIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwfiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImNwIyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiCi0JCQl2YWx1ZSAgICAgIAkzMCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkJvb2xlYW5UeXBlIgotCQkJdmFsdWUgICAgICAJImludCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcyksJGxpbWl0KSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZSgkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVJlZmVyZW5jZSgkbGltaXQpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkTGlzdEJ5UmVmZXJlbmNlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2UiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlWYWx1ZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlWYWx1ZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5UmVmZXJlbmNlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0IgotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiY29tcGlsZXIzLjBfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlckFubm90YXRpb25zIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJImgjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVCYWNrdXBFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCIKLQkJCXZhbHVlICAgICAgCTMwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VDUFBfU09VUkNFIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiaW50IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4cGxpY2l0SW5zdGFudGlhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3MsJGxpbWl0PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5VmFsdWU8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzPiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVZhbHVlPCRxdWFsdHlwZSwgJHF1YWxjb250PiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSJEaWN0aW9uYXJ5QnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCIKLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWx3YXlzS2VlcE9ycGhhbmVkQ29kZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0tleSIKLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvbnN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXhwbGljaXREZWZhdWx0Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeHBsaWNpdENvcHlDb25zdHJ1Y3RvciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXN0cnVjdG9yS2luZCIKLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzaWdubWVudE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVTZXQiIDE5OSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUFzc2lnbm1lbnRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRXF1YWxpdHlLaW5kIgotCQkJdmFsdWUgICAgICAJKCJGcmllbmRLaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJSZWxhdGlvbmFsS2luZCIKLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdG9yYWdlTWdtdE9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3RvcmFnZU1nbXRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN1YnNjcmlwdE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHRWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0UmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTdWJzY3JpcHRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZVZpc2liaWxpdHkiCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VLaW5kIgotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXJlZmVyZW5jZU9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvbktpbmQiCi0JCQl2YWx1ZSAgICAgIAkoIlRocmVlS2luZFNldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25SZXN1bHRUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RyZWFtT3BlcmF0aW9ucyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTdHJlYW1WaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVGhyZWVLaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIktpbmRTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiCi0JCQkJdmFsdWUgICAgICAJMjAxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyIKLQkJCQl2YWx1ZSAgICAgIAkyMDMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRnJpZW5kS2luZFNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZUFuZERlZmluZSIKLQkJCQl2YWx1ZSAgICAgIAkxOTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVPbmx5IgotCQkJCXZhbHVlICAgICAgCTIwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIgotCQkJCXZhbHVlICAgICAgCTIwNikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJWaXNpYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiCi0JCQkJdmFsdWUgICAgICAJNDUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCIKLQkJCQl2YWx1ZSAgICAgIAk0NCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAk0MykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iCi0JCQkJdmFsdWUgICAgICAJMTQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiCi0JCQl2YWx1ZSAgICAgIAkiQU1JUiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiSW5DbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRm9sbG93aW5nQ2xhc3NEZWNsYXJhdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQ2xvc3VyZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAlUSUgJVolICVXJSIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgCi18Ly8gJHBhY2thZ2UKLXwjaW5jbHVkZSAiJGZpbGUiCi18Ci0JCQkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVPcmRlciIKLQkJCXZhbHVlICAgICAgCSJBTUlSIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIgotCQkJdmFsdWUgICAgICAJKCJJbmxpbmluZ1N0eWxlU2V0IiAyMDcpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJJbkNsYXNzRGVjbGFyYXRpb24iCi0JCQkJdmFsdWUgICAgICAJMjA4KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIgotCQkJCXZhbHVlICAgICAgCTIwNykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJUeXBlc0RlZmluZWQiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVDbG9zdXJlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kIgotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWJzdHJhY3RCb2R5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kQm9keSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZERlY2wiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU3BlY2lhbERlY2xSZXR1cm5UeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbklzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNFeHBsaWNpdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRW50cnlDb2RlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBbGwiCi0JCQkJdmFsdWUgICAgICAJMykpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJCb2R5QW5ub3RhdGlvbnMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiT3JkZXJlZCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJnZXRfJHJlbGF0aW9uc2hpcCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyIKLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb21tb24iCi0JCQkJdmFsdWUgICAgICAJMjAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIgotCQkJCXZhbHVlICAgICAgCTIwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiCi0JCQkJdmFsdWUgICAgICAJMjAyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJGYWxzZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJUcnVlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQXJyYXkiCi0JCQkJdmFsdWUgICAgICAJMjQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIgotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImNnIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIgotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCIKLQkJCXZhbHVlICAgICAgCSJ0aGVfJHRhcmdldENsYXNzIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZXQiCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCIKLQkJCXZhbHVlICAgICAgCSIkZGF0YS5zZXQoJGtleXMsJHZhbHVlKSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZENvbnRhaW5lciIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzQ29udGFpbmVyIgotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSIKLQkJCXZhbHVlICAgICAgCSJzZXRfJHRhcmdldCIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZSIKLQkJCXZhbHVlICAgICAgCSgiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2VTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRmFsc2UiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVHJ1ZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJTYW1lX0FzX0dldFNldEJ5UmVmZXJlbmNlIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXROYW1lIgotCQkJdmFsdWUgICAgICAJImdldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRHZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVF1YWxpZmllZFNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRTZXRSZXR1cm5zVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0RhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdFJlbGF0aW9uc2hpcFZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29uc3QiCi0JCQkJdmFsdWUgICAgICAJMikpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlcklzVm9sYXRpbGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIgotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzR2V0T3BlcmF0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NHZXRSZXN1bHRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NDbGFzc0dldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc1NldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0ZvcndhcmRSZWZlcmVuY2VPbmx5IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQXNzb2NUeXBlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBcnJheSIKLQkJCQl2YWx1ZSAgICAgIAkyNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIgotCQkJCXZhbHVlICAgICAgCTQ1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJNDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiCi0JCQkJdmFsdWUgICAgICAJNDMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIgotCQkJCXZhbHVlICAgICAgCTE0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiCi0JCQkJdmFsdWUgICAgICAJMjExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5IgotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJDb25zdCIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXRPcGVyYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyRhdHRyaWJ1dGUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIgotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIgotCQkJCXZhbHVlICAgICAgCTIwMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCIKLQkJCQl2YWx1ZSAgICAgIAkyMDEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0IgotCQkJCXZhbHVlICAgICAgCTIwMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU3RhdGljIgotCQkJCXZhbHVlICAgICAgCTIwMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIgotCQkJCXZhbHVlICAgICAgCTIwNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJHZXRJc0NvbnN0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCIKLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIkZhbHNlIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiY2ciCi0JCQkJbmFtZSAgICAgICAJIlRydWUiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAkyKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklubGluZUdldCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJDQ1JlZ2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRm9yd2FyZFJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiQm9keVJlZmVyZW5jZU9ubHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiY2ciCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5IgotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnlJc09uU2VhcmNoTGlzdCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCW5hbWUgICAgICAgCSJQcmVjb21waWxlZEhlYWRlciIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIklzTmFtZXNwYWNlIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkluZGVudCIKLQkJCXZhbHVlICAgICAgCTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJImNnIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIgotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiY2ciCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiTm9uZSIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJImNnIgotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJjZyIKLQkJCQluYW1lICAgICAgIAkiQWxsIgotCQkJCXZhbHVlICAgICAgCTMpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJWZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIjUuMCIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNDbGFzc1R5cGVTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1TVkNDbGFzc1R5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlX1BhcnQiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uX1BhcnQiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJDbGFzc19GYWN0b3J5IgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eSIKLQkJCXZhbHVlICAgICAgCSgiQ09iamVjdEZ1bmN0aW9uYWxpdHlTZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJEeW5hbWljIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRHluY3JlYXRlIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiU2VyaWFsIgotCQkJCXZhbHVlICAgICAgCTMpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRlR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9EQVRBX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaWVsZEdyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0ZJRUxEX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVNZXNzYWdlR3JvdXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeSIKLQkJCXZhbHVlICAgICAgCSgiT0xFRmFjdG9yeVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb25lIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRfaW4iCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJMaWNlbnNlZCIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRUNsYXNzSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU9MRUN0bFR5cGUiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJPTEVDdGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPTEVUeXBlTGliIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYklEIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1ham9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1pbm9yIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wUGFnZUlEcyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIk9MRVByb3BQYWdlSURzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcGF0Y2hNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0aWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrRnVuY3Rpb25zIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoRGVmVmFsdWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BJZEVudW0iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUF9JRF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW50ZXJmYWNlTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiSU5URVJGQUNFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkluaXRJbnRlcmZhY2UiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUV2ZW50TWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkVWRU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlN0b2NrRXZlbnRzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRTaW5rTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlByb3BOb3RpZnlTaW5rcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvbm5lY3Rpb25NYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNvbm5lY3Rpb25Qb2ludElJRCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkluaGVyaXRhbmNlVHlwZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiT0xFQ29tbWFuZHMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUZDRGVjbGFyZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTUZDSW1wbGVtZW50cyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBVExfRGVjbGFyZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDT01NYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT01fTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb25uZWN0aW9uUG9pbnRNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX1BPSU5UX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTXNnTWFwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNHX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUHJvcGVydHlNYXAiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQUk9QRVJUWV9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIlR5cGUiCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNPcGVyYXRpb25UeXBlU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNU1ZDT3BlcmF0aW9uVHlwZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsX092ZXJyaWRlIgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVzc2FnZV9IYW5kbGVyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRGlzcGF0Y2hfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X0ZpcmluZ19GdW5jdGlvbiIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X1NpbmtfSGFuZGxlciIKLQkJCQl2YWx1ZSAgICAgIAk1KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0ZF9PTEVfTWV0aG9kIgotCQkJCXZhbHVlICAgICAgCTYpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiQ29tbWFuZF9QYXJzZXIiCi0JCQkJdmFsdWUgICAgICAJNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9HZXRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJOCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9TZXRfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJOSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9Ob3RpZnlfRnVuY3Rpb24iCi0JCQkJdmFsdWUgICAgICAJMTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWFjcm9fR2VuZXJhdGVkX0Z1bmN0aW9uIgotCQkJCXZhbHVlICAgICAgCTExKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJNRVNTQUdFX01BUF9FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJESVNQQVRDSF9NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJFVkVOVFNJTktfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkJvZHlJbWFnZSIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJUeXBlIgotCQkJdmFsdWUgICAgICAJKCJNU1ZDQXR0cmlidXRlVHlwZVNldCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiTVNWQ0F0dHJpYnV0ZVR5cGVTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIgotCQkJCXZhbHVlICAgICAgCTApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiTWVtYmVyX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiR2V0X1NldF9Qcm9wZXJ0eSIKLQkJCQl2YWx1ZSAgICAgIAkyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCQluYW1lICAgICAgIAkiRmllbGRfRGF0YSIKLQkJCQl2YWx1ZSAgICAgIAk0KQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQkJbmFtZSAgICAgICAJIlN0b2NrX1Byb3BlcnR5IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiTVNWQyIKLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkNhbGxUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiU3RvY2tQcm9wZXJ0eUltcGxlbWVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5jbHVkZXNHcm91cCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkFGWF9JTkNMVURFU19FbnRyaWVzIgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJNU1ZDIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiTVNWQyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbmNsdWRlc0dyb3VwIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIk1TVkMiCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnNlcnRMb2NhdGlvbiIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJjZyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUm9zZSBNb2RlbCBJbnRlZ3JhdG9yIgotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCIKLQkJdmFsdWUgICAgICAJRkFMU0UpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlNvREEiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlRvcExpbmsiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiCi0JCXZhbHVlICAgICAgCSI3ODM2MDYzNzgiKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIlR5cGVLaW5kcyIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImVudW0iCi0JCQkJdmFsdWUgICAgICAJMTAwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkicmVjb3JkIgotCQkJCXZhbHVlICAgICAgCTEwMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJIm1vZHVsZSIKLQkJCQl2YWx1ZSAgICAgIAkxMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJpbnRlcmZhY2UiCi0JCQkJdmFsdWUgICAgICAJMTAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCQluYW1lICAgICAgIAkiZGlzcGludGVyZmFjZSIKLQkJCQl2YWx1ZSAgICAgIAkxMDQpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSJjb2NsYXNzIgotCQkJCXZhbHVlICAgICAgCTEwNSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJImFsaWFzIgotCQkJCXZhbHVlICAgICAgCTEwNikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJInVuaW9uIgotCQkJCXZhbHVlICAgICAgCTEwNykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQkJbmFtZSAgICAgICAJIm1heCIKLQkJCQl2YWx1ZSAgICAgIAkxMDgpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ09NIgotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiCi0JCQkJdmFsdWUgICAgICAJMTA5KSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJraW5kIgotCQkJdmFsdWUgICAgICAJKCJUeXBlS2luZHMiIDEwOSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ1dWlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJ2ZXJzaW9uIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiZGxsbmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYWxpYXMiCi0JCQl2YWx1ZSAgICAgIAkiIikpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ09NIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJDT00iCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImlkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJmaWxlbmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkibGlicmFyeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidXVpZCIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscHN0cmluZyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDT00iCi0JCQluYW1lICAgICAgIAkiaGVscGZpbGUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ09NIgotCQkJbmFtZSAgICAgICAJImhlbHBjb250ZXh0IgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJsY2lkIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNPTSIKLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkNPTSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCIKLQkJdmFsdWUgICAgICAJIjc4MzYwNjM3OCIpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJQdWJsaWNOb3RDcmVhdGFibGUiCi0JCQkJdmFsdWUgICAgICAJMjEzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiU2luZ2xlVXNlIgotCQkJCXZhbHVlICAgICAgCTIxNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTUpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMTkpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJHbG9iYWxNdWx0aVVzZSIKLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkJhc2VTZXQiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiCi0JCQkJdmFsdWUgICAgICAJMjIyKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiMCIKLQkJCQl2YWx1ZSAgICAgIAkyMjMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSIxIgotCQkJCXZhbHVlICAgICAgCTIyNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiT3B0aW9uQmFzZSIKLQkJCXZhbHVlICAgICAgCSgiQmFzZVNldCIgMjIyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkV4cGxpY2l0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiCi0JCQl2YWx1ZSAgICAgIAkoIkNvbXBhcmVTZXQiIDIwMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbnN0YW5jaW5nIgotCQkJdmFsdWUgICAgICAJKCJJbnN0YW5jaW5nU2V0IiAyMTkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQ29tcGFyZVNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQkJbmFtZSAgICAgICAJIihub25lKSIKLQkJCQl2YWx1ZSAgICAgIAkyMDIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJCW5hbWUgICAgICAgCSJCaW5hcnkiCi0JCQkJdmFsdWUgICAgICAJMjAzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCQluYW1lICAgICAgIAkiVGV4dCIKLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJMaWJyYXJ5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQWxpYXNOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0JvZHkiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRCb2R5IgotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk5ldyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiTmV3IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJXaXRoRXZlbnRzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJGdWxsTmFtZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlByb3BlcnR5TmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0IgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudHNEZWxlZ2F0aW9uIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJCeVZhbCIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiQnlSZWYiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQYXJhbUFycmF5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJVcGRhdGVNb2RlbCIKLQkJCXZhbHVlICAgICAgCVRSVUUpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyIKLQkJCW5hbWUgICAgICAgCSJJbXBvcnRSZWZlcmVuY2VzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIlF1aWNrSW1wb3J0IgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIgotCQkJbmFtZSAgICAgICAJIkltcG9ydEJpbmFyeSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiV2ViIE1vZGVsZXIiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIgotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0IgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkVkaXRvclR5cGUiCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiIKLQkJCQl2YWx1ZSAgICAgIAkxMDApCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIgotCQkJCXZhbHVlICAgICAgCTEwMSkpKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfU3lzdGVtSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfUHVibGljSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvblZhbHVlIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiSW50ZXJuYWxWYWx1ZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlckVudGl0eSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkV4dGVybmFsRW50aXR5IgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fU3lzdGVtSUQiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJOb3RhdGlvbl9QdWJsaWNJRCIKLQkJCXZhbHVlICAgICAgCSIiKSkpCi0JICAgIChvYmplY3QgQXR0cmlidXRlCi0JCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdERlY2xUeXBlIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIgotCQkJbmFtZSAgICAgICAJIkFzc2lnbiBBbGwiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCIKLQkJCW5hbWUgICAgICAgCSJDb21wb25lbnRQYXRoIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJImZyYW1ld29yayIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiUjJFZGl0b3IiCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIgotCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIlZlcnNpb24gQ29udHJvbCIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIgotCQkJdmFsdWUgICAgICAJVFJVRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJldkVuZ1Jvb3REaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlJvb3RQYWNrYWdlIgotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiUmV2RW5nRGlyZWN0b3JpZXNBc1BhY2thZ2VzIgotCQkJdmFsdWUgICAgICAJRkFMU0UpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIgotCQkJdmFsdWUgICAgICAJIi5oIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uRmlsZUV4dGVuc2lvbiIKLQkJCXZhbHVlICAgICAgCSIuY3BwIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0hlYWRlckZpbGVEaXJlY3RvcnkiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk5ld0ltcGxlbWVudGF0aW9uRmlsZURpcmVjdG9yeSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRmlsZUNhcGl0YWxpemF0aW9uIgotCQkJdmFsdWUgICAgICAJKCJGaWxlQ2FwaXRhbGl6YXRpb25TZXQiIDApKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ29kZUdlbkV4dHJhRGlyZWN0b3JpZXMiCi0JCQl2YWx1ZSAgICAgIAkoIkNvZGVHZW5FeHRyYURpcmVjdG9yaWVzU2V0IiAwKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlN0cmlwQ2xhc3NQcmVmaXgiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlVzZVRhYnMiCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlRhYldpZHRoIgotCQkJdmFsdWUgICAgICAJOCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluZGVudFdpZHRoIgotCQkJdmFsdWUgICAgICAJNCkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkFjY2Vzc0luZGVudGF0aW9uIgotCQkJdmFsdWUgICAgICAJLTIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJNb2RlbElkQ29tbWVudFJ1bGVzIgotCQkJdmFsdWUgICAgICAJKCJNb2RlbElkQ29tbWVudFJ1bGVzU2V0IiAxKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIlBhZ2VXaWR0aCIKLQkJCXZhbHVlICAgICAgCTgwKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiQ2xhc3NNZW1iZXJPcmRlciIKLQkJCXZhbHVlICAgICAgCSgiTWVtYmVyT3JkZXJTZXQiIDEpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiT25lUGFyYW1ldGVyUGVyTGluZSIKLQkJCXZhbHVlICAgICAgCUZBTFNFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTmFtZXNwYWNlQnJhY2VTdHlsZSIKLQkJCXZhbHVlICAgICAgCSgiQnJhY2VTdHlsZVNldCIgMikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDbGFzc0JyYWNlU3R5bGUiCi0JCQl2YWx1ZSAgICAgIAkoIkJyYWNlU3R5bGVTZXQiIDIpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25CcmFjZVN0eWxlIgotCQkJdmFsdWUgICAgICAJKCJCcmFjZVN0eWxlU2V0IiAyKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodCIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxIZWFkZXJJbmNsdWRlcyIKLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJDb2RlR2VuRXh0cmFEaXJlY3Rvcmllc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5hbWVzcGFjZXMiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlBhY2thZ2VzIgotCQkJCXZhbHVlICAgICAgCTIpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIkZpbGVDYXBpdGFsaXphdGlvblNldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlNhbWUgYXMgbW9kZWwiCi0JCQkJdmFsdWUgICAgICAJMCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIlVwcGVyIGNhc2UiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkxvd2VyIGNhc2Ugd2l0aCB1bmRlcnNjb3JlcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCW5hbWUgICAgICAgCSJCcmFjZVN0eWxlU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjEiCi0JCQkJdmFsdWUgICAgICAJMSkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkIyIgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJCMyIKLQkJCQl2YWx1ZSAgICAgIAkzKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiQjQiCi0JCQkJdmFsdWUgICAgICAJNCkKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkI1IgotCQkJCXZhbHVlICAgICAgCTUpKSkKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJbmFtZSAgICAgICAJIk1lbWJlck9yZGVyU2V0IgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyIKLQkJCQluYW1lICAgICAgIAkiUHVibGljIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIEZpcnN0IgotCQkJCXZhbHVlICAgICAgCTIpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJPcmRlciBieSBraW5kIgotCQkJCXZhbHVlICAgICAgCTMpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWQiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQluYW1lICAgICAgIAkiTW9kZWxJZENvbW1lbnRSdWxlc1NldCIKLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIkNvZGUgZ2VuZXJhdGlvbiBvbmx5IgotCQkJCXZhbHVlICAgICAgCTEpCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIgotCQkJCW5hbWUgICAgICAgCSJDb2RlIGdlbmVyYXRpb24gYW5kIHJldmVyc2UgZW5naW5lZXJpbmciCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiCi0JCQkJbmFtZSAgICAgICAJIk5ldmVyIGdlbmVyYXRlIG1vZGVsIElEcyIKLQkJCQl2YWx1ZSAgICAgIAkzKSkpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkRlcGxveSIKLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiCi0JCXZhbHVlICAgICAgCUZBTFNFKQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyIKLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJjbGFzc2lmaWVyTmFtZSIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJjb25zdHJhaW50cyIKLQkJCXZhbHVlICAgICAgCSIiKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJ4bWxOYW1lIgotCQkJdmFsdWUgICAgICAJIiIpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJInhtbENvbnRlbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKCJDb250ZW50S2luZCIgMCkpCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIkNvbnRlbnRLaW5kIgotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldAotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJVbnNwZWNpZmllZCIKLQkJCQl2YWx1ZSAgICAgIAkwKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJFbXB0eSIKLQkJCQl2YWx1ZSAgICAgIAkxKQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiCi0JCQkJdmFsdWUgICAgICAJMikKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiTWl4ZWQiCi0JCQkJdmFsdWUgICAgICAJMykKLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCQluYW1lICAgICAgIAkiRWxlbWVudE9ubHkiCi0JCQkJdmFsdWUgICAgICAJNCkpKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkKLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIgotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0Ci0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQotCQkJdG9vbCAgICAgICAJIkVjb3JlIgotCQkJbmFtZSAgICAgICAJIm9wZXJhdGlvbk5hbWUiCi0JCQl2YWx1ZSAgICAgIAkiIikKLQkJICAgIChvYmplY3QgQXR0cmlidXRlCi0JCQl0b29sICAgICAgIAkiRWNvcmUiCi0JCQluYW1lICAgICAgIAkiaXNVbmlxdWUiCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUKLQkJCXRvb2wgICAgICAgCSJFY29yZSIKLQkJCW5hbWUgICAgICAgCSJhbm5vdGF0aW9uIgotCQkJdmFsdWUgICAgICAJIiIpKSkpCi0JcXVpZCAgICAgICAJIjM5RURGQkUwMDNCOSIpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NTRkOGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgkKLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYzM1YzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYW5ub3RhdGlvbnMtY29yZS5qYXIKLWJ1aWxkLnhtbAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmMDJlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NDc5MjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIEFwciAxNiAxNzoxNToxMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjA1MWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU2F0IEp1biAwMiAxNzowNjozOCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYmQ3NjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNTdW4gQXByIDE2IDE3OjE0OjUyIEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxNjY0ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMS5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UwYzAwMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1vdXRwdXQuLiA9IGJpbi8KLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViOWQ4My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBwcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZQotQnVuZGxlLU5hbWUuMCA9IEFubm90YXRpb24gQ29yZSBQbHVnLWluCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotZXh0ZW5zaW9uLXBvaW50Lm5hbWUuMCA9IEFubm90YXRpb25zIFByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NDNkNjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gPGV4dGVuc2lvbi1wb2ludCBpZD0iYW5ub3RhdGlvbnNQcm92aWRlciIgbmFtZT0iJWV4dGVuc2lvbi1wb2ludC5uYW1lLjAiIHNjaGVtYT0ic2NoZW1hL2Fubm90YXRpb25zUHJvdmlkZXIuZXhzZCIvPgotIDxleHRlbnNpb24KLSAgICAgICBpZD0iQW5ub3RhdGlvbnNUcmFuc2xhdG9yIgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi50cmFuc2xhdG9yRXh0ZW5zaW9uIj4KLSAgICAgICA8dHJhbnNsYXRvcgotICAgICAgIAkJY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuQW5ub3RhdGlvbnNUcmFuc2xhdG9yIj4KLSAgICAgICA8L3RyYW5zbGF0b3I+Ci0gPC9leHRlbnNpb24+Ci0gICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3ByZXBhcmVmb3JwaWkueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzE4YTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvcHJlcGFyZWZvcnBpaS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08cHJvamVjdCBuYW1lPSJQcmVwYXJlRm9yUElJIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuIj4KLQkJCi0JPCEtLSBTZXR1cCB0ZW1wIHZhcmlhYmxlcyAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ibmxzRGlyIiB2YWx1ZT0iZDovTkxTL0Nvcm9uYS8wNTI2Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4iIHZhbHVlPSJjb20uaWJtLnd0cC5hbm5vdGF0aW9ucy5jb3JlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vcHJvcGVydHlfZmlsZXMiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS9wcm9wZXJ0eV9maWxlcyI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLSAgCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3Byb3BlcnR5X2ZpbGVzL2Fubm90YXRpb25jb3JlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9wcm9wZXJ0eV9maWxlcy9hbm5vdGF0aW9uY29yZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWEzNGNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3Byb3BlcnR5X2ZpbGVzL2Fubm90YXRpb25jb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRhZ1NwZWNfMz1Vbmtub3duIHRhZyBzY29wZToKLVRhZ1NwZWNfND1OdWxsIHRhZyBzY29wZS4KLVRhZ0F0dHJpYlNwZWNfNj0KLUFubm90YXRpb25UYWdQYXJzZXJfMD1OdWxsIGV2ZW50IGhhbmRsZXIuCi1Bbm5vdGF0aW9uVGFnUGFyc2VyXzE9Ci1Bbm5vdGF0aW9uVGFnUmVnaXN0cnlfMD1Nb3JlIHRoYW4gb25lICdBbm5vdGF0aW9uVGFnSW5mbycgdGFnIGZvciB0aGUgdGFnICcKLUFubm90YXRpb25UYWdSZWdpc3RyeV85PXBhcnNlVGFnQXR0cmliczogdW5rbm93biAndXNlJyB2YWx1ZToKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uc1Byb3ZpZGVyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zY2hlbWEvYW5ub3RhdGlvbnNQcm92aWRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjBkY2UyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uc1Byb3ZpZGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUiIGlkPSJhbm5vdGF0aW9uc1Byb3ZpZGVyIiBuYW1lPSJBbm5vdGF0aW9ucyBQcm92aWRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCBieSBjbGllbnRzIHRvIGFsbG93IHRoZWlyIG93biBhbm5vdGF0aW9uIHByb3ZpZGVyIHRvIGRldGFpbCBpbmZvcm1hdGlvbiBvbiB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIEVPYmplY3QgaXMgYW5ub3RhdGVkIGZvciBvbmUgb2YgdGhlaXIgdGFnIHNldHMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJhbm5vdGF0aW9uc1Byb3ZpZGVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb25zUHJvdmlkZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgYSBjbGFzcyB3aGljaCBpbXBsbWVudHMgdGhlIElBbm5vdGF0aW9uc1Byb3ZpZGVyIGludGVyZmFjZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgWzEuMC4yXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW1RoaXMgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3NjdlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRlZENvbW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0ZWRDb21tZW50SGFuZGxlciBpbXBsZW1lbnRzIFRhZ1BhcnNlRXZlbnRIYW5kbGVyIHsKLQotCXByaXZhdGUgTWFwIGFubm90YXRpb25zOwotCi0JcHJpdmF0ZSBUb2tlbiBhbm5vdGF0aW9uVG9rZW47Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFubm90YXRlZENvbW1lbnRIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLlRhZ1BhcnNlRXZlbnRIYW5kbGVyI2Fubm90YXRpb25UYWcob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLlRva2VuKQotCSAqLwotCXB1YmxpYyB2b2lkIGFubm90YXRpb25UYWcoVG9rZW4gdGFnKSB7Ci0JCXRoaXMuYW5ub3RhdGlvblRva2VuID0gdGFnOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLlRhZ1BhcnNlRXZlbnRIYW5kbGVyI2VuZE9mVGFnKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRPZlRhZyhpbnQgcG9zKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5UYWdQYXJzZUV2ZW50SGFuZGxlciNhdHRyaWJ1dGUob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLlRva2VuLAotCSAqICAgICAgaW50LCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmUuVG9rZW4pCi0JICovCi0JcHVibGljIHZvaWQgYXR0cmlidXRlKFRva2VuIG5hbWUsIGludCBlcXVhbHNQb3NpdGlvbiwgVG9rZW4gdmFsdWUpIHsKLQkJaWYgKHZhbHVlLmdldFRleHQoKSA9PSBudWxsIHx8IHZhbHVlLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKQotCQkJZ2V0QW5ub3RhdGlvbnMoKS5wdXQodGhpcy5hbm5vdGF0aW9uVG9rZW4uZ2V0VGV4dCgpLCBuYW1lLmdldFRleHQoKSk7Ci0JCWVsc2UKLQkJCWdldEFubm90YXRpb25zKCkucHV0KG5hbWUuZ2V0VGV4dCgpLCB2YWx1ZS5nZXRUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW5ub3RhdGlvbnMuCi0JICovCi0JcHVibGljIE1hcCBnZXRBbm5vdGF0aW9ucygpIHsKLQkJaWYgKGFubm90YXRpb25zID09IG51bGwpCi0JCQlhbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBhbm5vdGF0aW9uczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uVGFnUGFyc2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25UYWdQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3MjBmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25UYWdQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAxMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBhdCBLZWxsZXkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25UYWdQYXJzZXIgewotCi0JcHJpdmF0ZSBUYWdQYXJzZUV2ZW50SGFuZGxlciBoYW5kbGVyOwotCi0JcHJpdmF0ZSBjaGFyW10gaW5wdXQ7Ci0KLQlpbnQgcG9zOwotCi0JaW50IGVuZE9mTGFzdEdvb2RBdHRQYXJzZTsKLQkKLQlwcml2YXRlIE9iamVjdCBhbm5vdGF0aW9uTG9jayA9IG5ldyBPYmplY3QoKTsKLQotCXB1YmxpYyBBbm5vdGF0aW9uVGFnUGFyc2VyKFRhZ1BhcnNlRXZlbnRIYW5kbGVyIHRwKSB7Ci0JCWlmICh0cCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEFubm90YXRpb25zQ29yZVJlc291cmNlcy5Bbm5vdGF0aW9uVGFnUGFyc2VyXzApOyAKLQkJfQotCQloYW5kbGVyID0gdHA7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGVvcygpIHsKLQkJcmV0dXJuIHBvcyA+PSBpbnB1dC5sZW5ndGg7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzV1MoY2hhciBjKSB7Ci0JCXJldHVybiBjID09ICcgJyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1x0JzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2tpcFdTKCkgewotCQl3aGlsZSAocG9zIDwgaW5wdXQubGVuZ3RoICYmIChpc1dTKGlucHV0W3Bvc10pIHx8IGlucHV0W3Bvc10gPT0gJyonKSkgewotCQkJcG9zKys7Ci0JCX0KLQl9Ci0KLQkvLyBDYWxsZXIgaXMgZXhwZWN0ZWQgdG8gbWFrZSBzdXJlIHRoZSBlb3MgaGFzIG5vdCBiZWVuIHJlYWNoZWQuCi0JcHJpdmF0ZSBjaGFyIHBlZWsoKSB7Ci0JCXJldHVybiBpbnB1dFtwb3NdOwotCX0KLQotCS8vIENhbGxlciBpcyBleHBlY3RlZCB0byBjaGVjayBmb3IgRU9TLgotCXByaXZhdGUgY2hhciBuZXh0Q2hhcigpIHsKLQkJcmV0dXJuIGlucHV0W3BvcysrXTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXh0Q2hhcihjaGFyIGMpIHsKLQkJaWYgKGVvcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gcGVlaygpID09IGM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSURDaGFyKGNoYXIgYykgewotCQlyZXR1cm4gIWlzV1MoYykgJiYgYyAhPSAnPScgJiYgYyAhPSAnQCcgJiYgYyAhPSAnXCInOwotCX0KLQotCXByaXZhdGUgVG9rZW4gY29sbGVjdElEKCkgewotCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoMTYpOwotCQlUb2tlbiB0ID0gbmV3IFRva2VuKCk7Ci0KLQkJdC5zZXRCZWdpbm5pbmcocG9zKTsKLQkJd2hpbGUgKCFlb3MoKSAmJiBpc0lEQ2hhcihwZWVrKCkpKSB7Ci0JCQliLmFwcGVuZChuZXh0Q2hhcigpKTsKLQkJfQotCQl0LnNldEVuZChwb3MgLSAxKTsKLQkJdC5zZXRUZXh0KGIudG9TdHJpbmcoKSk7Ci0JCXJldHVybiB0OwotCX0KLQotCXByaXZhdGUgVG9rZW4gZXhwZWN0QXR0cmliTmFtZSgpIHsKLQkJaWYgKGVvcygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgc2F2ZSA9IHBvczsKLQotCQlUb2tlbiByZXR2YWwgPSBjb2xsZWN0SUQoKTsKLQkJaWYgKHJldHZhbC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlwb3MgPSBzYXZlOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQlwcml2YXRlIFRva2VuIGV4cGVjdFRhZygpIHsKLQkJaWYgKGVvcygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgc2F2ZVBvcyA9IHBvczsKLQotCQlpZiAobmV4dENoYXIoKSAhPSAnQCcpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGVvcygpIHx8IGlzV1MocGVlaygpKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlUb2tlbiByZXR2YWwgPSBleHBlY3RBdHRyaWJOYW1lKCk7Ci0KLQkJaWYgKHJldHZhbC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlwb3MgPSBzYXZlUG9zICsgMTsKLQkJfQotCQlyZXR2YWwuc2V0QmVnaW5uaW5nKHNhdmVQb3MpOwotCi0JCS8vIFNhdmUgZW5kIG9mIHBhcnNlIHNvIHdlIGNhbiBwYXNzIGl0IGFzIHRoZSBlbmQgb2YgdGhlIHBhcnNlZCB0YWcuCi0JCWVuZE9mTGFzdEdvb2RBdHRQYXJzZSA9IHBvczsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQlwcml2YXRlIFRva2VuIGV4cGVjdFF1b3RlZFZhbHVlKCkgewotCQlza2lwV1MoKTsKLQkJaWYgKGVvcygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVRva2VuIHRvayA9IG5ldyBUb2tlbigpOwotCi0JCXRvay5zZXRCZWdpbm5pbmcocG9zKTsKLQkJaWYgKHBlZWsoKSAhPSAnXCInKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQluZXh0Q2hhcigpOwotCi0JCWlmIChlb3MoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgYiA9IG5ldyBTdHJpbmdCdWZmZXIoNjQpOwotCi0JCXdoaWxlICghZW9zKCkgJiYgcGVlaygpICE9ICdcIicpIHsKLQkJCWIuYXBwZW5kKG5leHRDaGFyKCkpOwotCQl9Ci0JCWlmICghZW9zKCkpIHsKLQkJCW5leHRDaGFyKCk7Ci0JCX0KLQotCQl0b2suc2V0RW5kKHBvcyAtIDEpOwotCQl0b2suc2V0VGV4dChiLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gdG9rOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleHBlY3RBc3NpZ24oKSB7Ci0JCWlmIChlb3MoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKG5leHRDaGFyKCkgPT0gJz0nKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwb3MtLTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgVG9rZW4gbWtOdWxsVG9rZW4oKSB7Ci0JCVRva2VuIHJldHZhbCA9IG5ldyBUb2tlbigpOwotCi0JCXJldHZhbC5zZXRCZWdpbm5pbmcocG9zKTsKLQkJcmV0dmFsLnNldEVuZChwb3MgLSAxKTsKLQkJcmV0dmFsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHBhcnNlTmV4dEF0dHJpYnV0ZSgpIHsKLQkJc2tpcFdTKCk7Ci0JCWlmIChlb3MoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVRva2VuIGtleSA9IGNvbGxlY3RJRCgpOwotCi0JCWlmIChrZXkgPT0gbnVsbCB8fCBrZXkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJc2tpcFdTKCk7Ci0JCWlmIChlb3MoKSkgewotCQkJLy8gR28gYWhlYWQgYW5kIHJlcG9ydCBpdCwgZXZlbiB0aG91Z2ggaXQgaXMgYSBwYXJ0aWFsIGF0dHJpYnV0ZS4gKAotCQkJLy8gd2Ugc3RpbGwgZmFpbCBoZXJlICkKLQkJCWhhbmRsZXIuYXR0cmlidXRlKGtleSwgLTEsIG1rTnVsbFRva2VuKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaW50IGVxUG9zID0gcG9zOwotCi0JCWlmICghZXhwZWN0QXNzaWduKCkpIHsKLQkJCS8vIEV2ZW4gdGhvdWdoIHdlIHdvbid0IHBhcnNlIHRoaXMgYXMgYSBmdWxsIGF0dHJpYnV0ZSwgZ28gYWhlYWQgYW5kCi0JCQkvLyBjYWxsIHRoZSBoYW5kbGVyIHdpdGggaXQuIFNvbWUgY2xpZW50cyB3YW50IHRvIHNlZSBwYXJ0aWFsCi0JCQkvLyBhdHRyaWJ1dGVzLgotCQkJaGFuZGxlci5hdHRyaWJ1dGUoa2V5LCAtMSwgbWtOdWxsVG9rZW4oKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJc2tpcFdTKCk7Ci0KLQkJaWYgKGVvcygpKSB7Ci0JCQkvLyBTYW1lIGhlcmUgLSB3ZSBmYWlsIG9uIGl0LCBidXQgd2UgcmVwb3J0IGl0IGFueXdheQotCQkJaGFuZGxlci5hdHRyaWJ1dGUoa2V5LCBlcVBvcywgbWtOdWxsVG9rZW4oKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJVG9rZW4gdmFsdWUgPSBleHBlY3RRdW90ZWRWYWx1ZSgpOwotCi0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZSA9IGNvbGxlY3RJRCgpOwotCQkJaWYgKGlzTmV4dENoYXIoJz0nKSkgewotCQkJCXBvcyA9IHZhbHVlLmdldEJlZ2lubmluZygpOwotCQkJCXZhbHVlID0gbWtOdWxsVG9rZW4oKTsKLQkJCX0KLQkJfQotCQllbmRPZkxhc3RHb29kQXR0UGFyc2UgPSBwb3M7Ci0JCWhhbmRsZXIuYXR0cmlidXRlKGtleSwgZXFQb3MsIHZhbHVlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlQXR0cmlidXRlcygpIHsKLQkJd2hpbGUgKCFlb3MoKSAmJiBwYXJzZU5leHRBdHRyaWJ1dGUoKSkgewotCQkJLy8gbG9vcCB3aGlsZSBub3QgZW5kIG9mIHN0cmluZwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNraXBUb1RhZ0NoYXIoKSB7Ci0JCXdoaWxlICghZW9zKCkgJiYgcGVlaygpICE9ICdAJykgewotCQkJbmV4dENoYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcnNlcklucHV0KGNoYXJbXSB0ZXh0KSB7Ci0JCXN5bmNocm9uaXplZChhbm5vdGF0aW9uTG9jaykgewotCQkJaW5wdXQgPSB0ZXh0OwotCQkJcG9zID0gMDsKLQkJCWVuZE9mTGFzdEdvb2RBdHRQYXJzZSA9IDA7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJzZXJJbnB1dChTdHJpbmcgdGV4dCkgewotCQlzZXRQYXJzZXJJbnB1dCh0ZXh0LnRvQ2hhckFycmF5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhcnNlKCkgewotCQlzeW5jaHJvbml6ZWQgKGFubm90YXRpb25Mb2NrKSB7Ci0JCQl3aGlsZSAoIWVvcygpKSB7Ci0JCQkJc2tpcFRvVGFnQ2hhcigpOwotCQkJCVRva2VuIHRhZyA9IGV4cGVjdFRhZygpOwotCQkJCWlmICh0YWcgPT0gbnVsbCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaGFuZGxlci5hbm5vdGF0aW9uVGFnKHRhZyk7Ci0JCQkJcGFyc2VBdHRyaWJ1dGVzKCk7Ci0JCQkJaGFuZGxlci5lbmRPZlRhZyhlbmRPZkxhc3RHb29kQXR0UGFyc2UpOwotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDMxY2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc0FkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RydWN0dXJhbEZlYXR1cmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuQ2xvbmVhYmxlUHVibGljOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25zQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgQ2xvbmVhYmxlUHVibGljIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFRCA9ICJnZW5lcmF0ZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBREFQVEVSX1RZUEUgPSBBbm5vdGF0aW9uc0FkYXB0ZXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBFU3RydWN0dXJhbEZlYXR1cmUgTk9USUZJQ0FUSU9OX0ZFQVRVUkUgPSBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlSW1wbCgpIHsKLQkJLy8gYW5vbnltb3VzIGlubmVyIGNsYXNzCi0JfTsKLQotCXByaXZhdGUgTWFwIGFubm90YXRpb25zTWFwOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc0FkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2Nsb25lKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgeyAvLyB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotCQkvL3JldHVybiBzdXBlci5jbG9uZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZW1mT2JqZWN0Ci0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRBbm5vdGF0aW9ucyhFT2JqZWN0IGVtZk9iamVjdCwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZW1mT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUFubm90YXRpb25zQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbWZPYmplY3QpOwotCQlhZGFwdGVyLmFkZEFubm90YXRpb25zKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBwYXJhbSBlbWZPYmplY3QKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QW5ub3RhdGlvbnMoRU9iamVjdCBlbWZPYmplY3QsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChlbWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gaW50ZXJuYWxHZXRBbm5vdGF0aW9ucyhlbWZPYmplY3QsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGludGVybmFsR2V0QW5ub3RhdGlvbnMoRU9iamVjdCBlbWZPYmplY3QsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChlbWZPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBbm5vdGF0aW9uc0FkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoZW1mT2JqZWN0KTsKLQkJcmV0dXJuIChhZGFwdGVyID09IG51bGwpID8gaW50ZXJuYWxHZXRBbm5vdGF0aW9ucyhlbWZPYmplY3QuZUNvbnRhaW5lcigpLCBuYW1lKSA6IGFkYXB0ZXIuZ2V0QW5ub3RhdGlvbnMobmFtZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gZW1mT2JqZWN0Ci0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHJlbW92ZUFubm90YXRpb25zKEVPYmplY3QgZW1mT2JqZWN0LCBTdHJpbmcgbmFtZSkgewotCQlpZiAoZW1mT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQW5ub3RhdGlvbnNBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKGVtZk9iamVjdCk7Ci0JCXJldHVybiBhZGFwdGVyLnJlbW92ZUFubm90YXRpb25zKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbnMoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlnZXRBbm5ub3RhdGlvbnMoKS5wdXQobmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0QW5ub3RhdGlvbnMoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldEFubm5vdGF0aW9ucygpLmdldChuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbW92ZUFubm90YXRpb25zKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBnZXRBbm5ub3RhdGlvbnMoKS5yZW1vdmUobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0QW5ubm90YXRpb25zKCkgewotCQlpZiAoYW5ub3RhdGlvbnNNYXAgPT0gbnVsbCkKLQkJCWFubm90YXRpb25zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGFubm90YXRpb25zTWFwOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbWZPYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBBbm5vdGF0aW9uc0FkYXB0ZXIgZ2V0QWRhcHRlcihFT2JqZWN0IGVtZk9iamVjdCkgewotCQlBbm5vdGF0aW9uc0FkYXB0ZXIgYWRhcHRlciA9IHJldHJpZXZlRXhpc3RpbmdBZGFwdGVyKGVtZk9iamVjdCk7Ci0JCXJldHVybiBhZGFwdGVyID09IG51bGwgPyBjcmVhdGVBZGFwdGVyKGVtZk9iamVjdCkgOiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbWZPYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBBbm5vdGF0aW9uc0FkYXB0ZXIgY3JlYXRlQWRhcHRlcihFT2JqZWN0IGVtZk9iamVjdCkgewotCQlBbm5vdGF0aW9uc0FkYXB0ZXIgYWRhcHRlciA9IG5ldyBBbm5vdGF0aW9uc0FkYXB0ZXIoKTsKLQkJYWRhcHRlci5zZXRUYXJnZXQoZW1mT2JqZWN0KTsKLQkJZW1mT2JqZWN0LmVBZGFwdGVycygpLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVtZk9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEFubm90YXRpb25zQWRhcHRlciByZXRyaWV2ZUV4aXN0aW5nQWRhcHRlcihFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gKEFubm90YXRpb25zQWRhcHRlcikgRWNvcmVVdGlsLmdldEV4aXN0aW5nQWRhcHRlcihlbWZPYmplY3QsIEFEQVBURVJfVFlQRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBBREFQVEVSX1RZUEUuZXF1YWxzKHR5cGUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zQ29yZVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWI4Mjc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFubm90YXRpb25zQ29yZVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiYW5ub3RhdGlvbmNvcmUiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdTcGVjXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnU3BlY180OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ0F0dHJpYlNwZWNfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVGFnUGFyc2VyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblRhZ1BhcnNlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25UYWdSZWdpc3RyeV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25UYWdSZWdpc3RyeV85OwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQW5ub3RhdGlvbnNDb3JlUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc1Byb3ZpZGVyTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9Bbm5vdGF0aW9uc1Byb3ZpZGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjk4YjYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNQcm92aWRlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25zUHJvdmlkZXJNYW5hZ2VyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbnNQcm92aWRlck1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgQW5ub3RhdGlvbnNQcm92aWRlck1hbmFnZXIoKTsKLQkKLQlzdGF0aWMgewotCQlJTlNUQU5DRS5yZWFkUmVnaXN0cnkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERlc2NyaXB0b3IgewotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QVF9QTFVHSU4gPSAib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OU19QUk9WSURFUiA9ICJhbm5vdGF0aW9uc1Byb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUUgPSAiY2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcHJpdmF0ZSBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudDsKLQotCQlwdWJsaWMgRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgYUNvbmZpZ0VsZW1lbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQljb25maWdFbGVtZW50ID0gYUNvbmZpZ0VsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgSUFubm90YXRpb25zUHJvdmlkZXIgY3JlYXRlSW5zdGFuY2UoKSB7Ci0JCQlJQW5ub3RhdGlvbnNQcm92aWRlciBpbnN0YW5jZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWluc3RhbmNlID0gKElBbm5vdGF0aW9uc1Byb3ZpZGVyKSBjb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0xBU1NOQU1FKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIExpc3QgYW5ub3RhdGlvbnNQcm92aWRlcnM7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc1Byb3ZpZGVyTWFuYWdlcigpIHsKLQkJc3VwZXIoRGVzY3JpcHRvci5FWFRFTlNJT05fUFRfUExVR0lOLCBEZXNjcmlwdG9yLkFOTk9UQVRJT05TX1BST1ZJREVSKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRGVzY3JpcHRvci5BTk5PVEFUSU9OU19QUk9WSURFUikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWFkZEFubm90YXRpb25zUHJvdmlkZXIobmV3IERlc2NyaXB0b3IoZWxlbWVudCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uc1Byb3ZpZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlJQW5ub3RhdGlvbnNQcm92aWRlciBwcm92aWRlciA9IGRlc2NyaXB0b3IuY3JlYXRlSW5zdGFuY2UoKTsKLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpCi0JCQlnZXRBbm5vdGF0aW9uc1Byb3ZpZGVycygpLmFkZChwcm92aWRlcik7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW5ub3RhdGlvbnNQcm92aWRlcnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QW5ub3RhdGlvbnNQcm92aWRlcnMoKSB7Ci0JCWlmIChhbm5vdGF0aW9uc1Byb3ZpZGVycyA9PSBudWxsKQotCQkJYW5ub3RhdGlvbnNQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBhbm5vdGF0aW9uc1Byb3ZpZGVyczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0Fubm90YXRpb25zVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTEwYWQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvQW5ub3RhdGlvbnNUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IgZXh0ZW5kcyBUcmFuc2xhdG9yIHsKLQotCXByaXZhdGUgQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIgaGFuZGxlcjsKLQotCXByaXZhdGUgQW5ub3RhdGlvblRhZ1BhcnNlciBwYXJzZXI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFubm90YXRpb25zVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IoKSB7Ci0JCXN1cGVyKCIjY29tbWVudCIsIEFubm90YXRpb25zQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRSwgVHJhbnNsYXRvci5DT01NRU5UX0ZFQVRVUkUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbU5hbWVBbmRQYXRoCi0JICogQHBhcmFtIGFGZWF0dXJlCi0JICovCi0JcHVibGljIEFubm90YXRpb25zVHJhbnNsYXRvcihTdHJpbmcgZG9tTmFtZUFuZFBhdGgpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIEFubm90YXRpb25zQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRSwgVHJhbnNsYXRvci5DT01NRU5UX0ZFQVRVUkUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb21OYW1lQW5kUGF0aAotCSAqIEBwYXJhbSBhRmVhdHVyZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uc1RyYW5zbGF0b3IoU3RyaW5nIGRvbU5hbWVBbmRQYXRoLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIEFubm90YXRpb25zQWRhcHRlci5OT1RJRklDQVRJT05fRkVBVFVSRSwgc3R5bGUgfCBUcmFuc2xhdG9yLkNPTU1FTlRfRkVBVFVSRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnd0cC5lbWYueG1sLlRyYW5zbGF0b3Ijc2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldEhhbmRsZXIoKS5nZXRBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCWdldFBhcnNlcigpLnNldFBhcnNlcklucHV0KHZhbHVlLnRvU3RyaW5nKCkpOwotCQlnZXRQYXJzZXIoKS5wYXJzZSgpOwotCQlTdHJpbmcgbmFtZTsKLQkJTWFwIGFubm90YXRpb25zID0gZ2V0SGFuZGxlcigpLmdldEFubm90YXRpb25zKCk7Ci0JCWZvciAoSXRlcmF0b3Iga2V5cyA9IGFubm90YXRpb25zLmtleVNldCgpLml0ZXJhdG9yKCk7IGtleXMuaGFzTmV4dCgpOykgewotCQkJbmFtZSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotCQkJQW5ub3RhdGlvbnNBZGFwdGVyLmFkZEFubm90YXRpb25zKGVtZk9iamVjdCwgbmFtZSwgYW5ub3RhdGlvbnMuZ2V0KG5hbWUpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNTZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiBnZXRNT0ZWYWx1ZShlbWZPYmplY3QpICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgZW1mT2JqZWN0KSB7Ci0JCXJldHVybiBBbm5vdGF0aW9uc0FkYXB0ZXIuZ2V0QW5ub3RhdGlvbnMoZW1mT2JqZWN0LCBBbm5vdGF0aW9uc0FkYXB0ZXIuR0VORVJBVEVEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3VuU2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdW5TZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewotCQlBbm5vdGF0aW9uc0FkYXB0ZXIucmVtb3ZlQW5ub3RhdGlvbnMoZW1mT2JqZWN0LCBBbm5vdGF0aW9uc0FkYXB0ZXIuR0VORVJBVEVEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2ZlYXR1cmVFeGlzdHMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmVhdHVyZUV4aXN0cyhFT2JqZWN0IGVtZk9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzRGF0YVR5cGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNNYXBGb3IoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYXBGb3IoT2JqZWN0IGFGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gKGFGZWF0dXJlID09IGZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaGFuZGxlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCWhhbmRsZXIgPSBuZXcgQW5ub3RhdGVkQ29tbWVudEhhbmRsZXIoKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJzZXIuCi0JICovCi0JcHJvdGVjdGVkIEFubm90YXRpb25UYWdQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpCi0JCQlwYXJzZXIgPSBuZXcgQW5ub3RhdGlvblRhZ1BhcnNlcihnZXRIYW5kbGVyKCkpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0lBbm5vdGF0aW9uc1Byb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL0lBbm5vdGF0aW9uc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMWYzYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmFubm90YXRpb25zLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vaW50ZXJuYWwvYW5ub3RhdGlvbnMvY29yZS9JQW5ub3RhdGlvbnNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgY2xpZW50cyB0byBhbGxvdyB0aGVpciBvd24gYW5ub3RhdGlvbiBwcm92aWRlciB0byBkZXRhaWwgaW5mb3JtYXRpb24KLSAqIG9uIHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gRU9iamVjdCBpcyBhbm5vdGF0ZWQgZm9yIG9uZSBvZiB0aGVpciB0YWcgc2V0cy4KLSAqIAotICogQGF1dGhvciBqbGFudXRpCi0gKiBAcGxhbm5lZCBmb3IgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFubm90YXRpb25zUHJvdmlkZXIgewotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgcGFzc2VkIEVPYmplY3QgaXMgYW5ub3RhdGVkIGJ5IHlvdXIgYW5ub3RhdGlvbiBwcm92aWRlcgotCSAqIAotCSAqIEBwbGFubmVkIGZvciAyLjAKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZSBvZiBpc0Fubm90YXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkKEVPYmplY3QgZU9iamVjdCk7Ci0KLQkvKioKLQkgKiBUaGUgcGFzc2VkIGVPYmplY3QgbWF5IGhhdmUgYmVlbiBhbm5vdGVkLiAgSWYgdHJ1ZSwgaXQgaXMgZGVzaXJlZCB0bwotCSAqIGRldGVybWluZSB3aGljaCB7QGxpbmsgSUNvbXBpbGF0aW9uVW5pdH0gaGFzIHRoZSB0YWcgb3IgdGFncyB0aGF0IGNyZWF0ZWQKLQkgKiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcGxhbm5lZCBmb3IgMi4wCi0JICogQHBhcmFtIGVPYmplY3QgLSBBbiB7QGxpbmsgRU9iamVjdH0gdGhhdCBtYXkgYmUgYW5ub3RhdGVkLgotCSAqIEByZXR1cm4gdGhlIHtAbGluayBJQ29tcGlsYXRpb25Vbml0fSB0aGF0IGhhcyB0aGUgdGFnIHRoYXQgY3JlYXRlZCB0aGlzIGVPYmplY3QuCi0JICogCi0JICogQHNlZSAjZ2V0UHJpbWFyeVRhZ3NldChFT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldFByaW1hcnlBbm5vdGF0ZWRDb21waWxhdGlvblVuaXQoRU9iamVjdCBlT2JqZWN0KTsKLQotCS8qKgotCSAqIEl0IGlzIGRlc2lyZWQgdG8gb2J0YWluIHRoZSB0YWdzZXQgbmFtZSB3aGljaCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcGFzc2VkCi0JICogZU9iamVjdC4KLQkgKiAKLQkgKiBAcGxhbm5lZCBmb3IgMi4wCi0JICogQHBhcmFtIGVPYmplY3QgQW4ge0BsaW5rIEVPYmplY3R9IHdoaWNoIG1heSBiZSBhbm5vdGF0ZWQuCi0JICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgdGFnc2V0IHdoaWNoIGNyZWF0ZXMgdGhlIHBhc3NlZCBlT2JqZWN0LgotCSAqIAotCSAqIEBzZWUgI2dldFByaW1hcnlBbm5vdGF0ZWRDb21waWxhdGlvblVuaXQoRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlUYWdzZXQoRU9iamVjdCBlT2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvVGFnUGFyc2VFdmVudEhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvVGFnUGFyc2VFdmVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3OTQxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL1RhZ1BhcnNlRXZlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAxMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZTsKLQotCi0vKioKLSAqIFBhcnNlciBhbmQgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgd2FudCB0byByZWNlaXZlIHBhcnNpbmcgZXZlbnRzLiBXaGVuIHBhcnNpbmcgaXMgc3RhcnRlZAotICogdGhyb3VnaCB0aGUgPGNvZGU+cGFyc2UoKTwvY29kZT4gbWV0aG9kLCBldmVudCBtZXRob2RzIGFyZSBjYWxsZWQgZm9yIGludGVyZXN0aW5nIGZlYXR1cmVzIGluCi0gKiB0aGUgcGFyc2UuICggbGlrZSBhIFNBWCBDb250ZW50SGFuZGxlciApCi0gKiAKLSAqIEBhdXRob3IgUGF0IEtlbGxleQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ1BhcnNlRXZlbnRIYW5kbGVyIHsKLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBhbm5vdGF0aW9uIHRhZyBpcyBlbmNvdW50ZXJlZC4gVGhpcyB3aWxsIGFsd2F5cyBiZSB0aGUgZmlyc3QgcGllY2Ugb2YgY29udGVudAotCSAqIGVuY291bnRlcmVkLiBGb2xsb3dlZCBieSBhIGVuZE9mVGFnKCApIGNhbGwgd2hlbiB0aGUgZW5kIG9mIHRoZSB0YWcgaXMgcmVhY2hlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhbm5vdGF0aW9uVGFnKFRva2VuIHRhZyk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgZW50aXJlIGFubm90YXRpb24gZm9yIGEgc2luZ2xlIHRhZyBoYXMgYmVlbiBwYXJzZWQuCi0JICogCi0JICogQHBhcmFtIHBvcwotCSAqICAgICAgICAgICAgUG9zaXRpb24gaW4gdGhlIHN0cmVhbSBvZiB0aGUgZW5kIG9mIHRoZSBhbm5vdGF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVuZE9mVGFnKGludCBwb3MpOwotCi0JLyoqCi0JICogQ2FsbGVkIGZvciBldmVyeSBhdHRyaWJ1dGUgc2V0dGluZyBlbmNvdW50ZXJlZCBmb3IgYW4gYW5ub3RhdGlvbiB0YWcuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KLQkgKiBAcGFyYW0gZXF1YWxzUG9zaXRpb24KLQkgKiAgICAgICAgICAgIFNvdXJjZSBwb3NpdGlvbiBvZiB0aGUgZXF1YWxzIHNpZ24sIG9yIC0xIGlmIG5vIGVxdWFscyBzaWduIHdhcyBmb3VuZC4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUsIHdpdGggYW55IHF1b3RlcyBzdHJpcHBlZCBvZmYuIFdpbGwgYmUgemVybyBsZW5ndGggdG9rZW4gaWYKLQkgKiAgICAgICAgICAgIG5vIGF0dHJpYnV0ZSB3YXMgZm91bmQuCi0JICovCi0JcHVibGljIHZvaWQgYXR0cmlidXRlKFRva2VuIG5hbWUsIGludCBlcXVhbHNQb3NpdGlvbiwgVG9rZW4gdmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvVG9rZW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ludGVybmFsL2Fubm90YXRpb25zL2NvcmUvVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwMzEwMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9pbnRlcm5hbC9hbm5vdGF0aW9ucy9jb3JlL1Rva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMTEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLmFubm90YXRpb25zLmNvcmU7Ci0KLS8qKgotICogQSBzdHJpbmcsIGFuZCB0aGUgcmFuZ2UgaXQgd2FzIHRha2VuIGZyb20gaW4gdGhlIHNvdXJjZSBmaWxlLiBUaGUgcmFuZ2UgaXMgaW5jbHVzaXZlLiAoaWUsIHdpdGgKLSAqIHNvdXJjZSAiQUJDRCIsIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBmb3IgdGhlIFRva2VuICJCQyIgd291bGQgYmUgKDEsMikgKQotICogCi0gKiBAYXV0aG9yIFBhdCBLZWxsZXkKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFRva2VuIHsKLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCXByaXZhdGUgaW50IGJlZ2lubmluZzsKLQlwcml2YXRlIGludCBlbmQ7Ci0KLQotCi0JLyoqCi0JICogQHJldHVybiBQb3NpdGlvbiBpbiBvcmlnaW5hbCBzb3VyY2Ugb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGlzIHRva2VuLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QmVnaW5uaW5nKCkgewotCQlyZXR1cm4gYmVnaW5uaW5nOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUG9zaXRpb24gaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhpcyB0b2tlbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGVuZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSB0b2tlbiBzdHJpbmcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaQotCSAqICAgICAgICAgICAgQSBzb3VyY2UgcG9zaXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCZWdpbm5pbmcoaW50IGkpIHsKLQkJYmVnaW5uaW5nID0gaTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaQotCSAqICAgICAgICAgICAgQSBzb3VyY2UgcG9zaXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kKGludCBpKSB7Ci0JCWVuZCA9IGk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHN0cmluZykgewotCQl0ZXh0ID0gc3RyaW5nOwotCX0KLQotCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCQlyZXR1cm4gdGV4dC5sZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIDxjb2RlPnNyY1BvczwvY29kZT4gY29tZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoaXMgdG9rZW4uCi0JICogCi0JICogQHBhcmFtIHNyY1BvcwotCSAqICAgICAgICAgICAgQSBwb3NpdGlvbiBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHRoZSB0b2tlbiBjYW1lIGZyb20uCi0JICogQHJldHVybiB0cnVlIGlmIHNyY1BvcyBjb21lcyBpbW1lZGlhdGVseSBhZnRlciB0aGlzIHRva2VuLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGltbWVkaWF0ZWx5UHJlY2VkZXMoaW50IHNyY1BvcykgewotCQlyZXR1cm4gZW5kICsgMSA9PSBzcmNQb3M7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciBzcmNQb3MgaXMgd2l0aGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgcmFuZ2UgcmFuZ2Ugb2YgdGhlIHRva2VuLgotCSAqIAotCSAqIEBwYXJhbSBzcmNQb3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHNyY1BvcykgewotCQlyZXR1cm4gc3JjUG9zID49IGJlZ2lubmluZyAmJiBzcmNQb3MgPD0gZW5kOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ2YzFhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jb21tb24vKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC92YWxpZGF0aW9uLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZDI5YzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qZHRfaW50ZWdyYXRpb24uamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmMwYmNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxODM0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwNCAyMzoyNDo1MiBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNjNlMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjAzLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblZlbmRvcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuamF2YWxpdGUsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MuQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWRmMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Yzk3OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiCi0JbmFtZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcyIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlciIKLQkJZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZSIKLQkJZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YWQwM2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPUludGVncmF0aW9uIFBsdWctaW4KLXBsdWdpblZlbmRvcj1FY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWVlYWY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iY29udGV4dC5TZW5zaXRpdmUuQ2xhc3Mud29ya2luZ0NvcHlNYW5hZ2VyIgotICAgICAgICAgbmFtZT0iV29ya2luZyBDb3B5IE1hbmFnZXIgLSBIZWFkbGVzcyBDb250ZXh0IENsYXNzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS51dGlsLnVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzIj4KLSAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgICAga2V5PSJ3b3JraW5nQ29weU1hbmFnZXIiCi0gICAgICAgICAgICBjb250ZXh0PSJIZWFkbGVzcyIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb24uV1RQV29ya2luZ0NvcHlNYW5hZ2VyIj4KLSAgICAgIDwvdWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3M+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICBpZD0iamF2YVByb2plY3RWYWxpZGF0aW9uSGFuZGxlciIKLSAgICAgICAgbmFtZT0iamF2YVByb2plY3RWYWxpZGF0aW9uSGFuZGxlciIKLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyIj4KLSAgICAgIDx2YWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlcgotICAgICAgICBpZD0iamF2YVByb2plY3RWYWxpZGF0aW9uSGFuZGxlciIKLSAgICAgICAgaGFuZGxlckNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbi5KYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyIgotICAgICAgICBzZWxlY3Rpb25UeXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbCI+Ci0gICAgICA8ZWRpdE1vZGVsCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0ianN0LnV0aWxpdHkiCi0gICAgICAgICAgICBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uLkphdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkiPgotICAgICAgPC9lZGl0TW9kZWw+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgIDxmYWN0b3J5IAotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5pbnRlcm5hbC5KYXZhRmFjZXRJbnN0YWxsQ29uZmlnVG9EYXRhTW9kZWxBZGFwdGVyIiAKLSAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldEluc3RhbGxDb25maWciPgotICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsIi8+Ci0gICAgPC9mYWN0b3J5PgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgIDxmYWN0b3J5IAotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5pbnRlcm5hbC5EYXRhTW9kZWxUb0phdmFGYWNldEluc3RhbGxDb25maWdBZGFwdGVyIiAKLSAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbCI+Ci0gICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXRJbnN0YWxsQ29uZmlnIi8+Ci0gICAgPC9mYWN0b3J5PgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9mcmFtZXdvcmtzL0NvbW1vbkZyYW1ld29ya3NQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ZyYW1ld29ya3MvQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGM4ZGEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2ZyYW1ld29ya3MvQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIENvbW1vbkZyYW1ld29ya3NQbHVnaW4gCi0KLSAgICBleHRlbmRzIFdUUFBsdWdpbgotCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPVVJDRV9GT0xERVIgPSAiZGVmYXVsdFNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfRk9MREVSID0gIm91dHB1dEZvbGRlciI7IC8vJE5PTi1OTFMtMSQKLSAgIAotICAgIHByaXZhdGUgc3RhdGljIENvbW1vbkZyYW1ld29ya3NQbHVnaW4gaW5zdDsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcGx1Z2luIHNpbmdsZXRvbi4KLSAgICAgKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIENvbW1vbkZyYW1ld29ya3NQbHVnaW4gZ2V0RGVmYXVsdCgpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGluc3Q7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDb21tb25GcmFtZXdvcmtzUGx1Z2luKCkgewotICAgIAlzdXBlcigpOwotCQlpZiAoaW5zdCA9PSBudWxsKQotCQkJaW5zdCA9IHRoaXM7Ci0JfQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBQTFVHSU5fSUQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIEV4Y2VwdGlvbiBlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElMb2cgbG9nID0gQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSAiRW5jb3VudGVyZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24uIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAKLSAgICAgICAgbG9nLmxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIGUgKSApOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoRGVjb3JhdGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvQ2xhc3NwYXRoRGVjb3JhdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0Y2I1Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aERlY29yYXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuY2xhc3NwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc3BhdGhEZWNvcmF0aW9ucwotewotICAgIHByaXZhdGUgSVBhdGggc291cmNlQXR0YWNobWVudFBhdGg7Ci0gICAgcHJpdmF0ZSBJUGF0aCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGg7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZXh0cmFBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIAotICAgIHB1YmxpYyBJUGF0aCBnZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VBdHRhY2htZW50UGF0aDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0U291cmNlQXR0YWNobWVudFBhdGgoIGZpbmFsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRQYXRoICkKLSAgICB7Ci0gICAgICAgIHRoaXMuc291cmNlQXR0YWNobWVudFBhdGggPSBzb3VyY2VBdHRhY2htZW50UGF0aDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElQYXRoIGdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VBdHRhY2htZW50Um9vdFBhdGg7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCggZmluYWwgSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoICkKLSAgICB7Ci0gICAgICAgIHRoaXMuc291cmNlQXR0YWNobWVudFJvb3RQYXRoID0gc291cmNlQXR0YWNobWVudFJvb3RQYXRoOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGdldEV4dHJhQXR0cmlidXRlcygpCi0gICAgewotICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlW10gYXJyYXkgCi0gICAgICAgICAgICA9IG5ldyBJQ2xhc3NwYXRoQXR0cmlidXRlWyB0aGlzLmV4dHJhQXR0cmlidXRlcy5zaXplKCkgXTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiAoSUNsYXNzcGF0aEF0dHJpYnV0ZVtdKSB0aGlzLmV4dHJhQXR0cmlidXRlcy50b0FycmF5KCBhcnJheSApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRFeHRyYUF0dHJpYnV0ZXMoIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBhdHRycyApCi0gICAgewotICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5leHRyYUF0dHJpYnV0ZXMuYWRkKCBhdHRyc1sgaSBdICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRFeHRyYUF0dHJpYnV0ZSggZmluYWwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cgotICAgICAgICAgICAgPSBKYXZhQ29yZS5uZXdDbGFzc3BhdGhBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmV4dHJhQXR0cmlidXRlcy5hZGQoIGF0dHIgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9DbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhMzk5Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGg7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MuQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlcgotewotCXByaXZhdGUgZmluYWwgRmlsZSBmOwotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcCBkZWNvcmF0aW9uczsKLSAgICAKLSAgICBwdWJsaWMgQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyKCBmaW5hbCBTdHJpbmcgcGx1Z2luICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0gICAgICAgIGZpbmFsIEZpbGUgd3NkaXIgPSB3cy5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKTsKLSAgICAgICAgZmluYWwgRmlsZSB3c21kcm9vdCA9IG5ldyBGaWxlKCB3c2RpciwgIi5tZXRhZGF0YS8ucGx1Z2lucyIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmaW5hbCBGaWxlIHBtZHJvb3QgPSBuZXcgRmlsZSggd3NtZHJvb3QsIHBsdWdpbiApOwotICAgIAotICAgICAgICB0aGlzLmYgPSBuZXcgRmlsZSggcG1kcm9vdCwgImNsYXNzcGF0aC5kZWNvcmF0aW9ucy54bWwiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGhpcy5kZWNvcmF0aW9ucyA9IHJlYWQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENsYXNzcGF0aERlY29yYXRpb25zIGdldERlY29yYXRpb25zKCBmaW5hbCBTdHJpbmcga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudHJ5ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEhhc2hNYXAgc3VibWFwID0gKEhhc2hNYXApIHRoaXMuZGVjb3JhdGlvbnMuZ2V0KCBrZXkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBzdWJtYXAgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gKENsYXNzcGF0aERlY29yYXRpb25zKSBzdWJtYXAuZ2V0KCBlbnRyeSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlY29yYXRpb25zKCBmaW5hbCBTdHJpbmcga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzcGF0aERlY29yYXRpb25zIGRlYyApCi0gICAgewotICAgIAlIYXNoTWFwIHN1Ym1hcCA9IChIYXNoTWFwKSB0aGlzLmRlY29yYXRpb25zLmdldCgga2V5ICk7Ci0gICAgICAgIAotICAgICAgICBpZiggc3VibWFwID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdWJtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICAgICAgdGhpcy5kZWNvcmF0aW9ucy5wdXQoIGtleSwgc3VibWFwICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHN1Ym1hcC5wdXQoIGVudHJ5LCBkZWMgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY2xlYXJBbGxEZWNvcmF0aW9ucyggZmluYWwgU3RyaW5nIGtleSApCi0gICAgewotICAgIAl0aGlzLmRlY29yYXRpb25zLnJlbW92ZSgga2V5ICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F2ZSgpCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlIGZvbGRlciA9IHRoaXMuZi5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgIAotICAgICAgICBpZiggISBmb2xkZXIuZXhpc3RzKCkgJiYgISBmb2xkZXIubWtkaXJzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFByaW50V3JpdGVyIHcgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHcgPSBuZXcgUHJpbnRXcml0ZXIoIG5ldyBCdWZmZXJlZFdyaXRlciggbmV3IE91dHB1dFN0cmVhbVdyaXRlciggbmV3IEZpbGVPdXRwdXRTdHJlYW0oIHRoaXMuZiApLCAiVVRGLTgiICkgKSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIAotICAgICAgICAgICAgdy5wcmludGxuKCAiPGNsYXNzcGF0aD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJdGVyYXRvciBpdHIxID0gZGVjb3JhdGlvbnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyAKLSAgICAgICAgICAgICAgICAgaXRyMS5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXAuRW50cnkgZW50cnkxID0gKE1hcC5FbnRyeSkgaXRyMS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWFwIHN1Ym1hcCA9IChNYXApIGVudHJ5MS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHcucHJpbnQoICIgIDxjb250YWluZXIgaWQ9XCIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB3LnByaW50KCAoU3RyaW5nKSBlbnRyeTEuZ2V0S2V5KCkgKTsKLSAgICAgICAgICAgICAgICB3LnByaW50bG4oICJcIj4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0cjIgPSBzdWJtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyAKLSAgICAgICAgICAgICAgICAgICAgIGl0cjIuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXAuRW50cnkgZW50cnkyID0gKE1hcC5FbnRyeSkgaXRyMi5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc3BhdGhEZWNvcmF0aW9ucyBkZWMgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IChDbGFzc3BhdGhEZWNvcmF0aW9ucykgZW50cnkyLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB3LnByaW50KCAiICAgIDxlbnRyeSBpZD1cIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB3LnByaW50KCAoU3RyaW5nKSBlbnRyeTIuZ2V0S2V5KCkgKTsKLSAgICAgICAgICAgICAgICAgICAgdy5wcmludGxuKCAiXCI+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggZGVjLmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCkgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoICIgICAgICA8c291cmNlLWF0dGFjaG1lbnQtcGF0aD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoIGRlYy5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnRsbiggIjwvc291cmNlLWF0dGFjaG1lbnQtcGF0aD4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKCBkZWMuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCkgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnQoICIgICAgICA8c291cmNlLWF0dGFjaG1lbnQtcm9vdC1wYXRoPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCggZGVjLmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcucHJpbnRsbiggIjwvc291cmNlLWF0dGFjaG1lbnQtcm9vdC1wYXRoPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlW10gYXR0cnMgCi0gICAgICAgICAgICAgICAgICAgICAgICA9IGRlYy5nZXRFeHRyYUF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHIgPSBhdHRyc1sgaSBdOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCAiICAgICAgPGF0dHJpYnV0ZSBuYW1lPVwiIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50KCBhdHRyLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCggIlwiPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgdy5wcmludCggYXR0ci5nZXRWYWx1ZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3LnByaW50bG4oICI8L2F0dHJpYnV0ZT4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdy5wcmludGxuKCAiICAgIDwvZW50cnk+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHcucHJpbnRsbiggIiAgPC9jb250YWluZXI+IiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHcucHJpbnRsbiggIjwvY2xhc3NwYXRoPiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHcuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEhhc2hNYXAgcmVhZCgpCi0gICAgewotICAgICAgICBmaW5hbCBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIGlmKCAhIHRoaXMuZi5leGlzdHMoKSApIHJldHVybiBtYXA7Ci0KLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOwotICAgICAgICBFbGVtZW50IHJvb3QgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnkgCi0gICAgICAgICAgICAgICAgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIERvY3VtZW50QnVpbGRlciBkb2NidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKCBuZXcgRmlsZUlucHV0U3RyZWFtKCBmLmdldFBhdGgoKSksIlVURi04IikpOwotICAgICAgICAgICAgcm9vdCA9IGRvY2J1aWxkZXIucGFyc2UoIG5ldyBJbnB1dFNvdXJjZShpbikpLmdldERvY3VtZW50RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICByZXR1cm4gbWFwOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIGluICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGUgKSB7fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0cjEgPSBlbGVtZW50cyggcm9vdCwgImNvbnRhaW5lciIgKTsgaXRyMS5oYXNOZXh0KCk7ICkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBFbGVtZW50IGUxID0gKEVsZW1lbnQpIGl0cjEubmV4dCgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNpZCA9IGUxLmdldEF0dHJpYnV0ZSggImlkIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIEhhc2hNYXAgc3VibWFwID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgICAgIG1hcC5wdXQoIGNpZCwgc3VibWFwICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZvciggSXRlcmF0b3IgaXRyMiA9IGVsZW1lbnRzKCBlMSwgImVudHJ5IiApOyBpdHIyLmhhc05leHQoKTsgKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRWxlbWVudCBlMiA9IChFbGVtZW50KSBpdHIyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZWlkID0gZTIuZ2V0QXR0cmlidXRlKCAiaWQiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc3BhdGhEZWNvcmF0aW9ucyBkZWMgPSBuZXcgQ2xhc3NwYXRoRGVjb3JhdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzdWJtYXAucHV0KCBlaWQsIGRlYyApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciggSXRlcmF0b3IgaXRyMyA9IGVsZW1lbnRzKCBlMiApOyBpdHIzLmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgRWxlbWVudCBlMyA9IChFbGVtZW50KSBpdHIzLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG4gPSBlMy5nZXROb2RlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIG4uZXF1YWxzKCAic291cmNlLWF0dGFjaG1lbnQtcGF0aCIgKSApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVjLnNldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCBuZXcgUGF0aCggdGV4dCggZTMgKSApICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggbi5lcXVhbHMoICJzb3VyY2UtYXR0YWNobWVudC1yb290LXBhdGgiICkgKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlYy5zZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoIG5ldyBQYXRoKCB0ZXh0KCBlMyApICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBuLmVxdWFscyggImF0dHJpYnV0ZSIgKSApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBlMy5nZXRBdHRyaWJ1dGUoICJuYW1lIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWMuYWRkRXh0cmFBdHRyaWJ1dGUoIG5hbWUsIHRleHQoIGUzICkgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRleHQoIGZpbmFsIEVsZW1lbnQgZWwgKQotICAgIHsKLSAgICAgICAgZmluYWwgTm9kZUxpc3Qgbm9kZXMgPSBlbC5nZXRDaGlsZE5vZGVzKCk7Ci0KLSAgICAgICAgU3RyaW5nIHN0ciA9IG51bGw7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDAsIG4gPSBub2Rlcy5nZXRMZW5ndGgoKTsgaSA8IG47IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIE5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oIGkgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbCA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGJ1ZiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHZhbCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKCBzdHIgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHN0ciApOwotICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCB2YWwgKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHN0ciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciA9IHZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCBidWYgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJdGVyYXRvciBlbGVtZW50cyggZmluYWwgRWxlbWVudCBlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRzSXRlcmF0b3IoIGVsLCBuYW1lICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEl0ZXJhdG9yIGVsZW1lbnRzKCBmaW5hbCBFbGVtZW50IGVsICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRWxlbWVudHNJdGVyYXRvciggZWwsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBFbGVtZW50c0l0ZXJhdG9yCi0gICAgCi0gICAgICAgIGltcGxlbWVudHMgSXRlcmF0b3IKLSAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIE5vZGVMaXN0IG5vZGVzOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBsZW5ndGg7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0gICAgICAgIHByaXZhdGUgaW50IHBvc2l0aW9uOwotICAgICAgICBwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQotICAgICAgICBwdWJsaWMgRWxlbWVudHNJdGVyYXRvciggZmluYWwgRWxlbWVudCBwYXJlbnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm5vZGVzID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gLTE7Ci0gICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotCi0gICAgICAgICAgICBhZHZhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWR2YW5jZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7Ci0gICAgICAgICAgICB0aGlzLnBvc2l0aW9uKys7Ci0KLSAgICAgICAgICAgIGZvciggOyB0aGlzLnBvc2l0aW9uIDwgdGhpcy5sZW5ndGggJiYgdGhpcy5lbGVtZW50ID09IG51bGw7IAotICAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIE5vZGUgbm9kZSA9IHRoaXMubm9kZXMuaXRlbSggdGhpcy5wb3NpdGlvbiApOwotCi0gICAgICAgICAgICAgICAgaWYoIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJgotICAgICAgICAgICAgICAgICAgICAoIHRoaXMubmFtZSA9PSBudWxsIHx8IAotICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoIHRoaXMubmFtZSApICkgKSAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSAKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICggdGhpcy5lbGVtZW50ICE9IG51bGwgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIAotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBFbGVtZW50IGVsID0gdGhpcy5lbGVtZW50OwotCi0gICAgICAgICAgICBpZiggZWwgPT0gbnVsbCApIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFkdmFuY2UoKTsKLQotICAgICAgICAgICAgcmV0dXJuIGVsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9DbGFzc3BhdGhVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxNjFmNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0NsYXNzcGF0aFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuY2xhc3NwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc3BhdGhVdGlsCi17Ci0gICAgcHJpdmF0ZSBDbGFzc3BhdGhVdGlsKCkge30KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFNldCBnZXRSZXNvbHZlZENsYXNzcGF0aCggZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBlbnRyeVRvSWdub3JlICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRSZXNvbHZlZENsYXNzcGF0aCgganByb2osIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggZW50cnlUb0lnbm9yZSApICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0IGdldFJlc29sdmVkQ2xhc3NwYXRoKCBmaW5hbCBJSmF2YVByb2plY3QganByb2osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldCBlbnRyaWVzVG9JZ25vcmUgKQotICAgIHsKLSAgICAgICAgZmluYWwgU2V0IHJlc29sdmVkID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSAKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGpwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbIGkgXTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggZW50cmllc1RvSWdub3JlLmNvbnRhaW5zKCBlbnRyeS5nZXRQYXRoKCkgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgc3dpdGNoKCBlbnRyeS5nZXRFbnRyeUtpbmQoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmFkZCggZW50cnkuZ2V0UGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gSmF2YUNvcmUuZ2V0UmVzb2x2ZWRDbGFzc3BhdGhFbnRyeSggZW50cnkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVudHJ5ICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLmFkZCggZW50cnkuZ2V0UGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI6Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoIGVudHJ5LmdldFBhdGgoKSwganByb2ogKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKCBKYXZhTW9kZWxFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb250YWluZXIgIT0gbnVsbCApIAotICAgICAgICAgICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGNvbnRhaW5lckVudHJpZXMKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotCQotCSAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgY29udGFpbmVyRW50cmllcy5sZW5ndGg7IGorKyApCi0JICAgICAgICAgICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZC5hZGQoIGNvbnRhaW5lckVudHJpZXNbIGogXS5nZXRQYXRoKCkgKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gCi0gICAgICAgIGNhdGNoKCBKYXZhTW9kZWxFeGNlcHRpb24gZSApIAotICAgICAgICB7Ci0gICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIGUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc29sdmVkOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9GbGV4aWJsZVByb2plY3RDb250YWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvRmxleGlibGVQcm9qZWN0Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZWYwOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2NsYXNzcGF0aC9GbGV4aWJsZVByb2plY3RDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuY2xhc3NwYXRoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFjY2Vzc1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5Db21tb25GcmFtZXdvcmtzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZsZXhpYmxlUHJvamVjdENvbnRhaW5lcgotCi0gICAgaW1wbGVtZW50cyBJQ2xhc3NwYXRoQ29udGFpbmVyCi0KLXsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIFBhdGhUeXBlCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhdGhUeXBlIAotICAgICAgICAgICAgTElCX0RJUkVDVE9SWSA9IG5ldyBQYXRoVHlwZSgpLAotICAgICAgICAgICAgQ0xBU1NFU19ESVJFQ1RPUlkgPSBuZXcgUGF0aFR5cGUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyIGRlY29yYXRpb25zOyAKLQotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIHJlc291cmNlIGxpc3RlbmVyIHRoYXQgd2lsbCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8KLSAgICAgICAgLy8gcmVzb3VyY2VzIHJlbGV2YW50IHRvIGZsZXhpYmxlIHByb2plY3QgY29udGFpbmVycyBhY3Jvc3MgdGhlCi0gICAgICAgIC8vIHdvcmtzcGFjZSBhbmQgcmVmcmVzaCB0aGVtIGFzIG5lY2Vzc2FyeS4KLSAgICAgICAgCi0gICAgICAgIExpc3RlbmVyLnJlZ2lzdGVyKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBSZWFkIHRoZSBkZWNvcmF0aW9ucyBmcm9tIHRoZSB3b3Jrc3BhY2UgbWV0YWRhdGEuCi0gICAgICAgIAotICAgICAgICBmaW5hbCBTdHJpbmcgcGx1Z2luID0gQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5QTFVHSU5fSUQ7Ci0gICAgICAgIGRlY29yYXRpb25zID0gbmV3IENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlciggcGx1Z2luICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUiA9ICIhIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlY29yYXRpb25NYW5hZ2VyS2V5KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb250YWluZXIpewotICAgIAlyZXR1cm4gcHJvamVjdC5nZXROYW1lKCkgKyBTRVBBUkFUT1IgKyBjb250YWluZXI7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBmaW5hbCBJUGF0aCBwYXRoOwotICAgIHByb3RlY3RlZCBmaW5hbCBJSmF2YVByb2plY3Qgb3duZXI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJUGF0aFtdIHBhdGhzOwotICAgIHByaXZhdGUgZmluYWwgUGF0aFR5cGVbXSBwYXRoVHlwZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0IGVudHJpZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcGVudHJpZXM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0IGNvbnRhaW5lclR5cGVzID0gbmV3IEhhc2hTZXQoKTsKLSAgICAKLSAgICBwdWJsaWMgRmxleGlibGVQcm9qZWN0Q29udGFpbmVyKCBmaW5hbCBJUGF0aCBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBvd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoW10gcGF0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGF0aFR5cGVbXSB0eXBlcyApCi0gICAgewotICAgICAgICB0aGlzLnBhdGggPSBwYXRoOwotICAgICAgICB0aGlzLm93bmVyID0gb3duZXI7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gICAgICAgIHRoaXMucGF0aHMgPSBwYXRoczsKLSAgICAgICAgdGhpcy5wYXRoVHlwZXMgPSB0eXBlczsKLSAgICAgICAgCi0gICAgICAgIGlmKCAhIGlzRmxleGlibGVQcm9qZWN0KCB0aGlzLnByb2plY3QgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFNpbGVudGx5IG5vb3AgaWYgdGhlIHJlZmVyZW5jZWQgcHJvamVjdCBpcyBub3QgYSBmbGV4aWJsZQotICAgICAgICAgICAgLy8gcHJvamVjdC4gU2hvdWxkIEkgYmUgZG9pbmcgc29tZXRoaW5nIGVsc2UgaGVyZT8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdGhpcy5lbnRyaWVzID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgICAgICAgICAgIHRoaXMuY3BlbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVsgMCBdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGFkZEZsZXhpYmxlUHJvamVjdENvbnRhaW5lclR5cGUoIHBhdGguc2VnbWVudCggMCApICk7Ci0gICAgICAgIAotICAgICAgICB0aGlzLmVudHJpZXMgPSBjb21wdXRlQ2xhc3NwYXRoRW50cmllcygpOwotICAgICAgICB0aGlzLmNwZW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbIHRoaXMuZW50cmllcy5zaXplKCkgXTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwLCBuID0gdGhpcy5lbnRyaWVzLnNpemUoKTsgaSA8IG47IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIElQYXRoIGVudHJ5UGF0aCA9IChJUGF0aCkgdGhpcy5lbnRyaWVzLmdldCggaSApOwotICAgICAgICAgICAgSVJlc291cmNlIHJlc291cmNlID1SZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZW50cnlQYXRoKTsgCi0gICAgICAgICAgICBpZihudWxsICE9IHJlc291cmNlICYmIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLSAgICAgICAgICAgICAgICB0aGlzLmNwZW50cmllc1sgaSBdID0gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KGVudHJ5UGF0aCwgZmFsc2UpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRoaXMuY3BlbnRyaWVzWyBpIF0gPSBuZXdMaWJyYXJ5RW50cnkoIGVudHJ5UGF0aCApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBpbnQgZ2V0S2luZCgpCi0gICAgewotICAgICAgICByZXR1cm4gS19BUFBMSUNBVElPTjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSVBhdGggZ2V0UGF0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5wYXRoOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUNsYXNzcGF0aEVudHJ5W10gZ2V0Q2xhc3NwYXRoRW50cmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcy5jcGVudHJpZXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzT3V0T2ZEYXRlKCBmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSApCi0gICAgewotICAgICAgICBpZiggZGVsdGEgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZmluYWwgTGlzdCBjdXJyZW50RW50cmllcyA9IGNvbXB1dGVDbGFzc3BhdGhFbnRyaWVzKCk7Ci0gICAgICAgIHJldHVybiAhIHRoaXMuZW50cmllcy5lcXVhbHMoIGN1cnJlbnRFbnRyaWVzICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlZnJlc2goKTsKLSAgICAKLSAgICBzdGF0aWMgQ2xhc3NwYXRoRGVjb3JhdGlvbnNNYW5hZ2VyIGdldERlY29yYXRpb25zTWFuYWdlcigpCi0gICAgewotICAgICAgICByZXR1cm4gZGVjb3JhdGlvbnM7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBJVmlydHVhbFJlZmVyZW5jZSBbXSBjb21wdXRlUmVmZXJlbmNlcyhJVmlydHVhbENvbXBvbmVudCB2Yyl7Ci0gICAgCXJldHVybiB2Yy5nZXRSZWZlcmVuY2VzKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdCBjb21wdXRlQ2xhc3NwYXRoRW50cmllcygpCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJVmlydHVhbENvbXBvbmVudCB2YyAKLSAgICAgICAgICAgID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoIHRoaXMucHJvamVjdCApOwotICAgICAgICAKLSAgICAgICAgaWYoIHZjID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZW50cmllczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gY29tcHV0ZVJlZmVyZW5jZXModmMpOwotICAgICAgICBJVmlydHVhbENvbXBvbmVudCBjb21wID0gbnVsbDsKLSAgICAgICAgU2V0IGphcnNIYW5kbGVkID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgU3RyaW5nIGphck5hbWUgPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNvbXAgPSByZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLSAgICAgICAgICAgIGlmICghcmVmc1tpXS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhwYXRoc1swXS5tYWtlQWJzb2x1dGUoKSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBqYXJOYW1lID0gcmVmc1tpXS5nZXRBcmNoaXZlTmFtZSgpOwotICAgICAgICAgICAgaWYobnVsbCAhPSBqYXJOYW1lKXsKLSAgICAgICAgICAgICAgICBqYXJzSGFuZGxlZC5hZGQoamFyTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJUGF0aCBuZXdQYXRoID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChjb21wLmlzQmluYXJ5KCkpIHsKLSAgICAgICAgICAgICAgICBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBhcmNoaXZlQ29tcCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgY29tcDsKLSAgICAgICAgICAgICAgICBpZiAoYXJjaGl2ZUNvbXAuZ2V0QXJjaGl2ZVR5cGUoKS5lcXVhbHMoVmlydHVhbEFyY2hpdmVDb21wb25lbnQuQ0xBU1NQQVRIQVJDSElWRVRZUEUpKSB7Ci0gICAgICAgICAgICAgICAgCS8vIGRvIG5vdCBwcm9jZXNzIGNvbXBvbmVudHMgZHluYW1pY2FsbHkgY29tcHV0ZWQgZnJvbSB0aGUgSmF2YSBjbGFzc3BhdGgKLSAgICAgICAgICAgICAgICAJY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGphdmEuaW8uRmlsZSBkaXNrRmlsZSA9IGFyY2hpdmVDb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotICAgICAgICAgICAgICAgIGlmIChkaXNrRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIAluZXdQYXRoID1uZXcgUGF0aChkaXNrRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgSUZpbGUgaUZpbGUgPSBhcmNoaXZlQ29tcC5nZXRVbmRlcmx5aW5nV29ya2JlbmNoRmlsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWVudHJpZXMuY29udGFpbnMoaUZpbGUuZ2V0RnVsbFBhdGgoKSkpewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0aCA9IGlGaWxlLmdldEZ1bGxQYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBjb21wLmdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICBuZXdQYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOyAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAJaWYoIG5ld1BhdGggIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW50cmllcy5hZGQoIG5ld1BhdGggKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB0aGlzLnBhdGhzLmxlbmd0aDsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IHZjLmdldFJvb3RGb2xkZXIoKTsKLSAgICAgICAgICAgIGZpbmFsIElWaXJ0dWFsRm9sZGVyIHZmID0gcm9vdEZvbGRlci5nZXRGb2xkZXIoIHBhdGhzWyBpIF0gKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHRoaXMucGF0aFR5cGVzWyBpIF0gPT0gUGF0aFR5cGUuTElCX0RJUkVDVE9SWSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVZpcnR1YWxSZXNvdXJjZVtdIGNvbnRlbnRzOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGVudHMgPSBtZW1iZXJzKCB2ZiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbW1vbkZyYW1ld29ya3NQbHVnaW4ubG9nKCBlICk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgY29udGVudHMubGVuZ3RoOyBqKysgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVJlc291cmNlIHIgPSBjb250ZW50c1sgaiBdLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwID0gci5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoIWphcnNIYW5kbGVkLmNvbnRhaW5zKHAubGFzdFNlZ21lbnQoKSkgJiYgIGlzSmFyRmlsZSggciApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgamFyc0hhbmRsZWQuYWRkKHAubGFzdFNlZ21lbnQoKSk7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIAllbnRyaWVzLmFkZCggcCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElDb250YWluZXJbXSB1ZiA9IHZmLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCB1Zi5sZW5ndGg7IGorKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwID0gdWZbIGogXS5nZXRGdWxsUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYoICEgamFyc0hhbmRsZWQuY29udGFpbnMoIHAubGFzdFNlZ21lbnQoKSApICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgISBpc1NvdXJjZU9yT3V0cHV0RGlyZWN0b3J5KCBwICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXJzSGFuZGxlZC5hZGQocC5sYXN0U2VnbWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgCWVudHJpZXMuYWRkKCBwICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZW50cmllczsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBUaGlzIG1ldGhvZCB3YXMgY3JlYXRlZCB0byBwcm92aWRlIGEgc2FmZSBsYXN0LW1pbnV0ZSB3b3JrYXJvdW5kCi0gICAgLy8gZm9yIHRoZSBpc3N1ZSBkZXNjcmliZWQgaW4gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2Mjk3NC4KLSAgICAvLyBUaGlzIGNvZGUgbmVlZHMgdG8gYmUgcmV2aXNpdGVkIGluIGEgZnV0dXJlIHJlbGVhc2UgdG8gZmluZCBhIG1vcmUKLSAgICAvLyBwZXJtYW5lbnQgc29sdXRpb24uCi0KLSAgICBwcm90ZWN0ZWQgSVZpcnR1YWxSZXNvdXJjZVtdIG1lbWJlcnMoIGZpbmFsIElWaXJ0dWFsRm9sZGVyIHZmICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uIAotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHJldHVybiB2Zi5tZW1iZXJzKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSUNsYXNzcGF0aEVudHJ5IG5ld0xpYnJhcnlFbnRyeSggZmluYWwgSVBhdGggcCApCi0gICAgewotICAgICAgICBJUGF0aCBzcmNwYXRoID0gbnVsbDsKLSAgICAgICAgSVBhdGggc3Jjcm9vdHBhdGggPSBudWxsOwotICAgICAgICBJQ2xhc3NwYXRoQXR0cmlidXRlW10gYXR0cnMgPSB7fTsKLSAgICAgICAgSUFjY2Vzc1J1bGVbXSBhY2Nlc3MgPSB7fTsKLSAgICAgICAgCi0gICAgICAgIGZpbmFsIENsYXNzcGF0aERlY29yYXRpb25zIGRlYyAKLSAgICAgICAgICAgID0gZGVjb3JhdGlvbnMuZ2V0RGVjb3JhdGlvbnMoIGdldERlY29yYXRpb25NYW5hZ2VyS2V5KHByb2plY3QsIGdldFBhdGgoKS50b1N0cmluZygpKSwgcC50b1N0cmluZygpICk7Ci0gICAgICAgIAotICAgICAgICBpZiggZGVjICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzcmNwYXRoID0gZGVjLmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7Ci0gICAgICAgICAgICBzcmNyb290cGF0aCA9IGRlYy5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKTsKLSAgICAgICAgICAgIGF0dHJzID0gZGVjLmdldEV4dHJhQXR0cmlidXRlcygpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KCBwLCBzcmNwYXRoLCBzcmNyb290cGF0aCwgYWNjZXNzLCBhdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NvdXJjZU9yT3V0cHV0RGlyZWN0b3J5KCBmaW5hbCBJUGF0aCBhUGF0aCApCi0gICAgewotICAgICAgICBpZiggaXNKYXZhUHJvamVjdCggdGhpcy5wcm9qZWN0ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QganByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoIHRoaXMucHJvamVjdCApOwotICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGNwID0ganByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BlID0gY3BbIGkgXTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKCBjcGUuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBzcmMgPSBjcGUuZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVBhdGggb3V0cHV0ID0gY3BlLmdldE91dHB1dExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzcmMuZXF1YWxzKCBhUGF0aCApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICE9IG51bGwgJiYgb3V0cHV0LmVxdWFscyggYVBhdGggKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGpwcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCkuZXF1YWxzKCBhUGF0aCApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBKYXZhTW9kZWxFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7ICAgIAotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSmF2YVByb2plY3QoIGZpbmFsIElQcm9qZWN0IHBqICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGouZ2V0TmF0dXJlKCBKYXZhQ29yZS5OQVRVUkVfSUQgKSAhPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRmxleGlibGVQcm9qZWN0KCBmaW5hbCBJUHJvamVjdCBwaiApCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHBqLmdldE5hdHVyZSggSU1vZHVsZUNvbnN0YW50cy5NT0RVTEVfTkFUVVJFX0lEICkgIT0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNKYXJGaWxlKCBmaW5hbCBJUmVzb3VyY2UgZiApCi0gICAgewotICAgICAgICBpZiggZi5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm5hbWUgPSBmLmdldE5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGZuYW1lLmVuZHNXaXRoKCAiLmphciIgKSB8fCBmbmFtZS5lbmRzV2l0aCggIi56aXAiICkgKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWV0YWRhdGFGaWxlKCBmaW5hbCBJUmVzb3VyY2UgZiApCi0gICAgewotICAgICAgICBpZiggZi5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm5hbWUgPSBmLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgaWYoIGZuYW1lLmVxdWFscyggIi5jb21wb25lbnQiICkgfHwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIGZuYW1lLmVxdWFscyggIm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50IiApIHx8IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBmbmFtZS5lcXVhbHMoICIuY2xhc3NwYXRoIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRmxleGlibGVQcm9qZWN0Q29udGFpbmVyKCBmaW5hbCBJUGF0aCBwYXRoICkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCggY29udGFpbmVyVHlwZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyVHlwZXMuY29udGFpbnMoIHBhdGguc2VnbWVudCggMCApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRGbGV4aWJsZVByb2plY3RDb250YWluZXJUeXBlKCBmaW5hbCBTdHJpbmcgdHlwZSApCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQoIGNvbnRhaW5lclR5cGVzICkKLSAgICAgICAgewotICAgICAgICAgICAgY29udGFpbmVyVHlwZXMuYWRkKCB0eXBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTGlzdGVuZXIKLSAgICAKLSAgICAgICAgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCk7Ci0gICAgICAgICAgICBmaW5hbCBJV29ya3NwYWNlIHdzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotICAgICAgICAgICAgd3MuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciggbGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoIGZpbmFsIElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50ICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU2NyZWVuIHRoZSBkZWx0YSBiZWZvcmUgZ29pbmcgYW55IGZ1cnRoZXIuIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggISBpc0ludGVyZXN0aW5nRXZlbnQoIGV2ZW50ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTG9jYXRlIGFsbCBvZiB0aGUgZmxleGlibGUgcHJvamVjdCBjb250YWluZXJzLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBBcnJheUxpc3QgY29udGFpbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVByb2plY3RbXSBwcm9qZWN0cyAKLSAgICAgICAgICAgICAgICA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzWyBpIF07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggaXNKYXZhUHJvamVjdCggcHJvamVjdCApICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qID0gSmF2YUNvcmUuY3JlYXRlKCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjcGVzID0ganByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgY3Blcy5sZW5ndGg7IGorKyApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZSA9IGNwZXNbIGogXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gY3BlLmdldFBhdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY3BlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmxleGlibGVQcm9qZWN0Q29udGFpbmVyKCBwYXRoICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aENvbnRhaW5lciBjb250Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lciggcGF0aCwganByb2ogKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcnMuYWRkKCBjb250ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoKCBKYXZhTW9kZWxFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb21tb25GcmFtZXdvcmtzUGx1Z2luLmxvZyggZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUmVmcmVzaCB0aGUgY29udGFpbmVycyB0aGF0IGFyZSBvdXQgb2YgZGF0ZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IGNvbnRhaW5lcnMuc2l6ZSgpOyBpIDwgbjsgaSsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBGbGV4aWJsZVByb2plY3RDb250YWluZXIgYyAKLSAgICAgICAgICAgICAgICAgICAgPSAoRmxleGlibGVQcm9qZWN0Q29udGFpbmVyKSBjb250YWluZXJzLmdldCggaSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmKCBjLmlzT3V0T2ZEYXRlKCBkZWx0YSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGMucmVmcmVzaCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbnRlcmVzdGluZ0V2ZW50KCBmaW5hbCBJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW5bXSByZXN1bHQgPSBuZXcgYm9vbGVhblsgMSBdOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHZpc2l0KCBmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSApIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSVJlc291cmNlIHIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCByLmdldFR5cGUoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlLlJPT1Q6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElSZXNvdXJjZS5QUk9KRUNUOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KCAoSVByb2plY3QpIHIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlLkZPTERFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigga2luZCA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WyAwIF0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVJlc291cmNlLkZJTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlzSmFyRmlsZSggciApIHx8IGlzTWV0YWRhdGFGaWxlKCByICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0WyAwIF0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV2ZW50LmdldERlbHRhKCkuYWNjZXB0KCB2aXNpdG9yLCBmYWxzZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2coIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFsgMCBdOwotICAgICAgICB9Ci0gICAgfQotICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvRmxleGlibGVQcm9qZWN0Q29udGFpbmVySW5pdGlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9jbGFzc3BhdGgvRmxleGlibGVQcm9qZWN0Q29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1NDA2OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvY2xhc3NwYXRoL0ZsZXhpYmxlUHJvamVjdENvbnRhaW5lckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuY2xhc3NwYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGbGV4aWJsZVByb2plY3RDb250YWluZXJJbml0aWFsaXplciAKLQotICAgIGV4dGVuZHMgQ2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIKLQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlciBkZWNvcmF0aW9ucwotICAgICAgICA9IEZsZXhpYmxlUHJvamVjdENvbnRhaW5lci5nZXREZWNvcmF0aW9uc01hbmFnZXIoKTsKLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5VcGRhdGVDbGFzc3BhdGhDb250YWluZXIoIGZpbmFsIElQYXRoIGNvbnRhaW5lclBhdGgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3QpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7IAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUoIGZpbmFsIElQYXRoIGNvbnRhaW5lclBhdGgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIHNnICkgCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAJZmluYWwgU3RyaW5nIGtleSA9IEZsZXhpYmxlUHJvamVjdENvbnRhaW5lci5nZXREZWNvcmF0aW9uTWFuYWdlcktleShwcm9qZWN0LmdldFByb2plY3QoKSwgY29udGFpbmVyUGF0aC50b1N0cmluZygpKTsKLSAgICAJCi0gICAgCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBzZy5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci0gICAgICAgIAotICAgICAgICBkZWNvcmF0aW9ucy5jbGVhckFsbERlY29yYXRpb25zKCBrZXkgKTsKLSAgICAgICAgCi0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGVudHJpZXNbIGkgXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgSVBhdGggc3JjcGF0aCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7Ci0gICAgICAgICAgICBmaW5hbCBJUGF0aCBzcmNyb290cGF0aCA9IGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpOwotICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJzID0gZW50cnkuZ2V0RXh0cmFBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBzcmNwYXRoICE9IG51bGwgfHwgYXR0cnMubGVuZ3RoID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVpZCA9IGVudHJ5LmdldFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzcGF0aERlY29yYXRpb25zIGRlYyA9IG5ldyBDbGFzc3BhdGhEZWNvcmF0aW9ucygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGRlYy5zZXRTb3VyY2VBdHRhY2htZW50UGF0aCggc3JjcGF0aCApOwotICAgICAgICAgICAgICAgIGRlYy5zZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoIHNyY3Jvb3RwYXRoICk7Ci0gICAgICAgICAgICAgICAgZGVjLnNldEV4dHJhQXR0cmlidXRlcyggYXR0cnMgKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkZWNvcmF0aW9ucy5zZXREZWNvcmF0aW9ucygga2V5LCBlaWQsIGRlYyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBkZWNvcmF0aW9ucy5zYXZlKCk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lcgotICAgICAgICAgICAgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoIGNvbnRhaW5lclBhdGgsIHByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgICggKEZsZXhpYmxlUHJvamVjdENvbnRhaW5lcikgY29udGFpbmVyICkucmVmcmVzaCgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhQXJ0aWZhY3RFZGl0TW9kZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhQXJ0aWZhY3RFZGl0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4NzA0NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZWZlcmVuY2VkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWwgZXh0ZW5kcyBBcnRpZmFjdEVkaXRNb2RlbCBpbXBsZW1lbnRzIFdvcmtpbmdDb3B5UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBXb3JraW5nQ29weU1hbmFnZXIgd29ya2luZ0NvcHlNYW5hZ2VyID0gbnVsbDsKLQotCXB1YmxpYyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWwoU3RyaW5nIGFuRWRpdE1vZGVsSWQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgYm9vbGVhbiB0b01ha2VSZWFkT25seSwKLQkJCWJvb2xlYW4gdG9BY2Nlc3NVbmtub3duUmVzb3VyY2VzQXNSZWFkT25seSwgVVJJIG1vZHVsZVVSSSwgVVJJIHJvb3RVUkksIFN0cmluZyByb290Q29udGVudFR5cGUpIHsKLQkJc3VwZXIoYW5FZGl0TW9kZWxJZCwgY29udGV4dCwgdG9NYWtlUmVhZE9ubHksIHRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHksIG1vZHVsZVVSSSwgcm9vdFVSSSwgcm9vdENvbnRlbnRUeXBlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIEphdmFBcnRpZmFjdEVkaXRNb2RlbChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgYm9vbGVhbiB0b01ha2VSZWFkT25seSwgVVJJIG1vZHVsZVVSSSwgVVJJIHJvb3RVUkksCi0JCQlTdHJpbmcgcm9vdENvbnRlbnRUeXBlKSB7Ci0JCXN1cGVyKGVkaXRNb2RlbElELCBjb250ZXh0LCB0b01ha2VSZWFkT25seSwgbW9kdWxlVVJJLCByb290VVJJLCByb290Q29udGVudFR5cGUpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYW5FZGl0TW9kZWxJZAotCSAqIEBwYXJhbSBhQ29udGV4dAotCSAqIEBwYXJhbSB0b01ha2VSZWFkT25seQotCSAqIEBwYXJhbSB0b0FjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5Ci0JICogQHBhcmFtIGFNb2R1bGVVUkkKLQkgKi8KLQlwdWJsaWMgSmF2YUFydGlmYWN0RWRpdE1vZGVsKFN0cmluZyBhbkVkaXRNb2RlbElkLCBFTUZXb3JrYmVuY2hDb250ZXh0IGFDb250ZXh0LCBib29sZWFuIHRvTWFrZVJlYWRPbmx5LCBib29sZWFuIHRvQWNjZXNzVW5rbm93blJlc291cmNlc0FzUmVhZE9ubHksIFVSSSBhTW9kdWxlVVJJKSB7Ci0JCXN1cGVyKGFuRWRpdE1vZGVsSWQsIGFDb250ZXh0LCB0b01ha2VSZWFkT25seSwKLQkJCQl0b0FjY2Vzc1Vua25vd25SZXNvdXJjZXNBc1JlYWRPbmx5LCBhTW9kdWxlVVJJKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFuRWRpdE1vZGVsSWQKLQkgKiBAcGFyYW0gYUNvbnRleHQKLQkgKiBAcGFyYW0gdG9NYWtlUmVhZE9ubHkKLQkgKiBAcGFyYW0gYU1vZHVsZVVSSQotCSAqLwotCXB1YmxpYyBKYXZhQXJ0aWZhY3RFZGl0TW9kZWwoU3RyaW5nIGFuRWRpdE1vZGVsSWQsIEVNRldvcmtiZW5jaENvbnRleHQgYUNvbnRleHQsIGJvb2xlYW4gdG9NYWtlUmVhZE9ubHksIFVSSSBhTW9kdWxlVVJJKSB7Ci0JCXN1cGVyKGFuRWRpdE1vZGVsSWQsIGFDb250ZXh0LCB0b01ha2VSZWFkT25seSwgYU1vZHVsZVVSSSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBkZWxldGUKLQkgKiAKLQkgKiBAY3UgZnJvbSB0aGUgd29ya2JlbmNoIGFuZCBmaXggdGhlIGludGVybmFsIHJlZmVyZW5jZXMgZm9yIHRoaXMgd29ya2luZyBjb3B5IG1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgY3UsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuZGVsZXRlKGN1LCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIEoyRUVOYXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9EaXNwb3NlKCkgewotCQlzdXBlci5kb0Rpc3Bvc2UoKTsKLQkJcmVzZXRXb3JraW5nQ29weU1hbmFnZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU2V0IGdldEFmZmVjdGVkRmlsZXMoKSB7Ci0JCWphdmEudXRpbC5TZXQgYWZmZWN0ZWQgPSBzdXBlci5nZXRBZmZlY3RlZEZpbGVzKCk7Ci0JCWlmIChnZXRXb3JraW5nQ29weU1hbmFnZXIoKSAhPSBudWxsKQotCQkJYWZmZWN0ZWQuYWRkQWxsKGdldFdvcmtpbmdDb3B5TWFuYWdlcigpLmdldEFmZmVjdGVkRmlsZXMoKSk7Ci0JCi0JCXJldHVybiBhZmZlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gZWRpdG9yCi0JICogaW5wdXQuIERvZXMgbm90IGNvbm5lY3QgdGhlIGVkaXQgbW9kZWwgdG8gdGhlIHdvcmtpbmcgY29weS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnB1dCBkb2VzCi0JICogICAgICAgICBub3QgZW5jb2RlIGFuIGVkaXRvciBpbnB1dCwgb3IgaWYgdGhlcmUgaXMgbm8gcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMKLQkgKiAgICAgICAgIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCBnZXRFeGlzdGluZ1dvcmtpbmdDb3B5KG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5nZXRFeGlzdGluZ1dvcmtpbmdDb3B5KGN1KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotCSAqICAgICAgICAgcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IGdldFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UsIGJvb2xlYW4gZm9yTmV3Q1UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFdvcmtpbmdDb3B5TWFuYWdlcigpLmdldFdvcmtpbmdDb3B5KGN1LCBmb3JOZXdDVSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgbmV3IGNvbXBpbGF0aW9uIHVuaXRzIG9ubHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2F2ZUlmTmVjZXNzYXJ5RGlkTm90U2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuc2F2ZU9ubHlOZXdDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud29ya2JlbmNoLkoyRUVFZGl0TW9kZWwjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJYm9vbGVhbiBkaXJ0eUJvb2wgPSBzdXBlci5pc0RpcnR5KCk7Ci0JCWlmICghZGlydHlCb29sICYmIGdldFdvcmtpbmdDb3B5TWFuYWdlcigpICE9IG51bGwpCi0JCQlkaXJ0eUJvb2wgPSBnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5oYXNXb3JraW5nQ29waWVzKCk7Ci0JCXJldHVybiBkaXJ0eUJvb2w7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGZvcmNlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBSZXNvdXJjZXMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbVNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXNhdmVDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCQlpZiAobW9uaXRvciA9PSBudWxsIHx8ICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXN1cGVyLnByaW1TYXZlKG1vbml0b3IpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBydW5TYXZlT3BlcmF0aW9uKElXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgU2F2ZUZhaWxlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsLElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLG1vbml0b3IpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDQ6MTQ6MjYgUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuU2V0Ci0JICovCi0JcHVibGljIHZvaWQgcHJvY2Vzc1Jlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwgJiYgIWdldFJlc291cmNlcygpLmNvbnRhaW5zKGFSZXNvdXJjZSkpIHsKLQkJCWlmIChhUmVzb3VyY2UgaW5zdGFuY2VvZiBSZWZlcmVuY2VkUmVzb3VyY2UpIHsKLQkJCQlhY2Nlc3MoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKTsKLQkJCQkvL1dlIG5lZWQgYSBiZXR0ZXIgd2F5IHRvIHBhc3MgdGhpcyB0aHJvdWdoIHRoZSBzYXZlIG9wdGlvbnMgaW5zdGVhZC4KLQkJCQkvL1dlIGFsc28gbmVlZCB0byBtYWtlIHRoaXMgZHluYW1pYyBiYXNlZCBvbiB0aGUgcHJvamVjdCB0YXJnZXQKLQkJCQkoKFJlZmVyZW5jZWRSZXNvdXJjZSkgYVJlc291cmNlKS5zZXRGb3JtYXQoQ29tcGF0aWJpbGl0eVhNSVJlc291cmNlLkZPUk1BVF9NT0Y1KTsKLQkJCX0gZWxzZSBpZiAoIWlzUmVhZE9ubHkoKSkKLQkJCQlhUmVzb3VyY2Uuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCQlhZGRSZXNvdXJjZShhUmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVsZWFzZSBlYWNoIG9mIHRoZSByZWZlcmVuY2VkIHJlc291cmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlKFJlc291cmNlIGFSZXNvdXJjZSkgewotCQotCQlyZW1vdmVSZXNvdXJjZShhUmVzb3VyY2UpOwotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gaXNSZWZSZXMgPSBhUmVzb3VyY2UgaW5zdGFuY2VvZiBSZWZlcmVuY2VkUmVzb3VyY2U7Ci0JCQlpZiAoaXNSZWZSZXMpCi0JCQkJcmVsZWFzZSgoUmVmZXJlbmNlZFJlc291cmNlKSBhUmVzb3VyY2UpOwotCQkJaWYgKCFpc0Rpc3Bvc2luZygpKQotCQkJCXJlc2V0V29ya2luZ0NvcHlNYW5hZ2VyKCk7Ci0JCQl9Ci0JCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud29ya2JlbmNoLkoyRUVFZGl0TW9kZWwjcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLAotCSAqICAgICAgYm9vbGVhbiwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNvdXJjZUlzTG9hZGVkQ2hhbmdlZChSZXNvdXJjZSBhUmVzb3VyY2UsIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJaWYgKCFpc1JldmVydGluZyAmJiAhZGlzcG9zaW5nICYmICFpc1JlYWRPbmx5KCkgJiYgb2xkVmFsdWUgJiYgIW5ld1ZhbHVlICYmIGFSZXNvdXJjZSBpbnN0YW5jZW9mIFRyYW5zbGF0b3JSZXNvdXJjZSkKLQkJCXJlc2V0V29ya2luZ0NvcHlNYW5hZ2VyKCk7Ci0JCXN1cGVyLnJlc291cmNlSXNMb2FkZWRDaGFuZ2VkKGFSZXNvdXJjZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXZlcnRlZChSZWZlcmVuY2VkUmVzb3VyY2UgcmV2ZXJ0ZWRSZXNvdXJjZSkgewotCQlpZiAoZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFdvcmtpbmdDb3B5TWFuYWdlcigpLnJldmVydCgpOwotCQlyZXZlcnRBbGxSZXNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQ29tcGlsYXRpb25Vbml0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkuc2F2ZUNvbXBpbGF0aW9uVW5pdHMobW9uaXRvcik7Ci0JfQotCi0JcHVibGljIFdvcmtpbmdDb3B5TWFuYWdlciBnZXRXb3JraW5nQ29weU1hbmFnZXIoKSB7Ci0JCWlmICh3b3JraW5nQ29weU1hbmFnZXIgPT0gbnVsbCkKLQkJCXdvcmtpbmdDb3B5TWFuYWdlciA9IFdvcmtpbmdDb3B5TWFuYWdlckZhY3RvcnkubmV3UmVnaXN0ZXJlZEluc3RhbmNlKCk7Ci0JCXJldHVybiB3b3JraW5nQ29weU1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogUmVzZXQgdGhlIHdvcmtpbmcgY29weSBtYW5hZ2VyIGJlY2F1c2UgdGhlIGVqYi1qYXIueG1sIHdhcyByZW1vdmVkIHdpdGhvdXQgZGlzcG9zaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0V29ya2luZ0NvcHlNYW5hZ2VyKCkgewotCQlpZiAod29ya2luZ0NvcHlNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXdvcmtpbmdDb3B5TWFuYWdlci5kaXNwb3NlKCk7Ci0JCQl3b3JraW5nQ29weU1hbmFnZXIgPSBudWxsOwotCQl9Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL0phdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU1YTUzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YUFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEphdmFBcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkgZXh0ZW5kcyBFZGl0TW9kZWxGYWN0b3J5IHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfRURJVF9NT0RFTF9JRCA9ICJvcmcuZWNsaXBzZS5qc3QubW9kdWxlY29yZS5lZGl0TW9kZWwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTU9EVUxFX1VSSSA9ICJNT0RVTEVfVVJJIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1JPT1RfVVJJID0gIlJPT1RfVVJJIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1JPT1RfQ09OVEVOVF9UWVBFID0gIlJPT1RfQ09OVEVOVF9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkjY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yUmVhZChTdHJpbmcgZWRpdE1vZGVsSUQsIEVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCwgTWFwIHBhcmFtcykgewotCQlVUkkgbW9kdWxlVVJJID0gKFVSSSkgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX01PRFVMRV9VUkkpIDogbnVsbCk7Ci0JCVVSSSByb290VVJJID0gKFVSSSkgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX1JPT1RfVVJJKSA6IG51bGwpOwotCQlTdHJpbmcgcm9vdENvbnRlbnRUeXBlID0gKFN0cmluZykgKChwYXJhbXMgIT0gbnVsbCkgPyBwYXJhbXMuZ2V0KFBBUkFNX1JPT1RfQ09OVEVOVF9UWVBFKSA6IG51bGwpOwotCQlpZihtb2R1bGVVUkkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkEgTW9kdWxlIFVSSSBtdXN0IGJlIHByb3ZpZGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXJldHVybiAgbmV3IEphdmFBcnRpZmFjdEVkaXRNb2RlbChlZGl0TW9kZWxJRCwgY29udGV4dCwgdHJ1ZSwgbW9kdWxlVVJJLHJvb3RVUkkscm9vdENvbnRlbnRUeXBlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRmFjdG9yeSNjcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBFZGl0TW9kZWwgY3JlYXRlRWRpdE1vZGVsRm9yV3JpdGUoU3RyaW5nIGVkaXRNb2RlbElELCBFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQsIE1hcCBwYXJhbXMpIHsKLQkJVVJJIG1vZHVsZVVSSSA9IChVUkkpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9NT0RVTEVfVVJJKSA6IG51bGwpOwotCQlVUkkgcm9vdFVSSSA9IChVUkkpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9ST09UX1VSSSkgOiBudWxsKTsKLQkJU3RyaW5nIHJvb3RDb250ZW50VHlwZSA9IChTdHJpbmcpICgocGFyYW1zICE9IG51bGwpID8gcGFyYW1zLmdldChQQVJBTV9ST09UX0NPTlRFTlRfVFlQRSkgOiBudWxsKTsKLQkJaWYobW9kdWxlVVJJID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBIE1vZHVsZSBVUkkgbXVzdCBiZSBwcm92aWRlZCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAgbmV3IEphdmFBcnRpZmFjdEVkaXRNb2RlbChlZGl0TW9kZWxJRCwgY29udGV4dCwgZmFsc2UsZmFsc2UsIG1vZHVsZVVSSSxyb290VVJJLHJvb3RDb250ZW50VHlwZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEZhY3RvcnkjZ2V0Q2FjaGVJRChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FjaGVJRChTdHJpbmcgZWRpdE1vZGVsSUQsIE1hcCBwYXJhbXMpIHsgCi0JCVVSSSBtb2R1bGVVUkkgPSAoVVJJKXBhcmFtcy5nZXQoUEFSQU1fTU9EVUxFX1VSSSk7Ci0JCWlmKG1vZHVsZVVSSSAhPSBudWxsKQotCQkJcmV0dXJuIGVkaXRNb2RlbElEKyI6Iittb2R1bGVVUkkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZWRpdE1vZGVsSUQrIjpOT1VSSSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vSmF2YVByb2plY3RWYWxpZGF0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2U5OTEyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9KYXZhUHJvamVjdFZhbGlkYXRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXI7Ci0KLQotLyoqCi0gKiBKYXZhIFByb2plY3QgdmFsaWRhdGlvbiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFQcm9qZWN0VmFsaWRhdGlvbkhhbmRsZXIgaW1wbGVtZW50cyBJVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIgewotCQotCXByaXZhdGUgU3RyaW5nIHZhbGlkYXRpb25UeXBlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEphdmFQcm9qZWN0VmFsaWRhdGlvbkhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLklWYWxpZGF0aW9uU2VsZWN0aW9uSGFuZGxlciNnZXRCYXNlVmFsaWRhdGlvblR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldEJhc2VWYWxpZGF0aW9uVHlwZShPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpCi0JCQlyZXR1cm4gKChJSmF2YVByb2plY3Qpc2VsZWN0aW9uKS5nZXRQcm9qZWN0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JVmFsaWRhdGlvblNlbGVjdGlvbkhhbmRsZXIjZ2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoKSB7Ci0JCXJldHVybiB2YWxpZGF0aW9uVHlwZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuSVZhbGlkYXRpb25TZWxlY3Rpb25IYW5kbGVyI3NldFZhbGlkYXRpb25UeXBlU3RyaW5nKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdGlvblR5cGVTdHJpbmcoU3RyaW5nIHZhbGlkYXRpb25UeXBlKSB7Ci0JCXRoaXMudmFsaWRhdGlvblR5cGUgPSB2YWxpZGF0aW9uVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9XVFBXb3JraW5nQ29weU1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9XVFBXb3JraW5nQ29weU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxMzM0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV1RQV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuaW50ZWdyYXRpb247Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5JU2F2ZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVGYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVySGVhZGxlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlNhdmVIYW5kbGVyUmVnaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMjcvMjAwMSA0OjE0OjMwIFBNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBXVFBXb3JraW5nQ29weU1hbmFnZXIgaW1wbGVtZW50cyBXb3JraW5nQ29weU1hbmFnZXIgewotCi0JLy9OZXcgQ1VzIHRoYXQgd2lsbCBuZWVkIHRvIGJlIGRlbGV0ZWQgdXBvbiBkaXNwb3NlCi0JcHJpdmF0ZSBMaXN0IG9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0czsKLQkvL05ldyBDVXMgdGhhdCB3ZXJlIGNyZWF0ZWQgdGhhdCBuZWVkIHNhdmVkIGltbWVkaWF0ZWx5IChhZnRlciBlYWNoIGdlbikKLQlwcml2YXRlIExpc3QgbmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzOwotCS8vQSBjb21wbGV0ZSBsaXN0IG9mIG5ldyBDVXMgdGhhdCBpcyBvbmx5IGNsZWFyZWQgb24gc2F2ZSBhbmQgZGlzcG9zZQotCXByaXZhdGUgTGlzdCBuZXdDb21waWxhdGlvblVuaXRzOwotCXByaXZhdGUgSGFzaE1hcCBkZWxldGVkQ29tcGlsYXRpb25Vbml0czsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElSRVNPVVJDRV9DTEFTUyA9IElSZXNvdXJjZS5jbGFzczsKLQotCS8qKgotCSAqIFdUUFdvcmtpbmdDb3B5TWFuYWdlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXVFBXb3JraW5nQ29weU1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRlZENvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWdldE5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cygpLnJlbW92ZShjdSk7Ci0JCWlmICghZ2V0T3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCkuY29udGFpbnMoY3UpICYmICFnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmNvbnRhaW5zS2V5KGN1KSkKLQkJCXByaW1BZGREZWxldGVkQ29tcGlsYXRpb25Vbml0KGN1KTsKLQkJZ2V0T3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCkucmVtb3ZlKGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROZXdDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSUNvbXBpbGF0aW9uVW5pdCB3b3JraW5nQ29weSkgewotCQlnZXROZXdDb21waWxhdGlvblVuaXRzKCkuYWRkKGN1KTsKLQkJZ2V0TmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzKCkuYWRkKHdvcmtpbmdDb3B5KTsKLQkJaWYgKCFnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmNvbnRhaW5zS2V5KGN1KSkKLQkJCWdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpLmFkZChjdSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIHNhdmUgYWxsIG9mIHRoZSBuZXcgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21taXRXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IHdjLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJd2MuY29tbWl0V29ya2luZ0NvcHkoZmFsc2UsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoaXNGYWlsZWRXcml0ZUZpbGVGYWlsdXJlKGUpICYmIHNob3VsZFNhdmVSZWFkT25seSh3YykpCi0JCQkJCXdjLmNvbW1pdFdvcmtpbmdDb3B5KGZhbHNlLCBtb25pdG9yKTsKLQkJCQllbHNlCi0JCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXdjLmRpc2NhcmRXb3JraW5nQ29weSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUxKSB7Ci0JCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlMSk7Ci0JCQkJdGhyb3cgbmV3IFNhdmVGYWlsZWRFeGNlcHRpb24oZTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGRlbGV0ZQotCSAqIAotCSAqIEBjdSBmcm9tIHRoZSB3b3JrYmVuY2ggYW5kIGZpeCB0aGUgaW50ZXJuYWwgcmVmZXJlbmNlcyBmb3IgdGhpcyB3b3JraW5nIGNvcHkgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChjdS5pc1dvcmtpbmdDb3B5KCkpCi0JCQljdSA9IGN1LmdldFByaW1hcnkoKTsKLQkJYWRkRGVsZXRlZENvbXBpbGF0aW9uVW5pdChjdSk7Ci0JCXRyeSB7Ci0JCQljdS5kZWxldGUoZmFsc2UsIG1vbml0b3IpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpICE9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxTdGF0dXNDb25zdGFudHMuRUxFTUVOVF9ET0VTX05PVF9FWElTVCkKLQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzY2FyZE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpIHsKLQkJaWYgKGdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJTGlzdCBjdXMgPSBnZXRPcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTsKLQkJSUNvbXBpbGF0aW9uVW5pdCB3YyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzLnNpemUoKTsgaSsrKSB7Ci0JCQljdSA9IChJQ29tcGlsYXRpb25Vbml0KSBjdXMuZ2V0KGkpOwotCQkJaWYgKGN1LmlzV29ya2luZ0NvcHkoKSkgewotCQkJCXdjID0gY3U7Ci0JCQkJY3UgPSB3Yy5nZXRQcmltYXJ5KCk7Ci0JCQl9Ci0JCQlwcmltRGVsZXRlKGN1KTsKLQkJCWlmICh3YyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCXdjLmRpc2NhcmRXb3JraW5nQ29weSgpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHsKLQkJCQlwcmltRGlzcG9zZSgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJaWYgKCFXVFBDb21tb25QbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNUcmVlTG9ja2VkKCkpIHsKLQkJCQlXVFBDb21tb25QbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLG51bGwsIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlydW5uYWJsZS5ydW4obnVsbCk7Ci0JCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJLy9ydW5PcGVyYXRpb24ocnVubmFibGUsIG51bGwsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJldmVydCgpIHsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQkJcHJpbVJldmVydCgpOwotCQkJfQotCQl9OwotCQlydW5PcGVyYXRpb24ocnVubmFibGUsIG51bGwsIHRydWUpOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0QWZmZWN0ZWRGaWxlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzExLzIwMDEgNjo0MzozNyBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5IYXNoTWFwCi0JICovCi0JcHJvdGVjdGVkIEhhc2hNYXAgZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChkZWxldGVkQ29tcGlsYXRpb25Vbml0cyA9PSBudWxsKQotCQkJZGVsZXRlZENvbXBpbGF0aW9uVW5pdHMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZGVsZXRlZENvbXBpbGF0aW9uVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya2luZyBjb3B5IHJlbWVtYmVyZWQgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0IGVuY29kZWQgaW4gdGhlIGdpdmVuIGVkaXRvcgotCSAqIGlucHV0LiBEb2VzIG5vdCBjb25uZWN0IHRoZSBlZGl0IG1vZGVsIHRvIHRoZSB3b3JraW5nIGNvcHkuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW5wdXQgZG9lcwotCSAqICAgICAgICAgbm90IGVuY29kZSBhbiBlZGl0b3IgaW5wdXQsIG9yIGlmIHRoZXJlIGlzIG5vIHJlbWVtYmVyZWQgd29ya2luZyBjb3B5IGZvciB0aGlzCi0JICogICAgICAgICBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgZ2V0RXhpc3RpbmdXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgbmV3Q1UgPSBnZXROZXdDb21waWxhdGlvblVuaXRXb3JraW5nQ29weShjdSk7Ci0JCWlmIChuZXdDVSAhPSBudWxsKQotCQkJcmV0dXJuIG5ld0NVOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg3LzE5LzIwMDEgMTE6MDA6MTkgQU0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXROZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChuZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMgPT0gbnVsbCkKLQkJCW5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIG5lZWRzU2F2aW5nQ29tcGlsYXRpb25Vbml0czsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzI2LzIwMDEgMzo0OTowNSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldE5ld0NvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChuZXdDb21waWxhdGlvblVuaXRzID09IG51bGwpCi0JCQluZXdDb21waWxhdGlvblVuaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gbmV3Q29tcGlsYXRpb25Vbml0czsKLQl9Ci0KLQkvKioKLQkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBjcmVhdGVkIHRoaXMgQ29tcGlsYXRpb25Vbml0IGFuZCBpdHMgd29ya2luZyBjb3B5LiBJZgotCSAqIHRoaXMgaXMgdGhlIGNhc2UsIHJldHVybiBvdXIgbmV3IHdvcmtpbmcgY29weSBhbmQgZG8gbm90IGNyZWF0ZSBhIG5ldyBvbmUuCi0JICovCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgZ2V0TmV3Q29tcGlsYXRpb25Vbml0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoaGFzTmV3Q29tcGlsYXRpb25Vbml0KGN1KSkgewotCQkJTGlzdCBsaXN0ID0gZ2V0TmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzKCk7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGNvcHk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQljb3B5ID0gKElDb21waWxhdGlvblVuaXQpIGxpc3QuZ2V0KGkpOwotCQkJCWlmIChjdS5lcXVhbHMoY29weS5nZXRQcmltYXJ5KCkpKQotCQkJCQlyZXR1cm4gY29weTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzI2LzIwMDEgMzo0OTowNSBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpIHsKLQkJaWYgKG9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cyA9PSBudWxsKQotCQkJb3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gb3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSVBhY2thZ2VGcmFnbWVudCBmb3IgdGhlIGdpdmVuIElDb21waWxhdGlvblVuaXQuCi0JICovCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJaWYgKGN1ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUphdmFFbGVtZW50IHBhcmVudCA9IGN1OwotCQlpbnQgZWxlbWVudFR5cGUgPSBjdS5nZXRFbGVtZW50VHlwZSgpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgZWxlbWVudFR5cGUgIT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpIHsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCQllbGVtZW50VHlwZSA9IHBhcmVudC5nZXRFbGVtZW50VHlwZSgpOwotCQkJZWxzZQotCQkJCWVsZW1lbnRUeXBlID0gLTE7Ci0JCX0KLQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50KSBwYXJlbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIElTYXZlSGFuZGxlciBnZXRTYXZlSGFuZGxlcigpIHsKLQkJcmV0dXJuIFNhdmVIYW5kbGVyUmVnaXN0ZXIuZ2V0U2F2ZUhhbmRsZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3JraW5nIGNvcHkgcmVtZW1iZXJlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotCSAqICAgICAgICAgcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UsIGJvb2xlYW4gZm9yTmV3Q1UpIHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjdSA9PSBudWxsIHx8IGN1LmlzV29ya2luZ0NvcHkoKSkKLQkJCXJldHVybiBjdTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBuZXdDVSA9IGdldE5ld0NvbXBpbGF0aW9uVW5pdFdvcmtpbmdDb3B5KGN1KTsKLQkJaWYgKG5ld0NVICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3Q1U7Ci0JCUlDb21waWxhdGlvblVuaXQgd29ya2luZ0NvcHkgPSBjdS5nZXRXb3JraW5nQ29weShudWxsKTsKLQkJYWRkTmV3Q29tcGlsYXRpb25Vbml0KGN1LCB3b3JraW5nQ29weSk7Ci0JCXJldHVybiB3b3JraW5nQ29weTsKLQl9Ci0KLQkvKioKLQkgKiBIYXMgYSBuZXcgY29tcGlsYXRpb24gdW5pdCBhbHJlYWR5IGJlZW4gY3JlYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXdDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gZ2V0TmV3Q29tcGlsYXRpb25Vbml0cygpLmNvbnRhaW5zKGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZhaWxlZFdyaXRlRmlsZUZhaWx1cmUoRXhjZXB0aW9uIGV4KSB7Ci0JCXJldHVybiBTYXZlSGFuZGxlckhlYWRsZXNzLmlzRmFpbGVkV3JpdGVGaWxlRmFpbHVyZShleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbUFkZERlbGV0ZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoY3UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJT2JqZWN0W10gaW5mbyA9IG5ldyBPYmplY3RbMl07Ci0JCWluZm9bMF0gPSBnZXRQYWNrYWdlRnJhZ21lbnQoY3UpOwotCQl0cnkgewotCQkJaW5mb1sxXSA9IGN1LmdldFNvdXJjZSgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJaW5mb1sxXSA9IG51bGw7Ci0JCX0KLQkJZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5wdXQoY3UsIGluZm8pOwotCX0KLQotCS8vIFRoaXMgaXMgYW4gaW50ZXJuYWwgZGVsZXRlIGNhbGwuCi0JcHJvdGVjdGVkIHZvaWQgcHJpbURlbGV0ZShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoY3UuZXhpc3RzKCkpCi0JCQkJY3UuZGVsZXRlKHRydWUsIG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkvL1doYXQgdG8gZG8gaGVyZT8KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1EaXNwb3NlKCkgewotCQlkaXNjYXJkT3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzKCk7Ci0JCXJldml2ZURlbGV0ZWRDb21waWxhdGlvblVuaXRzKCk7Ci0JCW5ld0NvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCQluZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCQlvcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCQlkZWxldGVkQ29tcGlsYXRpb25Vbml0cyA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJldmVydCgpIHsKLQkJZGlzY2FyZE9yaWdpbmFsTmV3Q29tcGlsYXRpb25Vbml0cygpOwotCQlyZXZpdmVEZWxldGVkQ29tcGlsYXRpb25Vbml0cygpOwotCQluZXdDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQkJbmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQkJb3JpZ2luYWxOZXdDb21waWxhdGlvblVuaXRzID0gbnVsbDsKLQkJZGVsZXRlZENvbXBpbGF0aW9uVW5pdHMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCBlbmNvZGVkIGluIHRoZSBnaXZlbiBlZGl0b3IKLQkgKiBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIElDb21waWxhdGlvblVuaXQKLQkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBpbnB1dCBkb2VzCi0JICogICAgICAgICBub3QgZW5jb2RlIGFuIGVkaXRvciBpbnB1dCwgb3IgaWYgdGhlcmUgaXMgbm8gcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMKLQkgKiAgICAgICAgIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBwcmltR2V0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltU2F2ZUNvbXBpbGF0aW9uVW5pdHMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlzYXZlTmV3Q29tcGlsYXRpb25Vbml0cyhtb25pdG9yKTsKLQkJZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgbmV3IENvbXBpbGF0aW9uVW5pdHMgdG8gYmUgc2F2ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVNhdmVPbmx5TmV3Q29tcGlsYXRpb25Vbml0cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUxpc3QgY3VzID0gZ2V0TmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzKCk7Ci0JCUlDb21waWxhdGlvblVuaXQgd2M7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VzLnNpemUoKTsgaSsrKSB7Ci0JCQl3YyA9IChJQ29tcGlsYXRpb25Vbml0KSBjdXMuZ2V0KGkpOwotCQkJY29tbWl0V29ya2luZ0NvcHkod2MsIG1vbml0b3IpOwotCQl9Ci0JCWN1cy5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURlbGV0ZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5yZW1vdmUoY3UpICE9IG51bGwpIHsKLQkJCWlmIChjdS5pc1dvcmtpbmdDb3B5KCkpIHsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IG9yaWdpbmFsLCBuZXh0Q1UsIHRlc3RDVTsKLQkJCQlvcmlnaW5hbCA9IGN1LmdldFByaW1hcnkoKTsKLQkJCQlTZXQgY3VzID0gZ2V0RGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKS5rZXlTZXQoKTsKLQkJCQlJdGVyYXRvciBpdCA9IGN1cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJbmV4dENVID0gKElDb21waWxhdGlvblVuaXQpIGl0Lm5leHQoKTsKLQkJCQkJdGVzdENVID0gbmV4dENVLmlzV29ya2luZ0NvcHkoKSA/IChJQ29tcGlsYXRpb25Vbml0KSBuZXh0Q1UuZ2V0UHJpbWFyeSgpIDogbmV4dENVOwotCQkJCQlpZiAodGVzdENVLmVxdWFscyhvcmlnaW5hbCkpIHsKLQkJCQkJCWN1cy5yZW1vdmUobmV4dENVKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJldml2ZURlbGV0ZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSwgT2JqZWN0W10gaW5mbywgSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQlpZihjdS5nZXRKYXZhUHJvamVjdCgpLmlzT3BlbigpKSB7Ci0JCQlpZiAoaW5mb1swXSAhPSBudWxsICYmIGluZm9bMV0gIT0gbnVsbCkgewotCQkJCVN0cmluZyB0eXBlTmFtZSA9IGN1LmdldEVsZW1lbnROYW1lKCk7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gKElQYWNrYWdlRnJhZ21lbnQpIGluZm9bMF07Ci0JCQkJU3RyaW5nIHNvdXJjZSA9IChTdHJpbmcpIGluZm9bMV07Ci0JCQkJdHJ5IHsKLQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBleGlzdGluZ0NVID0gcGFjay5nZXRDb21waWxhdGlvblVuaXQodHlwZU5hbWUpOwotCQkJCQlpZiAoZXhpc3RpbmdDVS5leGlzdHMoKSAmJiBnZXROZXdDb21waWxhdGlvblVuaXRzKCkuY29udGFpbnMoZXhpc3RpbmdDVSkpCi0JCQkJCQlleGlzdGluZ0NVLmRlbGV0ZShmYWxzZSwgcG0pOwotCQkJCQlwYWNrLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCh0eXBlTmFtZSwgc291cmNlLCBmYWxzZSwgcG0pOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmV2aXZlRGVsZXRlZENvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCWlmIChnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJCi0JCUlQcm9ncmVzc01vbml0b3IgcG0gPSBuZXcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJSXRlcmF0b3IgaXQgPSBnZXREZWxldGVkQ29tcGlsYXRpb25Vbml0cygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJTWFwLkVudHJ5IGVudHJ5OwotCQlJQ29tcGlsYXRpb25Vbml0IGN1OwotCQlPYmplY3RbXSBpbmZvOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQllbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWN1ID0gKElDb21waWxhdGlvblVuaXQpIGVudHJ5LmdldEtleSgpOwotCQkJaW5mbyA9IChPYmplY3RbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCXJldml2ZURlbGV0ZWRDb21waWxhdGlvblVuaXQoY3UsIGluZm8sIHBtKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcnVuT3BlcmF0aW9uKElXb3Jrc3BhY2VSdW5uYWJsZSBhUnVubmFibGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgYm9vbGVhbiB2YWxpZGF0ZSkgewotCQlwcmltUnVuT3BlcmF0aW9uKGFSdW5uYWJsZSwgbW9uaXRvcik7Ci0KLQkJLy8gVE9ETyBCcmVhayB0aGUgdmFsaWRhdG9yIGRlcGVkZW5jeQotCQkvLwlpZiAodmFsaWRhdGUpCi0JCS8vCQlwcmltUnVuT3BlcmF0aW9uKGFSdW5uYWJsZSwgbW9uaXRvcik7Ci0JCS8vCWVsc2UgewotCQkvLwkJSVByb2plY3QgcHJvaiA9IGdldFZhbGlkYXRpb25Qcm9qZWN0KCk7Ci0JCS8vCQkJCi0JCS8vCQlWYWxpZGF0b3JNYW5hZ2VyIG1nciA9IFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpOwotCQkvLwkJYm9vbGVhbiBkaXNhYmxlVmFsaWRhdG9ycyA9IHByb2ogIT0gbnVsbDsKLQkJLy8JCWJvb2xlYW4gd2FzU3VzcGVuZGVkID0gZmFsc2U7Ci0JCS8vCQlpZiAoZGlzYWJsZVZhbGlkYXRvcnMpIHsKLQkJLy8JCQl3YXNTdXNwZW5kZWQgPSBtZ3IuaXNTdXNwZW5kZWQocHJvaik7Ci0JCS8vCQkJaWYgKCF3YXNTdXNwZW5kZWQpCi0JCS8vCQkJCW1nci5zdXNwZW5kVmFsaWRhdGlvbihwcm9qLCB0cnVlKTsKLQkJLy8JCX0KLQkJLy8JCXRyeSB7Ci0JCS8vCQkJcHJpbVJ1bk9wZXJhdGlvbihhUnVubmFibGUsIG1vbml0b3IpOwotCQkvLwkJfSBmaW5hbGx5IHsKLQkJLy8JCQlpZiAoZGlzYWJsZVZhbGlkYXRvcnMgJiYgIXdhc1N1c3BlbmRlZCkKLQkJLy8JCQkJbWdyLnN1c3BlbmRWYWxpZGF0aW9uKHByb2osIGZhbHNlKTsKLQkJLy8JCX0KLQkJLy8JfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1SdW5PcGVyYXRpb24oSVdvcmtzcGFjZVJ1bm5hYmxlIGFSdW5uYWJsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlpZiAoYVJ1bm5hYmxlICE9IG51bGwpIHsKLQkJCS8vaWYgKHdvcmtzcGFjZS5pc1RyZWVMb2NrZWQoKSkKLQkJCS8vTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1RyYWNlKFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNhbm5vdF9ydW5fSjJFRVVJV29ya2luZ0NvX0VSUk9SXyIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQgPSAiQ2Fubm90IHJ1biBKMkVFVUlXb3JraW5nQ29weU1hbmFnZXIgb3BlcmF0aW9uIGJlY2F1c2UgdGhlIFdvcmtzcGFjZQotCQkJLy8gdHJlZSBpcyBsb2NrZWQuIgotCQkJLy9lbHNlIHsKLQkJCWlmICghV1RQQ29tbW9uUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzVHJlZUxvY2tlZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJV1RQQ29tbW9uUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihhUnVubmFibGUsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgU2F2ZUZhaWxlZEV4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQ29tcGlsYXRpb25Vbml0cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFNhdmVIYW5kbGVyKCkuYWNjZXNzKCk7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQkJCXByaW1TYXZlQ29tcGlsYXRpb25Vbml0cyhhTW9uaXRvcik7Ci0JCQkJfQotCQkJfTsKLQkJCXJ1bk9wZXJhdGlvbihydW5uYWJsZSwgbW9uaXRvciwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKFNhdmVGYWlsZWRFeGNlcHRpb24gZXgpIHsKLQkJCWdldFNhdmVIYW5kbGVyKCkuaGFuZGxlU2F2ZUZhaWxlZChleCwgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlnZXRTYXZlSGFuZGxlcigpLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBzYXZlIGFsbCBvZiB0aGUgcmVmZXJlbmNlZCBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVOZXdDb21waWxhdGlvblVuaXRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlwcmltU2F2ZU9ubHlOZXdDb21waWxhdGlvblVuaXRzKG1vbml0b3IpOwotCQlnZXRPcmlnaW5hbE5ld0NvbXBpbGF0aW9uVW5pdHMoKS5jbGVhcigpOwotCQlnZXROZXdDb21waWxhdGlvblVuaXRzKCkuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIG5ldyBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVPbmx5TmV3Q29tcGlsYXRpb25Vbml0cyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWdldFNhdmVIYW5kbGVyKCkuYWNjZXNzKCk7Ci0JCXRyeSB7Ci0JCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGFNb25pdG9yKSB7Ci0JCQkJCXByaW1TYXZlT25seU5ld0NvbXBpbGF0aW9uVW5pdHMoYU1vbml0b3IpOwotCQkJCX0KLQkJCX07Ci0JCQlydW5PcGVyYXRpb24ocnVubmFibGUsIG1vbml0b3IsIGZhbHNlKTsKLQkJfSBjYXRjaCAoU2F2ZUZhaWxlZEV4Y2VwdGlvbiBleCkgewotCQkJZ2V0U2F2ZUhhbmRsZXIoKS5oYW5kbGVTYXZlRmFpbGVkKGV4LCBtb25pdG9yKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdldFNhdmVIYW5kbGVyKCkucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZVJlYWRPbmx5KElDb21waWxhdGlvblVuaXQgd2MpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQotCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIHdjLmdldFByaW1hcnkoKS5nZXRBZGFwdGVyKElSRVNPVVJDRV9DTEFTUyk7Ci0KLQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFIHx8ICFyZXNvdXJjZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZXMoKS5pc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGdldFNhdmVIYW5kbGVyKCkuc2hvdWxkQ29udGludWVBbmRNYWtlRmlsZUVkaXRhYmxlKChJRmlsZSkgcmVzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guSUoyRUVXb3JraW5nQ29weU1hbmFnZXIjaGFzV29ya2luZ0NvcGllcygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzV29ya2luZ0NvcGllcygpIHsKLQkJcmV0dXJuIChkZWxldGVkQ29tcGlsYXRpb25Vbml0cyAhPSBudWxsICYmICFkZWxldGVkQ29tcGlsYXRpb25Vbml0cy5pc0VtcHR5KCkpIHx8IChuZWVkc1NhdmluZ0NvbXBpbGF0aW9uVW5pdHMgIT0gbnVsbCAmJiAhbmVlZHNTYXZpbmdDb21waWxhdGlvblVuaXRzLmlzRW1wdHkoKSkgfHwgKG5ld0NvbXBpbGF0aW9uVW5pdHMgIT0gbnVsbCAmJiAhbmV3Q29tcGlsYXRpb25Vbml0cy5pc0VtcHR5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNjYzg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKiAKLSAqICAKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JraW5nQ29weU1hbmFnZXIgZXh0ZW5kcyBXb3JraW5nQ29weVByb3ZpZGVyIHsKLQotCXZvaWQgZGlzcG9zZSgpOwotCi0JamF2YS51dGlsLlNldCBnZXRBZmZlY3RlZEZpbGVzKCk7Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KLQkgKi8KLQl2b2lkIHNhdmVDb21waWxhdGlvblVuaXRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIG5ldyBDb21waWxhdGlvblVuaXRzIHRvIGJlIHNhdmVkLgotCSAqLwotCXZvaWQgc2F2ZU9ubHlOZXdDb21waWxhdGlvblVuaXRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBNZXRob2QgaGFzV29ya2luZ0NvcGllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc1dvcmtpbmdDb3BpZXMoKTsKLQotCS8qKgotCSAqIFJldmVydCBhbGwgd29ya2luZyBjb3BpZXMuCi0JICovCi0Jdm9pZCByZXZlcnQoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weU1hbmFnZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlNYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTUzZjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi9Xb3JraW5nQ29weU1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5pbnRlZ3JhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqIAotICogIAotICovCi1wdWJsaWMgY2xhc3MgV29ya2luZ0NvcHlNYW5hZ2VyRmFjdG9yeSB7Ci0KLQkvLwlwcm90ZWN0ZWQgc3RhdGljIENsYXNzIHdvcmtpbmdDb3B5TWFuYWdlckNsYXNzOwotCi0JcHVibGljIHN0YXRpYyBXb3JraW5nQ29weU1hbmFnZXIgbmV3UmVnaXN0ZXJlZEluc3RhbmNlKCkgewotCQlyZXR1cm4gKFdvcmtpbmdDb3B5TWFuYWdlcikgVUlDb250ZXh0RGV0ZXJtaW5hdGlvbi5jcmVhdGVJbnN0YW5jZSgid29ya2luZ0NvcHlNYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLwlwdWJsaWMgc3RhdGljIElXb3JraW5nQ29weU1hbmFnZXIgY3JlYXRlV29ya2luZ0NvcHlNYW5hZ2VyKCkgewotCS8vCQlpZiAoZ2V0V29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3MoKSAhPSBudWxsKQotCS8vCQkJdHJ5IHsKLQkvLwkJCQlyZXR1cm4gKElXb3JraW5nQ29weU1hbmFnZXIpIGdldFdvcmtpbmdDb3B5TWFuYWdlckNsYXNzKCkubmV3SW5zdGFuY2UoKTsKLQkvLwkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZTEpIHsKLQkvLwkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZTIpIHsKLQkvLwkJCX0KLQkvLwkJcmV0dXJuIG51bGw7Ci0JLy8JfQotCS8vCQotCS8vCS8qKgotCS8vCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkvLwkgKiBDcmVhdGlvbiBkYXRlOiAoNC8yNi8yMDAxIDc6NTM6MTUgQU0pCi0JLy8JICogQHJldHVybiBqYXZhLmxhbmcuQ2xhc3MKLQkvLwkgKi8KLQkvLwlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5DbGFzcyBnZXRXb3JraW5nQ29weU1hbmFnZXJDbGFzcygpIHsKLQkvLwkJcmV0dXJuIHdvcmtpbmdDb3B5TWFuYWdlckNsYXNzOwotCS8vCX0KLQkvLwkKLQkvLwkvKioKLQkvLwkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JLy8JICogQ3JlYXRpb24gZGF0ZTogKDQvMjYvMjAwMSA3OjUzOjE1IEFNKQotCS8vCSAqIEBwYXJhbSBuZXdXb3JraW5nQ29weU1hbmFnZXJDbGFzcyBqYXZhLmxhbmcuQ2xhc3MKLQkvLwkgKi8KLQkvLwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3MoamF2YS5sYW5nLkNsYXNzIG5ld1dvcmtpbmdDb3B5TWFuYWdlckNsYXNzKSB7Ci0JLy8JCXdvcmtpbmdDb3B5TWFuYWdlckNsYXNzID0gbmV3V29ya2luZ0NvcHlNYW5hZ2VyQ2xhc3M7Ci0JLy8JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL1dvcmtpbmdDb3B5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5NmY1Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvaW50ZWdyYXRpb24vV29ya2luZ0NvcHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLQotCi0vKioKLSAqIFRoZSB1c2VyIG9mIHRoZSBKYXZhIGNvZGUgZ2VuZXJhdGlvbiBmcmFtZXdvcmsgbXVzdCBzdXBwbHkgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UuCi0gKiBUaGUgZnJhbWV3b3JrIHdpbGwgb2J0YWluIGNvbXBpbGF0aW9uIHdvcmtpbmcgY29waWVzIGZyb20gdGhpcyBpbnRlcmZhY2UuIFRoZSBzdXBwbGllciBvZiB0aGUKLSAqIGltcGxlbWVudGF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjb21taXR0aW5nIHRoZSB3b3JraW5nIGNvcGllcyB3aGVuIGFwcHJvcHJpYXRlIGZvciB0aGUgdXNlcidzCi0gKiBlZGl0IG1vZGVsLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtpbmdDb3B5UHJvdmlkZXIgewotCi0JLyoqCi0JICogVGhpcyB3aWxsIGRlbGV0ZSBjb21waWxhdGlvbiB1bml0IGZyb20gdGhlIHdvcmtiZW5jaCBhbmQgZml4IHRoZSBpbnRlcm5hbCByZWZlcmVuY2VzIGZvciB0aGlzCi0JICogd29ya2luZyBjb3B5IG1hbmFnZXIuCi0JICogCi0JICogQHBhcmFtIGN1Ci0JICogICAgICAgICAgICB0aGUgY29tcGlsYXRpb24gdW5pdCB0byBkZWxldGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIGZvciB0aGUgZGVsZXRlCi0JICovCi0Jdm9pZCBkZWxldGUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdC4gVGhhdCBpcywgdGhlIG1hbmFnZXIgYWxyZWFkeQotCSAqIGhhcyBhIHdvcmtpbmcgY29weSBmb3IgdGhpcyB1bml0LCBpdCBkb2VzIG5vdCBjcmVhdGUgYSBuZXcgd29ya2luZyBjb3B5LiBEb2VzIG5vdCBjb25uZWN0IHRoZQotCSAqIGVkaXQgbW9kZWwgdG8gdGhlIHdvcmtpbmcgY29weS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpdCB0aGVyZSBpcyBubwotCSAqICAgICAgICAgcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCUlDb21waWxhdGlvblVuaXQgZ2V0RXhpc3RpbmdXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtpbmcgY29weSByZW1lbWJlcmVkIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCBvciBjcmVhdGVzIGEgbmV3IHdvcmtpbmcgY29weQotCSAqIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCBhbmQgcmV0dXJucyBpdC4gSWYgYSB3b3JraW5nIGNvcHkgaXMgcGFzc2VkIGluLCBpdCBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICogQHJldHVybiB0aGUgd29ya2luZyBjb3B5IG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIHdvcmtpbmcgY29weSBjYW4gbm90IGJlIGNyZWF0ZWQKLQkgKi8KLQlJQ29tcGlsYXRpb25Vbml0IGdldFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UsIGJvb2xlYW4gZm9yTmV3Q1UpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9qYXZhbGl0ZS9JSmF2YVByb2plY3RMaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvamF2YWxpdGUvSUphdmFQcm9qZWN0TGl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWQwYWVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9qYXZhbGl0ZS9JSmF2YVByb2plY3RMaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5qYXZhbGl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci0KLS8qKgotICogPHA+Ci0gKiBSZXByZXNlbnRzIGEgc2NhbGVkIGRvd24gdmVyc2lvbiBvZiBhbiB7QGxpbmsgSUphdmFQcm9qZWN0fS4gVGhpcyBzdWJzZXQgb2YKLSAqIG1ldGhvZHMgaXMgZ3VhcmFudGVlZCB0byBub3QgZm9yY2UgYSBsb2FkIG9mIHRoZSB1bmRlcmx5aW5nCi0gKiB7QGxpbmsgSUphdmFNb2RlbH0uIFRoaXMgZW5hYmxlcyBzYWZlIGFjY2VzcyB0byBhIGxpbWl0ZWQgc2V0IG9mCi0gKiB7QGxpbmsgSUphdmFQcm9qZWN0fSBBUEkgZm9yIG11bHRpLXRocmVhZGVkIGNsaWVudHMgdG8gY2FsbCBkdXJpbmcgdGltZXMgb2YKLSAqIGV4dHJlbWUgY29uY3VycmVuY3ksIGUuZy4gd29ya2JlbmNoIHN0YXJ0dXAuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIEFuIGluc3RhbmNlIG9mIG9uZSBvZiB0aGVzZSBoYW5kbGVzIGNhbiBiZSBjcmVhdGVkIHZpYQotICogPGNvZGU+SmF2YUNvcmVMaXRlLmNyZWF0ZShwcm9qZWN0KTwvY29kZT4uCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgSmF2YUNvcmUjY3JlYXRlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQotICogQHNlZSBJSmF2YVByb2plY3QKLSAqIEBzZWUgSUNsYXNzcGF0aEVudHJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFQcm9qZWN0TGl0ZSB7Ci0JLyoqCi0JICogQHNlZSBJSmF2YVByb2plY3QjcmVhZFJhd0NsYXNzcGF0aCgpCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUlDbGFzc3BhdGhFbnRyeVtdIHJlYWRSYXdDbGFzc3BhdGgoKTsKLQotCS8qKgotCSAqIEBzZWUgSUphdmFQcm9qZWN0I3JlYWRPdXRwdXRMb2NhdGlvbigpCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUlQYXRoIHJlYWRPdXRwdXRMb2NhdGlvbigpOwotCi0JLyoqCi0JICogQHNlZSBJSmF2YVByb2plY3QjZ2V0UHJvamVjdCgpCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUlQcm9qZWN0IGdldFByb2plY3QoKTsKLQotCS8qKgotCSAqIEBzZWUgSUphdmFQcm9qZWN0I2V4aXN0cygpCi0JICovCi0JYm9vbGVhbiBleGlzdHMoKTsKLQkKLQkvKioKLQkgKiBAc2VlIElKYXZhUHJvamVjdCNpc09wZW4oKQotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzT3BlbigpOwotCi0JLyoqCi0JICogQHNlZSBJSmF2YVByb2plY3QjaGFzQnVpbGRTdGF0ZSgpCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0J1aWxkU3RhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9qYXZhbGl0ZS9KYXZhQ29yZUxpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9qYXZhbGl0ZS9KYXZhQ29yZUxpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5YWE2Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvamF2YWxpdGUvSmF2YUNvcmVMaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuamF2YWxpdGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5DbGFzc3BhdGhDb250YWluZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBY2Nlc3NSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuSmF2YU1vZGVsTWFuYWdlcjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEphdmFDb3JlTGl0ZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOQVRVUkVfSUQgPSBKYXZhQ29yZS5OQVRVUkVfSUQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKLQotCXByaXZhdGUgc3RhdGljIEphdmFDb3JlTGl0ZSBJTlNUQU5DRSA9IG51bGw7Ci0KLQlwcml2YXRlIGNsYXNzIEphdmFDb3JlTGl0ZUxpc3RlbmVyIGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQkJSUphdmFFbGVtZW50RGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlwcm9jZXNzRGVsdGEoY2hpbGRyZW5baV0pOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQkJaW50IGZsYWdzID0gZGVsdGEuZ2V0RmxhZ3MoKTsKLQkJCWlmICgoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMT1NFRCkgIT0gMCkgewotCQkJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZGVsdGEuZ2V0RWxlbWVudCgpOwotCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIGVsZW1lbnQ7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQkJaW5pdGlhbGl6ZWRKYXZhUHJvamVjdHMucmVtb3ZlKHByb2plY3QpOwotCQkJCQlqYXZhUHJvamVjdExpdGVDYWNoZS5yZW1vdmUocHJvamVjdCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgoZmxhZ3MgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0NMQVNTUEFUSF9DSEFOR0VEKSAhPSAwKSB7Ci0JCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUKSB7Ci0JCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIGVsZW1lbnQ7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCQkJaWYgKCFpbml0aWFsaXplZEphdmFQcm9qZWN0cy5jb250YWlucyhwcm9qZWN0KSAmJiBqYXZhUHJvamVjdExpdGVDYWNoZS5jb250YWluc0tleShwcm9qZWN0KSkgewotCQkJCQkJCUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUgPSBqYXZhUHJvamVjdExpdGVDYWNoZS5nZXQocHJvamVjdCk7Ci0JCQkJCQkJamF2YVByb2plY3RMaXRlLmZsdXNoQ2xhc3NwYXRoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVTT0xWRURfQ0xBU1NQQVRIX0NIQU5HRUQpICE9IDApIHsKLQkJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpIHsKLQkJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgZWxlbWVudDsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJCQlpZiAoIWluaXRpYWxpemVkSmF2YVByb2plY3RzLmNvbnRhaW5zKHByb2plY3QpKSB7Ci0JCQkJCQkJaW5pdGlhbGl6ZWRKYXZhUHJvamVjdHMuYWRkKHByb2plY3QpOwotCQkJCQkJCWlmIChqYXZhUHJvamVjdExpdGVDYWNoZS5jb250YWluc0tleShwcm9qZWN0KSkgewotCQkJCQkJCQlKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlID0gamF2YVByb2plY3RMaXRlQ2FjaGUuZ2V0KHByb2plY3QpOwotCQkJCQkJCQlqYXZhUHJvamVjdExpdGUubWFya0phdmFQcm9qZWN0SW5pdGlhbGl6ZWQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRToKLQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURToKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBldmVudC5nZXRSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJCQkJaW5pdGlhbGl6ZWRKYXZhUHJvamVjdHMucmVtb3ZlKHByb2plY3QpOwotCQkJCQkJamF2YVByb2plY3RMaXRlQ2FjaGUucmVtb3ZlKHByb2plY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTZXQ8SVByb2plY3Q+IGluaXRpYWxpemVkSmF2YVByb2plY3RzID0gbmV3IEhhc2hTZXQ8SVByb2plY3Q+KCk7Ci0JcHJpdmF0ZSBNYXA8SVByb2plY3QsIEphdmFQcm9qZWN0TGl0ZT4gamF2YVByb2plY3RMaXRlQ2FjaGUgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgSmF2YVByb2plY3RMaXRlPigpOwotCXByaXZhdGUgSmF2YUNvcmVMaXRlTGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YUNvcmVMaXRlIGdldEluc3RhbmNlKCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQkJSU5TVEFOQ0UgPSBuZXcgSmF2YUNvcmVMaXRlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXByaXZhdGUgSmF2YUNvcmVMaXRlKCkgewotCQlsaXN0ZW5lciA9IG5ldyBKYXZhQ29yZUxpdGVMaXN0ZW5lcigpOwotCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpOwotCX0KLQotCXByaXZhdGUgSUphdmFQcm9qZWN0TGl0ZSBjcmVhdGVJbXBsKElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQlpZiAoamF2YVByb2plY3RMaXRlQ2FjaGUuY29udGFpbnNLZXkocHJvamVjdCkpIHsKLQkJCQlyZXR1cm4gamF2YVByb2plY3RMaXRlQ2FjaGUuZ2V0KHByb2plY3QpOwotCQkJfQotCQl9Ci0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBqYXZhUHJvamVjdEluaXRpYWxpemVkID0gZmFsc2U7Ci0JCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCQlqYXZhUHJvamVjdEluaXRpYWxpemVkID0gaW5pdGlhbGl6ZWRKYXZhUHJvamVjdHMuY29udGFpbnMocHJvamVjdCk7Ci0JCQl9Ci0JCQlpZiAoIWphdmFQcm9qZWN0SW5pdGlhbGl6ZWQpIHsKLQkJCQlpZiAoaXNJbml0aWFsaXplZChqYXZhUHJvamVjdCkpIHsKLQkJCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJCQlpbml0aWFsaXplZEphdmFQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQkJCX0KLQkJCQkJamF2YVByb2plY3RJbml0aWFsaXplZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJSmF2YVByb2plY3RMaXRlIGphdmFQcm9qZWN0TGl0ZSA9IG5ldyBKYXZhUHJvamVjdExpdGUoamF2YVByb2plY3QsIGphdmFQcm9qZWN0SW5pdGlhbGl6ZWQpOwotCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJamF2YVByb2plY3RMaXRlQ2FjaGUucHV0KHByb2plY3QsIGphdmFQcm9qZWN0TGl0ZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gamF2YVByb2plY3RMaXRlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXN0YXRpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCWlmIChqYXZhUHJvamVjdC5pc09wZW4oKSkgewotCQkJSmF2YU1vZGVsTWFuYWdlci5QZXJQcm9qZWN0SW5mbyBwcm9qZWN0SW5mbyA9IEphdmFNb2RlbE1hbmFnZXIuZ2V0SmF2YU1vZGVsTWFuYWdlcigpLmdldFBlclByb2plY3RJbmZvKGphdmFQcm9qZWN0LmdldFByb2plY3QoKSwgZmFsc2UpOwotCQkJaWYgKHByb2plY3RJbmZvICE9IG51bGwpIHsKLQkJCQlpZiAocHJvamVjdEluZm8uZ2V0UmVzb2x2ZWRDbGFzc3BhdGgoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJSmF2YVByb2plY3RMaXRlIGNyZWF0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmNyZWF0ZUltcGwocHJvamVjdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJSmF2YVByb2plY3RMaXRlIGNyZWF0ZShJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBjcmVhdGUoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyIGdldENsYXNzcGF0aENvbnRhaW5lckluaXRpYWxpemVyKFN0cmluZyBjb250YWluZXJJRCkgewotCQlyZXR1cm4gSmF2YUNvcmUuZ2V0Q2xhc3NwYXRoQ29udGFpbmVySW5pdGlhbGl6ZXIoY29udGFpbmVySUQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG5ld1Byb2plY3RFbnRyeShJUGF0aCBwYXRoKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocGF0aCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoRW50cnkgbmV3UHJvamVjdEVudHJ5KElQYXRoIHBhdGgsIGJvb2xlYW4gaXNFeHBvcnRlZCkgewotCQlyZXR1cm4gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBhdGgsIGlzRXhwb3J0ZWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG5ld1Byb2plY3RFbnRyeShJUGF0aCBwYXRoLCBJQWNjZXNzUnVsZVtdIGFjY2Vzc1J1bGVzLCBib29sZWFuIGNvbWJpbmVBY2Nlc3NSdWxlcywgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGV4dHJhQXR0cmlidXRlcywgYm9vbGVhbiBpc0V4cG9ydGVkKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocGF0aCwgYWNjZXNzUnVsZXMsIGNvbWJpbmVBY2Nlc3NSdWxlcywgZXh0cmFBdHRyaWJ1dGVzLCBpc0V4cG9ydGVkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBuZXdMaWJyYXJ5RW50cnkoSVBhdGggcGF0aCwgSVBhdGggc291cmNlQXR0YWNobWVudFBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCkgewotCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG5ld0xpYnJhcnlFbnRyeShJUGF0aCBwYXRoLCBJUGF0aCBzb3VyY2VBdHRhY2htZW50UGF0aCwgSVBhdGggc291cmNlQXR0YWNobWVudFJvb3RQYXRoLCBib29sZWFuIGlzRXhwb3J0ZWQpIHsKLQkJcmV0dXJuIEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShwYXRoLCBzb3VyY2VBdHRhY2htZW50UGF0aCwgc291cmNlQXR0YWNobWVudFJvb3RQYXRoLCBpc0V4cG9ydGVkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBuZXdMaWJyYXJ5RW50cnkoSVBhdGggcGF0aCwgSVBhdGggc291cmNlQXR0YWNobWVudFBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwgSUFjY2Vzc1J1bGVbXSBhY2Nlc3NSdWxlcywgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGV4dHJhQXR0cmlidXRlcywgYm9vbGVhbiBpc0V4cG9ydGVkKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkocGF0aCwgc291cmNlQXR0YWNobWVudFBhdGgsIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCwgYWNjZXNzUnVsZXMsIGV4dHJhQXR0cmlidXRlcywgaXNFeHBvcnRlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2phdmFsaXRlL0phdmFMaXRlVXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvamF2YWxpdGUvSmF2YUxpdGVVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhZGFhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvamF2YWxpdGUvSmF2YUxpdGVVdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5qYXZhbGl0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5Db21tb25GcmFtZXdvcmtzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUxpdGVVdGlsaXRpZXMgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSmF2YSBzb3VyY2UgKGkuZS4gd2hlcmUgdGhlIC5qYXZhIGZpbGVzIGFyZSkgSUNvbnRhaW5lcnMgZm9yCi0JICogdGhlIHNwZWNpZmllZCBJSmF2YVByb2plY3RMaXRlCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0TGl0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3Q8SUNvbnRhaW5lcj4gZ2V0SmF2YVNvdXJjZUNvbnRhaW5lcnMoZmluYWwgSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUpIHsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0TGl0ZS5yZWFkUmF3Q2xhc3NwYXRoKCk7Ci0JCUxpc3Q8SUNvbnRhaW5lcj4gY29udGFpbmVycyA9IG5ldyBBcnJheUxpc3Q8SUNvbnRhaW5lcj4oKTsKLQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBlbnRyaWVzKSB7Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGphdmFQcm9qZWN0TGl0ZS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKGVudHJ5LmdldFBhdGgoKSk7Ci0JCQkJY29udGFpbmVycy5hZGQoY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKYXZhIHNvdXJjZSAoaS5lLiB3aGVyZSB0aGUgY29tcGlsZWQgLmNsYXNzIGZpbGVzIGFyZSkgSUNvbnRhaW5lcnMgZm9yCi0JICogdGhlIHNwZWNpZmllZCBJSmF2YVByb2plY3RMaXRlCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0TGl0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIExpc3Q8SUNvbnRhaW5lcj4gZ2V0SmF2YU91dHB1dENvbnRhaW5lcnMoZmluYWwgSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUpIHsKLQkJTGlzdDxJQ29udGFpbmVyPiBjb250YWluZXJzID0gbmV3IEFycmF5TGlzdDxJQ29udGFpbmVyPigpOwotCQlJQ29udGFpbmVyIGRlZmF1bHRPdXRwdXRDb250YWluZXIgPSBnZXREZWZhdWx0SmF2YU91dHB1dENvbnRhaW5lcihqYXZhUHJvamVjdExpdGUpOwotCQljb250YWluZXJzLmFkZChkZWZhdWx0T3V0cHV0Q29udGFpbmVyKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0TGl0ZS5yZWFkUmF3Q2xhc3NwYXRoKCk7Ci0JCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogZW50cmllcykgewotCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJSUNvbnRhaW5lciBvdXRwdXRDb250YWluZXIgPSBnZXRKYXZhT3V0cHV0Q29udGFpbmVyKGphdmFQcm9qZWN0TGl0ZSwgZW50cnkpOwotCQkJCWlmICghY29udGFpbmVycy5jb250YWlucyhvdXRwdXRDb250YWluZXIpKSB7Ci0JCQkJCWNvbnRhaW5lcnMuYWRkKG91dHB1dENvbnRhaW5lcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluZXJzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGVudW0gSmF2YUNvbnRhaW5lclR5cGUgewotCQlTT1VSQ0UsIE9VVFBVVAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIEphdmEgb3V0cHV0IChpLmUuIHdoZXJlIHRoZSBjb21waWxlZCAuY2xhc3MgZmlsZXMgYXJlKQotCSAqIElDb250YWluZXJzIHdob3NlIHNvdXJjZSBpcyBleHBsaWNpdGx5IG1hcHBlZCBieSB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlydHVhbENvbXBvbmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8SUNvbnRhaW5lcj4gZ2V0SmF2YU91dHB1dENvbnRhaW5lcnMoSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCkgewotCQlyZXR1cm4gZ2V0SmF2YUNvbnRhaW5lcnModmlydHVhbENvbXBvbmVudCwgSmF2YUNvbnRhaW5lclR5cGUuT1VUUFVUKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBKYXZhIHNvdXJjZSAoaS5lLiB3aGVyZSB0aGUgLmphdmEgZmlsZXMgYXJlKSBJQ29udGFpbmVycwotCSAqIGV4cGxpY2l0bHkgbWFwcGVkIGJ5IHRoZSBzcGVjaWZpZWQgY29tcG9uZW50LgotCSAqIAotCSAqIEBwYXJhbSB2aXJ0dWFsQ29tcG9uZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxJQ29udGFpbmVyPiBnZXRKYXZhU291cmNlQ29udGFpbmVycyhJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50KSB7Ci0JCXJldHVybiBnZXRKYXZhQ29udGFpbmVycyh2aXJ0dWFsQ29tcG9uZW50LCBKYXZhQ29udGFpbmVyVHlwZS5TT1VSQ0UpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8SUNvbnRhaW5lcj4gZ2V0SmF2YUNvbnRhaW5lcnMoSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCwgSmF2YUNvbnRhaW5lclR5cGUgamF2YUNvbnRhaW5lclR5cGUpIHsKLQkJaWYgKHZpcnR1YWxDb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB2aXJ0dWFsQ29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJdHJ5IHsKLQkJCWlmICghcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmVMaXRlLk5BVFVSRV9JRCkpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQotCQlJSmF2YVByb2plY3RMaXRlIGphdmFQcm9qZWN0TGl0ZSA9IEphdmFDb3JlTGl0ZS5jcmVhdGUocHJvamVjdCk7Ci0JCUxpc3Q8SUNvbnRhaW5lcj4gY29udGFpbmVycyA9IG5ldyBBcnJheUxpc3Q8SUNvbnRhaW5lcj4oKTsKLQkJaWYgKGphdmFDb250YWluZXJUeXBlID09IEphdmFDb250YWluZXJUeXBlLk9VVFBVVCkgewotCQkJSUNvbnRhaW5lciBkZWZhdWx0T3V0cHV0Q29udGFpbmVyID0gZ2V0RGVmYXVsdEphdmFPdXRwdXRDb250YWluZXIoamF2YVByb2plY3RMaXRlKTsKLQkJCUlWaXJ0dWFsUmVzb3VyY2VbXSB2aXJ0dWFsUmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZGVmYXVsdE91dHB1dENvbnRhaW5lcik7Ci0JCQlmb3IgKElWaXJ0dWFsUmVzb3VyY2UgdmlydHVhbFJlc291cmNlIDogdmlydHVhbFJlc291cmNlcykgewotCQkJCWlmICh2aXJ0dWFsUmVzb3VyY2UuZ2V0Q29tcG9uZW50KCkuZXF1YWxzKHZpcnR1YWxDb21wb25lbnQpKSB7Ci0JCQkJCWNvbnRhaW5lcnMuYWRkKGRlZmF1bHRPdXRwdXRDb250YWluZXIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGphdmFQcm9qZWN0TGl0ZS5yZWFkUmF3Q2xhc3NwYXRoKCk7Ci0JCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogZW50cmllcykgewotCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJSVBhdGggc291cmNlUGF0aCA9IGVudHJ5LmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOyAvLyByZW1vdmUgdGhlIHByb2plY3QgZnJvbSB0aGUgcGF0aAotCQkJCUlDb250YWluZXIgc291cmNlQ29udGFpbmVyID0gc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSA9PSAwID8gcHJvamVjdCA6IHByb2plY3QuZ2V0Rm9sZGVyKHNvdXJjZVBhdGgpOwotCQkJCWlmIChzb3VyY2VDb250YWluZXIgIT0gbnVsbCkgewotCQkJCQlJVmlydHVhbFJlc291cmNlW10gdmlydHVhbFJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKHNvdXJjZUNvbnRhaW5lcik7Ci0JCQkJCWZvciAoSVZpcnR1YWxSZXNvdXJjZSB2aXJ0dWFsUmVzb3VyY2UgOiB2aXJ0dWFsUmVzb3VyY2VzKSB7Ci0JCQkJCQlpZiAodmlydHVhbFJlc291cmNlLmdldENvbXBvbmVudCgpLmVxdWFscyh2aXJ0dWFsQ29tcG9uZW50KSkgewotCQkJCQkJCXN3aXRjaCAoamF2YUNvbnRhaW5lclR5cGUpIHsKLQkJCQkJCQljYXNlIFNPVVJDRToKLQkJCQkJCQkJaWYgKCFjb250YWluZXJzLmNvbnRhaW5zKHNvdXJjZUNvbnRhaW5lcikpIHsKLQkJCQkJCQkJCWNvbnRhaW5lcnMuYWRkKHNvdXJjZUNvbnRhaW5lcik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBPVVRQVVQ6Ci0JCQkJCQkJCUlDb250YWluZXIgb3V0cHV0Q29udGFpbmVyID0gZ2V0SmF2YU91dHB1dENvbnRhaW5lcihqYXZhUHJvamVjdExpdGUsIGVudHJ5KTsKLQkJCQkJCQkJaWYgKCFjb250YWluZXJzLmNvbnRhaW5zKG91dHB1dENvbnRhaW5lcikpIHsKLQkJCQkJCQkJCWNvbnRhaW5lcnMuYWRkKG91dHB1dENvbnRhaW5lcik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgSmF2YSBvdXRwdXQgSUNvbnRhaW5lciAoaS5lLiB3aGVyZSB0aGUgY29tcGlsZWQKLQkgKiAuY2xhc3MgZmlsZXMgZ28pCi0JICogCi0JICogQHBhcmFtIGphdmFQcm9qZWN0TGl0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250YWluZXIgZ2V0RGVmYXVsdEphdmFPdXRwdXRDb250YWluZXIoSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0TGl0ZS5nZXRQcm9qZWN0KCk7Ci0JCUlQYXRoIGRlZmF1bHRPdXRwdXRQYXRoID0gamF2YVByb2plY3RMaXRlLnJlYWRPdXRwdXRMb2NhdGlvbigpOwotCQlpZiAoZGVmYXVsdE91dHB1dFBhdGguc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3QuZ2V0Rm9sZGVyKGRlZmF1bHRPdXRwdXRQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgb3V0cHV0IChpLmUuIHdoZXJlIHRoZSBjb21waWxlZCAuY2xhc3MgZmlsZXMgZ28pCi0JICogSUNvbnRhaW5lciBmb3IgdGhlIHNwZWNpZmllZCBJQ2xhc3NwYXRoRW50cnkKLQkgKiAKLQkgKiBAcGFyYW0gamF2YVByb2plY3RMaXRlCi0JICogQHBhcmFtIGVudHJ5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBnZXRKYXZhT3V0cHV0Q29udGFpbmVyKElKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlLCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0TGl0ZS5nZXRQcm9qZWN0KCk7Ci0JCUlQYXRoIG91dHB1dFBhdGggPSBlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQlpZiAob3V0cHV0UGF0aCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvamVjdC5nZXRGb2xkZXIob3V0cHV0UGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJfQotCQlyZXR1cm4gZ2V0RGVmYXVsdEphdmFPdXRwdXRDb250YWluZXIoamF2YVByb2plY3RMaXRlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvamF2YWxpdGUvSmF2YVByb2plY3RMaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9qZHQvaW50ZXJuYWwvamF2YWxpdGUvSmF2YVByb2plY3RMaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYjA1MzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2phdmFsaXRlL0phdmFQcm9qZWN0TGl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5Db21tb25GcmFtZXdvcmtzUGx1Z2luOwotCi0vKioKLSAqIEBzZWUgSUphdmFQcm9qZWN0TGl0ZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YVByb2plY3RMaXRlIGltcGxlbWVudHMgSUphdmFQcm9qZWN0TGl0ZSB7Ci0JcHJpdmF0ZSBmaW5hbCBJSmF2YVByb2plY3QgX2phdmFQcm9qZWN0OwotCi0JcHJpdmF0ZSBPYmplY3QgbG9jayA9IG5ldyBPYmplY3QoKTsKLQlwcml2YXRlIGJvb2xlYW4gX2phdmFQcm9qZWN0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gX3Jhd0NsYXNzcGF0aFJlYWQgPSBmYWxzZTsKLQlwcml2YXRlIElDbGFzc3BhdGhFbnRyeVtdIF9yYXdDbGFzc3BhdGg7Ci0JcHJpdmF0ZSBib29sZWFuIF9yYXdPdXRwdXRMb2NhdGlvblJlYWQgPSBmYWxzZTsKLQlwcml2YXRlIElQYXRoIF9yYXdPdXRwdXRMb2NhdGlvbjsKLQlwcml2YXRlIGxvbmcgX2RvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wID0gSUZpbGUuTlVMTF9TVEFNUDsKLQotCUphdmFQcm9qZWN0TGl0ZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGJvb2xlYW4gamF2YVByb2plY3RJbml0aWFsaXplZCkgewotCQl0aGlzLl9qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQl0aGlzLl9qYXZhUHJvamVjdEluaXRpYWxpemVkID0gamF2YVByb2plY3RJbml0aWFsaXplZDsKLQl9Ci0KLQl2b2lkIG1hcmtKYXZhUHJvamVjdEluaXRpYWxpemVkKCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCWlmICghX2phdmFQcm9qZWN0SW5pdGlhbGl6ZWQpIHsKLQkJCQlfamF2YVByb2plY3RJbml0aWFsaXplZCA9IHRydWU7Ci0JCQkJZmx1c2hDbGFzc3BhdGgoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0phdmFQcm9qZWN0SW5pdGlhbGl6ZWQoKSB7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJcmV0dXJuIF9qYXZhUHJvamVjdEluaXRpYWxpemVkOwotCQl9Ci0JfQotCi0Jdm9pZCBmbHVzaENsYXNzcGF0aCgpIHsKLQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQlfcmF3Q2xhc3NwYXRoUmVhZCA9IGZhbHNlOwotCQkJX3Jhd0NsYXNzcGF0aCA9IG51bGw7Ci0JCQlfcmF3T3V0cHV0TG9jYXRpb25SZWFkID0gZmFsc2U7Ci0JCQlfcmF3T3V0cHV0TG9jYXRpb24gPSBudWxsOwotCQkJX2RvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wID0gSUZpbGUuTlVMTF9TVEFNUDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlEb3RDbGFzc3BhdGhNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJbG9uZyBtb2RpZmljYXRpb25TdGFtcCA9IElGaWxlLk5VTExfU1RBTVA7Ci0JCXN5bmNocm9uaXplZCAobG9jaykgewotCQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBfZG90Q2xhc3NwYXRoTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQkJaWYgKG1vZGlmaWNhdGlvblN0YW1wID09IElGaWxlLk5VTExfU1RBTVApIHsKLQkJCWZsdXNoQ2xhc3NwYXRoKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUZpbGUgZG90Q2xhc3NwYXRoID0gX2phdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGaWxlKCIuY2xhc3NwYXRoIik7Ci0JCWlmICghZG90Q2xhc3NwYXRoLmV4aXN0cygpKSB7Ci0JCQlmbHVzaENsYXNzcGF0aCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtb2RpZmljYXRpb25TdGFtcCAhPSBkb3RDbGFzc3BhdGguZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSkgewotCQkJZmx1c2hDbGFzc3BhdGgoKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVEb3RDbGFzc3BhdGhNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJSUZpbGUgZG90Q2xhc3NwYXRoID0gX2phdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGaWxlKCIuY2xhc3NwYXRoIik7Ci0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXAgPSBkb3RDbGFzc3BhdGguZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQlfZG90Q2xhc3NwYXRoTW9kaWZpY2F0aW9uU3RhbXAgPSBtb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCX0KLQotCXB1YmxpYyBmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSByZWFkUmF3Q2xhc3NwYXRoKCkgewotCQlpZiAoIWlzSmF2YVByb2plY3RJbml0aWFsaXplZCgpKSB7Ci0JCQlpZiAoSmF2YUNvcmVMaXRlLmlzSW5pdGlhbGl6ZWQoX2phdmFQcm9qZWN0KSkgewotCQkJCW1hcmtKYXZhUHJvamVjdEluaXRpYWxpemVkKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaXNKYXZhUHJvamVjdEluaXRpYWxpemVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIF9qYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQotCQl2ZXJpZnlEb3RDbGFzc3BhdGhNb2RpZmljYXRpb25TdGFtcCgpOwotCi0JCWJvb2xlYW4gZGF0YVJlYWQgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQlkYXRhUmVhZCA9IF9yYXdDbGFzc3BhdGhSZWFkOwotCQl9Ci0JCWlmICghZGF0YVJlYWQpIHsKLQkJCXVwZGF0ZURvdENsYXNzcGF0aE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSByYXdDbGFzc3BhdGggPSBfamF2YVByb2plY3QucmVhZFJhd0NsYXNzcGF0aCgpOwotCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJX3Jhd0NsYXNzcGF0aFJlYWQgPSB0cnVlOwotCQkJCV9yYXdDbGFzc3BhdGggPSByYXdDbGFzc3BhdGg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9yYXdDbGFzc3BhdGg7Ci0JfQotCi0JcHVibGljIGZpbmFsIElQYXRoIHJlYWRPdXRwdXRMb2NhdGlvbigpIHsKLQkJaWYgKCFpc0phdmFQcm9qZWN0SW5pdGlhbGl6ZWQoKSkgewotCQkJaWYgKEphdmFDb3JlTGl0ZS5pc0luaXRpYWxpemVkKF9qYXZhUHJvamVjdCkpIHsKLQkJCQltYXJrSmF2YVByb2plY3RJbml0aWFsaXplZCgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGlzSmF2YVByb2plY3RJbml0aWFsaXplZCgpKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBfamF2YVByb2plY3QuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQotCQl2ZXJpZnlEb3RDbGFzc3BhdGhNb2RpZmljYXRpb25TdGFtcCgpOwotCi0JCWJvb2xlYW4gZGF0YVJlYWQgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQlkYXRhUmVhZCA9IF9yYXdPdXRwdXRMb2NhdGlvblJlYWQ7Ci0JCX0KLQkJaWYgKCFkYXRhUmVhZCkgewotCQkJdXBkYXRlRG90Q2xhc3NwYXRoTW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCUlQYXRoIHJhd091dHB1dExvY2F0aW9uID0gX2phdmFQcm9qZWN0LnJlYWRPdXRwdXRMb2NhdGlvbigpOwotCQkJc3luY2hyb25pemVkIChsb2NrKSB7Ci0JCQkJX3Jhd091dHB1dExvY2F0aW9uUmVhZCA9IHRydWU7Ci0JCQkJX3Jhd091dHB1dExvY2F0aW9uID0gcmF3T3V0cHV0TG9jYXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9yYXdPdXRwdXRMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElKYXZhUHJvamVjdExpdGUjZ2V0UHJvamVjdCgpCi0JICovCi0JcHVibGljIGZpbmFsIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBfamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIF9qYXZhUHJvamVjdC5leGlzdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElKYXZhUHJvamVjdExpdGUjaXNPcGVuKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc09wZW4oKSB7Ci0JCXJldHVybiBfamF2YVByb2plY3QuaXNPcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJSmF2YVByb2plY3RMaXRlI2hhc0J1aWxkU3RhdGUoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0J1aWxkU3RhdGUoKSB7Ci0JCXJldHVybiBfamF2YVByb2plY3QuaGFzQnVpbGRTdGF0ZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0lKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzQwYjFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRV9GT0xERVJfTkFNRSA9ICJJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0ZPTERFUl9OQU1FIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FID0gIklKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5ERUZBVUxUX09VVFBVVF9GT0xERVJfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0ZBQ0VUX0lOU1RBTExfQ09ORklHID0gIklKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX0ZBQ0VUX0lOU1RBTExfQ09ORklHIjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmVmNmY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXRJbnN0YWxsQ29uZmlnLkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5JRXZlbnRMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIEphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotICAgIHByaXZhdGUgZmluYWwgSmF2YUZhY2V0SW5zdGFsbENvbmZpZyBpbnN0YWxsQ29uZmlnOwotICAgIAotCXB1YmxpYyBKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXRoaXMoIG5ldyBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKCkgKTsKLQl9Ci0JCi0JcHVibGljIEphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciggZmluYWwgSmF2YUZhY2V0SW5zdGFsbENvbmZpZyBpbnN0YWxsQ29uZmlnICkKLQl7Ci0JICAgIHRoaXMuaW5zdGFsbENvbmZpZyA9IGluc3RhbGxDb25maWc7Ci0JICAgIAotCSAgICBmaW5hbCBJRXZlbnRMaXN0ZW5lcjxKYXZhRmFjZXRJbnN0YWxsQ29uZmlnLkNoYW5nZUV2ZW50PiBsaXN0ZW5lcgotCSAgICAgICAgPSBuZXcgSUV2ZW50TGlzdGVuZXI8SmF2YUZhY2V0SW5zdGFsbENvbmZpZy5DaGFuZ2VFdmVudD4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgQ2hhbmdlRXZlbnQgZXZlbnQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElEYXRhTW9kZWwgZG0gPSBnZXREYXRhTW9kZWwoKTsKLQotICAgICAgICAgICAgICAgIGlmKCBldmVudC5nZXRUeXBlKCkgPT0gSmF2YUZhY2V0SW5zdGFsbENvbmZpZy5DaGFuZ2VFdmVudC5UeXBlLlNPVVJDRV9GT0xERVJTX0NIQU5HRUQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiggaW5zdGFsbENvbmZpZy5nZXRTb3VyY2VGb2xkZXJzKCkuc2l6ZSgpID4gMCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGluc3RhbGxDb25maWcuZ2V0U291cmNlRm9sZGVycygpLmdldCggMCApLnRvUG9ydGFibGVTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZG0uc2V0UHJvcGVydHkoIFNPVVJDRV9GT0xERVJfTkFNRSwgdmFsICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoIGV2ZW50LmdldFR5cGUoKSA9PSBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnLkNoYW5nZUV2ZW50LlR5cGUuREVGQVVMVF9PVVRQVVRfRk9MREVSX0NIQU5HRUQgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbCA9IGluc3RhbGxDb25maWcuZ2V0RGVmYXVsdE91dHB1dEZvbGRlcigpLnRvUG9ydGFibGVTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgZG0uc2V0UHJvcGVydHkoIERFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FLCB2YWwgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICB0aGlzLmluc3RhbGxDb25maWcuYWRkTGlzdGVuZXIoIGxpc3RlbmVyICk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoSkFWQV9GQUNFVF9JTlNUQUxMX0NPTkZJRyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFNPVVJDRV9GT0xERVJfTkFNRSk7Ci0gICAgICAgIHByb3BlcnR5TmFtZXMuYWRkKERFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgcHJvcGVydHlWYWx1ZSApCi0gICAgewotICAgICAgICBpZiggcHJvcGVydHlOYW1lLmVxdWFscyggU09VUkNFX0ZPTERFUl9OQU1FICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PElQYXRoPiBzb3VyY2VGb2xkZXJzOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiggcHJvcGVydHlWYWx1ZSA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VGb2xkZXJzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc291cmNlRm9sZGVycyA9IENvbGxlY3Rpb25zLjxJUGF0aD5zaW5nbGV0b25MaXN0KCBuZXcgUGF0aCggKFN0cmluZykgcHJvcGVydHlWYWx1ZSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHRoaXMuaW5zdGFsbENvbmZpZy5zZXRTb3VyY2VGb2xkZXJzKCBzb3VyY2VGb2xkZXJzICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIHByb3BlcnR5TmFtZS5lcXVhbHMoIERFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmluc3RhbGxDb25maWcuc2V0RGVmYXVsdE91dHB1dEZvbGRlciggbmV3IFBhdGgoIChTdHJpbmcpIHByb3BlcnR5VmFsdWUgKSApOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiggcHJvcGVydHlOYW1lLmVxdWFscyggSkFWQV9GQUNFVF9JTlNUQUxMX0NPTkZJRyApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VwZXIucHJvcGVydHlTZXQoIHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSApOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEZBQ0VUX0lELmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gSU1vZHVsZUNvbnN0YW50cy5KU1RfSkFWQTsKLQkJfQotCQllbHNlIGlmKCBKQVZBX0ZBQ0VUX0lOU1RBTExfQ09ORklHLmVxdWFscyggcHJvcGVydHlOYW1lICkgKQotCQl7Ci0JCSAgICByZXR1cm4gdGhpcy5pbnN0YWxsQ29uZmlnOwotCQl9Ci0JCWVsc2UgaWYoIFNPVVJDRV9GT0xERVJfTkFNRS5lcXVhbHMoIHByb3BlcnR5TmFtZSApICkKLQkJewotCQkgICAgaWYoIHRoaXMuaW5zdGFsbENvbmZpZy5nZXRTb3VyY2VGb2xkZXJzKCkuaXNFbXB0eSgpICkKLQkJICAgIHsKLQkJICAgICAgICByZXR1cm4gbnVsbDsKLQkJICAgIH0KLQkJICAgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgICByZXR1cm4gdGhpcy5pbnN0YWxsQ29uZmlnLmdldFNvdXJjZUZvbGRlcnMoKS5nZXQoIDAgKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCSAgICB9Ci0JCX0KLQkJZWxzZSBpZiggREVGQVVMVF9PVVRQVVRfRk9MREVSX05BTUUuZXF1YWxzKCBwcm9wZXJ0eU5hbWUgKSApCi0JCXsKLQkJICAgIGZpbmFsIElQYXRoIG91dHB1dEZvbGRlciA9IHRoaXMuaW5zdGFsbENvbmZpZy5nZXREZWZhdWx0T3V0cHV0Rm9sZGVyKCk7Ci0JCSAgICAKLQkJICAgIGlmKCBvdXRwdXRGb2xkZXIgPT0gbnVsbCApCi0JCSAgICB7Ci0JCSAgICAgICAgcmV0dXJuIG51bGw7Ci0JCSAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgICAgcmV0dXJuIG91dHB1dEZvbGRlci50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCSAgICB9Ci0JCX0KLSAgICAgICAgCi0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0VXRpbHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvSmF2YUZhY2V0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmNjQ5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFGYWNldFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkphdmFGYWNldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgSmF2YUZhY2V0VXRpbHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgSkFWQV9GQUNFVCA9IEphdmFGYWNldC5GQUNFVDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEpBVkFfMTMgPSBKYXZhRmFjZXQuSkFWQV8xMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEpBVkFfMTQgPSBKYXZhRmFjZXQuSkFWQV8xNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEpBVkFfNTAgPSBKYXZhRmFjZXQuSkFWQV81MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEpBVkFfNjAgPSBKYXZhRmFjZXQuSkFWQV82MDsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21waWxlckxldmVsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhRmFjZXRVdGlsLmdldENvbXBpbGVyTGV2ZWwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21waWxlckxldmVsKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBKYXZhRmFjZXRVdGlsLmdldENvbXBpbGVyTGV2ZWwoIHByb2plY3QgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBpbGVyTGV2ZWwoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ICkKLSAgICAKLSAgICAgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAgICAgCi0gICAgewotICAgICAgICBKYXZhRmFjZXRVdGlsLnNldENvbXBpbGVyTGV2ZWwoIHByb2plY3QsIGZ2ICk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbXBpbGVyTGV2ZWwoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsZXZlbCApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgSmF2YUZhY2V0VXRpbC5zZXRDb21waWxlckxldmVsKCBwcm9qZWN0LCBsZXZlbCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2NoZWR1bGVGdWxsQnVpbGQoIGZpbmFsIElQcm9qZWN0IHByb2plY3QgKQotICAgIHsKLSAgICAgICAgSmF2YUZhY2V0VXRpbC5zY2hlZHVsZUZ1bGxCdWlsZCggcHJvamVjdCApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRDbGFzc3BhdGgoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBvbGR2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBuZXd2ZXIgKQotICAgIAotICAgICAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgICAgICAKLSAgICB7Ci0gICAgICAgIEphdmFGYWNldFV0aWwucmVzZXRDbGFzc3BhdGgoIHByb2plY3QsIG9sZHZlciwgbmV3dmVyICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gY29tcGlsZXJMZXZlbFRvRmFjZXQoIGZpbmFsIFN0cmluZyB2ZXIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEphdmFGYWNldFV0aWwuY29tcGlsZXJMZXZlbFRvRmFjZXQoIHZlciApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhY2V0VG9Db21waWxlckxldmVsKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiApCi0gICAgewotICAgICAgICByZXR1cm4gSmF2YUZhY2V0VXRpbC5mYWNldFRvQ29tcGlsZXJMZXZlbCggZnYgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFQcm9qZWN0RmFjZXRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L0phdmFQcm9qZWN0RmFjZXRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZjViMmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9KYXZhUHJvamVjdEZhY2V0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEphdmFQcm9qZWN0RmFjZXRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgSmF2YVByb2plY3RGYWNldENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0gICAgICAgIENvbGxlY3Rpb24gcmVxdWlyZWRGYWNldHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHJlcXVpcmVkRmFjZXRzLmFkZChKYXZhRmFjZXRVdGlscy5KQVZBX0ZBQ0VUKTsKLSAgICAgICAgc2V0UHJvcGVydHkoUkVRVUlSRURfRkFDRVRTX0NPTExFQ1RJT04sIHJlcXVpcmVkRmFjZXRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvV3RwVXRpbHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvV3RwVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyZDdkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L1d0cFV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFd0cFV0aWxzIAotewotICAgIHByaXZhdGUgV3RwVXRpbHMoKSB7fQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXVFBfTkFUVVJFIAotICAgICAgICA9ICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuTW9kdWxlQ29yZU5hdHVyZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkVNX05BVFVSRQotICAgICAgICA9ICJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLkphdmFFTUZOYXR1cmUiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTkFUVVJFUyA9IHtXVFBfTkFUVVJFLCBKRU1fTkFUVVJFfTsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmF0dXJlcyggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgCi0gICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICAgIAotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOQVRVUkVTLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIXByb2plY3QuaGFzTmF0dXJlKE5BVFVSRVNbaV0pKSB7Ci0JCQkJUHJvamVjdFV0aWxpdGllcy5hZGROYXR1cmVUb1Byb2plY3QocHJvamVjdCwgTkFUVVJFU1tpXSk7Ci0JCQl9Ci0JCX0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmF0dXJlc3RvRUFSKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ICkKLSAgICAKLSAgICB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotICAgIAotCXsKLQkgICAgZmluYWwgSVByb2plY3REZXNjcmlwdGlvbiBkZXNjID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCSAgICBmaW5hbCBTdHJpbmdbXSBjdXJyZW50ID0gZGVzYy5nZXROYXR1cmVJZHMoKTsKLQkgICAgZmluYWwgU3RyaW5nW10gcmVwbGFjZW1lbnQgPSBuZXcgU3RyaW5nWyBjdXJyZW50Lmxlbmd0aCArIDEgXTsKLQkgICAgU3lzdGVtLmFycmF5Y29weSggY3VycmVudCwgMCwgcmVwbGFjZW1lbnQsIDAsIGN1cnJlbnQubGVuZ3RoICk7Ci0JICAgIHJlcGxhY2VtZW50WyBjdXJyZW50Lmxlbmd0aCBdID0gV1RQX05BVFVSRTsKLQkgICAgZGVzYy5zZXROYXR1cmVJZHMoIHJlcGxhY2VtZW50ICk7Ci0JICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24oIGRlc2MsIG51bGwgKTsKLQl9ICAKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTmF0dXJlcyggZmluYWwgSVByb2plY3QgcHJvamVjdCApCi0gICAgCi0gICAgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICAKLQl7Ci0gICAgCVByb2plY3RVdGlsaXRpZXMucmVtb3ZlTmF0dXJlRnJvbVByb2plY3QoIHByb2plY3QsIFdUUF9OQVRVUkUgKTsKLSAgICAJUHJvamVjdFV0aWxpdGllcy5yZW1vdmVOYXR1cmVGcm9tUHJvamVjdCggcHJvamVjdCwgSkVNX05BVFVSRSApOwotCX0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2ludGVybmFsL0RhdGFNb2RlbFRvSmF2YUZhY2V0SW5zdGFsbENvbmZpZ0FkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvaW50ZXJuYWwvRGF0YU1vZGVsVG9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDAyZDg4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzL3NyYy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL3Byb2plY3QvZmFjZXQvaW50ZXJuYWwvRGF0YU1vZGVsVG9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LklKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXRJbnN0YWxsQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRGF0YU1vZGVsVG9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnQWRhcHRlcgotCi0gICAgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLSAgICAKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIEFEQVBURVJfVFlQRVMgPSB7IEphdmFGYWNldEluc3RhbGxDb25maWcuY2xhc3MgfTsKLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoIGZpbmFsIE9iamVjdCBhZGFwdGFibGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3MgYWRhcHRlclR5cGUgKQotICAgIHsKLSAgICAgICAgaWYoIGFkYXB0ZXJUeXBlID09IEphdmFGYWNldEluc3RhbGxDb25maWcuY2xhc3MgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBJRGF0YU1vZGVsIGRtID0gKElEYXRhTW9kZWwpIGFkYXB0YWJsZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIChKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKSBkbS5nZXRQcm9wZXJ0eSggSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfRkFDRVRfSU5TVEFMTF9DT05GSUcgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBBREFQVEVSX1RZUEVTOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3Mvc3JjL29yZy9lY2xpcHNlL2pzdC9jb21tb24vcHJvamVjdC9mYWNldC9pbnRlcm5hbC9KYXZhRmFjZXRJbnN0YWxsQ29uZmlnVG9EYXRhTW9kZWxBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2ludGVybmFsL0phdmFGYWNldEluc3RhbGxDb25maWdUb0RhdGFNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyYzRjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy9zcmMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9wcm9qZWN0L2ZhY2V0L2ludGVybmFsL0phdmFGYWNldEluc3RhbGxDb25maWdUb0RhdGFNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5KYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgotICovCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnVG9EYXRhTW9kZWxBZGFwdGVyCi0KLSAgICBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotICAgIAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gQURBUFRFUl9UWVBFUyA9IHsgSURhdGFNb2RlbC5jbGFzcyB9OwotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlciggZmluYWwgT2JqZWN0IGFkYXB0YWJsZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBhZGFwdGVyVHlwZSApCi0gICAgewotICAgICAgICBpZiggYWRhcHRlclR5cGUgPT0gSURhdGFNb2RlbC5jbGFzcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBwcm92aWRlciAKLSAgICAgICAgICAgICAgICA9IG5ldyBKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoIChKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKSBhZGFwdGFibGUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKCBwcm92aWRlciApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFEQVBURVJfVFlQRVM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCBhMzUxMGQyLi5jY2FhOWJlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTEsMTIgKzEsOTUgQEAKLSNUaHUgTWF5IDEwIDE4OjMzOjUxIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKKyNXZWQgSnVuIDI0IDEwOjEzOjMyIEVEVCAyMDA5CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWVycm9yCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlVW5jaGVja2VkRXhjZXB0aW9ucz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitpbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNjg1YTI2MS4uODM3M2UwMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMiw3ICsyLDcgQEAKIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiAxLjIuNy5xdWFsaWZpZXIKIEJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luLkoyRUVDb3JlUGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KQEAgLTg0LDYgKzg0LDExIEBACiAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuaW50ZXJuYWwuYWRhcHRlciwKKyBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYSwKKyBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AsCiAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhO3gtaW50ZXJuYWw6PXRydWUsCkBAIC05MiwyNCArOTcsMzMgQEAKICBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAsCisgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuaW50ZXJuYWwuaW1wbDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLm1ldGFkYXRhO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQsCisgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5pbXBsO3gtaW50ZXJuYWw6PXRydWUsCisgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5tZXRhZGF0YTt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb24sCiAgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLAogIG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlCiBSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuamVtO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKICBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiLAorIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSIzLjguMSIsCiAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCiAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLAogIG9yZy5lY2xpcHNlLmpkdC5jb3JlLAogIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCisgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSIxLjEuNDAwIgogRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0Fic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQppbmRleCA1OWE4N2U3Li40NTRiZWM2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQWJzdHJhY3RBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQpAQCAtODAsNiArODAsNyBAQAogCQl2ZXJpZnlSZWxhdGl2ZShtYW5pZmVzdFBhdGgpOwogCQlJQXJjaGl2ZVJlc291cmNlIG1hbmlmZXN0ID0gbnVsbDsKIAkJbWFuaWZlc3QgPSBuZXcgQXJjaGl2ZVJlc291cmNlSW1wbCgpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkJCVN0cmluZyBtYW5pZmVzdENvbnRlbnRzID0gIk1hbmlmZXN0LVZlcnNpb246IDEuMFxyXG5cclxuIjsgLy8kTk9OLU5MUy0xJAogCQkJCXJldHVybiBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obWFuaWZlc3RDb250ZW50cy5nZXRCeXRlcygpKSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQWJzdHJhY3RBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BYnN0cmFjdEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCmluZGV4IGMzMmM5NTkuLmU5MzIyNDEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BYnN0cmFjdEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BYnN0cmFjdEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwogCiAvKioKICAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJQXJjaGl2ZVNhdmVBZGFwdGVyfSBpbnRlbmRlZCBmb3IKQEAgLTQwLDEwICs0MSwxMCBAQAogCQlmaW5hbCBpbnQgVE9UQUxfVElDS1MgPSBHQVRIRVJfUkVTT1VSQ0VTX1RJQ0tTICsgU0FWRV9SRVNPVVJDRVNfVElDS1MgKyBGSU5JU0hfVElDS1M7CiAJCUV4Y2VwdGlvbiBjYXVnaHRFeGNlcHRpb24gPSBudWxsOwogCQl0cnkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIlNhdmluZyByZXNvdXJjZXMiLCBUT1RBTF9USUNLUyk7CisJCQltb25pdG9yLmJlZ2luVGFzayhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFic3RyYWN0QXJjaGl2ZVNhdmVBZGFwdGVyX1NhdmluZ19yZXNvdXJjZV8sIFRPVEFMX1RJQ0tTKTsKIAkJCQogCQkJTGlzdDxJQXJjaGl2ZVJlc291cmNlPiBmaWxlcyA9IGdldEFyY2hpdmVSZXNvdXJjZXNGb3JTYXZlKCk7Ci0JCQlJUGF0aCBtYW5pZmVzdFBhdGggPSBuZXcgUGF0aCgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsKKwkJCUlQYXRoIG1hbmlmZXN0UGF0aCA9IG5ldyBQYXRoKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOyAvLyROT04tTkxTLTEkCiAJCQlpZihnZXRBcmNoaXZlKCkuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UobWFuaWZlc3RQYXRoKSl7CiAJCQkJbWFuaWZlc3QgPSBnZXRBcmNoaXZlKCkuZ2V0QXJjaGl2ZVJlc291cmNlKG1hbmlmZXN0UGF0aCk7CiAJCQl9CkBAIC01Nyw3ICs1OCw3IEBACiAJCQlpbnQgU1VCX1NBVkVfVElDS1MgPSAxMDsKIAkJCWludCBTVUJfVE9UQUxfVElDS1MgPSBTVUJfU0FWRV9USUNLUyAqIChmaWxlcy5zaXplKCkgKyAyKTsKIAkJCXRyeSB7Ci0JCQkJc2F2ZVN1Yk1vbml0b3IuYmVnaW5UYXNrKCJTYXZpbmcgcmVzb3VyY2VzIiwgU1VCX1RPVEFMX1RJQ0tTKTsKKwkJCQlzYXZlU3ViTW9uaXRvci5iZWdpblRhc2soQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5BYnN0cmFjdEFyY2hpdmVTYXZlQWRhcHRlcl9TYXZpbmdfcmVzb3VyY2VfLCBTVUJfVE9UQUxfVElDS1MpOwogCQkJCWlmKG1hbmlmZXN0ICE9IG51bGwpewogCQkJCQlzYXZlKG1hbmlmZXN0KTsKIAkJCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uLmphdmEKaW5kZXggMDUzYTBlOS4uZTJlM2ZmYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL0FyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9BcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24uamF2YQpAQCAtMTAsMTAgKzEwLDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworCiBwdWJsaWMgY2xhc3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGV4dGVuZHMgQXJjaGl2ZUV4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzM2NjExNjEyMjc3NzcyMTE0OEw7CiAKKwlwcml2YXRlIElQYXRoIF9hcmNoaXZlUGF0aCA9IG51bGw7CisJCiAJcHVibGljIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewogCQlzdXBlcihtZXNzYWdlKTsKIAl9CkBAIC0yNiw0ICszMCwxMyBAQAogCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CiAJfQogCQorCXB1YmxpYyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24oSVBhdGggYXJjaGl2ZVBhdGgsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpeworCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisJCXRoaXMuX2FyY2hpdmVQYXRoID0gYXJjaGl2ZVBhdGg7CisJfQorCQorCXB1YmxpYyBJUGF0aCBnZXRBcmNoaXZlUGF0aCgpIHsKKwkJcmV0dXJuIF9hcmNoaXZlUGF0aDsKKwl9CisJCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZUZhY3RvcnlJbXBsLmphdmEKaW5kZXggZGZjNWE4OC4uNzYzNzRmOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVGYWN0b3J5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlRmFjdG9yeUltcGwuamF2YQpAQCAtMjMsNiArMjMsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVNhdmVBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKIAogcHVibGljIGNsYXNzIEFyY2hpdmVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIElBcmNoaXZlRmFjdG9yeSB7CiAKQEAgLTYzLDcgKzY1LDcgQEAKIAkJZmluYWwgaW50IENMRUFOVVBfVElDS1MgPSAxOwogCQlmaW5hbCBpbnQgVE9UQUxfVElDS1MgPSBTQVZFX1RJQ0tTICsgQ0xFQU5VUF9USUNLUzsKIAkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCJTYXZpbmcgYXJjaGl2ZSB0bzogIiArIG91dHB1dFBhdGgudG9PU1N0cmluZygpLCBUT1RBTF9USUNLUyk7CisJCQltb25pdG9yLmJlZ2luVGFzayhOTFMuYmluZChDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFyY2hpdmVGYWN0b3J5SW1wbF9TYXZpbmdfYXJjaGl2ZV90b18wXywgb3V0cHV0UGF0aC50b09TU3RyaW5nKCkpLCBUT1RBTF9USUNLUyk7CiAJCQlTdHJpbmcgYVVyaSA9IG91dHB1dFBhdGgudG9PU1N0cmluZygpOwogCQkJamF2YS5pby5GaWxlIGFGaWxlID0gbmV3IGphdmEuaW8uRmlsZShhVXJpKTsKIAkJCUFyY2hpdmVVdGlsLmNoZWNrV3JpdGVhYmxlKGFGaWxlKTsKQEAgLTgxLDcgKzgzLDcgQEAKIAkJCQl9CiAJCQkJbW9uaXRvci53b3JrZWQoQ0xFQU5VUF9USUNLUyk7CiAJCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uKCJFcnJvciBzYXZpbmcgYXJjaGl2ZTogIiArIGFyY2hpdmUgKyAiIHRvIG91dHB1dCBwYXRoOiAiICsgb3V0cHV0UGF0aCwgZSk7CisJCQkJdGhyb3cgbmV3IEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbihOTFMuYmluZChDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFyY2hpdmVGYWN0b3J5SW1wbF9FcnJvcl9zYXZpbmdfYXJjaGl2ZV8wX3RvX291dHB1dF8sIG5ldyBPYmplY3RbXSB7IGFyY2hpdmUsIG91dHB1dFBhdGggfSksIGUpOwogCQkJfSBjYXRjaCAoQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIGZhaWx1cmUpIHsKIAkJCQl0cnkgewogCQkJCQlpZiAoYVNhdmVBZGFwdGVyICE9IG51bGwpCkBAIC0xMDAsNyArMTAyLDcgQEAKIAogCXByb3RlY3RlZCBJQXJjaGl2ZVNhdmVBZGFwdGVyIGNyZWF0ZVNhdmVBZGFwdGVyRm9ySmFyKGphdmEuaW8uRmlsZSBhRmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewogCQlpZiAoYUZpbGUuZXhpc3RzKCkgJiYgYUZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaGUgc3BlY2lmaWVkIGZpbGU6ICIgKyBhRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeSIpOworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuQXJjaGl2ZUZhY3RvcnlJbXBsX1RoZV9zcGVjaWZpZWRfZmlsZV8wX2V4aXN0c19hbmRfLCBhRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwogCQl9CiAJCWphdmEuaW8uRmlsZSBwYXJlbnQgPSBhRmlsZS5nZXRQYXJlbnRGaWxlKCk7CiAJCWlmIChwYXJlbnQgIT0gbnVsbCkKQEAgLTEyNiw3ICsxMjgsNyBAQAogCQlmaW5hbCBpbnQgQ0xPU0VfVElDS1MgPSAyOwogCQlmaW5hbCBpbnQgVE9UQUxfVElDS1MgPSBTQVZFX1RJQ0tTICsgQ0xPU0VfVElDS1M7CiAJCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiU2F2aW5nIGFyY2hpdmUiLCBUT1RBTF9USUNLUyk7CisJCQltb25pdG9yLmJlZ2luVGFzayhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFyY2hpdmVGYWN0b3J5SW1wbF9TYXZpbmdfYXJjaGl2XywgVE9UQUxfVElDS1MpOwogCQkJSUFyY2hpdmVTYXZlQWRhcHRlciBhU2F2ZUFkYXB0ZXIgPSAoSUFyY2hpdmVTYXZlQWRhcHRlcikgYXJjaGl2ZU9wdGlvbnMuZ2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLlNBVkVfQURBUFRFUik7CiAJCQl0cnkgewogCQkJCWFTYXZlQWRhcHRlci5zZXRBcmNoaXZlKGFyY2hpdmUpOwpAQCAtMTQzLDcgKzE0NSw3IEBACiAJCQkJfQogCQkJCXRocm93IGZhaWx1cmU7CiAJCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbigiRXJyb3Igc2F2aW5nIGFyY2hpdmU6ICIgKyBhcmNoaXZlKTsKKwkJCQl0aHJvdyBuZXcgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uKE5MUy5iaW5kKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuQXJjaGl2ZUZhY3RvcnlJbXBsX0Vycm9yX3NhdmluZ19hcmNoaXZlXzBfLCBhcmNoaXZlKSk7CiAJCQl9CiAJCX0gZmluYWxseSB7CiAJCQltb25pdG9yLmRvbmUoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVJbXBsLmphdmEKaW5kZXggZWQ2MDFjZC4uZjJjNGIwZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVJbXBsLmphdmEKQEAgLTMxLDYgKzMxLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUxvYWRBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKIAogcHVibGljIGNsYXNzIEFyY2hpdmVJbXBsIGV4dGVuZHMgQXJjaGl2ZVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIElBcmNoaXZlIHsKIApAQCAtMTE5LDcgKzEyMSw3IEBACiAJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkF0dGVtcHRpbmcgdG8gbW9kaWZ5IGEgZnVsbHkgaW5kZXhlZCBmaWxlIGxpc3QiKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9Ci0JfTsKKwl9CiAKIAlwcml2YXRlIEFyY2hpdmVGaWxlSW5kZXggYXJjaGl2ZUZpbGVJbmRleCA9IG5ldyBBcmNoaXZlRmlsZUluZGV4KCk7CiAKQEAgLTE3MSw3ICsxNzMsNyBAQAogCQkJfQogCQl9CiAJCWlmKGFGaWxlID09IG51bGwpewotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihhcmNoaXZlUmVsYXRpdmVQYXRoLnRvU3RyaW5nKCkgKyIgaW4gIit0b1N0cmluZygpKTsKKwkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oTkxTLmJpbmQoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5BcmNoaXZlSW1wbF8wX2luXzFfLCBuZXcgT2JqZWN0W10geyBhcmNoaXZlUmVsYXRpdmVQYXRoLnRvU3RyaW5nKCksIHRvU3RyaW5nKCkgfSkpOwogCQl9CiAJCXJldHVybiBhRmlsZTsKIAl9CkBAIC0yMDEsMTAgKzIwMywxMiBAQAogCQlyZXR1cm4gYXJjaGl2ZU9wdGlvbnM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJcmV0dXJuIGxvYWRBZGFwdGVyLnRvU3RyaW5nKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKIAkJc3VwZXIuZmluYWxpemUoKTsKIAkJaWYgKGlzT3BlbigpKSB7CkBAIC0yNDgsNiArMjUyLDcgQEAKIAkJCWlmIChhcmNoaXZlUmVzb3VyY2UuZ2V0QXJjaGl2ZSgpICE9IHRoaXMpIHsKIAkJCQl0aHJvdyBuZXcgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uKCJBdHRlbXB0ZWQgdG8gb3BlbiBuZXN0ZWQgSUFyY2hpdmUgIiArIGFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCkgKyAiIHVzaW5nIGFuIElBcmNoaXZlUmVzb3VyY2Ugbm90IGNvbnRhaW5lZCBpbiB0aGlzIElBcmNoaXZlLiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAogCQkJfQorCQkJZ2V0QXJjaGl2ZVJlc291cmNlcygpOyAvLyBuZWVkIHRvIGZvcmNlIHRoZSBmdWxsIGluZGV4IHRvIGJlIGJ1aWx0IG5vdy4KIAkJCUlBcmNoaXZlUmVzb3VyY2UgY2FjaGVkQXJjaGl2ZVJlc291cmNlID0gZ2V0QXJjaGl2ZVJlc291cmNlKGFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCkpOwogCiAJCQlpZiAoY2FjaGVkQXJjaGl2ZVJlc291cmNlLmdldFR5cGUoKSA9PSBJQXJjaGl2ZVJlc291cmNlLkFSQ0hJVkVfVFlQRSkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlUmVzb3VyY2VJbXBsLmphdmEKaW5kZXggODk3YTI0My4uNmNhZTg2MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVSZXNvdXJjZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZVJlc291cmNlSW1wbC5qYXZhCkBAIC04NiwyMCArODYsMjEgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAkJc3dpdGNoIChnZXRUeXBlKCkpIHsKIAkJY2FzZSBGSUxFX1RZUEU6Ci0JCQlidWZmZXIuYXBwZW5kKCJGaWxlOiAiKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIkZpbGU6ICIpOyAvLyROT04tTkxTLTEkCiAJCQlicmVhazsKIAkJY2FzZSBESVJFQ1RPUllfVFlQRToKLQkJCWJ1ZmZlci5hcHBlbmQoIkRpcmVjdG9yeTogIik7CisJCQlidWZmZXIuYXBwZW5kKCJEaXJlY3Rvcnk6ICIpOyAvLyROT04tTkxTLTEkCiAJCQlicmVhazsKIAkJY2FzZSBBUkNISVZFX1RZUEU6Ci0JCQlidWZmZXIuYXBwZW5kKCJBcmNoaXZlOiAiKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIkFyY2hpdmU6ICIpOyAvLyROT04tTkxTLTEkCiAJCQlicmVhazsKIAkJY2FzZSBVTktOT1dOX1RZUEU6Ci0JCQlidWZmZXIuYXBwZW5kKCJVbmtub3duOiAiKTsKKwkJCWJ1ZmZlci5hcHBlbmQoIlVua25vd246ICIpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJYnVmZmVyLmFwcGVuZChnZXRQYXRoKCkpOwogCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZVVSSUNvbnZlcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0FyY2hpdmVVUklDb252ZXJ0ZXIuamF2YQppbmRleCA4NjFiMTc5Li4yODE0YWUxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZVVSSUNvbnZlcnRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlVVJJQ29udmVydGVyLmphdmEKQEAgLTY4LDYgKzY4LDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJbnB1dFN0cmVhbSBjcmVhdGVJbnB1dFN0cmVhbShVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlJUGF0aCBwYXRoID0gZ2V0UGF0aCh1cmkpOwogCQlJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSA9IGdldEFyY2hpdmUoKS5nZXRBcmNoaXZlUmVzb3VyY2UocGF0aCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvQXJjaGl2ZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlVXRpbC5qYXZhCmluZGV4IGEwMjY2N2YuLjJkN2ZjNzYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlVXRpbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9BcmNoaXZlVXRpbC5qYXZhCkBAIC0xNSwxNSArMTUsMTMgQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5NYW5pZmVzdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uOwogCiAKQEAgLTI0NywzOCArMjQ1LDYgQEAKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCiAJcHVibGljIHN0YXRpYyBaaXBGaWxlIG5ld1ppcEZpbGUoRmlsZSBhRmlsZSwgaW50IG1vZGUpIHRocm93cyBaaXBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBaaXBGaWxlKGFGaWxlLCBtb2RlKXsKLQkJCUNvbGxlY3Rpb24gPElucHV0U3RyZWFtPiBvcGVuU3RyZWFtcyA9IG51bGw7Ci0JCQkKLQkJCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShaaXBFbnRyeSBlbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCQlJbnB1dFN0cmVhbSBpbiA9IHN1cGVyLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQkJCQlpZihpbiAhPSBudWxsKXsKLQkJCQkJaWYob3BlblN0cmVhbXMgPT0gbnVsbCl7Ci0JCQkJCQlvcGVuU3RyZWFtcyA9IG5ldyBBcnJheUxpc3Q8SW5wdXRTdHJlYW0+KCk7Ci0JCQkJCX0KLQkJCQkJb3BlblN0cmVhbXMuYWRkKGluKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGluOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkJY2xvc2VPcGVuU3RyZWFtcygpOwotCQkJCXN1cGVyLmNsb3NlKCk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCBjbG9zZU9wZW5TdHJlYW1zKCkgewotCQkJCWlmKG9wZW5TdHJlYW1zICE9IG51bGwpewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gb3BlblN0cmVhbXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJSW5wdXRTdHJlYW0gaW4gPSAoSW5wdXRTdHJlYW0pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl3YXJuKGUpOwotCQkJCQkJfQotCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07CisJCXJldHVybiBNYW5pZmVzdFV0aWxpdGllcy5uZXdaaXBGaWxlKGFGaWxlLCBtb2RlKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvRGVsZXRlT25FeGl0VXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL0RlbGV0ZU9uRXhpdFV0aWxpdHkuamF2YQppbmRleCA0MzY4Y2Q2Li4zYjdmZWYzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvRGVsZXRlT25FeGl0VXRpbGl0eS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9EZWxldGVPbkV4aXRVdGlsaXR5LmphdmEKQEAgLTIwLDkgKzIwLDYgQEAKIAogLyoqCiAgKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAgKi8KIHB1YmxpYyBjbGFzcyBEZWxldGVPbkV4aXRVdGlsaXR5IHsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL1RlbXBaaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL1RlbXBaaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbC5qYXZhCmluZGV4IDBlODE4NDAuLmRkYTA3NjcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9UZW1wWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvVGVtcFppcEZpbGVBcmNoaXZlTG9hZEFkYXB0ZXJJbXBsLmphdmEKQEAgLTM5LDYgKzM5LDcgQEAKIAkJcmV0dXJuIGZpbGU7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGNsb3NlKCkgewogCQlzdXBlci5jbG9zZSgpOwogCQlGaWxlIGZpbGUgPSBnZXRGaWxlKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9aaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbC5qYXZhCmluZGV4IDU1NDIxMWEuLmE2NzlkMmIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9aaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9aaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuTWFuaWZlc3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOwpAQCAtMzgsNiArMzksNyBAQAogCQl0aGlzLnppcEZpbGUgPSB6aXBGaWxlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGNsb3NlKCkgewogCQlzdXBlci5jbG9zZSgpOwogCQl0cnkgewpAQCAtNDcsMTEgKzQ5LDEzIEBACiAJCX0KIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FyY2hpdmVSZXNvdXJjZShJUGF0aCByZXNvdXJjZVBhdGgpIHsKIAkJWmlwRW50cnkgZW50cnkgPSBnZXRaaXBGaWxlKCkuZ2V0RW50cnkocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCkpOwogCQlyZXR1cm4gZW50cnkgIT0gbnVsbDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIElBcmNoaXZlUmVzb3VyY2UgZ2V0QXJjaGl2ZVJlc291cmNlKElQYXRoIGZpbGVQYXRoKSB7CiAJCVppcEVudHJ5IGVudHJ5ID0gZ2V0WmlwRmlsZSgpLmdldEVudHJ5KGZpbGVQYXRoLnRvU3RyaW5nKCkpOwogCQlJQXJjaGl2ZVJlc291cmNlIGFGaWxlID0gbnVsbDsKQEAgLTYxLDYgKzY1LDcgQEAKIAkJcmV0dXJuIGFGaWxlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRBcmNoaXZlUmVzb3VyY2VzKCkgewogCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCUVudW1lcmF0aW9uIGVudHJpZXMgPSBnZXRaaXBGaWxlKCkuZW50cmllcygpOwpAQCAtODcsNDcgKzkyLDExIEBACiAJCXJldHVybiBhRmlsZTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJQXJjaGl2ZVJlc291cmNlIGFGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBwYXRoID0gYUZpbGUuZ2V0UGF0aCgpOwotCQkJU3RyaW5nIHVyaSA9IHBhdGgudG9TdHJpbmcoKTsKLQkJCVppcEVudHJ5IGVudHJ5ID0gZ2V0WmlwRmlsZSgpLmdldEVudHJ5KHVyaSk7Ci0JCQlpZiAoZW50cnkgPT0gbnVsbCkgewotCQkJCS8vIHRoaXMgaXMgYSBoYWNrLCBidXQgemlwIGZpbGVzIGFyZSBzZW5zaXRpdmUgdG8gdGhlIGRpZmZlcmVuY2UKLQkJCQkvLyBiZXR3ZWVuICcvJyBhbmQgJ1xcJwotCQkJCS8vIHNvIHRoZSBoYWNrIGlzIHRvIHRyeSBhbGwgY29tYmluYXRpb25zIHRvIHNlZSBpZiBhbnkgZXhpc3QKLQkJCQljaGFyW10gY2hhcnMgPSB1cmkudG9DaGFyQXJyYXkoKTsKLQkJCQlpbnRbXSBzbGFzaEluZGljZXMgPSBuZXcgaW50W2NoYXJzLmxlbmd0aF07Ci0JCQkJaW50IHNsYXNoQ291bnQgPSAwOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJpLmxlbmd0aCgpOyBpKyspIHsKLQkJCQkJaWYgKGNoYXJzW2ldID09ICcvJyB8fCBjaGFyc1tpXSA9PSAnXFwnKSB7Ci0JCQkJCQlzbGFzaEluZGljZXNbc2xhc2hDb3VudF0gPSBpOwotCQkJCQkJc2xhc2hDb3VudCsrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWludCBzbGFzaFBvdyA9IChpbnQpIE1hdGgucG93KDIsIHNsYXNoQ291bnQpOwotCQkJCWJvb2xlYW4gZm91bmRJdCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2xhc2hQb3cgJiYgIWZvdW5kSXQ7IGkrKykgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNsYXNoQ291bnQ7IGorKykgewotCQkJCQkJaWYgKChpID4+IGogJiAxKSA9PSAxKSB7Ci0JCQkJCQkJY2hhcnNbc2xhc2hJbmRpY2VzW2pdXSA9ICcvJzsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY2hhcnNbc2xhc2hJbmRpY2VzW2pdXSA9ICdcXCc7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZW50cnkgPSBnZXRaaXBGaWxlKCkuZ2V0RW50cnkobmV3IFN0cmluZyhjaGFycykpOwotCQkJCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCQkJZm91bmRJdCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVudHJ5ID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbih1cmkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKGdldFppcEZpbGUoKS5nZXRJbnB1dFN0cmVhbShlbnRyeSkpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gemlwQ2xvc2VkKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oemlwQ2xvc2VkLnRvU3RyaW5nKCkpOwotCQl9CisJCUlQYXRoIHBhdGggPSBhRmlsZS5nZXRQYXRoKCk7CisJCVN0cmluZyB1cmkgPSBwYXRoLnRvU3RyaW5nKCk7CisJCXJldHVybiBNYW5pZmVzdFV0aWxpdGllcy5nZXRJbnB1dHN0cmVhbUZvclppcEVudHJ5KGdldFppcEZpbGUoKSwgdXJpKTsKIAl9CiAKIAlwdWJsaWMgamF2YS51dGlsLnppcC5aaXBGaWxlIGdldFppcEZpbGUoKSB7CkBAIC0xMzgsMTQgKzEwNywxNyBAQAogCQl6aXBGaWxlID0gbmV3WmlwRmlsZTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJcmV0dXJuIHppcEZpbGUuZ2V0TmFtZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zTW9kZWxPYmplY3QoSVBhdGggbW9kZWxPYmplY3RQYXRoKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gewogCQl0aHJvdyBuZXcgQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbigiU2ltcGxlIFppcCBBcmNoaXZlcyBoYXZlIG5vIG1vZGVsIG9iamVjdHMuIik7IC8vJE5PTi1OTFMtMSQKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvWmlwU3RyZWFtQXJjaGl2ZVNhdmVBZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS9hcmNoaXZlL2ludGVybmFsL1ppcFN0cmVhbUFyY2hpdmVTYXZlQWRhcHRlckltcGwuamF2YQppbmRleCA1YjAwZWZmLi40YTBlN2YxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL2FyY2hpdmUvaW50ZXJuYWwvWmlwU3RyZWFtQXJjaGl2ZVNhdmVBZGFwdGVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvYXJjaGl2ZS9pbnRlcm5hbC9aaXBTdHJlYW1BcmNoaXZlU2F2ZUFkYXB0ZXJJbXBsLmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAqIHJlc291cmNlcywgd2lsbCBiZSBvdXRwdXQgdG8gYSBaaXBPdXRwdXRTdHJlYW0uIFRoZSBvdXRwdXQgc3RyZWFtIHNob3VsZCBiZSBwYXNzZWQgaW4gYnkgdGhlCiAgKiBjbGllbnQuCiAgKi8KLXB1YmxpYyBjbGFzcyBaaXBTdHJlYW1BcmNoaXZlU2F2ZUFkYXB0ZXJJbXBsIGV4dGVuZHMgQWJzdHJhY3RBcmNoaXZlU2F2ZUFkYXB0ZXIgaW1wbGVtZW50cyBJQXJjaGl2ZVNhdmVBZGFwdGVyIHsKK3B1YmxpYyBjbGFzcyBaaXBTdHJlYW1BcmNoaXZlU2F2ZUFkYXB0ZXJJbXBsIGV4dGVuZHMgQWJzdHJhY3RBcmNoaXZlU2F2ZUFkYXB0ZXIgewogCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb25TdHJlYW07CiAJLyoqIFVzZWQgaW50ZXJuYWxseSAqLwogCXByb3RlY3RlZCBaaXBPdXRwdXRTdHJlYW0gemlwT3V0cHV0U3RyZWFtOwpAQCAtNDUsNiArNDUsNyBAQAogCQlzZXRaaXBPdXRwdXRTdHJlYW0obmV3IFppcE91dHB1dFN0cmVhbShvdXQpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWdldERlc3RpbmF0aW9uU3RyZWFtKCkuY2xvc2UoKTsKIAl9CkBAIC01Myw2ICs1NCw3IEBACiAJCXJldHVybiBuZXcgWmlwU3RyZWFtQXJjaGl2ZVNhdmVBZGFwdGVySW1wbChnZXRaaXBPdXRwdXRTdHJlYW0oKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkuZmluaXNoKCk7CiAJCS8vSWYgdGhpcyBpcyBub3QgbmVzdGVkLCBjbG9zZSB0aGUgc3RyZWFtIHRvIGZyZWUgdXAgdGhlIHJlc291cmNlCkBAIC03OSw2ICs4MSw3IEBACiAJCXJldHVybiB6aXBPdXRwdXRTdHJlYW07CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgc2F2ZShJQXJjaGl2ZVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL3V0aWwvaW50ZXJuYWwvSmF2YUVFUXVpY2tQZWVrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvYXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvamVlL3V0aWwvaW50ZXJuYWwvSmF2YUVFUXVpY2tQZWVrLmphdmEKaW5kZXggMmI1NDkxZS4uNmE3YjU5OCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS91dGlsL2ludGVybmFsL0phdmFFRVF1aWNrUGVlay5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvdXRpbC9pbnRlcm5hbC9KYXZhRUVRdWlja1BlZWsuamF2YQpAQCAtMzYsMTEgKzM2LDExIEBACiAKIAlwdWJsaWMgSmF2YUVFUXVpY2tQZWVrKGludCB0eXBlLCBpbnQgdmVyc2lvbiwgaW50IGphdmFFRVZlcnNpb24pIHsKIAkJaWYgKHR5cGUgPT0gVU5LTk9XTikgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInR5cGUgbXVzdCBub3QgYmUgVU5LTk9XTiIpOworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInR5cGUgbXVzdCBub3QgYmUgVU5LTk9XTiIpOyAvLyROT04tTkxTLTEkCiAJCX0gZWxzZSBpZiAodmVyc2lvbiA9PSBVTktOT1dOKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidmVyc2lvbiBtdXN0IG5vdCBiZSBVTktOT05XIik7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidmVyc2lvbiBtdXN0IG5vdCBiZSBVTktOT05XIik7IC8vJE5PTi1OTFMtMSQKIAkJfSBlbHNlIGlmIChqYXZhRUVWZXJzaW9uID09IFVOS05PV04pIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJqYXZhRUVWZXJzaW9uIG11c3Qgbm90IGJlIFVOS05PTlciKTsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJqYXZhRUVWZXJzaW9uIG11c3Qgbm90IGJlIFVOS05PTlciKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCXRoaXMudHlwZSA9IHR5cGU7CiAJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247CkBAIC01Nyw5ICs1Nyw3IEBACiAJCQkJLy8gaWdub3JlCiAJCQl9IGZpbmFsbHkgewogCQkJCXRyeSB7Ci0JCQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJCQlpbi5yZXNldCgpOwotCQkJCQl9CisJCQkJCWluLnJlc2V0KCk7CiAJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKIAkJCQkJLy8gaWdub3JlCiAJCQkJfQpAQCAtODYsNiArODQsNyBAQAogCSAqIHtAbGluayBKMkVFVmVyc2lvbkNvbnN0YW50cyNDT05ORUNUT1JfVFlQRX0sCiAJICoge0BsaW5rIEoyRUVWZXJzaW9uQ29uc3RhbnRzI1dFQl9UWVBFfSwKIAkgKiB7QGxpbmsgSjJFRVZlcnNpb25Db25zdGFudHMjV0VCU0VSVklDRVNfVFlQRX0KKwkgKiB7QGxpbmsgSjJFRVZlcnNpb25Db25zdGFudHMjV0VCRlJBR01FTlRfVFlQRX0KIAkgKiAKIAkgKiBAcmV0dXJuCiAJICovCkBAIC0xMDYsNyArMTA1LDEwIEBACiAJCQkJdHlwZSA9IFdFQl9UWVBFOwogCQkJfSBlbHNlIGlmIChyb290TmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfRE9DVFlQRSkpIHsKIAkJCQl0eXBlID0gV0VCU0VSVklDRVNfVFlQRTsKLQkJCX1lbHNlIHsKKwkJCX0gZWxzZSBpZiAocm9vdE5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCRlJBR01FTlRfRE9DVFlQRSkpIHsKKwkJCQl0eXBlID0gV0VCRlJBR01FTlRfVFlQRTsKKwkJCX0KKwkJCWVsc2UgewogCQkJCXR5cGUgPSBVTktOT1dOOwogCQkJfQogCQl9CkBAIC0xMzYsMTEgKzEzOCw3IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCWlmKG5ld0NoYXJzICE9IG51bGwpewotCQkJcmV0dXJuIG5ldyBTdHJpbmcobmV3Q2hhcnMsIDAsIG5ld0NoYXJJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc2NoZW1hTG9jYXRpb247Ci0JCX0KKwkJcmV0dXJuIG5ldyBTdHJpbmcobmV3Q2hhcnMsIDAsIG5ld0NoYXJJbmRleCk7CiAJfQogCQogCS8qKgpAQCAtMTc5LDYgKzE3Nyw4IEBACiAJCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7CiAJCQkJCX0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NDSEVNQV81KSkgewogCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7CisJCQkJCX0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NDSEVNQV82KSkgeworCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ7CiAJCQkJCX0KIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC0xOTYsNiArMTk2LDggQEAKIAkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKIAkJCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NDSEVNQV81KSkgewogCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7CisJCQkJCX0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TQ0hFTUFfNikpIHsKKwkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNl8wX0lEOwogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjExLDYgKzIxMyw4IEBACiAJCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKIAkJCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkVKQkpBUl9TQ0hFTUFfM18wKSkgewogCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8zXzBfSUQ7CisJCQkJCX0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5FSkJKQVJfU0NIRU1BXzNfMSkpIHsKKwkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18xX0lEOwogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjIyLDYgKzIyNiw4IEBACiAJCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lICE9IG51bGwpIHsKIAkJCQkJaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NDSEVNQV8xXzUpKSB7CiAJCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDsKKwkJCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TQ0hFTUFfMV82KSkgeworCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzZfSUQ7CiAJCQkJCX0KIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC0yMzcsNiArMjQzLDggQEAKIAkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEOwogCQkJCQl9IGVsc2UgaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCQVBQX1NDSEVNQV8yXzUpKSB7CiAJCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNV9JRDsKKwkJCQkJfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TQ0hFTUFfM18wKSkgeworCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8zXzBfSUQ7CiAJCQkJCX0KIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC0yNTAsNiArMjU4LDE1IEBACiAJCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCU0VSVklDRVNfMV8xX0lEOwogCQkJCQl9IGVsc2UgaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfMV8yKSkgewogCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQlNFUlZJQ0VTXzFfMl9JRDsKKwkJCQkJfWVsc2UgaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfMV8zKSkgeworCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQlNFUlZJQ0VTXzFfM19JRDsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgV0VCRlJBR01FTlRfVFlQRToKKwkJCQlpZiAoc2NoZW1hTmFtZSAhPSBudWxsKSB7CisJCQkJCWlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkZSQUdNRU5UX1NDSEVNQV8zXzApKSB7CisJCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCRlJBR01FTlRfM18wX0lEOwogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjkzLDYgKzMxMCwxMCBAQAogCQkJCQlicmVhazsKIAkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8zXzBfSUQ6CiAJCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFQ29uc3RhbnRzLkpFRV81XzBfSUQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzNfMV9JRDoKKwkJCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVDb25zdGFudHMuSkVFXzZfMF9JRDsKKwkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBDT05ORUNUT1JfVFlQRToKQEAgLTMwMyw2ICszMjQsOSBAQAogCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDoKIAkJCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVDb25zdGFudHMuSjJFRV8xXzRfSUQ7CiAJCQkJCWJyZWFrOworCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNl9JRDoKKwkJCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVDb25zdGFudHMuSkVFXzZfMF9JRDsKKwkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWJyZWFrOwogCQkJY2FzZSBXRUJfVFlQRToKQEAgLTMxOCw2ICszNDIsMTAgQEAKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl81X0lEOgogCQkJCQlqYXZhRUVWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfM18wX0lEOgorCQkJCQlqYXZhRUVWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKKwkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWJyZWFrOwogCQljYXNlIFdFQlNFUlZJQ0VTX1RZUEU6CkBAIC0zMzAsOCArMzU4LDE0IEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQlNFUlZJQ0VTXzFfMl9JRDoKIAkJCQlqYXZhRUVWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCU0VSVklDRVNfMV8zX0lEOgorCQkJCWphdmFFRVZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNl8wX0lEOwogCQkJfQogCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBXRUJGUkFHTUVOVF9UWVBFOgorCQkJamF2YUVFVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQkZSQUdNRU5UXzNfMF9JRDsKIAkJfQogCQkJaWYgKGphdmFFRVZlcnNpb24gPT0gVU5TRVQpIHsKIAkJCQlqYXZhRUVWZXJzaW9uID0gVU5LTk9XTjsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9hcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qZWUvdXRpbC9pbnRlcm5hbC9YTUxSb290SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS91dGlsL2ludGVybmFsL1hNTFJvb3RIYW5kbGVyLmphdmEKaW5kZXggN2RkYzI2Zi4uZGJjYzNlNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS91dGlsL2ludGVybmFsL1hNTFJvb3RIYW5kbGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2FyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2plZS91dGlsL2ludGVybmFsL1hNTFJvb3RIYW5kbGVyLmphdmEKQEAgLTE4OCw2ICsxODgsNyBAQAogCSAqIEBzZWUgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlciNyZXNvbHZlRW50aXR5KGphdmEubGFuZy5TdHJpbmcsCiAJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKCIiKSk7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0yMTksNiArMjIwLDcgQEAKIAkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI3N0YXJ0RWxlbWVudChqYXZhLmxhbmcuU3RyaW5nLAogCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLnhtbC5zYXguQXR0cmlidXRlcykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgdm9pZCBzdGFydEVsZW1lbnQoZmluYWwgU3RyaW5nIHVyaSwgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgZmluYWwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKIAkJZWxlbWVudEZvdW5kID0gZWxlbWVudE5hbWUgPT0gbnVsbCB8fCBlbGVtZW50TmFtZS5sZW5ndGgoKSA9PSAwID8gcXVhbGlmaWVkTmFtZTogZWxlbWVudE5hbWU7CiAJCWlmKGVsZW1lbnRGb3VuZC5pbmRleE9mKCc6JykgIT0gLTEpewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvY29tbW9uYXJjaGl2ZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvY29tbW9uYXJjaGl2ZS5wcm9wZXJ0aWVzCmluZGV4IGY1MGY1NDkuLjI5MjBiY2YgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL2NvbW1vbmFyY2hpdmUucHJvcGVydGllcworKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9jb21tb25hcmNoaXZlLnByb3BlcnRpZXMKQEAgLTM2LDcgKzM2LDYgQEAKIGR1cF9zZWNfcm9sZV9FWENfPUlXQUUwMDI2RSB7MH06IEVBUiBGaWxlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbHJlYWR5IGNvbnRhaW5zIGEgc2VjdXJpdHkgcm9sZSBuYW1lZCB7MX0KIGR1cF9zZWNfcm9sZV9tb2R1bGVfRVhDXz1JV0FFMDAyN0UgRGVwbG95bWVudCBkZXNjcmlwdG9yIGZvciB7MH0gYWxyZWFkeSBjb250YWlucyBhIHNlY3VyaXR5IHJvbGUgbmFtZWQgezF9CiBkdXBfcmVzb3VyY2VfRVhDXz1JV0FFMDAyOEUgUmVzb3VyY2UgbmFtZWQgInswfSIgYWxyZWFkeSBleGlzdHMgaW4gYXJjaGl2ZSAiezF9IgotZXJyb3Jfc2F2aW5nX0VYQ189SVdBRTAwMzBFIEVycm9yIHNhdmluZyB7MH0KIGFkZF9jb3B5X2NsYXNzX2Rpcl9FWENfPUlXQUUwMDMxRSBUaGUgbWV0aG9kICJhZGRDb3B5Q2xhc3MiIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yaWVzLiBVUkk6IHswfQogYWRkX2NvcHlfbGliX2Rpcl9FWENfPUlXQUUwMDMyRSBUaGUgbWV0aG9kICJhZGRDb3B5TGliIiBpcyBub3Qgc3VwcG9ydGVkIGZvciBkaXJlY3Rvcmllcy4gVVJJOiB7MH0KIGxpc3RfY29tcG9uZW50c193YXJfRVhDXz1JV0FFMDAzM0UgRXhjZXB0aW9uIG9jY3VycmVkIGxpc3RpbmcgY29tcG9uZW50cyBpbiBXQVIgZmlsZTogezB9CkBAIC05MiwzICs5MSwxMiBAQAogTW9kdWxlX25vdF9pbl9FQVI9TW9kdWxlIGlzIG5vdCBpbiBhbiBFQVI6IHswfQogTW9kdWxlX2ZpbGVfZG9lc19ub3RfZXhpc3RfMj1Nb2R1bGUgZmlsZSBkb2VzIG5vdCBleGlzdCBmb3IgTW9kdWxlIHJlZi4gIE1vZHVsZSA9IHswfQogRmlsZUltcGxfX0Vycm9yXzA9UmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvcgorQWJzdHJhY3RBcmNoaXZlU2F2ZUFkYXB0ZXJfU2F2aW5nX3Jlc291cmNlXz1TYXZpbmcgcmVzb3VyY2VzCitBYnN0cmFjdEFyY2hpdmVTYXZlQWRhcHRlcl9TYXZpbmdfcmVzb3VyY2VfPVNhdmluZyByZXNvdXJjZXMKK0FyY2hpdmVGYWN0b3J5SW1wbF9FcnJvcl9zYXZpbmdfYXJjaGl2ZV8wXz1FcnJvciBzYXZpbmcgYXJjaGl2ZTogezB9CitBcmNoaXZlRmFjdG9yeUltcGxfRXJyb3Jfc2F2aW5nX2FyY2hpdmVfMF90b19vdXRwdXRfPUVycm9yIHNhdmluZyBhcmNoaXZlOiB7MH0gdG8gb3V0cHV0IHBhdGg6IHsxfQorQXJjaGl2ZUZhY3RvcnlJbXBsX1NhdmluZ19hcmNoaXZfPVNhdmluZyBhcmNoaXZlCitBcmNoaXZlRmFjdG9yeUltcGxfU2F2aW5nX2FyY2hpdmVfdG9fMF89U2F2aW5nIGFyY2hpdmUgdG86IHswfQorQXJjaGl2ZUZhY3RvcnlJbXBsX1RoZV9zcGVjaWZpZWRfZmlsZV8wX2V4aXN0c19hbmRfPVRoZSBzcGVjaWZpZWQgZmlsZTogezB9IGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnkKK0FyY2hpdmVJbXBsXzBfaW5fMV89ezB9IGluIHsxfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmphdmEKaW5kZXggODI5NjI3MC4uNmZmMjk5OCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL0NvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuamF2YQpAQCAtMTAzLDYgKzEwMywxMyBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFfQXBwbGljYXRpb25fZmlsZTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBOdWxsX3VyaV9FWENfOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludGVybmFsX0Vycm9yX19JdGVyYXRvcl9vX0VYQ187CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3RBcmNoaXZlU2F2ZUFkYXB0ZXJfU2F2aW5nX3Jlc291cmNlXzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBcmNoaXZlRmFjdG9yeUltcGxfU2F2aW5nX2FyY2hpdmVfdG9fMF87CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQXJjaGl2ZUZhY3RvcnlJbXBsX0Vycm9yX3NhdmluZ19hcmNoaXZlXzBfdG9fb3V0cHV0XzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBcmNoaXZlRmFjdG9yeUltcGxfVGhlX3NwZWNpZmllZF9maWxlXzBfZXhpc3RzX2FuZF87CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQXJjaGl2ZUZhY3RvcnlJbXBsX1NhdmluZ19hcmNoaXZfOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFyY2hpdmVGYWN0b3J5SW1wbF9FcnJvcl9zYXZpbmdfYXJjaGl2ZV8wXzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBBcmNoaXZlSW1wbF8wX2luXzFfOwogCiAJc3RhdGljIHsKIAkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5jbGFzcyk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SZXBhaXJBcmNoaXZlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvUmVwYWlyQXJjaGl2ZUNvbW1hbmQuamF2YQppbmRleCAzOWVlNWI5Li41NmRjMjdiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9SZXBhaXJBcmNoaXZlQ29tbWFuZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1JlcGFpckFyY2hpdmVDb21tYW5kLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luLkoyRUVDb3JlUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkFyY2hpdmVVdGlsOwogCkBAIC05Miw2ICs5Myw3IEBACiAJCXJldHVybiBkaXJlY3RvcnlOYW1lczsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7CiAJCXJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXXthcmNoaXZlfSk7CiAJfQpAQCAtMTExLDEwICsxMTMsMTEgQEAKIAkJCWFuQXJjaGl2ZS5zYXZlQXMoYXJnc1sxXSk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewogCQkJU3lzdGVtLm91dC5wcmludGxuKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuUmVwYWlyX2NvbW1hbmRfZmFpbGVkX19fZXhfRVhDXyk7IC8vID0gIlJlcGFpciBjb21tYW5kIGZhaWxlZCAtIGV4Y2VwdGlvbiBzdGFjayB0cmFjZToiCi0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKKwkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGV4KTsKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL1ZhbGlkYXRlWG1sQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvVmFsaWRhdGVYbWxDb21tYW5kLmphdmEKaW5kZXggZjFkZTkxNi4uMzE3Yzg4NSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvVmFsaWRhdGVYbWxDb21tYW5kLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvVmFsaWRhdGVYbWxDb21tYW5kLmphdmEKQEAgLTEwMCw2ICsxMDAsNyBAQAogCS8qKgogCSAqIEByZXR1cm4gTGlzdCBvZiBYbWxWYWxpZGF0aW9uUmVzdWx0OyAxIGZvciB0aGUgYXJjaGl2ZSwgYW5kIG9uZSBmb3IgZWFjaCBuZXN0ZWQgbW9kdWxlIGZpbGUKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7CiAJCXJldHVybiByZXN1bHRzOwogCX0KQEAgLTExMyw2ICsxMTQsNyBAQAogCQlyZXR1cm4gdmFsaWRhdGVOZXN0ZWQ7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvZXhjZXB0aW9uL0FyY2hpdmVSdW50aW1lRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24uamF2YQppbmRleCAxMWIxYTVhLi41Nzg4ZTI0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24uamF2YQpAQCAtMTAsNyArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLklXcmFwcGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLldyYXBwZWRSdW50aW1lRXhjZXB0aW9uOwogCiAKQEAgLTIxLDcgKzIwLDcgQEAKICAqIGJlY2F1c2UgdGhlIHNpZ25hdHVyZXMgb2YgZXRvb2xzIGdlbmVyYXRlZCBtZXRob2RzIGNhbm5vdCBiZSBvdmVycmlkZGVuIHRvIHRocm93IGFueSBleGNlcHRpb24KICAqIG90aGVyIHRoYW4gcnVudGltZS4KICAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBJV3JhcHBlZEV4Y2VwdGlvbiB7CitwdWJsaWMgY2xhc3MgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBXcmFwcGVkUnVudGltZUV4Y2VwdGlvbiB7CiAJLyoqCiAJICogCiAJICovCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9leGNlcHRpb24vQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDIzOTZjYjcuLmYyOTBlMjQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2V4Y2VwdGlvbi9BcmNoaXZlV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCkBAIC0xMCw3ICsxMCw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSVdyYXBwZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuV3JhcHBlZEV4Y2VwdGlvbjsKIAogCkBAIC0xOSw3ICsxOCw3IEBACiAgKiBCYXNlIGV4Y2VwdGlvbiBjbGFzcyBmb3Igbm9uLXJ1bnRpbWUgZXhjZXB0aW9ucyBvY2N1cnJpbmcgd2l0aCBtYW5pcHVsYXRpb24gb2YgYXJjaGl2ZXMsIHdoZXJlIGEKICAqIGNhdWdodCBleGNlcHRpb24gY2F1c2VzIHRoaXMgZXhjZXB0aW9uIHRvIGJlIHRocm93bgogICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZVdyYXBwZWRFeGNlcHRpb24gZXh0ZW5kcyBXcmFwcGVkRXhjZXB0aW9uIGltcGxlbWVudHMgSVdyYXBwZWRFeGNlcHRpb24geworcHVibGljIGNsYXNzIEFyY2hpdmVXcmFwcGVkRXhjZXB0aW9uIGV4dGVuZHMgV3JhcHBlZEV4Y2VwdGlvbiB7CiAJLyoqCiAJICogCiAJICovCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVNYW5pZmVzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlTWFuaWZlc3QuamF2YQppbmRleCBjYzRkMzUwLi5jYjVjYzJlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVNYW5pZmVzdC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU1hbmlmZXN0LmphdmEKQEAgLTEwLDExNSArMTAsMTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzOwogCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKLQogLyoqCiAgKiBDb250YWlucyB0aGUgQVBJIG9mCiAgKiAKICAqIEBsaW5rIGphdmEudXRpbC5qYXIuTWFuaWZlc3QsIGFsb25nIHdpdGggYWRkZWQgaGVscGVycworICogQGRlcHJlY2F0ZWQgLSBzZWUgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLkFyY2hpdmVNYW5pZmVzdAogICovCi1wdWJsaWMgaW50ZXJmYWNlIEFyY2hpdmVNYW5pZmVzdCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtYW5pZmVzdCBlbnRyeSAoYXR0cmlidXRlcykgZm9yIHRoZSBnaXZlbiBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgYWRkRW50cnkoU3RyaW5nIGVudHJ5TmFtZSk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbnRyeShTdHJpbmcgZW50cnlOYW1lLCBBdHRyaWJ1dGVzIGF0dHIpOwotCi0JLyoqCi0JICogQWRkcyB0aGUga2V5L3ZhbHVlIHBhaXIgdG8gdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBlbnRyeSBuYW1lOyBpZiB0aGUgZW50cnkgZG9lcyBub3QKLQkgKiBleGlzdCwgY3JlYXRlcyBhIG5ldyBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIHZvaWQgYWRkRW50cnlBdHRyaWJ1dGUoU3RyaW5nIGVudHJ5TmFtZSwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIERlZmF1bHRzIHRoZSB2ZXJzaW9uIHRvICIxLjAiIGlmIG5vdCBhbHJlYWR5IHNldAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFZlcnNpb25JZk5lY2Vzc2FyeSgpOwotCi0JcHVibGljIHZvaWQgYXBwZW5kQ2xhc3NQYXRoKFN0cmluZyBleHRlbnNpb24pOwotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0I2NsZWFyCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS51dGlsLmphci5NYW5pZmVzdCNnZXRBdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcyhTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzUGF0aCgpOwotCi0JcHVibGljIFN0cmluZ1tdIGdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0I2dldEVudHJpZXMKLQkgKi8KLQlwdWJsaWMgTWFwIGdldEVudHJpZXMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW50cnlBdHRyaWJ1dGUoU3RyaW5nIGVudHJ5TmFtZSwgU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEudXRpbC5qYXIuTWFuaWZlc3QjZ2V0QXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVzIGdldE1haW5BdHRyaWJ1dGVzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1haW5DbGFzcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBpZmYgdGhlIGVudHJ5IGV4aXN0cyBpbiBhIGNhc2Utc2Vuc2l0aXZlIG1hbm5lcjsgbWFuaWZlc3QgdmVyc2lvbiBpcwotCSAqIHJlcXVpcmVkIGZvciB0aGUgbWFuaWZlc3QgdG8gc2F2ZSBjb3JyZWN0bHkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hbmlmZXN0VmVyc2lvbigpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgaWZmIHRoZSBlbnRyeSBleGlzdHMgaW4gYSBjYXNlLXNlbnNpdGl2ZSBtYW5uZXI7IGltcGxlbWVudGF0aW9uIHZlcnNpb24gaXMKLQkgKiBvcHRpb25hbCBpbiAgdGhlIG1hbmlmZXN0Ci0JICogKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVmVyc2lvbigpOwotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZW50cmllcyBub3QgYWxyZWFkeSBjb250YWluZWQgaW4gdGhlIGNsYXNzIHBhdGggb2YgdGhpcyBtYW5pZmVzdAotCSAqLwotCXB1YmxpYyB2b2lkIG1lcmdlQ2xhc3NQYXRoKFN0cmluZ1tdIGNsYXNzUGF0aEVudHJpZXMpOwotCi0JLyoqCi0JICogQHNlZSBqYXZhLnV0aWwuamFyLk1hbmlmZXN0I3JlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyeShTdHJpbmcgZW50cnlOYW1lKTsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZUVudHJ5QXR0cmlidXRlKFN0cmluZyBlbnRyeU5hbWUsIE9iamVjdCBrZXkpOwotCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NQYXRoKFN0cmluZyBhU3BhY2VEZWxpbWl0ZWRQYXRoKTsKLQotCXB1YmxpYyB2b2lkIHNldE1haW5DbGFzcyhTdHJpbmcgY2xhc3NOYW1lKTsKLQotCXB1YmxpYyB2b2lkIHNldE1hbmlmZXN0VmVyc2lvbihqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pOwotCQotCXB1YmxpYyB2b2lkIHNldEltcGxlbWVuYXRpb25WZXJzaW9uKGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbik7Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEudXRpbC5qYXIuTWFuaWZlc3Qjd3JpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIE1hbmlmZXN0IHRvIHRoZSBzcGVjaWZpZWQgT3V0cHV0U3RyZWFtLCBzcGxpdHRpbmcgZWFjaCBjbGFzc3BhdGggZW50cnkgb24gYSBsaW5lCi0JICogYnkgaXRzZWxmLgotCSAqIAotCSAqIEBwYXJhbSBvdXQKLQkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgc3RyZWFtCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBoYXMgb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZVNwbGl0dGluZ0NsYXNzcGF0aChPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247CitwdWJsaWMgaW50ZXJmYWNlIEFyY2hpdmVNYW5pZmVzdCBleHRlbmRzIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkFyY2hpdmVNYW5pZmVzdCB7CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVNYW5pZmVzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU1hbmlmZXN0SW1wbC5qYXZhCmluZGV4IGExMjFiM2UuLjI3NjQzYmEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU1hbmlmZXN0SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU1hbmlmZXN0SW1wbC5qYXZhCkBAIC0xMiwyMyArMTIsMTUgQEAKIAogCiAKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotCi0KIC8qKgogICogSGVscGVyIGNsYXNzIGZvciBtYW5pZmVzdCBmaWxlcworICogQGRlcHJlY2F0ZWQKICAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVNYW5pZmVzdEltcGwgZXh0ZW5kcyBqYXZhLnV0aWwuamFyLk1hbmlmZXN0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QgeworcHVibGljIGNsYXNzIEFyY2hpdmVNYW5pZmVzdEltcGwgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5BcmNoaXZlTWFuaWZlc3RJbXBsIAorCQkJCQkJCQlpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0IHsKIAkvKioKIAkgKiBBcmNoaXZlTWFuaWZlc3QgY29uc3RydWN0b3IgY29tbWVudC4KKwkgKiBAZGVwcmVjYXRlZAogCSAqLwogCXB1YmxpYyBBcmNoaXZlTWFuaWZlc3RJbXBsKCkgewogCQlzdXBlcigpOwpAQCAtNDEsMzIxICszMywxOCBAQAogCSAqICAgICAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbQogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCisJICogQGRlcHJlY2F0ZWQKIAkgKi8KIAlwdWJsaWMgQXJjaGl2ZU1hbmlmZXN0SW1wbChqYXZhLmlvLklucHV0U3RyZWFtIGlzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZWFkKGlzKTsKLQkJfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0JCQlJT0V4Y2VwdGlvbiBpb2UgPSBuZXcgSU9FeGNlcHRpb24oZS50b1N0cmluZygpKTsKLQkJCWlvZS5pbml0Q2F1c2UoZSk7Ci0JCQl0aHJvdyBpb2U7Ci0JCX0KKwkJc3VwZXIoaXMpOwogCX0KIAogCS8qKgotCSAqIEFyY2hpdmVNYW5pZmVzdCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAorCSAqIEBkZXByZWNhdGVkCiAJICogQHBhcmFtIG1hbgotCSAqICAgICAgICAgICAgamF2YS51dGlsLmphci5NYW5pZmVzdAogCSAqLwogCXB1YmxpYyBBcmNoaXZlTWFuaWZlc3RJbXBsKGphdmEudXRpbC5qYXIuTWFuaWZlc3QgbWFuKSB7CiAJCXN1cGVyKG1hbik7CiAJfQogCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtYW5pZmVzdCBlbnRyeSAoYXR0cmlidXRlcykgZm9yIHRoZSBnaXZlbiBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgYWRkRW50cnkoU3RyaW5nIGVudHJ5TmFtZSkgewotCQlBdHRyaWJ1dGVzIGF0dHIgPSBuZXcgQXR0cmlidXRlcygpOwotCQlhZGRFbnRyeShlbnRyeU5hbWUsIGF0dHIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBlbnRyeU5hbWUsIEF0dHJpYnV0ZXMgYXR0cikgewotCQlnZXRFbnRyaWVzKCkucHV0KGVudHJ5TmFtZSwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUga2V5L3ZhbHVlIHBhaXIgdG8gdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBlbnRyeSBuYW1lOyBpZiB0aGUgZW50cnkgZG9lcyBub3QKLQkgKiBleGlzdCwgY3JlYXRlcyBhIG5ldyBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIHZvaWQgYWRkRW50cnlBdHRyaWJ1dGUoU3RyaW5nIGVudHJ5TmFtZSwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCUF0dHJpYnV0ZXMgYXR0ciA9IGdldEF0dHJpYnV0ZXMoZW50cnlOYW1lKTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCWFkZEVudHJ5KGVudHJ5TmFtZSk7Ci0JCWF0dHIgPSBnZXRBdHRyaWJ1dGVzKGVudHJ5TmFtZSk7Ci0JCWF0dHIucHV0VmFsdWUoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkVmVyc2lvbklmTmVjZXNzYXJ5KCkgewotCQkvL1RoaXMgaXMgYSBoYWNrIGJlY2F1c2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgbWFuaWZlc3QgZG9lcyBub3Qgc2VyaWFsaXplIGNvcnJlY3RseSBpZgotCQkvL1RoZSB2ZXJzaW9uIGlzIG5vdCBzZXQuIEluIGFkZGl0aW9uIHRvIHNhdmVzLCB0aGUgc2VyaWFsaXphdGlvbiBpcyB1c2VkIGZvciBjb3B5Ci0JCWlmIChnZXRNYW5pZmVzdFZlcnNpb24oKSA9PSBudWxsIHx8IGdldE1hbmlmZXN0VmVyc2lvbigpLmVxdWFscygiIikpLy8kTk9OLU5MUy0xJAotCQkJc2V0TWFuaWZlc3RWZXJzaW9uKCIxLjAiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZENsYXNzUGF0aChqYXZhLmxhbmcuU3RyaW5nIGV4dGVuc2lvbikgewotCQlTdHJpbmcgY2xhc3NQYXRoID0gZ2V0Q2xhc3NQYXRoKCk7Ci0JCWlmIChjbGFzc1BhdGggIT0gbnVsbCkKLQkJCXNldENsYXNzUGF0aChjbGFzc1BhdGggKyAiICIgKyBleHRlbnNpb24pOy8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJc2V0Q2xhc3NQYXRoKGV4dGVuc2lvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldENsYXNzUGF0aCgpIHsKLQkJcmV0dXJuIEFyY2hpdmVVdGlsLmdldFZhbHVlSWdub3JlS2V5Q2FzZShBdHRyaWJ1dGVzLk5hbWUuQ0xBU1NfUEFUSC50b1N0cmluZygpLCBnZXRNYWluQXR0cmlidXRlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmdbXSBnZXRDbGFzc1BhdGhUb2tlbml6ZWQoKSB7Ci0JCVN0cmluZyBjbGFzc1BhdGggPSBnZXRDbGFzc1BhdGgoKTsKLQkJaWYgKGNsYXNzUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsLmdldFRva2VucyhjbGFzc1BhdGgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW50cnlBdHRyaWJ1dGUoU3RyaW5nIGVudHJ5TmFtZSwgU3RyaW5nIGtleSkgewotCQlBdHRyaWJ1dGVzIGF0dHIgPSBnZXRBdHRyaWJ1dGVzKGVudHJ5TmFtZSk7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1haW5DbGFzcygpIHsKLQkJcmV0dXJuIEFyY2hpdmVVdGlsLmdldFZhbHVlSWdub3JlS2V5Q2FzZShBdHRyaWJ1dGVzLk5hbWUuTUFJTl9DTEFTUy50b1N0cmluZygpLCBnZXRNYWluQXR0cmlidXRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hbmlmZXN0VmVyc2lvbigpIHsKLQkJcmV0dXJuIGdldE1haW5BdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoQXR0cmlidXRlcy5OYW1lLk1BTklGRVNUX1ZFUlNJT04pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZXJnZUNsYXNzUGF0aChqYXZhLmxhbmcuU3RyaW5nW10gY2xhc3NQYXRoRW50cmllcykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWphdmEudXRpbC5MaXN0IGV4aXN0aW5nID0gamF2YS51dGlsLkFycmF5cy5hc0xpc3QoZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCkpOwotCQlTdHJpbmcgY3AgPSBnZXRDbGFzc1BhdGgoKTsKLQkJaWYgKGNwICE9IG51bGwpCi0JCQlzYi5hcHBlbmQoY3ApOwotCQlib29sZWFuIGVtcHR5ID0gY3AgPT0gbnVsbCB8fCAiIi5lcXVhbHMoY3ApOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NQYXRoRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFleGlzdGluZy5jb250YWlucyhjbGFzc1BhdGhFbnRyaWVzW2ldKSkgewotCQkJCWlmICghZW1wdHkpCi0JCQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJZWxzZQotCQkJCQllbXB0eSA9IGZhbHNlOwotCQkJCXNiLmFwcGVuZChjbGFzc1BhdGhFbnRyaWVzW2ldKTsKLQkJCX0KLQkJfQotCQlzZXRDbGFzc1BhdGgoc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRW50cnkoU3RyaW5nIGVudHJ5TmFtZSkgewotCQlnZXRFbnRyaWVzKCkucmVtb3ZlKGVudHJ5TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRW50cnlBdHRyaWJ1dGUoU3RyaW5nIGVudHJ5TmFtZSwgT2JqZWN0IGtleSkgewotCQlBdHRyaWJ1dGVzIGF0dHIgPSBnZXRBdHRyaWJ1dGVzKGVudHJ5TmFtZSk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyLnJlbW92ZShrZXkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc1BhdGgoamF2YS5sYW5nLlN0cmluZyBhU3BhY2VEZWxpbWl0ZWRQYXRoKSB7Ci0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IGdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCWlmIChhU3BhY2VEZWxpbWl0ZWRQYXRoID09IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnJlbW92ZShBdHRyaWJ1dGVzLk5hbWUuQ0xBU1NfUEFUSCk7Ci0JCWVsc2UKLQkJCWF0dHJpYnV0ZXMucHV0VmFsdWUoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgudG9TdHJpbmcoKSwgYVNwYWNlRGVsaW1pdGVkUGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1haW5DbGFzcyhqYXZhLmxhbmcuU3RyaW5nIGNsYXNzTmFtZSkgewotCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBnZXRNYWluQXR0cmlidXRlcygpOwotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnJlbW92ZShBdHRyaWJ1dGVzLk5hbWUuTUFJTl9DTEFTUyk7Ci0JCWVsc2UKLQkJCWF0dHJpYnV0ZXMucHV0VmFsdWUoQXR0cmlidXRlcy5OYW1lLk1BSU5fQ0xBU1MudG9TdHJpbmcoKSwgY2xhc3NOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWFuaWZlc3RWZXJzaW9uKGphdmEubGFuZy5TdHJpbmcgdmVyc2lvbikgewotCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBnZXRNYWluQXR0cmlidXRlcygpOwotCQlhdHRyaWJ1dGVzLnB1dFZhbHVlKEF0dHJpYnV0ZXMuTmFtZS5NQU5JRkVTVF9WRVJTSU9OLnRvU3RyaW5nKCksIHZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgTWFuaWZlc3QgdG8gdGhlIHNwZWNpZmllZCBPdXRwdXRTdHJlYW0sIHNwbGl0dGluZyBlYWNoIGNsYXNzcGF0aCBlbnRyeSBvbiBhIGxpbmUKLQkgKiBieSBpdHNlbGYuCi0JICogCi0JICogQHBhcmFtIG91dAotCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBzdHJlYW0KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIGhhcyBvY2N1cnJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlU3BsaXR0aW5nQ2xhc3NwYXRoKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0KTsKLQkJLy8gV3JpdGUgb3V0IHRoZSBtYWluIGF0dHJpYnV0ZXMgZm9yIHRoZSBtYW5pZmVzdAotCQl3cml0ZU1haW5TcGxpdHRpbmdDbGFzc3BhdGgoZ2V0TWFpbkF0dHJpYnV0ZXMoKSwgZG9zKTsKLQkJLy8gTm93IHdyaXRlIG91dCB0aGUgcHJlLWVudHJ5IGF0dHJpYnV0ZXMKLQkJSXRlcmF0b3IgaXQgPSBnZXRFbnRyaWVzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZCgoU3RyaW5nKSBlLmdldEtleSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJbG9jYWxNYWtlNzJTYWZlKGJ1ZmZlcik7Ci0JCQlkb3Mud3JpdGVCeXRlcyhidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQl3cml0ZSgoQXR0cmlidXRlcykgZS5nZXRWYWx1ZSgpLCBkb3MpOwotCQl9Ci0JCWRvcy5mbHVzaCgpOwotCX0KLQotCS8qCi0JICogV3JpdGVzIHRoZSBjdXJyZW50IGF0dHJpYnV0ZXMgdG8gdGhlIHNwZWNpZmllZCBkYXRhIG91dHB1dCBzdHJlYW0uIFhYWCBOZWVkIHRvIGhhbmRsZSBVVEY4Ci0JICogdmFsdWVzIGFuZCBicmVhayB1cCBsaW5lcyBsb25nZXIgdGhhbiA3MiBieXRlcwotCSAqIAotCSAqIEBzZWUgQXR0cmlidXRlcyN3cml0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgRGF0YU91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigoKEF0dHJpYnV0ZXMuTmFtZSkgZS5nZXRLZXkoKSkudG9TdHJpbmcoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHRvVXRmOCgoU3RyaW5nKSBlLmdldFZhbHVlKCkpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJbG9jYWxNYWtlNzJTYWZlKGJ1ZmZlcik7Ci0JCQlvcy53cml0ZUJ5dGVzKGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCQlvcy53cml0ZUJ5dGVzKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIFdyaXRlcyB0aGUgY3VycmVudCBhdHRyaWJ1dGVzIHRvIHRoZSBzcGVjaWZpZWQgZGF0YSBvdXRwdXQgc3RyZWFtLCBtYWtlIHN1cmUgdG8gd3JpdGUgb3V0IHRoZQotCSAqIE1BTklGRVNUX1ZFUlNJT04gb3IgU0lHTkFUVVJFX1ZFUlNJT04gYXR0cmlidXRlcyBmaXJzdC4KLQkgKiAKLQkgKiBAc2VlIEF0dHJpYnV0ZXMjd3JpdGVNYWluCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVNYWluU3BsaXR0aW5nQ2xhc3NwYXRoKEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgRGF0YU91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIHdyaXRlIG91dCB0aGUgKi1WZXJzaW9uIGhlYWRlciBmaXJzdCwgaWYgaXQgZXhpc3RzCi0JCVN0cmluZyB2ZXJuYW1lID0gQXR0cmlidXRlcy5OYW1lLk1BTklGRVNUX1ZFUlNJT04udG9TdHJpbmcoKTsKLQkJU3RyaW5nIHZlcnNpb24gPSB0b1V0ZjgoYXR0cmlidXRlcy5nZXRWYWx1ZSh2ZXJuYW1lKSk7Ci0JCWlmICh2ZXJzaW9uID09IG51bGwpIHsKLQkJCXZlcm5hbWUgPSBBdHRyaWJ1dGVzLk5hbWUuU0lHTkFUVVJFX1ZFUlNJT04udG9TdHJpbmcoKTsKLQkJCXZlcnNpb24gPSB0b1V0ZjgoYXR0cmlidXRlcy5nZXRWYWx1ZSh2ZXJuYW1lKSk7Ci0JCX0KLQotCQlpZiAodmVyc2lvbiAhPSBudWxsKSB7Ci0JCQlvdXQud3JpdGVCeXRlcyh2ZXJuYW1lICsgIjogIiArIHZlcnNpb24gKyAiXHJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCS8vIHdyaXRlIG91dCBhbGwgYXR0cmlidXRlcyBleGNlcHQgZm9yIHRoZSB2ZXJzaW9uCi0JCS8vIHdlIHdyb3RlIG91dCBlYXJsaWVyCi0JCUl0ZXJhdG9yIGl0ID0gYXR0cmlidXRlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSAoKEF0dHJpYnV0ZXMuTmFtZSkgZS5nZXRLZXkoKSkudG9TdHJpbmcoKTsKLQkJCWlmICgodmVyc2lvbiAhPSBudWxsKSAmJiAhKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSh2ZXJuYW1lKSkpIHsKLQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRILnRvU3RyaW5nKCkpKSB7Ci0JCQkJCXdyaXRlU3BsaXQob3V0LCBuYW1lLCB0b1V0ZjgoKFN0cmluZykgZS5nZXRWYWx1ZSgpKSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lKTsKLQkJCQlidWZmZXIuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZCh0b1V0ZjgoKFN0cmluZykgZS5nZXRWYWx1ZSgpKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJbG9jYWxNYWtlNzJTYWZlKGJ1ZmZlcik7Ci0JCQkJb3V0LndyaXRlQnl0ZXMoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCW91dC53cml0ZUJ5dGVzKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZVNwbGl0KERhdGFPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSk7Ci0JCWludCBpbmMgPSAwOwotCQl3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCQlpZiAoaW5jID09IDApIHsKLQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCX0KLQkJCWJ1ZmZlci5hcHBlbmQodG9rLm5leHRUb2tlbigpKTsKLQkJCWlmICh0b2suY291bnRUb2tlbnMoKSA+IDApCi0JCQkJYnVmZmVyLmFwcGVuZCgiIFxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCWJ1ZmZlci5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJbG9jYWxNYWtlNzJTYWZlKGJ1ZmZlcik7Ci0JCQlvdXQud3JpdGVCeXRlcyhidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQlpbmMrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgbGluZSBicmVha3MgdG8gZW5mb3JjZSBhIG1heGltdW0gNzIgYnl0ZXMgcGVyIGxpbmUuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGxvY2FsTWFrZTcyU2FmZShTdHJpbmdCdWZmZXIgbGluZSkgewotCQlpbnQgbGVuZ3RoID0gbGluZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA+IDcyKSB7Ci0JCQlpbnQgaW5kZXggPSA3MDsKLQkJCS8vIGJ1ZyAyMzM4MDEgLSB3ZSBhcmUgc3BsaXR0aW5nIGV2ZXJ5IDcyIGJ5dGVzLCBidXQgYWRkaW5nIHR3byBieXRlcyB0byB0aGUgZW5kIG9mLCAKLQkJCS8vIGFuZCBvbmUgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeSBsaW5lIGFmdGVyIHRoZSBmaXJzdAotCQkJd2hpbGUgKGluZGV4IC0gMSA8IGxlbmd0aCkgewotCQkJCWlmIChsaW5lLmNoYXJBdChpbmRleCkgPT0gJyAnKQotCQkJCXsKLQkJCQkJaW5kZXgtLTsKLQkJCQl9Ci0JCQkJbGluZS5pbnNlcnQoaW5kZXgsICJcclxuICIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5kZXggKz0gNzI7Ci0JCQkJbGVuZ3RoICs9IDM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKCkgewotCQlyZXR1cm4gZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuSU1QTEVNRU5UQVRJT05fVkVSU0lPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1wbGVtZW5hdGlvblZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLQkJQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKLQkJYXR0cmlidXRlcy5wdXRWYWx1ZShBdHRyaWJ1dGVzLk5hbWUuSU1QTEVNRU5UQVRJT05fVkVSU0lPTi50b1N0cmluZygpLCB2ZXJzaW9uKTsKLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRW5jb2RlcyBhIGRvdWJsZS1ieXRlIHN0cmluZyBpbnRvIFVURjggZm9ybS4gRXZlcnkgY2hhcmFjdGVyIGluIHRoZQotICAgICAqIHJldHVybmVkIHN0cmluZyByZXByZXNlbnRzIG9uZSBieXRlIG9mIHRoZSBVVEY4IGVuY29kaW5nLiAKLSAgICAgKi8KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyB0b1V0ZjgoIGZpbmFsIFN0cmluZyBzdHIgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmKCBzdHIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgYnl0ZVtdIHV0ZjggPSBzdHIuZ2V0Qnl0ZXMoICJVVEYtOCIgKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKCB1dGY4LCAwLCAwLCB1dGY4Lmxlbmd0aCApOwotICAgICAgICB9Ci0gICAgfQotCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVPcHRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVPcHRpb25zLmphdmEKaW5kZXggOThhZmRmOS4uN2Y5MjdlYSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlT3B0aW9ucy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZU9wdGlvbnMuamF2YQpAQCAtODksNiArODksNyBAQAogCS8qKgogCSAqIE1ha2UgYSBjb3B5IG9mIHRoZSByZWNpZXZlciwgc2V0dGluZyB0aGUgbG9hZFN0cmF0ZWd5IHRvIG51bGwKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewogCQlyZXR1cm4gY2xvbmVXaXRoKG51bGwpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvQXJjaGl2ZVVSSUNvbnZlcnRlckltcGwuamF2YQppbmRleCAwMTY4YmYwLi5hNWIzYTQyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0FyY2hpdmVVUklDb252ZXJ0ZXJJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9BcmNoaXZlVVJJQ29udmVydGVySW1wbC5qYXZhCkBAIC02NSw2ICs2NSw3IEBACiAJCXJldHVybiBhcmNoaXZlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJbnB1dFN0cmVhbSBjcmVhdGVJbnB1dFN0cmVhbShVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7CiAJCWlmIChyZXNvdXJjZXNQYXRoICE9IG51bGwpCkBAIC05OSw2ICsxMDAsNyBAQAogCQlzZXRPdXRwdXRGaWxlcGF0aChyZXNvdXJjZXNQYXRoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVVJJIG5vcm1hbGl6ZShVUkkgdXJpKSB7CiAJCXJldHVybiAoKFVSSUNvbnZlcnRlckltcGwuVVJJTWFwKWdldFVSSU1hcCgpKS5nZXRVUkkodXJpKTsKIAl9CkBAIC0yNTksNyArMjYxLDEwIEBACiAJCX0KIAkJaWYgKHVybCAhPSBudWxsKQogCQkJcmV0dXJuIHVybDsKLQkJdGhyb3cgbTsKKwkJZWxzZSBpZihtICE9IG51bGwpCisJCQl0aHJvdyBtOworCQllbHNlIAorCQkJdGhyb3cgbmV3IE1hbGZvcm1lZFVSTEV4Y2VwdGlvbigpOwogCX0KIAogCS8qKgpAQCAtMjY4LDYgKzI3Myw3IEBACiAJICogQHBhcmFtIHVyaQogCSAqICAgICAgICAgICAgVGhlIHVyaQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPdXRwdXRTdHJlYW0gY3JlYXRlT3V0cHV0U3RyZWFtKFVSSSB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVVSSSBjb252ZXJ0ZWQgPSB1cmk7CiAJCWlmIChwbGF0Zm9ybVByb3RvY29sLmVxdWFscyhjb252ZXJ0ZWQuc2NoZW1lKCkpKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVFeHRlbnNpb25zRmlsdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9GaWxlRXh0ZW5zaW9uc0ZpbHRlckltcGwuamF2YQppbmRleCA3ZmI5YjdjLi41NjNhZWI5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL0ZpbGVFeHRlbnNpb25zRmlsdGVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvRmlsZUV4dGVuc2lvbnNGaWx0ZXJJbXBsLmphdmEKQEAgLTIyLDcgKzIyLDcgQEAKICAqIAogICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgogICovCi1wdWJsaWMgY2xhc3MgRmlsZUV4dGVuc2lvbnNGaWx0ZXJJbXBsIGV4dGVuZHMgU2F2ZUZpbHRlckltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXIgeworcHVibGljIGNsYXNzIEZpbGVFeHRlbnNpb25zRmlsdGVySW1wbCBleHRlbmRzIFNhdmVGaWx0ZXJJbXBsIHsKIAlwcm90ZWN0ZWQgU2V0IGV4Y2x1ZGVkRXh0ZW5zaW9uczsKIAlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZTsKIAlwcm90ZWN0ZWQgU2V0IGV4Y2x1ZGVkRXh0ZW5zaW9uc0FzVXBwZXJjYXNlOwpAQCAtMTI0LDYgKzEyNCw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLlNhdmVGaWx0ZXIKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBzaG91bGRTYXZlKFN0cmluZyB1cmksIEFyY2hpdmUgYW5BcmNoaXZlKSB7CiAJCVN0cmluZyBleHRlbnNpb24gPSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsLmdldEZpbGVOYW1lRXh0ZW5zaW9uKHVyaSk7CiAJCWlmIChleHRlbnNpb24uZXF1YWxzKCIiKSkvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL05lc3RlZEFyY2hpdmVJdGVyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9OZXN0ZWRBcmNoaXZlSXRlcmF0b3IuamF2YQppbmRleCA2MjJkOTQwLi5iNDJjOTY3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL05lc3RlZEFyY2hpdmVJdGVyYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvTmVzdGVkQXJjaGl2ZUl0ZXJhdG9yLmphdmEKQEAgLTM0LDcgKzM0LDYgQEAKIAkJICovCiAJCXB1YmxpYyBXcmFwcGVySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKIAkJCXN1cGVyKGluKTsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgogCQl9CiAKIAkJLyoKQEAgLTQyLDYgKzQxLDcgQEAKIAkJICogCiAJCSAqIEBzZWUgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbSNjbG9zZSgpCiAJCSAqLworCQlAT3ZlcnJpZGUKIAkJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJLy9kbyBub3RoaW5nIGJlY2F1c2Ugd2Ugd2FudCB0byBwcmV2ZW50IHRoZSBjbGllbnRzIGZyb20gY2xvc2luZyB0aGUgemlwCiAJCX0KQEAgLTU1LDEyICs1NSwxNCBAQAogCQl6aXBJbnB1dFN0cmVhbSA9IHN0cmVhbTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oRmlsZSBhRmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKIAkJaWYgKCFhRmlsZS5nZXRVUkkoKS5lcXVhbHMoY3VycmVudEVudHJ5LmdldE5hbWUoKSkpCiAJCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkludGVybmFsX0Vycm9yX19JdGVyYXRvcl9vX0VYQ18pOyAvLyA9ICJJbnRlcm5hbCBFcnJvcjogSXRlcmF0b3Igb3V0IG9mIHN5bmMgd2l0aCB6aXAgZW50cmllcyIKIAkJcmV0dXJuIG5ldyBXcmFwcGVySW5wdXRTdHJlYW0oemlwSW5wdXRTdHJlYW0pOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBGaWxlIG5leHQoKSB7CiAJCUZpbGUgbmV4dCA9IHN1cGVyLm5leHQoKTsKIAkJdHJ5IHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvUmVzb3VyY2VQcm94eVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SZXNvdXJjZVByb3h5VmFsaWRhdG9yLmphdmEKaW5kZXggYTI4YTNiOS4uYjcxY2U2NSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SZXNvdXJjZVByb3h5VmFsaWRhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SZXNvdXJjZVByb3h5VmFsaWRhdG9yLmphdmEKQEAgLTY4LDcgKzY4LDcgQEAKIAkJCQkJCQlTdHJpbmcgaWQgPSAoKEVPYmplY3RJbXBsKSBwcm94eU9yT2JqZWN0KS5lUHJveHlVUkkoKS5mcmFnbWVudCgpOwogCQkJCQkJCWlmIChyZXNvdXJjZVVSSU1hcC5nZXQocmVzb3VyY2VVUkkpICE9IG51bGwpIHsKIAkJCQkJCQkJUmVzb3VyY2UgY2FjaGVkUmVzb3VyY2UgPSAoUmVzb3VyY2UpIHJlc291cmNlVVJJTWFwLmdldChyZXNvdXJjZVVSSSk7Ci0JCQkJCQkJCXByb3h5T3JPYmplY3QgPSAoRU9iamVjdCkgKChYTUxSZXNvdXJjZSkgY2FjaGVkUmVzb3VyY2UpLmdldElEVG9FT2JqZWN0TWFwKCkuZ2V0KGlkKTsKKwkJCQkJCQkJcHJveHlPck9iamVjdCA9ICgoWE1MUmVzb3VyY2UpIGNhY2hlZFJlc291cmNlKS5nZXRJRFRvRU9iamVjdE1hcCgpLmdldChpZCk7CiAJCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQkJcHJveHlPck9iamVjdCA9IChFT2JqZWN0KSByZWZPYmplY3QuZUdldChyZWZlcmVuY2UpOwogCQkJCQkJCQlyZXNvdXJjZVVSSU1hcC5wdXQocmVzb3VyY2VVUkksIHByb3h5T3JPYmplY3QuZVJlc291cmNlKCkpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9SdW50aW1lQ2xhc3NwYXRoRW50cnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1J1bnRpbWVDbGFzc3BhdGhFbnRyeUltcGwuamF2YQppbmRleCBjYWY2MGNiLi40MDg3OTdlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1J1bnRpbWVDbGFzc3BhdGhFbnRyeUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1J1bnRpbWVDbGFzc3BhdGhFbnRyeUltcGwuamF2YQpAQCAtOTEsMTYgKzkxLDE5IEBACiAJCXRoaXMud2FyRmlsZSA9IHdhckZpbGU7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJcmV0dXJuIGdldEFic29sdXRlUGF0aCgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQlpZiAobyBpbnN0YW5jZW9mIFJ1bnRpbWVDbGFzc3BhdGhFbnRyeSkKIAkJCXJldHVybiBnZXRBYnNvbHV0ZVBhdGgoKS5lcXVhbHMoKChSdW50aW1lQ2xhc3NwYXRoRW50cnkpIG8pLmdldEFic29sdXRlUGF0aCgpKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJCXJldHVybiBnZXRBYnNvbHV0ZVBhdGgoKS5oYXNoQ29kZSgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2VsZWN0ZWRGaWxlc0ZpbHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2hlbHBlcnMvU2VsZWN0ZWRGaWxlc0ZpbHRlckltcGwuamF2YQppbmRleCA0YjgxZjcyLi4zOGMzMDM1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9oZWxwZXJzL1NlbGVjdGVkRmlsZXNGaWx0ZXJJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaGVscGVycy9TZWxlY3RlZEZpbGVzRmlsdGVySW1wbC5qYXZhCkBAIC03Nyw2ICs3Nyw3IEBACiAJCXNlbGVjdGVkRmlsZU5hbWVzID0gbmV3U2VsZWN0ZWRGaWxlTmFtZXM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gc2hvdWxkU2F2ZShqYXZhLmxhbmcuU3RyaW5nIHVyaSwgQXJjaGl2ZSBhbkFyY2hpdmUpIHsKIAkJcmV0dXJuIGdldFNlbGVjdGVkRmlsZU5hbWVzKCkuY29udGFpbnModXJpKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50RmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbC5qYXZhCmluZGV4IGY2YTA4OTIuLjdhMjQyMDcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbC5qYXZhCkBAIC00OCw2ICs0OCw3IEBACiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEU7CiAJfQpAQCAtNzMsNiArNzQsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5pbXBsLk1vZHVsZUZpbGVJbXBsCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSB7CiAJCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJOwogCX0KQEAgLTg3LDEwICs4OSwxMiBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKSB7CiAJCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwogCX0KQEAgLTk4LDYgKzEwMiw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLmltcGwuTW9kdWxlRmlsZUltcGwKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKFhNTFJlc291cmNlIHJlc291cmNlKSB7CiAJCUFwcGxpY2F0aW9uQ2xpZW50IGFDbGllbnQgPSAoKENsaWVudFBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkpLmdldENsaWVudEZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpOwogCQlyZXNvdXJjZS5zZXRJRChhQ2xpZW50LCBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfSUQpOwpAQCAtMTQ5LDYgKzE1NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKQEAgLTE2Myw2ICsxNjksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgpAQCAtMTc3LDYgKzE4NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6CkBAIC0xOTEsNiArMTk5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlQ29weVNlc3Npb25VdGlsaXR5LmphdmEKaW5kZXggNzQ0OTA1ZC4uYmIzNGM1NyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlQ29weVNlc3Npb25VdGlsaXR5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlQ29weVNlc3Npb25VdGlsaXR5LmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKICAqIEBhdXRob3I6IEphcmVkIEp1cmtpZXdpY3oKICAqLwogcHVibGljIGNsYXNzIEFyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkgZXh0ZW5kcyBFdG9vbHNDb3B5U2Vzc2lvbiB7CisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewogCQlFT2JqZWN0IGNvcGllZCA9IHN1cGVyLmNvcHkoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwogCQlpZiAoY29waWVkIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkKQEAgLTQ0LDYgKzQ1LDcgQEAKIAkJcmV0dXJuIGNvcGllZDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBwcmltQ29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewogCQlFT2JqZWN0IGNvcGllZCA9IHN1cGVyLnByaW1Db3B5KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKIAkJaWYgKGNvcGllZCBpbnN0YW5jZW9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHkpCkBAIC01OCw2ICs2MCw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYuZWNvcmUudXRpbGl0aWVzLmNvcHkuRXRvb2xzQ29weVNlc3Npb24jbmV3SW5zdGFuY2UoUmVzb3VyY2UsIFN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2UgbmV3SW5zdGFuY2UoUmVzb3VyY2UgYVJlc291cmNlLCBTdHJpbmcgbmV3VXJpKSB7CiAJCVJlc291cmNlIGNvcHlSZXNvdXJjZSA9IHN1cGVyLm5ld0luc3RhbmNlKGFSZXNvdXJjZSwgbmV3VXJpKTsKIApAQCAtNjYsNiArNjksNyBAQAogCQlyZXR1cm4gY29weVJlc291cmNlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBFT2JqZWN0IGdldENvcHlJZkZvdW5kKEVPYmplY3QgYW5PYmplY3QpIHsKIAkJRU9iamVjdCBjb3BpZWRPYmplY3QgPSBzdXBlci5nZXRDb3B5SWZGb3VuZChhbk9iamVjdCk7CiAJCWlmICgoYW5PYmplY3QgaW5zdGFuY2VvZiBKYXZhQ2xhc3MpICYmIChhbk9iamVjdCA9PSBjb3BpZWRPYmplY3QpKSB7CkBAIC03Niw2ICs4MCw3IEBACiAJCXJldHVybiBjb3BpZWRPYmplY3Q7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY29weU9iamVjdChFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewogCQlFT2JqZWN0IGNvcGllZCA9IHN1cGVyLmNvcHlPYmplY3QoYVJlZk9iamVjdCwgaWRTdWZmaXgpOwogCQlpZiAoY29waWVkIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkKQEAgLTkzLDYgKzk4LDcgQEAKIAkgKiBTdXBlciBjbGFzcyBvdmVycmlkZSB0byBoYW5kbGUgdW5yZXNvbHZhYmxlIHByb3hpZXMgKEphdmFDbGFzcykKIAkgKi8KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZlcmVuY2UoRVJlZmVyZW5jZSBhUmVmZXJlbmNlLCBFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBjb3B5UmVmKSB7CiAJCWlmIChhUmVmZXJlbmNlLmlzTWFueSgpKSB7CiAJCQlpZiAoc2hvdWxkQ29weVJlZmVyZW5jZShhUmVmZXJlbmNlLCBhUmVmT2JqZWN0KSkgeyAvLyBCdWd6aWxsYSAxNzczOTcKQEAgLTExMyw3ICsxMTksNyBAQAogICAgICAqIGF0dHJpYnV0ZSwgd2hpY2ggaXMgbm90IHRvIGJlIGNvcGllZCBpZiBpbiBhbiB1bmluaXRpYWxpemVkIHN0YXRlLjwvcD4KICAgICAgKi8KICAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTVBfS0VZX0FUVFJJQlVURVNfTkFNRSA9ICJrZXlBdHRyaWJ1dGVzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTVBfS0VZX0FUVFJJQlVURVNfTkFNRSA9ICJrZXlBdHRyaWJ1dGVzIjsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCiAgICAgICogPHA+VGVzdCBpbnRyb2R1Y2VkIGZvciBidWd6aWxsYSAxNzczOTc6IFRlbGwgaWYgYSBzcGVjaWZpZWQgcmVmZXJlbmNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVDb3B5VXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlQ29weVV0aWxpdHkuamF2YQppbmRleCBhYjliYzYwLi5hNThlZWFlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVDb3B5VXRpbGl0eS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUNvcHlVdGlsaXR5LmphdmEKQEAgLTYyLDYgKzYyLDcgQEAKIAkgKiBFbmQgb2YgY29kZSBwdWxsZWQgZnJvbSBFdG9vbHNDb3B5VXRpbGl0eSB0byBvdmVyLXJpZGUgdGhlIHByaW1Db3B5IG1ldGhvZC4KIAkgKi8KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGFkZERlZmVycmVkU2luZ2xlUmVmZXJlbmNlQ29weShFUmVmZXJlbmNlIHJlZmVyZW5jZSwgRU9iamVjdCBhVmFsdWUsIFN0cmluZyBpZFN1ZmZpeCwgRU9iamVjdCBhQ29weUNvbnRhaW5lcikgewogCQlpZiAoKChEZWZhdWx0YWJsZSkgYVZhbHVlKS5pc0RlZmF1bHQoKSkKIAkJCXJldHVybjsKQEAgLTEyOCw2ICsxMjksNyBAQAogCSAqIEV0b29sc0NvcHlTZXNzaW9uIG9iamVjdCB3aXRoIG91ciBvd24gc3VjaCB0aGF0IGRvaWN0eXBlcyBkbyBnZXQgcHJlc2VydmVkIHdpdGggWE1MCiAJICogUmVzb3VyY2VzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGNvcHkoQ29weUdyb3VwIGFHcm91cCkgewogCQlpZiAoYUdyb3VwICE9IG51bGwpIHsKIAkJCUV0b29sc0NvcHlTZXNzaW9uIHNlc3Npb24gPSBuZXcgQXJjaGl2ZUNvcHlTZXNzaW9uVXRpbGl0eSh0aGlzKTsKQEAgLTEzNyw2ICsxMzksNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY29weShFT2JqZWN0IGFSZWZPYmplY3QsIFN0cmluZyBpZFN1ZmZpeCkgewogCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEFyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkodGhpcyk7CiAJCUVPYmplY3QgY29waWVkID0gc2Vzc2lvbi5jb3B5KGFSZWZPYmplY3QsIGlkU3VmZml4KTsKQEAgLTE0NCw2ICsxNDcsNyBAQAogCQlyZXR1cm4gY29waWVkOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZSBjb3B5KFJlc291cmNlIGFSZXNvdXJjZSwgU3RyaW5nIG5ld1VyaSkgewogCQlFdG9vbHNDb3B5U2Vzc2lvbiBzZXNzaW9uID0gbmV3IEFyY2hpdmVDb3B5U2Vzc2lvblV0aWxpdHkodGhpcyk7CiAJCVJlc291cmNlIGNvcGllZCA9IHNlc3Npb24uY29weShhUmVzb3VyY2UsIG5ld1VyaSk7CkBAIC0xNTYsNiArMTYwLDcgQEAKIAkJCWNvcHkuc2V0SW1wb3J0U3RyYXRlZ3koYU1vZHVsZUZpbGUuZ2V0SW1wb3J0U3RyYXRlZ3koKS5jcmVhdGVJbXBvcnRTdHJhdGVneShhTW9kdWxlRmlsZSwgY29weSkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBFT2JqZWN0IGNvcHlPYmplY3QoRU9iamVjdCBhUmVmT2JqZWN0LCBTdHJpbmcgaWRTdWZmaXgpIHsKIAkJRXRvb2xzQ29weVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBBcmNoaXZlQ29weVNlc3Npb25VdGlsaXR5KHRoaXMpOwogCQlFT2JqZWN0IGNvcGllZCA9IHNlc3Npb24uY29weU9iamVjdChhUmVmT2JqZWN0LCBpZFN1ZmZpeCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0FyY2hpdmVJbXBsLmphdmEKaW5kZXggNzFhNDU5ZC4uNTk2ZDY2MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9BcmNoaXZlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQXJjaGl2ZUltcGwuamF2YQpAQCAtMTE1LDYgKzExNSw3IEBACiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuQVJDSElWRTsKIAl9CkBAIC0xMzUsNiArMTM2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19UWVBFUzoKQEAgLTE0OCw2ICsxNTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19UWVBFUzoKQEAgLTE2Myw2ICsxNjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19UWVBFUzoKQEAgLTE3Nyw2ICsxODEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5BUkNISVZFX19UWVBFUzoKQEAgLTE4OSwxMSArMTk0LDEyIEBACiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlczogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAodHlwZXM6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodHlwZXMpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKQEAgLTY0Miw2ICs2NDgsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24gewogCQlpZiAoZ2V0TG9hZGluZ0NvbnRhaW5lcigpICE9IG51bGwgfHwgZ2V0TG9hZFN0cmF0ZWd5KCkgPT0gbnVsbCB8fCBnZXRMb2FkU3RyYXRlZ3koKS5pc0RpcmVjdG9yeSgpKQogCQkJcmV0dXJuIHN1cGVyLmdldElucHV0U3RyZWFtKCk7CkBAIC04NjIsNiArODY5LDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzQXJjaGl2ZSgpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQpAQCAtMTM3NCw5ICsxMzgyLDggQEAKIAkJdHJ5IHsKIAkJCWlmICggKGdldExvYWRTdHJhdGVneSgpLmdldExvb3NlQXJjaGl2ZSgpICE9IG51bGwpICYmIGdldENvbnRhaW5lcigpLmlzRUFSRmlsZSgpICkgewogCQkJCXJldHVybiBnZXRFQVJGaWxlKCkuZ2V0QmluYXJpZXNQYXRoKCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgamF2YS5pby5GaWxlKGdldEJpbmFyaWVzUGF0aCgpKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CiAJCQl9CisJCQlyZXR1cm4gbmV3IGphdmEuaW8uRmlsZShnZXRCaW5hcmllc1BhdGgoKSkuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwogCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ2xpZW50TW9kdWxlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9DbGllbnRNb2R1bGVSZWZJbXBsLmphdmEKaW5kZXggOWE5NzVhNy4uMTRjM2JjNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9DbGllbnRNb2R1bGVSZWZJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9DbGllbnRNb2R1bGVSZWZJbXBsLmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5MaXRlcmFscy5DTElFTlRfTU9EVUxFX1JFRjsKIAl9CkBAIC00NCw2ICs0NSw3IEBACiAJLyoKIAkgKiBAc2VlIE1vZHVsZVJlZiNpc0NsaWVudCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNDbGllbnQoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5qYXZhCmluZGV4IGE5Njc2NTIuLjI3ODZmMmYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db21tb25hcmNoaXZlRmFjdG9yeUltcGwuamF2YQpAQCAtNDEsNyArNDEsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbm5lY3Rvck1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQk1vZHVsZVJlZjsKQEAgLTg1LDcgKzg0LDcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGluaXQoKSB7CiAJCXRyeSB7Ci0JCQlDb21tb25hcmNoaXZlRmFjdG9yeSB0aGVDb21tb25hcmNoaXZlRmFjdG9yeSA9IChDb21tb25hcmNoaXZlRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiY29tbW9uYXJjaGl2ZS54bWkiKTsgCisJCQlDb21tb25hcmNoaXZlRmFjdG9yeSB0aGVDb21tb25hcmNoaXZlRmFjdG9yeSA9IChDb21tb25hcmNoaXZlRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiY29tbW9uYXJjaGl2ZS54bWkiKTsgLy8kTk9OLU5MUy0xJCAKIAkJCWlmICh0aGVDb21tb25hcmNoaXZlRmFjdG9yeSAhPSBudWxsKSB7CiAJCQkJcmV0dXJuIHRoZUNvbW1vbmFyY2hpdmVGYWN0b3J5OwogCQkJfQpAQCAtMTIwLDM5ICsxMTksNDggQEAKIAkJCWRlbGVnYXRlTmVlZHNJbml0ID0gZmFsc2U7CiAJCQlkZWxlZ2F0ZSA9IG5ldyBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwoKSB7CiAKKwkJCQlAT3ZlcnJpZGUKIAkJCQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRGaWxlIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZSgpIHsKIAkJCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RmlsZUdlbigpOwogCQkJCX0KIAogCisJCQkJQE92ZXJyaWRlCiAJCQkJcHVibGljIENsaWVudE1vZHVsZVJlZiBjcmVhdGVDbGllbnRNb2R1bGVSZWYoKSB7CiAJCQkJCXJldHVybiBjcmVhdGVDbGllbnRNb2R1bGVSZWZHZW4oKTsKIAkJCQl9CiAKKwkJCQlAT3ZlcnJpZGUKIAkJCQlwdWJsaWMgQ29ubmVjdG9yTW9kdWxlUmVmIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZigpIHsKIAkJCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rvck1vZHVsZVJlZkdlbigpOwogCQkJCX0KIAorCQkJCUBPdmVycmlkZQogCQkJCXB1YmxpYyBFQVJGaWxlIGNyZWF0ZUVBUkZpbGUoKSB7CiAJCQkJCXJldHVybiBjcmVhdGVFQVJGaWxlR2VuKCk7CiAJCQkJfQogCisJCQkJQE92ZXJyaWRlCiAJCQkJcHVibGljIEVKQkphckZpbGUgY3JlYXRlRUpCSmFyRmlsZSgpIHsKIAkJCQkJcmV0dXJuIGNyZWF0ZUVKQkphckZpbGVHZW4oKTsKIAkJCQl9CiAKKwkJCQlAT3ZlcnJpZGUKIAkJCQlwdWJsaWMgRUpCTW9kdWxlUmVmIGNyZWF0ZUVKQk1vZHVsZVJlZigpIHsKIAkJCQkJcmV0dXJuIGNyZWF0ZUVKQk1vZHVsZVJlZkdlbigpOwogCQkJCX0KIAorCQkJCUBPdmVycmlkZQogCQkJCXB1YmxpYyBSQVJGaWxlIGNyZWF0ZVJBUkZpbGUoKSB7CiAJCQkJCXJldHVybiBjcmVhdGVSQVJGaWxlR2VuKCk7CiAJCQkJfQogCisJCQkJQE92ZXJyaWRlCiAJCQkJcHVibGljIFdBUkZpbGUgY3JlYXRlV0FSRmlsZSgpIHsKIAkJCQkJcmV0dXJuIGNyZWF0ZVdBUkZpbGVHZW4oKTsKIAkJCQl9CiAKKwkJCQlAT3ZlcnJpZGUKIAkJCQlwdWJsaWMgV2ViTW9kdWxlUmVmIGNyZWF0ZVdlYk1vZHVsZVJlZigpIHsKIAkJCQkJcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZVJlZkdlbigpOwogCQkJCX0KQEAgLTE2NSw2ICsxNzMsNyBAQAogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewogCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFOiByZXR1cm4gY3JlYXRlRmlsZSgpOwpAQCAtMTgwLDcgKzE4OSw3IEBACiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNMSUVOVF9NT0RVTEVfUkVGOiByZXR1cm4gY3JlYXRlQ2xpZW50TW9kdWxlUmVmKCk7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEVfUkVGOiByZXR1cm4gY3JlYXRlQ29ubmVjdG9yTW9kdWxlUmVmKCk7CiAJCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAl9CiAKQEAgLTQ1Miw3ICs0NjEsNyBAQAogCQkJCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKIAkJCQkJaWYgKGFGaWxlLmdldExvYWRpbmdDb250YWluZXIoKSA9PSBhbkFyY2hpdmUpIHsKIAkJCQkJCUFyY2hpdmUgb3V0ZXJtb3N0ID0gb3BlbmVkQXJjaGl2ZTsKLQkJCQkJCUNvbnRhaW5lciBjID0gb3BlbmVkQXJjaGl2ZS5nZXRDb250YWluZXIoKTsKKwkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lciBjID0gb3BlbmVkQXJjaGl2ZS5nZXRDb250YWluZXIoKTsKIAkJCQkJCXdoaWxlIChjICE9IG51bGwgJiYgYy5pc0FyY2hpdmUoKSkgewogCQkJCQkJCW91dGVybW9zdCA9IChBcmNoaXZlKSBjOwogCQkJCQkJCWMgPSBjLmdldENvbnRhaW5lcigpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db21tb25hcmNoaXZlUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsLmphdmEKaW5kZXggYzM5OTdkMS4uOWRkMGJhOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Db21tb25hcmNoaXZlUGFja2FnZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbC5qYXZhCkBAIC0yNyw3ICsyNyw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29ubmVjdG9yTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbnRhaW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwpAQCAtNDAsMTEgKzM5LDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5pbXBsLkxvb3NlY29uZmlnUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUluaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwogCiAKIC8qKgpAQCAtMTYyLDIwICsxNjEsMTYgQEAKIAkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKENvbW1vbmFyY2hpdmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVOU19VUkkpOwogCiAJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsIHRoZUNvbW1vbmFyY2hpdmVQYWNrYWdlID0gKENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25hcmNoaXZlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBDb21tb25hcmNoaXZlUGFja2FnZUltcGwoKSk7CisJCUNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCB0aGVDb21tb25hcmNoaXZlUGFja2FnZSA9IAorCQkJKENvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YKKwkJCQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3CisJCQkJCQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsKCkpOwogCiAJCWlzSW5pdGVkID0gdHJ1ZTsKIAogCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKIAkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUVqYlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlKc3BQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCQlKMkVFSW5pdC5pbml0RU1GTW9kZWxzKCk7CiAJCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKIAogCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwpAQCAtMTkyLDYgKzE4Nyw5IEBACiAJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKIAkJdGhlQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZnJlZXplKCk7CiAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChDb21tb25hcmNoaXZlUGFja2FnZS5lTlNfVVJJLCB0aGVDb21tb25hcmNoaXZlUGFja2FnZSk7CisKIAkJcmV0dXJuIHRoZUNvbW1vbmFyY2hpdmVQYWNrYWdlOwogCX0KIApAQCAtNTM3LDc0ICs1MzUsODYgQEAKIAkJLy8gQWRkIHN1YnBhY2thZ2VzCiAJCWdldEVTdWJwYWNrYWdlcygpLmFkZCh0aGVMb29zZWNvbmZpZ1BhY2thZ2UpOwogCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJZmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlhcmNoaXZlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGFpbmVyKCkpOwotCQllamJKYXJGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlRmlsZSgpKTsKLQkJd2FyRmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZUZpbGUoKSk7Ci0JCWVhckZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVGaWxlKCkpOwotCQlhcHBsaWNhdGlvbkNsaWVudEZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVGaWxlKCkpOwotCQltb2R1bGVGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QXJjaGl2ZSgpKTsKLQkJY29udGFpbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RmlsZSgpKTsKLQkJcmVhZE9ubHlEaXJlY3RvcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250YWluZXIoKSk7Ci0JCXJhckZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVGaWxlKCkpOwotCQltb2R1bGVSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZWpiTW9kdWxlUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlUmVmKCkpOwotCQl3ZWJNb2R1bGVSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVSZWYoKSk7Ci0JCWNsaWVudE1vZHVsZVJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZVJlZigpKTsKLQkJY29ubmVjdG9yTW9kdWxlUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlUmVmKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoZmlsZUVDbGFzcywgRmlsZS5jbGFzcywgIkZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpbGVfVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJVUkkiLCBudWxsLCAwLCAxLCBGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWxlX0xhc3RNb2RpZmllZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwgImxhc3RNb2RpZmllZCIsIG51bGwsIDAsIDEsIEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsZV9TaXplKCksIGVjb3JlUGFja2FnZS5nZXRFTG9uZygpLCAic2l6ZSIsIG51bGwsIDAsIDEsIEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsZV9EaXJlY3RvcnlFbnRyeSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRpcmVjdG9yeUVudHJ5IiwgbnVsbCwgMCwgMSwgRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWxlX09yaWdpbmFsVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJvcmlnaW5hbFVSSSIsIG51bGwsIDAsIDEsIEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpbGVfTG9hZGluZ0NvbnRhaW5lcigpLCB0aGlzLmdldENvbnRhaW5lcigpLCBudWxsLCAibG9hZGluZ0NvbnRhaW5lciIsIG51bGwsIDEsIDEsIEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpbGVfQ29udGFpbmVyKCksIHRoaXMuZ2V0Q29udGFpbmVyKCksIHRoaXMuZ2V0Q29udGFpbmVyX0ZpbGVzKCksICJjb250YWluZXIiLCBudWxsLCAwLCAxLCBGaWxlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXJjaGl2ZUVDbGFzcywgQXJjaGl2ZS5jbGFzcywgIkFyY2hpdmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFyY2hpdmVfVHlwZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGVzIiwgbnVsbCwgMCwgLTEsIEFyY2hpdmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlamJKYXJGaWxlRUNsYXNzLCBFSkJKYXJGaWxlLmNsYXNzLCAiRUpCSmFyRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpLCB0aGVFamJQYWNrYWdlLmdldEVKQkphcigpLCBudWxsLCAiZGVwbG95bWVudERlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBFSkJKYXJGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2FyRmlsZUVDbGFzcywgV0FSRmlsZS5jbGFzcywgIldBUkZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmdldFdlYkFwcCgpLCBudWxsLCAiZGVwbG95bWVudERlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBXQVJGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWFyRmlsZUVDbGFzcywgRUFSRmlsZS5jbGFzcywgIkVBUkZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVBUkZpbGVfTW9kdWxlUmVmcygpLCB0aGlzLmdldE1vZHVsZVJlZigpLCB0aGlzLmdldE1vZHVsZVJlZl9FYXJGaWxlKCksICJtb2R1bGVSZWZzIiwgbnVsbCwgMSwgLTEsIEVBUkZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSwgdGhlQXBwbGljYXRpb25QYWNrYWdlLmdldEFwcGxpY2F0aW9uKCksIG51bGwsICJkZXBsb3ltZW50RGVzY3JpcHRvciIsIG51bGwsIDEsIDEsIEVBUkZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhcHBsaWNhdGlvbkNsaWVudEZpbGVFQ2xhc3MsIEFwcGxpY2F0aW9uQ2xpZW50RmlsZS5jbGFzcywgIkFwcGxpY2F0aW9uQ2xpZW50RmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCksIHRoZUNsaWVudFBhY2thZ2UuZ2V0QXBwbGljYXRpb25DbGllbnQoKSwgbnVsbCwgImRlcGxveW1lbnREZXNjcmlwdG9yIiwgbnVsbCwgMSwgMSwgQXBwbGljYXRpb25DbGllbnRGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobW9kdWxlRmlsZUVDbGFzcywgTW9kdWxlRmlsZS5jbGFzcywgIk1vZHVsZUZpbGUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbnRhaW5lckVDbGFzcywgQ29udGFpbmVyLmNsYXNzLCAiQ29udGFpbmVyIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRhaW5lcl9GaWxlcygpLCB0aGlzLmdldEZpbGUoKSwgdGhpcy5nZXRGaWxlX0NvbnRhaW5lcigpLCAiZmlsZXMiLCBudWxsLCAwLCAtMSwgQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocmVhZE9ubHlEaXJlY3RvcnlFQ2xhc3MsIFJlYWRPbmx5RGlyZWN0b3J5LmNsYXNzLCAiUmVhZE9ubHlEaXJlY3RvcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhyYXJGaWxlRUNsYXNzLCBSQVJGaWxlLmNsYXNzLCAiUkFSRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UkFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpLCB0aGVKY2FQYWNrYWdlLmdldENvbm5lY3RvcigpLCBudWxsLCAiZGVwbG95bWVudERlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBSQVJGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobW9kdWxlUmVmRUNsYXNzLCBNb2R1bGVSZWYuY2xhc3MsICJNb2R1bGVSZWYiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TW9kdWxlUmVmX01vZHVsZUZpbGUoKSwgdGhpcy5nZXRNb2R1bGVGaWxlKCksIG51bGwsICJtb2R1bGVGaWxlIiwgbnVsbCwgMSwgMSwgTW9kdWxlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNb2R1bGVSZWZfRWFyRmlsZSgpLCB0aGlzLmdldEVBUkZpbGUoKSwgdGhpcy5nZXRFQVJGaWxlX01vZHVsZVJlZnMoKSwgImVhckZpbGUiLCBudWxsLCAxLCAxLCBNb2R1bGVSZWYuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1vZHVsZVJlZl9Nb2R1bGUoKSwgdGhlQXBwbGljYXRpb25QYWNrYWdlLmdldE1vZHVsZSgpLCBudWxsLCAibW9kdWxlIiwgbnVsbCwgMSwgMSwgTW9kdWxlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZWpiTW9kdWxlUmVmRUNsYXNzLCBFSkJNb2R1bGVSZWYuY2xhc3MsICJFSkJNb2R1bGVSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh3ZWJNb2R1bGVSZWZFQ2xhc3MsIFdlYk1vZHVsZVJlZi5jbGFzcywgIldlYk1vZHVsZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNsaWVudE1vZHVsZVJlZkVDbGFzcywgQ2xpZW50TW9kdWxlUmVmLmNsYXNzLCAiQ2xpZW50TW9kdWxlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29ubmVjdG9yTW9kdWxlUmVmRUNsYXNzLCBDb25uZWN0b3JNb2R1bGVSZWYuY2xhc3MsICJDb25uZWN0b3JNb2R1bGVSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCQlib29sZWFuIGhhc0xvY2sgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCWhhc0xvY2sgPSBKMkVFSW5pdC5hcXVpcmVJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJfQkJCisJCQorCQl0cnl7CisJCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCQlmaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQlhcmNoaXZlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGFpbmVyKCkpOworCQkJZWpiSmFyRmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZUZpbGUoKSk7CisJCQl3YXJGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlRmlsZSgpKTsKKwkJCWVhckZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNb2R1bGVGaWxlKCkpOworCQkJYXBwbGljYXRpb25DbGllbnRGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TW9kdWxlRmlsZSgpKTsKKwkJCW1vZHVsZUZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBcmNoaXZlKCkpOworCQkJY29udGFpbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RmlsZSgpKTsKKwkJCXJlYWRPbmx5RGlyZWN0b3J5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGFpbmVyKCkpOworCQkJcmFyRmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZUZpbGUoKSk7CisJCQltb2R1bGVSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCWVqYk1vZHVsZVJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZVJlZigpKTsKKwkJCXdlYk1vZHVsZVJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZVJlZigpKTsKKwkJCWNsaWVudE1vZHVsZVJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZVJlZigpKTsKKwkJCWNvbm5lY3Rvck1vZHVsZVJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1vZHVsZVJlZigpKTsKKwkKKwkJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCQlpbml0RUNsYXNzKGZpbGVFQ2xhc3MsIEZpbGUuY2xhc3MsICJGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRGaWxlX1VSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiVVJJIiwgbnVsbCwgMCwgMSwgRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsZV9MYXN0TW9kaWZpZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVMb25nKCksICJsYXN0TW9kaWZpZWQiLCBudWxsLCAwLCAxLCBGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEZpbGVfU2l6ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwgInNpemUiLCBudWxsLCAwLCAxLCBGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEZpbGVfRGlyZWN0b3J5RW50cnkoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJkaXJlY3RvcnlFbnRyeSIsIG51bGwsIDAsIDEsIEZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsZV9PcmlnaW5hbFVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAib3JpZ2luYWxVUkkiLCBudWxsLCAwLCAxLCBGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRGaWxlX0xvYWRpbmdDb250YWluZXIoKSwgdGhpcy5nZXRDb250YWluZXIoKSwgbnVsbCwgImxvYWRpbmdDb250YWluZXIiLCBudWxsLCAxLCAxLCBGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRGaWxlX0NvbnRhaW5lcigpLCB0aGlzLmdldENvbnRhaW5lcigpLCB0aGlzLmdldENvbnRhaW5lcl9GaWxlcygpLCAiY29udGFpbmVyIiwgbnVsbCwgMCwgMSwgRmlsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhhcmNoaXZlRUNsYXNzLCBBcmNoaXZlLmNsYXNzLCAiQXJjaGl2ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJjaGl2ZV9UeXBlcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZXMiLCBudWxsLCAwLCAtMSwgQXJjaGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhlamJKYXJGaWxlRUNsYXNzLCBFSkJKYXJGaWxlLmNsYXNzLCAiRUpCSmFyRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpLCB0aGVFamJQYWNrYWdlLmdldEVKQkphcigpLCBudWxsLCAiZGVwbG95bWVudERlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBFSkJKYXJGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHdhckZpbGVFQ2xhc3MsIFdBUkZpbGUuY2xhc3MsICJXQVJGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXQVJGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCksIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5nZXRXZWJBcHAoKSwgbnVsbCwgImRlcGxveW1lbnREZXNjcmlwdG9yIiwgbnVsbCwgMSwgMSwgV0FSRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhlYXJGaWxlRUNsYXNzLCBFQVJGaWxlLmNsYXNzLCAiRUFSRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUFSRmlsZV9Nb2R1bGVSZWZzKCksIHRoaXMuZ2V0TW9kdWxlUmVmKCksIHRoaXMuZ2V0TW9kdWxlUmVmX0VhckZpbGUoKSwgIm1vZHVsZVJlZnMiLCBudWxsLCAxLCAtMSwgRUFSRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUFSRmlsZV9EZXBsb3ltZW50RGVzY3JpcHRvcigpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2UuZ2V0QXBwbGljYXRpb24oKSwgbnVsbCwgImRlcGxveW1lbnREZXNjcmlwdG9yIiwgbnVsbCwgMSwgMSwgRUFSRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhhcHBsaWNhdGlvbkNsaWVudEZpbGVFQ2xhc3MsIEFwcGxpY2F0aW9uQ2xpZW50RmlsZS5jbGFzcywgIkFwcGxpY2F0aW9uQ2xpZW50RmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRGaWxlX0RlcGxveW1lbnREZXNjcmlwdG9yKCksIHRoZUNsaWVudFBhY2thZ2UuZ2V0QXBwbGljYXRpb25DbGllbnQoKSwgbnVsbCwgImRlcGxveW1lbnREZXNjcmlwdG9yIiwgbnVsbCwgMSwgMSwgQXBwbGljYXRpb25DbGllbnRGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKG1vZHVsZUZpbGVFQ2xhc3MsIE1vZHVsZUZpbGUuY2xhc3MsICJNb2R1bGVGaWxlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoY29udGFpbmVyRUNsYXNzLCBDb250YWluZXIuY2xhc3MsICJDb250YWluZXIiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyX0ZpbGVzKCksIHRoaXMuZ2V0RmlsZSgpLCB0aGlzLmdldEZpbGVfQ29udGFpbmVyKCksICJmaWxlcyIsIG51bGwsIDAsIC0xLCBDb250YWluZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MocmVhZE9ubHlEaXJlY3RvcnlFQ2xhc3MsIFJlYWRPbmx5RGlyZWN0b3J5LmNsYXNzLCAiUmVhZE9ubHlEaXJlY3RvcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MocmFyRmlsZUVDbGFzcywgUkFSRmlsZS5jbGFzcywgIlJBUkZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJBUkZpbGVfRGVwbG95bWVudERlc2NyaXB0b3IoKSwgdGhlSmNhUGFja2FnZS5nZXRDb25uZWN0b3IoKSwgbnVsbCwgImRlcGxveW1lbnREZXNjcmlwdG9yIiwgbnVsbCwgMSwgMSwgUkFSRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhtb2R1bGVSZWZFQ2xhc3MsIE1vZHVsZVJlZi5jbGFzcywgIk1vZHVsZVJlZiIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNb2R1bGVSZWZfTW9kdWxlRmlsZSgpLCB0aGlzLmdldE1vZHVsZUZpbGUoKSwgbnVsbCwgIm1vZHVsZUZpbGUiLCBudWxsLCAxLCAxLCBNb2R1bGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1vZHVsZVJlZl9FYXJGaWxlKCksIHRoaXMuZ2V0RUFSRmlsZSgpLCB0aGlzLmdldEVBUkZpbGVfTW9kdWxlUmVmcygpLCAiZWFyRmlsZSIsIG51bGwsIDEsIDEsIE1vZHVsZVJlZi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TW9kdWxlUmVmX01vZHVsZSgpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2UuZ2V0TW9kdWxlKCksIG51bGwsICJtb2R1bGUiLCBudWxsLCAxLCAxLCBNb2R1bGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoZWpiTW9kdWxlUmVmRUNsYXNzLCBFSkJNb2R1bGVSZWYuY2xhc3MsICJFSkJNb2R1bGVSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Mod2ViTW9kdWxlUmVmRUNsYXNzLCBXZWJNb2R1bGVSZWYuY2xhc3MsICJXZWJNb2R1bGVSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoY2xpZW50TW9kdWxlUmVmRUNsYXNzLCBDbGllbnRNb2R1bGVSZWYuY2xhc3MsICJDbGllbnRNb2R1bGVSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoY29ubmVjdG9yTW9kdWxlUmVmRUNsYXNzLCBDb25uZWN0b3JNb2R1bGVSZWYuY2xhc3MsICJDb25uZWN0b3JNb2R1bGVSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiB9IC8vQ29tbW9uYXJjaGl2ZVBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rvck1vZHVsZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlUmVmSW1wbC5qYXZhCmluZGV4IDQ4NzQ2NzguLjY2MjQzOWMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlUmVmSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlUmVmSW1wbC5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuQ09OTkVDVE9SX01PRFVMRV9SRUY7CiAJfQpAQCAtNDMsNiArNDQsNyBAQAogCS8qCiAJICogQHNlZSBNb2R1bGVSZWYjaXNDb25uZWN0b3IoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdG9yKCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0NvbnRhaW5lckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29udGFpbmVySW1wbC5qYXZhCmluZGV4IDI4ZDc3OTUuLjZmNjFlOTQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29udGFpbmVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvQ29udGFpbmVySW1wbC5qYXZhCkBAIC0xOCw2ICsxOCw4IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CkBAIC00NCw2ICs0Niw3IEBACiAJICogSW5uZXIgY2xhc3Mgd2hpY2ggbWFpbnRhaW5zIHRoZSBpbmRleCBmb3IgdGhlIGRvbWFpbidzIGNvbGxlY3Rpb24gb2Ygbm9kZXMga2V5ZWQgYnkgbmFtZS4KIAkgKi8KIAlwcm90ZWN0ZWQgY2xhc3MgRmlsZU5vdGlmaWNhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7CisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7CiAJCQlyZXR1cm4gKHR5cGUgPT0gIkZpbGVOb3RpZmljYXRpb25BZGFwdGVyIik7Ly8kTk9OLU5MUy0xJAogCQl9CkBAIC01OSw2ICs2Miw3IEBACiAJCQlub3RpZmllci5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCQlpZiAoZmlsZUluZGV4ID09IG51bGwgfHwgbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBudWxsKQogCQkJCXJldHVybjsKQEAgLTE3MCw2ICsxNzQsNyBAQAogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLkNPTlRBSU5FUjsKIAl9CkBAIC0xOTYsNyArMjAxLDIwIEBACiAJCWlmICghaXNJbmRleGVkKCkpIHsKIAkJCWdldEZpbGVzKCk7CiAJCX0KKwkJCisJCS8vIFNvbWUgbG9hZCBzdHJhdGVnaWVzIGxvYWQgdGhlIGZpbGVzIGFzIHJlbGF0aXZlLCBhbmQgc29tZSBhcyBhYnNvbHV0ZSBwYXRocywgc28uLi4KKwkJLy8gRmlyc3QgdHJ5IHdpdGggdGhlIG9yaWdpbmFsIFVSSQogCQlGaWxlIGZpbGUgPSAoRmlsZSkgZ2V0RmlsZUluZGV4KCkuZ2V0KFVSSSk7CisJCQorCQlpZiAoZmlsZSA9PSBudWxsKXsKKwkJCS8vIElmIHRoZSBmaWxlIHdhcyBub3QgZm91bmQsIHRyeSB1c2luZyBhYnNvbHV0ZSBwYXRoCisJCQlJUGF0aCBVUklQYXRoID0gbmV3IFBhdGgoVVJJKTsKKwkJCWlmIChVUklQYXRoLnNlZ21lbnRDb3VudCgpID4gMSl7CisJCQkJVVJJUGF0aCA9IFVSSVBhdGgubWFrZUFic29sdXRlKCk7CisJCQkJZmlsZSA9IChGaWxlKSBnZXRGaWxlSW5kZXgoKS5nZXQoVVJJUGF0aC50b1N0cmluZygpKTsKKwkJCX0JCQkKKwkJfQorCQkJCQogCQlpZiAoZmlsZSA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24oVVJJKTsKIAkJfQpAQCAtMjYzLDYgKzI4MSw3IEBACiAJCXJldHVybiBsb2FkU3RyYXRlZ3k7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNDb250YWluZXIoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTMxNyw2ICszMzYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVM6CkBAIC0zMzAsNiArMzUwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTOgpAQCAtMzQzLDYgKzM2NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUzoKQEAgLTM1Niw2ICszNzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5DT05UQUlORVJfX0ZJTEVTOgpAQCAtMzcxLDYgKzM5NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkNPTlRBSU5FUl9fRklMRVM6CkBAIC0zODUsNiArNDA5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuQ09OVEFJTkVSX19GSUxFUzoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUFSRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUFSRmlsZUltcGwuamF2YQppbmRleCA0MWVjODA0Li5jMDQ5MGM1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0VBUkZpbGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FQVJGaWxlSW1wbC5qYXZhCkBAIC0xMjQsMTAgKzEyNCwxMiBAQAogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLkVBUl9GSUxFOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBBcmNoaXZlIGFkZENvcHkoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKIAkJaWYgKGFuQXJjaGl2ZS5pc01vZHVsZUZpbGUoKSkKIAkJCXJldHVybiBhZGRDb3B5KChNb2R1bGVGaWxlKSBhbkFyY2hpdmUpOwpAQCAtMjI3LDcgKzIyOSw5IEBACiAJCX0gZWxzZSBpZiAoYU1vZHVsZUZpbGUuaXNSQVJGaWxlKCkpIHsKIAkJCWFNb2R1bGUgPSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVDb25uZWN0b3JNb2R1bGUoKTsKIAkJfQotCQlhTW9kdWxlLnNldFVyaShhTW9kdWxlRmlsZS5nZXRVUkkoKSk7CisJCWlmKGFNb2R1bGUgIT0gbnVsbCl7CisJCQlhTW9kdWxlLnNldFVyaShhTW9kdWxlRmlsZS5nZXRVUkkoKSk7CisJCX0KIAkJcmV0dXJuIGFNb2R1bGU7CiAJfQogCkBAIC0zNDUsNiArMzQ5LDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuTW9kdWxlRmlsZQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkk7CiAJfQpAQCAtNTg4LDEwICs1OTMsMTIgQEAKIAkJcmV0dXJuIHdhckZpbGVzOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGluaXRpYWxpemVBZnRlck9wZW4oKSB7CiAJCXN1cGVyLmluaXRpYWxpemVBZnRlck9wZW4oKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkgewogCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKIAl9CkBAIC01OTksNiArNjA2LDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzRUFSRmlsZSgpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQpAQCAtNjA3LDYgKzYxNSw3IEBACiAJICogUmV0dXJuIHRydWUgaWYgc3VwZXIgcmV0dXJucyB0cnVlLCBvciByZXR1cm4gd2hldGhlciB0aGUgYXBwIGRkIGNvbnRhaW5zIGEgbW9kdWxlIGhhdmluZyB0aGUKIAkgKiB1cmkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc05lc3RlZEFyY2hpdmUoU3RyaW5nIGFVcmkpIHsKIAkJaWYgKHN1cGVyLmlzTmVzdGVkQXJjaGl2ZShhVXJpKSkKIAkJCXJldHVybiB0cnVlOwpAQCAtNjE2LDYgKzYyNSw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLmltcGwuTW9kdWxlRmlsZUltcGwKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKFhNTFJlc291cmNlIHJlc291cmNlKSB7CiAJCUFwcGxpY2F0aW9uIGFwcGwgPSAoKEFwcGxpY2F0aW9uUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpKS5nZXRBcHBsaWNhdGlvbkZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwogCQlyZXNvdXJjZS5zZXRJRChhcHBsLCBKMkVFQ29uc3RhbnRzLkFQUExfSUQpOwpAQCAtNjI3LDYgKzYzNyw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQXJjaGl2ZSBvcGVuTmVzdGVkQXJjaGl2ZShMb29zZUFyY2hpdmUgbG9vc2UpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7CiAKIAkJTW9kdWxlIG0gPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEZpcnN0TW9kdWxlKGxvb3NlLmdldFVyaSgpKTsKQEAgLTY0OCw2ICs2NTksNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5BcmNoaXZlCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFyY2hpdmUgb3Blbk5lc3RlZEFyY2hpdmUoU3RyaW5nIGFVcmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7CiAKIAkJTW9kdWxlIG0gPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEZpcnN0TW9kdWxlKGFVcmkpOwpAQCAtODgwLDYgKzg5Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTOgpAQCAtODkzLDYgKzkwNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTOgpAQCAtOTA2LDYgKzkyMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTOgpAQCAtOTIyLDYgKzkzNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkVBUl9GSUxFX19NT0RVTEVfUkVGUzoKQEAgLTk0MCw2ICs5NTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FQVJfRklMRV9fTU9EVUxFX1JFRlM6CkBAIC05NTcsNiArOTc0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRUFSX0ZJTEVfX01PRFVMRV9SRUZTOgpAQCAtMTAwNSwxMCArMTAyMywxMCBAQAogCQkJbmV3UmVmID0gZ2V0Q29tbW9uQXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVDb25uZWN0b3JNb2R1bGVSZWYoKTsKIAkJZWxzZSBpZiAoYU1vZHVsZS5pc0phdmFNb2R1bGUoKSkKIAkJCW5ld1JlZiA9IGdldENvbW1vbkFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlQ2xpZW50TW9kdWxlUmVmKCk7Ci0KLQkJbmV3UmVmLnNldE1vZHVsZShhTW9kdWxlKTsKLQkJbmV3UmVmLnNldE1vZHVsZUZpbGUoYUZpbGUpOwotCisJCWlmKG5ld1JlZiAhPSBudWxsKXsKKwkJCW5ld1JlZi5zZXRNb2R1bGUoYU1vZHVsZSk7CisJCQluZXdSZWYuc2V0TW9kdWxlRmlsZShhRmlsZSk7CisJCX0KIAkJcmV0dXJuIG5ld1JlZjsKIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCSmFyRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCSmFyRmlsZUltcGwuamF2YQppbmRleCAwZmNiNDI1Li41MDYyMTA2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0VKQkphckZpbGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FSkJKYXJGaWxlSW1wbC5qYXZhCkBAIC01NCw2ICs1NCw3IEBACiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuRUpCX0pBUl9GSUxFOwogCX0KQEAgLTEyNCw2ICsxMjUsNyBAQAogCQlyZXR1cm4gdGhpcy5nZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlcGxveW1lbnREZXNjcmlwdG9yVXJpKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJOwogCX0KQEAgLTEzNSw2ICsxMzcsNyBAQAogCQlyZXR1cm4gZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkgewogCQlyZXR1cm4gZGVwbG95bWVudERlc2NyaXB0b3IgIT0gbnVsbDsKIAl9CkBAIC0xNDIsNiArMTQ1LDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuRmlsZQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzRUpCSmFyRmlsZSgpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQpAQCAtMTU2LDYgKzE2MCw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLmltcGwuTW9kdWxlRmlsZUltcGwKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QgbWFrZURlcGxveW1lbnREZXNjcmlwdG9yKFhNTFJlc291cmNlIHJlc291cmNlKSB7CiAJCUVKQkphciBlamJKYXIgPSAoKEVqYlBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkpLmdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJKYXIoKTsKIAkJcmVzb3VyY2Uuc2V0SUQoZWpiSmFyLCBKMkVFQ29uc3RhbnRzLkVKQkpBUl9JRCk7CkBAIC0yMDksNiArMjE0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKQEAgLTIyMyw2ICsyMjksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKQEAgLTIzNyw2ICsyNDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKQEAgLTI1MSw2ICsyNTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5FSkJfSkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRUpCTW9kdWxlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FSkJNb2R1bGVSZWZJbXBsLmphdmEKaW5kZXggNjBmNTM5Yy4uYjcwMTI0ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FSkJNb2R1bGVSZWZJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9FSkJNb2R1bGVSZWZJbXBsLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5MaXRlcmFscy5FSkJfTU9EVUxFX1JFRjsKIAl9CkBAIC00NSw2ICs0Niw3IEBACiAJLyoKIAkgKiBAc2VlIE1vZHVsZVJlZiNpc0VKQigpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNFSkIoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvRmlsZUltcGwuamF2YQppbmRleCA1MDBjZTc5Li5lMzg4MWExIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL0ZpbGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9GaWxlSW1wbC5qYXZhCkBAIC0xNDksNiArMTQ5LDcgQEAKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5MaXRlcmFscy5GSUxFOwogCX0KQEAgLTQ0Myw4ICs0NDQsOCBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb250YWluZXIoQ29udGFpbmVyIG5ld0NvbnRhaW5lciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3Q29udGFpbmVyLCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVIsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKKwkJTm90aWZpY2F0aW9uQ2hhaW4gaW5uZXJNc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3Q29udGFpbmVyLCBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVIsIG1zZ3MpOworCQlyZXR1cm4gaW5uZXJNc2dzOwogCX0KIAogCS8qKgpAQCAtNDUzLDcgKzQ1NCw3IEBACiAJcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKENvbnRhaW5lciBuZXdDb250YWluZXIpIHsKIAkJaWYgKG5ld0NvbnRhaW5lciAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVIgJiYgbmV3Q29udGFpbmVyICE9IG51bGwpKSB7CiAJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3Q29udGFpbmVyKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTQ3MSwxMiArNDcyLDE1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fQ09OVEFJTkVSOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRDb250YWluZXIoKENvbnRhaW5lcilvdGhlckVuZCwgbXNncyk7CisJCQkJTm90aWZpY2F0aW9uQ2hhaW4gaW5uZXJNc2dzID0gbXNnczsKKwkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCl7CisJCQkJCWlubmVyTXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CisJCQkJfQorCQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lcigoQ29udGFpbmVyKW90aGVyRW5kLCBpbm5lck1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC00ODYsNiArNDkwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19DT05UQUlORVI6CkBAIC00OTksNiArNTA0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX0NPTlRBSU5FUjoKQEAgLTUxMiw2ICs1MTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1VSSToKQEAgLTUzOCw2ICs1NDUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5GSUxFX19VUkk6CkBAIC01NzAsNiArNTc4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuRklMRV9fVVJJOgpAQCAtNjAyLDYgKzYxMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLkZJTEVfX1VSSToKQEAgLTYyNSwxOSArNjM1LDIwIEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKFVSSTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoVVJJOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFzdE1vZGlmaWVkOiAiKTsKLQkJaWYgKGxhc3RNb2RpZmllZEVTZXQpIHJlc3VsdC5hcHBlbmQobGFzdE1vZGlmaWVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2l6ZTogIik7Ci0JCWlmIChzaXplRVNldCkgcmVzdWx0LmFwcGVuZChzaXplKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGlyZWN0b3J5RW50cnk6ICIpOwotCQlpZiAoZGlyZWN0b3J5RW50cnlFU2V0KSByZXN1bHQuYXBwZW5kKGRpcmVjdG9yeUVudHJ5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3JpZ2luYWxVUkk6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGxhc3RNb2RpZmllZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGxhc3RNb2RpZmllZEVTZXQpIHJlc3VsdC5hcHBlbmQobGFzdE1vZGlmaWVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBzaXplOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoc2l6ZUVTZXQpIHJlc3VsdC5hcHBlbmQoc2l6ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgZGlyZWN0b3J5RW50cnk6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChkaXJlY3RvcnlFbnRyeUVTZXQpIHJlc3VsdC5hcHBlbmQoZGlyZWN0b3J5RW50cnkpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIG9yaWdpbmFsVVJJOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG9yaWdpbmFsVVJJKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZUZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL01vZHVsZUZpbGVJbXBsLmphdmEKaW5kZXggZGFmMDMxYy4uNzg2YWY3NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVGaWxlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlRmlsZUltcGwuamF2YQpAQCAtNDksNiArNDksNyBAQAogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLk1PRFVMRV9GSUxFOwogCX0KQEAgLTY5LDYgKzcwLDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuTW9kdWxlRmlsZQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBFQVJGaWxlIGdldEVBUkZpbGUoKSB7CiAJCUNvbnRhaW5lciBhQ29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7CiAJCWlmIChhQ29udGFpbmVyID09IG51bGwgfHwgIWFDb250YWluZXIuaXNFQVJGaWxlKCkpIHsKQEAgLTEyOCw2ICsxMzAsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNNb2R1bGVGaWxlKCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CkBAIC0xNTQsNiArMTU3LDcgQEAKIAkJcmV0dXJuIHJlc291cmNlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNhdmUoU2F2ZVN0cmF0ZWd5IGFTYXZlU3RyYXRlZ3kpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7CiAJCXNldFNhdmVTdHJhdGVneShhU2F2ZVN0cmF0ZWd5KTsKIAkJaWYgKGdldEV4cG9ydFN0cmF0ZWd5KCkgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvTW9kdWxlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVSZWZJbXBsLmphdmEKaW5kZXggMzNkODdlOS4uMzE2ZmE3OCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVSZWZJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Nb2R1bGVSZWZJbXBsLmphdmEKQEAgLTcxLDYgKzcxLDcgQEAKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5MaXRlcmFscy5NT0RVTEVfUkVGOwogCX0KQEAgLTIzMSw4ICsyMzIsOCBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFYXJGaWxlKEVBUkZpbGUgbmV3RWFyRmlsZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3RWFyRmlsZSwgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEUsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKKwkJTm90aWZpY2F0aW9uQ2hhaW4gbXNnczIgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdFYXJGaWxlLCBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRSwgbXNncyk7CisJCXJldHVybiBtc2dzMjsKIAl9CiAKIAkvKioKQEAgLTI0MSw3ICsyNDIsNyBAQAogCXB1YmxpYyB2b2lkIHNldEVhckZpbGUoRUFSRmlsZSBuZXdFYXJGaWxlKSB7CiAJCWlmIChuZXdFYXJGaWxlICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFICYmIG5ld0VhckZpbGUgIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdFYXJGaWxlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTI5MiwxMiArMjkzLDE0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTU9EVUxFX1JFRl9fRUFSX0ZJTEU6CisJCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNnczIgPSBtc2dzOwogCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRFYXJGaWxlKChFQVJGaWxlKW90aGVyRW5kLCBtc2dzKTsKKwkJCQkJbXNnczIgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MyKTsKKwkJCQlyZXR1cm4gYmFzaWNTZXRFYXJGaWxlKChFQVJGaWxlKW90aGVyRW5kLCBtc2dzMik7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTMwNyw2ICszMTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX0VBUl9GSUxFOgpAQCAtMzIwLDYgKzMyNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5NT0RVTEVfUkVGX19FQVJfRklMRToKQEAgLTMzMyw2ICszMzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgpAQCAtMzUyLDYgKzM1OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgpAQCAtMzcyLDYgKzM3OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgpAQCAtMzkyLDYgKzQwMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLk1PRFVMRV9SRUZfX01PRFVMRV9GSUxFOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9SQVJGaWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9SQVJGaWxlSW1wbC5qYXZhCmluZGV4IDNlNmU2NGUuLjUxYzkyNmEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUkFSRmlsZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1JBUkZpbGVJbXBsLmphdmEKQEAgLTU2LDYgKzU2LDcgQEAKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5MaXRlcmFscy5SQVJfRklMRTsKIAl9CkBAIC0xMzQsNiArMTM1LDcgQEAKIAkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSB7CiAJCXJldHVybiBKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkk7CiAJfQpAQCAtMTUzLDYgKzE1NSw3IEBACiAJCXJldHVybiBnZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JTZXQoKSB7CiAJCXJldHVybiBkZXBsb3ltZW50RGVzY3JpcHRvciAhPSBudWxsOwogCX0KQEAgLTE2MCw2ICsxNjMsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5GaWxlCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNSQVJGaWxlKCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CkBAIC0xNjcsNiArMTcxLDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmNvbW1vbmFyY2hpdmUuaW1wbC5Nb2R1bGVGaWxlSW1wbAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCBtYWtlRGVwbG95bWVudERlc2NyaXB0b3IoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKIAkJSmNhUGFja2FnZSBwID0gKEpjYVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSk7CiAJCUpjYUZhY3RvcnkgZmN0ID0gcC5nZXRKY2FGYWN0b3J5KCk7CkBAIC0xODcsNiArMTkyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgpAQCAtMjAxLDYgKzIwNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLlJBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6CkBAIC0yMTUsNiArMjIyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuUkFSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKQEAgLTIyOSw2ICsyMzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5SQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgpAQCAtMjM3LDYgKzI0Niw3IEBACiAJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ2xhc3NMb2FkZXIgY3JlYXRlRHluYW1pY0NsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudENsLCBDbGFzc0xvYWRlciBleHRyYUNsKSB7CiAJCXJldHVybiBuZXcgUmFyRmlsZUR5bmFtaWNDbGFzc0xvYWRlcih0aGlzLCBwYXJlbnRDbCwgZXh0cmFDbCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9SZWFkT25seURpcmVjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUmVhZE9ubHlEaXJlY3RvcnlJbXBsLmphdmEKaW5kZXggMjkzZTY0YS4uYTM0OTY4ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9SZWFkT25seURpcmVjdG9yeUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1JlYWRPbmx5RGlyZWN0b3J5SW1wbC5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuTGl0ZXJhbHMuUkVBRF9PTkxZX0RJUkVDVE9SWTsKIAl9CkBAIC00MCw2ICs0MSw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkFyY2hpdmUKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBjb250YWluc0ZpbGUoamF2YS5sYW5nLlN0cmluZyBhVXJpKSB7CiAJCWdldEZpbGVzKCk7CiAJCXJldHVybiBnZXRGaWxlSW5kZXgoKS5jb250YWluc0tleShhVXJpKTsKQEAgLTEwNSw2ICsxMDcsNyBAQAogCS8qKgogCSAqIGlzUmVhZE9ubHlEaXJlY3RvcnkgbWV0aG9kIGNvbW1lbnQuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seURpcmVjdG9yeSgpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Sb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Sb290QXJjaGl2ZVR5cGVEZXNjcmltaW5hdG9ySW1wbC5qYXZhCmluZGV4IDI2MzU2NzIuLjUzYjExZGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1Jvb3RBcmNoaXZlVHlwZURlc2NyaW1pbmF0b3JJbXBsLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKICAqIAogICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgogICovCi1wdWJsaWMgY2xhc3MgUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciB7CitwdWJsaWMgY2xhc3MgUm9vdEFyY2hpdmVUeXBlRGVzY3JpbWluYXRvckltcGwgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgewogCXByb3RlY3RlZCBzdGF0aWMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCBzaW5nbGV0b247CiAKIAkvKioKQEAgLTM2LDYgKzM2LDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gY2FuSW1wb3J0KEFyY2hpdmUgYW5BcmNoaXZlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTQzLDYgKzQ0LDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFyY2hpdmUgY29udmVydChBcmNoaXZlIGFuQXJjaGl2ZSkgewogCQlyZXR1cm4gYW5BcmNoaXZlOwogCX0KQEAgLTUxLDYgKzUzLDcgQEAKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKIAkgKiAgICAgIGltcGxlbWVudGVyLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTY3LDYgKzcwLDcgQEAKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKIAkgKiAgICAgIGltcGxlbWVudGVyLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBJbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7CiAJCXJldHVybiBudWxsOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1Jvb3RFSkJKYXJEZXNjcmltaW5hdG9ySW1wbC5qYXZhCmluZGV4IGVkOWFjYzguLmQxZDczYzcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9Sb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogICogCiAgKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCiAgKi8KLXB1YmxpYyBjbGFzcyBSb290RUpCSmFyRGVzY3JpbWluYXRvckltcGwgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciB7CitwdWJsaWMgY2xhc3MgUm9vdEVKQkphckRlc2NyaW1pbmF0b3JJbXBsIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIHsKIAlwcm90ZWN0ZWQgc3RhdGljIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvckltcGwgc2luZ2xldG9uOwogCiAJLyoqCkBAIC0zOSw2ICszOSw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSkgewogCQlqYXZhLnV0aWwuTGlzdCB0aGVDaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhlQ2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKQEAgLTUyLDYgKzUzLDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFyY2hpdmUgY29udmVydChBcmNoaXZlIGFuQXJjaGl2ZSkgewogCQlyZXR1cm4gYW5BcmNoaXZlOwogCX0KQEAgLTYwLDYgKzYyLDcgQEAKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKIAkgKiAgICAgIGltcGxlbWVudGVyLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTc2LDYgKzc5LDcgQEAKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIFRoaXMgbmV2ZXIgZ2V0cyBjYWxsZWQgZm9yIHRoaXMKIAkgKiAgICAgIGltcGxlbWVudGVyLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBJbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTEwMyw2ICsxMDcsNyBAQAogCS8qKgogCSAqIEBzZWUgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yI29wZW5BcmNoaXZlKEFyY2hpdmUpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFyY2hpdmUgb3BlbkFyY2hpdmUoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7CiAJCUFyY2hpdmUgcmVzdWx0ID0gc3VwZXIub3BlbkFyY2hpdmUoYW5BcmNoaXZlKTsKIAkJaWYgKHJlc3VsdCA9PSBhbkFyY2hpdmUpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1dBUkZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9pbXBsL1dBUkZpbGVJbXBsLmphdmEKaW5kZXggZWYxYTEwMy4uZTllYmJjOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9XQVJGaWxlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvV0FSRmlsZUltcGwuamF2YQpAQCAtNjUsNiArNjUsNyBAQAogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLkxpdGVyYWxzLldBUl9GSUxFOwogCX0KQEAgLTE0OSw2ICsxNTAsNyBAQAogCQlyZXR1cm4gdGhpcy5nZXREZXBsb3ltZW50RGVzY3JpcHRvckdlbigpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JVcmkoKSB7CiAJCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkk7CiAJfQpAQCAtMTgzLDYgKzE4NSw3IEBACiAJICogMSkgV0FSIGRpcmVjdG9yeSArIC9XRUItSU5GL2NsYXNzZXMgMikgYWxsIEpBUiBmaWxlcyBjb250YWluZWQgaW4gW1dBUiBkaXJlY3RvcnkgKwogCSAqIC9XRUItSU5GL2xpYl0gMykgV0FSIGRpcmVjdG9yeQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXRMb2NhbFJ1bnRpbWVDbGFzc1BhdGgoKSB7CiAKIAkJU3RyaW5nIGFic29sdXRlUGF0aDsKQEAgLTIwNCw2ICsyMDcsNyBAQAogCQlyZXR1cm4gKFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdKSBlbnRyaWVzLnRvQXJyYXkobmV3IFJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBSdW50aW1lQ2xhc3NwYXRoRW50cnlbXSBnZXREZXBlbmRlbmN5Q2xhc3NQYXRoQXRUaGlzTGV2ZWwoKSB7CiAKIAkJU3RyaW5nIGFic29sdXRlUGF0aCA9IGludGVybmFsR2V0QmluYXJpZXNQYXRoKCk7CkBAIC0zMTMsNiArMzE3LDcgQEAKIAkJcmV0dXJuIGdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpIHsKIAkJcmV0dXJuIGRlcGxveW1lbnREZXNjcmlwdG9yICE9IG51bGw7CiAJfQpAQCAtMzIwLDYgKzMyNSw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5jb21tb25hcmNoaXZlLkZpbGUKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc1dBUkZpbGUoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTMyNyw2ICszMzMsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuY29tbW9uYXJjaGl2ZS5pbXBsLk1vZHVsZUZpbGVJbXBsCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IG1ha2VEZXBsb3ltZW50RGVzY3JpcHRvcihYTUxSZXNvdXJjZSByZXNvdXJjZSkgewogCQlXZWJBcHAgd2ViQXBwID0gKChXZWJhcHBsaWNhdGlvblBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSkuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCkuY3JlYXRlV2ViQXBwKCk7CiAJCXJlc291cmNlLnNldElEKHdlYkFwcCwgSjJFRUNvbnN0YW50cy5XRUJBUFBfSUQpOwpAQCAtMzc4LDYgKzM4NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKQEAgLTM5Miw2ICs0MDAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25hcmNoaXZlUGFja2FnZS5XQVJfRklMRV9fREVQTE9ZTUVOVF9ERVNDUklQVE9SOgpAQCAtNDA2LDYgKzQxNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vbmFyY2hpdmVQYWNrYWdlLldBUl9GSUxFX19ERVBMT1lNRU5UX0RFU0NSSVBUT1I6CkBAIC00MjAsNiArNDMwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uYXJjaGl2ZVBhY2thZ2UuV0FSX0ZJTEVfX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKQEAgLTQyOCw2ICs0MzksNyBAQAogCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIENsYXNzTG9hZGVyIGNyZWF0ZUR5bmFtaWNDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBwYXJlbnRDbCwgQ2xhc3NMb2FkZXIgZXh0cmFDbCkgewogCQlyZXR1cm4gbmV3IFdhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIodGhpcywgcGFyZW50Q2wsIGV4dHJhQ2wpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL2ltcGwvV2ViTW9kdWxlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9XZWJNb2R1bGVSZWZJbXBsLmphdmEKaW5kZXggMzY0MWNkYS4uYWI5OWZkNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9XZWJNb2R1bGVSZWZJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvaW1wbC9XZWJNb2R1bGVSZWZJbXBsLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5MaXRlcmFscy5XRUJfTU9EVUxFX1JFRjsKIAl9CkBAIC00OCw2ICs0OSw3IEBACiAJLyoKIAkgKiBAc2VlIE1vZHVsZVJlZiNpc1dlYigpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNXZWIoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9BcHBDbGllbnQxMkltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IGM1MjM2ZjIuLmY0MmNkYzkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0FwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogcHVibGljIGNsYXNzIEFwcENsaWVudDEySW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgewogCiAJcHVibGljIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCB7CisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKIAkJCXJldHVybiBhbkFyY2hpdmUuY29udGFpbnNGaWxlKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9VUkkpOwogCQl9CkBAIC0zNCw2ICszNSw3IEBACiAJCS8qKgogCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCiAJCSAqLworCQlAT3ZlcnJpZGUKIAkJcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpIHsKIAkJCXJldHVybiBuZXcgQXBwQ2xpZW50MTJJbXBvcnRTdHJhdGVneUltcGwoKTsKIAkJfQpAQCAtNDIsNiArNDQsNyBAQAogCQkJcmV0dXJuIGdldFhtbERETWVzc2FnZShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFwcGxpY2F0aW9uX0NsaWVudF9KYXJfRmlsLCBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJKTsgLy8gPSAiQXBwbGljYXRpb24gQ2xpZW50IEphciBGaWxlIgogCQl9CiAKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7CiAJCQlyZXR1cm4gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKIAkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQ29ubmVjdG9yRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvQ29ubmVjdG9yRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IDJlYjJlYjYuLjkzZTllZWEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0Nvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Db25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsLmphdmEKQEAgLTI5LDcgKzI5LDcgQEAKIC8qKgogICogSW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gc2F2ZSBhbiBhcmNoaXZlcyBjb250ZW50cyB0byBhIGRpcmVjdG9yeSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0KICAqLwotcHVibGljIGNsYXNzIENvbm5lY3RvckRpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwgZXh0ZW5kcyBTYXZlU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgU2F2ZVN0cmF0ZWd5IHsKK3B1YmxpYyBjbGFzcyBDb25uZWN0b3JEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgU2F2ZVN0cmF0ZWd5SW1wbCB7CiAJcHJvdGVjdGVkIFN0cmluZyBkaXJlY3RvcnlOYW1lOwogCXByb3RlY3RlZCBVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyOwogCS8qKiBJbmRpY2F0ZXMgd2hpY2ggdHlwZSBvZiBhcmNoaXZlcyBzaG91bGQgYmUgZXhwYW5kZWQgKi8KQEAgLTYzLDYgKzYzLDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWRTYXZlU3RyYXRlZ3koQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChzaG91bGRFeHBhbmQoYW5BcmNoaXZlKSkKIAkJCXJldHVybiBjcmVhdGVOZXN0ZWREaXJlY3RvcnlTdHJhdGVneShhbkFyY2hpdmUpOwpAQCAtOTgsNiArOTksNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtRm9yUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBnZXRVcmlDb252ZXJ0ZXIoKS5jcmVhdGVPdXRwdXRTdHJlYW0oYVJlc291cmNlLmdldFVSSSgpKTsKIAl9CkBAIC0xMjAsNiArMTIyLDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTE0NSw2ICsxNDgsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLlNhdmVTdHJhdGVneUltcGwKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzYXZlKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGUgYUZpbGUsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewogCQlTdHJpbmcgZW50cnlOYW1lID0gYUZpbGUuZ2V0VVJJKCk7CiAJCWlmIChhRmlsZS5pc0RpcmVjdG9yeUVudHJ5KCkpCkBAIC0xNTksNiArMTYzLDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHNhdmVNb2ZSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UgYVJlc291cmNlLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXN1cGVyLnNhdmVNb2ZSZXNvdXJjZShhUmVzb3VyY2UsIG9zKTsKIAkJb3MuY2xvc2UoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IDZlODY2ODYuLmI0ZmU3MjYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5QXJjaGl2ZUxvYWRTdHJhdGVneUltcGwuamF2YQpAQCAtMjksMTYgKzI5LDE5IEBACiAJCXN1cGVyKGFEaXJlY3RvcnlVcmkpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGFkZERpcmVjdG9yeShqYXZhLmlvLkZpbGUgYUZpbGUsIGphdmEudXRpbC5MaXN0IGFMaXN0KSB7CiAJCWFkZEZpbGVzKGFGaWxlLCBhTGlzdCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGphdmEuaW8uRmlsZSBnZXREaXJlY3RvcnlGb3JMaXN0KCkgewogCQlyZXR1cm4gbmV3IGphdmEuaW8uRmlsZShnZXREaXJlY3RvcnlVcmkoKSk7CiAJfQogCiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBMb29zZUFyY2hpdmUgZ2V0TG9vc2VBcmNoaXZlKCkgewogCQlpZiAobG9vc2VBcmNoaXZlID09IG51bGwgJiYgZ2V0Q29udGFpbmVyKCkuaXNFQVJGaWxlKCkpIHsKIAkJCVN0cmluZyBvc1N0cmluZyA9IEFyY2hpdmVVdGlsLmdldE9TVXJpKGdldENvbnRhaW5lcigpLmdldFVSSSgpKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwuamF2YQppbmRleCA4ODIzOTY4Li43MDQ5MGVlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCkBAIC05OSw2ICs5OSw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIHByaW1Db250YWlucyhqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewogCQlyZXR1cm4gbmV3IGphdmEuaW8uRmlsZShnZXRGaWxlTmFtZUZyb20odXJpKSkuZXhpc3RzKCk7CiAJfQpAQCAtMTA2LDYgKzEwNyw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCXJldHVybiBuZXcgamF2YS5pby5GaWxlKGdldERpcmVjdG9yeVVyaSgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKIAl9CkBAIC0xNTksNiArMTYxLDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGphdmEudXRpbC5MaXN0IGdldEZpbGVzKCkgewogCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCWphdmEuaW8uRmlsZSBkaXJlY3RvcnkgPSBnZXREaXJlY3RvcnlGb3JMaXN0KCk7CkBAIC0xNjYsNiArMTY5LDcgQEAKIAkJcmV0dXJuIGxpc3Q7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRGaWxlcyhTdHJpbmcgc3ViZm9sZGVyUGF0aCkgewogCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCWphdmEuaW8uRmlsZSBjb250YWluZXJEaXJlY3RvcnkgPSBnZXREaXJlY3RvcnlGb3JMaXN0KCk7CkBAIC0xNzcsNiArMTgxLDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGphdmEuaW8uSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oamF2YS5sYW5nLlN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oZ2V0RmlsZU5hbWVGcm9tKHVyaSkpOwogCX0KQEAgLTI0Niw2ICsyNTEsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQpAQCAtMjUzLDYgKzI1OSw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzVXNpbmcoamF2YS5pby5GaWxlIGFTeXN0ZW1GaWxlKSB7CiAJCWphdmEuaW8uRmlsZSBkaXIgPSBuZXcgamF2YS5pby5GaWxlKGdldERpcmVjdG9yeVVyaSgpKTsKIAkJcmV0dXJuIGRpci5lcXVhbHMoYVN5c3RlbUZpbGUpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRGlyZWN0b3J5U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IGI0MDRmNWQuLjVlODdmNDUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0RpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9EaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsLmphdmEKQEAgLTMxLDcgKzMxLDcgQEAKIC8qKgogICogSW1wbGVtZW50ZXIgdGhhdCBrbm93cyBob3cgdG8gc2F2ZSBhbiBhcmNoaXZlcyBjb250ZW50cyB0byBhIGRpcmVjdG9yeSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0KICAqLwotcHVibGljIGNsYXNzIERpcmVjdG9yeVNhdmVTdHJhdGVneUltcGwgZXh0ZW5kcyBTYXZlU3RyYXRlZ3lJbXBsIGltcGxlbWVudHMgU2F2ZVN0cmF0ZWd5IHsKK3B1YmxpYyBjbGFzcyBEaXJlY3RvcnlTYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgU2F2ZVN0cmF0ZWd5SW1wbCB7CiAJcHJvdGVjdGVkIFN0cmluZyBkaXJlY3RvcnlOYW1lOwogCXByb3RlY3RlZCBVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyOwogCS8qKiBJbmRpY2F0ZXMgd2hpY2ggdHlwZSBvZiBhcmNoaXZlcyBzaG91bGQgYmUgZXhwYW5kZWQgKi8KQEAgLTY1LDYgKzY1LDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5TYXZlU3RyYXRlZ3lJbXBsCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVOZXN0ZWRTYXZlU3RyYXRlZ3koQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChzaG91bGRFeHBhbmQoYW5BcmNoaXZlKSkKIAkJCXJldHVybiBjcmVhdGVOZXN0ZWREaXJlY3RvcnlTdHJhdGVneShhbkFyY2hpdmUpOwpAQCAtMTAwLDYgKzEwMSw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW1Gb3JSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldFVyaUNvbnZlcnRlcigpLmNyZWF0ZU91dHB1dFN0cmVhbShhUmVzb3VyY2UuZ2V0VVJJKCkpOwogCX0KQEAgLTEyMiw2ICsxMjQsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5TYXZlU3RyYXRlZ3kKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0RpcmVjdG9yeSgpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQpAQCAtMTQ5LDYgKzE1Miw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNhdmUob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZSBhRmlsZSwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7CiAJCVN0cmluZyBlbnRyeU5hbWUgPSBhRmlsZS5nZXRVUkkoKTsKIAkJaWYgKGFGaWxlLmlzRGlyZWN0b3J5RW50cnkoKSkKQEAgLTE2NCw2ICsxNjgsNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgc2F2ZU1vZlJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSBhUmVzb3VyY2UsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJc3VwZXIuc2F2ZU1vZlJlc291cmNlKGFSZXNvdXJjZSwgb3MpOwogCQlvcy5jbG9zZSgpOwpAQCAtMjM5LDYgKzI0NCw3IEBACiAKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJdGVyYXRlT3ZlcihBcmNoaXZlIGFuQXJjaGl2ZSkgewogCQlyZXR1cm4gc3VwZXIuc2hvdWxkSXRlcmF0ZU92ZXIoYW5BcmNoaXZlKSB8fCBzaG91bGRFeHBhbmQoYW5BcmNoaXZlKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FYXIxMkltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWFyMTJJbXBvcnRTdHJhdGVneUltcGwuamF2YQppbmRleCA0NDFkNTZjLi44MjlhMGU0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FYXIxMkltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VhcjEySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKQEAgLTI3LDEwICsyNywxMiBAQAogcHVibGljIGNsYXNzIEVhcjEySW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgewogCiAJcHVibGljIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCB7CisJCUBPdmVycmlkZQogCQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewogCQkJcmV0dXJuIGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZSgpOwogCQl9CiAKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSkgewogCQkJcmV0dXJuIGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpOwogCQl9CkBAIC0zOCw2ICs0MCw3IEBACiAJCS8qKgogCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yCiAJCSAqLworCQlAT3ZlcnJpZGUKIAkJcHVibGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LkltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpIHsKIAkJCXJldHVybiBuZXcgRWFyMTJJbXBvcnRTdHJhdGVneUltcGwoKTsKIAkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0VqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKaW5kZXggNWRhMjZjMS4uZWI2MjcyNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9FamJKYXIxMUltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiBwdWJsaWMgY2xhc3MgRWpiSmFyMTFJbXBvcnRTdHJhdGVneUltcGwgZXh0ZW5kcyBYbWxCYXNlZEltcG9ydFN0cmF0ZWd5SW1wbCB7CiAKIAlwdWJsaWMgc3RhdGljIGNsYXNzIERpc2NyaW1pbmF0b3IgZXh0ZW5kcyBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JJbXBsIHsKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSkgewogCQkJcmV0dXJuIGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJKTsKIAkJfQpAQCAtMzQsNiArMzUsNyBAQAogCQkvKioKIAkJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkFyY2hpdmVUeXBlRGlzY3JpbWluYXRvcgogCQkgKi8KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5JbXBvcnRTdHJhdGVneSBjcmVhdGVJbXBvcnRTdHJhdGVneShBcmNoaXZlIG9sZCwgQXJjaGl2ZSBuZXdBcmNoaXZlKSB7CiAJCQlyZXR1cm4gbmV3IEVqYkphcjExSW1wb3J0U3RyYXRlZ3lJbXBsKCk7CiAJCX0KQEAgLTQyLDYgKzQ0LDcgQEAKIAkJCXJldHVybiBnZXRYbWxERE1lc3NhZ2UoQ29tbW9uQXJjaGl2ZVJlc291cmNlSGFuZGxlci5FSkJfSmFyX0ZpbGUsIEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSSk7IC8vID0gIkVKQiBKYXIgRmlsZSIKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewogCQkJcmV0dXJuIGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCSmFyRmlsZSgpOwogCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Mb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9Mb2FkU3RyYXRlZ3lJbXBsLmphdmEKaW5kZXggNDZiMTlkZi4uMGQ3M2MxNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L0xvYWRTdHJhdGVneUltcGwuamF2YQpAQCAtMzEsNyArMzEsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLmpkay5KYXZhSkRLQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VjZUZhY3RvcnlTYXhSZWdpc3RyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5RG9tUmVnaXN0cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwpAQCAtNTEsNiArNTAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VBcmNoaXZlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQ29uZmlnUmVnaXN0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkV4dGVuZGVkRWNvcmVVdGlsOwogCiAvKioKQEAgLTE2Myw2ICsxNjMsNyBAQAogCQlyZXR1cm4gYUZpbGU7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKIAkJaWYoaXNPcGVuKXsKIAkJCWNsb3NlKCk7CkBAIC0yNTMsNiArMjU0LDcgQEAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24pCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7CiAJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7CiAJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQgOgpAQCAtMjYzLDggKzI2NSw2IEBACiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CiAJCQkJCXVwZGF0ZU1vZGlmaWNhdGlvblRyYWNraW5nKChSZXNvdXJjZSkgbGlzdC5nZXQoaSkpOwogCQkJCX0KLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwogCQl9CiAJfQogCkBAIC00NzgsNyArNDc4LDcgQEAKIAkJCXJldHVybiAoKEFyY2hpdmUpIGdldENvbnRhaW5lcigpKS5vcGVuTmVzdGVkQXJjaGl2ZSh1cmkpOwogCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7CiAJCQkvL0NhdWdodCBhbiBleGNlcHRpb24gdHJ5aW5nIHRvIG9wZW4gdGhlIG5lc3RlZCBhcmNoaXZlCi0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCXJldHVybiBudWxsOwogCQl9CiAKQEAgLTQ5MCw3ICs0OTAsNyBAQAogCQkJcmV0dXJuICgoQXJjaGl2ZSkgZ2V0Q29udGFpbmVyKCkpLm9wZW5OZXN0ZWRBcmNoaXZlKGxvb3NlKTsKIAkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewogCQkJLy9DYXVnaHQgYW4gZXhjZXB0aW9uIHRyeWluZyB0byBvcGVuIHRoZSBuZXN0ZWQgYXJjaGl2ZQotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJSjJFRUNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9OZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTmVzdGVkQXJjaGl2ZUxvYWRTdHJhdGVneUltcGwuamF2YQppbmRleCBkZWY1NWJjLi43NzZkYWJjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9OZXN0ZWRBcmNoaXZlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L05lc3RlZEFyY2hpdmVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKQEAgLTcyLDYgKzcyLDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gcHJpbUNvbnRhaW5zKFN0cmluZyB1cmkpIHsKIAkJaWYgKHVzaW5nSW5kZXgoKSkKIAkJCXJldHVybiBjb250YWluc1VzaW5nSW5kZXgodXJpKTsKQEAgLTEwNiw2ICsxMDcsNyBAQAogCS8qKgogCSAqIFVzZWQgaW50ZXJuYWxseTsgY2xpZW50cyBzaG91bGQgbm90IG5lZWQgdG8gY2FsbAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBGaWxlSXRlcmF0b3IgZ2V0RmlsZUl0ZXJhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKCgoQXJjaGl2ZSkgZ2V0Q29udGFpbmVyKCkpLmdldE9wdGlvbnMoKS5pc1JlYWRPbmx5KCkpCiAJCQlyZXR1cm4gbmV3IE5lc3RlZEFyY2hpdmVJdGVyYXRvcihnZXRDb250YWluZXIoKS5nZXRGaWxlcygpLCBnZXRaaXBJbnB1dFN0cmVhbSgpKTsKQEAgLTExNSw2ICsxMTcsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RmlsZXMoKSB7CiAJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoNTAwKTsKIAkJWmlwSW5wdXRTdHJlYW0gemlzID0gbnVsbDsKQEAgLTE0Nyw2ICsxNTAsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCWlmICh1c2luZ0luZGV4KCkpCiAJCQlyZXR1cm4gZ2V0SW5wdXRTdHJlYW1Vc2luZ0luZGV4KHVyaSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9OdWxsTG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvTnVsbExvYWRTdHJhdGVneUltcGwuamF2YQppbmRleCA1ZWY2MWMzLi40OTUzYWQ2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9OdWxsTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L051bGxMb2FkU3RyYXRlZ3lJbXBsLmphdmEKQEAgLTMyLDEwICszMiwxMiBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgdXJpKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltQ29udGFpbnMoU3RyaW5nIHVyaSkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtNDMsNiArNDUsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0RmlsZXMoKSB7CiAJCXJldHVybiBlbXB0eUxpc3Q7CiAJfQpAQCAtNTAsNiArNTMsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gewogCQl0aHJvdyBuZXcgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24odXJpKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9SYXJJbXBvcnRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JhckltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IDVhOGRjMTguLmQ0ZWM2N2IgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JhckltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JhckltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiBwdWJsaWMgY2xhc3MgUmFySW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgewogCiAJcHVibGljIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCB7CisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKIAkJCXJldHVybiBhbkFyY2hpdmUuY29udGFpbnNGaWxlKEoyRUVDb25zdGFudHMuUkFSX0REX1VSSSk7CiAJCX0KQEAgLTM1LDYgKzM2LDcgQEAKIAkJLyoqCiAJCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKIAkJICovCisJCUBPdmVycmlkZQogCQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewogCQkJcmV0dXJuIG5ldyBSYXJJbXBvcnRTdHJhdGVneUltcGwoKTsKIAkJfQpAQCAtNDMsNiArNDUsNyBAQAogCQkJcmV0dXJuIGdldFhtbERETWVzc2FnZShDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLlJBUl9GaWxlLCBKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkpOyAvLyA9ICJSQVIgRmlsZSIKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewogCQkJcmV0dXJuIGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlUkFSRmlsZSgpOwogCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9SZWFkT25seURpcmVjdG9yeUxvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IGNmMDhlZGIuLjhlNjRiYTkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1JlYWRPbmx5RGlyZWN0b3J5TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiAJLyoqCiAJICogYWRkRGlyZWN0b3J5IG1ldGhvZCBjb21tZW50LgogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGFkZERpcmVjdG9yeShqYXZhLmlvLkZpbGUgYUZpbGUsIGphdmEudXRpbC5MaXN0IGFMaXN0KSB7CiAJCVJlYWRPbmx5RGlyZWN0b3J5IGRpciA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnkoKTsKIAkJZGlyLnNldExhc3RNb2RpZmllZChhRmlsZS5sYXN0TW9kaWZpZWQoKSk7CkBAIC00NSw2ICs0Niw3IEBACiAKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhqYXZhLmxhbmcuU3RyaW5nIHVyaSkgewogCQlyZXR1cm4gc3VwZXIuY29udGFpbnModXJpKSAmJiAoZ2V0U3ViZGlyZWN0b3J5KCkgPT0gbnVsbCB8fCBzdWJkaXJlY3RvcnlDb250YWlucyh1cmkpKTsKIAl9CkBAIC01Miw2ICs1NCw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHRocm93cyBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCWphdmEuaW8uRmlsZSBzdWJkaXIgPSBnZXRTdWJkaXJlY3RvcnkoKTsKIAkJaWYgKHN1YmRpciA9PSBudWxsKSB7CkBAIC02Myw2ICs2Niw3IEBACiAJLyoqCiAJICogZ2V0RGlyZWN0b3J5Rm9yTGlzdCBtZXRob2QgY29tbWVudC4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgamF2YS5pby5GaWxlIGdldERpcmVjdG9yeUZvckxpc3QoKSB7CiAJCWlmIChnZXRTdWJkaXJlY3RvcnkoKSAhPSBudWxsKQogCQkJcmV0dXJuIGdldFN1YmRpcmVjdG9yeSgpOwpAQCAtODIsNiArODYsNyBAQAogCSAqIEFsd2F5cyByZXR1cm4gZmFsc2UsIGJlY2F1c2Ugd2Ugd2FudCB0byB0cmVhdCB0aGUgZW50cmllcyBpbiBhIGZpbGUgc3lzdGVtIGRpcmVjdG9yeSBhcyBiYXNpYwogCSAqIGZpbGVzCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gaXNBcmNoaXZlKFN0cmluZyB1cmkpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1RlbXBaaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKaW5kZXggNGZmNzJiYS4uMjk4Y2M4NSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvVGVtcFppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKQEAgLTQ2LDYgKzQ2LDcgQEAKIAkJc3VwZXIoZmlsZSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgY2xvc2UoKSB7CiAJCXN1cGVyLmNsb3NlKCk7CiAJCUZpbGUgZmlsZSA9IGdldEZpbGUoKTsKQEAgLTU2LDYgKzU3LDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKIAkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLkFic29sdXRlX3BhdGhfdW5rbm93bl9FWENfKTsgLy8gPSAiQWJzb2x1dGUgcGF0aCB1bmtub3duIgogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1dhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9XYXIyMkltcG9ydFN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IGY0NWQ2NWQuLmEwYWMxNGEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1dhcjIySW1wb3J0U3RyYXRlZ3lJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvV2FyMjJJbXBvcnRTdHJhdGVneUltcGwuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogcHVibGljIGNsYXNzIFdhcjIySW1wb3J0U3RyYXRlZ3lJbXBsIGV4dGVuZHMgWG1sQmFzZWRJbXBvcnRTdHJhdGVneUltcGwgewogCiAJcHVibGljIHN0YXRpYyBjbGFzcyBEaXNjcmltaW5hdG9yIGV4dGVuZHMgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9ySW1wbCB7CisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBjYW5JbXBvcnQoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKIAkJCXJldHVybiBhbkFyY2hpdmUuY29udGFpbnNGaWxlKEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSk7CiAJCX0KQEAgLTM0LDYgKzM1LDcgQEAKIAkJLyoqCiAJCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5BcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IKIAkJICovCisJCUBPdmVycmlkZQogCQlwdWJsaWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuSW1wb3J0U3RyYXRlZ3kgY3JlYXRlSW1wb3J0U3RyYXRlZ3koQXJjaGl2ZSBvbGQsIEFyY2hpdmUgbmV3QXJjaGl2ZSkgewogCQkJcmV0dXJuIG5ldyBXYXIyMkltcG9ydFN0cmF0ZWd5SW1wbCgpOwogCQl9CkBAIC00Miw2ICs0NCw3IEBACiAJCQlyZXR1cm4gZ2V0WG1sRERNZXNzYWdlKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuV0FSX0ZpbGUsIEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSk7IC8vID0gIldBUiBGaWxlIgogCQl9CiAKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7CiAJCQlyZXR1cm4gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVXQVJGaWxlKCk7CiAJCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1ppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9aaXBGaWxlTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IDdjNjAyODkuLmNkYWM1ZDYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1ppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWmlwRmlsZUxvYWRTdHJhdGVneUltcGwuamF2YQpAQCAtNTAsNiArNTAsNyBAQAogCQlzZXRaaXBGaWxlKG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlVXRpbC5uZXdaaXBGaWxlKGZpbGUpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkJc3VwZXIuY2xvc2UoKTsKIAkJdHJ5IHsKQEAgLTYyLDYgKzYzLDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuaW1wbC5Mb2FkU3RyYXRlZ3lJbXBsCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gcHJpbUNvbnRhaW5zKGphdmEubGFuZy5TdHJpbmcgdXJpKSB7CiAJCXJldHVybiBnZXRaaXBGaWxlKCkuZ2V0RW50cnkodXJpKSAhPSBudWxsOwogCX0KQEAgLTY5LDYgKzcxLDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuTG9hZFN0cmF0ZWd5CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKIAl9CkBAIC04NSw2ICs4OCw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuTG9hZFN0cmF0ZWd5SW1wbAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRGaWxlcygpIHsKIAkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwogCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gZ2V0WmlwRmlsZSgpLmVudHJpZXMoKTsKQEAgLTExMSw2ICsxMTUsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgamF2YS5pby5JbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShqYXZhLmxhbmcuU3RyaW5nIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogCQl0cnkgewogCQkJWmlwRW50cnkgZW50cnkgPSBnZXRaaXBGaWxlKCkuZ2V0RW50cnkodXJpKTsKQEAgLTEzNSw2ICsxNDAsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5Mb2FkU3RyYXRlZ3kKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc1VzaW5nKGphdmEuaW8uRmlsZSBhU3lzdGVtRmlsZSkgewogCQlyZXR1cm4gZ2V0RmlsZSgpICE9IG51bGwgJiYgZ2V0RmlsZSgpLmVxdWFscyhhU3lzdGVtRmlsZSk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvc3RyYXRlZ3kvWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IDlmZWUwYzguLjEyYzkyZmYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3N0cmF0ZWd5L1ppcFN0cmVhbVNhdmVTdHJhdGVneUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC9zdHJhdGVneS9aaXBTdHJlYW1TYXZlU3RyYXRlZ3lJbXBsLmphdmEKQEAgLTM0LDcgKzM0LDcgQEAKICAqIHJlc291cmNlcywgd2lsbCBiZSBvdXRwdXQgdG8gYSBaaXBPdXRwdXRTdHJlYW0uIFRoZSBvdXRwdXQgc3RyZWFtIHNob3VsZCBiZSBwYXNzZWQgaW4gYnkgdGhlCiAgKiBjbGllbnQuCiAgKi8KLXB1YmxpYyBjbGFzcyBaaXBTdHJlYW1TYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgU2F2ZVN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIFNhdmVTdHJhdGVneSB7CitwdWJsaWMgY2xhc3MgWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbCBleHRlbmRzIFNhdmVTdHJhdGVneUltcGwgewogCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb25TdHJlYW07CiAJLyoqIFVzZWQgaW50ZXJuYWxseSAqLwogCXByb3RlY3RlZCBaaXBPdXRwdXRTdHJlYW0gemlwT3V0cHV0U3RyZWFtOwpAQCAtNDcsMTQgKzQ3LDE3IEBACiAJCXNldFppcE91dHB1dFN0cmVhbShuZXcgWmlwT3V0cHV0U3RyZWFtKG91dCkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZ2V0RGVzdGluYXRpb25TdHJlYW0oKS5jbG9zZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlTmVzdGVkU2F2ZVN0cmF0ZWd5KEFyY2hpdmUgYW5BcmNoaXZlKSB7CiAJCXJldHVybiBuZXcgWmlwU3RyZWFtU2F2ZVN0cmF0ZWd5SW1wbChnZXRaaXBPdXRwdXRTdHJlYW0oKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkuZmluaXNoKCk7CiAJCS8vSWYgdGhpcyBpcyBub3QgbmVzdGVkLCBjbG9zZSB0aGUgc3RyZWFtIHRvIGZyZWUgdXAgdGhlIHJlc291cmNlCkBAIC03Myw2ICs3Niw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmltcGwuU2F2ZVN0cmF0ZWd5SW1wbAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW1Gb3JSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldFppcE91dHB1dFN0cmVhbSgpOwogCX0KQEAgLTgwLDYgKzg0LDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuU2F2ZVN0cmF0ZWd5I3NhdmVNb2ZSZXNvdXJjZShSZXNvdXJjZSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzYXZlTW9mUmVzb3VyY2UoUmVzb3VyY2UgYVJlc291cmNlLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlSZXZpc2l0LnJldmlzaXQoKTsKIAkJVVJJIHVyaSA9IGFSZXNvdXJjZS5nZXRVUkkoKTsKQEAgLTExNCw2ICsxMTksNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2F2ZShBcmNoaXZlIGFuQXJjaGl2ZSkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCVppcEVudHJ5IGVudHJ5ID0gbmV3IFppcEVudHJ5KGFuQXJjaGl2ZS5nZXRVUkkoKSk7CkBAIC0xMjUsNiArMTMxLDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNhdmUoRmlsZSBhRmlsZSwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlTdHJpbmcgZW50cnlOYW1lID0gYUZpbGUuZ2V0VVJJKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0FyY2hpdmVGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0FyY2hpdmVGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKaW5kZXggZmYxNDFiOC4uOTM3ZWUzOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9BcmNoaXZlRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQXJjaGl2ZUZpbGVEeW5hbWljQ2xhc3NMb2FkZXIuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47CiAKIAogLyoqCkBAIC0zOCw3ICszOSw3IEBACiAJcHJvdGVjdGVkIEFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7CiAJcHJvdGVjdGVkIENsYXNzTG9hZGVyIGV4dHJhQ2xhc3NMb2FkZXI7CiAJcHJvdGVjdGVkIGJvb2xlYW4gaW5FQVJGaWxlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUFJPVE9DT0wgPSAiYXJjaGl2ZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QUk9UT0NPTCA9ICJhcmNoaXZlIjsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgQXJjaGl2ZVVSTFN0cmVhbUhhbmRsZXIgaGFuZGxlcjsKICAgICAKIAlwcm90ZWN0ZWQgUHJvdGVjdGlvbkRvbWFpbiBwcm90ZWN0aW9uRG9tYWluOwpAQCAtNzMsNiArNzQsNyBAQAogICAgICAqIEBzZWUgQ2xhc3NMb2FkZXIjZGVmaW5lQ2xhc3MoU3RyaW5nLCBieXRlW10sIGludCkKICAgICAgKiBAc2VlIENsYXNzTG9hZGVyI2RlZmluZUNsYXNzKFN0cmluZywgYnl0ZVtdLCBpbnQsIFByb3RlY3Rpb25Eb21haW4pCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewogCiAJCUNsYXNzIHJlc3VsdDsKQEAgLTE1Miw2ICsxNTQsNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHN5bmNocm9uaXplZCBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVzb2x2ZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewogCQl0cnkgewogCQkJcmV0dXJuIHN1cGVyLmxvYWRDbGFzcyhuYW1lLCByZXNvbHZlKTsKQEAgLTI1Nyw2ICsyNjAsNyBAQAogCQlleHRyYUNsYXNzTG9hZGVyID0gbmV3RXh0cmFDbGFzc0xvYWRlcjsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgbmFtZSkgewogCQl0cnkgewogCQkJRmlsZSBmaWxlID0gZ2V0RmlsZShuYW1lKTsKQEAgLTI4NywxMiArMjkxLDEzIEBACiAJCXJldHVybiBmaWxlOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBVUkwgZmluZFJlc291cmNlKFN0cmluZyBuYW1lKSB7CiAJCWlmIChnZXRGaWxlKG5hbWUpICE9IG51bGwpIHsKIAkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwobnVsbCwgVVJMX1BST1RPQ09MICsgIjovLyIgKyBuYW1lLCBoYW5kbGVyKTsKKwkJCQlyZXR1cm4gbmV3IFVSTChudWxsLCBVUkxfUFJPVE9DT0wgKyAiOi8vIiArIG5hbWUsIGhhbmRsZXIpOyAvLyROT04tTkxTLTEkCiAJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJSjJFRUNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAJCQl9CiAJCX0KQEAgLTMwMyw2ICszMDgsNyBAQAogCQlwdWJsaWMgQXJjaGl2ZVVSTFN0cmVhbUhhbmRsZXIoKSB7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHJvdGVjdGVkIFVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBuZXcgQXJjaGl2ZVVSTENvbm5lY3Rpb24odXJsKTsKIAkJfQpAQCAtMzE2LDkgKzMyMiwxMSBAQAogCQkJcmVzb3VyY2VOYW1lID0gdXJsLnRvU3RyaW5nKCkuc3Vic3RyaW5nKFVSTF9QUk9UT0NPTC5sZW5ndGgoKSArIDMpOwogCQl9CiAKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZU5hbWUpOwogCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0FyY2hpdmVVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0FyY2hpdmVVdGlsLmphdmEKaW5kZXggNDUwNTE2NS4uOWFmM2I2OCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9BcmNoaXZlVXRpbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQXJjaGl2ZVV0aWwuamF2YQpAQCAtMTgsOSArMTgsNyBAQAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKQEAgLTM0LDYgKzMyLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSU1hcHBpbmdSZWdpc3RyeUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVVSTDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5NYW5pZmVzdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwpAQCAtNDU1LDMzICs0NTQsMjAgQEAKIAkJcmV0dXJuIHRlbXBEaXJlY3RvcnlOYW1lOwogCX0KIAorCQogCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VG9rZW5zKFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBnZXRUb2tlbnMoYVN0cmluZywgbnVsbCk7CisJCXJldHVybiBNYW5pZmVzdFV0aWxpdGllcy5nZXRUb2tlbnMoYVN0cmluZywgbnVsbCk7CiAJfQogCiAJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRUb2tlbnMoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIpIHsKLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gKGRlbGltaXRlciA9PSBudWxsKSA/IG5ldyBTdHJpbmdUb2tlbml6ZXIoYVN0cmluZykgOiBuZXcgU3RyaW5nVG9rZW5pemVyKGFTdHJpbmcsIGRlbGltaXRlcik7Ci0JCWludCBzaXplID0gdG9rLmNvdW50VG9rZW5zKCk7Ci0JCVN0cmluZ1tdIHRva2VucyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAmJiB0b2suaGFzTW9yZVRva2VucygpOyBpKyspIHsKLQkJCXRva2Vuc1tpXSA9IHRvay5uZXh0VG9rZW4oKTsKLQkJfQotCQlyZXR1cm4gdG9rZW5zOworCQlyZXR1cm4gTWFuaWZlc3RVdGlsaXRpZXMuZ2V0VG9rZW5zKGFTdHJpbmcsIGRlbGltaXRlcik7CiAJfQogCiAJLyoqCiAJICogZ2V0VmFsdWVJZ25vcmVLZXlDYXNlIG1ldGhvZCBjb21tZW50LgogCSAqLwogCXB1YmxpYyBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZUlnbm9yZUtleUNhc2UoamF2YS5sYW5nLlN0cmluZyBrZXksIGphdmEudXRpbC5qYXIuQXR0cmlidXRlcyBhdHRyKSB7Ci0JCUl0ZXJhdG9yIGtleXNBbmRWYWx1ZXMgPSBhdHRyLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGtleXNBbmRWYWx1ZXMuaGFzTmV4dCgpKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBrZXlzQW5kVmFsdWVzLm5leHQoKTsKLQkJCVN0cmluZyBlbnRyeUtleSA9IGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCk7Ci0JCQlpZiAoZW50cnlLZXkuZXF1YWxzSWdub3JlQ2FzZShrZXkpKQotCQkJCXJldHVybiBlbnRyeS5nZXRWYWx1ZSgpID09IG51bGwgPyBudWxsIDogZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOworCQlyZXR1cm4gTWFuaWZlc3RVdGlsaXRpZXMuZ2V0VmFsdWVJZ25vcmVLZXlDYXNlKGtleSwgYXR0cik7CiAJfQogCiAJcHVibGljIHN0YXRpYyB2b2lkIGluZm9ybShTdHJpbmcgbWVzc2FnZSkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25hcmNoaXZlQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uYXJjaGl2ZUFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggNzM2OGNlYS4uMTY2Yjg4OSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25hcmNoaXZlQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vbmFyY2hpdmVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC00NCw2ICs0NCw3IEBACiAJCX0KIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CiAJCWlmICh0eXBlID09IG1vZGVsUGFja2FnZSkgewogCQkJcmV0dXJuIHRydWU7CkBAIC01NSw0NyArNTYsNTggQEAKIAl9CiAKIAlwcm90ZWN0ZWQgQ29tbW9uYXJjaGl2ZVN3aXRjaCBzdyA9IG5ldyBDb21tb25hcmNoaXZlU3dpdGNoKCkgeworCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyKENvbnRhaW5lciBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVDb250YWluZXJBZGFwdGVyKCk7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlV0FSRmlsZShXQVJGaWxlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZVdBUkZpbGVBZGFwdGVyKCk7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlTW9kdWxlRmlsZShNb2R1bGVGaWxlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZUZpbGVBZGFwdGVyKCk7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlRUFSRmlsZShFQVJGaWxlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUVBUkZpbGVBZGFwdGVyKCk7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25DbGllbnRGaWxlKEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVBZGFwdGVyKCk7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlRUpCSmFyRmlsZShFSkJKYXJGaWxlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUVKQkphckZpbGVBZGFwdGVyKCk7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlUkFSRmlsZShSQVJGaWxlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZVJBUkZpbGVBZGFwdGVyKCk7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlQXJjaGl2ZShBcmNoaXZlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUFyY2hpdmVBZGFwdGVyKCk7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlRmlsZShGaWxlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUZpbGVBZGFwdGVyKCk7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlUmVhZE9ubHlEaXJlY3RvcnkoUmVhZE9ubHlEaXJlY3Rvcnkgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnlBZGFwdGVyKCk7CiAJCX0KIAl9OwogCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKIAkJcmV0dXJuIChBZGFwdGVyKSBzdy5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKIAl9CkBAIC0yNDIsNTQgKzI1NCw3MSBAQAogCSAqLwogCXByb3RlY3RlZCBDb21tb25hcmNoaXZlU3dpdGNoIG1vZGVsU3dpdGNoID0KIAkJbmV3IENvbW1vbmFyY2hpdmVTd2l0Y2goKSB7CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUZpbGUoRmlsZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRmlsZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlQXJjaGl2ZShBcmNoaXZlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVBcmNoaXZlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJKYXJGaWxlKEVKQkphckZpbGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVKQkphckZpbGVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVdBUkZpbGUoV0FSRmlsZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlV0FSRmlsZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRUFSRmlsZShFQVJGaWxlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFQVJGaWxlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudEZpbGUoQXBwbGljYXRpb25DbGllbnRGaWxlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZUZpbGUoTW9kdWxlRmlsZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTW9kdWxlRmlsZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyKENvbnRhaW5lciBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQ29udGFpbmVyQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VSZWFkT25seURpcmVjdG9yeShSZWFkT25seURpcmVjdG9yeSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUmVhZE9ubHlEaXJlY3RvcnlBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVJBUkZpbGUoUkFSRmlsZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUkFSRmlsZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlTW9kdWxlUmVmKE1vZHVsZVJlZiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTW9kdWxlUmVmQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJNb2R1bGVSZWYoRUpCTW9kdWxlUmVmIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFSkJNb2R1bGVSZWZBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYk1vZHVsZVJlZihXZWJNb2R1bGVSZWYgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZVJlZkFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlQ2xpZW50TW9kdWxlUmVmKENsaWVudE1vZHVsZVJlZiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQ2xpZW50TW9kdWxlUmVmQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3JNb2R1bGVSZWYoQ29ubmVjdG9yTW9kdWxlUmVmIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVDb25uZWN0b3JNb2R1bGVSZWZBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwogCQkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9Db21tb25hcmNoaXZlU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vbmFyY2hpdmVTd2l0Y2guamF2YQppbmRleCBkYzdmYjE2Li43Njg5YzBkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vbmFyY2hpdmVTd2l0Y2guamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vbmFyY2hpdmVTd2l0Y2guamF2YQpAQCAtMjc4LDEzICsyNzgsMTEgQEAKIAkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7CiAJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKIAkJfQotCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCXJldHVybgotCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/Ci0JCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9CisJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKKwkJcmV0dXJuCisJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPworCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKKwkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0RlbGV0ZU9uRXhpdFV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRGVsZXRlT25FeGl0VXRpbGl0eS5qYXZhCmluZGV4IGQxYWQ1ZTEuLjkyYzBkY2EgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRGVsZXRlT25FeGl0VXRpbGl0eS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRGVsZXRlT25FeGl0VXRpbGl0eS5qYXZhCkBAIC0xNSw5ICsxNSw2IEBACiAKIC8qKgogICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwdWJsaWMgY2xhc3MgRGVsZXRlT25FeGl0VXRpbGl0eSB7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRmlsZUR1cHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvRmlsZUR1cHMuamF2YQppbmRleCA4MWU2YzhmLi42ODhiYWRmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0ZpbGVEdXBzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9GaWxlRHVwcy5qYXZhCkBAIC0yMyw2ICsyMyw4IEBACiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKKwogaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwogCiAvKioKQEAgLTE0NSw3ICsxNDcsNyBAQAogCiAJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxyXG5TZWFyY2hlZCAiICsgc0pBUnMgKyAiIGphcnMsIGZvdW5kICIgKyBzRHVwcyArICIgZHVwcyBpbiAiICsgc0ZpbGVzICsgIiBmaWxlcy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAogCQl9IGNhdGNoIChFeGNlcHRpb24geCkgewotCQkJeC5wcmludFN0YWNrVHJhY2UoKTsKKwkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKHgpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0oyRUVGaWxlVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9KMkVFRmlsZVV0aWwuamF2YQppbmRleCAwMTM1YTZjLi45NWU5ODNmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL0oyRUVGaWxlVXRpbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvSjJFRUZpbGVVdGlsLmphdmEKQEAgLTI5NCwxMCArMjk0LDEyIEBACiAgICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRDsKICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVCkpIHsKICAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNF9URVhUKSkgeyAvL0VKQjMKKyAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVCkpIHsKICAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzVfMF9URVhUKSkgeyAgIC8vRUpCMwotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRUpCMworICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzVfMF9URVhUKSkgeworICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKKyAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl82XzBfVEVYVCkpIHsKKyAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChpc0VKQkphckZpbGUoZmlsZVVSSSkpIHsKICAgICAgICAgICAgaWYgKG51bGwgPT0gdmVyc2lvbkF0dHIpIHsKQEAgLTMwNiwxMCArMzA4LDEyIEBACiAgICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOwogICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMF9URVhUKSkgewogICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzFfVEVYVCkpIHsgLy9FSkIzCisgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8xX1RFWFQpKSB7CiAgICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOwotICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMF9URVhUKSkgeyAvL0VKQjMKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8zXzBfSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9FSkIzCisgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wX1RFWFQpKSB7CisgICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18wX0lEOyAKKyAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzFfVEVYVCkpIHsgCisgICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18xX0lEOwogICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoZmlsZVVSSSkpIHsKICAgICAgICAgICAgaWYgKG51bGwgPT0gdmVyc2lvbkF0dHIpIHsKQEAgLTMyMCw4ICszMjQsMTAgQEAKICAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwogICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNF9URVhUKSkgewogICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQpKSB7ICAgLy9FSkIzCi0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9FSkIzCisgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQpKSB7CisgICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOworICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzZfMF9URVhUKSkgeworICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKICAgICAgICAgICAgfSAKICAgICAgICAgfSBlbHNlIGlmIChpc1dBUkZpbGUoZmlsZVVSSSkpIHsKICAgICAgICAgICAgaWYgKG51bGwgPT0gdmVyc2lvbkF0dHIpIHsKQEAgLTMzMiwxNCArMzM4LDIwIEBACiAgICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEOwogICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNF9URVhUKSkgewogICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRDsKLSAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzVfVEVYVCkpIHsgLy9FSkIzCi0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl81X0lEOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRUpCMworICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNV9URVhUKSkgeworICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNV9JRDsKKyAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzBfVEVYVCkpIHsKKyAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8zXzBfSUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChpc1JBUkZpbGUoZmlsZVVSSSkpIHsKICAgICAgICAgICAgaWYgKG51bGwgPT0gdmVyc2lvbkF0dHIpIHsKICAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbkF0dHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8wX1RFWFQpKSB7CiAgICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEOworICAgICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb25BdHRyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNV9URVhUKSkgeworICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDsKKyAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uQXR0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzZfVEVYVCkpIHsKKyAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzZfSUQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOwogICAgICAgICAgICB9CkBAIC0zNTEsMzEgKzM2Myw0MSBAQAogCXByaXZhdGUgc3RhdGljIGludCBsb29rdXBWZXJzaW9uKFN0cmluZyBmaWxlVVJJLCBTdHJpbmcgc2NoZW1hTmFtZSkgewogICAgICAgICBpbnQgdmVyc2lvbiA9IC0xOwogICAgICAgICBpZiAoaXNFQVJGaWxlKGZpbGVVUkkpKSB7Ci0gICAgICAgICAgIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NDSEVNQV81KSkgeyAgICAgICAgICAvL0VKQjMKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy9FSkIzCisgICAgICAgICAgIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NDSEVNQV82KSkgeworICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKKyAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NDSEVNQV81KSkgeworICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKICAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1NDSEVNQV8xXzQpKSB7CiAgICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGlzRUpCSmFyRmlsZShmaWxlVVJJKSkgewotICAgICAgICAgICBpZiAoKHNjaGVtYU5hbWUuaW5kZXhPZihKMkVFQ29uc3RhbnRzLkVKQkpBUl9TQ0hFTUFfM18wX05TKSkgIT0gLTEpIHsgLy9FSkIzCi0gICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18wX0lEOyAgICAgICAgICAgICAgICAgICAgICAgICAvL0VKQjMKKyAgICAgICAgICAgaWYgKChzY2hlbWFOYW1lLmluZGV4T2YoSjJFRUNvbnN0YW50cy5FSkJKQVJfU0NIRU1BXzNfMV9OUykpICE9IC0xKSB7CisgICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18xX0lEOyAgIAorICAgICAgICAgICB9IGVsc2UgaWYgKChzY2hlbWFOYW1lLmluZGV4T2YoSjJFRUNvbnN0YW50cy5FSkJKQVJfU0NIRU1BXzNfMF9OUykpICE9IC0xKSB7CisgICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18wX0lEOwogICAgICAgICAgICB9IGVsc2UgaWYgKChzY2hlbWFOYW1lLmluZGV4T2YoSjJFRUNvbnN0YW50cy5FSkJKQVJfU0NIRU1BXzJfMV9OUykpICE9IC0xKSB7CiAgICAgICAgICAgICAgIHZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEOwogICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoZmlsZVVSSSkpIHsKLSAgICAgICAgICAgaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TQ0hFTUFfNSkpIHsgICAgICAgICAgIC8vRUpCMwotICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsgICAgICAgICAgICAgICAgICAgICAgICAvL0VKQjMKKyAgICAgICAgICAgaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TQ0hFTUFfNikpIHsKKyAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ7CisgICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1NDSEVNQV81KSkgeworICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKICAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU0NIRU1BXzFfNCkpIHsKICAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwogICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoaXNXQVJGaWxlKGZpbGVVUkkpKSB7Ci0gICAgICAgICAgIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQkFQUF9TQ0hFTUFfMl81KSkgeyAgICAgICAgICAgICAvL0VKQjMKLSAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzVfSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vRUpCMworICAgICAgICAgICBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU0NIRU1BXzNfMCkpIHsKKyAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8zXzBfSUQ7CisgICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU0NIRU1BXzJfNSkpIHsKKyAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzVfSUQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hTmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJBUFBfU0NIRU1BXzJfNCkpIHsKICAgICAgICAgICAgICAgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChpc1JBUkZpbGUoZmlsZVVSSSkpIHsKLSAgICAgICAgICAgaWYgKHNjaGVtYU5hbWUuZXF1YWxzKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NDSEVNQV8xXzUpKSB7CisgICAgICAgICAgIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TQ0hFTUFfMV82KSkgeworICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNl9JRDsKKyAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFOYW1lLmVxdWFscyhKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TQ0hFTUFfMV81KSkgewogICAgICAgICAgICAgICB2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRDsKICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL09iamVjdElucHV0U3RyZWFtQ3VzdG9tUmVzb2x2ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvT2JqZWN0SW5wdXRTdHJlYW1DdXN0b21SZXNvbHZlci5qYXZhCmluZGV4IDc2Y2VmODMuLjA3ZjU5ZTUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvT2JqZWN0SW5wdXRTdHJlYW1DdXN0b21SZXNvbHZlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvT2JqZWN0SW5wdXRTdHJlYW1DdXN0b21SZXNvbHZlci5qYXZhCkBAIC02Nyw2ICs2Nyw3IEBACiAJICogVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgcmVzb2x2ZUNsYXNzKCkgbWV0aG9kIHRvIHVzZSBhIGN1c3RvbSBjbGFzcyBsb2FkZXIuCiAJICovCiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQ2xhc3MgcmVzb2x2ZUNsYXNzKE9iamVjdFN0cmVhbUNsYXNzIGNsYXNzRGVzYykgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKIAogCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NEZXNjLmdldE5hbWUoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvUmFyRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9SYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKaW5kZXggYjE1OTZlYS4uYzRlNjQ0NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9SYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvaW50ZXJuYWwvdXRpbC9SYXJGaWxlRHluYW1pY0NsYXNzTG9hZGVyLmphdmEKQEAgLTMzLDYgKzMzLDcgQEAKIAkJc3VwZXIoYW5BcmNoaXZlLCBwYXJlbnRDbCwgZXh0cmFDbCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEZpbGUgZ2V0RmlsZShTdHJpbmcgbmFtZSkgewogCQlMaXN0IGNoaWxkcmVuID0gZ2V0UmFyRmlsZSgpLmdldEFyY2hpdmVGaWxlcygpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9pbnRlcm5hbC91dGlsL1dhckZpbGVEeW5hbWljQ2xhc3NMb2FkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvV2FyRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhCmluZGV4IGY0ODdiNWYuLmNmZDQwNjQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvV2FyRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2ludGVybmFsL3V0aWwvV2FyRmlsZUR5bmFtaWNDbGFzc0xvYWRlci5qYXZhCkBAIC00NSw2ICs0NSw3IEBACiAJCXRoaXMoYW5BcmNoaXZlLCBwYXJlbnRDbCwgZXh0cmFDbCwgbnVsbCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEZpbGUgZ2V0RmlsZShTdHJpbmcgbmFtZSkgewogCQkvL3NlYXJjaCBjbGFzc2VzIGRpcmVjdG9yeSBmaXJzdCwgdGhlbiB3YXIsIHRoZW4gbmVzdGVkIGFyY2hpdmVzLgogCQkvL3NlYXJjaCBjbGFzc2VzIGRpcmVjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvTG9vc2Vjb25maWdQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZWNvbmZpZ1BhY2thZ2UuamF2YQppbmRleCAxZGJlNjgxLi5iNDM1NmY0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZWNvbmZpZ1BhY2thZ2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9Mb29zZWNvbmZpZ1BhY2thZ2UuamF2YQpAQCAtMzgsNyArMzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlTdHJpbmcgZU5BTUUgPSAibG9vc2Vjb25maWciOworCVN0cmluZyBlTkFNRSA9ICJsb29zZWNvbmZpZyI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgogCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCkBAIC00Niw3ICs0Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImNvbW1vbmFyY2hpdmUubG9vc2Vjb25maWcueG1pIjsKKwlTdHJpbmcgZU5TX1VSSSA9ICJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgogCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgpAQCAtNTQsNyArNTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZyI7CisJU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWciOyAvLyROT04tTkxTLTEkCiAKIAkvKioKIAkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFwcGxpY2F0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFwcGxpY2F0aW9uSW1wbC5qYXZhCmluZGV4IGFjOGU1NjIuLmVkMjViOWEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VBcHBsaWNhdGlvbkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQXBwbGljYXRpb25JbXBsLmphdmEKQEAgLTQ2LDYgKzQ2LDcgQEAKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuTGl0ZXJhbHMuTE9PU0VfQVBQTElDQVRJT047CiAJfQpAQCAtNjUsNiArNjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVM6CkBAIC03OCw2ICs4MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUzoKQEAgLTkxLDYgKzk0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTOgpAQCAtMTA0LDYgKzEwOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUFBMSUNBVElPTl9fTE9PU0VfQVJDSElWRVM6CkBAIC0xMTksNiArMTI0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OX19MT09TRV9BUkNISVZFUzoKQEAgLTEzMyw2ICsxMzksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVBQTElDQVRJT05fX0xPT1NFX0FSQ0hJVkVTOgpAQCAtMTQxLDYgKzE0OCw3IEBACiAJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0VBUigpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUFyY2hpdmVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQXJjaGl2ZUltcGwuamF2YQppbmRleCBmODc3YTVlLi5iZWI2YmEwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQXJjaGl2ZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlQXJjaGl2ZUltcGwuamF2YQpAQCAtODEsNiArODEsNyBAQAogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIExvb3NlY29uZmlnUGFja2FnZS5MaXRlcmFscy5MT09TRV9BUkNISVZFOwogCX0KQEAgLTE1OCw4ICsxNTksOCBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRMb29zZUFwcChMb29zZUFwcGxpY2F0aW9uIG5ld0xvb3NlQXBwLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdMb29zZUFwcCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOworCQlOb3RpZmljYXRpb25DaGFpbiBpbm5lck1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdMb29zZUFwcCwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX0xPT1NFX0FQUCwgbXNncyk7CisJCXJldHVybiBpbm5lck1zZ3M7CiAJfQogCiAJLyoqCkBAIC0xNjgsNyArMTY5LDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRMb29zZUFwcChMb29zZUFwcGxpY2F0aW9uIG5ld0xvb3NlQXBwKSB7CiAJCWlmIChuZXdMb29zZUFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQICYmIG5ld0xvb3NlQXBwICE9IG51bGwpKSB7CiAJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3TG9vc2VBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCiAJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKIAkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQogCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwpAQCAtMTkwLDEyICsxOTEsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRMb29zZUFwcCgoTG9vc2VBcHBsaWNhdGlvbilvdGhlckVuZCwgbXNncyk7CisJCQkJTm90aWZpY2F0aW9uQ2hhaW4gaW5uZXJNc2dzID0gbXNnczsKKwkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCl7CisJCQkJCWlubmVyTXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CisJCQkJfQorCQkJCXJldHVybiBiYXNpY1NldExvb3NlQXBwKChMb29zZUFwcGxpY2F0aW9uKW90aGVyRW5kLCBpbm5lck1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC0yMDUsNiArMjA5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOgpAQCAtMjE4LDYgKzIyMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fTE9PU0VfQVBQOgpAQCAtMjMxLDYgKzIzNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1VSSToKQEAgLTI1MCw2ICsyNTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQVJDSElWRV9fVVJJOgpAQCAtMjczLDYgKzI4MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9BUkNISVZFX19VUkk6CkBAIC0yOTYsNiArMzA1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FSQ0hJVkVfX1VSSToKQEAgLTMxMywxNSArMzIzLDE2IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVyaTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAodXJpOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmluYXJpZXNQYXRoOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBiaW5hcmllc1BhdGg6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoYmluYXJpZXNQYXRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXNvdXJjZXNQYXRoOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByZXNvdXJjZXNQYXRoOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHJlc291cmNlc1BhdGgpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VDb25maWd1cmF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUNvbmZpZ3VyYXRpb25JbXBsLmphdmEKaW5kZXggYWI1NjA4My4uZjRkNzExYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUNvbmZpZ3VyYXRpb25JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUNvbmZpZ3VyYXRpb25JbXBsLmphdmEKQEAgLTQ3LDYgKzQ3LDcgQEAKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuTGl0ZXJhbHMuTE9PU0VfQ09ORklHVVJBVElPTjsKIAl9CkBAIC02Niw2ICs2Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0NPTkZJR1VSQVRJT05fX0FQUExJQ0FUSU9OUzoKQEAgLTc5LDYgKzgxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgpAQCAtOTIsNiArOTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTl9fQVBQTElDQVRJT05TOgpAQCAtMTA3LDYgKzExMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9DT05GSUdVUkFUSU9OX19BUFBMSUNBVElPTlM6CkBAIC0xMjEsNiArMTI2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0NPTkZJR1VSQVRJT05fX0FQUExJQ0FUSU9OUzoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VMaWJyYXJ5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUxpYnJhcnlJbXBsLmphdmEKaW5kZXggZTc2MTRiOS4uOTdmOTQxMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUxpYnJhcnlJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZUxpYnJhcnlJbXBsLmphdmEKQEAgLTM2LDYgKzM2LDcgQEAKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuTGl0ZXJhbHMuTE9PU0VfTElCUkFSWTsKIAl9CkBAIC01NCw4ICs1NSw4IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldExvb3NlV0FSKExvb3NlV0FSRmlsZSBuZXdMb29zZVdBUiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3TG9vc2VXQVIsIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVIsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKKwkJTm90aWZpY2F0aW9uQ2hhaW4gbXNnczIgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCluZXdMb29zZVdBUiwgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUiwgbXNncyk7CisJCXJldHVybiBtc2dzMjsKIAl9CiAKIAkvKioKQEAgLTY0LDcgKzY1LDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRMb29zZVdBUihMb29zZVdBUkZpbGUgbmV3TG9vc2VXQVIpIHsKIAkJaWYgKG5ld0xvb3NlV0FSICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVIgJiYgbmV3TG9vc2VXQVIgIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdMb29zZVdBUikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwogCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCiAJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CkBAIC04MiwxMiArODMsMTQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSOgorCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MyID0gbXNnczsKIAkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TG9vc2VXQVIoKExvb3NlV0FSRmlsZSlvdGhlckVuZCwgbXNncyk7CisJCQkJCW1zZ3MyID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzMik7CisJCQkJcmV0dXJuIGJhc2ljU2V0TG9vc2VXQVIoKExvb3NlV0FSRmlsZSlvdGhlckVuZCwgbXNnczIpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC05Nyw2ICsxMDAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVI6CkBAIC0xMTAsNiArMTE0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7CiAJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVI6CkBAIC0xMjMsNiArMTI4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSOgpAQCAtMTM2LDYgKzE0Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9MSUJSQVJZX19MT09TRV9XQVI6CkBAIC0xNTAsNiArMTU3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0xJQlJBUllfX0xPT1NFX1dBUjoKQEAgLTE2NCw2ICsxNzIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTElCUkFSWV9fTE9PU0VfV0FSOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZU1vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2VNb2R1bGVJbXBsLmphdmEKaW5kZXggYWZiNTk4Yy4uMTU3NWNkYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZU1vZHVsZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlTW9kdWxlSW1wbC5qYXZhCkBAIC01MCw2ICs1MCw3IEBACiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLkxpdGVyYWxzLkxPT1NFX01PRFVMRTsKIAl9CkBAIC03Niw2ICs3Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fQUxUX0REOgpAQCAtODksNiArOTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfTU9EVUxFX19BTFRfREQ6CkBAIC0xMDMsNiArMTA2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX01PRFVMRV9fQUxUX0REOgpAQCAtMTE3LDYgKzEyMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9NT0RVTEVfX0FMVF9ERDoKQEAgLTEyOCwxMSArMTMzLDEyIEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFsdEREOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChhbHRERDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChhbHRERCk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZVdBUkZpbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlV0FSRmlsZUltcGwuamF2YQppbmRleCA4NTkyNzBhLi40YzliMzI1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlV0FSRmlsZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlV0FSRmlsZUltcGwuamF2YQpAQCAtNDYsMTAgKzQ2LDEyIEBACiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gTG9vc2Vjb25maWdQYWNrYWdlLkxpdGVyYWxzLkxPT1NFX1dBUl9GSUxFOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzV0FSKCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CkBAIC02OSw2ICs3MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTOgpAQCAtODIsNiArODUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUzoKQEAgLTk1LDYgKzk5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlM6CkBAIC0xMDgsNiArMTEzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX1dBUl9GSUxFX19MT09TRV9MSUJTOgpAQCAtMTIzLDYgKzEyOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIExvb3NlY29uZmlnUGFja2FnZS5MT09TRV9XQVJfRklMRV9fTE9PU0VfTElCUzoKQEAgLTEzNyw2ICsxNDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEVfX0xPT1NFX0xJQlM6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlY29uZmlnRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDA4MDBlZmUuLjFjMDRhMWYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdGYWN0b3J5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL2ltcGwvTG9vc2Vjb25maWdGYWN0b3J5SW1wbC5qYXZhCkBAIC0xMiw3ICsxMiw2IEBACiAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7CkBAIC0yNiw3ICsyNSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwogCiAKLXB1YmxpYyBjbGFzcyBMb29zZWNvbmZpZ0ZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgTG9vc2Vjb25maWdGYWN0b3J5LCBFRmFjdG9yeSB7CitwdWJsaWMgY2xhc3MgTG9vc2Vjb25maWdGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIExvb3NlY29uZmlnRmFjdG9yeSB7CiAJLyoqCiAJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0zNSw3ICszNCw3IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBMb29zZWNvbmZpZ0ZhY3RvcnkgaW5pdCgpIHsKIAkJdHJ5IHsKLQkJCUxvb3NlY29uZmlnRmFjdG9yeSB0aGVMb29zZWNvbmZpZ0ZhY3RvcnkgPSAoTG9vc2Vjb25maWdGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSIpOyAKKwkJCUxvb3NlY29uZmlnRmFjdG9yeSB0aGVMb29zZWNvbmZpZ0ZhY3RvcnkgPSAoTG9vc2Vjb25maWdGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSIpOyAgLy8kTk9OLU5MUy0xJAogCQkJaWYgKHRoZUxvb3NlY29uZmlnRmFjdG9yeSAhPSBudWxsKSB7CiAJCQkJcmV0dXJuIHRoZUxvb3NlY29uZmlnRmFjdG9yeTsKIAkJCX0KQEAgLTU3LDYgKzU2LDcgQEAKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKIAkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKIAkJCWNhc2UgTG9vc2Vjb25maWdQYWNrYWdlLkxPT1NFX0FQUExJQ0FUSU9OOiByZXR1cm4gY3JlYXRlTG9vc2VBcHBsaWNhdGlvbigpOwpAQCAtNjUsNyArNjUsNyBAQAogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfQ09ORklHVVJBVElPTjogcmV0dXJuIGNyZWF0ZUxvb3NlQ29uZmlndXJhdGlvbigpOwogCQkJY2FzZSBMb29zZWNvbmZpZ1BhY2thZ2UuTE9PU0VfV0FSX0ZJTEU6IHJldHVybiBjcmVhdGVMb29zZVdBUkZpbGUoKTsKIAkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvaW1wbC9Mb29zZWNvbmZpZ1BhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlY29uZmlnUGFja2FnZUltcGwuamF2YQppbmRleCA5NTI4NzQyLi5mMmY4YTg1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlY29uZmlnUGFja2FnZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC9pbXBsL0xvb3NlY29uZmlnUGFja2FnZUltcGwuamF2YQpAQCAtMTgsOCArMTgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVQYWNrYWdlSW1wbDsKQEAgLTMxLDEyICsyOSw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VXQVJGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlY29uZmlnRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUluaXQ7CiAKIC8qKgogICogQGxhc3RnZW4gY2xhc3MgTG9vc2Vjb25maWdQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIExvb3NlY29uZmlnUGFja2FnZSwKQEAgLTk5LDIwICs5MywxNiBAQAogCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoTG9vc2Vjb25maWdQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKExvb3NlY29uZmlnUGFja2FnZS5lTlNfVVJJKTsKIAogCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUxvb3NlY29uZmlnUGFja2FnZUltcGwgdGhlTG9vc2Vjb25maWdQYWNrYWdlID0gKExvb3NlY29uZmlnUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgTG9vc2Vjb25maWdQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IExvb3NlY29uZmlnUGFja2FnZUltcGwoKSk7CisJCUxvb3NlY29uZmlnUGFja2FnZUltcGwgdGhlTG9vc2Vjb25maWdQYWNrYWdlID0gCisJCQkoTG9vc2Vjb25maWdQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YKKwkJCQkJTG9vc2Vjb25maWdQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldworCQkJCQkJCUxvb3NlY29uZmlnUGFja2FnZUltcGwoKSk7CiAKIAkJaXNJbml0ZWQgPSB0cnVlOwogCiAJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwogCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJRWpiUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUpzcFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJCUoyRUVJbml0LmluaXRFTUZNb2RlbHMoKTsKIAkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCiAJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCkBAIC0xMjksNiArMTE5LDkgQEAKIAkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAogCQl0aGVMb29zZWNvbmZpZ1BhY2thZ2UuZnJlZXplKCk7CiAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChMb29zZWNvbmZpZ1BhY2thZ2UuZU5TX1VSSSwgdGhlTG9vc2Vjb25maWdQYWNrYWdlKTsKKwogCQlyZXR1cm4gdGhlTG9vc2Vjb25maWdQYWNrYWdlOwogCX0KIApAQCAtMzA3LDM3ICszMDAsNDkgQEAKIAkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwogCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwogCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJbG9vc2VBcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExvb3NlQXJjaGl2ZSgpKTsKLQkJbG9vc2VBcmNoaXZlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWxvb3NlTGlicmFyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExvb3NlQXJjaGl2ZSgpKTsKLQkJbG9vc2VNb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMb29zZUFyY2hpdmUoKSk7Ci0JCWxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlsb29zZVdBUkZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMb29zZU1vZHVsZSgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGxvb3NlQXBwbGljYXRpb25FQ2xhc3MsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsICJMb29zZUFwcGxpY2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUFwcGxpY2F0aW9uX0xvb3NlQXJjaGl2ZXMoKSwgdGhpcy5nZXRMb29zZUFyY2hpdmUoKSwgdGhpcy5nZXRMb29zZUFyY2hpdmVfTG9vc2VBcHAoKSwgImxvb3NlQXJjaGl2ZXMiLCBudWxsLCAwLCAtMSwgTG9vc2VBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlQXJjaGl2ZUVDbGFzcywgTG9vc2VBcmNoaXZlLmNsYXNzLCAiTG9vc2VBcmNoaXZlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvb3NlQXJjaGl2ZV9VcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaSIsIG51bGwsIDAsIDEsIExvb3NlQXJjaGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9vc2VBcmNoaXZlX0JpbmFyaWVzUGF0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYmluYXJpZXNQYXRoIiwgbnVsbCwgMCwgMSwgTG9vc2VBcmNoaXZlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMb29zZUFyY2hpdmVfUmVzb3VyY2VzUGF0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVzb3VyY2VzUGF0aCIsIG51bGwsIDAsIDEsIExvb3NlQXJjaGl2ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9vc2VBcmNoaXZlX0xvb3NlQXBwKCksIHRoaXMuZ2V0TG9vc2VBcHBsaWNhdGlvbigpLCB0aGlzLmdldExvb3NlQXBwbGljYXRpb25fTG9vc2VBcmNoaXZlcygpLCAibG9vc2VBcHAiLCBudWxsLCAwLCAxLCBMb29zZUFyY2hpdmUuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJYWRkRU9wZXJhdGlvbihsb29zZUFyY2hpdmVFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNNb2R1bGUiLCAwLCAxKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlTGlicmFyeUVDbGFzcywgTG9vc2VMaWJyYXJ5LmNsYXNzLCAiTG9vc2VMaWJyYXJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUxpYnJhcnlfTG9vc2VXQVIoKSwgdGhpcy5nZXRMb29zZVdBUkZpbGUoKSwgdGhpcy5nZXRMb29zZVdBUkZpbGVfTG9vc2VMaWJzKCksICJsb29zZVdBUiIsIG51bGwsIDAsIDEsIExvb3NlTGlicmFyeS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlTW9kdWxlRUNsYXNzLCBMb29zZU1vZHVsZS5jbGFzcywgIkxvb3NlTW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMb29zZU1vZHVsZV9BbHRERCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWx0REQiLCBudWxsLCAwLCAxLCBMb29zZU1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcywgTG9vc2VDb25maWd1cmF0aW9uLmNsYXNzLCAiTG9vc2VDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUNvbmZpZ3VyYXRpb25fQXBwbGljYXRpb25zKCksIHRoaXMuZ2V0TG9vc2VBcHBsaWNhdGlvbigpLCBudWxsLCAiYXBwbGljYXRpb25zIiwgbnVsbCwgMCwgLTEsIExvb3NlQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvb3NlV0FSRmlsZUVDbGFzcywgTG9vc2VXQVJGaWxlLmNsYXNzLCAiTG9vc2VXQVJGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZVdBUkZpbGVfTG9vc2VMaWJzKCksIHRoaXMuZ2V0TG9vc2VMaWJyYXJ5KCksIHRoaXMuZ2V0TG9vc2VMaWJyYXJ5X0xvb3NlV0FSKCksICJsb29zZUxpYnMiLCBudWxsLCAwLCAtMSwgTG9vc2VXQVJGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlib29sZWFuIGhhc0xvY2sgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCWhhc0xvY2sgPSBKMkVFSW5pdC5hcXVpcmVJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJfQkJCisJCQorCQl0cnl7CisJCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCQlsb29zZUFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TG9vc2VBcmNoaXZlKCkpOworCQkJbG9vc2VBcmNoaXZlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQlsb29zZUxpYnJhcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMb29zZUFyY2hpdmUoKSk7CisJCQlsb29zZU1vZHVsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExvb3NlQXJjaGl2ZSgpKTsKKwkJCWxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJbG9vc2VXQVJGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TG9vc2VNb2R1bGUoKSk7CisJCisJCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQkJaW5pdEVDbGFzcyhsb29zZUFwcGxpY2F0aW9uRUNsYXNzLCBMb29zZUFwcGxpY2F0aW9uLmNsYXNzLCAiTG9vc2VBcHBsaWNhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9vc2VBcHBsaWNhdGlvbl9Mb29zZUFyY2hpdmVzKCksIHRoaXMuZ2V0TG9vc2VBcmNoaXZlKCksIHRoaXMuZ2V0TG9vc2VBcmNoaXZlX0xvb3NlQXBwKCksICJsb29zZUFyY2hpdmVzIiwgbnVsbCwgMCwgLTEsIExvb3NlQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MobG9vc2VBcmNoaXZlRUNsYXNzLCBMb29zZUFyY2hpdmUuY2xhc3MsICJMb29zZUFyY2hpdmUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9vc2VBcmNoaXZlX1VyaSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJpIiwgbnVsbCwgMCwgMSwgTG9vc2VBcmNoaXZlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRMb29zZUFyY2hpdmVfQmluYXJpZXNQYXRoKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJiaW5hcmllc1BhdGgiLCBudWxsLCAwLCAxLCBMb29zZUFyY2hpdmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldExvb3NlQXJjaGl2ZV9SZXNvdXJjZXNQYXRoKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZXNvdXJjZXNQYXRoIiwgbnVsbCwgMCwgMSwgTG9vc2VBcmNoaXZlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUFyY2hpdmVfTG9vc2VBcHAoKSwgdGhpcy5nZXRMb29zZUFwcGxpY2F0aW9uKCksIHRoaXMuZ2V0TG9vc2VBcHBsaWNhdGlvbl9Mb29zZUFyY2hpdmVzKCksICJsb29zZUFwcCIsIG51bGwsIDAsIDEsIExvb3NlQXJjaGl2ZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJYWRkRU9wZXJhdGlvbihsb29zZUFyY2hpdmVFQ2xhc3MsIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNNb2R1bGUiLCAwLCAxKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhsb29zZUxpYnJhcnlFQ2xhc3MsIExvb3NlTGlicmFyeS5jbGFzcywgIkxvb3NlTGlicmFyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9vc2VMaWJyYXJ5X0xvb3NlV0FSKCksIHRoaXMuZ2V0TG9vc2VXQVJGaWxlKCksIHRoaXMuZ2V0TG9vc2VXQVJGaWxlX0xvb3NlTGlicygpLCAibG9vc2VXQVIiLCBudWxsLCAwLCAxLCBMb29zZUxpYnJhcnkuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MobG9vc2VNb2R1bGVFQ2xhc3MsIExvb3NlTW9kdWxlLmNsYXNzLCAiTG9vc2VNb2R1bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldExvb3NlTW9kdWxlX0FsdEREKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhbHRERCIsIG51bGwsIDAsIDEsIExvb3NlTW9kdWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGxvb3NlQ29uZmlndXJhdGlvbkVDbGFzcywgTG9vc2VDb25maWd1cmF0aW9uLmNsYXNzLCAiTG9vc2VDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRMb29zZUNvbmZpZ3VyYXRpb25fQXBwbGljYXRpb25zKCksIHRoaXMuZ2V0TG9vc2VBcHBsaWNhdGlvbigpLCBudWxsLCAiYXBwbGljYXRpb25zIiwgbnVsbCwgMCwgLTEsIExvb3NlQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhsb29zZVdBUkZpbGVFQ2xhc3MsIExvb3NlV0FSRmlsZS5jbGFzcywgIkxvb3NlV0FSRmlsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9vc2VXQVJGaWxlX0xvb3NlTGlicygpLCB0aGlzLmdldExvb3NlTGlicmFyeSgpLCB0aGlzLmdldExvb3NlTGlicmFyeV9Mb29zZVdBUigpLCAibG9vc2VMaWJzIiwgbnVsbCwgMCwgLTEsIExvb3NlV0FSRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQl9ZmluYWxseXsKKwkJCWlmKCBoYXNMb2NrICkKKwkJCQlKMkVFSW5pdC5yZWxlYXNlSW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50c0xvY2soKTsKKwkJfQogCX0KIAogfSAvL0xvb3NlY29uZmlnUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL3V0aWwvTG9vc2Vjb25maWdBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ0FkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggNDE0MDIxMC4uZTA2MTdiNCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ0FkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTUwLDYgKzUwLDcgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKIAkJCXJldHVybiB0cnVlOwpAQCAtNjgsMjcgKzY5LDM1IEBACiAJICovCiAJcHJvdGVjdGVkIExvb3NlY29uZmlnU3dpdGNoIG1vZGVsU3dpdGNoID0KIAkJbmV3IExvb3NlY29uZmlnU3dpdGNoKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZUFwcGxpY2F0aW9uKExvb3NlQXBwbGljYXRpb24gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUxvb3NlQXBwbGljYXRpb25BZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUxvb3NlQXJjaGl2ZShMb29zZUFyY2hpdmUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUxvb3NlQXJjaGl2ZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlTG9vc2VMaWJyYXJ5KExvb3NlTGlicmFyeSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTG9vc2VMaWJyYXJ5QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VMb29zZU1vZHVsZShMb29zZU1vZHVsZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTG9vc2VNb2R1bGVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUxvb3NlQ29uZmlndXJhdGlvbihMb29zZUNvbmZpZ3VyYXRpb24gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUxvb3NlQ29uZmlndXJhdGlvbkFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlTG9vc2VXQVJGaWxlKExvb3NlV0FSRmlsZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTG9vc2VXQVJGaWxlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKIAkJCX0KQEAgLTk3LDYgKzEwNiw3IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKIAkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ1N3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2NvbW1vbkFyY2hpdmUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uYXJjaGl2ZWNvcmUvbG9vc2Vjb25maWcvaW50ZXJuYWwvdXRpbC9Mb29zZWNvbmZpZ1N3aXRjaC5qYXZhCmluZGV4IGI5NWZhYWYuLjJkNDJmNjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9jb21tb25BcmNoaXZlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbmFyY2hpdmVjb3JlL2xvb3NlY29uZmlnL2ludGVybmFsL3V0aWwvTG9vc2Vjb25maWdTd2l0Y2guamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvY29tbW9uQXJjaGl2ZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb25hcmNoaXZlY29yZS9sb29zZWNvbmZpZy9pbnRlcm5hbC91dGlsL0xvb3NlY29uZmlnU3dpdGNoLmphdmEKQEAgLTYzLDEzICs2MywxMSBAQAogCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKIAkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwogCQl9Ci0JCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KKwkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOworCQlyZXR1cm4KKwkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CisJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgorCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKIAl9CiAKIAkvKioKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vZWFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9lYXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MGVjOTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9lYXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRoaXMgcHJvcGVydGllcyBmaWxlIGhvbGQgYWxsIHRoZSBleHRlcm5hbGlzZWQgc3RyaW5ncyBmb3IgZVRvb2xzIAotIyBFQVIgVmFsaWRhdGlvbiBwcm9qZWN0Ci0jCi0jIE1lc3NhZ2VzIHNob3VsZCBiZSBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBhdCAKLSMgICBodHRwOi8vaGFueS5hdXN0aW4uaWJtLmNvbS9tZXNzYWdlcy9pbmRleC5odG1sCi0jCi0jIEJyaWVmbHk6Ci0jICAgICBNRVNTQUdFX0lEPTxDb21wb25lbnRQcmVmaXg+PE1lc3NhZ2VOdW1iZXI+PFR5cGVDb2RlPjogPE1lc3NhZ2VUZXh0PgotIwotIyBUaGUgcHJlZml4IGZvciB0aGlzIGNvbXBvbmVudCBpczoKLSMgICAgIENIS1cgKElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbikKLSMKLSMgTWVzc2FnZSBudW1iZXJzIGFyZSBmb3VyIGRpZ2l0IG51bWJlcnMsIGZyb20gJzAwMDAnIHRvICc5OTk5JywgaW5jbHVzaXZlLgotIyBNZXNzYWdlIG51bWJlcnMgYXJlIGZpbGxlZCB0byB0aGUgbGVmdCB3aXRoICcwJywgdG8gYSB3aWR0aCBvZiA0LgotIwotIyBWYWxpZCBtZXNzYWdlIHR5cGUgY29kZXMgYXJlOgotIyAgICAgSSAoSW5mb3JtYXRpb25hbCkKLSMgICAgIFcgKFdhcm5pbmcpCi0jICAgICBFIChFcnJvcikKLSMKLSMgTm90ZSB0aGUgIjogIiB0aGF0IGFwcGVhcnMgYmV0d2VlbiB0aGUgdHlwZSBjb2RlIGFuZCB0aGUgbWVzc2FnZSB0ZXh0LgotIwotIyA6QmVnaW46IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkJlZ2luOgotI0NPTVBPTkVOVFBSRUZJWCBDSEtKCi0jQ09NUE9ORU5UTkFNRUZPUiBDSEtKIElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbgotI0NNVkNQQVRITkFNRSBuY2Yvc3JjL2phdmEvY29tL2libS93ZWJzcGhlcmUvdmFsaWRhdGlvbi9lYXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKLSMgOkVuZDogV2ViU3BoZXJlIFF1YWxpdHkgVmFsaWRhdGlvbiBJbmZvcm1hdGlvbiA6RW5kOgotIwotIyAyOS1KdW5lLTIwMDE6Ci0jICBUaGlzIGZpbGUgaGFzIGJlZW4gdGVzdGVkIHVzaW5nIHRoZSBQcm9jZXNzTXNnRmlsZSB0b29sLCB3cml0dGVuIGJ5IAotIyAgSGFueSBTYWxlbSBhbmQgb3duZWQgYnkgRGVubmlzIEhlYmVydC4gIEFueSBmdXR1cmUgY2hhbmdlcyBzaG91bGQgCi0jICBhbHNvIGJlIHZlcmlmaWVkIHVzaW5nIHRoaXMgdG9vbC4gIFBsZWFzZSBjb250YWN0IERlbm5pcyAKLSMgIChoZWJlcnRAdXMuaWJtLmNvbSBvciBUL0wgNTQzLTI1MjApIGZvciBtb3JlIGluZm9ybWF0aW9uLgotIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI05PVEFNU0cKLXZhbGlkYXRvci5uYW1lPUVBUiBWYWxpZGF0b3IKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX1ZBTElEQVRJT05fRkFJTEVEPUNIS0oxMDAwRTogRUFSIFZhbGlkYXRpb24gZmFpbGVkOiB7MH0KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX0lOVkFMSURfRUFSX0ZJTEU9Q0hLSjEwMDFFOiBUaGUgRUFSIHByb2plY3QgezB9IGlzIGludmFsaWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVM9Q0hLSjEwMDJFOiBEdXBsaWNhdGUgc2VjdXJpdHkgcm9sZSBuYW1lZCB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfRUFSX05PX01PRFVMRV9VUkk9Q0hLSjEwMDNFOiBBIG1vZHVsZSBoYXMgYmVlbiBkZWZpbmVkIHdpdGggbm8gVVJJLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX0VBUl9NSVNTSU5HX1VSST1DSEtKMTAwNEU6IFRoZSBVUkksIHswfSwgZG9lcyBub3QgbWF0Y2ggYW55dGhpbmcgaW4gdGhlIEVBUiBmaWxlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FQVJfRERfUEFSU0VfTElORUNPTD1DSEtKMTAwNUU6IFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGxvYWRlZC4gVGhlIHN0YXJ0IG9mIHRoZSBiYWQgc2VjdGlvbiBpcyBhdCBsaW5lIHswfSwgY29sdW1uIHsxfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRUFSX0REX1BBUlNFX0xJTkU9Q0hLSjEwMDZFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQuIFRoZSBzdGFydCBvZiB0aGUgYmFkIHNlY3Rpb24gaXMgYXQgbGluZSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVBUl9ERF9QQVJTRV9OT0lORk89Q0hLSjEwMDdFOiBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBsb2FkZWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVBUl9ERF9DQU5OT1RfT1BFTl9ERD1DSEtKMTAwOEU6IENhbm5vdCBvcGVuIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFZhbGlkYXRpb24gY2Fubm90IGNvbXBsZXRlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIGVycm9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVVSSV9DT05UQUlOU19TUEFDRVNfRVJST1JfPUlXQUUwMDA1RSBUaGUgVVJJIHswfSBjb250YWlucyBhIHNwYWNlLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCBiZWNhdXNlIGl0IGNhbm5vdCBiZSByZWZlcmVuY2VkIGZyb20gYSBtYW5pZmVzdCBmaWxlLgotTUVTU0FHRV9FQVJfRFVQTElDQVRFX1VSSV9FUlJPUl89SVdBRTAwMDZFIFRoZSBtb2R1bGUgezB9IGhhcyBkdXBsaWNhdGUgdXJpIGluIEVBUjogezF9LgotTUVTU0FHRV9FQVJfRFVQSUNBVEVfUk9PVENPTlRFWFRfRVJST1JfPUlXQUUwMDA3RSBTYW1lIGNvbnRleHQgcm9vdCAiezB9IiBleGlzdHMgaW4gV2ViIG1vZHVsZXMgInsxfSIgYW5kICJ7Mn0iLgotTUVTU0FHRV9FTVBUWV9BTFRfRERfRVJST1JfPUlXQUUwMDA5RSBUaGUgbW9kdWxlIHswfSBoYXMgZW1wdHkgPGFsdC1kZD4gdGFnIGluIEVBUiB7MX0uICBUaGUgdGFnIHNob3VsZCBiZSByZW1vdmVkIG9yIHRoZSB2YWx1ZSBzaG91bGQgYmUgdmFsaWQuCi1EVVBMSUNBVEVfVVRJTEpBUl9GT1JfUFJPSkVDVF9OQU1FX0VSUk9SXz1JV0FFMDAxMEUgPVRoZSBwcm9qZWN0IHswfSBpbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgezF9IGhhcyBkdXBsaWNhdGUgdXRpbGl0eSBKQVIgVVJJIHsyfS4KLURVUExJQ0FURV9NT0RVTEVfRk9SX1BST0pFQ1RfTkFNRV9FUlJPUl89SVdBRTAwMTFFIFRoZSBwcm9qZWN0IHswfSBpbiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgezF9IGhhcyBkdXBsaWNhdGUgbW9kdWxlIG5hbWUgezJ9LgotTUVTU0FHRV9VVElMX1VSSV9OQU1FX0NPTExJU0lPTl9FUlJPUl89SVdBRTAwMTJFIFRoZSBtb2R1bGUgezB9IGluIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB7MX0gaGFzIHNhbWUgbmFtZSBhcyB1dGlsaXR5IEpBUiBVUkkuCi1NRVNTQUdFX1VUSUxfUFJPSkVDVF9OQU1FX0NPTExJU0lPTl9FUlJPUl89SVdBRTAwMTNFIFRoZSBtb2R1bGUgezB9IGluIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB7MX0gaGFzIHNhbWUgbmFtZSBhcyB1dGlsaXR5IEpBUiBwcm9qZWN0IG5hbWUuCi1FUlJPUl9SRUFESU5HX01BTklGRVNUX0VSUk9SXz1JV0FFMDAxNEUgQW4gZXJyb3Igb2NjdXJyZWQgdmFsaWRhdGluZyB0aGUgTUFOSUZFU1QuTUYgZmlsZSBpbiBhcmNoaXZlIHswfS4KLU1BTklGRVNUX0xJTkVfRU5EX0VSUk9SXz1JV0FFMDAxNUUgVGhlIE1BTklGRVNULk1GIGZpbGUgaW4gYXJjaGl2ZSB7MH0gZG9lcyBub3QgZW5kIHdpdGggYSBuZXdsaW5lLgotTUFOSUZFU1RfTElORV9FWENFRURTX0xFTkdUSF9FUlJPUl89SVdBRTAwMTZFIExpbmUgezB9IGluIHRoZSBNQU5JRkVTVC5NRiBmaWxlIGluIGFyY2hpdmUgezF9IGV4Y2VlZHMgdGhlIHNwZWNpZmljYXRpb24gbGltaXQgb2YgNzIgYnl0ZXMuCi0KLUlOVkFMSURfVVJJX0ZPUl9NT0RVTEVfRVJST1JfPUlXQUUwMDE3RSBUaGUgbW9kdWxlIHswfSBoYXMgYSB3cm9uZyBkZWZhdWx0IGV4dGVuc2lvbiAoLmphciBmb3IgRUpCIG1vZHVsZXMgYW5kIC53YXIgZm9yIFdlYiBtb2R1bGVzKS4KLUVBUl9JTlZBTElEX0RPQ19UWVBFX0VSUk9SXz1JV0FFMDAxOEUgRG9jdW1lbnQgdHlwZSB2ZXJzaW9uICJ7MH0iIGZvciBhcHBsaWNhdGlvbi54bWwgaW4gcHJvamVjdCAiezF9IiBuZWVkcyB0byBiZSB2ZXJzaW9uICJ7Mn0iLgotCi1NT0RVTEVfRERfUEFSU0VfTElORUNPTF9FUlJPUl89SVdBRTAwMTlFIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgbW9kdWxlIHswfSBjb3VsZCBub3QgYmUgbG9hZGVkLiBUaGUgYmFkIHNlY3Rpb24gc3RhcnRzIGF0IGxpbmUgezF9LCBjb2x1bW4gezJ9LgotTU9EVUxFX0REX1BBUlNFX0xJTkVfRVJST1JfPUlXQUUwMDIwRSBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG9mIG1vZHVsZSB7MH0gY291bGQgbm90IGJlIGxvYWRlZC4gVGhlIGJhZCBzZWN0aW9uIHN0YXJ0cyBhdCBsaW5lIHsxfQotTU9EVUxFX0REX1BBUlNFX05PSU5GT19FUlJPUl89SVdBRTAwMjFFIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgbW9kdWxlIHswfSBjb3VsZCBub3QgYmUgbG9hZGVkLgotRUpCX0JFQU5fRUpCX0xJTktfSU5URUZBQ0VfTUlTTUFUQ0hfRVJST1JfPUlXQUUwMDM3RSBUaGUgaW50ZXJmYWNlcyBvZiB0aGUgbGlua2VkIGVudGVycHJpc2UgYmVhbiB7MH0gZG8gbm90IG1hdGNoIHRob3NlIGluIEVKQiByZWYgezF9IGluIG1vZHVsZSB7Mn0uCi0KLUNMQVNTUEFUSF9DT01QT05FTlRfVVJJX01BVENIRVNfQVJDSElWRV9VUkk9VVJJIHsxfSBmb3IgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmN5IGZyb20gcHJvamVjdCB7MH0gY2xhc2hlcyB3aXRoIGV4aXN0aW5nIGFyY2hpdmUgaW4gRUFSLgotRFVQTElDQVRFX0NMQVNTUEFUSF9DT01QT05FTlRfVVJJPVVSSSB7MX0gZm9yIGNsYXNzcGF0aCBkZXBlbmRlbmN5IGZyb20gcHJvamVjdCB7MH0gbWFwcyB0byBhIGRpZmZlcmVudCBmaWxlIHN5c3RlbSBwYXRoIGFzIGFub3RoZXIgY2xhc3NwYXRoIGRlcGVuZGVuY3kgd2l0aCB0aGUgc2FtZSBVUkkuCi0KLUpFRTVfUFJPSkVDVF9SRUZFUkVOQ0VEX0JZX1BSRV9KRUU1X0VBUj1GYWNldCB2ZXJzaW9uIGZvciBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgezB9IG11c3QgYmUgNS4wIHRvIGNvbnRhaW4gSmF2YSBFRSA1LjAgcHJvamVjdCB7MX0uCi0KLSMgd2FybmluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV0FSTklOR19NRVRBRk9MREVSX01JU1NJTkc9SVdBSjAwMDBXOiBNZXRhIGZvbGRlciB7MH0gbXVzdCBleGlzdCBpbiBwcm9qZWN0IHsxfS4KLVdBUk5JTkdfRklMRV9NSVNTSU5HPUlXQUowMDAxVzogezB9IG11c3QgZXhpc3QgaW4gcHJvamVjdCB7MX0uCi1NRVNTQUdFX0lOVkFMSURfQUxUX0REX1dBUk5fPUlXQUUwMDIyVyBUaGUgbW9kdWxlIHswfSBoYXMgYWx0LWRkIHsxfSwgYnV0IHRoZSByZXNvdXJjZSBkb2VzIG5vdCBleGlzdCBpbiBFQVIgezJ9LgotSU5WQUxJRF9NQU5JRkVTVF9DTEFTU1BBVEhfT05FX1dBUk5fPUlXQUUwMDIzVyBUaGUgTWFuaWZlc3QgQ2xhc3MtUGF0aCBpbiBhcmNoaXZlIHswfSBjb250YWlucyBhbiBlbnRyeSB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCBpbiB0aGUgRUFSOiB7MX0uCi1JTlZBTElEX01BTklGRVNUX0NMQVNTUEFUSF9UV09fV0FSTl89SVdBRTAwMjRXIFRoZSBNYW5pZmVzdCBDbGFzcy1QYXRoIGZvciBhcmNoaXZlIHswfSBjb250YWlucyBhbiBlbnRyeSwgezF9LCB0aGF0IGlzIG5vdCByZXNvbHZhYmxlIHRvIGEgZmlsZSBvciBtb2R1bGUgaW4gdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb246IHsyfS4KLUlOVkFMSURfTUFOSUZFU1RfQ0xBU1NQQVRIX0RFUEVOREVOQ1lfV0FSTl89SVdBRTAwMjVXIFRoZSBNYW5pZmVzdCBDbGFzcy1QYXRoIGluIG1vZHVsZSB7MH0gY29udGFpbnMgYW4gZW50cnksIHsxfSwgdGhhdCByZXNvbHZlcyB0byBhcmNoaXZlIHsyfS4gIFRoaXMgZGVwZW5kZW5jeSBkb2VzIG5vdCBjb21wbHkgd2l0aCB0aGUgSmF2YSBFRSBzcGVjaWZpY2F0aW9uLgotUFJPSkVDVF9JU19DTE9TRURfV0FSTl89SVdBRTAwMjZXIEVBUiBWYWxpZGF0aW9uIGNhbm5vdCBydW4gb24gY2xvc2VkIHByb2plY3Q6IHswfS4gT3BlbiB0aGUgcHJvamVjdCwgYW5kIHRyeSBhZ2Fpbi4KLVBST0pFQ1RfRE9FU19OT1RfRVhJU1RfV0FSTl89SVdBRTAwMjdXIFRoZSBwcm9qZWN0IHswfSBmb3IgbW9kdWxlIG9yIHV0aWxpdHkgSkFSIHsxfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgezJ9IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuCi1NSVNTSU5HX1dFQk5BVFVSRV9GT1JNT0RVTEVfV0FSTl89SVdBRTAwMjhXIFRoZSB3ZWIgbW9kdWxlIHswfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgezF9IGlzIG5vdCBhIEphdmEgRUUgV2ViIHByb2plY3QuCi1ERVBSRUNBVEVEX0FCU1BBVEhTX1dBUk5fPUlXQUUwMDI5VyBUaGUgSUJNIGV4dGVuc2lvbnMgZmlsZSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgezB9IGNvbnRhaW5zIGRlcHJlY2F0ZWQgYWJzb2x1dGUgcGF0aHMuICBVc2UgdGhlIGFwcGxpY2F0aW9uIGVkaXRvciB0byBjbGVhbiB1cCB0aGUgZmlsZS4KLUlOVkFMSURfQ09OVEVYVFJPT1RfV0VCTU9EVUxFX1dBUk5fPUlXQUUwMDMwVyBUaGUgY29udGV4dCByb290IGZvciBXZWIgbW9kdWxlOiB7MH0gaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0OiB7MX0gZG9lcyBub3QgbWF0Y2ggdGhlIGNvbnRleHQgcm9vdCBpbiB3ZWIgcHJvamVjdCBzZXR0aW5ncyBvZiB7Mn0uCi1NSVNTSU5HX0NMSUVOVE5BVFVSRV9GT1JNT0RVTEVfV0FSTl89SVdBRTAwMzFXIFRoZSBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlIHswfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q6ezF9IGlzIG5vdCBhbiBhcHBsaWNhdGlvbiBjbGllbnQgcHJvamVjdC4KLU1JU1NJTkdfRUpCTkFUVVJFX0ZPUk1PRFVMRV9XQVJOXz1JV0FFMDAzMlcgVGhlIEVKQiBtb2R1bGUgezB9IGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7MX0gaXMgbm90IGFuIEVKQiBwcm9qZWN0LgotTUlTU0lOR19QUk9KRUNUX0ZPUk1PRFVMRV9XQVJOXz1JV0FFMDAzM1cgVGhlIG1vZHVsZSB7MH0gaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHsxfSBoYXMgbm90IGJlZW4gY29uZmlndXJlZCBhcyBhIEphdmEgRUUgbW9kdWxlIGRlcGVuZGVuY3kuIAotSU5WQUxJRF9DQVNFX0ZPUl9NQU5JRkVTVF9FUlJPUl89SVdBRTAwMzhFIFRoZSBjYXNlIG9mIHRoZSBtYW5pZmVzdCBmaWxlIG5hbWUgInswfSIgaW4gYXJjaGl2ZSB7MX0gaW4gaW5jb3JyZWN0LiAgRmlsZSBuYW1lIG11c3QgYmUgIk1FVEEtSU5GL01BTklGRVNULk1GIiwgY2FzZSBzZW5zaXRpdmUuCi1VUklfQUxSRUFEWV9FWElTVFNfSU5fRUFSX1dBUk5fPUlXQUUwMDM5VyBQcm9qZWN0IHV0aWxpdHkgSkFSIFVSSSB7MH0gY29sbGlkZXMgd2l0aCBhbiBleGlzdGluZyBmaWxlIGluIHByb2plY3QgezF9LgotTUlTU0lOR19NT0RVTEVfRVhURU5TSU9OX0VSUk9SXz1JV0FFMDA0MEUgVGhlIGFwcGxpY2F0aW9uIGV4dGVuc2lvbiBpbiBFQVIgcHJvamVjdDogezB9IGlzIG1pc3NpbmcgbW9kdWxlIGV4dGVuc2lvbiBmb3IgbW9kdWxlIHByb2plY3Q6IHsxfS4KLVBST0pFQ1RfU0VSVkVSX1RBUkdFVF9ET0VTX05PVF9NQVRDSF9FQVI9VGhlIHRhcmdldCBzZXJ2ZXIgb2YgdGhlIG1vZHVsZSBwcm9qZWN0ICJ7MH0iIGRvZXMgbm90IG1hdGNoIHRoZSB0YXJnZXQgc2VydmVyIG9mIHRoZSBjb250YWluaW5nIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCAiezF9IgotTk9fU0VSVkVSX1RBUkdFVF9NT0RVTEVfSU5fRUFSX1dJVEhfU0VSVkVSX1RBUkdFVD1UaGUgbW9kdWxlIHByb2plY3QgInswfSIgd2l0aCBubyB0YXJnZXQgc2VydmVyIGJlbG9uZ3MgdG8gYW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0ICJ7MX0iIHRoYXQgaGFzIGEgdGFyZ2V0IHNlcnZlcgotTk9fU0VSVkVSX1RBUkdFVF9PTl9FQVJfV0lUSF9NT0RVTEVfU0VSVkVSX1RBUkdFVFM9VGhlIGVhciBwcm9qZWN0ICJ7MH0iIHdpdGggbm8gdGFyZ2V0IHNlcnZlciBoYXMgbW9kdWxlIHByb2plY3QgInsxfSIgdGhhdCBoYXMgYSB0YXJnZXQgc2VydmVyCi1JTlZBTElEX0VBUl9TRVJWRVJfVEFSR0VUX0ZPUl8xNF9TUEVDX0xFVkVMPVRoZSBKYXZhIEVFIDEuNCBzcGVjaWZpY2F0aW9uIEVBUiBwcm9qZWN0ICJ7MH0iIGhhcyBhbiBpbmNvbXBhdGlibGUgdGFyZ2V0IHNlcnZlciAiezF9IgotSU5WQUxJRF9NT0RVTEVfU0VSVkVSX1RBUkdFVF9GT1JfMTRfU1BFQ19MRVZFTD1UaGUgSmF2YSBFRSAxLjQgc3BlY2lmaWNhdGlvbiBtb2R1bGUgcHJvamVjdCAiezB9IiBoYXMgYW4gaW5jb21wYXRpYmxlIHRhcmdldCBzZXJ2ZXIgInsxfSIuCi1NRVNTQUdFX0lOQ09NUEFUSUJMRV9TUEVDX1dBUk5JTkdfPUlXQUUwMDA4RSBUaGUgbW9kdWxlICJ7MH0iIGlzIGF0IGFuIGluY29tcGF0aWJsZSBKYXZhIEVFIHNwZWNpZmljYXRpb24gbGV2ZWwgdGhhbiB0aGF0IG9mIHRoZSAiezF9IiBFbnRlcnByaXNlIEFwcGxpY2F0aW9uLgotTUVTU0FHRV9JTkNPTVBBVElCTEVfMTNfU1BFQ19XQVJOSU5HXz1JV0FFMDAwOEUgVGhlIG1vZHVsZSAiezB9IiBpcyBKYXZhIEVFIHYxLjMgc3BlY2lmaWNhdGlvbiBsZXZlbCwgd2hpY2ggaXMgaW5jb21wYXRpYmxlIGluIHRoZSB2MS4yIEVBUi4KLU1FU1NBR0VfSU5DT01QQVRJQkxFXzE0X1NQRUNfV0FSTklOR189VGhlIG1vZHVsZSAiezB9IiBpcyBKYXZhIEVFIHYxLjQgc3BlY2lmaWNhdGlvbiBsZXZlbCwgd2hpY2ggaXMgaW5jb21wYXRpYmxlIGluIHRoZSB2MS4zIEVBUi4KLUVBUl9WQUxJREFUSU9OX0lOVEVSTkFMX0VSUk9SX1VJXz1JV0FFMDA1M0UgQW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkIHJ1bm5pbmcgdmFsaWRhdGlvbiBvbiBwcm9qZWN0OnswfSwgY2hlY2sgdGhlIGxvZyBmaWxlIGZvciBkZXRhaWxzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUJNUEhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FCTVBIb21lVlJ1bGUuamF2YQppbmRleCAzODYyYmFhLi5iODg1NzJjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUJNUEhvbWVWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQk1QSG9tZVZSdWxlLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFCTVBIb21lVlJ1bGUgZXh0ZW5kcyBBRW50aXR5SG9tZVZSdWxlIHsKIAorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdSZXR1cm5UeXBlTWF0Y2hlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGhvbWVNZXRob2QsIE1ldGhvZCBiZWFuTWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKIAkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBob21lTWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7CiAJCWlmKChtZXRob2RUeXBlICYgRklORCkgIT0gRklORCkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FCZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FCZWFuQ2xhc3NWUnVsZS5qYXZhCmluZGV4IGMwOWRiYWEuLmJjM2I4NDQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUJlYW5DbGFzc1ZSdWxlLmphdmEKQEAgLTI3LDEwICsyNywxMSBAQAogICogQHZlcnNpb24gCTEuMAogICogQGF1dGhvcgogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUJlYW5DbGFzc1ZSdWxlIGV4dGVuZHMgQVR5cGVWUnVsZSBpbXBsZW1lbnRzIElFSkJUeXBlIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBQmVhbkNsYXNzVlJ1bGUgZXh0ZW5kcyBBVHlwZVZSdWxlIHsKIAlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGxvbmdbXSBCQVNFX1RZUEVTID0gbmV3IGxvbmdbXXtJVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNUfTsKIAlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFkgPSBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORzsgLy8gRGVwcmVjYXRlZCB1c2Ugb2YgUmVtb3RlRXhjZXB0aW9uLgogCQorCUBPdmVycmlkZQogCXB1YmxpYyBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewogCQlyZXR1cm4gQkFTRV9UWVBFUzsKIAl9CkBAIC00MTQsNiArNDE1LDcgQEAKIAkJLy8gQnkgZGVmYXVsdCBkbyBub3RoaW5nCiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBsb25nIGdldEZpZWxkVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB7CiAJCWlmKGZpZWxkID09IG51bGwpIHsKIAkJCXJldHVybiBFWENMVURFRF9GSUVMRDsKQEAgLTQ5OSw2ICs1MDEsNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gZm9sbG93UmVtb3RlRXhjZXB0aW9uUnVsZXMoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiB7CiAJCS8vIG11c3Qgbm90IHRocm93IFJlbW90ZUV4Y2VwdGlvbgogCQlyZXR1cm4gVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmRvZXNOb3RUaHJvd1JlbW90ZUV4Y2VwdGlvbihiZWFuLCBtZXRob2QpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FDTVBIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQ01QSG9tZVZSdWxlLmphdmEKaW5kZXggNTczNDM4ZC4uZmU1NzcyOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FDTVBIb21lVlJ1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUNNUEhvbWVWUnVsZS5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiAJCX0KIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBmaW5kTWF0Y2hpbmdNZXRob2QobG9uZyBtZXRob2RUeXBlKSB7CiAJCWlmKChtZXRob2RUeXBlICYgRklORCkgPT0gSU1ldGhvZEFuZEZpZWxkQ29uc3RhbnRzLkZJTkQpIHsKIAkJCXJldHVybiBmYWxzZTsKQEAgLTUyLDYgKzUzLDcgQEAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuY29yZS5lamIuZWpiMjAucnVsZXMuaW1wbC5BSG9tZVZSdWxlI3JldHVybnNDb21wb25lbnRJbnRlcmZhY2VPckNvbGxlY3Rpb24oSUVKQlZhbGlkYXRpb25Db250ZXh0LCBFbnRlcnByaXNlQmVhbiwgSmF2YUNsYXNzLCBNZXRob2QpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gcmV0dXJuc0NvbXBvbmVudEludGVyZmFjZU9yQ29sbGVjdGlvbihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCWlmKHJldHVybnNDb21wb25lbnRJbnRlcmZhY2UodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKQEAgLTY2LDYgKzY4LDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlTWF0Y2hpbmdSZXR1cm5UeXBlTWF0Y2hlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGhvbWVNZXRob2QsIE1ldGhvZCBiZWFuTWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewogCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIGhvbWVNZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QsIHRoaXMpOwogCQlpZigobWV0aG9kVHlwZSAmIEZJTkQpICE9IEZJTkQpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BQ29tcG9uZW50VlJ1bGUuamF2YQppbmRleCAyYjRkZDdkLi4yNDNhYWYyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUNvbXBvbmVudFZSdWxlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FDb21wb25lbnRWUnVsZS5qYXZhCkBAIC00NCw2ICs0NCw3IEBACiAJCXJldHVybiBCVVNJTkVTUzsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7CiAJCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7CiAJfQpAQCAtNjAsNiArNjEsNyBAQAogCQl2YWxpZGF0ZUFwcGVuZGl4Qih2YywgYmVhbiwgY2xhenopOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKIAkJc3VwZXIudmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzKTsgLy8gY2hlY2sgYXBwbGljYXRpb24gZXhjZXB0aW9ucwogCQkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BRW50aXR5QmVhbkNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BRW50aXR5QmVhbkNsYXNzVlJ1bGUuamF2YQppbmRleCAxZjEyMTk0Li5lODc0OTA4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUVudGl0eUJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FFbnRpdHlCZWFuQ2xhc3NWUnVsZS5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUVudGl0eUJlYW5DbGFzc1ZSdWxlIGV4dGVuZHMgQUJlYW5DbGFzc1ZSdWxlIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWlzc2luZ01ldGhvZFRlbXBsYXRlID0gInswfSh7MX0pIjsgLy8kTk9OLU5MUy0xJAogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CiAJCXN1cGVyLnZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KTsKIAkJCkBAIC0zNSw3ICszNiw3IEBACiAJCVN0cmluZyBtYXRjaGluZ01ldGhvZE5hbWUgPSBJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJQT1NUQ1JFQVRFICsgbWV0aG9kLmdldE5hbWUoKS5zdWJzdHJpbmcoOSk7IC8vICJlamJDcmVhdGUiIGlzIDkgY2hhcmFjdGVycyBsb25nLCBzbyBzdHJpcCBvZmYgY2hhcmFjdGVycyAwLi44IGluY2x1c2l2ZQogCQlNZXRob2QgZWpiUG9zdENyZWF0ZU1ldGhvZCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRNZXRob2QobWV0aG9kLCBtYXRjaGluZ01ldGhvZE5hbWUsIGdldEJlYW5DbGFzc01ldGhvZHNFeHRlbmRlZChtZXRob2RzRXh0ZW5kZWRMaXN0cykpOwogCQlpZihlamJQb3N0Q3JlYXRlTWV0aG9kID09IG51bGwpIHsKLQkJCVN0cmluZyBtaXNzaW5nTWV0aG9kID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQobWlzc2luZ01ldGhvZFRlbXBsYXRlLCBuZXcgU3RyaW5nW117bWF0Y2hpbmdNZXRob2ROYW1lLCBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0UGFybXNBc1N0cmluZyhtZXRob2QpfSk7CisJCQlTdHJpbmcgbWlzc2luZ01ldGhvZCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1pc3NpbmdNZXRob2RUZW1wbGF0ZSwgbmV3IE9iamVjdFtde21hdGNoaW5nTWV0aG9kTmFtZSwgVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmdldFBhcm1zQXNTdHJpbmcobWV0aG9kKX0pOwogCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyMDUwX2VqYlBvc3RDcmVhdGUsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIG1ldGhvZCwgbmV3IFN0cmluZ1tde21pc3NpbmdNZXRob2R9LCB0aGlzKTsKIAkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7CiAJCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BRW50aXR5SG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUVudGl0eUhvbWVWUnVsZS5qYXZhCmluZGV4IDI1NGNhMjAuLjllOWJhMDMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BRW50aXR5SG9tZVZSdWxlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FFbnRpdHlIb21lVlJ1bGUuamF2YQpAQCAtMzksNiArMzksNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGVGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKIAkJaWYoIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5mb2xsb3dzRmluZGVyRXhjZXB0aW9uUnVsZXMoYmVhbiwgbWV0aG9kKSkgewogCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc3LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuSU5GTywgYmVhbiwgY2xhenosIG1ldGhvZCwgdGhpcyk7CkBAIC03OCw2ICs3OSw3IEBACiAJCX0KIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGVIb21lTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CiAJCS8vIElXQUQ0MzUwID0gVGhlIHJldHVybiB0eXBlIG11c3QgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIHswfS4gUmVhZCBzZWN0aW9uIDEyLjIuOSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgogCQkvLyBUaGUgYWJvdmUgY2hlY2sgaXMgZG9uZSBpbiB0aGUgInZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSBtZXRob2QuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FIb21lVlJ1bGUuamF2YQppbmRleCAwOWRmYzQ1Li5kMWU3NzQxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUhvbWVWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BSG9tZVZSdWxlLmphdmEKQEAgLTYyLDYgKzYyLDcgQEAKIAkJdmFsaWRhdGVBcHBlbmRpeEIodmMsIGJlYW4sIGNsYXp6KTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CiAJCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7IC8vIGNoZWNrIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMKIAkJCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUludGVyZmFjZVR5cGVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FJbnRlcmZhY2VUeXBlVlJ1bGUuamF2YQppbmRleCA4MWQ3OTAwLi4yNzAwZGZmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQUludGVyZmFjZVR5cGVWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BSW50ZXJmYWNlVHlwZVZSdWxlLmphdmEKQEAgLTkzLDYgKzkzLDcgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBsb25nIGdldEZpZWxkVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkKSB7CiAJCWlmKGZpZWxkID09IG51bGwpIHsKIAkJCXJldHVybiBFWENMVURFRF9GSUVMRDsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BS2V5Q2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FLZXlDbGFzc1ZSdWxlLmphdmEKaW5kZXggOTU4NDA3NC4uMzlhNjc5MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FLZXlDbGFzc1ZSdWxlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FLZXlDbGFzc1ZSdWxlLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBS2V5Q2xhc3NWUnVsZSBleHRlbmRzIEFUeXBlVlJ1bGUgewogCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgbG9uZ1tdIEJBU0VfVFlQRVMgPSBuZXcgbG9uZ1tde0lUeXBlQ29uc3RhbnRzLkpBVkFfTEFOR19PQkpFQ1R9OwogCQorCUBPdmVycmlkZQogCXB1YmxpYyBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewogCQlyZXR1cm4gQkFTRV9UWVBFUzsKIAl9CkBAIC01Niw2ICs1Nyw3IEBACiAJCX0KIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGxvbmcgZ2V0RmllbGRUeXBlKEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHsKIAkJaWYoZmllbGQgPT0gbnVsbCkgewogCQkJcmV0dXJuIEVYQ0xVREVEX0ZJRUxEOwpAQCAtNzIsNiArNzQsNyBAQAogCQlyZXR1cm4gTk9fTUVUSE9EUzsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBmb2xsb3dSZW1vdGVFeGNlcHRpb25SdWxlcyhFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uIHsKIAkJLy8gRG9lc24ndCBtYXR0ZXIgaWYgdGhlIGtleSBjbGFzcyB0aHJvd3MgUmVtb3RlRXhjZXB0aW9uIG9yIG5vdAogCQlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVNlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCmluZGV4IGYwMDA1ZWUuLmRmNGNhZTggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogLyoqCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlIGV4dGVuZHMgQUJlYW5DbGFzc1ZSdWxlIHsKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgdm9pZCB2YWxpZGF0ZVRyYW5zaWVudEZpZWxkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CiAJCWlmKGZpZWxkLmlzVHJhbnNpZW50KCkpIHsKIAkJCS8vIElXQUQ0MDI1ID0gVHJhbnNpZW50IGZpZWxkcyBhcmUgZGlzY291cmFnZWQuIFJlYWQgc2VjdGlvbiA3LjQuMSBvZiB0aGUgRUpCIDIuMCBzcGVjaWZpY2F0aW9uLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTdGF0ZWxlc3NIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BU3RhdGVsZXNzSG9tZVZSdWxlLmphdmEKaW5kZXggM2JmOGI4NC4uYmNhZjNhNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FTdGF0ZWxlc3NIb21lVlJ1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVN0YXRlbGVzc0hvbWVWUnVsZS5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiAgKiBAYXV0aG9yCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBU3RhdGVsZXNzSG9tZVZSdWxlIGV4dGVuZHMgQVNlc3Npb25Ib21lVlJ1bGUgeworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ3JlYXRlTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKIAkJLy8gVGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhIGNyZWF0ZSgpIG1ldGhvZC4KIAkJaWYoKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggIT0gMCkgfHwgKCFJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9DUkVBVEUuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FUeXBlVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVHlwZVZSdWxlLmphdmEKaW5kZXggM2QxMzNkYi4uOTA5NDBkOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FUeXBlVlJ1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVR5cGVWUnVsZS5qYXZhCkBAIC00NTIsNiArNDUyLDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJlc2V0KCkgewogCQlzdXBlci5yZXNldCgpOwogCQlfbWV0aG9kTGlzdCA9IE5PX01FVEhPRFM7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlQmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUJlYW4uamF2YQppbmRleCA3YTNhM2FkLi44YjI0NTNmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlQmVhbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVCZWFuLmphdmEKQEAgLTMzLDYgKzMzLDcgQEAKIAkJY29tcG9uZW50UGFyZW50cyA9IG5ldyBIYXNoU2V0KCk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJlc2V0KCkgewogCQlzdXBlci5yZXNldCgpOwogCQljb21wb25lbnRQYXJlbnRzLmNsZWFyKCk7CkBAIC03OCw2ICs3OSw3IEBACiAJCXJldHVybiBtZXRob2RzRXh0ZW5kZWRMaXN0WzJdOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewogCQkvLyBBIGJlYW4gY2xhc3MgbmVlZHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzJyBleHRlbmRlZCBtZXRob2RzOgogCQkvLyAgICAxLiBob21lCkBAIC0xMTMsNiArMTE1LDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewogCQkvLyBOZXZlciBjaGVjayB0aGF0IGEgYmVhbiBjbGFzcycgZmllbGQgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzCiAJCS8vIG9mIHRoZSBiZWFuLgpAQCAtMzA2LDYgKzMwOSw3IEBACiAJICogRmlsdGVyIG91dCBmYXVsdHkgZmllbGRzIChpLmUuLCBudWxsKSwgYW5kIGZpZWxkcyB3aGljaAogCSAqIGJlbG9uZyB0byB0aGUgYmFzZSB0eXBlLCB3aGF0ZXZlciB0aGF0IGlzLiAoZS5nLiBqYXZhLmxhbmcuT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIEZpZWxkIGZpZWxkLCBMaXN0W10gZmllbGRzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJaWYgKHN1cGVyLmlzVmFsaWQodmMsIGJlYW4sIGNsYXp6LCBmaWVsZCwgZmllbGRzRXh0ZW5kZWRMaXN0KSkgewogCQkJLy8gZXhjbHVkZSByb290IG9iamVjdCBtZXRob2RzCkBAIC0zMjIsNiArMzI2LDcgQEAKIAkgKiBGaWx0ZXIgb3V0IGZhdWx0eSBtZXRob2RzIChpLmUuLCBudWxsKSwgYW5kIG1ldGhvZHMgd2hpY2gKIAkgKiBiZWxvbmcgdG8gdGhlIGJhc2UgdHlwZSwgd2hhdGV2ZXIgdGhhdCBpcy4gKGUuZy4gamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1ZhbGlkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCWlmIChzdXBlci5pc1ZhbGlkKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0KSkgewogCQkJLy8gZXhjbHVkZSByb290IG9iamVjdCBtZXRob2RzCkBAIC0zNzMsNiArMzc4LDcgQEAKIAkgKiAgIGRlY2xhcmVkIGFzIGZpbmFsLgogCSAqLi4uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCS8vc3VwZXIucHJpbVZhbGlkYXRlKGVqYk1ldGhvZCk7CiAKQEAgLTQ2OCw2ICs0NzQsNyBAQAogCSAqICAgICBpbiBhZGRpdGlvbiB0byB0aGUgbWV0aG9kcyByZXF1aXJlZCBieSB0aGUgRUpCIHNwZWNpZmljYXRpb24uCiAJICouLi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVKQi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVKQi5qYXZhCmluZGV4IDRhNmMxOTcuLjdhODI1MDIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFSkIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRUpCLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBVmFsaWRhdGVFSkIgZXh0ZW5kcyBBVmFsaWRhdGlvblJ1bGUgewogCXByaXZhdGUgTGlzdCByb2xlTWV0aG9kTmFtZXM7CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcmVzZXQoKSB7CiAJCXN1cGVyLnJlc2V0KCk7CiAJCWlmKHJvbGVNZXRob2ROYW1lcyAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRW50aXR5QmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVudGl0eUJlYW4uamF2YQppbmRleCBiNmU0MzI1Li43ZjFkNDQ5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRW50aXR5QmVhbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFbnRpdHlCZWFuLmphdmEKQEAgLTc0LDEwICs3NCwxMiBAQAogCS8qKgogCSAqIGdldFBhcmVudE5hbWUgbWV0aG9kIGNvbW1lbnQuCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJlbnROYW1lKCkgewogCQlyZXR1cm4gSkFWQVhfRUpCX0VOVElUWUJFQU47CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzRnJhbWV3b3JrTWV0aG9kKFN0cmluZyBuYW1lKSB7CiAJCWlmIChuYW1lID09IG51bGwpIHsKIAkJCXJldHVybiBmYWxzZTsKQEAgLTEwOCw2ICsxMTAsNyBAQAogCSAqIGFuZCB0aGF0IHRoZXJlIGFyZSBubyBtaXNzaW5nIHJlcXVpcmVkIG1ldGhvZHMuCiAJICogU2VjdGlvbjogOS4yLjIKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCiAJCS8vc3VwZXIucHJpbVZhbGlkYXRlKGVqYk1ldGhvZCk7CkBAIC0xMzQsNiArMTM3LDcgQEAKIAkvKioKIAkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKIAkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwpAQCAtMTk0LDYgKzE5OCw3IEBACiAJICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCiAJICogU2VjdGlvbjogOS4yLjYKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKIApAQCAtMjM3LDYgKzI0Miw3IEBACiAJICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCiAJICogU2VjdGlvbjogOS4yLjIKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJLy8gQWxsIG9mIHRoZSBhYm92ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSBWYWxpZGF0ZUJlYW4uCiAJCXN1cGVyLnZhbGlkYXRlQ2xhc3ModmMsIGJlYW4sIGNsYXp6KTsKQEAgLTUxMSw2ICs1MTcsNyBAQAogCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgogCSAqIFNlY3Rpb246IDkuMi4yCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNZXRob2RFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdbXSBtb2RlbE9iamVjdE5hbWUgPSBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9OwogCQlpZiAoIWhhc1ZhbGlkQ29uc3RydWN0b3IgJiYgaGFzQUNvbnN0cnVjdG9yKSB7CkBAIC01NjUsNiArNTcyLDcgQEAKIAkvKgogCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3ByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCwgT2JqZWN0LCBPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBPYmplY3QgdGFyZ2V0UGFyZW50LCBPYmplY3QgdGFyZ2V0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CiAJCXN1cGVyLnByZVZhbGlkYXRlKHZjLCB0YXJnZXRQYXJlbnQsIHRhcmdldCk7CiAJCWhhc1ZhbGlkQ29uc3RydWN0b3IgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFbnRpdHlIb21lLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlRW50aXR5SG9tZS5qYXZhCmluZGV4IGU1MTczYmYuLjlhNTAyNmQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVFbnRpdHlIb21lLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUVudGl0eUhvbWUuamF2YQpAQCAtNDAsNiArNDAsNyBAQAogCQlmaW5kQnlQS01ldGhvZHMgPSBuZXcgSGFzaFNldCgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJlc2V0KCkgewogCQlzdXBlci5yZXNldCgpOwogCQlmaW5kQnlQS01ldGhvZHMuY2xlYXIoKTsKQEAgLTg1LDYgKzg2LDcgQEAKIAkgKiBUaGlzIG1ldGhvZCBjaGVja3MgdGhhdCB0aGUgZW50aXR5IGhvbWUncyBtZXRob2RzIGNvbXBseSB3aXRoIHRoZSBFSkIgMS4xIHNwZWNpZmljYXRpb24uCiAJICogU2VjdGlvbjogOS4yLjgKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBoaU1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKIAkJLy8gc3VwZXIucHJpbVZhbGlkYXRlKGhpTWV0aG9kKTsKQEAgLTEwOSw2ICsxMTEsNyBAQAogCS8qKgogCSAqIENoZWNrcyB0byBzZWUgaWYgQGVqYk1ldGhvZCBpcyBvbmUgb2YgdGhlIHJlcXVpcmVkIG1ldGhvZHMuCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAogCQkvL3N1cGVyLnZhbGlkYXRlRXhpc3RlbmNlKGVqYk1ldGhvZCk7CkBAIC0xMjEsNiArMTI0LDcgQEAKIAkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KIAkgKiBTZWN0aW9uOiA5LjIuOAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQlzdXBlci52YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7CiAJCS8vIFRoZSBzdXBlcmNsYXNzIGNoZWNrcyB0aGF0IHRoZSBob21lIGV4dGVuZHMgamF2YXguZWpiLkVKQkhvbWUsCkBAIC0xNzIsNiArMTc2LDcgQEAKIAkgKiBDaGVja3MgdGhhdCB0aGUgY3JlYXRlIG1ldGhvZCBvbiB0aGUgZW50aXR5IGhvbWUgZm9sbG93cyB0aGUgRUpCIDEuMS4gc3BlY2lmaWNhdGlvbi4KIAkgKiBTZWN0aW9uOiA5LjIuOAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ3JlYXRlTWV0aG9kX2JlYW5EZXAoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwogCQlpZiAobWV0aG9kID09IG51bGwpIHsKQEAgLTM2NSw2ICszNzAsNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGVNYXRjaGluZ0JlYW5DcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwogCkBAIC00OTIsNiArNDk4LDcgQEAKIAkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KIAkgKiBTZWN0aW9uOiA5LjIuOAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWV0aG9kRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJLy8gLSBUaGUgaG9tZSBpbnRlcmZhY2UgbXVzdCBhbHdheXMgaW5jbHVkZSB0aGUgZmluZEJ5UHJpbWFyeUtleSBtZXRob2QsIHdoaWNoIGlzIAogCQkvLyBhbHdheXMgYSBzaW5nbGUtb2JqZWN0IGZpbmRlci4gVGhlIG1ldGhvZCBtdXN0IGRlY2xhcmUgdGhlIHByaW1hcnkga2V5IGNsYXNzIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUhvbWUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVIb21lLmphdmEKaW5kZXggZGYzMDNiZC4uMGI4ZTQ2YSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUhvbWUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlSG9tZS5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiAJCXJldHVybiAoKEVudGVycHJpc2VCZWFuKXBhcmVudCkuZ2V0SG9tZUludGVyZmFjZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7CiAJCS8vIEEgaG9tZSBvciBjb21wb25lbnQgY2xhc3MgbmVlZHMgdGhlIGZvbGxvd2luZyBjbGFzc2VzJyBleHRlbmRlZCBtZXRob2RzOgogCQkvLyAgICAxLiBiZWFuIGNsYXNzCkBAIC01Myw2ICs1NCw3IEBACiAJCXJldHVybiByZXN1bHQ7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0RmllbGRzRXh0ZW5kZWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHsKIAkJLy8gTmV2ZXIgY2hlY2sgdGhhdCBhIGhvbWUgb3IgY29tcG9uZW50J3MgZmllbGQgaXMgZGVmaW5lZCBvbiBhbm90aGVyIGNsYXNzCiAJCS8vIG9mIHRoZSBiZWFuLgpAQCAtODMsNiArODUsNyBAQAogCSAqIEZpbHRlciBvdXQgZmF1bHR5IG1ldGhvZHMgKGkuZS4sIG51bGwpLCBhbmQgbWV0aG9kcyB3aGljaAogCSAqIGJlbG9uZyB0byB0aGUgYmFzZSB0eXBlLCB3aGF0ZXZlciB0aGF0IGlzLiAoZS5nLiBqYXZhLmxhbmcuT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWQoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJaWYgKHN1cGVyLmlzVmFsaWQodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpKSB7CiAJCQkvLyBFeGNsdWRlIHJvb3QgcmVtb3RlIGludGVyZmFjZSBtZXRob2RzCkBAIC0xMDMsNiArMTA2LDcgQEAKIAkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KIAkgKiBTZWN0aW9uOiA2LjEwLjYgYW5kIDkuMi44CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVLZXlDbGFzcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUtleUNsYXNzLmphdmEKaW5kZXggYzJiYmI3MC4uY2E5NTkzMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUtleUNsYXNzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZUtleUNsYXNzLmphdmEKQEAgLTQxLDEyICs0MSwxNCBAQAogCQlyZXR1cm4gKChFbnRpdHkpIHBhcmVudCkuZ2V0UHJpbWFyeUtleSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBMaXN0W10gZ2V0TWV0aG9kc0V4dGVuZGVkKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB7CiAJCS8vIE5ldmVyIGNoZWNrIHRoYXQgYSBrZXkgY2xhc3MnIG1ldGhvZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MgCiAJCS8vIG9mIHRoZSBiZWFuLgogCQlyZXR1cm4gbnVsbDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewogCQkvLyBOZXZlciBjaGVjayB0aGF0IGEga2V5IGNsYXNzJyBmaWVsZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MKIAkJLy8gb2YgdGhlIGJlYW4uCkBAIC01OCw2ICs2MCw3IEBACiAJICogRmlsdGVyIG91dCBmYXVsdHkgbWV0aG9kcyAoaS5lLiwgbnVsbCksIGFuZCBtZXRob2RzIHdoaWNoCiAJICogYmVsb25nIHRvIHRoZSBiYXNlIHR5cGUsIHdoYXRldmVyIHRoYXQgaXMuIChlLmcuIGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQlpZiAoc3VwZXIuaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCkpIHsKIAkJCS8vIGV4Y2x1ZGUgcm9vdCBvYmplY3QgbWV0aG9kcwpAQCAtNzIsNiArNzUsNyBAQAogCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgogCSAqIFNlY3Rpb246IDkuMi45CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGVDbGFzcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCXZjLnRlcm1pbmF0ZUlmQ2FuY2VsbGVkKCk7CiAKQEAgLTEwOCw2ICsxMTIsNyBAQAogCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgogCSAqIFNlY3Rpb246IDkuMi45CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGVNZXRob2RFeGlzdHMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQkvLyBUaGUgY2xhc3MgbXVzdCBwcm92aWRlIHN1aXRhYmxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBoYXNoQ29kZSgpIGFuZCAKIAkJLy8gZXF1YWxzKE9iamVjdCBvdGhlcikgbWV0aG9kcyB0byBzaW1wbGlmeSB0aGUgbWFuYWdlbWVudCBvZiB0aGUgcHJpbWFyeSBrZXlzIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZVJlbW90ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FWYWxpZGF0ZVJlbW90ZS5qYXZhCmluZGV4IGQxZjNiZDMuLmVjMGQyM2IgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9BVmFsaWRhdGVSZW1vdGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQVZhbGlkYXRlUmVtb3RlLmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIAkJcmV0dXJuICgoRW50ZXJwcmlzZUJlYW4pcGFyZW50KS5nZXRSZW1vdGVJbnRlcmZhY2UoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgTGlzdFtdIGdldE1ldGhvZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgIHsKIAkJLy8gQSBob21lIG9yIGNvbXBvbmVudCBjbGFzcyBuZWVkcyB0aGUgZm9sbG93aW5nIGNsYXNzZXMnIGV4dGVuZGVkIG1ldGhvZHM6CiAJCS8vICAgIDEuIGJlYW4gY2xhc3MKQEAgLTU2LDYgKzU3LDcgQEAKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIExpc3RbXSBnZXRGaWVsZHNFeHRlbmRlZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgewogCQkvLyBOZXZlciBjaGVjayB0aGF0IGEgaG9tZSBvciBjb21wb25lbnQncyBmaWVsZCBpcyBkZWZpbmVkIG9uIGFub3RoZXIgY2xhc3MKIAkJLy8gb2YgdGhlIGJlYW4uCkBAIC02Nyw2ICs2OSw3IEBACiAJICogRmlsdGVyIG91dCBmYXVsdHkgbWV0aG9kcyAoaS5lLiwgbnVsbCksIGFuZCBtZXRob2RzIHdoaWNoCiAJICogYmVsb25nIHRvIHRoZSBiYXNlIHR5cGUsIHdoYXRldmVyIHRoYXQgaXMuIChlLmcuIGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQlpZiAoc3VwZXIuaXNWYWxpZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCkpIHsKIAkJCS8vIEV4Y2x1ZGUgcm9vdCByZW1vdGUgaW50ZXJmYWNlIG1ldGhvZHMgCkBAIC05MCw2ICs5Myw3IEBACiAJICogQ2hlY2sgdGhlIHJlbW90ZSBpbnRlcmZhY2UncyBtZXRob2RzIGFnYWluc3QgdGhlIEVKQiAxLjEgc3BlYy4KIAkgKiBTZWN0aW9uOiA2LjEwLjUgYW5kIDkuMi43CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgcmlNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCiAJCS8vIHN1cGVyLnZhbGlkYXRlRXhpc3RlbmNlKHJpTWV0aG9kKTsKQEAgLTEwOCw2ICsxMTIsNyBAQAogCS8qKgogCSAqIENoZWNrcyB0byBzZWUgaWYgQGVqYk1ldGhvZCBpcyBvbmUgb2YgdGhlIHJlcXVpcmVkIG1ldGhvZHMuCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAogCQkvL3N1cGVyLnZhbGlkYXRlRXhpc3RlbmNlKGVqYk1ldGhvZCk7CkBAIC0xMjUsNiArMTMwLDcgQEAKIAkgKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAogCSAqIFNlY3Rpb246IDYuMTAuNSBhbmQgOS4yLjcKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKIApAQCAtMjIzLDYgKzIyOSw3IEBACiAJLyoqCiAJICogRmluYWwgY2hlY2sgdG8gc2VlIGlmIHJlcXVpcmVkIG1ldGhvZHMgd2VyZSBkZXRlY3RlZC4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCS8vVGhlcmUgYXJlIG5vIHJlcXVpcmVkIG1ldGhvZHMuCiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Fic3RyYWN0RUpCVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQWJzdHJhY3RFSkJWYWxpZGF0b3IuamF2YQppbmRleCBlYTAzZTc4Li5kNmFlZWVhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQWJzdHJhY3RFSkJWYWxpZGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQWJzdHJhY3RFSkJWYWxpZGF0b3IuamF2YQpAQCAtMTE4LDYgKzExOCw3IEBACiAJICogICAgICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuSVJlcG9ydGVyLAogCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5jb3JlLklGaWxlRGVsdGFbXSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKIAkJLy9EZWZhdWx0CiAJCXN1cGVyLnZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwpAQCAtMTkzLDEyICsxOTQsMTQgQEAKIAkJCV90YXJnZXQgPSB0OwogCQl9CiAJCQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAkJCWludCBwYXJlbnQgPSAoZ2V0VGFyZ2V0UGFyZW50KCkgPT0gbnVsbCkgPyAwIDogZ2V0VGFyZ2V0UGFyZW50KCkuaGFzaENvZGUoKTsKIAkJCWludCB0YXJnZXQgPSAoZ2V0VGFyZ2V0KCkgPT0gbnVsbCkgPyAwIDogZ2V0VGFyZ2V0KCkuaGFzaENvZGUoKTsKIAkJCXJldHVybiBwYXJlbnQgKyB0YXJnZXQ7CiAJCX0KIAkJCisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJCWlmKG8gPT0gbnVsbCkgewogCQkJCXJldHVybiBmYWxzZTsKQEAgLTMxMyw3ICszMTYsNyBAQAogICAgIAkJZ2V0VGFyZ2V0T2JqZWN0UG9vbCgpLnJlbGVhc2UodGVtcCk7CiAgICAgCX0KICAgICB9Ci0gICAgCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKICAgICAJLy9jbGVhbnVwIGhhcyBiZWVuIG1vdmVkIHRvIHRoZSB2YWxpZGF0aW9uRmluaXNoaW5nIG1ldGhvZCBiZWxvdy4gIFNlZSBidWd6aWxsYSAyOTA1ODEgZm9yIGRldGFpbHMuCiAgICAgfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0FwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IuamF2YQppbmRleCBlMWY4NDQ1Li40ZTRkYjc2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IuamF2YQpAQCAtNDQsNiArNDQsNyBAQAogIAkgKiA8cD5BbnN3ZXIgdGhlIGlkIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgd2hpY2ggaXMKICAJICogdXNlZCBieSB0aGUgcmVjZWl2ZXIuPC9wPgogIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewogCQlyZXR1cm4gQVBMSUNBVElPTkNMSUVOVF9DQVRFR09SWTsKIAl9Ly8gZ2V0QmFzZU5hbWUKQEAgLTc2LDYgKzc3LDcgQEAKIAkgKiAKIAkgKiBAdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKQogCSAgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQkKQEAgLTEzMSw2ICsxMzMsNyBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKSAKIAkgCQl0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CiAKQEAgLTE1NSw2ICsxNTgsNyBAQAogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewogCQlhcHBDbGllbnRERCA9IG51bGw7CiAJCWFwcENsaWVudEZpbGUgPSBudWxsOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUEJlYW5DbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QQmVhbkNsYXNzVlJ1bGUuamF2YQppbmRleCA1ODYwN2M5Li5jZGI3YjQ3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QQmVhbkNsYXNzVlJ1bGUuamF2YQpAQCAtMTI4LDYgKzEyOCw3IEBACiAJCXJldHVybiBNRVNTQUdFX0lEUzsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7CiAJCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7CiAJfQpAQCAtMTM5LDYgKzE0MCw3IEBACiAJcHVibGljIGZpbmFsIE9iamVjdCBnZXRJZCgpIHsKIAkJcmV0dXJuIElEOwogCX0KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkgewogCQlyZXR1cm4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRDsKIAl9CkBAIC0xNTAsMTQgKzE1MiwxNyBAQAogCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0U2hvdWxkTm90QmVTdXBlcnR5cGVzKCkgewogCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwogCX0KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUFic3RyYWN0KEphdmFDbGFzcyBjbGF6eikgewogCQlyZXR1cm4gU0hPVUxEX0JFX0FCU1RSQUNUOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUZpbmFsKEphdmFDbGFzcyBjbGF6eikgewogCQlyZXR1cm4gU0hPVUxEX0JFX0ZJTkFMOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZVB1YmxpYyhKYXZhQ2xhc3MgY2xhenopIHsKIAkJcmV0dXJuIFNIT1VMRF9CRV9QVUJMSUM7CiAJfQpAQCAtMTgwLDEwICsxODUsMTIgQEAKIAkvKgogCSAqIEBzZWUgQUJlYW5DbGFzc1ZSdWxlI2ZvbGxvd0VqYkNyZWF0ZVJldHVyblR5cGVSdWxlcyhNZXRob2QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIEphdmFIZWxwZXJzIGdldEVqYkNyZWF0ZVJldHVyblR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgewogCQlyZXR1cm4gKChFbnRpdHkpYmVhbikuZ2V0UHJpbWFyeUtleSgpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEVqYkNyZWF0ZVJldHVyblR5cGVOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHsKIAkJSmF2YUhlbHBlcnMgcmV0VHlwZSA9IGdldEVqYkNyZWF0ZVJldHVyblR5cGUoYmVhbiwgbWV0aG9kKTsKIAkJaWYocmV0VHlwZSA9PSBudWxsKSB7CkBAIC0yMTksNiArMjI2LDcgQEAKIAkJfQogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgU3RyaW5nIGdldE1hdGNoaW5nSG9tZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewogCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdHMsIHRoaXMpOwogCQkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBLZXlDbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QS2V5Q2xhc3NWUnVsZS5qYXZhCmluZGV4IGIwOTFhOGYuLjUwNDg5YjggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBLZXlDbGFzc1ZSdWxlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUEtleUNsYXNzVlJ1bGUuamF2YQpAQCAtMjYsNyArMjYsNyBAQAogICogQHZlcnNpb24gCTEuMAogICogQGF1dGhvcgogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQk1QS2V5Q2xhc3NWUnVsZSBleHRlbmRzIEFLZXlDbGFzc1ZSdWxlIGltcGxlbWVudHMgSUVKQlR5cGUsIElSZW1vdGVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBCTVBLZXlDbGFzc1ZSdWxlIGV4dGVuZHMgQUtleUNsYXNzVlJ1bGUgaW1wbGVtZW50cyBJUmVtb3RlVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfS0VZQ0xBU1M7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gREVQRU5EU19PTiA9IG51bGw7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwpAQCAtNjIsNiArNjIsNyBAQAogCQlyZXR1cm4gTUVTU0FHRV9JRFM7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewogCQkvLyBLZXkgbWV0aG9kcyBhcmUgbm90IGNoZWNrZWQgZm9yIFJlbW90ZUV4Y2VwdGlvbiwgYnV0IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgVlJ1bGVzLi4uCiAJCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUExvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQppbmRleCA2NWFmMDVlLi42NjEzZmRiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBMb2NhbENvbXBvbmVudFZSdWxlLmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKICAqIEB2ZXJzaW9uIAkxLjAKICAqIEBhdXRob3IKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJNUExvY2FsQ29tcG9uZW50VlJ1bGUgZXh0ZW5kcyBBQ29tcG9uZW50VlJ1bGUgaW1wbGVtZW50cyBJRUpCVHlwZSwgSUxvY2FsVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7CitwdWJsaWMgZmluYWwgY2xhc3MgQk1QTG9jYWxDb21wb25lbnRWUnVsZSBleHRlbmRzIEFDb21wb25lbnRWUnVsZSBpbXBsZW1lbnRzIElMb2NhbFR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBJRCA9IElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfQkVBTkNMQVNTfTsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgTUVTU0FHRV9JRFM7CkBAIC02Myw2ICs2Myw3IEBACiAJCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7CiAJfQogCSAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKIAkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QTG9jYWxIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBMb2NhbEhvbWVWUnVsZS5qYXZhCmluZGV4IGM1MjQxOTQuLjA3YWJiMTMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBMb2NhbEhvbWVWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBMb2NhbEhvbWVWUnVsZS5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAgKiBAdmVyc2lvbiAJMS4wCiAgKiBAYXV0aG9yCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCTVBMb2NhbEhvbWVWUnVsZSBleHRlbmRzIEFCTVBIb21lVlJ1bGUgaW1wbGVtZW50cyBJTG9jYWxUeXBlLCBJRUpCVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7CitwdWJsaWMgZmluYWwgY2xhc3MgQk1QTG9jYWxIb21lVlJ1bGUgZXh0ZW5kcyBBQk1QSG9tZVZSdWxlIGltcGxlbWVudHMgSUxvY2FsVHlwZSwgSU1lc3NhZ2VQcmVmaXhFamIyMENvbnN0YW50cyB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElEID0gSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUxIT01FOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W10geyBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0tFWUNMQVNTIH07CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwpAQCAtODIsNiArODIsNyBAQAogCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewogCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwogCX0KQEAgLTkwLDYgKzkxLDcgQEAKIAkJcmV0dXJuIE1FU1NBR0VfSURTOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKIAkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCmluZGV4IDY5NjcxNjcuLmVkOTVlMGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCkBAIC03MCw2ICs3MCw3IEBACiAJCXJldHVybiBNRVNTQUdFX0lEUzsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7CiAJCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7CiAJfQpAQCAtODIsNiArODMsNyBAQAogCQlyZXR1cm4gSUQ7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7CiAJCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUFJlbW90ZUhvbWVWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0JNUFJlbW90ZUhvbWVWUnVsZS5qYXZhCmluZGV4IDFlMzM5ODcuLjI2NmFiNTYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9CTVBSZW1vdGVIb21lVlJ1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQk1QUmVtb3RlSG9tZVZSdWxlLmphdmEKQEAgLTgyLDYgKzgyLDcgQEAKIAkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7CiAJCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7CiAJfQpAQCAtOTAsNiArOTEsNyBAQAogCQlyZXR1cm4gTUVTU0FHRV9JRFM7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewogCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBCZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEJlYW5DbGFzc1ZSdWxlLmphdmEKaW5kZXggNzk3YWUyMC4uY2JjMzM0ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEJlYW5DbGFzc1ZSdWxlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEJlYW5DbGFzc1ZSdWxlLmphdmEKQEAgLTE1MSw2ICsxNTEsNyBAQAogCQlyZXR1cm4gTUVTU0FHRV9JRFM7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewogCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwogCX0KQEAgLTE2Nyw2ICsxNjgsNyBAQAogCQlyZXR1cm4gU1VQRVJUWVBFUzsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVUcmFuc2llbnRGaWVsZCgpIHsKIAkJcmV0dXJuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQ7CiAJfQpAQCAtMTc1LDE0ICsxNzcsMTcgQEAKIAkJcmV0dXJuIFNIT1VMRF9OT1RfQkVfU1VQRVJUWVBFUzsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUFic3RyYWN0KEphdmFDbGFzcyBjbGF6eikgewogCQlyZXR1cm4gU0hPVUxEX0JFX0FCU1RSQUNUOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUZpbmFsKEphdmFDbGFzcyBjbGF6eikgewogCQlyZXR1cm4gU0hPVUxEX0JFX0ZJTkFMOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZVB1YmxpYyhKYXZhQ2xhc3MgY2xhenopIHsKIAkJcmV0dXJuIFNIT1VMRF9CRV9QVUJMSUM7CiAJfQpAQCAtMTk5LDYgKzIwNCw3IEBACiAJCXJldHVybiBNRVRIT0RTX1dISUNIX01VU1RfTk9UX0VYSVNUOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgSmF2YUhlbHBlcnMgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7CiAJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpYmVhbjsKIAkJaWYoVmFsaWRhdGlvblJ1bGVVdGlsaXR5LnVzZXNVbmtub3duUHJpbWFyeUtleShjbXApKSB7CkBAIC0yMTMsNiArMjE5LDcgQEAKIAkJcmV0dXJuICgoRW50aXR5KWJlYW4pLmdldFByaW1hcnlLZXkoKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIFN0cmluZyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB7CiAJCUphdmFIZWxwZXJzIHJldFR5cGUgPSBnZXRFamJDcmVhdGVSZXR1cm5UeXBlKGJlYW4sIG1ldGhvZCk7CiAJCWlmKHJldFR5cGUgPT0gbnVsbCkgewpAQCAtMjIxLDYgKzIyOCw3IEBACiAJCXJldHVybiByZXRUeXBlLmdldEphdmFOYW1lKCk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCB2b2lkIHZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKIAkJc3VwZXIudmFsaWRhdGUodmMsIGJlYW4sIGNsYXp6KTsKIAkJCkBAIC0yNTIsNiArMjYwLDcgQEAKIAkJZmlsdGVyLmNsZWFyQ2FjaGUoKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0KSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKIAkJc3VwZXIudmFsaWRhdGVFamJDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3QpOwogCQkKQEAgLTQ1Niw2ICs0NjUsNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0hvbWVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdCkgewogCQlsb25nIG1ldGhvZFR5cGUgPSBNZXRob2RVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXRob2RUeXBlSWQoYmVhbiwgY2xhenosIG1ldGhvZCwgbWV0aG9kc0V4dGVuZGVkTGlzdCwgdGhpcyk7CiAJCQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEtleUNsYXNzVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBLZXlDbGFzc1ZSdWxlLmphdmEKaW5kZXggZGNlYWI4Yi4uOGEwNzY0NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUEtleUNsYXNzVlJ1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QS2V5Q2xhc3NWUnVsZS5qYXZhCkBAIC0zMSw3ICszMSw3IEBACiAgKiBAdmVyc2lvbiAJMS4wCiAgKiBAYXV0aG9yCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDTVBLZXlDbGFzc1ZSdWxlIGV4dGVuZHMgQUtleUNsYXNzVlJ1bGUgaW1wbGVtZW50cyBJRUpCVHlwZSwgSVJlbW90ZVR5cGUsIElNZXNzYWdlUHJlZml4RWpiMjBDb25zdGFudHMgeworcHVibGljIGZpbmFsIGNsYXNzIENNUEtleUNsYXNzVlJ1bGUgZXh0ZW5kcyBBS2V5Q2xhc3NWUnVsZSBpbXBsZW1lbnRzIElSZW1vdGVUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9LRVlDTEFTUzsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBERVBFTkRTX09OID0gbmV3IE9iamVjdFtde0lWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0JFQU5DTEFTU307CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwpAQCAtNzYsNiArNzYsNyBAQAogCQlyZXR1cm4gTUVTU0FHRV9JRFM7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewogCQkvLyBLZXkgbWV0aG9kcyBhcmUgbm90IGNoZWNrZWQgZm9yIFJlbW90ZUV4Y2VwdGlvbiwgYnV0IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgVlJ1bGVzLi4uCiAJCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7CkBAIC0xMzEsNiArMTMyLDcgQEAKIAkJLy8gTm90aGluZyB0byBkby4KIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQlzdXBlci52YWxpZGF0ZSh2YywgYmVhbiwgY2xhenopOwogCkBAIC0yMDEsNiArMjAzLDcgQEAKIAkvKgogCSAqIEBzZWUgSVZhbGlkYXRpb25SdWxlI3Jlc2V0KCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCByZXNldCgpIHsKIAkJc3VwZXIucmVzZXQoKTsKIAkJaWYoX2tleUZpZWxkcyAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUExvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQppbmRleCA3ZGNhY2UxLi4yZDRkYjgyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBMb2NhbENvbXBvbmVudFZSdWxlLmphdmEKQEAgLTcwLDYgKzcwLDcgQEAKIAkJcmV0dXJuIE1FU1NBR0VfSURTOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKIAkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKIAl9CkBAIC04Miw2ICs4Myw3IEBACiAJCXJldHVybiBJRDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKIAkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QTG9jYWxIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBMb2NhbEhvbWVWUnVsZS5qYXZhCmluZGV4IDc5YWVlMjMuLmM3MDRmOGUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBMb2NhbEhvbWVWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBMb2NhbEhvbWVWUnVsZS5qYXZhCkBAIC04NSw2ICs4NSw3IEBACiAJCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewogCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwogCX0KQEAgLTkzLDYgKzk0LDcgQEAKIAkJcmV0dXJuIE1FU1NBR0VfSURTOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKIAkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCmluZGV4IDg3MTU1YjQuLmMzODkxNzMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCkBAIC04Myw2ICs4Myw3IEBACiAJCXJldHVybiBNRVNTQUdFX0lEUzsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7CiAJCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7CiAJfQpAQCAtOTUsNiArOTYsNyBAQAogCQlyZXR1cm4gSUQ7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7CiAJCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7CiAJfQpAQCAtMTI0LDYgKzEyNiw3IEBACiAJCXJldHVybiBLTk9XTl9NRVRIT0RfVFlQRVM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQlzdXBlci52YWxpZGF0ZSh2YywgYmVhbiwgY2xhenopOwogCQkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DTVBSZW1vdGVIb21lVlJ1bGUuamF2YQppbmRleCBmNDBlYzI1Li43ZWI2NGQ0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ01QUmVtb3RlSG9tZVZSdWxlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NNUFJlbW90ZUhvbWVWUnVsZS5qYXZhCkBAIC04NSw2ICs4NSw3IEBACiAJCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewogCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwogCX0KQEAgLTkzLDYgKzk0LDcgQEAKIAkJcmV0dXJuIE1FU1NBR0VfSURTOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKIAkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ2xhc3NVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ2xhc3NVdGlsaXR5LmphdmEKaW5kZXggOTc2ZDUxYy4uNmVhYjk1MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0NsYXNzVXRpbGl0eS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9DbGFzc1V0aWxpdHkuamF2YQpAQCAtMTI1LDYgKzEyNSw3IEBACiAJCS8vIElNZXRob2RUeXBlLgogCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuTE9DQUxfQ09NUE9ORU5UX0lOVEVSRkFDRTsKIAkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKIAkJCQlKYXZhSGVscGVycyBjbGF6eiA9IGdldENsYXNzKGJlYW4pOwogCQkJCWlmKGNsYXp6ID09IG51bGwpIHsKQEAgLTEzMywxMCArMTM0LDEyIEBACiAJCQkJcmV0dXJuIGNsYXp6LmdldFF1YWxpZmllZE5hbWUoKTsKIAkJCX0KIAkJCQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKIAkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuTE9DQUxfQ09NUE9ORU5UX0lOVEVSRkFDRTsKIAkJCX0KIAkJCQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0Q2xhc3MoRW50ZXJwcmlzZUJlYW4gYmVhbikgewogCQkJCWlmKGJlYW4gPT0gbnVsbCkgewogCQkJCQlyZXR1cm4gbnVsbDsKQEAgLTE1OSw2ICsxNjIsNyBAQAogCQkKIAkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLlJFTU9URV9DT01QT05FTlRfSU5URVJGQUNFOwogCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewogCQkJCUphdmFIZWxwZXJzIGNsYXp6ID0gZ2V0Q2xhc3MoYmVhbik7CiAJCQkJaWYoY2xhenogPT0gbnVsbCkgewpAQCAtMTY3LDEwICsxNzEsMTIgQEAKIAkJCQlyZXR1cm4gY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpOwogCQkJfQogCQkJCisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBsb25nIGdldElkKCkgewogCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5SRU1PVEVfQ09NUE9ORU5UX0lOVEVSRkFDRTsKIAkJCX0KIAkJCQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgSmF2YUhlbHBlcnMgZ2V0Q2xhc3MoRW50ZXJwcmlzZUJlYW4gYmVhbikgewogCQkJCWlmKGJlYW4gPT0gbnVsbCkgewogCQkJCQlyZXR1cm4gbnVsbDsKQEAgLTE5MywxMCArMTk5LDEyIEBACiAJCQogCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VOVElUWUJFQU47CiAJCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7CiAJCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRU5USVRZQkVBTjsKIAkJCX0KIAkJCQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKIAkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VOVElUWUJFQU47CiAJCQl9CkBAIC0yMDQsMTAgKzIxMiwxMiBAQAogCQogCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQkxPQ0FMSE9NRTsKIAkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKIAkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJMT0NBTEhPTUU7CiAJCQl9CiAJCQkKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7CiAJCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJMT0NBTEhPTUU7CiAJCQl9CkBAIC0yMTUsMTAgKzIyNSwxMiBAQAogCiAJCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1Q7CiAJCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7CiAJCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfRUpCTE9DQUxPQkpFQ1Q7CiAJCQl9CiAJCQkKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7CiAJCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJMT0NBTE9CSkVDVDsKIAkJCX0KQEAgLTIyNiwxMCArMjM4LDEyIEBACiAKIAkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJIT01FOwogCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewogCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX0VKQkhPTUU7CiAJCQl9CiAJCQkKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7CiAJCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJIT01FOwogCQkJfQpAQCAtMjM3LDEwICsyNTEsMTIgQEAKIAogCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX0VKQk9CSkVDVDsKIAkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKIAkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9FSkJPQkpFQ1Q7CiAJCQl9CiAJCQkKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7CiAJCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9FSkJPQkpFQ1Q7CiAJCQl9CkBAIC0yNDgsMTAgKzI2NCwxMiBAQAogCiAJCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBX0xBTkdfT0JKRUNUOwogCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewogCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQV9MQU5HX09CSkVDVDsKIAkJCX0KIAkJCQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKIAkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQV9MQU5HX09CSkVDVDsKIAkJCX0KQEAgLTI1OSwxMCArMjc3LDEyIEBACiAKIAkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9NRVNTQUdFRFJJVkVOQkVBTjsKIAkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKIAkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9NRVNTQUdFRFJJVkVOQkVBTjsKIAkJCX0KIAkJCQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgbG9uZyBnZXRJZCgpIHsKIAkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuSkFWQVhfRUpCX01FU1NBR0VEUklWRU5CRUFOOwogCQkJfQpAQCAtMjcwLDEwICsyOTAsMTIgQEAKIAogCQlfY2xhc3NUeXBlSW5kZXhbY291bnRdID0gSVR5cGVDb25zdGFudHMuSkFWQVhfSk1TX01FU1NBR0VMSVNURU5FUjsKIAkJX2NsYXNzTmFtZXNbY291bnQrK10gPSBuZXcgQUNsYXNzVHlwZSgpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyBnZXROYW1lKEVudGVycHJpc2VCZWFuIGJlYW4pIHsKIAkJCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0pNU19NRVNTQUdFTElTVEVORVI7CiAJCQl9CiAJCQkKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7CiAJCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0pNU19NRVNTQUdFTElTVEVORVI7CiAJCQl9CkBAIC0yODEsMTAgKzMwMywxMiBAQAogCiAJCV9jbGFzc1R5cGVJbmRleFtjb3VudF0gPSBJVHlwZUNvbnN0YW50cy5KQVZBWF9FSkJfU0VTU0lPTkJFQU47CiAJCV9jbGFzc05hbWVzW2NvdW50KytdID0gbmV3IEFDbGFzc1R5cGUoKSB7CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7CiAJCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkNMQVNTTkFNRV9KQVZBWF9FSkJfU0VTU0lPTkJFQU47CiAJCQl9CiAJCQkKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7CiAJCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9TRVNTSU9OQkVBTjsKIAkJCX0KQEAgLTI5MiwxMCArMzE2LDEyIEBACiAKIAkJX2NsYXNzVHlwZUluZGV4W2NvdW50XSA9IElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OOwogCQlfY2xhc3NOYW1lc1tjb3VudCsrXSA9IG5ldyBBQ2xhc3NUeXBlKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbikgewogCQkJCXJldHVybiBJVHlwZUNvbnN0YW50cy5DTEFTU05BTUVfSkFWQVhfRUpCX1NFU1NJT05TWU5DSFJPTklaQVRJT047CiAJCQl9CiAJCQkKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIGxvbmcgZ2V0SWQoKSB7CiAJCQkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLkpBVkFYX0VKQl9TRVNTSU9OU1lOQ0hST05JWkFUSU9OOwogCQkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Nvbm5lY3RvclZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0Nvbm5lY3RvclZhbGlkYXRvci5qYXZhCmluZGV4IGNjMjQ5MDMuLjRmM2Q4ZjQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Db25uZWN0b3JWYWxpZGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vQ29ubmVjdG9yVmFsaWRhdG9yLmphdmEKQEAgLTQ0LDggKzQ0LDkgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC52YWxpZGF0aW9uLkoyRUVWYWxpZGF0b3IjZ2V0QmFzZU5hbWUoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7Ci0JCXJldHVybiAicmFydmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLnJhcnZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCiAJfQogCS8qKgogCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29ubmVjdG9yREQuCkBAIC04MCw2ICs4MSw3IEBACiAJICogCiAJICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQl2YWxpZGF0ZUluSm9iKGluSGVscGVyLCBpblJlcG9ydGVyKTsJCQogCX0JCkBAIC0xMDUsNiArMTA3LDcgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbnsKIAkKIAkJc3VwZXIudmFsaWRhdGVJbkpvYihoZWxwZXIsIHJlcG9ydGVyKTsKQEAgLTEzMSw2ICsxMzQsNyBAQAogCQlyZXR1cm4gc3RhdHVzOwkJCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKIAkJcmFyRmlsZSA9IG51bGw7CiAJCWNvbm5lY3RvckREID0gbnVsbDsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9EdXBsaWNhdGVzVGFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9EdXBsaWNhdGVzVGFibGUuamF2YQppbmRleCBjYjFjNjM4Li43MTBlY2E1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRHVwbGljYXRlc1RhYmxlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0R1cGxpY2F0ZXNUYWJsZS5qYXZhCkBAIC0xNDcsNiArMTQ3LDcgQEAKIAkJcmV0dXJuIGdldEVsZW1lbnRzKFVOSVFVRSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgY2xlYXIoKSB7CiAJCXN1cGVyLmNsZWFyKCk7CiAJCWlmKF9kdXBsaWNhdGVzICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLmphdmEKaW5kZXggMWU0YzY2My4uMTZlNjMzZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLmphdmEKQEAgLTE1LDcgKzE1LDcgQEAKIAogcHVibGljIGNsYXNzIEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTkxTIHsKIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJlYXJ2YWxpZGF0aW9uIjsvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uZWFydmFsaWRhdGlvbiI7Ly8kTk9OLU5MUy0xJAogCiAJcHJpdmF0ZSBFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlcigpIHsKIAkJLy8gRG8gbm90IGluc3RhbnRpYXRlCkBAIC03Nyw2ICs3Nyw5IEBACiAJcHVibGljIHN0YXRpYyBTdHJpbmcgQ0xBU1NQQVRIX0NPTVBPTkVOVF9VUklfTUFUQ0hFU19BUkNISVZFX1VSSTsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBEVVBMSUNBVEVfQ0xBU1NQQVRIX0NPTVBPTkVOVF9VUkk7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgSkVFNV9QUk9KRUNUX1JFRkVSRU5DRURfQllfUFJFX0pFRTVfRUFSOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVhclZhbGlkYXRvcl9WYWxpZGF0aW5nX01vZHVsZV87CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRWFyVmFsaWRhdG9yX1ZhbGlkYXRpbmdfUmVmXzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uUnVsZVV0aWxpdHlfaW52YWxpZF9wYXJhbWV0ZXJfamF2YUNsYXNzTmFtZV87CiAKIAogCXN0YXRpYyB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCRXh0MjBWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkV4dDIwVlJ1bGUuamF2YQppbmRleCAwODFjMzFhLi4zYmM3YmU3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCRXh0MjBWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJFeHQyMFZSdWxlLmphdmEKQEAgLTIzNSw3ICsyMzUsNyBAQAogCQkJaWYgKHN1cGVydHlwZSBpbnN0YW5jZW9mIEVudGl0eSkgewogCQkJCXBhcmVudEtleSA9ICgoRW50aXR5KSBzdXBlcnR5cGUpLmdldFByaW1hcnlLZXkoKTsKIAotCQkJCWlmICgodGhpc0tleSA9PSBudWxsKSB8fCAocGFyZW50S2V5ID09IG51bGwpIHx8ICF0aGlzS2V5LmVxdWFscyhwYXJlbnRLZXkpKSB7CisJCQkJaWYgKCh0aGlzS2V5ID09IG51bGwpIHx8ICF0aGlzS2V5LmVxdWFscyhwYXJlbnRLZXkpKSB7CiAJCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSBuZXcgU3RyaW5nW10geyBiZWFuLmdldE5hbWUoKSwgcGFyZW50S2V5LmdldFF1YWxpZmllZE5hbWUoKX07CiAJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSUVKQlZhbGlkYXRvck1lc3NhZ2VDb25zdGFudHMuQ0hLSjIxMDYsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgbXNnUGFybSwgdGhpcyk7CiAJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMTFWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkphcjExVlJ1bGUuamF2YQppbmRleCBjZWM3Y2Y5Li42MjMyMzM3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMTFWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJKYXIxMVZSdWxlLmphdmEKQEAgLTIyMCw2ICsyMjAsNyBAQAogCQkJCV9yb2xlID0gcm9sZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJCQlpZiAobyBpbnN0YW5jZW9mIFJvbGVXcmFwcGVyKSB7CiAJCQkJCVJvbGVXcmFwcGVyIG90aGVyID0gKFJvbGVXcmFwcGVyKSBvOwpAQCAtMjI3LDYgKzIyOCwxMSBAQAogCQkJCX0KIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKSArIF9yb2xlLmdldFJvbGVOYW1lKCkuaGFzaENvZGUoKTsKKwkJCX0KIAogCQkJcHVibGljIFNlY3VyaXR5Um9sZSBnZXRSb2xlKCkgewogCQkJCXJldHVybiBfcm9sZTsKQEAgLTM5OCw2ICs0MDQsNyBAQAogCQl2YWxpZGF0ZUNsaWVudEpBUih2YywgZWpiSmFyKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcmVzZXQoKSB7CiAJCXN1cGVyLnJlc2V0KCk7CiAJCV9lamJOYW1lLmNsZWFyKCk7CkBAIC01NTcsNiArNTY0LDcgQEAKIAkJCV9iZWFuID0gYmVhbjsKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJCWlmIChvIGluc3RhbmNlb2YgRWpiTmFtZVdyYXBwZXIpIHsKIAkJCQlFamJOYW1lV3JhcHBlciBvdGhlciA9IChFamJOYW1lV3JhcHBlcilvOwpAQCAtNTc0LDYgKzU4Miw3IEBACiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJCisJCUBPdmVycmlkZQogCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCQkJaWYoKGdldEJlYW4oKSAhPSBudWxsKSAmJiAoZ2V0QmVhbigpLmdldE5hbWUoKSAhPSBudWxsKSkgewogCQkJCXJldHVybiBnZXRCZWFuKCkuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMjBWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQkphcjIwVlJ1bGUuamF2YQppbmRleCAwNWM3MmJjLi5kMjMxZGI4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCSmFyMjBWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJKYXIyMFZSdWxlLmphdmEKQEAgLTE1Nyw2ICsxNTcsNyBAQAogCS8qCiAJICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcmVzZXQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJlc2V0KCkgewogCQlzdXBlci5yZXNldCgpOwogCQlfZWpiTmFtZS5jbGVhcigpOwpAQCAtMjY0LDE3ICsyNjUsMjEgQEAKIAkJCX0KIAkJCWNhdGNoKFZhbGlkYXRpb25FeGNlcHRpb24gZXhjKSB7CiAJCQkJLy8gc29tZXRoaW5nIGdvZXMgd3JvbmcsIGp1c3QgcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGJlYW4KLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODUyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUsIGJlYW4uZ2V0TmFtZSgpfSwgdGhpcyk7Ci0JCQkJdmMuYWRkTWVzc2FnZShtZXNzYWdlKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKKwkJCQlpZihiZWFuICE9IG51bGwpeworCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElFSkJWYWxpZGF0b3JNZXNzYWdlQ29uc3RhbnRzLkNIS0oyODUyLCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuV0FSTklORywgYmVhbiwgbmV3IFN0cmluZ1tde0oyRUVDb25zdGFudHMuRUpCSkFSX0REX1NIT1JUX05BTUUsIGJlYW4uZ2V0TmFtZSgpfSwgdGhpcyk7CisJCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7CisJCQkJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgeworCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FLCBiZWFuLmdldE5hbWUoKX0sIHRoaXMpOwotCQkJCXZjLmFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7CisJCQkJaWYoYmVhbiAhPSBudWxsKXsKKwkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJRUpCVmFsaWRhdG9yTWVzc2FnZUNvbnN0YW50cy5DSEtKMjg1MiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIG5ldyBTdHJpbmdbXXtKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9TSE9SVF9OQU1FLCBiZWFuLmdldE5hbWUoKX0sIHRoaXMpOworCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOworCQkJCQlpZiAobG9nZ2VyICE9IG51bGwgJiYgbG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKKwkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTMzNSw2ICszNDAsNyBAQAogCQkJCV9yb2xlID0gcm9sZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJCQlpZiAobyBpbnN0YW5jZW9mIFJvbGVXcmFwcGVyKSB7CiAJCQkJCVJvbGVXcmFwcGVyIG90aGVyID0gKFJvbGVXcmFwcGVyKSBvOwpAQCAtMzQzLDYgKzM0OSwxMSBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQkJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpICsgX3JvbGUuZ2V0Um9sZU5hbWUoKS5oYXNoQ29kZSgpOworCQkJfQorCQkJCiAJCQlwdWJsaWMgU2VjdXJpdHlSb2xlIGdldFJvbGUoKSB7CiAJCQkJcmV0dXJuIF9yb2xlOwogCQkJfQpAQCAtNzEzLDYgKzcyNCw3IEBACiAJCQlfYmVhbiA9IGJlYW47CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCQlpZiAobyBpbnN0YW5jZW9mIEFTTmFtZVdyYXBwZXIpIHsKIAkJCQlBU05hbWVXcmFwcGVyIG90aGVyID0gKEFTTmFtZVdyYXBwZXIpbzsKQEAgLTczMCw2ICs3NDIsNyBAQAogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJCQlpZigoZ2V0QmVhbigpICE9IG51bGwpICYmIChnZXRCZWFuKCkuZ2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgIT0gbnVsbCkpIHsKIAkJCQlyZXR1cm4gZ2V0QmVhbigpLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpLmhhc2hDb2RlKCk7CkBAIC03NTgsNiArNzcxLDcgQEAKIAkJCV9iZWFuID0gYmVhbjsKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJCWlmIChvIGluc3RhbmNlb2YgRWpiTmFtZVdyYXBwZXIpIHsKIAkJCQlFamJOYW1lV3JhcHBlciBvdGhlciA9IChFamJOYW1lV3JhcHBlcilvOwpAQCAtNzc1LDYgKzc4OSw3IEBACiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJCisJCUBPdmVycmlkZQogCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCQkJaWYoKGdldEJlYW4oKSAhPSBudWxsKSAmJiAoZ2V0QmVhbigpLmdldE5hbWUoKSAhPSBudWxsKSkgewogCQkJCXJldHVybiBnZXRCZWFuKCkuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7CkBAIC04MDMsNiArODE4LDcgQEAKIAkJCV9yZWxhdGlvbiA9IHJlbDsKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJCWlmIChvIGluc3RhbmNlb2YgRUpCUmVsYXRpb25OYW1lV3JhcHBlcikgewogCQkJCUVKQlJlbGF0aW9uTmFtZVdyYXBwZXIgb3RoZXIgPSAoRUpCUmVsYXRpb25OYW1lV3JhcHBlcilvOwpAQCAtODIwLDYgKzgzNiw3IEBACiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJCisJCUBPdmVycmlkZQogCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCQkJaWYoKGdldFJlbGF0aW9uKCkgIT0gbnVsbCkgJiYgKGdldFJlbGF0aW9uKCkuZ2V0TmFtZSgpICE9IG51bGwpKSB7CiAJCQkJcmV0dXJuIGdldFJlbGF0aW9uKCkuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7CkBAIC04NDgsNiArODY1LDcgQEAKIAkJCV9yZWxhdGlvbnNoaXBSb2xlID0gcm9sZTsKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJCWlmIChvIGluc3RhbmNlb2YgRUpCUmVsYXRpb25zaGlwUm9sZU5hbWVXcmFwcGVyKSB7CiAJCQkJRUpCUmVsYXRpb25zaGlwUm9sZU5hbWVXcmFwcGVyIG90aGVyID0gKEVKQlJlbGF0aW9uc2hpcFJvbGVOYW1lV3JhcHBlcilvOwpAQCAtODY1LDYgKzg4Myw3IEBACiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJCisJCUBPdmVycmlkZQogCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogCQkJaWYoKGdldFJlbGF0aW9uc2hpcFJvbGUoKSAhPSBudWxsKSAmJiAoZ2V0UmVsYXRpb25zaGlwUm9sZSgpLmdldFJvbGVOYW1lKCkgIT0gbnVsbCkpIHsKIAkJCQlyZXR1cm4gZ2V0UmVsYXRpb25zaGlwUm9sZSgpLmdldFJvbGVOYW1lKCkuaGFzaENvZGUoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuamF2YQppbmRleCBiM2MzNzNiLi4xZDdlNGEzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRpb25SdWxlRmFjdG9yeS5qYXZhCkBAIC00NCw2ICs0NCw3IEBACiAJCX0KIAkJcmV0dXJuIF9pbnN0OwogCX0KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpewogCSAgICBpZihsb2dnZXIgPT0gbnVsbCkKIAkgICAgICAgIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoSUVKQlZhbGlkYXRvckNvbnN0YW50cy5KMkVFX0NPUkVfUExVR0lOKTsKQEAgLTM3Niw2ICszNzcsNyBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIElWYWxpZGF0aW9uUnVsZSBnZXRSdWxlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHJ1bGVJZCkgewogCQlNYXAgcnVsZU1hcCA9IChNYXApIGNvbnRleHRNYXAuZ2V0KHZjLmdldFJlcG9ydGVyKCkpOwogCQlpZihydWxlTWFwID09IG51bGwpewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VKQlZhbGlkYXRvci5qYXZhCmluZGV4IDc1MjVlNzEuLmJlOTQ5NWEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FSkJWYWxpZGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRUpCVmFsaWRhdG9yLmphdmEKQEAgLTYwLDYgKzYwLDcgQEAKIAkgICAgcmV0dXJuIGxvZ0VudHJ5OwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEJhc2VOYW1lKCkgewogCQlyZXR1cm4gImVqYnZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC05NSwxMiArOTYsMTQgQEAKIAl9CQogCQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQljb21tb25WYWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKIAl9CiAJLyoKIAkgKiBAc2VlIElWYWxpZGF0b3IjdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0LCBJUmVwb3J0ZXIsIElGaWxlRGVsdGFbXSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQljb21tb25WYWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKIAkJcmV0dXJuIHN0YXR1czsKQEAgLTE2NCw2ICsxNjcsNyBAQAogCQogCQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGxvZ01pc3NpbmdSdWxlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHJ1bGVJZCkgewogCQlMb2dnZXIgbG9nZ2VyID0gdmMuZ2V0TXNnTG9nZ2VyKCk7CiAJCWlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewpAQCAtMTcyLDYgKzE3Niw3IEBACiAJCWFkZEludGVybmFsRXJyb3JNZXNzYWdlKHZjKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcHJlUmVtb3ZlT2xkTWVzc2FnZXMoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBNYXAgdGFyZ2V0cykgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQlMaXN0IHZhbGlkYXRlZENsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCQpAQCAtMjYxLDggKzI2Niw5IEBACiAJCQkJCUlWYWxpZGF0aW9uUnVsZSBlamJKYXJSdWxlID0gRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5nZXRSdWxlKHZjLCBpZCk7CiAJCQkJCWlmKGVqYkphclJ1bGUgPT0gbnVsbCkgewogCQkJCQkJbG9nTWlzc2luZ1J1bGUodmMsIGlkKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNldFZhbGlkYXRlZChlamJKYXJSdWxlLmdldElkKCksIG51bGwsIGVqYkphcik7CiAJCQkJCX0KLQkJCQkJc2V0VmFsaWRhdGVkKGVqYkphclJ1bGUuZ2V0SWQoKSwgbnVsbCwgZWpiSmFyKTsKIAkJCQl9CiAJCQl9CiAJCQkKQEAgLTM2Niw2ICszNzIsNyBAQAogCQl9CiAJfQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgcmVtb3ZlT2xkTWVzc2FnZXNTdHJpbmcoKSB7CiAJCXJldHVybiBFSkJWYWxpZGF0b3JNb2RlbEVudW0uUkVNT1ZFX09MRF9NRVNTQUdFUzsKIAl9CkBAIC00OTcsNiArNTA0LDcgQEAKIAkJfQogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgVGFyZ2V0T2JqZWN0UG9vbCBnZXRUYXJnZXRPYmplY3RQb29sKCkgewogCQlpZihfdGFyZ2V0T2JqZWN0UG9vbFNpbmdsZXRvbiA9PSBudWxsKSB7CiAJCQlfdGFyZ2V0T2JqZWN0UG9vbFNpbmdsZXRvbiA9IG5ldyBUYXJnZXRPYmplY3RQb29sKDEwMCk7CkBAIC01MDcsMjEgKzUxNSwyMyBAQAogICAgIC8qIChub24tSmF2YWRvYykKICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uQWJzdHJhY3RFSkJWYWxpZGF0b3IjcmVsZWFzZVJ1bGVzKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZGVsLnZhbGlkYXRpb24uZWpiLklWYWxpZGF0aW9uUnVsZSkKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWxlYXNlUnVsZXMoSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCByZWxlYXNlUnVsZXMoSVZhbGlkYXRpb25SdWxlIHJ1bGUpIHsKICAgICAgICAgRUpCVmFsaWRhdGlvblJ1bGVGYWN0b3J5LmdldEZhY3RvcnkoKS5yZWxlYXNlKHJ1bGUpOwogICAgICAgICAKICAgICB9CiAKIAlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpewogCQkvLyBjbGVhciB0aGUgbWFwIHdoZW4gdGhlIGVqYiB2YWxpZGF0b3IgaXMgZG9uZSBzZWUgYnVnIDE4NzI4NgogCQlFSkJWYWxpZGF0aW9uUnVsZUZhY3RvcnkuZ2V0RmFjdG9yeSgpLmNsZWFyUnVsZU1hcChyZXBvcnRlcik7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGlvbkZpbmlzaGluZyhJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCQlIYXNoTWFwIGhlbHBlck1hcCA9IFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRIZWxwZXJNYXAocHJvamVjdCk7CiAJCWhlbHBlck1hcC5jbGVhcigpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VhclZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VhclZhbGlkYXRvci5qYXZhCmluZGV4IGE0ODhhOTcuLjFmZjBhODIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FYXJWYWxpZGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRWFyVmFsaWRhdG9yLmphdmEKQEAgLTY0LDYgKzY0LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47CiAKIAogLyoqCkBAIC0xMDcsNiArMTA5LDcgQEAKIAkgKiAKIAkgKiBAcmV0dXJuIFN0cmluZwogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7CiAJCXJldHVybiBFQVJfQ0FURUdPUlk7CiAJfS8vIGdldEJhc2VOYW1lCkBAIC0xMjgsMTAgKzEzMSwxMiBAQAogCS8qKgogCSAqIERvZXMgdGhlIHZhbGlkYXRpb24KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CiAJCXZhbGlkYXRlSW5Kb2IoIGluSGVscGVyLCBpblJlcG9ydGVyICk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzICB2YWxpZGF0ZUluSm9iKCBJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyICkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQkJCQogCQlpblJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMpOwpAQCAtMzE4LDcgKzMyMyw3IEBACiAJICovCiAJcHVibGljIHZvaWQgdmFsaWRhdGVNb2R1bGVzKEVMaXN0IG1vZHVsZXNMaXN0KSB7CiAvLwkJU3RyaW5nIGVycm9yU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSU1lc3NhZ2UgbXNnID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCAiVmFsaWRhdGluZyBNb2R1bGVzIik7CisJCUlNZXNzYWdlIG1zZyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuRWFyVmFsaWRhdG9yX1ZhbGlkYXRpbmdfTW9kdWxlXyk7CiAJCV9yZXBvcnRlci5kaXNwbGF5U3VidGFzayggdGhpcywgbXNnICk7CiAJCQogCQkKQEAgLTM4NCw3ICszODksNyBAQAogCSAqLwogCXB1YmxpYyB2b2lkIHZhbGlkYXRlUmVmcygpIHsKIAkJCi0JCUlNZXNzYWdlIG1zZyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgIlZhbGlkYXRpbmcgUmVmcyIpOworCQlJTWVzc2FnZSBtc2cgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLkVhclZhbGlkYXRvcl9WYWxpZGF0aW5nX1JlZl8pOwogCQlfcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2soIHRoaXMsIG1zZyApOwogCQkKIAkJCkBAIC00MTgsNyArNDIzLDcgQEAKIAkgICAgZWpiUmVmcy5hZGRBbGwoYXBwQ2xpZW50LmdldEVqYlJlZmVyZW5jZXMoKSk7CiAJCXZhbGlkYXRlRUpCUmVmTWFuZGF0b3J5RWxlbWVudHMoZWpiUmVmcywgcmVmLmdldFVyaSgpKTsKIAkJdmFsaWRhdGVFSkJSZWZzKGVqYlJlZnMsIHJlZi5nZXRVcmkoKSk7Ci0JCWlmIChhcHBDbGllbnQgIT0gbnVsbCAmJiBhcHBDbGllbnQuZ2V0VmVyc2lvbklEKCkgPD0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpIHsKKwkJaWYgKGFwcENsaWVudC5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkgewogCQkJU2V0IGFsbFJlZnMgPSBuZXcgSGFzaFNldCgpOwogCQkJTGlzdCByZXNvdXJjZVJlZnMgPSBhcHBDbGllbnQuZ2V0UmVzb3VyY2VSZWZzKCk7CiAJCQlMaXN0IHJlc291cmNlRW52UmVmcyA9IGFwcENsaWVudC5nZXRSZXNvdXJjZUVudlJlZnMoKTsKQEAgLTQ0Myw3ICs0NDgsNyBAQAogCSAgICBlamJSZWZzLmFkZEFsbCh3ZWJBcHAuZ2V0RWpiTG9jYWxSZWZzKCkpOwogCQl2YWxpZGF0ZUVKQlJlZk1hbmRhdG9yeUVsZW1lbnRzKGVqYlJlZnMsIHJlZi5nZXRVcmkoKSk7CiAJCXZhbGlkYXRlRUpCUmVmcyhlamJSZWZzLCByZWYuZ2V0VXJpKCkpOwotCQlpZiAod2ViQXBwICE9IG51bGwgJiYgd2ViQXBwLmdldFZlcnNpb25JRCgpIDw9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQpIHsKKwkJaWYgKHdlYkFwcC5nZXRWZXJzaW9uSUQoKSA8PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEKSB7CiAJCQlTZXQgYWxsUmVmcyA9IG5ldyBIYXNoU2V0KCk7CiAJCQlMaXN0IHJlc291cmNlUmVmcyA9IHdlYkFwcC5nZXRSZXNvdXJjZVJlZnMoKTsKIAkJCUxpc3QgcmVzb3VyY2VFbnZSZWZzID0gd2ViQXBwLmdldFJlc291cmNlRW52UmVmcygpOwpAQCAtNDYzLDcgKzQ2OCw3IEBACiAJCUVKQkphciBlamJKYXIgPSAoRUpCSmFyKXJlZi5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwogCQlpZiggZWpiSmFyICE9IG51bGwgKSB7CiAJCQlMaXN0IGVqYkNvbGxlY3Rpb24gPSBlamJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7CQkJCi0JCQlpZiggZWpiQ29sbGVjdGlvbiAhPSBudWxsIHx8ICFlamJDb2xsZWN0aW9uLmlzRW1wdHkoKSApIHsKKwkJCWlmKCBlamJDb2xsZWN0aW9uICE9IG51bGwgJiYgIWVqYkNvbGxlY3Rpb24uaXNFbXB0eSgpICkgewogCQkJCVJlc291cmNlIHJlcyA9IGVqYkphci5lUmVzb3VyY2UoKTsKIAkJCQljbGVhblVwQWxsUmVmU3ViVGFza01lc3NhZ2VzKHJlcyk7CiAJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlamJDb2xsZWN0aW9uLml0ZXJhdG9yKCk7CQpAQCAtNjc5LDI1ICs2ODQsMTkgQEAKIAkJCXdoaWxlKCBpdGVyYXRvci5oYXNOZXh0KCkgKSB7CiAJCSAgCQlNb2R1bGUgbW9kdWxlID0gKE1vZHVsZSlpdGVyYXRvci5uZXh0KCk7CiAJCSAgCQlpZiggbW9kdWxlLmlzV2ViTW9kdWxlKCkgKSB7Ci0JCSAgCQkJCiAJCSAgCQkJV2ViTW9kdWxlIHdlYk1vZHVsZSA9IChXZWJNb2R1bGUpbW9kdWxlOwotCQkJICAJCQkKLQkJCSAgCQlpZiggd2ViTW9kdWxlICE9IG51bGwgKSB7Ci0JCQkgIAkJCWlmKCB2aXNpdGVkV2ViQ29udGV4dC5jb250YWluc0tleSggd2ViTW9kdWxlLmdldENvbnRleHRSb290KCkgKSApIHsKLQkJCSAgCQkJCVdlYk1vZHVsZSB0ZW1wV2ViTW9kdWxlID0gKFdlYk1vZHVsZSl2aXNpdGVkV2ViQ29udGV4dC5nZXQoIHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpICk7Ci0JCQkJCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1szXTsKLQkJCQkJCQlwYXJhbXNbMF0gPSB3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKTsKLQkJCQkJCQlwYXJhbXNbMV0gPSB3ZWJNb2R1bGUuZ2V0VXJpKCk7Ci0JCQkJCQkJcGFyYW1zWzJdID0gdGVtcFdlYk1vZHVsZS5nZXRVcmkoKTsKLQkJCQkJCQlTdHJpbmcgdG1wID0gTkxTLmJpbmQoRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuTUVTU0FHRV9FQVJfRFVQSUNBVEVfUk9PVENPTlRFWFRfRVJST1JfLCBwYXJhbXMpOwotCQkJCQkJCQotCQkJICAJCQkJYWRkTG9jYWxpemVkRXJyb3IodG1wLCBhcHBERCk7Ci0JCQkgIAkJCX0gZWxzZSB7Ci0JCQkgIAkJCQl2aXNpdGVkV2ViQ29udGV4dC5wdXQoIHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpLCB3ZWJNb2R1bGUgKTsKLQkJCSAgCQkJfS8vIGlmCi0JCQkgIAkJCQkKLQkJCSAgCQl9Ly8gaWYKLQkJICAJCQkKKwkJCSAgCQlpZiggdmlzaXRlZFdlYkNvbnRleHQuY29udGFpbnNLZXkoIHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpICkgKSB7CisJCSAgCQkJCVdlYk1vZHVsZSB0ZW1wV2ViTW9kdWxlID0gKFdlYk1vZHVsZSl2aXNpdGVkV2ViQ29udGV4dC5nZXQoIHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpICk7CisJCQkJCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzNdOworCQkJCQkJcGFyYW1zWzBdID0gd2ViTW9kdWxlLmdldENvbnRleHRSb290KCk7CisJCQkJCQlwYXJhbXNbMV0gPSB3ZWJNb2R1bGUuZ2V0VXJpKCk7CisJCQkJCQlwYXJhbXNbMl0gPSB0ZW1wV2ViTW9kdWxlLmdldFVyaSgpOworCQkJCQkJU3RyaW5nIHRtcCA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLk1FU1NBR0VfRUFSX0RVUElDQVRFX1JPT1RDT05URVhUX0VSUk9SXywgcGFyYW1zKTsKKwkJCQkJCQorCQkgIAkJCQlhZGRMb2NhbGl6ZWRFcnJvcih0bXAsIGFwcEREKTsKKwkJICAJCQl9IGVsc2UgeworCQkgIAkJCQl2aXNpdGVkV2ViQ29udGV4dC5wdXQoIHdlYk1vZHVsZS5nZXRDb250ZXh0Um9vdCgpLCB3ZWJNb2R1bGUgKTsKKwkJICAJCQl9Ly8gaWYKIAkJICAJCX0vLyBpZgogCQkJfS8vIHdoaWxlCiAJICAJfS8vIGlmCkBAIC03NTksNyArNzU4LDcgQEAKIAkJCQkJaWYoIGVqYkphciAhPSBudWxsICkgewogCQkJCQkJcmVtb3ZlQWxsTWVzc2FnZXMoZWpiSmFyLE1FU1NBR0VfREVTVElOQVRJT05fTURCX1JFRl9HUk9VUF9OQU1FKTsKIAkJCQkJCUxpc3QgZWpiQ29sbGVjdGlvbiA9IGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsJCQkKLQkJCQkJCWlmKCBlamJDb2xsZWN0aW9uICE9IG51bGwgfHwgIWVqYkNvbGxlY3Rpb24uaXNFbXB0eSgpICkgeworCQkJCQkJaWYoIGVqYkNvbGxlY3Rpb24gIT0gbnVsbCAmJiAhZWpiQ29sbGVjdGlvbi5pc0VtcHR5KCkgKSB7CiAJCQkJCQkgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBlamJDb2xsZWN0aW9uLml0ZXJhdG9yKCk7CQogCQkJCQkJCXdoaWxlKCBpdGVyYXRvci5oYXNOZXh0KCkgKSB7CiAJCQkJCQkJCUVudGVycHJpc2VCZWFuIGVqYkJlYW4gPSAoRW50ZXJwcmlzZUJlYW4paXRlcmF0b3IubmV4dCgpOwpAQCAtODQzLDcgKzg0Miw3IEBACiAJCQlpZihuZXN0ZWRFeGNlcHRpb24gaW5zdGFuY2VvZiBOb01vZHVsZUZpbGVFeGNlcHRpb24pewogCQkJCS8vRUFUIElUIGJlY2F1c2UgYSBtb2R1bGUgcHJvamVjdCBoYXMgYmVlbiBjbG9zZWQgb3IgZGVsZXRlZAkJCQkKIAkJCX0gZWxzZSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJfQogCQl9CiAJCWZvciAoaW50IHJlZk5vID0gMDsgcmVmTm8gPCBkZXN0aW5hdGlvbnNSZWZzLnNpemUoKTsgcmVmTm8rKykgewpAQCAtOTI0LDcgKzkyMyw3IEBACiAJCUxpc3QgZWpiTWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJaWYoIGVqYkphciAhPSBudWxsICkgewogCQkJTGlzdCBlamJDb2xsZWN0aW9uID0gZWpiSmFyLmdldEVudGVycHJpc2VCZWFucygpOwkJCQotCQkJaWYoIGVqYkNvbGxlY3Rpb24gIT0gbnVsbCB8fCAhZWpiQ29sbGVjdGlvbi5pc0VtcHR5KCkgKSB7CisJCQlpZiggZWpiQ29sbGVjdGlvbiAhPSBudWxsICYmICFlamJDb2xsZWN0aW9uLmlzRW1wdHkoKSApIHsKIAkJCSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGVqYkNvbGxlY3Rpb24uaXRlcmF0b3IoKTsJCiAJCQkJd2hpbGUoIGl0ZXJhdG9yLmhhc05leHQoKSApIHsKIAkJCQkJRW50ZXJwcmlzZUJlYW4gZWpiQmVhbiA9IChFbnRlcnByaXNlQmVhbilpdGVyYXRvci5uZXh0KCk7CkBAIC05NjQsNiArOTYzLDcgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7CiAJCWVhckZpbGUgPSBudWxsOwogCQlhcHBERCA9IG51bGw7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRW50ZXJwcmlzZUJlYW4xMVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRW50ZXJwcmlzZUJlYW4xMVZSdWxlLmphdmEKaW5kZXggYjNiMTNhNi4uYmIwNDY1NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VudGVycHJpc2VCZWFuMTFWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FbnRlcnByaXNlQmVhbjExVlJ1bGUuamF2YQpAQCAtNTQ1LDExICs1NDUsNyBAQAogCQkJCQlJbnRlZ2VyIGVqYlR5cGUgPSBuZXcgSW50ZWdlcihyZWYuZ2V0VHlwZSgpLmdldFZhbHVlKCkpOwogCQkJCQlib29sZWFuIHdyb25nVHlwZSA9IGZhbHNlOyAvLyBpcyB0aGUgRUpCLCBpZGVudGlmaWVkIGJ5IGVqYi1saW5rLCBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50PwogCQkJCQlTdHJpbmcgdHlwZSA9IChuYW1lZEVqYiBpbnN0YW5jZW9mIFNlc3Npb24pID8gIlNlc3Npb24iIDogIkVudGl0eSI7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQkJaWYgKGVqYlR5cGUgPT0gbnVsbCkgewotCQkJCQkJLy8gTmVpdGhlciBzZXNzaW9uIG5vciBlbnRpdHk/Ci0JCQkJCQl3cm9uZ1R5cGUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGVqYlR5cGUuaW50VmFsdWUoKSA9PSBFamJSZWZUeXBlLlNFU1NJT04pIHsKKwkJCQkJaWYgKGVqYlR5cGUuaW50VmFsdWUoKSA9PSBFamJSZWZUeXBlLlNFU1NJT04pIHsKIAkJCQkJCWlmICghKG5hbWVkRWpiIGluc3RhbmNlb2YgU2Vzc2lvbikpIHsKIAkJCQkJCQl3cm9uZ1R5cGUgPSB0cnVlOwogCQkJCQkJfQpAQCAtOTIxLDYgKzkxNyw3IEBACiAJCQkJX3JlZiA9IHJlZjsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJCQlpZiAobyBpbnN0YW5jZW9mIFJvbGVSZWZXcmFwcGVyKSB7CiAJCQkJCVJvbGVSZWZXcmFwcGVyIG90aGVyID0gKFJvbGVSZWZXcmFwcGVyKSBvOwpAQCAtOTI4LDYgKzkyNSwxMSBAQAogCQkJCX0KIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CisJCQkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKSArIF9yZWYuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7CisJCQl9CiAKIAkJCXB1YmxpYyBTZWN1cml0eVJvbGVSZWYgZ2V0Um9sZVJlZigpIHsKIAkJCQlyZXR1cm4gX3JlZjsKQEAgLTEwNDMsNiArMTA0NSw3IEBACiAJLyoKIAkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNyZXNldCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcmVzZXQoKSB7CiAJCXN1cGVyLnJlc2V0KCk7CiAJCV9zZWN1cml0eVJvbGVzID0gbnVsbDsKQEAgLTEwNTEsNiArMTA1NCw3IEBACiAJLyoKIAkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRW50ZXJwcmlzZUJlYW4yMFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vRW50ZXJwcmlzZUJlYW4yMFZSdWxlLmphdmEKaW5kZXggZWExODJlMS4uNWM4NjZiZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0VudGVycHJpc2VCZWFuMjBWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9FbnRlcnByaXNlQmVhbjIwVlJ1bGUuamF2YQpAQCAtNTcsNyArNTcsNyBAQAogCXByaXZhdGUgTGlzdCBfc2VjdXJpdHlSb2xlcyA9IG51bGw7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwIE1FU1NBR0VfSURTOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBuZXcgT2JqZWN0W117SVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0JNUF9LRVlDTEFTUywgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQk1QX0xPQ0FMSE9NRSwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9CTVBfUkVNT1RFLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfQ01QX0tFWUNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9MT0NBTCwgSVZhbGlkYXRpb25SdWxlTGlzdC5FSkIyMF9DTVBfTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX0NNUF9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9CRUFOQ0xBU1MsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9IT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFRlVMX1NFU1NJT05fTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9MT0NBTEhPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVGVUxfU0VTU0lPTl9SRU1PVEUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fQkVBTkNMQVNTLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX0hPTUUsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUwsIElWYWxpZGF0aW9uUnVsZUxpc3QuRUpCMjBfU1RBVEVMRVNTX1NFU1NJT05fTE9DQUxIT01FLCBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX1NUQVRFTEVTU19TRVNTSU9OX1JFTU9URX07Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpNU19NRVNTQUdJTkdfVFlQRSA9ICJqYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyIjsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSk1TX01FU1NBR0lOR19UWVBFID0gImphdmF4Lmptcy5NZXNzYWdlTGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCiAJCiAJc3RhdGljIHsKIAkJTUVTU0FHRV9JRFMgPSBuZXcgSGFzaE1hcCgpOwpAQCAtNTY0LDExICs1NjQsNyBAQAogCQkJCQlJbnRlZ2VyIGVqYlR5cGUgPSBuZXcgSW50ZWdlcihyZWYuZ2V0VHlwZSgpLmdldFZhbHVlKCkpOwogCQkJCQlib29sZWFuIHdyb25nVHlwZSA9IGZhbHNlOyAvLyBpcyB0aGUgRUpCLCBpZGVudGlmaWVkIGJ5IGVqYi1saW5rLCBvZiB0aGUgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIGVqYi1yZWYtdHlwZSBlbGVtZW50PwogCQkJCQlTdHJpbmcgdHlwZSA9IChuYW1lZEVqYiBpbnN0YW5jZW9mIFNlc3Npb24pID8gIlNlc3Npb24iIDogIkVudGl0eSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZiAoZWpiVHlwZSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBOZWl0aGVyIHNlc3Npb24gbm9yIGVudGl0eT8KLQkJCQkJCXdyb25nVHlwZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZWpiVHlwZS5pbnRWYWx1ZSgpID09IEVqYlJlZlR5cGUuU0VTU0lPTikgeworCQkJCQlpZiAoZWpiVHlwZS5pbnRWYWx1ZSgpID09IEVqYlJlZlR5cGUuU0VTU0lPTikgewogCQkJCQkJaWYgKCEobmFtZWRFamIgaW5zdGFuY2VvZiBTZXNzaW9uKSkgewogCQkJCQkJCXdyb25nVHlwZSA9IHRydWU7CiAJCQkJCQl9CkBAIC05OTgsNiArOTk0LDcgQEAKIAkJCQlfcmVmID0gcmVmOwogCQkJfQogCisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQkJCWlmIChvIGluc3RhbmNlb2YgUm9sZVJlZldyYXBwZXIpIHsKIAkJCQkJUm9sZVJlZldyYXBwZXIgb3RoZXIgPSAoUm9sZVJlZldyYXBwZXIpIG87CkBAIC0xMDA1LDYgKzEwMDIsMTEgQEAKIAkJCQl9CiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQorCQkJCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCkgKyBfcmVmLmdldE5hbWUoKS5oYXNoQ29kZSgpOworCQkJfQogCiAJCQlwdWJsaWMgU2VjdXJpdHlSb2xlUmVmIGdldFJvbGVSZWYoKSB7CiAJCQkJcmV0dXJuIF9yZWY7CkBAIC0xMTIwLDYgKzExMjIsNyBAQAogCS8qCiAJICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcmVzZXQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJlc2V0KCkgewogCQlzdXBlci5yZXNldCgpOwogCQlfc2VjdXJpdHlSb2xlcyA9IG51bGw7CkBAIC0xMTI4LDYgKzExMzEsNyBAQAogCS8qCiAJICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKIAkJc3VwZXIucHJlVmFsaWRhdGUodmMsIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKIApAQCAtMTE1OCw2ICsxMTYyLDcgQEAKIAkJCV9iZWFuID0gYmVhbjsKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJCWlmIChvIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pIHsKIAkJCQlFbnRlcnByaXNlQmVhbiBvdGhlciA9IChFbnRlcnByaXNlQmVhbikgbzsKQEAgLTExNjYsNiArMTE3MSwxMSBAQAogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKSArIF9iZWFuLmdldE5hbWUoKS5oYXNoQ29kZSgpOworCQl9CisJCQogCQlwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0QmVhbigpIHsKIAkJCXJldHVybiBfYmVhbjsKIAkJfQpAQCAtMTE3OCw2ICsxMTg4LDcgQEAKIAkJCV9iZWFuID0gYmVhbjsKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKIAkJCWlmIChvIGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgewogCQkJCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgb3RoZXIgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgbzsKQEAgLTExODYsNiArMTE5NywxMSBAQAogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKSArIF9iZWFuLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpLmhhc2hDb2RlKCk7CisJCX0KKwkJCiAJCXB1YmxpYyBFbnRlcnByaXNlQmVhbiBnZXRCZWFuKCkgewogCQkJcmV0dXJuIF9iZWFuOwogCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRU1lc3NhZ2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFTWVzc2FnZUNvbnN0YW50cy5qYXZhCmluZGV4IGExYWM2OTEuLjdmMGJhZTIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFTWVzc2FnZUNvbnN0YW50cy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFTWVzc2FnZUNvbnN0YW50cy5qYXZhCkBAIC0xNSwxMCArMTUsMTAgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBKMkVFTWVzc2FnZUNvbnN0YW50cyB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJFRl9DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5lcmVmdmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfQ0FURUdPUlkgPSAid2FydmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfQ0FURUdPUlkgPSAiZWFydmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJKQVJfQ0FURUdPUlkgPSAiZWpiamFydmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUExJQ0FUSU9OQ0xJRU5UX0NBVEVHT1JZID0gImFwcGxpY2F0aW9uY2xpZW50dmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfQ0FURUdPUlkgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi53YXJ2YWxpZGF0aW9uIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLmVhcnZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCSkFSX0NBVEVHT1JZID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uZWpiamFydmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUExJQ0FUSU9OQ0xJRU5UX0NBVEVHT1JZID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uYXBwbGljYXRpb25jbGllbnR2YWxpZGF0aW9uIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9OQU1FID0gInZhbGlkYXRvci5uYW1lIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9NSVNTSU5HX0VSRUZOQU1FID0gIkVSUk9SX0VBUl9NSVNTSU5HX0VSRUZOQU1FIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0VBUl9NSVNTSU5HX0VSRUZUWVBFID0gIkVSUk9SX0VBUl9NSVNTSU5HX0VSRUZUWVBFIjsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQppbmRleCBjMzViODQ2Li4wYWM4ZWMwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQpAQCAtMTQsNiArMTQsOCBAQAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luLkoyRUVDb3JlUGx1Z2luOworCiBwdWJsaWMgY2xhc3MgSjJFRVZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIgewogCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaGFuZGxlcnMgPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSgpOwogCXByb3RlY3RlZCBDbGFzc0xvYWRlciByZXNvdXJjZUNsYXNzTG9hZGVyOwpAQCAtNTIsNyArNTQsNyBAQAogCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewogCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gcmV0cmlldmluZyBidW5kbGU6ICIgKyBnZXRCdW5kbGVOYW1lKCkgKy8vJE5PTi1OTFMtMSQKIAkJCQkiIHVzaW5nIGxvY2FsZTogIiArIGdldExvY2FsZSgpLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfSAvLyBlbmR0cnkKIAl9IC8vIGVuZGlmCiAJcmV0dXJuIHRoaXMuYnVuZGxlOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFVmFsaWRhdG9yLmphdmEKaW5kZXggODBmOTQ5ZS4uNzBiODRhMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRVZhbGlkYXRvci5qYXZhCkBAIC0zNDcsMTIgKzM0Nyw2IEBACiAJCW1lc3NhZ2Uuc2V0R3JvdXBOYW1lKGdyb3VwTmFtZSk7CiAJCV9yZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwogCX0JCi0JcHVibGljIHZvaWQgYWRkTG9jYWxpemVkV2FybmluZyhTdHJpbmcgbXNnLCBPYmplY3QgdGFyZ2V0LCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgbGluZU5vKSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIG1zZywgdGFyZ2V0KTsKLQkJbWVzc2FnZS5zZXRHcm91cE5hbWUoZ3JvdXBOYW1lKTsKLQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JfQogCQogCS8qKgogCSAqIFBlcmZvcm0gYW55IHJlc291cmNlIGNsZWFudXAgb25jZSB2YWxpZGF0aW9uIGlzIGNvbXBsZXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VEcml2ZW5CZWFuQ2xhc3NWUnVsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VEcml2ZW5CZWFuQ2xhc3NWUnVsZS5qYXZhCmluZGV4IDM4ODkxZGIuLmMxZWM2ZjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXNzYWdlRHJpdmVuQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWVzc2FnZURyaXZlbkJlYW5DbGFzc1ZSdWxlLmphdmEKQEAgLTI4LDcgKzI4LDcgQEAKICAqIEB2ZXJzaW9uIAkxLjAKICAqIEBhdXRob3IKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lc3NhZ2VEcml2ZW5CZWFuQ2xhc3NWUnVsZSBleHRlbmRzIEFCZWFuQ2xhc3NWUnVsZSBpbXBsZW1lbnRzIElFSkJUeXBlLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKK3B1YmxpYyBmaW5hbCBjbGFzcyBNZXNzYWdlRHJpdmVuQmVhbkNsYXNzVlJ1bGUgZXh0ZW5kcyBBQmVhbkNsYXNzVlJ1bGUgaW1wbGVtZW50cyBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgSUQgPSBJVmFsaWRhdGlvblJ1bGVMaXN0LkVKQjIwX01FU1NBR0VfQkVBTkNMQVNTOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIERFUEVORFNfT04gPSBudWxsOwogCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBNRVNTQUdFX0lEUzsKQEAgLTExMSw2ICsxMTEsNyBAQAogCQlyZXR1cm4gTUVTU0FHRV9JRFM7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewogCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwogCX0KQEAgLTEyMyw2ICsxMjQsNyBAQAogCQlyZXR1cm4gSUQ7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGVUcmFuc2llbnRGaWVsZCgpIHsKIAkJcmV0dXJuIFNIT1VMRF9WQUxJREFURV9UUkFOU0lFTlRfRklFTEQ7CiAJfQpAQCAtMTM5LDE0ICsxNDEsMTcgQEAKIAkJcmV0dXJuIG1ldGhvZC5pc1ZvaWQoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUFic3RyYWN0KEphdmFDbGFzcyBjbGF6eikgewogCQlyZXR1cm4gU0hPVUxEX0JFX0FCU1RSQUNUOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZUZpbmFsKEphdmFDbGFzcyBjbGF6eikgewogCQlyZXR1cm4gU0hPVUxEX0JFX0ZJTkFMOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRCZVB1YmxpYyhKYXZhQ2xhc3MgY2xhenopIHsKIAkJcmV0dXJuIFNIT1VMRF9CRV9QVUJMSUM7CiAJfQpAQCAtMTYzLDEwICsxNjgsMTIgQEAKIAkJcmV0dXJuIE1FVEhPRFNfV0hJQ0hfTVVTVF9OT1RfRVhJU1Q7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIEphdmFIZWxwZXJzIGdldEVqYkNyZWF0ZVJldHVyblR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5WT0lELCBiZWFuKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIFN0cmluZyBnZXRFamJDcmVhdGVSZXR1cm5UeXBlTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJcmV0dXJuIElUeXBlQ29uc3RhbnRzLlZPSUQ7CiAJfQpAQCAtMTkzLDEwICsyMDAsMTIgQEAKIAkJfQogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldE1hdGNoaW5nSG9tZU1ldGhvZE5hbWUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgewogCQlyZXR1cm4gZ2V0Tm9NYXRjaGluZ01ldGhvZE5hbWUodmMsIG1ldGhvZCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGVFamJDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QsIExpc3RbXSBtZXRob2RzRXh0ZW5kZWRMaXN0cykgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIEludmFsaWRJbnB1dEV4Y2VwdGlvbiwgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CiAJCXN1cGVyLnZhbGlkYXRlRWpiQ3JlYXRlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cyk7CiAJCQpAQCAtMjA2LDYgKzIxNSw3IEBACiAJCX0KIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGVFamJSZW1vdmVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQlzdXBlci52YWxpZGF0ZUVqYlJlbW92ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7CiAJCQpAQCAtMjE1LDYgKzIyNSw3IEBACiAJCX0KIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZEV4Y2VwdGlvbnMoKSB7CiAJCS8vIERvbid0IGNoZWNrIGZvciBDcmVhdGVFeGNlcHRpb24KIAkJcmV0dXJuIGZhbHNlOwpAQCAtMjI2LDYgKzIzNyw3IEBACiAJICogQHBhcmFtIGNsYXp6CiAJICogQHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNob3VsZEJlU3VwZXJUeXBlcyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCWlmKChiZWFuLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpIHx8IChiZWFuLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQpKXsJCQogCQkJSmF2YUNsYXNzIGpjbGFzcyA9ICgoTWVzc2FnZURyaXZlbiliZWFuKS5nZXRNZXNzYWdpbmdUeXBlKCk7CkBAIC0yNDAsNyArMjUyLDggQEAKIAkvKiAobm9uLUphdmFkb2MpCiAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC52YWxpZGF0aW9uLmVqYi5lamIyMHJ1bGVzLmltcGwuQVR5cGVWUnVsZSN2YWxpZGF0ZU1ldGhvZHNXaGljaE11c3RFeGlzdChvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2RlbC52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkVudGVycHJpc2VCZWFuLCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3MpCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGVNZXRob2RzV2hpY2hNdXN0RXhpc3QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sCisgICAgQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdmFsaWRhdGVNZXRob2RzV2hpY2hNdXN0RXhpc3QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24sCiAgICAgICAgICAgICBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKICAgICAJaWYoKGJlYW4uZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgfHwgKGJlYW4uZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRCkpewkJCiAJCQlKYXZhQ2xhc3MgamNsYXNzID0gKChNZXNzYWdlRHJpdmVuKWJlYW4pLmdldE1lc3NhZ2luZ1R5cGUoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXNzYWdlVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VVdGlsaXR5LmphdmEKaW5kZXggMWYxNjRhMS4uZWJmMTM4NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VVdGlsaXR5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01lc3NhZ2VVdGlsaXR5LmphdmEKQEAgLTYxLDEwICs2MSw2IEBACiAJCS8vIFNvIGZhciwgdGhlIG9ubHkgdGFyZ2V0IHBhcmVudCB3aGljaCBpcyB1c2VkIGFzIGEgZ3JvdXAgbmFtZSBpcyB0aGUgRW50ZXJwcmlzZUJlYW4KIAkJaWYodGFyZ2V0UGFyZW50IGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pIHsKIAkJCUVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pdGFyZ2V0UGFyZW50OwotCQkJaWYoYmVhbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKIAkJCWlmKGJlYW4uZ2V0TmFtZSgpICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gYmVhbi5nZXROYW1lKCk7CiAJCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWV0aG9kVXRpbGl0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL01ldGhvZFV0aWxpdHkuamF2YQppbmRleCBmNTlkNmE4Li45MDU5MjdlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vTWV0aG9kVXRpbGl0eS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9NZXRob2RVdGlsaXR5LmphdmEKQEAgLTIxOCw2ICsyMTgsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAkJCQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTI5MSw2ICsyOTIsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTM2Nyw2ICszNjksNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTQ0MSw2ICs0NDQsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTUxNyw2ICs1MjEsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTU3Niw2ICs1ODEsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTYzNiw2ICs2NDIsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTcwOSw2ICs3MTYsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTc3Miw2ICs3ODAsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTg0MSw2ICs4NTAsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTkwMyw2ICs5MTMsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTk4MCw2ICs5OTEsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTEwNDYsNiArMTA1OCw3IEBACiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwogCQkJfQpAQCAtMTExOSw2ICsxMTMyLDcgQEAKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7CiAJCQl9CkBAIC0xMTkyLDYgKzEyMDYsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTEyNjQsNiArMTI3OSw3IEBACiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwogCQkJfQpAQCAtMTMzNyw2ICsxMzUzLDcgQEAKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7CiAJCQl9CkBAIC0xNDA2LDYgKzE0MjMsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTE0NzksNiArMTQ5Nyw3IEBACiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwogCQkJfQpAQCAtMTU2Myw2ICsxNTgyLDcgQEAKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7CiAJCQl9CkBAIC0xNjI0LDYgKzE2NDQsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTE2NzcsNiArMTY5OCw3IEBACiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwogCQkJfQpAQCAtMTc1MSw2ICsxNzczLDcgQEAKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7CiAJCQl9CkBAIC0xODI0LDYgKzE4NDcsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTE4NzgsNiArMTkwMiw3IEBACiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9CiAKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7CiAJCQl9CkBAIC0xOTYyLDYgKzE5ODcsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KQEAgLTIwNDYsNiArMjA3Miw3IEBACiAJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGdldElkKCkpOwogCQkJfQpAQCAtMjExOSw2ICsyMTQ2LDcgQEAKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZ2V0SWQoKSk7CiAJCQl9CkBAIC0yMTQyLDYgKzIxNzAsNyBAQAogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihnZXRJZCgpKTsKIAkJCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Sb2xlSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vUm9sZUhlbHBlci5qYXZhCmluZGV4IGFhNDQ2YTguLjBjOTVlYTAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9Sb2xlSGVscGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1JvbGVIZWxwZXIuamF2YQpAQCAtMTAwLDcgKzEwMCw3IEBACiAJcmV0dXJuIGFTdHJpbmc7CiB9CiBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmb3JtYXQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZ1tdIHJlcGxhY2VtZW50cykgewotCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQocGF0dGVybiwgcmVwbGFjZW1lbnRzKTsKKwlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KHBhdHRlcm4sIChPYmplY3RbXSlyZXBsYWNlbWVudHMpOwogfQogLyoqCiAgKiBSZXR1cm4gdGhlIGFkZCBtZXRob2QgbmFtZSBmb3IgQGFSb2xlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YQppbmRleCAxMjhmMDBjLi4xNWU3MmU2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YQpAQCAtMTA5LDYgKzEwOSw3IEBACiAJCXJldHVybiBNRVNTQUdFX0lEUzsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7CiAJCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7CiAJfQpAQCAtMTI1LDYgKzEyNiw3IEBACiAJCXJldHVybiBTVVBFUlRZUEVTOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkgewogCQlyZXR1cm4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRDsKIAl9CkBAIC0xMzMsMTQgKzEzNSwxNyBAQAogCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlQWJzdHJhY3QoSmF2YUNsYXNzIGNsYXp6KSB7CiAJCXJldHVybiBTSE9VTERfQkVfQUJTVFJBQ1Q7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlRmluYWwoSmF2YUNsYXNzIGNsYXp6KSB7CiAJCXJldHVybiBTSE9VTERfQkVfRklOQUw7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlUHVibGljKEphdmFDbGFzcyBjbGF6eikgewogCQlyZXR1cm4gU0hPVUxEX0JFX1BVQkxJQzsKIAl9CkBAIC0xNTcsMTAgKzE2MiwxMiBAQAogCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIEphdmFIZWxwZXJzIGdldEVqYkNyZWF0ZVJldHVyblR5cGUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCXJldHVybiBWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShJVHlwZUNvbnN0YW50cy5WT0lELCBiZWFuKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEVqYkNyZWF0ZVJldHVyblR5cGVOYW1lKEVudGVycHJpc2VCZWFuIGJlYW4sIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuVk9JRDsKIAl9CkBAIC0xOTAsNiArMTk3LDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdIb21lTWV0aG9kTmFtZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB7CiAJCWxvbmcgbWV0aG9kVHlwZSA9IE1ldGhvZFV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1ldGhvZFR5cGVJZChiZWFuLCBjbGF6eiwgbWV0aG9kLCBtZXRob2RzRXh0ZW5kZWRMaXN0cywgdGhpcyk7CiAJCQpAQCAtMjE0LDYgKzIyMiw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5jb3JlLmVqYi5lamIyMC5ydWxlcy5JQ2xhc3NWUnVsZSN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuZWpiLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkVudGVycHJpc2VCZWFuLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQlzdXBlci52YWxpZGF0ZSh2YywgYmVhbiwgY2xhenopOwogCQlTZXNzaW9uIHNlc3Npb24gPSAoU2Vzc2lvbiliZWFuOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlLmphdmEKaW5kZXggYzA4YTMyZi4uNWI1MzA2YyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uTG9jYWxDb21wb25lbnRWUnVsZS5qYXZhCkBAIC02Nyw2ICs2Nyw3IEBACiAJCXJldHVybiBNRVNTQUdFX0lEUzsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7CiAJCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7CiAJfQpAQCAtNzksNiArODAsNyBAQAogCQlyZXR1cm4gSUQ7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGxvbmdbXSBnZXRCYXNlVHlwZXMoKSB7CiAJCXJldHVybiBnZXRTdXBlcnR5cGVzKCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uTG9jYWxIb21lVlJ1bGUuamF2YQppbmRleCA0NzZkMGJhLi5lMTc1M2E1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uTG9jYWxIb21lVlJ1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uTG9jYWxIb21lVlJ1bGUuamF2YQpAQCAtNjgsNiArNjgsNyBAQAogCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKIAkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKIAl9CkBAIC03Niw2ICs3Nyw3IEBACiAJCXJldHVybiBNRVNTQUdFX0lEUzsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7CiAJCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQppbmRleCBlOTdkMzgwLi5kZTg2YWMxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQpAQCAtNzAsNiArNzAsNyBAQAogCQlyZXR1cm4gTUVTU0FHRV9JRFM7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewogCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwogCX0KQEAgLTgyLDYgKzgzLDcgQEAKIAkJcmV0dXJuIElEOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewogCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25SZW1vdGVIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWZ1bFNlc3Npb25SZW1vdGVIb21lVlJ1bGUuamF2YQppbmRleCBkZjAzNDA2Li44YjE1NTk1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVmdWxTZXNzaW9uUmVtb3RlSG9tZVZSdWxlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlZnVsU2Vzc2lvblJlbW90ZUhvbWVWUnVsZS5qYXZhCkBAIC02Nyw2ICs2Nyw3IEBACiAJCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewogCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwogCX0KQEAgLTc1LDYgKzc2LDcgQEAKIAkJcmV0dXJuIE1FU1NBR0VfSURTOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKIAkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkJlYW5DbGFzc1ZSdWxlLmphdmEKaW5kZXggNjIxYTExMS4uNTBiMTllNCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25CZWFuQ2xhc3NWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uQmVhbkNsYXNzVlJ1bGUuamF2YQpAQCAtMTEyLDYgKzExMiw3IEBACiAJCXJldHVybiBNRVNTQUdFX0lEUzsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7CiAJCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7CiAJfQpAQCAtMTI4LDYgKzEyOSw3IEBACiAJCXJldHVybiBTVVBFUlRZUEVTOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZVRyYW5zaWVudEZpZWxkKCkgewogCQlyZXR1cm4gU0hPVUxEX1ZBTElEQVRFX1RSQU5TSUVOVF9GSUVMRDsKIAl9CkBAIC0xMzYsMTQgKzEzOCwxNyBAQAogCQlyZXR1cm4gU0hPVUxEX05PVF9CRV9TVVBFUlRZUEVTOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlQWJzdHJhY3QoSmF2YUNsYXNzIGNsYXp6KSB7CiAJCXJldHVybiBTSE9VTERfQkVfQUJTVFJBQ1Q7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlRmluYWwoSmF2YUNsYXNzIGNsYXp6KSB7CiAJCXJldHVybiBTSE9VTERfQkVfRklOQUw7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBib29sZWFuIHNob3VsZEJlUHVibGljKEphdmFDbGFzcyBjbGF6eikgewogCQlyZXR1cm4gU0hPVUxEX0JFX1BVQkxJQzsKIAl9CkBAIC0xNjAsMTAgKzE2NSwxMiBAQAogCQlyZXR1cm4gTUVUSE9EU19XSElDSF9NVVNUX05PVF9FWElTVDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgSmF2YUhlbHBlcnMgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZShFbnRlcnByaXNlQmVhbiBiZWFuLCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJcmV0dXJuIFZhbGlkYXRpb25SdWxlVXRpbGl0eS5nZXRUeXBlKElUeXBlQ29uc3RhbnRzLlZPSUQsIGJlYW4pOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0RWpiQ3JlYXRlUmV0dXJuVHlwZU5hbWUoRW50ZXJwcmlzZUJlYW4gYmVhbiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCXJldHVybiBJVHlwZUNvbnN0YW50cy5WT0lEOwogCX0KQEAgLTE5Myw2ICsyMDAsNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ0hvbWVNZXRob2ROYW1lKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kLCBMaXN0W10gbWV0aG9kc0V4dGVuZGVkTGlzdHMpIHsKIAkJbG9uZyBtZXRob2RUeXBlID0gTWV0aG9kVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWV0aG9kVHlwZUlkKGJlYW4sIGNsYXp6LCBtZXRob2QsIG1ldGhvZHNFeHRlbmRlZExpc3RzLCB0aGlzKTsKIAkJCkBAIC0yMTQsNiArMjIyLDcgQEAKIAkJfQogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYkNyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCwgTGlzdFtdIG1ldGhvZHNFeHRlbmRlZExpc3RzKSB0aHJvd3MgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbiwgSW52YWxpZElucHV0RXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKIAkJaWYoKG1ldGhvZC5saXN0UGFyYW1ldGVyc1dpdGhvdXRSZXR1cm4oKS5sZW5ndGggIT0gMCkgfHwgKCFJTWV0aG9kQW5kRmllbGRDb25zdGFudHMuTUVUSE9ETkFNRV9FSkJDUkVBVEUuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSkgewogCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFV0aWxpdHkoKS5nZXRNZXNzYWdlKHZjLCBJTWVzc2FnZVByZWZpeEVqYjIwQ29uc3RhbnRzLkNIS0oyNDc2LCBJRUpCVmFsaWRhdGlvbkNvbnRleHQuRVJST1IsIGJlYW4sIGNsYXp6LCBtZXRob2QsIHRoaXMpOwpAQCAtMjI2LDggKzIzNSw4IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5jb3JlLmVqYi5lamIyMC5ydWxlcy5JQ2xhc3NWUnVsZSN2YWxpZGF0ZShvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLmNvcmUuZWpiLklWYWxpZGF0aW9uQ29udGV4dCwgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLkVudGVycHJpc2VCZWFuLCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBJbnZhbGlkSW5wdXRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAJCXN1cGVyLnZhbGlkYXRlKHZjLCBiZWFuLCBjbGF6eik7CiAJCS8qCiAJCSAqIDYuNS4zIFRoZSBvcHRpb25hbCBTZXNzaW9uU3luY2hyb25pemF0aW9uIGludGVyZmFjZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25Mb2NhbENvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQppbmRleCBjOGNjM2Q5Li43OWVjYWMxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsQ29tcG9uZW50VlJ1bGUuamF2YQpAQCAtNjcsNiArNjcsNyBAQAogCQlyZXR1cm4gTUVTU0FHRV9JRFM7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewogCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwogCX0KQEAgLTc5LDYgKzgwLDcgQEAKIAkJcmV0dXJuIElEOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewogCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uTG9jYWxIb21lVlJ1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uTG9jYWxIb21lVlJ1bGUuamF2YQppbmRleCBlYmI4M2I0Li44ZGZlNjJhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvbkxvY2FsSG9tZVZSdWxlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25Mb2NhbEhvbWVWUnVsZS5qYXZhCkBAIC02OCw2ICs2OCw3IEBACiAJCU1FU1NBR0VfSURTLnB1dChDSEtKMjkwNywgbmV3IFN0cmluZ1tde0NIS0oyOTA3fSk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewogCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwogCX0KQEAgLTc2LDYgKzc3LDcgQEAKIAkJcmV0dXJuIE1FU1NBR0VfSURTOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgaW50IGdldE1lc3NhZ2VSZW1vdGVFeGNlcHRpb25TZXZlcml0eSgpIHsKIAkJcmV0dXJuIE1FU1NBR0VfUkVNT1RFX0VYQ0VQVElPTl9TRVZFUklUWTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUNvbXBvbmVudFZSdWxlLmphdmEKaW5kZXggZWJmZDZmZC4uMjJlYjdmOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25SZW1vdGVDb21wb25lbnRWUnVsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlQ29tcG9uZW50VlJ1bGUuamF2YQpAQCAtNzAsNiArNzAsNyBAQAogCQlyZXR1cm4gTUVTU0FHRV9JRFM7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBpbnQgZ2V0TWVzc2FnZVJlbW90ZUV4Y2VwdGlvblNldmVyaXR5KCkgewogCQlyZXR1cm4gTUVTU0FHRV9SRU1PVEVfRVhDRVBUSU9OX1NFVkVSSVRZOwogCX0KQEAgLTgyLDYgKzgzLDcgQEAKIAkJcmV0dXJuIElEOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBsb25nW10gZ2V0QmFzZVR5cGVzKCkgewogCQlyZXR1cm4gZ2V0U3VwZXJ0eXBlcygpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlSG9tZVZSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vU3RhdGVsZXNzU2Vzc2lvblJlbW90ZUhvbWVWUnVsZS5qYXZhCmluZGV4IGYyNWIxN2YuLjExYmFhMzMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9TdGF0ZWxlc3NTZXNzaW9uUmVtb3RlSG9tZVZSdWxlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1N0YXRlbGVzc1Nlc3Npb25SZW1vdGVIb21lVlJ1bGUuamF2YQpAQCAtNzAsNiArNzAsNyBAQAogCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgZmluYWwgbG9uZ1tdIGdldEJhc2VUeXBlcygpIHsKIAkJcmV0dXJuIGdldFN1cGVydHlwZXMoKTsKIAl9CkBAIC03OCw2ICs3OSw3IEBACiAJCXJldHVybiBNRVNTQUdFX0lEUzsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIGludCBnZXRNZXNzYWdlUmVtb3RlRXhjZXB0aW9uU2V2ZXJpdHkoKSB7CiAJCXJldHVybiBNRVNTQUdFX1JFTU9URV9FWENFUFRJT05fU0VWRVJJVFk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QQmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QQmVhbi5qYXZhCmluZGV4IDg1Y2JhMGQuLmQ1MjU1OTIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEJlYW4uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBCZWFuLmphdmEKQEAgLTEzMyw2ICsxMzMsNyBAQAogCS8qKgogCSAqIENoZWNrcyB0byBzZWUgaWYgQGVqYk1ldGhvZCBpcyBvbmUgb2YgdGhlIHJlcXVpcmVkIG1ldGhvZHMuCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJc3VwZXIucHJpbVZhbGlkYXRlRXhpc3RlbmNlKHZjLCBiZWFuLCBjbGF6eiwgZWpiTWV0aG9kKTsKIApAQCAtMTQ4LDYgKzE0OSw3IEBACiAJICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCiAJICogU2VjdGlvbjogOS4yLjYKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJLy8gUGVyZm9ybSBjb21tb24gQk1QL0NNUCBidXNpbmVzcyBtZXRob2QgY2hlY2tzCiAJCXN1cGVyLnZhbGlkYXRlQnVzaW5lc3NNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwpAQCAtMTYwLDYgKzE2Miw3IEBACiAJICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCiAJICogU2VjdGlvbjogOS4yLjIKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJLy8gQWxsIG9mIHRoZSBhYm92ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSB0aGUgcGFyZW50LgogCQlzdXBlci52YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7CkBAIC0xNjksNiArMTcyLDcgQEAKIAkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KIAkgKiBTZWN0aW9uOiA5LjIuNQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiRmluZE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCS8vIEEgZmluZGVyIG1ldGhvZCBuYW1lIG11c3Qgc3RhcnQgd2l0aCB0aGUgcHJlZml4ICJlamJGaW5kIiAKIAkJLy8gKGUuZy4gZWpiRmluZEJ5UHJpbWFyeUtleSwgZWpiRmluZExhcmdlQWNjb3VudHMsIGVqYkZpbmRMYXRlU2hpcG1lbnRzKS4KQEAgLTI0Niw2ICsyNTAsNyBAQAogCSAqIENoZWNrcyB0aGF0IHRoZSBlamJQb3N0Q3JlYXRlIG1ldGhvZCBmb2xsb3dzIHRoZSBFSkIgMS4xLiBzcGVjaWZpY2F0aW9uLgogCSAqIFNlY3Rpb246IDkuMi40CiAJKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBtZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQkvLyBQZXJmb3JtIGNvbW1vbiBCTVAvQ01QIGVqYlBvc3RDcmVhdGUgbWV0aG9kIGNoZWNrcwogCQlzdXBlci52YWxpZGF0ZUVqYlBvc3RDcmVhdGVNZXRob2QodmMsIGJlYW4sIGNsYXp6LCBtZXRob2QpOwpAQCAtMjU4LDYgKzI2Myw3IEBACiAJICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCiAJICogU2VjdGlvbjogOS4yLjUKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCXN1cGVyLnZhbGlkYXRlTWV0aG9kRXhpc3RzKHZjLCBiZWFuLCBjbGF6eik7CiAKQEAgLTI2Nyw2ICsyNzMsNyBAQAogCQl9CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHZlcmlmeUZpZWxkRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJLyoKIAkJLy8gUGx1cywgY2hlY2sgdGhhdCBhdCBsZWFzdCBvbmUgZmllbGQgZXhpc3RzIG9uIHRoZSBiZWFuLgpAQCAtMjgxLDYgKzI4OCw3IEBACiAJLyoKIAkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwogCQloYXNQS01ldGhvZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QSG9tZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QSG9tZS5qYXZhCmluZGV4IDIyMmQ2NDMuLjRmYmU5OTEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEhvbWUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVCTVBIb21lLmphdmEKQEAgLTg0LDYgKzg0LDcgQEAKIAkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KIAkgKiBTZWN0aW9uOiA5LjIuOAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHZhbGlkYXRlRmluZE1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCXN1cGVyLnZhbGlkYXRlRmluZE1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUJNUEtleS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QS2V5LmphdmEKaW5kZXggMTBjNGFkZi4uZDQwYjgxYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QS2V5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQk1QS2V5LmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIAkvKioKIAkgKiBUaGlzIG1ldGhvZCBhY3R1YWxseSBkb2VzIHRoZSB2YWxpZGF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKIAkJLy9zdXBlci5wcmltVmFsaWRhdGUoZWpiTWV0aG9kKTsKQEAgLTcxLDYgKzcyLDcgQEAKIAkvKioKIAkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKIAkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQ01QQmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQ01QQmVhbi5qYXZhCmluZGV4IGY1YmZhODcuLjM2YmQxNzcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZUNNUEJlYW4uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBCZWFuLmphdmEKQEAgLTExOSw2ICsxMTksNyBAQAogCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCByZXNldCgpIHsKIAkJc3VwZXIucmVzZXQoKTsKIAkJX2NvbnRhaW5lck1hbmFnZWRGaWVsZHMgPSBudWxsOwpAQCAtMjIzLDYgKzIyNCw3IEBACiAJICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCiAJICogU2VjdGlvbjogMTguMS4yCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHJpbVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBGaWVsZCBmaWVsZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCXN1cGVyLnByaW1WYWxpZGF0ZSh2YywgYmVhbiwgY2xhenosIGZpZWxkKTsKIApAQCAtMjM1LDYgKzIzNyw3IEBACiAJICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCiAJICogU2VjdGlvbjogOS4yLjYKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJLy8gUGVyZm9ybSBjb21tb24gQk1QL0NNUCBidXNpbmVzcyBtZXRob2QgY2hlY2tzCiAJCWlmICghaXNFamJSZWxhdGlvbnNoaXBSb2xlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkKQEAgLTI0NCw2ICsyNDcsNyBAQAogCQkvLyBBbGwgb2YgdGhlIHBvaW50cyBpbiA5LjIuNiBhcmUgY29tbW9uIHRvIGJvdGggQk1QcyAmIENNUHMuCiAJfQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQnVzaW5lc3NNZXRob2ROb1JlbW90ZUV4Y2VwdGlvbihJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCWlmICghaXNFamJSZWxhdGlvbnNoaXBSb2xlTWV0aG9kKHZjLCBiZWFuLCBjbGF6eiwgbWV0aG9kKSkKIAkJCXN1cGVyLnZhbGlkYXRlQnVzaW5lc3NNZXRob2ROb1JlbW90ZUV4Y2VwdGlvbih2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7IC8vIEVKQiAyLjAgYWRkZWQgInRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gYWJvdmUiCkBAIC0yNTMsNiArMjU3LDcgQEAKIAkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KIAkgKiBTZWN0aW9uOiA5LjIuMgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQkvLyBBbGwgb2YgdGhlIGFib3ZlIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGJ5IHRoZSBwYXJlbnQuCiAJCXN1cGVyLnZhbGlkYXRlQ2xhc3ModmMsIGJlYW4sIGNsYXp6KTsKQEAgLTMxNyw2ICszMjIsNyBAQAogCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgogCSAqIFNlY3Rpb246IDkuNC42CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdmFsaWRhdGVFamJGaW5kTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJaWYgKG1ldGhvZCA9PSBudWxsKSB7CiAJCQl0aHJvdyBuZXcgSW52YWxpZElucHV0RXhjZXB0aW9uKCk7CkBAIC0zMzEsNiArMzM3LDcgQEAKIAkgKiBDaGVja3MgdGhhdCB0aGUgZWpiUG9zdENyZWF0ZSBtZXRob2QgZm9sbG93cyB0aGUgRUpCIDEuMS4gc3BlY2lmaWNhdGlvbi4KIAkgKiBTZWN0aW9uOiA5LjIuNCBhbmQgOS40LjIKIAkqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZChJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCS8vIFBlcmZvcm0gY29tbW9uIEJNUC9DTVAgZWpiUG9zdENyZWF0ZSBtZXRob2QgY2hlY2tzCiAJCXN1cGVyLnZhbGlkYXRlRWpiUG9zdENyZWF0ZU1ldGhvZCh2YywgYmVhbiwgY2xhenosIG1ldGhvZCk7CkBAIC0zNTAsMTAgKzM1NywxMiBAQAogCQkJQ01QQXR0cmlidXRlIGtleUF0dHJpYnV0ZSA9IGNtcC5nZXRQcmltS2V5RmllbGQoKTsKIAkJCUZpZWxkIGtleUZpZWxkID0gKGtleUF0dHJpYnV0ZSA9PSBudWxsKSA/IG51bGwgOiBrZXlBdHRyaWJ1dGUuZ2V0RmllbGQoKTsKIAkJCUphdmFDbGFzcyBwcmltYXJ5S2V5ID0gY21wLmdldFByaW1hcnlLZXkoKTsKLQkJCWlmICgoa2V5RmllbGQgPT0gbnVsbCkgfHwgIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKChKYXZhSGVscGVycylrZXlGaWVsZC5nZXRFVHlwZSgpLCBwcmltYXJ5S2V5KSkgewotCQkJCVN0cmluZ1tdIG1zZ1Bhcm0gPSB7IGtleUF0dHJpYnV0ZS5nZXROYW1lKCksIHByaW1hcnlLZXkuZ2V0TmFtZSgpfTsKLQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gTWVzc2FnZVV0aWxpdHkuZ2V0VXRpbGl0eSgpLmdldE1lc3NhZ2UodmMsIElNZXNzYWdlUHJlZml4RWpiMTFDb25zdGFudHMuQ0hLSjIyMDcsIElFSkJWYWxpZGF0aW9uQ29udGV4dC5FUlJPUiwgYmVhbiwgY2xhenosIGtleUZpZWxkLCBtc2dQYXJtLCB0aGlzKTsKLQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOworCQkJaWYoa2V5QXR0cmlidXRlICE9IG51bGwpeworCQkJCWlmICgoa2V5RmllbGQgPT0gbnVsbCkgfHwgIVZhbGlkYXRpb25SdWxlVXRpbGl0eS5pc0Fzc2lnbmFibGVGcm9tKChKYXZhSGVscGVycylrZXlGaWVsZC5nZXRFVHlwZSgpLCBwcmltYXJ5S2V5KSkgeworCQkJCQlTdHJpbmdbXSBtc2dQYXJtID0geyBrZXlBdHRyaWJ1dGUuZ2V0TmFtZSgpLCBwcmltYXJ5S2V5LmdldE5hbWUoKX07CisJCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjIwNywgSUVKQlZhbGlkYXRpb25Db250ZXh0LkVSUk9SLCBiZWFuLCBjbGF6eiwga2V5RmllbGQsIG1zZ1Bhcm0sIHRoaXMpOworCQkJCQl2Yy5hZGRNZXNzYWdlKG1lc3NhZ2UpOworCQkJCX0KIAkJCX0KIAkJfQogCX0KQEAgLTM2MSw2ICszNzAsNyBAQAogCS8qKgogCSAqIENoZWNrIHRoYXQgYXQgbGVhc3Qgb25lIGZpZWxkIGV4aXN0cyBvbiB0aGUgYmVhbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2ZXJpZnlGaWVsZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCWlmICghaGFzQ29udGFpbmVyTWFuYWdlZEZpZWxkKCkpIHsKIAkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRVdGlsaXR5KCkuZ2V0TWVzc2FnZSh2YywgSU1lc3NhZ2VQcmVmaXhFamIxMUNvbnN0YW50cy5DSEtKMjAzMiwgSUVKQlZhbGlkYXRpb25Db250ZXh0LldBUk5JTkcsIGJlYW4sIGNsYXp6LCBuZXcgU3RyaW5nW10geyBjbGF6ei5nZXRRdWFsaWZpZWROYW1lKCl9LCB0aGlzKTsKQEAgLTM3MCw2ICszODAsNyBAQAogCS8qCiAJICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKIAkJc3VwZXIucHJlVmFsaWRhdGUodmMsIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKIAkJX2NvbnRhaW5lck1hbmFnZWRGaWVsZHMgPSBsb2FkQ29udGFpbmVyTWFuYWdlZEZpZWxkcyh2YywgKEVudGVycHJpc2VCZWFuKXRhcmdldFBhcmVudCwgKEphdmFDbGFzcyl0YXJnZXQpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlQ01QS2V5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBLZXkuamF2YQppbmRleCAxODViOGEyLi5hNzliZDQ5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBLZXkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVDTVBLZXkuamF2YQpAQCAtODEsNiArODEsNyBAQAogCQlNRVNTQUdFX0lEUy5wdXQoQ0hLSjI5MDcsIG5ldyBTdHJpbmdbXXtDSEtKMjkwN30pOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCByZXNldCgpIHsKIAkJc3VwZXIucmVzZXQoKTsKIAkJX2JlYW5GaWVsZE5hbWVzLmNsZWFyKCk7CkBAIC05NCw2ICs5NSw3IEBACiAJCXJldHVybiBERVBFTkRTX09OOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFRhcmdldChPYmplY3QgcGFyZW50LCBPYmplY3QgY2xhenopIHsKIAkJaWYocGFyZW50ID09IG51bGwpIHsKIAkJCXJldHVybiBudWxsOwpAQCAtMTUyLDYgKzE1NCw3IEBACiAJICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCiAJICogU2VjdGlvbjogOS40LjcuMgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgRmllbGQgZmllbGQpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQkvLyBBbGwgZmllbGRzIGluIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBtdXN0IGJlIGRlY2xhcmVkIGFzIHB1YmxpYy4KIAkJaWYgKCFWYWxpZGF0aW9uUnVsZVV0aWxpdHkuaXNQdWJsaWMoZmllbGQpKSB7CkBAIC0xNzgsNiArMTgxLDcgQEAKIAkvKioKIAkgKiBUaGlzIG1ldGhvZCBhY3R1YWxseSBkb2VzIHRoZSB2YWxpZGF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHByaW1WYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKIAkJLy8gc3VwZXIucHJpbVZhbGlkYXRlKGVqYk1ldGhvZCk7CkBAIC0xODgsNiArMTkyLDcgQEAKIAkvKioKIAkgKiBDaGVja3MgdG8gc2VlIGlmIEBlamJNZXRob2QgaXMgb25lIG9mIHRoZSByZXF1aXJlZCBtZXRob2RzLgogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHByaW1WYWxpZGF0ZUV4aXN0ZW5jZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eiwgTWV0aG9kIGVqYk1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKIAkJLy9zdXBlci52YWxpZGF0ZUV4aXN0ZW5jZShlamJNZXRob2QpOwpAQCAtMjA1LDYgKzIxMCw3IEBACiAJICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCiAJICogU2VjdGlvbjogOS40LjcuMgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQlzdXBlci52YWxpZGF0ZUNsYXNzKHZjLCBiZWFuLCBjbGF6eik7CiAKQEAgLTIzOCw2ICsyNDQsNyBAQAogCSAqIEVKQiAxLjEgc3BlY2lmaWNhdGlvbgogCSAqIFNlY3Rpb246IDkuNC43LjIKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1ldGhvZEV4aXN0cyhJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIEVudGVycHJpc2VCZWFuIGJlYW4sIEphdmFDbGFzcyBjbGF6eikgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCXN1cGVyLnZhbGlkYXRlTWV0aG9kRXhpc3RzKHZjLCBiZWFuLCBjbGF6eik7CiAKQEAgLTI1MSw2ICsyNTgsNyBAQAogCS8qCiAJICogQHNlZSBJVmFsaWRhdGlvblJ1bGUjcHJlVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0LCBPYmplY3QsIE9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQgdmMsIE9iamVjdCB0YXJnZXRQYXJlbnQsIE9iamVjdCB0YXJnZXQpIHRocm93cyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uLCBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKIAkJc3VwZXIucHJlVmFsaWRhdGUodmMsIHRhcmdldFBhcmVudCwgdGFyZ2V0KTsKIAkJaGFzQUNvbnN0cnVjdG9yID0gZmFsc2U7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uQmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlU2Vzc2lvbkJlYW4uamF2YQppbmRleCAyYTc4N2JlLi40NzllNDQ0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uQmVhbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25CZWFuLmphdmEKQEAgLTk5LDYgKzk5LDcgQEAKIAkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcmVzZXQoKSB7CiAJCXN1cGVyLnJlc2V0KCk7CiAJCWNyZWF0ZU1ldGhvZHMuY2xlYXIoKTsKQEAgLTEyMCw2ICsxMjEsNyBAQAogCQljcmVhdGVNZXRob2RzID0gbmV3IEhhc2hTZXQoKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRQYXJlbnROYW1lKCkgewogCQlyZXR1cm4gSVR5cGVDb25zdGFudHMuQ0xBU1NOQU1FX0pBVkFYX0VKQl9TRVNTSU9OQkVBTjsKIAl9CkBAIC0xNDYsNiArMTQ4LDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzRnJhbWV3b3JrTWV0aG9kKFN0cmluZyBuYW1lKSB7CiAJCWlmIChzdXBlci5pc0ZyYW1ld29ya01ldGhvZChuYW1lKSkgewogCQkJcmV0dXJuIHRydWU7CkBAIC0xNjMsNiArMTY2LDcgQEAKIAkgKiBDaGVjayB0aGF0IHRoZSBlamJDcmVhdGUgbWV0aG9kcyBhbmQgYnVzaW5lc3MgbWV0aG9kcyBmb2xsb3cgdGhlIEVKQiAxLjEgc3BlYy4KIAkgKiBTZWN0aW9uOiA2LjgsIDYuMTAuMiwgNi4xMC4zIGFuZCA2LjEwLjQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCiAJCS8vIHN1cGVyLnByaW1WYWxpZGF0ZShlamJNZXRob2QpOwpAQCAtMTkzLDYgKzE5Nyw3IEBACiAJLyoqCiAJICogQ2hlY2tzIHRvIHNlZSBpZiBAZWpiTWV0aG9kIGlzIG9uZSBvZiB0aGUgcmVxdWlyZWQgbWV0aG9kcy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBwcmltVmFsaWRhdGVFeGlzdGVuY2UoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBlamJNZXRob2QpIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQkvLyBDYW4ndCBpbnZva2UgYW4gYWJzdHJhY3QgbWV0aG9kCiAJCS8vc3VwZXIudmFsaWRhdGVFeGlzdGVuY2UoZWpiTWV0aG9kKTsKQEAgLTIwNyw2ICsyMTIsNyBAQAogCSAqIFRlc3QgdGhhdCB0aGUgc3VwcGxpZWQgYnVzaW5lc3MgbWV0aG9kIGZvbGxvd3MgdGhlIEVKQiAxLjEgc3BlYyBydWxlcy4KIAkgKiBTZWN0aW9uOiA2LjEwLjQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZUJ1c2luZXNzTWV0aG9kKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKIApAQCAtMjI5LDYgKzIzNSw3IEBACiAJICogVVJMOiBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2VqYi9kb2NzLmh0bWwKIAkgKiBTZWN0aW9uOiA2LjEwLjIKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZUNsYXNzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJdmMudGVybWluYXRlSWZDYW5jZWxsZWQoKTsKIAkJc3VwZXIudmFsaWRhdGVDbGFzcyh2YywgYmVhbiwgY2xhenopOwpAQCAtMzg3LDYgKzM5NCw3IEBACiAJICogRUpCIDEuMSBzcGVjaWZpY2F0aW9uCiAJICogU2VjdGlvbjogNi44LCA2LjEwLjIgYW5kIDYuMTAuMwogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWV0aG9kRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nW10gbW9kZWxPYmplY3ROYW1lID0gbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfTsKIAkJaWYgKCFoYXNWYWxpZENvbnN0cnVjdG9yICYmIGhhc0FDb25zdHJ1Y3RvcikgewpAQCAtNDg1LDYgKzQ5Myw3IEBACiAJLyoKIAkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwogCQloYXNWYWxpZENvbnN0cnVjdG9yID0gZmFsc2U7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uSG9tZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRlU2Vzc2lvbkhvbWUuamF2YQppbmRleCA1MjhhNDM4Li40YTI0OWE2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGVTZXNzaW9uSG9tZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0ZVNlc3Npb25Ib21lLmphdmEKQEAgLTc5LDYgKzc5LDcgQEAKIAkJTUVTU0FHRV9JRFMucHV0KENIS0oyOTA3LCBuZXcgU3RyaW5nW117Q0hLSjI5MDd9KTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcmVzZXQoKSB7CiAJCXN1cGVyLnJlc2V0KCk7CiAJCWNyZWF0ZU1ldGhvZHMuY2xlYXIoKTsKQEAgLTEzMiw2ICsxMzMsNyBAQAogCSAqIFVSTDogaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9lamIvZG9jcy5odG1sCiAJICogU2VjdGlvbjogNi44IGFuZCA2LjEwLjYKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwcmltVmFsaWRhdGUoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenosIE1ldGhvZCBoaU1ldGhvZCkgdGhyb3dzIEludmFsaWRJbnB1dEV4Y2VwdGlvbiB7CiAJCS8vIENhbid0IGludm9rZSBhbiBhYnN0cmFjdCBtZXRob2QKIAkJLy8gc3VwZXIucHJpbVZhbGlkYXRlKGhpTWV0aG9kKTsKQEAgLTE1OCw2ICsxNjAsNyBAQAogCS8qKgogCSAqIENoZWNrcyB0byBzZWUgaWYgQGVqYk1ldGhvZCBpcyBvbmUgb2YgdGhlIHJlcXVpcmVkIG1ldGhvZHMuCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcHJpbVZhbGlkYXRlRXhpc3RlbmNlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6LCBNZXRob2QgZWpiTWV0aG9kKSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJLy8gQ2FuJ3QgaW52b2tlIGFuIGFic3RyYWN0IG1ldGhvZAogCQkvL3N1cGVyLnZhbGlkYXRlRXhpc3RlbmNlKGVqYk1ldGhvZCk7CkBAIC0xNzYsNiArMTc5LDcgQEAKIAkgKiBVUkw6IGh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvZWpiL2RvY3MuaHRtbAogCSAqIFNlY3Rpb246IDYuMTAuNgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHZhbGlkYXRlQ2xhc3MoSUVKQlZhbGlkYXRpb25Db250ZXh0IHZjLCBFbnRlcnByaXNlQmVhbiBiZWFuLCBKYXZhQ2xhc3MgY2xhenopIHRocm93cyBJbnZhbGlkSW5wdXRFeGNlcHRpb24gewogCQl2Yy50ZXJtaW5hdGVJZkNhbmNlbGxlZCgpOwogCQkvLyBCb3RoIG9mIHRoZSBhYm92ZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBieSB0aGUgVmFsaWRhdGVIb21lIGNsYXNzJ3MgdmFsaWRhdGVDbGFzcyBtZXRob2QuCkBAIC0yMjEsNiArMjI1LDcgQEAKIAkgKiBFSkIgMS4xIHNwZWNpZmljYXRpb24KIAkgKiBTZWN0aW9uOiA2LjggYW5kIDYuMTAuNgogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWV0aG9kRXhpc3RzKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgRW50ZXJwcmlzZUJlYW4gYmVhbiwgSmF2YUNsYXNzIGNsYXp6KSB0aHJvd3MgSW52YWxpZElucHV0RXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nW10gbW9kZWxPYmplY3ROYW1lID0gbmV3IFN0cmluZ1tdIHsgY2xhenouZ2V0UXVhbGlmaWVkTmFtZSgpfTsKIApAQCAtMjQ0LDYgKzI0OSw3IEBACiAJLyoKIAkgKiBAc2VlIElWYWxpZGF0aW9uUnVsZSNwcmVWYWxpZGF0ZShJRUpCVmFsaWRhdGlvbkNvbnRleHQsIE9iamVjdCwgT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHByZVZhbGlkYXRlKElFSkJWYWxpZGF0aW9uQ29udGV4dCB2YywgT2JqZWN0IHRhcmdldFBhcmVudCwgT2JqZWN0IHRhcmdldCkgdGhyb3dzIFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24sIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQlzdXBlci5wcmVWYWxpZGF0ZSh2YywgdGFyZ2V0UGFyZW50LCB0YXJnZXQpOwogCQloYXNEZWZhdWx0Q3JlYXRlTWV0aG9kID0gZmFsc2U7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJ1bGVVdGlsaXR5LmphdmEKaW5kZXggNTljMDdkMS4uMzJlMThkZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRpb25SdWxlVXRpbGl0eS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUnVsZVV0aWxpdHkuamF2YQpAQCAtNTEsNiArNTEsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5UcmFuc2FjdGlvblR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTG9jYWxNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5FQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlcjsKIAogLyoqCiAgKiBAdmVyc2lvbiAJMS4wCkBAIC0yNjIsNyArMjYzLDcgQEAKIAkJCS8vIGVsc2UsIHNlYXJjaCB0aGUgcGFyZW50CQogCQkJY2xhenogPSBjbGF6ei5nZXRTdXBlcnR5cGUoKTsKIAkJfQotCQl3aGlsZSAoKG1ldGhvZCA9PSBudWxsKSAmJiAoY2xhenogIT0gbnVsbCkpOworCQl3aGlsZSAoY2xhenogIT0gbnVsbCk7CiAKIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtNjQ1LDEwICs2NDYsOSBAQAogCQl9CiAJCWlmIChjb21tb25DbGFzc05hbWVzLmNvbnRhaW5zKGphdmFDbGFzc05hbWUpKSB7CiAJCQlSZXNvdXJjZVNldCByU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCVJlc291cmNlU2V0IHNldCA9IHJlc291cmNlID09IG51bGwgPyBudWxsIDogcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKIAkJCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJaWYgKHNldCBpbnN0YW5jZW9mIFByb2plY3RSZXNvdXJjZVNldCl7Ci0JCQkJcHJvamVjdCA9ICgoUHJvamVjdFJlc291cmNlU2V0KSBzZXQpLmdldFByb2plY3QoKTsKKwkJCWlmIChyU2V0IGluc3RhbmNlb2YgUHJvamVjdFJlc291cmNlU2V0KXsKKwkJCQlwcm9qZWN0ID0gKChQcm9qZWN0UmVzb3VyY2VTZXQpIHJTZXQpLmdldFByb2plY3QoKTsKIAkJCX0KIAkJCQogCQkJLy9oZWxwZXJNYXAgPSBnZXRIZWxwZXJNYXAoclNldCk7CkBAIC03MjUsMTEgKzcyNSwxMSBAQAogCQkJaWYoYUxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7CiAJCQkJTG9nRW50cnkgZW50cnkgPSBnZXRMb2dFbnRyeSgpOwogCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJWYWxpZGF0aW9uUnVsZVV0aWxpdHkuZ2V0VHlwZShTdHJpbmcsIFJlc291cmNlU2V0LCBib29sZWFuKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHRleHQgPSAiaW52YWxpZCBwYXJhbWV0ZXI7IGphdmFDbGFzc05hbWUgPSB7MH0gYW5kIHJlc291cmNlU2V0ID0gezF9IjsKKwkJCQlTdHJpbmcgdGV4dCA9IEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLlZhbGlkYXRpb25SdWxlVXRpbGl0eV9pbnZhbGlkX3BhcmFtZXRlcl9qYXZhQ2xhc3NOYW1lXzsKIAkJCQkvL2VudHJ5LnNldFRleHQoImludmFsaWQgcGFyYW1ldGVyOyBqYXZhQ2xhc3NOYW1lID0gezB9IGFuZCByZXNvdXJjZVNldCA9IHsxfSIpOyAvLyROT04tTkxTLTEkCiAJCQkJLy9lbnRyeS5zZXRUb2tlbnMobmV3IFN0cmluZ1tde2phdmFDbGFzc05hbWUsIFN0cmluZy52YWx1ZU9mKHJlc291cmNlU2V0KX0pOwogCQkJCVN0cmluZyByZXN1bHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCh0ZXh0LAotCQkJCQkJIG5ldyBTdHJpbmdbXXtqYXZhQ2xhc3NOYW1lLCBTdHJpbmcudmFsdWVPZihyZXNvdXJjZVNldCl9KTsKKwkJCQkJCSBuZXcgT2JqZWN0W117amF2YUNsYXNzTmFtZSwgU3RyaW5nLnZhbHVlT2YocmVzb3VyY2VTZXQpfSk7CiAJCQkJZW50cnkuc2V0VGV4dChyZXN1bHQpOwogCQkJCQogCQkJCWVudHJ5LmFwcGVuZFN0YWNrVHJhY2UoKTsKQEAgLTkzNSw3ICs5MzUsNyBAQAogCQllbHNlIGlmKHR5cGUuaXNBcnJheSgpICYmIGNvbXBhcmVUeXBlLmlzQXJyYXkoKSkgewogCQkJSmF2YUNsYXNzIGNsYXNzVHlwZSA9IHR5cGUuZ2V0V3JhcHBlcigpOwogCQkJSmF2YUNsYXNzIGNsYXNzQ29tcGFyZVR5cGUgPSBjb21wYXJlVHlwZS5nZXRXcmFwcGVyKCk7Ci0JCQlpZigoY2xhc3NUeXBlID09IG51bGwpIHx8IChjb21wYXJlVHlwZSA9PSBudWxsKSkgeworCQkJaWYoKGNsYXNzVHlwZSA9PSBudWxsKSkgewogCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KIAkJCUphdmFIZWxwZXJzIGZpbmFsVHlwZSA9ICgoQXJyYXlUeXBlKWNsYXNzVHlwZSkuZ2V0RmluYWxDb21wb25lbnRUeXBlKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1dBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YQppbmRleCBhNTQ5MzgwLi4yYTA3YzExIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9XQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKIAogcHVibGljIGZpbmFsIGNsYXNzIFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIndhcnZhbGlkYXRpb24iOy8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi53YXJ2YWxpZGF0aW9uIjsvLyROT04tTkxTLTEkCiAKIAlwcml2YXRlIFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIoKSB7CiAJCS8vIERvIG5vdCBpbnN0YW50aWF0ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1dhclZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL1dhclZhbGlkYXRvci5qYXZhCmluZGV4IDhlYjhiNWIuLjFiNDQwODIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9XYXJWYWxpZGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vV2FyVmFsaWRhdG9yLmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luLkoyRUVDb3JlUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludDsKQEAgLTEzOSw2ICsxNDAsNyBAQAogCSAqIEFuc3dlciB0aGUgaWQgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB3aGljaCBpcyB1c2VkIGJ5IHRoZSByZWNlaXZlci4KIAkgKiA8L3A+CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRCYXNlTmFtZSgpIHsKIAkJcmV0dXJuIFdBUl9DQVRFR09SWTsKIAl9CkBAIC0xNTEsNiArMTUzLDcgQEAKIAkgKiBAc2VlIEoyRUVWYWxpZGF0b3IjZ2V0TmFtZQogCSAqLwogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogCQlyZXR1cm4gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5XZWJfQXJjaGl2ZV9WYWxpZGF0b3JfODsKIAl9CkBAIC0xNjMsNiArMTY2LDcgQEAKIAkgKiBAc2VlIEoyRUVWYWxpZGF0b3IjZ2V0TmFtZQogCSAqLwogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXROYW1lKExvY2FsZSBsb2NhbGUpIHsKIAkJcmV0dXJuIGdldE1lc3NhZ2UobnVsbCwgIndlYkFyY2hpdmVWYWxpZGF0b3IubmFtZSIsIGxvY2FsZSk7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0zMDYsMTEgKzMxMCwxMyBAQAogCSAqIGJ1aWxkIGlzIHBlcmZvcm1lZC4gT3RoZXJ3aXNlLCB2YWxpZGF0aW9uIG9uIGp1c3QgdGhlIGZpbGVzIGxpc3RlZCBpbiB0aGUgVmVjdG9yIGlzCiAJICogcGVyZm9ybWVkLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBpbkhlbHBlciwgSVJlcG9ydGVyIGluUmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKIAkJdmFsaWRhdGVJbkpvYihpbkhlbHBlciwgaW5SZXBvcnRlcik7CiAJfQogCQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGluSGVscGVyLCBJUmVwb3J0ZXIgaW5SZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewogCQlzdGF0dXMgPSBzdXBlci52YWxpZGF0ZUluSm9iKGluSGVscGVyLCBpblJlcG9ydGVyKTsKIAkJCkBAIC0zNjIsNyArMzY4LDcgQEAKIAkJCXZhbGlkYXRlKCk7CiAKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKIAkJCXBhcm1zWzBdID0gZS50b1N0cmluZygpOwogCQkJSU1lc3NhZ2UgZXJyb3JNc2cgPSBuZXcgTWVzc2FnZShnZXRCYXNlTmFtZSgpLCBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBFUlJPUl9XQVJfVkFMSURBVElPTl9GQUlMRUQsIHBhcm1zKTsKQEAgLTUwMSw3ICs1MDcsNyBAQAogCQkJCX0KIAkJCQlpZiAocmVtZW1iZXIuZ2V0KG5hbWUpICE9IG51bGwpIHsgLy8gQ2hlY2sgZm9yIGR1cHMKIAkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzFdOwotCQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8yNSArICI6ICIgKyBuYW1lOworCQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8yNSArICI6ICIgKyBuYW1lOyAvLyROT04tTkxTLTEkCiAJCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FTlRSWSwgcGFybXMsIGluaXRQYXJhbSk7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KQEAgLTY1NywxMCArNjYzLDkgQEAKIAkgKi8KIAogCXB1YmxpYyB2b2lkIHZhbGlkYXRlRXJyb3JQYWdlcyhFTGlzdCBlcnJvclBhZ2VMaXN0KSB7Ci0JCUl0ZXJhdG9yIGVycm9yUGFnZXMgPSBlcnJvclBhZ2VMaXN0Lml0ZXJhdG9yKCk7Ci0KIAkJaWYgKGVycm9yUGFnZUxpc3QgPT0gbnVsbCB8fCBlcnJvclBhZ2VMaXN0LmlzRW1wdHkoKSkKIAkJCXJldHVybjsKKwkJSXRlcmF0b3IgZXJyb3JQYWdlcyA9IGVycm9yUGFnZUxpc3QuaXRlcmF0b3IoKTsKIAogCQl3aGlsZSAoZXJyb3JQYWdlcy5oYXNOZXh0KCkpIHsKIAkJCQpAQCAtNjc2LDcgKzY4MSw3IEBACiAJCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfRXJyb3JfTG9jYXRpb25fNDc7CiAJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRU1QVFlfRU5UUlksIHBhcm1zLCBuZXh0UGFnZSk7CiAJCQl9Ci0JCQlpZiAoIWxvY2F0aW9uLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCisJCQlpZiAobG9jYXRpb24gIT0gbnVsbCAmJiAhbG9jYXRpb24uc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07CiAJCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfRXJyb3JfTG9jYXRpb25fNDk7CiAJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9QQUdFLCBwYXJtcywgbmV4dFBhZ2UpOwpAQCAtNzg4LDcgKzc5Myw3IEBACiAJCQlpZiAobmFtZSAhPSBudWxsKSB7CiAJCQkJaWYgKHJlbWVtYmVyLmdldChuYW1lKSAhPSBudWxsKSB7IC8vIENoZWNrIGZvciBkdXBzCiAJCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfRW52X0VudHJ5X05hbWVfX184OCArICI6ICIgKyBuYW1lOworCQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9FbnZfRW50cnlfTmFtZV9fXzg4ICsgIjogIiArIG5hbWU7IC8vJE5PTi1OTFMtMSQKIAkJCQkJYWRkV2FybmluZyhXQVJfQ0FURUdPUlksIE1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZLCBwYXJtcywgZW50cnkpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXJlbWVtYmVyLnB1dChuYW1lLCAiWWVhIik7IC8vJE5PTi1OTFMtMSQKQEAgLTgzNyw3ICs4NDIsNyBAQAogCQkJaWYgKHJlbWVtYmVyLmdldChleHQpICE9IG51bGwpIHsgLy8gQ2hlY2sgZm9yIGR1cHMKIAogCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1sxXTsKLQkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9NaW1lX0V4dGVuc2lvbl9fXzU2ICsgIjogIiArIGV4dDsKKwkJCQlwYXJtc1swXSA9IFdBUlZhbGlkYXRpb25SZXNvdXJjZUhhbmRsZXIub2ZfVHlwZV9NaW1lX0V4dGVuc2lvbl9fXzU2ICsgIjogIiArIGV4dDsgLy8kTk9OLU5MUy0xJAogCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FTlRSWSwgcGFybXMsIG1pbWVNYXApOwogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtMTE2OSw3ICsxMTc0LDcgQEAKIAogCQkJCS8vIElzIGlzIGEgdmFsaWQgVVJJIG5vdGF0aW9uID8KIAkJCQl0cnkgewotCQkJCQlpZiAodXJsLmVxdWFscygiIikpCisJCQkJCWlmICh1cmwuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAogCQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLkludmFsaWRfVVJMXzcwKTsKIAkJCQkJLy8gWW91IGNhbid0IHVzZSBjb20uaWJtLndlYnRvb2xzLlVSSSBoZXJlLi4uCiAJCQkJCS8vIGNvbS5pYm0uaXd0LndlYnRvb2xzLlVSSSB1cmkgPSBuZXcgY29tLmlibS5pd3Qud2VidG9vbHMuVVJJKHVybCkgOwpAQCAtMTI1NSw3ICsxMjYwLDcgQEAKIAogCQkJLy8gSXMgaXMgYSB2YWxpZCBVUkkgbm90YXRpb24gPwogCQkJdHJ5IHsKLQkJCQlpZiAodXJsLmVxdWFscygiIikpCisJCQkJaWYgKHVybC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCiAJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5JbnZhbGlkX1VSTF83NSk7CiAKIAkJCQkvLwpAQCAtMTM3OCw3ICsxMzgzLDcgQEAKIAkJCWlmIChyZW1lbWJlci5nZXQodXJpKSAhPSBudWxsKSB7IC8vIENoZWNrIGZvciBkdXBzCiAKIAkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfVGFnTGliX19fODEgKyAiOiAiICsgdXJpOworCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1RhZ0xpYl9fXzgxICsgIjogIiArIHVyaTsgLy8kTk9OLU5MUy0xJAogCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FTlRSWSwgcGFybXMsIHRhZ2xpYik7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC0xNDUwLDEwICsxNDU1LDEyIEBACiAJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nWzBdOwogCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfV0VMQ09NRV9GSUxFLCBwYXJtcywgbmV4dEZpbGUpOwogCQkJfQotCQkJZmlsZU5hbWUgPSBmaWxlTmFtZS50cmltKCk7CisJCQlpZihmaWxlTmFtZSAhPSBudWxsKXsKKwkJCQlmaWxlTmFtZSA9IGZpbGVOYW1lLnRyaW0oKTsKKwkJCX0KIAkJCWlmIChyZW1lbWJlci5nZXQoZmlsZU5hbWUpICE9IG51bGwpIHsKIAkJCQlTdHJpbmdbXSBwYXJtcyA9IG5ldyBTdHJpbmdbMV07Ci0JCQkJcGFybXNbMF0gPSBXQVJWYWxpZGF0aW9uUmVzb3VyY2VIYW5kbGVyLm9mX1R5cGVfV2VsY29tZV9GaWxlX05hbWVfXzg3ICsgIjogIiArIGZpbGVOYW1lOworCQkJCXBhcm1zWzBdID0gV0FSVmFsaWRhdGlvblJlc291cmNlSGFuZGxlci5vZl9UeXBlX1dlbGNvbWVfRmlsZV9OYW1lX184NyArICI6ICIgKyBmaWxlTmFtZTsgLy8kTk9OLU5MUy0xJAogCQkJCWFkZFdhcm5pbmcoV0FSX0NBVEVHT1JZLCBNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9FTlRSWSwgcGFybXMsIG5leHRGaWxlKTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTE0NjYsNiArMTQ3Myw3IEBACiAJCXJldHVybiBudWxsOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewogCQl3YXJGaWxlID0gbnVsbDsKIAkJd2ViREQgPSBudWxsOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9hcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9hcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24ucHJvcGVydGllcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9hcHBsaWNhdGlvbmNsaWVudHZhbGlkYXRpb24ucHJvcGVydGllcwpyZW5hbWUgdG8gcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL2FwcGxpY2F0aW9uY2xpZW50dmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vZWFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL2VhcnZhbGlkYXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWNkYjQyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL2VhcnZhbGlkYXRpb24ucHJvcGVydGllcwpAQCAtMCwwICsxLDE0NSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoaXMgcHJvcGVydGllcyBmaWxlIGhvbGQgYWxsIHRoZSBleHRlcm5hbGlzZWQgc3RyaW5ncyBmb3IgZVRvb2xzIAorIyBFQVIgVmFsaWRhdGlvbiBwcm9qZWN0CisjCisjIE1lc3NhZ2VzIHNob3VsZCBiZSBhY2NvcmRpbmcgdG8gdGhlIGZvcm1hdCBhdCAKKyMgICBodHRwOi8vaGFueS5hdXN0aW4uaWJtLmNvbS9tZXNzYWdlcy9pbmRleC5odG1sCisjCisjIEJyaWVmbHk6CisjICAgICBNRVNTQUdFX0lEPTxDb21wb25lbnRQcmVmaXg+PE1lc3NhZ2VOdW1iZXI+PFR5cGVDb2RlPjogPE1lc3NhZ2VUZXh0PgorIworIyBUaGUgcHJlZml4IGZvciB0aGlzIGNvbXBvbmVudCBpczoKKyMgICAgIENIS1cgKElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbikKKyMKKyMgTWVzc2FnZSBudW1iZXJzIGFyZSBmb3VyIGRpZ2l0IG51bWJlcnMsIGZyb20gJzAwMDAnIHRvICc5OTk5JywgaW5jbHVzaXZlLgorIyBNZXNzYWdlIG51bWJlcnMgYXJlIGZpbGxlZCB0byB0aGUgbGVmdCB3aXRoICcwJywgdG8gYSB3aWR0aCBvZiA0LgorIworIyBWYWxpZCBtZXNzYWdlIHR5cGUgY29kZXMgYXJlOgorIyAgICAgSSAoSW5mb3JtYXRpb25hbCkKKyMgICAgIFcgKFdhcm5pbmcpCisjICAgICBFIChFcnJvcikKKyMKKyMgTm90ZSB0aGUgIjogIiB0aGF0IGFwcGVhcnMgYmV0d2VlbiB0aGUgdHlwZSBjb2RlIGFuZCB0aGUgbWVzc2FnZSB0ZXh0LgorIworIyA6QmVnaW46IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkJlZ2luOgorI0NPTVBPTkVOVFBSRUZJWCBDSEtKCisjQ09NUE9ORU5UTkFNRUZPUiBDSEtKIElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbgorI0NNVkNQQVRITkFNRSBuY2Yvc3JjL2phdmEvY29tL2libS93ZWJzcGhlcmUvdmFsaWRhdGlvbi9lYXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKKyMgOkVuZDogV2ViU3BoZXJlIFF1YWxpdHkgVmFsaWRhdGlvbiBJbmZvcm1hdGlvbiA6RW5kOgorIworIyAyOS1KdW5lLTIwMDE6CisjICBUaGlzIGZpbGUgaGFzIGJlZW4gdGVzdGVkIHVzaW5nIHRoZSBQcm9jZXNzTXNnRmlsZSB0b29sLCB3cml0dGVuIGJ5IAorIyAgSGFueSBTYWxlbSBhbmQgb3duZWQgYnkgRGVubmlzIEhlYmVydC4gIEFueSBmdXR1cmUgY2hhbmdlcyBzaG91bGQgCisjICBhbHNvIGJlIHZlcmlmaWVkIHVzaW5nIHRoaXMgdG9vbC4gIFBsZWFzZSBjb250YWN0IERlbm5pcyAKKyMgIChoZWJlcnRAdXMuaWJtLmNvbSBvciBUL0wgNTQzLTI1MjApIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUlJPUl9FQVJfVkFMSURBVElPTl9GQUlMRUQ9Q0hLSjEwMDBFOiBFQVIgVmFsaWRhdGlvbiBmYWlsZWQ6IHswfQorI0VYUExBTkFUSU9OIE5vbmUuCisjVVNFUkFDVElPTiBOb25lLgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFUlJPUl9FQVJfSU5WQUxJRF9FQVJfRklMRT1DSEtKMTAwMUU6IFRoZSBFQVIgcHJvamVjdCB7MH0gaXMgaW52YWxpZC4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVJST1JfRUFSX0RVUExJQ0FURV9ST0xFUz1DSEtKMTAwMkU6IER1cGxpY2F0ZSBzZWN1cml0eSByb2xlIG5hbWVkIHswfS4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTUVTU0FHRV9FQVJfTk9fTU9EVUxFX1VSST1DSEtKMTAwM0U6IEEgbW9kdWxlIGhhcyBiZWVuIGRlZmluZWQgd2l0aCBubyBVUkkuCisjRVhQTEFOQVRJT04gTm9uZS4KKyNVU0VSQUNUSU9OIE5vbmUuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01FU1NBR0VfRUFSX01JU1NJTkdfVVJJPUNIS0oxMDA0RTogVGhlIFVSSSwgezB9LCBkb2VzIG5vdCBtYXRjaCBhbnl0aGluZyBpbiB0aGUgRUFSIGZpbGUuCisjRVhQTEFOQVRJT04gTm9uZS4KKyNVU0VSQUNUSU9OIE5vbmUuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VBUl9ERF9QQVJTRV9MSU5FQ09MPUNIS0oxMDA1RTogVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgbG9hZGVkLiBUaGUgc3RhcnQgb2YgdGhlIGJhZCBzZWN0aW9uIGlzIGF0IGxpbmUgezB9LCBjb2x1bW4gezF9LgorI0VYUExBTkFUSU9OIE5vbmUuCisjVVNFUkFDVElPTiBOb25lLgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQVJfRERfUEFSU0VfTElORT1DSEtKMTAwNkU6IFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGxvYWRlZC4gVGhlIHN0YXJ0IG9mIHRoZSBiYWQgc2VjdGlvbiBpcyBhdCBsaW5lIHswfS4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRUFSX0REX1BBUlNFX05PSU5GTz1DSEtKMTAwN0U6IFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGxvYWRlZC4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRUFSX0REX0NBTk5PVF9PUEVOX0REPUNIS0oxMDA4RTogQ2Fubm90IG9wZW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVmFsaWRhdGlvbiBjYW5ub3QgY29tcGxldGUuCisjRVhQTEFOQVRJT04gTm9uZS4KKyNVU0VSQUNUSU9OIE5vbmUuCisKKyMgZXJyb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVVJJX0NPTlRBSU5TX1NQQUNFU19FUlJPUl89SVdBRTAwMDVFIFRoZSBVUkkgezB9IGNvbnRhaW5zIGEgc3BhY2UuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkIGJlY2F1c2UgaXQgY2Fubm90IGJlIHJlZmVyZW5jZWQgZnJvbSBhIG1hbmlmZXN0IGZpbGUuCitNRVNTQUdFX0VBUl9EVVBMSUNBVEVfVVJJX0VSUk9SXz1JV0FFMDAwNkUgVGhlIG1vZHVsZSB7MH0gaGFzIGR1cGxpY2F0ZSB1cmkgaW4gRUFSOiB7MX0uCitNRVNTQUdFX0VBUl9EVVBJQ0FURV9ST09UQ09OVEVYVF9FUlJPUl89SVdBRTAwMDdFIFNhbWUgY29udGV4dCByb290ICJ7MH0iIGV4aXN0cyBpbiBXZWIgbW9kdWxlcyAiezF9IiBhbmQgInsyfSIuCitNRVNTQUdFX0VNUFRZX0FMVF9ERF9FUlJPUl89SVdBRTAwMDlFIFRoZSBtb2R1bGUgezB9IGhhcyBlbXB0eSA8YWx0LWRkPiB0YWcgaW4gRUFSIHsxfS4gIFRoZSB0YWcgc2hvdWxkIGJlIHJlbW92ZWQgb3IgdGhlIHZhbHVlIHNob3VsZCBiZSB2YWxpZC4KK0RVUExJQ0FURV9VVElMSkFSX0ZPUl9QUk9KRUNUX05BTUVfRVJST1JfPUlXQUUwMDEwRSA9VGhlIHByb2plY3QgezB9IGluIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB7MX0gaGFzIGR1cGxpY2F0ZSB1dGlsaXR5IEpBUiBVUkkgezJ9LgorRFVQTElDQVRFX01PRFVMRV9GT1JfUFJPSkVDVF9OQU1FX0VSUk9SXz1JV0FFMDAxMUUgVGhlIHByb2plY3QgezB9IGluIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB7MX0gaGFzIGR1cGxpY2F0ZSBtb2R1bGUgbmFtZSB7Mn0uCitNRVNTQUdFX1VUSUxfVVJJX05BTUVfQ09MTElTSU9OX0VSUk9SXz1JV0FFMDAxMkUgVGhlIG1vZHVsZSB7MH0gaW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHsxfSBoYXMgc2FtZSBuYW1lIGFzIHV0aWxpdHkgSkFSIFVSSS4KK01FU1NBR0VfVVRJTF9QUk9KRUNUX05BTUVfQ09MTElTSU9OX0VSUk9SXz1JV0FFMDAxM0UgVGhlIG1vZHVsZSB7MH0gaW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHsxfSBoYXMgc2FtZSBuYW1lIGFzIHV0aWxpdHkgSkFSIHByb2plY3QgbmFtZS4KK0VSUk9SX1JFQURJTkdfTUFOSUZFU1RfRVJST1JfPUlXQUUwMDE0RSBBbiBlcnJvciBvY2N1cnJlZCB2YWxpZGF0aW5nIHRoZSBNQU5JRkVTVC5NRiBmaWxlIGluIGFyY2hpdmUgezB9LgorTUFOSUZFU1RfTElORV9FTkRfRVJST1JfPUlXQUUwMDE1RSBUaGUgTUFOSUZFU1QuTUYgZmlsZSBpbiBhcmNoaXZlIHswfSBkb2VzIG5vdCBlbmQgd2l0aCBhIG5ld2xpbmUuCitNQU5JRkVTVF9MSU5FX0VYQ0VFRFNfTEVOR1RIX0VSUk9SXz1JV0FFMDAxNkUgTGluZSB7MH0gaW4gdGhlIE1BTklGRVNULk1GIGZpbGUgaW4gYXJjaGl2ZSB7MX0gZXhjZWVkcyB0aGUgc3BlY2lmaWNhdGlvbiBsaW1pdCBvZiA3MiBieXRlcy4KKworSU5WQUxJRF9VUklfRk9SX01PRFVMRV9FUlJPUl89SVdBRTAwMTdFIFRoZSBtb2R1bGUgezB9IGhhcyBhIHdyb25nIGRlZmF1bHQgZXh0ZW5zaW9uICguamFyIGZvciBFSkIgbW9kdWxlcyBhbmQgLndhciBmb3IgV2ViIG1vZHVsZXMpLgorRUFSX0lOVkFMSURfRE9DX1RZUEVfRVJST1JfPUlXQUUwMDE4RSBEb2N1bWVudCB0eXBlIHZlcnNpb24gInswfSIgZm9yIGFwcGxpY2F0aW9uLnhtbCBpbiBwcm9qZWN0ICJ7MX0iIG5lZWRzIHRvIGJlIHZlcnNpb24gInsyfSIuCisKK01PRFVMRV9ERF9QQVJTRV9MSU5FQ09MX0VSUk9SXz1JV0FFMDAxOUUgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBvZiBtb2R1bGUgezB9IGNvdWxkIG5vdCBiZSBsb2FkZWQuIFRoZSBiYWQgc2VjdGlvbiBzdGFydHMgYXQgbGluZSB7MX0sIGNvbHVtbiB7Mn0uCitNT0RVTEVfRERfUEFSU0VfTElORV9FUlJPUl89SVdBRTAwMjBFIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igb2YgbW9kdWxlIHswfSBjb3VsZCBub3QgYmUgbG9hZGVkLiBUaGUgYmFkIHNlY3Rpb24gc3RhcnRzIGF0IGxpbmUgezF9CitNT0RVTEVfRERfUEFSU0VfTk9JTkZPX0VSUk9SXz1JV0FFMDAyMUUgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBvZiBtb2R1bGUgezB9IGNvdWxkIG5vdCBiZSBsb2FkZWQuCitFSkJfQkVBTl9FSkJfTElOS19JTlRFRkFDRV9NSVNNQVRDSF9FUlJPUl89SVdBRTAwMzdFIFRoZSBpbnRlcmZhY2VzIG9mIHRoZSBsaW5rZWQgZW50ZXJwcmlzZSBiZWFuIHswfSBkbyBub3QgbWF0Y2ggdGhvc2UgaW4gRUpCIHJlZiB7MX0gaW4gbW9kdWxlIHsyfS4KKworQ0xBU1NQQVRIX0NPTVBPTkVOVF9VUklfTUFUQ0hFU19BUkNISVZFX1VSST1VUkkgezF9IGZvciBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY3kgZnJvbSBwcm9qZWN0IHswfSBjbGFzaGVzIHdpdGggZXhpc3RpbmcgYXJjaGl2ZSBpbiBFQVIuCitEVVBMSUNBVEVfQ0xBU1NQQVRIX0NPTVBPTkVOVF9VUkk9VVJJIHsxfSBmb3IgY2xhc3NwYXRoIGRlcGVuZGVuY3kgZnJvbSBwcm9qZWN0IHswfSBtYXBzIHRvIGEgZGlmZmVyZW50IGZpbGUgc3lzdGVtIHBhdGggYXMgYW5vdGhlciBjbGFzc3BhdGggZGVwZW5kZW5jeSB3aXRoIHRoZSBzYW1lIFVSSS4KKworSkVFNV9QUk9KRUNUX1JFRkVSRU5DRURfQllfUFJFX0pFRTVfRUFSPUZhY2V0IHZlcnNpb24gZm9yIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB7MH0gbXVzdCBiZSA1LjAgdG8gY29udGFpbiBKYXZhIEVFIDUuMCBwcm9qZWN0IHsxfS4KKworIyB3YXJuaW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitXQVJOSU5HX01FVEFGT0xERVJfTUlTU0lORz1JV0FKMDAwMFc6IE1ldGEgZm9sZGVyIHswfSBtdXN0IGV4aXN0IGluIHByb2plY3QgezF9LgorV0FSTklOR19GSUxFX01JU1NJTkc9SVdBSjAwMDFXOiB7MH0gbXVzdCBleGlzdCBpbiBwcm9qZWN0IHsxfS4KK01FU1NBR0VfSU5WQUxJRF9BTFRfRERfV0FSTl89SVdBRTAwMjJXIFRoZSBtb2R1bGUgezB9IGhhcyBhbHQtZGQgezF9LCBidXQgdGhlIHJlc291cmNlIGRvZXMgbm90IGV4aXN0IGluIEVBUiB7Mn0uCitJTlZBTElEX01BTklGRVNUX0NMQVNTUEFUSF9PTkVfV0FSTl89SVdBRTAwMjNXIFRoZSBNYW5pZmVzdCBDbGFzcy1QYXRoIGluIGFyY2hpdmUgezB9IGNvbnRhaW5zIGFuIGVudHJ5IHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIGluIHRoZSBFQVI6IHsxfS4KK0lOVkFMSURfTUFOSUZFU1RfQ0xBU1NQQVRIX1RXT19XQVJOXz1JV0FFMDAyNFcgVGhlIE1hbmlmZXN0IENsYXNzLVBhdGggZm9yIGFyY2hpdmUgezB9IGNvbnRhaW5zIGFuIGVudHJ5LCB7MX0sIHRoYXQgaXMgbm90IHJlc29sdmFibGUgdG8gYSBmaWxlIG9yIG1vZHVsZSBpbiB0aGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbjogezJ9LgorSU5WQUxJRF9NQU5JRkVTVF9DTEFTU1BBVEhfREVQRU5ERU5DWV9XQVJOXz1JV0FFMDAyNVcgVGhlIE1hbmlmZXN0IENsYXNzLVBhdGggaW4gbW9kdWxlIHswfSBjb250YWlucyBhbiBlbnRyeSwgezF9LCB0aGF0IHJlc29sdmVzIHRvIGFyY2hpdmUgezJ9LiAgVGhpcyBkZXBlbmRlbmN5IGRvZXMgbm90IGNvbXBseSB3aXRoIHRoZSBKYXZhIEVFIHNwZWNpZmljYXRpb24uCitQUk9KRUNUX0lTX0NMT1NFRF9XQVJOXz1JV0FFMDAyNlcgRUFSIFZhbGlkYXRpb24gY2Fubm90IHJ1biBvbiBjbG9zZWQgcHJvamVjdDogezB9LiBPcGVuIHRoZSBwcm9qZWN0LCBhbmQgdHJ5IGFnYWluLgorUFJPSkVDVF9ET0VTX05PVF9FWElTVF9XQVJOXz1JV0FFMDAyN1cgVGhlIHByb2plY3QgezB9IGZvciBtb2R1bGUgb3IgdXRpbGl0eSBKQVIgezF9IGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7Mn0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4KK01JU1NJTkdfV0VCTkFUVVJFX0ZPUk1PRFVMRV9XQVJOXz1JV0FFMDAyOFcgVGhlIHdlYiBtb2R1bGUgezB9IGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7MX0gaXMgbm90IGEgSmF2YSBFRSBXZWIgcHJvamVjdC4KK0RFUFJFQ0FURURfQUJTUEFUSFNfV0FSTl89SVdBRTAwMjlXIFRoZSBJQk0gZXh0ZW5zaW9ucyBmaWxlIGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdCB7MH0gY29udGFpbnMgZGVwcmVjYXRlZCBhYnNvbHV0ZSBwYXRocy4gIFVzZSB0aGUgYXBwbGljYXRpb24gZWRpdG9yIHRvIGNsZWFuIHVwIHRoZSBmaWxlLgorSU5WQUxJRF9DT05URVhUUk9PVF9XRUJNT0RVTEVfV0FSTl89SVdBRTAwMzBXIFRoZSBjb250ZXh0IHJvb3QgZm9yIFdlYiBtb2R1bGU6IHswfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3Q6IHsxfSBkb2VzIG5vdCBtYXRjaCB0aGUgY29udGV4dCByb290IGluIHdlYiBwcm9qZWN0IHNldHRpbmdzIG9mIHsyfS4KK01JU1NJTkdfQ0xJRU5UTkFUVVJFX0ZPUk1PRFVMRV9XQVJOXz1JV0FFMDAzMVcgVGhlIGFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUgezB9IGluIGVudGVycHJpc2UgYXBwbGljYXRpb24gcHJvamVjdDp7MX0gaXMgbm90IGFuIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0LgorTUlTU0lOR19FSkJOQVRVUkVfRk9STU9EVUxFX1dBUk5fPUlXQUUwMDMyVyBUaGUgRUpCIG1vZHVsZSB7MH0gaW4gZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0IHsxfSBpcyBub3QgYW4gRUpCIHByb2plY3QuCitNSVNTSU5HX1BST0pFQ1RfRk9STU9EVUxFX1dBUk5fPUlXQUUwMDMzVyBUaGUgbW9kdWxlIHswfSBpbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgezF9IGhhcyBub3QgYmVlbiBjb25maWd1cmVkIGFzIGEgSmF2YSBFRSBtb2R1bGUgZGVwZW5kZW5jeS4gCitJTlZBTElEX0NBU0VfRk9SX01BTklGRVNUX0VSUk9SXz1JV0FFMDAzOEUgVGhlIGNhc2Ugb2YgdGhlIG1hbmlmZXN0IGZpbGUgbmFtZSAiezB9IiBpbiBhcmNoaXZlIHsxfSBpbiBpbmNvcnJlY3QuICBGaWxlIG5hbWUgbXVzdCBiZSAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiLCBjYXNlIHNlbnNpdGl2ZS4KK1VSSV9BTFJFQURZX0VYSVNUU19JTl9FQVJfV0FSTl89SVdBRTAwMzlXIFByb2plY3QgdXRpbGl0eSBKQVIgVVJJIHswfSBjb2xsaWRlcyB3aXRoIGFuIGV4aXN0aW5nIGZpbGUgaW4gcHJvamVjdCB7MX0uCitNSVNTSU5HX01PRFVMRV9FWFRFTlNJT05fRVJST1JfPUlXQUUwMDQwRSBUaGUgYXBwbGljYXRpb24gZXh0ZW5zaW9uIGluIEVBUiBwcm9qZWN0OiB7MH0gaXMgbWlzc2luZyBtb2R1bGUgZXh0ZW5zaW9uIGZvciBtb2R1bGUgcHJvamVjdDogezF9LgorUFJPSkVDVF9TRVJWRVJfVEFSR0VUX0RPRVNfTk9UX01BVENIX0VBUj1UaGUgdGFyZ2V0IHNlcnZlciBvZiB0aGUgbW9kdWxlIHByb2plY3QgInswfSIgZG9lcyBub3QgbWF0Y2ggdGhlIHRhcmdldCBzZXJ2ZXIgb2YgdGhlIGNvbnRhaW5pbmcgZW50ZXJwcmlzZSBhcHBsaWNhdGlvbiBwcm9qZWN0ICJ7MX0iCitOT19TRVJWRVJfVEFSR0VUX01PRFVMRV9JTl9FQVJfV0lUSF9TRVJWRVJfVEFSR0VUPVRoZSBtb2R1bGUgcHJvamVjdCAiezB9IiB3aXRoIG5vIHRhcmdldCBzZXJ2ZXIgYmVsb25ncyB0byBhbiBlbnRlcnByaXNlIGFwcGxpY2F0aW9uIHByb2plY3QgInsxfSIgdGhhdCBoYXMgYSB0YXJnZXQgc2VydmVyCitOT19TRVJWRVJfVEFSR0VUX09OX0VBUl9XSVRIX01PRFVMRV9TRVJWRVJfVEFSR0VUUz1UaGUgZWFyIHByb2plY3QgInswfSIgd2l0aCBubyB0YXJnZXQgc2VydmVyIGhhcyBtb2R1bGUgcHJvamVjdCAiezF9IiB0aGF0IGhhcyBhIHRhcmdldCBzZXJ2ZXIKK0lOVkFMSURfRUFSX1NFUlZFUl9UQVJHRVRfRk9SXzE0X1NQRUNfTEVWRUw9VGhlIEphdmEgRUUgMS40IHNwZWNpZmljYXRpb24gRUFSIHByb2plY3QgInswfSIgaGFzIGFuIGluY29tcGF0aWJsZSB0YXJnZXQgc2VydmVyICJ7MX0iCitJTlZBTElEX01PRFVMRV9TRVJWRVJfVEFSR0VUX0ZPUl8xNF9TUEVDX0xFVkVMPVRoZSBKYXZhIEVFIDEuNCBzcGVjaWZpY2F0aW9uIG1vZHVsZSBwcm9qZWN0ICJ7MH0iIGhhcyBhbiBpbmNvbXBhdGlibGUgdGFyZ2V0IHNlcnZlciAiezF9Ii4KK01FU1NBR0VfSU5DT01QQVRJQkxFX1NQRUNfV0FSTklOR189SVdBRTAwMDhFIFRoZSBtb2R1bGUgInswfSIgaXMgYXQgYW4gaW5jb21wYXRpYmxlIEphdmEgRUUgc3BlY2lmaWNhdGlvbiBsZXZlbCB0aGFuIHRoYXQgb2YgdGhlICJ7MX0iIEVudGVycHJpc2UgQXBwbGljYXRpb24uCitNRVNTQUdFX0lOQ09NUEFUSUJMRV8xM19TUEVDX1dBUk5JTkdfPUlXQUUwMDA4RSBUaGUgbW9kdWxlICJ7MH0iIGlzIEphdmEgRUUgdjEuMyBzcGVjaWZpY2F0aW9uIGxldmVsLCB3aGljaCBpcyBpbmNvbXBhdGlibGUgaW4gdGhlIHYxLjIgRUFSLgorTUVTU0FHRV9JTkNPTVBBVElCTEVfMTRfU1BFQ19XQVJOSU5HXz1UaGUgbW9kdWxlICJ7MH0iIGlzIEphdmEgRUUgdjEuNCBzcGVjaWZpY2F0aW9uIGxldmVsLCB3aGljaCBpcyBpbmNvbXBhdGlibGUgaW4gdGhlIHYxLjMgRUFSLgorRUFSX1ZBTElEQVRJT05fSU5URVJOQUxfRVJST1JfVUlfPUlXQUUwMDUzRSBBbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQgcnVubmluZyB2YWxpZGF0aW9uIG9uIHByb2plY3Q6ezB9LCBjaGVjayB0aGUgbG9nIGZpbGUgZm9yIGRldGFpbHMKK0VhclZhbGlkYXRvcl9WYWxpZGF0aW5nX01vZHVsZV89VmFsaWRhdGluZyBNb2R1bGVzCitFYXJWYWxpZGF0b3JfVmFsaWRhdGluZ19SZWZfPVZhbGlkYXRpbmcgUmVmcworVmFsaWRhdGlvblJ1bGVVdGlsaXR5X2ludmFsaWRfcGFyYW1ldGVyX2phdmFDbGFzc05hbWVfPWludmFsaWQgcGFyYW1ldGVyOyBqYXZhQ2xhc3NOYW1lID0gezB9IGFuZCByZXNvdXJjZVNldCA9IHsxfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9lamJ2YWxpZGF0b3IucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9lamJ2YWxpZGF0b3IucHJvcGVydGllcwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9lamJ2YWxpZGF0b3IucHJvcGVydGllcwpyZW5hbWUgdG8gcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL2VqYnZhbGlkYXRvci5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL3JhcnZhbGlkYXRpb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9yYXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlLXZhbGlkYXRpb24vcmFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCnJlbmFtZSB0byBwbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vcmFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL2ludGVybmFsL3ZhbGlkYXRpb24vd2FydmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL3dhcnZhbGlkYXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzg4Mzk3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9pbnRlcm5hbC92YWxpZGF0aW9uL3dhcnZhbGlkYXRpb24ucHJvcGVydGllcwpAQCAtMCwwICsxLDI1NyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjVGhpcyBwcm9wZXJ0aWVzIGZpbGUgaG9sZCBhbGwgdGhlIGV4dGVybmFsaXNlZCBzdHJpbmdzIGZvciBlVG9vbHMgV0FSIFZhbGlkYXRpb24gcHJvamVjdAorIyBWYWxpZGF0aW9uIHByb2plY3QKKyMKKyMgTWVzc2FnZXMgc2hvdWxkIGJlIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IGF0OgorIyAgICAgaHR0cDovL2hhbnkuYXVzdGluLmlibS5jb20vbWVzc2FnZXMvaW5kZXguaHRtbAorIworIyBCcmllZmx5OgorIyAgICAgTUVTU0FHRV9JRD08Q29tcG9uZW50UHJlZml4PjxNZXNzYWdlTnVtYmVyPjxUeXBlQ29kZT46IDxNZXNzYWdlVGV4dD4KKyMKKyMgVGhlIHByZWZpeCBmb3IgdGhpcyBjb21wb25lbnQgaXM6CisjICAgICBDSEtKIChJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24pCisjCisjIE5vdGUgdGhlICI6ICIgdGhhdCBhcHBlYXJzIGJldHdlZW4gdGhlIHR5cGUgY29kZSBhbmQgdGhlIG1lc3NhZ2UgdGV4dC4KKyMKKyMgOkJlZ2luOiBXZWJTcGhlcmUgUXVhbGl0eSBWYWxpZGF0aW9uIEluZm9ybWF0aW9uIDpCZWdpbjoKKyNDT01QT05FTlRQUkVGSVggQ0hLSgorI0NPTVBPTkVOVE5BTUVGT1IgQ0hLSiBJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24KKyNDTVZDUEFUSE5BTUUgbmNmL3NyYy9qYXZhL2NvbS9pYm0vd2Vic3BoZXJlL3ZhbGlkYXRpb24vd2FydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCisjIDpFbmQ6IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkVuZDoKKyMKKworIyAyLUp1bHktMjAwMToKKyMgIFRoaXMgZmlsZSBoYXMgYmVlbiB0ZXN0ZWQgdXNpbmcgdGhlIFByb2Nlc3NNc2dGaWxlIHRvb2wsIHdyaXR0ZW4gYnkKKyMgIEhhbnkgU2FsZW0gYW5kIG93bmVkIGJ5IERlbm5pcyBIZWJlcnQuICBBbnkgZnV0dXJlIGNoYW5nZXMgc2hvdWxkCisjICBhbHNvIGJlIHZlcmlmaWVkIHVzaW5nIHRoaXMgdG9vbC4gIFBsZWFzZSBjb250YWN0IERlbm5pcworIyAgKGhlYmVydEB1cy5pYm0uY29tIG9yIFQvTCA1NDMtMjUyMCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VSUk9SX1dBUl9WQUxJREFUSU9OX0ZBSUxFRD1DSEtKMzAwMEU6IFdBUiBWYWxpZGF0aW9uIEZhaWxlZDogezB9CisjRVhQTEFOQVRJT04gTm9uZS4KKyNVU0VSQUNUSU9OIE5vbmUuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VSUk9SX0VBUl9EVVBMSUNBVEVfUk9MRVM9Q0hLSjEwMDJFOiBEdXBsaWNhdGUgc2VjdXJpdHkgcm9sZSBuYW1lZCB7MH0uCitNRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfSlNQPUNIS0ozMDAxRTogVGhlIEpTUCBmaWxlLCB7MH0sIGZvciB0aGUgc2VydmxldCBcInsxfVwiIGlzIG1pc3NpbmcuCisjRVhQTEFOQVRJT04gTm9uZS4KKyNVU0VSQUNUSU9OIE5vbmUuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01FU1NBR0VfV0FSX1ZBTElEQVRJT05fU01BTExfSUNPTj1DSEtKMzAwMkU6IFRoZSA8c21hbGwtaWNvbj4gZmlsZSwgezB9LCBpcyBtaXNzaW5nLgorI0VYUExBTkFUSU9OIE5vbmUuCisjVVNFUkFDVElPTiBOb25lLgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0xBUkdFX0lDT049Q0hLSjMwMDNFOiBUaGUgPGxhcmdlLWljb24+IGZpbGUsIHswfSwgaXMgbWlzc2luZy4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fU0VSVkxFVF9NQVBQSU5HPUNIS0ozMDA0VzogVGhlIHNlcnZsZXQgbWFwcGluZyBcInswfVwiIHJlZmVycyB0byBhIHNlcnZsZXQgdGhhdCBpcyBub3QgZGVmaW5lZC4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTUVTU0FHRV9XQVJfVkFMSURBVElPTl9OT19XRUxDT01FX0ZJTEU9Q0hLSjMwMDVFOiBFbXB0eSB3ZWxjb21lIGZpbGUgbGlzdCBlbnRyeS4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1dFTENPTUVfRklMRT1DSEtKMzAwNkU6IFdlbGNvbWUgZmlsZSB7MH0gaXMgbWlzc2luZy4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1RMRD1DSEtKMzAwN0U6IFRoZSBUYWcgTGlicmFyeSBEZXNjcmlwdG9yIEZpbGUsIHswfSwgaXMgbWlzc2luZy4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVJST1JfSU5WQUxJRF9XQVJfRklMRT1DSEtKMzAwOEU6IE1pc3Npbmcgb3IgaW52YWxpZCBXQVIgZmlsZS4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTUVTU0FHRV9XQVJfVkFMSURBVElPTl9CUk9LRU5fRklMVEVSX01BUFBJTkc9Q0hLSjMwMDlFOiBUaGUgZmlsdGVyIG1hcHBpbmcgXCJ7MH1cIiByZWZlcnMgdG8gYSBmaWx0ZXIgdGhhdCBpcyBub3QgZGVmaW5lZC4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1dFTENPTUVfRklMRT1DSEtKMzAxMFc6IFdlbGNvbWUgRmlsZXMgY2Fubm90IGJlZ2luIG9yIGVuZCB3aXRoIGEgLy4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorV0FSX0REX1BBUlNFX0xJTkVDT0w9Q0hLSjEwMDlFOiBQYXJzaW5nIEVycm9yOiB7MH0uCisjRVhQTEFOQVRJT04gTm9uZS4KKyNVU0VSQUNUSU9OIE5vbmUuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1dBUl9ERF9QQVJTRV9MSU5FPUNIS0oxMDEwRTogRGVwbG95bWVudCBEZXNjcmlwdG9yIFBhcnNpbmcgZXJyb3IuCisjRVhQTEFOQVRJT04gTm9uZS4KKyNVU0VSQUNUSU9OIE5vbmUuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1dBUl9ERF9QQVJTRV9OT0lORk89Q0hLSjEwMTFFOiBEZXBsb3ltZW50IERlc2NyaXB0b3IgUGFyc2luZyBlcnJvci4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorV0FSX0REX0NBTk5PVF9PUEVOX0REPUNIS0oxMDEyRTogQ2Fubm90IG9wZW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVmFsaWRhdGlvbiBjYW5ub3QgY29tcGxldGUuCisjRVhQTEFOQVRJT04gTm9uZS4KKyNVU0VSQUNUSU9OIE5vbmUuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9VUkw9Q0hLSjMwMTNFOiBUaGUgVVJMIE1hcHBpbmcgXCJ7MH1cIiBpcyBpbnZhbGlkLgorI0VYUExBTkFUSU9OIE5vbmUuCisjVVNFUkFDVElPTiBOb25lLgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfU0VDX1JPTEU9Q0hLSjMwMTRFOiBJbnZhbGlkIFNlY3VyaXR5IHJvbGUtbGluazogezB9LgorI0VYUExBTkFUSU9OIE5vbmUuCisjVVNFUkFDVElPTiBOb25lLgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfSFRUUF9DTUQ9Q0hLSjMwMTVFOiBJbnZhbGlkIEhUVFAgbWV0aG9kOiB7MH0uCisjRVhQTEFOQVRJT04gTm9uZS4KKyNVU0VSQUNUSU9OIE5vbmUuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9UUkFOU1BPUlQ9Q0hLSjMwMTZFOiBJbnZhbGlkIFRyYW5zcG9ydCBHdXJhcmFudGVlLiAgVmFsaWQgdmFsdWVzIGFyZSBcIk5PTkVcIiwgXCJJTlRFR1JBTFwiLCBvciBcIkNPTkZJREVOVElBTFwiLgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfSlNQRklMRV9SRUY9Q0hLSjMwMThFOiBUaGUganNwLWZpbGUgXCJ7MH1cIiByZWZlcmVuY2VkIGJ5IHNlcnZsZXQgezF9IG11c3QgYmUgYSBmdWxsIGFic29sdXRlIHBhdGguCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVJST1JfRUFSX0lOVkFMSURfQ09OVEVYVF9ST09UPUNIS0ozMDE3RTogV2ViIFByb2plY3Q6IHswfSBpcyBtYXBwZWQgdG8gYW4gaW52YWxpZCBDb250ZXh0IHJvb3Q6IHsxfSBpbiBFQVIgUHJvamVjdDogezJ9LgorI0VYUExBTkFUSU9OIE5vbmUuCisjVVNFUkFDVElPTiBOb25lLgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVJST1JfUEFHRT1JV0FFMDAwMUUgQ0hLSjMwMTlFOiBUaGUgTG9jYXRpb24gb2YgdGhlIEVycm9yIFBhZ2UgTXVzdCBCZWdpbiB3aXRoIGEgLy4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1NFQ19ST0xFX05BTUU9Q0hLSjMwMjBFOiBJbnZhbGlkIFNlY3VyaXR5IHJvbGUtbmFtZTogezB9LgorI0VYUExBTkFUSU9OIE5vbmUuCisjVVNFUkFDVElPTiBOb25lLgorCitNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfQVVUSF9NRVRIT0Q9Q0hLSjMwMjFFOiBJbnZhbGlkIGF1dGggbWV0aG9kLiAgVmFsaWQgdmFsdWVzIGFyZTogXCJCQVNJQ1wiLCBcIkRJR0VTVFwiLCBcIkZPUk1cIiwgb3IgXCJDTElFTlQtQ0VSVFwiLgorI0VYUExBTkFUSU9OIE5vbmUuCisjVVNFUkFDVElPTiBOb25lLgorCitNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lHTk9SRV9GT1JNX0xPR0lOPUNIS0ozMDIyRTogIEF1dGhlbnRpY2F0aW9uIG1ldGhvZCBpcyB7MH0uICBUaGUgZm9ybS1sb2dpbi1jb25maWcgdmFsdWVzIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgdXNpbmcgRk9STSBhdXRoZW50aWNhdGlvbiBtZXRob2QuCisjRVhQTEFOQVRJT04gTm9uZS4KKyNVU0VSQUNUSU9OIE5vbmUuCisKK01FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfUkVRVUlSRURfMjI9Q0hLSjMwMjNFOiAgUmVzb3VyY2UgcmVmIHswfSBtdXN0IGNvbnRhaW4gcmVzLWF1dGggb2YgIlNFUlZMRVQiIG9yICJDT05UQUlORVIiLgorTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMz1DSEtKMzAyNEU6ICBSZXNvdXJjZSByZWYgezB9IG11c3QgY29udGFpbiByZXMtYXV0aCBvZiAiQXBwbGljYXRpb24iIG9yICJDb250YWluZXIiLgorTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9JTlZBTElEXzIyPUNIS0ozMDI1RTogIFwiQXBwbGljYXRpb25cIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IucmVzLWF1dGggaW4gYSAyLjIgbGV2ZWwgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVXNlIFwiU0VSVkxFVFwiIGluc3RlYWQuCitNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjM9Q0hLSjMwMjZFOiAgXCJTRVJWTEVUXCIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yLnJlcy1hdXRoIGluIGEgMi4yIGxldmVsIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFVzZSBcIkFwcGxpY2F0aW9uXCIgaW5zdGVhZC4KKworTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VYQ0VQVElPTl9UWVBFPUNIS0ozMDI3RTogIEludmFsaWQgRXhjZXB0aW9uIFR5cGUgezB9LiAgVGhlIGV4Y2VwdGlvbiB0eXBlIG11c3QgY29udGFpbiBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX01BUFBJTkc9Q0hLSjQwMTBXOiBEdXBsaWNhdGUgVVJMIG1hcHBpbmcgezB9LgorI0VYUExBTkFUSU9OIE5vbmUuCisjVVNFUkFDVElPTiBOb25lLgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9TRVJWTEVUPUNIS0o0MDExVzogRHVwbGljYXRlIFNlcnZsZXQgRW50cnkgezB9LgorI0VYUExBTkFUSU9OIE5vbmUuCisjVVNFUkFDVElPTiBOb25lLgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNRVNTQUdFX1dBUl9WQUxJREFUSU9OX1NFU1NJT05fVElNRU9VVD1DSEtKNDAxMlc6IFNlc3Npb24gVGltZW91dCBpcyBub3QgdmFsaWQuCisjRVhQTEFOQVRJT04gTm9uZS4KKyNVU0VSQUNUSU9OIE5vbmUuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VOVFJZPUNIS0o0MDEzVzogRHVwbGljYXRlIEVudHJ5IHswfS4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTUVTU0FHRV9XQVJfVkFMSURBVElPTl9FTVBUWV9FTlRSWT1DSEtKNDAxNFc6IEVtcHR5IEVudHJ5IHswfS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRklMVEVSPUNIS0o0MDE1VzogRHVwbGljYXRlIEZpbHRlciBFbnRyeSB7MH0uCisjRVhQTEFOQVRJT04gTm9uZS4KKyNVU0VSQUNUSU9OIE5vbmUuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX0VKQl9SRUY9Q0hLSjQwMTZXOiBEdXBsaWNhdGUgZWpiLXJlZiBlbGVtZW50IG5hbWVkIHswfS4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyBUaGlzIHdhcyBtaXNzaW5nLiAgSXQncyBkZWZpbmVkIGluIGNvbnN0YW50cy4uLgorRVJST1JfRUFSX1VOQ09OVEFJTkVEX01PRFVMRV9GSUxFX0VYQ0VQVElPTj1DSEtKNDAxN1c6IEVSUk9SIEVBUiBVTkNPTlRBSU5FRCBNT0RVTEUgRklMRSBFWENFUFRJT04KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX0VSUk9SX0NPREU9SVdBRTAwMzZFIENIS0o0MDE4VzogVW5rbm93biBFcnJvciBDb2RlOiB7MH0uICBlcnJvci1jb2RlIG11c3QgY29udGFpbiBhIHZhbGlkIEhUVFAgc3RhdHVzIGNvZGUuCisjRVhQTEFOQVRJT04gTm9uZS4KKyNVU0VSQUNUSU9OIE5vbmUuCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK01FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9SRVNfU0hBUklOR19TQ09QRT1DSEtKNDAxOVc6IEludmFsaWQgcmVzLXNoYXJpbmctc2NvcGU7IHZhbGlkIHZhbHVlcyBhcmUgXCJTaGFyZWFibGVcIiBvciBcIlVuc2hhcmVhYmxlXCIuCisjVVNFUkFDVElPTiBOb25lLgorCitNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRU5WX0VOVFJZPUNIS0o0MDIwVzogSW52YWxpZCBFbnZpcm9ubWVudCBFbnRyeSBUeXBlLiBWYWxpZCB2YWx1ZXMgYXJlIFwiamF2YS5sYW5nLlRZUEVcIiwgd2hlcmUgVFlQRSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzogQm9vbGVhbiwgQnl0ZSwgQ2hhcmFjdGVyLCBTdHJpbmcsIFNob3J0LCBJbnRlZ2VyLCBMb25nLCBGbG9hdCwgb3IgRG91YmxlLiIKKyNVU0VSQUNUSU9OIE5vbmUuCisKK01FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19XTFBfUFJPSkVDVD1DSEtKNDAyMVc6IE1pc3NpbmcgV2ViIExpYnJhcnkgUHJvamVjdCAoezB9KS4gIENoZWNrIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgcHJvamVjdCB0byBmaXggdGhpcyBwcm9ibGVtLgorTUVTU0FHRV9XQVJfVkFMSURBVElPTl9DT05GTElDVElOR19XTFBfUFJPSkVDVD1DSEtKNDAyMlc6IFRoZSBXZWIgTGlicmFyeSBQcm9qZWN0IEpBUiAoezB9KSBjb25mbGljdHMgd2l0aCBhbiBhY3R1YWwgSkFSIGluIHRoZSBXRUItSU5GL2xpYiBkaXJlY3RvcnkuCitNU0dfU0VSVkVSX1RBUkdFVF9NSVNNQVRDSD1DSEtKNDAyM1c6IFRoZSB0YXJnZXQgc2VydmVyIG9mIHRoZSBXZWIgTGlicmFyeSBQcm9qZWN0ICh7MX0pIGRvZXMgbm90IG1hdGNoIHRoYXQgb2YgdGhpcyBXZWIgUHJvamVjdCAoezB9KS4gIFJ1biB2YWxpZGF0aW9uIG9uIHRoZSBXZWIgUHJvamVjdCBpZiB5b3UgdGhpbmsgdGhhdCBpcyBub3QgdGhlIGNhc2UuCitNRVNTQUdFX1VSTF9QQVRURVJOX0VORF9XSVRIX0NBUlJBSUdFX1JFVFVSTj1UaGUgVVJMIHBhdHRlcm4gc3RyaW5nICJ7MH0iIGVuZHMgd2l0aCBhIGludmFsaWQgY2FycmFpZ2UgcmV0dXJuIGZvciBzZXJ2bGV0IHsxfQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRUpCX1JFRl9UWVBFPWVqYi1yZWYtdHlwZSBtdXN0IGJlICdFbnRpdHknIG9yICdTZXNzaW9uJy4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRVJST1JfRUFSX01JU1NJTkdfRUpCX1JPTEU9Q0hLSjI4MjdXOiAnJ3NlY3VyaXR5LXJvbGUtcmVmJycgZWxlbWVudCB7MH0gZGVmaW5lcyB0aGUgJydyb2xlLWxpbmsnJyBlbGVtZW50IGJ1dCBubyAnJ3NlY3VyaXR5LXJvbGUnJyBlbGVtZW50cyBpbiB0aGUgYXBwbGljYXRpb24gZGVzY3JpcHRvci4KKyNFWFBMQU5BVElPTiBOb25lLgorI1VTRVJBQ1RJT04gTm9uZS4KKworb2ZfVHlwZV9TZWN1cml0eV9Sb2xlX05hbWVfNj1vZiBUeXBlIFNlY3VyaXR5IFJvbGUgTmFtZQorV2ViX0FyY2hpdmVfVmFsaWRhdG9yXzg9V2ViIEFyY2hpdmUgVmFsaWRhdG9yCitvZl9UeXBlX1JvbGVfTmFtZV8xOT1vZiBUeXBlIFJvbGUgTmFtZQorb2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8yNT1vZiBUeXBlIFBhcmFtZXRlciBOYW1lCitvZl9UeXBlX1BhcmFtZXRlcl9WYWx1ZV8yNj1vZiBUeXBlIFBhcmFtZXRlciBWYWx1ZQorb2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8zMj1vZiBUeXBlIFBhcmFtZXRlciBOYW1lCitvZl9UeXBlX1BhcmFtZXRlcl9WYWx1ZV8zMz1vZiBUeXBlIFBhcmFtZXRlciBWYWx1ZQorb2ZfVHlwZV9QYXJhbWV0ZXJfTmFtZV8zOT1vZiBUeXBlIFBhcmFtZXRlciBOYW1lCitvZl9UeXBlX1BhcmFtZXRlcl9WYWx1ZV80MD1vZiBUeXBlIFBhcmFtZXRlciBWYWx1ZQorb2ZfVHlwZV9lamJfcmVmX25hbWVfNDQ9b2YgVHlwZSBlamItcmVmLW5hbWUKK29mX1R5cGVfRXJyb3JfTG9jYXRpb25fNDc9b2YgVHlwZSBFcnJvciBMb2NhdGlvbgorb2ZfVHlwZV9FcnJvcl9Mb2NhdGlvbl80OT1vZiBUeXBlIEVycm9yIExvY2F0aW9uCitvZl9UeXBlX01pbWVfRXh0ZW5zaW9uXzU0PW9mIFR5cGUgTWltZSBFeHRlbnNpb24KK29mX1R5cGVfTWltZV9UeXBlXzU1PW9mIFR5cGUgTWltZSBUeXBlCitvZl9UeXBlX01pbWVfRXh0ZW5zaW9uX19fNTY9b2YgVHlwZSBNaW1lIEV4dGVuc2lvbjoKK29mX1R5cGVfV2ViX1Jlc291cmNlX0NvbGxlY3Rpb25fNjQ9b2YgVHlwZSBXZWIgUmVzb3VyY2UgQ29sbGVjdGlvbgorb2ZfVHlwZV9GaWx0ZXJfTmFtZV82Nj1vZiBUeXBlIEZpbHRlciBOYW1lCitJbnZhbGlkX1VSTF83MD1JbnZhbGlkIFVSTAorSW52YWxpZF9VUkxfNzU9SW52YWxpZCBVUkwKK29mX1R5cGVfU2VydmxldF9OYW1lXzc3PW9mIFR5cGUgU2VydmxldCBOYW1lCitvZl9UeXBlX1RhZ2xpYl84MD1vZiBUeXBlIFRhZ2xpYgorb2ZfVHlwZV9UYWdMaWJfX184MT1vZiBUeXBlIFRhZ0xpYjoKK29mX1R5cGVfV2ViX1Jlc291cmNlX05hbWVfODQ9b2YgVHlwZSBXZWIgUmVzb3VyY2UgTmFtZQorb2ZfVHlwZV9XZWxjb21lX0ZpbGVfTmFtZV9fODc9b2YgVHlwZSBXZWxjb21lIEZpbGUgTmFtZQorb2ZfVHlwZV9FbnZfRW50cnlfTmFtZV9fXzg4PW9mIFR5cGUgRW52aXJvbm1lbnQgRW50cnkgTmFtZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWUtdmFsaWRhdGlvbi93YXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL3dhcnZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5NWFiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZS12YWxpZGF0aW9uL3dhcnZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNUaGlzIHByb3BlcnRpZXMgZmlsZSBob2xkIGFsbCB0aGUgZXh0ZXJuYWxpc2VkIHN0cmluZ3MgZm9yIGVUb29scyBXQVIgVmFsaWRhdGlvbiBwcm9qZWN0Ci0jIFZhbGlkYXRpb24gcHJvamVjdAotIwotIyBNZXNzYWdlcyBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgYXQ6Ci0jICAgICBodHRwOi8vaGFueS5hdXN0aW4uaWJtLmNvbS9tZXNzYWdlcy9pbmRleC5odG1sCi0jCi0jIEJyaWVmbHk6Ci0jICAgICBNRVNTQUdFX0lEPTxDb21wb25lbnRQcmVmaXg+PE1lc3NhZ2VOdW1iZXI+PFR5cGVDb2RlPjogPE1lc3NhZ2VUZXh0PgotIwotIyBUaGUgcHJlZml4IGZvciB0aGlzIGNvbXBvbmVudCBpczoKLSMgICAgIENIS0ogKElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbikKLSMKLSMgTm90ZSB0aGUgIjogIiB0aGF0IGFwcGVhcnMgYmV0d2VlbiB0aGUgdHlwZSBjb2RlIGFuZCB0aGUgbWVzc2FnZSB0ZXh0LgotIwotIyA6QmVnaW46IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkJlZ2luOgotI0NPTVBPTkVOVFBSRUZJWCBDSEtKCi0jQ09NUE9ORU5UTkFNRUZPUiBDSEtKIElCTSBXZWJTcGhlcmUgVmFsaWRhdGlvbgotI0NNVkNQQVRITkFNRSBuY2Yvc3JjL2phdmEvY29tL2libS93ZWJzcGhlcmUvdmFsaWRhdGlvbi93YXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKLSMgOkVuZDogV2ViU3BoZXJlIFF1YWxpdHkgVmFsaWRhdGlvbiBJbmZvcm1hdGlvbiA6RW5kOgotIwotCi0jIDItSnVseS0yMDAxOgotIyAgVGhpcyBmaWxlIGhhcyBiZWVuIHRlc3RlZCB1c2luZyB0aGUgUHJvY2Vzc01zZ0ZpbGUgdG9vbCwgd3JpdHRlbiBieQotIyAgSGFueSBTYWxlbSBhbmQgb3duZWQgYnkgRGVubmlzIEhlYmVydC4gIEFueSBmdXR1cmUgY2hhbmdlcyBzaG91bGQKLSMgIGFsc28gYmUgdmVyaWZpZWQgdXNpbmcgdGhpcyB0b29sLiAgUGxlYXNlIGNvbnRhY3QgRGVubmlzCi0jICAoaGViZXJ0QHVzLmlibS5jb20gb3IgVC9MIDU0My0yNTIwKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSMKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfV0FSX1ZBTElEQVRJT05fRkFJTEVEPUNIS0ozMDAwRTogV0FSIFZhbGlkYXRpb24gRmFpbGVkOiB7MH0KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX0RVUExJQ0FURV9ST0xFUz1DSEtKMTAwMkU6IER1cGxpY2F0ZSBzZWN1cml0eSByb2xlIG5hbWVkIHswfS4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19KU1A9Q0hLSjMwMDFFOiBUaGUgSlNQIGZpbGUsIHswfSwgZm9yIHRoZSBzZXJ2bGV0IFwiezF9XCIgaXMgbWlzc2luZy4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9TTUFMTF9JQ09OPUNIS0ozMDAyRTogVGhlIDxzbWFsbC1pY29uPiBmaWxlLCB7MH0sIGlzIG1pc3NpbmcuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTEFSR0VfSUNPTj1DSEtKMzAwM0U6IFRoZSA8bGFyZ2UtaWNvbj4gZmlsZSwgezB9LCBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9TRVJWTEVUX01BUFBJTkc9Q0hLSjMwMDRXOiBUaGUgc2VydmxldCBtYXBwaW5nIFwiezB9XCIgcmVmZXJzIHRvIGEgc2VydmxldCB0aGF0IGlzIG5vdCBkZWZpbmVkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX05PX1dFTENPTUVfRklMRT1DSEtKMzAwNUU6IEVtcHR5IHdlbGNvbWUgZmlsZSBsaXN0IGVudHJ5LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0VMQ09NRV9GSUxFPUNIS0ozMDA2RTogV2VsY29tZSBmaWxlIHswfSBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfVExEPUNIS0ozMDA3RTogVGhlIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IgRmlsZSwgezB9LCBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9JTlZBTElEX1dBUl9GSUxFPUNIS0ozMDA4RTogTWlzc2luZyBvciBpbnZhbGlkIFdBUiBmaWxlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9GSUxURVJfTUFQUElORz1DSEtKMzAwOUU6IFRoZSBmaWx0ZXIgbWFwcGluZyBcInswfVwiIHJlZmVycyB0byBhIGZpbHRlciB0aGF0IGlzIG5vdCBkZWZpbmVkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfV0VMQ09NRV9GSUxFPUNIS0ozMDEwVzogV2VsY29tZSBGaWxlcyBjYW5ub3QgYmVnaW4gb3IgZW5kIHdpdGggYSAvLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1XQVJfRERfUEFSU0VfTElORUNPTD1DSEtKMTAwOUU6IFBhcnNpbmcgRXJyb3I6IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV0FSX0REX1BBUlNFX0xJTkU9Q0hLSjEwMTBFOiBEZXBsb3ltZW50IERlc2NyaXB0b3IgUGFyc2luZyBlcnJvci4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV0FSX0REX1BBUlNFX05PSU5GTz1DSEtKMTAxMUU6IERlcGxveW1lbnQgRGVzY3JpcHRvciBQYXJzaW5nIGVycm9yLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1XQVJfRERfQ0FOTk9UX09QRU5fREQ9Q0hLSjEwMTJFOiBDYW5ub3Qgb3BlbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBWYWxpZGF0aW9uIGNhbm5vdCBjb21wbGV0ZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTD1DSEtKMzAxM0U6IFRoZSBVUkwgTWFwcGluZyBcInswfVwiIGlzIGludmFsaWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRT1DSEtKMzAxNEU6IEludmFsaWQgU2VjdXJpdHkgcm9sZS1saW5rOiB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9IVFRQX0NNRD1DSEtKMzAxNUU6IEludmFsaWQgSFRUUCBtZXRob2Q6IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1RSQU5TUE9SVD1DSEtKMzAxNkU6IEludmFsaWQgVHJhbnNwb3J0IEd1cmFyYW50ZWUuICBWYWxpZCB2YWx1ZXMgYXJlIFwiTk9ORVwiLCBcIklOVEVHUkFMXCIsIG9yIFwiQ09ORklERU5USUFMXCIuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9KU1BGSUxFX1JFRj1DSEtKMzAxOEU6IFRoZSBqc3AtZmlsZSBcInswfVwiIHJlZmVyZW5jZWQgYnkgc2VydmxldCB7MX0gbXVzdCBiZSBhIGZ1bGwgYWJzb2x1dGUgcGF0aC4KLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfSU5WQUxJRF9DT05URVhUX1JPT1Q9Q0hLSjMwMTdFOiBXZWIgUHJvamVjdDogezB9IGlzIG1hcHBlZCB0byBhbiBpbnZhbGlkIENvbnRleHQgcm9vdDogezF9IGluIEVBUiBQcm9qZWN0OiB7Mn0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9QQUdFPUlXQUUwMDAxRSBDSEtKMzAxOUU6IFRoZSBMb2NhdGlvbiBvZiB0aGUgRXJyb3IgUGFnZSBNdXN0IEJlZ2luIHdpdGggYSAvLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfU0VDX1JPTEVfTkFNRT1DSEtKMzAyMEU6IEludmFsaWQgU2VjdXJpdHkgcm9sZS1uYW1lOiB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9BVVRIX01FVEhPRD1DSEtKMzAyMUU6IEludmFsaWQgYXV0aCBtZXRob2QuICBWYWxpZCB2YWx1ZXMgYXJlOiBcIkJBU0lDXCIsIFwiRElHRVNUXCIsIFwiRk9STVwiLCBvciBcIkNMSUVOVC1DRVJUXCIuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSUdOT1JFX0ZPUk1fTE9HSU49Q0hLSjMwMjJFOiAgQXV0aGVudGljYXRpb24gbWV0aG9kIGlzIHswfS4gIFRoZSBmb3JtLWxvZ2luLWNvbmZpZyB2YWx1ZXMgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB1c2luZyBGT1JNIGF1dGhlbnRpY2F0aW9uIG1ldGhvZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMj1DSEtKMzAyM0U6ICBSZXNvdXJjZSByZWYgezB9IG11c3QgY29udGFpbiByZXMtYXV0aCBvZiAiU0VSVkxFVCIgb3IgIkNPTlRBSU5FUiIuCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIzPUNIS0ozMDI0RTogIFJlc291cmNlIHJlZiB7MH0gbXVzdCBjb250YWluIHJlcy1hdXRoIG9mICJBcHBsaWNhdGlvbiIgb3IgIkNvbnRhaW5lciIuCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjI9Q0hLSjMwMjVFOiAgXCJBcHBsaWNhdGlvblwiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvci5yZXMtYXV0aCBpbiBhIDIuMiBsZXZlbCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBVc2UgXCJTRVJWTEVUXCIgaW5zdGVhZC4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMz1DSEtKMzAyNkU6ICBcIlNFUlZMRVRcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IucmVzLWF1dGggaW4gYSAyLjIgbGV2ZWwgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVXNlIFwiQXBwbGljYXRpb25cIiBpbnN0ZWFkLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVhDRVBUSU9OX1RZUEU9Q0hLSjMwMjdFOiAgSW52YWxpZCBFeGNlcHRpb24gVHlwZSB7MH0uICBUaGUgZXhjZXB0aW9uIHR5cGUgbXVzdCBjb250YWluIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbiB0eXBlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfTUFQUElORz1DSEtKNDAxMFc6IER1cGxpY2F0ZSBVUkwgbWFwcGluZyB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX1NFUlZMRVQ9Q0hLSjQwMTFXOiBEdXBsaWNhdGUgU2VydmxldCBFbnRyeSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fU0VTU0lPTl9USU1FT1VUPUNIS0o0MDEyVzogU2Vzc2lvbiBUaW1lb3V0IGlzIG5vdCB2YWxpZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlk9Q0hLSjQwMTNXOiBEdXBsaWNhdGUgRW50cnkgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZPUNIS0o0MDE0VzogRW1wdHkgRW50cnkgezB9LgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9GSUxURVI9Q0hLSjQwMTVXOiBEdXBsaWNhdGUgRmlsdGVyIEVudHJ5IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRUpCX1JFRj1DSEtKNDAxNlc6IER1cGxpY2F0ZSBlamItcmVmIGVsZW1lbnQgbmFtZWQgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIFRoaXMgd2FzIG1pc3NpbmcuICBJdCdzIGRlZmluZWQgaW4gY29uc3RhbnRzLi4uCi1FUlJPUl9FQVJfVU5DT05UQUlORURfTU9EVUxFX0ZJTEVfRVhDRVBUSU9OPUNIS0o0MDE3VzogRVJST1IgRUFSIFVOQ09OVEFJTkVEIE1PRFVMRSBGSUxFIEVYQ0VQVElPTgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVJST1JfQ09ERT1JV0FFMDAzNkUgQ0hLSjQwMThXOiBVbmtub3duIEVycm9yIENvZGU6IHswfS4gIGVycm9yLWNvZGUgbXVzdCBjb250YWluIGEgdmFsaWQgSFRUUCBzdGF0dXMgY29kZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1JFU19TSEFSSU5HX1NDT1BFPUNIS0o0MDE5VzogSW52YWxpZCByZXMtc2hhcmluZy1zY29wZTsgdmFsaWQgdmFsdWVzIGFyZSBcIlNoYXJlYWJsZVwiIG9yIFwiVW5zaGFyZWFibGVcIi4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FTlZfRU5UUlk9Q0hLSjQwMjBXOiBJbnZhbGlkIEVudmlyb25tZW50IEVudHJ5IFR5cGUuIFZhbGlkIHZhbHVlcyBhcmUgXCJqYXZhLmxhbmcuVFlQRVwiLCB3aGVyZSBUWVBFIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBCb29sZWFuLCBCeXRlLCBDaGFyYWN0ZXIsIFN0cmluZywgU2hvcnQsIEludGVnZXIsIExvbmcsIEZsb2F0LCBvciBEb3VibGUuIgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1dMUF9QUk9KRUNUPUNIS0o0MDIxVzogTWlzc2luZyBXZWIgTGlicmFyeSBQcm9qZWN0ICh7MH0pLiAgQ2hlY2sgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBwcm9qZWN0IHRvIGZpeCB0aGlzIHByb2JsZW0uCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0NPTkZMSUNUSU5HX1dMUF9QUk9KRUNUPUNIS0o0MDIyVzogVGhlIFdlYiBMaWJyYXJ5IFByb2plY3QgSkFSICh7MH0pIGNvbmZsaWN0cyB3aXRoIGFuIGFjdHVhbCBKQVIgaW4gdGhlIFdFQi1JTkYvbGliIGRpcmVjdG9yeS4KLU1TR19TRVJWRVJfVEFSR0VUX01JU01BVENIPUNIS0o0MDIzVzogVGhlIHRhcmdldCBzZXJ2ZXIgb2YgdGhlIFdlYiBMaWJyYXJ5IFByb2plY3QgKHsxfSkgZG9lcyBub3QgbWF0Y2ggdGhhdCBvZiB0aGlzIFdlYiBQcm9qZWN0ICh7MH0pLiAgUnVuIHZhbGlkYXRpb24gb24gdGhlIFdlYiBQcm9qZWN0IGlmIHlvdSB0aGluayB0aGF0IGlzIG5vdCB0aGUgY2FzZS4KLU1FU1NBR0VfVVJMX1BBVFRFUk5fRU5EX1dJVEhfQ0FSUkFJR0VfUkVUVVJOPVRoZSBVUkwgcGF0dGVybiBzdHJpbmcgInswfSIgZW5kcyB3aXRoIGEgaW52YWxpZCBjYXJyYWlnZSByZXR1cm4gZm9yIHNlcnZsZXQgezF9Ci0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FSkJfUkVGX1RZUEU9Q0hLSjQwMjNXOiBlamItcmVmLXR5cGUgbXVzdCBiZSAnRW50aXR5JyBvciAnU2Vzc2lvbicuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9NSVNTSU5HX0VKQl9ST0xFPUNIS0oyODI3VzogJydzZWN1cml0eS1yb2xlLXJlZicnIGVsZW1lbnQgezB9IGRlZmluZXMgdGhlICcncm9sZS1saW5rJycgZWxlbWVudCBidXQgbm8gJydzZWN1cml0eS1yb2xlJycgZWxlbWVudHMgaW4gdGhlIGFwcGxpY2F0aW9uIGRlc2NyaXB0b3IuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLW9mX1R5cGVfU2VjdXJpdHlfUm9sZV9OYW1lXzY9b2YgVHlwZSBTZWN1cml0eSBSb2xlIE5hbWUKLVdlYl9BcmNoaXZlX1ZhbGlkYXRvcl84PVdlYiBBcmNoaXZlIFZhbGlkYXRvcgotb2ZfVHlwZV9Sb2xlX05hbWVfMTk9b2YgVHlwZSBSb2xlIE5hbWUKLW9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMjU9b2YgVHlwZSBQYXJhbWV0ZXIgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfMjY9b2YgVHlwZSBQYXJhbWV0ZXIgVmFsdWUKLW9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMzI9b2YgVHlwZSBQYXJhbWV0ZXIgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfMzM9b2YgVHlwZSBQYXJhbWV0ZXIgVmFsdWUKLW9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMzk9b2YgVHlwZSBQYXJhbWV0ZXIgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfNDA9b2YgVHlwZSBQYXJhbWV0ZXIgVmFsdWUKLW9mX1R5cGVfZWpiX3JlZl9uYW1lXzQ0PW9mIFR5cGUgZWpiLXJlZi1uYW1lCi1vZl9UeXBlX0Vycm9yX0xvY2F0aW9uXzQ3PW9mIFR5cGUgRXJyb3IgTG9jYXRpb24KLW9mX1R5cGVfRXJyb3JfTG9jYXRpb25fNDk9b2YgVHlwZSBFcnJvciBMb2NhdGlvbgotb2ZfVHlwZV9NaW1lX0V4dGVuc2lvbl81ND1vZiBUeXBlIE1pbWUgRXh0ZW5zaW9uCi1vZl9UeXBlX01pbWVfVHlwZV81NT1vZiBUeXBlIE1pbWUgVHlwZQotb2ZfVHlwZV9NaW1lX0V4dGVuc2lvbl9fXzU2PW9mIFR5cGUgTWltZSBFeHRlbnNpb246Ci1vZl9UeXBlX1dlYl9SZXNvdXJjZV9Db2xsZWN0aW9uXzY0PW9mIFR5cGUgV2ViIFJlc291cmNlIENvbGxlY3Rpb24KLW9mX1R5cGVfRmlsdGVyX05hbWVfNjY9b2YgVHlwZSBGaWx0ZXIgTmFtZQotSW52YWxpZF9VUkxfNzA9SW52YWxpZCBVUkwKLUludmFsaWRfVVJMXzc1PUludmFsaWQgVVJMCi1vZl9UeXBlX1NlcnZsZXRfTmFtZV83Nz1vZiBUeXBlIFNlcnZsZXQgTmFtZQotb2ZfVHlwZV9UYWdsaWJfODA9b2YgVHlwZSBUYWdsaWIKLW9mX1R5cGVfVGFnTGliX19fODE9b2YgVHlwZSBUYWdMaWI6Ci1vZl9UeXBlX1dlYl9SZXNvdXJjZV9OYW1lXzg0PW9mIFR5cGUgV2ViIFJlc291cmNlIE5hbWUKLW9mX1R5cGVfV2VsY29tZV9GaWxlX05hbWVfXzg3PW9mIFR5cGUgV2VsY29tZSBGaWxlIE5hbWUKLW9mX1R5cGVfRW52X0VudHJ5X05hbWVfX184OD1vZiBUeXBlIEVudmlyb25tZW50IEVudHJ5IE5hbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL2JpbmRpbmdzL0pORElCaW5kaW5nc0hlbHBlck1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL2JpbmRpbmdzL0pORElCaW5kaW5nc0hlbHBlck1hbmFnZXIuamF2YQppbmRleCA3YTg1Mzg3Li4xNjJlOTQ2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9iaW5kaW5ncy9KTkRJQmluZGluZ3NIZWxwZXJNYW5hZ2VyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvYmluZGluZ3MvSk5ESUJpbmRpbmdzSGVscGVyTWFuYWdlci5qYXZhCkBAIC05MSwxMCArOTEsMTIgQEAKIAlwcml2YXRlIElKTkRJQmluZGluZ3NIZWxwZXIgZ2V0RGVmYXVsdEhlbHBlcigpIHsKIAkJaWYgKG51bGwgPT0gZGVmYXVsdEhlbHBlcikgewogCQkJZGVmYXVsdEhlbHBlciA9IG5ldyBBYnN0cmFjdEpORElCaW5kaW5nc0hlbHBlcigpIHsKKwkJCQlAT3ZlcnJpZGUKIAkJCQlwdWJsaWMgYm9vbGVhbiBhcHBsaWVzRm9yKElQcm9qZWN0IHByb2plY3QpIHsKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQkJfQogCisJCQkJQE92ZXJyaWRlCiAJCQkJcHVibGljIGJvb2xlYW4gYXBwbGllc0ZvcihBcmNoaXZlIGFyY2hpdmUpIHsKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQkJfQpAQCAtMTI2LDEyICsxMjgsMTMgQEAKIAkJCXN1cGVyKEoyRUVDb3JlUGx1Z2luLlBMVUdJTl9JRCwgVEFHX0oyRUVfQklORElOR1NfSEVMUEVSKTsKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewogCQkJaWYgKFRBR19CSU5ESU5HU19IRUxQRVIuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewogCQkJCXRyeSB7CiAJCQkJCWFkZEhlbHBlcigoSUpORElCaW5kaW5nc0hlbHBlcikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTUykpOwogCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCX0KIAkJCQlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9DYXRhbG9nSjJFRVhtbER0REVudGl0eVJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vQ2F0YWxvZ0oyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5qYXZhCmluZGV4IGVlYjRhZmYuLjQyZjRhYmQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9DYXRhbG9nSjJFRVhtbER0REVudGl0eVJlc29sdmVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0NhdGFsb2dKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogCXB1YmxpYyBDYXRhbG9nSjJFRVhtbER0REVudGl0eVJlc29sdmVyKCkgewogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBvcmcueG1sLnNheC5JbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgSU9FeGNlcHRpb24sIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiB7CiAJCWlmICh1cmlSZXNvbHZlciA9PSBudWxsKSB7CiAJCQl1cmlSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vRWNsaXBzZUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0VjbGlwc2VFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuamF2YQppbmRleCA3NjQ1MjJkLi5kNmNlZmE4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvajJlZUNvcmVQbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9pbnRlcm5hbC9wbHVnaW4vRWNsaXBzZUVKQk1vZGVsRXh0ZW5kZXJQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9FY2xpcHNlRUpCTW9kZWxFeHRlbmRlclByb3ZpZGVyLmphdmEKQEAgLTExMiw3ICsxMTIsOCBAQAogICAgICAqIHJlYWRFbGVtZW50KCkgLSBwYXJzZSBhbmQgZGVhbCB3LyBhbiBleHRlbnNpb24gbGlrZTogPGVhck1vZHVsZUV4dGVuc2lvbgogICAgICAqIGV4dGVuc2lvbkNsYXNzID0gImNvbS5pYm0uZXRvb2xzLndlYi5wbHVnaW4uV2ViTW9kdWxlRXh0ZW5zaW9uSW1wbCIvPgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CisgICAgQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKICAgICAgICAgaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoRGVzY3JpcHRvci5FSkJfTU9ERUxfRVhURU5ERVIpKSByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgYWRkTW9kdWxlRXh0ZW5zaW9uKG5ldyBEZXNjcmlwdG9yKGVsZW1lbnQpKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qMmVlQ29yZVBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2ludGVybmFsL3BsdWdpbi9KMkVFQ29yZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0oyRUVDb3JlUGx1Z2luLmphdmEKaW5kZXggZjRiOTdkNC4uYjhlZTA3MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0oyRUVDb3JlUGx1Z2luLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2oyZWVDb3JlUGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvaW50ZXJuYWwvcGx1Z2luL0oyRUVDb3JlUGx1Z2luLmphdmEKQEAgLTQ1LDYgKzQ1LDcgQEAKIAkJaWYgKGluc3Q9PW51bGwpIGluc3QgPSB0aGlzOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewogCQlzdXBlci5zdGFydChjb250ZXh0KTsKIAkJSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyLklOU1RBTkNFLnNldFByb3ZpZGVyKEVjbGlwc2VFSkJNb2RlbEV4dGVuZGVyUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uLmphdmEKaW5kZXggZGNkZmI1OS4uZmM0NWYxNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb24uamF2YQpAQCAtMTIsNyArMTIsMjMgQEAKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5HZW5lcmljQm9vbGVhblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjIsMjEgKzM4LDM1IEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIGFwcGxpY2F0aW9uVHlwZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlCi0gKiAJYXBwbGljYXRpb24uCi0gKiAKKyAqICAgICAgICAgVGhlIGFwcGxpY2F0aW9uVHlwZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlCisgKiAgICAgICAgIGFwcGxpY2F0aW9uLiAKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEFwcGxpY2F0aW9uIDUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKICAqIDxwPgogICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgogICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0QXBwbGljYXRpb25OYW1lIDxlbT5BcHBsaWNhdGlvbiBOYW1lPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0SW5pdGlhbGl6ZUluT3JkZXIgPGVtPkluaXRpYWxpemUgSW4gT3JkZXI8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0TW9kdWxlcyA8ZW0+TW9kdWxlczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRTZWN1cml0eVJvbGVzIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRMaWJyYXJ5RGlyZWN0b3J5IDxlbT5MaWJyYXJ5IERpcmVjdG9yeTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRFbnZFbnRyeSA8ZW0+RW52IEVudHJ5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldEVqYlJlZiA8ZW0+RWpiIFJlZjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRFamJMb2NhbFJlZiA8ZW0+RWpiIExvY2FsIFJlZjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFJlc291cmNlUmVmIDxlbT5SZXNvdXJjZSBSZWY8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0UmVzb3VyY2VFbnZSZWYgPGVtPlJlc291cmNlIEVudiBSZWY8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFBlcnNpc3RlbmNlVW5pdFJlZiA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWY8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0TWVzc2FnZURlc3RpbmF0aW9uIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldERhdGFTb3VyY2UgPGVtPkRhdGEgU291cmNlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KICAqIDwvdWw+CkBAIC00OCw2ICs3OCwzMiBAQAogICovCiBwdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBBcHBsaWNhdGlvbiA2CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRBcHBsaWNhdGlvbk5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXBwbGljYXRpb25fQXBwbGljYXRpb25OYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldEFwcGxpY2F0aW9uTmFtZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRBcHBsaWNhdGlvbk5hbWUgPGVtPkFwcGxpY2F0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QXBwbGljYXRpb25OYW1lKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC02MCw3ICsxMTYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXBwbGljYXRpb25fRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNzUsNyArMTMxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX0Rpc3BsYXlOYW1lcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7CisJTGlzdDxEaXNwbGF5TmFtZT4gZ2V0RGlzcGxheU5hbWVzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC05MCw3ICsxNDYsNzEgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX0ljb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRJY29ucygpOworCUxpc3Q8SWNvbj4gZ2V0SWNvbnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXRpYWxpemUgSW4gT3JkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuR2VuZXJpY0Jvb2xlYW5UeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIElmIGluaXRpYWxpemUtaW4tb3JkZXIgaXMgdHJ1ZSwgbW9kdWxlcyBtdXN0IGJlIGluaXRpYWxpemVkCisJICogICAgICAgICAgICAgaW4gdGhlIG9yZGVyIHRoZXkncmUgbGlzdGVkIGluIHRoaXMgZGVwbG95bWVudCBkZXNjcmlwdG9yLAorCSAqICAgICAgICAgICAgIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlcywgd2hpY2ggY2FuCisJICogICAgICAgICAgICAgYmUgaW5pdGlhbGl6ZWQgaW4gYW55IG9yZGVyLgorCSAqICAgICAgICAgICAgIElmIGluaXRpYWxpemUtaW4tb3JkZXIgaXMgbm90IHNldCBvciBzZXQgdG8gZmFsc2UsIHRoZSBvcmRlcgorCSAqICAgICAgICAgICAgIG9mIGluaXRpYWxpemF0aW9uIGlzIHVuc3BlY2lmaWVkIGFuZCBtYXkgYmUgcHJvZHVjdC1kZXBlbmRlbnQuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQXBwbGljYXRpb24gNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbGl6ZSBJbiBPcmRlcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuR2VuZXJpY0Jvb2xlYW5UeXBlCisJICogQHNlZSAjaXNTZXRJbml0aWFsaXplSW5PcmRlcigpCisJICogQHNlZSAjdW5zZXRJbml0aWFsaXplSW5PcmRlcigpCisJICogQHNlZSAjc2V0SW5pdGlhbGl6ZUluT3JkZXIoR2VuZXJpY0Jvb2xlYW5UeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXBwbGljYXRpb25fSW5pdGlhbGl6ZUluT3JkZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlHZW5lcmljQm9vbGVhblR5cGUgZ2V0SW5pdGlhbGl6ZUluT3JkZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0SW5pdGlhbGl6ZUluT3JkZXIgPGVtPkluaXRpYWxpemUgSW4gT3JkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWxpemUgSW4gT3JkZXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkdlbmVyaWNCb29sZWFuVHlwZQorCSAqIEBzZWUgI2lzU2V0SW5pdGlhbGl6ZUluT3JkZXIoKQorCSAqIEBzZWUgI3Vuc2V0SW5pdGlhbGl6ZUluT3JkZXIoKQorCSAqIEBzZWUgI2dldEluaXRpYWxpemVJbk9yZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbml0aWFsaXplSW5PcmRlcihHZW5lcmljQm9vbGVhblR5cGUgdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldEluaXRpYWxpemVJbk9yZGVyIDxlbT5Jbml0aWFsaXplIEluIE9yZGVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1NldEluaXRpYWxpemVJbk9yZGVyKCkKKwkgKiBAc2VlICNnZXRJbml0aWFsaXplSW5PcmRlcigpCisJICogQHNlZSAjc2V0SW5pdGlhbGl6ZUluT3JkZXIoR2VuZXJpY0Jvb2xlYW5UeXBlKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHVuc2V0SW5pdGlhbGl6ZUluT3JkZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRJbml0aWFsaXplSW5PcmRlciA8ZW0+SW5pdGlhbGl6ZSBJbiBPcmRlcjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbGl6ZSBJbiBPcmRlcjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIEBzZWUgI3Vuc2V0SW5pdGlhbGl6ZUluT3JkZXIoKQorCSAqIEBzZWUgI2dldEluaXRpYWxpemVJbk9yZGVyKCkKKwkgKiBAc2VlICNzZXRJbml0aWFsaXplSW5PcmRlcihHZW5lcmljQm9vbGVhblR5cGUpCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNTZXRJbml0aWFsaXplSW5PcmRlcigpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW9kdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMDAsMTggKzIyMCwxOSBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGhhdmUgb25lCi0JICogCSAgICBtb2R1bGUgZWxlbWVudCBmb3IgZWFjaCBKYXZhIEVFIG1vZHVsZSBpbiB0aGUKLQkgKiAJICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuIEEgbW9kdWxlIGVsZW1lbnQgaXMgZGVmaW5lZAotCSAqIAkgICAgYnkgbW9kdWxlVHlwZSBkZWZpbml0aW9uLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBoYXZlIG9uZQorCSAqICAgICAgICAgICAgIG1vZHVsZSBlbGVtZW50IGZvciBlYWNoIEphdmEgRUUgbW9kdWxlIGluIHRoZQorCSAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuIEEgbW9kdWxlIGVsZW1lbnQgaXMgZGVmaW5lZCAKKwkgKiAgICAgICAgICAgICBieSBtb2R1bGVUeXBlIGRlZmluaXRpb24uIAorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEFwcGxpY2F0aW9uIDUKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRNb2R1bGVzKCk7CisJTGlzdDxNb2R1bGU+IGdldE1vZHVsZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEyMiwxMSArMjQzLDE2IEBACiAJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgogCSAqIDwvcD4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBBcHBsaWNhdGlvbiA2CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX1NlY3VyaXR5Um9sZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFNlY3VyaXR5Um9sZXMoKTsKKwlMaXN0PFNlY3VyaXR5Um9sZT4gZ2V0U2VjdXJpdHlSb2xlcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGlicmFyeSBEaXJlY3Rvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTEzNSwxNiArMjYxLDE3IEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgbGlicmFyeS1kaXJlY3RvcnkgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHBhdGhuYW1lCi0JICogCSAgICBvZiBhIGRpcmVjdG9yeSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UsIHJlbGF0aXZlCi0JICogCSAgICB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLiAgQWxsIGZpbGVzCi0JICogCSAgICBuYW1lZCAiKi5qYXIiIGluIHRoaXMgZGlyZWN0b3J5IG11c3QgYmUgbWFkZSBhdmFpbGFibGUKLQkgKiAJICAgIGluIHRoZSBjbGFzcyBwYXRoIG9mIGFsbCBjb21wb25lbnRzIGluY2x1ZGVkIGluIHRoaXMKLQkgKiAJICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuICBJZiB0aGlzIGVsZW1lbnQgaXNuJ3Qgc3BlY2lmaWVkLAotCSAqIAkgICAgdGhlIGRpcmVjdG9yeSBuYW1lZCAibGliIiBpcyBzZWFyY2hlZC4gIEFuIGVtcHR5IGVsZW1lbnQKLQkgKiAJICAgIG1heSBiZSB1c2VkIHRvIGRpc2FibGUgc2VhcmNoaW5nLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSBsaWJyYXJ5LWRpcmVjdG9yeSBlbGVtZW50IHNwZWNpZmllcyB0aGUgcGF0aG5hbWUKKwkgKiAgICAgICAgICAgICBvZiBhIGRpcmVjdG9yeSB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UsIHJlbGF0aXZlCisJICogICAgICAgICAgICAgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gcGFja2FnZS4gIEFsbCBmaWxlcworCSAqICAgICAgICAgICAgIG5hbWVkICIqLmphciIgaW4gdGhpcyBkaXJlY3RvcnkgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZQorCSAqICAgICAgICAgICAgIGluIHRoZSBjbGFzcyBwYXRoIG9mIGFsbCBjb21wb25lbnRzIGluY2x1ZGVkIGluIHRoaXMKKwkgKiAgICAgICAgICAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLiAgSWYgdGhpcyBlbGVtZW50IGlzbid0IHNwZWNpZmllZCwKKwkgKiAgICAgICAgICAgICB0aGUgZGlyZWN0b3J5IG5hbWVkICJsaWIiIGlzIHNlYXJjaGVkLiAgQW4gZW1wdHkgZWxlbWVudAorCSAqICAgICAgICAgICAgIG1heSBiZSB1c2VkIHRvIGRpc2FibGUgc2VhcmNoaW5nLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEFwcGxpY2F0aW9uIDUKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpYnJhcnkgRGlyZWN0b3J5PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRMaWJyYXJ5RGlyZWN0b3J5KFN0cmluZykKQEAgLTE2NCw2ICsyOTEsMTgxIEBACiAJdm9pZCBzZXRMaWJyYXJ5RGlyZWN0b3J5KFN0cmluZyB2YWx1ZSk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnYgRW50cnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQXBwbGljYXRpb24gNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJ5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UjZ2V0QXBwbGljYXRpb25fRW52RW50cnkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PEVudkVudHJ5PiBnZXRFbnZFbnRyeSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlZjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQXBwbGljYXRpb24gNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX0VqYlJlZigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8RWpiUmVmPiBnZXRFamJSZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWY8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWZ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQXBwbGljYXRpb24gNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIExvY2FsIFJlZjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX0VqYkxvY2FsUmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxFamJMb2NhbFJlZj4gZ2V0RWpiTG9jYWxSZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX1NlcnZpY2VSZWZzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxTZXJ2aWNlUmVmPiBnZXRTZXJ2aWNlUmVmcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIEFwcGxpY2F0aW9uIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX1Jlc291cmNlUmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxSZXNvdXJjZVJlZj4gZ2V0UmVzb3VyY2VSZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWY8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWZ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQXBwbGljYXRpb24gNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX1Jlc291cmNlRW52UmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxSZXNvdXJjZUVudlJlZj4gZ2V0UmVzb3VyY2VFbnZSZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBBcHBsaWNhdGlvbiA2CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX01lc3NhZ2VEZXN0aW5hdGlvblJlZigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uUmVmPiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBBcHBsaWNhdGlvbiA2CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX1BlcnNpc3RlbmNlQ29udGV4dFJlZigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8UGVyc2lzdGVuY2VDb250ZXh0UmVmPiBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBBcHBsaWNhdGlvbiA2CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX1BlcnNpc3RlbmNlVW5pdFJlZigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8UGVyc2lzdGVuY2VVbml0UmVmPiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIEFwcGxpY2F0aW9uIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbl9NZXNzYWdlRGVzdGluYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvbj4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXRhIFNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBBcHBsaWNhdGlvbiA2CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIFNvdXJjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uX0RhdGFTb3VyY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PERhdGFTb3VyY2VUeXBlPiBnZXREYXRhU291cmNlKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CkBAIC0xOTAsMTUgKzQ5MiwxNSBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiI1IjwvY29kZT4uCisJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjYiPC9jb2RlPi4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgNS4KLQkgKiAKLQkgKiAJCisJICogICAgICAgICAgIFRoZSByZXF1aXJlZCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gaXMgNi4KKwkgKiAgICAgICAgICAgCisJICogICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yLmphdmEKaW5kZXggZmM2YWUyMS4uYTRhNGE1ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yLmphdmEKQEAgLTY1LDcgKzY1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlI2dldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKTsKKwlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhNTE5TUHJlZml4TWFwKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCkBAIC04MSw3ICs4MSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZSNnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7CisJTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTkwLDkgKzkwLDEwIEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCVRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBKYXZhIEVFCi0JICogCWFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KLQkgKiAKKwkgKiAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBKYXZhIEVFCisJICogICAgICAgICBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisJICogICAgICAgICAKKwkgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEFwcGxpY2F0aW9uIDUKIAkgKiAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9JQXBwbGljYXRpb25SZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9JQXBwbGljYXRpb25SZXNvdXJjZS5qYXZhCmluZGV4IDEyOTM5YWYuLjIzODZmNGUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vSUFwcGxpY2F0aW9uUmVzb3VyY2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL0lBcHBsaWNhdGlvblJlc291cmNlLmphdmEKQEAgLTEsMyArMSwxMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9Nb2R1bGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vTW9kdWxlLmphdmEKaW5kZXggYzhmOTMxMC4uZmMyZjRjNCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9Nb2R1bGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL01vZHVsZS5qYXZhCkBAIC0yMCwxMiArMjAsMTMgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgbW9kdWxlVHlwZSBkZWZpbmVzIGEgc2luZ2xlIEphdmEgRUUgbW9kdWxlIGFuZCBjb250YWlucyBhCi0gKiAJY29ubmVjdG9yLCBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlCi0gKiAJbW9kdWxlIHR5cGUgYW5kIGNvbnRhaW5zIGEgcGF0aCB0byB0aGUgbW9kdWxlIGZpbGUsIGFuZCBhbgotICogCW9wdGlvbmFsIGFsdC1kZCBlbGVtZW50LCB3aGljaCBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVVJJIHRvCi0gKiAJdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICogCisgKiAgICAgICAgIFRoZSBtb2R1bGVUeXBlIGRlZmluZXMgYSBzaW5nbGUgSmF2YSBFRSBtb2R1bGUgYW5kIGNvbnRhaW5zIGEKKyAqICAgICAgICAgY29ubmVjdG9yLCBlamIsIGphdmEsIG9yIHdlYiBlbGVtZW50LCB3aGljaCBpbmRpY2F0ZXMgdGhlCisgKiAgICAgICAgIG1vZHVsZSB0eXBlIGFuZCBjb250YWlucyBhIHBhdGggdG8gdGhlIG1vZHVsZSBmaWxlLCBhbmQgYW4KKyAqICAgICAgICAgb3B0aW9uYWwgYWx0LWRkIGVsZW1lbnQsIHdoaWNoIHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8KKyAqICAgICAgICAgdGhlIHBvc3QtYXNzZW1ibHkgdmVyc2lvbiBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgQXBwbGljYXRpb24gNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNTMsMTEgKzU0LDEyIEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICAgIFRoZSBjb25uZWN0b3IgZWxlbWVudCBzcGVjaWZpZXMgdGhlIFVSSSBvZiBhCi0JICogCSAgICAgIHJlc291cmNlIGFkYXB0ZXIgYXJjaGl2ZSBmaWxlLCByZWxhdGl2ZSB0byB0aGUKLQkgKiAJICAgICAgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCSAqIAotCSAqIAkgICAgCisJICogICAgICAgICAgICAgICBUaGUgY29ubmVjdG9yIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYQorCSAqICAgICAgICAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBhcmNoaXZlIGZpbGUsIHJlbGF0aXZlIHRvIHRoZQorCSAqICAgICAgICAgICAgICAgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgorCSAqICAgICAgICAgICAgICAgCisJICogICAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBBcHBsaWNhdGlvbiA1CisJICogICAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3RvcjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0Q29ubmVjdG9yKFN0cmluZykKQEAgLTgzLDExICs4NSwxMiBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgICBUaGUgZWpiIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYW4gZWpiLWphciwKLQkgKiAJICAgICAgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24KLQkgKiAJICAgICAgcGFja2FnZS4KLQkgKiAKLQkgKiAJICAgIAorCSAqICAgICAgICAgICAgICAgVGhlIGVqYiBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGFuIGVqYi1qYXIsCisJICogICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbgorCSAqICAgICAgICAgICAgICAgcGFja2FnZS4KKwkgKiAgICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgQXBwbGljYXRpb24gNQorCSAqICAgICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamI8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldEVqYihTdHJpbmcpCkBAIC0xMTMsMTEgKzExNiwxMiBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgICBUaGUgamF2YSBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgamF2YQotCSAqIAkgICAgICBhcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wCi0JICogCSAgICAgIGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCSAqIAotCSAqIAkgICAgCisJICogICAgICAgICAgICAgICBUaGUgamF2YSBlbGVtZW50IHNwZWNpZmllcyB0aGUgVVJJIG9mIGEgamF2YQorCSAqICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY2xpZW50IG1vZHVsZSwgcmVsYXRpdmUgdG8gdGhlIHRvcAorCSAqICAgICAgICAgICAgICAgbGV2ZWwgb2YgdGhlIGFwcGxpY2F0aW9uIHBhY2thZ2UuCisJICogICAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEFwcGxpY2F0aW9uIDUKKwkgKiAgICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0SmF2YShTdHJpbmcpCkBAIC0xNjgsMTcgKzE3MiwxOCBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIGFsdC1kZCBlbGVtZW50IHNwZWNpZmllcyBhbiBvcHRpb25hbCBVUkkgdG8gdGhlCi0JICogCSAgICBwb3N0LWFzc2VtYmx5IHZlcnNpb24gb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCSAqIAkgICAgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIEphdmEgRUUgbW9kdWxlLiAgVGhlIFVSSSBtdXN0Ci0JICogCSAgICBzcGVjaWZ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBkZXBsb3ltZW50Ci0JICogCSAgICBkZXNjcmlwdG9yIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgcm9vdAotCSAqIAkgICAgZGlyZWN0b3J5LiBJZiBhbHQtZGQgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlcGxveWVyCi0JICogCSAgICBtdXN0IHJlYWQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmcm9tIHRoZSBkZWZhdWx0Ci0JICogCSAgICBsb2NhdGlvbiBhbmQgZmlsZSBuYW1lIHJlcXVpcmVkIGJ5IHRoZSByZXNwZWN0aXZlCi0JICogCSAgICBjb21wb25lbnQgc3BlY2lmaWNhdGlvbi4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgYWx0LWRkIGVsZW1lbnQgc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFVSSSB0byB0aGUKKwkgKiAgICAgICAgICAgICBwb3N0LWFzc2VtYmx5IHZlcnNpb24gb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorCSAqICAgICAgICAgICAgIGZpbGUgZm9yIGEgcGFydGljdWxhciBKYXZhIEVFIG1vZHVsZS4gIFRoZSBVUkkgbXVzdAorCSAqICAgICAgICAgICAgIHNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGRlcGxveW1lbnQKKwkgKiAgICAgICAgICAgICBkZXNjcmlwdG9yIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgcm9vdAorCSAqICAgICAgICAgICAgIGRpcmVjdG9yeS4gSWYgYWx0LWRkIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZXBsb3llcgorCSAqICAgICAgICAgICAgIG11c3QgcmVhZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZyb20gdGhlIGRlZmF1bHQKKwkgKiAgICAgICAgICAgICBsb2NhdGlvbiBhbmQgZmlsZSBuYW1lIHJlcXVpcmVkIGJ5IHRoZSByZXNwZWN0aXZlCisJICogICAgICAgICAgICAgY29tcG9uZW50IHNwZWNpZmljYXRpb24uCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgQXBwbGljYXRpb24gNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWx0IERkPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRBbHREZChTdHJpbmcpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL1dlYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9XZWIuamF2YQppbmRleCBjNGJmMWZmLi4yNjA0MmNiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL1dlYi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vV2ViLmphdmEKQEAgLTIwLDkgKzIwLDEwIEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIHdlYlR5cGUgZGVmaW5lcyB0aGUgd2ViLXVyaSBhbmQgY29udGV4dC1yb290IG9mCi0gKiAJYSB3ZWIgYXBwbGljYXRpb24gbW9kdWxlLgotICogCisgKiAgICAgICAgIFRoZSB3ZWJUeXBlIGRlZmluZXMgdGhlIHdlYi11cmkgYW5kIGNvbnRleHQtcm9vdCBvZgorICogICAgICAgICBhIHdlYiBhcHBsaWNhdGlvbiBtb2R1bGUuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBBcHBsaWNhdGlvbiA1CiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC00NywxMSArNDgsMTIgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSB3ZWItdXJpIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSB3ZWIKLQkgKiAJICAgIGFwcGxpY2F0aW9uIGZpbGUsIHJlbGF0aXZlIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlCi0JICogCSAgICBhcHBsaWNhdGlvbiBwYWNrYWdlLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSB3ZWItdXJpIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBVUkkgb2YgYSB3ZWIKKwkgKiAgICAgICAgICAgICBhcHBsaWNhdGlvbiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxldmVsIG9mIHRoZQorCSAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHBhY2thZ2UuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgQXBwbGljYXRpb24gNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIFVyaTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0V2ViVXJpKFN0cmluZykKQEAgLTc3LDEwICs3OSwxMSBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIGNvbnRleHQtcm9vdCBlbGVtZW50IHNwZWNpZmllcyB0aGUgY29udGV4dCByb290Ci0JICogCSAgICBvZiBhIHdlYiBhcHBsaWNhdGlvbi4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgY29udGV4dC1yb290IGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBjb250ZXh0IHJvb3QKKwkgKiAgICAgICAgICAgICBvZiBhIHdlYiBhcHBsaWNhdGlvbi4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBBcHBsaWNhdGlvbiA1CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZXh0IFJvb3Q8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldENvbnRleHRSb290KFN0cmluZykKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEKaW5kZXggZWIyNWM0MC4uYzcwMzY0NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEKQEAgLTU5LDcgKzU5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBtaXhlZCA9IG51bGw7CisJcHJvdGVjdGVkIEZlYXR1cmVNYXAgbWl4ZWQ7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYTUxOU1ByZWZpeE1hcCgpIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59JyBtYXAuCkBAIC02OSw3ICs2OSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVNYXAgeE1MTlNQcmVmaXhNYXAgPSBudWxsOworCXByb3RlY3RlZCBFTWFwPFN0cmluZywgU3RyaW5nPiB4TUxOU1ByZWZpeE1hcDsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkgPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nIG1hcC4KQEAgLTc5LDcgKzc5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4U0lTY2hlbWFMb2NhdGlvbiA9IG51bGw7CisJcHJvdGVjdGVkIEVNYXA8U3RyaW5nLCBTdHJpbmc+IHhTSVNjaGVtYUxvY2F0aW9uOwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTk1LDYgKzk1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SOwogCX0KQEAgLTExNiw5ICsxMTcsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTWFwIGdldFhNTE5TUHJlZml4TWFwKCkgeworCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhNTE5TUHJlZml4TWFwKCkgewogCQlpZiAoeE1MTlNQcmVmaXhNYXAgPT0gbnVsbCkgewotCQkJeE1MTlNQcmVmaXhNYXAgPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HX1RPX1NUUklOR19NQVBfRU5UUlksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCk7CisJCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXA8U3RyaW5nLFN0cmluZz4oRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQKTsKIAkJfQogCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAubWFwKCk7CiAJfQpAQCAtMTI4LDkgKzEyOSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSB7CisJcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSB7CiAJCWlmICh4U0lTY2hlbWFMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQl4U0lTY2hlbWFMb2NhdGlvbiA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKKwkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcDxTdHJpbmcsU3RyaW5nPihFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwogCQl9CiAJCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbi5tYXAoKTsKIAl9CkBAIC0xNjcsMTQgKzE2OCwxNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWl4ZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWl4ZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTjoKIAkJCQlyZXR1cm4gYmFzaWNTZXRBcHBsaWNhdGlvbihudWxsLCBtc2dzKTsKIAkJfQpAQCAtMTg2LDE2ICsxODgsMTcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKIAkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRNaXhlZCgpOwogCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuZ2V0V3JhcHBlcigpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpOworCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKTsKIAkJCQllbHNlIHJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpOworCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKTsKIAkJCQllbHNlIHJldHVybiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19BUFBMSUNBVElPTjoKIAkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb24oKTsKQEAgLTIwOCwxNiArMjExLDE3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgogCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQobmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOworCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOworCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT046CiAJCQkJc2V0QXBwbGljYXRpb24oKEFwcGxpY2F0aW9uKW5ld1ZhbHVlKTsKQEAgLTIzMSw2ICsyMzUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKQEAgLTI1NCw2ICsyNTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKQEAgLTI3Myw2ICsyNzksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25GYWN0b3J5SW1wbC5qYXZhCmluZGV4IDZhNTY5MGIuLjJmMjBlN2QgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRmFjdG9yeUltcGwuamF2YQpAQCAtNjMsNiArNjMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewogCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVBcHBsaWNhdGlvbigpOwpAQCAtMTI5LDYgKzEzMCw3IEBACiAJICogQGRlcHJlY2F0ZWQKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQERlcHJlY2F0ZWQKIAlwdWJsaWMgc3RhdGljIEFwcGxpY2F0aW9uUGFja2FnZSBnZXRQYWNrYWdlKCkgewogCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25JbXBsLmphdmEKaW5kZXggYjY3MzRjZS4uNjNlZWE3YSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkltcGwuamF2YQpAQCAtMjUsMTAgKzI1LDIyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkdlbmVyaWNCb29sZWFuVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFwcGxpY2F0aW9uLklDb21tb25BcHBsaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFwcGxpY2F0aW9uLklDb21tb25Nb2R1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLlN0cmluZ1V0aWw7CkBAIC00MCwxMiArNTIsMjUgQEAKICAqIDxwPgogICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CiAgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCNnZXRBcHBsaWNhdGlvbk5hbWUgPGVtPkFwcGxpY2F0aW9uIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCNnZXRJbml0aWFsaXplSW5PcmRlciA8ZW0+SW5pdGlhbGl6ZSBJbiBPcmRlcjwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCNnZXRNb2R1bGVzIDxlbT5Nb2R1bGVzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsI2dldFNlY3VyaXR5Um9sZXMgPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsI2dldExpYnJhcnlEaXJlY3RvcnkgPGVtPkxpYnJhcnkgRGlyZWN0b3J5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsI2dldEVudkVudHJ5IDxlbT5FbnYgRW50cnk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwjZ2V0RWpiUmVmIDxlbT5FamIgUmVmPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsI2dldEVqYkxvY2FsUmVmIDxlbT5FamIgTG9jYWwgUmVmPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwjZ2V0UmVzb3VyY2VSZWYgPGVtPlJlc291cmNlIFJlZjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCNnZXRSZXNvdXJjZUVudlJlZiA8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZiA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwjZ2V0UGVyc2lzdGVuY2VVbml0UmVmIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb24gPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwjZ2V0RGF0YVNvdXJjZSA8ZW0+RGF0YSBTb3VyY2U8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgogICogPC91bD4KQEAgLTU1LDYgKzgwLDI2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uLCBJQ29tbW9uQXBwbGljYXRpb24gewogCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhdGlvbk5hbWUoKSA8ZW0+QXBwbGljYXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QXBwbGljYXRpb25OYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uTmFtZSgpIDxlbT5BcHBsaWNhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbk5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgYXBwbGljYXRpb25OYW1lID0gQVBQTElDQVRJT05fTkFNRV9FREVGQVVMVDsKKworCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC02Miw3ICsxMDcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb25zOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNzIsNyArMTE3LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGlzcGxheU5hbWU+IGRpc3BsYXlOYW1lczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25zKCkgPGVtPkljb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTgyLDcgKzEyNywzNiBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpY29ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEljb24+IGljb25zOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxpemVJbk9yZGVyKCkgPGVtPkluaXRpYWxpemUgSW4gT3JkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluaXRpYWxpemVJbk9yZGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEdlbmVyaWNCb29sZWFuVHlwZSBJTklUSUFMSVpFX0lOX09SREVSX0VERUZBVUxUID0gR2VuZXJpY0Jvb2xlYW5UeXBlLlRSVUU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsaXplSW5PcmRlcigpIDxlbT5Jbml0aWFsaXplIEluIE9yZGVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbml0aWFsaXplSW5PcmRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEdlbmVyaWNCb29sZWFuVHlwZSBpbml0aWFsaXplSW5PcmRlciA9IElOSVRJQUxJWkVfSU5fT1JERVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEluaXRpYWxpemUgSW4gT3JkZXIgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVJbk9yZGVyRVNldDsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsZXMoKSA8ZW0+TW9kdWxlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC05Miw3ICsxNjYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtb2R1bGVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8TW9kdWxlPiBtb2R1bGVzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdXJpdHlSb2xlcygpIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMDIsNyArMTc2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlSb2xlcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFNlY3VyaXR5Um9sZT4gc2VjdXJpdHlSb2xlczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaWJyYXJ5RGlyZWN0b3J5KCkgPGVtPkxpYnJhcnkgRGlyZWN0b3J5PC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMjUsNiArMTk5LDExNiBAQAogCXByb3RlY3RlZCBTdHJpbmcgbGlicmFyeURpcmVjdG9yeSA9IExJQlJBUllfRElSRUNUT1JZX0VERUZBVUxUOwogCiAJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52RW50cnkoKSA8ZW0+RW52IEVudHJ5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVudkVudHJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8RW52RW50cnk+IGVudkVudHJ5OworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVmKCkgPGVtPkVqYiBSZWY8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RWpiUmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8RWpiUmVmPiBlamJSZWY7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJMb2NhbFJlZigpIDxlbT5FamIgTG9jYWwgUmVmPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVqYkxvY2FsUmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8RWpiTG9jYWxSZWY+IGVqYkxvY2FsUmVmOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVJlZnMoKSA8ZW0+U2VydmljZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNlcnZpY2VSZWZzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8U2VydmljZVJlZj4gc2VydmljZVJlZnM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVJlZigpIDxlbT5SZXNvdXJjZSBSZWY8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVzb3VyY2VSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxSZXNvdXJjZVJlZj4gcmVzb3VyY2VSZWY7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUVudlJlZigpIDxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlc291cmNlRW52UmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8UmVzb3VyY2VFbnZSZWY+IHJlc291cmNlRW52UmVmOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvblJlZj4gbWVzc2FnZURlc3RpbmF0aW9uUmVmOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCkgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFBlcnNpc3RlbmNlQ29udGV4dFJlZj4gcGVyc2lzdGVuY2VDb250ZXh0UmVmOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCkgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdFJlZigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFBlcnNpc3RlbmNlVW5pdFJlZj4gcGVyc2lzdGVuY2VVbml0UmVmOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uPiBtZXNzYWdlRGVzdGluYXRpb247CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhU291cmNlKCkgPGVtPkRhdGEgU291cmNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERhdGFTb3VyY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEYXRhU291cmNlVHlwZT4gZGF0YVNvdXJjZTsKKworCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xNTIsNyArMzM2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIjUiOyAvLyROT04tTkxTLTEkCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9ICI2IjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNzEsNyArMzU1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJzaW9uRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25FU2V0OwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTE4Nyw2ICszNzEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5BUFBMSUNBVElPTjsKIAl9CkBAIC0xOTYsOSArMzgxLDMwIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIGFwcGxpY2F0aW9uTmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbk5hbWUoU3RyaW5nIG5ld0FwcGxpY2F0aW9uTmFtZSkgeworCQlTdHJpbmcgb2xkQXBwbGljYXRpb25OYW1lID0gYXBwbGljYXRpb25OYW1lOworCQlhcHBsaWNhdGlvbk5hbWUgPSBuZXdBcHBsaWNhdGlvbk5hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fQVBQTElDQVRJT05fTkFNRSwgb2xkQXBwbGljYXRpb25OYW1lLCBhcHBsaWNhdGlvbk5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMjA4LDkgKzQxNCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKKwlwdWJsaWMgTGlzdDxEaXNwbGF5TmFtZT4gZ2V0RGlzcGxheU5hbWVzKCkgewogCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUVTKTsKKwkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEaXNwbGF5TmFtZT4oRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRElTUExBWV9OQU1FUyk7CiAJCX0KIAkJcmV0dXJuIGRpc3BsYXlOYW1lczsKIAl9CkBAIC0yMjAsOSArNDI2LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SWNvbnMoKSB7CisJcHVibGljIExpc3Q8SWNvbj4gZ2V0SWNvbnMoKSB7CiAJCWlmIChpY29ucyA9PSBudWxsKSB7Ci0JCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJY29uLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lDT05TKTsKKwkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEljb24+KEljb24uY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSUNPTlMpOwogCQl9CiAJCXJldHVybiBpY29uczsKIAl9CkBAIC0yMzIsOSArNDM4LDU1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldE1vZHVsZXMoKSB7CisJcHVibGljIEdlbmVyaWNCb29sZWFuVHlwZSBnZXRJbml0aWFsaXplSW5PcmRlcigpIHsKKwkJcmV0dXJuIGluaXRpYWxpemVJbk9yZGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemVJbk9yZGVyKEdlbmVyaWNCb29sZWFuVHlwZSBuZXdJbml0aWFsaXplSW5PcmRlcikgeworCQlHZW5lcmljQm9vbGVhblR5cGUgb2xkSW5pdGlhbGl6ZUluT3JkZXIgPSBpbml0aWFsaXplSW5PcmRlcjsKKwkJaW5pdGlhbGl6ZUluT3JkZXIgPSBuZXdJbml0aWFsaXplSW5PcmRlciA9PSBudWxsID8gSU5JVElBTElaRV9JTl9PUkRFUl9FREVGQVVMVCA6IG5ld0luaXRpYWxpemVJbk9yZGVyOworCQlib29sZWFuIG9sZEluaXRpYWxpemVJbk9yZGVyRVNldCA9IGluaXRpYWxpemVJbk9yZGVyRVNldDsKKwkJaW5pdGlhbGl6ZUluT3JkZXJFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JTklUSUFMSVpFX0lOX09SREVSLCBvbGRJbml0aWFsaXplSW5PcmRlciwgaW5pdGlhbGl6ZUluT3JkZXIsICFvbGRJbml0aWFsaXplSW5PcmRlckVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldEluaXRpYWxpemVJbk9yZGVyKCkgeworCQlHZW5lcmljQm9vbGVhblR5cGUgb2xkSW5pdGlhbGl6ZUluT3JkZXIgPSBpbml0aWFsaXplSW5PcmRlcjsKKwkJYm9vbGVhbiBvbGRJbml0aWFsaXplSW5PcmRlckVTZXQgPSBpbml0aWFsaXplSW5PcmRlckVTZXQ7CisJCWluaXRpYWxpemVJbk9yZGVyID0gSU5JVElBTElaRV9JTl9PUkRFUl9FREVGQVVMVDsKKwkJaW5pdGlhbGl6ZUluT3JkZXJFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JTklUSUFMSVpFX0lOX09SREVSLCBvbGRJbml0aWFsaXplSW5PcmRlciwgSU5JVElBTElaRV9JTl9PUkRFUl9FREVGQVVMVCwgb2xkSW5pdGlhbGl6ZUluT3JkZXJFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZXRJbml0aWFsaXplSW5PcmRlcigpIHsKKwkJcmV0dXJuIGluaXRpYWxpemVJbk9yZGVyRVNldDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxNb2R1bGU+IGdldE1vZHVsZXMoKSB7CiAJCWlmIChtb2R1bGVzID09IG51bGwpIHsKLQkJCW1vZHVsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTW9kdWxlLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVMpOworCQkJbW9kdWxlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxNb2R1bGU+KE1vZHVsZS5jbGFzcywgdGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTKTsKIAkJfQogCQlyZXR1cm4gbW9kdWxlczsKIAl9CkBAIC0yNDQsOSArNDk2LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0U2VjdXJpdHlSb2xlcygpIHsKKwlwdWJsaWMgTGlzdDxTZWN1cml0eVJvbGU+IGdldFNlY3VyaXR5Um9sZXMoKSB7CiAJCWlmIChzZWN1cml0eVJvbGVzID09IG51bGwpIHsKLQkJCXNlY3VyaXR5Um9sZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VjdXJpdHlSb2xlLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTKTsKKwkJCXNlY3VyaXR5Um9sZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U2VjdXJpdHlSb2xlPihTZWN1cml0eVJvbGUuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVMpOwogCQl9CiAJCXJldHVybiBzZWN1cml0eVJvbGVzOwogCX0KQEAgLTI3Nyw2ICs1MjksMTM4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBMaXN0PEVudkVudHJ5PiBnZXRFbnZFbnRyeSgpIHsKKwkJaWYgKGVudkVudHJ5ID09IG51bGwpIHsKKwkJCWVudkVudHJ5ID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEVudkVudHJ5PihFbnZFbnRyeS5jbGFzcywgdGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19FTlZfRU5UUlkpOworCQl9CisJCXJldHVybiBlbnZFbnRyeTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxFamJSZWY+IGdldEVqYlJlZigpIHsKKwkJaWYgKGVqYlJlZiA9PSBudWxsKSB7CisJCQllamJSZWYgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RWpiUmVmPihFamJSZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRUpCX1JFRik7CisJCX0KKwkJcmV0dXJuIGVqYlJlZjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxFamJMb2NhbFJlZj4gZ2V0RWpiTG9jYWxSZWYoKSB7CisJCWlmIChlamJMb2NhbFJlZiA9PSBudWxsKSB7CisJCQllamJMb2NhbFJlZiA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxFamJMb2NhbFJlZj4oRWpiTG9jYWxSZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRUpCX0xPQ0FMX1JFRik7CisJCX0KKwkJcmV0dXJuIGVqYkxvY2FsUmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PFNlcnZpY2VSZWY+IGdldFNlcnZpY2VSZWZzKCkgeworCQlpZiAoc2VydmljZVJlZnMgPT0gbnVsbCkgeworCQkJc2VydmljZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U2VydmljZVJlZj4oU2VydmljZVJlZi5jbGFzcywgdGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19TRVJWSUNFX1JFRlMpOworCQl9CisJCXJldHVybiBzZXJ2aWNlUmVmczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxSZXNvdXJjZVJlZj4gZ2V0UmVzb3VyY2VSZWYoKSB7CisJCWlmIChyZXNvdXJjZVJlZiA9PSBudWxsKSB7CisJCQlyZXNvdXJjZVJlZiA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxSZXNvdXJjZVJlZj4oUmVzb3VyY2VSZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fUkVTT1VSQ0VfUkVGKTsKKwkJfQorCQlyZXR1cm4gcmVzb3VyY2VSZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8UmVzb3VyY2VFbnZSZWY+IGdldFJlc291cmNlRW52UmVmKCkgeworCQlpZiAocmVzb3VyY2VFbnZSZWYgPT0gbnVsbCkgeworCQkJcmVzb3VyY2VFbnZSZWYgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UmVzb3VyY2VFbnZSZWY+KFJlc291cmNlRW52UmVmLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1JFU09VUkNFX0VOVl9SRUYpOworCQl9CisJCXJldHVybiByZXNvdXJjZUVudlJlZjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxNZXNzYWdlRGVzdGluYXRpb25SZWY+IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpIHsKKwkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvblJlZiA9PSBudWxsKSB7CisJCQltZXNzYWdlRGVzdGluYXRpb25SZWYgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uUmVmPihNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUYpOworCQl9CisJCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8UGVyc2lzdGVuY2VDb250ZXh0UmVmPiBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKSB7CisJCWlmIChwZXJzaXN0ZW5jZUNvbnRleHRSZWYgPT0gbnVsbCkgeworCQkJcGVyc2lzdGVuY2VDb250ZXh0UmVmID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFBlcnNpc3RlbmNlQ29udGV4dFJlZj4oUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGKTsKKwkJfQorCQlyZXR1cm4gcGVyc2lzdGVuY2VDb250ZXh0UmVmOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PFBlcnNpc3RlbmNlVW5pdFJlZj4gZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCkgeworCQlpZiAocGVyc2lzdGVuY2VVbml0UmVmID09IG51bGwpIHsKKwkJCXBlcnNpc3RlbmNlVW5pdFJlZiA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxQZXJzaXN0ZW5jZVVuaXRSZWY+KFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgdGhpcywgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19QRVJTSVNURU5DRV9VTklUX1JFRik7CisJCX0KKwkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFJlZjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxNZXNzYWdlRGVzdGluYXRpb24+IGdldE1lc3NhZ2VEZXN0aW5hdGlvbigpIHsKKwkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvbiA9PSBudWxsKSB7CisJCQltZXNzYWdlRGVzdGluYXRpb24gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uPihNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTik7CisJCX0KKwkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxEYXRhU291cmNlVHlwZT4gZ2V0RGF0YVNvdXJjZSgpIHsKKwkJaWYgKGRhdGFTb3VyY2UgPT0gbnVsbCkgeworCQkJZGF0YVNvdXJjZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEYXRhU291cmNlVHlwZT4oRGF0YVNvdXJjZVR5cGUuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fREFUQV9TT1VSQ0UpOworCQl9CisJCXJldHVybiBkYXRhU291cmNlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CiAJCXJldHVybiBpZDsKIAl9CkBAIC0zNDQsMTggKzcyOCw0MSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNb2R1bGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1vZHVsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZWN1cml0eVJvbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19FTlZfRU5UUlk6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRFbnZFbnRyeSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRUpCX1JFRjoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVqYlJlZigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRUpCX0xPQ0FMX1JFRjoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVqYkxvY2FsUmVmKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19TRVJWSUNFX1JFRlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fUkVTT1VSQ0VfUkVGOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UmVzb3VyY2VSZWYoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1JFU09VUkNFX0VOVl9SRUY6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRSZXNvdXJjZUVudlJlZigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUY6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19QRVJTSVNURU5DRV9VTklUX1JFRjoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBlcnNpc3RlbmNlVW5pdFJlZigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTjoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1lc3NhZ2VEZXN0aW5hdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREYXRhU291cmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtMzY1LDIwICs3NzIsNDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0FQUExJQ0FUSU9OX05BTUU6CisJCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uTmFtZSgpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OUzoKIAkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRElTUExBWV9OQU1FUzoKIAkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSUNPTlM6CiAJCQkJcmV0dXJuIGdldEljb25zKCk7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSU5JVElBTElaRV9JTl9PUkRFUjoKKwkJCQlyZXR1cm4gZ2V0SW5pdGlhbGl6ZUluT3JkZXIoKTsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTOgogCQkJCXJldHVybiBnZXRNb2R1bGVzKCk7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVM6CiAJCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZXMoKTsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19MSUJSQVJZX0RJUkVDVE9SWToKIAkJCQlyZXR1cm4gZ2V0TGlicmFyeURpcmVjdG9yeSgpOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0VOVl9FTlRSWToKKwkJCQlyZXR1cm4gZ2V0RW52RW50cnkoKTsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19FSkJfUkVGOgorCQkJCXJldHVybiBnZXRFamJSZWYoKTsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19FSkJfTE9DQUxfUkVGOgorCQkJCXJldHVybiBnZXRFamJMb2NhbFJlZigpOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFUlZJQ0VfUkVGUzoKKwkJCQlyZXR1cm4gZ2V0U2VydmljZVJlZnMoKTsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19SRVNPVVJDRV9SRUY6CisJCQkJcmV0dXJuIGdldFJlc291cmNlUmVmKCk7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fUkVTT1VSQ0VfRU5WX1JFRjoKKwkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWYoKTsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRjoKKwkJCQlyZXR1cm4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCk7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUY6CisJCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1BFUlNJU1RFTkNFX1VOSVRfUkVGOgorCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKTsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NRVNTQUdFX0RFU1RJTkFUSU9OOgorCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb24oKTsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19EQVRBX1NPVVJDRToKKwkJCQlyZXR1cm4gZ2V0RGF0YVNvdXJjZSgpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lEOgogCQkJCXJldHVybiBnZXRJZCgpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1ZFUlNJT046CkBAIC0zOTIsMzEgKzgyNiw4MyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0FQUExJQ0FUSU9OX05BTUU6CisJCQkJc2V0QXBwbGljYXRpb25OYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRElTUExBWV9OQU1FUzoKIAkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaXNwbGF5TmFtZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JQ09OUzoKIAkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJY29uPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lOSVRJQUxJWkVfSU5fT1JERVI6CisJCQkJc2V0SW5pdGlhbGl6ZUluT3JkZXIoKEdlbmVyaWNCb29sZWFuVHlwZSluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVM6CiAJCQkJZ2V0TW9kdWxlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TW9kdWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0TW9kdWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTW9kdWxlPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFQ1VSSVRZX1JPTEVTOgogCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5jbGVhcigpOwotCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3VyaXR5Um9sZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19MSUJSQVJZX0RJUkVDVE9SWToKIAkJCQlzZXRMaWJyYXJ5RGlyZWN0b3J5KChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19FTlZfRU5UUlk6CisJCQkJZ2V0RW52RW50cnkoKS5jbGVhcigpOworCQkJCWdldEVudkVudHJ5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFbnZFbnRyeT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19FSkJfUkVGOgorCQkJCWdldEVqYlJlZigpLmNsZWFyKCk7CisJCQkJZ2V0RWpiUmVmKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFamJSZWY+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fRUpCX0xPQ0FMX1JFRjoKKwkJCQlnZXRFamJMb2NhbFJlZigpLmNsZWFyKCk7CisJCQkJZ2V0RWpiTG9jYWxSZWYoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEVqYkxvY2FsUmVmPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1NFUlZJQ0VfUkVGUzoKKwkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7CisJCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlcnZpY2VSZWY+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fUkVTT1VSQ0VfUkVGOgorCQkJCWdldFJlc291cmNlUmVmKCkuY2xlYXIoKTsKKwkJCQlnZXRSZXNvdXJjZVJlZigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUmVzb3VyY2VSZWY+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fUkVTT1VSQ0VfRU5WX1JFRjoKKwkJCQlnZXRSZXNvdXJjZUVudlJlZigpLmNsZWFyKCk7CisJCQkJZ2V0UmVzb3VyY2VFbnZSZWYoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJlc291cmNlRW52UmVmPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01FU1NBR0VfREVTVElOQVRJT05fUkVGOgorCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpLmNsZWFyKCk7CisJCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXNzYWdlRGVzdGluYXRpb25SZWY+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUY6CisJCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCkuY2xlYXIoKTsKKwkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFBlcnNpc3RlbmNlQ29udGV4dFJlZj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19QRVJTSVNURU5DRV9VTklUX1JFRjoKKwkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKS5jbGVhcigpOworCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UmVmPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01FU1NBR0VfREVTVElOQVRJT046CisJCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkuY2xlYXIoKTsKKwkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1lc3NhZ2VEZXN0aW5hdGlvbj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19EQVRBX1NPVVJDRToKKwkJCQlnZXREYXRhU291cmNlKCkuY2xlYXIoKTsKKwkJCQlnZXREYXRhU291cmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEYXRhU291cmNlVHlwZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19JRDoKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CkBAIC00MzIsOCArOTE4LDEyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fQVBQTElDQVRJT05fTkFNRToKKwkJCQlzZXRBcHBsaWNhdGlvbk5hbWUoQVBQTElDQVRJT05fTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwogCQkJCXJldHVybjsKQEAgLTQ0Myw2ICs5MzMsOSBAQAogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lDT05TOgogCQkJCWdldEljb25zKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSU5JVElBTElaRV9JTl9PUkRFUjoKKwkJCQl1bnNldEluaXRpYWxpemVJbk9yZGVyKCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVM6CiAJCQkJZ2V0TW9kdWxlcygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOwpAQCAtNDUyLDYgKzk0NSwzOSBAQAogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0xJQlJBUllfRElSRUNUT1JZOgogCQkJCXNldExpYnJhcnlEaXJlY3RvcnkoTElCUkFSWV9ESVJFQ1RPUllfRURFRkFVTFQpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19FTlZfRU5UUlk6CisJCQkJZ2V0RW52RW50cnkoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19FSkJfUkVGOgorCQkJCWdldEVqYlJlZigpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0VKQl9MT0NBTF9SRUY6CisJCQkJZ2V0RWpiTG9jYWxSZWYoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19TRVJWSUNFX1JFRlM6CisJCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19SRVNPVVJDRV9SRUY6CisJCQkJZ2V0UmVzb3VyY2VSZWYoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19SRVNPVVJDRV9FTlZfUkVGOgorCQkJCWdldFJlc291cmNlRW52UmVmKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUY6CisJCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUY6CisJCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUY6CisJCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTjoKKwkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb24oKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19EQVRBX1NPVVJDRToKKwkJCQlnZXREYXRhU291cmNlKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSUQ6CiAJCQkJc2V0SWQoSURfRURFRkFVTFQpOwogCQkJCXJldHVybjsKQEAgLTQ2NywyMCArOTkzLDQ3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fQVBQTElDQVRJT05fTkFNRToKKwkJCQlyZXR1cm4gQVBQTElDQVRJT05fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gYXBwbGljYXRpb25OYW1lICE9IG51bGwgOiAhQVBQTElDQVRJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMoYXBwbGljYXRpb25OYW1lKTsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19ERVNDUklQVElPTlM6CiAJCQkJcmV0dXJuIGRlc2NyaXB0aW9ucyAhPSBudWxsICYmICFkZXNjcmlwdGlvbnMuaXNFbXB0eSgpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0RJU1BMQVlfTkFNRVM6CiAJCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0lDT05TOgogCQkJCXJldHVybiBpY29ucyAhPSBudWxsICYmICFpY29ucy5pc0VtcHR5KCk7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSU5JVElBTElaRV9JTl9PUkRFUjoKKwkJCQlyZXR1cm4gaXNTZXRJbml0aWFsaXplSW5PcmRlcigpOwogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX01PRFVMRVM6CiAJCQkJcmV0dXJuIG1vZHVsZXMgIT0gbnVsbCAmJiAhbW9kdWxlcy5pc0VtcHR5KCk7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVM6CiAJCQkJcmV0dXJuIHNlY3VyaXR5Um9sZXMgIT0gbnVsbCAmJiAhc2VjdXJpdHlSb2xlcy5pc0VtcHR5KCk7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTElCUkFSWV9ESVJFQ1RPUlk6CiAJCQkJcmV0dXJuIExJQlJBUllfRElSRUNUT1JZX0VERUZBVUxUID09IG51bGwgPyBsaWJyYXJ5RGlyZWN0b3J5ICE9IG51bGwgOiAhTElCUkFSWV9ESVJFQ1RPUllfRURFRkFVTFQuZXF1YWxzKGxpYnJhcnlEaXJlY3RvcnkpOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0VOVl9FTlRSWToKKwkJCQlyZXR1cm4gZW52RW50cnkgIT0gbnVsbCAmJiAhZW52RW50cnkuaXNFbXB0eSgpOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0VKQl9SRUY6CisJCQkJcmV0dXJuIGVqYlJlZiAhPSBudWxsICYmICFlamJSZWYuaXNFbXB0eSgpOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX0VKQl9MT0NBTF9SRUY6CisJCQkJcmV0dXJuIGVqYkxvY2FsUmVmICE9IG51bGwgJiYgIWVqYkxvY2FsUmVmLmlzRW1wdHkoKTsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19TRVJWSUNFX1JFRlM6CisJCQkJcmV0dXJuIHNlcnZpY2VSZWZzICE9IG51bGwgJiYgIXNlcnZpY2VSZWZzLmlzRW1wdHkoKTsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19SRVNPVVJDRV9SRUY6CisJCQkJcmV0dXJuIHJlc291cmNlUmVmICE9IG51bGwgJiYgIXJlc291cmNlUmVmLmlzRW1wdHkoKTsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19SRVNPVVJDRV9FTlZfUkVGOgorCQkJCXJldHVybiByZXNvdXJjZUVudlJlZiAhPSBudWxsICYmICFyZXNvdXJjZUVudlJlZi5pc0VtcHR5KCk7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUY6CisJCQkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZiAhPSBudWxsICYmICFtZXNzYWdlRGVzdGluYXRpb25SZWYuaXNFbXB0eSgpOworCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGOgorCQkJCXJldHVybiBwZXJzaXN0ZW5jZUNvbnRleHRSZWYgIT0gbnVsbCAmJiAhcGVyc2lzdGVuY2VDb250ZXh0UmVmLmlzRW1wdHkoKTsKKwkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19QRVJTSVNURU5DRV9VTklUX1JFRjoKKwkJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0UmVmICE9IG51bGwgJiYgIXBlcnNpc3RlbmNlVW5pdFJlZi5pc0VtcHR5KCk7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTjoKKwkJCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uICE9IG51bGwgJiYgIW1lc3NhZ2VEZXN0aW5hdGlvbi5pc0VtcHR5KCk7CisJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuIGRhdGFTb3VyY2UgIT0gbnVsbCAmJiAhZGF0YVNvdXJjZS5pc0VtcHR5KCk7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fSUQ6CiAJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fVkVSU0lPTjoKQEAgLTQ5NCwxMSArMTA0NywxNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobGlicmFyeURpcmVjdG9yeTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiIChhcHBsaWNhdGlvbk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoYXBwbGljYXRpb25OYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpbml0aWFsaXplSW5PcmRlcjogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGluaXRpYWxpemVJbk9yZGVyRVNldCkgcmVzdWx0LmFwcGVuZChpbml0aWFsaXplSW5PcmRlcik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgbGlicmFyeURpcmVjdG9yeTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChsaWJyYXJ5RGlyZWN0b3J5KTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25QYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQppbmRleCA5MzEwOGJiLi40NWYyM2RiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25QYWNrYWdlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblBhY2thZ2VJbXBsLmphdmEKQEAgLTIxLDYgKzIxLDggQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luLkoyRUVDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVJbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwpAQCAtMjksMjYgKzMxLDggQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsOwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KQEAgLTEwOCwyMyArOTIsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCXByaXZhdGUgdm9sYXRpbGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKIAogCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgorCSAqIAorCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgQXBwbGljYXRpb25QYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgorCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAc2VlICNlTlNfVVJJCkBAIC0xMzYsNyArMTEwLDcgQEAKIAkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7CiAKIAkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBBcHBsaWNhdGlvblBhY2thZ2VJbXBsKCkpOworCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEFwcGxpY2F0aW9uUGFja2FnZUltcGwoKSk7CiAKIAkJaXNJbml0ZWQgPSB0cnVlOwogCkBAIC0xNDQsMzIgKzExOCwyMSBAQAogCQlYTUxOYW1lc3BhY2VQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKIAkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCVdlYlBhY2thZ2VJbXBsIHRoZVdlYlBhY2thZ2UgPSAoV2ViUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgOiBXZWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUphdmFlZVBhY2thZ2VJbXBsIHRoZUphdmFlZVBhY2thZ2UgPSAoSmF2YWVlUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKYXZhZWVQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSkgOiBKYXZhZWVQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlID0gKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQogCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwogCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUphdmFlZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKIAogCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCiAJCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhZWVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwogCiAJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKIAkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmZyZWV6ZSgpOwogCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJLCB0aGVBcHBsaWNhdGlvblBhY2thZ2UpOworCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkyLCB0aGVBcHBsaWNhdGlvblBhY2thZ2UpOworCisJCUoyRUVJbml0LmluaXRFTUZNb2RlbHMoKTsKIAkJcmV0dXJuIHRoZUFwcGxpY2F0aW9uUGFja2FnZTsKIAl9CiAKQEAgLTE4Nyw4ICsxNTAsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uX0FwcGxpY2F0aW9uTmFtZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CiAJfQogCiAJLyoqCkBAIC0xOTYsNyArMTU5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fRGlzcGxheU5hbWVzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX0Rlc2NyaXB0aW9ucygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CiAJfQogCkBAIC0yMDUsNyArMTY4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fSWNvbnMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fRGlzcGxheU5hbWVzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKIAl9CiAKQEAgLTIxNCw3ICsxNzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX0ljb25zKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKIAl9CiAKQEAgLTIyMyw4ICsxODYsMjYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25fSW5pdGlhbGl6ZUluT3JkZXIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX01vZHVsZXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX1NlY3VyaXR5Um9sZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKIAl9CiAKIAkvKioKQEAgLTIzMyw3ICsyMTQsMTA2IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uX0xpYnJhcnlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9FbnZFbnRyeSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fRWpiUmVmKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9FamJMb2NhbFJlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX1NlcnZpY2VSZWZzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fUmVzb3VyY2VSZWYoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9SZXNvdXJjZUVudlJlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX01lc3NhZ2VEZXN0aW5hdGlvblJlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX1BlcnNpc3RlbmNlQ29udGV4dFJlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX1BlcnNpc3RlbmNlVW5pdFJlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX01lc3NhZ2VEZXN0aW5hdGlvbigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX0RhdGFTb3VyY2UoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKIAl9CiAKIAkvKioKQEAgLTI0Miw3ICszMjIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE5KTsKIAl9CiAKIAkvKioKQEAgLTI1MSw3ICszMzEsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwogCX0KIAogCS8qKgpAQCAtNDI3LDEyICs1MDcsMjUgQEAKIAogCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKIAkJYXBwbGljYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQVRJT04pOworCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fQVBQTElDQVRJT05fTkFNRSk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19ERVNDUklQVElPTlMpOwogCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fRElTUExBWV9OQU1FUyk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19JQ09OUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19JTklUSUFMSVpFX0lOX09SREVSKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkVDbGFzcywgQVBQTElDQVRJT05fX01PRFVMRVMpOwogCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVMpOwogCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fTElCUkFSWV9ESVJFQ1RPUlkpOworCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fRU5WX0VOVFJZKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkVDbGFzcywgQVBQTElDQVRJT05fX0VKQl9SRUYpOworCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fRUpCX0xPQ0FMX1JFRik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19TRVJWSUNFX1JFRlMpOworCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fUkVTT1VSQ0VfUkVGKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkVDbGFzcywgQVBQTElDQVRJT05fX1JFU09VUkNFX0VOVl9SRUYpOworCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUYpOworCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUYpOworCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUYpOworCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19EQVRBX1NPVVJDRSk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19JRCk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25FQ2xhc3MsIEFQUExJQ0FUSU9OX19WRVJTSU9OKTsKIApAQCAtNDgwLDQ3ICs1NzMsNzYgQEAKIAkJc2V0TnNVUkkoZU5TX1VSSSk7CiAKIAkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlKYXZhZWVQYWNrYWdlIHRoZUphdmFlZVBhY2thZ2UgPSAoSmF2YWVlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpOwogCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKKwkJSmF2YWVlUGFja2FnZSB0aGVKYXZhZWVQYWNrYWdlID0gKEphdmFlZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKTsKIAotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKIAotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGFwcGxpY2F0aW9uRUNsYXNzLCBBcHBsaWNhdGlvbi5jbGFzcywgIkFwcGxpY2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uX01vZHVsZXMoKSwgdGhpcy5nZXRNb2R1bGUoKSwgbnVsbCwgIm1vZHVsZXMiLCBudWxsLCAxLCAtMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbl9MaWJyYXJ5RGlyZWN0b3J5KCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGF0aFR5cGUoKSwgImxpYnJhcnlEaXJlY3RvcnkiLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25fVmVyc2lvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERld2V5VmVyc2lvblR5cGUoKSwgInZlcnNpb24iLCAiNSIsIDEsIDEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCiAKLQkJaW5pdEVDbGFzcyhhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yLmNsYXNzLCAiQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJtaXhlZCIsIG51bGwsIDAsIC0xLCBudWxsLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieE1MTlNQcmVmaXhNYXAiLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4U0lTY2hlbWFMb2NhdGlvbiIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9BcHBsaWNhdGlvbigpLCB0aGlzLmdldEFwcGxpY2F0aW9uKCksIG51bGwsICJhcHBsaWNhdGlvbiIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhtb2R1bGVFQ2xhc3MsIE1vZHVsZS5jbGFzcywgIk1vZHVsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfQ29ubmVjdG9yKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGF0aFR5cGUoKSwgImNvbm5lY3RvciIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kdWxlX0VqYigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhdGhUeXBlKCksICJlamIiLCBudWxsLCAwLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9KYXZhKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGF0aFR5cGUoKSwgImphdmEiLCBudWxsLCAwLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1vZHVsZV9XZWIoKSwgdGhpcy5nZXRXZWIoKSwgbnVsbCwgIndlYiIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfQWx0RGQoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAiYWx0RGQiLCBudWxsLCAwLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHdlYkVDbGFzcywgV2ViLmNsYXNzLCAiV2ViIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYl9XZWJVcmkoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAid2ViVXJpIiwgbnVsbCwgMSwgMSwgV2ViLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJfQ29udGV4dFJvb3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImNvbnRleHRSb290IiwgbnVsbCwgMSwgMSwgV2ViLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgV2ViLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSBhbm5vdGF0aW9ucwotCQkvLyBodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEKLQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7CisJCWJvb2xlYW4gaGFzTG9jayA9IGZhbHNlOworCQl0cnkgeworCQkJaGFzTG9jayA9IEoyRUVJbml0LmFxdWlyZUluaXRpYWxpemVQYWNrYWdlQ29udGVudHNMb2NrKCk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9CQkKKwkJCisJCXRyeXsKKwkJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkKKwkJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCQlpbml0RUNsYXNzKGFwcGxpY2F0aW9uRUNsYXNzLCBBcHBsaWNhdGlvbi5jbGFzcywgIkFwcGxpY2F0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbl9BcHBsaWNhdGlvbk5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImFwcGxpY2F0aW9uTmFtZSIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbl9Jbml0aWFsaXplSW5PcmRlcigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEdlbmVyaWNCb29sZWFuVHlwZSgpLCAiaW5pdGlhbGl6ZUluT3JkZXIiLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCksIHRoaXMuZ2V0TW9kdWxlKCksIG51bGwsICJtb2R1bGVzIiwgbnVsbCwgMSwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9TZWN1cml0eVJvbGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlKCksIG51bGwsICJzZWN1cml0eVJvbGVzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbl9MaWJyYXJ5RGlyZWN0b3J5KCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGF0aFR5cGUoKSwgImxpYnJhcnlEaXJlY3RvcnkiLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fRW52RW50cnkoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFbnZFbnRyeSgpLCBudWxsLCAiZW52RW50cnkiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uX0VqYlJlZigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9FamJMb2NhbFJlZigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYkxvY2FsUmVmKCksIG51bGwsICJlamJMb2NhbFJlZiIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fU2VydmljZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fUmVzb3VyY2VSZWYoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWYiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uX1Jlc291cmNlRW52UmVmKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9NZXNzYWdlRGVzdGluYXRpb25SZWYoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZiIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fUGVyc2lzdGVuY2VDb250ZXh0UmVmKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZUNvbnRleHRSZWYiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uX1BlcnNpc3RlbmNlVW5pdFJlZigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlVW5pdFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0UmVmIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbl9NZXNzYWdlRGVzdGluYXRpb24oKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvbiIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fRGF0YVNvdXJjZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERhdGFTb3VyY2VUeXBlKCksIG51bGwsICJkYXRhU291cmNlIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbl9WZXJzaW9uKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGV3ZXlWZXJzaW9uVHlwZSgpLCAidmVyc2lvbiIsICI2IiwgMSwgMSwgQXBwbGljYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCisJCQlpbml0RUNsYXNzKGFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IuY2xhc3MsICJBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJtaXhlZCIsIG51bGwsIDAsIC0xLCBudWxsLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhNTE5TUHJlZml4TWFwIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhTSVNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcl9BcHBsaWNhdGlvbigpLCB0aGlzLmdldEFwcGxpY2F0aW9uKCksIG51bGwsICJhcHBsaWNhdGlvbiIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKG1vZHVsZUVDbGFzcywgTW9kdWxlLmNsYXNzLCAiTW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfQ29ubmVjdG9yKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGF0aFR5cGUoKSwgImNvbm5lY3RvciIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kdWxlX0VqYigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhdGhUeXBlKCksICJlamIiLCBudWxsLCAwLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9KYXZhKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGF0aFR5cGUoKSwgImphdmEiLCBudWxsLCAwLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1vZHVsZV9XZWIoKSwgdGhpcy5nZXRXZWIoKSwgbnVsbCwgIndlYiIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kdWxlX0FsdERkKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGF0aFR5cGUoKSwgImFsdERkIiwgbnVsbCwgMCwgMSwgTW9kdWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTW9kdWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Mod2ViRUNsYXNzLCBXZWIuY2xhc3MsICJXZWIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFdlYl9XZWJVcmkoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAid2ViVXJpIiwgbnVsbCwgMSwgMSwgV2ViLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJfQ29udGV4dFJvb3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImNvbnRleHRSb290IiwgbnVsbCwgMSwgMSwgV2ViLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgV2ViLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCisJCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKKwkJCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQorCQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiAJLyoqCkBAIC01MzcsNiArNjU5LDE0IEBACiAJCSAgIG5ldyBTdHJpbmdbXSB7CiAJCQkgIm5hbWUiLCAiYXBwbGljYXRpb25UeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBcHBsaWNhdGlvbl9BcHBsaWNhdGlvbk5hbWUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImFwcGxpY2F0aW9uLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkKIAkJYWRkQW5ub3RhdGlvbgogCQkgIChnZXRBcHBsaWNhdGlvbl9EZXNjcmlwdGlvbnMoKSwgCkBAIC01NjMsMTMgKzY5MywyMSBAQAogCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkJCiAJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QXBwbGljYXRpb25fSW5pdGlhbGl6ZUluT3JkZXIoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImluaXRpYWxpemUtaW4tb3JkZXIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKIAkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWUiLCAibW9kdWxlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCisJCSAgIH0pOwkJCQogCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldEFwcGxpY2F0aW9uX1NlY3VyaXR5Um9sZXMoKSwgCiAJCSAgIHNvdXJjZSwgCkBAIC01ODUsNiArNzIzLDk0IEBACiAJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lIiwgImxpYnJhcnktZGlyZWN0b3J5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEFwcGxpY2F0aW9uX0VudkVudHJ5KCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJlbnYtZW50cnkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QXBwbGljYXRpb25fRWpiUmVmKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJlamItcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEFwcGxpY2F0aW9uX0VqYkxvY2FsUmVmKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJlamItbG9jYWwtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QXBwbGljYXRpb25fU2VydmljZVJlZnMoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBcHBsaWNhdGlvbl9SZXNvdXJjZVJlZigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAicmVzb3VyY2UtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEFwcGxpY2F0aW9uX1Jlc291cmNlRW52UmVmKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJyZXNvdXJjZS1lbnYtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEFwcGxpY2F0aW9uX01lc3NhZ2VEZXN0aW5hdGlvblJlZigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QXBwbGljYXRpb25fUGVyc2lzdGVuY2VDb250ZXh0UmVmKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBcHBsaWNhdGlvbl9QZXJzaXN0ZW5jZVVuaXRSZWYoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInBlcnNpc3RlbmNlLXVuaXQtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEFwcGxpY2F0aW9uX01lc3NhZ2VEZXN0aW5hdGlvbigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBcHBsaWNhdGlvbl9EYXRhU291cmNlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJkYXRhLXNvdXJjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldEFwcGxpY2F0aW9uX0lkKCksIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL01vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbXBsLmphdmEKaW5kZXggNjhiM2JjNC4uOTg0ZjE0ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL01vZHVsZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTW9kdWxlSW1wbC5qYXZhCkBAIC0xMDksNyArMTA5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgV2ViIHdlYiA9IG51bGw7CisJcHJvdGVjdGVkIFdlYiB3ZWI7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx0RGQoKSA8ZW0+QWx0IERkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNjUsNiArMTY1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTU9EVUxFOwogCX0KQEAgLTMzNSw2ICszMzYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1dFQjoKQEAgLTM0OCw2ICszNTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0NPTk5FQ1RPUjoKQEAgLTM3MSw2ICszNzQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19DT05ORUNUT1I6CkBAIC00MDAsNiArNDA0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQ09OTkVDVE9SOgpAQCAtNDI5LDYgKzQzNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0NPTk5FQ1RPUjoKQEAgLTQ1Miw2ICs0NTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKQEAgLTQ3MSw4ICs0NzgsNiBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgdmFsdWUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKIAl9CiAJcHVibGljIGJvb2xlYW4gaXNDb25uZWN0b3JNb2R1bGUoKSB7CiAJCWlmIChlSXNTZXQoQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQ09OTkVDVE9SKSkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViSW1wbC5qYXZhCmluZGV4IDdlOTExYzcuLjNkZWQzMjEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkltcGwuamF2YQpAQCAtMTExLDYgKzExMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLldFQjsKIAl9CkBAIC0xODMsNiArMTg0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX19XRUJfVVJJOgpAQCAtMjAwLDYgKzIwMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfX1dFQl9VUkk6CkBAIC0yMjAsNiArMjIzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9fV0VCX1VSSToKQEAgLTI0MCw2ICsyNDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX19XRUJfVVJJOgpAQCAtMjU3LDYgKzI2Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9tZXRhZGF0YS9BcHBsaWNhdGlvblBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvbWV0YWRhdGEvQXBwbGljYXRpb25QYWNrYWdlLmphdmEKaW5kZXggYjUwYzBiMi4uN2QzMjYwOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9tZXRhZGF0YS9BcHBsaWNhdGlvblBhY2thZ2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL21ldGFkYXRhL0FwcGxpY2F0aW9uUGFja2FnZS5qYXZhCkBAIC0yOSwyNjYgKzI5LDI0NCBAQAogICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAotICogICAgICAgQCgjKWFwcGxpY2F0aW9uXzUueHNkcwkxLjE3IDA4LzA1LzA1Ci0gKiAgICAgCiAgKiAKLSAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAorICogICAgICAgJElkOiBBcHBsaWNhdGlvblBhY2thZ2UuamF2YSx2IDEuNCAyMDEwLzA1LzE5IDE5OjUzOjExIGNhbmRlcnNvbiBFeHAgJAogICogICAgICAgCisgKiAgICAgCiAgKiAKLSAqIAlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgYXBwbGljYXRpb24gNSBkZXBsb3ltZW50Ci0gKiAJZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAotICogCSJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiIGluIHRoZSBhcHBsaWNhdGlvbidzIGVhciBmaWxlLgotICogCUFsbCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUKLSAqIAl0aGUgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFIG5hbWVzcGFjZToKLSAqIAotICogCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICogCi0gKiAJYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKLSAqIAl1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotICogCi0gKiAJICAgICZsdDthcHBsaWNhdGlvbiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICogCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gKiAJICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAqIAkJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkIgotICogCSAgICAgIHZlcnNpb249IjUiJmd0OwotICogCSAgICAgIC4uLgotICogCSAgICAmbHQ7L2FwcGxpY2F0aW9uJmd0OwotICogCi0gKiAJVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0gKiAJdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotICogCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0gKiAKLSAqIAlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNS54c2QKLSAqIAotICogCQorICogPCFbQ0RBVEFbWworICogICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIGFwcGxpY2F0aW9uIDYgZGVwbG95bWVudAorICogICAgICAgZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAorICogICAgICAgIk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCIgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgZWFyIGZpbGUuCisgKiAgICAgICBBbGwgYXBwbGljYXRpb24gZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlCisgKiAgICAgICB0aGUgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFIG5hbWVzcGFjZToKKyAqICAgICAgIAorICogICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCisgKiAgICAgICAKKyAqICAgICAgIGFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5CisgKiAgICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgorICogICAgICAgCisgKiAgICAgICA8YXBwbGljYXRpb24geG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKKyAqICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgKiAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSAKKyAqICAgICAgIAlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNi54c2QiCisgKiAgICAgICB2ZXJzaW9uPSI2Ij4KKyAqICAgICAgIC4uLgorICogICAgICAgPC9hcHBsaWNhdGlvbj4KKyAqICAgICAgIAorICogICAgICAgVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCisgKiAgICAgICB0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKYXZhIEVFCisgKiAgICAgICBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgorICogICAgICAgCisgKiAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNi54c2QKKyAqICAgICAgIAorICogXV0+CiAgKiAgICAgCiAgKiAKICAqIAogICogICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQogICogICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotICogCisgKiAgICAgICAKICAqICAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKLSAqIAlzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAotICogCXN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotICogCXRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKLSAqIAlzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQotICogCUpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCi0gKiAJcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCi0gKiAJbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCi0gKiAKLSAqICAgICAKLSAqIAotICogICAgICAgQCgjKWphdmFlZV81LnhzZHMJMS42NSAwNi8wMi8xNworICogICAgICAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKKyAqICAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgorICogICAgICAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQorICogICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKKyAqICAgICAgIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCisgKiAgICAgICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKKyAqICAgICAgIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgorICogICAgICAgCiAgKiAgICAgCiAgKiAKICAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKKyAqICAgICAgICRJZDogQXBwbGljYXRpb25QYWNrYWdlLmphdmEsdiAxLjQgMjAxMC8wNS8xOSAxOTo1MzoxMSBjYW5kZXJzb24gRXhwICQKKyAqICAgICAgIAogICogICAgIAogICogCiAgKiAKLSAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgdGhhdCBhcHBlYXIgaW4gdGhlIGNvbW1vbgotICogc2hhcmVhYmxlIHNjaGVtYShzKSBvZiBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCi0gKiBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnRleHQgdGhleSBhcmUgaW5jbHVkZWQ6Ci0gKiAKLSAqIERlcGxveW1lbnQgQ29tcG9uZW50IG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBqMmVlIGFwcGxpY2F0aW9uOwotICogICAgIGFwcGxpY2F0aW9uIGNsaWVudDsKLSAqICAgICB3ZWIgYXBwbGljYXRpb247Ci0gKiAgICAgZW50ZXJwcmlzZSBiZWFuOwotICogICAgIHJlc291cmNlIGFkYXB0ZXI7Ci0gKiAKLSAqIERlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgZWFyIGZpbGU7Ci0gKiAgICAgd2FyIGZpbGU7Ci0gKiAgICAgamFyIGZpbGU7Ci0gKiAgICAgcmFyIGZpbGU7Ci0gKiAKLSAqIAotICogCi0gKiAgICAgICBAKCMpamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZHMJMS4xOSAwMi8xMy8wNgorICogICAgICAgVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCisgKiAgICAgICBzaGFyZWFibGUgc2NoZW1hKHMpIG9mIEphdmEgRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKKyAqICAgICAgIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKKyAqICAgICAgIAorICogICAgICAgRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogICAgICAgamF2YSBlZSBhcHBsaWNhdGlvbjsKKyAqICAgICAgIGFwcGxpY2F0aW9uIGNsaWVudDsKKyAqICAgICAgIHdlYiBhcHBsaWNhdGlvbjsKKyAqICAgICAgIGVudGVycHJpc2UgYmVhbjsKKyAqICAgICAgIHJlc291cmNlIGFkYXB0ZXI7IAorICogICAgICAgCisgKiAgICAgICBEZXBsb3ltZW50IEZpbGUgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogICAgICAgZWFyIGZpbGU7CisgKiAgICAgICB3YXIgZmlsZTsKKyAqICAgICAgIGphciBmaWxlOworICogICAgICAgcmFyIGZpbGU7CisgKiAgICAgICAKICAqICAgICAKICAqIAogICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAorICogICAgICAgJElkOiBBcHBsaWNhdGlvblBhY2thZ2UuamF2YSx2IDEuNCAyMDEwLzA1LzE5IDE5OjUzOjExIGNhbmRlcnNvbiBFeHAgJAorICogICAgICAgCiAgKiAgICAgCiAgKiAKICAqIAogICogICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLSAqIAorICogICAgICAgCiAgKiAgICAgCiAgKiAKLSAqICAgIFNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCBhbmQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZXNwYWNlLgorICogICAgPGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgKiAgICAgPGgxPkFib3V0IHRoZSBYTUwgbmFtZXNwYWNlPC9oMT4KICAqIAotICogICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCi0gKiAgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgCi0gKiAKLSAqICAgICBOb3RlIHRoYXQgbG9jYWwgbmFtZXMgaW4gdGhpcyBuYW1lc3BhY2UgYXJlIGludGVuZGVkIHRvIGJlIGRlZmluZWQKLSAqICAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUKLSAqICAgICBmb2xsb3dpbmcgbmFtZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFuZCBzaG91bGQKLSAqICAgICBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZyBHcm91cCwKLSAqICAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZToKLSAqIAotICogICAgIGJhc2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkKLSAqICAgICAgICAgIHJlbGF0aXZlIFVSSXMgaW4gdGhlIHNjb3BlIG9mIHRoZSBlbGVtZW50IG9uIHdoaWNoIGl0Ci0gKiAgICAgICAgICBhcHBlYXJzOyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBpZCAgIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4KLSAqICAgICAgICAgIFRoZSB4bWw6aWQgc3BlY2lmaWNhdGlvbiBpcyBub3QgeWV0IGEgVzNDIFJlY29tbWVuZGF0aW9uLAotICogICAgICAgICAgYnV0IHRoaXMgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGhlcmUgdG8gZmFjaWxpdGF0ZSBleHBlcmltZW50YXRpb24KLSAqICAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQKLSAqICAgICAgICAgIGluIHRoZSBzcGVjaWFsQXR0cnMgYXR0cmlidXRlIGdyb3VwLgotICogCi0gKiAgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgotICogICAgICAgICAgYW55IGVsZW1lbnQ7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCisgKiAgICAgICBzdWl0YWJsZSBmb3IgaW1wb3J0IGJ5IG90aGVyIHNjaGVtYSBkb2N1bWVudHMuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwiPgorICogICAgICAgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWw8L2E+IGFuZAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCI+CisgKiAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sPC9hPiBmb3IgaW5mb3JtYXRpb24gCisgKiAgICAgICBhYm91dCB0aGlzIG5hbWVzcGFjZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIE5vdGUgdGhhdCBsb2NhbCBuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgaW50ZW5kZWQgdG8gYmUKKyAqICAgICAgIGRlZmluZWQgb25seSBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBvciBpdHMgc3ViZ3JvdXBzLgorICogICAgICAgVGhlIG5hbWVzIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBsaXN0ZWQgYmVsb3cuCisgKiAgICAgICBUaGV5IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZworICogICAgICAgR3JvdXAsIHNwZWNpZmljYXRpb24sIG9yIGRvY3VtZW50IGluc3RhbmNlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPiAgIAorICogICAgICAgU2VlIGZ1cnRoZXIgYmVsb3cgaW4gdGhpcyBkb2N1bWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8YSBocmVmPSIjdXNhZ2UiPmhvdyB0byByZWZlciB0byB0aGlzIHNjaGVtYSBkb2N1bWVudCBmcm9tIHlvdXIgb3duCisgKiAgICAgICBYU0Qgc2NoZW1hIGRvY3VtZW50czwvYT4gYW5kIGFib3V0IDxhIGhyZWY9IiNuc3ZlcnNpb25pbmciPnRoZQorICogICAgICAgbmFtZXNwYWNlLXZlcnNpb25pbmcgcG9saWN5IGdvdmVybmluZyB0aGlzIHNjaGVtYSBkb2N1bWVudDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgogICogICAKLSAqICAgICBzcGFjZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZQotICogICAgICAgICAgdmFsdWUgaXMgYSBrZXl3b3JkIGluZGljYXRpbmcgd2hhdCB3aGl0ZXNwYWNlIHByb2Nlc3NpbmcKLSAqICAgICAgICAgIGRpc2NpcGxpbmUgaXMgaW50ZW5kZWQgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50OyBpdHMKLSAqICAgICAgICAgIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSB2aXJ0dWUgb2YgaXRzCi0gKiAgICAgICAgICBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KICAqIAotICogICAgIEZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTogZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKLSAqICAgICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKLSAqICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCi0gKiAgICAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKKyAqICAgIDxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgCisgKiAgICAgPGgzPkZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTwvaDM+IAogICogCi0gKiAgICAgICAgICAgICAgSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZCBkZWRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mIEZlYnJ1YXJ5LCAyMDAwCi0gKiAgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZQotICogICAgICAgICAgICAgIHhtbDpGYXRoZXIKKyAqICAgICA8ZGl2IGNsYXNzPSJib2R5dGV4dCI+CisgKiAgICAgIDxwPgorICogICAgICAgZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKKyAqICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKKyAqICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCisgKiAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKKyAqICAgICAgPC9wPgorICogICAgICA8YmxvY2txdW90ZT4KKyAqICAgICAgICA8cD4KKyAqIAlJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kCisgKiAJZGVkaWNhdGlvbiB0aGUgVzNDIFhNTCBQbGVuYXJ5IG9uIHRoaXMgMTB0aCBkYXkgb2YKKyAqIAlGZWJydWFyeSwgMjAwMCwgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5CisgKiAJdGhlIFhNTCBuYW1lICJ4bWw6RmF0aGVyIi4KKyAqICAgICAgICA8L3A+CisgKiAgICAgIDwvYmxvY2txdW90ZT4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgogICogICAKLSAqIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwCi0gKiAgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkKLSAqICAgICAgICAgc2NoZW1hcyB3aXNoaW5nIHRvIGFsbG93IHhtbDpiYXNlLCB4bWw6bGFuZywgeG1sOnNwYWNlIG9yIHhtbDppZAotICogICAgICAgICBhdHRyaWJ1dGVzIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgogICogCi0gKiAgICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCi0gKiAgICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgotICogICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gKiAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLyZndDsKKyAqICAgIDxkaXYgaWQ9InVzYWdlIiB4bWw6aWQ9InVzYWdlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgKiAgICAgPGgyPgorICogICAgICAgPGEgbmFtZT0idXNhZ2UiPkFib3V0IHRoaXMgc2NoZW1hIGRvY3VtZW50PC9hPgorICogICAgIDwvaDI+CiAgKiAKLSAqICAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcwotICogICAgICAgICBvciB0aGUgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwIHN1aXRhYmxlCisgKiAgICAgICBmb3IgdXNlIGJ5IHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyA8Y29kZT54bWw6YmFzZTwvY29kZT4sCisgKiAgICAgICA8Y29kZT54bWw6bGFuZzwvY29kZT4sIDxjb2RlPnhtbDpzcGFjZTwvY29kZT4gb3IKKyAqICAgICAgIDxjb2RlPnhtbDppZDwvY29kZT4gYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hIGZvcgorICogICAgICAgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKKyAqICAgICAgPC9wPgorICogICAgICA8cHJlPgorICogICAgICAgICAgICZsdDtzY2hlbWEgLiAuIC4mZ3Q7CisgKiAgICAgICAgICAgIC4gLiAuCisgKiAgICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICBvcgorICogICAgICA8L3A+CisgKiAgICAgIDxwcmU+CisgKiAgICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZCIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzIG9yIHRoZQorICogICAgICAgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHByZT4KKyAqICAgICAgICAgICAmbHQ7dHlwZSAuIC4gLiZndDsKKyAqICAgICAgICAgICAgLiAuIC4KKyAqICAgICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UgZWxlbWVudAorICogICAgICAgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlcy4KKyAqICAgICAgPC9wPgorICogICAgIDwvZGl2PgorICogICAgPC9kaXY+CisgKiAgIAogICogCi0gKiAgICAgICAgICZsdDt0eXBlIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLyZndDsKLSAqICAKLSAqICAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICogICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzCi0gKiBJbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gKiAgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkLgotICogICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAqICAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gKiAgICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gKiAgICBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwKLSAqICAgIFNjaGVtYSBvciBYTUwgbmFtZXNwYWNlcyBjaGFuZ2UsIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCB3aWxsIGNoYW5nZQotICogICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2Qgd2lsbCBub3QgY2hhbmdlLgorICogICAgPGRpdiBpZD0ibnN2ZXJzaW9uaW5nIiB4bWw6aWQ9Im5zdmVyc2lvbmluZyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgIDxoMj4KKyAqICAgICAgIDxhIG5hbWU9Im5zdmVyc2lvbmluZyI+VmVyc2lvbmluZyBwb2xpY3kgZm9yIHRoaXMgc2NoZW1hIGRvY3VtZW50PC9hPgorICogICAgIDwvaDI+CisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIEluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKKyAqICAgICAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0CisgKiAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QiPgorICogICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Q8L2E+LgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKKyAqICAgICAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTAorICogICAgICAgU2NoZW1hIGl0c2VsZiwgb3Igd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywKKyAqICAgICAgIGlmIHRoZSBYTUwgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcworICogICAgICAgZG9jdW1lbnQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QgCisgKiAgICAgICA8L2E+IAorICogICAgICAgd2lsbCBjaGFuZ2UgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0IAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QgCisgKiAgICAgICA8L2E+IAorICogICAgICAgd2lsbCBub3QgY2hhbmdlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgUHJldmlvdXMgZGF0ZWQgKGFuZCB1bmNoYW5naW5nKSB2ZXJzaW9ucyBvZiB0aGlzIHNjaGVtYSAKKyAqICAgICAgIGRvY3VtZW50IGFyZSBhdDoKKyAqICAgICAgPC9wPgorICogICAgICA8dWw+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwNy8wOC94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA3LzA4L3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8xMC94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA0LzEwL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgIDwvdWw+CisgKiAgICAgPC9kaXY+CisgKiAgICA8L2Rpdj4KICAqICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5CkBAIC0zMDYsOSArMjg0LDExIEBACiAJLyoqCiAJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoZSBwYWNrYWdlIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBKYXZhIEVFIDUgYW5kIEphdmEgRUUgNiB4c2RzLCBzaW5jZSBpdCBpcyB1c2VkIGZvciBib3RoCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICovCiAJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBlTlNfVVJJMiA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNi54c2QiOyAvLyROT04tTkxTLTEkCiAKIAkvKioKIAkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KQEAgLTMzNywxMyArMzE3LDIyIEBACiAJaW50IEFQUExJQ0FUSU9OID0gMDsKIAogCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVBQTElDQVRJT05fX0FQUExJQ0FUSU9OX05BTUUgPSAwOworCisJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgQVBQTElDQVRJT05fX0RFU0NSSVBUSU9OUyA9IDA7CisJaW50IEFQUExJQ0FUSU9OX19ERVNDUklQVElPTlMgPSAxOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMzUyLDcgKzM0MSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IEFQUExJQ0FUSU9OX19ESVNQTEFZX05BTUVTID0gMTsKKwlpbnQgQVBQTElDQVRJT05fX0RJU1BMQVlfTkFNRVMgPSAyOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTM2MSw3ICszNTAsMTYgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgQVBQTElDQVRJT05fX0lDT05TID0gMjsKKwlpbnQgQVBQTElDQVRJT05fX0lDT05TID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsaXplIEluIE9yZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVBQTElDQVRJT05fX0lOSVRJQUxJWkVfSU5fT1JERVIgPSA0OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMzcwLDcgKzM2OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IEFQUExJQ0FUSU9OX19NT0RVTEVTID0gMzsKKwlpbnQgQVBQTElDQVRJT05fX01PRFVMRVMgPSA1OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTM3OSw3ICszNzcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBBUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVMgPSA0OworCWludCBBUFBMSUNBVElPTl9fU0VDVVJJVFlfUk9MRVMgPSA2OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpYnJhcnkgRGlyZWN0b3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0zODgsNyArMzg2LDEwNiBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBBUFBMSUNBVElPTl9fTElCUkFSWV9ESVJFQ1RPUlkgPSA1OworCWludCBBUFBMSUNBVElPTl9fTElCUkFSWV9ESVJFQ1RPUlkgPSA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVBQTElDQVRJT05fX0VOVl9FTlRSWSA9IDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIFJlZjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVBQTElDQVRJT05fX0VKQl9SRUYgPSA5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWY8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFQUExJQ0FUSU9OX19FSkJfTE9DQUxfUkVGID0gMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBUFBMSUNBVElPTl9fU0VSVklDRV9SRUZTID0gMTE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBUFBMSUNBVElPTl9fUkVTT1VSQ0VfUkVGID0gMTI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVBQTElDQVRJT05fX1JFU09VUkNFX0VOVl9SRUYgPSAxMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVBQTElDQVRJT05fX01FU1NBR0VfREVTVElOQVRJT05fUkVGID0gMTQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFQUExJQ0FUSU9OX19QRVJTSVNURU5DRV9DT05URVhUX1JFRiA9IDE1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBUFBMSUNBVElPTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUYgPSAxNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBUFBMSUNBVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTiA9IDE3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGEgU291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBUFBMSUNBVElPTl9fREFUQV9TT1VSQ0UgPSAxODsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMzk3LDcgKzQ5NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IEFQUExJQ0FUSU9OX19JRCA9IDY7CisJaW50IEFQUExJQ0FUSU9OX19JRCA9IDE5OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTQwNiw3ICs1MDMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBBUFBMSUNBVElPTl9fVkVSU0lPTiA9IDc7CisJaW50IEFQUExJQ0FUSU9OX19WRVJTSU9OID0gMjA7CiAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXBwbGljYXRpb248L2VtPicgY2xhc3MuCkBAIC00MTUsNyArNTEyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgQVBQTElDQVRJT05fRkVBVFVSRV9DT1VOVCA9IDg7CisJaW50IEFQUExJQ0FUSU9OX0ZFQVRVUkVfQ09VTlQgPSAyMTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3JJbXBsIDxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgpAQCAtNjAzLDYgKzcwMCwxNyBAQAogCUVDbGFzcyBnZXRBcHBsaWNhdGlvbigpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldEFwcGxpY2F0aW9uTmFtZSA8ZW0+QXBwbGljYXRpb24gTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFwcGxpY2F0aW9uIE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldEFwcGxpY2F0aW9uTmFtZSgpCisJICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uX0FwcGxpY2F0aW9uTmFtZSgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC02MzYsNiArNzQ0LDE3IEBACiAJRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9JY29ucygpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldEluaXRpYWxpemVJbk9yZGVyIDxlbT5Jbml0aWFsaXplIEluIE9yZGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5pdGlhbGl6ZSBJbiBPcmRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0SW5pdGlhbGl6ZUluT3JkZXIoKQorCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbl9Jbml0aWFsaXplSW5PcmRlcigpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0TW9kdWxlcyA8ZW0+TW9kdWxlczwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTY2OSw2ICs3ODgsMTI3IEBACiAJRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbl9MaWJyYXJ5RGlyZWN0b3J5KCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRFbnZFbnRyeSA8ZW0+RW52IEVudHJ5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnYgRW50cnk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldEVudkVudHJ5KCkKKwkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fRW52RW50cnkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldEVqYlJlZiA8ZW0+RWpiIFJlZjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWpiIFJlZjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0RWpiUmVmKCkKKwkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fRWpiUmVmKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRFamJMb2NhbFJlZiA8ZW0+RWpiIExvY2FsIFJlZjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWpiIExvY2FsIFJlZjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0RWpiTG9jYWxSZWYoKQorCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbl9FamJMb2NhbFJlZigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0U2VydmljZVJlZnMgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmljZSBSZWZzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRTZXJ2aWNlUmVmcygpCisJICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX1NlcnZpY2VSZWZzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRSZXNvdXJjZVJlZiA8ZW0+UmVzb3VyY2UgUmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFJlc291cmNlUmVmKCkKKwkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fUmVzb3VyY2VSZWYoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldFJlc291cmNlRW52UmVmIDxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBFbnYgUmVmPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRSZXNvdXJjZUVudlJlZigpCisJICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX1Jlc291cmNlRW52UmVmKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkKKwkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fTWVzc2FnZURlc3RpbmF0aW9uUmVmKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCkKKwkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fUGVyc2lzdGVuY2VDb250ZXh0UmVmKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRQZXJzaXN0ZW5jZVVuaXRSZWYgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCkKKwkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fUGVyc2lzdGVuY2VVbml0UmVmKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXRNZXNzYWdlRGVzdGluYXRpb24gPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldE1lc3NhZ2VEZXN0aW5hdGlvbigpCisJICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uX01lc3NhZ2VEZXN0aW5hdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24jZ2V0RGF0YVNvdXJjZSA8ZW0+RGF0YSBTb3VyY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRhdGEgU291cmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiNnZXREYXRhU291cmNlKCkKKwkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25fRGF0YVNvdXJjZSgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uI2dldElkIDxlbT5JZDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTg5Niw2ICsxMTM2LDE0IEBACiAJCUVDbGFzcyBBUFBMSUNBVElPTiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbigpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXBwbGljYXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEFQUExJQ0FUSU9OX19BUFBMSUNBVElPTl9OQU1FID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX0FwcGxpY2F0aW9uTmFtZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTkyMCw2ICsxMTY4LDE0IEBACiAJCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fX0lDT05TID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX0ljb25zKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0aWFsaXplIEluIE9yZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQVBQTElDQVRJT05fX0lOSVRJQUxJWkVfSU5fT1JERVIgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fSW5pdGlhbGl6ZUluT3JkZXIoKTsKKworCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtOTQ0LDYgKzEyMDAsOTQgQEAKIAkJRUF0dHJpYnV0ZSBBUFBMSUNBVElPTl9fTElCUkFSWV9ESVJFQ1RPUlkgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fTGlicmFyeURpcmVjdG9yeSgpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJ5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9fRU5WX0VOVFJZID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX0VudkVudHJ5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9fRUpCX1JFRiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbl9FamJSZWYoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWY8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX19FSkJfTE9DQUxfUkVGID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX0VqYkxvY2FsUmVmKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX19TRVJWSUNFX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fU2VydmljZVJlZnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fX1JFU09VUkNFX1JFRiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbl9SZXNvdXJjZVJlZigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fX1JFU09VUkNFX0VOVl9SRUYgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fUmVzb3VyY2VFbnZSZWYoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBBUFBMSUNBVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUYgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fTWVzc2FnZURlc3RpbmF0aW9uUmVmKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQVBQTElDQVRJT05fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX1BlcnNpc3RlbmNlQ29udGV4dFJlZigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWY8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX19QRVJTSVNURU5DRV9VTklUX1JFRiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbl9QZXJzaXN0ZW5jZVVuaXRSZWYoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX19NRVNTQUdFX0RFU1RJTkFUSU9OID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX01lc3NhZ2VEZXN0aW5hdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBTb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX19EQVRBX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbl9EYXRhU291cmNlKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggZjViNDMyYy4uODFlMzJhMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC01OCw2ICs1OCw3IEBACiAJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKIAkJCXJldHVybiB0cnVlOwpAQCAtNjksMjYgKzcwLDMxIEBACiAJfQogCiAJLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCisJICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByb3RlY3RlZCBBcHBsaWNhdGlvblN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBBcHBsaWNhdGlvblN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIG9iamVjdCkgeworCXByb3RlY3RlZCBBcHBsaWNhdGlvblN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9CisJCW5ldyBBcHBsaWNhdGlvblN3aXRjaDxBZGFwdGVyPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IoQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IoQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvckFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZShNb2R1bGUgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVNb2R1bGVBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWIoV2ViIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlV2ViKFdlYiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlV2ViQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwogCQkJfQogCQl9OwpAQCAtMTAxLDggKzEwNyw5IEBACiAJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKIAl9CiAKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmluZGV4IGE0NzFhYmYuLjdhNzZkMzMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7CiAJCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBBcHBsaWNhdGlvblJlc291cmNlSW1wbCh1cmkpOwogCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25SZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblJlc291cmNlSW1wbC5qYXZhCmluZGV4IDYyNzdmNmMuLjJhMmEyYjMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblJlc291cmNlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvblJlc291cmNlSW1wbC5qYXZhCkBAIC0zOSwxNyArMzksMTkgQEAKIAlwdWJsaWMgQXBwbGljYXRpb25SZXNvdXJjZUltcGwoVVJJIHVyaSkgewogCQlzdXBlcih1cmkpOwogCX0KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgWE1MTG9hZCBjcmVhdGVYTUxMb2FkKCkgewogCQkgcmV0dXJuIG5ldyBKRUVYTUxMb2FkSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7CiAJfQogCiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7CiAJCQogCQlyZXR1cm4gbmV3IEVhclhNTEhlbHBlckltcGwodGhpcyk7CiAJfQogCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwudXRpbC5JQXBwbGljYXRpb25SZXNvdXJjZSNnZXRSb290T2JqZWN0KCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uSUFwcGxpY2F0aW9uUmVzb3VyY2UjZ2V0Um9vdE9iamVjdCgpCiAJICovCiAJcHVibGljIEVPYmplY3QgZ2V0Um9vdE9iamVjdCgpIHsKIAkJaWYgKGNvbnRlbnRzID09IG51bGwgfHwgY29udGVudHMuaXNFbXB0eSgpKQpAQCAtNjEsNyArNjMsNyBAQAogCQlyZXR1cm4gKEVPYmplY3QpKChBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKXJvb3QpLmdldEFwcGxpY2F0aW9uKCk7CiAJfQogCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwudXRpbC5JQXBwbGljYXRpb25SZXNvdXJjZSNnZXRBcHBsaWNhdGlvbigpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLklBcHBsaWNhdGlvblJlc291cmNlI2dldEFwcGxpY2F0aW9uKCkKIAkgKi8KIAlwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKSB7CiAJCXJldHVybiAoQXBwbGljYXRpb24pZ2V0Um9vdE9iamVjdCgpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25Td2l0Y2guamF2YQppbmRleCA5MTU4MTcyLi5iODlmYmQ1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25Td2l0Y2guamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25Td2l0Y2guamF2YQpAQCAtMzIsNyArMzIsNyBAQAogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZQogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25Td2l0Y2ggeworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uU3dpdGNoPFQ+IHsKIAkvKioKIAkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjAsNyArNjAsNyBAQAogCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CiAJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKIAl9CiAKQEAgLTcxLDE2ICs3MSwxNiBAQAogCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CiAJCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewogCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7CiAJCX0KIAkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKIAkJCXJldHVybgogCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CiAJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwogCQl9CiAJfQogCkBAIC05MSwyOSArOTEsMjkgQEAKIAkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCXByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewogCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT046IHsKIAkJCQlBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IChBcHBsaWNhdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXBwbGljYXRpb24oYXBwbGljYXRpb24pOworCQkJCVQgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9ERVBMT1lNRU5UX0RFU0NSSVBUT1I6IHsKIAkJCQlBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yIGFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IgPSAoQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcihhcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKGFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3IpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRTogewogCQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNb2R1bGUobW9kdWxlKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VNb2R1bGUobW9kdWxlKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUI6IHsKIAkJCQlXZWIgd2ViID0gKFdlYil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2ViKHdlYik7CisJCQkJVCByZXN1bHQgPSBjYXNlV2ViKHdlYik7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQpAQCAtMTIyLDc3ICsxMjIsNzcgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb248L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb248L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb248L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb248L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25EZXBsb3ltZW50RGVzY3JpcHRvcihBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uRGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2R1bGU8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TW9kdWxlPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1vZHVsZTwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Nb2R1bGU8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1vZHVsZShNb2R1bGUgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZU1vZHVsZShNb2R1bGUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWI8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYjwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWI8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlYihXZWIgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZVdlYihXZWIgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCXB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uWE1MUHJvY2Vzc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25YTUxQcm9jZXNzb3IuamF2YQppbmRleCAyZjU0ODY3Li41MTg1NmY4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25YTUxQcm9jZXNzb3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25YTUxQcm9jZXNzb3IuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkudXRpbC5YTUxQcm9jZXNzb3I7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZTsKQEAgLTQyLDcgKzQzLDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJvdGVjdGVkIE1hcCBnZXRSZWdpc3RyYXRpb25zKCkgeworCUBPdmVycmlkZQorCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBSZXNvdXJjZS5GYWN0b3J5PiBnZXRSZWdpc3RyYXRpb25zKCkgewogCQlpZiAocmVnaXN0cmF0aW9ucyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRSZWdpc3RyYXRpb25zKCk7CiAJCQlyZWdpc3RyYXRpb25zLnB1dChYTUxfRVhURU5TSU9OLCBuZXcgQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0VhclhNTEhlbHBlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9FYXJYTUxIZWxwZXJJbXBsLmphdmEKaW5kZXggZmYzYmVmOS4uZjIzNDE1ZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL0VhclhNTEhlbHBlckltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvRWFyWE1MSGVscGVySW1wbC5qYXZhCkBAIC0xOSwxNyArMTksMTggQEAKIAogCXB1YmxpYyBFYXJYTUxIZWxwZXJJbXBsKFhNTFJlc291cmNlIHJlc291cmNlKSB7CiAJCXN1cGVyKHJlc291cmNlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCiAJfQogCiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRVUkkoU3RyaW5nIHByZWZpeCkgewotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscygiIikpCisJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAogCQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJOwogCQllbHNlCiAJCQlyZXR1cm4gc3VwZXIuZ2V0VVJJKHByZWZpeCk7CiAJfQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0UU5hbWUoRVBhY2thZ2UgZVBhY2thZ2UsIFN0cmluZyBuYW1lLCBib29sZWFuIG11c3RIYXZlUHJlZml4KQogCSAgewogCSAgIFN0cmluZyBuc1ByZWZpeCA9IGdldFByZWZpeChlUGFja2FnZSwgbXVzdEhhdmVQcmVmaXgpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9BcHBsaWNhdGlvbkNsaWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9BcHBsaWNhdGlvbkNsaWVudC5qYXZhCmluZGV4IGVjOWM5YmUuLjZiMTJkODUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvQXBwbGljYXRpb25DbGllbnQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50LmphdmEKQEAgLTEyLDcgKzEyLDIwIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWY7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTIyLDYgKzM1LDcgQEAKICAqIDxwPgogICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgogICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0TW9kdWxlTmFtZSA8ZW0+TW9kdWxlIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+CkBAIC0zNiw2ICs1MCw3IEBACiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldENhbGxiYWNrSGFuZGxlciA8ZW0+Q2FsbGJhY2sgSGFuZGxlcjwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRNZXNzYWdlRGVzdGluYXRpb25zIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXREYXRhU291cmNlIDxlbT5EYXRhIFNvdXJjZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KQEAgLTQ4LDYgKzYzLDMyIEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25DbGllbnQgZXh0ZW5kcyBKYXZhRUVPYmplY3QgewogCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZHVsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBBcHBsaWNhdGlvbiBDbGllbnQgNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxlIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1vZHVsZU5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfTW9kdWxlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRNb2R1bGVOYW1lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1vZHVsZU5hbWUgPGVtPk1vZHVsZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2R1bGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TW9kdWxlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TW9kdWxlTmFtZShTdHJpbmcgdmFsdWUpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KIAkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjAsNyArMTAxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X0Rlc2NyaXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7CisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTc1LDcgKzExNiw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9EaXNwbGF5TmFtZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOworCUxpc3Q8RGlzcGxheU5hbWU+IGdldERpc3BsYXlOYW1lcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtOTAsNyArMTMxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X0ljb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRJY29ucygpOworCUxpc3Q8SWNvbj4gZ2V0SWNvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEwNSw3ICsxNDYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfRW52RW50cmllcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RW52RW50cmllcygpOworCUxpc3Q8RW52RW50cnk+IGdldEVudkVudHJpZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEyMCw3ICsxNjEsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RWpiUmVmcygpOworCUxpc3Q8RWpiUmVmPiBnZXRFamJSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTM1LDcgKzE3Niw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKKwlMaXN0PFNlcnZpY2VSZWY+IGdldFNlcnZpY2VSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE1MCw3ICsxOTEsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRSZXNvdXJjZVJlZnMoKTsKKwlMaXN0PFJlc291cmNlUmVmPiBnZXRSZXNvdXJjZVJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE2NSw3ICsyMDYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VFbnZSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRSZXNvdXJjZUVudlJlZnMoKTsKKwlMaXN0PFJlc291cmNlRW52UmVmPiBnZXRSZXNvdXJjZUVudlJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xODAsNyArMjIxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKKwlMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvblJlZj4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE5NSw3ICsyMzYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfUGVyc2lzdGVuY2VVbml0UmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpOworCUxpc3Q8UGVyc2lzdGVuY2VVbml0UmVmPiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjEwLDcgKzI1MSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9Qb3N0Q29uc3RydWN0cygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0UG9zdENvbnN0cnVjdHMoKTsKKwlMaXN0PExpZmVjeWNsZUNhbGxiYWNrPiBnZXRQb3N0Q29uc3RydWN0cygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTIyNSw3ICsyNjYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfUHJlRGVzdHJveXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFByZURlc3Ryb3lzKCk7CisJTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gZ2V0UHJlRGVzdHJveXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhbGxiYWNrIEhhbmRsZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTIzNCwxNSArMjc1LDE2IEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgY2FsbGJhY2staGFuZGxlciBlbGVtZW50IG5hbWVzIGEgY2xhc3MgcHJvdmlkZWQgYnkKLQkgKiAJICAgIHRoZSBhcHBsaWNhdGlvbi4gIFRoZSBjbGFzcyBtdXN0IGhhdmUgYSBubyBhcmdzCi0JICogCSAgICBjb25zdHJ1Y3RvciBhbmQgbXVzdCBpbXBsZW1lbnQgdGhlCi0JICogCSAgICBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlcgotCSAqIAkgICAgaW50ZXJmYWNlLiAgVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZQotCSAqIAkgICAgYXBwbGljYXRpb24gY2xpZW50IGNvbnRhaW5lciBhbmQgdXNlZCBieSB0aGUgY29udGFpbmVyCi0JICogCSAgICB0byBjb2xsZWN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIHVzZXIuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIGNhbGxiYWNrLWhhbmRsZXIgZWxlbWVudCBuYW1lcyBhIGNsYXNzIHByb3ZpZGVkIGJ5CisJICogICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uLiAgVGhlIGNsYXNzIG11c3QgaGF2ZSBhIG5vIGFyZ3MKKwkgKiAgICAgICAgICAgICBjb25zdHJ1Y3RvciBhbmQgbXVzdCBpbXBsZW1lbnQgdGhlCisJICogICAgICAgICAgICAgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXIKKwkgKiAgICAgICAgICAgICBpbnRlcmZhY2UuICBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgdGhlCisJICogICAgICAgICAgICAgYXBwbGljYXRpb24gY2xpZW50IGNvbnRhaW5lciBhbmQgdXNlZCBieSB0aGUgY29udGFpbmVyCisJICogICAgICAgICAgICAgdG8gY29sbGVjdCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1c2VyLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEFwcGxpY2F0aW9uIENsaWVudCA1CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxsYmFjayBIYW5kbGVyPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRDYWxsYmFja0hhbmRsZXIoU3RyaW5nKQpAQCAtMjc0LDcgKzMxNiwyMyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpOworCUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uPiBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXRhIFNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBBcHBsaWNhdGlvbiBDbGllbnQgNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBTb3VyY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNnZXRBcHBsaWNhdGlvbkNsaWVudF9EYXRhU291cmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxEYXRhU291cmNlVHlwZT4gZ2V0RGF0YVNvdXJjZSgpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTMwOCwyNSArMzY2LDI2IEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgVGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBkZWZpbmVzIHdoZXRoZXIgdGhpcwotCSAqIAkgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgb3RoZXIgcmVsYXRlZCBkZXBsb3ltZW50Ci0JICogCSAgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbW9kdWxlIChlLmcuLCB3ZWIgc2VydmljZQotCSAqIAkgIGRlc2NyaXB0b3JzKSBhcmUgY29tcGxldGUsIG9yIHdoZXRoZXIgdGhlIGNsYXNzCi0JICogCSAgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCi0JICogCSAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCi0JICogCSAgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgaW5mb3JtYXRpb24uCi0JICogCi0JICogCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQKLQkgKiAJICB0b29sIG11c3QgaWdub3JlIGFueSBhbm5vdGF0aW9ucyB0aGF0IHNwZWNpZnkgZGVwbG95bWVudAotCSAqIAkgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcwotCSAqIAkgIG9mIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiAKLQkgKiAJICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bwotCSAqIAkgICJmYWxzZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcwotCSAqIAkgIGZpbGVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgYW5ub3RhdGlvbnMsIGFzCi0JICogCSAgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKLQkgKiAJCisJICogICAgICAgICAgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoaXMKKwkgKiAgICAgICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCBvdGhlciByZWxhdGVkIGRlcGxveW1lbnQKKwkgKiAgICAgICAgICAgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbW9kdWxlIChlLmcuLCB3ZWIgc2VydmljZQorCSAqICAgICAgICAgICBkZXNjcmlwdG9ycykgYXJlIGNvbXBsZXRlLCBvciB3aGV0aGVyIHRoZSBjbGFzcworCSAqICAgICAgICAgICBmaWxlcyBhdmFpbGFibGUgdG8gdGhpcyBtb2R1bGUgYW5kIHBhY2thZ2VkIHdpdGgKKwkgKiAgICAgICAgICAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCisJICogICAgICAgICAgIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50IGluZm9ybWF0aW9uLgorCSAqICAgICAgICAgICAKKwkgKiAgICAgICAgICAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQKKwkgKiAgICAgICAgICAgdG9vbCBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQKKwkgKiAgICAgICAgICAgaW5mb3JtYXRpb24sIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQgaW4gdGhlIGNsYXNzIGZpbGVzCisJICogICAgICAgICAgIG9mIHRoZSBhcHBsaWNhdGlvbi4KKwkgKiAgICAgICAgICAgCisJICogICAgICAgICAgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgc2V0IHRvCisJICogICAgICAgICAgICJmYWxzZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcworCSAqICAgICAgICAgICBmaWxlcyBvZiB0aGUgYXBwbGljYXRpb24gZm9yIGFubm90YXRpb25zLCBhcworCSAqICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIHNwZWNpZmljYXRpb25zLgorCSAqICAgICAgICAgICAKKwkgKiAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgQXBwbGljYXRpb24gQ2xpZW50IDUKKwkgKiAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkKQEAgLTM3NCwxNSArNDMzLDE1IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjUiPC9jb2RlPi4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iNiI8L2NvZGU+LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyA1LgotCSAqIAotCSAqIAkKKwkgKiAgICAgICAgICAgVGhlIHJlcXVpcmVkIHZhbHVlIGZvciB0aGUgdmVyc2lvbiBpcyA2LgorCSAqICAgICAgICAgICAKKwkgKiAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNpc1NldFZlcnNpb24oKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IuamF2YQppbmRleCBkNjgzODA1Li4zN2VjN2RjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L0FwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IuamF2YQpAQCAtNjUsNyArNjUsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UjZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCU1hcCBnZXRYTUxOU1ByZWZpeE1hcCgpOworCU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KQEAgLTgxLDcgKzgxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlI2dldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKKwlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbiBDbGllbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTkwLDEyICs5MCwxMyBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAlUaGUgYXBwbGljYXRpb24tY2xpZW50IGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbgotCSAqIAlhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uCi0JICogCWNsaWVudCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBFSkIgY29tcG9uZW50cwotCSAqIAlhbmQgZXh0ZXJuYWwgcmVzb3VyY2VzIHJlZmVyZW5jZWQgYnkgdGhlIGFwcGxpY2F0aW9uCi0JICogCWNsaWVudC4KLQkgKiAKKwkgKiAgICAgICAgIFRoZSBhcHBsaWNhdGlvbi1jbGllbnQgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuCisJICogICAgICAgICBhcHBsaWNhdGlvbiBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVGhlIGFwcGxpY2F0aW9uCisJICogICAgICAgICBjbGllbnQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgRUpCIGNvbXBvbmVudHMKKwkgKiAgICAgICAgIGFuZCBleHRlcm5hbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgYXBwbGljYXRpb24KKwkgKiAgICAgICAgIGNsaWVudC4KKwkgKiAgICAgICAgIAorCSAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgQXBwbGljYXRpb24gQ2xpZW50IDUKIAkgKiAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvSUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvSUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UuamF2YQppbmRleCBmNzY0MTg1Li5jYjU0OTA1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L0lBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9JQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZS5qYXZhCkBAIC0xLDMgKzEsMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKQEAgLTEwLDcgKzIwLDcgQEAKIAlwdWJsaWMgYWJzdHJhY3QgRU9iamVjdCBnZXRSb290T2JqZWN0KCk7CiAKIAkvKioKLQkgKiBSZXR1cm4gdGhlIGVhcgorCSAqIFJldHVybiB0aGUgQXBwbGljYXRpb25DbGllbnQKIAkgKi8KIAlwdWJsaWMgYWJzdHJhY3QgQXBwbGljYXRpb25DbGllbnQgZ2V0QXBwbGljYXRpb25DbGllbnQoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YQppbmRleCA4OGMwZThhLi44MzAxODhmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YQpAQCAtNTksNyArNTksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIG1peGVkID0gbnVsbDsKKwlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBtaXhlZDsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhNTE5TUHJlZml4TWFwKCkgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nIG1hcC4KQEAgLTY5LDcgKzY5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4TUxOU1ByZWZpeE1hcCA9IG51bGw7CisJcHJvdGVjdGVkIEVNYXA8U3RyaW5nLCBTdHJpbmc+IHhNTE5TUHJlZml4TWFwOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScgbWFwLgpAQCAtNzksNyArNzksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTWFwIHhTSVNjaGVtYUxvY2F0aW9uID0gbnVsbDsKKwlwcm90ZWN0ZWQgRU1hcDxTdHJpbmcsIFN0cmluZz4geFNJU2NoZW1hTG9jYXRpb247CiAKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtOTUsNiArOTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5MaXRlcmFscy5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SOwogCX0KQEAgLTExNiw5ICsxMTcsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTWFwIGdldFhNTE5TUHJlZml4TWFwKCkgeworCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhNTE5TUHJlZml4TWFwKCkgewogCQlpZiAoeE1MTlNQcmVmaXhNYXAgPT0gbnVsbCkgewotCQkJeE1MTlNQcmVmaXhNYXAgPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HX1RPX1NUUklOR19NQVBfRU5UUlksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVApOworCQkJeE1MTlNQcmVmaXhNYXAgPSBuZXcgRWNvcmVFTWFwPFN0cmluZyxTdHJpbmc+KEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HX1RPX1NUUklOR19NQVBfRU5UUlksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVApOwogCQl9CiAJCXJldHVybiB4TUxOU1ByZWZpeE1hcC5tYXAoKTsKIAl9CkBAIC0xMjgsOSArMTI5LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKKwlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKIAkJaWYgKHhTSVNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKLQkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKKwkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcDxTdHJpbmcsU3RyaW5nPihFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKIAkJfQogCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb24ubWFwKCk7CiAJfQpAQCAtMTY3LDE0ICsxNjgsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikoKEVNYXAuSW50ZXJuYWxNYXBWaWV3PFN0cmluZywgU3RyaW5nPilnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0NMSUVOVDoKIAkJCQlyZXR1cm4gYmFzaWNTZXRBcHBsaWNhdGlvbkNsaWVudChudWxsLCBtc2dzKTsKIAkJfQpAQCAtMTg2LDE2ICsxODgsMTcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6CiAJCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0TWl4ZWQoKTsKIAkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmdldFdyYXBwZXIoKTsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCk7CisJCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpOwogCQkJCWVsc2UgcmV0dXJuIGdldFhNTE5TUHJlZml4TWFwKCk7CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpOworCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKTsKIAkJCQllbHNlIHJldHVybiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fQ0xJRU5UOgogCQkJCXJldHVybiBnZXRBcHBsaWNhdGlvbkNsaWVudCgpOwpAQCAtMjA4LDE2ICsyMTEsMTcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgogCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQobmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZykoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKKwkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKSgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7CisJCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZykoKEVNYXAuSW50ZXJuYWxNYXBWaWV3PFN0cmluZywgU3RyaW5nPilnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fQ0xJRU5UOgogCQkJCXNldEFwcGxpY2F0aW9uQ2xpZW50KChBcHBsaWNhdGlvbkNsaWVudCluZXdWYWx1ZSk7CkBAIC0yMzEsNiArMjM1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgpAQCAtMjU0LDYgKzI1OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKQEAgLTI3Myw2ICsyNzksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudEltcGwuamF2YQppbmRleCA4YjJiNTdjLi5kYzFhNTZmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50SW1wbC5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWY7CkBAIC01MSw2ICs1Miw3IEBACiAgKiA8cD4KICAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgogICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwjZ2V0TW9kdWxlTmFtZSA8ZW0+TW9kdWxlIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+CkBAIC02NSw2ICs2Nyw3IEBACiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnRJbXBsI2dldENhbGxiYWNrSGFuZGxlciA8ZW0+Q2FsbGJhY2sgSGFuZGxlcjwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25zIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXREYXRhU291cmNlIDxlbT5EYXRhIFNvdXJjZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudEltcGwjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uQ2xpZW50SW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KQEAgLTc1LDYgKzc4LDI2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNsaWVudEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uQ2xpZW50IHsKIAkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kdWxlTmFtZSgpIDxlbT5Nb2R1bGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TW9kdWxlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX05BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9kdWxlTmFtZSgpIDxlbT5Nb2R1bGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TW9kdWxlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBtb2R1bGVOYW1lID0gTU9EVUxFX05BTUVfRURFRkFVTFQ7CisKKwkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbnMoKSA8ZW0+RGVzY3JpcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtODIsNyArMTA1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTkyLDcgKzExNSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERpc3BsYXlOYW1lPiBkaXNwbGF5TmFtZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMDIsNyArMTI1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaWNvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxJY29uPiBpY29uczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudkVudHJpZXMoKSA8ZW0+RW52IEVudHJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTEyLDcgKzEzNSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGVudkVudHJpZXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxFbnZFbnRyeT4gZW52RW50cmllczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlZnMoKSA8ZW0+RWpiIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTIyLDcgKzE0NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGVqYlJlZnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxFamJSZWY+IGVqYlJlZnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUmVmcygpIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTMyLDcgKzE1NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHNlcnZpY2VSZWZzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8U2VydmljZVJlZj4gc2VydmljZVJlZnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVJlZnMoKSA8ZW0+UmVzb3VyY2UgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xNDIsNyArMTY1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VSZWZzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8UmVzb3VyY2VSZWY+IHJlc291cmNlUmVmczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlRW52UmVmcygpIDxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xNTIsNyArMTc1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VFbnZSZWZzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8UmVzb3VyY2VFbnZSZWY+IHJlc291cmNlRW52UmVmczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE2Miw3ICsxODUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uUmVmPiBtZXNzYWdlRGVzdGluYXRpb25SZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTcyLDcgKzE5NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHBlcnNpc3RlbmNlVW5pdFJlZnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxQZXJzaXN0ZW5jZVVuaXRSZWY+IHBlcnNpc3RlbmNlVW5pdFJlZnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Q29uc3RydWN0cygpIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTgyLDcgKzIwNSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHBvc3RDb25zdHJ1Y3RzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IHBvc3RDb25zdHJ1Y3RzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlRGVzdHJveXMoKSA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE5Miw3ICsyMTUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcmVEZXN0cm95cyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PExpZmVjeWNsZUNhbGxiYWNrPiBwcmVEZXN0cm95czsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxsYmFja0hhbmRsZXIoKSA8ZW0+Q2FsbGJhY2sgSGFuZGxlcjwvZW0+fScgYXR0cmlidXRlLgpAQCAtMjIyLDcgKzI0NSwxNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uPiBtZXNzYWdlRGVzdGluYXRpb25zOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YVNvdXJjZSgpIDxlbT5EYXRhIFNvdXJjZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREYXRhU291cmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8RGF0YVNvdXJjZVR5cGU+IGRhdGFTb3VyY2U7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTI3MSw3ICszMDQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1ldGFkYXRhQ29tcGxldGVFU2V0ID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZUVTZXQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0yODEsNyArMzE0LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIjUiOyAvLyROT04tTkxTLTEkCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9ICI2IjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0zMDAsNyArMzMzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJzaW9uRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25FU2V0OwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTMxNiw2ICszNDksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5MaXRlcmFscy5BUFBMSUNBVElPTl9DTElFTlQ7CiAJfQpAQCAtMzI1LDkgKzM1OSwzMCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIFN0cmluZyBnZXRNb2R1bGVOYW1lKCkgeworCQlyZXR1cm4gbW9kdWxlTmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNb2R1bGVOYW1lKFN0cmluZyBuZXdNb2R1bGVOYW1lKSB7CisJCVN0cmluZyBvbGRNb2R1bGVOYW1lID0gbW9kdWxlTmFtZTsKKwkJbW9kdWxlTmFtZSA9IG5ld01vZHVsZU5hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01PRFVMRV9OQU1FLCBvbGRNb2R1bGVOYW1lLCBtb2R1bGVOYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMzM3LDkgKzM5Miw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKKwlwdWJsaWMgTGlzdDxEaXNwbGF5TmFtZT4gZ2V0RGlzcGxheU5hbWVzKCkgewogCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FUyk7CisJCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGlzcGxheU5hbWU+KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUVTKTsKIAkJfQogCQlyZXR1cm4gZGlzcGxheU5hbWVzOwogCX0KQEAgLTM0OSw5ICs0MDQsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKKwlwdWJsaWMgTGlzdDxJY29uPiBnZXRJY29ucygpIHsKIAkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb24uY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lDT05TKTsKKwkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEljb24+KEljb24uY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lDT05TKTsKIAkJfQogCQlyZXR1cm4gaWNvbnM7CiAJfQpAQCAtMzYxLDkgKzQxNiw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEVudkVudHJpZXMoKSB7CisJcHVibGljIExpc3Q8RW52RW50cnk+IGdldEVudkVudHJpZXMoKSB7CiAJCWlmIChlbnZFbnRyaWVzID09IG51bGwpIHsKLQkJCWVudkVudHJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRW52RW50cnkuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VOVl9FTlRSSUVTKTsKKwkJCWVudkVudHJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RW52RW50cnk+KEVudkVudHJ5LmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FTlZfRU5UUklFUyk7CiAJCX0KIAkJcmV0dXJuIGVudkVudHJpZXM7CiAJfQpAQCAtMzczLDkgKzQyOCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEVqYlJlZnMoKSB7CisJcHVibGljIExpc3Q8RWpiUmVmPiBnZXRFamJSZWZzKCkgewogCQlpZiAoZWpiUmVmcyA9PSBudWxsKSB7Ci0JCQllamJSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVqYlJlZi5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRlMpOworCQkJZWpiUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxFamJSZWY+KEVqYlJlZi5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRlMpOwogCQl9CiAJCXJldHVybiBlamJSZWZzOwogCX0KQEAgLTM4NSw5ICs0NDAsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2aWNlUmVmcygpIHsKKwlwdWJsaWMgTGlzdDxTZXJ2aWNlUmVmPiBnZXRTZXJ2aWNlUmVmcygpIHsKIAkJaWYgKHNlcnZpY2VSZWZzID09IG51bGwpIHsKLQkJCXNlcnZpY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VSZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUyk7CisJCQlzZXJ2aWNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTZXJ2aWNlUmVmPihTZXJ2aWNlUmVmLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlMpOwogCQl9CiAJCXJldHVybiBzZXJ2aWNlUmVmczsKIAl9CkBAIC0zOTcsOSArNDUyLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VSZWZzKCkgeworCXB1YmxpYyBMaXN0PFJlc291cmNlUmVmPiBnZXRSZXNvdXJjZVJlZnMoKSB7CiAJCWlmIChyZXNvdXJjZVJlZnMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlUmVmLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTKTsKKwkJCXJlc291cmNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxSZXNvdXJjZVJlZj4oUmVzb3VyY2VSZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlMpOwogCQl9CiAJCXJldHVybiByZXNvdXJjZVJlZnM7CiAJfQpAQCAtNDA5LDkgKzQ2NCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlRW52UmVmcygpIHsKKwlwdWJsaWMgTGlzdDxSZXNvdXJjZUVudlJlZj4gZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewogCQlpZiAocmVzb3VyY2VFbnZSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlRW52UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlMpOworCQkJcmVzb3VyY2VFbnZSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFJlc291cmNlRW52UmVmPihSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlMpOwogCQl9CiAJCXJldHVybiByZXNvdXJjZUVudlJlZnM7CiAJfQpAQCAtNDIxLDkgKzQ3Niw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7CisJcHVibGljIExpc3Q8TWVzc2FnZURlc3RpbmF0aW9uUmVmPiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewogCQlpZiAobWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKKwkJCW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uUmVmPihNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7CiAJCX0KIAkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvblJlZnM7CiAJfQpAQCAtNDMzLDkgKzQ4OCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSB7CisJcHVibGljIExpc3Q8UGVyc2lzdGVuY2VVbml0UmVmPiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkgewogCQlpZiAocGVyc2lzdGVuY2VVbml0UmVmcyA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW5jZVVuaXRSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKKwkJCXBlcnNpc3RlbmNlVW5pdFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UGVyc2lzdGVuY2VVbml0UmVmPihQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7CiAJCX0KIAkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFJlZnM7CiAJfQpAQCAtNDQ1LDkgKzUwMCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCkgeworCXB1YmxpYyBMaXN0PExpZmVjeWNsZUNhbGxiYWNrPiBnZXRQb3N0Q29uc3RydWN0cygpIHsKIAkJaWYgKHBvc3RDb25zdHJ1Y3RzID09IG51bGwpIHsKLQkJCXBvc3RDb25zdHJ1Y3RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19QT1NUX0NPTlNUUlVDVFMpOworCQkJcG9zdENvbnN0cnVjdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19QT1NUX0NPTlNUUlVDVFMpOwogCQl9CiAJCXJldHVybiBwb3N0Q29uc3RydWN0czsKIAl9CkBAIC00NTcsOSArNTEyLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0UHJlRGVzdHJveXMoKSB7CisJcHVibGljIExpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IGdldFByZURlc3Ryb3lzKCkgewogCQlpZiAocHJlRGVzdHJveXMgPT0gbnVsbCkgewotCQkJcHJlRGVzdHJveXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BSRV9ERVNUUk9ZUyk7CisJCQlwcmVEZXN0cm95cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4oTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BSRV9ERVNUUk9ZUyk7CiAJCX0KIAkJcmV0dXJuIHByZURlc3Ryb3lzOwogCX0KQEAgLTQ5MCw5ICs1NDUsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgeworCXB1YmxpYyBMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvbj4gZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIHsKIAkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvbnMgPT0gbnVsbCkgewotCQkJbWVzc2FnZURlc3RpbmF0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TKTsKKwkJCW1lc3NhZ2VEZXN0aW5hdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uPihNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsIHRoaXMsIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TKTsKIAkJfQogCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uczsKIAl9CkBAIC01MDIsNiArNTU3LDE4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBMaXN0PERhdGFTb3VyY2VUeXBlPiBnZXREYXRhU291cmNlKCkgeworCQlpZiAoZGF0YVNvdXJjZSA9PSBudWxsKSB7CisJCQlkYXRhU291cmNlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERhdGFTb3VyY2VUeXBlPihEYXRhU291cmNlVHlwZS5jbGFzcywgdGhpcywgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fREFUQV9TT1VSQ0UpOworCQl9CisJCXJldHVybiBkYXRhU291cmNlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CiAJCXJldHVybiBpZDsKIAl9CkBAIC02MTUsMzQgKzY4MiwzNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVudkVudHJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RW52RW50cmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRFamJSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFJlc291cmNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvc3RDb25zdHJ1Y3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBvc3RDb25zdHJ1Y3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUFJFX0RFU1RST1lTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UHJlRGVzdHJveXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJlRGVzdHJveXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RBVEFfU09VUkNFOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGF0YVNvdXJjZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTY1Miw4ICs3MjIsMTEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NT0RVTEVfTkFNRToKKwkJCQlyZXR1cm4gZ2V0TW9kdWxlTmFtZSgpOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlM6CiAJCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUVTOgpAQCAtNjgyLDEwICs3NTUsMTIgQEAKIAkJCQlyZXR1cm4gZ2V0Q2FsbGJhY2tIYW5kbGVyKCk7CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgogCQkJCXJldHVybiBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7CisJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0RBVEFfU09VUkNFOgorCQkJCXJldHVybiBnZXREYXRhU291cmNlKCk7CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lEOgogCQkJCXJldHVybiBnZXRJZCgpOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVRBREFUQV9DT01QTEVURToKLQkJCQlyZXR1cm4gaXNNZXRhZGF0YUNvbXBsZXRlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworCQkJCXJldHVybiBpc01ldGFkYXRhQ29tcGxldGUoKTsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTjoKIAkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwogCQl9CkBAIC02OTcsNjggKzc3Miw3NyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NT0RVTEVfTkFNRToKKwkJCQlzZXRNb2R1bGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUVTOgogCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERpc3BsYXlOYW1lPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19JQ09OUzoKIAkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJY29uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19FTlZfRU5UUklFUzoKIAkJCQlnZXRFbnZFbnRyaWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnZFbnRyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRFbnZFbnRyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFbnZFbnRyeT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRUpCX1JFRlM6CiAJCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RWpiUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRWpiUmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19TRVJWSUNFX1JFRlM6CiAJCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlcnZpY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VydmljZVJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUzoKIAkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXNvdXJjZVJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlM6CiAJCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFJlc291cmNlRW52UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUmVzb3VyY2VFbnZSZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKIAkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXNzYWdlRGVzdGluYXRpb25SZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKIAkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRSZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1BPU1RfQ09OU1RSVUNUUzoKIAkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBMaWZlY3ljbGVDYWxsYmFjaz4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUFJFX0RFU1RST1lTOgogCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmVEZXN0cm95cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UHJlRGVzdHJveXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIExpZmVjeWNsZUNhbGxiYWNrPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19DQUxMQkFDS19IQU5ETEVSOgogCQkJCXNldENhbGxiYWNrSGFuZGxlcigoU3RyaW5nKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgogCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1lc3NhZ2VEZXN0aW5hdGlvbj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fREFUQV9TT1VSQ0U6CisJCQkJZ2V0RGF0YVNvdXJjZSgpLmNsZWFyKCk7CisJCQkJZ2V0RGF0YVNvdXJjZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGF0YVNvdXJjZVR5cGU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lEOgogCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJc2V0TWV0YWRhdGFDb21wbGV0ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCQlzZXRNZXRhZGF0YUNvbXBsZXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX1ZFUlNJT046CiAJCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTc3Miw4ICs4NTYsMTIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTU9EVUxFX05BTUU6CisJCQkJc2V0TW9kdWxlTmFtZShNT0RVTEVfTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CkBAIC04MTYsNiArOTA0LDkgQEAKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6CiAJCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19EQVRBX1NPVVJDRToKKwkJCQlnZXREYXRhU291cmNlKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lEOgogCQkJCXNldElkKElEX0VERUZBVUxUKTsKIAkJCQlyZXR1cm47CkBAIC04MzQsOCArOTI1LDExIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX01PRFVMRV9OQU1FOgorCQkJCXJldHVybiBNT0RVTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbW9kdWxlTmFtZSAhPSBudWxsIDogIU1PRFVMRV9OQU1FX0VERUZBVUxULmVxdWFscyhtb2R1bGVOYW1lKTsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fREVTQ1JJUFRJT05TOgogCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FUzoKQEAgLTg2NCw2ICs5NTgsOCBAQAogCQkJCXJldHVybiBDQUxMQkFDS19IQU5ETEVSX0VERUZBVUxUID09IG51bGwgPyBjYWxsYmFja0hhbmRsZXIgIT0gbnVsbCA6ICFDQUxMQkFDS19IQU5ETEVSX0VERUZBVUxULmVxdWFscyhjYWxsYmFja0hhbmRsZXIpOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKIAkJCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9ucyAhPSBudWxsICYmICFtZXNzYWdlRGVzdGluYXRpb25zLmlzRW1wdHkoKTsKKwkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuIGRhdGFTb3VyY2UgIT0gbnVsbCAmJiAhZGF0YVNvdXJjZS5pc0VtcHR5KCk7CiAJCQljYXNlIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5BUFBMSUNBVElPTl9DTElFTlRfX0lEOgogCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19NRVRBREFUQV9DT01QTEVURToKQEAgLTg3OSwxMSArOTc1LDE0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjYWxsYmFja0hhbmRsZXI6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiAobW9kdWxlTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtb2R1bGVOYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjYWxsYmFja0hhbmRsZXI6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoY2FsbGJhY2tIYW5kbGVyKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25jbGllbnRGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uY2xpZW50RmFjdG9yeUltcGwuamF2YQppbmRleCBiNGQ4NGVmLi5lZDY1YjE1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25jbGllbnRGYWN0b3J5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbmNsaWVudEZhY3RvcnlJbXBsLmphdmEKQEAgLTYzLDYgKzYzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKIAkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50KCk7CkBAIC0xMDcsNiArMTA4LDcgQEAKIAkgKiBAZGVwcmVjYXRlZAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlARGVwcmVjYXRlZAogCXB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlIGdldFBhY2thZ2UoKSB7CiAJCXJldHVybiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZUlOU1RBTkNFOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbC5qYXZhCmluZGV4IGVkZGJkNjAuLjZlN2I1MTggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwuamF2YQpAQCAtMjEsOSArMjEsOCBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yOwpAQCAtMzEsMjIgKzMwLDggQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGw7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKLQogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LgpAQCAtOTIsMjMgKzc3LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKwlwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CiAKIAkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHNlZSAjZU5TX1VSSQpAQCAtMTIwLDcgKzk1LDcgQEAKIAkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZU5TX1VSSSk7CiAKIAkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSA9IChBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsKCkpOworCQlBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSA9IChBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGwoKSk7CiAKIAkJaXNJbml0ZWQgPSB0cnVlOwogCkBAIC0xMjgsMzIgKzEwMywyMSBAQAogCQlYTUxOYW1lc3BhY2VQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKIAkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCVdlYlBhY2thZ2VJbXBsIHRoZVdlYlBhY2thZ2UgPSAoV2ViUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgOiBXZWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmF2YWVlUGFja2FnZUltcGwgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEphdmFlZVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKSA6IEphdmFlZVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQogCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwogCQl0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmF2YWVlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKIAogCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCiAJCXRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhZWVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwogCiAJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKIAkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmZyZWV6ZSgpOwogCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lTlNfVVJJLCB0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UpOworCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkyLCB0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UpOworCisJCUoyRUVJbml0LmluaXRFTUZNb2RlbHMoKTsKIAkJcmV0dXJuIHRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKIAl9CiAKQEAgLTE3MSw4ICsxMzUsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uQ2xpZW50X01vZHVsZU5hbWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwogCX0KIAogCS8qKgpAQCAtMTgwLDcgKzE0NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0Rpc3BsYXlOYW1lcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9EZXNjcmlwdGlvbnMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwogCX0KIApAQCAtMTg5LDcgKzE1Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0ljb25zKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0Rpc3BsYXlOYW1lcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CiAJfQogCkBAIC0xOTgsNyArMTYyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfRW52RW50cmllcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9JY29ucygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CiAJfQogCkBAIC0yMDcsNyArMTcxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9FbnZFbnRyaWVzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKIAl9CiAKQEAgLTIxNiw3ICsxODAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9FamJSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKIAl9CiAKQEAgLTIyNSw3ICsxODksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZVJlZnMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwogCX0KIApAQCAtMjM0LDcgKzE5OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlRW52UmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZVJlZnMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwogCX0KIApAQCAtMjQzLDcgKzIwNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VFbnZSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKIAl9CiAKQEAgLTI1Miw3ICsyMTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwogCX0KIApAQCAtMjYxLDcgKzIyNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1Bvc3RDb25zdHJ1Y3RzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X1BlcnNpc3RlbmNlVW5pdFJlZnMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKIAl9CiAKQEAgLTI3MCw3ICsyMzQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9QcmVEZXN0cm95cygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9Qb3N0Q29uc3RydWN0cygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwogCX0KIApAQCAtMjc5LDggKzI0MywxNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9QcmVEZXN0cm95cygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQXR0cmlidXRlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0NhbGxiYWNrSGFuZGxlcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7CiAJfQogCiAJLyoqCkBAIC0yODksNyArMjYyLDE2IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0RhdGFTb3VyY2UoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKIAl9CiAKIAkvKioKQEAgLTI5OCw3ICsyODAsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNik7CiAJfQogCiAJLyoqCkBAIC0zMDcsNyArMjg5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25DbGllbnRfTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7CiAJfQogCiAJLyoqCkBAIC0zMTYsNyArMjk4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25DbGllbnRfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7CiAJfQogCiAJLyoqCkBAIC0zOTMsNiArMzc1LDcgQEAKIAogCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKIAkJYXBwbGljYXRpb25DbGllbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQVRJT05fQ0xJRU5UKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19NT0RVTEVfTkFNRSk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fREVTQ1JJUFRJT05TKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19ESVNQTEFZX05BTUVTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19JQ09OUyk7CkBAIC00MDcsNiArMzkwLDcgQEAKIAkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19QUkVfREVTVFJPWVMpOwogCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVIpOwogCQljcmVhdGVFUmVmZXJlbmNlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19EQVRBX1NPVVJDRSk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFQUExJQ0FUSU9OX0NMSUVOVF9fSUQpOwogCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBUFBMSUNBVElPTl9DTElFTlRfX01FVEFEQVRBX0NPTVBMRVRFKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OKTsKQEAgLTQ0Miw0MyArNDI2LDYxIEBACiAJCXNldE5zVVJJKGVOU19VUkkpOwogCiAJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJSmF2YWVlUGFja2FnZSB0aGVKYXZhZWVQYWNrYWdlID0gKEphdmFlZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKTsKIAkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7CisJCUphdmFlZVBhY2thZ2UgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSk7CiAKLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCiAKLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICJBcHBsaWNhdGlvbkNsaWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0Rpc3BsYXlOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfSWNvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9FbnZFbnRyaWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW52RW50cnkoKSwgbnVsbCwgImVudkVudHJpZXMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlUmVmKCksIG51bGwsICJyZXNvdXJjZVJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VFbnZSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1BlcnNpc3RlbmNlVW5pdFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKSwgbnVsbCwgInBlcnNpc3RlbmNlVW5pdFJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfUG9zdENvbnN0cnVjdHMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicG9zdENvbnN0cnVjdHMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfUHJlRGVzdHJveXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicHJlRGVzdHJveXMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25DbGllbnRfQ2FsbGJhY2tIYW5kbGVyKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImNhbGxiYWNrSGFuZGxlciIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25zIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uQ2xpZW50X01ldGFkYXRhQ29tcGxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAibWV0YWRhdGFDb21wbGV0ZSIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXdleVZlcnNpb25UeXBlKCksICJ2ZXJzaW9uIiwgIjUiLCAxLCAxLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwogCi0JCWluaXRFQ2xhc3MoYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvci5jbGFzcywgIkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAibWl4ZWQiLCBudWxsLCAwLCAtMSwgbnVsbCwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhNTE5TUHJlZml4TWFwIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieFNJU2NoZW1hTG9jYXRpb24iLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfQXBwbGljYXRpb25DbGllbnQoKSwgdGhpcy5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLCBudWxsLCAiYXBwbGljYXRpb25DbGllbnQiLCBudWxsLCAwLCAtMiwgbnVsbCwgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKLQkJLy8gaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhCi0JCWNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpOworCQlib29sZWFuIGhhc0xvY2sgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCWhhc0xvY2sgPSBKMkVFSW5pdC5hcXVpcmVJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJfQkJCisJCQorCQl0cnl7CisJCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCisJCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQkJaW5pdEVDbGFzcyhhcHBsaWNhdGlvbkNsaWVudEVDbGFzcywgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICJBcHBsaWNhdGlvbkNsaWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25DbGllbnRfTW9kdWxlTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAibW9kdWxlTmFtZSIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9FbnZFbnRyaWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW52RW50cnkoKSwgbnVsbCwgImVudkVudHJpZXMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0VqYlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJSZWYoKSwgbnVsbCwgImVqYlJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlUmVmKCksIG51bGwsICJyZXNvdXJjZVJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlRW52UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlRW52UmVmKCksIG51bGwsICJyZXNvdXJjZUVudlJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1BlcnNpc3RlbmNlVW5pdFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKSwgbnVsbCwgInBlcnNpc3RlbmNlVW5pdFJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1Bvc3RDb25zdHJ1Y3RzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RDb25zdHJ1Y3RzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9QcmVEZXN0cm95cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwcmVEZXN0cm95cyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25DbGllbnRfQ2FsbGJhY2tIYW5kbGVyKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImNhbGxiYWNrSGFuZGxlciIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25zIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9EYXRhU291cmNlKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGF0YVNvdXJjZVR5cGUoKSwgbnVsbCwgImRhdGFTb3VyY2UiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uQ2xpZW50X01ldGFkYXRhQ29tcGxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAibWV0YWRhdGFDb21wbGV0ZSIsIG51bGwsIDAsIDEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXdleVZlcnNpb25UeXBlKCksICJ2ZXJzaW9uIiwgIjYiLCAxLCAxLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkKKwkJCWluaXRFQ2xhc3MoYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvci5jbGFzcywgIkFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgIm1peGVkIiwgbnVsbCwgMCwgLTEsIG51bGwsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieE1MTlNQcmVmaXhNYXAiLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieFNJU2NoZW1hTG9jYXRpb24iLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yX0FwcGxpY2F0aW9uQ2xpZW50KCksIHRoaXMuZ2V0QXBwbGljYXRpb25DbGllbnQoKSwgbnVsbCwgImFwcGxpY2F0aW9uQ2xpZW50IiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCisJCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKKwkJCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQorCQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiAJLyoqCkBAIC00OTUsNiArNDk3LDE0IEBACiAJCSAgIG5ldyBTdHJpbmdbXSB7CiAJCQkgIm5hbWUiLCAiYXBwbGljYXRpb24tY2xpZW50VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QXBwbGljYXRpb25DbGllbnRfTW9kdWxlTmFtZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibW9kdWxlLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkKIAkJYWRkQW5ub3RhdGlvbgogCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudF9EZXNjcmlwdGlvbnMoKSwgCkBAIC02MDcsNiArNjE3LDE0IEBACiAJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lIiwgIm1lc3NhZ2UtZGVzdGluYXRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QXBwbGljYXRpb25DbGllbnRfRGF0YVNvdXJjZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiZGF0YS1zb3VyY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkKIAkJYWRkQW5ub3RhdGlvbgogCQkgIChnZXRBcHBsaWNhdGlvbkNsaWVudF9JZCgpLCAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvbWV0YWRhdGEvQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL21ldGFkYXRhL0FwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5qYXZhCmluZGV4IDBhM2M2NzIuLjU3YjUyYWMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvbWV0YWRhdGEvQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9tZXRhZGF0YS9BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuamF2YQpAQCAtMjksMjY3ICsyOSwyNDUgQEAKICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKLSAqICAgICAgIEAoIylhcHBsaWNhdGlvbi1jbGllbnRfNS54c2RzCTEuMjYgMDIvMTcvMDYKLSAqICAgICAKICAqIAotICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCisgKiAgICAgICAkSWQ6IEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5qYXZhLHYgMS40IDIwMTAvMDUvMTkgMTk6NTM6MTAgY2FuZGVyc29uIEV4cCAkCiAgKiAgICAgICAKKyAqICAgICAKICAqIAotICogCVRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgNQotICogCWRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdAotICogCWJlIG5hbWVkICJNRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIiBpbiB0aGUKLSAqIAlhcHBsaWNhdGlvbiBjbGllbnQncyBqYXIgZmlsZS4gIEFsbCBhcHBsaWNhdGlvbiBjbGllbnQKLSAqIAlkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlIGFwcGxpY2F0aW9uCi0gKiAJY2xpZW50IHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6Ci0gKiAKLSAqIAlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAqIAotICogCWFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gKiAJdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLSAqIAotICogCSAgICAmbHQ7YXBwbGljYXRpb24tY2xpZW50IHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gKiAJICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAqIAkgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQotICogCQlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzUueHNkIgotICogCSAgICAgIHZlcnNpb249IjUiJmd0OwotICogCSAgICAgIC4uLgotICogCSAgICAmbHQ7L2FwcGxpY2F0aW9uLWNsaWVudCZndDsKLSAqIAotICogCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotICogCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIEphdmEgRUUKLSAqIAluYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgotICogCi0gKiAJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZAotICogCi0gKiAJCisgKiA8IVtDREFUQVtbCisgKiAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgYXBwbGljYXRpb24gY2xpZW50IDYKKyAqICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdAorICogICAgICAgYmUgbmFtZWQgIk1FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiIGluIHRoZQorICogICAgICAgYXBwbGljYXRpb24gY2xpZW50J3MgamFyIGZpbGUuICBBbGwgYXBwbGljYXRpb24gY2xpZW50CisgKiAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUgdGhlIGFwcGxpY2F0aW9uCisgKiAgICAgICBjbGllbnQgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFIG5hbWVzcGFjZToKKyAqICAgICAgIAorICogICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCisgKiAgICAgICAKKyAqICAgICAgIGFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5CisgKiAgICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgorICogICAgICAgCisgKiAgICAgICA8YXBwbGljYXRpb24tY2xpZW50IHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgKiAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICogICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgCisgKiAgICAgICAJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF82LnhzZCIKKyAqICAgICAgIHZlcnNpb249IjYiPgorICogICAgICAgLi4uCisgKiAgICAgICA8L2FwcGxpY2F0aW9uLWNsaWVudD4KKyAqICAgICAgIAorICogICAgICAgVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCisgKiAgICAgICB0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKYXZhIEVFCisgKiAgICAgICBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgorICogICAgICAgCisgKiAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzYueHNkCisgKiAgICAgICAKKyAqIF1dPgogICogICAgIAogICogCiAgKiAKICAqICAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKICAqICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAqIAorICogICAgICAgCiAgKiAgICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gKiAJc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAqIAlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAqIAl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAqIAlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICogCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICogCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICogCi0gKiAgICAgCi0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfNS54c2RzCTEuNjUgMDYvMDIvMTcKKyAqICAgICAgIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90CisgKiAgICAgICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKKyAqICAgICAgIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKKyAqICAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCisgKiAgICAgICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQorICogICAgICAgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCisgKiAgICAgICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KKyAqICAgICAgIAogICogICAgIAogICogCiAgKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCisgKiAgICAgICAkSWQ6IEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5qYXZhLHYgMS40IDIwMTAvMDUvMTkgMTk6NTM6MTAgY2FuZGVyc29uIEV4cCAkCisgKiAgICAgICAKICAqICAgICAKICAqIAogICogCi0gKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KLSAqIHNoYXJlYWJsZSBzY2hlbWEocykgb2YgSjJFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQotICogaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgotICogCi0gKiBEZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgajJlZSBhcHBsaWNhdGlvbjsKLSAqICAgICBhcHBsaWNhdGlvbiBjbGllbnQ7Ci0gKiAgICAgd2ViIGFwcGxpY2F0aW9uOwotICogICAgIGVudGVycHJpc2UgYmVhbjsKLSAqICAgICByZXNvdXJjZSBhZGFwdGVyOwotICogCi0gKiBEZXBsb3ltZW50IEZpbGUgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogICAgIGVhciBmaWxlOwotICogICAgIHdhciBmaWxlOwotICogICAgIGphciBmaWxlOwotICogICAgIHJhciBmaWxlOwotICogCi0gKiAKLSAqIAotICogICAgICAgQCgjKWphdmFlZV93ZWJfc2VydmljZXNfY2xpZW50XzFfMi54c2RzCTEuMTkgMDIvMTMvMDYKKyAqICAgICAgIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgdGhhdCBhcHBlYXIgaW4gdGhlIGNvbW1vbgorICogICAgICAgc2hhcmVhYmxlIHNjaGVtYShzKSBvZiBKYXZhIEVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCisgKiAgICAgICBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnRleHQgdGhleSBhcmUgaW5jbHVkZWQ6CisgKiAgICAgICAKKyAqICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50IG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqICAgICAgIGphdmEgZWUgYXBwbGljYXRpb247CisgKiAgICAgICBhcHBsaWNhdGlvbiBjbGllbnQ7CisgKiAgICAgICB3ZWIgYXBwbGljYXRpb247CisgKiAgICAgICBlbnRlcnByaXNlIGJlYW47CisgKiAgICAgICByZXNvdXJjZSBhZGFwdGVyOyAKKyAqICAgICAgIAorICogICAgICAgRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqICAgICAgIGVhciBmaWxlOworICogICAgICAgd2FyIGZpbGU7CisgKiAgICAgICBqYXIgZmlsZTsKKyAqICAgICAgIHJhciBmaWxlOworICogICAgICAgCiAgKiAgICAgCiAgKiAKICAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKKyAqICAgICAgICRJZDogQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmphdmEsdiAxLjQgMjAxMC8wNS8xOSAxOTo1MzoxMCBjYW5kZXJzb24gRXhwICQKKyAqICAgICAgIAogICogICAgIAogICogCiAgKiAKICAqICAgICAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiAyMDAyCi0gKiAKKyAqICAgICAgIAogICogICAgIAogICogCi0gKiAgICBTZWUgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwgYW5kCi0gKiAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG5hbWVzcGFjZS4KKyAqICAgIDxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgIDxoMT5BYm91dCB0aGUgWE1MIG5hbWVzcGFjZTwvaDE+CiAgKiAKLSAqICAgICBUaGlzIHNjaGVtYSBkb2N1bWVudCBkZXNjcmliZXMgdGhlIFhNTCBuYW1lc3BhY2UsIGluIGEgZm9ybQotICogICAgIHN1aXRhYmxlIGZvciBpbXBvcnQgYnkgb3RoZXIgc2NoZW1hIGRvY3VtZW50cy4gIAotICogCi0gKiAgICAgTm90ZSB0aGF0IGxvY2FsIG5hbWVzIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBpbnRlbmRlZCB0byBiZSBkZWZpbmVkCi0gKiAgICAgb25seSBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBvciBpdHMgc3ViZ3JvdXBzLiAgVGhlCi0gKiAgICAgZm9sbG93aW5nIG5hbWVzIGFyZSBjdXJyZW50bHkgZGVmaW5lZCBpbiB0aGlzIG5hbWVzcGFjZSBhbmQgc2hvdWxkCi0gKiAgICAgbm90IGJlIHVzZWQgd2l0aCBjb25mbGljdGluZyBzZW1hbnRpY3MgYnkgYW55IFdvcmtpbmcgR3JvdXAsCi0gKiAgICAgc3BlY2lmaWNhdGlvbiwgb3IgZG9jdW1lbnQgaW5zdGFuY2U6Ci0gKiAKLSAqICAgICBiYXNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBwcm92aWRlcyBhIFVSSSB0byBiZSB1c2VkIGFzIHRoZSBiYXNlIGZvciBpbnRlcnByZXRpbmcgYW55Ci0gKiAgICAgICAgICByZWxhdGl2ZSBVUklzIGluIHRoZSBzY29wZSBvZiB0aGUgZWxlbWVudCBvbiB3aGljaCBpdAotICogICAgICAgICAgYXBwZWFyczsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAotICogICAgICAgICAgYnkgdmlydHVlIG9mIGl0cyBkZWZpbml0aW9uIGluIHRoZSBYTUwgQmFzZSBzcGVjaWZpY2F0aW9uLgotICogCi0gKiAgICAgaWQgICAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGlmIGRlY2xhcmVkIHRvIGJlIG9mIHR5cGUgSUQuCi0gKiAgICAgICAgICBUaGUgeG1sOmlkIHNwZWNpZmljYXRpb24gaXMgbm90IHlldCBhIFczQyBSZWNvbW1lbmRhdGlvbiwKLSAqICAgICAgICAgIGJ1dCB0aGlzIGF0dHJpYnV0ZSBpcyBpbmNsdWRlZCBoZXJlIHRvIGZhY2lsaXRhdGUgZXhwZXJpbWVudGF0aW9uCi0gKiAgICAgICAgICB3aXRoIHRoZSBtZWNoYW5pc21zIGl0IHByb3Bvc2VzLiAgTm90ZSB0aGF0IGl0IGlzIF9ub3RfIGluY2x1ZGVkCi0gKiAgICAgICAgICBpbiB0aGUgc3BlY2lhbEF0dHJzIGF0dHJpYnV0ZSBncm91cC4KLSAqIAotICogICAgIGxhbmcgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIGlzIGEgbGFuZ3VhZ2UgY29kZSBmb3IgdGhlIG5hdHVyYWwgbGFuZ3VhZ2Ugb2YgdGhlIGNvbnRlbnQgb2YKLSAqICAgICAgICAgIGFueSBlbGVtZW50OyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLgorICogICAgIDxkaXYgY2xhc3M9ImJvZHl0ZXh0Ij4KKyAqICAgICAgPHA+CisgKiAgICAgICBUaGlzIHNjaGVtYSBkb2N1bWVudCBkZXNjcmliZXMgdGhlIFhNTCBuYW1lc3BhY2UsIGluIGEgZm9ybQorICogICAgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIj4KKyAqICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sPC9hPiBhbmQKKyAqICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwiPgorICogICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbDwvYT4gZm9yIGluZm9ybWF0aW9uIAorICogICAgICAgYWJvdXQgdGhpcyBuYW1lc3BhY2UuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBOb3RlIHRoYXQgbG9jYWwgbmFtZXMgaW4gdGhpcyBuYW1lc3BhY2UgYXJlIGludGVuZGVkIHRvIGJlCisgKiAgICAgICBkZWZpbmVkIG9ubHkgYnkgdGhlIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gb3IgaXRzIHN1Ymdyb3Vwcy4KKyAqICAgICAgIFRoZSBuYW1lcyBjdXJyZW50bHkgZGVmaW5lZCBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgbGlzdGVkIGJlbG93LgorICogICAgICAgVGhleSBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBjb25mbGljdGluZyBzZW1hbnRpY3MgYnkgYW55IFdvcmtpbmcKKyAqICAgICAgIEdyb3VwLCBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4gICAKKyAqICAgICAgIFNlZSBmdXJ0aGVyIGJlbG93IGluIHRoaXMgZG9jdW1lbnQgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgPGEgaHJlZj0iI3VzYWdlIj5ob3cgdG8gcmVmZXIgdG8gdGhpcyBzY2hlbWEgZG9jdW1lbnQgZnJvbSB5b3VyIG93bgorICogICAgICAgWFNEIHNjaGVtYSBkb2N1bWVudHM8L2E+IGFuZCBhYm91dCA8YSBocmVmPSIjbnN2ZXJzaW9uaW5nIj50aGUKKyAqICAgICAgIG5hbWVzcGFjZS12ZXJzaW9uaW5nIHBvbGljeSBnb3Zlcm5pbmcgdGhpcyBzY2hlbWEgZG9jdW1lbnQ8L2E+LgorICogICAgICA8L3A+CisgKiAgICAgPC9kaXY+CisgKiAgICA8L2Rpdj4KICAqICAgCi0gKiAgICAgc3BhY2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UKLSAqICAgICAgICAgIHZhbHVlIGlzIGEga2V5d29yZCBpbmRpY2F0aW5nIHdoYXQgd2hpdGVzcGFjZSBwcm9jZXNzaW5nCi0gKiAgICAgICAgICBkaXNjaXBsaW5lIGlzIGludGVuZGVkIGZvciB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudDsgaXRzCi0gKiAgICAgICAgICB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgdmlydHVlIG9mIGl0cwotICogICAgICAgICAgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCiAgKiAKLSAqICAgICBGYXRoZXIgKGluIGFueSBjb250ZXh0IGF0IGFsbCk6IGRlbm90ZXMgSm9uIEJvc2FrLCB0aGUgY2hhaXIgb2YgCi0gKiAgICAgICAgICB0aGUgb3JpZ2luYWwgWE1MIFdvcmtpbmcgR3JvdXAuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgCi0gKiAgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIG9mIHRoZSBXM0MgWE1MIFBsZW5hcnkgYW5kIAotICogICAgICAgICAgWE1MIENvb3JkaW5hdGlvbiBncm91cHM6CisgKiAgICA8ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAqICAgIAorICogICAgIDxoMz5GYXRoZXIgKGluIGFueSBjb250ZXh0IGF0IGFsbCk8L2gzPiAKICAqIAotICogICAgICAgICAgICAgIEluIGFwcHJlY2lhdGlvbiBmb3IgaGlzIHZpc2lvbiwgbGVhZGVyc2hpcCBhbmQgZGVkaWNhdGlvbgotICogICAgICAgICAgICAgIHRoZSBXM0MgWE1MIFBsZW5hcnkgb24gdGhpcyAxMHRoIGRheSBvZiBGZWJydWFyeSwgMjAwMAotICogICAgICAgICAgICAgIHJlc2VydmVzIGZvciBKb24gQm9zYWsgaW4gcGVycGV0dWl0eSB0aGUgWE1MIG5hbWUKLSAqICAgICAgICAgICAgICB4bWw6RmF0aGVyCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIGRlbm90ZXMgSm9uIEJvc2FrLCB0aGUgY2hhaXIgb2YgCisgKiAgICAgICB0aGUgb3JpZ2luYWwgWE1MIFdvcmtpbmcgR3JvdXAuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgCisgKiAgICAgICB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIG9mIHRoZSBXM0MgWE1MIFBsZW5hcnkgYW5kIAorICogICAgICAgWE1MIENvb3JkaW5hdGlvbiBncm91cHM6CisgKiAgICAgIDwvcD4KKyAqICAgICAgPGJsb2NrcXVvdGU+CisgKiAgICAgICAgPHA+CisgKiAJSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZAorICogCWRlZGljYXRpb24gdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mCisgKiAJRmVicnVhcnksIDIwMDAsIHJlc2VydmVzIGZvciBKb24gQm9zYWsgaW4gcGVycGV0dWl0eQorICogCXRoZSBYTUwgbmFtZSAieG1sOkZhdGhlciIuCisgKiAgICAgICAgPC9wPgorICogICAgICA8L2Jsb2NrcXVvdGU+CisgKiAgICAgPC9kaXY+CisgKiAgICA8L2Rpdj4KICAqICAgCi0gKiBUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICogICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gKiAgICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcsIHhtbDpzcGFjZSBvciB4bWw6aWQKLSAqICAgICAgICAgYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KICAqIAotICogICAgICAgICBUbyBlbmFibGUgdGhpcywgc3VjaCBhIHNjaGVtYSBtdXN0IGltcG9ydCB0aGlzIHNjaGVtYQotICogICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKLSAqICAgICAgICAgJmx0O3NjaGVtYSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICogICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8mZ3Q7CisgKiAgICA8ZGl2IGlkPSJ1c2FnZSIgeG1sOmlkPSJ1c2FnZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgIDxoMj4KKyAqICAgICAgIDxhIG5hbWU9InVzYWdlIj5BYm91dCB0aGlzIHNjaGVtYSBkb2N1bWVudDwvYT4KKyAqICAgICA8L2gyPgogICogCi0gKiAgICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMKLSAqICAgICAgICAgb3IgdGhlIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgorICogICAgIDxkaXYgY2xhc3M9ImJvZHl0ZXh0Ij4KKyAqICAgICAgPHA+CisgKiAgICAgICBUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cCBzdWl0YWJsZQorICogICAgICAgZm9yIHVzZSBieSBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgPGNvZGU+eG1sOmJhc2U8L2NvZGU+LAorICogICAgICAgPGNvZGU+eG1sOmxhbmc8L2NvZGU+LCA8Y29kZT54bWw6c3BhY2U8L2NvZGU+IG9yCisgKiAgICAgICA8Y29kZT54bWw6aWQ8L2NvZGU+IGF0dHJpYnV0ZXMgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBUbyBlbmFibGUgdGhpcywgc3VjaCBhIHNjaGVtYSBtdXN0IGltcG9ydCB0aGlzIHNjaGVtYSBmb3IKKyAqICAgICAgIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6CisgKiAgICAgIDwvcD4KKyAqICAgICAgPHByZT4KKyAqICAgICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuJmd0OworICogICAgICAgICAgICAuIC4gLgorICogICAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgorICogICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLyZndDsKKyAqICAgICAgPC9wcmU+CisgKiAgICAgIDxwPgorICogICAgICAgb3IKKyAqICAgICAgPC9wPgorICogICAgICA8cHJlPgorICogICAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgorICogICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QiLyZndDsKKyAqICAgICAgPC9wcmU+CisgKiAgICAgIDxwPgorICogICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcyBvciB0aGUKKyAqICAgICAgIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgorICogICAgICA8L3A+CisgKiAgICAgIDxwcmU+CisgKiAgICAgICAgICAgJmx0O3R5cGUgLiAuIC4mZ3Q7CisgKiAgICAgICAgICAgIC4gLiAuCisgKiAgICAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLyZndDsKKyAqICAgICAgPC9wcmU+CisgKiAgICAgIDxwPgorICogICAgICAgd2lsbCBkZWZpbmUgYSB0eXBlIHdoaWNoIHdpbGwgc2NoZW1hLXZhbGlkYXRlIGFuIGluc3RhbmNlIGVsZW1lbnQKKyAqICAgICAgIHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMuCisgKiAgICAgIDwvcD4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgorICogICAKICAqIAotICogICAgICAgICAmbHQ7dHlwZSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJ4bWw6c3BlY2lhbEF0dHJzIi8mZ3Q7Ci0gKiAgCi0gKiAgICAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UKLSAqICAgICAgICAgIGVsZW1lbnQgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlcwotICogSW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZwotICogICAgcG9saWN5LCB0aGlzIHNjaGVtYSBkb2N1bWVudCB3aWxsIHBlcnNpc3QgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZC4KLSAqICAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QuCi0gKiAgICBUaGUgc2NoZW1hIGRvY3VtZW50IGF0IHRoYXQgVVJJIG1heSBob3dldmVyIGNoYW5nZSBpbiB0aGUgZnV0dXJlLAotICogICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MIFNjaGVtYQotICogICAgaXRzZWxmLCBvciB3aXRoIHRoZSBYTUwgbmFtZXNwYWNlIGl0c2VsZi4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGUgWE1MCi0gKiAgICBTY2hlbWEgb3IgWE1MIG5hbWVzcGFjZXMgY2hhbmdlLCB0aGUgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKLSAqICAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KKyAqICAgIDxkaXYgaWQ9Im5zdmVyc2lvbmluZyIgeG1sOmlkPSJuc3ZlcnNpb25pbmciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAqICAgICA8aDI+CisgKiAgICAgICA8YSBuYW1lPSJuc3ZlcnNpb25pbmciPlZlcnNpb25pbmcgcG9saWN5IGZvciB0aGlzIHNjaGVtYSBkb2N1bWVudDwvYT4KKyAqICAgICA8L2gyPgorICogICAgIDxkaXYgY2xhc3M9ImJvZHl0ZXh0Ij4KKyAqICAgICAgPHA+CisgKiAgICAgICBJbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCisgKiAgICAgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2Q8L2E+LgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKKyAqICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCI+CisgKiAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkPC9hPi4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCisgKiAgICAgICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwKKyAqICAgICAgIFNjaGVtYSBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsCisgKiAgICAgICBpZiB0aGUgWE1MIFNjaGVtYSBvciBYTUwgbmFtZXNwYWNlcyBjaGFuZ2UsIHRoZSB2ZXJzaW9uIG9mIHRoaXMKKyAqICAgICAgIGRvY3VtZW50IGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCI+CisgKiAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIAorICogICAgICAgPC9hPiAKKyAqICAgICAgIHdpbGwgY2hhbmdlIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdCAKKyAqICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZCI+CisgKiAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIAorICogICAgICAgPC9hPiAKKyAqICAgICAgIHdpbGwgbm90IGNoYW5nZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIFByZXZpb3VzIGRhdGVkIChhbmQgdW5jaGFuZ2luZykgdmVyc2lvbnMgb2YgdGhpcyBzY2hlbWEgCisgKiAgICAgICBkb2N1bWVudCBhcmUgYXQ6CisgKiAgICAgIDwvcD4KKyAqICAgICAgPHVsPgorICogICAgICAgPGxpPgorICogICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZCI+CisgKiAJaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkPC9hPgorICogICAgICAgICA8L2xpPgorICogICAgICAgPGxpPgorICogICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDgveG1sLnhzZCI+CisgKiAJaHR0cDovL3d3dy53My5vcmcvMjAwNy8wOC94bWwueHNkPC9hPgorICogICAgICAgICA8L2xpPgorICogICAgICAgPGxpPgorICogICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMTAveG1sLnhzZCI+CisgKiAJaHR0cDovL3d3dy53My5vcmcvMjAwNC8xMC94bWwueHNkPC9hPgorICogICAgICAgICA8L2xpPgorICogICAgICAgPGxpPgorICogICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZCI+CisgKiAJaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkPC9hPgorICogICAgICAgICA8L2xpPgorICogICAgICA8L3VsPgorICogICAgIDwvZGl2PgorICogICAgPC9kaXY+CiAgKiAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeQpAQCAtMzA3LDkgKzI4NSwxMSBAQAogCS8qKgogCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGUgcGFja2FnZSBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgSmF2YSBFRSA1IGFuZCBKYXZhIEVFIDYgeHNkcywgc2luY2UgaXQgaXMgdXNlZCBmb3IgYm90aAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqLwogCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2QiOyAvLyROT04tTkxTLTEkCisJU3RyaW5nIGVOU19VUkkyID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNi54c2QiOyAvLyROT04tTkxTLTEkCiAKIAkvKioKIAkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KQEAgLTMzOCwxMyArMzE4LDIyIEBACiAJaW50IEFQUExJQ0FUSU9OX0NMSUVOVCA9IDA7CiAKIAkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBUFBMSUNBVElPTl9DTElFTlRfX01PRFVMRV9OQU1FID0gMDsKKworCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fREVTQ1JJUFRJT05TID0gMDsKKwlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19ERVNDUklQVElPTlMgPSAxOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMzUzLDcgKzM0Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FUyA9IDE7CisJaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fRElTUExBWV9OQU1FUyA9IDI7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMzYyLDcgKzM1MSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fSUNPTlMgPSAyOworCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0lDT05TID0gMzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0zNzEsNyArMzYwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19FTlZfRU5UUklFUyA9IDM7CisJaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fRU5WX0VOVFJJRVMgPSA0OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTM4MCw3ICszNjksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0VKQl9SRUZTID0gNDsKKwlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19FSkJfUkVGUyA9IDU7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTM4OSw3ICszNzgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1NFUlZJQ0VfUkVGUyA9IDU7CisJaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fU0VSVklDRV9SRUZTID0gNjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTM5OCw3ICszODcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlMgPSA2OworCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX1JFRlMgPSA3OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQwNyw3ICszOTYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1JFU09VUkNFX0VOVl9SRUZTID0gNzsKKwlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19SRVNPVVJDRV9FTlZfUkVGUyA9IDg7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQxNiw3ICs0MDUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IDg7CisJaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gOTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNDI1LDcgKzQxNCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTID0gOTsKKwlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSAxMDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNDM0LDcgKzQyMyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fUE9TVF9DT05TVFJVQ1RTID0gMTA7CisJaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fUE9TVF9DT05TVFJVQ1RTID0gMTE7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQ0Myw3ICs0MzIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1BSRV9ERVNUUk9ZUyA9IDExOworCWludCBBUFBMSUNBVElPTl9DTElFTlRfX1BSRV9ERVNUUk9ZUyA9IDEyOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGxiYWNrIEhhbmRsZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTQ1Miw3ICs0NDEsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0NBTExCQUNLX0hBTkRMRVIgPSAxMjsKKwlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19DQUxMQkFDS19IQU5ETEVSID0gMTM7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNDYxLDcgKzQ1MCwxNiBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX01FU1NBR0VfREVTVElOQVRJT05TID0gMTM7CisJaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlMgPSAxNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhIFNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19EQVRBX1NPVVJDRSA9IDE1OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC00NzAsNyArNDY4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19JRCA9IDE0OworCWludCBBUFBMSUNBVElPTl9DTElFTlRfX0lEID0gMTY7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTQ3OSw3ICs0NzcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfX01FVEFEQVRBX0NPTVBMRVRFID0gMTU7CisJaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVUQURBVEFfQ09NUExFVEUgPSAxNzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC00ODgsNyArNDg2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OID0gMTY7CisJaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9fVkVSU0lPTiA9IDE4OwogCiAJLyoqCiAJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+JyBjbGFzcy4KQEAgLTQ5Nyw3ICs0OTUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBBUFBMSUNBVElPTl9DTElFTlRfRkVBVFVSRV9DT1VOVCA9IDE3OworCWludCBBUFBMSUNBVElPTl9DTElFTlRfRkVBVFVSRV9DT1VOVCA9IDE5OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvckltcGwgPGVtPkFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgpAQCAtNTY2LDYgKzU2NCwxNyBAQAogCUVDbGFzcyBnZXRBcHBsaWNhdGlvbkNsaWVudCgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1vZHVsZU5hbWUgPGVtPk1vZHVsZSBOYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW9kdWxlIE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldE1vZHVsZU5hbWUoKQorCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkNsaWVudF9Nb2R1bGVOYW1lKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTcyMCw2ICs3MjksMTcgQEAKIAlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50I2dldERhdGFTb3VyY2UgPGVtPkRhdGEgU291cmNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EYXRhIFNvdXJjZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQjZ2V0RGF0YVNvdXJjZSgpCisJICogQHNlZSAjZ2V0QXBwbGljYXRpb25DbGllbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEFwcGxpY2F0aW9uQ2xpZW50X0RhdGFTb3VyY2UoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC04MzksNiArODU5LDE0IEBACiAJCUVDbGFzcyBBUFBMSUNBVElPTl9DTElFTlQgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnQoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQVBQTElDQVRJT05fQ0xJRU5UX19NT0RVTEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9Nb2R1bGVOYW1lKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtOTUxLDYgKzk3OSwxNCBAQAogCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBTb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFQUExJQ0FUSU9OX0NMSUVOVF9fREFUQV9TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfRGF0YVNvdXJjZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBDbGllbnRYTUxIZWxwZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwQ2xpZW50WE1MSGVscGVySW1wbC5qYXZhCmluZGV4IDI2NzFjM2UuLjA2NTljMzAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBDbGllbnRYTUxIZWxwZXJJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcENsaWVudFhNTEhlbHBlckltcGwuamF2YQpAQCAtMTksMTYgKzE5LDE3IEBACiAKIAlwdWJsaWMgQXBwQ2xpZW50WE1MSGVscGVySW1wbChYTUxSZXNvdXJjZSByZXNvdXJjZSkgewogCQlzdXBlcihyZXNvdXJjZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgogCX0KIAogCQorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKFN0cmluZyBwcmVmaXgpIHsKLQkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5lcXVhbHMoIiIpKQorCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKIAkJCXJldHVybiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZU5TX1VSSTsKIAkJZWxzZQogCQkJcmV0dXJuIHN1cGVyLmdldFVSSShwcmVmaXgpOwogCX0KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldFFOYW1lKEVQYWNrYWdlIGVQYWNrYWdlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBtdXN0SGF2ZVByZWZpeCkKIAkgIHsKIAkgICBTdHJpbmcgbnNQcmVmaXggPSBnZXRQcmVmaXgoZVBhY2thZ2UsIG11c3RIYXZlUHJlZml4KTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRBZGFwdGVyRmFjdG9yeS5qYXZhCmluZGV4IGI0M2RmNDIuLjEyMDA0NGUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50QWRhcHRlckZhY3RvcnkuamF2YQpAQCAtNTgsNiArNTgsNyBAQAogCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKQEAgLTY5LDIwICs3MCwyMyBAQAogCX0KIAogCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYXRpb25jbGllbnRTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgQXBwbGljYXRpb25jbGllbnRTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudChBcHBsaWNhdGlvbkNsaWVudCBvYmplY3QpIHsKKwlwcm90ZWN0ZWQgQXBwbGljYXRpb25jbGllbnRTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgQXBwbGljYXRpb25jbGllbnRTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBcHBsaWNhdGlvbkNsaWVudChBcHBsaWNhdGlvbkNsaWVudCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25DbGllbnRBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3JBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CiAJCQl9CiAJCX07CkBAIC05NSw4ICs5OSw5IEBACiAJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKIAl9CiAKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDJkMzY0NjMuLjI5MmFmZDkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudFJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKQEAgLTQxLDYgKzQxLDcgQEAKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7CiAJCVhNTFJlc291cmNlIHJlc3VsdCA9IG5ldyBBcHBsaWNhdGlvbmNsaWVudFJlc291cmNlSW1wbCh1cmkpOwogCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudFJlc291cmNlSW1wbC5qYXZhCmluZGV4IGNhY2Y0ZTguLmY3MzhhZWMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudFJlc291cmNlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudFJlc291cmNlSW1wbC5qYXZhCkBAIC0yOCw3ICsyOCw3IEBACiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwudXRpbC5BcHBsaWNhdGlvbmNsaWVudFJlc291cmNlRmFjdG9yeUltcGwKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uY2xpZW50UmVzb3VyY2VJbXBsIGV4dGVuZHMgSmF2YWVlUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgSVJvb3RPYmplY3RSZXNvdXJjZSwgSUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2V7CitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25jbGllbnRSZXNvdXJjZUltcGwgZXh0ZW5kcyBKYXZhZWVSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBJUm9vdE9iamVjdFJlc291cmNlLCBJQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSB7CiAJLyoqCiAJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTQwLDE4ICs0MCwyMCBAQAogCQlzdXBlcih1cmkpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgWE1MTG9hZCBjcmVhdGVYTUxMb2FkKCkgewogCQkgcmV0dXJuIG5ldyBKRUVYTUxMb2FkSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7CiAJfQogCiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7CiAJCQogCQlyZXR1cm4gbmV3IEFwcENsaWVudFhNTEhlbHBlckltcGwodGhpcyk7CiAJfQogCQogCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwudXRpbC5JQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSNnZXRSb290T2JqZWN0KCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuSUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UjZ2V0Um9vdE9iamVjdCgpCiAJICovCiAJcHVibGljIEVPYmplY3QgZ2V0Um9vdE9iamVjdCgpIHsKIAkJaWYgKGNvbnRlbnRzID09IG51bGwgfHwgY29udGVudHMuaXNFbXB0eSgpKQpAQCAtNjMsNyArNjUsNyBAQAogCQlyZXR1cm4gKEVPYmplY3QpKChBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKXJvb3QpLmdldEFwcGxpY2F0aW9uQ2xpZW50KCk7CiAJfQogCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwudXRpbC5JQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSNnZXRBcHBsaWNhdGlvbkNsaWVudCgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LklBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlI2dldEFwcGxpY2F0aW9uQ2xpZW50KCkKIAkgKi8KIAlwdWJsaWMgQXBwbGljYXRpb25DbGllbnQgZ2V0QXBwbGljYXRpb25DbGllbnQoKSB7CiAJCXJldHVybiAoQXBwbGljYXRpb25DbGllbnQpZ2V0Um9vdE9iamVjdCgpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC91dGlsL0FwcGxpY2F0aW9uY2xpZW50U3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRTd2l0Y2guamF2YQppbmRleCBkZmVmNGNhLi4wNjZkZGM5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRTd2l0Y2guamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRTd2l0Y2guamF2YQpAQCAtMzIsNyArMzIsNyBAQAogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZQogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25jbGllbnRTd2l0Y2ggeworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uY2xpZW50U3dpdGNoPFQ+IHsKIAkvKioKIAkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjAsNyArNjAsNyBAQAogCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CiAJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKIAl9CiAKQEAgLTcxLDE2ICs3MSwxNiBAQAogCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CiAJCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewogCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7CiAJCX0KIAkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKIAkJCXJldHVybgogCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CiAJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwogCQl9CiAJfQogCkBAIC05MSwxNyArOTEsMTcgQEAKIAkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCXByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewogCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UOiB7CiAJCQkJQXBwbGljYXRpb25DbGllbnQgYXBwbGljYXRpb25DbGllbnQgPSAoQXBwbGljYXRpb25DbGllbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uQ2xpZW50KGFwcGxpY2F0aW9uQ2xpZW50KTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbkNsaWVudChhcHBsaWNhdGlvbkNsaWVudCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX0RFUExPWU1FTlRfREVTQ1JJUFRPUjogewogCQkJCUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IgYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciA9IChBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKGFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IpOworCQkJCVQgcmVzdWx0ID0gY2FzZUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoYXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcik7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQpAQCAtMTEwLDQ3ICsxMTAsNDcgQEAKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2F0aW9uIENsaWVudDwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQ8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50PC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudChBcHBsaWNhdGlvbkNsaWVudCBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlQXBwbGljYXRpb25DbGllbnQoQXBwbGljYXRpb25DbGllbnQgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb24gQ2xpZW50IERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbiBDbGllbnQgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUFwcGxpY2F0aW9uQ2xpZW50RGVwbG95bWVudERlc2NyaXB0b3IoQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25jbGllbnRYTUxQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudFhNTFByb2Nlc3Nvci5qYXZhCmluZGV4IDdhODQxYjAuLjk3ZjNiZjEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudFhNTFByb2Nlc3Nvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbmNsaWVudFhNTFByb2Nlc3Nvci5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS51dGlsLlhNTFByb2Nlc3NvcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlOwpAQCAtNDIsNyArNDMsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldFJlZ2lzdHJhdGlvbnMoKSB7CisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFJlc291cmNlLkZhY3Rvcnk+IGdldFJlZ2lzdHJhdGlvbnMoKSB7CiAJCWlmIChyZWdpc3RyYXRpb25zID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFJlZ2lzdHJhdGlvbnMoKTsKIAkJCXJlZ2lzdHJhdGlvbnMucHV0KFhNTF9FWFRFTlNJT04sIG5ldyBBcHBsaWNhdGlvbmNsaWVudFJlc291cmNlRmFjdG9yeUltcGwoKSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYmQ0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUuamF2YQpAQCAtMCwwICsxLDI0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+QWRkcmVzc2luZyBSZXNwb25zZXMgVHlwZTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBJZiBXUy1BZGRyZXNzaW5nIGlzIGVuYWJsZWQsIHRoaXMgdHlwZSBkZXRlcm1pbmVzIGlmIGFuIGVuZHBvaW50CisgKiAgICAgICAgIHJlcXVpcmVzIHRoZSB1c2Ugb2Ygb25seSBhbm9ueW1vdXMgcmVzcG9uc2VzLCBvciBvbmx5IG5vbi1hbm9ueW1vdXMKKyAqICAgICAgICAgcmVzcG9uc2VzLCBvciBhbGwuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgU2VydmljZXMgQ2xpZW50IDEuMworICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlKCkKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5BTk9OWU1PVVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQU5PTllNT1VTX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQU5PTllNT1VTKDAsICJBTk9OWU1PVVMiLCAiQU5PTllNT1VTIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9OQU5PTllNT1VTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PTkFOT05ZTU9VU19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU5PTkFOT05ZTU9VUygxLCAiTk9OQU5PTllNT1VTIiwgIk5PTl9BTk9OWU1PVVMiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5BTEw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQUxMX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQUxMKDIsICJBTEwiLCAiQUxMIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+QU5PTllNT1VTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BTk9OWU1PVVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQU5PTllNT1VTCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5PTllNT1VTX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk5PTkFOT05ZTU9VUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9OQU5PTllNT1VTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PTkFOT05ZTU9VUworCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkFOT05ZTU9VU19WQUxVRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5BTEw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBTEwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfVkFMVUUgPSAyOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkFkZHJlc3NpbmcgUmVzcG9uc2VzIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlW10geworCQkJQU5PTllNT1VTLAorCQkJTk9OQU5PTllNT1VTLAorCQkJQUxMLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkFkZHJlc3NpbmcgUmVzcG9uc2VzIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5BZGRyZXNzaW5nIFJlc3BvbnNlcyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkFkZHJlc3NpbmcgUmVzcG9uc2VzIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5BZGRyZXNzaW5nIFJlc3BvbnNlcyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIEFOT05ZTU9VU19WQUxVRTogcmV0dXJuIEFOT05ZTU9VUzsKKwkJCWNhc2UgTk9OQU5PTllNT1VTX1ZBTFVFOiByZXR1cm4gTk9OQU5PTllNT1VTOworCQkJY2FzZSBBTExfVkFMVUU6IHJldHVybiBBTEw7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL0FkZHJlc3NpbmdSZXNwb25zZXNUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvQWRkcmVzc2luZ1R5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9BZGRyZXNzaW5nVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjhiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvQWRkcmVzc2luZ1R5cGUuamF2YQpAQCAtMCwwICsxLDIyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFkZHJlc3NpbmcgVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKyAqIAorICogCisgKiAgICAgICAgIFRoaXMgc3BlY2lmaWVzIHRoZSBXUy1BZGRyZXNzaW5nIHJlcXVpcmVtZW50cyBmb3IgYSBKQVgtV1Mgd2ViIHNlcnZpY2UuCisgKiAgICAgICAgIEl0IGNvcnJlc3BvbmRzIHRvIGphdmF4LnhtbC53cy5zb2FwLkFkZHJlc3NpbmcgYW5ub3RhdGlvbiBvciBpdHMKKyAqICAgICAgICAgZmVhdHVyZSBqYXZheC54bWwud3Muc29hcC5BZGRyZXNzaW5nRmVhdHVyZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIElmIHRoZSAiZW5hYmxlZCIgZWxlbWVudCBpcyAidHJ1ZSIsIFdTLUFkZHJlc3NpbmcgaXMgZW5hYmxlZC4KKyAqICAgICAgICAgSXQgbWVhbnMgdGhhdCB0aGUgZW5kcG9pbnQgc3VwcG9ydHMgV1MtQWRkcmVzc2luZyBidXQgZG9lcyBub3QgcmVxdWlyZQorICogICAgICAgICBpdHMgdXNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgImVuYWJsZWQiIGlzICJ0cnVlIi4KKyAqICAgICAgICAgCisgKiAgICAgICAgIElmIHRoZSBXUy1BZGRyZXNzaW5nIGlzIGVuYWJsZWQgYW5kIHRoZSAicmVxdWlyZWQiIGVsZW1lbnQgaXMgInRydWUiLAorICogICAgICAgICBpdCBtZWFucyB0aGF0IHRoZSBlbmRwb2ludCByZXF1aXJlcyBXUy1BZGRyZXNzaW5nLiBUaGUgZGVmYXVsdCB2YWx1ZQorICogICAgICAgICBmb3IgInJlcXVpcmVkIiBpcyAiZmFsc2UiLgorICogICAgICAgICAKKyAqICAgICAgICAgSWYgV1MtQWRkcmVzc2luZyBpcyBlbmFibGVkLCB0aGUgInJlc3BvbnNlcyIgZWxlbWVudCBkZXRlcm1pbmVzCisgKiAgICAgICAgIGlmIGFuIGVuZHBvaW50IHJlcXVpcmVzIHRoZSB1c2Ugb2Ygb25seSBhbm9ueW1vdXMgcmVzcG9uc2VzLAorICogICAgICAgICBvciBvbmx5IG5vbi1hbm9ueW1vdXMgcmVzcG9uc2VzLCBvciBhbGwuIFRoZSB2YWx1ZSBvZiB0aGUgInJlc3BvbnNlcyIKKyAqICAgICAgICAgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogICAgICAgICAKKyAqICAgICAgICAgQU5PTllNT1VTCisgKiAgICAgICAgIE5PTl9BTk9OWU1PVVMKKyAqICAgICAgICAgQUxMCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlICJyZXNwb25zZXMiIGlzIEFMTC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIFdlYiBTZXJ2aWNlcyBDbGllbnQgMS4zCisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuQWRkcmVzc2luZ1R5cGUjaXNFbmFibGVkIDxlbT5FbmFibGVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuQWRkcmVzc2luZ1R5cGUjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nVHlwZSNnZXRSZXNwb25zZXMgPGVtPlJlc3BvbnNlczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0QWRkcmVzc2luZ1R5cGUoKQorICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQWRkcmVzc2luZ1R5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVuYWJsZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRFbmFibGVkKCkKKwkgKiBAc2VlICN1bnNldEVuYWJsZWQoKQorCSAqIEBzZWUgI3NldEVuYWJsZWQoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEFkZHJlc3NpbmdUeXBlX0VuYWJsZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzRW5hYmxlZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkFkZHJlc3NpbmdUeXBlI2lzRW5hYmxlZCA8ZW0+RW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRFbmFibGVkKCkKKwkgKiBAc2VlICN1bnNldEVuYWJsZWQoKQorCSAqIEBzZWUgI2lzRW5hYmxlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RW5hYmxlZChib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkFkZHJlc3NpbmdUeXBlI2lzRW5hYmxlZCA8ZW0+RW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTZXRFbmFibGVkKCkKKwkgKiBAc2VlICNpc0VuYWJsZWQoKQorCSAqIEBzZWUgI3NldEVuYWJsZWQoYm9vbGVhbikKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCB1bnNldEVuYWJsZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkFkZHJlc3NpbmdUeXBlI2lzRW5hYmxlZCA8ZW0+RW5hYmxlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIEBzZWUgI3Vuc2V0RW5hYmxlZCgpCisJICogQHNlZSAjaXNFbmFibGVkKCkKKwkgKiBAc2VlICNzZXRFbmFibGVkKGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNTZXRFbmFibGVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0UmVxdWlyZWQoKQorCSAqIEBzZWUgI3Vuc2V0UmVxdWlyZWQoKQorCSAqIEBzZWUgI3NldFJlcXVpcmVkKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRBZGRyZXNzaW5nVHlwZV9SZXF1aXJlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNSZXF1aXJlZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkFkZHJlc3NpbmdUeXBlI2lzUmVxdWlyZWQgPGVtPlJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRSZXF1aXJlZCgpCisJICogQHNlZSAjdW5zZXRSZXF1aXJlZCgpCisJICogQHNlZSAjaXNSZXF1aXJlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nVHlwZSNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTZXRSZXF1aXJlZCgpCisJICogQHNlZSAjaXNSZXF1aXJlZCgpCisJICogQHNlZSAjc2V0UmVxdWlyZWQoYm9vbGVhbikKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCB1bnNldFJlcXVpcmVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nVHlwZSNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVxdWlyZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldFJlcXVpcmVkKCkKKwkgKiBAc2VlICNpc1JlcXVpcmVkKCkKKwkgKiBAc2VlICNzZXRSZXF1aXJlZChib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0UmVxdWlyZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNlczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNwb25zZXM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2VzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZQorCSAqIEBzZWUgI2lzU2V0UmVzcG9uc2VzKCkKKwkgKiBAc2VlICN1bnNldFJlc3BvbnNlcygpCisJICogQHNlZSAjc2V0UmVzcG9uc2VzKEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0QWRkcmVzc2luZ1R5cGVfUmVzcG9uc2VzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgZ2V0UmVzcG9uc2VzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuQWRkcmVzc2luZ1R5cGUjZ2V0UmVzcG9uc2VzIDxlbT5SZXNwb25zZXM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNlczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUKKwkgKiBAc2VlICNpc1NldFJlc3BvbnNlcygpCisJICogQHNlZSAjdW5zZXRSZXNwb25zZXMoKQorCSAqIEBzZWUgI2dldFJlc3BvbnNlcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVzcG9uc2VzKEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIHZhbHVlKTsKKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkFkZHJlc3NpbmdUeXBlI2dldFJlc3BvbnNlcyA8ZW0+UmVzcG9uc2VzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1NldFJlc3BvbnNlcygpCisJICogQHNlZSAjZ2V0UmVzcG9uc2VzKCkKKwkgKiBAc2VlICNzZXRSZXNwb25zZXMoQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRSZXNwb25zZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkFkZHJlc3NpbmdUeXBlI2dldFJlc3BvbnNlcyA8ZW0+UmVzcG9uc2VzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldFJlc3BvbnNlcygpCisJICogQHNlZSAjZ2V0UmVzcG9uc2VzKCkKKwkgKiBAc2VlICNzZXRSZXNwb25zZXMoQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUpCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNTZXRSZXNwb25zZXMoKTsKKworfSAvLyBBZGRyZXNzaW5nVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0RhdGFTb3VyY2VUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRGF0YVNvdXJjZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2ZhNTJlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0RhdGFTb3VyY2VUeXBlLmphdmEKQEAgLTAsMCArMSw2NzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRhdGEgU291cmNlIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBDb25maWd1cmF0aW9uIG9mIGEgRGF0YVNvdXJjZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKyAqICAgICAgIAorICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0U2VydmVyTmFtZSA8ZW0+U2VydmVyIE5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRQb3J0TnVtYmVyIDxlbT5Qb3J0IE51bWJlcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldERhdGFiYXNlTmFtZSA8ZW0+RGF0YWJhc2UgTmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldFVybCA8ZW0+VXJsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0VXNlciA8ZW0+VXNlcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldFBhc3N3b3JkIDxlbT5QYXNzd29yZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldFByb3BlcnR5IDxlbT5Qcm9wZXJ0eTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldExvZ2luVGltZW91dCA8ZW0+TG9naW4gVGltZW91dDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2lzVHJhbnNhY3Rpb25hbCA8ZW0+VHJhbnNhY3Rpb25hbDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldElzb2xhdGlvbkxldmVsIDxlbT5Jc29sYXRpb24gTGV2ZWw8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRJbml0aWFsUG9vbFNpemUgPGVtPkluaXRpYWwgUG9vbCBTaXplPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0TWF4UG9vbFNpemUgPGVtPk1heCBQb29sIFNpemU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRNaW5Qb29sU2l6ZSA8ZW0+TWluIFBvb2wgU2l6ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldE1heElkbGVUaW1lIDxlbT5NYXggSWRsZSBUaW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0TWF4U3RhdGVtZW50cyA8ZW0+TWF4IFN0YXRlbWVudHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldERhdGFTb3VyY2VUeXBlKCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIERhdGFTb3VyY2VUeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgRGVzY3JpcHRpb24gb2YgdGhpcyBEYXRhU291cmNlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihEZXNjcmlwdGlvbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldERhdGFTb3VyY2VUeXBlX0Rlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGVzY3JpcHRpb24oRGVzY3JpcHRpb24gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIG5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIEpOREkgbmFtZSBvZiB0aGUKKwkgKiAgICAgICAgICAgICBkYXRhIHNvdXJjZSBiZWluZyBkZWZpbmVkLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RGF0YVNvdXJjZVR5cGVfTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXROYW1lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgRGF0YVNvdXJjZSwgWEFEYXRhU291cmNlIG9yIENvbm5lY3Rpb25Qb29sRGF0YVNvdXJjZQorCSAqICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGNsYXNzLgorCSAqIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENsYXNzTmFtZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXREYXRhU291cmNlVHlwZV9DbGFzc05hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIERhdGFiYXNlIHNlcnZlciBuYW1lLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZlciBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRTZXJ2ZXJOYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldERhdGFTb3VyY2VUeXBlX1NlcnZlck5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0U2VydmVyTmFtZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldFNlcnZlck5hbWUgPGVtPlNlcnZlciBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2ZXIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0U2VydmVyTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U2VydmVyTmFtZShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9ydCBOdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFBvcnQgbnVtYmVyIHdoZXJlIGEgc2VydmVyIGlzIGxpc3RlbmluZyBmb3IgcmVxdWVzdHMuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBOdW1iZXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFBvcnROdW1iZXIoQmlnSW50ZWdlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldERhdGFTb3VyY2VUeXBlX1BvcnROdW1iZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlCaWdJbnRlZ2VyIGdldFBvcnROdW1iZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRQb3J0TnVtYmVyIDxlbT5Qb3J0IE51bWJlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9ydCBOdW1iZXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFBvcnROdW1iZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBvcnROdW1iZXIoQmlnSW50ZWdlciB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXRhYmFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBOYW1lIG9mIGEgZGF0YWJhc2Ugb24gYSBzZXJ2ZXIuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YWJhc2UgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGF0YWJhc2VOYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldERhdGFTb3VyY2VUeXBlX0RhdGFiYXNlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXREYXRhYmFzZU5hbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXREYXRhYmFzZU5hbWUgPGVtPkRhdGFiYXNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGFiYXNlIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERhdGFiYXNlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGF0YWJhc2VOYW1lKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vcmw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIDwhW0NEQVRBW1sKKwkgKiAgICAgICAgICAgICBBIEpEQkMgVVJMLiBJZiB0aGUgPGNvZGU+dXJsPC9jb2RlPiBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQKKwkgKiAgICAgICAgICAgICBhbG9uZyB3aXRoIG90aGVyIHN0YW5kYXJkIDxjb2RlPkRhdGFTb3VyY2U8L2NvZGU+IHByb3BlcnRpZXMKKwkgKiAgICAgICAgICAgICBzdWNoIGFzIDxjb2RlPnNlcnZlck5hbWU8L2NvZGU+LCA8Y29kZT5kYXRhYmFzZU5hbWU8L2NvZGU+CisJICogICAgICAgICAgICAgYW5kIDxjb2RlPnBvcnROdW1iZXI8L2NvZGU+LCB0aGUgbW9yZSBzcGVjaWZpYyBwcm9wZXJ0aWVzIHdpbGwKKwkgKiAgICAgICAgICAgICB0YWtlIHByZWNlZGVuY2UgYW5kIDxjb2RlPnVybDwvY29kZT4gd2lsbCBiZSBpZ25vcmVkLgorCSAqICAgICAgICAgICAgIAorCSAqIF1dPgorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVybDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VXJsKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldERhdGFTb3VyY2VUeXBlX1VybCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRVcmwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRVcmwgPGVtPlVybDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXJsPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRVcmwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFVybChTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNlcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVXNlciBuYW1lIHRvIHVzZSBmb3IgY29ubmVjdGlvbiBhdXRoZW50aWNhdGlvbi4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2VyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRVc2VyKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldERhdGFTb3VyY2VUeXBlX1VzZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0VXNlcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldFVzZXIgPGVtPlVzZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVzZXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFVzZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFVzZXIoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhc3N3b3JkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBQYXNzd29yZCB0byB1c2UgZm9yIGNvbm5lY3Rpb24gYXV0aGVudGljYXRpb24uCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFzc3dvcmQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFBhc3N3b3JkKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldERhdGFTb3VyY2VUeXBlX1Bhc3N3b3JkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFBhc3N3b3JkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0UGFzc3dvcmQgPGVtPlBhc3N3b3JkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXNzd29yZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0UGFzc3dvcmQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBhc3N3b3JkKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qcm9wZXJ0eVR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgSkRCQyBEYXRhU291cmNlIHByb3BlcnR5LiAgVGhpcyBtYXkgYmUgYSB2ZW5kb3Itc3BlY2lmaWMKKwkgKiAgICAgICAgICAgICBwcm9wZXJ0eSBvciBhIGxlc3MgY29tbW9ubHkgdXNlZCBEYXRhU291cmNlIHByb3BlcnR5LgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RGF0YVNvdXJjZVR5cGVfUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PFByb3BlcnR5VHlwZT4gZ2V0UHJvcGVydHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvZ2luIFRpbWVvdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFNldHMgdGhlIG1heGltdW0gdGltZSBpbiBzZWNvbmRzIHRoYXQgdGhpcyBkYXRhIHNvdXJjZQorCSAqICAgICAgICAgICAgIHdpbGwgd2FpdCB3aGlsZSBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gYSBkYXRhYmFzZS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2dpbiBUaW1lb3V0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRMb2dpblRpbWVvdXQoQmlnSW50ZWdlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldERhdGFTb3VyY2VUeXBlX0xvZ2luVGltZW91dCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUJpZ0ludGVnZXIgZ2V0TG9naW5UaW1lb3V0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0TG9naW5UaW1lb3V0IDxlbT5Mb2dpbiBUaW1lb3V0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2dpbiBUaW1lb3V0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRMb2dpblRpbWVvdXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldExvZ2luVGltZW91dChCaWdJbnRlZ2VyIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFNldCB0byBmYWxzZSBpZiBjb25uZWN0aW9ucyBzaG91bGQgbm90IHBhcnRpY2lwYXRlIGluCisJICogICAgICAgICAgICAgdHJhbnNhY3Rpb25zLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uYWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25hbCgpCisJICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvbmFsKCkKKwkgKiBAc2VlICNzZXRUcmFuc2FjdGlvbmFsKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXREYXRhU291cmNlVHlwZV9UcmFuc2FjdGlvbmFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1RyYW5zYWN0aW9uYWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNpc1RyYW5zYWN0aW9uYWwgPGVtPlRyYW5zYWN0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uYWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25hbCgpCisJICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvbmFsKCkKKwkgKiBAc2VlICNpc1RyYW5zYWN0aW9uYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRyYW5zYWN0aW9uYWwoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNpc1RyYW5zYWN0aW9uYWwgPGVtPlRyYW5zYWN0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25hbCgpCisJICogQHNlZSAjaXNUcmFuc2FjdGlvbmFsKCkKKwkgKiBAc2VlICNzZXRUcmFuc2FjdGlvbmFsKGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRUcmFuc2FjdGlvbmFsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNpc1RyYW5zYWN0aW9uYWwgPGVtPlRyYW5zYWN0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uYWw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldFRyYW5zYWN0aW9uYWwoKQorCSAqIEBzZWUgI2lzVHJhbnNhY3Rpb25hbCgpCisJICogQHNlZSAjc2V0VHJhbnNhY3Rpb25hbChib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25hbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXNvbGF0aW9uIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLklzb2xhdGlvbkxldmVsVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBJc29sYXRpb24gbGV2ZWwgZm9yIGNvbm5lY3Rpb25zLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzb2xhdGlvbiBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSXNvbGF0aW9uTGV2ZWxUeXBlCisJICogQHNlZSAjaXNTZXRJc29sYXRpb25MZXZlbCgpCisJICogQHNlZSAjdW5zZXRJc29sYXRpb25MZXZlbCgpCisJICogQHNlZSAjc2V0SXNvbGF0aW9uTGV2ZWwoSXNvbGF0aW9uTGV2ZWxUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RGF0YVNvdXJjZVR5cGVfSXNvbGF0aW9uTGV2ZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJc29sYXRpb25MZXZlbFR5cGUgZ2V0SXNvbGF0aW9uTGV2ZWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRJc29sYXRpb25MZXZlbCA8ZW0+SXNvbGF0aW9uIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jc29sYXRpb24gTGV2ZWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLklzb2xhdGlvbkxldmVsVHlwZQorCSAqIEBzZWUgI2lzU2V0SXNvbGF0aW9uTGV2ZWwoKQorCSAqIEBzZWUgI3Vuc2V0SXNvbGF0aW9uTGV2ZWwoKQorCSAqIEBzZWUgI2dldElzb2xhdGlvbkxldmVsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJc29sYXRpb25MZXZlbChJc29sYXRpb25MZXZlbFR5cGUgdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0SXNvbGF0aW9uTGV2ZWwgPGVtPklzb2xhdGlvbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTZXRJc29sYXRpb25MZXZlbCgpCisJICogQHNlZSAjZ2V0SXNvbGF0aW9uTGV2ZWwoKQorCSAqIEBzZWUgI3NldElzb2xhdGlvbkxldmVsKElzb2xhdGlvbkxldmVsVHlwZSkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCB1bnNldElzb2xhdGlvbkxldmVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRJc29sYXRpb25MZXZlbCA8ZW0+SXNvbGF0aW9uIExldmVsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jc29sYXRpb24gTGV2ZWw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldElzb2xhdGlvbkxldmVsKCkKKwkgKiBAc2VlICNnZXRJc29sYXRpb25MZXZlbCgpCisJICogQHNlZSAjc2V0SXNvbGF0aW9uTGV2ZWwoSXNvbGF0aW9uTGV2ZWxUeXBlKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0SXNvbGF0aW9uTGV2ZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXRpYWwgUG9vbCBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBOdW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCB3aGVuIGEKKwkgKiAgICAgICAgICAgICBjb25uZWN0aW9uIHBvb2wgaXMgaW5pdGlhbGl6ZWQuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBQb29sIFNpemU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEluaXRpYWxQb29sU2l6ZShCaWdJbnRlZ2VyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RGF0YVNvdXJjZVR5cGVfSW5pdGlhbFBvb2xTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQmlnSW50ZWdlciBnZXRJbml0aWFsUG9vbFNpemUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRJbml0aWFsUG9vbFNpemUgPGVtPkluaXRpYWwgUG9vbCBTaXplPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIFBvb2wgU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SW5pdGlhbFBvb2xTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbml0aWFsUG9vbFNpemUoQmlnSW50ZWdlciB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXggUG9vbCBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHNob3VsZCBiZSBjb25jdXJyZW50bHkKKwkgKiAgICAgICAgICAgICBhbGxvY2F0ZWQgZm9yIGEgY29ubmVjdGlvbiBwb29sLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1heCBQb29sIFNpemU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1heFBvb2xTaXplKEJpZ0ludGVnZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXREYXRhU291cmNlVHlwZV9NYXhQb29sU2l6ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUJpZ0ludGVnZXIgZ2V0TWF4UG9vbFNpemUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRNYXhQb29sU2l6ZSA8ZW0+TWF4IFBvb2wgU2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWF4IFBvb2wgU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TWF4UG9vbFNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1heFBvb2xTaXplKEJpZ0ludGVnZXIgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWluIFBvb2wgU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgTWluaW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCBzaG91bGQgYmUgY29uY3VycmVudGx5CisJICogICAgICAgICAgICAgYWxsb2NhdGVkIGZvciBhIGNvbm5lY3Rpb24gcG9vbC4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaW4gUG9vbCBTaXplPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNaW5Qb29sU2l6ZShCaWdJbnRlZ2VyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RGF0YVNvdXJjZVR5cGVfTWluUG9vbFNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlCaWdJbnRlZ2VyIGdldE1pblBvb2xTaXplKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0TWluUG9vbFNpemUgPGVtPk1pbiBQb29sIFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbiBQb29sIFNpemU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1pblBvb2xTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNaW5Qb29sU2l6ZShCaWdJbnRlZ2VyIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1heCBJZGxlIFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IGEgcGh5c2ljYWwgY29ubmVjdGlvbiBzaG91bGQKKwkgKiAgICAgICAgICAgICByZW1haW4gdW51c2VkIGluIHRoZSBwb29sIGJlZm9yZSB0aGUgY29ubmVjdGlvbiBpcworCSAqICAgICAgICAgICAgIGNsb3NlZCBmb3IgYSBjb25uZWN0aW9uIHBvb2wuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWF4IElkbGUgVGltZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TWF4SWRsZVRpbWUoQmlnSW50ZWdlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldERhdGFTb3VyY2VUeXBlX01heElkbGVUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQmlnSW50ZWdlciBnZXRNYXhJZGxlVGltZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldE1heElkbGVUaW1lIDxlbT5NYXggSWRsZSBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXggSWRsZSBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNYXhJZGxlVGltZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TWF4SWRsZVRpbWUoQmlnSW50ZWdlciB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXggU3RhdGVtZW50czwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIHRvdGFsIG51bWJlciBvZiBzdGF0ZW1lbnRzIHRoYXQgYSBjb25uZWN0aW9uIHBvb2wKKwkgKiAgICAgICAgICAgICBzaG91bGQga2VlcCBvcGVuLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1heCBTdGF0ZW1lbnRzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNYXhTdGF0ZW1lbnRzKEJpZ0ludGVnZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXREYXRhU291cmNlVHlwZV9NYXhTdGF0ZW1lbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQmlnSW50ZWdlciBnZXRNYXhTdGF0ZW1lbnRzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0TWF4U3RhdGVtZW50cyA8ZW0+TWF4IFN0YXRlbWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1heCBTdGF0ZW1lbnRzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNYXhTdGF0ZW1lbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXhTdGF0ZW1lbnRzKEJpZ0ludGVnZXIgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJZChTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXREYXRhU291cmNlVHlwZV9JZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRJZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOworCit9IC8vIERhdGFTb3VyY2VUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRGVzY3JpcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9EZXNjcmlwdGlvbi5qYXZhCmluZGV4IDljNmMyZjEuLjVhNDQ1MzcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9EZXNjcmlwdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9EZXNjcmlwdGlvbi5qYXZhCkBAIC0xOSwxOSArMTksMjAgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgZGVzY3JpcHRpb24gdHlwZSBpcyB1c2VkIGJ5IGEgZGVzY3JpcHRpb24gZWxlbWVudCB0bwotICogCXByb3ZpZGUgdGV4dCBkZXNjcmliaW5nIHRoZSBwYXJlbnQgZWxlbWVudC4gIFRoZSBlbGVtZW50cwotICogCXRoYXQgdXNlIHRoaXMgdHlwZSBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUKLSAqIAlEZXBsb3ltZW50IENvbXBvbmVudCdzIERlcGxveW1lbnQgRmlsZSBmaWxlIHByb2R1Y2VyIHdhbnRzCi0gKiAJdG8gcHJvdmlkZSB0byB0aGUgY29uc3VtZXIgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLSAqIAlEZXBsb3ltZW50IEZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlCi0gKiAJdG9vbHMgdXNlZCBieSBzdWNoIGEgRGVwbG95bWVudCBGaWxlIGNvbnN1bWVyIHdpbGwgZGlzcGxheQotICogCXRoZSBkZXNjcmlwdGlvbiB3aGVuIHByb2Nlc3NpbmcgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQKLSAqIAljb250YWlucyB0aGUgZGVzY3JpcHRpb24uCi0gKiAKLSAqIAlUaGUgbGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKLSAqIAlkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBpbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgImVuIiAoRW5nbGlzaCkuCi0gKiAKKyAqICAgICAgICAgVGhlIGRlc2NyaXB0aW9uIHR5cGUgaXMgdXNlZCBieSBhIGRlc2NyaXB0aW9uIGVsZW1lbnQgdG8KKyAqICAgICAgICAgcHJvdmlkZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHBhcmVudCBlbGVtZW50LiAgVGhlIGVsZW1lbnRzCisgKiAgICAgICAgIHRoYXQgdXNlIHRoaXMgdHlwZSBzaG91bGQgaW5jbHVkZSBhbnkgaW5mb3JtYXRpb24gdGhhdCB0aGUKKyAqICAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUgZmlsZSBwcm9kdWNlciB3YW50cworICogICAgICAgICB0byBwcm92aWRlIHRvIHRoZSBjb25zdW1lciBvZiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncworICogICAgICAgICBEZXBsb3ltZW50IEZpbGUgKGkuZS4sIHRvIHRoZSBEZXBsb3llcikuIFR5cGljYWxseSwgdGhlCisgKiAgICAgICAgIHRvb2xzIHVzZWQgYnkgc3VjaCBhIERlcGxveW1lbnQgRmlsZSBjb25zdW1lciB3aWxsIGRpc3BsYXkKKyAqICAgICAgICAgdGhlIGRlc2NyaXB0aW9uIHdoZW4gcHJvY2Vzc2luZyB0aGUgcGFyZW50IGVsZW1lbnQgdGhhdAorICogICAgICAgICBjb250YWlucyB0aGUgZGVzY3JpcHRpb24uCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgbGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKKyAqICAgICAgICAgZGVzY3JpcHRpb24gaXMgcHJvdmlkZWQgaW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpLiAKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTc4LDE1ICs3OSwzOCBAQAogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQXR0ZW1wdGluZyB0byBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCi0JICogICAgICAgICAgY29kZXMgYXMgdGhlIGVudW1lcmF0ZWQgcG9zc2libGUgdmFsdWVzIGlzIHByb2JhYmx5IG5ldmVyCi0JICogICAgICAgICAgZ29pbmcgdG8gYmUgYSByZWFsaXN0aWMgcG9zc2liaWxpdHkuICBTZWUKLQkgKiAgICAgICAgICBSRkMgMzA2NiBhdCBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMzMDY2LnR4dCBhbmQgdGhlIElBTkEgcmVnaXN0cnkKLQkgKiAgICAgICAgICBhdCBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2xhbmctdGFnLWFwcHMuaHRtIGZvcgotCSAqICAgICAgICAgIGZ1cnRoZXIgaW5mb3JtYXRpb24uCiAJICogCi0JICogICAgICAgICAgVGhlIHVuaW9uIGFsbG93cyBmb3IgdGhlICd1bi1kZWNsYXJhdGlvbicgb2YgeG1sOmxhbmcgd2l0aAotCSAqICAgICAgICAgIHRoZSBlbXB0eSBzdHJpbmcuCisJICogICAgIDxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorCSAqICAgICAgCisJICogICAgICAgPGgzPmxhbmcgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTwvaDM+CisJICogICAgICAgPHA+CisJICogICAgICAgIGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCisJICogICAgICAgIGlzIGEgbGFuZ3VhZ2UgY29kZSBmb3IgdGhlIG5hdHVyYWwgbGFuZ3VhZ2Ugb2YgdGhlIGNvbnRlbnQgb2YKKwkgKiAgICAgICAgYW55IGVsZW1lbnQ7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKKwkgKiAgICAgICAgYnkgdmlydHVlIG9mIGl0cyBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi48L3A+CisJICogICAgICAKKwkgKiAgICAgPC9kaXY+CisJICogICAgIDxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorCSAqICAgICAgPGg0Pk5vdGVzPC9oND4KKwkgKiAgICAgIDxwPgorCSAqICAgICAgIEF0dGVtcHRpbmcgdG8gaW5zdGFsbCB0aGUgcmVsZXZhbnQgSVNPIDItIGFuZCAzLWxldHRlcgorCSAqICAgICAgIGNvZGVzIGFzIHRoZSBlbnVtZXJhdGVkIHBvc3NpYmxlIHZhbHVlcyBpcyBwcm9iYWJseSBuZXZlcgorCSAqICAgICAgIGdvaW5nIHRvIGJlIGEgcmVhbGlzdGljIHBvc3NpYmlsaXR5LiAgCisJICogICAgICA8L3A+CisJICogICAgICA8cD4KKwkgKiAgICAgICBTZWUgQkNQIDQ3IGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL2JjcC9iY3A0Ny50eHQiPgorCSAqICAgICAgICBodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9iY3AvYmNwNDcudHh0PC9hPgorCSAqICAgICAgIGFuZCB0aGUgSUFOQSBsYW5ndWFnZSBzdWJ0YWcgcmVnaXN0cnkgYXQKKwkgKiAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2xhbmd1YWdlLXN1YnRhZy1yZWdpc3RyeSI+CisJICogICAgICAgIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbGFuZ3VhZ2Utc3VidGFnLXJlZ2lzdHJ5PC9hPgorCSAqICAgICAgIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorCSAqICAgICAgPC9wPgorCSAqICAgICAgPHA+CisJICogICAgICAgVGhlIHVuaW9uIGFsbG93cyBmb3IgdGhlICd1bi1kZWNsYXJhdGlvbicgb2YgeG1sOmxhbmcgd2l0aAorCSAqICAgICAgIHRoZSBlbXB0eSBzdHJpbmcuCisJICogICAgICA8L3A+CisJICogICAgIDwvZGl2PgorCSAqICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYW5nPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRMYW5nKFN0cmluZykKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9EaXNwbGF5TmFtZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0Rpc3BsYXlOYW1lLmphdmEKaW5kZXggMjIyOTYxYS4uZGM0OTVmNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0Rpc3BsYXlOYW1lLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0Rpc3BsYXlOYW1lLmphdmEKQEAgLTE4LDIyICsxOCwyMiBAQAogICoKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCi0gKiAJCi0gKiAKLSAqIAkgIFRoZSBkaXNwbGF5LW5hbWUgdHlwZSBjb250YWlucyBhIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZAotICogCSAgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkIGJ5IGRpc3BsYXktbmFtZQotICogCSAgZWxlbWVudHMuICBUaGUgZGlzcGxheSBuYW1lIG5lZWQgbm90IGJlIHVuaXF1ZS4KLSAqIAotICogCSAgRXhhbXBsZToKLSAqIAotICogCSAgLi4uCi0gKiAJICAgICAmbHQ7ZGlzcGxheS1uYW1lIHhtbDpsYW5nPSJlbiImZ3Q7Ci0gKiAJICAgICAgIEVtcGxveWVlIFNlbGYgU2VydmljZQotICogCSAgICAgJmx0Oy9kaXNwbGF5LW5hbWUmZ3Q7Ci0gKiAKLSAqIAkgIFRoZSB2YWx1ZSBvZiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIGlzICJlbiIgKEVuZ2xpc2gpIGJ5IGRlZmF1bHQuCi0gKiAKLSAqIAkgIAorICogPCFbQ0RBVEFbWworICogICAgICAgICBUaGUgZGlzcGxheS1uYW1lIHR5cGUgY29udGFpbnMgYSBzaG9ydCBuYW1lIHRoYXQgaXMgaW50ZW5kZWQKKyAqICAgICAgICAgdG8gYmUgZGlzcGxheWVkIGJ5IHRvb2xzLiBJdCBpcyB1c2VkIGJ5IGRpc3BsYXktbmFtZQorICogICAgICAgICBlbGVtZW50cy4gIFRoZSBkaXNwbGF5IG5hbWUgbmVlZCBub3QgYmUgdW5pcXVlLgorICogICAgICAgICAKKyAqICAgICAgICAgRXhhbXBsZTogCisgKiAgICAgICAgIAorICogICAgICAgICAuLi4KKyAqICAgICAgICAgPGRpc3BsYXktbmFtZSB4bWw6bGFuZz0iZW4iPgorICogICAgICAgICBFbXBsb3llZSBTZWxmIFNlcnZpY2UKKyAqICAgICAgICAgPC9kaXNwbGF5LW5hbWU+CisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBpcyAiZW4iIChFbmdsaXNoKSBieSBkZWZhdWx0LiAKKyAqICAgICAgICAgCisgKiBdXT4KKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtODAsMTUgKzgwLDM4IEBACiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBdHRlbXB0aW5nIHRvIGluc3RhbGwgdGhlIHJlbGV2YW50IElTTyAyLSBhbmQgMy1sZXR0ZXIKLQkgKiAgICAgICAgICBjb2RlcyBhcyB0aGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgaXMgcHJvYmFibHkgbmV2ZXIKLQkgKiAgICAgICAgICBnb2luZyB0byBiZSBhIHJlYWxpc3RpYyBwb3NzaWJpbGl0eS4gIFNlZQotCSAqICAgICAgICAgIFJGQyAzMDY2IGF0IGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMwNjYudHh0IGFuZCB0aGUgSUFOQSByZWdpc3RyeQotCSAqICAgICAgICAgIGF0IGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbGFuZy10YWctYXBwcy5odG0gZm9yCi0JICogICAgICAgICAgZnVydGhlciBpbmZvcm1hdGlvbi4KIAkgKiAKLQkgKiAgICAgICAgICBUaGUgdW5pb24gYWxsb3dzIGZvciB0aGUgJ3VuLWRlY2xhcmF0aW9uJyBvZiB4bWw6bGFuZyB3aXRoCi0JICogICAgICAgICAgdGhlIGVtcHR5IHN0cmluZy4KKwkgKiAgICAgPGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisJICogICAgICAKKwkgKiAgICAgICA8aDM+bGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpPC9oMz4KKwkgKiAgICAgICA8cD4KKwkgKiAgICAgICAgZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKKwkgKiAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgorCSAqICAgICAgICBhbnkgZWxlbWVudDsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAorCSAqICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLjwvcD4KKwkgKiAgICAgIAorCSAqICAgICA8L2Rpdj4KKwkgKiAgICAgPGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisJICogICAgICA8aDQ+Tm90ZXM8L2g0PgorCSAqICAgICAgPHA+CisJICogICAgICAgQXR0ZW1wdGluZyB0byBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCisJICogICAgICAgY29kZXMgYXMgdGhlIGVudW1lcmF0ZWQgcG9zc2libGUgdmFsdWVzIGlzIHByb2JhYmx5IG5ldmVyCisJICogICAgICAgZ29pbmcgdG8gYmUgYSByZWFsaXN0aWMgcG9zc2liaWxpdHkuICAKKwkgKiAgICAgIDwvcD4KKwkgKiAgICAgIDxwPgorCSAqICAgICAgIFNlZSBCQ1AgNDcgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvYmNwL2JjcDQ3LnR4dCI+CisJICogICAgICAgIGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL2JjcC9iY3A0Ny50eHQ8L2E+CisJICogICAgICAgYW5kIHRoZSBJQU5BIGxhbmd1YWdlIHN1YnRhZyByZWdpc3RyeSBhdAorCSAqICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbGFuZ3VhZ2Utc3VidGFnLXJlZ2lzdHJ5Ij4KKwkgKiAgICAgICAgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9sYW5ndWFnZS1zdWJ0YWctcmVnaXN0cnk8L2E+CisJICogICAgICAgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisJICogICAgICA8L3A+CisJICogICAgICA8cD4KKwkgKiAgICAgICBUaGUgdW5pb24gYWxsb3dzIGZvciB0aGUgJ3VuLWRlY2xhcmF0aW9uJyBvZiB4bWw6bGFuZyB3aXRoCisJICogICAgICAgdGhlIGVtcHR5IHN0cmluZy4KKwkgKiAgICAgIDwvcD4KKwkgKiAgICAgPC9kaXY+CisJICogICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldExhbmcoU3RyaW5nKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VqYkxvY2FsUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRWpiTG9jYWxSZWYuamF2YQppbmRleCBiYWZiZjVkLi42MzRjODRkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRWpiTG9jYWxSZWYuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRWpiTG9jYWxSZWYuamF2YQpAQCAtMjAsMjYgKzIwLDI3IEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIGVqYi1sb2NhbC1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyBmb3IKLSAqIAl0aGUgZGVjbGFyYXRpb24gb2YgYSByZWZlcmVuY2UgdG8gYW4gZW50ZXJwcmlzZSBiZWFuJ3MgbG9jYWwKLSAqIAlob21lIG9yIHRvIHRoZSBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4KKyAqICAgICAgICAgVGhlIGVqYi1sb2NhbC1yZWZUeXBlIGlzIHVzZWQgYnkgZWpiLWxvY2FsLXJlZiBlbGVtZW50cyBmb3IKKyAqICAgICAgICAgdGhlIGRlY2xhcmF0aW9uIG9mIGEgcmVmZXJlbmNlIHRvIGFuIGVudGVycHJpc2UgYmVhbidzIGxvY2FsCisgKiAgICAgICAgIGhvbWUgb3IgdG8gdGhlIGxvY2FsIGJ1c2luZXNzIGludGVyZmFjZSBvZiBhIDMuMCBiZWFuLgogICogICAgICAgICBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0gKiAKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICogCSAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZiB0aGUgRGVwbG95bWVudAotICogCSAgICAgIENvbXBvbmVudCB0aGF0J3MgcmVmZXJlbmNpbmcgdGhlIGVudGVycHJpc2UgYmVhbi4KLSAqIAkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAqIAkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgbG9jYWwgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkCi0gKiAgICAgICAgICAgICAgIGVudGVycHJpc2UgYmVhbiBvciB0aGUgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIHRoZQotICogICAgICAgICAgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KLSAqIAkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgbG9jYWwgaG9tZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQKLSAqICAgICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuLiBOb3QgYXBwbGljYWJsZSBpZiB0aGlzIGVqYi1sb2NhbC1yZWYgcmVmZXJzCi0gKiAgICAgICAgICAgICAgIHRvIHRoZSBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgYSAzLjAgYmVhbi4KLSAqIAkgICAgLSBvcHRpb25hbCBlamItbGluayBpbmZvcm1hdGlvbiwgdXNlZCB0byBzcGVjaWZ5IHRoZQotICogCSAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gKiAgICAgICAgICAgICAtIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YgdGhlIG5hbWVkIGVudGVycHJpc2UKLSAqICAgICAgICAgICAgICAgYmVhbiBpbnRvIGEgY29tcG9uZW50IGZpZWxkIG9yIHByb3BlcnR5LgotICogCisgKiAgICAgICAgIAorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCisgKiAgICAgICAgIC0gdGhlIEVKQiByZWZlcmVuY2UgbmFtZSB1c2VkIGluIHRoZSBjb2RlIG9mIHRoZSBEZXBsb3ltZW50IAorICogICAgICAgICBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlIGJlYW4uCisgKiAgICAgICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCisgKiAgICAgICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGxvY2FsIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZCAKKyAqICAgICAgICAgZW50ZXJwcmlzZSBiZWFuIG9yIHRoZSBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2Ugb2YgdGhlIAorICogICAgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KKyAqICAgICAgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgbG9jYWwgaG9tZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgCisgKiAgICAgICAgIGVudGVycHJpc2UgYmVhbi4gTm90IGFwcGxpY2FibGUgaWYgdGhpcyBlamItbG9jYWwtcmVmIHJlZmVycworICogICAgICAgICB0byB0aGUgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uCisgKiAgICAgICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUgCisgKiAgICAgICAgIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCisgKiAgICAgICAgIC0gb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZiB0aGUgbmFtZWQgZW50ZXJwcmlzZSAgCisgKiAgICAgICAgIGJlYW4gaW50byBhIGNvbXBvbmVudCBmaWVsZCBvciBwcm9wZXJ0eS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTU0LDYgKzU1LDcgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0TG9va3VwTmFtZSA8ZW0+TG9va3VwIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgogICogPC91bD4KICAqIDwvcD4KQEAgLTc2LDcgKzc4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYkxvY2FsUmVmX0Rlc2NyaXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7CisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTEwNSw3ICsxMDcsNiBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkVudGl0eSI8L2NvZGU+LgogCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlfS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtMjQwLDI2ICsyNDEsMjUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKLQkgKiAJICAgIAogCSAqIAotCSAqIAkgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlCi0JICogCSAgICAgIG1hcHBlZCB0by4gIFRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UsIGFzIGRlZmluZWQgYnkgdGhlCi0JICogCSAgICAgIHJlc291cmNlJ3MgbmFtZSBlbGVtZW50IG9yIGRlZmF1bHRlZCwgaXMgYSBuYW1lIHRoYXQgaXMKLQkgKiAJICAgICAgbG9jYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCB1c2luZyB0aGUgcmVzb3VyY2UuCi0JICogCSAgICAgIChJdCdzIGEgbmFtZSBpbiB0aGUgSk5ESSBqYXZhOmNvbXAvZW52IG5hbWVzcGFjZS4pICBNYW55Ci0JICogCSAgICAgIGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0byBtYXAgdGhlc2UgbG9jYWwKLQkgKiAJICAgICAgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbgotCSAqIAkgICAgICBzZXJ2ZXIuICBUaGlzIG1hcHBlZCBuYW1lIGlzIG9mdGVuIGEgZ2xvYmFsIEpOREkgbmFtZSwKLQkgKiAJICAgICAgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uCi0JICogCi0JICogCSAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IGFueQotCSAqIAkgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5Ci0JICogCSAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKLQkgKiAJICAgICAgcHJvZHVjdC1kZXBlbmRlbnQgYW5kIG9mdGVuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQuICBObwotCSAqIAkgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KLQkgKiAKLQkgKiAJICAgICAgCi0JICogCSAgCisJICogICAgICAgICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIHJlc291cmNlIHNob3VsZCBiZQorCSAqICAgICAgICAgICAgIG1hcHBlZCB0by4gIFRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UsIGFzIGRlZmluZWQgYnkgdGhlCisJICogICAgICAgICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcworCSAqICAgICAgICAgICAgIGxvY2FsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgdXNpbmcgdGhlIHJlc291cmNlLgorCSAqICAgICAgICAgICAgIChJdCdzIGEgbmFtZSBpbiB0aGUgSk5ESSBqYXZhOmNvbXAvZW52IG5hbWVzcGFjZS4pICBNYW55CisJICogICAgICAgICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAorCSAqICAgICAgICAgICAgIG5hbWVzIHRvIG5hbWVzIG9mIHJlc291cmNlcyBrbm93biB0byB0aGUgYXBwbGljYXRpb24KKwkgKiAgICAgICAgICAgICBzZXJ2ZXIuICBUaGlzIG1hcHBlZCBuYW1lIGlzIG9mdGVuIGEgZ2xvYmFsIEpOREkgbmFtZSwKKwkgKiAgICAgICAgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKKwkgKiAgICAgICAgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5CisJICogICAgICAgICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcworCSAqICAgICAgICAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KKwkgKiAgICAgICAgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCkBAIC0yOTEsNyArMjkxLDM2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJMb2NhbFJlZl9JbmplY3Rpb25UYXJnZXRzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCk7CisJTGlzdDxJbmplY3Rpb25UYXJnZXQ+IGdldEluamVjdGlvblRhcmdldHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvb2t1cCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgSk5ESSBuYW1lIHRvIGJlIGxvb2tlZCB1cCB0byByZXNvbHZlIGEgcmVzb3VyY2UgcmVmZXJlbmNlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvb2t1cCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRMb29rdXBOYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYkxvY2FsUmVmX0xvb2t1cE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0TG9va3VwTmFtZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldExvb2t1cE5hbWUgPGVtPkxvb2t1cCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb29rdXAgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TG9va3VwTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TG9va3VwTmFtZShTdHJpbmcgdmFsdWUpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FamJSZWYuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FamJSZWYuamF2YQppbmRleCA5NDEzZDhlLi44MTJmOGZmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRWpiUmVmLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VqYlJlZi5qYXZhCkBAIC0yMCwyNyArMjAsMjggQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgZWpiLXJlZlR5cGUgaXMgdXNlZCBieSBlamItcmVmIGVsZW1lbnRzIGZvciB0aGUKLSAqIAlkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lIG9yCi0gKiAgICAgICAgIHRvIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uCi0gKiAJVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgotICogCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqIAkgICAgLSB0aGUgRUpCIHJlZmVyZW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNvZGUgb2YKLSAqIAkgICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCi0gKiAJICAgICAgYmVhbi4KLSAqIAkgICAgLSB0aGUgb3B0aW9uYWwgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KLSAqICAgICAgICAgICAgIC0gdGhlIG9wdGlvbmFsIHJlbW90ZSBpbnRlcmZhY2Ugb2YgdGhlIHJlZmVyZW5jZWQgZW50ZXJwcmlzZSBiZWFuCi0gKiAgICAgICAgICAgICAgIG9yIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UKLSAqICAgICAgICAgICAgICAgYmVhbgotICogCSAgICAtIHRoZSBvcHRpb25hbCBleHBlY3RlZCBob21lIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZAotICogICAgICAgICAgICAgICBlbnRlcnByaXNlIGJlYW4uICBOb3QgYXBwbGljYWJsZSBpZiB0aGlzIGVqYi1yZWYKLSAqICAgICAgICAgICAgICAgcmVmZXJzIHRvIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uCi0gKiAJICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKLSAqIAkgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgotICogICAgICAgICAgICAgLSBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mIHRoZSBuYW1lZCBlbnRlcnByaXNlCi0gKiAgICAgICAgICAgICAgIGJlYW4gaW50byBhIGNvbXBvbmVudCBmaWVsZCBvciBwcm9wZXJ0eQotICogCisgKiAgICAgICAgIFRoZSBlamItcmVmVHlwZSBpcyB1c2VkIGJ5IGVqYi1yZWYgZWxlbWVudHMgZm9yIHRoZQorICogICAgICAgICBkZWNsYXJhdGlvbiBvZiBhIHJlZmVyZW5jZSB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBob21lIG9yCisgKiAgICAgICAgIHRvIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uICAKKyAqICAgICAgICAgVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOgorICogICAgICAgICAKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgorICogICAgICAgICAtIHRoZSBFSkIgcmVmZXJlbmNlIG5hbWUgdXNlZCBpbiB0aGUgY29kZSBvZgorICogICAgICAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgdGhhdCdzIHJlZmVyZW5jaW5nIHRoZSBlbnRlcnByaXNlCisgKiAgICAgICAgIGJlYW4uIAorICogICAgICAgICAtIHRoZSBvcHRpb25hbCBleHBlY3RlZCB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgorICogICAgICAgICAtIHRoZSBvcHRpb25hbCByZW1vdGUgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbgorICogICAgICAgICBvciB0aGUgcmVtb3RlIGJ1c2luZXNzIGludGVyZmFjZSBvZiB0aGUgcmVmZXJlbmNlZCBlbnRlcnByaXNlIAorICogICAgICAgICBiZWFuCisgKiAgICAgICAgIC0gdGhlIG9wdGlvbmFsIGV4cGVjdGVkIGhvbWUgaW50ZXJmYWNlIG9mIHRoZSByZWZlcmVuY2VkIAorICogICAgICAgICBlbnRlcnByaXNlIGJlYW4uICBOb3QgYXBwbGljYWJsZSBpZiB0aGlzIGVqYi1yZWYKKyAqICAgICAgICAgcmVmZXJzIHRvIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlIG9mIGEgMy4wIGJlYW4uCisgKiAgICAgICAgIC0gb3B0aW9uYWwgZWpiLWxpbmsgaW5mb3JtYXRpb24sIHVzZWQgdG8gc3BlY2lmeSB0aGUKKyAqICAgICAgICAgcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4KKyAqICAgICAgICAgLSBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mIHRoZSBuYW1lZCBlbnRlcnByaXNlCisgKiAgICAgICAgIGJlYW4gaW50byBhIGNvbXBvbmVudCBmaWVsZCBvciBwcm9wZXJ0eQorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNTUsNiArNTYsNyBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0TG9va3VwTmFtZSA8ZW0+TG9va3VwIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CkBAIC03Nyw3ICs3OSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFamJSZWZfRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMTA2LDcgKzEwOCw2IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iRW50aXR5IjwvY29kZT4uCiAJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGV9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CkBAIC0yNDEsMjYgKzI0MiwyNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAotCSAqIAkgICAgCiAJICogCi0JICogCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLQkgKiAJICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKLQkgKiAJICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcwotCSAqIAkgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLQkgKiAJICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKLQkgKiAJICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAotCSAqIAkgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0JICogCSAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAotCSAqIAkgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KLQkgKiAKLQkgKiAJICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICogCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgKiAJICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAqIAkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICogCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlCisJICogICAgICAgICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKKwkgKiAgICAgICAgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCisJICogICAgICAgICAgICAgbG9jYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCB1c2luZyB0aGUgcmVzb3VyY2UuCisJICogICAgICAgICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKKwkgKiAgICAgICAgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCisJICogICAgICAgICAgICAgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbgorCSAqICAgICAgICAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAorCSAqICAgICAgICAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IGFueQorCSAqICAgICAgICAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKKwkgKiAgICAgICAgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCisJICogICAgICAgICAgICAgcHJvZHVjdC1kZXBlbmRlbnQgYW5kIG9mdGVuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQuICBObworCSAqICAgICAgICAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRNYXBwZWROYW1lKFN0cmluZykKQEAgLTI5Miw3ICsyOTIsMzYgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYlJlZl9JbmplY3Rpb25UYXJnZXRzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCk7CisJTGlzdDxJbmplY3Rpb25UYXJnZXQ+IGdldEluamVjdGlvblRhcmdldHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvb2t1cCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgSk5ESSBuYW1lIHRvIGJlIGxvb2tlZCB1cCB0byByZXNvbHZlIGEgcmVzb3VyY2UgcmVmZXJlbmNlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvb2t1cCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRMb29rdXBOYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVqYlJlZl9Mb29rdXBOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldExvb2t1cE5hbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0TG9va3VwTmFtZSA8ZW0+TG9va3VwIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvb2t1cCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRMb29rdXBOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRMb29rdXBOYW1lKFN0cmluZyB2YWx1ZSk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VqYlJlZlR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FamJSZWZUeXBlLmphdmEKaW5kZXggZDYwN2U4NS4uMWRjMTNhYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VqYlJlZlR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRWpiUmVmVHlwZS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjQsMjEgKzI0LDQxIEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIGVqYi1yZWYtdHlwZVR5cGUgY29udGFpbnMgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlCi0gKiAJcmVmZXJlbmNlZCBlbnRlcnByaXNlIGJlYW4uCi0gKiAKLSAqIAlUaGUgZWpiLXJlZi10eXBlIGRlc2lnbmF0ZXMgYSB2YWx1ZQotICogCXRoYXQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqIAotICogCSAgICBFbnRpdHkKLSAqIAkgICAgU2Vzc2lvbgotICogCisgKiAgICAgICAgIFRoZSBlamItcmVmLXR5cGVUeXBlIGNvbnRhaW5zIHRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZQorICogICAgICAgICByZWZlcmVuY2VkIGVudGVycHJpc2UgYmVhbi4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBlamItcmVmLXR5cGUgZGVzaWduYXRlcyBhIHZhbHVlCisgKiAgICAgICAgIHRoYXQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqICAgICAgICAgCisgKiAgICAgICAgIEVudGl0eQorICogICAgICAgICBTZXNzaW9uCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1CiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RWpiUmVmVHlwZSgpCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFamJSZWZUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKK3B1YmxpYyBlbnVtIEVqYlJlZlR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCit7CisJLyoqCisJICogVGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0VOVElUWQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUVOVElUWV9MSVRFUkFMKDAsICJFbnRpdHkiLCAiRW50aXR5IiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNlc3Npb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU0VTU0lPTgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVNFU1NJT05fTElURVJBTCgxLCAiU2Vzc2lvbiIsICJTZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjgsMjYgKzg4LDYgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OID0gMTsKIAogCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFTlRJVFkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVqYlJlZlR5cGUgRU5USVRZX0xJVEVSQUwgPSBuZXcgRWpiUmVmVHlwZShFTlRJVFksICJFbnRpdHkiLCAiRW50aXR5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U2Vzc2lvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVNTSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFamJSZWZUeXBlIFNFU1NJT05fTElURVJBTCA9IG5ldyBFamJSZWZUeXBlKFNFU1NJT04sICJTZXNzaW9uIiwgIlNlc3Npb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMTA1LDcgKzEwNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEVqYlJlZlR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RWpiIFJlZiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgpAQCAtMTUwLDE3ICsxNTAsNzcgQEAKIAkJCWNhc2UgRU5USVRZOiByZXR1cm4gRU5USVRZX0xJVEVSQUw7CiAJCQljYXNlIFNFU1NJT046IHJldHVybiBTRVNTSU9OX0xJVEVSQUw7CiAJCX0KLQkJcmV0dXJuIG51bGw7CQorCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCiAJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwogCXByaXZhdGUgRWpiUmVmVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKIAl9CiAKLX0gLy9FamJSZWZUeXBlCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FbXB0eVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FbXB0eVR5cGUuamF2YQppbmRleCAwNjE3MjY3Li42NTUxNTBmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRW1wdHlUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0VtcHR5VHlwZS5qYXZhCkBAIC0xOSw5ICsxOSwxMCBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoaXMgdHlwZSBpcyB1c2VkIHRvIGRlc2lnbmF0ZSBhbiBlbXB0eQotICogCWVsZW1lbnQgd2hlbiB1c2VkLgotICogCisgKiAgICAgICAgIFRoaXMgdHlwZSBpcyB1c2VkIHRvIGRlc2lnbmF0ZSBhbiBlbXB0eQorICogICAgICAgICBlbGVtZW50IHdoZW4gdXNlZC4gCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1CiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvRW52RW50cnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FbnZFbnRyeS5qYXZhCmluZGV4IGJkMTU2ODUuLjE3NzQyNmEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FbnZFbnRyeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9FbnZFbnRyeS5qYXZhCkBAIC0yMCwyNiArMjAsMjcgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgZW52LWVudHJ5VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYW4gYXBwbGljYXRpb24ncwotICogCWVudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKLSAqIAlkZXNjcmlwdGlvbiwgdGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LCBhIHR5cGUKLSAqIAkob3B0aW9uYWwgaWYgdGhlIHZhbHVlIGlzIGluamVjdGVkLCBvdGhlcndpc2UgcmVxdWlyZWQpLCBhbmQKLSAqIAlhbiBvcHRpb25hbCB2YWx1ZS4KLSAqIAotICogCUl0IGFsc28gaW5jbHVkZXMgb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZgotICogCXRoZSBuYW1lZCByZXNvdXJjZSBpbnRvIGZpZWxkcyBvciBKYXZhQmVhbnMgcHJvcGVydGllcy4KLSAqIAotICogCUlmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBhbmQgaW5qZWN0aW9uIGlzIHJlcXVlc3RlZCwKLSAqIAlubyBpbmplY3Rpb24gd2lsbCBvY2N1ciBhbmQgbm8gZW50cnkgb2YgdGhlIHNwZWNpZmllZCBuYW1lCi0gKiAJd2lsbCBiZSBjcmVhdGVkLiAgVGhpcyBhbGxvd3MgYW4gaW5pdGlhbCB2YWx1ZSB0byBiZQotICogCXNwZWNpZmllZCBpbiB0aGUgc291cmNlIGNvZGUgd2l0aG91dCBiZWluZyBpbmNvcnJlY3RseQotICogCWNoYW5nZWQgd2hlbiBubyBvdmVycmlkZSBoYXMgYmVlbiBzcGVjaWZpZWQuCi0gKiAKLSAqIAlJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgYW5kIG5vIGluamVjdGlvbiBpcyByZXF1ZXN0ZWQsCi0gKiAJYSB2YWx1ZSBtdXN0IGJlIHN1cHBsaWVkIGR1cmluZyBkZXBsb3ltZW50LgotICogCi0gKiAJVGhpcyB0eXBlIGlzIHVzZWQgYnkgZW52LWVudHJ5IGVsZW1lbnRzLgotICogCisgKiAgICAgICAgIFRoZSBlbnYtZW50cnlUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhbiBhcHBsaWNhdGlvbidzCisgKiAgICAgICAgIGVudmlyb25tZW50IGVudHJ5LiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwKKyAqICAgICAgICAgZGVzY3JpcHRpb24sIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgYSB0eXBlCisgKiAgICAgICAgIChvcHRpb25hbCBpZiB0aGUgdmFsdWUgaXMgaW5qZWN0ZWQsIG90aGVyd2lzZSByZXF1aXJlZCksIGFuZAorICogICAgICAgICBhbiBvcHRpb25hbCB2YWx1ZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEl0IGFsc28gaW5jbHVkZXMgb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZgorICogICAgICAgICB0aGUgbmFtZWQgcmVzb3VyY2UgaW50byBmaWVsZHMgb3IgSmF2YUJlYW5zIHByb3BlcnRpZXMuCisgKiAgICAgICAgIAorICogICAgICAgICBJZiBhIHZhbHVlIGlzIG5vdCBzcGVjaWZpZWQgYW5kIGluamVjdGlvbiBpcyByZXF1ZXN0ZWQsCisgKiAgICAgICAgIG5vIGluamVjdGlvbiB3aWxsIG9jY3VyIGFuZCBubyBlbnRyeSBvZiB0aGUgc3BlY2lmaWVkIG5hbWUKKyAqICAgICAgICAgd2lsbCBiZSBjcmVhdGVkLiAgVGhpcyBhbGxvd3MgYW4gaW5pdGlhbCB2YWx1ZSB0byBiZQorICogICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIHNvdXJjZSBjb2RlIHdpdGhvdXQgYmVpbmcgaW5jb3JyZWN0bHkKKyAqICAgICAgICAgY2hhbmdlZCB3aGVuIG5vIG92ZXJyaWRlIGhhcyBiZWVuIHNwZWNpZmllZC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIElmIGEgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBhbmQgbm8gaW5qZWN0aW9uIGlzIHJlcXVlc3RlZCwKKyAqICAgICAgICAgYSB2YWx1ZSBtdXN0IGJlIHN1cHBsaWVkIGR1cmluZyBkZXBsb3ltZW50LiAKKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoaXMgdHlwZSBpcyB1c2VkIGJ5IGVudi1lbnRyeSBlbGVtZW50cy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTUyLDYgKzUzLDcgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlWYWx1ZSA8ZW0+RW52IEVudHJ5IFZhbHVlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldExvb2t1cE5hbWUgPGVtPkxvb2t1cCBOYW1lPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CkBAIC03NCw3ICs3Niw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFbnZFbnRyeV9EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW52IEVudHJ5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTgyLDIyICs4NCwyMiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIFRoZSBlbnYtZW50cnktbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgKiAJICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lCi0JICogCSAgICAgIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52Ci0JICogCSAgICAgIGNvbnRleHQuICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYQotCSAqIAkgICAgICBEZXBsb3ltZW50IENvbXBvbmVudC4gVGhlIHVuaXF1ZW5lc3MKLQkgKiAJICAgICAgY29uc3RyYWludHMgbXVzdCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZGVjbGFyZWQKLQkgKiAJICAgICAgY29udGV4dC4KLQkgKiAKLQkgKiAJICAgICAgRXhhbXBsZToKLQkgKiAKLQkgKiAJICAgICAgJmx0O2Vudi1lbnRyeS1uYW1lJmd0O21pbkFtb3VudCZsdDsvZW52LWVudHJ5LW5hbWUmZ3Q7Ci0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAorCSAqIDwhW0NEQVRBW1sKKwkgKiAgICAgICAgICAgICBUaGUgZW52LWVudHJ5LW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhCisJICogICAgICAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gIFRoZSBuYW1lCisJICogICAgICAgICAgICAgaXMgYSBKTkRJIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYKKwkgKiAgICAgICAgICAgICBjb250ZXh0LiAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgCisJICogICAgICAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQuIFRoZSB1bmlxdWVuZXNzCisJICogICAgICAgICAgICAgY29uc3RyYWludHMgbXVzdCBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgZGVjbGFyZWQKKwkgKiAgICAgICAgICAgICBjb250ZXh0LgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEV4YW1wbGU6CisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm1pbkFtb3VudDwvZW52LWVudHJ5LW5hbWU+CisJICogICAgICAgICAgICAgCisJICogXV0+CisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJ5IE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldEVudkVudHJ5TmFtZShTdHJpbmcpCkBAIC0xMTgsNzMgKzEyMCw0MiBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW52IEVudHJ5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iamF2YS5sYW5nLkJvb2xlYW4iPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlfS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIFRoZSBlbnYtZW50cnktdHlwZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBKYXZhIGxhbmd1YWdlCi0JICogCSAgICAgIHR5cGUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LiAgSWYgYW4gaW5qZWN0aW9uIHRhcmdldAotCSAqIAkgICAgICBpcyBzcGVjaWZpZWQgZm9yIHRoZSBlbnZpcm9ubWVudCBlbnRyeSwgdGhlIHR5cGUgbWF5Ci0JICogCSAgICAgIGJlIG9taXR0ZWQsIG9yIG11c3QgbWF0Y2ggdGhlIHR5cGUgb2YgdGhlIGluamVjdGlvbgotCSAqIAkgICAgICB0YXJnZXQuICBJZiBubyBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgdGhlIHR5cGUKLQkgKiAJICAgICAgaXMgcmVxdWlyZWQuCi0JICogCi0JICogCSAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogCSAgICAgICZsdDtlbnYtZW50cnktdHlwZSZndDtqYXZhLmxhbmcuSW50ZWdlciZsdDsvZW52LWVudHJ5LXR5cGUmZ3Q7Ci0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAorCSAqIDwhW0NEQVRBW1sKKwkgKiAgICAgICAgICAgICBUaGUgZW52LWVudHJ5LXR5cGUgZWxlbWVudCBjb250YWlucyB0aGUgSmF2YSBsYW5ndWFnZQorCSAqICAgICAgICAgICAgIHR5cGUgb2YgdGhlIGVudmlyb25tZW50IGVudHJ5LiAgSWYgYW4gaW5qZWN0aW9uIHRhcmdldAorCSAqICAgICAgICAgICAgIGlzIHNwZWNpZmllZCBmb3IgdGhlIGVudmlyb25tZW50IGVudHJ5LCB0aGUgdHlwZSBtYXkKKwkgKiAgICAgICAgICAgICBiZSBvbWl0dGVkLCBvciBtdXN0IG1hdGNoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KKwkgKiAgICAgICAgICAgICB0YXJnZXQuICBJZiBubyBpbmplY3Rpb24gdGFyZ2V0IGlzIHNwZWNpZmllZCwgdGhlIHR5cGUKKwkgKiAgICAgICAgICAgICBpcyByZXF1aXJlZC4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBFeGFtcGxlOgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+CisJICogICAgICAgICAgICAgCisJICogXV0+CisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5VHlwZQotCSAqIEBzZWUgI2lzU2V0RW52RW50cnlUeXBlKCkKLQkgKiBAc2VlICN1bnNldEVudkVudHJ5VHlwZSgpCi0JICogQHNlZSAjc2V0RW52RW50cnlUeXBlKEVudkVudHJ5VHlwZSkKKwkgKiBAc2VlICNzZXRFbnZFbnRyeVR5cGUoU3RyaW5nKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0RW52RW50cnlfRW52RW50cnlUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JRW52RW50cnlUeXBlIGdldEVudkVudHJ5VHlwZSgpOworCVN0cmluZyBnZXRFbnZFbnRyeVR5cGUoKTsKIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRFbnZFbnRyeVR5cGUgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnYgRW50cnkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlCi0JICogQHNlZSAjaXNTZXRFbnZFbnRyeVR5cGUoKQotCSAqIEBzZWUgI3Vuc2V0RW52RW50cnlUeXBlKCkKIAkgKiBAc2VlICNnZXRFbnZFbnRyeVR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQl2b2lkIHNldEVudkVudHJ5VHlwZShFbnZFbnRyeVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlUeXBlIDxlbT5FbnYgRW50cnkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFbnZFbnRyeVR5cGUoKQotCSAqIEBzZWUgI2dldEVudkVudHJ5VHlwZSgpCi0JICogQHNlZSAjc2V0RW52RW50cnlUeXBlKEVudkVudHJ5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVudkVudHJ5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlUeXBlIDxlbT5FbnYgRW50cnkgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVudkVudHJ5VHlwZSgpCi0JICogQHNlZSAjZ2V0RW52RW50cnlUeXBlKCkKLQkgKiBAc2VlICNzZXRFbnZFbnRyeVR5cGUoRW52RW50cnlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RW52RW50cnlUeXBlKCk7CisJdm9pZCBzZXRFbnZFbnRyeVR5cGUoU3RyaW5nIHZhbHVlKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudiBFbnRyeSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMTkyLDIxICsxNjMsMjEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKLQkgKiAJICAgIAotCSAqIAotCSAqIAkgICAgICBUaGUgZW52LWVudHJ5LXZhbHVlIGRlc2lnbmF0ZXMgdGhlIHZhbHVlIG9mIGEKLQkgKiAJICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBlbnZpcm9ubWVudCBlbnRyeS4gVGhlIHZhbHVlCi0JICogCSAgICAgIG11c3QgYmUgYSBTdHJpbmcgdGhhdCBpcyB2YWxpZCBmb3IgdGhlCi0JICogCSAgICAgIGNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEKLQkgKiAJICAgICAgc2luZ2xlIFN0cmluZyBwYXJhbWV0ZXIsIG9yIGZvciBqYXZhLmxhbmcuQ2hhcmFjdGVyLAotCSAqIAkgICAgICBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0JICogCi0JICogCSAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogCSAgICAgICZsdDtlbnYtZW50cnktdmFsdWUmZ3Q7MTAwLjAwJmx0Oy9lbnYtZW50cnktdmFsdWUmZ3Q7Ci0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAorCSAqIDwhW0NEQVRBW1sKKwkgKiAgICAgICAgICAgICBUaGUgZW52LWVudHJ5LXZhbHVlIGRlc2lnbmF0ZXMgdGhlIHZhbHVlIG9mIGEKKwkgKiAgICAgICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIGVudmlyb25tZW50IGVudHJ5LiBUaGUgdmFsdWUKKwkgKiAgICAgICAgICAgICBtdXN0IGJlIGEgU3RyaW5nIHRoYXQgaXMgdmFsaWQgZm9yIHRoZQorCSAqICAgICAgICAgICAgIGNvbnN0cnVjdG9yIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0aGF0IHRha2VzIGEKKwkgKiAgICAgICAgICAgICBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlciwgb3IgZm9yIGphdmEubGFuZy5DaGFyYWN0ZXIsCisJICogICAgICAgICAgICAgYSBzaW5nbGUgY2hhcmFjdGVyLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEV4YW1wbGU6CisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT4xMDAuMDA8L2Vudi1lbnRyeS12YWx1ZT4KKwkgKiAgICAgICAgICAgICAKKwkgKiBdXT4KKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnYgRW50cnkgVmFsdWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldEVudkVudHJ5VmFsdWUoU3RyaW5nKQpAQCAtMjMxLDI2ICsyMDIsMjUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKLQkgKiAJICAgIAogCSAqIAotCSAqIAkgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlCi0JICogCSAgICAgIG1hcHBlZCB0by4gIFRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UsIGFzIGRlZmluZWQgYnkgdGhlCi0JICogCSAgICAgIHJlc291cmNlJ3MgbmFtZSBlbGVtZW50IG9yIGRlZmF1bHRlZCwgaXMgYSBuYW1lIHRoYXQgaXMKLQkgKiAJICAgICAgbG9jYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCB1c2luZyB0aGUgcmVzb3VyY2UuCi0JICogCSAgICAgIChJdCdzIGEgbmFtZSBpbiB0aGUgSk5ESSBqYXZhOmNvbXAvZW52IG5hbWVzcGFjZS4pICBNYW55Ci0JICogCSAgICAgIGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0byBtYXAgdGhlc2UgbG9jYWwKLQkgKiAJICAgICAgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbgotCSAqIAkgICAgICBzZXJ2ZXIuICBUaGlzIG1hcHBlZCBuYW1lIGlzIG9mdGVuIGEgZ2xvYmFsIEpOREkgbmFtZSwKLQkgKiAJICAgICAgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uCi0JICogCi0JICogCSAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IGFueQotCSAqIAkgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5Ci0JICogCSAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKLQkgKiAJICAgICAgcHJvZHVjdC1kZXBlbmRlbnQgYW5kIG9mdGVuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQuICBObwotCSAqIAkgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KLQkgKiAKLQkgKiAJICAgICAgCi0JICogCSAgCisJICogICAgICAgICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIHJlc291cmNlIHNob3VsZCBiZQorCSAqICAgICAgICAgICAgIG1hcHBlZCB0by4gIFRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UsIGFzIGRlZmluZWQgYnkgdGhlCisJICogICAgICAgICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcworCSAqICAgICAgICAgICAgIGxvY2FsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgdXNpbmcgdGhlIHJlc291cmNlLgorCSAqICAgICAgICAgICAgIChJdCdzIGEgbmFtZSBpbiB0aGUgSk5ESSBqYXZhOmNvbXAvZW52IG5hbWVzcGFjZS4pICBNYW55CisJICogICAgICAgICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAorCSAqICAgICAgICAgICAgIG5hbWVzIHRvIG5hbWVzIG9mIHJlc291cmNlcyBrbm93biB0byB0aGUgYXBwbGljYXRpb24KKwkgKiAgICAgICAgICAgICBzZXJ2ZXIuICBUaGlzIG1hcHBlZCBuYW1lIGlzIG9mdGVuIGEgZ2xvYmFsIEpOREkgbmFtZSwKKwkgKiAgICAgICAgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKKwkgKiAgICAgICAgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5CisJICogICAgICAgICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcworCSAqICAgICAgICAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KKwkgKiAgICAgICAgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCkBAIC0yODIsNyArMjUyLDM2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRFbnZFbnRyeV9JbmplY3Rpb25UYXJnZXRzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCk7CisJTGlzdDxJbmplY3Rpb25UYXJnZXQ+IGdldEluamVjdGlvblRhcmdldHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvb2t1cCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgSk5ESSBuYW1lIHRvIGJlIGxvb2tlZCB1cCB0byByZXNvbHZlIGEgcmVzb3VyY2UgcmVmZXJlbmNlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvb2t1cCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRMb29rdXBOYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEVudkVudHJ5X0xvb2t1cE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0TG9va3VwTmFtZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldExvb2t1cE5hbWUgPGVtPkxvb2t1cCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb29rdXAgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TG9va3VwTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TG9va3VwTmFtZShTdHJpbmcgdmFsdWUpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTMwOCw1ICszMDcsMzUgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOworCQorCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRFbnZFbnRyeVR5cGUgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5VHlwZQorCSAqIEBzZWUgI2lzU2V0RW52RW50cnlUeXBlKCkKKwkgKiBAc2VlICN1bnNldEVudkVudHJ5VHlwZSgpCisJICogQHNlZSAjZ2V0RW52RW50cnlUeXBlKCkKKwkgKiBUaGlzIGlzIHByb3ZpZGVkIGZvciBKYXZhIEVFIDUgbW9kZWwgZXF1aXZhbGVuY2UKKwkgKi8KKwl2b2lkIHNldEVudkVudHJ5VHlwZShFbnZFbnRyeVR5cGUgdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlUeXBlIDxlbT5FbnYgRW50cnkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0RW52RW50cnlUeXBlKCkKKwkgKiBAc2VlICNnZXRFbnZFbnRyeVR5cGUoKQorCSAqIEBzZWUgI3NldEVudkVudHJ5VHlwZShFbnZFbnRyeVR5cGUpCisJICogVGhpcyBpcyBwcm92aWRlZCBmb3IgSmF2YSBFRSA1IG1vZGVsIGVxdWl2YWxlbmNlCisJICovCisJdm9pZCB1bnNldEVudkVudHJ5VHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnkjZ2V0RW52RW50cnlUeXBlIDxlbT5FbnYgRW50cnkgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudiBFbnRyeSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogQHNlZSAjdW5zZXRFbnZFbnRyeVR5cGUoKQorCSAqIEBzZWUgI2dldEVudkVudHJ5VHlwZSgpCisJICogQHNlZSAjc2V0RW52RW50cnlUeXBlKEVudkVudHJ5VHlwZSkKKwkgKiBUaGlzIGlzIHByb3ZpZGVkIGZvciBKYXZhIEVFIDUgbW9kZWwgZXF1aXZhbGVuY2UKKwkgKi8KKwlib29sZWFuIGlzU2V0RW52RW50cnlUeXBlKCk7CiAKIH0gLy8gRW52RW50cnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvR2VuZXJpY0Jvb2xlYW5UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvR2VuZXJpY0Jvb2xlYW5UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhYWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9HZW5lcmljQm9vbGVhblR5cGUuamF2YQpAQCAtMCwwICsxLDI3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+R2VuZXJpYyBCb29sZWFuIFR5cGU8L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgVGhpcyB0eXBlIGRlZmluZXMgZm91ciBkaWZmZXJlbnQgdmFsdWVzIHdoaWNoIGNhbiBkZXNpZ25hdGUKKyAqICAgICAgICAgYm9vbGVhbiB2YWx1ZXMuIFRoaXMgaW5jbHVkZXMgdmFsdWVzIHllcyBhbmQgbm8gd2hpY2ggYXJlIAorICogICAgICAgICBub3QgZGVzaWduYXRlZCBieSB4c2Q6Ym9vbGVhbgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQorICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldEdlbmVyaWNCb29sZWFuVHlwZSgpCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIEdlbmVyaWNCb29sZWFuVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlRydWU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjVFJVRV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVRSVUUoMCwgInRydWUiLCAidHJ1ZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkZhbHNlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0ZBTFNFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJRkFMU0UoMSwgImZhbHNlIiwgImZhbHNlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+WWVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1lFU19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVlFUygyLCAieWVzIiwgInllcyIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk5vPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTk8oMywgIm5vIiwgIm5vIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+VHJ1ZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VHJ1ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNUUlVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJVRV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5GYWxzZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RmFsc2U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRkFMU0UKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQUxTRV9WQUxVRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5ZZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlllczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNZRVMKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZRVNfVkFMVUUgPSAyOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tm88L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5vPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fVkFMVUUgPSAzOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkdlbmVyaWMgQm9vbGVhbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBHZW5lcmljQm9vbGVhblR5cGVbXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgR2VuZXJpY0Jvb2xlYW5UeXBlW10geworCQkJVFJVRSwKKwkJCUZBTFNFLAorCQkJWUVTLAorCQkJTk8sCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+R2VuZXJpYyBCb29sZWFuIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxHZW5lcmljQm9vbGVhblR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+R2VuZXJpYyBCb29sZWFuIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBHZW5lcmljQm9vbGVhblR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlHZW5lcmljQm9vbGVhblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5HZW5lcmljIEJvb2xlYW4gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEdlbmVyaWNCb29sZWFuVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUdlbmVyaWNCb29sZWFuVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+R2VuZXJpYyBCb29sZWFuIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBHZW5lcmljQm9vbGVhblR5cGUgZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIFRSVUVfVkFMVUU6IHJldHVybiBUUlVFOworCQkJY2FzZSBGQUxTRV9WQUxVRTogcmV0dXJuIEZBTFNFOworCQkJY2FzZSBZRVNfVkFMVUU6IHJldHVybiBZRVM7CisJCQljYXNlIE5PX1ZBTFVFOiByZXR1cm4gTk87CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEdlbmVyaWNCb29sZWFuVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9HZW5lcmljQm9vbGVhblR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9JY29uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSWNvbi5qYXZhCmluZGV4IDU1ZDlmZGQuLmZhMjQyOTYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9JY29uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0ljb24uamF2YQpAQCAtMTksMTUgKzE5LDE2IEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIGljb24gdHlwZSBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzCi0gKiAJdGhhdCBzcGVjaWZ5IHRoZSBmaWxlIG5hbWVzIGZvciBzbWFsbCBhbmQgbGFyZ2UgR0lGLCBKUEVHLAotICogCW9yIFBORyBpY29uIGltYWdlcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGFyZW50IGVsZW1lbnQgaW4gYQotICogCUdVSSB0b29sLgotICogCi0gKiAJVGhlIHhtbDpsYW5nIGF0dHJpYnV0ZSBkZWZpbmVzIHRoZSBsYW5ndWFnZSB0aGF0IHRoZQotICogCWljb24gZmlsZSBuYW1lcyBhcmUgcHJvdmlkZWQgaW4uIEl0cyB2YWx1ZSBpcyAiZW4iIChFbmdsaXNoKQotICogCWJ5IGRlZmF1bHQuCi0gKiAKKyAqICAgICAgICAgVGhlIGljb24gdHlwZSBjb250YWlucyBzbWFsbC1pY29uIGFuZCBsYXJnZS1pY29uIGVsZW1lbnRzCisgKiAgICAgICAgIHRoYXQgc3BlY2lmeSB0aGUgZmlsZSBuYW1lcyBmb3Igc21hbGwgYW5kIGxhcmdlIEdJRiwgSlBFRywKKyAqICAgICAgICAgb3IgUE5HIGljb24gaW1hZ2VzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwYXJlbnQgZWxlbWVudCBpbiBhCisgKiAgICAgICAgIEdVSSB0b29sLiAKKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSB4bWw6bGFuZyBhdHRyaWJ1dGUgZGVmaW5lcyB0aGUgbGFuZ3VhZ2UgdGhhdCB0aGUKKyAqICAgICAgICAgaWNvbiBmaWxlIG5hbWVzIGFyZSBwcm92aWRlZCBpbi4gSXRzIHZhbHVlIGlzICJlbiIgKEVuZ2xpc2gpCisgKiAgICAgICAgIGJ5IGRlZmF1bHQuIAorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNTIsMjIgKzUzLDIyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCi0JICogCSAgICAKLQkgKiAKLQkgKiAJICAgICAgVGhlIHNtYWxsLWljb24gZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIGZpbGUKLQkgKiAJICAgICAgY29udGFpbmluZyBhIHNtYWxsICgxNiB4IDE2KSBpY29uIGltYWdlLiBUaGUgZmlsZQotCSAqIAkgICAgICBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQKLQkgKiAJICAgICAgQ29tcG9uZW50J3MgRGVwbG95bWVudCBGaWxlLgotCSAqIAotCSAqIAkgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGluIHRoZSBHSUYsIEpQRUcsIG9yIFBORyBmb3JtYXQuCi0JICogCSAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgotCSAqIAotCSAqIAkgICAgICBFeGFtcGxlOgotCSAqIAotCSAqIAkgICAgICAmbHQ7c21hbGwtaWNvbiZndDtlbXBsb3llZS1zZXJ2aWNlLWljb24xNngxNi5qcGcmbHQ7L3NtYWxsLWljb24mZ3Q7Ci0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAorCSAqIDwhW0NEQVRBW1sKKwkgKiAgICAgICAgICAgICBUaGUgc21hbGwtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQorCSAqICAgICAgICAgICAgIGNvbnRhaW5pbmcgYSBzbWFsbCAoMTYgeCAxNikgaWNvbiBpbWFnZS4gVGhlIGZpbGUKKwkgKiAgICAgICAgICAgICBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB3aXRoaW4gdGhlIERlcGxveW1lbnQKKwkgKiAgICAgICAgICAgICBDb21wb25lbnQncyBEZXBsb3ltZW50IEZpbGUuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgVGhlIGltYWdlIG1heSBiZSBpbiB0aGUgR0lGLCBKUEVHLCBvciBQTkcgZm9ybWF0LgorCSAqICAgICAgICAgICAgIFRoZSBpY29uIGNhbiBiZSB1c2VkIGJ5IHRvb2xzLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEV4YW1wbGU6CisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgPHNtYWxsLWljb24+ZW1wbG95ZWUtc2VydmljZS1pY29uMTZ4MTYuanBnPC9zbWFsbC1pY29uPgorCSAqICAgICAgICAgICAgIAorCSAqIF1dPgorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNtYWxsIEljb248L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFNtYWxsSWNvbihTdHJpbmcpCkBAIC05MiwyMyArOTMsMjMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKLQkgKiAJICAgIAotCSAqIAotCSAqIAkgICAgICBUaGUgbGFyZ2UtaWNvbiBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZQotCSAqIAkgICAgICBjb250YWluaW5nIGEgbGFyZ2UKLQkgKiAJICAgICAgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZQotCSAqIAkgICAgICBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50Ci0JICogCSAgICAgIEZpbGUuCi0JICogCi0JICogCSAgICAgIFRoZSBpbWFnZSBtYXkgYmUgaW4gdGhlIEdJRiwgSlBFRywgb3IgUE5HIGZvcm1hdC4KLQkgKiAJICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCi0JICogCi0JICogCSAgICAgIEV4YW1wbGU6Ci0JICogCi0JICogCSAgICAgICZsdDtsYXJnZS1pY29uJmd0O2VtcGxveWVlLXNlcnZpY2UtaWNvbjMyeDMyLmpwZyZsdDsvbGFyZ2UtaWNvbiZndDsKLQkgKiAKLQkgKiAJICAgICAgCi0JICogCSAgCisJICogPCFbQ0RBVEFbWworCSAqICAgICAgICAgICAgIFRoZSBsYXJnZS1pY29uIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBmaWxlCisJICogICAgICAgICAgICAgY29udGFpbmluZyBhIGxhcmdlCisJICogICAgICAgICAgICAgKDMyIHggMzIpIGljb24gaW1hZ2UuIFRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSAKKwkgKiAgICAgICAgICAgICBwYXRoIHdpdGhpbiB0aGUgRGVwbG95bWVudCBDb21wb25lbnQncyBEZXBsb3ltZW50CisJICogICAgICAgICAgICAgRmlsZS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBUaGUgaW1hZ2UgbWF5IGJlIGluIHRoZSBHSUYsIEpQRUcsIG9yIFBORyBmb3JtYXQuCisJICogICAgICAgICAgICAgVGhlIGljb24gY2FuIGJlIHVzZWQgYnkgdG9vbHMuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgRXhhbXBsZToKKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICA8bGFyZ2UtaWNvbj5lbXBsb3llZS1zZXJ2aWNlLWljb24zMngzMi5qcGc8L2xhcmdlLWljb24+CisJICogICAgICAgICAgICAgCisJICogXV0+CisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFyZ2UgSWNvbjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0TGFyZ2VJY29uKFN0cmluZykKQEAgLTE1NywxNSArMTU4LDM4IEBACiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBdHRlbXB0aW5nIHRvIGluc3RhbGwgdGhlIHJlbGV2YW50IElTTyAyLSBhbmQgMy1sZXR0ZXIKLQkgKiAgICAgICAgICBjb2RlcyBhcyB0aGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgaXMgcHJvYmFibHkgbmV2ZXIKLQkgKiAgICAgICAgICBnb2luZyB0byBiZSBhIHJlYWxpc3RpYyBwb3NzaWJpbGl0eS4gIFNlZQotCSAqICAgICAgICAgIFJGQyAzMDY2IGF0IGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMwNjYudHh0IGFuZCB0aGUgSUFOQSByZWdpc3RyeQotCSAqICAgICAgICAgIGF0IGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbGFuZy10YWctYXBwcy5odG0gZm9yCi0JICogICAgICAgICAgZnVydGhlciBpbmZvcm1hdGlvbi4KIAkgKiAKLQkgKiAgICAgICAgICBUaGUgdW5pb24gYWxsb3dzIGZvciB0aGUgJ3VuLWRlY2xhcmF0aW9uJyBvZiB4bWw6bGFuZyB3aXRoCi0JICogICAgICAgICAgdGhlIGVtcHR5IHN0cmluZy4KKwkgKiAgICAgPGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisJICogICAgICAKKwkgKiAgICAgICA8aDM+bGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpPC9oMz4KKwkgKiAgICAgICA8cD4KKwkgKiAgICAgICAgZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKKwkgKiAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgorCSAqICAgICAgICBhbnkgZWxlbWVudDsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAorCSAqICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLjwvcD4KKwkgKiAgICAgIAorCSAqICAgICA8L2Rpdj4KKwkgKiAgICAgPGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisJICogICAgICA8aDQ+Tm90ZXM8L2g0PgorCSAqICAgICAgPHA+CisJICogICAgICAgQXR0ZW1wdGluZyB0byBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCisJICogICAgICAgY29kZXMgYXMgdGhlIGVudW1lcmF0ZWQgcG9zc2libGUgdmFsdWVzIGlzIHByb2JhYmx5IG5ldmVyCisJICogICAgICAgZ29pbmcgdG8gYmUgYSByZWFsaXN0aWMgcG9zc2liaWxpdHkuICAKKwkgKiAgICAgIDwvcD4KKwkgKiAgICAgIDxwPgorCSAqICAgICAgIFNlZSBCQ1AgNDcgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvYmNwL2JjcDQ3LnR4dCI+CisJICogICAgICAgIGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL2JjcC9iY3A0Ny50eHQ8L2E+CisJICogICAgICAgYW5kIHRoZSBJQU5BIGxhbmd1YWdlIHN1YnRhZyByZWdpc3RyeSBhdAorCSAqICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvbGFuZ3VhZ2Utc3VidGFnLXJlZ2lzdHJ5Ij4KKwkgKiAgICAgICAgaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9sYW5ndWFnZS1zdWJ0YWctcmVnaXN0cnk8L2E+CisJICogICAgICAgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCisJICogICAgICA8L3A+CisJICogICAgICA8cD4KKwkgKiAgICAgICBUaGUgdW5pb24gYWxsb3dzIGZvciB0aGUgJ3VuLWRlY2xhcmF0aW9uJyBvZiB4bWw6bGFuZyB3aXRoCisJICogICAgICAgdGhlIGVtcHR5IHN0cmluZy4KKwkgKiAgICAgIDwvcD4KKwkgKiAgICAgPC9kaXY+CisJICogICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxhbmc8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldExhbmcoU3RyaW5nKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0luamVjdGlvblRhcmdldC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0luamVjdGlvblRhcmdldC5qYXZhCmluZGV4IGEzZGVjNDkuLjM3ZjVjZDEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9JbmplY3Rpb25UYXJnZXQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSW5qZWN0aW9uVGFyZ2V0LmphdmEKQEAgLTE5LDI0ICsxOSwyNSBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCUFuIGluamVjdGlvbiB0YXJnZXQgc3BlY2lmaWVzIGEgY2xhc3MgYW5kIGEgbmFtZSB3aXRoaW4KLSAqIAl0aGF0IGNsYXNzIGludG8gd2hpY2ggYSByZXNvdXJjZSBzaG91bGQgYmUgaW5qZWN0ZWQuCi0gKiAKLSAqIAlUaGUgaW5qZWN0aW9uIHRhcmdldCBjbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZAotICogCWNsYXNzIG5hbWUgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBpbmplY3Rpb24uICBUaGUKLSAqIAlKYXZhIEVFIHNwZWNpZmljYXRpb25zIGRlc2NyaWJlIHdoaWNoIGNsYXNzZXMgY2FuIGJlIGFuCi0gKiAJaW5qZWN0aW9uIHRhcmdldC4KLSAqIAotICogCVRoZSBpbmplY3Rpb24gdGFyZ2V0IG5hbWUgc3BlY2lmaWVzIHRoZSB0YXJnZXQgd2l0aGluCi0gKiAJdGhlIHNwZWNpZmllZCBjbGFzcy4gIFRoZSB0YXJnZXQgaXMgZmlyc3QgbG9va2VkIGZvciBhcyBhCi0gKiAJSmF2YUJlYW5zIHByb3BlcnR5IG5hbWUuICBJZiBub3QgZm91bmQsIHRoZSB0YXJnZXQgaXMKLSAqIAlsb29rZWQgZm9yIGFzIGEgZmllbGQgbmFtZS4KLSAqIAotICogCVRoZSBzcGVjaWZpZWQgcmVzb3VyY2Ugd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSB0YXJnZXQKLSAqIAlkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNsYXNzIGJ5IGVpdGhlciBjYWxsaW5nIHRoZQotICogCXNldCBtZXRob2QgZm9yIHRoZSB0YXJnZXQgcHJvcGVydHkgb3IgYnkgc2V0dGluZyBhIHZhbHVlCi0gKiAJaW50byB0aGUgbmFtZWQgZmllbGQuCi0gKiAKKyAqICAgICAgICAgQW4gaW5qZWN0aW9uIHRhcmdldCBzcGVjaWZpZXMgYSBjbGFzcyBhbmQgYSBuYW1lIHdpdGhpbgorICogICAgICAgICB0aGF0IGNsYXNzIGludG8gd2hpY2ggYSByZXNvdXJjZSBzaG91bGQgYmUgaW5qZWN0ZWQuCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgaW5qZWN0aW9uIHRhcmdldCBjbGFzcyBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZAorICogICAgICAgICBjbGFzcyBuYW1lIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgaW5qZWN0aW9uLiAgVGhlCisgKiAgICAgICAgIEphdmEgRUUgc3BlY2lmaWNhdGlvbnMgZGVzY3JpYmUgd2hpY2ggY2xhc3NlcyBjYW4gYmUgYW4KKyAqICAgICAgICAgaW5qZWN0aW9uIHRhcmdldC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBpbmplY3Rpb24gdGFyZ2V0IG5hbWUgc3BlY2lmaWVzIHRoZSB0YXJnZXQgd2l0aGluCisgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgY2xhc3MuICBUaGUgdGFyZ2V0IGlzIGZpcnN0IGxvb2tlZCBmb3IgYXMgYQorICogICAgICAgICBKYXZhQmVhbnMgcHJvcGVydHkgbmFtZS4gIElmIG5vdCBmb3VuZCwgdGhlIHRhcmdldCBpcworICogICAgICAgICBsb29rZWQgZm9yIGFzIGEgZmllbGQgbmFtZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBzcGVjaWZpZWQgcmVzb3VyY2Ugd2lsbCBiZSBpbmplY3RlZCBpbnRvIHRoZSB0YXJnZXQKKyAqICAgICAgICAgZHVyaW5nIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjbGFzcyBieSBlaXRoZXIgY2FsbGluZyB0aGUKKyAqICAgICAgICAgc2V0IG1ldGhvZCBmb3IgdGhlIHRhcmdldCBwcm9wZXJ0eSBvciBieSBzZXR0aW5nIGEgdmFsdWUKKyAqICAgICAgICAgaW50byB0aGUgbmFtZWQgZmllbGQuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1CiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSXNvbGF0aW9uTGV2ZWxUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSXNvbGF0aW9uTGV2ZWxUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyNTVhZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9Jc29sYXRpb25MZXZlbFR5cGUuamF2YQpAQCAtMCwwICsxLDI3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+SXNvbGF0aW9uIExldmVsIFR5cGU8L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgCVRoZSBmb2xsb3dpbmcgdHJhbnNhY3Rpb24gaXNvbGF0aW9uIGxldmVscyBhcmUgYWxsb3dlZAorICogICAgICAgICAJKHNlZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgamF2YS5zcWwuQ29ubmVjdGlvbiBpbnRlcmZhY2UpOgorICogICAgICAgICBUUkFOU0FDVElPTl9SRUFEX1VOQ09NTUlUVEVECisgKiAgICAgICAgIFRSQU5TQUNUSU9OX1JFQURfQ09NTUlUVEVECisgKiAgICAgICAgIFRSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRAorICogICAgICAgICBUUkFOU0FDVElPTl9TRVJJQUxJWkFCTEUKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKyAqICAgICAgIAorICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRJc29sYXRpb25MZXZlbFR5cGUoKQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBJc29sYXRpb25MZXZlbFR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlRSQU5TQUNUSU9OUkVBRFVOQ09NTUlUVEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1RSQU5TQUNUSU9OUkVBRFVOQ09NTUlUVEVEX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJVFJBTlNBQ1RJT05SRUFEVU5DT01NSVRURUQoMCwgIlRSQU5TQUNUSU9OUkVBRFVOQ09NTUlUVEVEIiwgIlRSQU5TQUNUSU9OX1JFQURfVU5DT01NSVRURUQiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5UUkFOU0FDVElPTlJFQURDT01NSVRURUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjVFJBTlNBQ1RJT05SRUFEQ09NTUlUVEVEX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJVFJBTlNBQ1RJT05SRUFEQ09NTUlUVEVEKDEsICJUUkFOU0FDVElPTlJFQURDT01NSVRURUQiLCAiVFJBTlNBQ1RJT05fUkVBRF9DT01NSVRURUQiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5UUkFOU0FDVElPTlJFUEVBVEFCTEVSRUFEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1RSQU5TQUNUSU9OUkVQRUFUQUJMRVJFQURfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlUUkFOU0FDVElPTlJFUEVBVEFCTEVSRUFEKDIsICJUUkFOU0FDVElPTlJFUEVBVEFCTEVSRUFEIiwgIlRSQU5TQUNUSU9OX1JFUEVBVEFCTEVfUkVBRCIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlRSQU5TQUNUSU9OU0VSSUFMSVpBQkxFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1RSQU5TQUNUSU9OU0VSSUFMSVpBQkxFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJVFJBTlNBQ1RJT05TRVJJQUxJWkFCTEUoMywgIlRSQU5TQUNUSU9OU0VSSUFMSVpBQkxFIiwgIlRSQU5TQUNUSU9OX1NFUklBTElaQUJMRSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlRSQU5TQUNUSU9OUkVBRFVOQ09NTUlUVEVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5UUkFOU0FDVElPTlJFQURVTkNPTU1JVFRFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNUUkFOU0FDVElPTlJFQURVTkNPTU1JVFRFRAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OUkVBRFVOQ09NTUlUVEVEX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlRSQU5TQUNUSU9OUkVBRENPTU1JVFRFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VFJBTlNBQ1RJT05SRUFEQ09NTUlUVEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1RSQU5TQUNUSU9OUkVBRENPTU1JVFRFRAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OUkVBRENPTU1JVFRFRF9WQUxVRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5UUkFOU0FDVElPTlJFUEVBVEFCTEVSRUFEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5UUkFOU0FDVElPTlJFUEVBVEFCTEVSRUFEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1RSQU5TQUNUSU9OUkVQRUFUQUJMRVJFQUQKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU0FDVElPTlJFUEVBVEFCTEVSRUFEX1ZBTFVFID0gMjsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlRSQU5TQUNUSU9OU0VSSUFMSVpBQkxFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5UUkFOU0FDVElPTlNFUklBTElaQUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNUUkFOU0FDVElPTlNFUklBTElaQUJMRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TQUNUSU9OU0VSSUFMSVpBQkxFX1ZBTFVFID0gMzsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Jc29sYXRpb24gTGV2ZWwgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXNvbGF0aW9uTGV2ZWxUeXBlW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IElzb2xhdGlvbkxldmVsVHlwZVtdIHsKKwkJCVRSQU5TQUNUSU9OUkVBRFVOQ09NTUlUVEVELAorCQkJVFJBTlNBQ1RJT05SRUFEQ09NTUlUVEVELAorCQkJVFJBTlNBQ1RJT05SRVBFQVRBQkxFUkVBRCwKKwkJCVRSQU5TQUNUSU9OU0VSSUFMSVpBQkxFLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPklzb2xhdGlvbiBMZXZlbCBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8SXNvbGF0aW9uTGV2ZWxUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPklzb2xhdGlvbiBMZXZlbCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSXNvbGF0aW9uTGV2ZWxUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJSXNvbGF0aW9uTGV2ZWxUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SXNvbGF0aW9uIExldmVsIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBJc29sYXRpb25MZXZlbFR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlJc29sYXRpb25MZXZlbFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPklzb2xhdGlvbiBMZXZlbCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSXNvbGF0aW9uTGV2ZWxUeXBlIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBUUkFOU0FDVElPTlJFQURVTkNPTU1JVFRFRF9WQUxVRTogcmV0dXJuIFRSQU5TQUNUSU9OUkVBRFVOQ09NTUlUVEVEOworCQkJY2FzZSBUUkFOU0FDVElPTlJFQURDT01NSVRURURfVkFMVUU6IHJldHVybiBUUkFOU0FDVElPTlJFQURDT01NSVRURUQ7CisJCQljYXNlIFRSQU5TQUNUSU9OUkVQRUFUQUJMRVJFQURfVkFMVUU6IHJldHVybiBUUkFOU0FDVElPTlJFUEVBVEFCTEVSRUFEOworCQkJY2FzZSBUUkFOU0FDVElPTlNFUklBTElaQUJMRV9WQUxVRTogcmV0dXJuIFRSQU5TQUNUSU9OU0VSSUFMSVpBQkxFOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBJc29sYXRpb25MZXZlbFR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vSXNvbGF0aW9uTGV2ZWxUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSkVFU0FYWE1MSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0pFRVNBWFhNTEhhbmRsZXIuamF2YQppbmRleCAzMjcxZDQ1Li44YWRhNDZkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSkVFU0FYWE1MSGFuZGxlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KRUVTQVhYTUxIYW5kbGVyLmphdmEKQEAgLTIzLDkgKzIzLDkgQEAKIAlwdWJsaWMgSkVFU0FYWE1MSGFuZGxlcihYTUxSZXNvdXJjZSB4bWlSZXNvdXJjZSwgWE1MSGVscGVyIGhlbHBlciwKIAkJCU1hcDw/LCA/PiBvcHRpb25zKSB7CiAJCXN1cGVyKHhtaVJlc291cmNlLCBoZWxwZXIsIG9wdGlvbnMpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRVBhY2thZ2UgZ2V0UGFja2FnZUZvclVSSShTdHJpbmcgdXJpU3RyaW5nKSB7CiAJCUVQYWNrYWdlIGRlZlBhY2thZ2U7CiAJCS8vIEdyYWIgdGhlIHNjaGVtYSBsb2NhdGlvbiBiZWNhdXNlIGFsbCBKRUUgREQgZmlsZXMgc2hhcmUgYSBjb21tb24gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvSkVFWE1MTG9hZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KRUVYTUxMb2FkSW1wbC5qYXZhCmluZGV4IDE0ZjBiNzYuLjA0M2I3ODAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KRUVYTUxMb2FkSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KRUVYTUxMb2FkSW1wbC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIHB1YmxpYyBjbGFzcyBKRUVYTUxMb2FkSW1wbCBleHRlbmRzIFhNTExvYWRJbXBsIHsKIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBEZWZhdWx0SGFuZGxlciBtYWtlRGVmYXVsdEhhbmRsZXIoKSB7CiAJCQogCQkgcmV0dXJuIG5ldyBKRUVTQVhYTUxIYW5kbGVyKHJlc291cmNlLCBoZWxwZXIsIG9wdGlvbnMpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0phdmFlZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KYXZhZWVGYWN0b3J5LmphdmEKaW5kZXggMjM4ZDJjMWYuLjY5M2Y3MTAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9KYXZhZWVGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0phdmFlZUZhY3RvcnkuamF2YQpAQCAtMzIsNiArMzIsMjQgQEAKIAlKYXZhZWVGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZUZhY3RvcnlJbXBsLmluaXQoKTsKIAogCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWRkcmVzc2luZyBUeXBlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BZGRyZXNzaW5nIFR5cGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUFkZHJlc3NpbmdUeXBlIGNyZWF0ZUFkZHJlc3NpbmdUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRhdGEgU291cmNlIFR5cGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRhdGEgU291cmNlIFR5cGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCURhdGFTb3VyY2VUeXBlIGNyZWF0ZURhdGFTb3VyY2VUeXBlKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0yMDMsNiArMjIxLDE1IEBACiAJUmVzb3VyY2VSZWYgY3JlYXRlUmVzb3VyY2VSZWYoKTsKIAogCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzcGVjdCBCaW5kaW5nIFR5cGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc3BlY3QgQmluZGluZyBUeXBlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSZXNwZWN0QmluZGluZ1R5cGUgY3JlYXRlUmVzcGVjdEJpbmRpbmdUeXBlKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJ1biBBczwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0xpZmVjeWNsZUNhbGxiYWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTGlmZWN5Y2xlQ2FsbGJhY2suamF2YQppbmRleCBlZDg0ZmVkLi4xZWRiNjE1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTGlmZWN5Y2xlQ2FsbGJhY2suamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTGlmZWN5Y2xlQ2FsbGJhY2suamF2YQpAQCAtMTksMTcgKzE5LDE4IEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIGxpZmVjeWNsZS1jYWxsYmFjayB0eXBlIHNwZWNpZmllcyBhIG1ldGhvZCBvbiBhCi0gKiAJY2xhc3MgdG8gYmUgY2FsbGVkIHdoZW4gYSBsaWZlY3ljbGUgZXZlbnQgb2NjdXJzLgotICogCU5vdGUgdGhhdCBlYWNoIGNsYXNzIG1heSBoYXZlIG9ubHkgb25lIGxpZmVjeWNsZSBjYWxsYmFjaworICogICAgICAgICBUaGUgbGlmZWN5Y2xlLWNhbGxiYWNrIHR5cGUgc3BlY2lmaWVzIGEgbWV0aG9kIG9uIGEKKyAqICAgICAgICAgY2xhc3MgdG8gYmUgY2FsbGVkIHdoZW4gYSBsaWZlY3ljbGUgZXZlbnQgb2NjdXJzLgorICogICAgICAgICBOb3RlIHRoYXQgZWFjaCBjbGFzcyBtYXkgaGF2ZSBvbmx5IG9uZSBsaWZlY3ljbGUgY2FsbGJhY2sKICAqICAgICAgICAgbWV0aG9kIGZvciBhbnkgZ2l2ZW4gZXZlbnQgYW5kIHRoYXQgdGhlIG1ldGhvZCBtYXkgbm90Ci0gKiAJYmUgb3ZlcmxvYWRlZC4KLSAqIAorICogICAgICAgICBiZSBvdmVybG9hZGVkLgorICogICAgICAgICAKICAqICAgICAgICAgSWYgdGhlIGxpZmVmeWNsZS1jYWxsYmFjay1jbGFzcyBlbGVtZW50IGlzIG1pc3NpbmcgdGhlbgogICogICAgICAgICB0aGUgY2xhc3MgZGVmaW5pbmcgdGhlIGNhbGxiYWNrIGlzIGFzc3VtZWQgdG8gYmUgdGhlCiAgKiAgICAgICAgIGNvbXBvbmVudCBjbGFzcyBpbiBzY29wZSBhdCB0aGUgcGxhY2UgaW4gdGhlIGRlc2NyaXB0b3IKICAqICAgICAgICAgaW4gd2hpY2ggdGhlIGNhbGxiYWNrIGRlZmluaXRpb24gYXBwZWFycy4KLSAqIAorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL0xpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTGlzdGVuZXIuamF2YQppbmRleCAyMWIzNWYzLi4yOWQ2OWMxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTGlzdGVuZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTGlzdGVuZXIuamF2YQpAQCAtMjAsOSArMjAsMTAgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgbGlzdGVuZXJUeXBlIGluZGljYXRlcyB0aGUgZGVwbG95bWVudCBwcm9wZXJ0aWVzIGZvciBhIHdlYgotICogCWFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uCi0gKiAKKyAqICAgICAgICAgVGhlIGxpc3RlbmVyVHlwZSBpbmRpY2F0ZXMgdGhlIGRlcGxveW1lbnQgcHJvcGVydGllcyBmb3IgYSB3ZWIKKyAqICAgICAgICAgYXBwbGljYXRpb24gbGlzdGVuZXIgYmVhbi4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTU1LDcgKzU2LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldExpc3RlbmVyX0Rlc2NyaXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7CisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTcwLDcgKzcxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldExpc3RlbmVyX0Rpc3BsYXlOYW1lcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7CisJTGlzdDxEaXNwbGF5TmFtZT4gZ2V0RGlzcGxheU5hbWVzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC04NSw3ICs4Niw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRMaXN0ZW5lcl9JY29ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKKwlMaXN0PEljb24+IGdldEljb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaXN0ZW5lciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtOTQsMTIgKzk1LDEzIEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZQotCSAqIAkgICAgYXBwbGljYXRpb24gbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgd2ViCi0JICogCSAgICBhcHBsaWNhdGlvbiBsaXN0ZW5lciBiZWFuLiBUaGUgdmFsdWUgaXMgdGhlIGZ1bGx5Ci0JICogCSAgICBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBsaXN0ZW5lciBjbGFzcy4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgbGlzdGVuZXItY2xhc3MgZWxlbWVudCBkZWNsYXJlcyBhIGNsYXNzIGluIHRoZQorCSAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uIG11c3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHdlYgorCSAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGxpc3RlbmVyIGJlYW4uIFRoZSB2YWx1ZSBpcyB0aGUgZnVsbHkKKwkgKiAgICAgICAgICAgICBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBsaXN0ZW5lciBjbGFzcy4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaXN0ZW5lciBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0TGlzdGVuZXJDbGFzcyhTdHJpbmcpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTWVzc2FnZURlc3RpbmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTWVzc2FnZURlc3RpbmF0aW9uLmphdmEKaW5kZXggZGU1NzA5MS4uNmIxYzY4NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL01lc3NhZ2VEZXN0aW5hdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9NZXNzYWdlRGVzdGluYXRpb24uamF2YQpAQCAtMTksMzAgKzE5LDMxIEBACiAgKgogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb25UeXBlIHNwZWNpZmllcyBhIG1lc3NhZ2UKLSAqIAkgIGRlc3RpbmF0aW9uLiBUaGUgbG9naWNhbCBkZXN0aW5hdGlvbiBkZXNjcmliZWQgYnkgdGhpcwotICogCSAgZWxlbWVudCBpcyBtYXBwZWQgdG8gYSBwaHlzaWNhbCBkZXN0aW5hdGlvbiBieSB0aGUgRGVwbG95ZXIuCi0gKiAKLSAqIAkgIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIGVsZW1lbnQgY29udGFpbnM6Ci0gKiAKLSAqIAkJICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBkaXNwbGF5LW5hbWUKLSAqIAkJICAtIGFuIG9wdGlvbmFsIGljb24KLSAqIAkJICAtIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lIHdoaWNoIG11c3QgYmUgdW5pcXVlCi0gKiAJCSAgICBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZQotICogCQkgICAgRGVwbG95bWVudCBGaWxlLgotICogCQkgIC0gYW4gb3B0aW9uYWwgbWFwcGVkIG5hbWUKLSAqIAotICogCSAgRXhhbXBsZToKLSAqIAotICogCSAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24mZ3Q7Ci0gKiAJCSAgJmx0O21lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSZndDtDb3Jwb3JhdGVTdG9ja3MKLSAqIAkJICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSZndDsKLSAqIAkgICZsdDsvbWVzc2FnZS1kZXN0aW5hdGlvbiZndDsKLSAqIAotICogCSAgCisgKiA8IVtDREFUQVtbCisgKiAgICAgICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uVHlwZSBzcGVjaWZpZXMgYSBtZXNzYWdlCisgKiAgICAgICAgIGRlc3RpbmF0aW9uLiBUaGUgbG9naWNhbCBkZXN0aW5hdGlvbiBkZXNjcmliZWQgYnkgdGhpcworICogICAgICAgICBlbGVtZW50IGlzIG1hcHBlZCB0byBhIHBoeXNpY2FsIGRlc3RpbmF0aW9uIGJ5IHRoZSBEZXBsb3llci4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIGVsZW1lbnQgY29udGFpbnM6IAorICogICAgICAgICAKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXktbmFtZQorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGljb24KKyAqICAgICAgICAgLSBhIG1lc3NhZ2UgZGVzdGluYXRpb24gbmFtZSB3aGljaCBtdXN0IGJlIHVuaXF1ZQorICogICAgICAgICBhbW9uZyBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWVzIHdpdGhpbiB0aGUgc2FtZSAKKyAqICAgICAgICAgRGVwbG95bWVudCBGaWxlLiAKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQgbmFtZQorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGxvb2t1cCBuYW1lCisgKiAgICAgICAgIAorICogICAgICAgICBFeGFtcGxlOiAKKyAqICAgICAgICAgCisgKiAgICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uPgorICogICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1uYW1lPkNvcnBvcmF0ZVN0b2NrcworICogICAgICAgICA8L21lc3NhZ2UtZGVzdGluYXRpb24tbmFtZT4KKyAqICAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uPgorICogICAgICAgICAKKyAqIF1dPgorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1CiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC01NCw2ICs1NSw3IEBACiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbiNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZSA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldExvb2t1cE5hbWUgPGVtPkxvb2t1cCBOYW1lPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICogPC9wPgpAQCAtNzYsNyArNzgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0Rlc2NyaXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7CisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTkxLDcgKzkzLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvbl9EaXNwbGF5TmFtZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOworCUxpc3Q8RGlzcGxheU5hbWU+IGdldERpc3BsYXlOYW1lcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTA2LDcgKzEwOCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25fSWNvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEljb25zKCk7CisJTGlzdDxJY29uPiBnZXRJY29ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMTUsMTIgKzExNywxMyBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhCi0JICogCSAgICBuYW1lIGZvciBhIG1lc3NhZ2UgZGVzdGluYXRpb24uICBUaGlzIG5hbWUgbXVzdCBiZQotCSAqIAkgICAgdW5pcXVlIGFtb25nIHRoZSBuYW1lcyBvZiBtZXNzYWdlIGRlc3RpbmF0aW9ucwotCSAqIAkgICAgd2l0aGluIHRoZSBEZXBsb3ltZW50IEZpbGUuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tbmFtZSBlbGVtZW50IHNwZWNpZmllcyBhCisJICogICAgICAgICAgICAgbmFtZSBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiAgVGhpcyBuYW1lIG11c3QgYmUKKwkgKiAgICAgICAgICAgICB1bmlxdWUgYW1vbmcgdGhlIG5hbWVzIG9mIG1lc3NhZ2UgZGVzdGluYXRpb25zCisJICogICAgICAgICAgICAgd2l0aGluIHRoZSBEZXBsb3ltZW50IEZpbGUuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRNZXNzYWdlRGVzdGluYXRpb25OYW1lKFN0cmluZykKQEAgLTE0NSwyNyArMTQ4LDI2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCi0JICogCSAgICAKIAkgKiAKLQkgKiAJICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIG1lc3NhZ2UgZGVzdGluYXRpb24KLQkgKiAJICAgICAgc2hvdWxkIGJlIG1hcHBlZCB0by4gIEVhY2ggbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYKLQkgKiAJICAgICAgZWxlbWVudCB0aGF0IHJlZmVyZW5jZXMgdGhpcyBtZXNzYWdlIGRlc3RpbmF0aW9uIHdpbGwKLQkgKiAJICAgICAgZGVmaW5lIGEgbmFtZSBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoZSByZWZlcmVuY2luZwotCSAqIAkgICAgICBjb21wb25lbnQuICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudgotCSAqIAkgICAgICBuYW1lc3BhY2UuKSAgTWFueSBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8KLQkgKiAJICAgICAgbWFwIHRoZXNlIGxvY2FsIG5hbWVzIHRvIG5hbWVzIG9mIHJlc291cmNlcyBrbm93biB0byB0aGUKLQkgKiAJICAgICAgYXBwbGljYXRpb24gc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbAotCSAqIAkgICAgICBKTkRJIG5hbWUsIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLiAgRWFjaCBvZiB0aGUKLQkgKiAJICAgICAgbG9jYWwgbmFtZXMgc2hvdWxkIGJlIG1hcHBlZCB0byB0aGlzIHNhbWUgZ2xvYmFsIG5hbWUuCi0JICogCi0JICogCSAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IGFueQotCSAqIAkgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5Ci0JICogCSAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKLQkgKiAJICAgICAgcHJvZHVjdC1kZXBlbmRlbnQgYW5kIG9mdGVuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQuICBObwotCSAqIAkgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KLQkgKiAKLQkgKiAJICAgICAgCi0JICogCSAgCisJICogICAgICAgICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIG1lc3NhZ2UgZGVzdGluYXRpb24KKwkgKiAgICAgICAgICAgICBzaG91bGQgYmUgbWFwcGVkIHRvLiAgRWFjaCBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZgorCSAqICAgICAgICAgICAgIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRoaXMgbWVzc2FnZSBkZXN0aW5hdGlvbiB3aWxsCisJICogICAgICAgICAgICAgZGVmaW5lIGEgbmFtZSBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoZSByZWZlcmVuY2luZworCSAqICAgICAgICAgICAgIGNvbXBvbmVudCBvciBpbiBvbmUgb2YgdGhlIG90aGVyIHByZWRlZmluZWQgbmFtZXNwYWNlcy4gCisJICogICAgICAgICAgICAgTWFueSBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlCisJICogICAgICAgICAgICAgbG9jYWwgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZQorCSAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwKKwkgKiAgICAgICAgICAgICBKTkRJIG5hbWUsIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLiAgRWFjaCBvZiB0aGUKKwkgKiAgICAgICAgICAgICBsb2NhbCBuYW1lcyBzaG91bGQgYmUgbWFwcGVkIHRvIHRoaXMgc2FtZSBnbG9iYWwgbmFtZS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKKwkgKiAgICAgICAgICAgICBwYXJ0aWN1bGFyIGZvcm0gb3IgdHlwZSBvZiBtYXBwZWQgbmFtZSwgbm9yIHRoZSBhYmlsaXR5CisJICogICAgICAgICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcworCSAqICAgICAgICAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KKwkgKiAgICAgICAgICAgICB1c2Ugb2YgYSBtYXBwZWQgbmFtZSBpcyBwb3J0YWJsZS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0TWFwcGVkTmFtZShTdHJpbmcpCkBAIC0xODUsNiArMTg3LDM1IEBACiAJdm9pZCBzZXRNYXBwZWROYW1lKFN0cmluZyB2YWx1ZSk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb29rdXAgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIEpOREkgbmFtZSB0byBiZSBsb29rZWQgdXAgdG8gcmVzb2x2ZSB0aGUgbWVzc2FnZSBkZXN0aW5hdGlvbi4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb29rdXAgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TG9va3VwTmFtZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25fTG9va3VwTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRMb29rdXBOYW1lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldExvb2t1cE5hbWUgPGVtPkxvb2t1cCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb29rdXAgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TG9va3VwTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TG9va3VwTmFtZShTdHJpbmcgdmFsdWUpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL01lc3NhZ2VEZXN0aW5hdGlvblJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL01lc3NhZ2VEZXN0aW5hdGlvblJlZi5qYXZhCmluZGV4IGJhYjBmNmUuLjgxMTM0NGUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9NZXNzYWdlRGVzdGluYXRpb25SZWYuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTWVzc2FnZURlc3RpbmF0aW9uUmVmLmphdmEKQEAgLTE5LDQzICsxOSw0MyBAQAogICoKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCi0gKiAJCi0gKiAKLSAqIAkgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KLSAqIAkgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgbWVzc2FnZSBkZXN0aW5hdGlvbgotICogCSAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gRGVwbG95bWVudCBDb21wb25lbnQncwotICogCSAgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgotICogCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgotICogCQkgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUKLSAqIAkJICAtIGFuIG9wdGlvbmFsIG1lc3NhZ2UgZGVzdGluYXRpb24gdHlwZQotICogCQkgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyCi0gKiAJCSAgICB0aGUgZGVzdGluYXRpb24gaXMgdXNlZCBmb3IKLSAqIAkJICAgIGNvbnN1bWluZyBvciBwcm9kdWNpbmcgbWVzc2FnZXMsIG9yIGJvdGguCi0gKiAJCSAgICBpZiBub3Qgc3BlY2lmaWVkLCAiYm90aCIgaXMgYXNzdW1lZC4KLSAqIAkJICAtIGFuIG9wdGlvbmFsIGxpbmsgdG8gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24KLSAqIAkJICAtIG9wdGlvbmFsIGluamVjdGlvbiB0YXJnZXRzCi0gKiAKLSAqIAkgIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLSAqIAkgIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSB0eXBlCi0gKiAJICBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlCi0gKiAJICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLSAqIAkgIHRhcmdldC4KLSAqIAotICogCSAgRXhhbXBsZXM6Ci0gKiAKLSAqIAkgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLXJlZiZndDsKLSAqIAkJICAmbHQ7bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSZndDtqbXMvU3RvY2tRdWV1ZQotICogCQkgICZsdDsvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSZndDsKLSAqIAkJICAmbHQ7bWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlJmd0O2phdmF4Lmptcy5RdWV1ZQotICogCQkgICZsdDsvbWVzc2FnZS1kZXN0aW5hdGlvbi10eXBlJmd0OwotICogCQkgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlJmd0O0NvbnN1bWVzCi0gKiAJCSAgJmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlJmd0OwotICogCQkgICZsdDttZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsmZ3Q7Q29ycG9yYXRlU3RvY2tzCi0gKiAJCSAgJmx0Oy9tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsmZ3Q7Ci0gKiAJICAmbHQ7L21lc3NhZ2UtZGVzdGluYXRpb24tcmVmJmd0OwotICogCi0gKiAJICAKKyAqIDwhW0NEQVRBW1sKKyAqICAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgorICogICAgICAgICBvZiBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhIG1lc3NhZ2UgZGVzdGluYXRpb24KKyAqICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gRGVwbG95bWVudCBDb21wb25lbnQncworICogICAgICAgICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6CisgKiAgICAgICAgIAorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCisgKiAgICAgICAgIC0gdGhlIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlIG5hbWUKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGUKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIKKyAqICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGlzIHVzZWQgZm9yIAorICogICAgICAgICBjb25zdW1pbmcgb3IgcHJvZHVjaW5nIG1lc3NhZ2VzLCBvciBib3RoLgorICogICAgICAgICBpZiBub3Qgc3BlY2lmaWVkLCAiYm90aCIgaXMgYXNzdW1lZC4KKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBsaW5rIHRvIHRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uCisgKiAgICAgICAgIC0gb3B0aW9uYWwgaW5qZWN0aW9uIHRhcmdldHMKKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KKyAqICAgICAgICAgaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgdGhlIHR5cGUKKyAqICAgICAgICAgb2YgdGhlIHRhcmdldCBpcyB1c2VkLiAgSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgdHlwZQorICogICAgICAgICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KKyAqICAgICAgICAgdGFyZ2V0LgorICogICAgICAgICAKKyAqICAgICAgICAgRXhhbXBsZXM6CisgKiAgICAgICAgIAorICogICAgICAgICA8bWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+CisgKiAgICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lPmptcy9TdG9ja1F1ZXVlCisgKiAgICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZT4KKyAqICAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWUKKyAqICAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLXR5cGU+CisgKiAgICAgICAgIDxtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlPkNvbnN1bWVzCisgKiAgICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZT4KKyAqICAgICAgICAgPG1lc3NhZ2UtZGVzdGluYXRpb24tbGluaz5Db3Jwb3JhdGVTdG9ja3MKKyAqICAgICAgICAgPC9tZXNzYWdlLWRlc3RpbmF0aW9uLWxpbms+CisgKiAgICAgICAgIDwvbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWY+CisgKiAgICAgICAgIAorICogXV0+CisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTY5LDYgKzY5LDcgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRMb29rdXBOYW1lIDxlbT5Mb29rdXAgTmFtZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgogICogPC91bD4KICAqIDwvcD4KQEAgLTkxLDcgKzkyLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMTAwLDE1ICsxMDEsMTMgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0JICogCSAgICB0aGUgbmFtZSBvZiBhIG1lc3NhZ2UgZGVzdGluYXRpb24gcmVmZXJlbmNlOyBpdHMKLQkgKiAJICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLQkgKiAJICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAqIAkgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dCBhbmQgbXVzdCBiZQotCSAqIAkgICAgdW5pcXVlIHdpdGhpbiBhbiBlamItamFyIChmb3IgZW50ZXJwcmlzZSBiZWFucykgb3IgYQotCSAqIAkgICAgRGVwbG95bWVudCBGaWxlIChmb3Igb3RoZXJzKS4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgbWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcworCSAqICAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2U7IGl0cworCSAqICAgICAgICAgICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KKwkgKiAgICAgICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldE1lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoU3RyaW5nKQpAQCAtMTU0LDcgKzE1Myw2IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkNvbnN1bWVzIjwvY29kZT4uCiAJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZX0uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KQEAgLTIzOSwyNiArMjM3LDI1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCi0JICogCSAgICAKIAkgKiAKLQkgKiAJICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIHJlc291cmNlIHNob3VsZCBiZQotCSAqIAkgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQotCSAqIAkgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCi0JICogCSAgICAgIGxvY2FsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgdXNpbmcgdGhlIHJlc291cmNlLgotCSAqIAkgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQotCSAqIAkgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCi0JICogCSAgICAgIG5hbWVzIHRvIG5hbWVzIG9mIHJlc291cmNlcyBrbm93biB0byB0aGUgYXBwbGljYXRpb24KLQkgKiAJICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCi0JICogCSAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgotCSAqIAotCSAqIAkgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLQkgKiAJICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAqIAkgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0JICogCSAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLQkgKiAJICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKKwkgKiAgICAgICAgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQorCSAqICAgICAgICAgICAgIHJlc291cmNlJ3MgbmFtZSBlbGVtZW50IG9yIGRlZmF1bHRlZCwgaXMgYSBuYW1lIHRoYXQgaXMKKwkgKiAgICAgICAgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KKwkgKiAgICAgICAgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQorCSAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0byBtYXAgdGhlc2UgbG9jYWwKKwkgKiAgICAgICAgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCisJICogICAgICAgICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCisJICogICAgICAgICAgICAgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55CisJICogICAgICAgICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQorCSAqICAgICAgICAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKKwkgKiAgICAgICAgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCisJICogICAgICAgICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldE1hcHBlZE5hbWUoU3RyaW5nKQpAQCAtMjkwLDcgKzI4NywzNiBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0luamVjdGlvblRhcmdldHMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEluamVjdGlvblRhcmdldHMoKTsKKwlMaXN0PEluamVjdGlvblRhcmdldD4gZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9va3VwIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoZSBKTkRJIG5hbWUgdG8gYmUgbG9va2VkIHVwIHRvIHJlc29sdmUgYSByZXNvdXJjZSByZWZlcmVuY2UuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9va3VwIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldExvb2t1cE5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0xvb2t1cE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0TG9va3VwTmFtZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRMb29rdXBOYW1lIDxlbT5Mb29rdXAgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9va3VwIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldExvb2t1cE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldExvb2t1cE5hbWUoU3RyaW5nIHZhbHVlKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmphdmEKaW5kZXggM2RjMDYzYi4uNzNhZDQ3YyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTI0LDI1ICsyNCw1NCBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlVHlwZSBzcGVjaWZpZXMgdGhlIHVzZSBvZiB0aGUKLSAqIAltZXNzYWdlIGRlc3RpbmF0aW9uIGluZGljYXRlZCBieSB0aGUgcmVmZXJlbmNlLiAgVGhlIHZhbHVlCi0gKiAJaW5kaWNhdGVzIHdoZXRoZXIgbWVzc2FnZXMgYXJlIGNvbnN1bWVkIGZyb20gdGhlIG1lc3NhZ2UKLSAqIAlkZXN0aW5hdGlvbiwgcHJvZHVjZWQgZm9yIHRoZSBkZXN0aW5hdGlvbiwgb3IgYm90aC4gIFRoZQotICogCUFzc2VtYmxlciBtYWtlcyB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbiBpbiBsaW5raW5nIHByb2R1Y2VycwotICogCW9mIGEgZGVzdGluYXRpb24gd2l0aCBpdHMgY29uc3VtZXJzLgotICogCi0gKiAJVGhlIHZhbHVlIG9mIHRoZSBtZXNzYWdlLWRlc3RpbmF0aW9uLXVzYWdlIGVsZW1lbnQgbXVzdCBiZQotICogCW9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogCSAgICBDb25zdW1lcwotICogCSAgICBQcm9kdWNlcwotICogCSAgICBDb25zdW1lc1Byb2R1Y2VzCi0gKiAKKyAqICAgICAgICAgVGhlIG1lc3NhZ2UtZGVzdGluYXRpb24tdXNhZ2VUeXBlIHNwZWNpZmllcyB0aGUgdXNlIG9mIHRoZQorICogICAgICAgICBtZXNzYWdlIGRlc3RpbmF0aW9uIGluZGljYXRlZCBieSB0aGUgcmVmZXJlbmNlLiAgVGhlIHZhbHVlCisgKiAgICAgICAgIGluZGljYXRlcyB3aGV0aGVyIG1lc3NhZ2VzIGFyZSBjb25zdW1lZCBmcm9tIHRoZSBtZXNzYWdlCisgKiAgICAgICAgIGRlc3RpbmF0aW9uLCBwcm9kdWNlZCBmb3IgdGhlIGRlc3RpbmF0aW9uLCBvciBib3RoLiAgVGhlCisgKiAgICAgICAgIEFzc2VtYmxlciBtYWtlcyB1c2Ugb2YgdGhpcyBpbmZvcm1hdGlvbiBpbiBsaW5raW5nIHByb2R1Y2VycworICogICAgICAgICBvZiBhIGRlc3RpbmF0aW9uIHdpdGggaXRzIGNvbnN1bWVycy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgbWVzc2FnZS1kZXN0aW5hdGlvbi11c2FnZSBlbGVtZW50IG11c3QgYmUKKyAqICAgICAgICAgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICAgIENvbnN1bWVzCisgKiAgICAgICAgIFByb2R1Y2VzCisgKiAgICAgICAgIENvbnN1bWVzUHJvZHVjZXMKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoKQogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKK3B1YmxpYyBlbnVtIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKK3sKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5Db25zdW1lczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDT05TVU1FUworCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUNPTlNVTUVTX0xJVEVSQUwoMCwgIkNvbnN1bWVzIiwgIkNvbnN1bWVzIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPlByb2R1Y2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1BST0RVQ0VTCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJUFJPRFVDRVNfTElURVJBTCgxLCAiUHJvZHVjZXMiLCAiUHJvZHVjZXMiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q29uc3VtZXMgUHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ09OU1VNRVNfUFJPRFVDRVMKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDT05TVU1FU19QUk9EVUNFU19MSVRFUkFMKDIsICJDb25zdW1lc1Byb2R1Y2VzIiwgIkNvbnN1bWVzUHJvZHVjZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+Q29uc3VtZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTg2LDM2ICsxMTUsNiBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNVTUVTX1BST0RVQ0VTID0gMjsKIAogCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlNVTUVTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgQ09OU1VNRVNfTElURVJBTCA9IG5ldyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoQ09OU1VNRVMsICJDb25zdW1lcyIsICJDb25zdW1lcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlByb2R1Y2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BST0RVQ0VTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgUFJPRFVDRVNfTElURVJBTCA9IG5ldyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoUFJPRFVDRVMsICJQcm9kdWNlcyIsICJQcm9kdWNlcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnN1bWVzIFByb2R1Y2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlNVTUVTX1BST0RVQ0VTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgQ09OU1VNRVNfUFJPRFVDRVNfTElURVJBTCA9IG5ldyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoQ09OU1VNRVNfUFJPRFVDRVMsICJDb25zdW1lc1Byb2R1Y2VzIiwgIkNvbnN1bWVzUHJvZHVjZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBVc2FnZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMTM0LDcgKzEzMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCkBAIC0xODAsMTcgKzE3OSw3NyBAQAogCQkJY2FzZSBQUk9EVUNFUzogcmV0dXJuIFBST0RVQ0VTX0xJVEVSQUw7CiAJCQljYXNlIENPTlNVTUVTX1BST0RVQ0VTOiByZXR1cm4gQ09OU1VNRVNfUFJPRFVDRVNfTElURVJBTDsKIAkJfQotCQlyZXR1cm4gbnVsbDsJCisJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKIAkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHJpdmF0ZSBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CiAJfQogCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9QYXJhbVZhbHVlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGFyYW1WYWx1ZS5qYXZhCmluZGV4IDBmMDhhNDUuLjY5MzMyYWYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9QYXJhbVZhbHVlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BhcmFtVmFsdWUuamF2YQpAQCAtMjAsOSArMjAsMTAgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGlzIHR5cGUgaXMgYSBnZW5lcmFsIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWNsYXJlCi0gKiAJcGFyYW1ldGVyL3ZhbHVlIGxpc3RzLgotICogCisgKiAgICAgICAgIFRoaXMgdHlwZSBpcyBhIGdlbmVyYWwgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUKKyAqICAgICAgICAgcGFyYW1ldGVyL3ZhbHVlIGxpc3RzLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNTQsNyArNTUsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyYW0gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNjMsMTAgKzY0LDExIEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKLQkgKiAJICAgIHBhcmFtZXRlci4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgcGFyYW0tbmFtZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEKKwkgKiAgICAgICAgICAgICBwYXJhbWV0ZXIuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW0gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0UGFyYW1OYW1lKFN0cmluZykKQEAgLTkyLDEwICs5NCwxMSBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIHZhbHVlIG9mIGEKLQkgKiAJICAgIHBhcmFtZXRlci4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgcGFyYW0tdmFsdWUgZWxlbWVudCBjb250YWlucyB0aGUgdmFsdWUgb2YgYQorCSAqICAgICAgICAgICAgIHBhcmFtZXRlci4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0UGFyYW1WYWx1ZShTdHJpbmcpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGVyc2lzdGVuY2VDb250ZXh0UmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGVyc2lzdGVuY2VDb250ZXh0UmVmLmphdmEKaW5kZXggNmNmODIwYy4uMjA2M2VkNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BlcnNpc3RlbmNlQ29udGV4dFJlZi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9QZXJzaXN0ZW5jZUNvbnRleHRSZWYuamF2YQpAQCAtMTksMzkgKzE5LDM5IEBACiAgKgogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotICogCSAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBwZXJzaXN0ZW5jZSBjb250ZXh0Ci0gKiAJICBhc3NvY2lhdGVkIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLSAqIAkgIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLSAqIAotICogCQkgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqIAkJICAtIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZSBuYW1lCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBwZXJzaXN0ZW5jZSB1bml0IG5hbWUuICBJZiBub3Qgc3BlY2lmaWVkLAotICogICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBwZXJzaXN0ZW5jZSB1bml0IGlzIGFzc3VtZWQuCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIGFzIHRvIHdoZXRoZXIKLSAqIAkJICAgIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHR5cGUgaXMgVHJhbnNhY3Rpb24gb3IKLSAqIAkJICAgIEV4dGVuZGVkLiAgSWYgbm90IHNwZWNpZmllZCwgVHJhbnNhY3Rpb24gaXMgYXNzdW1lZC4KLSAqICAgICAgICAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiBwZXJzaXN0ZW5jZSBwcm9wZXJ0aWVzCi0gKiAJCSAgLSBvcHRpb25hbCBpbmplY3Rpb24gdGFyZ2V0cwotICogCi0gKiAJICBFeGFtcGxlczoKLSAqIAotICogICAgICAgICAgICAgJmx0O3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmJmd0OwotICogICAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZSZndDtteVBlcnNpc3RlbmNlQ29udGV4dAotICogICAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUmZ3Q7Ci0gKiAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmJmd0OwotICogCi0gKiAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtY29udGV4dC1yZWYmZ3Q7Ci0gKiAgICAgICAgICAgICAgICZsdDtwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lJmd0O215UGVyc2lzdGVuY2VDb250ZXh0Ci0gKiAgICAgICAgICAgICAgICAgJmx0Oy9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lJmd0OwotICogICAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtdW5pdC1uYW1lJmd0O1BlcnNpc3RlbmNlVW5pdDEKLSAqICAgICAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLXVuaXQtbmFtZSZndDsKLSAqICAgICAgICAgICAgICAgJmx0O3BlcnNpc3RlbmNlLWNvbnRleHQtdHlwZSZndDtFeHRlbmRlZCZsdDsvcGVyc2lzdGVuY2UtY29udGV4dC10eXBlJmd0OwotICogICAgICAgICAgICAgJmx0Oy9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZiZndDsKLSAqIAotICogCSAgCisgKiA8IVtDREFUQVtbCisgKiAgICAgICAgIFRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZiBlbGVtZW50IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KKyAqICAgICAgICAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBwZXJzaXN0ZW5jZSBjb250ZXh0CisgKiAgICAgICAgIGFzc29jaWF0ZWQgd2l0aGluIGEgRGVwbG95bWVudCBDb21wb25lbnQncworICogICAgICAgICBlbnZpcm9ubWVudC4gSXQgY29uc2lzdHMgb2Y6CisgKiAgICAgICAgIAorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCisgKiAgICAgICAgIC0gdGhlIHBlcnNpc3RlbmNlIGNvbnRleHQgcmVmZXJlbmNlIG5hbWUKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBwZXJzaXN0ZW5jZSB1bml0IG5hbWUuICBJZiBub3Qgc3BlY2lmaWVkLAorICogICAgICAgICB0aGUgZGVmYXVsdCBwZXJzaXN0ZW5jZSB1bml0IGlzIGFzc3VtZWQuCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBhcyB0byB3aGV0aGVyCisgKiAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSBjb250ZXh0IHR5cGUgaXMgVHJhbnNhY3Rpb24gb3IKKyAqICAgICAgICAgRXh0ZW5kZWQuICBJZiBub3Qgc3BlY2lmaWVkLCBUcmFuc2FjdGlvbiBpcyBhc3N1bWVkLgorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcGVyc2lzdGVuY2UgcHJvcGVydGllcworICogICAgICAgICAtIG9wdGlvbmFsIGluamVjdGlvbiB0YXJnZXRzCisgKiAgICAgICAgIAorICogICAgICAgICBFeGFtcGxlczoKKyAqICAgICAgICAgCisgKiAgICAgICAgIDxwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZj4KKyAqICAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZUNvbnRleHQKKyAqICAgICAgICAgPC9wZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lPgorICogICAgICAgICA8L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgorICogICAgICAgICAKKyAqICAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgorICogICAgICAgICA8cGVyc2lzdGVuY2UtY29udGV4dC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlQ29udGV4dAorICogICAgICAgICA8L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWU+CisgKiAgICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LW5hbWU+UGVyc2lzdGVuY2VVbml0MQorICogICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtbmFtZT4KKyAqICAgICAgICAgPHBlcnNpc3RlbmNlLWNvbnRleHQtdHlwZT5FeHRlbmRlZDwvcGVyc2lzdGVuY2UtY29udGV4dC10eXBlPgorICogICAgICAgICA8L3BlcnNpc3RlbmNlLWNvbnRleHQtcmVmPgorICogICAgICAgICAKKyAqIF1dPgorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1CiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC04Nyw3ICs4Nyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTk2LDEzICs5NiwxNCBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIHBlcnNpc3RlbmNlLWNvbnRleHQtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMKLQkgKiAJICAgIHRoZSBuYW1lIG9mIGEgcGVyc2lzdGVuY2UgY29udGV4dCByZWZlcmVuY2U7IGl0cwotCSAqIAkgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgotCSAqIAkgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lCi0JICogCSAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCisJICogICAgICAgICAgICAgdGhlIG5hbWUgb2YgYSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZTsgaXRzCisJICogICAgICAgICAgICAgdmFsdWUgaXMgdGhlIGVudmlyb25tZW50IGVudHJ5IG5hbWUgdXNlZCBpbgorCSAqICAgICAgICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQorCSAqICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBqYXZhOmNvbXAvZW52IGNvbnRleHQuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZShTdHJpbmcpCkBAIC0xMzEsMTcgKzEzMiwxOCBAQAogCSAqICAgICAgICAgICAgIFRoZSBBcHBsaWNhdGlvbiBBc3NlbWJsZXIob3IgQmVhblByb3ZpZGVyKSBtYXkgdXNlIHRoZQogCSAqICAgICAgICAgICAgIGZvbGxvd2luZyBzeW50YXggdG8gYXZvaWQgdGhlIG5lZWQgdG8gcmVuYW1lIHBlcnNpc3RlbmNlCiAJICogICAgICAgICAgICAgdW5pdHMgdG8gaGF2ZSB1bmlxdWUgbmFtZXMgd2l0aGluIGEgSmF2YSBFRSBhcHBsaWNhdGlvbi4KLQkgKiAKKwkgKiAgICAgICAgICAgICAKIAkgKiAgICAgICAgICAgICBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyIHNwZWNpZmllcyB0aGUgcGF0aG5hbWUgb2YgdGhlCiAJICogICAgICAgICAgICAgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgZm9yIHRoZSByZWZlcmVuY2VkCiAJICogICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdCBhbmQgYXBwZW5kcyB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UKIAkgKiAgICAgICAgICAgICB1bml0IHNlcGFyYXRlZCBmcm9tIHRoZSBwYXRobmFtZSBieSAjLiBUaGUgcGF0aG5hbWUgaXMKLQkgKiAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNpbmcgYXBwbGljYXRpb24gY29tcG9uZW50IGphciBmaWxlLgorCSAqICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2luZyBhcHBsaWNhdGlvbiBjb21wb25lbnQgamFyIGZpbGUuIAogCSAqICAgICAgICAgICAgIEluIHRoaXMgbWFubmVyLCBtdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cyB3aXRoIHRoZSBzYW1lCi0JICogICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdCBuYW1lIG1heSBiZSB1bmlxdWVseSBpZGVudGlmaWVkIHdoZW4gdGhlCisJICogICAgICAgICAgICAgcGVyc2lzdGVuY2UgdW5pdCBuYW1lIG1heSBiZSB1bmlxdWVseSBpZGVudGlmaWVkIHdoZW4gdGhlIAogCSAqICAgICAgICAgICAgIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBjYW5ub3QgY2hhbmdlIHBlcnNpc3RlbmNlIHVuaXQgbmFtZXMuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRQZXJzaXN0ZW5jZVVuaXROYW1lKFN0cmluZykKQEAgLTE2Miw3ICsxNjQsNiBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IlRyYW5zYWN0aW9uIjwvY29kZT4uCiAJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFR5cGV9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CkBAIC0yMjcsMTggKzIyOCwxOSBAQAogCSAqICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBwcm9wZXJ0aWVzIGZvciB0aGUgY29udGFpbmVyIG9yIHBlcnNpc3RlbmNlCiAJICogICAgICAgICAgICAgcHJvdmlkZXIuICBWZW5kb3Itc3BlY2lmaWMgcHJvcGVydGllcyBtYXkgYmUgaW5jbHVkZWQgaW4KIAkgKiAgICAgICAgICAgICB0aGUgc2V0IG9mIHByb3BlcnRpZXMuICBQcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCByZWNvZ25pemVkCi0JICogICAgICAgICAgICAgYnkgYSB2ZW5kb3IgbXVzdCBiZSBpZ25vcmVkLiAgRW50cmllcyB0aGF0IG1ha2UgdXNlIG9mIHRoZQorCSAqICAgICAgICAgICAgIGJ5IGEgdmVuZG9yIG11c3QgYmUgaWdub3JlZC4gIEVudHJpZXMgdGhhdCBtYWtlIHVzZSBvZiB0aGUgCiAJICogICAgICAgICAgICAgbmFtZXNwYWNlIGphdmF4LnBlcnNpc3RlbmNlIGFuZCBpdHMgc3VibmFtZXNwYWNlcyBtdXN0IG5vdAogCSAqICAgICAgICAgICAgIGJlIHVzZWQgZm9yIHZlbmRvci1zcGVjaWZpYyBwcm9wZXJ0aWVzLiAgVGhlIG5hbWVzcGFjZQogCSAqICAgICAgICAgICAgIGphdmF4LnBlcnNpc3RlbmNlIGlzIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIHNwZWNpZmljYXRpb24uCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgUHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZVByb3BlcnRpZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFBlcnNpc3RlbmNlUHJvcGVydGllcygpOworCUxpc3Q8UHJvcGVydHlUeXBlPiBnZXRQZXJzaXN0ZW5jZVByb3BlcnRpZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0yNDYsMjYgKzI0OCwyNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAotCSAqIAkgICAgCiAJICogCi0JICogCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLQkgKiAJICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKLQkgKiAJICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcwotCSAqIAkgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLQkgKiAJICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKLQkgKiAJICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAotCSAqIAkgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0JICogCSAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAotCSAqIAkgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KLQkgKiAKLQkgKiAJICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICogCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgKiAJICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAqIAkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICogCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlCisJICogICAgICAgICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKKwkgKiAgICAgICAgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCisJICogICAgICAgICAgICAgbG9jYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCB1c2luZyB0aGUgcmVzb3VyY2UuCisJICogICAgICAgICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKKwkgKiAgICAgICAgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCisJICogICAgICAgICAgICAgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbgorCSAqICAgICAgICAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAorCSAqICAgICAgICAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IGFueQorCSAqICAgICAgICAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKKwkgKiAgICAgICAgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCisJICogICAgICAgICAgICAgcHJvZHVjdC1kZXBlbmRlbnQgYW5kIG9mdGVuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQuICBObworCSAqICAgICAgICAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRNYXBwZWROYW1lKFN0cmluZykKQEAgLTI5Nyw3ICsyOTgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0luamVjdGlvblRhcmdldHMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEluamVjdGlvblRhcmdldHMoKTsKKwlMaXN0PEluamVjdGlvblRhcmdldD4gZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9QZXJzaXN0ZW5jZUNvbnRleHRUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5qYXZhCmluZGV4IGU3YTM4MGQuLmVkY2Q2MTIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9QZXJzaXN0ZW5jZUNvbnRleHRUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BlcnNpc3RlbmNlQ29udGV4dFR5cGUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTI0LDIwICsyNCw0MCBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIHNwZWNpZmllcyB0aGUgdHJhbnNhY3Rpb25hbAotICogCW5hdHVyZSBvZiBhIHBlcnNpc3RlbmNlIGNvbnRleHQgcmVmZXJlbmNlLgotICogCi0gKiAJVGhlIHZhbHVlIG9mIHRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGUgZWxlbWVudCBtdXN0IGJlCi0gKiAJb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAJICAgIFRyYW5zYWN0aW9uCi0gKiAgICAgICAgICAgICBFeHRlbmRlZAotICogCisgKiAgICAgICAgIFRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGVUeXBlIHNwZWNpZmllcyB0aGUgdHJhbnNhY3Rpb25hbAorICogICAgICAgICBuYXR1cmUgb2YgYSBwZXJzaXN0ZW5jZSBjb250ZXh0IHJlZmVyZW5jZS4gIAorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBwZXJzaXN0ZW5jZS1jb250ZXh0LXR5cGUgZWxlbWVudCBtdXN0IGJlCisgKiAgICAgICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogICAgICAgICBUcmFuc2FjdGlvbgorICogICAgICAgICBFeHRlbmRlZAorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKQogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7CitwdWJsaWMgZW51bSBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1RSQU5TQUNUSU9OCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJVFJBTlNBQ1RJT05fTElURVJBTCgwLCAiVHJhbnNhY3Rpb24iLCAiVHJhbnNhY3Rpb24iKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyoqCisJICogVGhlICc8ZW0+PGI+RXh0ZW5kZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRVhURU5ERUQKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlFWFRFTkRFRF9MSVRFUkFMKDEsICJFeHRlbmRlZCIsICJFeHRlbmRlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5UcmFuc2FjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjcsMjYgKzg3LDYgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTkRFRCA9IDE7CiAKIAkvKioKLQkgKiBUaGUgJzxlbT48Yj5UcmFuc2FjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUUkFOU0FDVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBUUkFOU0FDVElPTl9MSVRFUkFMID0gbmV3IFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoVFJBTlNBQ1RJT04sICJUcmFuc2FjdGlvbiIsICJUcmFuc2FjdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZGVkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVOREVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIEVYVEVOREVEX0xJVEVSQUwgPSBuZXcgUGVyc2lzdGVuY2VDb250ZXh0VHlwZShFWFRFTkRFRCwgIkV4dGVuZGVkIiwgIkV4dGVuZGVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCiAJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTEwNCw3ICsxMDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxQZXJzaXN0ZW5jZUNvbnRleHRUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KQEAgLTE0OSwxNyArMTQ5LDc3IEBACiAJCQljYXNlIFRSQU5TQUNUSU9OOiByZXR1cm4gVFJBTlNBQ1RJT05fTElURVJBTDsKIAkJCWNhc2UgRVhURU5ERUQ6IHJldHVybiBFWFRFTkRFRF9MSVRFUkFMOwogCQl9Ci0JCXJldHVybiBudWxsOwkKKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgogCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwcml2YXRlIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CiAJfQogCi19IC8vUGVyc2lzdGVuY2VDb250ZXh0VHlwZQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGVyc2lzdGVuY2VVbml0UmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUGVyc2lzdGVuY2VVbml0UmVmLmphdmEKaW5kZXggMDA1N2Q3NS4uYzk0ZGVkMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BlcnNpc3RlbmNlVW5pdFJlZi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9QZXJzaXN0ZW5jZVVuaXRSZWYuamF2YQpAQCAtMTksMzQgKzE5LDM0IEBACiAgKgogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIHBlcnNpc3RlbmNlLXVuaXQtcmVmIGVsZW1lbnQgY29udGFpbnMgYSBkZWNsYXJhdGlvbgotICogCSAgb2YgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYSBwZXJzaXN0ZW5jZSB1bml0Ci0gKiAJICBhc3NvY2lhdGVkIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLSAqIAkgIGVudmlyb25tZW50LiBJdCBjb25zaXN0cyBvZjoKLSAqIAotICogCQkgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqIAkJICAtIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHJlZmVyZW5jZSBuYW1lCi0gKiAJCSAgLSBhbiBvcHRpb25hbCBwZXJzaXN0ZW5jZSB1bml0IG5hbWUuICBJZiBub3Qgc3BlY2lmaWVkLAotICogICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBwZXJzaXN0ZW5jZSB1bml0IGlzIGFzc3VtZWQuCi0gKiAJCSAgLSBvcHRpb25hbCBpbmplY3Rpb24gdGFyZ2V0cwotICogCi0gKiAJICBFeGFtcGxlczoKLSAqIAotICogICAgICAgICAgICAgJmx0O3BlcnNpc3RlbmNlLXVuaXQtcmVmJmd0OwotICogICAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZSZndDtteVBlcnNpc3RlbmNlVW5pdAotICogICAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWUmZ3Q7Ci0gKiAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLXVuaXQtcmVmJmd0OwotICogCi0gKiAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtdW5pdC1yZWYmZ3Q7Ci0gKiAgICAgICAgICAgICAgICZsdDtwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lJmd0O215UGVyc2lzdGVuY2VVbml0Ci0gKiAgICAgICAgICAgICAgICAgJmx0Oy9wZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lJmd0OwotICogICAgICAgICAgICAgICAmbHQ7cGVyc2lzdGVuY2UtdW5pdC1uYW1lJmd0O1BlcnNpc3RlbmNlVW5pdDEKLSAqICAgICAgICAgICAgICAgICAmbHQ7L3BlcnNpc3RlbmNlLXVuaXQtbmFtZSZndDsKLSAqICAgICAgICAgICAgICZsdDsvcGVyc2lzdGVuY2UtdW5pdC1yZWYmZ3Q7Ci0gKiAKLSAqIAkgIAorICogPCFbQ0RBVEFbWworICogICAgICAgICBUaGUgcGVyc2lzdGVuY2UtdW5pdC1yZWYgZWxlbWVudCBjb250YWlucyBhIGRlY2xhcmF0aW9uCisgKiAgICAgICAgIG9mIERlcGxveW1lbnQgQ29tcG9uZW50J3MgcmVmZXJlbmNlIHRvIGEgcGVyc2lzdGVuY2UgdW5pdAorICogICAgICAgICBhc3NvY2lhdGVkIHdpdGhpbiBhIERlcGxveW1lbnQgQ29tcG9uZW50J3MKKyAqICAgICAgICAgZW52aXJvbm1lbnQuIEl0IGNvbnNpc3RzIG9mOgorICogICAgICAgICAKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgorICogICAgICAgICAtIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHJlZmVyZW5jZSBuYW1lCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgcGVyc2lzdGVuY2UgdW5pdCBuYW1lLiAgSWYgbm90IHNwZWNpZmllZCwKKyAqICAgICAgICAgdGhlIGRlZmF1bHQgcGVyc2lzdGVuY2UgdW5pdCBpcyBhc3N1bWVkLgorICogICAgICAgICAtIG9wdGlvbmFsIGluamVjdGlvbiB0YXJnZXRzCisgKiAgICAgICAgIAorICogICAgICAgICBFeGFtcGxlczoKKyAqICAgICAgICAgCisgKiAgICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LXJlZj4KKyAqICAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+bXlQZXJzaXN0ZW5jZVVuaXQKKyAqICAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lPgorICogICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtcmVmPgorICogICAgICAgICAKKyAqICAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtcmVmPgorICogICAgICAgICA8cGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZT5teVBlcnNpc3RlbmNlVW5pdAorICogICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+CisgKiAgICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LW5hbWU+UGVyc2lzdGVuY2VVbml0MQorICogICAgICAgICA8L3BlcnNpc3RlbmNlLXVuaXQtbmFtZT4KKyAqICAgICAgICAgPC9wZXJzaXN0ZW5jZS11bml0LXJlZj4KKyAqICAgICAgICAgCisgKiBdXT4KKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtODAsNyArODAsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0Rlc2NyaXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7CisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC04OSwxMyArODksMTQgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSBwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzCi0JICogCSAgICB0aGUgbmFtZSBvZiBhIHBlcnNpc3RlbmNlIHVuaXQgcmVmZXJlbmNlOyBpdHMKLQkgKiAJICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KLQkgKiAJICAgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZQotCSAqIAkgICAgcmVsYXRpdmUgdG8gdGhlIGphdmE6Y29tcC9lbnYgY29udGV4dC4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgcGVyc2lzdGVuY2UtdW5pdC1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcworCSAqICAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgcGVyc2lzdGVuY2UgdW5pdCByZWZlcmVuY2U7IGl0cworCSAqICAgICAgICAgICAgIHZhbHVlIGlzIHRoZSBlbnZpcm9ubWVudCBlbnRyeSBuYW1lIHVzZWQgaW4KKwkgKiAgICAgICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLiAgVGhlIG5hbWUgaXMgYSBKTkRJIG5hbWUKKwkgKiAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0LgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUoU3RyaW5nKQpAQCAtMTI0LDE3ICsxMjUsMTggQEAKIAkgKiAgICAgICAgICAgICBUaGUgQXBwbGljYXRpb24gQXNzZW1ibGVyKG9yIEJlYW5Qcm92aWRlcikgbWF5IHVzZSB0aGUKIAkgKiAgICAgICAgICAgICBmb2xsb3dpbmcgc3ludGF4IHRvIGF2b2lkIHRoZSBuZWVkIHRvIHJlbmFtZSBwZXJzaXN0ZW5jZQogCSAqICAgICAgICAgICAgIHVuaXRzIHRvIGhhdmUgdW5pcXVlIG5hbWVzIHdpdGhpbiBhIEphdmEgRUUgYXBwbGljYXRpb24uCi0JICogCisJICogICAgICAgICAgICAgCiAJICogICAgICAgICAgICAgVGhlIEFwcGxpY2F0aW9uIEFzc2VtYmxlciBzcGVjaWZpZXMgdGhlIHBhdGhuYW1lIG9mIHRoZQogCSAqICAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGZvciB0aGUgcmVmZXJlbmNlZAogCSAqICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgYW5kIGFwcGVuZHMgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlCiAJICogICAgICAgICAgICAgdW5pdCBzZXBhcmF0ZWQgZnJvbSB0aGUgcGF0aG5hbWUgYnkgIy4gVGhlIHBhdGhuYW1lIGlzCi0JICogICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGNvbXBvbmVudCBqYXIgZmlsZS4KKwkgKiAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNpbmcgYXBwbGljYXRpb24gY29tcG9uZW50IGphciBmaWxlLiAKIAkgKiAgICAgICAgICAgICBJbiB0aGlzIG1hbm5lciwgbXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdHMgd2l0aCB0aGUgc2FtZQotCSAqICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgbmFtZSBtYXkgYmUgdW5pcXVlbHkgaWRlbnRpZmllZCB3aGVuIHRoZQorCSAqICAgICAgICAgICAgIHBlcnNpc3RlbmNlIHVuaXQgbmFtZSBtYXkgYmUgdW5pcXVlbHkgaWRlbnRpZmllZCB3aGVuIHRoZSAKIAkgKiAgICAgICAgICAgICBBcHBsaWNhdGlvbiBBc3NlbWJsZXIgY2Fubm90IGNoYW5nZSBwZXJzaXN0ZW5jZSB1bml0IG5hbWVzLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0UGVyc2lzdGVuY2VVbml0TmFtZShTdHJpbmcpCkBAIC0xNTksMjYgKzE2MSwyNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAotCSAqIAkgICAgCiAJICogCi0JICogCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLQkgKiAJICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKLQkgKiAJICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcwotCSAqIAkgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLQkgKiAJICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKLQkgKiAJICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAotCSAqIAkgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0JICogCSAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAotCSAqIAkgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KLQkgKiAKLQkgKiAJICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICogCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgKiAJICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAqIAkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICogCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlCisJICogICAgICAgICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKKwkgKiAgICAgICAgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCisJICogICAgICAgICAgICAgbG9jYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCB1c2luZyB0aGUgcmVzb3VyY2UuCisJICogICAgICAgICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKKwkgKiAgICAgICAgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCisJICogICAgICAgICAgICAgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbgorCSAqICAgICAgICAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAorCSAqICAgICAgICAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IGFueQorCSAqICAgICAgICAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKKwkgKiAgICAgICAgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCisJICogICAgICAgICAgICAgcHJvZHVjdC1kZXBlbmRlbnQgYW5kIG9mdGVuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQuICBObworCSAqICAgICAgICAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRNYXBwZWROYW1lKFN0cmluZykKQEAgLTIxMCw3ICsyMTEsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0luamVjdGlvblRhcmdldHMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEluamVjdGlvblRhcmdldHMoKTsKKwlMaXN0PEluamVjdGlvblRhcmdldD4gZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9Qb3J0Q29tcG9uZW50UmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUG9ydENvbXBvbmVudFJlZi5qYXZhCmluZGV4IDM0YWRhMTcuLjRlNGQyZGEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9Qb3J0Q29tcG9uZW50UmVmLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1BvcnRDb21wb25lbnRSZWYuamF2YQpAQCAtMTAsNiArMTAsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZTsKIAoraW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTE5LDEyICsyMSwxMyBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSBwb3J0LWNvbXBvbmVudC1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIGNsaWVudCBkZXBlbmRlbmN5Ci0gKiAJb24gdGhlIGNvbnRhaW5lciBmb3IgcmVzb2x2aW5nIGEgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UKLSAqIAl0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50Ci0gKiAJSW50ZXJmYWNlIHdpdGggYSBwYXJ0aWN1bGFyIHBvcnQtY29tcG9uZW50LiBUaGlzIGlzIG9ubHkgdXNlZAotICogCWJ5IHRoZSBjb250YWluZXIgZm9yIGEgU2VydmljZS5nZXRQb3J0KENsYXNzKSBtZXRob2QgY2FsbC4KLSAqIAorICogICAgICAgICBUaGUgcG9ydC1jb21wb25lbnQtcmVmIGVsZW1lbnQgZGVjbGFyZXMgYSBjbGllbnQgZGVwZW5kZW5jeQorICogICAgICAgICBvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQorICogICAgICAgICB0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50CisgKiAgICAgICAgIEludGVyZmFjZSB3aXRoIGEgcGFydGljdWxhciBwb3J0LWNvbXBvbmVudC4gVGhpcyBpcyBvbmx5IHVzZWQKKyAqICAgICAgICAgYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIFNlcnZpY2VzIENsaWVudCAxLjIKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTMzLDYgKzM2LDkgQEAKICAqIDx1bD4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgPGVtPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNpc0VuYWJsZU10b20gPGVtPkVuYWJsZSBNdG9tPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRNdG9tVGhyZXNob2xkIDxlbT5NdG9tIFRocmVzaG9sZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYjZ2V0QWRkcmVzc2luZyA8ZW0+QWRkcmVzc2luZzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYjZ2V0UmVzcGVjdEJpbmRpbmcgPGVtPlJlc3BlY3QgQmluZGluZzwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYjZ2V0UG9ydENvbXBvbmVudExpbmsgPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CiAgKiA8L3VsPgpAQCAtNTAsMTEgKzU2LDEyIEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UgZWxlbWVudCBkZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkCi0JICogCSAgICBKYXZhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2Ugb2YgYQotCSAqIAkgICAgV1NETCBwb3J0LgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZSBlbGVtZW50IGRlZmluZXMgYSBmdWxseSBxdWFsaWZpZWQKKwkgKiAgICAgICAgICAgICBKYXZhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2Ugb2YgYQorCSAqICAgICAgICAgICAgIFdTREwgcG9ydC4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBXZWIgU2VydmljZXMgQ2xpZW50IDEuMgorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShTdHJpbmcpCkBAIC04MSw5ICs4OCwxMSBAQAogCSAqIAogCSAqIAogCSAqICAgICAgICAgICAgIFVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgU09BUCBNVE9NL1hPUCBtZWNoYW5pc20gb24gdGhlIGNsaWVudAotCSAqIAkgICAgc2lkZSBmb3IgYSBwb3J0LWNvbXBvbmVudC4KLQkgKiAKLQkgKiAJICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQorCSAqICAgICAgICAgICAgIHNpZGUgZm9yIGEgcG9ydC1jb21wb25lbnQuIAorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiBTZXJ2aWNlcyBDbGllbnQgMS4yCiAJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbmFibGUgTXRvbTwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMzEsMjMgKzE0MCwxMjYgQEAKIAlib29sZWFuIGlzU2V0RW5hYmxlTXRvbSgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXRvbSBUaHJlc2hvbGQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFdoZW4gTVRPTSBpcyBlbmFibGVkLCBiaW5hcnkgZGF0YSBhYm92ZSB0aGlzIHNpemUgaW4gYnl0ZXMKKwkgKiAgICAgICAgICAgICBzaG91bGQgYmUgWE9QIGVuY29kZWQgb3Igc2VudCBhcyBhdHRhY2htZW50LiBEZWZhdWx0IHZhbHVlIGlzIDAuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgTm90IHRvIGJlIHNwZWNpZmllZCBmb3IgSkFYLVJQQyBydW50aW1lCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgV2ViIFNlcnZpY2VzIENsaWVudCAxLjMKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk10b20gVGhyZXNob2xkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNdG9tVGhyZXNob2xkKEJpZ0ludGVnZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50UmVmX010b21UaHJlc2hvbGQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlCaWdJbnRlZ2VyIGdldE10b21UaHJlc2hvbGQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldE10b21UaHJlc2hvbGQgPGVtPk10b20gVGhyZXNob2xkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdG9tIFRocmVzaG9sZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TXRvbVRocmVzaG9sZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TXRvbVRocmVzaG9sZChCaWdJbnRlZ2VyIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZHJlc3Npbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoaXMgc3BlY2lmaWVzIHRoZSBXUy1BZGRyZXNzaW5nIHJlcXVpcmVtZW50cyBmb3IgYSBKQVgtV1MKKwkgKiAgICAgICAgICAgICB3ZWIgc2VydmljZS4gSXQgY29ycmVzcG9uZHMgdG8gamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZworCSAqICAgICAgICAgICAgIGFubm90YXRpb24gb3IgaXRzIGZlYXR1cmUgamF2YXgueG1sLndzLnNvYXAuQWRkcmVzc2luZ0ZlYXR1cmUuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgU2VlIHRoZSBhZGRyZXNzaW5nVHlwZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtUlBDIHJ1bnRpbWUKKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgU2VydmljZXMgQ2xpZW50IDEuMworCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkcmVzc2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QWRkcmVzc2luZyhBZGRyZXNzaW5nVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBvcnRDb21wb25lbnRSZWZfQWRkcmVzc2luZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUFkZHJlc3NpbmdUeXBlIGdldEFkZHJlc3NpbmcoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldEFkZHJlc3NpbmcgPGVtPkFkZHJlc3Npbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFkZHJlc3Npbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEFkZHJlc3NpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFkZHJlc3NpbmcoQWRkcmVzc2luZ1R5cGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzcGVjdCBCaW5kaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgueG1sLndzLlJlc3BlY3RCaW5kaW5nIGFubm90YXRpb24KKwkgKiAgICAgICAgICAgICBvciBpdHMgY29ycmVzcG9uZGluZyBqYXZheC54bWwud3MuUmVzcGVjdEJpbmRpbmdGZWF0dXJlIHdlYgorCSAqICAgICAgICAgICAgIHNlcnZpY2UgZmVhdHVyZS4gVGhpcyBpcyB1c2VkIHRvIGNvbnRyb2wgd2hldGhlciBhIEpBWC1XUworCSAqICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG11c3QgcmVzcGVjdC9ob25vciB0aGUgY29udGVudHMgb2YgdGhlCisJICogICAgICAgICAgICAgd3NkbDpiaW5kaW5nIGluIHRoZSBXU0RMIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2aWNlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1SUEMgcnVudGltZQorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIFdlYiBTZXJ2aWNlcyBDbGllbnQgMS4zCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwZWN0IEJpbmRpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFJlc3BlY3RCaW5kaW5nKFJlc3BlY3RCaW5kaW5nVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFBvcnRDb21wb25lbnRSZWZfUmVzcGVjdEJpbmRpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSZXNwZWN0QmluZGluZ1R5cGUgZ2V0UmVzcGVjdEJpbmRpbmcoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldFJlc3BlY3RCaW5kaW5nIDxlbT5SZXNwZWN0IEJpbmRpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BlY3QgQmluZGluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UmVzcGVjdEJpbmRpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJlc3BlY3RCaW5kaW5nKFJlc3BlY3RCaW5kaW5nVHlwZSB2YWx1ZSk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3J0IENvbXBvbmVudCBMaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSBwb3J0LWNvbXBvbmVudC1saW5rIGVsZW1lbnQgbGlua3MgYSBwb3J0LWNvbXBvbmVudC1yZWYKLQkgKiAJICAgIHRvIGEgc3BlY2lmaWMgcG9ydC1jb21wb25lbnQgcmVxdWlyZWQgdG8gYmUgbWFkZSBhdmFpbGFibGUKLQkgKiAJICAgIGJ5IGEgc2VydmljZSByZWZlcmVuY2UuCi0JICogCi0JICogCSAgICBUaGUgdmFsdWUgb2YgYSBwb3J0LWNvbXBvbmVudC1saW5rIG11c3QgYmUgdGhlCi0JICogCSAgICBwb3J0LWNvbXBvbmVudC1uYW1lIG9mIGEgcG9ydC1jb21wb25lbnQgaW4gdGhlIHNhbWUgbW9kdWxlCi0JICogCSAgICBvciBhbm90aGVyIG1vZHVsZSBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbiB1bml0LiBUaGUgc3ludGF4Ci0JICogCSAgICBmb3Igc3BlY2lmaWNhdGlvbiBmb2xsb3dzIHRoZSBzeW50YXggZGVmaW5lZCBmb3IgZWpiLWxpbmsKLQkgKiAJICAgIGluIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIHBvcnQtY29tcG9uZW50LWxpbmsgZWxlbWVudCBsaW5rcyBhIHBvcnQtY29tcG9uZW50LXJlZgorCSAqICAgICAgICAgICAgIHRvIGEgc3BlY2lmaWMgcG9ydC1jb21wb25lbnQgcmVxdWlyZWQgdG8gYmUgbWFkZSBhdmFpbGFibGUKKwkgKiAgICAgICAgICAgICBieSBhIHNlcnZpY2UgcmVmZXJlbmNlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiBhIHBvcnQtY29tcG9uZW50LWxpbmsgbXVzdCBiZSB0aGUKKwkgKiAgICAgICAgICAgICBwb3J0LWNvbXBvbmVudC1uYW1lIG9mIGEgcG9ydC1jb21wb25lbnQgaW4gdGhlIHNhbWUgbW9kdWxlCisJICogICAgICAgICAgICAgb3IgYW5vdGhlciBtb2R1bGUgaW4gdGhlIHNhbWUgYXBwbGljYXRpb24gdW5pdC4gVGhlIHN5bnRheAorCSAqICAgICAgICAgICAgIGZvciBzcGVjaWZpY2F0aW9uIGZvbGxvd3MgdGhlIHN5bnRheCBkZWZpbmVkIGZvciBlamItbGluaworCSAqICAgICAgICAgICAgIGluIHRoZSBFSkIgMi4wIHNwZWNpZmljYXRpb24uCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIFNlcnZpY2VzIENsaWVudCAxLjIKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFBvcnRDb21wb25lbnRMaW5rKFN0cmluZykKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9Qcm9wZXJ0eVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9Qcm9wZXJ0eVR5cGUuamF2YQppbmRleCBkNzU4YjNhLi45MDVlYzc4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUHJvcGVydHlUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Byb3BlcnR5VHlwZS5qYXZhCkBAIC0xOSw4ICsxOSw5IEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJU3BlY2lmaWVzIGEgbmFtZS92YWx1ZSBwYWlyLgotICogCisgKiAgICAgICAgIFNwZWNpZmllcyBhIG5hbWUvdmFsdWUgcGFpci4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SZXNBdXRoVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc0F1dGhUeXBlLmphdmEKaW5kZXggNDRhN2YwYS4uZWQ2Nzc5ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc0F1dGhUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc0F1dGhUeXBlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yNCwyNCArMjQsNDQgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgcmVzLWF1dGhUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudAotICogCWNvZGUgc2lnbnMgb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3IKLSAqIAl3aGV0aGVyIHRoZSBDb250YWluZXIgd2lsbCBzaWduIG9uIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyCi0gKiAJb24gYmVoYWxmIG9mIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudC4gSW4gdGhlIGxhdHRlciBjYXNlLAotICogCXRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQotICogCURlcGxveWVyLgotICogCi0gKiAJVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgotICogCi0gKiAJICAgIEFwcGxpY2F0aW9uCi0gKiAJICAgIENvbnRhaW5lcgotICogCisgKiAgICAgICAgIFRoZSByZXMtYXV0aFR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50CisgKiAgICAgICAgIGNvZGUgc2lnbnMgb24gcHJvZ3JhbW1hdGljYWxseSB0byB0aGUgcmVzb3VyY2UgbWFuYWdlciwgb3IKKyAqICAgICAgICAgd2hldGhlciB0aGUgQ29udGFpbmVyIHdpbGwgc2lnbiBvbiB0byB0aGUgcmVzb3VyY2UgbWFuYWdlcgorICogICAgICAgICBvbiBiZWhhbGYgb2YgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50LiBJbiB0aGUgbGF0dGVyIGNhc2UsCisgKiAgICAgICAgIHRoZSBDb250YWluZXIgdXNlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHN1cHBsaWVkIGJ5IHRoZQorICogICAgICAgICBEZXBsb3llci4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKKyAqICAgICAgICAgCisgKiAgICAgICAgIEFwcGxpY2F0aW9uCisgKiAgICAgICAgIENvbnRhaW5lcgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc0F1dGhUeXBlKCkKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJlc0F1dGhUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKK3B1YmxpYyBlbnVtIFJlc0F1dGhUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0FQUExJQ0FUSU9OCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQVBQTElDQVRJT05fTElURVJBTCgwLCAiQXBwbGljYXRpb24iLCAiQXBwbGljYXRpb24iKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NPTlRBSU5FUgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUNPTlRBSU5FUl9MSVRFUkFMKDEsICJDb250YWluZXIiLCAiQ29udGFpbmVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC03MSwyNiArOTEsNiBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRBSU5FUiA9IDE7CiAKIAkvKioKLQkgKiBUaGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBUFBMSUNBVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aFR5cGUgQVBQTElDQVRJT05fTElURVJBTCA9IG5ldyBSZXNBdXRoVHlwZShBUFBMSUNBVElPTiwgIkFwcGxpY2F0aW9uIiwgIkFwcGxpY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRBSU5FUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aFR5cGUgQ09OVEFJTkVSX0xJVEVSQUwgPSBuZXcgUmVzQXV0aFR5cGUoQ09OVEFJTkVSLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXMgQXV0aCBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMTA4LDcgKzEwOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFJlc0F1dGhUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJlcyBBdXRoIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCkBAIC0xNTMsMTcgKzE1Myw3NyBAQAogCQkJY2FzZSBBUFBMSUNBVElPTjogcmV0dXJuIEFQUExJQ0FUSU9OX0xJVEVSQUw7CiAJCQljYXNlIENPTlRBSU5FUjogcmV0dXJuIENPTlRBSU5FUl9MSVRFUkFMOwogCQl9Ci0JCXJldHVybiBudWxsOwkKKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgogCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwcml2YXRlIFJlc0F1dGhUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwogCX0KIAotfSAvL1Jlc0F1dGhUeXBlCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SZXNTaGFyaW5nU2NvcGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzU2hhcmluZ1Njb3BlVHlwZS5qYXZhCmluZGV4IDcyMzE5ZWYuLjNmMWM0MTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SZXNTaGFyaW5nU2NvcGVUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc1NoYXJpbmdTY29wZVR5cGUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTI0LDIyICsyNCw0MiBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSByZXMtc2hhcmluZy1zY29wZSB0eXBlIHNwZWNpZmllcyB3aGV0aGVyIGNvbm5lY3Rpb25zCi0gKiAJb2J0YWluZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uCi0gKiAJZmFjdG9yeSByZWZlcmVuY2UgY2FuIGJlIHNoYXJlZC4gVGhlIHZhbHVlLCBpZiBzcGVjaWZpZWQsCi0gKiAJbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0gKiAKLSAqIAkgICAgU2hhcmVhYmxlCi0gKiAJICAgIFVuc2hhcmVhYmxlCi0gKiAKLSAqIAlUaGUgZGVmYXVsdCB2YWx1ZSBpcyBTaGFyZWFibGUuCi0gKiAKKyAqICAgICAgICAgVGhlIHJlcy1zaGFyaW5nLXNjb3BlIHR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgY29ubmVjdGlvbnMKKyAqICAgICAgICAgb2J0YWluZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uCisgKiAgICAgICAgIGZhY3RvcnkgcmVmZXJlbmNlIGNhbiBiZSBzaGFyZWQuIFRoZSB2YWx1ZSwgaWYgc3BlY2lmaWVkLAorICogICAgICAgICBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKKyAqICAgICAgICAgCisgKiAgICAgICAgIFNoYXJlYWJsZQorICogICAgICAgICBVbnNoYXJlYWJsZQorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgU2hhcmVhYmxlLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc1NoYXJpbmdTY29wZVR5cGUoKQogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzU2hhcmluZ1Njb3BlVHlwZSBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7CitwdWJsaWMgZW51bSBSZXNTaGFyaW5nU2NvcGVUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNoYXJlYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTSEFSRUFCTEUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlTSEFSRUFCTEVfTElURVJBTCgwLCAiU2hhcmVhYmxlIiwgIlNoYXJlYWJsZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VbnNoYXJlYWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNVTlNIQVJFQUJMRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVVOU0hBUkVBQkxFX0xJVEVSQUwoMSwgIlVuc2hhcmVhYmxlIiwgIlVuc2hhcmVhYmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPlNoYXJlYWJsZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjksMjYgKzg5LDYgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNIQVJFQUJMRSA9IDE7CiAKIAkvKioKLQkgKiBUaGUgJzxlbT48Yj5TaGFyZWFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0hBUkVBQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNTaGFyaW5nU2NvcGVUeXBlIFNIQVJFQUJMRV9MSVRFUkFMID0gbmV3IFJlc1NoYXJpbmdTY29wZVR5cGUoU0hBUkVBQkxFLCAiU2hhcmVhYmxlIiwgIlNoYXJlYWJsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVuc2hhcmVhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1VOU0hBUkVBQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNTaGFyaW5nU2NvcGVUeXBlIFVOU0hBUkVBQkxFX0xJVEVSQUwgPSBuZXcgUmVzU2hhcmluZ1Njb3BlVHlwZShVTlNIQVJFQUJMRSwgIlVuc2hhcmVhYmxlIiwgIlVuc2hhcmVhYmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCiAJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlJlcyBTaGFyaW5nIFNjb3BlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMDYsNyArMTA2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8UmVzU2hhcmluZ1Njb3BlVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZXMgU2hhcmluZyBTY29wZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgpAQCAtMTUxLDE3ICsxNTEsNzcgQEAKIAkJCWNhc2UgU0hBUkVBQkxFOiByZXR1cm4gU0hBUkVBQkxFX0xJVEVSQUw7CiAJCQljYXNlIFVOU0hBUkVBQkxFOiByZXR1cm4gVU5TSEFSRUFCTEVfTElURVJBTDsKIAkJfQotCQlyZXR1cm4gbnVsbDsJCisJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKIAkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHJpdmF0ZSBSZXNTaGFyaW5nU2NvcGVUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwogCX0KIAotfSAvL1Jlc1NoYXJpbmdTY29wZVR5cGUKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc291cmNlRW52UmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzb3VyY2VFbnZSZWYuamF2YQppbmRleCBjNDMxM2M5Li45YzhlOWZhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzb3VyY2VFbnZSZWYuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzb3VyY2VFbnZSZWYuamF2YQpAQCAtMTksMzYgKzE5LDM2IEBACiAgKgogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIHJlc291cmNlLWVudi1yZWZUeXBlIGlzIHVzZWQgdG8gZGVmaW5lCi0gKiAJICByZXNvdXJjZS1lbnYtdHlwZSBlbGVtZW50cy4gIEl0IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQotICogCSAgRGVwbG95bWVudCBDb21wb25lbnQncyByZWZlcmVuY2UgdG8gYW4gYWRtaW5pc3RlcmVkIG9iamVjdAotICogCSAgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UgaW4gdGhlIERlcGxveW1lbnQgQ29tcG9uZW50J3MKLSAqIAkgIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZQotICogCSAgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIG5hbWUsIGFuZCBhbiBvcHRpb25hbAotICogCSAgaW5kaWNhdGlvbiBvZiB0aGUgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlIHR5cGUKLSAqIAkgIGV4cGVjdGVkIGJ5IHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLgotICogCi0gKiAJICBJdCBhbHNvIGluY2x1ZGVzIG9wdGlvbmFsIGVsZW1lbnRzIHRvIGRlZmluZSBpbmplY3Rpb24gb2YKLSAqIAkgIHRoZSBuYW1lZCByZXNvdXJjZSBpbnRvIGZpZWxkcyBvciBKYXZhQmVhbnMgcHJvcGVydGllcy4KLSAqIAotICogCSAgVGhlIHJlc291cmNlIGVudmlyb25tZW50IHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLSAqIAkgIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSB0eXBlCi0gKiAJICBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlCi0gKiAJICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLSAqIAkgIHRhcmdldC4KLSAqIAotICogCSAgRXhhbXBsZToKLSAqIAotICogCSAgJmx0O3Jlc291cmNlLWVudi1yZWYmZ3Q7Ci0gKiAJICAgICAgJmx0O3Jlc291cmNlLWVudi1yZWYtbmFtZSZndDtqbXMvU3RvY2tRdWV1ZQotICogCSAgICAgICZsdDsvcmVzb3VyY2UtZW52LXJlZi1uYW1lJmd0OwotICogCSAgICAgICZsdDtyZXNvdXJjZS1lbnYtcmVmLXR5cGUmZ3Q7amF2YXguam1zLlF1ZXVlCi0gKiAJICAgICAgJmx0Oy9yZXNvdXJjZS1lbnYtcmVmLXR5cGUmZ3Q7Ci0gKiAJICAmbHQ7L3Jlc291cmNlLWVudi1yZWYmZ3Q7Ci0gKiAKLSAqIAkgIAorICogPCFbQ0RBVEFbWworICogICAgICAgICBUaGUgcmVzb3VyY2UtZW52LXJlZlR5cGUgaXMgdXNlZCB0byBkZWZpbmUKKyAqICAgICAgICAgcmVzb3VyY2UtZW52LXJlZiBlbGVtZW50cy4gIEl0IGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQorICogICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0CisgKiAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGluIHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCdzCisgKiAgICAgICAgIGVudmlyb25tZW50LiAgSXQgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZQorICogICAgICAgICByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UgbmFtZSwgYW5kIGFuIG9wdGlvbmFsCisgKiAgICAgICAgIGluZGljYXRpb24gb2YgdGhlIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZSB0eXBlCisgKiAgICAgICAgIGV4cGVjdGVkIGJ5IHRoZSBEZXBsb3ltZW50IENvbXBvbmVudCBjb2RlLgorICogICAgICAgICAKKyAqICAgICAgICAgSXQgYWxzbyBpbmNsdWRlcyBvcHRpb25hbCBlbGVtZW50cyB0byBkZWZpbmUgaW5qZWN0aW9uIG9mCisgKiAgICAgICAgIHRoZSBuYW1lZCByZXNvdXJjZSBpbnRvIGZpZWxkcyBvciBKYXZhQmVhbnMgcHJvcGVydGllcy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSByZXNvdXJjZSBlbnZpcm9ubWVudCB0eXBlIG11c3QgYmUgc3VwcGxpZWQgdW5sZXNzIGFuCisgKiAgICAgICAgIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSB0eXBlCisgKiAgICAgICAgIG9mIHRoZSB0YXJnZXQgaXMgdXNlZC4gIElmIGJvdGggYXJlIHNwZWNpZmllZCwgdGhlIHR5cGUKKyAqICAgICAgICAgbXVzdCBiZSBhc3NpZ25tZW50IGNvbXBhdGlibGUgd2l0aCB0aGUgdHlwZSBvZiB0aGUgaW5qZWN0aW9uCisgKiAgICAgICAgIHRhcmdldC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEV4YW1wbGU6CisgKiAgICAgICAgIAorICogICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KKyAqICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5qbXMvU3RvY2tRdWV1ZQorICogICAgICAgICA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KKyAqICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZheC5qbXMuUXVldWUKKyAqICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+CisgKiAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KKyAqICAgICAgICAgCisgKiBdXT4KKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNjAsNiArNjAsNyBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRSZXNvdXJjZUVudlJlZlR5cGUgPGVtPlJlc291cmNlIEVudiBSZWYgVHlwZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZiNnZXRMb29rdXBOYW1lIDxlbT5Mb29rdXAgTmFtZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICogPC9wPgpAQCAtODIsNyArODMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VFbnZSZWZfRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtOTEsMTQgKzkyLDE1IEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgcmVzb3VyY2UtZW52LXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lCi0JICogCSAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZTsgaXRzIHZhbHVlIGlzCi0JICogCSAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCi0JICogCSAgICB0aGUgRGVwbG95bWVudCBDb21wb25lbnQgY29kZS4gIFRoZSBuYW1lIGlzIGEgSk5ESQotCSAqIAkgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0Ci0JICogCSAgICBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBDb21wb25lbnQuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIHJlc291cmNlLWVudi1yZWYtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZQorCSAqICAgICAgICAgICAgIG9mIGEgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlOyBpdHMgdmFsdWUgaXMKKwkgKiAgICAgICAgICAgICB0aGUgZW52aXJvbm1lbnQgZW50cnkgbmFtZSB1c2VkIGluCisJICogICAgICAgICAgICAgdGhlIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUuICBUaGUgbmFtZSBpcyBhIEpOREkgCisJICogICAgICAgICAgICAgbmFtZSByZWxhdGl2ZSB0byB0aGUgamF2YTpjb21wL2VudiBjb250ZXh0IGFuZCBtdXN0IAorCSAqICAgICAgICAgICAgIGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IENvbXBvbmVudC4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFJlc291cmNlRW52UmVmTmFtZShTdHJpbmcpCkBAIC0xMjQsMTIgKzEyNiwxMyBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIHJlc291cmNlLWVudi1yZWYtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZQotCSAqIAkgICAgb2YgYSByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2UuICBJdCBpcyB0aGUKLQkgKiAJICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBsYW5ndWFnZSBjbGFzcyBvcgotCSAqIAkgICAgaW50ZXJmYWNlLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSByZXNvdXJjZS1lbnYtcmVmLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHR5cGUKKwkgKiAgICAgICAgICAgICBvZiBhIHJlc291cmNlIGVudmlyb25tZW50IHJlZmVyZW5jZS4gIEl0IGlzIHRoZQorCSAqICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBsYW5ndWFnZSBjbGFzcyBvcgorCSAqICAgICAgICAgICAgIGludGVyZmFjZS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmIFR5cGU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFJlc291cmNlRW52UmVmVHlwZShTdHJpbmcpCkBAIC0xNTQsMjYgKzE1NywyNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAotCSAqIAkgICAgCiAJICogCi0JICogCSAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKLQkgKiAJICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKLQkgKiAJICAgICAgcmVzb3VyY2UncyBuYW1lIGVsZW1lbnQgb3IgZGVmYXVsdGVkLCBpcyBhIG5hbWUgdGhhdCBpcwotCSAqIAkgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KLQkgKiAJICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKLQkgKiAJICAgICAgYXBwbGljYXRpb24gc2VydmVycyBwcm92aWRlIGEgd2F5IHRvIG1hcCB0aGVzZSBsb2NhbAotCSAqIAkgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCi0JICogCSAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAotCSAqIAkgICAgICBidXQgbWF5IGJlIGEgbmFtZSBvZiBhbnkgZm9ybS4KLQkgKiAKLQkgKiAJICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55Ci0JICogCSAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKLQkgKiAJICAgICAgdG8gdXNlIG1hcHBlZCBuYW1lcy4gIFRoZSBtYXBwZWQgbmFtZSBpcwotCSAqIAkgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCi0JICogCSAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBBIHByb2R1Y3Qgc3BlY2lmaWMgbmFtZSB0aGF0IHRoaXMgcmVzb3VyY2Ugc2hvdWxkIGJlCisJICogICAgICAgICAgICAgbWFwcGVkIHRvLiAgVGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZSwgYXMgZGVmaW5lZCBieSB0aGUKKwkgKiAgICAgICAgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCisJICogICAgICAgICAgICAgbG9jYWwgdG8gdGhlIGFwcGxpY2F0aW9uIGNvbXBvbmVudCB1c2luZyB0aGUgcmVzb3VyY2UuCisJICogICAgICAgICAgICAgKEl0J3MgYSBuYW1lIGluIHRoZSBKTkRJIGphdmE6Y29tcC9lbnYgbmFtZXNwYWNlLikgIE1hbnkKKwkgKiAgICAgICAgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCisJICogICAgICAgICAgICAgbmFtZXMgdG8gbmFtZXMgb2YgcmVzb3VyY2VzIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbgorCSAqICAgICAgICAgICAgIHNlcnZlci4gIFRoaXMgbWFwcGVkIG5hbWUgaXMgb2Z0ZW4gYSBnbG9iYWwgSk5ESSBuYW1lLAorCSAqICAgICAgICAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEFwcGxpY2F0aW9uIHNlcnZlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBzdXBwb3J0IGFueQorCSAqICAgICAgICAgICAgIHBhcnRpY3VsYXIgZm9ybSBvciB0eXBlIG9mIG1hcHBlZCBuYW1lLCBub3IgdGhlIGFiaWxpdHkKKwkgKiAgICAgICAgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCisJICogICAgICAgICAgICAgcHJvZHVjdC1kZXBlbmRlbnQgYW5kIG9mdGVuIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQuICBObworCSAqICAgICAgICAgICAgIHVzZSBvZiBhIG1hcHBlZCBuYW1lIGlzIHBvcnRhYmxlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRNYXBwZWROYW1lKFN0cmluZykKQEAgLTIwNSw3ICsyMDcsMzYgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc291cmNlRW52UmVmX0luamVjdGlvblRhcmdldHMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEluamVjdGlvblRhcmdldHMoKTsKKwlMaXN0PEluamVjdGlvblRhcmdldD4gZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9va3VwIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoZSBKTkRJIG5hbWUgdG8gYmUgbG9va2VkIHVwIHRvIHJlc29sdmUgYSByZXNvdXJjZSByZWZlcmVuY2UuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9va3VwIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldExvb2t1cE5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VFbnZSZWZfTG9va3VwTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRMb29rdXBOYW1lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0TG9va3VwTmFtZSA8ZW0+TG9va3VwIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvb2t1cCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRMb29rdXBOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRMb29rdXBOYW1lKFN0cmluZyB2YWx1ZSk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1Jlc291cmNlUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzb3VyY2VSZWYuamF2YQppbmRleCA4M2VmMjE3Li44N2UyOTliIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzb3VyY2VSZWYuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzb3VyY2VSZWYuamF2YQpAQCAtMTksMzcgKzE5LDM3IEBACiAgKgogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIHJlc291cmNlLXJlZlR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhCi0gKiAJICBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQKLSAqIAkgIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgcmVzb3VyY2UgbWFuYWdlcgotICogCSAgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZSBuYW1lLCBhbiBvcHRpb25hbCBpbmRpY2F0aW9uIG9mCi0gKiAJICB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZSBleHBlY3RlZCBieSB0aGUKLSAqIAkgIERlcGxveW1lbnQgQ29tcG9uZW50IGNvZGUsIGFuIG9wdGlvbmFsIHR5cGUgb2YgYXV0aGVudGljYXRpb24KLSAqIAkgIChBcHBsaWNhdGlvbiBvciBDb250YWluZXIpLCBhbmQgYW4gb3B0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZgotICogCSAgdGhlIHNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZQotICogCSAgKFNoYXJlYWJsZSBvciBVbnNoYXJlYWJsZSkuCi0gKiAKLSAqIAkgIEl0IGFsc28gaW5jbHVkZXMgb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZgotICogCSAgdGhlIG5hbWVkIHJlc291cmNlIGludG8gZmllbGRzIG9yIEphdmFCZWFucyBwcm9wZXJ0aWVzLgotICogCi0gKiAJICBUaGUgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KLSAqIAkgIGluamVjdGlvbiB0YXJnZXQgaXMgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHRoZSB0eXBlCi0gKiAJICBvZiB0aGUgdGFyZ2V0IGlzIHVzZWQuICBJZiBib3RoIGFyZSBzcGVjaWZpZWQsIHRoZSB0eXBlCi0gKiAJICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KLSAqIAkgIHRhcmdldC4KLSAqIAotICogCSAgRXhhbXBsZToKLSAqIAotICogCSAgJmx0O3Jlc291cmNlLXJlZiZndDsKLSAqIAkgICAgICAmbHQ7cmVzLXJlZi1uYW1lJmd0O2pkYmMvRW1wbG95ZWVBcHBEQiZsdDsvcmVzLXJlZi1uYW1lJmd0OwotICogCSAgICAgICZsdDtyZXMtdHlwZSZndDtqYXZheC5zcWwuRGF0YVNvdXJjZSZsdDsvcmVzLXR5cGUmZ3Q7Ci0gKiAJICAgICAgJmx0O3Jlcy1hdXRoJmd0O0NvbnRhaW5lciZsdDsvcmVzLWF1dGgmZ3Q7Ci0gKiAJICAgICAgJmx0O3Jlcy1zaGFyaW5nLXNjb3BlJmd0O1NoYXJlYWJsZSZsdDsvcmVzLXNoYXJpbmctc2NvcGUmZ3Q7Ci0gKiAJICAmbHQ7L3Jlc291cmNlLXJlZiZndDsKLSAqIAotICogCSAgCisgKiA8IVtDREFUQVtbCisgKiAgICAgICAgIFRoZSByZXNvdXJjZS1yZWZUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24gb2YgYQorICogICAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCdzIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCByZXNvdXJjZS4gSXQKKyAqICAgICAgICAgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSByZXNvdXJjZSBtYW5hZ2VyCisgKiAgICAgICAgIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2UgbmFtZSwgYW4gb3B0aW9uYWwgaW5kaWNhdGlvbiBvZgorICogICAgICAgICB0aGUgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgdHlwZSBleHBlY3RlZCBieSB0aGUKKyAqICAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQgY29kZSwgYW4gb3B0aW9uYWwgdHlwZSBvZiBhdXRoZW50aWNhdGlvbgorICogICAgICAgICAoQXBwbGljYXRpb24gb3IgQ29udGFpbmVyKSwgYW5kIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YKKyAqICAgICAgICAgdGhlIHNoYXJlYWJpbGl0eSBvZiBjb25uZWN0aW9ucyBvYnRhaW5lZCBmcm9tIHRoZSByZXNvdXJjZQorICogICAgICAgICAoU2hhcmVhYmxlIG9yIFVuc2hhcmVhYmxlKS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEl0IGFsc28gaW5jbHVkZXMgb3B0aW9uYWwgZWxlbWVudHMgdG8gZGVmaW5lIGluamVjdGlvbiBvZgorICogICAgICAgICB0aGUgbmFtZWQgcmVzb3VyY2UgaW50byBmaWVsZHMgb3IgSmF2YUJlYW5zIHByb3BlcnRpZXMuCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgY29ubmVjdGlvbiBmYWN0b3J5IHR5cGUgbXVzdCBiZSBzdXBwbGllZCB1bmxlc3MgYW4KKyAqICAgICAgICAgaW5qZWN0aW9uIHRhcmdldCBpcyBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgdGhlIHR5cGUKKyAqICAgICAgICAgb2YgdGhlIHRhcmdldCBpcyB1c2VkLiAgSWYgYm90aCBhcmUgc3BlY2lmaWVkLCB0aGUgdHlwZQorICogICAgICAgICBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoIHRoZSB0eXBlIG9mIHRoZSBpbmplY3Rpb24KKyAqICAgICAgICAgdGFyZ2V0LgorICogICAgICAgICAKKyAqICAgICAgICAgRXhhbXBsZToKKyAqICAgICAgICAgCisgKiAgICAgICAgIDxyZXNvdXJjZS1yZWY+CisgKiAgICAgICAgIDxyZXMtcmVmLW5hbWU+amRiYy9FbXBsb3llZUFwcERCPC9yZXMtcmVmLW5hbWU+CisgKiAgICAgICAgIDxyZXMtdHlwZT5qYXZheC5zcWwuRGF0YVNvdXJjZTwvcmVzLXR5cGU+CisgKiAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgorICogICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KKyAqICAgICAgICAgPC9yZXNvdXJjZS1yZWY+CisgKiAgICAgICAgIAorICogXV0+CisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTYzLDYgKzYzLDcgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0UmVzU2hhcmluZ1Njb3BlIDxlbT5SZXMgU2hhcmluZyBTY29wZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRMb29rdXBOYW1lIDxlbT5Mb29rdXAgTmFtZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICogPC9wPgpAQCAtODUsNyArODYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcyBSZWYgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtOTQsMTMgKzk1LDE0IEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgcmVzLXJlZi1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEKLQkgKiAJICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4KLQkgKiAJICAgIFRoZSBuYW1lIGlzIGEgSk5ESSBuYW1lIHJlbGF0aXZlIHRvIHRoZQotCSAqIAkgICAgamF2YTpjb21wL2VudiBjb250ZXh0LgotCSAqIAkgICAgVGhlIG5hbWUgbXVzdCBiZSB1bmlxdWUgd2l0aGluIGEgRGVwbG95bWVudCBGaWxlLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSByZXMtcmVmLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQorCSAqICAgICAgICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IHJlZmVyZW5jZS4KKwkgKiAgICAgICAgICAgICBUaGUgbmFtZSBpcyBhIEpOREkgbmFtZSByZWxhdGl2ZSB0byB0aGUKKwkgKiAgICAgICAgICAgICBqYXZhOmNvbXAvZW52IGNvbnRleHQuICAKKwkgKiAgICAgICAgICAgICBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBEZXBsb3ltZW50IEZpbGUuIAorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcyBSZWYgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0UmVzUmVmTmFtZShTdHJpbmcpCkBAIC0xMjYsMTIgKzEyOCwxMyBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIHJlcy10eXBlIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhCi0JICogCSAgICBzb3VyY2UuIFRoZSB0eXBlIGlzIHNwZWNpZmllZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkCi0JICogCSAgICBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZQotCSAqIAkgICAgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRhdGEgc291cmNlLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSByZXMtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YQorCSAqICAgICAgICAgICAgIHNvdXJjZS4gVGhlIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBmdWxseSBxdWFsaWZpZWQKKwkgKiAgICAgICAgICAgICBKYXZhIGxhbmd1YWdlIGNsYXNzIG9yIGludGVyZmFjZQorCSAqICAgICAgICAgICAgIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXMgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0UmVzVHlwZShTdHJpbmcpCkBAIC0xNTIsNyArMTU1LDYgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcyBBdXRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkFwcGxpY2F0aW9uIjwvY29kZT4uCiAJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlfS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtMjA4LDcgKzIxMCw2IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXMgU2hhcmluZyBTY29wZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJTaGFyZWFibGUiPC9jb2RlPi4KIAkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzU2hhcmluZ1Njb3BlVHlwZX0uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KQEAgLTI2OCwyNiArMjY5LDI1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCi0JICogCSAgICAKIAkgKiAKLQkgKiAJICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIHJlc291cmNlIHNob3VsZCBiZQotCSAqIAkgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQotCSAqIAkgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCi0JICogCSAgICAgIGxvY2FsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgdXNpbmcgdGhlIHJlc291cmNlLgotCSAqIAkgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQotCSAqIAkgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCi0JICogCSAgICAgIG5hbWVzIHRvIG5hbWVzIG9mIHJlc291cmNlcyBrbm93biB0byB0aGUgYXBwbGljYXRpb24KLQkgKiAJICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCi0JICogCSAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgotCSAqIAotCSAqIAkgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLQkgKiAJICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAqIAkgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0JICogCSAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLQkgKiAJICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKKwkgKiAgICAgICAgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQorCSAqICAgICAgICAgICAgIHJlc291cmNlJ3MgbmFtZSBlbGVtZW50IG9yIGRlZmF1bHRlZCwgaXMgYSBuYW1lIHRoYXQgaXMKKwkgKiAgICAgICAgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KKwkgKiAgICAgICAgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQorCSAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0byBtYXAgdGhlc2UgbG9jYWwKKwkgKiAgICAgICAgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCisJICogICAgICAgICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCisJICogICAgICAgICAgICAgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55CisJICogICAgICAgICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQorCSAqICAgICAgICAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKKwkgKiAgICAgICAgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCisJICogICAgICAgICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldE1hcHBlZE5hbWUoU3RyaW5nKQpAQCAtMzE5LDcgKzMxOSwzNiBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0UmVzb3VyY2VSZWZfSW5qZWN0aW9uVGFyZ2V0cygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOworCUxpc3Q8SW5qZWN0aW9uVGFyZ2V0PiBnZXRJbmplY3Rpb25UYXJnZXRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb29rdXAgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIEpOREkgbmFtZSB0byBiZSBsb29rZWQgdXAgdG8gcmVzb2x2ZSBhIHJlc291cmNlIHJlZmVyZW5jZS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb29rdXAgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TG9va3VwTmFtZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRSZXNvdXJjZVJlZl9Mb29rdXBOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldExvb2t1cE5hbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRMb29rdXBOYW1lIDxlbT5Mb29rdXAgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9va3VwIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldExvb2t1cE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldExvb2t1cE5hbWUoU3RyaW5nIHZhbHVlKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzcGVjdEJpbmRpbmdUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUmVzcGVjdEJpbmRpbmdUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkYzQyZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9SZXNwZWN0QmluZGluZ1R5cGUuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzcGVjdCBCaW5kaW5nIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBDb3JyZXNwb25kcyB0byB0aGUgamF2YXgueG1sLndzLlJlc3BlY3RCaW5kaW5nIGFubm90YXRpb24KKyAqICAgICAgICAgb3IgaXRzIGNvcnJlc3BvbmRpbmcgamF2YXgueG1sLndzLlJlc3BlY3RCaW5kaW5nRmVhdHVyZSB3ZWIKKyAqICAgICAgICAgc2VydmljZSBmZWF0dXJlLiBUaGlzIGlzIHVzZWQgdG8gY29udHJvbCB3aGV0aGVyIGEgSkFYLVdTCisgKiAgICAgICAgIGltcGxlbWVudGF0aW9uIG11c3QgcmVzcGVjdC9ob25vciB0aGUgY29udGVudHMgb2YgdGhlCisgKiAgICAgICAgIHdzZGw6YmluZGluZyBpbiB0aGUgV1NETCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIElmIHRoZSAiZW5hYmxlZCIgZWxlbWVudCBpcyAidHJ1ZSIsIHdzZGw6YmluZGluZyBpbiB0aGUKKyAqICAgICAgICAgYXNzb2NpYXRlZCBXU0RMLCBpZiBhbnksIG11c3QgYmUgcmVzcGVjdGVkL2hvbm9yZWQuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgU2VydmljZXMgQ2xpZW50IDEuMworICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc3BlY3RCaW5kaW5nVHlwZSNpc0VuYWJsZWQgPGVtPkVuYWJsZWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc3BlY3RCaW5kaW5nVHlwZSgpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNwZWN0QmluZGluZ1R5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVuYWJsZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRFbmFibGVkKCkKKwkgKiBAc2VlICN1bnNldEVuYWJsZWQoKQorCSAqIEBzZWUgI3NldEVuYWJsZWQoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJlc3BlY3RCaW5kaW5nVHlwZV9FbmFibGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0VuYWJsZWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNwZWN0QmluZGluZ1R5cGUjaXNFbmFibGVkIDxlbT5FbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbmFibGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldEVuYWJsZWQoKQorCSAqIEBzZWUgI3Vuc2V0RW5hYmxlZCgpCisJICogQHNlZSAjaXNFbmFibGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzcGVjdEJpbmRpbmdUeXBlI2lzRW5hYmxlZCA8ZW0+RW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTZXRFbmFibGVkKCkKKwkgKiBAc2VlICNpc0VuYWJsZWQoKQorCSAqIEBzZWUgI3NldEVuYWJsZWQoYm9vbGVhbikKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCB1bnNldEVuYWJsZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc3BlY3RCaW5kaW5nVHlwZSNpc0VuYWJsZWQgPGVtPkVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVuYWJsZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldEVuYWJsZWQoKQorCSAqIEBzZWUgI2lzRW5hYmxlZCgpCisJICogQHNlZSAjc2V0RW5hYmxlZChib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0RW5hYmxlZCgpOworCit9IC8vIFJlc3BlY3RCaW5kaW5nVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1J1bkFzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUnVuQXMuamF2YQppbmRleCA5MmYyMzFlLi41NjdkNjQ4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUnVuQXMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvUnVuQXMuamF2YQpAQCAtMjAsMTAgKzIwLDExIEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIHJ1bi1hc1R5cGUgc3BlY2lmaWVzIHRoZSBydW4tYXMgaWRlbnRpdHkgdG8gYmUKLSAqIAl1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIGEgY29tcG9uZW50LiBJdCBjb250YWlucyBhbgotICogCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQgdGhlIG5hbWUgb2YgYSBzZWN1cml0eSByb2xlLgotICogCisgKiAgICAgICAgIFRoZSBydW4tYXNUeXBlIHNwZWNpZmllcyB0aGUgcnVuLWFzIGlkZW50aXR5IHRvIGJlCisgKiAgICAgICAgIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgYSBjb21wb25lbnQuIEl0IGNvbnRhaW5zIGFuIAorICogICAgICAgICBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kIHRoZSBuYW1lIG9mIGEgc2VjdXJpdHkgcm9sZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTU0LDcgKzU1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFJ1bkFzX0Rlc2NyaXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7CisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZWN1cml0eVJvbGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZWN1cml0eVJvbGUuamF2YQppbmRleCAyZjFhYzIwLi45MGMzMTQ4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VjdXJpdHlSb2xlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlY3VyaXR5Um9sZS5qYXZhCkBAIC0xOSwyMyArMTksMjMgQEAKICAqCiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAotICogCQotICogCi0gKiAJICBUaGUgc2VjdXJpdHktcm9sZVR5cGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBzZWN1cml0eQotICogCSAgcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YKLSAqIAkgIHRoZSBzZWN1cml0eSByb2xlLCBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgbmFtZS4KLSAqIAotICogCSAgRXhhbXBsZToKLSAqIAotICogCSAgICAgICZsdDtzZWN1cml0eS1yb2xlJmd0OwotICogCSAgICAgICZsdDtkZXNjcmlwdGlvbiZndDsKLSAqIAkJICBUaGlzIHJvbGUgaW5jbHVkZXMgYWxsIGVtcGxveWVlcyB3aG8gYXJlIGF1dGhvcml6ZWQKLSAqIAkJICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCi0gKiAJICAgICAgJmx0Oy9kZXNjcmlwdGlvbiZndDsKLSAqIAkgICAgICAmbHQ7cm9sZS1uYW1lJmd0O2VtcGxveWVlJmx0Oy9yb2xlLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0Oy9zZWN1cml0eS1yb2xlJmd0OwotICogCi0gKiAJICAKKyAqIDwhW0NEQVRBW1sKKyAqICAgICAgICAgVGhlIHNlY3VyaXR5LXJvbGVUeXBlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIGEgc2VjdXJpdHkKKyAqICAgICAgICAgcm9sZS4gVGhlIGRlZmluaXRpb24gY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YKKyAqICAgICAgICAgdGhlIHNlY3VyaXR5IHJvbGUsIGFuZCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lLgorICogICAgICAgICAKKyAqICAgICAgICAgRXhhbXBsZToKKyAqICAgICAgICAgCisgKiAgICAgICAgIDxzZWN1cml0eS1yb2xlPgorICogICAgICAgICA8ZGVzY3JpcHRpb24+CisgKiAgICAgICAgIFRoaXMgcm9sZSBpbmNsdWRlcyBhbGwgZW1wbG95ZWVzIHdobyBhcmUgYXV0aG9yaXplZAorICogICAgICAgICB0byBhY2Nlc3MgdGhlIGVtcGxveWVlIHNlcnZpY2UgYXBwbGljYXRpb24uCisgKiAgICAgICAgIDwvZGVzY3JpcHRpb24+CisgKiAgICAgICAgIDxyb2xlLW5hbWU+ZW1wbG95ZWU8L3JvbGUtbmFtZT4KKyAqICAgICAgICAgPC9zZWN1cml0eS1yb2xlPgorICogICAgICAgICAKKyAqIF1dPgorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1CiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC02Niw3ICs2Niw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlY3VyaXR5Um9sZVJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlY3VyaXR5Um9sZVJlZi5qYXZhCmluZGV4IDM2YjFkN2UuLjU1MmM0NmQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZWN1cml0eVJvbGVSZWYuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VjdXJpdHlSb2xlUmVmLmphdmEKQEAgLTIwLDE0ICsyMCwxNSBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSBzZWN1cml0eS1yb2xlLXJlZlR5cGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIGEKLSAqIAlzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBpbiBhIGNvbXBvbmVudCdzIG9yIGEKLSAqIAlEZXBsb3ltZW50IENvbXBvbmVudCdzIGNvZGUuIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZiBhbgotICogCW9wdGlvbmFsIGRlc2NyaXB0aW9uLCB0aGUgc2VjdXJpdHkgcm9sZSBuYW1lIHVzZWQgaW4gdGhlCi0gKiAJY29kZSwgYW5kIGFuIG9wdGlvbmFsIGxpbmsgdG8gYSBzZWN1cml0eSByb2xlLiBJZiB0aGUKLSAqIAlzZWN1cml0eSByb2xlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBEZXBsb3llciBtdXN0IGNob29zZSBhbgotICogCWFwcHJvcHJpYXRlIHNlY3VyaXR5IHJvbGUuCi0gKiAKKyAqICAgICAgICAgVGhlIHNlY3VyaXR5LXJvbGUtcmVmVHlwZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYQorICogICAgICAgICBzZWN1cml0eSByb2xlIHJlZmVyZW5jZSBpbiBhIGNvbXBvbmVudCdzIG9yIGEKKyAqICAgICAgICAgRGVwbG95bWVudCBDb21wb25lbnQncyBjb2RlLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2YgYW4KKyAqICAgICAgICAgb3B0aW9uYWwgZGVzY3JpcHRpb24sIHRoZSBzZWN1cml0eSByb2xlIG5hbWUgdXNlZCBpbiB0aGUKKyAqICAgICAgICAgY29kZSwgYW5kIGFuIG9wdGlvbmFsIGxpbmsgdG8gYSBzZWN1cml0eSByb2xlLiBJZiB0aGUKKyAqICAgICAgICAgc2VjdXJpdHkgcm9sZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgRGVwbG95ZXIgbXVzdCBjaG9vc2UgYW4KKyAqICAgICAgICAgYXBwcm9wcmlhdGUgc2VjdXJpdHkgcm9sZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTU5LDcgKzYwLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC02OCwxMiArNjksMTMgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgU3RyaW5nIHVzZWQKLQkgKiAJICAgIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlCi0JICogCSAgICBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kIG9yIHRoZQotCSAqIAkgICAgSHR0cFNlcnZsZXRSZXF1ZXN0LmlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgbWV0aG9kLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgcm9sZS1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgU3RyaW5nIHVzZWQKKwkgKiAgICAgICAgICAgICBhcyB0aGUgcGFyYW1ldGVyIHRvIHRoZSAKKwkgKiAgICAgICAgICAgICBFSkJDb250ZXh0LmlzQ2FsbGVySW5Sb2xlKFN0cmluZyByb2xlTmFtZSkgbWV0aG9kIG9yIHRoZQorCSAqICAgICAgICAgICAgIEh0dHBTZXJ2bGV0UmVxdWVzdC5pc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIG1ldGhvZC4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFJvbGVOYW1lKFN0cmluZykKQEAgLTk5LDEyICsxMDEsMTMgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSByb2xlLWxpbmsgZWxlbWVudCBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQKLQkgKiAJICAgIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4KLQkgKiAJICAgIHRoZSBuYW1lIG9mIG9uZSBvZiB0aGUgc2VjdXJpdHkgcm9sZXMgZGVmaW5lZCBpbiB0aGUKLQkgKiAJICAgIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIHJvbGUtbGluayBlbGVtZW50IGlzIGEgcmVmZXJlbmNlIHRvIGEgZGVmaW5lZAorCSAqICAgICAgICAgICAgIHNlY3VyaXR5IHJvbGUuIFRoZSByb2xlLWxpbmsgZWxlbWVudCBtdXN0IGNvbnRhaW4KKwkgKiAgICAgICAgICAgICB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5IHJvbGVzIGRlZmluZWQgaW4gdGhlCisJICogICAgICAgICAgICAgc2VjdXJpdHktcm9sZSBlbGVtZW50cy4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlIExpbms8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFJvbGVMaW5rKFN0cmluZykKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZXJ2aWNlUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VydmljZVJlZi5qYXZhCmluZGV4IDYyZTA0ZTYuLmE5MjA2MmMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZXJ2aWNlUmVmLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWYuamF2YQpAQCAtMTEsNiArMTEsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmU7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yMCwxNCArMjEsMTUgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgc2VydmljZS1yZWYgZWxlbWVudCBkZWNsYXJlcyBhIHJlZmVyZW5jZSB0byBhIFdlYgotICogCXNlcnZpY2UuIEl0IGNvbnRhaW5zIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBkaXNwbGF5IG5hbWUgYW5kCi0gKiAJaWNvbnMsIGEgZGVjbGFyYXRpb24gb2YgdGhlIHJlcXVpcmVkIFNlcnZpY2UgaW50ZXJmYWNlLAotICogCWFuIG9wdGlvbmFsIFdTREwgZG9jdW1lbnQgbG9jYXRpb24sIGFuIG9wdGlvbmFsIHNldAotICogCW9mIEpBWC1SUEMgbWFwcGluZ3MsIGFuIG9wdGlvbmFsIFFOYW1lIGZvciB0aGUgc2VydmljZSBlbGVtZW50LAotICogCWFuIG9wdGlvbmFsIHNldCBvZiBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZXMgdG8gYmUgcmVzb2x2ZWQKLSAqIAlieSB0aGUgY29udGFpbmVyIHRvIGEgV1NETCBwb3J0LCBhbmQgYW4gb3B0aW9uYWwgc2V0IG9mIGhhbmRsZXJzLgotICogCisgKiAgICAgICAgIFRoZSBzZXJ2aWNlLXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgcmVmZXJlbmNlIHRvIGEgV2ViCisgKiAgICAgICAgIHNlcnZpY2UuIEl0IGNvbnRhaW5zIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBkaXNwbGF5IG5hbWUgYW5kCisgKiAgICAgICAgIGljb25zLCBhIGRlY2xhcmF0aW9uIG9mIHRoZSByZXF1aXJlZCBTZXJ2aWNlIGludGVyZmFjZSwKKyAqICAgICAgICAgYW4gb3B0aW9uYWwgV1NETCBkb2N1bWVudCBsb2NhdGlvbiwgYW4gb3B0aW9uYWwgc2V0CisgKiAgICAgICAgIG9mIEpBWC1SUEMgbWFwcGluZ3MsIGFuIG9wdGlvbmFsIFFOYW1lIGZvciB0aGUgc2VydmljZSBlbGVtZW50LAorICogICAgICAgICBhbiBvcHRpb25hbCBzZXQgb2YgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2VzIHRvIGJlIHJlc29sdmVkIAorICogICAgICAgICBieSB0aGUgY29udGFpbmVyIHRvIGEgV1NETCBwb3J0LCBhbmQgYW4gb3B0aW9uYWwgc2V0IG9mIGhhbmRsZXJzLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIFNlcnZpY2VzIENsaWVudCAxLjIKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTQ4LDYgKzUwLDcgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRIYW5kbGVyQ2hhaW5zIDxlbT5IYW5kbGVyIENoYWluczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRMb29rdXBOYW1lIDxlbT5Mb29rdXAgTmFtZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CkBAIC03MCw3ICs3Myw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmX0Rlc2NyaXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7CisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTg1LDcgKzg4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZfRGlzcGxheU5hbWVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKKwlMaXN0PERpc3BsYXlOYW1lPiBnZXREaXNwbGF5TmFtZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEwMCw3ICsxMDMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZl9JY29ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKKwlMaXN0PEljb24+IGdldEljb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMDksMTIgKzExMiwxMyBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIHNlcnZpY2UtcmVmLW5hbWUgZWxlbWVudCBkZWNsYXJlcyBsb2dpY2FsIG5hbWUgdGhhdCB0aGUKLQkgKiAJICAgIGNvbXBvbmVudHMgaW4gdGhlIG1vZHVsZSB1c2UgdG8gbG9vayB1cCB0aGUgV2ViIHNlcnZpY2UuIEl0Ci0JICogCSAgICBpcyByZWNvbW1lbmRlZCB0aGF0IGFsbCBzZXJ2aWNlIHJlZmVyZW5jZSBuYW1lcyBzdGFydCB3aXRoCi0JICogCSAgICAic2VydmljZS8iLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSBzZXJ2aWNlLXJlZi1uYW1lIGVsZW1lbnQgZGVjbGFyZXMgbG9naWNhbCBuYW1lIHRoYXQgdGhlCisJICogICAgICAgICAgICAgY29tcG9uZW50cyBpbiB0aGUgbW9kdWxlIHVzZSB0byBsb29rIHVwIHRoZSBXZWIgc2VydmljZS4gSXQgCisJICogICAgICAgICAgICAgaXMgcmVjb21tZW5kZWQgdGhhdCBhbGwgc2VydmljZSByZWZlcmVuY2UgbmFtZXMgc3RhcnQgd2l0aCAKKwkgKiAgICAgICAgICAgICAic2VydmljZS8iLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiBTZXJ2aWNlcyBDbGllbnQgMS4yCisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRTZXJ2aWNlUmVmTmFtZShTdHJpbmcpCkBAIC0xNDAsMTIgKzE0NCwxMyBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIHNlcnZpY2UtaW50ZXJmYWNlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotCSAqIAkgICAgbmFtZSBvZiB0aGUgSkFYLVJQQyBTZXJ2aWNlIGludGVyZmFjZSB0aGUgY2xpZW50IGRlcGVuZHMgb24uCi0JICogCSAgICBJbiBtb3N0IGNhc2VzIHRoZSB2YWx1ZSB3aWxsIGJlIGphdmF4LnhtbC5ycGMuU2VydmljZS4gIEEgSkFYLVJQQwotCSAqIAkgICAgZ2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIGNsYXNzIG1heSBhbHNvIGJlIHNwZWNpZmllZC4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgc2VydmljZS1pbnRlcmZhY2UgZWxlbWVudCBkZWNsYXJlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCisJICogICAgICAgICAgICAgbmFtZSBvZiB0aGUgSkFYLVJQQyBTZXJ2aWNlIGludGVyZmFjZSB0aGUgY2xpZW50IGRlcGVuZHMgb24uIAorCSAqICAgICAgICAgICAgIEluIG1vc3QgY2FzZXMgdGhlIHZhbHVlIHdpbGwgYmUgamF2YXgueG1sLnJwYy5TZXJ2aWNlLiAgQSBKQVgtUlBDCisJICogICAgICAgICAgICAgZ2VuZXJhdGVkIFNlcnZpY2UgSW50ZXJmYWNlIGNsYXNzIG1heSBhbHNvIGJlIHNwZWNpZmllZC4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBXZWIgU2VydmljZXMgQ2xpZW50IDEuMgorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VydmljZSBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFNlcnZpY2VJbnRlcmZhY2UoU3RyaW5nKQpAQCAtMTcxLDE4ICsxNzYsMjAgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSBzZXJ2aWNlLXJlZi10eXBlIGVsZW1lbnQgZGVjbGFyZXMgdGhlIHR5cGUgb2YgdGhlIHNlcnZpY2UtcmVmCi0JICogCSAgICBlbGVtZW50IHRoYXQgaXMgaW5qZWN0ZWQgb3IgcmV0dXJuZWQgd2hlbiBhIEpOREkgbG9va3VwIGlzIGRvbmUuCi0JICogCSAgICBUaGlzIG11c3QgYmUgZWl0aGVyIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgU2VydmljZSBjbGFzcyBvcgotCSAqIAkgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIGNsYXNzLgotCSAqIAkgICAgVGhpcyBpcyBvbmx5IHVzZWQgd2l0aCBKQVgtV1MgcnVudGltZSB3aGVyZSB0aGUgY29ycmVzcG9uZGluZwotCSAqIAkgICAgQFdlYlNlcnZpY2VSZWYgYW5ub3RhdGlvbiBjYW4gYmUgdXNlZCB0byBkZW5vdGUgYm90aCBhIFNlcnZpY2UKLQkgKiAJICAgIG9yIGEgUG9ydC4KLQkgKiAKLQkgKiAJICAgIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgdHlwZSBvZiBzZXJ2aWNlLXJlZiBlbGVtZW50Ci0JICogCSAgICB0aGF0IGlzIGluamVjdGVkIG9yIHJldHVybmVkIHdoZW4gYSBKTkRJIGxvb2t1cCBpcyBkb25lIGlzCi0JICogCSAgICBhbHdheXMgYSBTZXJ2aWNlIGludGVyZmFjZS9jbGFzcy4KLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgc2VydmljZS1yZWYtdHlwZSBlbGVtZW50IGRlY2xhcmVzIHRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlLXJlZiAKKwkgKiAgICAgICAgICAgICBlbGVtZW50IHRoYXQgaXMgaW5qZWN0ZWQgb3IgcmV0dXJuZWQgd2hlbiBhIEpOREkgbG9va3VwIGlzIGRvbmUuCisJICogICAgICAgICAgICAgVGhpcyBtdXN0IGJlIGVpdGhlciBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIFNlcnZpY2UgY2xhc3Mgb3IgCisJICogICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlIGNsYXNzLiAKKwkgKiAgICAgICAgICAgICBUaGlzIGlzIG9ubHkgdXNlZCB3aXRoIEpBWC1XUyBydW50aW1lIHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIAorCSAqICAgICAgICAgICAgIEBXZWJTZXJ2aWNlUmVmIGFubm90YXRpb24gY2FuIGJlIHVzZWQgdG8gZGVub3RlIGJvdGggYSBTZXJ2aWNlCisJICogICAgICAgICAgICAgb3IgYSBQb3J0LgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgdHlwZSBvZiBzZXJ2aWNlLXJlZiBlbGVtZW50IAorCSAqICAgICAgICAgICAgIHRoYXQgaXMgaW5qZWN0ZWQgb3IgcmV0dXJuZWQgd2hlbiBhIEpOREkgbG9va3VwIGlzIGRvbmUgaXMgCisJICogICAgICAgICAgICAgYWx3YXlzIGEgU2VydmljZSBpbnRlcmZhY2UvY2xhc3MuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIFNlcnZpY2VzIENsaWVudCAxLjIKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmIFR5cGU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFNlcnZpY2VSZWZUeXBlKFN0cmluZykKQEAgLTIwOCwxMCArMjE1LDExIEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgd3NkbC1maWxlIGVsZW1lbnQgY29udGFpbnMgdGhlIFVSSSBsb2NhdGlvbiBvZiBhIFdTREwKLQkgKiAJICAgIGZpbGUuIFRoZSBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgbW9kdWxlLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSB3c2RsLWZpbGUgZWxlbWVudCBjb250YWlucyB0aGUgVVJJIGxvY2F0aW9uIG9mIGEgV1NETAorCSAqICAgICAgICAgICAgIGZpbGUuIFRoZSBsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgbW9kdWxlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiBTZXJ2aWNlcyBDbGllbnQgMS4yCisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xc2RsIEZpbGU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFdzZGxGaWxlKFN0cmluZykKQEAgLTIzNywxNCArMjQ1LDE1IEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0Ci0JICogCSAgICBkZXNjcmliZXMgdGhlIEpBWC1SUEMgbWFwcGluZyBiZXR3ZWVuIHRoZSBKYXZhIGludGVyYWNlcyB1c2VkIGJ5Ci0JICogCSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBXU0RMIGRlc2NyaXB0aW9uIGluIHRoZSB3c2RsLWZpbGUuICBUaGUKLQkgKiAJICAgIGZpbGUgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggd2l0aGluIHRoZSBtb2R1bGUgZmlsZS4KLQkgKiAKLQkgKiAJICAgIFRoaXMgaXMgbm90IHJlcXVpcmVkIHdoZW4gSkFYLVdTIGJhc2VkIHJ1bnRpbWUgaXMgdXNlZC4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgamF4cnBjLW1hcHBpbmctZmlsZSBlbGVtZW50IGNvbnRhaW5zIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0CisJICogICAgICAgICAgICAgZGVzY3JpYmVzIHRoZSBKQVgtUlBDIG1hcHBpbmcgYmV0d2VlbiB0aGUgSmF2YSBpbnRlcmFjZXMgdXNlZCBieQorCSAqICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIFdTREwgZGVzY3JpcHRpb24gaW4gdGhlIHdzZGwtZmlsZS4gIFRoZSAKKwkgKiAgICAgICAgICAgICBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHdpdGhpbiB0aGUgbW9kdWxlIGZpbGUuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgVGhpcyBpcyBub3QgcmVxdWlyZWQgd2hlbiBKQVgtV1MgYmFzZWQgcnVudGltZSBpcyB1c2VkLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiBTZXJ2aWNlcyBDbGllbnQgMS4yCisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5KYXhycGMgTWFwcGluZyBGaWxlPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRKYXhycGNNYXBwaW5nRmlsZShTdHJpbmcpCkBAIC0yNzAsMTggKzI3OSwxOSBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIHNlcnZpY2UtcW5hbWUgZWxlbWVudCBkZWNsYXJlcyB0aGUgc3BlY2lmaWMgV1NETCBzZXJ2aWNlCi0JICogCSAgICBlbGVtZW50IHRoYXQgaXMgYmVpbmcgcmVmZXJlZCB0by4gIEl0IGlzIG5vdCBzcGVjaWZpZWQgaWYgbm8KLQkgKiAJICAgIHdzZGwtZmlsZSBpcyBkZWNsYXJlZC4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgc2VydmljZS1xbmFtZSBlbGVtZW50IGRlY2xhcmVzIHRoZSBzcGVjaWZpYyBXU0RMIHNlcnZpY2UKKwkgKiAgICAgICAgICAgICBlbGVtZW50IHRoYXQgaXMgYmVpbmcgcmVmZXJlZCB0by4gIEl0IGlzIG5vdCBzcGVjaWZpZWQgaWYgbm8KKwkgKiAgICAgICAgICAgICB3c2RsLWZpbGUgaXMgZGVjbGFyZWQuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIFNlcnZpY2VzIENsaWVudCAxLjIKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUW5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlcnZpY2VRbmFtZShPYmplY3QpCisJICogQHNlZSAjc2V0U2VydmljZVFuYW1lKFFOYW1lKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlPYmplY3QgZ2V0U2VydmljZVFuYW1lKCk7CisJUU5hbWUgZ2V0U2VydmljZVFuYW1lKCk7CiAKIAkvKioKIAkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRTZXJ2aWNlUW5hbWUgPGVtPlNlcnZpY2UgUW5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTI5MSw3ICszMDEsNyBAQAogCSAqIEBzZWUgI2dldFNlcnZpY2VRbmFtZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXZvaWQgc2V0U2VydmljZVFuYW1lKE9iamVjdCB2YWx1ZSk7CisJdm9pZCBzZXRTZXJ2aWNlUW5hbWUoUU5hbWUgdmFsdWUpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0zMDEsMTkgKzMxMSwyMCBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKLQkgKiAJICAgIG9uIHRoZSBjb250YWluZXIgZm9yIHJlc29sdmluZyBhIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlCi0JICogCSAgICB0byBhIFdTREwgcG9ydC4gSXQgb3B0aW9uYWxseSBhc3NvY2lhdGVzIHRoZSBTZXJ2aWNlIEVuZHBvaW50Ci0JICogCSAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCi0JICogCSAgICBieSB0aGUgY29udGFpbmVyIGZvciBhIFNlcnZpY2UuZ2V0UG9ydChDbGFzcykgbWV0aG9kIGNhbGwuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIHBvcnQtY29tcG9uZW50LXJlZiBlbGVtZW50IGRlY2xhcmVzIGEgY2xpZW50IGRlcGVuZGVuY3kKKwkgKiAgICAgICAgICAgICBvbiB0aGUgY29udGFpbmVyIGZvciByZXNvbHZpbmcgYSBTZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQorCSAqICAgICAgICAgICAgIHRvIGEgV1NETCBwb3J0LiBJdCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgdGhlIFNlcnZpY2UgRW5kcG9pbnQKKwkgKiAgICAgICAgICAgICBJbnRlcmZhY2Ugd2l0aCBhIHBhcnRpY3VsYXIgcG9ydC1jb21wb25lbnQuIFRoaXMgaXMgb25seSB1c2VkCisJICogICAgICAgICAgICAgYnkgdGhlIGNvbnRhaW5lciBmb3IgYSBTZXJ2aWNlLmdldFBvcnQoQ2xhc3MpIG1ldGhvZCBjYWxsLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiBTZXJ2aWNlcyBDbGllbnQgMS4yCisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0UG9ydENvbXBvbmVudFJlZnMoKTsKKwlMaXN0PFBvcnRDb21wb25lbnRSZWY+IGdldFBvcnRDb21wb25lbnRSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYW5kbGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0zMjMsMjEgKzMzNCwyMiBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkJRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbgotCSAqIAkJYWNjZXNzIHRoZSBpbml0LXBhcmFtIG5hbWUvdmFsdWUgcGFpcnMgdXNpbmcgdGhlCi0JICogCQlIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmIHBvcnQtbmFtZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKLQkgKiAJCWhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYWxsIHBvcnRzIG9mIHRoZQotCSAqIAkJc2VydmljZS4KLQkgKiAKLQkgKiAJCVRvIGJlIHVzZWQgd2l0aCBKQVgtUlBDIGJhc2VkIHJ1bnRpbWUgb25seS4KLQkgKiAKLQkgKiAJICAgICAgCisJICogICAgICAgICAgICAgICAJRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbgorCSAqICAgICAgICAgICAgICAgCWFjY2VzcyB0aGUgaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZQorCSAqICAgICAgICAgICAgICAgCUhhbmRsZXJJbmZvIGludGVyZmFjZS4gSWYgcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZQorCSAqICAgICAgICAgICAgICAgCWhhbmRsZXIgaXMgYXNzdW1lZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYWxsIHBvcnRzIG9mIHRoZQorCSAqICAgICAgICAgICAgICAgCXNlcnZpY2UuCisJICogICAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICAgIAlUbyBiZSB1c2VkIHdpdGggSkFYLVJQQyBiYXNlZCBydW50aW1lIG9ubHkuCisJICogICAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICAgIAlAc2luY2UgSmF2YSBFRSA1LCBXZWIgU2VydmljZXMgQ2xpZW50IDEuMgorCSAqICAgICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZfSGFuZGxlcnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEhhbmRsZXJzKCk7CisJTGlzdDxTZXJ2aWNlUmVmSGFuZGxlcj4gZ2V0SGFuZGxlcnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2hhaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC0zNDUsOCArMzU3LDExIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCi0JICogCQkgVG8gYmUgdXNlZCB3aXRoIEpBWC1XUyBiYXNlZCBydW50aW1lIG9ubHkuCi0JICogCSAgICAgIAorCSAqIAorCSAqICAgICAgICAgICAgICAgCSBUbyBiZSB1c2VkIHdpdGggSkFYLVdTIGJhc2VkIHJ1bnRpbWUgb25seS4KKwkgKiAgICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgICAgCSBAc2luY2UgSmF2YSBFRSA1LCBXZWIgU2VydmljZXMgQ2xpZW50IDEuMgorCSAqICAgICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIENoYWluczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCiAJICogQHNlZSAjc2V0SGFuZGxlckNoYWlucyhTZXJ2aWNlUmVmSGFuZGxlckNoYWlucykKQEAgLTM3MSwyNiArMzg2LDI1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCi0JICogCSAgICAKIAkgKiAKLQkgKiAJICAgICAgQSBwcm9kdWN0IHNwZWNpZmljIG5hbWUgdGhhdCB0aGlzIHJlc291cmNlIHNob3VsZCBiZQotCSAqIAkgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQotCSAqIAkgICAgICByZXNvdXJjZSdzIG5hbWUgZWxlbWVudCBvciBkZWZhdWx0ZWQsIGlzIGEgbmFtZSB0aGF0IGlzCi0JICogCSAgICAgIGxvY2FsIHRvIHRoZSBhcHBsaWNhdGlvbiBjb21wb25lbnQgdXNpbmcgdGhlIHJlc291cmNlLgotCSAqIAkgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQotCSAqIAkgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIHByb3ZpZGUgYSB3YXkgdG8gbWFwIHRoZXNlIGxvY2FsCi0JICogCSAgICAgIG5hbWVzIHRvIG5hbWVzIG9mIHJlc291cmNlcyBrbm93biB0byB0aGUgYXBwbGljYXRpb24KLQkgKiAJICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCi0JICogCSAgICAgIGJ1dCBtYXkgYmUgYSBuYW1lIG9mIGFueSBmb3JtLgotCSAqIAotCSAqIAkgICAgICBBcHBsaWNhdGlvbiBzZXJ2ZXJzIGFyZSBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbnkKLQkgKiAJICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQotCSAqIAkgICAgICB0byB1c2UgbWFwcGVkIG5hbWVzLiAgVGhlIG1hcHBlZCBuYW1lIGlzCi0JICogCSAgICAgIHByb2R1Y3QtZGVwZW5kZW50IGFuZCBvZnRlbiBpbnN0YWxsYXRpb24tZGVwZW5kZW50LiAgTm8KLQkgKiAJICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCi0JICogCi0JICogCSAgICAgIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIEEgcHJvZHVjdCBzcGVjaWZpYyBuYW1lIHRoYXQgdGhpcyByZXNvdXJjZSBzaG91bGQgYmUKKwkgKiAgICAgICAgICAgICBtYXBwZWQgdG8uICBUaGUgbmFtZSBvZiB0aGlzIHJlc291cmNlLCBhcyBkZWZpbmVkIGJ5IHRoZQorCSAqICAgICAgICAgICAgIHJlc291cmNlJ3MgbmFtZSBlbGVtZW50IG9yIGRlZmF1bHRlZCwgaXMgYSBuYW1lIHRoYXQgaXMKKwkgKiAgICAgICAgICAgICBsb2NhbCB0byB0aGUgYXBwbGljYXRpb24gY29tcG9uZW50IHVzaW5nIHRoZSByZXNvdXJjZS4KKwkgKiAgICAgICAgICAgICAoSXQncyBhIG5hbWUgaW4gdGhlIEpOREkgamF2YTpjb21wL2VudiBuYW1lc3BhY2UuKSAgTWFueQorCSAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNlcnZlcnMgcHJvdmlkZSBhIHdheSB0byBtYXAgdGhlc2UgbG9jYWwKKwkgKiAgICAgICAgICAgICBuYW1lcyB0byBuYW1lcyBvZiByZXNvdXJjZXMga25vd24gdG8gdGhlIGFwcGxpY2F0aW9uCisJICogICAgICAgICAgICAgc2VydmVyLiAgVGhpcyBtYXBwZWQgbmFtZSBpcyBvZnRlbiBhIGdsb2JhbCBKTkRJIG5hbWUsCisJICogICAgICAgICAgICAgYnV0IG1heSBiZSBhIG5hbWUgb2YgYW55IGZvcm0uCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQXBwbGljYXRpb24gc2VydmVycyBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYW55CisJICogICAgICAgICAgICAgcGFydGljdWxhciBmb3JtIG9yIHR5cGUgb2YgbWFwcGVkIG5hbWUsIG5vciB0aGUgYWJpbGl0eQorCSAqICAgICAgICAgICAgIHRvIHVzZSBtYXBwZWQgbmFtZXMuICBUaGUgbWFwcGVkIG5hbWUgaXMKKwkgKiAgICAgICAgICAgICBwcm9kdWN0LWRlcGVuZGVudCBhbmQgb2Z0ZW4gaW5zdGFsbGF0aW9uLWRlcGVuZGVudC4gIE5vCisJICogICAgICAgICAgICAgdXNlIG9mIGEgbWFwcGVkIG5hbWUgaXMgcG9ydGFibGUuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcGVkIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldE1hcHBlZE5hbWUoU3RyaW5nKQpAQCAtNDIyLDcgKzQzNiwzNiBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZl9JbmplY3Rpb25UYXJnZXRzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCk7CisJTGlzdDxJbmplY3Rpb25UYXJnZXQ+IGdldEluamVjdGlvblRhcmdldHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvb2t1cCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgSk5ESSBuYW1lIHRvIGJlIGxvb2tlZCB1cCB0byByZXNvbHZlIGEgcmVzb3VyY2UgcmVmZXJlbmNlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvb2t1cCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRMb29rdXBOYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZfTG9va3VwTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRMb29rdXBOYW1lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRMb29rdXBOYW1lIDxlbT5Mb29rdXAgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9va3VwIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldExvb2t1cE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldExvb2t1cE5hbWUoU3RyaW5nIHZhbHVlKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC00NDksNCArNDkyLDkgQEAKIAkgKi8KIAl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7CiAKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBmb3IgQVBJIGNvbXBsaWFuY2Ugd2l0aCB0aGUgb2xkZXIgSmF2YSBFRSA1IG1vZGVscworCSAqIEBwYXJhbSBuZXdTZXJ2aWNlUW5hbWUKKwkgKi8KKwl2b2lkIHNldFNlcnZpY2VRbmFtZShPYmplY3QgbmV3U2VydmljZVFuYW1lKTsKIH0gLy8gU2VydmljZVJlZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZXJ2aWNlUmVmSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWZIYW5kbGVyLmphdmEKaW5kZXggZTE3YzljZS4uYTc0NGYzMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWZIYW5kbGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWZIYW5kbGVyLmphdmEKQEAgLTExLDYgKzExLDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjAsMTMgKzIxLDEyIEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJRGVjbGFyZXMgdGhlIGhhbmRsZXIgZm9yIGEgcG9ydC1jb21wb25lbnQuIEhhbmRsZXJzIGNhbiBhY2Nlc3MgdGhlCi0gKiAJaW5pdC1wYXJhbSBuYW1lL3ZhbHVlIHBhaXJzIHVzaW5nIHRoZSBIYW5kbGVySW5mbyBpbnRlcmZhY2UuIElmCi0gKiAJcG9ydC1uYW1lIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBoYW5kbGVyIGlzIGFzc3VtZWQgdG8gYmUgYXNzb2NpYXRlZAotICogCXdpdGggYWxsIHBvcnRzIG9mIHRoZSBzZXJ2aWNlLgotICogCi0gKiAJVXNlZCBpbjogc2VydmljZS1yZWYKLSAqIAorICogICAgICAgICBEZWNsYXJlcyB0aGUgaGFuZGxlciBmb3IgYSBwb3J0LWNvbXBvbmVudCwgc2VydmljZS1yZWYuIEhhbmRsZXJzIGNhbgorICogICAgICAgICBhY2Nlc3MgdGhlIGluaXQtcGFyYW0gbmFtZS92YWx1ZSBwYWlycyB1c2luZyB0aGUgSGFuZGxlckluZm8gaW50ZXJmYWNlLgorICogICAgICAgICAKKyAqICAgICAgICAgVXNlZCBpbjogcG9ydC1jb21wb25lbnQsIHNlcnZpY2UtcmVmCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBXZWIgU2VydmljZXMgQ2xpZW50IDEuMgogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNjQsNyArNjQsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJfRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNzksNyArNzksNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJfRGlzcGxheU5hbWVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKKwlMaXN0PERpc3BsYXlOYW1lPiBnZXREaXNwbGF5TmFtZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTk0LDcgKzk0LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyX0ljb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRJY29ucygpOworCUxpc3Q8SWNvbj4gZ2V0SWNvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhbmRsZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMTAzLDEwICsxMDMsMTEgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGhhbmRsZXIuIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlCi0JICogCSAgICB3aXRoaW4gdGhlIG1vZHVsZS4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVyLiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlCisJICogICAgICAgICAgICAgbW9kdWxlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiBTZXJ2aWNlcyBDbGllbnQgMS4yCisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldEhhbmRsZXJOYW1lKFN0cmluZykKQEAgLTEzMiwxMCArMTMzLDEwIEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBEZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBoYW5kbGVyCi0JICogCSAgICBpbXBsZW1lbnRhdGlvbi4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBEZWZpbmVzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiBTZXJ2aWNlcyBDbGllbnQgMS4yCisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYW5kbGVyIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRIYW5kbGVyQ2xhc3MoU3RyaW5nKQpAQCAtMTYzLDMwICsxNjQsNDEgQEAKIAkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCiAJICogPC9wPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1XUyBydW50aW1lCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIFNlcnZpY2VzIENsaWVudCAxLjIKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJfSW5pdFBhcmFtcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0SW5pdFBhcmFtcygpOworCUxpc3Q8UGFyYW1WYWx1ZT4gZ2V0SW5pdFBhcmFtcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U29hcCBIZWFkZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLk9iamVjdH0uCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWV9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBEZWZpbmVzIHRoZSBRTmFtZSBvZiBhIFNPQVAgaGVhZGVyIHRoYXQgd2lsbCBiZSBwcm9jZXNzZWQKLQkgKiAJICAgIGJ5IHRoZSBoYW5kbGVyLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIERlZmluZXMgdGhlIFFOYW1lIG9mIGEgU09BUCBoZWFkZXIgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUKKwkgKiAgICAgICAgICAgICBoYW5kbGVyLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIE5vdCB0byBiZSBzcGVjaWZpZWQgZm9yIEpBWC1XUyBydW50aW1lCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIFNlcnZpY2VzIENsaWVudCAxLjIKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgSGVhZGVyczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlI2dldFNlcnZpY2VSZWZIYW5kbGVyX1NvYXBIZWFkZXJzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRTb2FwSGVhZGVycygpOworCUxpc3Q8UU5hbWU+IGdldFNvYXBIZWFkZXJzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Tb2FwIFJvbGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KQEAgLTE5NiwxNiArMjA4LDE3IEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdAotCSAqIAkgICAgdGhlIEhhbmRsZXIgd2lsbCBwbGF5IGFzIGEgcm9sZS4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgc29hcC1yb2xlIGVsZW1lbnQgY29udGFpbnMgYSBTT0FQIGFjdG9yIGRlZmluaXRpb24gdGhhdCB0aGUKKwkgKiAgICAgICAgICAgICBIYW5kbGVyIHdpbGwgcGxheSBhcyBhIHJvbGUuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIFNlcnZpY2VzIENsaWVudCAxLjIKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvYXAgUm9sZXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmSGFuZGxlcl9Tb2FwUm9sZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFNvYXBSb2xlcygpOworCUxpc3Q8U3RyaW5nPiBnZXRTb2FwUm9sZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvcnQgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgpAQCAtMjE1LDE2ICsyMjgsMjEgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSBwb3J0LW5hbWUgZWxlbWVudCBkZWZpbmVzIHRoZSBXU0RMIHBvcnQtbmFtZSB0aGF0IGEKLQkgKiAJICAgIGhhbmRsZXIgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgcG9ydC1uYW1lIGVsZW1lbnQgZGVmaW5lcyB0aGUgV1NETCBwb3J0LW5hbWUgdGhhdCBhCisJICogICAgICAgICAgICAgaGFuZGxlciBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoLiBJZiBwb3J0LW5hbWUgaXMgbm90CisJICogICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGUgaGFuZGxlciBpcyBhc3N1bWVkIHRvIGJlIGFzc29jaWF0ZWQgd2l0aAorCSAqICAgICAgICAgICAgIGFsbCBwb3J0cyBvZiB0aGUgc2VydmljZS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBOb3QgdG8gYmUgc3BlY2lmaWVkIGZvciBKQVgtV1MgcnVudGltZQorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiBTZXJ2aWNlcyBDbGllbnQgMS4yCisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3J0IE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJfUG9ydE5hbWVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRQb3J0TmFtZXMoKTsKKwlMaXN0PFN0cmluZz4gZ2V0UG9ydE5hbWVzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9TZXJ2aWNlUmVmSGFuZGxlckNoYWluLmphdmEKaW5kZXggYTMwYjg4My4uMWZmODFhOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW4uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VydmljZVJlZkhhbmRsZXJDaGFpbi5qYXZhCkBAIC0yMCwxNyArMjAsMTggQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqICAgICAgIFRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWluLgotICogICAgICAgSGFuZGxlcmNoYWluIGNhbiBiZSBkZWZpbmVkIHN1Y2ggdGhhdCB0aGUgaGFuZGxlcnMgaW4gdGhlCi0gKiAgICAgICBoYW5kbGVyY2hhaW4gb3BlcmF0ZSxhbGwgcG9ydHMgb2YgYSBzZXJ2aWNlLCBvbiBhIHNwZWNpZmljCi0gKiAgICAgICBwb3J0IG9yIG9uIGEgbGlzdCBvZiBwcm90b2NvbC1iaW5kaW5ncy4gVGhlIGNob2ljZSBvZiBlbGVtZW50cwotICogICAgICAgc2VydmljZS1uYW1lLXBhdHRlcm4sIHBvcnQtbmFtZS1wYXR0ZXJuIGFuZCBwcm90b2NvbC1iaW5kaW5ncwotICogICAgICAgYXJlIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIHRoZSBoYW5kbGVycyBpbiBoYW5kbGVyLWNoYWluIGFyZQotICogICAgICAgZm9yIGEgc2VydmljZSwgcG9ydCBvciBwcm90b2NvbCBiaW5kaW5nLiBJZiBub25lIG9mIHRoZXNlCi0gKiAgICAgICBjaG9pY2VzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgaGFuZGxlci1jaGFpbiBlbGVtZW50IHRoZW4gdGhlCi0gKiAgICAgICBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhlIGhhbmRsZXItY2hhaW4gd2lsbCBiZSBhcHBsaWVkIG9uCi0gKiAgICAgICBldmVyeXRoaW5nLgotICogCisgKiAgICAgICAgIFRoZSBoYW5kbGVyLWNoYWluIGVsZW1lbnQgZGVmaW5lcyB0aGUgaGFuZGxlcmNoYWluLiAKKyAqICAgICAgICAgSGFuZGxlcmNoYWluIGNhbiBiZSBkZWZpbmVkIHN1Y2ggdGhhdCB0aGUgaGFuZGxlcnMgaW4gdGhlCisgKiAgICAgICAgIGhhbmRsZXJjaGFpbiBvcGVyYXRlLGFsbCBwb3J0cyBvZiBhIHNlcnZpY2UsIG9uIGEgc3BlY2lmaWMKKyAqICAgICAgICAgcG9ydCBvciBvbiBhIGxpc3Qgb2YgcHJvdG9jb2wtYmluZGluZ3MuIFRoZSBjaG9pY2Ugb2YgZWxlbWVudHMKKyAqICAgICAgICAgc2VydmljZS1uYW1lLXBhdHRlcm4sIHBvcnQtbmFtZS1wYXR0ZXJuIGFuZCBwcm90b2NvbC1iaW5kaW5ncworICogICAgICAgICBhcmUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgdGhlIGhhbmRsZXJzIGluIGhhbmRsZXItY2hhaW4gYXJlCisgKiAgICAgICAgIGZvciBhIHNlcnZpY2UsIHBvcnQgb3IgcHJvdG9jb2wgYmluZGluZy4gSWYgbm9uZSBvZiB0aGVzZSAKKyAqICAgICAgICAgY2hvaWNlcyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlIGhhbmRsZXItY2hhaW4gZWxlbWVudCB0aGVuIHRoZQorICogICAgICAgICBoYW5kbGVycyBzcGVjaWZpZWQgaW4gdGhlIGhhbmRsZXItY2hhaW4gd2lsbCBiZSBhcHBsaWVkIG9uIAorICogICAgICAgICBldmVyeXRoaW5nLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIFNlcnZpY2VzIENsaWVudCAxLjIKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTExMyw3ICsxMTQsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UjZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9Qcm90b2NvbEJpbmRpbmdzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRQcm90b2NvbEJpbmRpbmdzKCk7CisJTGlzdDxTdHJpbmc+IGdldFByb3RvY29sQmluZGluZ3MoKTsKIAogCS8qKgogCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmSGFuZGxlckNoYWluI2dldFByb3RvY29sQmluZGluZ3MgPGVtPlByb3RvY29sIEJpbmRpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMjMsNyArMTI0LDcgQEAKIAkgKiBAc2VlICNnZXRQcm90b2NvbEJpbmRpbmdzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0Jdm9pZCBzZXRQcm90b2NvbEJpbmRpbmdzKExpc3QgdmFsdWUpOworCXZvaWQgc2V0UHJvdG9jb2xCaW5kaW5ncyhMaXN0PFN0cmluZz4gdmFsdWUpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFuZGxlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTM4LDcgKzEzOSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX0hhbmRsZXJzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRIYW5kbGVycygpOworCUxpc3Q8U2VydmljZVJlZkhhbmRsZXI+IGdldEhhbmRsZXJzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VydmljZVJlZkhhbmRsZXJDaGFpbnMuamF2YQppbmRleCBhNGNhN2IyLi4zMTZjMTg2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VydmljZVJlZkhhbmRsZXJDaGFpbnMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvU2VydmljZVJlZkhhbmRsZXJDaGFpbnMuamF2YQpAQCAtMjAsOSArMjAsMTAgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqICAgICAgIFRoZSBoYW5kbGVyLWNoYWlucyBlbGVtZW50IGRlZmluZXMgdGhlIGhhbmRsZXJjaGFpbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAqICAgICAgIHNlcnZpY2Ugb3Igc2VydmljZSBlbmRwb2ludC4KLSAqIAorICogICAgICAgICBUaGUgaGFuZGxlci1jaGFpbnMgZWxlbWVudCBkZWZpbmVzIHRoZSBoYW5kbGVyY2hhaW5zIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiAgICAgICAgIHNlcnZpY2Ugb3Igc2VydmljZSBlbmRwb2ludC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiBTZXJ2aWNlcyBDbGllbnQgMS4yCiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC01Miw3ICs1Myw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZSNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluc19IYW5kbGVyQ2hhaW5zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRIYW5kbGVyQ2hhaW5zKCk7CisJTGlzdDxTZXJ2aWNlUmVmSGFuZGxlckNoYWluPiBnZXRIYW5kbGVyQ2hhaW5zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL1VybFBhdHRlcm5UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvVXJsUGF0dGVyblR5cGUuamF2YQppbmRleCBjOTY2OTFlLi4zYjMyNjAxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvVXJsUGF0dGVyblR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvVXJsUGF0dGVyblR5cGUuamF2YQpAQCAtMTksMTQgKzE5LDE1IEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIHVybC1wYXR0ZXJuVHlwZSBjb250YWlucyB0aGUgdXJsIHBhdHRlcm4gb2YgdGhlIG1hcHBpbmcuCi0gKiAJSXQgbXVzdCBmb2xsb3cgdGhlIHJ1bGVzIHNwZWNpZmllZCBpbiBTZWN0aW9uIDExLjIgb2YgdGhlCi0gKiAJU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbi4gVGhpcyBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gYmUgaW4KLSAqIAlVUkwtZGVjb2RlZCBmb3JtIGFuZCBtdXN0IG5vdCBjb250YWluIENSKCN4RCkgb3IgTEYoI3hBKS4KLSAqIAlJZiBpdCBjb250YWlucyB0aG9zZSBjaGFyYWN0ZXJzLCB0aGUgY29udGFpbmVyIG11c3QgaW5mb3JtCi0gKiAJdGhlIGRldmVsb3BlciB3aXRoIGEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZS4KLSAqIAlUaGUgY29udGFpbmVyIG11c3QgcHJlc2VydmUgYWxsIGNoYXJhY3RlcnMgaW5jbHVkaW5nIHdoaXRlc3BhY2VzLgotICogCisgKiAgICAgICAgIFRoZSB1cmwtcGF0dGVyblR5cGUgY29udGFpbnMgdGhlIHVybCBwYXR0ZXJuIG9mIHRoZSBtYXBwaW5nLgorICogICAgICAgICBJdCBtdXN0IGZvbGxvdyB0aGUgcnVsZXMgc3BlY2lmaWVkIGluIFNlY3Rpb24gMTEuMiBvZiB0aGUKKyAqICAgICAgICAgU2VydmxldCBBUEkgU3BlY2lmaWNhdGlvbi4gVGhpcyBwYXR0ZXJuIGlzIGFzc3VtZWQgdG8gYmUgaW4KKyAqICAgICAgICAgVVJMLWRlY29kZWQgZm9ybSBhbmQgbXVzdCBub3QgY29udGFpbiBDUigjeEQpIG9yIExGKCN4QSkuCisgKiAgICAgICAgIElmIGl0IGNvbnRhaW5zIHRob3NlIGNoYXJhY3RlcnMsIHRoZSBjb250YWluZXIgbXVzdCBpbmZvcm0KKyAqICAgICAgICAgdGhlIGRldmVsb3BlciB3aXRoIGEgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZS4KKyAqICAgICAgICAgVGhlIGNvbnRhaW5lciBtdXN0IHByZXNlcnZlIGFsbCBjaGFyYWN0ZXJzIGluY2x1ZGluZyB3aGl0ZXNwYWNlcy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0FkZHJlc3NpbmdUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvQWRkcmVzc2luZ1R5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MjAyYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0FkZHJlc3NpbmdUeXBlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuQWRkcmVzc2luZ1R5cGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFkZHJlc3NpbmcgVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuQWRkcmVzc2luZ1R5cGVJbXBsI2lzRW5hYmxlZCA8ZW0+RW5hYmxlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuQWRkcmVzc2luZ1R5cGVJbXBsI2lzUmVxdWlyZWQgPGVtPlJlcXVpcmVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5BZGRyZXNzaW5nVHlwZUltcGwjZ2V0UmVzcG9uc2VzIDxlbT5SZXNwb25zZXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBZGRyZXNzaW5nVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFkZHJlc3NpbmdUeXBlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFbmFibGVkKCkgPGVtPkVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRW5hYmxlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVOQUJMRURfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW5hYmxlZCgpIDxlbT5FbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0VuYWJsZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQgPSBFTkFCTEVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFbmFibGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVkRVNldDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlcXVpcmVkKCkgPGVtPlJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1JlcXVpcmVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVRVUlSRURfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVxdWlyZWQoKSA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzUmVxdWlyZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVkID0gUkVRVUlSRURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlcXVpcmVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlZEVTZXQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcG9uc2VzKCkgPGVtPlJlc3BvbnNlczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVzcG9uc2VzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIFJFU1BPTlNFU19FREVGQVVMVCA9IEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlLkFOT05ZTU9VUzsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3BvbnNlcygpIDxlbT5SZXNwb25zZXM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlc3BvbnNlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIHJlc3BvbnNlcyA9IFJFU1BPTlNFU19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzcG9uc2VzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiByZXNwb25zZXNFU2V0OworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFkZHJlc3NpbmdUeXBlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuQUREUkVTU0lOR19UWVBFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKwkJcmV0dXJuIGVuYWJsZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIG5ld0VuYWJsZWQpIHsKKwkJYm9vbGVhbiBvbGRFbmFibGVkID0gZW5hYmxlZDsKKwkJZW5hYmxlZCA9IG5ld0VuYWJsZWQ7CisJCWJvb2xlYW4gb2xkRW5hYmxlZEVTZXQgPSBlbmFibGVkRVNldDsKKwkJZW5hYmxlZEVTZXQgPSB0cnVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkFERFJFU1NJTkdfVFlQRV9fRU5BQkxFRCwgb2xkRW5hYmxlZCwgZW5hYmxlZCwgIW9sZEVuYWJsZWRFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdW5zZXRFbmFibGVkKCkgeworCQlib29sZWFuIG9sZEVuYWJsZWQgPSBlbmFibGVkOworCQlib29sZWFuIG9sZEVuYWJsZWRFU2V0ID0gZW5hYmxlZEVTZXQ7CisJCWVuYWJsZWQgPSBFTkFCTEVEX0VERUZBVUxUOworCQllbmFibGVkRVNldCA9IGZhbHNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEphdmFlZVBhY2thZ2UuQUREUkVTU0lOR19UWVBFX19FTkFCTEVELCBvbGRFbmFibGVkLCBFTkFCTEVEX0VERUZBVUxULCBvbGRFbmFibGVkRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0RW5hYmxlZCgpIHsKKwkJcmV0dXJuIGVuYWJsZWRFU2V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7CisJCXJldHVybiByZXF1aXJlZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIG5ld1JlcXVpcmVkKSB7CisJCWJvb2xlYW4gb2xkUmVxdWlyZWQgPSByZXF1aXJlZDsKKwkJcmVxdWlyZWQgPSBuZXdSZXF1aXJlZDsKKwkJYm9vbGVhbiBvbGRSZXF1aXJlZEVTZXQgPSByZXF1aXJlZEVTZXQ7CisJCXJlcXVpcmVkRVNldCA9IHRydWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuQUREUkVTU0lOR19UWVBFX19SRVFVSVJFRCwgb2xkUmVxdWlyZWQsIHJlcXVpcmVkLCAhb2xkUmVxdWlyZWRFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdW5zZXRSZXF1aXJlZCgpIHsKKwkJYm9vbGVhbiBvbGRSZXF1aXJlZCA9IHJlcXVpcmVkOworCQlib29sZWFuIG9sZFJlcXVpcmVkRVNldCA9IHJlcXVpcmVkRVNldDsKKwkJcmVxdWlyZWQgPSBSRVFVSVJFRF9FREVGQVVMVDsKKwkJcmVxdWlyZWRFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmF2YWVlUGFja2FnZS5BRERSRVNTSU5HX1RZUEVfX1JFUVVJUkVELCBvbGRSZXF1aXJlZCwgUkVRVUlSRURfRURFRkFVTFQsIG9sZFJlcXVpcmVkRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0UmVxdWlyZWQoKSB7CisJCXJldHVybiByZXF1aXJlZEVTZXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIGdldFJlc3BvbnNlcygpIHsKKwkJcmV0dXJuIHJlc3BvbnNlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXNwb25zZXMoQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgbmV3UmVzcG9uc2VzKSB7CisJCUFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIG9sZFJlc3BvbnNlcyA9IHJlc3BvbnNlczsKKwkJcmVzcG9uc2VzID0gbmV3UmVzcG9uc2VzID09IG51bGwgPyBSRVNQT05TRVNfRURFRkFVTFQgOiBuZXdSZXNwb25zZXM7CisJCWJvb2xlYW4gb2xkUmVzcG9uc2VzRVNldCA9IHJlc3BvbnNlc0VTZXQ7CisJCXJlc3BvbnNlc0VTZXQgPSB0cnVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkFERFJFU1NJTkdfVFlQRV9fUkVTUE9OU0VTLCBvbGRSZXNwb25zZXMsIHJlc3BvbnNlcywgIW9sZFJlc3BvbnNlc0VTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldFJlc3BvbnNlcygpIHsKKwkJQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgb2xkUmVzcG9uc2VzID0gcmVzcG9uc2VzOworCQlib29sZWFuIG9sZFJlc3BvbnNlc0VTZXQgPSByZXNwb25zZXNFU2V0OworCQlyZXNwb25zZXMgPSBSRVNQT05TRVNfRURFRkFVTFQ7CisJCXJlc3BvbnNlc0VTZXQgPSBmYWxzZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKYXZhZWVQYWNrYWdlLkFERFJFU1NJTkdfVFlQRV9fUkVTUE9OU0VTLCBvbGRSZXNwb25zZXMsIFJFU1BPTlNFU19FREVGQVVMVCwgb2xkUmVzcG9uc2VzRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzcG9uc2VzKCkgeworCQlyZXR1cm4gcmVzcG9uc2VzRVNldDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuQUREUkVTU0lOR19UWVBFX19FTkFCTEVEOgorCQkJCXJldHVybiBpc0VuYWJsZWQoKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5BRERSRVNTSU5HX1RZUEVfX1JFUVVJUkVEOgorCQkJCXJldHVybiBpc1JlcXVpcmVkKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuQUREUkVTU0lOR19UWVBFX19SRVNQT05TRVM6CisJCQkJcmV0dXJuIGdldFJlc3BvbnNlcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuQUREUkVTU0lOR19UWVBFX19FTkFCTEVEOgorCQkJCXNldEVuYWJsZWQoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5BRERSRVNTSU5HX1RZUEVfX1JFUVVJUkVEOgorCQkJCXNldFJlcXVpcmVkKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuQUREUkVTU0lOR19UWVBFX19SRVNQT05TRVM6CisJCQkJc2V0UmVzcG9uc2VzKChBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5BRERSRVNTSU5HX1RZUEVfX0VOQUJMRUQ6CisJCQkJdW5zZXRFbmFibGVkKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkFERFJFU1NJTkdfVFlQRV9fUkVRVUlSRUQ6CisJCQkJdW5zZXRSZXF1aXJlZCgpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5BRERSRVNTSU5HX1RZUEVfX1JFU1BPTlNFUzoKKwkJCQl1bnNldFJlc3BvbnNlcygpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkFERFJFU1NJTkdfVFlQRV9fRU5BQkxFRDoKKwkJCQlyZXR1cm4gaXNTZXRFbmFibGVkKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuQUREUkVTU0lOR19UWVBFX19SRVFVSVJFRDoKKwkJCQlyZXR1cm4gaXNTZXRSZXF1aXJlZCgpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkFERFJFU1NJTkdfVFlQRV9fUkVTUE9OU0VTOgorCQkJCXJldHVybiBpc1NldFJlc3BvbnNlcygpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoZW5hYmxlZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGVuYWJsZWRFU2V0KSByZXN1bHQuYXBwZW5kKGVuYWJsZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIHJlcXVpcmVkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAocmVxdWlyZWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlcXVpcmVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCByZXNwb25zZXM6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChyZXNwb25zZXNFU2V0KSByZXN1bHQuYXBwZW5kKHJlc3BvbnNlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0FkZHJlc3NpbmdUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRGF0YVNvdXJjZVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9EYXRhU291cmNlVHlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTdlYjYxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRGF0YVNvdXJjZVR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwxMjM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Jc29sYXRpb25MZXZlbFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlByb3BlcnR5VHlwZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGF0YSBTb3VyY2UgVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGF0YVNvdXJjZVR5cGVJbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGF0YVNvdXJjZVR5cGVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRhdGFTb3VyY2VUeXBlSW1wbCNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRhdGFTb3VyY2VUeXBlSW1wbCNnZXRTZXJ2ZXJOYW1lIDxlbT5TZXJ2ZXIgTmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGF0YVNvdXJjZVR5cGVJbXBsI2dldFBvcnROdW1iZXIgPGVtPlBvcnQgTnVtYmVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EYXRhU291cmNlVHlwZUltcGwjZ2V0RGF0YWJhc2VOYW1lIDxlbT5EYXRhYmFzZSBOYW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EYXRhU291cmNlVHlwZUltcGwjZ2V0VXJsIDxlbT5Vcmw8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRhdGFTb3VyY2VUeXBlSW1wbCNnZXRVc2VyIDxlbT5Vc2VyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EYXRhU291cmNlVHlwZUltcGwjZ2V0UGFzc3dvcmQgPGVtPlBhc3N3b3JkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EYXRhU291cmNlVHlwZUltcGwjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EYXRhU291cmNlVHlwZUltcGwjZ2V0TG9naW5UaW1lb3V0IDxlbT5Mb2dpbiBUaW1lb3V0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EYXRhU291cmNlVHlwZUltcGwjaXNUcmFuc2FjdGlvbmFsIDxlbT5UcmFuc2FjdGlvbmFsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EYXRhU291cmNlVHlwZUltcGwjZ2V0SXNvbGF0aW9uTGV2ZWwgPGVtPklzb2xhdGlvbiBMZXZlbDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGF0YVNvdXJjZVR5cGVJbXBsI2dldEluaXRpYWxQb29sU2l6ZSA8ZW0+SW5pdGlhbCBQb29sIFNpemU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRhdGFTb3VyY2VUeXBlSW1wbCNnZXRNYXhQb29sU2l6ZSA8ZW0+TWF4IFBvb2wgU2l6ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGF0YVNvdXJjZVR5cGVJbXBsI2dldE1pblBvb2xTaXplIDxlbT5NaW4gUG9vbCBTaXplPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EYXRhU291cmNlVHlwZUltcGwjZ2V0TWF4SWRsZVRpbWUgPGVtPk1heCBJZGxlIFRpbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRhdGFTb3VyY2VUeXBlSW1wbCNnZXRNYXhTdGF0ZW1lbnRzIDxlbT5NYXggU3RhdGVtZW50czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRGF0YVNvdXJjZVR5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIERhdGFTb3VyY2VUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRGF0YVNvdXJjZVR5cGUgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NOYW1lKCkgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc05hbWUoKSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSA9IENMQVNTX05BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmVyTmFtZSgpIDxlbT5TZXJ2ZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2VydmVyTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX05BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmVyTmFtZSgpIDxlbT5TZXJ2ZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2VydmVyTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBzZXJ2ZXJOYW1lID0gU0VSVkVSX05BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydE51bWJlcigpIDxlbT5Qb3J0IE51bWJlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UG9ydE51bWJlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFBPUlRfTlVNQkVSX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnROdW1iZXIoKSA8ZW0+UG9ydCBOdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvcnROdW1iZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBvcnROdW1iZXIgPSBQT1JUX05VTUJFUl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhYmFzZU5hbWUoKSA8ZW0+RGF0YWJhc2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGF0YWJhc2VOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERhdGFiYXNlTmFtZSgpIDxlbT5EYXRhYmFzZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREYXRhYmFzZU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZGF0YWJhc2VOYW1lID0gREFUQUJBU0VfTkFNRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmwoKSA8ZW0+VXJsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVcmwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmwoKSA8ZW0+VXJsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVcmwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdXJsID0gVVJMX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZXIoKSA8ZW0+VXNlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VXNlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2VyKCkgPGVtPlVzZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFVzZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdXNlciA9IFVTRVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFzc3dvcmQoKSA8ZW0+UGFzc3dvcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhc3N3b3JkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXNzd29yZCgpIDxlbT5QYXNzd29yZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFzc3dvcmQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgcGFzc3dvcmQgPSBQQVNTV09SRF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnR5KCkgPGVtPlByb3BlcnR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8UHJvcGVydHlUeXBlPiBwcm9wZXJ0eTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2dpblRpbWVvdXQoKSA8ZW0+TG9naW4gVGltZW91dDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TG9naW5UaW1lb3V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTE9HSU5fVElNRU9VVF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2dpblRpbWVvdXQoKSA8ZW0+TG9naW4gVGltZW91dDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TG9naW5UaW1lb3V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsb2dpblRpbWVvdXQgPSBMT0dJTl9USU1FT1VUX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVHJhbnNhY3Rpb25hbCgpIDxlbT5UcmFuc2FjdGlvbmFsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1RyYW5zYWN0aW9uYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBUUkFOU0FDVElPTkFMX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1RyYW5zYWN0aW9uYWwoKSA8ZW0+VHJhbnNhY3Rpb25hbDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNUcmFuc2FjdGlvbmFsKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc2FjdGlvbmFsID0gVFJBTlNBQ1RJT05BTF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVHJhbnNhY3Rpb25hbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNhY3Rpb25hbEVTZXQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNvbGF0aW9uTGV2ZWwoKSA8ZW0+SXNvbGF0aW9uIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJc29sYXRpb25MZXZlbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJc29sYXRpb25MZXZlbFR5cGUgSVNPTEFUSU9OX0xFVkVMX0VERUZBVUxUID0gSXNvbGF0aW9uTGV2ZWxUeXBlLlRSQU5TQUNUSU9OUkVBRFVOQ09NTUlUVEVEOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNvbGF0aW9uTGV2ZWwoKSA8ZW0+SXNvbGF0aW9uIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJc29sYXRpb25MZXZlbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIElzb2xhdGlvbkxldmVsVHlwZSBpc29sYXRpb25MZXZlbCA9IElTT0xBVElPTl9MRVZFTF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXNvbGF0aW9uIExldmVsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc29sYXRpb25MZXZlbEVTZXQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFBvb2xTaXplKCkgPGVtPkluaXRpYWwgUG9vbCBTaXplPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbml0aWFsUG9vbFNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBJTklUSUFMX1BPT0xfU0laRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsUG9vbFNpemUoKSA8ZW0+SW5pdGlhbCBQb29sIFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluaXRpYWxQb29sU2l6ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJpZ0ludGVnZXIgaW5pdGlhbFBvb2xTaXplID0gSU5JVElBTF9QT09MX1NJWkVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4UG9vbFNpemUoKSA8ZW0+TWF4IFBvb2wgU2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWF4UG9vbFNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBNQVhfUE9PTF9TSVpFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1heFBvb2xTaXplKCkgPGVtPk1heCBQb29sIFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1heFBvb2xTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQmlnSW50ZWdlciBtYXhQb29sU2l6ZSA9IE1BWF9QT09MX1NJWkVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWluUG9vbFNpemUoKSA8ZW0+TWluIFBvb2wgU2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWluUG9vbFNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBNSU5fUE9PTF9TSVpFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pblBvb2xTaXplKCkgPGVtPk1pbiBQb29sIFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1pblBvb2xTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQmlnSW50ZWdlciBtaW5Qb29sU2l6ZSA9IE1JTl9QT09MX1NJWkVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4SWRsZVRpbWUoKSA8ZW0+TWF4IElkbGUgVGltZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWF4SWRsZVRpbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBNQVhfSURMRV9USU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1heElkbGVUaW1lKCkgPGVtPk1heCBJZGxlIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1heElkbGVUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQmlnSW50ZWdlciBtYXhJZGxlVGltZSA9IE1BWF9JRExFX1RJTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4U3RhdGVtZW50cygpIDxlbT5NYXggU3RhdGVtZW50czwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWF4U3RhdGVtZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE1BWF9TVEFURU1FTlRTX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1heFN0YXRlbWVudHMoKSA8ZW0+TWF4IFN0YXRlbWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1heFN0YXRlbWVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG1heFN0YXRlbWVudHMgPSBNQVhfU1RBVEVNRU5UU19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIERhdGFTb3VyY2VUeXBlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuREFUQV9TT1VSQ0VfVFlQRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREZXNjcmlwdGlvbihEZXNjcmlwdGlvbiBuZXdEZXNjcmlwdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlEZXNjcmlwdGlvbiBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgbmV3RGVzY3JpcHRpb24pOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKERlc2NyaXB0aW9uIG5ld0Rlc2NyaXB0aW9uKSB7CisJCWlmIChuZXdEZXNjcmlwdGlvbiAhPSBkZXNjcmlwdGlvbikgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGVzY3JpcHRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdEZXNjcmlwdGlvbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdEZXNjcmlwdGlvbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fREVTQ1JJUFRJT04sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24sIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19ERVNDUklQVElPTiwgbmV3RGVzY3JpcHRpb24sIG5ld0Rlc2NyaXB0aW9uKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKKwkJbmFtZSA9IG5ld05hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgeworCQlyZXR1cm4gY2xhc3NOYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgbmV3Q2xhc3NOYW1lKSB7CisJCVN0cmluZyBvbGRDbGFzc05hbWUgPSBjbGFzc05hbWU7CisJCWNsYXNzTmFtZSA9IG5ld0NsYXNzTmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19DTEFTU19OQU1FLCBvbGRDbGFzc05hbWUsIGNsYXNzTmFtZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTmFtZSgpIHsKKwkJcmV0dXJuIHNlcnZlck5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VydmVyTmFtZShTdHJpbmcgbmV3U2VydmVyTmFtZSkgeworCQlTdHJpbmcgb2xkU2VydmVyTmFtZSA9IHNlcnZlck5hbWU7CisJCXNlcnZlck5hbWUgPSBuZXdTZXJ2ZXJOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX1NFUlZFUl9OQU1FLCBvbGRTZXJ2ZXJOYW1lLCBzZXJ2ZXJOYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJpZ0ludGVnZXIgZ2V0UG9ydE51bWJlcigpIHsKKwkJcmV0dXJuIHBvcnROdW1iZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UG9ydE51bWJlcihCaWdJbnRlZ2VyIG5ld1BvcnROdW1iZXIpIHsKKwkJQmlnSW50ZWdlciBvbGRQb3J0TnVtYmVyID0gcG9ydE51bWJlcjsKKwkJcG9ydE51bWJlciA9IG5ld1BvcnROdW1iZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fUE9SVF9OVU1CRVIsIG9sZFBvcnROdW1iZXIsIHBvcnROdW1iZXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlTmFtZSgpIHsKKwkJcmV0dXJuIGRhdGFiYXNlTmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREYXRhYmFzZU5hbWUoU3RyaW5nIG5ld0RhdGFiYXNlTmFtZSkgeworCQlTdHJpbmcgb2xkRGF0YWJhc2VOYW1lID0gZGF0YWJhc2VOYW1lOworCQlkYXRhYmFzZU5hbWUgPSBuZXdEYXRhYmFzZU5hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fREFUQUJBU0VfTkFNRSwgb2xkRGF0YWJhc2VOYW1lLCBkYXRhYmFzZU5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKwkJcmV0dXJuIHVybDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIG5ld1VybCkgeworCQlTdHJpbmcgb2xkVXJsID0gdXJsOworCQl1cmwgPSBuZXdVcmw7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fVVJMLCBvbGRVcmwsIHVybCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKKwkJcmV0dXJuIHVzZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VXNlcihTdHJpbmcgbmV3VXNlcikgeworCQlTdHJpbmcgb2xkVXNlciA9IHVzZXI7CisJCXVzZXIgPSBuZXdVc2VyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX1VTRVIsIG9sZFVzZXIsIHVzZXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworCQlyZXR1cm4gcGFzc3dvcmQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIG5ld1Bhc3N3b3JkKSB7CisJCVN0cmluZyBvbGRQYXNzd29yZCA9IHBhc3N3b3JkOworCQlwYXNzd29yZCA9IG5ld1Bhc3N3b3JkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX1BBU1NXT1JELCBvbGRQYXNzd29yZCwgcGFzc3dvcmQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxQcm9wZXJ0eVR5cGU+IGdldFByb3BlcnR5KCkgeworCQlpZiAocHJvcGVydHkgPT0gbnVsbCkgeworCQkJcHJvcGVydHkgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UHJvcGVydHlUeXBlPihQcm9wZXJ0eVR5cGUuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fUFJPUEVSVFkpOworCQl9CisJCXJldHVybiBwcm9wZXJ0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQmlnSW50ZWdlciBnZXRMb2dpblRpbWVvdXQoKSB7CisJCXJldHVybiBsb2dpblRpbWVvdXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TG9naW5UaW1lb3V0KEJpZ0ludGVnZXIgbmV3TG9naW5UaW1lb3V0KSB7CisJCUJpZ0ludGVnZXIgb2xkTG9naW5UaW1lb3V0ID0gbG9naW5UaW1lb3V0OworCQlsb2dpblRpbWVvdXQgPSBuZXdMb2dpblRpbWVvdXQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fTE9HSU5fVElNRU9VVCwgb2xkTG9naW5UaW1lb3V0LCBsb2dpblRpbWVvdXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zYWN0aW9uYWwoKSB7CisJCXJldHVybiB0cmFuc2FjdGlvbmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uYWwoYm9vbGVhbiBuZXdUcmFuc2FjdGlvbmFsKSB7CisJCWJvb2xlYW4gb2xkVHJhbnNhY3Rpb25hbCA9IHRyYW5zYWN0aW9uYWw7CisJCXRyYW5zYWN0aW9uYWwgPSBuZXdUcmFuc2FjdGlvbmFsOworCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uYWxFU2V0ID0gdHJhbnNhY3Rpb25hbEVTZXQ7CisJCXRyYW5zYWN0aW9uYWxFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19UUkFOU0FDVElPTkFMLCBvbGRUcmFuc2FjdGlvbmFsLCB0cmFuc2FjdGlvbmFsLCAhb2xkVHJhbnNhY3Rpb25hbEVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldFRyYW5zYWN0aW9uYWwoKSB7CisJCWJvb2xlYW4gb2xkVHJhbnNhY3Rpb25hbCA9IHRyYW5zYWN0aW9uYWw7CisJCWJvb2xlYW4gb2xkVHJhbnNhY3Rpb25hbEVTZXQgPSB0cmFuc2FjdGlvbmFsRVNldDsKKwkJdHJhbnNhY3Rpb25hbCA9IFRSQU5TQUNUSU9OQUxfRURFRkFVTFQ7CisJCXRyYW5zYWN0aW9uYWxFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19UUkFOU0FDVElPTkFMLCBvbGRUcmFuc2FjdGlvbmFsLCBUUkFOU0FDVElPTkFMX0VERUZBVUxULCBvbGRUcmFuc2FjdGlvbmFsRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25hbCgpIHsKKwkJcmV0dXJuIHRyYW5zYWN0aW9uYWxFU2V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBJc29sYXRpb25MZXZlbFR5cGUgZ2V0SXNvbGF0aW9uTGV2ZWwoKSB7CisJCXJldHVybiBpc29sYXRpb25MZXZlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJc29sYXRpb25MZXZlbChJc29sYXRpb25MZXZlbFR5cGUgbmV3SXNvbGF0aW9uTGV2ZWwpIHsKKwkJSXNvbGF0aW9uTGV2ZWxUeXBlIG9sZElzb2xhdGlvbkxldmVsID0gaXNvbGF0aW9uTGV2ZWw7CisJCWlzb2xhdGlvbkxldmVsID0gbmV3SXNvbGF0aW9uTGV2ZWwgPT0gbnVsbCA/IElTT0xBVElPTl9MRVZFTF9FREVGQVVMVCA6IG5ld0lzb2xhdGlvbkxldmVsOworCQlib29sZWFuIG9sZElzb2xhdGlvbkxldmVsRVNldCA9IGlzb2xhdGlvbkxldmVsRVNldDsKKwkJaXNvbGF0aW9uTGV2ZWxFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19JU09MQVRJT05fTEVWRUwsIG9sZElzb2xhdGlvbkxldmVsLCBpc29sYXRpb25MZXZlbCwgIW9sZElzb2xhdGlvbkxldmVsRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHVuc2V0SXNvbGF0aW9uTGV2ZWwoKSB7CisJCUlzb2xhdGlvbkxldmVsVHlwZSBvbGRJc29sYXRpb25MZXZlbCA9IGlzb2xhdGlvbkxldmVsOworCQlib29sZWFuIG9sZElzb2xhdGlvbkxldmVsRVNldCA9IGlzb2xhdGlvbkxldmVsRVNldDsKKwkJaXNvbGF0aW9uTGV2ZWwgPSBJU09MQVRJT05fTEVWRUxfRURFRkFVTFQ7CisJCWlzb2xhdGlvbkxldmVsRVNldCA9IGZhbHNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fSVNPTEFUSU9OX0xFVkVMLCBvbGRJc29sYXRpb25MZXZlbCwgSVNPTEFUSU9OX0xFVkVMX0VERUZBVUxULCBvbGRJc29sYXRpb25MZXZlbEVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldElzb2xhdGlvbkxldmVsKCkgeworCQlyZXR1cm4gaXNvbGF0aW9uTGV2ZWxFU2V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEluaXRpYWxQb29sU2l6ZSgpIHsKKwkJcmV0dXJuIGluaXRpYWxQb29sU2l6ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJbml0aWFsUG9vbFNpemUoQmlnSW50ZWdlciBuZXdJbml0aWFsUG9vbFNpemUpIHsKKwkJQmlnSW50ZWdlciBvbGRJbml0aWFsUG9vbFNpemUgPSBpbml0aWFsUG9vbFNpemU7CisJCWluaXRpYWxQb29sU2l6ZSA9IG5ld0luaXRpYWxQb29sU2l6ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19JTklUSUFMX1BPT0xfU0laRSwgb2xkSW5pdGlhbFBvb2xTaXplLCBpbml0aWFsUG9vbFNpemUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQmlnSW50ZWdlciBnZXRNYXhQb29sU2l6ZSgpIHsKKwkJcmV0dXJuIG1heFBvb2xTaXplOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1heFBvb2xTaXplKEJpZ0ludGVnZXIgbmV3TWF4UG9vbFNpemUpIHsKKwkJQmlnSW50ZWdlciBvbGRNYXhQb29sU2l6ZSA9IG1heFBvb2xTaXplOworCQltYXhQb29sU2l6ZSA9IG5ld01heFBvb2xTaXplOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX01BWF9QT09MX1NJWkUsIG9sZE1heFBvb2xTaXplLCBtYXhQb29sU2l6ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCaWdJbnRlZ2VyIGdldE1pblBvb2xTaXplKCkgeworCQlyZXR1cm4gbWluUG9vbFNpemU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWluUG9vbFNpemUoQmlnSW50ZWdlciBuZXdNaW5Qb29sU2l6ZSkgeworCQlCaWdJbnRlZ2VyIG9sZE1pblBvb2xTaXplID0gbWluUG9vbFNpemU7CisJCW1pblBvb2xTaXplID0gbmV3TWluUG9vbFNpemU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fTUlOX1BPT0xfU0laRSwgb2xkTWluUG9vbFNpemUsIG1pblBvb2xTaXplKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJpZ0ludGVnZXIgZ2V0TWF4SWRsZVRpbWUoKSB7CisJCXJldHVybiBtYXhJZGxlVGltZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXhJZGxlVGltZShCaWdJbnRlZ2VyIG5ld01heElkbGVUaW1lKSB7CisJCUJpZ0ludGVnZXIgb2xkTWF4SWRsZVRpbWUgPSBtYXhJZGxlVGltZTsKKwkJbWF4SWRsZVRpbWUgPSBuZXdNYXhJZGxlVGltZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19NQVhfSURMRV9USU1FLCBvbGRNYXhJZGxlVGltZSwgbWF4SWRsZVRpbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQmlnSW50ZWdlciBnZXRNYXhTdGF0ZW1lbnRzKCkgeworCQlyZXR1cm4gbWF4U3RhdGVtZW50czsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXhTdGF0ZW1lbnRzKEJpZ0ludGVnZXIgbmV3TWF4U3RhdGVtZW50cykgeworCQlCaWdJbnRlZ2VyIG9sZE1heFN0YXRlbWVudHMgPSBtYXhTdGF0ZW1lbnRzOworCQltYXhTdGF0ZW1lbnRzID0gbmV3TWF4U3RhdGVtZW50czsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19NQVhfU1RBVEVNRU5UUywgb2xkTWF4U3RhdGVtZW50cywgbWF4U3RhdGVtZW50cykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKKwkJU3RyaW5nIG9sZElkID0gaWQ7CisJCWlkID0gbmV3SWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fSUQsIG9sZElkLCBpZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gYmFzaWNTZXREZXNjcmlwdGlvbihudWxsLCBtc2dzKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19QUk9QRVJUWToKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX05BTUU6CisJCQkJcmV0dXJuIGdldE5hbWUoKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19DTEFTU19OQU1FOgorCQkJCXJldHVybiBnZXRDbGFzc05hbWUoKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19TRVJWRVJfTkFNRToKKwkJCQlyZXR1cm4gZ2V0U2VydmVyTmFtZSgpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX1BPUlRfTlVNQkVSOgorCQkJCXJldHVybiBnZXRQb3J0TnVtYmVyKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fREFUQUJBU0VfTkFNRToKKwkJCQlyZXR1cm4gZ2V0RGF0YWJhc2VOYW1lKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fVVJMOgorCQkJCXJldHVybiBnZXRVcmwoKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19VU0VSOgorCQkJCXJldHVybiBnZXRVc2VyKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fUEFTU1dPUkQ6CisJCQkJcmV0dXJuIGdldFBhc3N3b3JkKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fUFJPUEVSVFk6CisJCQkJcmV0dXJuIGdldFByb3BlcnR5KCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fTE9HSU5fVElNRU9VVDoKKwkJCQlyZXR1cm4gZ2V0TG9naW5UaW1lb3V0KCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fVFJBTlNBQ1RJT05BTDoKKwkJCQlyZXR1cm4gaXNUcmFuc2FjdGlvbmFsKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fSVNPTEFUSU9OX0xFVkVMOgorCQkJCXJldHVybiBnZXRJc29sYXRpb25MZXZlbCgpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX0lOSVRJQUxfUE9PTF9TSVpFOgorCQkJCXJldHVybiBnZXRJbml0aWFsUG9vbFNpemUoKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19NQVhfUE9PTF9TSVpFOgorCQkJCXJldHVybiBnZXRNYXhQb29sU2l6ZSgpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX01JTl9QT09MX1NJWkU6CisJCQkJcmV0dXJuIGdldE1pblBvb2xTaXplKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fTUFYX0lETEVfVElNRToKKwkJCQlyZXR1cm4gZ2V0TWF4SWRsZVRpbWUoKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19NQVhfU1RBVEVNRU5UUzoKKwkJCQlyZXR1cm4gZ2V0TWF4U3RhdGVtZW50cygpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX0lEOgorCQkJCXJldHVybiBnZXRJZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oKERlc2NyaXB0aW9uKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fTkFNRToKKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19DTEFTU19OQU1FOgorCQkJCXNldENsYXNzTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fU0VSVkVSX05BTUU6CisJCQkJc2V0U2VydmVyTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fUE9SVF9OVU1CRVI6CisJCQkJc2V0UG9ydE51bWJlcigoQmlnSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX0RBVEFCQVNFX05BTUU6CisJCQkJc2V0RGF0YWJhc2VOYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19VUkw6CisJCQkJc2V0VXJsKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19VU0VSOgorCQkJCXNldFVzZXIoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX1BBU1NXT1JEOgorCQkJCXNldFBhc3N3b3JkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19QUk9QRVJUWToKKwkJCQlnZXRQcm9wZXJ0eSgpLmNsZWFyKCk7CisJCQkJZ2V0UHJvcGVydHkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFByb3BlcnR5VHlwZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19MT0dJTl9USU1FT1VUOgorCQkJCXNldExvZ2luVGltZW91dCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX1RSQU5TQUNUSU9OQUw6CisJCQkJc2V0VHJhbnNhY3Rpb25hbCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX0lTT0xBVElPTl9MRVZFTDoKKwkJCQlzZXRJc29sYXRpb25MZXZlbCgoSXNvbGF0aW9uTGV2ZWxUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fSU5JVElBTF9QT09MX1NJWkU6CisJCQkJc2V0SW5pdGlhbFBvb2xTaXplKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fTUFYX1BPT0xfU0laRToKKwkJCQlzZXRNYXhQb29sU2l6ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX01JTl9QT09MX1NJWkU6CisJCQkJc2V0TWluUG9vbFNpemUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19NQVhfSURMRV9USU1FOgorCQkJCXNldE1heElkbGVUaW1lKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fTUFYX1NUQVRFTUVOVFM6CisJCQkJc2V0TWF4U3RhdGVtZW50cygoQmlnSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX0lEOgorCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oKERlc2NyaXB0aW9uKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19OQU1FOgorCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX0NMQVNTX05BTUU6CisJCQkJc2V0Q2xhc3NOYW1lKENMQVNTX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19TRVJWRVJfTkFNRToKKwkJCQlzZXRTZXJ2ZXJOYW1lKFNFUlZFUl9OQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fUE9SVF9OVU1CRVI6CisJCQkJc2V0UG9ydE51bWJlcihQT1JUX05VTUJFUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX0RBVEFCQVNFX05BTUU6CisJCQkJc2V0RGF0YWJhc2VOYW1lKERBVEFCQVNFX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19VUkw6CisJCQkJc2V0VXJsKFVSTF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX1VTRVI6CisJCQkJc2V0VXNlcihVU0VSX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fUEFTU1dPUkQ6CisJCQkJc2V0UGFzc3dvcmQoUEFTU1dPUkRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19QUk9QRVJUWToKKwkJCQlnZXRQcm9wZXJ0eSgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX0xPR0lOX1RJTUVPVVQ6CisJCQkJc2V0TG9naW5UaW1lb3V0KExPR0lOX1RJTUVPVVRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19UUkFOU0FDVElPTkFMOgorCQkJCXVuc2V0VHJhbnNhY3Rpb25hbCgpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19JU09MQVRJT05fTEVWRUw6CisJCQkJdW5zZXRJc29sYXRpb25MZXZlbCgpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19JTklUSUFMX1BPT0xfU0laRToKKwkJCQlzZXRJbml0aWFsUG9vbFNpemUoSU5JVElBTF9QT09MX1NJWkVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19NQVhfUE9PTF9TSVpFOgorCQkJCXNldE1heFBvb2xTaXplKE1BWF9QT09MX1NJWkVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19NSU5fUE9PTF9TSVpFOgorCQkJCXNldE1pblBvb2xTaXplKE1JTl9QT09MX1NJWkVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19NQVhfSURMRV9USU1FOgorCQkJCXNldE1heElkbGVUaW1lKE1BWF9JRExFX1RJTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19NQVhfU1RBVEVNRU5UUzoKKwkJCQlzZXRNYXhTdGF0ZW1lbnRzKE1BWF9TVEFURU1FTlRTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fSUQ6CisJCQkJc2V0SWQoSURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBkZXNjcmlwdGlvbiAhPSBudWxsOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX05BTUU6CisJCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19DTEFTU19OQU1FOgorCQkJCXJldHVybiBDTEFTU19OQU1FX0VERUZBVUxUID09IG51bGwgPyBjbGFzc05hbWUgIT0gbnVsbCA6ICFDTEFTU19OQU1FX0VERUZBVUxULmVxdWFscyhjbGFzc05hbWUpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX1NFUlZFUl9OQU1FOgorCQkJCXJldHVybiBTRVJWRVJfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2VydmVyTmFtZSAhPSBudWxsIDogIVNFUlZFUl9OQU1FX0VERUZBVUxULmVxdWFscyhzZXJ2ZXJOYW1lKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19QT1JUX05VTUJFUjoKKwkJCQlyZXR1cm4gUE9SVF9OVU1CRVJfRURFRkFVTFQgPT0gbnVsbCA/IHBvcnROdW1iZXIgIT0gbnVsbCA6ICFQT1JUX05VTUJFUl9FREVGQVVMVC5lcXVhbHMocG9ydE51bWJlcik7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fREFUQUJBU0VfTkFNRToKKwkJCQlyZXR1cm4gREFUQUJBU0VfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZGF0YWJhc2VOYW1lICE9IG51bGwgOiAhREFUQUJBU0VfTkFNRV9FREVGQVVMVC5lcXVhbHMoZGF0YWJhc2VOYW1lKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19VUkw6CisJCQkJcmV0dXJuIFVSTF9FREVGQVVMVCA9PSBudWxsID8gdXJsICE9IG51bGwgOiAhVVJMX0VERUZBVUxULmVxdWFscyh1cmwpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX1VTRVI6CisJCQkJcmV0dXJuIFVTRVJfRURFRkFVTFQgPT0gbnVsbCA/IHVzZXIgIT0gbnVsbCA6ICFVU0VSX0VERUZBVUxULmVxdWFscyh1c2VyKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19QQVNTV09SRDoKKwkJCQlyZXR1cm4gUEFTU1dPUkRfRURFRkFVTFQgPT0gbnVsbCA/IHBhc3N3b3JkICE9IG51bGwgOiAhUEFTU1dPUkRfRURFRkFVTFQuZXF1YWxzKHBhc3N3b3JkKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19QUk9QRVJUWToKKwkJCQlyZXR1cm4gcHJvcGVydHkgIT0gbnVsbCAmJiAhcHJvcGVydHkuaXNFbXB0eSgpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEVfX0xPR0lOX1RJTUVPVVQ6CisJCQkJcmV0dXJuIExPR0lOX1RJTUVPVVRfRURFRkFVTFQgPT0gbnVsbCA/IGxvZ2luVGltZW91dCAhPSBudWxsIDogIUxPR0lOX1RJTUVPVVRfRURFRkFVTFQuZXF1YWxzKGxvZ2luVGltZW91dCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fVFJBTlNBQ1RJT05BTDoKKwkJCQlyZXR1cm4gaXNTZXRUcmFuc2FjdGlvbmFsKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fSVNPTEFUSU9OX0xFVkVMOgorCQkJCXJldHVybiBpc1NldElzb2xhdGlvbkxldmVsKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fSU5JVElBTF9QT09MX1NJWkU6CisJCQkJcmV0dXJuIElOSVRJQUxfUE9PTF9TSVpFX0VERUZBVUxUID09IG51bGwgPyBpbml0aWFsUG9vbFNpemUgIT0gbnVsbCA6ICFJTklUSUFMX1BPT0xfU0laRV9FREVGQVVMVC5lcXVhbHMoaW5pdGlhbFBvb2xTaXplKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19NQVhfUE9PTF9TSVpFOgorCQkJCXJldHVybiBNQVhfUE9PTF9TSVpFX0VERUZBVUxUID09IG51bGwgPyBtYXhQb29sU2l6ZSAhPSBudWxsIDogIU1BWF9QT09MX1NJWkVfRURFRkFVTFQuZXF1YWxzKG1heFBvb2xTaXplKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19NSU5fUE9PTF9TSVpFOgorCQkJCXJldHVybiBNSU5fUE9PTF9TSVpFX0VERUZBVUxUID09IG51bGwgPyBtaW5Qb29sU2l6ZSAhPSBudWxsIDogIU1JTl9QT09MX1NJWkVfRURFRkFVTFQuZXF1YWxzKG1pblBvb2xTaXplKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19NQVhfSURMRV9USU1FOgorCQkJCXJldHVybiBNQVhfSURMRV9USU1FX0VERUZBVUxUID09IG51bGwgPyBtYXhJZGxlVGltZSAhPSBudWxsIDogIU1BWF9JRExFX1RJTUVfRURFRkFVTFQuZXF1YWxzKG1heElkbGVUaW1lKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFX19NQVhfU1RBVEVNRU5UUzoKKwkJCQlyZXR1cm4gTUFYX1NUQVRFTUVOVFNfRURFRkFVTFQgPT0gbnVsbCA/IG1heFN0YXRlbWVudHMgIT0gbnVsbCA6ICFNQVhfU1RBVEVNRU5UU19FREVGQVVMVC5lcXVhbHMobWF4U3RhdGVtZW50cyk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRV9fSUQ6CisJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKG5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNsYXNzTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChjbGFzc05hbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIHNlcnZlck5hbWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoc2VydmVyTmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgcG9ydE51bWJlcjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChwb3J0TnVtYmVyKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBkYXRhYmFzZU5hbWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZGF0YWJhc2VOYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB1cmw6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQodXJsKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB1c2VyOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHVzZXIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBhc3N3b3JkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHBhc3N3b3JkKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBsb2dpblRpbWVvdXQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobG9naW5UaW1lb3V0KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0cmFuc2FjdGlvbmFsOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodHJhbnNhY3Rpb25hbEVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25hbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgaXNvbGF0aW9uTGV2ZWw6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChpc29sYXRpb25MZXZlbEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNvbGF0aW9uTGV2ZWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIGluaXRpYWxQb29sU2l6ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpbml0aWFsUG9vbFNpemUpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1heFBvb2xTaXplOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKG1heFBvb2xTaXplKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtaW5Qb29sU2l6ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtaW5Qb29sU2l6ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbWF4SWRsZVRpbWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobWF4SWRsZVRpbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1heFN0YXRlbWVudHM6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobWF4U3RhdGVtZW50cyk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9EYXRhU291cmNlVHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25JbXBsLmphdmEKaW5kZXggZTc4MDU2ZS4uYTMxNzg5NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25JbXBsLmphdmEKQEAgLTkwLDYgKzkwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUSU9OOwogCX0KQEAgLTE0MSw2ICsxNDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFOgpAQCAtMTU2LDYgKzE1OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFOgpAQCAtMTczLDYgKzE3Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFOgpAQCAtMTkwLDYgKzE5NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuREVTQ1JJUFRJT05fX1ZBTFVFOgpAQCAtMjA1LDYgKzIxMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9EaXNwbGF5TmFtZUltcGwuamF2YQppbmRleCA2MGMwZWIzLi5lNzA5MzI1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9EaXNwbGF5TmFtZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9EaXNwbGF5TmFtZUltcGwuamF2YQpAQCAtOTAsNiArOTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuRElTUExBWV9OQU1FOwogCX0KQEAgLTE0MSw2ICsxNDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FX19WQUxVRToKQEAgLTE1Niw2ICsxNTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRJU1BMQVlfTkFNRV9fVkFMVUU6CkBAIC0xNzMsNiArMTc2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5ESVNQTEFZX05BTUVfX1ZBTFVFOgpAQCAtMTkwLDYgKzE5NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FX19WQUxVRToKQEAgLTIwNSw2ICsyMTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VqYkxvY2FsUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRWpiTG9jYWxSZWZJbXBsLmphdmEKaW5kZXggNjhmYzQ4MC4uNTMzYTEzYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRWpiTG9jYWxSZWZJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRWpiTG9jYWxSZWZJbXBsLmphdmEKQEAgLTQ5LDYgKzQ5LDcgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJMb2NhbFJlZkltcGwjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYkxvY2FsUmVmSW1wbCNnZXRNYXBwZWROYW1lIDxlbT5NYXBwZWQgTmFtZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRWpiTG9jYWxSZWZJbXBsI2dldEluamVjdGlvblRhcmdldHMgPGVtPkluamVjdGlvbiBUYXJnZXRzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJMb2NhbFJlZkltcGwjZ2V0TG9va3VwTmFtZSA8ZW0+TG9va3VwIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYkxvY2FsUmVmSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgogICogPC91bD4KICAqIDwvcD4KQEAgLTY0LDcgKzY1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZOYW1lKCkgPGVtPkVqYiBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTEzLDcgKzExNCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWpiUmVmVHlwZUVTZXQgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBlamJSZWZUeXBlRVNldDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbEhvbWUoKSA8ZW0+TG9jYWwgSG9tZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMjAzLDcgKzIwNCwyNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmplY3Rpb25UYXJnZXRzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8SW5qZWN0aW9uVGFyZ2V0PiBpbmplY3Rpb25UYXJnZXRzOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvb2t1cE5hbWUoKSA8ZW0+TG9va3VwIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExvb2t1cE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPT0tVUF9OQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvb2t1cE5hbWUoKSA8ZW0+TG9va3VwIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExvb2t1cE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbG9va3VwTmFtZSA9IExPT0tVUF9OQU1FX0VERUZBVUxUOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0yMzksNiArMjYwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkVKQl9MT0NBTF9SRUY7CiAJfQpAQCAtMjQ4LDkgKzI3MCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtNDExLDkgKzQzMyw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEluamVjdGlvblRhcmdldHMoKSB7CisJcHVibGljIExpc3Q8SW5qZWN0aW9uVGFyZ2V0PiBnZXRJbmplY3Rpb25UYXJnZXRzKCkgewogCQlpZiAoaW5qZWN0aW9uVGFyZ2V0cyA9PSBudWxsKSB7Ci0JCQlpbmplY3Rpb25UYXJnZXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEluamVjdGlvblRhcmdldC5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7CisJCQlpbmplY3Rpb25UYXJnZXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEluamVjdGlvblRhcmdldD4oSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKIAkJfQogCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0czsKIAl9CkBAIC00MjMsNiArNDQ1LDI3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TG9va3VwTmFtZSgpIHsKKwkJcmV0dXJuIGxvb2t1cE5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TG9va3VwTmFtZShTdHJpbmcgbmV3TG9va3VwTmFtZSkgeworCQlTdHJpbmcgb2xkTG9va3VwTmFtZSA9IGxvb2t1cE5hbWU7CisJCWxvb2t1cE5hbWUgPSBuZXdMb29rdXBOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPT0tVUF9OQU1FLCBvbGRMb29rdXBOYW1lLCBsb29rdXBOYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKIAkJcmV0dXJuIGlkOwogCX0KQEAgLTQ0NCwxMiArNDg3LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluamVjdGlvblRhcmdldHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTQ1OSw2ICs1MDMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fREVTQ1JJUFRJT05TOgpAQCAtNDc3LDYgKzUyMiw4IEBACiAJCQkJcmV0dXJuIGdldE1hcHBlZE5hbWUoKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKIAkJCQlyZXR1cm4gZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPT0tVUF9OQU1FOgorCQkJCXJldHVybiBnZXRMb29rdXBOYW1lKCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fSUQ6CiAJCQkJcmV0dXJuIGdldElkKCk7CiAJCX0KQEAgLTQ4OCwxMSArNTM1LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0VKQl9SRUZfTkFNRToKIAkJCQlzZXRFamJSZWZOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtNTE0LDcgKzU2MywxMCBAQAogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKIAkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJbmplY3Rpb25UYXJnZXQ+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9PS1VQX05BTUU6CisJCQkJc2V0TG9va3VwTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC01MjgsNiArNTgwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTlM6CkBAIC01NTQsNiArNjA3LDkgQEAKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKIAkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9PS1VQX05BTUU6CisJCQkJc2V0TG9va3VwTmFtZShMT09LVVBfTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0lEOgogCQkJCXNldElkKElEX0VERUZBVUxUKTsKIAkJCQlyZXR1cm47CkBAIC01NjYsNiArNjIyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGX19ERVNDUklQVElPTlM6CkBAIC01ODQsNiArNjQxLDggQEAKIAkJCQlyZXR1cm4gTUFQUEVEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHBlZE5hbWUgIT0gbnVsbCA6ICFNQVBQRURfTkFNRV9FREVGQVVMVC5lcXVhbHMobWFwcGVkTmFtZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6CiAJCQkJcmV0dXJuIGluamVjdGlvblRhcmdldHMgIT0gbnVsbCAmJiAhaW5qZWN0aW9uVGFyZ2V0cy5pc0VtcHR5KCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9PS1VQX05BTUU6CisJCQkJcmV0dXJuIExPT0tVUF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBsb29rdXBOYW1lICE9IG51bGwgOiAhTE9PS1VQX05BTUVfRURFRkFVTFQuZXF1YWxzKGxvb2t1cE5hbWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0lEOgogCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwogCQl9CkBAIC01OTUsNiArNjU0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCkBAIC02MTEsNiArNjcxLDggQEAKIAkJcmVzdWx0LmFwcGVuZChlamJMaW5rKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG1hcHBlZE5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGxvb2t1cE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobG9va3VwTmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoaWQpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9FamJSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9FamJSZWZJbXBsLmphdmEKaW5kZXggZTkwOGU5My4uMWM2MzEwOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRWpiUmVmSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VqYlJlZkltcGwuamF2YQpAQCAtNDksNiArNDksNyBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwjZ2V0RWpiTGluayA8ZW0+RWpiIExpbms8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwjZ2V0TG9va3VwTmFtZSA8ZW0+TG9va3VwIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVqYlJlZkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CkBAIC02NCw3ICs2NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVmTmFtZSgpIDxlbT5FamIgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTExMyw3ICsxMTQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVqYlJlZlR5cGVFU2V0ID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gZWpiUmVmVHlwZUVTZXQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG9tZSgpIDxlbT5Ib21lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0yMDMsNyArMjA0LDI3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGluamVjdGlvblRhcmdldHMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxJbmplY3Rpb25UYXJnZXQ+IGluamVjdGlvblRhcmdldHM7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9va3VwTmFtZSgpIDxlbT5Mb29rdXAgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TG9va3VwTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9PS1VQX05BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9va3VwTmFtZSgpIDxlbT5Mb29rdXAgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TG9va3VwTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBsb29rdXBOYW1lID0gTE9PS1VQX05BTUVfRURFRkFVTFQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTIzOSw2ICsyNjAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuRUpCX1JFRjsKIAl9CkBAIC0yNDgsOSArMjcwLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgeworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CiAJCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIGRlc2NyaXB0aW9uczsKIAl9CkBAIC00MTEsOSArNDMzLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIHsKKwlwdWJsaWMgTGlzdDxJbmplY3Rpb25UYXJnZXQ+IGdldEluamVjdGlvblRhcmdldHMoKSB7CiAJCWlmIChpbmplY3Rpb25UYXJnZXRzID09IG51bGwpIHsKLQkJCWluamVjdGlvblRhcmdldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKKwkJCWluamVjdGlvblRhcmdldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SW5qZWN0aW9uVGFyZ2V0PihJbmplY3Rpb25UYXJnZXQuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOwogCQl9CiAJCXJldHVybiBpbmplY3Rpb25UYXJnZXRzOwogCX0KQEAgLTQyMyw2ICs0NDUsMjcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIFN0cmluZyBnZXRMb29rdXBOYW1lKCkgeworCQlyZXR1cm4gbG9va3VwTmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMb29rdXBOYW1lKFN0cmluZyBuZXdMb29rdXBOYW1lKSB7CisJCVN0cmluZyBvbGRMb29rdXBOYW1lID0gbG9va3VwTmFtZTsKKwkJbG9va3VwTmFtZSA9IG5ld0xvb2t1cE5hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fTE9PS1VQX05BTUUsIG9sZExvb2t1cE5hbWUsIGxvb2t1cE5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldElkKCkgewogCQlyZXR1cm4gaWQ7CiAJfQpAQCAtNDQ0LDEyICs0ODcsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJbmplY3Rpb25UYXJnZXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtNDU5LDYgKzUwMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTlM6CkBAIC00NzcsNiArNTIyLDggQEAKIAkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCXJldHVybiBnZXRJbmplY3Rpb25UYXJnZXRzKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fTE9PS1VQX05BTUU6CisJCQkJcmV0dXJuIGdldExvb2t1cE5hbWUoKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19JRDoKIAkJCQlyZXR1cm4gZ2V0SWQoKTsKIAkJfQpAQCAtNDg4LDExICs1MzUsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fRUpCX1JFRl9OQU1FOgogCQkJCXNldEVqYlJlZk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC01MTQsNyArNTYzLDEwIEBACiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEluamVjdGlvblRhcmdldD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19MT09LVVBfTkFNRToKKwkJCQlzZXRMb29rdXBOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19JRDoKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTUyOCw2ICs1ODAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OUzoKQEAgLTU1NCw2ICs2MDcsOSBAQAogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19MT09LVVBfTkFNRToKKwkJCQlzZXRMb29rdXBOYW1lKExPT0tVUF9OQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSUQ6CiAJCQkJc2V0SWQoSURfRURFRkFVTFQpOwogCQkJCXJldHVybjsKQEAgLTU2Niw2ICs2MjIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfX0RFU0NSSVBUSU9OUzoKQEAgLTU4NCw2ICs2NDEsOCBAQAogCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKIAkJCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0cyAhPSBudWxsICYmICFpbmplY3Rpb25UYXJnZXRzLmlzRW1wdHkoKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfUkVGX19MT09LVVBfTkFNRToKKwkJCQlyZXR1cm4gTE9PS1VQX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGxvb2t1cE5hbWUgIT0gbnVsbCA6ICFMT09LVVBfTkFNRV9FREVGQVVMVC5lcXVhbHMobG9va3VwTmFtZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9fSUQ6CiAJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CiAJCX0KQEAgLTU5NSw2ICs2NTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKQEAgLTYxMSw2ICs2NzEsOCBAQAogCQlyZXN1bHQuYXBwZW5kKGVqYkxpbmspOwogCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHBlZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobWFwcGVkTmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbG9va3VwTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChsb29rdXBOYW1lKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VtcHR5VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VtcHR5VHlwZUltcGwuamF2YQppbmRleCA3OTRhODczLi40ZDY3ZWRjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9FbXB0eVR5cGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRW1wdHlUeXBlSW1wbC5qYXZhCkBAIC02OSw2ICs2OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5FTVBUWV9UWVBFOwogCX0KQEAgLTk5LDYgKzEwMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTVBUWV9UWVBFX19JRDoKQEAgLTExMiw2ICsxMTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVNUFRZX1RZUEVfX0lEOgpAQCAtMTI2LDYgKzEyOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRU1QVFlfVFlQRV9fSUQ6CkBAIC0xNDAsNiArMTQ0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTVBUWV9UWVBFX19JRDoKQEAgLTE1Myw2ICsxNTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0VudkVudHJ5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRW52RW50cnlJbXBsLmphdmEKaW5kZXggMGI0MjU0Mi4uZDMxZjJiMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRW52RW50cnlJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvRW52RW50cnlJbXBsLmphdmEKQEAgLTQ3LDYgKzQ3LDcgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbnZFbnRyeUltcGwjZ2V0RW52RW50cnlWYWx1ZSA8ZW0+RW52IEVudHJ5IFZhbHVlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbnZFbnRyeUltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkVudkVudHJ5SW1wbCNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW52RW50cnlJbXBsI2dldExvb2t1cE5hbWUgPGVtPkxvb2t1cCBOYW1lPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FbnZFbnRyeUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CkBAIC02Miw3ICs2Myw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52RW50cnlOYW1lKCkgPGVtPkVudiBFbnRyeSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC05Miw3ICs5Myw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgRU5WX0VOVFJZX1RZUEVfRURFRkFVTFQgPSBFbnZFbnRyeVR5cGUuSkFWQV9MQU5HX0JPT0xFQU5fTElURVJBTDsKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTlZfRU5UUllfVFlQRV9FREVGQVVMVCA9IG51bGw7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnZFbnRyeVR5cGUoKSA8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTEwMiwxNiArMTAzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRW52RW50cnlUeXBlIGVudkVudHJ5VHlwZSA9IEVOVl9FTlRSWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFbnYgRW50cnkgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW52RW50cnlUeXBlRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBTdHJpbmcgZW52RW50cnlUeXBlID0gRU5WX0VOVFJZX1RZUEVfRURFRkFVTFQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52RW50cnlWYWx1ZSgpIDxlbT5FbnYgRW50cnkgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTE2MSw3ICsxNTMsMjcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5qZWN0aW9uVGFyZ2V0cyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEluamVjdGlvblRhcmdldD4gaW5qZWN0aW9uVGFyZ2V0czsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb29rdXBOYW1lKCkgPGVtPkxvb2t1cCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMb29rdXBOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT09LVVBfTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb29rdXBOYW1lKCkgPGVtPkxvb2t1cCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMb29rdXBOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGxvb2t1cE5hbWUgPSBMT09LVVBfTkFNRV9FREVGQVVMVDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTk3LDYgKzIwOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5FTlZfRU5UUlk7CiAJfQpAQCAtMjA2LDkgKzIxOSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TKTsKIAkJfQogCQlyZXR1cm4gZGVzY3JpcHRpb25zOwogCX0KQEAgLTIzOSw3ICsyNTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRW52RW50cnlUeXBlIGdldEVudkVudHJ5VHlwZSgpIHsKKwlwdWJsaWMgU3RyaW5nIGdldEVudkVudHJ5VHlwZSgpIHsKIAkJcmV0dXJuIGVudkVudHJ5VHlwZTsKIAl9CiAKQEAgLTI0OCwzNiArMjYxLDExIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudkVudHJ5VHlwZShFbnZFbnRyeVR5cGUgbmV3RW52RW50cnlUeXBlKSB7Ci0JCUVudkVudHJ5VHlwZSBvbGRFbnZFbnRyeVR5cGUgPSBlbnZFbnRyeVR5cGU7Ci0JCWVudkVudHJ5VHlwZSA9IG5ld0VudkVudHJ5VHlwZSA9PSBudWxsID8gRU5WX0VOVFJZX1RZUEVfRURFRkFVTFQgOiBuZXdFbnZFbnRyeVR5cGU7Ci0JCWJvb2xlYW4gb2xkRW52RW50cnlUeXBlRVNldCA9IGVudkVudHJ5VHlwZUVTZXQ7Ci0JCWVudkVudHJ5VHlwZUVTZXQgPSB0cnVlOworCXB1YmxpYyB2b2lkIHNldEVudkVudHJ5VHlwZShTdHJpbmcgbmV3RW52RW50cnlUeXBlKSB7CisJCVN0cmluZyBvbGRFbnZFbnRyeVR5cGUgPSBlbnZFbnRyeVR5cGU7CisJCWVudkVudHJ5VHlwZSA9IG5ld0VudkVudHJ5VHlwZTsKIAkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9UWVBFLCBvbGRFbnZFbnRyeVR5cGUsIGVudkVudHJ5VHlwZSwgIW9sZEVudkVudHJ5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVudkVudHJ5VHlwZSgpIHsKLQkJRW52RW50cnlUeXBlIG9sZEVudkVudHJ5VHlwZSA9IGVudkVudHJ5VHlwZTsKLQkJYm9vbGVhbiBvbGRFbnZFbnRyeVR5cGVFU2V0ID0gZW52RW50cnlUeXBlRVNldDsKLQkJZW52RW50cnlUeXBlID0gRU5WX0VOVFJZX1RZUEVfRURFRkFVTFQ7Ci0JCWVudkVudHJ5VHlwZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX1RZUEUsIG9sZEVudkVudHJ5VHlwZSwgRU5WX0VOVFJZX1RZUEVfRURFRkFVTFQsIG9sZEVudkVudHJ5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEVudkVudHJ5VHlwZSgpIHsKLQkJcmV0dXJuIGVudkVudHJ5VHlwZUVTZXQ7CisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX1RZUEUsIG9sZEVudkVudHJ5VHlwZSwgZW52RW50cnlUeXBlKSk7CiAJfQogCiAJLyoqCkBAIC0zMjcsOSArMzE1LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIHsKKwlwdWJsaWMgTGlzdDxJbmplY3Rpb25UYXJnZXQ+IGdldEluamVjdGlvblRhcmdldHMoKSB7CiAJCWlmIChpbmplY3Rpb25UYXJnZXRzID09IG51bGwpIHsKLQkJCWluamVjdGlvblRhcmdldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fSU5KRUNUSU9OX1RBUkdFVFMpOworCQkJaW5qZWN0aW9uVGFyZ2V0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJbmplY3Rpb25UYXJnZXQ+KEluamVjdGlvblRhcmdldC5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0lOSkVDVElPTl9UQVJHRVRTKTsKIAkJfQogCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0czsKIAl9CkBAIC0zMzksNiArMzI3LDI3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TG9va3VwTmFtZSgpIHsKKwkJcmV0dXJuIGxvb2t1cE5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TG9va3VwTmFtZShTdHJpbmcgbmV3TG9va3VwTmFtZSkgeworCQlTdHJpbmcgb2xkTG9va3VwTmFtZSA9IGxvb2t1cE5hbWU7CisJCWxvb2t1cE5hbWUgPSBuZXdMb29rdXBOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fTE9PS1VQX05BTUUsIG9sZExvb2t1cE5hbWUsIGxvb2t1cE5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldElkKCkgewogCQlyZXR1cm4gaWQ7CiAJfQpAQCAtMzYwLDEyICszNjksMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluamVjdGlvblRhcmdldHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTM3NSw2ICszODUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTlM6CkBAIC0zODksNiArNDAwLDggQEAKIAkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fSU5KRUNUSU9OX1RBUkdFVFM6CiAJCQkJcmV0dXJuIGdldEluamVjdGlvblRhcmdldHMoKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0xPT0tVUF9OQU1FOgorCQkJCXJldHVybiBnZXRMb29rdXBOYW1lKCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19JRDoKIAkJCQlyZXR1cm4gZ2V0SWQoKTsKIAkJfQpAQCAtNDAwLDE3ICs0MTMsMTkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9OQU1FOgogCQkJCXNldEVudkVudHJ5TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19FTlZfRU5UUllfVFlQRToKLQkJCQlzZXRFbnZFbnRyeVR5cGUoKEVudkVudHJ5VHlwZSluZXdWYWx1ZSk7CisJCQkJc2V0RW52RW50cnlUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9WQUxVRToKIAkJCQlzZXRFbnZFbnRyeVZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtNDIwLDcgKzQzNSwxMCBAQAogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEluamVjdGlvblRhcmdldD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0xPT0tVUF9OQU1FOgorCQkJCXNldExvb2t1cE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC00MzQsNiArNDUyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUzoKQEAgLTQ0Myw3ICs0NjIsNyBAQAogCQkJCXNldEVudkVudHJ5TmFtZShFTlZfRU5UUllfTkFNRV9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX1RZUEU6Ci0JCQkJdW5zZXRFbnZFbnRyeVR5cGUoKTsKKwkJCQlzZXRFbnZFbnRyeVR5cGUoRU5WX0VOVFJZX1RZUEVfRURFRkFVTFQpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9WQUxVRToKIAkJCQlzZXRFbnZFbnRyeVZhbHVlKEVOVl9FTlRSWV9WQUxVRV9FREVGQVVMVCk7CkBAIC00NTQsNiArNDczLDkgQEAKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0xPT0tVUF9OQU1FOgorCQkJCXNldExvb2t1cE5hbWUoTE9PS1VQX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0lEOgogCQkJCXNldElkKElEX0VERUZBVUxUKTsKIAkJCQlyZXR1cm47CkBAIC00NjYsNiArNDg4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OUzoKQEAgLTQ3MywxMyArNDk2LDE1IEBACiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX19FTlZfRU5UUllfTkFNRToKIAkJCQlyZXR1cm4gRU5WX0VOVFJZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGVudkVudHJ5TmFtZSAhPSBudWxsIDogIUVOVl9FTlRSWV9OQU1FX0VERUZBVUxULmVxdWFscyhlbnZFbnRyeU5hbWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fRU5WX0VOVFJZX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0RW52RW50cnlUeXBlKCk7CisJCQkJcmV0dXJuIEVOVl9FTlRSWV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBlbnZFbnRyeVR5cGUgIT0gbnVsbCA6ICFFTlZfRU5UUllfVFlQRV9FREVGQVVMVC5lcXVhbHMoZW52RW50cnlUeXBlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0VOVl9FTlRSWV9WQUxVRToKIAkJCQlyZXR1cm4gRU5WX0VOVFJZX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBlbnZFbnRyeVZhbHVlICE9IG51bGwgOiAhRU5WX0VOVFJZX1ZBTFVFX0VERUZBVUxULmVxdWFscyhlbnZFbnRyeVZhbHVlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX01BUFBFRF9OQU1FOgogCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCXJldHVybiBpbmplY3Rpb25UYXJnZXRzICE9IG51bGwgJiYgIWluamVjdGlvblRhcmdldHMuaXNFbXB0eSgpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fTE9PS1VQX05BTUU6CisJCQkJcmV0dXJuIExPT0tVUF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBsb29rdXBOYW1lICE9IG51bGwgOiAhTE9PS1VQX05BTUVfRURFRkFVTFQuZXF1YWxzKGxvb2t1cE5hbWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9fSUQ6CiAJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CiAJCX0KQEAgLTQ5MSw2ICs1MTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKQEAgLTQ5OCwxNSArNTI0LDQyIEBACiAJCXJlc3VsdC5hcHBlbmQoIiAoZW52RW50cnlOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGVudkVudHJ5TmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgZW52RW50cnlUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZW52RW50cnlUeXBlRVNldCkgcmVzdWx0LmFwcGVuZChlbnZFbnRyeVR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGVudkVudHJ5VHlwZSk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgZW52RW50cnlWYWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChlbnZFbnRyeVZhbHVlKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG1hcHBlZE5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGxvb2t1cE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobG9va3VwTmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoaWQpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CiAKKwkvKioKKwkgKiBUaGlzIGlzIHByb3ZpZGVkIGZvciBKYXZhIEVFIDUgbW9kZWwgZXF1aXZhbGVuY2UKKwkgKiBAcGFyYW0gbmV3RW52RW50cnlUeXBlCisJICovCisJcHVibGljIHZvaWQgc2V0RW52RW50cnlUeXBlKEVudkVudHJ5VHlwZSBuZXdFbnZFbnRyeVR5cGUpIHsKKwkJaWYgKG5ld0VudkVudHJ5VHlwZSAhPSBudWxsKQorCQl7CisJCQlzZXRFbnZFbnRyeVR5cGUobmV3RW52RW50cnlUeXBlLmdldExpdGVyYWwoKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzZXRFbnZFbnRyeVR5cGUoKFN0cmluZyludWxsKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHVuc2V0RW52RW50cnlUeXBlKCkKKwl7CisJCXNldEVudkVudHJ5VHlwZSgoU3RyaW5nKW51bGwpOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzU2V0RW52RW50cnlUeXBlKCkKKwl7CisJCXJldHVybiAoZW52RW50cnlUeXBlICE9IG51bGwpOworCX0KKwogfSAvL0VudkVudHJ5SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0ljb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9JY29uSW1wbC5qYXZhCmluZGV4IDAzMDJlYWQuLjYwYzFiZDQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0ljb25JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvSWNvbkltcGwuamF2YQpAQCAtMTMyLDYgKzEzMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5JQ09OOwogCX0KQEAgLTIyNSw2ICsyMjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuSUNPTl9fU01BTExfSUNPTjoKQEAgLTI0NCw2ICsyNDYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT05fX1NNQUxMX0lDT046CkBAIC0yNjcsNiArMjcwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5JQ09OX19TTUFMTF9JQ09OOgpAQCAtMjkwLDYgKzI5NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuSUNPTl9fU01BTExfSUNPTjoKQEAgLTMwOSw2ICszMTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0luamVjdGlvblRhcmdldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0luamVjdGlvblRhcmdldEltcGwuamF2YQppbmRleCAwMTdmZjQ2Li42ZmIwYzAwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9JbmplY3Rpb25UYXJnZXRJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvSW5qZWN0aW9uVGFyZ2V0SW1wbC5qYXZhCkBAIC05MCw2ICs5MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5JTkpFQ1RJT05fVEFSR0VUOwogCX0KQEAgLTE0MSw2ICsxNDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuSU5KRUNUSU9OX1RBUkdFVF9fSU5KRUNUSU9OX1RBUkdFVF9DTEFTUzoKQEAgLTE1Niw2ICsxNTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklOSkVDVElPTl9UQVJHRVRfX0lOSkVDVElPTl9UQVJHRVRfQ0xBU1M6CkBAIC0xNzMsNiArMTc2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5JTkpFQ1RJT05fVEFSR0VUX19JTkpFQ1RJT05fVEFSR0VUX0NMQVNTOgpAQCAtMTkwLDYgKzE5NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuSU5KRUNUSU9OX1RBUkdFVF9fSU5KRUNUSU9OX1RBUkdFVF9DTEFTUzoKQEAgLTIwNSw2ICsyMTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0phdmFlZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9KYXZhZWVGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDBkNjNkMzIuLmNjZTMyNzAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0phdmFlZUZhY3RvcnlJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvSmF2YWVlRmFjdG9yeUltcGwuamF2YQpAQCAtMTEsNyArMTEsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiAKQEAgLTc0LDggKzczLDExIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CiAJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuQUREUkVTU0lOR19UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQWRkcmVzc2luZ1R5cGUoKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5EQVRBX1NPVVJDRV9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGF0YVNvdXJjZVR5cGUoKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlc2NyaXB0aW9uKCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGlzcGxheU5hbWUoKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5FSkJfTE9DQUxfUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRWpiTG9jYWxSZWYoKTsKQEAgLTk1LDYgKzk3LDcgQEAKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QUk9QRVJUWV9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvcGVydHlUeXBlKCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJlc291cmNlRW52UmVmKCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVzb3VyY2VSZWYoKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNQRUNUX0JJTkRJTkdfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJlc3BlY3RCaW5kaW5nVHlwZSgpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJ1bkFzKCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlY3VyaXR5Um9sZSgpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlU2VjdXJpdHlSb2xlUmVmKCk7CkBAIC0xMTMsMTIgKzExNiwxNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewogCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkFERFJFU1NJTkdfUkVTUE9OU0VTX1RZUEU6CisJCQkJcmV0dXJuIGNyZWF0ZUFkZHJlc3NpbmdSZXNwb25zZXNUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9UWVBFOgogCQkJCXJldHVybiBjcmVhdGVFamJSZWZUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVudkVudHJ5VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkdFTkVSSUNfQk9PTEVBTl9UWVBFOgorCQkJCXJldHVybiBjcmVhdGVHZW5lcmljQm9vbGVhblR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5JU09MQVRJT05fTEVWRUxfVFlQRToKKwkJCQlyZXR1cm4gY3JlYXRlSXNvbGF0aW9uTGV2ZWxUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFOgogCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1RZUEU6CkBAIC0xMjcsNiArMTM1LDggQEAKIAkJCQlyZXR1cm4gY3JlYXRlUmVzQXV0aFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNfU0hBUklOR19TQ09QRV9UWVBFOgogCQkJCXJldHVybiBjcmVhdGVSZXNTaGFyaW5nU2NvcGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuQUREUkVTU0lOR19SRVNQT05TRVNfVFlQRV9PQkpFQ1Q6CisJCQkJcmV0dXJuIGNyZWF0ZUFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuREVXRVlfVkVSU0lPTl9UWVBFOgogCQkJCXJldHVybiBjcmVhdGVEZXdleVZlcnNpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xJTks6CkBAIC0xMzUsMTYgKzE0NSwyMiBAQAogCQkJCXJldHVybiBjcmVhdGVFamJSZWZOYW1lVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfVFlQRV9PQkpFQ1Q6CiAJCQkJcmV0dXJuIGNyZWF0ZUVqYlJlZlR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNyZWF0ZUVudkVudHJ5VHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9UWVBFOgorCQkJCXJldHVybiBjcmVhdGVFbnZFbnRyeVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5GVUxMWV9RVUFMSUZJRURfQ0xBU1NfVFlQRToKIAkJCQlyZXR1cm4gY3JlYXRlRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5HRU5FUklDX0JPT0xFQU5fVFlQRV9PQkpFQ1Q6CisJCQkJcmV0dXJuIGNyZWF0ZUdlbmVyaWNCb29sZWFuVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkhPTUU6CiAJCQkJcmV0dXJuIGNyZWF0ZUhvbWVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5JU09MQVRJT05fTEVWRUxfVFlQRV9PQkpFQ1Q6CisJCQkJcmV0dXJuIGNyZWF0ZUlzb2xhdGlvbkxldmVsVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkpBVkFfSURFTlRJRklFUjoKIAkJCQlyZXR1cm4gY3JlYXRlSmF2YUlkZW50aWZpZXJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5KQVZBX1RZUEU6CiAJCQkJcmV0dXJuIGNyZWF0ZUphdmFUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuSkRCQ19VUkxfVFlQRToKKwkJCQlyZXR1cm4gY3JlYXRlSmRiY1VybFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5KTkRJX05BTUU6CiAJCQkJcmV0dXJuIGNyZWF0ZUpORElOYW1lRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTE9DQUw6CkBAIC0xNjEsNiArMTc3LDE0IEBACiAJCQkJcmV0dXJuIGNyZWF0ZVBhdGhUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX09CSkVDVDoKIAkJCQlyZXR1cm4gY3JlYXRlUGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1RPQ09MX0JJTkRJTkdfTElTVF9UWVBFOgorCQkJCXJldHVybiBjcmVhdGVQcm90b2NvbEJpbmRpbmdMaXN0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1RPQ09MX0JJTkRJTkdfVFlQRToKKwkJCQlyZXR1cm4gY3JlYXRlUHJvdG9jb2xCaW5kaW5nVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1RPQ09MX1VSSV9BTElBU19UWVBFOgorCQkJCXJldHVybiBjcmVhdGVQcm90b2NvbFVSSUFsaWFzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlFOQU1FX1BBVFRFUk46CisJCQkJcmV0dXJuIGNyZWF0ZVFuYW1lUGF0dGVybkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFTU9URToKIAkJCQlyZXR1cm4gY3JlYXRlUmVtb3RlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTX0FVVEhfVFlQRV9PQkpFQ1Q6CkBAIC0xNjksMTQgKzE5Myw2IEBACiAJCQkJcmV0dXJuIGNyZWF0ZVJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5ST0xFX05BTUU6CiAJCQkJcmV0dXJuIGNyZWF0ZVJvbGVOYW1lRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19MSVNUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9QUk9UT0NPTF9VUklfQUxJQVNfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUU5BTUVfUEFUVEVSTjoKLQkJCQlyZXR1cm4gY3JlYXRlU2VydmljZVJlZlFuYW1lUGF0dGVybkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlRSVUVfRkFMU0VfVFlQRToKIAkJCQlyZXR1cm4gY3JlYXRlVHJ1ZUZhbHNlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlRSVUVfRkFMU0VfVFlQRV9PQkpFQ1Q6CkBAIC0xOTEsMTIgKzIwNywxNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewogCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkFERFJFU1NJTkdfUkVTUE9OU0VTX1RZUEU6CisJCQkJcmV0dXJuIGNvbnZlcnRBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9UWVBFOgogCQkJCXJldHVybiBjb252ZXJ0RWpiUmVmVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFbnZFbnRyeVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkdFTkVSSUNfQk9PTEVBTl9UWVBFOgorCQkJCXJldHVybiBjb252ZXJ0R2VuZXJpY0Jvb2xlYW5UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5JU09MQVRJT05fTEVWRUxfVFlQRToKKwkJCQlyZXR1cm4gY29udmVydElzb2xhdGlvbkxldmVsVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFOgogCQkJCXJldHVybiBjb252ZXJ0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1RZUEU6CkBAIC0yMDUsNiArMjI2LDggQEAKIAkJCQlyZXR1cm4gY29udmVydFJlc0F1dGhUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNfU0hBUklOR19TQ09QRV9UWVBFOgogCQkJCXJldHVybiBjb252ZXJ0UmVzU2hhcmluZ1Njb3BlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuQUREUkVTU0lOR19SRVNQT05TRVNfVFlQRV9PQkpFQ1Q6CisJCQkJcmV0dXJuIGNvbnZlcnRBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuREVXRVlfVkVSU0lPTl9UWVBFOgogCQkJCXJldHVybiBjb252ZXJ0RGV3ZXlWZXJzaW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX0xJTks6CkBAIC0yMTMsMTYgKzIzNiwyMiBAQAogCQkJCXJldHVybiBjb252ZXJ0RWpiUmVmTmFtZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfVFlQRV9PQkpFQ1Q6CiAJCQkJcmV0dXJuIGNvbnZlcnRFamJSZWZUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5FTlZfRU5UUllfVFlQRV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFbnZFbnRyeVR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVOVl9FTlRSWV9UWVBFOgorCQkJCXJldHVybiBjb252ZXJ0RW52RW50cnlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5GVUxMWV9RVUFMSUZJRURfQ0xBU1NfVFlQRToKIAkJCQlyZXR1cm4gY29udmVydEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5HRU5FUklDX0JPT0xFQU5fVFlQRV9PQkpFQ1Q6CisJCQkJcmV0dXJuIGNvbnZlcnRHZW5lcmljQm9vbGVhblR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkhPTUU6CiAJCQkJcmV0dXJuIGNvbnZlcnRIb21lVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5JU09MQVRJT05fTEVWRUxfVFlQRV9PQkpFQ1Q6CisJCQkJcmV0dXJuIGNvbnZlcnRJc29sYXRpb25MZXZlbFR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkpBVkFfSURFTlRJRklFUjoKIAkJCQlyZXR1cm4gY29udmVydEphdmFJZGVudGlmaWVyVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5KQVZBX1RZUEU6CiAJCQkJcmV0dXJuIGNvbnZlcnRKYXZhVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuSkRCQ19VUkxfVFlQRToKKwkJCQlyZXR1cm4gY29udmVydEpkYmNVcmxUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5KTkRJX05BTUU6CiAJCQkJcmV0dXJuIGNvbnZlcnRKTkRJTmFtZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTE9DQUw6CkBAIC0yMzksNiArMjY4LDE0IEBACiAJCQkJcmV0dXJuIGNvbnZlcnRQYXRoVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX09CSkVDVDoKIAkJCQlyZXR1cm4gY29udmVydFBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1RPQ09MX0JJTkRJTkdfTElTVF9UWVBFOgorCQkJCXJldHVybiBjb252ZXJ0UHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1RPQ09MX0JJTkRJTkdfVFlQRToKKwkJCQlyZXR1cm4gY29udmVydFByb3RvY29sQmluZGluZ1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1RPQ09MX1VSSV9BTElBU19UWVBFOgorCQkJCXJldHVybiBjb252ZXJ0UHJvdG9jb2xVUklBbGlhc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlFOQU1FX1BBVFRFUk46CisJCQkJcmV0dXJuIGNvbnZlcnRRbmFtZVBhdHRlcm5Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFTU9URToKIAkJCQlyZXR1cm4gY29udmVydFJlbW90ZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTX0FVVEhfVFlQRV9PQkpFQ1Q6CkBAIC0yNDcsMTQgKzI4NCw2IEBACiAJCQkJcmV0dXJuIGNvbnZlcnRSZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5ST0xFX05BTUU6CiAJCQkJcmV0dXJuIGNvbnZlcnRSb2xlTmFtZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19MSVNUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9QUk9UT0NPTF9VUklfQUxJQVNfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUU5BTUVfUEFUVEVSTjoKLQkJCQlyZXR1cm4gY29udmVydFNlcnZpY2VSZWZRbmFtZVBhdHRlcm5Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlRSVUVfRkFMU0VfVFlQRToKIAkJCQlyZXR1cm4gY29udmVydFRydWVGYWxzZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlRSVUVfRkFMU0VfVFlQRV9PQkpFQ1Q6CkBAIC0yNjksNiArMjk4LDI2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBBZGRyZXNzaW5nVHlwZSBjcmVhdGVBZGRyZXNzaW5nVHlwZSgpIHsKKwkJQWRkcmVzc2luZ1R5cGVJbXBsIGFkZHJlc3NpbmdUeXBlID0gbmV3IEFkZHJlc3NpbmdUeXBlSW1wbCgpOworCQlyZXR1cm4gYWRkcmVzc2luZ1R5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERhdGFTb3VyY2VUeXBlIGNyZWF0ZURhdGFTb3VyY2VUeXBlKCkgeworCQlEYXRhU291cmNlVHlwZUltcGwgZGF0YVNvdXJjZVR5cGUgPSBuZXcgRGF0YVNvdXJjZVR5cGVJbXBsKCk7CisJCXJldHVybiBkYXRhU291cmNlVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRpb24oKSB7CiAJCURlc2NyaXB0aW9uSW1wbCBkZXNjcmlwdGlvbiA9IG5ldyBEZXNjcmlwdGlvbkltcGwoKTsKIAkJcmV0dXJuIGRlc2NyaXB0aW9uOwpAQCAtNDU5LDYgKzUwOCwxNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgUmVzcGVjdEJpbmRpbmdUeXBlIGNyZWF0ZVJlc3BlY3RCaW5kaW5nVHlwZSgpIHsKKwkJUmVzcGVjdEJpbmRpbmdUeXBlSW1wbCByZXNwZWN0QmluZGluZ1R5cGUgPSBuZXcgUmVzcGVjdEJpbmRpbmdUeXBlSW1wbCgpOworCQlyZXR1cm4gcmVzcGVjdEJpbmRpbmdUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBSdW5BcyBjcmVhdGVSdW5BcygpIHsKIAkJUnVuQXNJbXBsIHJ1bkFzID0gbmV3IFJ1bkFzSW1wbCgpOwogCQlyZXR1cm4gcnVuQXM7CkBAIC01MzksNiArNTk4LDI2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSBjcmVhdGVBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSByZXN1bHQgPSBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0QWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRWpiUmVmVHlwZSBjcmVhdGVFamJSZWZUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCUVqYlJlZlR5cGUgcmVzdWx0ID0gRWpiUmVmVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKIAkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCkBAIC01NTksOCArNjM4LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVudkVudHJ5VHlwZSBjcmVhdGVFbnZFbnRyeVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJRW52RW50cnlUeXBlIHJlc3VsdCA9IEVudkVudHJ5VHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKKwlwdWJsaWMgR2VuZXJpY0Jvb2xlYW5UeXBlIGNyZWF0ZUdlbmVyaWNCb29sZWFuVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlHZW5lcmljQm9vbGVhblR5cGUgcmVzdWx0ID0gR2VuZXJpY0Jvb2xlYW5UeXBlLmdldChpbml0aWFsVmFsdWUpOwogCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC01NzAsNyArNjQ5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RW52RW50cnlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRHZW5lcmljQm9vbGVhblR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewogCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKIAl9CiAKQEAgLTU3OSw2ICs2NTgsNDQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIElzb2xhdGlvbkxldmVsVHlwZSBjcmVhdGVJc29sYXRpb25MZXZlbFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJSXNvbGF0aW9uTGV2ZWxUeXBlIHJlc3VsdCA9IElzb2xhdGlvbkxldmVsVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0SXNvbGF0aW9uTGV2ZWxUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjcmVhdGVFbnZFbnRyeVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJcmV0dXJuIGNyZWF0ZUZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlRnJvbVN0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkZVTExZX1FVQUxJRklFRF9DTEFTU19UWVBFLCBpbml0aWFsVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydEVudkVudHJ5VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBjb252ZXJ0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGVUb1N0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkZVTExZX1FVQUxJRklFRF9DTEFTU19UWVBFLCBpbnN0YW5jZVZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewogCQlNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgcmVzdWx0ID0gTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmdldChpbml0aWFsVmFsdWUpOwogCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKQEAgLTY1OSw2ICs3NzYsMjQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIGNyZWF0ZUFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXJldHVybiBjcmVhdGVBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5BRERSRVNTSU5HX1JFU1BPTlNFU19UWVBFLCBpbml0aWFsVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGNvbnZlcnRBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZVRvU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuQUREUkVTU0lOR19SRVNQT05TRVNfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIFN0cmluZyBjcmVhdGVEZXdleVZlcnNpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbml0aWFsVmFsdWUpOwogCX0KQEAgLTcxNCw3ICs4NDksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgRWpiUmVmVHlwZSBjcmVhdGVFamJSZWZUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoRWpiUmVmVHlwZSljcmVhdGVFamJSZWZUeXBlRnJvbVN0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkVKQl9SRUZfVFlQRSwgaW5pdGlhbFZhbHVlKTsKKwkJcmV0dXJuIGNyZWF0ZUVqYlJlZlR5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuRUpCX1JFRl9UWVBFLCBpbml0aWFsVmFsdWUpOwogCX0KIAogCS8qKgpAQCAtNzMxLDI0ICs4NjYsNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRW52RW50cnlUeXBlIGNyZWF0ZUVudkVudHJ5VHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEVudkVudHJ5VHlwZSljcmVhdGVFbnZFbnRyeVR5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuRU5WX0VOVFJZX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RW52RW50cnlUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRFbnZFbnRyeVR5cGVUb1N0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkVOVl9FTlRSWV9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KIAlwdWJsaWMgU3RyaW5nIGNyZWF0ZUZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCXJldHVybiAoU3RyaW5nKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCX0KQEAgLTc2Nyw2ICs4ODQsMjQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEdlbmVyaWNCb29sZWFuVHlwZSBjcmVhdGVHZW5lcmljQm9vbGVhblR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJcmV0dXJuIGNyZWF0ZUdlbmVyaWNCb29sZWFuVHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5HRU5FUklDX0JPT0xFQU5fVFlQRSwgaW5pdGlhbFZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRHZW5lcmljQm9vbGVhblR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gY29udmVydEdlbmVyaWNCb29sZWFuVHlwZVRvU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuR0VORVJJQ19CT09MRUFOX1RZUEUsIGluc3RhbmNlVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBTdHJpbmcgY3JlYXRlSG9tZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewogCQlyZXR1cm4gKFN0cmluZylzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAl9CkBAIC03ODUsNiArOTIwLDI0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBJc29sYXRpb25MZXZlbFR5cGUgY3JlYXRlSXNvbGF0aW9uTGV2ZWxUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXJldHVybiBjcmVhdGVJc29sYXRpb25MZXZlbFR5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuSVNPTEFUSU9OX0xFVkVMX1RZUEUsIGluaXRpYWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0SXNvbGF0aW9uTGV2ZWxUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGNvbnZlcnRJc29sYXRpb25MZXZlbFR5cGVUb1N0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLklTT0xBVElPTl9MRVZFTF9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgU3RyaW5nIGNyZWF0ZUphdmFJZGVudGlmaWVyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbml0aWFsVmFsdWUpOwogCX0KQEAgLTgyMSw2ICs5NzQsMjQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIFN0cmluZyBjcmVhdGVKZGJjVXJsVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5pdGlhbFZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRKZGJjVXJsVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbnN0YW5jZVZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgU3RyaW5nIGNyZWF0ZUpORElOYW1lRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCXJldHVybiAoU3RyaW5nKXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCX0KQEAgLTkxMiw3ICsxMDgzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUpY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRnJvbVN0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRSwgaW5pdGlhbFZhbHVlKTsKKwkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEUsIGluaXRpYWxWYWx1ZSk7CiAJfQogCiAJLyoqCkBAIC05NDgsNyArMTExOSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIGNyZWF0ZVBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKWNyZWF0ZVBlcnNpc3RlbmNlQ29udGV4dFR5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFLCBpbml0aWFsVmFsdWUpOworCQlyZXR1cm4gY3JlYXRlUGVyc2lzdGVuY2VDb250ZXh0VHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QRVJTSVNURU5DRV9DT05URVhUX1RZUEUsIGluaXRpYWxWYWx1ZSk7CiAJfQogCiAJLyoqCkBAIC05NjUsNiArMTEzNiwxMzQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIExpc3Q8U3RyaW5nPiBjcmVhdGVQcm90b2NvbEJpbmRpbmdMaXN0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHJldHVybiBudWxsOworCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5pdGlhbFZhbHVlKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7CisJCQlTdHJpbmcgaXRlbSA9IHN0cmluZ1Rva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJCXJlc3VsdC5hZGQoY3JlYXRlUHJvdG9jb2xCaW5kaW5nVHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QUk9UT0NPTF9CSU5ESU5HX1RZUEUsIGl0ZW0pKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFByb3RvY29sQmluZGluZ0xpc3RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJaWYgKGluc3RhbmNlVmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCUxpc3Q8Pz4gbGlzdCA9IChMaXN0PD8+KWluc3RhbmNlVmFsdWU7CisJCWlmIChsaXN0LmlzRW1wdHkoKSkgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0KSB7CisJCQlyZXN1bHQuYXBwZW5kKGNvbnZlcnRQcm90b2NvbEJpbmRpbmdUeXBlVG9TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QUk9UT0NPTF9CSU5ESU5HX1RZUEUsIGl0ZW0pKTsKKwkJCXJlc3VsdC5hcHBlbmQoJyAnKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0LnN1YnN0cmluZygwLCByZXN1bHQubGVuZ3RoKCkgLSAxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNyZWF0ZVByb3RvY29sQmluZGluZ1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJaWYgKGluaXRpYWxWYWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJU3RyaW5nIHJlc3VsdCA9IG51bGw7CisJCVJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKKwkJdHJ5IHsKKwkJCXJlc3VsdCA9IChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQU5ZX1VSSSwgaW5pdGlhbFZhbHVlKTsKKwkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVEYXRhVHlwZSwgcmVzdWx0LCBudWxsLCBudWxsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJZXhjZXB0aW9uID0gZTsKKwkJfQorCQl0cnkgeworCQkJcmVzdWx0ID0gY3JlYXRlUHJvdG9jb2xVUklBbGlhc1R5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUsIGluaXRpYWxWYWx1ZSk7CisJCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgRGlhZ25vc3RpY2lhbi5JTlNUQU5DRS52YWxpZGF0ZShlRGF0YVR5cGUsIHJlc3VsdCwgbnVsbCwgbnVsbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCWV4Y2VwdGlvbiA9IGU7CisJCX0KKwkJaWYgKHJlc3VsdCAhPSBudWxsIHx8IGV4Y2VwdGlvbiA9PSBudWxsKSByZXR1cm4gcmVzdWx0OworICAgIAorCQl0aHJvdyBleGNlcHRpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0UHJvdG9jb2xCaW5kaW5nVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCWlmIChpbnN0YW5jZVZhbHVlID09IG51bGwpIHJldHVybiBudWxsOworCQlpZiAoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQU5ZX1VSSS5pc0luc3RhbmNlKGluc3RhbmNlVmFsdWUpKSB7CisJCQl0cnkgeworCQkJCVN0cmluZyB2YWx1ZSA9IFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQU5ZX1VSSSwgaW5zdGFuY2VWYWx1ZSk7CisJCQkJaWYgKHZhbHVlICE9IG51bGwpIHJldHVybiB2YWx1ZTsKKwkJCX0KKwkJCWNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCS8vIEtlZXAgdHJ5aW5nIG90aGVyIG1lbWJlciB0eXBlcyB1bnRpbCBhbGwgaGF2ZSBmYWlsZWQuCisJCQl9CisJCX0KKwkJaWYgKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUuaXNJbnN0YW5jZShpbnN0YW5jZVZhbHVlKSkgeworCQkJdHJ5IHsKKwkJCQlTdHJpbmcgdmFsdWUgPSBjb252ZXJ0UHJvdG9jb2xVUklBbGlhc1R5cGVUb1N0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlBST1RPQ09MX1VSSV9BTElBU19UWVBFLCBpbnN0YW5jZVZhbHVlKTsKKwkJCQlpZiAodmFsdWUgIT0gbnVsbCkgcmV0dXJuIHZhbHVlOworCQkJfQorCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJLy8gS2VlcCB0cnlpbmcgb3RoZXIgbWVtYmVyIHR5cGVzIHVudGlsIGFsbCBoYXZlIGZhaWxlZC4KKwkJCX0KKwkJfQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHZhbHVlOiAnIitpbnN0YW5jZVZhbHVlKyInIGZvciBkYXRhdHlwZSA6IitlRGF0YVR5cGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjcmVhdGVQcm90b2NvbFVSSUFsaWFzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5pdGlhbFZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQcm90b2NvbFVSSUFsaWFzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbnN0YW5jZVZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNyZWF0ZVFuYW1lUGF0dGVybkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5pdGlhbFZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRRbmFtZVBhdHRlcm5Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5zdGFuY2VWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIFN0cmluZyBjcmVhdGVSZW1vdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJcmV0dXJuIChTdHJpbmcpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJfQpAQCAtOTg0LDcgKzEyODMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgUmVzQXV0aFR5cGUgY3JlYXRlUmVzQXV0aFR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChSZXNBdXRoVHlwZSljcmVhdGVSZXNBdXRoVHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5SRVNfQVVUSF9UWVBFLCBpbml0aWFsVmFsdWUpOworCQlyZXR1cm4gY3JlYXRlUmVzQXV0aFR5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUkVTX0FVVEhfVFlQRSwgaW5pdGlhbFZhbHVlKTsKIAl9CiAKIAkvKioKQEAgLTEwMDIsNyArMTMwMSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBSZXNTaGFyaW5nU2NvcGVUeXBlIGNyZWF0ZVJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChSZXNTaGFyaW5nU2NvcGVUeXBlKWNyZWF0ZVJlc1NoYXJpbmdTY29wZVR5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUkVTX1NIQVJJTkdfU0NPUEVfVFlQRSwgaW5pdGlhbFZhbHVlKTsKKwkJcmV0dXJuIGNyZWF0ZVJlc1NoYXJpbmdTY29wZVR5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUkVTX1NIQVJJTkdfU0NPUEVfVFlQRSwgaW5pdGlhbFZhbHVlKTsKIAl9CiAKIAkvKioKQEAgLTEwMzcsMTMyICsxMzM2LDYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgY3JlYXRlU2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCWlmIChpbml0aWFsVmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluaXRpYWxWYWx1ZSk7IHN0cmluZ1Rva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7ICkgewotCQkJU3RyaW5nIGl0ZW0gPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlyZXN1bHQuYWRkKGNyZWF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlRnJvbVN0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfVFlQRSwgaXRlbSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJaWYgKGluc3RhbmNlVmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCUxpc3QgbGlzdCA9IChMaXN0KWluc3RhbmNlVmFsdWU7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgcmV0dXJuICIiOwotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCXJlc3VsdC5hcHBlbmQoY29udmVydFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlVG9TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX1RZUEUsIGkubmV4dCgpKSk7Ci0JCQlyZXN1bHQuYXBwZW5kKCcgJyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMCwgcmVzdWx0Lmxlbmd0aCgpIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5BTllfVVJJLCBpbml0aWFsVmFsdWUpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIERpYWdub3N0aWNpYW4uSU5TVEFOQ0UudmFsaWRhdGUoZURhdGFUeXBlLCByZXN1bHQsIG51bGwsIG51bGwpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlleGNlcHRpb24gPSBlOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSAoU3RyaW5nKWNyZWF0ZVNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZUZyb21TdHJpbmcoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRl9QUk9UT0NPTF9VUklfQUxJQVNfVFlQRSwgaW5pdGlhbFZhbHVlKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVEYXRhVHlwZSwgcmVzdWx0LCBudWxsLCBudWxsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZXhjZXB0aW9uID0gZTsKLQkJfQotCQlpZiAocmVzdWx0ICE9IG51bGwgfHwgZXhjZXB0aW9uID09IG51bGwpIHJldHVybiByZXN1bHQ7Ci0gICAgCi0JCXRocm93IGV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCWlmIChpbnN0YW5jZVZhbHVlID09IG51bGwpIHJldHVybiBudWxsOwotCQlpZiAoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQU5ZX1VSSS5pc0luc3RhbmNlKGluc3RhbmNlVmFsdWUpKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB2YWx1ZSA9IFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQU5ZX1VSSSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHJldHVybiB2YWx1ZTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCWlmIChKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX1BST1RPQ09MX1VSSV9BTElBU19UWVBFLmlzSW5zdGFuY2UoaW5zdGFuY2VWYWx1ZSkpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHZhbHVlID0gY29udmVydFNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZVRvU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSByZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHZhbHVlOiAnIitpbnN0YW5jZVZhbHVlKyInIGZvciBkYXRhdHlwZSA6IitlRGF0YVR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlRPS0VOLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNlcnZpY2VSZWZRbmFtZVBhdHRlcm5Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5UT0tFTiwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCiAJcHVibGljIEJvb2xlYW4gY3JlYXRlVHJ1ZUZhbHNlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewogCQlyZXR1cm4gKEJvb2xlYW4pWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQk9PTEVBTiwgaW5pdGlhbFZhbHVlKTsKIAl9CkBAIC0xMTgyLDcgKzEzNTUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgQm9vbGVhbiBjcmVhdGVUcnVlRmFsc2VUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQm9vbGVhbiljcmVhdGVUcnVlRmFsc2VUeXBlRnJvbVN0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlRSVUVfRkFMU0VfVFlQRSwgaW5pdGlhbFZhbHVlKTsKKwkJcmV0dXJuIGNyZWF0ZVRydWVGYWxzZVR5cGVGcm9tU3RyaW5nKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuVFJVRV9GQUxTRV9UWVBFLCBpbml0aWFsVmFsdWUpOwogCX0KIAogCS8qKgpAQCAtMTIwOSw2ICsxMzgyLDcgQEAKIAkgKiBAZGVwcmVjYXRlZAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlARGVwcmVjYXRlZAogCXB1YmxpYyBzdGF0aWMgSmF2YWVlUGFja2FnZSBnZXRQYWNrYWdlKCkgewogCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5lSU5TVEFOQ0U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvSmF2YWVlUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0phdmFlZVBhY2thZ2VJbXBsLmphdmEKaW5kZXggOTAxNzU5YS4uN2I4YzE1NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvSmF2YWVlUGFja2FnZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9KYXZhZWVQYWNrYWdlSW1wbC5qYXZhCkBAIC0yNiwxNCArMjYsMTIgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luLkoyRUVDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVJbml0OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlOwotCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkFkZHJlc3NpbmdSZXNwb25zZXNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7CkBAIC00MSw5ICszOSwxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbXB0eVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkdlbmVyaWNCb29sZWFuVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSW5qZWN0aW9uVGFyZ2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Jc29sYXRpb25MZXZlbFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFlZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lcjsKQEAgLTYwLDYgKzU5LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzU2hhcmluZ1Njb3BlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNwZWN0QmluZGluZ1R5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZjsKQEAgLTczLDE4ICs3Myw2IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwudXRpbC5KYXZhZWVWYWxpZGF0b3I7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7Ci0KIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KQEAgLTk3LDYgKzg1LDIwIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXByaXZhdGUgRUNsYXNzIGFkZHJlc3NpbmdUeXBlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGRhdGFTb3VyY2VUeXBlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXByaXZhdGUgRUNsYXNzIGRlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKIAogCS8qKgpAQCAtMjMwLDYgKzIzMiwxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwcml2YXRlIEVDbGFzcyByZXNwZWN0QmluZGluZ1R5cGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHJpdmF0ZSBFQ2xhc3MgcnVuQXNFQ2xhc3MgPSBudWxsOwogCiAJLyoqCkBAIC0yODYsNiArMjk1LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXByaXZhdGUgRUVudW0gYWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGVFRW51bSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwcml2YXRlIEVFbnVtIGVqYlJlZlR5cGVFRW51bSA9IG51bGw7CiAKIAkvKioKQEAgLTI5Myw3ICszMDksMTQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJpdmF0ZSBFRW51bSBlbnZFbnRyeVR5cGVFRW51bSA9IG51bGw7CisJcHJpdmF0ZSBFRW51bSBnZW5lcmljQm9vbGVhblR5cGVFRW51bSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIGlzb2xhdGlvbkxldmVsVHlwZUVFbnVtID0gbnVsbDsKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0zMjgsNiArMzUxLDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXByaXZhdGUgRURhdGFUeXBlIGFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXByaXZhdGUgRURhdGFUeXBlIGRld2V5VmVyc2lvblR5cGVFRGF0YVR5cGUgPSBudWxsOwogCiAJLyoqCkBAIC0zNTYsNyArMzg2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZW52RW50cnlUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKKwlwcml2YXRlIEVEYXRhVHlwZSBlbnZFbnRyeVR5cGVFRGF0YVR5cGUgPSBudWxsOwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTM3MCw2ICs0MDAsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHJpdmF0ZSBFRGF0YVR5cGUgZ2VuZXJpY0Jvb2xlYW5UeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXByaXZhdGUgRURhdGFUeXBlIGhvbWVFRGF0YVR5cGUgPSBudWxsOwogCiAJLyoqCkBAIC0zNzcsNiArNDE0LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXByaXZhdGUgRURhdGFUeXBlIGlzb2xhdGlvbkxldmVsVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwcml2YXRlIEVEYXRhVHlwZSBqYXZhSWRlbnRpZmllckVEYXRhVHlwZSA9IG51bGw7CiAKIAkvKioKQEAgLTM5MSw2ICs0MzUsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHJpdmF0ZSBFRGF0YVR5cGUgamRiY1VybFR5cGVFRGF0YVR5cGUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHJpdmF0ZSBFRGF0YVR5cGUgam5kaU5hbWVFRGF0YVR5cGUgPSBudWxsOwogCiAJLyoqCkBAIC00NDcsNiArNDk4LDM0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXByaXZhdGUgRURhdGFUeXBlIHByb3RvY29sQmluZGluZ0xpc3RUeXBlRURhdGFUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRURhdGFUeXBlIHByb3RvY29sQmluZGluZ1R5cGVFRGF0YVR5cGUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRGF0YVR5cGUgcHJvdG9jb2xVUklBbGlhc1R5cGVFRGF0YVR5cGUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRGF0YVR5cGUgcW5hbWVQYXR0ZXJuRURhdGFUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXByaXZhdGUgRURhdGFUeXBlIHJlbW90ZUVEYXRhVHlwZSA9IG51bGw7CiAKIAkvKioKQEAgLTQ3NSwzNCArNTU0LDYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwogCXByaXZhdGUgRURhdGFUeXBlIHRydWVGYWxzZVR5cGVFRGF0YVR5cGUgPSBudWxsOwogCiAJLyoqCkBAIC01MzYsMjMgKzU4NywxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisJcHJpdmF0ZSB2b2xhdGlsZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwogCiAJLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCisJICogCisJICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBKYXZhZWVQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgorCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAc2VlICNlTlNfVVJJCkBAIC01NjQsNyArNjA1LDcgQEAKIAkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEphdmFlZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmF2YWVlUGFja2FnZS5lTlNfVVJJKTsKIAogCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUphdmFlZVBhY2thZ2VJbXBsIHRoZUphdmFlZVBhY2thZ2UgPSAoSmF2YWVlUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgSmF2YWVlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBKYXZhZWVQYWNrYWdlSW1wbCgpKTsKKwkJSmF2YWVlUGFja2FnZUltcGwgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgSmF2YWVlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgSmF2YWVlUGFja2FnZUltcGwoKSk7CiAKIAkJaXNJbml0ZWQgPSB0cnVlOwogCkBAIC01NzIsMjggKzYxMywxMSBAQAogCQlYTUxOYW1lc3BhY2VQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKIAkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCVdlYlBhY2thZ2VJbXBsIHRoZVdlYlBhY2thZ2UgPSAoV2ViUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSkgOiBXZWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UgPSAoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCiAJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCiAJCXRoZUphdmFlZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwogCiAJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKIAkJdGhlSmF2YWVlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CiAKIAkJLy8gUmVnaXN0ZXIgcGFja2FnZSB2YWxpZGF0b3IKIAkJRVZhbGlkYXRvci5SZWdpc3RyeS5JTlNUQU5DRS5wdXQKQEAgLTYwNyw2ICs2MzEsMTEgQEAKIAkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAogCQl0aGVKYXZhZWVQYWNrYWdlLmZyZWV6ZSgpOwogCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEphdmFlZVBhY2thZ2UuZU5TX1VSSSwgdGhlSmF2YWVlUGFja2FnZSk7CisKKwkJSjJFRUluaXQuaW5pdEVNRk1vZGVscygpOwogCQlyZXR1cm4gdGhlSmF2YWVlUGFja2FnZTsKIAl9CiAKQEAgLTYxNSw2ICs2NDQsMjIyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QWRkcmVzc2luZ1R5cGUoKSB7CisJCXJldHVybiBhZGRyZXNzaW5nVHlwZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBZGRyZXNzaW5nVHlwZV9FbmFibGVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWRkcmVzc2luZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBZGRyZXNzaW5nVHlwZV9SZXF1aXJlZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFkZHJlc3NpbmdUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWRkcmVzc2luZ1R5cGVfUmVzcG9uc2VzKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWRkcmVzc2luZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldERhdGFTb3VyY2VUeXBlKCkgeworCQlyZXR1cm4gZGF0YVNvdXJjZVR5cGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RGF0YVNvdXJjZVR5cGVfRGVzY3JpcHRpb24oKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlkYXRhU291cmNlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERhdGFTb3VyY2VUeXBlX05hbWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkYXRhU291cmNlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERhdGFTb3VyY2VUeXBlX0NsYXNzTmFtZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRhdGFTb3VyY2VUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfU2VydmVyTmFtZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRhdGFTb3VyY2VUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfUG9ydE51bWJlcigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRhdGFTb3VyY2VUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfRGF0YWJhc2VOYW1lKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGF0YVNvdXJjZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREYXRhU291cmNlVHlwZV9VcmwoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkYXRhU291cmNlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERhdGFTb3VyY2VUeXBlX1VzZXIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkYXRhU291cmNlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERhdGFTb3VyY2VUeXBlX1Bhc3N3b3JkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGF0YVNvdXJjZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXREYXRhU291cmNlVHlwZV9Qcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWRhdGFTb3VyY2VUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfTG9naW5UaW1lb3V0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGF0YVNvdXJjZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfVHJhbnNhY3Rpb25hbCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRhdGFTb3VyY2VUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERhdGFTb3VyY2VUeXBlX0lzb2xhdGlvbkxldmVsKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGF0YVNvdXJjZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfSW5pdGlhbFBvb2xTaXplKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGF0YVNvdXJjZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfTWF4UG9vbFNpemUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlkYXRhU291cmNlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREYXRhU291cmNlVHlwZV9NaW5Qb29sU2l6ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRhdGFTb3VyY2VUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERhdGFTb3VyY2VUeXBlX01heElkbGVUaW1lKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGF0YVNvdXJjZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfTWF4U3RhdGVtZW50cygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRhdGFTb3VyY2VUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERhdGFTb3VyY2VUeXBlX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGF0YVNvdXJjZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVDbGFzcyBnZXREZXNjcmlwdGlvbigpIHsKIAkJcmV0dXJuIGRlc2NyaXB0aW9uRUNsYXNzOwogCX0KQEAgLTc1MCw3ICs5OTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJMb2NhbFJlZl9JZCgpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJMb2NhbFJlZl9Mb29rdXBOYW1lKCkgewogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKIAl9CiAKQEAgLTc1OSw2ICsxMDA0LDE1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEVqYkxvY2FsUmVmX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUNsYXNzIGdldEVqYlJlZigpIHsKIAkJcmV0dXJuIGVqYlJlZkVDbGFzczsKIAl9CkBAIC04NDAsNyArMTA5NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVqYlJlZl9JZCgpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFamJSZWZfTG9va3VwTmFtZSgpIHsKIAkJcmV0dXJuIChFQXR0cmlidXRlKWVqYlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwogCX0KIApAQCAtODQ5LDYgKzExMDMsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWpiUmVmX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVDbGFzcyBnZXRFbXB0eVR5cGUoKSB7CiAJCXJldHVybiBlbXB0eVR5cGVFQ2xhc3M7CiAJfQpAQCAtOTMwLDcgKzExOTMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9JZCgpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9Mb29rdXBOYW1lKCkgewogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW52RW50cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKIAl9CiAKQEAgLTkzOSw2ICsxMjAyLDE1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudkVudHJ5X0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW52RW50cnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUNsYXNzIGdldEljb24oKSB7CiAJCXJldHVybiBpY29uRUNsYXNzOwogCX0KQEAgLTExNDYsNyArMTQxOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9JZCgpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fTG9va3VwTmFtZSgpIHsKIAkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwogCX0KIApAQCAtMTE1NSw2ICsxNDI3LDE1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9JZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkgewogCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzOwogCX0KQEAgLTEyMjcsNyArMTUwOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9JZCgpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTG9va3VwTmFtZSgpIHsKIAkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwogCX0KIApAQCAtMTIzNiw2ICsxNTE3LDE1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9JZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQ2xhc3MgZ2V0UGFyYW1WYWx1ZSgpIHsKIAkJcmV0dXJuIHBhcmFtVmFsdWVFQ2xhc3M7CiAJfQpAQCAtMTQ1Miw3ICsxNzQyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50UmVmX010b21UaHJlc2hvbGQoKSB7CiAJCXJldHVybiAoRUF0dHJpYnV0ZSlwb3J0Q29tcG9uZW50UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CiAJfQogCkBAIC0xNDYxLDggKzE3NTEsMzUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudFJlZl9BZGRyZXNzaW5nKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9ydENvbXBvbmVudFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRSZWZfUmVzcGVjdEJpbmRpbmcoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlwb3J0Q29tcG9uZW50UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXBvcnRDb21wb25lbnRSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50UmVmX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudFJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwogCX0KIAogCS8qKgpAQCAtMTU2MCw3ICsxODc3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VFbnZSZWZfSWQoKSB7CisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VFbnZSZWZfTG9va3VwTmFtZSgpIHsKIAkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlRW52UmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CiAJfQogCkBAIC0xNTY5LDYgKzE4ODYsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VFbnZSZWZfSWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZUVudlJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQ2xhc3MgZ2V0UmVzb3VyY2VSZWYoKSB7CiAJCXJldHVybiByZXNvdXJjZVJlZkVDbGFzczsKIAl9CkBAIC0xNjQxLDcgKzE5NjcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9JZCgpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9Mb29rdXBOYW1lKCkgewogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKIAl9CiAKQEAgLTE2NTAsNiArMTk3NiwzMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9JZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRSZXNwZWN0QmluZGluZ1R5cGUoKSB7CisJCXJldHVybiByZXNwZWN0QmluZGluZ1R5cGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzcGVjdEJpbmRpbmdUeXBlX0VuYWJsZWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNwZWN0QmluZGluZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUNsYXNzIGdldFJ1bkFzKCkgewogCQlyZXR1cm4gcnVuQXNFQ2xhc3M7CiAJfQpAQCAtMTkwMiw3ICsyMjU1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmljZVJlZl9JZCgpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2aWNlUmVmX0xvb2t1cE5hbWUoKSB7CiAJCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwogCX0KIApAQCAtMTkxMSw2ICsyMjY0LDE1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfSWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQ2xhc3MgZ2V0U2VydmljZVJlZkhhbmRsZXIoKSB7CiAJCXJldHVybiBzZXJ2aWNlUmVmSGFuZGxlckVDbGFzczsKIAl9CkBAIC0yMTA5LDYgKzI0NzEsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVFbnVtIGdldEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlKCkgeworCQlyZXR1cm4gYWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGVFRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUVudW0gZ2V0RWpiUmVmVHlwZSgpIHsKIAkJcmV0dXJuIGVqYlJlZlR5cGVFRW51bTsKIAl9CkBAIC0yMTE4LDggKzI0ODksMjYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVFbnVtIGdldEVudkVudHJ5VHlwZSgpIHsKLQkJcmV0dXJuIGVudkVudHJ5VHlwZUVFbnVtOworCXB1YmxpYyBFRW51bSBnZXRHZW5lcmljQm9vbGVhblR5cGUoKSB7CisJCXJldHVybiBnZW5lcmljQm9vbGVhblR5cGVFRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0SXNvbGF0aW9uTGV2ZWxUeXBlKCkgeworCQlyZXR1cm4gaXNvbGF0aW9uTGV2ZWxUeXBlRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRFbnZFbnRyeVR5cGUoKSB7CisJCXJldHVybiBlbnZFbnRyeVR5cGVFRGF0YVR5cGU7CiAJfQogCiAJLyoqCkBAIC0yMTYzLDYgKzI1NTIsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZU9iamVjdCgpIHsKKwkJcmV0dXJuIGFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0RURhdGFUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGV3ZXlWZXJzaW9uVHlwZSgpIHsKIAkJcmV0dXJuIGRld2V5VmVyc2lvblR5cGVFRGF0YVR5cGU7CiAJfQpAQCAtMjE5OSwxNSArMjU5Nyw2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RW52RW50cnlUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gZW52RW50cnlUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwogCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSB7CiAJCXJldHVybiBmdWxseVF1YWxpZmllZENsYXNzVHlwZUVEYXRhVHlwZTsKIAl9CkBAIC0yMjE3LDYgKzI2MDYsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRHZW5lcmljQm9vbGVhblR5cGVPYmplY3QoKSB7CisJCXJldHVybiBnZW5lcmljQm9vbGVhblR5cGVPYmplY3RFRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVEYXRhVHlwZSBnZXRIb21lKCkgewogCQlyZXR1cm4gaG9tZUVEYXRhVHlwZTsKIAl9CkBAIC0yMjI2LDYgKzI2MjQsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRJc29sYXRpb25MZXZlbFR5cGVPYmplY3QoKSB7CisJCXJldHVybiBpc29sYXRpb25MZXZlbFR5cGVPYmplY3RFRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVEYXRhVHlwZSBnZXRKYXZhSWRlbnRpZmllcigpIHsKIAkJcmV0dXJuIGphdmFJZGVudGlmaWVyRURhdGFUeXBlOwogCX0KQEAgLTIyNDQsNiArMjY1MSwxNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgRURhdGFUeXBlIGdldEpkYmNVcmxUeXBlKCkgeworCQlyZXR1cm4gamRiY1VybFR5cGVFRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVEYXRhVHlwZSBnZXRKTkRJTmFtZSgpIHsKIAkJcmV0dXJuIGpuZGlOYW1lRURhdGFUeXBlOwogCX0KQEAgLTIzMTYsNiArMjczMiw0MiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgRURhdGFUeXBlIGdldFByb3RvY29sQmluZGluZ0xpc3RUeXBlKCkgeworCQlyZXR1cm4gcHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVFRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRQcm90b2NvbEJpbmRpbmdUeXBlKCkgeworCQlyZXR1cm4gcHJvdG9jb2xCaW5kaW5nVHlwZUVEYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRURhdGFUeXBlIGdldFByb3RvY29sVVJJQWxpYXNUeXBlKCkgeworCQlyZXR1cm4gcHJvdG9jb2xVUklBbGlhc1R5cGVFRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRRbmFtZVBhdHRlcm4oKSB7CisJCXJldHVybiBxbmFtZVBhdHRlcm5FRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVEYXRhVHlwZSBnZXRSZW1vdGUoKSB7CiAJCXJldHVybiByZW1vdGVFRGF0YVR5cGU7CiAJfQpAQCAtMjM1Miw0MiArMjgwNCw2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlKCkgewotCQlyZXR1cm4gc2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUoKSB7Ci0JCXJldHVybiBzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFNlcnZpY2VSZWZRbmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiBzZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwogCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHJ1ZUZhbHNlVHlwZSgpIHsKIAkJcmV0dXJuIHRydWVGYWxzZVR5cGVFRGF0YVR5cGU7CiAJfQpAQCAtMjQyOSw2ICsyODQ1LDMyIEBACiAJCWlzQ3JlYXRlZCA9IHRydWU7CiAKIAkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCWFkZHJlc3NpbmdUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFERFJFU1NJTkdfVFlQRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYWRkcmVzc2luZ1R5cGVFQ2xhc3MsIEFERFJFU1NJTkdfVFlQRV9fRU5BQkxFRCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYWRkcmVzc2luZ1R5cGVFQ2xhc3MsIEFERFJFU1NJTkdfVFlQRV9fUkVRVUlSRUQpOworCQljcmVhdGVFQXR0cmlidXRlKGFkZHJlc3NpbmdUeXBlRUNsYXNzLCBBRERSRVNTSU5HX1RZUEVfX1JFU1BPTlNFUyk7CisKKwkJZGF0YVNvdXJjZVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREFUQV9TT1VSQ0VfVFlQRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGF0YVNvdXJjZVR5cGVFQ2xhc3MsIERBVEFfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkYXRhU291cmNlVHlwZUVDbGFzcywgREFUQV9TT1VSQ0VfVFlQRV9fTkFNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YVNvdXJjZVR5cGVFQ2xhc3MsIERBVEFfU09VUkNFX1RZUEVfX0NMQVNTX05BTUUpOworCQljcmVhdGVFQXR0cmlidXRlKGRhdGFTb3VyY2VUeXBlRUNsYXNzLCBEQVRBX1NPVVJDRV9UWVBFX19TRVJWRVJfTkFNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YVNvdXJjZVR5cGVFQ2xhc3MsIERBVEFfU09VUkNFX1RZUEVfX1BPUlRfTlVNQkVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkYXRhU291cmNlVHlwZUVDbGFzcywgREFUQV9TT1VSQ0VfVFlQRV9fREFUQUJBU0VfTkFNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YVNvdXJjZVR5cGVFQ2xhc3MsIERBVEFfU09VUkNFX1RZUEVfX1VSTCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YVNvdXJjZVR5cGVFQ2xhc3MsIERBVEFfU09VUkNFX1RZUEVfX1VTRVIpOworCQljcmVhdGVFQXR0cmlidXRlKGRhdGFTb3VyY2VUeXBlRUNsYXNzLCBEQVRBX1NPVVJDRV9UWVBFX19QQVNTV09SRCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoZGF0YVNvdXJjZVR5cGVFQ2xhc3MsIERBVEFfU09VUkNFX1RZUEVfX1BST1BFUlRZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkYXRhU291cmNlVHlwZUVDbGFzcywgREFUQV9TT1VSQ0VfVFlQRV9fTE9HSU5fVElNRU9VVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YVNvdXJjZVR5cGVFQ2xhc3MsIERBVEFfU09VUkNFX1RZUEVfX1RSQU5TQUNUSU9OQUwpOworCQljcmVhdGVFQXR0cmlidXRlKGRhdGFTb3VyY2VUeXBlRUNsYXNzLCBEQVRBX1NPVVJDRV9UWVBFX19JU09MQVRJT05fTEVWRUwpOworCQljcmVhdGVFQXR0cmlidXRlKGRhdGFTb3VyY2VUeXBlRUNsYXNzLCBEQVRBX1NPVVJDRV9UWVBFX19JTklUSUFMX1BPT0xfU0laRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YVNvdXJjZVR5cGVFQ2xhc3MsIERBVEFfU09VUkNFX1RZUEVfX01BWF9QT09MX1NJWkUpOworCQljcmVhdGVFQXR0cmlidXRlKGRhdGFTb3VyY2VUeXBlRUNsYXNzLCBEQVRBX1NPVVJDRV9UWVBFX19NSU5fUE9PTF9TSVpFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkYXRhU291cmNlVHlwZUVDbGFzcywgREFUQV9TT1VSQ0VfVFlQRV9fTUFYX0lETEVfVElNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGF0YVNvdXJjZVR5cGVFQ2xhc3MsIERBVEFfU09VUkNFX1RZUEVfX01BWF9TVEFURU1FTlRTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShkYXRhU291cmNlVHlwZUVDbGFzcywgREFUQV9TT1VSQ0VfVFlQRV9fSUQpOworCiAJCWRlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSVBUSU9OKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmlwdGlvbkVDbGFzcywgREVTQ1JJUFRJT05fX1ZBTFVFKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShkZXNjcmlwdGlvbkVDbGFzcywgREVTQ1JJUFRJT05fX0xBTkcpOwpAQCAtMjQ0Niw2ICsyODg4LDcgQEAKIAkJY3JlYXRlRUF0dHJpYnV0ZShlamJMb2NhbFJlZkVDbGFzcywgRUpCX0xPQ0FMX1JFRl9fRUpCX0xJTkspOwogCQljcmVhdGVFQXR0cmlidXRlKGVqYkxvY2FsUmVmRUNsYXNzLCBFSkJfTE9DQUxfUkVGX19NQVBQRURfTkFNRSk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UoZWpiTG9jYWxSZWZFQ2xhc3MsIEVKQl9MT0NBTF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShlamJMb2NhbFJlZkVDbGFzcywgRUpCX0xPQ0FMX1JFRl9fTE9PS1VQX05BTUUpOwogCQljcmVhdGVFQXR0cmlidXRlKGVqYkxvY2FsUmVmRUNsYXNzLCBFSkJfTE9DQUxfUkVGX19JRCk7CiAKIAkJZWpiUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVKQl9SRUYpOwpAQCAtMjQ1Nyw2ICsyOTAwLDcgQEAKIAkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX0VKQl9MSU5LKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX01BUFBFRF9OQU1FKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX0xPT0tVUF9OQU1FKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShlamJSZWZFQ2xhc3MsIEVKQl9SRUZfX0lEKTsKIAogCQllbXB0eVR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRU1QVFlfVFlQRSk7CkBAIC0yNDY5LDYgKzI5MTMsNyBAQAogCQljcmVhdGVFQXR0cmlidXRlKGVudkVudHJ5RUNsYXNzLCBFTlZfRU5UUllfX0VOVl9FTlRSWV9WQUxVRSk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoZW52RW50cnlFQ2xhc3MsIEVOVl9FTlRSWV9fTUFQUEVEX05BTUUpOwogCQljcmVhdGVFUmVmZXJlbmNlKGVudkVudHJ5RUNsYXNzLCBFTlZfRU5UUllfX0lOSkVDVElPTl9UQVJHRVRTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShlbnZFbnRyeUVDbGFzcywgRU5WX0VOVFJZX19MT09LVVBfTkFNRSk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoZW52RW50cnlFQ2xhc3MsIEVOVl9FTlRSWV9fSUQpOwogCiAJCWljb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSUNPTik7CkBAIC0yNDk4LDYgKzI5NDMsNyBAQAogCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9fSUNPTlMpOwogCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fX01BUFBFRF9OQU1FKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fX0xPT0tVUF9OQU1FKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fX0lEKTsKIAogCQltZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVTU0FHRV9ERVNUSU5BVElPTl9SRUYpOwpAQCAtMjUwOCw2ICsyOTU0LDcgQEAKIAkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19NRVNTQUdFX0RFU1RJTkFUSU9OX0xJTkspOwogCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01BUFBFRF9OQU1FKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTE9PS1VQX05BTUUpOwogCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcywgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lEKTsKIAogCQlwYXJhbVZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBBUkFNX1ZBTFVFKTsKQEAgLTI1MzcsNiArMjk4NCw5IEBACiAJCXBvcnRDb21wb25lbnRSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUE9SVF9DT01QT05FTlRfUkVGKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50UmVmRUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9SRUZfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50UmVmRUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9SRUZfX0VOQUJMRV9NVE9NKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50UmVmRUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9SRUZfX01UT01fVEhSRVNIT0xEKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShwb3J0Q29tcG9uZW50UmVmRUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9SRUZfX0FERFJFU1NJTkcpOworCQljcmVhdGVFUmVmZXJlbmNlKHBvcnRDb21wb25lbnRSZWZFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX1JFRl9fUkVTUEVDVF9CSU5ESU5HKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50UmVmRUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTkspOwogCQljcmVhdGVFQXR0cmlidXRlKHBvcnRDb21wb25lbnRSZWZFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX1JFRl9fSUQpOwogCkBAIC0yNTUxLDYgKzMwMDEsNyBAQAogCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlRW52UmVmRUNsYXNzLCBSRVNPVVJDRV9FTlZfUkVGX19SRVNPVVJDRV9FTlZfUkVGX1RZUEUpOwogCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlRW52UmVmRUNsYXNzLCBSRVNPVVJDRV9FTlZfUkVGX19NQVBQRURfTkFNRSk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VFbnZSZWZFQ2xhc3MsIFJFU09VUkNFX0VOVl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUVudlJlZkVDbGFzcywgUkVTT1VSQ0VfRU5WX1JFRl9fTE9PS1VQX05BTUUpOwogCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlRW52UmVmRUNsYXNzLCBSRVNPVVJDRV9FTlZfUkVGX19JRCk7CiAKIAkJcmVzb3VyY2VSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVTT1VSQ0VfUkVGKTsKQEAgLTI1NjEsOCArMzAxMiwxMiBAQAogCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX1JFU19TSEFSSU5HX1NDT1BFKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZVJlZkVDbGFzcywgUkVTT1VSQ0VfUkVGX19NQVBQRURfTkFNRSk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VSZWZFQ2xhc3MsIFJFU09VUkNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOworCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlUmVmRUNsYXNzLCBSRVNPVVJDRV9SRUZfX0xPT0tVUF9OQU1FKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZVJlZkVDbGFzcywgUkVTT1VSQ0VfUkVGX19JRCk7CiAKKwkJcmVzcGVjdEJpbmRpbmdUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFU1BFQ1RfQklORElOR19UWVBFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShyZXNwZWN0QmluZGluZ1R5cGVFQ2xhc3MsIFJFU1BFQ1RfQklORElOR19UWVBFX19FTkFCTEVEKTsKKwogCQlydW5Bc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSVU5fQVMpOwogCQljcmVhdGVFUmVmZXJlbmNlKHJ1bkFzRUNsYXNzLCBSVU5fQVNfX0RFU0NSSVBUSU9OUyk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUocnVuQXNFQ2xhc3MsIFJVTl9BU19fUk9MRV9OQU1FKTsKQEAgLTI1OTQsNiArMzA0OSw3IEBACiAJCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX0hBTkRMRVJfQ0hBSU5TKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fTUFQUEVEX05BTUUpOwogCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZpY2VSZWZFQ2xhc3MsIFNFUlZJQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmljZVJlZkVDbGFzcywgU0VSVklDRV9SRUZfX0xPT0tVUF9OQU1FKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2aWNlUmVmRUNsYXNzLCBTRVJWSUNFX1JFRl9fSUQpOwogCiAJCXNlcnZpY2VSZWZIYW5kbGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZJQ0VfUkVGX0hBTkRMRVIpOwpAQCAtMjYyMywyMyArMzA3OSwyOSBAQAogCQljcmVhdGVFQXR0cmlidXRlKHVybFBhdHRlcm5UeXBlRUNsYXNzLCBVUkxfUEFUVEVSTl9UWVBFX19WQUxVRSk7CiAKIAkJLy8gQ3JlYXRlIGVudW1zCisJCWFkZHJlc3NpbmdSZXNwb25zZXNUeXBlRUVudW0gPSBjcmVhdGVFRW51bShBRERSRVNTSU5HX1JFU1BPTlNFU19UWVBFKTsKIAkJZWpiUmVmVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oRUpCX1JFRl9UWVBFKTsKLQkJZW52RW50cnlUeXBlRUVudW0gPSBjcmVhdGVFRW51bShFTlZfRU5UUllfVFlQRSk7CisJCWdlbmVyaWNCb29sZWFuVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oR0VORVJJQ19CT09MRUFOX1RZUEUpOworCQlpc29sYXRpb25MZXZlbFR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKElTT0xBVElPTl9MRVZFTF9UWVBFKTsKIAkJbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0gPSBjcmVhdGVFRW51bShNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEUpOwogCQlwZXJzaXN0ZW5jZUNvbnRleHRUeXBlRUVudW0gPSBjcmVhdGVFRW51bShQRVJTSVNURU5DRV9DT05URVhUX1RZUEUpOwogCQlyZXNBdXRoVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oUkVTX0FVVEhfVFlQRSk7CiAJCXJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFJFU19TSEFSSU5HX1NDT1BFX1RZUEUpOwogCiAJCS8vIENyZWF0ZSBkYXRhIHR5cGVzCisJCWFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEFERFJFU1NJTkdfUkVTUE9OU0VTX1RZUEVfT0JKRUNUKTsKIAkJZGV3ZXlWZXJzaW9uVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShERVdFWV9WRVJTSU9OX1RZUEUpOwogCQllamJMaW5rRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEVKQl9MSU5LKTsKIAkJZWpiUmVmTmFtZVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRUpCX1JFRl9OQU1FX1RZUEUpOwogCQllamJSZWZUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEVKQl9SRUZfVFlQRV9PQkpFQ1QpOwotCQllbnZFbnRyeVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRU5WX0VOVFJZX1RZUEVfT0JKRUNUKTsKKwkJZW52RW50cnlUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEVOVl9FTlRSWV9UWVBFKTsKIAkJZnVsbHlRdWFsaWZpZWRDbGFzc1R5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoRlVMTFlfUVVBTElGSUVEX0NMQVNTX1RZUEUpOworCQlnZW5lcmljQm9vbGVhblR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoR0VORVJJQ19CT09MRUFOX1RZUEVfT0JKRUNUKTsKIAkJaG9tZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShIT01FKTsKKwkJaXNvbGF0aW9uTGV2ZWxUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKElTT0xBVElPTl9MRVZFTF9UWVBFX09CSkVDVCk7CiAJCWphdmFJZGVudGlmaWVyRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEpBVkFfSURFTlRJRklFUik7CiAJCWphdmFUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEpBVkFfVFlQRSk7CisJCWpkYmNVcmxUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEpEQkNfVVJMX1RZUEUpOwogCQlqbmRpTmFtZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShKTkRJX05BTUUpOwogCQlsb2NhbEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShMT0NBTCk7CiAJCWxvY2FsSG9tZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShMT0NBTF9IT01FKTsKQEAgLTI2NDgsMTQgKzMxMTAsMTQgQEAKIAkJbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKE1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRV9PQkpFQ1QpOwogCQlwYXRoVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShQQVRIX1RZUEUpOwogCQlwZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV9PQkpFQ1QpOworCQlwcm90b2NvbEJpbmRpbmdMaXN0VHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShQUk9UT0NPTF9CSU5ESU5HX0xJU1RfVFlQRSk7CisJCXByb3RvY29sQmluZGluZ1R5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoUFJPVE9DT0xfQklORElOR19UWVBFKTsKKwkJcHJvdG9jb2xVUklBbGlhc1R5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUpOworCQlxbmFtZVBhdHRlcm5FRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoUU5BTUVfUEFUVEVSTik7CiAJCXJlbW90ZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShSRU1PVEUpOwogCQlyZXNBdXRoVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShSRVNfQVVUSF9UWVBFX09CSkVDVCk7CiAJCXJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoUkVTX1NIQVJJTkdfU0NPUEVfVFlQRV9PQkpFQ1QpOwogCQlyb2xlTmFtZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShST0xFX05BTUUpOwotCQlzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19MSVNUX1RZUEUpOwotCQlzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShTRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX1RZUEUpOwotCQlzZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUpOwotCQlzZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFNFUlZJQ0VfUkVGX1FOQU1FX1BBVFRFUk4pOwogCQl0cnVlRmFsc2VUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFRSVUVfRkFMU0VfVFlQRSk7CiAJCXRydWVGYWxzZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVFJVRV9GQUxTRV9UWVBFX09CSkVDVCk7CiAJfQpAQCAtMjY4NywyNzAgKzMxNDksMzM2IEBACiAJCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwogCQlYTUxOYW1lc3BhY2VQYWNrYWdlIHRoZVhNTE5hbWVzcGFjZVBhY2thZ2UgPSAoWE1MTmFtZXNwYWNlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxOYW1lc3BhY2VQYWNrYWdlLmVOU19VUkkpOwogCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwogCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoZGVzY3JpcHRpb25FQ2xhc3MsIERlc2NyaXB0aW9uLmNsYXNzLCAiRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVzY3JpcHRpb25fVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmlwdGlvbl9MYW5nKCksIHRoZVhNTE5hbWVzcGFjZVBhY2thZ2UuZ2V0TGFuZ1R5cGUoKSwgImxhbmciLCBudWxsLCAwLCAxLCBEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCiAKLQkJaW5pdEVDbGFzcyhkaXNwbGF5TmFtZUVDbGFzcywgRGlzcGxheU5hbWUuY2xhc3MsICJEaXNwbGF5TmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNwbGF5TmFtZV9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgRGlzcGxheU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERpc3BsYXlOYW1lX0xhbmcoKSwgdGhlWE1MTmFtZXNwYWNlUGFja2FnZS5nZXRMYW5nVHlwZSgpLCAibGFuZyIsIG51bGwsIDAsIDEsIERpc3BsYXlOYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZWpiTG9jYWxSZWZFQ2xhc3MsIEVqYkxvY2FsUmVmLmNsYXNzLCAiRWpiTG9jYWxSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RWpiTG9jYWxSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFamJMb2NhbFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9FamJSZWZOYW1lKCksIHRoaXMuZ2V0RWpiUmVmTmFtZVR5cGUoKSwgImVqYlJlZk5hbWUiLCBudWxsLCAxLCAxLCBFamJMb2NhbFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiTG9jYWxSZWZfRWpiUmVmVHlwZSgpLCB0aGlzLmdldEVqYlJlZlR5cGUoKSwgImVqYlJlZlR5cGUiLCAiRW50aXR5IiwgMCwgMSwgRWpiTG9jYWxSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9Mb2NhbEhvbWUoKSwgdGhpcy5nZXRMb2NhbEhvbWUoKSwgImxvY2FsSG9tZSIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9Mb2NhbCgpLCB0aGlzLmdldExvY2FsKCksICJsb2NhbCIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9FamJMaW5rKCksIHRoaXMuZ2V0RUpCTGluaygpLCAiZWpiTGluayIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFamJMb2NhbFJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYkxvY2FsUmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhlamJSZWZFQ2xhc3MsIEVqYlJlZi5jbGFzcywgIkVqYlJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFamJSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX0VqYlJlZk5hbWUoKSwgdGhpcy5nZXRFamJSZWZOYW1lVHlwZSgpLCAiZWpiUmVmTmFtZSIsIG51bGwsIDEsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX0VqYlJlZlR5cGUoKSwgdGhpcy5nZXRFamJSZWZUeXBlKCksICJlamJSZWZUeXBlIiwgIkVudGl0eSIsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9Ib21lKCksIHRoaXMuZ2V0SG9tZSgpLCAiaG9tZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX1JlbW90ZSgpLCB0aGlzLmdldFJlbW90ZSgpLCAicmVtb3RlIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfRWpiTGluaygpLCB0aGlzLmdldEVKQkxpbmsoKSwgImVqYkxpbmsiLCBudWxsLCAwLCAxLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RWpiUmVmX0luamVjdGlvblRhcmdldHMoKSwgdGhpcy5nZXRJbmplY3Rpb25UYXJnZXQoKSwgbnVsbCwgImluamVjdGlvblRhcmdldHMiLCBudWxsLCAwLCAtMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGVtcHR5VHlwZUVDbGFzcywgRW1wdHlUeXBlLmNsYXNzLCAiRW1wdHlUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVtcHR5VHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFbXB0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGVudkVudHJ5RUNsYXNzLCBFbnZFbnRyeS5jbGFzcywgIkVudkVudHJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudkVudHJ5X0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW52RW50cnlfRW52RW50cnlOYW1lKCksIHRoaXMuZ2V0Sk5ESU5hbWUoKSwgImVudkVudHJ5TmFtZSIsIG51bGwsIDEsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9FbnZFbnRyeVR5cGUoKSwgdGhpcy5nZXRFbnZFbnRyeVR5cGUoKSwgImVudkVudHJ5VHlwZSIsICJqYXZhLmxhbmcuQm9vbGVhbiIsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW52RW50cnlfRW52RW50cnlWYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVudkVudHJ5VmFsdWUiLCBudWxsLCAwLCAxLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW52RW50cnlfTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW52RW50cnlfSW5qZWN0aW9uVGFyZ2V0cygpLCB0aGlzLmdldEluamVjdGlvblRhcmdldCgpLCBudWxsLCAiaW5qZWN0aW9uVGFyZ2V0cyIsIG51bGwsIDAsIC0xLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoaWNvbkVDbGFzcywgSWNvbi5jbGFzcywgIkljb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvbl9TbWFsbEljb24oKSwgdGhpcy5nZXRQYXRoVHlwZSgpLCAic21hbGxJY29uIiwgbnVsbCwgMCwgMSwgSWNvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvbl9MYXJnZUljb24oKSwgdGhpcy5nZXRQYXRoVHlwZSgpLCAibGFyZ2VJY29uIiwgbnVsbCwgMCwgMSwgSWNvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBJY29uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEljb25fTGFuZygpLCB0aGVYTUxOYW1lc3BhY2VQYWNrYWdlLmdldExhbmdUeXBlKCksICJsYW5nIiwgbnVsbCwgMCwgMSwgSWNvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGluamVjdGlvblRhcmdldEVDbGFzcywgSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCAiSW5qZWN0aW9uVGFyZ2V0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEluamVjdGlvblRhcmdldF9JbmplY3Rpb25UYXJnZXRDbGFzcygpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJpbmplY3Rpb25UYXJnZXRDbGFzcyIsIG51bGwsIDEsIDEsIEluamVjdGlvblRhcmdldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5qZWN0aW9uVGFyZ2V0X0luamVjdGlvblRhcmdldE5hbWUoKSwgdGhpcy5nZXRKYXZhSWRlbnRpZmllcigpLCAiaW5qZWN0aW9uVGFyZ2V0TmFtZSIsIG51bGwsIDEsIDEsIEluamVjdGlvblRhcmdldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGxpZmVjeWNsZUNhbGxiYWNrRUNsYXNzLCBMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgIkxpZmVjeWNsZUNhbGxiYWNrIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAibGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcyIsIG51bGwsIDAsIDEsIExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMaWZlY3ljbGVDYWxsYmFja19MaWZlY3ljbGVDYWxsYmFja01ldGhvZCgpLCB0aGlzLmdldEphdmFJZGVudGlmaWVyKCksICJsaWZlY3ljbGVDYWxsYmFja01ldGhvZCIsIG51bGwsIDEsIDEsIExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MobGlzdGVuZXJFQ2xhc3MsIExpc3RlbmVyLmNsYXNzLCAiTGlzdGVuZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TGlzdGVuZXJfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRMaXN0ZW5lcl9EaXNwbGF5TmFtZXMoKSwgdGhpcy5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIExpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldExpc3RlbmVyX0ljb25zKCksIHRoaXMuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJsaXN0ZW5lckNsYXNzIiwgbnVsbCwgMSwgMSwgTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExpc3RlbmVyX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIExpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhtZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MsIE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRGVzdGluYXRpb25fRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0Rpc3BsYXlOYW1lcygpLCB0aGlzLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9JY29ucygpLCB0aGlzLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25fTWVzc2FnZURlc3RpbmF0aW9uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAibWVzc2FnZURlc3RpbmF0aW9uTmFtZSIsIG51bGwsIDEsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhtZXNzYWdlRGVzdGluYXRpb25SZWZFQ2xhc3MsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvblJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKSwgdGhpcy5nZXRKTkRJTmFtZSgpLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSIsIG51bGwsIDEsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKSwgdGhpcy5nZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSgpLCAibWVzc2FnZURlc3RpbmF0aW9uVHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCksIHRoaXMuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCksICJtZXNzYWdlRGVzdGluYXRpb25Vc2FnZSIsICJDb25zdW1lcyIsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NZXNzYWdlRGVzdGluYXRpb25MaW5rKCksIHRoaXMuZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpLCAibWVzc2FnZURlc3RpbmF0aW9uTGluayIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfSW5qZWN0aW9uVGFyZ2V0cygpLCB0aGlzLmdldEluamVjdGlvblRhcmdldCgpLCBudWxsLCAiaW5qZWN0aW9uVGFyZ2V0cyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocGFyYW1WYWx1ZUVDbGFzcywgUGFyYW1WYWx1ZS5jbGFzcywgIlBhcmFtVmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFyYW1WYWx1ZV9QYXJhbU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInBhcmFtTmFtZSIsIG51bGwsIDEsIDEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBhcmFtVmFsdWVfUGFyYW1WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBhcmFtVmFsdWUiLCBudWxsLCAxLCAxLCBQYXJhbVZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQYXJhbVZhbHVlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHBlcnNpc3RlbmNlQ29udGV4dFJlZkVDbGFzcywgUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCAiUGVyc2lzdGVuY2VDb250ZXh0UmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpLCB0aGlzLmdldEpORElOYW1lKCksICJwZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lIiwgbnVsbCwgMSwgMSwgUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VVbml0TmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAicGVyc2lzdGVuY2VVbml0TmFtZSIsIG51bGwsIDAsIDEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlQ29udGV4dFR5cGUoKSwgdGhpcy5nZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCksICJwZXJzaXN0ZW5jZUNvbnRleHRUeXBlIiwgIlRyYW5zYWN0aW9uIiwgMCwgMSwgUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlUHJvcGVydGllcygpLCB0aGlzLmdldFByb3BlcnR5VHlwZSgpLCBudWxsLCAicGVyc2lzdGVuY2VQcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhwZXJzaXN0ZW5jZVVuaXRSZWZFQ2xhc3MsIFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgIlBlcnNpc3RlbmNlVW5pdFJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc2lzdGVuY2VVbml0UmVmX1BlcnNpc3RlbmNlVW5pdFJlZk5hbWUoKSwgdGhpcy5nZXRKTkRJTmFtZSgpLCAicGVyc2lzdGVuY2VVbml0UmVmTmFtZSIsIG51bGwsIDEsIDEsIFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc2lzdGVuY2VVbml0UmVmX1BlcnNpc3RlbmNlVW5pdE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInBlcnNpc3RlbmNlVW5pdE5hbWUiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlVW5pdFJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0luamVjdGlvblRhcmdldHMoKSwgdGhpcy5nZXRJbmplY3Rpb25UYXJnZXQoKSwgbnVsbCwgImluamVjdGlvblRhcmdldHMiLCBudWxsLCAwLCAtMSwgUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlVW5pdFJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHBvcnRDb21wb25lbnRSZWZFQ2xhc3MsIFBvcnRDb21wb25lbnRSZWYuY2xhc3MsICJQb3J0Q29tcG9uZW50UmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIsIG51bGwsIDEsIDEsIFBvcnRDb21wb25lbnRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRSZWZfRW5hYmxlTXRvbSgpLCB0aGlzLmdldFRydWVGYWxzZVR5cGUoKSwgImVuYWJsZU10b20iLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInBvcnRDb21wb25lbnRMaW5rIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudFJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhwcm9wZXJ0eVR5cGVFQ2xhc3MsIFByb3BlcnR5VHlwZS5jbGFzcywgIlByb3BlcnR5VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eVR5cGVfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBQcm9wZXJ0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5VHlwZV9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMSwgMSwgUHJvcGVydHlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9wZXJ0eVR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUHJvcGVydHlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhyZXNvdXJjZUVudlJlZkVDbGFzcywgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICJSZXNvdXJjZUVudlJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRW52UmVmX1Jlc291cmNlRW52UmVmTmFtZSgpLCB0aGlzLmdldEpORElOYW1lKCksICJyZXNvdXJjZUVudlJlZk5hbWUiLCBudWxsLCAxLCAxLCBSZXNvdXJjZUVudlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VFbnZSZWZfUmVzb3VyY2VFbnZSZWZUeXBlKCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgInJlc291cmNlRW52UmVmVHlwZSIsIG51bGwsIDAsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUVudlJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUVudlJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRW52UmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhyZXNvdXJjZVJlZkVDbGFzcywgUmVzb3VyY2VSZWYuY2xhc3MsICJSZXNvdXJjZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX1Jlc1JlZk5hbWUoKSwgdGhpcy5nZXRKTkRJTmFtZSgpLCAicmVzUmVmTmFtZSIsIG51bGwsIDEsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9SZXNUeXBlKCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgInJlc1R5cGUiLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfUmVzQXV0aCgpLCB0aGlzLmdldFJlc0F1dGhUeXBlKCksICJyZXNBdXRoIiwgIkFwcGxpY2F0aW9uIiwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9SZXNTaGFyaW5nU2NvcGUoKSwgdGhpcy5nZXRSZXNTaGFyaW5nU2NvcGVUeXBlKCksICJyZXNTaGFyaW5nU2NvcGUiLCAiU2hhcmVhYmxlIiwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZVJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhydW5Bc0VDbGFzcywgUnVuQXMuY2xhc3MsICJSdW5BcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSdW5Bc19EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFJ1bkFzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJ1bkFzX1JvbGVOYW1lKCksIHRoaXMuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lIiwgbnVsbCwgMSwgMSwgUnVuQXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJ1bkFzX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFJ1bkFzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eVJvbGVFQ2xhc3MsIFNlY3VyaXR5Um9sZS5jbGFzcywgIlNlY3VyaXR5Um9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eVJvbGVfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eVJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCksIHRoaXMuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lIiwgbnVsbCwgMSwgMSwgU2VjdXJpdHlSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVJvbGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eVJvbGVSZWZFQ2xhc3MsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIlNlY3VyaXR5Um9sZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlUmVmX1JvbGVOYW1lKCksIHRoaXMuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lIiwgbnVsbCwgMSwgMSwgU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVJvbGVSZWZfUm9sZUxpbmsoKSwgdGhpcy5nZXRSb2xlTmFtZSgpLCAicm9sZUxpbmsiLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Um9sZVJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHNlcnZpY2VSZWZFQ2xhc3MsIFNlcnZpY2VSZWYuY2xhc3MsICJTZXJ2aWNlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfRGlzcGxheU5hbWVzKCksIHRoaXMuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfSWNvbnMoKSwgdGhpcy5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKSwgdGhpcy5nZXRKTkRJTmFtZSgpLCAic2VydmljZVJlZk5hbWUiLCBudWxsLCAxLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAic2VydmljZUludGVyZmFjZSIsIG51bGwsIDEsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfU2VydmljZVJlZlR5cGUoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAic2VydmljZVJlZlR5cGUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX1dzZGxGaWxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEFueVVSSSgpLCAid3NkbEZpbGUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX0pheHJwY01hcHBpbmdGaWxlKCksIHRoaXMuZ2V0UGF0aFR5cGUoKSwgImpheHJwY01hcHBpbmdGaWxlIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0UU5hbWUoKSwgInNlcnZpY2VRbmFtZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfUG9ydENvbXBvbmVudFJlZnMoKSwgdGhpcy5nZXRQb3J0Q29tcG9uZW50UmVmKCksIG51bGwsICJwb3J0Q29tcG9uZW50UmVmcyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSwgdGhpcy5nZXRTZXJ2aWNlUmVmSGFuZGxlcigpLCBudWxsLCAiaGFuZGxlcnMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmX0hhbmRsZXJDaGFpbnMoKSwgdGhpcy5nZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWlucygpLCBudWxsLCAiaGFuZGxlckNoYWlucyIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfSW5qZWN0aW9uVGFyZ2V0cygpLCB0aGlzLmdldEluamVjdGlvblRhcmdldCgpLCBudWxsLCAiaW5qZWN0aW9uVGFyZ2V0cyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Moc2VydmljZVJlZkhhbmRsZXJFQ2xhc3MsIFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCAiU2VydmljZVJlZkhhbmRsZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmSGFuZGxlcl9EaXNwbGF5TmFtZXMoKSwgdGhpcy5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZIYW5kbGVyX0ljb25zKCksIHRoaXMuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJfSGFuZGxlck5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImhhbmRsZXJOYW1lIiwgbnVsbCwgMSwgMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyX0hhbmRsZXJDbGFzcygpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJoYW5kbGVyQ2xhc3MiLCBudWxsLCAxLCAxLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJfSW5pdFBhcmFtcygpLCB0aGlzLmdldFBhcmFtVmFsdWUoKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJfU29hcEhlYWRlcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0UU5hbWUoKSwgInNvYXBIZWFkZXJzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmSGFuZGxlcl9Tb2FwUm9sZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInNvYXBSb2xlcyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJfUG9ydE5hbWVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJwb3J0TmFtZXMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZXJ2aWNlUmVmSGFuZGxlckNoYWluRUNsYXNzLCBTZXJ2aWNlUmVmSGFuZGxlckNoYWluLmNsYXNzLCAiU2VydmljZVJlZkhhbmRsZXJDaGFpbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1NlcnZpY2VOYW1lUGF0dGVybigpLCB0aGlzLmdldFNlcnZpY2VSZWZRbmFtZVBhdHRlcm4oKSwgInNlcnZpY2VOYW1lUGF0dGVybiIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fUG9ydE5hbWVQYXR0ZXJuKCksIHRoaXMuZ2V0U2VydmljZVJlZlFuYW1lUGF0dGVybigpLCAicG9ydE5hbWVQYXR0ZXJuIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9Qcm90b2NvbEJpbmRpbmdzKCksIHRoaXMuZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlKCksICJwcm90b2NvbEJpbmRpbmdzIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9IYW5kbGVycygpLCB0aGlzLmdldFNlcnZpY2VSZWZIYW5kbGVyKCksIG51bGwsICJoYW5kbGVycyIsIG51bGwsIDEsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlckNoYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Moc2VydmljZVJlZkhhbmRsZXJDaGFpbnNFQ2xhc3MsIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zLmNsYXNzLCAiU2VydmljZVJlZkhhbmRsZXJDaGFpbnMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnNfSGFuZGxlckNoYWlucygpLCB0aGlzLmdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKSwgbnVsbCwgImhhbmRsZXJDaGFpbnMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnNfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHVybFBhdHRlcm5UeXBlRUNsYXNzLCBVcmxQYXR0ZXJuVHlwZS5jbGFzcywgIlVybFBhdHRlcm5UeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFVybFBhdHRlcm5UeXBlX1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBVcmxQYXR0ZXJuVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oZWpiUmVmVHlwZUVFbnVtLCBFamJSZWZUeXBlLmNsYXNzLCAiRWpiUmVmVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChlamJSZWZUeXBlRUVudW0sIEVqYlJlZlR5cGUuRU5USVRZX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZWpiUmVmVHlwZUVFbnVtLCBFamJSZWZUeXBlLlNFU1NJT05fTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuY2xhc3MsICJFbnZFbnRyeVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5KQVZBX0xBTkdfQk9PTEVBTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuSkFWQV9MQU5HX0JZVEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkpBVkFfTEFOR19DSEFSQUNURVJfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkpBVkFfTEFOR19TVFJJTkdfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkpBVkFfTEFOR19TSE9SVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuSkFWQV9MQU5HX0lOVEVHRVJfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkpBVkFfTEFOR19MT05HX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5KQVZBX0xBTkdfRkxPQVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkpBVkFfTEFOR19ET1VCTEVfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwobWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0sIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5DT05TVU1FU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuUFJPRFVDRVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bSwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLkNPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShwZXJzaXN0ZW5jZUNvbnRleHRUeXBlRUVudW0sIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUuY2xhc3MsICJQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFRW51bSwgUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5UUkFOU0FDVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFRW51bSwgUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5FWFRFTkRFRF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0ocmVzQXV0aFR5cGVFRW51bSwgUmVzQXV0aFR5cGUuY2xhc3MsICJSZXNBdXRoVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoVHlwZUVFbnVtLCBSZXNBdXRoVHlwZS5BUFBMSUNBVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc0F1dGhUeXBlRUVudW0sIFJlc0F1dGhUeXBlLkNPTlRBSU5FUl9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0ocmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtLCBSZXNTaGFyaW5nU2NvcGVUeXBlLmNsYXNzLCAiUmVzU2hhcmluZ1Njb3BlVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChyZXNTaGFyaW5nU2NvcGVUeXBlRUVudW0sIFJlc1NoYXJpbmdTY29wZVR5cGUuU0hBUkVBQkxFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtLCBSZXNTaGFyaW5nU2NvcGVUeXBlLlVOU0hBUkVBQkxFX0xJVEVSQUwpOwotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKGRld2V5VmVyc2lvblR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkRld2V5VmVyc2lvblR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZWpiTGlua0VEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiRUpCTGluayIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShlamJSZWZOYW1lVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiRWpiUmVmTmFtZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZWpiUmVmVHlwZU9iamVjdEVEYXRhVHlwZSwgRWpiUmVmVHlwZS5jbGFzcywgIkVqYlJlZlR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShlbnZFbnRyeVR5cGVPYmplY3RFRGF0YVR5cGUsIEVudkVudHJ5VHlwZS5jbGFzcywgIkVudkVudHJ5VHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJGdWxseVF1YWxpZmllZENsYXNzVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShob21lRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJIb21lIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGphdmFJZGVudGlmaWVyRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJKYXZhSWRlbnRpZmllciIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShqYXZhVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiSmF2YVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoam5kaU5hbWVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkpORElOYW1lIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGxvY2FsRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJMb2NhbCIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShsb2NhbEhvbWVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkxvY2FsSG9tZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShtZXNzYWdlRGVzdGluYXRpb25MaW5rRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb25MaW5rIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKG1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3RFRGF0YVR5cGUsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHBhdGhUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJQYXRoVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShwZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0RURhdGFUeXBlLCBQZXJzaXN0ZW5jZUNvbnRleHRUeXBlLmNsYXNzLCAiUGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHJlbW90ZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiUmVtb3RlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHJlc0F1dGhUeXBlT2JqZWN0RURhdGFUeXBlLCBSZXNBdXRoVHlwZS5jbGFzcywgIlJlc0F1dGhUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUocmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdEVEYXRhVHlwZSwgUmVzU2hhcmluZ1Njb3BlVHlwZS5jbGFzcywgIlJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShyb2xlTmFtZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiUm9sZU5hbWUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoc2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlRURhdGFUeXBlLCBMaXN0LmNsYXNzLCAiU2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShzZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIlNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShzZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHRydWVGYWxzZVR5cGVFRGF0YVR5cGUsIGJvb2xlYW4uY2xhc3MsICJUcnVlRmFsc2VUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHRydWVGYWxzZVR5cGVPYmplY3RFRGF0YVR5cGUsIEJvb2xlYW4uY2xhc3MsICJUcnVlRmFsc2VUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKLQkJLy8gaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhCi0JCWNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpOworCQlib29sZWFuIGhhc0xvY2sgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCWhhc0xvY2sgPSBKMkVFSW5pdC5hcXVpcmVJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJfQkJCisJCQorCQl0cnl7CisJCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCisJCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQkJaW5pdEVDbGFzcyhhZGRyZXNzaW5nVHlwZUVDbGFzcywgQWRkcmVzc2luZ1R5cGUuY2xhc3MsICJBZGRyZXNzaW5nVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWRkcmVzc2luZ1R5cGVfRW5hYmxlZCgpLCB0aGlzLmdldFRydWVGYWxzZVR5cGUoKSwgImVuYWJsZWQiLCBudWxsLCAwLCAxLCBBZGRyZXNzaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBZGRyZXNzaW5nVHlwZV9SZXF1aXJlZCgpLCB0aGlzLmdldFRydWVGYWxzZVR5cGUoKSwgInJlcXVpcmVkIiwgbnVsbCwgMCwgMSwgQWRkcmVzc2luZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWRkcmVzc2luZ1R5cGVfUmVzcG9uc2VzKCksIHRoaXMuZ2V0QWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUoKSwgInJlc3BvbnNlcyIsIG51bGwsIDAsIDEsIEFkZHJlc3NpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoZGF0YVNvdXJjZVR5cGVFQ2xhc3MsIERhdGFTb3VyY2VUeXBlLmNsYXNzLCAiRGF0YVNvdXJjZVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldERhdGFTb3VyY2VUeXBlX0Rlc2NyaXB0aW9uKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgRGF0YVNvdXJjZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldERhdGFTb3VyY2VUeXBlX05hbWUoKSwgdGhpcy5nZXRKTkRJTmFtZSgpLCAibmFtZSIsIG51bGwsIDEsIDEsIERhdGFTb3VyY2VUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhU291cmNlVHlwZV9DbGFzc05hbWUoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiY2xhc3NOYW1lIiwgbnVsbCwgMCwgMSwgRGF0YVNvdXJjZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldERhdGFTb3VyY2VUeXBlX1NlcnZlck5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzZXJ2ZXJOYW1lIiwgbnVsbCwgMCwgMSwgRGF0YVNvdXJjZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldERhdGFTb3VyY2VUeXBlX1BvcnROdW1iZXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50ZWdlcigpLCAicG9ydE51bWJlciIsIG51bGwsIDAsIDEsIERhdGFTb3VyY2VUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhU291cmNlVHlwZV9EYXRhYmFzZU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkYXRhYmFzZU5hbWUiLCBudWxsLCAwLCAxLCBEYXRhU291cmNlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGF0YVNvdXJjZVR5cGVfVXJsKCksIHRoaXMuZ2V0SmRiY1VybFR5cGUoKSwgInVybCIsIG51bGwsIDAsIDEsIERhdGFTb3VyY2VUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhU291cmNlVHlwZV9Vc2VyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidXNlciIsIG51bGwsIDAsIDEsIERhdGFTb3VyY2VUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhU291cmNlVHlwZV9QYXNzd29yZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBhc3N3b3JkIiwgbnVsbCwgMCwgMSwgRGF0YVNvdXJjZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldERhdGFTb3VyY2VUeXBlX1Byb3BlcnR5KCksIHRoaXMuZ2V0UHJvcGVydHlUeXBlKCksIG51bGwsICJwcm9wZXJ0eSIsIG51bGwsIDAsIC0xLCBEYXRhU291cmNlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGF0YVNvdXJjZVR5cGVfTG9naW5UaW1lb3V0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludGVnZXIoKSwgImxvZ2luVGltZW91dCIsIG51bGwsIDAsIDEsIERhdGFTb3VyY2VUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhU291cmNlVHlwZV9UcmFuc2FjdGlvbmFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgInRyYW5zYWN0aW9uYWwiLCBudWxsLCAwLCAxLCBEYXRhU291cmNlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhU291cmNlVHlwZV9Jc29sYXRpb25MZXZlbCgpLCB0aGlzLmdldElzb2xhdGlvbkxldmVsVHlwZSgpLCAiaXNvbGF0aW9uTGV2ZWwiLCBudWxsLCAwLCAxLCBEYXRhU291cmNlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhU291cmNlVHlwZV9Jbml0aWFsUG9vbFNpemUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50ZWdlcigpLCAiaW5pdGlhbFBvb2xTaXplIiwgbnVsbCwgMCwgMSwgRGF0YVNvdXJjZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldERhdGFTb3VyY2VUeXBlX01heFBvb2xTaXplKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludGVnZXIoKSwgIm1heFBvb2xTaXplIiwgbnVsbCwgMCwgMSwgRGF0YVNvdXJjZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldERhdGFTb3VyY2VUeXBlX01pblBvb2xTaXplKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludGVnZXIoKSwgIm1pblBvb2xTaXplIiwgbnVsbCwgMCwgMSwgRGF0YVNvdXJjZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldERhdGFTb3VyY2VUeXBlX01heElkbGVUaW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludGVnZXIoKSwgIm1heElkbGVUaW1lIiwgbnVsbCwgMCwgMSwgRGF0YVNvdXJjZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldERhdGFTb3VyY2VUeXBlX01heFN0YXRlbWVudHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50ZWdlcigpLCAibWF4U3RhdGVtZW50cyIsIG51bGwsIDAsIDEsIERhdGFTb3VyY2VUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXREYXRhU291cmNlVHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBEYXRhU291cmNlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGRlc2NyaXB0aW9uRUNsYXNzLCBEZXNjcmlwdGlvbi5jbGFzcywgIkRlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmlwdGlvbl9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldERlc2NyaXB0aW9uX0xhbmcoKSwgdGhlWE1MTmFtZXNwYWNlUGFja2FnZS5nZXRMYW5nVHlwZSgpLCAibGFuZyIsIG51bGwsIDAsIDEsIERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGRpc3BsYXlOYW1lRUNsYXNzLCBEaXNwbGF5TmFtZS5jbGFzcywgIkRpc3BsYXlOYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXREaXNwbGF5TmFtZV9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgRGlzcGxheU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldERpc3BsYXlOYW1lX0xhbmcoKSwgdGhlWE1MTmFtZXNwYWNlUGFja2FnZS5nZXRMYW5nVHlwZSgpLCAibGFuZyIsIG51bGwsIDAsIDEsIERpc3BsYXlOYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGVqYkxvY2FsUmVmRUNsYXNzLCBFamJMb2NhbFJlZi5jbGFzcywgIkVqYkxvY2FsUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFamJMb2NhbFJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9FamJSZWZOYW1lKCksIHRoaXMuZ2V0RWpiUmVmTmFtZVR5cGUoKSwgImVqYlJlZk5hbWUiLCBudWxsLCAxLCAxLCBFamJMb2NhbFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiTG9jYWxSZWZfRWpiUmVmVHlwZSgpLCB0aGlzLmdldEVqYlJlZlR5cGUoKSwgImVqYlJlZlR5cGUiLCBudWxsLCAwLCAxLCBFamJMb2NhbFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9Mb2NhbEhvbWUoKSwgdGhpcy5nZXRMb2NhbEhvbWUoKSwgImxvY2FsSG9tZSIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9Mb2NhbCgpLCB0aGlzLmdldExvY2FsKCksICJsb2NhbCIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9FamJMaW5rKCksIHRoaXMuZ2V0RUpCTGluaygpLCAiZWpiTGluayIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFamJMb2NhbFJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9Mb29rdXBOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibG9va3VwTmFtZSIsIG51bGwsIDAsIDEsIEVqYkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFamJMb2NhbFJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFamJMb2NhbFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGVqYlJlZkVDbGFzcywgRWpiUmVmLmNsYXNzLCAiRWpiUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFamJSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9FamJSZWZOYW1lKCksIHRoaXMuZ2V0RWpiUmVmTmFtZVR5cGUoKSwgImVqYlJlZk5hbWUiLCBudWxsLCAxLCAxLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9FamJSZWZUeXBlKCksIHRoaXMuZ2V0RWpiUmVmVHlwZSgpLCAiZWpiUmVmVHlwZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfSG9tZSgpLCB0aGlzLmdldEhvbWUoKSwgImhvbWUiLCBudWxsLCAwLCAxLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9SZW1vdGUoKSwgdGhpcy5nZXRSZW1vdGUoKSwgInJlbW90ZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX0VqYkxpbmsoKSwgdGhpcy5nZXRFSkJMaW5rKCksICJlamJMaW5rIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVqYlJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX0xvb2t1cE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJsb29rdXBOYW1lIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoZW1wdHlUeXBlRUNsYXNzLCBFbXB0eVR5cGUuY2xhc3MsICJFbXB0eVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVtcHR5VHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFbXB0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhlbnZFbnRyeUVDbGFzcywgRW52RW50cnkuY2xhc3MsICJFbnZFbnRyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW52RW50cnlfRW52RW50cnlOYW1lKCksIHRoaXMuZ2V0Sk5ESU5hbWUoKSwgImVudkVudHJ5TmFtZSIsIG51bGwsIDEsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9FbnZFbnRyeVR5cGUoKSwgdGhpcy5nZXRFbnZFbnRyeVR5cGUoKSwgImVudkVudHJ5VHlwZSIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9FbnZFbnRyeVZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZW52RW50cnlWYWx1ZSIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFbnZFbnRyeV9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9Mb29rdXBOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibG9va3VwTmFtZSIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGljb25FQ2xhc3MsIEljb24uY2xhc3MsICJJY29uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRJY29uX1NtYWxsSWNvbigpLCB0aGlzLmdldFBhdGhUeXBlKCksICJzbWFsbEljb24iLCBudWxsLCAwLCAxLCBJY29uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRJY29uX0xhcmdlSWNvbigpLCB0aGlzLmdldFBhdGhUeXBlKCksICJsYXJnZUljb24iLCBudWxsLCAwLCAxLCBJY29uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRJY29uX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEljb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvbl9MYW5nKCksIHRoZVhNTE5hbWVzcGFjZVBhY2thZ2UuZ2V0TGFuZ1R5cGUoKSwgImxhbmciLCBudWxsLCAwLCAxLCBJY29uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGluamVjdGlvblRhcmdldEVDbGFzcywgSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCAiSW5qZWN0aW9uVGFyZ2V0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRJbmplY3Rpb25UYXJnZXRfSW5qZWN0aW9uVGFyZ2V0Q2xhc3MoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiaW5qZWN0aW9uVGFyZ2V0Q2xhc3MiLCBudWxsLCAxLCAxLCBJbmplY3Rpb25UYXJnZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEluamVjdGlvblRhcmdldF9JbmplY3Rpb25UYXJnZXROYW1lKCksIHRoaXMuZ2V0SmF2YUlkZW50aWZpZXIoKSwgImluamVjdGlvblRhcmdldE5hbWUiLCBudWxsLCAxLCAxLCBJbmplY3Rpb25UYXJnZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MobGlmZWN5Y2xlQ2FsbGJhY2tFQ2xhc3MsIExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCAiTGlmZWN5Y2xlQ2FsbGJhY2siLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldExpZmVjeWNsZUNhbGxiYWNrX0xpZmVjeWNsZUNhbGxiYWNrQ2xhc3MoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAibGlmZWN5Y2xlQ2FsbGJhY2tDbGFzcyIsIG51bGwsIDAsIDEsIExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRMaWZlY3ljbGVDYWxsYmFja19MaWZlY3ljbGVDYWxsYmFja01ldGhvZCgpLCB0aGlzLmdldEphdmFJZGVudGlmaWVyKCksICJsaWZlY3ljbGVDYWxsYmFja01ldGhvZCIsIG51bGwsIDEsIDEsIExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGxpc3RlbmVyRUNsYXNzLCBMaXN0ZW5lci5jbGFzcywgIkxpc3RlbmVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRMaXN0ZW5lcl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIExpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRMaXN0ZW5lcl9EaXNwbGF5TmFtZXMoKSwgdGhpcy5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIExpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRMaXN0ZW5lcl9JY29ucygpLCB0aGlzLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIExpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRMaXN0ZW5lcl9MaXN0ZW5lckNsYXNzKCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImxpc3RlbmVyQ2xhc3MiLCBudWxsLCAxLCAxLCBMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlzdGVuZXJfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhtZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MsIE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRGVzdGluYXRpb25fRGlzcGxheU5hbWVzKCksIHRoaXMuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9JY29ucygpLCB0aGlzLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uX01lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgIm1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUiLCBudWxsLCAxLCAxLCBNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uX0xvb2t1cE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJsb29rdXBOYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb25SZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblJlZk5hbWUoKSwgdGhpcy5nZXRKTkRJTmFtZSgpLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSIsIG51bGwsIDEsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblR5cGUoKSwgdGhpcy5nZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSgpLCAibWVzc2FnZURlc3RpbmF0aW9uVHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlKCksIHRoaXMuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCksICJtZXNzYWdlRGVzdGluYXRpb25Vc2FnZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTWVzc2FnZURlc3RpbmF0aW9uTGluaygpLCB0aGlzLmdldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSwgIm1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsiLCBudWxsLCAwLCAxLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0luamVjdGlvblRhcmdldHMoKSwgdGhpcy5nZXRJbmplY3Rpb25UYXJnZXQoKSwgbnVsbCwgImluamVjdGlvblRhcmdldHMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTG9va3VwTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImxvb2t1cE5hbWUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhwYXJhbVZhbHVlRUNsYXNzLCBQYXJhbVZhbHVlLmNsYXNzLCAiUGFyYW1WYWx1ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFBhcmFtVmFsdWVfUGFyYW1OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJwYXJhbU5hbWUiLCBudWxsLCAxLCAxLCBQYXJhbVZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRQYXJhbVZhbHVlX1BhcmFtVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwYXJhbVZhbHVlIiwgbnVsbCwgMSwgMSwgUGFyYW1WYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFyYW1WYWx1ZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBQYXJhbVZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MocGVyc2lzdGVuY2VDb250ZXh0UmVmRUNsYXNzLCBQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsICJQZXJzaXN0ZW5jZUNvbnRleHRSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlQ29udGV4dFJlZk5hbWUoKSwgdGhpcy5nZXRKTkRJTmFtZSgpLCAicGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSIsIG51bGwsIDEsIDEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX1BlcnNpc3RlbmNlVW5pdE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInBlcnNpc3RlbmNlVW5pdE5hbWUiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9QZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCksIHRoaXMuZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZSgpLCAicGVyc2lzdGVuY2VDb250ZXh0VHlwZSIsIG51bGwsIDAsIDEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfUGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0UHJvcGVydHlUeXBlKCksIG51bGwsICJwZXJzaXN0ZW5jZVByb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZfTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHBlcnNpc3RlbmNlVW5pdFJlZkVDbGFzcywgUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCAiUGVyc2lzdGVuY2VVbml0UmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlVW5pdFJlZl9QZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCksIHRoaXMuZ2V0Sk5ESU5hbWUoKSwgInBlcnNpc3RlbmNlVW5pdFJlZk5hbWUiLCBudWxsLCAxLCAxLCBQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFBlcnNpc3RlbmNlVW5pdFJlZl9QZXJzaXN0ZW5jZVVuaXROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJwZXJzaXN0ZW5jZVVuaXROYW1lIiwgbnVsbCwgMCwgMSwgUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRQZXJzaXN0ZW5jZVVuaXRSZWZfTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFBlcnNpc3RlbmNlVW5pdFJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGVyc2lzdGVuY2VVbml0UmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHBvcnRDb21wb25lbnRSZWZFQ2xhc3MsIFBvcnRDb21wb25lbnRSZWYuY2xhc3MsICJQb3J0Q29tcG9uZW50UmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50UmVmX0VuYWJsZU10b20oKSwgdGhpcy5nZXRUcnVlRmFsc2VUeXBlKCksICJlbmFibGVNdG9tIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50UmVmX010b21UaHJlc2hvbGQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Tm9uTmVnYXRpdmVJbnRlZ2VyKCksICJtdG9tVGhyZXNob2xkIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudFJlZl9BZGRyZXNzaW5nKCksIHRoaXMuZ2V0QWRkcmVzc2luZ1R5cGUoKSwgbnVsbCwgImFkZHJlc3NpbmciLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50UmVmX1Jlc3BlY3RCaW5kaW5nKCksIHRoaXMuZ2V0UmVzcGVjdEJpbmRpbmdUeXBlKCksIG51bGwsICJyZXNwZWN0QmluZGluZyIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnRSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInBvcnRDb21wb25lbnRMaW5rIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudFJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MocHJvcGVydHlUeXBlRUNsYXNzLCBQcm9wZXJ0eVR5cGUuY2xhc3MsICJQcm9wZXJ0eVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5VHlwZV9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFByb3BlcnR5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvcGVydHlUeXBlX1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAxLCAxLCBQcm9wZXJ0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFByb3BlcnR5VHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBQcm9wZXJ0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhyZXNvdXJjZUVudlJlZkVDbGFzcywgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICJSZXNvdXJjZUVudlJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VFbnZSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZUVudlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VFbnZSZWZfUmVzb3VyY2VFbnZSZWZOYW1lKCksIHRoaXMuZ2V0Sk5ESU5hbWUoKSwgInJlc291cmNlRW52UmVmTmFtZSIsIG51bGwsIDEsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUVudlJlZl9SZXNvdXJjZUVudlJlZlR5cGUoKSwgdGhpcy5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAicmVzb3VyY2VFbnZSZWZUeXBlIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRW52UmVmX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlRW52UmVmX0luamVjdGlvblRhcmdldHMoKSwgdGhpcy5nZXRJbmplY3Rpb25UYXJnZXQoKSwgbnVsbCwgImluamVjdGlvblRhcmdldHMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRW52UmVmX0xvb2t1cE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJsb29rdXBOYW1lIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRW52UmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MocmVzb3VyY2VSZWZFQ2xhc3MsIFJlc291cmNlUmVmLmNsYXNzLCAiUmVzb3VyY2VSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX1Jlc1JlZk5hbWUoKSwgdGhpcy5nZXRKTkRJTmFtZSgpLCAicmVzUmVmTmFtZSIsIG51bGwsIDEsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9SZXNUeXBlKCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgInJlc1R5cGUiLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfUmVzQXV0aCgpLCB0aGlzLmdldFJlc0F1dGhUeXBlKCksICJyZXNBdXRoIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfUmVzU2hhcmluZ1Njb3BlKCksIHRoaXMuZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpLCAicmVzU2hhcmluZ1Njb3BlIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VSZWZfSW5qZWN0aW9uVGFyZ2V0cygpLCB0aGlzLmdldEluamVjdGlvblRhcmdldCgpLCBudWxsLCAiaW5qZWN0aW9uVGFyZ2V0cyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfTG9va3VwTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImxvb2t1cE5hbWUiLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhyZXNwZWN0QmluZGluZ1R5cGVFQ2xhc3MsIFJlc3BlY3RCaW5kaW5nVHlwZS5jbGFzcywgIlJlc3BlY3RCaW5kaW5nVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzcGVjdEJpbmRpbmdUeXBlX0VuYWJsZWQoKSwgdGhpcy5nZXRUcnVlRmFsc2VUeXBlKCksICJlbmFibGVkIiwgbnVsbCwgMCwgMSwgUmVzcGVjdEJpbmRpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MocnVuQXNFQ2xhc3MsIFJ1bkFzLmNsYXNzLCAiUnVuQXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJ1bkFzX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUnVuQXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJ1bkFzX1JvbGVOYW1lKCksIHRoaXMuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lIiwgbnVsbCwgMSwgMSwgUnVuQXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJ1bkFzX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFJ1bkFzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Moc2VjdXJpdHlSb2xlRUNsYXNzLCBTZWN1cml0eVJvbGUuY2xhc3MsICJTZWN1cml0eVJvbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Um9sZV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5Um9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCksIHRoaXMuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lIiwgbnVsbCwgMSwgMSwgU2VjdXJpdHlSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVJvbGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Moc2VjdXJpdHlSb2xlUmVmRUNsYXNzLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICJTZWN1cml0eVJvbGVSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlUmVmX1JvbGVOYW1lKCksIHRoaXMuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lIiwgbnVsbCwgMSwgMSwgU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVJvbGVSZWZfUm9sZUxpbmsoKSwgdGhpcy5nZXRSb2xlTmFtZSgpLCAicm9sZUxpbmsiLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Um9sZVJlZl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhzZXJ2aWNlUmVmRUNsYXNzLCBTZXJ2aWNlUmVmLmNsYXNzLCAiU2VydmljZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfRGlzcGxheU5hbWVzKCksIHRoaXMuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmX0ljb25zKCksIHRoaXMuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmTmFtZSgpLCB0aGlzLmdldEpORElOYW1lKCksICJzZXJ2aWNlUmVmTmFtZSIsIG51bGwsIDEsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJzZXJ2aWNlSW50ZXJmYWNlIiwgbnVsbCwgMSwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmVHlwZSgpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJzZXJ2aWNlUmVmVHlwZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0QW55VVJJKCksICJ3c2RsRmlsZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKSwgdGhpcy5nZXRQYXRoVHlwZSgpLCAiamF4cnBjTWFwcGluZ0ZpbGUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRRTmFtZSgpLCAic2VydmljZVFuYW1lIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpLCB0aGlzLmdldFBvcnRDb21wb25lbnRSZWYoKSwgbnVsbCwgInBvcnRDb21wb25lbnRSZWZzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSwgdGhpcy5nZXRTZXJ2aWNlUmVmSGFuZGxlcigpLCBudWxsLCAiaGFuZGxlcnMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9IYW5kbGVyQ2hhaW5zKCksIHRoaXMuZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnMoKSwgbnVsbCwgImhhbmRsZXJDaGFpbnMiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9JbmplY3Rpb25UYXJnZXRzKCksIHRoaXMuZ2V0SW5qZWN0aW9uVGFyZ2V0KCksIG51bGwsICJpbmplY3Rpb25UYXJnZXRzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfTG9va3VwTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImxvb2t1cE5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhzZXJ2aWNlUmVmSGFuZGxlckVDbGFzcywgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICJTZXJ2aWNlUmVmSGFuZGxlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJfRGlzcGxheU5hbWVzKCksIHRoaXMuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJfSWNvbnMoKSwgdGhpcy5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJfSGFuZGxlck5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImhhbmRsZXJOYW1lIiwgbnVsbCwgMSwgMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyX0hhbmRsZXJDbGFzcygpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJoYW5kbGVyQ2xhc3MiLCBudWxsLCAxLCAxLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJfSW5pdFBhcmFtcygpLCB0aGlzLmdldFBhcmFtVmFsdWUoKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyX1NvYXBIZWFkZXJzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFFOYW1lKCksICJzb2FwSGVhZGVycyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyX1NvYXBSb2xlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAic29hcFJvbGVzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJfUG9ydE5hbWVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJwb3J0TmFtZXMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmSGFuZGxlcl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5FQ2xhc3MsIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4uY2xhc3MsICJTZXJ2aWNlUmVmSGFuZGxlckNoYWluIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX1NlcnZpY2VOYW1lUGF0dGVybigpLCB0aGlzLmdldFFuYW1lUGF0dGVybigpLCAic2VydmljZU5hbWVQYXR0ZXJuIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9Qb3J0TmFtZVBhdHRlcm4oKSwgdGhpcy5nZXRRbmFtZVBhdHRlcm4oKSwgInBvcnROYW1lUGF0dGVybiIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5fUHJvdG9jb2xCaW5kaW5ncygpLCB0aGlzLmdldFByb3RvY29sQmluZGluZ0xpc3RUeXBlKCksICJwcm90b2NvbEJpbmRpbmdzIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbl9IYW5kbGVycygpLCB0aGlzLmdldFNlcnZpY2VSZWZIYW5kbGVyKCksIG51bGwsICJoYW5kbGVycyIsIG51bGwsIDEsIC0xLCBTZXJ2aWNlUmVmSGFuZGxlckNoYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWluX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhzZXJ2aWNlUmVmSGFuZGxlckNoYWluc0VDbGFzcywgU2VydmljZVJlZkhhbmRsZXJDaGFpbnMuY2xhc3MsICJTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZkhhbmRsZXJDaGFpbnNfSGFuZGxlckNoYWlucygpLCB0aGlzLmdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKSwgbnVsbCwgImhhbmRsZXJDaGFpbnMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZkhhbmRsZXJDaGFpbnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3ModXJsUGF0dGVyblR5cGVFQ2xhc3MsIFVybFBhdHRlcm5UeXBlLmNsYXNzLCAiVXJsUGF0dGVyblR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFVybFBhdHRlcm5UeXBlX1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBVcmxQYXR0ZXJuVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKKwkJCWluaXRFRW51bShhZGRyZXNzaW5nUmVzcG9uc2VzVHlwZUVFbnVtLCBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZS5jbGFzcywgIkFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChhZGRyZXNzaW5nUmVzcG9uc2VzVHlwZUVFbnVtLCBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZS5BTk9OWU1PVVMpOworCQkJYWRkRUVudW1MaXRlcmFsKGFkZHJlc3NpbmdSZXNwb25zZXNUeXBlRUVudW0sIEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlLk5PTkFOT05ZTU9VUyk7CisJCQlhZGRFRW51bUxpdGVyYWwoYWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGVFRW51bSwgQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUuQUxMKTsKKwkKKwkJCWluaXRFRW51bShlamJSZWZUeXBlRUVudW0sIEVqYlJlZlR5cGUuY2xhc3MsICJFamJSZWZUeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChlamJSZWZUeXBlRUVudW0sIEVqYlJlZlR5cGUuRU5USVRZX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGVqYlJlZlR5cGVFRW51bSwgRWpiUmVmVHlwZS5TRVNTSU9OX0xJVEVSQUwpOworCQorCQkJaW5pdEVFbnVtKGdlbmVyaWNCb29sZWFuVHlwZUVFbnVtLCBHZW5lcmljQm9vbGVhblR5cGUuY2xhc3MsICJHZW5lcmljQm9vbGVhblR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKGdlbmVyaWNCb29sZWFuVHlwZUVFbnVtLCBHZW5lcmljQm9vbGVhblR5cGUuVFJVRSk7CisJCQlhZGRFRW51bUxpdGVyYWwoZ2VuZXJpY0Jvb2xlYW5UeXBlRUVudW0sIEdlbmVyaWNCb29sZWFuVHlwZS5GQUxTRSk7CisJCQlhZGRFRW51bUxpdGVyYWwoZ2VuZXJpY0Jvb2xlYW5UeXBlRUVudW0sIEdlbmVyaWNCb29sZWFuVHlwZS5ZRVMpOworCQkJYWRkRUVudW1MaXRlcmFsKGdlbmVyaWNCb29sZWFuVHlwZUVFbnVtLCBHZW5lcmljQm9vbGVhblR5cGUuTk8pOworCQorCQkJaW5pdEVFbnVtKGlzb2xhdGlvbkxldmVsVHlwZUVFbnVtLCBJc29sYXRpb25MZXZlbFR5cGUuY2xhc3MsICJJc29sYXRpb25MZXZlbFR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKGlzb2xhdGlvbkxldmVsVHlwZUVFbnVtLCBJc29sYXRpb25MZXZlbFR5cGUuVFJBTlNBQ1RJT05SRUFEVU5DT01NSVRURUQpOworCQkJYWRkRUVudW1MaXRlcmFsKGlzb2xhdGlvbkxldmVsVHlwZUVFbnVtLCBJc29sYXRpb25MZXZlbFR5cGUuVFJBTlNBQ1RJT05SRUFEQ09NTUlUVEVEKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChpc29sYXRpb25MZXZlbFR5cGVFRW51bSwgSXNvbGF0aW9uTGV2ZWxUeXBlLlRSQU5TQUNUSU9OUkVQRUFUQUJMRVJFQUQpOworCQkJYWRkRUVudW1MaXRlcmFsKGlzb2xhdGlvbkxldmVsVHlwZUVFbnVtLCBJc29sYXRpb25MZXZlbFR5cGUuVFJBTlNBQ1RJT05TRVJJQUxJWkFCTEUpOworCQorCQkJaW5pdEVFbnVtKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuQ09OU1VNRVNfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwobWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0sIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5QUk9EVUNFU19MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bSwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLkNPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUwpOworCQorCQkJaW5pdEVFbnVtKHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFRW51bSwgUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5jbGFzcywgIlBlcnNpc3RlbmNlQ29udGV4dFR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFRW51bSwgUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5UUkFOU0FDVElPTl9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChwZXJzaXN0ZW5jZUNvbnRleHRUeXBlRUVudW0sIFBlcnNpc3RlbmNlQ29udGV4dFR5cGUuRVhURU5ERURfTElURVJBTCk7CisJCisJCQlpbml0RUVudW0ocmVzQXV0aFR5cGVFRW51bSwgUmVzQXV0aFR5cGUuY2xhc3MsICJSZXNBdXRoVHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aFR5cGVFRW51bSwgUmVzQXV0aFR5cGUuQVBQTElDQVRJT05fTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aFR5cGVFRW51bSwgUmVzQXV0aFR5cGUuQ09OVEFJTkVSX0xJVEVSQUwpOworCQorCQkJaW5pdEVFbnVtKHJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSwgUmVzU2hhcmluZ1Njb3BlVHlwZS5jbGFzcywgIlJlc1NoYXJpbmdTY29wZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKHJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSwgUmVzU2hhcmluZ1Njb3BlVHlwZS5TSEFSRUFCTEVfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwocmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtLCBSZXNTaGFyaW5nU2NvcGVUeXBlLlVOU0hBUkVBQkxFX0xJVEVSQUwpOworCQorCQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCisJCQlpbml0RURhdGFUeXBlKGFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0RURhdGFUeXBlLCBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZS5jbGFzcywgIkFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGRld2V5VmVyc2lvblR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkRld2V5VmVyc2lvblR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGVqYkxpbmtFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkVKQkxpbmsiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGVqYlJlZk5hbWVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJFamJSZWZOYW1lVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUoZWpiUmVmVHlwZU9iamVjdEVEYXRhVHlwZSwgRWpiUmVmVHlwZS5jbGFzcywgIkVqYlJlZlR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUoZW52RW50cnlUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJFbnZFbnRyeVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJGdWxseVF1YWxpZmllZENsYXNzVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUoZ2VuZXJpY0Jvb2xlYW5UeXBlT2JqZWN0RURhdGFUeXBlLCBHZW5lcmljQm9vbGVhblR5cGUuY2xhc3MsICJHZW5lcmljQm9vbGVhblR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUoaG9tZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiSG9tZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUoaXNvbGF0aW9uTGV2ZWxUeXBlT2JqZWN0RURhdGFUeXBlLCBJc29sYXRpb25MZXZlbFR5cGUuY2xhc3MsICJJc29sYXRpb25MZXZlbFR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUoamF2YUlkZW50aWZpZXJFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkphdmFJZGVudGlmaWVyIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVEYXRhVHlwZShqYXZhVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiSmF2YVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGpkYmNVcmxUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJKZGJjVXJsVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUoam5kaU5hbWVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkpORElOYW1lIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVEYXRhVHlwZShsb2NhbEVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiTG9jYWwiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGxvY2FsSG9tZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiTG9jYWxIb21lIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVEYXRhVHlwZShtZXNzYWdlRGVzdGluYXRpb25MaW5rRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb25MaW5rIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVEYXRhVHlwZShtZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdEVEYXRhVHlwZSwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmNsYXNzLCAiTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKHBhdGhUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJQYXRoVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUocGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdEVEYXRhVHlwZSwgUGVyc2lzdGVuY2VDb250ZXh0VHlwZS5jbGFzcywgIlBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUocHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVFRGF0YVR5cGUsIExpc3QuY2xhc3MsICJQcm90b2NvbEJpbmRpbmdMaXN0VHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUocHJvdG9jb2xCaW5kaW5nVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiUHJvdG9jb2xCaW5kaW5nVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUocHJvdG9jb2xVUklBbGlhc1R5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIlByb3RvY29sVVJJQWxpYXNUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVEYXRhVHlwZShxbmFtZVBhdHRlcm5FRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIlFuYW1lUGF0dGVybiIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUocmVtb3RlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJSZW1vdGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKHJlc0F1dGhUeXBlT2JqZWN0RURhdGFUeXBlLCBSZXNBdXRoVHlwZS5jbGFzcywgIlJlc0F1dGhUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKHJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3RFRGF0YVR5cGUsIFJlc1NoYXJpbmdTY29wZVR5cGUuY2xhc3MsICJSZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKHJvbGVOYW1lRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJSb2xlTmFtZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUodHJ1ZUZhbHNlVHlwZUVEYXRhVHlwZSwgYm9vbGVhbi5jbGFzcywgIlRydWVGYWxzZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKHRydWVGYWxzZVR5cGVPYmplY3RFRGF0YVR5cGUsIEJvb2xlYW4uY2xhc3MsICJUcnVlRmFsc2VUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJLy8gQ3JlYXRlIHJlc291cmNlCisJCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwkKKwkJCS8vIENyZWF0ZSBhbm5vdGF0aW9ucworCQkJLy8gaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhCisJCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKKwkJfWZpbmFsbHl7CisJCQlpZiggaGFzTG9jayApCisJCQkJSjJFRUluaXQucmVsZWFzZUluaXRpYWxpemVQYWNrYWdlQ29udGVudHNMb2NrKCk7CisJCX0KIAl9CiAKIAkvKioKQEAgLTI5NjIsNiArMzQ5MCwyMDggQEAKIAlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKSB7CiAJCVN0cmluZyBzb3VyY2UgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIjsgLy8kTk9OLU5MUy0xJAkJCQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChhZGRyZXNzaW5nUmVzcG9uc2VzVHlwZUVFbnVtLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJhZGRyZXNzaW5nLXJlc3BvbnNlc1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0RURhdGFUeXBlLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJhZGRyZXNzaW5nLXJlc3BvbnNlc1R5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImJhc2VUeXBlIiwgImFkZHJlc3NpbmctcmVzcG9uc2VzVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGFkZHJlc3NpbmdUeXBlRUNsYXNzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJhZGRyZXNzaW5nVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBZGRyZXNzaW5nVHlwZV9FbmFibGVkKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJlbmFibGVkIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QWRkcmVzc2luZ1R5cGVfUmVxdWlyZWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInJlcXVpcmVkIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QWRkcmVzc2luZ1R5cGVfUmVzcG9uc2VzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJyZXNwb25zZXMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZGF0YVNvdXJjZVR5cGVFQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgImRhdGEtc291cmNlVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0RGF0YVNvdXJjZVR5cGVfRGVzY3JpcHRpb24oKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldERhdGFTb3VyY2VUeXBlX05hbWUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIm5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0RGF0YVNvdXJjZVR5cGVfQ2xhc3NOYW1lKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJjbGFzcy1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldERhdGFTb3VyY2VUeXBlX1NlcnZlck5hbWUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInNlcnZlci1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldERhdGFTb3VyY2VUeXBlX1BvcnROdW1iZXIoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInBvcnQtbnVtYmVyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldERhdGFTb3VyY2VUeXBlX0RhdGFiYXNlTmFtZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiZGF0YWJhc2UtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXREYXRhU291cmNlVHlwZV9VcmwoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInVybCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXREYXRhU291cmNlVHlwZV9Vc2VyKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJ1c2VyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldERhdGFTb3VyY2VUeXBlX1Bhc3N3b3JkKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJwYXNzd29yZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXREYXRhU291cmNlVHlwZV9Qcm9wZXJ0eSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAicHJvcGVydHkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0RGF0YVNvdXJjZVR5cGVfTG9naW5UaW1lb3V0KCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJsb2dpbi10aW1lb3V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldERhdGFTb3VyY2VUeXBlX1RyYW5zYWN0aW9uYWwoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInRyYW5zYWN0aW9uYWwiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0RGF0YVNvdXJjZVR5cGVfSXNvbGF0aW9uTGV2ZWwoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImlzb2xhdGlvbi1sZXZlbCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXREYXRhU291cmNlVHlwZV9Jbml0aWFsUG9vbFNpemUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImluaXRpYWwtcG9vbC1zaXplIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldERhdGFTb3VyY2VUeXBlX01heFBvb2xTaXplKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJtYXgtcG9vbC1zaXplIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldERhdGFTb3VyY2VUeXBlX01pblBvb2xTaXplKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJtaW4tcG9vbC1zaXplIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldERhdGFTb3VyY2VUeXBlX01heElkbGVUaW1lKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJtYXgtaWRsZS10aW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldERhdGFTb3VyY2VUeXBlX01heFN0YXRlbWVudHMoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIm1heC1zdGF0ZW1lbnRzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0RGF0YVNvdXJjZVR5cGVfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgogCQkgIChkZXNjcmlwdGlvbkVDbGFzcywgCiAJCSAgIHNvdXJjZSwgCiAJCSAgIG5ldyBTdHJpbmdbXSB7CkBAIC0zMDg5LDYgKzM4MTksMTQgQEAKIAkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWUiLCAiaW5qZWN0aW9uLXRhcmdldCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRFamJMb2NhbFJlZl9Mb29rdXBOYW1lKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJsb29rdXAtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldEVqYkxvY2FsUmVmX0lkKCksIApAQCAtMzE2Nyw2ICszOTA1LDE0IEBACiAJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lIiwgImluamVjdGlvbi10YXJnZXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0RWpiUmVmX0xvb2t1cE5hbWUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImxvb2t1cC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0RWpiUmVmX0lkKCksIApAQCAtMzI2Miw2ICs0MDA4LDE0IEBACiAJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lIiwgImluamVjdGlvbi10YXJnZXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0RW52RW50cnlfTG9va3VwTmFtZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibG9va3VwLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkKIAkJYWRkQW5ub3RhdGlvbgogCQkgIChnZXRFbnZFbnRyeV9JZCgpLCAKQEAgLTMyNzEsMTcgKzQwMjUsMTEgQEAKIAkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCQogCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVudkVudHJ5VHlwZUVFbnVtLCAKKwkJICAoZW52RW50cnlUeXBlRURhdGFUeXBlLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJlbnYtZW50cnktdHlwZS12YWx1ZXNUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChlbnZFbnRyeVR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgImVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkgImJhc2VUeXBlIiwgImVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImVudi1lbnRyeS10eXBlLXZhbHVlc1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAiYmFzZVR5cGUiLCAiZnVsbHktcXVhbGlmaWVkLWNsYXNzVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCQogCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlRURhdGFUeXBlLCAKQEAgLTMyOTAsNiArNDAzOCwxOSBAQAogCQkJICJuYW1lIiwgImZ1bGx5LXF1YWxpZmllZC1jbGFzc1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChnZW5lcmljQm9vbGVhblR5cGVFRW51bSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiZ2VuZXJpYy1ib29sZWFuVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2VuZXJpY0Jvb2xlYW5UeXBlT2JqZWN0RURhdGFUeXBlLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJnZW5lcmljLWJvb2xlYW5UeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJiYXNlVHlwZSIsICJnZW5lcmljLWJvb2xlYW5UeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KIAkJICAoaG9tZUVEYXRhVHlwZSwgCiAJCSAgIHNvdXJjZSwgCiAJCSAgIG5ldyBTdHJpbmdbXSB7CkBAIC0zMzU3LDYgKzQxMTgsMTkgQEAKIAkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkJCiAJCWFkZEFubm90YXRpb24KKwkJICAoaXNvbGF0aW9uTGV2ZWxUeXBlRUVudW0sIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgImlzb2xhdGlvbi1sZXZlbFR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGlzb2xhdGlvbkxldmVsVHlwZU9iamVjdEVEYXRhVHlwZSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiaXNvbGF0aW9uLWxldmVsVHlwZTpPYmplY3QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAiYmFzZVR5cGUiLCAiaXNvbGF0aW9uLWxldmVsVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGphdmFJZGVudGlmaWVyRURhdGFUeXBlLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKQEAgLTMzNzMsNiArNDE0NywxNCBAQAogCQkJICJwYXR0ZXJuIiwgIlteXFxwe1p9XSoiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChqZGJjVXJsVHlwZUVEYXRhVHlwZSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiamRiYy11cmxUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSN0b2tlbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJwYXR0ZXJuIiwgImpkYmM6KC4qKTooLiopIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KIAkJICAoam5kaU5hbWVFRGF0YVR5cGUsIAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewpAQCAtMzUwNSw2ICs0Mjg3LDE0IEBACiAJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lIiwgIm1hcHBlZC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9Mb29rdXBOYW1lKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJsb29rdXAtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9JZCgpLCAKQEAgLTM1ODEsNiArNDM3MSwxNCBAQAogCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAibmFtZSIsICJpbmplY3Rpb24tdGFyZ2V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9Mb29rdXBOYW1lKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJsb29rdXAtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9JZCgpLCAKQEAgLTM4MTMsNiArNDYxMSwzMCBAQAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRQb3J0Q29tcG9uZW50UmVmX010b21UaHJlc2hvbGQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIm10b20tdGhyZXNob2xkIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFBvcnRDb21wb25lbnRSZWZfQWRkcmVzc2luZygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiYWRkcmVzc2luZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRQb3J0Q29tcG9uZW50UmVmX1Jlc3BlY3RCaW5kaW5nKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJyZXNwZWN0LWJpbmRpbmciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKQEAgLTM4NTgsNiArNDY4MCwzNiBAQAogCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkJCiAJCWFkZEFubm90YXRpb24KKwkJICAocHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVFRGF0YVR5cGUsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgInByb3RvY29sLWJpbmRpbmdMaXN0VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJpdGVtVHlwZSIsICJwcm90b2NvbC1iaW5kaW5nVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKHByb3RvY29sQmluZGluZ1R5cGVFRGF0YVR5cGUsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgInByb3RvY29sLWJpbmRpbmdUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm1lbWJlclR5cGVzIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNhbnlVUkkgcHJvdG9jb2wtVVJJQWxpYXNUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAocHJvdG9jb2xVUklBbGlhc1R5cGVFRGF0YVR5cGUsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgInByb3RvY29sLVVSSUFsaWFzVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJiYXNlVHlwZSIsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjdG9rZW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAicGF0dGVybiIsICIjIy4rIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAocW5hbWVQYXR0ZXJuRURhdGFUeXBlLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJxbmFtZS1wYXR0ZXJuIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSN0b2tlbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJwYXR0ZXJuIiwgIlxcKnwoW1xcaS1bOl1dW1xcYy1bOl1dKjopP1tcXGktWzpdXVtcXGMtWzpdXSpcXCo/IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KIAkJICAocmVtb3RlRURhdGFUeXBlLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKQEAgLTM5MjIsNiArNDc3NCwxNCBAQAogCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAibmFtZSIsICJpbmplY3Rpb24tdGFyZ2V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFJlc291cmNlRW52UmVmX0xvb2t1cE5hbWUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImxvb2t1cC1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0UmVzb3VyY2VFbnZSZWZfSWQoKSwgCkBAIC0zOTkyLDYgKzQ4NTIsMTQgQEAKIAkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWUiLCAiaW5qZWN0aW9uLXRhcmdldCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRSZXNvdXJjZVJlZl9Mb29rdXBOYW1lKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJsb29rdXAtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldFJlc291cmNlUmVmX0lkKCksIApAQCAtNDAwMSw2ICs0ODY5LDIxIEBACiAJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChyZXNwZWN0QmluZGluZ1R5cGVFQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgInJlc3BlY3QtYmluZGluZ1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0UmVzcGVjdEJpbmRpbmdUeXBlX0VuYWJsZWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImVuYWJsZWQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KIAkJICAocmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKQEAgLTQyMzUsNiArNTExOCwxNCBAQAogCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAibmFtZSIsICJpbmplY3Rpb24tdGFyZ2V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFNlcnZpY2VSZWZfTG9va3VwTmFtZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibG9va3VwLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkKIAkJYWRkQW5ub3RhdGlvbgogCQkgIChnZXRTZXJ2aWNlUmVmX0lkKCksIApAQCAtNDI0Nyw3ICs1MTM4LDcgQEAKIAkJICAoc2VydmljZVJlZkhhbmRsZXJFQ2xhc3MsIAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmX2hhbmRsZXJUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaGFuZGxlclR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KQEAgLTQyODksNyArNTE4MCw3IEBACiAJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lIiwgImhhbmRsZXItY2xhc3MiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKKwkJICAgfSk7CQkJCiAJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0U2VydmljZVJlZkhhbmRsZXJfSW5pdFBhcmFtcygpLCAKIAkJICAgc291cmNlLCAKQEAgLTQzMzMsNyArNTIyNCw3IEBACiAJCSAgKHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5FQ2xhc3MsIAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmX2hhbmRsZXItY2hhaW5UeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaGFuZGxlci1jaGFpblR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KQEAgLTQzNzksNyArNTI3MCw3IEBACiAJCSAgKHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zRUNsYXNzLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZl9oYW5kbGVyLWNoYWluc1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJoYW5kbGVyLWNoYWluc1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KQEAgLTQzOTgsMzYgKzUyODksNiBAQAogCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkJCiAJCWFkZEFubm90YXRpb24KLQkJICAoc2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlRURhdGFUeXBlLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZl9wcm90b2NvbC1iaW5kaW5nTGlzdFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAiaXRlbVR5cGUiLCAic2VydmljZS1yZWZfcHJvdG9jb2wtYmluZGluZ1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZUVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAic2VydmljZS1yZWZfcHJvdG9jb2wtYmluZGluZ1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAibWVtYmVyVHlwZXMiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2FueVVSSSBzZXJ2aWNlLXJlZl9wcm90b2NvbC1VUklBbGlhc1R5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGVFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgInNlcnZpY2UtcmVmX3Byb3RvY29sLVVSSUFsaWFzVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjdG9rZW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAicGF0dGVybiIsICIjIy4rIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoc2VydmljZVJlZlFuYW1lUGF0dGVybkVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAic2VydmljZS1yZWZfcW5hbWUtcGF0dGVybiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJiYXNlVHlwZSIsICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjdG9rZW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAicGF0dGVybiIsICJcXCp8KFtcXGktWzpdXVtcXGMtWzpdXSo6KT9bXFxpLVs6XV1bXFxjLVs6XV0qXFwqPyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCiAJCSAgKHRydWVGYWxzZVR5cGVFRGF0YVR5cGUsIAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvTGlmZWN5Y2xlQ2FsbGJhY2tJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9MaWZlY3ljbGVDYWxsYmFja0ltcGwuamF2YQppbmRleCAwOGY2NmM1Li4zODNmYjI3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9MaWZlY3ljbGVDYWxsYmFja0ltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9MaWZlY3ljbGVDYWxsYmFja0ltcGwuamF2YQpAQCAtOTAsNiArOTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuTElGRUNZQ0xFX0NBTExCQUNLOwogCX0KQEAgLTE0MSw2ICsxNDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTElGRUNZQ0xFX0NBTExCQUNLX19MSUZFQ1lDTEVfQ0FMTEJBQ0tfQ0xBU1M6CkBAIC0xNTYsNiArMTU4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSUZFQ1lDTEVfQ0FMTEJBQ0tfX0xJRkVDWUNMRV9DQUxMQkFDS19DTEFTUzoKQEAgLTE3Myw2ICsxNzYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJRkVDWUNMRV9DQUxMQkFDS19fTElGRUNZQ0xFX0NBTExCQUNLX0NMQVNTOgpAQCAtMTkwLDYgKzE5NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTElGRUNZQ0xFX0NBTExCQUNLX19MSUZFQ1lDTEVfQ0FMTEJBQ0tfQ0xBU1M6CkBAIC0yMDUsNiArMjEwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9MaXN0ZW5lckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0xpc3RlbmVySW1wbC5qYXZhCmluZGV4IDU3OWZiMDYuLmQ0NTlkZmUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0xpc3RlbmVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL0xpc3RlbmVySW1wbC5qYXZhCkBAIC02MCw3ICs2MCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03MCw3ICs3MCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERpc3BsYXlOYW1lPiBkaXNwbGF5TmFtZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC04MCw3ICs4MCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8SWNvbj4gaWNvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlzdGVuZXJDbGFzcygpIDxlbT5MaXN0ZW5lciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTM2LDYgKzEzNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5MSVNURU5FUjsKIAl9CkBAIC0xNDUsOSArMTQ2LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgeworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CiAJCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fREVTQ1JJUFRJT05TKTsKIAkJfQogCQlyZXR1cm4gZGVzY3JpcHRpb25zOwogCX0KQEAgLTE1Nyw5ICsxNTgsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7CisJcHVibGljIExpc3Q8RGlzcGxheU5hbWU+IGdldERpc3BsYXlOYW1lcygpIHsKIAkJaWYgKGRpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0RJU1BMQVlfTkFNRVMpOworCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERpc3BsYXlOYW1lPihEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fRElTUExBWV9OQU1FUyk7CiAJCX0KIAkJcmV0dXJuIGRpc3BsYXlOYW1lczsKIAl9CkBAIC0xNjksOSArMTcwLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SWNvbnMoKSB7CisJcHVibGljIExpc3Q8SWNvbj4gZ2V0SWNvbnMoKSB7CiAJCWlmIChpY29ucyA9PSBudWxsKSB7Ci0JCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJY29uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19JQ09OUyk7CisJCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJY29uPihJY29uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19JQ09OUyk7CiAJCX0KIAkJcmV0dXJuIGljb25zOwogCX0KQEAgLTIyMywxNCArMjI0LDE1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTI0MCw2ICsyNDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0RFU0NSSVBUSU9OUzoKQEAgLTI2MSwxOSArMjY0LDIxIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVJfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fRElTUExBWV9OQU1FUzoKIAkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaXNwbGF5TmFtZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fSUNPTlM6CiAJCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSWNvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1M6CiAJCQkJc2V0TGlzdGVuZXJDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTI5MCw2ICsyOTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkxJU1RFTkVSX19ERVNDUklQVElPTlM6CkBAIC0zMTYsNiArMzIyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSVNURU5FUl9fREVTQ1JJUFRJT05TOgpAQCAtMzM3LDYgKzM0NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uSW1wbC5qYXZhCmluZGV4IDJjNGIyZjYuLjczOTg3M2MgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvbkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRGVzdGluYXRpb25JbXBsLmphdmEKQEAgLTQ2LDYgKzQ2LDcgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25JbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25OYW1lIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvbkltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvbkltcGwjZ2V0TG9va3VwTmFtZSA8ZW0+TG9va3VwIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvbkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CkBAIC02MSw3ICs2Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03MSw3ICs3Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERpc3BsYXlOYW1lPiBkaXNwbGF5TmFtZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC04MSw3ICs4Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8SWNvbj4gaWNvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZSgpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTEyNCw2ICsxMjUsMjYgQEAKIAlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZE5hbWUgPSBNQVBQRURfTkFNRV9FREVGQVVMVDsKIAogCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb29rdXBOYW1lKCkgPGVtPkxvb2t1cCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMb29rdXBOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT09LVVBfTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb29rdXBOYW1lKCkgPGVtPkxvb2t1cCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMb29rdXBOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGxvb2t1cE5hbWUgPSBMT09LVVBfTkFNRV9FREVGQVVMVDsKKworCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xNTcsNiArMTc4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfREVTVElOQVRJT047CiAJfQpAQCAtMTY2LDkgKzE4OCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMTc4LDkgKzIwMCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKKwlwdWJsaWMgTGlzdDxEaXNwbGF5TmFtZT4gZ2V0RGlzcGxheU5hbWVzKCkgewogCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUVTKTsKKwkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEaXNwbGF5TmFtZT4oRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fRElTUExBWV9OQU1FUyk7CiAJCX0KIAkJcmV0dXJuIGRpc3BsYXlOYW1lczsKIAl9CkBAIC0xOTAsOSArMjEyLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SWNvbnMoKSB7CisJcHVibGljIExpc3Q8SWNvbj4gZ2V0SWNvbnMoKSB7CiAJCWlmIChpY29ucyA9PSBudWxsKSB7Ci0JCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJY29uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lDT05TKTsKKwkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEljb24+KEljb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUNPTlMpOwogCQl9CiAJCXJldHVybiBpY29uczsKIAl9CkBAIC0yNDQsNiArMjY2LDI3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TG9va3VwTmFtZSgpIHsKKwkJcmV0dXJuIGxvb2t1cE5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TG9va3VwTmFtZShTdHJpbmcgbmV3TG9va3VwTmFtZSkgeworCQlTdHJpbmcgb2xkTG9va3VwTmFtZSA9IGxvb2t1cE5hbWU7CisJCWxvb2t1cE5hbWUgPSBuZXdMb29rdXBOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0xPT0tVUF9OQU1FLCBvbGRMb29rdXBOYW1lLCBsb29rdXBOYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKIAkJcmV0dXJuIGlkOwogCX0KQEAgLTI2NSwxNCArMzA4LDE1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTI4Miw2ICszMjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fREVTQ1JJUFRJT05TOgpAQCAtMjk0LDYgKzMzOSw4IEBACiAJCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUoKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19NQVBQRURfTkFNRToKIAkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0xPT0tVUF9OQU1FOgorCQkJCXJldHVybiBnZXRMb29rdXBOYW1lKCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUQ6CiAJCQkJcmV0dXJuIGdldElkKCk7CiAJCX0KQEAgLTMwNSwxOSArMzUyLDIxIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RJU1BMQVlfTkFNRVM6CiAJCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzcGxheU5hbWU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUNPTlM6CiAJCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSWNvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19NRVNTQUdFX0RFU1RJTkFUSU9OX05BTUU6CiAJCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTMyNSw2ICszNzQsOSBAQAogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX01BUFBFRF9OQU1FOgogCQkJCXNldE1hcHBlZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0xPT0tVUF9OQU1FOgorCQkJCXNldExvb2t1cE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0lEOgogCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKQEAgLTMzNyw2ICszODksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RFU0NSSVBUSU9OUzoKQEAgLTM1NCw2ICs0MDcsOSBAQAogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX01BUFBFRF9OQU1FOgogCQkJCXNldE1hcHBlZE5hbWUoTUFQUEVEX05BTUVfRURFRkFVTFQpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19MT09LVVBfTkFNRToKKwkJCQlzZXRMb29rdXBOYW1lKExPT0tVUF9OQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUQ6CiAJCQkJc2V0SWQoSURfRURFRkFVTFQpOwogCQkJCXJldHVybjsKQEAgLTM2Niw2ICs0MjIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX0RFU0NSSVBUSU9OUzoKQEAgLTM3OCw2ICs0MzUsOCBAQAogCQkJCXJldHVybiBNRVNTQUdFX0RFU1RJTkFUSU9OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUgIT0gbnVsbCA6ICFNRVNTQUdFX0RFU1RJTkFUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX01BUFBFRF9OQU1FOgogCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19MT09LVVBfTkFNRToKKwkJCQlyZXR1cm4gTE9PS1VQX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGxvb2t1cE5hbWUgIT0gbnVsbCA6ICFMT09LVVBfTkFNRV9FREVGQVVMVC5lcXVhbHMobG9va3VwTmFtZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fSUQ6CiAJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CiAJCX0KQEAgLTM4OSw2ICs0NDgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKQEAgLTM5Nyw2ICs0NTcsOCBAQAogCQlyZXN1bHQuYXBwZW5kKG1lc3NhZ2VEZXN0aW5hdGlvbk5hbWUpOwogCQlyZXN1bHQuYXBwZW5kKCIsIG1hcHBlZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobWFwcGVkTmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbG9va3VwTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChsb29rdXBOYW1lKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwuamF2YQppbmRleCA5MTc1NTRlLi45NGRlY2U1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbC5qYXZhCkBAIC00OCw2ICs0OCw3IEBACiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwjZ2V0SW5qZWN0aW9uVGFyZ2V0cyA8ZW0+SW5qZWN0aW9uIFRhcmdldHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwjZ2V0TG9va3VwTmFtZSA8ZW0+TG9va3VwIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CkBAIC02Myw3ICs2NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMzIsNyArMTMzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZUVTZXQgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBtZXNzYWdlRGVzdGluYXRpb25Vc2FnZUVTZXQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTE4Miw3ICsxODMsMjcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5qZWN0aW9uVGFyZ2V0cyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEluamVjdGlvblRhcmdldD4gaW5qZWN0aW9uVGFyZ2V0czsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb29rdXBOYW1lKCkgPGVtPkxvb2t1cCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMb29rdXBOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT09LVVBfTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb29rdXBOYW1lKCkgPGVtPkxvb2t1cCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMb29rdXBOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGxvb2t1cE5hbWUgPSBMT09LVVBfTkFNRV9FREVGQVVMVDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMjE4LDYgKzIzOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRjsKIAl9CkBAIC0yMjcsOSArMjQ5LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgeworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CiAJCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TKTsKIAkJfQogCQlyZXR1cm4gZGVzY3JpcHRpb25zOwogCX0KQEAgLTM2OSw5ICszOTEsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbmplY3Rpb25UYXJnZXRzKCkgeworCXB1YmxpYyBMaXN0PEluamVjdGlvblRhcmdldD4gZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIHsKIAkJaWYgKGluamVjdGlvblRhcmdldHMgPT0gbnVsbCkgewotCQkJaW5qZWN0aW9uVGFyZ2V0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbmplY3Rpb25UYXJnZXQuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKKwkJCWluamVjdGlvblRhcmdldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SW5qZWN0aW9uVGFyZ2V0PihJbmplY3Rpb25UYXJnZXQuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKIAkJfQogCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0czsKIAl9CkBAIC0zODEsNiArNDAzLDI3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TG9va3VwTmFtZSgpIHsKKwkJcmV0dXJuIGxvb2t1cE5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TG9va3VwTmFtZShTdHJpbmcgbmV3TG9va3VwTmFtZSkgeworCQlTdHJpbmcgb2xkTG9va3VwTmFtZSA9IGxvb2t1cE5hbWU7CisJCWxvb2t1cE5hbWUgPSBuZXdMb29rdXBOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19MT09LVVBfTkFNRSwgb2xkTG9va3VwTmFtZSwgbG9va3VwTmFtZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CiAJCXJldHVybiBpZDsKIAl9CkBAIC00MDIsMTIgKzQ0NSwxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluamVjdGlvblRhcmdldHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTQxNyw2ICs0NjEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0RFU0NSSVBUSU9OUzoKQEAgLTQzMyw2ICs0NzgsOCBAQAogCQkJCXJldHVybiBnZXRNYXBwZWROYW1lKCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCXJldHVybiBnZXRJbmplY3Rpb25UYXJnZXRzKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0xPT0tVUF9OQU1FOgorCQkJCXJldHVybiBnZXRMb29rdXBOYW1lKCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lEOgogCQkJCXJldHVybiBnZXRJZCgpOwogCQl9CkBAIC00NDQsMTEgKzQ5MSwxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX01FU1NBR0VfREVTVElOQVRJT05fUkVGX05BTUU6CiAJCQkJc2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTQ2Nyw3ICs1MTYsMTAgQEAKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEluamVjdGlvblRhcmdldD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTE9PS1VQX05BTUU6CisJCQkJc2V0TG9va3VwTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lEOgogCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtNDgxLDYgKzUzMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0RFU0NSSVBUSU9OUzoKQEAgLTUwNCw2ICs1NTcsOSBAQAogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKIAkJCQlnZXRJbmplY3Rpb25UYXJnZXRzKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0xPT0tVUF9OQU1FOgorCQkJCXNldExvb2t1cE5hbWUoTE9PS1VQX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fSUQ6CiAJCQkJc2V0SWQoSURfRURFRkFVTFQpOwogCQkJCXJldHVybjsKQEAgLTUxNiw2ICs1NzIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19ERVNDUklQVElPTlM6CkBAIC01MzIsNiArNTg5LDggQEAKIAkJCQlyZXR1cm4gTUFQUEVEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHBlZE5hbWUgIT0gbnVsbCA6ICFNQVBQRURfTkFNRV9FREVGQVVMVC5lcXVhbHMobWFwcGVkTmFtZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCXJldHVybiBpbmplY3Rpb25UYXJnZXRzICE9IG51bGwgJiYgIWluamVjdGlvblRhcmdldHMuaXNFbXB0eSgpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19MT09LVVBfTkFNRToKKwkJCQlyZXR1cm4gTE9PS1VQX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGxvb2t1cE5hbWUgIT0gbnVsbCA6ICFMT09LVVBfTkFNRV9FREVGQVVMVC5lcXVhbHMobG9va3VwTmFtZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lEOgogCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwogCQl9CkBAIC01NDMsNiArNjAyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCkBAIC01NTcsNiArNjE3LDggQEAKIAkJcmVzdWx0LmFwcGVuZChtZXNzYWdlRGVzdGluYXRpb25MaW5rKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG1hcHBlZE5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGxvb2t1cE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobG9va3VwTmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoaWQpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9QYXJhbVZhbHVlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUGFyYW1WYWx1ZUltcGwuamF2YQppbmRleCA5YjZmOWZkLi5mYmRkOWJkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9QYXJhbVZhbHVlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BhcmFtVmFsdWVJbXBsLmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJhbU5hbWUoKSA8ZW0+UGFyYW0gTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTMzLDYgKzEzMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QQVJBTV9WQUxVRTsKIAl9CkBAIC0xNDIsOSArMTQzLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgeworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CiAJCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TKTsKIAkJfQogCQlyZXR1cm4gZGVzY3JpcHRpb25zOwogCX0KQEAgLTIxNywxMCArMjE4LDExIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTIzMCw2ICsyMzIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OUzoKQEAgLTI0OSwxMSArMjUyLDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fUEFSQU1fTkFNRToKIAkJCQlzZXRQYXJhbU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0yNzMsNiArMjc4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QQVJBTV9WQUxVRV9fREVTQ1JJUFRJT05TOgpAQCAtMjk2LDYgKzMwMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEFSQU1fVkFMVUVfX0RFU0NSSVBUSU9OUzoKQEAgLTMxNSw2ICszMjIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BlcnNpc3RlbmNlQ29udGV4dFJlZkltcGwuamF2YQppbmRleCAxOWFlMGMzLi5iNDBmNDNhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9QZXJzaXN0ZW5jZUNvbnRleHRSZWZJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUGVyc2lzdGVuY2VDb250ZXh0UmVmSW1wbC5qYXZhCkBAIC02NCw3ICs2NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwZXJzaXN0ZW5jZUNvbnRleHRUeXBlRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHBlcnNpc3RlbmNlQ29udGV4dFR5cGVFU2V0OwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCkgPGVtPlBlcnNpc3RlbmNlIFByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTQzLDcgKzE0Myw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHBlcnNpc3RlbmNlUHJvcGVydGllcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFByb3BlcnR5VHlwZT4gcGVyc2lzdGVuY2VQcm9wZXJ0aWVzOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZE5hbWUoKSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTE3Myw3ICsxNzMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmplY3Rpb25UYXJnZXRzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8SW5qZWN0aW9uVGFyZ2V0PiBpbmplY3Rpb25UYXJnZXRzOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0yMDksNiArMjA5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGOwogCX0KQEAgLTIxOCw5ICsyMTksOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMzE4LDkgKzMxOSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlUHJvcGVydGllcygpIHsKKwlwdWJsaWMgTGlzdDxQcm9wZXJ0eVR5cGU+IGdldFBlcnNpc3RlbmNlUHJvcGVydGllcygpIHsKIAkJaWYgKHBlcnNpc3RlbmNlUHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW5jZVByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUHJvcGVydHlUeXBlLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19QRVJTSVNURU5DRV9QUk9QRVJUSUVTKTsKKwkJCXBlcnNpc3RlbmNlUHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxQcm9wZXJ0eVR5cGU+KFByb3BlcnR5VHlwZS5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfUFJPUEVSVElFUyk7CiAJCX0KIAkJcmV0dXJuIHBlcnNpc3RlbmNlUHJvcGVydGllczsKIAl9CkBAIC0zNTEsOSArMzUyLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIHsKKwlwdWJsaWMgTGlzdDxJbmplY3Rpb25UYXJnZXQ+IGdldEluamVjdGlvblRhcmdldHMoKSB7CiAJCWlmIChpbmplY3Rpb25UYXJnZXRzID09IG51bGwpIHsKLQkJCWluamVjdGlvblRhcmdldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7CisJCQlpbmplY3Rpb25UYXJnZXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEluamVjdGlvblRhcmdldD4oSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7CiAJCX0KIAkJcmV0dXJuIGluamVjdGlvblRhcmdldHM7CiAJfQpAQCAtMzg0LDE0ICszODUsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBlcnNpc3RlbmNlUHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQZXJzaXN0ZW5jZVByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluamVjdGlvblRhcmdldHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTQwMSw2ICs0MDMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0RFU0NSSVBUSU9OUzoKQEAgLTQyOCwxMSArNDMxLDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfTkFNRToKIAkJCQlzZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtNDQ1LDE0ICs0NTAsMTQgQEAKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZfX1BFUlNJU1RFTkNFX1BST1BFUlRJRVM6CiAJCQkJZ2V0UGVyc2lzdGVuY2VQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZVByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFBlcnNpc3RlbmNlUHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJvcGVydHlUeXBlPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19NQVBQRURfTkFNRToKIAkJCQlzZXRNYXBwZWROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6CiAJCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSW5qZWN0aW9uVGFyZ2V0PiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19JRDoKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTQ2Niw2ICs0NzEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGX19ERVNDUklQVElPTlM6CkBAIC01MDEsNiArNTA3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9DT05URVhUX1JFRl9fREVTQ1JJUFRJT05TOgpAQCAtNTI4LDYgKzUzNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUGVyc2lzdGVuY2VVbml0UmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUGVyc2lzdGVuY2VVbml0UmVmSW1wbC5qYXZhCmluZGV4IGQ4OGM5OWQuLjVhNTJhZTYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BlcnNpc3RlbmNlVW5pdFJlZkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9QZXJzaXN0ZW5jZVVuaXRSZWZJbXBsLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZOYW1lKCkgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTEzMCw3ICsxMzAsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmplY3Rpb25UYXJnZXRzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8SW5qZWN0aW9uVGFyZ2V0PiBpbmplY3Rpb25UYXJnZXRzOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNjYsNiArMTY2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlBFUlNJU1RFTkNFX1VOSVRfUkVGOwogCX0KQEAgLTE3NSw5ICsxNzYsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMjUwLDkgKzI1MSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEluamVjdGlvblRhcmdldHMoKSB7CisJcHVibGljIExpc3Q8SW5qZWN0aW9uVGFyZ2V0PiBnZXRJbmplY3Rpb25UYXJnZXRzKCkgewogCQlpZiAoaW5qZWN0aW9uVGFyZ2V0cyA9PSBudWxsKSB7Ci0JCQlpbmplY3Rpb25UYXJnZXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEluamVjdGlvblRhcmdldC5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOworCQkJaW5qZWN0aW9uVGFyZ2V0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJbmplY3Rpb25UYXJnZXQ+KEluamVjdGlvblRhcmdldC5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOwogCQl9CiAJCXJldHVybiBpbmplY3Rpb25UYXJnZXRzOwogCX0KQEAgLTI4MywxMiArMjg0LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJbmplY3Rpb25UYXJnZXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtMjk4LDYgKzMwMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fREVTQ1JJUFRJT05TOgpAQCAtMzIxLDExICszMjQsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGX19QRVJTSVNURU5DRV9VTklUX1JFRl9OQU1FOgogCQkJCXNldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0zMzgsNyArMzQzLDcgQEAKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEluamVjdGlvblRhcmdldD4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0zNTIsNiArMzU3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QRVJTSVNURU5DRV9VTklUX1JFRl9fREVTQ1JJUFRJT05TOgpAQCAtMzgxLDYgKzM4Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfVU5JVF9SRUZfX0RFU0NSSVBUSU9OUzoKQEAgLTQwNCw2ICs0MTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BvcnRDb21wb25lbnRSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9Qb3J0Q29tcG9uZW50UmVmSW1wbC5qYXZhCmluZGV4IGFjZWQ3YzcuLmUwM2IzMTkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1BvcnRDb21wb25lbnRSZWZJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUG9ydENvbXBvbmVudFJlZkltcGwuamF2YQpAQCAtMTAsMTUgKzEwLDIwIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGw7CiAKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNwZWN0QmluZGluZ1R5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7CiAKIC8qKgpAQCAtMzAsNiArMzUsOSBAQAogICogPHVsPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsI2dldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSA8ZW0+U2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2U8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsI2lzRW5hYmxlTXRvbSA8ZW0+RW5hYmxlIE10b208L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRSZWZJbXBsI2dldE10b21UaHJlc2hvbGQgPGVtPk10b20gVGhyZXNob2xkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50UmVmSW1wbCNnZXRBZGRyZXNzaW5nIDxlbT5BZGRyZXNzaW5nPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50UmVmSW1wbCNnZXRSZXNwZWN0QmluZGluZyA8ZW0+UmVzcGVjdCBCaW5kaW5nPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50UmVmSW1wbCNnZXRQb3J0Q29tcG9uZW50TGluayA8ZW0+UG9ydCBDb21wb25lbnQgTGluazwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudFJlZkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CkBAIC04NSw3ICs5Myw0NyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZU10b21FU2V0ID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlTXRvbUVTZXQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXRvbVRocmVzaG9sZCgpIDxlbT5NdG9tIFRocmVzaG9sZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TXRvbVRocmVzaG9sZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIE1UT01fVEhSRVNIT0xEX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE10b21UaHJlc2hvbGQoKSA8ZW0+TXRvbSBUaHJlc2hvbGQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE10b21UaHJlc2hvbGQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG10b21UaHJlc2hvbGQgPSBNVE9NX1RIUkVTSE9MRF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZHJlc3NpbmcoKSA8ZW0+QWRkcmVzc2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWRkcmVzc2luZygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEFkZHJlc3NpbmdUeXBlIGFkZHJlc3Npbmc7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNwZWN0QmluZGluZygpIDxlbT5SZXNwZWN0IEJpbmRpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlc3BlY3RCaW5kaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmVzcGVjdEJpbmRpbmdUeXBlIHJlc3BlY3RCaW5kaW5nOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvcnRDb21wb25lbnRMaW5rKCkgPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTE0MSw2ICsxODksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUE9SVF9DT01QT05FTlRfUkVGOwogCX0KQEAgLTIxNyw2ICsyNjYsMTEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBCaWdJbnRlZ2VyIGdldE10b21UaHJlc2hvbGQoKSB7CisJCXJldHVybiBtdG9tVGhyZXNob2xkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE10b21UaHJlc2hvbGQoQmlnSW50ZWdlciBuZXdNdG9tVGhyZXNob2xkKSB7CisJCUJpZ0ludGVnZXIgb2xkTXRvbVRocmVzaG9sZCA9IG10b21UaHJlc2hvbGQ7CisJCW10b21UaHJlc2hvbGQgPSBuZXdNdG9tVGhyZXNob2xkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fTVRPTV9USFJFU0hPTEQsIG9sZE10b21UaHJlc2hvbGQsIG10b21UaHJlc2hvbGQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRkcmVzc2luZ1R5cGUgZ2V0QWRkcmVzc2luZygpIHsKKwkJcmV0dXJuIGFkZHJlc3Npbmc7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWRkcmVzc2luZyhBZGRyZXNzaW5nVHlwZSBuZXdBZGRyZXNzaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCUFkZHJlc3NpbmdUeXBlIG9sZEFkZHJlc3NpbmcgPSBhZGRyZXNzaW5nOworCQlhZGRyZXNzaW5nID0gbmV3QWRkcmVzc2luZzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX0FERFJFU1NJTkcsIG9sZEFkZHJlc3NpbmcsIG5ld0FkZHJlc3NpbmcpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFkZHJlc3NpbmcoQWRkcmVzc2luZ1R5cGUgbmV3QWRkcmVzc2luZykgeworCQlpZiAobmV3QWRkcmVzc2luZyAhPSBhZGRyZXNzaW5nKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChhZGRyZXNzaW5nICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFkZHJlc3NpbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fQUREUkVTU0lORywgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3QWRkcmVzc2luZyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBZGRyZXNzaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX0FERFJFU1NJTkcsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0QWRkcmVzc2luZyhuZXdBZGRyZXNzaW5nLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19BRERSRVNTSU5HLCBuZXdBZGRyZXNzaW5nLCBuZXdBZGRyZXNzaW5nKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlc3BlY3RCaW5kaW5nVHlwZSBnZXRSZXNwZWN0QmluZGluZygpIHsKKwkJcmV0dXJuIHJlc3BlY3RCaW5kaW5nOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlc3BlY3RCaW5kaW5nKFJlc3BlY3RCaW5kaW5nVHlwZSBuZXdSZXNwZWN0QmluZGluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlSZXNwZWN0QmluZGluZ1R5cGUgb2xkUmVzcGVjdEJpbmRpbmcgPSByZXNwZWN0QmluZGluZzsKKwkJcmVzcGVjdEJpbmRpbmcgPSBuZXdSZXNwZWN0QmluZGluZzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1JFU1BFQ1RfQklORElORywgb2xkUmVzcGVjdEJpbmRpbmcsIG5ld1Jlc3BlY3RCaW5kaW5nKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXNwZWN0QmluZGluZyhSZXNwZWN0QmluZGluZ1R5cGUgbmV3UmVzcGVjdEJpbmRpbmcpIHsKKwkJaWYgKG5ld1Jlc3BlY3RCaW5kaW5nICE9IHJlc3BlY3RCaW5kaW5nKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChyZXNwZWN0QmluZGluZyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXNwZWN0QmluZGluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19SRVNQRUNUX0JJTkRJTkcsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld1Jlc3BlY3RCaW5kaW5nICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Jlc3BlY3RCaW5kaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1JFU1BFQ1RfQklORElORywgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRSZXNwZWN0QmluZGluZyhuZXdSZXNwZWN0QmluZGluZywgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUkVTUEVDVF9CSU5ESU5HLCBuZXdSZXNwZWN0QmluZGluZywgbmV3UmVzcGVjdEJpbmRpbmcpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldFBvcnRDb21wb25lbnRMaW5rKCkgewogCQlyZXR1cm4gcG9ydENvbXBvbmVudExpbms7CiAJfQpAQCAtMjU5LDEyICs0MTUsMzUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fQUREUkVTU0lORzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBZGRyZXNzaW5nKG51bGwsIG1zZ3MpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUkVTUEVDVF9CSU5ESU5HOgorCQkJCXJldHVybiBiYXNpY1NldFJlc3BlY3RCaW5kaW5nKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKIAkJCQlyZXR1cm4gZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19FTkFCTEVfTVRPTToKLQkJCQlyZXR1cm4gaXNFbmFibGVNdG9tKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworCQkJCXJldHVybiBpc0VuYWJsZU10b20oKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX01UT01fVEhSRVNIT0xEOgorCQkJCXJldHVybiBnZXRNdG9tVGhyZXNob2xkKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19BRERSRVNTSU5HOgorCQkJCXJldHVybiBnZXRBZGRyZXNzaW5nKCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19SRVNQRUNUX0JJTkRJTkc6CisJCQkJcmV0dXJuIGdldFJlc3BlY3RCaW5kaW5nKCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LOgogCQkJCXJldHVybiBnZXRQb3J0Q29tcG9uZW50TGluaygpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fSUQ6CkBAIC0yNzgsMTMgKzQ1NywyMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0U6CiAJCQkJc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX0VOQUJMRV9NVE9NOgotCQkJCXNldEVuYWJsZU10b20oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7CisJCQkJc2V0RW5hYmxlTXRvbSgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fTVRPTV9USFJFU0hPTEQ6CisJCQkJc2V0TXRvbVRocmVzaG9sZCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fQUREUkVTU0lORzoKKwkJCQlzZXRBZGRyZXNzaW5nKChBZGRyZXNzaW5nVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUkVTUEVDVF9CSU5ESU5HOgorCQkJCXNldFJlc3BlY3RCaW5kaW5nKChSZXNwZWN0QmluZGluZ1R5cGUpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTks6CiAJCQkJc2V0UG9ydENvbXBvbmVudExpbmsoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0zMDEsNiArNDkwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFOgpAQCAtMzA5LDYgKzQ5OSwxNSBAQAogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fRU5BQkxFX01UT006CiAJCQkJdW5zZXRFbmFibGVNdG9tKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fTVRPTV9USFJFU0hPTEQ6CisJCQkJc2V0TXRvbVRocmVzaG9sZChNVE9NX1RIUkVTSE9MRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fQUREUkVTU0lORzoKKwkJCQlzZXRBZGRyZXNzaW5nKChBZGRyZXNzaW5nVHlwZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19SRVNQRUNUX0JJTkRJTkc6CisJCQkJc2V0UmVzcGVjdEJpbmRpbmcoKFJlc3BlY3RCaW5kaW5nVHlwZSludWxsKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LOgogCQkJCXNldFBvcnRDb21wb25lbnRMaW5rKFBPUlRfQ09NUE9ORU5UX0xJTktfRURFRkFVTFQpOwogCQkJCXJldHVybjsKQEAgLTMyNCwxMiArNTIzLDE5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRToKIAkJCQlyZXR1cm4gU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSAhPSBudWxsIDogIVNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX0VERUZBVUxULmVxdWFscyhzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fRU5BQkxFX01UT006CiAJCQkJcmV0dXJuIGlzU2V0RW5hYmxlTXRvbSgpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fTVRPTV9USFJFU0hPTEQ6CisJCQkJcmV0dXJuIE1UT01fVEhSRVNIT0xEX0VERUZBVUxUID09IG51bGwgPyBtdG9tVGhyZXNob2xkICE9IG51bGwgOiAhTVRPTV9USFJFU0hPTERfRURFRkFVTFQuZXF1YWxzKG10b21UaHJlc2hvbGQpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fQUREUkVTU0lORzoKKwkJCQlyZXR1cm4gYWRkcmVzc2luZyAhPSBudWxsOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUkVTUEVDVF9CSU5ESU5HOgorCQkJCXJldHVybiByZXNwZWN0QmluZGluZyAhPSBudWxsOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSzoKIAkJCQlyZXR1cm4gUE9SVF9DT01QT05FTlRfTElOS19FREVGQVVMVCA9PSBudWxsID8gcG9ydENvbXBvbmVudExpbmsgIT0gbnVsbCA6ICFQT1JUX0NPTVBPTkVOVF9MSU5LX0VERUZBVUxULmVxdWFscyhwb3J0Q29tcG9uZW50TGluayk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19JRDoKQEAgLTM0Myw2ICs1NDksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKQEAgLTM1MSw2ICs1NTgsOCBAQAogCQlyZXN1bHQuYXBwZW5kKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgZW5hYmxlTXRvbTogIik7IC8vJE5PTi1OTFMtMSQKIAkJaWYgKGVuYWJsZU10b21FU2V0KSByZXN1bHQuYXBwZW5kKGVuYWJsZU10b20pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIG10b21UaHJlc2hvbGQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobXRvbVRocmVzaG9sZCk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgcG9ydENvbXBvbmVudExpbms6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQocG9ydENvbXBvbmVudExpbmspOwogCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUHJvcGVydHlUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUHJvcGVydHlUeXBlSW1wbC5qYXZhCmluZGV4IDg4MjM1NDEuLjNlMjE0ZDAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1Byb3BlcnR5VHlwZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9Qcm9wZXJ0eVR5cGVJbXBsLmphdmEKQEAgLTExMSw2ICsxMTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUFJPUEVSVFlfVFlQRTsKIAl9CkBAIC0xODMsNiArMTg0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEVfX05BTUU6CkBAIC0yMDAsNiArMjAyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QUk9QRVJUWV9UWVBFX19OQU1FOgpAQCAtMjIwLDYgKzIyMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUFJPUEVSVFlfVFlQRV9fTkFNRToKQEAgLTI0MCw2ICsyNDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBST1BFUlRZX1RZUEVfX05BTUU6CkBAIC0yNTcsNiArMjYyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUVudlJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlRW52UmVmSW1wbC5qYXZhCmluZGV4IDExMTAwZWYuLjhlNmFhMzAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlRW52UmVmSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlRW52UmVmSW1wbC5qYXZhCkBAIC00NSw2ICs0NSw3IEBACiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VFbnZSZWZJbXBsI2dldFJlc291cmNlRW52UmVmVHlwZSA8ZW0+UmVzb3VyY2UgRW52IFJlZiBUeXBlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlRW52UmVmSW1wbCNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VFbnZSZWZJbXBsI2dldExvb2t1cE5hbWUgPGVtPkxvb2t1cCBOYW1lPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUVudlJlZkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CkBAIC02MCw3ICs2MSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VFbnZSZWZOYW1lKCkgPGVtPlJlc291cmNlIEVudiBSZWYgTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTMwLDcgKzEzMSwyNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbmplY3Rpb25UYXJnZXRzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8SW5qZWN0aW9uVGFyZ2V0PiBpbmplY3Rpb25UYXJnZXRzOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvb2t1cE5hbWUoKSA8ZW0+TG9va3VwIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExvb2t1cE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPT0tVUF9OQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvb2t1cE5hbWUoKSA8ZW0+TG9va3VwIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExvb2t1cE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbG9va3VwTmFtZSA9IExPT0tVUF9OQU1FX0VERUZBVUxUOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNjYsNiArMTg3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlJFU09VUkNFX0VOVl9SRUY7CiAJfQpAQCAtMTc1LDkgKzE5Nyw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMjUwLDkgKzI3Miw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEluamVjdGlvblRhcmdldHMoKSB7CisJcHVibGljIExpc3Q8SW5qZWN0aW9uVGFyZ2V0PiBnZXRJbmplY3Rpb25UYXJnZXRzKCkgewogCQlpZiAoaW5qZWN0aW9uVGFyZ2V0cyA9PSBudWxsKSB7Ci0JCQlpbmplY3Rpb25UYXJnZXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEluamVjdGlvblRhcmdldC5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7CisJCQlpbmplY3Rpb25UYXJnZXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEluamVjdGlvblRhcmdldD4oSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKIAkJfQogCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0czsKIAl9CkBAIC0yNjIsNiArMjg0LDI3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TG9va3VwTmFtZSgpIHsKKwkJcmV0dXJuIGxvb2t1cE5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TG9va3VwTmFtZShTdHJpbmcgbmV3TG9va3VwTmFtZSkgeworCQlTdHJpbmcgb2xkTG9va3VwTmFtZSA9IGxvb2t1cE5hbWU7CisJCWxvb2t1cE5hbWUgPSBuZXdMb29rdXBOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0xPT0tVUF9OQU1FLCBvbGRMb29rdXBOYW1lLCBsb29rdXBOYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKIAkJcmV0dXJuIGlkOwogCX0KQEAgLTI4MywxMiArMzI2LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluamVjdGlvblRhcmdldHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTI5OCw2ICszNDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TOgpAQCAtMzEwLDYgKzM1NSw4IEBACiAJCQkJcmV0dXJuIGdldE1hcHBlZE5hbWUoKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKIAkJCQlyZXR1cm4gZ2V0SW5qZWN0aW9uVGFyZ2V0cygpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0xPT0tVUF9OQU1FOgorCQkJCXJldHVybiBnZXRMb29rdXBOYW1lKCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fSUQ6CiAJCQkJcmV0dXJuIGdldElkKCk7CiAJCX0KQEAgLTMyMSwxMSArMzY4LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX1JFU09VUkNFX0VOVl9SRUZfTkFNRToKIAkJCQlzZXRSZXNvdXJjZUVudlJlZk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0zMzgsNyArMzg3LDEwIEBACiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEluamVjdGlvblRhcmdldD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19MT09LVVBfTkFNRToKKwkJCQlzZXRMb29rdXBOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JRDoKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTM1Miw2ICs0MDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKQEAgLTM2OSw2ICs0MjIsOSBAQAogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19MT09LVVBfTkFNRToKKwkJCQlzZXRMb29rdXBOYW1lKExPT0tVUF9OQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fSUQ6CiAJCQkJc2V0SWQoSURfRURFRkFVTFQpOwogCQkJCXJldHVybjsKQEAgLTM4MSw2ICs0MzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKQEAgLTM5Myw2ICs0NTAsOCBAQAogCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKIAkJCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0cyAhPSBudWxsICYmICFpbmplY3Rpb25UYXJnZXRzLmlzRW1wdHkoKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19MT09LVVBfTkFNRToKKwkJCQlyZXR1cm4gTE9PS1VQX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGxvb2t1cE5hbWUgIT0gbnVsbCA6ICFMT09LVVBfTkFNRV9FREVGQVVMVC5lcXVhbHMobG9va3VwTmFtZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fSUQ6CiAJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CiAJCX0KQEAgLTQwNCw2ICs0NjMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKQEAgLTQxNCw2ICs0NzQsOCBAQAogCQlyZXN1bHQuYXBwZW5kKHJlc291cmNlRW52UmVmVHlwZSk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgbWFwcGVkTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChtYXBwZWROYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBsb29rdXBOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGxvb2t1cE5hbWUpOwogCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGlkKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUmVzb3VyY2VSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVJlZkltcGwuamF2YQppbmRleCAxMDRkYTA2Li5mZTRjZTY4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVJlZkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVJlZkltcGwuamF2YQpAQCAtNDksNiArNDksNyBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbCNnZXRSZXNTaGFyaW5nU2NvcGUgPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGwjZ2V0TWFwcGVkTmFtZSA8ZW0+TWFwcGVkIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbCNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzb3VyY2VSZWZJbXBsI2dldExvb2t1cE5hbWUgPGVtPkxvb2t1cCBOYW1lPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVJlZkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CkBAIC02NCw3ICs2NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzUmVmTmFtZSgpIDxlbT5SZXMgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTEzMyw3ICsxMzQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlc0F1dGhFU2V0ID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gcmVzQXV0aEVTZXQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzU2hhcmluZ1Njb3BlKCkgPGVtPlJlcyBTaGFyaW5nIFNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNjIsNyArMTYzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNTaGFyaW5nU2NvcGVFU2V0ID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gcmVzU2hhcmluZ1Njb3BlRVNldDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xOTIsNyArMTkzLDI3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGluamVjdGlvblRhcmdldHMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxJbmplY3Rpb25UYXJnZXQ+IGluamVjdGlvblRhcmdldHM7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9va3VwTmFtZSgpIDxlbT5Mb29rdXAgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TG9va3VwTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9PS1VQX05BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9va3VwTmFtZSgpIDxlbT5Mb29rdXAgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TG9va3VwTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBsb29rdXBOYW1lID0gTE9PS1VQX05BTUVfRURFRkFVTFQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTIyOCw2ICsyNDksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUkVTT1VSQ0VfUkVGOwogCX0KQEAgLTIzNyw5ICsyNTksOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIGRlc2NyaXB0aW9uczsKIAl9CkBAIC00MDQsOSArNDI2LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIHsKKwlwdWJsaWMgTGlzdDxJbmplY3Rpb25UYXJnZXQ+IGdldEluamVjdGlvblRhcmdldHMoKSB7CiAJCWlmIChpbmplY3Rpb25UYXJnZXRzID09IG51bGwpIHsKLQkJCWluamVjdGlvblRhcmdldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMpOworCQkJaW5qZWN0aW9uVGFyZ2V0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJbmplY3Rpb25UYXJnZXQ+KEluamVjdGlvblRhcmdldC5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTKTsKIAkJfQogCQlyZXR1cm4gaW5qZWN0aW9uVGFyZ2V0czsKIAl9CkBAIC00MTYsNiArNDM4LDI3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TG9va3VwTmFtZSgpIHsKKwkJcmV0dXJuIGxvb2t1cE5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TG9va3VwTmFtZShTdHJpbmcgbmV3TG9va3VwTmFtZSkgeworCQlTdHJpbmcgb2xkTG9va3VwTmFtZSA9IGxvb2t1cE5hbWU7CisJCWxvb2t1cE5hbWUgPSBuZXdMb29rdXBOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fTE9PS1VQX05BTUUsIG9sZExvb2t1cE5hbWUsIGxvb2t1cE5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldElkKCkgewogCQlyZXR1cm4gaWQ7CiAJfQpAQCAtNDM3LDEyICs0ODAsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluamVjdGlvblRhcmdldHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTQ1Miw2ICs0OTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTlM6CkBAIC00NjgsNiArNTEzLDggQEAKIAkJCQlyZXR1cm4gZ2V0TWFwcGVkTmFtZSgpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6CiAJCQkJcmV0dXJuIGdldEluamVjdGlvblRhcmdldHMoKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0xPT0tVUF9OQU1FOgorCQkJCXJldHVybiBnZXRMb29rdXBOYW1lKCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19JRDoKIAkJCQlyZXR1cm4gZ2V0SWQoKTsKIAkJfQpAQCAtNDc5LDExICs1MjYsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX1JFU19SRUZfTkFNRToKIAkJCQlzZXRSZXNSZWZOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtNTAyLDcgKzU1MSwxMCBAQAogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwotCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEluamVjdGlvblRhcmdldD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0xPT0tVUF9OQU1FOgorCQkJCXNldExvb2t1cE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC01MTYsNiArNTY4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUzoKQEAgLTUzOSw2ICs1OTIsOSBAQAogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6CiAJCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fTE9PS1VQX05BTUU6CisJCQkJc2V0TG9va3VwTmFtZShMT09LVVBfTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fSUQ6CiAJCQkJc2V0SWQoSURfRURFRkFVTFQpOwogCQkJCXJldHVybjsKQEAgLTU1MSw2ICs2MDcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT05TOgpAQCAtNTY3LDYgKzYyNCw4IEBACiAJCQkJcmV0dXJuIE1BUFBFRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWROYW1lICE9IG51bGwgOiAhTUFQUEVEX05BTUVfRURFRkFVTFQuZXF1YWxzKG1hcHBlZE5hbWUpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6CiAJCQkJcmV0dXJuIGluamVjdGlvblRhcmdldHMgIT0gbnVsbCAmJiAhaW5qZWN0aW9uVGFyZ2V0cy5pc0VtcHR5KCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19MT09LVVBfTkFNRToKKwkJCQlyZXR1cm4gTE9PS1VQX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGxvb2t1cE5hbWUgIT0gbnVsbCA6ICFMT09LVVBfTkFNRV9FREVGQVVMVC5lcXVhbHMobG9va3VwTmFtZSk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTT1VSQ0VfUkVGX19JRDoKIAkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKIAkJfQpAQCAtNTc4LDYgKzYzNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApAQCAtNTkyLDYgKzY1Miw4IEBACiAJCWlmIChyZXNTaGFyaW5nU2NvcGVFU2V0KSByZXN1bHQuYXBwZW5kKHJlc1NoYXJpbmdTY29wZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoIiwgbWFwcGVkTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChtYXBwZWROYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBsb29rdXBOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGxvb2t1cE5hbWUpOwogCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGlkKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUmVzcGVjdEJpbmRpbmdUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvUmVzcGVjdEJpbmRpbmdUeXBlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YWVhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9SZXNwZWN0QmluZGluZ1R5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc3BlY3RCaW5kaW5nVHlwZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzcGVjdCBCaW5kaW5nIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc3BlY3RCaW5kaW5nVHlwZUltcGwjaXNFbmFibGVkIDxlbT5FbmFibGVkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUmVzcGVjdEJpbmRpbmdUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVzcGVjdEJpbmRpbmdUeXBlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFbmFibGVkKCkgPGVtPkVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRW5hYmxlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVOQUJMRURfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW5hYmxlZCgpIDxlbT5FbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0VuYWJsZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQgPSBFTkFCTEVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFbmFibGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVkRVNldDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBSZXNwZWN0QmluZGluZ1R5cGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5SRVNQRUNUX0JJTkRJTkdfVFlQRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisJCXJldHVybiBlbmFibGVkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBuZXdFbmFibGVkKSB7CisJCWJvb2xlYW4gb2xkRW5hYmxlZCA9IGVuYWJsZWQ7CisJCWVuYWJsZWQgPSBuZXdFbmFibGVkOworCQlib29sZWFuIG9sZEVuYWJsZWRFU2V0ID0gZW5hYmxlZEVTZXQ7CisJCWVuYWJsZWRFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5SRVNQRUNUX0JJTkRJTkdfVFlQRV9fRU5BQkxFRCwgb2xkRW5hYmxlZCwgZW5hYmxlZCwgIW9sZEVuYWJsZWRFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdW5zZXRFbmFibGVkKCkgeworCQlib29sZWFuIG9sZEVuYWJsZWQgPSBlbmFibGVkOworCQlib29sZWFuIG9sZEVuYWJsZWRFU2V0ID0gZW5hYmxlZEVTZXQ7CisJCWVuYWJsZWQgPSBFTkFCTEVEX0VERUZBVUxUOworCQllbmFibGVkRVNldCA9IGZhbHNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEphdmFlZVBhY2thZ2UuUkVTUEVDVF9CSU5ESU5HX1RZUEVfX0VOQUJMRUQsIG9sZEVuYWJsZWQsIEVOQUJMRURfRURFRkFVTFQsIG9sZEVuYWJsZWRFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZXRFbmFibGVkKCkgeworCQlyZXR1cm4gZW5hYmxlZEVTZXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU1BFQ1RfQklORElOR19UWVBFX19FTkFCTEVEOgorCQkJCXJldHVybiBpc0VuYWJsZWQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU1BFQ1RfQklORElOR19UWVBFX19FTkFCTEVEOgorCQkJCXNldEVuYWJsZWQoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTUEVDVF9CSU5ESU5HX1RZUEVfX0VOQUJMRUQ6CisJCQkJdW5zZXRFbmFibGVkKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTUEVDVF9CSU5ESU5HX1RZUEVfX0VOQUJMRUQ6CisJCQkJcmV0dXJuIGlzU2V0RW5hYmxlZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoZW5hYmxlZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGVuYWJsZWRFU2V0KSByZXN1bHQuYXBwZW5kKGVuYWJsZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9SZXNwZWN0QmluZGluZ1R5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9SdW5Bc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1J1bkFzSW1wbC5qYXZhCmluZGV4IGUyNWI3MDguLmIxZTgwZjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1J1bkFzSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1J1bkFzSW1wbC5qYXZhCkBAIC01Niw3ICs1Niw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZU5hbWUoKSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMTIsNiArMTEyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlJVTl9BUzsKIAl9CkBAIC0xMjEsOSArMTIyLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgeworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CiAJCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlJVTl9BU19fREVTQ1JJUFRJT05TKTsKKwkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuUlVOX0FTX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMTc1LDEwICsxNzYsMTEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BU19fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTE4OCw2ICsxOTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUlVOX0FTX19ERVNDUklQVElPTlM6CkBAIC0yMDUsMTEgKzIwOCwxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BU19fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BU19fUk9MRV9OQU1FOgogCQkJCXNldFJvbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtMjI2LDYgKzIzMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUlVOX0FTX19ERVNDUklQVElPTlM6CkBAIC0yNDYsNiArMjUyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVNfX0RFU0NSSVBUSU9OUzoKQEAgLTI2Myw2ICsyNzAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZUltcGwuamF2YQppbmRleCBmYjM0MzM4Li5mOWE2Y2NiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZWN1cml0eVJvbGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlSW1wbC5qYXZhCkBAIC01Niw3ICs1Niw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZU5hbWUoKSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMTIsNiArMTEyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFQ1VSSVRZX1JPTEU7CiAJfQpAQCAtMTIxLDkgKzEyMiw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMTc1LDEwICsxNzYsMTEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC0xODgsNiArMTkwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUzoKQEAgLTIwNSwxMSArMjA4LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX1JPTEVfTkFNRToKIAkJCQlzZXRSb2xlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTIyNiw2ICsyMzEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUzoKQEAgLTI0Niw2ICsyNTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OUzoKQEAgLTI2Myw2ICsyNzAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZVJlZkltcGwuamF2YQppbmRleCBmMWRkYzkxLi42ZTVkNTc1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZWN1cml0eVJvbGVSZWZJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlUmVmSW1wbC5qYXZhCkBAIC01Nyw3ICs1Nyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZU5hbWUoKSA8ZW0+Um9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMzMsNiArMTMzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFQ1VSSVRZX1JPTEVfUkVGOwogCX0KQEAgLTE0Miw5ICsxNDMsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMjE3LDEwICsyMTgsMTEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtMjMwLDYgKzIzMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TOgpAQCAtMjQ5LDExICsyNTIsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ST0xFX05BTUU6CiAJCQkJc2V0Um9sZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0yNzMsNiArMjc4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fREVTQ1JJUFRJT05TOgpAQCAtMjk2LDYgKzMwMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX0RFU0NSSVBUSU9OUzoKQEAgLTMxNSw2ICszMjIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSGFuZGxlckNoYWluSW1wbC5qYXZhCmluZGV4IDQ2ZWQwMzUuLjJlZDM2NmUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW5JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkhhbmRsZXJDaGFpbkltcGwuamF2YQpAQCAtOTgsNyArOTgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTGlzdCBQUk9UT0NPTF9CSU5ESU5HU19FREVGQVVMVCA9IG51bGw7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gUFJPVE9DT0xfQklORElOR1NfRURFRkFVTFQgPSBudWxsOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvdG9jb2xCaW5kaW5ncygpIDxlbT5Qcm90b2NvbCBCaW5kaW5nczwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTA4LDcgKzEwOCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIExpc3QgcHJvdG9jb2xCaW5kaW5ncyA9IFBST1RPQ09MX0JJTkRJTkdTX0VERUZBVUxUOworCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gcHJvdG9jb2xCaW5kaW5ncyA9IFBST1RPQ09MX0JJTkRJTkdTX0VERUZBVUxUOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFuZGxlcnMoKSA8ZW0+SGFuZGxlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTE4LDcgKzExOCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGhhbmRsZXJzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8U2VydmljZVJlZkhhbmRsZXI+IGhhbmRsZXJzOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNTQsNiArMTU0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU47CiAJfQpAQCAtMjA1LDcgKzIwNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3RvY29sQmluZGluZ3MoKSB7CisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQcm90b2NvbEJpbmRpbmdzKCkgewogCQlyZXR1cm4gcHJvdG9jb2xCaW5kaW5nczsKIAl9CiAKQEAgLTIxNCw4ICsyMTUsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm90b2NvbEJpbmRpbmdzKExpc3QgbmV3UHJvdG9jb2xCaW5kaW5ncykgewotCQlMaXN0IG9sZFByb3RvY29sQmluZGluZ3MgPSBwcm90b2NvbEJpbmRpbmdzOworCXB1YmxpYyB2b2lkIHNldFByb3RvY29sQmluZGluZ3MoTGlzdDxTdHJpbmc+IG5ld1Byb3RvY29sQmluZGluZ3MpIHsKKwkJTGlzdDxTdHJpbmc+IG9sZFByb3RvY29sQmluZGluZ3MgPSBwcm90b2NvbEJpbmRpbmdzOwogCQlwcm90b2NvbEJpbmRpbmdzID0gbmV3UHJvdG9jb2xCaW5kaW5nczsKIAkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQogCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19QUk9UT0NPTF9CSU5ESU5HUywgb2xkUHJvdG9jb2xCaW5kaW5ncywgcHJvdG9jb2xCaW5kaW5ncykpOwpAQCAtMjI2LDkgKzIyNyw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEhhbmRsZXJzKCkgeworCXB1YmxpYyBMaXN0PFNlcnZpY2VSZWZIYW5kbGVyPiBnZXRIYW5kbGVycygpIHsKIAkJaWYgKGhhbmRsZXJzID09IG51bGwpIHsKLQkJCWhhbmRsZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VSZWZIYW5kbGVyLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX0hBTkRMRVJTKTsKKwkJCWhhbmRsZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFNlcnZpY2VSZWZIYW5kbGVyPihTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19IQU5ETEVSUyk7CiAJCX0KIAkJcmV0dXJuIGhhbmRsZXJzOwogCX0KQEAgLTI1OSwxMCArMjYwLDExIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19IQU5ETEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEhhbmRsZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEhhbmRsZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtMjcyLDYgKzI3NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19TRVJWSUNFX05BTUVfUEFUVEVSTjoKQEAgLTI5Myw2ICsyOTYsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1NFUlZJQ0VfTkFNRV9QQVRURVJOOgpAQCAtMzAyLDExICszMDcsMTEgQEAKIAkJCQlzZXRQb3J0TmFtZVBhdHRlcm4oKFN0cmluZyluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX1BST1RPQ09MX0JJTkRJTkdTOgotCQkJCXNldFByb3RvY29sQmluZGluZ3MoKExpc3QpbmV3VmFsdWUpOworCQkJCXNldFByb3RvY29sQmluZGluZ3MoKExpc3Q8U3RyaW5nPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX0hBTkRMRVJTOgogCQkJCWdldEhhbmRsZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRIYW5kbGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SGFuZGxlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlcnZpY2VSZWZIYW5kbGVyPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5fX0lEOgogCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtMzIwLDYgKzMyNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk46CkBAIC0zNDYsNiArMzUyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOX19TRVJWSUNFX05BTUVfUEFUVEVSTjoKQEAgLTM2Nyw2ICszNzQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsLmphdmEKaW5kZXggM2M5MmFjNS4uMDA4ODhhMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkhhbmRsZXJDaGFpbnNJbXBsLmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaGFuZGxlckNoYWlucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4+IGhhbmRsZXJDaGFpbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTkxLDYgKzkxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TOwogCX0KQEAgLTEwMCw5ICsxMDEsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRIYW5kbGVyQ2hhaW5zKCkgeworCXB1YmxpYyBMaXN0PFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4+IGdldEhhbmRsZXJDaGFpbnMoKSB7CiAJCWlmIChoYW5kbGVyQ2hhaW5zID09IG51bGwpIHsKLQkJCWhhbmRsZXJDaGFpbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VydmljZVJlZkhhbmRsZXJDaGFpbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSEFORExFUl9DSEFJTlMpOworCQkJaGFuZGxlckNoYWlucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTZXJ2aWNlUmVmSGFuZGxlckNoYWluPihTZXJ2aWNlUmVmSGFuZGxlckNoYWluLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TX19IQU5ETEVSX0NIQUlOUyk7CiAJCX0KIAkJcmV0dXJuIGhhbmRsZXJDaGFpbnM7CiAJfQpAQCAtMTMzLDEwICsxMzQsMTEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU5TX19IQU5ETEVSX0NIQUlOUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEhhbmRsZXJDaGFpbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SGFuZGxlckNoYWlucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTE0Niw2ICsxNDgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTlNfX0hBTkRMRVJfQ0hBSU5TOgpAQCAtMTYxLDExICsxNjQsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSEFORExFUl9DSEFJTlM6CiAJCQkJZ2V0SGFuZGxlckNoYWlucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SGFuZGxlckNoYWlucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SGFuZGxlckNoYWlucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VydmljZVJlZkhhbmRsZXJDaGFpbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0xNzksNiArMTg0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSEFORExFUl9DSEFJTlM6CkBAIC0xOTYsNiArMjAyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOU19fSEFORExFUl9DSEFJTlM6CkBAIC0yMTEsNiArMjE4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSGFuZGxlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlcnZpY2VSZWZIYW5kbGVySW1wbC5qYXZhCmluZGV4IDdhM2RhZjhhLi43Mzc4YjVhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSGFuZGxlckltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSGFuZGxlckltcGwuamF2YQpAQCAtMTMsNiArMTMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CiAKQEAgLTY3LDcgKzY4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTc3LDcgKzc4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGlzcGxheU5hbWU+IGRpc3BsYXlOYW1lczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25zKCkgPGVtPkljb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTg3LDcgKzg4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaWNvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxJY29uPiBpY29uczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYW5kbGVyTmFtZSgpIDxlbT5IYW5kbGVyIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTEzNyw3ICsxMzgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbml0UGFyYW1zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8UGFyYW1WYWx1ZT4gaW5pdFBhcmFtczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvYXBIZWFkZXJzKCkgPGVtPlNvYXAgSGVhZGVyczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCkBAIC0xNDcsNyArMTQ4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc29hcEhlYWRlcnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxRTmFtZT4gc29hcEhlYWRlcnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTb2FwUm9sZXMoKSA8ZW0+U29hcCBSb2xlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCkBAIC0xNTcsNyArMTU4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc29hcFJvbGVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBzb2FwUm9sZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3J0TmFtZXMoKSA8ZW0+UG9ydCBOYW1lczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCkBAIC0xNjcsNyArMTY4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcG9ydE5hbWVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBwb3J0TmFtZXM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTIwMyw2ICsyMDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUZfSEFORExFUjsKIAl9CkBAIC0yMTIsOSArMjE0LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgeworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CiAJCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RFU0NSSVBUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIGRlc2NyaXB0aW9uczsKIAl9CkBAIC0yMjQsOSArMjI2LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgeworCXB1YmxpYyBMaXN0PERpc3BsYXlOYW1lPiBnZXREaXNwbGF5TmFtZXMoKSB7CiAJCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RJU1BMQVlfTkFNRVMpOworCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERpc3BsYXlOYW1lPihEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19ESVNQTEFZX05BTUVTKTsKIAkJfQogCQlyZXR1cm4gZGlzcGxheU5hbWVzOwogCX0KQEAgLTIzNiw5ICsyMzgsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKKwlwdWJsaWMgTGlzdDxJY29uPiBnZXRJY29ucygpIHsKIAkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSUNPTlMpOworCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SWNvbj4oSWNvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JQ09OUyk7CiAJCX0KIAkJcmV0dXJuIGljb25zOwogCX0KQEAgLTI5MCw5ICsyOTIsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbml0UGFyYW1zKCkgeworCXB1YmxpYyBMaXN0PFBhcmFtVmFsdWU+IGdldEluaXRQYXJhbXMoKSB7CiAJCWlmIChpbml0UGFyYW1zID09IG51bGwpIHsKLQkJCWluaXRQYXJhbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGFyYW1WYWx1ZS5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19JTklUX1BBUkFNUyk7CisJCQlpbml0UGFyYW1zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFBhcmFtVmFsdWU+KFBhcmFtVmFsdWUuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSU5JVF9QQVJBTVMpOwogCQl9CiAJCXJldHVybiBpbml0UGFyYW1zOwogCX0KQEAgLTMwMiw5ICszMDQsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTb2FwSGVhZGVycygpIHsKKwlwdWJsaWMgTGlzdDxRTmFtZT4gZ2V0U29hcEhlYWRlcnMoKSB7CiAJCWlmIChzb2FwSGVhZGVycyA9PSBudWxsKSB7Ci0JCQlzb2FwSGVhZGVycyA9IG5ldyBFRGF0YVR5cGVFTGlzdChPYmplY3QuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9IRUFERVJTKTsKKwkJCXNvYXBIZWFkZXJzID0gbmV3IEVEYXRhVHlwZUVMaXN0PFFOYW1lPihRTmFtZS5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19TT0FQX0hFQURFUlMpOwogCQl9CiAJCXJldHVybiBzb2FwSGVhZGVyczsKIAl9CkBAIC0zMTQsOSArMzE2LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0U29hcFJvbGVzKCkgeworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0U29hcFJvbGVzKCkgewogCQlpZiAoc29hcFJvbGVzID09IG51bGwpIHsKLQkJCXNvYXBSb2xlcyA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9ST0xFUyk7CisJCQlzb2FwUm9sZXMgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9ST0xFUyk7CiAJCX0KIAkJcmV0dXJuIHNvYXBSb2xlczsKIAl9CkBAIC0zMjYsOSArMzI4LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0UG9ydE5hbWVzKCkgeworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UG9ydE5hbWVzKCkgewogCQlpZiAocG9ydE5hbWVzID09IG51bGwpIHsKLQkJCXBvcnROYW1lcyA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fUE9SVF9OQU1FUyk7CisJCQlwb3J0TmFtZXMgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fUE9SVF9OQU1FUyk7CiAJCX0KIAkJcmV0dXJuIHBvcnROYW1lczsKIAl9CkBAIC0zNTksMTYgKzM2MSwxNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJbml0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtMzc4LDYgKzM4MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19ERVNDUklQVElPTlM6CkBAIC00MDksMTkgKzQxMywyMSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19ESVNQTEFZX05BTUVTOgogCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERpc3BsYXlOYW1lPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfX0lDT05TOgogCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEljb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSEFORExFUl9OQU1FOgogCQkJCXNldEhhbmRsZXJOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtNDMxLDE5ICs0MzcsMTkgQEAKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSU5JVF9QQVJBTVM6CiAJCQkJZ2V0SW5pdFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5pdFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SW5pdFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGFyYW1WYWx1ZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19TT0FQX0hFQURFUlM6CiAJCQkJZ2V0U29hcEhlYWRlcnMoKS5jbGVhcigpOwotCQkJCWdldFNvYXBIZWFkZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRTb2FwSGVhZGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUU5hbWU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fU09BUF9ST0xFUzoKIAkJCQlnZXRTb2FwUm9sZXMoKS5jbGVhcigpOwotCQkJCWdldFNvYXBSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0U29hcFJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fUE9SVF9OQU1FUzoKIAkJCQlnZXRQb3J0TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldFBvcnROYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UG9ydE5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfSEFORExFUl9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC00NTcsNiArNDYzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19ERVNDUklQVElPTlM6CkBAIC00OTgsNiArNTA1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX19ERVNDUklQVElPTlM6CkBAIC01MjksNiArNTM3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL2ltcGwvU2VydmljZVJlZkltcGwuamF2YQppbmRleCBkZTc5ODEzLi5mZGIwMDI3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1NlcnZpY2VSZWZJbXBsLmphdmEKQEAgLTEzLDYgKzEzLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwogCkBAIC01OSw2ICs2MCw3IEBACiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0SGFuZGxlckNoYWlucyA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldE1hcHBlZE5hbWUgPGVtPk1hcHBlZCBOYW1lPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5TZXJ2aWNlUmVmSW1wbCNnZXRJbmplY3Rpb25UYXJnZXRzIDxlbT5JbmplY3Rpb24gVGFyZ2V0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkltcGwjZ2V0TG9va3VwTmFtZSA8ZW0+TG9va3VwIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlNlcnZpY2VSZWZJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICogPC9wPgpAQCAtNzQsNyArNzYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb25zOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtODQsNyArODYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxEaXNwbGF5TmFtZT4gZGlzcGxheU5hbWVzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtOTQsNyArOTYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpY29ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEljb24+IGljb25zOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZOYW1lKCkgPGVtPlNlcnZpY2UgUmVmIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTIwNCw3ICsyMDYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFNFUlZJQ0VfUU5BTUVfRURFRkFVTFQgPSBudWxsOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUU5hbWUgU0VSVklDRV9RTkFNRV9FREVGQVVMVCA9IG51bGw7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlUW5hbWUoKSA8ZW0+U2VydmljZSBRbmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMjE0LDcgKzIxNiw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIE9iamVjdCBzZXJ2aWNlUW5hbWUgPSBTRVJWSUNFX1FOQU1FX0VERUZBVUxUOworCXByb3RlY3RlZCBRTmFtZSBzZXJ2aWNlUW5hbWUgPSBTRVJWSUNFX1FOQU1FX0VERUZBVUxUOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9ydENvbXBvbmVudFJlZnMoKSA8ZW0+UG9ydCBDb21wb25lbnQgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yMjQsNyArMjI2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcG9ydENvbXBvbmVudFJlZnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxQb3J0Q29tcG9uZW50UmVmPiBwb3J0Q29tcG9uZW50UmVmczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJzKCkgPGVtPkhhbmRsZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTIzNCw3ICsyMzYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBoYW5kbGVycyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFNlcnZpY2VSZWZIYW5kbGVyPiBoYW5kbGVyczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhbmRsZXJDaGFpbnMoKSA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTI0NCw3ICsyNDYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyBoYW5kbGVyQ2hhaW5zID0gbnVsbDsKKwlwcm90ZWN0ZWQgU2VydmljZVJlZkhhbmRsZXJDaGFpbnMgaGFuZGxlckNoYWluczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWROYW1lKCkgPGVtPk1hcHBlZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0yNzQsNyArMjc2LDI3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGluamVjdGlvblRhcmdldHMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxJbmplY3Rpb25UYXJnZXQ+IGluamVjdGlvblRhcmdldHM7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9va3VwTmFtZSgpIDxlbT5Mb29rdXAgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TG9va3VwTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9PS1VQX05BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9va3VwTmFtZSgpIDxlbT5Mb29rdXAgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TG9va3VwTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBsb29rdXBOYW1lID0gTE9PS1VQX05BTUVfRURFRkFVTFQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTMxMCw2ICszMzIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUY7CiAJfQpAQCAtMzE5LDkgKzM0Miw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fREVTQ1JJUFRJT05TKTsKKwkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIGRlc2NyaXB0aW9uczsKIAl9CkBAIC0zMzEsOSArMzU0LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgeworCXB1YmxpYyBMaXN0PERpc3BsYXlOYW1lPiBnZXREaXNwbGF5TmFtZXMoKSB7CiAJCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19ESVNQTEFZX05BTUVTKTsKKwkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEaXNwbGF5TmFtZT4oRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0RJU1BMQVlfTkFNRVMpOwogCQl9CiAJCXJldHVybiBkaXNwbGF5TmFtZXM7CiAJfQpAQCAtMzQzLDkgKzM2Niw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgeworCXB1YmxpYyBMaXN0PEljb24+IGdldEljb25zKCkgewogCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUNPTlMpOworCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SWNvbj4oSWNvbi5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUNPTlMpOwogCQl9CiAJCXJldHVybiBpY29uczsKIAl9CkBAIC00NjAsNyArNDgzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBnZXRTZXJ2aWNlUW5hbWUoKSB7CisJcHVibGljIFFOYW1lIGdldFNlcnZpY2VRbmFtZSgpIHsKIAkJcmV0dXJuIHNlcnZpY2VRbmFtZTsKIAl9CiAKQEAgLTQ2OSw4ICs0OTIsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUW5hbWUoT2JqZWN0IG5ld1NlcnZpY2VRbmFtZSkgewotCQlPYmplY3Qgb2xkU2VydmljZVFuYW1lID0gc2VydmljZVFuYW1lOworCXB1YmxpYyB2b2lkIHNldFNlcnZpY2VRbmFtZShRTmFtZSBuZXdTZXJ2aWNlUW5hbWUpIHsKKwkJUU5hbWUgb2xkU2VydmljZVFuYW1lID0gc2VydmljZVFuYW1lOwogCQlzZXJ2aWNlUW5hbWUgPSBuZXdTZXJ2aWNlUW5hbWU7CiAJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKIAkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfUU5BTUUsIG9sZFNlcnZpY2VRbmFtZSwgc2VydmljZVFuYW1lKSk7CkBAIC00ODEsOSArNTA0LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0UG9ydENvbXBvbmVudFJlZnMoKSB7CisJcHVibGljIExpc3Q8UG9ydENvbXBvbmVudFJlZj4gZ2V0UG9ydENvbXBvbmVudFJlZnMoKSB7CiAJCWlmIChwb3J0Q29tcG9uZW50UmVmcyA9PSBudWxsKSB7Ci0JCQlwb3J0Q29tcG9uZW50UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTKTsKKwkJCXBvcnRDb21wb25lbnRSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFBvcnRDb21wb25lbnRSZWY+KFBvcnRDb21wb25lbnRSZWYuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX1BPUlRfQ09NUE9ORU5UX1JFRlMpOwogCQl9CiAJCXJldHVybiBwb3J0Q29tcG9uZW50UmVmczsKIAl9CkBAIC00OTMsOSArNTE2LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SGFuZGxlcnMoKSB7CisJcHVibGljIExpc3Q8U2VydmljZVJlZkhhbmRsZXI+IGdldEhhbmRsZXJzKCkgewogCQlpZiAoaGFuZGxlcnMgPT0gbnVsbCkgewotCQkJaGFuZGxlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VydmljZVJlZkhhbmRsZXIuY2xhc3MsIHRoaXMsIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTKTsKKwkJCWhhbmRsZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFNlcnZpY2VSZWZIYW5kbGVyPihTZXJ2aWNlUmVmSGFuZGxlci5jbGFzcywgdGhpcywgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlMpOwogCQl9CiAJCXJldHVybiBoYW5kbGVyczsKIAl9CkBAIC01NjksOSArNTkyLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SW5qZWN0aW9uVGFyZ2V0cygpIHsKKwlwdWJsaWMgTGlzdDxJbmplY3Rpb25UYXJnZXQ+IGdldEluamVjdGlvblRhcmdldHMoKSB7CiAJCWlmIChpbmplY3Rpb25UYXJnZXRzID09IG51bGwpIHsKLQkJCWluamVjdGlvblRhcmdldHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7CisJCQlpbmplY3Rpb25UYXJnZXRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEluamVjdGlvblRhcmdldD4oSW5qZWN0aW9uVGFyZ2V0LmNsYXNzLCB0aGlzLCBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyk7CiAJCX0KIAkJcmV0dXJuIGluamVjdGlvblRhcmdldHM7CiAJfQpAQCAtNTgxLDYgKzYwNCwyNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExvb2t1cE5hbWUoKSB7CisJCXJldHVybiBsb29rdXBOYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldExvb2t1cE5hbWUoU3RyaW5nIG5ld0xvb2t1cE5hbWUpIHsKKwkJU3RyaW5nIG9sZExvb2t1cE5hbWUgPSBsb29rdXBOYW1lOworCQlsb29rdXBOYW1lID0gbmV3TG9va3VwTmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fTE9PS1VQX05BTUUsIG9sZExvb2t1cE5hbWUsIGxvb2t1cE5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldElkKCkgewogCQlyZXR1cm4gaWQ7CiAJfQpAQCAtNjAyLDIyICs2NDYsMjMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvcnRDb21wb25lbnRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBvcnRDb21wb25lbnRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRIYW5kbGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRIYW5kbGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJfQ0hBSU5TOgogCQkJCXJldHVybiBiYXNpY1NldEhhbmRsZXJDaGFpbnMobnVsbCwgbXNncyk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJbmplY3Rpb25UYXJnZXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtNjI3LDYgKzY3Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fREVTQ1JJUFRJT05TOgpAQCAtNjU3LDYgKzcwMyw4IEBACiAJCQkJcmV0dXJuIGdldE1hcHBlZE5hbWUoKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6CiAJCQkJcmV0dXJuIGdldEluamVjdGlvblRhcmdldHMoKTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fTE9PS1VQX05BTUU6CisJCQkJcmV0dXJuIGdldExvb2t1cE5hbWUoKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUQ6CiAJCQkJcmV0dXJuIGdldElkKCk7CiAJCX0KQEAgLTY2OCwxOSArNzE2LDIxIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fRElTUExBWV9OQU1FUzoKIAkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaXNwbGF5TmFtZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUNPTlM6CiAJCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSWNvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9SRUZfTkFNRToKIAkJCQlzZXRTZXJ2aWNlUmVmTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTY5OCwxNSArNzQ4LDE1IEBACiAJCQkJc2V0SmF4cnBjTWFwcGluZ0ZpbGUoKFN0cmluZyluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FOgotCQkJCXNldFNlcnZpY2VRbmFtZSgoT2JqZWN0KW5ld1ZhbHVlKTsKKwkJCQlzZXRTZXJ2aWNlUW5hbWUobmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fUE9SVF9DT01QT05FTlRfUkVGUzoKIAkJCQlnZXRQb3J0Q29tcG9uZW50UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9ydENvbXBvbmVudFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFBvcnRDb21wb25lbnRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQb3J0Q29tcG9uZW50UmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19IQU5ETEVSUzoKIAkJCQlnZXRIYW5kbGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0SGFuZGxlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEhhbmRsZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZXJ2aWNlUmVmSGFuZGxlcj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSEFORExFUl9DSEFJTlM6CiAJCQkJc2V0SGFuZGxlckNoYWlucygoU2VydmljZVJlZkhhbmRsZXJDaGFpbnMpbmV3VmFsdWUpOwpAQCAtNzE2LDcgKzc2NiwxMCBAQAogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6CiAJCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSW5qZWN0aW9uVGFyZ2V0PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19MT09LVVBfTkFNRToKKwkJCQlzZXRMb29rdXBOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC03MzAsNiArNzgzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fREVTQ1JJUFRJT05TOgpAQCAtNzc0LDYgKzgyOCw5IEBACiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0lOSkVDVElPTl9UQVJHRVRTOgogCQkJCWdldEluamVjdGlvblRhcmdldHMoKS5jbGVhcigpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fTE9PS1VQX05BTUU6CisJCQkJc2V0TG9va3VwTmFtZShMT09LVVBfTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX19JRDoKIAkJCQlzZXRJZChJRF9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwpAQCAtNzg2LDYgKzg0Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0RFU0NSSVBUSU9OUzoKQEAgLTgxNiw2ICs4NzQsOCBAQAogCQkJCXJldHVybiBNQVBQRURfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkTmFtZSAhPSBudWxsIDogIU1BUFBFRF9OQU1FX0VERUZBVUxULmVxdWFscyhtYXBwZWROYW1lKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFM6CiAJCQkJcmV0dXJuIGluamVjdGlvblRhcmdldHMgIT0gbnVsbCAmJiAhaW5qZWN0aW9uVGFyZ2V0cy5pc0VtcHR5KCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfX0xPT0tVUF9OQU1FOgorCQkJCXJldHVybiBMT09LVVBfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbG9va3VwTmFtZSAhPSBudWxsIDogIUxPT0tVUF9OQU1FX0VERUZBVUxULmVxdWFscyhsb29rdXBOYW1lKTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9fSUQ6CiAJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CiAJCX0KQEAgLTgyNyw2ICs4ODcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKQEAgLTg0NSwxMCArOTA2LDI0IEBACiAJCXJlc3VsdC5hcHBlbmQoc2VydmljZVFuYW1lKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBtYXBwZWROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG1hcHBlZE5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGxvb2t1cE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobG9va3VwTmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoaWQpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CiAKKwlwdWJsaWMgdm9pZCBzZXRTZXJ2aWNlUW5hbWUoT2JqZWN0IG5ld1NlcnZpY2VRbmFtZSkgeworCQlpZiAobmV3U2VydmljZVFuYW1lID09IG51bGwgfHwgbmV3U2VydmljZVFuYW1lIGluc3RhbmNlb2YgUU5hbWUpCisJCXsKKwkJCXNldFNlcnZpY2VRbmFtZSgoUU5hbWUpbmV3U2VydmljZVFuYW1lKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCVFOYW1lIG5ld1FOYW1lID0gUU5hbWUudmFsdWVPZihuZXdTZXJ2aWNlUW5hbWUudG9TdHJpbmcoKSk7CisJCQlzZXRTZXJ2aWNlUW5hbWUobmV3UU5hbWUpOworCQl9CisJfQorCiB9IC8vU2VydmljZVJlZkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvaW1wbC9VcmxQYXR0ZXJuVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1VybFBhdHRlcm5UeXBlSW1wbC5qYXZhCmluZGV4IGI1NmNjZDEuLmM3N2NiZWIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1VybFBhdHRlcm5UeXBlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9pbXBsL1VybFBhdHRlcm5UeXBlSW1wbC5qYXZhCkBAIC02OSw2ICs2OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF2YWVlUGFja2FnZS5MaXRlcmFscy5VUkxfUEFUVEVSTl9UWVBFOwogCX0KQEAgLTk5LDYgKzEwMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19WQUxVRToKQEAgLTExMiw2ICsxMTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1ZBTFVFOgpAQCAtMTI2LDYgKzEyOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fVkFMVUU6CkBAIC0xNDAsNiArMTQ0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19WQUxVRToKQEAgLTE1Myw2ICsxNTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9tZXRhZGF0YS9KYXZhZWVQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvbWV0YWRhdGEvSmF2YWVlUGFja2FnZS5qYXZhCmluZGV4IDQxMjZlMWMuLmRhODA3NjcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC9tZXRhZGF0YS9KYXZhZWVQYWNrYWdlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL21ldGFkYXRhL0phdmFlZVBhY2thZ2UuamF2YQpAQCAtMzEsMTg0ICszMSwxOTUgQEAKICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKLSAqICAgICAgIEAoIylqYXZhZWVfNS54c2RzCTEuNjUgMDYvMDIvMTcKKyAqIAorICogICAgICAgJElkOiBKYXZhZWVQYWNrYWdlLmphdmEsdiAxLjQgMjAxMC8wMS8xNSAxNDozMjowNyBjYW5kZXJzb24gRXhwICQKKyAqICAgICAgIAogICogICAgIAogICogCiAgKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCisgKiAgICAgICBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KKyAqICAgICAgIHNoYXJlYWJsZSBzY2hlbWEocykgb2YgSmF2YSBFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQorICogICAgICAgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgorICogICAgICAgCisgKiAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICBqYXZhIGVlIGFwcGxpY2F0aW9uOworICogICAgICAgYXBwbGljYXRpb24gY2xpZW50OworICogICAgICAgd2ViIGFwcGxpY2F0aW9uOworICogICAgICAgZW50ZXJwcmlzZSBiZWFuOworICogICAgICAgcmVzb3VyY2UgYWRhcHRlcjsgCisgKiAgICAgICAKKyAqICAgICAgIERlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICBlYXIgZmlsZTsKKyAqICAgICAgIHdhciBmaWxlOworICogICAgICAgamFyIGZpbGU7CisgKiAgICAgICByYXIgZmlsZTsKKyAqICAgICAgIAogICogICAgIAogICogCiAgKiAKLSAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgdGhhdCBhcHBlYXIgaW4gdGhlIGNvbW1vbgotICogc2hhcmVhYmxlIHNjaGVtYShzKSBvZiBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCi0gKiBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnRleHQgdGhleSBhcmUgaW5jbHVkZWQ6Ci0gKiAKLSAqIERlcGxveW1lbnQgQ29tcG9uZW50IG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBqMmVlIGFwcGxpY2F0aW9uOwotICogICAgIGFwcGxpY2F0aW9uIGNsaWVudDsKLSAqICAgICB3ZWIgYXBwbGljYXRpb247Ci0gKiAgICAgZW50ZXJwcmlzZSBiZWFuOwotICogICAgIHJlc291cmNlIGFkYXB0ZXI7Ci0gKiAKLSAqIERlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgZWFyIGZpbGU7Ci0gKiAgICAgd2FyIGZpbGU7Ci0gKiAgICAgamFyIGZpbGU7Ci0gKiAgICAgcmFyIGZpbGU7Ci0gKiAKLSAqIAotICogCi0gKiAgICAgICBAKCMpamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZHMJMS4xOSAwMi8xMy8wNgotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCisgKiAgICAgICAkSWQ6IEphdmFlZVBhY2thZ2UuamF2YSx2IDEuNCAyMDEwLzAxLzE1IDE0OjMyOjA3IGNhbmRlcnNvbiBFeHAgJAorICogICAgICAgCiAgKiAgICAgCiAgKiAKICAqIAogICogICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLSAqIAorICogICAgICAgCiAgKiAgICAgCiAgKiAKLSAqICAgIFNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCBhbmQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZXNwYWNlLgorICogICAgPGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgKiAgICAgPGgxPkFib3V0IHRoZSBYTUwgbmFtZXNwYWNlPC9oMT4KICAqIAotICogICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCi0gKiAgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgCi0gKiAKLSAqICAgICBOb3RlIHRoYXQgbG9jYWwgbmFtZXMgaW4gdGhpcyBuYW1lc3BhY2UgYXJlIGludGVuZGVkIHRvIGJlIGRlZmluZWQKLSAqICAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUKLSAqICAgICBmb2xsb3dpbmcgbmFtZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFuZCBzaG91bGQKLSAqICAgICBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZyBHcm91cCwKLSAqICAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZToKLSAqIAotICogICAgIGJhc2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkKLSAqICAgICAgICAgIHJlbGF0aXZlIFVSSXMgaW4gdGhlIHNjb3BlIG9mIHRoZSBlbGVtZW50IG9uIHdoaWNoIGl0Ci0gKiAgICAgICAgICBhcHBlYXJzOyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBpZCAgIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4KLSAqICAgICAgICAgIFRoZSB4bWw6aWQgc3BlY2lmaWNhdGlvbiBpcyBub3QgeWV0IGEgVzNDIFJlY29tbWVuZGF0aW9uLAotICogICAgICAgICAgYnV0IHRoaXMgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGhlcmUgdG8gZmFjaWxpdGF0ZSBleHBlcmltZW50YXRpb24KLSAqICAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQKLSAqICAgICAgICAgIGluIHRoZSBzcGVjaWFsQXR0cnMgYXR0cmlidXRlIGdyb3VwLgotICogCi0gKiAgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgotICogICAgICAgICAgYW55IGVsZW1lbnQ7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCisgKiAgICAgICBzdWl0YWJsZSBmb3IgaW1wb3J0IGJ5IG90aGVyIHNjaGVtYSBkb2N1bWVudHMuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwiPgorICogICAgICAgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWw8L2E+IGFuZAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCI+CisgKiAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sPC9hPiBmb3IgaW5mb3JtYXRpb24gCisgKiAgICAgICBhYm91dCB0aGlzIG5hbWVzcGFjZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIE5vdGUgdGhhdCBsb2NhbCBuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgaW50ZW5kZWQgdG8gYmUKKyAqICAgICAgIGRlZmluZWQgb25seSBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBvciBpdHMgc3ViZ3JvdXBzLgorICogICAgICAgVGhlIG5hbWVzIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBsaXN0ZWQgYmVsb3cuCisgKiAgICAgICBUaGV5IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZworICogICAgICAgR3JvdXAsIHNwZWNpZmljYXRpb24sIG9yIGRvY3VtZW50IGluc3RhbmNlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPiAgIAorICogICAgICAgU2VlIGZ1cnRoZXIgYmVsb3cgaW4gdGhpcyBkb2N1bWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8YSBocmVmPSIjdXNhZ2UiPmhvdyB0byByZWZlciB0byB0aGlzIHNjaGVtYSBkb2N1bWVudCBmcm9tIHlvdXIgb3duCisgKiAgICAgICBYU0Qgc2NoZW1hIGRvY3VtZW50czwvYT4gYW5kIGFib3V0IDxhIGhyZWY9IiNuc3ZlcnNpb25pbmciPnRoZQorICogICAgICAgbmFtZXNwYWNlLXZlcnNpb25pbmcgcG9saWN5IGdvdmVybmluZyB0aGlzIHNjaGVtYSBkb2N1bWVudDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgogICogICAKLSAqICAgICBzcGFjZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZQotICogICAgICAgICAgdmFsdWUgaXMgYSBrZXl3b3JkIGluZGljYXRpbmcgd2hhdCB3aGl0ZXNwYWNlIHByb2Nlc3NpbmcKLSAqICAgICAgICAgIGRpc2NpcGxpbmUgaXMgaW50ZW5kZWQgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50OyBpdHMKLSAqICAgICAgICAgIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSB2aXJ0dWUgb2YgaXRzCi0gKiAgICAgICAgICBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KICAqIAotICogICAgIEZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTogZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKLSAqICAgICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKLSAqICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCi0gKiAgICAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKKyAqICAgIDxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgCisgKiAgICAgPGgzPkZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTwvaDM+IAogICogCi0gKiAgICAgICAgICAgICAgSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZCBkZWRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mIEZlYnJ1YXJ5LCAyMDAwCi0gKiAgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZQotICogICAgICAgICAgICAgIHhtbDpGYXRoZXIKKyAqICAgICA8ZGl2IGNsYXNzPSJib2R5dGV4dCI+CisgKiAgICAgIDxwPgorICogICAgICAgZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKKyAqICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKKyAqICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCisgKiAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKKyAqICAgICAgPC9wPgorICogICAgICA8YmxvY2txdW90ZT4KKyAqICAgICAgICA8cD4KKyAqIAlJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kCisgKiAJZGVkaWNhdGlvbiB0aGUgVzNDIFhNTCBQbGVuYXJ5IG9uIHRoaXMgMTB0aCBkYXkgb2YKKyAqIAlGZWJydWFyeSwgMjAwMCwgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5CisgKiAJdGhlIFhNTCBuYW1lICJ4bWw6RmF0aGVyIi4KKyAqICAgICAgICA8L3A+CisgKiAgICAgIDwvYmxvY2txdW90ZT4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgogICogICAKLSAqIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwCi0gKiAgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkKLSAqICAgICAgICAgc2NoZW1hcyB3aXNoaW5nIHRvIGFsbG93IHhtbDpiYXNlLCB4bWw6bGFuZywgeG1sOnNwYWNlIG9yIHhtbDppZAotICogICAgICAgICBhdHRyaWJ1dGVzIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgogICogCi0gKiAgICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCi0gKiAgICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgotICogICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gKiAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLyZndDsKKyAqICAgIDxkaXYgaWQ9InVzYWdlIiB4bWw6aWQ9InVzYWdlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgKiAgICAgPGgyPgorICogICAgICAgPGEgbmFtZT0idXNhZ2UiPkFib3V0IHRoaXMgc2NoZW1hIGRvY3VtZW50PC9hPgorICogICAgIDwvaDI+CiAgKiAKLSAqICAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcwotICogICAgICAgICBvciB0aGUgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwIHN1aXRhYmxlCisgKiAgICAgICBmb3IgdXNlIGJ5IHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyA8Y29kZT54bWw6YmFzZTwvY29kZT4sCisgKiAgICAgICA8Y29kZT54bWw6bGFuZzwvY29kZT4sIDxjb2RlPnhtbDpzcGFjZTwvY29kZT4gb3IKKyAqICAgICAgIDxjb2RlPnhtbDppZDwvY29kZT4gYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hIGZvcgorICogICAgICAgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKKyAqICAgICAgPC9wPgorICogICAgICA8cHJlPgorICogICAgICAgICAgICZsdDtzY2hlbWEgLiAuIC4mZ3Q7CisgKiAgICAgICAgICAgIC4gLiAuCisgKiAgICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICBvcgorICogICAgICA8L3A+CisgKiAgICAgIDxwcmU+CisgKiAgICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZCIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzIG9yIHRoZQorICogICAgICAgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHByZT4KKyAqICAgICAgICAgICAmbHQ7dHlwZSAuIC4gLiZndDsKKyAqICAgICAgICAgICAgLiAuIC4KKyAqICAgICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UgZWxlbWVudAorICogICAgICAgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlcy4KKyAqICAgICAgPC9wPgorICogICAgIDwvZGl2PgorICogICAgPC9kaXY+CisgKiAgIAogICogCi0gKiAgICAgICAgICZsdDt0eXBlIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLyZndDsKLSAqICAKLSAqICAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICogICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzCi0gKiBJbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gKiAgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkLgotICogICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAqICAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gKiAgICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gKiAgICBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwKLSAqICAgIFNjaGVtYSBvciBYTUwgbmFtZXNwYWNlcyBjaGFuZ2UsIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCB3aWxsIGNoYW5nZQotICogICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2Qgd2lsbCBub3QgY2hhbmdlLgorICogICAgPGRpdiBpZD0ibnN2ZXJzaW9uaW5nIiB4bWw6aWQ9Im5zdmVyc2lvbmluZyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgIDxoMj4KKyAqICAgICAgIDxhIG5hbWU9Im5zdmVyc2lvbmluZyI+VmVyc2lvbmluZyBwb2xpY3kgZm9yIHRoaXMgc2NoZW1hIGRvY3VtZW50PC9hPgorICogICAgIDwvaDI+CisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIEluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKKyAqICAgICAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0CisgKiAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QiPgorICogICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Q8L2E+LgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKKyAqICAgICAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTAorICogICAgICAgU2NoZW1hIGl0c2VsZiwgb3Igd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywKKyAqICAgICAgIGlmIHRoZSBYTUwgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcworICogICAgICAgZG9jdW1lbnQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QgCisgKiAgICAgICA8L2E+IAorICogICAgICAgd2lsbCBjaGFuZ2UgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0IAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QgCisgKiAgICAgICA8L2E+IAorICogICAgICAgd2lsbCBub3QgY2hhbmdlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgUHJldmlvdXMgZGF0ZWQgKGFuZCB1bmNoYW5naW5nKSB2ZXJzaW9ucyBvZiB0aGlzIHNjaGVtYSAKKyAqICAgICAgIGRvY3VtZW50IGFyZSBhdDoKKyAqICAgICAgPC9wPgorICogICAgICA8dWw+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwNy8wOC94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA3LzA4L3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8xMC94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA0LzEwL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgIDwvdWw+CisgKiAgICAgPC9kaXY+CisgKiAgICA8L2Rpdj4KICAqICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5CkBAIC0yNDgsNiArMjU5LDI0MiBAQAogCUphdmFlZVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwuaW5pdCgpOwogCiAJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5BZGRyZXNzaW5nVHlwZUltcGwgPGVtPkFkZHJlc3NpbmcgVHlwZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkFkZHJlc3NpbmdUeXBlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0QWRkcmVzc2luZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQUREUkVTU0lOR19UWVBFID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUREUkVTU0lOR19UWVBFX19FTkFCTEVEID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFERFJFU1NJTkdfVFlQRV9fUkVRVUlSRUQgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNlczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFERFJFU1NJTkdfVFlQRV9fUkVTUE9OU0VTID0gMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BZGRyZXNzaW5nIFR5cGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUREUkVTU0lOR19UWVBFX0ZFQVRVUkVfQ09VTlQgPSAzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EYXRhU291cmNlVHlwZUltcGwgPGVtPkRhdGEgU291cmNlIFR5cGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EYXRhU291cmNlVHlwZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldERhdGFTb3VyY2VUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IERBVEFfU09VUkNFX1RZUEUgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9TT1VSQ0VfVFlQRV9fREVTQ1JJUFRJT04gPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX1NPVVJDRV9UWVBFX19OQU1FID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9TT1VSQ0VfVFlQRV9fQ0xBU1NfTkFNRSA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX1NPVVJDRV9UWVBFX19TRVJWRVJfTkFNRSA9IDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX1NPVVJDRV9UWVBFX19QT1JUX05VTUJFUiA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YWJhc2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfU09VUkNFX1RZUEVfX0RBVEFCQVNFX05BTUUgPSA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVybDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfU09VUkNFX1RZUEVfX1VSTCA9IDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfU09VUkNFX1RZUEVfX1VTRVIgPSA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhc3N3b3JkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9TT1VSQ0VfVFlQRV9fUEFTU1dPUkQgPSA4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX1NPVVJDRV9UWVBFX19QUk9QRVJUWSA9IDk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9naW4gVGltZW91dDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfU09VUkNFX1RZUEVfX0xPR0lOX1RJTUVPVVQgPSAxMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9TT1VSQ0VfVFlQRV9fVFJBTlNBQ1RJT05BTCA9IDExOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzb2xhdGlvbiBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfU09VUkNFX1RZUEVfX0lTT0xBVElPTl9MRVZFTCA9IDEyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgUG9vbCBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9TT1VSQ0VfVFlQRV9fSU5JVElBTF9QT09MX1NJWkUgPSAxMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXggUG9vbCBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9TT1VSQ0VfVFlQRV9fTUFYX1BPT0xfU0laRSA9IDE0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbiBQb29sIFNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX1NPVVJDRV9UWVBFX19NSU5fUE9PTF9TSVpFID0gMTU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWF4IElkbGUgVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfU09VUkNFX1RZUEVfX01BWF9JRExFX1RJTUUgPSAxNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXggU3RhdGVtZW50czwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IERBVEFfU09VUkNFX1RZUEVfX01BWF9TVEFURU1FTlRTID0gMTc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBEQVRBX1NPVVJDRV9UWVBFX19JRCA9IDE4OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRhdGEgU291cmNlIFR5cGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgREFUQV9TT1VSQ0VfVFlQRV9GRUFUVVJFX0NPVU5UID0gMTk7CisKKwkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uSW1wbCA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0yNTUsNyArNTAyLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldERlc2NyaXB0aW9uKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IERFU0NSSVBUSU9OID0gMDsKKwlpbnQgREVTQ1JJUFRJT04gPSAyOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0yOTIsNyArNTM5LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldERpc3BsYXlOYW1lKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IERJU1BMQVlfTkFNRSA9IDE7CisJaW50IERJU1BMQVlfTkFNRSA9IDM7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTMyOSw3ICs1NzYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RWpiTG9jYWxSZWYoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgRUpCX0xPQ0FMX1JFRiA9IDI7CisJaW50IEVKQl9MT0NBTF9SRUYgPSA0OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC00MDQsMTMgKzY1MSwyMiBAQAogCWludCBFSkJfTE9DQUxfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IDc7CiAKIAkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9va3VwIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFSkJfTE9DQUxfUkVGX19MT09LVVBfTkFNRSA9IDg7CisKKwkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBFSkJfTE9DQUxfUkVGX19JRCA9IDg7CisJaW50IEVKQl9MT0NBTF9SRUZfX0lEID0gOTsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FamIgTG9jYWwgUmVmPC9lbT4nIGNsYXNzLgpAQCAtNDE5LDcgKzY3NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IEVKQl9MT0NBTF9SRUZfRkVBVFVSRV9DT1VOVCA9IDk7CisJaW50IEVKQl9MT0NBTF9SRUZfRkVBVFVSRV9DT1VOVCA9IDEwOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5FamJSZWZJbXBsIDxlbT5FamIgUmVmPC9lbT59JyBjbGFzcy4KQEAgLTQyOSw3ICs2ODUsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RWpiUmVmKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IEVKQl9SRUYgPSAzOworCWludCBFSkJfUkVGID0gNTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNTA0LDEzICs3NjAsMjIgQEAKIAlpbnQgRUpCX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSA3OwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvb2t1cCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRUpCX1JFRl9fTE9PS1VQX05BTUUgPSA4OworCisJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgRUpCX1JFRl9fSUQgPSA4OworCWludCBFSkJfUkVGX19JRCA9IDk7CiAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RWpiIFJlZjwvZW0+JyBjbGFzcy4KQEAgLTUxOSw3ICs3ODQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBFSkJfUkVGX0ZFQVRVUkVfQ09VTlQgPSA5OworCWludCBFSkJfUkVGX0ZFQVRVUkVfQ09VTlQgPSAxMDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuRW1wdHlUeXBlSW1wbCA8ZW0+RW1wdHkgVHlwZTwvZW0+fScgY2xhc3MuCkBAIC01MjksNyArNzk0LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVtcHR5VHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBFTVBUWV9UWVBFID0gNDsKKwlpbnQgRU1QVFlfVFlQRSA9IDY7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTU1Nyw3ICs4MjIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RW52RW50cnkoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgRU5WX0VOVFJZID0gNTsKKwlpbnQgRU5WX0VOVFJZID0gNzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNjE0LDEzICs4NzksMjIgQEAKIAlpbnQgRU5WX0VOVFJZX19JTkpFQ1RJT05fVEFSR0VUUyA9IDU7CiAKIAkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9va3VwIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFTlZfRU5UUllfX0xPT0tVUF9OQU1FID0gNjsKKworCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IEVOVl9FTlRSWV9fSUQgPSA2OworCWludCBFTlZfRU5UUllfX0lEID0gNzsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbnYgRW50cnk8L2VtPicgY2xhc3MuCkBAIC02MjksNyArOTAzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgRU5WX0VOVFJZX0ZFQVRVUkVfQ09VTlQgPSA3OworCWludCBFTlZfRU5UUllfRkVBVFVSRV9DT1VOVCA9IDg7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkljb25JbXBsIDxlbT5JY29uPC9lbT59JyBjbGFzcy4KQEAgLTYzOSw3ICs5MTMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0SWNvbigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBJQ09OID0gNjsKKwlpbnQgSUNPTiA9IDg7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U21hbGwgSWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNjk0LDcgKzk2OCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRJbmplY3Rpb25UYXJnZXQoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgSU5KRUNUSU9OX1RBUkdFVCA9IDc7CisJaW50IElOSkVDVElPTl9UQVJHRVQgPSA5OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluamVjdGlvbiBUYXJnZXQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTczMSw3ICsxMDA1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldExpZmVjeWNsZUNhbGxiYWNrKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IExJRkVDWUNMRV9DQUxMQkFDSyA9IDg7CisJaW50IExJRkVDWUNMRV9DQUxMQkFDSyA9IDEwOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpZmVjeWNsZSBDYWxsYmFjayBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNzY4LDcgKzEwNDIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TGlzdGVuZXIoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgTElTVEVORVIgPSA5OworCWludCBMSVNURU5FUiA9IDExOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC04MzIsNyArMTEwNiw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb24oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTiA9IDEwOworCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OID0gMTI7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTg4MCwxMyArMTE1NCwyMiBAQAogCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX19NQVBQRURfTkFNRSA9IDQ7CiAKIAkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9va3VwIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX19MT09LVVBfTkFNRSA9IDU7CisKKwkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX19JRCA9IDU7CisJaW50IE1FU1NBR0VfREVTVElOQVRJT05fX0lEID0gNjsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uPC9lbT4nIGNsYXNzLgpAQCAtODk1LDcgKzExNzgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSA2OworCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX0ZFQVRVUkVfQ09VTlQgPSA3OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+fScgY2xhc3MuCkBAIC05MDUsNyArMTE4OCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUYgPSAxMTsKKwlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUYgPSAxMzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtOTcxLDEzICsxMjU0LDIyIEBACiAJaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IDY7CiAKIAkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9va3VwIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTE9PS1VQX05BTUUgPSA3OworCisJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lEID0gNzsKKwlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lEID0gODsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZjwvZW0+JyBjbGFzcy4KQEAgLTk4Niw3ICsxMjc4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfRkVBVFVSRV9DT1VOVCA9IDg7CisJaW50IE1FU1NBR0VfREVTVElOQVRJT05fUkVGX0ZFQVRVUkVfQ09VTlQgPSA5OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5QYXJhbVZhbHVlSW1wbCA8ZW0+UGFyYW0gVmFsdWU8L2VtPn0nIGNsYXNzLgpAQCAtOTk2LDcgKzEyODgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UGFyYW1WYWx1ZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBQQVJBTV9WQUxVRSA9IDEyOworCWludCBQQVJBTV9WQUxVRSA9IDE0OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMDUxLDcgKzEzNDMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGID0gMTM7CisJaW50IFBFUlNJU1RFTkNFX0NPTlRFWFRfUkVGID0gMTU7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTExNDIsNyArMTQzNCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgUEVSU0lTVEVOQ0VfVU5JVF9SRUYgPSAxNDsKKwlpbnQgUEVSU0lTVEVOQ0VfVU5JVF9SRUYgPSAxNjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTIxNSw3ICsxNTA3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFBvcnRDb21wb25lbnRSZWYoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgUE9SVF9DT01QT05FTlRfUkVGID0gMTU7CisJaW50IFBPUlRfQ09NUE9ORU5UX1JFRiA9IDE3OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMjM2LDEzICsxNTI4LDQwIEBACiAJaW50IFBPUlRfQ09NUE9ORU5UX1JFRl9fRU5BQkxFX01UT00gPSAxOwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk10b20gVGhyZXNob2xkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUE9SVF9DT01QT05FTlRfUkVGX19NVE9NX1RIUkVTSE9MRCA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkcmVzc2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUlRfQ09NUE9ORU5UX1JFRl9fQUREUkVTU0lORyA9IDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcGVjdCBCaW5kaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUE9SVF9DT01QT05FTlRfUkVGX19SRVNQRUNUX0JJTkRJTkcgPSA0OworCisJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvcnQgQ29tcG9uZW50IExpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBQT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTksgPSAyOworCWludCBQT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTksgPSA1OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMjUxLDcgKzE1NzAsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBQT1JUX0NPTVBPTkVOVF9SRUZfX0lEID0gMzsKKwlpbnQgUE9SVF9DT01QT05FTlRfUkVGX19JRCA9IDY7CiAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT4nIGNsYXNzLgpAQCAtMTI2MCw3ICsxNTc5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgUE9SVF9DT01QT05FTlRfUkVGX0ZFQVRVUkVfQ09VTlQgPSA0OworCWludCBQT1JUX0NPTVBPTkVOVF9SRUZfRkVBVFVSRV9DT1VOVCA9IDc7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlByb3BlcnR5VHlwZUltcGwgPGVtPlByb3BlcnR5IFR5cGU8L2VtPn0nIGNsYXNzLgpAQCAtMTI3MCw3ICsxNTg5LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFByb3BlcnR5VHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBQUk9QRVJUWV9UWVBFID0gMTY7CisJaW50IFBST1BFUlRZX1RZUEUgPSAxODsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMzE2LDcgKzE2MzUsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UmVzb3VyY2VFbnZSZWYoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgUkVTT1VSQ0VfRU5WX1JFRiA9IDE3OworCWludCBSRVNPVVJDRV9FTlZfUkVGID0gMTk7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEzNjQsMTMgKzE2ODMsMjIgQEAKIAlpbnQgUkVTT1VSQ0VfRU5WX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSA0OwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvb2t1cCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVTT1VSQ0VfRU5WX1JFRl9fTE9PS1VQX05BTUUgPSA1OworCisJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgUkVTT1VSQ0VfRU5WX1JFRl9fSUQgPSA1OworCWludCBSRVNPVVJDRV9FTlZfUkVGX19JRCA9IDY7CiAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+JyBjbGFzcy4KQEAgLTEzNzksNyArMTcwNyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFJFU09VUkNFX0VOVl9SRUZfRkVBVFVSRV9DT1VOVCA9IDY7CisJaW50IFJFU09VUkNFX0VOVl9SRUZfRkVBVFVSRV9DT1VOVCA9IDc7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc291cmNlUmVmSW1wbCA8ZW0+UmVzb3VyY2UgUmVmPC9lbT59JyBjbGFzcy4KQEAgLTEzODksNyArMTcxNyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZVJlZigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBSRVNPVVJDRV9SRUYgPSAxODsKKwlpbnQgUkVTT1VSQ0VfUkVGID0gMjA7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE0NTUsMTMgKzE3ODMsMjIgQEAKIAlpbnQgUkVTT1VSQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IDY7CiAKIAkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9va3VwIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVNPVVJDRV9SRUZfX0xPT0tVUF9OQU1FID0gNzsKKworCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFJFU09VUkNFX1JFRl9fSUQgPSA3OworCWludCBSRVNPVVJDRV9SRUZfX0lEID0gODsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicgY2xhc3MuCkBAIC0xNDcwLDcgKzE4MDcsMzUgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgUkVTT1VSQ0VfUkVGX0ZFQVRVUkVfQ09VTlQgPSA4OworCWludCBSRVNPVVJDRV9SRUZfRkVBVFVSRV9DT1VOVCA9IDk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc3BlY3RCaW5kaW5nVHlwZUltcGwgPGVtPlJlc3BlY3QgQmluZGluZyBUeXBlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzcGVjdEJpbmRpbmdUeXBlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UmVzcGVjdEJpbmRpbmdUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFJFU1BFQ1RfQklORElOR19UWVBFID0gMjE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFU1BFQ1RfQklORElOR19UWVBFX19FTkFCTEVEID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNwZWN0IEJpbmRpbmcgVHlwZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVNQRUNUX0JJTkRJTkdfVFlQRV9GRUFUVVJFX0NPVU5UID0gMTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUnVuQXNJbXBsIDxlbT5SdW4gQXM8L2VtPn0nIGNsYXNzLgpAQCAtMTQ4MCw3ICsxODQ1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJ1bkFzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IFJVTl9BUyA9IDE5OworCWludCBSVU5fQVMgPSAyMjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTUyNiw3ICsxODkxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlY3VyaXR5Um9sZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBTRUNVUklUWV9ST0xFID0gMjA7CisJaW50IFNFQ1VSSVRZX1JPTEUgPSAyMzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTU3Miw3ICsxOTM3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlY3VyaXR5Um9sZVJlZigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBTRUNVUklUWV9ST0xFX1JFRiA9IDIxOworCWludCBTRUNVUklUWV9ST0xFX1JFRiA9IDI0OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xNjI3LDcgKzE5OTIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VydmljZVJlZigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBTRVJWSUNFX1JFRiA9IDIyOworCWludCBTRVJWSUNFX1JFRiA9IDI1OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xNzU2LDEzICsyMTIxLDIyIEBACiAJaW50IFNFUlZJQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IDEzOwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvb2t1cCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VSVklDRV9SRUZfX0xPT0tVUF9OQU1FID0gMTQ7CisKKwkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBTRVJWSUNFX1JFRl9fSUQgPSAxNDsKKwlpbnQgU0VSVklDRV9SRUZfX0lEID0gMTU7CiAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VydmljZSBSZWY8L2VtPicgY2xhc3MuCkBAIC0xNzcxLDcgKzIxNDUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBTRVJWSUNFX1JFRl9GRUFUVVJFX0NPVU5UID0gMTU7CisJaW50IFNFUlZJQ0VfUkVGX0ZFQVRVUkVfQ09VTlQgPSAxNjsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuU2VydmljZVJlZkhhbmRsZXJJbXBsIDxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyPC9lbT59JyBjbGFzcy4KQEAgLTE3ODEsNyArMjE1NSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmSGFuZGxlcigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSID0gMjM7CisJaW50IFNFUlZJQ0VfUkVGX0hBTkRMRVIgPSAyNjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTg5MCw3ICsyMjY0LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgU0VSVklDRV9SRUZfSEFORExFUl9DSEFJTiA9IDI0OworCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOID0gMjc7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBOYW1lIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTE5NTQsNyArMjMyOCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmSGFuZGxlckNoYWlucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOUyA9IDI1OworCWludCBTRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOUyA9IDI4OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhbmRsZXIgQ2hhaW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE5OTEsNyArMjM2NSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRVcmxQYXR0ZXJuVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBVUkxfUEFUVEVSTl9UWVBFID0gMjY7CisJaW50IFVSTF9QQVRURVJOX1RZUEUgPSAyOTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMjAxMiw2ICsyMzg2LDE2IEBACiAJaW50IFVSTF9QQVRURVJOX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE7CiAKIAkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSA8ZW0+QWRkcmVzc2luZyBSZXNwb25zZXMgVHlwZTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkFkZHJlc3NpbmdSZXNwb25zZXNUeXBlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBBRERSRVNTSU5HX1JFU1BPTlNFU19UWVBFID0gMzA7CisKKwkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWZUeXBlIDxlbT5FamIgUmVmIFR5cGU8L2VtPn0nIGVudW0uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTIwMTksMTcgKzI0MDMsMzcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVqYlJlZlR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgRUpCX1JFRl9UWVBFID0gMjc7CisJaW50IEVKQl9SRUZfVFlQRSA9IDMxOwogCiAJLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlIDxlbT5FbnYgRW50cnkgVHlwZTwvZW0+fScgZW51bS4KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5HZW5lcmljQm9vbGVhblR5cGUgPGVtPkdlbmVyaWMgQm9vbGVhbiBUeXBlPC9lbT59JyBlbnVtLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuR2VuZXJpY0Jvb2xlYW5UeXBlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRHZW5lcmljQm9vbGVhblR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgR0VORVJJQ19CT09MRUFOX1RZUEUgPSAzMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLklzb2xhdGlvbkxldmVsVHlwZSA8ZW0+SXNvbGF0aW9uIExldmVsIFR5cGU8L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Jc29sYXRpb25MZXZlbFR5cGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldElzb2xhdGlvbkxldmVsVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBJU09MQVRJT05fTEVWRUxfVFlQRSA9IDMzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5FbnYgRW50cnkgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVudkVudHJ5VHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBFTlZfRU5UUllfVFlQRSA9IDI4OworCWludCBFTlZfRU5UUllfVFlQRSA9IDQzOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2VtPn0nIGVudW0uCkBAIC0yMDM5LDcgKzI0NDMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IE1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRSA9IDI5OworCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEUgPSAzNDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFR5cGUgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgVHlwZTwvZW0+fScgZW51bS4KQEAgLTIwNDksNyArMjQ1Myw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRSA9IDMwOworCWludCBQRVJTSVNURU5DRV9DT05URVhUX1RZUEUgPSAzNTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc0F1dGhUeXBlIDxlbT5SZXMgQXV0aCBUeXBlPC9lbT59JyBlbnVtLgpAQCAtMjA1OSw3ICsyNDYzLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJlc0F1dGhUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IFJFU19BVVRIX1RZUEUgPSAzMTsKKwlpbnQgUkVTX0FVVEhfVFlQRSA9IDM2OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzU2hhcmluZ1Njb3BlVHlwZSA8ZW0+UmVzIFNoYXJpbmcgU2NvcGUgVHlwZTwvZW0+fScgZW51bS4KQEAgLTIwNjksNyArMjQ3MywxNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBSRVNfU0hBUklOR19TQ09QRV9UWVBFID0gMzI7CisJaW50IFJFU19TSEFSSU5HX1NDT1BFX1RZUEUgPSAzNzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+QWRkcmVzc2luZyBSZXNwb25zZXMgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEFERFJFU1NJTkdfUkVTUE9OU0VTX1RZUEVfT0JKRUNUID0gMzg7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkRld2V5IFZlcnNpb24gVHlwZTwvZW0+JyBkYXRhIHR5cGUuCkBAIC0yMDc5LDcgKzI0OTMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RGV3ZXlWZXJzaW9uVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBERVdFWV9WRVJTSU9OX1RZUEUgPSAzMzsKKwlpbnQgREVXRVlfVkVSU0lPTl9UWVBFID0gMzk7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVKQiBMaW5rPC9lbT4nIGRhdGEgdHlwZS4KQEAgLTIwODksNyArMjUwMyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFSkJMaW5rKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IEVKQl9MSU5LID0gMzQ7CisJaW50IEVKQl9MSU5LID0gNDA7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVqYiBSZWYgTmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KQEAgLTIwOTksNyArMjUxMyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRFamJSZWZOYW1lVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBFSkJfUkVGX05BTUVfVFlQRSA9IDM1OworCWludCBFSkJfUkVGX05BTUVfVFlQRSA9IDQxOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5FamIgUmVmIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KQEAgLTIxMDksMTcgKzI1MjMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RWpiUmVmVHlwZU9iamVjdCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBFSkJfUkVGX1RZUEVfT0JKRUNUID0gMzY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVudiBFbnRyeSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVudkVudHJ5VHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTlZfRU5UUllfVFlQRV9PQkpFQ1QgPSAzNzsKKwlpbnQgRUpCX1JFRl9UWVBFX09CSkVDVCA9IDQyOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5GdWxseSBRdWFsaWZpZWQgQ2xhc3MgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCkBAIC0yMTI5LDcgKzI1MzMsMTcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IEZVTExZX1FVQUxJRklFRF9DTEFTU19UWVBFID0gMzg7CisJaW50IEZVTExZX1FVQUxJRklFRF9DTEFTU19UWVBFID0gNDQ7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkdlbmVyaWMgQm9vbGVhbiBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5HZW5lcmljQm9vbGVhblR5cGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEdlbmVyaWNCb29sZWFuVHlwZU9iamVjdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBHRU5FUklDX0JPT0xFQU5fVFlQRV9PQkpFQ1QgPSA0NTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SG9tZTwvZW0+JyBkYXRhIHR5cGUuCkBAIC0yMTM5LDcgKzI1NTMsMTcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEhvbWUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgSE9NRSA9IDM5OworCWludCBIT01FID0gNDY7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPklzb2xhdGlvbiBMZXZlbCBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Jc29sYXRpb25MZXZlbFR5cGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldElzb2xhdGlvbkxldmVsVHlwZU9iamVjdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBJU09MQVRJT05fTEVWRUxfVFlQRV9PQkpFQ1QgPSA0NzsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SmF2YSBJZGVudGlmaWVyPC9lbT4nIGRhdGEgdHlwZS4KQEAgLTIxNDksNyArMjU3Myw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRKYXZhSWRlbnRpZmllcigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBKQVZBX0lERU5USUZJRVIgPSA0MDsKKwlpbnQgSkFWQV9JREVOVElGSUVSID0gNDg7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkphdmEgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCkBAIC0yMTU5LDcgKzI1ODMsMTcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEphdmFUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IEpBVkFfVFlQRSA9IDQxOworCWludCBKQVZBX1RZUEUgPSA0OTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SmRiYyBVcmwgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEpkYmNVcmxUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEpEQkNfVVJMX1RZUEUgPSA1MDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Sk5ESSBOYW1lPC9lbT4nIGRhdGEgdHlwZS4KQEAgLTIxNjksNyArMjYwMyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRKTkRJTmFtZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBKTkRJX05BTUUgPSA0MjsKKwlpbnQgSk5ESV9OQU1FID0gNTE7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkxvY2FsPC9lbT4nIGRhdGEgdHlwZS4KQEAgLTIxNzksNyArMjYxMyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRMb2NhbCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBMT0NBTCA9IDQzOworCWludCBMT0NBTCA9IDUyOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Mb2NhbCBIb21lPC9lbT4nIGRhdGEgdHlwZS4KQEAgLTIxODksNyArMjYyMyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRMb2NhbEhvbWUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgTE9DQUxfSE9NRSA9IDQ0OworCWludCBMT0NBTF9IT01FID0gNTM7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+JyBkYXRhIHR5cGUuCkBAIC0yMTk5LDcgKzI2MzMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluaygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX0xJTksgPSA0NTsKKwlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LID0gNTQ7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KQEAgLTIyMDksNyArMjY0Myw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEVfVFlQRSA9IDQ2OworCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1RZUEVfVFlQRSA9IDU1OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KQEAgLTIyMTksNyArMjY1Myw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3QoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFX09CSkVDVCA9IDQ3OworCWludCBNRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEVfT0JKRUNUID0gNTY7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlBhdGggVHlwZTwvZW0+JyBkYXRhIHR5cGUuCkBAIC0yMjI5LDcgKzI2NjMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UGF0aFR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgUEFUSF9UWVBFID0gNDg7CisJaW50IFBBVEhfVFlQRSA9IDU3OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KQEAgLTIyMzksNyArMjY3Myw0NyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBQRVJTSVNURU5DRV9DT05URVhUX1RZUEVfT0JKRUNUID0gNDk7CisJaW50IFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV9PQkpFQ1QgPSA1ODsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UHJvdG9jb2wgQmluZGluZyBMaXN0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqYXZhLnV0aWwuTGlzdAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UHJvdG9jb2xCaW5kaW5nTGlzdFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUFJPVE9DT0xfQklORElOR19MSVNUX1RZUEUgPSA1OTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UHJvdG9jb2wgQmluZGluZyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UHJvdG9jb2xCaW5kaW5nVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQUk9UT0NPTF9CSU5ESU5HX1RZUEUgPSA2MDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UHJvdG9jb2wgVVJJIEFsaWFzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRQcm90b2NvbFVSSUFsaWFzVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBQUk9UT0NPTF9VUklfQUxJQVNfVFlQRSA9IDYxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5RbmFtZSBQYXR0ZXJuPC9lbT4nIGRhdGEgdHlwZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UW5hbWVQYXR0ZXJuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFFOQU1FX1BBVFRFUk4gPSA2MjsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UmVtb3RlPC9lbT4nIGRhdGEgdHlwZS4KQEAgLTIyNDksNyArMjcyMyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRSZW1vdGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgUkVNT1RFID0gNTA7CisJaW50IFJFTU9URSA9IDYzOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5SZXMgQXV0aCBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCkBAIC0yMjU5LDcgKzI3MzMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UmVzQXV0aFR5cGVPYmplY3QoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgUkVTX0FVVEhfVFlQRV9PQkpFQ1QgPSA1MTsKKwlpbnQgUkVTX0FVVEhfVFlQRV9PQkpFQ1QgPSA2NDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UmVzIFNoYXJpbmcgU2NvcGUgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgpAQCAtMjI2OSw3ICsyNzQzLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3QoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgUkVTX1NIQVJJTkdfU0NPUEVfVFlQRV9PQkpFQ1QgPSA1MjsKKwlpbnQgUkVTX1NIQVJJTkdfU0NPUEVfVFlQRV9PQkpFQ1QgPSA2NTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Um9sZSBOYW1lPC9lbT4nIGRhdGEgdHlwZS4KQEAgLTIyNzksNDcgKzI3NTMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0Um9sZU5hbWUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgUk9MRV9OQU1FID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlNlcnZpY2UgUmVmIFByb3RvY29sIEJpbmRpbmcgTGlzdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX0xJU1RfVFlQRSA9IDU0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBCaW5kaW5nIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX1RZUEUgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgVVJJIEFsaWFzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U2VydmljZSBSZWYgUW5hbWUgUGF0dGVybjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWZRbmFtZVBhdHRlcm4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VSVklDRV9SRUZfUU5BTUVfUEFUVEVSTiA9IDU3OworCWludCBST0xFX05BTUUgPSA2NjsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHJ1ZSBGYWxzZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KQEAgLTIzMjgsNyArMjc2Miw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRUcnVlRmFsc2VUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IFRSVUVfRkFMU0VfVFlQRSA9IDU4OworCWludCBUUlVFX0ZBTFNFX1RZUEUgPSA2NzsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHJ1ZSBGYWxzZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCkBAIC0yMzM4LDEwICsyNzcyLDI3MiBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0VHJ1ZUZhbHNlVHlwZU9iamVjdCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBUUlVFX0ZBTFNFX1RZUEVfT0JKRUNUID0gNTk7CisJaW50IFRSVUVfRkFMU0VfVFlQRV9PQkpFQ1QgPSA2ODsKIAogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkFkZHJlc3NpbmdUeXBlIDxlbT5BZGRyZXNzaW5nIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWRkcmVzc2luZyBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkFkZHJlc3NpbmdUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRBZGRyZXNzaW5nVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuQWRkcmVzc2luZ1R5cGUjaXNFbmFibGVkIDxlbT5FbmFibGVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5hYmxlZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nVHlwZSNpc0VuYWJsZWQoKQorCSAqIEBzZWUgI2dldEFkZHJlc3NpbmdUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBZGRyZXNzaW5nVHlwZV9FbmFibGVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nVHlwZSNpc1JlcXVpcmVkIDxlbT5SZXF1aXJlZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcXVpcmVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkFkZHJlc3NpbmdUeXBlI2lzUmVxdWlyZWQoKQorCSAqIEBzZWUgI2dldEFkZHJlc3NpbmdUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBZGRyZXNzaW5nVHlwZV9SZXF1aXJlZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuQWRkcmVzc2luZ1R5cGUjZ2V0UmVzcG9uc2VzIDxlbT5SZXNwb25zZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNwb25zZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuQWRkcmVzc2luZ1R5cGUjZ2V0UmVzcG9uc2VzKCkKKwkgKiBAc2VlICNnZXRBZGRyZXNzaW5nVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QWRkcmVzc2luZ1R5cGVfUmVzcG9uc2VzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUgPGVtPkRhdGEgU291cmNlIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGF0YSBTb3VyY2UgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0RGF0YVNvdXJjZVR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAc2VlICNnZXREYXRhU291cmNlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0RGF0YVNvdXJjZVR5cGVfRGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldE5hbWUoKQorCSAqIEBzZWUgI2dldERhdGFTb3VyY2VUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREYXRhU291cmNlVHlwZV9OYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldENsYXNzTmFtZSgpCisJICogQHNlZSAjZ2V0RGF0YVNvdXJjZVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERhdGFTb3VyY2VUeXBlX0NsYXNzTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0U2VydmVyTmFtZSA8ZW0+U2VydmVyIE5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXJ2ZXIgTmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRTZXJ2ZXJOYW1lKCkKKwkgKiBAc2VlICNnZXREYXRhU291cmNlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfU2VydmVyTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0UG9ydE51bWJlciA8ZW0+UG9ydCBOdW1iZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qb3J0IE51bWJlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRQb3J0TnVtYmVyKCkKKwkgKiBAc2VlICNnZXREYXRhU291cmNlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfUG9ydE51bWJlcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0RGF0YWJhc2VOYW1lIDxlbT5EYXRhYmFzZSBOYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF0YWJhc2UgTmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXREYXRhYmFzZU5hbWUoKQorCSAqIEBzZWUgI2dldERhdGFTb3VyY2VUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREYXRhU291cmNlVHlwZV9EYXRhYmFzZU5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldFVybCA8ZW0+VXJsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXJsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldFVybCgpCisJICogQHNlZSAjZ2V0RGF0YVNvdXJjZVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERhdGFTb3VyY2VUeXBlX1VybCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0VXNlciA8ZW0+VXNlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0VXNlcigpCisJICogQHNlZSAjZ2V0RGF0YVNvdXJjZVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERhdGFTb3VyY2VUeXBlX1VzZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldFBhc3N3b3JkIDxlbT5QYXNzd29yZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhc3N3b3JkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldFBhc3N3b3JkKCkKKwkgKiBAc2VlICNnZXREYXRhU291cmNlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfUGFzc3dvcmQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRQcm9wZXJ0eSgpCisJICogQHNlZSAjZ2V0RGF0YVNvdXJjZVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldERhdGFTb3VyY2VUeXBlX1Byb3BlcnR5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRMb2dpblRpbWVvdXQgPGVtPkxvZ2luIFRpbWVvdXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2dpbiBUaW1lb3V0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldExvZ2luVGltZW91dCgpCisJICogQHNlZSAjZ2V0RGF0YVNvdXJjZVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERhdGFTb3VyY2VUeXBlX0xvZ2luVGltZW91dCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjaXNUcmFuc2FjdGlvbmFsIDxlbT5UcmFuc2FjdGlvbmFsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnNhY3Rpb25hbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNpc1RyYW5zYWN0aW9uYWwoKQorCSAqIEBzZWUgI2dldERhdGFTb3VyY2VUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREYXRhU291cmNlVHlwZV9UcmFuc2FjdGlvbmFsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRJc29sYXRpb25MZXZlbCA8ZW0+SXNvbGF0aW9uIExldmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXNvbGF0aW9uIExldmVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldElzb2xhdGlvbkxldmVsKCkKKwkgKiBAc2VlICNnZXREYXRhU291cmNlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfSXNvbGF0aW9uTGV2ZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldEluaXRpYWxQb29sU2l6ZSA8ZW0+SW5pdGlhbCBQb29sIFNpemU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbml0aWFsIFBvb2wgU2l6ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRJbml0aWFsUG9vbFNpemUoKQorCSAqIEBzZWUgI2dldERhdGFTb3VyY2VUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREYXRhU291cmNlVHlwZV9Jbml0aWFsUG9vbFNpemUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldE1heFBvb2xTaXplIDxlbT5NYXggUG9vbCBTaXplPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWF4IFBvb2wgU2l6ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRNYXhQb29sU2l6ZSgpCisJICogQHNlZSAjZ2V0RGF0YVNvdXJjZVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERhdGFTb3VyY2VUeXBlX01heFBvb2xTaXplKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZSNnZXRNaW5Qb29sU2l6ZSA8ZW0+TWluIFBvb2wgU2l6ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbiBQb29sIFNpemU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0TWluUG9vbFNpemUoKQorCSAqIEBzZWUgI2dldERhdGFTb3VyY2VUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXREYXRhU291cmNlVHlwZV9NaW5Qb29sU2l6ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0TWF4SWRsZVRpbWUgPGVtPk1heCBJZGxlIFRpbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXggSWRsZSBUaW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldE1heElkbGVUaW1lKCkKKwkgKiBAc2VlICNnZXREYXRhU291cmNlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfTWF4SWRsZVRpbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldE1heFN0YXRlbWVudHMgPGVtPk1heCBTdGF0ZW1lbnRzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWF4IFN0YXRlbWVudHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGUjZ2V0TWF4U3RhdGVtZW50cygpCisJICogQHNlZSAjZ2V0RGF0YVNvdXJjZVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERhdGFTb3VyY2VUeXBlX01heFN0YXRlbWVudHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlI2dldElkKCkKKwkgKiBAc2VlICNnZXREYXRhU291cmNlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RGF0YVNvdXJjZVR5cGVfSWQoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0yNTA0LDYgKzMyMDAsMTcgQEAKIAlFUmVmZXJlbmNlIGdldEVqYkxvY2FsUmVmX0luamVjdGlvblRhcmdldHMoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldExvb2t1cE5hbWUgPGVtPkxvb2t1cCBOYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9va3VwIE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWYjZ2V0TG9va3VwTmFtZSgpCisJICogQHNlZSAjZ2V0RWpiTG9jYWxSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEVqYkxvY2FsUmVmX0xvb2t1cE5hbWUoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmI2dldElkIDxlbT5JZDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTI2MTMsNiArMzMyMCwxNyBAQAogCUVSZWZlcmVuY2UgZ2V0RWpiUmVmX0luamVjdGlvblRhcmdldHMoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRMb29rdXBOYW1lIDxlbT5Mb29rdXAgTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvb2t1cCBOYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZiNnZXRMb29rdXBOYW1lKCkKKwkgKiBAc2VlICNnZXRFamJSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEVqYlJlZl9Mb29rdXBOYW1lKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWYjZ2V0SWQgPGVtPklkPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMjcyMSw2ICszNDM5LDE3IEBACiAJRVJlZmVyZW5jZSBnZXRFbnZFbnRyeV9JbmplY3Rpb25UYXJnZXRzKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRMb29rdXBOYW1lIDxlbT5Mb29rdXAgTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvb2t1cCBOYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5I2dldExvb2t1cE5hbWUoKQorCSAqIEBzZWUgI2dldEVudkVudHJ5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRFbnZFbnRyeV9Mb29rdXBOYW1lKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0yOTgwLDYgKzM3MDksMTcgQEAKIAlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9NYXBwZWROYW1lKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0TG9va3VwTmFtZSA8ZW0+TG9va3VwIE5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb29rdXAgTmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb24jZ2V0TG9va3VwTmFtZSgpCisJICogQHNlZSAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRGVzdGluYXRpb25fTG9va3VwTmFtZSgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uI2dldElkIDxlbT5JZDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTMwNzgsNiArMzgxOCwxNyBAQAogCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0luamVjdGlvblRhcmdldHMoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRMb29rdXBOYW1lIDxlbT5Mb29rdXAgTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvb2t1cCBOYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZiNnZXRMb29rdXBOYW1lKCkKKwkgKiBAc2VlICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9Mb29rdXBOYW1lKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWYjZ2V0SWQgPGVtPklkPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzM0OSw2ICs0MTAwLDM5IEBACiAJRUF0dHJpYnV0ZSBnZXRQb3J0Q29tcG9uZW50UmVmX0VuYWJsZU10b20oKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYjZ2V0TXRvbVRocmVzaG9sZCA8ZW0+TXRvbSBUaHJlc2hvbGQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NdG9tIFRocmVzaG9sZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldE10b21UaHJlc2hvbGQoKQorCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFBvcnRDb21wb25lbnRSZWZfTXRvbVRocmVzaG9sZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRBZGRyZXNzaW5nIDxlbT5BZGRyZXNzaW5nPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QWRkcmVzc2luZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Qb3J0Q29tcG9uZW50UmVmI2dldEFkZHJlc3NpbmcoKQorCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRSZWZfQWRkcmVzc2luZygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUG9ydENvbXBvbmVudFJlZiNnZXRSZXNwZWN0QmluZGluZyA8ZW0+UmVzcGVjdCBCaW5kaW5nPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmVzcGVjdCBCaW5kaW5nPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYjZ2V0UmVzcGVjdEJpbmRpbmcoKQorCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnRSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRSZWZfUmVzcGVjdEJpbmRpbmcoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBvcnRDb21wb25lbnRSZWYjZ2V0UG9ydENvbXBvbmVudExpbmsgPGVtPlBvcnQgQ29tcG9uZW50IExpbms8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0zNDc5LDYgKzQyNjMsMTcgQEAKIAlFUmVmZXJlbmNlIGdldFJlc291cmNlRW52UmVmX0luamVjdGlvblRhcmdldHMoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldExvb2t1cE5hbWUgPGVtPkxvb2t1cCBOYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9va3VwIE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWYjZ2V0TG9va3VwTmFtZSgpCisJICogQHNlZSAjZ2V0UmVzb3VyY2VFbnZSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJlc291cmNlRW52UmVmX0xvb2t1cE5hbWUoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmI2dldElkIDxlbT5JZDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTM1NzcsNiArNDM3MiwxNyBAQAogCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0TG9va3VwTmFtZSA8ZW0+TG9va3VwIE5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb29rdXAgTmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZiNnZXRMb29rdXBOYW1lKCkKKwkgKiBAc2VlICNnZXRSZXNvdXJjZVJlZigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VSZWZfTG9va3VwTmFtZSgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWYjZ2V0SWQgPGVtPklkPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzU4OCw2ICs0Mzk0LDI3IEBACiAJRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZVJlZl9JZCgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc3BlY3RCaW5kaW5nVHlwZSA8ZW0+UmVzcGVjdCBCaW5kaW5nIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVzcGVjdCBCaW5kaW5nIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzcGVjdEJpbmRpbmdUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSZXNwZWN0QmluZGluZ1R5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc3BlY3RCaW5kaW5nVHlwZSNpc0VuYWJsZWQgPGVtPkVuYWJsZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbmFibGVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc3BlY3RCaW5kaW5nVHlwZSNpc0VuYWJsZWQoKQorCSAqIEBzZWUgI2dldFJlc3BlY3RCaW5kaW5nVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UmVzcGVjdEJpbmRpbmdUeXBlX0VuYWJsZWQoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BcyA8ZW0+UnVuIEFzPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzg5Miw2ICs0NzE5LDE3IEBACiAJRVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmX0luamVjdGlvblRhcmdldHMoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWYjZ2V0TG9va3VwTmFtZSA8ZW0+TG9va3VwIE5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb29rdXAgTmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmI2dldExvb2t1cE5hbWUoKQorCSAqIEBzZWUgI2dldFNlcnZpY2VSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNlcnZpY2VSZWZfTG9va3VwTmFtZSgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZiNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC00MTQxLDYgKzQ5NzksMTYgQEAKIAlFQXR0cmlidXRlIGdldFVybFBhdHRlcm5UeXBlX1ZhbHVlKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSA8ZW0+QWRkcmVzc2luZyBSZXNwb25zZXMgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkFkZHJlc3NpbmcgUmVzcG9uc2VzIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0QWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGUgPGVtPkVqYiBSZWYgVHlwZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTQxNTEsMTQgKzQ5OTksMzQgQEAKIAlFRW51bSBnZXRFamJSZWZUeXBlKCk7CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeVR5cGUgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59Jy4KKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5HZW5lcmljQm9vbGVhblR5cGUgPGVtPkdlbmVyaWMgQm9vbGVhbiBUeXBlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RW52IEVudHJ5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlCisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5HZW5lcmljIEJvb2xlYW4gVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5HZW5lcmljQm9vbGVhblR5cGUKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JRUVudW0gZ2V0RW52RW50cnlUeXBlKCk7CisJRUVudW0gZ2V0R2VuZXJpY0Jvb2xlYW5UeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Jc29sYXRpb25MZXZlbFR5cGUgPGVtPklzb2xhdGlvbiBMZXZlbCBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+SXNvbGF0aW9uIExldmVsIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSXNvbGF0aW9uTGV2ZWxUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldElzb2xhdGlvbkxldmVsVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkVudiBFbnRyeSBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5FbnYgRW50cnkgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRURhdGFUeXBlIGdldEVudkVudHJ5VHlwZSgpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2VtPn0nLgpAQCAtNDIwMSw2ICs1MDY5LDE2IEBACiAJRUVudW0gZ2V0UmVzU2hhcmluZ1Njb3BlVHlwZSgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSA8ZW0+QWRkcmVzc2luZyBSZXNwb25zZXMgVHlwZSBPYmplY3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkFkZHJlc3NpbmcgUmVzcG9uc2VzIFR5cGUgT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkFkZHJlc3NpbmdSZXNwb25zZXNUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVEYXRhVHlwZSBnZXRBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZU9iamVjdCgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkRld2V5IFZlcnNpb24gVHlwZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTQyNDEsMTYgKzUxMTksNiBAQAogCUVEYXRhVHlwZSBnZXRFamJSZWZUeXBlT2JqZWN0KCk7CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5VHlwZSA8ZW0+RW52IEVudHJ5IFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5FbnYgRW50cnkgVHlwZSBPYmplY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFbnZFbnRyeVR5cGVPYmplY3QoKTsKLQotCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5GdWxseSBRdWFsaWZpZWQgQ2xhc3MgVHlwZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTQyNjEsNiArNTEyOSwxNiBAQAogCUVEYXRhVHlwZSBnZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5HZW5lcmljQm9vbGVhblR5cGUgPGVtPkdlbmVyaWMgQm9vbGVhbiBUeXBlIE9iamVjdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+R2VuZXJpYyBCb29sZWFuIFR5cGUgT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkdlbmVyaWNCb29sZWFuVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRGF0YVR5cGUgZ2V0R2VuZXJpY0Jvb2xlYW5UeXBlT2JqZWN0KCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SG9tZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTQyNzEsNiArNTE0OSwxNiBAQAogCUVEYXRhVHlwZSBnZXRIb21lKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLklzb2xhdGlvbkxldmVsVHlwZSA8ZW0+SXNvbGF0aW9uIExldmVsIFR5cGUgT2JqZWN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Jc29sYXRpb24gTGV2ZWwgVHlwZSBPYmplY3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSXNvbGF0aW9uTGV2ZWxUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVEYXRhVHlwZSBnZXRJc29sYXRpb25MZXZlbFR5cGVPYmplY3QoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5KYXZhIElkZW50aWZpZXI8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC00MjkxLDYgKzUxNzksMTYgQEAKIAlFRGF0YVR5cGUgZ2V0SmF2YVR5cGUoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5KZGJjIFVybCBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5KZGJjIFVybCBUeXBlPC9lbT4nLgorCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRGF0YVR5cGUgZ2V0SmRiY1VybFR5cGUoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5KTkRJIE5hbWU8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC00MzcxLDYgKzUyNjksNDYgQEAKIAlFRGF0YVR5cGUgZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdCgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEudXRpbC5MaXN0IDxlbT5Qcm90b2NvbCBCaW5kaW5nIExpc3QgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UHJvdG9jb2wgQmluZGluZyBMaXN0IFR5cGU8L2VtPicuCisJICogQHNlZSBqYXZhLnV0aWwuTGlzdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRGF0YVR5cGUgZ2V0UHJvdG9jb2xCaW5kaW5nTGlzdFR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Qcm90b2NvbCBCaW5kaW5nIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlByb3RvY29sIEJpbmRpbmcgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRURhdGFUeXBlIGdldFByb3RvY29sQmluZGluZ1R5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Qcm90b2NvbCBVUkkgQWxpYXMgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UHJvdG9jb2wgVVJJIEFsaWFzIFR5cGU8L2VtPicuCisJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCisJICogQGdlbmVyYXRlZAorCSAqLworCUVEYXRhVHlwZSBnZXRQcm90b2NvbFVSSUFsaWFzVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlFuYW1lIFBhdHRlcm48L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlFuYW1lIFBhdHRlcm48L2VtPicuCisJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCisJICogQGdlbmVyYXRlZAorCSAqLworCUVEYXRhVHlwZSBnZXRRbmFtZVBhdHRlcm4oKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5SZW1vdGU8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC00NDExLDQ2ICs1MzQ5LDYgQEAKIAlFRGF0YVR5cGUgZ2V0Um9sZU5hbWUoKTsKIAogCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLnV0aWwuTGlzdCA8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgQmluZGluZyBMaXN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlNlcnZpY2UgUmVmIFByb3RvY29sIEJpbmRpbmcgTGlzdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS51dGlsLkxpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlNlcnZpY2UgUmVmIFByb3RvY29sIEJpbmRpbmcgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgQmluZGluZyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBVUkkgQWxpYXMgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgVVJJIEFsaWFzIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5TZXJ2aWNlIFJlZiBRbmFtZSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TZXJ2aWNlIFJlZiBRbmFtZSBQYXR0ZXJuPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U2VydmljZVJlZlFuYW1lUGF0dGVybigpOwotCi0JLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlRydWUgRmFsc2UgVHlwZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNDQ5Miw2ICs1MzkwLDIwMiBAQAogCSAqLwogCWludGVyZmFjZSBMaXRlcmFscyAgewogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkFkZHJlc3NpbmdUeXBlSW1wbCA8ZW0+QWRkcmVzc2luZyBUeXBlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuQWRkcmVzc2luZ1R5cGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0QWRkcmVzc2luZ1R5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQUREUkVTU0lOR19UWVBFID0gZUlOU1RBTkNFLmdldEFkZHJlc3NpbmdUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQUREUkVTU0lOR19UWVBFX19FTkFCTEVEID0gZUlOU1RBTkNFLmdldEFkZHJlc3NpbmdUeXBlX0VuYWJsZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQUREUkVTU0lOR19UWVBFX19SRVFVSVJFRCA9IGVJTlNUQU5DRS5nZXRBZGRyZXNzaW5nVHlwZV9SZXF1aXJlZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQUREUkVTU0lOR19UWVBFX19SRVNQT05TRVMgPSBlSU5TVEFOQ0UuZ2V0QWRkcmVzc2luZ1R5cGVfUmVzcG9uc2VzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EYXRhU291cmNlVHlwZUltcGwgPGVtPkRhdGEgU291cmNlIFR5cGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5EYXRhU291cmNlVHlwZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXREYXRhU291cmNlVHlwZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBEQVRBX1NPVVJDRV9UWVBFID0gZUlOU1RBTkNFLmdldERhdGFTb3VyY2VUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIERBVEFfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERhdGFTb3VyY2VUeXBlX0Rlc2NyaXB0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFUQV9TT1VSQ0VfVFlQRV9fTkFNRSA9IGVJTlNUQU5DRS5nZXREYXRhU291cmNlVHlwZV9OYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFUQV9TT1VSQ0VfVFlQRV9fQ0xBU1NfTkFNRSA9IGVJTlNUQU5DRS5nZXREYXRhU291cmNlVHlwZV9DbGFzc05hbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZlciBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFUQV9TT1VSQ0VfVFlQRV9fU0VSVkVSX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RGF0YVNvdXJjZVR5cGVfU2VydmVyTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBOdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEQVRBX1NPVVJDRV9UWVBFX19QT1JUX05VTUJFUiA9IGVJTlNUQU5DRS5nZXREYXRhU291cmNlVHlwZV9Qb3J0TnVtYmVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhYmFzZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFUQV9TT1VSQ0VfVFlQRV9fREFUQUJBU0VfTkFNRSA9IGVJTlNUQU5DRS5nZXREYXRhU291cmNlVHlwZV9EYXRhYmFzZU5hbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVybDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERBVEFfU09VUkNFX1RZUEVfX1VSTCA9IGVJTlNUQU5DRS5nZXREYXRhU291cmNlVHlwZV9VcmwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEQVRBX1NPVVJDRV9UWVBFX19VU0VSID0gZUlOU1RBTkNFLmdldERhdGFTb3VyY2VUeXBlX1VzZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhc3N3b3JkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFUQV9TT1VSQ0VfVFlQRV9fUEFTU1dPUkQgPSBlSU5TVEFOQ0UuZ2V0RGF0YVNvdXJjZVR5cGVfUGFzc3dvcmQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBEQVRBX1NPVVJDRV9UWVBFX19QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXREYXRhU291cmNlVHlwZV9Qcm9wZXJ0eSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9naW4gVGltZW91dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERBVEFfU09VUkNFX1RZUEVfX0xPR0lOX1RJTUVPVVQgPSBlSU5TVEFOQ0UuZ2V0RGF0YVNvdXJjZVR5cGVfTG9naW5UaW1lb3V0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFUQV9TT1VSQ0VfVFlQRV9fVFJBTlNBQ1RJT05BTCA9IGVJTlNUQU5DRS5nZXREYXRhU291cmNlVHlwZV9UcmFuc2FjdGlvbmFsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jc29sYXRpb24gTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEQVRBX1NPVVJDRV9UWVBFX19JU09MQVRJT05fTEVWRUwgPSBlSU5TVEFOQ0UuZ2V0RGF0YVNvdXJjZVR5cGVfSXNvbGF0aW9uTGV2ZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgUG9vbCBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFUQV9TT1VSQ0VfVFlQRV9fSU5JVElBTF9QT09MX1NJWkUgPSBlSU5TVEFOQ0UuZ2V0RGF0YVNvdXJjZVR5cGVfSW5pdGlhbFBvb2xTaXplKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXggUG9vbCBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFUQV9TT1VSQ0VfVFlQRV9fTUFYX1BPT0xfU0laRSA9IGVJTlNUQU5DRS5nZXREYXRhU291cmNlVHlwZV9NYXhQb29sU2l6ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWluIFBvb2wgU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERBVEFfU09VUkNFX1RZUEVfX01JTl9QT09MX1NJWkUgPSBlSU5TVEFOQ0UuZ2V0RGF0YVNvdXJjZVR5cGVfTWluUG9vbFNpemUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1heCBJZGxlIFRpbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBEQVRBX1NPVVJDRV9UWVBFX19NQVhfSURMRV9USU1FID0gZUlOU1RBTkNFLmdldERhdGFTb3VyY2VUeXBlX01heElkbGVUaW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXggU3RhdGVtZW50czwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIERBVEFfU09VUkNFX1RZUEVfX01BWF9TVEFURU1FTlRTID0gZUlOU1RBTkNFLmdldERhdGFTb3VyY2VUeXBlX01heFN0YXRlbWVudHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREFUQV9TT1VSQ0VfVFlQRV9fSUQgPSBlSU5TVEFOQ0UuZ2V0RGF0YVNvdXJjZVR5cGVfSWQoKTsKKworCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkRlc2NyaXB0aW9uSW1wbCA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTQ2MTgsNiArNTcxMiwxNCBAQAogCQlFUmVmZXJlbmNlIEVKQl9MT0NBTF9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gZUlOU1RBTkNFLmdldEVqYkxvY2FsUmVmX0luamVjdGlvblRhcmdldHMoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvb2t1cCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgRUpCX0xPQ0FMX1JFRl9fTE9PS1VQX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RWpiTG9jYWxSZWZfTG9va3VwTmFtZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTQ3MDAsNiArNTgwMiwxNCBAQAogCQlFUmVmZXJlbmNlIEVKQl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gZUlOU1RBTkNFLmdldEVqYlJlZl9JbmplY3Rpb25UYXJnZXRzKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb29rdXAgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEVKQl9SRUZfX0xPT0tVUF9OQU1FID0gZUlOU1RBTkNFLmdldEVqYlJlZl9Mb29rdXBOYW1lKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNDc4NCw2ICs1ODk0LDE0IEBACiAJCUVSZWZlcmVuY2UgRU5WX0VOVFJZX19JTkpFQ1RJT05fVEFSR0VUUyA9IGVJTlNUQU5DRS5nZXRFbnZFbnRyeV9JbmplY3Rpb25UYXJnZXRzKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb29rdXAgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEVOVl9FTlRSWV9fTE9PS1VQX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlfTG9va3VwTmFtZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTQ5ODYsNiArNjEwNCwxNCBAQAogCQlFQXR0cmlidXRlIE1FU1NBR0VfREVTVElOQVRJT05fX01BUFBFRF9OQU1FID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvbl9NYXBwZWROYW1lKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb29rdXAgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIE1FU1NBR0VfREVTVElOQVRJT05fX0xPT0tVUF9OQU1FID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvbl9Mb29rdXBOYW1lKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNTA2MCw2ICs2MTg2LDE0IEBACiAJCUVSZWZlcmVuY2UgTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX0lOSkVDVElPTl9UQVJHRVRTID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9JbmplY3Rpb25UYXJnZXRzKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb29rdXAgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIE1FU1NBR0VfREVTVElOQVRJT05fUkVGX19MT09LVVBfTkFNRSA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTG9va3VwTmFtZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTUyNjgsNiArNjQwMiwzMCBAQAogCQlFQXR0cmlidXRlIFBPUlRfQ09NUE9ORU5UX1JFRl9fRU5BQkxFX01UT00gPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9FbmFibGVNdG9tKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NdG9tIFRocmVzaG9sZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBPUlRfQ09NUE9ORU5UX1JFRl9fTVRPTV9USFJFU0hPTEQgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9NdG9tVGhyZXNob2xkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRyZXNzaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUE9SVF9DT01QT05FTlRfUkVGX19BRERSRVNTSU5HID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWZfQWRkcmVzc2luZygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzcGVjdCBCaW5kaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUE9SVF9DT01QT05FTlRfUkVGX19SRVNQRUNUX0JJTkRJTkcgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9SZXNwZWN0QmluZGluZygpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9ydCBDb21wb25lbnQgTGluazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNTM2OCw2ICs2NTI2LDE0IEBACiAJCUVSZWZlcmVuY2UgUkVTT1VSQ0VfRU5WX1JFRl9fSU5KRUNUSU9OX1RBUkdFVFMgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VFbnZSZWZfSW5qZWN0aW9uVGFyZ2V0cygpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9va3VwIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9FTlZfUkVGX19MT09LVVBfTkFNRSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUVudlJlZl9Mb29rdXBOYW1lKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNTQ0Miw2ICs2NjA4LDE0IEBACiAJCUVSZWZlcmVuY2UgUkVTT1VSQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9JbmplY3Rpb25UYXJnZXRzKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb29rdXAgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJFU09VUkNFX1JFRl9fTE9PS1VQX05BTUUgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfTG9va3VwTmFtZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTU0NTAsNiArNjYyNCwyNCBAQAogCQlFQXR0cmlidXRlIFJFU09VUkNFX1JFRl9fSUQgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VSZWZfSWQoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLlJlc3BlY3RCaW5kaW5nVHlwZUltcGwgPGVtPlJlc3BlY3QgQmluZGluZyBUeXBlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUmVzcGVjdEJpbmRpbmdUeXBlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFJlc3BlY3RCaW5kaW5nVHlwZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBSRVNQRUNUX0JJTkRJTkdfVFlQRSA9IGVJTlNUQU5DRS5nZXRSZXNwZWN0QmluZGluZ1R5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBSRVNQRUNUX0JJTkRJTkdfVFlQRV9fRU5BQkxFRCA9IGVJTlNUQU5DRS5nZXRSZXNwZWN0QmluZGluZ1R5cGVfRW5hYmxlZCgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuUnVuQXNJbXBsIDxlbT5SdW4gQXM8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTU2ODIsNiArNjg3NCwxNCBAQAogCQlFUmVmZXJlbmNlIFNFUlZJQ0VfUkVGX19JTkpFQ1RJT05fVEFSR0VUUyA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX0luamVjdGlvblRhcmdldHMoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvb2t1cCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0VSVklDRV9SRUZfX0xPT0tVUF9OQU1FID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfTG9va3VwTmFtZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTU4NzQsNiArNzA3NCwxNiBAQAogCQlFQXR0cmlidXRlIFVSTF9QQVRURVJOX1RZUEVfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFVybFBhdHRlcm5UeXBlX1ZhbHVlKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgPGVtPkFkZHJlc3NpbmcgUmVzcG9uc2VzIFR5cGU8L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gQUREUkVTU0lOR19SRVNQT05TRVNfVFlQRSA9IGVJTlNUQU5DRS5nZXRBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZlR5cGUgPGVtPkVqYiBSZWYgVHlwZTwvZW0+fScgZW51bS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC01ODg0LDE0ICs3MDk0LDM0IEBACiAJCUVFbnVtIEVKQl9SRUZfVFlQRSA9IGVJTlNUQU5DRS5nZXRFamJSZWZUeXBlKCk7CiAKIAkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlIDxlbT5FbnYgRW50cnkgVHlwZTwvZW0+fScgZW51bS4KKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5HZW5lcmljQm9vbGVhblR5cGUgPGVtPkdlbmVyaWMgQm9vbGVhbiBUeXBlPC9lbT59JyBlbnVtLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkdlbmVyaWNCb29sZWFuVHlwZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEdlbmVyaWNCb29sZWFuVHlwZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIEdFTkVSSUNfQk9PTEVBTl9UWVBFID0gZUlOU1RBTkNFLmdldEdlbmVyaWNCb29sZWFuVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLklzb2xhdGlvbkxldmVsVHlwZSA8ZW0+SXNvbGF0aW9uIExldmVsIFR5cGU8L2VtPn0nIGVudW0uCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5Jc29sYXRpb25MZXZlbFR5cGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRJc29sYXRpb25MZXZlbFR5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBJU09MQVRJT05fTEVWRUxfVFlQRSA9IGVJTlNUQU5DRS5nZXRJc29sYXRpb25MZXZlbFR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkVudiBFbnRyeSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwogCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEVudkVudHJ5VHlwZSgpCiAJCSAqIEBnZW5lcmF0ZWQKIAkJICovCi0JCUVFbnVtIEVOVl9FTlRSWV9UWVBFID0gZUlOU1RBTkNFLmdldEVudkVudHJ5VHlwZSgpOworCQlFRGF0YVR5cGUgRU5WX0VOVFJZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0RW52RW50cnlUeXBlKCk7CiAKIAkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFVzYWdlIFR5cGU8L2VtPn0nIGVudW0uCkBAIC01OTM0LDYgKzcxNjQsMTYgQEAKIAkJRUVudW0gUkVTX1NIQVJJTkdfU0NPUEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRSZXNTaGFyaW5nU2NvcGVUeXBlKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5BZGRyZXNzaW5nIFJlc3BvbnNlcyBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRURhdGFUeXBlIEFERFJFU1NJTkdfUkVTUE9OU0VTX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0KCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5EZXdleSBWZXJzaW9uIFR5cGU8L2VtPicgZGF0YSB0eXBlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTU5NzQsMTYgKzcyMTQsNiBAQAogCQlFRGF0YVR5cGUgRUpCX1JFRl9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRFamJSZWZUeXBlT2JqZWN0KCk7CiAKIAkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5FbnYgRW50cnkgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnlUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0RW52RW50cnlUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIEVOVl9FTlRSWV9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRFbnZFbnRyeVR5cGVPYmplY3QoKTsKLQotCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkZ1bGx5IFF1YWxpZmllZCBDbGFzcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC01OTk0LDYgKzcyMjQsMTYgQEAKIAkJRURhdGFUeXBlIEZVTExZX1FVQUxJRklFRF9DTEFTU19UWVBFID0gZUlOU1RBTkNFLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5HZW5lcmljIEJvb2xlYW4gVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuR2VuZXJpY0Jvb2xlYW5UeXBlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0R2VuZXJpY0Jvb2xlYW5UeXBlT2JqZWN0KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRURhdGFUeXBlIEdFTkVSSUNfQk9PTEVBTl9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRHZW5lcmljQm9vbGVhblR5cGVPYmplY3QoKTsKKworCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkhvbWU8L2VtPicgZGF0YSB0eXBlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTYwMDQsNiArNzI0NCwxNiBAQAogCQlFRGF0YVR5cGUgSE9NRSA9IGVJTlNUQU5DRS5nZXRIb21lKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Jc29sYXRpb24gTGV2ZWwgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSXNvbGF0aW9uTGV2ZWxUeXBlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0SXNvbGF0aW9uTGV2ZWxUeXBlT2JqZWN0KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRURhdGFUeXBlIElTT0xBVElPTl9MRVZFTF9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRJc29sYXRpb25MZXZlbFR5cGVPYmplY3QoKTsKKworCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkphdmEgSWRlbnRpZmllcjwvZW0+JyBkYXRhIHR5cGUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNjAyNCw2ICs3Mjc0LDE2IEBACiAJCUVEYXRhVHlwZSBKQVZBX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0SmF2YVR5cGUoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkpkYmMgVXJsIFR5cGU8L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0SmRiY1VybFR5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRGF0YVR5cGUgSkRCQ19VUkxfVFlQRSA9IGVJTlNUQU5DRS5nZXRKZGJjVXJsVHlwZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+Sk5ESSBOYW1lPC9lbT4nIGRhdGEgdHlwZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC02MTA0LDYgKzczNjQsNDYgQEAKIAkJRURhdGFUeXBlIFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdCgpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+UHJvdG9jb2wgQmluZGluZyBMaXN0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBqYXZhLnV0aWwuTGlzdAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFByb3RvY29sQmluZGluZ0xpc3RUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRURhdGFUeXBlIFBST1RPQ09MX0JJTkRJTkdfTElTVF9UWVBFID0gZUlOU1RBTkNFLmdldFByb3RvY29sQmluZGluZ0xpc3RUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Qcm90b2NvbCBCaW5kaW5nIFR5cGU8L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UHJvdG9jb2xCaW5kaW5nVHlwZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVEYXRhVHlwZSBQUk9UT0NPTF9CSU5ESU5HX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UHJvdG9jb2xCaW5kaW5nVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+UHJvdG9jb2wgVVJJIEFsaWFzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UHJvdG9jb2xVUklBbGlhc1R5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRGF0YVR5cGUgUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0UHJvdG9jb2xVUklBbGlhc1R5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlFuYW1lIFBhdHRlcm48L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0UW5hbWVQYXR0ZXJuKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRURhdGFUeXBlIFFOQU1FX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0UW5hbWVQYXR0ZXJuKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5SZW1vdGU8L2VtPicgZGF0YSB0eXBlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTYxNDQsNDYgKzc0NDQsNiBAQAogCQlFRGF0YVR5cGUgUk9MRV9OQU1FID0gZUlOU1RBTkNFLmdldFJvbGVOYW1lKCk7CiAKIAkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBCaW5kaW5nIExpc3QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfTElTVF9UWVBFID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgQmluZGluZyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsI2dldFNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfVFlQRSA9IGVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgVVJJIEFsaWFzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLmltcGwuSmF2YWVlUGFja2FnZUltcGwjZ2V0U2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFUlZJQ0VfUkVGX1BST1RPQ09MX1VSSV9BTElBU19UWVBFID0gZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+U2VydmljZSBSZWYgUW5hbWUgUGF0dGVybjwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbCNnZXRTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFUlZJQ0VfUkVGX1FOQU1FX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0U2VydmljZVJlZlFuYW1lUGF0dGVybigpOwotCi0JCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VHJ1ZSBGYWxzZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KRUVYTUxIZWxwZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KRUVYTUxIZWxwZXJJbXBsLmphdmEKaW5kZXggNTAwYzhkYS4uMTRjOGU5NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSkVFWE1MSGVscGVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0pFRVhNTEhlbHBlckltcGwuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogCiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZShFQ2xhc3MgY2xhc3MxLCBTdHJpbmcgbmFtZXNwYWNlVVJJLAogCQkJU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNFbGVtZW50KSB7CiAJCS8vIElmIG5vdCBmb3VuZCBpbiBjdXJyZW50IG5hbWVzcGFjZSBwYWNrYWdlLCBnbyB0byBjb21tb24gcGFja2FnZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZUFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggZjQzNGIwMS4uYzJhYzk4ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC01OCw2ICs1OCw3IEBACiAJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKIAkJCXJldHVybiB0cnVlOwpAQCAtNjksOTUgKzcwLDEzNSBAQAogCX0KIAogCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgSmF2YWVlU3dpdGNoIG1vZGVsU3dpdGNoID0KLQkJbmV3IEphdmFlZVN3aXRjaCgpIHsKLQkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uKERlc2NyaXB0aW9uIG9iamVjdCkgeworCXByb3RlY3RlZCBKYXZhZWVTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgSmF2YWVlU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQWRkcmVzc2luZ1R5cGUoQWRkcmVzc2luZ1R5cGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUFkZHJlc3NpbmdUeXBlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGF0YVNvdXJjZVR5cGUoRGF0YVNvdXJjZVR5cGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZURhdGFTb3VyY2VUeXBlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVzY3JpcHRpb24oRGVzY3JpcHRpb24gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRGlzcGxheU5hbWUoRGlzcGxheU5hbWUgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNwbGF5TmFtZShEaXNwbGF5TmFtZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRGlzcGxheU5hbWVBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFamJMb2NhbFJlZihFamJMb2NhbFJlZiBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVqYkxvY2FsUmVmKEVqYkxvY2FsUmVmIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFamJMb2NhbFJlZkFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVqYlJlZihFamJSZWYgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFamJSZWYoRWpiUmVmIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFamJSZWZBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFbXB0eVR5cGUoRW1wdHlUeXBlIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRW1wdHlUeXBlKEVtcHR5VHlwZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRW1wdHlUeXBlQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRW52RW50cnkoRW52RW50cnkgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFbnZFbnRyeShFbnZFbnRyeSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRW52RW50cnlBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJY29uKEljb24gb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJY29uKEljb24gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUljb25BZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbmplY3Rpb25UYXJnZXQoSW5qZWN0aW9uVGFyZ2V0IG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSW5qZWN0aW9uVGFyZ2V0KEluamVjdGlvblRhcmdldCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSW5qZWN0aW9uVGFyZ2V0QWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTGlmZWN5Y2xlQ2FsbGJhY2soTGlmZWN5Y2xlQ2FsbGJhY2sgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMaWZlY3ljbGVDYWxsYmFjayhMaWZlY3ljbGVDYWxsYmFjayBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTGlmZWN5Y2xlQ2FsbGJhY2tBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMaXN0ZW5lcihMaXN0ZW5lciBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUxpc3RlbmVyKExpc3RlbmVyIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVMaXN0ZW5lckFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEZXN0aW5hdGlvbihNZXNzYWdlRGVzdGluYXRpb24gb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXNzYWdlRGVzdGluYXRpb24oTWVzc2FnZURlc3RpbmF0aW9uIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25BZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRGVzdGluYXRpb25SZWYoTWVzc2FnZURlc3RpbmF0aW9uUmVmIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTWVzc2FnZURlc3RpbmF0aW9uUmVmKE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUGFyYW1WYWx1ZShQYXJhbVZhbHVlIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUGFyYW1WYWx1ZShQYXJhbVZhbHVlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVQYXJhbVZhbHVlQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUGVyc2lzdGVuY2VDb250ZXh0UmVmKFBlcnNpc3RlbmNlQ29udGV4dFJlZiBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVBlcnNpc3RlbmNlQ29udGV4dFJlZihQZXJzaXN0ZW5jZUNvbnRleHRSZWYgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVBlcnNpc3RlbmNlQ29udGV4dFJlZkFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVBlcnNpc3RlbmNlVW5pdFJlZihQZXJzaXN0ZW5jZVVuaXRSZWYgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQZXJzaXN0ZW5jZVVuaXRSZWYoUGVyc2lzdGVuY2VVbml0UmVmIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRSZWZBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0Q29tcG9uZW50UmVmKFBvcnRDb21wb25lbnRSZWYgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQb3J0Q29tcG9uZW50UmVmKFBvcnRDb21wb25lbnRSZWYgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVBvcnRDb21wb25lbnRSZWZBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9wZXJ0eVR5cGUoUHJvcGVydHlUeXBlIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvcGVydHlUeXBlKFByb3BlcnR5VHlwZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUHJvcGVydHlUeXBlQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VFbnZSZWYoUmVzb3VyY2VFbnZSZWYgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSZXNvdXJjZUVudlJlZihSZXNvdXJjZUVudlJlZiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VFbnZSZWZBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZVJlZihSZXNvdXJjZVJlZiBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVJlc291cmNlUmVmKFJlc291cmNlUmVmIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZVJlZkFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVJ1bkFzKFJ1bkFzIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUmVzcGVjdEJpbmRpbmdUeXBlKFJlc3BlY3RCaW5kaW5nVHlwZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUmVzcGVjdEJpbmRpbmdUeXBlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUnVuQXMoUnVuQXMgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVJ1bkFzQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlSb2xlKFNlY3VyaXR5Um9sZSBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNlY3VyaXR5Um9sZShTZWN1cml0eVJvbGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5Um9sZUFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Um9sZVJlZihTZWN1cml0eVJvbGVSZWYgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTZWN1cml0eVJvbGVSZWYoU2VjdXJpdHlSb2xlUmVmIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVTZWN1cml0eVJvbGVSZWZBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmKFNlcnZpY2VSZWYgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTZXJ2aWNlUmVmKFNlcnZpY2VSZWYgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmSGFuZGxlcihTZXJ2aWNlUmVmSGFuZGxlciBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNlcnZpY2VSZWZIYW5kbGVyKFNlcnZpY2VSZWZIYW5kbGVyIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVTZXJ2aWNlUmVmSGFuZGxlckFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oU2VydmljZVJlZkhhbmRsZXJDaGFpbiBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oU2VydmljZVJlZkhhbmRsZXJDaGFpbiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlU2VydmljZVJlZkhhbmRsZXJDaGFpbkFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2VydmljZVJlZkhhbmRsZXJDaGFpbnMoU2VydmljZVJlZkhhbmRsZXJDaGFpbnMgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVXJsUGF0dGVyblR5cGUoVXJsUGF0dGVyblR5cGUgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VVcmxQYXR0ZXJuVHlwZShVcmxQYXR0ZXJuVHlwZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlVXJsUGF0dGVyblR5cGVBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CiAJCQl9CiAJCX07CkBAIC0xNzAsMTIgKzIxMSw0MSBAQAogCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CiAJfQogCiAKIAkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nVHlwZSA8ZW0+QWRkcmVzc2luZyBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5BZGRyZXNzaW5nVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGRyZXNzaW5nVHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlIDxlbT5EYXRhIFNvdXJjZSBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVEYXRhU291cmNlVHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CkBAIC00NDIsNiArNTEyLDIwIEBACiAJfQogCiAJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzcGVjdEJpbmRpbmdUeXBlIDxlbT5SZXNwZWN0IEJpbmRpbmcgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzcGVjdEJpbmRpbmdUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc3BlY3RCaW5kaW5nVHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJ1bkFzIDxlbT5SdW4gQXM8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmluZGV4IGM3YjFmY2YuLjlkZGE4MTggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKIAkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IEphdmFlZVJlc291cmNlSW1wbCh1cmkpOwogCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVJlc291cmNlSW1wbC5qYXZhCmluZGV4IGFkMmJlZmYuLmQ4OGQyZDUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVJlc291cmNlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVJlc291cmNlSW1wbC5qYXZhCkBAIC0xNCwxMyArMTQsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC00MSw2ICszOCw3IEBACiAJCXN1cGVyKHVyaSk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQogCQlJRmlsZSBmaWxlID0gZ2V0UGxhdGZvcm1GaWxlKCk7CkBAIC00OCwyOSArNDYsMTYgQEAKIAkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkgcmV0dXJuOyAvLyBPbmx5IHNhdmUgaWYgZmlsZSBleGlzdGVkCiAJCXN1cGVyLnNhdmUob3B0aW9ucyk7CiAJfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSUZpbGUgZm9yIHRoZSA8Y29kZT51cmk8L2NvZGU+IHdpdGhpbiB0aGUgV29ya3NwYWNlLiBUaGlzIFVSSSBpcyBhc3N1bWVkIHRvIGJlCi0JICogYWJzb2x1dGUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6IHBsYXRmb3JtOi9yZXNvdXJjZS8uLi4uCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRQbGF0Zm9ybUZpbGUoVVJJIHVyaSkgewotCQlpZiAoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmlzUGxhdGZvcm1SZXNvdXJjZVVSSSh1cmkpKSB7Ci0JCQlTdHJpbmcgZmlsZVN0cmluZyA9IFVSSS5kZWNvZGUodXJpLnBhdGgoKSk7Ci0JCQlmaWxlU3RyaW5nID0gZmlsZVN0cmluZy5zdWJzdHJpbmcoSkVNVXRpbFBsdWdpbi5QTEFURk9STV9SRVNPVVJDRS5sZW5ndGgoKSArIDEpOwotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQogCiAJcHJpdmF0ZSBJRmlsZSBnZXRQbGF0Zm9ybUZpbGUoKSB7CiAJCUlGaWxlIGZpbGUgPSBudWxsOwotCQlmaWxlID0gZ2V0UGxhdGZvcm1GaWxlKGdldFVSSSgpKTsKKwkJZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldFBsYXRmb3JtRmlsZShnZXRVUkkoKSk7CiAJCWlmIChmaWxlID09IG51bGwpIHsKIAkJCWlmIChnZXRSZXNvdXJjZVNldCgpICE9IG51bGwpIHsKIAkJCQlVUklDb252ZXJ0ZXIgY29udmVydGVyID0gZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKIAkJCQlVUkkgY29udmVydGVkVXJpID0gY29udmVydGVyLm5vcm1hbGl6ZSh1cmkpOwogCQkJCWlmICghdXJpLmVxdWFscyhjb252ZXJ0ZWRVcmkpKQotCQkJCQlmaWxlID0gZ2V0UGxhdGZvcm1GaWxlKGNvbnZlcnRlZFVyaSk7CisJCQkJCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRQbGF0Zm9ybUZpbGUoY29udmVydGVkVXJpKTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gZmlsZTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlU3dpdGNoLmphdmEKaW5kZXggM2QzZWYxOS4uMWYzMzliOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlU3dpdGNoLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlU3dpdGNoLmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIEphdmFlZVN3aXRjaCB7CitwdWJsaWMgY2xhc3MgSmF2YWVlU3dpdGNoPFQ+IHsKIAkvKioKIAkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjAsNyArNjAsNyBAQAogCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CiAJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKIAl9CiAKQEAgLTcxLDE2ICs3MSwxNiBAQAogCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CiAJCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewogCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7CiAJCX0KIAkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKIAkJCXJldHVybgogCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CiAJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwogCQl9CiAJfQogCkBAIC05MSwxNjcgKzkxLDE4NSBAQAogCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CiAJCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuQUREUkVTU0lOR19UWVBFOiB7CisJCQkJQWRkcmVzc2luZ1R5cGUgYWRkcmVzc2luZ1R5cGUgPSAoQWRkcmVzc2luZ1R5cGUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VBZGRyZXNzaW5nVHlwZShhZGRyZXNzaW5nVHlwZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkRBVEFfU09VUkNFX1RZUEU6IHsKKwkJCQlEYXRhU291cmNlVHlwZSBkYXRhU291cmNlVHlwZSA9IChEYXRhU291cmNlVHlwZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZURhdGFTb3VyY2VUeXBlKGRhdGFTb3VyY2VUeXBlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuREVTQ1JJUFRJT046IHsKIAkJCQlEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworCQkJCVQgcmVzdWx0ID0gY2FzZURlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRElTUExBWV9OQU1FOiB7CiAJCQkJRGlzcGxheU5hbWUgZGlzcGxheU5hbWUgPSAoRGlzcGxheU5hbWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURpc3BsYXlOYW1lKGRpc3BsYXlOYW1lKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VEaXNwbGF5TmFtZShkaXNwbGF5TmFtZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MT0NBTF9SRUY6IHsKIAkJCQlFamJMb2NhbFJlZiBlamJMb2NhbFJlZiA9IChFamJMb2NhbFJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRWpiTG9jYWxSZWYoZWpiTG9jYWxSZWYpOworCQkJCVQgcmVzdWx0ID0gY2FzZUVqYkxvY2FsUmVmKGVqYkxvY2FsUmVmKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRjogewogCQkJCUVqYlJlZiBlamJSZWYgPSAoRWpiUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFamJSZWYoZWpiUmVmKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VFamJSZWYoZWpiUmVmKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRU1QVFlfVFlQRTogewogCQkJCUVtcHR5VHlwZSBlbXB0eVR5cGUgPSAoRW1wdHlUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFbXB0eVR5cGUoZW1wdHlUeXBlKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VFbXB0eVR5cGUoZW1wdHlUeXBlKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZOiB7CiAJCQkJRW52RW50cnkgZW52RW50cnkgPSAoRW52RW50cnkpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVudkVudHJ5KGVudkVudHJ5KTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VFbnZFbnRyeShlbnZFbnRyeSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklDT046IHsKIAkJCQlJY29uIGljb24gPSAoSWNvbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSWNvbihpY29uKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VJY29uKGljb24pOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5JTkpFQ1RJT05fVEFSR0VUOiB7CiAJCQkJSW5qZWN0aW9uVGFyZ2V0IGluamVjdGlvblRhcmdldCA9IChJbmplY3Rpb25UYXJnZXQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUluamVjdGlvblRhcmdldChpbmplY3Rpb25UYXJnZXQpOworCQkJCVQgcmVzdWx0ID0gY2FzZUluamVjdGlvblRhcmdldChpbmplY3Rpb25UYXJnZXQpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5MSUZFQ1lDTEVfQ0FMTEJBQ0s6IHsKIAkJCQlMaWZlY3ljbGVDYWxsYmFjayBsaWZlY3ljbGVDYWxsYmFjayA9IChMaWZlY3ljbGVDYWxsYmFjayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTGlmZWN5Y2xlQ2FsbGJhY2sobGlmZWN5Y2xlQ2FsbGJhY2spOworCQkJCVQgcmVzdWx0ID0gY2FzZUxpZmVjeWNsZUNhbGxiYWNrKGxpZmVjeWNsZUNhbGxiYWNrKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTElTVEVORVI6IHsKIAkJCQlMaXN0ZW5lciBsaXN0ZW5lciA9IChMaXN0ZW5lcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTGlzdGVuZXIobGlzdGVuZXIpOworCQkJCVQgcmVzdWx0ID0gY2FzZUxpc3RlbmVyKGxpc3RlbmVyKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTjogewogCQkJCU1lc3NhZ2VEZXN0aW5hdGlvbiBtZXNzYWdlRGVzdGluYXRpb24gPSAoTWVzc2FnZURlc3RpbmF0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VNZXNzYWdlRGVzdGluYXRpb24obWVzc2FnZURlc3RpbmF0aW9uKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VNZXNzYWdlRGVzdGluYXRpb24obWVzc2FnZURlc3RpbmF0aW9uKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUY6IHsKIAkJCQlNZXNzYWdlRGVzdGluYXRpb25SZWYgbWVzc2FnZURlc3RpbmF0aW9uUmVmID0gKE1lc3NhZ2VEZXN0aW5hdGlvblJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWVzc2FnZURlc3RpbmF0aW9uUmVmKG1lc3NhZ2VEZXN0aW5hdGlvblJlZik7CisJCQkJVCByZXN1bHQgPSBjYXNlTWVzc2FnZURlc3RpbmF0aW9uUmVmKG1lc3NhZ2VEZXN0aW5hdGlvblJlZik7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBBUkFNX1ZBTFVFOiB7CiAJCQkJUGFyYW1WYWx1ZSBwYXJhbVZhbHVlID0gKFBhcmFtVmFsdWUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBhcmFtVmFsdWUocGFyYW1WYWx1ZSk7CisJCQkJVCByZXN1bHQgPSBjYXNlUGFyYW1WYWx1ZShwYXJhbVZhbHVlKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUY6IHsKIAkJCQlQZXJzaXN0ZW5jZUNvbnRleHRSZWYgcGVyc2lzdGVuY2VDb250ZXh0UmVmID0gKFBlcnNpc3RlbmNlQ29udGV4dFJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUGVyc2lzdGVuY2VDb250ZXh0UmVmKHBlcnNpc3RlbmNlQ29udGV4dFJlZik7CisJCQkJVCByZXN1bHQgPSBjYXNlUGVyc2lzdGVuY2VDb250ZXh0UmVmKHBlcnNpc3RlbmNlQ29udGV4dFJlZik7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlBFUlNJU1RFTkNFX1VOSVRfUkVGOiB7CiAJCQkJUGVyc2lzdGVuY2VVbml0UmVmIHBlcnNpc3RlbmNlVW5pdFJlZiA9IChQZXJzaXN0ZW5jZVVuaXRSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVBlcnNpc3RlbmNlVW5pdFJlZihwZXJzaXN0ZW5jZVVuaXRSZWYpOworCQkJCVQgcmVzdWx0ID0gY2FzZVBlcnNpc3RlbmNlVW5pdFJlZihwZXJzaXN0ZW5jZVVuaXRSZWYpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUY6IHsKIAkJCQlQb3J0Q29tcG9uZW50UmVmIHBvcnRDb21wb25lbnRSZWYgPSAoUG9ydENvbXBvbmVudFJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUG9ydENvbXBvbmVudFJlZihwb3J0Q29tcG9uZW50UmVmKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VQb3J0Q29tcG9uZW50UmVmKHBvcnRDb21wb25lbnRSZWYpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5QUk9QRVJUWV9UWVBFOiB7CiAJCQkJUHJvcGVydHlUeXBlIHByb3BlcnR5VHlwZSA9IChQcm9wZXJ0eVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb3BlcnR5VHlwZShwcm9wZXJ0eVR5cGUpOworCQkJCVQgcmVzdWx0ID0gY2FzZVByb3BlcnR5VHlwZShwcm9wZXJ0eVR5cGUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGOiB7CiAJCQkJUmVzb3VyY2VFbnZSZWYgcmVzb3VyY2VFbnZSZWYgPSAoUmVzb3VyY2VFbnZSZWYpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlRW52UmVmKHJlc291cmNlRW52UmVmKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VSZXNvdXJjZUVudlJlZihyZXNvdXJjZUVudlJlZik7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJFU09VUkNFX1JFRjogewogCQkJCVJlc291cmNlUmVmIHJlc291cmNlUmVmID0gKFJlc291cmNlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZVJlZihyZXNvdXJjZVJlZik7CisJCQkJVCByZXN1bHQgPSBjYXNlUmVzb3VyY2VSZWYocmVzb3VyY2VSZWYpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNQRUNUX0JJTkRJTkdfVFlQRTogeworCQkJCVJlc3BlY3RCaW5kaW5nVHlwZSByZXNwZWN0QmluZGluZ1R5cGUgPSAoUmVzcGVjdEJpbmRpbmdUeXBlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUmVzcGVjdEJpbmRpbmdUeXBlKHJlc3BlY3RCaW5kaW5nVHlwZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJVTl9BUzogewogCQkJCVJ1bkFzIHJ1bkFzID0gKFJ1bkFzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSdW5BcyhydW5Bcyk7CisJCQkJVCByZXN1bHQgPSBjYXNlUnVuQXMocnVuQXMpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFOiB7CiAJCQkJU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZSA9IChTZWN1cml0eVJvbGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3VyaXR5Um9sZShzZWN1cml0eVJvbGUpOworCQkJCVQgcmVzdWx0ID0gY2FzZVNlY3VyaXR5Um9sZShzZWN1cml0eVJvbGUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRjogewogCQkJCVNlY3VyaXR5Um9sZVJlZiBzZWN1cml0eVJvbGVSZWYgPSAoU2VjdXJpdHlSb2xlUmVmKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZWN1cml0eVJvbGVSZWYoc2VjdXJpdHlSb2xlUmVmKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VTZWN1cml0eVJvbGVSZWYoc2VjdXJpdHlSb2xlUmVmKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUY6IHsKIAkJCQlTZXJ2aWNlUmVmIHNlcnZpY2VSZWYgPSAoU2VydmljZVJlZil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmljZVJlZihzZXJ2aWNlUmVmKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VTZXJ2aWNlUmVmKHNlcnZpY2VSZWYpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSOiB7CiAJCQkJU2VydmljZVJlZkhhbmRsZXIgc2VydmljZVJlZkhhbmRsZXIgPSAoU2VydmljZVJlZkhhbmRsZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZpY2VSZWZIYW5kbGVyKHNlcnZpY2VSZWZIYW5kbGVyKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VTZXJ2aWNlUmVmSGFuZGxlcihzZXJ2aWNlUmVmSGFuZGxlcik7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX0hBTkRMRVJfQ0hBSU46IHsKIAkJCQlTZXJ2aWNlUmVmSGFuZGxlckNoYWluIHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4gPSAoU2VydmljZVJlZkhhbmRsZXJDaGFpbil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlU2VydmljZVJlZkhhbmRsZXJDaGFpbihzZXJ2aWNlUmVmSGFuZGxlckNoYWluKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VTZXJ2aWNlUmVmSGFuZGxlckNoYWluKHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4pOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9IQU5ETEVSX0NIQUlOUzogewogCQkJCVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zID0gKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyhzZXJ2aWNlUmVmSGFuZGxlckNoYWlucyk7CisJCQkJVCByZXN1bHQgPSBjYXNlU2VydmljZVJlZkhhbmRsZXJDaGFpbnMoc2VydmljZVJlZkhhbmRsZXJDaGFpbnMpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFOiB7CiAJCQkJVXJsUGF0dGVyblR5cGUgdXJsUGF0dGVyblR5cGUgPSAoVXJsUGF0dGVyblR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVVybFBhdHRlcm5UeXBlKHVybFBhdHRlcm5UeXBlKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VVcmxQYXR0ZXJuVHlwZSh1cmxQYXR0ZXJuVHlwZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQpAQCAtMjYwLDQyMiArMjc4LDQ2NyBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZGRyZXNzaW5nIFR5cGU8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWRkcmVzc2luZyBUeXBlPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbihEZXNjcmlwdGlvbiBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlQWRkcmVzc2luZ1R5cGUoQWRkcmVzc2luZ1R5cGUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGF0YSBTb3VyY2UgVHlwZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNwbGF5IE5hbWU8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGF0YSBTb3VyY2UgVHlwZTwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlRGlzcGxheU5hbWUoRGlzcGxheU5hbWUgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZURhdGFTb3VyY2VUeXBlKERhdGFTb3VyY2VUeXBlIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWpiIExvY2FsIFJlZjwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FamIgTG9jYWwgUmVmPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFamJMb2NhbFJlZihFamJMb2NhbFJlZiBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlRGVzY3JpcHRpb24oRGVzY3JpcHRpb24gb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FamIgUmVmPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FamIgUmVmPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc3BsYXkgTmFtZTwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlRWpiUmVmKEVqYlJlZiBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlRGlzcGxheU5hbWUoRGlzcGxheU5hbWUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbXB0eSBUeXBlPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVqYiBMb2NhbCBSZWY8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW1wdHkgVHlwZTwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FamIgTG9jYWwgUmVmPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFbXB0eVR5cGUoRW1wdHlUeXBlIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VFamJMb2NhbFJlZihFamJMb2NhbFJlZiBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudiBFbnRyeTwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FamIgUmVmPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudiBFbnRyeTwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FamIgUmVmPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFbnZFbnRyeShFbnZFbnRyeSBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlRWpiUmVmKEVqYlJlZiBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkljb248L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW1wdHkgVHlwZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JY29uPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVtcHR5IFR5cGU8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUljb24oSWNvbiBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlRW1wdHlUeXBlKEVtcHR5VHlwZSBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluamVjdGlvbiBUYXJnZXQ8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW52IEVudHJ5PC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluamVjdGlvbiBUYXJnZXQ8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW52IEVudHJ5PC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJbmplY3Rpb25UYXJnZXQoSW5qZWN0aW9uVGFyZ2V0IG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VFbnZFbnRyeShFbnZFbnRyeSBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpZmVjeWNsZSBDYWxsYmFjazwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JY29uPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpZmVjeWNsZSBDYWxsYmFjazwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JY29uPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMaWZlY3ljbGVDYWxsYmFjayhMaWZlY3ljbGVDYWxsYmFjayBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlSWNvbihJY29uIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGlzdGVuZXI8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5qZWN0aW9uIFRhcmdldDwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaXN0ZW5lcjwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbmplY3Rpb24gVGFyZ2V0PC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMaXN0ZW5lcihMaXN0ZW5lciBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlSW5qZWN0aW9uVGFyZ2V0KEluamVjdGlvblRhcmdldCBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGlmZWN5Y2xlIENhbGxiYWNrPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRGVzdGluYXRpb24oTWVzc2FnZURlc3RpbmF0aW9uIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VMaWZlY3ljbGVDYWxsYmFjayhMaWZlY3ljbGVDYWxsYmFjayBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpc3RlbmVyPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpc3RlbmVyPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRGVzdGluYXRpb25SZWYoTWVzc2FnZURlc3RpbmF0aW9uUmVmIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VMaXN0ZW5lcihMaXN0ZW5lciBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhcmFtIFZhbHVlPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb248L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFyYW0gVmFsdWU8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbjwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlUGFyYW1WYWx1ZShQYXJhbVZhbHVlIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VNZXNzYWdlRGVzdGluYXRpb24oTWVzc2FnZURlc3RpbmF0aW9uIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWY8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVBlcnNpc3RlbmNlQ29udGV4dFJlZihQZXJzaXN0ZW5jZUNvbnRleHRSZWYgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZU1lc3NhZ2VEZXN0aW5hdGlvblJlZihNZXNzYWdlRGVzdGluYXRpb25SZWYgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYXJhbSBWYWx1ZTwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlUGVyc2lzdGVuY2VVbml0UmVmKFBlcnNpc3RlbmNlVW5pdFJlZiBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlUGFyYW1WYWx1ZShQYXJhbVZhbHVlIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9ydCBDb21wb25lbnQgUmVmPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvcnQgQ29tcG9uZW50IFJlZjwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZjwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlUG9ydENvbXBvbmVudFJlZihQb3J0Q29tcG9uZW50UmVmIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VQZXJzaXN0ZW5jZUNvbnRleHRSZWYoUGVyc2lzdGVuY2VDb250ZXh0UmVmIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHkgVHlwZTwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZjwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9wZXJ0eSBUeXBlPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9wZXJ0eVR5cGUoUHJvcGVydHlUeXBlIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VQZXJzaXN0ZW5jZVVuaXRSZWYoUGVyc2lzdGVuY2VVbml0UmVmIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb3J0IENvbXBvbmVudCBSZWY8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlRW52UmVmKFJlc291cmNlRW52UmVmIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VQb3J0Q29tcG9uZW50UmVmKFBvcnRDb21wb25lbnRSZWYgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHkgVHlwZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHkgVHlwZTwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VSZWYoUmVzb3VyY2VSZWYgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZVByb3BlcnR5VHlwZShQcm9wZXJ0eVR5cGUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SdW4gQXM8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SdW4gQXM8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgRW52IFJlZjwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlUnVuQXMoUnVuQXMgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZVJlc291cmNlRW52UmVmKFJlc291cmNlRW52UmVmIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBSZWY8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Um9sZShTZWN1cml0eVJvbGUgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZVJlc291cmNlUmVmKFJlc291cmNlUmVmIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzcGVjdCBCaW5kaW5nIFR5cGU8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzcGVjdCBCaW5kaW5nIFR5cGU8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Um9sZVJlZihTZWN1cml0eVJvbGVSZWYgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZVJlc3BlY3RCaW5kaW5nVHlwZShSZXNwZWN0QmluZGluZ1R5cGUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZjwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SdW4gQXM8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBSZWY8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UnVuIEFzPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmKFNlcnZpY2VSZWYgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZVJ1bkFzKFJ1bkFzIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlcjwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBSb2xlPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXI8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUm9sZTwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VydmljZVJlZkhhbmRsZXIoU2VydmljZVJlZkhhbmRsZXIgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZVNlY3VyaXR5Um9sZShTZWN1cml0eVJvbGUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IFJvbGUgUmVmPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW48L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oU2VydmljZVJlZkhhbmRsZXJDaGFpbiBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlU2VjdXJpdHlSb2xlUmVmKFNlY3VyaXR5Um9sZVJlZiBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW5zPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmIEhhbmRsZXIgQ2hhaW5zPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZpY2UgUmVmPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyhTZXJ2aWNlUmVmSGFuZGxlckNoYWlucyBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlU2VydmljZVJlZihTZXJ2aWNlUmVmIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXJsIFBhdHRlcm4gVHlwZTwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVybCBQYXR0ZXJuIFR5cGU8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlcjwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlVXJsUGF0dGVyblR5cGUoVXJsUGF0dGVyblR5cGUgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZVNlcnZpY2VSZWZIYW5kbGVyKFNlcnZpY2VSZWZIYW5kbGVyIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oU2VydmljZVJlZkhhbmRsZXJDaGFpbiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmljZSBSZWYgSGFuZGxlciBDaGFpbnM8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXJ2aWNlIFJlZiBIYW5kbGVyIENoYWluczwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VcmwgUGF0dGVybiBUeXBlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXJsIFBhdHRlcm4gVHlwZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVVybFBhdHRlcm5UeXBlKFVybFBhdHRlcm5UeXBlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwlwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlVmFsaWRhdG9yLmphdmEKaW5kZXggN2M0YmE5Ni4uMzM3MGJkZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlVmFsaWRhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9jb3JlL2ludGVybmFsL3V0aWwvSmF2YWVlVmFsaWRhdG9yLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpY0NoYWluOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CiAKQEAgLTk5LDE4ICsxMDAsMjQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewogCSAgcmV0dXJuIEphdmFlZVBhY2thZ2UuZUlOU1RBTkNFOwogCX0KIAogCS8qKgotCSAqIENhbGxzIDxjb2RlPnZhbGlkYXRlWFhYPC9jb2RlPiBmb3IgdGhlIGNvcnJlc29uZGluZyBjbGFzc2lmaWVyIG9mIHRoZSBtb2RlbC4KKwkgKiBDYWxscyA8Y29kZT52YWxpZGF0ZVhYWDwvY29kZT4gZm9yIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzaWZpZXIgb2YgdGhlIG1vZGVsLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKGludCBjbGFzc2lmaWVySUQsIE9iamVjdCB2YWx1ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKGludCBjbGFzc2lmaWVySUQsIE9iamVjdCB2YWx1ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5BRERSRVNTSU5HX1RZUEU6CisJCQkJcmV0dXJuIHZhbGlkYXRlQWRkcmVzc2luZ1R5cGUoKEFkZHJlc3NpbmdUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuREFUQV9TT1VSQ0VfVFlQRToKKwkJCQlyZXR1cm4gdmFsaWRhdGVEYXRhU291cmNlVHlwZSgoRGF0YVNvdXJjZVR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5ERVNDUklQVElPTjoKIAkJCQlyZXR1cm4gdmFsaWRhdGVEZXNjcmlwdGlvbigoRGVzY3JpcHRpb24pdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5ESVNQTEFZX05BTUU6CkBAIC0xNDksNiArMTU2LDggQEAKIAkJCQlyZXR1cm4gdmFsaWRhdGVSZXNvdXJjZUVudlJlZigoUmVzb3VyY2VFbnZSZWYpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNPVVJDRV9SRUY6CiAJCQkJcmV0dXJuIHZhbGlkYXRlUmVzb3VyY2VSZWYoKFJlc291cmNlUmVmKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTUEVDVF9CSU5ESU5HX1RZUEU6CisJCQkJcmV0dXJuIHZhbGlkYXRlUmVzcGVjdEJpbmRpbmdUeXBlKChSZXNwZWN0QmluZGluZ1R5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SVU5fQVM6CiAJCQkJcmV0dXJuIHZhbGlkYXRlUnVuQXMoKFJ1bkFzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuU0VDVVJJVFlfUk9MRToKQEAgLTE2NSwxMCArMTc0LDE0IEBACiAJCQkJcmV0dXJuIHZhbGlkYXRlU2VydmljZVJlZkhhbmRsZXJDaGFpbnMoKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRToKIAkJCQlyZXR1cm4gdmFsaWRhdGVVcmxQYXR0ZXJuVHlwZSgoVXJsUGF0dGVyblR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5BRERSRVNTSU5HX1JFU1BPTlNFU19UWVBFOgorCQkJCXJldHVybiB2YWxpZGF0ZUFkZHJlc3NpbmdSZXNwb25zZXNUeXBlKChBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9SRUZfVFlQRToKIAkJCQlyZXR1cm4gdmFsaWRhdGVFamJSZWZUeXBlKChFamJSZWZUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRW52RW50cnlUeXBlKChFbnZFbnRyeVR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5HRU5FUklDX0JPT0xFQU5fVFlQRToKKwkJCQlyZXR1cm4gdmFsaWRhdGVHZW5lcmljQm9vbGVhblR5cGUoKEdlbmVyaWNCb29sZWFuVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLklTT0xBVElPTl9MRVZFTF9UWVBFOgorCQkJCXJldHVybiB2YWxpZGF0ZUlzb2xhdGlvbkxldmVsVHlwZSgoSXNvbGF0aW9uTGV2ZWxUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9VU0FHRV9UWVBFOgogCQkJCXJldHVybiB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgoTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFOgpAQCAtMTc3LDYgKzE5MCw4IEBACiAJCQkJcmV0dXJuIHZhbGlkYXRlUmVzQXV0aFR5cGUoKFJlc0F1dGhUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUkVTX1NIQVJJTkdfU0NPUEVfVFlQRToKIAkJCQlyZXR1cm4gdmFsaWRhdGVSZXNTaGFyaW5nU2NvcGVUeXBlKChSZXNTaGFyaW5nU2NvcGVUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuQUREUkVTU0lOR19SRVNQT05TRVNfVFlQRV9PQkpFQ1Q6CisJCQkJcmV0dXJuIHZhbGlkYXRlQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGVPYmplY3QoKEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuREVXRVlfVkVSU0lPTl9UWVBFOgogCQkJCXJldHVybiB2YWxpZGF0ZURld2V5VmVyc2lvblR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkVKQl9MSU5LOgpAQCAtMTg1LDE2ICsyMDAsMjIgQEAKIAkJCQlyZXR1cm4gdmFsaWRhdGVFamJSZWZOYW1lVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuRUpCX1JFRl9UWVBFX09CSkVDVDoKIAkJCQlyZXR1cm4gdmFsaWRhdGVFamJSZWZUeXBlT2JqZWN0KChFamJSZWZUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX1RZUEVfT0JKRUNUOgotCQkJCXJldHVybiB2YWxpZGF0ZUVudkVudHJ5VHlwZU9iamVjdCgoRW52RW50cnlUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuRU5WX0VOVFJZX1RZUEU6CisJCQkJcmV0dXJuIHZhbGlkYXRlRW52RW50cnlUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5GVUxMWV9RVUFMSUZJRURfQ0xBU1NfVFlQRToKIAkJCQlyZXR1cm4gdmFsaWRhdGVGdWxseVF1YWxpZmllZENsYXNzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuR0VORVJJQ19CT09MRUFOX1RZUEVfT0JKRUNUOgorCQkJCXJldHVybiB2YWxpZGF0ZUdlbmVyaWNCb29sZWFuVHlwZU9iamVjdCgoR2VuZXJpY0Jvb2xlYW5UeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuSE9NRToKIAkJCQlyZXR1cm4gdmFsaWRhdGVIb21lKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5JU09MQVRJT05fTEVWRUxfVFlQRV9PQkpFQ1Q6CisJCQkJcmV0dXJuIHZhbGlkYXRlSXNvbGF0aW9uTGV2ZWxUeXBlT2JqZWN0KChJc29sYXRpb25MZXZlbFR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5KQVZBX0lERU5USUZJRVI6CiAJCQkJcmV0dXJuIHZhbGlkYXRlSmF2YUlkZW50aWZpZXIoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLkpBVkFfVFlQRToKIAkJCQlyZXR1cm4gdmFsaWRhdGVKYXZhVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuSkRCQ19VUkxfVFlQRToKKwkJCQlyZXR1cm4gdmFsaWRhdGVKZGJjVXJsVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuSk5ESV9OQU1FOgogCQkJCXJldHVybiB2YWxpZGF0ZUpORElOYW1lKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5MT0NBTDoKQEAgLTIxMSw2ICsyMzIsMTQgQEAKIAkJCQlyZXR1cm4gdmFsaWRhdGVQYXRoVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFX09CSkVDVDoKIAkJCQlyZXR1cm4gdmFsaWRhdGVQZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0KChQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuUFJPVE9DT0xfQklORElOR19MSVNUX1RZUEU6CisJCQkJcmV0dXJuIHZhbGlkYXRlUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGUoKExpc3Q8Pz4pdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwkJCWNhc2UgSmF2YWVlUGFja2FnZS5QUk9UT0NPTF9CSU5ESU5HX1RZUEU6CisJCQkJcmV0dXJuIHZhbGlkYXRlUHJvdG9jb2xCaW5kaW5nVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJCQljYXNlIEphdmFlZVBhY2thZ2UuUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEU6CisJCQkJcmV0dXJuIHZhbGlkYXRlUHJvdG9jb2xVUklBbGlhc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOworCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlFOQU1FX1BBVFRFUk46CisJCQkJcmV0dXJuIHZhbGlkYXRlUW5hbWVQYXR0ZXJuKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRU1PVEU6CiAJCQkJcmV0dXJuIHZhbGlkYXRlUmVtb3RlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5SRVNfQVVUSF9UWVBFX09CSkVDVDoKQEAgLTIxOSwxOSArMjQ4LDExIEBACiAJCQkJcmV0dXJuIHZhbGlkYXRlUmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdCgoUmVzU2hhcmluZ1Njb3BlVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlJPTEVfTkFNRToKIAkJCQlyZXR1cm4gdmFsaWRhdGVSb2xlTmFtZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19MSVNUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlKChMaXN0KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIEphdmFlZVBhY2thZ2UuU0VSVklDRV9SRUZfUFJPVE9DT0xfQklORElOR19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgSmF2YWVlUGFja2FnZS5TRVJWSUNFX1JFRl9QUk9UT0NPTF9VUklfQUxJQVNfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBKYXZhZWVQYWNrYWdlLlNFUlZJQ0VfUkVGX1FOQU1FX1BBVFRFUk46Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU2VydmljZVJlZlFuYW1lUGF0dGVybigoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIEphdmFlZVBhY2thZ2UuVFJVRV9GQUxTRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVRydWVGYWxzZVR5cGUoKChCb29sZWFuKXZhbHVlKS5ib29sZWFuVmFsdWUoKSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOworCQkJCXJldHVybiB2YWxpZGF0ZVRydWVGYWxzZVR5cGUoKEJvb2xlYW4pdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgSmF2YWVlUGFja2FnZS5UUlVFX0ZBTFNFX1RZUEVfT0JKRUNUOgogCQkJCXJldHVybiB2YWxpZGF0ZVRydWVGYWxzZVR5cGVPYmplY3QoKEJvb2xlYW4pdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWRlZmF1bHQ6IAorCQkJZGVmYXVsdDoKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCX0KQEAgLTI0MSw3ICsyNjIsMjUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZXNjcmlwdGlvbihEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWRkcmVzc2luZ1R5cGUoQWRkcmVzc2luZ1R5cGUgYWRkcmVzc2luZ1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CisJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWFkZHJlc3NpbmdUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEYXRhU291cmNlVHlwZShEYXRhU291cmNlVHlwZSBkYXRhU291cmNlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpZGF0YVNvdXJjZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlc2NyaXB0aW9uKERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClkZXNjcmlwdGlvbiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtMjUwLDcgKzI4OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGlzcGxheU5hbWUoRGlzcGxheU5hbWUgZGlzcGxheU5hbWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURpc3BsYXlOYW1lKERpc3BsYXlOYW1lIGRpc3BsYXlOYW1lLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClkaXNwbGF5TmFtZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtMjU5LDcgKzI5OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWpiTG9jYWxSZWYoRWpiTG9jYWxSZWYgZWpiTG9jYWxSZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVqYkxvY2FsUmVmKEVqYkxvY2FsUmVmIGVqYkxvY2FsUmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCllamJMb2NhbFJlZiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtMjY4LDcgKzMwNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWpiUmVmKEVqYlJlZiBlamJSZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVqYlJlZihFamJSZWYgZWpiUmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCllamJSZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTI3Nyw3ICszMTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVtcHR5VHlwZShFbXB0eVR5cGUgZW1wdHlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFbXB0eVR5cGUoRW1wdHlUeXBlIGVtcHR5VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpZW1wdHlUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0yODYsNyArMzI1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFbnZFbnRyeShFbnZFbnRyeSBlbnZFbnRyeSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW52RW50cnkoRW52RW50cnkgZW52RW50cnksIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWVudkVudHJ5LCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0yOTUsNyArMzM0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVJY29uKEljb24gaWNvbiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSWNvbihJY29uIGljb24sIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWljb24sIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTMwNCw3ICszNDMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUluamVjdGlvblRhcmdldChJbmplY3Rpb25UYXJnZXQgaW5qZWN0aW9uVGFyZ2V0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVJbmplY3Rpb25UYXJnZXQoSW5qZWN0aW9uVGFyZ2V0IGluamVjdGlvblRhcmdldCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpaW5qZWN0aW9uVGFyZ2V0LCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0zMTMsNyArMzUyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMaWZlY3ljbGVDYWxsYmFjayhMaWZlY3ljbGVDYWxsYmFjayBsaWZlY3ljbGVDYWxsYmFjaywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGlmZWN5Y2xlQ2FsbGJhY2soTGlmZWN5Y2xlQ2FsbGJhY2sgbGlmZWN5Y2xlQ2FsbGJhY2ssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWxpZmVjeWNsZUNhbGxiYWNrLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0zMjIsNyArMzYxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lciwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWxpc3RlbmVyLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0zMzEsNyArMzcwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNZXNzYWdlRGVzdGluYXRpb24oTWVzc2FnZURlc3RpbmF0aW9uIG1lc3NhZ2VEZXN0aW5hdGlvbiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uKE1lc3NhZ2VEZXN0aW5hdGlvbiBtZXNzYWdlRGVzdGluYXRpb24sIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KW1lc3NhZ2VEZXN0aW5hdGlvbiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtMzQwLDcgKzM3OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBtZXNzYWdlRGVzdGluYXRpb25SZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZihNZXNzYWdlRGVzdGluYXRpb25SZWYgbWVzc2FnZURlc3RpbmF0aW9uUmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCltZXNzYWdlRGVzdGluYXRpb25SZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTM0OSw3ICszODgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhcmFtVmFsdWUoUGFyYW1WYWx1ZSBwYXJhbVZhbHVlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQYXJhbVZhbHVlKFBhcmFtVmFsdWUgcGFyYW1WYWx1ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpcGFyYW1WYWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtMzU4LDcgKzM5Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGVyc2lzdGVuY2VDb250ZXh0UmVmKFBlcnNpc3RlbmNlQ29udGV4dFJlZiBwZXJzaXN0ZW5jZUNvbnRleHRSZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBlcnNpc3RlbmNlQ29udGV4dFJlZihQZXJzaXN0ZW5jZUNvbnRleHRSZWYgcGVyc2lzdGVuY2VDb250ZXh0UmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClwZXJzaXN0ZW5jZUNvbnRleHRSZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTM2Nyw3ICs0MDYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBlcnNpc3RlbmNlVW5pdFJlZihQZXJzaXN0ZW5jZVVuaXRSZWYgcGVyc2lzdGVuY2VVbml0UmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQZXJzaXN0ZW5jZVVuaXRSZWYoUGVyc2lzdGVuY2VVbml0UmVmIHBlcnNpc3RlbmNlVW5pdFJlZiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpcGVyc2lzdGVuY2VVbml0UmVmLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0zNzYsNyArNDE1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQb3J0Q29tcG9uZW50UmVmKFBvcnRDb21wb25lbnRSZWYgcG9ydENvbXBvbmVudFJlZiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUG9ydENvbXBvbmVudFJlZihQb3J0Q29tcG9uZW50UmVmIHBvcnRDb21wb25lbnRSZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXBvcnRDb21wb25lbnRSZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTM4NSw3ICs0MjQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVByb3BlcnR5VHlwZShQcm9wZXJ0eVR5cGUgcHJvcGVydHlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQcm9wZXJ0eVR5cGUoUHJvcGVydHlUeXBlIHByb3BlcnR5VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpcHJvcGVydHlUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0zOTQsNyArNDMzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNvdXJjZUVudlJlZihSZXNvdXJjZUVudlJlZiByZXNvdXJjZUVudlJlZiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2VFbnZSZWYoUmVzb3VyY2VFbnZSZWYgcmVzb3VyY2VFbnZSZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXJlc291cmNlRW52UmVmLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC00MDMsNyArNDQyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNvdXJjZVJlZihSZXNvdXJjZVJlZiByZXNvdXJjZVJlZiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2VSZWYoUmVzb3VyY2VSZWYgcmVzb3VyY2VSZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXJlc291cmNlUmVmLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC00MTIsNyArNDUxLDE2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUnVuQXMoUnVuQXMgcnVuQXMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc3BlY3RCaW5kaW5nVHlwZShSZXNwZWN0QmluZGluZ1R5cGUgcmVzcGVjdEJpbmRpbmdUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClyZXNwZWN0QmluZGluZ1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJ1bkFzKFJ1bkFzIHJ1bkFzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClydW5BcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtNDIxLDcgKzQ2OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VjdXJpdHlSb2xlKFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlY3VyaXR5Um9sZShTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClzZWN1cml0eVJvbGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTQzMCw3ICs0NzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlY3VyaXR5Um9sZVJlZihTZWN1cml0eVJvbGVSZWYgc2VjdXJpdHlSb2xlUmVmLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZWN1cml0eVJvbGVSZWYoU2VjdXJpdHlSb2xlUmVmIHNlY3VyaXR5Um9sZVJlZiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpc2VjdXJpdHlSb2xlUmVmLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC00MzksNyArNDg3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmKFNlcnZpY2VSZWYgc2VydmljZVJlZiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VydmljZVJlZihTZXJ2aWNlUmVmIHNlcnZpY2VSZWYsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXNlcnZpY2VSZWYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTQ0OCw3ICs0OTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZIYW5kbGVyKFNlcnZpY2VSZWZIYW5kbGVyIHNlcnZpY2VSZWZIYW5kbGVyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmSGFuZGxlcihTZXJ2aWNlUmVmSGFuZGxlciBzZXJ2aWNlUmVmSGFuZGxlciwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpc2VydmljZVJlZkhhbmRsZXIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTQ1Nyw3ICs1MDUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4oU2VydmljZVJlZkhhbmRsZXJDaGFpbiBzZXJ2aWNlUmVmSGFuZGxlckNoYWluLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmSGFuZGxlckNoYWluKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW4gc2VydmljZVJlZkhhbmRsZXJDaGFpbiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpc2VydmljZVJlZkhhbmRsZXJDaGFpbiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtNDY2LDcgKzUxNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VydmljZVJlZkhhbmRsZXJDaGFpbnMoU2VydmljZVJlZkhhbmRsZXJDaGFpbnMgc2VydmljZVJlZkhhbmRsZXJDaGFpbnMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zKFNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zIHNlcnZpY2VSZWZIYW5kbGVyQ2hhaW5zLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClzZXJ2aWNlUmVmSGFuZGxlckNoYWlucywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtNDc1LDcgKzUyMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVXJsUGF0dGVyblR5cGUoVXJsUGF0dGVyblR5cGUgdXJsUGF0dGVyblR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVVybFBhdHRlcm5UeXBlKFVybFBhdHRlcm5UeXBlIHVybFBhdHRlcm5UeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCl1cmxQYXR0ZXJuVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtNDg0LDcgKzUzMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWpiUmVmVHlwZShFamJSZWZUeXBlIGVqYlJlZlR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFkZHJlc3NpbmdSZXNwb25zZXNUeXBlKEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIGFkZHJlc3NpbmdSZXNwb25zZXNUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTQ5Myw3ICs1NDEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVudkVudHJ5VHlwZShFbnZFbnRyeVR5cGUgZW52RW50cnlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFamJSZWZUeXBlKEVqYlJlZlR5cGUgZWpiUmVmVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC01MDIsNyArNTUwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlR2VuZXJpY0Jvb2xlYW5UeXBlKEdlbmVyaWNCb29sZWFuVHlwZSBnZW5lcmljQm9vbGVhblR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtNTExLDcgKzU1OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGVyc2lzdGVuY2VDb250ZXh0VHlwZShQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIHBlcnNpc3RlbmNlQ29udGV4dFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUlzb2xhdGlvbkxldmVsVHlwZShJc29sYXRpb25MZXZlbFR5cGUgaXNvbGF0aW9uTGV2ZWxUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTUyMCw3ICs1NjgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc0F1dGhUeXBlKFJlc0F1dGhUeXBlIHJlc0F1dGhUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC01MjksNyArNTc3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNTaGFyaW5nU2NvcGVUeXBlKFJlc1NoYXJpbmdTY29wZVR5cGUgcmVzU2hhcmluZ1Njb3BlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGVyc2lzdGVuY2VDb250ZXh0VHlwZShQZXJzaXN0ZW5jZUNvbnRleHRUeXBlIHBlcnNpc3RlbmNlQ29udGV4dFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtNTM4LDcgKzU4NiwzNCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURld2V5VmVyc2lvblR5cGUoU3RyaW5nIGRld2V5VmVyc2lvblR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc0F1dGhUeXBlKFJlc0F1dGhUeXBlIHJlc0F1dGhUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc1NoYXJpbmdTY29wZVR5cGUoUmVzU2hhcmluZ1Njb3BlVHlwZSByZXNTaGFyaW5nU2NvcGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0KEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIGFkZHJlc3NpbmdSZXNwb25zZXNUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURld2V5VmVyc2lvblR5cGUoU3RyaW5nIGRld2V5VmVyc2lvblR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEZXdleVZlcnNpb25UeXBlX1BhdHRlcm4oZGV3ZXlWZXJzaW9uVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTU1Miw3ICs2MjcsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgIFBhdHRlcm5NYXRjaGVyIFtdW10gREVXRVlfVkVSU0lPTl9UWVBFX19QQVRURVJOX19WQUxVRVMgPQogCQluZXcgUGF0dGVybk1hdGNoZXIgW11bXSB7CiAJCQluZXcgUGF0dGVybk1hdGNoZXIgW10gewotCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCJcXC4/WzAtOV0rKFxcLlswLTldKykqIikKKwkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiXFwuP1swLTldKyhcXC5bMC05XSspKiIpIC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfTsKIApAQCAtNTYyLDcgKzYzNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGV3ZXlWZXJzaW9uVHlwZV9QYXR0ZXJuKFN0cmluZyBkZXdleVZlcnNpb25UeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZXdleVZlcnNpb25UeXBlX1BhdHRlcm4oU3RyaW5nIGRld2V5VmVyc2lvblR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZVBhdHRlcm4oSmF2YWVlUGFja2FnZS5MaXRlcmFscy5ERVdFWV9WRVJTSU9OX1RZUEUsIGRld2V5VmVyc2lvblR5cGUsIERFV0VZX1ZFUlNJT05fVFlQRV9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC01NzEsNyArNjQ2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFSkJMaW5rKFN0cmluZyBlamJMaW5rLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFSkJMaW5rKFN0cmluZyBlamJMaW5rLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTU4MCw3ICs2NTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVqYlJlZk5hbWVUeXBlKFN0cmluZyBlamJSZWZOYW1lVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWpiUmVmTmFtZVR5cGUoU3RyaW5nIGVqYlJlZk5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTU4OSw3ICs2NjQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVqYlJlZlR5cGVPYmplY3QoRWpiUmVmVHlwZSBlamJSZWZUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFamJSZWZUeXBlT2JqZWN0KEVqYlJlZlR5cGUgZWpiUmVmVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC01OTgsNyArNjczLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFbnZFbnRyeVR5cGVPYmplY3QoRW52RW50cnlUeXBlIGVudkVudHJ5VHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW52RW50cnlUeXBlKFN0cmluZyBlbnZFbnRyeVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtNjA3LDcgKzY4Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGdWxseVF1YWxpZmllZENsYXNzVHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtNjE2LDcgKzY5MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSG9tZShTdHJpbmcgaG9tZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlR2VuZXJpY0Jvb2xlYW5UeXBlT2JqZWN0KEdlbmVyaWNCb29sZWFuVHlwZSBnZW5lcmljQm9vbGVhblR5cGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtNjI1LDcgKzcwMCwyNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUphdmFJZGVudGlmaWVyKFN0cmluZyBqYXZhSWRlbnRpZmllciwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSG9tZShTdHJpbmcgaG9tZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVJc29sYXRpb25MZXZlbFR5cGVPYmplY3QoSXNvbGF0aW9uTGV2ZWxUeXBlIGlzb2xhdGlvbkxldmVsVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVKYXZhSWRlbnRpZmllcihTdHJpbmcgamF2YUlkZW50aWZpZXIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVKYXZhSWRlbnRpZmllcl9QYXR0ZXJuKGphdmFJZGVudGlmaWVyLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtNjM5LDcgKzczMiw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBKQVZBX0lERU5USUZJRVJfX1BBVFRFUk5fX1ZBTFVFUyA9CiAJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXVtdIHsKIAkJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXSB7Ci0JCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIigkfF98XFxwe0x9KShcXHB7TH18XFxwe05kfXxffCQpKiIpCisJCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIigkfF98XFxwe0x9KShcXHB7TH18XFxwe05kfXxffCQpKiIpIC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfTsKIApAQCAtNjQ5LDcgKzc0Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSmF2YUlkZW50aWZpZXJfUGF0dGVybihTdHJpbmcgamF2YUlkZW50aWZpZXIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUphdmFJZGVudGlmaWVyX1BhdHRlcm4oU3RyaW5nIGphdmFJZGVudGlmaWVyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuSkFWQV9JREVOVElGSUVSLCBqYXZhSWRlbnRpZmllciwgSkFWQV9JREVOVElGSUVSX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTY1OCw3ICs3NTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUphdmFUeXBlKFN0cmluZyBqYXZhVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSmF2YVR5cGUoU3RyaW5nIGphdmFUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSmF2YVR5cGVfUGF0dGVybihqYXZhVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTY3Miw3ICs3NjUsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgIFBhdHRlcm5NYXRjaGVyIFtdW10gSkFWQV9UWVBFX19QQVRURVJOX19WQUxVRVMgPQogCQluZXcgUGF0dGVybk1hdGNoZXIgW11bXSB7CiAJCQluZXcgUGF0dGVybk1hdGNoZXIgW10gewotCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCJbXlxccHtafV0qIikKKwkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiW15cXHB7Wn1dKiIpIC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfTsKIApAQCAtNjgyLDcgKzc3NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSmF2YVR5cGVfUGF0dGVybihTdHJpbmcgamF2YVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUphdmFUeXBlX1BhdHRlcm4oU3RyaW5nIGphdmFUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuSkFWQV9UWVBFLCBqYXZhVHlwZSwgSkFWQV9UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTY5MSwxMzUgKzc4NCwxMzIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVKTkRJTmFtZShTdHJpbmcgam5kaU5hbWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMb2NhbChTdHJpbmcgbG9jYWwsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMb2NhbEhvbWUoU3RyaW5nIGxvY2FsSG9tZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoU3RyaW5nIG1lc3NhZ2VEZXN0aW5hdGlvbkxpbmssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNZXNzYWdlRGVzdGluYXRpb25UeXBlVHlwZShTdHJpbmcgbWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVPYmplY3QoTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhdGhUeXBlKFN0cmluZyBwYXRoVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBlcnNpc3RlbmNlQ29udGV4dFR5cGVPYmplY3QoUGVyc2lzdGVuY2VDb250ZXh0VHlwZSBwZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmVtb3RlKFN0cmluZyByZW1vdGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNBdXRoVHlwZU9iamVjdChSZXNBdXRoVHlwZSByZXNBdXRoVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc1NoYXJpbmdTY29wZVR5cGVPYmplY3QoUmVzU2hhcmluZ1Njb3BlVHlwZSByZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUm9sZU5hbWUoU3RyaW5nIHJvbGVOYW1lLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlKExpc3Qgc2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVfSXRlbVR5cGUoc2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVKZGJjVXJsVHlwZShTdHJpbmcgamRiY1VybFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CisJCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVKZGJjVXJsVHlwZV9QYXR0ZXJuKGpkYmNVcmxUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCiAJLyoqCi0JICogVmFsaWRhdGVzIHRoZSBJdGVtVHlwZSBjb25zdHJhaW50IG9mICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgQmluZGluZyBMaXN0IFR5cGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQHNlZSAjdmFsaWRhdGVKZGJjVXJsVHlwZV9QYXR0ZXJuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBKREJDX1VSTF9UWVBFX19QQVRURVJOX19WQUxVRVMgPQorCQluZXcgUGF0dGVybk1hdGNoZXIgW11bXSB7CisJCQluZXcgUGF0dGVybk1hdGNoZXIgW10geworCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCJqZGJjOiguKik6KC4qKSIpIC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfTsKKworCS8qKgorCSAqIFZhbGlkYXRlcyB0aGUgUGF0dGVybiBjb25zdHJhaW50IG9mICc8ZW0+SmRiYyBVcmwgVHlwZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZV9JdGVtVHlwZShMaXN0IHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdMaXN0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSmRiY1VybFR5cGVfUGF0dGVybihTdHJpbmcgamRiY1VybFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CisJCXJldHVybiB2YWxpZGF0ZVBhdHRlcm4oSmF2YWVlUGFja2FnZS5MaXRlcmFscy5KREJDX1VSTF9UWVBFLCBqZGJjVXJsVHlwZSwgSkRCQ19VUkxfVFlQRV9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVKTkRJTmFtZShTdHJpbmcgam5kaU5hbWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTG9jYWwoU3RyaW5nIGxvY2FsLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvY2FsSG9tZShTdHJpbmcgbG9jYWxIb21lLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoU3RyaW5nIG1lc3NhZ2VEZXN0aW5hdGlvbkxpbmssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUoU3RyaW5nIG1lc3NhZ2VEZXN0aW5hdGlvblR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZU9iamVjdChNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgbWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBhdGhUeXBlKFN0cmluZyBwYXRoVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQZXJzaXN0ZW5jZUNvbnRleHRUeXBlT2JqZWN0KFBlcnNpc3RlbmNlQ29udGV4dFR5cGUgcGVyc2lzdGVuY2VDb250ZXh0VHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQcm90b2NvbEJpbmRpbmdMaXN0VHlwZShMaXN0PD8+IHByb3RvY29sQmluZGluZ0xpc3RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlUHJvdG9jb2xCaW5kaW5nTGlzdFR5cGVfSXRlbVR5cGUocHJvdG9jb2xCaW5kaW5nTGlzdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBWYWxpZGF0ZXMgdGhlIEl0ZW1UeXBlIGNvbnN0cmFpbnQgb2YgJzxlbT5Qcm90b2NvbCBCaW5kaW5nIExpc3QgVHlwZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVByb3RvY29sQmluZGluZ0xpc3RUeXBlX0l0ZW1UeXBlKExpc3Q8Pz4gcHJvdG9jb2xCaW5kaW5nTGlzdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJZm9yIChJdGVyYXRvciBpID0gc2VydmljZVJlZlByb3RvY29sQmluZGluZ0xpc3RUeXBlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpICYmIChyZXN1bHQgfHwgZGlhZ25vc3RpY3MgIT0gbnVsbCk7ICkgeworCQlmb3IgKEl0ZXJhdG9yPD8+IGkgPSBwcm90b2NvbEJpbmRpbmdMaXN0VHlwZS5pdGVyYXRvcigpOyBpLmhhc05leHQoKSAmJiAocmVzdWx0IHx8IGRpYWdub3N0aWNzICE9IG51bGwpOyApIHsKIAkJCU9iamVjdCBpdGVtID0gaS5uZXh0KCk7Ci0JCQlpZiAoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX1JFRl9QUk9UT0NPTF9CSU5ESU5HX1RZUEUuaXNJbnN0YW5jZShpdGVtKSkgewotCQkJCXJlc3VsdCAmPSB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlKChTdHJpbmcpaXRlbSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOworCQkJaWYgKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUFJPVE9DT0xfQklORElOR19UWVBFLmlzSW5zdGFuY2UoaXRlbSkpIHsKKwkJCQlyZXN1bHQgJj0gdmFsaWRhdGVQcm90b2NvbEJpbmRpbmdUeXBlKChTdHJpbmcpaXRlbSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQkJfQogCQkJZWxzZSB7CiAJCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJcmVwb3J0RGF0YVZhbHVlVHlwZVZpb2xhdGlvbihKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX1BST1RPQ09MX0JJTkRJTkdfVFlQRSwgaXRlbSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOworCQkJCXJlcG9ydERhdGFWYWx1ZVR5cGVWaW9sYXRpb24oSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QUk9UT0NPTF9CSU5ESU5HX1RZUEUsIGl0ZW0sIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gcmVzdWx0OwpAQCAtODMwLDM3ICs5MjAsMzYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZShTdHJpbmcgc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlX01lbWJlclR5cGVzKHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQcm90b2NvbEJpbmRpbmdUeXBlKFN0cmluZyBwcm90b2NvbEJpbmRpbmdUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlUHJvdG9jb2xCaW5kaW5nVHlwZV9NZW1iZXJUeXBlcyhwcm90b2NvbEJpbmRpbmdUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCiAJLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNZW1iZXJUeXBlcyBjb25zdHJhaW50IG9mICc8ZW0+U2VydmljZSBSZWYgUHJvdG9jb2wgQmluZGluZyBUeXBlPC9lbT4nLgorCSAqIFZhbGlkYXRlcyB0aGUgTWVtYmVyVHlwZXMgY29uc3RyYWludCBvZiAnPGVtPlByb3RvY29sIEJpbmRpbmcgVHlwZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlX01lbWJlclR5cGVzKFN0cmluZyBzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUHJvdG9jb2xCaW5kaW5nVHlwZV9NZW1iZXJUeXBlcyhTdHJpbmcgcHJvdG9jb2xCaW5kaW5nVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJaWYgKGRpYWdub3N0aWNzICE9IG51bGwpIHsKIAkJCUJhc2ljRGlhZ25vc3RpYyB0ZW1wRGlhZ25vc3RpY3MgPSBuZXcgQmFzaWNEaWFnbm9zdGljKCk7Ci0JCQlpZiAoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQU5ZX1VSSS5pc0luc3RhbmNlKHNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlKSkgewotCQkJCWlmICh4bWxUeXBlVmFsaWRhdG9yLnZhbGlkYXRlQW55VVJJKChTdHJpbmcpc2VydmljZVJlZlByb3RvY29sQmluZGluZ1R5cGUsIHRlbXBEaWFnbm9zdGljcywgY29udGV4dCkpIHJldHVybiB0cnVlOworCQkJaWYgKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLkFOWV9VUkkuaXNJbnN0YW5jZShwcm90b2NvbEJpbmRpbmdUeXBlKSkgeworCQkJCWlmICh4bWxUeXBlVmFsaWRhdG9yLnZhbGlkYXRlQW55VVJJKHByb3RvY29sQmluZGluZ1R5cGUsIHRlbXBEaWFnbm9zdGljcywgY29udGV4dCkpIHJldHVybiB0cnVlOwogCQkJfQotCQkJaWYgKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUuaXNJbnN0YW5jZShzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSkpIHsKLQkJCQlpZiAodmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUoKFN0cmluZylzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSwgdGVtcERpYWdub3N0aWNzLCBjb250ZXh0KSkgcmV0dXJuIHRydWU7CisJCQlpZiAoSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QUk9UT0NPTF9VUklfQUxJQVNfVFlQRS5pc0luc3RhbmNlKHByb3RvY29sQmluZGluZ1R5cGUpKSB7CisJCQkJaWYgKHZhbGlkYXRlUHJvdG9jb2xVUklBbGlhc1R5cGUocHJvdG9jb2xCaW5kaW5nVHlwZSwgdGVtcERpYWdub3N0aWNzLCBjb250ZXh0KSkgcmV0dXJuIHRydWU7CiAJCQl9Ci0JCQlMaXN0IGNoaWxkcmVuID0gdGVtcERpYWdub3N0aWNzLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQkJZGlhZ25vc3RpY3MuYWRkKChEaWFnbm9zdGljKWNoaWxkcmVuLmdldChpKSk7CisJCQlmb3IgKERpYWdub3N0aWMgZGlhZ25vc3RpYyA6IHRlbXBEaWFnbm9zdGljcy5nZXRDaGlsZHJlbigpKSB7CisJCQkJZGlhZ25vc3RpY3MuYWRkKGRpYWdub3N0aWMpOwogCQkJfQogCQl9CiAJCWVsc2UgewotCQkJaWYgKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLkFOWV9VUkkuaXNJbnN0YW5jZShzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSkpIHsKLQkJCQlpZiAoeG1sVHlwZVZhbGlkYXRvci52YWxpZGF0ZUFueVVSSSgoU3RyaW5nKXNlcnZpY2VSZWZQcm90b2NvbEJpbmRpbmdUeXBlLCBudWxsLCBjb250ZXh0KSkgcmV0dXJuIHRydWU7CisJCQlpZiAoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuQU5ZX1VSSS5pc0luc3RhbmNlKHByb3RvY29sQmluZGluZ1R5cGUpKSB7CisJCQkJaWYgKHhtbFR5cGVWYWxpZGF0b3IudmFsaWRhdGVBbnlVUkkocHJvdG9jb2xCaW5kaW5nVHlwZSwgbnVsbCwgY29udGV4dCkpIHJldHVybiB0cnVlOwogCQkJfQotCQkJaWYgKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUuaXNJbnN0YW5jZShzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSkpIHsKLQkJCQlpZiAodmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUoKFN0cmluZylzZXJ2aWNlUmVmUHJvdG9jb2xCaW5kaW5nVHlwZSwgbnVsbCwgY29udGV4dCkpIHJldHVybiB0cnVlOworCQkJaWYgKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUuaXNJbnN0YW5jZShwcm90b2NvbEJpbmRpbmdUeXBlKSkgeworCQkJCWlmICh2YWxpZGF0ZVByb3RvY29sVVJJQWxpYXNUeXBlKHByb3RvY29sQmluZGluZ1R5cGUsIG51bGwsIGNvbnRleHQpKSByZXR1cm4gdHJ1ZTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gZmFsc2U7CkBAIC04NzEsOCArOTYwLDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmUHJvdG9jb2xVUklBbGlhc1R5cGUoU3RyaW5nIHNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlX1BhdHRlcm4oc2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQcm90b2NvbFVSSUFsaWFzVHlwZShTdHJpbmcgcHJvdG9jb2xVUklBbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CisJCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVQcm90b2NvbFVSSUFsaWFzVHlwZV9QYXR0ZXJuKHByb3RvY29sVVJJQWxpYXNUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC04ODAsMjMgKzk2OSwyMyBAQAogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlX1BhdHRlcm4KKwkgKiBAc2VlICN2YWxpZGF0ZVByb3RvY29sVVJJQWxpYXNUeXBlX1BhdHRlcm4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsICBQYXR0ZXJuTWF0Y2hlciBbXVtdIFNFUlZJQ0VfUkVGX1BST1RPQ09MX1VSSV9BTElBU19UWVBFX19QQVRURVJOX19WQUxVRVMgPQorCXB1YmxpYyBzdGF0aWMgZmluYWwgIFBhdHRlcm5NYXRjaGVyIFtdW10gUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUyA9CiAJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXVtdIHsKIAkJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXSB7Ci0JCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIiMjLisiKQorCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCIjIy4rIikgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9OwogCiAJLyoqCi0JICogVmFsaWRhdGVzIHRoZSBQYXR0ZXJuIGNvbnN0cmFpbnQgb2YgJzxlbT5TZXJ2aWNlIFJlZiBQcm90b2NvbCBVUkkgQWxpYXMgVHlwZTwvZW0+Jy4KKwkgKiBWYWxpZGF0ZXMgdGhlIFBhdHRlcm4gY29uc3RyYWludCBvZiAnPGVtPlByb3RvY29sIFVSSSBBbGlhcyBUeXBlPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VydmljZVJlZlByb3RvY29sVVJJQWxpYXNUeXBlX1BhdHRlcm4oU3RyaW5nIHNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEUsIHNlcnZpY2VSZWZQcm90b2NvbFVSSUFsaWFzVHlwZSwgU0VSVklDRV9SRUZfUFJPVE9DT0xfVVJJX0FMSUFTX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUHJvdG9jb2xVUklBbGlhc1R5cGVfUGF0dGVybihTdHJpbmcgcHJvdG9jb2xVUklBbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CisJCXJldHVybiB2YWxpZGF0ZVBhdHRlcm4oSmF2YWVlUGFja2FnZS5MaXRlcmFscy5QUk9UT0NPTF9VUklfQUxJQVNfVFlQRSwgcHJvdG9jb2xVUklBbGlhc1R5cGUsIFBST1RPQ09MX1VSSV9BTElBU19UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKIAkvKioKQEAgLTkwNCw4ICs5OTMsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZpY2VSZWZRbmFtZVBhdHRlcm4oU3RyaW5nIHNlcnZpY2VSZWZRbmFtZVBhdHRlcm4sIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVNlcnZpY2VSZWZRbmFtZVBhdHRlcm5fUGF0dGVybihzZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVRbmFtZVBhdHRlcm4oU3RyaW5nIHFuYW1lUGF0dGVybiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVFuYW1lUGF0dGVybl9QYXR0ZXJuKHFuYW1lUGF0dGVybiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtOTEzLDIzICsxMDAyLDIzIEBACiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuX1BhdHRlcm4KKwkgKiBAc2VlICN2YWxpZGF0ZVFuYW1lUGF0dGVybl9QYXR0ZXJuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBTRVJWSUNFX1JFRl9RTkFNRV9QQVRURVJOX19QQVRURVJOX19WQUxVRVMgPQorCXB1YmxpYyBzdGF0aWMgZmluYWwgIFBhdHRlcm5NYXRjaGVyIFtdW10gUU5BTUVfUEFUVEVSTl9fUEFUVEVSTl9fVkFMVUVTID0KIAkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdW10gewogCQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdIHsKLQkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiXFwqfChbXFxpLVs6XV1bXFxjLVs6XV0qOik/W1xcaS1bOl1dW1xcYy1bOl1dKlxcKj8iKQorCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCJcXCp8KFtcXGktWzpdXVtcXGMtWzpdXSo6KT9bXFxpLVs6XV1bXFxjLVs6XV0qXFwqPyIpIC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfTsKIAogCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgUGF0dGVybiBjb25zdHJhaW50IG9mICc8ZW0+U2VydmljZSBSZWYgUW5hbWUgUGF0dGVybjwvZW0+Jy4KKwkgKiBWYWxpZGF0ZXMgdGhlIFBhdHRlcm4gY29uc3RyYWludCBvZiAnPGVtPlFuYW1lIFBhdHRlcm48L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2aWNlUmVmUW5hbWVQYXR0ZXJuX1BhdHRlcm4oU3RyaW5nIHNlcnZpY2VSZWZRbmFtZVBhdHRlcm4sIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlUGF0dGVybihKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfUkVGX1FOQU1FX1BBVFRFUk4sIHNlcnZpY2VSZWZRbmFtZVBhdHRlcm4sIFNFUlZJQ0VfUkVGX1FOQU1FX1BBVFRFUk5fX1BBVFRFUk5fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUW5hbWVQYXR0ZXJuX1BhdHRlcm4oU3RyaW5nIHFuYW1lUGF0dGVybiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHZhbGlkYXRlUGF0dGVybihKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLlFOQU1FX1BBVFRFUk4sIHFuYW1lUGF0dGVybiwgUU5BTUVfUEFUVEVSTl9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCiAJLyoqCkBAIC05MzcsNyArMTAyNiw0MyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRydWVGYWxzZVR5cGUoYm9vbGVhbiB0cnVlRmFsc2VUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZW1vdGUoU3RyaW5nIHJlbW90ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNBdXRoVHlwZU9iamVjdChSZXNBdXRoVHlwZSByZXNBdXRoVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSZXNTaGFyaW5nU2NvcGVUeXBlT2JqZWN0KFJlc1NoYXJpbmdTY29wZVR5cGUgcmVzU2hhcmluZ1Njb3BlVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSb2xlTmFtZShTdHJpbmcgcm9sZU5hbWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CisJCXJldHVybiB0cnVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHJ1ZUZhbHNlVHlwZShib29sZWFuIHRydWVGYWxzZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUcnVlRmFsc2VUeXBlX1BhdHRlcm4odHJ1ZUZhbHNlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTk1MSw3ICsxMDc2LDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsICBQYXR0ZXJuTWF0Y2hlciBbXVtdIFRSVUVfRkFMU0VfVFlQRV9fUEFUVEVSTl9fVkFMVUVTID0KIAkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdW10gewogCQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdIHsKLQkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiKHRydWV8ZmFsc2UpIikKKwkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiKHRydWV8ZmFsc2UpIikgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9OwogCkBAIC05NjEsOCArMTA4Niw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHJ1ZUZhbHNlVHlwZV9QYXR0ZXJuKGJvb2xlYW4gdHJ1ZUZhbHNlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKEphdmFlZVBhY2thZ2UuTGl0ZXJhbHMuVFJVRV9GQUxTRV9UWVBFLCBuZXcgQm9vbGVhbih0cnVlRmFsc2VUeXBlKSwgVFJVRV9GQUxTRV9UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRydWVGYWxzZVR5cGVfUGF0dGVybihib29sZWFuIHRydWVGYWxzZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CisJCXJldHVybiB2YWxpZGF0ZVBhdHRlcm4oSmF2YWVlUGFja2FnZS5MaXRlcmFscy5UUlVFX0ZBTFNFX1RZUEUsIHRydWVGYWxzZVR5cGUsIFRSVUVfRkFMU0VfVFlQRV9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCiAJLyoqCkBAIC05NzAsOSArMTA5NSwyMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRydWVGYWxzZVR5cGVPYmplY3QoQm9vbGVhbiB0cnVlRmFsc2VUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUcnVlRmFsc2VUeXBlX1BhdHRlcm4odHJ1ZUZhbHNlVHlwZU9iamVjdC5ib29sZWFuVmFsdWUoKSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHJ1ZUZhbHNlVHlwZU9iamVjdChCb29sZWFuIHRydWVGYWxzZVR5cGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CisJCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUcnVlRmFsc2VUeXBlX1BhdHRlcm4odHJ1ZUZhbHNlVHlwZU9iamVjdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGxvY2F0b3IgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZmV0Y2ggbWVzc2FnZXMgZm9yIHRoaXMgdmFsaWRhdG9yJ3MgZGlhZ25vc3RpY3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCS8vIFRPRE8KKwkJLy8gU3BlY2lhbGl6ZSB0aGlzIHRvIHJldHVybiBhIHJlc291cmNlIGxvY2F0b3IgZm9yIG1lc3NhZ2VzIHNwZWNpZmljIHRvIHRoaXMgdmFsaWRhdG9yLgorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VMb2NhdG9yKCk7CisJfQorCiB9IC8vSmF2YWVlVmFsaWRhdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2NvcmUvaW50ZXJuYWwvdXRpbC9KYXZhZWVYTUxQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVhNTFByb2Nlc3Nvci5qYXZhCmluZGV4IGNlODg3Y2EuLmE1ZWFkZTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVhNTFByb2Nlc3Nvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvY29yZS9pbnRlcm5hbC91dGlsL0phdmFlZVhNTFByb2Nlc3Nvci5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS51dGlsLlhNTFByb2Nlc3NvcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOwpAQCAtNDIsNyArNDMsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldFJlZ2lzdHJhdGlvbnMoKSB7CisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFJlc291cmNlLkZhY3Rvcnk+IGdldFJlZ2lzdHJhdGlvbnMoKSB7CiAJCWlmIChyZWdpc3RyYXRpb25zID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFJlZ2lzdHJhdGlvbnMoKTsKIAkJCXJlZ2lzdHJhdGlvbnMucHV0KFhNTF9FWFRFTlNJT04sIG5ldyBKYXZhZWVSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQWNjZXNzVGltZW91dFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FjY2Vzc1RpbWVvdXRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhYzY4YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FjY2Vzc1RpbWVvdXRUeXBlLmphdmEKQEAgLTAsMCArMSwxNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY2Nlc3MgVGltZW91dCBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgVGhlIGFjY2Vzcy10aW1lb3V0VHlwZSByZXByZXNlbnRzIHRoZSBtYXhpbXVtIGFtb3VudCBvZgorICogICAgICAgICB0aW1lIChpbiBhIGdpdmVuIHRpbWUgdW5pdCkgdGhhdCB0aGUgY29udGFpbmVyIHNob3VsZCB3YWl0IGZvcgorICogICAgICAgICBhIGNvbmN1cnJlbmN5IGxvY2sgYmVmb3JlIHRocm93aW5nIGEgdGltZW91dCBleGNlcHRpb24gdG8gdGhlCisgKiAgICAgICAgIGNsaWVudC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEEgdGltZW91dCB2YWx1ZSBvZiAwIG1lYW5zIGNvbmN1cnJlbnQgYWNjZXNzIGlzIG5vdCBwZXJtaXR0ZWQuCisgKiAgICAgICAgIAorICogICAgICAgICBBIHRpbWVvdXQgdmFsdWUgb2YgLTEgbWVhbnMgd2FpdCBpbmRlZmluaXRlbHkgdG8gYWNxdWlyZSBhIGxvY2suCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBFSkIgMy4xCisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY2Nlc3NUaW1lb3V0VHlwZSNnZXRUaW1lb3V0IDxlbT5UaW1lb3V0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY2Nlc3NUaW1lb3V0VHlwZSNnZXRVbml0IDxlbT5Vbml0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY2Nlc3NUaW1lb3V0VHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QWNjZXNzVGltZW91dFR5cGUoKQorICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQWNjZXNzVGltZW91dFR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRpbWVvdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRpbWVvdXQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZW91dDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VGltZW91dChCaWdJbnRlZ2VyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBY2Nlc3NUaW1lb3V0VHlwZV9UaW1lb3V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQmlnSW50ZWdlciBnZXRUaW1lb3V0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY2Nlc3NUaW1lb3V0VHlwZSNnZXRUaW1lb3V0IDxlbT5UaW1lb3V0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lb3V0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRUaW1lb3V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUaW1lb3V0KEJpZ0ludGVnZXIgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVVbml0VHlwZVR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vbml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVVbml0VHlwZVR5cGUKKwkgKiBAc2VlICNpc1NldFVuaXQoKQorCSAqIEBzZWUgI3Vuc2V0VW5pdCgpCisJICogQHNlZSAjc2V0VW5pdChUaW1lVW5pdFR5cGVUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBY2Nlc3NUaW1lb3V0VHlwZV9Vbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGltZVVuaXRUeXBlVHlwZSBnZXRVbml0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY2Nlc3NUaW1lb3V0VHlwZSNnZXRVbml0IDxlbT5Vbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Vbml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVVbml0VHlwZVR5cGUKKwkgKiBAc2VlICNpc1NldFVuaXQoKQorCSAqIEBzZWUgI3Vuc2V0VW5pdCgpCisJICogQHNlZSAjZ2V0VW5pdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VW5pdChUaW1lVW5pdFR5cGVUeXBlIHZhbHVlKTsKKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWNjZXNzVGltZW91dFR5cGUjZ2V0VW5pdCA8ZW0+VW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTZXRVbml0KCkKKwkgKiBAc2VlICNnZXRVbml0KCkKKwkgKiBAc2VlICNzZXRVbml0KFRpbWVVbml0VHlwZVR5cGUpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRVbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjY2Vzc1RpbWVvdXRUeXBlI2dldFVuaXQgPGVtPlVuaXQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldFVuaXQoKQorCSAqIEBzZWUgI2dldFVuaXQoKQorCSAqIEBzZWUgI3NldFVuaXQoVGltZVVuaXRUeXBlVHlwZSkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NldFVuaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SWQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBY2Nlc3NUaW1lb3V0VHlwZV9JZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRJZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWNjZXNzVGltZW91dFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gQWNjZXNzVGltZW91dFR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FjdGl2YXRpb25Db25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FjdGl2YXRpb25Db25maWcuamF2YQppbmRleCAzZDQ4NTAyLi5kNjMxNzQxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9BY3RpdmF0aW9uQ29uZmlnLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQWN0aXZhdGlvbkNvbmZpZy5qYXZhCkBAIC0xMiw2ICsxMiw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwogCiAvKioKQEAgLTIyLDE4ICsyMywxOSBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSBhY3RpdmF0aW9uLWNvbmZpZ1R5cGUgZGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAqIAlleHBlY3RlZCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgb2YgdGhlIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLSAqIAlpbiBpdHMgb3BlcmF0aW9uYWwgZW52aXJvbm1lbnQuIFRoaXMgbWF5IGluY2x1ZGUgaW5mb3JtYXRpb24KLSAqIAlhYm91dCBtZXNzYWdlIGFja25vd2xlZGdlbWVudCwgbWVzc2FnZSBzZWxlY3RvciwgZXhwZWN0ZWQKLSAqIAlkZXN0aW5hdGlvbiB0eXBlLCBldGMuCi0gKiAKLSAqIAlUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBleHByZXNzZWQgaW4gdGVybXMgb2YKLSAqIAluYW1lL3ZhbHVlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KLSAqIAotICogCVRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlY29nbml6ZWQgZm9yIGEgcGFydGljdWxhcgotICogCW1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgotICogCisgKiAgICAgICAgIFRoZSBhY3RpdmF0aW9uLWNvbmZpZ1R5cGUgZGVmaW5lcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAqICAgICAgICAgZXhwZWN0ZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuCisgKiAgICAgICAgIGluIGl0cyBvcGVyYXRpb25hbCBlbnZpcm9ubWVudC4gVGhpcyBtYXkgaW5jbHVkZSBpbmZvcm1hdGlvbgorICogICAgICAgICBhYm91dCBtZXNzYWdlIGFja25vd2xlZGdlbWVudCwgbWVzc2FnZSBzZWxlY3RvciwgZXhwZWN0ZWQKKyAqICAgICAgICAgZGVzdGluYXRpb24gdHlwZSwgZXRjLgorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgZXhwcmVzc2VkIGluIHRlcm1zIG9mCisgKiAgICAgICAgIG5hbWUvdmFsdWUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCisgKiAgICAgICAgIG1lc3NhZ2UtZHJpdmVuIGJlYW4gYXJlIGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2luZyB0eXBlLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNjQsNyArNjYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBY3RpdmF0aW9uQ29uZmlnX0Rlc2NyaXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7CisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTc5LDcgKzgxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QWN0aXZhdGlvbkNvbmZpZ19BY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKTsKKwlMaXN0PEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eT4gZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5qYXZhCmluZGV4IDFlMjBmOGYuLjlhZWUxNGEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5qYXZhCkBAIC0yMCwxMiArMjAsMTMgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgYWN0aXZhdGlvbi1jb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgbmFtZS92YWx1ZQotICogCWNvbmZpZ3VyYXRpb24gcHJvcGVydHkgcGFpciBmb3IgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotICogCi0gKiAJVGhlIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVjb2duaXplZCBmb3IgYSBwYXJ0aWN1bGFyCi0gKiAJbWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuCi0gKiAKKyAqICAgICAgICAgVGhlIGFjdGl2YXRpb24tY29uZmlnLXByb3BlcnR5VHlwZSBjb250YWlucyBhIG5hbWUvdmFsdWUKKyAqICAgICAgICAgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBwYWlyIGZvciBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgcHJvcGVydGllcyB0aGF0IGFyZSByZWNvZ25pemVkIGZvciBhIHBhcnRpY3VsYXIKKyAqICAgICAgICAgbWVzc2FnZS1kcml2ZW4gYmVhbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnaW5nIHR5cGUuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBFSkIgMy4wCiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC01MCwxNSArNTEsMTYgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS1uYW1lIGVsZW1lbnQgY29udGFpbnMKLQkgKiAJICAgIHRoZSBuYW1lIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgb2YKLQkgKiAJICAgIGEgbWVzc2FnZS1kcml2ZW4gYmVhbi4KLQkgKiAKLQkgKiAJICAgIEZvciBKTVMgbWVzc2FnZS1kcml2ZW4gYmVhbnMsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkKLQkgKiAJICAgIG5hbWVzIGFyZSByZWNvZ25pemVkOiBhY2tub3dsZWRnZU1vZGUsCi0JICogCSAgICBtZXNzYWdlU2VsZWN0b3IsIGRlc3RpbmF0aW9uVHlwZSwgc3Vic2NyaXB0aW9uRHVyYWJpbGl0eQotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS1uYW1lIGVsZW1lbnQgY29udGFpbnMKKwkgKiAgICAgICAgICAgICB0aGUgbmFtZSBmb3IgYW4gYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnR5IG9mCisJICogICAgICAgICAgICAgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEZvciBKTVMgbWVzc2FnZS1kcml2ZW4gYmVhbnMsIHRoZSBmb2xsb3dpbmcgcHJvcGVydHkKKwkgKiAgICAgICAgICAgICBuYW1lcyBhcmUgcmVjb2duaXplZDogYWNrbm93bGVkZ2VNb2RlLAorCSAqICAgICAgICAgICAgIG1lc3NhZ2VTZWxlY3RvciwgZGVzdGluYXRpb25UeXBlLCBzdWJzY3JpcHRpb25EdXJhYmlsaXR5CisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZShTdHJpbmcpCkBAIC04NCwxMSArODYsMTIgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBlbGVtZW50Ci0JICogCSAgICBjb250YWlucyB0aGUgdmFsdWUgZm9yIGFuIGFjdGl2YXRpb24gY29uZmlndXJhdGlvbgotCSAqIAkgICAgcHJvcGVydHkgb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSBhY3RpdmF0aW9uLWNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBlbGVtZW50CisJICogICAgICAgICAgICAgY29udGFpbnMgdGhlIHZhbHVlIGZvciBhbiBhY3RpdmF0aW9uIGNvbmZpZ3VyYXRpb24KKwkgKiAgICAgICAgICAgICBwcm9wZXJ0eSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4uCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydHkgVmFsdWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlKFN0cmluZykKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9BcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhCmluZGV4IGJhMDY3ZTYuLjFlYzI2MDggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0FwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQXBwbGljYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMjIsMTcgKzIyLDI2IEBACiAgKiAKICAqICAgICAgICAgVGhlIGFwcGxpY2F0aW9uLWV4Y2VwdGlvblR5cGUgZGVjbGFyZXMgYW4gYXBwbGljYXRpb24KICAqICAgICAgICAgZXhjZXB0aW9uLiBUaGUgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6Ci0gKiAKLSAqICAgICAgICAgICAgIC0gdGhlIGV4Y2VwdGlvbiBjbGFzcy4gV2hlbiB0aGUgY29udGFpbmVyIHJlY2VpdmVzCi0gKiAgICAgICAgICAgICAgIGFuIGV4Y2VwdGlvbiBvZiB0aGlzIHR5cGUsIGl0IGlzIHJlcXVpcmVkIHRvCi0gKiAgICAgICAgICAgICAgIGZvcndhcmQgdGhpcyBleGNlcHRpb24gYXMgYW4gYXBwbGNhdGlvbiBleGNlcHRpb24KLSAqICAgICAgICAgICAgICAgdG8gdGhlIGNsaWVudCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgYSBjaGVja2VkCi0gKiAgICAgICAgICAgICAgIG9yIHVuY2hlY2tlZCBleGNlcHRpb24uCi0gKiAgICAgICAgICAgICAtIGFuIG9wdGlvbmFsIHJvbGxiYWNrIGVsZW1lbnQuIElmIHRoaXMgZWxlbWVudCBpcwotICogICAgICAgICAgICAgICBzZXQgdG8gdHJ1ZSwgdGhlIGNvbnRhaW5lciBtdXN0IHJvbGxiYWNrIHRoZSBjdXJyZW50Ci0gKiAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uIGJlZm9yZSBmb3J3YXJkaW5nIHRoZSBleGNlcHRpb24gdG8gdGhlCi0gKiAgICAgICAgICAgICAgIGNsaWVudC4gIElmIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIGZhbHNlLgotICogCisgKiAgICAgICAgIAorICogICAgICAgICAtIHRoZSBleGNlcHRpb24gY2xhc3MuIFdoZW4gdGhlIGNvbnRhaW5lciByZWNlaXZlcworICogICAgICAgICBhbiBleGNlcHRpb24gb2YgdGhpcyB0eXBlLCBpdCBpcyByZXF1aXJlZCB0byAKKyAqICAgICAgICAgZm9yd2FyZCB0aGlzIGV4Y2VwdGlvbiBhcyBhbiBhcHBsY2F0aW9uIGV4Y2VwdGlvbiAKKyAqICAgICAgICAgdG8gdGhlIGNsaWVudCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgYSBjaGVja2VkCisgKiAgICAgICAgIG9yIHVuY2hlY2tlZCBleGNlcHRpb24uCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgcm9sbGJhY2sgZWxlbWVudC4gSWYgdGhpcyBlbGVtZW50IGlzIAorICogICAgICAgICBzZXQgdG8gdHJ1ZSwgdGhlIGNvbnRhaW5lciBtdXN0IHJvbGxiYWNrIHRoZSBjdXJyZW50IAorICogICAgICAgICB0cmFuc2FjdGlvbiBiZWZvcmUgZm9yd2FyZGluZyB0aGUgZXhjZXB0aW9uIHRvIHRoZQorICogICAgICAgICBjbGllbnQuICBJZiBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBmYWxzZS4KKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBpbmhlcml0ZWQgZWxlbWVudC4gSWYgdGhpcyBlbGVtZW50IGlzIAorICogICAgICAgICBzZXQgdG8gdHJ1ZSwgc3ViY2xhc3NlcyBvZiB0aGUgZXhjZXB0aW9uIGNsYXNzIHR5cGUKKyAqICAgICAgICAgYXJlIGFsc28gYXV0b21hdGljYWxseSBjb25zaWRlcmVkIGFwcGxpY2F0aW9uIAorICogICAgICAgICBleGNlcHRpb25zICh1bmxlc3Mgb3ZlcnJpZGVuIGF0IGEgbG93ZXIgbGV2ZWwpLgorICogICAgICAgICBJZiBzZXQgdG8gZmFsc2UsIG9ubHkgdGhlIGV4Y2VwdGlvbiBjbGFzcyB0eXBlIGlzCisgKiAgICAgICAgIGNvbnNpZGVyZWQgYW4gYXBwbGljYXRpb24tZXhjZXB0aW9uLCBub3QgaXRzCisgKiAgICAgICAgIGV4Y2VwdGlvbiBzdWJjbGFzc2VzLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzCisgKiAgICAgICAgIHZhbHVlIGRlZmF1bHRzIHRvIHRydWUuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBFSkIgMy4wCiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC00MSw2ICs1MCw3IEBACiAgKiA8dWw+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jZ2V0RXhjZXB0aW9uQ2xhc3MgPGVtPkV4Y2VwdGlvbiBDbGFzczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jaXNSb2xsYmFjayA8ZW0+Um9sbGJhY2s8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uI2lzSW5oZXJpdGVkIDxlbT5Jbmhlcml0ZWQ8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICogPC9wPgpAQCAtMTI4LDYgKzEzOCw1OSBAQAogCWJvb2xlYW4gaXNTZXRSb2xsYmFjaygpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5oZXJpdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBFSkIgMy4xCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbmhlcml0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0SW5oZXJpdGVkKCkKKwkgKiBAc2VlICN1bnNldEluaGVyaXRlZCgpCisJICogQHNlZSAjc2V0SW5oZXJpdGVkKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9uX0luaGVyaXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNJbmhlcml0ZWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uI2lzSW5oZXJpdGVkIDxlbT5Jbmhlcml0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaGVyaXRlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRJbmhlcml0ZWQoKQorCSAqIEBzZWUgI3Vuc2V0SW5oZXJpdGVkKCkKKwkgKiBAc2VlICNpc0luaGVyaXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SW5oZXJpdGVkKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiNpc0luaGVyaXRlZCA8ZW0+SW5oZXJpdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1NldEluaGVyaXRlZCgpCisJICogQHNlZSAjaXNJbmhlcml0ZWQoKQorCSAqIEBzZWUgI3NldEluaGVyaXRlZChib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHVuc2V0SW5oZXJpdGVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uI2lzSW5oZXJpdGVkIDxlbT5Jbmhlcml0ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaGVyaXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIEBzZWUgI3Vuc2V0SW5oZXJpdGVkKCkKKwkgKiBAc2VlICNpc0luaGVyaXRlZCgpCisJICogQHNlZSAjc2V0SW5oZXJpdGVkKGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNTZXRJbmhlcml0ZWQoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0Fyb3VuZEludm9rZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0Fyb3VuZEludm9rZVR5cGUuamF2YQppbmRleCA5MjIyMDgyLi42MDIwMDg3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Bcm91bmRJbnZva2VUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQXJvdW5kSW52b2tlVHlwZS5qYXZhCkBAIC0yMSwxNyArMjEsMTggQEAKICAqIAogICogCiAgKiAgICAgICAgIFRoZSBhcm91bmQtaW52b2tlIHR5cGUgc3BlY2lmaWVzIGEgbWV0aG9kIG9uIGEKLSAqICAgICAgICAgY2xhc3MgdG8gYmUgY2FsbGVkIGR1cmluZyB0aGUgYXJvdW5kIGludm9rZSBwb3J0aW9uIG9mIGFuCisgKiAgICAgICAgIGNsYXNzIHRvIGJlIGNhbGxlZCBkdXJpbmcgdGhlIGFyb3VuZCBpbnZva2UgcG9ydGlvbiBvZiBhbiAKICAqICAgICAgICAgZWpiIGludm9jYXRpb24uICBOb3RlIHRoYXQgZWFjaCBjbGFzcyBtYXkgaGF2ZSBvbmx5IG9uZQogICogICAgICAgICBhcm91bmQgaW52b2tlIG1ldGhvZCBhbmQgdGhhdCB0aGUgbWV0aG9kIG1heSBub3QgYmUKICAqICAgICAgICAgb3ZlcmxvYWRlZC4KLSAqIAorICogICAgICAgICAKICAqICAgICAgICAgSWYgdGhlIGNsYXNzIGVsZW1lbnQgaXMgbWlzc2luZyB0aGVuCiAgKiAgICAgICAgIHRoZSBjbGFzcyBkZWZpbmluZyB0aGUgY2FsbGJhY2sgaXMgYXNzdW1lZCB0byBiZSB0aGUKICAqICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3Mgb3IgY29tcG9uZW50IGNsYXNzIGluIHNjb3BlIGF0IHRoZQogICogICAgICAgICBsb2NhdGlvbiBpbiB0aGUgZGVzY3JpcHRvciBpbiB3aGljaCB0aGUgYXJvdW5kIGludm9rZQogICogICAgICAgICBkZWZpbml0aW9uIGFwcGVhcnMuCi0gKiAKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0Fyb3VuZFRpbWVvdXRUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Bcm91bmRUaW1lb3V0VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NzRiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Bcm91bmRUaW1lb3V0VHlwZS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFyb3VuZCBUaW1lb3V0IFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgYXJvdW5kLXRpbWVvdXQgdHlwZSBzcGVjaWZpZXMgYSBtZXRob2Qgb24gYQorICogICAgICAgICBjbGFzcyB0byBiZSBjYWxsZWQgZHVyaW5nIHRoZSBhcm91bmQtdGltZW91dCBwb3J0aW9uIG9mCisgKiAgICAgICAgIGEgdGltZXIgdGltZW91dCBjYWxsYmFjay4gIE5vdGUgdGhhdCBlYWNoIGNsYXNzIG1heSBoYXZlIAorICogICAgICAgICBvbmx5IG9uZSBhcm91bmQtdGltZW91dCBtZXRob2QgYW5kIHRoYXQgdGhlIG1ldGhvZCBtYXkgbm90IAorICogICAgICAgICBiZSBvdmVybG9hZGVkLgorICogICAgICAgICAKKyAqICAgICAgICAgSWYgdGhlIGNsYXNzIGVsZW1lbnQgaXMgbWlzc2luZyB0aGVuCisgKiAgICAgICAgIHRoZSBjbGFzcyBkZWZpbmluZyB0aGUgY2FsbGJhY2sgaXMgYXNzdW1lZCB0byBiZSB0aGUKKyAqICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3Mgb3IgY29tcG9uZW50IGNsYXNzIGluIHNjb3BlIGF0IHRoZQorICogICAgICAgICBsb2NhdGlvbiBpbiB0aGUgZGVzY3JpcHRvciBpbiB3aGljaCB0aGUgYXJvdW5kLXRpbWVvdXQKKyAqICAgICAgICAgZGVmaW5pdGlvbiBhcHBlYXJzLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgRUpCIDMuMQorICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kVGltZW91dFR5cGUjZ2V0Q2xhc3NfIDxlbT5DbGFzczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kVGltZW91dFR5cGUjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXJvdW5kVGltZW91dFR5cGUoKQorICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXJvdW5kVGltZW91dFR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Q2xhc3MoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBcm91bmRUaW1lb3V0VHlwZV9DbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRDbGFzc18oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZFRpbWVvdXRUeXBlI2dldENsYXNzXyA8ZW0+Q2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDbGFzc18oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldENsYXNzKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1ldGhvZE5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBcm91bmRUaW1lb3V0VHlwZV9NZXRob2ROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldE1ldGhvZE5hbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZFRpbWVvdXRUeXBlI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TWV0aG9kTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TWV0aG9kTmFtZShTdHJpbmcgdmFsdWUpOworCit9IC8vIEFyb3VuZFRpbWVvdXRUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Bc3NlbWJseURlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0Fzc2VtYmx5RGVzY3JpcHRvci5qYXZhCmluZGV4IDFhOTExM2MuLjU1ZmZkYTIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0Fzc2VtYmx5RGVzY3JpcHRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0Fzc2VtYmx5RGVzY3JpcHRvci5qYXZhCkBAIC0xMyw2ICsxMyw4IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZTsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjIsMjQgKzI0LDI1IEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIGFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIGRlZmluZXMKLSAqIAlhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbi4KLSAqIAotICogCVRoZSBhcHBsaWNhdGlvbi1hc3NlbWJseSBpbmZvcm1hdGlvbiBjb25zaXN0cyBvZiB0aGUKLSAqIAlmb2xsb3dpbmcgcGFydHM6IHRoZSBkZWZpbml0aW9uIG9mIHNlY3VyaXR5IHJvbGVzLCB0aGUKLSAqIAlkZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgdGhlIGRlZmluaXRpb24gb2YKLSAqIAl0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGZvciBlbnRlcnByaXNlIGJlYW5zIHdpdGgKLSAqIAljb250YWluZXItbWFuYWdlZCB0cmFuc2FjdGlvbiBkZW1hcmNhdGlvbiwgdGhlIGRlZmluaXRpb24KKyAqICAgICAgICAgVGhlIGFzc2VtYmx5LWRlc2NyaXB0b3JUeXBlIGRlZmluZXMKKyAqICAgICAgICAgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24uCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgYXBwbGljYXRpb24tYXNzZW1ibHkgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlCisgKiAgICAgICAgIGZvbGxvd2luZyBwYXJ0czogdGhlIGRlZmluaXRpb24gb2Ygc2VjdXJpdHkgcm9sZXMsIHRoZQorICogICAgICAgICBkZWZpbml0aW9uIG9mIG1ldGhvZCBwZXJtaXNzaW9ucywgdGhlIGRlZmluaXRpb24gb2YKKyAqICAgICAgICAgdHJhbnNhY3Rpb24gYXR0cmlidXRlcyBmb3IgZW50ZXJwcmlzZSBiZWFucyB3aXRoCisgKiAgICAgICAgIGNvbnRhaW5lci1tYW5hZ2VkIHRyYW5zYWN0aW9uIGRlbWFyY2F0aW9uLCB0aGUgZGVmaW5pdGlvbgogICogICAgICAgICBvZiBpbnRlcmNlcHRvciBiaW5kaW5ncywgYSBsaXN0IG9mCi0gKiAJbWV0aG9kcyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGludm9rZWQsIGFuZCBhIGxpc3Qgb2YKKyAqICAgICAgICAgbWV0aG9kcyB0byBiZSBleGNsdWRlZCBmcm9tIGJlaW5nIGludm9rZWQsIGFuZCBhIGxpc3Qgb2YKICAqICAgICAgICAgZXhjZXB0aW9uIHR5cGVzIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwbGljYXRpb24gZXhjZXB0aW9ucy4KLSAqIAotICogCUFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlCi0gKiAJb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbSBhcmUgZW1wdHkuCi0gKiAKLSAqIAlQcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudAotICogCWRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIGZpbGUgcHJvZHVjZXIuCi0gKiAKKyAqICAgICAgICAgCisgKiAgICAgICAgIEFsbCB0aGUgcGFydHMgYXJlIG9wdGlvbmFsIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlCisgKiAgICAgICAgIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgorICogICAgICAgICAKKyAqICAgICAgICAgUHJvdmlkaW5nIGFuIGFzc2VtYmx5LWRlc2NyaXB0b3IgaW4gdGhlIGRlcGxveW1lbnQKKyAqICAgICAgICAgZGVzY3JpcHRvciBpcyBvcHRpb25hbCBmb3IgdGhlIGVqYi1qYXIgb3IgLndhciBmaWxlIHByb2R1Y2VyLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNzUsNyArNzgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBc3NlbWJseURlc2NyaXB0b3JfU2VjdXJpdHlSb2xlcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0U2VjdXJpdHlSb2xlcygpOworCUxpc3Q8U2VjdXJpdHlSb2xlPiBnZXRTZWN1cml0eVJvbGVzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGVybWlzc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtOTAsNyArOTMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kUGVybWlzc2lvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldE1ldGhvZFBlcm1pc3Npb25zKCk7CisJTGlzdDxNZXRob2RQZXJtaXNzaW9uPiBnZXRNZXRob2RQZXJtaXNzaW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFpbmVyIFRyYW5zYWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMDUsNyArMTA4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0NvbnRhaW5lclRyYW5zYWN0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25zKCk7CisJTGlzdDxDb250YWluZXJUcmFuc2FjdGlvblR5cGU+IGdldENvbnRhaW5lclRyYW5zYWN0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJjZXB0b3IgQmluZGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTIwLDcgKzEyMyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFzc2VtYmx5RGVzY3JpcHRvcl9JbnRlcmNlcHRvckJpbmRpbmdzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRJbnRlcmNlcHRvckJpbmRpbmdzKCk7CisJTGlzdDxJbnRlcmNlcHRvckJpbmRpbmdUeXBlPiBnZXRJbnRlcmNlcHRvckJpbmRpbmdzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMzUsNyArMTM4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01lc3NhZ2VEZXN0aW5hdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKKwlMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvbj4gZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBMaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC0xNzUsNyArMTc4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0FwcGxpY2F0aW9uRXhjZXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0QXBwbGljYXRpb25FeGNlcHRpb25zKCk7CisJTGlzdDxBcHBsaWNhdGlvbkV4Y2VwdGlvbj4gZ2V0QXBwbGljYXRpb25FeGNlcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQXN5bmNNZXRob2RUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Bc3luY01ldGhvZFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWU5ZmEwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQXN5bmNNZXRob2RUeXBlLmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXN5bmMgTWV0aG9kIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgYXN5bmMtbWV0aG9kVHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGF0IGEgc2Vzc2lvbgorICogICAgICAgICBiZWFuIG1ldGhvZCBoYXMgYXN5bmNocm9ub3VzIGludm9jYXRpb24gc2VtYW50aWNzLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgRUpCIDMuMQorICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXN5bmNNZXRob2RUeXBlI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3luY01ldGhvZFR5cGUjZ2V0TWV0aG9kUGFyYW1zIDxlbT5NZXRob2QgUGFyYW1zPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3luY01ldGhvZFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFzeW5jTWV0aG9kVHlwZSgpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBBc3luY01ldGhvZFR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TWV0aG9kTmFtZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEFzeW5jTWV0aG9kVHlwZV9NZXRob2ROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldE1ldGhvZE5hbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzeW5jTWV0aG9kVHlwZSNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0TWV0aG9kUGFyYW1zKE1ldGhvZFBhcmFtcykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXN5bmNNZXRob2RUeXBlX01ldGhvZFBhcmFtcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCU1ldGhvZFBhcmFtcyBnZXRNZXRob2RQYXJhbXMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzeW5jTWV0aG9kVHlwZSNnZXRNZXRob2RQYXJhbXMgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE1ldGhvZFBhcmFtcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TWV0aG9kUGFyYW1zKE1ldGhvZFBhcmFtcyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElkKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0QXN5bmNNZXRob2RUeXBlX0lkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3luY01ldGhvZFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gQXN5bmNNZXRob2RUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DTVBGaWVsZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ01QRmllbGQuamF2YQppbmRleCA1NjliODIzLi4yMWJiOWExIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DTVBGaWVsZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NNUEZpZWxkLmphdmEKQEAgLTEyLDYgKzEyLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CiAKIC8qKgpAQCAtMjIsMTAgKzIzLDExIEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIGNtcC1maWVsZFR5cGUgZGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZQotICogCWNtcC1maWVsZFR5cGUgY29udGFpbnMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkLAotICogCWFuZCB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCi0gKiAKKyAqICAgICAgICAgVGhlIGNtcC1maWVsZFR5cGUgZGVzY3JpYmVzIGEgY29udGFpbmVyLW1hbmFnZWQgZmllbGQuIFRoZQorICogICAgICAgICBjbXAtZmllbGRUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWVsZCwKKyAqICAgICAgICAgYW5kIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTU2LDcgKzU4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q01QRmllbGRfRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTY1LDIxICs2NywyMiBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAqIAkgICAgY29udGFpbmVyIG1hbmFnZWQgZmllbGQuCi0JICogCi0JICogCSAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKLQkgKiAJICAgIGNtcC12ZXJzaW9uIDIueCBtdXN0IGJlZ2luIHdpdGggYSBsb3dlcmNhc2UKLQkgKiAJICAgIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzIHdob3NlCi0JICogCSAgICBuYW1lcyBjb25zaXN0cyBvZiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc3BlY2lmaWVkIGJ5Ci0JICogCSAgICBmaWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdCBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwKLQkgKiAJICAgIHByZWZpeGVkIGJ5ICJnZXQiIG9yICJzZXQiLgotCSAqIAotCSAqIAkgICAgVGhlIG5hbWUgb2YgdGhlIGNtcC1maWVsZCBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoCi0JICogCSAgICBjbXAtdmVyc2lvbiAxLnggbXVzdCBkZW5vdGUgYSBwdWJsaWMgZmllbGQgb2YgdGhlCi0JICogCSAgICBlbnRlcnByaXNlIGJlYW4gY2xhc3Mgb3Igb25lIG9mIGl0cyBzdXBlcmNsYXNzZXMuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIGZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQorCSAqICAgICAgICAgICAgIGNvbnRhaW5lciBtYW5hZ2VkIGZpZWxkLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjbXAtZmllbGQgb2YgYW4gZW50aXR5IGJlYW4gd2l0aAorCSAqICAgICAgICAgICAgIGNtcC12ZXJzaW9uIDIueCBtdXN0IGJlZ2luIHdpdGggYSBsb3dlcmNhc2UKKwkgKiAgICAgICAgICAgICBsZXR0ZXIuIFRoaXMgZmllbGQgaXMgYWNjZXNzZWQgYnkgbWV0aG9kcyB3aG9zZQorCSAqICAgICAgICAgICAgIG5hbWVzIGNvbnNpc3RzIG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkKKwkgKiAgICAgICAgICAgICBmaWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdCBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwKKwkgKiAgICAgICAgICAgICBwcmVmaXhlZCBieSAiZ2V0IiBvciAic2V0Ii4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgY21wLWZpZWxkIG9mIGFuIGVudGl0eSBiZWFuIHdpdGgKKwkgKiAgICAgICAgICAgICBjbXAtdmVyc2lvbiAxLnggbXVzdCBkZW5vdGUgYSBwdWJsaWMgZmllbGQgb2YgdGhlCisJICogICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuIGNsYXNzIG9yIG9uZSBvZiBpdHMgc3VwZXJjbGFzc2VzLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldEZpZWxkTmFtZShTdHJpbmcpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DTVJGaWVsZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ01SRmllbGQuamF2YQppbmRleCBmZmZkM2UzLi5kNTQxNjY5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DTVJGaWVsZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NNUkZpZWxkLmphdmEKQEAgLTEyLDYgKzEyLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CiAKIC8qKgpAQCAtMjIsMTUgKzIzLDE2IEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIGNtci1maWVsZFR5cGUgZGVzY3JpYmVzIHRoZSBiZWFuIHByb3ZpZGVyJ3MgdmlldyBvZgotICogCWEgcmVsYXRpb25zaGlwLiBJdCBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYW5kCi0gKiAJdGhlIG5hbWUgYW5kIHRoZSBjbGFzcyB0eXBlIG9mIGEgZmllbGQgaW4gdGhlIHNvdXJjZSBvZiBhCi0gKiAJcm9sZSBvZiBhIHJlbGF0aW9uc2hpcC4gVGhlIGNtci1maWVsZC1uYW1lIGVsZW1lbnQKLSAqIAljb3JyZXNwb25kcyB0byB0aGUgbmFtZSB1c2VkIGZvciB0aGUgZ2V0IGFuZCBzZXQgYWNjZXNzb3IKLSAqIAltZXRob2RzIGZvciB0aGUgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBpcwotICogCXVzZWQgb25seSBmb3IgY29sbGVjdGlvbi12YWx1ZWQgY21yLWZpZWxkcy4gSXQgc3BlY2lmaWVzIHRoZQotICogCXR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBpcyB1c2VkLgotICogCisgKiAgICAgICAgIFRoZSBjbXItZmllbGRUeXBlIGRlc2NyaWJlcyB0aGUgYmVhbiBwcm92aWRlcidzIHZpZXcgb2YKKyAqICAgICAgICAgYSByZWxhdGlvbnNoaXAuIEl0IGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhbmQKKyAqICAgICAgICAgdGhlIG5hbWUgYW5kIHRoZSBjbGFzcyB0eXBlIG9mIGEgZmllbGQgaW4gdGhlIHNvdXJjZSBvZiBhCisgKiAgICAgICAgIHJvbGUgb2YgYSByZWxhdGlvbnNoaXAuIFRoZSBjbXItZmllbGQtbmFtZSBlbGVtZW50CisgKiAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBuYW1lIHVzZWQgZm9yIHRoZSBnZXQgYW5kIHNldCBhY2Nlc3NvcgorICogICAgICAgICBtZXRob2RzIGZvciB0aGUgcmVsYXRpb25zaGlwLiBUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBpcworICogICAgICAgICB1c2VkIG9ubHkgZm9yIGNvbGxlY3Rpb24tdmFsdWVkIGNtci1maWVsZHMuIEl0IHNwZWNpZmllcyB0aGUKKyAqICAgICAgICAgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IGlzIHVzZWQuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBFSkIgMy4wCiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC02Miw3ICs2NCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENNUkZpZWxkX0Rlc2NyaXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7CisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbXIgRmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNzEsMTUgKzczLDE2IEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgY21yLWZpZWxkLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYQotCSAqIAkgICAgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuCi0JICogCSAgICBjbGFzcy4gVGhlIG5hbWUgb2YgdGhlIGNtci1maWVsZCBtdXN0IGJlZ2luIHdpdGggYQotCSAqIAkgICAgbG93ZXJjYXNlIGxldHRlci4gVGhpcyBmaWVsZCBpcyBhY2Nlc3NlZCBieSBtZXRob2RzCi0JICogCSAgICB3aG9zZSBuYW1lcyBjb25zaXN0IG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAotCSAqIAkgICAgc3BlY2lmaWVkIGJ5IGNtci1maWVsZC1uYW1lIGluIHdoaWNoIHRoZSBmaXJzdAotCSAqIAkgICAgbGV0dGVyIGlzIHVwcGVyY2FzZWQsIHByZWZpeGVkIGJ5ICJnZXQiIG9yICJzZXQiLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSBjbXItZmllbGQtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhCisJICogICAgICAgICAgICAgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eSBiZWFuCisJICogICAgICAgICAgICAgY2xhc3MuIFRoZSBuYW1lIG9mIHRoZSBjbXItZmllbGQgbXVzdCBiZWdpbiB3aXRoIGEKKwkgKiAgICAgICAgICAgICBsb3dlcmNhc2UgbGV0dGVyLiBUaGlzIGZpZWxkIGlzIGFjY2Vzc2VkIGJ5IG1ldGhvZHMKKwkgKiAgICAgICAgICAgICB3aG9zZSBuYW1lcyBjb25zaXN0IG9mIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorCSAqICAgICAgICAgICAgIHNwZWNpZmllZCBieSBjbXItZmllbGQtbmFtZSBpbiB3aGljaCB0aGUgZmlyc3QKKwkgKiAgICAgICAgICAgICBsZXR0ZXIgaXMgdXBwZXJjYXNlZCwgcHJlZml4ZWQgYnkgImdldCIgb3IgInNldCIuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q21yIEZpZWxkIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldENtckZpZWxkTmFtZShTdHJpbmcpCkBAIC0xMDAsNyArMTAzLDYgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNtciBGaWVsZCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImphdmEudXRpbC5Db2xsZWN0aW9uIjwvY29kZT4uCiAJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlfS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ01SRmllbGRUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DTVJGaWVsZFR5cGUuamF2YQppbmRleCBkNDUyOGZkLi4yNDk2MGI1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DTVJGaWVsZFR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DTVJGaWVsZFR5cGUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTI0LDE3ICsyNCwzNyBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSBjbXItZmllbGQtdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgY2xhc3Mgb2YgYQotICogCWNvbGxlY3Rpb24tdmFsdWVkIGxvZ2ljYWwgcmVsYXRpb25zaGlwIGZpZWxkIGluIHRoZSBlbnRpdHkKLSAqIAliZWFuIGNsYXNzLiBUaGUgdmFsdWUgb2YgYW4gZWxlbWVudCB1c2luZyBjbXItZmllbGQtdHlwZVR5cGUKLSAqIAltdXN0IGJlIGVpdGhlcjogamF2YS51dGlsLkNvbGxlY3Rpb24gb3IgamF2YS51dGlsLlNldC4KLSAqIAorICogICAgICAgICBUaGUgY21yLWZpZWxkLXR5cGUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGNsYXNzIG9mIGEKKyAqICAgICAgICAgY29sbGVjdGlvbi12YWx1ZWQgbG9naWNhbCByZWxhdGlvbnNoaXAgZmllbGQgaW4gdGhlIGVudGl0eQorICogICAgICAgICBiZWFuIGNsYXNzLiBUaGUgdmFsdWUgb2YgYW4gZWxlbWVudCB1c2luZyBjbXItZmllbGQtdHlwZVR5cGUKKyAqICAgICAgICAgbXVzdCBiZSBlaXRoZXI6IGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGphdmEudXRpbC5TZXQuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBFSkIgMy4wCiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDTVJGaWVsZFR5cGUoKQogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ01SRmllbGRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKK3B1YmxpYyBlbnVtIENNUkZpZWxkVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKK3sKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5KYXZhIFV0aWwgQ29sbGVjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNKQVZBX1VUSUxfQ09MTEVDVElPTgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUpBVkFfVVRJTF9DT0xMRUNUSU9OX0xJVEVSQUwoMCwgImphdmFVdGlsQ29sbGVjdGlvbiIsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5KYXZhIFV0aWwgU2V0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0pBVkFfVVRJTF9TRVQKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlKQVZBX1VUSUxfU0VUX0xJVEVSQUwoMSwgImphdmFVdGlsU2V0IiwgImphdmEudXRpbC5TZXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+SmF2YSBVdGlsIENvbGxlY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTY0LDI2ICs4NCw2IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9VVElMX1NFVCA9IDE7CiAKIAkvKioKLQkgKiBUaGUgJzxlbT48Yj5KYXZhIFV0aWwgQ29sbGVjdGlvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX1VUSUxfQ09MTEVDVElPTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ01SRmllbGRUeXBlIEpBVkFfVVRJTF9DT0xMRUNUSU9OX0xJVEVSQUwgPSBuZXcgQ01SRmllbGRUeXBlKEpBVkFfVVRJTF9DT0xMRUNUSU9OLCAiamF2YVV0aWxDb2xsZWN0aW9uIiwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SmF2YSBVdGlsIFNldDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKQVZBX1VUSUxfU0VUCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDTVJGaWVsZFR5cGUgSkFWQV9VVElMX1NFVF9MSVRFUkFMID0gbmV3IENNUkZpZWxkVHlwZShKQVZBX1VUSUxfU0VULCAiamF2YVV0aWxTZXQiLCAiamF2YS51dGlsLlNldCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5DTVIgRmllbGQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTEwMSw3ICsxMDEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDTVJGaWVsZFR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q01SIEZpZWxkIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCkBAIC0xNDYsMTcgKzE0Niw3NyBAQAogCQkJY2FzZSBKQVZBX1VUSUxfQ09MTEVDVElPTjogcmV0dXJuIEpBVkFfVVRJTF9DT0xMRUNUSU9OX0xJVEVSQUw7CiAJCQljYXNlIEpBVkFfVVRJTF9TRVQ6IHJldHVybiBKQVZBX1VUSUxfU0VUX0xJVEVSQUw7CiAJCX0KLQkJcmV0dXJuIG51bGw7CQorCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCiAJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwogCXByaXZhdGUgQ01SRmllbGRUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwogCX0KIAotfSAvL0NNUkZpZWxkVHlwZQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DbXBWZXJzaW9uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ21wVmVyc2lvblR5cGUuamF2YQppbmRleCBkOTM3ODU1Li5mMzM0ZDkxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9DbXBWZXJzaW9uVHlwZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NtcFZlcnNpb25UeXBlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yNCwyMSArMjQsNDEgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgY21wLXZlcnNpb25UeXBlIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiBhbiBlbnRpdHkgYmVhbgotICogCXdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuIEl0IGlzIHVzZWQgYnkKLSAqIAljbXAtdmVyc2lvbiBlbGVtZW50cy4KLSAqIAotICogCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLSAqIAotICogCSAgICAxLngKLSAqIAkgICAgMi54Ci0gKiAKKyAqICAgICAgICAgVGhlIGNtcC12ZXJzaW9uVHlwZSBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgYW4gZW50aXR5IGJlYW4KKyAqICAgICAgICAgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gSXQgaXMgdXNlZCBieQorICogICAgICAgICBjbXAtdmVyc2lvbiBlbGVtZW50cy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKKyAqICAgICAgICAgCisgKiAgICAgICAgIDEueAorICogICAgICAgICAyLngKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENtcFZlcnNpb25UeXBlKCkKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIENtcFZlcnNpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKK3B1YmxpYyBlbnVtIENtcFZlcnNpb25UeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPjFYPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI18xWAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCV8xWF9MSVRFUkFMKDAsICJfMVgiLCAiMS54IiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPjJYPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI18yWAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCV8yWF9MSVRFUkFMKDEsICJfMlgiLCAiMi54Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPjFYPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC02OCwyNiArODgsNiBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF8yWCA9IDE7CiAKIAkvKioKLQkgKiBUaGUgJzxlbT48Yj4xWDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNfMVgKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENtcFZlcnNpb25UeXBlIF8xWF9MSVRFUkFMID0gbmV3IENtcFZlcnNpb25UeXBlKF8xWCwgIl8xWCIsICIxLngiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj4yWDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNfMlgKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENtcFZlcnNpb25UeXBlIF8yWF9MSVRFUkFMID0gbmV3IENtcFZlcnNpb25UeXBlKF8yWCwgIl8yWCIsICIyLngiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+Q21wIFZlcnNpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTEwNSw3ICsxMDUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDbXBWZXJzaW9uVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgJzxlbT48Yj5DbXAgVmVyc2lvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgpAQCAtMTUwLDE3ICsxNTAsNzcgQEAKIAkJCWNhc2UgXzFYOiByZXR1cm4gXzFYX0xJVEVSQUw7CiAJCQljYXNlIF8yWDogcmV0dXJuIF8yWF9MSVRFUkFMOwogCQl9Ci0JCXJldHVybiBudWxsOwkKKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgogCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwcml2YXRlIENtcFZlcnNpb25UeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwogCX0KIAotfSAvL0NtcFZlcnNpb25UeXBlCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Db25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYWU3ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Db25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkNvbmN1cnJlbmN5IE1hbmFnZW1lbnQgVHlwZSBUeXBlPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKyAqIAorICogCisgKiAgICAgICAgIFRoZSBjb25jdXJyZW5jeS1tYW5hZ2VtZW50LXR5cGVUeXBlIHNwZWNpZmllcyB0aGUgd2F5IGNvbmN1cnJlbmN5CisgKiAgICAgICAgIGlzIG1hbmFnZWQgZm9yIGEgc2luZ2xldG9uIG9yIHN0YXRlZnVsIHNlc3Npb24gYmVhbi4gIAorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIGNvbmN1cnJlbmN5IG1hbmFnZW1lbnQgdHlwZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogICAgICAgICAKKyAqICAgICAgICAgQmVhbgorICogICAgICAgICBDb250YWluZXIKKyAqICAgICAgICAgCisgKiAgICAgICAgIEJlYW4gbWFuYWdlZCBjb25jdXJyZW5jeSBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGEgc2luZ2xldG9uIGJlYW4uCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBFSkIgMy4xCisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZSgpCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+QmVhbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNCRUFOX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQkVBTigwLCAiQmVhbiIsICJCZWFuIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NPTlRBSU5FUl9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUNPTlRBSU5FUigxLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkJlYW48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkJlYW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQkVBTgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJFQU5fVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ09OVEFJTkVSCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEFJTkVSX1ZBTFVFID0gMTsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Db25jdXJyZW5jeSBNYW5hZ2VtZW50IFR5cGUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVbXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVbXSB7CisJCQlCRUFOLAorCQkJQ09OVEFJTkVSLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkNvbmN1cnJlbmN5IE1hbmFnZW1lbnQgVHlwZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q29uY3VycmVuY3kgTWFuYWdlbWVudCBUeXBlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q29uY3VycmVuY3kgTWFuYWdlbWVudCBUeXBlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Db25jdXJyZW5jeSBNYW5hZ2VtZW50IFR5cGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBCRUFOX1ZBTFVFOiByZXR1cm4gQkVBTjsKKwkJCWNhc2UgQ09OVEFJTkVSX1ZBTFVFOiByZXR1cm4gQ09OVEFJTkVSOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9Db25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ29uY3VycmVudExvY2tUeXBlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ29uY3VycmVudExvY2tUeXBlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MGQ4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Db25jdXJyZW50TG9ja1R5cGVUeXBlLmphdmEKQEAgLTAsMCArMSwyMjkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+Q29uY3VycmVudCBMb2NrIFR5cGUgVHlwZTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgY29uY3VycmVudC1sb2NrLXR5cGVUeXBlIHNwZWNpZmllcyBob3cgdGhlIGNvbnRhaW5lciBtdXN0CisgKiAgICAgICAgIG1hbmFnZSBjb25jdXJyZW50IGFjY2VzcyB0byBhIG1ldGhvZCBvZiBhIFNpbmdsZXRvbiBiZWFuIAorICogICAgICAgICB3aXRoIGNvbnRhaW5lci1tYW5hZ2VkIGNvbmN1cnJlbmN5LgorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIGNvbnRhaW5lciBtYW5hZ2VkIGNvbmN1cnJlbmN5IGxvY2sgdHlwZSBtdXN0IGJlIG9uZSAKKyAqICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyA6CisgKiAgICAgICAgIAorICogICAgICAgICBSZWFkCisgKiAgICAgICAgIFdyaXRlCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBFSkIgMy4xCisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDb25jdXJyZW50TG9ja1R5cGVUeXBlKCkKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gQ29uY3VycmVudExvY2tUeXBlVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlJlYWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUkVBRF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVJFQUQoMCwgIlJlYWQiLCAiUmVhZCIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPldyaXRlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1dSSVRFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJV1JJVEUoMSwgIldyaXRlIiwgIldyaXRlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+UmVhZDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UmVhZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNSRUFECisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5Xcml0ZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+V3JpdGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjV1JJVEUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXUklURV9WQUxVRSA9IDE7CisKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+Q29uY3VycmVudCBMb2NrIFR5cGUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudExvY2tUeXBlVHlwZVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBDb25jdXJyZW50TG9ja1R5cGVUeXBlW10geworCQkJUkVBRCwKKwkJCVdSSVRFLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkNvbmN1cnJlbnQgTG9jayBUeXBlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDb25jdXJyZW50TG9ja1R5cGVUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNvbmN1cnJlbnQgTG9jayBUeXBlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDb25jdXJyZW50TG9ja1R5cGVUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJQ29uY3VycmVudExvY2tUeXBlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNvbmN1cnJlbnQgTG9jayBUeXBlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDb25jdXJyZW50TG9ja1R5cGVUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJQ29uY3VycmVudExvY2tUeXBlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q29uY3VycmVudCBMb2NrIFR5cGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENvbmN1cnJlbnRMb2NrVHlwZVR5cGUgZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIFJFQURfVkFMVUU6IHJldHVybiBSRUFEOworCQkJY2FzZSBXUklURV9WQUxVRTogcmV0dXJuIFdSSVRFOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBDb25jdXJyZW50TG9ja1R5cGVUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL0NvbmN1cnJlbnRMb2NrVHlwZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0NvbmN1cnJlbnRNZXRob2RUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Db25jdXJyZW50TWV0aG9kVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZjY4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Db25jdXJyZW50TWV0aG9kVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmN1cnJlbnQgTWV0aG9kIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgY29uY3VycmVudC1tZXRob2RUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhIG1ldGhvZAorICogICAgICAgICBvZiBhIGJlYW4gd2l0aCBjb250YWluZXIgbWFuYWdlZCBjb25jdXJyZW5jeS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBvcHRpb25hbCBsb2NrIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBraW5kIG9mIGNvbmN1cnJlbmN5IAorICogICAgICAgICBsb2NrIGFzc3NvY2lhdGVkIHdpdGggdGhlIG1ldGhvZC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBvcHRpb25hbCBhY2Nlc3MtdGltZW91dCBlbGVtZW50IHNwZWNpZmllcyB0aGUgYW1vdW50IG9mCisgKiAgICAgICAgIHRpbWUgKGluIGEgZ2l2ZW4gdGltZSB1bml0KSB0aGUgY29udGFpbmVyIHNob3VsZCB3YWl0IGZvciBhCisgKiAgICAgICAgIGNvbmN1cnJlbmN5IGxvY2sgYmVmb3JlIHRocm93aW5nIGFuIGV4Y2VwdGlvbiB0byB0aGUgY2xpZW50LgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgRUpCIDMuMQorICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudE1ldGhvZFR5cGUjZ2V0TWV0aG9kIDxlbT5NZXRob2Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbmN1cnJlbnRNZXRob2RUeXBlI2dldExvY2sgPGVtPkxvY2s8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbmN1cnJlbnRNZXRob2RUeXBlI2dldEFjY2Vzc1RpbWVvdXQgPGVtPkFjY2VzcyBUaW1lb3V0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TWV0aG9kVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q29uY3VycmVudE1ldGhvZFR5cGUoKQorICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29uY3VycmVudE1ldGhvZFR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0TWV0aG9kKE5hbWVkTWV0aG9kVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q29uY3VycmVudE1ldGhvZFR5cGVfTWV0aG9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTmFtZWRNZXRob2RUeXBlIGdldE1ldGhvZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudE1ldGhvZFR5cGUjZ2V0TWV0aG9kIDxlbT5NZXRob2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TWV0aG9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNZXRob2QoTmFtZWRNZXRob2RUeXBlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TG9ja1R5cGVUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2s8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jazwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TG9ja1R5cGVUeXBlCisJICogQHNlZSAjaXNTZXRMb2NrKCkKKwkgKiBAc2VlICN1bnNldExvY2soKQorCSAqIEBzZWUgI3NldExvY2soQ29uY3VycmVudExvY2tUeXBlVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0Q29uY3VycmVudE1ldGhvZFR5cGVfTG9jaygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvbmN1cnJlbnRMb2NrVHlwZVR5cGUgZ2V0TG9jaygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudE1ldGhvZFR5cGUjZ2V0TG9jayA8ZW0+TG9jazwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jazwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TG9ja1R5cGVUeXBlCisJICogQHNlZSAjaXNTZXRMb2NrKCkKKwkgKiBAc2VlICN1bnNldExvY2soKQorCSAqIEBzZWUgI2dldExvY2soKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldExvY2soQ29uY3VycmVudExvY2tUeXBlVHlwZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbmN1cnJlbnRNZXRob2RUeXBlI2dldExvY2sgPGVtPkxvY2s8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0TG9jaygpCisJICogQHNlZSAjZ2V0TG9jaygpCisJICogQHNlZSAjc2V0TG9jayhDb25jdXJyZW50TG9ja1R5cGVUeXBlKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHVuc2V0TG9jaygpOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TWV0aG9kVHlwZSNnZXRMb2NrIDxlbT5Mb2NrPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NrPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogQHNlZSAjdW5zZXRMb2NrKCkKKwkgKiBAc2VlICNnZXRMb2NrKCkKKwkgKiBAc2VlICNzZXRMb2NrKENvbmN1cnJlbnRMb2NrVHlwZVR5cGUpCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNTZXRMb2NrKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgVGltZW91dDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIFRpbWVvdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIFRpbWVvdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEFjY2Vzc1RpbWVvdXQoQWNjZXNzVGltZW91dFR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENvbmN1cnJlbnRNZXRob2RUeXBlX0FjY2Vzc1RpbWVvdXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBY2Nlc3NUaW1lb3V0VHlwZSBnZXRBY2Nlc3NUaW1lb3V0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TWV0aG9kVHlwZSNnZXRBY2Nlc3NUaW1lb3V0IDxlbT5BY2Nlc3MgVGltZW91dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIFRpbWVvdXQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEFjY2Vzc1RpbWVvdXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFjY2Vzc1RpbWVvdXQoQWNjZXNzVGltZW91dFR5cGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJZChTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENvbmN1cnJlbnRNZXRob2RUeXBlX0lkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TWV0aG9kVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBDb25jdXJyZW50TWV0aG9kVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Db250YWluZXJUcmFuc2FjdGlvblR5cGUuamF2YQppbmRleCAyZDQyMmFjLi43Mjg0MDMwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Db250YWluZXJUcmFuc2FjdGlvblR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9Db250YWluZXJUcmFuc2FjdGlvblR5cGUuamF2YQpAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKIAogLyoqCkBAIC0yMiwxMyArMjMsMTQgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgY29udGFpbmVyLXRyYW5zYWN0aW9uVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIKLSAqIAltdXN0IG1hbmFnZSB0cmFuc2FjdGlvbiBzY29wZXMgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4ncwotICogCW1ldGhvZCBpbnZvY2F0aW9ucy4gSXQgZGVmaW5lcyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYQotICogCWxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLCBhbmQgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUuIFRoZQotICogCXRyYW5zYWN0aW9uIGF0dHJpYnV0ZSBpcyB0byBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3BlY2lmaWVkCi0gKiAJbWV0aG9kcy4KLSAqIAorICogICAgICAgICBUaGUgY29udGFpbmVyLXRyYW5zYWN0aW9uVHlwZSBzcGVjaWZpZXMgaG93IHRoZSBjb250YWluZXIKKyAqICAgICAgICAgbXVzdCBtYW5hZ2UgdHJhbnNhY3Rpb24gc2NvcGVzIGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MKKyAqICAgICAgICAgbWV0aG9kIGludm9jYXRpb25zLiBJdCBkZWZpbmVzIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBhCisgKiAgICAgICAgIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLCBhbmQgYSB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUuIFRoZQorICogICAgICAgICB0cmFuc2FjdGlvbiBhdHRyaWJ1dGUgaXMgdG8gYmUgYXBwbGllZCB0byBhbGwgdGhlIHNwZWNpZmllZAorICogICAgICAgICBtZXRob2RzLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNjAsNyArNjIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNzUsMTEgKzc3LDEwIEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9NZXRob2RzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRNZXRob2RzKCk7CisJTGlzdDxNZXRob2RUeXBlPiBnZXRNZXRob2RzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFucyBBdHRyaWJ1dGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iTm90U3VwcG9ydGVkIjwvY29kZT4uCiAJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlfS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRGVwZW5kc09uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRGVwZW5kc09uVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Nzk0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9EZXBlbmRzT25UeXBlLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlcGVuZHMgT24gVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKyAqIAorICogCisgKiAgICAgICAgIFRoZSBkZXBlbmRzLW9uVHlwZSBpcyB1c2VkIHRvIGV4cHJlc3MgaW5pdGlhbGl6YXRpb24gCisgKiAgICAgICAgIG9yZGVyaW5nIGRlcGVuZGVuY2llcyBiZXR3ZWVuIFNpbmdsZXRvbiBjb21wb25lbnRzLgorICogICAgICAgICBUaGUgZGVwZW5kcy1vblR5cGUgc3BlY2lmaWVzIHRoZSBuYW1lcyBvZiBvbmUgb3IgbW9yZQorICogICAgICAgICBTaW5nbGV0b24gYmVhbnMgaW4gdGhlIHNhbWUgYXBwbGljYXRpb24gYXMgdGhlIHJlZmVycmluZworICogICAgICAgICBTaW5nbGV0b24sIGVhY2ggb2Ygd2hpY2ggbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUKKyAqICAgICAgICAgdGhlIHJlZmVycmluZyBiZWFuLiAgCisgKiAgICAgICAgIAorICogICAgICAgICBFYWNoIGRlcGVuZGVudCBiZWFuIGlzIGV4cHJlc3NlZCB1c2luZyBlamItbGluayBzeW50YXguCisgKiAgICAgICAgIFRoZSBvcmRlciBpbiB3aGljaCBkZXBlbmRlbnQgYmVhbnMgYXJlIGluaXRpYWxpemVkIGF0IAorICogICAgICAgICBydW50aW1lIGlzIG5vdCBndWFyYW50ZWVkIHRvIG1hdGNoIHRoZSBvcmRlciBpbiB3aGljaAorICogICAgICAgICB0aGV5IGFyZSBsaXN0ZWQuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBFSkIgMy4xCisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5EZXBlbmRzT25UeXBlI2dldEVqYk5hbWUgPGVtPkVqYiBOYW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5EZXBlbmRzT25UeXBlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXREZXBlbmRzT25UeXBlKCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIERlcGVuZHNPblR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXREZXBlbmRzT25UeXBlX0VqYk5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PFN0cmluZz4gZ2V0RWpiTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJZChTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldERlcGVuZHNPblR5cGVfSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0SWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkRlcGVuZHNPblR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gRGVwZW5kc09uVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRUpCSmFyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJKYXIuamF2YQppbmRleCA0NjExY2EwLi45YmQwZGFkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJKYXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJKYXIuamF2YQpAQCAtMTIsNiArMTIsOSBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CiAKIC8qKgpAQCAtMjIsMjkgKzI1LDM1IEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIGVqYi1qYXJUeXBlIGRlZmluZXMgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgRUpCCi0gKiAJZGVwbG95bWVudCBkZXNjcmlwdG9yLiBJdCBjb250YWlucwotICogCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGVqYi1qYXIgZmlsZQotICogCSAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQotICogCSAgICAtIGFuIG9wdGlvbmFsIGljb24gdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gKiAJICAgICAgaWNvbiBmaWxlIG5hbWUKLSAqIAkgICAgLSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGFsbCBpbmNsdWRlZAotICogCSAgICAgIGVudGVycHJpc2UgYmVhbnMgdGhhdCBpcyBub3Qgc3BlY2lmaWVkIHRocm91Z2gKLSAqICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMKLSAqICAgICAgICAgICAgIC0gc3RydWN0dXJhbCBpbmZvcm1hdGlvbiBhYm91dCBpbnRlcmNlcHRvciBjbGFzc2VzCi0gKiAJICAgIC0gYSBkZXNjcmlwdG9yIGZvciBjb250YWluZXIgbWFuYWdlZCByZWxhdGlvbnNoaXBzLAotICogCSAgICAgIGlmIGFueS4KLSAqIAkgICAgLSBhbiBvcHRpb25hbCBhcHBsaWNhdGlvbi1hc3NlbWJseSBkZXNjcmlwdG9yCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgbmFtZSBvZiBhbiBlamItY2xpZW50LWphciBmaWxlIGZvciB0aGUKLSAqIAkgICAgICBlamItamFyLgotICogCisgKiAgICAgICAgIFRoZSBlamItamFyVHlwZSBkZWZpbmVzIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIEVKQgorICogICAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IGNvbnRhaW5zCisgKiAgICAgICAgIAorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlamItamFyIGZpbGUKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBpY29uIHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQorICogICAgICAgICBpY29uIGZpbGUgbmFtZQorICogICAgICAgICAtIGFuIG9wdGlvbmFsIG1vZHVsZSBuYW1lLiBPbmx5IGFwcGxpY2FibGUgdG8KKyAqICAgICAgICAgc3RhbmQtYWxvbmUgZWpiLWphcnMgb3IgZWpiLWphcnMgcGFja2FnZWQgaW4gYW4gZWFyLgorICogICAgICAgICBJZ25vcmVkIGlmIHNwZWNpZmllZCBmb3IgYW4gZWpiLWphci54bWwgd2l0aGluIGEgLndhci4KKyAqICAgICAgICAgSW4gdGhhdCBjYXNlLCBzdGFuZGFyZCAud2FyIG1vZHVsZS1uYW1lIHJ1bGVzIGFwcGx5LgorICogICAgICAgICAtIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGluY2x1ZGVkCisgKiAgICAgICAgIGVudGVycHJpc2UgYmVhbnMgdGhhdCBpcyBub3Qgc3BlY2lmaWVkIHRocm91Z2gKKyAqICAgICAgICAgYW5ub3RhdGlvbnMKKyAqICAgICAgICAgLSBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIGFib3V0IGludGVyY2VwdG9yIGNsYXNzZXMKKyAqICAgICAgICAgLSBhIGRlc2NyaXB0b3IgZm9yIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMsIAorICogICAgICAgICBpZiBhbnkuIAorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGFwcGxpY2F0aW9uLWFzc2VtYmx5IGRlc2NyaXB0b3IKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBuYW1lIG9mIGFuIGVqYi1jbGllbnQtamFyIGZpbGUgZm9yIHRoZSAKKyAqICAgICAgICAgZWpiLWphci4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKICAqIDxwPgogICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgogICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphciNnZXRNb2R1bGVOYW1lIDxlbT5Nb2R1bGUgTmFtZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KQEAgLTc3LDcgKzg2LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCSmFyX0Rlc2NyaXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7CisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTkyLDcgKzEwMSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQkphcl9EaXNwbGF5TmFtZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOworCUxpc3Q8RGlzcGxheU5hbWU+IGdldERpc3BsYXlOYW1lcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTA3LDcgKzExNiwzMyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJfSWNvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEljb25zKCk7CisJTGlzdDxJY29uPiBnZXRJY29ucygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW9kdWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIEVKQiAzLjEKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNb2R1bGVOYW1lKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCSmFyX01vZHVsZU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0TW9kdWxlTmFtZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldE1vZHVsZU5hbWUgPGVtPk1vZHVsZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2R1bGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TW9kdWxlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TW9kdWxlTmFtZShTdHJpbmcgdmFsdWUpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZSBCZWFuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtMTkxLDExICsyMjYsMTIgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFByb3ZpZGluZyBhbiBhc3NlbWJseS1kZXNjcmlwdG9yIGluIHRoZSBkZXBsb3ltZW50Ci0JICogCSAgICBkZXNjcmlwdG9yIGlzIG9wdGlvbmFsIGZvciB0aGUgZWpiLWphciBmaWxlCi0JICogCSAgICBwcm9kdWNlci4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBQcm92aWRpbmcgYW4gYXNzZW1ibHktZGVzY3JpcHRvciBpbiB0aGUgZGVwbG95bWVudAorCSAqICAgICAgICAgICAgIGRlc2NyaXB0b3IgaXMgb3B0aW9uYWwgZm9yIHRoZSBlamItamFyIG9yIC53YXIgZmlsZQorCSAqICAgICAgICAgICAgIHByb2R1Y2VyLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgogCSAqIEBzZWUgI3NldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IpCkBAIC0yMjAsMjAgKzI1NiwyMCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAotCSAqIAkgICAgCi0JICogCi0JICogCSAgICAgIFRoZSBvcHRpb25hbCBlamItY2xpZW50LWphciBlbGVtZW50IHNwZWNpZmllcyBhIEpBUgotCSAqIAkgICAgICBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGNsYXNzIGZpbGVzIG5lY2Vzc2FyeSBmb3IgYQotCSAqIAkgICAgICBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlCi0JICogCSAgICAgIGVudGVycHJpc2UgYmVhbnMgaW4gdGhlIGVqYi1qYXIgZmlsZS4KLQkgKiAKLQkgKiAJICAgICAgRXhhbXBsZToKLQkgKiAKLQkgKiAJCSAgJmx0O2VqYi1jbGllbnQtamFyJmd0O2VtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphcgotCSAqIAkJICAmbHQ7L2VqYi1jbGllbnQtamFyJmd0OwotCSAqIAotCSAqIAkgICAgICAKLQkgKiAJICAKKwkgKiA8IVtDREFUQVtbCisJICogICAgICAgICAgICAgVGhlIG9wdGlvbmFsIGVqYi1jbGllbnQtamFyIGVsZW1lbnQgc3BlY2lmaWVzIGEgSkFSCisJICogICAgICAgICAgICAgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBjbGFzcyBmaWxlcyBuZWNlc3NhcnkgZm9yIGEKKwkgKiAgICAgICAgICAgICBjbGllbnQgcHJvZ3JhbSB0byBhY2Nlc3MgdGhlCisJICogICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFucyBpbiB0aGUgZWpiLWphciBmaWxlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEV4YW1wbGU6CisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgCSAgPGVqYi1jbGllbnQtamFyPmVtcGxveWVlX3NlcnZpY2VfY2xpZW50LmphcgorCSAqICAgICAgICAgICAgIAkgIDwvZWpiLWNsaWVudC1qYXI+CisJICogICAgICAgICAgICAgCisJICogXV0+CisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIENsaWVudCBKYXI8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldEVqYkNsaWVudEphcihTdHJpbmcpCkBAIC0yODQsMjUgKzMyMCwyNiBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoaXMKLQkgKiAJICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYW5kIG90aGVyIHJlbGF0ZWQgZGVwbG95bWVudAotCSAqIAkgIGRlc2NyaXB0b3JzIGZvciB0aGlzIG1vZHVsZSAoZS5nLiwgd2ViIHNlcnZpY2UKLQkgKiAJICBkZXNjcmlwdG9ycykgYXJlIGNvbXBsZXRlLCBvciB3aGV0aGVyIHRoZSBjbGFzcwotCSAqIAkgIGZpbGVzIGF2YWlsYWJsZSB0byB0aGlzIG1vZHVsZSBhbmQgcGFja2FnZWQgd2l0aAotCSAqIAkgIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkIGJlIGV4YW1pbmVkIGZvciBhbm5vdGF0aW9ucwotCSAqIAkgIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIAkgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIHNldCB0byAidHJ1ZSIsIHRoZSBkZXBsb3ltZW50Ci0JICogCSAgdG9vbCBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQKLQkgKiAJICBpbmZvcm1hdGlvbiwgd2hpY2ggbWlnaHQgYmUgcHJlc2VudCBpbiB0aGUgY2xhc3MgZmlsZXMKLQkgKiAJICBvZiB0aGUgYXBwbGljYXRpb24uCi0JICogCi0JICogCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgbm90IHNwZWNpZmllZCBvciBpcyBzZXQgdG8KLQkgKiAJICAiZmFsc2UiLCB0aGUgZGVwbG95bWVudCB0b29sIG11c3QgZXhhbWluZSB0aGUgY2xhc3MKLQkgKiAJICBmaWxlcyBvZiB0aGUgYXBwbGljYXRpb24gZm9yIGFubm90YXRpb25zLCBhcwotCSAqIAkgIHNwZWNpZmllZCBieSB0aGUgc3BlY2lmaWNhdGlvbnMuCi0JICogCi0JICogCQorCSAqICAgICAgICAgICBUaGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGRlZmluZXMgd2hldGhlciB0aGlzCisJICogICAgICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgb3RoZXIgcmVsYXRlZCBkZXBsb3ltZW50CisJICogICAgICAgICAgIGRlc2NyaXB0b3JzIGZvciB0aGlzIG1vZHVsZSAoZS5nLiwgd2ViIHNlcnZpY2UKKwkgKiAgICAgICAgICAgZGVzY3JpcHRvcnMpIGFyZSBjb21wbGV0ZSwgb3Igd2hldGhlciB0aGUgY2xhc3MKKwkgKiAgICAgICAgICAgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCisJICogICAgICAgICAgIHRoaXMgYXBwbGljYXRpb24gc2hvdWxkIGJlIGV4YW1pbmVkIGZvciBhbm5vdGF0aW9ucworCSAqICAgICAgICAgICB0aGF0IHNwZWNpZnkgZGVwbG95bWVudCBpbmZvcm1hdGlvbi4KKwkgKiAgICAgICAgICAgCisJICogICAgICAgICAgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIHNldCB0byAidHJ1ZSIsIHRoZSBkZXBsb3ltZW50CisJICogICAgICAgICAgIHRvb2wgbXVzdCBpZ25vcmUgYW55IGFubm90YXRpb25zIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50CisJICogICAgICAgICAgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcworCSAqICAgICAgICAgICBvZiB0aGUgYXBwbGljYXRpb24uCisJICogICAgICAgICAgIAorCSAqICAgICAgICAgICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bworCSAqICAgICAgICAgICAiZmFsc2UiLCB0aGUgZGVwbG95bWVudCB0b29sIG11c3QgZXhhbWluZSB0aGUgY2xhc3MKKwkgKiAgICAgICAgICAgZmlsZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBhbm5vdGF0aW9ucywgYXMKKwkgKiAgICAgICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucy4KKwkgKiAgICAgICAgICAgCisJICogICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKKwkgKiAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkKQEAgLTM1MCwyMCArMzg3LDIxIEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjMuMCI8L2NvZGU+LgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIzLjEiPC9jb2RlPi4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgIFRoZSB2ZXJzaW9uIHNwZWNpZmllcyB0aGUgdmVyc2lvbiBvZiB0aGUKLQkgKiAJICBFSkIgc3BlY2lmaWNhdGlvbiB0aGF0IHRoZSBpbnN0YW5jZSBkb2N1bWVudCBtdXN0Ci0JICogCSAgY29tcGx5IHdpdGguIFRoaXMgaW5mb3JtYXRpb24gZW5hYmxlcyBkZXBsb3ltZW50IHRvb2xzCi0JICogCSAgdG8gdmFsaWRhdGUgYSBwYXJ0aWN1bGFyIEVKQiBEZXBsb3ltZW50Ci0JICogCSAgRGVzY3JpcHRvciB3aXRoIHJlc3BlY3QgdG8gYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBFSkIKLQkgKiAJICBzY2hlbWEuCi0JICogCi0JICogCQorCSAqICAgICAgICAgICBUaGUgdmVyc2lvbiBzcGVjaWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlCisJICogICAgICAgICAgIEVKQiBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIGluc3RhbmNlIGRvY3VtZW50IG11c3QgCisJICogICAgICAgICAgIGNvbXBseSB3aXRoLiBUaGlzIGluZm9ybWF0aW9uIGVuYWJsZXMgZGVwbG95bWVudCB0b29scworCSAqICAgICAgICAgICB0byB2YWxpZGF0ZSBhIHBhcnRpY3VsYXIgRUpCIERlcGxveW1lbnQKKwkgKiAgICAgICAgICAgRGVzY3JpcHRvciB3aXRoIHJlc3BlY3QgdG8gYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBFSkIKKwkgKiAgICAgICAgICAgc2NoZW1hLiAKKwkgKiAgICAgICAgICAgCisJICogICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKKwkgKiAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNpc1NldFZlcnNpb24oKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VKQkphckRlcGxveW1lbnREZXNjcmlwdG9yLmphdmEKaW5kZXggZmMzYjc2OS4uZTIzNjEwYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhCkBAIC02NSw3ICs2NSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTWFwIGdldFhNTE5TUHJlZml4TWFwKCk7CisJTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYTUxOU1ByZWZpeE1hcCgpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgpAQCAtODEsNyArODEsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCU1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOworCU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBKYXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTkwLDggKzkwLDkgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJVGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgZWpiLWphciBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCi0JICogCisJICogICAgICAgICBUaGlzIGlzIHRoZSByb290IG9mIHRoZSBlamItamFyIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKwkgKiAgICAgICAgIAorCSAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogCSAqICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgSmFyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VKQlJlbGF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJSZWxhdGlvbi5qYXZhCmluZGV4IDlkM2MyZTguLjc0ZDAxMWQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VKQlJlbGF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRUpCUmVsYXRpb24uamF2YQpAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKIAogLyoqCkBAIC0yMiwxNSArMjMsMTYgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgZWpiLXJlbGF0aW9uVHlwZSBkZXNjcmliZXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28KLSAqIAllbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gIEl0IGlzIHVzZWQKLSAqIAlieSBlamItcmVsYXRpb24gZWxlbWVudHMuIEl0IGNvbnRhaW5zIGEgZGVzY3JpcHRpb247IGFuCi0gKiAJb3B0aW9uYWwgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudDsgYW5kIGV4YWN0bHkgdHdvCi0gKiAJcmVsYXRpb25zaGlwIHJvbGUgZGVjbGFyYXRpb25zLCBkZWZpbmVkIGJ5IHRoZQotICogCWVqYi1yZWxhdGlvbnNoaXAtcm9sZSBlbGVtZW50cy4gVGhlIG5hbWUgb2YgdGhlCi0gKiAJcmVsYXRpb25zaGlwLCBpZiBzcGVjaWZpZWQsIGlzIHVuaXF1ZSB3aXRoaW4gdGhlIGVqYi1qYXIKLSAqIAlmaWxlLgotICogCisgKiAgICAgICAgIFRoZSBlamItcmVsYXRpb25UeXBlIGRlc2NyaWJlcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3bworICogICAgICAgICBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4gIEl0IGlzIHVzZWQKKyAqICAgICAgICAgYnkgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLiBJdCBjb250YWlucyBhIGRlc2NyaXB0aW9uOyBhbgorICogICAgICAgICBvcHRpb25hbCBlamItcmVsYXRpb24tbmFtZSBlbGVtZW50OyBhbmQgZXhhY3RseSB0d28KKyAqICAgICAgICAgcmVsYXRpb25zaGlwIHJvbGUgZGVjbGFyYXRpb25zLCBkZWZpbmVkIGJ5IHRoZQorICogICAgICAgICBlamItcmVsYXRpb25zaGlwLXJvbGUgZWxlbWVudHMuIFRoZSBuYW1lIG9mIHRoZQorICogICAgICAgICByZWxhdGlvbnNoaXAsIGlmIHNwZWNpZmllZCwgaXMgdW5pcXVlIHdpdGhpbiB0aGUgZWpiLWphcgorICogICAgICAgICBmaWxlLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNjIsNyArNjQsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlbGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTcxLDEwICs3MywxMSBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIGVqYi1yZWxhdGlvbi1uYW1lIGVsZW1lbnQgcHJvdmlkZXMgYSB1bmlxdWUgbmFtZQotCSAqIAkgICAgd2l0aGluIHRoZSBlamItamFyIGZpbGUgZm9yIGEgcmVsYXRpb25zaGlwLgotCSAqIAotCSAqIAkgICAgICAKKwkgKiAgICAgICAgICAgICBUaGUgZWpiLXJlbGF0aW9uLW5hbWUgZWxlbWVudCBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lCisJICogICAgICAgICAgICAgd2l0aGluIHRoZSBlamItamFyIGZpbGUgZm9yIGEgcmVsYXRpb25zaGlwLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWxhdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRFamJSZWxhdGlvbk5hbWUoU3RyaW5nKQpAQCAtMTA2LDcgKzEwOSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVKQlJlbGF0aW9uX0VqYlJlbGF0aW9uc2hpcFJvbGVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRFamJSZWxhdGlvbnNoaXBSb2xlcygpOworCUxpc3Q8RUpCUmVsYXRpb25zaGlwUm9sZT4gZ2V0RWpiUmVsYXRpb25zaGlwUm9sZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJSZWxhdGlvbnNoaXBSb2xlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FSkJSZWxhdGlvbnNoaXBSb2xlLmphdmEKaW5kZXggMDI5OGVjMi4uMGIxZTY0ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRUpCUmVsYXRpb25zaGlwUm9sZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VKQlJlbGF0aW9uc2hpcFJvbGUuamF2YQpAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwogCkBAIC0yMiw0NiArMjMsNDYgQEAKICAqCiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAotICogCQotICogCi0gKiAJICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhCi0gKiAJICByZWxhdGlvbnNoaXAuIFRoZXJlIGFyZSB0d28gcm9sZXMgaW4gZWFjaCByZWxhdGlvbnNoaXAuCi0gKiAKLSAqIAkgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi0gKiAJICBkZXNjcmlwdGlvbjsgYW4gb3B0aW9uYWwgbmFtZSBmb3IgdGhlIHJlbGF0aW9uc2hpcCByb2xlOyBhCi0gKiAJICBzcGVjaWZpY2F0aW9uIG9mIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIHJvbGU7IGFuIG9wdGlvbmFsCi0gKiAJICBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOwotICogCSAgdGhlIHJvbGUgc291cmNlOyBhbmQgYSBkZWNsYXJhdGlvbiBvZiB0aGUgY21yLWZpZWxkLCBpZiBhbnksCi0gKiAJICBieSBtZWFucyBvZiB3aGljaCB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGlzCi0gKiAJICBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuCi0gKiAKLSAqIAkgIFRoZSBtdWx0aXBsaWNpdHkgYW5kIHJvbGUtc291cmNlIGVsZW1lbnQgYXJlIG1hbmRhdG9yeS4KLSAqIAotICogCSAgVGhlIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IGRlc2lnbmF0ZXMgYW4gZW50aXR5Ci0gKiAJICBiZWFuIGJ5IG1lYW5zIG9mIGFuIGVqYi1uYW1lIGVsZW1lbnQuIEZvciBiaWRpcmVjdGlvbmFsCi0gKiAJICByZWxhdGlvbnNoaXBzLCBib3RoIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhCi0gKiAJICByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgZWxlbWVudCB0aGF0IHNwZWNpZmllcyBhIGNtci1maWVsZAotICogCSAgaW4gdGVybXMgb2Ygd2hpY2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBhY2Nlc3NlZC4gVGhlIGxhY2sgb2YKLSAqIAkgIGEgY21yLWZpZWxkIGVsZW1lbnQgaW4gYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcwotICogCSAgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGlzIHVuaWRpcmVjdGlvbmFsIGluIG5hdmlnYWJpbGl0eSBhbmQKLSAqIAkgIHRoZSBlbnRpdHkgYmVhbiB0aGF0IHBhcnRpY2lwYXRlcyBpbiB0aGUgcmVsYXRpb25zaGlwIGlzCi0gKiAJICAibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgotICogCi0gKiAJICBFeGFtcGxlOgotICogCi0gKiAJICAmbHQ7ZWpiLXJlbGF0aW9uJmd0OwotICogCSAgICAgICZsdDtlamItcmVsYXRpb24tbmFtZSZndDtQcm9kdWN0LUxpbmVJdGVtJmx0Oy9lamItcmVsYXRpb24tbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7ZWpiLXJlbGF0aW9uc2hpcC1yb2xlJmd0OwotICogCQkgICZsdDtlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSZndDtwcm9kdWN0LWhhcy1saW5laXRlbXMKLSAqIAkJICAmbHQ7L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lJmd0OwotICogCQkgICZsdDttdWx0aXBsaWNpdHkmZ3Q7T25lJmx0Oy9tdWx0aXBsaWNpdHkmZ3Q7Ci0gKiAJCSAgJmx0O3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSZndDsKLSAqIAkJICAmbHQ7ZWpiLW5hbWUmZ3Q7UHJvZHVjdEVKQiZsdDsvZWpiLW5hbWUmZ3Q7Ci0gKiAJCSAgJmx0Oy9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UmZ3Q7Ci0gKiAJICAgICAgICZsdDsvZWpiLXJlbGF0aW9uc2hpcC1yb2xlJmd0OwotICogCSAgJmx0Oy9lamItcmVsYXRpb24mZ3Q7Ci0gKiAKLSAqIAkgIAorICogPCFbQ0RBVEFbWworICogICAgICAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlVHlwZSBkZXNjcmliZXMgYSByb2xlIHdpdGhpbiBhCisgKiAgICAgICAgIHJlbGF0aW9uc2hpcC4gVGhlcmUgYXJlIHR3byByb2xlcyBpbiBlYWNoIHJlbGF0aW9uc2hpcC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGVUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCisgKiAgICAgICAgIGRlc2NyaXB0aW9uOyBhbiBvcHRpb25hbCBuYW1lIGZvciB0aGUgcmVsYXRpb25zaGlwIHJvbGU7IGEKKyAqICAgICAgICAgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSByb2xlOyBhbiBvcHRpb25hbAorICogICAgICAgICBzcGVjaWZpY2F0aW9uIG9mIGNhc2NhZGUtZGVsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSByb2xlOworICogICAgICAgICB0aGUgcm9sZSBzb3VyY2U7IGFuZCBhIGRlY2xhcmF0aW9uIG9mIHRoZSBjbXItZmllbGQsIGlmIGFueSwKKyAqICAgICAgICAgYnkgbWVhbnMgb2Ygd2hpY2ggdGhlIG90aGVyIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBpcworICogICAgICAgICBhY2Nlc3NlZCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgcm9sZSBzb3VyY2UuCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgbXVsdGlwbGljaXR5IGFuZCByb2xlLXNvdXJjZSBlbGVtZW50IGFyZSBtYW5kYXRvcnkuCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGVsZW1lbnQgZGVzaWduYXRlcyBhbiBlbnRpdHkKKyAqICAgICAgICAgYmVhbiBieSBtZWFucyBvZiBhbiBlamItbmFtZSBlbGVtZW50LiBGb3IgYmlkaXJlY3Rpb25hbAorICogICAgICAgICByZWxhdGlvbnNoaXBzLCBib3RoIHJvbGVzIG9mIGEgcmVsYXRpb25zaGlwIG11c3QgZGVjbGFyZSBhCisgKiAgICAgICAgIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHRoYXQgc3BlY2lmaWVzIGEgY21yLWZpZWxkCisgKiAgICAgICAgIGluIHRlcm1zIG9mIHdoaWNoIHRoZSByZWxhdGlvbnNoaXAgaXMgYWNjZXNzZWQuIFRoZSBsYWNrIG9mCisgKiAgICAgICAgIGEgY21yLWZpZWxkIGVsZW1lbnQgaW4gYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlIHNwZWNpZmllcworICogICAgICAgICB0aGF0IHRoZSByZWxhdGlvbnNoaXAgaXMgdW5pZGlyZWN0aW9uYWwgaW4gbmF2aWdhYmlsaXR5IGFuZAorICogICAgICAgICB0aGUgZW50aXR5IGJlYW4gdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIHJlbGF0aW9uc2hpcCBpcworICogICAgICAgICAibm90IGF3YXJlIiBvZiB0aGUgcmVsYXRpb25zaGlwLgorICogICAgICAgICAKKyAqICAgICAgICAgRXhhbXBsZToKKyAqICAgICAgICAgCisgKiAgICAgICAgIDxlamItcmVsYXRpb24+CisgKiAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5Qcm9kdWN0LUxpbmVJdGVtPC9lamItcmVsYXRpb24tbmFtZT4KKyAqICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KKyAqICAgICAgICAgCSAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnByb2R1Y3QtaGFzLWxpbmVpdGVtcworICogICAgICAgICAJICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgorICogICAgICAgICAJICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgorICogICAgICAgICAJICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgorICogICAgICAgICAJICA8ZWpiLW5hbWU+UHJvZHVjdEVKQjwvZWpiLW5hbWU+CisgKiAgICAgICAgIAkgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgorICogICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KKyAqICAgICAgICAgPC9lamItcmVsYXRpb24+CisgKiAgICAgICAgIAorICogXV0+CisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTk2LDcgKzk3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlbGF0aW9uc2hpcCBSb2xlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTEwNSwxMiArMTA2LDEzIEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWUgZWxlbWVudCBkZWZpbmVzIGEKLQkgKiAJICAgIG5hbWUgZm9yIGEgcm9sZSB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYW4KLQkgKiAJICAgIGVqYi1yZWxhdGlvbi4gRGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgY2FuIHVzZSB0aGUKLQkgKiAJICAgIHNhbWUgbmFtZSBmb3IgYSByb2xlLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSBlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZSBlbGVtZW50IGRlZmluZXMgYQorCSAqICAgICAgICAgICAgIG5hbWUgZm9yIGEgcm9sZSB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gYW4KKwkgKiAgICAgICAgICAgICBlamItcmVsYXRpb24uIERpZmZlcmVudCByZWxhdGlvbnNoaXBzIGNhbiB1c2UgdGhlCisJICogICAgICAgICAgICAgc2FtZSBuYW1lIGZvciBhIHJvbGUuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlbGF0aW9uc2hpcCBSb2xlIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKFN0cmluZykKQEAgLTEzMSw3ICsxMzMsNiBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Ik9uZSI8L2NvZGU+LgogCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk11bHRpcGxpY2l0eVR5cGV9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CkBAIC0xOTIsMTYgKzE5MywxNyBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQsIHdpdGhpbiBhCi0JICogCSAgICBwYXJ0aWN1bGFyIHJlbGF0aW9uc2hpcCwgdGhlIGxpZmV0aW1lIG9mIG9uZSBvciBtb3JlCi0JICogCSAgICBlbnRpdHkgYmVhbnMgaXMgZGVwZW5kZW50IHVwb24gdGhlIGxpZmV0aW1lIG9mCi0JICogCSAgICBhbm90aGVyIGVudGl0eSBiZWFuLiBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBjYW4KLQkgKiAJICAgIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhbiBlamItcmVsYXRpb25zaGlwLXJvbGUKLQkgKiAJICAgIGVsZW1lbnQgY29udGFpbmVkIGluIGFuIGVqYi1yZWxhdGlvbiBlbGVtZW50IGluCi0JICogCSAgICB3aGljaCB0aGUgb3RoZXIgZWpiLXJlbGF0aW9uc2hpcC1yb2xlCi0JICogCSAgICBlbGVtZW50IHNwZWNpZmllcyBhIG11bHRpcGxpY2l0eSBvZiBPbmUuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIGNhc2NhZGUtZGVsZXRlIGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQsIHdpdGhpbiBhCisJICogICAgICAgICAgICAgcGFydGljdWxhciByZWxhdGlvbnNoaXAsIHRoZSBsaWZldGltZSBvZiBvbmUgb3IgbW9yZQorCSAqICAgICAgICAgICAgIGVudGl0eSBiZWFucyBpcyBkZXBlbmRlbnQgdXBvbiB0aGUgbGlmZXRpbWUgb2YKKwkgKiAgICAgICAgICAgICBhbm90aGVyIGVudGl0eSBiZWFuLiBUaGUgY2FzY2FkZS1kZWxldGUgZWxlbWVudCBjYW4KKwkgKiAgICAgICAgICAgICBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYW4gZWpiLXJlbGF0aW9uc2hpcC1yb2xlCisJICogICAgICAgICAgICAgZWxlbWVudCBjb250YWluZWQgaW4gYW4gZWpiLXJlbGF0aW9uIGVsZW1lbnQgaW4KKwkgKiAgICAgICAgICAgICB3aGljaCB0aGUgb3RoZXIgZWpiLXJlbGF0aW9uc2hpcC1yb2xlCisJICogICAgICAgICAgICAgZWxlbWVudCBzcGVjaWZpZXMgYSBtdWx0aXBsaWNpdHkgb2YgT25lLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgRGVsZXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiBAc2VlICNzZXRDYXNjYWRlRGVsZXRlKEVtcHR5VHlwZSkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VqYkZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VqYkZhY3RvcnkuamF2YQppbmRleCA0MGEyMjI0Li5lZjFkYTdlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FamJGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRWpiRmFjdG9yeS5qYXZhCkBAIC0xMSw2ICsxMSw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKIAogLyoqCkBAIC0zMSw2ICszMiwxNSBAQAogCUVqYkZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJGYWN0b3J5SW1wbC5pbml0KCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjY2VzcyBUaW1lb3V0IFR5cGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjY2VzcyBUaW1lb3V0IFR5cGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUFjY2Vzc1RpbWVvdXRUeXBlIGNyZWF0ZUFjY2Vzc1RpbWVvdXRUeXBlKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC02Nyw2ICs3NywxNSBAQAogCUFyb3VuZEludm9rZVR5cGUgY3JlYXRlQXJvdW5kSW52b2tlVHlwZSgpOwogCiAJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Bcm91bmQgVGltZW91dCBUeXBlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Bcm91bmQgVGltZW91dCBUeXBlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBcm91bmRUaW1lb3V0VHlwZSBjcmVhdGVBcm91bmRUaW1lb3V0VHlwZSgpOworCisJLyoqCiAJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC03Niw2ICs5NSwxNSBAQAogCUFzc2VtYmx5RGVzY3JpcHRvciBjcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKIAogCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXN5bmMgTWV0aG9kIFR5cGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFzeW5jIE1ldGhvZCBUeXBlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBc3luY01ldGhvZFR5cGUgY3JlYXRlQXN5bmNNZXRob2RUeXBlKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNNUCBGaWVsZDwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtOTQsNiArMTIyLDE1IEBACiAJQ01SRmllbGQgY3JlYXRlQ01SRmllbGQoKTsKIAogCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uY3VycmVudCBNZXRob2QgVHlwZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29uY3VycmVudCBNZXRob2QgVHlwZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ29uY3VycmVudE1ldGhvZFR5cGUgY3JlYXRlQ29uY3VycmVudE1ldGhvZFR5cGUoKTsKKworCS8qKgogCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGFpbmVyIFRyYW5zYWN0aW9uIFR5cGU8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTEwMyw2ICsxNDAsMTUgQEAKIAlDb250YWluZXJUcmFuc2FjdGlvblR5cGUgY3JlYXRlQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlcGVuZHMgT24gVHlwZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVwZW5kcyBPbiBUeXBlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlEZXBlbmRzT25UeXBlIGNyZWF0ZURlcGVuZHNPblR5cGUoKTsKKworCS8qKgogCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RUpCIEphcjwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzE5LDYgKzM2NSwzMyBAQAogCVNlc3Npb25CZWFuIGNyZWF0ZVNlc3Npb25CZWFuKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0YXRlZnVsIFRpbWVvdXQgVHlwZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3RhdGVmdWwgVGltZW91dCBUeXBlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdGF0ZWZ1bFRpbWVvdXRUeXBlIGNyZWF0ZVN0YXRlZnVsVGltZW91dFR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZXIgU2NoZWR1bGUgVHlwZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZXIgU2NoZWR1bGUgVHlwZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGltZXJTY2hlZHVsZVR5cGUgY3JlYXRlVGltZXJTY2hlZHVsZVR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZXIgVHlwZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZXIgVHlwZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJVGltZXJUeXBlIGNyZWF0ZVRpbWVyVHlwZSgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FbnRlcnByaXNlQmVhbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VudGVycHJpc2VCZWFucy5qYXZhCmluZGV4IGZhZGRiOTcuLjZiM2QwZGQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VudGVycHJpc2VCZWFucy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VudGVycHJpc2VCZWFucy5qYXZhCkBAIC0yNCwxMCArMjQsMTEgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgZW50ZXJwcmlzZS1iZWFuc1R5cGUgZGVjbGFyZXMgb25lIG9yIG1vcmUgZW50ZXJwcmlzZQotICogCWJlYW5zLiBFYWNoIGJlYW4gY2FuIGJlIGEgc2Vzc2lvbiwgZW50aXR5IG9yIG1lc3NhZ2UtZHJpdmVuCi0gKiAJYmVhbi4KLSAqIAorICogICAgICAgICBUaGUgZW50ZXJwcmlzZS1iZWFuc1R5cGUgZGVjbGFyZXMgb25lIG9yIG1vcmUgZW50ZXJwcmlzZQorICogICAgICAgICBiZWFucy4gRWFjaCBiZWFuIGNhbiBiZSBhIHNlc3Npb24sIGVudGl0eSBvciBtZXNzYWdlLWRyaXZlbgorICogICAgICAgICBiZWFuLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNzUsNyArNzYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRlcnByaXNlQmVhbnNfU2Vzc2lvbkJlYW5zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRTZXNzaW9uQmVhbnMoKTsKKwlMaXN0PFNlc3Npb25CZWFuPiBnZXRTZXNzaW9uQmVhbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eSBCZWFuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC05MCw3ICs5MSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGVycHJpc2VCZWFuc19FbnRpdHlCZWFucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RW50aXR5QmVhbnMoKTsKKwlMaXN0PEVudGl0eUJlYW4+IGdldEVudGl0eUJlYW5zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERyaXZlbiBCZWFuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMDUsNyArMTA2LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50ZXJwcmlzZUJlYW5zX01lc3NhZ2VEcml2ZW5CZWFucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCk7CisJTGlzdDxNZXNzYWdlRHJpdmVuQmVhbj4gZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRW50aXR5QmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRW50aXR5QmVhbi5qYXZhCmluZGV4IDRmZGE1MjkuLmEwMDNjYzAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0VudGl0eUJlYW4uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FbnRpdHlCZWFuLmphdmEKQEAgLTEyLDcgKzEyLDIyIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWY7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTIyLDk2ICszNyw5NyBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSBlbnRpdHktYmVhblR5cGUgZGVjbGFyZXMgYW4gZW50aXR5IGJlYW4uIFRoZSBkZWNsYXJhdGlvbgotICogCWNvbnNpc3RzIG9mOgotICogCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlCi0gKiAJICAgICAgaWNvbiBmaWxlIG5hbWUKLSAqIAkgICAgLSBhIHVuaXF1ZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLSAqIAkgICAgICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAtIGFuIG9wdGlvbmFsIG1hcHBlZC1uYW1lIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlCi0gKiAgICAgICAgICAgICAgIHZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHBoeXNpY2FsCi0gKiAgICAgICAgICAgICAgIGpuZGktbmFtZSBvZiB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaG9tZSBpbnRlcmZhY2UuIFRoaXMKLSAqICAgICAgICAgICAgICAgZWxlbWVudCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gKiAgICAgICAgICAgICAgIEFueSB1c2Ugb2YgdGhpcyBlbGVtZW50IGlzIG5vbi1wb3J0YWJsZS4KLSAqIAkgICAgLSB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGhvbWUKLSAqIAkgICAgICBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGlmIGFueQotICogCSAgICAtIHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyBsb2NhbCBob21lIGFuZCBsb2NhbAotICogCSAgICAgIGludGVyZmFjZXMsIGlmIGFueQotICogCSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gKiAJICAgIC0gdGhlIG9wdGlvbmFsIGVudGl0eSBiZWFuJ3MgcGVyc2lzdGVuY2UgbWFuYWdlbWVudCB0eXBlLiBJZgotICogICAgICAgICAgICAgICB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCBpdCBpcyBkZWZhdWx0ZWQgdG8gQ29udGFpbmVyLgotICogCSAgICAtIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWUKLSAqIAkgICAgLSBhbiBpbmRpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlZW50cmFuY3kKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZQotICogCSAgICAgIGVudGl0eSBiZWFuJ3MgY21wLXZlcnNpb24KLSAqIAkgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzCi0gKiAJICAgICAgYWJzdHJhY3Qgc2NoZW1hIG5hbWUKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotICogCSAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHByaW1hcnkga2V5Ci0gKiAJICAgICAgZmllbGQKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50Ci0gKiAJICAgICAgZW50cmllcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCCi0gKiAJICAgICAgcmVmZXJlbmNlcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwKLSAqIAkgICAgICBFSkIgcmVmZXJlbmNlcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3Mgd2ViCi0gKiAJICAgICAgc2VydmljZSByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUKLSAqIAkgICAgICByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5Ci0gKiAJICAgICAgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmVhbidzIG1ldGhvZHMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzCi0gKiAJICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLSAqIAkgICAgICByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlCi0gKiAJICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICogCSAgICAtIGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMKLSAqIAkgICAgICBmb3IgZmluZGVyIGFuZCBzZWxlY3QgbWV0aG9kcyBmb3IgYW4gZW50aXR5Ci0gKiAJICAgICAgYmVhbiB3aXRoIGNtcC12ZXJzaW9uIDIueC4KLSAqIAotICogCVRoZSBvcHRpb25hbCBhYnN0cmFjdC1zY2hlbWEtbmFtZSBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkCi0gKiAJZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UgYW5kCi0gKiAJY21wLXZlcnNpb24gMi54LgotICogCi0gKiAJVGhlIG9wdGlvbmFsIHByaW1rZXktZmllbGQgbWF5IGJlIHByZXNlbnQgaW4gdGhlIGRlc2NyaXB0b3IKLSAqIAlpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIuCi0gKiAKLSAqIAlUaGUgb3B0aW9uYWwgY21wLXZlcnNpb24gZWxlbWVudCBtYXkgYmUgcHJlc2VudCBpbiB0aGUKLSAqIAlkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4gSWYKLSAqIAl0aGUgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbgotICogCWVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCwgaXRzIHZhbHVlIGRlZmF1bHRzIHRvIDIueC4KLSAqIAotICogCVRoZSBvcHRpb25hbCBob21lIGFuZCByZW1vdGUgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQgaWYKLSAqIAl0aGUgZW50aXR5IGJlYW4gY21wLXZlcnNpb24gaXMgMS54LgotICogCi0gKiAJVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgotICogCXRoZSBlbnRpdHkgYmVhbiBoYXMgYSByZW1vdGUgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZS4KLSAqIAotICogCVRoZSBvcHRpb25hbCBsb2NhbC1ob21lIGFuZCBsb2NhbCBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZAotICogCWlmIHRoZSBlbnRpdHkgYmVhbiBoYXMgYSBsb2NhbCBob21lIGFuZCBsb2NhbCBpbnRlcmZhY2UuCi0gKiAKLSAqIAlFaXRoZXIgYm90aCB0aGUgbG9jYWwtaG9tZSBhbmQgdGhlIGxvY2FsIGVsZW1lbnRzIG9yIGJvdGgKLSAqIAl0aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZC4KLSAqIAotICogCVRoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlCi0gKiAJcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAyLnggYW5kCi0gKiAJcXVlcnkgbWV0aG9kcyBvdGhlciB0aGFuIGZpbmRCeVByaW1hcnlLZXkgaGF2ZSBiZWVuIGRlZmluZWQKLSAqIAlmb3IgdGhlIGVudGl0eSBiZWFuLgotICogCi0gKiAJVGhlIG90aGVyIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZQotICogCXNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCBpZiB0aGUgbGlzdHMgcmVwcmVzZW50ZWQgYnkgdGhlbQotICogCWFyZSBlbXB0eS4KLSAqIAotICogCUF0IGxlYXN0IG9uZSBjbXAtZmllbGQgZWxlbWVudCBtdXN0IGJlIHByZXNlbnQgaW4gdGhlCi0gKiAJZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kCi0gKiAJdGhlIGNtcC12ZXJzaW9uIGlzIDEueCwgYW5kIG5vbmUgbXVzdCBub3QgYmUgcHJlc2VudCBpZiB0aGUKLSAqIAllbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIEJlYW4uCi0gKiAKKyAqICAgICAgICAgVGhlIGVudGl0eS1iZWFuVHlwZSBkZWNsYXJlcyBhbiBlbnRpdHkgYmVhbi4gVGhlIGRlY2xhcmF0aW9uCisgKiAgICAgICAgIGNvbnNpc3RzIG9mOgorICogICAgICAgICAKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRpc3BsYXkgbmFtZQorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGljb24gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGEgc21hbGwgYW5kIGEgbGFyZ2UgCisgKiAgICAgICAgIGljb24gZmlsZSBuYW1lCisgKiAgICAgICAgIC0gYSB1bmlxdWUgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuCisgKiAgICAgICAgIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQtbmFtZSBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQorICogICAgICAgICB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwaHlzaWNhbAorICogICAgICAgICBqbmRpLW5hbWUgb2YgdGhlIGVudGl0eSBiZWFuJ3MgcmVtb3RlIGhvbWUgaW50ZXJmYWNlLiBUaGlzIAorICogICAgICAgICBlbGVtZW50IGlzIG5vdCByZXF1aXJlZCB0byBiZSBzdXBwb3J0ZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4KKyAqICAgICAgICAgQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgorICogICAgICAgICAtIHRoZSBuYW1lcyBvZiB0aGUgZW50aXR5IGJlYW4ncyByZW1vdGUgaG9tZSAKKyAqICAgICAgICAgYW5kIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnkKKyAqICAgICAgICAgLSB0aGUgbmFtZXMgb2YgdGhlIGVudGl0eSBiZWFuJ3MgbG9jYWwgaG9tZSBhbmQgbG9jYWwKKyAqICAgICAgICAgaW50ZXJmYWNlcywgaWYgYW55CisgKiAgICAgICAgIC0gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKKyAqICAgICAgICAgLSB0aGUgb3B0aW9uYWwgZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZSBtYW5hZ2VtZW50IHR5cGUuIElmIAorICogICAgICAgICB0aGlzIGVsZW1lbnQgaXMgbm90IHNwZWNpZmllZCBpdCBpcyBkZWZhdWx0ZWQgdG8gQ29udGFpbmVyLgorICogICAgICAgICAtIHRoZSBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzIG5hbWUKKyAqICAgICAgICAgLSBhbiBpbmRpY2F0aW9uIG9mIHRoZSBlbnRpdHkgYmVhbidzIHJlZW50cmFuY3kKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSAKKyAqICAgICAgICAgZW50aXR5IGJlYW4ncyBjbXAtdmVyc2lvbgorICogICAgICAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGVudGl0eSBiZWFuJ3MKKyAqICAgICAgICAgYWJzdHJhY3Qgc2NoZW1hIG5hbWUKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcworICogICAgICAgICAtIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHByaW1hcnkga2V5IAorICogICAgICAgICBmaWVsZAorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgZW52aXJvbm1lbnQgCisgKiAgICAgICAgIGVudHJpZXMKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiAKKyAqICAgICAgICAgcmVmZXJlbmNlcworICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgCisgKiAgICAgICAgIEVKQiByZWZlcmVuY2VzCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIgCisgKiAgICAgICAgIHNlcnZpY2UgcmVmZXJlbmNlcworICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIAorICogICAgICAgICByZWZlcmVuY2VzCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IGlkZW50aXR5CisgKiAgICAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyAKKyAqICAgICAgICAgcmVzb3VyY2UgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcworICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKKyAqICAgICAgICAgcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlcworICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZSAKKyAqICAgICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcworICogICAgICAgICAtIGFuIG9wdGlvbmFsIHNldCBvZiBxdWVyeSBkZWNsYXJhdGlvbnMKKyAqICAgICAgICAgZm9yIGZpbmRlciBhbmQgc2VsZWN0IG1ldGhvZHMgZm9yIGFuIGVudGl0eQorICogICAgICAgICBiZWFuIHdpdGggY21wLXZlcnNpb24gMi54LgorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIG9wdGlvbmFsIGFic3RyYWN0LXNjaGVtYS1uYW1lIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQKKyAqICAgICAgICAgZm9yIGFuIGVudGl0eSBiZWFuIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UgYW5kCisgKiAgICAgICAgIGNtcC12ZXJzaW9uIDIueC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBvcHRpb25hbCBwcmlta2V5LWZpZWxkIG1heSBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yCisgKiAgICAgICAgIGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBvcHRpb25hbCBjbXAtdmVyc2lvbiBlbGVtZW50IG1heSBiZSBwcmVzZW50IGluIHRoZQorICogICAgICAgICBkZXNjcmlwdG9yIGlmIHRoZSBlbnRpdHkncyBwZXJzaXN0ZW5jZS10eXBlIGlzIENvbnRhaW5lci4gSWYKKyAqICAgICAgICAgdGhlIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24KKyAqICAgICAgICAgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCBpdHMgdmFsdWUgZGVmYXVsdHMgdG8gMi54LgorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgorICogICAgICAgICB0aGUgZW50aXR5IGJlYW4gY21wLXZlcnNpb24gaXMgMS54LgorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIG9wdGlvbmFsIGhvbWUgYW5kIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBpZgorICogICAgICAgICB0aGUgZW50aXR5IGJlYW4gaGFzIGEgcmVtb3RlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2UuCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgb3B0aW9uYWwgbG9jYWwtaG9tZSBhbmQgbG9jYWwgZWxlbWVudHMgbXVzdCBiZSBzcGVjaWZpZWQKKyAqICAgICAgICAgaWYgdGhlIGVudGl0eSBiZWFuIGhhcyBhIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEVpdGhlciBib3RoIHRoZSBsb2NhbC1ob21lIGFuZCB0aGUgbG9jYWwgZWxlbWVudHMgb3IgYm90aAorICogICAgICAgICB0aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBvcHRpb25hbCBxdWVyeSBlbGVtZW50cyBtdXN0IGJlIHByZXNlbnQgaWYgdGhlCisgKiAgICAgICAgIHBlcnNpc3RlbmNlLXR5cGUgaXMgQ29udGFpbmVyIGFuZCB0aGUgY21wLXZlcnNpb24gaXMgMi54IGFuZAorICogICAgICAgICBxdWVyeSBtZXRob2RzIG90aGVyIHRoYW4gZmluZEJ5UHJpbWFyeUtleSBoYXZlIGJlZW4gZGVmaW5lZAorICogICAgICAgICBmb3IgdGhlIGVudGl0eSBiZWFuLgorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIG90aGVyIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZQorICogICAgICAgICBzZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0KKyAqICAgICAgICAgYXJlIGVtcHR5LgorICogICAgICAgICAKKyAqICAgICAgICAgQXQgbGVhc3Qgb25lIGNtcC1maWVsZCBlbGVtZW50IG11c3QgYmUgcHJlc2VudCBpbiB0aGUKKyAqICAgICAgICAgZGVzY3JpcHRvciBpZiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kCisgKiAgICAgICAgIHRoZSBjbXAtdmVyc2lvbiBpcyAxLngsIGFuZCBub25lIG11c3Qgbm90IGJlIHByZXNlbnQgaWYgdGhlCisgKiAgICAgICAgIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTE0Niw2ICsxNjIsNyBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXREYXRhU291cmNlIDxlbT5EYXRhIFNvdXJjZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXRTZWN1cml0eVJvbGVSZWZzIDxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0U2VjdXJpdHlJZGVudGl0eSA8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0UXVlcmllcyA8ZW0+UXVlcmllczwvZW0+fTwvbGk+CkBAIC0xNzEsNyArMTg4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xODYsNyArMjAzLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9EaXNwbGF5TmFtZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOworCUxpc3Q8RGlzcGxheU5hbWU+IGdldERpc3BsYXlOYW1lcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjAxLDcgKzIxOCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fSWNvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEljb25zKCk7CisJTGlzdDxJY29uPiBnZXRJY29ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTM4MCw3ICszOTcsNiBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJCZWFuIjwvY29kZT4uCiAJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUGVyc2lzdGVuY2VUeXBlfS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtNDQxLDE1ICs0NTcsMTYgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSBwcmltLWtleS1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZQotCSAqIAkgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KLQkgKiAJICAgIGVudGl0eSBiZWFuJ3MgcHJpbWFyeSBrZXkgY2xhc3MuCi0JICogCi0JICogCSAgICBJZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgaXMKLQkgKiAJICAgIGRlZmVycmVkIHRvIGRlcGxveW1lbnQgdGltZSwgdGhlIHByaW0ta2V5LWNsYXNzCi0JICogCSAgICBlbGVtZW50IHNob3VsZCBzcGVjaWZ5IGphdmEubGFuZy5PYmplY3QuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIHByaW0ta2V5LWNsYXNzIGVsZW1lbnQgY29udGFpbnMgdGhlCisJICogICAgICAgICAgICAgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYW4KKwkgKiAgICAgICAgICAgICBlbnRpdHkgYmVhbidzIHByaW1hcnkga2V5IGNsYXNzLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIElmIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBpcworCSAqICAgICAgICAgICAgIGRlZmVycmVkIHRvIGRlcGxveW1lbnQgdGltZSwgdGhlIHByaW0ta2V5LWNsYXNzIAorCSAqICAgICAgICAgICAgIGVsZW1lbnQgc2hvdWxkIHNwZWNpZnkgamF2YS5sYW5nLk9iamVjdC4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBFSkIgMy4wCisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltIEtleSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0UHJpbUtleUNsYXNzKFN0cmluZykKQEAgLTQ3NSwxMyArNDkyLDE0IEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgcmVlbnRyYW50IGVsZW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgYW4gZW50aXR5Ci0JICogCSAgICBiZWFuIGlzIHJlZW50cmFudCBvciBub3QuCi0JICogCi0JICogCSAgICBUaGUgcmVlbnRyYW50IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3bwotCSAqIAkgICAgZm9sbG93aW5nOiB0cnVlIG9yIGZhbHNlCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIHJlZW50cmFudCBlbGVtZW50IHNwZWNpZmllcyB3aGV0aGVyIGFuIGVudGl0eQorCSAqICAgICAgICAgICAgIGJlYW4gaXMgcmVlbnRyYW50IG9yIG5vdC4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBUaGUgcmVlbnRyYW50IGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIHR3bworCSAqICAgICAgICAgICAgIGZvbGxvd2luZzogdHJ1ZSBvciBmYWxzZQorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZW50cmFudDwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjaXNTZXRSZWVudHJhbnQoKQpAQCAtNTI5LDcgKzU0Nyw2IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbXAgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIxLngiPC9jb2RlPi4KIAkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZX0uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KQEAgLTU5MCwxNSArNjA3LDE2IEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKLQkgKiAJICAgIG9mIHRoZSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBvZiBhbiBlbnRpdHkgYmVhbiB3aXRoCi0JICogCSAgICBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCIFFMIHF1ZXJpZXMuCi0JICogCi0JICogCSAgICBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0LXNjaGVtYS1uYW1lIGZvciBhbiBlbnRpdHkKLQkgKiAJICAgIGJlYW4gd2hvc2UgbG9jYWwgaW50ZXJmYWNlIGlzCi0JICogCSAgICBjb20uYWNtZS5jb21tZXJjZS5PcmRlciBtaWdodCBiZSBPcmRlci4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUKKwkgKiAgICAgICAgICAgICBvZiB0aGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgb2YgYW4gZW50aXR5IGJlYW4gd2l0aCAKKwkgKiAgICAgICAgICAgICBjbXAtdmVyc2lvbiAyLnguIEl0IGlzIHVzZWQgaW4gRUpCIFFMIHF1ZXJpZXMuIAorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgYWJzdHJhY3Qtc2NoZW1hLW5hbWUgZm9yIGFuIGVudGl0eSAKKwkgKiAgICAgICAgICAgICBiZWFuIHdob3NlIGxvY2FsIGludGVyZmFjZSBpcyAKKwkgKiAgICAgICAgICAgICBjb20uYWNtZS5jb21tZXJjZS5PcmRlciBtaWdodCBiZSBPcmRlci4gCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWJzdHJhY3QgU2NoZW1hIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldEFic3RyYWN0U2NoZW1hTmFtZShTdHJpbmcpCkBAIC02MzAsNyArNjQ4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9DbXBGaWVsZHMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldENtcEZpZWxkcygpOworCUxpc3Q8Q01QRmllbGQ+IGdldENtcEZpZWxkcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpbWtleSBGaWVsZDwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNjM5LDIyICs2NTcsMjMgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQotCSAqIAkgICAgbmFtZSBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQgZm9yIGFuIGVudGl0eSB3aXRoCi0JICogCSAgICBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZS4KLQkgKiAKLQkgKiAJICAgIFRoZSBwcmlta2V5LWZpZWxkIG11c3QgYmUgb25lIG9mIHRoZSBmaWVsZHMgZGVjbGFyZWQKLQkgKiAJICAgIGluIHRoZSBjbXAtZmllbGQgZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAotCSAqIAkgICAgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgcHJpbWFyeSBrZXkgdHlwZS4KLQkgKiAKLQkgKiAJICAgIFRoZSBwcmlta2V5LWZpZWxkIGVsZW1lbnQgaXMgbm90IHVzZWQgaWYgdGhlIHByaW1hcnkKLQkgKiAJICAgIGtleSBtYXBzIHRvIG11bHRpcGxlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcwotCSAqIAkgICAgKGkuZS4gdGhlIGtleSBpcyBhIGNvbXBvdW5kIGtleSkuIEluIHRoaXMgY2FzZSwgdGhlCi0JICogCSAgICBmaWVsZHMgb2YgdGhlIHByaW1hcnkga2V5IGNsYXNzIG11c3QgYmUgcHVibGljLCBhbmQKLQkgKiAJICAgIHRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgbmFtZXMgb2YKLQkgKiAJICAgIHRoZSBlbnRpdHkgYmVhbiBjbGFzcyB0aGF0IGNvbXByaXNlIHRoZSBrZXkuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCisJICogICAgICAgICAgICAgbmFtZSBvZiB0aGUgcHJpbWFyeSBrZXkgZmllbGQgZm9yIGFuIGVudGl0eSB3aXRoCisJICogICAgICAgICAgICAgY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgVGhlIHByaW1rZXktZmllbGQgbXVzdCBiZSBvbmUgb2YgdGhlIGZpZWxkcyBkZWNsYXJlZAorCSAqICAgICAgICAgICAgIGluIHRoZSBjbXAtZmllbGQgZWxlbWVudCwgYW5kIHRoZSB0eXBlIG9mIHRoZSBmaWVsZAorCSAqICAgICAgICAgICAgIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkga2V5IHR5cGUuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgVGhlIHByaW1rZXktZmllbGQgZWxlbWVudCBpcyBub3QgdXNlZCBpZiB0aGUgcHJpbWFyeQorCSAqICAgICAgICAgICAgIGtleSBtYXBzIHRvIG11bHRpcGxlIGNvbnRhaW5lci1tYW5hZ2VkIGZpZWxkcworCSAqICAgICAgICAgICAgIChpLmUuIHRoZSBrZXkgaXMgYSBjb21wb3VuZCBrZXkpLiBJbiB0aGlzIGNhc2UsIHRoZQorCSAqICAgICAgICAgICAgIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBrZXkgY2xhc3MgbXVzdCBiZSBwdWJsaWMsIGFuZAorCSAqICAgICAgICAgICAgIHRoZWlyIG5hbWVzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgZmllbGQgbmFtZXMgb2YKKwkgKiAgICAgICAgICAgICB0aGUgZW50aXR5IGJlYW4gY2xhc3MgdGhhdCBjb21wcmlzZSB0aGUga2V5LgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW1rZXkgRmllbGQ8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFByaW1rZXlGaWVsZChTdHJpbmcpCkBAIC02ODYsNyArNzA1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9FbnZFbnRyaWVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRFbnZFbnRyaWVzKCk7CisJTGlzdDxFbnZFbnRyeT4gZ2V0RW52RW50cmllcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNzAxLDcgKzcyMCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fRWpiUmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RWpiUmVmcygpOworCUxpc3Q8RWpiUmVmPiBnZXRFamJSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03MTYsNyArNzM1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9FamJMb2NhbFJlZnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEVqYkxvY2FsUmVmcygpOworCUxpc3Q8RWpiTG9jYWxSZWY+IGdldEVqYkxvY2FsUmVmcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTczMSw3ICs3NTAsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX1NlcnZpY2VSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRTZXJ2aWNlUmVmcygpOworCUxpc3Q8U2VydmljZVJlZj4gZ2V0U2VydmljZVJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNzQ2LDcgKzc2NSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUmVzb3VyY2VSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRSZXNvdXJjZVJlZnMoKTsKKwlMaXN0PFJlc291cmNlUmVmPiBnZXRSZXNvdXJjZVJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTc2MSw3ICs3ODAsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFbnRpdHlCZWFuX1Jlc291cmNlRW52UmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCk7CisJTGlzdDxSZXNvdXJjZUVudlJlZj4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNzc2LDcgKzc5NSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOworCUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uUmVmPiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNzkxLDcgKzgxMCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOworCUxpc3Q8UGVyc2lzdGVuY2VDb250ZXh0UmVmPiBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtODA2LDcgKzgyNSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpOworCUxpc3Q8UGVyc2lzdGVuY2VVbml0UmVmPiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtODIxLDcgKzg0MCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUG9zdENvbnN0cnVjdHMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCk7CisJTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gZ2V0UG9zdENvbnN0cnVjdHMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC04MzYsNyArODU1LDIyIEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fUHJlRGVzdHJveXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFByZURlc3Ryb3lzKCk7CisJTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gZ2V0UHJlRGVzdHJveXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGEgU291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRhdGEgU291cmNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBTb3VyY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEVudGl0eUJlYW5fRGF0YVNvdXJjZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8RGF0YVNvdXJjZVR5cGU+IGdldERhdGFTb3VyY2UoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC04NTEsNyArODg1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9TZWN1cml0eVJvbGVSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRTZWN1cml0eVJvbGVSZWZzKCk7CisJTGlzdDxTZWN1cml0eVJvbGVSZWY+IGdldFNlY3VyaXR5Um9sZVJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3VyaXR5IElkZW50aXR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC04OTEsNyArOTI1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RW50aXR5QmVhbl9RdWVyaWVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRRdWVyaWVzKCk7CisJTGlzdDxRdWVyeT4gZ2V0UXVlcmllcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0V4Y2x1ZGVMaXN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9FeGNsdWRlTGlzdC5qYXZhCmluZGV4IGViNjhkM2QuLmM3NmI5NzEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0V4Y2x1ZGVMaXN0LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvRXhjbHVkZUxpc3QuamF2YQpAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKIAogLyoqCkBAIC0yMiwxMyArMjMsMTQgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgZXhjbHVkZS1saXN0VHlwZSBzcGVjaWZpZXMgb25lIG9yIG1vcmUgbWV0aG9kcyB3aGljaAotICogCXRoZSBBc3NlbWJsZXIgbWFya3MgdG8gYmUgdW5jYWxsYWJsZS4KLSAqIAotICogCUlmIHRoZSBtZXRob2QgcGVybWlzc2lvbiByZWxhdGlvbiBjb250YWlucyBtZXRob2RzIHRoYXQgYXJlCi0gKiAJaW4gdGhlIGV4Y2x1ZGUgbGlzdCwgdGhlIERlcGxveWVyIHNob3VsZCBjb25zaWRlciB0aG9zZQotICogCW1ldGhvZHMgdG8gYmUgdW5jYWxsYWJsZS4KLSAqIAorICogICAgICAgICBUaGUgZXhjbHVkZS1saXN0VHlwZSBzcGVjaWZpZXMgb25lIG9yIG1vcmUgbWV0aG9kcyB3aGljaAorICogICAgICAgICB0aGUgQXNzZW1ibGVyIG1hcmtzIHRvIGJlIHVuY2FsbGFibGUuCisgKiAgICAgICAgIAorICogICAgICAgICBJZiB0aGUgbWV0aG9kIHBlcm1pc3Npb24gcmVsYXRpb24gY29udGFpbnMgbWV0aG9kcyB0aGF0IGFyZQorICogICAgICAgICBpbiB0aGUgZXhjbHVkZSBsaXN0LCB0aGUgRGVwbG95ZXIgc2hvdWxkIGNvbnNpZGVyIHRob3NlCisgKiAgICAgICAgIG1ldGhvZHMgdG8gYmUgdW5jYWxsYWJsZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTU5LDcgKzYxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNzQsNyArNzYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRFeGNsdWRlTGlzdF9NZXRob2RzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRNZXRob2RzKCk7CisJTGlzdDxNZXRob2RUeXBlPiBnZXRNZXRob2RzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSUVKQlJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JRUpCUmVzb3VyY2UuamF2YQppbmRleCBkYzA4NTI4Li4yZmY3MzZmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JRUpCUmVzb3VyY2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JRUpCUmVzb3VyY2UuamF2YQpAQCAtMSwzICsxLDEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5qYXZhCmluZGV4IGJhZmRhMTIuLjZhNjNmYTggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0ludGVyY2VwdG9yQmluZGluZ1R5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JbnRlcmNlcHRvckJpbmRpbmdUeXBlLmphdmEKQEAgLTEyLDYgKzEyLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CiAKIC8qKgpAQCAtMjEsMTAxICsyMiwxMDMgQEAKICAqCiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAotICogCisgKiA8IVtDREFUQVtbCiAgKiAgICAgICAgIFRoZSBpbnRlcmNlcHRvci1iaW5kaW5nVHlwZSBlbGVtZW50IGRlc2NyaWJlcyB0aGUgYmluZGluZyBvZgotICogICAgICAgICBpbnRlcmNlcHRvciBjbGFzc2VzIHRvIGJlYW5zIHdpdGhpbiB0aGUgZWpiLWphci4KKyAqICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3NlcyB0byBiZWFucyB3aXRoaW4gdGhlIGVqYi1qYXIgb3IgLndhci4KICAqICAgICAgICAgSXQgY29uc2lzdHMgb2YgOgotICogCi0gKiAgICAgICAgICAgLSBBbiBvcHRpb25hbCBkZXNjcmlwdGlvbi4KLSAqICAgICAgICAgICAtIFRoZSBuYW1lIG9mIGFuIGVqYiB3aXRoaW4gdGhlIGVqYi1qYXIgb3IgdGhlIHdpbGRjYXJkIHZhbHVlICIqIiwKLSAqICAgICAgICAgICAgIHdoaWNoIGlzIHVzZWQgdG8gZGVmaW5lIGludGVyY2VwdG9ycyB0aGF0IGFyZSBib3VuZCB0byBhbGwKLSAqICAgICAgICAgICAgIGJlYW5zIGluIHRoZSBlamItamFyLgotICogICAgICAgICAgIC0gQSBsaXN0IG9mIGludGVyY2VwdG9yIGNsYXNzZXMgdGhhdCBhcmUgYm91bmQgdG8gdGhlIGNvbnRlbnRzIG9mCi0gKiAgICAgICAgICAgICB0aGUgZWpiLW5hbWUgZWxlbWVudCBvciBhIHNwZWNpZmljYXRpb24gb2YgdGhlIHRvdGFsIG9yZGVyaW5nCi0gKiAgICAgICAgICAgICBvdmVyIHRoZSBpbnRlcmNlcHRvcnMgZGVmaW5lZCBmb3IgdGhlIGdpdmVuIGxldmVsIGFuZCBhYm92ZS4KLSAqICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGV4Y2x1ZGUtZGVmYXVsdC1pbnRlcmNlcHRvcnMgZWxlbWVudC4gIElmIHNldCB0byB0cnVlLAotICogICAgICAgICAgICAgc3BlY2lmaWVzIHRoYXQgZGVmYXVsdCBpbnRlcmNlcHRvcnMgYXJlIG5vdCB0byBiZSBhcHBsaWVkIHRvCi0gKiAgICAgICAgICAgICBhIGJlYW4tY2xhc3MgYW5kL29yIGJ1c2luZXNzIG1ldGhvZC4KLSAqICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGV4Y2x1ZGUtY2xhc3MtaW50ZXJjZXB0b3JzIGVsZW1lbnQuICBJZiBzZXQgdG8gdHJ1ZSwKLSAqICAgICAgICAgICAgIHNwZWNpZmllcyB0aGF0IGNsYXNzIGludGVyY2VwdG9ycyBhcmUgbm90IHRvIGJlIGFwcGxpZWQgdG8KLSAqICAgICAgICAgICAgIGEgYnVzaW5lc3MgbWV0aG9kLgotICogICAgICAgICAgIC0gQW4gb3B0aW9uYWwgc2V0IG9mIG1ldGhvZCBlbGVtZW50cyBmb3IgZGVzY3JpYmluZyB0aGUgbmFtZS9wYXJhbXMKLSAqICAgICAgICAgICAgIG9mIGEgbWV0aG9kLWxldmVsIGludGVyY2VwdG9yLgotICogCi0gKiAgICAgICAgICBJbnRlcmNlcHRvcnMgYm91bmQgdG8gYWxsIGNsYXNzZXMgdXNpbmcgdGhlIHdpbGRjYXJkIHN5bnRheAotICogICAgICAgICAgIioiIGFyZSBkZWZhdWx0IGludGVyY2VwdG9ycyBmb3IgdGhlIGNvbXBvbmVudHMgaW4gdGhlIGVqYi1qYXIuCi0gKiAgICAgICAgICBJbiBhZGRpdGlvbiwgaW50ZXJjZXB0b3JzIG1heSBiZSBib3VuZCBhdCB0aGUgbGV2ZWwgb2YgdGhlIGJlYW4KLSAqICAgICAgICAgIGNsYXNzIChjbGFzcy1sZXZlbCBpbnRlcmNlcHRvcnMpIG9yIGJ1c2luZXNzIG1ldGhvZHMgKG1ldGhvZC1sZXZlbAotICogICAgICAgICAgaW50ZXJjZXB0b3JzICkuCi0gKiAKLSAqICAgICAgICAgIFRoZSBiaW5kaW5nIG9mIGludGVyY2VwdG9ycyB0byBjbGFzc2VzIGlzIGFkZGl0aXZlLiAgSWYgaW50ZXJjZXB0b3JzCi0gKiAgICAgICAgICBhcmUgYm91bmQgYXQgdGhlIGNsYXNzLWxldmVsIGFuZC9vciBkZWZhdWx0LWxldmVsIGFzIHdlbGwgYXMgdGhlCi0gKiAgICAgICAgICBtZXRob2QtbGV2ZWwsIGJvdGggY2xhc3MtbGV2ZWwgYW5kL29yIGRlZmF1bHQtbGV2ZWwgYXMgd2VsbCBhcwotICogICAgICAgICAgbWV0aG9kLWxldmVsIHdpbGwgYXBwbHkuCi0gKiAKLSAqICAgICAgICAgIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmxlIHN0eWxlcyBvZiB0aGUgaW50ZXJjZXB0b3IgZWxlbWVudCBzeW50YXggOgotICogCi0gKiAgICAgICAgICAxLgotICogICAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAqICAgICAgICAgICAgPGVqYi1uYW1lPio8L2VqYi1uYW1lPgotICogICAgICAgICAgICA8aW50ZXJjZXB0b3ItY2xhc3M+SU5URVJDRVBUT1I8L2ludGVyY2VwdG9yLWNsYXNzPgotICogICAgICAgICAgPC9pbnRlcmNlcHRvci1iaW5kaW5nPgotICogCi0gKiAgICAgICAgICBTcGVjaWZ5aW5nIHRoZSBlamItbmFtZSBhcyB0aGUgd2lsZGNhcmQgdmFsdWUgIioiIGRlc2lnbmF0ZXMKLSAqICAgICAgICAgIGRlZmF1bHQgaW50ZXJjZXB0b3JzIChpbnRlcmNlcHRvcnMgdGhhdCBhcHBseSB0byBhbGwgc2Vzc2lvbiBhbmQKLSAqICAgICAgICAgIG1lc3NhZ2UtZHJpdmVuIGJlYW5zIGNvbnRhaW5lZCBpbiB0aGUgZWpiLWphcikuCi0gKiAKLSAqICAgICAgICAgIDIuCi0gKiAgICAgICAgICA8aW50ZXJjZXB0b3ItYmluZGluZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotICogICAgICAgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+Ci0gKiAgICAgICAgICAgIDxpbnRlcmNlcHRvci1jbGFzcz5JTlRFUkNFUFRPUjwvaW50ZXJjZXB0b3ItY2xhc3M+Ci0gKiAgICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0gKiAKLSAqICAgICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBpbnRlcmNlcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZQotICogICAgICAgICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbihjbGFzcy1sZXZlbCBpbnRlcmNlcHRvcnMpLgotICogCi0gKiAgICAgICAgICAzLgotICogICAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLSAqICAgICAgICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgotICogICAgICAgICAgICA8aW50ZXJjZXB0b3ItY2xhc3M+SU5URVJDRVBUT1I8L2ludGVyY2VwdG9yLWNsYXNzPgotICogICAgICAgICAgICA8bWV0aG9kPgotICogICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5NRVRIT0Q8L21ldGhvZC1uYW1lPgotICogICAgICAgICAgICA8L21ldGhvZD4KLSAqICAgICAgICAgIDwvaW50ZXJjZXB0b3ItYmluZGluZz4KLSAqIAotICogICAgICAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIGFzc29jaWF0ZSBhIG1ldGhvZC1sZXZlbCBpbnRlcmNlcHRvciB3aXRoCi0gKiAgICAgICAgICB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtZXRob2RzCi0gKiAgICAgICAgICB3aXRoIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YgdGhpcyBzdHlsZSByZWZlcnMKLSAqICAgICAgICAgIHRvIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkIG5hbWUuICBNZXRob2QtbGV2ZWwKLSAqICAgICAgICAgIGludGVyY2VwdG9ycyBjYW4gb25seSBiZSBhc3NvY2lhdGVkIHdpdGggYnVzaW5lc3MgbWV0aG9kcyBvZiB0aGUKLSAqICAgICAgICAgIGJlYW4gY2xhc3MuICAgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZCB2YWx1ZSAiKiIgY2Fubm90IGJlIHVzZWQKLSAqICAgICAgICAgIHRvIHNwZWNpZnkgbWV0aG9kLWxldmVsIGludGVyY2VwdG9ycy4KLSAqIAotICogICAgICAgICAgNC4KLSAqICAgICAgICAgIDxpbnRlcmNlcHRvci1iaW5kaW5nIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci0gKiAgICAgICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KLSAqICAgICAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KLSAqICAgICAgICAgICAgPG1ldGhvZD4KLSAqICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KLSAqICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAqICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tMTwvbWV0aG9kLXBhcmFtPgotICogICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5QQVJBTS0yPC9tZXRob2QtcGFyYW0+Ci0gKiAgICAgICAgICAgICAgICAuLi4KLSAqICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tTjwvbWV0aG9kLXBhcmFtPgotICogICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAqICAgICAgICAgICAgPC9tZXRob2Q+Ci0gKiAgICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+Ci0gKiAKLSAqICAgICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYSBtZXRob2QtbGV2ZWwgaW50ZXJjZXB0b3Igd2l0aAotICogICAgICAgICAgdGhlIHNwZWNpZmllZCBtZXRob2Qgb2YgdGhlIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4uICBUaGlzCi0gKiAgICAgICAgICBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYSBzZXQgb2YgbWV0aG9kcwotICogICAgICAgICAgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuICBUaGUgdmFsdWVzIFBBUkFNLTEgdGhyb3VnaCBQQVJBTS1OCi0gKiAgICAgICAgICBhcmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZSBtZXRob2QncyBpbnB1dCBwYXJhbWV0ZXJzCi0gKiAgICAgICAgICAoaWYgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQgYXJndW1lbnRzLCB0aGUgbWV0aG9kLXBhcmFtcyBlbGVtZW50Ci0gKiAgICAgICAgICBjb250YWlucyBubyBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKLSAqICAgICAgICAgIGFycmF5IGVsZW1lbnQncyB0eXBlLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWlyIG9mIHNxdWFyZQotICogICAgICAgICAgYnJhY2tldHMgKGUuZy4gaW50W11bXSkuCi0gKiAKKyAqICAgICAgICAgCisgKiAgICAgICAgIC0gQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24uCisgKiAgICAgICAgIC0gVGhlIG5hbWUgb2YgYW4gZWpiIHdpdGhpbiB0aGUgbW9kdWxlIG9yIHRoZSB3aWxkY2FyZCB2YWx1ZSAiKiIsCisgKiAgICAgICAgIHdoaWNoIGlzIHVzZWQgdG8gZGVmaW5lIGludGVyY2VwdG9ycyB0aGF0IGFyZSBib3VuZCB0byBhbGwKKyAqICAgICAgICAgYmVhbnMgaW4gdGhlIGVqYi1qYXIgb3IgLndhci4KKyAqICAgICAgICAgLSBBIGxpc3Qgb2YgaW50ZXJjZXB0b3IgY2xhc3NlcyB0aGF0IGFyZSBib3VuZCB0byB0aGUgY29udGVudHMgb2YKKyAqICAgICAgICAgdGhlIGVqYi1uYW1lIGVsZW1lbnQgb3IgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSB0b3RhbCBvcmRlcmluZworICogICAgICAgICBvdmVyIHRoZSBpbnRlcmNlcHRvcnMgZGVmaW5lZCBmb3IgdGhlIGdpdmVuIGxldmVsIGFuZCBhYm92ZS4KKyAqICAgICAgICAgLSBBbiBvcHRpb25hbCBleGNsdWRlLWRlZmF1bHQtaW50ZXJjZXB0b3JzIGVsZW1lbnQuICBJZiBzZXQgdG8gdHJ1ZSwKKyAqICAgICAgICAgc3BlY2lmaWVzIHRoYXQgZGVmYXVsdCBpbnRlcmNlcHRvcnMgYXJlIG5vdCB0byBiZSBhcHBsaWVkIHRvIAorICogICAgICAgICBhIGJlYW4tY2xhc3MgYW5kL29yIGJ1c2luZXNzIG1ldGhvZC4KKyAqICAgICAgICAgLSBBbiBvcHRpb25hbCBleGNsdWRlLWNsYXNzLWludGVyY2VwdG9ycyBlbGVtZW50LiAgSWYgc2V0IHRvIHRydWUsCisgKiAgICAgICAgIHNwZWNpZmllcyB0aGF0IGNsYXNzIGludGVyY2VwdG9ycyBhcmUgbm90IHRvIGJlIGFwcGxpZWQgdG8gCisgKiAgICAgICAgIGEgYnVzaW5lc3MgbWV0aG9kLgorICogICAgICAgICAtIEFuIG9wdGlvbmFsIHNldCBvZiBtZXRob2QgZWxlbWVudHMgZm9yIGRlc2NyaWJpbmcgdGhlIG5hbWUvcGFyYW1zCisgKiAgICAgICAgIG9mIGEgbWV0aG9kLWxldmVsIGludGVyY2VwdG9yLgorICogICAgICAgICAKKyAqICAgICAgICAgSW50ZXJjZXB0b3JzIGJvdW5kIHRvIGFsbCBjbGFzc2VzIHVzaW5nIHRoZSB3aWxkY2FyZCBzeW50YXgKKyAqICAgICAgICAgIioiIGFyZSBkZWZhdWx0IGludGVyY2VwdG9ycyBmb3IgdGhlIGNvbXBvbmVudHMgaW4gdGhlIGVqYi1qYXIgb3IgLndhci4gCisgKiAgICAgICAgIEluIGFkZGl0aW9uLCBpbnRlcmNlcHRvcnMgbWF5IGJlIGJvdW5kIGF0IHRoZSBsZXZlbCBvZiB0aGUgYmVhbgorICogICAgICAgICBjbGFzcyAoY2xhc3MtbGV2ZWwgaW50ZXJjZXB0b3JzKSBvciBidXNpbmVzcyBtZXRob2RzIChtZXRob2QtbGV2ZWwKKyAqICAgICAgICAgaW50ZXJjZXB0b3JzICkuCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgYmluZGluZyBvZiBpbnRlcmNlcHRvcnMgdG8gY2xhc3NlcyBpcyBhZGRpdGl2ZS4gIElmIGludGVyY2VwdG9ycworICogICAgICAgICBhcmUgYm91bmQgYXQgdGhlIGNsYXNzLWxldmVsIGFuZC9vciBkZWZhdWx0LWxldmVsIGFzIHdlbGwgYXMgdGhlCisgKiAgICAgICAgIG1ldGhvZC1sZXZlbCwgYm90aCBjbGFzcy1sZXZlbCBhbmQvb3IgZGVmYXVsdC1sZXZlbCBhcyB3ZWxsIGFzCisgKiAgICAgICAgIG1ldGhvZC1sZXZlbCB3aWxsIGFwcGx5LiAKKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmxlIHN0eWxlcyBvZiB0aGUgaW50ZXJjZXB0b3IgZWxlbWVudCBzeW50YXggOgorICogICAgICAgICAKKyAqICAgICAgICAgMS4KKyAqICAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmc+CisgKiAgICAgICAgIDxlamItbmFtZT4qPC9lamItbmFtZT4KKyAqICAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KKyAqICAgICAgICAgPC9pbnRlcmNlcHRvci1iaW5kaW5nPgorICogICAgICAgICAKKyAqICAgICAgICAgU3BlY2lmeWluZyB0aGUgZWpiLW5hbWUgYXMgdGhlIHdpbGRjYXJkIHZhbHVlICIqIiBkZXNpZ25hdGVzCisgKiAgICAgICAgIGRlZmF1bHQgaW50ZXJjZXB0b3JzIChpbnRlcmNlcHRvcnMgdGhhdCBhcHBseSB0byBhbGwgc2Vzc2lvbiBhbmQKKyAqICAgICAgICAgbWVzc2FnZS1kcml2ZW4gYmVhbnMgY29udGFpbmVkIGluIHRoZSBlamItamFyIG9yIC53YXIpLgorICogICAgICAgICAKKyAqICAgICAgICAgMi4gCisgKiAgICAgICAgIDxpbnRlcmNlcHRvci1iaW5kaW5nPgorICogICAgICAgICA8ZWpiLW5hbWU+RUpCTkFNRTwvZWpiLW5hbWU+CisgKiAgICAgICAgIDxpbnRlcmNlcHRvci1jbGFzcz5JTlRFUkNFUFRPUjwvaW50ZXJjZXB0b3ItY2xhc3M+CisgKiAgICAgICAgIDwvaW50ZXJjZXB0b3ItYmluZGluZz4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBpbnRlcmNlcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogICAgICAgICBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuKGNsYXNzLWxldmVsIGludGVyY2VwdG9ycykuCisgKiAgICAgICAgIAorICogICAgICAgICAzLiAKKyAqICAgICAgICAgPGludGVyY2VwdG9yLWJpbmRpbmc+CisgKiAgICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KKyAqICAgICAgICAgPGludGVyY2VwdG9yLWNsYXNzPklOVEVSQ0VQVE9SPC9pbnRlcmNlcHRvci1jbGFzcz4KKyAqICAgICAgICAgPG1ldGhvZD4KKyAqICAgICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+CisgKiAgICAgICAgIDwvbWV0aG9kPgorICogICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+CisgKiAgICAgICAgIAorICogICAgICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gYXNzb2NpYXRlIGEgbWV0aG9kLWxldmVsIGludGVyY2VwdG9yIHdpdGggCisgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIG1ldGhvZHMKKyAqICAgICAgICAgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoZSBlbGVtZW50IG9mIHRoaXMgc3R5bGUgcmVmZXJzCisgKiAgICAgICAgIHRvIGFsbCB0aGUgbWV0aG9kcyB3aXRoIHRoZSBvdmVybG9hZGVkIG5hbWUuICBNZXRob2QtbGV2ZWwKKyAqICAgICAgICAgaW50ZXJjZXB0b3JzIGNhbiBvbmx5IGJlIGFzc29jaWF0ZWQgd2l0aCBidXNpbmVzcyBtZXRob2RzIG9mIHRoZQorICogICAgICAgICBiZWFuIGNsYXNzLiAgIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmQgdmFsdWUgIioiIGNhbm5vdCBiZSB1c2VkCisgKiAgICAgICAgIHRvIHNwZWNpZnkgbWV0aG9kLWxldmVsIGludGVyY2VwdG9ycy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIDQuIAorICogICAgICAgICA8aW50ZXJjZXB0b3ItYmluZGluZz4KKyAqICAgICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgorICogICAgICAgICA8aW50ZXJjZXB0b3ItY2xhc3M+SU5URVJDRVBUT1I8L2ludGVyY2VwdG9yLWNsYXNzPgorICogICAgICAgICA8bWV0aG9kPgorICogICAgICAgICA8bWV0aG9kLW5hbWU+TUVUSE9EPC9tZXRob2QtbmFtZT4KKyAqICAgICAgICAgPG1ldGhvZC1wYXJhbXM+CisgKiAgICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tMTwvbWV0aG9kLXBhcmFtPgorICogICAgICAgICA8bWV0aG9kLXBhcmFtPlBBUkFNLTI8L21ldGhvZC1wYXJhbT4KKyAqICAgICAgICAgLi4uCisgKiAgICAgICAgIDxtZXRob2QtcGFyYW0+UEFSQU0tTjwvbWV0aG9kLXBhcmFtPgorICogICAgICAgICA8L21ldGhvZC1wYXJhbXM+CisgKiAgICAgICAgIDwvbWV0aG9kPgorICogICAgICAgICA8L2ludGVyY2VwdG9yLWJpbmRpbmc+CisgKiAgICAgICAgIAorICogICAgICAgICBUaGlzIHN0eWxlIGlzIHVzZWQgdG8gYXNzb2NpYXRlIGEgbWV0aG9kLWxldmVsIGludGVyY2VwdG9yIHdpdGggCisgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mIHRoZSBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiAgVGhpcyAKKyAqICAgICAgICAgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEgc2V0IG9mIG1ldGhvZHMKKyAqICAgICAgICAgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuICBUaGUgdmFsdWVzIFBBUkFNLTEgdGhyb3VnaCBQQVJBTS1OCisgKiAgICAgICAgIGFyZSB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMKKyAqICAgICAgICAgKGlmIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0IGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudAorICogICAgICAgICBjb250YWlucyBubyBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKKyAqICAgICAgICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2Ygc3F1YXJlIAorICogICAgICAgICBicmFja2V0cyAoZS5nLiBpbnRbXVtdKS4KKyAqICAgICAgICAgCisgKiBdXT4KKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtMTUxLDcgKzE1NCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xOTEsNyArMTk0LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9JbnRlcmNlcHRvckNsYXNzZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEludGVyY2VwdG9yQ2xhc3NlcygpOworCUxpc3Q8U3RyaW5nPiBnZXRJbnRlcmNlcHRvckNsYXNzZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyY2VwdG9yIE9yZGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JbnRlcmNlcHRvck9yZGVyVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JPcmRlclR5cGUuamF2YQppbmRleCBlZGNhNGFmLi5iMGQ5ZjM3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JbnRlcmNlcHRvck9yZGVyVHlwZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0ludGVyY2VwdG9yT3JkZXJUeXBlLmphdmEKQEAgLTIxLDggKzIxLDExIEBACiAgKgogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKKyAqIAogICogICAgICAgICBUaGUgaW50ZXJjZXB0b3Itb3JkZXJUeXBlIGVsZW1lbnQgZGVzY3JpYmVzIGEgdG90YWwgb3JkZXJpbmcKICAqICAgICAgICAgb2YgaW50ZXJjZXB0b3IgY2xhc3Nlcy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTUyLDcgKzU1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGVfSW50ZXJjZXB0b3JDbGFzc2VzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRJbnRlcmNlcHRvckNsYXNzZXMoKTsKKwlMaXN0PFN0cmluZz4gZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JbnRlcmNlcHRvclR5cGUuamF2YQppbmRleCAwOWMxMDI3Li44YjA1ZmUxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JbnRlcmNlcHRvclR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JbnRlcmNlcHRvclR5cGUuamF2YQpAQCAtMTIsNyArMTIsMTkgQEAKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjQsMTggKzM2LDIxIEBACiAgKiAKICAqICAgICAgICAgVGhlIGludGVyY2VwdG9yVHlwZSBlbGVtZW50IGRlY2xhcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlCiAgKiAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzLiAgSXQgY29uc2lzdHMgb2YgOgotICogCi0gKiAgICAgICAgICAgICAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgotICogICAgICAgICAgICAgLSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGludGVyY2VwdG9yIGNsYXNzLgotICogICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IG9mIGFyb3VuZCBpbnZva2UgbWV0aG9kcyBkZWNsYXJlZCBvbiB0aGUKLSAqICAgICAgICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MgYW5kL29yIGl0cyBzdXBlci1jbGFzc2VzLgotICogICAgICAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IGVudmlyb25tZW50IGRlcGVuZGVuY2llcyBmb3IgdGhlIGludGVyY2VwdG9yCi0gKiAgICAgICAgICAgICAgIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAqICAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBwb3N0LWFjdGl2YXRlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlCi0gKiAgICAgICAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAqICAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBwcmUtcGFzc2l2YXRlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlCi0gKiAgICAgICAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KLSAqIAorICogICAgICAgICAKKyAqICAgICAgICAgLSBBbiBvcHRpb25hbCBkZXNjcmlwdGlvbi4KKyAqICAgICAgICAgLSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGludGVyY2VwdG9yIGNsYXNzLgorICogICAgICAgICAtIEFuIG9wdGlvbmFsIGxpc3Qgb2YgYXJvdW5kIGludm9rZSBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZQorICogICAgICAgICBpbnRlcmNlcHRvciBjbGFzcyBhbmQvb3IgaXRzIHN1cGVyLWNsYXNzZXMuCisgKiAgICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBhcm91bmQgdGltZW91dCBtZXRob2RzIGRlY2xhcmVkIG9uIHRoZQorICogICAgICAgICBpbnRlcmNlcHRvciBjbGFzcyBhbmQvb3IgaXRzIHN1cGVyLWNsYXNzZXMuCisgKiAgICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBlbnZpcm9ubWVudCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBpbnRlcmNlcHRvcgorICogICAgICAgICBjbGFzcyBhbmQvb3IgaXRzIHN1cGVyLWNsYXNzZXMuCisgKiAgICAgICAgIC0gQW4gb3B0aW9uYWwgbGlzdCBvZiBwb3N0LWFjdGl2YXRlIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlCisgKiAgICAgICAgIGludGVyY2VwdG9yIGNsYXNzIGFuZC9vciBpdHMgc3VwZXItY2xhc3Nlcy4KKyAqICAgICAgICAgLSBBbiBvcHRpb25hbCBsaXN0IG9mIHByZS1wYXNzaXZhdGUgbWV0aG9kcyBkZWNsYXJlZCBvbiB0aGUKKyAqICAgICAgICAgaW50ZXJjZXB0b3IgY2xhc3MgYW5kL29yIGl0cyBzdXBlci1jbGFzc2VzLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNDUsNiArNjAsNyBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldEludGVyY2VwdG9yQ2xhc3MgPGVtPkludGVyY2VwdG9yIENsYXNzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0QXJvdW5kSW52b2tlcyA8ZW0+QXJvdW5kIEludm9rZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRBcm91bmRUaW1lb3V0cyA8ZW0+QXJvdW5kIFRpbWVvdXRzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgpAQCAtNTYsNiArNzIsNyBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQb3N0Q29uc3RydWN0cyA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldERhdGFTb3VyY2UgPGVtPkRhdGEgU291cmNlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UG9zdEFjdGl2YXRlcyA8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRQcmVQYXNzaXZhdGVzIDxlbT5QcmUgUGFzc2l2YXRlczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CkBAIC04MCw3ICs5Nyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJjZXB0b3IgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTEyMCw3ICsxMzcsMjIgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX0Fyb3VuZEludm9rZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEFyb3VuZEludm9rZXMoKTsKKwlMaXN0PEFyb3VuZEludm9rZVR5cGU+IGdldEFyb3VuZEludm9rZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFyb3VuZCBUaW1lb3V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZFRpbWVvdXRUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFyb3VuZCBUaW1lb3V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFyb3VuZCBUaW1lb3V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX0Fyb3VuZFRpbWVvdXRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxBcm91bmRUaW1lb3V0VHlwZT4gZ2V0QXJvdW5kVGltZW91dHMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEzNSw3ICsxNjcsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfRW52RW50cmllcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RW52RW50cmllcygpOworCUxpc3Q8RW52RW50cnk+IGdldEVudkVudHJpZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE1MCw3ICsxODIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfRWpiUmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RWpiUmVmcygpOworCUxpc3Q8RWpiUmVmPiBnZXRFamJSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xNjUsNyArMTk3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX0VqYkxvY2FsUmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RWpiTG9jYWxSZWZzKCk7CisJTGlzdDxFamJMb2NhbFJlZj4gZ2V0RWpiTG9jYWxSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTgwLDcgKzIxMiw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9TZXJ2aWNlUmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKKwlMaXN0PFNlcnZpY2VSZWY+IGdldFNlcnZpY2VSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE5NSw3ICsyMjcsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRSZXNvdXJjZVJlZnMoKTsKKwlMaXN0PFJlc291cmNlUmVmPiBnZXRSZXNvdXJjZVJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTIxMCw3ICsyNDIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VFbnZSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRSZXNvdXJjZUVudlJlZnMoKTsKKwlMaXN0PFJlc291cmNlRW52UmVmPiBnZXRSZXNvdXJjZUVudlJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yMjUsNyArMjU3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKKwlMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvblJlZj4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTI0MCw3ICsyNzIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOworCUxpc3Q8UGVyc2lzdGVuY2VDb250ZXh0UmVmPiBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjU1LDcgKzI4Nyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7CisJTGlzdDxQZXJzaXN0ZW5jZVVuaXRSZWY+IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgQ29uc3RydWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yNzAsNyArMzAyLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0SW50ZXJjZXB0b3JUeXBlX1Bvc3RDb25zdHJ1Y3RzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRQb3N0Q29uc3RydWN0cygpOworCUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IGdldFBvc3RDb25zdHJ1Y3RzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjg1LDcgKzMxNywyMiBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvclR5cGVfUHJlRGVzdHJveXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFByZURlc3Ryb3lzKCk7CisJTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gZ2V0UHJlRGVzdHJveXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGEgU291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRhdGEgU291cmNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBTb3VyY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9EYXRhU291cmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxEYXRhU291cmNlVHlwZT4gZ2V0RGF0YVNvdXJjZSgpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBBY3RpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMzAwLDcgKzM0Nyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9Qb3N0QWN0aXZhdGVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRQb3N0QWN0aXZhdGVzKCk7CisJTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gZ2V0UG9zdEFjdGl2YXRlcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIFBhc3NpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMzE1LDcgKzM2Miw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldEludGVyY2VwdG9yVHlwZV9QcmVQYXNzaXZhdGVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRQcmVQYXNzaXZhdGVzKCk7CisJTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gZ2V0UHJlUGFzc2l2YXRlcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0ludGVyY2VwdG9yc1R5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL0ludGVyY2VwdG9yc1R5cGUuamF2YQppbmRleCAyODUxNjQ0Li45ZjA5NDZiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9JbnRlcmNlcHRvcnNUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvSW50ZXJjZXB0b3JzVHlwZS5qYXZhCkBAIC0xMiw2ICsxMiw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwogCiAvKioKQEAgLTIzLDEyICsyNCwxMyBAQAogICogCiAgKiAKICAqICAgICAgICAgVGhlIGludGVyY2VwdG9yc1R5cGUgZWxlbWVudCBkZWNsYXJlcyBvbmUgb3IgbW9yZSBpbnRlcmNlcHRvcgotICogICAgICAgICBjbGFzc2VzIHVzZWQgYnkgY29tcG9uZW50cyB3aXRoaW4gdGhpcyBlamItamFyLiAgVGhlIGRlY2xhcmF0aW9uCisgKiAgICAgICAgIGNsYXNzZXMgdXNlZCBieSBjb21wb25lbnRzIHdpdGhpbiB0aGlzIGVqYi1qYXIgb3IgLndhci4gIFRoZSBkZWNsYXJhdGlvbgogICogICAgICAgICBjb25zaXN0cyBvZiA6Ci0gKiAKLSAqICAgICAgICAgICAgIC0gQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24uCi0gKiAgICAgICAgICAgICAtIE9uZSBvciBtb3JlIGludGVyY2VwdG9yIGVsZW1lbnRzLgotICogCisgKiAgICAgICAgIAorICogICAgICAgICAtIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLgorICogICAgICAgICAtIE9uZSBvciBtb3JlIGludGVyY2VwdG9yIGVsZW1lbnRzLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNTksNyArNjEsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvcnNUeXBlX0Rlc2NyaXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7CisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNzQsNyArNzYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRJbnRlcmNlcHRvcnNUeXBlX0ludGVyY2VwdG9ycygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0SW50ZXJjZXB0b3JzKCk7CisJTGlzdDxJbnRlcmNlcHRvclR5cGU+IGdldEludGVyY2VwdG9ycygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01lc3NhZ2VEcml2ZW5CZWFuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXNzYWdlRHJpdmVuQmVhbi5qYXZhCmluZGV4IDllZjFmZjcuLjgwZmJlNzYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01lc3NhZ2VEcml2ZW5CZWFuLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWVzc2FnZURyaXZlbkJlYW4uamF2YQpAQCAtMTIsNyArMTIsMjIgQEAKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjIsNTIgKzM3LDYwIEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIG1lc3NhZ2UtZHJpdmVuIGVsZW1lbnQgZGVjbGFyZXMgYSBtZXNzYWdlLWRyaXZlbgotICogCWJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLSAqIAotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotICogCSAgICAgIGljb24gZmlsZSBuYW1lLgotICogCSAgICAtIGEgbmFtZSBhc3NpZ25lZCB0byB0aGUgZW50ZXJwcmlzZSBiZWFuIGluCi0gKiAJICAgICAgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQtbmFtZSBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQotICogICAgICAgICAgICAgICB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwaHlzaWNhbAotICogICAgICAgICAgICAgICBqbmRpLW5hbWUgb2YgZGVzdGluYXRpb24gZnJvbSB3aGljaCB0aGlzIG1lc3NhZ2UtZHJpdmVuIGJlYW4KLSAqICAgICAgICAgICAgICAgc2hvdWxkIGNvbnN1bWUuICBUaGlzIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHN1cHBvcnRlZAotICogICAgICAgICAgICAgICBieSBhbGwgaW1wbGVtZW50YXRpb25zLiAgQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgotICogCSAgICAtIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2luZwotICogCSAgICAgIHR5cGUKLSAqICAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB0aW1lb3V0IG1ldGhvZC4KLSAqIAkgICAgLSB0aGUgb3B0aW9uYWwgbWVzc2FnZS1kcml2ZW4gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQKLSAqICAgICAgICAgICAgICAgdHlwZS4gSWYgaXQgaXMgbm90IGRlZmluZWQsIGl0IGlzIGRlZmF1bHRlZCB0byBDb250YWluZXIuCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICogCSAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZQotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MKLSAqIAkgICAgICBtZXNzYWdlLWRlc3RpbmF0aW9uLWxpbmsKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbidzCi0gKiAJICAgICAgYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMKLSAqICAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgbGlzdCBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbiBjbGFzcyBhbmQvb3IKLSAqICAgICAgICAgICAgICAgc3VwZXJjbGFzcyBhcm91bmQtaW52b2tlIG1ldGhvZHMuCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAotICogCSAgICAgIGVudHJpZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCBFSkIKLSAqIAkgICAgICByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIgc2VydmljZQotICogCSAgICAgIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkKLSAqIAkgICAgICBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MKLSAqIAkgICAgICBtZXRob2RzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICogCSAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5Ci0gKiAJICAgICAgcmVmZXJlbmNlcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UKLSAqIAkgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLgotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZQotICogCSAgICAgIGRlc3RpbmF0aW9uIHJlZmVyZW5jZXMKLSAqIAorICogICAgICAgICBUaGUgbWVzc2FnZS1kcml2ZW4gZWxlbWVudCBkZWNsYXJlcyBhIG1lc3NhZ2UtZHJpdmVuCisgKiAgICAgICAgIGJlYW4uIFRoZSBkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKKyAqICAgICAgICAgCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24KKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkaXNwbGF5IG5hbWUKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBpY29uIGVsZW1lbnQgdGhhdCBjb250YWlucyBhIHNtYWxsIGFuZCBhIGxhcmdlIAorICogICAgICAgICBpY29uIGZpbGUgbmFtZS4gCisgKiAgICAgICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4gaW4KKyAqICAgICAgICAgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICogICAgICAgICAtIGFuIG9wdGlvbmFsIG1hcHBlZC1uYW1lIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlCisgKiAgICAgICAgIHZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHBoeXNpY2FsCisgKiAgICAgICAgIGpuZGktbmFtZSBvZiBkZXN0aW5hdGlvbiBmcm9tIHdoaWNoIHRoaXMgbWVzc2FnZS1kcml2ZW4gYmVhbgorICogICAgICAgICBzaG91bGQgY29uc3VtZS4gIFRoaXMgZWxlbWVudCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgc3VwcG9ydGVkIAorICogICAgICAgICBieSBhbGwgaW1wbGVtZW50YXRpb25zLiAgQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgorICogICAgICAgICAtIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIG1lc3NhZ2luZyAKKyAqICAgICAgICAgdHlwZSAKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHRpbWVvdXQgbWV0aG9kIGZvcgorICogICAgICAgICBoYW5kbGluZyBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZWQgdGltZXJzCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGltZXJzIHRvIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhdAorICogICAgICAgICBkZXBsb3ltZW50IHRpbWUKKyAqICAgICAgICAgLSB0aGUgb3B0aW9uYWwgbWVzc2FnZS1kcml2ZW4gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgCisgKiAgICAgICAgIHR5cGUuIElmIGl0IGlzIG5vdCBkZWZpbmVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gQ29udGFpbmVyLgorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgCisgKiAgICAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tdHlwZQorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgCisgKiAgICAgICAgIG1lc3NhZ2UtZGVzdGluYXRpb24tbGluaworICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuJ3MKKyAqICAgICAgICAgYWN0aXZhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuIGNsYXNzIGFuZC9vcgorICogICAgICAgICBzdXBlcmNsYXNzIGFyb3VuZC1pbnZva2UgbWV0aG9kcy4KKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuIGNsYXNzIGFuZC9vcgorICogICAgICAgICBzdXBlcmNsYXNzIGFyb3VuZC10aW1lb3V0IG1ldGhvZHMuCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBlbnZpcm9ubWVudAorICogICAgICAgICBlbnRyaWVzCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBFSkIgcmVmZXJlbmNlcworICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCCisgKiAgICAgICAgIHJlZmVyZW5jZXMKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYiBzZXJ2aWNlCisgKiAgICAgICAgIHJlZmVyZW5jZXMKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZSAKKyAqICAgICAgICAgcmVmZXJlbmNlcworICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eQorICogICAgICAgICBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MKKyAqICAgICAgICAgbWV0aG9kcworICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgCisgKiAgICAgICAgIHJlc291cmNlIG1hbmFnZXIgY29ubmVjdGlvbiBmYWN0b3J5IAorICogICAgICAgICByZWZlcmVuY2VzCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQorICogICAgICAgICBlbnZpcm9ubWVudCByZWZlcmVuY2VzLgorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbWVzc2FnZSAKKyAqICAgICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcworICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtODIsMTEgKzEwNSwxMyBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVqYkNsYXNzIDxlbT5FamIgQ2xhc3M8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2luZ1R5cGUgPGVtPk1lc3NhZ2luZyBUeXBlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRUaW1lb3V0TWV0aG9kIDxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0VGltZXIgPGVtPlRpbWVyPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldE1lc3NhZ2VEZXN0aW5hdGlvblR5cGUgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gVHlwZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0TWVzc2FnZURlc3RpbmF0aW9uTGluayA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBMaW5rPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRBY3RpdmF0aW9uQ29uZmlnIDxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0QXJvdW5kSW52b2tlcyA8ZW0+QXJvdW5kIEludm9rZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEFyb3VuZFRpbWVvdXRzIDxlbT5Bcm91bmQgVGltZW91dHM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RWpiTG9jYWxSZWZzIDxlbT5FamIgTG9jYWwgUmVmczwvZW0+fTwvbGk+CkBAIC05OCw2ICsxMjMsOCBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RGF0YVNvdXJjZSA8ZW0+RGF0YSBTb3VyY2U8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFNlY3VyaXR5Um9sZVJlZiA8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFNlY3VyaXR5SWRlbnRpdHkgPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgogICogPC91bD4KQEAgLTEyMSw3ICsxNDgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMzYsNyArMTYzLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fRGlzcGxheU5hbWVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKKwlMaXN0PERpc3BsYXlOYW1lPiBnZXREaXNwbGF5TmFtZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE1MSw3ICsxNzgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9JY29ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKKwlMaXN0PEljb24+IGdldEljb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FamIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMjEwLDExICsyMzcsMTIgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAgICAgICAgICAgICAgVGhlIGVqYi1jbGFzcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUKLQkgKiAgICAgICAgICAgICAgb2YgdGhlIGJlYW4gY2xhc3MgZm9yIHRoaXMgZWpiLiAgSXQgaXMgcmVxdWlyZWQgdW5sZXNzCi0JICogICAgICAgICAgICAgIHRoZXJlIGlzIGEgY29tcG9uZW50LWRlZmluaW5nIGFubm90YXRpb24gZm9yIHRoZSBzYW1lCi0JICogICAgICAgICAgICAgIGVqYi1uYW1lLgotCSAqIAorCSAqICAgICAgICAgICAgIFRoZSBlamItY2xhc3MgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lCisJICogICAgICAgICAgICAgb2YgdGhlIGJlYW4gY2xhc3MgZm9yIHRoaXMgZWpiLiAgSXQgaXMgcmVxdWlyZWQgdW5sZXNzCisJICogICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21wb25lbnQtZGVmaW5pbmcgYW5ub3RhdGlvbiBmb3IgdGhlIHNhbWUKKwkgKiAgICAgICAgICAgICBlamItbmFtZS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBFSkIgMy4wCiAJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgpAQCAtMjQxLDEwICsyNjksMTEgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSBtZXNzYWdpbmctdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWVzc2FnZQotCSAqIAkgICAgbGlzdGVuZXIgaW50ZXJmYWNlIG9mIHRoZSBtZXNzYWdlLWRyaXZlbiBiZWFuLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSBtZXNzYWdpbmctdHlwZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbWVzc2FnZQorCSAqICAgICAgICAgICAgIGxpc3RlbmVyIGludGVyZmFjZSBvZiB0aGUgbWVzc2FnZS1kcml2ZW4gYmVhbi4gCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnaW5nIFR5cGU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldE1lc3NhZ2luZ1R5cGUoU3RyaW5nKQpAQCAtMjcxLDYgKzMwMCwxNiBAQAogCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KIAkgKiA8L3A+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIHRpbWVvdXQtbWV0aG9kIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtZXRob2QgdGhhdAorCSAqICAgICAgICAgICAgIHdpbGwgcmVjZWl2ZSBjYWxsYmFja3MgZm9yIHByb2dyYW1tYXRpY2FsbHkKKwkgKiAgICAgICAgICAgICBjcmVhdGVkIHRpbWVycy4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBFSkIgMy4wCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCiAJICogQHNlZSAjc2V0VGltZW91dE1ldGhvZChOYW1lZE1ldGhvZFR5cGUpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX1RpbWVvdXRNZXRob2QoKQpAQCAtMjg5LDggKzMyOCwyMiBAQAogCXZvaWQgc2V0VGltZW91dE1ldGhvZChOYW1lZE1ldGhvZFR5cGUgdmFsdWUpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGltZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fVGltZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PFRpbWVyVHlwZT4gZ2V0VGltZXIoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iQmVhbiI8L2NvZGU+LgogCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uVHlwZX0uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KQEAgLTQzMiw3ICs0ODUsMjIgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fQXJvdW5kSW52b2tlcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0QXJvdW5kSW52b2tlcygpOworCUxpc3Q8QXJvdW5kSW52b2tlVHlwZT4gZ2V0QXJvdW5kSW52b2tlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXJvdW5kIFRpbWVvdXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kVGltZW91dFR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXJvdW5kIFRpbWVvdXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXJvdW5kIFRpbWVvdXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9Bcm91bmRUaW1lb3V0cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8QXJvdW5kVGltZW91dFR5cGU+IGdldEFyb3VuZFRpbWVvdXRzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC00NDcsNyArNTE1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fRW52RW50cmllcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RW52RW50cmllcygpOworCUxpc3Q8RW52RW50cnk+IGdldEVudkVudHJpZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQ2Miw3ICs1MzAsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRFamJSZWZzKCk7CisJTGlzdDxFamJSZWY+IGdldEVqYlJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQ3Nyw3ICs1NDUsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJMb2NhbFJlZnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEVqYkxvY2FsUmVmcygpOworCUxpc3Q8RWpiTG9jYWxSZWY+IGdldEVqYkxvY2FsUmVmcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQ5Miw3ICs1NjAsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9TZXJ2aWNlUmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKKwlMaXN0PFNlcnZpY2VSZWY+IGdldFNlcnZpY2VSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTUwNyw3ICs1NzUsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZVJlZnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFJlc291cmNlUmVmcygpOworCUxpc3Q8UmVzb3VyY2VSZWY+IGdldFJlc291cmNlUmVmcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNTIyLDcgKzU5MCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX1Jlc291cmNlRW52UmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCk7CisJTGlzdDxSZXNvdXJjZUVudlJlZj4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNTM3LDcgKzYwNSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKKwlMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvblJlZj4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTU1Miw3ICs2MjAsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7CisJTGlzdDxQZXJzaXN0ZW5jZUNvbnRleHRSZWY+IGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC01NjcsNyArNjM1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpOworCUxpc3Q8UGVyc2lzdGVuY2VVbml0UmVmPiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNTgyLDcgKzY1MCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1lc3NhZ2VEcml2ZW5CZWFuX1Bvc3RDb25zdHJ1Y3RzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRQb3N0Q29uc3RydWN0cygpOworCUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IGdldFBvc3RDb25zdHJ1Y3RzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNTk3LDcgKzY2NSwzOCBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXNzYWdlRHJpdmVuQmVhbl9QcmVEZXN0cm95cygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0UHJlRGVzdHJveXMoKTsKKwlMaXN0PExpZmVjeWNsZUNhbGxiYWNrPiBnZXRQcmVEZXN0cm95cygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF0YSBTb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YSBTb3VyY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIFNvdXJjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fRGF0YVNvdXJjZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8RGF0YVNvdXJjZVR5cGU+IGdldERhdGFTb3VyY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBFSkIgMy4xCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VjdXJpdHlSb2xlUmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxTZWN1cml0eVJvbGVSZWY+IGdldFNlY3VyaXR5Um9sZVJlZigpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdXJpdHkgSWRlbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01ldGhvZEludGVyZmFjZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01ldGhvZEludGVyZmFjZVR5cGUuamF2YQppbmRleCAwNWQ5YzcxLi41Yjk2NTFhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RJbnRlcmZhY2VUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWV0aG9kSW50ZXJmYWNlVHlwZS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjQsMzEgKzI0LDEwOSBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGFsbG93cyBhIG1ldGhvZCBlbGVtZW50IHRvCi0gKiAJZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBtZXRob2RzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKLSAqIAlzaWduYXR1cmUgdGhhdCBhcmUgbXVsdGlwbHkgZGVmaW5lZCBhY3Jvc3MgdGhlIGhvbWUgYW5kCi0gKiAJY29tcG9uZW50IGludGVyZmFjZXMgKGUuZywgaW4gYm90aCBhbiBlbnRlcnByaXNlIGJlYW4ncwotICogCXJlbW90ZSBhbmQgbG9jYWwgaW50ZXJmYWNlcyBvciBpbiBib3RoIGFuIGVudGVycHJpc2UgYmVhbidzCi0gKiAJaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGV0Yy4pOyB0aGUgY29tcG9uZW50IGFuZCB3ZWIKLSAqIAlzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMsIGFuZCBzbyBvbi4gVGhlIExvY2FsIGFwcGxpZXMgdG8KLSAqICAgICAgICAgYm90aCBsb2NhbCBjb21wb25lbnQgaW50ZXJmYWNlIGFuZCBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2UuCi0gKiAgICAgICAgIFNpbWlsYXJseSwgUmVtb3RlIGFwcGxpZXMgdG8gYm90aCByZW1vdGUgY29tcG9uZW50IGludGVyZmFjZQotICogICAgICAgICBhbmQgdGhlIHJlbW90ZSBidXNpbmVzcyBpbnRlcmZhY2UuCi0gKiAKLSAqIAlUaGUgbWV0aG9kLWludGYgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogCi0gKiAJICAgIEhvbWUKLSAqIAkgICAgUmVtb3RlCi0gKiAJICAgIExvY2FsSG9tZQotICogCSAgICBMb2NhbAotICogCSAgICBTZXJ2aWNlRW5kcG9pbnQKLSAqIAorICogICAgICAgICBUaGUgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgYSBtZXRob2QgZWxlbWVudCB0bworICogICAgICAgICBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdGhlIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAorICogICAgICAgICBzaWduYXR1cmUgdGhhdCBhcmUgbXVsdGlwbHkgZGVmaW5lZCBhY3Jvc3MgdGhlIGhvbWUgYW5kCisgKiAgICAgICAgIGNvbXBvbmVudCBpbnRlcmZhY2VzIChlLmcsIGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKKyAqICAgICAgICAgcmVtb3RlIGFuZCBsb2NhbCBpbnRlcmZhY2VzIG9yIGluIGJvdGggYW4gZW50ZXJwcmlzZSBiZWFuJ3MKKyAqICAgICAgICAgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMsIGV0Yy4pOyB0aGUgY29tcG9uZW50IGFuZCB3ZWIKKyAqICAgICAgICAgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLCBhbmQgc28gb24uIAorICogICAgICAgICAKKyAqICAgICAgICAgTG9jYWwgYXBwbGllcyB0byB0aGUgbG9jYWwgY29tcG9uZW50IGludGVyZmFjZSwgbG9jYWwgYnVzaW5lc3MgCisgKiAgICAgICAgIGludGVyZmFjZXMsIGFuZCB0aGUgbm8taW50ZXJmYWNlIHZpZXcuIAorICogICAgICAgICAKKyAqICAgICAgICAgUmVtb3RlIGFwcGxpZXMgdG8gYm90aCByZW1vdGUgY29tcG9uZW50IGludGVyZmFjZSBhbmQgdGhlIHJlbW90ZSAKKyAqICAgICAgICAgYnVzaW5lc3MgaW50ZXJmYWNlcy4gIAorICogICAgICAgICAKKyAqICAgICAgICAgU2VydmljZUVuZHBvaW50IHJlZmVycyB0byBtZXRob2RzIGV4cG9zZWQgdGhyb3VnaCBhIHdlYiBzZXJ2aWNlCisgKiAgICAgICAgIGVuZHBvaW50LgorICogICAgICAgICAKKyAqICAgICAgICAgVGltZXIgcmVmZXJzIHRvIHRoZSBiZWFuJ3MgdGltZW91dCBjYWxsYmFjayBtZXRob2RzLgorICogICAgICAgICAKKyAqICAgICAgICAgTWVzc2FnZUVuZHBvaW50IHJlZmVycyB0byB0aGUgbWV0aG9kcyBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4ncworICogICAgICAgICBtZXNzYWdlLWxpc3RlbmVyIGludGVyZmFjZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBtZXRob2QtaW50ZiBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICAgIAorICogICAgICAgICBIb21lCisgKiAgICAgICAgIFJlbW90ZQorICogICAgICAgICBMb2NhbEhvbWUKKyAqICAgICAgICAgTG9jYWwKKyAqICAgICAgICAgU2VydmljZUVuZHBvaW50CisgKiAgICAgICAgIFRpbWVyCisgKiAgICAgICAgIE1lc3NhZ2VFbmRwb2ludAorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWV0aG9kSW50ZXJmYWNlVHlwZSgpCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXRob2RJbnRlcmZhY2VUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKK3B1YmxpYyBlbnVtIE1ldGhvZEludGVyZmFjZVR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCit7CisJLyoqCisJICogVGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNIT01FCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJSE9NRV9MSVRFUkFMKDAsICJIb21lIiwgIkhvbWUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyoqCisJICogVGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1JFTU9URQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVJFTU9URV9MSVRFUkFMKDEsICJSZW1vdGUiLCAiUmVtb3RlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTE9DQUxfSE9NRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUxPQ0FMX0hPTUVfTElURVJBTCgyLCAiTG9jYWxIb21lIiwgIkxvY2FsSG9tZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNMT0NBTAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUxPQ0FMX0xJVEVSQUwoMywgIkxvY2FsIiwgIkxvY2FsIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU0VSVklDRV9FTkRQT0lOVAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVNFUlZJQ0VfRU5EUE9JTlRfTElURVJBTCg0LCAiU2VydmljZUVuZHBvaW50IiwgIlNlcnZpY2VFbmRwb2ludCIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5UaW1lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNUSU1FUgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVRJTUVSX0xJVEVSQUwoNSwgIlRpbWVyIiwgIlRpbWVyIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPk1lc3NhZ2UgRW5kcG9pbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTUVTU0FHRV9FTkRQT0lOVAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU1FU1NBR0VfRU5EUE9JTlRfTElURVJBTCg2LCAiTWVzc2FnZUVuZHBvaW50IiwgIk1lc3NhZ2VFbmRwb2ludCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5Ib21lPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0xMjAsNTQgKzE5OCwzNCBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfRU5EUE9JTlQgPSA0OwogCiAJLyoqCi0JICogVGhlICc8ZW0+PGI+SG9tZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogVGhlICc8ZW0+PGI+VGltZXI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNIT01FCisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogICAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBFSkIgMy4xCisJICogICAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEBzZWUgI1RJTUVSX0xJVEVSQUwKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZEludGVyZmFjZVR5cGUgSE9NRV9MSVRFUkFMID0gbmV3IE1ldGhvZEludGVyZmFjZVR5cGUoSE9NRSwgIkhvbWUiLCAiSG9tZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FUiA9IDU7CiAKIAkvKioKLQkgKiBUaGUgJzxlbT48Yj5SZW1vdGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIFRoZSAnPGVtPjxiPk1lc3NhZ2UgRW5kcG9pbnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRU1PVEUKKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIEVKQiAzLjEKKwkgKiAgICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHNlZSAjTUVTU0FHRV9FTkRQT0lOVF9MSVRFUkFMCiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RJbnRlcmZhY2VUeXBlIFJFTU9URV9MSVRFUkFMID0gbmV3IE1ldGhvZEludGVyZmFjZVR5cGUoUkVNT1RFLCAiUmVtb3RlIiwgIlJlbW90ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIEhvbWU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfSE9NRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kSW50ZXJmYWNlVHlwZSBMT0NBTF9IT01FX0xJVEVSQUwgPSBuZXcgTWV0aG9kSW50ZXJmYWNlVHlwZShMT0NBTF9IT01FLCAiTG9jYWxIb21lIiwgIkxvY2FsSG9tZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RJbnRlcmZhY2VUeXBlIExPQ0FMX0xJVEVSQUwgPSBuZXcgTWV0aG9kSW50ZXJmYWNlVHlwZShMT0NBTCwgIkxvY2FsIiwgIkxvY2FsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVJWSUNFX0VORFBPSU5UCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RJbnRlcmZhY2VUeXBlIFNFUlZJQ0VfRU5EUE9JTlRfTElURVJBTCA9IG5ldyBNZXRob2RJbnRlcmZhY2VUeXBlKFNFUlZJQ0VfRU5EUE9JTlQsICJTZXJ2aWNlRW5kcG9pbnQiLCAiU2VydmljZUVuZHBvaW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfRU5EUE9JTlQgPSA2OwogCiAJLyoqCiAJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk1ldGhvZCBJbnRlcmZhY2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCkBAIC0xODIsNiArMjQwLDggQEAKIAkJCUxPQ0FMX0hPTUVfTElURVJBTCwKIAkJCUxPQ0FMX0xJVEVSQUwsCiAJCQlTRVJWSUNFX0VORFBPSU5UX0xJVEVSQUwsCisJCQlUSU1FUl9MSVRFUkFMLAorCQkJTUVTU0FHRV9FTkRQT0lOVF9MSVRFUkFMLAogCQl9OwogCiAJLyoqCkBAIC0xOTAsNyArMjUwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8TWV0aG9kSW50ZXJmYWNlVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgJzxlbT48Yj5NZXRob2QgSW50ZXJmYWNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCkBAIC0yMzcsMTggKzI5Nyw4MCBAQAogCQkJY2FzZSBMT0NBTF9IT01FOiByZXR1cm4gTE9DQUxfSE9NRV9MSVRFUkFMOwogCQkJY2FzZSBMT0NBTDogcmV0dXJuIExPQ0FMX0xJVEVSQUw7CiAJCQljYXNlIFNFUlZJQ0VfRU5EUE9JTlQ6IHJldHVybiBTRVJWSUNFX0VORFBPSU5UX0xJVEVSQUw7CisJCQljYXNlIFRJTUVSOiByZXR1cm4gVElNRVJfTElURVJBTDsKKwkJCWNhc2UgTUVTU0FHRV9FTkRQT0lOVDogcmV0dXJuIE1FU1NBR0VfRU5EUE9JTlRfTElURVJBTDsKIAkJfQotCQlyZXR1cm4gbnVsbDsJCisJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKIAkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHJpdmF0ZSBNZXRob2RJbnRlcmZhY2VUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwogCX0KIAotfSAvL01ldGhvZEludGVyZmFjZVR5cGUKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWV0aG9kUGFyYW1zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RQYXJhbXMuamF2YQppbmRleCA2OGM1NjgxLi42NjAzODUyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RQYXJhbXMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RQYXJhbXMuamF2YQpAQCAtMjIsOSArMjIsMTAgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgbWV0aG9kLXBhcmFtc1R5cGUgZGVmaW5lcyBhIGxpc3Qgb2YgdGhlCi0gKiAJZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lcyBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMuCi0gKiAKKyAqICAgICAgICAgVGhlIG1ldGhvZC1wYXJhbXNUeXBlIGRlZmluZXMgYSBsaXN0IG9mIHRoZQorICogICAgICAgICBmdWxseS1xdWFsaWZpZWQgSmF2YSB0eXBlIG5hbWVzIG9mIHRoZSBtZXRob2QgcGFyYW1ldGVycy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTQ5LDE3ICs1MCwxOCBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIG1ldGhvZC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIGEgcHJpbWl0aXZlCi0JICogCSAgICBvciBhIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGUgbmFtZSBvZiBhIG1ldGhvZAotCSAqIAkgICAgcGFyYW1ldGVyLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSBtZXRob2QtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIHByaW1pdGl2ZQorCSAqICAgICAgICAgICAgIG9yIGEgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZSBuYW1lIG9mIGEgbWV0aG9kCisJICogICAgICAgICAgICAgcGFyYW1ldGVyLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1ldGhvZFBhcmFtc19NZXRob2RQYXJhbXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldE1ldGhvZFBhcmFtcygpOworCUxpc3Q8U3RyaW5nPiBnZXRNZXRob2RQYXJhbXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RQZXJtaXNzaW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RQZXJtaXNzaW9uLmphdmEKaW5kZXggNmJkOTg2ZC4uMDlhNWVkNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWV0aG9kUGVybWlzc2lvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01ldGhvZFBlcm1pc3Npb24uamF2YQpAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwogCkBAIC0yMywxOSArMjQsMjAgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlCi0gKiAJc2VjdXJpdHkgcm9sZXMgYXJlIGFsbG93ZWQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGVudGVycHJpc2UKLSAqIAliZWFuIG1ldGhvZHMuIFRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUgY29uc2lzdHMgb2YgYW4KLSAqIAlvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMgb3IgYW4KLSAqIAlpbmRpY2F0b3IgdG8gc3RhdGUgdGhhdCB0aGUgbWV0aG9kIGlzIHVuY2hlY2tlZCBmb3IKLSAqIAlhdXRob3JpemF0aW9uLCBhbmQgYSBsaXN0IG9mIG1ldGhvZCBlbGVtZW50cy4KLSAqIAotICogCVRoZSBzZWN1cml0eSByb2xlcyB1c2VkIGluIHRoZSBtZXRob2QtcGVybWlzc2lvblR5cGUKLSAqIAltdXN0IGJlIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMgb2YgdGhlCi0gKiAJZGVwbG95bWVudCBkZXNjcmlwdG9yLCBhbmQgdGhlIG1ldGhvZHMgbXVzdCBiZSBtZXRob2RzCi0gKiAJZGVmaW5lZCBpbiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudAorICogICAgICAgICBUaGUgbWV0aG9kLXBlcm1pc3Npb25UeXBlIHNwZWNpZmllcyB0aGF0IG9uZSBvciBtb3JlCisgKiAgICAgICAgIHNlY3VyaXR5IHJvbGVzIGFyZSBhbGxvd2VkIHRvIGludm9rZSBvbmUgb3IgbW9yZSBlbnRlcnByaXNlCisgKiAgICAgICAgIGJlYW4gbWV0aG9kcy4gVGhlIG1ldGhvZC1wZXJtaXNzaW9uVHlwZSBjb25zaXN0cyBvZiBhbgorICogICAgICAgICBvcHRpb25hbCBkZXNjcmlwdGlvbiwgYSBsaXN0IG9mIHNlY3VyaXR5IHJvbGUgbmFtZXMgb3IgYW4KKyAqICAgICAgICAgaW5kaWNhdG9yIHRvIHN0YXRlIHRoYXQgdGhlIG1ldGhvZCBpcyB1bmNoZWNrZWQgZm9yCisgKiAgICAgICAgIGF1dGhvcml6YXRpb24sIGFuZCBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzLgorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIHNlY3VyaXR5IHJvbGVzIHVzZWQgaW4gdGhlIG1ldGhvZC1wZXJtaXNzaW9uVHlwZQorICogICAgICAgICBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMgb2YgdGhlCisgKiAgICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgYW5kIHRoZSBtZXRob2RzIG11c3QgYmUgbWV0aG9kcworICogICAgICAgICBkZWZpbmVkIGluIHRoZSBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcywgaG9tZSwgY29tcG9uZW50IAogICogICAgICAgICBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcy4KLSAqIAorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNjgsNyArNzAsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7CisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KQEAgLTgzLDcgKzg1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlTmFtZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFJvbGVOYW1lcygpOworCUxpc3Q8U3RyaW5nPiBnZXRSb2xlTmFtZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuY2hlY2tlZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtOTIsMTEgKzk0LDEyIEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICAgIFRoZSB1bmNoZWNrZWQgZWxlbWVudCBzcGVjaWZpZXMgdGhhdCBhIG1ldGhvZCBpcwotCSAqIAkgICAgICBub3QgY2hlY2tlZCBmb3IgYXV0aG9yaXphdGlvbiBieSB0aGUgY29udGFpbmVyCi0JICogCSAgICAgIHByaW9yIHRvIGludm9jYXRpb24gb2YgdGhlIG1ldGhvZC4KLQkgKiAKLQkgKiAJICAgIAorCSAqICAgICAgICAgICAgICAgVGhlIHVuY2hlY2tlZCBlbGVtZW50IHNwZWNpZmllcyB0aGF0IGEgbWV0aG9kIGlzCisJICogICAgICAgICAgICAgICBub3QgY2hlY2tlZCBmb3IgYXV0aG9yaXphdGlvbiBieSB0aGUgY29udGFpbmVyCisJICogICAgICAgICAgICAgICBwcmlvciB0byBpbnZvY2F0aW9uIG9mIHRoZSBtZXRob2QuCisJICogICAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKKwkgKiAgICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5jaGVja2VkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiBAc2VlICNzZXRVbmNoZWNrZWQoRW1wdHlUeXBlKQpAQCAtMTI4LDcgKzEzMSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0TWV0aG9kcygpOworCUxpc3Q8TWV0aG9kVHlwZT4gZ2V0TWV0aG9kcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01ldGhvZFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL01ldGhvZFR5cGUuamF2YQppbmRleCA0MGQ2NTBjLi5jOThjOWM5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NZXRob2RUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTWV0aG9kVHlwZS5qYXZhCkBAIC0xMiw2ICsxMiw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwogCiAvKioKQEAgLTIxLDE4NCArMjIsMTg0IEBACiAgKgogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKLSAqIAkKLSAqIAotICogCSAgVGhlIG1ldGhvZFR5cGUgaXMgdXNlZCB0byBkZW5vdGUgYSBtZXRob2Qgb2YgYW4gZW50ZXJwcmlzZQotICogCSAgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludAotICogCSAgaW50ZXJmYWNlLCBvciwgaW4gdGhlIGNhc2Ugb2YgYSBtZXNzYWdlLWRyaXZlbiBiZWFuLCB0aGUKLSAqIAkgIGJlYW4ncyBtZXNzYWdlIGxpc3RlbmVyIG1ldGhvZCwgb3IgYSBzZXQgb2Ygc3VjaAotICogCSAgbWV0aG9kcy4gVGhlIGVqYi1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlCi0gKiAJICBlbnRlcnByaXNlIGJlYW5zIGRlY2xhcmVkIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3I7IHRoZQotICogCSAgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBhbGxvd3MgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhCi0gKiAJICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBpcyBtdWx0aXBseSBkZWZpbmVkCi0gKiAJICBhY3Jvc3MgdGhlIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZQotICogICAgICAgICAgIGVuZHBvaW50IG50ZXJmYWNlczsgdGhlIG1ldGhvZC1uYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZQotICogICAgICAgICAgIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkKLSAqICAgICAgICAgICBhIHNpbmdsZSBtZXRob2QgYW1vbmcgbXVsdGlwbGUgbWV0aG9kcyB3aXRoIGFuIG92ZXJsb2FkZWQKLSAqIAkgIG1ldGhvZCBuYW1lLgotICogCi0gKiAJICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3R5bGVzIG9mIHVzaW5nIG1ldGhvZFR5cGUgZWxlbWVudAotICogCSAgd2l0aGluIGEgbWV0aG9kIGVsZW1lbnQ6Ci0gKiAKLSAqIAkgIDEuCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFSkJOQU1FJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7KiZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUKLSAqIAkgICAgIHNwZWNpZmllZCBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcywgaG9tZSwgY29tcG9uZW50LAotICogICAgICAgICAgICAgIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzLgotICogCi0gKiAJICAyLgotICogCSAgJmx0O21ldGhvZCZndDsKLSAqIAkgICAgICAmbHQ7ZWpiLW5hbWUmZ3Q7RUpCTkFNRSZsdDsvZWpiLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1uYW1lJmd0O01FVEhPRCZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mCi0gKiAJICAgICB0aGUgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbi4gSWYgdGhlcmUgYXJlIG11bHRpcGxlCi0gKiAJICAgICBtZXRob2RzIHdpdGggdGhlIHNhbWUgb3ZlcmxvYWRlZCBuYW1lLCB0aGUgZWxlbWVudCBvZgotICogCSAgICAgdGhpcyBzdHlsZSByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQKLSAqIAkgICAgIG5hbWUuCi0gKiAKLSAqIAkgIDMuCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFSkJOQU1FJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7TUVUSE9EJmx0Oy9tZXRob2QtbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLXBhcmFtcyZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O1BBUkFNLTEmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O1BBUkFNLTImbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkJICAuLi4KLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O1BBUkFNLW4mbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkgICAgICAmbHQ7L21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgc2luZ2xlIG1ldGhvZCB3aXRoaW4gYQotICogCSAgICAgc2V0IG9mIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaAotICogCSAgICAgUEFSQU0tbiBhcmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBKYXZhIHR5cGVzIG9mIHRoZQotICogCSAgICAgbWV0aG9kJ3MgaW5wdXQgcGFyYW1ldGVycyAoaWYgdGhlIG1ldGhvZCBoYXMgbm8gaW5wdXQKLSAqIAkgICAgIGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBubwotICogCSAgICAgbWV0aG9kLXBhcmFtIGVsZW1lbnRzKS4gQXJyYXlzIGFyZSBzcGVjaWZpZWQgYnkgdGhlCi0gKiAJICAgICBhcnJheSBlbGVtZW50J3MgdHlwZSwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGFpciBvZgotICogCSAgICAgc3F1YXJlIGJyYWNrZXRzIChlLmcuIGludFtdW10pLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKLSAqIAkgICAgIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBvdmVybG9hZGVkIG5hbWUsIHRoaXMgc3R5bGUgcmVmZXJzCi0gKiAJICAgICB0byBhbGwgb2YgdGhlIG92ZXJsb2FkZWQgbWV0aG9kcy4KLSAqIAotICogCSAgRXhhbXBsZXM6Ci0gKiAKLSAqIAkgIFN0eWxlIDE6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIGFsbCB0aGUKLSAqIAkgIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsCi0gKiAgICAgICAgICAgY29tcG9uZW50LCBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlczoKLSAqIAotICogCSAgJmx0O21ldGhvZCZndDsKLSAqIAkgICAgICAmbHQ7ZWpiLW5hbWUmZ3Q7RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7KiZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgU3R5bGUgMjogVGhlIGZvbGxvd2luZyBtZXRob2QgZWxlbWVudCByZWZlcnMgdG8gYWxsIHRoZQotICogCSAgY3JlYXRlIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZQotICogCSAgaW50ZXJmYWNlKHMpLgotICogCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtbmFtZSZndDtjcmVhdGUmbHQ7L21ldGhvZC1uYW1lJmd0OwotICogCSAgJmx0Oy9tZXRob2QmZ3Q7Ci0gKiAKLSAqIAkgIFN0eWxlIDM6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIHRoZQotICogCSAgY3JlYXRlKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBMYXN0TmFtZSkgbWV0aG9kIG9mIHRoZQotICogCSAgRW1wbG95ZWVTZXJ2aWNlIGJlYW4ncyBob21lIGludGVyZmFjZShzKS4KLSAqIAotICogCSAgJmx0O21ldGhvZCZndDsKLSAqIAkgICAgICAmbHQ7ZWpiLW5hbWUmZ3Q7RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7Y3JlYXRlJmx0Oy9tZXRob2QtbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLXBhcmFtcyZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O2phdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O2phdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkgICAgICAmbHQ7L21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGEgU3R5bGUgMyBlbGVtZW50IHdpdGgKLSAqIAkgIG1vcmUgY29tcGxleCBwYXJhbWV0ZXIgdHlwZXMuIFRoZSBtZXRob2QKLSAqIAkgIGZvb2JhcihjaGFyIHMsIGludCBpLCBpbnRbXSBpYXIsIG15cGFja2FnZS5NeUNsYXNzIG15Y2wsCi0gKiAJICBteXBhY2thZ2UuTXlDbGFzc1tdW10gbXljbGFhcikgd291bGQgYmUgc3BlY2lmaWVkIGFzOgotICogCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtbmFtZSZndDtmb29iYXImbHQ7L21ldGhvZC1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtcGFyYW1zJmd0OwotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7Y2hhciZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7aW50Jmx0Oy9tZXRob2QtcGFyYW0mZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbSZndDtpbnRbXSZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCQkgICZsdDttZXRob2QtcGFyYW0mZ3Q7bXlwYWNrYWdlLk15Q2xhc3MmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O215cGFja2FnZS5NeUNsYXNzW11bXSZsdDsvbWV0aG9kLXBhcmFtJmd0OwotICogCSAgICAgICZsdDsvbWV0aG9kLXBhcmFtcyZndDsKLSAqIAkgICZsdDsvbWV0aG9kJmd0OwotICogCi0gKiAJICBUaGUgb3B0aW9uYWwgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aGVuIGl0IGJlY29tZXMKLSAqIAkgIG5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBtZXRob2QgdGhhdCBpcyBtdWx0aXBseQotICogCSAgZGVmaW5lZCBhY3Jvc3MgdGhlIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsCi0gKiAgICAgICAgICAgYW5kL29yIHdlYiBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZAotICogCSAgc2lnbmF0dXJlLiBIb3dldmVyLCBpZiB0aGUgc2FtZSBtZXRob2QgaXMgYSBtZXRob2Qgb2YgYm90aCB0aGUKLSAqICAgICAgICAgICBsb2NhbCBidXNpbmVzcyBpbnRlcmZhY2UsIGFuZCB0aGUgbG9jYWwgY29tcG9uZW50IGludGVyZmFjZSwKLSAqICAgICAgICAgICB0aGUgc2FtZSBhdHRyaWJ1dGUgYXBwbGllcyB0byB0aGUgbWV0aG9kIGZvciBib3RoIGludGVyZmFjZXMuCi0gKiAgICAgICAgICAgTGlrZXdpc2UsIGlmIHRoZSBzYW1lIG1ldGhvZCBpcyBhIG1ldGhvZCBvZiBib3RoIHRoZSByZW1vdGUKLSAqICAgICAgICAgICBidXNpbmVzcyBpbnRlcmZhY2UgYW5kIHRoZSByZW1vdGUgY29tcG9uZW50IGludGVyZmFjZSwgdGhlIHNhbWUKLSAqICAgICAgICAgICBhdHRyaWJ1dGUgYXBwbGllcyB0byB0aGUgbWV0aG9kIGZvciBib3RoIGludGVyZmFjZXMuCi0gKiAKLSAqIAkgIEZvciBleGFtcGxlLCB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIAotICogCSAgJmx0O21ldGhvZCZndDsKLSAqIAkgICAgICAmbHQ7ZWpiLW5hbWUmZ3Q7RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLWludGYmZ3Q7UmVtb3RlJmx0Oy9tZXRob2QtaW50ZiZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7Y3JlYXRlJmx0Oy9tZXRob2QtbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLXBhcmFtcyZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O2phdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkJICAmbHQ7bWV0aG9kLXBhcmFtJmd0O2phdmEubGFuZy5TdHJpbmcmbHQ7L21ldGhvZC1wYXJhbSZndDsKLSAqIAkgICAgICAmbHQ7L21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgY3JlYXRlKFN0cmluZywgU3RyaW5nKQotICogCSAgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUKLSAqIAkgIGNyZWF0ZShTdHJpbmcsIFN0cmluZykgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBob21lCi0gKiAJICBpbnRlcmZhY2UsIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKLSAqIAotICogCSAgJmx0O21ldGhvZCZndDsKLSAqIAkgICAgICAmbHQ7ZWpiLW5hbWUmZ3Q7RW1wbG95ZWVTZXJ2aWNlJmx0Oy9lamItbmFtZSZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLWludGYmZ3Q7SG9tZSZsdDsvbWV0aG9kLWludGYmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1uYW1lJmd0O2NyZWF0ZSZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbSZndDtqYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0mZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbSZndDtqYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0mZ3Q7Ci0gKiAJICAgICAgJmx0Oy9tZXRob2QtcGFyYW1zJmd0OwotICogCSAgJmx0Oy9tZXRob2QmZ3Q7Ci0gKiAKLSAqIAkgIGFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUKLSAqIAkgIGludGVyZmFjZSB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCi0gKiAKLSAqIAkgICZsdDttZXRob2QmZ3Q7Ci0gKiAJICAgICAgJmx0O2VqYi1uYW1lJmd0O0VtcGxveWVlU2VydmljZSZsdDsvZWpiLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1pbnRmJmd0O0xvY2FsSG9tZSZsdDsvbWV0aG9kLWludGYmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1uYW1lJmd0O2NyZWF0ZSZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAgICAgJmx0O21ldGhvZC1wYXJhbXMmZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbSZndDtqYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0mZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbSZndDtqYXZhLmxhbmcuU3RyaW5nJmx0Oy9tZXRob2QtcGFyYW0mZ3Q7Ci0gKiAJICAgICAgJmx0Oy9tZXRob2QtcGFyYW1zJmd0OwotICogCSAgJmx0Oy9tZXRob2QmZ3Q7Ci0gKiAKLSAqIAkgIFRoZSBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdpdGggYWxsIHRocmVlIFN0eWxlcwotICogCSAgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHVzYWdlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwotICogCSAgbWV0aG9kIGVsZW1lbnQgZXhhbXBsZSBjb3VsZCBiZSB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUKLSAqIAkgIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgcmVtb3RlIGhvbWUgaW50ZXJmYWNlCi0gKiAgICAgICAgICAgYW5kIHRoZSByZW1vdGUgYnVzaW5lc3MgaW50ZXJmYWNlLgotICogCi0gKiAJICAmbHQ7bWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItbmFtZSZndDtFbXBsb3llZVNlcnZpY2UmbHQ7L2VqYi1uYW1lJmd0OwotICogCSAgICAgICZsdDttZXRob2QtaW50ZiZndDtIb21lJmx0Oy9tZXRob2QtaW50ZiZndDsKLSAqIAkgICAgICAmbHQ7bWV0aG9kLW5hbWUmZ3Q7KiZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJICAmbHQ7L21ldGhvZCZndDsKLSAqIAotICogCSAgCisgKiA8IVtDREFUQVtbCisgKiAgICAgICAgIFRoZSBtZXRob2RUeXBlIGlzIHVzZWQgdG8gZGVub3RlIGEgbWV0aG9kIG9mIGFuIGVudGVycHJpc2UKKyAqICAgICAgICAgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludAorICogICAgICAgICBpbnRlcmZhY2UsIG9yLCBpbiB0aGUgY2FzZSBvZiBhIG1lc3NhZ2UtZHJpdmVuIGJlYW4sIHRoZQorICogICAgICAgICBiZWFuJ3MgbWVzc2FnZSBsaXN0ZW5lciBtZXRob2QsIG9yIGEgc2V0IG9mIHN1Y2gKKyAqICAgICAgICAgbWV0aG9kcy4gVGhlIGVqYi1uYW1lIGVsZW1lbnQgbXVzdCBiZSB0aGUgbmFtZSBvZiBvbmUgb2YgdGhlCisgKiAgICAgICAgIGVudGVycHJpc2UgYmVhbnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcjsgdGhlCisgKiAgICAgICAgIG9wdGlvbmFsIG1ldGhvZC1pbnRmIGVsZW1lbnQgYWxsb3dzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYQorICogICAgICAgICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgdGhhdCBpcyBtdWx0aXBseSBkZWZpbmVkCisgKiAgICAgICAgIGFjcm9zcyB0aGUgYnVzaW5lc3MsIGhvbWUsIGNvbXBvbmVudCwgYW5kL29yIHdlYiBzZXJ2aWNlIAorICogICAgICAgICBlbmRwb2ludCBudGVyZmFjZXM7IHRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgCisgKiAgICAgICAgIG1ldGhvZCBuYW1lOyBhbmQgdGhlIG9wdGlvbmFsIG1ldGhvZC1wYXJhbXMgZWxlbWVudHMgaWRlbnRpZnkgCisgKiAgICAgICAgIGEgc2luZ2xlIG1ldGhvZCBhbW9uZyBtdWx0aXBsZSBtZXRob2RzIHdpdGggYW4gb3ZlcmxvYWRlZAorICogICAgICAgICBtZXRob2QgbmFtZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSBzdHlsZXMgb2YgdXNpbmcgbWV0aG9kVHlwZSBlbGVtZW50CisgKiAgICAgICAgIHdpdGhpbiBhIG1ldGhvZCBlbGVtZW50OgorICogICAgICAgICAKKyAqICAgICAgICAgMS4KKyAqICAgICAgICAgPG1ldGhvZD4KKyAqICAgICAgICAgPGVqYi1uYW1lPkVKQk5BTUU8L2VqYi1uYW1lPgorICogICAgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+CisgKiAgICAgICAgIDwvbWV0aG9kPgorICogICAgICAgICAKKyAqICAgICAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUKKyAqICAgICAgICAgc3BlY2lmaWVkIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsIAorICogICAgICAgICBhbmQvb3Igd2ViIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlcy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIDIuCisgKiAgICAgICAgIDxtZXRob2Q+CisgKiAgICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KKyAqICAgICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+CisgKiAgICAgICAgIDwvbWV0aG9kPgorICogICAgICAgICAKKyAqICAgICAgICAgVGhpcyBzdHlsZSBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBzcGVjaWZpZWQgbWV0aG9kIG9mCisgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgZW50ZXJwcmlzZSBiZWFuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAqICAgICAgICAgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhlIGVsZW1lbnQgb2YKKyAqICAgICAgICAgdGhpcyBzdHlsZSByZWZlcnMgdG8gYWxsIHRoZSBtZXRob2RzIHdpdGggdGhlIG92ZXJsb2FkZWQKKyAqICAgICAgICAgbmFtZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIDMuCisgKiAgICAgICAgIDxtZXRob2Q+CisgKiAgICAgICAgIDxlamItbmFtZT5FSkJOQU1FPC9lamItbmFtZT4KKyAqICAgICAgICAgPG1ldGhvZC1uYW1lPk1FVEhPRDwvbWV0aG9kLW5hbWU+CisgKiAgICAgICAgIDxtZXRob2QtcGFyYW1zPgorICogICAgICAgICAJICA8bWV0aG9kLXBhcmFtPlBBUkFNLTE8L21ldGhvZC1wYXJhbT4KKyAqICAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5QQVJBTS0yPC9tZXRob2QtcGFyYW0+CisgKiAgICAgICAgIAkgIC4uLgorICogICAgICAgICAJICA8bWV0aG9kLXBhcmFtPlBBUkFNLW48L21ldGhvZC1wYXJhbT4KKyAqICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgorICogICAgICAgICA8L21ldGhvZD4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoaXMgc3R5bGUgaXMgdXNlZCB0byByZWZlciB0byBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEKKyAqICAgICAgICAgc2V0IG9mIG1ldGhvZHMgd2l0aCBhbiBvdmVybG9hZGVkIG5hbWUuIFBBUkFNLTEgdGhyb3VnaAorICogICAgICAgICBQQVJBTS1uIGFyZSB0aGUgZnVsbHktcXVhbGlmaWVkIEphdmEgdHlwZXMgb2YgdGhlCisgKiAgICAgICAgIG1ldGhvZCdzIGlucHV0IHBhcmFtZXRlcnMgKGlmIHRoZSBtZXRob2QgaGFzIG5vIGlucHV0CisgKiAgICAgICAgIGFyZ3VtZW50cywgdGhlIG1ldGhvZC1wYXJhbXMgZWxlbWVudCBjb250YWlucyBubworICogICAgICAgICBtZXRob2QtcGFyYW0gZWxlbWVudHMpLiBBcnJheXMgYXJlIHNwZWNpZmllZCBieSB0aGUKKyAqICAgICAgICAgYXJyYXkgZWxlbWVudCdzIHR5cGUsIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIHBhaXIgb2YKKyAqICAgICAgICAgc3F1YXJlIGJyYWNrZXRzIChlLmcuIGludFtdW10pLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAqICAgICAgICAgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIG92ZXJsb2FkZWQgbmFtZSwgdGhpcyBzdHlsZSByZWZlcnMKKyAqICAgICAgICAgdG8gYWxsIG9mIHRoZSBvdmVybG9hZGVkIG1ldGhvZHMuIAorICogICAgICAgICAKKyAqICAgICAgICAgRXhhbXBsZXM6CisgKiAgICAgICAgIAorICogICAgICAgICBTdHlsZSAxOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCisgKiAgICAgICAgIG1ldGhvZHMgb2YgdGhlIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgYnVzaW5lc3MsIGhvbWUsIAorICogICAgICAgICBjb21wb25lbnQsIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzOgorICogICAgICAgICAKKyAqICAgICAgICAgPG1ldGhvZD4KKyAqICAgICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+CisgKiAgICAgICAgIDxtZXRob2QtbmFtZT4qPC9tZXRob2QtbmFtZT4KKyAqICAgICAgICAgPC9tZXRob2Q+CisgKiAgICAgICAgIAorICogICAgICAgICBTdHlsZSAyOiBUaGUgZm9sbG93aW5nIG1ldGhvZCBlbGVtZW50IHJlZmVycyB0byBhbGwgdGhlCisgKiAgICAgICAgIGNyZWF0ZSBtZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIGhvbWUKKyAqICAgICAgICAgaW50ZXJmYWNlKHMpLgorICogICAgICAgICAKKyAqICAgICAgICAgPG1ldGhvZD4KKyAqICAgICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+CisgKiAgICAgICAgIDxtZXRob2QtbmFtZT5jcmVhdGU8L21ldGhvZC1uYW1lPgorICogICAgICAgICA8L21ldGhvZD4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFN0eWxlIDM6IFRoZSBmb2xsb3dpbmcgbWV0aG9kIGVsZW1lbnQgcmVmZXJzIHRvIHRoZQorICogICAgICAgICBjcmVhdGUoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIExhc3ROYW1lKSBtZXRob2Qgb2YgdGhlCisgKiAgICAgICAgIEVtcGxveWVlU2VydmljZSBiZWFuJ3MgaG9tZSBpbnRlcmZhY2UocykuCisgKiAgICAgICAgIAorICogICAgICAgICA8bWV0aG9kPgorICogICAgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KKyAqICAgICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+CisgKiAgICAgICAgIDxtZXRob2QtcGFyYW1zPgorICogICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KKyAqICAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+CisgKiAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KKyAqICAgICAgICAgPC9tZXRob2Q+CisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgYSBTdHlsZSAzIGVsZW1lbnQgd2l0aAorICogICAgICAgICBtb3JlIGNvbXBsZXggcGFyYW1ldGVyIHR5cGVzLiBUaGUgbWV0aG9kIAorICogICAgICAgICBmb29iYXIoY2hhciBzLCBpbnQgaSwgaW50W10gaWFyLCBteXBhY2thZ2UuTXlDbGFzcyBteWNsLCAKKyAqICAgICAgICAgbXlwYWNrYWdlLk15Q2xhc3NbXVtdIG15Y2xhYXIpIHdvdWxkIGJlIHNwZWNpZmllZCBhczoKKyAqICAgICAgICAgCisgKiAgICAgICAgIDxtZXRob2Q+CisgKiAgICAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgorICogICAgICAgICA8bWV0aG9kLW5hbWU+Zm9vYmFyPC9tZXRob2QtbmFtZT4KKyAqICAgICAgICAgPG1ldGhvZC1wYXJhbXM+CisgKiAgICAgICAgIAkgIDxtZXRob2QtcGFyYW0+Y2hhcjwvbWV0aG9kLXBhcmFtPgorICogICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmludDwvbWV0aG9kLXBhcmFtPgorICogICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmludFtdPC9tZXRob2QtcGFyYW0+CisgKiAgICAgICAgIAkgIDxtZXRob2QtcGFyYW0+bXlwYWNrYWdlLk15Q2xhc3M8L21ldGhvZC1wYXJhbT4KKyAqICAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5teXBhY2thZ2UuTXlDbGFzc1tdW108L21ldGhvZC1wYXJhbT4KKyAqICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgorICogICAgICAgICA8L21ldGhvZD4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBvcHRpb25hbCBtZXRob2QtaW50ZiBlbGVtZW50IGNhbiBiZSB1c2VkIHdoZW4gaXQgYmVjb21lcworICogICAgICAgICBuZWNlc3NhcnkgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEgbWV0aG9kIHRoYXQgaXMgbXVsdGlwbHkKKyAqICAgICAgICAgZGVmaW5lZCBhY3Jvc3MgdGhlIGVudGVycHJpc2UgYmVhbidzIGJ1c2luZXNzLCBob21lLCBjb21wb25lbnQsCisgKiAgICAgICAgIGFuZC9vciB3ZWIgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2VzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQKKyAqICAgICAgICAgc2lnbmF0dXJlLiBIb3dldmVyLCBpZiB0aGUgc2FtZSBtZXRob2QgaXMgYSBtZXRob2Qgb2YgYm90aCB0aGUKKyAqICAgICAgICAgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlLCBhbmQgdGhlIGxvY2FsIGNvbXBvbmVudCBpbnRlcmZhY2UsIAorICogICAgICAgICB0aGUgc2FtZSBhdHRyaWJ1dGUgYXBwbGllcyB0byB0aGUgbWV0aG9kIGZvciBib3RoIGludGVyZmFjZXMuCisgKiAgICAgICAgIExpa2V3aXNlLCBpZiB0aGUgc2FtZSBtZXRob2QgaXMgYSBtZXRob2Qgb2YgYm90aCB0aGUgcmVtb3RlIAorICogICAgICAgICBidXNpbmVzcyBpbnRlcmZhY2UgYW5kIHRoZSByZW1vdGUgY29tcG9uZW50IGludGVyZmFjZSwgdGhlIHNhbWUKKyAqICAgICAgICAgYXR0cmlidXRlIGFwcGxpZXMgdG8gdGhlIG1ldGhvZCBmb3IgYm90aCBpbnRlcmZhY2VzLgorICogICAgICAgICAKKyAqICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBtZXRob2QgZWxlbWVudAorICogICAgICAgICAKKyAqICAgICAgICAgPG1ldGhvZD4KKyAqICAgICAgICAgPGVqYi1uYW1lPkVtcGxveWVlU2VydmljZTwvZWpiLW5hbWU+CisgKiAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgorICogICAgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KKyAqICAgICAgICAgPG1ldGhvZC1wYXJhbXM+CisgKiAgICAgICAgIAkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgorICogICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KKyAqICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgorICogICAgICAgICA8L21ldGhvZD4KKyAqICAgICAgICAgCisgKiAgICAgICAgIGNhbiBiZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgdGhlIGNyZWF0ZShTdHJpbmcsIFN0cmluZykKKyAqICAgICAgICAgbWV0aG9kIGRlZmluZWQgaW4gdGhlIHJlbW90ZSBpbnRlcmZhY2UgZnJvbSB0aGUKKyAqICAgICAgICAgY3JlYXRlKFN0cmluZywgU3RyaW5nKSBtZXRob2QgZGVmaW5lZCBpbiB0aGUgcmVtb3RlIGhvbWUKKyAqICAgICAgICAgaW50ZXJmYWNlLCB3aGljaCB3b3VsZCBiZSBkZWZpbmVkIGFzCisgKiAgICAgICAgIAorICogICAgICAgICA8bWV0aG9kPgorICogICAgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KKyAqICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgorICogICAgICAgICA8bWV0aG9kLW5hbWU+Y3JlYXRlPC9tZXRob2QtbmFtZT4KKyAqICAgICAgICAgPG1ldGhvZC1wYXJhbXM+CisgKiAgICAgICAgIAkgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgorICogICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KKyAqICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgorICogICAgICAgICA8L21ldGhvZD4KKyAqICAgICAgICAgCisgKiAgICAgICAgIGFuZCB0aGUgY3JlYXRlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGxvY2FsIGhvbWUKKyAqICAgICAgICAgaW50ZXJmYWNlIHdoaWNoIHdvdWxkIGJlIGRlZmluZWQgYXMKKyAqICAgICAgICAgCisgKiAgICAgICAgIDxtZXRob2Q+CisgKiAgICAgICAgIDxlamItbmFtZT5FbXBsb3llZVNlcnZpY2U8L2VqYi1uYW1lPgorICogICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KKyAqICAgICAgICAgPG1ldGhvZC1uYW1lPmNyZWF0ZTwvbWV0aG9kLW5hbWU+CisgKiAgICAgICAgIDxtZXRob2QtcGFyYW1zPgorICogICAgICAgICAJICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KKyAqICAgICAgICAgCSAgPG1ldGhvZC1wYXJhbT5qYXZhLmxhbmcuU3RyaW5nPC9tZXRob2QtcGFyYW0+CisgKiAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KKyAqICAgICAgICAgPC9tZXRob2Q+CisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgbWV0aG9kLWludGYgZWxlbWVudCBjYW4gYmUgdXNlZCB3aXRoIGFsbCB0aHJlZSBTdHlsZXMKKyAqICAgICAgICAgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHVzYWdlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZworICogICAgICAgICBtZXRob2QgZWxlbWVudCBleGFtcGxlIGNvdWxkIGJlIHVzZWQgdG8gcmVmZXIgdG8gYWxsIHRoZQorICogICAgICAgICBtZXRob2RzIG9mIHRoZSBFbXBsb3llZVNlcnZpY2UgYmVhbidzIHJlbW90ZSBob21lIGludGVyZmFjZQorICogICAgICAgICBhbmQgdGhlIHJlbW90ZSBidXNpbmVzcyBpbnRlcmZhY2UuCisgKiAgICAgICAgIAorICogICAgICAgICA8bWV0aG9kPgorICogICAgICAgICA8ZWpiLW5hbWU+RW1wbG95ZWVTZXJ2aWNlPC9lamItbmFtZT4KKyAqICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgorICogICAgICAgICA8bWV0aG9kLW5hbWU+KjwvbWV0aG9kLW5hbWU+CisgKiAgICAgICAgIDwvbWV0aG9kPgorICogICAgICAgICAKKyAqIF1dPgorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBFSkIgMy4wCiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC0yMzIsNyArMjMzLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TWV0aG9kVHlwZV9EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTI2MSw3ICsyNjIsNiBAQAogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIEludGY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iSG9tZSI8L2NvZGU+LgogCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1ldGhvZEludGVyZmFjZVR5cGV9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NdWx0aXBsaWNpdHlUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9NdWx0aXBsaWNpdHlUeXBlLmphdmEKaW5kZXggMTk4MGMyMC4uOGNkN2Y5MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvTXVsdGlwbGljaXR5VHlwZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL011bHRpcGxpY2l0eVR5cGUuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTI0LDIwICsyNCw0MCBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSBtdWx0aXBsaWNpdHlUeXBlIGRlc2NyaWJlcyB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZQotICogCXJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbi4KLSAqIAotICogCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLSAqIAotICogCSAgICBPbmUKLSAqIAkgICAgTWFueQotICogCisgKiAgICAgICAgIFRoZSBtdWx0aXBsaWNpdHlUeXBlIGRlc2NyaWJlcyB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZQorICogICAgICAgICByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb24uCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6CisgKiAgICAgICAgIAorICogICAgICAgICBPbmUKKyAqICAgICAgICAgTWFueQorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0TXVsdGlwbGljaXR5VHlwZSgpCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNdWx0aXBsaWNpdHlUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKK3B1YmxpYyBlbnVtIE11bHRpcGxpY2l0eVR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCit7CisJLyoqCisJICogVGhlICc8ZW0+PGI+T25lPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09ORQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU9ORV9MSVRFUkFMKDAsICJPbmUiLCAiT25lIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTUFOWQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU1BTllfTElURVJBTCgxLCAiTWFueSIsICJNYW55Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPk9uZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjcsMjYgKzg3LDYgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQU5ZID0gMTsKIAogCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9uZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPTkUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE11bHRpcGxpY2l0eVR5cGUgT05FX0xJVEVSQUwgPSBuZXcgTXVsdGlwbGljaXR5VHlwZShPTkUsICJPbmUiLCAiT25lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TWFueTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNNQU5ZCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNdWx0aXBsaWNpdHlUeXBlIE1BTllfTElURVJBTCA9IG5ldyBNdWx0aXBsaWNpdHlUeXBlKE1BTlksICJNYW55IiwgIk1hbnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+TXVsdGlwbGljaXR5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMDQsNyArMTA0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8TXVsdGlwbGljaXR5VHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgJzxlbT48Yj5NdWx0aXBsaWNpdHkgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KQEAgLTE0OSwxNyArMTQ5LDc3IEBACiAJCQljYXNlIE9ORTogcmV0dXJuIE9ORV9MSVRFUkFMOwogCQkJY2FzZSBNQU5ZOiByZXR1cm4gTUFOWV9MSVRFUkFMOwogCQl9Ci0JCXJldHVybiBudWxsOwkKKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgogCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwcml2YXRlIE11bHRpcGxpY2l0eVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CiAJfQogCi19IC8vTXVsdGlwbGljaXR5VHlwZQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9QZXJzaXN0ZW5jZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1BlcnNpc3RlbmNlVHlwZS5qYXZhCmluZGV4IDA1ZWU2YTkuLjY1OGUyNDUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1BlcnNpc3RlbmNlVHlwZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1BlcnNpc3RlbmNlVHlwZS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjQsMjAgKzI0LDQwIEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIHBlcnNpc3RlbmNlLXR5cGVUeXBlIHNwZWNpZmllcyBhbiBlbnRpdHkgYmVhbidzIHBlcnNpc3RlbmNlCi0gKiAJbWFuYWdlbWVudCB0eXBlLgotICogCi0gKiAJVGhlIHBlcnNpc3RlbmNlLXR5cGUgZWxlbWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLSAqIAotICogCSAgICBCZWFuCi0gKiAJICAgIENvbnRhaW5lcgotICogCisgKiAgICAgICAgIFRoZSBwZXJzaXN0ZW5jZS10eXBlVHlwZSBzcGVjaWZpZXMgYW4gZW50aXR5IGJlYW4ncyBwZXJzaXN0ZW5jZQorICogICAgICAgICBtYW5hZ2VtZW50IHR5cGUuCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgcGVyc2lzdGVuY2UtdHlwZSBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgorICogICAgICAgICAKKyAqICAgICAgICAgQmVhbgorICogICAgICAgICBDb250YWluZXIKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFBlcnNpc3RlbmNlVHlwZSgpCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQZXJzaXN0ZW5jZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgeworcHVibGljIGVudW0gUGVyc2lzdGVuY2VUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkJlYW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQkVBTgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUJFQU5fTElURVJBTCgwLCAiQmVhbiIsICJCZWFuIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDT05UQUlORVIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDT05UQUlORVJfTElURVJBTCgxLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5CZWFuPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC02NywyNiArODcsNiBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRBSU5FUiA9IDE7CiAKIAkvKioKLQkgKiBUaGUgJzxlbT48Yj5CZWFuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0JFQU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlVHlwZSBCRUFOX0xJVEVSQUwgPSBuZXcgUGVyc2lzdGVuY2VUeXBlKEJFQU4sICJCZWFuIiwgIkJlYW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVEFJTkVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVR5cGUgQ09OVEFJTkVSX0xJVEVSQUwgPSBuZXcgUGVyc2lzdGVuY2VUeXBlKENPTlRBSU5FUiwgIkNvbnRhaW5lciIsICJDb250YWluZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTEwNCw3ICsxMDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxQZXJzaXN0ZW5jZVR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KQEAgLTE0OSwxNyArMTQ5LDc3IEBACiAJCQljYXNlIEJFQU46IHJldHVybiBCRUFOX0xJVEVSQUw7CiAJCQljYXNlIENPTlRBSU5FUjogcmV0dXJuIENPTlRBSU5FUl9MSVRFUkFMOwogCQl9Ci0JCXJldHVybiBudWxsOwkKKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgogCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwcml2YXRlIFBlcnNpc3RlbmNlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKIAl9CiAKLX0gLy9QZXJzaXN0ZW5jZVR5cGUKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUXVlcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1F1ZXJ5LmphdmEKaW5kZXggOWFhMGI0My4uZjUyZjY4MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUXVlcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9RdWVyeS5qYXZhCkBAIC0yMSwyNyArMjEsMjggQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgcXVlcnlUeXBlIGRlZmluZXMgYSBmaW5kZXIgb3Igc2VsZWN0Ci0gKiAJcXVlcnkuIEl0IGNvbnRhaW5zCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHF1ZXJ5Ci0gKiAJICAgIC0gdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbmRlciBvciBzZWxlY3QKLSAqIAkgICAgICBtZXRob2QgaXQgaXMgdXNlZCBieQotICogCQktIGFuIG9wdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIHJlc3VsdCB0eXBlCi0gKiAJCSAgbWFwcGluZywgaWYgdGhlIHF1ZXJ5IGlzIGZvciBhIHNlbGVjdCBtZXRob2QKLSAqIAkJICBhbmQgZW50aXR5IG9iamVjdHMgYXJlIHJldHVybmVkLgotICogCQktIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuCi0gKiAKLSAqIAlRdWVyaWVzIHRoYXQgYXJlIGV4cHJlc3NpYmxlIGluIEVKQiBRTCBtdXN0IHVzZSB0aGUgZWpiLXFsCi0gKiAJZWxlbWVudCB0byBzcGVjaWZ5IHRoZSBxdWVyeS4gSWYgYSBxdWVyeSBpcyBub3QgZXhwcmVzc2libGUKLSAqIAlpbiBFSkIgUUwsIHRoZSBkZXNjcmlwdGlvbiBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvCi0gKiAJZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUgcXVlcnkgYW5kIHRoZSBlamItcWwgZWxlbWVudAotICogCXNob3VsZCBiZSBlbXB0eS4KLSAqIAotICogCVRoZSByZXN1bHQtdHlwZS1tYXBwaW5nIGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIEl0IGNhbiBvbmx5Ci0gKiAJYmUgcHJlc2VudCBpZiB0aGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyBhIHNlbGVjdCBtZXRob2QKLSAqIAl0aGF0IHJldHVybnMgZW50aXR5IG9iamVjdHMuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCi0gKiAJcmVzdWx0LXR5cGUtbWFwcGluZyBlbGVtZW50IGlzICJMb2NhbCIuCi0gKiAKKyAqICAgICAgICAgVGhlIHF1ZXJ5VHlwZSBkZWZpbmVzIGEgZmluZGVyIG9yIHNlbGVjdAorICogICAgICAgICBxdWVyeS4gSXQgY29udGFpbnMKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcXVlcnkKKyAqICAgICAgICAgLSB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmluZGVyIG9yIHNlbGVjdAorICogICAgICAgICBtZXRob2QgaXQgaXMgdXNlZCBieQorICogICAgICAgICAJLSBhbiBvcHRpb25hbCBzcGVjaWZpY2F0aW9uIG9mIHRoZSByZXN1bHQgdHlwZSAKKyAqICAgICAgICAgCSAgbWFwcGluZywgaWYgdGhlIHF1ZXJ5IGlzIGZvciBhIHNlbGVjdCBtZXRob2QgCisgKiAgICAgICAgIAkgIGFuZCBlbnRpdHkgb2JqZWN0cyBhcmUgcmV0dXJuZWQuCisgKiAgICAgICAgIAktIHRoZSBFSkIgUUwgcXVlcnkgc3RyaW5nIHRoYXQgZGVmaW5lcyB0aGUgcXVlcnkuCisgKiAgICAgICAgIAorICogICAgICAgICBRdWVyaWVzIHRoYXQgYXJlIGV4cHJlc3NpYmxlIGluIEVKQiBRTCBtdXN0IHVzZSB0aGUgZWpiLXFsCisgKiAgICAgICAgIGVsZW1lbnQgdG8gc3BlY2lmeSB0aGUgcXVlcnkuIElmIGEgcXVlcnkgaXMgbm90IGV4cHJlc3NpYmxlCisgKiAgICAgICAgIGluIEVKQiBRTCwgdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQgc2hvdWxkIGJlIHVzZWQgdG8KKyAqICAgICAgICAgZGVzY3JpYmUgdGhlIHNlbWFudGljcyBvZiB0aGUgcXVlcnkgYW5kIHRoZSBlamItcWwgZWxlbWVudAorICogICAgICAgICBzaG91bGQgYmUgZW1wdHkuCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgcmVzdWx0LXR5cGUtbWFwcGluZyBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBJdCBjYW4gb25seQorICogICAgICAgICBiZSBwcmVzZW50IGlmIHRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIGEgc2VsZWN0IG1ldGhvZAorICogICAgICAgICB0aGF0IHJldHVybnMgZW50aXR5IG9iamVjdHMuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCisgKiAgICAgICAgIHJlc3VsdC10eXBlLW1hcHBpbmcgZWxlbWVudCBpcyAiTG9jYWwiLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtMTEzLDcgKzExNCw2IEBACiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bHQgVHlwZSBNYXBwaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkxvY2FsIjwvY29kZT4uCiAJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlfS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUXVlcnlNZXRob2QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1F1ZXJ5TWV0aG9kLmphdmEKaW5kZXggZmU1Y2IxMy4uMzI2ZDhjZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUXVlcnlNZXRob2QuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9RdWVyeU1ldGhvZC5qYXZhCkBAIC0xOSwzNCArMTksMzQgQEAKICAqCiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAotICogCQotICogCi0gKiAJICBUaGUgcXVlcnktbWV0aG9kIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciBhIGZpbmRlciBvciBzZWxlY3QKLSAqIAkgIHF1ZXJ5LgotICogCi0gKiAJICBUaGUgbWV0aG9kLW5hbWUgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBmaW5kZXIgb3Igc2VsZWN0Ci0gKiAJICBtZXRob2QgaW4gdGhlIGVudGl0eSBiZWFuJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gKiAKLSAqIAkgIEVhY2ggbWV0aG9kLXBhcmFtIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBxdWVyeS1tZXRob2QgdXNpbmcgdGhlCi0gKiAJICBtZXRob2QtcGFyYW1zIGVsZW1lbnQuCi0gKiAKLSAqIAkgIEl0IGlzIHVzZWQgYnkgdGhlIHF1ZXJ5LW1ldGhvZCBlbGVtZW50LgotICogCi0gKiAJICBFeGFtcGxlOgotICogCi0gKiAJICAmbHQ7cXVlcnkmZ3Q7Ci0gKiAJICAgICAgJmx0O2Rlc2NyaXB0aW9uJmd0O01ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnMmbHQ7L2Rlc2NyaXB0aW9uJmd0OwotICogCSAgICAgICZsdDtxdWVyeS1tZXRob2QmZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1uYW1lJmd0O2ZpbmRMYXJnZU9yZGVycyZsdDsvbWV0aG9kLW5hbWUmZ3Q7Ci0gKiAJCSAgJmx0O21ldGhvZC1wYXJhbXMmZ3Q7Jmx0Oy9tZXRob2QtcGFyYW1zJmd0OwotICogCSAgICAgICZsdDsvcXVlcnktbWV0aG9kJmd0OwotICogCSAgICAgICZsdDtlamItcWwmZ3Q7Ci0gKiAJCVNFTEVDVCBPQkpFQ1QobykgRlJPTSBPcmRlciBvCi0gKiAJCSAgV0hFUkUgby5hbW91bnQgJmFtcDtndDsgMTAwMAotICogCSAgICAgICZsdDsvZWpiLXFsJmd0OwotICogCSAgJmx0Oy9xdWVyeSZndDsKLSAqIAotICogCSAgCisgKiA8IVtDREFUQVtbCisgKiAgICAgICAgIFRoZSBxdWVyeS1tZXRob2Qgc3BlY2lmaWVzIHRoZSBtZXRob2QgZm9yIGEgZmluZGVyIG9yIHNlbGVjdAorICogICAgICAgICBxdWVyeS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSBtZXRob2QtbmFtZSBlbGVtZW50IHNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGZpbmRlciBvciBzZWxlY3QKKyAqICAgICAgICAgbWV0aG9kIGluIHRoZSBlbnRpdHkgYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzLgorICogICAgICAgICAKKyAqICAgICAgICAgRWFjaCBtZXRob2QtcGFyYW0gbXVzdCBiZSBkZWZpbmVkIGZvciBhIHF1ZXJ5LW1ldGhvZCB1c2luZyB0aGUKKyAqICAgICAgICAgbWV0aG9kLXBhcmFtcyBlbGVtZW50LgorICogICAgICAgICAKKyAqICAgICAgICAgSXQgaXMgdXNlZCBieSB0aGUgcXVlcnktbWV0aG9kIGVsZW1lbnQuIAorICogICAgICAgICAKKyAqICAgICAgICAgRXhhbXBsZToKKyAqICAgICAgICAgCisgKiAgICAgICAgIDxxdWVyeT4KKyAqICAgICAgICAgPGRlc2NyaXB0aW9uPk1ldGhvZCBmaW5kcyBsYXJnZSBvcmRlcnM8L2Rlc2NyaXB0aW9uPgorICogICAgICAgICA8cXVlcnktbWV0aG9kPgorICogICAgICAgICAJICA8bWV0aG9kLW5hbWU+ZmluZExhcmdlT3JkZXJzPC9tZXRob2QtbmFtZT4KKyAqICAgICAgICAgCSAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgorICogICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KKyAqICAgICAgICAgPGVqYi1xbD4KKyAqICAgICAgICAgCVNFTEVDVCBPQkpFQ1QobykgRlJPTSBPcmRlciBvCisgKiAgICAgICAgIAkgIFdIRVJFIG8uYW1vdW50ICZndDsgMTAwMAorICogICAgICAgICA8L2VqYi1xbD4KKyAqICAgICAgICAgPC9xdWVyeT4KKyAqICAgICAgICAgCisgKiBdXT4KKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1JlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlLmphdmEKaW5kZXggNGY3ZDY3My4uNmZjNDJlYSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZS5qYXZhCkBAIC0xMiw2ICsxMiw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwogCiAvKioKQEAgLTIyLDEyICsyMywxMyBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIGRlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhCi0gKiAJcm9sZSB0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIHJlbGF0aW9uc2hpcC4gQQotICogCXJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZVR5cGUgaXMgdXNlZCBieQotICogCXJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50cyB0byB1bmlxdWVseSBpZGVudGlmeSBhbgotICogCWVudGl0eSBiZWFuLgotICogCisgKiAgICAgICAgIFRoZSByZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2VUeXBlIGRlc2lnbmF0ZXMgdGhlIHNvdXJjZSBvZiBhCisgKiAgICAgICAgIHJvbGUgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gYSByZWxhdGlvbnNoaXAuIEEKKyAqICAgICAgICAgcmVsYXRpb25zaGlwLXJvbGUtc291cmNlVHlwZSBpcyB1c2VkIGJ5CisgKiAgICAgICAgIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50cyB0byB1bmlxdWVseSBpZGVudGlmeSBhbgorICogICAgICAgICBlbnRpdHkgYmVhbi4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTU4LDcgKzYwLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9SZWxhdGlvbnNoaXBzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9SZWxhdGlvbnNoaXBzLmphdmEKaW5kZXggYWY2YmU0My4uNDc5ZDViNCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvUmVsYXRpb25zaGlwcy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1JlbGF0aW9uc2hpcHMuamF2YQpAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKIAogLyoqCkBAIC0yMiwxMiArMjMsMTMgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgcmVsYXRpb25zaGlwc1R5cGUgZGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXBzIGluCi0gKiAJd2hpY2ggZW50aXR5IGJlYW5zIHdpdGggY29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2UKLSAqIAlwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHNUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCi0gKiAJZGVzY3JpcHRpb247IGFuZCBhIGxpc3Qgb2YgZWpiLXJlbGF0aW9uIGVsZW1lbnRzLCB3aGljaAotICogCXNwZWNpZnkgdGhlIGNvbnRhaW5lciBtYW5hZ2VkIHJlbGF0aW9uc2hpcHMuCi0gKiAKKyAqICAgICAgICAgVGhlIHJlbGF0aW9uc2hpcHNUeXBlIGRlc2NyaWJlcyB0aGUgcmVsYXRpb25zaGlwcyBpbgorICogICAgICAgICB3aGljaCBlbnRpdHkgYmVhbnMgd2l0aCBjb250YWluZXItbWFuYWdlZCBwZXJzaXN0ZW5jZQorICogICAgICAgICBwYXJ0aWNpcGF0ZS4gVGhlIHJlbGF0aW9uc2hpcHNUeXBlIGNvbnRhaW5zIGFuIG9wdGlvbmFsCisgKiAgICAgICAgIGRlc2NyaXB0aW9uOyBhbmQgYSBsaXN0IG9mIGVqYi1yZWxhdGlvbiBlbGVtZW50cywgd2hpY2gKKyAqICAgICAgICAgc3BlY2lmeSB0aGUgY29udGFpbmVyIG1hbmFnZWQgcmVsYXRpb25zaGlwcy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTU4LDcgKzYwLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlbGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03Myw3ICs3NSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRFamJSZWxhdGlvbnMoKTsKKwlMaXN0PEVKQlJlbGF0aW9uPiBnZXRFamJSZWxhdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9SZXN1bHRUeXBlTWFwcGluZ1R5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1Jlc3VsdFR5cGVNYXBwaW5nVHlwZS5qYXZhCmluZGV4IDBmODU3ODYuLjVhMWQzNGUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1Jlc3VsdFR5cGVNYXBwaW5nVHlwZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1Jlc3VsdFR5cGVNYXBwaW5nVHlwZS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjQsMjIgKzI0LDQyIEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIHJlc3VsdC10eXBlLW1hcHBpbmdUeXBlIGlzIHVzZWQgaW4gdGhlIHF1ZXJ5IGVsZW1lbnQgdG8KLSAqIAlzcGVjaWZ5IHdoZXRoZXIgYW4gYWJzdHJhY3Qgc2NoZW1hIHR5cGUgcmV0dXJuZWQgYnkgYSBxdWVyeQotICogCWZvciBhIHNlbGVjdCBtZXRob2QgaXMgdG8gYmUgbWFwcGVkIHRvIGFuIEVKQkxvY2FsT2JqZWN0IG9yCi0gKiAJRUpCT2JqZWN0IHR5cGUuCi0gKiAKLSAqIAlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqIAotICogCSAgICBMb2NhbAotICogCSAgICBSZW1vdGUKLSAqIAorICogICAgICAgICBUaGUgcmVzdWx0LXR5cGUtbWFwcGluZ1R5cGUgaXMgdXNlZCBpbiB0aGUgcXVlcnkgZWxlbWVudCB0bworICogICAgICAgICBzcGVjaWZ5IHdoZXRoZXIgYW4gYWJzdHJhY3Qgc2NoZW1hIHR5cGUgcmV0dXJuZWQgYnkgYSBxdWVyeQorICogICAgICAgICBmb3IgYSBzZWxlY3QgbWV0aG9kIGlzIHRvIGJlIG1hcHBlZCB0byBhbiBFSkJMb2NhbE9iamVjdCBvcgorICogICAgICAgICBFSkJPYmplY3QgdHlwZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogICAgICAgICAKKyAqICAgICAgICAgTG9jYWwKKyAqICAgICAgICAgUmVtb3RlCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBFSkIgMy4wCiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRSZXN1bHRUeXBlTWFwcGluZ1R5cGUoKQogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzdWx0VHlwZU1hcHBpbmdUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKK3B1YmxpYyBlbnVtIFJlc3VsdFR5cGVNYXBwaW5nVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKK3sKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNMT0NBTAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUxPQ0FMX0xJVEVSQUwoMCwgIkxvY2FsIiwgIkxvY2FsIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPlJlbW90ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNSRU1PVEUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlSRU1PVEVfTElURVJBTCgxLCAiUmVtb3RlIiwgIlJlbW90ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjksMjYgKzg5LDYgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVEUgPSAxOwogCiAJLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc3VsdFR5cGVNYXBwaW5nVHlwZSBMT0NBTF9MSVRFUkFMID0gbmV3IFJlc3VsdFR5cGVNYXBwaW5nVHlwZShMT0NBTCwgIkxvY2FsIiwgIkxvY2FsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFTU9URQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzdWx0VHlwZU1hcHBpbmdUeXBlIFJFTU9URV9MSVRFUkFMID0gbmV3IFJlc3VsdFR5cGVNYXBwaW5nVHlwZShSRU1PVEUsICJSZW1vdGUiLCAiUmVtb3RlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCiAJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlJlc3VsdCBUeXBlIE1hcHBpbmcgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTEwNiw3ICsxMDYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxSZXN1bHRUeXBlTWFwcGluZ1R5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVzdWx0IFR5cGUgTWFwcGluZyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgpAQCAtMTUxLDE3ICsxNTEsNzcgQEAKIAkJCWNhc2UgTE9DQUw6IHJldHVybiBMT0NBTF9MSVRFUkFMOwogCQkJY2FzZSBSRU1PVEU6IHJldHVybiBSRU1PVEVfTElURVJBTDsKIAkJfQotCQlyZXR1cm4gbnVsbDsJCisJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKIAkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHJpdmF0ZSBSZXN1bHRUeXBlTWFwcGluZ1R5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CiAJfQogCi19IC8vUmVzdWx0VHlwZU1hcHBpbmdUeXBlCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1NlY3VyaXR5SWRlbnRpdHlUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9TZWN1cml0eUlkZW50aXR5VHlwZS5qYXZhCmluZGV4IGY3ZjU4NGUuLmM2YTYxYjMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1NlY3VyaXR5SWRlbnRpdHlUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvU2VjdXJpdHlJZGVudGl0eVR5cGUuamF2YQpAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BczsKQEAgLTI0LDEyICsyNSwxMyBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSBzZWN1cml0eS1pZGVudGl0eVR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGNhbGxlcidzCi0gKiAJc2VjdXJpdHkgaWRlbnRpdHkgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLSAqIAltZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcwotICogCWlkZW50aXR5IGlzIHRvIGJlIHVzZWQuIEl0IGNvbnRhaW5zIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAJYW5kIGEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgdG8gYmUgdXNlZC4KLSAqIAorICogICAgICAgICBUaGUgc2VjdXJpdHktaWRlbnRpdHlUeXBlIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjYWxsZXIncworICogICAgICAgICBzZWN1cml0eSBpZGVudGl0eSBpcyB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQorICogICAgICAgICBtZXRob2RzIG9mIHRoZSBlbnRlcnByaXNlIGJlYW4gb3Igd2hldGhlciBhIHNwZWNpZmljIHJ1bi1hcworICogICAgICAgICBpZGVudGl0eSBpcyB0byBiZSB1c2VkLiBJdCBjb250YWlucyBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbgorICogICAgICAgICBhbmQgYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNjEsNyArNjMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNlIENhbGxlciBJZGVudGl0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtNzAsMTIgKzcyLDEzIEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICAgIFRoZSB1c2UtY2FsbGVyLWlkZW50aXR5IGVsZW1lbnQgc3BlY2lmaWVzIHRoYXQKLQkgKiAJICAgICAgdGhlIGNhbGxlcidzIHNlY3VyaXR5IGlkZW50aXR5IGJlIHVzZWQgYXMgdGhlCi0JICogCSAgICAgIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQotCSAqIAkgICAgICBlbnRlcnByaXNlIGJlYW4ncyBtZXRob2RzLgotCSAqIAotCSAqIAkgICAgCisJICogICAgICAgICAgICAgICBUaGUgdXNlLWNhbGxlci1pZGVudGl0eSBlbGVtZW50IHNwZWNpZmllcyB0aGF0CisJICogICAgICAgICAgICAgICB0aGUgY2FsbGVyJ3Mgc2VjdXJpdHkgaWRlbnRpdHkgYmUgdXNlZCBhcyB0aGUKKwkgKiAgICAgICAgICAgICAgIHNlY3VyaXR5IGlkZW50aXR5IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZQorCSAqICAgICAgICAgICAgICAgZW50ZXJwcmlzZSBiZWFuJ3MgbWV0aG9kcy4KKwkgKiAgICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAorCSAqICAgICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2UgQ2FsbGVyIElkZW50aXR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiBAc2VlICNzZXRVc2VDYWxsZXJJZGVudGl0eShFbXB0eVR5cGUpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9TZXNzaW9uQmVhbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvU2Vzc2lvbkJlYW4uamF2YQppbmRleCA1ZGYyMDVkLi4xMGU4OWIxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9TZXNzaW9uQmVhbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1Nlc3Npb25CZWFuLmphdmEKQEAgLTEyLDcgKzEyLDIzIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbXB0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjIsNjQgKzM4LDgxIEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIHNlc3Npb24tYmVhblR5cGUgZGVjbGFyZXMgYW4gc2Vzc2lvbiBiZWFuLiBUaGUKLSAqIAlkZWNsYXJhdGlvbiBjb25zaXN0cyBvZjoKLSAqIAotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZQotICogCSAgICAgIGljb24gZmlsZSBuYW1lCi0gKiAJICAgIC0gYSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBlbnRlcnByaXNlIGJlYW4KLSAqIAkgICAgICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbgotICogICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBtYXBwZWQtbmFtZSBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZQotICogICAgICAgICAgICAgICB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBwaHlzaWNhbAotICogICAgICAgICAgICAgICBqbmRpLW5hbWUgb2YgdGhlIHNlc3Npb24gYmVhbidzIHJlbW90ZSBob21lL2J1c2luZXNzIGludGVyZmFjZS4KLSAqICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIG5vdCByZXF1aXJlZCB0byBiZSBzdXBwb3J0ZWQgYnkgYWxsCi0gKiAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucy4gQW55IHVzZSBvZiB0aGlzIGVsZW1lbnQgaXMgbm9uLXBvcnRhYmxlLgotICogICAgICAgICAgICAgLSB0aGUgbmFtZXMgb2YgYWxsIHRoZSByZW1vdGUgb3IgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlcywKLSAqICAgICAgICAgICAgICAgaWYgYW55Ci0gKiAJICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyByZW1vdGUgaG9tZSBhbmQKLSAqIAkgICAgICByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55Ci0gKiAJICAgIC0gdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBsb2NhbCBob21lIGFuZAotICogCSAgICAgIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueQotICogCSAgICAtIHRoZSBuYW1lIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyB3ZWIgc2VydmljZSBlbmRwb2ludAotICogCSAgICAgIGludGVyZmFjZSwgaWYgYW55Ci0gKiAJICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gKiAJICAgIC0gdGhlIHNlc3Npb24gYmVhbidzIHN0YXRlIG1hbmFnZW1lbnQgdHlwZQotICogICAgICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgdGltZW91dCBtZXRob2QuCi0gKiAJICAgIC0gdGhlIG9wdGlvbmFsIHNlc3Npb24gYmVhbidzIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KLSAqICAgICAgICAgICAgICAgSWYgaXQgaXMgbm90IHByZXNlbnQsIGl0IGlzIGRlZmF1bHRlZCB0byBDb250YWluZXIuCi0gKiAgICAgICAgICAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBhbmQvb3IKLSAqICAgICAgICAgICAgICAgc3VwZXJjbGFzcyBhcm91bmQtaW52b2tlIG1ldGhvZHMuCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncwotICogCSAgICAgIGVudmlyb25tZW50IGVudHJpZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbAotICogCSAgICAgIEVKQiByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyB3ZWIKLSAqIAkgICAgICBzZXJ2aWNlIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcm9sZQotICogCSAgICAgIHJlZmVyZW5jZXMKLSAqIAkgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkKLSAqIAkgICAgICB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kcwotICogCSAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UKLSAqIAkgICAgICBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZQotICogCSAgICAgIGVudmlyb25tZW50IHJlZmVyZW5jZXMuCi0gKiAJICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlCi0gKiAJICAgICAgZGVzdGluYXRpb24gcmVmZXJlbmNlcwotICogCi0gKiAJVGhlIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZQotICogCXRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlCi0gKiAJZW1wdHkuCi0gKiAKLSAqIAlFaXRoZXIgYm90aCB0aGUgbG9jYWwtaG9tZSBhbmQgdGhlIGxvY2FsIGVsZW1lbnRzIG9yIGJvdGgKLSAqIAl0aGUgaG9tZSBhbmQgdGhlIHJlbW90ZSBlbGVtZW50cyBtdXN0IGJlIHNwZWNpZmllZCBmb3IgdGhlCi0gKiAJc2Vzc2lvbiBiZWFuLgotICogCi0gKiAJVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgaWYgdGhlCi0gKiAJYmVhbiBpcyBhIHN0YXRlbGVzcyBzZXNzaW9uIGJlYW4uCi0gKiAKKyAqICAgICAgICAgVGhlIHNlc3Npb24tYmVhblR5cGUgZGVjbGFyZXMgYW4gc2Vzc2lvbiBiZWFuLiBUaGUKKyAqICAgICAgICAgZGVjbGFyYXRpb24gY29uc2lzdHMgb2Y6CisgKiAgICAgICAgIAorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGlzcGxheSBuYW1lCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgaWNvbiBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBzbWFsbCBhbmQgYSBsYXJnZSAKKyAqICAgICAgICAgaWNvbiBmaWxlIG5hbWUKKyAqICAgICAgICAgLSBhIG5hbWUgYXNzaWduZWQgdG8gdGhlIGVudGVycHJpc2UgYmVhbgorICogICAgICAgICBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbgorICogICAgICAgICAtIGFuIG9wdGlvbmFsIG1hcHBlZC1uYW1lIGVsZW1lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlCisgKiAgICAgICAgIHZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHBoeXNpY2FsCisgKiAgICAgICAgIGpuZGktbmFtZSBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGhvbWUvYnVzaW5lc3MgaW50ZXJmYWNlLiAKKyAqICAgICAgICAgVGhpcyBlbGVtZW50IGlzIG5vdCByZXF1aXJlZCB0byBiZSBzdXBwb3J0ZWQgYnkgYWxsIAorICogICAgICAgICBpbXBsZW1lbnRhdGlvbnMuIEFueSB1c2Ugb2YgdGhpcyBlbGVtZW50IGlzIG5vbi1wb3J0YWJsZS4KKyAqICAgICAgICAgLSB0aGUgbmFtZXMgb2YgYWxsIHRoZSByZW1vdGUgb3IgbG9jYWwgYnVzaW5lc3MgaW50ZXJmYWNlcywgCisgKiAgICAgICAgIGlmIGFueQorICogICAgICAgICAtIHRoZSBuYW1lcyBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgcmVtb3RlIGhvbWUgYW5kCisgKiAgICAgICAgIHJlbW90ZSBpbnRlcmZhY2VzLCBpZiBhbnkKKyAqICAgICAgICAgLSB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIGxvY2FsIGhvbWUgYW5kCisgKiAgICAgICAgIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueQorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIHRoYXQgdGhpcyBiZWFuIGV4cG9zZXMgYQorICogICAgICAgICBuby1pbnRlcmZhY2UgdmlldworICogICAgICAgICAtIHRoZSBuYW1lIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyB3ZWIgc2VydmljZSBlbmRwb2ludAorICogICAgICAgICBpbnRlcmZhY2UsIGlmIGFueQorICogICAgICAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyBpbXBsZW1lbnRhdGlvbiBjbGFzcworICogICAgICAgICAtIHRoZSBzZXNzaW9uIGJlYW4ncyBzdGF0ZSBtYW5hZ2VtZW50IHR5cGUKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiBhIHN0YXRlZnVsIHNlc3Npb24gYmVhbidzIHRpbWVvdXQgdmFsdWUKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2Vzc2lvbiBiZWFuJ3MgdGltZW91dCBtZXRob2QgZm9yCisgKiAgICAgICAgIGhhbmRsaW5nIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlZCB0aW1lcnMKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aW1lcnMgdG8gYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGF0CisgKiAgICAgICAgIGRlcGxveW1lbnQgdGltZQorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIHRoYXQgYSBTaW5nbGV0b24gYmVhbiBoYXMgZWFnZXIKKyAqICAgICAgICAgaW5pdGlhbGl6YXRpb24KKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiBhIFNpbmdsZXRvbi9TdGF0ZWZ1bCBiZWFuJ3MgY29uY3VycmVuY3kgCisgKiAgICAgICAgIG1hbmFnZW1lbnQgdHlwZQorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXRob2QgbG9ja2luZyBtZXRhZGF0YQorICogICAgICAgICBmb3IgYSBTaW5nbGV0b24gd2l0aCBjb250YWluZXIgbWFuYWdlZCBjb25jdXJyZW5jeQorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBvdGhlciBTaW5nbGV0b24gYmVhbnMgaW4gdGhlCisgKiAgICAgICAgIGFwcGxpY2F0aW9uIHRoYXQgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhpcyBiZWFuCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlc3Npb24gYmVhbidzIGFzeW5jaHJvbm91cyAKKyAqICAgICAgICAgbWV0aG9kcworICogICAgICAgICAtIHRoZSBvcHRpb25hbCBzZXNzaW9uIGJlYW4ncyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHR5cGUuIAorICogICAgICAgICBJZiBpdCBpcyBub3QgcHJlc2VudCwgaXQgaXMgZGVmYXVsdGVkIHRvIENvbnRhaW5lci4KKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiBhIHN0YXRlZnVsIHNlc3Npb24gYmVhbidzIAorICogICAgICAgICBhZnRlckJlZ2luLCBiZWZvcmVDb21wbGV0aW9uLCBhbmQvb3IgYWZ0ZXJDb21wbGV0aW9uIG1ldGhvZHMKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBsaXN0IG9mIHRoZSBzZXNzaW9uIGJlYW4gY2xhc3MgYW5kL29yCisgKiAgICAgICAgIHN1cGVyY2xhc3MgYXJvdW5kLWludm9rZSBtZXRob2RzLgorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGxpc3Qgb2YgdGhlIHNlc3Npb24gYmVhbiBjbGFzcyBhbmQvb3IKKyAqICAgICAgICAgc3VwZXJjbGFzcyBhcm91bmQtdGltZW91dCBtZXRob2RzLgorICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgCisgKiAgICAgICAgIGVudmlyb25tZW50IGVudHJpZXMKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIEVKQiByZWZlcmVuY2VzCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBsb2NhbCAKKyAqICAgICAgICAgRUpCIHJlZmVyZW5jZXMKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIHdlYiAKKyAqICAgICAgICAgc2VydmljZSByZWZlcmVuY2VzCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIHNlY3VyaXR5IHJvbGUgCisgKiAgICAgICAgIHJlZmVyZW5jZXMKKyAqICAgICAgICAgLSBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgc2VjdXJpdHkgaWRlbnRpdHkgCisgKiAgICAgICAgIHRvIGJlIHVzZWQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJlYW4ncyBtZXRob2RzCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSAKKyAqICAgICAgICAgbWFuYWdlciBjb25uZWN0aW9uIGZhY3RvcnkgcmVmZXJlbmNlcworICogICAgICAgICAtIGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgcmVzb3VyY2UgCisgKiAgICAgICAgIGVudmlyb25tZW50IHJlZmVyZW5jZXMuCisgKiAgICAgICAgIC0gYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyBtZXNzYWdlIAorICogICAgICAgICBkZXN0aW5hdGlvbiByZWZlcmVuY2VzCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlCisgKiAgICAgICAgIHRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlCisgKiAgICAgICAgIGVtcHR5LgorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgaWYgdGhlCisgKiAgICAgICAgIGJlYW4gaXMgYSBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtOTcsMTQgKzEzMCwyNiBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldExvY2FsIDxlbT5Mb2NhbDwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QnVzaW5lc3NMb2NhbHMgPGVtPkJ1c2luZXNzIExvY2FsczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QnVzaW5lc3NSZW1vdGVzIDxlbT5CdXNpbmVzcyBSZW1vdGVzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRMb2NhbEJlYW4gPGVtPkxvY2FsIEJlYW48L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFNlcnZpY2VFbmRwb2ludCA8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RWpiQ2xhc3MgPGVtPkVqYiBDbGFzczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2Vzc2lvblR5cGUgPGVtPlNlc3Npb24gVHlwZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U3RhdGVmdWxUaW1lb3V0IDxlbT5TdGF0ZWZ1bCBUaW1lb3V0PC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRUaW1lb3V0TWV0aG9kIDxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0VGltZXIgPGVtPlRpbWVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNpc0luaXRPblN0YXJ0dXAgPGVtPkluaXQgT24gU3RhcnR1cDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSA8ZW0+Q29uY3VycmVuY3kgTWFuYWdlbWVudCBUeXBlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRDb25jdXJyZW50TWV0aG9kIDxlbT5Db25jdXJyZW50IE1ldGhvZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RGVwZW5kc09uIDxlbT5EZXBlbmRzIE9uPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRJbml0TWV0aG9kcyA8ZW0+SW5pdCBNZXRob2RzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRSZW1vdmVNZXRob2RzIDxlbT5SZW1vdmUgTWV0aG9kczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QXN5bmNNZXRob2QgPGVtPkFzeW5jIE1ldGhvZDwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRBZnRlckJlZ2luTWV0aG9kIDxlbT5BZnRlciBCZWdpbiBNZXRob2Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEJlZm9yZUNvbXBsZXRpb25NZXRob2QgPGVtPkJlZm9yZSBDb21wbGV0aW9uIE1ldGhvZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QWZ0ZXJDb21wbGV0aW9uTWV0aG9kIDxlbT5BZnRlciBDb21wbGV0aW9uIE1ldGhvZDwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QXJvdW5kSW52b2tlcyA8ZW0+QXJvdW5kIEludm9rZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEFyb3VuZFRpbWVvdXRzIDxlbT5Bcm91bmQgVGltZW91dHM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RWpiTG9jYWxSZWZzIDxlbT5FamIgTG9jYWwgUmVmczwvZW0+fTwvbGk+CkBAIC0xMTYsNiArMTYxLDcgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldERhdGFTb3VyY2UgPGVtPkRhdGEgU291cmNlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRQb3N0QWN0aXZhdGVzIDxlbT5Qb3N0IEFjdGl2YXRlczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UHJlUGFzc2l2YXRlcyA8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFNlY3VyaXR5Um9sZVJlZnMgPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+fTwvbGk+CkBAIC0xNDIsNyArMTg4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTU3LDcgKzIwMyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0Rpc3BsYXlOYW1lcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7CisJTGlzdDxEaXNwbGF5TmFtZT4gZ2V0RGlzcGxheU5hbWVzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xNzIsNyArMjE4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fSWNvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEljb25zKCk7CisJTGlzdDxJY29uPiBnZXRJY29ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTMzNyw3ICszODMsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9CdXNpbmVzc0xvY2FscygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0QnVzaW5lc3NMb2NhbHMoKTsKKwlMaXN0PFN0cmluZz4gZ2V0QnVzaW5lc3NMb2NhbHMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJ1c2luZXNzIFJlbW90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgpAQCAtMzUyLDcgKzM5OCwzNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9CdXNpbmVzc1JlbW90ZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEJ1c2luZXNzUmVtb3RlcygpOworCUxpc3Q8U3RyaW5nPiBnZXRCdXNpbmVzc1JlbW90ZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2FsIEJlYW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoZSBsb2NhbC1iZWFuIGVsZW1lbnQgZGVjbGFyZXMgdGhhdCB0aGlzCisJICogICAgICAgICAgICAgc2Vzc2lvbiBiZWFuIGV4cG9zZXMgYSBuby1pbnRlcmZhY2UgTG9jYWwgY2xpZW50IHZpZXcuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgRUpCIDMuMQorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYWwgQmVhbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0TG9jYWxCZWFuKEVtcHR5VHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fTG9jYWxCZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRW1wdHlUeXBlIGdldExvY2FsQmVhbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0TG9jYWxCZWFuIDxlbT5Mb2NhbCBCZWFuPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBCZWFuPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRMb2NhbEJlYW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldExvY2FsQmVhbihFbXB0eVR5cGUgdmFsdWUpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmljZSBFbmRwb2ludDwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMzYxLDE0ICs0MzcsMTUgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSBzZXJ2aWNlLWVuZHBvaW50IGVsZW1lbnQgY29udGFpbnMgdGhlCi0JICogCSAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3Mgd2ViCi0JICogCSAgICBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZS4gVGhlIHNlcnZpY2UtZW5kcG9pbnQKLQkgKiAJICAgIGVsZW1lbnQgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBhIHN0YXRlbGVzcwotCSAqIAkgICAgc2Vzc2lvbiBiZWFuLiBUaGUgc3BlY2lmaWVkIGludGVyZmFjZSBtdXN0IGJlIGEKLQkgKiAJICAgIHZhbGlkIEpBWC1SUEMgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIHNlcnZpY2UtZW5kcG9pbnQgZWxlbWVudCBjb250YWlucyB0aGUKKwkgKiAgICAgICAgICAgICBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50ZXJwcmlzZSBiZWFuJ3Mgd2ViCisJICogICAgICAgICAgICAgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuIFRoZSBzZXJ2aWNlLWVuZHBvaW50CisJICogICAgICAgICAgICAgZWxlbWVudCBtYXkgb25seSBiZSBzcGVjaWZpZWQgZm9yIGEgc3RhdGVsZXNzCisJICogICAgICAgICAgICAgc2Vzc2lvbiBiZWFuLiBUaGUgc3BlY2lmaWVkIGludGVyZmFjZSBtdXN0IGJlIGEKKwkgKiAgICAgICAgICAgICB2YWxpZCBKQVgtUlBDIHNlcnZpY2UgZW5kcG9pbnQgaW50ZXJmYWNlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFNlcnZpY2VFbmRwb2ludChTdHJpbmcpCkBAIC0zOTQsMTEgKzQ3MSwxMiBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqICAgICAgICAgICAgICBUaGUgZWpiLWNsYXNzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZQotCSAqICAgICAgICAgICAgICBvZiB0aGUgYmVhbiBjbGFzcyBmb3IgdGhpcyBlamIuICBJdCBpcyByZXF1aXJlZCB1bmxlc3MKLQkgKiAgICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21wb25lbnQtZGVmaW5pbmcgYW5ub3RhdGlvbiBmb3IgdGhlIHNhbWUKLQkgKiAgICAgICAgICAgICAgZWpiLW5hbWUuCi0JICogCisJICogICAgICAgICAgICAgVGhlIGVqYi1jbGFzcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUKKwkgKiAgICAgICAgICAgICBvZiB0aGUgYmVhbiBjbGFzcyBmb3IgdGhpcyBlamIuICBJdCBpcyByZXF1aXJlZCB1bmxlc3MKKwkgKiAgICAgICAgICAgICB0aGVyZSBpcyBhIGNvbXBvbmVudC1kZWZpbmluZyBhbm5vdGF0aW9uIGZvciB0aGUgc2FtZQorCSAqICAgICAgICAgICAgIGVqYi1uYW1lLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKIAkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCkBAIC00MjAsNyArNDk4LDYgQEAKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlc3Npb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJTdGF0ZWZ1bCI8L2NvZGU+LgogCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25UeXBlfS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtNDc1LDYgKzU1MiwzMSBAQAogCWJvb2xlYW4gaXNTZXRTZXNzaW9uVHlwZSgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhdGVmdWwgVGltZW91dDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RhdGVmdWwgVGltZW91dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGF0ZWZ1bCBUaW1lb3V0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRTdGF0ZWZ1bFRpbWVvdXQoU3RhdGVmdWxUaW1lb3V0VHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fU3RhdGVmdWxUaW1lb3V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RhdGVmdWxUaW1lb3V0VHlwZSBnZXRTdGF0ZWZ1bFRpbWVvdXQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFN0YXRlZnVsVGltZW91dCA8ZW0+U3RhdGVmdWwgVGltZW91dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdGVmdWwgVGltZW91dDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U3RhdGVmdWxUaW1lb3V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTdGF0ZWZ1bFRpbWVvdXQoU3RhdGVmdWxUaW1lb3V0VHlwZSB2YWx1ZSk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lb3V0IE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CkBAIC00ODIsNiArNTg0LDE2IEBACiAJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgogCSAqIDwvcD4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgdGltZW91dC1tZXRob2QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1ldGhvZCB0aGF0CisJICogICAgICAgICAgICAgd2lsbCByZWNlaXZlIGNhbGxiYWNrcyBmb3IgcHJvZ3JhbW1hdGljYWxseQorCSAqICAgICAgICAgICAgIGNyZWF0ZWQgdGltZXJzLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiBAc2VlICNzZXRUaW1lb3V0TWV0aG9kKE5hbWVkTWV0aG9kVHlwZSkKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fVGltZW91dE1ldGhvZCgpCkBAIC01MDAsNiArNjEyLDE3NSBAQAogCXZvaWQgc2V0VGltZW91dE1ldGhvZChOYW1lZE1ldGhvZFR5cGUgdmFsdWUpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGltZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fVGltZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PFRpbWVyVHlwZT4gZ2V0VGltZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXQgT24gU3RhcnR1cDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIGluaXQtb24tc3RhcnR1cCBlbGVtZW50IHNwZWNpZmllcyB0aGF0IGEgU2luZ2xldG9uCisJICogICAgICAgICAgICAgYmVhbiBoYXMgZWFnZXIgaW5pdGlhbGl6YXRpb24uCisJICogICAgICAgICAgICAgVGhpcyBlbGVtZW50IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3Igc2luZ2xldG9uIHNlc3Npb24KKwkgKiAgICAgICAgICAgICBiZWFucy4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBFSkIgMy4wCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0IE9uIFN0YXJ0dXA8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0SW5pdE9uU3RhcnR1cCgpCisJICogQHNlZSAjdW5zZXRJbml0T25TdGFydHVwKCkKKwkgKiBAc2VlICNzZXRJbml0T25TdGFydHVwKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0luaXRPblN0YXJ0dXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzSW5pdE9uU3RhcnR1cCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jaXNJbml0T25TdGFydHVwIDxlbT5Jbml0IE9uIFN0YXJ0dXA8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXQgT24gU3RhcnR1cDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRJbml0T25TdGFydHVwKCkKKwkgKiBAc2VlICN1bnNldEluaXRPblN0YXJ0dXAoKQorCSAqIEBzZWUgI2lzSW5pdE9uU3RhcnR1cCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SW5pdE9uU3RhcnR1cChib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jaXNJbml0T25TdGFydHVwIDxlbT5Jbml0IE9uIFN0YXJ0dXA8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0SW5pdE9uU3RhcnR1cCgpCisJICogQHNlZSAjaXNJbml0T25TdGFydHVwKCkKKwkgKiBAc2VlICNzZXRJbml0T25TdGFydHVwKGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRJbml0T25TdGFydHVwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2lzSW5pdE9uU3RhcnR1cCA8ZW0+SW5pdCBPbiBTdGFydHVwPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0IE9uIFN0YXJ0dXA8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldEluaXRPblN0YXJ0dXAoKQorCSAqIEBzZWUgI2lzSW5pdE9uU3RhcnR1cCgpCisJICogQHNlZSAjc2V0SW5pdE9uU3RhcnR1cChib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0SW5pdE9uU3RhcnR1cCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uY3VycmVuY3kgTWFuYWdlbWVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY3VycmVuY3kgTWFuYWdlbWVudCBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmN1cnJlbmN5IE1hbmFnZW1lbnQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZQorCSAqIEBzZWUgI2lzU2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSgpCisJICogQHNlZSAjdW5zZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlKCkKKwkgKiBAc2VlICNzZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlKENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9Db25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUgZ2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSA8ZW0+Q29uY3VycmVuY3kgTWFuYWdlbWVudCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25jdXJyZW5jeSBNYW5hZ2VtZW50IFR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUKKwkgKiBAc2VlICNpc1NldENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUoKQorCSAqIEBzZWUgI3Vuc2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSgpCisJICogQHNlZSAjZ2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZShDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUgPGVtPkNvbmN1cnJlbmN5IE1hbmFnZW1lbnQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlKCkKKwkgKiBAc2VlICNnZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlKCkKKwkgKiBAc2VlICNzZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlKENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHVuc2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlIDxlbT5Db25jdXJyZW5jeSBNYW5hZ2VtZW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmN1cnJlbmN5IE1hbmFnZW1lbnQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIEBzZWUgI3Vuc2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSgpCisJICogQHNlZSAjZ2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSgpCisJICogQHNlZSAjc2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZShDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZSkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NldENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmN1cnJlbnQgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudE1ldGhvZFR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY3VycmVudCBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25jdXJyZW50IE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fQ29uY3VycmVudE1ldGhvZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8Q29uY3VycmVudE1ldGhvZFR5cGU+IGdldENvbmN1cnJlbnRNZXRob2QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlcGVuZHMgT248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlcGVuZHMgT248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVwZW5kcyBPbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0RGVwZW5kc09uKERlcGVuZHNPblR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0RlcGVuZHNPbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCURlcGVuZHNPblR5cGUgZ2V0RGVwZW5kc09uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXREZXBlbmRzT24gPGVtPkRlcGVuZHMgT248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlcGVuZHMgT248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldERlcGVuZHNPbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGVwZW5kc09uKERlcGVuZHNPblR5cGUgdmFsdWUpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5pdCBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KIAkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW5pdE1ldGhvZFR5cGV9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC01MDcsMTggKzc4OCwxOSBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIGluaXQtbWV0aG9kIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtYXBwaW5ncyBmb3IKLQkgKiAJICAgIEVKQiAyLnggc3R5bGUgY3JlYXRlIG1ldGhvZHMgZm9yIGFuIEVKQiAzLjAgYmVhbi4KLQkgKiAJICAgIFRoaXMgZWxlbWVudCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHN0YXRlZnVsCi0JICogICAgICAgICAgICAgc2Vzc2lvbiBiZWFucy4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgaW5pdC1tZXRob2QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1hcHBpbmdzIGZvcgorCSAqICAgICAgICAgICAgIEVKQiAyLnggc3R5bGUgY3JlYXRlIG1ldGhvZHMgZm9yIGFuIEVKQiAzLnggYmVhbi4KKwkgKiAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciBzdGF0ZWZ1bCAKKwkgKiAgICAgICAgICAgICBzZXNzaW9uIGJlYW5zLiAKKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBFSkIgMy4wCisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0IE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0luaXRNZXRob2RzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRJbml0TWV0aG9kcygpOworCUxpc3Q8SW5pdE1ldGhvZFR5cGU+IGdldEluaXRNZXRob2RzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1vdmUgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC01MjgsMjIgKzgxMCwzNyBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIHJlbW92ZS1tZXRob2QgZWxlbWVudCBzcGVjaWZpZXMgdGhlIG1hcHBpbmdzIGZvcgotCSAqIAkgICAgRUpCIDIueCBzdHlsZSByZW1vdmUgbWV0aG9kcyBmb3IgYW4gRUpCIDMuMCBiZWFuLgotCSAqIAkgICAgVGhpcyBlbGVtZW50IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3Igc3RhdGVmdWwKLQkgKiAgICAgICAgICAgICBzZXNzaW9uIGJlYW5zLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSByZW1vdmUtbWV0aG9kIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBtYXBwaW5ncyBmb3IKKwkgKiAgICAgICAgICAgICBFSkIgMi54IHN0eWxlIHJlbW92ZSBtZXRob2RzIGZvciBhbiBFSkIgMy54IGJlYW4uCisJICogICAgICAgICAgICAgVGhpcyBlbGVtZW50IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3Igc3RhdGVmdWwgCisJICogICAgICAgICAgICAgc2Vzc2lvbiBiZWFucy4gCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgRUpCIDMuMAorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtb3ZlIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1JlbW92ZU1ldGhvZHMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFJlbW92ZU1ldGhvZHMoKTsKKwlMaXN0PFJlbW92ZU1ldGhvZFR5cGU+IGdldFJlbW92ZU1ldGhvZHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzeW5jIE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzeW5jTWV0aG9kVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bc3luYyBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3luYyBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0FzeW5jTWV0aG9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxBc3luY01ldGhvZFR5cGU+IGdldEFzeW5jTWV0aG9kKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkJlYW4iPC9jb2RlPi4KIAkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGV9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CkBAIC01OTgsNiArODk1LDg0IEBACiAJYm9vbGVhbiBpc1NldFRyYW5zYWN0aW9uVHlwZSgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWZ0ZXIgQmVnaW4gTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBFSkIgMy4xCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZnRlciBCZWdpbiBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEFmdGVyQmVnaW5NZXRob2QoTmFtZWRNZXRob2RUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9BZnRlckJlZ2luTWV0aG9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTmFtZWRNZXRob2RUeXBlIGdldEFmdGVyQmVnaW5NZXRob2QoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEFmdGVyQmVnaW5NZXRob2QgPGVtPkFmdGVyIEJlZ2luIE1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWZ0ZXIgQmVnaW4gTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRBZnRlckJlZ2luTWV0aG9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBZnRlckJlZ2luTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CZWZvcmUgQ29tcGxldGlvbiBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIEVKQiAzLjEKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJlZm9yZSBDb21wbGV0aW9uIE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QmVmb3JlQ29tcGxldGlvbk1ldGhvZChOYW1lZE1ldGhvZFR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0JlZm9yZUNvbXBsZXRpb25NZXRob2QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlOYW1lZE1ldGhvZFR5cGUgZ2V0QmVmb3JlQ29tcGxldGlvbk1ldGhvZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QmVmb3JlQ29tcGxldGlvbk1ldGhvZCA8ZW0+QmVmb3JlIENvbXBsZXRpb24gTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CZWZvcmUgQ29tcGxldGlvbiBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEJlZm9yZUNvbXBsZXRpb25NZXRob2QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEJlZm9yZUNvbXBsZXRpb25NZXRob2QoTmFtZWRNZXRob2RUeXBlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFmdGVyIENvbXBsZXRpb24gTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBFSkIgMy4xCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZnRlciBDb21wbGV0aW9uIE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QWZ0ZXJDb21wbGV0aW9uTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fQWZ0ZXJDb21wbGV0aW9uTWV0aG9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTmFtZWRNZXRob2RUeXBlIGdldEFmdGVyQ29tcGxldGlvbk1ldGhvZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QWZ0ZXJDb21wbGV0aW9uTWV0aG9kIDxlbT5BZnRlciBDb21wbGV0aW9uIE1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWZ0ZXIgQ29tcGxldGlvbiBNZXRob2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEFmdGVyQ29tcGxldGlvbk1ldGhvZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QWZ0ZXJDb21wbGV0aW9uTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSB2YWx1ZSk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bcm91bmQgSW52b2tlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCiAJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGV9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC02MTAsNyArOTg1LDIzIEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX0Fyb3VuZEludm9rZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEFyb3VuZEludm9rZXMoKTsKKwlMaXN0PEFyb3VuZEludm9rZVR5cGU+IGdldEFyb3VuZEludm9rZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFyb3VuZCBUaW1lb3V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZFRpbWVvdXRUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIEVKQiAzLjEKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFyb3VuZCBUaW1lb3V0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fQXJvdW5kVGltZW91dHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PEFyb3VuZFRpbWVvdXRUeXBlPiBnZXRBcm91bmRUaW1lb3V0cygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNjI1LDcgKzEwMTYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9FbnZFbnRyaWVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRFbnZFbnRyaWVzKCk7CisJTGlzdDxFbnZFbnRyeT4gZ2V0RW52RW50cmllcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNjQwLDcgKzEwMzEsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9FamJSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRFamJSZWZzKCk7CisJTGlzdDxFamJSZWY+IGdldEVqYlJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTY1NSw3ICsxMDQ2LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fRWpiTG9jYWxSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRFamJMb2NhbFJlZnMoKTsKKwlMaXN0PEVqYkxvY2FsUmVmPiBnZXRFamJMb2NhbFJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC02NzAsNyArMTA2MSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1NlcnZpY2VSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRTZXJ2aWNlUmVmcygpOworCUxpc3Q8U2VydmljZVJlZj4gZ2V0U2VydmljZVJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNjg1LDcgKzEwNzYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9SZXNvdXJjZVJlZnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFJlc291cmNlUmVmcygpOworCUxpc3Q8UmVzb3VyY2VSZWY+IGdldFJlc291cmNlUmVmcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNzAwLDcgKzEwOTEsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9SZXNvdXJjZUVudlJlZnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFJlc291cmNlRW52UmVmcygpOworCUxpc3Q8UmVzb3VyY2VFbnZSZWY+IGdldFJlc291cmNlRW52UmVmcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTcxNSw3ICsxMTA2LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOworCUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uUmVmPiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNzMwLDcgKzExMjEsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7CisJTGlzdDxQZXJzaXN0ZW5jZUNvbnRleHRSZWY+IGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03NDUsNyArMTEzNiw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1BlcnNpc3RlbmNlVW5pdFJlZnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKTsKKwlMaXN0PFBlcnNpc3RlbmNlVW5pdFJlZj4gZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTc2MCw3ICsxMTUxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fUG9zdENvbnN0cnVjdHMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCk7CisJTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gZ2V0UG9zdENvbnN0cnVjdHMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03NzUsNyArMTE2NiwyMiBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTZXNzaW9uQmVhbl9QcmVEZXN0cm95cygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0UHJlRGVzdHJveXMoKTsKKwlMaXN0PExpZmVjeWNsZUNhbGxiYWNrPiBnZXRQcmVEZXN0cm95cygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF0YSBTb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YSBTb3VyY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIFNvdXJjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fRGF0YVNvdXJjZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8RGF0YVNvdXJjZVR5cGU+IGdldERhdGFTb3VyY2UoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgQWN0aXZhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTc5MCw3ICsxMTk2LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fUG9zdEFjdGl2YXRlcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0UG9zdEFjdGl2YXRlcygpOworCUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IGdldFBvc3RBY3RpdmF0ZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBQYXNzaXZhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTgwNSw3ICsxMjExLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0U2Vzc2lvbkJlYW5fUHJlUGFzc2l2YXRlcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0UHJlUGFzc2l2YXRlcygpOworCUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IGdldFByZVBhc3NpdmF0ZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC04MjAsNyArMTIyNiw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25CZWFuX1NlY3VyaXR5Um9sZVJlZnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFNlY3VyaXR5Um9sZVJlZnMoKTsKKwlMaXN0PFNlY3VyaXR5Um9sZVJlZj4gZ2V0U2VjdXJpdHlSb2xlUmVmcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdXJpdHkgSWRlbnRpdGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvU2Vzc2lvblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1Nlc3Npb25UeXBlLmphdmEKaW5kZXggYTQxNzEwYy4uZGE2YmVmZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvU2Vzc2lvblR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9TZXNzaW9uVHlwZS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjQsMjEgKzI0LDY2IEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIHNlc3Npb24tdHlwZVR5cGUgZGVzY3JpYmVzIHdoZXRoZXIgdGhlIHNlc3Npb24gYmVhbiBpcyBhCi0gKiAJc3RhdGVmdWwgc2Vzc2lvbiBvciBzdGF0ZWxlc3Mgc2Vzc2lvbi4gSXQgaXMgdXNlZCBieQotICogCXNlc3Npb24tdHlwZSBlbGVtZW50cy4KLSAqIAotICogCVRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZzoKLSAqIAotICogCSAgICBTdGF0ZWZ1bAotICogCSAgICBTdGF0ZWxlc3MKLSAqIAorICogICAgICAgICBUaGUgc2Vzc2lvbi10eXBlVHlwZSBkZXNjcmliZXMgd2hldGhlciB0aGUgc2Vzc2lvbiBiZWFuIGlzIGEKKyAqICAgICAgICAgc2luZ2xldG9uLCBzdGF0ZWZ1bCBvciBzdGF0ZWxlc3Mgc2Vzc2lvbi4gSXQgaXMgdXNlZCBieQorICogICAgICAgICBzZXNzaW9uLXR5cGUgZWxlbWVudHMuCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHRocmVlIGZvbGxvd2luZzoKKyAqICAgICAgICAgCisgKiAgICAgICAgIFNpbmdsZXRvbgorICogICAgICAgICBTdGF0ZWZ1bAorICogICAgICAgICBTdGF0ZWxlc3MKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFNlc3Npb25UeXBlKCkKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlc3Npb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKK3B1YmxpYyBlbnVtIFNlc3Npb25UeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNpbmdsZXRvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTSU5HTEVUT04KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlTSU5HTEVUT05fTElURVJBTCgwLCAiU2luZ2xldG9uIiwgIlNpbmdsZXRvbiIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TdGF0ZWZ1bDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTVEFURUZVTAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVNUQVRFRlVMX0xJVEVSQUwoMSwgIlN0YXRlZnVsIiwgIlN0YXRlZnVsIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPlN0YXRlbGVzczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTVEFURUxFU1MKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlTVEFURUxFU1NfTElURVJBTCgyLCAiU3RhdGVsZXNzIiwgIlN0YXRlbGVzcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TaW5nbGV0b248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIEVKQiAzLjEKKwkgKiAgICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHNlZSAjU0lOR0xFVE9OX0xJVEVSQUwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU5HTEVUT04gPSAwOworCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+U3RhdGVmdWw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTUxLDcgKzk2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFURUZVTCA9IDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVGVUwgPSAxOwogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+U3RhdGVsZXNzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgpAQCAtNjUsMjcgKzExMCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVMRVNTID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXRlZnVsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVRFRlVMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZSBTVEFURUZVTF9MSVRFUkFMID0gbmV3IFNlc3Npb25UeXBlKFNUQVRFRlVMLCAiU3RhdGVmdWwiLCAiU3RhdGVmdWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGF0ZWxlc3M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBVEVMRVNTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZSBTVEFURUxFU1NfTElURVJBTCA9IG5ldyBTZXNzaW9uVHlwZShTVEFURUxFU1MsICJTdGF0ZWxlc3MiLCAiU3RhdGVsZXNzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRFTEVTUyA9IDI7CiAKIAkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KQEAgLTk1LDYgKzEyMCw3IEBACiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2Vzc2lvblR5cGVbXSBWQUxVRVNfQVJSQVkgPQogCQluZXcgU2Vzc2lvblR5cGVbXSB7CisJCQlTSU5HTEVUT05fTElURVJBTCwKIAkJCVNUQVRFRlVMX0xJVEVSQUwsCiAJCQlTVEFURUxFU1NfTElURVJBTCwKIAkJfTsKQEAgLTEwNSw3ICsxMzEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxTZXNzaW9uVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCkBAIC0xNDcsMjAgKzE3Myw4MSBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgU2Vzc2lvblR5cGUgZ2V0KGludCB2YWx1ZSkgewogCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIFNJTkdMRVRPTjogcmV0dXJuIFNJTkdMRVRPTl9MSVRFUkFMOwogCQkJY2FzZSBTVEFURUZVTDogcmV0dXJuIFNUQVRFRlVMX0xJVEVSQUw7CiAJCQljYXNlIFNUQVRFTEVTUzogcmV0dXJuIFNUQVRFTEVTU19MSVRFUkFMOwogCQl9Ci0JCXJldHVybiBudWxsOwkKKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgogCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwcml2YXRlIFNlc3Npb25UeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwogCX0KIAotfSAvL1Nlc3Npb25UeXBlCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1N0YXRlZnVsVGltZW91dFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1N0YXRlZnVsVGltZW91dFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjcxNDgxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvU3RhdGVmdWxUaW1lb3V0VHlwZS5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RhdGVmdWwgVGltZW91dCBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgVGhlIHN0YXRlZnVsLXRpbWVvdXRUeXBlIHJlcHJlc2VudHMgdGhlIGFtb3VudCBvZiB0aW1lCisgKiAgICAgICAgIGEgc3RhdGVmdWwgc2Vzc2lvbiBiZWFuIGNhbiBiZSBpZGxlKG5vdCByZWNlaXZlIGFueSBjbGllbnQKKyAqICAgICAgICAgaW52b2NhdGlvbnMpIGJlZm9yZSBpdCBpcyBlbGlnaWJsZSBmb3IgcmVtb3ZhbCBieSB0aGUgY29udGFpbmVyLgorICogICAgICAgICAKKyAqICAgICAgICAgQSB0aW1lb3V0IHZhbHVlIG9mIDAgbWVhbnMgdGhlIGJlYW4gaXMgaW1tZWRpYXRlbHkgZWxpZ2libGUgZm9yIHJlbW92YWwuCisgKiAgICAgICAgIAorICogICAgICAgICBBIHRpbWVvdXQgdmFsdWUgb2YgLTEgbWVhbnMgdGhlIGJlYW4gd2lsbCBuZXZlciBiZSByZW1vdmVkIGR1ZSB0byB0aW1lb3V0LgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgRUpCIDMuMQorICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU3RhdGVmdWxUaW1lb3V0VHlwZSNnZXRUaW1lb3V0IDxlbT5UaW1lb3V0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TdGF0ZWZ1bFRpbWVvdXRUeXBlI2dldFVuaXQgPGVtPlVuaXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlN0YXRlZnVsVGltZW91dFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFN0YXRlZnVsVGltZW91dFR5cGUoKQorICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RhdGVmdWxUaW1lb3V0VHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZW91dDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGltZW91dDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lb3V0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRUaW1lb3V0KEJpZ0ludGVnZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFN0YXRlZnVsVGltZW91dFR5cGVfVGltZW91dCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUJpZ0ludGVnZXIgZ2V0VGltZW91dCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU3RhdGVmdWxUaW1lb3V0VHlwZSNnZXRUaW1lb3V0IDxlbT5UaW1lb3V0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lb3V0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRUaW1lb3V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUaW1lb3V0KEJpZ0ludGVnZXIgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVVbml0VHlwZVR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vbml0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVVbml0VHlwZVR5cGUKKwkgKiBAc2VlICNpc1NldFVuaXQoKQorCSAqIEBzZWUgI3Vuc2V0VW5pdCgpCisJICogQHNlZSAjc2V0VW5pdChUaW1lVW5pdFR5cGVUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRTdGF0ZWZ1bFRpbWVvdXRUeXBlX1VuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUaW1lVW5pdFR5cGVUeXBlIGdldFVuaXQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlN0YXRlZnVsVGltZW91dFR5cGUjZ2V0VW5pdCA8ZW0+VW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lVW5pdFR5cGVUeXBlCisJICogQHNlZSAjaXNTZXRVbml0KCkKKwkgKiBAc2VlICN1bnNldFVuaXQoKQorCSAqIEBzZWUgI2dldFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFVuaXQoVGltZVVuaXRUeXBlVHlwZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlN0YXRlZnVsVGltZW91dFR5cGUjZ2V0VW5pdCA8ZW0+VW5pdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTZXRVbml0KCkKKwkgKiBAc2VlICNnZXRVbml0KCkKKwkgKiBAc2VlICNzZXRVbml0KFRpbWVVbml0VHlwZVR5cGUpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRVbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlN0YXRlZnVsVGltZW91dFR5cGUjZ2V0VW5pdCA8ZW0+VW5pdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIEBzZWUgI3Vuc2V0VW5pdCgpCisJICogQHNlZSAjZ2V0VW5pdCgpCisJICogQHNlZSAjc2V0VW5pdChUaW1lVW5pdFR5cGVUeXBlKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0VW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJZChTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFN0YXRlZnVsVGltZW91dFR5cGVfSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0SWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlN0YXRlZnVsVGltZW91dFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gU3RhdGVmdWxUaW1lb3V0VHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvVGltZVVuaXRUeXBlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvVGltZVVuaXRUeXBlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMmYzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9UaW1lVW5pdFR5cGVUeXBlLmphdmEKQEAgLTAsMCArMSwzNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+VGltZSBVbml0IFR5cGUgVHlwZTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgdGltZS11bml0LXR5cGVUeXBlIHJlcHJlc2VudHMgYSB0aW1lIGR1cmF0aW9uIGF0IGEgZ2l2ZW4KKyAqICAgICAgICAgdW5pdCBvZiBncmFudWxhcml0eS4gIAorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIHRpbWUgdW5pdCB0eXBlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgOgorICogICAgICAgICAKKyAqICAgICAgICAgRGF5cworICogICAgICAgICBIb3VycworICogICAgICAgICBNaW51dGVzCisgKiAgICAgICAgIFNlY29uZHMKKyAqICAgICAgICAgTWlsbGlzZWNvbmRzCisgKiAgICAgICAgIE1pY3Jvc2Vjb25kcworICogICAgICAgICBOYW5vc2Vjb25kcworICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgRUpCIDMuMQorICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0VGltZVVuaXRUeXBlVHlwZSgpCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIFRpbWVVbml0VHlwZVR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5EYXlzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0RBWVNfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlEQVlTKDAsICJEYXlzIiwgIkRheXMiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5Ib3VyczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNIT1VSU19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUhPVVJTKDEsICJIb3VycyIsICJIb3VycyIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk1pbnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTUlOVVRFU19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU1JTlVURVMoMiwgIk1pbnV0ZXMiLCAiTWludXRlcyIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNlY29uZHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU0VDT05EU19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVNFQ09ORFMoMywgIlNlY29uZHMiLCAiU2Vjb25kcyIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk1pbGxpc2Vjb25kczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNNSUxMSVNFQ09ORFNfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlNSUxMSVNFQ09ORFMoNCwgIk1pbGxpc2Vjb25kcyIsICJNaWxsaXNlY29uZHMiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5NaWNyb3NlY29uZHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTUlDUk9TRUNPTkRTX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTUlDUk9TRUNPTkRTKDUsICJNaWNyb3NlY29uZHMiLCAiTWljcm9zZWNvbmRzIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+TmFub3NlY29uZHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTkFOT1NFQ09ORFNfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlOQU5PU0VDT05EUyg2LCAiTmFub3NlY29uZHMiLCAiTmFub3NlY29uZHMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5EYXlzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5EYXlzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0RBWVMKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVlTX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkhvdXJzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5Ib3VyczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNIT1VSUworCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhPVVJTX1ZBTFVFID0gMTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk1pbnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk1pbnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTUlOVVRFUworCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTlVURVNfVkFMVUUgPSAyOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+U2Vjb25kczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U2Vjb25kczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTRUNPTkRTCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VDT05EU19WQUxVRSA9IDM7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5NaWxsaXNlY29uZHM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk1pbGxpc2Vjb25kczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNNSUxMSVNFQ09ORFMKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSUxMSVNFQ09ORFNfVkFMVUUgPSA0OworCisJLyoqCisJICogVGhlICc8ZW0+PGI+TWljcm9zZWNvbmRzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5NaWNyb3NlY29uZHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTUlDUk9TRUNPTkRTCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlDUk9TRUNPTkRTX1ZBTFVFID0gNTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk5hbm9zZWNvbmRzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OYW5vc2Vjb25kczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOQU5PU0VDT05EUworCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTk9TRUNPTkRTX1ZBTFVFID0gNjsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UaW1lIFVuaXQgVHlwZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBUaW1lVW5pdFR5cGVUeXBlW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IFRpbWVVbml0VHlwZVR5cGVbXSB7CisJCQlEQVlTLAorCQkJSE9VUlMsCisJCQlNSU5VVEVTLAorCQkJU0VDT05EUywKKwkJCU1JTExJU0VDT05EUywKKwkJCU1JQ1JPU0VDT05EUywKKwkJCU5BTk9TRUNPTkRTLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlRpbWUgVW5pdCBUeXBlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxUaW1lVW5pdFR5cGVUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRpbWUgVW5pdCBUeXBlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUaW1lVW5pdFR5cGVUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJVGltZVVuaXRUeXBlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRpbWUgVW5pdCBUeXBlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUaW1lVW5pdFR5cGVUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJVGltZVVuaXRUeXBlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VGltZSBVbml0IFR5cGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRpbWVVbml0VHlwZVR5cGUgZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIERBWVNfVkFMVUU6IHJldHVybiBEQVlTOworCQkJY2FzZSBIT1VSU19WQUxVRTogcmV0dXJuIEhPVVJTOworCQkJY2FzZSBNSU5VVEVTX1ZBTFVFOiByZXR1cm4gTUlOVVRFUzsKKwkJCWNhc2UgU0VDT05EU19WQUxVRTogcmV0dXJuIFNFQ09ORFM7CisJCQljYXNlIE1JTExJU0VDT05EU19WQUxVRTogcmV0dXJuIE1JTExJU0VDT05EUzsKKwkJCWNhc2UgTUlDUk9TRUNPTkRTX1ZBTFVFOiByZXR1cm4gTUlDUk9TRUNPTkRTOworCQkJY2FzZSBOQU5PU0VDT05EU19WQUxVRTogcmV0dXJuIE5BTk9TRUNPTkRTOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBUaW1lVW5pdFR5cGVUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL1RpbWVVbml0VHlwZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1RpbWVyU2NoZWR1bGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9UaW1lclNjaGVkdWxlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMjFmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9UaW1lclNjaGVkdWxlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRpbWVyIFNjaGVkdWxlIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgRUpCIDMuMQorICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJTY2hlZHVsZVR5cGUjZ2V0U2Vjb25kIDxlbT5TZWNvbmQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldE1pbnV0ZSA8ZW0+TWludXRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclNjaGVkdWxlVHlwZSNnZXRIb3VyIDxlbT5Ib3VyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclNjaGVkdWxlVHlwZSNnZXREYXlPZk1vbnRoIDxlbT5EYXkgT2YgTW9udGg8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldE1vbnRoIDxlbT5Nb250aDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJTY2hlZHVsZVR5cGUjZ2V0RGF5T2ZXZWVrIDxlbT5EYXkgT2YgV2VlazwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJTY2hlZHVsZVR5cGUjZ2V0WWVhciA8ZW0+WWVhcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJTY2hlZHVsZVR5cGUjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFRpbWVyU2NoZWR1bGVUeXBlKCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRpbWVyU2NoZWR1bGVUeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWNvbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY29uZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWNvbmQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFNlY29uZChTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFRpbWVyU2NoZWR1bGVUeXBlX1NlY29uZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRTZWNvbmQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldFNlY29uZCA8ZW0+U2Vjb25kPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZWNvbmQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFNlY29uZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U2Vjb25kKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaW51dGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1pbnV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1pbnV0ZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFRpbWVyU2NoZWR1bGVUeXBlX01pbnV0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRNaW51dGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldE1pbnV0ZSA8ZW0+TWludXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1pbnV0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TWludXRlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ib3VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ib3VyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhvdXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEhvdXIoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRUaW1lclNjaGVkdWxlVHlwZV9Ib3VyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldEhvdXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldEhvdXIgPGVtPkhvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhvdXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldEhvdXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEhvdXIoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRheSBPZiBNb250aDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF5IE9mIE1vbnRoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRheSBPZiBNb250aDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RGF5T2ZNb250aChTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFRpbWVyU2NoZWR1bGVUeXBlX0RheU9mTW9udGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0RGF5T2ZNb250aCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJTY2hlZHVsZVR5cGUjZ2V0RGF5T2ZNb250aCA8ZW0+RGF5IE9mIE1vbnRoPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXkgT2YgTW9udGg8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERheU9mTW9udGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERheU9mTW9udGgoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vbnRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Nb250aDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb250aDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TW9udGgoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRUaW1lclNjaGVkdWxlVHlwZV9Nb250aCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRNb250aCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJTY2hlZHVsZVR5cGUjZ2V0TW9udGggPGVtPk1vbnRoPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb250aDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TW9udGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1vbnRoKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXkgT2YgV2VlazwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF5IE9mIFdlZWs8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IE9mIFdlZWs8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERheU9mV2VlayhTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFRpbWVyU2NoZWR1bGVUeXBlX0RheU9mV2VlaygpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXREYXlPZldlZWsoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldERheU9mV2VlayA8ZW0+RGF5IE9mIFdlZWs8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRheSBPZiBXZWVrPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXREYXlPZldlZWsoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERheU9mV2VlayhTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WWVhcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WWVhcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5ZZWFyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRZZWFyKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0VGltZXJTY2hlZHVsZVR5cGVfWWVhcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRZZWFyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclNjaGVkdWxlVHlwZSNnZXRZZWFyIDxlbT5ZZWFyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5ZZWFyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRZZWFyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRZZWFyKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElkKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0VGltZXJTY2hlZHVsZVR5cGVfSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0SWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOworCit9IC8vIFRpbWVyU2NoZWR1bGVUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9UaW1lclR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1RpbWVyVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNGRkOGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9UaW1lclR5cGUuamF2YQpAQCAtMCwwICsxLDMyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaW1lciBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgVGhlIHRpbWVyVHlwZSBzcGVjaWZpZXMgYW4gZW50ZXJwcmlzZSBiZWFuIHRpbWVyLiAgRWFjaAorICogICAgICAgICB0aW1lciBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgdGhlIGNvbnRhaW5lciB1cG9uCisgKiAgICAgICAgIGRlcGxveW1lbnQuICBUaW1lciBjYWxsYmFja3Mgb2NjdXIgYmFzZWQgb24gdGhlIAorICogICAgICAgICBzY2hlZHVsZSBhdHRyaWJ1dGVzLiAgQWxsIGNhbGxiYWNrcyBhcmUgbWFkZSB0byB0aGUKKyAqICAgICAgICAgdGltZW91dC1tZXRob2QgYXNzb2NpYXRlZCB3aXRoIHRoZSB0aW1lci4gIAorICogICAgICAgICAKKyAqICAgICAgICAgQSB0aW1lciBjYW4gaGF2ZSBhbiBvcHRpb25hbCBzdGFydCBhbmQvb3IgZW5kIGRhdGUuIElmCisgKiAgICAgICAgIGEgc3RhcnQgZGF0ZSBpcyBzcGVjaWZpZWQsIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUKKyAqICAgICAgICAgYXNzb2NpYXRlZCB0aW1lciBzY2hlZHVsZSBzdWNoIHRoYXQgYW55IG1hdGNoaW5nCisgKiAgICAgICAgIGV4cGlyYXRpb25zIHByaW9yIHRvIHRoZSBzdGFydCB0aW1lIHdpbGwgbm90IG9jY3VyLgorICogICAgICAgICBMaWtld2lzZSwgbm8gbWF0Y2hpbmcgZXhwaXJhdGlvbnMgd2lsbCBvY2N1ciBhZnRlciBhbnkKKyAqICAgICAgICAgZW5kIGRhdGUuICAgU3RhcnQvRW5kIGRhdGVzIGFyZSBzcGVjaWZpZWQgdXNpbmcgdGhlCisgKiAgICAgICAgIFhNTCBTY2hlbWEgZGF0ZVRpbWUgdHlwZSwgd2hpY2ggZm9sbG93cyB0aGUgSVNPLTg2MDEKKyAqICAgICAgICAgc3RhbmRhcmQgZm9yIGRhdGUoYW5kIG9wdGlvbmFsIHRpbWUtd2l0aGluLXRoZS1kYXkpIAorICogICAgICAgICByZXByZXNlbnRhdGlvbi4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEFuIG9wdGlvbmFsIGZsYWcgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB3aGV0aGVyCisgKiAgICAgICAgIHRoaXMgdGltZXIgaGFzIHBlcnNpc3RlbnQodHJ1ZSkgZGVsaXZlcnkgc2VtYW50aWNzIG9yCisgKiAgICAgICAgIG5vbi1wZXJzaXN0ZW50KGZhbHNlKSBkZWxpdmVyeSBzZW1hbnRpY3MuICBJZiBub3Qgc3BlY2lmaWVkLAorICogICAgICAgICB0aGUgdmFsdWUgZGVmYXVsdHMgdG8gcGVyc2lzdGVudCh0cnVlKS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEEgdGltZSB6b25lIGNhbiBvcHRpb25hbGx5IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHRpbWVyLgorICogICAgICAgICBJZiBzcGVjaWZpZWQsIHRoZSB0aW1lcidzIHNjaGVkdWxlIGlzIGV2YWx1YXRlZCBpbiB0aGUgY29udGV4dAorICogICAgICAgICBvZiB0aGF0IHRpbWUgem9uZSwgcmVnYXJkbGVzcyBvZiB0aGUgZGVmYXVsdCB0aW1lIHpvbmUgaW4gd2hpY2gKKyAqICAgICAgICAgdGhlIGNvbnRhaW5lciBpcyBleGVjdXRpbmcuICAgVGltZSB6b25lcyBhcmUgc3BlY2lmaWVkIGFzIGFuCisgKiAgICAgICAgIElEIHN0cmluZy4gIFRoZSBzZXQgb2YgcmVxdWlyZWQgdGltZSB6b25lIElEcyBpcyBkZWZpbmVkIGJ5CisgKiAgICAgICAgIHRoZSBab25lIE5hbWUoVFopIGNvbHVtbiBvZiB0aGUgcHVibGljIGRvbWFpbiB6b25laW5mbyBkYXRhYmFzZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEFuIG9wdGlvbmFsIGluZm8gc3RyaW5nIGNhbiBiZSBhc3NpZ25lZCB0byB0aGUgdGltZXIgYW5kIAorICogICAgICAgICByZXRyaWV2ZWQgYXQgcnVudGltZSB0aHJvdWdoIHRoZSBUaW1lci5nZXRJbmZvKCkgbWV0aG9kLgorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIHRpbWVyVHlwZSBjYW4gb25seSBiZSBzcGVjaWZpZWQgb24gc3RhdGVsZXNzIHNlc3Npb24KKyAqICAgICAgICAgYmVhbnMsIHNpbmdsZXRvbiBzZXNzaW9uIGJlYW5zLCBhbmQgbWVzc2FnZS1kcml2ZW4gYmVhbnMuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBFSkIgMy4xCisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0U2NoZWR1bGUgPGVtPlNjaGVkdWxlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0RW5kIDxlbT5FbmQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSNnZXRUaW1lb3V0TWV0aG9kIDxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJUeXBlI2lzUGVyc2lzdGVudCA8ZW0+UGVyc2lzdGVudDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJUeXBlI2dldFRpbWV6b25lIDxlbT5UaW1lem9uZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJUeXBlI2dldEluZm8gPGVtPkluZm88L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0VGltZXJUeXBlKCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRpbWVyVHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0VGltZXJUeXBlX0Rlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVkdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2hlZHVsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlZHVsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0U2NoZWR1bGUoVGltZXJTY2hlZHVsZVR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFRpbWVyVHlwZV9TY2hlZHVsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVRpbWVyU2NoZWR1bGVUeXBlIGdldFNjaGVkdWxlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0U2NoZWR1bGUgPGVtPlNjaGVkdWxlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlZHVsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U2NoZWR1bGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNjaGVkdWxlKFRpbWVyU2NoZWR1bGVUeXBlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U3RhcnQoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFRpbWVyVHlwZV9TdGFydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldFN0YXJ0KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0U3RhcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFN0YXJ0KFhNTEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVuZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW5kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVuZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RW5kKFhNTEdyZWdvcmlhbkNhbGVuZGFyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRUaW1lclR5cGVfRW5kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0RW5kKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0RW5kIDxlbT5FbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVuZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RW5kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRFbmQoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZW91dCBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRUaW1lb3V0TWV0aG9kKE5hbWVkTWV0aG9kVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0VGltZXJUeXBlX1RpbWVvdXRNZXRob2QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlOYW1lZE1ldGhvZFR5cGUgZ2V0VGltZW91dE1ldGhvZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJUeXBlI2dldFRpbWVvdXRNZXRob2QgPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0VGltZW91dE1ldGhvZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VGltZW91dE1ldGhvZChOYW1lZE1ldGhvZFR5cGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW50PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldFBlcnNpc3RlbnQoKQorCSAqIEBzZWUgI3Vuc2V0UGVyc2lzdGVudCgpCisJICogQHNlZSAjc2V0UGVyc2lzdGVudChib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRUaW1lclR5cGVfUGVyc2lzdGVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNQZXJzaXN0ZW50KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjaXNQZXJzaXN0ZW50IDxlbT5QZXJzaXN0ZW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW50PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldFBlcnNpc3RlbnQoKQorCSAqIEBzZWUgI3Vuc2V0UGVyc2lzdGVudCgpCisJICogQHNlZSAjaXNQZXJzaXN0ZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQZXJzaXN0ZW50KGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjaXNQZXJzaXN0ZW50IDxlbT5QZXJzaXN0ZW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1NldFBlcnNpc3RlbnQoKQorCSAqIEBzZWUgI2lzUGVyc2lzdGVudCgpCisJICogQHNlZSAjc2V0UGVyc2lzdGVudChib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHVuc2V0UGVyc2lzdGVudCgpOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjaXNQZXJzaXN0ZW50IDxlbT5QZXJzaXN0ZW50PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW50PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogQHNlZSAjdW5zZXRQZXJzaXN0ZW50KCkKKwkgKiBAc2VlICNpc1BlcnNpc3RlbnQoKQorCSAqIEBzZWUgI3NldFBlcnNpc3RlbnQoYm9vbGVhbikKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NldFBlcnNpc3RlbnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRpbWV6b25lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UaW1lem9uZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lem9uZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VGltZXpvbmUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSNnZXRUaW1lclR5cGVfVGltZXpvbmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0VGltZXpvbmUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSNnZXRUaW1lem9uZSA8ZW0+VGltZXpvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRpbWV6b25lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRUaW1lem9uZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VGltZXpvbmUoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluZm88L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5mbzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SW5mbyhTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFRpbWVyVHlwZV9JbmZvKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldEluZm8oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSNnZXRJbmZvIDxlbT5JbmZvPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmZvPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJbmZvKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbmZvKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElkKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UjZ2V0VGltZXJUeXBlX0lkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gVGltZXJUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5qYXZhCmluZGV4IDJlMTI0MWMuLjAxZTQ1OGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjQsMjUgKzI0LDgxIEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIHRyYW5zLWF0dHJpYnV0ZVR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QKLSAqIAltYW5hZ2UgdGhlIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMgd2hlbiBkZWxlZ2F0aW5nIGEgbWV0aG9kCi0gKiAJaW52b2NhdGlvbiB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuCi0gKiAKLSAqIAlUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqIAotICogCSAgICBOb3RTdXBwb3J0ZWQKLSAqIAkgICAgU3VwcG9ydHMKLSAqIAkgICAgUmVxdWlyZWQKLSAqIAkgICAgUmVxdWlyZXNOZXcKLSAqIAkgICAgTWFuZGF0b3J5Ci0gKiAJICAgIE5ldmVyCi0gKiAKKyAqICAgICAgICAgVGhlIHRyYW5zLWF0dHJpYnV0ZVR5cGUgc3BlY2lmaWVzIGhvdyB0aGUgY29udGFpbmVyIG11c3QKKyAqICAgICAgICAgbWFuYWdlIHRoZSB0cmFuc2FjdGlvbiBib3VuZGFyaWVzIHdoZW4gZGVsZWdhdGluZyBhIG1ldGhvZCAKKyAqICAgICAgICAgaW52b2NhdGlvbiB0byBhbiBlbnRlcnByaXNlIGJlYW4ncyBidXNpbmVzcyBtZXRob2QuIAorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6IAorICogICAgICAgICAKKyAqICAgICAgICAgTm90U3VwcG9ydGVkIAorICogICAgICAgICBTdXBwb3J0cyAKKyAqICAgICAgICAgUmVxdWlyZWQgIAorICogICAgICAgICBSZXF1aXJlc05ldyAKKyAqICAgICAgICAgTWFuZGF0b3J5IAorICogICAgICAgICBOZXZlciAKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSgpCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgeworcHVibGljIGVudW0gVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk5vdCBTdXBwb3J0ZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9UX1NVUFBPUlRFRAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU5PVF9TVVBQT1JURURfTElURVJBTCgwLCAiTm90U3VwcG9ydGVkIiwgIk5vdFN1cHBvcnRlZCIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TdXBwb3J0czwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTVVBQT1JUUworCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVNVUFBPUlRTX0xJVEVSQUwoMSwgIlN1cHBvcnRzIiwgIlN1cHBvcnRzIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1JFUVVJUkVECisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJUkVRVUlSRURfTElURVJBTCgyLCAiUmVxdWlyZWQiLCAiUmVxdWlyZWQiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyoqCisJICogVGhlICc8ZW0+PGI+UmVxdWlyZXMgTmV3PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1JFUVVJUkVTX05FVworCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVJFUVVJUkVTX05FV19MSVRFUkFMKDMsICJSZXF1aXJlc05ldyIsICJSZXF1aXJlc05ldyIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5NYW5kYXRvcnk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTUFOREFUT1JZCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTUFOREFUT1JZX0xJVEVSQUwoNCwgIk1hbmRhdG9yeSIsICJNYW5kYXRvcnkiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyoqCisJICogVGhlICc8ZW0+PGI+TmV2ZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTkVWRVIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlORVZFUl9MSVRFUkFMKDUsICJOZXZlciIsICJOZXZlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5Ob3QgU3VwcG9ydGVkPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0xMjgsNjYgKzE4NCw2IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkVWRVIgPSA1OwogCiAJLyoqCi0JICogVGhlICc8ZW0+PGI+Tm90IFN1cHBvcnRlZDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT1RfU1VQUE9SVEVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgTk9UX1NVUFBPUlRFRF9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShOT1RfU1VQUE9SVEVELCAiTm90U3VwcG9ydGVkIiwgIk5vdFN1cHBvcnRlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN1cHBvcnRzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NVUFBPUlRTCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgU1VQUE9SVFNfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoU1VQUE9SVFMsICJTdXBwb3J0cyIsICJTdXBwb3J0cyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUVVJUkVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgUkVRVUlSRURfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoUkVRVUlSRUQsICJSZXF1aXJlZCIsICJSZXF1aXJlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJlcXVpcmVzIE5ldzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRVFVSVJFU19ORVcKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBSRVFVSVJFU19ORVdfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoUkVRVUlSRVNfTkVXLCAiUmVxdWlyZXNOZXciLCAiUmVxdWlyZXNOZXciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5NYW5kYXRvcnk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTUFOREFUT1JZCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgTUFOREFUT1JZX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKE1BTkRBVE9SWSwgIk1hbmRhdG9yeSIsICJNYW5kYXRvcnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OZXZlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNORVZFUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIE5FVkVSX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKE5FVkVSLCAiTmV2ZXIiLCAiTmV2ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0yMDksNyArMjA1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgpAQCAtMjU4LDE3ICsyNTQsNzcgQEAKIAkJCWNhc2UgTUFOREFUT1JZOiByZXR1cm4gTUFOREFUT1JZX0xJVEVSQUw7CiAJCQljYXNlIE5FVkVSOiByZXR1cm4gTkVWRVJfTElURVJBTDsKIAkJfQotCQlyZXR1cm4gbnVsbDsJCisJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKIAkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHJpdmF0ZSBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CiAJfQogCi19IC8vVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL1RyYW5zYWN0aW9uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvVHJhbnNhY3Rpb25UeXBlLmphdmEKaW5kZXggNWE5N2IxZS4uZjUyZTc2OSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvVHJhbnNhY3Rpb25UeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvVHJhbnNhY3Rpb25UeXBlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yNCwyMCArMjQsNDAgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgdHJhbnNhY3Rpb24tdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzCi0gKiAJdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlLgotICogCi0gKiAJVGhlIHRyYW5zYWN0aW9uLXR5cGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmc6Ci0gKiAKLSAqIAkgICAgQmVhbgotICogCSAgICBDb250YWluZXIKLSAqIAorICogICAgICAgICBUaGUgdHJhbnNhY3Rpb24tdHlwZVR5cGUgc3BlY2lmaWVzIGFuIGVudGVycHJpc2UgYmVhbidzCisgKiAgICAgICAgIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgdHlwZS4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSB0cmFuc2FjdGlvbi10eXBlIG11c3QgYmUgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nOgorICogICAgICAgICAKKyAqICAgICAgICAgQmVhbgorICogICAgICAgICBDb250YWluZXIKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEVKQiAzLjAKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlI2dldFRyYW5zYWN0aW9uVHlwZSgpCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc2FjdGlvblR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgeworcHVibGljIGVudW0gVHJhbnNhY3Rpb25UeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkJlYW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQkVBTgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUJFQU5fTElURVJBTCgwLCAiQmVhbiIsICJCZWFuIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDT05UQUlORVIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDT05UQUlORVJfTElURVJBTCgxLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5CZWFuPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC02NywyNiArODcsNiBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRBSU5FUiA9IDE7CiAKIAkvKioKLQkgKiBUaGUgJzxlbT48Yj5CZWFuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0JFQU4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uVHlwZSBCRUFOX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25UeXBlKEJFQU4sICJCZWFuIiwgIkJlYW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09OVEFJTkVSCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGUgQ09OVEFJTkVSX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25UeXBlKENPTlRBSU5FUiwgIkNvbnRhaW5lciIsICJDb250YWluZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTEwNCw3ICsxMDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxUcmFuc2FjdGlvblR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KQEAgLTE0OSwxNyArMTQ5LDc3IEBACiAJCQljYXNlIEJFQU46IHJldHVybiBCRUFOX0xJVEVSQUw7CiAJCQljYXNlIENPTlRBSU5FUjogcmV0dXJuIENPTlRBSU5FUl9MSVRFUkFMOwogCQl9Ci0JCXJldHVybiBudWxsOwkKKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgogCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwcml2YXRlIFRyYW5zYWN0aW9uVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKIAl9CiAKLX0gLy9UcmFuc2FjdGlvblR5cGUKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9BY2Nlc3NUaW1lb3V0VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQWNjZXNzVGltZW91dFR5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0YWZkMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQWNjZXNzVGltZW91dFR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwzMTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjY2Vzc1RpbWVvdXRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVVbml0VHlwZVR5cGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWNjZXNzIFRpbWVvdXQgVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY2Nlc3NUaW1lb3V0VHlwZUltcGwjZ2V0VGltZW91dCA8ZW0+VGltZW91dDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY2Nlc3NUaW1lb3V0VHlwZUltcGwjZ2V0VW5pdCA8ZW0+VW5pdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY2Nlc3NUaW1lb3V0VHlwZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQWNjZXNzVGltZW91dFR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBBY2Nlc3NUaW1lb3V0VHlwZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVvdXQoKSA8ZW0+VGltZW91dDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGltZW91dCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRJTUVPVVRfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZW91dCgpIDxlbT5UaW1lb3V0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUaW1lb3V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0aW1lb3V0ID0gVElNRU9VVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbml0KCkgPGVtPlVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVGltZVVuaXRUeXBlVHlwZSBVTklUX0VERUZBVUxUID0gVGltZVVuaXRUeXBlVHlwZS5EQVlTOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pdCgpIDxlbT5Vbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGltZVVuaXRUeXBlVHlwZSB1bml0ID0gVU5JVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVW5pdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdW5pdEVTZXQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBY2Nlc3NUaW1lb3V0VHlwZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkFDQ0VTU19USU1FT1VUX1RZUEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJpZ0ludGVnZXIgZ2V0VGltZW91dCgpIHsKKwkJcmV0dXJuIHRpbWVvdXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VGltZW91dChCaWdJbnRlZ2VyIG5ld1RpbWVvdXQpIHsKKwkJQmlnSW50ZWdlciBvbGRUaW1lb3V0ID0gdGltZW91dDsKKwkJdGltZW91dCA9IG5ld1RpbWVvdXQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQUNDRVNTX1RJTUVPVVRfVFlQRV9fVElNRU9VVCwgb2xkVGltZW91dCwgdGltZW91dCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUaW1lVW5pdFR5cGVUeXBlIGdldFVuaXQoKSB7CisJCXJldHVybiB1bml0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVuaXQoVGltZVVuaXRUeXBlVHlwZSBuZXdVbml0KSB7CisJCVRpbWVVbml0VHlwZVR5cGUgb2xkVW5pdCA9IHVuaXQ7CisJCXVuaXQgPSBuZXdVbml0ID09IG51bGwgPyBVTklUX0VERUZBVUxUIDogbmV3VW5pdDsKKwkJYm9vbGVhbiBvbGRVbml0RVNldCA9IHVuaXRFU2V0OworCQl1bml0RVNldCA9IHRydWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQUNDRVNTX1RJTUVPVVRfVFlQRV9fVU5JVCwgb2xkVW5pdCwgdW5pdCwgIW9sZFVuaXRFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdW5zZXRVbml0KCkgeworCQlUaW1lVW5pdFR5cGVUeXBlIG9sZFVuaXQgPSB1bml0OworCQlib29sZWFuIG9sZFVuaXRFU2V0ID0gdW5pdEVTZXQ7CisJCXVuaXQgPSBVTklUX0VERUZBVUxUOworCQl1bml0RVNldCA9IGZhbHNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuQUNDRVNTX1RJTUVPVVRfVFlQRV9fVU5JVCwgb2xkVW5pdCwgVU5JVF9FREVGQVVMVCwgb2xkVW5pdEVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldFVuaXQoKSB7CisJCXJldHVybiB1bml0RVNldDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7CisJCVN0cmluZyBvbGRJZCA9IGlkOworCQlpZCA9IG5ld0lkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFDQ0VTU19USU1FT1VUX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuQUNDRVNTX1RJTUVPVVRfVFlQRV9fVElNRU9VVDoKKwkJCQlyZXR1cm4gZ2V0VGltZW91dCgpOworCQkJY2FzZSBFamJQYWNrYWdlLkFDQ0VTU19USU1FT1VUX1RZUEVfX1VOSVQ6CisJCQkJcmV0dXJuIGdldFVuaXQoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5BQ0NFU1NfVElNRU9VVF9UWVBFX19JRDoKKwkJCQlyZXR1cm4gZ2V0SWQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFamJQYWNrYWdlLkFDQ0VTU19USU1FT1VUX1RZUEVfX1RJTUVPVVQ6CisJCQkJc2V0VGltZW91dCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLkFDQ0VTU19USU1FT1VUX1RZUEVfX1VOSVQ6CisJCQkJc2V0VW5pdCgoVGltZVVuaXRUeXBlVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLkFDQ0VTU19USU1FT1VUX1RZUEVfX0lEOgorCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuQUNDRVNTX1RJTUVPVVRfVFlQRV9fVElNRU9VVDoKKwkJCQlzZXRUaW1lb3V0KFRJTUVPVVRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5BQ0NFU1NfVElNRU9VVF9UWVBFX19VTklUOgorCQkJCXVuc2V0VW5pdCgpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5BQ0NFU1NfVElNRU9VVF9UWVBFX19JRDoKKwkJCQlzZXRJZChJRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuQUNDRVNTX1RJTUVPVVRfVFlQRV9fVElNRU9VVDoKKwkJCQlyZXR1cm4gVElNRU9VVF9FREVGQVVMVCA9PSBudWxsID8gdGltZW91dCAhPSBudWxsIDogIVRJTUVPVVRfRURFRkFVTFQuZXF1YWxzKHRpbWVvdXQpOworCQkJY2FzZSBFamJQYWNrYWdlLkFDQ0VTU19USU1FT1VUX1RZUEVfX1VOSVQ6CisJCQkJcmV0dXJuIGlzU2V0VW5pdCgpOworCQkJY2FzZSBFamJQYWNrYWdlLkFDQ0VTU19USU1FT1VUX1RZUEVfX0lEOgorCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodGltZW91dDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCh0aW1lb3V0KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB1bml0OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodW5pdEVTZXQpIHJlc3VsdC5hcHBlbmQodW5pdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9BY2Nlc3NUaW1lb3V0VHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ0ltcGwuamF2YQppbmRleCA5ZDBmZDEyLi44YWFhNTQ4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnSW1wbC5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpIDxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTY4LDcgKzY4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk+IGFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMDQsNiArMTA0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkFDVElWQVRJT05fQ09ORklHOwogCX0KQEAgLTExMyw5ICsxMTQsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMTI1LDkgKzEyNiw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCkgeworCXB1YmxpYyBMaXN0PEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eT4gZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKSB7CiAJCWlmIChhY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlhY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRJRVMpOworCQkJYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5PihBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRJRVMpOwogCQl9CiAJCXJldHVybiBhY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllczsKIAl9CkBAIC0xNTgsMTIgKzE1OSwxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC0xNzMsNiArMTc1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlM6CkBAIC0xOTAsMTUgKzE5MywxNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRJRVM6CiAJCQkJZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5PiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19JRDoKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTIxMiw2ICsyMTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlM6CkBAIC0yMzIsNiArMjM4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fREVTQ1JJUFRJT05TOgpAQCAtMjQ5LDYgKzI1Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwuamF2YQppbmRleCBhZmUxMTdlLi4wZmMwMjcwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwuamF2YQpAQCAtMTExLDYgKzExMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWTsKIAl9CkBAIC0xODMsNiArMTg0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9OQU1FOgpAQCAtMjAwLDYgKzIwMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfX0FDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX05BTUU6CkBAIC0yMjAsNiArMjIzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFlfTkFNRToKQEAgLTI0MCw2ICsyNDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9OQU1FOgpAQCAtMjU3LDYgKzI2Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25FeGNlcHRpb25JbXBsLmphdmEKaW5kZXggYzU1NzY5My4uMDNkYTE5NyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRXhjZXB0aW9uSW1wbC5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiAgKiA8dWw+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwjZ2V0RXhjZXB0aW9uQ2xhc3MgPGVtPkV4Y2VwdGlvbiBDbGFzczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkV4Y2VwdGlvbkltcGwjaXNSb2xsYmFjayA8ZW0+Um9sbGJhY2s8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXBwbGljYXRpb25FeGNlcHRpb25JbXBsI2lzSW5oZXJpdGVkIDxlbT5Jbmhlcml0ZWQ8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXBwbGljYXRpb25FeGNlcHRpb25JbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICogPC9wPgpAQCAtODQsNyArODUsMzYgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByb2xsYmFja0VTZXQgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiByb2xsYmFja0VTZXQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbmhlcml0ZWQoKSA8ZW0+SW5oZXJpdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0luaGVyaXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOSEVSSVRFRF9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbmhlcml0ZWQoKSA8ZW0+SW5oZXJpdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0luaGVyaXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaW5oZXJpdGVkID0gSU5IRVJJVEVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJbmhlcml0ZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGluaGVyaXRlZEVTZXQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTEyMCw2ICsxNTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQVRJT05fRVhDRVBUSU9OOwogCX0KQEAgLTE5Niw2ICsyMjcsNTIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoKSB7CisJCXJldHVybiBpbmhlcml0ZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SW5oZXJpdGVkKGJvb2xlYW4gbmV3SW5oZXJpdGVkKSB7CisJCWJvb2xlYW4gb2xkSW5oZXJpdGVkID0gaW5oZXJpdGVkOworCQlpbmhlcml0ZWQgPSBuZXdJbmhlcml0ZWQ7CisJCWJvb2xlYW4gb2xkSW5oZXJpdGVkRVNldCA9IGluaGVyaXRlZEVTZXQ7CisJCWluaGVyaXRlZEVTZXQgPSB0cnVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fSU5IRVJJVEVELCBvbGRJbmhlcml0ZWQsIGluaGVyaXRlZCwgIW9sZEluaGVyaXRlZEVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldEluaGVyaXRlZCgpIHsKKwkJYm9vbGVhbiBvbGRJbmhlcml0ZWQgPSBpbmhlcml0ZWQ7CisJCWJvb2xlYW4gb2xkSW5oZXJpdGVkRVNldCA9IGluaGVyaXRlZEVTZXQ7CisJCWluaGVyaXRlZCA9IElOSEVSSVRFRF9FREVGQVVMVDsKKwkJaW5oZXJpdGVkRVNldCA9IGZhbHNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19JTkhFUklURUQsIG9sZEluaGVyaXRlZCwgSU5IRVJJVEVEX0VERUZBVUxULCBvbGRJbmhlcml0ZWRFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZXRJbmhlcml0ZWQoKSB7CisJCXJldHVybiBpbmhlcml0ZWRFU2V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CiAJCXJldHVybiBpZDsKIAl9CkBAIC0yMTcsMTIgKzI5NCwxNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19FWENFUFRJT05fQ0xBU1M6CiAJCQkJcmV0dXJuIGdldEV4Y2VwdGlvbkNsYXNzKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19ST0xMQkFDSzoKLQkJCQlyZXR1cm4gaXNSb2xsYmFjaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKwkJCQlyZXR1cm4gaXNSb2xsYmFjaygpOworCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fSU5IRVJJVEVEOgorCQkJCXJldHVybiBpc0luaGVyaXRlZCgpOwogCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fSUQ6CiAJCQkJcmV0dXJuIGdldElkKCk7CiAJCX0KQEAgLTIzNCwxMyArMzE0LDE3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19FWENFUFRJT05fQ0xBU1M6CiAJCQkJc2V0RXhjZXB0aW9uQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fUk9MTEJBQ0s6Ci0JCQkJc2V0Um9sbGJhY2soKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7CisJCQkJc2V0Um9sbGJhY2soKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX0lOSEVSSVRFRDoKKwkJCQlzZXRJbmhlcml0ZWQoKEJvb2xlYW4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX0lEOgogCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtMjU0LDYgKzMzOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19FWENFUFRJT05fQ0xBU1M6CkBAIC0yNjIsNiArMzQ3LDkgQEAKIAkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX1JPTExCQUNLOgogCQkJCXVuc2V0Um9sbGJhY2soKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19JTkhFUklURUQ6CisJCQkJdW5zZXRJbmhlcml0ZWQoKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuQVBQTElDQVRJT05fRVhDRVBUSU9OX19JRDoKIAkJCQlzZXRJZChJRF9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwpAQCAtMjc0LDEyICszNjIsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX0VYQ0VQVElPTl9DTEFTUzoKIAkJCQlyZXR1cm4gRVhDRVBUSU9OX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBleGNlcHRpb25DbGFzcyAhPSBudWxsIDogIUVYQ0VQVElPTl9DTEFTU19FREVGQVVMVC5lcXVhbHMoZXhjZXB0aW9uQ2xhc3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fUk9MTEJBQ0s6CiAJCQkJcmV0dXJuIGlzU2V0Um9sbGJhY2soKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX0lOSEVSSVRFRDoKKwkJCQlyZXR1cm4gaXNTZXRJbmhlcml0ZWQoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5BUFBMSUNBVElPTl9FWENFUFRJT05fX0lEOgogCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwogCQl9CkBAIC0yOTEsNiArMzgyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCkBAIC0yOTksNiArMzkxLDggQEAKIAkJcmVzdWx0LmFwcGVuZChleGNlcHRpb25DbGFzcyk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgcm9sbGJhY2s6ICIpOyAvLyROT04tTkxTLTEkCiAJCWlmIChyb2xsYmFja0VTZXQpIHJlc3VsdC5hcHBlbmQocm9sbGJhY2spOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIGluaGVyaXRlZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGluaGVyaXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQoaW5oZXJpdGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQXJvdW5kSW52b2tlVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQXJvdW5kSW52b2tlVHlwZUltcGwuamF2YQppbmRleCBkZjFjZTc1Li5iNzZkMzdmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fyb3VuZEludm9rZVR5cGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Bcm91bmRJbnZva2VUeXBlSW1wbC5qYXZhCkBAIC05MCw2ICs5MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5BUk9VTkRfSU5WT0tFX1RZUEU7CiAJfQpAQCAtMTQxLDYgKzE0Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BUk9VTkRfSU5WT0tFX1RZUEVfX0NMQVNTOgpAQCAtMTU2LDYgKzE1OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX0lOVk9LRV9UWVBFX19DTEFTUzoKQEAgLTE3Myw2ICsxNzYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9JTlZPS0VfVFlQRV9fQ0xBU1M6CkBAIC0xOTAsNiArMTk0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BUk9VTkRfSU5WT0tFX1RZUEVfX0NMQVNTOgpAQCAtMjA1LDYgKzIxMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Bcm91bmRUaW1lb3V0VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQXJvdW5kVGltZW91dFR5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwOTU4YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQXJvdW5kVGltZW91dFR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwyMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRUaW1lb3V0VHlwZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bcm91bmQgVGltZW91dCBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFyb3VuZFRpbWVvdXRUeXBlSW1wbCNnZXRDbGFzc18gPGVtPkNsYXNzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFyb3VuZFRpbWVvdXRUeXBlSW1wbCNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEFyb3VuZFRpbWVvdXRUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXJvdW5kVGltZW91dFR5cGUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc18oKSA8ZW0+Q2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENsYXNzXygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NfKCkgPGVtPkNsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDbGFzc18oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgY2xhc3NfID0gQ0xBU1NfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kTmFtZSgpIDxlbT5NZXRob2QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWV0aG9kTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX05BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kTmFtZSgpIDxlbT5NZXRob2QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWV0aG9kTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBtZXRob2ROYW1lID0gTUVUSE9EX05BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQXJvdW5kVGltZW91dFR5cGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5BUk9VTkRfVElNRU9VVF9UWVBFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NfKCkgeworCQlyZXR1cm4gY2xhc3NfOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENsYXNzKFN0cmluZyBuZXdDbGFzcykgeworCQlTdHJpbmcgb2xkQ2xhc3MgPSBjbGFzc187CisJCWNsYXNzXyA9IG5ld0NsYXNzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFST1VORF9USU1FT1VUX1RZUEVfX0NMQVNTLCBvbGRDbGFzcywgY2xhc3NfKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgeworCQlyZXR1cm4gbWV0aG9kTmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNZXRob2ROYW1lKFN0cmluZyBuZXdNZXRob2ROYW1lKSB7CisJCVN0cmluZyBvbGRNZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKKwkJbWV0aG9kTmFtZSA9IG5ld01ldGhvZE5hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQVJPVU5EX1RJTUVPVVRfVFlQRV9fTUVUSE9EX05BTUUsIG9sZE1ldGhvZE5hbWUsIG1ldGhvZE5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX1RJTUVPVVRfVFlQRV9fQ0xBU1M6CisJCQkJcmV0dXJuIGdldENsYXNzXygpOworCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9USU1FT1VUX1RZUEVfX01FVEhPRF9OQU1FOgorCQkJCXJldHVybiBnZXRNZXRob2ROYW1lKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWpiUGFja2FnZS5BUk9VTkRfVElNRU9VVF9UWVBFX19DTEFTUzoKKwkJCQlzZXRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX1RJTUVPVVRfVFlQRV9fTUVUSE9EX05BTUU6CisJCQkJc2V0TWV0aG9kTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9USU1FT1VUX1RZUEVfX0NMQVNTOgorCQkJCXNldENsYXNzKENMQVNTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX1RJTUVPVVRfVFlQRV9fTUVUSE9EX05BTUU6CisJCQkJc2V0TWV0aG9kTmFtZShNRVRIT0RfTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX1RJTUVPVVRfVFlQRV9fQ0xBU1M6CisJCQkJcmV0dXJuIENMQVNTX0VERUZBVUxUID09IG51bGwgPyBjbGFzc18gIT0gbnVsbCA6ICFDTEFTU19FREVGQVVMVC5lcXVhbHMoY2xhc3NfKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5BUk9VTkRfVElNRU9VVF9UWVBFX19NRVRIT0RfTkFNRToKKwkJCQlyZXR1cm4gTUVUSE9EX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1ldGhvZE5hbWUgIT0gbnVsbCA6ICFNRVRIT0RfTkFNRV9FREVGQVVMVC5lcXVhbHMobWV0aG9kTmFtZSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChjbGFzczogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChjbGFzc18pOworCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGhvZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobWV0aG9kTmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0Fyb3VuZFRpbWVvdXRUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Bc3NlbWJseURlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fzc2VtYmx5RGVzY3JpcHRvckltcGwuamF2YQppbmRleCBiOTA3YTYxLi45MDM3ODI4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fzc2VtYmx5RGVzY3JpcHRvckltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fzc2VtYmx5RGVzY3JpcHRvckltcGwuamF2YQpAQCAtNjgsNyArNjgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZWN1cml0eVJvbGVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8U2VjdXJpdHlSb2xlPiBzZWN1cml0eVJvbGVzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGVybWlzc2lvbnMoKSA8ZW0+TWV0aG9kIFBlcm1pc3Npb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTc4LDcgKzc4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kUGVybWlzc2lvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxNZXRob2RQZXJtaXNzaW9uPiBtZXRob2RQZXJtaXNzaW9uczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRhaW5lclRyYW5zYWN0aW9ucygpIDxlbT5Db250YWluZXIgVHJhbnNhY3Rpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTg4LDcgKzg4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgY29udGFpbmVyVHJhbnNhY3Rpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlPiBjb250YWluZXJUcmFuc2FjdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcmNlcHRvckJpbmRpbmdzKCkgPGVtPkludGVyY2VwdG9yIEJpbmRpbmdzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTk4LDcgKzk4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW50ZXJjZXB0b3JCaW5kaW5ncyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEludGVyY2VwdG9yQmluZGluZ1R5cGU+IGludGVyY2VwdG9yQmluZGluZ3M7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEwOCw3ICsxMDgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXNzYWdlRGVzdGluYXRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uPiBtZXNzYWdlRGVzdGluYXRpb25zOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjbHVkZUxpc3QoKSA8ZW0+RXhjbHVkZSBMaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC0xMTgsNyArMTE4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRXhjbHVkZUxpc3QgZXhjbHVkZUxpc3QgPSBudWxsOworCXByb3RlY3RlZCBFeGNsdWRlTGlzdCBleGNsdWRlTGlzdDsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpIDxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEyOCw3ICsxMjgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBhcHBsaWNhdGlvbkV4Y2VwdGlvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxBcHBsaWNhdGlvbkV4Y2VwdGlvbj4gYXBwbGljYXRpb25FeGNlcHRpb25zOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNjQsNiArMTY0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkFTU0VNQkxZX0RFU0NSSVBUT1I7CiAJfQpAQCAtMTczLDkgKzE3NCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlY3VyaXR5Um9sZXMoKSB7CisJcHVibGljIExpc3Q8U2VjdXJpdHlSb2xlPiBnZXRTZWN1cml0eVJvbGVzKCkgewogCQlpZiAoc2VjdXJpdHlSb2xlcyA9PSBudWxsKSB7Ci0JCQlzZWN1cml0eVJvbGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlY3VyaXR5Um9sZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUyk7CisJCQlzZWN1cml0eVJvbGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFNlY3VyaXR5Um9sZT4oU2VjdXJpdHlSb2xlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTKTsKIAkJfQogCQlyZXR1cm4gc2VjdXJpdHlSb2xlczsKIAl9CkBAIC0xODUsOSArMTg2LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kUGVybWlzc2lvbnMoKSB7CisJcHVibGljIExpc3Q8TWV0aG9kUGVybWlzc2lvbj4gZ2V0TWV0aG9kUGVybWlzc2lvbnMoKSB7CiAJCWlmIChtZXRob2RQZXJtaXNzaW9ucyA9PSBudWxsKSB7Ci0JCQltZXRob2RQZXJtaXNzaW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUyk7CisJCQltZXRob2RQZXJtaXNzaW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxNZXRob2RQZXJtaXNzaW9uPihNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUyk7CiAJCX0KIAkJcmV0dXJuIG1ldGhvZFBlcm1pc3Npb25zOwogCX0KQEAgLTE5Nyw5ICsxOTgsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb250YWluZXJUcmFuc2FjdGlvbnMoKSB7CisJcHVibGljIExpc3Q8Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlPiBnZXRDb250YWluZXJUcmFuc2FjdGlvbnMoKSB7CiAJCWlmIChjb250YWluZXJUcmFuc2FjdGlvbnMgPT0gbnVsbCkgewotCQkJY29udGFpbmVyVHJhbnNhY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19DT05UQUlORVJfVFJBTlNBQ1RJT05TKTsKKwkJCWNvbnRhaW5lclRyYW5zYWN0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxDb250YWluZXJUcmFuc2FjdGlvblR5cGU+KENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19DT05UQUlORVJfVFJBTlNBQ1RJT05TKTsKIAkJfQogCQlyZXR1cm4gY29udGFpbmVyVHJhbnNhY3Rpb25zOwogCX0KQEAgLTIwOSw5ICsyMTAsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcmNlcHRvckJpbmRpbmdzKCkgeworCXB1YmxpYyBMaXN0PEludGVyY2VwdG9yQmluZGluZ1R5cGU+IGdldEludGVyY2VwdG9yQmluZGluZ3MoKSB7CiAJCWlmIChpbnRlcmNlcHRvckJpbmRpbmdzID09IG51bGwpIHsKLQkJCWludGVyY2VwdG9yQmluZGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19JTlRFUkNFUFRPUl9CSU5ESU5HUyk7CisJCQlpbnRlcmNlcHRvckJpbmRpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEludGVyY2VwdG9yQmluZGluZ1R5cGU+KEludGVyY2VwdG9yQmluZGluZ1R5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fSU5URVJDRVBUT1JfQklORElOR1MpOwogCQl9CiAJCXJldHVybiBpbnRlcmNlcHRvckJpbmRpbmdzOwogCX0KQEAgLTIyMSw5ICsyMjIsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgeworCXB1YmxpYyBMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvbj4gZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIHsKIAkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvbnMgPT0gbnVsbCkgewotCQkJbWVzc2FnZURlc3RpbmF0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVTU0FHRV9ERVNUSU5BVElPTlMpOworCQkJbWVzc2FnZURlc3RpbmF0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxNZXNzYWdlRGVzdGluYXRpb24+KE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIG1lc3NhZ2VEZXN0aW5hdGlvbnM7CiAJfQpAQCAtMjc2LDkgKzI3Nyw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxBcHBsaWNhdGlvbkV4Y2VwdGlvbj4gZ2V0QXBwbGljYXRpb25FeGNlcHRpb25zKCkgewogCQlpZiAoYXBwbGljYXRpb25FeGNlcHRpb25zID09IG51bGwpIHsKLQkJCWFwcGxpY2F0aW9uRXhjZXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19BUFBMSUNBVElPTl9FWENFUFRJT05TKTsKKwkJCWFwcGxpY2F0aW9uRXhjZXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxBcHBsaWNhdGlvbkV4Y2VwdGlvbj4oQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fRVhDRVBUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIGFwcGxpY2F0aW9uRXhjZXB0aW9uczsKIAl9CkBAIC0zMDksMjIgKzMxMCwyMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN1cml0eVJvbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlY3VyaXR5Um9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1ldGhvZFBlcm1pc3Npb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1ldGhvZFBlcm1pc3Npb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19DT05UQUlORVJfVFJBTlNBQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnRhaW5lclRyYW5zYWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fSU5URVJDRVBUT1JfQklORElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbnRlcmNlcHRvckJpbmRpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEludGVyY2VwdG9yQmluZGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FWENMVURFX0xJU1Q6CiAJCQkJcmV0dXJuIGJhc2ljU2V0RXhjbHVkZUxpc3QobnVsbCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fQVBQTElDQVRJT05fRVhDRVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC0zMzQsNiArMzM2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTOgpAQCAtMzYxLDM0ICszNjQsMzYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUzoKIAkJCQlnZXRTZWN1cml0eVJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZWN1cml0eVJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRTZWN1cml0eVJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWN1cml0eVJvbGU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgogCQkJCWdldE1ldGhvZFBlcm1pc3Npb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RQZXJtaXNzaW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0TWV0aG9kUGVybWlzc2lvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBlcm1pc3Npb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fQ09OVEFJTkVSX1RSQU5TQUNUSU9OUzoKIAkJCQlnZXRDb250YWluZXJUcmFuc2FjdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldENvbnRhaW5lclRyYW5zYWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb250YWluZXJUcmFuc2FjdGlvblR5cGU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fSU5URVJDRVBUT1JfQklORElOR1M6CiAJCQkJZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SW50ZXJjZXB0b3JCaW5kaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKIAkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXNzYWdlRGVzdGluYXRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fRVhDTFVERV9MSVNUOgogCQkJCXNldEV4Y2x1ZGVMaXN0KChFeGNsdWRlTGlzdCluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0VYQ0VQVElPTlM6CiAJCQkJZ2V0QXBwbGljYXRpb25FeGNlcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEFwcGxpY2F0aW9uRXhjZXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQXBwbGljYXRpb25FeGNlcHRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC00MDIsNiArNDA3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19TRUNVUklUWV9ST0xFUzoKQEAgLTQzNyw2ICs0NDMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTOgpAQCAtNDY0LDYgKzQ3MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Bc3luY01ldGhvZFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0FzeW5jTWV0aG9kVHlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzg3MWRjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Bc3luY01ldGhvZFR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwzMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzeW5jTWV0aG9kVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RQYXJhbXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXN5bmMgTWV0aG9kIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXN5bmNNZXRob2RUeXBlSW1wbCNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3luY01ldGhvZFR5cGVJbXBsI2dldE1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3luY01ldGhvZFR5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEFzeW5jTWV0aG9kVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFzeW5jTWV0aG9kVHlwZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZE5hbWUoKSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZE5hbWUoKSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbWV0aG9kTmFtZSA9IE1FVEhPRF9OQU1FX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGFyYW1zKCkgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1ldGhvZFBhcmFtcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIE1ldGhvZFBhcmFtcyBtZXRob2RQYXJhbXM7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBc3luY01ldGhvZFR5cGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5BU1lOQ19NRVRIT0RfVFlQRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7CisJCXJldHVybiBtZXRob2ROYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIG5ld01ldGhvZE5hbWUpIHsKKwkJU3RyaW5nIG9sZE1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOworCQltZXRob2ROYW1lID0gbmV3TWV0aG9kTmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BU1lOQ19NRVRIT0RfVFlQRV9fTUVUSE9EX05BTUUsIG9sZE1ldGhvZE5hbWUsIG1ldGhvZE5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWV0aG9kUGFyYW1zIGdldE1ldGhvZFBhcmFtcygpIHsKKwkJcmV0dXJuIG1ldGhvZFBhcmFtczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXRob2RQYXJhbXMoTWV0aG9kUGFyYW1zIG5ld01ldGhvZFBhcmFtcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlNZXRob2RQYXJhbXMgb2xkTWV0aG9kUGFyYW1zID0gbWV0aG9kUGFyYW1zOworCQltZXRob2RQYXJhbXMgPSBuZXdNZXRob2RQYXJhbXM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQVNZTkNfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVMsIG9sZE1ldGhvZFBhcmFtcywgbmV3TWV0aG9kUGFyYW1zKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNZXRob2RQYXJhbXMoTWV0aG9kUGFyYW1zIG5ld01ldGhvZFBhcmFtcykgeworCQlpZiAobmV3TWV0aG9kUGFyYW1zICE9IG1ldGhvZFBhcmFtcykgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAobWV0aG9kUGFyYW1zICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW1ldGhvZFBhcmFtcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuQVNZTkNfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVMsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld01ldGhvZFBhcmFtcyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNZXRob2RQYXJhbXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkFTWU5DX01FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldE1ldGhvZFBhcmFtcyhuZXdNZXRob2RQYXJhbXMsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5BU1lOQ19NRVRIT0RfVFlQRV9fTUVUSE9EX1BBUkFNUywgbmV3TWV0aG9kUGFyYW1zLCBuZXdNZXRob2RQYXJhbXMpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7CisJCVN0cmluZyBvbGRJZCA9IGlkOworCQlpZCA9IG5ld0lkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkFTWU5DX01FVEhPRF9UWVBFX19JRCwgb2xkSWQsIGlkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFamJQYWNrYWdlLkFTWU5DX01FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TOgorCQkJCXJldHVybiBiYXNpY1NldE1ldGhvZFBhcmFtcyhudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFamJQYWNrYWdlLkFTWU5DX01FVEhPRF9UWVBFX19NRVRIT0RfTkFNRToKKwkJCQlyZXR1cm4gZ2V0TWV0aG9kTmFtZSgpOworCQkJY2FzZSBFamJQYWNrYWdlLkFTWU5DX01FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TOgorCQkJCXJldHVybiBnZXRNZXRob2RQYXJhbXMoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5BU1lOQ19NRVRIT0RfVFlQRV9fSUQ6CisJCQkJcmV0dXJuIGdldElkKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWpiUGFja2FnZS5BU1lOQ19NRVRIT0RfVFlQRV9fTUVUSE9EX05BTUU6CisJCQkJc2V0TWV0aG9kTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuQVNZTkNfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVM6CisJCQkJc2V0TWV0aG9kUGFyYW1zKChNZXRob2RQYXJhbXMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5BU1lOQ19NRVRIT0RfVFlQRV9fSUQ6CisJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWpiUGFja2FnZS5BU1lOQ19NRVRIT0RfVFlQRV9fTUVUSE9EX05BTUU6CisJCQkJc2V0TWV0aG9kTmFtZShNRVRIT0RfTkFNRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLkFTWU5DX01FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TOgorCQkJCXNldE1ldGhvZFBhcmFtcygoTWV0aG9kUGFyYW1zKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5BU1lOQ19NRVRIT0RfVFlQRV9fSUQ6CisJCQkJc2V0SWQoSURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFamJQYWNrYWdlLkFTWU5DX01FVEhPRF9UWVBFX19NRVRIT0RfTkFNRToKKwkJCQlyZXR1cm4gTUVUSE9EX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG1ldGhvZE5hbWUgIT0gbnVsbCA6ICFNRVRIT0RfTkFNRV9FREVGQVVMVC5lcXVhbHMobWV0aG9kTmFtZSk7CisJCQljYXNlIEVqYlBhY2thZ2UuQVNZTkNfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVM6CisJCQkJcmV0dXJuIG1ldGhvZFBhcmFtcyAhPSBudWxsOworCQkJY2FzZSBFamJQYWNrYWdlLkFTWU5DX01FVEhPRF9UWVBFX19JRDoKKwkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG1ldGhvZE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobWV0aG9kTmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Bc3luY01ldGhvZFR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUEZpZWxkSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVBGaWVsZEltcGwuamF2YQppbmRleCA0MTlmYjlmLi4xNjVjMjE2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUEZpZWxkSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ01QRmllbGRJbXBsLmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZE5hbWUoKSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTEzLDYgKzExMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5DTVBfRklFTEQ7CiAJfQpAQCAtMTIyLDkgKzEyMyw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5DTVBfRklFTERfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkNNUF9GSUVMRF9fREVTQ1JJUFRJT05TKTsKIAkJfQogCQlyZXR1cm4gZGVzY3JpcHRpb25zOwogCX0KQEAgLTE3NiwxMCArMTc3LDExIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5DTVBfRklFTERfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC0xODksNiArMTkxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRF9fREVTQ1JJUFRJT05TOgpAQCAtMjA2LDExICsyMDksMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5DTVBfRklFTERfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5DTVBfRklFTERfX0ZJRUxEX05BTUU6CiAJCQkJc2V0RmllbGROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtMjI3LDYgKzIzMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQ01QX0ZJRUxEX19ERVNDUklQVElPTlM6CkBAIC0yNDcsNiArMjUzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5DTVBfRklFTERfX0RFU0NSSVBUSU9OUzoKQEAgLTI2NCw2ICsyNzEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ01SRmllbGRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUkZpZWxkSW1wbC5qYXZhCmluZGV4IDAyOTIxYmEuLmU3NDQ2MGQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ01SRmllbGRJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVJGaWVsZEltcGwuamF2YQpAQCAtNTksNyArNTksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb25zOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENtckZpZWxkTmFtZSgpIDxlbT5DbXIgRmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTA4LDcgKzEwOCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY21yRmllbGRUeXBlRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIGNtckZpZWxkVHlwZUVTZXQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTE0NCw2ICsxNDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQ01SX0ZJRUxEOwogCX0KQEAgLTE1Myw5ICsxNTQsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5DTVJfRklFTERfX0RFU0NSSVBUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIGRlc2NyaXB0aW9uczsKIAl9CkBAIC0yNTMsMTAgKzI1NCwxMSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtMjY2LDYgKzI2OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0RFU0NSSVBUSU9OUzoKQEAgLTI4NSwxMSArMjg4LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19DTVJfRklFTERfTkFNRToKIAkJCQlzZXRDbXJGaWVsZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0zMDksNiArMzE0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfX0RFU0NSSVBUSU9OUzoKQEAgLTMzMiw2ICszMzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fREVTQ1JJUFRJT05TOgpAQCAtMzUxLDYgKzM1OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Db25jdXJyZW50TWV0aG9kVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ29uY3VycmVudE1ldGhvZFR5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwMTI3OQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ29uY3VycmVudE1ldGhvZFR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSw0MDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjY2Vzc1RpbWVvdXRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbmN1cnJlbnRMb2NrVHlwZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudE1ldGhvZFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTmFtZWRNZXRob2RUeXBlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmN1cnJlbnQgTWV0aG9kIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ29uY3VycmVudE1ldGhvZFR5cGVJbXBsI2dldE1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNvbmN1cnJlbnRNZXRob2RUeXBlSW1wbCNnZXRMb2NrIDxlbT5Mb2NrPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNvbmN1cnJlbnRNZXRob2RUeXBlSW1wbCNnZXRBY2Nlc3NUaW1lb3V0IDxlbT5BY2Nlc3MgVGltZW91dDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Db25jdXJyZW50TWV0aG9kVHlwZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ29uY3VycmVudE1ldGhvZFR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDb25jdXJyZW50TWV0aG9kVHlwZSB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kKCkgPGVtPk1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWV0aG9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlIG1ldGhvZDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NrKCkgPGVtPkxvY2s8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExvY2soKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29uY3VycmVudExvY2tUeXBlVHlwZSBMT0NLX0VERUZBVUxUID0gQ29uY3VycmVudExvY2tUeXBlVHlwZS5SRUFEOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jaygpIDxlbT5Mb2NrPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMb2NrKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29uY3VycmVudExvY2tUeXBlVHlwZSBsb2NrID0gTE9DS19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTG9jayBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gbG9ja0VTZXQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NUaW1lb3V0KCkgPGVtPkFjY2VzcyBUaW1lb3V0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBY2Nlc3NUaW1lb3V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWNjZXNzVGltZW91dFR5cGUgYWNjZXNzVGltZW91dDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENvbmN1cnJlbnRNZXRob2RUeXBlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTmFtZWRNZXRob2RUeXBlIGdldE1ldGhvZCgpIHsKKwkJcmV0dXJuIG1ldGhvZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXRob2QoTmFtZWRNZXRob2RUeXBlIG5ld01ldGhvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlOYW1lZE1ldGhvZFR5cGUgb2xkTWV0aG9kID0gbWV0aG9kOworCQltZXRob2QgPSBuZXdNZXRob2Q7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fTUVUSE9ELCBvbGRNZXRob2QsIG5ld01ldGhvZCk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWV0aG9kKE5hbWVkTWV0aG9kVHlwZSBuZXdNZXRob2QpIHsKKwkJaWYgKG5ld01ldGhvZCAhPSBtZXRob2QpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKG1ldGhvZCAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCltZXRob2QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLkNPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX01FVEhPRCwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3TWV0aG9kICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01ldGhvZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fTUVUSE9ELCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldE1ldGhvZChuZXdNZXRob2QsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DT05DVVJSRU5UX01FVEhPRF9UWVBFX19NRVRIT0QsIG5ld01ldGhvZCwgbmV3TWV0aG9kKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbmN1cnJlbnRMb2NrVHlwZVR5cGUgZ2V0TG9jaygpIHsKKwkJcmV0dXJuIGxvY2s7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TG9jayhDb25jdXJyZW50TG9ja1R5cGVUeXBlIG5ld0xvY2spIHsKKwkJQ29uY3VycmVudExvY2tUeXBlVHlwZSBvbGRMb2NrID0gbG9jazsKKwkJbG9jayA9IG5ld0xvY2sgPT0gbnVsbCA/IExPQ0tfRURFRkFVTFQgOiBuZXdMb2NrOworCQlib29sZWFuIG9sZExvY2tFU2V0ID0gbG9ja0VTZXQ7CisJCWxvY2tFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DT05DVVJSRU5UX01FVEhPRF9UWVBFX19MT0NLLCBvbGRMb2NrLCBsb2NrLCAhb2xkTG9ja0VTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldExvY2soKSB7CisJCUNvbmN1cnJlbnRMb2NrVHlwZVR5cGUgb2xkTG9jayA9IGxvY2s7CisJCWJvb2xlYW4gb2xkTG9ja0VTZXQgPSBsb2NrRVNldDsKKwkJbG9jayA9IExPQ0tfRURFRkFVTFQ7CisJCWxvY2tFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5DT05DVVJSRU5UX01FVEhPRF9UWVBFX19MT0NLLCBvbGRMb2NrLCBMT0NLX0VERUZBVUxULCBvbGRMb2NrRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0TG9jaygpIHsKKwkJcmV0dXJuIGxvY2tFU2V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBY2Nlc3NUaW1lb3V0VHlwZSBnZXRBY2Nlc3NUaW1lb3V0KCkgeworCQlyZXR1cm4gYWNjZXNzVGltZW91dDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NUaW1lb3V0KEFjY2Vzc1RpbWVvdXRUeXBlIG5ld0FjY2Vzc1RpbWVvdXQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJQWNjZXNzVGltZW91dFR5cGUgb2xkQWNjZXNzVGltZW91dCA9IGFjY2Vzc1RpbWVvdXQ7CisJCWFjY2Vzc1RpbWVvdXQgPSBuZXdBY2Nlc3NUaW1lb3V0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLkNPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX0FDQ0VTU19USU1FT1VULCBvbGRBY2Nlc3NUaW1lb3V0LCBuZXdBY2Nlc3NUaW1lb3V0KTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NUaW1lb3V0KEFjY2Vzc1RpbWVvdXRUeXBlIG5ld0FjY2Vzc1RpbWVvdXQpIHsKKwkJaWYgKG5ld0FjY2Vzc1RpbWVvdXQgIT0gYWNjZXNzVGltZW91dCkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYWNjZXNzVGltZW91dCAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NUaW1lb3V0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5DT05DVVJSRU5UX01FVEhPRF9UWVBFX19BQ0NFU1NfVElNRU9VVCwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3QWNjZXNzVGltZW91dCAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NUaW1lb3V0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5DT05DVVJSRU5UX01FVEhPRF9UWVBFX19BQ0NFU1NfVElNRU9VVCwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NUaW1lb3V0KG5ld0FjY2Vzc1RpbWVvdXQsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5DT05DVVJSRU5UX01FVEhPRF9UWVBFX19BQ0NFU1NfVElNRU9VVCwgbmV3QWNjZXNzVGltZW91dCwgbmV3QWNjZXNzVGltZW91dCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKKwkJU3RyaW5nIG9sZElkID0gaWQ7CisJCWlkID0gbmV3SWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fSUQsIG9sZElkLCBpZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWpiUGFja2FnZS5DT05DVVJSRU5UX01FVEhPRF9UWVBFX19NRVRIT0Q6CisJCQkJcmV0dXJuIGJhc2ljU2V0TWV0aG9kKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFamJQYWNrYWdlLkNPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX0FDQ0VTU19USU1FT1VUOgorCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc1RpbWVvdXQobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWpiUGFja2FnZS5DT05DVVJSRU5UX01FVEhPRF9UWVBFX19NRVRIT0Q6CisJCQkJcmV0dXJuIGdldE1ldGhvZCgpOworCQkJY2FzZSBFamJQYWNrYWdlLkNPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX0xPQ0s6CisJCQkJcmV0dXJuIGdldExvY2soKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5DT05DVVJSRU5UX01FVEhPRF9UWVBFX19BQ0NFU1NfVElNRU9VVDoKKwkJCQlyZXR1cm4gZ2V0QWNjZXNzVGltZW91dCgpOworCQkJY2FzZSBFamJQYWNrYWdlLkNPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX0lEOgorCQkJCXJldHVybiBnZXRJZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fTUVUSE9EOgorCQkJCXNldE1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fTE9DSzoKKwkJCQlzZXRMb2NrKChDb25jdXJyZW50TG9ja1R5cGVUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fQUNDRVNTX1RJTUVPVVQ6CisJCQkJc2V0QWNjZXNzVGltZW91dCgoQWNjZXNzVGltZW91dFR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5DT05DVVJSRU5UX01FVEhPRF9UWVBFX19JRDoKKwkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFamJQYWNrYWdlLkNPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX01FVEhPRDoKKwkJCQlzZXRNZXRob2QoKE5hbWVkTWV0aG9kVHlwZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fTE9DSzoKKwkJCQl1bnNldExvY2soKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fQUNDRVNTX1RJTUVPVVQ6CisJCQkJc2V0QWNjZXNzVGltZW91dCgoQWNjZXNzVGltZW91dFR5cGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLkNPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX0lEOgorCQkJCXNldElkKElEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWpiUGFja2FnZS5DT05DVVJSRU5UX01FVEhPRF9UWVBFX19NRVRIT0Q6CisJCQkJcmV0dXJuIG1ldGhvZCAhPSBudWxsOworCQkJY2FzZSBFamJQYWNrYWdlLkNPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX0xPQ0s6CisJCQkJcmV0dXJuIGlzU2V0TG9jaygpOworCQkJY2FzZSBFamJQYWNrYWdlLkNPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX0FDQ0VTU19USU1FT1VUOgorCQkJCXJldHVybiBhY2Nlc3NUaW1lb3V0ICE9IG51bGw7CisJCQljYXNlIEVqYlBhY2thZ2UuQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fSUQ6CisJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChsb2NrOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAobG9ja0VTZXQpIHJlc3VsdC5hcHBlbmQobG9jayk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Db25jdXJyZW50TWV0aG9kVHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Db250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsLmphdmEKaW5kZXggM2RlMDEyOS4uOGRhZTRkYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Db250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Db250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZHMoKSA8ZW0+TWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03MCw3ICs3MCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZHMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxNZXRob2RUeXBlPiBtZXRob2RzOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zQXR0cmlidXRlKCkgPGVtPlRyYW5zIEF0dHJpYnV0ZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtOTksNyArOTksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRyYW5zQXR0cmlidXRlRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHRyYW5zQXR0cmlidXRlRVNldDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTM1LDYgKzEzNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRTsKIAl9CkBAIC0xNDQsOSArMTQ1LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgeworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CiAJCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fREVTQ1JJUFRJT05TKTsKIAkJfQogCQlyZXR1cm4gZGVzY3JpcHRpb25zOwogCX0KQEAgLTE1Niw5ICsxNTcsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RzKCkgeworCXB1YmxpYyBMaXN0PE1ldGhvZFR5cGU+IGdldE1ldGhvZHMoKSB7CiAJCWlmIChtZXRob2RzID09IG51bGwpIHsKLQkJCW1ldGhvZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWV0aG9kVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fTUVUSE9EUyk7CisJCQltZXRob2RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PE1ldGhvZFR5cGU+KE1ldGhvZFR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX01FVEhPRFMpOwogCQl9CiAJCXJldHVybiBtZXRob2RzOwogCX0KQEAgLTIzNSwxMiArMjM2LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX01FVEhPRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1ldGhvZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC0yNTAsNiArMjUyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19ERVNDUklQVElPTlM6CkBAIC0yNjksMTUgKzI3MiwxNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX01FVEhPRFM6CiAJCQkJZ2V0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0TWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kVHlwZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fVFJBTlNfQVRUUklCVVRFOgogCQkJCXNldFRyYW5zQXR0cmlidXRlKChUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUpbmV3VmFsdWUpOwpAQCAtMjk0LDYgKzI5OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0RFU0NSSVBUSU9OUzoKQEAgLTMxNyw2ICszMjMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19ERVNDUklQVElPTlM6CkBAIC0zMzYsNiArMzQzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0RlcGVuZHNPblR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0RlcGVuZHNPblR5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmZDIzZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRGVwZW5kc09uVHlwZUltcGwuamF2YQpAQCAtMCwwICsxLDIxNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5EZXBlbmRzT25UeXBlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlcGVuZHMgT24gVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5EZXBlbmRzT25UeXBlSW1wbCNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5EZXBlbmRzT25UeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBEZXBlbmRzT25UeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRGVwZW5kc09uVHlwZSB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTmFtZSgpIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFamJOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBlamJOYW1lOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGVwZW5kc09uVHlwZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkRFUEVORFNfT05fVFlQRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEVqYk5hbWUoKSB7CisJCWlmIChlamJOYW1lID09IG51bGwpIHsKKwkJCWVqYk5hbWUgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuREVQRU5EU19PTl9UWVBFX19FSkJfTkFNRSk7CisJCX0KKwkJcmV0dXJuIGVqYk5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgeworCQlTdHJpbmcgb2xkSWQgPSBpZDsKKwkJaWQgPSBuZXdJZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5ERVBFTkRTX09OX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuREVQRU5EU19PTl9UWVBFX19FSkJfTkFNRToKKwkJCQlyZXR1cm4gZ2V0RWpiTmFtZSgpOworCQkJY2FzZSBFamJQYWNrYWdlLkRFUEVORFNfT05fVFlQRV9fSUQ6CisJCQkJcmV0dXJuIGdldElkKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWpiUGFja2FnZS5ERVBFTkRTX09OX1RZUEVfX0VKQl9OQU1FOgorCQkJCWdldEVqYk5hbWUoKS5jbGVhcigpOworCQkJCWdldEVqYk5hbWUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5ERVBFTkRTX09OX1RZUEVfX0lEOgorCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuREVQRU5EU19PTl9UWVBFX19FSkJfTkFNRToKKwkJCQlnZXRFamJOYW1lKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuREVQRU5EU19PTl9UWVBFX19JRDoKKwkJCQlzZXRJZChJRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuREVQRU5EU19PTl9UWVBFX19FSkJfTkFNRToKKwkJCQlyZXR1cm4gZWpiTmFtZSAhPSBudWxsICYmICFlamJOYW1lLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5ERVBFTkRTX09OX1RZUEVfX0lEOgorCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoZWpiTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChlamJOYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0RlcGVuZHNPblR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YQppbmRleCA1YmI4NWI2Li41MTM4YTVhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEKQEAgLTU5LDcgKzU5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBtaXhlZCA9IG51bGw7CisJcHJvdGVjdGVkIEZlYXR1cmVNYXAgbWl4ZWQ7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYTUxOU1ByZWZpeE1hcCgpIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59JyBtYXAuCkBAIC02OSw3ICs2OSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVNYXAgeE1MTlNQcmVmaXhNYXAgPSBudWxsOworCXByb3RlY3RlZCBFTWFwPFN0cmluZywgU3RyaW5nPiB4TUxOU1ByZWZpeE1hcDsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkgPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nIG1hcC4KQEAgLTc5LDcgKzc5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4U0lTY2hlbWFMb2NhdGlvbiA9IG51bGw7CisJcHJvdGVjdGVkIEVNYXA8U3RyaW5nLCBTdHJpbmc+IHhTSVNjaGVtYUxvY2F0aW9uOwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTk1LDYgKzk1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SOwogCX0KQEAgLTExNiw5ICsxMTcsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTWFwIGdldFhNTE5TUHJlZml4TWFwKCkgeworCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhNTE5TUHJlZml4TWFwKCkgewogCQlpZiAoeE1MTlNQcmVmaXhNYXAgPT0gbnVsbCkgewotCQkJeE1MTlNQcmVmaXhNYXAgPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HX1RPX1NUUklOR19NQVBfRU5UUlksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCk7CisJCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXA8U3RyaW5nLFN0cmluZz4oRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQKTsKIAkJfQogCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAubWFwKCk7CiAJfQpAQCAtMTI4LDkgKzEyOSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSB7CisJcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSB7CiAJCWlmICh4U0lTY2hlbWFMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQl4U0lTY2hlbWFMb2NhdGlvbiA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKKwkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcDxTdHJpbmcsU3RyaW5nPihFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwogCQl9CiAJCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbi5tYXAoKTsKIAl9CkBAIC0xNjcsMTQgKzE2OCwxNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWl4ZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWl4ZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19FSkJfSkFSOgogCQkJCXJldHVybiBiYXNpY1NldEVqYkphcihudWxsLCBtc2dzKTsKIAkJfQpAQCAtMTg2LDE2ICsxODgsMTcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKIAkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRNaXhlZCgpOwogCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuZ2V0V3JhcHBlcigpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpOworCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKTsKIAkJCQllbHNlIHJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpOworCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKTsKIAkJCQllbHNlIHJldHVybiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19FSkJfSkFSOgogCQkJCXJldHVybiBnZXRFamJKYXIoKTsKQEAgLTIwOCwxNiArMjExLDE3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgogCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQobmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOworCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKSgoRU1hcC5JbnRlcm5hbE1hcFZpZXcpZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOworCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fRUpCX0pBUjoKIAkJCQlzZXRFamJKYXIoKEVKQkphciluZXdWYWx1ZSk7CkBAIC0yMzEsNiArMjM1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6CkBAIC0yNTQsNiArMjU5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6CkBAIC0yNzMsNiArMjc5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCSmFySW1wbC5qYXZhCmluZGV4IDdjNDY0ZjcuLjE1MzczYWMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCSmFySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCSmFySW1wbC5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiAgKiA8cD4KICAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgogICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbCNnZXRNb2R1bGVOYW1lIDxlbT5Nb2R1bGUgTmFtZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckltcGwjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckltcGwjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KQEAgLTU3LDYgKzU4LDI2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBFSkJKYXJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFSkJKYXIgewogCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGVOYW1lKCkgPGVtPk1vZHVsZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNb2R1bGVOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNb2R1bGVOYW1lKCkgPGVtPk1vZHVsZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNb2R1bGVOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG1vZHVsZU5hbWUgPSBNT0RVTEVfTkFNRV9FREVGQVVMVDsKKworCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9ucygpIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC02NCw3ICs4NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03NCw3ICs5NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERpc3BsYXlOYW1lPiBkaXNwbGF5TmFtZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC04NCw3ICsxMDUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpY29ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEljb24+IGljb25zOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50ZXJwcmlzZUJlYW5zKCkgPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTk0LDcgKzExNSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVudGVycHJpc2VCZWFucyBlbnRlcnByaXNlQmVhbnMgPSBudWxsOworCXByb3RlY3RlZCBFbnRlcnByaXNlQmVhbnMgZW50ZXJwcmlzZUJlYW5zOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJjZXB0b3JzKCkgPGVtPkludGVyY2VwdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtMTA0LDcgKzEyNSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEludGVyY2VwdG9yc1R5cGUgaW50ZXJjZXB0b3JzID0gbnVsbDsKKwlwcm90ZWN0ZWQgSW50ZXJjZXB0b3JzVHlwZSBpbnRlcmNlcHRvcnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWxhdGlvbnNoaXBzKCkgPGVtPlJlbGF0aW9uc2hpcHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTExNCw3ICsxMzUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBSZWxhdGlvbnNoaXBzIHJlbGF0aW9uc2hpcHMgPSBudWxsOworCXByb3RlY3RlZCBSZWxhdGlvbnNoaXBzIHJlbGF0aW9uc2hpcHM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NlbWJseURlc2NyaXB0b3IoKSA8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtMTI0LDcgKzE0NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBudWxsOworCXByb3RlY3RlZCBBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkNsaWVudEphcigpIDxlbT5FamIgQ2xpZW50IEphcjwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTkzLDcgKzIxNCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZUVTZXQgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlRVNldDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTIwMyw3ICsyMjQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiMy4wIjsgLy8kTk9OLU5MUy0xJAorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiMy4xIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0yMjIsNyArMjQzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJzaW9uRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25FU2V0OwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTIzOCw2ICsyNTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuRUpCX0pBUjsKIAl9CkBAIC0yNDcsOSArMjY5LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgeworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CiAJCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0RFU0NSSVBUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIGRlc2NyaXB0aW9uczsKIAl9CkBAIC0yNTksOSArMjgxLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgeworCXB1YmxpYyBMaXN0PERpc3BsYXlOYW1lPiBnZXREaXNwbGF5TmFtZXMoKSB7CiAJCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9KQVJfX0RJU1BMQVlfTkFNRVMpOworCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERpc3BsYXlOYW1lPihEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX19ESVNQTEFZX05BTUVTKTsKIAkJfQogCQlyZXR1cm4gZGlzcGxheU5hbWVzOwogCX0KQEAgLTI3MSw5ICsyOTMsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJY29ucygpIHsKKwlwdWJsaWMgTGlzdDxJY29uPiBnZXRJY29ucygpIHsKIAkJaWYgKGljb25zID09IG51bGwpIHsKLQkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEljb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX0pBUl9fSUNPTlMpOworCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SWNvbj4oSWNvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FSkJfSkFSX19JQ09OUyk7CiAJCX0KIAkJcmV0dXJuIGljb25zOwogCX0KQEAgLTI4Myw2ICszMDUsMjcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIFN0cmluZyBnZXRNb2R1bGVOYW1lKCkgeworCQlyZXR1cm4gbW9kdWxlTmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNb2R1bGVOYW1lKFN0cmluZyBuZXdNb2R1bGVOYW1lKSB7CisJCVN0cmluZyBvbGRNb2R1bGVOYW1lID0gbW9kdWxlTmFtZTsKKwkJbW9kdWxlTmFtZSA9IG5ld01vZHVsZU5hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuRUpCX0pBUl9fTU9EVUxFX05BTUUsIG9sZE1vZHVsZU5hbWUsIG1vZHVsZU5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRW50ZXJwcmlzZUJlYW5zIGdldEVudGVycHJpc2VCZWFucygpIHsKIAkJcmV0dXJuIGVudGVycHJpc2VCZWFuczsKIAl9CkBAIC01ODksMTQgKzYzMiwxNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VOVEVSUFJJU0VfQkVBTlM6CiAJCQkJcmV0dXJuIGJhc2ljU2V0RW50ZXJwcmlzZUJlYW5zKG51bGwsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lOVEVSQ0VQVE9SUzoKQEAgLTYxNCw4ICs2NTgsMTEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX01PRFVMRV9OQU1FOgorCQkJCXJldHVybiBnZXRNb2R1bGVOYW1lKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fREVTQ1JJUFRJT05TOgogCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbnMoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ESVNQTEFZX05BTUVTOgpAQCAtNjM1LDcgKzY4Miw3IEBACiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fSUQ6CiAJCQkJcmV0dXJuIGdldElkKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGlzTWV0YWRhdGFDb21wbGV0ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKwkJCQlyZXR1cm4gaXNNZXRhZGF0YUNvbXBsZXRlKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fVkVSU0lPTjoKIAkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOwogCQl9CkBAIC02NDcsMTkgKzY5NCwyNCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX01PRFVMRV9OQU1FOgorCQkJCXNldE1vZHVsZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ESVNQTEFZX05BTUVTOgogCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERpc3BsYXlOYW1lPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0lDT05TOgogCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEljb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRU5URVJQUklTRV9CRUFOUzoKIAkJCQlzZXRFbnRlcnByaXNlQmVhbnMoKEVudGVycHJpc2VCZWFucyluZXdWYWx1ZSk7CkBAIC02ODAsNyArNzMyLDcgQEAKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJc2V0TWV0YWRhdGFDb21wbGV0ZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCQlzZXRNZXRhZGF0YUNvbXBsZXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fVkVSU0lPTjoKIAkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtNjk0LDggKzc0NiwxMiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX01PRFVMRV9OQU1FOgorCQkJCXNldE1vZHVsZU5hbWUoTU9EVUxFX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CkBAIC03MzgsOCArNzk0LDExIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fTU9EVUxFX05BTUU6CisJCQkJcmV0dXJuIE1PRFVMRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtb2R1bGVOYW1lICE9IG51bGwgOiAhTU9EVUxFX05BTUVfRURFRkFVTFQuZXF1YWxzKG1vZHVsZU5hbWUpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0RFU0NSSVBUSU9OUzoKIAkJCQlyZXR1cm4gZGVzY3JpcHRpb25zICE9IG51bGwgJiYgIWRlc2NyaXB0aW9ucy5pc0VtcHR5KCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRElTUExBWV9OQU1FUzoKQEAgLTc3MSwxMSArODMwLDE0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChlamJDbGllbnRKYXI6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiAobW9kdWxlTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtb2R1bGVOYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBlamJDbGllbnRKYXI6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZWpiQ2xpZW50SmFyKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbkltcGwuamF2YQppbmRleCA2YTkwYmIwLi5lNTY2OWU4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25JbXBsLmphdmEKQEAgLTU5LDcgKzU5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWxhdGlvbk5hbWUoKSA8ZW0+RWpiIFJlbGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTg5LDcgKzg5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWpiUmVsYXRpb25zaGlwUm9sZXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxFSkJSZWxhdGlvbnNoaXBSb2xlPiBlamJSZWxhdGlvbnNoaXBSb2xlczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTI1LDYgKzEyNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FSkJfUkVMQVRJT047CiAJfQpAQCAtMTM0LDkgKzEzNSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TKTsKIAkJfQogCQlyZXR1cm4gZGVzY3JpcHRpb25zOwogCX0KQEAgLTE2Nyw5ICsxNjgsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJSZWxhdGlvbnNoaXBSb2xlcygpIHsKKwlwdWJsaWMgTGlzdDxFSkJSZWxhdGlvbnNoaXBSb2xlPiBnZXRFamJSZWxhdGlvbnNoaXBSb2xlcygpIHsKIAkJaWYgKGVqYlJlbGF0aW9uc2hpcFJvbGVzID09IG51bGwpIHsKLQkJCWVqYlJlbGF0aW9uc2hpcFJvbGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19FSkJfUkVMQVRJT05TSElQX1JPTEVTKTsKKwkJCWVqYlJlbGF0aW9uc2hpcFJvbGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEVKQlJlbGF0aW9uc2hpcFJvbGU+KEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19FSkJfUkVMQVRJT05TSElQX1JPTEVTKTsKIAkJfQogCQlyZXR1cm4gZWpiUmVsYXRpb25zaGlwUm9sZXM7CiAJfQpAQCAtMjAwLDEyICsyMDEsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19FSkJfUkVMQVRJT05TSElQX1JPTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiUmVsYXRpb25zaGlwUm9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RWpiUmVsYXRpb25zaGlwUm9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC0yMTUsNiArMjE3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TOgpAQCAtMjM0LDE4ICsyMzcsMjAgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0VKQl9SRUxBVElPTl9OQU1FOgogCQkJCXNldEVqYlJlbGF0aW9uTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19FSkJfUkVMQVRJT05TSElQX1JPTEVTOgogCQkJCWdldEVqYlJlbGF0aW9uc2hpcFJvbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJSZWxhdGlvbnNoaXBSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RWpiUmVsYXRpb25zaGlwUm9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEVKQlJlbGF0aW9uc2hpcFJvbGU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19JRDoKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTI1OSw2ICsyNjQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT05TOgpAQCAtMjgyLDYgKzI4OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTlM6CkBAIC0zMDEsNiArMzA4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uc2hpcFJvbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uc2hpcFJvbGVJbXBsLmphdmEKaW5kZXggZmY5MWEzNC4uMTdlYzQzZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25zaGlwUm9sZUltcGwuamF2YQpAQCAtNjUsNyArNjUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb25zOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKCkgPGVtPkVqYiBSZWxhdGlvbnNoaXAgUm9sZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMTQsNyArMTE0LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtdWx0aXBsaWNpdHlFU2V0ID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gbXVsdGlwbGljaXR5RVNldDsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGVEZWxldGUoKSA8ZW0+Q2FzY2FkZSBEZWxldGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTEyNCw3ICsxMjQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFbXB0eVR5cGUgY2FzY2FkZURlbGV0ZSA9IG51bGw7CisJcHJvdGVjdGVkIEVtcHR5VHlwZSBjYXNjYWRlRGVsZXRlOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZSgpIDxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTEzNCw3ICsxMzQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSByZWxhdGlvbnNoaXBSb2xlU291cmNlID0gbnVsbDsKKwlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgcmVsYXRpb25zaGlwUm9sZVNvdXJjZTsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENtckZpZWxkKCkgPGVtPkNtciBGaWVsZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIENNUkZpZWxkIGNtckZpZWxkID0gbnVsbDsKKwlwcm90ZWN0ZWQgQ01SRmllbGQgY21yRmllbGQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTE4MCw2ICsxODAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuRUpCX1JFTEFUSU9OU0hJUF9ST0xFOwogCX0KQEAgLTE4OSw5ICsxOTAsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIGRlc2NyaXB0aW9uczsKIAl9CkBAIC00MTgsMTAgKzQxOSwxMSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NBU0NBREVfREVMRVRFOgogCQkJCXJldHVybiBiYXNpY1NldENhc2NhZGVEZWxldGUobnVsbCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0U6CkBAIC00MzcsNiArNDM5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT05TOgpAQCAtNDYyLDExICs0NjUsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0VKQl9SRUxBVElPTlNISVBfUk9MRV9OQU1FOgogCQkJCXNldEVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtNDk1LDYgKzUwMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTlM6CkBAIC01MjcsNiArNTMzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OUzoKQEAgLTU1Miw2ICs1NTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRWpiRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRWpiRmFjdG9yeUltcGwuamF2YQppbmRleCA5ZGZiOTdkLi44ZjRhY2RjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYkZhY3RvcnlJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJGYWN0b3J5SW1wbC5qYXZhCkBAIC03MCwxNiArNzAsMjIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKIAkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgRWpiUGFja2FnZS5BQ0NFU1NfVElNRU9VVF9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQWNjZXNzVGltZW91dFR5cGUoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJRzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFjdGl2YXRpb25Db25maWcoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpOwogCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuQVJPVU5EX0lOVk9LRV9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQXJvdW5kSW52b2tlVHlwZSgpOworCQkJY2FzZSBFamJQYWNrYWdlLkFST1VORF9USU1FT1VUX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVBcm91bmRUaW1lb3V0VHlwZSgpOwogCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5BU1lOQ19NRVRIT0RfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFzeW5jTWV0aG9kVHlwZSgpOwogCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9GSUVMRDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNNUEZpZWxkKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ01SRmllbGQoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5DT05DVVJSRU5UX01FVEhPRF9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29uY3VycmVudE1ldGhvZFR5cGUoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5DT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSgpOworCQkJY2FzZSBFamJQYWNrYWdlLkRFUEVORFNfT05fVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlcGVuZHNPblR5cGUoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRUpCSmFyKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcigpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVKQlJlbGF0aW9uKCk7CkBAIC0xMDQsNiArMTEwLDkgQEAKIAkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVSZW1vdmVNZXRob2RUeXBlKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlY3VyaXR5SWRlbnRpdHlUeXBlKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlU2Vzc2lvbkJlYW4oKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TVEFURUZVTF9USU1FT1VUX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVTdGF0ZWZ1bFRpbWVvdXRUeXBlKCk7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfU0NIRURVTEVfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRpbWVyU2NoZWR1bGVUeXBlKCk7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRpbWVyVHlwZSgpOwogCQkJZGVmYXVsdDoKIAkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJfQpAQCAtMTE0LDEyICsxMjMsMTcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5DTVBfVkVSU0lPTl9UWVBFOgogCQkJCXJldHVybiBjcmVhdGVDbXBWZXJzaW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9UWVBFOgogCQkJCXJldHVybiBjcmVhdGVDTVJGaWVsZFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5DT05DVVJSRU5DWV9NQU5BR0VNRU5UX1RZUEVfVFlQRToKKwkJCQlyZXR1cm4gY3JlYXRlQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5DT05DVVJSRU5UX0xPQ0tfVFlQRV9UWVBFOgorCQkJCXJldHVybiBjcmVhdGVDb25jdXJyZW50TG9ja1R5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0lOVEVSRkFDRV9UWVBFOgogCQkJCXJldHVybiBjcmVhdGVNZXRob2RJbnRlcmZhY2VUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTVVMVElQTElDSVRZX1RZUEU6CkBAIC0xMzAsNiArMTQ0LDggQEAKIAkJCQlyZXR1cm4gY3JlYXRlUmVzdWx0VHlwZU1hcHBpbmdUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9UWVBFOgogCQkJCXJldHVybiBjcmVhdGVTZXNzaW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVfVU5JVF9UWVBFX1RZUEU6CisJCQkJcmV0dXJuIGNyZWF0ZVRpbWVVbml0VHlwZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRToKIAkJCQlyZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIEVqYlBhY2thZ2UuVFJBTlNBQ1RJT05fVFlQRToKQEAgLTEzOCw2ICsxNTQsMTAgQEAKIAkJCQlyZXR1cm4gY3JlYXRlQ21wVmVyc2lvblR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfVFlQRV9PQkpFQ1Q6CiAJCQkJcmV0dXJuIGNyZWF0ZUNNUkZpZWxkVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBFamJQYWNrYWdlLkNPTkNVUlJFTkNZX01BTkFHRU1FTlRfVFlQRV9UWVBFX09CSkVDVDoKKwkJCQlyZXR1cm4gY3JlYXRlQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5DT05DVVJSRU5UX0xPQ0tfVFlQRV9UWVBFX09CSkVDVDoKKwkJCQlyZXR1cm4gY3JlYXRlQ29uY3VycmVudExvY2tUeXBlVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9DTEFTU19UWVBFOgogCQkJCXJldHVybiBjcmVhdGVFamJDbGFzc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfTkFNRV9UWVBFOgpAQCAtMTU0LDYgKzE3NCw4IEBACiAJCQkJcmV0dXJuIGNyZWF0ZVJlc3VsdFR5cGVNYXBwaW5nVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fVFlQRV9PQkpFQ1Q6CiAJCQkJcmV0dXJuIGNyZWF0ZVNlc3Npb25UeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRV9VTklUX1RZUEVfVFlQRV9PQkpFQ1Q6CisJCQkJcmV0dXJuIGNyZWF0ZVRpbWVVbml0VHlwZVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRV9PQkpFQ1Q6CiAJCQkJcmV0dXJuIGNyZWF0ZVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCQkJY2FzZSBFamJQYWNrYWdlLlRSQU5TQUNUSU9OX1RZUEVfT0JKRUNUOgpAQCAtMTY4LDEyICsxOTAsMTcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKIAkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5DTVBfVkVSU0lPTl9UWVBFOgogCQkJCXJldHVybiBjb252ZXJ0Q21wVmVyc2lvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9UWVBFOgogCQkJCXJldHVybiBjb252ZXJ0Q01SRmllbGRUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5DT05DVVJSRU5DWV9NQU5BR0VNRU5UX1RZUEVfVFlQRToKKwkJCQlyZXR1cm4gY29udmVydENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5DT05DVVJSRU5UX0xPQ0tfVFlQRV9UWVBFOgorCQkJCXJldHVybiBjb252ZXJ0Q29uY3VycmVudExvY2tUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0lOVEVSRkFDRV9UWVBFOgogCQkJCXJldHVybiBjb252ZXJ0TWV0aG9kSW50ZXJmYWNlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTVVMVElQTElDSVRZX1RZUEU6CkBAIC0xODQsNiArMjExLDggQEAKIAkJCQlyZXR1cm4gY29udmVydFJlc3VsdFR5cGVNYXBwaW5nVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9UWVBFOgogCQkJCXJldHVybiBjb252ZXJ0U2Vzc2lvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVfVU5JVF9UWVBFX1RZUEU6CisJCQkJcmV0dXJuIGNvbnZlcnRUaW1lVW5pdFR5cGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRToKIAkJCQlyZXR1cm4gY29udmVydFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQljYXNlIEVqYlBhY2thZ2UuVFJBTlNBQ1RJT05fVFlQRToKQEAgLTE5Miw2ICsyMjEsMTAgQEAKIAkJCQlyZXR1cm4gY29udmVydENtcFZlcnNpb25UeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5DTVJfRklFTERfVFlQRV9PQkpFQ1Q6CiAJCQkJcmV0dXJuIGNvbnZlcnRDTVJGaWVsZFR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBFamJQYWNrYWdlLkNPTkNVUlJFTkNZX01BTkFHRU1FTlRfVFlQRV9UWVBFX09CSkVDVDoKKwkJCQlyZXR1cm4gY29udmVydENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5DT05DVVJSRU5UX0xPQ0tfVFlQRV9UWVBFX09CSkVDVDoKKwkJCQlyZXR1cm4gY29udmVydENvbmN1cnJlbnRMb2NrVHlwZVR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9DTEFTU19UWVBFOgogCQkJCXJldHVybiBjb252ZXJ0RWpiQ2xhc3NUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfTkFNRV9UWVBFOgpAQCAtMjA4LDYgKzI0MSw4IEBACiAJCQkJcmV0dXJuIGNvbnZlcnRSZXN1bHRUeXBlTWFwcGluZ1R5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fVFlQRV9PQkpFQ1Q6CiAJCQkJcmV0dXJuIGNvbnZlcnRTZXNzaW9uVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRV9VTklUX1RZUEVfVFlQRV9PQkpFQ1Q6CisJCQkJcmV0dXJuIGNvbnZlcnRUaW1lVW5pdFR5cGVUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5UUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRV9PQkpFQ1Q6CiAJCQkJcmV0dXJuIGNvbnZlcnRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJY2FzZSBFamJQYWNrYWdlLlRSQU5TQUNUSU9OX1RZUEVfT0JKRUNUOgpAQCAtMjIyLDYgKzI1NywxNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgQWNjZXNzVGltZW91dFR5cGUgY3JlYXRlQWNjZXNzVGltZW91dFR5cGUoKSB7CisJCUFjY2Vzc1RpbWVvdXRUeXBlSW1wbCBhY2Nlc3NUaW1lb3V0VHlwZSA9IG5ldyBBY2Nlc3NUaW1lb3V0VHlwZUltcGwoKTsKKwkJcmV0dXJuIGFjY2Vzc1RpbWVvdXRUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBBY3RpdmF0aW9uQ29uZmlnIGNyZWF0ZUFjdGl2YXRpb25Db25maWcoKSB7CiAJCUFjdGl2YXRpb25Db25maWdJbXBsIGFjdGl2YXRpb25Db25maWcgPSBuZXcgQWN0aXZhdGlvbkNvbmZpZ0ltcGwoKTsKIAkJcmV0dXJuIGFjdGl2YXRpb25Db25maWc7CkBAIC0yNjIsNiArMzA3LDE2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBBcm91bmRUaW1lb3V0VHlwZSBjcmVhdGVBcm91bmRUaW1lb3V0VHlwZSgpIHsKKwkJQXJvdW5kVGltZW91dFR5cGVJbXBsIGFyb3VuZFRpbWVvdXRUeXBlID0gbmV3IEFyb3VuZFRpbWVvdXRUeXBlSW1wbCgpOworCQlyZXR1cm4gYXJvdW5kVGltZW91dFR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEFzc2VtYmx5RGVzY3JpcHRvciBjcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKSB7CiAJCUFzc2VtYmx5RGVzY3JpcHRvckltcGwgYXNzZW1ibHlEZXNjcmlwdG9yID0gbmV3IEFzc2VtYmx5RGVzY3JpcHRvckltcGwoKTsKIAkJcmV0dXJuIGFzc2VtYmx5RGVzY3JpcHRvcjsKQEAgLTI3Miw2ICszMjcsMTYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEFzeW5jTWV0aG9kVHlwZSBjcmVhdGVBc3luY01ldGhvZFR5cGUoKSB7CisJCUFzeW5jTWV0aG9kVHlwZUltcGwgYXN5bmNNZXRob2RUeXBlID0gbmV3IEFzeW5jTWV0aG9kVHlwZUltcGwoKTsKKwkJcmV0dXJuIGFzeW5jTWV0aG9kVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgQ01QRmllbGQgY3JlYXRlQ01QRmllbGQoKSB7CiAJCUNNUEZpZWxkSW1wbCBjbXBGaWVsZCA9IG5ldyBDTVBGaWVsZEltcGwoKTsKIAkJcmV0dXJuIGNtcEZpZWxkOwpAQCAtMjkyLDYgKzM1NywxNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgQ29uY3VycmVudE1ldGhvZFR5cGUgY3JlYXRlQ29uY3VycmVudE1ldGhvZFR5cGUoKSB7CisJCUNvbmN1cnJlbnRNZXRob2RUeXBlSW1wbCBjb25jdXJyZW50TWV0aG9kVHlwZSA9IG5ldyBDb25jdXJyZW50TWV0aG9kVHlwZUltcGwoKTsKKwkJcmV0dXJuIGNvbmN1cnJlbnRNZXRob2RUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBDb250YWluZXJUcmFuc2FjdGlvblR5cGUgY3JlYXRlQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKCkgewogCQlDb250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsIGNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSA9IG5ldyBDb250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsKCk7CiAJCXJldHVybiBjb250YWluZXJUcmFuc2FjdGlvblR5cGU7CkBAIC0zMDIsNiArMzc3LDE2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBEZXBlbmRzT25UeXBlIGNyZWF0ZURlcGVuZHNPblR5cGUoKSB7CisJCURlcGVuZHNPblR5cGVJbXBsIGRlcGVuZHNPblR5cGUgPSBuZXcgRGVwZW5kc09uVHlwZUltcGwoKTsKKwkJcmV0dXJuIGRlcGVuZHNPblR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVKQkphciBjcmVhdGVFSkJKYXIoKSB7CiAJCUVKQkphckltcGwgZWpiSmFyID0gbmV3IEVKQkphckltcGwoKTsKIAkJcmV0dXJuIGVqYkphcjsKQEAgLTU0Miw2ICs2MjcsMzYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIFN0YXRlZnVsVGltZW91dFR5cGUgY3JlYXRlU3RhdGVmdWxUaW1lb3V0VHlwZSgpIHsKKwkJU3RhdGVmdWxUaW1lb3V0VHlwZUltcGwgc3RhdGVmdWxUaW1lb3V0VHlwZSA9IG5ldyBTdGF0ZWZ1bFRpbWVvdXRUeXBlSW1wbCgpOworCQlyZXR1cm4gc3RhdGVmdWxUaW1lb3V0VHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGltZXJTY2hlZHVsZVR5cGUgY3JlYXRlVGltZXJTY2hlZHVsZVR5cGUoKSB7CisJCVRpbWVyU2NoZWR1bGVUeXBlSW1wbCB0aW1lclNjaGVkdWxlVHlwZSA9IG5ldyBUaW1lclNjaGVkdWxlVHlwZUltcGwoKTsKKwkJcmV0dXJuIHRpbWVyU2NoZWR1bGVUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUaW1lclR5cGUgY3JlYXRlVGltZXJUeXBlKCkgeworCQlUaW1lclR5cGVJbXBsIHRpbWVyVHlwZSA9IG5ldyBUaW1lclR5cGVJbXBsKCk7CisJCXJldHVybiB0aW1lclR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIENtcFZlcnNpb25UeXBlIGNyZWF0ZUNtcFZlcnNpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCUNtcFZlcnNpb25UeXBlIHJlc3VsdCA9IENtcFZlcnNpb25UeXBlLmdldChpbml0aWFsVmFsdWUpOwogCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKQEAgLTU4Miw2ICs2OTcsNDYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlIGNyZWF0ZUNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCUNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlIHJlc3VsdCA9IENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb25jdXJyZW50TG9ja1R5cGVUeXBlIGNyZWF0ZUNvbmN1cnJlbnRMb2NrVHlwZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJQ29uY3VycmVudExvY2tUeXBlVHlwZSByZXN1bHQgPSBDb25jdXJyZW50TG9ja1R5cGVUeXBlLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb25jdXJyZW50TG9ja1R5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIE1ldGhvZEludGVyZmFjZVR5cGUgY3JlYXRlTWV0aG9kSW50ZXJmYWNlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewogCQlNZXRob2RJbnRlcmZhY2VUeXBlIHJlc3VsdCA9IE1ldGhvZEludGVyZmFjZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7CiAJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJApAQCAtNjgyLDYgKzgzNywyNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgVGltZVVuaXRUeXBlVHlwZSBjcmVhdGVUaW1lVW5pdFR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCVRpbWVVbml0VHlwZVR5cGUgcmVzdWx0ID0gVGltZVVuaXRUeXBlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0VGltZVVuaXRUeXBlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgY3JlYXRlVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSByZXN1bHQgPSBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7CiAJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJApAQCAtNzIzLDcgKzg5OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBDbXBWZXJzaW9uVHlwZSBjcmVhdGVDbXBWZXJzaW9uVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKENtcFZlcnNpb25UeXBlKWNyZWF0ZUNtcFZlcnNpb25UeXBlRnJvbVN0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLkNNUF9WRVJTSU9OX1RZUEUsIGluaXRpYWxWYWx1ZSk7CisJCXJldHVybiBjcmVhdGVDbXBWZXJzaW9uVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5DTVBfVkVSU0lPTl9UWVBFLCBpbml0aWFsVmFsdWUpOwogCX0KIAogCS8qKgpAQCAtNzQxLDcgKzkxNiw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBDTVJGaWVsZFR5cGUgY3JlYXRlQ01SRmllbGRUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQ01SRmllbGRUeXBlKWNyZWF0ZUNNUkZpZWxkVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5DTVJfRklFTERfVFlQRSwgaW5pdGlhbFZhbHVlKTsKKwkJcmV0dXJuIGNyZWF0ZUNNUkZpZWxkVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5DTVJfRklFTERfVFlQRSwgaW5pdGlhbFZhbHVlKTsKIAl9CiAKIAkvKioKQEAgLTc1OCw2ICs5MzMsNDIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlIGNyZWF0ZUNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXJldHVybiBjcmVhdGVDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5DT05DVVJSRU5DWV9NQU5BR0VNRU5UX1RZUEVfVFlQRSwgaW5pdGlhbFZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBjb252ZXJ0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVUb1N0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLkNPTkNVUlJFTkNZX01BTkFHRU1FTlRfVFlQRV9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29uY3VycmVudExvY2tUeXBlVHlwZSBjcmVhdGVDb25jdXJyZW50TG9ja1R5cGVUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXJldHVybiBjcmVhdGVDb25jdXJyZW50TG9ja1R5cGVUeXBlRnJvbVN0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLkNPTkNVUlJFTlRfTE9DS19UWVBFX1RZUEUsIGluaXRpYWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0Q29uY3VycmVudExvY2tUeXBlVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBjb252ZXJ0Q29uY3VycmVudExvY2tUeXBlVHlwZVRvU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuQ09OQ1VSUkVOVF9MT0NLX1RZUEVfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIFN0cmluZyBjcmVhdGVFamJDbGFzc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJcmV0dXJuIChTdHJpbmcpSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhKYXZhZWVQYWNrYWdlLkxpdGVyYWxzLkZVTExZX1FVQUxJRklFRF9DTEFTU19UWVBFLCBpbml0aWFsVmFsdWUpOwogCX0KQEAgLTc5NSw3ICsxMDA2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHVibGljIE1ldGhvZEludGVyZmFjZVR5cGUgY3JlYXRlTWV0aG9kSW50ZXJmYWNlVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKE1ldGhvZEludGVyZmFjZVR5cGUpY3JlYXRlTWV0aG9kSW50ZXJmYWNlVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfSU5URVJGQUNFX1RZUEUsIGluaXRpYWxWYWx1ZSk7CisJCXJldHVybiBjcmVhdGVNZXRob2RJbnRlcmZhY2VUeXBlRnJvbVN0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9JTlRFUkZBQ0VfVFlQRSwgaW5pdGlhbFZhbHVlKTsKIAl9CiAKIAkvKioKQEAgLTgzMSw3ICsxMDQyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHVibGljIE11bHRpcGxpY2l0eVR5cGUgY3JlYXRlTXVsdGlwbGljaXR5VHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKE11bHRpcGxpY2l0eVR5cGUpY3JlYXRlTXVsdGlwbGljaXR5VHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5NVUxUSVBMSUNJVFlfVFlQRSwgaW5pdGlhbFZhbHVlKTsKKwkJcmV0dXJuIGNyZWF0ZU11bHRpcGxpY2l0eVR5cGVGcm9tU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuTVVMVElQTElDSVRZX1RZUEUsIGluaXRpYWxWYWx1ZSk7CiAJfQogCiAJLyoqCkBAIC04NDksNyArMTA2MCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBQZXJzaXN0ZW5jZVR5cGUgY3JlYXRlUGVyc2lzdGVuY2VUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoUGVyc2lzdGVuY2VUeXBlKWNyZWF0ZVBlcnNpc3RlbmNlVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5QRVJTSVNURU5DRV9UWVBFLCBpbml0aWFsVmFsdWUpOworCQlyZXR1cm4gY3JlYXRlUGVyc2lzdGVuY2VUeXBlRnJvbVN0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLlBFUlNJU1RFTkNFX1RZUEUsIGluaXRpYWxWYWx1ZSk7CiAJfQogCiAJLyoqCkBAIC04NjcsNyArMTA3OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBSZXN1bHRUeXBlTWFwcGluZ1R5cGUgY3JlYXRlUmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoUmVzdWx0VHlwZU1hcHBpbmdUeXBlKWNyZWF0ZVJlc3VsdFR5cGVNYXBwaW5nVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5SRVNVTFRfVFlQRV9NQVBQSU5HX1RZUEUsIGluaXRpYWxWYWx1ZSk7CisJCXJldHVybiBjcmVhdGVSZXN1bHRUeXBlTWFwcGluZ1R5cGVGcm9tU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuUkVTVUxUX1RZUEVfTUFQUElOR19UWVBFLCBpbml0aWFsVmFsdWUpOwogCX0KIAogCS8qKgpAQCAtODg1LDcgKzEwOTYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgU2Vzc2lvblR5cGUgY3JlYXRlU2Vzc2lvblR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTZXNzaW9uVHlwZSljcmVhdGVTZXNzaW9uVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5TRVNTSU9OX1RZUEUsIGluaXRpYWxWYWx1ZSk7CisJCXJldHVybiBjcmVhdGVTZXNzaW9uVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5TRVNTSU9OX1RZUEUsIGluaXRpYWxWYWx1ZSk7CiAJfQogCiAJLyoqCkBAIC05MDIsOCArMTExMywyNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgVGltZVVuaXRUeXBlVHlwZSBjcmVhdGVUaW1lVW5pdFR5cGVUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXJldHVybiBjcmVhdGVUaW1lVW5pdFR5cGVUeXBlRnJvbVN0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLlRJTUVfVU5JVF9UWVBFX1RZUEUsIGluaXRpYWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0VGltZVVuaXRUeXBlVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBjb252ZXJ0VGltZVVuaXRUeXBlVHlwZVRvU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuVElNRV9VTklUX1RZUEVfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBjcmVhdGVUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUpY3JlYXRlVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRnJvbVN0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLlRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFLCBpbml0aWFsVmFsdWUpOworCQlyZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRnJvbVN0cmluZyhFamJQYWNrYWdlLkxpdGVyYWxzLlRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFLCBpbml0aWFsVmFsdWUpOwogCX0KIAogCS8qKgpAQCAtOTIxLDcgKzExNTAsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgVHJhbnNhY3Rpb25UeXBlIGNyZWF0ZVRyYW5zYWN0aW9uVHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFRyYW5zYWN0aW9uVHlwZSljcmVhdGVUcmFuc2FjdGlvblR5cGVGcm9tU3RyaW5nKEVqYlBhY2thZ2UuTGl0ZXJhbHMuVFJBTlNBQ1RJT05fVFlQRSwgaW5pdGlhbFZhbHVlKTsKKwkJcmV0dXJuIGNyZWF0ZVRyYW5zYWN0aW9uVHlwZUZyb21TdHJpbmcoRWpiUGFja2FnZS5MaXRlcmFscy5UUkFOU0FDVElPTl9UWVBFLCBpbml0aWFsVmFsdWUpOwogCX0KIAogCS8qKgpAQCAtOTQ4LDYgKzExNzcsNyBAQAogCSAqIEBkZXByZWNhdGVkCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBEZXByZWNhdGVkCiAJcHVibGljIHN0YXRpYyBFamJQYWNrYWdlIGdldFBhY2thZ2UoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYlBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYlBhY2thZ2VJbXBsLmphdmEKaW5kZXggNDc0NmEyMC4uYThmMjgxNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJQYWNrYWdlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRWpiUGFja2FnZUltcGwuamF2YQpAQCAtMTksMjIgKzE5LDI2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwubmFtZXNwYWNlLlhNTE5hbWVzcGFjZVBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luLkoyRUVDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVJbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5tZXRhZGF0YS5KYXZhZWVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjY2Vzc1RpbWVvdXRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kVGltZW91dFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzeW5jTWV0aG9kVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVBGaWVsZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DTVJGaWVsZFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ21wVmVyc2lvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudExvY2tUeXBlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TWV0aG9kVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRGVwZW5kc09uVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCUmVsYXRpb247CkBAIC02NSwxMyArNjksMTMgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZWN1cml0eUlkZW50aXR5VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TdGF0ZWZ1bFRpbWVvdXRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVVbml0VHlwZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJTY2hlZHVsZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC04NSw2ICs4OSwxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwcml2YXRlIEVDbGFzcyBhY2Nlc3NUaW1lb3V0VHlwZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwcml2YXRlIEVDbGFzcyBhY3RpdmF0aW9uQ29uZmlnRUNsYXNzID0gbnVsbDsKIAogCS8qKgpAQCAtMTEzLDYgKzEyNCwxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwcml2YXRlIEVDbGFzcyBhcm91bmRUaW1lb3V0VHlwZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwcml2YXRlIEVDbGFzcyBhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwogCiAJLyoqCkBAIC0xMjAsNiArMTM4LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXByaXZhdGUgRUNsYXNzIGFzeW5jTWV0aG9kVHlwZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwcml2YXRlIEVDbGFzcyBjbXBGaWVsZEVDbGFzcyA9IG51bGw7CiAKIAkvKioKQEAgLTEzNCw2ICsxNTksMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHJpdmF0ZSBFQ2xhc3MgY29uY3VycmVudE1ldGhvZFR5cGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHJpdmF0ZSBFQ2xhc3MgY29udGFpbmVyVHJhbnNhY3Rpb25UeXBlRUNsYXNzID0gbnVsbDsKIAogCS8qKgpAQCAtMTQxLDYgKzE3MywxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwcml2YXRlIEVDbGFzcyBkZXBlbmRzT25UeXBlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXByaXZhdGUgRUNsYXNzIGVqYkphckVDbGFzcyA9IG51bGw7CiAKIAkvKioKQEAgLTMwOSw2ICszNDgsMjcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHJpdmF0ZSBFQ2xhc3Mgc3RhdGVmdWxUaW1lb3V0VHlwZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0aW1lclNjaGVkdWxlVHlwZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB0aW1lclR5cGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHJpdmF0ZSBFRW51bSBjbXBWZXJzaW9uVHlwZUVFbnVtID0gbnVsbDsKIAogCS8qKgpAQCAtMzIzLDYgKzM4MywyMCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwcml2YXRlIEVFbnVtIGNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBjb25jdXJyZW50TG9ja1R5cGVUeXBlRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHJpdmF0ZSBFRW51bSBtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0gPSBudWxsOwogCiAJLyoqCkBAIC0zNTgsNiArNDMyLDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXByaXZhdGUgRUVudW0gdGltZVVuaXRUeXBlVHlwZUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXByaXZhdGUgRUVudW0gdHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0gPSBudWxsOwogCiAJLyoqCkBAIC0zODYsNiArNDY3LDIwIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXByaXZhdGUgRURhdGFUeXBlIGNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRURhdGFUeXBlIGNvbmN1cnJlbnRMb2NrVHlwZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHJpdmF0ZSBFRGF0YVR5cGUgZWpiQ2xhc3NUeXBlRURhdGFUeXBlID0gbnVsbDsKIAogCS8qKgpAQCAtNDQyLDYgKzUzNywxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwcml2YXRlIEVEYXRhVHlwZSB0aW1lVW5pdFR5cGVUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXByaXZhdGUgRURhdGFUeXBlIHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7CiAKIAkvKioKQEAgLTQ3NSwyMyArNTc3LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKwlwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CiAKIAkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIEVqYlBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBzZWUgI2VOU19VUkkKQEAgLTUwMyw3ICs1OTUsNyBAQAogCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoRWpiUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpOwogCiAJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEVqYlBhY2thZ2VJbXBsKCkpOworCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBFamJQYWNrYWdlSW1wbCgpKTsKIAogCQlpc0luaXRlZCA9IHRydWU7CiAKQEAgLTUxMSwzMiArNjAzLDIxIEBACiAJCVhNTE5hbWVzcGFjZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CiAKLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJV2ViUGFja2FnZUltcGwgdGhlV2ViUGFja2FnZSA9IChXZWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSA6IFdlYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKYXZhZWVQYWNrYWdlSW1wbCB0aGVKYXZhZWVQYWNrYWdlID0gKEphdmFlZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmF2YWVlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIDogSmF2YWVlUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSA9IChBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KIAkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKIAkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhZWVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CiAKIAkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQogCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUphdmFlZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKIAogCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCiAJCXRoZUVqYlBhY2thZ2UuZnJlZXplKCk7CiAKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoRWpiUGFja2FnZS5lTlNfVVJJLCB0aGVFamJQYWNrYWdlKTsKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEVqYlBhY2thZ2UuZU5TX1VSSTIsIHRoZUVqYlBhY2thZ2UpOworCisJCUoyRUVJbml0LmluaXRFTUZNb2RlbHMoKTsKIAkJcmV0dXJuIHRoZUVqYlBhY2thZ2U7CiAJfQogCkBAIC01NDUsNiArNjI2LDQyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QWNjZXNzVGltZW91dFR5cGUoKSB7CisJCXJldHVybiBhY2Nlc3NUaW1lb3V0VHlwZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY2Nlc3NUaW1lb3V0VHlwZV9UaW1lb3V0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWNjZXNzVGltZW91dFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY2Nlc3NUaW1lb3V0VHlwZV9Vbml0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWNjZXNzVGltZW91dFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY2Nlc3NUaW1lb3V0VHlwZV9JZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFjY2Vzc1RpbWVvdXRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVDbGFzcyBnZXRBY3RpdmF0aW9uQ29uZmlnKCkgewogCQlyZXR1cm4gYWN0aXZhdGlvbkNvbmZpZ0VDbGFzczsKIAl9CkBAIC02NDQsNyArNzYxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fSWQoKSB7CisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fSW5oZXJpdGVkKCkgewogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXBwbGljYXRpb25FeGNlcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKIAl9CiAKQEAgLTY1Myw2ICs3NzAsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fSWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhdGlvbkV4Y2VwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQ2xhc3MgZ2V0QXJvdW5kSW52b2tlVHlwZSgpIHsKIAkJcmV0dXJuIGFyb3VuZEludm9rZVR5cGVFQ2xhc3M7CiAJfQpAQCAtNjgwLDYgKzgwNiwzMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEFyb3VuZFRpbWVvdXRUeXBlKCkgeworCQlyZXR1cm4gYXJvdW5kVGltZW91dFR5cGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJvdW5kVGltZW91dFR5cGVfQ2xhc3MoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhcm91bmRUaW1lb3V0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEFyb3VuZFRpbWVvdXRUeXBlX01ldGhvZE5hbWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhcm91bmRUaW1lb3V0VHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQ2xhc3MgZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewogCQlyZXR1cm4gYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzOwogCX0KQEAgLTc2MSw2ICs5MTQsNDIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVDbGFzcyBnZXRBc3luY01ldGhvZFR5cGUoKSB7CisJCXJldHVybiBhc3luY01ldGhvZFR5cGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXN5bmNNZXRob2RUeXBlX01ldGhvZE5hbWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhc3luY01ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3luY01ldGhvZFR5cGVfTWV0aG9kUGFyYW1zKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXN5bmNNZXRob2RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXN5bmNNZXRob2RUeXBlX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXN5bmNNZXRob2RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVDbGFzcyBnZXRDTVBGaWVsZCgpIHsKIAkJcmV0dXJuIGNtcEZpZWxkRUNsYXNzOwogCX0KQEAgLTg0Miw2ICsxMDMxLDUxIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Q29uY3VycmVudE1ldGhvZFR5cGUoKSB7CisJCXJldHVybiBjb25jdXJyZW50TWV0aG9kVHlwZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25jdXJyZW50TWV0aG9kVHlwZV9NZXRob2QoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSljb25jdXJyZW50TWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbmN1cnJlbnRNZXRob2RUeXBlX0xvY2soKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljb25jdXJyZW50TWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbmN1cnJlbnRNZXRob2RUeXBlX0FjY2Vzc1RpbWVvdXQoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSljb25jdXJyZW50TWV0aG9kVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbmN1cnJlbnRNZXRob2RUeXBlX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29uY3VycmVudE1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUNsYXNzIGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSgpIHsKIAkJcmV0dXJuIGNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUVDbGFzczsKIAl9CkBAIC04ODcsNiArMTEyMSwzMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldERlcGVuZHNPblR5cGUoKSB7CisJCXJldHVybiBkZXBlbmRzT25UeXBlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldERlcGVuZHNPblR5cGVfRWpiTmFtZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWRlcGVuZHNPblR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXBlbmRzT25UeXBlX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVwZW5kc09uVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQ2xhc3MgZ2V0RUpCSmFyKCkgewogCQlyZXR1cm4gZWpiSmFyRUNsYXNzOwogCX0KQEAgLTg5NywxNSArMTE1OCw2IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphcl9EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJfRGlzcGxheU5hbWVzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CiAJfQogCkBAIC05MTQsNyArMTE2Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphcl9JY29ucygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJfRGlzcGxheU5hbWVzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CiAJfQogCkBAIC05MjMsNyArMTE3NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphcl9FbnRlcnByaXNlQmVhbnMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCSmFyX0ljb25zKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CiAJfQogCkBAIC05MzIsNyArMTE4NCwxNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJfSW50ZXJjZXB0b3JzKCkgeworCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQkphcl9Nb2R1bGVOYW1lKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWVqYkphckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwogCX0KIApAQCAtOTQxLDcgKzEyMDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJfUmVsYXRpb25zaGlwcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFSkJKYXJfSW50ZXJjZXB0b3JzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CiAJfQogCkBAIC05NTAsNyArMTIxMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RUpCSmFyX1JlbGF0aW9uc2hpcHMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKIAl9CiAKQEAgLTk1OSw4ICsxMjIwLDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVqYkphckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKIAl9CiAKIAkvKioKQEAgLTk2OCw3ICsxMjI5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCSmFyX0lkKCkgeworCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQkphcl9FamJDbGllbnRKYXIoKSB7CiAJCXJldHVybiAoRUF0dHJpYnV0ZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKIAl9CiAKQEAgLTk3Nyw3ICsxMjM4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCSmFyX01ldGFkYXRhQ29tcGxldGUoKSB7CisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCSmFyX0lkKCkgewogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7CiAJfQogCkBAIC05ODYsNyArMTI0Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQkphcl9WZXJzaW9uKCkgeworCXB1YmxpYyBFQXR0cmlidXRlIGdldEVKQkphcl9NZXRhZGF0YUNvbXBsZXRlKCkgewogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZWpiSmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwogCX0KIApAQCAtOTk1LDYgKzEyNTYsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RUpCSmFyX1ZlcnNpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSllamJKYXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVDbGFzcyBnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKIAkJcmV0dXJuIGVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzOwogCX0KQEAgLTE0NzIsNyArMTc0Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fU2VjdXJpdHlSb2xlUmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX0RhdGFTb3VyY2UoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwogCX0KIApAQCAtMTQ4MSw3ICsxNzUxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9TZWN1cml0eUlkZW50aXR5KCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fU2VjdXJpdHlSb2xlUmVmcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWVudGl0eUJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOSk7CiAJfQogCkBAIC0xNDkwLDcgKzE3NjAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1F1ZXJpZXMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5QmVhbl9TZWN1cml0eUlkZW50aXR5KCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKIAl9CiAKQEAgLTE0OTksOCArMTc2OSwxNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1F1ZXJpZXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eUJlYW5fSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSllbnRpdHlCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzEpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5QmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKIAl9CiAKIAkvKioKQEAgLTE3NjAsNyArMjAzOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9FbnZFbnRyaWVzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9Bcm91bmRUaW1lb3V0cygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwogCX0KIApAQCAtMTc2OSw3ICsyMDQ4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX0VqYlJlZnMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX0VudkVudHJpZXMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKIAl9CiAKQEAgLTE3NzgsNyArMjA1Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9FamJMb2NhbFJlZnMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX0VqYlJlZnMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSlpbnRlcmNlcHRvclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKIAl9CiAKQEAgLTE3ODcsNyArMjA2Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9TZXJ2aWNlUmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfRWpiTG9jYWxSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CiAJfQogCkBAIC0xNzk2LDcgKzIwNzUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VSZWZzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9TZXJ2aWNlUmVmcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwogCX0KIApAQCAtMTgwNSw3ICsyMDg0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1Jlc291cmNlRW52UmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CiAJfQogCkBAIC0xODE0LDcgKzIwOTMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VFbnZSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7CiAJfQogCkBAIC0xODIzLDcgKzIxMDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKIAl9CiAKQEAgLTE4MzIsNyArMjExMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwogCX0KIApAQCAtMTg0MSw3ICsyMTIwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1Bvc3RDb25zdHJ1Y3RzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwogCX0KIApAQCAtMTg1MCw3ICsyMTI5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX1ByZURlc3Ryb3lzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9Qb3N0Q29uc3RydWN0cygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKIAl9CiAKQEAgLTE4NTksNyArMjEzOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9Qb3N0QWN0aXZhdGVzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9QcmVEZXN0cm95cygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKIAl9CiAKQEAgLTE4NjgsNyArMjE0Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9QcmVQYXNzaXZhdGVzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9EYXRhU291cmNlKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwogCX0KIApAQCAtMTg3Nyw4ICsyMTU2LDI2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9Qb3N0QWN0aXZhdGVzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEludGVyY2VwdG9yVHlwZV9QcmVQYXNzaXZhdGVzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpaW50ZXJjZXB0b3JUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQXR0cmlidXRlIGdldEludGVyY2VwdG9yVHlwZV9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWludGVyY2VwdG9yVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKIAl9CiAKIAkvKioKQEAgLTE5NjcsOCArMjI2NCw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1RyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fVGltZXIoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwogCX0KIAogCS8qKgpAQCAtMTk3Niw3ICsyMjczLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9UcmFuc2FjdGlvblR5cGUoKSB7CiAJCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwogCX0KIApAQCAtMTk4NSw3ICsyMjgyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uTGluaygpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25UeXBlKCkgewogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMCk7CiAJfQogCkBAIC0xOTk0LDggKzIyOTEsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9BY3RpdmF0aW9uQ29uZmlnKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7CisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uTGluaygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwogCX0KIAogCS8qKgpAQCAtMjAwMyw3ICsyMzAwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fQXJvdW5kSW52b2tlcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9BY3RpdmF0aW9uQ29uZmlnKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7CiAJfQogCkBAIC0yMDEyLDcgKzIzMDksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9FbnZFbnRyaWVzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Fyb3VuZEludm9rZXMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKIAl9CiAKQEAgLTIwMjEsNyArMjMxOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYlJlZnMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fQXJvdW5kVGltZW91dHMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKIAl9CiAKQEAgLTIwMzAsNyArMjMyNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYkxvY2FsUmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9FbnZFbnRyaWVzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7CiAJfQogCkBAIC0yMDM5LDcgKzIzMzYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9TZXJ2aWNlUmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNik7CiAJfQogCkBAIC0yMDQ4LDcgKzIzNDUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZVJlZnMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiTG9jYWxSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7CiAJfQogCkBAIC0yMDU3LDcgKzIzNTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZUVudlJlZnMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VydmljZVJlZnMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKIAl9CiAKQEAgLTIwNjYsNyArMjM2Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fUmVzb3VyY2VSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7CiAJfQogCkBAIC0yMDc1LDcgKzIzNzIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1Jlc291cmNlRW52UmVmcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwogCX0KIApAQCAtMjA4NCw3ICsyMzgxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7CiAJfQogCkBAIC0yMDkzLDcgKzIzOTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9Qb3N0Q29uc3RydWN0cygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMik7CiAJfQogCkBAIC0yMTAyLDcgKzIzOTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9QcmVEZXN0cm95cygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7CiAJfQogCkBAIC0yMTExLDcgKzI0MDgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9TZWN1cml0eUlkZW50aXR5KCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1Bvc3RDb25zdHJ1Y3RzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7CiAJfQogCkBAIC0yMTIwLDggKzI0MTcsNDQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fUHJlRGVzdHJveXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9EYXRhU291cmNlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VjdXJpdHlSb2xlUmVmKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VjdXJpdHlJZGVudGl0eSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7CisJCXJldHVybiAoRUF0dHJpYnV0ZSltZXNzYWdlRHJpdmVuQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI5KTsKIAl9CiAKIAkvKioKQEAgLTI2NjAsOCArMjk5Myw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX1NlcnZpY2VFbmRwb2ludCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0xvY2FsQmVhbigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwogCX0KIAogCS8qKgpAQCAtMjY2OSw3ICszMDAyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fRWpiQ2xhc3MoKSB7CisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fU2VydmljZUVuZHBvaW50KCkgewogCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7CiAJfQogCkBAIC0yNjc4LDcgKzMwMTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9TZXNzaW9uVHlwZSgpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9FamJDbGFzcygpIHsKIAkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwogCX0KIApAQCAtMjY4Nyw4ICszMDIwLDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fVGltZW91dE1ldGhvZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX1Nlc3Npb25UeXBlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7CiAJfQogCiAJLyoqCkBAIC0yNjk2LDcgKzMwMjksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Jbml0TWV0aG9kcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9TdGF0ZWZ1bFRpbWVvdXQoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKIAl9CiAKQEAgLTI3MDUsNyArMzAzOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1JlbW92ZU1ldGhvZHMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fVGltZW91dE1ldGhvZCgpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwogCX0KIApAQCAtMjcxNCw4ICszMDQ3LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fVGltZXIoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKIAl9CiAKIAkvKioKQEAgLTI3MjMsOCArMzA1Niw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0Fyb3VuZEludm9rZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9Jbml0T25TdGFydHVwKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7CiAJfQogCiAJLyoqCkBAIC0yNzMyLDggKzMwNjUsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9FbnZFbnRyaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOSk7CisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwogCX0KIAogCS8qKgpAQCAtMjc0MSw3ICszMDc0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fRWpiUmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Db25jdXJyZW50TWV0aG9kKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMCk7CiAJfQogCkBAIC0yNzUwLDcgKzMwODMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9FamJMb2NhbFJlZnMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fRGVwZW5kc09uKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7CiAJfQogCkBAIC0yNzU5LDcgKzMwOTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9TZXJ2aWNlUmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Jbml0TWV0aG9kcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjIpOwogCX0KIApAQCAtMjc2OCw3ICszMTAxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUmVzb3VyY2VSZWZzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1JlbW92ZU1ldGhvZHMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIzKTsKIAl9CiAKQEAgLTI3NzcsNyArMzExMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1Jlc291cmNlRW52UmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Bc3luY01ldGhvZCgpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOwogCX0KIApAQCAtMjc4Niw4ICszMTE5LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX1RyYW5zYWN0aW9uVHlwZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwogCX0KIAogCS8qKgpAQCAtMjc5NSw3ICszMTI4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9BZnRlckJlZ2luTWV0aG9kKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7CiAJfQogCkBAIC0yODA0LDcgKzMxMzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0JlZm9yZUNvbXBsZXRpb25NZXRob2QoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI3KTsKIAl9CiAKQEAgLTI4MTMsNyArMzE0Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1Bvc3RDb25zdHJ1Y3RzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0FmdGVyQ29tcGxldGlvbk1ldGhvZCgpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwogCX0KIApAQCAtMjgyMiw3ICszMTU1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUHJlRGVzdHJveXMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fQXJvdW5kSW52b2tlcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwogCX0KIApAQCAtMjgzMSw3ICszMTY0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUG9zdEFjdGl2YXRlcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Bcm91bmRUaW1lb3V0cygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzApOwogCX0KIApAQCAtMjg0MCw3ICszMTczLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUHJlUGFzc2l2YXRlcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9FbnZFbnRyaWVzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMSk7CiAJfQogCkBAIC0yODQ5LDcgKzMxODIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9TZWN1cml0eVJvbGVSZWZzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0VqYlJlZnMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKIAl9CiAKQEAgLTI4NTgsNyArMzE5MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1NlY3VyaXR5SWRlbnRpdGllcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9FamJMb2NhbFJlZnMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMzKTsKIAl9CiAKQEAgLTI4NjcsOCArMzIwMCwzMzIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fU2VydmljZVJlZnMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9SZXNvdXJjZVJlZnMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9SZXNvdXJjZUVudlJlZnMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM2KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1BlcnNpc3RlbmNlVW5pdFJlZnMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM5KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Qb3N0Q29uc3RydWN0cygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1ByZURlc3Ryb3lzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fRGF0YVNvdXJjZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1Bvc3RBY3RpdmF0ZXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9QcmVQYXNzaXZhdGVzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fU2VjdXJpdHlSb2xlUmVmcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1NlY3VyaXR5SWRlbnRpdGllcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNlc3Npb25CZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlc3Npb25CZWFuX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2Vzc2lvbkJlYW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNCk7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzZXNzaW9uQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFN0YXRlZnVsVGltZW91dFR5cGUoKSB7CisJCXJldHVybiBzdGF0ZWZ1bFRpbWVvdXRUeXBlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFN0YXRlZnVsVGltZW91dFR5cGVfVGltZW91dCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXN0YXRlZnVsVGltZW91dFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTdGF0ZWZ1bFRpbWVvdXRUeXBlX1VuaXQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzdGF0ZWZ1bFRpbWVvdXRUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U3RhdGVmdWxUaW1lb3V0VHlwZV9JZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXN0YXRlZnVsVGltZW91dFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRpbWVyU2NoZWR1bGVUeXBlKCkgeworCQlyZXR1cm4gdGltZXJTY2hlZHVsZVR5cGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGltZXJTY2hlZHVsZVR5cGVfU2Vjb25kKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGltZXJTY2hlZHVsZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lclNjaGVkdWxlVHlwZV9NaW51dGUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0aW1lclNjaGVkdWxlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVyU2NoZWR1bGVUeXBlX0hvdXIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0aW1lclNjaGVkdWxlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVyU2NoZWR1bGVUeXBlX0RheU9mTW9udGgoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0aW1lclNjaGVkdWxlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVyU2NoZWR1bGVUeXBlX01vbnRoKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGltZXJTY2hlZHVsZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lclNjaGVkdWxlVHlwZV9EYXlPZldlZWsoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0aW1lclNjaGVkdWxlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVyU2NoZWR1bGVUeXBlX1llYXIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0aW1lclNjaGVkdWxlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVyU2NoZWR1bGVUeXBlX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGltZXJTY2hlZHVsZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFRpbWVyVHlwZSgpIHsKKwkJcmV0dXJuIHRpbWVyVHlwZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUaW1lclR5cGVfRGVzY3JpcHRpb24oKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl0aW1lclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUaW1lclR5cGVfU2NoZWR1bGUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl0aW1lclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lclR5cGVfU3RhcnQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl0aW1lclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lclR5cGVfRW5kKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGltZXJUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0VGltZXJUeXBlX1RpbWVvdXRNZXRob2QoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl0aW1lclR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lclR5cGVfUGVyc2lzdGVudCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRpbWVyVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVyVHlwZV9UaW1lem9uZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXRpbWVyVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVyVHlwZV9JbmZvKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGltZXJUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGltZXJUeXBlX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGltZXJUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CiAJfQogCiAJLyoqCkBAIC0yODk0LDYgKzM1NTEsMjQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVFbnVtIGdldENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlKCkgeworCQlyZXR1cm4gY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVFRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0Q29uY3VycmVudExvY2tUeXBlVHlwZSgpIHsKKwkJcmV0dXJuIGNvbmN1cnJlbnRMb2NrVHlwZVR5cGVFRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUVudW0gZ2V0TWV0aG9kSW50ZXJmYWNlVHlwZSgpIHsKIAkJcmV0dXJuIG1ldGhvZEludGVyZmFjZVR5cGVFRW51bTsKIAl9CkBAIC0yOTM5LDYgKzM2MTQsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVFbnVtIGdldFRpbWVVbml0VHlwZVR5cGUoKSB7CisJCXJldHVybiB0aW1lVW5pdFR5cGVUeXBlRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVFbnVtIGdldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSgpIHsKIAkJcmV0dXJuIHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtOwogCX0KQEAgLTI5NzUsNiArMzY1OSwyNCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgRURhdGFUeXBlIGdldENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlT2JqZWN0KCkgeworCQlyZXR1cm4gY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVPYmplY3RFRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRDb25jdXJyZW50TG9ja1R5cGVUeXBlT2JqZWN0KCkgeworCQlyZXR1cm4gY29uY3VycmVudExvY2tUeXBlVHlwZU9iamVjdEVEYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRURhdGFUeXBlIGdldEVqYkNsYXNzVHlwZSgpIHsKIAkJcmV0dXJuIGVqYkNsYXNzVHlwZUVEYXRhVHlwZTsKIAl9CkBAIC0zMDQ3LDYgKzM3NDksMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRUaW1lVW5pdFR5cGVUeXBlT2JqZWN0KCkgeworCQlyZXR1cm4gdGltZVVuaXRUeXBlVHlwZU9iamVjdEVEYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRURhdGFUeXBlIGdldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdCgpIHsKIAkJcmV0dXJuIHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdEVEYXRhVHlwZTsKIAl9CkBAIC0zMDg4LDYgKzM3OTksMTEgQEAKIAkJaXNDcmVhdGVkID0gdHJ1ZTsKIAogCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJYWNjZXNzVGltZW91dFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNDRVNTX1RJTUVPVVRfVFlQRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYWNjZXNzVGltZW91dFR5cGVFQ2xhc3MsIEFDQ0VTU19USU1FT1VUX1RZUEVfX1RJTUVPVVQpOworCQljcmVhdGVFQXR0cmlidXRlKGFjY2Vzc1RpbWVvdXRUeXBlRUNsYXNzLCBBQ0NFU1NfVElNRU9VVF9UWVBFX19VTklUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhY2Nlc3NUaW1lb3V0VHlwZUVDbGFzcywgQUNDRVNTX1RJTUVPVVRfVFlQRV9fSUQpOworCiAJCWFjdGl2YXRpb25Db25maWdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZBVElPTl9DT05GSUcpOwogCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2YXRpb25Db25maWdFQ2xhc3MsIEFDVElWQVRJT05fQ09ORklHX19ERVNDUklQVElPTlMpOwogCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2YXRpb25Db25maWdFQ2xhc3MsIEFDVElWQVRJT05fQ09ORklHX19BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUSUVTKTsKQEAgLTMxMDEsMTIgKzM4MTcsMTcgQEAKIAkJYXBwbGljYXRpb25FeGNlcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQVRJT05fRVhDRVBUSU9OKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhdGlvbkV4Y2VwdGlvbkVDbGFzcywgQVBQTElDQVRJT05fRVhDRVBUSU9OX19FWENFUFRJT05fQ0xBU1MpOwogCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uRXhjZXB0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9FWENFUFRJT05fX1JPTExCQUNLKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhcHBsaWNhdGlvbkV4Y2VwdGlvbkVDbGFzcywgQVBQTElDQVRJT05fRVhDRVBUSU9OX19JTkhFUklURUQpOwogCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2F0aW9uRXhjZXB0aW9uRUNsYXNzLCBBUFBMSUNBVElPTl9FWENFUFRJT05fX0lEKTsKIAogCQlhcm91bmRJbnZva2VUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFST1VORF9JTlZPS0VfVFlQRSk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoYXJvdW5kSW52b2tlVHlwZUVDbGFzcywgQVJPVU5EX0lOVk9LRV9UWVBFX19DTEFTUyk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoYXJvdW5kSW52b2tlVHlwZUVDbGFzcywgQVJPVU5EX0lOVk9LRV9UWVBFX19NRVRIT0RfTkFNRSk7CiAKKwkJYXJvdW5kVGltZW91dFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJPVU5EX1RJTUVPVVRfVFlQRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYXJvdW5kVGltZW91dFR5cGVFQ2xhc3MsIEFST1VORF9USU1FT1VUX1RZUEVfX0NMQVNTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhcm91bmRUaW1lb3V0VHlwZUVDbGFzcywgQVJPVU5EX1RJTUVPVVRfVFlQRV9fTUVUSE9EX05BTUUpOworCiAJCWFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBU1NFTUJMWV9ERVNDUklQVE9SKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MsIEFTU0VNQkxZX0RFU0NSSVBUT1JfX1NFQ1VSSVRZX1JPTEVTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MsIEFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUyk7CkBAIC0zMTE3LDYgKzM4MzgsMTEgQEAKIAkJY3JlYXRlRVJlZmVyZW5jZShhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MsIEFTU0VNQkxZX0RFU0NSSVBUT1JfX0FQUExJQ0FUSU9OX0VYQ0VQVElPTlMpOwogCQljcmVhdGVFQXR0cmlidXRlKGFzc2VtYmx5RGVzY3JpcHRvckVDbGFzcywgQVNTRU1CTFlfREVTQ1JJUFRPUl9fSUQpOwogCisJCWFzeW5jTWV0aG9kVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBU1lOQ19NRVRIT0RfVFlQRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYXN5bmNNZXRob2RUeXBlRUNsYXNzLCBBU1lOQ19NRVRIT0RfVFlQRV9fTUVUSE9EX05BTUUpOworCQljcmVhdGVFUmVmZXJlbmNlKGFzeW5jTWV0aG9kVHlwZUVDbGFzcywgQVNZTkNfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVMpOworCQljcmVhdGVFQXR0cmlidXRlKGFzeW5jTWV0aG9kVHlwZUVDbGFzcywgQVNZTkNfTUVUSE9EX1RZUEVfX0lEKTsKKwogCQljbXBGaWVsZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDTVBfRklFTEQpOwogCQljcmVhdGVFUmVmZXJlbmNlKGNtcEZpZWxkRUNsYXNzLCBDTVBfRklFTERfX0RFU0NSSVBUSU9OUyk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoY21wRmllbGRFQ2xhc3MsIENNUF9GSUVMRF9fRklFTERfTkFNRSk7CkBAIC0zMTI4LDEzICszODU0LDI0IEBACiAJCWNyZWF0ZUVBdHRyaWJ1dGUoY21yRmllbGRFQ2xhc3MsIENNUl9GSUVMRF9fQ01SX0ZJRUxEX1RZUEUpOwogCQljcmVhdGVFQXR0cmlidXRlKGNtckZpZWxkRUNsYXNzLCBDTVJfRklFTERfX0lEKTsKIAorCQljb25jdXJyZW50TWV0aG9kVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05DVVJSRU5UX01FVEhPRF9UWVBFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShjb25jdXJyZW50TWV0aG9kVHlwZUVDbGFzcywgQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fTUVUSE9EKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb25jdXJyZW50TWV0aG9kVHlwZUVDbGFzcywgQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fTE9DSyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoY29uY3VycmVudE1ldGhvZFR5cGVFQ2xhc3MsIENPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX0FDQ0VTU19USU1FT1VUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb25jdXJyZW50TWV0aG9kVHlwZUVDbGFzcywgQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fSUQpOworCiAJCWNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRSk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UoY29udGFpbmVyVHJhbnNhY3Rpb25UeXBlRUNsYXNzLCBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fREVTQ1JJUFRJT05TKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShjb250YWluZXJUcmFuc2FjdGlvblR5cGVFQ2xhc3MsIENPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19NRVRIT0RTKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShjb250YWluZXJUcmFuc2FjdGlvblR5cGVFQ2xhc3MsIENPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFX19UUkFOU19BVFRSSUJVVEUpOwogCQljcmVhdGVFQXR0cmlidXRlKGNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUVDbGFzcywgQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEVfX0lEKTsKIAorCQlkZXBlbmRzT25UeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFUEVORFNfT05fVFlQRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGVwZW5kc09uVHlwZUVDbGFzcywgREVQRU5EU19PTl9UWVBFX19FSkJfTkFNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoZGVwZW5kc09uVHlwZUVDbGFzcywgREVQRU5EU19PTl9UWVBFX19JRCk7CisKIAkJZWpiSmFyRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVKQl9KQVIpOworCQljcmVhdGVFQXR0cmlidXRlKGVqYkphckVDbGFzcywgRUpCX0pBUl9fTU9EVUxFX05BTUUpOwogCQljcmVhdGVFUmVmZXJlbmNlKGVqYkphckVDbGFzcywgRUpCX0pBUl9fREVTQ1JJUFRJT05TKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShlamJKYXJFQ2xhc3MsIEVKQl9KQVJfX0RJU1BMQVlfTkFNRVMpOwogCQljcmVhdGVFUmVmZXJlbmNlKGVqYkphckVDbGFzcywgRUpCX0pBUl9fSUNPTlMpOwpAQCAtMzIwNCw2ICszOTQxLDcgQEAKIAkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fUE9TVF9DT05TVFJVQ1RTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fUFJFX0RFU1RST1lTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlCZWFuRUNsYXNzLCBFTlRJVFlfQkVBTl9fREFUQV9TT1VSQ0UpOwogCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMpOwogCQljcmVhdGVFUmVmZXJlbmNlKGVudGl0eUJlYW5FQ2xhc3MsIEVOVElUWV9CRUFOX19TRUNVUklUWV9JREVOVElUWSk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UoZW50aXR5QmVhbkVDbGFzcywgRU5USVRZX0JFQU5fX1FVRVJJRVMpOwpAQCAtMzI0Miw2ICszOTgwLDcgQEAKIAkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX0RFU0NSSVBUSU9OUyk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoaW50ZXJjZXB0b3JUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTUyk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfSU5WT0tFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfVElNRU9VVFMpOwogCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fRU5WX0VOVFJJRVMpOwogCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fRUpCX1JFRlMpOwogCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fRUpCX0xPQ0FMX1JFRlMpOwpAQCAtMzI1Myw2ICszOTkyLDcgQEAKIAkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UoaW50ZXJjZXB0b3JUeXBlRUNsYXNzLCBJTlRFUkNFUFRPUl9UWVBFX19QT1NUX0NPTlNUUlVDVFMpOwogCQljcmVhdGVFUmVmZXJlbmNlKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSU5URVJDRVBUT1JfVFlQRV9fUFJFX0RFU1RST1lTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX0RBVEFfU09VUkNFKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQUNUSVZBVEVTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX1BSRV9QQVNTSVZBVEVTKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShpbnRlcmNlcHRvclR5cGVFQ2xhc3MsIElOVEVSQ0VQVE9SX1RZUEVfX0lEKTsKQEAgLTMyNjYsMTEgKzQwMDYsMTMgQEAKIAkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0NMQVNTKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHSU5HX1RZUEUpOwogCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19USU1FT1VUX01FVEhPRCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVSKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRSk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fVFlQRSk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fTElOSyk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0FDVElWQVRJT05fQ09ORklHKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX0lOVk9LRVMpOworCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19BUk9VTkRfVElNRU9VVFMpOwogCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19FTlZfRU5UUklFUyk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9SRUZTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0xPQ0FMX1JFRlMpOwpAQCAtMzI4Miw2ICs0MDI0LDggQEAKIAkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fUE9TVF9DT05TVFJVQ1RTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fUFJFX0RFU1RST1lTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fREFUQV9TT1VSQ0UpOworCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9ST0xFX1JFRik7CiAJCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZURyaXZlbkJlYW5FQ2xhc3MsIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlRHJpdmVuQmVhbkVDbGFzcywgTUVTU0FHRV9EUklWRU5fQkVBTl9fSUQpOwogCkBAIC0zMzU0LDE0ICs0MDk4LDI2IEBACiAJCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fTE9DQUwpOwogCQljcmVhdGVFQXR0cmlidXRlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0JVU0lORVNTX0xPQ0FMUyk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fQlVTSU5FU1NfUkVNT1RFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fTE9DQUxfQkVBTik7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fU0VSVklDRV9FTkRQT0lOVCk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fRUpCX0NMQVNTKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19TRVNTSU9OX1RZUEUpOworCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1NUQVRFRlVMX1RJTUVPVVQpOwogCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1RJTUVPVVRfTUVUSE9EKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19USU1FUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fSU5JVF9PTl9TVEFSVFVQKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19DT05DVVJSRU5DWV9NQU5BR0VNRU5UX1RZUEUpOworCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0NPTkNVUlJFTlRfTUVUSE9EKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19ERVBFTkRTX09OKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19JTklUX01FVEhPRFMpOwogCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1JFTU9WRV9NRVRIT0RTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19BU1lOQ19NRVRIT0QpOwogCQljcmVhdGVFQXR0cmlidXRlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEUpOworCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0FGVEVSX0JFR0lOX01FVEhPRCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fQkVGT1JFX0NPTVBMRVRJT05fTUVUSE9EKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19BRlRFUl9DT01QTEVUSU9OX01FVEhPRCk7CiAJCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fQVJPVU5EX0lOVk9LRVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0FST1VORF9USU1FT1VUUyk7CiAJCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fRU5WX0VOVFJJRVMpOwogCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX0VKQl9SRUZTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19FSkJfTE9DQUxfUkVGUyk7CkBAIC0zMzczLDI2ICs0MTI5LDU4IEBACiAJCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19QT1NUX0NPTlNUUlVDVFMpOwogCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1BSRV9ERVNUUk9ZUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fREFUQV9TT1VSQ0UpOwogCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25CZWFuRUNsYXNzLCBTRVNTSU9OX0JFQU5fX1BPU1RfQUNUSVZBVEVTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19QUkVfUEFTU0lWQVRFUyk7CiAJCWNyZWF0ZUVSZWZlcmVuY2Uoc2Vzc2lvbkJlYW5FQ2xhc3MsIFNFU1NJT05fQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19TRUNVUklUWV9JREVOVElUSUVTKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQmVhbkVDbGFzcywgU0VTU0lPTl9CRUFOX19JRCk7CiAKKwkJc3RhdGVmdWxUaW1lb3V0VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTVEFURUZVTF9USU1FT1VUX1RZUEUpOworCQljcmVhdGVFQXR0cmlidXRlKHN0YXRlZnVsVGltZW91dFR5cGVFQ2xhc3MsIFNUQVRFRlVMX1RJTUVPVVRfVFlQRV9fVElNRU9VVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc3RhdGVmdWxUaW1lb3V0VHlwZUVDbGFzcywgU1RBVEVGVUxfVElNRU9VVF9UWVBFX19VTklUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzdGF0ZWZ1bFRpbWVvdXRUeXBlRUNsYXNzLCBTVEFURUZVTF9USU1FT1VUX1RZUEVfX0lEKTsKKworCQl0aW1lclNjaGVkdWxlVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUSU1FUl9TQ0hFRFVMRV9UWVBFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0aW1lclNjaGVkdWxlVHlwZUVDbGFzcywgVElNRVJfU0NIRURVTEVfVFlQRV9fU0VDT05EKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0aW1lclNjaGVkdWxlVHlwZUVDbGFzcywgVElNRVJfU0NIRURVTEVfVFlQRV9fTUlOVVRFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0aW1lclNjaGVkdWxlVHlwZUVDbGFzcywgVElNRVJfU0NIRURVTEVfVFlQRV9fSE9VUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodGltZXJTY2hlZHVsZVR5cGVFQ2xhc3MsIFRJTUVSX1NDSEVEVUxFX1RZUEVfX0RBWV9PRl9NT05USCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodGltZXJTY2hlZHVsZVR5cGVFQ2xhc3MsIFRJTUVSX1NDSEVEVUxFX1RZUEVfX01PTlRIKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0aW1lclNjaGVkdWxlVHlwZUVDbGFzcywgVElNRVJfU0NIRURVTEVfVFlQRV9fREFZX09GX1dFRUspOworCQljcmVhdGVFQXR0cmlidXRlKHRpbWVyU2NoZWR1bGVUeXBlRUNsYXNzLCBUSU1FUl9TQ0hFRFVMRV9UWVBFX19ZRUFSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0aW1lclNjaGVkdWxlVHlwZUVDbGFzcywgVElNRVJfU0NIRURVTEVfVFlQRV9fSUQpOworCisJCXRpbWVyVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUSU1FUl9UWVBFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh0aW1lclR5cGVFQ2xhc3MsIFRJTUVSX1RZUEVfX0RFU0NSSVBUSU9OKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh0aW1lclR5cGVFQ2xhc3MsIFRJTUVSX1RZUEVfX1NDSEVEVUxFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0aW1lclR5cGVFQ2xhc3MsIFRJTUVSX1RZUEVfX1NUQVJUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0aW1lclR5cGVFQ2xhc3MsIFRJTUVSX1RZUEVfX0VORCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UodGltZXJUeXBlRUNsYXNzLCBUSU1FUl9UWVBFX19USU1FT1VUX01FVEhPRCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUodGltZXJUeXBlRUNsYXNzLCBUSU1FUl9UWVBFX19QRVJTSVNURU5UKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0aW1lclR5cGVFQ2xhc3MsIFRJTUVSX1RZUEVfX1RJTUVaT05FKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh0aW1lclR5cGVFQ2xhc3MsIFRJTUVSX1RZUEVfX0lORk8pOworCQljcmVhdGVFQXR0cmlidXRlKHRpbWVyVHlwZUVDbGFzcywgVElNRVJfVFlQRV9fSUQpOworCiAJCS8vIENyZWF0ZSBlbnVtcwogCQljbXBWZXJzaW9uVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oQ01QX1ZFUlNJT05fVFlQRSk7CiAJCWNtckZpZWxkVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oQ01SX0ZJRUxEX1RZUEUpOworCQljb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oQ09OQ1VSUkVOQ1lfTUFOQUdFTUVOVF9UWVBFX1RZUEUpOworCQljb25jdXJyZW50TG9ja1R5cGVUeXBlRUVudW0gPSBjcmVhdGVFRW51bShDT05DVVJSRU5UX0xPQ0tfVFlQRV9UWVBFKTsKIAkJbWV0aG9kSW50ZXJmYWNlVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oTUVUSE9EX0lOVEVSRkFDRV9UWVBFKTsKIAkJbXVsdGlwbGljaXR5VHlwZUVFbnVtID0gY3JlYXRlRUVudW0oTVVMVElQTElDSVRZX1RZUEUpOwogCQlwZXJzaXN0ZW5jZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFBFUlNJU1RFTkNFX1RZUEUpOwogCQlyZXN1bHRUeXBlTWFwcGluZ1R5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFJFU1VMVF9UWVBFX01BUFBJTkdfVFlQRSk7CiAJCXNlc3Npb25UeXBlRUVudW0gPSBjcmVhdGVFRW51bShTRVNTSU9OX1RZUEUpOworCQl0aW1lVW5pdFR5cGVUeXBlRUVudW0gPSBjcmVhdGVFRW51bShUSU1FX1VOSVRfVFlQRV9UWVBFKTsKIAkJdHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0gPSBjcmVhdGVFRW51bShUUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRSk7CiAJCXRyYW5zYWN0aW9uVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oVFJBTlNBQ1RJT05fVFlQRSk7CiAKIAkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKIAkJY21wVmVyc2lvblR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoQ01QX1ZFUlNJT05fVFlQRV9PQkpFQ1QpOwogCQljbXJGaWVsZFR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoQ01SX0ZJRUxEX1RZUEVfT0JKRUNUKTsKKwkJY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoQ09OQ1VSUkVOQ1lfTUFOQUdFTUVOVF9UWVBFX1RZUEVfT0JKRUNUKTsKKwkJY29uY3VycmVudExvY2tUeXBlVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShDT05DVVJSRU5UX0xPQ0tfVFlQRV9UWVBFX09CSkVDVCk7CiAJCWVqYkNsYXNzVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShFSkJfQ0xBU1NfVFlQRSk7CiAJCWVqYk5hbWVUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEVKQl9OQU1FX1RZUEUpOwogCQltZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKE1FVEhPRF9JTlRFUkZBQ0VfVFlQRV9PQkpFQ1QpOwpAQCAtMzQwMSw2ICs0MTg5LDcgQEAKIAkJcGVyc2lzdGVuY2VUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFBFUlNJU1RFTkNFX1RZUEVfT0JKRUNUKTsKIAkJcmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFJFU1VMVF9UWVBFX01BUFBJTkdfVFlQRV9PQkpFQ1QpOwogCQlzZXNzaW9uVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShTRVNTSU9OX1RZUEVfT0JKRUNUKTsKKwkJdGltZVVuaXRUeXBlVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShUSU1FX1VOSVRfVFlQRV9UWVBFX09CSkVDVCk7CiAJCXRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShUUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRV9PQkpFQ1QpOwogCQl0cmFuc2FjdGlvblR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVFJBTlNBQ1RJT05fVFlQRV9PQkpFQ1QpOwogCX0KQEAgLTM0MjksMzY3ICs0MjE4LDQ3OCBAQAogCQlzZXROc1VSSShlTlNfVVJJKTsKIAogCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCUphdmFlZVBhY2thZ2UgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSk7CiAJCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOworCQlKYXZhZWVQYWNrYWdlIHRoZUphdmFlZVBhY2thZ2UgPSAoSmF2YWVlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpOwogCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwogCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoYWN0aXZhdGlvbkNvbmZpZ0VDbGFzcywgQWN0aXZhdGlvbkNvbmZpZy5jbGFzcywgIkFjdGl2YXRpb25Db25maWciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QWN0aXZhdGlvbkNvbmZpZ19EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEFjdGl2YXRpb25Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QWN0aXZhdGlvbkNvbmZpZ19BY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpLCB0aGlzLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpLCBudWxsLCAiYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMiLCBudWxsLCAxLCAtMSwgQWN0aXZhdGlvbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEFjdGl2YXRpb25Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCiAKLQkJaW5pdEVDbGFzcyhhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MsIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5jbGFzcywgIkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUiLCBudWxsLCAxLCAxLCBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFjdGl2YXRpb25Db25maWdQcm9wZXJ0eVZhbHVlIiwgbnVsbCwgMSwgMSwgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhhcHBsaWNhdGlvbkV4Y2VwdGlvbkVDbGFzcywgQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MsICJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9FeGNlcHRpb25DbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJleGNlcHRpb25DbGFzcyIsIG51bGwsIDEsIDEsIEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9Sb2xsYmFjaygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgInJvbGxiYWNrIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGFyb3VuZEludm9rZVR5cGVFQ2xhc3MsIEFyb3VuZEludm9rZVR5cGUuY2xhc3MsICJBcm91bmRJbnZva2VUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFyb3VuZEludm9rZVR5cGVfQ2xhc3MoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiY2xhc3MiLCBudWxsLCAwLCAxLCBBcm91bmRJbnZva2VUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBcm91bmRJbnZva2VUeXBlX01ldGhvZE5hbWUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRKYXZhSWRlbnRpZmllcigpLCAibWV0aG9kTmFtZSIsIG51bGwsIDEsIDEsIEFyb3VuZEludm9rZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhhc3NlbWJseURlc2NyaXB0b3JFQ2xhc3MsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIkFzc2VtYmx5RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfU2VjdXJpdHlSb2xlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFBlcm1pc3Npb25zKCksIHRoaXMuZ2V0TWV0aG9kUGVybWlzc2lvbigpLCBudWxsLCAibWV0aG9kUGVybWlzc2lvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9Db250YWluZXJUcmFuc2FjdGlvbnMoKSwgdGhpcy5nZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGUoKSwgbnVsbCwgImNvbnRhaW5lclRyYW5zYWN0aW9ucyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0ludGVyY2VwdG9yQmluZGluZ3MoKSwgdGhpcy5nZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlKCksIG51bGwsICJpbnRlcmNlcHRvckJpbmRpbmdzIiwgbnVsbCwgMCwgLTEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9ucyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0V4Y2x1ZGVMaXN0KCksIHRoaXMuZ2V0RXhjbHVkZUxpc3QoKSwgbnVsbCwgImV4Y2x1ZGVMaXN0IiwgbnVsbCwgMCwgMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9BcHBsaWNhdGlvbkV4Y2VwdGlvbnMoKSwgdGhpcy5nZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpLCBudWxsLCAiYXBwbGljYXRpb25FeGNlcHRpb25zIiwgbnVsbCwgMCwgLTEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRBc3NlbWJseURlc2NyaXB0b3JfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhjbXBGaWVsZEVDbGFzcywgQ01QRmllbGQuY2xhc3MsICJDTVBGaWVsZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRDTVBGaWVsZF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIENNUEZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldENNUEZpZWxkX0ZpZWxkTmFtZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEphdmFJZGVudGlmaWVyKCksICJmaWVsZE5hbWUiLCBudWxsLCAxLCAxLCBDTVBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q01QRmllbGRfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQ01QRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGNtckZpZWxkRUNsYXNzLCBDTVJGaWVsZC5jbGFzcywgIkNNUkZpZWxkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldENNUkZpZWxkX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQ01SRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q01SRmllbGRfQ21yRmllbGROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJjbXJGaWVsZE5hbWUiLCBudWxsLCAxLCAxLCBDTVJGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q01SRmllbGRfQ21yRmllbGRUeXBlKCksIHRoaXMuZ2V0Q01SRmllbGRUeXBlKCksICJjbXJGaWVsZFR5cGUiLCAiamF2YS51dGlsLkNvbGxlY3Rpb24iLCAwLCAxLCBDTVJGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldENNUkZpZWxkX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIENNUkZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhjb250YWluZXJUcmFuc2FjdGlvblR5cGVFQ2xhc3MsIENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZS5jbGFzcywgIkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBDb250YWluZXJUcmFuc2FjdGlvblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX01ldGhvZHMoKSwgdGhpcy5nZXRNZXRob2RUeXBlKCksIG51bGwsICJtZXRob2RzIiwgbnVsbCwgMSwgLTEsIENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfVHJhbnNBdHRyaWJ1dGUoKSwgdGhpcy5nZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoKSwgInRyYW5zQXR0cmlidXRlIiwgIk5vdFN1cHBvcnRlZCIsIDEsIDEsIENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBDb250YWluZXJUcmFuc2FjdGlvblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGVqYkphckVDbGFzcywgRUpCSmFyLmNsYXNzLCAiRUpCSmFyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVKQkphcl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyX0ljb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVKQkphcl9FbnRlcnByaXNlQmVhbnMoKSwgdGhpcy5nZXRFbnRlcnByaXNlQmVhbnMoKSwgbnVsbCwgImVudGVycHJpc2VCZWFucyIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfSW50ZXJjZXB0b3JzKCksIHRoaXMuZ2V0SW50ZXJjZXB0b3JzVHlwZSgpLCBudWxsLCAiaW50ZXJjZXB0b3JzIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVKQkphcl9SZWxhdGlvbnNoaXBzKCksIHRoaXMuZ2V0UmVsYXRpb25zaGlwcygpLCBudWxsLCAicmVsYXRpb25zaGlwcyIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCksIHRoaXMuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCksIG51bGwsICJhc3NlbWJseURlc2NyaXB0b3IiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhdGhUeXBlKCksICJlamJDbGllbnRKYXIiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVKQkphcl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCSmFyX01ldGFkYXRhQ29tcGxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAibWV0YWRhdGFDb21wbGV0ZSIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJKYXJfVmVyc2lvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERld2V5VmVyc2lvblR5cGUoKSwgInZlcnNpb24iLCAiMy4wIiwgMSwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKGVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvci5jbGFzcywgIkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJtaXhlZCIsIG51bGwsIDAsIC0xLCBudWxsLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhNTE5TUHJlZml4TWFwIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhTSVNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9FamJKYXIoKSwgdGhpcy5nZXRFSkJKYXIoKSwgbnVsbCwgImVqYkphciIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhlamJSZWxhdGlvbkVDbGFzcywgRUpCUmVsYXRpb24uY2xhc3MsICJFSkJSZWxhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVKQlJlbGF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uX0VqYlJlbGF0aW9uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAiZWpiUmVsYXRpb25OYW1lIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uX0VqYlJlbGF0aW9uc2hpcFJvbGVzKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpLCBudWxsLCAiZWpiUmVsYXRpb25zaGlwUm9sZXMiLCBudWxsLCAyLCAyLCBFSkJSZWxhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcywgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIkVKQlJlbGF0aW9uc2hpcFJvbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9FamJSZWxhdGlvbnNoaXBSb2xlTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAiZWpiUmVsYXRpb25zaGlwUm9sZU5hbWUiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX011bHRpcGxpY2l0eSgpLCB0aGlzLmdldE11bHRpcGxpY2l0eVR5cGUoKSwgIm11bHRpcGxpY2l0eSIsICJPbmUiLCAxLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DYXNjYWRlRGVsZXRlKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW1wdHlUeXBlKCksIG51bGwsICJjYXNjYWRlRGVsZXRlIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcFJvbGVTb3VyY2UoKSwgdGhpcy5nZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSgpLCBudWxsLCAicmVsYXRpb25zaGlwUm9sZVNvdXJjZSIsIG51bGwsIDEsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpLCB0aGlzLmdldENNUkZpZWxkKCksIG51bGwsICJjbXJGaWVsZCIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhlbnRlcnByaXNlQmVhbnNFQ2xhc3MsIEVudGVycHJpc2VCZWFucy5jbGFzcywgIkVudGVycHJpc2VCZWFucyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRlcnByaXNlQmVhbnNfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIEVudGVycHJpc2VCZWFucy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5zX1Nlc3Npb25CZWFucygpLCB0aGlzLmdldFNlc3Npb25CZWFuKCksIG51bGwsICJzZXNzaW9uQmVhbnMiLCBudWxsLCAwLCAtMSwgRW50ZXJwcmlzZUJlYW5zLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuc19FbnRpdHlCZWFucygpLCB0aGlzLmdldEVudGl0eUJlYW4oKSwgbnVsbCwgImVudGl0eUJlYW5zIiwgbnVsbCwgMCwgLTEsIEVudGVycHJpc2VCZWFucy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbnNfTWVzc2FnZURyaXZlbkJlYW5zKCksIHRoaXMuZ2V0TWVzc2FnZURyaXZlbkJlYW4oKSwgbnVsbCwgIm1lc3NhZ2VEcml2ZW5CZWFucyIsIG51bGwsIDAsIC0xLCBFbnRlcnByaXNlQmVhbnMuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50ZXJwcmlzZUJlYW5zX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEVudGVycHJpc2VCZWFucy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZW50aXR5QmVhbkVDbGFzcywgRW50aXR5QmVhbi5jbGFzcywgIkVudGl0eUJlYW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9FamJOYW1lKCksIHRoaXMuZ2V0RWpiTmFtZVR5cGUoKSwgImVqYk5hbWUiLCBudWxsLCAxLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9Ib21lKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SG9tZSgpLCAiaG9tZSIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fUmVtb3RlKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVtb3RlKCksICJyZW1vdGUiLCBudWxsLCAwLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX0xvY2FsSG9tZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExvY2FsSG9tZSgpLCAibG9jYWxIb21lIiwgbnVsbCwgMCwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9Mb2NhbCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExvY2FsKCksICJsb2NhbCIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fRWpiQ2xhc3MoKSwgdGhpcy5nZXRFamJDbGFzc1R5cGUoKSwgImVqYkNsYXNzIiwgbnVsbCwgMSwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZVR5cGUoKSwgdGhpcy5nZXRQZXJzaXN0ZW5jZVR5cGUoKSwgInBlcnNpc3RlbmNlVHlwZSIsICJCZWFuIiwgMSwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fUHJpbUtleUNsYXNzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgInByaW1LZXlDbGFzcyIsIG51bGwsIDEsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fUmVlbnRyYW50KCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAicmVlbnRyYW50IiwgbnVsbCwgMSwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX0NtcFZlcnNpb24oKSwgdGhpcy5nZXRDbXBWZXJzaW9uVHlwZSgpLCAiY21wVmVyc2lvbiIsICIxLngiLCAwLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9BYnN0cmFjdFNjaGVtYU5hbWUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRKYXZhSWRlbnRpZmllcigpLCAiYWJzdHJhY3RTY2hlbWFOYW1lIiwgbnVsbCwgMCwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9DbXBGaWVsZHMoKSwgdGhpcy5nZXRDTVBGaWVsZCgpLCBudWxsLCAiY21wRmllbGRzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9Qcmlta2V5RmllbGQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInByaW1rZXlGaWVsZCIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fRW52RW50cmllcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVudkVudHJ5KCksIG51bGwsICJlbnZFbnRyaWVzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9FamJSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiUmVmKCksIG51bGwsICJlamJSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9FamJMb2NhbFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJMb2NhbFJlZigpLCBudWxsLCAiZWpiTG9jYWxSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9TZXJ2aWNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9SZXNvdXJjZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9SZXNvdXJjZUVudlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZUVudlJlZigpLCBudWxsLCAicmVzb3VyY2VFbnZSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZUNvbnRleHRSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZVVuaXRSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9Qb3N0Q29uc3RydWN0cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwb3N0Q29uc3RydWN0cyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fUHJlRGVzdHJveXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicHJlRGVzdHJveXMiLCBudWxsLCAwLCAtMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZWN1cml0eVJvbGVSZWYoKSwgbnVsbCwgInNlY3VyaXR5Um9sZVJlZnMiLCBudWxsLCAwLCAtMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlCZWFuX1NlY3VyaXR5SWRlbnRpdHkoKSwgdGhpcy5nZXRTZWN1cml0eUlkZW50aXR5VHlwZSgpLCBudWxsLCAic2VjdXJpdHlJZGVudGl0eSIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9RdWVyaWVzKCksIHRoaXMuZ2V0UXVlcnkoKSwgbnVsbCwgInF1ZXJpZXMiLCBudWxsLCAwLCAtMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGV4Y2x1ZGVMaXN0RUNsYXNzLCBFeGNsdWRlTGlzdC5jbGFzcywgIkV4Y2x1ZGVMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRXhjbHVkZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXhjbHVkZUxpc3RfTWV0aG9kcygpLCB0aGlzLmdldE1ldGhvZFR5cGUoKSwgbnVsbCwgIm1ldGhvZHMiLCBudWxsLCAxLCAtMSwgRXhjbHVkZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXhjbHVkZUxpc3RfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRXhjbHVkZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGluaXRNZXRob2RUeXBlRUNsYXNzLCBJbml0TWV0aG9kVHlwZS5jbGFzcywgIkluaXRNZXRob2RUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEluaXRNZXRob2RUeXBlX0NyZWF0ZU1ldGhvZCgpLCB0aGlzLmdldE5hbWVkTWV0aG9kVHlwZSgpLCBudWxsLCAiY3JlYXRlTWV0aG9kIiwgbnVsbCwgMSwgMSwgSW5pdE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5pdE1ldGhvZFR5cGVfQmVhbk1ldGhvZCgpLCB0aGlzLmdldE5hbWVkTWV0aG9kVHlwZSgpLCBudWxsLCAiYmVhbk1ldGhvZCIsIG51bGwsIDEsIDEsIEluaXRNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEluaXRNZXRob2RUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEluaXRNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhpbnRlcmNlcHRvckJpbmRpbmdUeXBlRUNsYXNzLCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCAiSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0VqYk5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImVqYk5hbWUiLCBudWxsLCAxLCAxLCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0ludGVyY2VwdG9yQ2xhc3NlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJpbnRlcmNlcHRvckNsYXNzZXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9JbnRlcmNlcHRvck9yZGVyKCksIHRoaXMuZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGUoKSwgbnVsbCwgImludGVyY2VwdG9yT3JkZXIiLCBudWxsLCAwLCAxLCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJleGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyIsIG51bGwsIDAsIDEsIEludGVyY2VwdG9yQmluZGluZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9FeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMiLCBudWxsLCAwLCAxLCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfTWV0aG9kKCksIHRoaXMuZ2V0TmFtZWRNZXRob2RUeXBlKCksIG51bGwsICJtZXRob2QiLCBudWxsLCAwLCAxLCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoaW50ZXJjZXB0b3JPcmRlclR5cGVFQ2xhc3MsIEludGVyY2VwdG9yT3JkZXJUeXBlLmNsYXNzLCAiSW50ZXJjZXB0b3JPcmRlclR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGVfSW50ZXJjZXB0b3JDbGFzc2VzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImludGVyY2VwdG9yQ2xhc3NlcyIsIG51bGwsIDEsIC0xLCBJbnRlcmNlcHRvck9yZGVyVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgSW50ZXJjZXB0b3JPcmRlclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGludGVyY2VwdG9yc1R5cGVFQ2xhc3MsIEludGVyY2VwdG9yc1R5cGUuY2xhc3MsICJJbnRlcmNlcHRvcnNUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yc1R5cGVfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvcnNUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yc1R5cGVfSW50ZXJjZXB0b3JzKCksIHRoaXMuZ2V0SW50ZXJjZXB0b3JUeXBlKCksIG51bGwsICJpbnRlcmNlcHRvcnMiLCBudWxsLCAxLCAtMSwgSW50ZXJjZXB0b3JzVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlcmNlcHRvcnNUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEludGVyY2VwdG9yc1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAiSW50ZXJjZXB0b3JUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlcmNlcHRvclR5cGVfSW50ZXJjZXB0b3JDbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJpbnRlcmNlcHRvckNsYXNzIiwgbnVsbCwgMSwgMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfQXJvdW5kSW52b2tlcygpLCB0aGlzLmdldEFyb3VuZEludm9rZVR5cGUoKSwgbnVsbCwgImFyb3VuZEludm9rZXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9FbnZFbnRyaWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW52RW50cnkoKSwgbnVsbCwgImVudkVudHJpZXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9FamJSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiUmVmKCksIG51bGwsICJlamJSZWZzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfRWpiTG9jYWxSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiTG9jYWxSZWYoKSwgbnVsbCwgImVqYkxvY2FsUmVmcyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX1NlcnZpY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9SZXNvdXJjZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VFbnZSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZUNvbnRleHRSZWZzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VVbml0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlVW5pdFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0UmVmcyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX1Bvc3RDb25zdHJ1Y3RzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RDb25zdHJ1Y3RzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfUHJlRGVzdHJveXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicHJlRGVzdHJveXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9Qb3N0QWN0aXZhdGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RBY3RpdmF0ZXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9QcmVQYXNzaXZhdGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInByZVBhc3NpdmF0ZXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEludGVyY2VwdG9yVHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIk1lc3NhZ2VEcml2ZW5CZWFuIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYk5hbWUoKSwgdGhpcy5nZXRFamJOYW1lVHlwZSgpLCAiZWpiTmFtZSIsIG51bGwsIDEsIDEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9NYXBwZWROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWFwcGVkTmFtZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJDbGFzcygpLCB0aGlzLmdldEVqYkNsYXNzVHlwZSgpLCAiZWpiQ2xhc3MiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnaW5nVHlwZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJtZXNzYWdpbmdUeXBlIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1RpbWVvdXRNZXRob2QoKSwgdGhpcy5nZXROYW1lZE1ldGhvZFR5cGUoKSwgbnVsbCwgInRpbWVvdXRNZXRob2QiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9UcmFuc2FjdGlvblR5cGUoKSwgdGhpcy5nZXRUcmFuc2FjdGlvblR5cGUoKSwgInRyYW5zYWN0aW9uVHlwZSIsICJCZWFuIiwgMCwgMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25UeXBlKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUoKSwgIm1lc3NhZ2VEZXN0aW5hdGlvblR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uTGluaygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSwgIm1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fQWN0aXZhdGlvbkNvbmZpZygpLCB0aGlzLmdldEFjdGl2YXRpb25Db25maWcoKSwgbnVsbCwgImFjdGl2YXRpb25Db25maWciLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9Bcm91bmRJbnZva2VzKCksIHRoaXMuZ2V0QXJvdW5kSW52b2tlVHlwZSgpLCBudWxsLCAiYXJvdW5kSW52b2tlcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9FbnZFbnRyaWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW52RW50cnkoKSwgbnVsbCwgImVudkVudHJpZXMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJMb2NhbFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJMb2NhbFJlZigpLCBudWxsLCAiZWpiTG9jYWxSZWZzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1NlcnZpY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fUmVzb3VyY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VSZWYoKSwgbnVsbCwgInJlc291cmNlUmVmcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9SZXNvdXJjZUVudlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZUVudlJlZigpLCBudWxsLCAicmVzb3VyY2VFbnZSZWZzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VDb250ZXh0UmVmcyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9QZXJzaXN0ZW5jZVVuaXRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZVVuaXRSZWZzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1Bvc3RDb25zdHJ1Y3RzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RDb25zdHJ1Y3RzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1ByZURlc3Ryb3lzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInByZURlc3Ryb3lzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1NlY3VyaXR5SWRlbnRpdHkoKSwgdGhpcy5nZXRTZWN1cml0eUlkZW50aXR5VHlwZSgpLCBudWxsLCAic2VjdXJpdHlJZGVudGl0eSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhtZXRob2RQYXJhbXNFQ2xhc3MsIE1ldGhvZFBhcmFtcy5jbGFzcywgIk1ldGhvZFBhcmFtcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYXJhbXNfTWV0aG9kUGFyYW1zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SmF2YVR5cGUoKSwgIm1ldGhvZFBhcmFtcyIsIG51bGwsIDAsIC0xLCBNZXRob2RQYXJhbXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBhcmFtc19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXRob2RQYXJhbXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKG1ldGhvZFBlcm1pc3Npb25FQ2xhc3MsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICJNZXRob2RQZXJtaXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBlcm1pc3Npb25fUm9sZU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lcyIsIG51bGwsIDAsIC0xLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQZXJtaXNzaW9uX1VuY2hlY2tlZCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVtcHR5VHlwZSgpLCBudWxsLCAidW5jaGVja2VkIiwgbnVsbCwgMCwgMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZHMoKSwgdGhpcy5nZXRNZXRob2RUeXBlKCksIG51bGwsICJtZXRob2RzIiwgbnVsbCwgMSwgLTEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGVybWlzc2lvbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhtZXRob2RUeXBlRUNsYXNzLCBNZXRob2RUeXBlLmNsYXNzLCAiTWV0aG9kVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RUeXBlX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RUeXBlX0VqYk5hbWUoKSwgdGhpcy5nZXRFamJOYW1lVHlwZSgpLCAiZWpiTmFtZSIsIG51bGwsIDEsIDEsIE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFR5cGVfTWV0aG9kSW50ZigpLCB0aGlzLmdldE1ldGhvZEludGVyZmFjZVR5cGUoKSwgIm1ldGhvZEludGYiLCAiSG9tZSIsIDAsIDEsIE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RUeXBlX01ldGhvZE5hbWUoKSwgdGhpcy5nZXRNZXRob2ROYW1lVHlwZSgpLCAibWV0aG9kTmFtZSIsIG51bGwsIDEsIDEsIE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFR5cGVfTWV0aG9kUGFyYW1zKCksIHRoaXMuZ2V0TWV0aG9kUGFyYW1zKCksIG51bGwsICJtZXRob2RQYXJhbXMiLCBudWxsLCAwLCAxLCBNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MobmFtZWRNZXRob2RUeXBlRUNsYXNzLCBOYW1lZE1ldGhvZFR5cGUuY2xhc3MsICJOYW1lZE1ldGhvZFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TmFtZWRNZXRob2RUeXBlX01ldGhvZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgIm1ldGhvZE5hbWUiLCBudWxsLCAxLCAxLCBOYW1lZE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldE5hbWVkTWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKSwgdGhpcy5nZXRNZXRob2RQYXJhbXMoKSwgbnVsbCwgIm1ldGhvZFBhcmFtcyIsIG51bGwsIDAsIDEsIE5hbWVkTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXROYW1lZE1ldGhvZFR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTmFtZWRNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhxdWVyeUVDbGFzcywgUXVlcnkuY2xhc3MsICJRdWVyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRRdWVyeV9EZXNjcmlwdGlvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5X1F1ZXJ5TWV0aG9kKCksIHRoaXMuZ2V0UXVlcnlNZXRob2QoKSwgbnVsbCwgInF1ZXJ5TWV0aG9kIiwgbnVsbCwgMSwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UXVlcnlfUmVzdWx0VHlwZU1hcHBpbmcoKSwgdGhpcy5nZXRSZXN1bHRUeXBlTWFwcGluZ1R5cGUoKSwgInJlc3VsdFR5cGVNYXBwaW5nIiwgIkxvY2FsIiwgMCwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXRRdWVyeV9FamJRbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVqYlFsIiwgbnVsbCwgMSwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFF1ZXJ5X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhxdWVyeU1ldGhvZEVDbGFzcywgUXVlcnlNZXRob2QuY2xhc3MsICJRdWVyeU1ldGhvZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRRdWVyeU1ldGhvZF9NZXRob2ROYW1lKCksIHRoaXMuZ2V0TWV0aG9kTmFtZVR5cGUoKSwgIm1ldGhvZE5hbWUiLCBudWxsLCAxLCAxLCBRdWVyeU1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UXVlcnlNZXRob2RfTWV0aG9kUGFyYW1zKCksIHRoaXMuZ2V0TWV0aG9kUGFyYW1zKCksIG51bGwsICJtZXRob2RQYXJhbXMiLCBudWxsLCAxLCAxLCBRdWVyeU1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRRdWVyeU1ldGhvZF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBRdWVyeU1ldGhvZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVFQ2xhc3MsIFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlLmNsYXNzLCAiUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9FamJOYW1lKCksIHRoaXMuZ2V0RWpiTmFtZVR5cGUoKSwgImVqYk5hbWUiLCBudWxsLCAxLCAxLCBSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHJlbGF0aW9uc2hpcHNFQ2xhc3MsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICJSZWxhdGlvbnNoaXBzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aW9uc2hpcHNfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCksIHRoaXMuZ2V0RUpCUmVsYXRpb24oKSwgbnVsbCwgImVqYlJlbGF0aW9ucyIsIG51bGwsIDEsIC0xLCBSZWxhdGlvbnNoaXBzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlbGF0aW9uc2hpcHNfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVsYXRpb25zaGlwcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocmVtb3ZlTWV0aG9kVHlwZUVDbGFzcywgUmVtb3ZlTWV0aG9kVHlwZS5jbGFzcywgIlJlbW92ZU1ldGhvZFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVtb3ZlTWV0aG9kVHlwZV9CZWFuTWV0aG9kKCksIHRoaXMuZ2V0TmFtZWRNZXRob2RUeXBlKCksIG51bGwsICJiZWFuTWV0aG9kIiwgbnVsbCwgMSwgMSwgUmVtb3ZlTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZW1vdmVNZXRob2RUeXBlX1JldGFpbklmRXhjZXB0aW9uKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAicmV0YWluSWZFeGNlcHRpb24iLCBudWxsLCAwLCAxLCBSZW1vdmVNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlbW92ZU1ldGhvZFR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVtb3ZlTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Moc2VjdXJpdHlJZGVudGl0eVR5cGVFQ2xhc3MsIFNlY3VyaXR5SWRlbnRpdHlUeXBlLmNsYXNzLCAiU2VjdXJpdHlJZGVudGl0eVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eUlkZW50aXR5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9Vc2VDYWxsZXJJZGVudGl0eSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVtcHR5VHlwZSgpLCBudWxsLCAidXNlQ2FsbGVySWRlbnRpdHkiLCBudWxsLCAwLCAxLCBTZWN1cml0eUlkZW50aXR5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9SdW5BcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJ1bkFzKCksIG51bGwsICJydW5BcyIsIG51bGwsIDAsIDEsIFNlY3VyaXR5SWRlbnRpdHlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5SWRlbnRpdHlUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5SWRlbnRpdHlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZXNzaW9uQmVhbkVDbGFzcywgU2Vzc2lvbkJlYW4uY2xhc3MsICJTZXNzaW9uQmVhbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0Rpc3BsYXlOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fSWNvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uQmVhbl9FamJOYW1lKCksIHRoaXMuZ2V0RWpiTmFtZVR5cGUoKSwgImVqYk5hbWUiLCBudWxsLCAxLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fSG9tZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEhvbWUoKSwgImhvbWUiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fUmVtb3RlKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVtb3RlKCksICJyZW1vdGUiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fTG9jYWxIb21lKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TG9jYWxIb21lKCksICJsb2NhbEhvbWUiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fTG9jYWwoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMb2NhbCgpLCAibG9jYWwiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fQnVzaW5lc3NMb2NhbHMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiYnVzaW5lc3NMb2NhbHMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0J1c2luZXNzUmVtb3RlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJidXNpbmVzc1JlbW90ZXMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX1NlcnZpY2VFbmRwb2ludCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJzZXJ2aWNlRW5kcG9pbnQiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fRWpiQ2xhc3MoKSwgdGhpcy5nZXRFamJDbGFzc1R5cGUoKSwgImVqYkNsYXNzIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX1Nlc3Npb25UeXBlKCksIHRoaXMuZ2V0U2Vzc2lvblR5cGUoKSwgInNlc3Npb25UeXBlIiwgIlN0YXRlZnVsIiwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9UaW1lb3V0TWV0aG9kKCksIHRoaXMuZ2V0TmFtZWRNZXRob2RUeXBlKCksIG51bGwsICJ0aW1lb3V0TWV0aG9kIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fSW5pdE1ldGhvZHMoKSwgdGhpcy5nZXRJbml0TWV0aG9kVHlwZSgpLCBudWxsLCAiaW5pdE1ldGhvZHMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUmVtb3ZlTWV0aG9kcygpLCB0aGlzLmdldFJlbW92ZU1ldGhvZFR5cGUoKSwgbnVsbCwgInJlbW92ZU1ldGhvZHMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlKCksICJ0cmFuc2FjdGlvblR5cGUiLCAiQmVhbiIsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fQXJvdW5kSW52b2tlcygpLCB0aGlzLmdldEFyb3VuZEludm9rZVR5cGUoKSwgbnVsbCwgImFyb3VuZEludm9rZXMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fRW52RW50cmllcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVudkVudHJ5KCksIG51bGwsICJlbnZFbnRyaWVzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0VqYlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJSZWYoKSwgbnVsbCwgImVqYlJlZnMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fRWpiTG9jYWxSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiTG9jYWxSZWYoKSwgbnVsbCwgImVqYkxvY2FsUmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9TZXJ2aWNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1Jlc291cmNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlUmVmKCksIG51bGwsICJyZXNvdXJjZVJlZnMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUmVzb3VyY2VFbnZSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKSwgbnVsbCwgInBlcnNpc3RlbmNlQ29udGV4dFJlZnMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlVW5pdFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0UmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9Qb3N0Q29uc3RydWN0cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwb3N0Q29uc3RydWN0cyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9QcmVEZXN0cm95cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwcmVEZXN0cm95cyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9Qb3N0QWN0aXZhdGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RBY3RpdmF0ZXMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUHJlUGFzc2l2YXRlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwcmVQYXNzaXZhdGVzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZWN1cml0eVJvbGVSZWYoKSwgbnVsbCwgInNlY3VyaXR5Um9sZVJlZnMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fU2VjdXJpdHlJZGVudGl0aWVzKCksIHRoaXMuZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGUoKSwgbnVsbCwgInNlY3VyaXR5SWRlbnRpdGllcyIsIG51bGwsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGNtcFZlcnNpb25UeXBlRUVudW0sIENtcFZlcnNpb25UeXBlLmNsYXNzLCAiQ21wVmVyc2lvblR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoY21wVmVyc2lvblR5cGVFRW51bSwgQ21wVmVyc2lvblR5cGUuXzFYX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoY21wVmVyc2lvblR5cGVFRW51bSwgQ21wVmVyc2lvblR5cGUuXzJYX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShjbXJGaWVsZFR5cGVFRW51bSwgQ01SRmllbGRUeXBlLmNsYXNzLCAiQ01SRmllbGRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGNtckZpZWxkVHlwZUVFbnVtLCBDTVJGaWVsZFR5cGUuSkFWQV9VVElMX0NPTExFQ1RJT05fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjbXJGaWVsZFR5cGVFRW51bSwgQ01SRmllbGRUeXBlLkpBVkFfVVRJTF9TRVRfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKG1ldGhvZEludGVyZmFjZVR5cGVFRW51bSwgTWV0aG9kSW50ZXJmYWNlVHlwZS5jbGFzcywgIk1ldGhvZEludGVyZmFjZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kSW50ZXJmYWNlVHlwZUVFbnVtLCBNZXRob2RJbnRlcmZhY2VUeXBlLkhPTUVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0sIE1ldGhvZEludGVyZmFjZVR5cGUuUkVNT1RFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kSW50ZXJmYWNlVHlwZUVFbnVtLCBNZXRob2RJbnRlcmZhY2VUeXBlLkxPQ0FMX0hPTUVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0sIE1ldGhvZEludGVyZmFjZVR5cGUuTE9DQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0sIE1ldGhvZEludGVyZmFjZVR5cGUuU0VSVklDRV9FTkRQT0lOVF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0obXVsdGlwbGljaXR5VHlwZUVFbnVtLCBNdWx0aXBsaWNpdHlUeXBlLmNsYXNzLCAiTXVsdGlwbGljaXR5VHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChtdWx0aXBsaWNpdHlUeXBlRUVudW0sIE11bHRpcGxpY2l0eVR5cGUuT05FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobXVsdGlwbGljaXR5VHlwZUVFbnVtLCBNdWx0aXBsaWNpdHlUeXBlLk1BTllfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHBlcnNpc3RlbmNlVHlwZUVFbnVtLCBQZXJzaXN0ZW5jZVR5cGUuY2xhc3MsICJQZXJzaXN0ZW5jZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwocGVyc2lzdGVuY2VUeXBlRUVudW0sIFBlcnNpc3RlbmNlVHlwZS5CRUFOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwocGVyc2lzdGVuY2VUeXBlRUVudW0sIFBlcnNpc3RlbmNlVHlwZS5DT05UQUlORVJfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHJlc3VsdFR5cGVNYXBwaW5nVHlwZUVFbnVtLCBSZXN1bHRUeXBlTWFwcGluZ1R5cGUuY2xhc3MsICJSZXN1bHRUeXBlTWFwcGluZ1R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwocmVzdWx0VHlwZU1hcHBpbmdUeXBlRUVudW0sIFJlc3VsdFR5cGVNYXBwaW5nVHlwZS5MT0NBTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc3VsdFR5cGVNYXBwaW5nVHlwZUVFbnVtLCBSZXN1bHRUeXBlTWFwcGluZ1R5cGUuUkVNT1RFX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShzZXNzaW9uVHlwZUVFbnVtLCBTZXNzaW9uVHlwZS5jbGFzcywgIlNlc3Npb25UeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHNlc3Npb25UeXBlRUVudW0sIFNlc3Npb25UeXBlLlNUQVRFRlVMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoc2Vzc2lvblR5cGVFRW51bSwgU2Vzc2lvblR5cGUuU1RBVEVMRVNTX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bSh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmNsYXNzLCAiVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTk9UX1NVUFBPUlRFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuU1VQUE9SVFNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLlJFUVVJUkVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5SRVFVSVJFU19ORVdfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLk1BTkRBVE9SWV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTkVWRVJfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuY2xhc3MsICJUcmFuc2FjdGlvblR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25UeXBlRUVudW0sIFRyYW5zYWN0aW9uVHlwZS5CRUFOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25UeXBlRUVudW0sIFRyYW5zYWN0aW9uVHlwZS5DT05UQUlORVJfTElURVJBTCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoY21wVmVyc2lvblR5cGVPYmplY3RFRGF0YVR5cGUsIENtcFZlcnNpb25UeXBlLmNsYXNzLCAiQ21wVmVyc2lvblR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShjbXJGaWVsZFR5cGVPYmplY3RFRGF0YVR5cGUsIENNUkZpZWxkVHlwZS5jbGFzcywgIkNNUkZpZWxkVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGVqYkNsYXNzVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiRWpiQ2xhc3NUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGVqYk5hbWVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJFamJOYW1lVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShtZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0RURhdGFUeXBlLCBNZXRob2RJbnRlcmZhY2VUeXBlLmNsYXNzLCAiTWV0aG9kSW50ZXJmYWNlVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKG1ldGhvZE5hbWVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJNZXRob2ROYW1lVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShtdWx0aXBsaWNpdHlUeXBlT2JqZWN0RURhdGFUeXBlLCBNdWx0aXBsaWNpdHlUeXBlLmNsYXNzLCAiTXVsdGlwbGljaXR5VHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHBlcnNpc3RlbmNlVHlwZU9iamVjdEVEYXRhVHlwZSwgUGVyc2lzdGVuY2VUeXBlLmNsYXNzLCAiUGVyc2lzdGVuY2VUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUocmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0RURhdGFUeXBlLCBSZXN1bHRUeXBlTWFwcGluZ1R5cGUuY2xhc3MsICJSZXN1bHRUeXBlTWFwcGluZ1R5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShzZXNzaW9uVHlwZU9iamVjdEVEYXRhVHlwZSwgU2Vzc2lvblR5cGUuY2xhc3MsICJTZXNzaW9uVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZU9iamVjdEVEYXRhVHlwZSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmNsYXNzLCAiVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUodHJhbnNhY3Rpb25UeXBlT2JqZWN0RURhdGFUeXBlLCBUcmFuc2FjdGlvblR5cGUuY2xhc3MsICJUcmFuc2FjdGlvblR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQotCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKKwkJYm9vbGVhbiBoYXNMb2NrID0gZmFsc2U7CisJCXRyeSB7CisJCQloYXNMb2NrID0gSjJFRUluaXQuYXF1aXJlSW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50c0xvY2soKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJSjJFRUNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCX0JCQorCQkKKwkJdHJ5eworCQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQorCQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJCWluaXRFQ2xhc3MoYWNjZXNzVGltZW91dFR5cGVFQ2xhc3MsIEFjY2Vzc1RpbWVvdXRUeXBlLmNsYXNzLCAiQWNjZXNzVGltZW91dFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEFjY2Vzc1RpbWVvdXRUeXBlX1RpbWVvdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50ZWdlcigpLCAidGltZW91dCIsIG51bGwsIDEsIDEsIEFjY2Vzc1RpbWVvdXRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBY2Nlc3NUaW1lb3V0VHlwZV9Vbml0KCksIHRoaXMuZ2V0VGltZVVuaXRUeXBlVHlwZSgpLCAidW5pdCIsIG51bGwsIDEsIDEsIEFjY2Vzc1RpbWVvdXRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEFjY2Vzc1RpbWVvdXRUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEFjY2Vzc1RpbWVvdXRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoYWN0aXZhdGlvbkNvbmZpZ0VDbGFzcywgQWN0aXZhdGlvbkNvbmZpZy5jbGFzcywgIkFjdGl2YXRpb25Db25maWciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFjdGl2YXRpb25Db25maWdfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBBY3RpdmF0aW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBY3RpdmF0aW9uQ29uZmlnX0FjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCksIG51bGwsICJhY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyIsIG51bGwsIDEsIC0xLCBBY3RpdmF0aW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEFjdGl2YXRpb25Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MsIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5jbGFzcywgIkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlOYW1lIiwgbnVsbCwgMSwgMSwgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5VmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSIsIG51bGwsIDEsIDEsIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGFwcGxpY2F0aW9uRXhjZXB0aW9uRUNsYXNzLCBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jbGFzcywgIkFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9FeGNlcHRpb25DbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJleGNlcHRpb25DbGFzcyIsIG51bGwsIDEsIDEsIEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9Sb2xsYmFjaygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgInJvbGxiYWNrIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fSW5oZXJpdGVkKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAiaW5oZXJpdGVkIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhhcm91bmRJbnZva2VUeXBlRUNsYXNzLCBBcm91bmRJbnZva2VUeXBlLmNsYXNzLCAiQXJvdW5kSW52b2tlVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJvdW5kSW52b2tlVHlwZV9DbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJjbGFzcyIsIG51bGwsIDAsIDEsIEFyb3VuZEludm9rZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEFyb3VuZEludm9rZVR5cGVfTWV0aG9kTmFtZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEphdmFJZGVudGlmaWVyKCksICJtZXRob2ROYW1lIiwgbnVsbCwgMSwgMSwgQXJvdW5kSW52b2tlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhhcm91bmRUaW1lb3V0VHlwZUVDbGFzcywgQXJvdW5kVGltZW91dFR5cGUuY2xhc3MsICJBcm91bmRUaW1lb3V0VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJvdW5kVGltZW91dFR5cGVfQ2xhc3MoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiY2xhc3MiLCBudWxsLCAwLCAxLCBBcm91bmRUaW1lb3V0VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJvdW5kVGltZW91dFR5cGVfTWV0aG9kTmFtZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEphdmFJZGVudGlmaWVyKCksICJtZXRob2ROYW1lIiwgbnVsbCwgMSwgMSwgQXJvdW5kVGltZW91dFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICJBc3NlbWJseURlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9TZWN1cml0eVJvbGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlKCksIG51bGwsICJzZWN1cml0eVJvbGVzIiwgbnVsbCwgMCwgLTEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFBlcm1pc3Npb25zKCksIHRoaXMuZ2V0TWV0aG9kUGVybWlzc2lvbigpLCBudWxsLCAibWV0aG9kUGVybWlzc2lvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfQ29udGFpbmVyVHJhbnNhY3Rpb25zKCksIHRoaXMuZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKCksIG51bGwsICJjb250YWluZXJUcmFuc2FjdGlvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfSW50ZXJjZXB0b3JCaW5kaW5ncygpLCB0aGlzLmdldEludGVyY2VwdG9yQmluZGluZ1R5cGUoKSwgbnVsbCwgImludGVyY2VwdG9yQmluZGluZ3MiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9ucyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9FeGNsdWRlTGlzdCgpLCB0aGlzLmdldEV4Y2x1ZGVMaXN0KCksIG51bGwsICJleGNsdWRlTGlzdCIsIG51bGwsIDAsIDEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0FwcGxpY2F0aW9uRXhjZXB0aW9ucygpLCB0aGlzLmdldEFwcGxpY2F0aW9uRXhjZXB0aW9uKCksIG51bGwsICJhcHBsaWNhdGlvbkV4Y2VwdGlvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBc3NlbWJseURlc2NyaXB0b3JfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoYXN5bmNNZXRob2RUeXBlRUNsYXNzLCBBc3luY01ldGhvZFR5cGUuY2xhc3MsICJBc3luY01ldGhvZFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEFzeW5jTWV0aG9kVHlwZV9NZXRob2ROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJtZXRob2ROYW1lIiwgbnVsbCwgMSwgMSwgQXN5bmNNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBc3luY01ldGhvZFR5cGVfTWV0aG9kUGFyYW1zKCksIHRoaXMuZ2V0TWV0aG9kUGFyYW1zKCksIG51bGwsICJtZXRob2RQYXJhbXMiLCBudWxsLCAwLCAxLCBBc3luY01ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEFzeW5jTWV0aG9kVHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBBc3luY01ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhjbXBGaWVsZEVDbGFzcywgQ01QRmllbGQuY2xhc3MsICJDTVBGaWVsZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q01QRmllbGRfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBDTVBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q01QRmllbGRfRmllbGROYW1lKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SmF2YUlkZW50aWZpZXIoKSwgImZpZWxkTmFtZSIsIG51bGwsIDEsIDEsIENNUEZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDTVBGaWVsZF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBDTVBGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGNtckZpZWxkRUNsYXNzLCBDTVJGaWVsZC5jbGFzcywgIkNNUkZpZWxkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRDTVJGaWVsZF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIENNUkZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDTVJGaWVsZF9DbXJGaWVsZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImNtckZpZWxkTmFtZSIsIG51bGwsIDEsIDEsIENNUkZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDTVJGaWVsZF9DbXJGaWVsZFR5cGUoKSwgdGhpcy5nZXRDTVJGaWVsZFR5cGUoKSwgImNtckZpZWxkVHlwZSIsIG51bGwsIDAsIDEsIENNUkZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENNUkZpZWxkX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIENNUkZpZWxkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoY29uY3VycmVudE1ldGhvZFR5cGVFQ2xhc3MsIENvbmN1cnJlbnRNZXRob2RUeXBlLmNsYXNzLCAiQ29uY3VycmVudE1ldGhvZFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldENvbmN1cnJlbnRNZXRob2RUeXBlX01ldGhvZCgpLCB0aGlzLmdldE5hbWVkTWV0aG9kVHlwZSgpLCBudWxsLCAibWV0aG9kIiwgbnVsbCwgMSwgMSwgQ29uY3VycmVudE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbmN1cnJlbnRNZXRob2RUeXBlX0xvY2soKSwgdGhpcy5nZXRDb25jdXJyZW50TG9ja1R5cGVUeXBlKCksICJsb2NrIiwgbnVsbCwgMCwgMSwgQ29uY3VycmVudE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29uY3VycmVudE1ldGhvZFR5cGVfQWNjZXNzVGltZW91dCgpLCB0aGlzLmdldEFjY2Vzc1RpbWVvdXRUeXBlKCksIG51bGwsICJhY2Nlc3NUaW1lb3V0IiwgbnVsbCwgMCwgMSwgQ29uY3VycmVudE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbmN1cnJlbnRNZXRob2RUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIENvbmN1cnJlbnRNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoY29udGFpbmVyVHJhbnNhY3Rpb25UeXBlRUNsYXNzLCBDb250YWluZXJUcmFuc2FjdGlvblR5cGUuY2xhc3MsICJDb250YWluZXJUcmFuc2FjdGlvblR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZV9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX01ldGhvZHMoKSwgdGhpcy5nZXRNZXRob2RUeXBlKCksIG51bGwsICJtZXRob2RzIiwgbnVsbCwgMSwgLTEsIENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX1RyYW5zQXR0cmlidXRlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCksICJ0cmFuc0F0dHJpYnV0ZSIsIG51bGwsIDEsIDEsIENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoZGVwZW5kc09uVHlwZUVDbGFzcywgRGVwZW5kc09uVHlwZS5jbGFzcywgIkRlcGVuZHNPblR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldERlcGVuZHNPblR5cGVfRWpiTmFtZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVKQkxpbmsoKSwgImVqYk5hbWUiLCBudWxsLCAxLCAtMSwgRGVwZW5kc09uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldERlcGVuZHNPblR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRGVwZW5kc09uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGVqYkphckVDbGFzcywgRUpCSmFyLmNsYXNzLCAiRUpCSmFyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJKYXJfTW9kdWxlTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAibW9kdWxlTmFtZSIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVKQkphcl9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpLCB0aGlzLmdldEVudGVycHJpc2VCZWFucygpLCBudWxsLCAiZW50ZXJwcmlzZUJlYW5zIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfSW50ZXJjZXB0b3JzKCksIHRoaXMuZ2V0SW50ZXJjZXB0b3JzVHlwZSgpLCBudWxsLCAiaW50ZXJjZXB0b3JzIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfUmVsYXRpb25zaGlwcygpLCB0aGlzLmdldFJlbGF0aW9uc2hpcHMoKSwgbnVsbCwgInJlbGF0aW9uc2hpcHMiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVKQkphcl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSwgbnVsbCwgImFzc2VtYmx5RGVzY3JpcHRvciIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCSmFyX0VqYkNsaWVudEphcigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhdGhUeXBlKCksICJlamJDbGllbnRKYXIiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVKQkphcl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCSmFyX01ldGFkYXRhQ29tcGxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAibWV0YWRhdGFDb21wbGV0ZSIsIG51bGwsIDAsIDEsIEVKQkphci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJKYXJfVmVyc2lvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERld2V5VmVyc2lvblR5cGUoKSwgInZlcnNpb24iLCAiMy4xIiwgMSwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQorCQkJaW5pdEVDbGFzcyhlamJKYXJEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IuY2xhc3MsICJFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgIm1peGVkIiwgbnVsbCwgMCwgLTEsIG51bGwsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhNTE5TUHJlZml4TWFwIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4U0lTY2hlbWFMb2NhdGlvbiIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yX0VqYkphcigpLCB0aGlzLmdldEVKQkphcigpLCBudWxsLCAiZWpiSmFyIiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoZWpiUmVsYXRpb25FQ2xhc3MsIEVKQlJlbGF0aW9uLmNsYXNzLCAiRUpCUmVsYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uX0VqYlJlbGF0aW9uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAiZWpiUmVsYXRpb25OYW1lIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uX0VqYlJlbGF0aW9uc2hpcFJvbGVzKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpLCBudWxsLCAiZWpiUmVsYXRpb25zaGlwUm9sZXMiLCBudWxsLCAyLCAyLCBFSkJSZWxhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhlamJSZWxhdGlvbnNoaXBSb2xlRUNsYXNzLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAiRUpCUmVsYXRpb25zaGlwUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRWpiUmVsYXRpb25zaGlwUm9sZU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImVqYlJlbGF0aW9uc2hpcFJvbGVOYW1lIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9NdWx0aXBsaWNpdHkoKSwgdGhpcy5nZXRNdWx0aXBsaWNpdHlUeXBlKCksICJtdWx0aXBsaWNpdHkiLCBudWxsLCAxLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ2FzY2FkZURlbGV0ZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVtcHR5VHlwZSgpLCBudWxsLCAiY2FzY2FkZURlbGV0ZSIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfUmVsYXRpb25zaGlwUm9sZVNvdXJjZSgpLCB0aGlzLmdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKCksIG51bGwsICJyZWxhdGlvbnNoaXBSb2xlU291cmNlIiwgbnVsbCwgMSwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpLCB0aGlzLmdldENNUkZpZWxkKCksIG51bGwsICJjbXJGaWVsZCIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGVudGVycHJpc2VCZWFuc0VDbGFzcywgRW50ZXJwcmlzZUJlYW5zLmNsYXNzLCAiRW50ZXJwcmlzZUJlYW5zIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRlcnByaXNlQmVhbnNfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIEVudGVycHJpc2VCZWFucy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuc19TZXNzaW9uQmVhbnMoKSwgdGhpcy5nZXRTZXNzaW9uQmVhbigpLCBudWxsLCAic2Vzc2lvbkJlYW5zIiwgbnVsbCwgMCwgLTEsIEVudGVycHJpc2VCZWFucy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5zX0VudGl0eUJlYW5zKCksIHRoaXMuZ2V0RW50aXR5QmVhbigpLCBudWxsLCAiZW50aXR5QmVhbnMiLCBudWxsLCAwLCAtMSwgRW50ZXJwcmlzZUJlYW5zLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbnNfTWVzc2FnZURyaXZlbkJlYW5zKCksIHRoaXMuZ2V0TWVzc2FnZURyaXZlbkJlYW4oKSwgbnVsbCwgIm1lc3NhZ2VEcml2ZW5CZWFucyIsIG51bGwsIDAsIC0xLCBFbnRlcnByaXNlQmVhbnMuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVudGVycHJpc2VCZWFuc19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFbnRlcnByaXNlQmVhbnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhlbnRpdHlCZWFuRUNsYXNzLCBFbnRpdHlCZWFuLmNsYXNzLCAiRW50aXR5QmVhbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlCZWFuX0ljb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9FamJOYW1lKCksIHRoaXMuZ2V0RWpiTmFtZVR5cGUoKSwgImVqYk5hbWUiLCBudWxsLCAxLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9Ib21lKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SG9tZSgpLCAiaG9tZSIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fUmVtb3RlKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVtb3RlKCksICJyZW1vdGUiLCBudWxsLCAwLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX0xvY2FsSG9tZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExvY2FsSG9tZSgpLCAibG9jYWxIb21lIiwgbnVsbCwgMCwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9Mb2NhbCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExvY2FsKCksICJsb2NhbCIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fRWpiQ2xhc3MoKSwgdGhpcy5nZXRFamJDbGFzc1R5cGUoKSwgImVqYkNsYXNzIiwgbnVsbCwgMSwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9QZXJzaXN0ZW5jZVR5cGUoKSwgdGhpcy5nZXRQZXJzaXN0ZW5jZVR5cGUoKSwgInBlcnNpc3RlbmNlVHlwZSIsIG51bGwsIDEsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9QcmltS2V5Q2xhc3MoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAicHJpbUtleUNsYXNzIiwgbnVsbCwgMSwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9SZWVudHJhbnQoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJyZWVudHJhbnQiLCBudWxsLCAxLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fQ21wVmVyc2lvbigpLCB0aGlzLmdldENtcFZlcnNpb25UeXBlKCksICJjbXBWZXJzaW9uIiwgbnVsbCwgMCwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlCZWFuX0Fic3RyYWN0U2NoZW1hTmFtZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEphdmFJZGVudGlmaWVyKCksICJhYnN0cmFjdFNjaGVtYU5hbWUiLCBudWxsLCAwLCAxLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlCZWFuX0NtcEZpZWxkcygpLCB0aGlzLmdldENNUEZpZWxkKCksIG51bGwsICJjbXBGaWVsZHMiLCBudWxsLCAwLCAtMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RW50aXR5QmVhbl9Qcmlta2V5RmllbGQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInByaW1rZXlGaWVsZCIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fRW52RW50cmllcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVudkVudHJ5KCksIG51bGwsICJlbnZFbnRyaWVzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fRWpiUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlCZWFuX0VqYkxvY2FsUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYkxvY2FsUmVmKCksIG51bGwsICJlamJMb2NhbFJlZnMiLCBudWxsLCAwLCAtMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9TZXJ2aWNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fUmVzb3VyY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VSZWYoKSwgbnVsbCwgInJlc291cmNlUmVmcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlCZWFuX1Jlc291cmNlRW52UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlRW52UmVmKCksIG51bGwsICJyZXNvdXJjZUVudlJlZnMiLCBudWxsLCAwLCAtMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VDb250ZXh0UmVmcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlCZWFuX1BlcnNpc3RlbmNlVW5pdFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKSwgbnVsbCwgInBlcnNpc3RlbmNlVW5pdFJlZnMiLCBudWxsLCAwLCAtMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50aXR5QmVhbl9Qb3N0Q29uc3RydWN0cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwb3N0Q29uc3RydWN0cyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlCZWFuX1ByZURlc3Ryb3lzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInByZURlc3Ryb3lzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fRGF0YVNvdXJjZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERhdGFTb3VyY2VUeXBlKCksIG51bGwsICJkYXRhU291cmNlIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fU2VjdXJpdHlSb2xlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlY3VyaXR5Um9sZVJlZigpLCBudWxsLCAic2VjdXJpdHlSb2xlUmVmcyIsIG51bGwsIDAsIC0xLCBFbnRpdHlCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlCZWFuX1NlY3VyaXR5SWRlbnRpdHkoKSwgdGhpcy5nZXRTZWN1cml0eUlkZW50aXR5VHlwZSgpLCBudWxsLCAic2VjdXJpdHlJZGVudGl0eSIsIG51bGwsIDAsIDEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUJlYW5fUXVlcmllcygpLCB0aGlzLmdldFF1ZXJ5KCksIG51bGwsICJxdWVyaWVzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUJlYW5fSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRW50aXR5QmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGV4Y2x1ZGVMaXN0RUNsYXNzLCBFeGNsdWRlTGlzdC5jbGFzcywgIkV4Y2x1ZGVMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEV4Y2x1ZGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFeGNsdWRlTGlzdF9NZXRob2RzKCksIHRoaXMuZ2V0TWV0aG9kVHlwZSgpLCBudWxsLCAibWV0aG9kcyIsIG51bGwsIDEsIC0xLCBFeGNsdWRlTGlzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXhjbHVkZUxpc3RfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRXhjbHVkZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhpbml0TWV0aG9kVHlwZUVDbGFzcywgSW5pdE1ldGhvZFR5cGUuY2xhc3MsICJJbml0TWV0aG9kVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5pdE1ldGhvZFR5cGVfQ3JlYXRlTWV0aG9kKCksIHRoaXMuZ2V0TmFtZWRNZXRob2RUeXBlKCksIG51bGwsICJjcmVhdGVNZXRob2QiLCBudWxsLCAxLCAxLCBJbml0TWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW5pdE1ldGhvZFR5cGVfQmVhbk1ldGhvZCgpLCB0aGlzLmdldE5hbWVkTWV0aG9kVHlwZSgpLCBudWxsLCAiYmVhbk1ldGhvZCIsIG51bGwsIDEsIDEsIEluaXRNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0TWV0aG9kVHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBJbml0TWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGludGVyY2VwdG9yQmluZGluZ1R5cGVFQ2xhc3MsIEludGVyY2VwdG9yQmluZGluZ1R5cGUuY2xhc3MsICJJbnRlcmNlcHRvckJpbmRpbmdUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9FamJOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJlamJOYW1lIiwgbnVsbCwgMSwgMSwgSW50ZXJjZXB0b3JCaW5kaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9JbnRlcmNlcHRvckNsYXNzZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiaW50ZXJjZXB0b3JDbGFzc2VzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yQmluZGluZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0ludGVyY2VwdG9yT3JkZXIoKSwgdGhpcy5nZXRJbnRlcmNlcHRvck9yZGVyVHlwZSgpLCBudWxsLCAiaW50ZXJjZXB0b3JPcmRlciIsIG51bGwsIDAsIDEsIEludGVyY2VwdG9yQmluZGluZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJleGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycyIsIG51bGwsIDAsIDEsIEludGVyY2VwdG9yQmluZGluZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JCaW5kaW5nVHlwZV9FeGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnMiLCBudWxsLCAwLCAxLCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yQmluZGluZ1R5cGVfTWV0aG9kKCksIHRoaXMuZ2V0TmFtZWRNZXRob2RUeXBlKCksIG51bGwsICJtZXRob2QiLCBudWxsLCAwLCAxLCBJbnRlcmNlcHRvckJpbmRpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRJbnRlcmNlcHRvckJpbmRpbmdUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEludGVyY2VwdG9yQmluZGluZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhpbnRlcmNlcHRvck9yZGVyVHlwZUVDbGFzcywgSW50ZXJjZXB0b3JPcmRlclR5cGUuY2xhc3MsICJJbnRlcmNlcHRvck9yZGVyVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JPcmRlclR5cGVfSW50ZXJjZXB0b3JDbGFzc2VzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImludGVyY2VwdG9yQ2xhc3NlcyIsIG51bGwsIDEsIC0xLCBJbnRlcmNlcHRvck9yZGVyVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEludGVyY2VwdG9yT3JkZXJUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEludGVyY2VwdG9yT3JkZXJUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoaW50ZXJjZXB0b3JzVHlwZUVDbGFzcywgSW50ZXJjZXB0b3JzVHlwZS5jbGFzcywgIkludGVyY2VwdG9yc1R5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yc1R5cGVfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvcnNUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvcnNUeXBlX0ludGVyY2VwdG9ycygpLCB0aGlzLmdldEludGVyY2VwdG9yVHlwZSgpLCBudWxsLCAiaW50ZXJjZXB0b3JzIiwgbnVsbCwgMSwgLTEsIEludGVyY2VwdG9yc1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEludGVyY2VwdG9yc1R5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgSW50ZXJjZXB0b3JzVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGludGVyY2VwdG9yVHlwZUVDbGFzcywgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAiSW50ZXJjZXB0b3JUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEludGVyY2VwdG9yVHlwZV9JbnRlcmNlcHRvckNsYXNzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImludGVyY2VwdG9yQ2xhc3MiLCBudWxsLCAxLCAxLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9Bcm91bmRJbnZva2VzKCksIHRoaXMuZ2V0QXJvdW5kSW52b2tlVHlwZSgpLCBudWxsLCAiYXJvdW5kSW52b2tlcyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9Bcm91bmRUaW1lb3V0cygpLCB0aGlzLmdldEFyb3VuZFRpbWVvdXRUeXBlKCksIG51bGwsICJhcm91bmRUaW1lb3V0cyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9FbnZFbnRyaWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW52RW50cnkoKSwgbnVsbCwgImVudkVudHJpZXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfRWpiUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmcyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9FamJMb2NhbFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJMb2NhbFJlZigpLCBudWxsLCAiZWpiTG9jYWxSZWZzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX1NlcnZpY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfUmVzb3VyY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VSZWYoKSwgbnVsbCwgInJlc291cmNlUmVmcyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9SZXNvdXJjZUVudlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZUVudlJlZigpLCBudWxsLCAicmVzb3VyY2VFbnZSZWZzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VDb250ZXh0UmVmcyIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9QZXJzaXN0ZW5jZVVuaXRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZVVuaXRSZWZzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX1Bvc3RDb25zdHJ1Y3RzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RDb25zdHJ1Y3RzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX1ByZURlc3Ryb3lzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInByZURlc3Ryb3lzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0SW50ZXJjZXB0b3JUeXBlX0RhdGFTb3VyY2UoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREYXRhU291cmNlVHlwZSgpLCBudWxsLCAiZGF0YVNvdXJjZSIsIG51bGwsIDAsIC0xLCBJbnRlcmNlcHRvclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEludGVyY2VwdG9yVHlwZV9Qb3N0QWN0aXZhdGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RBY3RpdmF0ZXMiLCBudWxsLCAwLCAtMSwgSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRJbnRlcmNlcHRvclR5cGVfUHJlUGFzc2l2YXRlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwcmVQYXNzaXZhdGVzIiwgbnVsbCwgMCwgLTEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW50ZXJjZXB0b3JUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEludGVyY2VwdG9yVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKG1lc3NhZ2VEcml2ZW5CZWFuRUNsYXNzLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIk1lc3NhZ2VEcml2ZW5CZWFuIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9FamJOYW1lKCksIHRoaXMuZ2V0RWpiTmFtZVR5cGUoKSwgImVqYk5hbWUiLCBudWxsLCAxLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWFwcGVkTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcHBlZE5hbWUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRWpiQ2xhc3MoKSwgdGhpcy5nZXRFamJDbGFzc1R5cGUoKSwgImVqYkNsYXNzIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2luZ1R5cGUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAibWVzc2FnaW5nVHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9UaW1lb3V0TWV0aG9kKCksIHRoaXMuZ2V0TmFtZWRNZXRob2RUeXBlKCksIG51bGwsICJ0aW1lb3V0TWV0aG9kIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1RpbWVyKCksIHRoaXMuZ2V0VGltZXJUeXBlKCksIG51bGwsICJ0aW1lciIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlKCksICJ0cmFuc2FjdGlvblR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9NZXNzYWdlRGVzdGluYXRpb25UeXBlKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZVR5cGUoKSwgIm1lc3NhZ2VEZXN0aW5hdGlvblR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uTGluaygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSwgIm1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fQWN0aXZhdGlvbkNvbmZpZygpLCB0aGlzLmdldEFjdGl2YXRpb25Db25maWcoKSwgbnVsbCwgImFjdGl2YXRpb25Db25maWciLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fQXJvdW5kSW52b2tlcygpLCB0aGlzLmdldEFyb3VuZEludm9rZVR5cGUoKSwgbnVsbCwgImFyb3VuZEludm9rZXMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Fyb3VuZFRpbWVvdXRzKCksIHRoaXMuZ2V0QXJvdW5kVGltZW91dFR5cGUoKSwgbnVsbCwgImFyb3VuZFRpbWVvdXRzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9FbnZFbnRyaWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW52RW50cnkoKSwgbnVsbCwgImVudkVudHJpZXMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJSZWYoKSwgbnVsbCwgImVqYlJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0VqYkxvY2FsUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYkxvY2FsUmVmKCksIG51bGwsICJlamJMb2NhbFJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1NlcnZpY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1Jlc291cmNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlUmVmKCksIG51bGwsICJyZXNvdXJjZVJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1Jlc291cmNlRW52UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlRW52UmVmKCksIG51bGwsICJyZXNvdXJjZUVudlJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWYoKSwgbnVsbCwgInBlcnNpc3RlbmNlQ29udGV4dFJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1BlcnNpc3RlbmNlVW5pdFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKSwgbnVsbCwgInBlcnNpc3RlbmNlVW5pdFJlZnMiLCBudWxsLCAwLCAtMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1Bvc3RDb25zdHJ1Y3RzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RDb25zdHJ1Y3RzIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9QcmVEZXN0cm95cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwcmVEZXN0cm95cyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRGF0YVNvdXJjZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERhdGFTb3VyY2VUeXBlKCksIG51bGwsICJkYXRhU291cmNlIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuQmVhbl9TZWN1cml0eVJvbGVSZWYoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZWN1cml0eVJvbGVSZWYoKSwgbnVsbCwgInNlY3VyaXR5Um9sZVJlZiIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRHJpdmVuQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VjdXJpdHlJZGVudGl0eSgpLCB0aGlzLmdldFNlY3VyaXR5SWRlbnRpdHlUeXBlKCksIG51bGwsICJzZWN1cml0eUlkZW50aXR5IiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5CZWFuX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MobWV0aG9kUGFyYW1zRUNsYXNzLCBNZXRob2RQYXJhbXMuY2xhc3MsICJNZXRob2RQYXJhbXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBhcmFtc19NZXRob2RQYXJhbXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRKYXZhVHlwZSgpLCAibWV0aG9kUGFyYW1zIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhcmFtcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBhcmFtc19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXRob2RQYXJhbXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhtZXRob2RQZXJtaXNzaW9uRUNsYXNzLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAiTWV0aG9kUGVybWlzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBlcm1pc3Npb25fUm9sZU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lcyIsIG51bGwsIDAsIC0xLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFbXB0eVR5cGUoKSwgbnVsbCwgInVuY2hlY2tlZCIsIG51bGwsIDAsIDEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBlcm1pc3Npb25fTWV0aG9kcygpLCB0aGlzLmdldE1ldGhvZFR5cGUoKSwgbnVsbCwgIm1ldGhvZHMiLCBudWxsLCAxLCAtMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGVybWlzc2lvbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MobWV0aG9kVHlwZUVDbGFzcywgTWV0aG9kVHlwZS5jbGFzcywgIk1ldGhvZFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFR5cGVfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RUeXBlX0VqYk5hbWUoKSwgdGhpcy5nZXRFamJOYW1lVHlwZSgpLCAiZWpiTmFtZSIsIG51bGwsIDEsIDEsIE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFR5cGVfTWV0aG9kSW50ZigpLCB0aGlzLmdldE1ldGhvZEludGVyZmFjZVR5cGUoKSwgIm1ldGhvZEludGYiLCBudWxsLCAwLCAxLCBNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFR5cGVfTWV0aG9kTmFtZSgpLCB0aGlzLmdldE1ldGhvZE5hbWVUeXBlKCksICJtZXRob2ROYW1lIiwgbnVsbCwgMSwgMSwgTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKSwgdGhpcy5nZXRNZXRob2RQYXJhbXMoKSwgbnVsbCwgIm1ldGhvZFBhcmFtcyIsIG51bGwsIDAsIDEsIE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKG5hbWVkTWV0aG9kVHlwZUVDbGFzcywgTmFtZWRNZXRob2RUeXBlLmNsYXNzLCAiTmFtZWRNZXRob2RUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXROYW1lZE1ldGhvZFR5cGVfTWV0aG9kTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAibWV0aG9kTmFtZSIsIG51bGwsIDEsIDEsIE5hbWVkTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TmFtZWRNZXRob2RUeXBlX01ldGhvZFBhcmFtcygpLCB0aGlzLmdldE1ldGhvZFBhcmFtcygpLCBudWxsLCAibWV0aG9kUGFyYW1zIiwgbnVsbCwgMCwgMSwgTmFtZWRNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXROYW1lZE1ldGhvZFR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTmFtZWRNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MocXVlcnlFQ2xhc3MsIFF1ZXJ5LmNsYXNzLCAiUXVlcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5X0Rlc2NyaXB0aW9uKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5X1F1ZXJ5TWV0aG9kKCksIHRoaXMuZ2V0UXVlcnlNZXRob2QoKSwgbnVsbCwgInF1ZXJ5TWV0aG9kIiwgbnVsbCwgMSwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFF1ZXJ5X1Jlc3VsdFR5cGVNYXBwaW5nKCksIHRoaXMuZ2V0UmVzdWx0VHlwZU1hcHBpbmdUeXBlKCksICJyZXN1bHRUeXBlTWFwcGluZyIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFF1ZXJ5X0VqYlFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZWpiUWwiLCBudWxsLCAxLCAxLCBRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UXVlcnlfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhxdWVyeU1ldGhvZEVDbGFzcywgUXVlcnlNZXRob2QuY2xhc3MsICJRdWVyeU1ldGhvZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UXVlcnlNZXRob2RfTWV0aG9kTmFtZSgpLCB0aGlzLmdldE1ldGhvZE5hbWVUeXBlKCksICJtZXRob2ROYW1lIiwgbnVsbCwgMSwgMSwgUXVlcnlNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5TWV0aG9kX01ldGhvZFBhcmFtcygpLCB0aGlzLmdldE1ldGhvZFBhcmFtcygpLCBudWxsLCAibWV0aG9kUGFyYW1zIiwgbnVsbCwgMSwgMSwgUXVlcnlNZXRob2QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFF1ZXJ5TWV0aG9kX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFF1ZXJ5TWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MocmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVFQ2xhc3MsIFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlLmNsYXNzLCAiUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlX0VqYk5hbWUoKSwgdGhpcy5nZXRFamJOYW1lVHlwZSgpLCAiZWpiTmFtZSIsIG51bGwsIDEsIDEsIFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHJlbGF0aW9uc2hpcHNFQ2xhc3MsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICJSZWxhdGlvbnNoaXBzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVsYXRpb25zaGlwcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVsYXRpb25zaGlwc19FamJSZWxhdGlvbnMoKSwgdGhpcy5nZXRFSkJSZWxhdGlvbigpLCBudWxsLCAiZWpiUmVsYXRpb25zIiwgbnVsbCwgMSwgLTEsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJlbGF0aW9uc2hpcHNfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVsYXRpb25zaGlwcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHJlbW92ZU1ldGhvZFR5cGVFQ2xhc3MsIFJlbW92ZU1ldGhvZFR5cGUuY2xhc3MsICJSZW1vdmVNZXRob2RUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRSZW1vdmVNZXRob2RUeXBlX0JlYW5NZXRob2QoKSwgdGhpcy5nZXROYW1lZE1ldGhvZFR5cGUoKSwgbnVsbCwgImJlYW5NZXRob2QiLCBudWxsLCAxLCAxLCBSZW1vdmVNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZW1vdmVNZXRob2RUeXBlX1JldGFpbklmRXhjZXB0aW9uKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAicmV0YWluSWZFeGNlcHRpb24iLCBudWxsLCAwLCAxLCBSZW1vdmVNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJlbW92ZU1ldGhvZFR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVtb3ZlTWV0aG9kVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHNlY3VyaXR5SWRlbnRpdHlUeXBlRUNsYXNzLCBTZWN1cml0eUlkZW50aXR5VHlwZS5jbGFzcywgIlNlY3VyaXR5SWRlbnRpdHlUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5SWRlbnRpdHlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUlkZW50aXR5VHlwZV9Vc2VDYWxsZXJJZGVudGl0eSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVtcHR5VHlwZSgpLCBudWxsLCAidXNlQ2FsbGVySWRlbnRpdHkiLCBudWxsLCAwLCAxLCBTZWN1cml0eUlkZW50aXR5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfUnVuQXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSdW5BcygpLCBudWxsLCAicnVuQXMiLCBudWxsLCAwLCAxLCBTZWN1cml0eUlkZW50aXR5VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlJZGVudGl0eVR5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlJZGVudGl0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhzZXNzaW9uQmVhbkVDbGFzcywgU2Vzc2lvbkJlYW4uY2xhc3MsICJTZXNzaW9uQmVhbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fSWNvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fRWpiTmFtZSgpLCB0aGlzLmdldEVqYk5hbWVUeXBlKCksICJlamJOYW1lIiwgbnVsbCwgMSwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX01hcHBlZE5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWROYW1lIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0hvbWUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRIb21lKCksICJob21lIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX1JlbW90ZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlbW90ZSgpLCAicmVtb3RlIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0xvY2FsSG9tZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExvY2FsSG9tZSgpLCAibG9jYWxIb21lIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0xvY2FsKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TG9jYWwoKSwgImxvY2FsIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0J1c2luZXNzTG9jYWxzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImJ1c2luZXNzTG9jYWxzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fQnVzaW5lc3NSZW1vdGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc1R5cGUoKSwgImJ1c2luZXNzUmVtb3RlcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0xvY2FsQmVhbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVtcHR5VHlwZSgpLCBudWxsLCAibG9jYWxCZWFuIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX1NlcnZpY2VFbmRwb2ludCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJzZXJ2aWNlRW5kcG9pbnQiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkJlYW5fRWpiQ2xhc3MoKSwgdGhpcy5nZXRFamJDbGFzc1R5cGUoKSwgImVqYkNsYXNzIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX1Nlc3Npb25UeXBlKCksIHRoaXMuZ2V0U2Vzc2lvblR5cGUoKSwgInNlc3Npb25UeXBlIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fU3RhdGVmdWxUaW1lb3V0KCksIHRoaXMuZ2V0U3RhdGVmdWxUaW1lb3V0VHlwZSgpLCBudWxsLCAic3RhdGVmdWxUaW1lb3V0IiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1RpbWVvdXRNZXRob2QoKSwgdGhpcy5nZXROYW1lZE1ldGhvZFR5cGUoKSwgbnVsbCwgInRpbWVvdXRNZXRob2QiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fVGltZXIoKSwgdGhpcy5nZXRUaW1lclR5cGUoKSwgbnVsbCwgInRpbWVyIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uQmVhbl9Jbml0T25TdGFydHVwKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAiaW5pdE9uU3RhcnR1cCIsIG51bGwsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0NvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUoKSwgdGhpcy5nZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZSgpLCAiY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSIsIG51bGwsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0NvbmN1cnJlbnRNZXRob2QoKSwgdGhpcy5nZXRDb25jdXJyZW50TWV0aG9kVHlwZSgpLCBudWxsLCAiY29uY3VycmVudE1ldGhvZCIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fRGVwZW5kc09uKCksIHRoaXMuZ2V0RGVwZW5kc09uVHlwZSgpLCBudWxsLCAiZGVwZW5kc09uIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0luaXRNZXRob2RzKCksIHRoaXMuZ2V0SW5pdE1ldGhvZFR5cGUoKSwgbnVsbCwgImluaXRNZXRob2RzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9SZW1vdmVNZXRob2RzKCksIHRoaXMuZ2V0UmVtb3ZlTWV0aG9kVHlwZSgpLCBudWxsLCAicmVtb3ZlTWV0aG9kcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fQXN5bmNNZXRob2QoKSwgdGhpcy5nZXRBc3luY01ldGhvZFR5cGUoKSwgbnVsbCwgImFzeW5jTWV0aG9kIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uQmVhbl9UcmFuc2FjdGlvblR5cGUoKSwgdGhpcy5nZXRUcmFuc2FjdGlvblR5cGUoKSwgInRyYW5zYWN0aW9uVHlwZSIsIG51bGwsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0FmdGVyQmVnaW5NZXRob2QoKSwgdGhpcy5nZXROYW1lZE1ldGhvZFR5cGUoKSwgbnVsbCwgImFmdGVyQmVnaW5NZXRob2QiLCBudWxsLCAwLCAxLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fQmVmb3JlQ29tcGxldGlvbk1ldGhvZCgpLCB0aGlzLmdldE5hbWVkTWV0aG9kVHlwZSgpLCBudWxsLCAiYmVmb3JlQ29tcGxldGlvbk1ldGhvZCIsIG51bGwsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9BZnRlckNvbXBsZXRpb25NZXRob2QoKSwgdGhpcy5nZXROYW1lZE1ldGhvZFR5cGUoKSwgbnVsbCwgImFmdGVyQ29tcGxldGlvbk1ldGhvZCIsIG51bGwsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9Bcm91bmRJbnZva2VzKCksIHRoaXMuZ2V0QXJvdW5kSW52b2tlVHlwZSgpLCBudWxsLCAiYXJvdW5kSW52b2tlcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fQXJvdW5kVGltZW91dHMoKSwgdGhpcy5nZXRBcm91bmRUaW1lb3V0VHlwZSgpLCBudWxsLCAiYXJvdW5kVGltZW91dHMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX0VudkVudHJpZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFbnZFbnRyeSgpLCBudWxsLCAiZW52RW50cmllcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fRWpiUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fRWpiTG9jYWxSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiTG9jYWxSZWYoKSwgbnVsbCwgImVqYkxvY2FsUmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fU2VydmljZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUmVzb3VyY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VSZWYoKSwgbnVsbCwgInJlc291cmNlUmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUmVzb3VyY2VFbnZSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VDb250ZXh0UmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUGVyc2lzdGVuY2VVbml0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlVW5pdFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0UmVmcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUG9zdENvbnN0cnVjdHMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicG9zdENvbnN0cnVjdHMiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1ByZURlc3Ryb3lzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInByZURlc3Ryb3lzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9EYXRhU291cmNlKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGF0YVNvdXJjZVR5cGUoKSwgbnVsbCwgImRhdGFTb3VyY2UiLCBudWxsLCAwLCAtMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25CZWFuX1Bvc3RBY3RpdmF0ZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicG9zdEFjdGl2YXRlcyIsIG51bGwsIDAsIC0xLCBTZXNzaW9uQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkJlYW5fUHJlUGFzc2l2YXRlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwcmVQYXNzaXZhdGVzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9TZWN1cml0eVJvbGVSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlUmVmKCksIG51bGwsICJzZWN1cml0eVJvbGVSZWZzIiwgbnVsbCwgMCwgLTEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXNzaW9uQmVhbl9TZWN1cml0eUlkZW50aXRpZXMoKSwgdGhpcy5nZXRTZWN1cml0eUlkZW50aXR5VHlwZSgpLCBudWxsLCAic2VjdXJpdHlJZGVudGl0aWVzIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25CZWFuX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlc3Npb25CZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Moc3RhdGVmdWxUaW1lb3V0VHlwZUVDbGFzcywgU3RhdGVmdWxUaW1lb3V0VHlwZS5jbGFzcywgIlN0YXRlZnVsVGltZW91dFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFN0YXRlZnVsVGltZW91dFR5cGVfVGltZW91dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRlZ2VyKCksICJ0aW1lb3V0IiwgbnVsbCwgMSwgMSwgU3RhdGVmdWxUaW1lb3V0VHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3RhdGVmdWxUaW1lb3V0VHlwZV9Vbml0KCksIHRoaXMuZ2V0VGltZVVuaXRUeXBlVHlwZSgpLCAidW5pdCIsIG51bGwsIDEsIDEsIFN0YXRlZnVsVGltZW91dFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3RhdGVmdWxUaW1lb3V0VHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTdGF0ZWZ1bFRpbWVvdXRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3ModGltZXJTY2hlZHVsZVR5cGVFQ2xhc3MsIFRpbWVyU2NoZWR1bGVUeXBlLmNsYXNzLCAiVGltZXJTY2hlZHVsZVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFRpbWVyU2NoZWR1bGVUeXBlX1NlY29uZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAic2Vjb25kIiwgbnVsbCwgMCwgMSwgVGltZXJTY2hlZHVsZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFRpbWVyU2NoZWR1bGVUeXBlX01pbnV0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAibWludXRlIiwgbnVsbCwgMCwgMSwgVGltZXJTY2hlZHVsZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFRpbWVyU2NoZWR1bGVUeXBlX0hvdXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImhvdXIiLCBudWxsLCAwLCAxLCBUaW1lclNjaGVkdWxlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGltZXJTY2hlZHVsZVR5cGVfRGF5T2ZNb250aCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAiZGF5T2ZNb250aCIsIG51bGwsIDAsIDEsIFRpbWVyU2NoZWR1bGVUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRUaW1lclNjaGVkdWxlVHlwZV9Nb250aCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAibW9udGgiLCBudWxsLCAwLCAxLCBUaW1lclNjaGVkdWxlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGltZXJTY2hlZHVsZVR5cGVfRGF5T2ZXZWVrKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJkYXlPZldlZWsiLCBudWxsLCAwLCAxLCBUaW1lclNjaGVkdWxlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGltZXJTY2hlZHVsZVR5cGVfWWVhcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAieWVhciIsIG51bGwsIDAsIDEsIFRpbWVyU2NoZWR1bGVUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRUaW1lclNjaGVkdWxlVHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBUaW1lclNjaGVkdWxlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHRpbWVyVHlwZUVDbGFzcywgVGltZXJUeXBlLmNsYXNzLCAiVGltZXJUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRUaW1lclR5cGVfRGVzY3JpcHRpb24oKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAtMSwgVGltZXJUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRUaW1lclR5cGVfU2NoZWR1bGUoKSwgdGhpcy5nZXRUaW1lclNjaGVkdWxlVHlwZSgpLCBudWxsLCAic2NoZWR1bGUiLCBudWxsLCAxLCAxLCBUaW1lclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFRpbWVyVHlwZV9TdGFydCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXREYXRlVGltZSgpLCAic3RhcnQiLCBudWxsLCAwLCAxLCBUaW1lclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFRpbWVyVHlwZV9FbmQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0RGF0ZVRpbWUoKSwgImVuZCIsIG51bGwsIDAsIDEsIFRpbWVyVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0VGltZXJUeXBlX1RpbWVvdXRNZXRob2QoKSwgdGhpcy5nZXROYW1lZE1ldGhvZFR5cGUoKSwgbnVsbCwgInRpbWVvdXRNZXRob2QiLCBudWxsLCAxLCAxLCBUaW1lclR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFRpbWVyVHlwZV9QZXJzaXN0ZW50KCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAicGVyc2lzdGVudCIsIG51bGwsIDAsIDEsIFRpbWVyVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRUaW1lclR5cGVfVGltZXpvbmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgInRpbWV6b25lIiwgbnVsbCwgMCwgMSwgVGltZXJUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRUaW1lclR5cGVfSW5mbygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAiaW5mbyIsIG51bGwsIDAsIDEsIFRpbWVyVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGltZXJUeXBlX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFRpbWVyVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscworCQkJaW5pdEVFbnVtKGNtcFZlcnNpb25UeXBlRUVudW0sIENtcFZlcnNpb25UeXBlLmNsYXNzLCAiQ21wVmVyc2lvblR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKGNtcFZlcnNpb25UeXBlRUVudW0sIENtcFZlcnNpb25UeXBlLl8xWF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChjbXBWZXJzaW9uVHlwZUVFbnVtLCBDbXBWZXJzaW9uVHlwZS5fMlhfTElURVJBTCk7CisJCisJCQlpbml0RUVudW0oY21yRmllbGRUeXBlRUVudW0sIENNUkZpZWxkVHlwZS5jbGFzcywgIkNNUkZpZWxkVHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwoY21yRmllbGRUeXBlRUVudW0sIENNUkZpZWxkVHlwZS5KQVZBX1VUSUxfQ09MTEVDVElPTl9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChjbXJGaWVsZFR5cGVFRW51bSwgQ01SRmllbGRUeXBlLkpBVkFfVVRJTF9TRVRfTElURVJBTCk7CisJCisJCQlpbml0RUVudW0oY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVFRW51bSwgQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUuY2xhc3MsICJDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwoY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVFRW51bSwgQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUuQkVBTik7CisJCQlhZGRFRW51bUxpdGVyYWwoY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVFRW51bSwgQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUuQ09OVEFJTkVSKTsKKwkKKwkJCWluaXRFRW51bShjb25jdXJyZW50TG9ja1R5cGVUeXBlRUVudW0sIENvbmN1cnJlbnRMb2NrVHlwZVR5cGUuY2xhc3MsICJDb25jdXJyZW50TG9ja1R5cGVUeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChjb25jdXJyZW50TG9ja1R5cGVUeXBlRUVudW0sIENvbmN1cnJlbnRMb2NrVHlwZVR5cGUuUkVBRCk7CisJCQlhZGRFRW51bUxpdGVyYWwoY29uY3VycmVudExvY2tUeXBlVHlwZUVFbnVtLCBDb25jdXJyZW50TG9ja1R5cGVUeXBlLldSSVRFKTsKKwkKKwkJCWluaXRFRW51bShtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0sIE1ldGhvZEludGVyZmFjZVR5cGUuY2xhc3MsICJNZXRob2RJbnRlcmZhY2VUeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0sIE1ldGhvZEludGVyZmFjZVR5cGUuSE9NRV9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0sIE1ldGhvZEludGVyZmFjZVR5cGUuUkVNT1RFX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKG1ldGhvZEludGVyZmFjZVR5cGVFRW51bSwgTWV0aG9kSW50ZXJmYWNlVHlwZS5MT0NBTF9IT01FX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKG1ldGhvZEludGVyZmFjZVR5cGVFRW51bSwgTWV0aG9kSW50ZXJmYWNlVHlwZS5MT0NBTF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0sIE1ldGhvZEludGVyZmFjZVR5cGUuU0VSVklDRV9FTkRQT0lOVF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RJbnRlcmZhY2VUeXBlRUVudW0sIE1ldGhvZEludGVyZmFjZVR5cGUuVElNRVJfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kSW50ZXJmYWNlVHlwZUVFbnVtLCBNZXRob2RJbnRlcmZhY2VUeXBlLk1FU1NBR0VfRU5EUE9JTlRfTElURVJBTCk7CisJCisJCQlpbml0RUVudW0obXVsdGlwbGljaXR5VHlwZUVFbnVtLCBNdWx0aXBsaWNpdHlUeXBlLmNsYXNzLCAiTXVsdGlwbGljaXR5VHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwobXVsdGlwbGljaXR5VHlwZUVFbnVtLCBNdWx0aXBsaWNpdHlUeXBlLk9ORV9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChtdWx0aXBsaWNpdHlUeXBlRUVudW0sIE11bHRpcGxpY2l0eVR5cGUuTUFOWV9MSVRFUkFMKTsKKwkKKwkJCWluaXRFRW51bShwZXJzaXN0ZW5jZVR5cGVFRW51bSwgUGVyc2lzdGVuY2VUeXBlLmNsYXNzLCAiUGVyc2lzdGVuY2VUeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChwZXJzaXN0ZW5jZVR5cGVFRW51bSwgUGVyc2lzdGVuY2VUeXBlLkJFQU5fTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwocGVyc2lzdGVuY2VUeXBlRUVudW0sIFBlcnNpc3RlbmNlVHlwZS5DT05UQUlORVJfTElURVJBTCk7CisJCisJCQlpbml0RUVudW0ocmVzdWx0VHlwZU1hcHBpbmdUeXBlRUVudW0sIFJlc3VsdFR5cGVNYXBwaW5nVHlwZS5jbGFzcywgIlJlc3VsdFR5cGVNYXBwaW5nVHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwocmVzdWx0VHlwZU1hcHBpbmdUeXBlRUVudW0sIFJlc3VsdFR5cGVNYXBwaW5nVHlwZS5MT0NBTF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChyZXN1bHRUeXBlTWFwcGluZ1R5cGVFRW51bSwgUmVzdWx0VHlwZU1hcHBpbmdUeXBlLlJFTU9URV9MSVRFUkFMKTsKKwkKKwkJCWluaXRFRW51bShzZXNzaW9uVHlwZUVFbnVtLCBTZXNzaW9uVHlwZS5jbGFzcywgIlNlc3Npb25UeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChzZXNzaW9uVHlwZUVFbnVtLCBTZXNzaW9uVHlwZS5TSU5HTEVUT05fTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoc2Vzc2lvblR5cGVFRW51bSwgU2Vzc2lvblR5cGUuU1RBVEVGVUxfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoc2Vzc2lvblR5cGVFRW51bSwgU2Vzc2lvblR5cGUuU1RBVEVMRVNTX0xJVEVSQUwpOworCQorCQkJaW5pdEVFbnVtKHRpbWVVbml0VHlwZVR5cGVFRW51bSwgVGltZVVuaXRUeXBlVHlwZS5jbGFzcywgIlRpbWVVbml0VHlwZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKHRpbWVVbml0VHlwZVR5cGVFRW51bSwgVGltZVVuaXRUeXBlVHlwZS5EQVlTKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbCh0aW1lVW5pdFR5cGVUeXBlRUVudW0sIFRpbWVVbml0VHlwZVR5cGUuSE9VUlMpOworCQkJYWRkRUVudW1MaXRlcmFsKHRpbWVVbml0VHlwZVR5cGVFRW51bSwgVGltZVVuaXRUeXBlVHlwZS5NSU5VVEVTKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbCh0aW1lVW5pdFR5cGVUeXBlRUVudW0sIFRpbWVVbml0VHlwZVR5cGUuU0VDT05EUyk7CisJCQlhZGRFRW51bUxpdGVyYWwodGltZVVuaXRUeXBlVHlwZUVFbnVtLCBUaW1lVW5pdFR5cGVUeXBlLk1JTExJU0VDT05EUyk7CisJCQlhZGRFRW51bUxpdGVyYWwodGltZVVuaXRUeXBlVHlwZUVFbnVtLCBUaW1lVW5pdFR5cGVUeXBlLk1JQ1JPU0VDT05EUyk7CisJCQlhZGRFRW51bUxpdGVyYWwodGltZVVuaXRUeXBlVHlwZUVFbnVtLCBUaW1lVW5pdFR5cGVUeXBlLk5BTk9TRUNPTkRTKTsKKwkKKwkJCWluaXRFRW51bSh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmNsYXNzLCAiVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLk5PVF9TVVBQT1JURURfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5TVVBQT1JUU19MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLlJFUVVJUkVEX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuUkVRVUlSRVNfTkVXX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTUFOREFUT1JZX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTkVWRVJfTElURVJBTCk7CisJCisJCQlpbml0RUVudW0odHJhbnNhY3Rpb25UeXBlRUVudW0sIFRyYW5zYWN0aW9uVHlwZS5jbGFzcywgIlRyYW5zYWN0aW9uVHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25UeXBlRUVudW0sIFRyYW5zYWN0aW9uVHlwZS5CRUFOX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uVHlwZUVFbnVtLCBUcmFuc2FjdGlvblR5cGUuQ09OVEFJTkVSX0xJVEVSQUwpOworCQorCQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCisJCQlpbml0RURhdGFUeXBlKGNtcFZlcnNpb25UeXBlT2JqZWN0RURhdGFUeXBlLCBDbXBWZXJzaW9uVHlwZS5jbGFzcywgIkNtcFZlcnNpb25UeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGNtckZpZWxkVHlwZU9iamVjdEVEYXRhVHlwZSwgQ01SRmllbGRUeXBlLmNsYXNzLCAiQ01SRmllbGRUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlT2JqZWN0RURhdGFUeXBlLCBDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZS5jbGFzcywgIkNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGNvbmN1cnJlbnRMb2NrVHlwZVR5cGVPYmplY3RFRGF0YVR5cGUsIENvbmN1cnJlbnRMb2NrVHlwZVR5cGUuY2xhc3MsICJDb25jdXJyZW50TG9ja1R5cGVUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGVqYkNsYXNzVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiRWpiQ2xhc3NUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVEYXRhVHlwZShlamJOYW1lVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiRWpiTmFtZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKG1ldGhvZEludGVyZmFjZVR5cGVPYmplY3RFRGF0YVR5cGUsIE1ldGhvZEludGVyZmFjZVR5cGUuY2xhc3MsICJNZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKG1ldGhvZE5hbWVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJNZXRob2ROYW1lVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUobXVsdGlwbGljaXR5VHlwZU9iamVjdEVEYXRhVHlwZSwgTXVsdGlwbGljaXR5VHlwZS5jbGFzcywgIk11bHRpcGxpY2l0eVR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUocGVyc2lzdGVuY2VUeXBlT2JqZWN0RURhdGFUeXBlLCBQZXJzaXN0ZW5jZVR5cGUuY2xhc3MsICJQZXJzaXN0ZW5jZVR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUocmVzdWx0VHlwZU1hcHBpbmdUeXBlT2JqZWN0RURhdGFUeXBlLCBSZXN1bHRUeXBlTWFwcGluZ1R5cGUuY2xhc3MsICJSZXN1bHRUeXBlTWFwcGluZ1R5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUoc2Vzc2lvblR5cGVPYmplY3RFRGF0YVR5cGUsIFNlc3Npb25UeXBlLmNsYXNzLCAiU2Vzc2lvblR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUodGltZVVuaXRUeXBlVHlwZU9iamVjdEVEYXRhVHlwZSwgVGltZVVuaXRUeXBlVHlwZS5jbGFzcywgIlRpbWVVbml0VHlwZVR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlT2JqZWN0RURhdGFUeXBlLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuY2xhc3MsICJUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUodHJhbnNhY3Rpb25UeXBlT2JqZWN0RURhdGFUeXBlLCBUcmFuc2FjdGlvblR5cGUuY2xhc3MsICJUcmFuc2FjdGlvblR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCisJCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKKwkJCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQorCQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiAJLyoqCkBAIC0zODAxLDYgKzQ3MDEsMzYgQEAKIAlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKSB7CiAJCVN0cmluZyBzb3VyY2UgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIjsgLy8kTk9OLU5MUy0xJAkJCQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChhY2Nlc3NUaW1lb3V0VHlwZUVDbGFzcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiYWNjZXNzLXRpbWVvdXRUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEFjY2Vzc1RpbWVvdXRUeXBlX1RpbWVvdXQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInRpbWVvdXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBY2Nlc3NUaW1lb3V0VHlwZV9Vbml0KCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJ1bml0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QWNjZXNzVGltZW91dFR5cGVfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgogCQkgIChhY3RpdmF0aW9uQ29uZmlnRUNsYXNzLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKQEAgLTM4ODIsNiArNDgxMiwxNCBAQAogCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAibmFtZSIsICJyb2xsYmFjayIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9Jbmhlcml0ZWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImluaGVyaXRlZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lkKCksIApAQCAtMzkxNCw2ICs0ODUyLDI5IEBACiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCQogCQlhZGRBbm5vdGF0aW9uCisJCSAgKGFyb3VuZFRpbWVvdXRUeXBlRUNsYXNzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJhcm91bmQtdGltZW91dFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QXJvdW5kVGltZW91dFR5cGVfQ2xhc3MoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImNsYXNzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QXJvdW5kVGltZW91dFR5cGVfTWV0aG9kTmFtZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibWV0aG9kLW5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KIAkJICAoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKQEAgLTM5ODQsNiArNDk0NSwzNiBAQAogCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkJCiAJCWFkZEFubm90YXRpb24KKwkJICAoYXN5bmNNZXRob2RUeXBlRUNsYXNzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJhc3luYy1tZXRob2RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEFzeW5jTWV0aG9kVHlwZV9NZXRob2ROYW1lKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJtZXRob2QtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEFzeW5jTWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIm1ldGhvZC1wYXJhbXMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBc3luY01ldGhvZFR5cGVfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgogCQkgIChjbXBGaWVsZEVDbGFzcywgCiAJCSAgIHNvdXJjZSwgCiAJCSAgIG5ldyBTdHJpbmdbXSB7CkBAIC00MDc4LDYgKzUwNjksNzAgQEAKIAkJCSAiYmFzZVR5cGUiLCAiY21yLWZpZWxkLXR5cGVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkJCiAJCWFkZEFubm90YXRpb24KKwkJICAoY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVFRW51bSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiY29uY3VycmVuY3ktbWFuYWdlbWVudC10eXBlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVPYmplY3RFRGF0YVR5cGUsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgImNvbmN1cnJlbmN5LW1hbmFnZW1lbnQtdHlwZVR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImJhc2VUeXBlIiwgImNvbmN1cnJlbmN5LW1hbmFnZW1lbnQtdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChjb25jdXJyZW50TG9ja1R5cGVUeXBlRUVudW0sIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgImNvbmN1cnJlbnQtbG9jay10eXBlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoY29uY3VycmVudExvY2tUeXBlVHlwZU9iamVjdEVEYXRhVHlwZSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiY29uY3VycmVudC1sb2NrLXR5cGVUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJiYXNlVHlwZSIsICJjb25jdXJyZW50LWxvY2stdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChjb25jdXJyZW50TWV0aG9kVHlwZUVDbGFzcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiY29uY3VycmVudC1tZXRob2RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvbmN1cnJlbnRNZXRob2RUeXBlX01ldGhvZCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29uY3VycmVudE1ldGhvZFR5cGVfTG9jaygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibG9jayIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvbmN1cnJlbnRNZXRob2RUeXBlX0FjY2Vzc1RpbWVvdXQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImFjY2Vzcy10aW1lb3V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29uY3VycmVudE1ldGhvZFR5cGVfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgogCQkgIChjb250YWluZXJUcmFuc2FjdGlvblR5cGVFQ2xhc3MsIAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewpAQCAtNDExNiw2ICs1MTcxLDI4IEBACiAJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChkZXBlbmRzT25UeXBlRUNsYXNzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJkZXBlbmRzLW9uVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXREZXBlbmRzT25UeXBlX0VqYk5hbWUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImVqYi1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0RGVwZW5kc09uVHlwZV9JZCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGVqYkNsYXNzVHlwZUVEYXRhVHlwZSwgCiAJCSAgIHNvdXJjZSwgCiAJCSAgIG5ldyBTdHJpbmdbXSB7CkBAIC00MTI4LDYgKzUyMDUsMTQgQEAKIAkJICAgbmV3IFN0cmluZ1tdIHsKIAkJCSAibmFtZSIsICJlamItamFyVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0RUpCSmFyX01vZHVsZU5hbWUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIm1vZHVsZS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0RUpCSmFyX0Rlc2NyaXB0aW9ucygpLCAKQEAgLTQ2MzcsNiArNTcyMiwxNCBAQAogCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRFbnRpdHlCZWFuX0RhdGFTb3VyY2UoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImRhdGEtc291cmNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldEVudGl0eUJlYW5fU2VjdXJpdHlSb2xlUmVmcygpLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKQEAgLTQ4ODEsNiArNTk3NCwxNCBAQAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEludGVyY2VwdG9yVHlwZV9Bcm91bmRUaW1lb3V0cygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiYXJvdW5kLXRpbWVvdXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgogCQkgIChnZXRJbnRlcmNlcHRvclR5cGVfRW52RW50cmllcygpLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKQEAgLTQ5NjksNiArNjA3MCwxNCBAQAogCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRJbnRlcmNlcHRvclR5cGVfRGF0YVNvdXJjZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiZGF0YS1zb3VyY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0SW50ZXJjZXB0b3JUeXBlX1Bvc3RBY3RpdmF0ZXMoKSwgCiAJCSAgIHNvdXJjZSwgCiAJCSAgIG5ldyBTdHJpbmdbXSB7CkBAIC01MDUzLDcgKzYxNjIsNyBAQAogCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAibmFtZSIsICJtZXNzYWdpbmctdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQorCQkgICB9KTsJCQkKIAkJYWRkQW5ub3RhdGlvbgogCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9UaW1lb3V0TWV0aG9kKCksIAogCQkgICBzb3VyY2UsIApAQCAtNTA2Myw2ICs2MTcyLDE0IEBACiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fVGltZXIoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInRpbWVyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCksIAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewpAQCAtNTEwMyw2ICs2MjIwLDE0IEBACiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fQXJvdW5kVGltZW91dHMoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImFyb3VuZC10aW1lb3V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fRW52RW50cmllcygpLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKQEAgLTUxOTEsNiArNjMxNiwyMiBAQAogCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRNZXNzYWdlRHJpdmVuQmVhbl9EYXRhU291cmNlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJkYXRhLXNvdXJjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0TWVzc2FnZURyaXZlbkJlYW5fU2VjdXJpdHlSb2xlUmVmKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJzZWN1cml0eS1yb2xlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldE1lc3NhZ2VEcml2ZW5CZWFuX1NlY3VyaXR5SWRlbnRpdHkoKSwgCiAJCSAgIHNvdXJjZSwgCiAJCSAgIG5ldyBTdHJpbmdbXSB7CkBAIC01MjEwLDcgKzYzNTEsNyBAQAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewogCQkJICJuYW1lIiwgIm1ldGhvZC1pbnRmVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCisJCSAgIH0pOwkJCQkKIAkJYWRkQW5ub3RhdGlvbgogCQkgIChtZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0RURhdGFUeXBlLCAKIAkJICAgc291cmNlLCAKQEAgLTU3MTUsNiArNjg1NiwxNCBAQAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRTZXNzaW9uQmVhbl9Mb2NhbEJlYW4oKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImxvY2FsLWJlYW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0U2Vzc2lvbkJlYW5fU2VydmljZUVuZHBvaW50KCksIAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewpAQCAtNTczOSwxMiArNjg4OCw2MCBAQAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFNlc3Npb25CZWFuX1N0YXRlZnVsVGltZW91dCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAic3RhdGVmdWwtdGltZW91dCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgogCQkgIChnZXRTZXNzaW9uQmVhbl9UaW1lb3V0TWV0aG9kKCksIAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewogCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAibmFtZSIsICJ0aW1lb3V0LW1ldGhvZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFNlc3Npb25CZWFuX1RpbWVyKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJ0aW1lciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRTZXNzaW9uQmVhbl9Jbml0T25TdGFydHVwKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJpbml0LW9uLXN0YXJ0dXAiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRTZXNzaW9uQmVhbl9Db25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJjb25jdXJyZW5jeS1tYW5hZ2VtZW50LXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRTZXNzaW9uQmVhbl9Db25jdXJyZW50TWV0aG9kKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJjb25jdXJyZW50LW1ldGhvZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFNlc3Npb25CZWFuX0RlcGVuZHNPbigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiZGVwZW5kcy1vbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQkKIAkJYWRkQW5ub3RhdGlvbgogCQkgIChnZXRTZXNzaW9uQmVhbl9Jbml0TWV0aG9kcygpLCAKQEAgLTU3NjMsMTIgKzY5NjAsNDQgQEAKIAkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRTZXNzaW9uQmVhbl9Bc3luY01ldGhvZCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiYXN5bmMtbWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0U2Vzc2lvbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCksIAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewogCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAibmFtZSIsICJ0cmFuc2FjdGlvbi10eXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFNlc3Npb25CZWFuX0FmdGVyQmVnaW5NZXRob2QoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImFmdGVyLWJlZ2luLW1ldGhvZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRTZXNzaW9uQmVhbl9CZWZvcmVDb21wbGV0aW9uTWV0aG9kKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJiZWZvcmUtY29tcGxldGlvbi1tZXRob2QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0U2Vzc2lvbkJlYW5fQWZ0ZXJDb21wbGV0aW9uTWV0aG9kKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJhZnRlci1jb21wbGV0aW9uLW1ldGhvZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldFNlc3Npb25CZWFuX0Fyb3VuZEludm9rZXMoKSwgCkBAIC01Nzc3LDYgKzcwMDYsMTQgQEAKIAkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWUiLCAiYXJvdW5kLWludm9rZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRTZXNzaW9uQmVhbl9Bcm91bmRUaW1lb3V0cygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiYXJvdW5kLXRpbWVvdXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkKIAkJYWRkQW5ub3RhdGlvbgogCQkgIChnZXRTZXNzaW9uQmVhbl9FbnZFbnRyaWVzKCksIApAQCAtNTg2Nyw2ICs3MTA0LDE0IEBACiAJCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFNlc3Npb25CZWFuX0RhdGFTb3VyY2UoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImRhdGEtc291cmNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldFNlc3Npb25CZWFuX1Bvc3RBY3RpdmF0ZXMoKSwgCiAJCSAgIHNvdXJjZSwgCiAJCSAgIG5ldyBTdHJpbmdbXSB7CkBAIC01OTEwLDcgKzcxNTUsNyBAQAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewogCQkJICJuYW1lIiwgInNlc3Npb24tdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQorCQkgICB9KTsJCQkKIAkJYWRkQW5ub3RhdGlvbgogCQkgIChzZXNzaW9uVHlwZU9iamVjdEVEYXRhVHlwZSwgCiAJCSAgIHNvdXJjZSwgCkBAIC01OTE5LDYgKzcxNjQsMTk3IEBACiAJCQkgImJhc2VUeXBlIiwgInNlc3Npb24tdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChzdGF0ZWZ1bFRpbWVvdXRUeXBlRUNsYXNzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJzdGF0ZWZ1bC10aW1lb3V0VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRTdGF0ZWZ1bFRpbWVvdXRUeXBlX1RpbWVvdXQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInRpbWVvdXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRTdGF0ZWZ1bFRpbWVvdXRUeXBlX1VuaXQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInVuaXQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRTdGF0ZWZ1bFRpbWVvdXRUeXBlX0lkKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAodGltZXJTY2hlZHVsZVR5cGVFQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgInRpbWVyLXNjaGVkdWxlVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRUaW1lclNjaGVkdWxlVHlwZV9TZWNvbmQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInNlY29uZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFRpbWVyU2NoZWR1bGVUeXBlX01pbnV0ZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibWludXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0VGltZXJTY2hlZHVsZVR5cGVfSG91cigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaG91ciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFRpbWVyU2NoZWR1bGVUeXBlX0RheU9mTW9udGgoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImRheS1vZi1tb250aCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFRpbWVyU2NoZWR1bGVUeXBlX01vbnRoKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJtb250aCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFRpbWVyU2NoZWR1bGVUeXBlX0RheU9mV2VlaygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiZGF5LW9mLXdlZWsiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRUaW1lclNjaGVkdWxlVHlwZV9ZZWFyKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJ5ZWFyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0VGltZXJTY2hlZHVsZVR5cGVfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgICh0aW1lclR5cGVFQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgInRpbWVyVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRUaW1lclR5cGVfRGVzY3JpcHRpb24oKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0VGltZXJUeXBlX1NjaGVkdWxlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJzY2hlZHVsZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFRpbWVyVHlwZV9TdGFydCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAic3RhcnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRUaW1lclR5cGVfRW5kKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJlbmQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRUaW1lclR5cGVfVGltZW91dE1ldGhvZCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAidGltZW91dC1tZXRob2QiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRUaW1lclR5cGVfUGVyc2lzdGVudCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAicGVyc2lzdGVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFRpbWVyVHlwZV9UaW1lem9uZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAidGltZXpvbmUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRUaW1lclR5cGVfSW5mbygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaW5mbyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFRpbWVyVHlwZV9JZCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKHRpbWVVbml0VHlwZVR5cGVFRW51bSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAidGltZS11bml0LXR5cGVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgICh0aW1lVW5pdFR5cGVUeXBlT2JqZWN0RURhdGFUeXBlLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJ0aW1lLXVuaXQtdHlwZVR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImJhc2VUeXBlIiwgInRpbWUtdW5pdC10eXBlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCiAJCSAgKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRW50ZXJwcmlzZUJlYW5zSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FbnRlcnByaXNlQmVhbnNJbXBsLmphdmEKaW5kZXggYjg4NTRmOS4uNzIyNmI3ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FbnRlcnByaXNlQmVhbnNJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FbnRlcnByaXNlQmVhbnNJbXBsLmphdmEKQEAgLTI4LDYgKzI4LDkgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFuczsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKIAogLyoqCkBAIC01Niw3ICs1OSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAgPSBudWxsOworCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC05Miw2ICs5NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FTlRFUlBSSVNFX0JFQU5TOwogCX0KQEAgLTExMyw4ICsxMTcsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXNzaW9uQmVhbnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChFamJQYWNrYWdlLkxpdGVyYWxzLkVOVEVSUFJJU0VfQkVBTlNfX1NFU1NJT05fQkVBTlMpOworCXB1YmxpYyBMaXN0PFNlc3Npb25CZWFuPiBnZXRTZXNzaW9uQmVhbnMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoRWpiUGFja2FnZS5MaXRlcmFscy5FTlRFUlBSSVNFX0JFQU5TX19TRVNTSU9OX0JFQU5TKTsKIAl9CiAKIAkvKioKQEAgLTEyMiw4ICsxMjYsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFbnRpdHlCZWFucygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KEVqYlBhY2thZ2UuTGl0ZXJhbHMuRU5URVJQUklTRV9CRUFOU19fRU5USVRZX0JFQU5TKTsKKwlwdWJsaWMgTGlzdDxFbnRpdHlCZWFuPiBnZXRFbnRpdHlCZWFucygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChFamJQYWNrYWdlLkxpdGVyYWxzLkVOVEVSUFJJU0VfQkVBTlNfX0VOVElUWV9CRUFOUyk7CiAJfQogCiAJLyoqCkBAIC0xMzEsOCArMTM1LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoRWpiUGFja2FnZS5MaXRlcmFscy5FTlRFUlBSSVNFX0JFQU5TX19NRVNTQUdFX0RSSVZFTl9CRUFOUyk7CisJcHVibGljIExpc3Q8TWVzc2FnZURyaXZlbkJlYW4+IGdldE1lc3NhZ2VEcml2ZW5CZWFucygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChFamJQYWNrYWdlLkxpdGVyYWxzLkVOVEVSUFJJU0VfQkVBTlNfX01FU1NBR0VfRFJJVkVOX0JFQU5TKTsKIAl9CiAKIAkvKioKQEAgLTE2MSwxNiArMTY1LDE3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19HUk9VUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19TRVNTSU9OX0JFQU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2Vzc2lvbkJlYW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlc3Npb25CZWFucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fRU5USVRZX0JFQU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW50aXR5QmVhbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RW50aXR5QmVhbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX01FU1NBR0VfRFJJVkVOX0JFQU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1lc3NhZ2VEcml2ZW5CZWFucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTE4MCw2ICsxODUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fR1JPVVA6CkBAIC0yMDIsNiArMjA4LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19HUk9VUDoKQEAgLTIwOSwxNSArMjE3LDE1IEBACiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX1NFU1NJT05fQkVBTlM6CiAJCQkJZ2V0U2Vzc2lvbkJlYW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXNzaW9uQmVhbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFNlc3Npb25CZWFucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2Vzc2lvbkJlYW4+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fRU5USVRZX0JFQU5TOgogCQkJCWdldEVudGl0eUJlYW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnRpdHlCZWFucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RW50aXR5QmVhbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEVudGl0eUJlYW4+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fTUVTU0FHRV9EUklWRU5fQkVBTlM6CiAJCQkJZ2V0TWVzc2FnZURyaXZlbkJlYW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRHJpdmVuQmVhbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldE1lc3NhZ2VEcml2ZW5CZWFucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWVzc2FnZURyaXZlbkJlYW4+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOU19fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0yMzEsNiArMjM5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TX19HUk9VUDoKQEAgLTI1Nyw2ICsyNjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTlNfX0dST1VQOgpAQCAtMjc4LDYgKzI4OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FbnRpdHlCZWFuSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FbnRpdHlCZWFuSW1wbC5qYXZhCmluZGV4IDEyYzc5MzkuLjhlZDRkNjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRW50aXR5QmVhbkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0VudGl0eUJlYW5JbXBsLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOwpAQCAtODYsNiArODcsNyBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVudGl0eUJlYW5JbXBsI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXREYXRhU291cmNlIDxlbT5EYXRhIFNvdXJjZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FbnRpdHlCZWFuSW1wbCNnZXRTZWN1cml0eVJvbGVSZWZzIDxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0U2VjdXJpdHlJZGVudGl0eSA8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRW50aXR5QmVhbkltcGwjZ2V0UXVlcmllcyA8ZW0+UXVlcmllczwvZW0+fTwvbGk+CkBAIC0xMDQsNyArMTA2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTExNCw3ICsxMTYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxEaXNwbGF5TmFtZT4gZGlzcGxheU5hbWVzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTI0LDcgKzEyNiw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8SWNvbj4gaWNvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTmFtZSgpIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMjkzLDcgKzI5NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGVyc2lzdGVuY2VUeXBlRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHBlcnNpc3RlbmNlVHlwZUVTZXQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbUtleUNsYXNzKCkgPGVtPlByaW0gS2V5IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0zNDIsNyArMzQ0LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWVudHJhbnRFU2V0ID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gcmVlbnRyYW50RVNldDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbXBWZXJzaW9uKCkgPGVtPkNtcCBWZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0zNzEsNyArMzczLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbXBWZXJzaW9uRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIGNtcFZlcnNpb25FU2V0OwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFic3RyYWN0U2NoZW1hTmFtZSgpIDxlbT5BYnN0cmFjdCBTY2hlbWEgTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtNDAxLDcgKzQwMyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGNtcEZpZWxkcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PENNUEZpZWxkPiBjbXBGaWVsZHM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbWtleUZpZWxkKCkgPGVtPlByaW1rZXkgRmllbGQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTQzMSw3ICs0MzMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlbnZFbnRyaWVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RW52RW50cnk+IGVudkVudHJpZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZzKCkgPGVtPkVqYiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQ0MSw3ICs0NDMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJSZWZzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RWpiUmVmPiBlamJSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTG9jYWxSZWZzKCkgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQ1MSw3ICs0NTMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJMb2NhbFJlZnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxFamJMb2NhbFJlZj4gZWpiTG9jYWxSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVJlZnMoKSA8ZW0+U2VydmljZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQ2MSw3ICs0NjMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlUmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFNlcnZpY2VSZWY+IHNlcnZpY2VSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VSZWZzKCkgPGVtPlJlc291cmNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNDcxLDcgKzQ3Myw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlUmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFJlc291cmNlUmVmPiByZXNvdXJjZVJlZnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUVudlJlZnMoKSA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNDgxLDcgKzQ4Myw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlRW52UmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFJlc291cmNlRW52UmVmPiByZXNvdXJjZUVudlJlZnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC00OTEsNyArNDkzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvblJlZj4gbWVzc2FnZURlc3RpbmF0aW9uUmVmczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTUwMSw3ICs1MDMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8UGVyc2lzdGVuY2VDb250ZXh0UmVmPiBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNTExLDcgKzUxMyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHBlcnNpc3RlbmNlVW5pdFJlZnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxQZXJzaXN0ZW5jZVVuaXRSZWY+IHBlcnNpc3RlbmNlVW5pdFJlZnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Q29uc3RydWN0cygpIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNTIxLDcgKzUyMyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHBvc3RDb25zdHJ1Y3RzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IHBvc3RDb25zdHJ1Y3RzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlRGVzdHJveXMoKSA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTUzMSw3ICs1MzMsMTcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJlRGVzdHJveXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gcHJlRGVzdHJveXM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhU291cmNlKCkgPGVtPkRhdGEgU291cmNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERhdGFTb3VyY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEYXRhU291cmNlVHlwZT4gZGF0YVNvdXJjZTsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3VyaXR5Um9sZVJlZnMoKSA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTU0MSw3ICs1NTMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZWN1cml0eVJvbGVSZWZzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8U2VjdXJpdHlSb2xlUmVmPiBzZWN1cml0eVJvbGVSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdXJpdHlJZGVudGl0eSgpIDxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtNTUxLDcgKzU2Myw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIFNlY3VyaXR5SWRlbnRpdHlUeXBlIHNlY3VyaXR5SWRlbnRpdHkgPSBudWxsOworCXByb3RlY3RlZCBTZWN1cml0eUlkZW50aXR5VHlwZSBzZWN1cml0eUlkZW50aXR5OwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UXVlcmllcygpIDxlbT5RdWVyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTU2MSw3ICs1NzMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBxdWVyaWVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8UXVlcnk+IHF1ZXJpZXM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTU5Nyw2ICs2MDksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuRU5USVRZX0JFQU47CiAJfQpAQCAtNjA2LDkgKzYxOSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fREVTQ1JJUFRJT05TKTsKKwkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RFU0NSSVBUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIGRlc2NyaXB0aW9uczsKIAl9CkBAIC02MTgsOSArNjMxLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgeworCXB1YmxpYyBMaXN0PERpc3BsYXlOYW1lPiBnZXREaXNwbGF5TmFtZXMoKSB7CiAJCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ESVNQTEFZX05BTUVTKTsKKwkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEaXNwbGF5TmFtZT4oRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RJU1BMQVlfTkFNRVMpOwogCQl9CiAJCXJldHVybiBkaXNwbGF5TmFtZXM7CiAJfQpAQCAtNjMwLDkgKzY0Myw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgeworCXB1YmxpYyBMaXN0PEljb24+IGdldEljb25zKCkgewogCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fSUNPTlMpOworCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SWNvbj4oSWNvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fSUNPTlMpOwogCQl9CiAJCXJldHVybiBpY29uczsKIAl9CkBAIC05NjksOSArOTgyLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0Q21wRmllbGRzKCkgeworCXB1YmxpYyBMaXN0PENNUEZpZWxkPiBnZXRDbXBGaWVsZHMoKSB7CiAJCWlmIChjbXBGaWVsZHMgPT0gbnVsbCkgewotCQkJY21wRmllbGRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENNUEZpZWxkLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19DTVBfRklFTERTKTsKKwkJCWNtcEZpZWxkcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxDTVBGaWVsZD4oQ01QRmllbGQuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0NNUF9GSUVMRFMpOwogCQl9CiAJCXJldHVybiBjbXBGaWVsZHM7CiAJfQpAQCAtMTAwMiw5ICsxMDE1LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RW52RW50cmllcygpIHsKKwlwdWJsaWMgTGlzdDxFbnZFbnRyeT4gZ2V0RW52RW50cmllcygpIHsKIAkJaWYgKGVudkVudHJpZXMgPT0gbnVsbCkgewotCQkJZW52RW50cmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFbnZFbnRyeS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRU5WX0VOVFJJRVMpOworCQkJZW52RW50cmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxFbnZFbnRyeT4oRW52RW50cnkuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VOVl9FTlRSSUVTKTsKIAkJfQogCQlyZXR1cm4gZW52RW50cmllczsKIAl9CkBAIC0xMDE0LDkgKzEwMjcsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJSZWZzKCkgeworCXB1YmxpYyBMaXN0PEVqYlJlZj4gZ2V0RWpiUmVmcygpIHsKIAkJaWYgKGVqYlJlZnMgPT0gbnVsbCkgewotCQkJZWpiUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFamJSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9SRUZTKTsKKwkJCWVqYlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RWpiUmVmPihFamJSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9SRUZTKTsKIAkJfQogCQlyZXR1cm4gZWpiUmVmczsKIAl9CkBAIC0xMDI2LDkgKzEwMzksOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJMb2NhbFJlZnMoKSB7CisJcHVibGljIExpc3Q8RWpiTG9jYWxSZWY+IGdldEVqYkxvY2FsUmVmcygpIHsKIAkJaWYgKGVqYkxvY2FsUmVmcyA9PSBudWxsKSB7Ci0JCQllamJMb2NhbFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRWpiTG9jYWxSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9MT0NBTF9SRUZTKTsKKwkJCWVqYkxvY2FsUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxFamJMb2NhbFJlZj4oRWpiTG9jYWxSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9MT0NBTF9SRUZTKTsKIAkJfQogCQlyZXR1cm4gZWpiTG9jYWxSZWZzOwogCX0KQEAgLTEwMzgsOSArMTA1MSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlcnZpY2VSZWZzKCkgeworCXB1YmxpYyBMaXN0PFNlcnZpY2VSZWY+IGdldFNlcnZpY2VSZWZzKCkgewogCQlpZiAoc2VydmljZVJlZnMgPT0gbnVsbCkgewotCQkJc2VydmljZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VydmljZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VSVklDRV9SRUZTKTsKKwkJCXNlcnZpY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFNlcnZpY2VSZWY+KFNlcnZpY2VSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFUlZJQ0VfUkVGUyk7CiAJCX0KIAkJcmV0dXJuIHNlcnZpY2VSZWZzOwogCX0KQEAgLTEwNTAsOSArMTA2Myw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlUmVmcygpIHsKKwlwdWJsaWMgTGlzdDxSZXNvdXJjZVJlZj4gZ2V0UmVzb3VyY2VSZWZzKCkgewogCQlpZiAocmVzb3VyY2VSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVTT1VSQ0VfUkVGUyk7CisJCQlyZXNvdXJjZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UmVzb3VyY2VSZWY+KFJlc291cmNlUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRVNPVVJDRV9SRUZTKTsKIAkJfQogCQlyZXR1cm4gcmVzb3VyY2VSZWZzOwogCX0KQEAgLTEwNjIsOSArMTA3NSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlRW52UmVmcygpIHsKKwlwdWJsaWMgTGlzdDxSZXNvdXJjZUVudlJlZj4gZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewogCQlpZiAocmVzb3VyY2VFbnZSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlRW52UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMpOworCQkJcmVzb3VyY2VFbnZSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFJlc291cmNlRW52UmVmPihSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMpOwogCQl9CiAJCXJldHVybiByZXNvdXJjZUVudlJlZnM7CiAJfQpAQCAtMTA3NCw5ICsxMDg3LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKKwlwdWJsaWMgTGlzdDxNZXNzYWdlRGVzdGluYXRpb25SZWY+IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7CiAJCWlmIChtZXNzYWdlRGVzdGluYXRpb25SZWZzID09IG51bGwpIHsKLQkJCW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOworCQkJbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxNZXNzYWdlRGVzdGluYXRpb25SZWY+KE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKIAkJfQogCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmczsKIAl9CkBAIC0xMDg2LDkgKzEwOTksOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgeworCXB1YmxpYyBMaXN0PFBlcnNpc3RlbmNlQ29udGV4dFJlZj4gZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKIAkJaWYgKHBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVuY2VDb250ZXh0UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7CisJCQlwZXJzaXN0ZW5jZUNvbnRleHRSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFBlcnNpc3RlbmNlQ29udGV4dFJlZj4oUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMpOwogCQl9CiAJCXJldHVybiBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzOwogCX0KQEAgLTEwOTgsOSArMTExMSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSB7CisJcHVibGljIExpc3Q8UGVyc2lzdGVuY2VVbml0UmVmPiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkgewogCQlpZiAocGVyc2lzdGVuY2VVbml0UmVmcyA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW5jZVVuaXRSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKKwkJCXBlcnNpc3RlbmNlVW5pdFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UGVyc2lzdGVuY2VVbml0UmVmPihQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7CiAJCX0KIAkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFJlZnM7CiAJfQpAQCAtMTExMCw5ICsxMTIzLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0UG9zdENvbnN0cnVjdHMoKSB7CisJcHVibGljIExpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IGdldFBvc3RDb25zdHJ1Y3RzKCkgewogCQlpZiAocG9zdENvbnN0cnVjdHMgPT0gbnVsbCkgewotCQkJcG9zdENvbnN0cnVjdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BPU1RfQ09OU1RSVUNUUyk7CisJCQlwb3N0Q29uc3RydWN0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4oTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BPU1RfQ09OU1RSVUNUUyk7CiAJCX0KIAkJcmV0dXJuIHBvc3RDb25zdHJ1Y3RzOwogCX0KQEAgLTExMjIsOSArMTEzNSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFByZURlc3Ryb3lzKCkgeworCXB1YmxpYyBMaXN0PExpZmVjeWNsZUNhbGxiYWNrPiBnZXRQcmVEZXN0cm95cygpIHsKIAkJaWYgKHByZURlc3Ryb3lzID09IG51bGwpIHsKLQkJCXByZURlc3Ryb3lzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QUkVfREVTVFJPWVMpOworCQkJcHJlRGVzdHJveXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QUkVfREVTVFJPWVMpOwogCQl9CiAJCXJldHVybiBwcmVEZXN0cm95czsKIAl9CkBAIC0xMTM0LDkgKzExNDcsMjEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0U2VjdXJpdHlSb2xlUmVmcygpIHsKKwlwdWJsaWMgTGlzdDxEYXRhU291cmNlVHlwZT4gZ2V0RGF0YVNvdXJjZSgpIHsKKwkJaWYgKGRhdGFTb3VyY2UgPT0gbnVsbCkgeworCQkJZGF0YVNvdXJjZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEYXRhU291cmNlVHlwZT4oRGF0YVNvdXJjZVR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RBVEFfU09VUkNFKTsKKwkJfQorCQlyZXR1cm4gZGF0YVNvdXJjZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxTZWN1cml0eVJvbGVSZWY+IGdldFNlY3VyaXR5Um9sZVJlZnMoKSB7CiAJCWlmIChzZWN1cml0eVJvbGVSZWZzID09IG51bGwpIHsKLQkJCXNlY3VyaXR5Um9sZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMpOworCQkJc2VjdXJpdHlSb2xlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTZWN1cml0eVJvbGVSZWY+KFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTKTsKIAkJfQogCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmczsKIAl9CkBAIC0xMTg5LDkgKzEyMTQsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRRdWVyaWVzKCkgeworCXB1YmxpYyBMaXN0PFF1ZXJ5PiBnZXRRdWVyaWVzKCkgewogCQlpZiAocXVlcmllcyA9PSBudWxsKSB7Ci0JCQlxdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFF1ZXJ5LmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19RVUVSSUVTKTsKKwkJCXF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UXVlcnk+KFF1ZXJ5LmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19RVUVSSUVTKTsKIAkJfQogCQlyZXR1cm4gcXVlcmllczsKIAl9CkBAIC0xMjIyLDQ0ICsxMjQ3LDQ3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0NNUF9GSUVMRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDbXBGaWVsZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q21wRmllbGRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRU5WX0VOVFJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFbnZFbnRyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVudkVudHJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RWpiUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9MT0NBTF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiTG9jYWxSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFUlZJQ0VfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZpY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlcnZpY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRSZXNvdXJjZUVudlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QT1NUX0NPTlNUUlVDVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQb3N0Q29uc3RydWN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQb3N0Q29uc3RydWN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZURlc3Ryb3lzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByZURlc3Ryb3lzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREYXRhU291cmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlSb2xlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZWN1cml0eVJvbGVSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6CiAJCQkJcmV0dXJuIGJhc2ljU2V0U2VjdXJpdHlJZGVudGl0eShudWxsLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUVVFUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTEyNjksNiArMTI5Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fREVTQ1JJUFRJT05TOgpAQCAtMTI5Niw3ICsxMzI1LDcgQEAKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUFJJTV9LRVlfQ0xBU1M6CiAJCQkJcmV0dXJuIGdldFByaW1LZXlDbGFzcygpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRUVOVFJBTlQ6Ci0JCQkJcmV0dXJuIGlzUmVlbnRyYW50KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworCQkJCXJldHVybiBpc1JlZW50cmFudCgpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19DTVBfVkVSU0lPTjoKIAkJCQlyZXR1cm4gZ2V0Q21wVmVyc2lvbigpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19BQlNUUkFDVF9TQ0hFTUFfTkFNRToKQEAgLTEzMjcsNiArMTM1Niw4IEBACiAJCQkJcmV0dXJuIGdldFBvc3RDb25zdHJ1Y3RzKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSRV9ERVNUUk9ZUzoKIAkJCQlyZXR1cm4gZ2V0UHJlRGVzdHJveXMoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuIGdldERhdGFTb3VyY2UoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgogCQkJCXJldHVybiBnZXRTZWN1cml0eVJvbGVSZWZzKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgpAQCAtMTM0NCwxOSArMTM3NSwyMSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RJU1BMQVlfTkFNRVM6CiAJCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzcGxheU5hbWU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0lDT05TOgogCQkJCWdldEljb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEljb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9OQU1FOgogCQkJCXNldEVqYk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0xMzg2LDcgKzE0MTksNyBAQAogCQkJCXNldFByaW1LZXlDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1JFRU5UUkFOVDoKLQkJCQlzZXRSZWVudHJhbnQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7CisJCQkJc2V0UmVlbnRyYW50KChCb29sZWFuKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0NNUF9WRVJTSU9OOgogCQkJCXNldENtcFZlcnNpb24oKENtcFZlcnNpb25UeXBlKW5ld1ZhbHVlKTsKQEAgLTEzOTYsNjUgKzE0MjksNjkgQEAKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0NNUF9GSUVMRFM6CiAJCQkJZ2V0Q21wRmllbGRzKCkuY2xlYXIoKTsKLQkJCQlnZXRDbXBGaWVsZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldENtcEZpZWxkcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ01QRmllbGQ+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSSU1LRVlfRklFTEQ6CiAJCQkJc2V0UHJpbWtleUZpZWxkKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRU5WX0VOVFJJRVM6CiAJCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RW52RW50cmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RW52RW50cmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRW52RW50cnk+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0VKQl9SRUZTOgogCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEVqYlJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fRUpCX0xPQ0FMX1JFRlM6CiAJCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEVqYkxvY2FsUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRWpiTG9jYWxSZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFUlZJQ0VfUkVGUzoKIAkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFNlcnZpY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZXJ2aWNlUmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRVNPVVJDRV9SRUZTOgogCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRSZXNvdXJjZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJlc291cmNlUmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUzoKIAkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXNvdXJjZUVudlJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgogCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1lc3NhZ2VEZXN0aW5hdGlvblJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgogCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5jbGVhcigpOwotCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFBlcnNpc3RlbmNlQ29udGV4dFJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgogCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5jbGVhcigpOwotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fUE9TVF9DT05TVFJVQ1RTOgogCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIExpZmVjeWNsZUNhbGxiYWNrPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19QUkVfREVTVFJPWVM6CiAJCQkJZ2V0UHJlRGVzdHJveXMoKS5jbGVhcigpOwotCQkJCWdldFByZURlc3Ryb3lzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRQcmVEZXN0cm95cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTGlmZWN5Y2xlQ2FsbGJhY2s+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RBVEFfU09VUkNFOgorCQkJCWdldERhdGFTb3VyY2UoKS5jbGVhcigpOworCQkJCWdldERhdGFTb3VyY2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERhdGFTb3VyY2VUeXBlPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6CiAJCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VjdXJpdHlSb2xlUmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9JREVOVElUWToKIAkJCQlzZXRTZWN1cml0eUlkZW50aXR5KChTZWN1cml0eUlkZW50aXR5VHlwZSluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19RVUVSSUVTOgogCQkJCWdldFF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldFF1ZXJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFF1ZXJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFF1ZXJ5PiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19JRDoKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTE0NjgsNiArMTUwNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX0RFU0NSSVBUSU9OUzoKQEAgLTE1NTQsNiArMTU5Miw5IEBACiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSRV9ERVNUUk9ZUzoKIAkJCQlnZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19EQVRBX1NPVVJDRToKKwkJCQlnZXREYXRhU291cmNlKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUzoKIAkJCQlnZXRTZWN1cml0eVJvbGVSZWZzKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CkBAIC0xNTc1LDYgKzE2MTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19ERVNDUklQVElPTlM6CkBAIC0xNjMzLDYgKzE2NzUsOCBAQAogCQkJCXJldHVybiBwb3N0Q29uc3RydWN0cyAhPSBudWxsICYmICFwb3N0Q29uc3RydWN0cy5pc0VtcHR5KCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX0JFQU5fX1BSRV9ERVNUUk9ZUzoKIAkJCQlyZXR1cm4gcHJlRGVzdHJveXMgIT0gbnVsbCAmJiAhcHJlRGVzdHJveXMuaXNFbXB0eSgpOworCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19EQVRBX1NPVVJDRToKKwkJCQlyZXR1cm4gZGF0YVNvdXJjZSAhPSBudWxsICYmICFkYXRhU291cmNlLmlzRW1wdHkoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgogCQkJCXJldHVybiBzZWN1cml0eVJvbGVSZWZzICE9IG51bGwgJiYgIXNlY3VyaXR5Um9sZVJlZnMuaXNFbXB0eSgpOwogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9CRUFOX19TRUNVUklUWV9JREVOVElUWToKQEAgLTE2NTAsNiArMTY5NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FeGNsdWRlTGlzdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvRXhjbHVkZUxpc3RJbXBsLmphdmEKaW5kZXggZmRkYmEyMC4uNTU2OGZlZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9FeGNsdWRlTGlzdEltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0V4Y2x1ZGVMaXN0SW1wbC5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RzKCkgPGVtPk1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNjgsNyArNjgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBtZXRob2RzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kVHlwZT4gbWV0aG9kczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTA0LDYgKzEwNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FWENMVURFX0xJU1Q7CiAJfQpAQCAtMTEzLDkgKzExNCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TKTsKIAkJfQogCQlyZXR1cm4gZGVzY3JpcHRpb25zOwogCX0KQEAgLTEyNSw5ICsxMjYsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RzKCkgeworCXB1YmxpYyBMaXN0PE1ldGhvZFR5cGU+IGdldE1ldGhvZHMoKSB7CiAJCWlmIChtZXRob2RzID09IG51bGwpIHsKLQkJCW1ldGhvZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTWV0aG9kVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX01FVEhPRFMpOworCQkJbWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxNZXRob2RUeXBlPihNZXRob2RUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fTUVUSE9EUyk7CiAJCX0KIAkJcmV0dXJuIG1ldGhvZHM7CiAJfQpAQCAtMTU4LDEyICsxNTksMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19NRVRIT0RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtMTczLDYgKzE3NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OUzoKQEAgLTE5MCwxNSArMTkzLDE3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19NRVRIT0RTOgogCQkJCWdldE1ldGhvZHMoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldE1ldGhvZHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFR5cGU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19JRDoKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTIxMiw2ICsyMTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT05TOgpAQCAtMjMyLDYgKzIzOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTlM6CkBAIC0yNDksNiArMjU2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0luaXRNZXRob2RUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9Jbml0TWV0aG9kVHlwZUltcGwuamF2YQppbmRleCAzNTkwYjMzLi5kNTkzN2ZiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0luaXRNZXRob2RUeXBlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW5pdE1ldGhvZFR5cGVJbXBsLmphdmEKQEAgLTQ4LDcgKzQ4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlIGNyZWF0ZU1ldGhvZCA9IG51bGw7CisJcHJvdGVjdGVkIE5hbWVkTWV0aG9kVHlwZSBjcmVhdGVNZXRob2Q7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCZWFuTWV0aG9kKCkgPGVtPkJlYW4gTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC01OCw3ICs1OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIE5hbWVkTWV0aG9kVHlwZSBiZWFuTWV0aG9kID0gbnVsbDsKKwlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlIGJlYW5NZXRob2Q7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTk0LDYgKzk0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLklOSVRfTUVUSE9EX1RZUEU7CiAJfQpAQCAtMjEwLDYgKzIxMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19DUkVBVEVfTUVUSE9EOgpAQCAtMjI1LDYgKzIyNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19DUkVBVEVfTUVUSE9EOgpAQCAtMjQyLDYgKzI0NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5JVF9NRVRIT0RfVFlQRV9fQ1JFQVRFX01FVEhPRDoKQEAgLTI2Miw2ICsyNjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLklOSVRfTUVUSE9EX1RZUEVfX0NSRUFURV9NRVRIT0Q6CkBAIC0yODIsNiArMjg3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFX19DUkVBVEVfTUVUSE9EOgpAQCAtMjk5LDYgKzMwNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvckJpbmRpbmdUeXBlSW1wbC5qYXZhCmluZGV4IGFiYjAwZTcuLjZmZjczZjUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW50ZXJjZXB0b3JCaW5kaW5nVHlwZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yQmluZGluZ1R5cGVJbXBsLmphdmEKQEAgLTY1LDcgKzY1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJOYW1lKCkgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC05NSw3ICs5NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGludGVyY2VwdG9yQ2xhc3NlcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gaW50ZXJjZXB0b3JDbGFzc2VzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJjZXB0b3JPcmRlcigpIDxlbT5JbnRlcmNlcHRvciBPcmRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtMTA1LDcgKzEwNSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEludGVyY2VwdG9yT3JkZXJUeXBlIGludGVyY2VwdG9yT3JkZXIgPSBudWxsOworCXByb3RlY3RlZCBJbnRlcmNlcHRvck9yZGVyVHlwZSBpbnRlcmNlcHRvck9yZGVyOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnMoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IEludGVyY2VwdG9yczwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTM0LDcgKzEzNCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnNFU2V0ID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZURlZmF1bHRJbnRlcmNlcHRvcnNFU2V0OwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkgPGVtPkV4Y2x1ZGUgQ2xhc3MgSW50ZXJjZXB0b3JzPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNjMsNyArMTYzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGNsdWRlQ2xhc3NJbnRlcmNlcHRvcnNFU2V0ID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzRVNldDsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZCgpIDxlbT5NZXRob2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTE3Myw3ICsxNzMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBOYW1lZE1ldGhvZFR5cGUgbWV0aG9kID0gbnVsbDsKKwlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlIG1ldGhvZDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMjA5LDYgKzIwOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEU7CiAJfQpAQCAtMjE4LDkgKzIxOSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fREVTQ1JJUFRJT05TKTsKIAkJfQogCQlyZXR1cm4gZGVzY3JpcHRpb25zOwogCX0KQEAgLTI1MSw5ICsyNTIsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcmNlcHRvckNsYXNzZXMoKSB7CisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJbnRlcmNlcHRvckNsYXNzZXMoKSB7CiAJCWlmIChpbnRlcmNlcHRvckNsYXNzZXMgPT0gbnVsbCkgewotCQkJaW50ZXJjZXB0b3JDbGFzc2VzID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX0NMQVNTRVMpOworCQkJaW50ZXJjZXB0b3JDbGFzc2VzID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1NFUyk7CiAJCX0KIAkJcmV0dXJuIGludGVyY2VwdG9yQ2xhc3NlczsKIAl9CkBAIC00NjIsMTAgKzQ2MywxMSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lOVEVSQ0VQVE9SX09SREVSOgogCQkJCXJldHVybiBiYXNpY1NldEludGVyY2VwdG9yT3JkZXIobnVsbCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19NRVRIT0Q6CkBAIC00NzksNiArNDgxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fREVTQ1JJUFRJT05TOgpAQCAtNDkwLDkgKzQ5Myw5IEBACiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9PUkRFUjoKIAkJCQlyZXR1cm4gZ2V0SW50ZXJjZXB0b3JPcmRlcigpOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRVhDTFVERV9ERUZBVUxUX0lOVEVSQ0VQVE9SUzoKLQkJCQlyZXR1cm4gaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKwkJCQlyZXR1cm4gaXNFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygpOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRVhDTFVERV9DTEFTU19JTlRFUkNFUFRPUlM6Ci0JCQkJcmV0dXJuIGlzRXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOworCQkJCXJldHVybiBpc0V4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygpOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fTUVUSE9EOgogCQkJCXJldHVybiBnZXRNZXRob2QoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0lEOgpAQCAtNTA2LDI3ICs1MDksMjkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9CSU5ESU5HX1RZUEVfX0VKQl9OQU1FOgogCQkJCXNldEVqYk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1NFUzoKIAkJCQlnZXRJbnRlcmNlcHRvckNsYXNzZXMoKS5jbGVhcigpOwotCQkJCWdldEludGVyY2VwdG9yQ2xhc3NlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19JTlRFUkNFUFRPUl9PUkRFUjoKIAkJCQlzZXRJbnRlcmNlcHRvck9yZGVyKChJbnRlcmNlcHRvck9yZGVyVHlwZSluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRVhDTFVERV9ERUZBVUxUX0lOVEVSQ0VQVE9SUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCQlzZXRFeGNsdWRlRGVmYXVsdEludGVyY2VwdG9ycygoQm9vbGVhbiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fRVhDTFVERV9DTEFTU19JTlRFUkNFUFRPUlM6Ci0JCQkJc2V0RXhjbHVkZUNsYXNzSW50ZXJjZXB0b3JzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOworCQkJCXNldEV4Y2x1ZGVDbGFzc0ludGVyY2VwdG9ycygoQm9vbGVhbiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fTUVUSE9EOgogCQkJCXNldE1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW5ld1ZhbHVlKTsKQEAgLTU0Myw2ICs1NDgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRV9fREVTQ1JJUFRJT05TOgpAQCAtNTc4LDYgKzU4NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfQklORElOR19UWVBFX19ERVNDUklQVElPTlM6CkBAIC02MDUsNiArNjEyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yT3JkZXJUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvck9yZGVyVHlwZUltcGwuamF2YQppbmRleCAwOGQwOWM5Li5lZWY3NTdkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yT3JkZXJUeXBlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW50ZXJjZXB0b3JPcmRlclR5cGVJbXBsLmphdmEKQEAgLTUxLDcgKzUxLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW50ZXJjZXB0b3JDbGFzc2VzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBpbnRlcmNlcHRvckNsYXNzZXM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTg3LDYgKzg3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLklOVEVSQ0VQVE9SX09SREVSX1RZUEU7CiAJfQpAQCAtOTYsOSArOTcsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcmNlcHRvckNsYXNzZXMoKSB7CisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJbnRlcmNlcHRvckNsYXNzZXMoKSB7CiAJCWlmIChpbnRlcmNlcHRvckNsYXNzZXMgPT0gbnVsbCkgewotCQkJaW50ZXJjZXB0b3JDbGFzc2VzID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTKTsKKwkJCWludGVyY2VwdG9yQ2xhc3NlcyA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTKTsKIAkJfQogCQlyZXR1cm4gaW50ZXJjZXB0b3JDbGFzc2VzOwogCX0KQEAgLTEyOSw2ICsxMzAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfT1JERVJfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1NFUzoKQEAgLTE0NCwxMSArMTQ2LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfT1JERVJfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1NFUzoKIAkJCQlnZXRJbnRlcmNlcHRvckNsYXNzZXMoKS5jbGVhcigpOwotCQkJCWdldEludGVyY2VwdG9yQ2xhc3NlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SW50ZXJjZXB0b3JDbGFzc2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfT1JERVJfVFlQRV9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0xNjIsNiArMTY2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9PUkRFUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTU0VTOgpAQCAtMTc5LDYgKzE4NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfT1JERVJfVFlQRV9fSU5URVJDRVBUT1JfQ0xBU1NFUzoKQEAgLTE5NCw2ICsyMDAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW50ZXJjZXB0b3JUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvclR5cGVJbXBsLmphdmEKaW5kZXggNjQxZjRlNS4uOTI4ZTQ4ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvclR5cGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvclR5cGVJbXBsLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZjsKQEAgLTQwLDYgKzQxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZEludm9rZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kVGltZW91dFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKQEAgLTU0LDYgKzU2LDcgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRJbnRlcmNlcHRvckNsYXNzIDxlbT5JbnRlcmNlcHRvciBDbGFzczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldEFyb3VuZEludm9rZXMgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0QXJvdW5kVGltZW91dHMgPGVtPkFyb3VuZCBUaW1lb3V0czwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59PC9saT4KQEAgLTY1LDYgKzY4LDcgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXREYXRhU291cmNlIDxlbT5EYXRhIFNvdXJjZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5JbnRlcmNlcHRvclR5cGVJbXBsI2dldFBvc3RBY3RpdmF0ZXMgPGVtPlBvc3QgQWN0aXZhdGVzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkludGVyY2VwdG9yVHlwZUltcGwjZ2V0UHJlUGFzc2l2YXRlcyA8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuSW50ZXJjZXB0b3JUeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgpAQCAtODIsNyArODYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb25zOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVyY2VwdG9yQ2xhc3MoKSA8ZW0+SW50ZXJjZXB0b3IgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTExMiw3ICsxMTYsMTcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXJvdW5kSW52b2tlcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEFyb3VuZEludm9rZVR5cGU+IGFyb3VuZEludm9rZXM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcm91bmRUaW1lb3V0cygpIDxlbT5Bcm91bmQgVGltZW91dHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QXJvdW5kVGltZW91dHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxBcm91bmRUaW1lb3V0VHlwZT4gYXJvdW5kVGltZW91dHM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnZFbnRyaWVzKCkgPGVtPkVudiBFbnRyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEyMiw3ICsxMzYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlbnZFbnRyaWVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RW52RW50cnk+IGVudkVudHJpZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZzKCkgPGVtPkVqYiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEzMiw3ICsxNDYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJSZWZzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RWpiUmVmPiBlamJSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTG9jYWxSZWZzKCkgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE0Miw3ICsxNTYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJMb2NhbFJlZnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxFamJMb2NhbFJlZj4gZWpiTG9jYWxSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVJlZnMoKSA8ZW0+U2VydmljZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE1Miw3ICsxNjYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlUmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFNlcnZpY2VSZWY+IHNlcnZpY2VSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VSZWZzKCkgPGVtPlJlc291cmNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTYyLDcgKzE3Niw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlUmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFJlc291cmNlUmVmPiByZXNvdXJjZVJlZnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUVudlJlZnMoKSA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTcyLDcgKzE4Niw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlRW52UmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFJlc291cmNlRW52UmVmPiByZXNvdXJjZUVudlJlZnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xODIsNyArMTk2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvblJlZj4gbWVzc2FnZURlc3RpbmF0aW9uUmVmczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE5Miw3ICsyMDYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8UGVyc2lzdGVuY2VDb250ZXh0UmVmPiBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjAyLDcgKzIxNiw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHBlcnNpc3RlbmNlVW5pdFJlZnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxQZXJzaXN0ZW5jZVVuaXRSZWY+IHBlcnNpc3RlbmNlVW5pdFJlZnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Q29uc3RydWN0cygpIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjEyLDcgKzIyNiw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHBvc3RDb25zdHJ1Y3RzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IHBvc3RDb25zdHJ1Y3RzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlRGVzdHJveXMoKSA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTIyMiw3ICsyMzYsMTcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJlRGVzdHJveXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gcHJlRGVzdHJveXM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhU291cmNlKCkgPGVtPkRhdGEgU291cmNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERhdGFTb3VyY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEYXRhU291cmNlVHlwZT4gZGF0YVNvdXJjZTsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3RBY3RpdmF0ZXMoKSA8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjMyLDcgKzI1Niw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHBvc3RBY3RpdmF0ZXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gcG9zdEFjdGl2YXRlczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZVBhc3NpdmF0ZXMoKSA8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjQyLDcgKzI2Niw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHByZVBhc3NpdmF0ZXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gcHJlUGFzc2l2YXRlczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMjc4LDYgKzMwMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5JTlRFUkNFUFRPUl9UWVBFOwogCX0KQEAgLTI4Nyw5ICszMTIsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fREVTQ1JJUFRJT05TKTsKKwkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fREVTQ1JJUFRJT05TKTsKIAkJfQogCQlyZXR1cm4gZGVzY3JpcHRpb25zOwogCX0KQEAgLTMyMCw5ICszNDUsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBcm91bmRJbnZva2VzKCkgeworCXB1YmxpYyBMaXN0PEFyb3VuZEludm9rZVR5cGU+IGdldEFyb3VuZEludm9rZXMoKSB7CiAJCWlmIChhcm91bmRJbnZva2VzID09IG51bGwpIHsKLQkJCWFyb3VuZEludm9rZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQXJvdW5kSW52b2tlVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfSU5WT0tFUyk7CisJCQlhcm91bmRJbnZva2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEFyb3VuZEludm9rZVR5cGU+KEFyb3VuZEludm9rZVR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fQVJPVU5EX0lOVk9LRVMpOwogCQl9CiAJCXJldHVybiBhcm91bmRJbnZva2VzOwogCX0KQEAgLTMzMiw5ICszNTcsMjEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RW52RW50cmllcygpIHsKKwlwdWJsaWMgTGlzdDxBcm91bmRUaW1lb3V0VHlwZT4gZ2V0QXJvdW5kVGltZW91dHMoKSB7CisJCWlmIChhcm91bmRUaW1lb3V0cyA9PSBudWxsKSB7CisJCQlhcm91bmRUaW1lb3V0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxBcm91bmRUaW1lb3V0VHlwZT4oQXJvdW5kVGltZW91dFR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fQVJPVU5EX1RJTUVPVVRTKTsKKwkJfQorCQlyZXR1cm4gYXJvdW5kVGltZW91dHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8RW52RW50cnk+IGdldEVudkVudHJpZXMoKSB7CiAJCWlmIChlbnZFbnRyaWVzID09IG51bGwpIHsKLQkJCWVudkVudHJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRW52RW50cnkuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRU5WX0VOVFJJRVMpOworCQkJZW52RW50cmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxFbnZFbnRyeT4oRW52RW50cnkuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRU5WX0VOVFJJRVMpOwogCQl9CiAJCXJldHVybiBlbnZFbnRyaWVzOwogCX0KQEAgLTM0NCw5ICszODEsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJSZWZzKCkgeworCXB1YmxpYyBMaXN0PEVqYlJlZj4gZ2V0RWpiUmVmcygpIHsKIAkJaWYgKGVqYlJlZnMgPT0gbnVsbCkgewotCQkJZWpiUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFamJSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRUpCX1JFRlMpOworCQkJZWpiUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxFamJSZWY+KEVqYlJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FSkJfUkVGUyk7CiAJCX0KIAkJcmV0dXJuIGVqYlJlZnM7CiAJfQpAQCAtMzU2LDkgKzM5Myw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEVqYkxvY2FsUmVmcygpIHsKKwlwdWJsaWMgTGlzdDxFamJMb2NhbFJlZj4gZ2V0RWpiTG9jYWxSZWZzKCkgewogCQlpZiAoZWpiTG9jYWxSZWZzID09IG51bGwpIHsKLQkJCWVqYkxvY2FsUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFamJMb2NhbFJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FSkJfTE9DQUxfUkVGUyk7CisJCQllamJMb2NhbFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RWpiTG9jYWxSZWY+KEVqYkxvY2FsUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VKQl9MT0NBTF9SRUZTKTsKIAkJfQogCQlyZXR1cm4gZWpiTG9jYWxSZWZzOwogCX0KQEAgLTM2OCw5ICs0MDUsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2aWNlUmVmcygpIHsKKwlwdWJsaWMgTGlzdDxTZXJ2aWNlUmVmPiBnZXRTZXJ2aWNlUmVmcygpIHsKIAkJaWYgKHNlcnZpY2VSZWZzID09IG51bGwpIHsKLQkJCXNlcnZpY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fU0VSVklDRV9SRUZTKTsKKwkJCXNlcnZpY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFNlcnZpY2VSZWY+KFNlcnZpY2VSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fU0VSVklDRV9SRUZTKTsKIAkJfQogCQlyZXR1cm4gc2VydmljZVJlZnM7CiAJfQpAQCAtMzgwLDkgKzQxNyw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlUmVmcygpIHsKKwlwdWJsaWMgTGlzdDxSZXNvdXJjZVJlZj4gZ2V0UmVzb3VyY2VSZWZzKCkgewogCQlpZiAocmVzb3VyY2VSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9SRUZTKTsKKwkJCXJlc291cmNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxSZXNvdXJjZVJlZj4oUmVzb3VyY2VSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfUkVGUyk7CiAJCX0KIAkJcmV0dXJuIHJlc291cmNlUmVmczsKIAl9CkBAIC0zOTIsOSArNDI5LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCkgeworCXB1YmxpYyBMaXN0PFJlc291cmNlRW52UmVmPiBnZXRSZXNvdXJjZUVudlJlZnMoKSB7CiAJCWlmIChyZXNvdXJjZUVudlJlZnMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VFbnZSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlRW52UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX0VOVl9SRUZTKTsKKwkJCXJlc291cmNlRW52UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxSZXNvdXJjZUVudlJlZj4oUmVzb3VyY2VFbnZSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfRU5WX1JFRlMpOwogCQl9CiAJCXJldHVybiByZXNvdXJjZUVudlJlZnM7CiAJfQpAQCAtNDA0LDkgKzQ0MSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7CisJcHVibGljIExpc3Q8TWVzc2FnZURlc3RpbmF0aW9uUmVmPiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewogCQlpZiAobWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOworCQkJbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxNZXNzYWdlRGVzdGluYXRpb25SZWY+KE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOwogCQl9CiAJCXJldHVybiBtZXNzYWdlRGVzdGluYXRpb25SZWZzOwogCX0KQEAgLTQxNiw5ICs0NTMsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgeworCXB1YmxpYyBMaXN0PFBlcnNpc3RlbmNlQ29udGV4dFJlZj4gZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKIAkJaWYgKHBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVuY2VDb250ZXh0UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTKTsKKwkJCXBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UGVyc2lzdGVuY2VDb250ZXh0UmVmPihQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTKTsKIAkJfQogCQlyZXR1cm4gcGVyc2lzdGVuY2VDb250ZXh0UmVmczsKIAl9CkBAIC00MjgsOSArNDY1LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIHsKKwlwdWJsaWMgTGlzdDxQZXJzaXN0ZW5jZVVuaXRSZWY+IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSB7CiAJCWlmIChwZXJzaXN0ZW5jZVVuaXRSZWZzID09IG51bGwpIHsKLQkJCXBlcnNpc3RlbmNlVW5pdFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7CisJCQlwZXJzaXN0ZW5jZVVuaXRSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFBlcnNpc3RlbmNlVW5pdFJlZj4oUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7CiAJCX0KIAkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFJlZnM7CiAJfQpAQCAtNDQwLDkgKzQ3Nyw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCkgeworCXB1YmxpYyBMaXN0PExpZmVjeWNsZUNhbGxiYWNrPiBnZXRQb3N0Q29uc3RydWN0cygpIHsKIAkJaWYgKHBvc3RDb25zdHJ1Y3RzID09IG51bGwpIHsKLQkJCXBvc3RDb25zdHJ1Y3RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQ09OU1RSVUNUUyk7CisJCQlwb3N0Q29uc3RydWN0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4oTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUE9TVF9DT05TVFJVQ1RTKTsKIAkJfQogCQlyZXR1cm4gcG9zdENvbnN0cnVjdHM7CiAJfQpAQCAtNDUyLDkgKzQ4OSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFByZURlc3Ryb3lzKCkgeworCXB1YmxpYyBMaXN0PExpZmVjeWNsZUNhbGxiYWNrPiBnZXRQcmVEZXN0cm95cygpIHsKIAkJaWYgKHByZURlc3Ryb3lzID09IG51bGwpIHsKLQkJCXByZURlc3Ryb3lzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BSRV9ERVNUUk9ZUyk7CisJCQlwcmVEZXN0cm95cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4oTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX0RFU1RST1lTKTsKIAkJfQogCQlyZXR1cm4gcHJlRGVzdHJveXM7CiAJfQpAQCAtNDY0LDkgKzUwMSwyMSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3N0QWN0aXZhdGVzKCkgeworCXB1YmxpYyBMaXN0PERhdGFTb3VyY2VUeXBlPiBnZXREYXRhU291cmNlKCkgeworCQlpZiAoZGF0YVNvdXJjZSA9PSBudWxsKSB7CisJCQlkYXRhU291cmNlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERhdGFTb3VyY2VUeXBlPihEYXRhU291cmNlVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19EQVRBX1NPVVJDRSk7CisJCX0KKwkJcmV0dXJuIGRhdGFTb3VyY2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IGdldFBvc3RBY3RpdmF0ZXMoKSB7CiAJCWlmIChwb3N0QWN0aXZhdGVzID09IG51bGwpIHsKLQkJCXBvc3RBY3RpdmF0ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUE9TVF9BQ1RJVkFURVMpOworCQkJcG9zdEFjdGl2YXRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4oTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUE9TVF9BQ1RJVkFURVMpOwogCQl9CiAJCXJldHVybiBwb3N0QWN0aXZhdGVzOwogCX0KQEAgLTQ3Niw5ICs1MjUsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcmVQYXNzaXZhdGVzKCkgeworCXB1YmxpYyBMaXN0PExpZmVjeWNsZUNhbGxiYWNrPiBnZXRQcmVQYXNzaXZhdGVzKCkgewogCQlpZiAocHJlUGFzc2l2YXRlcyA9PSBudWxsKSB7Ci0JCQlwcmVQYXNzaXZhdGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BSRV9QQVNTSVZBVEVTKTsKKwkJCXByZVBhc3NpdmF0ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BSRV9QQVNTSVZBVEVTKTsKIAkJfQogCQlyZXR1cm4gcHJlUGFzc2l2YXRlczsKIAl9CkBAIC01MDksMzggKzU1OCw0MyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fQVJPVU5EX0lOVk9LRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRBcm91bmRJbnZva2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEFyb3VuZEludm9rZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0FST1VORF9USU1FT1VUUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEFyb3VuZFRpbWVvdXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVudkVudHJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RW52RW50cmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRUpCX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVqYlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VKQl9MT0NBTF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RWpiTG9jYWxSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UmVzb3VyY2VSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9FTlZfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRSZXNvdXJjZUVudlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9VTklUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvc3RDb25zdHJ1Y3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBvc3RDb25zdHJ1Y3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QUkVfREVTVFJPWVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQcmVEZXN0cm95cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcmVEZXN0cm95cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREYXRhU291cmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QT1NUX0FDVElWQVRFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvc3RBY3RpdmF0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UG9zdEFjdGl2YXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX1BBU1NJVkFURVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQcmVQYXNzaXZhdGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByZVBhc3NpdmF0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC01NTAsNiArNjA0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0RFU0NSSVBUSU9OUzoKQEAgLTU1OCw2ICs2MTMsOCBAQAogCQkJCXJldHVybiBnZXRJbnRlcmNlcHRvckNsYXNzKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fQVJPVU5EX0lOVk9LRVM6CiAJCQkJcmV0dXJuIGdldEFyb3VuZEludm9rZXMoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfVElNRU9VVFM6CisJCQkJcmV0dXJuIGdldEFyb3VuZFRpbWVvdXRzKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRU5WX0VOVFJJRVM6CiAJCQkJcmV0dXJuIGdldEVudkVudHJpZXMoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FSkJfUkVGUzoKQEAgLTU4MCw2ICs2MzcsOCBAQAogCQkJCXJldHVybiBnZXRQb3N0Q29uc3RydWN0cygpOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BSRV9ERVNUUk9ZUzoKIAkJCQlyZXR1cm4gZ2V0UHJlRGVzdHJveXMoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19EQVRBX1NPVVJDRToKKwkJCQlyZXR1cm4gZ2V0RGF0YVNvdXJjZSgpOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQUNUSVZBVEVTOgogCQkJCXJldHVybiBnZXRQb3N0QWN0aXZhdGVzKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX1BBU1NJVkFURVM6CkBAIC01OTUsNzAgKzY1NCw4MCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19JTlRFUkNFUFRPUl9DTEFTUzoKIAkJCQlzZXRJbnRlcmNlcHRvckNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfSU5WT0tFUzoKIAkJCQlnZXRBcm91bmRJbnZva2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRBcm91bmRJbnZva2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRBcm91bmRJbnZva2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBcm91bmRJbnZva2VUeXBlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0FST1VORF9USU1FT1VUUzoKKwkJCQlnZXRBcm91bmRUaW1lb3V0cygpLmNsZWFyKCk7CisJCQkJZ2V0QXJvdW5kVGltZW91dHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEFyb3VuZFRpbWVvdXRUeXBlPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VOVl9FTlRSSUVTOgogCQkJCWdldEVudkVudHJpZXMoKS5jbGVhcigpOwotCQkJCWdldEVudkVudHJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEVudkVudHJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEVudkVudHJ5PiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0VKQl9SRUZTOgogCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEVqYlJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FSkJfTE9DQUxfUkVGUzoKIAkJCQlnZXRFamJMb2NhbFJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYkxvY2FsUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RWpiTG9jYWxSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFamJMb2NhbFJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19TRVJWSUNFX1JFRlM6CiAJCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlcnZpY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VydmljZVJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19SRVNPVVJDRV9SRUZTOgogCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRSZXNvdXJjZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJlc291cmNlUmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX0VOVl9SRUZTOgogCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJlc291cmNlRW52UmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKIAkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXNzYWdlRGVzdGluYXRpb25SZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTOgogCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5jbGVhcigpOwotCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFBlcnNpc3RlbmNlQ29udGV4dFJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9VTklUX1JFRlM6CiAJCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQ09OU1RSVUNUUzoKIAkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBMaWZlY3ljbGVDYWxsYmFjaz4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19QUkVfREVTVFJPWVM6CiAJCQkJZ2V0UHJlRGVzdHJveXMoKS5jbGVhcigpOwotCQkJCWdldFByZURlc3Ryb3lzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRQcmVEZXN0cm95cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTGlmZWN5Y2xlQ2FsbGJhY2s+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fREFUQV9TT1VSQ0U6CisJCQkJZ2V0RGF0YVNvdXJjZSgpLmNsZWFyKCk7CisJCQkJZ2V0RGF0YVNvdXJjZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGF0YVNvdXJjZVR5cGU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUE9TVF9BQ1RJVkFURVM6CiAJCQkJZ2V0UG9zdEFjdGl2YXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UG9zdEFjdGl2YXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UG9zdEFjdGl2YXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTGlmZWN5Y2xlQ2FsbGJhY2s+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX1BBU1NJVkFURVM6CiAJCQkJZ2V0UHJlUGFzc2l2YXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJlUGFzc2l2YXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UHJlUGFzc2l2YXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTGlmZWN5Y2xlQ2FsbGJhY2s+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC02NzIsNiArNzQxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19ERVNDUklQVElPTlM6CkBAIC02ODMsNiArNzUzLDkgQEAKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfSU5WT0tFUzoKIAkJCQlnZXRBcm91bmRJbnZva2VzKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fQVJPVU5EX1RJTUVPVVRTOgorCQkJCWdldEFyb3VuZFRpbWVvdXRzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fRU5WX0VOVFJJRVM6CiAJCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOwpAQCAtNzE2LDYgKzc4OSw5IEBACiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX0RFU1RST1lTOgogCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fREFUQV9TT1VSQ0U6CisJCQkJZ2V0RGF0YVNvdXJjZSgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQUNUSVZBVEVTOgogCQkJCWdldFBvc3RBY3RpdmF0ZXMoKS5jbGVhcigpOwogCQkJCXJldHVybjsKQEAgLTczNCw2ICs4MTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX1RZUEVfX0RFU0NSSVBUSU9OUzoKQEAgLTc0Miw2ICs4MTksOCBAQAogCQkJCXJldHVybiBJTlRFUkNFUFRPUl9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gaW50ZXJjZXB0b3JDbGFzcyAhPSBudWxsIDogIUlOVEVSQ0VQVE9SX0NMQVNTX0VERUZBVUxULmVxdWFscyhpbnRlcmNlcHRvckNsYXNzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfSU5WT0tFUzoKIAkJCQlyZXR1cm4gYXJvdW5kSW52b2tlcyAhPSBudWxsICYmICFhcm91bmRJbnZva2VzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19BUk9VTkRfVElNRU9VVFM6CisJCQkJcmV0dXJuIGFyb3VuZFRpbWVvdXRzICE9IG51bGwgJiYgIWFyb3VuZFRpbWVvdXRzLmlzRW1wdHkoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FTlZfRU5UUklFUzoKIAkJCQlyZXR1cm4gZW52RW50cmllcyAhPSBudWxsICYmICFlbnZFbnRyaWVzLmlzRW1wdHkoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFX19FSkJfUkVGUzoKQEAgLTc2NCw2ICs4NDMsOCBAQAogCQkJCXJldHVybiBwb3N0Q29uc3RydWN0cyAhPSBudWxsICYmICFwb3N0Q29uc3RydWN0cy5pc0VtcHR5KCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX0RFU1RST1lTOgogCQkJCXJldHVybiBwcmVEZXN0cm95cyAhPSBudWxsICYmICFwcmVEZXN0cm95cy5pc0VtcHR5KCk7CisJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuIGRhdGFTb3VyY2UgIT0gbnVsbCAmJiAhZGF0YVNvdXJjZS5pc0VtcHR5KCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUE9TVF9BQ1RJVkFURVM6CiAJCQkJcmV0dXJuIHBvc3RBY3RpdmF0ZXMgIT0gbnVsbCAmJiAhcG9zdEFjdGl2YXRlcy5pc0VtcHR5KCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JfVFlQRV9fUFJFX1BBU1NJVkFURVM6CkBAIC03NzksNiArODYwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yc1R5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL0ludGVyY2VwdG9yc1R5cGVJbXBsLmphdmEKaW5kZXggODNmNTE5Ni4uZjlmMzQ1NSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9JbnRlcmNlcHRvcnNUeXBlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvSW50ZXJjZXB0b3JzVHlwZUltcGwuamF2YQpAQCAtNTgsNyArNTgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb25zOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJjZXB0b3JzKCkgPGVtPkludGVyY2VwdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC02OCw3ICs2OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGludGVyY2VwdG9ycyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEludGVyY2VwdG9yVHlwZT4gaW50ZXJjZXB0b3JzOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMDQsNiArMTA0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLklOVEVSQ0VQVE9SU19UWVBFOwogCX0KQEAgLTExMyw5ICsxMTQsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMTI1LDkgKzEyNiw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEludGVyY2VwdG9ycygpIHsKKwlwdWJsaWMgTGlzdDxJbnRlcmNlcHRvclR5cGU+IGdldEludGVyY2VwdG9ycygpIHsKIAkJaWYgKGludGVyY2VwdG9ycyA9PSBudWxsKSB7Ci0JCQlpbnRlcmNlcHRvcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19JTlRFUkNFUFRPUlMpOworCQkJaW50ZXJjZXB0b3JzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEludGVyY2VwdG9yVHlwZT4oSW50ZXJjZXB0b3JUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19JTlRFUkNFUFRPUlMpOwogCQl9CiAJCXJldHVybiBpbnRlcmNlcHRvcnM7CiAJfQpAQCAtMTU4LDEyICsxNTksMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SU19UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fSU5URVJDRVBUT1JTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW50ZXJjZXB0b3JzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEludGVyY2VwdG9ycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTE3Myw2ICsxNzUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0RFU0NSSVBUSU9OUzoKQEAgLTE5MCwxNSArMTkzLDE3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fSU5URVJDRVBUT1JTOgogCQkJCWdldEludGVyY2VwdG9ycygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJjZXB0b3JzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRJbnRlcmNlcHRvcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEludGVyY2VwdG9yVHlwZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0yMTIsNiArMjE3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUlNfVFlQRV9fREVTQ1JJUFRJT05TOgpAQCAtMjMyLDYgKzIzOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEVfX0RFU0NSSVBUSU9OUzoKQEAgLTI0OSw2ICsyNTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWVzc2FnZURyaXZlbkJlYW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEcml2ZW5CZWFuSW1wbC5qYXZhCmluZGV4IGIxOWQ2NTMuLjBlMjc0ZDkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWVzc2FnZURyaXZlbkJlYW5JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuQmVhbkltcGwuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7CkBAIC0zOSwxMyArNDAsMTYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kSW52b2tlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRUaW1lb3V0VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5OYW1lZE1ldGhvZFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2VjdXJpdHlJZGVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uVHlwZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7CkBAIC02NSwxMSArNjksMTMgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRFamJDbGFzcyA8ZW0+RWpiIENsYXNzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRNZXNzYWdpbmdUeXBlIDxlbT5NZXNzYWdpbmcgVHlwZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0VGltZW91dE1ldGhvZCA8ZW0+VGltZW91dCBNZXRob2Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldFRpbWVyIDxlbT5UaW1lcjwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0VHJhbnNhY3Rpb25UeXBlIDxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0QWN0aXZhdGlvbkNvbmZpZyA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldEFyb3VuZEludm9rZXMgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRBcm91bmRUaW1lb3V0cyA8ZW0+QXJvdW5kIFRpbWVvdXRzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRFbnZFbnRyaWVzIDxlbT5FbnYgRW50cmllczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgpAQCAtODEsNiArODcsOCBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0UHJlRGVzdHJveXMgPGVtPlByZSBEZXN0cm95czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwjZ2V0RGF0YVNvdXJjZSA8ZW0+RGF0YSBTb3VyY2U8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldFNlY3VyaXR5Um9sZVJlZiA8ZW0+U2VjdXJpdHkgUm9sZSBSZWY8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuTWVzc2FnZURyaXZlbkJlYW5JbXBsI2dldFNlY3VyaXR5SWRlbnRpdHkgPGVtPlNlY3VyaXR5IElkZW50aXR5PC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VEcml2ZW5CZWFuSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgogICogPC91bD4KQEAgLTk3LDcgKzEwNSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMDcsNyArMTE1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGlzcGxheU5hbWVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGlzcGxheU5hbWU+IGRpc3BsYXlOYW1lczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25zKCkgPGVtPkljb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTExNyw3ICsxMjUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpY29ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEljb24+IGljb25zOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYk5hbWUoKSA8ZW0+RWpiIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTIwNyw3ICsyMTUsMTcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlIHRpbWVvdXRNZXRob2QgPSBudWxsOworCXByb3RlY3RlZCBOYW1lZE1ldGhvZFR5cGUgdGltZW91dE1ldGhvZDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVyKCkgPGVtPlRpbWVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRpbWVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8VGltZXJUeXBlPiB0aW1lcjsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2FjdGlvblR5cGUoKSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMjM2LDcgKzI1NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNhY3Rpb25UeXBlRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHRyYW5zYWN0aW9uVHlwZUVTZXQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSgpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTI4Niw3ICszMDQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBBY3RpdmF0aW9uQ29uZmlnIGFjdGl2YXRpb25Db25maWcgPSBudWxsOworCXByb3RlY3RlZCBBY3RpdmF0aW9uQ29uZmlnIGFjdGl2YXRpb25Db25maWc7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcm91bmRJbnZva2VzKCkgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTI5Niw3ICszMTQsMTcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXJvdW5kSW52b2tlcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEFyb3VuZEludm9rZVR5cGU+IGFyb3VuZEludm9rZXM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcm91bmRUaW1lb3V0cygpIDxlbT5Bcm91bmQgVGltZW91dHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QXJvdW5kVGltZW91dHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxBcm91bmRUaW1lb3V0VHlwZT4gYXJvdW5kVGltZW91dHM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnZFbnRyaWVzKCkgPGVtPkVudiBFbnRyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTMwNiw3ICszMzQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlbnZFbnRyaWVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RW52RW50cnk+IGVudkVudHJpZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJSZWZzKCkgPGVtPkVqYiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTMxNiw3ICszNDQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJSZWZzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RWpiUmVmPiBlamJSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTG9jYWxSZWZzKCkgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTMyNiw3ICszNTQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJMb2NhbFJlZnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxFamJMb2NhbFJlZj4gZWpiTG9jYWxSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VydmljZVJlZnMoKSA8ZW0+U2VydmljZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTMzNiw3ICszNjQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBzZXJ2aWNlUmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFNlcnZpY2VSZWY+IHNlcnZpY2VSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VSZWZzKCkgPGVtPlJlc291cmNlIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMzQ2LDcgKzM3NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlUmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFJlc291cmNlUmVmPiByZXNvdXJjZVJlZnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZUVudlJlZnMoKSA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMzU2LDcgKzM4NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHJlc291cmNlRW52UmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFJlc291cmNlRW52UmVmPiByZXNvdXJjZUVudlJlZnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0zNjYsNyArMzk0LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvblJlZj4gbWVzc2FnZURlc3RpbmF0aW9uUmVmczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTM3Niw3ICs0MDQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8UGVyc2lzdGVuY2VDb250ZXh0UmVmPiBwZXJzaXN0ZW5jZUNvbnRleHRSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMzg2LDcgKzQxNCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHBlcnNpc3RlbmNlVW5pdFJlZnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxQZXJzaXN0ZW5jZVVuaXRSZWY+IHBlcnNpc3RlbmNlVW5pdFJlZnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Q29uc3RydWN0cygpIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMzk2LDcgKzQyNCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHBvc3RDb25zdHJ1Y3RzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IHBvc3RDb25zdHJ1Y3RzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlRGVzdHJveXMoKSA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQwNiw3ICs0MzQsMjcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcHJlRGVzdHJveXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gcHJlRGVzdHJveXM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhU291cmNlKCkgPGVtPkRhdGEgU291cmNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERhdGFTb3VyY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEYXRhU291cmNlVHlwZT4gZGF0YVNvdXJjZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3VyaXR5Um9sZVJlZigpIDxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTZWN1cml0eVJvbGVSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxTZWN1cml0eVJvbGVSZWY+IHNlY3VyaXR5Um9sZVJlZjsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3VyaXR5SWRlbnRpdHkoKSA8ZW0+U2VjdXJpdHkgSWRlbnRpdHk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTQxNiw3ICs0NjQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBTZWN1cml0eUlkZW50aXR5VHlwZSBzZWN1cml0eUlkZW50aXR5ID0gbnVsbDsKKwlwcm90ZWN0ZWQgU2VjdXJpdHlJZGVudGl0eVR5cGUgc2VjdXJpdHlJZGVudGl0eTsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtNDUyLDYgKzUwMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5NRVNTQUdFX0RSSVZFTl9CRUFOOwogCX0KQEAgLTQ2MSw5ICs1MTAsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fREVTQ1JJUFRJT05TKTsKKwkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fREVTQ1JJUFRJT05TKTsKIAkJfQogCQlyZXR1cm4gZGVzY3JpcHRpb25zOwogCX0KQEAgLTQ3Myw5ICs1MjIsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7CisJcHVibGljIExpc3Q8RGlzcGxheU5hbWU+IGdldERpc3BsYXlOYW1lcygpIHsKIAkJaWYgKGRpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRElTUExBWV9OQU1FUyk7CisJCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGlzcGxheU5hbWU+KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0RJU1BMQVlfTkFNRVMpOwogCQl9CiAJCXJldHVybiBkaXNwbGF5TmFtZXM7CiAJfQpAQCAtNDg1LDkgKzUzNCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgeworCXB1YmxpYyBMaXN0PEljb24+IGdldEljb25zKCkgewogCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19JQ09OUyk7CisJCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJY29uPihJY29uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0lDT05TKTsKIAkJfQogCQlyZXR1cm4gaWNvbnM7CiAJfQpAQCAtNjI0LDYgKzY3MywxOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgTGlzdDxUaW1lclR5cGU+IGdldFRpbWVyKCkgeworCQlpZiAodGltZXIgPT0gbnVsbCkgeworCQkJdGltZXIgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8VGltZXJUeXBlPihUaW1lclR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRVIpOworCQl9CisJCXJldHVybiB0aW1lcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgVHJhbnNhY3Rpb25UeXBlIGdldFRyYW5zYWN0aW9uVHlwZSgpIHsKIAkJcmV0dXJuIHRyYW5zYWN0aW9uVHlwZTsKIAl9CkBAIC03NTUsOSArODE2LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0QXJvdW5kSW52b2tlcygpIHsKKwlwdWJsaWMgTGlzdDxBcm91bmRJbnZva2VUeXBlPiBnZXRBcm91bmRJbnZva2VzKCkgewogCQlpZiAoYXJvdW5kSW52b2tlcyA9PSBudWxsKSB7Ci0JCQlhcm91bmRJbnZva2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEFyb3VuZEludm9rZVR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX0lOVk9LRVMpOworCQkJYXJvdW5kSW52b2tlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxBcm91bmRJbnZva2VUeXBlPihBcm91bmRJbnZva2VUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FST1VORF9JTlZPS0VTKTsKIAkJfQogCQlyZXR1cm4gYXJvdW5kSW52b2tlczsKIAl9CkBAIC03NjcsOSArODI4LDIxIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEVudkVudHJpZXMoKSB7CisJcHVibGljIExpc3Q8QXJvdW5kVGltZW91dFR5cGU+IGdldEFyb3VuZFRpbWVvdXRzKCkgeworCQlpZiAoYXJvdW5kVGltZW91dHMgPT0gbnVsbCkgeworCQkJYXJvdW5kVGltZW91dHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8QXJvdW5kVGltZW91dFR5cGU+KEFyb3VuZFRpbWVvdXRUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FST1VORF9USU1FT1VUUyk7CisJCX0KKwkJcmV0dXJuIGFyb3VuZFRpbWVvdXRzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PEVudkVudHJ5PiBnZXRFbnZFbnRyaWVzKCkgewogCQlpZiAoZW52RW50cmllcyA9PSBudWxsKSB7Ci0JCQllbnZFbnRyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEVudkVudHJ5LmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VOVl9FTlRSSUVTKTsKKwkJCWVudkVudHJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RW52RW50cnk+KEVudkVudHJ5LmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VOVl9FTlRSSUVTKTsKIAkJfQogCQlyZXR1cm4gZW52RW50cmllczsKIAl9CkBAIC03NzksOSArODUyLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RWpiUmVmcygpIHsKKwlwdWJsaWMgTGlzdDxFamJSZWY+IGdldEVqYlJlZnMoKSB7CiAJCWlmIChlamJSZWZzID09IG51bGwpIHsKLQkJCWVqYlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRWpiUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9SRUZTKTsKKwkJCWVqYlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RWpiUmVmPihFamJSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX1JFRlMpOwogCQl9CiAJCXJldHVybiBlamJSZWZzOwogCX0KQEAgLTc5MSw5ICs4NjQsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJMb2NhbFJlZnMoKSB7CisJcHVibGljIExpc3Q8RWpiTG9jYWxSZWY+IGdldEVqYkxvY2FsUmVmcygpIHsKIAkJaWYgKGVqYkxvY2FsUmVmcyA9PSBudWxsKSB7Ci0JCQllamJMb2NhbFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRWpiTG9jYWxSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0xPQ0FMX1JFRlMpOworCQkJZWpiTG9jYWxSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEVqYkxvY2FsUmVmPihFamJMb2NhbFJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfTE9DQUxfUkVGUyk7CiAJCX0KIAkJcmV0dXJuIGVqYkxvY2FsUmVmczsKIAl9CkBAIC04MDMsOSArODc2LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0U2VydmljZVJlZnMoKSB7CisJcHVibGljIExpc3Q8U2VydmljZVJlZj4gZ2V0U2VydmljZVJlZnMoKSB7CiAJCWlmIChzZXJ2aWNlUmVmcyA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZXJ2aWNlUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFUlZJQ0VfUkVGUyk7CisJCQlzZXJ2aWNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTZXJ2aWNlUmVmPihTZXJ2aWNlUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFUlZJQ0VfUkVGUyk7CiAJCX0KIAkJcmV0dXJuIHNlcnZpY2VSZWZzOwogCX0KQEAgLTgxNSw5ICs4ODgsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZXNvdXJjZVJlZnMoKSB7CisJcHVibGljIExpc3Q8UmVzb3VyY2VSZWY+IGdldFJlc291cmNlUmVmcygpIHsKIAkJaWYgKHJlc291cmNlUmVmcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUmVzb3VyY2VSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfUkVGUyk7CisJCQlyZXNvdXJjZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UmVzb3VyY2VSZWY+KFJlc291cmNlUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX1JFRlMpOwogCQl9CiAJCXJldHVybiByZXNvdXJjZVJlZnM7CiAJfQpAQCAtODI3LDkgKzkwMCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlRW52UmVmcygpIHsKKwlwdWJsaWMgTGlzdDxSZXNvdXJjZUVudlJlZj4gZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewogCQlpZiAocmVzb3VyY2VFbnZSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlRW52UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19SRVNPVVJDRV9FTlZfUkVGUyk7CisJCQlyZXNvdXJjZUVudlJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UmVzb3VyY2VFbnZSZWY+KFJlc291cmNlRW52UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTKTsKIAkJfQogCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZzOwogCX0KQEAgLTgzOSw5ICs5MTIsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgeworCXB1YmxpYyBMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvblJlZj4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKIAkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPT0gbnVsbCkgewotCQkJbWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKKwkJCW1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uUmVmPihNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKIAkJfQogCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmczsKIAl9CkBAIC04NTEsOSArOTI0LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKKwlwdWJsaWMgTGlzdDxQZXJzaXN0ZW5jZUNvbnRleHRSZWY+IGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSB7CiAJCWlmIChwZXJzaXN0ZW5jZUNvbnRleHRSZWZzID09IG51bGwpIHsKLQkJCXBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7CisJCQlwZXJzaXN0ZW5jZUNvbnRleHRSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFBlcnNpc3RlbmNlQ29udGV4dFJlZj4oUGVyc2lzdGVuY2VDb250ZXh0UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7CiAJCX0KIAkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFJlZnM7CiAJfQpAQCAtODYzLDkgKzkzNiw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSB7CisJcHVibGljIExpc3Q8UGVyc2lzdGVuY2VVbml0UmVmPiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkgewogCQlpZiAocGVyc2lzdGVuY2VVbml0UmVmcyA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZW5jZVVuaXRSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlMpOworCQkJcGVyc2lzdGVuY2VVbml0UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxQZXJzaXN0ZW5jZVVuaXRSZWY+KFBlcnNpc3RlbmNlVW5pdFJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlMpOwogCQl9CiAJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRSZWZzOwogCX0KQEAgLTg3NSw5ICs5NDgsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3N0Q29uc3RydWN0cygpIHsKKwlwdWJsaWMgTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gZ2V0UG9zdENvbnN0cnVjdHMoKSB7CiAJCWlmIChwb3N0Q29uc3RydWN0cyA9PSBudWxsKSB7Ci0JCQlwb3N0Q29uc3RydWN0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QT1NUX0NPTlNUUlVDVFMpOworCQkJcG9zdENvbnN0cnVjdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BPU1RfQ09OU1RSVUNUUyk7CiAJCX0KIAkJcmV0dXJuIHBvc3RDb25zdHJ1Y3RzOwogCX0KQEAgLTg4Nyw5ICs5NjAsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcmVEZXN0cm95cygpIHsKKwlwdWJsaWMgTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gZ2V0UHJlRGVzdHJveXMoKSB7CiAJCWlmIChwcmVEZXN0cm95cyA9PSBudWxsKSB7Ci0JCQlwcmVEZXN0cm95cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QUkVfREVTVFJPWVMpOworCQkJcHJlRGVzdHJveXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BSRV9ERVNUUk9ZUyk7CiAJCX0KIAkJcmV0dXJuIHByZURlc3Ryb3lzOwogCX0KQEAgLTg5OSw2ICs5NzIsMzAgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIExpc3Q8RGF0YVNvdXJjZVR5cGU+IGdldERhdGFTb3VyY2UoKSB7CisJCWlmIChkYXRhU291cmNlID09IG51bGwpIHsKKwkJCWRhdGFTb3VyY2UgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGF0YVNvdXJjZVR5cGU+KERhdGFTb3VyY2VUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0RBVEFfU09VUkNFKTsKKwkJfQorCQlyZXR1cm4gZGF0YVNvdXJjZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxTZWN1cml0eVJvbGVSZWY+IGdldFNlY3VyaXR5Um9sZVJlZigpIHsKKwkJaWYgKHNlY3VyaXR5Um9sZVJlZiA9PSBudWxsKSB7CisJCQlzZWN1cml0eVJvbGVSZWYgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U2VjdXJpdHlSb2xlUmVmPihTZWN1cml0eVJvbGVSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUYpOworCQl9CisJCXJldHVybiBzZWN1cml0eVJvbGVSZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIFNlY3VyaXR5SWRlbnRpdHlUeXBlIGdldFNlY3VyaXR5SWRlbnRpdHkoKSB7CiAJCXJldHVybiBzZWN1cml0eUlkZW50aXR5OwogCX0KQEAgLTk2Myw0MiArMTA2MCw1MSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVPVVRfTUVUSE9EOgogCQkJCXJldHVybiBiYXNpY1NldFRpbWVvdXRNZXRob2QobnVsbCwgbXNncyk7CisJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRVI6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUaW1lcigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQUNUSVZBVElPTl9DT05GSUc6CiAJCQkJcmV0dXJuIGJhc2ljU2V0QWN0aXZhdGlvbkNvbmZpZyhudWxsLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19BUk9VTkRfSU5WT0tFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFyb3VuZEludm9rZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXJvdW5kSW52b2tlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX1RJTUVPVVRTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXJvdW5kVGltZW91dHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW52RW50cmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRFbnZFbnRyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RWpiUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJMb2NhbFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RWpiTG9jYWxSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UG9zdENvbnN0cnVjdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UG9zdENvbnN0cnVjdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZURlc3Ryb3lzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByZURlc3Ryb3lzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19EQVRBX1NPVVJDRToKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERhdGFTb3VyY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VjdXJpdHlSb2xlUmVmKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9JREVOVElUWToKIAkJCQlyZXR1cm4gYmFzaWNTZXRTZWN1cml0eUlkZW50aXR5KG51bGwsIG1zZ3MpOwogCQl9CkBAIC0xMDEwLDYgKzExMTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fREVTQ1JJUFRJT05TOgpAQCAtMTAyOCw2ICsxMTM1LDggQEAKIAkJCQlyZXR1cm4gZ2V0TWVzc2FnaW5nVHlwZSgpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVPVVRfTUVUSE9EOgogCQkJCXJldHVybiBnZXRUaW1lb3V0TWV0aG9kKCk7CisJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRVI6CisJCQkJcmV0dXJuIGdldFRpbWVyKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRToKIAkJCQlyZXR1cm4gZ2V0VHJhbnNhY3Rpb25UeXBlKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9UWVBFOgpAQCAtMTAzOCw2ICsxMTQ3LDggQEAKIAkJCQlyZXR1cm4gZ2V0QWN0aXZhdGlvbkNvbmZpZygpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FST1VORF9JTlZPS0VTOgogCQkJCXJldHVybiBnZXRBcm91bmRJbnZva2VzKCk7CisJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX1RJTUVPVVRTOgorCQkJCXJldHVybiBnZXRBcm91bmRUaW1lb3V0cygpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VOVl9FTlRSSUVTOgogCQkJCXJldHVybiBnZXRFbnZFbnRyaWVzKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX1JFRlM6CkBAIC0xMDYwLDYgKzExNzEsMTAgQEAKIAkJCQlyZXR1cm4gZ2V0UG9zdENvbnN0cnVjdHMoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QUkVfREVTVFJPWVM6CiAJCQkJcmV0dXJuIGdldFByZURlc3Ryb3lzKCk7CisJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuIGdldERhdGFTb3VyY2UoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9ST0xFX1JFRjoKKwkJCQlyZXR1cm4gZ2V0U2VjdXJpdHlSb2xlUmVmKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VDVVJJVFlfSURFTlRJVFk6CiAJCQkJcmV0dXJuIGdldFNlY3VyaXR5SWRlbnRpdHkoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19JRDoKQEAgLTEwNzMsMTkgKzExODgsMjEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRElTUExBWV9OQU1FUzoKIAkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaXNwbGF5TmFtZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19JQ09OUzoKIAkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJY29uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9OQU1FOgogCQkJCXNldEVqYk5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0xMTAyLDYgKzEyMTksMTAgQEAKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19USU1FT1VUX01FVEhPRDoKIAkJCQlzZXRUaW1lb3V0TWV0aG9kKChOYW1lZE1ldGhvZFR5cGUpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19USU1FUjoKKwkJCQlnZXRUaW1lcigpLmNsZWFyKCk7CisJCQkJZ2V0VGltZXIoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFRpbWVyVHlwZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFOgogCQkJCXNldFRyYW5zYWN0aW9uVHlwZSgoVHJhbnNhY3Rpb25UeXBlKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CkBAIC0xMTE2LDUxICsxMjM3LDYzIEBACiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FST1VORF9JTlZPS0VTOgogCQkJCWdldEFyb3VuZEludm9rZXMoKS5jbGVhcigpOwotCQkJCWdldEFyb3VuZEludm9rZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEFyb3VuZEludm9rZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEFyb3VuZEludm9rZVR5cGU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX1RJTUVPVVRTOgorCQkJCWdldEFyb3VuZFRpbWVvdXRzKCkuY2xlYXIoKTsKKwkJCQlnZXRBcm91bmRUaW1lb3V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQXJvdW5kVGltZW91dFR5cGU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRU5WX0VOVFJJRVM6CiAJCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RW52RW50cmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RW52RW50cmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRW52RW50cnk+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fRUpCX1JFRlM6CiAJCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RWpiUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRWpiUmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9MT0NBTF9SRUZTOgogCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RWpiTG9jYWxSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRFamJMb2NhbFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEVqYkxvY2FsUmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFUlZJQ0VfUkVGUzoKIAkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFNlcnZpY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZXJ2aWNlUmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX1JFRlM6CiAJCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUmVzb3VyY2VSZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM6CiAJCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFJlc291cmNlRW52UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUmVzb3VyY2VFbnZSZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgogCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1lc3NhZ2VEZXN0aW5hdGlvblJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6CiAJCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGVyc2lzdGVuY2VDb250ZXh0UmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKIAkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRSZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUE9TVF9DT05TVFJVQ1RTOgogCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIExpZmVjeWNsZUNhbGxiYWNrPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BSRV9ERVNUUk9ZUzoKIAkJCQlnZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJlRGVzdHJveXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFByZURlc3Ryb3lzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBMaWZlY3ljbGVDYWxsYmFjaz4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19EQVRBX1NPVVJDRToKKwkJCQlnZXREYXRhU291cmNlKCkuY2xlYXIoKTsKKwkJCQlnZXREYXRhU291cmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEYXRhU291cmNlVHlwZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9ST0xFX1JFRjoKKwkJCQlnZXRTZWN1cml0eVJvbGVSZWYoKS5jbGVhcigpOworCQkJCWdldFNlY3VyaXR5Um9sZVJlZigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VjdXJpdHlSb2xlUmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgogCQkJCXNldFNlY3VyaXR5SWRlbnRpdHkoKFNlY3VyaXR5SWRlbnRpdHlUeXBlKW5ld1ZhbHVlKTsKQEAgLTExNzcsNiArMTMxMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fREVTQ1JJUFRJT05TOgpAQCAtMTIwMyw2ICsxMzM3LDkgQEAKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19USU1FT1VUX01FVEhPRDoKIAkJCQlzZXRUaW1lb3V0TWV0aG9kKChOYW1lZE1ldGhvZFR5cGUpbnVsbCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVSOgorCQkJCWdldFRpbWVyKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRToKIAkJCQl1bnNldFRyYW5zYWN0aW9uVHlwZSgpOwogCQkJCXJldHVybjsKQEAgLTEyMTgsNiArMTM1NSw5IEBACiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX0lOVk9LRVM6CiAJCQkJZ2V0QXJvdW5kSW52b2tlcygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0FST1VORF9USU1FT1VUUzoKKwkJCQlnZXRBcm91bmRUaW1lb3V0cygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0VOVl9FTlRSSUVTOgogCQkJCWdldEVudkVudHJpZXMoKS5jbGVhcigpOwogCQkJCXJldHVybjsKQEAgLTEyNTEsNiArMTM5MSwxMiBAQAogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1BSRV9ERVNUUk9ZUzoKIAkJCQlnZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0RBVEFfU09VUkNFOgorCQkJCWdldERhdGFTb3VyY2UoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9ST0xFX1JFRjoKKwkJCQlnZXRTZWN1cml0eVJvbGVSZWYoKS5jbGVhcigpOworCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19TRUNVUklUWV9JREVOVElUWToKIAkJCQlzZXRTZWN1cml0eUlkZW50aXR5KChTZWN1cml0eUlkZW50aXR5VHlwZSludWxsKTsKIAkJCQlyZXR1cm47CkBAIC0xMjY2LDYgKzE0MTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX0RFU0NSSVBUSU9OUzoKQEAgLTEyODQsNiArMTQzMSw4IEBACiAJCQkJcmV0dXJuIE1FU1NBR0lOR19UWVBFX0VERUZBVUxUID09IG51bGwgPyBtZXNzYWdpbmdUeXBlICE9IG51bGwgOiAhTUVTU0FHSU5HX1RZUEVfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2luZ1R5cGUpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVPVVRfTUVUSE9EOgogCQkJCXJldHVybiB0aW1lb3V0TWV0aG9kICE9IG51bGw7CisJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRVI6CisJCQkJcmV0dXJuIHRpbWVyICE9IG51bGwgJiYgIXRpbWVyLmlzRW1wdHkoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFOgogCQkJCXJldHVybiBpc1NldFRyYW5zYWN0aW9uVHlwZSgpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fVFlQRToKQEAgLTEyOTQsNiArMTQ0Myw4IEBACiAJCQkJcmV0dXJuIGFjdGl2YXRpb25Db25maWcgIT0gbnVsbDsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19BUk9VTkRfSU5WT0tFUzoKIAkJCQlyZXR1cm4gYXJvdW5kSW52b2tlcyAhPSBudWxsICYmICFhcm91bmRJbnZva2VzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19BUk9VTkRfVElNRU9VVFM6CisJCQkJcmV0dXJuIGFyb3VuZFRpbWVvdXRzICE9IG51bGwgJiYgIWFyb3VuZFRpbWVvdXRzLmlzRW1wdHkoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FTlZfRU5UUklFUzoKIAkJCQlyZXR1cm4gZW52RW50cmllcyAhPSBudWxsICYmICFlbnZFbnRyaWVzLmlzRW1wdHkoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfUkVGUzoKQEAgLTEzMTYsNiArMTQ2NywxMCBAQAogCQkJCXJldHVybiBwb3N0Q29uc3RydWN0cyAhPSBudWxsICYmICFwb3N0Q29uc3RydWN0cy5pc0VtcHR5KCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fUFJFX0RFU1RST1lTOgogCQkJCXJldHVybiBwcmVEZXN0cm95cyAhPSBudWxsICYmICFwcmVEZXN0cm95cy5pc0VtcHR5KCk7CisJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuIGRhdGFTb3VyY2UgIT0gbnVsbCAmJiAhZGF0YVNvdXJjZS5pc0VtcHR5KCk7CisJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUY6CisJCQkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZiAhPSBudWxsICYmICFzZWN1cml0eVJvbGVSZWYuaXNFbXB0eSgpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZOgogCQkJCXJldHVybiBzZWN1cml0eUlkZW50aXR5ICE9IG51bGw7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fQkVBTl9fSUQ6CkBAIC0xMzI5LDYgKzE0ODQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kUGFyYW1zSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RQYXJhbXNJbXBsLmphdmEKaW5kZXggNzQ1OWZlYS4uMjYwMDI1ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RQYXJhbXNJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RQYXJhbXNJbXBsLmphdmEKQEAgLTUxLDcgKzUxLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWV0aG9kUGFyYW1zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBtZXRob2RQYXJhbXM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTg3LDYgKzg3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQVJBTVM7CiAJfQpAQCAtOTYsOSArOTcsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RQYXJhbXMoKSB7CisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRNZXRob2RQYXJhbXMoKSB7CiAJCWlmIChtZXRob2RQYXJhbXMgPT0gbnVsbCkgewotCQkJbWV0aG9kUGFyYW1zID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVRIT0RfUEFSQU1TX19NRVRIT0RfUEFSQU1TKTsKKwkJCW1ldGhvZFBhcmFtcyA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVRIT0RfUEFSQU1TX19NRVRIT0RfUEFSQU1TKTsKIAkJfQogCQlyZXR1cm4gbWV0aG9kUGFyYW1zOwogCX0KQEAgLTEyOSw2ICsxMzAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNU19fTUVUSE9EX1BBUkFNUzoKQEAgLTE0NCwxMSArMTQ2LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNU19fTUVUSE9EX1BBUkFNUzoKIAkJCQlnZXRNZXRob2RQYXJhbXMoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0TWV0aG9kUGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNU19fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0xNjIsNiArMTY2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEFSQU1TX19NRVRIT0RfUEFSQU1TOgpAQCAtMTc5LDYgKzE4NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BBUkFNU19fTUVUSE9EX1BBUkFNUzoKQEAgLTE5NCw2ICsyMDAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kUGVybWlzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kUGVybWlzc2lvbkltcGwuamF2YQppbmRleCAwY2E2N2FmLi45ZTk2ZWNjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFBlcm1pc3Npb25JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RQZXJtaXNzaW9uSW1wbC5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTmFtZXMoKSA8ZW0+Um9sZSBOYW1lczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCkBAIC03Miw3ICs3Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHJvbGVOYW1lcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gcm9sZU5hbWVzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5jaGVja2VkKCkgPGVtPlVuY2hlY2tlZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtODIsNyArODIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFbXB0eVR5cGUgdW5jaGVja2VkID0gbnVsbDsKKwlwcm90ZWN0ZWQgRW1wdHlUeXBlIHVuY2hlY2tlZDsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZHMoKSA8ZW0+TWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC05Miw3ICs5Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IG1ldGhvZHMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxNZXRob2RUeXBlPiBtZXRob2RzOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMjgsNiArMTI4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QRVJNSVNTSU9OOwogCX0KQEAgLTEzNyw5ICsxMzgsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMTQ5LDkgKzE1MCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFJvbGVOYW1lcygpIHsKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJvbGVOYW1lcygpIHsKIAkJaWYgKHJvbGVOYW1lcyA9PSBudWxsKSB7Ci0JCQlyb2xlTmFtZXMgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ST0xFX05BTUVTKTsKKwkJCXJvbGVOYW1lcyA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fUk9MRV9OQU1FUyk7CiAJCX0KIAkJcmV0dXJuIHJvbGVOYW1lczsKIAl9CkBAIC0yMDQsOSArMjA1LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0TWV0aG9kcygpIHsKKwlwdWJsaWMgTGlzdDxNZXRob2RUeXBlPiBnZXRNZXRob2RzKCkgewogCQlpZiAobWV0aG9kcyA9PSBudWxsKSB7Ci0JCQltZXRob2RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1ldGhvZFR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRFMpOworCQkJbWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxNZXRob2RUeXBlPihNZXRob2RUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RTKTsKIAkJfQogCQlyZXR1cm4gbWV0aG9kczsKIAl9CkBAIC0yMzcsMTQgKzIzOCwxNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19VTkNIRUNLRUQ6CiAJCQkJcmV0dXJuIGJhc2ljU2V0VW5jaGVja2VkKG51bGwsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19NRVRIT0RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWV0aG9kcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtMjU0LDYgKzI1Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgpAQCAtMjc1LDIyICsyNzgsMjQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ST0xFX05BTUVTOgogCQkJCWdldFJvbGVOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9sZU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRSb2xlTmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fVU5DSEVDS0VEOgogCQkJCXNldFVuY2hlY2tlZCgoRW1wdHlUeXBlKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX01FVEhPRFM6CiAJCQkJZ2V0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0TWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kVHlwZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0zMDQsNiArMzA5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgpAQCAtMzMwLDYgKzMzNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OUzoKQEAgLTM1MSw2ICszNTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kVHlwZUltcGwuamF2YQppbmRleCAwZjg3YThiLi4wYzVmZTRiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFR5cGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RUeXBlSW1wbC5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTmFtZSgpIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTExLDcgKzExMSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0aG9kSW50ZkVTZXQgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRob2RJbnRmRVNldDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2ROYW1lKCkgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNDEsNyArMTQxLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kUGFyYW1zIG1ldGhvZFBhcmFtcyA9IG51bGw7CisJcHJvdGVjdGVkIE1ldGhvZFBhcmFtcyBtZXRob2RQYXJhbXM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTE3Nyw2ICsxNzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1RZUEU7CiAJfQpAQCAtMTg2LDkgKzE4Nyw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fREVTQ1JJUFRJT05TKTsKKwkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0RFU0NSSVBUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIGRlc2NyaXB0aW9uczsKIAl9CkBAIC0zNTAsMTAgKzM1MSwxMSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TOgogCQkJCXJldHVybiBiYXNpY1NldE1ldGhvZFBhcmFtcyhudWxsLCBtc2dzKTsKIAkJfQpAQCAtMzY1LDYgKzM2Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fREVTQ1JJUFRJT05TOgpAQCAtMzg4LDExICszOTEsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFlQRV9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19FSkJfTkFNRToKIAkJCQlzZXRFamJOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtNDE4LDYgKzQyMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEVfX0RFU0NSSVBUSU9OUzoKQEAgLTQ0Nyw2ICs0NTMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UWVBFX19ERVNDUklQVElPTlM6CkBAIC00NzAsNiArNDc3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL05hbWVkTWV0aG9kVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTmFtZWRNZXRob2RUeXBlSW1wbC5qYXZhCmluZGV4IDNjNWU1NjQuLjFiZDUyMGYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTmFtZWRNZXRob2RUeXBlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvTmFtZWRNZXRob2RUeXBlSW1wbC5qYXZhCkBAIC02OCw3ICs2OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIE1ldGhvZFBhcmFtcyBtZXRob2RQYXJhbXMgPSBudWxsOworCXByb3RlY3RlZCBNZXRob2RQYXJhbXMgbWV0aG9kUGFyYW1zOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMDQsNiArMTA0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX01FVEhPRF9UWVBFOwogCX0KQEAgLTE5OCw2ICsxOTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTkFNRURfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVM6CkBAIC0yMTEsNiArMjEzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfTkFNRToKQEAgLTIyOCw2ICsyMzEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfTkFNRToKQEAgLTI0OCw2ICsyNTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfTkFNRToKQEAgLTI2OCw2ICsyNzMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk5BTUVEX01FVEhPRF9UWVBFX19NRVRIT0RfTkFNRToKQEAgLTI4NSw2ICsyOTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUXVlcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5SW1wbC5qYXZhCmluZGV4IDNiNmM5NGQuLmIzZDQ1ZTQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUXVlcnlJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9RdWVyeUltcGwuamF2YQpAQCAtNTMsNyArNTMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG51bGw7CisJcHJvdGVjdGVkIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UXVlcnlNZXRob2QoKSA8ZW0+UXVlcnkgTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC02Myw3ICs2Myw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIFF1ZXJ5TWV0aG9kIHF1ZXJ5TWV0aG9kID0gbnVsbDsKKwlwcm90ZWN0ZWQgUXVlcnlNZXRob2QgcXVlcnlNZXRob2Q7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzdWx0VHlwZU1hcHBpbmcoKSA8ZW0+UmVzdWx0IFR5cGUgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgpAQCAtOTIsNyArOTIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlc3VsdFR5cGVNYXBwaW5nRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHJlc3VsdFR5cGVNYXBwaW5nRVNldDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJRbCgpIDxlbT5FamIgUWw8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTE0OCw2ICsxNDgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuUVVFUlk7CiAJfQpAQCAtMzMxLDYgKzMzMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046CkBAIC0zNDYsNiArMzQ4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTjoKQEAgLTM2Nyw2ICszNzAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTjoKQEAgLTM5Myw2ICszOTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTjoKQEAgLTQxOSw2ICs0MjQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX19ERVNDUklQVElPTjoKQEAgLTQ0MCw2ICs0NDYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUXVlcnlNZXRob2RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5TWV0aG9kSW1wbC5qYXZhCmluZGV4IDVjMjk4N2QuLmU3MzhiMDMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUXVlcnlNZXRob2RJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9RdWVyeU1ldGhvZEltcGwuamF2YQpAQCAtNjgsNyArNjgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBNZXRob2RQYXJhbXMgbWV0aG9kUGFyYW1zID0gbnVsbDsKKwlwcm90ZWN0ZWQgTWV0aG9kUGFyYW1zIG1ldGhvZFBhcmFtczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTA0LDYgKzEwNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5RVUVSWV9NRVRIT0Q7CiAJfQpAQCAtMTk4LDYgKzE5OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX01FVEhPRF9QQVJBTVM6CkBAIC0yMTEsNiArMjEzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTUVUSE9EX05BTUU6CkBAIC0yMjgsNiArMjMxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX01FVEhPRF9OQU1FOgpAQCAtMjQ4LDYgKzI1Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19NRVRIT0RfTkFNRToKQEAgLTI2OCw2ICsyNzMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fTUVUSE9EX05BTUU6CkBAIC0yODUsNiArMjkxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9SZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZUltcGwuamF2YQppbmRleCA0YWU4ZjU5Li4xYTExMzBkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVJbXBsLmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFamJOYW1lKCkgPGVtPkVqYiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMTMsNiArMTEzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFOwogCX0KQEAgLTEyMiw5ICsxMjMsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMTc2LDEwICsxNzcsMTEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtMTg5LDYgKzE5MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fREVTQ1JJUFRJT05TOgpAQCAtMjA2LDExICsyMDksMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBfUk9MRV9TT1VSQ0VfVFlQRV9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19FSkJfTkFNRToKIAkJCQlzZXRFamJOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtMjI3LDYgKzIzMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQX1JPTEVfU09VUkNFX1RZUEVfX0RFU0NSSVBUSU9OUzoKQEAgLTI0Nyw2ICsyNTMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFX19ERVNDUklQVElPTlM6CkBAIC0yNjQsNiArMjcxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcHNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcHNJbXBsLmphdmEKaW5kZXggMTFjNWQ3OC4uNjVhYzE3OCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9SZWxhdGlvbnNoaXBzSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwc0ltcGwuamF2YQpAQCAtNTgsNyArNTgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb25zOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVsYXRpb25zKCkgPGVtPkVqYiBSZWxhdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNjgsNyArNjgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlamJSZWxhdGlvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxFSkJSZWxhdGlvbj4gZWpiUmVsYXRpb25zOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMDQsNiArMTA0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLlJFTEFUSU9OU0hJUFM7CiAJfQpAQCAtMTEzLDkgKzExNCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMTI1LDkgKzEyNiw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEVqYlJlbGF0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxFSkJSZWxhdGlvbj4gZ2V0RWpiUmVsYXRpb25zKCkgewogCQlpZiAoZWpiUmVsYXRpb25zID09IG51bGwpIHsKLQkJCWVqYlJlbGF0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFSkJSZWxhdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfUkVMQVRJT05TKTsKKwkJCWVqYlJlbGF0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxFSkJSZWxhdGlvbj4oRUpCUmVsYXRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIGVqYlJlbGF0aW9uczsKIAl9CkBAIC0xNTgsMTIgKzE1OSwxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX1JFTEFUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYlJlbGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRFamJSZWxhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC0xNzMsNiArMTc1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OUzoKQEAgLTE5MCwxNSArMTkzLDE3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9SRUxBVElPTlM6CiAJCQkJZ2V0RWpiUmVsYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJSZWxhdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEVqYlJlbGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRUpCUmVsYXRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0yMTIsNiArMjE3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlM6CkBAIC0yMzIsNiArMjM4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTlM6CkBAIC0yNDksNiArMjU2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbW92ZU1ldGhvZFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbW92ZU1ldGhvZFR5cGVJbXBsLmphdmEKaW5kZXggMjQ4MDI5Zi4uMjRjNmZmMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9SZW1vdmVNZXRob2RUeXBlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvUmVtb3ZlTWV0aG9kVHlwZUltcGwuamF2YQpAQCAtNDgsNyArNDgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBOYW1lZE1ldGhvZFR5cGUgYmVhbk1ldGhvZCA9IG51bGw7CisJcHJvdGVjdGVkIE5hbWVkTWV0aG9kVHlwZSBiZWFuTWV0aG9kOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmV0YWluSWZFeGNlcHRpb24oKSA8ZW0+UmV0YWluIElmIEV4Y2VwdGlvbjwvZW0+fScgYXR0cmlidXRlLgpAQCAtNzcsNyArNzcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbklmRXhjZXB0aW9uRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHJldGFpbklmRXhjZXB0aW9uRVNldDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTEzLDYgKzExMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5SRU1PVkVfTUVUSE9EX1RZUEU7CiAJfQpAQCAtMjMyLDYgKzIzMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX0JFQU5fTUVUSE9EOgpAQCAtMjQ1LDEyICsyNDcsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0Q6CiAJCQkJcmV0dXJuIGdldEJlYW5NZXRob2QoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX1JFVEFJTl9JRl9FWENFUFRJT046Ci0JCQkJcmV0dXJuIGlzUmV0YWluSWZFeGNlcHRpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisJCQkJcmV0dXJuIGlzUmV0YWluSWZFeGNlcHRpb24oKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX0lEOgogCQkJCXJldHVybiBnZXRJZCgpOwogCQl9CkBAIC0yNjIsMTMgKzI2NSwxNCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0Q6CiAJCQkJc2V0QmVhbk1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19SRVRBSU5fSUZfRVhDRVBUSU9OOgotCQkJCXNldFJldGFpbklmRXhjZXB0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOworCQkJCXNldFJldGFpbklmRXhjZXB0aW9uKChCb29sZWFuKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuUkVNT1ZFX01FVEhPRF9UWVBFX19JRDoKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTI4Miw2ICsyODYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlJFTU9WRV9NRVRIT0RfVFlQRV9fQkVBTl9NRVRIT0Q6CkBAIC0zMDIsNiArMzA3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEVfX0JFQU5fTUVUSE9EOgpAQCAtMzE5LDYgKzMyNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9TZWN1cml0eUlkZW50aXR5VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvU2VjdXJpdHlJZGVudGl0eVR5cGVJbXBsLmphdmEKaW5kZXggMTFkMjBlZC4uNzI0ODViNCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9TZWN1cml0eUlkZW50aXR5VHlwZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5SWRlbnRpdHlUeXBlSW1wbC5qYXZhCkBAIC02MCw3ICs2MCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2VDYWxsZXJJZGVudGl0eSgpIDxlbT5Vc2UgQ2FsbGVyIElkZW50aXR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC03MCw3ICs3MCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVtcHR5VHlwZSB1c2VDYWxsZXJJZGVudGl0eSA9IG51bGw7CisJcHJvdGVjdGVkIEVtcHR5VHlwZSB1c2VDYWxsZXJJZGVudGl0eTsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJ1bkFzKCkgPGVtPlJ1biBBczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtODAsNyArODAsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBSdW5BcyBydW5BcyA9IG51bGw7CisJcHJvdGVjdGVkIFJ1bkFzIHJ1bkFzOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMTYsNiArMTE2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLlNFQ1VSSVRZX0lERU5USVRZX1RZUEU7CiAJfQpAQCAtMTI1LDkgKzEyNiw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMjQ0LDEwICsyNDUsMTEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX1VTRV9DQUxMRVJfSURFTlRJVFk6CiAJCQkJcmV0dXJuIGJhc2ljU2V0VXNlQ2FsbGVySWRlbnRpdHkobnVsbCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fUlVOX0FTOgpAQCAtMjYxLDYgKzI2Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19ERVNDUklQVElPTlM6CkBAIC0yODAsMTEgKzI4MywxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlNFQ1VSSVRZX0lERU5USVRZX1RZUEVfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFX19VU0VfQ0FMTEVSX0lERU5USVRZOgogCQkJCXNldFVzZUNhbGxlcklkZW50aXR5KChFbXB0eVR5cGUpbmV3VmFsdWUpOwpAQCAtMzA0LDYgKzMwOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fREVTQ1JJUFRJT05TOgpAQCAtMzI3LDYgKzMzMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfVFlQRV9fREVTQ1JJUFRJT05TOgpAQCAtMzQ2LDYgKzM1Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9TZXNzaW9uQmVhbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvU2Vzc2lvbkJlYW5JbXBsLmphdmEKaW5kZXggOWMyNDBkNy4uNzlmNTc2NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9TZXNzaW9uQmVhbkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25CZWFuSW1wbC5qYXZhCkBAIC0yOCwxMCArMjgsMTIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrOwpAQCAtNDQsMTIgKzQ2LDE5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWY7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRJbnZva2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZFRpbWVvdXRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzeW5jTWV0aG9kVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TWV0aG9kVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5EZXBlbmRzT25UeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkluaXRNZXRob2RUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5SZW1vdmVNZXRob2RUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlY3VyaXR5SWRlbnRpdHlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlN0YXRlZnVsVGltZW91dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uVHlwZTsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7CkBAIC03MiwxNCArODEsMjYgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRMb2NhbCA8ZW0+TG9jYWw8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEJ1c2luZXNzTG9jYWxzIDxlbT5CdXNpbmVzcyBMb2NhbHM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEJ1c2luZXNzUmVtb3RlcyA8ZW0+QnVzaW5lc3MgUmVtb3RlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0TG9jYWxCZWFuIDxlbT5Mb2NhbCBCZWFuPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRTZXJ2aWNlRW5kcG9pbnQgPGVtPlNlcnZpY2UgRW5kcG9pbnQ8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEVqYkNsYXNzIDxlbT5FamIgQ2xhc3M8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFNlc3Npb25UeXBlIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFN0YXRlZnVsVGltZW91dCA8ZW0+U3RhdGVmdWwgVGltZW91dDwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0VGltZW91dE1ldGhvZCA8ZW0+VGltZW91dCBNZXRob2Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFRpbWVyIDxlbT5UaW1lcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjaXNJbml0T25TdGFydHVwIDxlbT5Jbml0IE9uIFN0YXJ0dXA8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUgPGVtPkNvbmN1cnJlbmN5IE1hbmFnZW1lbnQgVHlwZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0Q29uY3VycmVudE1ldGhvZCA8ZW0+Q29uY3VycmVudCBNZXRob2Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldERlcGVuZHNPbiA8ZW0+RGVwZW5kcyBPbjwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0SW5pdE1ldGhvZHMgPGVtPkluaXQgTWV0aG9kczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0UmVtb3ZlTWV0aG9kcyA8ZW0+UmVtb3ZlIE1ldGhvZHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEFzeW5jTWV0aG9kIDxlbT5Bc3luYyBNZXRob2Q8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0QWZ0ZXJCZWdpbk1ldGhvZCA8ZW0+QWZ0ZXIgQmVnaW4gTWV0aG9kPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRCZWZvcmVDb21wbGV0aW9uTWV0aG9kIDxlbT5CZWZvcmUgQ29tcGxldGlvbiBNZXRob2Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEFmdGVyQ29tcGxldGlvbk1ldGhvZCA8ZW0+QWZ0ZXIgQ29tcGxldGlvbiBNZXRob2Q8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEFyb3VuZEludm9rZXMgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRBcm91bmRUaW1lb3V0cyA8ZW0+QXJvdW5kIFRpbWVvdXRzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRFbnZFbnRyaWVzIDxlbT5FbnYgRW50cmllczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldEVqYkxvY2FsUmVmcyA8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPn08L2xpPgpAQCAtOTEsNiArMTEyLDcgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldERhdGFTb3VyY2UgPGVtPkRhdGEgU291cmNlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25CZWFuSW1wbCNnZXRQb3N0QWN0aXZhdGVzIDxlbT5Qb3N0IEFjdGl2YXRlczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQmVhbkltcGwjZ2V0UHJlUGFzc2l2YXRlcyA8ZW0+UHJlIFBhc3NpdmF0ZXM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU2Vzc2lvbkJlYW5JbXBsI2dldFNlY3VyaXR5Um9sZVJlZnMgPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+fTwvbGk+CkBAIC0xMTAsNyArMTMyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc3BsYXlOYW1lcygpIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEyMCw3ICsxNDIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxEaXNwbGF5TmFtZT4gZGlzcGxheU5hbWVzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTMwLDcgKzE1Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8SWNvbj4gaWNvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiTmFtZSgpIDxlbT5FamIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMjYwLDcgKzI4Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGJ1c2luZXNzTG9jYWxzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBidXNpbmVzc0xvY2FsczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJ1c2luZXNzUmVtb3RlcygpIDxlbT5CdXNpbmVzcyBSZW1vdGVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KQEAgLTI3MCw3ICsyOTIsMTcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYnVzaW5lc3NSZW1vdGVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBidXNpbmVzc1JlbW90ZXM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhbEJlYW4oKSA8ZW0+TG9jYWwgQmVhbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TG9jYWxCZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRW1wdHlUeXBlIGxvY2FsQmVhbjsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXJ2aWNlRW5kcG9pbnQoKSA8ZW0+U2VydmljZSBFbmRwb2ludDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMzIwLDcgKzM1Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZSBTRVNTSU9OX1RZUEVfRURFRkFVTFQgPSBTZXNzaW9uVHlwZS5TVEFURUZVTF9MSVRFUkFMOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU2Vzc2lvblR5cGUgU0VTU0lPTl9UWVBFX0VERUZBVUxUID0gU2Vzc2lvblR5cGUuU0lOR0xFVE9OX0xJVEVSQUw7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXNzaW9uVHlwZSgpIDxlbT5TZXNzaW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTMzOSw3ICszNzEsMTcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXNzaW9uVHlwZUVTZXQgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzZXNzaW9uVHlwZUVTZXQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGF0ZWZ1bFRpbWVvdXQoKSA8ZW0+U3RhdGVmdWwgVGltZW91dDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3RhdGVmdWxUaW1lb3V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RhdGVmdWxUaW1lb3V0VHlwZSBzdGF0ZWZ1bFRpbWVvdXQ7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lb3V0TWV0aG9kKCkgPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC0zNDksNyArMzkxLDk1IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIE5hbWVkTWV0aG9kVHlwZSB0aW1lb3V0TWV0aG9kID0gbnVsbDsKKwlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlIHRpbWVvdXRNZXRob2Q7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lcigpIDxlbT5UaW1lcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUaW1lcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFRpbWVyVHlwZT4gdGltZXI7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbml0T25TdGFydHVwKCkgPGVtPkluaXQgT24gU3RhcnR1cDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNJbml0T25TdGFydHVwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSU5JVF9PTl9TVEFSVFVQX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0luaXRPblN0YXJ0dXAoKSA8ZW0+SW5pdCBPbiBTdGFydHVwPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0luaXRPblN0YXJ0dXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGluaXRPblN0YXJ0dXAgPSBJTklUX09OX1NUQVJUVVBfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEluaXQgT24gU3RhcnR1cCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaW5pdE9uU3RhcnR1cEVTZXQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSgpIDxlbT5Db25jdXJyZW5jeSBNYW5hZ2VtZW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUgQ09OQ1VSUkVOQ1lfTUFOQUdFTUVOVF9UWVBFX0VERUZBVUxUID0gQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUuQkVBTjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUoKSA8ZW0+Q29uY3VycmVuY3kgTWFuYWdlbWVudCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUgY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSA9IENPTkNVUlJFTkNZX01BTkFHRU1FTlRfVFlQRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29uY3VycmVuY3kgTWFuYWdlbWVudCBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBjb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlRVNldDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmN1cnJlbnRNZXRob2QoKSA8ZW0+Q29uY3VycmVudCBNZXRob2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29uY3VycmVudE1ldGhvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PENvbmN1cnJlbnRNZXRob2RUeXBlPiBjb25jdXJyZW50TWV0aG9kOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVwZW5kc09uKCkgPGVtPkRlcGVuZHMgT248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlcGVuZHNPbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIERlcGVuZHNPblR5cGUgZGVwZW5kc09uOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdE1ldGhvZHMoKSA8ZW0+SW5pdCBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTM1OSw3ICs0ODksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpbml0TWV0aG9kcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEluaXRNZXRob2RUeXBlPiBpbml0TWV0aG9kczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbW92ZU1ldGhvZHMoKSA8ZW0+UmVtb3ZlIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMzY5LDcgKzQ5OSwxNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZW1vdmVNZXRob2RzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8UmVtb3ZlTWV0aG9kVHlwZT4gcmVtb3ZlTWV0aG9kczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzeW5jTWV0aG9kKCkgPGVtPkFzeW5jIE1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBc3luY01ldGhvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PEFzeW5jTWV0aG9kVHlwZT4gYXN5bmNNZXRob2Q7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTM5OCw3ICs1MzgsMzcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc2FjdGlvblR5cGVFU2V0ID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNhY3Rpb25UeXBlRVNldDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFmdGVyQmVnaW5NZXRob2QoKSA8ZW0+QWZ0ZXIgQmVnaW4gTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBZnRlckJlZ2luTWV0aG9kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTmFtZWRNZXRob2RUeXBlIGFmdGVyQmVnaW5NZXRob2Q7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCZWZvcmVDb21wbGV0aW9uTWV0aG9kKCkgPGVtPkJlZm9yZSBDb21wbGV0aW9uIE1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QmVmb3JlQ29tcGxldGlvbk1ldGhvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIE5hbWVkTWV0aG9kVHlwZSBiZWZvcmVDb21wbGV0aW9uTWV0aG9kOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWZ0ZXJDb21wbGV0aW9uTWV0aG9kKCkgPGVtPkFmdGVyIENvbXBsZXRpb24gTWV0aG9kPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBZnRlckNvbXBsZXRpb25NZXRob2QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBOYW1lZE1ldGhvZFR5cGUgYWZ0ZXJDb21wbGV0aW9uTWV0aG9kOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJvdW5kSW52b2tlcygpIDxlbT5Bcm91bmQgSW52b2tlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC00MDgsNyArNTc4LDE3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGFyb3VuZEludm9rZXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxBcm91bmRJbnZva2VUeXBlPiBhcm91bmRJbnZva2VzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXJvdW5kVGltZW91dHMoKSA8ZW0+QXJvdW5kIFRpbWVvdXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFyb3VuZFRpbWVvdXRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8QXJvdW5kVGltZW91dFR5cGU+IGFyb3VuZFRpbWVvdXRzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW52RW50cmllcygpIDxlbT5FbnYgRW50cmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC00MTgsNyArNTk4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW52RW50cmllcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEVudkVudHJ5PiBlbnZFbnRyaWVzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWpiUmVmcygpIDxlbT5FamIgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC00MjgsNyArNjA4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWpiUmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEVqYlJlZj4gZWpiUmVmczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVqYkxvY2FsUmVmcygpIDxlbT5FamIgTG9jYWwgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC00MzgsNyArNjE4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZWpiTG9jYWxSZWZzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RWpiTG9jYWxSZWY+IGVqYkxvY2FsUmVmczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZpY2VSZWZzKCkgPGVtPlNlcnZpY2UgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC00NDgsNyArNjI4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VydmljZVJlZnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxTZXJ2aWNlUmVmPiBzZXJ2aWNlUmVmczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlUmVmcygpIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQ1OCw3ICs2MzgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZVJlZnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxSZXNvdXJjZVJlZj4gcmVzb3VyY2VSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VFbnZSZWZzKCkgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQ2OCw3ICs2NDgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZUVudlJlZnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxSZXNvdXJjZUVudlJlZj4gcmVzb3VyY2VFbnZSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNDc4LDcgKzY1OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IG1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxNZXNzYWdlRGVzdGluYXRpb25SZWY+IG1lc3NhZ2VEZXN0aW5hdGlvblJlZnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC00ODgsNyArNjY4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgcGVyc2lzdGVuY2VDb250ZXh0UmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFBlcnNpc3RlbmNlQ29udGV4dFJlZj4gcGVyc2lzdGVuY2VDb250ZXh0UmVmczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQ5OCw3ICs2NzgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwZXJzaXN0ZW5jZVVuaXRSZWZzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8UGVyc2lzdGVuY2VVbml0UmVmPiBwZXJzaXN0ZW5jZVVuaXRSZWZzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdENvbnN0cnVjdHMoKSA8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTUwOCw3ICs2ODgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwb3N0Q29uc3RydWN0cyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PExpZmVjeWNsZUNhbGxiYWNrPiBwb3N0Q29uc3RydWN0czsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZURlc3Ryb3lzKCkgPGVtPlByZSBEZXN0cm95czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC01MTgsNyArNjk4LDE3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHByZURlc3Ryb3lzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IHByZURlc3Ryb3lzOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YVNvdXJjZSgpIDxlbT5EYXRhIFNvdXJjZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREYXRhU291cmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8RGF0YVNvdXJjZVR5cGU+IGRhdGFTb3VyY2U7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0QWN0aXZhdGVzKCkgPGVtPlBvc3QgQWN0aXZhdGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTUyOCw3ICs3MTgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwb3N0QWN0aXZhdGVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IHBvc3RBY3RpdmF0ZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVQYXNzaXZhdGVzKCkgPGVtPlByZSBQYXNzaXZhdGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTUzOCw3ICs3MjgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBwcmVQYXNzaXZhdGVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IHByZVBhc3NpdmF0ZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN1cml0eVJvbGVSZWZzKCkgPGVtPlNlY3VyaXR5IFJvbGUgUmVmczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC01NDgsNyArNzM4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlSb2xlUmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFNlY3VyaXR5Um9sZVJlZj4gc2VjdXJpdHlSb2xlUmVmczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3VyaXR5SWRlbnRpdGllcygpIDxlbT5TZWN1cml0eSBJZGVudGl0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC01NTgsNyArNzQ4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlJZGVudGl0eVR5cGUgc2VjdXJpdHlJZGVudGl0aWVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgU2VjdXJpdHlJZGVudGl0eVR5cGUgc2VjdXJpdHlJZGVudGl0aWVzOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC01OTQsNiArNzg0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLlNFU1NJT05fQkVBTjsKIAl9CkBAIC02MDMsOSArNzk0LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgeworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CiAJCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fREVTQ1JJUFRJT05TKTsKKwkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtNjE1LDkgKzgwNiw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKKwlwdWJsaWMgTGlzdDxEaXNwbGF5TmFtZT4gZ2V0RGlzcGxheU5hbWVzKCkgewogCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RJU1BMQVlfTkFNRVMpOworCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERpc3BsYXlOYW1lPihEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RJU1BMQVlfTkFNRVMpOwogCQl9CiAJCXJldHVybiBkaXNwbGF5TmFtZXM7CiAJfQpAQCAtNjI3LDkgKzgxOCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgeworCXB1YmxpYyBMaXN0PEljb24+IGdldEljb25zKCkgewogCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lDT05TKTsKKwkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEljb24+KEljb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JQ09OUyk7CiAJCX0KIAkJcmV0dXJuIGljb25zOwogCX0KQEAgLTc2NSw5ICs5NTYsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRCdXNpbmVzc0xvY2FscygpIHsKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEJ1c2luZXNzTG9jYWxzKCkgewogCQlpZiAoYnVzaW5lc3NMb2NhbHMgPT0gbnVsbCkgewotCQkJYnVzaW5lc3NMb2NhbHMgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQlVTSU5FU1NfTE9DQUxTKTsKKwkJCWJ1c2luZXNzTG9jYWxzID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQlVTSU5FU1NfTE9DQUxTKTsKIAkJfQogCQlyZXR1cm4gYnVzaW5lc3NMb2NhbHM7CiAJfQpAQCAtNzc3LDkgKzk2OCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEJ1c2luZXNzUmVtb3RlcygpIHsKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEJ1c2luZXNzUmVtb3RlcygpIHsKIAkJaWYgKGJ1c2luZXNzUmVtb3RlcyA9PSBudWxsKSB7Ci0JCQlidXNpbmVzc1JlbW90ZXMgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQlVTSU5FU1NfUkVNT1RFUyk7CisJCQlidXNpbmVzc1JlbW90ZXMgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19CVVNJTkVTU19SRU1PVEVTKTsKIAkJfQogCQlyZXR1cm4gYnVzaW5lc3NSZW1vdGVzOwogCX0KQEAgLTc4OSw2ICs5ODAsNDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVtcHR5VHlwZSBnZXRMb2NhbEJlYW4oKSB7CisJCXJldHVybiBsb2NhbEJlYW47CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TG9jYWxCZWFuKEVtcHR5VHlwZSBuZXdMb2NhbEJlYW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJRW1wdHlUeXBlIG9sZExvY2FsQmVhbiA9IGxvY2FsQmVhbjsKKwkJbG9jYWxCZWFuID0gbmV3TG9jYWxCZWFuOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTE9DQUxfQkVBTiwgb2xkTG9jYWxCZWFuLCBuZXdMb2NhbEJlYW4pOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldExvY2FsQmVhbihFbXB0eVR5cGUgbmV3TG9jYWxCZWFuKSB7CisJCWlmIChuZXdMb2NhbEJlYW4gIT0gbG9jYWxCZWFuKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChsb2NhbEJlYW4gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbG9jYWxCZWFuKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0xPQ0FMX0JFQU4sIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0xvY2FsQmVhbiAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdMb2NhbEJlYW4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTE9DQUxfQkVBTiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRMb2NhbEJlYW4obmV3TG9jYWxCZWFuLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19MT0NBTF9CRUFOLCBuZXdMb2NhbEJlYW4sIG5ld0xvY2FsQmVhbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUVuZHBvaW50KCkgewogCQlyZXR1cm4gc2VydmljZUVuZHBvaW50OwogCX0KQEAgLTg3Nyw2ICsxMTExLDQ5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBTdGF0ZWZ1bFRpbWVvdXRUeXBlIGdldFN0YXRlZnVsVGltZW91dCgpIHsKKwkJcmV0dXJuIHN0YXRlZnVsVGltZW91dDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdGF0ZWZ1bFRpbWVvdXQoU3RhdGVmdWxUaW1lb3V0VHlwZSBuZXdTdGF0ZWZ1bFRpbWVvdXQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJU3RhdGVmdWxUaW1lb3V0VHlwZSBvbGRTdGF0ZWZ1bFRpbWVvdXQgPSBzdGF0ZWZ1bFRpbWVvdXQ7CisJCXN0YXRlZnVsVGltZW91dCA9IG5ld1N0YXRlZnVsVGltZW91dDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NUQVRFRlVMX1RJTUVPVVQsIG9sZFN0YXRlZnVsVGltZW91dCwgbmV3U3RhdGVmdWxUaW1lb3V0KTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTdGF0ZWZ1bFRpbWVvdXQoU3RhdGVmdWxUaW1lb3V0VHlwZSBuZXdTdGF0ZWZ1bFRpbWVvdXQpIHsKKwkJaWYgKG5ld1N0YXRlZnVsVGltZW91dCAhPSBzdGF0ZWZ1bFRpbWVvdXQpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKHN0YXRlZnVsVGltZW91dCAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzdGF0ZWZ1bFRpbWVvdXQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU1RBVEVGVUxfVElNRU9VVCwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3U3RhdGVmdWxUaW1lb3V0ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1N0YXRlZnVsVGltZW91dCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TVEFURUZVTF9USU1FT1VULCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFN0YXRlZnVsVGltZW91dChuZXdTdGF0ZWZ1bFRpbWVvdXQsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NUQVRFRlVMX1RJTUVPVVQsIG5ld1N0YXRlZnVsVGltZW91dCwgbmV3U3RhdGVmdWxUaW1lb3V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIE5hbWVkTWV0aG9kVHlwZSBnZXRUaW1lb3V0TWV0aG9kKCkgewogCQlyZXR1cm4gdGltZW91dE1ldGhvZDsKIAl9CkBAIC05MjAsOSArMTE5NywxNjggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SW5pdE1ldGhvZHMoKSB7CisJcHVibGljIExpc3Q8VGltZXJUeXBlPiBnZXRUaW1lcigpIHsKKwkJaWYgKHRpbWVyID09IG51bGwpIHsKKwkJCXRpbWVyID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFRpbWVyVHlwZT4oVGltZXJUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVElNRVIpOworCQl9CisJCXJldHVybiB0aW1lcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0luaXRPblN0YXJ0dXAoKSB7CisJCXJldHVybiBpbml0T25TdGFydHVwOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluaXRPblN0YXJ0dXAoYm9vbGVhbiBuZXdJbml0T25TdGFydHVwKSB7CisJCWJvb2xlYW4gb2xkSW5pdE9uU3RhcnR1cCA9IGluaXRPblN0YXJ0dXA7CisJCWluaXRPblN0YXJ0dXAgPSBuZXdJbml0T25TdGFydHVwOworCQlib29sZWFuIG9sZEluaXRPblN0YXJ0dXBFU2V0ID0gaW5pdE9uU3RhcnR1cEVTZXQ7CisJCWluaXRPblN0YXJ0dXBFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lOSVRfT05fU1RBUlRVUCwgb2xkSW5pdE9uU3RhcnR1cCwgaW5pdE9uU3RhcnR1cCwgIW9sZEluaXRPblN0YXJ0dXBFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdW5zZXRJbml0T25TdGFydHVwKCkgeworCQlib29sZWFuIG9sZEluaXRPblN0YXJ0dXAgPSBpbml0T25TdGFydHVwOworCQlib29sZWFuIG9sZEluaXRPblN0YXJ0dXBFU2V0ID0gaW5pdE9uU3RhcnR1cEVTZXQ7CisJCWluaXRPblN0YXJ0dXAgPSBJTklUX09OX1NUQVJUVVBfRURFRkFVTFQ7CisJCWluaXRPblN0YXJ0dXBFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lOSVRfT05fU1RBUlRVUCwgb2xkSW5pdE9uU3RhcnR1cCwgSU5JVF9PTl9TVEFSVFVQX0VERUZBVUxULCBvbGRJbml0T25TdGFydHVwRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0SW5pdE9uU3RhcnR1cCgpIHsKKwkJcmV0dXJuIGluaXRPblN0YXJ0dXBFU2V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZSBnZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlKCkgeworCQlyZXR1cm4gY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlKENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlIG5ld0NvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUpIHsKKwkJQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUgb2xkQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSA9IGNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGU7CisJCWNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUgPSBuZXdDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlID09IG51bGwgPyBDT05DVVJSRU5DWV9NQU5BR0VNRU5UX1RZUEVfRURFRkFVTFQgOiBuZXdDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlOworCQlib29sZWFuIG9sZENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVFU2V0ID0gY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZUVTZXQ7CisJCWNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0NPTkNVUlJFTkNZX01BTkFHRU1FTlRfVFlQRSwgb2xkQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSwgY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSwgIW9sZENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdW5zZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlKCkgeworCQlDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZSBvbGRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlID0gY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZTsKKwkJYm9vbGVhbiBvbGRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlRVNldCA9IGNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVFU2V0OworCQljb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlID0gQ09OQ1VSUkVOQ1lfTUFOQUdFTUVOVF9UWVBFX0VERUZBVUxUOworCQljb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlRVNldCA9IGZhbHNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19DT05DVVJSRU5DWV9NQU5BR0VNRU5UX1RZUEUsIG9sZENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUsIENPTkNVUlJFTkNZX01BTkFHRU1FTlRfVFlQRV9FREVGQVVMVCwgb2xkQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZUVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUoKSB7CisJCXJldHVybiBjb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlRVNldDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxDb25jdXJyZW50TWV0aG9kVHlwZT4gZ2V0Q29uY3VycmVudE1ldGhvZCgpIHsKKwkJaWYgKGNvbmN1cnJlbnRNZXRob2QgPT0gbnVsbCkgeworCQkJY29uY3VycmVudE1ldGhvZCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxDb25jdXJyZW50TWV0aG9kVHlwZT4oQ29uY3VycmVudE1ldGhvZFR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19DT05DVVJSRU5UX01FVEhPRCk7CisJCX0KKwkJcmV0dXJuIGNvbmN1cnJlbnRNZXRob2Q7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIERlcGVuZHNPblR5cGUgZ2V0RGVwZW5kc09uKCkgeworCQlyZXR1cm4gZGVwZW5kc09uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERlcGVuZHNPbihEZXBlbmRzT25UeXBlIG5ld0RlcGVuZHNPbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlEZXBlbmRzT25UeXBlIG9sZERlcGVuZHNPbiA9IGRlcGVuZHNPbjsKKwkJZGVwZW5kc09uID0gbmV3RGVwZW5kc09uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fREVQRU5EU19PTiwgb2xkRGVwZW5kc09uLCBuZXdEZXBlbmRzT24pOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERlcGVuZHNPbihEZXBlbmRzT25UeXBlIG5ld0RlcGVuZHNPbikgeworCQlpZiAobmV3RGVwZW5kc09uICE9IGRlcGVuZHNPbikgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoZGVwZW5kc09uICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWRlcGVuZHNPbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ERVBFTkRTX09OLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdEZXBlbmRzT24gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RGVwZW5kc09uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RFUEVORFNfT04sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0RGVwZW5kc09uKG5ld0RlcGVuZHNPbiwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fREVQRU5EU19PTiwgbmV3RGVwZW5kc09uLCBuZXdEZXBlbmRzT24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxJbml0TWV0aG9kVHlwZT4gZ2V0SW5pdE1ldGhvZHMoKSB7CiAJCWlmIChpbml0TWV0aG9kcyA9PSBudWxsKSB7Ci0JCQlpbml0TWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJbml0TWV0aG9kVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lOSVRfTUVUSE9EUyk7CisJCQlpbml0TWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJbml0TWV0aG9kVHlwZT4oSW5pdE1ldGhvZFR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JTklUX01FVEhPRFMpOwogCQl9CiAJCXJldHVybiBpbml0TWV0aG9kczsKIAl9CkBAIC05MzIsOSArMTM2OCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlbW92ZU1ldGhvZHMoKSB7CisJcHVibGljIExpc3Q8UmVtb3ZlTWV0aG9kVHlwZT4gZ2V0UmVtb3ZlTWV0aG9kcygpIHsKIAkJaWYgKHJlbW92ZU1ldGhvZHMgPT0gbnVsbCkgewotCQkJcmVtb3ZlTWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZW1vdmVNZXRob2RUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVNT1ZFX01FVEhPRFMpOworCQkJcmVtb3ZlTWV0aG9kcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxSZW1vdmVNZXRob2RUeXBlPihSZW1vdmVNZXRob2RUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVNT1ZFX01FVEhPRFMpOwogCQl9CiAJCXJldHVybiByZW1vdmVNZXRob2RzOwogCX0KQEAgLTk0NCw2ICsxMzgwLDE4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBMaXN0PEFzeW5jTWV0aG9kVHlwZT4gZ2V0QXN5bmNNZXRob2QoKSB7CisJCWlmIChhc3luY01ldGhvZCA9PSBudWxsKSB7CisJCQlhc3luY01ldGhvZCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxBc3luY01ldGhvZFR5cGU+KEFzeW5jTWV0aG9kVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0FTWU5DX01FVEhPRCk7CisJCX0KKwkJcmV0dXJuIGFzeW5jTWV0aG9kOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBUcmFuc2FjdGlvblR5cGUgZ2V0VHJhbnNhY3Rpb25UeXBlKCkgewogCQlyZXR1cm4gdHJhbnNhY3Rpb25UeXBlOwogCX0KQEAgLTk5MCw5ICsxNDM4LDEzOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBcm91bmRJbnZva2VzKCkgeworCXB1YmxpYyBOYW1lZE1ldGhvZFR5cGUgZ2V0QWZ0ZXJCZWdpbk1ldGhvZCgpIHsKKwkJcmV0dXJuIGFmdGVyQmVnaW5NZXRob2Q7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWZ0ZXJCZWdpbk1ldGhvZChOYW1lZE1ldGhvZFR5cGUgbmV3QWZ0ZXJCZWdpbk1ldGhvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlOYW1lZE1ldGhvZFR5cGUgb2xkQWZ0ZXJCZWdpbk1ldGhvZCA9IGFmdGVyQmVnaW5NZXRob2Q7CisJCWFmdGVyQmVnaW5NZXRob2QgPSBuZXdBZnRlckJlZ2luTWV0aG9kOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQUZURVJfQkVHSU5fTUVUSE9ELCBvbGRBZnRlckJlZ2luTWV0aG9kLCBuZXdBZnRlckJlZ2luTWV0aG9kKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBZnRlckJlZ2luTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSBuZXdBZnRlckJlZ2luTWV0aG9kKSB7CisJCWlmIChuZXdBZnRlckJlZ2luTWV0aG9kICE9IGFmdGVyQmVnaW5NZXRob2QpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGFmdGVyQmVnaW5NZXRob2QgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWZ0ZXJCZWdpbk1ldGhvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BRlRFUl9CRUdJTl9NRVRIT0QsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0FmdGVyQmVnaW5NZXRob2QgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWZ0ZXJCZWdpbk1ldGhvZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BRlRFUl9CRUdJTl9NRVRIT0QsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0QWZ0ZXJCZWdpbk1ldGhvZChuZXdBZnRlckJlZ2luTWV0aG9kLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BRlRFUl9CRUdJTl9NRVRIT0QsIG5ld0FmdGVyQmVnaW5NZXRob2QsIG5ld0FmdGVyQmVnaW5NZXRob2QpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTmFtZWRNZXRob2RUeXBlIGdldEJlZm9yZUNvbXBsZXRpb25NZXRob2QoKSB7CisJCXJldHVybiBiZWZvcmVDb21wbGV0aW9uTWV0aG9kOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEJlZm9yZUNvbXBsZXRpb25NZXRob2QoTmFtZWRNZXRob2RUeXBlIG5ld0JlZm9yZUNvbXBsZXRpb25NZXRob2QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJTmFtZWRNZXRob2RUeXBlIG9sZEJlZm9yZUNvbXBsZXRpb25NZXRob2QgPSBiZWZvcmVDb21wbGV0aW9uTWV0aG9kOworCQliZWZvcmVDb21wbGV0aW9uTWV0aG9kID0gbmV3QmVmb3JlQ29tcGxldGlvbk1ldGhvZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0JFRk9SRV9DT01QTEVUSU9OX01FVEhPRCwgb2xkQmVmb3JlQ29tcGxldGlvbk1ldGhvZCwgbmV3QmVmb3JlQ29tcGxldGlvbk1ldGhvZCk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QmVmb3JlQ29tcGxldGlvbk1ldGhvZChOYW1lZE1ldGhvZFR5cGUgbmV3QmVmb3JlQ29tcGxldGlvbk1ldGhvZCkgeworCQlpZiAobmV3QmVmb3JlQ29tcGxldGlvbk1ldGhvZCAhPSBiZWZvcmVDb21wbGV0aW9uTWV0aG9kKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChiZWZvcmVDb21wbGV0aW9uTWV0aG9kICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWJlZm9yZUNvbXBsZXRpb25NZXRob2QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQkVGT1JFX0NPTVBMRVRJT05fTUVUSE9ELCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdCZWZvcmVDb21wbGV0aW9uTWV0aG9kICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0JlZm9yZUNvbXBsZXRpb25NZXRob2QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQkVGT1JFX0NPTVBMRVRJT05fTUVUSE9ELCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEJlZm9yZUNvbXBsZXRpb25NZXRob2QobmV3QmVmb3JlQ29tcGxldGlvbk1ldGhvZCwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQkVGT1JFX0NPTVBMRVRJT05fTUVUSE9ELCBuZXdCZWZvcmVDb21wbGV0aW9uTWV0aG9kLCBuZXdCZWZvcmVDb21wbGV0aW9uTWV0aG9kKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5hbWVkTWV0aG9kVHlwZSBnZXRBZnRlckNvbXBsZXRpb25NZXRob2QoKSB7CisJCXJldHVybiBhZnRlckNvbXBsZXRpb25NZXRob2Q7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWZ0ZXJDb21wbGV0aW9uTWV0aG9kKE5hbWVkTWV0aG9kVHlwZSBuZXdBZnRlckNvbXBsZXRpb25NZXRob2QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJTmFtZWRNZXRob2RUeXBlIG9sZEFmdGVyQ29tcGxldGlvbk1ldGhvZCA9IGFmdGVyQ29tcGxldGlvbk1ldGhvZDsKKwkJYWZ0ZXJDb21wbGV0aW9uTWV0aG9kID0gbmV3QWZ0ZXJDb21wbGV0aW9uTWV0aG9kOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQUZURVJfQ09NUExFVElPTl9NRVRIT0QsIG9sZEFmdGVyQ29tcGxldGlvbk1ldGhvZCwgbmV3QWZ0ZXJDb21wbGV0aW9uTWV0aG9kKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBZnRlckNvbXBsZXRpb25NZXRob2QoTmFtZWRNZXRob2RUeXBlIG5ld0FmdGVyQ29tcGxldGlvbk1ldGhvZCkgeworCQlpZiAobmV3QWZ0ZXJDb21wbGV0aW9uTWV0aG9kICE9IGFmdGVyQ29tcGxldGlvbk1ldGhvZCkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYWZ0ZXJDb21wbGV0aW9uTWV0aG9kICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFmdGVyQ29tcGxldGlvbk1ldGhvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BRlRFUl9DT01QTEVUSU9OX01FVEhPRCwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3QWZ0ZXJDb21wbGV0aW9uTWV0aG9kICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FmdGVyQ29tcGxldGlvbk1ldGhvZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BRlRFUl9DT01QTEVUSU9OX01FVEhPRCwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRBZnRlckNvbXBsZXRpb25NZXRob2QobmV3QWZ0ZXJDb21wbGV0aW9uTWV0aG9kLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BRlRFUl9DT01QTEVUSU9OX01FVEhPRCwgbmV3QWZ0ZXJDb21wbGV0aW9uTWV0aG9kLCBuZXdBZnRlckNvbXBsZXRpb25NZXRob2QpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxBcm91bmRJbnZva2VUeXBlPiBnZXRBcm91bmRJbnZva2VzKCkgewogCQlpZiAoYXJvdW5kSW52b2tlcyA9PSBudWxsKSB7Ci0JCQlhcm91bmRJbnZva2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEFyb3VuZEludm9rZVR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BUk9VTkRfSU5WT0tFUyk7CisJCQlhcm91bmRJbnZva2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEFyb3VuZEludm9rZVR5cGU+KEFyb3VuZEludm9rZVR5cGUuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BUk9VTkRfSU5WT0tFUyk7CiAJCX0KIAkJcmV0dXJuIGFyb3VuZEludm9rZXM7CiAJfQpAQCAtMTAwMiw5ICsxNTc5LDIxIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEVudkVudHJpZXMoKSB7CisJcHVibGljIExpc3Q8QXJvdW5kVGltZW91dFR5cGU+IGdldEFyb3VuZFRpbWVvdXRzKCkgeworCQlpZiAoYXJvdW5kVGltZW91dHMgPT0gbnVsbCkgeworCQkJYXJvdW5kVGltZW91dHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8QXJvdW5kVGltZW91dFR5cGU+KEFyb3VuZFRpbWVvdXRUeXBlLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQVJPVU5EX1RJTUVPVVRTKTsKKwkJfQorCQlyZXR1cm4gYXJvdW5kVGltZW91dHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8RW52RW50cnk+IGdldEVudkVudHJpZXMoKSB7CiAJCWlmIChlbnZFbnRyaWVzID09IG51bGwpIHsKLQkJCWVudkVudHJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRW52RW50cnkuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FTlZfRU5UUklFUyk7CisJCQllbnZFbnRyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEVudkVudHJ5PihFbnZFbnRyeS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VOVl9FTlRSSUVTKTsKIAkJfQogCQlyZXR1cm4gZW52RW50cmllczsKIAl9CkBAIC0xMDE0LDkgKzE2MDMsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRFamJSZWZzKCkgeworCXB1YmxpYyBMaXN0PEVqYlJlZj4gZ2V0RWpiUmVmcygpIHsKIAkJaWYgKGVqYlJlZnMgPT0gbnVsbCkgewotCQkJZWpiUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFamJSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfUkVGUyk7CisJCQllamJSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEVqYlJlZj4oRWpiUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX1JFRlMpOwogCQl9CiAJCXJldHVybiBlamJSZWZzOwogCX0KQEAgLTEwMjYsOSArMTYxNSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEVqYkxvY2FsUmVmcygpIHsKKwlwdWJsaWMgTGlzdDxFamJMb2NhbFJlZj4gZ2V0RWpiTG9jYWxSZWZzKCkgewogCQlpZiAoZWpiTG9jYWxSZWZzID09IG51bGwpIHsKLQkJCWVqYkxvY2FsUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFamJMb2NhbFJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9MT0NBTF9SRUZTKTsKKwkJCWVqYkxvY2FsUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxFamJMb2NhbFJlZj4oRWpiTG9jYWxSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfTE9DQUxfUkVGUyk7CiAJCX0KIAkJcmV0dXJuIGVqYkxvY2FsUmVmczsKIAl9CkBAIC0xMDM4LDkgKzE2MjcsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2aWNlUmVmcygpIHsKKwlwdWJsaWMgTGlzdDxTZXJ2aWNlUmVmPiBnZXRTZXJ2aWNlUmVmcygpIHsKIAkJaWYgKHNlcnZpY2VSZWZzID09IG51bGwpIHsKLQkJCXNlcnZpY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlcnZpY2VSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVJWSUNFX1JFRlMpOworCQkJc2VydmljZVJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U2VydmljZVJlZj4oU2VydmljZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFUlZJQ0VfUkVGUyk7CiAJCX0KIAkJcmV0dXJuIHNlcnZpY2VSZWZzOwogCX0KQEAgLTEwNTAsOSArMTYzOSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlUmVmcygpIHsKKwlwdWJsaWMgTGlzdDxSZXNvdXJjZVJlZj4gZ2V0UmVzb3VyY2VSZWZzKCkgewogCQlpZiAocmVzb3VyY2VSZWZzID09IG51bGwpIHsKLQkJCXJlc291cmNlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChSZXNvdXJjZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFU09VUkNFX1JFRlMpOworCQkJcmVzb3VyY2VSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFJlc291cmNlUmVmPihSZXNvdXJjZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFU09VUkNFX1JFRlMpOwogCQl9CiAJCXJldHVybiByZXNvdXJjZVJlZnM7CiAJfQpAQCAtMTA2Miw5ICsxNjUxLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCkgeworCXB1YmxpYyBMaXN0PFJlc291cmNlRW52UmVmPiBnZXRSZXNvdXJjZUVudlJlZnMoKSB7CiAJCWlmIChyZXNvdXJjZUVudlJlZnMgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VFbnZSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlRW52UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMpOworCQkJcmVzb3VyY2VFbnZSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFJlc291cmNlRW52UmVmPihSZXNvdXJjZUVudlJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTKTsKIAkJfQogCQlyZXR1cm4gcmVzb3VyY2VFbnZSZWZzOwogCX0KQEAgLTEwNzQsOSArMTY2Myw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7CisJcHVibGljIExpc3Q8TWVzc2FnZURlc3RpbmF0aW9uUmVmPiBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewogCQlpZiAobWVzc2FnZURlc3RpbmF0aW9uUmVmcyA9PSBudWxsKSB7Ci0JCQltZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7CisJCQltZXNzYWdlRGVzdGluYXRpb25SZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvblJlZj4oTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTKTsKIAkJfQogCQlyZXR1cm4gbWVzc2FnZURlc3RpbmF0aW9uUmVmczsKIAl9CkBAIC0xMDg2LDkgKzE2NzUsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgeworCXB1YmxpYyBMaXN0PFBlcnNpc3RlbmNlQ29udGV4dFJlZj4gZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKIAkJaWYgKHBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPT0gbnVsbCkgewotCQkJcGVyc2lzdGVuY2VDb250ZXh0UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQZXJzaXN0ZW5jZUNvbnRleHRSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMpOworCQkJcGVyc2lzdGVuY2VDb250ZXh0UmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxQZXJzaXN0ZW5jZUNvbnRleHRSZWY+KFBlcnNpc3RlbmNlQ29udGV4dFJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7CiAJCX0KIAkJcmV0dXJuIHBlcnNpc3RlbmNlQ29udGV4dFJlZnM7CiAJfQpAQCAtMTA5OCw5ICsxNjg3LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIHsKKwlwdWJsaWMgTGlzdDxQZXJzaXN0ZW5jZVVuaXRSZWY+IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSB7CiAJCWlmIChwZXJzaXN0ZW5jZVVuaXRSZWZzID09IG51bGwpIHsKLQkJCXBlcnNpc3RlbmNlVW5pdFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUGVyc2lzdGVuY2VVbml0UmVmLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKKwkJCXBlcnNpc3RlbmNlVW5pdFJlZnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UGVyc2lzdGVuY2VVbml0UmVmPihQZXJzaXN0ZW5jZVVuaXRSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlMpOwogCQl9CiAJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRSZWZzOwogCX0KQEAgLTExMTAsOSArMTY5OSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCkgeworCXB1YmxpYyBMaXN0PExpZmVjeWNsZUNhbGxiYWNrPiBnZXRQb3N0Q29uc3RydWN0cygpIHsKIAkJaWYgKHBvc3RDb25zdHJ1Y3RzID09IG51bGwpIHsKLQkJCXBvc3RDb25zdHJ1Y3RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUE9TVF9DT05TVFJVQ1RTKTsKKwkJCXBvc3RDb25zdHJ1Y3RzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PExpZmVjeWNsZUNhbGxiYWNrPihMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BPU1RfQ09OU1RSVUNUUyk7CiAJCX0KIAkJcmV0dXJuIHBvc3RDb25zdHJ1Y3RzOwogCX0KQEAgLTExMjIsOSArMTcxMSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFByZURlc3Ryb3lzKCkgeworCXB1YmxpYyBMaXN0PExpZmVjeWNsZUNhbGxiYWNrPiBnZXRQcmVEZXN0cm95cygpIHsKIAkJaWYgKHByZURlc3Ryb3lzID09IG51bGwpIHsKLQkJCXByZURlc3Ryb3lzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUFJFX0RFU1RST1lTKTsKKwkJCXByZURlc3Ryb3lzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PExpZmVjeWNsZUNhbGxiYWNrPihMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9ERVNUUk9ZUyk7CiAJCX0KIAkJcmV0dXJuIHByZURlc3Ryb3lzOwogCX0KQEAgLTExMzQsOSArMTcyMywyMSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3N0QWN0aXZhdGVzKCkgeworCXB1YmxpYyBMaXN0PERhdGFTb3VyY2VUeXBlPiBnZXREYXRhU291cmNlKCkgeworCQlpZiAoZGF0YVNvdXJjZSA9PSBudWxsKSB7CisJCQlkYXRhU291cmNlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERhdGFTb3VyY2VUeXBlPihEYXRhU291cmNlVHlwZS5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RBVEFfU09VUkNFKTsKKwkJfQorCQlyZXR1cm4gZGF0YVNvdXJjZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gZ2V0UG9zdEFjdGl2YXRlcygpIHsKIAkJaWYgKHBvc3RBY3RpdmF0ZXMgPT0gbnVsbCkgewotCQkJcG9zdEFjdGl2YXRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BPU1RfQUNUSVZBVEVTKTsKKwkJCXBvc3RBY3RpdmF0ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+KExpZmVjeWNsZUNhbGxiYWNrLmNsYXNzLCB0aGlzLCBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUE9TVF9BQ1RJVkFURVMpOwogCQl9CiAJCXJldHVybiBwb3N0QWN0aXZhdGVzOwogCX0KQEAgLTExNDYsOSArMTc0Nyw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFByZVBhc3NpdmF0ZXMoKSB7CisJcHVibGljIExpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IGdldFByZVBhc3NpdmF0ZXMoKSB7CiAJCWlmIChwcmVQYXNzaXZhdGVzID09IG51bGwpIHsKLQkJCXByZVBhc3NpdmF0ZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTGlmZWN5Y2xlQ2FsbGJhY2suY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QUkVfUEFTU0lWQVRFUyk7CisJCQlwcmVQYXNzaXZhdGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PExpZmVjeWNsZUNhbGxiYWNrPihMaWZlY3ljbGVDYWxsYmFjay5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9QQVNTSVZBVEVTKTsKIAkJfQogCQlyZXR1cm4gcHJlUGFzc2l2YXRlczsKIAl9CkBAIC0xMTU4LDkgKzE3NTksOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWN1cml0eVJvbGVSZWZzKCkgeworCXB1YmxpYyBMaXN0PFNlY3VyaXR5Um9sZVJlZj4gZ2V0U2VjdXJpdHlSb2xlUmVmcygpIHsKIAkJaWYgKHNlY3VyaXR5Um9sZVJlZnMgPT0gbnVsbCkgewotCQkJc2VjdXJpdHlSb2xlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChTZWN1cml0eVJvbGVSZWYuY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMpOworCQkJc2VjdXJpdHlSb2xlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTZWN1cml0eVJvbGVSZWY+KFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgdGhpcywgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUyk7CiAJCX0KIAkJcmV0dXJuIHNlY3VyaXR5Um9sZVJlZnM7CiAJfQpAQCAtMTIzNCw1MCArMTgzNSw3MyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RJU1BMQVlfTkFNRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTE9DQUxfQkVBTjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRMb2NhbEJlYW4obnVsbCwgbXNncyk7CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TVEFURUZVTF9USU1FT1VUOgorCQkJCXJldHVybiBiYXNpY1NldFN0YXRlZnVsVGltZW91dChudWxsLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RJTUVPVVRfTUVUSE9EOgogCQkJCXJldHVybiBiYXNpY1NldFRpbWVvdXRNZXRob2QobnVsbCwgbXNncyk7CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19USU1FUjoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFRpbWVyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0NPTkNVUlJFTlRfTUVUSE9EOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29uY3VycmVudE1ldGhvZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ERVBFTkRTX09OOgorCQkJCXJldHVybiBiYXNpY1NldERlcGVuZHNPbihudWxsLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lOSVRfTUVUSE9EUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEluaXRNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEluaXRNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFTU9WRV9NRVRIT0RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVtb3ZlTWV0aG9kcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRSZW1vdmVNZXRob2RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0FTWU5DX01FVEhPRDoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEFzeW5jTWV0aG9kKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0FGVEVSX0JFR0lOX01FVEhPRDoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBZnRlckJlZ2luTWV0aG9kKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQkVGT1JFX0NPTVBMRVRJT05fTUVUSE9EOgorCQkJCXJldHVybiBiYXNpY1NldEJlZm9yZUNvbXBsZXRpb25NZXRob2QobnVsbCwgbXNncyk7CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BRlRFUl9DT01QTEVUSU9OX01FVEhPRDoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBZnRlckNvbXBsZXRpb25NZXRob2QobnVsbCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BUk9VTkRfSU5WT0tFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFyb3VuZEludm9rZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXJvdW5kSW52b2tlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BUk9VTkRfVElNRU9VVFM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBcm91bmRUaW1lb3V0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FTlZfRU5UUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVudkVudHJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RW52RW50cmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RWpiUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfTE9DQUxfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYkxvY2FsUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRFamJMb2NhbFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VSVklDRV9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZUVudlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BPU1RfQ09OU1RSVUNUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvc3RDb25zdHJ1Y3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBvc3RDb25zdHJ1Y3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZURlc3Ryb3lzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByZURlc3Ryb3lzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RBVEFfU09VUkNFOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGF0YVNvdXJjZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QT1NUX0FDVElWQVRFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBvc3RBY3RpdmF0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UG9zdEFjdGl2YXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QUkVfUEFTU0lWQVRFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZVBhc3NpdmF0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJlUGFzc2l2YXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN1cml0eVJvbGVSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlY3VyaXR5Um9sZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfSURFTlRJVElFUzoKIAkJCQlyZXR1cm4gYmFzaWNTZXRTZWN1cml0eUlkZW50aXRpZXMobnVsbCwgbXNncyk7CiAJCX0KQEAgLTEyODksNiArMTkxMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RFU0NSSVBUSU9OUzoKQEAgLTEzMTMsMjIgKzE5MzgsNDYgQEAKIAkJCQlyZXR1cm4gZ2V0QnVzaW5lc3NMb2NhbHMoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0JVU0lORVNTX1JFTU9URVM6CiAJCQkJcmV0dXJuIGdldEJ1c2luZXNzUmVtb3RlcygpOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTE9DQUxfQkVBTjoKKwkJCQlyZXR1cm4gZ2V0TG9jYWxCZWFuKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVJWSUNFX0VORFBPSU5UOgogCQkJCXJldHVybiBnZXRTZXJ2aWNlRW5kcG9pbnQoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VKQl9DTEFTUzoKIAkJCQlyZXR1cm4gZ2V0RWpiQ2xhc3MoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRToKIAkJCQlyZXR1cm4gZ2V0U2Vzc2lvblR5cGUoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NUQVRFRlVMX1RJTUVPVVQ6CisJCQkJcmV0dXJuIGdldFN0YXRlZnVsVGltZW91dCgpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVElNRU9VVF9NRVRIT0Q6CiAJCQkJcmV0dXJuIGdldFRpbWVvdXRNZXRob2QoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RJTUVSOgorCQkJCXJldHVybiBnZXRUaW1lcigpOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSU5JVF9PTl9TVEFSVFVQOgorCQkJCXJldHVybiBpc0luaXRPblN0YXJ0dXAoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0NPTkNVUlJFTkNZX01BTkFHRU1FTlRfVFlQRToKKwkJCQlyZXR1cm4gZ2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSgpOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQ09OQ1VSUkVOVF9NRVRIT0Q6CisJCQkJcmV0dXJuIGdldENvbmN1cnJlbnRNZXRob2QoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RFUEVORFNfT046CisJCQkJcmV0dXJuIGdldERlcGVuZHNPbigpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fSU5JVF9NRVRIT0RTOgogCQkJCXJldHVybiBnZXRJbml0TWV0aG9kcygpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVNT1ZFX01FVEhPRFM6CiAJCQkJcmV0dXJuIGdldFJlbW92ZU1ldGhvZHMoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0FTWU5DX01FVEhPRDoKKwkJCQlyZXR1cm4gZ2V0QXN5bmNNZXRob2QoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEU6CiAJCQkJcmV0dXJuIGdldFRyYW5zYWN0aW9uVHlwZSgpOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQUZURVJfQkVHSU5fTUVUSE9EOgorCQkJCXJldHVybiBnZXRBZnRlckJlZ2luTWV0aG9kKCk7CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19CRUZPUkVfQ09NUExFVElPTl9NRVRIT0Q6CisJCQkJcmV0dXJuIGdldEJlZm9yZUNvbXBsZXRpb25NZXRob2QoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0FGVEVSX0NPTVBMRVRJT05fTUVUSE9EOgorCQkJCXJldHVybiBnZXRBZnRlckNvbXBsZXRpb25NZXRob2QoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0FST1VORF9JTlZPS0VTOgogCQkJCXJldHVybiBnZXRBcm91bmRJbnZva2VzKCk7CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BUk9VTkRfVElNRU9VVFM6CisJCQkJcmV0dXJuIGdldEFyb3VuZFRpbWVvdXRzKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FTlZfRU5UUklFUzoKIAkJCQlyZXR1cm4gZ2V0RW52RW50cmllcygpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX1JFRlM6CkBAIC0xMzUxLDYgKzIwMDAsOCBAQAogCQkJCXJldHVybiBnZXRQb3N0Q29uc3RydWN0cygpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUFJFX0RFU1RST1lTOgogCQkJCXJldHVybiBnZXRQcmVEZXN0cm95cygpOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuIGdldERhdGFTb3VyY2UoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BPU1RfQUNUSVZBVEVTOgogCQkJCXJldHVybiBnZXRQb3N0QWN0aXZhdGVzKCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QUkVfUEFTU0lWQVRFUzoKQEAgLTEzNzAsMTkgKzIwMjEsMjEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RJU1BMQVlfTkFNRVM6CiAJCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzcGxheU5hbWU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JQ09OUzoKIAkJCQlnZXRJY29ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJY29uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX05BTUU6CiAJCQkJc2V0RWpiTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTE0MDQsMTEgKzIwNTcsMTQgQEAKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19CVVNJTkVTU19MT0NBTFM6CiAJCQkJZ2V0QnVzaW5lc3NMb2NhbHMoKS5jbGVhcigpOwotCQkJCWdldEJ1c2luZXNzTG9jYWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRCdXNpbmVzc0xvY2FscygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQlVTSU5FU1NfUkVNT1RFUzoKIAkJCQlnZXRCdXNpbmVzc1JlbW90ZXMoKS5jbGVhcigpOwotCQkJCWdldEJ1c2luZXNzUmVtb3RlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0QnVzaW5lc3NSZW1vdGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19MT0NBTF9CRUFOOgorCQkJCXNldExvY2FsQmVhbigoRW1wdHlUeXBlKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVJWSUNFX0VORFBPSU5UOgogCQkJCXNldFNlcnZpY2VFbmRwb2ludCgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTE0MTksNzkgKzIwNzUsMTIwIEBACiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TRVNTSU9OX1RZUEU6CiAJCQkJc2V0U2Vzc2lvblR5cGUoKFNlc3Npb25UeXBlKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19TVEFURUZVTF9USU1FT1VUOgorCQkJCXNldFN0YXRlZnVsVGltZW91dCgoU3RhdGVmdWxUaW1lb3V0VHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVElNRU9VVF9NRVRIT0Q6CiAJCQkJc2V0VGltZW91dE1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19USU1FUjoKKwkJCQlnZXRUaW1lcigpLmNsZWFyKCk7CisJCQkJZ2V0VGltZXIoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFRpbWVyVHlwZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lOSVRfT05fU1RBUlRVUDoKKwkJCQlzZXRJbml0T25TdGFydHVwKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19DT05DVVJSRU5DWV9NQU5BR0VNRU5UX1RZUEU6CisJCQkJc2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSgoQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0NPTkNVUlJFTlRfTUVUSE9EOgorCQkJCWdldENvbmN1cnJlbnRNZXRob2QoKS5jbGVhcigpOworCQkJCWdldENvbmN1cnJlbnRNZXRob2QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENvbmN1cnJlbnRNZXRob2RUeXBlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fREVQRU5EU19PTjoKKwkJCQlzZXREZXBlbmRzT24oKERlcGVuZHNPblR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lOSVRfTUVUSE9EUzoKIAkJCQlnZXRJbml0TWV0aG9kcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SW5pdE1ldGhvZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEluaXRNZXRob2RzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBJbml0TWV0aG9kVHlwZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFTU9WRV9NRVRIT0RTOgogCQkJCWdldFJlbW92ZU1ldGhvZHMoKS5jbGVhcigpOwotCQkJCWdldFJlbW92ZU1ldGhvZHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFJlbW92ZU1ldGhvZHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJlbW92ZU1ldGhvZFR5cGU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BU1lOQ19NRVRIT0Q6CisJCQkJZ2V0QXN5bmNNZXRob2QoKS5jbGVhcigpOworCQkJCWdldEFzeW5jTWV0aG9kKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBc3luY01ldGhvZFR5cGU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFOgogCQkJCXNldFRyYW5zYWN0aW9uVHlwZSgoVHJhbnNhY3Rpb25UeXBlKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BRlRFUl9CRUdJTl9NRVRIT0Q6CisJCQkJc2V0QWZ0ZXJCZWdpbk1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19CRUZPUkVfQ09NUExFVElPTl9NRVRIT0Q6CisJCQkJc2V0QmVmb3JlQ29tcGxldGlvbk1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BRlRFUl9DT01QTEVUSU9OX01FVEhPRDoKKwkJCQlzZXRBZnRlckNvbXBsZXRpb25NZXRob2QoKE5hbWVkTWV0aG9kVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQVJPVU5EX0lOVk9LRVM6CiAJCQkJZ2V0QXJvdW5kSW52b2tlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXJvdW5kSW52b2tlcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0QXJvdW5kSW52b2tlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQXJvdW5kSW52b2tlVHlwZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0FST1VORF9USU1FT1VUUzoKKwkJCQlnZXRBcm91bmRUaW1lb3V0cygpLmNsZWFyKCk7CisJCQkJZ2V0QXJvdW5kVGltZW91dHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEFyb3VuZFRpbWVvdXRUeXBlPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRU5WX0VOVFJJRVM6CiAJCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RW52RW50cmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RW52RW50cmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRW52RW50cnk+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfUkVGUzoKIAkJCQlnZXRFamJSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRFamJSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFamJSZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfTE9DQUxfUkVGUzoKIAkJCQlnZXRFamJMb2NhbFJlZnMoKS5jbGVhcigpOwotCQkJCWdldEVqYkxvY2FsUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RWpiTG9jYWxSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFamJMb2NhbFJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFUlZJQ0VfUkVGUzoKIAkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFNlcnZpY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZXJ2aWNlUmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfUkVGUzoKIAkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXNvdXJjZVJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTOgogCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJlc291cmNlRW52UmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgogCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1lc3NhZ2VEZXN0aW5hdGlvblJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKIAkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW5jZUNvbnRleHRSZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlM6CiAJCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUE9TVF9DT05TVFJVQ1RTOgogCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIExpZmVjeWNsZUNhbGxiYWNrPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUFJFX0RFU1RST1lTOgogCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmVEZXN0cm95cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UHJlRGVzdHJveXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIExpZmVjeWNsZUNhbGxiYWNrPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fREFUQV9TT1VSQ0U6CisJCQkJZ2V0RGF0YVNvdXJjZSgpLmNsZWFyKCk7CisJCQkJZ2V0RGF0YVNvdXJjZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGF0YVNvdXJjZVR5cGU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QT1NUX0FDVElWQVRFUzoKIAkJCQlnZXRQb3N0QWN0aXZhdGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQb3N0QWN0aXZhdGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRQb3N0QWN0aXZhdGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBMaWZlY3ljbGVDYWxsYmFjaz4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9QQVNTSVZBVEVTOgogCQkJCWdldFByZVBhc3NpdmF0ZXMoKS5jbGVhcigpOwotCQkJCWdldFByZVBhc3NpdmF0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFByZVBhc3NpdmF0ZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIExpZmVjeWNsZUNhbGxiYWNrPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUZTOgogCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3VyaXR5Um9sZVJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRJRVM6CiAJCQkJc2V0U2VjdXJpdHlJZGVudGl0aWVzKChTZWN1cml0eUlkZW50aXR5VHlwZSluZXdWYWx1ZSk7CkBAIC0xNTA4LDYgKzIyMDUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fREVTQ1JJUFRJT05TOgpAQCAtMTU0Myw2ICsyMjQxLDkgQEAKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0JVU0lORVNTX1JFTU9URVM6CiAJCQkJZ2V0QnVzaW5lc3NSZW1vdGVzKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19MT0NBTF9CRUFOOgorCQkJCXNldExvY2FsQmVhbigoRW1wdHlUeXBlKW51bGwpOworCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFUlZJQ0VfRU5EUE9JTlQ6CiAJCQkJc2V0U2VydmljZUVuZHBvaW50KFNFUlZJQ0VfRU5EUE9JTlRfRURFRkFVTFQpOwogCQkJCXJldHVybjsKQEAgLTE1NTIsMjEgKzIyNTMsNTQgQEAKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRToKIAkJCQl1bnNldFNlc3Npb25UeXBlKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU1RBVEVGVUxfVElNRU9VVDoKKwkJCQlzZXRTdGF0ZWZ1bFRpbWVvdXQoKFN0YXRlZnVsVGltZW91dFR5cGUpbnVsbCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVElNRU9VVF9NRVRIT0Q6CiAJCQkJc2V0VGltZW91dE1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW51bGwpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RJTUVSOgorCQkJCWdldFRpbWVyKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19JTklUX09OX1NUQVJUVVA6CisJCQkJdW5zZXRJbml0T25TdGFydHVwKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQ09OQ1VSUkVOQ1lfTUFOQUdFTUVOVF9UWVBFOgorCQkJCXVuc2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSgpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0NPTkNVUlJFTlRfTUVUSE9EOgorCQkJCWdldENvbmN1cnJlbnRNZXRob2QoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RFUEVORFNfT046CisJCQkJc2V0RGVwZW5kc09uKChEZXBlbmRzT25UeXBlKW51bGwpOworCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lOSVRfTUVUSE9EUzoKIAkJCQlnZXRJbml0TWV0aG9kcygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVNT1ZFX01FVEhPRFM6CiAJCQkJZ2V0UmVtb3ZlTWV0aG9kcygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQVNZTkNfTUVUSE9EOgorCQkJCWdldEFzeW5jTWV0aG9kKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFOgogCQkJCXVuc2V0VHJhbnNhY3Rpb25UeXBlKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQUZURVJfQkVHSU5fTUVUSE9EOgorCQkJCXNldEFmdGVyQmVnaW5NZXRob2QoKE5hbWVkTWV0aG9kVHlwZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19CRUZPUkVfQ09NUExFVElPTl9NRVRIT0Q6CisJCQkJc2V0QmVmb3JlQ29tcGxldGlvbk1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0FGVEVSX0NPTVBMRVRJT05fTUVUSE9EOgorCQkJCXNldEFmdGVyQ29tcGxldGlvbk1ldGhvZCgoTmFtZWRNZXRob2RUeXBlKW51bGwpOworCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0FST1VORF9JTlZPS0VTOgogCQkJCWdldEFyb3VuZEludm9rZXMoKS5jbGVhcigpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0FST1VORF9USU1FT1VUUzoKKwkJCQlnZXRBcm91bmRUaW1lb3V0cygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRU5WX0VOVFJJRVM6CiAJCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOwpAQCAtMTYwMCw2ICsyMzM0LDkgQEAKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1BSRV9ERVNUUk9ZUzoKIAkJCQlnZXRQcmVEZXN0cm95cygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fREFUQV9TT1VSQ0U6CisJCQkJZ2V0RGF0YVNvdXJjZSgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUE9TVF9BQ1RJVkFURVM6CiAJCQkJZ2V0UG9zdEFjdGl2YXRlcygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOwpAQCAtMTYyNCw2ICsyMzYxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RFU0NSSVBUSU9OUzoKQEAgLTE2NDgsMjIgKzIzODYsNDYgQEAKIAkJCQlyZXR1cm4gYnVzaW5lc3NMb2NhbHMgIT0gbnVsbCAmJiAhYnVzaW5lc3NMb2NhbHMuaXNFbXB0eSgpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQlVTSU5FU1NfUkVNT1RFUzoKIAkJCQlyZXR1cm4gYnVzaW5lc3NSZW1vdGVzICE9IG51bGwgJiYgIWJ1c2luZXNzUmVtb3Rlcy5pc0VtcHR5KCk7CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19MT0NBTF9CRUFOOgorCQkJCXJldHVybiBsb2NhbEJlYW4gIT0gbnVsbDsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFUlZJQ0VfRU5EUE9JTlQ6CiAJCQkJcmV0dXJuIFNFUlZJQ0VfRU5EUE9JTlRfRURFRkFVTFQgPT0gbnVsbCA/IHNlcnZpY2VFbmRwb2ludCAhPSBudWxsIDogIVNFUlZJQ0VfRU5EUE9JTlRfRURFRkFVTFQuZXF1YWxzKHNlcnZpY2VFbmRwb2ludCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19FSkJfQ0xBU1M6CiAJCQkJcmV0dXJuIEVKQl9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gZWpiQ2xhc3MgIT0gbnVsbCA6ICFFSkJfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGVqYkNsYXNzKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRToKIAkJCQlyZXR1cm4gaXNTZXRTZXNzaW9uVHlwZSgpOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fU1RBVEVGVUxfVElNRU9VVDoKKwkJCQlyZXR1cm4gc3RhdGVmdWxUaW1lb3V0ICE9IG51bGw7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19USU1FT1VUX01FVEhPRDoKIAkJCQlyZXR1cm4gdGltZW91dE1ldGhvZCAhPSBudWxsOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fVElNRVI6CisJCQkJcmV0dXJuIHRpbWVyICE9IG51bGwgJiYgIXRpbWVyLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lOSVRfT05fU1RBUlRVUDoKKwkJCQlyZXR1cm4gaXNTZXRJbml0T25TdGFydHVwKCk7CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19DT05DVVJSRU5DWV9NQU5BR0VNRU5UX1RZUEU6CisJCQkJcmV0dXJuIGlzU2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZSgpOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQ09OQ1VSUkVOVF9NRVRIT0Q6CisJCQkJcmV0dXJuIGNvbmN1cnJlbnRNZXRob2QgIT0gbnVsbCAmJiAhY29uY3VycmVudE1ldGhvZC5pc0VtcHR5KCk7CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19ERVBFTkRTX09OOgorCQkJCXJldHVybiBkZXBlbmRzT24gIT0gbnVsbDsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0lOSVRfTUVUSE9EUzoKIAkJCQlyZXR1cm4gaW5pdE1ldGhvZHMgIT0gbnVsbCAmJiAhaW5pdE1ldGhvZHMuaXNFbXB0eSgpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUkVNT1ZFX01FVEhPRFM6CiAJCQkJcmV0dXJuIHJlbW92ZU1ldGhvZHMgIT0gbnVsbCAmJiAhcmVtb3ZlTWV0aG9kcy5pc0VtcHR5KCk7CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BU1lOQ19NRVRIT0Q6CisJCQkJcmV0dXJuIGFzeW5jTWV0aG9kICE9IG51bGwgJiYgIWFzeW5jTWV0aG9kLmlzRW1wdHkoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEU6CiAJCQkJcmV0dXJuIGlzU2V0VHJhbnNhY3Rpb25UeXBlKCk7CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BRlRFUl9CRUdJTl9NRVRIT0Q6CisJCQkJcmV0dXJuIGFmdGVyQmVnaW5NZXRob2QgIT0gbnVsbDsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0JFRk9SRV9DT01QTEVUSU9OX01FVEhPRDoKKwkJCQlyZXR1cm4gYmVmb3JlQ29tcGxldGlvbk1ldGhvZCAhPSBudWxsOworCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQUZURVJfQ09NUExFVElPTl9NRVRIT0Q6CisJCQkJcmV0dXJuIGFmdGVyQ29tcGxldGlvbk1ldGhvZCAhPSBudWxsOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fQVJPVU5EX0lOVk9LRVM6CiAJCQkJcmV0dXJuIGFyb3VuZEludm9rZXMgIT0gbnVsbCAmJiAhYXJvdW5kSW52b2tlcy5pc0VtcHR5KCk7CisJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19BUk9VTkRfVElNRU9VVFM6CisJCQkJcmV0dXJuIGFyb3VuZFRpbWVvdXRzICE9IG51bGwgJiYgIWFyb3VuZFRpbWVvdXRzLmlzRW1wdHkoKTsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0VOVl9FTlRSSUVTOgogCQkJCXJldHVybiBlbnZFbnRyaWVzICE9IG51bGwgJiYgIWVudkVudHJpZXMuaXNFbXB0eSgpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fRUpCX1JFRlM6CkBAIC0xNjg2LDYgKzI0NDgsOCBAQAogCQkJCXJldHVybiBwb3N0Q29uc3RydWN0cyAhPSBudWxsICYmICFwb3N0Q29uc3RydWN0cy5pc0VtcHR5KCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QUkVfREVTVFJPWVM6CiAJCQkJcmV0dXJuIHByZURlc3Ryb3lzICE9IG51bGwgJiYgIXByZURlc3Ryb3lzLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX0JFQU5fX0RBVEFfU09VUkNFOgorCQkJCXJldHVybiBkYXRhU291cmNlICE9IG51bGwgJiYgIWRhdGFTb3VyY2UuaXNFbXB0eSgpOwogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTl9fUE9TVF9BQ1RJVkFURVM6CiAJCQkJcmV0dXJuIHBvc3RBY3RpdmF0ZXMgIT0gbnVsbCAmJiAhcG9zdEFjdGl2YXRlcy5pc0VtcHR5KCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9CRUFOX19QUkVfUEFTU0lWQVRFUzoKQEAgLTE3MDUsNiArMjQ2OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApAQCAtMTczMSw2ICsyNDk2LDEwIEBACiAJCXJlc3VsdC5hcHBlbmQoZWpiQ2xhc3MpOwogCQlyZXN1bHQuYXBwZW5kKCIsIHNlc3Npb25UeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlpZiAoc2Vzc2lvblR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHNlc3Npb25UeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBpbml0T25TdGFydHVwOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoaW5pdE9uU3RhcnR1cEVTZXQpIHJlc3VsdC5hcHBlbmQoaW5pdE9uU3RhcnR1cCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgY29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKGNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKCIsIHRyYW5zYWN0aW9uVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJaWYgKHRyYW5zYWN0aW9uVHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25UeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvU3RhdGVmdWxUaW1lb3V0VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvU3RhdGVmdWxUaW1lb3V0VHlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTc1YzRjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9TdGF0ZWZ1bFRpbWVvdXRUeXBlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzE3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TdGF0ZWZ1bFRpbWVvdXRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVVbml0VHlwZVR5cGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3RhdGVmdWwgVGltZW91dCBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlN0YXRlZnVsVGltZW91dFR5cGVJbXBsI2dldFRpbWVvdXQgPGVtPlRpbWVvdXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU3RhdGVmdWxUaW1lb3V0VHlwZUltcGwjZ2V0VW5pdCA8ZW0+VW5pdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TdGF0ZWZ1bFRpbWVvdXRUeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBTdGF0ZWZ1bFRpbWVvdXRUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgU3RhdGVmdWxUaW1lb3V0VHlwZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVvdXQoKSA8ZW0+VGltZW91dDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGltZW91dCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRJTUVPVVRfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZW91dCgpIDxlbT5UaW1lb3V0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUaW1lb3V0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0aW1lb3V0ID0gVElNRU9VVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbml0KCkgPGVtPlVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFVuaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVGltZVVuaXRUeXBlVHlwZSBVTklUX0VERUZBVUxUID0gVGltZVVuaXRUeXBlVHlwZS5EQVlTOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pdCgpIDxlbT5Vbml0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGltZVVuaXRUeXBlVHlwZSB1bml0ID0gVU5JVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVW5pdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdW5pdEVTZXQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBTdGF0ZWZ1bFRpbWVvdXRUeXBlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuU1RBVEVGVUxfVElNRU9VVF9UWVBFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFRpbWVvdXQoKSB7CisJCXJldHVybiB0aW1lb3V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoQmlnSW50ZWdlciBuZXdUaW1lb3V0KSB7CisJCUJpZ0ludGVnZXIgb2xkVGltZW91dCA9IHRpbWVvdXQ7CisJCXRpbWVvdXQgPSBuZXdUaW1lb3V0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlNUQVRFRlVMX1RJTUVPVVRfVFlQRV9fVElNRU9VVCwgb2xkVGltZW91dCwgdGltZW91dCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUaW1lVW5pdFR5cGVUeXBlIGdldFVuaXQoKSB7CisJCXJldHVybiB1bml0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVuaXQoVGltZVVuaXRUeXBlVHlwZSBuZXdVbml0KSB7CisJCVRpbWVVbml0VHlwZVR5cGUgb2xkVW5pdCA9IHVuaXQ7CisJCXVuaXQgPSBuZXdVbml0ID09IG51bGwgPyBVTklUX0VERUZBVUxUIDogbmV3VW5pdDsKKwkJYm9vbGVhbiBvbGRVbml0RVNldCA9IHVuaXRFU2V0OworCQl1bml0RVNldCA9IHRydWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuU1RBVEVGVUxfVElNRU9VVF9UWVBFX19VTklULCBvbGRVbml0LCB1bml0LCAhb2xkVW5pdEVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldFVuaXQoKSB7CisJCVRpbWVVbml0VHlwZVR5cGUgb2xkVW5pdCA9IHVuaXQ7CisJCWJvb2xlYW4gb2xkVW5pdEVTZXQgPSB1bml0RVNldDsKKwkJdW5pdCA9IFVOSVRfRURFRkFVTFQ7CisJCXVuaXRFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgRWpiUGFja2FnZS5TVEFURUZVTF9USU1FT1VUX1RZUEVfX1VOSVQsIG9sZFVuaXQsIFVOSVRfRURFRkFVTFQsIG9sZFVuaXRFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZXRVbml0KCkgeworCQlyZXR1cm4gdW5pdEVTZXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgeworCQlTdHJpbmcgb2xkSWQgPSBpZDsKKwkJaWQgPSBuZXdJZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5TVEFURUZVTF9USU1FT1VUX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuU1RBVEVGVUxfVElNRU9VVF9UWVBFX19USU1FT1VUOgorCQkJCXJldHVybiBnZXRUaW1lb3V0KCk7CisJCQljYXNlIEVqYlBhY2thZ2UuU1RBVEVGVUxfVElNRU9VVF9UWVBFX19VTklUOgorCQkJCXJldHVybiBnZXRVbml0KCk7CisJCQljYXNlIEVqYlBhY2thZ2UuU1RBVEVGVUxfVElNRU9VVF9UWVBFX19JRDoKKwkJCQlyZXR1cm4gZ2V0SWQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFamJQYWNrYWdlLlNUQVRFRlVMX1RJTUVPVVRfVFlQRV9fVElNRU9VVDoKKwkJCQlzZXRUaW1lb3V0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuU1RBVEVGVUxfVElNRU9VVF9UWVBFX19VTklUOgorCQkJCXNldFVuaXQoKFRpbWVVbml0VHlwZVR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5TVEFURUZVTF9USU1FT1VUX1RZUEVfX0lEOgorCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuU1RBVEVGVUxfVElNRU9VVF9UWVBFX19USU1FT1VUOgorCQkJCXNldFRpbWVvdXQoVElNRU9VVF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlNUQVRFRlVMX1RJTUVPVVRfVFlQRV9fVU5JVDoKKwkJCQl1bnNldFVuaXQoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuU1RBVEVGVUxfVElNRU9VVF9UWVBFX19JRDoKKwkJCQlzZXRJZChJRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuU1RBVEVGVUxfVElNRU9VVF9UWVBFX19USU1FT1VUOgorCQkJCXJldHVybiBUSU1FT1VUX0VERUZBVUxUID09IG51bGwgPyB0aW1lb3V0ICE9IG51bGwgOiAhVElNRU9VVF9FREVGQVVMVC5lcXVhbHModGltZW91dCk7CisJCQljYXNlIEVqYlBhY2thZ2UuU1RBVEVGVUxfVElNRU9VVF9UWVBFX19VTklUOgorCQkJCXJldHVybiBpc1NldFVuaXQoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5TVEFURUZVTF9USU1FT1VUX1RZUEVfX0lEOgorCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodGltZW91dDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCh0aW1lb3V0KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB1bml0OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodW5pdEVTZXQpIHJlc3VsdC5hcHBlbmQodW5pdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9TdGF0ZWZ1bFRpbWVvdXRUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9UaW1lclNjaGVkdWxlVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvVGltZXJTY2hlZHVsZVR5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkZTgwNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL2ltcGwvVGltZXJTY2hlZHVsZVR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSw1NTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclNjaGVkdWxlVHlwZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaW1lciBTY2hlZHVsZSBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlRpbWVyU2NoZWR1bGVUeXBlSW1wbCNnZXRTZWNvbmQgPGVtPlNlY29uZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5UaW1lclNjaGVkdWxlVHlwZUltcGwjZ2V0TWludXRlIDxlbT5NaW51dGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuVGltZXJTY2hlZHVsZVR5cGVJbXBsI2dldEhvdXIgPGVtPkhvdXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuVGltZXJTY2hlZHVsZVR5cGVJbXBsI2dldERheU9mTW9udGggPGVtPkRheSBPZiBNb250aDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5UaW1lclNjaGVkdWxlVHlwZUltcGwjZ2V0TW9udGggPGVtPk1vbnRoPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlRpbWVyU2NoZWR1bGVUeXBlSW1wbCNnZXREYXlPZldlZWsgPGVtPkRheSBPZiBXZWVrPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlRpbWVyU2NoZWR1bGVUeXBlSW1wbCNnZXRZZWFyIDxlbT5ZZWFyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlRpbWVyU2NoZWR1bGVUeXBlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBUaW1lclNjaGVkdWxlVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFRpbWVyU2NoZWR1bGVUeXBlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vjb25kKCkgPGVtPlNlY29uZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2Vjb25kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2Vjb25kKCkgPGVtPlNlY29uZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2Vjb25kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHNlY29uZCA9IFNFQ09ORF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW51dGUoKSA8ZW0+TWludXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNaW51dGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTlVURV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW51dGUoKSA8ZW0+TWludXRlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNaW51dGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbWludXRlID0gTUlOVVRFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhvdXIoKSA8ZW0+SG91cjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SG91cigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9VUl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb3VyKCkgPGVtPkhvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEhvdXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgaG91ciA9IEhPVVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF5T2ZNb250aCgpIDxlbT5EYXkgT2YgTW9udGg8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERheU9mTW9udGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERBWV9PRl9NT05USF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXlPZk1vbnRoKCkgPGVtPkRheSBPZiBNb250aDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGF5T2ZNb250aCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBkYXlPZk1vbnRoID0gREFZX09GX01PTlRIX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vbnRoKCkgPGVtPk1vbnRoPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNb250aCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OVEhfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TW9udGgoKSA8ZW0+TW9udGg8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vbnRoKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG1vbnRoID0gTU9OVEhfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF5T2ZXZWVrKCkgPGVtPkRheSBPZiBXZWVrPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREYXlPZldlZWsoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERBWV9PRl9XRUVLX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERheU9mV2VlaygpIDxlbT5EYXkgT2YgV2VlazwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGF5T2ZXZWVrKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGRheU9mV2VlayA9IERBWV9PRl9XRUVLX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFllYXIoKSA8ZW0+WWVhcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0WWVhcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVBUl9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRZZWFyKCkgPGVtPlllYXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFllYXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgeWVhciA9IFlFQVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBUaW1lclNjaGVkdWxlVHlwZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLlRJTUVSX1NDSEVEVUxFX1RZUEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRTZWNvbmQoKSB7CisJCXJldHVybiBzZWNvbmQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2Vjb25kKFN0cmluZyBuZXdTZWNvbmQpIHsKKwkJU3RyaW5nIG9sZFNlY29uZCA9IHNlY29uZDsKKwkJc2Vjb25kID0gbmV3U2Vjb25kOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX1NFQ09ORCwgb2xkU2Vjb25kLCBzZWNvbmQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE1pbnV0ZSgpIHsKKwkJcmV0dXJuIG1pbnV0ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNaW51dGUoU3RyaW5nIG5ld01pbnV0ZSkgeworCQlTdHJpbmcgb2xkTWludXRlID0gbWludXRlOworCQltaW51dGUgPSBuZXdNaW51dGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuVElNRVJfU0NIRURVTEVfVFlQRV9fTUlOVVRFLCBvbGRNaW51dGUsIG1pbnV0ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SG91cigpIHsKKwkJcmV0dXJuIGhvdXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SG91cihTdHJpbmcgbmV3SG91cikgeworCQlTdHJpbmcgb2xkSG91ciA9IGhvdXI7CisJCWhvdXIgPSBuZXdIb3VyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX0hPVVIsIG9sZEhvdXIsIGhvdXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERheU9mTW9udGgoKSB7CisJCXJldHVybiBkYXlPZk1vbnRoOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldERheU9mTW9udGgoU3RyaW5nIG5ld0RheU9mTW9udGgpIHsKKwkJU3RyaW5nIG9sZERheU9mTW9udGggPSBkYXlPZk1vbnRoOworCQlkYXlPZk1vbnRoID0gbmV3RGF5T2ZNb250aDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19EQVlfT0ZfTU9OVEgsIG9sZERheU9mTW9udGgsIGRheU9mTW9udGgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE1vbnRoKCkgeworCQlyZXR1cm4gbW9udGg7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TW9udGgoU3RyaW5nIG5ld01vbnRoKSB7CisJCVN0cmluZyBvbGRNb250aCA9IG1vbnRoOworCQltb250aCA9IG5ld01vbnRoOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX01PTlRILCBvbGRNb250aCwgbW9udGgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERheU9mV2VlaygpIHsKKwkJcmV0dXJuIGRheU9mV2VlazsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREYXlPZldlZWsoU3RyaW5nIG5ld0RheU9mV2VlaykgeworCQlTdHJpbmcgb2xkRGF5T2ZXZWVrID0gZGF5T2ZXZWVrOworCQlkYXlPZldlZWsgPSBuZXdEYXlPZldlZWs7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuVElNRVJfU0NIRURVTEVfVFlQRV9fREFZX09GX1dFRUssIG9sZERheU9mV2VlaywgZGF5T2ZXZWVrKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRZZWFyKCkgeworCQlyZXR1cm4geWVhcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRZZWFyKFN0cmluZyBuZXdZZWFyKSB7CisJCVN0cmluZyBvbGRZZWFyID0geWVhcjsKKwkJeWVhciA9IG5ld1llYXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuVElNRVJfU0NIRURVTEVfVFlQRV9fWUVBUiwgb2xkWWVhciwgeWVhcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKKwkJU3RyaW5nIG9sZElkID0gaWQ7CisJCWlkID0gbmV3SWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuVElNRVJfU0NIRURVTEVfVFlQRV9fSUQsIG9sZElkLCBpZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19TRUNPTkQ6CisJCQkJcmV0dXJuIGdldFNlY29uZCgpOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX01JTlVURToKKwkJCQlyZXR1cm4gZ2V0TWludXRlKCk7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfU0NIRURVTEVfVFlQRV9fSE9VUjoKKwkJCQlyZXR1cm4gZ2V0SG91cigpOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX0RBWV9PRl9NT05USDoKKwkJCQlyZXR1cm4gZ2V0RGF5T2ZNb250aCgpOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX01PTlRIOgorCQkJCXJldHVybiBnZXRNb250aCgpOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX0RBWV9PRl9XRUVLOgorCQkJCXJldHVybiBnZXREYXlPZldlZWsoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19ZRUFSOgorCQkJCXJldHVybiBnZXRZZWFyKCk7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfU0NIRURVTEVfVFlQRV9fSUQ6CisJCQkJcmV0dXJuIGdldElkKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19TRUNPTkQ6CisJCQkJc2V0U2Vjb25kKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19NSU5VVEU6CisJCQkJc2V0TWludXRlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19IT1VSOgorCQkJCXNldEhvdXIoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX0RBWV9PRl9NT05USDoKKwkJCQlzZXREYXlPZk1vbnRoKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19NT05USDoKKwkJCQlzZXRNb250aCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfU0NIRURVTEVfVFlQRV9fREFZX09GX1dFRUs6CisJCQkJc2V0RGF5T2ZXZWVrKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19ZRUFSOgorCQkJCXNldFllYXIoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX0lEOgorCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfU0NIRURVTEVfVFlQRV9fU0VDT05EOgorCQkJCXNldFNlY29uZChTRUNPTkRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19NSU5VVEU6CisJCQkJc2V0TWludXRlKE1JTlVURV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX0hPVVI6CisJCQkJc2V0SG91cihIT1VSX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfU0NIRURVTEVfVFlQRV9fREFZX09GX01PTlRIOgorCQkJCXNldERheU9mTW9udGgoREFZX09GX01PTlRIX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfU0NIRURVTEVfVFlQRV9fTU9OVEg6CisJCQkJc2V0TW9udGgoTU9OVEhfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19EQVlfT0ZfV0VFSzoKKwkJCQlzZXREYXlPZldlZWsoREFZX09GX1dFRUtfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19ZRUFSOgorCQkJCXNldFllYXIoWUVBUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX0lEOgorCQkJCXNldElkKElEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19TRUNPTkQ6CisJCQkJcmV0dXJuIFNFQ09ORF9FREVGQVVMVCA9PSBudWxsID8gc2Vjb25kICE9IG51bGwgOiAhU0VDT05EX0VERUZBVUxULmVxdWFscyhzZWNvbmQpOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX01JTlVURToKKwkJCQlyZXR1cm4gTUlOVVRFX0VERUZBVUxUID09IG51bGwgPyBtaW51dGUgIT0gbnVsbCA6ICFNSU5VVEVfRURFRkFVTFQuZXF1YWxzKG1pbnV0ZSk7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfU0NIRURVTEVfVFlQRV9fSE9VUjoKKwkJCQlyZXR1cm4gSE9VUl9FREVGQVVMVCA9PSBudWxsID8gaG91ciAhPSBudWxsIDogIUhPVVJfRURFRkFVTFQuZXF1YWxzKGhvdXIpOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX0RBWV9PRl9NT05USDoKKwkJCQlyZXR1cm4gREFZX09GX01PTlRIX0VERUZBVUxUID09IG51bGwgPyBkYXlPZk1vbnRoICE9IG51bGwgOiAhREFZX09GX01PTlRIX0VERUZBVUxULmVxdWFscyhkYXlPZk1vbnRoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19NT05USDoKKwkJCQlyZXR1cm4gTU9OVEhfRURFRkFVTFQgPT0gbnVsbCA/IG1vbnRoICE9IG51bGwgOiAhTU9OVEhfRURFRkFVTFQuZXF1YWxzKG1vbnRoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19EQVlfT0ZfV0VFSzoKKwkJCQlyZXR1cm4gREFZX09GX1dFRUtfRURFRkFVTFQgPT0gbnVsbCA/IGRheU9mV2VlayAhPSBudWxsIDogIURBWV9PRl9XRUVLX0VERUZBVUxULmVxdWFscyhkYXlPZldlZWspOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEVfX1lFQVI6CisJCQkJcmV0dXJuIFlFQVJfRURFRkFVTFQgPT0gbnVsbCA/IHllYXIgIT0gbnVsbCA6ICFZRUFSX0VERUZBVUxULmVxdWFscyh5ZWFyKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9TQ0hFRFVMRV9UWVBFX19JRDoKKwkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHNlY29uZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChzZWNvbmQpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1pbnV0ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtaW51dGUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGhvdXI6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaG91cik7CisJCXJlc3VsdC5hcHBlbmQoIiwgZGF5T2ZNb250aDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChkYXlPZk1vbnRoKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtb250aDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtb250aCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgZGF5T2ZXZWVrOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGRheU9mV2Vlayk7CisJCXJlc3VsdC5hcHBlbmQoIiwgeWVhcjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCh5ZWFyKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1RpbWVyU2NoZWR1bGVUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9UaW1lclR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9pbXBsL1RpbWVyVHlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2JlZmFkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvaW1wbC9UaW1lclR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSw2NzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk5hbWVkTWV0aG9kVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclNjaGVkdWxlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGltZXIgVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5UaW1lclR5cGVJbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5UaW1lclR5cGVJbXBsI2dldFNjaGVkdWxlIDxlbT5TY2hlZHVsZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5UaW1lclR5cGVJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5UaW1lclR5cGVJbXBsI2dldEVuZCA8ZW0+RW5kPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlRpbWVyVHlwZUltcGwjZ2V0VGltZW91dE1ldGhvZCA8ZW0+VGltZW91dCBNZXRob2Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuVGltZXJUeXBlSW1wbCNpc1BlcnNpc3RlbnQgPGVtPlBlcnNpc3RlbnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuVGltZXJUeXBlSW1wbCNnZXRUaW1lem9uZSA8ZW0+VGltZXpvbmU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuVGltZXJUeXBlSW1wbCNnZXRJbmZvIDxlbT5JbmZvPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlRpbWVyVHlwZUltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgVGltZXJUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVGltZXJUeXBlIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVkdWxlKCkgPGVtPlNjaGVkdWxlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTY2hlZHVsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRpbWVyU2NoZWR1bGVUeXBlIHNjaGVkdWxlOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRTdGFydCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYTUxHcmVnb3JpYW5DYWxlbmRhciBTVEFSVF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydCgpIDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U3RhcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBYTUxHcmVnb3JpYW5DYWxlbmRhciBzdGFydCA9IFNUQVJUX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVuZCgpIDxlbT5FbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVuZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYTUxHcmVnb3JpYW5DYWxlbmRhciBFTkRfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5kKCkgPGVtPkVuZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RW5kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZW5kID0gRU5EX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZW91dE1ldGhvZCgpIDxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGltZW91dE1ldGhvZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIE5hbWVkTWV0aG9kVHlwZSB0aW1lb3V0TWV0aG9kOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUGVyc2lzdGVudCgpIDxlbT5QZXJzaXN0ZW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1BlcnNpc3RlbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQRVJTSVNURU5UX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1BlcnNpc3RlbnQoKSA8ZW0+UGVyc2lzdGVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNQZXJzaXN0ZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBwZXJzaXN0ZW50ID0gUEVSU0lTVEVOVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUGVyc2lzdGVudCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcGVyc2lzdGVudEVTZXQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXpvbmUoKSA8ZW0+VGltZXpvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRpbWV6b25lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FWk9ORV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lem9uZSgpIDxlbT5UaW1lem9uZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VGltZXpvbmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdGltZXpvbmUgPSBUSU1FWk9ORV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmZvKCkgPGVtPkluZm88L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEluZm8oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElORk9fRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5mbygpIDxlbT5JbmZvPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJbmZvKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGluZm8gPSBJTkZPX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVGltZXJUeXBlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuVElNRVJfVFlQRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb24oKSB7CisJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7CisJCQlkZXNjcmlwdGlvbiA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fREVTQ1JJUFRJT04pOworCQl9CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVGltZXJTY2hlZHVsZVR5cGUgZ2V0U2NoZWR1bGUoKSB7CisJCXJldHVybiBzY2hlZHVsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTY2hlZHVsZShUaW1lclNjaGVkdWxlVHlwZSBuZXdTY2hlZHVsZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlUaW1lclNjaGVkdWxlVHlwZSBvbGRTY2hlZHVsZSA9IHNjaGVkdWxlOworCQlzY2hlZHVsZSA9IG5ld1NjaGVkdWxlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1NDSEVEVUxFLCBvbGRTY2hlZHVsZSwgbmV3U2NoZWR1bGUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNjaGVkdWxlKFRpbWVyU2NoZWR1bGVUeXBlIG5ld1NjaGVkdWxlKSB7CisJCWlmIChuZXdTY2hlZHVsZSAhPSBzY2hlZHVsZSkgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoc2NoZWR1bGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc2NoZWR1bGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1NDSEVEVUxFLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdTY2hlZHVsZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTY2hlZHVsZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fU0NIRURVTEUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0U2NoZWR1bGUobmV3U2NoZWR1bGUsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5USU1FUl9UWVBFX19TQ0hFRFVMRSwgbmV3U2NoZWR1bGUsIG5ld1NjaGVkdWxlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldFN0YXJ0KCkgeworCQlyZXR1cm4gc3RhcnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3RhcnQoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgbmV3U3RhcnQpIHsKKwkJWE1MR3JlZ29yaWFuQ2FsZW5kYXIgb2xkU3RhcnQgPSBzdGFydDsKKwkJc3RhcnQgPSBuZXdTdGFydDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5USU1FUl9UWVBFX19TVEFSVCwgb2xkU3RhcnQsIHN0YXJ0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldEVuZCgpIHsKKwkJcmV0dXJuIGVuZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFbmQoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgbmV3RW5kKSB7CisJCVhNTEdyZWdvcmlhbkNhbGVuZGFyIG9sZEVuZCA9IGVuZDsKKwkJZW5kID0gbmV3RW5kOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX0VORCwgb2xkRW5kLCBlbmQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTmFtZWRNZXRob2RUeXBlIGdldFRpbWVvdXRNZXRob2QoKSB7CisJCXJldHVybiB0aW1lb3V0TWV0aG9kOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRpbWVvdXRNZXRob2QoTmFtZWRNZXRob2RUeXBlIG5ld1RpbWVvdXRNZXRob2QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJTmFtZWRNZXRob2RUeXBlIG9sZFRpbWVvdXRNZXRob2QgPSB0aW1lb3V0TWV0aG9kOworCQl0aW1lb3V0TWV0aG9kID0gbmV3VGltZW91dE1ldGhvZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5USU1FUl9UWVBFX19USU1FT1VUX01FVEhPRCwgb2xkVGltZW91dE1ldGhvZCwgbmV3VGltZW91dE1ldGhvZCk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VGltZW91dE1ldGhvZChOYW1lZE1ldGhvZFR5cGUgbmV3VGltZW91dE1ldGhvZCkgeworCQlpZiAobmV3VGltZW91dE1ldGhvZCAhPSB0aW1lb3V0TWV0aG9kKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmICh0aW1lb3V0TWV0aG9kICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXRpbWVvdXRNZXRob2QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1RJTUVPVVRfTUVUSE9ELCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdUaW1lb3V0TWV0aG9kICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RpbWVvdXRNZXRob2QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1RJTUVPVVRfTUVUSE9ELCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFRpbWVvdXRNZXRob2QobmV3VGltZW91dE1ldGhvZCwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1RJTUVPVVRfTUVUSE9ELCBuZXdUaW1lb3V0TWV0aG9kLCBuZXdUaW1lb3V0TWV0aG9kKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZW50KCkgeworCQlyZXR1cm4gcGVyc2lzdGVudDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0ZW50KGJvb2xlYW4gbmV3UGVyc2lzdGVudCkgeworCQlib29sZWFuIG9sZFBlcnNpc3RlbnQgPSBwZXJzaXN0ZW50OworCQlwZXJzaXN0ZW50ID0gbmV3UGVyc2lzdGVudDsKKwkJYm9vbGVhbiBvbGRQZXJzaXN0ZW50RVNldCA9IHBlcnNpc3RlbnRFU2V0OworCQlwZXJzaXN0ZW50RVNldCA9IHRydWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fUEVSU0lTVEVOVCwgb2xkUGVyc2lzdGVudCwgcGVyc2lzdGVudCwgIW9sZFBlcnNpc3RlbnRFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdW5zZXRQZXJzaXN0ZW50KCkgeworCQlib29sZWFuIG9sZFBlcnNpc3RlbnQgPSBwZXJzaXN0ZW50OworCQlib29sZWFuIG9sZFBlcnNpc3RlbnRFU2V0ID0gcGVyc2lzdGVudEVTZXQ7CisJCXBlcnNpc3RlbnQgPSBQRVJTSVNURU5UX0VERUZBVUxUOworCQlwZXJzaXN0ZW50RVNldCA9IGZhbHNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fUEVSU0lTVEVOVCwgb2xkUGVyc2lzdGVudCwgUEVSU0lTVEVOVF9FREVGQVVMVCwgb2xkUGVyc2lzdGVudEVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldFBlcnNpc3RlbnQoKSB7CisJCXJldHVybiBwZXJzaXN0ZW50RVNldDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRpbWV6b25lKCkgeworCQlyZXR1cm4gdGltZXpvbmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VGltZXpvbmUoU3RyaW5nIG5ld1RpbWV6b25lKSB7CisJCVN0cmluZyBvbGRUaW1lem9uZSA9IHRpbWV6b25lOworCQl0aW1lem9uZSA9IG5ld1RpbWV6b25lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1RJTUVaT05FLCBvbGRUaW1lem9uZSwgdGltZXpvbmUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEluZm8oKSB7CisJCXJldHVybiBpbmZvOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluZm8oU3RyaW5nIG5ld0luZm8pIHsKKwkJU3RyaW5nIG9sZEluZm8gPSBpbmZvOworCQlpbmZvID0gbmV3SW5mbzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5USU1FUl9UWVBFX19JTkZPLCBvbGRJbmZvLCBpbmZvKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgeworCQlTdHJpbmcgb2xkSWQgPSBpZDsKKwkJaWQgPSBuZXdJZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWpiUGFja2FnZS5USU1FUl9UWVBFX19JRCwgb2xkSWQsIGlkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1NDSEVEVUxFOgorCQkJCXJldHVybiBiYXNpY1NldFNjaGVkdWxlKG51bGwsIG1zZ3MpOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1RJTUVPVVRfTUVUSE9EOgorCQkJCXJldHVybiBiYXNpY1NldFRpbWVvdXRNZXRob2QobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19TQ0hFRFVMRToKKwkJCQlyZXR1cm4gZ2V0U2NoZWR1bGUoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19TVEFSVDoKKwkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19FTkQ6CisJCQkJcmV0dXJuIGdldEVuZCgpOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1RJTUVPVVRfTUVUSE9EOgorCQkJCXJldHVybiBnZXRUaW1lb3V0TWV0aG9kKCk7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fUEVSU0lTVEVOVDoKKwkJCQlyZXR1cm4gaXNQZXJzaXN0ZW50KCk7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fVElNRVpPTkU6CisJCQkJcmV0dXJuIGdldFRpbWV6b25lKCk7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fSU5GTzoKKwkJCQlyZXR1cm4gZ2V0SW5mbygpOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX0lEOgorCQkJCXJldHVybiBnZXRJZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fREVTQ1JJUFRJT046CisJCQkJZ2V0RGVzY3JpcHRpb24oKS5jbGVhcigpOworCQkJCWdldERlc2NyaXB0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19TQ0hFRFVMRToKKwkJCQlzZXRTY2hlZHVsZSgoVGltZXJTY2hlZHVsZVR5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19TVEFSVDoKKwkJCQlzZXRTdGFydCgoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19FTkQ6CisJCQkJc2V0RW5kKChYTUxHcmVnb3JpYW5DYWxlbmRhciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1RJTUVPVVRfTUVUSE9EOgorCQkJCXNldFRpbWVvdXRNZXRob2QoKE5hbWVkTWV0aG9kVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1BFUlNJU1RFTlQ6CisJCQkJc2V0UGVyc2lzdGVudCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1RJTUVaT05FOgorCQkJCXNldFRpbWV6b25lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19JTkZPOgorCQkJCXNldEluZm8oKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX0lEOgorCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fREVTQ1JJUFRJT046CisJCQkJZ2V0RGVzY3JpcHRpb24oKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19TQ0hFRFVMRToKKwkJCQlzZXRTY2hlZHVsZSgoVGltZXJTY2hlZHVsZVR5cGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1NUQVJUOgorCQkJCXNldFN0YXJ0KFNUQVJUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fRU5EOgorCQkJCXNldEVuZChFTkRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19USU1FT1VUX01FVEhPRDoKKwkJCQlzZXRUaW1lb3V0TWV0aG9kKChOYW1lZE1ldGhvZFR5cGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1BFUlNJU1RFTlQ6CisJCQkJdW5zZXRQZXJzaXN0ZW50KCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1RJTUVaT05FOgorCQkJCXNldFRpbWV6b25lKFRJTUVaT05FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fSU5GTzoKKwkJCQlzZXRJbmZvKElORk9fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19JRDoKKwkJCQlzZXRJZChJRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIGRlc2NyaXB0aW9uICE9IG51bGwgJiYgIWRlc2NyaXB0aW9uLmlzRW1wdHkoKTsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19TQ0hFRFVMRToKKwkJCQlyZXR1cm4gc2NoZWR1bGUgIT0gbnVsbDsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19TVEFSVDoKKwkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKKwkJCWNhc2UgRWpiUGFja2FnZS5USU1FUl9UWVBFX19FTkQ6CisJCQkJcmV0dXJuIEVORF9FREVGQVVMVCA9PSBudWxsID8gZW5kICE9IG51bGwgOiAhRU5EX0VERUZBVUxULmVxdWFscyhlbmQpOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX1RJTUVPVVRfTUVUSE9EOgorCQkJCXJldHVybiB0aW1lb3V0TWV0aG9kICE9IG51bGw7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fUEVSU0lTVEVOVDoKKwkJCQlyZXR1cm4gaXNTZXRQZXJzaXN0ZW50KCk7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fVElNRVpPTkU6CisJCQkJcmV0dXJuIFRJTUVaT05FX0VERUZBVUxUID09IG51bGwgPyB0aW1lem9uZSAhPSBudWxsIDogIVRJTUVaT05FX0VERUZBVUxULmVxdWFscyh0aW1lem9uZSk7CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfVFlQRV9fSU5GTzoKKwkJCQlyZXR1cm4gSU5GT19FREVGQVVMVCA9PSBudWxsID8gaW5mbyAhPSBudWxsIDogIUlORk9fRURFRkFVTFQuZXF1YWxzKGluZm8pOworCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1RZUEVfX0lEOgorCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoc3RhcnQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoc3RhcnQpOworCQlyZXN1bHQuYXBwZW5kKCIsIGVuZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChlbmQpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBlcnNpc3RlbnQ6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChwZXJzaXN0ZW50RVNldCkgcmVzdWx0LmFwcGVuZChwZXJzaXN0ZW50KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCB0aW1lem9uZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCh0aW1lem9uZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaW5mbzogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpbmZvKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1RpbWVyVHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL21ldGFkYXRhL0VqYlBhY2thZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL21ldGFkYXRhL0VqYlBhY2thZ2UuamF2YQppbmRleCAxNzQ3NTM1Li44NjU0Njg5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC9tZXRhZGF0YS9FamJQYWNrYWdlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvbWV0YWRhdGEvRWpiUGFja2FnZS5qYXZhCkBAIC0zMSwyNjUgKzMxLDI0MyBAQAogICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAotICogICAgICAgQCgjKWVqYi1qYXJfM18wLnhzZHMJMS41MSAwMi8yMy8wNgotICogICAgIAogICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBqYXZhZWUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAorICogICAgICAgJElkOiBFamJQYWNrYWdlLmphdmEsdiAxLjUgMjAxMC8wNS8xOSAxOTo1MzoxMSBjYW5kZXJzb24gRXhwICQKICAqICAgICAgIAorICogICAgIAogICogCi0gKiAJVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEVKQiAzLjAgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICogCVRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZCAiTUVUQS1JTkYvZWpiLWphci54bWwiIGluCi0gKiAJdGhlIEVKQidzIGphciBmaWxlLiAgQWxsIEVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgaW5kaWNhdGUKLSAqIAl0aGUgZWpiLWphciBzY2hlbWEgYnkgdXNpbmcgdGhlIEphdmEgRUUgbmFtZXNwYWNlOgotICogCi0gKiAJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0gKiAKLSAqIAlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gKiAJdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLSAqIAotICogCSAgICAmbHQ7ZWpiLWphciB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICogCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gKiAJICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUKLSAqIAkJICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkIgotICogCSAgICAgIHZlcnNpb249IjMuMCImZ3Q7Ci0gKiAJICAgICAgLi4uCi0gKiAJICAgICZsdDsvZWpiLWphciZndDsKLSAqIAotICogCVRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgotICogCXRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIHRoZQotICogCUphdmEgRUUgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKLSAqIAotICogCWh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9lamItamFyXzNfMC54c2QKLSAqIAotICogCQorICogPCFbQ0RBVEFbWworICogICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEVKQiAzLjEgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICogICAgICAgCisgKiAgICAgICBBbGwgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBpbmRpY2F0ZQorICogICAgICAgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRSBuYW1lc3BhY2U6CisgKiAgICAgICAKKyAqICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQorICogICAgICAgCisgKiAgICAgICBhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5CisgKiAgICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgorICogICAgICAgCisgKiAgICAgICA8ZWpiLWphciB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICogICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAqICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCisgKiAgICAgICAJICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzEueHNkIgorICogICAgICAgdmVyc2lvbj0iMy4xIj4KKyAqICAgICAgIC4uLgorICogICAgICAgPC9lamItamFyPgorICogICAgICAgCisgKiAgICAgICBUaGUgaW5zdGFuY2UgZG9jdW1lbnRzIG1heSBpbmRpY2F0ZSB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YKKyAqICAgICAgIHRoZSBzY2hlbWEgdXNpbmcgdGhlIHhzaTpzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIHRoZQorICogICAgICAgSmF2YSBFRSBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgorICogICAgICAgCisgKiAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzEueHNkCisgKiAgICAgICAKKyAqIF1dPgogICogICAgIAogICogCiAgKiAKICAqICAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKICAqICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAqIAorICogICAgICAgCiAgKiAgICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gKiAJc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAqIAlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAqIAl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAqIAlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICogCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICogCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICogCi0gKiAgICAgCi0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfNS54c2RzCTEuNjUgMDYvMDIvMTcKKyAqICAgICAgIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90CisgKiAgICAgICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKKyAqICAgICAgIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKKyAqICAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCisgKiAgICAgICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQorICogICAgICAgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCisgKiAgICAgICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KKyAqICAgICAgIAogICogICAgIAogICogCiAgKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCisgKiAgICAgICAkSWQ6IEVqYlBhY2thZ2UuamF2YSx2IDEuNSAyMDEwLzA1LzE5IDE5OjUzOjExIGNhbmRlcnNvbiBFeHAgJAorICogICAgICAgCiAgKiAgICAgCiAgKiAKICAqIAotICogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi0gKiBzaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLSAqIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLSAqIAotICogRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogICAgIGoyZWUgYXBwbGljYXRpb247Ci0gKiAgICAgYXBwbGljYXRpb24gY2xpZW50OwotICogICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAqICAgICBlbnRlcnByaXNlIGJlYW47Ci0gKiAgICAgcmVzb3VyY2UgYWRhcHRlcjsKLSAqIAotICogRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBlYXIgZmlsZTsKLSAqICAgICB3YXIgZmlsZTsKLSAqICAgICBqYXIgZmlsZTsKLSAqICAgICByYXIgZmlsZTsKLSAqIAotICogCi0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkcwkxLjE5IDAyLzEzLzA2CisgKiAgICAgICBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KKyAqICAgICAgIHNoYXJlYWJsZSBzY2hlbWEocykgb2YgSmF2YSBFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQorICogICAgICAgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgorICogICAgICAgCisgKiAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICBqYXZhIGVlIGFwcGxpY2F0aW9uOworICogICAgICAgYXBwbGljYXRpb24gY2xpZW50OworICogICAgICAgd2ViIGFwcGxpY2F0aW9uOworICogICAgICAgZW50ZXJwcmlzZSBiZWFuOworICogICAgICAgcmVzb3VyY2UgYWRhcHRlcjsgCisgKiAgICAgICAKKyAqICAgICAgIERlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICBlYXIgZmlsZTsKKyAqICAgICAgIHdhciBmaWxlOworICogICAgICAgamFyIGZpbGU7CisgKiAgICAgICByYXIgZmlsZTsKKyAqICAgICAgIAogICogICAgIAogICogCiAgKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCisgKiAgICAgICAkSWQ6IEVqYlBhY2thZ2UuamF2YSx2IDEuNSAyMDEwLzA1LzE5IDE5OjUzOjExIGNhbmRlcnNvbiBFeHAgJAorICogICAgICAgCiAgKiAgICAgCiAgKiAKICAqIAogICogICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLSAqIAorICogICAgICAgCiAgKiAgICAgCiAgKiAKLSAqICAgIFNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCBhbmQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZXNwYWNlLgorICogICAgPGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgKiAgICAgPGgxPkFib3V0IHRoZSBYTUwgbmFtZXNwYWNlPC9oMT4KICAqIAotICogICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCi0gKiAgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgCi0gKiAKLSAqICAgICBOb3RlIHRoYXQgbG9jYWwgbmFtZXMgaW4gdGhpcyBuYW1lc3BhY2UgYXJlIGludGVuZGVkIHRvIGJlIGRlZmluZWQKLSAqICAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUKLSAqICAgICBmb2xsb3dpbmcgbmFtZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFuZCBzaG91bGQKLSAqICAgICBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZyBHcm91cCwKLSAqICAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZToKLSAqIAotICogICAgIGJhc2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkKLSAqICAgICAgICAgIHJlbGF0aXZlIFVSSXMgaW4gdGhlIHNjb3BlIG9mIHRoZSBlbGVtZW50IG9uIHdoaWNoIGl0Ci0gKiAgICAgICAgICBhcHBlYXJzOyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBpZCAgIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4KLSAqICAgICAgICAgIFRoZSB4bWw6aWQgc3BlY2lmaWNhdGlvbiBpcyBub3QgeWV0IGEgVzNDIFJlY29tbWVuZGF0aW9uLAotICogICAgICAgICAgYnV0IHRoaXMgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGhlcmUgdG8gZmFjaWxpdGF0ZSBleHBlcmltZW50YXRpb24KLSAqICAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQKLSAqICAgICAgICAgIGluIHRoZSBzcGVjaWFsQXR0cnMgYXR0cmlidXRlIGdyb3VwLgotICogCi0gKiAgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgotICogICAgICAgICAgYW55IGVsZW1lbnQ7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCisgKiAgICAgICBzdWl0YWJsZSBmb3IgaW1wb3J0IGJ5IG90aGVyIHNjaGVtYSBkb2N1bWVudHMuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwiPgorICogICAgICAgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWw8L2E+IGFuZAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCI+CisgKiAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sPC9hPiBmb3IgaW5mb3JtYXRpb24gCisgKiAgICAgICBhYm91dCB0aGlzIG5hbWVzcGFjZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIE5vdGUgdGhhdCBsb2NhbCBuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgaW50ZW5kZWQgdG8gYmUKKyAqICAgICAgIGRlZmluZWQgb25seSBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBvciBpdHMgc3ViZ3JvdXBzLgorICogICAgICAgVGhlIG5hbWVzIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBsaXN0ZWQgYmVsb3cuCisgKiAgICAgICBUaGV5IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZworICogICAgICAgR3JvdXAsIHNwZWNpZmljYXRpb24sIG9yIGRvY3VtZW50IGluc3RhbmNlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPiAgIAorICogICAgICAgU2VlIGZ1cnRoZXIgYmVsb3cgaW4gdGhpcyBkb2N1bWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8YSBocmVmPSIjdXNhZ2UiPmhvdyB0byByZWZlciB0byB0aGlzIHNjaGVtYSBkb2N1bWVudCBmcm9tIHlvdXIgb3duCisgKiAgICAgICBYU0Qgc2NoZW1hIGRvY3VtZW50czwvYT4gYW5kIGFib3V0IDxhIGhyZWY9IiNuc3ZlcnNpb25pbmciPnRoZQorICogICAgICAgbmFtZXNwYWNlLXZlcnNpb25pbmcgcG9saWN5IGdvdmVybmluZyB0aGlzIHNjaGVtYSBkb2N1bWVudDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgogICogICAKLSAqICAgICBzcGFjZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZQotICogICAgICAgICAgdmFsdWUgaXMgYSBrZXl3b3JkIGluZGljYXRpbmcgd2hhdCB3aGl0ZXNwYWNlIHByb2Nlc3NpbmcKLSAqICAgICAgICAgIGRpc2NpcGxpbmUgaXMgaW50ZW5kZWQgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50OyBpdHMKLSAqICAgICAgICAgIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSB2aXJ0dWUgb2YgaXRzCi0gKiAgICAgICAgICBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KICAqIAotICogICAgIEZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTogZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKLSAqICAgICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKLSAqICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCi0gKiAgICAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKKyAqICAgIDxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgCisgKiAgICAgPGgzPkZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTwvaDM+IAogICogCi0gKiAgICAgICAgICAgICAgSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZCBkZWRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mIEZlYnJ1YXJ5LCAyMDAwCi0gKiAgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZQotICogICAgICAgICAgICAgIHhtbDpGYXRoZXIKKyAqICAgICA8ZGl2IGNsYXNzPSJib2R5dGV4dCI+CisgKiAgICAgIDxwPgorICogICAgICAgZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKKyAqICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKKyAqICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCisgKiAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKKyAqICAgICAgPC9wPgorICogICAgICA8YmxvY2txdW90ZT4KKyAqICAgICAgICA8cD4KKyAqIAlJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kCisgKiAJZGVkaWNhdGlvbiB0aGUgVzNDIFhNTCBQbGVuYXJ5IG9uIHRoaXMgMTB0aCBkYXkgb2YKKyAqIAlGZWJydWFyeSwgMjAwMCwgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5CisgKiAJdGhlIFhNTCBuYW1lICJ4bWw6RmF0aGVyIi4KKyAqICAgICAgICA8L3A+CisgKiAgICAgIDwvYmxvY2txdW90ZT4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgogICogICAKLSAqIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwCi0gKiAgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkKLSAqICAgICAgICAgc2NoZW1hcyB3aXNoaW5nIHRvIGFsbG93IHhtbDpiYXNlLCB4bWw6bGFuZywgeG1sOnNwYWNlIG9yIHhtbDppZAotICogICAgICAgICBhdHRyaWJ1dGVzIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgogICogCi0gKiAgICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCi0gKiAgICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgotICogICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gKiAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLyZndDsKKyAqICAgIDxkaXYgaWQ9InVzYWdlIiB4bWw6aWQ9InVzYWdlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgKiAgICAgPGgyPgorICogICAgICAgPGEgbmFtZT0idXNhZ2UiPkFib3V0IHRoaXMgc2NoZW1hIGRvY3VtZW50PC9hPgorICogICAgIDwvaDI+CiAgKiAKLSAqICAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcwotICogICAgICAgICBvciB0aGUgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwIHN1aXRhYmxlCisgKiAgICAgICBmb3IgdXNlIGJ5IHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyA8Y29kZT54bWw6YmFzZTwvY29kZT4sCisgKiAgICAgICA8Y29kZT54bWw6bGFuZzwvY29kZT4sIDxjb2RlPnhtbDpzcGFjZTwvY29kZT4gb3IKKyAqICAgICAgIDxjb2RlPnhtbDppZDwvY29kZT4gYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hIGZvcgorICogICAgICAgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKKyAqICAgICAgPC9wPgorICogICAgICA8cHJlPgorICogICAgICAgICAgICZsdDtzY2hlbWEgLiAuIC4mZ3Q7CisgKiAgICAgICAgICAgIC4gLiAuCisgKiAgICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICBvcgorICogICAgICA8L3A+CisgKiAgICAgIDxwcmU+CisgKiAgICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZCIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzIG9yIHRoZQorICogICAgICAgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHByZT4KKyAqICAgICAgICAgICAmbHQ7dHlwZSAuIC4gLiZndDsKKyAqICAgICAgICAgICAgLiAuIC4KKyAqICAgICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UgZWxlbWVudAorICogICAgICAgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlcy4KKyAqICAgICAgPC9wPgorICogICAgIDwvZGl2PgorICogICAgPC9kaXY+CisgKiAgIAogICogCi0gKiAgICAgICAgICZsdDt0eXBlIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLyZndDsKLSAqICAKLSAqICAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICogICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzCi0gKiBJbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gKiAgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkLgotICogICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAqICAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gKiAgICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gKiAgICBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwKLSAqICAgIFNjaGVtYSBvciBYTUwgbmFtZXNwYWNlcyBjaGFuZ2UsIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCB3aWxsIGNoYW5nZQotICogICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2Qgd2lsbCBub3QgY2hhbmdlLgorICogICAgPGRpdiBpZD0ibnN2ZXJzaW9uaW5nIiB4bWw6aWQ9Im5zdmVyc2lvbmluZyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgIDxoMj4KKyAqICAgICAgIDxhIG5hbWU9Im5zdmVyc2lvbmluZyI+VmVyc2lvbmluZyBwb2xpY3kgZm9yIHRoaXMgc2NoZW1hIGRvY3VtZW50PC9hPgorICogICAgIDwvaDI+CisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIEluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKKyAqICAgICAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0CisgKiAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QiPgorICogICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Q8L2E+LgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKKyAqICAgICAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTAorICogICAgICAgU2NoZW1hIGl0c2VsZiwgb3Igd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywKKyAqICAgICAgIGlmIHRoZSBYTUwgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcworICogICAgICAgZG9jdW1lbnQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QgCisgKiAgICAgICA8L2E+IAorICogICAgICAgd2lsbCBjaGFuZ2UgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0IAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QgCisgKiAgICAgICA8L2E+IAorICogICAgICAgd2lsbCBub3QgY2hhbmdlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgUHJldmlvdXMgZGF0ZWQgKGFuZCB1bmNoYW5naW5nKSB2ZXJzaW9ucyBvZiB0aGlzIHNjaGVtYSAKKyAqICAgICAgIGRvY3VtZW50IGFyZSBhdDoKKyAqICAgICAgPC9wPgorICogICAgICA8dWw+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwNy8wOC94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA3LzA4L3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8xMC94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA0LzEwL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgIDwvdWw+CisgKiAgICAgPC9kaXY+CisgKiAgICA8L2Rpdj4KICAqICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVqYkZhY3RvcnkKQEAgLTMwNyw5ICsyODUsMTEgQEAKIAkvKioKIAkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhlIHBhY2thZ2UgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggdGhlIEphdmEgRUUgNSBhbmQgSmF2YSBFRSA2IHhzZHMsIHNpbmNlIGl0IGlzIHVzZWQgZm9yIGJvdGgKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKi8KIAlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkIjsgLy8kTk9OLU5MUy0xJAorCVN0cmluZyBlTlNfVVJJMiA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzEueHNkIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCiAJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCkBAIC0zMjgsNiArMzA4LDUyIEBACiAJRWpiUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsLmluaXQoKTsKIAogCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY2Nlc3NUaW1lb3V0VHlwZUltcGwgPGVtPkFjY2VzcyBUaW1lb3V0IFR5cGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjY2Vzc1RpbWVvdXRUeXBlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBY2Nlc3NUaW1lb3V0VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBBQ0NFU1NfVElNRU9VVF9UWVBFID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lb3V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUNDRVNTX1RJTUVPVVRfVFlQRV9fVElNRU9VVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFDQ0VTU19USU1FT1VUX1RZUEVfX1VOSVQgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUNDRVNTX1RJTUVPVVRfVFlQRV9fSUQgPSAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjY2VzcyBUaW1lb3V0IFR5cGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUNDRVNTX1RJTUVPVVRfVFlQRV9GRUFUVVJFX0NPVU5UID0gMzsKKworCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnSW1wbCA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn0nIGNsYXNzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0zMzUsNyArMzYxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QWN0aXZhdGlvbkNvbmZpZygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJRyA9IDA7CisJaW50IEFDVElWQVRJT05fQ09ORklHID0gMTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMzgxLDcgKzQwNyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBBQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWSA9IDE7CisJaW50IEFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZID0gMjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC00MjcsNyArNDUzLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QXBwbGljYXRpb25FeGNlcHRpb24oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgQVBQTElDQVRJT05fRVhDRVBUSU9OID0gMjsKKwlpbnQgQVBQTElDQVRJT05fRVhDRVBUSU9OID0gMzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNlcHRpb24gQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTQ0OCwxMyArNDc0LDIyIEBACiAJaW50IEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fUk9MTEJBQ0sgPSAxOwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaGVyaXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fSU5IRVJJVEVEID0gMjsKKworCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fSUQgPSAyOworCWludCBBUFBMSUNBVElPTl9FWENFUFRJT05fX0lEID0gMzsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb248L2VtPicgY2xhc3MuCkBAIC00NjMsNyArNDk4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgQVBQTElDQVRJT05fRVhDRVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSAzOworCWludCBBUFBMSUNBVElPTl9FWENFUFRJT05fRkVBVFVSRV9DT1VOVCA9IDQ7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXJvdW5kSW52b2tlVHlwZUltcGwgPGVtPkFyb3VuZCBJbnZva2UgVHlwZTwvZW0+fScgY2xhc3MuCkBAIC00NzMsNyArNTA4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QXJvdW5kSW52b2tlVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBBUk9VTkRfSU5WT0tFX1RZUEUgPSAzOworCWludCBBUk9VTkRfSU5WT0tFX1RZUEUgPSA0OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC01MDMsNiArNTM4LDQzIEBACiAJaW50IEFST1VORF9JTlZPS0VfVFlQRV9GRUFUVVJFX0NPVU5UID0gMjsKIAogCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bcm91bmRUaW1lb3V0VHlwZUltcGwgPGVtPkFyb3VuZCBUaW1lb3V0IFR5cGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFyb3VuZFRpbWVvdXRUeXBlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBcm91bmRUaW1lb3V0VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBBUk9VTkRfVElNRU9VVF9UWVBFID0gNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFST1VORF9USU1FT1VUX1RZUEVfX0NMQVNTID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFST1VORF9USU1FT1VUX1RZUEVfX01FVEhPRF9OQU1FID0gMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Bcm91bmQgVGltZW91dCBUeXBlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFST1VORF9USU1FT1VUX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDI7CisKKwkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXNzZW1ibHlEZXNjcmlwdG9ySW1wbCA8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTUxMCw3ICs1ODIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBc3NlbWJseURlc2NyaXB0b3IoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUiA9IDQ7CisJaW50IEFTU0VNQkxZX0RFU0NSSVBUT1IgPSA2OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTU5NCw2ICs2NjYsNTIgQEAKIAlpbnQgQVNTRU1CTFlfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gODsKIAogCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3luY01ldGhvZFR5cGVJbXBsIDxlbT5Bc3luYyBNZXRob2QgVHlwZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXN5bmNNZXRob2RUeXBlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBc3luY01ldGhvZFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQVNZTkNfTUVUSE9EX1RZUEUgPSA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVNZTkNfTUVUSE9EX1RZUEVfX01FVEhPRF9OQU1FID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVNZTkNfTUVUSE9EX1RZUEVfX01FVEhPRF9QQVJBTVMgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVNZTkNfTUVUSE9EX1RZUEVfX0lEID0gMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Bc3luYyBNZXRob2QgVHlwZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBU1lOQ19NRVRIT0RfVFlQRV9GRUFUVVJFX0NPVU5UID0gMzsKKworCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVBGaWVsZEltcGwgPGVtPkNNUCBGaWVsZDwvZW0+fScgY2xhc3MuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTYwMSw3ICs3MTksNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDTVBGaWVsZCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBDTVBfRklFTEQgPSA1OworCWludCBDTVBfRklFTEQgPSA4OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC02NDcsNyArNzY1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q01SRmllbGQoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgQ01SX0ZJRUxEID0gNjsKKwlpbnQgQ01SX0ZJRUxEID0gOTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNjk1LDYgKzgxMyw2MSBAQAogCWludCBDTVJfRklFTERfRkVBVFVSRV9DT1VOVCA9IDQ7CiAKIAkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQ29uY3VycmVudE1ldGhvZFR5cGVJbXBsIDxlbT5Db25jdXJyZW50IE1ldGhvZCBUeXBlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Db25jdXJyZW50TWV0aG9kVHlwZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q29uY3VycmVudE1ldGhvZFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRSA9IDEwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX01FVEhPRCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jazwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX0xPQ0sgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBUaW1lb3V0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fQUNDRVNTX1RJTUVPVVQgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fSUQgPSAzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbmN1cnJlbnQgTWV0aG9kIFR5cGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9GRUFUVVJFX0NPVU5UID0gNDsKKworCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Db250YWluZXJUcmFuc2FjdGlvblR5cGVJbXBsIDxlbT5Db250YWluZXIgVHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgY2xhc3MuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTcwMiw3ICs4NzUsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgQ09OVEFJTkVSX1RSQU5TQUNUSU9OX1RZUEUgPSA3OworCWludCBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRSA9IDExOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03NTAsODYgKzkyMywyMyBAQAogCWludCBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9GRUFUVVJFX0NPVU5UID0gNDsKIAogCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJJbXBsIDxlbT5FSkIgSmFyPC9lbT59JyBjbGFzcy4KKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRGVwZW5kc09uVHlwZUltcGwgPGVtPkRlcGVuZHMgT24gVHlwZTwvZW0+fScgY2xhc3MuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJKYXIoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5EZXBlbmRzT25UeXBlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXREZXBlbmRzT25UeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IEVKQl9KQVIgPSA4OworCWludCBERVBFTkRTX09OX1RZUEUgPSAxMjsKIAogCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgRUpCX0pBUl9fREVTQ1JJUFRJT05TID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19ESVNQTEFZX05BTUVTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fSUNPTlMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGVycHJpc2UgQmVhbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19JTlRFUkNFUFRPUlMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aW9uc2hpcHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19SRUxBVElPTlNISVBTID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NlbWJseSBEZXNjcmlwdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIENsaWVudCBKYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFSkJfSkFSX19FSkJfQ0xJRU5UX0pBUiA9IDc7CisJaW50IERFUEVORFNfT05fVFlQRV9fRUpCX05BTUUgPSAwOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC04MzgsNyArOTQ4LDExNiBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBFSkJfSkFSX19JRCA9IDg7CisJaW50IERFUEVORFNfT05fVFlQRV9fSUQgPSAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlcGVuZHMgT24gVHlwZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBERVBFTkRTX09OX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDI7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbCA8ZW0+RUpCIEphcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJKYXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgRUpCX0pBUiA9IDEzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRUpCX0pBUl9fTU9EVUxFX05BTUUgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRUpCX0pBUl9fREVTQ1JJUFRJT05TID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFSkJfSkFSX19ESVNQTEFZX05BTUVTID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRUpCX0pBUl9fSUNPTlMgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGVycHJpc2UgQmVhbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFSkJfSkFSX19FTlRFUlBSSVNFX0JFQU5TID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFSkJfSkFSX19JTlRFUkNFUFRPUlMgPSA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbGF0aW9uc2hpcHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFSkJfSkFSX19SRUxBVElPTlNISVBTID0gNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NlbWJseSBEZXNjcmlwdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgRUpCX0pBUl9fQVNTRU1CTFlfREVTQ1JJUFRPUiA9IDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIENsaWVudCBKYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFSkJfSkFSX19FSkJfQ0xJRU5UX0pBUiA9IDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFSkJfSkFSX19JRCA9IDk7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTg0Nyw3ICsxMDY2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgRUpCX0pBUl9fTUVUQURBVEFfQ09NUExFVEUgPSA5OworCWludCBFSkJfSkFSX19NRVRBREFUQV9DT01QTEVURSA9IDEwOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTg1Niw3ICsxMDc1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgRUpCX0pBUl9fVkVSU0lPTiA9IDEwOworCWludCBFSkJfSkFSX19WRVJTSU9OID0gMTE7CiAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RUpCIEphcjwvZW0+JyBjbGFzcy4KQEAgLTg2NSw3ICsxMDg0LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgRUpCX0pBUl9GRUFUVVJFX0NPVU5UID0gMTE7CisJaW50IEVKQl9KQVJfRkVBVFVSRV9DT1VOVCA9IDEyOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCA8ZW0+RUpCIEphciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgpAQCAtODc1LDcgKzEwOTQsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBFSkJfSkFSX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IDk7CisJaW50IEVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SID0gMTQ7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgpAQCAtOTMwLDcgKzExNDksNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFSkJSZWxhdGlvbigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBFSkJfUkVMQVRJT04gPSAxMDsKKwlpbnQgRUpCX1JFTEFUSU9OID0gMTU7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTk4NSw3ICsxMjA0LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBFSkJfUkVMQVRJT05TSElQX1JPTEUgPSAxMTsKKwlpbnQgRUpCX1JFTEFUSU9OU0hJUF9ST0xFID0gMTY7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEwNjcsNyArMTI4Niw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEVudGVycHJpc2VCZWFucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBFTlRFUlBSSVNFX0JFQU5TID0gMTI7CisJaW50IEVOVEVSUFJJU0VfQkVBTlMgPSAxNzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCkBAIC0xMTMxLDcgKzEzNTAsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFbnRpdHlCZWFuKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IEVOVElUWV9CRUFOID0gMTM7CisJaW50IEVOVElUWV9CRUFOID0gMTg7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEzODYsMTMgKzE2MDUsMjIgQEAKIAlpbnQgRU5USVRZX0JFQU5fX1BSRV9ERVNUUk9ZUyA9IDI3OwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGEgU291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBFTlRJVFlfQkVBTl9fREFUQV9TT1VSQ0UgPSAyODsKKworCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IEVOVElUWV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMgPSAyODsKKwlpbnQgRU5USVRZX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IDI5OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IElkZW50aXR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC0xNDAxLDcgKzE2MjksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBFTlRJVFlfQkVBTl9fU0VDVVJJVFlfSURFTlRJVFkgPSAyOTsKKwlpbnQgRU5USVRZX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRZID0gMzA7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xNDEwLDcgKzE2MzgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBFTlRJVFlfQkVBTl9fUVVFUklFUyA9IDMwOworCWludCBFTlRJVFlfQkVBTl9fUVVFUklFUyA9IDMxOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xNDE5LDcgKzE2NDcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBFTlRJVFlfQkVBTl9fSUQgPSAzMTsKKwlpbnQgRU5USVRZX0JFQU5fX0lEID0gMzI7CiAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RW50aXR5IEJlYW48L2VtPicgY2xhc3MuCkBAIC0xNDI4LDcgKzE2NTYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBFTlRJVFlfQkVBTl9GRUFUVVJFX0NPVU5UID0gMzI7CisJaW50IEVOVElUWV9CRUFOX0ZFQVRVUkVfQ09VTlQgPSAzMzsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FeGNsdWRlTGlzdEltcGwgPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+fScgY2xhc3MuCkBAIC0xNDM4LDcgKzE2NjYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFeGNsdWRlTGlzdCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBFWENMVURFX0xJU1QgPSAxNDsKKwlpbnQgRVhDTFVERV9MSVNUID0gMTk7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE0ODQsNyArMTcxMiw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEluaXRNZXRob2RUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IElOSVRfTUVUSE9EX1RZUEUgPSAxNTsKKwlpbnQgSU5JVF9NRVRIT0RfVFlQRSA9IDIwOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0ZSBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTE1MzAsNyArMTc1OCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEludGVyY2VwdG9yQmluZGluZ1R5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgSU5URVJDRVBUT1JfQklORElOR19UWVBFID0gMTY7CisJaW50IElOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRSA9IDIxOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xNjIxLDcgKzE4NDksNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRJbnRlcmNlcHRvck9yZGVyVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBJTlRFUkNFUFRPUl9PUkRFUl9UWVBFID0gMTc7CisJaW50IElOVEVSQ0VQVE9SX09SREVSX1RZUEUgPSAyMjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmNlcHRvciBDbGFzc2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KQEAgLTE2NTgsNyArMTg4Niw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldEludGVyY2VwdG9yc1R5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgSU5URVJDRVBUT1JTX1RZUEUgPSAxODsKKwlpbnQgSU5URVJDRVBUT1JTX1RZUEUgPSAyMzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTcwNCw3ICsxOTMyLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0SW50ZXJjZXB0b3JUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEUgPSAxOTsKKwlpbnQgSU5URVJDRVBUT1JfVFlQRSA9IDI0OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xNzM0LDEzICsxOTYyLDIyIEBACiAJaW50IElOVEVSQ0VQVE9SX1RZUEVfX0FST1VORF9JTlZPS0VTID0gMjsKIAogCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bcm91bmQgVGltZW91dHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOVEVSQ0VQVE9SX1RZUEVfX0FST1VORF9USU1FT1VUUyA9IDM7CisKKwkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX0VOVl9FTlRSSUVTID0gMzsKKwlpbnQgSU5URVJDRVBUT1JfVFlQRV9fRU5WX0VOVFJJRVMgPSA0OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE3NDksNyArMTk4Niw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX0VKQl9SRUZTID0gNDsKKwlpbnQgSU5URVJDRVBUT1JfVFlQRV9fRUpCX1JFRlMgPSA1OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE3NTgsNyArMTk5NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX0VKQl9MT0NBTF9SRUZTID0gNTsKKwlpbnQgSU5URVJDRVBUT1JfVFlQRV9fRUpCX0xPQ0FMX1JFRlMgPSA2OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xNzY3LDcgKzIwMDQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19TRVJWSUNFX1JFRlMgPSA2OworCWludCBJTlRFUkNFUFRPUl9UWVBFX19TRVJWSUNFX1JFRlMgPSA3OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTc3Niw3ICsyMDEzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfUkVGUyA9IDc7CisJaW50IElOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX1JFRlMgPSA4OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE3ODUsNyArMjAyMiw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX1JFU09VUkNFX0VOVl9SRUZTID0gODsKKwlpbnQgSU5URVJDRVBUT1JfVFlQRV9fUkVTT1VSQ0VfRU5WX1JFRlMgPSA5OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xNzk0LDcgKzIwMzEsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSA5OworCWludCBJTlRFUkNFUFRPUl9UWVBFX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSAxMDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTgwMyw3ICsyMDQwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTID0gMTA7CisJaW50IElOVEVSQ0VQVE9SX1RZUEVfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyA9IDExOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xODEyLDcgKzIwNDksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSAxMTsKKwlpbnQgSU5URVJDRVBUT1JfVFlQRV9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTID0gMTI7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE4MjEsNyArMjA1OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX1BPU1RfQ09OU1RSVUNUUyA9IDEyOworCWludCBJTlRFUkNFUFRPUl9UWVBFX19QT1NUX0NPTlNUUlVDVFMgPSAxMzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTgzMCw3ICsyMDY3LDE2IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX1BSRV9ERVNUUk9ZUyA9IDEzOworCWludCBJTlRFUkNFUFRPUl9UWVBFX19QUkVfREVTVFJPWVMgPSAxNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhIFNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSU5URVJDRVBUT1JfVFlQRV9fREFUQV9TT1VSQ0UgPSAxNTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IEFjdGl2YXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xODM5LDcgKzIwODUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBJTlRFUkNFUFRPUl9UWVBFX19QT1NUX0FDVElWQVRFUyA9IDE0OworCWludCBJTlRFUkNFUFRPUl9UWVBFX19QT1NUX0FDVElWQVRFUyA9IDE2OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBQYXNzaXZhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE4NDgsNyArMjA5NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX1BSRV9QQVNTSVZBVEVTID0gMTU7CisJaW50IElOVEVSQ0VQVE9SX1RZUEVfX1BSRV9QQVNTSVZBVEVTID0gMTc7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTE4NTcsNyArMjEwMyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfX0lEID0gMTY7CisJaW50IElOVEVSQ0VQVE9SX1RZUEVfX0lEID0gMTg7CiAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SW50ZXJjZXB0b3IgVHlwZTwvZW0+JyBjbGFzcy4KQEAgLTE4NjYsNyArMjExMiw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IElOVEVSQ0VQVE9SX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE3OworCWludCBJTlRFUkNFUFRPUl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSAxOTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXNzYWdlRHJpdmVuQmVhbkltcGwgPGVtPk1lc3NhZ2UgRHJpdmVuIEJlYW48L2VtPn0nIGNsYXNzLgpAQCAtMTg3Niw3ICsyMTIyLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTiA9IDIwOworCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOID0gMjU7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE5NTEsMTMgKzIxOTcsMjIgQEAKIAlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRU9VVF9NRVRIT0QgPSA3OwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19USU1FUiA9IDg7CisKKwkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEUgPSA4OworCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFID0gOTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTE5NjYsNyArMjIyMSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fVFlQRSA9IDk7CisJaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fVFlQRSA9IDEwOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gTGluazwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMTk3NSw3ICsyMjMwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fTUVTU0FHRV9ERVNUSU5BVElPTl9MSU5LID0gMTA7CisJaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fTElOSyA9IDExOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb24gQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC0xOTg0LDcgKzIyMzksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19BQ1RJVkFUSU9OX0NPTkZJRyA9IDExOworCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19BQ1RJVkFUSU9OX0NPTkZJRyA9IDEyOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFyb3VuZCBJbnZva2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE5OTMsNyArMjI0OCwxNiBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19BUk9VTkRfSU5WT0tFUyA9IDEyOworCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19BUk9VTkRfSU5WT0tFUyA9IDEzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFyb3VuZCBUaW1lb3V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fQVJPVU5EX1RJTUVPVVRTID0gMTQ7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjAwMiw3ICsyMjY2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fRU5WX0VOVFJJRVMgPSAxMzsKKwlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fRU5WX0VOVFJJRVMgPSAxNTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yMDExLDcgKzIyNzUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfUkVGUyA9IDE0OworCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19FSkJfUkVGUyA9IDE2OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTIwMjAsNyArMjI4NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9MT0NBTF9SRUZTID0gMTU7CisJaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX0VKQl9MT0NBTF9SRUZTID0gMTc7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTIwMjksNyArMjI5Myw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFUlZJQ0VfUkVGUyA9IDE2OworCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19TRVJWSUNFX1JFRlMgPSAxODsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTIwMzgsNyArMjMwMiw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX1JFRlMgPSAxNzsKKwlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fUkVTT1VSQ0VfUkVGUyA9IDE5OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIEVudiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTIwNDcsNyArMjMxMSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTID0gMTg7CisJaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTID0gMjA7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTIwNTYsNyArMjMyMCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IDE5OworCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSAyMTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjA2NSw3ICsyMzI5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTID0gMjA7CisJaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyA9IDIyOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yMDc0LDcgKzIzMzgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSAyMTsKKwlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTID0gMjM7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTIwODMsNyArMjM0Nyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1BPU1RfQ09OU1RSVUNUUyA9IDIyOworCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19QT1NUX0NPTlNUUlVDVFMgPSAyNDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjA5Miw3ICsyMzU2LDI1IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fX1BSRV9ERVNUUk9ZUyA9IDIzOworCWludCBNRVNTQUdFX0RSSVZFTl9CRUFOX19QUkVfREVTVFJPWVMgPSAyNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXRhIFNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fREFUQV9TT1VSQ0UgPSAyNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlIFJlZjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VDVVJJVFlfUk9MRV9SRUYgPSAyNzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBJZGVudGl0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtMjEwMSw3ICsyMzgzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VDVVJJVFlfSURFTlRJVFkgPSAyNDsKKwlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fU0VDVVJJVFlfSURFTlRJVFkgPSAyODsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMjExMCw3ICsyMzkyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fSUQgPSAyNTsKKwlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9fSUQgPSAyOTsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXNzYWdlIERyaXZlbiBCZWFuPC9lbT4nIGNsYXNzLgpAQCAtMjExOSw3ICsyNDAxLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgTUVTU0FHRV9EUklWRU5fQkVBTl9GRUFUVVJFX0NPVU5UID0gMjY7CisJaW50IE1FU1NBR0VfRFJJVkVOX0JFQU5fRkVBVFVSRV9DT1VOVCA9IDMwOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBhcmFtc0ltcGwgPGVtPk1ldGhvZCBQYXJhbXM8L2VtPn0nIGNsYXNzLgpAQCAtMjEyOSw3ICsyNDExLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFyYW1zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IE1FVEhPRF9QQVJBTVMgPSAyMTsKKwlpbnQgTUVUSE9EX1BBUkFNUyA9IDI2OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYXJhbXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgpAQCAtMjE2Niw3ICsyNDQ4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TWV0aG9kUGVybWlzc2lvbigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBNRVRIT0RfUEVSTUlTU0lPTiA9IDIyOworCWludCBNRVRIT0RfUEVSTUlTU0lPTiA9IDI3OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yMjMwLDcgKzI1MTIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2RUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IE1FVEhPRF9UWVBFID0gMjM7CisJaW50IE1FVEhPRF9UWVBFID0gMjg7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTIzMDMsNyArMjU4NSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE5hbWVkTWV0aG9kVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBOQU1FRF9NRVRIT0RfVFlQRSA9IDI0OworCWludCBOQU1FRF9NRVRIT0RfVFlQRSA9IDI5OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0yMzQ5LDcgKzI2MzEsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRRdWVyeSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBRVUVSWSA9IDI1OworCWludCBRVUVSWSA9IDMwOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC0yNDEzLDcgKzI2OTUsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRRdWVyeU1ldGhvZCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBRVUVSWV9NRVRIT0QgPSAyNjsKKwlpbnQgUVVFUllfTUVUSE9EID0gMzE7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTI0NTksNyArMjc0MSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFID0gMjc7CisJaW50IFJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFID0gMzI7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTI1MDUsNyArMjc4Nyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFJlbGF0aW9uc2hpcHMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgUkVMQVRJT05TSElQUyA9IDI4OworCWludCBSRUxBVElPTlNISVBTID0gMzM7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTI1NTEsNyArMjgzMyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFJlbW92ZU1ldGhvZFR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgUkVNT1ZFX01FVEhPRF9UWVBFID0gMjk7CisJaW50IFJFTU9WRV9NRVRIT0RfVFlQRSA9IDM0OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJlYW4gTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC0yNTk3LDcgKzI4NzksNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRTZWN1cml0eUlkZW50aXR5VHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBTRUNVUklUWV9JREVOVElUWV9UWVBFID0gMzA7CisJaW50IFNFQ1VSSVRZX0lERU5USVRZX1RZUEUgPSAzNTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjY1Miw3ICsyOTM0LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0U2Vzc2lvbkJlYW4oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOID0gMzE7CisJaW50IFNFU1NJT05fQkVBTiA9IDM2OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yNzU0LDEzICszMDM2LDIyIEBACiAJaW50IFNFU1NJT05fQkVBTl9fQlVTSU5FU1NfUkVNT1RFUyA9IDEwOwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEJlYW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVNTSU9OX0JFQU5fX0xPQ0FMX0JFQU4gPSAxMTsKKworCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19TRVJWSUNFX0VORFBPSU5UID0gMTE7CisJaW50IFNFU1NJT05fQkVBTl9fU0VSVklDRV9FTkRQT0lOVCA9IDEyOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMjc2OSw3ICszMDYwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19FSkJfQ0xBU1MgPSAxMjsKKwlpbnQgU0VTU0lPTl9CRUFOX19FSkJfQ0xBU1MgPSAxMzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXNzaW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTI3NzgsNyArMzA2OSwxNiBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRSA9IDEzOworCWludCBTRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRSA9IDE0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXRlZnVsIFRpbWVvdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVNTSU9OX0JFQU5fX1NUQVRFRlVMX1RJTUVPVVQgPSAxNTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lb3V0IE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtMjc4Nyw3ICszMDg3LDUyIEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFNFU1NJT05fQkVBTl9fVElNRU9VVF9NRVRIT0QgPSAxNDsKKwlpbnQgU0VTU0lPTl9CRUFOX19USU1FT1VUX01FVEhPRCA9IDE2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVNTSU9OX0JFQU5fX1RJTUVSID0gMTc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBPbiBTdGFydHVwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VTU0lPTl9CRUFOX19JTklUX09OX1NUQVJUVVAgPSAxODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jdXJyZW5jeSBNYW5hZ2VtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVNTSU9OX0JFQU5fX0NPTkNVUlJFTkNZX01BTkFHRU1FTlRfVFlQRSA9IDE5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmN1cnJlbnQgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVNTSU9OX0JFQU5fX0NPTkNVUlJFTlRfTUVUSE9EID0gMjA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVwZW5kcyBPbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFU1NJT05fQkVBTl9fREVQRU5EU19PTiA9IDIxOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXQgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yNzk2LDcgKzMxNDEsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0lOSVRfTUVUSE9EUyA9IDE1OworCWludCBTRVNTSU9OX0JFQU5fX0lOSVRfTUVUSE9EUyA9IDIyOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbW92ZSBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTI4MDUsNyArMzE1MCwxNiBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1JFTU9WRV9NRVRIT0RTID0gMTY7CisJaW50IFNFU1NJT05fQkVBTl9fUkVNT1ZFX01FVEhPRFMgPSAyMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3luYyBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFU1NJT05fQkVBTl9fQVNZTkNfTUVUSE9EID0gMjQ7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMjgxNCw3ICszMTY4LDM0IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFNFU1NJT05fQkVBTl9fVFJBTlNBQ1RJT05fVFlQRSA9IDE3OworCWludCBTRVNTSU9OX0JFQU5fX1RSQU5TQUNUSU9OX1RZUEUgPSAyNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZnRlciBCZWdpbiBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVNTSU9OX0JFQU5fX0FGVEVSX0JFR0lOX01FVEhPRCA9IDI2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJlZm9yZSBDb21wbGV0aW9uIE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFU1NJT05fQkVBTl9fQkVGT1JFX0NPTVBMRVRJT05fTUVUSE9EID0gMjc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWZ0ZXIgQ29tcGxldGlvbiBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVNTSU9OX0JFQU5fX0FGVEVSX0NPTVBMRVRJT05fTUVUSE9EID0gMjg7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXJvdW5kIEludm9rZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjgyMyw3ICszMjA0LDE2IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFNFU1NJT05fQkVBTl9fQVJPVU5EX0lOVk9LRVMgPSAxODsKKwlpbnQgU0VTU0lPTl9CRUFOX19BUk9VTkRfSU5WT0tFUyA9IDI5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFyb3VuZCBUaW1lb3V0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VTU0lPTl9CRUFOX19BUk9VTkRfVElNRU9VVFMgPSAzMDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yODMyLDcgKzMyMjIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0VOVl9FTlRSSUVTID0gMTk7CisJaW50IFNFU1NJT05fQkVBTl9fRU5WX0VOVFJJRVMgPSAzMTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yODQxLDcgKzMyMzEsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0VKQl9SRUZTID0gMjA7CisJaW50IFNFU1NJT05fQkVBTl9fRUpCX1JFRlMgPSAzMjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FamIgTG9jYWwgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yODUwLDcgKzMyNDAsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX0VKQl9MT0NBTF9SRUZTID0gMjE7CisJaW50IFNFU1NJT05fQkVBTl9fRUpCX0xPQ0FMX1JFRlMgPSAzMzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjg1OSw3ICszMjQ5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19TRVJWSUNFX1JFRlMgPSAyMjsKKwlpbnQgU0VTU0lPTl9CRUFOX19TRVJWSUNFX1JFRlMgPSAzNDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTI4NjgsNyArMzI1OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfUkVGUyA9IDIzOworCWludCBTRVNTSU9OX0JFQU5fX1JFU09VUkNFX1JFRlMgPSAzNTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yODc3LDcgKzMyNjcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1JFU09VUkNFX0VOVl9SRUZTID0gMjQ7CisJaW50IFNFU1NJT05fQkVBTl9fUkVTT1VSQ0VfRU5WX1JFRlMgPSAzNjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjg4Niw3ICszMjc2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSAyNTsKKwlpbnQgU0VTU0lPTl9CRUFOX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMgPSAzNzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjg5NSw3ICszMjg1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMgPSAyNjsKKwlpbnQgU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMgPSAzODsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjkwNCw3ICszMjk0LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSAyNzsKKwlpbnQgU0VTU0lPTl9CRUFOX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSAzOTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjkxMyw3ICszMzAzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19QT1NUX0NPTlNUUlVDVFMgPSAyODsKKwlpbnQgU0VTU0lPTl9CRUFOX19QT1NUX0NPTlNUUlVDVFMgPSA0MDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjkyMiw3ICszMzEyLDE2IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFNFU1NJT05fQkVBTl9fUFJFX0RFU1RST1lTID0gMjk7CisJaW50IFNFU1NJT05fQkVBTl9fUFJFX0RFU1RST1lTID0gNDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBTb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFU1NJT05fQkVBTl9fREFUQV9TT1VSQ0UgPSA0MjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IEFjdGl2YXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yOTMxLDcgKzMzMzAsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1BPU1RfQUNUSVZBVEVTID0gMzA7CisJaW50IFNFU1NJT05fQkVBTl9fUE9TVF9BQ1RJVkFURVMgPSA0MzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUGFzc2l2YXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0yOTQwLDcgKzMzMzksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1BSRV9QQVNTSVZBVEVTID0gMzE7CisJaW50IFNFU1NJT05fQkVBTl9fUFJFX1BBU1NJVkFURVMgPSA0NDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMjk0OSw3ICszMzQ4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMgPSAzMjsKKwlpbnQgU0VTU0lPTl9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlMgPSA0NTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBJZGVudGl0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCkBAIC0yOTU4LDcgKzMzNTcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBTRVNTSU9OX0JFQU5fX1NFQ1VSSVRZX0lERU5USVRJRVMgPSAzMzsKKwlpbnQgU0VTU0lPTl9CRUFOX19TRUNVUklUWV9JREVOVElUSUVTID0gNDY7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTI5NjcsNyArMzM2Niw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFNFU1NJT05fQkVBTl9fSUQgPSAzNDsKKwlpbnQgU0VTU0lPTl9CRUFOX19JRCA9IDQ3OwogCiAJLyoqCiAJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlNlc3Npb24gQmVhbjwvZW0+JyBjbGFzcy4KQEAgLTI5NzYsNyArMzM3NSwyNDQgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgU0VTU0lPTl9CRUFOX0ZFQVRVUkVfQ09VTlQgPSAzNTsKKwlpbnQgU0VTU0lPTl9CRUFOX0ZFQVRVUkVfQ09VTlQgPSA0ODsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TdGF0ZWZ1bFRpbWVvdXRUeXBlSW1wbCA8ZW0+U3RhdGVmdWwgVGltZW91dCBUeXBlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5TdGF0ZWZ1bFRpbWVvdXRUeXBlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRTdGF0ZWZ1bFRpbWVvdXRUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFNUQVRFRlVMX1RJTUVPVVRfVFlQRSA9IDM3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWVvdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFURUZVTF9USU1FT1VUX1RZUEVfX1RJTUVPVVQgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTVEFURUZVTF9USU1FT1VUX1RZUEVfX1VOSVQgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU1RBVEVGVUxfVElNRU9VVF9UWVBFX19JRCA9IDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U3RhdGVmdWwgVGltZW91dCBUeXBlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNUQVRFRlVMX1RJTUVPVVRfVFlQRV9GRUFUVVJFX0NPVU5UID0gMzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5UaW1lclNjaGVkdWxlVHlwZUltcGwgPGVtPlRpbWVyIFNjaGVkdWxlIFR5cGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLlRpbWVyU2NoZWR1bGVUeXBlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUaW1lclNjaGVkdWxlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUSU1FUl9TQ0hFRFVMRV9UWVBFID0gMzg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2Vjb25kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVElNRVJfU0NIRURVTEVfVFlQRV9fU0VDT05EID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW51dGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUSU1FUl9TQ0hFRFVMRV9UWVBFX19NSU5VVEUgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvdXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUSU1FUl9TQ0hFRFVMRV9UWVBFX19IT1VSID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXkgT2YgTW9udGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUSU1FUl9TQ0hFRFVMRV9UWVBFX19EQVlfT0ZfTU9OVEggPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vbnRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVElNRVJfU0NIRURVTEVfVFlQRV9fTU9OVEggPSA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRheSBPZiBXZWVrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVElNRVJfU0NIRURVTEVfVFlQRV9fREFZX09GX1dFRUsgPSA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlllYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUSU1FUl9TQ0hFRFVMRV9UWVBFX19ZRUFSID0gNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRJTUVSX1NDSEVEVUxFX1RZUEVfX0lEID0gNzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UaW1lciBTY2hlZHVsZSBUeXBlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRJTUVSX1NDSEVEVUxFX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDg7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuVGltZXJUeXBlSW1wbCA8ZW0+VGltZXIgVHlwZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuVGltZXJUeXBlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUaW1lclR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVElNRVJfVFlQRSA9IDM5OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUSU1FUl9UWVBFX19ERVNDUklQVElPTiA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZWR1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUSU1FUl9UWVBFX19TQ0hFRFVMRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUSU1FUl9UWVBFX19TVEFSVCA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVElNRVJfVFlQRV9fRU5EID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lb3V0IE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRJTUVSX1RZUEVfX1RJTUVPVVRfTUVUSE9EID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVElNRVJfVFlQRV9fUEVSU0lTVEVOVCA9IDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZXpvbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBUSU1FUl9UWVBFX19USU1FWk9ORSA9IDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFRJTUVSX1RZUEVfX0lORk8gPSA3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVElNRVJfVFlQRV9fSUQgPSA4OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRpbWVyIFR5cGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgVElNRVJfVFlQRV9GRUFUVVJFX0NPVU5UID0gOTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ21wVmVyc2lvblR5cGUgPGVtPkNtcCBWZXJzaW9uIFR5cGU8L2VtPn0nIGVudW0uCkBAIC0yOTg2LDcgKzM2MjIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDbXBWZXJzaW9uVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBDTVBfVkVSU0lPTl9UWVBFID0gMzI7CisJaW50IENNUF9WRVJTSU9OX1RZUEUgPSA0MDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01SRmllbGRUeXBlIDxlbT5DTVIgRmllbGQgVHlwZTwvZW0+fScgZW51bS4KQEAgLTI5OTYsNyArMzYzMiwyNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDTVJGaWVsZFR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgQ01SX0ZJRUxEX1RZUEUgPSAzMzsKKwlpbnQgQ01SX0ZJRUxEX1RZUEUgPSA0MTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUgPGVtPkNvbmN1cnJlbmN5IE1hbmFnZW1lbnQgVHlwZSBUeXBlPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDT05DVVJSRU5DWV9NQU5BR0VNRU5UX1RZUEVfVFlQRSA9IDQyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TG9ja1R5cGVUeXBlIDxlbT5Db25jdXJyZW50IExvY2sgVHlwZSBUeXBlPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TG9ja1R5cGVUeXBlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldENvbmN1cnJlbnRMb2NrVHlwZVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ09OQ1VSUkVOVF9MT0NLX1RZUEVfVFlQRSA9IDQzOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RJbnRlcmZhY2VUeXBlIDxlbT5NZXRob2QgSW50ZXJmYWNlIFR5cGU8L2VtPn0nIGVudW0uCkBAIC0zMDA2LDcgKzM2NjIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2RJbnRlcmZhY2VUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IE1FVEhPRF9JTlRFUkZBQ0VfVFlQRSA9IDM0OworCWludCBNRVRIT0RfSU5URVJGQUNFX1RZUEUgPSA0NDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTXVsdGlwbGljaXR5VHlwZSA8ZW0+TXVsdGlwbGljaXR5IFR5cGU8L2VtPn0nIGVudW0uCkBAIC0zMDE2LDcgKzM2NzIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNdWx0aXBsaWNpdHlUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IE1VTFRJUExJQ0lUWV9UWVBFID0gMzU7CisJaW50IE1VTFRJUExJQ0lUWV9UWVBFID0gNDU7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlBlcnNpc3RlbmNlVHlwZSA8ZW0+UGVyc2lzdGVuY2UgVHlwZTwvZW0+fScgZW51bS4KQEAgLTMwMjYsNyArMzY4Miw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFBlcnNpc3RlbmNlVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBQRVJTSVNURU5DRV9UWVBFID0gMzY7CisJaW50IFBFUlNJU1RFTkNFX1RZUEUgPSA0NjsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuUmVzdWx0VHlwZU1hcHBpbmdUeXBlIDxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGU8L2VtPn0nIGVudW0uCkBAIC0zMDM2LDcgKzM2OTIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRSZXN1bHRUeXBlTWFwcGluZ1R5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgUkVTVUxUX1RZUEVfTUFQUElOR19UWVBFID0gMzc7CisJaW50IFJFU1VMVF9UWVBFX01BUFBJTkdfVFlQRSA9IDQ3OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uVHlwZSA8ZW0+U2Vzc2lvbiBUeXBlPC9lbT59JyBlbnVtLgpAQCAtMzA0Niw3ICszNzAyLDE3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFNlc3Npb25UeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IFNFU1NJT05fVFlQRSA9IDM4OworCWludCBTRVNTSU9OX1RZUEUgPSA0ODsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZVVuaXRUeXBlVHlwZSA8ZW0+VGltZSBVbml0IFR5cGUgVHlwZTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZVVuaXRUeXBlVHlwZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUaW1lVW5pdFR5cGVUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRJTUVfVU5JVF9UWVBFX1RZUEUgPSA0OTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIDxlbT5UcmFuc2FjdGlvbiBBdHRyaWJ1dGUgVHlwZTwvZW0+fScgZW51bS4KQEAgLTMwNTYsNyArMzcyMiw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBUUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRSA9IDM5OworCWludCBUUkFOU0FDVElPTl9BVFRSSUJVVEVfVFlQRSA9IDUwOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nIGVudW0uCkBAIC0zMDY2LDcgKzM3MzIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUcmFuc2FjdGlvblR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgVFJBTlNBQ1RJT05fVFlQRSA9IDQwOworCWludCBUUkFOU0FDVElPTl9UWVBFID0gNTE7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNtcCBWZXJzaW9uIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KQEAgLTMwNzYsNyArMzc0Miw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldENtcFZlcnNpb25UeXBlT2JqZWN0KCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IENNUF9WRVJTSU9OX1RZUEVfT0JKRUNUID0gNDE7CisJaW50IENNUF9WRVJTSU9OX1RZUEVfT0JKRUNUID0gNTI7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNNUiBGaWVsZCBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCkBAIC0zMDg2LDcgKzM3NTIsMjcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q01SRmllbGRUeXBlT2JqZWN0KCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IENNUl9GSUVMRF9UWVBFX09CSkVDVCA9IDQyOworCWludCBDTVJfRklFTERfVFlQRV9PQkpFQ1QgPSA1MzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q29uY3VycmVuY3kgTWFuYWdlbWVudCBUeXBlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVPYmplY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ09OQ1VSUkVOQ1lfTUFOQUdFTUVOVF9UWVBFX1RZUEVfT0JKRUNUID0gNTQ7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNvbmN1cnJlbnQgTG9jayBUeXBlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudExvY2tUeXBlVHlwZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDb25jdXJyZW50TG9ja1R5cGVUeXBlT2JqZWN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENPTkNVUlJFTlRfTE9DS19UWVBFX1RZUEVfT0JKRUNUID0gNTU7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNsYXNzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgpAQCAtMzA5Niw3ICszNzgyLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0RWpiQ2xhc3NUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IEVKQl9DTEFTU19UWVBFID0gNDM7CisJaW50IEVKQl9DTEFTU19UWVBFID0gNTY7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk5hbWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCkBAIC0zMTA2LDcgKzM3OTIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRFamJOYW1lVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBFSkJfTkFNRV9UWVBFID0gNDQ7CisJaW50IEVKQl9OQU1FX1RZUEUgPSA1NzsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TWV0aG9kIEludGVyZmFjZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCkBAIC0zMTE2LDcgKzM4MDIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRNZXRob2RJbnRlcmZhY2VUeXBlT2JqZWN0KCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IE1FVEhPRF9JTlRFUkZBQ0VfVFlQRV9PQkpFQ1QgPSA0NTsKKwlpbnQgTUVUSE9EX0lOVEVSRkFDRV9UWVBFX09CSkVDVCA9IDU4OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NZXRob2QgTmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KQEAgLTMxMjYsNyArMzgxMiw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldE1ldGhvZE5hbWVUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IE1FVEhPRF9OQU1FX1RZUEUgPSA0NjsKKwlpbnQgTUVUSE9EX05BTUVfVFlQRSA9IDU5OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NdWx0aXBsaWNpdHkgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgpAQCAtMzEzNiw3ICszODIyLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0TXVsdGlwbGljaXR5VHlwZU9iamVjdCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBNVUxUSVBMSUNJVFlfVFlQRV9PQkpFQ1QgPSA0NzsKKwlpbnQgTVVMVElQTElDSVRZX1RZUEVfT0JKRUNUID0gNjA7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KQEAgLTMxNDYsNyArMzgzMiw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFBlcnNpc3RlbmNlVHlwZU9iamVjdCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBQRVJTSVNURU5DRV9UWVBFX09CSkVDVCA9IDQ4OworCWludCBQRVJTSVNURU5DRV9UWVBFX09CSkVDVCA9IDYxOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5SZXN1bHQgVHlwZSBNYXBwaW5nIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KQEAgLTMxNTYsNyArMzg0Miw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFJlc3VsdFR5cGVNYXBwaW5nVHlwZU9iamVjdCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBSRVNVTFRfVFlQRV9NQVBQSU5HX1RZUEVfT0JKRUNUID0gNDk7CisJaW50IFJFU1VMVF9UWVBFX01BUFBJTkdfVFlQRV9PQkpFQ1QgPSA2MjsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U2Vzc2lvbiBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCkBAIC0zMTY2LDcgKzM4NTIsMTcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0U2Vzc2lvblR5cGVPYmplY3QoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgU0VTU0lPTl9UWVBFX09CSkVDVCA9IDUwOworCWludCBTRVNTSU9OX1RZUEVfT0JKRUNUID0gNjM7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlRpbWUgVW5pdCBUeXBlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZVVuaXRUeXBlVHlwZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUaW1lVW5pdFR5cGVUeXBlT2JqZWN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRJTUVfVU5JVF9UWVBFX1RZUEVfT0JKRUNUID0gNjQ7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCkBAIC0zMTc2LDcgKzM4NzIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVPYmplY3QoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgVFJBTlNBQ1RJT05fQVRUUklCVVRFX1RZUEVfT0JKRUNUID0gNTE7CisJaW50IFRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFX09CSkVDVCA9IDY1OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCkBAIC0zMTg2LDEwICszODgyLDUzIEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFRyYW5zYWN0aW9uVHlwZU9iamVjdCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBUUkFOU0FDVElPTl9UWVBFX09CSkVDVCA9IDUyOworCWludCBUUkFOU0FDVElPTl9UWVBFX09CSkVDVCA9IDY2OwogCiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY2Nlc3NUaW1lb3V0VHlwZSA8ZW0+QWNjZXNzIFRpbWVvdXQgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY2Nlc3MgVGltZW91dCBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWNjZXNzVGltZW91dFR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEFjY2Vzc1RpbWVvdXRUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjY2Vzc1RpbWVvdXRUeXBlI2dldFRpbWVvdXQgPGVtPlRpbWVvdXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UaW1lb3V0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWNjZXNzVGltZW91dFR5cGUjZ2V0VGltZW91dCgpCisJICogQHNlZSAjZ2V0QWNjZXNzVGltZW91dFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEFjY2Vzc1RpbWVvdXRUeXBlX1RpbWVvdXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWNjZXNzVGltZW91dFR5cGUjZ2V0VW5pdCA8ZW0+VW5pdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVuaXQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY2Nlc3NUaW1lb3V0VHlwZSNnZXRVbml0KCkKKwkgKiBAc2VlICNnZXRBY2Nlc3NUaW1lb3V0VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QWNjZXNzVGltZW91dFR5cGVfVW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY2Nlc3NUaW1lb3V0VHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjY2Vzc1RpbWVvdXRUeXBlI2dldElkKCkKKwkgKiBAc2VlICNnZXRBY2Nlc3NUaW1lb3V0VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QWNjZXNzVGltZW91dFR5cGVfSWQoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWcgPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzMwOCw2ICs0MDQ3LDE3IEBACiAJRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9Sb2xsYmFjaygpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BcHBsaWNhdGlvbkV4Y2VwdGlvbiNpc0luaGVyaXRlZCA8ZW0+SW5oZXJpdGVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5oZXJpdGVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jaXNJbmhlcml0ZWQoKQorCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9Jbmhlcml0ZWQoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXBwbGljYXRpb25FeGNlcHRpb24jZ2V0SWQgPGVtPklkPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzM1MSw2ICs0MTAxLDM4IEBACiAJRUF0dHJpYnV0ZSBnZXRBcm91bmRJbnZva2VUeXBlX01ldGhvZE5hbWUoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZFRpbWVvdXRUeXBlIDxlbT5Bcm91bmQgVGltZW91dCBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFyb3VuZCBUaW1lb3V0IFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bcm91bmRUaW1lb3V0VHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0QXJvdW5kVGltZW91dFR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kVGltZW91dFR5cGUjZ2V0Q2xhc3NfIDxlbT5DbGFzczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNsYXNzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kVGltZW91dFR5cGUjZ2V0Q2xhc3NfKCkKKwkgKiBAc2VlICNnZXRBcm91bmRUaW1lb3V0VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QXJvdW5kVGltZW91dFR5cGVfQ2xhc3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kVGltZW91dFR5cGUjZ2V0TWV0aG9kTmFtZSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFyb3VuZFRpbWVvdXRUeXBlI2dldE1ldGhvZE5hbWUoKQorCSAqIEBzZWUgI2dldEFyb3VuZFRpbWVvdXRUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBcm91bmRUaW1lb3V0VHlwZV9NZXRob2ROYW1lKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3IgPGVtPkFzc2VtYmx5IERlc2NyaXB0b3I8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0zNDQ5LDYgKzQyMzEsNDkgQEAKIAlFQXR0cmlidXRlIGdldEFzc2VtYmx5RGVzY3JpcHRvcl9JZCgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXN5bmNNZXRob2RUeXBlIDxlbT5Bc3luYyBNZXRob2QgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Bc3luYyBNZXRob2QgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzeW5jTWV0aG9kVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0QXN5bmNNZXRob2RUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzeW5jTWV0aG9kVHlwZSNnZXRNZXRob2ROYW1lIDxlbT5NZXRob2QgTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1ldGhvZCBOYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXN5bmNNZXRob2RUeXBlI2dldE1ldGhvZE5hbWUoKQorCSAqIEBzZWUgI2dldEFzeW5jTWV0aG9kVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QXN5bmNNZXRob2RUeXBlX01ldGhvZE5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXN5bmNNZXRob2RUeXBlI2dldE1ldGhvZFBhcmFtcyA8ZW0+TWV0aG9kIFBhcmFtczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1ldGhvZCBQYXJhbXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3luY01ldGhvZFR5cGUjZ2V0TWV0aG9kUGFyYW1zKCkKKwkgKiBAc2VlICNnZXRBc3luY01ldGhvZFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEFzeW5jTWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXN5bmNNZXRob2RUeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXN5bmNNZXRob2RUeXBlI2dldElkKCkKKwkgKiBAc2VlICNnZXRBc3luY01ldGhvZFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEFzeW5jTWV0aG9kVHlwZV9JZCgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ01QRmllbGQgPGVtPkNNUCBGaWVsZDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTM1NDYsNiArNDM3MSw2MCBAQAogCUVBdHRyaWJ1dGUgZ2V0Q01SRmllbGRfSWQoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbmN1cnJlbnRNZXRob2RUeXBlIDxlbT5Db25jdXJyZW50IE1ldGhvZCBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbmN1cnJlbnQgTWV0aG9kIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TWV0aG9kVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q29uY3VycmVudE1ldGhvZFR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudE1ldGhvZFR5cGUjZ2V0TWV0aG9kIDxlbT5NZXRob2Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NZXRob2Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TWV0aG9kVHlwZSNnZXRNZXRob2QoKQorCSAqIEBzZWUgI2dldENvbmN1cnJlbnRNZXRob2RUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRDb25jdXJyZW50TWV0aG9kVHlwZV9NZXRob2QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudE1ldGhvZFR5cGUjZ2V0TG9jayA8ZW0+TG9jazwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2s8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TWV0aG9kVHlwZSNnZXRMb2NrKCkKKwkgKiBAc2VlICNnZXRDb25jdXJyZW50TWV0aG9kVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q29uY3VycmVudE1ldGhvZFR5cGVfTG9jaygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TWV0aG9kVHlwZSNnZXRBY2Nlc3NUaW1lb3V0IDxlbT5BY2Nlc3MgVGltZW91dDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkFjY2VzcyBUaW1lb3V0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudE1ldGhvZFR5cGUjZ2V0QWNjZXNzVGltZW91dCgpCisJICogQHNlZSAjZ2V0Q29uY3VycmVudE1ldGhvZFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldENvbmN1cnJlbnRNZXRob2RUeXBlX0FjY2Vzc1RpbWVvdXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudE1ldGhvZFR5cGUjZ2V0SWQgPGVtPklkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TWV0aG9kVHlwZSNnZXRJZCgpCisJICogQHNlZSAjZ2V0Q29uY3VycmVudE1ldGhvZFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENvbmN1cnJlbnRNZXRob2RUeXBlX0lkKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db250YWluZXJUcmFuc2FjdGlvblR5cGUgPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzYwMCw2ICs0NDc5LDM4IEBACiAJRUF0dHJpYnV0ZSBnZXRDb250YWluZXJUcmFuc2FjdGlvblR5cGVfSWQoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkRlcGVuZHNPblR5cGUgPGVtPkRlcGVuZHMgT24gVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXBlbmRzIE9uIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5EZXBlbmRzT25UeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXREZXBlbmRzT25UeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRGVwZW5kc09uVHlwZSNnZXRFamJOYW1lIDxlbT5FamIgTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RWpiIE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5EZXBlbmRzT25UeXBlI2dldEVqYk5hbWUoKQorCSAqIEBzZWUgI2dldERlcGVuZHNPblR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldERlcGVuZHNPblR5cGVfRWpiTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5EZXBlbmRzT25UeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRGVwZW5kc09uVHlwZSNnZXRJZCgpCisJICogQHNlZSAjZ2V0RGVwZW5kc09uVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0RGVwZW5kc09uVHlwZV9JZCgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyIDxlbT5FSkIgSmFyPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzY0Myw2ICs0NTU0LDE3IEBACiAJRVJlZmVyZW5jZSBnZXRFSkJKYXJfSWNvbnMoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyI2dldE1vZHVsZU5hbWUgPGVtPk1vZHVsZSBOYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW9kdWxlIE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0TW9kdWxlTmFtZSgpCisJICogQHNlZSAjZ2V0RUpCSmFyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRFSkJKYXJfTW9kdWxlTmFtZSgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIjZ2V0RW50ZXJwcmlzZUJlYW5zIDxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNDMwOSw2ICs1MjMxLDE3IEBACiAJRVJlZmVyZW5jZSBnZXRFbnRpdHlCZWFuX1ByZURlc3Ryb3lzKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiNnZXREYXRhU291cmNlIDxlbT5EYXRhIFNvdXJjZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGF0YSBTb3VyY2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuI2dldERhdGFTb3VyY2UoKQorCSAqIEBzZWUgI2dldEVudGl0eUJlYW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEVudGl0eUJlYW5fRGF0YVNvdXJjZSgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4jZ2V0U2VjdXJpdHlSb2xlUmVmcyA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNDY1NSw2ICs1NTg4LDE3IEBACiAJRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfQXJvdW5kSW52b2tlcygpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkludGVyY2VwdG9yVHlwZSNnZXRBcm91bmRUaW1lb3V0cyA8ZW0+QXJvdW5kIFRpbWVvdXRzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bcm91bmQgVGltZW91dHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0QXJvdW5kVGltZW91dHMoKQorCSAqIEBzZWUgI2dldEludGVyY2VwdG9yVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX0Fyb3VuZFRpbWVvdXRzKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNDc3Niw2ICs1NzIwLDE3IEBACiAJRVJlZmVyZW5jZSBnZXRJbnRlcmNlcHRvclR5cGVfUHJlRGVzdHJveXMoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0RGF0YVNvdXJjZSA8ZW0+RGF0YSBTb3VyY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRhdGEgU291cmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuSW50ZXJjZXB0b3JUeXBlI2dldERhdGFTb3VyY2UoKQorCSAqIEBzZWUgI2dldEludGVyY2VwdG9yVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0SW50ZXJjZXB0b3JUeXBlX0RhdGFTb3VyY2UoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JbnRlcmNlcHRvclR5cGUjZ2V0UG9zdEFjdGl2YXRlcyA8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC00OTA3LDYgKzU4NjIsMTcgQEAKIAlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1RpbWVvdXRNZXRob2QoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRUaW1lciA8ZW0+VGltZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0VGltZXIoKQorCSAqIEBzZWUgI2dldE1lc3NhZ2VEcml2ZW5CZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRNZXNzYWdlRHJpdmVuQmVhbl9UaW1lcigpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC00OTYyLDYgKzU5MjgsMTcgQEAKIAlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Fyb3VuZEludm9rZXMoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRBcm91bmRUaW1lb3V0cyA8ZW0+QXJvdW5kIFRpbWVvdXRzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bcm91bmQgVGltZW91dHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRBcm91bmRUaW1lb3V0cygpCisJICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0Fyb3VuZFRpbWVvdXRzKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC01MDgzLDYgKzYwNjAsMjggQEAKIAlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1ByZURlc3Ryb3lzKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RGF0YVNvdXJjZSA8ZW0+RGF0YSBTb3VyY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRhdGEgU291cmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW4jZ2V0RGF0YVNvdXJjZSgpCisJICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX0RhdGFTb3VyY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRTZWN1cml0eVJvbGVSZWYgPGVtPlNlY3VyaXR5IFJvbGUgUmVmPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWN1cml0eSBSb2xlIFJlZjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuI2dldFNlY3VyaXR5Um9sZVJlZigpCisJICogQHNlZSAjZ2V0TWVzc2FnZURyaXZlbkJlYW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldE1lc3NhZ2VEcml2ZW5CZWFuX1NlY3VyaXR5Um9sZVJlZigpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiNnZXRTZWN1cml0eUlkZW50aXR5IDxlbT5TZWN1cml0eSBJZGVudGl0eTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTU3NDMsNiArNjc0MiwxNyBAQAogCUVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fQnVzaW5lc3NSZW1vdGVzKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldExvY2FsQmVhbiA8ZW0+TG9jYWwgQmVhbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkxvY2FsIEJlYW48L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRMb2NhbEJlYW4oKQorCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Mb2NhbEJlYW4oKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U2VydmljZUVuZHBvaW50IDxlbT5TZXJ2aWNlIEVuZHBvaW50PC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNTc3Niw2ICs2Nzg2LDE3IEBACiAJRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9TZXNzaW9uVHlwZSgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRTdGF0ZWZ1bFRpbWVvdXQgPGVtPlN0YXRlZnVsIFRpbWVvdXQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TdGF0ZWZ1bCBUaW1lb3V0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0U3RhdGVmdWxUaW1lb3V0KCkKKwkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fU3RhdGVmdWxUaW1lb3V0KCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFRpbWVvdXRNZXRob2QgPGVtPlRpbWVvdXQgTWV0aG9kPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNTc4Nyw2ICs2ODA4LDYxIEBACiAJRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9UaW1lb3V0TWV0aG9kKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0VGltZXIgPGVtPlRpbWVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UaW1lcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFRpbWVyKCkKKwkgKiBAc2VlICNnZXRTZXNzaW9uQmVhbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkJlYW5fVGltZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jaXNJbml0T25TdGFydHVwIDxlbT5Jbml0IE9uIFN0YXJ0dXA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Jbml0IE9uIFN0YXJ0dXA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNpc0luaXRPblN0YXJ0dXAoKQorCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9Jbml0T25TdGFydHVwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUgPGVtPkNvbmN1cnJlbmN5IE1hbmFnZW1lbnQgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbmN1cnJlbmN5IE1hbmFnZW1lbnQgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldENvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGUoKQorCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9Db25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0Q29uY3VycmVudE1ldGhvZCA8ZW0+Q29uY3VycmVudCBNZXRob2Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbmN1cnJlbnQgTWV0aG9kPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0Q29uY3VycmVudE1ldGhvZCgpCisJICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0NvbmN1cnJlbnRNZXRob2QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0RGVwZW5kc09uIDxlbT5EZXBlbmRzIE9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RGVwZW5kcyBPbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldERlcGVuZHNPbigpCisJICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0RlcGVuZHNPbigpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEluaXRNZXRob2RzIDxlbT5Jbml0IE1ldGhvZHM8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC01ODA5LDYgKzY4ODUsMTcgQEAKIAlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX1JlbW92ZU1ldGhvZHMoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRBc3luY01ldGhvZCA8ZW0+QXN5bmMgTWV0aG9kPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bc3luYyBNZXRob2Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiNnZXRBc3luY01ldGhvZCgpCisJICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0FzeW5jTWV0aG9kKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTU4MjAsNiArNjkwNywzOSBAQAogCUVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkJlYW5fVHJhbnNhY3Rpb25UeXBlKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEFmdGVyQmVnaW5NZXRob2QgPGVtPkFmdGVyIEJlZ2luIE1ldGhvZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkFmdGVyIEJlZ2luIE1ldGhvZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEFmdGVyQmVnaW5NZXRob2QoKQorCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9BZnRlckJlZ2luTWV0aG9kKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEJlZm9yZUNvbXBsZXRpb25NZXRob2QgPGVtPkJlZm9yZSBDb21wbGV0aW9uIE1ldGhvZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkJlZm9yZSBDb21wbGV0aW9uIE1ldGhvZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEJlZm9yZUNvbXBsZXRpb25NZXRob2QoKQorCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9CZWZvcmVDb21wbGV0aW9uTWV0aG9kKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEFmdGVyQ29tcGxldGlvbk1ldGhvZCA8ZW0+QWZ0ZXIgQ29tcGxldGlvbiBNZXRob2Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BZnRlciBDb21wbGV0aW9uIE1ldGhvZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEFmdGVyQ29tcGxldGlvbk1ldGhvZCgpCisJICogQHNlZSAjZ2V0U2Vzc2lvbkJlYW4oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNlc3Npb25CZWFuX0FmdGVyQ29tcGxldGlvbk1ldGhvZCgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEFyb3VuZEludm9rZXMgPGVtPkFyb3VuZCBJbnZva2VzPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNTgzMSw2ICs2OTUxLDE3IEBACiAJRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Bcm91bmRJbnZva2VzKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QXJvdW5kVGltZW91dHMgPGVtPkFyb3VuZCBUaW1lb3V0czwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXJvdW5kIFRpbWVvdXRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0QXJvdW5kVGltZW91dHMoKQorCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9Bcm91bmRUaW1lb3V0cygpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNTk1Miw2ICs3MDgzLDE3IEBACiAJRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9QcmVEZXN0cm95cygpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldERhdGFTb3VyY2UgPGVtPkRhdGEgU291cmNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EYXRhIFNvdXJjZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuI2dldERhdGFTb3VyY2UoKQorCSAqIEBzZWUgI2dldFNlc3Npb25CZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTZXNzaW9uQmVhbl9EYXRhU291cmNlKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4jZ2V0UG9zdEFjdGl2YXRlcyA8ZW0+UG9zdCBBY3RpdmF0ZXM8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC02MDA3LDYgKzcxNDksMjU2IEBACiAJRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQmVhbl9JZCgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU3RhdGVmdWxUaW1lb3V0VHlwZSA8ZW0+U3RhdGVmdWwgVGltZW91dCBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN0YXRlZnVsIFRpbWVvdXQgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlN0YXRlZnVsVGltZW91dFR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFN0YXRlZnVsVGltZW91dFR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU3RhdGVmdWxUaW1lb3V0VHlwZSNnZXRUaW1lb3V0IDxlbT5UaW1lb3V0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGltZW91dDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlN0YXRlZnVsVGltZW91dFR5cGUjZ2V0VGltZW91dCgpCisJICogQHNlZSAjZ2V0U3RhdGVmdWxUaW1lb3V0VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U3RhdGVmdWxUaW1lb3V0VHlwZV9UaW1lb3V0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlN0YXRlZnVsVGltZW91dFR5cGUjZ2V0VW5pdCA8ZW0+VW5pdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVuaXQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TdGF0ZWZ1bFRpbWVvdXRUeXBlI2dldFVuaXQoKQorCSAqIEBzZWUgI2dldFN0YXRlZnVsVGltZW91dFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFN0YXRlZnVsVGltZW91dFR5cGVfVW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TdGF0ZWZ1bFRpbWVvdXRUeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU3RhdGVmdWxUaW1lb3V0VHlwZSNnZXRJZCgpCisJICogQHNlZSAjZ2V0U3RhdGVmdWxUaW1lb3V0VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U3RhdGVmdWxUaW1lb3V0VHlwZV9JZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJTY2hlZHVsZVR5cGUgPGVtPlRpbWVyIFNjaGVkdWxlIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGltZXIgU2NoZWR1bGUgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUaW1lclNjaGVkdWxlVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclNjaGVkdWxlVHlwZSNnZXRTZWNvbmQgPGVtPlNlY29uZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlY29uZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldFNlY29uZCgpCisJICogQHNlZSAjZ2V0VGltZXJTY2hlZHVsZVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFRpbWVyU2NoZWR1bGVUeXBlX1NlY29uZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclNjaGVkdWxlVHlwZSNnZXRNaW51dGUgPGVtPk1pbnV0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbnV0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldE1pbnV0ZSgpCisJICogQHNlZSAjZ2V0VGltZXJTY2hlZHVsZVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFRpbWVyU2NoZWR1bGVUeXBlX01pbnV0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclNjaGVkdWxlVHlwZSNnZXRIb3VyIDxlbT5Ib3VyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SG91cjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldEhvdXIoKQorCSAqIEBzZWUgI2dldFRpbWVyU2NoZWR1bGVUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUaW1lclNjaGVkdWxlVHlwZV9Ib3VyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldERheU9mTW9udGggPGVtPkRheSBPZiBNb250aDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRheSBPZiBNb250aDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldERheU9mTW9udGgoKQorCSAqIEBzZWUgI2dldFRpbWVyU2NoZWR1bGVUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUaW1lclNjaGVkdWxlVHlwZV9EYXlPZk1vbnRoKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldE1vbnRoIDxlbT5Nb250aDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1vbnRoPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJTY2hlZHVsZVR5cGUjZ2V0TW9udGgoKQorCSAqIEBzZWUgI2dldFRpbWVyU2NoZWR1bGVUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUaW1lclNjaGVkdWxlVHlwZV9Nb250aCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclNjaGVkdWxlVHlwZSNnZXREYXlPZldlZWsgPGVtPkRheSBPZiBXZWVrPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF5IE9mIFdlZWs8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclNjaGVkdWxlVHlwZSNnZXREYXlPZldlZWsoKQorCSAqIEBzZWUgI2dldFRpbWVyU2NoZWR1bGVUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUaW1lclNjaGVkdWxlVHlwZV9EYXlPZldlZWsoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJTY2hlZHVsZVR5cGUjZ2V0WWVhciA8ZW0+WWVhcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlllYXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclNjaGVkdWxlVHlwZSNnZXRZZWFyKCkKKwkgKiBAc2VlICNnZXRUaW1lclNjaGVkdWxlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGltZXJTY2hlZHVsZVR5cGVfWWVhcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclNjaGVkdWxlVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlI2dldElkKCkKKwkgKiBAc2VlICNnZXRUaW1lclNjaGVkdWxlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGltZXJTY2hlZHVsZVR5cGVfSWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSA8ZW0+VGltZXIgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UaW1lciBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRUaW1lclR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSNnZXREZXNjcmlwdGlvbigpCisJICogQHNlZSAjZ2V0VGltZXJUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRUaW1lclR5cGVfRGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJUeXBlI2dldFNjaGVkdWxlIDxlbT5TY2hlZHVsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlNjaGVkdWxlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJUeXBlI2dldFNjaGVkdWxlKCkKKwkgKiBAc2VlICNnZXRUaW1lclR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFRpbWVyVHlwZV9TY2hlZHVsZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0U3RhcnQoKQorCSAqIEBzZWUgI2dldFRpbWVyVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGltZXJUeXBlX1N0YXJ0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSNnZXRFbmQgPGVtPkVuZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVuZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSNnZXRFbmQoKQorCSAqIEBzZWUgI2dldFRpbWVyVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGltZXJUeXBlX0VuZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0VGltZW91dE1ldGhvZCA8ZW0+VGltZW91dCBNZXRob2Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5UaW1lb3V0IE1ldGhvZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSNnZXRUaW1lb3V0TWV0aG9kKCkKKwkgKiBAc2VlICNnZXRUaW1lclR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFRpbWVyVHlwZV9UaW1lb3V0TWV0aG9kKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSNpc1BlcnNpc3RlbnQgPGVtPlBlcnNpc3RlbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJzaXN0ZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJUeXBlI2lzUGVyc2lzdGVudCgpCisJICogQHNlZSAjZ2V0VGltZXJUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUaW1lclR5cGVfUGVyc2lzdGVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0VGltZXpvbmUgPGVtPlRpbWV6b25lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGltZXpvbmU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUjZ2V0VGltZXpvbmUoKQorCSAqIEBzZWUgI2dldFRpbWVyVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0VGltZXJUeXBlX1RpbWV6b25lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSNnZXRJbmZvIDxlbT5JbmZvPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5mbzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSNnZXRJbmZvKCkKKwkgKiBAc2VlICNnZXRUaW1lclR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFRpbWVyVHlwZV9JbmZvKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyVHlwZSNnZXRJZCgpCisJICogQHNlZSAjZ2V0VGltZXJUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRUaW1lclR5cGVfSWQoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ21wVmVyc2lvblR5cGUgPGVtPkNtcCBWZXJzaW9uIFR5cGU8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC02MDI3LDYgKzc0MTksMjYgQEAKIAlFRW51bSBnZXRDTVJGaWVsZFR5cGUoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUgPGVtPkNvbmN1cnJlbmN5IE1hbmFnZW1lbnQgVHlwZSBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+Q29uY3VycmVuY3kgTWFuYWdlbWVudCBUeXBlIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRW51bSBnZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW50TG9ja1R5cGVUeXBlIDxlbT5Db25jdXJyZW50IExvY2sgVHlwZSBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+Q29uY3VycmVudCBMb2NrIFR5cGUgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbmN1cnJlbnRMb2NrVHlwZVR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0Q29uY3VycmVudExvY2tUeXBlVHlwZSgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXRob2RJbnRlcmZhY2VUeXBlIDxlbT5NZXRob2QgSW50ZXJmYWNlIFR5cGU8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC02MDc3LDYgKzc0ODksMTYgQEAKIAlFRW51bSBnZXRTZXNzaW9uVHlwZSgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lVW5pdFR5cGVUeXBlIDxlbT5UaW1lIFVuaXQgVHlwZSBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+VGltZSBVbml0IFR5cGUgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVVbml0VHlwZVR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0VGltZVVuaXRUeXBlVHlwZSgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNjExNyw2ICs3NTM5LDI2IEBACiAJRURhdGFUeXBlIGdldENNUkZpZWxkVHlwZU9iamVjdCgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlIDxlbT5Db25jdXJyZW5jeSBNYW5hZ2VtZW50IFR5cGUgVHlwZSBPYmplY3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkNvbmN1cnJlbmN5IE1hbmFnZW1lbnQgVHlwZSBUeXBlIE9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVEYXRhVHlwZSBnZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZU9iamVjdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbmN1cnJlbnRMb2NrVHlwZVR5cGUgPGVtPkNvbmN1cnJlbnQgTG9jayBUeXBlIFR5cGUgT2JqZWN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Db25jdXJyZW50IExvY2sgVHlwZSBUeXBlIE9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbmN1cnJlbnRMb2NrVHlwZVR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRURhdGFUeXBlIGdldENvbmN1cnJlbnRMb2NrVHlwZVR5cGVPYmplY3QoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5DbGFzcyBUeXBlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNjE5Nyw2ICs3NjM5LDE2IEBACiAJRURhdGFUeXBlIGdldFNlc3Npb25UeXBlT2JqZWN0KCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZVVuaXRUeXBlVHlwZSA8ZW0+VGltZSBVbml0IFR5cGUgVHlwZSBPYmplY3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlRpbWUgVW5pdCBUeXBlIFR5cGUgT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZVVuaXRUeXBlVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRGF0YVR5cGUgZ2V0VGltZVVuaXRUeXBlVHlwZU9iamVjdCgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSA8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGUgT2JqZWN0PC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNjIzOSw2ICs3NjkxLDQwIEBACiAJICovCiAJaW50ZXJmYWNlIExpdGVyYWxzICB7CiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY2Nlc3NUaW1lb3V0VHlwZUltcGwgPGVtPkFjY2VzcyBUaW1lb3V0IFR5cGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFjY2Vzc1RpbWVvdXRUeXBlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0QWNjZXNzVGltZW91dFR5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQUNDRVNTX1RJTUVPVVRfVFlQRSA9IGVJTlNUQU5DRS5nZXRBY2Nlc3NUaW1lb3V0VHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGltZW91dDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEFDQ0VTU19USU1FT1VUX1RZUEVfX1RJTUVPVVQgPSBlSU5TVEFOQ0UuZ2V0QWNjZXNzVGltZW91dFR5cGVfVGltZW91dCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VW5pdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEFDQ0VTU19USU1FT1VUX1RZUEVfX1VOSVQgPSBlSU5TVEFOQ0UuZ2V0QWNjZXNzVGltZW91dFR5cGVfVW5pdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBBQ0NFU1NfVElNRU9VVF9UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXRBY2Nlc3NUaW1lb3V0VHlwZV9JZCgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uQ29uZmlnSW1wbCA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTYzMzMsNiArNzgxOSwxNCBAQAogCQlFQXR0cmlidXRlIEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fUk9MTEJBQ0sgPSBlSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25FeGNlcHRpb25fUm9sbGJhY2soKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaGVyaXRlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9fSU5IRVJJVEVEID0gZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRXhjZXB0aW9uX0luaGVyaXRlZCgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTYzNjcsNiArNzg2MSwzMiBAQAogCQlFQXR0cmlidXRlIEFST1VORF9JTlZPS0VfVFlQRV9fTUVUSE9EX05BTUUgPSBlSU5TVEFOQ0UuZ2V0QXJvdW5kSW52b2tlVHlwZV9NZXRob2ROYW1lKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFyb3VuZFRpbWVvdXRUeXBlSW1wbCA8ZW0+QXJvdW5kIFRpbWVvdXQgVHlwZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXJvdW5kVGltZW91dFR5cGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBcm91bmRUaW1lb3V0VHlwZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBBUk9VTkRfVElNRU9VVF9UWVBFID0gZUlOU1RBTkNFLmdldEFyb3VuZFRpbWVvdXRUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEFST1VORF9USU1FT1VUX1RZUEVfX0NMQVNTID0gZUlOU1RBTkNFLmdldEFyb3VuZFRpbWVvdXRUeXBlX0NsYXNzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEFST1VORF9USU1FT1VUX1RZUEVfX01FVEhPRF9OQU1FID0gZUlOU1RBTkNFLmdldEFyb3VuZFRpbWVvdXRUeXBlX01ldGhvZE5hbWUoKTsKKworCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuQXNzZW1ibHlEZXNjcmlwdG9ySW1wbCA8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNjQ0MSw2ICs3OTYxLDQwIEBACiAJCUVBdHRyaWJ1dGUgQVNTRU1CTFlfREVTQ1JJUFRPUl9fSUQgPSBlSU5TVEFOQ0UuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0lkKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkFzeW5jTWV0aG9kVHlwZUltcGwgPGVtPkFzeW5jIE1ldGhvZCBUeXBlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Bc3luY01ldGhvZFR5cGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRBc3luY01ldGhvZFR5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQVNZTkNfTUVUSE9EX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0QXN5bmNNZXRob2RUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEFTWU5DX01FVEhPRF9UWVBFX19NRVRIT0RfTkFNRSA9IGVJTlNUQU5DRS5nZXRBc3luY01ldGhvZFR5cGVfTWV0aG9kTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFTWU5DX01FVEhPRF9UWVBFX19NRVRIT0RfUEFSQU1TID0gZUlOU1RBTkNFLmdldEFzeW5jTWV0aG9kVHlwZV9NZXRob2RQYXJhbXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQVNZTkNfTUVUSE9EX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldEFzeW5jTWV0aG9kVHlwZV9JZCgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVBGaWVsZEltcGwgPGVtPkNNUCBGaWVsZDwvZW0+fScgY2xhc3MuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNjUxNyw2ICs4MDcxLDQ4IEBACiAJCUVBdHRyaWJ1dGUgQ01SX0ZJRUxEX19JRCA9IGVJTlNUQU5DRS5nZXRDTVJGaWVsZF9JZCgpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5Db25jdXJyZW50TWV0aG9kVHlwZUltcGwgPGVtPkNvbmN1cnJlbnQgTWV0aG9kIFR5cGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNvbmN1cnJlbnRNZXRob2RUeXBlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q29uY3VycmVudE1ldGhvZFR5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRSA9IGVJTlNUQU5DRS5nZXRDb25jdXJyZW50TWV0aG9kVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQ09OQ1VSUkVOVF9NRVRIT0RfVFlQRV9fTUVUSE9EID0gZUlOU1RBTkNFLmdldENvbmN1cnJlbnRNZXRob2RUeXBlX01ldGhvZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9jazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX0xPQ0sgPSBlSU5TVEFOQ0UuZ2V0Q29uY3VycmVudE1ldGhvZFR5cGVfTG9jaygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIFRpbWVvdXQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBDT05DVVJSRU5UX01FVEhPRF9UWVBFX19BQ0NFU1NfVElNRU9VVCA9IGVJTlNUQU5DRS5nZXRDb25jdXJyZW50TWV0aG9kVHlwZV9BY2Nlc3NUaW1lb3V0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENPTkNVUlJFTlRfTUVUSE9EX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldENvbmN1cnJlbnRNZXRob2RUeXBlX0lkKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZUltcGwgPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC02NTU5LDYgKzgxNTUsMzIgQEAKIAkJRUF0dHJpYnV0ZSBDT05UQUlORVJfVFJBTlNBQ1RJT05fVFlQRV9fSUQgPSBlSU5TVEFOQ0UuZ2V0Q29udGFpbmVyVHJhbnNhY3Rpb25UeXBlX0lkKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkRlcGVuZHNPblR5cGVJbXBsIDxlbT5EZXBlbmRzIE9uIFR5cGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkRlcGVuZHNPblR5cGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXREZXBlbmRzT25UeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIERFUEVORFNfT05fVFlQRSA9IGVJTlNUQU5DRS5nZXREZXBlbmRzT25UeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FamIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREVQRU5EU19PTl9UWVBFX19FSkJfTkFNRSA9IGVJTlNUQU5DRS5nZXREZXBlbmRzT25UeXBlX0VqYk5hbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgREVQRU5EU19PTl9UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXREZXBlbmRzT25UeXBlX0lkKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVKQkphckltcGwgPGVtPkVKQiBKYXI8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTY1OTMsNiArODIxNSwxNCBAQAogCQlFUmVmZXJlbmNlIEVKQl9KQVJfX0lDT05TID0gZUlOU1RBTkNFLmdldEVKQkphcl9JY29ucygpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBFSkJfSkFSX19NT0RVTEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRFSkJKYXJfTW9kdWxlTmFtZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZSBCZWFuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNzA5MSw2ICs4NzIxLDE0IEBACiAJCUVSZWZlcmVuY2UgRU5USVRZX0JFQU5fX1BSRV9ERVNUUk9ZUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlCZWFuX1ByZURlc3Ryb3lzKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhIFNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgRU5USVRZX0JFQU5fX0RBVEFfU09VUkNFID0gZUlOU1RBTkNFLmdldEVudGl0eUJlYW5fRGF0YVNvdXJjZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTczNTksNiArODk5NywxNCBAQAogCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX1RZUEVfX0FST1VORF9JTlZPS0VTID0gZUlOU1RBTkNFLmdldEludGVyY2VwdG9yVHlwZV9Bcm91bmRJbnZva2VzKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bcm91bmQgVGltZW91dHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX1RZUEVfX0FST1VORF9USU1FT1VUUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfQXJvdW5kVGltZW91dHMoKTsKKworCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTc0NDcsNiArOTA5MywxNCBAQAogCQlFUmVmZXJlbmNlIElOVEVSQ0VQVE9SX1RZUEVfX1BSRV9ERVNUUk9ZUyA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfUHJlRGVzdHJveXMoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRhdGEgU291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBJTlRFUkNFUFRPUl9UWVBFX19EQVRBX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRJbnRlcmNlcHRvclR5cGVfRGF0YVNvdXJjZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBBY3RpdmF0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNzU0NSw2ICs5MTk5LDE0IEBACiAJCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fVElNRU9VVF9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fVGltZW91dE1ldGhvZCgpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGltZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1RJTUVSID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX1RpbWVyKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC03NTg1LDYgKzkyNDcsMTQgQEAKIAkJRVJlZmVyZW5jZSBNRVNTQUdFX0RSSVZFTl9CRUFOX19BUk9VTkRfSU5WT0tFUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9Bcm91bmRJbnZva2VzKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bcm91bmQgVGltZW91dHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX0FST1VORF9USU1FT1VUUyA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuQmVhbl9Bcm91bmRUaW1lb3V0cygpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNzY3Myw2ICs5MzQzLDIyIEBACiAJCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fUFJFX0RFU1RST1lTID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX1ByZURlc3Ryb3lzKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhIFNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgTUVTU0FHRV9EUklWRU5fQkVBTl9fREFUQV9TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbkJlYW5fRGF0YVNvdXJjZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZSBSZWY8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIE1FU1NBR0VfRFJJVkVOX0JFQU5fX1NFQ1VSSVRZX1JPTEVfUkVGID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5CZWFuX1NlY3VyaXR5Um9sZVJlZigpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgSWRlbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTgxODMsNiArOTg2OSwxNCBAQAogCQlFQXR0cmlidXRlIFNFU1NJT05fQkVBTl9fQlVTSU5FU1NfUkVNT1RFUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9CdXNpbmVzc1JlbW90ZXMoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEJlYW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX0xPQ0FMX0JFQU4gPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fTG9jYWxCZWFuKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIEVuZHBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC04MjA3LDYgKzk5MDEsMTQgQEAKIAkJRUF0dHJpYnV0ZSBTRVNTSU9OX0JFQU5fX1NFU1NJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9TZXNzaW9uVHlwZSgpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhdGVmdWwgVGltZW91dDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fU1RBVEVGVUxfVElNRU9VVCA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9TdGF0ZWZ1bFRpbWVvdXQoKTsKKworCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRpbWVvdXQgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC04MjE1LDYgKzk5MTcsNDYgQEAKIAkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX1RJTUVPVVRfTUVUSE9EID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1RpbWVvdXRNZXRob2QoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRpbWVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX1RJTUVSID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1RpbWVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Jbml0IE9uIFN0YXJ0dXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTRVNTSU9OX0JFQU5fX0lOSVRfT05fU1RBUlRVUCA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9Jbml0T25TdGFydHVwKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25jdXJyZW5jeSBNYW5hZ2VtZW50IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTRVNTSU9OX0JFQU5fX0NPTkNVUlJFTkNZX01BTkFHRU1FTlRfVFlQRSA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9Db25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25jdXJyZW50IE1ldGhvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19DT05DVVJSRU5UX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9Db25jdXJyZW50TWV0aG9kKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXBlbmRzIE9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19ERVBFTkRTX09OID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX0RlcGVuZHNPbigpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTgyMzEsNiArOTk3MywxNCBAQAogCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fUkVNT1ZFX01FVEhPRFMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fUmVtb3ZlTWV0aG9kcygpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXN5bmMgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX0FTWU5DX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9Bc3luY01ldGhvZCgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtODIzOSw2ICs5OTg5LDMwIEBACiAJCUVBdHRyaWJ1dGUgU0VTU0lPTl9CRUFOX19UUkFOU0FDVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1RyYW5zYWN0aW9uVHlwZSgpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWZ0ZXIgQmVnaW4gTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19BRlRFUl9CRUdJTl9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fQWZ0ZXJCZWdpbk1ldGhvZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmVmb3JlIENvbXBsZXRpb24gTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19CRUZPUkVfQ09NUExFVElPTl9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fQmVmb3JlQ29tcGxldGlvbk1ldGhvZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWZ0ZXIgQ29tcGxldGlvbiBNZXRob2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX0FGVEVSX0NPTVBMRVRJT05fTUVUSE9EID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX0FmdGVyQ29tcGxldGlvbk1ldGhvZCgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXJvdW5kIEludm9rZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtODI0Nyw2ICsxMDAyMSwxNCBAQAogCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fQVJPVU5EX0lOVk9LRVMgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fQXJvdW5kSW52b2tlcygpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXJvdW5kIFRpbWVvdXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTRVNTSU9OX0JFQU5fX0FST1VORF9USU1FT1VUUyA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9Bcm91bmRUaW1lb3V0cygpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtODMzNSw2ICsxMDExNywxNCBAQAogCQlFUmVmZXJlbmNlIFNFU1NJT05fQkVBTl9fUFJFX0RFU1RST1lTID0gZUlOU1RBTkNFLmdldFNlc3Npb25CZWFuX1ByZURlc3Ryb3lzKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhIFNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0VTU0lPTl9CRUFOX19EQVRBX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQmVhbl9EYXRhU291cmNlKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IEFjdGl2YXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC04Mzc1LDYgKzEwMTY1LDE5NiBAQAogCQlFQXR0cmlidXRlIFNFU1NJT05fQkVBTl9fSUQgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkJlYW5fSWQoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU3RhdGVmdWxUaW1lb3V0VHlwZUltcGwgPGVtPlN0YXRlZnVsIFRpbWVvdXQgVHlwZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuU3RhdGVmdWxUaW1lb3V0VHlwZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFN0YXRlZnVsVGltZW91dFR5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgU1RBVEVGVUxfVElNRU9VVF9UWVBFID0gZUlOU1RBTkNFLmdldFN0YXRlZnVsVGltZW91dFR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRpbWVvdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTVEFURUZVTF9USU1FT1VUX1RZUEVfX1RJTUVPVVQgPSBlSU5TVEFOQ0UuZ2V0U3RhdGVmdWxUaW1lb3V0VHlwZV9UaW1lb3V0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vbml0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU1RBVEVGVUxfVElNRU9VVF9UWVBFX19VTklUID0gZUlOU1RBTkNFLmdldFN0YXRlZnVsVGltZW91dFR5cGVfVW5pdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTVEFURUZVTF9USU1FT1VUX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldFN0YXRlZnVsVGltZW91dFR5cGVfSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuVGltZXJTY2hlZHVsZVR5cGVJbXBsIDxlbT5UaW1lciBTY2hlZHVsZSBUeXBlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5UaW1lclNjaGVkdWxlVHlwZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFRpbWVyU2NoZWR1bGVUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFRJTUVSX1NDSEVEVUxFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VGltZXJTY2hlZHVsZVR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY29uZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRJTUVSX1NDSEVEVUxFX1RZUEVfX1NFQ09ORCA9IGVJTlNUQU5DRS5nZXRUaW1lclNjaGVkdWxlVHlwZV9TZWNvbmQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1pbnV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRJTUVSX1NDSEVEVUxFX1RZUEVfX01JTlVURSA9IGVJTlNUQU5DRS5nZXRUaW1lclNjaGVkdWxlVHlwZV9NaW51dGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhvdXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBUSU1FUl9TQ0hFRFVMRV9UWVBFX19IT1VSID0gZUlOU1RBTkNFLmdldFRpbWVyU2NoZWR1bGVUeXBlX0hvdXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRheSBPZiBNb250aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRJTUVSX1NDSEVEVUxFX1RZUEVfX0RBWV9PRl9NT05USCA9IGVJTlNUQU5DRS5nZXRUaW1lclNjaGVkdWxlVHlwZV9EYXlPZk1vbnRoKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Nb250aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRJTUVSX1NDSEVEVUxFX1RZUEVfX01PTlRIID0gZUlOU1RBTkNFLmdldFRpbWVyU2NoZWR1bGVUeXBlX01vbnRoKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXkgT2YgV2VlazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRJTUVSX1NDSEVEVUxFX1RZUEVfX0RBWV9PRl9XRUVLID0gZUlOU1RBTkNFLmdldFRpbWVyU2NoZWR1bGVUeXBlX0RheU9mV2VlaygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WWVhcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRJTUVSX1NDSEVEVUxFX1RZUEVfX1lFQVIgPSBlSU5TVEFOQ0UuZ2V0VGltZXJTY2hlZHVsZVR5cGVfWWVhcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBUSU1FUl9TQ0hFRFVMRV9UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXRUaW1lclNjaGVkdWxlVHlwZV9JZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5UaW1lclR5cGVJbXBsIDxlbT5UaW1lciBUeXBlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5UaW1lclR5cGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUaW1lclR5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgVElNRVJfVFlQRSA9IGVJTlNUQU5DRS5nZXRUaW1lclR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBUSU1FUl9UWVBFX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRUaW1lclR5cGVfRGVzY3JpcHRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjaGVkdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgVElNRVJfVFlQRV9fU0NIRURVTEUgPSBlSU5TVEFOQ0UuZ2V0VGltZXJUeXBlX1NjaGVkdWxlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRJTUVSX1RZUEVfX1NUQVJUID0gZUlOU1RBTkNFLmdldFRpbWVyVHlwZV9TdGFydCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVElNRVJfVFlQRV9fRU5EID0gZUlOU1RBTkNFLmdldFRpbWVyVHlwZV9FbmQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRpbWVvdXQgTWV0aG9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgVElNRVJfVFlQRV9fVElNRU9VVF9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0VGltZXJUeXBlX1RpbWVvdXRNZXRob2QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBUSU1FUl9UWVBFX19QRVJTSVNURU5UID0gZUlOU1RBTkNFLmdldFRpbWVyVHlwZV9QZXJzaXN0ZW50KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UaW1lem9uZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRJTUVSX1RZUEVfX1RJTUVaT05FID0gZUlOU1RBTkNFLmdldFRpbWVyVHlwZV9UaW1lem9uZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5mbzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFRJTUVSX1RZUEVfX0lORk8gPSBlSU5TVEFOQ0UuZ2V0VGltZXJUeXBlX0luZm8oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgVElNRVJfVFlQRV9fSUQgPSBlSU5TVEFOQ0UuZ2V0VGltZXJUeXBlX0lkKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5DbXBWZXJzaW9uVHlwZSA8ZW0+Q21wIFZlcnNpb24gVHlwZTwvZW0+fScgZW51bS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC04Mzk1LDYgKzEwMzc1LDI2IEBACiAJCUVFbnVtIENNUl9GSUVMRF9UWVBFID0gZUlOU1RBTkNFLmdldENNUkZpZWxkVHlwZSgpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUgPGVtPkNvbmN1cnJlbmN5IE1hbmFnZW1lbnQgVHlwZSBUeXBlPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Db25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBDT05DVVJSRU5DWV9NQU5BR0VNRU5UX1RZUEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudExvY2tUeXBlVHlwZSA8ZW0+Q29uY3VycmVudCBMb2NrIFR5cGUgVHlwZTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudExvY2tUeXBlVHlwZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q29uY3VycmVudExvY2tUeXBlVHlwZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIENPTkNVUlJFTlRfTE9DS19UWVBFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q29uY3VycmVudExvY2tUeXBlVHlwZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWV0aG9kSW50ZXJmYWNlVHlwZSA8ZW0+TWV0aG9kIEludGVyZmFjZSBUeXBlPC9lbT59JyBlbnVtLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTg0NDUsNiArMTA0NDUsMTYgQEAKIAkJRUVudW0gU0VTU0lPTl9UWVBFID0gZUlOU1RBTkNFLmdldFNlc3Npb25UeXBlKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lVW5pdFR5cGVUeXBlIDxlbT5UaW1lIFVuaXQgVHlwZSBUeXBlPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lVW5pdFR5cGVUeXBlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRUaW1lVW5pdFR5cGVUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gVElNRV9VTklUX1RZUEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRUaW1lVW5pdFR5cGVUeXBlKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgPGVtPlRyYW5zYWN0aW9uIEF0dHJpYnV0ZSBUeXBlPC9lbT59JyBlbnVtLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTg0ODUsNiArMTA0OTUsMjYgQEAKIAkJRURhdGFUeXBlIENNUl9GSUVMRF9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRDTVJGaWVsZFR5cGVPYmplY3QoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkNvbmN1cnJlbmN5IE1hbmFnZW1lbnQgVHlwZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbmN1cnJlbmN5TWFuYWdlbWVudFR5cGVUeXBlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCNnZXRDb25jdXJyZW5jeU1hbmFnZW1lbnRUeXBlVHlwZU9iamVjdCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVEYXRhVHlwZSBDT05DVVJSRU5DWV9NQU5BR0VNRU5UX1RZUEVfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0Q29uY3VycmVuY3lNYW5hZ2VtZW50VHlwZVR5cGVPYmplY3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkNvbmN1cnJlbnQgTG9jayBUeXBlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudExvY2tUeXBlVHlwZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwjZ2V0Q29uY3VycmVudExvY2tUeXBlVHlwZU9iamVjdCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVEYXRhVHlwZSBDT05DVVJSRU5UX0xPQ0tfVFlQRV9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRDb25jdXJyZW50TG9ja1R5cGVUeXBlT2JqZWN0KCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5DbGFzcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC04NTY1LDYgKzEwNTk1LDE2IEBACiAJCUVEYXRhVHlwZSBTRVNTSU9OX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldFNlc3Npb25UeXBlT2JqZWN0KCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5UaW1lIFVuaXQgVHlwZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVVbml0VHlwZVR5cGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsI2dldFRpbWVVbml0VHlwZVR5cGVPYmplY3QoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRGF0YVR5cGUgVElNRV9VTklUX1RZUEVfVFlQRV9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0VGltZVVuaXRUeXBlVHlwZU9iamVjdCgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VHJhbnNhY3Rpb24gQXR0cmlidXRlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYkFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggNGYwYTAwZi4uNDk3Yzc4YyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtNTgsNiArNTgsNyBAQAogCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKQEAgLTY5LDExMCArNzAsMTc1IEBACiAJfQogCiAJLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCisJICogVGhlIHN3aXRjaCB0aGF0IGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByb3RlY3RlZCBFamJTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgRWpiU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIG9iamVjdCkgeworCXByb3RlY3RlZCBFamJTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgRWpiU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQWNjZXNzVGltZW91dFR5cGUoQWNjZXNzVGltZW91dFR5cGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUFjY2Vzc1RpbWVvdXRUeXBlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eShBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uRXhjZXB0aW9uKEFwcGxpY2F0aW9uRXhjZXB0aW9uIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQXBwbGljYXRpb25FeGNlcHRpb24oQXBwbGljYXRpb25FeGNlcHRpb24gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uRXhjZXB0aW9uQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXJvdW5kSW52b2tlVHlwZShBcm91bmRJbnZva2VUeXBlIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQXJvdW5kSW52b2tlVHlwZShBcm91bmRJbnZva2VUeXBlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVBcm91bmRJbnZva2VUeXBlQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFyb3VuZFRpbWVvdXRUeXBlKEFyb3VuZFRpbWVvdXRUeXBlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVBcm91bmRUaW1lb3V0VHlwZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3Igb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvckFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUNNUEZpZWxkKENNUEZpZWxkIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQXN5bmNNZXRob2RUeXBlKEFzeW5jTWV0aG9kVHlwZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQXN5bmNNZXRob2RUeXBlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQ01QRmllbGQoQ01QRmllbGQgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUNNUEZpZWxkQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlQ01SRmllbGQoQ01SRmllbGQgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDTVJGaWVsZChDTVJGaWVsZCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQ01SRmllbGRBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250YWluZXJUcmFuc2FjdGlvblR5cGUoQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29uY3VycmVudE1ldGhvZFR5cGUoQ29uY3VycmVudE1ldGhvZFR5cGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNvbmN1cnJlbnRNZXRob2RUeXBlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCSmFyKEVKQkphciBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZURlcGVuZHNPblR5cGUoRGVwZW5kc09uVHlwZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlRGVwZW5kc09uVHlwZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUVKQkphcihFSkJKYXIgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVKQkphckFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yKEVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRUpCUmVsYXRpb24oRUpCUmVsYXRpb24gb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFSkJSZWxhdGlvbihFSkJSZWxhdGlvbiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRUpCUmVsYXRpb25BZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbnNoaXBSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFSkJSZWxhdGlvbnNoaXBSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGVBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFbnRlcnByaXNlQmVhbnMoRW50ZXJwcmlzZUJlYW5zIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRW50ZXJwcmlzZUJlYW5zKEVudGVycHJpc2VCZWFucyBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRW50ZXJwcmlzZUJlYW5zQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRW50aXR5QmVhbihFbnRpdHlCZWFuIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRW50aXR5QmVhbihFbnRpdHlCZWFuIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFbnRpdHlCZWFuQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRXhjbHVkZUxpc3QoRXhjbHVkZUxpc3Qgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRXhjbHVkZUxpc3RBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VJbml0TWV0aG9kVHlwZShJbml0TWV0aG9kVHlwZSBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUluaXRNZXRob2RUeXBlKEluaXRNZXRob2RUeXBlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVJbml0TWV0aG9kVHlwZUFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUludGVyY2VwdG9yQmluZGluZ1R5cGUoSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUludGVyY2VwdG9yQmluZGluZ1R5cGUoSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSW50ZXJjZXB0b3JCaW5kaW5nVHlwZUFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUludGVyY2VwdG9yT3JkZXJUeXBlKEludGVyY2VwdG9yT3JkZXJUeXBlIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSW50ZXJjZXB0b3JPcmRlclR5cGUoSW50ZXJjZXB0b3JPcmRlclR5cGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUludGVyY2VwdG9yT3JkZXJUeXBlQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSW50ZXJjZXB0b3JzVHlwZShJbnRlcmNlcHRvcnNUeXBlIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSW50ZXJjZXB0b3JzVHlwZShJbnRlcmNlcHRvcnNUeXBlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVJbnRlcmNlcHRvcnNUeXBlQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSW50ZXJjZXB0b3JUeXBlKEludGVyY2VwdG9yVHlwZSBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUludGVyY2VwdG9yVHlwZShJbnRlcmNlcHRvclR5cGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUludGVyY2VwdG9yVHlwZUFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEcml2ZW5CZWFuKE1lc3NhZ2VEcml2ZW5CZWFuIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTWVzc2FnZURyaXZlbkJlYW4oTWVzc2FnZURyaXZlbkJlYW4gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEcml2ZW5CZWFuQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kUGFyYW1zKE1ldGhvZFBhcmFtcyBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFBhcmFtcyhNZXRob2RQYXJhbXMgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFBhcmFtc0FkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBlcm1pc3Npb24oTWV0aG9kUGVybWlzc2lvbiBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFBlcm1pc3Npb24oTWV0aG9kUGVybWlzc2lvbiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGVybWlzc2lvbkFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFR5cGUoTWV0aG9kVHlwZSBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFR5cGUoTWV0aG9kVHlwZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTWV0aG9kVHlwZUFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU5hbWVkTWV0aG9kVHlwZShOYW1lZE1ldGhvZFR5cGUgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VOYW1lZE1ldGhvZFR5cGUoTmFtZWRNZXRob2RUeXBlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVOYW1lZE1ldGhvZFR5cGVBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VRdWVyeShRdWVyeSBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVF1ZXJ5KFF1ZXJ5IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVRdWVyeUFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUXVlcnlNZXRob2QoUXVlcnlNZXRob2Qgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVF1ZXJ5TWV0aG9kQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZShSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGVBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZWxhdGlvbnNoaXBzKFJlbGF0aW9uc2hpcHMgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSZWxhdGlvbnNoaXBzKFJlbGF0aW9uc2hpcHMgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVJlbGF0aW9uc2hpcHNBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZW1vdmVNZXRob2RUeXBlKFJlbW92ZU1ldGhvZFR5cGUgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSZW1vdmVNZXRob2RUeXBlKFJlbW92ZU1ldGhvZFR5cGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVJlbW92ZU1ldGhvZFR5cGVBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eUlkZW50aXR5VHlwZShTZWN1cml0eUlkZW50aXR5VHlwZSBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNlY3VyaXR5SWRlbnRpdHlUeXBlKFNlY3VyaXR5SWRlbnRpdHlUeXBlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVTZWN1cml0eUlkZW50aXR5VHlwZUFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlc3Npb25CZWFuKFNlc3Npb25CZWFuIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2Vzc2lvbkJlYW4oU2Vzc2lvbkJlYW4gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVNlc3Npb25CZWFuQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU3RhdGVmdWxUaW1lb3V0VHlwZShTdGF0ZWZ1bFRpbWVvdXRUeXBlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTdGF0ZWZ1bFRpbWVvdXRUeXBlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGltZXJTY2hlZHVsZVR5cGUoVGltZXJTY2hlZHVsZVR5cGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVRpbWVyU2NoZWR1bGVUeXBlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlVGltZXJUeXBlKFRpbWVyVHlwZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlVGltZXJUeXBlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwogCQkJfQogCQl9OwpAQCAtMTg1LDEyICsyNTEsMjcgQEAKIAkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwogCX0KIAogCiAJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY2Nlc3NUaW1lb3V0VHlwZSA8ZW0+QWNjZXNzIFRpbWVvdXQgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5BY2Nlc3NUaW1lb3V0VHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY2Nlc3NUaW1lb3V0VHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQWN0aXZhdGlvbkNvbmZpZyA8ZW0+QWN0aXZhdGlvbiBDb25maWc8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwpAQCAtMjQ3LDYgKzMyOCwyMCBAQAogCX0KIAogCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kVGltZW91dFR5cGUgPGVtPkFyb3VuZCBUaW1lb3V0IFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQXJvdW5kVGltZW91dFR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJvdW5kVGltZW91dFR5cGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvciA8ZW0+QXNzZW1ibHkgRGVzY3JpcHRvcjwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CkBAIC0yNjEsNiArMzU2LDIwIEBACiAJfQogCiAJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5Bc3luY01ldGhvZFR5cGUgPGVtPkFzeW5jIE1ldGhvZCBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFzeW5jTWV0aG9kVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBc3luY01ldGhvZFR5cGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNNUEZpZWxkIDxlbT5DTVAgRmllbGQ8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwpAQCAtMjg5LDYgKzM5OCwyMCBAQAogCX0KIAogCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudE1ldGhvZFR5cGUgPGVtPkNvbmN1cnJlbnQgTWV0aG9kIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuQ29uY3VycmVudE1ldGhvZFR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uY3VycmVudE1ldGhvZFR5cGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSA8ZW0+Q29udGFpbmVyIFRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwpAQCAtMzAzLDYgKzQyNiwyMCBAQAogCX0KIAogCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRGVwZW5kc09uVHlwZSA8ZW0+RGVwZW5kcyBPbiBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkRlcGVuZHNPblR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVwZW5kc09uVHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyIDxlbT5FSkIgSmFyPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKQEAgLTYzOSw2ICs3NzYsNDggQEAKIAl9CiAKIAkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlN0YXRlZnVsVGltZW91dFR5cGUgPGVtPlN0YXRlZnVsIFRpbWVvdXQgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TdGF0ZWZ1bFRpbWVvdXRUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0YXRlZnVsVGltZW91dFR5cGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlIDxlbT5UaW1lciBTY2hlZHVsZSBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlRpbWVyU2NoZWR1bGVUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRpbWVyU2NoZWR1bGVUeXBlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5UaW1lclR5cGUgPGVtPlRpbWVyIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuVGltZXJUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRpbWVyVHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDUwM2Q1NWMuLmUxZGNkYjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewogCQlYTUxSZXNvdXJjZSByZXN1bHQgPSBuZXcgRWpiUmVzb3VyY2VJbXBsKHVyaSk7CiAJCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlJlc291cmNlSW1wbC5qYXZhCmluZGV4IGQyOGVhNTcuLjVkMjc4MGIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiUmVzb3VyY2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJSZXNvdXJjZUltcGwuamF2YQpAQCAtNDAsMTggKzQwLDIwIEBACiAJCXN1cGVyKHVyaSk7CiAJfQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBYTUxMb2FkIGNyZWF0ZVhNTExvYWQoKSB7CiAJCSByZXR1cm4gbmV3IEpFRVhNTExvYWRJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKIAl9CiAKIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpIHsKIAkJCiAJCXJldHVybiBuZXcgRWpiWE1MSGVscGVySW1wbCh0aGlzKTsKIAl9CiAJCiAJLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwudXRpbC5JRUpCUmVzb3VyY2UjZ2V0Um9vdE9iamVjdCgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5JRUpCUmVzb3VyY2UjZ2V0Um9vdE9iamVjdCgpCiAJICovCiAJcHVibGljIEVPYmplY3QgZ2V0Um9vdE9iamVjdCgpIHsKIAkJaWYgKGNvbnRlbnRzID09IG51bGwgfHwgY29udGVudHMuaXNFbXB0eSgpKQpAQCAtNjMsNyArNjUsNyBAQAogCQlyZXR1cm4gKEVPYmplY3QpKChFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcilyb290KS5nZXRFamJKYXIoKTsKIAl9CiAJLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwudXRpbC5JRUpCUmVzb3VyY2UjZ2V0RWpiSmFyKCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLklFSkJSZXNvdXJjZSNnZXRFamJKYXIoKQogCSAqLwogCXB1YmxpYyBFSkJKYXIgZ2V0RWpiSmFyKCkgewogCQlyZXR1cm4gKEVKQkphcilnZXRSb290T2JqZWN0KCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJTd2l0Y2guamF2YQppbmRleCBiOGUxOGFjLi5hZTk2YzI5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlN3aXRjaC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiU3dpdGNoLmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZQogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgRWpiU3dpdGNoIHsKK3B1YmxpYyBjbGFzcyBFamJTd2l0Y2g8VD4gewogCS8qKgogCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC02MCw3ICs2MCw3IEBACiAJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwlwdWJsaWMgVCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKIAkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwogCX0KIApAQCAtNzEsMTYgKzcxLDE2IEBACiAJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwlwcm90ZWN0ZWQgVCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKIAkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7CiAJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKIAkJfQogCQllbHNlIHsKLQkJCUxpc3QgZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwogCQkJcmV0dXJuCiAJCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KIAkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaCgoRUNsYXNzKWVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CisJCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7CiAJCX0KIAl9CiAKQEAgLTkxLDE5NyArOTEsMjQ1IEBACiAJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKIAkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgRWpiUGFja2FnZS5BQ0NFU1NfVElNRU9VVF9UWVBFOiB7CisJCQkJQWNjZXNzVGltZW91dFR5cGUgYWNjZXNzVGltZW91dFR5cGUgPSAoQWNjZXNzVGltZW91dFR5cGUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VBY2Nlc3NUaW1lb3V0VHlwZShhY2Nlc3NUaW1lb3V0VHlwZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHOiB7CiAJCQkJQWN0aXZhdGlvbkNvbmZpZyBhY3RpdmF0aW9uQ29uZmlnID0gKEFjdGl2YXRpb25Db25maWcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFjdGl2YXRpb25Db25maWcoYWN0aXZhdGlvbkNvbmZpZyk7CisJCQkJVCByZXN1bHQgPSBjYXNlQWN0aXZhdGlvbkNvbmZpZyhhY3RpdmF0aW9uQ29uZmlnKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFk6IHsKIAkJCQlBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5ID0gKEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSk7CisJCQkJVCByZXN1bHQgPSBjYXNlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLkFQUExJQ0FUSU9OX0VYQ0VQVElPTjogewogCQkJCUFwcGxpY2F0aW9uRXhjZXB0aW9uIGFwcGxpY2F0aW9uRXhjZXB0aW9uID0gKEFwcGxpY2F0aW9uRXhjZXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBcHBsaWNhdGlvbkV4Y2VwdGlvbihhcHBsaWNhdGlvbkV4Y2VwdGlvbik7CisJCQkJVCByZXN1bHQgPSBjYXNlQXBwbGljYXRpb25FeGNlcHRpb24oYXBwbGljYXRpb25FeGNlcHRpb24pOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgRWpiUGFja2FnZS5BUk9VTkRfSU5WT0tFX1RZUEU6IHsKIAkJCQlBcm91bmRJbnZva2VUeXBlIGFyb3VuZEludm9rZVR5cGUgPSAoQXJvdW5kSW52b2tlVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXJvdW5kSW52b2tlVHlwZShhcm91bmRJbnZva2VUeXBlKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VBcm91bmRJbnZva2VUeXBlKGFyb3VuZEludm9rZVR5cGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgRWpiUGFja2FnZS5BUk9VTkRfVElNRU9VVF9UWVBFOiB7CisJCQkJQXJvdW5kVGltZW91dFR5cGUgYXJvdW5kVGltZW91dFR5cGUgPSAoQXJvdW5kVGltZW91dFR5cGUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VBcm91bmRUaW1lb3V0VHlwZShhcm91bmRUaW1lb3V0VHlwZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1I6IHsKIAkJCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gKEFzc2VtYmx5RGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKGFzc2VtYmx5RGVzY3JpcHRvcik7CisJCQkJVCByZXN1bHQgPSBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKGFzc2VtYmx5RGVzY3JpcHRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBFamJQYWNrYWdlLkFTWU5DX01FVEhPRF9UWVBFOiB7CisJCQkJQXN5bmNNZXRob2RUeXBlIGFzeW5jTWV0aG9kVHlwZSA9IChBc3luY01ldGhvZFR5cGUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VBc3luY01ldGhvZFR5cGUoYXN5bmNNZXRob2RUeXBlKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEVqYlBhY2thZ2UuQ01QX0ZJRUxEOiB7CiAJCQkJQ01QRmllbGQgY21wRmllbGQgPSAoQ01QRmllbGQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNNUEZpZWxkKGNtcEZpZWxkKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDTVBGaWVsZChjbXBGaWVsZCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRDogewogCQkJCUNNUkZpZWxkIGNtckZpZWxkID0gKENNUkZpZWxkKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VDTVJGaWVsZChjbXJGaWVsZCk7CisJCQkJVCByZXN1bHQgPSBjYXNlQ01SRmllbGQoY21yRmllbGQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgRWpiUGFja2FnZS5DT05DVVJSRU5UX01FVEhPRF9UWVBFOiB7CisJCQkJQ29uY3VycmVudE1ldGhvZFR5cGUgY29uY3VycmVudE1ldGhvZFR5cGUgPSAoQ29uY3VycmVudE1ldGhvZFR5cGUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDb25jdXJyZW50TWV0aG9kVHlwZShjb25jdXJyZW50TWV0aG9kVHlwZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9UUkFOU0FDVElPTl9UWVBFOiB7CiAJCQkJQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlIGNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSA9IChDb250YWluZXJUcmFuc2FjdGlvblR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZShjb250YWluZXJUcmFuc2FjdGlvblR5cGUpOworCQkJCVQgcmVzdWx0ID0gY2FzZUNvbnRhaW5lclRyYW5zYWN0aW9uVHlwZShjb250YWluZXJUcmFuc2FjdGlvblR5cGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgRWpiUGFja2FnZS5ERVBFTkRTX09OX1RZUEU6IHsKKwkJCQlEZXBlbmRzT25UeXBlIGRlcGVuZHNPblR5cGUgPSAoRGVwZW5kc09uVHlwZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZURlcGVuZHNPblR5cGUoZGVwZW5kc09uVHlwZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVI6IHsKIAkJCQlFSkJKYXIgZWpiSmFyID0gKEVKQkphcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCSmFyKGVqYkphcik7CisJCQkJVCByZXN1bHQgPSBjYXNlRUpCSmFyKGVqYkphcik7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfREVQTE9ZTUVOVF9ERVNDUklQVE9SOiB7CiAJCQkJRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IgZWpiSmFyRGVwbG95bWVudERlc2NyaXB0b3IgPSAoRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVKQkphckRlcGxveW1lbnREZXNjcmlwdG9yKGVqYkphckRlcGxveW1lbnREZXNjcmlwdG9yKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcihlamJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcik7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTjogewogCQkJCUVKQlJlbGF0aW9uIGVqYlJlbGF0aW9uID0gKEVKQlJlbGF0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFSkJSZWxhdGlvbihlamJSZWxhdGlvbik7CisJCQkJVCByZXN1bHQgPSBjYXNlRUpCUmVsYXRpb24oZWpiUmVsYXRpb24pOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEU6IHsKIAkJCQlFSkJSZWxhdGlvbnNoaXBSb2xlIGVqYlJlbGF0aW9uc2hpcFJvbGUgPSAoRUpCUmVsYXRpb25zaGlwUm9sZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRUpCUmVsYXRpb25zaGlwUm9sZShlamJSZWxhdGlvbnNoaXBSb2xlKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VFSkJSZWxhdGlvbnNoaXBSb2xlKGVqYlJlbGF0aW9uc2hpcFJvbGUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5TOiB7CiAJCQkJRW50ZXJwcmlzZUJlYW5zIGVudGVycHJpc2VCZWFucyA9IChFbnRlcnByaXNlQmVhbnMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVudGVycHJpc2VCZWFucyhlbnRlcnByaXNlQmVhbnMpOworCQkJCVQgcmVzdWx0ID0gY2FzZUVudGVycHJpc2VCZWFucyhlbnRlcnByaXNlQmVhbnMpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfQkVBTjogewogCQkJCUVudGl0eUJlYW4gZW50aXR5QmVhbiA9IChFbnRpdHlCZWFuKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFbnRpdHlCZWFuKGVudGl0eUJlYW4pOworCQkJCVQgcmVzdWx0ID0gY2FzZUVudGl0eUJlYW4oZW50aXR5QmVhbik7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVDogewogCQkJCUV4Y2x1ZGVMaXN0IGV4Y2x1ZGVMaXN0ID0gKEV4Y2x1ZGVMaXN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeGNsdWRlTGlzdChleGNsdWRlTGlzdCk7CisJCQkJVCByZXN1bHQgPSBjYXNlRXhjbHVkZUxpc3QoZXhjbHVkZUxpc3QpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgRWpiUGFja2FnZS5JTklUX01FVEhPRF9UWVBFOiB7CiAJCQkJSW5pdE1ldGhvZFR5cGUgaW5pdE1ldGhvZFR5cGUgPSAoSW5pdE1ldGhvZFR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUluaXRNZXRob2RUeXBlKGluaXRNZXRob2RUeXBlKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VJbml0TWV0aG9kVHlwZShpbml0TWV0aG9kVHlwZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX0JJTkRJTkdfVFlQRTogewogCQkJCUludGVyY2VwdG9yQmluZGluZ1R5cGUgaW50ZXJjZXB0b3JCaW5kaW5nVHlwZSA9IChJbnRlcmNlcHRvckJpbmRpbmdUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VJbnRlcmNlcHRvckJpbmRpbmdUeXBlKGludGVyY2VwdG9yQmluZGluZ1R5cGUpOworCQkJCVQgcmVzdWx0ID0gY2FzZUludGVyY2VwdG9yQmluZGluZ1R5cGUoaW50ZXJjZXB0b3JCaW5kaW5nVHlwZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLklOVEVSQ0VQVE9SX09SREVSX1RZUEU6IHsKIAkJCQlJbnRlcmNlcHRvck9yZGVyVHlwZSBpbnRlcmNlcHRvck9yZGVyVHlwZSA9IChJbnRlcmNlcHRvck9yZGVyVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSW50ZXJjZXB0b3JPcmRlclR5cGUoaW50ZXJjZXB0b3JPcmRlclR5cGUpOworCQkJCVQgcmVzdWx0ID0gY2FzZUludGVyY2VwdG9yT3JkZXJUeXBlKGludGVyY2VwdG9yT3JkZXJUeXBlKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEVqYlBhY2thZ2UuSU5URVJDRVBUT1JTX1RZUEU6IHsKIAkJCQlJbnRlcmNlcHRvcnNUeXBlIGludGVyY2VwdG9yc1R5cGUgPSAoSW50ZXJjZXB0b3JzVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSW50ZXJjZXB0b3JzVHlwZShpbnRlcmNlcHRvcnNUeXBlKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VJbnRlcmNlcHRvcnNUeXBlKGludGVyY2VwdG9yc1R5cGUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgRWpiUGFja2FnZS5JTlRFUkNFUFRPUl9UWVBFOiB7CiAJCQkJSW50ZXJjZXB0b3JUeXBlIGludGVyY2VwdG9yVHlwZSA9IChJbnRlcmNlcHRvclR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUludGVyY2VwdG9yVHlwZShpbnRlcmNlcHRvclR5cGUpOworCQkJCVQgcmVzdWx0ID0gY2FzZUludGVyY2VwdG9yVHlwZShpbnRlcmNlcHRvclR5cGUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9CRUFOOiB7CiAJCQkJTWVzc2FnZURyaXZlbkJlYW4gbWVzc2FnZURyaXZlbkJlYW4gPSAoTWVzc2FnZURyaXZlbkJlYW4pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1lc3NhZ2VEcml2ZW5CZWFuKG1lc3NhZ2VEcml2ZW5CZWFuKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VNZXNzYWdlRHJpdmVuQmVhbihtZXNzYWdlRHJpdmVuQmVhbik7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QQVJBTVM6IHsKIAkJCQlNZXRob2RQYXJhbXMgbWV0aG9kUGFyYW1zID0gKE1ldGhvZFBhcmFtcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kUGFyYW1zKG1ldGhvZFBhcmFtcyk7CisJCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kUGFyYW1zKG1ldGhvZFBhcmFtcyk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OOiB7CiAJCQkJTWV0aG9kUGVybWlzc2lvbiBtZXRob2RQZXJtaXNzaW9uID0gKE1ldGhvZFBlcm1pc3Npb24pdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1ldGhvZFBlcm1pc3Npb24obWV0aG9kUGVybWlzc2lvbik7CisJCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kUGVybWlzc2lvbihtZXRob2RQZXJtaXNzaW9uKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RZUEU6IHsKIAkJCQlNZXRob2RUeXBlIG1ldGhvZFR5cGUgPSAoTWV0aG9kVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWV0aG9kVHlwZShtZXRob2RUeXBlKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RUeXBlKG1ldGhvZFR5cGUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgRWpiUGFja2FnZS5OQU1FRF9NRVRIT0RfVFlQRTogewogCQkJCU5hbWVkTWV0aG9kVHlwZSBuYW1lZE1ldGhvZFR5cGUgPSAoTmFtZWRNZXRob2RUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VOYW1lZE1ldGhvZFR5cGUobmFtZWRNZXRob2RUeXBlKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VOYW1lZE1ldGhvZFR5cGUobmFtZWRNZXRob2RUeXBlKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEVqYlBhY2thZ2UuUVVFUlk6IHsKIAkJCQlRdWVyeSBxdWVyeSA9IChRdWVyeSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUXVlcnkocXVlcnkpOworCQkJCVQgcmVzdWx0ID0gY2FzZVF1ZXJ5KHF1ZXJ5KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EOiB7CiAJCQkJUXVlcnlNZXRob2QgcXVlcnlNZXRob2QgPSAoUXVlcnlNZXRob2QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVF1ZXJ5TWV0aG9kKHF1ZXJ5TWV0aG9kKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VRdWVyeU1ldGhvZChxdWVyeU1ldGhvZCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUF9ST0xFX1NPVVJDRV9UWVBFOiB7CiAJCQkJUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgcmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgPSAoUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKHJlbGF0aW9uc2hpcFJvbGVTb3VyY2VUeXBlKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VSZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZShyZWxhdGlvbnNoaXBSb2xlU291cmNlVHlwZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFM6IHsKIAkJCQlSZWxhdGlvbnNoaXBzIHJlbGF0aW9uc2hpcHMgPSAoUmVsYXRpb25zaGlwcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVsYXRpb25zaGlwcyhyZWxhdGlvbnNoaXBzKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VSZWxhdGlvbnNoaXBzKHJlbGF0aW9uc2hpcHMpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgRWpiUGFja2FnZS5SRU1PVkVfTUVUSE9EX1RZUEU6IHsKIAkJCQlSZW1vdmVNZXRob2RUeXBlIHJlbW92ZU1ldGhvZFR5cGUgPSAoUmVtb3ZlTWV0aG9kVHlwZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmVtb3ZlTWV0aG9kVHlwZShyZW1vdmVNZXRob2RUeXBlKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VSZW1vdmVNZXRob2RUeXBlKHJlbW92ZU1ldGhvZFR5cGUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgRWpiUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9UWVBFOiB7CiAJCQkJU2VjdXJpdHlJZGVudGl0eVR5cGUgc2VjdXJpdHlJZGVudGl0eVR5cGUgPSAoU2VjdXJpdHlJZGVudGl0eVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3VyaXR5SWRlbnRpdHlUeXBlKHNlY3VyaXR5SWRlbnRpdHlUeXBlKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VTZWN1cml0eUlkZW50aXR5VHlwZShzZWN1cml0eUlkZW50aXR5VHlwZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fQkVBTjogewogCQkJCVNlc3Npb25CZWFuIHNlc3Npb25CZWFuID0gKFNlc3Npb25CZWFuKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VTZXNzaW9uQmVhbihzZXNzaW9uQmVhbik7CisJCQkJVCByZXN1bHQgPSBjYXNlU2Vzc2lvbkJlYW4oc2Vzc2lvbkJlYW4pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgRWpiUGFja2FnZS5TVEFURUZVTF9USU1FT1VUX1RZUEU6IHsKKwkJCQlTdGF0ZWZ1bFRpbWVvdXRUeXBlIHN0YXRlZnVsVGltZW91dFR5cGUgPSAoU3RhdGVmdWxUaW1lb3V0VHlwZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVN0YXRlZnVsVGltZW91dFR5cGUoc3RhdGVmdWxUaW1lb3V0VHlwZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBFamJQYWNrYWdlLlRJTUVSX1NDSEVEVUxFX1RZUEU6IHsKKwkJCQlUaW1lclNjaGVkdWxlVHlwZSB0aW1lclNjaGVkdWxlVHlwZSA9IChUaW1lclNjaGVkdWxlVHlwZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVRpbWVyU2NoZWR1bGVUeXBlKHRpbWVyU2NoZWR1bGVUeXBlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEVqYlBhY2thZ2UuVElNRVJfVFlQRTogeworCQkJCVRpbWVyVHlwZSB0aW1lclR5cGUgPSAoVGltZXJUeXBlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlVGltZXJUeXBlKHRpbWVyVHlwZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQpAQCAtMjkwLDQ5NyArMzM4LDYxNyBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY2Nlc3MgVGltZW91dCBUeXBlPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2YXRpb24gQ29uZmlnPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjY2VzcyBUaW1lb3V0IFR5cGU8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2YXRpb25Db25maWcoQWN0aXZhdGlvbkNvbmZpZyBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlQWNjZXNzVGltZW91dFR5cGUoQWNjZXNzVGltZW91dFR5cGUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZzwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlQWN0aXZhdGlvbkNvbmZpZyhBY3RpdmF0aW9uQ29uZmlnIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2YXRpb24gQ29uZmlnIFByb3BlcnR5PC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2F0aW9uIEV4Y2VwdGlvbjwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3RpdmF0aW9uIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlQXBwbGljYXRpb25FeGNlcHRpb24oQXBwbGljYXRpb25FeGNlcHRpb24gb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eShBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bcm91bmQgSW52b2tlIFR5cGU8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYXRpb24gRXhjZXB0aW9uPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFyb3VuZCBJbnZva2UgVHlwZTwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhdGlvbiBFeGNlcHRpb248L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFyb3VuZEludm9rZVR5cGUoQXJvdW5kSW52b2tlVHlwZSBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlQXBwbGljYXRpb25FeGNlcHRpb24oQXBwbGljYXRpb25FeGNlcHRpb24gb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFyb3VuZCBJbnZva2UgVHlwZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFyb3VuZCBJbnZva2UgVHlwZTwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlQXJvdW5kSW52b2tlVHlwZShBcm91bmRJbnZva2VUeXBlIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q01QIEZpZWxkPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFyb3VuZCBUaW1lb3V0IFR5cGU8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q01QIEZpZWxkPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFyb3VuZCBUaW1lb3V0IFR5cGU8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNNUEZpZWxkKENNUEZpZWxkIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VBcm91bmRUaW1lb3V0VHlwZShBcm91bmRUaW1lb3V0VHlwZSBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNNUiBGaWVsZDwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNNUiBGaWVsZDwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bc3NlbWJseSBEZXNjcmlwdG9yPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDTVJGaWVsZChDTVJGaWVsZCBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzeW5jIE1ldGhvZCBUeXBlPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRhaW5lciBUcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzeW5jIE1ldGhvZCBUeXBlPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDb250YWluZXJUcmFuc2FjdGlvblR5cGUoQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VBc3luY01ldGhvZFR5cGUoQXN5bmNNZXRob2RUeXBlIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIEphcjwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DTVAgRmllbGQ8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIEphcjwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DTVAgRmllbGQ8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphcihFSkJKYXIgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUNNUEZpZWxkKENNUEZpZWxkIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIEphciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q01SIEZpZWxkPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBKYXIgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNNUiBGaWVsZDwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3IoRUpCSmFyRGVwbG95bWVudERlc2NyaXB0b3Igb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUNNUkZpZWxkKENNUkZpZWxkIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmN1cnJlbnQgTWV0aG9kIFR5cGU8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmN1cnJlbnQgTWV0aG9kIFR5cGU8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVKQlJlbGF0aW9uKEVKQlJlbGF0aW9uIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VDb25jdXJyZW50TWV0aG9kVHlwZShDb25jdXJyZW50TWV0aG9kVHlwZSBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBSZWxhdGlvbnNoaXAgUm9sZTwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250YWluZXIgVHJhbnNhY3Rpb24gVHlwZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGFpbmVyIFRyYW5zYWN0aW9uIFR5cGU8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVKQlJlbGF0aW9uc2hpcFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlQ29udGFpbmVyVHJhbnNhY3Rpb25UeXBlKENvbnRhaW5lclRyYW5zYWN0aW9uVHlwZSBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVwZW5kcyBPbiBUeXBlPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudGVycHJpc2UgQmVhbnM8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVwZW5kcyBPbiBUeXBlPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFbnRlcnByaXNlQmVhbnMoRW50ZXJwcmlzZUJlYW5zIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VEZXBlbmRzT25UeXBlKERlcGVuZHNPblR5cGUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnRpdHkgQmVhbjwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgSmFyPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVudGl0eSBCZWFuPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVKQiBKYXI8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVudGl0eUJlYW4oRW50aXR5QmVhbiBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlRUpCSmFyKEVKQkphciBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgSmFyIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGNsdWRlIExpc3Q8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIEphciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUV4Y2x1ZGVMaXN0KEV4Y2x1ZGVMaXN0IG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvcihFSkJKYXJEZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluaXQgTWV0aG9kIFR5cGU8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluaXQgTWV0aG9kIFR5cGU8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIFJlbGF0aW9uPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VJbml0TWV0aG9kVHlwZShJbml0TWV0aG9kVHlwZSBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlRUpCUmVsYXRpb24oRUpCUmVsYXRpb24gb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlcmNlcHRvciBCaW5kaW5nIFR5cGU8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RUpCIFJlbGF0aW9uc2hpcCBSb2xlPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyY2VwdG9yIEJpbmRpbmcgVHlwZTwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FSkIgUmVsYXRpb25zaGlwIFJvbGU8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUludGVyY2VwdG9yQmluZGluZ1R5cGUoSW50ZXJjZXB0b3JCaW5kaW5nVHlwZSBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlRUpCUmVsYXRpb25zaGlwUm9sZShFSkJSZWxhdGlvbnNoaXBSb2xlIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZXJjZXB0b3IgT3JkZXIgVHlwZTwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnRlcnByaXNlIEJlYW5zPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyY2VwdG9yIE9yZGVyIFR5cGU8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RW50ZXJwcmlzZSBCZWFuczwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlSW50ZXJjZXB0b3JPcmRlclR5cGUoSW50ZXJjZXB0b3JPcmRlclR5cGUgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUVudGVycHJpc2VCZWFucyhFbnRlcnByaXNlQmVhbnMgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlcmNlcHRvcnMgVHlwZTwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnRpdHkgQmVhbjwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlcmNlcHRvcnMgVHlwZTwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbnRpdHkgQmVhbjwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlSW50ZXJjZXB0b3JzVHlwZShJbnRlcmNlcHRvcnNUeXBlIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VFbnRpdHlCZWFuKEVudGl0eUJlYW4gb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlcmNlcHRvciBUeXBlPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlcmNlcHRvciBUeXBlPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4Y2x1ZGUgTGlzdDwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlSW50ZXJjZXB0b3JUeXBlKEludGVyY2VwdG9yVHlwZSBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlRXhjbHVkZUxpc3QoRXhjbHVkZUxpc3Qgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERyaXZlbiBCZWFuPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkluaXQgTWV0aG9kIFR5cGU8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEcml2ZW4gQmVhbjwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Jbml0IE1ldGhvZCBUeXBlPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRHJpdmVuQmVhbihNZXNzYWdlRHJpdmVuQmVhbiBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlSW5pdE1ldGhvZFR5cGUoSW5pdE1ldGhvZFR5cGUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyY2VwdG9yIEJpbmRpbmcgVHlwZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFyYW1zPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkludGVyY2VwdG9yIEJpbmRpbmcgVHlwZTwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlTWV0aG9kUGFyYW1zKE1ldGhvZFBhcmFtcyBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlSW50ZXJjZXB0b3JCaW5kaW5nVHlwZShJbnRlcmNlcHRvckJpbmRpbmdUeXBlIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBlcm1pc3Npb248L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZXJjZXB0b3IgT3JkZXIgVHlwZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGVybWlzc2lvbjwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlcmNlcHRvciBPcmRlciBUeXBlPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQZXJtaXNzaW9uKE1ldGhvZFBlcm1pc3Npb24gb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUludGVyY2VwdG9yT3JkZXJUeXBlKEludGVyY2VwdG9yT3JkZXJUeXBlIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFR5cGU8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZXJjZXB0b3JzIFR5cGU8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFR5cGU8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZXJjZXB0b3JzIFR5cGU8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFR5cGUoTWV0aG9kVHlwZSBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlSW50ZXJjZXB0b3JzVHlwZShJbnRlcmNlcHRvcnNUeXBlIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgTWV0aG9kIFR5cGU8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW50ZXJjZXB0b3IgVHlwZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBNZXRob2QgVHlwZTwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbnRlcmNlcHRvciBUeXBlPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VOYW1lZE1ldGhvZFR5cGUoTmFtZWRNZXRob2RUeXBlIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VJbnRlcmNlcHRvclR5cGUoSW50ZXJjZXB0b3JUeXBlIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UXVlcnk8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBEcml2ZW4gQmVhbjwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RdWVyeTwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIERyaXZlbiBCZWFuPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VRdWVyeShRdWVyeSBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlTWVzc2FnZURyaXZlbkJlYW4oTWVzc2FnZURyaXZlbkJlYW4gb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhcmFtczwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlUXVlcnlNZXRob2QoUXVlcnlNZXRob2Qgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZU1ldGhvZFBhcmFtcyhNZXRob2RQYXJhbXMgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2UgVHlwZTwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGVybWlzc2lvbjwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2UgVHlwZTwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGVybWlzc2lvbjwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZU1ldGhvZFBlcm1pc3Npb24oTWV0aG9kUGVybWlzc2lvbiBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlbGF0aW9uc2hpcHM8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFR5cGU8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVsYXRpb25zaGlwczwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgVHlwZTwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVsYXRpb25zaGlwcyhSZWxhdGlvbnNoaXBzIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VNZXRob2RUeXBlKE1ldGhvZFR5cGUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZW1vdmUgTWV0aG9kIFR5cGU8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgTWV0aG9kIFR5cGU8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVtb3ZlIE1ldGhvZCBUeXBlPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIE1ldGhvZCBUeXBlPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VSZW1vdmVNZXRob2RUeXBlKFJlbW92ZU1ldGhvZFR5cGUgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZU5hbWVkTWV0aG9kVHlwZShOYW1lZE1ldGhvZFR5cGUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBJZGVudGl0eSBUeXBlPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlF1ZXJ5PC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IElkZW50aXR5IFR5cGU8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UXVlcnk8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5SWRlbnRpdHlUeXBlKFNlY3VyaXR5SWRlbnRpdHlUeXBlIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VRdWVyeShRdWVyeSBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlc3Npb24gQmVhbjwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5RdWVyeSBNZXRob2Q8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2Vzc2lvbiBCZWFuPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlF1ZXJ5IE1ldGhvZDwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlU2Vzc2lvbkJlYW4oU2Vzc2lvbkJlYW4gb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZVF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWxhdGlvbnNoaXAgUm9sZSBTb3VyY2UgVHlwZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlbGF0aW9uc2hpcCBSb2xlIFNvdXJjZSBUeXBlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUoUmVsYXRpb25zaGlwUm9sZVNvdXJjZVR5cGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlbGF0aW9uc2hpcHM8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZWxhdGlvbnNoaXBzPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUmVsYXRpb25zaGlwcyhSZWxhdGlvbnNoaXBzIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZW1vdmUgTWV0aG9kIFR5cGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZW1vdmUgTWV0aG9kIFR5cGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VSZW1vdmVNZXRob2RUeXBlKFJlbW92ZU1ldGhvZFR5cGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IElkZW50aXR5IFR5cGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBJZGVudGl0eSBUeXBlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU2VjdXJpdHlJZGVudGl0eVR5cGUoU2VjdXJpdHlJZGVudGl0eVR5cGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlc3Npb24gQmVhbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlc3Npb24gQmVhbjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVNlc3Npb25CZWFuKFNlc3Npb25CZWFuIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0ZWZ1bCBUaW1lb3V0IFR5cGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGF0ZWZ1bCBUaW1lb3V0IFR5cGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTdGF0ZWZ1bFRpbWVvdXRUeXBlKFN0YXRlZnVsVGltZW91dFR5cGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRpbWVyIFNjaGVkdWxlIFR5cGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UaW1lciBTY2hlZHVsZSBUeXBlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlVGltZXJTY2hlZHVsZVR5cGUoVGltZXJTY2hlZHVsZVR5cGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRpbWVyIFR5cGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UaW1lciBUeXBlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlVGltZXJUeXBlKFRpbWVyVHlwZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlhNTEhlbHBlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiWE1MSGVscGVySW1wbC5qYXZhCmluZGV4IGI3MjQ4MWMuLmExOWExMzEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiWE1MSGVscGVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiWE1MSGVscGVySW1wbC5qYXZhCkBAIC0xOSwxNiArMTksMTcgQEAKIAogCXB1YmxpYyBFamJYTUxIZWxwZXJJbXBsKFhNTFJlc291cmNlIHJlc291cmNlKSB7CiAJCXN1cGVyKHJlc291cmNlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCiAJfQogCiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRVUkkoU3RyaW5nIHByZWZpeCkgewotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscygiIikpCisJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAogCQkJcmV0dXJuIEVqYlBhY2thZ2UuZU5TX1VSSTsKIAkJZWxzZQogCQkJcmV0dXJuIHN1cGVyLmdldFVSSShwcmVmaXgpOwogCX0KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldFFOYW1lKEVQYWNrYWdlIGVQYWNrYWdlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBtdXN0SGF2ZVByZWZpeCkKIAkgIHsKIAkgICBTdHJpbmcgbnNQcmVmaXggPSBnZXRQcmVmaXgoZVBhY2thZ2UsIG11c3RIYXZlUHJlZml4KTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiWE1MUHJvY2Vzc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYlhNTFByb2Nlc3Nvci5qYXZhCmluZGV4IDI2YTRiOGUuLmU2Zjc5ZWYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiWE1MUHJvY2Vzc29yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJYTUxQcm9jZXNzb3IuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkudXRpbC5YTUxQcm9jZXNzb3I7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5tZXRhZGF0YS5FamJQYWNrYWdlOwpAQCAtNDIsNyArNDMsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgTWFwIGdldFJlZ2lzdHJhdGlvbnMoKSB7CisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFJlc291cmNlLkZhY3Rvcnk+IGdldFJlZ2lzdHJhdGlvbnMoKSB7CiAJCWlmIChyZWdpc3RyYXRpb25zID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFJlZ2lzdHJhdGlvbnMoKTsKIAkJCXJlZ2lzdHJhdGlvbnMucHV0KFhNTF9FWFRFTlNJT04sIG5ldyBFamJSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9pbnRlcm5hbC9hZGFwdGVyL0VqYkFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvaW50ZXJuYWwvYWRhcHRlci9FamJBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllYmMwYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvaW50ZXJuYWwvYWRhcHRlci9FamJBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmludGVybmFsLmFkYXB0ZXI7CisKK3B1YmxpYyBjbGFzcyBFamJBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSmF2YUVFQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSB7CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKE9iamVjdCBhZGFwdGFibGVPYmplY3QpIHsKKwkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuKSB7CisJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiBiZWFuID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuKSBhZGFwdGFibGVPYmplY3Q7CisJCQlyZXR1cm4gYmVhbi5nZXRFamJDbGFzcygpOworCQl9IGVsc2UgaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuKSB7CisJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiBiZWFuID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuKSBhZGFwdGFibGVPYmplY3Q7CisJCQlyZXR1cm4gYmVhbi5nZXRFamJDbGFzcygpOworCQl9IGVsc2UgaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4pIHsKKwkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4gYmVhbiA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuKSBhZGFwdGFibGVPYmplY3Q7CisJCQlyZXR1cm4gYmVhbi5nZXRFamJDbGFzcygpOworCQl9IGVsc2UgaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbikgeworCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuIGJlYW4gPSAob3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuKSBhZGFwdGFibGVPYmplY3Q7CisJCQlyZXR1cm4gYmVhbi5nZXRFamJDbGFzc05hbWUoKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvaW50ZXJuYWwvYWRhcHRlci9KYXZhRUVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2ludGVybmFsL2FkYXB0ZXIvSmF2YUVFQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YjVhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2ludGVybmFsL2FkYXB0ZXIvSmF2YUVFQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5pbnRlcm5hbC5hZGFwdGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luLkoyRUVDb3JlUGx1Z2luOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF2YUVFQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7CisKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKKwkJaWYgKGFkYXB0ZXJUeXBlID09IElKYXZhRWxlbWVudC5jbGFzcykgeworCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QoYWRhcHRhYmxlT2JqZWN0KTsKKwkJCVN0cmluZyBjbGFzc05hbWUgPSBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZShhZGFwdGFibGVPYmplY3QpOworCQkJcmV0dXJuIGdldEphdmFFbGVtZW50KGphdmFQcm9qZWN0LCBjbGFzc05hbWUpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgeworCQlyZXR1cm4gbmV3IENsYXNzW10geyBJSmF2YUVsZW1lbnQuY2xhc3MgfTsKKwl9CisKKwlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKE9iamVjdCBhZGFwdGFibGVPYmplY3QpOworCQorCXByaXZhdGUgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KE9iamVjdCBhZGFwdGFibGVPYmplY3QpIHsKKwkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoYWRhcHRhYmxlT2JqZWN0KTsKKwkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKKwkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7CisJCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3QgYWRhcHRhYmxlT2JqZWN0KSB7CisJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7CisJCQlyZXR1cm4gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBhZGFwdGFibGVPYmplY3QpLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKKwkJfSAKKwkJcmV0dXJuIChJUmVzb3VyY2UpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihhZGFwdGFibGVPYmplY3QsIElSZXNvdXJjZS5jbGFzcyk7CisJfQorCQorCXByaXZhdGUgSUphdmFFbGVtZW50IGdldEphdmFFbGVtZW50KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGNsYXNzTmFtZSkgeworCQlpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgamF2YVByb2plY3QgIT0gbnVsbCAmJiBqYXZhUHJvamVjdC5leGlzdHMoKSkgeworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUoY2xhc3NOYW1lKTsKKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJSjJFRUNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2ludGVybmFsL2FkYXB0ZXIvV2ViQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9pbnRlcm5hbC9hZGFwdGVyL1dlYkFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzdmOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9pbnRlcm5hbC9hZGFwdGVyL1dlYkFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuaW50ZXJuYWwuYWRhcHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlOworCitwdWJsaWMgY2xhc3MgV2ViQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEphdmFFRUFydGlmYWN0QWRhcHRlckZhY3RvcnkgeworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZShPYmplY3QgYWRhcHRhYmxlT2JqZWN0KSB7CisJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0KSB7CisJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0IHNlcnZsZXQgPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCkgYWRhcHRhYmxlT2JqZWN0OworCQkJcmV0dXJuIHNlcnZsZXQuZ2V0U2VydmxldENsYXNzKCk7CisJCX0gZWxzZSBpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyKSB7CisJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIgZmlsdGVyID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlcikgYWRhcHRhYmxlT2JqZWN0OworCQkJcmV0dXJuIGZpbHRlci5nZXRGaWx0ZXJDbGFzcygpOworCQl9IGVsc2UgaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lcikgeworCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyIGxpc3RlbmVyID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lcikgYWRhcHRhYmxlT2JqZWN0OworCQkJcmV0dXJuIGxpc3RlbmVyLmdldExpc3RlbmVyQ2xhc3MoKTsKKwkJfSBlbHNlIGlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0KSB7CisJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0IHNlcnZsZXQgPSAob3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldCkgYWRhcHRhYmxlT2JqZWN0OworCQkJV2ViVHlwZSB3ZWJUeXBlID0gc2VydmxldC5nZXRXZWJUeXBlKCk7CisJCQlpZiAod2ViVHlwZSAhPSBudWxsICYmIHNlcnZsZXQuZ2V0V2ViVHlwZSgpLmlzU2VydmxldFR5cGUoKSkgeworCQkJCXJldHVybiBnZXRRdWFsaWZpZWROYW1lKHNlcnZsZXQuZ2V0U2VydmxldENsYXNzKCkpOworCQkJfQorCQl9IGVsc2UgaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcikgeworCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyIGZpbHRlciA9IChvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXIpIGFkYXB0YWJsZU9iamVjdDsKKwkJCXJldHVybiBnZXRRdWFsaWZpZWROYW1lKGZpbHRlci5nZXRGaWx0ZXJDbGFzcygpKTsKKwkJfSBlbHNlIGlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXIpIHsKKwkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lciBsaXN0ZW5lciA9IChvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXIpIGFkYXB0YWJsZU9iamVjdDsKKwkJCXJldHVybiBnZXRRdWFsaWZpZWROYW1lKGxpc3RlbmVyLmdldExpc3RlbmVyQ2xhc3MoKSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByaXZhdGUgU3RyaW5nIGdldFF1YWxpZmllZE5hbWUoSmF2YUNsYXNzIGphdmFDbGFzcykgeworCQlyZXR1cm4gKGphdmFDbGFzcyA9PSBudWxsKSA/IG51bGwgOiBqYXZhQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0FjdGl2YXRpb25TcGVjLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9BY3RpdmF0aW9uU3BlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OGZjZWQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9BY3RpdmF0aW9uU3BlYy5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZhdGlvbiBTcGVjPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgVGhlIGFjdGl2YXRpb25zcGVjVHlwZSBzcGVjaWZpZXMgYW4gYWN0aXZhdGlvbgorICogICAgICAgICBzcGVjaWZpY2F0aW9uLiAgVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5IHF1YWxpZmllZAorICogICAgICAgICBKYXZhIGNsYXNzIG5hbWUgb2YgYW4gYWN0aXZhdGlvbiBzcGVjaWZpY2F0aW9uIGFuZCBhIHNldCBvZgorICogICAgICAgICByZXF1aXJlZCBjb25maWd1cmF0aW9uIHByb3BlcnR5IG5hbWVzLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWN0aXZhdGlvblNwZWMjZ2V0QWN0aXZhdGlvbnNwZWNDbGFzcyA8ZW0+QWN0aXZhdGlvbnNwZWMgQ2xhc3M8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFjdGl2YXRpb25TcGVjI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydHkgPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWN0aXZhdGlvblNwZWMjZ2V0Q29uZmlnUHJvcGVydHkgPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWN0aXZhdGlvblNwZWMjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldEFjdGl2YXRpb25TcGVjKCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEFjdGl2YXRpb25TcGVjIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uc3BlYyBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogPCFbQ0RBVEFbWworCSAqICAgICAgICAgICAgIFRoZSBlbGVtZW50IGFjdGl2YXRpb25zcGVjLWNsYXNzIHNwZWNpZmllcyB0aGUgZnVsbHkKKwkgKiAgICAgICAgICAgICBxdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIG9mIHRoZSBhY3RpdmF0aW9uCisJICogICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBjbGFzcy4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudCB0aGUKKwkgKiAgICAgICAgICAgICBqYXZheC5yZXNvdXJjZS5zcGkuQWN0aXZhdGlvblNwZWMgaW50ZXJmYWNlLiBUaGUKKwkgKiAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIHJlcXVpcmVkIHRvIGJlIGEKKwkgKiAgICAgICAgICAgICBKYXZhQmVhbi4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBFeGFtcGxlOgorCSAqICAgICAgICAgICAgIAkgIDxhY3RpdmF0aW9uc3BlYy1jbGFzcz5jb20ud29tYmF0LkFjdGl2YXRpb25TcGVjSW1wbAorCSAqICAgICAgICAgICAgIAkgIDwvYWN0aXZhdGlvbnNwZWMtY2xhc3M+CisJICogICAgICAgICAgICAgCisJICogXV0+CisJICogCQkJQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbnNwZWMgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEFjdGl2YXRpb25zcGVjQ2xhc3MoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRBY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uc3BlY0NsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldEFjdGl2YXRpb25zcGVjQ2xhc3MoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFjdGl2YXRpb25TcGVjI2dldEFjdGl2YXRpb25zcGVjQ2xhc3MgPGVtPkFjdGl2YXRpb25zcGVjIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3RpdmF0aW9uc3BlYyBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0QWN0aXZhdGlvbnNwZWNDbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QWN0aXZhdGlvbnNwZWNDbGFzcyhTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5IGVsZW1lbnQgaXMgZGVwcmVjYXRlZCBzaW5jZQorCSAqICAgICAgICAgICAgIENvbm5lY3RvcnMgMS42IHNwZWNpZmljYXRpb24uIFRoZSByZXNvdXJjZSBhZGFwdGVyIAorCSAqICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgQE5vdE51bGwKKwkgKiAgICAgICAgICAgICBCZWFuIFZhbGlkYXRpb24gYW5ub3RhdGlvbiBvciBpdHMgWE1MIHZhbGlkYXRpb24KKwkgKiAgICAgICAgICAgICBkZXNjcmlwdG9yIGVxdWl2YWxlbnQgdG8gaW5kaWNhdGUgdGhhdCBhIGNvbmZpZ3VyYXRpb24KKwkgKiAgICAgICAgICAgICBwcm9wZXJ0eSBpcyByZXF1aXJlZCB0byBiZSBzcGVjaWZpZWQgYnkgdGhlIGRlcGxveWVyLgorCSAqICAgICAgICAgICAgIFNlZSB0aGUgQ29ubmVjdG9ycyBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLiAKKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldEFjdGl2YXRpb25TcGVjX1JlcXVpcmVkQ29uZmlnUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PFJlcXVpcmVkQ29uZmlnUHJvcGVydHk+IGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0QWN0aXZhdGlvblNwZWNfQ29uZmlnUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PENvbmZpZ1Byb3BlcnR5PiBnZXRDb25maWdQcm9wZXJ0eSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJZChTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldEFjdGl2YXRpb25TcGVjX0lkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BY3RpdmF0aW9uU3BlYyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBBY3RpdmF0aW9uU3BlYwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvQWRtaW5PYmplY3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0FkbWluT2JqZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0YzhmYQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0FkbWluT2JqZWN0LmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZG1pbiBPYmplY3Q8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgYWRtaW5vYmplY3RUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCBhbgorICogICAgICAgICBhZG1pbmlzdGVyZWQgb2JqZWN0LiAgQWRtaW5pc3RlcmVkIG9iamVjdHMgYXJlIHNwZWNpZmljIHRvIGEKKyAqICAgICAgICAgbWVzc2FnaW5nIHN0eWxlIG9yIG1lc3NhZ2UgcHJvdmlkZXIuICBUaGlzIGNvbnRhaW5zCisgKiAgICAgICAgIGluZm9ybWF0aW9uIG9uIHRoZSBKYXZhIHR5cGUgb2YgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieQorICogICAgICAgICBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LCBpdHMgSmF2YSBjbGFzcyBuYW1lIGFuZCBpdHMKKyAqICAgICAgICAgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWRtaW5PYmplY3QjZ2V0QWRtaW5vYmplY3RJbnRlcmZhY2UgPGVtPkFkbWlub2JqZWN0IEludGVyZmFjZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWRtaW5PYmplY3QjZ2V0QWRtaW5vYmplY3RDbGFzcyA8ZW0+QWRtaW5vYmplY3QgQ2xhc3M8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFkbWluT2JqZWN0I2dldENvbmZpZ1Byb3BlcnR5IDxlbT5Db25maWcgUHJvcGVydHk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFkbWluT2JqZWN0I2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRBZG1pbk9iamVjdCgpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBBZG1pbk9iamVjdCBleHRlbmRzIEphdmFFRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRtaW5vYmplY3QgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiA8IVtDREFUQVtbCisJICogICAgICAgICAgICAgVGhlIGVsZW1lbnQgYWRtaW5vYmplY3QtaW50ZXJmYWNlIHNwZWNpZmllcyB0aGUKKwkgKiAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlIG9mIHRoZQorCSAqICAgICAgICAgICAgIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbiBhZG1pbmlzdGVyZWQgb2JqZWN0LgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEV4YW1wbGU6CisJICogICAgICAgICAgICAgCTxhZG1pbm9iamVjdC1pbnRlcmZhY2U+amF2YXguam1zLkRlc3RpbmF0aW9uCisJICogICAgICAgICAgICAgCTwvYWRtaW5vYmplY3QtaW50ZXJmYWNlPgorCSAqICAgICAgICAgICAgIAorCSAqIF1dPgorCSAqIAkJCUBzaW5jZSBKYXZhIEVFIDYsIENvbm5lY3RvciAxLjYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkbWlub2JqZWN0IEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0QWRtaW5vYmplY3RJbnRlcmZhY2UoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRBZG1pbk9iamVjdF9BZG1pbm9iamVjdEludGVyZmFjZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRBZG1pbm9iamVjdEludGVyZmFjZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWRtaW5PYmplY3QjZ2V0QWRtaW5vYmplY3RJbnRlcmZhY2UgPGVtPkFkbWlub2JqZWN0IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWRtaW5vYmplY3QgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRBZG1pbm9iamVjdEludGVyZmFjZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QWRtaW5vYmplY3RJbnRlcmZhY2UoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkbWlub2JqZWN0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiA8IVtDREFUQVtbCisJICogICAgICAgICAgICAgVGhlIGVsZW1lbnQgYWRtaW5vYmplY3QtY2xhc3Mgc3BlY2lmaWVzIHRoZSBmdWxseQorCSAqICAgICAgICAgICAgIHF1YWxpZmllZCBKYXZhIGNsYXNzIG5hbWUgb2YgYW4gYWRtaW5pc3RlcmVkIG9iamVjdC4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBFeGFtcGxlOgorCSAqICAgICAgICAgICAgIAkgIDxhZG1pbm9iamVjdC1jbGFzcz5jb20ud29tYmF0LkRlc3RpbmF0aW9uSW1wbAorCSAqICAgICAgICAgICAgIAkgIDwvYWRtaW5vYmplY3QtY2xhc3M+CisJICogICAgICAgICAgICAgCisJICogXV0+CisJICogCQkJQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRtaW5vYmplY3QgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEFkbWlub2JqZWN0Q2xhc3MoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRBZG1pbk9iamVjdF9BZG1pbm9iamVjdENsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldEFkbWlub2JqZWN0Q2xhc3MoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFkbWluT2JqZWN0I2dldEFkbWlub2JqZWN0Q2xhc3MgPGVtPkFkbWlub2JqZWN0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbm9iamVjdCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0QWRtaW5vYmplY3RDbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QWRtaW5vYmplY3RDbGFzcyhTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRBZG1pbk9iamVjdF9Db25maWdQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8Q29uZmlnUHJvcGVydHk+IGdldENvbmZpZ1Byb3BlcnR5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElkKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0QWRtaW5PYmplY3RfSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0SWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFkbWluT2JqZWN0I2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOworCit9IC8vIEFkbWluT2JqZWN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvQXV0aGVudGljYXRpb25NZWNoYW5pc20uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGEyZDlmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvQXV0aGVudGljYXRpb25NZWNoYW5pc20uamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2E7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtVHlwZSBzcGVjaWZpZXMgYW4gYXV0aGVudGljYXRpb24KKyAqICAgICAgICAgbWVjaGFuaXNtIHN1cHBvcnRlZCBieSB0aGUgcmVzb3VyY2UgYWRhcHRlci4gTm90ZSB0aGF0IHRoaXMKKyAqICAgICAgICAgc3VwcG9ydCBpcyBmb3IgdGhlIHJlc291cmNlIGFkYXB0ZXIgYW5kIG5vdCBmb3IgdGhlCisgKiAgICAgICAgIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gc3BlY2lmaWVzCisgKiAgICAgICAgIGFueSByZXNvdXJjZSBhZGFwdGVyIHNwZWNpZmljIHJlcXVpcmVtZW50IGZvciB0aGUgc3VwcG9ydCBvZgorICogICAgICAgICBzZWN1cml0eSBjb250cmFjdCBhbmQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtLgorICogICAgICAgICAKKyAqICAgICAgICAgTm90ZSB0aGF0IEJhc2ljUGFzc3dvcmQgbWVjaGFuaXNtIHR5cGUgc2hvdWxkIHN1cHBvcnQgdGhlCisgKiAgICAgICAgIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwgaW50ZXJmYWNlLgorICogICAgICAgICBUaGUgS2VyYnY1IG1lY2hhbmlzbSB0eXBlIHNob3VsZCBzdXBwb3J0IHRoZQorICogICAgICAgICBvcmcuaWV0Zi5qZ3NzLkdTU0NyZWRlbnRpYWwgaW50ZXJmYWNlIG9yIHRoZSBkZXByZWNhdGVkCisgKiAgICAgICAgIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCBpbnRlcmZhY2UuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtI2dldENyZWRlbnRpYWxJbnRlcmZhY2UgPGVtPkNyZWRlbnRpYWwgSW50ZXJmYWNlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKQorICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXV0aGVudGljYXRpb25NZWNoYW5pc20gZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiA8IVtDREFUQVtbCisJICogICAgICAgICAgICAgVGhlIGVsZW1lbnQgYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUgc3BlY2lmaWVzCisJICogICAgICAgICAgICAgdHlwZSBvZiBhbiBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20uCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgVGhlIGV4YW1wbGUgdmFsdWVzIGFyZToKKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZAorCSAqICAgICAgICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+CisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPktlcmJ2NQorCSAqICAgICAgICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+CisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQW55IGFkZGl0aW9uYWwgc2VjdXJpdHkgbWVjaGFuaXNtcyBhcmUgb3V0c2lkZSB0aGUKKwkgKiAgICAgICAgICAgICBzY29wZSBvZiB0aGUgQ29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLgorCSAqICAgICAgICAgICAgIAorCSAqIF1dPgorCSAqIAkJCUBzaW5jZSBKYXZhIEVFIDYsIENvbm5lY3RvciAxLjYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWRlbnRpYWwgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ3JlZGVudGlhbEludGVyZmFjZVR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3JlZGVudGlhbCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlZGVudGlhbCBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ3JlZGVudGlhbEludGVyZmFjZVR5cGUKKwkgKiBAc2VlICNpc1NldENyZWRlbnRpYWxJbnRlcmZhY2UoKQorCSAqIEBzZWUgI3Vuc2V0Q3JlZGVudGlhbEludGVyZmFjZSgpCisJICogQHNlZSAjc2V0Q3JlZGVudGlhbEludGVyZmFjZShDcmVkZW50aWFsSW50ZXJmYWNlVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQ3JlZGVudGlhbEludGVyZmFjZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlIGdldENyZWRlbnRpYWxJbnRlcmZhY2UoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtI2dldENyZWRlbnRpYWxJbnRlcmZhY2UgPGVtPkNyZWRlbnRpYWwgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVkZW50aWFsIEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5DcmVkZW50aWFsSW50ZXJmYWNlVHlwZQorCSAqIEBzZWUgI2lzU2V0Q3JlZGVudGlhbEludGVyZmFjZSgpCisJICogQHNlZSAjdW5zZXRDcmVkZW50aWFsSW50ZXJmYWNlKCkKKwkgKiBAc2VlICNnZXRDcmVkZW50aWFsSW50ZXJmYWNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDcmVkZW50aWFsSW50ZXJmYWNlKENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlIHZhbHVlKTsKKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20jZ2V0Q3JlZGVudGlhbEludGVyZmFjZSA8ZW0+Q3JlZGVudGlhbCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0Q3JlZGVudGlhbEludGVyZmFjZSgpCisJICogQHNlZSAjZ2V0Q3JlZGVudGlhbEludGVyZmFjZSgpCisJICogQHNlZSAjc2V0Q3JlZGVudGlhbEludGVyZmFjZShDcmVkZW50aWFsSW50ZXJmYWNlVHlwZSkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCB1bnNldENyZWRlbnRpYWxJbnRlcmZhY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20jZ2V0Q3JlZGVudGlhbEludGVyZmFjZSA8ZW0+Q3JlZGVudGlhbCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWRlbnRpYWwgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogQHNlZSAjdW5zZXRDcmVkZW50aWFsSW50ZXJmYWNlKCkKKwkgKiBAc2VlICNnZXRDcmVkZW50aWFsSW50ZXJmYWNlKCkKKwkgKiBAc2VlICNzZXRDcmVkZW50aWFsSW50ZXJmYWNlKENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0Q3JlZGVudGlhbEludGVyZmFjZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJZChTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0lkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvQ29uZmlnUHJvcGVydHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0NvbmZpZ1Byb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFhNjcxZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0NvbmZpZ1Byb3BlcnR5LmphdmEKQEAgLTAsMCArMSw0MDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgVGhlIGNvbmZpZy1wcm9wZXJ0eVR5cGUgY29udGFpbnMgYSBkZWNsYXJhdGlvbiBvZiBhIHNpbmdsZQorICogICAgICAgICBjb25maWd1cmF0aW9uIHByb3BlcnR5IHRoYXQgbWF5IGJlIHVzZWQgZm9yIHByb3ZpZGluZworICogICAgICAgICBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uLCBuYW1lLAorICogICAgICAgICB0eXBlIGFuZCBhbiBvcHRpb25hbCB2YWx1ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gSWYKKyAqICAgICAgICAgdGhlIHJlc291cmNlIGFkYXB0ZXIgcHJvdmlkZXIgZG9lcyBub3Qgc3BlY2lmeSBhIHZhbHVlIHRoYW4KKyAqICAgICAgICAgdGhlIGRlcGxveWVyIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSB2YWxpZCB2YWx1ZSBmb3IKKyAqICAgICAgICAgYSBjb25maWd1cmF0aW9uIHByb3BlcnR5LgorICogICAgICAgICAKKyAqICAgICAgICAgQW55IGJvdW5kcyBvciB3ZWxsLWRlZmluZWQgdmFsdWVzIG9mIHByb3BlcnRpZXMgc2hvdWxkIGJlCisgKiAgICAgICAgIGRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24gZWxlbWVudC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIENvbm5lY3RvciAxLjYKKyAqICAgICAgIAorICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjZ2V0Q29uZmlnUHJvcGVydHlOYW1lIDxlbT5Db25maWcgUHJvcGVydHkgTmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjZ2V0Q29uZmlnUHJvcGVydHlUeXBlIDxlbT5Db25maWcgUHJvcGVydHkgVHlwZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjZ2V0Q29uZmlnUHJvcGVydHlWYWx1ZSA8ZW0+Q29uZmlnIFByb3BlcnR5IFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eSNpc0NvbmZpZ1Byb3BlcnR5SWdub3JlIDxlbT5Db25maWcgUHJvcGVydHkgSWdub3JlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eSNpc0NvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcyA8ZW0+Q29uZmlnIFByb3BlcnR5IFN1cHBvcnRzIER5bmFtaWMgVXBkYXRlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjaXNDb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbCA8ZW0+Q29uZmlnIFByb3BlcnR5IENvbmZpZGVudGlhbDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbmZpZ1Byb3BlcnR5KCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbmZpZ1Byb3BlcnR5IGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydHkgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5IE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5IE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENvbmZpZ1Byb3BlcnR5TmFtZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRDb25maWdQcm9wZXJ0eU5hbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2dldENvbmZpZ1Byb3BlcnR5TmFtZSA8ZW0+Q29uZmlnIFByb3BlcnR5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDb25maWdQcm9wZXJ0eU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldENvbmZpZ1Byb3BlcnR5TmFtZShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eVR5cGVUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5VHlwZVR5cGUKKwkgKiBAc2VlICNpc1NldENvbmZpZ1Byb3BlcnR5VHlwZSgpCisJICogQHNlZSAjdW5zZXRDb25maWdQcm9wZXJ0eVR5cGUoKQorCSAqIEBzZWUgI3NldENvbmZpZ1Byb3BlcnR5VHlwZShDb25maWdQcm9wZXJ0eVR5cGVUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25maWdQcm9wZXJ0eV9Db25maWdQcm9wZXJ0eVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDb25maWdQcm9wZXJ0eVR5cGVUeXBlIGdldENvbmZpZ1Byb3BlcnR5VHlwZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjZ2V0Q29uZmlnUHJvcGVydHlUeXBlIDxlbT5Db25maWcgUHJvcGVydHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHlUeXBlVHlwZQorCSAqIEBzZWUgI2lzU2V0Q29uZmlnUHJvcGVydHlUeXBlKCkKKwkgKiBAc2VlICN1bnNldENvbmZpZ1Byb3BlcnR5VHlwZSgpCisJICogQHNlZSAjZ2V0Q29uZmlnUHJvcGVydHlUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb25maWdQcm9wZXJ0eVR5cGUoQ29uZmlnUHJvcGVydHlUeXBlVHlwZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2dldENvbmZpZ1Byb3BlcnR5VHlwZSA8ZW0+Q29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0Q29uZmlnUHJvcGVydHlUeXBlKCkKKwkgKiBAc2VlICNnZXRDb25maWdQcm9wZXJ0eVR5cGUoKQorCSAqIEBzZWUgI3NldENvbmZpZ1Byb3BlcnR5VHlwZShDb25maWdQcm9wZXJ0eVR5cGVUeXBlKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHVuc2V0Q29uZmlnUHJvcGVydHlUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2dldENvbmZpZ1Byb3BlcnR5VHlwZSA8ZW0+Q29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogQHNlZSAjdW5zZXRDb25maWdQcm9wZXJ0eVR5cGUoKQorCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5VHlwZSgpCisJICogQHNlZSAjc2V0Q29uZmlnUHJvcGVydHlUeXBlKENvbmZpZ1Byb3BlcnR5VHlwZVR5cGUpCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNTZXRDb25maWdQcm9wZXJ0eVR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogPCFbQ0RBVEFbWworCSAqICAgICAgICAgICAgIFRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eS12YWx1ZSBjb250YWlucyB0aGUgdmFsdWUKKwkgKiAgICAgICAgICAgICBvZiBhIGNvbmZpZ3VyYXRpb24gZW50cnkuIE5vdGUsIGl0IGlzIHBvc3NpYmxlIGZvciBhCisJICogICAgICAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBkZXBsb3llciB0byBvdmVycmlkZSB0aGlzCisJICogICAgICAgICAgICAgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBkdXJpbmcgZGVwbG95bWVudC4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBFeGFtcGxlOgorCSAqICAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+V29tYmF0U2VydmVyPC9jb25maWctcHJvcGVydHktdmFsdWU+CisJICogICAgICAgICAgICAgCisJICogXV0+CisJICogCQkJQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRDb25maWdQcm9wZXJ0eVZhbHVlKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0Q29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRDb25maWdQcm9wZXJ0eVZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eSNnZXRDb25maWdQcm9wZXJ0eVZhbHVlIDxlbT5Db25maWcgUHJvcGVydHkgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0Q29uZmlnUHJvcGVydHlWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q29uZmlnUHJvcGVydHlWYWx1ZShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5IElnbm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIGVsZW1lbnQgY29uZmlnLXByb3BlcnR5LWlnbm9yZSBpcyB1c2VkIHRvIHNwZWNpZnkgCisJICogICAgICAgICAgICAgd2hldGhlciB0aGUgY29uZmlndXJhdGlvbiB0b29scyBtdXN0IGlnbm9yZSBjb25zaWRlcmluZyB0aGUgCisJICogICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBkdXJpbmcgYXV0by1kaXNjb3Zlcnkgb2YKKwkgKiAgICAgICAgICAgICBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMuIFNlZSB0aGUgQ29ubmVjdG9yIHNwZWNpZmljYXRpb24gZm9yCisJICogICAgICAgICAgICAgbW9yZSBkZXRhaWxzLiBJZiB1bnNwZWNpZmllZCwgdGhlIGNvbnRhaW5lciBtdXN0IG5vdCBpZ25vcmUKKwkgKiAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBkdXJpbmcgYXV0by1kaXNjb3ZlcnkuCisJICogICAgICAgICAgICAgVGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcsICJ0cnVlIiBvciAiZmFsc2UiLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIENvbm5lY3RvciAxLjYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBJZ25vcmU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0Q29uZmlnUHJvcGVydHlJZ25vcmUoKQorCSAqIEBzZWUgI3Vuc2V0Q29uZmlnUHJvcGVydHlJZ25vcmUoKQorCSAqIEBzZWUgI3NldENvbmZpZ1Byb3BlcnR5SWdub3JlKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5SWdub3JlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0NvbmZpZ1Byb3BlcnR5SWdub3JlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eSNpc0NvbmZpZ1Byb3BlcnR5SWdub3JlIDxlbT5Db25maWcgUHJvcGVydHkgSWdub3JlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25maWcgUHJvcGVydHkgSWdub3JlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldENvbmZpZ1Byb3BlcnR5SWdub3JlKCkKKwkgKiBAc2VlICN1bnNldENvbmZpZ1Byb3BlcnR5SWdub3JlKCkKKwkgKiBAc2VlICNpc0NvbmZpZ1Byb3BlcnR5SWdub3JlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb25maWdQcm9wZXJ0eUlnbm9yZShib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjaXNDb25maWdQcm9wZXJ0eUlnbm9yZSA8ZW0+Q29uZmlnIFByb3BlcnR5IElnbm9yZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTZXRDb25maWdQcm9wZXJ0eUlnbm9yZSgpCisJICogQHNlZSAjaXNDb25maWdQcm9wZXJ0eUlnbm9yZSgpCisJICogQHNlZSAjc2V0Q29uZmlnUHJvcGVydHlJZ25vcmUoYm9vbGVhbikKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCB1bnNldENvbmZpZ1Byb3BlcnR5SWdub3JlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2lzQ29uZmlnUHJvcGVydHlJZ25vcmUgPGVtPkNvbmZpZyBQcm9wZXJ0eSBJZ25vcmU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBJZ25vcmU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldENvbmZpZ1Byb3BlcnR5SWdub3JlKCkKKwkgKiBAc2VlICNpc0NvbmZpZ1Byb3BlcnR5SWdub3JlKCkKKwkgKiBAc2VlICNzZXRDb25maWdQcm9wZXJ0eUlnbm9yZShib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0Q29uZmlnUHJvcGVydHlJZ25vcmUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eSBTdXBwb3J0cyBEeW5hbWljIFVwZGF0ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoZSBlbGVtZW50IGNvbmZpZy1wcm9wZXJ0eS1zdXBwb3J0cy1keW5hbWljLXVwZGF0ZXMgaXMgdXNlZCB0byBzcGVjaWZ5IAorCSAqICAgICAgICAgICAgIHdoZXRoZXIgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgYWxsb3dzIGl0cyB2YWx1ZSB0byBiZSB1cGRhdGVkLCBieQorCSAqICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNlcnZlcidzIGNvbmZpZ3VyYXRpb24gdG9vbHMsIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YKKwkgKiAgICAgICAgICAgICB0aGUgSmF2YUJlYW4gaW5zdGFuY2UuIFNlZSB0aGUgQ29ubmVjdG9yIHNwZWNpZmljYXRpb24gZm9yCisJICogICAgICAgICAgICAgbW9yZSBkZXRhaWxzLiBJZiB1bnNwZWNpZmllZCwgdGhlIGNvbnRhaW5lciBtdXN0IG5vdCBkeW5hbWljYWxseQorCSAqICAgICAgICAgICAgIHJlY29uZmlndXJlIHRoZSBwcm9wZXJ0eS4KKwkgKiAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZywgInRydWUiIG9yICJmYWxzZSIuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5IFN1cHBvcnRzIER5bmFtaWMgVXBkYXRlczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRDb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXMoKQorCSAqIEBzZWUgI3Vuc2V0Q29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzKCkKKwkgKiBAc2VlICNzZXRDb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXMoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0Q29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0NvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjaXNDb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXMgPGVtPkNvbmZpZyBQcm9wZXJ0eSBTdXBwb3J0cyBEeW5hbWljIFVwZGF0ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBTdXBwb3J0cyBEeW5hbWljIFVwZGF0ZXM8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0Q29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzKCkKKwkgKiBAc2VlICN1bnNldENvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcygpCisJICogQHNlZSAjaXNDb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldENvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcyhib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjaXNDb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXMgPGVtPkNvbmZpZyBQcm9wZXJ0eSBTdXBwb3J0cyBEeW5hbWljIFVwZGF0ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0Q29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzKCkKKwkgKiBAc2VlICNpc0NvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcygpCisJICogQHNlZSAjc2V0Q29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzKGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRDb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjaXNDb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXMgPGVtPkNvbmZpZyBQcm9wZXJ0eSBTdXBwb3J0cyBEeW5hbWljIFVwZGF0ZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBTdXBwb3J0cyBEeW5hbWljIFVwZGF0ZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldENvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcygpCisJICogQHNlZSAjaXNDb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXMoKQorCSAqIEBzZWUgI3NldENvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcyhib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0Q29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydHkgQ29uZmlkZW50aWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgZWxlbWVudCBjb25maWctcHJvcGVydHktY29uZmlkZW50aWFsIGlzIHVzZWQgdG8gc3BlY2lmeSAKKwkgKiAgICAgICAgICAgICB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIGNvbmZpZGVudGlhbCBhbmQKKwkgKiAgICAgICAgICAgICByZWNvbW1lbmRzIGFwcGxpY2F0aW9uIHNlcnZlcidzIGNvbmZpZ3VyYXRpb24gdG9vbHMgdG8gdXNlIHNwZWNpYWwgCisJICogICAgICAgICAgICAgdmlzdWFsIGFpZHMgZm9yIGVkaXRpbmcgdGhlbS4gU2VlIHRoZSBDb25uZWN0b3Igc3BlY2lmaWNhdGlvbiBmb3IKKwkgKiAgICAgICAgICAgICBtb3JlIGRldGFpbHMuIElmIHVuc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyIG11c3Qgbm90IHRyZWF0IHRoZQorCSAqICAgICAgICAgICAgIHByb3BlcnR5IGFzIGNvbmZpZGVudGlhbC4KKwkgKiAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZywgInRydWUiIG9yICJmYWxzZSIuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5IENvbmZpZGVudGlhbDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRDb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbCgpCisJICogQHNlZSAjdW5zZXRDb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbCgpCisJICogQHNlZSAjc2V0Q29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0Q29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzQ29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2lzQ29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwgPGVtPkNvbmZpZyBQcm9wZXJ0eSBDb25maWRlbnRpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBDb25maWRlbnRpYWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0Q29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwoKQorCSAqIEBzZWUgI3Vuc2V0Q29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwoKQorCSAqIEBzZWUgI2lzQ29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldENvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eSNpc0NvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsIDxlbT5Db25maWcgUHJvcGVydHkgQ29uZmlkZW50aWFsPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1NldENvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKCkKKwkgKiBAc2VlICNpc0NvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKCkKKwkgKiBAc2VlICNzZXRDb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbChib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHVuc2V0Q29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjaXNDb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbCA8ZW0+Q29uZmlnIFByb3BlcnR5IENvbmZpZGVudGlhbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5IENvbmZpZGVudGlhbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIEBzZWUgI3Vuc2V0Q29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwoKQorCSAqIEBzZWUgI2lzQ29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwoKQorCSAqIEBzZWUgI3NldENvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNTZXRDb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJZChTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbmZpZ1Byb3BlcnR5X0lkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBDb25maWdQcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvQ29uZmlnUHJvcGVydHlUeXBlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvQ29uZmlnUHJvcGVydHlUeXBlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Nzg2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9Db25maWdQcm9wZXJ0eVR5cGVUeXBlLmphdmEKQEAgLTAsMCArMSw0MTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5IFR5cGUgVHlwZTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIDwhW0NEQVRBW1sKKyAqICAgICAgICAgVGhlIGNvbmZpZy1wcm9wZXJ0eS10eXBlVHlwZSBjb250YWlucyB0aGUgZnVsbHkKKyAqICAgICAgICAgcXVhbGlmaWVkIEphdmEgdHlwZSBvZiBhIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkuCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbGVnYWwgdmFsdWVzOgorICogICAgICAgICBqYXZhLmxhbmcuQm9vbGVhbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkludGVnZXIsCisgKiAgICAgICAgIGphdmEubGFuZy5Eb3VibGUsIGphdmEubGFuZy5CeXRlLCBqYXZhLmxhbmcuU2hvcnQsCisgKiAgICAgICAgIGphdmEubGFuZy5Mb25nLCBqYXZhLmxhbmcuRmxvYXQsIGphdmEubGFuZy5DaGFyYWN0ZXIKKyAqICAgICAgICAgCisgKiAgICAgICAgIFVzZWQgaW46IGNvbmZpZy1wcm9wZXJ0eQorICogICAgICAgICAKKyAqICAgICAgICAgRXhhbXBsZToKKyAqICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgorICogICAgICAgICAKKyAqIF1dPgorICogCQlAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25maWdQcm9wZXJ0eVR5cGVUeXBlKCkKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gQ29uZmlnUHJvcGVydHlUeXBlVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBCb29sZWFuPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0pBVkFfTEFOR19CT09MRUFOX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJSkFWQV9MQU5HX0JPT0xFQU4oMCwgImphdmFMYW5nQm9vbGVhbiIsICJqYXZhLmxhbmcuQm9vbGVhbiIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBTdHJpbmc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSkFWQV9MQU5HX1NUUklOR19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUpBVkFfTEFOR19TVFJJTkcoMSwgImphdmFMYW5nU3RyaW5nIiwgImphdmEubGFuZy5TdHJpbmciKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgSW50ZWdlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNKQVZBX0xBTkdfSU5URUdFUl9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUpBVkFfTEFOR19JTlRFR0VSKDIsICJqYXZhTGFuZ0ludGVnZXIiLCAiamF2YS5sYW5nLkludGVnZXIiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgRG91YmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0pBVkFfTEFOR19ET1VCTEVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlKQVZBX0xBTkdfRE9VQkxFKDMsICJqYXZhTGFuZ0RvdWJsZSIsICJqYXZhLmxhbmcuRG91YmxlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIEJ5dGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSkFWQV9MQU5HX0JZVEVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlKQVZBX0xBTkdfQllURSg0LCAiamF2YUxhbmdCeXRlIiwgImphdmEubGFuZy5CeXRlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIFNob3J0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0pBVkFfTEFOR19TSE9SVF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUpBVkFfTEFOR19TSE9SVCg1LCAiamF2YUxhbmdTaG9ydCIsICJqYXZhLmxhbmcuU2hvcnQiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgTG9uZzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNKQVZBX0xBTkdfTE9OR19WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUpBVkFfTEFOR19MT05HKDYsICJqYXZhTGFuZ0xvbmciLCAiamF2YS5sYW5nLkxvbmciKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgRmxvYXQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSkFWQV9MQU5HX0ZMT0FUX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJSkFWQV9MQU5HX0ZMT0FUKDcsICJqYXZhTGFuZ0Zsb2F0IiwgImphdmEubGFuZy5GbG9hdCIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBDaGFyYWN0ZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSkFWQV9MQU5HX0NIQVJBQ1RFUl9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUpBVkFfTEFOR19DSEFSQUNURVIoOCwgImphdmFMYW5nQ2hhcmFjdGVyIiwgImphdmEubGFuZy5DaGFyYWN0ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgQm9vbGVhbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SmF2YSBMYW5nIEJvb2xlYW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSkFWQV9MQU5HX0JPT0xFQU4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0xBTkdfQk9PTEVBTl9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgU3RyaW5nPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZhIExhbmcgU3RyaW5nPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0pBVkFfTEFOR19TVFJJTkcKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0xBTkdfU1RSSU5HX1ZBTFVFID0gMTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBJbnRlZ2VyPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZhIExhbmcgSW50ZWdlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNKQVZBX0xBTkdfSU5URUdFUgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTEFOR19JTlRFR0VSX1ZBTFVFID0gMjsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBEb3VibGU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkphdmEgTGFuZyBEb3VibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSkFWQV9MQU5HX0RPVUJMRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTEFOR19ET1VCTEVfVkFMVUUgPSAzOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIEJ5dGU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkphdmEgTGFuZyBCeXRlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0pBVkFfTEFOR19CWVRFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9MQU5HX0JZVEVfVkFMVUUgPSA0OworCisJLyoqCisJICogVGhlICc8ZW0+PGI+SmF2YSBMYW5nIFNob3J0PC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZhIExhbmcgU2hvcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSkFWQV9MQU5HX1NIT1JUCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9MQU5HX1NIT1JUX1ZBTFVFID0gNTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBMb25nPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZhIExhbmcgTG9uZzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNKQVZBX0xBTkdfTE9ORworCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTEFOR19MT05HX1ZBTFVFID0gNjsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkphdmEgTGFuZyBGbG9hdDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SmF2YSBMYW5nIEZsb2F0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0pBVkFfTEFOR19GTE9BVAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfTEFOR19GTE9BVF9WQUxVRSA9IDc7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5KYXZhIExhbmcgQ2hhcmFjdGVyPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZhIExhbmcgQ2hhcmFjdGVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0pBVkFfTEFOR19DSEFSQUNURVIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX0xBTkdfQ0hBUkFDVEVSX1ZBTFVFID0gODsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydHkgVHlwZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25maWdQcm9wZXJ0eVR5cGVUeXBlW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IENvbmZpZ1Byb3BlcnR5VHlwZVR5cGVbXSB7CisJCQlKQVZBX0xBTkdfQk9PTEVBTiwKKwkJCUpBVkFfTEFOR19TVFJJTkcsCisJCQlKQVZBX0xBTkdfSU5URUdFUiwKKwkJCUpBVkFfTEFOR19ET1VCTEUsCisJCQlKQVZBX0xBTkdfQllURSwKKwkJCUpBVkFfTEFOR19TSE9SVCwKKwkJCUpBVkFfTEFOR19MT05HLAorCQkJSkFWQV9MQU5HX0ZMT0FULAorCQkJSkFWQV9MQU5HX0NIQVJBQ1RFUiwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydHkgVHlwZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q29uZmlnUHJvcGVydHlUeXBlVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydHkgVHlwZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29uZmlnUHJvcGVydHlUeXBlVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUNvbmZpZ1Byb3BlcnR5VHlwZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydHkgVHlwZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ29uZmlnUHJvcGVydHlUeXBlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUNvbmZpZ1Byb3BlcnR5VHlwZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eSBUeXBlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDb25maWdQcm9wZXJ0eVR5cGVUeXBlIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBKQVZBX0xBTkdfQk9PTEVBTl9WQUxVRTogcmV0dXJuIEpBVkFfTEFOR19CT09MRUFOOworCQkJY2FzZSBKQVZBX0xBTkdfU1RSSU5HX1ZBTFVFOiByZXR1cm4gSkFWQV9MQU5HX1NUUklORzsKKwkJCWNhc2UgSkFWQV9MQU5HX0lOVEVHRVJfVkFMVUU6IHJldHVybiBKQVZBX0xBTkdfSU5URUdFUjsKKwkJCWNhc2UgSkFWQV9MQU5HX0RPVUJMRV9WQUxVRTogcmV0dXJuIEpBVkFfTEFOR19ET1VCTEU7CisJCQljYXNlIEpBVkFfTEFOR19CWVRFX1ZBTFVFOiByZXR1cm4gSkFWQV9MQU5HX0JZVEU7CisJCQljYXNlIEpBVkFfTEFOR19TSE9SVF9WQUxVRTogcmV0dXJuIEpBVkFfTEFOR19TSE9SVDsKKwkJCWNhc2UgSkFWQV9MQU5HX0xPTkdfVkFMVUU6IHJldHVybiBKQVZBX0xBTkdfTE9ORzsKKwkJCWNhc2UgSkFWQV9MQU5HX0ZMT0FUX1ZBTFVFOiByZXR1cm4gSkFWQV9MQU5HX0ZMT0FUOworCQkJY2FzZSBKQVZBX0xBTkdfQ0hBUkFDVEVSX1ZBTFVFOiByZXR1cm4gSkFWQV9MQU5HX0NIQVJBQ1RFUjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgQ29uZmlnUHJvcGVydHlUeXBlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9Db25maWdQcm9wZXJ0eVR5cGVUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9Db25uZWN0aW9uRGVmaW5pdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvQ29ubmVjdGlvbkRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjY5OGU2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvQ29ubmVjdGlvbkRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDI5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2E7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKyAqIAorICogCisgKiAgICAgICAgIFRoZSBjb25uZWN0aW9uLWRlZmluaXRpb25UeXBlIGRlZmluZXMgYSBzZXQgb2YgY29ubmVjdGlvbgorICogICAgICAgICBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzIHBlcnRhaW5pbmcgdG8gYSBwYXJ0aWN1bGFyIGNvbm5lY3Rpb24KKyAqICAgICAgICAgdHlwZS4gVGhpcyBhbHNvIGluY2x1ZGVzIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGZvcgorICogICAgICAgICBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgaW5zdGFuY2VzIHRoYXQgbWF5IGJlIHByb2R1Y2VkIG91dAorICogICAgICAgICBvZiB0aGlzIHNldC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIENvbm5lY3RvciAxLjYKKyAqICAgICAgIAorICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldE1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzIDxlbT5NYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnkgQ2xhc3M8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbmZpZ1Byb3BlcnR5IDxlbT5Db25maWcgUHJvcGVydHk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlIDxlbT5Db25uZWN0aW9uZmFjdG9yeSBJbnRlcmZhY2U8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzIDxlbT5Db25uZWN0aW9uZmFjdG9yeSBJbXBsIENsYXNzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uSW50ZXJmYWNlIDxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkltcGxDbGFzcyA8ZW0+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKQorICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbkRlZmluaXRpb24gZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogPCFbQ0RBVEFbWworCSAqICAgICAgICAgICAgIFRoZSBlbGVtZW50IG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcyBzcGVjaWZpZXMKKwkgKiAgICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgdGhhdAorCSAqICAgICAgICAgICAgIGltcGxlbWVudHMgdGhlCisJICogICAgICAgICAgICAgamF2YXgucmVzb3VyY2Uuc3BpLk1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeSBpbnRlcmZhY2UuCisJICogICAgICAgICAgICAgVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YgcmVzb3VyY2UKKwkgKiAgICAgICAgICAgICBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yIGFyY2hpdGVjdHVyZQorCSAqICAgICAgICAgICAgIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCisJICogICAgICAgICAgICAgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBFeGFtcGxlOgorCSAqICAgICAgICAgICAgIDxtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+CisJICogICAgICAgICAgICAgCSAgY29tLndvbWJhdC5NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlJbXBsCisJICogICAgICAgICAgICAgPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+CisJICogICAgICAgICAgICAgCisJICogXV0+CisJICogCQkJQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnlDbGFzcyhTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbm5lY3Rpb25EZWZpbml0aW9uX01hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldE1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRNYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnlDbGFzcyA8ZW0+TWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnkgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnlDbGFzcyhTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25maWdQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8Q29uZmlnUHJvcGVydHk+IGdldENvbmZpZ1Byb3BlcnR5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25uZWN0aW9uZmFjdG9yeSBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIDwhW0NEQVRBW1sKKwkgKiAgICAgICAgICAgICBUaGUgZWxlbWVudCBjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2Ugc3BlY2lmaWVzCisJICogICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeQorCSAqICAgICAgICAgICAgIGludGVyZmFjZSBzdXBwb3J0ZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgRXhhbXBsZToKKwkgKiAgICAgICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmNvbS53b21iYXQuQ29ubmVjdGlvbkZhY3RvcnkKKwkgKiAgICAgICAgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBPUgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2UuY2NpLkNvbm5lY3Rpb25GYWN0b3J5CisJICogICAgICAgICAgICAgPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+CisJICogICAgICAgICAgICAgCisJICogXV0+CisJICogCQkJQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbmZhY3RvcnkgSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRDb25uZWN0aW9uZmFjdG9yeUludGVyZmFjZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldENvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uZmFjdG9yeUludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbmZhY3RvcnkgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uZmFjdG9yeSBJbnRlcmZhY2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb25uZWN0aW9uZmFjdG9yeUludGVyZmFjZShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbmZhY3RvcnkgSW1wbCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogPCFbQ0RBVEFbWworCSAqICAgICAgICAgICAgIFRoZSBlbGVtZW50IGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3Mgc3BlY2lmaWVzCisJICogICAgICAgICAgICAgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBDb25uZWN0aW9uRmFjdG9yeQorCSAqICAgICAgICAgICAgIGNsYXNzIHRoYXQgaW1wbGVtZW50cyByZXNvdXJjZSBhZGFwdGVyCisJICogICAgICAgICAgICAgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgaW50ZXJmYWNlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEV4YW1wbGU6CisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29tLndvbWJhdC5Db25uZWN0aW9uRmFjdG9yeUltcGwKKwkgKiAgICAgICAgICAgICA8L2Nvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+CisJICogICAgICAgICAgICAgCisJICogXV0+CisJICogCQkJQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbmZhY3RvcnkgSW1wbCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Q29ubmVjdGlvbmZhY3RvcnlJbXBsQ2xhc3MoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uZmFjdG9yeUltcGxDbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRDb25uZWN0aW9uZmFjdG9yeUltcGxDbGFzcygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbmZhY3RvcnlJbXBsQ2xhc3MgPGVtPkNvbm5lY3Rpb25mYWN0b3J5IEltcGwgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb25mYWN0b3J5IEltcGwgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb25uZWN0aW9uZmFjdG9yeUltcGxDbGFzcyhTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIDwhW0NEQVRBW1sKKwkgKiAgICAgICAgICAgICBUaGUgY29ubmVjdGlvbi1pbnRlcmZhY2UgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGZ1bGx5CisJICogICAgICAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gaW50ZXJmYWNlIHN1cHBvcnRlZAorCSAqICAgICAgICAgICAgIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEV4YW1wbGU6CisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgCSAgPGNvbm5lY3Rpb24taW50ZXJmYWNlPmphdmF4LnJlc291cmNlLmNjaS5Db25uZWN0aW9uCisJICogICAgICAgICAgICAgCSAgPC9jb25uZWN0aW9uLWludGVyZmFjZT4KKwkgKiAgICAgICAgICAgICAKKwkgKiBdXT4KKwkgKiAJCQlAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Q29ubmVjdGlvbkludGVyZmFjZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb25uZWN0aW9uSW50ZXJmYWNlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIDwhW0NEQVRBW1sKKwkgKiAgICAgICAgICAgICBUaGUgY29ubmVjdGlvbi1pbXBsLWNsYXNzVHlwZSBzcGVjaWZpZXMgdGhlIGZ1bGx5CisJICogICAgICAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIENvbm5lY3Rpb24gY2xhc3MgdGhhdAorCSAqICAgICAgICAgICAgIGltcGxlbWVudHMgcmVzb3VyY2UgYWRhcHRlciBzcGVjaWZpYyBDb25uZWN0aW9uCisJICogICAgICAgICAgICAgaW50ZXJmYWNlLiAgSXQgaXMgdXNlZCBieSB0aGUgY29ubmVjdGlvbi1pbXBsLWNsYXNzCisJICogICAgICAgICAgICAgZWxlbWVudHMuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgRXhhbXBsZToKKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICAJICA8Y29ubmVjdGlvbi1pbXBsLWNsYXNzPmNvbS53b21iYXQuQ29ubmVjdGlvbkltcGwKKwkgKiAgICAgICAgICAgICAJICA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KKwkgKiAgICAgICAgICAgICAKKwkgKiBdXT4KKwkgKiAJCQlAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENvbm5lY3Rpb25JbXBsQ2xhc3MoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldENvbm5lY3Rpb25JbXBsQ2xhc3MoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MgPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDb25uZWN0aW9uSW1wbENsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb25uZWN0aW9uSW1wbENsYXNzKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElkKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0SWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOworCit9IC8vIENvbm5lY3Rpb25EZWZpbml0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9Db25uZWN0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0Nvbm5lY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0M2UyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9Db25uZWN0b3IuamF2YQpAQCAtMCwwICsxLDQ3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2E7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29ubmVjdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgVGhlIGNvbm5lY3RvclR5cGUgZGVmaW5lcyBhIHJlc291cmNlIGFkYXB0ZXIuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0TW9kdWxlTmFtZSA8ZW0+TW9kdWxlIE5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldFZlbmRvck5hbWUgPGVtPlZlbmRvciBOYW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0RWlzVHlwZSA8ZW0+RWlzIFR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXRSZXNvdXJjZWFkYXB0ZXJWZXJzaW9uIDxlbT5SZXNvdXJjZWFkYXB0ZXIgVmVyc2lvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldExpY2Vuc2UgPGVtPkxpY2Vuc2U8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXRSZXNvdXJjZWFkYXB0ZXIgPGVtPlJlc291cmNlYWRhcHRlcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldFJlcXVpcmVkV29ya0NvbnRleHQgPGVtPlJlcXVpcmVkIFdvcmsgQ29udGV4dDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbm5lY3RvcigpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDb25uZWN0b3IgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZHVsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgZWxlbWVudCBtb2R1bGUtbmFtZSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlCisJICogICAgICAgICAgICAgcmVzb3VyY2UgYWRhcHRlci4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBJZiB0aGVyZSBpcyBubyBtb2R1bGUtbmFtZSBzcGVjaWZpZWQsIHRoZSBtb2R1bGUtbmFtZQorCSAqICAgICAgICAgICAgIGlzIGRldGVybWluZWQgYXMgZGVmaW5lZCBpbiBTZWN0aW9uIEVFLjguMS4xIGFuZCBFRS44LjEuMiAKKwkgKiAgICAgICAgICAgICBvZiB0aGUgSmF2YSBQbGF0Zm9ybSwgRW50ZXJwcmlzZSBFZGl0aW9uIChKYXZhIEVFKSAKKwkgKiAgICAgICAgICAgICBTcGVjaWZpY2F0aW9uLCB2ZXJzaW9uIDYuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW9kdWxlIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1vZHVsZU5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25uZWN0b3JfTW9kdWxlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRNb2R1bGVOYW1lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0TW9kdWxlTmFtZSA8ZW0+TW9kdWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNb2R1bGVOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNb2R1bGVOYW1lKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb259LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25uZWN0b3JfRGVzY3JpcHRpb25zKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25uZWN0b3JfRGlzcGxheU5hbWVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxEaXNwbGF5TmFtZT4gZ2V0RGlzcGxheU5hbWVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbm5lY3Rvcl9JY29ucygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8SWNvbj4gZ2V0SWNvbnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlbmRvciBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgZWxlbWVudCB2ZW5kb3ItbmFtZSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YKKwkgKiAgICAgICAgICAgICByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIHZlbmRvci4KKwkgKiAKKwkgKiAgICAgICAgICAgICBJZiB0aGVyZSBpcyBubyB2ZW5kb3ItbmFtZSBzcGVjaWZpZWQsIHRoZSBhcHBsaWNhdGlvbiAKKwkgKiAgICAgICAgICAgICBzZXJ2ZXIgbXVzdCBjb25zaWRlciB0aGUgZGVmYXVsdCAiIiAoZW1wdHkgc3RyaW5nKSBhcworCSAqICAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyIHByb3ZpZGVyIHZlbmRvci4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZW5kb3IgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VmVuZG9yTmFtZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbm5lY3Rvcl9WZW5kb3JOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFZlbmRvck5hbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXRWZW5kb3JOYW1lIDxlbT5WZW5kb3IgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVuZG9yIE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFZlbmRvck5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFZlbmRvck5hbWUoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVpcyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgZWxlbWVudCBlaXMtdHlwZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKwkgKiAgICAgICAgICAgICB0eXBlIG9mIHRoZSBFSVMuIEZvciBleGFtcGxlLCB0aGUgdHlwZSBvZiBhbiBFSVMgY2FuCisJICogICAgICAgICAgICAgYmUgcHJvZHVjdCBuYW1lIG9mIEVJUyBpbmRlcGVuZGVudCBvZiBhbnkgdmVyc2lvbgorCSAqICAgICAgICAgICAgIGluZm8uCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgVGhpcyBoZWxwcyBpbiBpZGVudGlmeWluZyBFSVMgaW5zdGFuY2VzIHRoYXQgY2FuIGJlCisJICogICAgICAgICAgICAgdXNlZCB3aXRoIHRoaXMgcmVzb3VyY2UgYWRhcHRlci4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBJZiB0aGVyZSBpcyBubyBlaXMtdHlwZSBzcGVjaWZpZWQsIHRoZSBhcHBsaWNhdGlvbiAKKwkgKiAgICAgICAgICAgICBzZXJ2ZXIgbXVzdCBjb25zaWRlciB0aGUgZGVmYXVsdCAiIiAoZW1wdHkgc3RyaW5nKSBhcworCSAqICAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSBFSVMuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWlzIFR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEVpc1R5cGUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25uZWN0b3JfRWlzVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRFaXNUeXBlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0RWlzVHlwZSA8ZW0+RWlzIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVpcyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRFaXNUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRFaXNUeXBlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNvdXJjZWFkYXB0ZXIgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIGVsZW1lbnQgcmVzb3VyY2VhZGFwdGVyLXZlcnNpb24gc3BlY2lmaWVzIGEgc3RyaW5nLWJhc2VkIHZlcnNpb24KKwkgKiAgICAgICAgICAgICBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciBmcm9tIHRoZSByZXNvdXJjZSBhZGFwdGVyCisJICogICAgICAgICAgICAgcHJvdmlkZXIuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gcmVzb3VyY2VhZGFwdGVyLXZlcnNpb24gc3BlY2lmaWVkLCB0aGUgYXBwbGljYXRpb24gCisJICogICAgICAgICAgICAgc2VydmVyIG11c3QgY29uc2lkZXIgdGhlIGRlZmF1bHQgIiIgKGVtcHR5IHN0cmluZykgYXMKKwkgKiAgICAgICAgICAgICB0aGUgdmVyc2lvbiBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlci4KKwkgKiAgICAgICAgICAgICAJCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2VhZGFwdGVyIFZlcnNpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFJlc291cmNlYWRhcHRlclZlcnNpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25uZWN0b3JfUmVzb3VyY2VhZGFwdGVyVmVyc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRSZXNvdXJjZWFkYXB0ZXJWZXJzaW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0UmVzb3VyY2VhZGFwdGVyVmVyc2lvbiA8ZW0+UmVzb3VyY2VhZGFwdGVyIFZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlYWRhcHRlciBWZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSZXNvdXJjZWFkYXB0ZXJWZXJzaW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRSZXNvdXJjZWFkYXB0ZXJWZXJzaW9uKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaWNlbnNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MaWNlbnNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpY2Vuc2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldExpY2Vuc2UoTGljZW5zZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0Q29ubmVjdG9yX0xpY2Vuc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaWNlbnNlIGdldExpY2Vuc2UoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXRMaWNlbnNlIDxlbT5MaWNlbnNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaWNlbnNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRMaWNlbnNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRMaWNlbnNlKExpY2Vuc2UgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2VhZGFwdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZWFkYXB0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2VhZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRSZXNvdXJjZWFkYXB0ZXIoUmVzb3VyY2VBZGFwdGVyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25uZWN0b3JfUmVzb3VyY2VhZGFwdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUmVzb3VyY2VBZGFwdGVyIGdldFJlc291cmNlYWRhcHRlcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldFJlc291cmNlYWRhcHRlciA8ZW0+UmVzb3VyY2VhZGFwdGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZWFkYXB0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFJlc291cmNlYWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVzb3VyY2VhZGFwdGVyKFJlc291cmNlQWRhcHRlciB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXF1aXJlZCBXb3JrIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoZSBlbGVtZW50IHJlcXVpcmVkLXdvcmstY29udGV4dCBzcGVjaWZpZXMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgCisJICogICAgICAgICAgICAgbmFtZSB0aGF0IGltcGxlbWVudHMgV29ya0NvbnRleHQgaW50ZXJmYWNlLCB0aGF0IHRoZSByZXNvdXJjZSBhZGFwdGVyIAorCSAqICAgICAgICAgICAgIHJlcXVpcmVzIHRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gc3VwcG9ydC4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZCBXb3JrIENvbnRleHQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbm5lY3Rvcl9SZXF1aXJlZFdvcmtDb250ZXh0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxTdHJpbmc+IGdldFJlcXVpcmVkV29ya0NvbnRleHQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SWQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25uZWN0b3JfSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0SWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgVGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBkZWZpbmVzIHdoZXRoZXIgdGhlIGRlcGxveW1lbnQgCisJICogICAgICAgICAgIGRlc2NyaXB0b3IgZm9yIHRoZSByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZSBpcyBjb21wbGV0ZSwgb3Igd2hldGhlcgorCSAqICAgICAgICAgICB0aGUgY2xhc3MgZmlsZXMgYXZhaWxhYmxlIHRvIHRoZSBtb2R1bGUgYW5kIHBhY2thZ2VkIHdpdGggdGhlIHJlc291cmNlIAorCSAqICAgICAgICAgICBhZGFwdGVyIHNob3VsZCBiZSBleGFtaW5lZCBmb3IgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgCisJICogICAgICAgICAgIGluZm9ybWF0aW9uLgorCSAqICAgICAgICAgICAKKwkgKiAgICAgICAgICAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQgdG9vbCBvZiB0aGUgCisJICogICAgICAgICAgIGFwcGxpY2F0aW9uIHNlcnZlciBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgCisJICogICAgICAgICAgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcyBvZiB0aGUgCisJICogICAgICAgICAgIGFwcGxpY2F0aW9uLklmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgc2V0IHRvICJmYWxzZSIsIAorCSAqICAgICAgICAgICB0aGUgZGVwbG95bWVudCB0b29sIG11c3QgZXhhbWluZSB0aGUgY2xhc3MgZmlsZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciAKKwkgKiAgICAgICAgICAgYW5ub3RhdGlvbnMsIGFzIHNwZWNpZmllZCBieSB0aGlzIHNwZWNpZmljYXRpb24uIElmIHRoZSAKKwkgKiAgICAgICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIG5vdCBpbmNsdWRlZCBvciBpcyBpbmNsdWRlZCBidXQgbm90IG1hcmtlZCAKKwkgKiAgICAgICAgICAgbWV0YWRhdGEtY29tcGxldGUsIHRoZSBkZXBsb3ltZW50IHRvb2wgd2lsbCBwcm9jZXNzIGFubm90YXRpb25zLgorCSAqICAgICAgICAgICAKKwkgKiAgICAgICAgICAgQXBwbGljYXRpb24gc2VydmVycyBtdXN0IGFzc3VtZSB0aGF0IG1ldGFkYXRhLWNvbXBsZXRlIGlzIHRydWUgZm9yIAorCSAqICAgICAgICAgICByZXNvdXJjZSBhZGFwdGVyIG1vZHVsZXMgd2l0aCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdmVyc2lvbiAKKwkgKiAgICAgICAgICAgbG93ZXIgdGhhbiAxLjYuCisJICogICAgICAgICAgIAkJCisJICogICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIENvbm5lY3RvciAxLjYKKwkgKiAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkKKwkgKiBAc2VlICN1bnNldE1ldGFkYXRhQ29tcGxldGUoKQorCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0Q29ubmVjdG9yX01ldGFkYXRhQ29tcGxldGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzTWV0YWRhdGFDb21wbGV0ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldE1ldGFkYXRhQ29tcGxldGUoKQorCSAqIEBzZWUgI3Vuc2V0TWV0YWRhdGFDb21wbGV0ZSgpCisJICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkKKwkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQorCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbikKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCB1bnNldE1ldGFkYXRhQ29tcGxldGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogQHNlZSAjdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCkKKwkgKiBAc2VlICNpc01ldGFkYXRhQ29tcGxldGUoKQorCSAqIEBzZWUgI3NldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbikKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NldE1ldGFkYXRhQ29tcGxldGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iMS42IjwvY29kZT4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgVGhlIHZlcnNpb24gaW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgdG8gYmUgdXNlZCBieSB0aGUKKwkgKiAgICAgICAgICAgZGVwbG95bWVudCB0b29sLiBUaGlzIGVsZW1lbnQgZG9lc24ndCBoYXZlIGEgZGVmYXVsdCwgYW5kIHRoZSByZXNvdXJjZSBhZGFwdGVyIAorCSAqICAgICAgICAgICBkZXZlbG9wZXIvZGVwbG95ZXIgaXMgcmVxdWlyZWQgdG8gc3BlY2lmeSBpdC4gVGhlIGVsZW1lbnQgYWxsb3dzIHRoZSBkZXBsb3ltZW50IAorCSAqICAgICAgICAgICB0b29sIHRvIGNob29zZSB3aGljaCBzY2hlbWEgdG8gdmFsaWRhdGUgdGhlIGRlc2NyaXB0b3IgYWdhaW5zdC4KKwkgKiAgICAgICAgICAgCSAgCisJICogICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIENvbm5lY3RvciAxLjYKKwkgKiAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldFZlcnNpb24oKQorCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCisJICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbm5lY3Rvcl9WZXJzaW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFZlcnNpb24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldFZlcnNpb24oKQorCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCisJICogQHNlZSAjZ2V0VmVyc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKKwkgKiBAc2VlICNnZXRWZXJzaW9uKCkKKwkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCB1bnNldFZlcnNpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldFZlcnNpb24oKQorCSAqIEBzZWUgI2dldFZlcnNpb24oKQorCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0VmVyc2lvbigpOworCit9IC8vIENvbm5lY3RvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0Nvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5MDIwZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0Nvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25uZWN0b3IgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yI2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRDb25uZWN0b3IgPGVtPkNvbm5lY3RvcjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcigpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvciBleHRlbmRzIEphdmFFRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1peGVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRmVhdHVyZU1hcCBnZXRNaXhlZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgorCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCisJICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYTUxOU1ByZWZpeE1hcCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgorCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCisJICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldENvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29ubmVjdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgIFRoZSBjb25uZWN0b3IgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXBsb3ltZW50CisJICogICAgICAgICBkZXNjcmlwdG9yIGZvciB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IGluY2x1ZGVzCisJICogICAgICAgICBnZW5lcmFsIGluZm9ybWF0aW9uIC0gdmVuZG9yIG5hbWUsIHJlc291cmNlIGFkYXB0ZXIgdmVyc2lvbiwKKwkgKiAgICAgICAgIGljb24gLSBhYm91dCB0aGUgcmVzb3VyY2UgYWRhcHRlciBtb2R1bGUuIEl0IGFsc28gaW5jbHVkZXMKKwkgKiAgICAgICAgIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVzb3VyY2UKKwkgKiAgICAgICAgIGFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgZWxlbWVudAorCSAqICAgICAgICAgcmVzb3VyY2VhZGFwdGVyLgorCSAqICAgICAgICAgCisJICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisJICogICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3RvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q29ubmVjdG9yKENvbm5lY3RvcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0Q29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JfQ29ubmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ29ubmVjdG9yIGdldENvbm5lY3RvcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0Q29ubmVjdG9yIDxlbT5Db25uZWN0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3RvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Q29ubmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb25uZWN0b3IoQ29ubmVjdG9yIHZhbHVlKTsKKworfSAvLyBDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvQ3JlZGVudGlhbEludGVyZmFjZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0NyZWRlbnRpYWxJbnRlcmZhY2VUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkZDgzNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0NyZWRlbnRpYWxJbnRlcmZhY2VUeXBlLmphdmEKQEAgLTAsMCArMSwyNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+Q3JlZGVudGlhbCBJbnRlcmZhY2UgVHlwZTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgY3JlZGVudGlhbC1pbnRlcmZhY2VUeXBlIHNwZWNpZmllcyB0aGUKKyAqICAgICAgICAgaW50ZXJmYWNlIHRoYXQgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24KKyAqICAgICAgICAgc3VwcG9ydHMgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAqICAgICAgICAgY3JlZGVudGlhbHMuIFRoaXMgZWxlbWVudChzKSB0aGF0IHVzZSB0aGlzIHR5cGUsCisgKiAgICAgICAgIGkuZS4gY3JlZGVudGlhbC1pbnRlcmZhY2UsICBzaG91bGQgYmUgdXNlZCBieQorICogICAgICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXIgdG8gZmluZCBvdXQgdGhlIENyZWRlbnRpYWwKKyAqICAgICAgICAgaW50ZXJmYWNlIGl0IHNob3VsZCB1c2UgYXMgcGFydCBvZiB0aGUgc2VjdXJpdHkKKyAqICAgICAgICAgY29udHJhY3QuCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgcG9zc2libGUgdmFsdWVzIGFyZToKKyAqICAgICAgICAgCisgKiAgICAgICAgIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwKKyAqICAgICAgICAgb3JnLmlldGYuamdzcy5HU1NDcmVkZW50aWFsCisgKiAgICAgICAgIGphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbAorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0Q3JlZGVudGlhbEludGVyZmFjZVR5cGUoKQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBDcmVkZW50aWFsSW50ZXJmYWNlVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkphdmF4IFJlc291cmNlIFNwaSBTZWN1cml0eSBQYXNzd29yZCBDcmVkZW50aWFsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0pBVkFYX1JFU09VUkNFX1NQSV9TRUNVUklUWV9QQVNTV09SRF9DUkVERU5USUFMX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJSkFWQVhfUkVTT1VSQ0VfU1BJX1NFQ1VSSVRZX1BBU1NXT1JEX0NSRURFTlRJQUwoMCwgImphdmF4UmVzb3VyY2VTcGlTZWN1cml0eVBhc3N3b3JkQ3JlZGVudGlhbCIsICJqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+T3JnIElldGYgSmdzcyBHU1MgQ3JlZGVudGlhbDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNPUkdfSUVURl9KR1NTX0dTU19DUkVERU5USUFMX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJT1JHX0lFVEZfSkdTU19HU1NfQ1JFREVOVElBTCgxLCAib3JnSWV0Zkpnc3NHU1NDcmVkZW50aWFsIiwgIm9yZy5pZXRmLmpnc3MuR1NTQ3JlZGVudGlhbCIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkphdmF4IFJlc291cmNlIFNwaSBTZWN1cml0eSBHZW5lcmljIENyZWRlbnRpYWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSkFWQVhfUkVTT1VSQ0VfU1BJX1NFQ1VSSVRZX0dFTkVSSUNfQ1JFREVOVElBTF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUpBVkFYX1JFU09VUkNFX1NQSV9TRUNVUklUWV9HRU5FUklDX0NSRURFTlRJQUwoMiwgImphdmF4UmVzb3VyY2VTcGlTZWN1cml0eUdlbmVyaWNDcmVkZW50aWFsIiwgImphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5HZW5lcmljQ3JlZGVudGlhbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkphdmF4IFJlc291cmNlIFNwaSBTZWN1cml0eSBQYXNzd29yZCBDcmVkZW50aWFsPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KYXZheCBSZXNvdXJjZSBTcGkgU2VjdXJpdHkgUGFzc3dvcmQgQ3JlZGVudGlhbDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNKQVZBWF9SRVNPVVJDRV9TUElfU0VDVVJJVFlfUEFTU1dPUkRfQ1JFREVOVElBTAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFYX1JFU09VUkNFX1NQSV9TRUNVUklUWV9QQVNTV09SRF9DUkVERU5USUFMX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk9yZyBJZXRmIEpnc3MgR1NTIENyZWRlbnRpYWw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9yZyBJZXRmIEpnc3MgR1NTIENyZWRlbnRpYWw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjT1JHX0lFVEZfSkdTU19HU1NfQ1JFREVOVElBTAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SR19JRVRGX0pHU1NfR1NTX0NSRURFTlRJQUxfVkFMVUUgPSAxOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+SmF2YXggUmVzb3VyY2UgU3BpIFNlY3VyaXR5IEdlbmVyaWMgQ3JlZGVudGlhbDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SmF2YXggUmVzb3VyY2UgU3BpIFNlY3VyaXR5IEdlbmVyaWMgQ3JlZGVudGlhbDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNKQVZBWF9SRVNPVVJDRV9TUElfU0VDVVJJVFlfR0VORVJJQ19DUkVERU5USUFMCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQVhfUkVTT1VSQ0VfU1BJX1NFQ1VSSVRZX0dFTkVSSUNfQ1JFREVOVElBTF9WQUxVRSA9IDI7CisKKwkvKioKKwkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+Q3JlZGVudGlhbCBJbnRlcmZhY2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ3JlZGVudGlhbEludGVyZmFjZVR5cGVbXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgQ3JlZGVudGlhbEludGVyZmFjZVR5cGVbXSB7CisJCQlKQVZBWF9SRVNPVVJDRV9TUElfU0VDVVJJVFlfUEFTU1dPUkRfQ1JFREVOVElBTCwKKwkJCU9SR19JRVRGX0pHU1NfR1NTX0NSRURFTlRJQUwsCisJCQlKQVZBWF9SRVNPVVJDRV9TUElfU0VDVVJJVFlfR0VORVJJQ19DUkVERU5USUFMLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkNyZWRlbnRpYWwgSW50ZXJmYWNlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDcmVkZW50aWFsSW50ZXJmYWNlVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5DcmVkZW50aWFsIEludGVyZmFjZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ3JlZGVudGlhbEludGVyZmFjZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlDcmVkZW50aWFsSW50ZXJmYWNlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNyZWRlbnRpYWwgSW50ZXJmYWNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBDcmVkZW50aWFsSW50ZXJmYWNlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5DcmVkZW50aWFsIEludGVyZmFjZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ3JlZGVudGlhbEludGVyZmFjZVR5cGUgZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIEpBVkFYX1JFU09VUkNFX1NQSV9TRUNVUklUWV9QQVNTV09SRF9DUkVERU5USUFMX1ZBTFVFOiByZXR1cm4gSkFWQVhfUkVTT1VSQ0VfU1BJX1NFQ1VSSVRZX1BBU1NXT1JEX0NSRURFTlRJQUw7CisJCQljYXNlIE9SR19JRVRGX0pHU1NfR1NTX0NSRURFTlRJQUxfVkFMVUU6IHJldHVybiBPUkdfSUVURl9KR1NTX0dTU19DUkVERU5USUFMOworCQkJY2FzZSBKQVZBWF9SRVNPVVJDRV9TUElfU0VDVVJJVFlfR0VORVJJQ19DUkVERU5USUFMX1ZBTFVFOiByZXR1cm4gSkFWQVhfUkVTT1VSQ0VfU1BJX1NFQ1VSSVRZX0dFTkVSSUNfQ1JFREVOVElBTDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgQ3JlZGVudGlhbEludGVyZmFjZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vQ3JlZGVudGlhbEludGVyZmFjZVR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0lDb25uZWN0b3JSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvSUNvbm5lY3RvclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2ZWVkZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0lDb25uZWN0b3JSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3RvclJlc291cmNlIHsKKworCS8qKgorCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCisJICovCisJcHVibGljIGFic3RyYWN0IEVPYmplY3QgZ2V0Um9vdE9iamVjdCgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSBDb25uZWN0b3IKKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3QgQ29ubmVjdG9yIGdldENvbm5lY3RvcigpOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvSW5ib3VuZFJlc291cmNlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvSW5ib3VuZFJlc291cmNlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZTI0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2E7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbgorICogICAgICAgICBhYm91dCBhbiBpbmJvdW5kIHJlc291cmNlIGFkYXB0ZXIuIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24KKyAqICAgICAgICAgc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZSBhZGFwdGVyCisgKiAgICAgICAgIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIG1lc3NhZ2VhZGFwdGVyIGVsZW1lbnQuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldE1lc3NhZ2VhZGFwdGVyIDxlbT5NZXNzYWdlYWRhcHRlcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlciNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlYWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZWFkYXB0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZWFkYXB0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldE1lc3NhZ2VhZGFwdGVyKE1lc3NhZ2VBZGFwdGVyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX01lc3NhZ2VhZGFwdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTWVzc2FnZUFkYXB0ZXIgZ2V0TWVzc2FnZWFkYXB0ZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0TWVzc2FnZWFkYXB0ZXIgPGVtPk1lc3NhZ2VhZGFwdGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlYWRhcHRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0TWVzc2FnZWFkYXB0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1lc3NhZ2VhZGFwdGVyKE1lc3NhZ2VBZGFwdGVyIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SWQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX0lkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOworCit9IC8vIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0pjYUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL0pjYUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2M2ODljCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvSmNhRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEpjYUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlKY2FGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhRmFjdG9yeUltcGwuaW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQWN0aXZhdGlvblNwZWMgY3JlYXRlQWN0aXZhdGlvblNwZWMoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWRtaW4gT2JqZWN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BZG1pbiBPYmplY3Q8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUFkbWluT2JqZWN0IGNyZWF0ZUFkbWluT2JqZWN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25maWcgUHJvcGVydHk8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ29uZmlnUHJvcGVydHkgY3JlYXRlQ29uZmlnUHJvcGVydHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvbm5lY3Rpb25EZWZpbml0aW9uIGNyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbm5lY3RvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29ubmVjdG9yPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDb25uZWN0b3IgY3JlYXRlQ29ubmVjdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbm5lY3RvciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbm5lY3RvciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yIGNyZWF0ZUNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIGNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TGljZW5zZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TGljZW5zZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGljZW5zZSBjcmVhdGVMaWNlbnNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNZXNzYWdlQWRhcHRlciBjcmVhdGVNZXNzYWdlQWRhcHRlcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlIExpc3RlbmVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXNzYWdlIExpc3RlbmVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNZXNzYWdlTGlzdGVuZXIgY3JlYXRlTWVzc2FnZUxpc3RlbmVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIGNyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSZXF1aXJlZENvbmZpZ1Byb3BlcnR5IGNyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUmVzb3VyY2VBZGFwdGVyIGNyZWF0ZVJlc291cmNlQWRhcHRlcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBQZXJtaXNzaW9uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBQZXJtaXNzaW9uPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTZWN1cml0eVBlcm1pc3Npb24gY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCisJICogQGdlbmVyYXRlZAorCSAqLworCUpjYVBhY2thZ2UgZ2V0SmNhUGFja2FnZSgpOworCit9IC8vSmNhRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvTGljZW5zZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvTGljZW5zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MWYxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9MaWNlbnNlLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGljZW5zZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKyAqIAorICogCisgKiAgICAgICAgIFRoZSBsaWNlbnNlVHlwZSBzcGVjaWZpZXMgbGljZW5zaW5nIHJlcXVpcmVtZW50cyBmb3IgdGhlCisgKiAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIgbW9kdWxlLiBUaGlzIHR5cGUgc3BlY2lmaWVzIHdoZXRoZXIgYQorICogICAgICAgICBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGRlcGxveSBhbmQgdXNlIHRoaXMgcmVzb3VyY2UgYWRhcHRlciwKKyAqICAgICAgICAgYW5kIGFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWNlbnNpbmcgdGVybXMKKyAqICAgICAgICAgKGV4YW1wbGVzOiBkdXJhdGlvbiBvZiBsaWNlbnNlLCBudW1iZXIgb2YgY29ubmVjdGlvbgorICogICAgICAgICByZXN0cmljdGlvbnMpLiBJdCBpcyB1c2VkIGJ5IHRoZSBsaWNlbnNlIGVsZW1lbnQuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5MaWNlbnNlI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTGljZW5zZSNpc0xpY2Vuc2VSZXF1aXJlZCA8ZW0+TGljZW5zZSBSZXF1aXJlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTGljZW5zZSNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0TGljZW5zZSgpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBMaWNlbnNlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpY2Vuc2UgUmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoZSBlbGVtZW50IGxpY2Vuc2UtcmVxdWlyZWQgc3BlY2lmaWVzIHdoZXRoZXIgYQorCSAqICAgICAgICAgICAgIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gZGVwbG95IGFuZCB1c2UgdGhlCisJICogICAgICAgICAgICAgcmVzb3VyY2UgYWRhcHRlci4gVGhpcyBlbGVtZW50IG11c3QgYmUgb25lIG9mCisJICogICAgICAgICAgICAgdGhlIGZvbGxvd2luZywgInRydWUiIG9yICJmYWxzZSIuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGljZW5zZSBSZXF1aXJlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRMaWNlbnNlUmVxdWlyZWQoKQorCSAqIEBzZWUgI3Vuc2V0TGljZW5zZVJlcXVpcmVkKCkKKwkgKiBAc2VlICNzZXRMaWNlbnNlUmVxdWlyZWQoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0TGljZW5zZV9MaWNlbnNlUmVxdWlyZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzTGljZW5zZVJlcXVpcmVkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5MaWNlbnNlI2lzTGljZW5zZVJlcXVpcmVkIDxlbT5MaWNlbnNlIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaWNlbnNlIFJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldExpY2Vuc2VSZXF1aXJlZCgpCisJICogQHNlZSAjdW5zZXRMaWNlbnNlUmVxdWlyZWQoKQorCSAqIEBzZWUgI2lzTGljZW5zZVJlcXVpcmVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRMaWNlbnNlUmVxdWlyZWQoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkxpY2Vuc2UjaXNMaWNlbnNlUmVxdWlyZWQgPGVtPkxpY2Vuc2UgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0TGljZW5zZVJlcXVpcmVkKCkKKwkgKiBAc2VlICNpc0xpY2Vuc2VSZXF1aXJlZCgpCisJICogQHNlZSAjc2V0TGljZW5zZVJlcXVpcmVkKGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRMaWNlbnNlUmVxdWlyZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTGljZW5zZSNpc0xpY2Vuc2VSZXF1aXJlZCA8ZW0+TGljZW5zZSBSZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGljZW5zZSBSZXF1aXJlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIEBzZWUgI3Vuc2V0TGljZW5zZVJlcXVpcmVkKCkKKwkgKiBAc2VlICNpc0xpY2Vuc2VSZXF1aXJlZCgpCisJICogQHNlZSAjc2V0TGljZW5zZVJlcXVpcmVkKGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNTZXRMaWNlbnNlUmVxdWlyZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SWQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRMaWNlbnNlX0lkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5MaWNlbnNlI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOworCit9IC8vIExpY2Vuc2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL01lc3NhZ2VBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9NZXNzYWdlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDRhMDUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9NZXNzYWdlQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIEFkYXB0ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgbWVzc2FnZWFkYXB0ZXJUeXBlIHNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAqICAgICAgICAgbWVzc2FnaW5nIGNhcGFiaWxpdGllcyBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlci4gVGhpcworICogICAgICAgICBjb250YWlucyBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKiAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIgbGlicmFyeSBhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUKKyAqICAgICAgICAgbWVzc2FnZWxpc3RlbmVyIGVsZW1lbnQuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5NZXNzYWdlQWRhcHRlciNnZXRNZXNzYWdlbGlzdGVuZXIgPGVtPk1lc3NhZ2VsaXN0ZW5lcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTWVzc2FnZUFkYXB0ZXIjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldE1lc3NhZ2VBZGFwdGVyKCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VBZGFwdGVyIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlbGlzdGVuZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5NZXNzYWdlTGlzdGVuZXJ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZWxpc3RlbmVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZWxpc3RlbmVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRNZXNzYWdlQWRhcHRlcl9NZXNzYWdlbGlzdGVuZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PE1lc3NhZ2VMaXN0ZW5lcj4gZ2V0TWVzc2FnZWxpc3RlbmVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElkKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0TWVzc2FnZUFkYXB0ZXJfSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0SWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk1lc3NhZ2VBZGFwdGVyI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOworCit9IC8vIE1lc3NhZ2VBZGFwdGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9NZXNzYWdlTGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL01lc3NhZ2VMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZTdhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9NZXNzYWdlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2E7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIExpc3RlbmVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgVGhlIG1lc3NhZ2VsaXN0ZW5lclR5cGUgc3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IGEKKyAqICAgICAgICAgc3BlY2lmaWMgbWVzc2FnZSBsaXN0ZW5lciBzdXBwb3J0ZWQgYnkgdGhlIG1lc3NhZ2luZworICogICAgICAgICByZXNvdXJjZSBhZGFwdGVyLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgSmF2YSB0eXBlCisgKiAgICAgICAgIG9mIHRoZSBtZXNzYWdlIGxpc3RlbmVyIGludGVyZmFjZSBhbmQgYW4gYWN0aXZhdGlvbgorICogICAgICAgICBzcGVjaWZpY2F0aW9uLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTWVzc2FnZUxpc3RlbmVyI2dldE1lc3NhZ2VsaXN0ZW5lclR5cGUgPGVtPk1lc3NhZ2VsaXN0ZW5lciBUeXBlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5NZXNzYWdlTGlzdGVuZXIjZ2V0QWN0aXZhdGlvbnNwZWMgPGVtPkFjdGl2YXRpb25zcGVjPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5NZXNzYWdlTGlzdGVuZXIjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldE1lc3NhZ2VMaXN0ZW5lcigpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBNZXNzYWdlTGlzdGVuZXIgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2VsaXN0ZW5lciBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiA8IVtDREFUQVtbCisJICogICAgICAgICAgICAgVGhlIGVsZW1lbnQgbWVzc2FnZWxpc3RlbmVyLXR5cGUgc3BlY2lmaWVzIHRoZSBmdWxseQorCSAqICAgICAgICAgICAgIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUgb2YgYSBtZXNzYWdlCisJICogICAgICAgICAgICAgbGlzdGVuZXIgaW50ZXJmYWNlLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEV4YW1wbGU6CisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgCTxtZXNzYWdlbGlzdGVuZXItdHlwZT5qYXZheC5qbXMuTWVzc2FnZUxpc3RlbmVyCisJICogICAgICAgICAgICAgCTwvbWVzc2FnZWxpc3RlbmVyLXR5cGU+CisJICogICAgICAgICAgICAgCisJICogXV0+CisJICogCQkJQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWVzc2FnZWxpc3RlbmVyIFR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1lc3NhZ2VsaXN0ZW5lclR5cGUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRNZXNzYWdlTGlzdGVuZXJfTWVzc2FnZWxpc3RlbmVyVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRNZXNzYWdlbGlzdGVuZXJUeXBlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5NZXNzYWdlTGlzdGVuZXIjZ2V0TWVzc2FnZWxpc3RlbmVyVHlwZSA8ZW0+TWVzc2FnZWxpc3RlbmVyIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2VsaXN0ZW5lciBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRNZXNzYWdlbGlzdGVuZXJUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNZXNzYWdlbGlzdGVuZXJUeXBlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uc3BlYzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbnNwZWM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbnNwZWM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldEFjdGl2YXRpb25zcGVjKEFjdGl2YXRpb25TcGVjKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRNZXNzYWdlTGlzdGVuZXJfQWN0aXZhdGlvbnNwZWMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBY3RpdmF0aW9uU3BlYyBnZXRBY3RpdmF0aW9uc3BlYygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTWVzc2FnZUxpc3RlbmVyI2dldEFjdGl2YXRpb25zcGVjIDxlbT5BY3RpdmF0aW9uc3BlYzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbnNwZWM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldEFjdGl2YXRpb25zcGVjKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBY3RpdmF0aW9uc3BlYyhBY3RpdmF0aW9uU3BlYyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElkKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0TWVzc2FnZUxpc3RlbmVyX0lkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5NZXNzYWdlTGlzdGVuZXIjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gTWVzc2FnZUxpc3RlbmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9PdXRib3VuZFJlc291cmNlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmNlNjcyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDI1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2E7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgb3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQKKyAqICAgICAgICAgYW4gb3V0Ym91bmQgcmVzb3VyY2UgYWRhcHRlci4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIGZ1bGx5CisgKiAgICAgICAgIHF1YWxpZmllZCBuYW1lcyBvZiBjbGFzc2VzL2ludGVyZmFjZXMgcmVxdWlyZWQgYXMgcGFydCBvZgorICogICAgICAgICB0aGUgY29ubmVjdG9yIGFyY2hpdGVjdHVyZSBzcGVjaWZpZWQgY29udHJhY3RzIGZvcgorICogICAgICAgICBjb25uZWN0aW9uIG1hbmFnZW1lbnQsIGxldmVsIG9mIHRyYW5zYWN0aW9uIHN1cHBvcnQKKyAqICAgICAgICAgcHJvdmlkZWQsIG9uZSBvciBtb3JlIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgc3VwcG9ydGVkCisgKiAgICAgICAgIGFuZCBhZGRpdGlvbmFsIHJlcXVpcmVkIHNlY3VyaXR5IHBlcm1pc3Npb25zLgorICogICAgICAgICAKKyAqICAgICAgICAgSWYgYW55IG9mIHRoZSBvdXRib3VuZCByZXNvdXJjZSBhZGFwdGVyIGVsZW1lbnRzICh0cmFuc2FjdGlvbi1zdXBwb3J0LAorICogICAgICAgICBhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20sIHJlYXV0aGVudGljYXRpb24tc3VwcG9ydCkgaXMgc3BlY2lmaWVkIHRocm91Z2gKKyAqICAgICAgICAgdGhpcyBlbGVtZW50IG9yIG1ldGFkYXRhIGFubm90YXRpb25zLCBhbmQgbm8gIGNvbm5lY3Rpb24tZGVmaW5pdGlvbiBpcyAKKyAqICAgICAgICAgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdGhpcyBlbGVtZW50IG9yIHRocm91Z2ggYW5ub3RhdGlvbnMsIHRoZSAKKyAqICAgICAgICAgYXBwbGljYXRpb24gc2VydmVyIG11c3QgY29uc2lkZXIgdGhpcyBhbiBlcnJvciBhbmQgZmFpbCBkZXBsb3ltZW50LiAKKyAqICAgICAgICAgCisgKiAgICAgICAgIElmIHRoZXJlIGlzIG5vIGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBzcGVjaWZpZWQgYXMgcGFydCBvZgorICogICAgICAgICB0aGlzIGVsZW1lbnQgb3IgbWV0YWRhdGEgYW5ub3RhdGlvbnMsIHRoZW4gdGhlIHJlc291cmNlIGFkYXB0ZXIgZG9lcyAKKyAqICAgICAgICAgbm90IHN1cHBvcnQgYW55IHN0YW5kYXJkIHNlY3VyaXR5IGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbXMgYXMgCisgKiAgICAgICAgIHBhcnQgb2Ygc2VjdXJpdHkgY29udHJhY3QuIFRoZSBhcHBsaWNhdGlvbiBzZXJ2ZXIgaWdub3JlcyB0aGUgc2VjdXJpdHkgCisgKiAgICAgICAgIHBhcnQgb2YgdGhlIHN5c3RlbSBjb250cmFjdHMgaW4gdGhpcyBjYXNlLgorICogICAgICAgICAKKyAqICAgICAgICAgSWYgdGhlcmUgaXMgbm8gdHJhbnNhY3Rpb24tc3VwcG9ydCBzcGVjaWZpZWQgYXMgcGFydCBvZiB0aGlzIGVsZW1lbnQgCisgKiAgICAgICAgIG9yIG1ldGFkYXRhIGFubm90YXRpb24sIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHNlcnZlciBtdXN0IGNvbnNpZGVyIHRoYXQgCisgKiAgICAgICAgIHRoZSByZXNvdXJjZSBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgZWl0aGVyIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGxvY2FsIAorICogICAgICAgICBvciBKVEEgdHJhbnNhY3Rpb25zIGFuZCBtdXN0IGNvbnNpZGVyIHRoZSB0cmFuc2FjdGlvbiBzdXBwb3J0IGFzIAorICogICAgICAgICBOb1RyYW5zYWN0aW9uLiBOb3RlIHRoYXQgcmVzb3VyY2UgYWRhcHRlcnMgbWF5IHNwZWNpZnkgdGhlIGxldmVsIG9mIAorICogICAgICAgICB0cmFuc2FjdGlvbiBzdXBwb3J0IHRvIGJlIHVzZWQgYXQgcnVudGltZSBmb3IgYSBNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnkgCisgKiAgICAgICAgIHRocm91Z2ggdGhlIFRyYW5zYWN0aW9uU3VwcG9ydCBpbnRlcmZhY2UuCisgKiAgICAgICAgIAorICogICAgICAgICBJZiB0aGVyZSBpcyBubyByZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQgc3BlY2lmaWVkIGFzIHBhcnQgb2YKKyAqICAgICAgICAgdGhpcyBlbGVtZW50IG9yIG1ldGFkYXRhIGFubm90YXRpb24sIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHNlcnZlciBtdXN0IGNvbnNpZGVyIAorICogICAgICAgICB0aGF0IHRoZSByZXNvdXJjZSBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgcmUtYXV0aGVudGljYXRpb24gb2YgCisgKiAgICAgICAgIE1hbmFnZWRDb25uZWN0aW9ucy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIENvbm5lY3RvciAxLjYKKyAqICAgICAgIAorICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldENvbm5lY3Rpb25EZWZpbml0aW9uIDxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldFRyYW5zYWN0aW9uU3VwcG9ydCA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20gPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKQorICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkRlZmluaXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PENvbm5lY3Rpb25EZWZpbml0aW9uPiBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gU3VwcG9ydDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydFR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydFR5cGUKKwkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uU3VwcG9ydCgpCisJICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblN1cHBvcnQoKQorCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUcmFuc2FjdGlvblN1cHBvcnRUeXBlIGdldFRyYW5zYWN0aW9uU3VwcG9ydCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0IDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydFR5cGUKKwkgKiBAc2VlICNpc1NldFRyYW5zYWN0aW9uU3VwcG9ydCgpCisJICogQHNlZSAjdW5zZXRUcmFuc2FjdGlvblN1cHBvcnQoKQorCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VHJhbnNhY3Rpb25TdXBwb3J0KFRyYW5zYWN0aW9uU3VwcG9ydFR5cGUgdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRUcmFuc2FjdGlvblN1cHBvcnQgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKKwkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQorCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRUeXBlKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHVuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldFRyYW5zYWN0aW9uU3VwcG9ydCA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIEBzZWUgI3Vuc2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkKKwkgKiBAc2VlICNnZXRUcmFuc2FjdGlvblN1cHBvcnQoKQorCSAqIEBzZWUgI3NldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRUeXBlKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxBdXRoZW50aWNhdGlvbk1lY2hhbmlzbT4gZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIGVsZW1lbnQgcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IHNwZWNpZmllcworCSAqICAgICAgICAgICAgIHdoZXRoZXIgdGhlIHJlc291cmNlIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMKKwkgKiAgICAgICAgICAgICByZS1hdXRoZW50aWNhdGlvbiBvZiBleGlzdGluZyBNYW5hZ2VkLSBDb25uZWN0aW9uCisJICogICAgICAgICAgICAgaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGZvciB0aGUKKwkgKiAgICAgICAgICAgICByZXNvdXJjZSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGFuZCBub3QgZm9yIHRoZQorCSAqICAgICAgICAgICAgIHVuZGVybHlpbmcgRUlTIGluc3RhbmNlLiBUaGlzIGVsZW1lbnQgbXVzdCBoYXZlCisJICogICAgICAgICAgICAgZWl0aGVyIGEgInRydWUiIG9yICJmYWxzZSIgdmFsdWUuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgQ29ubmVjdG9yIDEuNgorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKKwkgKiBAc2VlICN1bnNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KCkKKwkgKiBAc2VlICNzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydChib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQorCSAqIEBzZWUgI3Vuc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQorCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0IDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQorCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQorCSAqIEBzZWUgI3NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0IDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIEBzZWUgI3Vuc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQorCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQorCSAqIEBzZWUgI3NldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNTZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJZChTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0lkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBPdXRib3VuZFJlc291cmNlQWRhcHRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvUmVxdWlyZWRDb25maWdQcm9wZXJ0eS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvUmVxdWlyZWRDb25maWdQcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyM2U2OTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5LmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiA8IVtDREFUQVtbCisgKiAgICAgICAgIFRoZSByZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIGNvbnRhaW5zIGEgZGVjbGFyYXRpb24KKyAqICAgICAgICAgb2YgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB1c2VkIGZvciBzcGVjaWZ5aW5nIGEKKyAqICAgICAgICAgcmVxdWlyZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBuYW1lLiBJdCBpcyB1c2VkCisgKiAgICAgICAgIGJ5IHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSBlbGVtZW50cy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFVzYWdlIG9mIHRoaXMgdHlwZSBpcyBkZXByZWNhdGVkIGZyb20gQ29ubmVjdG9ycyAxLjYgc3BlY2lmaWNhdGlvbi4gCisgKiAgICAgICAgIFJlZmVyIHRvIHJlcXVpcmVkLWNvbmZpZy1wcm9wZXJ0eSBlbGVtZW50IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICogICAgICAgICAKKyAqICAgICAgICAgRXhhbXBsZToKKyAqICAgICAgICAgCisgKiAgICAgICAgIDxyZXF1aXJlZC1jb25maWctcHJvcGVydHk+CisgKiAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5EZXN0aW5hdGlvbjwvY29uZmlnLXByb3BlcnR5LW5hbWU+CisgKiAgICAgICAgIDwvcmVxdWlyZWQtY29uZmlnLXByb3BlcnR5PgorICogICAgICAgICAKKyAqIF1dPgorICogCQlAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eSNnZXRDb25maWdQcm9wZXJ0eU5hbWUgPGVtPkNvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5I2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5KCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlcXVpcmVkQ29uZmlnUHJvcGVydHkgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRDb25maWdQcm9wZXJ0eU5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRDb25maWdQcm9wZXJ0eU5hbWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHkjZ2V0Q29uZmlnUHJvcGVydHlOYW1lIDxlbT5Db25maWcgUHJvcGVydHkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5IE5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q29uZmlnUHJvcGVydHlOYW1lKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElkKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eV9JZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRJZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9SZXNvdXJjZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL1Jlc291cmNlQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNWIwMmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9SZXNvdXJjZUFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2E7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgcmVzb3VyY2VhZGFwdGVyVHlwZSBzcGVjaWZpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiAgICAgICAgIHJlc291cmNlIGFkYXB0ZXIuIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyBmdWxseSBxdWFsaWZpZWQKKyAqICAgICAgICAgcmVzb3VyY2UgYWRhcHRlciBKYXZhIGNsYXNzIG5hbWUsIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcywKKyAqICAgICAgICAgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZQorICogICAgICAgICBhZGFwdGVyIGxpYnJhcnkgYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlCisgKiAgICAgICAgIG91dGJvdW5kLXJlc291cmNlYWRhcHRlciBhbmQgaW5ib3VuZC1yZXNvdXJjZWFkYXB0ZXIKKyAqICAgICAgICAgZWxlbWVudHMsIGFuZCBhbiBvcHRpb25hbCBzZXQgb2YgYWRtaW5pc3RlcmVkIG9iamVjdHMuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0UmVzb3VyY2VhZGFwdGVyQ2xhc3MgPGVtPlJlc291cmNlYWRhcHRlciBDbGFzczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldENvbmZpZ1Byb3BlcnR5IDxlbT5Db25maWcgUHJvcGVydHk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRPdXRib3VuZFJlc291cmNlYWRhcHRlciA8ZW0+T3V0Ym91bmQgUmVzb3VyY2VhZGFwdGVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0SW5ib3VuZFJlc291cmNlYWRhcHRlciA8ZW0+SW5ib3VuZCBSZXNvdXJjZWFkYXB0ZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRBZG1pbm9iamVjdCA8ZW0+QWRtaW5vYmplY3Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRTZWN1cml0eVBlcm1pc3Npb24gPGVtPlNlY3VyaXR5IFBlcm1pc3Npb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0UmVzb3VyY2VBZGFwdGVyKCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlQWRhcHRlciBleHRlbmRzIEphdmFFRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2VhZGFwdGVyIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgZWxlbWVudCByZXNvdXJjZWFkYXB0ZXItY2xhc3Mgc3BlY2lmaWVzIHRoZQorCSAqICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMKKwkgKiAgICAgICAgICAgICB0aGUgamF2YXgucmVzb3VyY2Uuc3BpLlJlc291cmNlQWRhcHRlcgorCSAqICAgICAgICAgICAgIGludGVyZmFjZS4gVGhpcyBKYXZhIGNsYXNzIGlzIHByb3ZpZGVkIGFzIHBhcnQgb2YKKwkgKiAgICAgICAgICAgICByZXNvdXJjZSBhZGFwdGVyJ3MgaW1wbGVtZW50YXRpb24gb2YgY29ubmVjdG9yCisJICogICAgICAgICAgICAgYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBjb250cmFjdHMuIFRoZSBpbXBsZW1lbnRhdGlvbgorCSAqICAgICAgICAgICAgIG9mIHRoaXMgY2xhc3MgaXMgcmVxdWlyZWQgdG8gYmUgYSBKYXZhQmVhbi4KKwkgKiAKKwkgKiAJCQlAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42ICAgICAgICAgICAgCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZWFkYXB0ZXIgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFJlc291cmNlYWRhcHRlckNsYXNzKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0UmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlYWRhcHRlckNsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFJlc291cmNlYWRhcHRlckNsYXNzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0UmVzb3VyY2VhZGFwdGVyQ2xhc3MgPGVtPlJlc291cmNlYWRhcHRlciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2VhZGFwdGVyIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRSZXNvdXJjZWFkYXB0ZXJDbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVzb3VyY2VhZGFwdGVyQ2xhc3MoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxDb25maWdQcm9wZXJ0eT4gZ2V0Q29uZmlnUHJvcGVydHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dGJvdW5kIFJlc291cmNlYWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2VhZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGJvdW5kIFJlc291cmNlYWRhcHRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0T3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlYWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIGdldE91dGJvdW5kUmVzb3VyY2VhZGFwdGVyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0T3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIgPGVtPk91dGJvdW5kIFJlc291cmNlYWRhcHRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2VhZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRPdXRib3VuZFJlc291cmNlYWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0T3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5ib3VuZCBSZXNvdXJjZWFkYXB0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluYm91bmQgUmVzb3VyY2VhZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluYm91bmQgUmVzb3VyY2VhZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRJbmJvdW5kUmVzb3VyY2VhZGFwdGVyKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VhZGFwdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSW5ib3VuZFJlc291cmNlQWRhcHRlciBnZXRJbmJvdW5kUmVzb3VyY2VhZGFwdGVyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0SW5ib3VuZFJlc291cmNlYWRhcHRlciA8ZW0+SW5ib3VuZCBSZXNvdXJjZWFkYXB0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluYm91bmQgUmVzb3VyY2VhZGFwdGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRJbmJvdW5kUmVzb3VyY2VhZGFwdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbmJvdW5kUmVzb3VyY2VhZGFwdGVyKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRtaW5vYmplY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BZG1pbk9iamVjdH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZG1pbm9iamVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkbWlub2JqZWN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRSZXNvdXJjZUFkYXB0ZXJfQWRtaW5vYmplY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PEFkbWluT2JqZWN0PiBnZXRBZG1pbm9iamVjdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUGVybWlzc2lvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN1cml0eSBQZXJtaXNzaW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdXJpdHkgUGVybWlzc2lvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8U2VjdXJpdHlQZXJtaXNzaW9uPiBnZXRTZWN1cml0eVBlcm1pc3Npb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SWQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZSNnZXRSZXNvdXJjZUFkYXB0ZXJfSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0SWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBSZXNvdXJjZUFkYXB0ZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL1NlY3VyaXR5UGVybWlzc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvU2VjdXJpdHlQZXJtaXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2NTJhMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL1NlY3VyaXR5UGVybWlzc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IFBlcm1pc3Npb248L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgc2VjdXJpdHktcGVybWlzc2lvblR5cGUgc3BlY2lmaWVzIGEgc2VjdXJpdHkKKyAqICAgICAgICAgcGVybWlzc2lvbiB0aGF0IGlzIHJlcXVpcmVkIGJ5IHRoZSByZXNvdXJjZSBhZGFwdGVyIGNvZGUuCisgKiAgICAgICAgIAorICogICAgICAgICBUaGUgc2VjdXJpdHkgcGVybWlzc2lvbiBsaXN0ZWQgaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICogICAgICAgICBhcmUgb25lcyB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSB0aG9zZSByZXF1aXJlZCBieSB0aGUKKyAqICAgICAgICAgZGVmYXVsdCBwZXJtaXNzaW9uIHNldCBhcyBzcGVjaWZpZWQgaW4gdGhlIGNvbm5lY3RvcgorICogICAgICAgICBzcGVjaWZpY2F0aW9uLiBUaGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gY2FuIG1lbnRpb24gc3BlY2lmaWMKKyAqICAgICAgICAgcmVhc29uIHRoYXQgcmVzb3VyY2UgYWRhcHRlciByZXF1aXJlcyBhIGdpdmVuIHNlY3VyaXR5CisgKiAgICAgICAgIHBlcm1pc3Npb24uCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBDb25uZWN0b3IgMS42CisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb24jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb24jZ2V0U2VjdXJpdHlQZXJtaXNzaW9uU3BlYyA8ZW0+U2VjdXJpdHkgUGVybWlzc2lvbiBTcGVjPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb24jZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldFNlY3VyaXR5UGVybWlzc2lvbigpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBTZWN1cml0eVBlcm1pc3Npb24gZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN1cml0eSBQZXJtaXNzaW9uIFNwZWM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoZSBlbGVtZW50IHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYyBzcGVjaWZpZXMgYSBzZWN1cml0eQorCSAqICAgICAgICAgICAgIHBlcm1pc3Npb24gYmFzZWQgb24gdGhlIFNlY3VyaXR5IHBvbGljeSBmaWxlCisJICogICAgICAgICAgICAgc3ludGF4LiBSZWZlciB0byB0aGUgZm9sbG93aW5nIFVSTCBmb3IgU3VuJ3MKKwkgKiAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbgorCSAqICAgICAgICAgICAgIHNwZWNpZmljYXRpb246CisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvNi9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvc2VjdXJpdHkvUG9saWN5RmlsZXMuaHRtbAorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIENvbm5lY3RvciAxLjYKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3VyaXR5IFBlcm1pc3Npb24gU3BlYzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0U2VjdXJpdHlQZXJtaXNzaW9uU3BlYyhTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldFNlY3VyaXR5UGVybWlzc2lvbl9TZWN1cml0eVBlcm1pc3Npb25TcGVjKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFNlY3VyaXR5UGVybWlzc2lvblNwZWMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbiNnZXRTZWN1cml0eVBlcm1pc3Npb25TcGVjIDxlbT5TZWN1cml0eSBQZXJtaXNzaW9uIFNwZWM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlY3VyaXR5IFBlcm1pc3Npb24gU3BlYzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0U2VjdXJpdHlQZXJtaXNzaW9uU3BlYygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U2VjdXJpdHlQZXJtaXNzaW9uU3BlYyhTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJZChTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldFNlY3VyaXR5UGVybWlzc2lvbl9JZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRJZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOworCit9IC8vIFNlY3VyaXR5UGVybWlzc2lvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvVHJhbnNhY3Rpb25TdXBwb3J0VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvVHJhbnNhY3Rpb25TdXBwb3J0VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNjcxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9UcmFuc2FjdGlvblN1cHBvcnRUeXBlLmphdmEKQEAgLTAsMCArMSwyNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+VHJhbnNhY3Rpb24gU3VwcG9ydCBUeXBlPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKyAqIAorICogCisgKiAgICAgICAgIFRoZSB0cmFuc2FjdGlvbi1zdXBwb3J0VHlwZSBzcGVjaWZpZXMgdGhlIGxldmVsIG9mCisgKiAgICAgICAgIHRyYW5zYWN0aW9uIHN1cHBvcnQgcHJvdmlkZWQgYnkgdGhlIHJlc291cmNlIGFkYXB0ZXIuIEl0IGlzCisgKiAgICAgICAgIHVzZWQgYnkgdHJhbnNhY3Rpb24tc3VwcG9ydCBlbGVtZW50cy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogICAgICAgICAKKyAqICAgICAgICAgTm9UcmFuc2FjdGlvbgorICogICAgICAgICBMb2NhbFRyYW5zYWN0aW9uCisgKiAgICAgICAgIFhBVHJhbnNhY3Rpb24KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIENvbm5lY3RvciAxLjYKKyAqICAgICAgIAorICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlI2dldFRyYW5zYWN0aW9uU3VwcG9ydFR5cGUoKQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBUcmFuc2FjdGlvblN1cHBvcnRUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+Tm8gVHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9fVFJBTlNBQ1RJT05fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlOT19UUkFOU0FDVElPTigwLCAiTm9UcmFuc2FjdGlvbiIsICJOb1RyYW5zYWN0aW9uIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+TG9jYWwgVHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTE9DQUxfVFJBTlNBQ1RJT05fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlMT0NBTF9UUkFOU0FDVElPTigxLCAiTG9jYWxUcmFuc2FjdGlvbiIsICJMb2NhbFRyYW5zYWN0aW9uIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+WEEgVHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjWEFfVFJBTlNBQ1RJT05fVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlYQV9UUkFOU0FDVElPTigyLCAiWEFUcmFuc2FjdGlvbiIsICJYQVRyYW5zYWN0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tm8gVHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5vIFRyYW5zYWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PX1RSQU5TQUNUSU9OCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fVFJBTlNBQ1RJT05fVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+TG9jYWwgVHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxvY2FsIFRyYW5zYWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0xPQ0FMX1RSQU5TQUNUSU9OCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfVFJBTlNBQ1RJT05fVkFMVUUgPSAxOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+WEEgVHJhbnNhY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlhBIFRyYW5zYWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1hBX1RSQU5TQUNUSU9OCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWEFfVFJBTlNBQ1RJT05fVkFMVUUgPSAyOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFN1cHBvcnQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25TdXBwb3J0VHlwZVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBUcmFuc2FjdGlvblN1cHBvcnRUeXBlW10geworCQkJTk9fVFJBTlNBQ1RJT04sCisJCQlMT0NBTF9UUkFOU0FDVElPTiwKKwkJCVhBX1RSQU5TQUNUSU9OLAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFN1cHBvcnQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFRyYW5zYWN0aW9uU3VwcG9ydFR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gU3VwcG9ydCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25TdXBwb3J0VHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVRyYW5zYWN0aW9uU3VwcG9ydFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBTdXBwb3J0IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUcmFuc2FjdGlvblN1cHBvcnRUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJVHJhbnNhY3Rpb25TdXBwb3J0VHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gU3VwcG9ydCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25TdXBwb3J0VHlwZSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgTk9fVFJBTlNBQ1RJT05fVkFMVUU6IHJldHVybiBOT19UUkFOU0FDVElPTjsKKwkJCWNhc2UgTE9DQUxfVFJBTlNBQ1RJT05fVkFMVUU6IHJldHVybiBMT0NBTF9UUkFOU0FDVElPTjsKKwkJCWNhc2UgWEFfVFJBTlNBQ1RJT05fVkFMVUU6IHJldHVybiBYQV9UUkFOU0FDVElPTjsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgVHJhbnNhY3Rpb25TdXBwb3J0VHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9UcmFuc2FjdGlvblN1cHBvcnRUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25TcGVjSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uU3BlY0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjgxNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uU3BlY0ltcGwuamF2YQpAQCAtMCwwICsxLDMyMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWN0aXZhdGlvblNwZWM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3RpdmF0aW9uIFNwZWM8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQWN0aXZhdGlvblNwZWNJbXBsI2dldEFjdGl2YXRpb25zcGVjQ2xhc3MgPGVtPkFjdGl2YXRpb25zcGVjIENsYXNzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25TcGVjSW1wbCNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5IDxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydHk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQWN0aXZhdGlvblNwZWNJbXBsI2dldENvbmZpZ1Byb3BlcnR5IDxlbT5Db25maWcgUHJvcGVydHk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQWN0aXZhdGlvblNwZWNJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEFjdGl2YXRpb25TcGVjSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQWN0aXZhdGlvblNwZWMgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmF0aW9uc3BlY0NsYXNzKCkgPGVtPkFjdGl2YXRpb25zcGVjIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBY3RpdmF0aW9uc3BlY0NsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVkFUSU9OU1BFQ19DTEFTU19FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmF0aW9uc3BlY0NsYXNzKCkgPGVtPkFjdGl2YXRpb25zcGVjIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBY3RpdmF0aW9uc3BlY0NsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2YXRpb25zcGVjQ2xhc3MgPSBBQ1RJVkFUSU9OU1BFQ19DTEFTU19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKSA8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxSZXF1aXJlZENvbmZpZ1Byb3BlcnR5PiByZXF1aXJlZENvbmZpZ1Byb3BlcnR5OworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnUHJvcGVydHkoKSA8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8Q29uZmlnUHJvcGVydHk+IGNvbmZpZ1Byb3BlcnR5OworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWN0aXZhdGlvblNwZWNJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5BQ1RJVkFUSU9OX1NQRUM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRBY3RpdmF0aW9uc3BlY0NsYXNzKCkgeworCQlyZXR1cm4gYWN0aXZhdGlvbnNwZWNDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBY3RpdmF0aW9uc3BlY0NsYXNzKFN0cmluZyBuZXdBY3RpdmF0aW9uc3BlY0NsYXNzKSB7CisJCVN0cmluZyBvbGRBY3RpdmF0aW9uc3BlY0NsYXNzID0gYWN0aXZhdGlvbnNwZWNDbGFzczsKKwkJYWN0aXZhdGlvbnNwZWNDbGFzcyA9IG5ld0FjdGl2YXRpb25zcGVjQ2xhc3M7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19BQ1RJVkFUSU9OU1BFQ19DTEFTUywgb2xkQWN0aXZhdGlvbnNwZWNDbGFzcywgYWN0aXZhdGlvbnNwZWNDbGFzcykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PFJlcXVpcmVkQ29uZmlnUHJvcGVydHk+IGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKSB7CisJCWlmIChyZXF1aXJlZENvbmZpZ1Byb3BlcnR5ID09IG51bGwpIHsKKwkJCXJlcXVpcmVkQ29uZmlnUHJvcGVydHkgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UmVxdWlyZWRDb25maWdQcm9wZXJ0eT4oUmVxdWlyZWRDb25maWdQcm9wZXJ0eS5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX1JFUVVJUkVEX0NPTkZJR19QUk9QRVJUWSk7CisJCX0KKwkJcmV0dXJuIHJlcXVpcmVkQ29uZmlnUHJvcGVydHk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8Q29uZmlnUHJvcGVydHk+IGdldENvbmZpZ1Byb3BlcnR5KCkgeworCQlpZiAoY29uZmlnUHJvcGVydHkgPT0gbnVsbCkgeworCQkJY29uZmlnUHJvcGVydHkgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8Q29uZmlnUHJvcGVydHk+KENvbmZpZ1Byb3BlcnR5LmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fQ09ORklHX1BST1BFUlRZKTsKKwkJfQorCQlyZXR1cm4gY29uZmlnUHJvcGVydHk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgeworCQlTdHJpbmcgb2xkSWQgPSBpZDsKKwkJaWQgPSBuZXdJZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX0lELCBvbGRJZCwgaWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFk6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX0NPTkZJR19QUk9QRVJUWToKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbmZpZ1Byb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTlNQRUNfQ0xBU1M6CisJCQkJcmV0dXJuIGdldEFjdGl2YXRpb25zcGVjQ2xhc3MoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX1JFUVVJUkVEX0NPTkZJR19QUk9QRVJUWToKKwkJCQlyZXR1cm4gZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fQ09ORklHX1BST1BFUlRZOgorCQkJCXJldHVybiBnZXRDb25maWdQcm9wZXJ0eSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fSUQ6CisJCQkJcmV0dXJuIGdldElkKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05TUEVDX0NMQVNTOgorCQkJCXNldEFjdGl2YXRpb25zcGVjQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fUkVRVUlSRURfQ09ORklHX1BST1BFUlRZOgorCQkJCWdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKS5jbGVhcigpOworCQkJCWdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJlcXVpcmVkQ29uZmlnUHJvcGVydHk+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19DT05GSUdfUFJPUEVSVFk6CisJCQkJZ2V0Q29uZmlnUHJvcGVydHkoKS5jbGVhcigpOworCQkJCWdldENvbmZpZ1Byb3BlcnR5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb25maWdQcm9wZXJ0eT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX0lEOgorCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19BQ1RJVkFUSU9OU1BFQ19DTEFTUzoKKwkJCQlzZXRBY3RpdmF0aW9uc3BlY0NsYXNzKEFDVElWQVRJT05TUEVDX0NMQVNTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFk6CisJCQkJZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eSgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fQ09ORklHX1BST1BFUlRZOgorCQkJCWdldENvbmZpZ1Byb3BlcnR5KCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19JRDoKKwkJCQlzZXRJZChJRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19BQ1RJVkFUSU9OU1BFQ19DTEFTUzoKKwkJCQlyZXR1cm4gQUNUSVZBVElPTlNQRUNfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2YXRpb25zcGVjQ2xhc3MgIT0gbnVsbCA6ICFBQ1RJVkFUSU9OU1BFQ19DTEFTU19FREVGQVVMVC5lcXVhbHMoYWN0aXZhdGlvbnNwZWNDbGFzcyk7CisJCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFk6CisJCQkJcmV0dXJuIHJlcXVpcmVkQ29uZmlnUHJvcGVydHkgIT0gbnVsbCAmJiAhcmVxdWlyZWRDb25maWdQcm9wZXJ0eS5pc0VtcHR5KCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19DT05GSUdfUFJPUEVSVFk6CisJCQkJcmV0dXJuIGNvbmZpZ1Byb3BlcnR5ICE9IG51bGwgJiYgIWNvbmZpZ1Byb3BlcnR5LmlzRW1wdHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX0lEOgorCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoYWN0aXZhdGlvbnNwZWNDbGFzczogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChhY3RpdmF0aW9uc3BlY0NsYXNzKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0FjdGl2YXRpb25TcGVjSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9BZG1pbk9iamVjdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvQWRtaW5PYmplY3RJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyZTFhMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvQWRtaW5PYmplY3RJbXBsLmphdmEKQEAgLTAsMCArMSwzNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFkbWluT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFkbWluIE9iamVjdDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5BZG1pbk9iamVjdEltcGwjZ2V0QWRtaW5vYmplY3RJbnRlcmZhY2UgPGVtPkFkbWlub2JqZWN0IEludGVyZmFjZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5BZG1pbk9iamVjdEltcGwjZ2V0QWRtaW5vYmplY3RDbGFzcyA8ZW0+QWRtaW5vYmplY3QgQ2xhc3M8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQWRtaW5PYmplY3RJbXBsI2dldENvbmZpZ1Byb3BlcnR5IDxlbT5Db25maWcgUHJvcGVydHk8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQWRtaW5PYmplY3RJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEFkbWluT2JqZWN0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQWRtaW5PYmplY3QgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZG1pbm9iamVjdEludGVyZmFjZSgpIDxlbT5BZG1pbm9iamVjdCBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFkbWlub2JqZWN0SW50ZXJmYWNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBRE1JTk9CSkVDVF9JTlRFUkZBQ0VfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRtaW5vYmplY3RJbnRlcmZhY2UoKSA8ZW0+QWRtaW5vYmplY3QgSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBZG1pbm9iamVjdEludGVyZmFjZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBhZG1pbm9iamVjdEludGVyZmFjZSA9IEFETUlOT0JKRUNUX0lOVEVSRkFDRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZG1pbm9iamVjdENsYXNzKCkgPGVtPkFkbWlub2JqZWN0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBZG1pbm9iamVjdENsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBRE1JTk9CSkVDVF9DTEFTU19FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZG1pbm9iamVjdENsYXNzKCkgPGVtPkFkbWlub2JqZWN0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBZG1pbm9iamVjdENsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGFkbWlub2JqZWN0Q2xhc3MgPSBBRE1JTk9CSkVDVF9DTEFTU19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmZpZ1Byb3BlcnR5KCkgPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb25maWdQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PENvbmZpZ1Byb3BlcnR5PiBjb25maWdQcm9wZXJ0eTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEFkbWluT2JqZWN0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuQURNSU5fT0JKRUNUOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QWRtaW5vYmplY3RJbnRlcmZhY2UoKSB7CisJCXJldHVybiBhZG1pbm9iamVjdEludGVyZmFjZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBZG1pbm9iamVjdEludGVyZmFjZShTdHJpbmcgbmV3QWRtaW5vYmplY3RJbnRlcmZhY2UpIHsKKwkJU3RyaW5nIG9sZEFkbWlub2JqZWN0SW50ZXJmYWNlID0gYWRtaW5vYmplY3RJbnRlcmZhY2U7CisJCWFkbWlub2JqZWN0SW50ZXJmYWNlID0gbmV3QWRtaW5vYmplY3RJbnRlcmZhY2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTk9CSkVDVF9JTlRFUkZBQ0UsIG9sZEFkbWlub2JqZWN0SW50ZXJmYWNlLCBhZG1pbm9iamVjdEludGVyZmFjZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QWRtaW5vYmplY3RDbGFzcygpIHsKKwkJcmV0dXJuIGFkbWlub2JqZWN0Q2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWRtaW5vYmplY3RDbGFzcyhTdHJpbmcgbmV3QWRtaW5vYmplY3RDbGFzcykgeworCQlTdHJpbmcgb2xkQWRtaW5vYmplY3RDbGFzcyA9IGFkbWlub2JqZWN0Q2xhc3M7CisJCWFkbWlub2JqZWN0Q2xhc3MgPSBuZXdBZG1pbm9iamVjdENsYXNzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5PQkpFQ1RfQ0xBU1MsIG9sZEFkbWlub2JqZWN0Q2xhc3MsIGFkbWlub2JqZWN0Q2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxDb25maWdQcm9wZXJ0eT4gZ2V0Q29uZmlnUHJvcGVydHkoKSB7CisJCWlmIChjb25maWdQcm9wZXJ0eSA9PSBudWxsKSB7CisJCQljb25maWdQcm9wZXJ0eSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxDb25maWdQcm9wZXJ0eT4oQ29uZmlnUHJvcGVydHkuY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19DT05GSUdfUFJPUEVSVFkpOworCQl9CisJCXJldHVybiBjb25maWdQcm9wZXJ0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7CisJCVN0cmluZyBvbGRJZCA9IGlkOworCQlpZCA9IG5ld0lkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fSUQsIG9sZElkLCBpZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUWToKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbmZpZ1Byb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5PQkpFQ1RfSU5URVJGQUNFOgorCQkJCXJldHVybiBnZXRBZG1pbm9iamVjdEludGVyZmFjZSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5PQkpFQ1RfQ0xBU1M6CisJCQkJcmV0dXJuIGdldEFkbWlub2JqZWN0Q2xhc3MoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUWToKKwkJCQlyZXR1cm4gZ2V0Q29uZmlnUHJvcGVydHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0lEOgorCQkJCXJldHVybiBnZXRJZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTk9CSkVDVF9JTlRFUkZBQ0U6CisJCQkJc2V0QWRtaW5vYmplY3RJbnRlcmZhY2UoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5PQkpFQ1RfQ0xBU1M6CisJCQkJc2V0QWRtaW5vYmplY3RDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19DT05GSUdfUFJPUEVSVFk6CisJCQkJZ2V0Q29uZmlnUHJvcGVydHkoKS5jbGVhcigpOworCQkJCWdldENvbmZpZ1Byb3BlcnR5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb25maWdQcm9wZXJ0eT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0lEOgorCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTk9CSkVDVF9JTlRFUkZBQ0U6CisJCQkJc2V0QWRtaW5vYmplY3RJbnRlcmZhY2UoQURNSU5PQkpFQ1RfSU5URVJGQUNFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19BRE1JTk9CSkVDVF9DTEFTUzoKKwkJCQlzZXRBZG1pbm9iamVjdENsYXNzKEFETUlOT0JKRUNUX0NMQVNTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19DT05GSUdfUFJPUEVSVFk6CisJCQkJZ2V0Q29uZmlnUHJvcGVydHkoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0lEOgorCQkJCXNldElkKElEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOT0JKRUNUX0lOVEVSRkFDRToKKwkJCQlyZXR1cm4gQURNSU5PQkpFQ1RfSU5URVJGQUNFX0VERUZBVUxUID09IG51bGwgPyBhZG1pbm9iamVjdEludGVyZmFjZSAhPSBudWxsIDogIUFETUlOT0JKRUNUX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoYWRtaW5vYmplY3RJbnRlcmZhY2UpOworCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5PQkpFQ1RfQ0xBU1M6CisJCQkJcmV0dXJuIEFETUlOT0JKRUNUX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBhZG1pbm9iamVjdENsYXNzICE9IG51bGwgOiAhQURNSU5PQkpFQ1RfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGFkbWlub2JqZWN0Q2xhc3MpOworCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRZOgorCQkJCXJldHVybiBjb25maWdQcm9wZXJ0eSAhPSBudWxsICYmICFjb25maWdQcm9wZXJ0eS5pc0VtcHR5KCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQURNSU5fT0JKRUNUX19JRDoKKwkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGFkbWlub2JqZWN0SW50ZXJmYWNlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGFkbWlub2JqZWN0SW50ZXJmYWNlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBhZG1pbm9iamVjdENsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGFkbWlub2JqZWN0Q2xhc3MpOworCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGlkKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vQWRtaW5PYmplY3RJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWY3ZDBjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwuamF2YQpAQCAtMCwwICsxLDM3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ3JlZGVudGlhbEludGVyZmFjZVR5cGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQXV0aGVudGljYXRpb25NZWNoYW5pc21JbXBsI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQXV0aGVudGljYXRpb25NZWNoYW5pc21JbXBsI2dldENyZWRlbnRpYWxJbnRlcmZhY2UgPGVtPkNyZWRlbnRpYWwgSW50ZXJmYWNlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbjsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKSA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlID0gQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlZGVudGlhbEludGVyZmFjZSgpIDxlbT5DcmVkZW50aWFsIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q3JlZGVudGlhbEludGVyZmFjZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDcmVkZW50aWFsSW50ZXJmYWNlVHlwZSBDUkVERU5USUFMX0lOVEVSRkFDRV9FREVGQVVMVCA9IENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlLkpBVkFYX1JFU09VUkNFX1NQSV9TRUNVUklUWV9QQVNTV09SRF9DUkVERU5USUFMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlZGVudGlhbEludGVyZmFjZSgpIDxlbT5DcmVkZW50aWFsIEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q3JlZGVudGlhbEludGVyZmFjZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlIGNyZWRlbnRpYWxJbnRlcmZhY2UgPSBDUkVERU5USUFMX0lOVEVSRkFDRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ3JlZGVudGlhbCBJbnRlcmZhY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGNyZWRlbnRpYWxJbnRlcmZhY2VFU2V0OworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQXV0aGVudGljYXRpb25NZWNoYW5pc21JbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5BVVRIRU5USUNBVElPTl9NRUNIQU5JU007CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9uKCkgeworCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgeworCQkJZGVzY3JpcHRpb24gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT04pOworCQl9CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpIHsKKwkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoU3RyaW5nIG5ld0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSkgeworCQlTdHJpbmcgb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlID0gYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlOworCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgPSBuZXdBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRSwgb2xkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLCBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ3JlZGVudGlhbEludGVyZmFjZVR5cGUgZ2V0Q3JlZGVudGlhbEludGVyZmFjZSgpIHsKKwkJcmV0dXJuIGNyZWRlbnRpYWxJbnRlcmZhY2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3JlZGVudGlhbEludGVyZmFjZShDcmVkZW50aWFsSW50ZXJmYWNlVHlwZSBuZXdDcmVkZW50aWFsSW50ZXJmYWNlKSB7CisJCUNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlIG9sZENyZWRlbnRpYWxJbnRlcmZhY2UgPSBjcmVkZW50aWFsSW50ZXJmYWNlOworCQljcmVkZW50aWFsSW50ZXJmYWNlID0gbmV3Q3JlZGVudGlhbEludGVyZmFjZSA9PSBudWxsID8gQ1JFREVOVElBTF9JTlRFUkZBQ0VfRURFRkFVTFQgOiBuZXdDcmVkZW50aWFsSW50ZXJmYWNlOworCQlib29sZWFuIG9sZENyZWRlbnRpYWxJbnRlcmZhY2VFU2V0ID0gY3JlZGVudGlhbEludGVyZmFjZUVTZXQ7CisJCWNyZWRlbnRpYWxJbnRlcmZhY2VFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NSRURFTlRJQUxfSU5URVJGQUNFLCBvbGRDcmVkZW50aWFsSW50ZXJmYWNlLCBjcmVkZW50aWFsSW50ZXJmYWNlLCAhb2xkQ3JlZGVudGlhbEludGVyZmFjZUVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldENyZWRlbnRpYWxJbnRlcmZhY2UoKSB7CisJCUNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlIG9sZENyZWRlbnRpYWxJbnRlcmZhY2UgPSBjcmVkZW50aWFsSW50ZXJmYWNlOworCQlib29sZWFuIG9sZENyZWRlbnRpYWxJbnRlcmZhY2VFU2V0ID0gY3JlZGVudGlhbEludGVyZmFjZUVTZXQ7CisJCWNyZWRlbnRpYWxJbnRlcmZhY2UgPSBDUkVERU5USUFMX0lOVEVSRkFDRV9FREVGQVVMVDsKKwkJY3JlZGVudGlhbEludGVyZmFjZUVTZXQgPSBmYWxzZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0UsIG9sZENyZWRlbnRpYWxJbnRlcmZhY2UsIENSRURFTlRJQUxfSU5URVJGQUNFX0VERUZBVUxULCBvbGRDcmVkZW50aWFsSW50ZXJmYWNlRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0Q3JlZGVudGlhbEludGVyZmFjZSgpIHsKKwkJcmV0dXJuIGNyZWRlbnRpYWxJbnRlcmZhY2VFU2V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKKwkJU3RyaW5nIG9sZElkID0gaWQ7CisJCWlkID0gbmV3SWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19JRCwgb2xkSWQsIGlkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOworCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEU6CisJCQkJcmV0dXJuIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0U6CisJCQkJcmV0dXJuIGdldENyZWRlbnRpYWxJbnRlcmZhY2UoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0lEOgorCQkJCXJldHVybiBnZXRJZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTjoKKwkJCQlnZXREZXNjcmlwdGlvbigpLmNsZWFyKCk7CisJCQkJZ2V0RGVzY3JpcHRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEU6CisJCQkJc2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NSRURFTlRJQUxfSU5URVJGQUNFOgorCQkJCXNldENyZWRlbnRpYWxJbnRlcmZhY2UoKENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19JRDoKKwkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT046CisJCQkJZ2V0RGVzY3JpcHRpb24oKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFOgorCQkJCXNldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZShBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0U6CisJCQkJdW5zZXRDcmVkZW50aWFsSW50ZXJmYWNlKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fSUQ6CisJCQkJc2V0SWQoSURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIGRlc2NyaXB0aW9uICE9IG51bGwgJiYgIWRlc2NyaXB0aW9uLmlzRW1wdHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFOgorCQkJCXJldHVybiBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlICE9IG51bGwgOiAhQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEVfRURFRkFVTFQuZXF1YWxzKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSk7CisJCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19DUkVERU5USUFMX0lOVEVSRkFDRToKKwkJCQlyZXR1cm4gaXNTZXRDcmVkZW50aWFsSW50ZXJmYWNlKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19JRDoKKwkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNyZWRlbnRpYWxJbnRlcmZhY2U6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChjcmVkZW50aWFsSW50ZXJmYWNlRVNldCkgcmVzdWx0LmFwcGVuZChjcmVkZW50aWFsSW50ZXJmYWNlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25maWdQcm9wZXJ0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvQ29uZmlnUHJvcGVydHlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg5MzJiNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvQ29uZmlnUHJvcGVydHlJbXBsLmphdmEKQEAgLTAsMCArMSw2OTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5VHlwZVR5cGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbmZpZ1Byb3BlcnR5SW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29uZmlnUHJvcGVydHlJbXBsI2dldENvbmZpZ1Byb3BlcnR5TmFtZSA8ZW0+Q29uZmlnIFByb3BlcnR5IE5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29uZmlnUHJvcGVydHlJbXBsI2dldENvbmZpZ1Byb3BlcnR5VHlwZSA8ZW0+Q29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29uZmlnUHJvcGVydHlJbXBsI2dldENvbmZpZ1Byb3BlcnR5VmFsdWUgPGVtPkNvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25maWdQcm9wZXJ0eUltcGwjaXNDb25maWdQcm9wZXJ0eUlnbm9yZSA8ZW0+Q29uZmlnIFByb3BlcnR5IElnbm9yZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25maWdQcm9wZXJ0eUltcGwjaXNDb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXMgPGVtPkNvbmZpZyBQcm9wZXJ0eSBTdXBwb3J0cyBEeW5hbWljIFVwZGF0ZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29uZmlnUHJvcGVydHlJbXBsI2lzQ29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwgPGVtPkNvbmZpZyBQcm9wZXJ0eSBDb25maWRlbnRpYWw8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29uZmlnUHJvcGVydHlJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENvbmZpZ1Byb3BlcnR5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ29uZmlnUHJvcGVydHkgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmZpZ1Byb3BlcnR5TmFtZSgpIDxlbT5Db25maWcgUHJvcGVydHkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29uZmlnUHJvcGVydHlOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfUFJPUEVSVFlfTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25maWdQcm9wZXJ0eU5hbWUoKSA8ZW0+Q29uZmlnIFByb3BlcnR5IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBjb25maWdQcm9wZXJ0eU5hbWUgPSBDT05GSUdfUFJPUEVSVFlfTkFNRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25maWdQcm9wZXJ0eVR5cGUoKSA8ZW0+Q29uZmlnIFByb3BlcnR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb25maWdQcm9wZXJ0eVR5cGVUeXBlIENPTkZJR19QUk9QRVJUWV9UWVBFX0VERUZBVUxUID0gQ29uZmlnUHJvcGVydHlUeXBlVHlwZS5KQVZBX0xBTkdfQk9PTEVBTjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmZpZ1Byb3BlcnR5VHlwZSgpIDxlbT5Db25maWcgUHJvcGVydHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29uZmlnUHJvcGVydHlUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29uZmlnUHJvcGVydHlUeXBlVHlwZSBjb25maWdQcm9wZXJ0eVR5cGUgPSBDT05GSUdfUFJPUEVSVFlfVFlQRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29uZmlnIFByb3BlcnR5IFR5cGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGNvbmZpZ1Byb3BlcnR5VHlwZUVTZXQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnUHJvcGVydHlWYWx1ZSgpIDxlbT5Db25maWcgUHJvcGVydHkgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19QUk9QRVJUWV9WQUxVRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25maWdQcm9wZXJ0eVZhbHVlKCkgPGVtPkNvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29uZmlnUHJvcGVydHlWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBjb25maWdQcm9wZXJ0eVZhbHVlID0gQ09ORklHX1BST1BFUlRZX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uZmlnUHJvcGVydHlJZ25vcmUoKSA8ZW0+Q29uZmlnIFByb3BlcnR5IElnbm9yZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNDb25maWdQcm9wZXJ0eUlnbm9yZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENPTkZJR19QUk9QRVJUWV9JR05PUkVfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uZmlnUHJvcGVydHlJZ25vcmUoKSA8ZW0+Q29uZmlnIFByb3BlcnR5IElnbm9yZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNDb25maWdQcm9wZXJ0eUlnbm9yZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlnUHJvcGVydHlJZ25vcmUgPSBDT05GSUdfUFJPUEVSVFlfSUdOT1JFX0VERUZBVUxUOworCisJLyoqCisJICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDb25maWcgUHJvcGVydHkgSWdub3JlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maWdQcm9wZXJ0eUlnbm9yZUVTZXQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXMoKSA8ZW0+Q29uZmlnIFByb3BlcnR5IFN1cHBvcnRzIER5bmFtaWMgVXBkYXRlczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNDb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT05GSUdfUFJPUEVSVFlfU1VQUE9SVFNfRFlOQU1JQ19VUERBVEVTX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcygpIDxlbT5Db25maWcgUHJvcGVydHkgU3VwcG9ydHMgRHluYW1pYyBVcGRhdGVzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0NvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzID0gQ09ORklHX1BST1BFUlRZX1NVUFBPUlRTX0RZTkFNSUNfVVBEQVRFU19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29uZmlnIFByb3BlcnR5IFN1cHBvcnRzIER5bmFtaWMgVXBkYXRlcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzRVNldDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKCkgPGVtPkNvbmZpZyBQcm9wZXJ0eSBDb25maWRlbnRpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzQ29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT05GSUdfUFJPUEVSVFlfQ09ORklERU5USUFMX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKCkgPGVtPkNvbmZpZyBQcm9wZXJ0eSBDb25maWRlbnRpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzQ29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGNvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsID0gQ09ORklHX1BST1BFUlRZX0NPTkZJREVOVElBTF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29uZmlnIFByb3BlcnR5IENvbmZpZGVudGlhbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY29uZmlnUHJvcGVydHlDb25maWRlbnRpYWxFU2V0OworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29uZmlnUHJvcGVydHlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5DT05GSUdfUFJPUEVSVFk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9uKCkgeworCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgeworCQkJZGVzY3JpcHRpb24gPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT04pOworCQl9CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbmZpZ1Byb3BlcnR5TmFtZSgpIHsKKwkJcmV0dXJuIGNvbmZpZ1Byb3BlcnR5TmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb25maWdQcm9wZXJ0eU5hbWUoU3RyaW5nIG5ld0NvbmZpZ1Byb3BlcnR5TmFtZSkgeworCQlTdHJpbmcgb2xkQ29uZmlnUHJvcGVydHlOYW1lID0gY29uZmlnUHJvcGVydHlOYW1lOworCQljb25maWdQcm9wZXJ0eU5hbWUgPSBuZXdDb25maWdQcm9wZXJ0eU5hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfTkFNRSwgb2xkQ29uZmlnUHJvcGVydHlOYW1lLCBjb25maWdQcm9wZXJ0eU5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29uZmlnUHJvcGVydHlUeXBlVHlwZSBnZXRDb25maWdQcm9wZXJ0eVR5cGUoKSB7CisJCXJldHVybiBjb25maWdQcm9wZXJ0eVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29uZmlnUHJvcGVydHlUeXBlKENvbmZpZ1Byb3BlcnR5VHlwZVR5cGUgbmV3Q29uZmlnUHJvcGVydHlUeXBlKSB7CisJCUNvbmZpZ1Byb3BlcnR5VHlwZVR5cGUgb2xkQ29uZmlnUHJvcGVydHlUeXBlID0gY29uZmlnUHJvcGVydHlUeXBlOworCQljb25maWdQcm9wZXJ0eVR5cGUgPSBuZXdDb25maWdQcm9wZXJ0eVR5cGUgPT0gbnVsbCA/IENPTkZJR19QUk9QRVJUWV9UWVBFX0VERUZBVUxUIDogbmV3Q29uZmlnUHJvcGVydHlUeXBlOworCQlib29sZWFuIG9sZENvbmZpZ1Byb3BlcnR5VHlwZUVTZXQgPSBjb25maWdQcm9wZXJ0eVR5cGVFU2V0OworCQljb25maWdQcm9wZXJ0eVR5cGVFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9UWVBFLCBvbGRDb25maWdQcm9wZXJ0eVR5cGUsIGNvbmZpZ1Byb3BlcnR5VHlwZSwgIW9sZENvbmZpZ1Byb3BlcnR5VHlwZUVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldENvbmZpZ1Byb3BlcnR5VHlwZSgpIHsKKwkJQ29uZmlnUHJvcGVydHlUeXBlVHlwZSBvbGRDb25maWdQcm9wZXJ0eVR5cGUgPSBjb25maWdQcm9wZXJ0eVR5cGU7CisJCWJvb2xlYW4gb2xkQ29uZmlnUHJvcGVydHlUeXBlRVNldCA9IGNvbmZpZ1Byb3BlcnR5VHlwZUVTZXQ7CisJCWNvbmZpZ1Byb3BlcnR5VHlwZSA9IENPTkZJR19QUk9QRVJUWV9UWVBFX0VERUZBVUxUOworCQljb25maWdQcm9wZXJ0eVR5cGVFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9UWVBFLCBvbGRDb25maWdQcm9wZXJ0eVR5cGUsIENPTkZJR19QUk9QRVJUWV9UWVBFX0VERUZBVUxULCBvbGRDb25maWdQcm9wZXJ0eVR5cGVFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZXRDb25maWdQcm9wZXJ0eVR5cGUoKSB7CisJCXJldHVybiBjb25maWdQcm9wZXJ0eVR5cGVFU2V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnUHJvcGVydHlWYWx1ZSgpIHsKKwkJcmV0dXJuIGNvbmZpZ1Byb3BlcnR5VmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29uZmlnUHJvcGVydHlWYWx1ZShTdHJpbmcgbmV3Q29uZmlnUHJvcGVydHlWYWx1ZSkgeworCQlTdHJpbmcgb2xkQ29uZmlnUHJvcGVydHlWYWx1ZSA9IGNvbmZpZ1Byb3BlcnR5VmFsdWU7CisJCWNvbmZpZ1Byb3BlcnR5VmFsdWUgPSBuZXdDb25maWdQcm9wZXJ0eVZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX1ZBTFVFLCBvbGRDb25maWdQcm9wZXJ0eVZhbHVlLCBjb25maWdQcm9wZXJ0eVZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDb25maWdQcm9wZXJ0eUlnbm9yZSgpIHsKKwkJcmV0dXJuIGNvbmZpZ1Byb3BlcnR5SWdub3JlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbmZpZ1Byb3BlcnR5SWdub3JlKGJvb2xlYW4gbmV3Q29uZmlnUHJvcGVydHlJZ25vcmUpIHsKKwkJYm9vbGVhbiBvbGRDb25maWdQcm9wZXJ0eUlnbm9yZSA9IGNvbmZpZ1Byb3BlcnR5SWdub3JlOworCQljb25maWdQcm9wZXJ0eUlnbm9yZSA9IG5ld0NvbmZpZ1Byb3BlcnR5SWdub3JlOworCQlib29sZWFuIG9sZENvbmZpZ1Byb3BlcnR5SWdub3JlRVNldCA9IGNvbmZpZ1Byb3BlcnR5SWdub3JlRVNldDsKKwkJY29uZmlnUHJvcGVydHlJZ25vcmVFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9JR05PUkUsIG9sZENvbmZpZ1Byb3BlcnR5SWdub3JlLCBjb25maWdQcm9wZXJ0eUlnbm9yZSwgIW9sZENvbmZpZ1Byb3BlcnR5SWdub3JlRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHVuc2V0Q29uZmlnUHJvcGVydHlJZ25vcmUoKSB7CisJCWJvb2xlYW4gb2xkQ29uZmlnUHJvcGVydHlJZ25vcmUgPSBjb25maWdQcm9wZXJ0eUlnbm9yZTsKKwkJYm9vbGVhbiBvbGRDb25maWdQcm9wZXJ0eUlnbm9yZUVTZXQgPSBjb25maWdQcm9wZXJ0eUlnbm9yZUVTZXQ7CisJCWNvbmZpZ1Byb3BlcnR5SWdub3JlID0gQ09ORklHX1BST1BFUlRZX0lHTk9SRV9FREVGQVVMVDsKKwkJY29uZmlnUHJvcGVydHlJZ25vcmVFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9JR05PUkUsIG9sZENvbmZpZ1Byb3BlcnR5SWdub3JlLCBDT05GSUdfUFJPUEVSVFlfSUdOT1JFX0VERUZBVUxULCBvbGRDb25maWdQcm9wZXJ0eUlnbm9yZUVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldENvbmZpZ1Byb3BlcnR5SWdub3JlKCkgeworCQlyZXR1cm4gY29uZmlnUHJvcGVydHlJZ25vcmVFU2V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzKCkgeworCQlyZXR1cm4gY29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcyhib29sZWFuIG5ld0NvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcykgeworCQlib29sZWFuIG9sZENvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcyA9IGNvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlczsKKwkJY29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzID0gbmV3Q29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzOworCQlib29sZWFuIG9sZENvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlc0VTZXQgPSBjb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXNFU2V0OworCQljb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXNFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9TVVBQT1JUU19EWU5BTUlDX1VQREFURVMsIG9sZENvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcywgY29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzLCAhb2xkQ29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHVuc2V0Q29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzKCkgeworCQlib29sZWFuIG9sZENvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcyA9IGNvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlczsKKwkJYm9vbGVhbiBvbGRDb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXNFU2V0ID0gY29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzRVNldDsKKwkJY29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzID0gQ09ORklHX1BST1BFUlRZX1NVUFBPUlRTX0RZTkFNSUNfVVBEQVRFU19FREVGQVVMVDsKKwkJY29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzRVNldCA9IGZhbHNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfU1VQUE9SVFNfRFlOQU1JQ19VUERBVEVTLCBvbGRDb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXMsIENPTkZJR19QUk9QRVJUWV9TVVBQT1JUU19EWU5BTUlDX1VQREFURVNfRURFRkFVTFQsIG9sZENvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlc0VTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldENvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcygpIHsKKwkJcmV0dXJuIGNvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlc0VTZXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbCgpIHsKKwkJcmV0dXJuIGNvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKGJvb2xlYW4gbmV3Q29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwpIHsKKwkJYm9vbGVhbiBvbGRDb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbCA9IGNvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsOworCQljb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbCA9IG5ld0NvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsOworCQlib29sZWFuIG9sZENvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsRVNldCA9IGNvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsRVNldDsKKwkJY29uZmlnUHJvcGVydHlDb25maWRlbnRpYWxFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9DT05GSURFTlRJQUwsIG9sZENvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsLCBjb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbCwgIW9sZENvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHVuc2V0Q29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwoKSB7CisJCWJvb2xlYW4gb2xkQ29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwgPSBjb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbDsKKwkJYm9vbGVhbiBvbGRDb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbEVTZXQgPSBjb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbEVTZXQ7CisJCWNvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsID0gQ09ORklHX1BST1BFUlRZX0NPTkZJREVOVElBTF9FREVGQVVMVDsKKwkJY29uZmlnUHJvcGVydHlDb25maWRlbnRpYWxFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9DT05GSURFTlRJQUwsIG9sZENvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsLCBDT05GSUdfUFJPUEVSVFlfQ09ORklERU5USUFMX0VERUZBVUxULCBvbGRDb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbEVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldENvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKCkgeworCQlyZXR1cm4gY29uZmlnUHJvcGVydHlDb25maWRlbnRpYWxFU2V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKKwkJU3RyaW5nIG9sZElkID0gaWQ7CisJCWlkID0gbmV3SWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19JRCwgb2xkSWQsIGlkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX05BTUU6CisJCQkJcmV0dXJuIGdldENvbmZpZ1Byb3BlcnR5TmFtZSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX1RZUEU6CisJCQkJcmV0dXJuIGdldENvbmZpZ1Byb3BlcnR5VHlwZSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX1ZBTFVFOgorCQkJCXJldHVybiBnZXRDb25maWdQcm9wZXJ0eVZhbHVlKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfSUdOT1JFOgorCQkJCXJldHVybiBpc0NvbmZpZ1Byb3BlcnR5SWdub3JlKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfU1VQUE9SVFNfRFlOQU1JQ19VUERBVEVTOgorCQkJCXJldHVybiBpc0NvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcygpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX0NPTkZJREVOVElBTDoKKwkJCQlyZXR1cm4gaXNDb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbCgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fSUQ6CisJCQkJcmV0dXJuIGdldElkKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OOgorCQkJCWdldERlc2NyaXB0aW9uKCkuY2xlYXIoKTsKKwkJCQlnZXREZXNjcmlwdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfTkFNRToKKwkJCQlzZXRDb25maWdQcm9wZXJ0eU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX1RZUEU6CisJCQkJc2V0Q29uZmlnUHJvcGVydHlUeXBlKChDb25maWdQcm9wZXJ0eVR5cGVUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfVkFMVUU6CisJCQkJc2V0Q29uZmlnUHJvcGVydHlWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfSUdOT1JFOgorCQkJCXNldENvbmZpZ1Byb3BlcnR5SWdub3JlKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfU1VQUE9SVFNfRFlOQU1JQ19VUERBVEVTOgorCQkJCXNldENvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcygoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX0NPTkZJREVOVElBTDoKKwkJCQlzZXRDb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fSUQ6CisJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OOgorCQkJCWdldERlc2NyaXB0aW9uKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfTkFNRToKKwkJCQlzZXRDb25maWdQcm9wZXJ0eU5hbWUoQ09ORklHX1BST1BFUlRZX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9UWVBFOgorCQkJCXVuc2V0Q29uZmlnUHJvcGVydHlUeXBlKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX1ZBTFVFOgorCQkJCXNldENvbmZpZ1Byb3BlcnR5VmFsdWUoQ09ORklHX1BST1BFUlRZX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfSUdOT1JFOgorCQkJCXVuc2V0Q29uZmlnUHJvcGVydHlJZ25vcmUoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfU1VQUE9SVFNfRFlOQU1JQ19VUERBVEVTOgorCQkJCXVuc2V0Q29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX0NPTkZJREVOVElBTDoKKwkJCQl1bnNldENvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fSUQ6CisJCQkJc2V0SWQoSURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIGRlc2NyaXB0aW9uICE9IG51bGwgJiYgIWRlc2NyaXB0aW9uLmlzRW1wdHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9OQU1FOgorCQkJCXJldHVybiBDT05GSUdfUFJPUEVSVFlfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY29uZmlnUHJvcGVydHlOYW1lICE9IG51bGwgOiAhQ09ORklHX1BST1BFUlRZX05BTUVfRURFRkFVTFQuZXF1YWxzKGNvbmZpZ1Byb3BlcnR5TmFtZSk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfVFlQRToKKwkJCQlyZXR1cm4gaXNTZXRDb25maWdQcm9wZXJ0eVR5cGUoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9WQUxVRToKKwkJCQlyZXR1cm4gQ09ORklHX1BST1BFUlRZX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBjb25maWdQcm9wZXJ0eVZhbHVlICE9IG51bGwgOiAhQ09ORklHX1BST1BFUlRZX1ZBTFVFX0VERUZBVUxULmVxdWFscyhjb25maWdQcm9wZXJ0eVZhbHVlKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9JR05PUkU6CisJCQkJcmV0dXJuIGlzU2V0Q29uZmlnUHJvcGVydHlJZ25vcmUoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9TVVBQT1JUU19EWU5BTUlDX1VQREFURVM6CisJCQkJcmV0dXJuIGlzU2V0Q29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfQ09ORklERU5USUFMOgorCQkJCXJldHVybiBpc1NldENvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19JRDoKKwkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGNvbmZpZ1Byb3BlcnR5TmFtZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChjb25maWdQcm9wZXJ0eU5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNvbmZpZ1Byb3BlcnR5VHlwZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGNvbmZpZ1Byb3BlcnR5VHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQoY29uZmlnUHJvcGVydHlUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBjb25maWdQcm9wZXJ0eVZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGNvbmZpZ1Byb3BlcnR5VmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNvbmZpZ1Byb3BlcnR5SWdub3JlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoY29uZmlnUHJvcGVydHlJZ25vcmVFU2V0KSByZXN1bHQuYXBwZW5kKGNvbmZpZ1Byb3BlcnR5SWdub3JlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBjb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXM6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChjb25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXNFU2V0KSByZXN1bHQuYXBwZW5kKGNvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgY29uZmlnUHJvcGVydHlDb25maWRlbnRpYWw6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChjb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbEVTZXQpIHJlc3VsdC5hcHBlbmQoY29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGlkKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vQ29uZmlnUHJvcGVydHlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rpb25EZWZpbml0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmZiYmRmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwuamF2YQpAQCAtMCwwICsxLDUwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCNnZXRNYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnlDbGFzcyA8ZW0+TWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5IENsYXNzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCNnZXRDb25maWdQcm9wZXJ0eSA8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCNnZXRDb25uZWN0aW9uZmFjdG9yeUludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbmZhY3RvcnkgSW50ZXJmYWNlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCNnZXRDb25uZWN0aW9uZmFjdG9yeUltcGxDbGFzcyA8ZW0+Q29ubmVjdGlvbmZhY3RvcnkgSW1wbCBDbGFzczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwjZ2V0Q29ubmVjdGlvbkludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MgPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDb25uZWN0aW9uRGVmaW5pdGlvbiB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzKCkgPGVtPk1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeSBDbGFzczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5Q2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTkFHRURDT05ORUNUSU9ORkFDVE9SWV9DTEFTU19FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnlDbGFzcygpIDxlbT5NYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnkgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzID0gTUFOQUdFRENPTk5FQ1RJT05GQUNUT1JZX0NMQVNTX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnUHJvcGVydHkoKSA8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8Q29uZmlnUHJvcGVydHk+IGNvbmZpZ1Byb3BlcnR5OworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlKCkgPGVtPkNvbm5lY3Rpb25mYWN0b3J5IEludGVyZmFjZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29ubmVjdGlvbmZhY3RvcnlJbnRlcmZhY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05GQUNUT1JZX0lOVEVSRkFDRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uZmFjdG9yeUludGVyZmFjZSgpIDxlbT5Db25uZWN0aW9uZmFjdG9yeSBJbnRlcmZhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlID0gQ09OTkVDVElPTkZBQ1RPUllfSU5URVJGQUNFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzKCkgPGVtPkNvbm5lY3Rpb25mYWN0b3J5IEltcGwgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9ORkFDVE9SWV9JTVBMX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzKCkgPGVtPkNvbm5lY3Rpb25mYWN0b3J5IEltcGwgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzID0gQ09OTkVDVElPTkZBQ1RPUllfSU1QTF9DTEFTU19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkgPGVtPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX0lOVEVSRkFDRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkgPGVtPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25JbnRlcmZhY2UgPSBDT05ORUNUSU9OX0lOVEVSRkFDRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uSW1wbENsYXNzKCkgPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9JTVBMX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MoKSA8ZW0+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb25uZWN0aW9uSW1wbENsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbm5lY3Rpb25JbXBsQ2xhc3MgPSBDT05ORUNUSU9OX0lNUExfQ0xBU1NfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb25uZWN0aW9uRGVmaW5pdGlvbkltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLkNPTk5FQ1RJT05fREVGSU5JVElPTjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzKCkgeworCQlyZXR1cm4gbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5Q2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5Q2xhc3MoU3RyaW5nIG5ld01hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzKSB7CisJCVN0cmluZyBvbGRNYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnlDbGFzcyA9IG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzOworCQltYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnlDbGFzcyA9IG5ld01hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRENPTk5FQ1RJT05GQUNUT1JZX0NMQVNTLCBvbGRNYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnlDbGFzcywgbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5Q2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxDb25maWdQcm9wZXJ0eT4gZ2V0Q29uZmlnUHJvcGVydHkoKSB7CisJCWlmIChjb25maWdQcm9wZXJ0eSA9PSBudWxsKSB7CisJCQljb25maWdQcm9wZXJ0eSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxDb25maWdQcm9wZXJ0eT4oQ29uZmlnUHJvcGVydHkuY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVFkpOworCQl9CisJCXJldHVybiBjb25maWdQcm9wZXJ0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlKCkgeworCQlyZXR1cm4gY29ubmVjdGlvbmZhY3RvcnlJbnRlcmZhY2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbmZhY3RvcnlJbnRlcmZhY2UoU3RyaW5nIG5ld0Nvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlKSB7CisJCVN0cmluZyBvbGRDb25uZWN0aW9uZmFjdG9yeUludGVyZmFjZSA9IGNvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlOworCQljb25uZWN0aW9uZmFjdG9yeUludGVyZmFjZSA9IG5ld0Nvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTkZBQ1RPUllfSU5URVJGQUNFLCBvbGRDb25uZWN0aW9uZmFjdG9yeUludGVyZmFjZSwgY29ubmVjdGlvbmZhY3RvcnlJbnRlcmZhY2UpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzKCkgeworCQlyZXR1cm4gY29ubmVjdGlvbmZhY3RvcnlJbXBsQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbmZhY3RvcnlJbXBsQ2xhc3MoU3RyaW5nIG5ld0Nvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzKSB7CisJCVN0cmluZyBvbGRDb25uZWN0aW9uZmFjdG9yeUltcGxDbGFzcyA9IGNvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzOworCQljb25uZWN0aW9uZmFjdG9yeUltcGxDbGFzcyA9IG5ld0Nvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTkZBQ1RPUllfSU1QTF9DTEFTUywgb2xkQ29ubmVjdGlvbmZhY3RvcnlJbXBsQ2xhc3MsIGNvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uSW50ZXJmYWNlKCkgeworCQlyZXR1cm4gY29ubmVjdGlvbkludGVyZmFjZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uSW50ZXJmYWNlKFN0cmluZyBuZXdDb25uZWN0aW9uSW50ZXJmYWNlKSB7CisJCVN0cmluZyBvbGRDb25uZWN0aW9uSW50ZXJmYWNlID0gY29ubmVjdGlvbkludGVyZmFjZTsKKwkJY29ubmVjdGlvbkludGVyZmFjZSA9IG5ld0Nvbm5lY3Rpb25JbnRlcmZhY2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRSwgb2xkQ29ubmVjdGlvbkludGVyZmFjZSwgY29ubmVjdGlvbkludGVyZmFjZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29ubmVjdGlvbkltcGxDbGFzcygpIHsKKwkJcmV0dXJuIGNvbm5lY3Rpb25JbXBsQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbkltcGxDbGFzcyhTdHJpbmcgbmV3Q29ubmVjdGlvbkltcGxDbGFzcykgeworCQlTdHJpbmcgb2xkQ29ubmVjdGlvbkltcGxDbGFzcyA9IGNvbm5lY3Rpb25JbXBsQ2xhc3M7CisJCWNvbm5lY3Rpb25JbXBsQ2xhc3MgPSBuZXdDb25uZWN0aW9uSW1wbENsYXNzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTLCBvbGRDb25uZWN0aW9uSW1wbENsYXNzLCBjb25uZWN0aW9uSW1wbENsYXNzKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgeworCQlTdHJpbmcgb2xkSWQgPSBpZDsKKwkJaWQgPSBuZXdJZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0lELCBvbGRJZCwgaWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVFk6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb25maWdQcm9wZXJ0eSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURDT05ORUNUSU9ORkFDVE9SWV9DTEFTUzoKKwkJCQlyZXR1cm4gZ2V0TWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5Q2xhc3MoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUWToKKwkJCQlyZXR1cm4gZ2V0Q29uZmlnUHJvcGVydHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05GQUNUT1JZX0lOVEVSRkFDRToKKwkJCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbmZhY3RvcnlJbnRlcmZhY2UoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05GQUNUT1JZX0lNUExfQ0xBU1M6CisJCQkJcmV0dXJuIGdldENvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRToKKwkJCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbkludGVyZmFjZSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTVBMX0NMQVNTOgorCQkJCXJldHVybiBnZXRDb25uZWN0aW9uSW1wbENsYXNzKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19JRDoKKwkJCQlyZXR1cm4gZ2V0SWQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRENPTk5FQ1RJT05GQUNUT1JZX0NMQVNTOgorCQkJCXNldE1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUWToKKwkJCQlnZXRDb25maWdQcm9wZXJ0eSgpLmNsZWFyKCk7CisJCQkJZ2V0Q29uZmlnUHJvcGVydHkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENvbmZpZ1Byb3BlcnR5PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTkZBQ1RPUllfSU5URVJGQUNFOgorCQkJCXNldENvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05GQUNUT1JZX0lNUExfQ0xBU1M6CisJCQkJc2V0Q29ubmVjdGlvbmZhY3RvcnlJbXBsQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTl9JTlRFUkZBQ0U6CisJCQkJc2V0Q29ubmVjdGlvbkludGVyZmFjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lNUExfQ0xBU1M6CisJCQkJc2V0Q29ubmVjdGlvbkltcGxDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19JRDoKKwkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRENPTk5FQ1RJT05GQUNUT1JZX0NMQVNTOgorCQkJCXNldE1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzKE1BTkFHRURDT05ORUNUSU9ORkFDVE9SWV9DTEFTU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09ORklHX1BST1BFUlRZOgorCQkJCWdldENvbmZpZ1Byb3BlcnR5KCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9ORkFDVE9SWV9JTlRFUkZBQ0U6CisJCQkJc2V0Q29ubmVjdGlvbmZhY3RvcnlJbnRlcmZhY2UoQ09OTkVDVElPTkZBQ1RPUllfSU5URVJGQUNFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9ORkFDVE9SWV9JTVBMX0NMQVNTOgorCQkJCXNldENvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzKENPTk5FQ1RJT05GQUNUT1JZX0lNUExfQ0xBU1NfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU5URVJGQUNFOgorCQkJCXNldENvbm5lY3Rpb25JbnRlcmZhY2UoQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU1QTF9DTEFTUzoKKwkJCQlzZXRDb25uZWN0aW9uSW1wbENsYXNzKENPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fSUQ6CisJCQkJc2V0SWQoSURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRENPTk5FQ1RJT05GQUNUT1JZX0NMQVNTOgorCQkJCXJldHVybiBNQU5BR0VEQ09OTkVDVElPTkZBQ1RPUllfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzICE9IG51bGwgOiAhTUFOQUdFRENPTk5FQ1RJT05GQUNUT1JZX0NMQVNTX0VERUZBVUxULmVxdWFscyhtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnlDbGFzcyk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVFk6CisJCQkJcmV0dXJuIGNvbmZpZ1Byb3BlcnR5ICE9IG51bGwgJiYgIWNvbmZpZ1Byb3BlcnR5LmlzRW1wdHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05GQUNUT1JZX0lOVEVSRkFDRToKKwkJCQlyZXR1cm4gQ09OTkVDVElPTkZBQ1RPUllfSU5URVJGQUNFX0VERUZBVUxUID09IG51bGwgPyBjb25uZWN0aW9uZmFjdG9yeUludGVyZmFjZSAhPSBudWxsIDogIUNPTk5FQ1RJT05GQUNUT1JZX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbmZhY3RvcnlJbnRlcmZhY2UpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09OTkVDVElPTkZBQ1RPUllfSU1QTF9DTEFTUzoKKwkJCQlyZXR1cm4gQ09OTkVDVElPTkZBQ1RPUllfSU1QTF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gY29ubmVjdGlvbmZhY3RvcnlJbXBsQ2xhc3MgIT0gbnVsbCA6ICFDT05ORUNUSU9ORkFDVE9SWV9JTVBMX0NMQVNTX0VERUZBVUxULmVxdWFscyhjb25uZWN0aW9uZmFjdG9yeUltcGxDbGFzcyk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRToKKwkJCQlyZXR1cm4gQ09OTkVDVElPTl9JTlRFUkZBQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGNvbm5lY3Rpb25JbnRlcmZhY2UgIT0gbnVsbCA6ICFDT05ORUNUSU9OX0lOVEVSRkFDRV9FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbkludGVyZmFjZSk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lNUExfQ0xBU1M6CisJCQkJcmV0dXJuIENPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gY29ubmVjdGlvbkltcGxDbGFzcyAhPSBudWxsIDogIUNPTk5FQ1RJT05fSU1QTF9DTEFTU19FREVGQVVMVC5lcXVhbHMoY29ubmVjdGlvbkltcGxDbGFzcyk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19JRDoKKwkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uZmFjdG9yeUludGVyZmFjZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChjb25uZWN0aW9uZmFjdG9yeUludGVyZmFjZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvbmZhY3RvcnlJbXBsQ2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbmZhY3RvcnlJbXBsQ2xhc3MpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25JbnRlcmZhY2U6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbkludGVyZmFjZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvbkltcGxDbGFzczogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChjb25uZWN0aW9uSW1wbENsYXNzKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0Nvbm5lY3Rpb25EZWZpbml0aW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYyMWY5YgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEKQEAgLTAsMCArMSwyOTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVFTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25uZWN0b3IgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0Q29ubmVjdG9yIDxlbT5Db25uZWN0b3I8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaXhlZCgpIDxlbT5NaXhlZDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNaXhlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEZlYXR1cmVNYXAgbWl4ZWQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYTUxOU1ByZWZpeE1hcCgpIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59JyBtYXAuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRYTUxOU1ByZWZpeE1hcCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVNYXA8U3RyaW5nLCBTdHJpbmc+IHhNTE5TUHJlZml4TWFwOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScgbWFwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTWFwPFN0cmluZywgU3RyaW5nPiB4U0lTY2hlbWFMb2NhdGlvbjsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLkNPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZlYXR1cmVNYXAgZ2V0TWl4ZWQoKSB7CisJCWlmIChtaXhlZCA9PSBudWxsKSB7CisJCQltaXhlZCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgSmNhUGFja2FnZS5DT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCk7CisJCX0KKwkJcmV0dXJuIG1peGVkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhNTE5TUHJlZml4TWFwKCkgeworCQlpZiAoeE1MTlNQcmVmaXhNYXAgPT0gbnVsbCkgeworCQkJeE1MTlNQcmVmaXhNYXAgPSBuZXcgRWNvcmVFTWFwPFN0cmluZyxTdHJpbmc+KEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HX1RPX1NUUklOR19NQVBfRU5UUlksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5DT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQKTsKKwkJfQorCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAubWFwKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSB7CisJCWlmICh4U0lTY2hlbWFMb2NhdGlvbiA9PSBudWxsKSB7CisJCQl4U0lTY2hlbWFMb2NhdGlvbiA9IG5ldyBFY29yZUVNYXA8U3RyaW5nLFN0cmluZz4oRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOworCQl9CisJCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbi5tYXAoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcigpIHsKKwkJcmV0dXJuIChDb25uZWN0b3IpZ2V0TWl4ZWQoKS5nZXQoSmNhUGFja2FnZS5MaXRlcmFscy5DT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19DT05ORUNUT1IsIHRydWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbm5lY3RvcihDb25uZWN0b3IgbmV3Q29ubmVjdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuYmFzaWNBZGQoSmNhUGFja2FnZS5MaXRlcmFscy5DT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19DT05ORUNUT1IsIG5ld0Nvbm5lY3RvciwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q29ubmVjdG9yKENvbm5lY3RvciBuZXdDb25uZWN0b3IpIHsKKwkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChKY2FQYWNrYWdlLkxpdGVyYWxzLkNPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0NPTk5FQ1RPUiwgbmV3Q29ubmVjdG9yKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikoKEVNYXAuSW50ZXJuYWxNYXBWaWV3PFN0cmluZywgU3RyaW5nPilnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19DT05ORUNUT1I6CisJCQkJcmV0dXJuIGJhc2ljU2V0Q29ubmVjdG9yKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6CisJCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0TWl4ZWQoKTsKKwkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmdldFdyYXBwZXIoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgorCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKTsKKwkJCQllbHNlIHJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046CisJCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpOworCQkJCWVsc2UgcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQ09OTkVDVE9SOgorCQkJCXJldHVybiBnZXRDb25uZWN0b3IoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgorCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQobmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgorCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgorCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19DT05ORUNUT1I6CisJCQkJc2V0Q29ubmVjdG9yKChDb25uZWN0b3IpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6CisJCQkJZ2V0TWl4ZWQoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgorCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKKwkJCQlnZXRYU0lTY2hlbWFMb2NhdGlvbigpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0NPTk5FQ1RPUjoKKwkJCQlzZXRDb25uZWN0b3IoKENvbm5lY3RvciludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKKwkJCQlyZXR1cm4gbWl4ZWQgIT0gbnVsbCAmJiAhbWl4ZWQuaXNFbXB0eSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6CisJCQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwICE9IG51bGwgJiYgIXhNTE5TUHJlZml4TWFwLmlzRW1wdHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgorCQkJCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmICF4U0lTY2hlbWFMb2NhdGlvbi5pc0VtcHR5KCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQ09OTkVDVE9SOgorCQkJCXJldHVybiBnZXRDb25uZWN0b3IoKSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobWl4ZWQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobWl4ZWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Db25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3NTgyNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9ySW1wbC5qYXZhCkBAIC0wLDAgKzEsODcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkxpY2Vuc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuUmVzb3VyY2VBZGFwdGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbm5lY3RvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JJbXBsI2dldE1vZHVsZU5hbWUgPGVtPk1vZHVsZSBOYW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvckltcGwjZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9ySW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9ySW1wbCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9ySW1wbCNnZXRWZW5kb3JOYW1lIDxlbT5WZW5kb3IgTmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JJbXBsI2dldEVpc1R5cGUgPGVtPkVpcyBUeXBlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvckltcGwjZ2V0UmVzb3VyY2VhZGFwdGVyVmVyc2lvbiA8ZW0+UmVzb3VyY2VhZGFwdGVyIFZlcnNpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9ySW1wbCNnZXRMaWNlbnNlIDxlbT5MaWNlbnNlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvckltcGwjZ2V0UmVzb3VyY2VhZGFwdGVyIDxlbT5SZXNvdXJjZWFkYXB0ZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9ySW1wbCNnZXRSZXF1aXJlZFdvcmtDb250ZXh0IDxlbT5SZXF1aXJlZCBXb3JrIENvbnRleHQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9ySW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9ySW1wbCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvckltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENvbm5lY3RvckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENvbm5lY3RvciB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsZU5hbWUoKSA8ZW0+TW9kdWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsZU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1vZHVsZU5hbWUoKSA8ZW0+TW9kdWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1vZHVsZU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbW9kdWxlTmFtZSA9IE1PRFVMRV9OQU1FX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb25zKCkgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZXNjcmlwdGlvbnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb25zOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGlzcGxheU5hbWVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8RGlzcGxheU5hbWU+IGRpc3BsYXlOYW1lczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEljb25zKCkgPGVtPkljb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEljb25zKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8SWNvbj4gaWNvbnM7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVuZG9yTmFtZSgpIDxlbT5WZW5kb3IgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmVuZG9yTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVORE9SX05BTUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVuZG9yTmFtZSgpIDxlbT5WZW5kb3IgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmVuZG9yTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyB2ZW5kb3JOYW1lID0gVkVORE9SX05BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWlzVHlwZSgpIDxlbT5FaXMgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RWlzVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUlTX1RZUEVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWlzVHlwZSgpIDxlbT5FaXMgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RWlzVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBlaXNUeXBlID0gRUlTX1RZUEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VhZGFwdGVyVmVyc2lvbigpIDxlbT5SZXNvdXJjZWFkYXB0ZXIgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVzb3VyY2VhZGFwdGVyVmVyc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VBREFQVEVSX1ZFUlNJT05fRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VhZGFwdGVyVmVyc2lvbigpIDxlbT5SZXNvdXJjZWFkYXB0ZXIgVmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVzb3VyY2VhZGFwdGVyVmVyc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZWFkYXB0ZXJWZXJzaW9uID0gUkVTT1VSQ0VBREFQVEVSX1ZFUlNJT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaWNlbnNlKCkgPGVtPkxpY2Vuc2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExpY2Vuc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBMaWNlbnNlIGxpY2Vuc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZWFkYXB0ZXIoKSA8ZW0+UmVzb3VyY2VhZGFwdGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZXNvdXJjZWFkYXB0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBSZXNvdXJjZUFkYXB0ZXIgcmVzb3VyY2VhZGFwdGVyOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVxdWlyZWRXb3JrQ29udGV4dCgpIDxlbT5SZXF1aXJlZCBXb3JrIENvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVxdWlyZWRXb3JrQ29udGV4dCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gcmVxdWlyZWRXb3JrQ29udGV4dDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWV0YWRhdGFDb21wbGV0ZSgpIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWV0YWRhdGFDb21wbGV0ZSgpIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlID0gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1ldGFkYXRhIENvbXBsZXRlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlRVNldDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZlcnNpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiMS42IjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRWZXJzaW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSBWRVJTSU9OX0VERUZBVUxUOworCisJLyoqCisJICogVGhpcyBpcyB0cnVlIGlmIHRoZSBWZXJzaW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJzaW9uRVNldDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb25uZWN0b3JJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5DT05ORUNUT1I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRNb2R1bGVOYW1lKCkgeworCQlyZXR1cm4gbW9kdWxlTmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNb2R1bGVOYW1lKFN0cmluZyBuZXdNb2R1bGVOYW1lKSB7CisJCVN0cmluZyBvbGRNb2R1bGVOYW1lID0gbW9kdWxlTmFtZTsKKwkJbW9kdWxlTmFtZSA9IG5ld01vZHVsZU5hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19NT0RVTEVfTkFNRSwgb2xkTW9kdWxlTmFtZSwgbW9kdWxlTmFtZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CisJCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgeworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5DT05ORUNUT1JfX0RFU0NSSVBUSU9OUyk7CisJCX0KKwkJcmV0dXJuIGRlc2NyaXB0aW9uczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxEaXNwbGF5TmFtZT4gZ2V0RGlzcGxheU5hbWVzKCkgeworCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKKwkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEaXNwbGF5TmFtZT4oRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19ESVNQTEFZX05BTUVTKTsKKwkJfQorCQlyZXR1cm4gZGlzcGxheU5hbWVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PEljb24+IGdldEljb25zKCkgeworCQlpZiAoaWNvbnMgPT0gbnVsbCkgeworCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SWNvbj4oSWNvbi5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5DT05ORUNUT1JfX0lDT05TKTsKKwkJfQorCQlyZXR1cm4gaWNvbnM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRWZW5kb3JOYW1lKCkgeworCQlyZXR1cm4gdmVuZG9yTmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWZW5kb3JOYW1lKFN0cmluZyBuZXdWZW5kb3JOYW1lKSB7CisJCVN0cmluZyBvbGRWZW5kb3JOYW1lID0gdmVuZG9yTmFtZTsKKwkJdmVuZG9yTmFtZSA9IG5ld1ZlbmRvck5hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRU5ET1JfTkFNRSwgb2xkVmVuZG9yTmFtZSwgdmVuZG9yTmFtZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RWlzVHlwZSgpIHsKKwkJcmV0dXJuIGVpc1R5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RWlzVHlwZShTdHJpbmcgbmV3RWlzVHlwZSkgeworCQlTdHJpbmcgb2xkRWlzVHlwZSA9IGVpc1R5cGU7CisJCWVpc1R5cGUgPSBuZXdFaXNUeXBlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fRUlTX1RZUEUsIG9sZEVpc1R5cGUsIGVpc1R5cGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlYWRhcHRlclZlcnNpb24oKSB7CisJCXJldHVybiByZXNvdXJjZWFkYXB0ZXJWZXJzaW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlYWRhcHRlclZlcnNpb24oU3RyaW5nIG5ld1Jlc291cmNlYWRhcHRlclZlcnNpb24pIHsKKwkJU3RyaW5nIG9sZFJlc291cmNlYWRhcHRlclZlcnNpb24gPSByZXNvdXJjZWFkYXB0ZXJWZXJzaW9uOworCQlyZXNvdXJjZWFkYXB0ZXJWZXJzaW9uID0gbmV3UmVzb3VyY2VhZGFwdGVyVmVyc2lvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFQURBUFRFUl9WRVJTSU9OLCBvbGRSZXNvdXJjZWFkYXB0ZXJWZXJzaW9uLCByZXNvdXJjZWFkYXB0ZXJWZXJzaW9uKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpY2Vuc2UgZ2V0TGljZW5zZSgpIHsKKwkJcmV0dXJuIGxpY2Vuc2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TGljZW5zZShMaWNlbnNlIG5ld0xpY2Vuc2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJTGljZW5zZSBvbGRMaWNlbnNlID0gbGljZW5zZTsKKwkJbGljZW5zZSA9IG5ld0xpY2Vuc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19MSUNFTlNFLCBvbGRMaWNlbnNlLCBuZXdMaWNlbnNlKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRMaWNlbnNlKExpY2Vuc2UgbmV3TGljZW5zZSkgeworCQlpZiAobmV3TGljZW5zZSAhPSBsaWNlbnNlKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChsaWNlbnNlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWxpY2Vuc2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTElDRU5TRSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3TGljZW5zZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdMaWNlbnNlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0UsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0TGljZW5zZShuZXdMaWNlbnNlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19MSUNFTlNFLCBuZXdMaWNlbnNlLCBuZXdMaWNlbnNlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlc291cmNlQWRhcHRlciBnZXRSZXNvdXJjZWFkYXB0ZXIoKSB7CisJCXJldHVybiByZXNvdXJjZWFkYXB0ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVzb3VyY2VhZGFwdGVyKFJlc291cmNlQWRhcHRlciBuZXdSZXNvdXJjZWFkYXB0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJUmVzb3VyY2VBZGFwdGVyIG9sZFJlc291cmNlYWRhcHRlciA9IHJlc291cmNlYWRhcHRlcjsKKwkJcmVzb3VyY2VhZGFwdGVyID0gbmV3UmVzb3VyY2VhZGFwdGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VBREFQVEVSLCBvbGRSZXNvdXJjZWFkYXB0ZXIsIG5ld1Jlc291cmNlYWRhcHRlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VhZGFwdGVyKFJlc291cmNlQWRhcHRlciBuZXdSZXNvdXJjZWFkYXB0ZXIpIHsKKwkJaWYgKG5ld1Jlc291cmNlYWRhcHRlciAhPSByZXNvdXJjZWFkYXB0ZXIpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKHJlc291cmNlYWRhcHRlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXNvdXJjZWFkYXB0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VBREFQVEVSLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdSZXNvdXJjZWFkYXB0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVzb3VyY2VhZGFwdGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFQURBUFRFUiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRSZXNvdXJjZWFkYXB0ZXIobmV3UmVzb3VyY2VhZGFwdGVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19SRVNPVVJDRUFEQVBURVIsIG5ld1Jlc291cmNlYWRhcHRlciwgbmV3UmVzb3VyY2VhZGFwdGVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZXF1aXJlZFdvcmtDb250ZXh0KCkgeworCQlpZiAocmVxdWlyZWRXb3JrQ29udGV4dCA9PSBudWxsKSB7CisJCQlyZXF1aXJlZFdvcmtDb250ZXh0ID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVRVUlSRURfV09SS19DT05URVhUKTsKKwkJfQorCQlyZXR1cm4gcmVxdWlyZWRXb3JrQ29udGV4dDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7CisJCVN0cmluZyBvbGRJZCA9IGlkOworCQlpZCA9IG5ld0lkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fSUQsIG9sZElkLCBpZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIG1ldGFkYXRhQ29tcGxldGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuIG5ld01ldGFkYXRhQ29tcGxldGUpIHsKKwkJYm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKKwkJbWV0YWRhdGFDb21wbGV0ZSA9IG5ld01ldGFkYXRhQ29tcGxldGU7CisJCWJvb2xlYW4gb2xkTWV0YWRhdGFDb21wbGV0ZUVTZXQgPSBtZXRhZGF0YUNvbXBsZXRlRVNldDsKKwkJbWV0YWRhdGFDb21wbGV0ZUVTZXQgPSB0cnVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTUVUQURBVEFfQ09NUExFVEUsIG9sZE1ldGFkYXRhQ29tcGxldGUsIG1ldGFkYXRhQ29tcGxldGUsICFvbGRNZXRhZGF0YUNvbXBsZXRlRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHVuc2V0TWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJYm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKKwkJYm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlRVNldCA9IG1ldGFkYXRhQ29tcGxldGVFU2V0OworCQltZXRhZGF0YUNvbXBsZXRlID0gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQ7CisJCW1ldGFkYXRhQ29tcGxldGVFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgSmNhUGFja2FnZS5DT05ORUNUT1JfX01FVEFEQVRBX0NPTVBMRVRFLCBvbGRNZXRhZGF0YUNvbXBsZXRlLCBNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVCwgb2xkTWV0YWRhdGFDb21wbGV0ZUVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldE1ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiBtZXRhZGF0YUNvbXBsZXRlRVNldDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKKwkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOworCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKKwkJYm9vbGVhbiBvbGRWZXJzaW9uRVNldCA9IHZlcnNpb25FU2V0OworCQl2ZXJzaW9uRVNldCA9IHRydWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uLCAhb2xkVmVyc2lvbkVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldFZlcnNpb24oKSB7CisJCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKKwkJYm9vbGVhbiBvbGRWZXJzaW9uRVNldCA9IHZlcnNpb25FU2V0OworCQl2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKKwkJdmVyc2lvbkVTZXQgPSBmYWxzZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgVkVSU0lPTl9FREVGQVVMVCwgb2xkVmVyc2lvbkVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldFZlcnNpb24oKSB7CisJCXJldHVybiB2ZXJzaW9uRVNldDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19ERVNDUklQVElPTlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fRElTUExBWV9OQU1FUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19JQ09OUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0U6CisJCQkJcmV0dXJuIGJhc2ljU2V0TGljZW5zZShudWxsLCBtc2dzKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFQURBUFRFUjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRSZXNvdXJjZWFkYXB0ZXIobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX01PRFVMRV9OQU1FOgorCQkJCXJldHVybiBnZXRNb2R1bGVOYW1lKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19ERVNDUklQVElPTlM6CisJCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fRElTUExBWV9OQU1FUzoKKwkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19JQ09OUzoKKwkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FOgorCQkJCXJldHVybiBnZXRWZW5kb3JOYW1lKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19FSVNfVFlQRToKKwkJCQlyZXR1cm4gZ2V0RWlzVHlwZSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VBREFQVEVSX1ZFUlNJT046CisJCQkJcmV0dXJuIGdldFJlc291cmNlYWRhcHRlclZlcnNpb24oKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0U6CisJCQkJcmV0dXJuIGdldExpY2Vuc2UoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFQURBUFRFUjoKKwkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VhZGFwdGVyKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19SRVFVSVJFRF9XT1JLX0NPTlRFWFQ6CisJCQkJcmV0dXJuIGdldFJlcXVpcmVkV29ya0NvbnRleHQoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0lEOgorCQkJCXJldHVybiBnZXRJZCgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTUVUQURBVEFfQ09NUExFVEU6CisJCQkJcmV0dXJuIGlzTWV0YWRhdGFDb21wbGV0ZSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVSU0lPTjoKKwkJCQlyZXR1cm4gZ2V0VmVyc2lvbigpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19NT0RVTEVfTkFNRToKKwkJCQlzZXRNb2R1bGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0RFU0NSSVBUSU9OUzoKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19ESVNQTEFZX05BTUVTOgorCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7CisJCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaXNwbGF5TmFtZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0lDT05TOgorCQkJCWdldEljb25zKCkuY2xlYXIoKTsKKwkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSWNvbj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FOgorCQkJCXNldFZlbmRvck5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fRUlTX1RZUEU6CisJCQkJc2V0RWlzVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19SRVNPVVJDRUFEQVBURVJfVkVSU0lPTjoKKwkJCQlzZXRSZXNvdXJjZWFkYXB0ZXJWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0U6CisJCQkJc2V0TGljZW5zZSgoTGljZW5zZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVTT1VSQ0VBREFQVEVSOgorCQkJCXNldFJlc291cmNlYWRhcHRlcigoUmVzb3VyY2VBZGFwdGVyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19SRVFVSVJFRF9XT1JLX0NPTlRFWFQ6CisJCQkJZ2V0UmVxdWlyZWRXb3JrQ29udGV4dCgpLmNsZWFyKCk7CisJCQkJZ2V0UmVxdWlyZWRXb3JrQ29udGV4dCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fSUQ6CisJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTUVUQURBVEFfQ09NUExFVEU6CisJCQkJc2V0TWV0YWRhdGFDb21wbGV0ZSgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVSU0lPTjoKKwkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19NT0RVTEVfTkFNRToKKwkJCQlzZXRNb2R1bGVOYW1lKE1PRFVMRV9OQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19ERVNDUklQVElPTlM6CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19ESVNQTEFZX05BTUVTOgorCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fSUNPTlM6CisJCQkJZ2V0SWNvbnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FOgorCQkJCXNldFZlbmRvck5hbWUoVkVORE9SX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0VJU19UWVBFOgorCQkJCXNldEVpc1R5cGUoRUlTX1RZUEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFQURBUFRFUl9WRVJTSU9OOgorCQkJCXNldFJlc291cmNlYWRhcHRlclZlcnNpb24oUkVTT1VSQ0VBREFQVEVSX1ZFUlNJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0U6CisJCQkJc2V0TGljZW5zZSgoTGljZW5zZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19SRVNPVVJDRUFEQVBURVI6CisJCQkJc2V0UmVzb3VyY2VhZGFwdGVyKChSZXNvdXJjZUFkYXB0ZXIpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fUkVRVUlSRURfV09SS19DT05URVhUOgorCQkJCWdldFJlcXVpcmVkV29ya0NvbnRleHQoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0lEOgorCQkJCXNldElkKElEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19NRVRBREFUQV9DT01QTEVURToKKwkJCQl1bnNldE1ldGFkYXRhQ29tcGxldGUoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRVJTSU9OOgorCQkJCXVuc2V0VmVyc2lvbigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTU9EVUxFX05BTUU6CisJCQkJcmV0dXJuIE1PRFVMRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtb2R1bGVOYW1lICE9IG51bGwgOiAhTU9EVUxFX05BTUVfRURFRkFVTFQuZXF1YWxzKG1vZHVsZU5hbWUpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fREVTQ1JJUFRJT05TOgorCQkJCXJldHVybiBkZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhZGVzY3JpcHRpb25zLmlzRW1wdHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0RJU1BMQVlfTkFNRVM6CisJCQkJcmV0dXJuIGRpc3BsYXlOYW1lcyAhPSBudWxsICYmICFkaXNwbGF5TmFtZXMuaXNFbXB0eSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fSUNPTlM6CisJCQkJcmV0dXJuIGljb25zICE9IG51bGwgJiYgIWljb25zLmlzRW1wdHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FOgorCQkJCXJldHVybiBWRU5ET1JfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gdmVuZG9yTmFtZSAhPSBudWxsIDogIVZFTkRPUl9OQU1FX0VERUZBVUxULmVxdWFscyh2ZW5kb3JOYW1lKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0VJU19UWVBFOgorCQkJCXJldHVybiBFSVNfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gZWlzVHlwZSAhPSBudWxsIDogIUVJU19UWVBFX0VERUZBVUxULmVxdWFscyhlaXNUeXBlKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFQURBUFRFUl9WRVJTSU9OOgorCQkJCXJldHVybiBSRVNPVVJDRUFEQVBURVJfVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gcmVzb3VyY2VhZGFwdGVyVmVyc2lvbiAhPSBudWxsIDogIVJFU09VUkNFQURBUFRFUl9WRVJTSU9OX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZWFkYXB0ZXJWZXJzaW9uKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX0xJQ0VOU0U6CisJCQkJcmV0dXJuIGxpY2Vuc2UgIT0gbnVsbDsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFQURBUFRFUjoKKwkJCQlyZXR1cm4gcmVzb3VyY2VhZGFwdGVyICE9IG51bGw7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19SRVFVSVJFRF9XT1JLX0NPTlRFWFQ6CisJCQkJcmV0dXJuIHJlcXVpcmVkV29ya0NvbnRleHQgIT0gbnVsbCAmJiAhcmVxdWlyZWRXb3JrQ29udGV4dC5pc0VtcHR5KCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19JRDoKKwkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX01FVEFEQVRBX0NPTVBMRVRFOgorCQkJCXJldHVybiBpc1NldE1ldGFkYXRhQ29tcGxldGUoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFUlNJT046CisJCQkJcmV0dXJuIGlzU2V0VmVyc2lvbigpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobW9kdWxlTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtb2R1bGVOYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB2ZW5kb3JOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHZlbmRvck5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGVpc1R5cGU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZWlzVHlwZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VhZGFwdGVyVmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChyZXNvdXJjZWFkYXB0ZXJWZXJzaW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByZXF1aXJlZFdvcmtDb250ZXh0OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHJlcXVpcmVkV29ya0NvbnRleHQpOworCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGlkKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtZXRhZGF0YUNvbXBsZXRlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAobWV0YWRhdGFDb21wbGV0ZUVTZXQpIHJlc3VsdC5hcHBlbmQobWV0YWRhdGFDb21wbGV0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHZlcnNpb25FU2V0KSByZXN1bHQuYXBwZW5kKHZlcnNpb24pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Db25uZWN0b3JJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0MmU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwuamF2YQpAQCAtMCwwICsxLDI1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5NZXNzYWdlQWRhcHRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwjZ2V0TWVzc2FnZWFkYXB0ZXIgPGVtPk1lc3NhZ2VhZGFwdGVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkluYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlYWRhcHRlcigpIDxlbT5NZXNzYWdlYWRhcHRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWVzc2FnZWFkYXB0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBNZXNzYWdlQWRhcHRlciBtZXNzYWdlYWRhcHRlcjsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEluYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1lc3NhZ2VBZGFwdGVyIGdldE1lc3NhZ2VhZGFwdGVyKCkgeworCQlyZXR1cm4gbWVzc2FnZWFkYXB0ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWVzc2FnZWFkYXB0ZXIoTWVzc2FnZUFkYXB0ZXIgbmV3TWVzc2FnZWFkYXB0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJTWVzc2FnZUFkYXB0ZXIgb2xkTWVzc2FnZWFkYXB0ZXIgPSBtZXNzYWdlYWRhcHRlcjsKKwkJbWVzc2FnZWFkYXB0ZXIgPSBuZXdNZXNzYWdlYWRhcHRlcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VBREFQVEVSLCBvbGRNZXNzYWdlYWRhcHRlciwgbmV3TWVzc2FnZWFkYXB0ZXIpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VhZGFwdGVyKE1lc3NhZ2VBZGFwdGVyIG5ld01lc3NhZ2VhZGFwdGVyKSB7CisJCWlmIChuZXdNZXNzYWdlYWRhcHRlciAhPSBtZXNzYWdlYWRhcHRlcikgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAobWVzc2FnZWFkYXB0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWVzc2FnZWFkYXB0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRUFEQVBURVIsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld01lc3NhZ2VhZGFwdGVyICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01lc3NhZ2VhZGFwdGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VBREFQVEVSLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldE1lc3NhZ2VhZGFwdGVyKG5ld01lc3NhZ2VhZGFwdGVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFQURBUFRFUiwgbmV3TWVzc2FnZWFkYXB0ZXIsIG5ld01lc3NhZ2VhZGFwdGVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgeworCQlTdHJpbmcgb2xkSWQgPSBpZDsKKwkJaWQgPSBuZXdJZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0lELCBvbGRJZCwgaWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFQURBUFRFUjoKKwkJCQlyZXR1cm4gYmFzaWNTZXRNZXNzYWdlYWRhcHRlcihudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRUFEQVBURVI6CisJCQkJcmV0dXJuIGdldE1lc3NhZ2VhZGFwdGVyKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19JRDoKKwkJCQlyZXR1cm4gZ2V0SWQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRUFEQVBURVI6CisJCQkJc2V0TWVzc2FnZWFkYXB0ZXIoKE1lc3NhZ2VBZGFwdGVyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19JRDoKKwkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRUFEQVBURVI6CisJCQkJc2V0TWVzc2FnZWFkYXB0ZXIoKE1lc3NhZ2VBZGFwdGVyKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0lEOgorCQkJCXNldElkKElEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VBREFQVEVSOgorCQkJCXJldHVybiBtZXNzYWdlYWRhcHRlciAhPSBudWxsOworCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fSUQ6CisJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL0pjYUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL0pjYUZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0NGU0NAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvSmNhRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDQ0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEpjYUZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgSmNhRmFjdG9yeSB7CisJLyoqCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSmNhRmFjdG9yeSBpbml0KCkgeworCQl0cnkgeworCQkJSmNhRmFjdG9yeSB0aGVKY2FGYWN0b3J5ID0gKEpjYUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qY2EiKTsgLy8kTk9OLU5MUy0xJCAKKwkJCWlmICh0aGVKY2FGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhlSmNhRmFjdG9yeTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJcmV0dXJuIG5ldyBKY2FGYWN0b3J5SW1wbCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEpjYUZhY3RvcnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQWN0aXZhdGlvblNwZWMoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVBZG1pbk9iamVjdCgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29uZmlnUHJvcGVydHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVDb25uZWN0aW9uRGVmaW5pdGlvbigpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbm5lY3RvcigpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcigpOworCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTGljZW5zZSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1lc3NhZ2VMaXN0ZW5lcigpOworCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcigpOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVzb3VyY2VBZGFwdGVyKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbigpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX1RZUEVfVFlQRToKKwkJCQlyZXR1cm4gY3JlYXRlQ29uZmlnUHJvcGVydHlUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNSRURFTlRJQUxfSU5URVJGQUNFX1RZUEU6CisJCQkJcmV0dXJuIGNyZWF0ZUNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIEpjYVBhY2thZ2UuVFJBTlNBQ1RJT05fU1VQUE9SVF9UWVBFOgorCQkJCXJldHVybiBjcmVhdGVUcmFuc2FjdGlvblN1cHBvcnRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX05BTUVfVFlQRToKKwkJCQlyZXR1cm4gY3JlYXRlQ29uZmlnUHJvcGVydHlOYW1lVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9UWVBFX1RZUEVfT0JKRUNUOgorCQkJCXJldHVybiBjcmVhdGVDb25maWdQcm9wZXJ0eVR5cGVUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ1JFREVOVElBTF9JTlRFUkZBQ0VfVFlQRV9PQkpFQ1Q6CisJCQkJcmV0dXJuIGNyZWF0ZUNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIEpjYVBhY2thZ2UuVFJBTlNBQ1RJT05fU1VQUE9SVF9UWVBFX09CSkVDVDoKKwkJCQlyZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25TdXBwb3J0VHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX1RZUEVfVFlQRToKKwkJCQlyZXR1cm4gY29udmVydENvbmZpZ1Byb3BlcnR5VHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNSRURFTlRJQUxfSU5URVJGQUNFX1RZUEU6CisJCQkJcmV0dXJuIGNvbnZlcnRDcmVkZW50aWFsSW50ZXJmYWNlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIEpjYVBhY2thZ2UuVFJBTlNBQ1RJT05fU1VQUE9SVF9UWVBFOgorCQkJCXJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25TdXBwb3J0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX05BTUVfVFlQRToKKwkJCQlyZXR1cm4gY29udmVydENvbmZpZ1Byb3BlcnR5TmFtZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9UWVBFX1RZUEVfT0JKRUNUOgorCQkJCXJldHVybiBjb252ZXJ0Q29uZmlnUHJvcGVydHlUeXBlVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIEpjYVBhY2thZ2UuQ1JFREVOVElBTF9JTlRFUkZBQ0VfVFlQRV9PQkpFQ1Q6CisJCQkJcmV0dXJuIGNvbnZlcnRDcmVkZW50aWFsSW50ZXJmYWNlVHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIEpjYVBhY2thZ2UuVFJBTlNBQ1RJT05fU1VQUE9SVF9UWVBFX09CSkVDVDoKKwkJCQlyZXR1cm4gY29udmVydFRyYW5zYWN0aW9uU3VwcG9ydFR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBY3RpdmF0aW9uU3BlYyBjcmVhdGVBY3RpdmF0aW9uU3BlYygpIHsKKwkJQWN0aXZhdGlvblNwZWNJbXBsIGFjdGl2YXRpb25TcGVjID0gbmV3IEFjdGl2YXRpb25TcGVjSW1wbCgpOworCQlyZXR1cm4gYWN0aXZhdGlvblNwZWM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkbWluT2JqZWN0IGNyZWF0ZUFkbWluT2JqZWN0KCkgeworCQlBZG1pbk9iamVjdEltcGwgYWRtaW5PYmplY3QgPSBuZXcgQWRtaW5PYmplY3RJbXBsKCk7CisJCXJldHVybiBhZG1pbk9iamVjdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQXV0aGVudGljYXRpb25NZWNoYW5pc20gY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc20oKSB7CisJCUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbCBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSA9IG5ldyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwoKTsKKwkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb25maWdQcm9wZXJ0eSBjcmVhdGVDb25maWdQcm9wZXJ0eSgpIHsKKwkJQ29uZmlnUHJvcGVydHlJbXBsIGNvbmZpZ1Byb3BlcnR5ID0gbmV3IENvbmZpZ1Byb3BlcnR5SW1wbCgpOworCQlyZXR1cm4gY29uZmlnUHJvcGVydHk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvbm5lY3Rpb25EZWZpbml0aW9uIGNyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uKCkgeworCQlDb25uZWN0aW9uRGVmaW5pdGlvbkltcGwgY29ubmVjdGlvbkRlZmluaXRpb24gPSBuZXcgQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsKCk7CisJCXJldHVybiBjb25uZWN0aW9uRGVmaW5pdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29ubmVjdG9yIGNyZWF0ZUNvbm5lY3RvcigpIHsKKwkJQ29ubmVjdG9ySW1wbCBjb25uZWN0b3IgPSBuZXcgQ29ubmVjdG9ySW1wbCgpOworCQlyZXR1cm4gY29ubmVjdG9yOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvciBjcmVhdGVDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKKwkJQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JJbXBsIGNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yID0gbmV3IENvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCgpOworCQlyZXR1cm4gY29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgY3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlcigpIHsKKwkJSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwgaW5ib3VuZFJlc291cmNlQWRhcHRlciA9IG5ldyBJbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCgpOworCQlyZXR1cm4gaW5ib3VuZFJlc291cmNlQWRhcHRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGljZW5zZSBjcmVhdGVMaWNlbnNlKCkgeworCQlMaWNlbnNlSW1wbCBsaWNlbnNlID0gbmV3IExpY2Vuc2VJbXBsKCk7CisJCXJldHVybiBsaWNlbnNlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNZXNzYWdlQWRhcHRlciBjcmVhdGVNZXNzYWdlQWRhcHRlcigpIHsKKwkJTWVzc2FnZUFkYXB0ZXJJbXBsIG1lc3NhZ2VBZGFwdGVyID0gbmV3IE1lc3NhZ2VBZGFwdGVySW1wbCgpOworCQlyZXR1cm4gbWVzc2FnZUFkYXB0ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE1lc3NhZ2VMaXN0ZW5lciBjcmVhdGVNZXNzYWdlTGlzdGVuZXIoKSB7CisJCU1lc3NhZ2VMaXN0ZW5lckltcGwgbWVzc2FnZUxpc3RlbmVyID0gbmV3IE1lc3NhZ2VMaXN0ZW5lckltcGwoKTsKKwkJcmV0dXJuIG1lc3NhZ2VMaXN0ZW5lcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSB7CisJCU91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCBvdXRib3VuZFJlc291cmNlQWRhcHRlciA9IG5ldyBPdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwoKTsKKwkJcmV0dXJuIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5IGNyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKSB7CisJCVJlcXVpcmVkQ29uZmlnUHJvcGVydHlJbXBsIHJlcXVpcmVkQ29uZmlnUHJvcGVydHkgPSBuZXcgUmVxdWlyZWRDb25maWdQcm9wZXJ0eUltcGwoKTsKKwkJcmV0dXJuIHJlcXVpcmVkQ29uZmlnUHJvcGVydHk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlc291cmNlQWRhcHRlciBjcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKSB7CisJCVJlc291cmNlQWRhcHRlckltcGwgcmVzb3VyY2VBZGFwdGVyID0gbmV3IFJlc291cmNlQWRhcHRlckltcGwoKTsKKwkJcmV0dXJuIHJlc291cmNlQWRhcHRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU2VjdXJpdHlQZXJtaXNzaW9uIGNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbigpIHsKKwkJU2VjdXJpdHlQZXJtaXNzaW9uSW1wbCBzZWN1cml0eVBlcm1pc3Npb24gPSBuZXcgU2VjdXJpdHlQZXJtaXNzaW9uSW1wbCgpOworCQlyZXR1cm4gc2VjdXJpdHlQZXJtaXNzaW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb25maWdQcm9wZXJ0eVR5cGVUeXBlIGNyZWF0ZUNvbmZpZ1Byb3BlcnR5VHlwZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJQ29uZmlnUHJvcGVydHlUeXBlVHlwZSByZXN1bHQgPSBDb25maWdQcm9wZXJ0eVR5cGVUeXBlLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb25maWdQcm9wZXJ0eVR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlIGNyZWF0ZUNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCUNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlIHJlc3VsdCA9IENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDcmVkZW50aWFsSW50ZXJmYWNlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUcmFuc2FjdGlvblN1cHBvcnRUeXBlIGNyZWF0ZVRyYW5zYWN0aW9uU3VwcG9ydFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJVHJhbnNhY3Rpb25TdXBwb3J0VHlwZSByZXN1bHQgPSBUcmFuc2FjdGlvblN1cHBvcnRUeXBlLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUcmFuc2FjdGlvblN1cHBvcnRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjcmVhdGVDb25maWdQcm9wZXJ0eU5hbWVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLlNUUklORywgaW5pdGlhbFZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb25maWdQcm9wZXJ0eU5hbWVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuU1RSSU5HLCBpbnN0YW5jZVZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29uZmlnUHJvcGVydHlUeXBlVHlwZSBjcmVhdGVDb25maWdQcm9wZXJ0eVR5cGVUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXJldHVybiBjcmVhdGVDb25maWdQcm9wZXJ0eVR5cGVUeXBlRnJvbVN0cmluZyhKY2FQYWNrYWdlLkxpdGVyYWxzLkNPTkZJR19QUk9QRVJUWV9UWVBFX1RZUEUsIGluaXRpYWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0Q29uZmlnUHJvcGVydHlUeXBlVHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBjb252ZXJ0Q29uZmlnUHJvcGVydHlUeXBlVHlwZVRvU3RyaW5nKEpjYVBhY2thZ2UuTGl0ZXJhbHMuQ09ORklHX1BST1BFUlRZX1RZUEVfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlIGNyZWF0ZUNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXJldHVybiBjcmVhdGVDcmVkZW50aWFsSW50ZXJmYWNlVHlwZUZyb21TdHJpbmcoSmNhUGFja2FnZS5MaXRlcmFscy5DUkVERU5USUFMX0lOVEVSRkFDRV9UWVBFLCBpbml0aWFsVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGNvbnZlcnRDcmVkZW50aWFsSW50ZXJmYWNlVHlwZVRvU3RyaW5nKEpjYVBhY2thZ2UuTGl0ZXJhbHMuQ1JFREVOVElBTF9JTlRFUkZBQ0VfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRyYW5zYWN0aW9uU3VwcG9ydFR5cGUgY3JlYXRlVHJhbnNhY3Rpb25TdXBwb3J0VHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlyZXR1cm4gY3JlYXRlVHJhbnNhY3Rpb25TdXBwb3J0VHlwZUZyb21TdHJpbmcoSmNhUGFja2FnZS5MaXRlcmFscy5UUkFOU0FDVElPTl9TVVBQT1JUX1RZUEUsIGluaXRpYWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0VHJhbnNhY3Rpb25TdXBwb3J0VHlwZU9iamVjdFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25TdXBwb3J0VHlwZVRvU3RyaW5nKEpjYVBhY2thZ2UuTGl0ZXJhbHMuVFJBTlNBQ1RJT05fU1VQUE9SVF9UWVBFLCBpbnN0YW5jZVZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSmNhUGFja2FnZSBnZXRKY2FQYWNrYWdlKCkgeworCQlyZXR1cm4gKEpjYVBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBKY2FQYWNrYWdlIGdldFBhY2thZ2UoKSB7CisJCXJldHVybiBKY2FQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CisKK30gLy9KY2FGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9KY2FQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9KY2FQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NjYyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL0pjYVBhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwyMTcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLm5hbWVzcGFjZS5YTUxOYW1lc3BhY2VQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUluaXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFjdGl2YXRpb25TcGVjOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFkbWluT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5VHlwZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuSmNhRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5MaWNlbnNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk1lc3NhZ2VBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlc291cmNlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0VHlwZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgSmNhUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBKY2FQYWNrYWdlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhY3RpdmF0aW9uU3BlY0VDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhZG1pbk9iamVjdEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjb25maWdQcm9wZXJ0eUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjb25uZWN0b3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBsaWNlbnNlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG1lc3NhZ2VBZGFwdGVyRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG1lc3NhZ2VMaXN0ZW5lckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyByZXF1aXJlZENvbmZpZ1Byb3BlcnR5RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHJlc291cmNlQWRhcHRlckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBjb25maWdQcm9wZXJ0eVR5cGVUeXBlRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBjcmVkZW50aWFsSW50ZXJmYWNlVHlwZUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gdHJhbnNhY3Rpb25TdXBwb3J0VHlwZUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRURhdGFUeXBlIGNvbmZpZ1Byb3BlcnR5TmFtZVR5cGVFRGF0YVR5cGUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRGF0YVR5cGUgY29uZmlnUHJvcGVydHlUeXBlVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVEYXRhVHlwZSBjcmVkZW50aWFsSW50ZXJmYWNlVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVEYXRhVHlwZSB0cmFuc2FjdGlvblN1cHBvcnRUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKKwkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQorCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgorCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKKwkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcworCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCisJICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEpjYVBhY2thZ2VJbXBsKCkgeworCQlzdXBlcihlTlNfVVJJLCBKY2FGYWN0b3J5LmVJTlNUQU5DRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSB2b2xhdGlsZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgorCSAqIAorCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgSmNhUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZU5TX1VSSQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgSmNhUGFja2FnZSBpbml0KCkgeworCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoSmNhUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgSmNhUGFja2FnZUltcGwoKSk7CisKKwkJaXNJbml0ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcworCQlYTUxOYW1lc3BhY2VQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCisJCXRoZUpjYVBhY2thZ2UuZnJlZXplKCk7CisKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoSmNhUGFja2FnZS5lTlNfVVJJLCB0aGVKY2FQYWNrYWdlKTsKKworCQlKMkVFSW5pdC5pbml0RU1GTW9kZWxzKCk7CisJCXJldHVybiB0aGVKY2FQYWNrYWdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZhdGlvblNwZWMoKSB7CisJCXJldHVybiBhY3RpdmF0aW9uU3BlY0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uc3BlY0NsYXNzKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZhdGlvblNwZWNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3RpdmF0aW9uU3BlY19SZXF1aXJlZENvbmZpZ1Byb3BlcnR5KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYWN0aXZhdGlvblNwZWNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3RpdmF0aW9uU3BlY19Db25maWdQcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWFjdGl2YXRpb25TcGVjRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZhdGlvblNwZWNfSWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhY3RpdmF0aW9uU3BlY0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QWRtaW5PYmplY3QoKSB7CisJCXJldHVybiBhZG1pbk9iamVjdEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBZG1pbk9iamVjdF9BZG1pbm9iamVjdEludGVyZmFjZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFkbWluT2JqZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWRtaW5PYmplY3RfQWRtaW5vYmplY3RDbGFzcygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFkbWluT2JqZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QWRtaW5PYmplY3RfQ29uZmlnUHJvcGVydHkoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlhZG1pbk9iamVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEFkbWluT2JqZWN0X0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWRtaW5PYmplY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkgeworCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb24oKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQ3JlZGVudGlhbEludGVyZmFjZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fSWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Q29uZmlnUHJvcGVydHkoKSB7CisJCXJldHVybiBjb25maWdQcm9wZXJ0eUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlOYW1lKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29uZmlnUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25maWdQcm9wZXJ0eV9Db25maWdQcm9wZXJ0eVR5cGUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljb25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5VmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljb25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5SWdub3JlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29uZmlnUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25maWdQcm9wZXJ0eV9Db25maWdQcm9wZXJ0eVN1cHBvcnRzRHluYW1pY1VwZGF0ZXMoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljb25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29uZmlnUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25maWdQcm9wZXJ0eV9JZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbm5lY3Rpb25EZWZpbml0aW9uX01hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25maWdQcm9wZXJ0eSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbmZhY3RvcnlJbnRlcmZhY2UoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW50ZXJmYWNlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9JZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDb25uZWN0b3IoKSB7CisJCXJldHVybiBjb25uZWN0b3JFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX01vZHVsZU5hbWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljb25uZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25uZWN0b3JfRGVzY3JpcHRpb25zKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29ubmVjdG9yX0Rpc3BsYXlOYW1lcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbm5lY3Rvcl9JY29ucygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9WZW5kb3JOYW1lKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX0Vpc1R5cGUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljb25uZWN0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0b3JfUmVzb3VyY2VhZGFwdGVyVmVyc2lvbigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbm5lY3Rvcl9MaWNlbnNlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29ubmVjdG9yX1Jlc291cmNlYWRhcHRlcigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9SZXF1aXJlZFdvcmtDb250ZXh0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9NZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9WZXJzaW9uKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29ubmVjdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Q29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IoKSB7CisJCXJldHVybiBjb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSljb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcl9Db25uZWN0b3IoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSljb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpIHsKKwkJcmV0dXJuIGluYm91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcl9NZXNzYWdlYWRhcHRlcigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWluYm91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0TGljZW5zZSgpIHsKKwkJcmV0dXJuIGxpY2Vuc2VFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0TGljZW5zZV9EZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWxpY2Vuc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaWNlbnNlX0xpY2Vuc2VSZXF1aXJlZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWxpY2Vuc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaWNlbnNlX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGljZW5zZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0TWVzc2FnZUFkYXB0ZXIoKSB7CisJCXJldHVybiBtZXNzYWdlQWRhcHRlckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXNzYWdlQWRhcHRlcl9NZXNzYWdlbGlzdGVuZXIoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSltZXNzYWdlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VBZGFwdGVyX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWVzc2FnZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldE1lc3NhZ2VMaXN0ZW5lcigpIHsKKwkJcmV0dXJuIG1lc3NhZ2VMaXN0ZW5lckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXNzYWdlTGlzdGVuZXJfTWVzc2FnZWxpc3RlbmVyVHlwZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VMaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1lc3NhZ2VMaXN0ZW5lcl9BY3RpdmF0aW9uc3BlYygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKW1lc3NhZ2VMaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldE1lc3NhZ2VMaXN0ZW5lcl9JZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKW1lc3NhZ2VMaXN0ZW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSB7CisJCXJldHVybiBvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRGVmaW5pdGlvbigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKW91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKW91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKSB7CisJCXJldHVybiByZXF1aXJlZENvbmZpZ1Byb3BlcnR5RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlyZXF1aXJlZENvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eV9Db25maWdQcm9wZXJ0eU5hbWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyZXF1aXJlZENvbmZpZ1Byb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eV9JZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXJlcXVpcmVkQ29uZmlnUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlQWRhcHRlcigpIHsKKwkJcmV0dXJuIHJlc291cmNlQWRhcHRlckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VhZGFwdGVyQ2xhc3MoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUFkYXB0ZXJfQ29uZmlnUHJvcGVydHkoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlYWRhcHRlcigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlQWRhcHRlcl9BZG1pbm9iamVjdCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlQWRhcHRlcl9TZWN1cml0eVBlcm1pc3Npb24oKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUFkYXB0ZXJfSWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFNlY3VyaXR5UGVybWlzc2lvbigpIHsKKwkJcmV0dXJuIHNlY3VyaXR5UGVybWlzc2lvbkVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZWN1cml0eVBlcm1pc3Npb25fRGVzY3JpcHRpb24oKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVBlcm1pc3Npb25fU2VjdXJpdHlQZXJtaXNzaW9uU3BlYygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3VyaXR5UGVybWlzc2lvbl9JZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRDb25maWdQcm9wZXJ0eVR5cGVUeXBlKCkgeworCQlyZXR1cm4gY29uZmlnUHJvcGVydHlUeXBlVHlwZUVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRDcmVkZW50aWFsSW50ZXJmYWNlVHlwZSgpIHsKKwkJcmV0dXJuIGNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVFbnVtIGdldFRyYW5zYWN0aW9uU3VwcG9ydFR5cGUoKSB7CisJCXJldHVybiB0cmFuc2FjdGlvblN1cHBvcnRUeXBlRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRDb25maWdQcm9wZXJ0eU5hbWVUeXBlKCkgeworCQlyZXR1cm4gY29uZmlnUHJvcGVydHlOYW1lVHlwZUVEYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRURhdGFUeXBlIGdldENvbmZpZ1Byb3BlcnR5VHlwZVR5cGVPYmplY3QoKSB7CisJCXJldHVybiBjb25maWdQcm9wZXJ0eVR5cGVUeXBlT2JqZWN0RURhdGFUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q3JlZGVudGlhbEludGVyZmFjZVR5cGVPYmplY3QoKSB7CisJCXJldHVybiBjcmVkZW50aWFsSW50ZXJmYWNlVHlwZU9iamVjdEVEYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRURhdGFUeXBlIGdldFRyYW5zYWN0aW9uU3VwcG9ydFR5cGVPYmplY3QoKSB7CisJCXJldHVybiB0cmFuc2FjdGlvblN1cHBvcnRUeXBlT2JqZWN0RURhdGFUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBKY2FGYWN0b3J5IGdldEpjYUZhY3RvcnkoKSB7CisJCXJldHVybiAoSmNhRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOworCisJLyoqCisJICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCisJICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOworCQlpc0NyZWF0ZWQgPSB0cnVlOworCisJCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcworCQlhY3RpdmF0aW9uU3BlY0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVkFUSU9OX1NQRUMpOworCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2YXRpb25TcGVjRUNsYXNzLCBBQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05TUEVDX0NMQVNTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShhY3RpdmF0aW9uU3BlY0VDbGFzcywgQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFkpOworCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2YXRpb25TcGVjRUNsYXNzLCBBQ1RJVkFUSU9OX1NQRUNfX0NPTkZJR19QUk9QRVJUWSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZhdGlvblNwZWNFQ2xhc3MsIEFDVElWQVRJT05fU1BFQ19fSUQpOworCisJCWFkbWluT2JqZWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFETUlOX09CSkVDVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYWRtaW5PYmplY3RFQ2xhc3MsIEFETUlOX09CSkVDVF9fQURNSU5PQkpFQ1RfSU5URVJGQUNFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhZG1pbk9iamVjdEVDbGFzcywgQURNSU5fT0JKRUNUX19BRE1JTk9CSkVDVF9DTEFTUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoYWRtaW5PYmplY3RFQ2xhc3MsIEFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhZG1pbk9iamVjdEVDbGFzcywgQURNSU5fT0JKRUNUX19JRCk7CisKKwkJYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcywgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MsIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEUpOworCQljcmVhdGVFQXR0cmlidXRlKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0NSRURFTlRJQUxfSU5URVJGQUNFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcywgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19JRCk7CisKKwkJY29uZmlnUHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09ORklHX1BST1BFUlRZKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShjb25maWdQcm9wZXJ0eUVDbGFzcywgQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY29uZmlnUHJvcGVydHlFQ2xhc3MsIENPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX05BTUUpOworCQljcmVhdGVFQXR0cmlidXRlKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9UWVBFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb25maWdQcm9wZXJ0eUVDbGFzcywgQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9JR05PUkUpOworCQljcmVhdGVFQXR0cmlidXRlKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9TVVBQT1JUU19EWU5BTUlDX1VQREFURVMpOworCQljcmVhdGVFQXR0cmlidXRlKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9DT05GSURFTlRJQUwpOworCQljcmVhdGVFQXR0cmlidXRlKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDT05GSUdfUFJPUEVSVFlfX0lEKTsKKworCQljb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05ORUNUSU9OX0RFRklOSVRJT04pOworCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLCBDT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURDT05ORUNUSU9ORkFDVE9SWV9DTEFTUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MsIENPTk5FQ1RJT05fREVGSU5JVElPTl9fQ09ORklHX1BST1BFUlRZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcywgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9ORkFDVE9SWV9JTlRFUkZBQ0UpOworCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05GQUNUT1JZX0lNUExfQ0xBU1MpOworCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU5URVJGQUNFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcywgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lNUExfQ0xBU1MpOworCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0lEKTsKKworCQljb25uZWN0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OTkVDVE9SKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fTU9EVUxFX05BTUUpOworCQljcmVhdGVFUmVmZXJlbmNlKGNvbm5lY3RvckVDbGFzcywgQ09OTkVDVE9SX19ERVNDUklQVElPTlMpOworCQljcmVhdGVFUmVmZXJlbmNlKGNvbm5lY3RvckVDbGFzcywgQ09OTkVDVE9SX19ESVNQTEFZX05BTUVTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fSUNPTlMpOworCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3RvckVDbGFzcywgQ09OTkVDVE9SX19WRU5ET1JfTkFNRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY29ubmVjdG9yRUNsYXNzLCBDT05ORUNUT1JfX0VJU19UWVBFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fUkVTT1VSQ0VBREFQVEVSX1ZFUlNJT04pOworCQljcmVhdGVFUmVmZXJlbmNlKGNvbm5lY3RvckVDbGFzcywgQ09OTkVDVE9SX19MSUNFTlNFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fUkVTT1VSQ0VBREFQVEVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fUkVRVUlSRURfV09SS19DT05URVhUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb25uZWN0b3JFQ2xhc3MsIENPTk5FQ1RPUl9fSUQpOworCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3RvckVDbGFzcywgQ09OTkVDVE9SX19NRVRBREFUQV9DT01QTEVURSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY29ubmVjdG9yRUNsYXNzLCBDT05ORUNUT1JfX1ZFUlNJT04pOworCisJCWNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1IpOworCQljcmVhdGVFQXR0cmlidXRlKGNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBDT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoY29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIENPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVApOworCQljcmVhdGVFUmVmZXJlbmNlKGNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBDT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShjb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgQ09OTkVDVE9SX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fQ09OTkVDVE9SKTsKKworCQlpbmJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKElOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUik7CisJCWNyZWF0ZUVSZWZlcmVuY2UoaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFQURBUFRFUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19JRCk7CisKKwkJbGljZW5zZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMSUNFTlNFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShsaWNlbnNlRUNsYXNzLCBMSUNFTlNFX19ERVNDUklQVElPTik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUobGljZW5zZUVDbGFzcywgTElDRU5TRV9fTElDRU5TRV9SRVFVSVJFRCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUobGljZW5zZUVDbGFzcywgTElDRU5TRV9fSUQpOworCisJCW1lc3NhZ2VBZGFwdGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FU1NBR0VfQURBUFRFUik7CisJCWNyZWF0ZUVSZWZlcmVuY2UobWVzc2FnZUFkYXB0ZXJFQ2xhc3MsIE1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRUxJU1RFTkVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShtZXNzYWdlQWRhcHRlckVDbGFzcywgTUVTU0FHRV9BREFQVEVSX19JRCk7CisKKwkJbWVzc2FnZUxpc3RlbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FU1NBR0VfTElTVEVORVIpOworCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VMaXN0ZW5lckVDbGFzcywgTUVTU0FHRV9MSVNURU5FUl9fTUVTU0FHRUxJU1RFTkVSX1RZUEUpOworCQljcmVhdGVFUmVmZXJlbmNlKG1lc3NhZ2VMaXN0ZW5lckVDbGFzcywgTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTlNQRUMpOworCQljcmVhdGVFQXR0cmlidXRlKG1lc3NhZ2VMaXN0ZW5lckVDbGFzcywgTUVTU0FHRV9MSVNURU5FUl9fSUQpOworCisJCW91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIpOworCQljcmVhdGVFUmVmZXJlbmNlKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT04pOworCQljcmVhdGVFQXR0cmlidXRlKG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fSUQpOworCisJCXJlcXVpcmVkQ29uZmlnUHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVRVUlSRURfQ09ORklHX1BST1BFUlRZKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyZXF1aXJlZENvbmZpZ1Byb3BlcnR5RUNsYXNzLCBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShyZXF1aXJlZENvbmZpZ1Byb3BlcnR5RUNsYXNzLCBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9OQU1FKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShyZXF1aXJlZENvbmZpZ1Byb3BlcnR5RUNsYXNzLCBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfX0lEKTsKKworCQlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVTT1VSQ0VfQURBUFRFUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19SRVNPVVJDRUFEQVBURVJfQ0xBU1MpOworCQljcmVhdGVFUmVmZXJlbmNlKHJlc291cmNlQWRhcHRlckVDbGFzcywgUkVTT1VSQ0VfQURBUFRFUl9fQ09ORklHX1BST1BFUlRZKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFQURBUFRFUik7CisJCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFQURBUFRFUik7CisJCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19BRE1JTk9CSkVDVCk7CisJCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIFJFU09VUkNFX0FEQVBURVJfX0lEKTsKKworCQlzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VDVVJJVFlfUEVSTUlTU0lPTik7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzLCBTRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzLCBTRUNVUklUWV9QRVJNSVNTSU9OX19TRUNVUklUWV9QRVJNSVNTSU9OX1NQRUMpOworCQljcmVhdGVFQXR0cmlidXRlKHNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcywgU0VDVVJJVFlfUEVSTUlTU0lPTl9fSUQpOworCisJCS8vIENyZWF0ZSBlbnVtcworCQljb25maWdQcm9wZXJ0eVR5cGVUeXBlRUVudW0gPSBjcmVhdGVFRW51bShDT05GSUdfUFJPUEVSVFlfVFlQRV9UWVBFKTsKKwkJY3JlZGVudGlhbEludGVyZmFjZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKENSRURFTlRJQUxfSU5URVJGQUNFX1RZUEUpOworCQl0cmFuc2FjdGlvblN1cHBvcnRUeXBlRUVudW0gPSBjcmVhdGVFRW51bShUUkFOU0FDVElPTl9TVVBQT1JUX1RZUEUpOworCisJCS8vIENyZWF0ZSBkYXRhIHR5cGVzCisJCWNvbmZpZ1Byb3BlcnR5TmFtZVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoQ09ORklHX1BST1BFUlRZX05BTUVfVFlQRSk7CisJCWNvbmZpZ1Byb3BlcnR5VHlwZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoQ09ORklHX1BST1BFUlRZX1RZUEVfVFlQRV9PQkpFQ1QpOworCQljcmVkZW50aWFsSW50ZXJmYWNlVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShDUkVERU5USUFMX0lOVEVSRkFDRV9UWVBFX09CSkVDVCk7CisJCXRyYW5zYWN0aW9uU3VwcG9ydFR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVFJBTlNBQ1RJT05fU1VQUE9SVF9UWVBFX09CSkVDVCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCUphdmFlZVBhY2thZ2UgdGhlSmF2YWVlUGFja2FnZSA9IChKYXZhZWVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFlZVBhY2thZ2UuZU5TX1VSSSk7CisJCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKKworCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKKworCQlib29sZWFuIGhhc0xvY2sgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCWhhc0xvY2sgPSBKMkVFSW5pdC5hcXVpcmVJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJfQkJCisJCQorCQl0cnl7CisJCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCisJCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQkJaW5pdEVDbGFzcyhhY3RpdmF0aW9uU3BlY0VDbGFzcywgQWN0aXZhdGlvblNwZWMuY2xhc3MsICJBY3RpdmF0aW9uU3BlYyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZhdGlvblNwZWNfQWN0aXZhdGlvbnNwZWNDbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJhY3RpdmF0aW9uc3BlY0NsYXNzIiwgbnVsbCwgMSwgMSwgQWN0aXZhdGlvblNwZWMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFjdGl2YXRpb25TcGVjX1JlcXVpcmVkQ29uZmlnUHJvcGVydHkoKSwgdGhpcy5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5KCksIG51bGwsICJyZXF1aXJlZENvbmZpZ1Byb3BlcnR5IiwgbnVsbCwgMCwgLTEsIEFjdGl2YXRpb25TcGVjLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBY3RpdmF0aW9uU3BlY19Db25maWdQcm9wZXJ0eSgpLCB0aGlzLmdldENvbmZpZ1Byb3BlcnR5KCksIG51bGwsICJjb25maWdQcm9wZXJ0eSIsIG51bGwsIDAsIC0xLCBBY3RpdmF0aW9uU3BlYy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZhdGlvblNwZWNfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQWN0aXZhdGlvblNwZWMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhhZG1pbk9iamVjdEVDbGFzcywgQWRtaW5PYmplY3QuY2xhc3MsICJBZG1pbk9iamVjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWRtaW5PYmplY3RfQWRtaW5vYmplY3RJbnRlcmZhY2UoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiYWRtaW5vYmplY3RJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBBZG1pbk9iamVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWRtaW5PYmplY3RfQWRtaW5vYmplY3RDbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJhZG1pbm9iamVjdENsYXNzIiwgbnVsbCwgMSwgMSwgQWRtaW5PYmplY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnR5KCksIHRoaXMuZ2V0Q29uZmlnUHJvcGVydHkoKSwgbnVsbCwgImNvbmZpZ1Byb3BlcnR5IiwgbnVsbCwgMCwgLTEsIEFkbWluT2JqZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBZG1pbk9iamVjdF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBBZG1pbk9iamVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtRUNsYXNzLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIC0xLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIiwgbnVsbCwgMSwgMSwgQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0NyZWRlbnRpYWxJbnRlcmZhY2UoKSwgdGhpcy5nZXRDcmVkZW50aWFsSW50ZXJmYWNlVHlwZSgpLCAiY3JlZGVudGlhbEludGVyZmFjZSIsIG51bGwsIDEsIDEsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoY29uZmlnUHJvcGVydHlFQ2xhc3MsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAiQ29uZmlnUHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9uKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgLTEsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb25maWdQcm9wZXJ0eV9Db25maWdQcm9wZXJ0eU5hbWUoKSwgdGhpcy5nZXRDb25maWdQcm9wZXJ0eU5hbWVUeXBlKCksICJjb25maWdQcm9wZXJ0eU5hbWUiLCBudWxsLCAxLCAxLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlUeXBlKCksIHRoaXMuZ2V0Q29uZmlnUHJvcGVydHlUeXBlVHlwZSgpLCAiY29uZmlnUHJvcGVydHlUeXBlIiwgbnVsbCwgMSwgMSwgQ29uZmlnUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlWYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvbmZpZ1Byb3BlcnR5VmFsdWUiLCBudWxsLCAwLCAxLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlJZ25vcmUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJjb25maWdQcm9wZXJ0eUlnbm9yZSIsIG51bGwsIDAsIDEsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgImNvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcyIsIG51bGwsIDAsIDEsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAiY29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwiLCBudWxsLCAwLCAxLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb25maWdQcm9wZXJ0eV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGNvbm5lY3Rpb25EZWZpbml0aW9uRUNsYXNzLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIkNvbm5lY3Rpb25EZWZpbml0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9NYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnlDbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnlDbGFzcyIsIG51bGwsIDEsIDEsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25maWdQcm9wZXJ0eSgpLCB0aGlzLmdldENvbmZpZ1Byb3BlcnR5KCksIG51bGwsICJjb25maWdQcm9wZXJ0eSIsIG51bGwsIDAsIC0xLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbmZhY3RvcnlJbnRlcmZhY2UoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiY29ubmVjdGlvbmZhY3RvcnlJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbmZhY3RvcnlJbXBsQ2xhc3MoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiY29ubmVjdGlvbmZhY3RvcnlJbXBsQ2xhc3MiLCBudWxsLCAxLCAxLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkludGVyZmFjZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJjb25uZWN0aW9uSW50ZXJmYWNlIiwgbnVsbCwgMSwgMSwgQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiY29ubmVjdGlvbkltcGxDbGFzcyIsIG51bGwsIDEsIDEsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGNvbm5lY3RvckVDbGFzcywgQ29ubmVjdG9yLmNsYXNzLCAiQ29ubmVjdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0b3JfTW9kdWxlTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1vZHVsZU5hbWUiLCBudWxsLCAwLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldENvbm5lY3Rvcl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29ubmVjdG9yX0Rpc3BsYXlOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRDb25uZWN0b3JfSWNvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rvcl9WZW5kb3JOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmVuZG9yTmFtZSIsIG51bGwsIDAsIDEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdG9yX0Vpc1R5cGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlaXNUeXBlIiwgbnVsbCwgMCwgMSwgQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0b3JfUmVzb3VyY2VhZGFwdGVyVmVyc2lvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc291cmNlYWRhcHRlclZlcnNpb24iLCBudWxsLCAwLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldENvbm5lY3Rvcl9MaWNlbnNlKCksIHRoaXMuZ2V0TGljZW5zZSgpLCBudWxsLCAibGljZW5zZSIsIG51bGwsIDAsIDEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29ubmVjdG9yX1Jlc291cmNlYWRhcHRlcigpLCB0aGlzLmdldFJlc291cmNlQWRhcHRlcigpLCBudWxsLCAicmVzb3VyY2VhZGFwdGVyIiwgbnVsbCwgMSwgMSwgQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0b3JfUmVxdWlyZWRXb3JrQ29udGV4dCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJyZXF1aXJlZFdvcmtDb250ZXh0IiwgbnVsbCwgMCwgLTEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rvcl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdG9yX01ldGFkYXRhQ29tcGxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAibWV0YWRhdGFDb21wbGV0ZSIsIG51bGwsIDAsIDEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0b3JfVmVyc2lvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERld2V5VmVyc2lvblR5cGUoKSwgInZlcnNpb24iLCAiMS42IiwgMSwgMSwgQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQorCQkJaW5pdEVDbGFzcyhjb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IuY2xhc3MsICJDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgIm1peGVkIiwgbnVsbCwgMCwgLTEsIG51bGwsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhNTE5TUHJlZml4TWFwIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4U0lTY2hlbWFMb2NhdGlvbiIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldENvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yX0Nvbm5lY3RvcigpLCB0aGlzLmdldENvbm5lY3RvcigpLCBudWxsLCAiY29ubmVjdG9yIiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgSW5ib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcywgIkluYm91bmRSZXNvdXJjZUFkYXB0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXJfTWVzc2FnZWFkYXB0ZXIoKSwgdGhpcy5nZXRNZXNzYWdlQWRhcHRlcigpLCBudWxsLCAibWVzc2FnZWFkYXB0ZXIiLCBudWxsLCAwLCAxLCBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhsaWNlbnNlRUNsYXNzLCBMaWNlbnNlLmNsYXNzLCAiTGljZW5zZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TGljZW5zZV9EZXNjcmlwdGlvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIC0xLCBMaWNlbnNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRMaWNlbnNlX0xpY2Vuc2VSZXF1aXJlZCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgImxpY2Vuc2VSZXF1aXJlZCIsIG51bGwsIDEsIDEsIExpY2Vuc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGljZW5zZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBMaWNlbnNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MobWVzc2FnZUFkYXB0ZXJFQ2xhc3MsIE1lc3NhZ2VBZGFwdGVyLmNsYXNzLCAiTWVzc2FnZUFkYXB0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VBZGFwdGVyX01lc3NhZ2VsaXN0ZW5lcigpLCB0aGlzLmdldE1lc3NhZ2VMaXN0ZW5lcigpLCBudWxsLCAibWVzc2FnZWxpc3RlbmVyIiwgbnVsbCwgMSwgLTEsIE1lc3NhZ2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlQWRhcHRlcl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXNzYWdlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKG1lc3NhZ2VMaXN0ZW5lckVDbGFzcywgTWVzc2FnZUxpc3RlbmVyLmNsYXNzLCAiTWVzc2FnZUxpc3RlbmVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlTGlzdGVuZXJfTWVzc2FnZWxpc3RlbmVyVHlwZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJtZXNzYWdlbGlzdGVuZXJUeXBlIiwgbnVsbCwgMSwgMSwgTWVzc2FnZUxpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlTGlzdGVuZXJfQWN0aXZhdGlvbnNwZWMoKSwgdGhpcy5nZXRBY3RpdmF0aW9uU3BlYygpLCBudWxsLCAiYWN0aXZhdGlvbnNwZWMiLCBudWxsLCAxLCAxLCBNZXNzYWdlTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VMaXN0ZW5lcl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXNzYWdlTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICJPdXRib3VuZFJlc291cmNlQWRhcHRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkRlZmluaXRpb24oKSwgdGhpcy5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpLCBudWxsLCAiY29ubmVjdGlvbkRlZmluaXRpb24iLCBudWxsLCAwLCAtMSwgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpLCB0aGlzLmdldFRyYW5zYWN0aW9uU3VwcG9ydFR5cGUoKSwgInRyYW5zYWN0aW9uU3VwcG9ydCIsIG51bGwsIDAsIDEsIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCksIHRoaXMuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKSwgbnVsbCwgImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIiwgbnVsbCwgMCwgLTEsIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgInJlYXV0aGVudGljYXRpb25TdXBwb3J0IiwgbnVsbCwgMCwgMSwgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhyZXF1aXJlZENvbmZpZ1Byb3BlcnR5RUNsYXNzLCBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAiUmVxdWlyZWRDb25maWdQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIC0xLCBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5TmFtZSgpLCB0aGlzLmdldENvbmZpZ1Byb3BlcnR5TmFtZVR5cGUoKSwgImNvbmZpZ1Byb3BlcnR5TmFtZSIsIG51bGwsIDEsIDEsIFJlcXVpcmVkQ29uZmlnUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVxdWlyZWRDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHJlc291cmNlQWRhcHRlckVDbGFzcywgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAiUmVzb3VyY2VBZGFwdGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VhZGFwdGVyQ2xhc3MoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAicmVzb3VyY2VhZGFwdGVyQ2xhc3MiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlQWRhcHRlcl9Db25maWdQcm9wZXJ0eSgpLCB0aGlzLmdldENvbmZpZ1Byb3BlcnR5KCksIG51bGwsICJjb25maWdQcm9wZXJ0eSIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlYWRhcHRlcigpLCB0aGlzLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCksIG51bGwsICJvdXRib3VuZFJlc291cmNlYWRhcHRlciIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZWFkYXB0ZXIoKSwgdGhpcy5nZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCksIG51bGwsICJpbmJvdW5kUmVzb3VyY2VhZGFwdGVyIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUFkYXB0ZXJfQWRtaW5vYmplY3QoKSwgdGhpcy5nZXRBZG1pbk9iamVjdCgpLCBudWxsLCAiYWRtaW5vYmplY3QiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUFkYXB0ZXJfU2VjdXJpdHlQZXJtaXNzaW9uKCksIHRoaXMuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uKCksIG51bGwsICJzZWN1cml0eVBlcm1pc3Npb24iLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Moc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzLCBTZWN1cml0eVBlcm1pc3Npb24uY2xhc3MsICJTZWN1cml0eVBlcm1pc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIC0xLCBTZWN1cml0eVBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5UGVybWlzc2lvbl9TZWN1cml0eVBlcm1pc3Npb25TcGVjKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2VjdXJpdHlQZXJtaXNzaW9uU3BlYyIsIG51bGwsIDEsIDEsIFNlY3VyaXR5UGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5UGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscworCQkJaW5pdEVFbnVtKGNvbmZpZ1Byb3BlcnR5VHlwZVR5cGVFRW51bSwgQ29uZmlnUHJvcGVydHlUeXBlVHlwZS5jbGFzcywgIkNvbmZpZ1Byb3BlcnR5VHlwZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKGNvbmZpZ1Byb3BlcnR5VHlwZVR5cGVFRW51bSwgQ29uZmlnUHJvcGVydHlUeXBlVHlwZS5KQVZBX0xBTkdfQk9PTEVBTik7CisJCQlhZGRFRW51bUxpdGVyYWwoY29uZmlnUHJvcGVydHlUeXBlVHlwZUVFbnVtLCBDb25maWdQcm9wZXJ0eVR5cGVUeXBlLkpBVkFfTEFOR19TVFJJTkcpOworCQkJYWRkRUVudW1MaXRlcmFsKGNvbmZpZ1Byb3BlcnR5VHlwZVR5cGVFRW51bSwgQ29uZmlnUHJvcGVydHlUeXBlVHlwZS5KQVZBX0xBTkdfSU5URUdFUik7CisJCQlhZGRFRW51bUxpdGVyYWwoY29uZmlnUHJvcGVydHlUeXBlVHlwZUVFbnVtLCBDb25maWdQcm9wZXJ0eVR5cGVUeXBlLkpBVkFfTEFOR19ET1VCTEUpOworCQkJYWRkRUVudW1MaXRlcmFsKGNvbmZpZ1Byb3BlcnR5VHlwZVR5cGVFRW51bSwgQ29uZmlnUHJvcGVydHlUeXBlVHlwZS5KQVZBX0xBTkdfQllURSk7CisJCQlhZGRFRW51bUxpdGVyYWwoY29uZmlnUHJvcGVydHlUeXBlVHlwZUVFbnVtLCBDb25maWdQcm9wZXJ0eVR5cGVUeXBlLkpBVkFfTEFOR19TSE9SVCk7CisJCQlhZGRFRW51bUxpdGVyYWwoY29uZmlnUHJvcGVydHlUeXBlVHlwZUVFbnVtLCBDb25maWdQcm9wZXJ0eVR5cGVUeXBlLkpBVkFfTEFOR19MT05HKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChjb25maWdQcm9wZXJ0eVR5cGVUeXBlRUVudW0sIENvbmZpZ1Byb3BlcnR5VHlwZVR5cGUuSkFWQV9MQU5HX0ZMT0FUKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChjb25maWdQcm9wZXJ0eVR5cGVUeXBlRUVudW0sIENvbmZpZ1Byb3BlcnR5VHlwZVR5cGUuSkFWQV9MQU5HX0NIQVJBQ1RFUik7CisJCisJCQlpbml0RUVudW0oY3JlZGVudGlhbEludGVyZmFjZVR5cGVFRW51bSwgQ3JlZGVudGlhbEludGVyZmFjZVR5cGUuY2xhc3MsICJDcmVkZW50aWFsSW50ZXJmYWNlVHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwoY3JlZGVudGlhbEludGVyZmFjZVR5cGVFRW51bSwgQ3JlZGVudGlhbEludGVyZmFjZVR5cGUuSkFWQVhfUkVTT1VSQ0VfU1BJX1NFQ1VSSVRZX1BBU1NXT1JEX0NSRURFTlRJQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlRUVudW0sIENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlLk9SR19JRVRGX0pHU1NfR1NTX0NSRURFTlRJQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlRUVudW0sIENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlLkpBVkFYX1JFU09VUkNFX1NQSV9TRUNVUklUWV9HRU5FUklDX0NSRURFTlRJQUwpOworCQorCQkJaW5pdEVFbnVtKHRyYW5zYWN0aW9uU3VwcG9ydFR5cGVFRW51bSwgVHJhbnNhY3Rpb25TdXBwb3J0VHlwZS5jbGFzcywgIlRyYW5zYWN0aW9uU3VwcG9ydFR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uU3VwcG9ydFR5cGVFRW51bSwgVHJhbnNhY3Rpb25TdXBwb3J0VHlwZS5OT19UUkFOU0FDVElPTik7CisJCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25TdXBwb3J0VHlwZUVFbnVtLCBUcmFuc2FjdGlvblN1cHBvcnRUeXBlLkxPQ0FMX1RSQU5TQUNUSU9OKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvblN1cHBvcnRUeXBlRUVudW0sIFRyYW5zYWN0aW9uU3VwcG9ydFR5cGUuWEFfVFJBTlNBQ1RJT04pOworCQorCQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCisJCQlpbml0RURhdGFUeXBlKGNvbmZpZ1Byb3BlcnR5TmFtZVR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkNvbmZpZ1Byb3BlcnR5TmFtZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGNvbmZpZ1Byb3BlcnR5VHlwZVR5cGVPYmplY3RFRGF0YVR5cGUsIENvbmZpZ1Byb3BlcnR5VHlwZVR5cGUuY2xhc3MsICJDb25maWdQcm9wZXJ0eVR5cGVUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlT2JqZWN0RURhdGFUeXBlLCBDcmVkZW50aWFsSW50ZXJmYWNlVHlwZS5jbGFzcywgIkNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKHRyYW5zYWN0aW9uU3VwcG9ydFR5cGVPYmplY3RFRGF0YVR5cGUsIFRyYW5zYWN0aW9uU3VwcG9ydFR5cGUuY2xhc3MsICJUcmFuc2FjdGlvblN1cHBvcnRUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCisJCQkvLyBDcmVhdGUgcmVzb3VyY2UKKwkJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCQorCQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCisJCQkvLyBodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEKKwkJCWNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpOworCQl9ZmluYWxseXsKKwkJCWlmKCBoYXNMb2NrICkKKwkJCQlKMkVFSW5pdC5yZWxlYXNlSW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50c0xvY2soKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+aHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhPC9iPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKSB7CisJCVN0cmluZyBzb3VyY2UgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIjsgLy8kTk9OLU5MUy0xJAkJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChhY3RpdmF0aW9uU3BlY0VDbGFzcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiYWN0aXZhdGlvbnNwZWNUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uc3BlY0NsYXNzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJhY3RpdmF0aW9uc3BlYy1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBY3RpdmF0aW9uU3BlY19SZXF1aXJlZENvbmZpZ1Byb3BlcnR5KCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJyZXF1aXJlZC1jb25maWctcHJvcGVydHkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBY3RpdmF0aW9uU3BlY19Db25maWdQcm9wZXJ0eSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiY29uZmlnLXByb3BlcnR5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QWN0aXZhdGlvblNwZWNfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChhZG1pbk9iamVjdEVDbGFzcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiYWRtaW5vYmplY3RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBZG1pbk9iamVjdF9BZG1pbm9iamVjdEludGVyZmFjZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiYWRtaW5vYmplY3QtaW50ZXJmYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEFkbWluT2JqZWN0X0FkbWlub2JqZWN0Q2xhc3MoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImFkbWlub2JqZWN0LWNsYXNzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QWRtaW5PYmplY3RfQ29uZmlnUHJvcGVydHkoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImNvbmZpZy1wcm9wZXJ0eSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEFkbWluT2JqZWN0X0lkKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgImF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb24oKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJjcmVkZW50aWFsLWludGVyZmFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0lkKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoY29uZmlnUHJvcGVydHlFQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgImNvbmZpZy1wcm9wZXJ0eVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlOYW1lKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJjb25maWctcHJvcGVydHktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5VHlwZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiY29uZmlnLXByb3BlcnR5LXR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlWYWx1ZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiY29uZmlnLXByb3BlcnR5LXZhbHVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5SWdub3JlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJjb25maWctcHJvcGVydHktaWdub3JlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5U3VwcG9ydHNEeW5hbWljVXBkYXRlcygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiY29uZmlnLXByb3BlcnR5LXN1cHBvcnRzLWR5bmFtaWMtdXBkYXRlcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRDb25maWdQcm9wZXJ0eV9Db25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiY29uZmlnLXByb3BlcnR5LWNvbmZpZGVudGlhbCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvbmZpZ1Byb3BlcnR5X0lkKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoY29uZmlnUHJvcGVydHlOYW1lVHlwZUVEYXRhVHlwZSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiY29uZmlnLXByb3BlcnR5LW5hbWVUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChjb25maWdQcm9wZXJ0eVR5cGVUeXBlRUVudW0sIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgImNvbmZpZy1wcm9wZXJ0eS10eXBlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoY29uZmlnUHJvcGVydHlUeXBlVHlwZU9iamVjdEVEYXRhVHlwZSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiY29uZmlnLXByb3BlcnR5LXR5cGVUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJiYXNlVHlwZSIsICJjb25maWctcHJvcGVydHktdHlwZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiY29ubmVjdGlvbi1kZWZpbml0aW9uVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fTWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5Q2xhc3MoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIm1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0NvbmZpZ1Byb3BlcnR5KCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJjb25maWctcHJvcGVydHkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbmZhY3RvcnlJbnRlcmZhY2UoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uZmFjdG9yeUltcGxDbGFzcygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW50ZXJmYWNlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJjb25uZWN0aW9uLWludGVyZmFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJjb25uZWN0aW9uLWltcGwtY2xhc3MiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9JZCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGNvbm5lY3RvckVDbGFzcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiY29ubmVjdG9yVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29ubmVjdG9yX01vZHVsZU5hbWUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIm1vZHVsZS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29ubmVjdG9yX0Rlc2NyaXB0aW9ucygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29ubmVjdG9yX0Rpc3BsYXlOYW1lcygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiZGlzcGxheS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvbm5lY3Rvcl9JY29ucygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWNvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29ubmVjdG9yX1ZlbmRvck5hbWUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInZlbmRvci1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvbm5lY3Rvcl9FaXNUeXBlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJlaXMtdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRDb25uZWN0b3JfUmVzb3VyY2VhZGFwdGVyVmVyc2lvbigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAicmVzb3VyY2VhZGFwdGVyLXZlcnNpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRDb25uZWN0b3JfTGljZW5zZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibGljZW5zZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvbm5lY3Rvcl9SZXNvdXJjZWFkYXB0ZXIoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInJlc291cmNlYWRhcHRlciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRDb25uZWN0b3JfUmVxdWlyZWRXb3JrQ29udGV4dCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAicmVxdWlyZWQtd29yay1jb250ZXh0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29ubmVjdG9yX0lkKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29ubmVjdG9yX01ldGFkYXRhQ29tcGxldGUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibWV0YWRhdGEtY29tcGxldGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRDb25uZWN0b3JfVmVyc2lvbigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJ2ZXJzaW9uIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChjb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImtpbmQiLCAibWl4ZWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnRXaWxkY2FyZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIjptaXhlZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAieG1sbnM6cHJlZml4IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJ4c2k6c2NoZW1hTG9jYXRpb24iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcl9Db25uZWN0b3IoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImNvbm5lY3RvciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChjcmVkZW50aWFsSW50ZXJmYWNlVHlwZUVFbnVtLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJjcmVkZW50aWFsLWludGVyZmFjZVR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlT2JqZWN0RURhdGFUeXBlLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJjcmVkZW50aWFsLWludGVyZmFjZVR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImJhc2VUeXBlIiwgImNyZWRlbnRpYWwtaW50ZXJmYWNlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGluYm91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgImluYm91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX01lc3NhZ2VhZGFwdGVyKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJtZXNzYWdlYWRhcHRlciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXJfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChsaWNlbnNlRUNsYXNzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJsaWNlbnNlVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRMaWNlbnNlX0xpY2Vuc2VSZXF1aXJlZCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibGljZW5zZS1yZXF1aXJlZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldExpY2Vuc2VfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChtZXNzYWdlQWRhcHRlckVDbGFzcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAibWVzc2FnZWFkYXB0ZXJUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldE1lc3NhZ2VBZGFwdGVyX01lc3NhZ2VsaXN0ZW5lcigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibWVzc2FnZWxpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0TWVzc2FnZUFkYXB0ZXJfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChtZXNzYWdlTGlzdGVuZXJFQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgIm1lc3NhZ2VsaXN0ZW5lclR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldE1lc3NhZ2VMaXN0ZW5lcl9NZXNzYWdlbGlzdGVuZXJUeXBlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJtZXNzYWdlbGlzdGVuZXItdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldE1lc3NhZ2VMaXN0ZW5lcl9BY3RpdmF0aW9uc3BlYygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiYWN0aXZhdGlvbnNwZWMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRNZXNzYWdlTGlzdGVuZXJfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAib3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRGVmaW5pdGlvbigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiY29ubmVjdGlvbi1kZWZpbml0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJ0cmFuc2FjdGlvbi1zdXBwb3J0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc20oKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAicmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChyZXF1aXJlZENvbmZpZ1Byb3BlcnR5RUNsYXNzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJyZXF1aXJlZC1jb25maWctcHJvcGVydHlUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eV9Db25maWdQcm9wZXJ0eU5hbWUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImNvbmZpZy1wcm9wZXJ0eS1uYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eV9JZCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKHJlc291cmNlQWRhcHRlckVDbGFzcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAicmVzb3VyY2VhZGFwdGVyVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0UmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlYWRhcHRlckNsYXNzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJyZXNvdXJjZWFkYXB0ZXItY2xhc3MiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRSZXNvdXJjZUFkYXB0ZXJfQ29uZmlnUHJvcGVydHkoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImNvbmZpZy1wcm9wZXJ0eSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlYWRhcHRlcigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAib3V0Ym91bmQtcmVzb3VyY2VhZGFwdGVyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0UmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZWFkYXB0ZXIoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImluYm91bmQtcmVzb3VyY2VhZGFwdGVyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0UmVzb3VyY2VBZGFwdGVyX0FkbWlub2JqZWN0KCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJhZG1pbm9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFJlc291cmNlQWRhcHRlcl9TZWN1cml0eVBlcm1pc3Npb24oKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInNlY3VyaXR5LXBlcm1pc3Npb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRSZXNvdXJjZUFkYXB0ZXJfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgInNlY3VyaXR5LXBlcm1pc3Npb25UeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiZGVzY3JpcHRpb24iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX1NlY3VyaXR5UGVybWlzc2lvblNwZWMoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFNlY3VyaXR5UGVybWlzc2lvbl9JZCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJpZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKHRyYW5zYWN0aW9uU3VwcG9ydFR5cGVFRW51bSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAidHJhbnNhY3Rpb24tc3VwcG9ydFR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKHRyYW5zYWN0aW9uU3VwcG9ydFR5cGVPYmplY3RFRGF0YVR5cGUsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgInRyYW5zYWN0aW9uLXN1cHBvcnRUeXBlOk9iamVjdCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJiYXNlVHlwZSIsICJ0cmFuc2FjdGlvbi1zdXBwb3J0VHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOworCX0KKworfSAvL0pjYVBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL0xpY2Vuc2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL0xpY2Vuc2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmMmRhNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvTGljZW5zZUltcGwuamF2YQpAQCAtMCwwICsxLDMyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTGljZW5zZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MaWNlbnNlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkxpY2Vuc2VJbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5MaWNlbnNlSW1wbCNpc0xpY2Vuc2VSZXF1aXJlZCA8ZW0+TGljZW5zZSBSZXF1aXJlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5MaWNlbnNlSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBMaWNlbnNlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTGljZW5zZSB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb247CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMaWNlbnNlUmVxdWlyZWQoKSA8ZW0+TGljZW5zZSBSZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNMaWNlbnNlUmVxdWlyZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMSUNFTlNFX1JFUVVJUkVEX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xpY2Vuc2VSZXF1aXJlZCgpIDxlbT5MaWNlbnNlIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0xpY2Vuc2VSZXF1aXJlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gbGljZW5zZVJlcXVpcmVkID0gTElDRU5TRV9SRVFVSVJFRF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGljZW5zZSBSZXF1aXJlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gbGljZW5zZVJlcXVpcmVkRVNldDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIExpY2Vuc2VJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5MSUNFTlNFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbigpIHsKKwkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKKwkJCWRlc2NyaXB0aW9uID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTik7CisJCX0KKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTGljZW5zZVJlcXVpcmVkKCkgeworCQlyZXR1cm4gbGljZW5zZVJlcXVpcmVkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldExpY2Vuc2VSZXF1aXJlZChib29sZWFuIG5ld0xpY2Vuc2VSZXF1aXJlZCkgeworCQlib29sZWFuIG9sZExpY2Vuc2VSZXF1aXJlZCA9IGxpY2Vuc2VSZXF1aXJlZDsKKwkJbGljZW5zZVJlcXVpcmVkID0gbmV3TGljZW5zZVJlcXVpcmVkOworCQlib29sZWFuIG9sZExpY2Vuc2VSZXF1aXJlZEVTZXQgPSBsaWNlbnNlUmVxdWlyZWRFU2V0OworCQlsaWNlbnNlUmVxdWlyZWRFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5MSUNFTlNFX19MSUNFTlNFX1JFUVVJUkVELCBvbGRMaWNlbnNlUmVxdWlyZWQsIGxpY2Vuc2VSZXF1aXJlZCwgIW9sZExpY2Vuc2VSZXF1aXJlZEVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldExpY2Vuc2VSZXF1aXJlZCgpIHsKKwkJYm9vbGVhbiBvbGRMaWNlbnNlUmVxdWlyZWQgPSBsaWNlbnNlUmVxdWlyZWQ7CisJCWJvb2xlYW4gb2xkTGljZW5zZVJlcXVpcmVkRVNldCA9IGxpY2Vuc2VSZXF1aXJlZEVTZXQ7CisJCWxpY2Vuc2VSZXF1aXJlZCA9IExJQ0VOU0VfUkVRVUlSRURfRURFRkFVTFQ7CisJCWxpY2Vuc2VSZXF1aXJlZEVTZXQgPSBmYWxzZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKY2FQYWNrYWdlLkxJQ0VOU0VfX0xJQ0VOU0VfUkVRVUlSRUQsIG9sZExpY2Vuc2VSZXF1aXJlZCwgTElDRU5TRV9SRVFVSVJFRF9FREVGQVVMVCwgb2xkTGljZW5zZVJlcXVpcmVkRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0TGljZW5zZVJlcXVpcmVkKCkgeworCQlyZXR1cm4gbGljZW5zZVJlcXVpcmVkRVNldDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7CisJCVN0cmluZyBvbGRJZCA9IGlkOworCQlpZCA9IG5ld0lkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLkxJQ0VOU0VfX0lELCBvbGRJZCwgaWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19MSUNFTlNFX1JFUVVJUkVEOgorCQkJCXJldHVybiBpc0xpY2Vuc2VSZXF1aXJlZCgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0lEOgorCQkJCXJldHVybiBnZXRJZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT046CisJCQkJZ2V0RGVzY3JpcHRpb24oKS5jbGVhcigpOworCQkJCWdldERlc2NyaXB0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19MSUNFTlNFX1JFUVVJUkVEOgorCQkJCXNldExpY2Vuc2VSZXF1aXJlZCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0lEOgorCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT046CisJCQkJZ2V0RGVzY3JpcHRpb24oKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19MSUNFTlNFX1JFUVVJUkVEOgorCQkJCXVuc2V0TGljZW5zZVJlcXVpcmVkKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0lEOgorCQkJCXNldElkKElEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gZGVzY3JpcHRpb24gIT0gbnVsbCAmJiAhZGVzY3JpcHRpb24uaXNFbXB0eSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0xJQ0VOU0VfUkVRVUlSRUQ6CisJCQkJcmV0dXJuIGlzU2V0TGljZW5zZVJlcXVpcmVkKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fSUQ6CisJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChsaWNlbnNlUmVxdWlyZWQ6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChsaWNlbnNlUmVxdWlyZWRFU2V0KSByZXN1bHQuYXBwZW5kKGxpY2Vuc2VSZXF1aXJlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9MaWNlbnNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9NZXNzYWdlQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUFkYXB0ZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkYWZhMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUFkYXB0ZXJJbXBsLmphdmEKQEAgLTAsMCArMSwyMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk1lc3NhZ2VBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIEFkYXB0ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUFkYXB0ZXJJbXBsI2dldE1lc3NhZ2VsaXN0ZW5lciA8ZW0+TWVzc2FnZWxpc3RlbmVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VBZGFwdGVySW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlQWRhcHRlckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE1lc3NhZ2VBZGFwdGVyIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlbGlzdGVuZXIoKSA8ZW0+TWVzc2FnZWxpc3RlbmVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1lc3NhZ2VsaXN0ZW5lcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PE1lc3NhZ2VMaXN0ZW5lcj4gbWVzc2FnZWxpc3RlbmVyOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWVzc2FnZUFkYXB0ZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5NRVNTQUdFX0FEQVBURVI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8TWVzc2FnZUxpc3RlbmVyPiBnZXRNZXNzYWdlbGlzdGVuZXIoKSB7CisJCWlmIChtZXNzYWdlbGlzdGVuZXIgPT0gbnVsbCkgeworCQkJbWVzc2FnZWxpc3RlbmVyID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PE1lc3NhZ2VMaXN0ZW5lcj4oTWVzc2FnZUxpc3RlbmVyLmNsYXNzLCB0aGlzLCBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRUxJU1RFTkVSKTsKKwkJfQorCQlyZXR1cm4gbWVzc2FnZWxpc3RlbmVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKKwkJU3RyaW5nIG9sZElkID0gaWQ7CisJCWlkID0gbmV3SWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19JRCwgb2xkSWQsIGlkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRUxJU1RFTkVSOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWVzc2FnZWxpc3RlbmVyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRUxJU1RFTkVSOgorCQkJCXJldHVybiBnZXRNZXNzYWdlbGlzdGVuZXIoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVJfX0lEOgorCQkJCXJldHVybiBnZXRJZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFTElTVEVORVI6CisJCQkJZ2V0TWVzc2FnZWxpc3RlbmVyKCkuY2xlYXIoKTsKKwkJCQlnZXRNZXNzYWdlbGlzdGVuZXIoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1lc3NhZ2VMaXN0ZW5lcj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVJfX0lEOgorCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFTElTVEVORVI6CisJCQkJZ2V0TWVzc2FnZWxpc3RlbmVyKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19JRDoKKwkJCQlzZXRJZChJRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFTElTVEVORVI6CisJCQkJcmV0dXJuIG1lc3NhZ2VsaXN0ZW5lciAhPSBudWxsICYmICFtZXNzYWdlbGlzdGVuZXIuaXNFbXB0eSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUl9fSUQ6CisJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL01lc3NhZ2VBZGFwdGVySW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9NZXNzYWdlTGlzdGVuZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VMaXN0ZW5lckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmEwOGIxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9NZXNzYWdlTGlzdGVuZXJJbXBsLmphdmEKQEAgLTAsMCArMSwzMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFjdGl2YXRpb25TcGVjOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXNzYWdlIExpc3RlbmVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VMaXN0ZW5lckltcGwjZ2V0TWVzc2FnZWxpc3RlbmVyVHlwZSA8ZW0+TWVzc2FnZWxpc3RlbmVyIFR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUxpc3RlbmVySW1wbCNnZXRBY3RpdmF0aW9uc3BlYyA8ZW0+QWN0aXZhdGlvbnNwZWM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUxpc3RlbmVySW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlTGlzdGVuZXJJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNZXNzYWdlTGlzdGVuZXIgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlbGlzdGVuZXJUeXBlKCkgPGVtPk1lc3NhZ2VsaXN0ZW5lciBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNZXNzYWdlbGlzdGVuZXJUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFTElTVEVORVJfVFlQRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXNzYWdlbGlzdGVuZXJUeXBlKCkgPGVtPk1lc3NhZ2VsaXN0ZW5lciBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNZXNzYWdlbGlzdGVuZXJUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2VsaXN0ZW5lclR5cGUgPSBNRVNTQUdFTElTVEVORVJfVFlQRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2YXRpb25zcGVjKCkgPGVtPkFjdGl2YXRpb25zcGVjPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBY3RpdmF0aW9uc3BlYygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEFjdGl2YXRpb25TcGVjIGFjdGl2YXRpb25zcGVjOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTWVzc2FnZUxpc3RlbmVySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuTUVTU0FHRV9MSVNURU5FUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VsaXN0ZW5lclR5cGUoKSB7CisJCXJldHVybiBtZXNzYWdlbGlzdGVuZXJUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VsaXN0ZW5lclR5cGUoU3RyaW5nIG5ld01lc3NhZ2VsaXN0ZW5lclR5cGUpIHsKKwkJU3RyaW5nIG9sZE1lc3NhZ2VsaXN0ZW5lclR5cGUgPSBtZXNzYWdlbGlzdGVuZXJUeXBlOworCQltZXNzYWdlbGlzdGVuZXJUeXBlID0gbmV3TWVzc2FnZWxpc3RlbmVyVHlwZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFTElTVEVORVJfVFlQRSwgb2xkTWVzc2FnZWxpc3RlbmVyVHlwZSwgbWVzc2FnZWxpc3RlbmVyVHlwZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBY3RpdmF0aW9uU3BlYyBnZXRBY3RpdmF0aW9uc3BlYygpIHsKKwkJcmV0dXJuIGFjdGl2YXRpb25zcGVjOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjdGl2YXRpb25zcGVjKEFjdGl2YXRpb25TcGVjIG5ld0FjdGl2YXRpb25zcGVjLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCUFjdGl2YXRpb25TcGVjIG9sZEFjdGl2YXRpb25zcGVjID0gYWN0aXZhdGlvbnNwZWM7CisJCWFjdGl2YXRpb25zcGVjID0gbmV3QWN0aXZhdGlvbnNwZWM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTlNQRUMsIG9sZEFjdGl2YXRpb25zcGVjLCBuZXdBY3RpdmF0aW9uc3BlYyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWN0aXZhdGlvbnNwZWMoQWN0aXZhdGlvblNwZWMgbmV3QWN0aXZhdGlvbnNwZWMpIHsKKwkJaWYgKG5ld0FjdGl2YXRpb25zcGVjICE9IGFjdGl2YXRpb25zcGVjKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChhY3RpdmF0aW9uc3BlYyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY3RpdmF0aW9uc3BlYykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTlNQRUMsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0FjdGl2YXRpb25zcGVjICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjdGl2YXRpb25zcGVjKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19BQ1RJVkFUSU9OU1BFQywgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRBY3RpdmF0aW9uc3BlYyhuZXdBY3RpdmF0aW9uc3BlYywgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05TUEVDLCBuZXdBY3RpdmF0aW9uc3BlYywgbmV3QWN0aXZhdGlvbnNwZWMpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7CisJCVN0cmluZyBvbGRJZCA9IGlkOworCQlpZCA9IG5ld0lkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0lELCBvbGRJZCwgaWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTlNQRUM6CisJCQkJcmV0dXJuIGJhc2ljU2V0QWN0aXZhdGlvbnNwZWMobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFTElTVEVORVJfVFlQRToKKwkJCQlyZXR1cm4gZ2V0TWVzc2FnZWxpc3RlbmVyVHlwZSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05TUEVDOgorCQkJCXJldHVybiBnZXRBY3RpdmF0aW9uc3BlYygpOworCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0lEOgorCQkJCXJldHVybiBnZXRJZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fTUVTU0FHRUxJU1RFTkVSX1RZUEU6CisJCQkJc2V0TWVzc2FnZWxpc3RlbmVyVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTlNQRUM6CisJCQkJc2V0QWN0aXZhdGlvbnNwZWMoKEFjdGl2YXRpb25TcGVjKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fSUQ6CisJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFTElTVEVORVJfVFlQRToKKwkJCQlzZXRNZXNzYWdlbGlzdGVuZXJUeXBlKE1FU1NBR0VMSVNURU5FUl9UWVBFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTlNQRUM6CisJCQkJc2V0QWN0aXZhdGlvbnNwZWMoKEFjdGl2YXRpb25TcGVjKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19JRDoKKwkJCQlzZXRJZChJRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fTUVTU0FHRUxJU1RFTkVSX1RZUEU6CisJCQkJcmV0dXJuIE1FU1NBR0VMSVNURU5FUl9UWVBFX0VERUZBVUxUID09IG51bGwgPyBtZXNzYWdlbGlzdGVuZXJUeXBlICE9IG51bGwgOiAhTUVTU0FHRUxJU1RFTkVSX1RZUEVfRURFRkFVTFQuZXF1YWxzKG1lc3NhZ2VsaXN0ZW5lclR5cGUpOworCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05TUEVDOgorCQkJCXJldHVybiBhY3RpdmF0aW9uc3BlYyAhPSBudWxsOworCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX0lEOgorCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobWVzc2FnZWxpc3RlbmVyVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChtZXNzYWdlbGlzdGVuZXJUeXBlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL01lc3NhZ2VMaXN0ZW5lckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjA3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsNDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRUeXBlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsI2dldENvbm5lY3Rpb25EZWZpbml0aW9uIDxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsI2dldFRyYW5zYWN0aW9uU3VwcG9ydCA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20gPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBPdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpIDxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxDb25uZWN0aW9uRGVmaW5pdGlvbj4gY29ubmVjdGlvbkRlZmluaXRpb247CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblN1cHBvcnRUeXBlIFRSQU5TQUNUSU9OX1NVUFBPUlRfRURFRkFVTFQgPSBUcmFuc2FjdGlvblN1cHBvcnRUeXBlLk5PX1RSQU5TQUNUSU9OOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRyYW5zYWN0aW9uU3VwcG9ydFR5cGUgdHJhbnNhY3Rpb25TdXBwb3J0ID0gVFJBTlNBQ1RJT05fU1VQUE9SVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVHJhbnNhY3Rpb24gU3VwcG9ydCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdHJhbnNhY3Rpb25TdXBwb3J0RVNldDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtPiBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCkgPGVtPlJlYXV0aGVudGljYXRpb24gU3VwcG9ydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFQVVUSEVOVElDQVRJT05fU1VQUE9SVF9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIDxlbT5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHJlYXV0aGVudGljYXRpb25TdXBwb3J0ID0gUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUX0VERUZBVUxUOworCisJLyoqCisJICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxDb25uZWN0aW9uRGVmaW5pdGlvbj4gZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKSB7CisJCWlmIChjb25uZWN0aW9uRGVmaW5pdGlvbiA9PSBudWxsKSB7CisJCQljb25uZWN0aW9uRGVmaW5pdGlvbiA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxDb25uZWN0aW9uRGVmaW5pdGlvbj4oQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OKTsKKwkJfQorCQlyZXR1cm4gY29ubmVjdGlvbkRlZmluaXRpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRyYW5zYWN0aW9uU3VwcG9ydFR5cGUgZ2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkgeworCQlyZXR1cm4gdHJhbnNhY3Rpb25TdXBwb3J0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uU3VwcG9ydChUcmFuc2FjdGlvblN1cHBvcnRUeXBlIG5ld1RyYW5zYWN0aW9uU3VwcG9ydCkgeworCQlUcmFuc2FjdGlvblN1cHBvcnRUeXBlIG9sZFRyYW5zYWN0aW9uU3VwcG9ydCA9IHRyYW5zYWN0aW9uU3VwcG9ydDsKKwkJdHJhbnNhY3Rpb25TdXBwb3J0ID0gbmV3VHJhbnNhY3Rpb25TdXBwb3J0ID09IG51bGwgPyBUUkFOU0FDVElPTl9TVVBQT1JUX0VERUZBVUxUIDogbmV3VHJhbnNhY3Rpb25TdXBwb3J0OworCQlib29sZWFuIG9sZFRyYW5zYWN0aW9uU3VwcG9ydEVTZXQgPSB0cmFuc2FjdGlvblN1cHBvcnRFU2V0OworCQl0cmFuc2FjdGlvblN1cHBvcnRFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JULCBvbGRUcmFuc2FjdGlvblN1cHBvcnQsIHRyYW5zYWN0aW9uU3VwcG9ydCwgIW9sZFRyYW5zYWN0aW9uU3VwcG9ydEVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldFRyYW5zYWN0aW9uU3VwcG9ydCgpIHsKKwkJVHJhbnNhY3Rpb25TdXBwb3J0VHlwZSBvbGRUcmFuc2FjdGlvblN1cHBvcnQgPSB0cmFuc2FjdGlvblN1cHBvcnQ7CisJCWJvb2xlYW4gb2xkVHJhbnNhY3Rpb25TdXBwb3J0RVNldCA9IHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQ7CisJCXRyYW5zYWN0aW9uU3VwcG9ydCA9IFRSQU5TQUNUSU9OX1NVUFBPUlRfRURFRkFVTFQ7CisJCXRyYW5zYWN0aW9uU3VwcG9ydEVTZXQgPSBmYWxzZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQsIG9sZFRyYW5zYWN0aW9uU3VwcG9ydCwgVFJBTlNBQ1RJT05fU1VQUE9SVF9FREVGQVVMVCwgb2xkVHJhbnNhY3Rpb25TdXBwb3J0RVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0VHJhbnNhY3Rpb25TdXBwb3J0KCkgeworCQlyZXR1cm4gdHJhbnNhY3Rpb25TdXBwb3J0RVNldDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxBdXRoZW50aWNhdGlvbk1lY2hhbmlzbT4gZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKSB7CisJCWlmIChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSA9PSBudWxsKSB7CisJCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxBdXRoZW50aWNhdGlvbk1lY2hhbmlzbT4oQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNKTsKKwkJfQorCQlyZXR1cm4gYXV0aGVudGljYXRpb25NZWNoYW5pc207CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIHsKKwkJcmV0dXJuIHJlYXV0aGVudGljYXRpb25TdXBwb3J0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlYXV0aGVudGljYXRpb25TdXBwb3J0KGJvb2xlYW4gbmV3UmVhdXRoZW50aWNhdGlvblN1cHBvcnQpIHsKKwkJYm9vbGVhbiBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA9IHJlYXV0aGVudGljYXRpb25TdXBwb3J0OworCQlyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA9IG5ld1JlYXV0aGVudGljYXRpb25TdXBwb3J0OworCQlib29sZWFuIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCA9IHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldDsKKwkJcmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQsIG9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0LCByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCwgIW9sZFJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHVuc2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSB7CisJCWJvb2xlYW4gb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnQgPSByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydDsKKwkJYm9vbGVhbiBvbGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQ7CisJCXJlYXV0aGVudGljYXRpb25TdXBwb3J0ID0gUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUX0VERUZBVUxUOworCQlyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQgPSBmYWxzZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCwgb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnQsIFJFQVVUSEVOVElDQVRJT05fU1VQUE9SVF9FREVGQVVMVCwgb2xkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIHsKKwkJcmV0dXJuIHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7CisJCVN0cmluZyBvbGRJZCA9IGlkOworCQlpZCA9IG5ld0lkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0lELCBvbGRJZCwgaWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTToKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fREVGSU5JVElPTjoKKwkJCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUOgorCQkJCXJldHVybiBnZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU006CisJCQkJcmV0dXJuIGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUOgorCQkJCXJldHVybiBpc1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7CisJCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fSUQ6CisJCQkJcmV0dXJuIGdldElkKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT046CisJCQkJZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKS5jbGVhcigpOworCQkJCWdldENvbm5lY3Rpb25EZWZpbml0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb25uZWN0aW9uRGVmaW5pdGlvbj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUOgorCQkJCXNldFRyYW5zYWN0aW9uU3VwcG9ydCgoVHJhbnNhY3Rpb25TdXBwb3J0VHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTToKKwkJCQlnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpLmNsZWFyKCk7CisJCQkJZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVDoKKwkJCQlzZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0lEOgorCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OOgorCQkJCWdldENvbm5lY3Rpb25EZWZpbml0aW9uKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVDoKKwkJCQl1bnNldFRyYW5zYWN0aW9uU3VwcG9ydCgpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU006CisJCQkJZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQ6CisJCQkJdW5zZXRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19JRDoKKwkJCQlzZXRJZChJRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OOgorCQkJCXJldHVybiBjb25uZWN0aW9uRGVmaW5pdGlvbiAhPSBudWxsICYmICFjb25uZWN0aW9uRGVmaW5pdGlvbi5pc0VtcHR5KCk7CisJCQljYXNlIEpjYVBhY2thZ2UuT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVDoKKwkJCQlyZXR1cm4gaXNTZXRUcmFuc2FjdGlvblN1cHBvcnQoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU006CisJCQkJcmV0dXJuIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtICE9IG51bGwgJiYgIWF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmlzRW1wdHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQ6CisJCQkJcmV0dXJuIGlzU2V0UmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19JRDoKKwkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHRyYW5zYWN0aW9uU3VwcG9ydDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25TdXBwb3J0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCkgcmVzdWx0LmFwcGVuZChyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvUmVxdWlyZWRDb25maWdQcm9wZXJ0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvUmVxdWlyZWRDb25maWdQcm9wZXJ0eUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2RhYTRkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5SW1wbC5qYXZhCkBAIC0wLDAgKzEsMjg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5SW1wbCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuUmVxdWlyZWRDb25maWdQcm9wZXJ0eUltcGwjZ2V0Q29uZmlnUHJvcGVydHlOYW1lIDxlbT5Db25maWcgUHJvcGVydHkgTmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5SW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmVxdWlyZWRDb25maWdQcm9wZXJ0eSB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb247CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnUHJvcGVydHlOYW1lKCkgPGVtPkNvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb25maWdQcm9wZXJ0eU5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19QUk9QRVJUWV9OQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmZpZ1Byb3BlcnR5TmFtZSgpIDxlbT5Db25maWcgUHJvcGVydHkgTmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Q29uZmlnUHJvcGVydHlOYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGNvbmZpZ1Byb3BlcnR5TmFtZSA9IENPTkZJR19QUk9QRVJUWV9OQU1FX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUmVxdWlyZWRDb25maWdQcm9wZXJ0eUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb24oKSB7CisJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7CisJCQlkZXNjcmlwdGlvbiA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTik7CisJCX0KKwkJcmV0dXJuIGRlc2NyaXB0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnUHJvcGVydHlOYW1lKCkgeworCQlyZXR1cm4gY29uZmlnUHJvcGVydHlOYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbmZpZ1Byb3BlcnR5TmFtZShTdHJpbmcgbmV3Q29uZmlnUHJvcGVydHlOYW1lKSB7CisJCVN0cmluZyBvbGRDb25maWdQcm9wZXJ0eU5hbWUgPSBjb25maWdQcm9wZXJ0eU5hbWU7CisJCWNvbmZpZ1Byb3BlcnR5TmFtZSA9IG5ld0NvbmZpZ1Byb3BlcnR5TmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9OQU1FLCBvbGRDb25maWdQcm9wZXJ0eU5hbWUsIGNvbmZpZ1Byb3BlcnR5TmFtZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKKwkJU3RyaW5nIG9sZElkID0gaWQ7CisJCWlkID0gbmV3SWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX19JRCwgb2xkSWQsIGlkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX05BTUU6CisJCQkJcmV0dXJuIGdldENvbmZpZ1Byb3BlcnR5TmFtZSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9fSUQ6CisJCQkJcmV0dXJuIGdldElkKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OOgorCQkJCWdldERlc2NyaXB0aW9uKCkuY2xlYXIoKTsKKwkJCQlnZXREZXNjcmlwdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfTkFNRToKKwkJCQlzZXRDb25maWdQcm9wZXJ0eU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9fSUQ6CisJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OOgorCQkJCWdldERlc2NyaXB0aW9uKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfTkFNRToKKwkJCQlzZXRDb25maWdQcm9wZXJ0eU5hbWUoQ09ORklHX1BST1BFUlRZX05BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfX0lEOgorCQkJCXNldElkKElEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBkZXNjcmlwdGlvbiAhPSBudWxsICYmICFkZXNjcmlwdGlvbi5pc0VtcHR5KCk7CisJCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfTkFNRToKKwkJCQlyZXR1cm4gQ09ORklHX1BST1BFUlRZX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNvbmZpZ1Byb3BlcnR5TmFtZSAhPSBudWxsIDogIUNPTkZJR19QUk9QRVJUWV9OQU1FX0VERUZBVUxULmVxdWFscyhjb25maWdQcm9wZXJ0eU5hbWUpOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9fSUQ6CisJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChjb25maWdQcm9wZXJ0eU5hbWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoY29uZmlnUHJvcGVydHlOYW1lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1JlcXVpcmVkQ29uZmlnUHJvcGVydHlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YTI1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlQWRhcHRlckltcGwuamF2YQpAQCAtMCwwICsxLDQ5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWRtaW5PYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXNvdXJjZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIEFkYXB0ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuUmVzb3VyY2VBZGFwdGVySW1wbCNnZXRSZXNvdXJjZWFkYXB0ZXJDbGFzcyA8ZW0+UmVzb3VyY2VhZGFwdGVyIENsYXNzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLlJlc291cmNlQWRhcHRlckltcGwjZ2V0Q29uZmlnUHJvcGVydHkgPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUFkYXB0ZXJJbXBsI2dldE91dGJvdW5kUmVzb3VyY2VhZGFwdGVyIDxlbT5PdXRib3VuZCBSZXNvdXJjZWFkYXB0ZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuUmVzb3VyY2VBZGFwdGVySW1wbCNnZXRJbmJvdW5kUmVzb3VyY2VhZGFwdGVyIDxlbT5JbmJvdW5kIFJlc291cmNlYWRhcHRlcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUFkYXB0ZXJJbXBsI2dldEFkbWlub2JqZWN0IDxlbT5BZG1pbm9iamVjdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUFkYXB0ZXJJbXBsI2dldFNlY3VyaXR5UGVybWlzc2lvbiA8ZW0+U2VjdXJpdHkgUGVybWlzc2lvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUFkYXB0ZXJJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlQWRhcHRlckltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlc291cmNlQWRhcHRlciB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlYWRhcHRlckNsYXNzKCkgPGVtPlJlc291cmNlYWRhcHRlciBDbGFzczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVzb3VyY2VhZGFwdGVyQ2xhc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFQURBUFRFUl9DTEFTU19FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZWFkYXB0ZXJDbGFzcygpIDxlbT5SZXNvdXJjZWFkYXB0ZXIgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFJlc291cmNlYWRhcHRlckNsYXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlYWRhcHRlckNsYXNzID0gUkVTT1VSQ0VBREFQVEVSX0NMQVNTX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uZmlnUHJvcGVydHkoKSA8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8Q29uZmlnUHJvcGVydHk+IGNvbmZpZ1Byb3BlcnR5OworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIoKSA8ZW0+T3V0Ym91bmQgUmVzb3VyY2VhZGFwdGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPdXRib3VuZFJlc291cmNlYWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIG91dGJvdW5kUmVzb3VyY2VhZGFwdGVyOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5ib3VuZFJlc291cmNlYWRhcHRlcigpIDxlbT5JbmJvdW5kIFJlc291cmNlYWRhcHRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW5ib3VuZFJlc291cmNlYWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgaW5ib3VuZFJlc291cmNlYWRhcHRlcjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkbWlub2JqZWN0KCkgPGVtPkFkbWlub2JqZWN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFkbWlub2JqZWN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8QWRtaW5PYmplY3Q+IGFkbWlub2JqZWN0OworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdXJpdHlQZXJtaXNzaW9uKCkgPGVtPlNlY3VyaXR5IFBlcm1pc3Npb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2VjdXJpdHlQZXJtaXNzaW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8U2VjdXJpdHlQZXJtaXNzaW9uPiBzZWN1cml0eVBlcm1pc3Npb247CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBSZXNvdXJjZUFkYXB0ZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5SRVNPVVJDRV9BREFQVEVSOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VhZGFwdGVyQ2xhc3MoKSB7CisJCXJldHVybiByZXNvdXJjZWFkYXB0ZXJDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZWFkYXB0ZXJDbGFzcyhTdHJpbmcgbmV3UmVzb3VyY2VhZGFwdGVyQ2xhc3MpIHsKKwkJU3RyaW5nIG9sZFJlc291cmNlYWRhcHRlckNsYXNzID0gcmVzb3VyY2VhZGFwdGVyQ2xhc3M7CisJCXJlc291cmNlYWRhcHRlckNsYXNzID0gbmV3UmVzb3VyY2VhZGFwdGVyQ2xhc3M7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VBREFQVEVSX0NMQVNTLCBvbGRSZXNvdXJjZWFkYXB0ZXJDbGFzcywgcmVzb3VyY2VhZGFwdGVyQ2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxDb25maWdQcm9wZXJ0eT4gZ2V0Q29uZmlnUHJvcGVydHkoKSB7CisJCWlmIChjb25maWdQcm9wZXJ0eSA9PSBudWxsKSB7CisJCQljb25maWdQcm9wZXJ0eSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxDb25maWdQcm9wZXJ0eT4oQ29uZmlnUHJvcGVydHkuY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09ORklHX1BST1BFUlRZKTsKKwkJfQorCQlyZXR1cm4gY29uZmlnUHJvcGVydHk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIGdldE91dGJvdW5kUmVzb3VyY2VhZGFwdGVyKCkgeworCQlyZXR1cm4gb3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgbmV3T3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgb2xkT3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIgPSBvdXRib3VuZFJlc291cmNlYWRhcHRlcjsKKwkJb3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIgPSBuZXdPdXRib3VuZFJlc291cmNlYWRhcHRlcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRUFEQVBURVIsIG9sZE91dGJvdW5kUmVzb3VyY2VhZGFwdGVyLCBuZXdPdXRib3VuZFJlc291cmNlYWRhcHRlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0T3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgbmV3T3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIpIHsKKwkJaWYgKG5ld091dGJvdW5kUmVzb3VyY2VhZGFwdGVyICE9IG91dGJvdW5kUmVzb3VyY2VhZGFwdGVyKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChvdXRib3VuZFJlc291cmNlYWRhcHRlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvdXRib3VuZFJlc291cmNlYWRhcHRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VBREFQVEVSLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdPdXRib3VuZFJlc291cmNlYWRhcHRlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPdXRib3VuZFJlc291cmNlYWRhcHRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VBREFQVEVSLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldE91dGJvdW5kUmVzb3VyY2VhZGFwdGVyKG5ld091dGJvdW5kUmVzb3VyY2VhZGFwdGVyLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VBREFQVEVSLCBuZXdPdXRib3VuZFJlc291cmNlYWRhcHRlciwgbmV3T3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSW5ib3VuZFJlc291cmNlQWRhcHRlciBnZXRJbmJvdW5kUmVzb3VyY2VhZGFwdGVyKCkgeworCQlyZXR1cm4gaW5ib3VuZFJlc291cmNlYWRhcHRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbmJvdW5kUmVzb3VyY2VhZGFwdGVyKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgbmV3SW5ib3VuZFJlc291cmNlYWRhcHRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIG9sZEluYm91bmRSZXNvdXJjZWFkYXB0ZXIgPSBpbmJvdW5kUmVzb3VyY2VhZGFwdGVyOworCQlpbmJvdW5kUmVzb3VyY2VhZGFwdGVyID0gbmV3SW5ib3VuZFJlc291cmNlYWRhcHRlcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFQURBUFRFUiwgb2xkSW5ib3VuZFJlc291cmNlYWRhcHRlciwgbmV3SW5ib3VuZFJlc291cmNlYWRhcHRlcik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SW5ib3VuZFJlc291cmNlYWRhcHRlcihJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIG5ld0luYm91bmRSZXNvdXJjZWFkYXB0ZXIpIHsKKwkJaWYgKG5ld0luYm91bmRSZXNvdXJjZWFkYXB0ZXIgIT0gaW5ib3VuZFJlc291cmNlYWRhcHRlcikgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoaW5ib3VuZFJlc291cmNlYWRhcHRlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbmJvdW5kUmVzb3VyY2VhZGFwdGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFQURBUFRFUiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3SW5ib3VuZFJlc291cmNlYWRhcHRlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbmJvdW5kUmVzb3VyY2VhZGFwdGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFQURBUFRFUiwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRJbmJvdW5kUmVzb3VyY2VhZGFwdGVyKG5ld0luYm91bmRSZXNvdXJjZWFkYXB0ZXIsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFQURBUFRFUiwgbmV3SW5ib3VuZFJlc291cmNlYWRhcHRlciwgbmV3SW5ib3VuZFJlc291cmNlYWRhcHRlcikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PEFkbWluT2JqZWN0PiBnZXRBZG1pbm9iamVjdCgpIHsKKwkJaWYgKGFkbWlub2JqZWN0ID09IG51bGwpIHsKKwkJCWFkbWlub2JqZWN0ID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEFkbWluT2JqZWN0PihBZG1pbk9iamVjdC5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19BRE1JTk9CSkVDVCk7CisJCX0KKwkJcmV0dXJuIGFkbWlub2JqZWN0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PFNlY3VyaXR5UGVybWlzc2lvbj4gZ2V0U2VjdXJpdHlQZXJtaXNzaW9uKCkgeworCQlpZiAoc2VjdXJpdHlQZXJtaXNzaW9uID09IG51bGwpIHsKKwkJCXNlY3VyaXR5UGVybWlzc2lvbiA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTZWN1cml0eVBlcm1pc3Npb24+KFNlY3VyaXR5UGVybWlzc2lvbi5jbGFzcywgdGhpcywgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OKTsKKwkJfQorCQlyZXR1cm4gc2VjdXJpdHlQZXJtaXNzaW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiBpZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgbmV3SWQpIHsKKwkJU3RyaW5nIG9sZElkID0gaWQ7CisJCWlkID0gbmV3SWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fSUQsIG9sZElkLCBpZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVFk6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb25maWdQcm9wZXJ0eSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VBREFQVEVSOgorCQkJCXJldHVybiBiYXNpY1NldE91dGJvdW5kUmVzb3VyY2VhZGFwdGVyKG51bGwsIG1zZ3MpOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VBREFQVEVSOgorCQkJCXJldHVybiBiYXNpY1NldEluYm91bmRSZXNvdXJjZWFkYXB0ZXIobnVsbCwgbXNncyk7CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQURNSU5PQkpFQ1Q6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBZG1pbm9iamVjdCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTjoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlY3VyaXR5UGVybWlzc2lvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19SRVNPVVJDRUFEQVBURVJfQ0xBU1M6CisJCQkJcmV0dXJuIGdldFJlc291cmNlYWRhcHRlckNsYXNzKCk7CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09ORklHX1BST1BFUlRZOgorCQkJCXJldHVybiBnZXRDb25maWdQcm9wZXJ0eSgpOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFQURBUFRFUjoKKwkJCQlyZXR1cm4gZ2V0T3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFQURBUFRFUjoKKwkJCQlyZXR1cm4gZ2V0SW5ib3VuZFJlc291cmNlYWRhcHRlcigpOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FETUlOT0JKRUNUOgorCQkJCXJldHVybiBnZXRBZG1pbm9iamVjdCgpOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1NFQ1VSSVRZX1BFUk1JU1NJT046CisJCQkJcmV0dXJuIGdldFNlY3VyaXR5UGVybWlzc2lvbigpOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lEOgorCQkJCXJldHVybiBnZXRJZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VBREFQVEVSX0NMQVNTOgorCQkJCXNldFJlc291cmNlYWRhcHRlckNsYXNzKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVFk6CisJCQkJZ2V0Q29uZmlnUHJvcGVydHkoKS5jbGVhcigpOworCQkJCWdldENvbmZpZ1Byb3BlcnR5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb25maWdQcm9wZXJ0eT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRUFEQVBURVI6CisJCQkJc2V0T3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIoKE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRUFEQVBURVI6CisJCQkJc2V0SW5ib3VuZFJlc291cmNlYWRhcHRlcigoSW5ib3VuZFJlc291cmNlQWRhcHRlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FETUlOT0JKRUNUOgorCQkJCWdldEFkbWlub2JqZWN0KCkuY2xlYXIoKTsKKwkJCQlnZXRBZG1pbm9iamVjdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWRtaW5PYmplY3Q+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTjoKKwkJCQlnZXRTZWN1cml0eVBlcm1pc3Npb24oKS5jbGVhcigpOworCQkJCWdldFNlY3VyaXR5UGVybWlzc2lvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VjdXJpdHlQZXJtaXNzaW9uPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lEOgorCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VBREFQVEVSX0NMQVNTOgorCQkJCXNldFJlc291cmNlYWRhcHRlckNsYXNzKFJFU09VUkNFQURBUFRFUl9DTEFTU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTkZJR19QUk9QRVJUWToKKwkJCQlnZXRDb25maWdQcm9wZXJ0eSgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFQURBUFRFUjoKKwkJCQlzZXRPdXRib3VuZFJlc291cmNlYWRhcHRlcigoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VBREFQVEVSOgorCQkJCXNldEluYm91bmRSZXNvdXJjZWFkYXB0ZXIoKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FETUlOT0JKRUNUOgorCQkJCWdldEFkbWlub2JqZWN0KCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTjoKKwkJCQlnZXRTZWN1cml0eVBlcm1pc3Npb24oKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JRDoKKwkJCQlzZXRJZChJRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VBREFQVEVSX0NMQVNTOgorCQkJCXJldHVybiBSRVNPVVJDRUFEQVBURVJfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlYWRhcHRlckNsYXNzICE9IG51bGwgOiAhUkVTT1VSQ0VBREFQVEVSX0NMQVNTX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZWFkYXB0ZXJDbGFzcyk7CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09ORklHX1BST1BFUlRZOgorCQkJCXJldHVybiBjb25maWdQcm9wZXJ0eSAhPSBudWxsICYmICFjb25maWdQcm9wZXJ0eS5pc0VtcHR5KCk7CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fT1VUQk9VTkRfUkVTT1VSQ0VBREFQVEVSOgorCQkJCXJldHVybiBvdXRib3VuZFJlc291cmNlYWRhcHRlciAhPSBudWxsOworCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0lOQk9VTkRfUkVTT1VSQ0VBREFQVEVSOgorCQkJCXJldHVybiBpbmJvdW5kUmVzb3VyY2VhZGFwdGVyICE9IG51bGw7CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQURNSU5PQkpFQ1Q6CisJCQkJcmV0dXJuIGFkbWlub2JqZWN0ICE9IG51bGwgJiYgIWFkbWlub2JqZWN0LmlzRW1wdHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OOgorCQkJCXJldHVybiBzZWN1cml0eVBlcm1pc3Npb24gIT0gbnVsbCAmJiAhc2VjdXJpdHlQZXJtaXNzaW9uLmlzRW1wdHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JRDoKKwkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHJlc291cmNlYWRhcHRlckNsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHJlc291cmNlYWRhcHRlckNsYXNzKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1Jlc291cmNlQWRhcHRlckltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvU2VjdXJpdHlQZXJtaXNzaW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvaW1wbC9TZWN1cml0eVBlcm1pc3Npb25JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkMmRlNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL2ltcGwvU2VjdXJpdHlQZXJtaXNzaW9uSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdXJpdHkgUGVybWlzc2lvbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVBlcm1pc3Npb25JbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVBlcm1pc3Npb25JbXBsI2dldFNlY3VyaXR5UGVybWlzc2lvblNwZWMgPGVtPlNlY3VyaXR5IFBlcm1pc3Npb24gU3BlYzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5TZWN1cml0eVBlcm1pc3Npb25JbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFNlY3VyaXR5UGVybWlzc2lvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFNlY3VyaXR5UGVybWlzc2lvbiB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb247CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdXJpdHlQZXJtaXNzaW9uU3BlYygpIDxlbT5TZWN1cml0eSBQZXJtaXNzaW9uIFNwZWM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNlY3VyaXR5UGVybWlzc2lvblNwZWMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1VSSVRZX1BFUk1JU1NJT05fU1BFQ19FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN1cml0eVBlcm1pc3Npb25TcGVjKCkgPGVtPlNlY3VyaXR5IFBlcm1pc3Npb24gU3BlYzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0U2VjdXJpdHlQZXJtaXNzaW9uU3BlYygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBzZWN1cml0eVBlcm1pc3Npb25TcGVjID0gU0VDVVJJVFlfUEVSTUlTU0lPTl9TUEVDX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU2VjdXJpdHlQZXJtaXNzaW9uSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVVJJVFlfUEVSTUlTU0lPTjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb24oKSB7CisJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7CisJCQlkZXNjcmlwdGlvbiA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT04pOworCQl9CisJCXJldHVybiBkZXNjcmlwdGlvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFNlY3VyaXR5UGVybWlzc2lvblNwZWMoKSB7CisJCXJldHVybiBzZWN1cml0eVBlcm1pc3Npb25TcGVjOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFNlY3VyaXR5UGVybWlzc2lvblNwZWMoU3RyaW5nIG5ld1NlY3VyaXR5UGVybWlzc2lvblNwZWMpIHsKKwkJU3RyaW5nIG9sZFNlY3VyaXR5UGVybWlzc2lvblNwZWMgPSBzZWN1cml0eVBlcm1pc3Npb25TcGVjOworCQlzZWN1cml0eVBlcm1pc3Npb25TcGVjID0gbmV3U2VjdXJpdHlQZXJtaXNzaW9uU3BlYzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19TRUNVUklUWV9QRVJNSVNTSU9OX1NQRUMsIG9sZFNlY3VyaXR5UGVybWlzc2lvblNwZWMsIHNlY3VyaXR5UGVybWlzc2lvblNwZWMpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7CisJCVN0cmluZyBvbGRJZCA9IGlkOworCQlpZCA9IG5ld0lkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0lELCBvbGRJZCwgaWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKKwkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19TRUNVUklUWV9QRVJNSVNTSU9OX1NQRUM6CisJCQkJcmV0dXJuIGdldFNlY3VyaXR5UGVybWlzc2lvblNwZWMoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19JRDoKKwkJCQlyZXR1cm4gZ2V0SWQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OOgorCQkJCWdldERlc2NyaXB0aW9uKCkuY2xlYXIoKTsKKwkJCQlnZXREZXNjcmlwdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fU0VDVVJJVFlfUEVSTUlTU0lPTl9TUEVDOgorCQkJCXNldFNlY3VyaXR5UGVybWlzc2lvblNwZWMoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0lEOgorCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT046CisJCQkJZ2V0RGVzY3JpcHRpb24oKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19TRUNVUklUWV9QRVJNSVNTSU9OX1NQRUM6CisJCQkJc2V0U2VjdXJpdHlQZXJtaXNzaW9uU3BlYyhTRUNVUklUWV9QRVJNSVNTSU9OX1NQRUNfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19JRDoKKwkJCQlzZXRJZChJRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIGRlc2NyaXB0aW9uICE9IG51bGwgJiYgIWRlc2NyaXB0aW9uLmlzRW1wdHkoKTsKKwkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19TRUNVUklUWV9QRVJNSVNTSU9OX1NQRUM6CisJCQkJcmV0dXJuIFNFQ1VSSVRZX1BFUk1JU1NJT05fU1BFQ19FREVGQVVMVCA9PSBudWxsID8gc2VjdXJpdHlQZXJtaXNzaW9uU3BlYyAhPSBudWxsIDogIVNFQ1VSSVRZX1BFUk1JU1NJT05fU1BFQ19FREVGQVVMVC5lcXVhbHMoc2VjdXJpdHlQZXJtaXNzaW9uU3BlYyk7CisJCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fSUQ6CisJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzZWN1cml0eVBlcm1pc3Npb25TcGVjOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHNlY3VyaXR5UGVybWlzc2lvblNwZWMpOworCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGlkKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vU2VjdXJpdHlQZXJtaXNzaW9uSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvbWV0YWRhdGEvSmNhUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvbWV0YWRhdGEvSmNhUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYzA4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC9tZXRhZGF0YS9KY2FQYWNrYWdlLmphdmEKQEAgLTAsMCArMSwzMTQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkpjYUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAorICogPHVsPgorICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKyAqIDwvdWw+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICRJZDogSmNhUGFja2FnZS5qYXZhLHYgMS40IDIwMTAvMDEvMTUgMTQ6MzI6MDggY2FuZGVyc29uIEV4cCAkCisgKiAgICAgICAKKyAqICAgICAKKyAqIAorICogPCFbQ0RBVEFbWworICogICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIENvbm5lY3RvciAxLjYgZGVwbG95bWVudAorICogICAgICAgZGVzY3JpcHRvci4gIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZAorICogICAgICAgIk1FVEEtSU5GL3JhLnhtbCIgaW4gdGhlIGNvbm5lY3RvcidzIHJhciBmaWxlLiAgQWxsIENvbm5lY3RvcgorICogICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBtdXN0IGluZGljYXRlIHRoZSBjb25uZWN0b3IgcmVzb3VyY2UKKyAqICAgICAgIGFkYXB0ZXIgc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFIG5hbWVzcGFjZToKKyAqICAgICAgIAorICogICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCisgKiAgICAgICAKKyAqICAgICAgIGFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkKKyAqICAgICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6CisgKiAgICAgICAKKyAqICAgICAgIDxjb25uZWN0b3IgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKKyAqICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgKiAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZQorICogICAgICAgCSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvY29ubmVjdG9yXzFfNi54c2QiCisgKiAgICAgICB2ZXJzaW9uPSIxLjYiPgorICogICAgICAgLi4uCisgKiAgICAgICA8L2Nvbm5lY3Rvcj4KKyAqICAgICAgIAorICogICAgICAgVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCisgKiAgICAgICB0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKYXZhIEVFCisgKiAgICAgICBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgorICogICAgICAgCisgKiAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvY29ubmVjdG9yXzFfNi54c2QKKyAqICAgICAgIAorICogXV0+CisgKiAgICAgCisgKiAKKyAqIAorICogICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQorICogICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgorICogICAgICAgCisgKiAgICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCisgKiAgICAgICBzYW1lIEpBUiBmaWxlLCByZWxhdGl2ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlIG5vdAorICogICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCisgKiAgICAgICB0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCisgKiAgICAgICBzdGFydGluZyB3aXRoICIvIikgYWxzbyBzcGVjaWZ5IG5hbWVzIGluIHRoZSByb290IG9mIHRoZQorICogICAgICAgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKKyAqICAgICAgIHByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQorICogICAgICAgbmFtZXMgYXJlIHByZWZlcnJlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgU2VydmxldCBBUEkuCisgKiAgICAgICAKKyAqICAgICAKKyAqIAorICogCisgKiAgICAgICAkSWQ6IEpjYVBhY2thZ2UuamF2YSx2IDEuNCAyMDEwLzAxLzE1IDE0OjMyOjA4IGNhbmRlcnNvbiBFeHAgJAorICogICAgICAgCisgKiAgICAgCisgKiAKKyAqIAorICogICAgICAgVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCisgKiAgICAgICBzaGFyZWFibGUgc2NoZW1hKHMpIG9mIEphdmEgRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKKyAqICAgICAgIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKKyAqICAgICAgIAorICogICAgICAgRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogICAgICAgamF2YSBlZSBhcHBsaWNhdGlvbjsKKyAqICAgICAgIGFwcGxpY2F0aW9uIGNsaWVudDsKKyAqICAgICAgIHdlYiBhcHBsaWNhdGlvbjsKKyAqICAgICAgIGVudGVycHJpc2UgYmVhbjsKKyAqICAgICAgIHJlc291cmNlIGFkYXB0ZXI7IAorICogICAgICAgCisgKiAgICAgICBEZXBsb3ltZW50IEZpbGUgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICogICAgICAgZWFyIGZpbGU7CisgKiAgICAgICB3YXIgZmlsZTsKKyAqICAgICAgIGphciBmaWxlOworICogICAgICAgcmFyIGZpbGU7CisgKiAgICAgICAKKyAqICAgICAKKyAqIAorICogCisgKiAgICAgICAkSWQ6IEpjYVBhY2thZ2UuamF2YSx2IDEuNCAyMDEwLzAxLzE1IDE0OjMyOjA4IGNhbmRlcnNvbiBFeHAgJAorICogICAgICAgCisgKiAgICAgCisgKiAKKyAqIAorICogICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKKyAqICAgICAgIAorICogICAgIAorICogCisgKiAgICA8ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAqICAgICA8aDE+QWJvdXQgdGhlIFhNTCBuYW1lc3BhY2U8L2gxPgorICogCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCisgKiAgICAgICBzdWl0YWJsZSBmb3IgaW1wb3J0IGJ5IG90aGVyIHNjaGVtYSBkb2N1bWVudHMuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwiPgorICogICAgICAgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWw8L2E+IGFuZAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCI+CisgKiAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sPC9hPiBmb3IgaW5mb3JtYXRpb24gCisgKiAgICAgICBhYm91dCB0aGlzIG5hbWVzcGFjZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIE5vdGUgdGhhdCBsb2NhbCBuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgaW50ZW5kZWQgdG8gYmUKKyAqICAgICAgIGRlZmluZWQgb25seSBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBvciBpdHMgc3ViZ3JvdXBzLgorICogICAgICAgVGhlIG5hbWVzIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBsaXN0ZWQgYmVsb3cuCisgKiAgICAgICBUaGV5IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZworICogICAgICAgR3JvdXAsIHNwZWNpZmljYXRpb24sIG9yIGRvY3VtZW50IGluc3RhbmNlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPiAgIAorICogICAgICAgU2VlIGZ1cnRoZXIgYmVsb3cgaW4gdGhpcyBkb2N1bWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8YSBocmVmPSIjdXNhZ2UiPmhvdyB0byByZWZlciB0byB0aGlzIHNjaGVtYSBkb2N1bWVudCBmcm9tIHlvdXIgb3duCisgKiAgICAgICBYU0Qgc2NoZW1hIGRvY3VtZW50czwvYT4gYW5kIGFib3V0IDxhIGhyZWY9IiNuc3ZlcnNpb25pbmciPnRoZQorICogICAgICAgbmFtZXNwYWNlLXZlcnNpb25pbmcgcG9saWN5IGdvdmVybmluZyB0aGlzIHNjaGVtYSBkb2N1bWVudDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgorICogICAKKyAqIAorICogICAgPGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgKiAgICAKKyAqICAgICA8aDM+RmF0aGVyIChpbiBhbnkgY29udGV4dCBhdCBhbGwpPC9oMz4gCisgKiAKKyAqICAgICA8ZGl2IGNsYXNzPSJib2R5dGV4dCI+CisgKiAgICAgIDxwPgorICogICAgICAgZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKKyAqICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKKyAqICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCisgKiAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKKyAqICAgICAgPC9wPgorICogICAgICA8YmxvY2txdW90ZT4KKyAqICAgICAgICA8cD4KKyAqIAlJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kCisgKiAJZGVkaWNhdGlvbiB0aGUgVzNDIFhNTCBQbGVuYXJ5IG9uIHRoaXMgMTB0aCBkYXkgb2YKKyAqIAlGZWJydWFyeSwgMjAwMCwgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5CisgKiAJdGhlIFhNTCBuYW1lICJ4bWw6RmF0aGVyIi4KKyAqICAgICAgICA8L3A+CisgKiAgICAgIDwvYmxvY2txdW90ZT4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgorICogICAKKyAqIAorICogICAgPGRpdiBpZD0idXNhZ2UiIHhtbDppZD0idXNhZ2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAqICAgICA8aDI+CisgKiAgICAgICA8YSBuYW1lPSJ1c2FnZSI+QWJvdXQgdGhpcyBzY2hlbWEgZG9jdW1lbnQ8L2E+CisgKiAgICAgPC9oMj4KKyAqIAorICogICAgIDxkaXYgY2xhc3M9ImJvZHl0ZXh0Ij4KKyAqICAgICAgPHA+CisgKiAgICAgICBUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cCBzdWl0YWJsZQorICogICAgICAgZm9yIHVzZSBieSBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgPGNvZGU+eG1sOmJhc2U8L2NvZGU+LAorICogICAgICAgPGNvZGU+eG1sOmxhbmc8L2NvZGU+LCA8Y29kZT54bWw6c3BhY2U8L2NvZGU+IG9yCisgKiAgICAgICA8Y29kZT54bWw6aWQ8L2NvZGU+IGF0dHJpYnV0ZXMgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBUbyBlbmFibGUgdGhpcywgc3VjaCBhIHNjaGVtYSBtdXN0IGltcG9ydCB0aGlzIHNjaGVtYSBmb3IKKyAqICAgICAgIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6CisgKiAgICAgIDwvcD4KKyAqICAgICAgPHByZT4KKyAqICAgICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuJmd0OworICogICAgICAgICAgICAuIC4gLgorICogICAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgorICogICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLyZndDsKKyAqICAgICAgPC9wcmU+CisgKiAgICAgIDxwPgorICogICAgICAgb3IKKyAqICAgICAgPC9wPgorICogICAgICA8cHJlPgorICogICAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgorICogICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QiLyZndDsKKyAqICAgICAgPC9wcmU+CisgKiAgICAgIDxwPgorICogICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcyBvciB0aGUKKyAqICAgICAgIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgorICogICAgICA8L3A+CisgKiAgICAgIDxwcmU+CisgKiAgICAgICAgICAgJmx0O3R5cGUgLiAuIC4mZ3Q7CisgKiAgICAgICAgICAgIC4gLiAuCisgKiAgICAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLyZndDsKKyAqICAgICAgPC9wcmU+CisgKiAgICAgIDxwPgorICogICAgICAgd2lsbCBkZWZpbmUgYSB0eXBlIHdoaWNoIHdpbGwgc2NoZW1hLXZhbGlkYXRlIGFuIGluc3RhbmNlIGVsZW1lbnQKKyAqICAgICAgIHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMuCisgKiAgICAgIDwvcD4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgorICogICAKKyAqIAorICogICAgPGRpdiBpZD0ibnN2ZXJzaW9uaW5nIiB4bWw6aWQ9Im5zdmVyc2lvbmluZyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgIDxoMj4KKyAqICAgICAgIDxhIG5hbWU9Im5zdmVyc2lvbmluZyI+VmVyc2lvbmluZyBwb2xpY3kgZm9yIHRoaXMgc2NoZW1hIGRvY3VtZW50PC9hPgorICogICAgIDwvaDI+CisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIEluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKKyAqICAgICAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0CisgKiAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QiPgorICogICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Q8L2E+LgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKKyAqICAgICAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTAorICogICAgICAgU2NoZW1hIGl0c2VsZiwgb3Igd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywKKyAqICAgICAgIGlmIHRoZSBYTUwgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcworICogICAgICAgZG9jdW1lbnQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QgCisgKiAgICAgICA8L2E+IAorICogICAgICAgd2lsbCBjaGFuZ2UgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0IAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QgCisgKiAgICAgICA8L2E+IAorICogICAgICAgd2lsbCBub3QgY2hhbmdlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgUHJldmlvdXMgZGF0ZWQgKGFuZCB1bmNoYW5naW5nKSB2ZXJzaW9ucyBvZiB0aGlzIHNjaGVtYSAKKyAqICAgICAgIGRvY3VtZW50IGFyZSBhdDoKKyAqICAgICAgPC9wPgorICogICAgICA8dWw+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwNy8wOC94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA3LzA4L3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8xMC94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA0LzEwL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgIDwvdWw+CisgKiAgICAgPC9kaXY+CisgKiAgICA8L2Rpdj4KKyAqICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkpjYUZhY3RvcnkKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBKY2FQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgeworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gImpjYSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2Nvbm5lY3Rvcl8xXzYueHNkIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19QUkVGSVggPSAiamNhIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlKY2FQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwuaW5pdCgpOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25TcGVjSW1wbCA8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5BY3RpdmF0aW9uU3BlY0ltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0QWN0aXZhdGlvblNwZWMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQUNUSVZBVElPTl9TUEVDID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uc3BlYyBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTlNQRUNfQ0xBU1MgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFkgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUNUSVZBVElPTl9TUEVDX19DT05GSUdfUFJPUEVSVFkgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUNUSVZBVElPTl9TUEVDX19JRCA9IDM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZhdGlvbiBTcGVjPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFDVElWQVRJT05fU1BFQ19GRUFUVVJFX0NPVU5UID0gNDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5BZG1pbk9iamVjdEltcGwgPGVtPkFkbWluIE9iamVjdDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQWRtaW5PYmplY3RJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldEFkbWluT2JqZWN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEFETUlOX09CSkVDVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRtaW5vYmplY3QgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQURNSU5fT0JKRUNUX19BRE1JTk9CSkVDVF9JTlRFUkZBQ0UgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkbWlub2JqZWN0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQURNSU5fT0JKRUNUX19BRE1JTk9CSkVDVF9DTEFTUyA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUWSA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBRE1JTl9PQkpFQ1RfX0lEID0gMzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BZG1pbiBPYmplY3Q8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQURNSU5fT0JKRUNUX0ZFQVRVUkVfQ09VTlQgPSA0OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSW1wbCA8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTiA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVkZW50aWFsIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0UgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19JRCA9IDM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9GRUFUVVJFX0NPVU5UID0gNDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25maWdQcm9wZXJ0eUltcGwgPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29uZmlnUHJvcGVydHlJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldENvbmZpZ1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENPTkZJR19QUk9QRVJUWSA9IDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT04gPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfTkFNRSA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9UWVBFID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydHkgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9WQUxVRSA9IDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5IElnbm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX0lHTk9SRSA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5IFN1cHBvcnRzIER5bmFtaWMgVXBkYXRlczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX1NVUFBPUlRTX0RZTkFNSUNfVVBEQVRFUyA9IDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5IENvbmZpZGVudGlhbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX0NPTkZJREVOVElBTCA9IDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05GSUdfUFJPUEVSVFlfX0lEID0gNzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25maWcgUHJvcGVydHk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09ORklHX1BST1BFUlRZX0ZFQVRVUkVfQ09VTlQgPSA4OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbCA8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0aW9uRGVmaW5pdGlvbkltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ09OTkVDVElPTl9ERUZJTklUSU9OID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnkgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURDT05ORUNUSU9ORkFDVE9SWV9DTEFTUyA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUWSA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbmZhY3RvcnkgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9ORkFDVE9SWV9JTlRFUkZBQ0UgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb25mYWN0b3J5IEltcGwgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05GQUNUT1JZX0lNUExfQ0xBU1MgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRSA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBJbXBsIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lNUExfQ0xBU1MgPSA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09OTkVDVElPTl9ERUZJTklUSU9OX19JRCA9IDY7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTk5FQ1RJT05fREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UID0gNzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JJbXBsIDxlbT5Db25uZWN0b3I8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0Q29ubmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENPTk5FQ1RPUiA9IDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUT1JfX01PRFVMRV9OQU1FID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTk5FQ1RPUl9fREVTQ1JJUFRJT05TID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUT1JfX0RJU1BMQVlfTkFNRVMgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUT1JfX0lDT05TID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZW5kb3IgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTk5FQ1RPUl9fVkVORE9SX05BTUUgPSA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVpcyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09OTkVDVE9SX19FSVNfVFlQRSA9IDU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2VhZGFwdGVyIFZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUT1JfX1JFU09VUkNFQURBUFRFUl9WRVJTSU9OID0gNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaWNlbnNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09OTkVDVE9SX19MSUNFTlNFID0gNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZWFkYXB0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUT1JfX1JFU09VUkNFQURBUFRFUiA9IDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQgV29yayBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUT1JfX1JFUVVJUkVEX1dPUktfQ09OVEVYVCA9IDk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUT1JfX0lEID0gMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUT1JfX01FVEFEQVRBX0NPTVBMRVRFID0gMTE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTk5FQ1RPUl9fVkVSU0lPTiA9IDEyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbm5lY3RvcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUT1JfRkVBVFVSRV9DT1VOVCA9IDEzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbCA8ZW0+Q29ubmVjdG9yIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldENvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVAgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19DT05ORUNUT1IgPSAzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbm5lY3RvciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09OTkVDVE9SX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gNDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5JbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbCA8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5JbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IElOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUiA9IDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZWFkYXB0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VBREFQVEVSID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IElOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fSUQgPSAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBJTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfRkVBVFVSRV9DT1VOVCA9IDI7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuTGljZW5zZUltcGwgPGVtPkxpY2Vuc2U8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkxpY2Vuc2VJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldExpY2Vuc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgTElDRU5TRSA9IDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IExJQ0VOU0VfX0RFU0NSSVBUSU9OID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaWNlbnNlIFJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTElDRU5TRV9fTElDRU5TRV9SRVFVSVJFRCA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMSUNFTlNFX19JRCA9IDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TGljZW5zZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBMSUNFTlNFX0ZFQVRVUkVfQ09VTlQgPSAzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLk1lc3NhZ2VBZGFwdGVySW1wbCA8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5NZXNzYWdlQWRhcHRlckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0TWVzc2FnZUFkYXB0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgTUVTU0FHRV9BREFQVEVSID0gOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlbGlzdGVuZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRUxJU1RFTkVSID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1FU1NBR0VfQURBUFRFUl9fSUQgPSAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNRVNTQUdFX0FEQVBURVJfRkVBVFVSRV9DT1VOVCA9IDI7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUxpc3RlbmVySW1wbCA8ZW0+TWVzc2FnZSBMaXN0ZW5lcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUxpc3RlbmVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRNZXNzYWdlTGlzdGVuZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgTUVTU0FHRV9MSVNURU5FUiA9IDEwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2VsaXN0ZW5lciBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVTU0FHRV9MSVNURU5FUl9fTUVTU0FHRUxJU1RFTkVSX1RZUEUgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2YXRpb25zcGVjPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTlNQRUMgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVTU0FHRV9MSVNURU5FUl9fSUQgPSAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgTUVTU0FHRV9MSVNURU5FUl9GRUFUVVJFX0NPVU5UID0gMzsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwgPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSID0gMTE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT04gPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFN1cHBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19UUkFOU0FDVElPTl9TVVBQT1JUID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTSA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fUkVBVVRIRU5USUNBVElPTl9TVVBQT1JUID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0lEID0gNDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfRkVBVFVSRV9DT1VOVCA9IDU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuUmVxdWlyZWRDb25maWdQcm9wZXJ0eUltcGwgPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuUmVxdWlyZWRDb25maWdQcm9wZXJ0eUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFkgPSAxMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTiA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5IE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9OQU1FID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9fSUQgPSAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IDM7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuUmVzb3VyY2VBZGFwdGVySW1wbCA8ZW0+UmVzb3VyY2UgQWRhcHRlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuUmVzb3VyY2VBZGFwdGVySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZUFkYXB0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUkVTT1VSQ0VfQURBUFRFUiA9IDEzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlYWRhcHRlciBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFU09VUkNFX0FEQVBURVJfX1JFU09VUkNFQURBUFRFUl9DTEFTUyA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVNPVVJDRV9BREFQVEVSX19DT05GSUdfUFJPUEVSVFkgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGJvdW5kIFJlc291cmNlYWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFQURBUFRFUiA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5ib3VuZCBSZXNvdXJjZWFkYXB0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFQURBUFRFUiA9IDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRtaW5vYmplY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFU09VUkNFX0FEQVBURVJfX0FETUlOT0JKRUNUID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBQZXJtaXNzaW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OID0gNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFU09VUkNFX0FEQVBURVJfX0lEID0gNjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBBZGFwdGVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJFU09VUkNFX0FEQVBURVJfRkVBVFVSRV9DT1VOVCA9IDc7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuU2VjdXJpdHlQZXJtaXNzaW9uSW1wbCA8ZW0+U2VjdXJpdHkgUGVybWlzc2lvbjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuU2VjdXJpdHlQZXJtaXNzaW9uSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRTZWN1cml0eVBlcm1pc3Npb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgU0VDVVJJVFlfUEVSTUlTU0lPTiA9IDE0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTiA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUGVybWlzc2lvbiBTcGVjPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VDVVJJVFlfUEVSTUlTU0lPTl9fU0VDVVJJVFlfUEVSTUlTU0lPTl9TUEVDID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFQ1VSSVRZX1BFUk1JU1NJT05fX0lEID0gMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZWN1cml0eSBQZXJtaXNzaW9uPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFNFQ1VSSVRZX1BFUk1JU1NJT05fRkVBVFVSRV9DT1VOVCA9IDM7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5VHlwZVR5cGUgPGVtPkNvbmZpZyBQcm9wZXJ0eSBUeXBlIFR5cGU8L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5VHlwZVR5cGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0Q29uZmlnUHJvcGVydHlUeXBlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDT05GSUdfUFJPUEVSVFlfVFlQRV9UWVBFID0gMTU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlIDxlbT5DcmVkZW50aWFsIEludGVyZmFjZSBUeXBlPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5DcmVkZW50aWFsSW50ZXJmYWNlVHlwZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRDcmVkZW50aWFsSW50ZXJmYWNlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDUkVERU5USUFMX0lOVEVSRkFDRV9UWVBFID0gMTY7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydFR5cGUgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQgVHlwZTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0VHlwZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRUcmFuc2FjdGlvblN1cHBvcnRUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRSQU5TQUNUSU9OX1NVUFBPUlRfVFlQRSA9IDE3OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Db25maWcgUHJvcGVydHkgTmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZworCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRDb25maWdQcm9wZXJ0eU5hbWVUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENPTkZJR19QUk9QRVJUWV9OQU1FX1RZUEUgPSAxODsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5IFR5cGUgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eVR5cGVUeXBlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldENvbmZpZ1Byb3BlcnR5VHlwZVR5cGVPYmplY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ09ORklHX1BST1BFUlRZX1RZUEVfVFlQRV9PQkpFQ1QgPSAxOTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q3JlZGVudGlhbCBJbnRlcmZhY2UgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5DcmVkZW50aWFsSW50ZXJmYWNlVHlwZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRDcmVkZW50aWFsSW50ZXJmYWNlVHlwZU9iamVjdCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDUkVERU5USUFMX0lOVEVSRkFDRV9UWVBFX09CSkVDVCA9IDIwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0IFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0VHlwZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRUcmFuc2FjdGlvblN1cHBvcnRUeXBlT2JqZWN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRSQU5TQUNUSU9OX1NVUFBPUlRfVFlQRV9PQkpFQ1QgPSAyMTsKKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWN0aXZhdGlvblNwZWMgPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BY3RpdmF0aW9uU3BlYworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0QWN0aXZhdGlvblNwZWMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWN0aXZhdGlvblNwZWMjZ2V0QWN0aXZhdGlvbnNwZWNDbGFzcyA8ZW0+QWN0aXZhdGlvbnNwZWMgQ2xhc3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3RpdmF0aW9uc3BlYyBDbGFzczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFjdGl2YXRpb25TcGVjI2dldEFjdGl2YXRpb25zcGVjQ2xhc3MoKQorCSAqIEBzZWUgI2dldEFjdGl2YXRpb25TcGVjKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uc3BlY0NsYXNzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWN0aXZhdGlvblNwZWMjZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eSA8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXF1aXJlZCBDb25maWcgUHJvcGVydHk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BY3RpdmF0aW9uU3BlYyNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5KCkKKwkgKiBAc2VlICNnZXRBY3RpdmF0aW9uU3BlYygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QWN0aXZhdGlvblNwZWNfUmVxdWlyZWRDb25maWdQcm9wZXJ0eSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFjdGl2YXRpb25TcGVjI2dldENvbmZpZ1Byb3BlcnR5IDxlbT5Db25maWcgUHJvcGVydHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFjdGl2YXRpb25TcGVjI2dldENvbmZpZ1Byb3BlcnR5KCkKKwkgKiBAc2VlICNnZXRBY3RpdmF0aW9uU3BlYygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QWN0aXZhdGlvblNwZWNfQ29uZmlnUHJvcGVydHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWN0aXZhdGlvblNwZWMjZ2V0SWQgPGVtPklkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BY3RpdmF0aW9uU3BlYyNnZXRJZCgpCisJICogQHNlZSAjZ2V0QWN0aXZhdGlvblNwZWMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEFjdGl2YXRpb25TcGVjX0lkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BZG1pbk9iamVjdCA8ZW0+QWRtaW4gT2JqZWN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFkbWluIE9iamVjdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFkbWluT2JqZWN0CisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRBZG1pbk9iamVjdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BZG1pbk9iamVjdCNnZXRBZG1pbm9iamVjdEludGVyZmFjZSA8ZW0+QWRtaW5vYmplY3QgSW50ZXJmYWNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWRtaW5vYmplY3QgSW50ZXJmYWNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWRtaW5PYmplY3QjZ2V0QWRtaW5vYmplY3RJbnRlcmZhY2UoKQorCSAqIEBzZWUgI2dldEFkbWluT2JqZWN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBZG1pbk9iamVjdF9BZG1pbm9iamVjdEludGVyZmFjZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BZG1pbk9iamVjdCNnZXRBZG1pbm9iamVjdENsYXNzIDxlbT5BZG1pbm9iamVjdCBDbGFzczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFkbWlub2JqZWN0IENsYXNzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWRtaW5PYmplY3QjZ2V0QWRtaW5vYmplY3RDbGFzcygpCisJICogQHNlZSAjZ2V0QWRtaW5PYmplY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEFkbWluT2JqZWN0X0FkbWlub2JqZWN0Q2xhc3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BZG1pbk9iamVjdCNnZXRDb25maWdQcm9wZXJ0eSA8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db25maWcgUHJvcGVydHk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BZG1pbk9iamVjdCNnZXRDb25maWdQcm9wZXJ0eSgpCisJICogQHNlZSAjZ2V0QWRtaW5PYmplY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnR5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkFkbWluT2JqZWN0I2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWRtaW5PYmplY3QjZ2V0SWQoKQorCSAqIEBzZWUgI2dldEFkbWluT2JqZWN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBZG1pbk9iamVjdF9JZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20gPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20jZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKQorCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20jZ2V0Q3JlZGVudGlhbEludGVyZmFjZSA8ZW0+Q3JlZGVudGlhbCBJbnRlcmZhY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVkZW50aWFsIEludGVyZmFjZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtI2dldENyZWRlbnRpYWxJbnRlcmZhY2UoKQorCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtI2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20jZ2V0SWQoKQorCSAqIEBzZWUgI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9JZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkgPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db25maWcgUHJvcGVydHk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q29uZmlnUHJvcGVydHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eSNnZXRDb25maWdQcm9wZXJ0eU5hbWUgPGVtPkNvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uZmlnIFByb3BlcnR5IE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eSNnZXRDb25maWdQcm9wZXJ0eU5hbWUoKQorCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb25maWdQcm9wZXJ0eV9Db25maWdQcm9wZXJ0eU5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjZ2V0Q29uZmlnUHJvcGVydHlUeXBlIDxlbT5Db25maWcgUHJvcGVydHkgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjZ2V0Q29uZmlnUHJvcGVydHlUeXBlKCkKKwkgKiBAc2VlICNnZXRDb25maWdQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2dldENvbmZpZ1Byb3BlcnR5VmFsdWUgPGVtPkNvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2dldENvbmZpZ1Byb3BlcnR5VmFsdWUoKQorCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb25maWdQcm9wZXJ0eV9Db25maWdQcm9wZXJ0eVZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2lzQ29uZmlnUHJvcGVydHlJZ25vcmUgPGVtPkNvbmZpZyBQcm9wZXJ0eSBJZ25vcmU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25maWcgUHJvcGVydHkgSWdub3JlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjaXNDb25maWdQcm9wZXJ0eUlnbm9yZSgpCisJICogQHNlZSAjZ2V0Q29uZmlnUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5SWdub3JlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2lzQ29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzIDxlbT5Db25maWcgUHJvcGVydHkgU3VwcG9ydHMgRHluYW1pYyBVcGRhdGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uZmlnIFByb3BlcnR5IFN1cHBvcnRzIER5bmFtaWMgVXBkYXRlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2lzQ29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzKCkKKwkgKiBAc2VlICNnZXRDb25maWdQcm9wZXJ0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2lzQ29uZmlnUHJvcGVydHlDb25maWRlbnRpYWwgPGVtPkNvbmZpZyBQcm9wZXJ0eSBDb25maWRlbnRpYWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25maWcgUHJvcGVydHkgQ29uZmlkZW50aWFsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjaXNDb25maWdQcm9wZXJ0eUNvbmZpZGVudGlhbCgpCisJICogQHNlZSAjZ2V0Q29uZmlnUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5I2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkjZ2V0SWQoKQorCSAqIEBzZWUgI2dldENvbmZpZ1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb25maWdQcm9wZXJ0eV9JZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24gPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0TWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5Q2xhc3MgPGVtPk1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeSBDbGFzczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeSBDbGFzczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldE1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeUNsYXNzKCkKKwkgKiBAc2VlICNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fTWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5Q2xhc3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25maWdQcm9wZXJ0eSA8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db25maWcgUHJvcGVydHk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25maWdQcm9wZXJ0eSgpCisJICogQHNlZSAjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0NvbmZpZ1Byb3BlcnR5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlIDxlbT5Db25uZWN0aW9uZmFjdG9yeSBJbnRlcmZhY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25uZWN0aW9uZmFjdG9yeSBJbnRlcmZhY2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbiNnZXRDb25uZWN0aW9uZmFjdG9yeUludGVyZmFjZSgpCisJICogQHNlZSAjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25mYWN0b3J5SW50ZXJmYWNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzIDxlbT5Db25uZWN0aW9uZmFjdG9yeSBJbXBsIENsYXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29ubmVjdGlvbmZhY3RvcnkgSW1wbCBDbGFzczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25mYWN0b3J5SW1wbENsYXNzKCkKKwkgKiBAc2VlICNnZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbmZhY3RvcnlJbXBsQ2xhc3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0Q29ubmVjdGlvbkludGVyZmFjZSA8ZW0+Q29ubmVjdGlvbiBJbnRlcmZhY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db25uZWN0aW9uIEludGVyZmFjZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25JbnRlcmZhY2UoKQorCSAqIEBzZWUgI2dldENvbm5lY3Rpb25EZWZpbml0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW50ZXJmYWNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MgPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbm5lY3Rpb24gSW1wbCBDbGFzczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldENvbm5lY3Rpb25JbXBsQ2xhc3MoKQorCSAqIEBzZWUgI2dldENvbm5lY3Rpb25EZWZpbml0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uI2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24jZ2V0SWQoKQorCSAqIEBzZWUgI2dldENvbm5lY3Rpb25EZWZpbml0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9JZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yIDxlbT5Db25uZWN0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29ubmVjdG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRDb25uZWN0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldE1vZHVsZU5hbWUgPGVtPk1vZHVsZSBOYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW9kdWxlIE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0TW9kdWxlTmFtZSgpCisJICogQHNlZSAjZ2V0Q29ubmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb25uZWN0b3JfTW9kdWxlTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb25zPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldERlc2NyaXB0aW9ucygpCisJICogQHNlZSAjZ2V0Q29ubmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRDb25uZWN0b3JfRGVzY3JpcHRpb25zKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXREaXNwbGF5TmFtZXMoKQorCSAqIEBzZWUgI2dldENvbm5lY3RvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Q29ubmVjdG9yX0Rpc3BsYXlOYW1lcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkljb25zPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldEljb25zKCkKKwkgKiBAc2VlICNnZXRDb25uZWN0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldENvbm5lY3Rvcl9JY29ucygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0VmVuZG9yTmFtZSA8ZW0+VmVuZG9yIE5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZW5kb3IgTmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXRWZW5kb3JOYW1lKCkKKwkgKiBAc2VlICNnZXRDb25uZWN0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9WZW5kb3JOYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXRFaXNUeXBlIDxlbT5FaXMgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVpcyBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldEVpc1R5cGUoKQorCSAqIEBzZWUgI2dldENvbm5lY3RvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX0Vpc1R5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yI2dldFJlc291cmNlYWRhcHRlclZlcnNpb24gPGVtPlJlc291cmNlYWRhcHRlciBWZXJzaW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2VhZGFwdGVyIFZlcnNpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0UmVzb3VyY2VhZGFwdGVyVmVyc2lvbigpCisJICogQHNlZSAjZ2V0Q29ubmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb25uZWN0b3JfUmVzb3VyY2VhZGFwdGVyVmVyc2lvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0TGljZW5zZSA8ZW0+TGljZW5zZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkxpY2Vuc2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0TGljZW5zZSgpCisJICogQHNlZSAjZ2V0Q29ubmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRDb25uZWN0b3JfTGljZW5zZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0UmVzb3VyY2VhZGFwdGVyIDxlbT5SZXNvdXJjZWFkYXB0ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5SZXNvdXJjZWFkYXB0ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0UmVzb3VyY2VhZGFwdGVyKCkKKwkgKiBAc2VlICNnZXRDb25uZWN0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldENvbm5lY3Rvcl9SZXNvdXJjZWFkYXB0ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0UmVxdWlyZWRXb3JrQ29udGV4dCA8ZW0+UmVxdWlyZWQgV29yayBDb250ZXh0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZXF1aXJlZCBXb3JrIENvbnRleHQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0UmVxdWlyZWRXb3JrQ29udGV4dCgpCisJICogQHNlZSAjZ2V0Q29ubmVjdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb25uZWN0b3JfUmVxdWlyZWRXb3JrQ29udGV4dCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0SWQgPGVtPklkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjZ2V0SWQoKQorCSAqIEBzZWUgI2dldENvbm5lY3RvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yX0lkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3IjaXNNZXRhZGF0YUNvbXBsZXRlKCkKKwkgKiBAc2VlICNnZXRDb25uZWN0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9NZXRhZGF0YUNvbXBsZXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvciNnZXRWZXJzaW9uKCkKKwkgKiBAc2VlICNnZXRDb25uZWN0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENvbm5lY3Rvcl9WZXJzaW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvciA8ZW0+Q29ubmVjdG9yIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db25uZWN0b3IgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NaXhlZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yI2dldE1peGVkKCkKKwkgKiBAc2VlICNnZXRDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAoKQorCSAqIEBzZWUgI2dldENvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCisJICogQHNlZSAjZ2V0Q29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldENvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yI2dldENvbm5lY3RvciA8ZW0+Q29ubmVjdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29ubmVjdG9yPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0Q29ubmVjdG9yKCkKKwkgKiBAc2VlICNnZXRDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Q29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JfQ29ubmVjdG9yKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyIDxlbT5JbmJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldE1lc3NhZ2VhZGFwdGVyIDxlbT5NZXNzYWdlYWRhcHRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1lc3NhZ2VhZGFwdGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlciNnZXRNZXNzYWdlYWRhcHRlcigpCisJICogQHNlZSAjZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcl9NZXNzYWdlYWRhcHRlcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlciNnZXRJZCgpCisJICogQHNlZSAjZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcl9JZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTGljZW5zZSA8ZW0+TGljZW5zZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5MaWNlbnNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTGljZW5zZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TGljZW5zZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkxpY2Vuc2UjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkxpY2Vuc2UjZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldExpY2Vuc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldExpY2Vuc2VfRGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTGljZW5zZSNpc0xpY2Vuc2VSZXF1aXJlZCA8ZW0+TGljZW5zZSBSZXF1aXJlZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpY2Vuc2UgUmVxdWlyZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5MaWNlbnNlI2lzTGljZW5zZVJlcXVpcmVkKCkKKwkgKiBAc2VlICNnZXRMaWNlbnNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRMaWNlbnNlX0xpY2Vuc2VSZXF1aXJlZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5MaWNlbnNlI2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTGljZW5zZSNnZXRJZCgpCisJICogQHNlZSAjZ2V0TGljZW5zZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0TGljZW5zZV9JZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTWVzc2FnZUFkYXB0ZXIgPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXNzYWdlIEFkYXB0ZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5NZXNzYWdlQWRhcHRlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TWVzc2FnZUFkYXB0ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5NZXNzYWdlQWRhcHRlciNnZXRNZXNzYWdlbGlzdGVuZXIgPGVtPk1lc3NhZ2VsaXN0ZW5lcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZWxpc3RlbmVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTWVzc2FnZUFkYXB0ZXIjZ2V0TWVzc2FnZWxpc3RlbmVyKCkKKwkgKiBAc2VlICNnZXRNZXNzYWdlQWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0TWVzc2FnZUFkYXB0ZXJfTWVzc2FnZWxpc3RlbmVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk1lc3NhZ2VBZGFwdGVyI2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTWVzc2FnZUFkYXB0ZXIjZ2V0SWQoKQorCSAqIEBzZWUgI2dldE1lc3NhZ2VBZGFwdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRNZXNzYWdlQWRhcHRlcl9JZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTWVzc2FnZUxpc3RlbmVyIDxlbT5NZXNzYWdlIExpc3RlbmVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5NZXNzYWdlTGlzdGVuZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldE1lc3NhZ2VMaXN0ZW5lcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5NZXNzYWdlTGlzdGVuZXIjZ2V0TWVzc2FnZWxpc3RlbmVyVHlwZSA8ZW0+TWVzc2FnZWxpc3RlbmVyIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXNzYWdlbGlzdGVuZXIgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciNnZXRNZXNzYWdlbGlzdGVuZXJUeXBlKCkKKwkgKiBAc2VlICNnZXRNZXNzYWdlTGlzdGVuZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldE1lc3NhZ2VMaXN0ZW5lcl9NZXNzYWdlbGlzdGVuZXJUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciNnZXRBY3RpdmF0aW9uc3BlYyA8ZW0+QWN0aXZhdGlvbnNwZWM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BY3RpdmF0aW9uc3BlYzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk1lc3NhZ2VMaXN0ZW5lciNnZXRBY3RpdmF0aW9uc3BlYygpCisJICogQHNlZSAjZ2V0TWVzc2FnZUxpc3RlbmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRNZXNzYWdlTGlzdGVuZXJfQWN0aXZhdGlvbnNwZWMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTWVzc2FnZUxpc3RlbmVyI2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTWVzc2FnZUxpc3RlbmVyI2dldElkKCkKKwkgKiBAc2VlICNnZXRNZXNzYWdlTGlzdGVuZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldE1lc3NhZ2VMaXN0ZW5lcl9JZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldENvbm5lY3Rpb25EZWZpbml0aW9uIDxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldENvbm5lY3Rpb25EZWZpbml0aW9uKCkKKwkgKiBAc2VlICNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkRlZmluaXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0IDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldFRyYW5zYWN0aW9uU3VwcG9ydCgpCisJICogQHNlZSAjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIDxlbT5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc208L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkKKwkgKiBAc2VlICNnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc20oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCA8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpCisJICogQHNlZSAjZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyI2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIjZ2V0SWQoKQorCSAqIEBzZWUgI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9JZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eSA8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5I2dldERlc2NyaXB0aW9uKCkKKwkgKiBAc2VlICNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHkjZ2V0Q29uZmlnUHJvcGVydHlOYW1lIDxlbT5Db25maWcgUHJvcGVydHkgTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBOYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eSNnZXRDb25maWdQcm9wZXJ0eU5hbWUoKQorCSAqIEBzZWUgI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlOYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHkjZ2V0SWQgPGVtPklkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5I2dldElkKCkKKwkgKiBAc2VlICNnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5X0lkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIgPGVtPlJlc291cmNlIEFkYXB0ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlc291cmNlQWRhcHRlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UmVzb3VyY2VBZGFwdGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRSZXNvdXJjZWFkYXB0ZXJDbGFzcyA8ZW0+UmVzb3VyY2VhZGFwdGVyIENsYXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzb3VyY2VhZGFwdGVyIENsYXNzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldFJlc291cmNlYWRhcHRlckNsYXNzKCkKKwkgKiBAc2VlICNnZXRSZXNvdXJjZUFkYXB0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJlc291cmNlQWRhcHRlcl9SZXNvdXJjZWFkYXB0ZXJDbGFzcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRDb25maWdQcm9wZXJ0eSA8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db25maWcgUHJvcGVydHk8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0Q29uZmlnUHJvcGVydHkoKQorCSAqIEBzZWUgI2dldFJlc291cmNlQWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnR5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRPdXRib3VuZFJlc291cmNlYWRhcHRlciA8ZW0+T3V0Ym91bmQgUmVzb3VyY2VhZGFwdGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2VhZGFwdGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldE91dGJvdW5kUmVzb3VyY2VhZGFwdGVyKCkKKwkgKiBAc2VlICNnZXRSZXNvdXJjZUFkYXB0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlYWRhcHRlcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0SW5ib3VuZFJlc291cmNlYWRhcHRlciA8ZW0+SW5ib3VuZCBSZXNvdXJjZWFkYXB0ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbmJvdW5kIFJlc291cmNlYWRhcHRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRJbmJvdW5kUmVzb3VyY2VhZGFwdGVyKCkKKwkgKiBAc2VlICNnZXRSZXNvdXJjZUFkYXB0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VhZGFwdGVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldEFkbWlub2JqZWN0IDxlbT5BZG1pbm9iamVjdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWRtaW5vYmplY3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0QWRtaW5vYmplY3QoKQorCSAqIEBzZWUgI2dldFJlc291cmNlQWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX0FkbWlub2JqZWN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuUmVzb3VyY2VBZGFwdGVyI2dldFNlY3VyaXR5UGVybWlzc2lvbiA8ZW0+U2VjdXJpdHkgUGVybWlzc2lvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VjdXJpdHkgUGVybWlzc2lvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlc291cmNlQWRhcHRlciNnZXRTZWN1cml0eVBlcm1pc3Npb24oKQorCSAqIEBzZWUgI2dldFJlc291cmNlQWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0SWQgPGVtPklkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIjZ2V0SWQoKQorCSAqIEBzZWUgI2dldFJlc291cmNlQWRhcHRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBZGFwdGVyX0lkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb24gPGVtPlNlY3VyaXR5IFBlcm1pc3Npb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U2VjdXJpdHkgUGVybWlzc2lvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0U2VjdXJpdHlQZXJtaXNzaW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb24jZ2V0RGVzY3JpcHRpb24oKQorCSAqIEBzZWUgI2dldFNlY3VyaXR5UGVybWlzc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbiNnZXRTZWN1cml0eVBlcm1pc3Npb25TcGVjIDxlbT5TZWN1cml0eSBQZXJtaXNzaW9uIFNwZWM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZWN1cml0eSBQZXJtaXNzaW9uIFNwZWM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb24jZ2V0U2VjdXJpdHlQZXJtaXNzaW9uU3BlYygpCisJICogQHNlZSAjZ2V0U2VjdXJpdHlQZXJtaXNzaW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTZWN1cml0eVBlcm1pc3Npb25fU2VjdXJpdHlQZXJtaXNzaW9uU3BlYygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb24jZ2V0SWQgPGVtPklkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb24jZ2V0SWQoKQorCSAqIEBzZWUgI2dldFNlY3VyaXR5UGVybWlzc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0lkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbmZpZ1Byb3BlcnR5VHlwZVR5cGUgPGVtPkNvbmZpZyBQcm9wZXJ0eSBUeXBlIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Db25maWcgUHJvcGVydHkgVHlwZSBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHlUeXBlVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRW51bSBnZXRDb25maWdQcm9wZXJ0eVR5cGVUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlIDxlbT5DcmVkZW50aWFsIEludGVyZmFjZSBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+Q3JlZGVudGlhbCBJbnRlcmZhY2UgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydFR5cGUgPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlRyYW5zYWN0aW9uIFN1cHBvcnQgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlRyYW5zYWN0aW9uU3VwcG9ydFR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0VHJhbnNhY3Rpb25TdXBwb3J0VHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNvbmZpZyBQcm9wZXJ0eSBOYW1lIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBOYW1lIFR5cGU8L2VtPicuCisJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCisJICogQGdlbmVyYXRlZAorCSAqLworCUVEYXRhVHlwZSBnZXRDb25maWdQcm9wZXJ0eU5hbWVUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHlUeXBlVHlwZSA8ZW0+Q29uZmlnIFByb3BlcnR5IFR5cGUgVHlwZSBPYmplY3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBUeXBlIFR5cGUgT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHlUeXBlVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRGF0YVR5cGUgZ2V0Q29uZmlnUHJvcGVydHlUeXBlVHlwZU9iamVjdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNyZWRlbnRpYWxJbnRlcmZhY2VUeXBlIDxlbT5DcmVkZW50aWFsIEludGVyZmFjZSBUeXBlIE9iamVjdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q3JlZGVudGlhbCBJbnRlcmZhY2UgVHlwZSBPYmplY3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5DcmVkZW50aWFsSW50ZXJmYWNlVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRGF0YVR5cGUgZ2V0Q3JlZGVudGlhbEludGVyZmFjZVR5cGVPYmplY3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRUeXBlIDxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0IFR5cGUgT2JqZWN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0IFR5cGUgT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0VHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRGF0YVR5cGUgZ2V0VHJhbnNhY3Rpb25TdXBwb3J0VHlwZU9iamVjdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJSmNhRmFjdG9yeSBnZXRKY2FGYWN0b3J5KCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKwkgKiA8dWw+CisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKwkgKiA8L3VsPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnRlcmZhY2UgTGl0ZXJhbHMgeworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQWN0aXZhdGlvblNwZWNJbXBsIDxlbT5BY3RpdmF0aW9uIFNwZWM8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkFjdGl2YXRpb25TcGVjSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0QWN0aXZhdGlvblNwZWMoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQUNUSVZBVElPTl9TUEVDID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25TcGVjKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uc3BlYyBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTlNQRUNfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvblNwZWNfQWN0aXZhdGlvbnNwZWNDbGFzcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBBQ1RJVkFUSU9OX1NQRUNfX1JFUVVJUkVEX0NPTkZJR19QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uU3BlY19SZXF1aXJlZENvbmZpZ1Byb3BlcnR5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFDVElWQVRJT05fU1BFQ19fQ09ORklHX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldEFjdGl2YXRpb25TcGVjX0NvbmZpZ1Byb3BlcnR5KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEFDVElWQVRJT05fU1BFQ19fSUQgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZhdGlvblNwZWNfSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQWRtaW5PYmplY3RJbXBsIDxlbT5BZG1pbiBPYmplY3Q8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkFkbWluT2JqZWN0SW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0QWRtaW5PYmplY3QoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQURNSU5fT0JKRUNUID0gZUlOU1RBTkNFLmdldEFkbWluT2JqZWN0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZG1pbm9iamVjdCBJbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBBRE1JTl9PQkpFQ1RfX0FETUlOT0JKRUNUX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRBZG1pbk9iamVjdF9BZG1pbm9iamVjdEludGVyZmFjZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRtaW5vYmplY3QgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBBRE1JTl9PQkpFQ1RfX0FETUlOT0JKRUNUX0NMQVNTID0gZUlOU1RBTkNFLmdldEFkbWluT2JqZWN0X0FkbWlub2JqZWN0Q2xhc3MoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQURNSU5fT0JKRUNUX19DT05GSUdfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0QWRtaW5PYmplY3RfQ29uZmlnUHJvcGVydHkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQURNSU5fT0JKRUNUX19JRCA9IGVJTlNUQU5DRS5nZXRBZG1pbk9iamVjdF9JZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwgPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQXV0aGVudGljYXRpb25NZWNoYW5pc21JbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBBVVRIRU5USUNBVElPTl9NRUNIQU5JU00gPSBlSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DcmVkZW50aWFsIEludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQ3JlZGVudGlhbEludGVyZmFjZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBBVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0lEID0gZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0lkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbmZpZ1Byb3BlcnR5SW1wbCA8ZW0+Q29uZmlnIFByb3BlcnR5PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25maWdQcm9wZXJ0eUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldENvbmZpZ1Byb3BlcnR5KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENPTkZJR19QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIENPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfTkFNRSA9IGVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eV9Db25maWdQcm9wZXJ0eU5hbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eV9Db25maWdQcm9wZXJ0eVR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eSBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENPTkZJR19QUk9QRVJUWV9fQ09ORklHX1BST1BFUlRZX1ZBTFVFID0gZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5VmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eSBJZ25vcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9JR05PUkUgPSBlSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlJZ25vcmUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eSBTdXBwb3J0cyBEeW5hbWljIFVwZGF0ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDT05GSUdfUFJPUEVSVFlfX0NPTkZJR19QUk9QRVJUWV9TVVBQT1JUU19EWU5BTUlDX1VQREFURVMgPSBlSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlfQ29uZmlnUHJvcGVydHlTdXBwb3J0c0R5bmFtaWNVcGRhdGVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydHkgQ29uZmlkZW50aWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfQ09ORklERU5USUFMID0gZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5Q29uZmlkZW50aWFsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENPTkZJR19QUk9QRVJUWV9fSUQgPSBlSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlfSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsIDxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3Rpb25EZWZpbml0aW9uSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0Q29ubmVjdGlvbkRlZmluaXRpb24oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQ09OTkVDVElPTl9ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnkgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURDT05ORUNUSU9ORkFDVE9SWV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9NYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnlDbGFzcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlnIFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTkZJR19QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25maWdQcm9wZXJ0eSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29ubmVjdGlvbmZhY3RvcnkgSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9ORkFDVE9SWV9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbmZhY3RvcnlJbnRlcmZhY2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb25mYWN0b3J5IEltcGwgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05GQUNUT1JZX0lNUExfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbmZhY3RvcnlJbXBsQ2xhc3MoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gSW50ZXJmYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0lOVEVSRkFDRSA9IGVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW50ZXJmYWNlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25uZWN0aW9uIEltcGwgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU1QTF9DTEFTUyA9IGVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENPTk5FQ1RJT05fREVGSU5JVElPTl9fSUQgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9ySW1wbCA8ZW0+Q29ubmVjdG9yPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRDb25uZWN0b3IoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQ09OTkVDVE9SID0gZUlOU1RBTkNFLmdldENvbm5lY3RvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TW9kdWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDT05ORUNUT1JfX01PRFVMRV9OQU1FID0gZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9Nb2R1bGVOYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIENPTk5FQ1RPUl9fREVTQ1JJUFRJT05TID0gZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9EZXNjcmlwdGlvbnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIENPTk5FQ1RPUl9fRElTUExBWV9OQU1FUyA9IGVJTlNUQU5DRS5nZXRDb25uZWN0b3JfRGlzcGxheU5hbWVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQ09OTkVDVE9SX19JQ09OUyA9IGVJTlNUQU5DRS5nZXRDb25uZWN0b3JfSWNvbnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlbmRvciBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ09OTkVDVE9SX19WRU5ET1JfTkFNRSA9IGVJTlNUQU5DRS5nZXRDb25uZWN0b3JfVmVuZG9yTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWlzIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDT05ORUNUT1JfX0VJU19UWVBFID0gZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9FaXNUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZWFkYXB0ZXIgVmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENPTk5FQ1RPUl9fUkVTT1VSQ0VBREFQVEVSX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1Jlc291cmNlYWRhcHRlclZlcnNpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpY2Vuc2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBDT05ORUNUT1JfX0xJQ0VOU0UgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX0xpY2Vuc2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlYWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIENPTk5FQ1RPUl9fUkVTT1VSQ0VBREFQVEVSID0gZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9SZXNvdXJjZWFkYXB0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkIFdvcmsgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ09OTkVDVE9SX19SRVFVSVJFRF9XT1JLX0NPTlRFWFQgPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1JlcXVpcmVkV29ya0NvbnRleHQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ09OTkVDVE9SX19JRCA9IGVJTlNUQU5DRS5nZXRDb25uZWN0b3JfSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ09OTkVDVE9SX19NRVRBREFUQV9DT01QTEVURSA9IGVJTlNUQU5DRS5nZXRDb25uZWN0b3JfTWV0YWRhdGFDb21wbGV0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENPTk5FQ1RPUl9fVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRDb25uZWN0b3JfVmVyc2lvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvckltcGwgPGVtPkNvbm5lY3RvciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9ySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0Q29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQ09OTkVDVE9SX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEID0gZUlOU1RBTkNFLmdldENvbm5lY3RvckRlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQ09OTkVDVE9SX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCA9IGVJTlNUQU5DRS5nZXRDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIENPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3RvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIENPTk5FQ1RPUl9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX0NPTk5FQ1RPUiA9IGVJTlNUQU5DRS5nZXRDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcl9Db25uZWN0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwgPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSID0gZUlOU1RBTkNFLmdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2VhZGFwdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFQURBUFRFUiA9IGVJTlNUQU5DRS5nZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX01lc3NhZ2VhZGFwdGVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIElOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fSUQgPSBlSU5TVEFOQ0UuZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcl9JZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5MaWNlbnNlSW1wbCA8ZW0+TGljZW5zZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuTGljZW5zZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldExpY2Vuc2UoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgTElDRU5TRSA9IGVJTlNUQU5DRS5nZXRMaWNlbnNlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgTElDRU5TRV9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0TGljZW5zZV9EZXNjcmlwdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGljZW5zZSBSZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIExJQ0VOU0VfX0xJQ0VOU0VfUkVRVUlSRUQgPSBlSU5TVEFOQ0UuZ2V0TGljZW5zZV9MaWNlbnNlUmVxdWlyZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTElDRU5TRV9fSUQgPSBlSU5TVEFOQ0UuZ2V0TGljZW5zZV9JZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5NZXNzYWdlQWRhcHRlckltcGwgPGVtPk1lc3NhZ2UgQWRhcHRlcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUFkYXB0ZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRNZXNzYWdlQWRhcHRlcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBNRVNTQUdFX0FEQVBURVIgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZUFkYXB0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2VsaXN0ZW5lcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFTElTVEVORVIgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZUFkYXB0ZXJfTWVzc2FnZWxpc3RlbmVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIE1FU1NBR0VfQURBUFRFUl9fSUQgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZUFkYXB0ZXJfSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUxpc3RlbmVySW1wbCA8ZW0+TWVzc2FnZSBMaXN0ZW5lcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuTWVzc2FnZUxpc3RlbmVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0TWVzc2FnZUxpc3RlbmVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIE1FU1NBR0VfTElTVEVORVIgPSBlSU5TVEFOQ0UuZ2V0TWVzc2FnZUxpc3RlbmVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlbGlzdGVuZXIgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIE1FU1NBR0VfTElTVEVORVJfX01FU1NBR0VMSVNURU5FUl9UWVBFID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VMaXN0ZW5lcl9NZXNzYWdlbGlzdGVuZXJUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3RpdmF0aW9uc3BlYzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIE1FU1NBR0VfTElTVEVORVJfX0FDVElWQVRJT05TUEVDID0gZUlOU1RBTkNFLmdldE1lc3NhZ2VMaXN0ZW5lcl9BY3RpdmF0aW9uc3BlYygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBNRVNTQUdFX0xJU1RFTkVSX19JRCA9IGVJTlNUQU5DRS5nZXRNZXNzYWdlTGlzdGVuZXJfSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsIDxlbT5PdXRib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIE9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVIgPSBlSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25EZWZpbml0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBTdXBwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fVFJBTlNBQ1RJT05fU1VQUE9SVCA9IGVJTlNUQU5DRS5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNID0gZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBPVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQgPSBlSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgT1VUQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fSUQgPSBlSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuUmVxdWlyZWRDb25maWdQcm9wZXJ0eUltcGwgPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuUmVxdWlyZWRDb25maWdQcm9wZXJ0eUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldFJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUkVRVUlSRURfQ09ORklHX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmZpZyBQcm9wZXJ0eSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX19DT05GSUdfUFJPUEVSVFlfTkFNRSA9IGVJTlNUQU5DRS5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5X0NvbmZpZ1Byb3BlcnR5TmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBSRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfX0lEID0gZUlOU1RBTkNFLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlfSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuUmVzb3VyY2VBZGFwdGVySW1wbCA8ZW0+UmVzb3VyY2UgQWRhcHRlcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuUmVzb3VyY2VBZGFwdGVySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0UmVzb3VyY2VBZGFwdGVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJFU09VUkNFX0FEQVBURVIgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZWFkYXB0ZXIgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9BREFQVEVSX19SRVNPVVJDRUFEQVBURVJfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlYWRhcHRlckNsYXNzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25maWcgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFJFU09VUkNFX0FEQVBURVJfX0NPTkZJR19QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29uZmlnUHJvcGVydHkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dGJvdW5kIFJlc291cmNlYWRhcHRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFJFU09VUkNFX0FEQVBURVJfX09VVEJPVU5EX1JFU09VUkNFQURBUFRFUiA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZWFkYXB0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluYm91bmQgUmVzb3VyY2VhZGFwdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUkVTT1VSQ0VfQURBUFRFUl9fSU5CT1VORF9SRVNPVVJDRUFEQVBURVIgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZWFkYXB0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkbWlub2JqZWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBSRVNPVVJDRV9BREFQVEVSX19BRE1JTk9CSkVDVCA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQWRtaW5vYmplY3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFBlcm1pc3Npb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFJFU09VUkNFX0FEQVBURVJfX1NFQ1VSSVRZX1BFUk1JU1NJT04gPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9BREFQVEVSX19JRCA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfSWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuU2VjdXJpdHlQZXJtaXNzaW9uSW1wbCA8ZW0+U2VjdXJpdHkgUGVybWlzc2lvbjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuU2VjdXJpdHlQZXJtaXNzaW9uSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0U2VjdXJpdHlQZXJtaXNzaW9uKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFNFQ1VSSVRZX1BFUk1JU1NJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBQZXJtaXNzaW9uIFNwZWM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBTRUNVUklUWV9QRVJNSVNTSU9OX19TRUNVUklUWV9QRVJNSVNTSU9OX1NQRUMgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX1NlY3VyaXR5UGVybWlzc2lvblNwZWMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0VDVVJJVFlfUEVSTUlTU0lPTl9fSUQgPSBlSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0lkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eVR5cGVUeXBlIDxlbT5Db25maWcgUHJvcGVydHkgVHlwZSBUeXBlPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eVR5cGVUeXBlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRDb25maWdQcm9wZXJ0eVR5cGVUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gQ09ORklHX1BST1BFUlRZX1RZUEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eVR5cGVUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5DcmVkZW50aWFsSW50ZXJmYWNlVHlwZSA8ZW0+Q3JlZGVudGlhbCBJbnRlcmZhY2UgVHlwZTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ3JlZGVudGlhbEludGVyZmFjZVR5cGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gQ1JFREVOVElBTF9JTlRFUkZBQ0VfVFlQRSA9IGVJTlNUQU5DRS5nZXRDcmVkZW50aWFsSW50ZXJmYWNlVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0VHlwZSA8ZW0+VHJhbnNhY3Rpb24gU3VwcG9ydCBUeXBlPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRUeXBlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRUcmFuc2FjdGlvblN1cHBvcnRUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gVFJBTlNBQ1RJT05fU1VQUE9SVF9UWVBFID0gZUlOU1RBTkNFLmdldFRyYW5zYWN0aW9uU3VwcG9ydFR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkNvbmZpZyBQcm9wZXJ0eSBOYW1lIFR5cGU8L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRDb25maWdQcm9wZXJ0eU5hbWVUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRURhdGFUeXBlIENPTkZJR19QUk9QRVJUWV9OQU1FX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q29uZmlnUHJvcGVydHlOYW1lVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+Q29uZmlnIFByb3BlcnR5IFR5cGUgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eVR5cGVUeXBlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCNnZXRDb25maWdQcm9wZXJ0eVR5cGVUeXBlT2JqZWN0KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRURhdGFUeXBlIENPTkZJR19QUk9QRVJUWV9UWVBFX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5VHlwZVR5cGVPYmplY3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPkNyZWRlbnRpYWwgSW50ZXJmYWNlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ3JlZGVudGlhbEludGVyZmFjZVR5cGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsI2dldENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlT2JqZWN0KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRURhdGFUeXBlIENSRURFTlRJQUxfSU5URVJGQUNFX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldENyZWRlbnRpYWxJbnRlcmZhY2VUeXBlT2JqZWN0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5UcmFuc2FjdGlvbiBTdXBwb3J0IFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuVHJhbnNhY3Rpb25TdXBwb3J0VHlwZQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwjZ2V0VHJhbnNhY3Rpb25TdXBwb3J0VHlwZU9iamVjdCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVEYXRhVHlwZSBUUkFOU0FDVElPTl9TVVBQT1JUX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldFRyYW5zYWN0aW9uU3VwcG9ydFR5cGVPYmplY3QoKTsKKworCX0KKworfSAvL0pjYVBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL3V0aWwvSmNhQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL3V0aWwvSmNhQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2FlYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwubWV0YWRhdGEuSmNhUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEpjYUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBKY2FQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSmNhQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gSmNhUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEpjYVN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9CisJCW5ldyBKY2FTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBY3RpdmF0aW9uU3BlYyhBY3RpdmF0aW9uU3BlYyBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQWN0aXZhdGlvblNwZWNBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBZG1pbk9iamVjdChBZG1pbk9iamVjdCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQWRtaW5PYmplY3RBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBdXRoZW50aWNhdGlvbk1lY2hhbmlzbShBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21BZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb25maWdQcm9wZXJ0eShDb25maWdQcm9wZXJ0eSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29uZmlnUHJvcGVydHlBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb25uZWN0aW9uRGVmaW5pdGlvbihDb25uZWN0aW9uRGVmaW5pdGlvbiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb25BZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb25uZWN0b3IoQ29ubmVjdG9yIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDb25uZWN0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcihDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKEluYm91bmRSZXNvdXJjZUFkYXB0ZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMaWNlbnNlKExpY2Vuc2Ugb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUxpY2Vuc2VBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXNzYWdlQWRhcHRlcihNZXNzYWdlQWRhcHRlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZUFkYXB0ZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXNzYWdlTGlzdGVuZXIoTWVzc2FnZUxpc3RlbmVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlTGlzdGVuZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VPdXRib3VuZFJlc291cmNlQWRhcHRlcihPdXRib3VuZFJlc291cmNlQWRhcHRlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSZXF1aXJlZENvbmZpZ1Byb3BlcnR5KFJlcXVpcmVkQ29uZmlnUHJvcGVydHkgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSZXNvdXJjZUFkYXB0ZXIoUmVzb3VyY2VBZGFwdGVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTZWN1cml0eVBlcm1pc3Npb24oU2VjdXJpdHlQZXJtaXNzaW9uIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb25BZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgorCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgeworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKKwl9CisKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWN0aXZhdGlvblNwZWMgPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BY3RpdmF0aW9uU3BlYworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3RpdmF0aW9uU3BlY0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQWRtaW5PYmplY3QgPGVtPkFkbWluIE9iamVjdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BZG1pbk9iamVjdAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZG1pbk9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc20gPGVtPkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29uZmlnUHJvcGVydHkgPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25maWdQcm9wZXJ0eQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25maWdQcm9wZXJ0eUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb24gPGVtPkNvbm5lY3Rpb24gRGVmaW5pdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25uZWN0aW9uRGVmaW5pdGlvbkFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yIDxlbT5Db25uZWN0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbm5lY3RvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IgPGVtPkNvbm5lY3RvciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3JBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXIgPGVtPkluYm91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkxpY2Vuc2UgPGVtPkxpY2Vuc2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTGljZW5zZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMaWNlbnNlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5NZXNzYWdlQWRhcHRlciA8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLk1lc3NhZ2VBZGFwdGVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VBZGFwdGVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5NZXNzYWdlTGlzdGVuZXIgPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuTWVzc2FnZUxpc3RlbmVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VMaXN0ZW5lckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHkgPGVtPlJlcXVpcmVkIENvbmZpZyBQcm9wZXJ0eTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLlJlc291cmNlQWRhcHRlciA8ZW0+UmVzb3VyY2UgQWRhcHRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5SZXNvdXJjZUFkYXB0ZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb24gPGVtPlNlY3VyaXR5IFBlcm1pc3Npb248L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbkFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9KY2FBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC91dGlsL0pjYVJlc291cmNlRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDVjNjJlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlJlc291cmNlIEZhY3Rvcnk8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC51dGlsLkpjYVJlc291cmNlSW1wbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgSmNhUmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgeworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEpjYVJlc291cmNlRmFjdG9yeUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKKwkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IEpjYVJlc291cmNlSW1wbCh1cmkpOworCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7CisJCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKKworCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7CisKKwkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOworCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7CisKKwkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0xFWElDQUxfSEFORExFUiwgQm9vbGVhbi5UUlVFKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKK30gLy9KY2FSZXNvdXJjZUZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC91dGlsL0pjYVJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FSZXNvdXJjZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGE2ZWVjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FSZXNvdXJjZUltcGwuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MTG9hZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSkVFWE1MTG9hZEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWwuSmF2YWVlUmVzb3VyY2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5Db25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5JQ29ubmVjdG9yUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSVJvb3RPYmplY3RSZXNvdXJjZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLnV0aWwuSmNhUmVzb3VyY2VGYWN0b3J5SW1wbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgSmNhUmVzb3VyY2VJbXBsIGV4dGVuZHMgSmF2YWVlUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgSVJvb3RPYmplY3RSZXNvdXJjZSwgSUNvbm5lY3RvclJlc291cmNlIHsKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSmNhUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKKwkJc3VwZXIodXJpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgWE1MTG9hZCBjcmVhdGVYTUxMb2FkKCkgeworCQkgcmV0dXJuIG5ldyBKRUVYTUxMb2FkSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7CisJfQorCisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7CisJCQorCQlyZXR1cm4gbmV3IEpjYVhNTEhlbHBlckltcGwodGhpcyk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuSUNvbm5lY3RvclJlc291cmNlI2dldFJvb3RPYmplY3QoKQorCSAqLworCXB1YmxpYyBFT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7CisJCWlmIChjb250ZW50cyA9PSBudWxsIHx8IGNvbnRlbnRzLmlzRW1wdHkoKSkKKwkJCXJldHVybiBudWxsOworCQlPYmplY3Qgcm9vdCA9IGdldENvbnRlbnRzKCkuZ2V0KDApOworCQlpZihyb290ID09IG51bGwpeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIChFT2JqZWN0KSgoQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3Ipcm9vdCkuZ2V0Q29ubmVjdG9yKCk7CisJfQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLklDb25uZWN0b3JSZXNvdXJjZSNnZXRDb25uZWN0b3IoKQorCSAqLworCXB1YmxpYyBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKCkgeworCQlyZXR1cm4gKENvbm5lY3RvcilnZXRSb290T2JqZWN0KCk7CisJfQorCit9IC8vSmNhUmVzb3VyY2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC91dGlsL0pjYVN3aXRjaC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjkzMmI4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FTd2l0Y2guamF2YQpAQCAtMCwwICsxLDQzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQorICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEpjYVN3aXRjaDxUPiB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBKY2FQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSmNhU3dpdGNoKCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOworCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7CisJCX0KKwkJZWxzZSB7CisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKKwkJCXJldHVybgorCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CisJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7CisJCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDOiB7CisJCQkJQWN0aXZhdGlvblNwZWMgYWN0aXZhdGlvblNwZWMgPSAoQWN0aXZhdGlvblNwZWMpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VBY3RpdmF0aW9uU3BlYyhhY3RpdmF0aW9uU3BlYyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVDogeworCQkJCUFkbWluT2JqZWN0IGFkbWluT2JqZWN0ID0gKEFkbWluT2JqZWN0KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQWRtaW5PYmplY3QoYWRtaW5PYmplY3QpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU006IHsKKwkJCQlBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbSA9IChBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZOiB7CisJCQkJQ29uZmlnUHJvcGVydHkgY29uZmlnUHJvcGVydHkgPSAoQ29uZmlnUHJvcGVydHkpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDb25maWdQcm9wZXJ0eShjb25maWdQcm9wZXJ0eSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTjogeworCQkJCUNvbm5lY3Rpb25EZWZpbml0aW9uIGNvbm5lY3Rpb25EZWZpbml0aW9uID0gKENvbm5lY3Rpb25EZWZpbml0aW9uKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQ29ubmVjdGlvbkRlZmluaXRpb24oY29ubmVjdGlvbkRlZmluaXRpb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1I6IHsKKwkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gKENvbm5lY3Rvcil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUNvbm5lY3Rvcihjb25uZWN0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfREVQTE9ZTUVOVF9ERVNDUklQVE9SOiB7CisJCQkJQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IgY29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IgPSAoQ29ubmVjdG9yRGVwbG95bWVudERlc2NyaXB0b3IpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcihjb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUjogeworCQkJCUluYm91bmRSZXNvdXJjZUFkYXB0ZXIgaW5ib3VuZFJlc291cmNlQWRhcHRlciA9IChJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlSW5ib3VuZFJlc291cmNlQWRhcHRlcihpbmJvdW5kUmVzb3VyY2VBZGFwdGVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRTogeworCQkJCUxpY2Vuc2UgbGljZW5zZSA9IChMaWNlbnNlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlTGljZW5zZShsaWNlbnNlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSOiB7CisJCQkJTWVzc2FnZUFkYXB0ZXIgbWVzc2FnZUFkYXB0ZXIgPSAoTWVzc2FnZUFkYXB0ZXIpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VNZXNzYWdlQWRhcHRlcihtZXNzYWdlQWRhcHRlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVI6IHsKKwkJCQlNZXNzYWdlTGlzdGVuZXIgbWVzc2FnZUxpc3RlbmVyID0gKE1lc3NhZ2VMaXN0ZW5lcil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZU1lc3NhZ2VMaXN0ZW5lcihtZXNzYWdlTGlzdGVuZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSOiB7CisJCQkJT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgPSAoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VPdXRib3VuZFJlc291cmNlQWRhcHRlcihvdXRib3VuZFJlc291cmNlQWRhcHRlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWTogeworCQkJCVJlcXVpcmVkQ29uZmlnUHJvcGVydHkgcmVxdWlyZWRDb25maWdQcm9wZXJ0eSA9IChSZXF1aXJlZENvbmZpZ1Byb3BlcnR5KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUmVxdWlyZWRDb25maWdQcm9wZXJ0eShyZXF1aXJlZENvbmZpZ1Byb3BlcnR5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUjogeworCQkJCVJlc291cmNlQWRhcHRlciByZXNvdXJjZUFkYXB0ZXIgPSAoUmVzb3VyY2VBZGFwdGVyKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUmVzb3VyY2VBZGFwdGVyKHJlc291cmNlQWRhcHRlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT046IHsKKwkJCQlTZWN1cml0eVBlcm1pc3Npb24gc2VjdXJpdHlQZXJtaXNzaW9uID0gKFNlY3VyaXR5UGVybWlzc2lvbil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVNlY3VyaXR5UGVybWlzc2lvbihzZWN1cml0eVBlcm1pc3Npb24pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2YXRpb24gU3BlYzwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUFjdGl2YXRpb25TcGVjKEFjdGl2YXRpb25TcGVjIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZG1pbiBPYmplY3Q8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BZG1pbiBPYmplY3Q8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VBZG1pbk9iamVjdChBZG1pbk9iamVjdCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0aGVudGljYXRpb24gTWVjaGFuaXNtPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQXV0aGVudGljYXRpb25NZWNoYW5pc20oQXV0aGVudGljYXRpb25NZWNoYW5pc20gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmZpZyBQcm9wZXJ0eTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUNvbmZpZ1Byb3BlcnR5KENvbmZpZ1Byb3BlcnR5IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25uZWN0aW9uIERlZmluaXRpb248L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDb25uZWN0aW9uRGVmaW5pdGlvbihDb25uZWN0aW9uRGVmaW5pdGlvbiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29ubmVjdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29ubmVjdG9yPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQ29ubmVjdG9yKENvbm5lY3RvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29ubmVjdG9yIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbm5lY3RvciBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvcihDb25uZWN0b3JEZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW5ib3VuZCBSZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlSW5ib3VuZFJlc291cmNlQWRhcHRlcihJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaWNlbnNlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGljZW5zZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUxpY2Vuc2UoTGljZW5zZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWVzc2FnZSBBZGFwdGVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlTWVzc2FnZUFkYXB0ZXIoTWVzc2FnZUFkYXB0ZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1lc3NhZ2UgTGlzdGVuZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXNzYWdlIExpc3RlbmVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlTWVzc2FnZUxpc3RlbmVyKE1lc3NhZ2VMaXN0ZW5lciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Ym91bmQgUmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGJvdW5kIFJlc291cmNlIEFkYXB0ZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VPdXRib3VuZFJlc291cmNlQWRhcHRlcihPdXRib3VuZFJlc291cmNlQWRhcHRlciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVxdWlyZWQgQ29uZmlnIFByb3BlcnR5PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUmVxdWlyZWRDb25maWdQcm9wZXJ0eShSZXF1aXJlZENvbmZpZ1Byb3BlcnR5IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBBZGFwdGVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgQWRhcHRlcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVJlc291cmNlQWRhcHRlcihSZXNvdXJjZUFkYXB0ZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IFBlcm1pc3Npb248L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBQZXJtaXNzaW9uPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU2VjdXJpdHlQZXJtaXNzaW9uKFNlY3VyaXR5UGVybWlzc2lvbiBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9KY2FTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL3V0aWwvSmNhWE1MSGVscGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FYTUxIZWxwZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmYjEzMgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL3V0aWwvSmNhWE1MSGVscGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWwuSkVFWE1MSGVscGVySW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlOworCitwdWJsaWMgY2xhc3MgSmNhWE1MSGVscGVySW1wbCBleHRlbmRzIEpFRVhNTEhlbHBlckltcGwgeworCisJcHVibGljIEpjYVhNTEhlbHBlckltcGwoWE1MUmVzb3VyY2UgcmVzb3VyY2UpIHsKKwkJc3VwZXIocmVzb3VyY2UpOworCX0KKworCQorCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKFN0cmluZyBwcmVmaXgpIHsKKwkJaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gSmNhUGFja2FnZS5lTlNfVVJJOworCQllbHNlCisJCQlyZXR1cm4gc3VwZXIuZ2V0VVJJKHByZWZpeCk7CisJfQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UU5hbWUoRVBhY2thZ2UgZVBhY2thZ2UsIFN0cmluZyBuYW1lLCBib29sZWFuIG11c3RIYXZlUHJlZml4KQorCSAgeworCSAgIFN0cmluZyBuc1ByZWZpeCA9IGdldFByZWZpeChlUGFja2FnZSwgbXVzdEhhdmVQcmVmaXgpOworCSAgIC8vIE5vdCB1c2luZyBFRTUgcGFja2FnZSBuYW1lc3BhY2UgLSBkZWZhdWx0IGplZTUgbmFtZXNwYWNlIGlzIHVzZWQKKwkgICBpZiAobnNQcmVmaXguZXF1YWxzKEpjYVBhY2thZ2UuZU5TX1BSRUZJWCkpIAorCSAgICB7CisJICAgIAlyZXR1cm4gbmFtZTsKKwkgICAgfQorCSAgICBlbHNlIHJldHVybiBzdXBlci5nZXRRTmFtZShlUGFja2FnZSwgbmFtZSwgbXVzdEhhdmVQcmVmaXgpOworCSAgfQorCisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvamNhL2ludGVybmFsL3V0aWwvSmNhWE1MUHJvY2Vzc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC91dGlsL0pjYVhNTFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYmE1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pjYS9pbnRlcm5hbC91dGlsL0pjYVhNTFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS51dGlsLlhNTFByb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIFhNTCBkb2N1bWVudHMKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEpjYVhNTFByb2Nlc3NvciBleHRlbmRzIFhNTFByb2Nlc3NvciB7CisKKwkvKioKKwkgKiBQdWJsaWMgY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgdGhlIGhlbHBlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgSmNhWE1MUHJvY2Vzc29yKCkgeworCQlzdXBlcigoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UpKTsKKwkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJfQorCQorCS8qKgorCSAqIFJlZ2lzdGVyIGZvciAiKiIgYW5kICJ4bWwiIGZpbGUgZXh0ZW5zaW9ucyB0aGUgSmNhUmVzb3VyY2VGYWN0b3J5SW1wbCBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBSZXNvdXJjZS5GYWN0b3J5PiBnZXRSZWdpc3RyYXRpb25zKCkgeworCQlpZiAocmVnaXN0cmF0aW9ucyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRSZWdpc3RyYXRpb25zKCk7CisJCQlyZWdpc3RyYXRpb25zLnB1dChYTUxfRVhURU5TSU9OLCBuZXcgSmNhUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKKwkJCXJlZ2lzdHJhdGlvbnMucHV0KFNUQVJfRVhURU5TSU9OLCBuZXcgSmNhUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKKwkJfQorCQlyZXR1cm4gcmVnaXN0cmF0aW9uczsKKwl9CisKK30gLy9KY2FYTUxQcm9jZXNzb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL0pzcENvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvSnNwQ29uZmlnLmphdmEKaW5kZXggYmVkZjRkYy4uOTNkMzliZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvSnNwQ29uZmlnLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvSnNwQ29uZmlnLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKICAqIAlpbmZvcm1hdGlvbiBmb3IgdGhlIEpTUCBmaWxlcyBpbiBhIHdlYiBhcHBsaWNhdGlvbi4gSXQgaGFzCiAgKiAJdHdvIHN1YmVsZW1lbnRzLCB0YWdsaWIgYW5kIGpzcC1wcm9wZXJ0eS1ncm91cC4KICAqIAorICogCUBzaW5jZSBKYXZhIEVFIDUsIEpTUCAyLjEKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTU2LDcgKzU3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0SnNwQ29uZmlnX1RhZ0xpYnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFRhZ0xpYnMoKTsKKwlMaXN0PFRhZ0xpYj4gZ2V0VGFnTGlicygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SnNwIFByb3BlcnR5IEdyb3VwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03MSw3ICs3Miw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcENvbmZpZ19Kc3BQcm9wZXJ0eUdyb3VwcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0SnNwUHJvcGVydHlHcm91cHMoKTsKKwlMaXN0PEpzcFByb3BlcnR5R3JvdXA+IGdldEpzcFByb3BlcnR5R3JvdXBzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvSnNwUHJvcGVydHlHcm91cC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvSnNwUHJvcGVydHlHcm91cC5qYXZhCmluZGV4IDI2NmVkZjcuLmQ3OWRkYzkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL0pzcFByb3BlcnR5R3JvdXAuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9Kc3BQcm9wZXJ0eUdyb3VwLmphdmEKQEAgLTEyLDcgKzEyLDExIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTM2LDcgKzQwLDEyIEBACiAgKiAgICAgICAgICAgICAgIHdoZW4gdXNlZCBhcyBhIFN0cmluZyBsaXRlcmFsLgogICogICAgICAgICAgICAgLSBDb250cm9sIHdoZXRoZXIgdGVtcGxhdGUgdGV4dCBjb250YWluaW5nIG9ubHkKICAqICAgICAgICAgICAgICAgd2hpdGVzcGFjZXMgbXVzdCBiZSByZW1vdmVkIGZyb20gdGhlIHJlc3BvbnNlIG91dHB1dC4KKyAqIAkgICAgLSBJbmRpY2F0ZSB0aGUgZGVmYXVsdCBjb250ZW50VHlwZSBpbmZvcm1hdGlvbi4KKyAqIAkgICAgLSBJbmRpY2F0ZSB0aGUgZGVmYXVsdCBidWZmZXJpbmcgbW9kZWwgZm9yIEpzcFdyaXRlcgorICogCSAgICAtIENvbnRyb2wgd2hldGhlciBlcnJvciBzaG91bGQgYmUgcmFpc2VkIGZvciB0aGUgdXNlIG9mCisgKiAJICAgICAgdW5kZWNsYXJlZCBuYW1lc3BhY2VzIGluIGEgSlNQIHBhZ2UuCiAgKiAKKyAqIAlAc2luY2UgSmF2YSBFRSA1LCBKU1AgMi4xCiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC01NSw2ICs2NCw5IEBACiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRJbmNsdWRlQ29kYXMgPGVtPkluY2x1ZGUgQ29kYXM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwgPGVtPkRlZmVycmVkIFN5bnRheCBBbGxvd2VkIEFzIExpdGVyYWw8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMgPGVtPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldERlZmF1bHRDb250ZW50VHlwZSA8ZW0+RGVmYXVsdCBDb250ZW50IFR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0QnVmZmVyIDxlbT5CdWZmZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjaXNFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSA8ZW0+RXJyb3IgT24gVW5kZWNsYXJlZCBOYW1lc3BhY2U8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CkBAIC03Nyw3ICs4OSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtOTIsNyArMTA0LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0SnNwUHJvcGVydHlHcm91cF9EaXNwbGF5TmFtZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOworCUxpc3Q8RGlzcGxheU5hbWU+IGdldERpc3BsYXlOYW1lcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTA3LDcgKzExOSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfSWNvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEljb25zKCk7CisJTGlzdDxJY29uPiBnZXRJY29ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXJsIFBhdHRlcm5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEyMiw3ICsxMzQsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwX1VybFBhdHRlcm5zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRVcmxQYXR0ZXJucygpOworCUxpc3Q8VXJsUGF0dGVyblR5cGU+IGdldFVybFBhdHRlcm5zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbCBJZ25vcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMzcsNiArMTQ5LDcgQEAKIAkgKiAJICAgIGEgU2VydmxldCAyLjQgb3IgZ3JlYXRlciB3ZWIueG1sLCBhbmQgZGlzYWJsZWQKIAkgKiAJICAgIG90aGVyd2lzZS4KIAkgKiAKKwkgKiAJICAgIEBzaW5jZSBKYXZhIEVFIDUsIEpTUCAyLjEKIAkgKiAJICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWwgSWdub3JlZDwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0yMDIsNiArMjE1LDcgQEAKIAkgKiAJICAgIEl0IGlzIGxlZ2FsIHRvIG5hbWUgdGhlIHNhbWUgZW5jb2RpbmcgdGhyb3VnaAogCSAqIAkgICAgbXVsaXRwbGUgbWVjaGFuaXNtcy4KIAkgKiAKKwkgKiAJICAgIEBzaW5jZSBKYXZhIEVFIDUsIEpTUCAyLjEKIAkgKiAJICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFnZSBFbmNvZGluZzwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0yMzIsNiArMjQ2LDcgQEAKIAkgKiAJICAgIGdyb3VwIG9mIEpTUCBwYWdlcy4gIEJ5IGRlZmF1bHQsIHNjcmlwdGluZyBpcwogCSAqIAkgICAgZW5hYmxlZC4KIAkgKiAKKwkgKiAJICAgIEBzaW5jZSBKYXZhIEVFIDUsIEpTUCAyLjEKIAkgKiAJICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NyaXB0aW5nIEludmFsaWQ8L2VtPicgYXR0cmlidXRlLgpAQCAtMjkyLDYgKzMwNyw3IEBACiAJICogCSAgICBiZSBKU1AgZG9jdW1lbnRzLCB1bmxlc3MgdGhlcmUgaXMgYW5vdGhlcgogCSAqIAkgICAgcHJvcGVydHkgZ3JvdXAgdGhhdCBpbmRpY2F0ZXMgb3RoZXJ3aXNlLgogCSAqIAorCSAqIAkgICAgQHNpbmNlIEphdmEgRUUgNSwgSlNQIDIuMQogCSAqIAkgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBYbWw8L2VtPicgYXR0cmlidXRlLgpAQCAtMzUzLDEzICszNjksMTQgQEAKIAkgKiAJICAgIGluIGFuIGluY2x1ZGUgZGlyZWN0aXZlKSBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2gKIAkgKiAJICAgIEpTUCBwYWdlIGluIHRoaXMganNwLXByb3BlcnR5LWdyb3VwLgogCSAqIAorCSAqIAkgICAgQHNpbmNlIEphdmEgRUUgNSwgSlNQIDIuMQogCSAqIAkgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmNsdWRlIFByZWx1ZGVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0SW5jbHVkZVByZWx1ZGVzKCk7CisJTGlzdDxTdHJpbmc+IGdldEluY2x1ZGVQcmVsdWRlcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5jbHVkZSBDb2RhczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCkBAIC0zNzYsMTMgKzM5MywxNCBAQAogCSAqIAkgICAgaW4gYW4gaW5jbHVkZSBkaXJlY3RpdmUpIGF0IHRoZSBlbmQgb2YgZWFjaAogCSAqIAkgICAgSlNQIHBhZ2UgaW4gdGhpcyBqc3AtcHJvcGVydHktZ3JvdXAuCiAJICogCisJICogCSAgICBAc2luY2UgSmF2YSBFRSA1LCBKU1AgMi4xCiAJICogCSAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGUgQ29kYXM8L2VtPicgYXR0cmlidXRlIGxpc3QuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfSW5jbHVkZUNvZGFzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRJbmNsdWRlQ29kYXMoKTsKKwlMaXN0PFN0cmluZz4gZ2V0SW5jbHVkZUNvZGFzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZlcnJlZCBTeW50YXggQWxsb3dlZCBBcyBMaXRlcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0zOTcsNiArNDE1LDcgQEAKIAkgKiAgICAgICAgICAgICAgdGhpcyBlbGVtZW50IGlzIGVuYWJsZWQgKHRydWUpLiBEaXNhYmxlZCAoZmFsc2UpIGJ5CiAJICogICAgICAgICAgICAgIGRlZmF1bHQuCiAJICogCisJICogICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEpTUCAyLjEKIAkgKiAJICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmZXJyZWQgU3ludGF4IEFsbG93ZWQgQXMgTGl0ZXJhbDwvZW0+JyBhdHRyaWJ1dGUuCkBAIC00NTUsNiArNDc0LDcgQEAKIAkgKiAgICAgICAgICAgICAgZWZmZWN0IG9uIEpTUCBkb2N1bWVudHMgKFhNTCBzeW50YXgpLiBEaXNhYmxlZCAoZmFsc2UpCiAJICogICAgICAgICAgICAgIGJ5IGRlZmF1bHQuCiAJICogCisJICogICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIEpTUCAyLjEKIAkgKiAJICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJpbSBEaXJlY3RpdmUgV2hpdGVzcGFjZXM8L2VtPicgYXR0cmlidXRlLgpAQCAtNTAyLDYgKzUyMiwxMzAgQEAKIAlib29sZWFuIGlzU2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRlbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIHZhbGlkIHZhbHVlcyBvZiBkZWZhdWx0LWNvbnRlbnQtdHlwZSBhcmUgdGhvc2Ugb2YgdGhlCisJICogICAgICAgICAgICAgY29udGVudFR5cGUgcGFnZSBkaXJlY3RpdmUuICBJdCBzcGVjaWZpZXMgdGhlIGRlZmF1bHQKKwkgKiAgICAgICAgICAgICByZXNwb25zZSBjb250ZW50VHlwZSBpZiB0aGUgcGFnZSBkaXJlY3RpdmUgZG9lcyBub3QgaW5jbHVkZQorCSAqICAgICAgICAgICAgIGEgY29udGVudFR5cGUgYXR0cmlidXRlLgorCSAqIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIEpTUCAyLjIKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGVudCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZWZhdWx0Q29udGVudFR5cGUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSNnZXRKc3BQcm9wZXJ0eUdyb3VwX0RlZmF1bHRDb250ZW50VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXREZWZhdWx0Q29udGVudFR5cGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0RGVmYXVsdENvbnRlbnRUeXBlIDxlbT5EZWZhdWx0IENvbnRlbnQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBDb250ZW50IFR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERlZmF1bHRDb250ZW50VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RGVmYXVsdENvbnRlbnRUeXBlKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CdWZmZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoZSB2YWxpZCB2YWx1ZXMgb2YgYnVmZmVyIGFyZSB0aG9zZSBvZiB0aGUKKwkgKiAgICAgICAgICAgICBidWZmZXIgcGFnZSBkaXJlY3RpdmUuICBJdCBzcGVjaWZpZXMgaWYgYnVmZmVyaW5nIHNob3VsZCBiZQorCSAqICAgICAgICAgICAgIHVzZWQgZm9yIHRoZSBvdXRwdXQgdG8gcmVzcG9uc2UsIGFuZCBpZiBzbywgdGhlIHNpemUgb2YgdGhlCisJICogICAgICAgICAgICAgYnVmZmVyIHRvIHVzZS4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBKU1AgMi4yCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CdWZmZXI8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEJ1ZmZlcihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlI2dldEpzcFByb3BlcnR5R3JvdXBfQnVmZmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldEJ1ZmZlcigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXRCdWZmZXIgPGVtPkJ1ZmZlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QnVmZmVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRCdWZmZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEJ1ZmZlcihTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXJyb3IgT24gVW5kZWNsYXJlZCBOYW1lc3BhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIHdoZW4gYSB0YWcgd2l0aCB1bmtub3duIG5hbWVzcGFjZSBpcyB1c2VkCisJICogICAgICAgICAgICAgaW4gYSBKU1AgcGFnZSAocmVndWxhciBzeW50YXgpIGlzIHRvIHNpbGVudGx5IGlnbm9yZSBpdC4gIElmCisJICogICAgICAgICAgICAgc2V0IHRvIHRydWUsIHRoZW4gYW4gZXJyb3IgbXVzdCBiZSByYWlzZWQgZHVyaW5nIHRoZSB0cmFuc2xhdGlvbgorCSAqICAgICAgICAgICAgIHRpbWUgd2hlbiBhbiB1bmRlY2xhcmVkIHRhZyBpcyB1c2VkIGluIGEgSlNQIHBhZ2UuICBEaXNhYmxlZAorCSAqICAgICAgICAgICAgIChmYWxzZSkgYnkgZGVmYXVsdC4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBKU1AgMi4yCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FcnJvciBPbiBVbmRlY2xhcmVkIE5hbWVzcGFjZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSgpCisJICogQHNlZSAjdW5zZXRFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSgpCisJICogQHNlZSAjc2V0RXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2UoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UjZ2V0SnNwUHJvcGVydHlHcm91cF9FcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc0Vycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlIDxlbT5FcnJvciBPbiBVbmRlY2xhcmVkIE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXJyb3IgT24gVW5kZWNsYXJlZCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0RXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2UoKQorCSAqIEBzZWUgI3Vuc2V0RXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2UoKQorCSAqIEBzZWUgI2lzRXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2lzRXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2UgPGVtPkVycm9yIE9uIFVuZGVjbGFyZWQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1NldEVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKCkKKwkgKiBAc2VlICNpc0Vycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKCkKKwkgKiBAc2VlICNzZXRFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZShib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHVuc2V0RXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc0Vycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlIDxlbT5FcnJvciBPbiBVbmRlY2xhcmVkIE5hbWVzcGFjZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXJyb3IgT24gVW5kZWNsYXJlZCBOYW1lc3BhY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldEVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKCkKKwkgKiBAc2VlICNpc0Vycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKCkKKwkgKiBAc2VlICNzZXRFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZShib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0RXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2UoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL1RhZ0xpYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvVGFnTGliLmphdmEKaW5kZXggNzE5NGZmZC4uYjFlMjU4MSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvVGFnTGliLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvVGFnTGliLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKICAqIAl0byBvdmVycmlkZSBpbXBsaWNpdCBtYXAgZW50cmllcyBmcm9tIFRMRCBmaWxlcyBhbmQKICAqIAlmcm9tIHRoZSBjb250YWluZXIuCiAgKiAKKyAqIAlAc2luY2UgSmF2YSBFRSA1LCBKU1AgMi4xCiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC01Nyw2ICs1OCw3IEBACiAJICogCSAgICBUaGVyZSBzaG91bGQgYmUgbm8gZW50cmllcyBpbiB3ZWIueG1sIHdpdGggdGhlCiAJICogCSAgICBzYW1lIHRhZ2xpYi11cmkgdmFsdWUuCiAJICogCisJICogCSAgICBAc2luY2UgSmF2YSBFRSA1LCBKU1AgMi4xCiAJICogCSAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhZ2xpYiBVcmk8L2VtPicgYXR0cmlidXRlLgpAQCAtODgsNiArOTAsNyBAQAogCSAqIAkgICAgYXBwbGljYXRpb24pIHdoZXJlIHRvIGZpbmQgdGhlIFRhZyBMaWJyYXJ5CiAJICogCSAgICBEZXNjcmlwdGlvbiBmaWxlIGZvciB0aGUgdGFnIGxpYnJhcnkuCiAJICogCisJICogCSAgICBAc2luY2UgSmF2YSBFRSA1LCBKU1AgMi4xCiAJICogCSAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhZ2xpYiBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcENvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvSnNwQ29uZmlnSW1wbC5qYXZhCmluZGV4IGQxZjEyMmQuLjAzZjBkNTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvSnNwQ29uZmlnSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvSnNwQ29uZmlnSW1wbC5qYXZhCkBAIC01Nyw3ICs1Nyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHRhZ0xpYnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxUYWdMaWI+IHRhZ0xpYnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKc3BQcm9wZXJ0eUdyb3VwcygpIDxlbT5Kc3AgUHJvcGVydHkgR3JvdXBzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTY3LDcgKzY3LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QganNwUHJvcGVydHlHcm91cHMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxKc3BQcm9wZXJ0eUdyb3VwPiBqc3BQcm9wZXJ0eUdyb3VwczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTAzLDYgKzEwMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSnNwUGFja2FnZS5MaXRlcmFscy5KU1BfQ09ORklHOwogCX0KQEAgLTExMiw5ICsxMTMsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUYWdMaWJzKCkgeworCXB1YmxpYyBMaXN0PFRhZ0xpYj4gZ2V0VGFnTGlicygpIHsKIAkJaWYgKHRhZ0xpYnMgPT0gbnVsbCkgewotCQkJdGFnTGlicyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChUYWdMaWIuY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlMpOworCQkJdGFnTGlicyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxUYWdMaWI+KFRhZ0xpYi5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUyk7CiAJCX0KIAkJcmV0dXJuIHRhZ0xpYnM7CiAJfQpAQCAtMTI0LDkgKzEyNSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEpzcFByb3BlcnR5R3JvdXBzKCkgeworCXB1YmxpYyBMaXN0PEpzcFByb3BlcnR5R3JvdXA+IGdldEpzcFByb3BlcnR5R3JvdXBzKCkgewogCQlpZiAoanNwUHJvcGVydHlHcm91cHMgPT0gbnVsbCkgewotCQkJanNwUHJvcGVydHlHcm91cHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSnNwUHJvcGVydHlHcm91cC5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfQ09ORklHX19KU1BfUFJPUEVSVFlfR1JPVVBTKTsKKwkJCWpzcFByb3BlcnR5R3JvdXBzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEpzcFByb3BlcnR5R3JvdXA+KEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fSlNQX1BST1BFUlRZX0dST1VQUyk7CiAJCX0KIAkJcmV0dXJuIGpzcFByb3BlcnR5R3JvdXBzOwogCX0KQEAgLTE1NywxMiArMTU4LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRhZ0xpYnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VGFnTGlicygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fSlNQX1BST1BFUlRZX0dST1VQUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEpzcFByb3BlcnR5R3JvdXBzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEpzcFByb3BlcnR5R3JvdXBzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtMTcyLDYgKzE3NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUzoKQEAgLTE4OSwxNSArMTkyLDE3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6CiAJCQkJZ2V0VGFnTGlicygpLmNsZWFyKCk7Ci0JCQkJZ2V0VGFnTGlicygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0VGFnTGlicygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVGFnTGliPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX0pTUF9QUk9QRVJUWV9HUk9VUFM6CiAJCQkJZ2V0SnNwUHJvcGVydHlHcm91cHMoKS5jbGVhcigpOwotCQkJCWdldEpzcFByb3BlcnR5R3JvdXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRKc3BQcm9wZXJ0eUdyb3VwcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSnNwUHJvcGVydHlHcm91cD4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19JRDoKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTIxMSw2ICsyMTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1RBR19MSUJTOgpAQCAtMjMxLDYgKzIzNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6CkBAIC0yNDgsNiArMjU1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcEZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcEZhY3RvcnlJbXBsLmphdmEKaW5kZXggMTFmMWI3Ni4uMDA4YzFmZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BGYWN0b3J5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvSnNwRmFjdG9yeUltcGwuamF2YQpAQCAtNjcsNiArNjcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewogCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUc6IHJldHVybiAoRU9iamVjdCljcmVhdGVKc3BDb25maWcoKTsKQEAgLTgyLDYgKzgzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfRklMRV9UWVBFOgpAQCAtOTYsNiArOTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewogCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9GSUxFX1RZUEU6CkBAIC0xNjgsNiArMTcxLDcgQEAKIAkgKiBAZGVwcmVjYXRlZAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlARGVwcmVjYXRlZAogCXB1YmxpYyBzdGF0aWMgSnNwUGFja2FnZSBnZXRQYWNrYWdlKCkgewogCQlyZXR1cm4gSnNwUGFja2FnZS5lSU5TVEFOQ0U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BQYWNrYWdlSW1wbC5qYXZhCmluZGV4IGU4YTliMmUuLjFjNmQzOGIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvSnNwUGFja2FnZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcFBhY2thZ2VJbXBsLmphdmEKQEAgLTIyLDIyICsyMiw5IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsOwotCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUluaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcENvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXA7CkBAIC00NSwxMCArMzIsNiBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOwotCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCkBAIC0xMDgsMjMgKzkxLDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKwlwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CiAKIAkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIEpzcFBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBzZWUgI2VOU19VUkkKQEAgLTEzNiw3ICsxMDksNyBAQAogCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoSnNwUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpOwogCiAJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEpzcFBhY2thZ2VJbXBsKCkpOworCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBKc3BQYWNrYWdlSW1wbCgpKTsKIAogCQlpc0luaXRlZCA9IHRydWU7CiAKQEAgLTE0NCwzMiArMTE3LDIwIEBACiAJCVhNTE5hbWVzcGFjZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CiAKLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJV2ViUGFja2FnZUltcGwgdGhlV2ViUGFja2FnZSA9IChXZWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSA6IFdlYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKYXZhZWVQYWNrYWdlSW1wbCB0aGVKYXZhZWVQYWNrYWdlID0gKEphdmFlZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmF2YWVlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIDogSmF2YWVlUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSA9IChBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KIAkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKIAkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhZWVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CiAKIAkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQogCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUphdmFlZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKIAogCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCiAJCXRoZUpzcFBhY2thZ2UuZnJlZXplKCk7CiAKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoSnNwUGFja2FnZS5lTlNfVVJJLCB0aGVKc3BQYWNrYWdlKTsKKwkJCisJCUoyRUVJbml0LmluaXRFTUZNb2RlbHMoKTsKIAkJcmV0dXJuIHRoZUpzcFBhY2thZ2U7CiAJfQogCkBAIC0zMzEsNyArMjkyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9JZCgpIHsKKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0RlZmF1bHRDb250ZW50VHlwZSgpIHsKIAkJcmV0dXJuIChFQXR0cmlidXRlKWpzcFByb3BlcnR5R3JvdXBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7CiAJfQogCkBAIC0zNDAsNiArMzAxLDMzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEpzcFByb3BlcnR5R3JvdXBfQnVmZmVyKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0Vycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUNsYXNzIGdldFRhZ0xpYigpIHsKIAkJcmV0dXJuIHRhZ0xpYkVDbGFzczsKIAl9CkBAIC00MjYsNiArNDE0LDkgQEAKIAkJY3JlYXRlRUF0dHJpYnV0ZShqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVMpOwogCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fREVGRVJSRURfU1lOVEFYX0FMTE9XRURfQVNfTElURVJBTCk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19UUklNX0RJUkVDVElWRV9XSElURVNQQUNFUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19ERUZBVUxUX0NPTlRFTlRfVFlQRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSlNQX1BST1BFUlRZX0dST1VQX19CVUZGRVIpOworCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fRVJST1JfT05fVU5ERUNMQVJFRF9OQU1FU1BBQ0UpOwogCQljcmVhdGVFQXR0cmlidXRlKGpzcFByb3BlcnR5R3JvdXBFQ2xhc3MsIEpTUF9QUk9QRVJUWV9HUk9VUF9fSUQpOwogCiAJCXRhZ0xpYkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQUdfTElCKTsKQEAgLTQ2NCw0MyArNDU1LDYyIEBACiAJCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwogCQlKYXZhZWVQYWNrYWdlIHRoZUphdmFlZVBhY2thZ2UgPSAoSmF2YWVlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpOwogCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwogCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoanNwQ29uZmlnRUNsYXNzLCBKc3BDb25maWcuY2xhc3MsICJKc3BDb25maWciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SnNwQ29uZmlnX1RhZ0xpYnMoKSwgdGhpcy5nZXRUYWdMaWIoKSwgbnVsbCwgInRhZ0xpYnMiLCBudWxsLCAwLCAtMSwgSnNwQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEpzcENvbmZpZ19Kc3BQcm9wZXJ0eUdyb3VwcygpLCB0aGlzLmdldEpzcFByb3BlcnR5R3JvdXAoKSwgbnVsbCwgImpzcFByb3BlcnR5R3JvdXBzIiwgbnVsbCwgMCwgLTEsIEpzcENvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BDb25maWdfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgSnNwQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwogCi0JCWluaXRFQ2xhc3MoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIkpzcFByb3BlcnR5R3JvdXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SnNwUHJvcGVydHlHcm91cF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SnNwUHJvcGVydHlHcm91cF9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SnNwUHJvcGVydHlHcm91cF9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SnNwUHJvcGVydHlHcm91cF9VcmxQYXR0ZXJucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFVybFBhdHRlcm5UeXBlKCksIG51bGwsICJ1cmxQYXR0ZXJucyIsIG51bGwsIDEsIC0xLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEpzcFByb3BlcnR5R3JvdXBfRWxJZ25vcmVkKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAiZWxJZ25vcmVkIiwgbnVsbCwgMCwgMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BQcm9wZXJ0eUdyb3VwX1BhZ2VFbmNvZGluZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAicGFnZUVuY29kaW5nIiwgbnVsbCwgMCwgMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9TY3JpcHRpbmdJbnZhbGlkKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAic2NyaXB0aW5nSW52YWxpZCIsIG51bGwsIDAsIDEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9Jc1htbCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgImlzWG1sIiwgbnVsbCwgMCwgMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVQcmVsdWRlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhdGhUeXBlKCksICJpbmNsdWRlUHJlbHVkZXMiLCBudWxsLCAwLCAtMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAiaW5jbHVkZUNvZGFzIiwgbnVsbCwgMCwgLTEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEpzcFByb3BlcnR5R3JvdXBfRGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAiZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsIiwgbnVsbCwgMCwgMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BQcm9wZXJ0eUdyb3VwX1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgInRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcyIsIG51bGwsIDAsIDEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh0YWdMaWJFQ2xhc3MsIFRhZ0xpYi5jbGFzcywgIlRhZ0xpYiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJfVGFnbGliVXJpKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJ0YWdsaWJVcmkiLCBudWxsLCAxLCAxLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYl9UYWdsaWJMb2NhdGlvbigpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhdGhUeXBlKCksICJ0YWdsaWJMb2NhdGlvbiIsIG51bGwsIDEsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKGpzcEZpbGVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJKc3BGaWxlVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQotCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKKwkJYm9vbGVhbiBoYXNMb2NrID0gZmFsc2U7CisJCXRyeSB7CisJCQloYXNMb2NrID0gSjJFRUluaXQuYXF1aXJlSW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50c0xvY2soKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJSjJFRUNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCX0JCQorCQkKKwkJdHJ5eworCQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQorCQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJCWluaXRFQ2xhc3MoanNwQ29uZmlnRUNsYXNzLCBKc3BDb25maWcuY2xhc3MsICJKc3BDb25maWciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEpzcENvbmZpZ19UYWdMaWJzKCksIHRoaXMuZ2V0VGFnTGliKCksIG51bGwsICJ0YWdMaWJzIiwgbnVsbCwgMCwgLTEsIEpzcENvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0SnNwQ29uZmlnX0pzcFByb3BlcnR5R3JvdXBzKCksIHRoaXMuZ2V0SnNwUHJvcGVydHlHcm91cCgpLCBudWxsLCAianNwUHJvcGVydHlHcm91cHMiLCBudWxsLCAwLCAtMSwgSnNwQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BDb25maWdfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgSnNwQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoanNwUHJvcGVydHlHcm91cEVDbGFzcywgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIkpzcFByb3BlcnR5R3JvdXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEpzcFByb3BlcnR5R3JvdXBfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRKc3BQcm9wZXJ0eUdyb3VwX0Rpc3BsYXlOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0SnNwUHJvcGVydHlHcm91cF9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEpzcFByb3BlcnR5R3JvdXBfVXJsUGF0dGVybnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRVcmxQYXR0ZXJuVHlwZSgpLCBudWxsLCAidXJsUGF0dGVybnMiLCBudWxsLCAxLCAtMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9FbElnbm9yZWQoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJlbElnbm9yZWQiLCBudWxsLCAwLCAxLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEpzcFByb3BlcnR5R3JvdXBfUGFnZUVuY29kaW5nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJwYWdlRW5jb2RpbmciLCBudWxsLCAwLCAxLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BQcm9wZXJ0eUdyb3VwX1NjcmlwdGluZ0ludmFsaWQoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJzY3JpcHRpbmdJbnZhbGlkIiwgbnVsbCwgMCwgMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BQcm9wZXJ0eUdyb3VwX0lzWG1sKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAiaXNYbWwiLCBudWxsLCAwLCAxLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEpzcFByb3BlcnR5R3JvdXBfSW5jbHVkZVByZWx1ZGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGF0aFR5cGUoKSwgImluY2x1ZGVQcmVsdWRlcyIsIG51bGwsIDAsIC0xLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9JbmNsdWRlQ29kYXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAiaW5jbHVkZUNvZGFzIiwgbnVsbCwgMCwgLTEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BQcm9wZXJ0eUdyb3VwX0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgImRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCIsIG51bGwsIDAsIDEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9UcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJ0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXMiLCBudWxsLCAwLCAxLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEpzcFByb3BlcnR5R3JvdXBfRGVmYXVsdENvbnRlbnRUeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJkZWZhdWx0Q29udGVudFR5cGUiLCBudWxsLCAwLCAxLCBKc3BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BQcm9wZXJ0eUdyb3VwX0J1ZmZlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAiYnVmZmVyIiwgbnVsbCwgMCwgMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnNwUHJvcGVydHlHcm91cF9FcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgImVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlIiwgbnVsbCwgMCwgMSwgSnNwUHJvcGVydHlHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKc3BQcm9wZXJ0eUdyb3VwX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEpzcFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyh0YWdMaWJFQ2xhc3MsIFRhZ0xpYi5jbGFzcywgIlRhZ0xpYiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliX1RhZ2xpYlVyaSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRUb2tlbigpLCAidGFnbGliVXJpIiwgbnVsbCwgMSwgMSwgVGFnTGliLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJfVGFnbGliTG9jYXRpb24oKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXRoVHlwZSgpLCAidGFnbGliTG9jYXRpb24iLCBudWxsLCAxLCAxLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCisJCQlpbml0RURhdGFUeXBlKGpzcEZpbGVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJKc3BGaWxlVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCisJCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKKwkJCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQorCQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiAJLyoqCkBAIC02NTAsNiArNjYwLDMwIEBACiAJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lIiwgInRyaW0tZGlyZWN0aXZlLXdoaXRlc3BhY2VzIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEpzcFByb3BlcnR5R3JvdXBfRGVmYXVsdENvbnRlbnRUeXBlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJkZWZhdWx0LWNvbnRlbnQtdHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRKc3BQcm9wZXJ0eUdyb3VwX0J1ZmZlcigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiYnVmZmVyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldEpzcFByb3BlcnR5R3JvdXBfRXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2UoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImVycm9yLW9uLXVuZGVjbGFyZWQtbmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0SnNwUHJvcGVydHlHcm91cF9JZCgpLCAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvSnNwUHJvcGVydHlHcm91cEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvSnNwUHJvcGVydHlHcm91cEltcGwuamF2YQppbmRleCBiMjJiZGM1Li44MzU5YmRlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcFByb3BlcnR5R3JvdXBJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BQcm9wZXJ0eUdyb3VwSW1wbC5qYXZhCkBAIC01Niw2ICs1Niw5IEBACiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQcm9wZXJ0eUdyb3VwSW1wbCNnZXRJbmNsdWRlQ29kYXMgPGVtPkluY2x1ZGUgQ29kYXM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwgPGVtPkRlZmVycmVkIFN5bnRheCBBbGxvd2VkIEFzIExpdGVyYWw8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMgPGVtPlRyaW0gRGlyZWN0aXZlIFdoaXRlc3BhY2VzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFByb3BlcnR5R3JvdXBJbXBsI2dldERlZmF1bHRDb250ZW50VHlwZSA8ZW0+RGVmYXVsdCBDb250ZW50IFR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjZ2V0QnVmZmVyIDxlbT5CdWZmZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjaXNFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSA8ZW0+RXJyb3IgT24gVW5kZWNsYXJlZCBOYW1lc3BhY2U8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUHJvcGVydHlHcm91cEltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CkBAIC03MSw3ICs3NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC04MSw3ICs4NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERpc3BsYXlOYW1lPiBkaXNwbGF5TmFtZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC05MSw3ICs5NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8SWNvbj4gaWNvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmxQYXR0ZXJucygpIDxlbT5VcmwgUGF0dGVybnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTAxLDcgKzEwNCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHVybFBhdHRlcm5zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8VXJsUGF0dGVyblR5cGU+IHVybFBhdHRlcm5zOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWxJZ25vcmVkKCkgPGVtPkVsIElnbm9yZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTEzMCw3ICsxMzMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVsSWdub3JlZEVTZXQgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBlbElnbm9yZWRFU2V0OwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhZ2VFbmNvZGluZygpIDxlbT5QYWdlIEVuY29kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNzksNyArMTgyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzY3JpcHRpbmdJbnZhbGlkRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHNjcmlwdGluZ0ludmFsaWRFU2V0OwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNYbWwoKSA8ZW0+SXMgWG1sPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0yMDgsNyArMjExLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1htbEVTZXQgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc1htbEVTZXQ7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmNsdWRlUHJlbHVkZXMoKSA8ZW0+SW5jbHVkZSBQcmVsdWRlczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCkBAIC0yMTgsNyArMjIxLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5jbHVkZVByZWx1ZGVzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBpbmNsdWRlUHJlbHVkZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmNsdWRlQ29kYXMoKSA8ZW0+SW5jbHVkZSBDb2RhczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCkBAIC0yMjgsNyArMjMxLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgaW5jbHVkZUNvZGFzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBpbmNsdWRlQ29kYXM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKSA8ZW0+RGVmZXJyZWQgU3ludGF4IEFsbG93ZWQgQXMgTGl0ZXJhbDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMjU3LDcgKzI2MCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmZXJyZWRTeW50YXhBbGxvd2VkQXNMaXRlcmFsRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIGRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbEVTZXQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKSA8ZW0+VHJpbSBEaXJlY3RpdmUgV2hpdGVzcGFjZXM8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTI4Niw3ICsyODksNzYgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXNFU2V0ID0gZmFsc2U7CisJcHJvdGVjdGVkIGJvb2xlYW4gdHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzRVNldDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0Q29udGVudFR5cGUoKSA8ZW0+RGVmYXVsdCBDb250ZW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlZmF1bHRDb250ZW50VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05URU5UX1RZUEVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCkgPGVtPkRlZmF1bHQgQ29udGVudCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREZWZhdWx0Q29udGVudFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENvbnRlbnRUeXBlID0gREVGQVVMVF9DT05URU5UX1RZUEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnVmZmVyKCkgPGVtPkJ1ZmZlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QnVmZmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCVUZGRVJfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnVmZmVyKCkgPGVtPkJ1ZmZlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QnVmZmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGJ1ZmZlciA9IEJVRkZFUl9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Vycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKCkgPGVtPkVycm9yIE9uIFVuZGVjbGFyZWQgTmFtZXNwYWNlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0Vycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVJST1JfT05fVU5ERUNMQVJFRF9OQU1FU1BBQ0VfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2UoKSA8ZW0+RXJyb3IgT24gVW5kZWNsYXJlZCBOYW1lc3BhY2U8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlID0gRVJST1JfT05fVU5ERUNMQVJFRF9OQU1FU1BBQ0VfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEVycm9yIE9uIFVuZGVjbGFyZWQgTmFtZXNwYWNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBlcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZUVTZXQ7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTMyMiw2ICszOTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEpzcFBhY2thZ2UuTGl0ZXJhbHMuSlNQX1BST1BFUlRZX0dST1VQOwogCX0KQEAgLTMzMSw5ICs0MDQsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTlMpOworCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERlc2NyaXB0aW9uPihEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RFU0NSSVBUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIGRlc2NyaXB0aW9uczsKIAl9CkBAIC0zNDMsOSArNDE2LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGxheU5hbWVzKCkgeworCXB1YmxpYyBMaXN0PERpc3BsYXlOYW1lPiBnZXREaXNwbGF5TmFtZXMoKSB7CiAJCWlmIChkaXNwbGF5TmFtZXMgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRElTUExBWV9OQU1FUyk7CisJCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGlzcGxheU5hbWU+KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRElTUExBWV9OQU1FUyk7CiAJCX0KIAkJcmV0dXJuIGRpc3BsYXlOYW1lczsKIAl9CkBAIC0zNTUsOSArNDI4LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SWNvbnMoKSB7CisJcHVibGljIExpc3Q8SWNvbj4gZ2V0SWNvbnMoKSB7CiAJCWlmIChpY29ucyA9PSBudWxsKSB7Ci0JCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChJY29uLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSUNPTlMpOworCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8SWNvbj4oSWNvbi5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lDT05TKTsKIAkJfQogCQlyZXR1cm4gaWNvbnM7CiAJfQpAQCAtMzY3LDkgKzQ0MCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFVybFBhdHRlcm5zKCkgeworCXB1YmxpYyBMaXN0PFVybFBhdHRlcm5UeXBlPiBnZXRVcmxQYXR0ZXJucygpIHsKIAkJaWYgKHVybFBhdHRlcm5zID09IG51bGwpIHsKLQkJCXVybFBhdHRlcm5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFVybFBhdHRlcm5UeXBlLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk5TKTsKKwkJCXVybFBhdHRlcm5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFVybFBhdHRlcm5UeXBlPihVcmxQYXR0ZXJuVHlwZS5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOUyk7CiAJCX0KIAkJcmV0dXJuIHVybFBhdHRlcm5zOwogCX0KQEAgLTUzOCw5ICs2MTEsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbmNsdWRlUHJlbHVkZXMoKSB7CisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJbmNsdWRlUHJlbHVkZXMoKSB7CiAJCWlmIChpbmNsdWRlUHJlbHVkZXMgPT0gbnVsbCkgewotCQkJaW5jbHVkZVByZWx1ZGVzID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVMpOworCQkJaW5jbHVkZVByZWx1ZGVzID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9QUkVMVURFUyk7CiAJCX0KIAkJcmV0dXJuIGluY2x1ZGVQcmVsdWRlczsKIAl9CkBAIC01NTAsOSArNjIzLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SW5jbHVkZUNvZGFzKCkgeworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SW5jbHVkZUNvZGFzKCkgewogCQlpZiAoaW5jbHVkZUNvZGFzID09IG51bGwpIHsKLQkJCWluY2x1ZGVDb2RhcyA9IG5ldyBFRGF0YVR5cGVFTGlzdChTdHJpbmcuY2xhc3MsIHRoaXMsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JTkNMVURFX0NPREFTKTsKKwkJCWluY2x1ZGVDb2RhcyA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfQ09EQVMpOwogCQl9CiAJCXJldHVybiBpbmNsdWRlQ29kYXM7CiAJfQpAQCAtNjU0LDYgKzcyNyw5NCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb250ZW50VHlwZSgpIHsKKwkJcmV0dXJuIGRlZmF1bHRDb250ZW50VHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q29udGVudFR5cGUoU3RyaW5nIG5ld0RlZmF1bHRDb250ZW50VHlwZSkgeworCQlTdHJpbmcgb2xkRGVmYXVsdENvbnRlbnRUeXBlID0gZGVmYXVsdENvbnRlbnRUeXBlOworCQlkZWZhdWx0Q29udGVudFR5cGUgPSBuZXdEZWZhdWx0Q29udGVudFR5cGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERUZBVUxUX0NPTlRFTlRfVFlQRSwgb2xkRGVmYXVsdENvbnRlbnRUeXBlLCBkZWZhdWx0Q29udGVudFR5cGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEJ1ZmZlcigpIHsKKwkJcmV0dXJuIGJ1ZmZlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCdWZmZXIoU3RyaW5nIG5ld0J1ZmZlcikgeworCQlTdHJpbmcgb2xkQnVmZmVyID0gYnVmZmVyOworCQlidWZmZXIgPSBuZXdCdWZmZXI7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19CVUZGRVIsIG9sZEJ1ZmZlciwgYnVmZmVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSgpIHsKKwkJcmV0dXJuIGVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKGJvb2xlYW4gbmV3RXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2UpIHsKKwkJYm9vbGVhbiBvbGRFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSA9IGVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlOworCQllcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSA9IG5ld0Vycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlOworCQlib29sZWFuIG9sZEVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlRVNldCA9IGVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlRVNldDsKKwkJZXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2VFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VSUk9SX09OX1VOREVDTEFSRURfTkFNRVNQQUNFLCBvbGRFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSwgZXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2UsICFvbGRFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZUVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldEVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKCkgeworCQlib29sZWFuIG9sZEVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlID0gZXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2U7CisJCWJvb2xlYW4gb2xkRXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2VFU2V0ID0gZXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2VFU2V0OworCQllcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSA9IEVSUk9SX09OX1VOREVDTEFSRURfTkFNRVNQQUNFX0VERUZBVUxUOworCQllcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZUVTZXQgPSBmYWxzZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRVJST1JfT05fVU5ERUNMQVJFRF9OQU1FU1BBQ0UsIG9sZEVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlLCBFUlJPUl9PTl9VTkRFQ0xBUkVEX05BTUVTUEFDRV9FREVGQVVMVCwgb2xkRXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2VFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZXRFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSgpIHsKKwkJcmV0dXJuIGVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlRVNldDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldElkKCkgewogCQlyZXR1cm4gaWQ7CiAJfQpAQCAtNjc1LDE2ICs4MzYsMTcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFVybFBhdHRlcm5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFVybFBhdHRlcm5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtNjk0LDYgKzg1Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RFU0NSSVBUSU9OUzoKQEAgLTcwNSwyMSArODY4LDI3IEBACiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTlM6CiAJCQkJcmV0dXJuIGdldFVybFBhdHRlcm5zKCk7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FTF9JR05PUkVEOgotCQkJCXJldHVybiBpc0VsSWdub3JlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKwkJCQlyZXR1cm4gaXNFbElnbm9yZWQoKTsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1BBR0VfRU5DT0RJTkc6CiAJCQkJcmV0dXJuIGdldFBhZ2VFbmNvZGluZygpOwogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQ6Ci0JCQkJcmV0dXJuIGlzU2NyaXB0aW5nSW52YWxpZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKwkJCQlyZXR1cm4gaXNTY3JpcHRpbmdJbnZhbGlkKCk7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUw6Ci0JCQkJcmV0dXJuIGlzSXNYbWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisJCQkJcmV0dXJuIGlzSXNYbWwoKTsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVM6CiAJCQkJcmV0dXJuIGdldEluY2x1ZGVQcmVsdWRlcygpOwogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUzoKIAkJCQlyZXR1cm4gZ2V0SW5jbHVkZUNvZGFzKCk7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMOgotCQkJCXJldHVybiBpc0RlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKwkJCQlyZXR1cm4gaXNEZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKTsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1RSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTOgotCQkJCXJldHVybiBpc1RyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKwkJCQlyZXR1cm4gaXNUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKTsKKwkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RFRkFVTFRfQ09OVEVOVF9UWVBFOgorCQkJCXJldHVybiBnZXREZWZhdWx0Q29udGVudFR5cGUoKTsKKwkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0JVRkZFUjoKKwkJCQlyZXR1cm4gZ2V0QnVmZmVyKCk7CisJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19FUlJPUl9PTl9VTkRFQ0xBUkVEX05BTUVTUEFDRToKKwkJCQlyZXR1cm4gaXNFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSgpOwogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSUQ6CiAJCQkJcmV0dXJuIGdldElkKCk7CiAJCX0KQEAgLTczMSw0OSArOTAwLDYwIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ESVNQTEFZX05BTUVTOgogCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERpc3BsYXlOYW1lPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSUNPTlM6CiAJCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSWNvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOUzoKIAkJCQlnZXRVcmxQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQkJZ2V0VXJsUGF0dGVybnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFVybFBhdHRlcm5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBVcmxQYXR0ZXJuVHlwZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VMX0lHTk9SRUQ6Ci0JCQkJc2V0RWxJZ25vcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOworCQkJCXNldEVsSWdub3JlZCgoQm9vbGVhbiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fUEFHRV9FTkNPRElORzoKIAkJCQlzZXRQYWdlRW5jb2RpbmcoKFN0cmluZyluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fU0NSSVBUSU5HX0lOVkFMSUQ6Ci0JCQkJc2V0U2NyaXB0aW5nSW52YWxpZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCQlzZXRTY3JpcHRpbmdJbnZhbGlkKChCb29sZWFuKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JU19YTUw6Ci0JCQkJc2V0SXNYbWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7CisJCQkJc2V0SXNYbWwoKEJvb2xlYW4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lOQ0xVREVfUFJFTFVERVM6CiAJCQkJZ2V0SW5jbHVkZVByZWx1ZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRJbmNsdWRlUHJlbHVkZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEluY2x1ZGVQcmVsdWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fSU5DTFVERV9DT0RBUzoKIAkJCQlnZXRJbmNsdWRlQ29kYXMoKS5jbGVhcigpOwotCQkJCWdldEluY2x1ZGVDb2RhcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SW5jbHVkZUNvZGFzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERUZFUlJFRF9TWU5UQVhfQUxMT1dFRF9BU19MSVRFUkFMOgotCQkJCXNldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCQlzZXREZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWwoKEJvb2xlYW4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1RSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTOgotCQkJCXNldFRyaW1EaXJlY3RpdmVXaGl0ZXNwYWNlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCQlzZXRUcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0RFRkFVTFRfQ09OVEVOVF9UWVBFOgorCQkJCXNldERlZmF1bHRDb250ZW50VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19CVUZGRVI6CisJCQkJc2V0QnVmZmVyKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VSUk9SX09OX1VOREVDTEFSRURfTkFNRVNQQUNFOgorCQkJCXNldEVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKChCb29sZWFuKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JRDoKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTc4Nyw2ICs5NjcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVTQ1JJUFRJT05TOgpAQCAtODI1LDYgKzEwMDYsMTUgQEAKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1RSSU1fRElSRUNUSVZFX1dISVRFU1BBQ0VTOgogCQkJCXVuc2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fREVGQVVMVF9DT05URU5UX1RZUEU6CisJCQkJc2V0RGVmYXVsdENvbnRlbnRUeXBlKERFRkFVTFRfQ09OVEVOVF9UWVBFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19CVUZGRVI6CisJCQkJc2V0QnVmZmVyKEJVRkZFUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fRVJST1JfT05fVU5ERUNMQVJFRF9OQU1FU1BBQ0U6CisJCQkJdW5zZXRFcnJvck9uVW5kZWNsYXJlZE5hbWVzcGFjZSgpOworCQkJCXJldHVybjsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0lEOgogCQkJCXNldElkKElEX0VERUZBVUxUKTsKIAkJCQlyZXR1cm47CkBAIC04MzcsNiArMTAyNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERVNDUklQVElPTlM6CkBAIC04NjMsNiArMTA1NCwxMiBAQAogCQkJCXJldHVybiBpc1NldERlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCgpOwogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVM6CiAJCQkJcmV0dXJuIGlzU2V0VHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCk7CisJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19ERUZBVUxUX0NPTlRFTlRfVFlQRToKKwkJCQlyZXR1cm4gREVGQVVMVF9DT05URU5UX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRDb250ZW50VHlwZSAhPSBudWxsIDogIURFRkFVTFRfQ09OVEVOVF9UWVBFX0VERUZBVUxULmVxdWFscyhkZWZhdWx0Q29udGVudFR5cGUpOworCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fQlVGRkVSOgorCQkJCXJldHVybiBCVUZGRVJfRURFRkFVTFQgPT0gbnVsbCA/IGJ1ZmZlciAhPSBudWxsIDogIUJVRkZFUl9FREVGQVVMVC5lcXVhbHMoYnVmZmVyKTsKKwkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX0VSUk9SX09OX1VOREVDTEFSRURfTkFNRVNQQUNFOgorCQkJCXJldHVybiBpc1NldEVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKCk7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19JRDoKIAkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKIAkJfQpAQCAtODc0LDYgKzEwNzEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKQEAgLTg5NCw2ICsxMDkyLDEyIEBACiAJCWlmIChkZWZlcnJlZFN5bnRheEFsbG93ZWRBc0xpdGVyYWxFU2V0KSByZXN1bHQuYXBwZW5kKGRlZmVycmVkU3ludGF4QWxsb3dlZEFzTGl0ZXJhbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoIiwgdHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlpZiAodHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzRVNldCkgcmVzdWx0LmFwcGVuZCh0cmltRGlyZWN0aXZlV2hpdGVzcGFjZXMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRDb250ZW50VHlwZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Q29udGVudFR5cGUpOworCQlyZXN1bHQuYXBwZW5kKCIsIGJ1ZmZlcjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChidWZmZXIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoZXJyb3JPblVuZGVjbGFyZWROYW1lc3BhY2VFU2V0KSByZXN1bHQuYXBwZW5kKGVycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL2ltcGwvVGFnTGliSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9UYWdMaWJJbXBsLmphdmEKaW5kZXggODYwMGE0My4uZjMwZGE0MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9UYWdMaWJJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvaW1wbC9UYWdMaWJJbXBsLmphdmEKQEAgLTExMSw2ICsxMTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEpzcFBhY2thZ2UuTGl0ZXJhbHMuVEFHX0xJQjsKIAl9CkBAIC0xODMsNiArMTg0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfX1RBR0xJQl9VUkk6CkBAIC0yMDAsNiArMjAyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX19UQUdMSUJfVVJJOgpAQCAtMjIwLDYgKzIyMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9fVEFHTElCX1VSSToKQEAgLTI0MCw2ICsyNDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfX1RBR0xJQl9VUkk6CkBAIC0yNTcsNiArMjYyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9tZXRhZGF0YS9Kc3BQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC9tZXRhZGF0YS9Kc3BQYWNrYWdlLmphdmEKaW5kZXggYTgzZjQ4OC4uNTllY2ZiOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvbWV0YWRhdGEvSnNwUGFja2FnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL21ldGFkYXRhL0pzcFBhY2thZ2UuamF2YQpAQCAtMzAsNTAgKzMwLDE2IEBACiAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCi0gKiAgICAgICBAKCMpanNwXzJfMS54c2RzCTEuNSAwOC8xMS8wNQorICogICAgICAgQCgjKWpzcF8yXzIueHNkcwkwMi8yNi8wOQogICogICAgIAogICogCiAgKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCi0gKiAgICAgCi0gKiAKLSAqIAotICogICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEpTUCAyLjEgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0gKiAgICAgICB0eXBlcy4gIFRoZSBKU1AgMi4xIHNjaGVtYSBjb250YWlucyBhbGwgdGhlIHNwZWNpYWwKKyAqICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgMi4yIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICogICAgICAgdHlwZXMuICBUaGUgSlNQIDIuMiBzY2hlbWEgY29udGFpbnMgYWxsIHRoZSBzcGVjaWFsCiAgKiAgICAgICBzdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBKU1AgZmlsZXMKICAqICAgICAgIGZyb20gYSB3ZWIgYXBwbGljYXRpb24uCiAgKiAKLSAqICAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIHNjaGVtYSBpcyB1c2VkIGJ5IHRoZSB3ZWItYXBwXzJfNS54c2QKKyAqICAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIHNjaGVtYSBpcyB1c2VkIGJ5IHRoZSB3ZWItY29tbW9uXzNfMC54c2QKICAqICAgICAgIGZpbGUgdG8gZGVmaW5lIEpTUCBzcGVjaWZpYyBjb250ZW50LgogICogCiAgKiAgICAgCkBAIC05MywxODQgKzU5LDE5NSBAQAogICogCiAgKiAgICAgCiAgKiAKLSAqICAgICAgIEAoIylqYXZhZWVfNS54c2RzCTEuNjUgMDYvMDIvMTcKKyAqIAorICogICAgICAgJElkOiBKc3BQYWNrYWdlLmphdmEsdiAxLjQgMjAxMC8wMS8xNSAxNDozMjowOCBjYW5kZXJzb24gRXhwICQKKyAqICAgICAgIAogICogICAgIAogICogCiAgKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCisgKiAgICAgICBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KKyAqICAgICAgIHNoYXJlYWJsZSBzY2hlbWEocykgb2YgSmF2YSBFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQorICogICAgICAgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgorICogICAgICAgCisgKiAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICBqYXZhIGVlIGFwcGxpY2F0aW9uOworICogICAgICAgYXBwbGljYXRpb24gY2xpZW50OworICogICAgICAgd2ViIGFwcGxpY2F0aW9uOworICogICAgICAgZW50ZXJwcmlzZSBiZWFuOworICogICAgICAgcmVzb3VyY2UgYWRhcHRlcjsgCisgKiAgICAgICAKKyAqICAgICAgIERlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICBlYXIgZmlsZTsKKyAqICAgICAgIHdhciBmaWxlOworICogICAgICAgamFyIGZpbGU7CisgKiAgICAgICByYXIgZmlsZTsKKyAqICAgICAgIAogICogICAgIAogICogCiAgKiAKLSAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgdGhhdCBhcHBlYXIgaW4gdGhlIGNvbW1vbgotICogc2hhcmVhYmxlIHNjaGVtYShzKSBvZiBKMkVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCi0gKiBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnRleHQgdGhleSBhcmUgaW5jbHVkZWQ6Ci0gKiAKLSAqIERlcGxveW1lbnQgQ29tcG9uZW50IG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBqMmVlIGFwcGxpY2F0aW9uOwotICogICAgIGFwcGxpY2F0aW9uIGNsaWVudDsKLSAqICAgICB3ZWIgYXBwbGljYXRpb247Ci0gKiAgICAgZW50ZXJwcmlzZSBiZWFuOwotICogICAgIHJlc291cmNlIGFkYXB0ZXI7Ci0gKiAKLSAqIERlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgZWFyIGZpbGU7Ci0gKiAgICAgd2FyIGZpbGU7Ci0gKiAgICAgamFyIGZpbGU7Ci0gKiAgICAgcmFyIGZpbGU7Ci0gKiAKLSAqIAotICogCi0gKiAgICAgICBAKCMpamF2YWVlX3dlYl9zZXJ2aWNlc19jbGllbnRfMV8yLnhzZHMJMS4xOSAwMi8xMy8wNgotICogICAgIAotICogCi0gKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCisgKiAgICAgICAkSWQ6IEpzcFBhY2thZ2UuamF2YSx2IDEuNCAyMDEwLzAxLzE1IDE0OjMyOjA4IGNhbmRlcnNvbiBFeHAgJAorICogICAgICAgCiAgKiAgICAgCiAgKiAKICAqIAogICogICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLSAqIAorICogICAgICAgCiAgKiAgICAgCiAgKiAKLSAqICAgIFNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCBhbmQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZXNwYWNlLgorICogICAgPGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgKiAgICAgPGgxPkFib3V0IHRoZSBYTUwgbmFtZXNwYWNlPC9oMT4KICAqIAotICogICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCi0gKiAgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgCi0gKiAKLSAqICAgICBOb3RlIHRoYXQgbG9jYWwgbmFtZXMgaW4gdGhpcyBuYW1lc3BhY2UgYXJlIGludGVuZGVkIHRvIGJlIGRlZmluZWQKLSAqICAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUKLSAqICAgICBmb2xsb3dpbmcgbmFtZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFuZCBzaG91bGQKLSAqICAgICBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZyBHcm91cCwKLSAqICAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZToKLSAqIAotICogICAgIGJhc2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkKLSAqICAgICAgICAgIHJlbGF0aXZlIFVSSXMgaW4gdGhlIHNjb3BlIG9mIHRoZSBlbGVtZW50IG9uIHdoaWNoIGl0Ci0gKiAgICAgICAgICBhcHBlYXJzOyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBpZCAgIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4KLSAqICAgICAgICAgIFRoZSB4bWw6aWQgc3BlY2lmaWNhdGlvbiBpcyBub3QgeWV0IGEgVzNDIFJlY29tbWVuZGF0aW9uLAotICogICAgICAgICAgYnV0IHRoaXMgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGhlcmUgdG8gZmFjaWxpdGF0ZSBleHBlcmltZW50YXRpb24KLSAqICAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQKLSAqICAgICAgICAgIGluIHRoZSBzcGVjaWFsQXR0cnMgYXR0cmlidXRlIGdyb3VwLgotICogCi0gKiAgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgotICogICAgICAgICAgYW55IGVsZW1lbnQ7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCisgKiAgICAgICBzdWl0YWJsZSBmb3IgaW1wb3J0IGJ5IG90aGVyIHNjaGVtYSBkb2N1bWVudHMuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwiPgorICogICAgICAgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWw8L2E+IGFuZAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCI+CisgKiAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sPC9hPiBmb3IgaW5mb3JtYXRpb24gCisgKiAgICAgICBhYm91dCB0aGlzIG5hbWVzcGFjZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIE5vdGUgdGhhdCBsb2NhbCBuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgaW50ZW5kZWQgdG8gYmUKKyAqICAgICAgIGRlZmluZWQgb25seSBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBvciBpdHMgc3ViZ3JvdXBzLgorICogICAgICAgVGhlIG5hbWVzIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBsaXN0ZWQgYmVsb3cuCisgKiAgICAgICBUaGV5IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZworICogICAgICAgR3JvdXAsIHNwZWNpZmljYXRpb24sIG9yIGRvY3VtZW50IGluc3RhbmNlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPiAgIAorICogICAgICAgU2VlIGZ1cnRoZXIgYmVsb3cgaW4gdGhpcyBkb2N1bWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8YSBocmVmPSIjdXNhZ2UiPmhvdyB0byByZWZlciB0byB0aGlzIHNjaGVtYSBkb2N1bWVudCBmcm9tIHlvdXIgb3duCisgKiAgICAgICBYU0Qgc2NoZW1hIGRvY3VtZW50czwvYT4gYW5kIGFib3V0IDxhIGhyZWY9IiNuc3ZlcnNpb25pbmciPnRoZQorICogICAgICAgbmFtZXNwYWNlLXZlcnNpb25pbmcgcG9saWN5IGdvdmVybmluZyB0aGlzIHNjaGVtYSBkb2N1bWVudDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgogICogICAKLSAqICAgICBzcGFjZSAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZQotICogICAgICAgICAgdmFsdWUgaXMgYSBrZXl3b3JkIGluZGljYXRpbmcgd2hhdCB3aGl0ZXNwYWNlIHByb2Nlc3NpbmcKLSAqICAgICAgICAgIGRpc2NpcGxpbmUgaXMgaW50ZW5kZWQgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBlbGVtZW50OyBpdHMKLSAqICAgICAgICAgIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSB2aXJ0dWUgb2YgaXRzCi0gKiAgICAgICAgICBkZWZpbml0aW9uIGluIHRoZSBYTUwgc3BlY2lmaWNhdGlvbi4KICAqIAotICogICAgIEZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTogZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKLSAqICAgICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKLSAqICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCi0gKiAgICAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKKyAqICAgIDxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgCisgKiAgICAgPGgzPkZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTwvaDM+IAogICogCi0gKiAgICAgICAgICAgICAgSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZCBkZWRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mIEZlYnJ1YXJ5LCAyMDAwCi0gKiAgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZQotICogICAgICAgICAgICAgIHhtbDpGYXRoZXIKKyAqICAgICA8ZGl2IGNsYXNzPSJib2R5dGV4dCI+CisgKiAgICAgIDxwPgorICogICAgICAgZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKKyAqICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKKyAqICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCisgKiAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKKyAqICAgICAgPC9wPgorICogICAgICA8YmxvY2txdW90ZT4KKyAqICAgICAgICA8cD4KKyAqIAlJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kCisgKiAJZGVkaWNhdGlvbiB0aGUgVzNDIFhNTCBQbGVuYXJ5IG9uIHRoaXMgMTB0aCBkYXkgb2YKKyAqIAlGZWJydWFyeSwgMjAwMCwgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5CisgKiAJdGhlIFhNTCBuYW1lICJ4bWw6RmF0aGVyIi4KKyAqICAgICAgICA8L3A+CisgKiAgICAgIDwvYmxvY2txdW90ZT4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgogICogICAKLSAqIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwCi0gKiAgICAgICAgIHN1aXRhYmxlIGZvciB1c2UgYnkKLSAqICAgICAgICAgc2NoZW1hcyB3aXNoaW5nIHRvIGFsbG93IHhtbDpiYXNlLCB4bWw6bGFuZywgeG1sOnNwYWNlIG9yIHhtbDppZAotICogICAgICAgICBhdHRyaWJ1dGVzIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgogICogCi0gKiAgICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hCi0gKiAgICAgICAgIGZvciB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgotICogICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCi0gKiAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLyZndDsKKyAqICAgIDxkaXYgaWQ9InVzYWdlIiB4bWw6aWQ9InVzYWdlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgKiAgICAgPGgyPgorICogICAgICAgPGEgbmFtZT0idXNhZ2UiPkFib3V0IHRoaXMgc2NoZW1hIGRvY3VtZW50PC9hPgorICogICAgIDwvaDI+CiAgKiAKLSAqICAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcwotICogICAgICAgICBvciB0aGUgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwIHN1aXRhYmxlCisgKiAgICAgICBmb3IgdXNlIGJ5IHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyA8Y29kZT54bWw6YmFzZTwvY29kZT4sCisgKiAgICAgICA8Y29kZT54bWw6bGFuZzwvY29kZT4sIDxjb2RlPnhtbDpzcGFjZTwvY29kZT4gb3IKKyAqICAgICAgIDxjb2RlPnhtbDppZDwvY29kZT4gYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hIGZvcgorICogICAgICAgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKKyAqICAgICAgPC9wPgorICogICAgICA8cHJlPgorICogICAgICAgICAgICZsdDtzY2hlbWEgLiAuIC4mZ3Q7CisgKiAgICAgICAgICAgIC4gLiAuCisgKiAgICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICBvcgorICogICAgICA8L3A+CisgKiAgICAgIDxwcmU+CisgKiAgICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZCIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzIG9yIHRoZQorICogICAgICAgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHByZT4KKyAqICAgICAgICAgICAmbHQ7dHlwZSAuIC4gLiZndDsKKyAqICAgICAgICAgICAgLiAuIC4KKyAqICAgICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UgZWxlbWVudAorICogICAgICAgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlcy4KKyAqICAgICAgPC9wPgorICogICAgIDwvZGl2PgorICogICAgPC9kaXY+CisgKiAgIAogICogCi0gKiAgICAgICAgICZsdDt0eXBlIC4gLiAuJmd0OwotICogICAgICAgICAgLiAuIC4KLSAqICAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLyZndDsKLSAqICAKLSAqICAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQotICogICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzCi0gKiBJbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCi0gKiAgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwNS8wOC94bWwueHNkLgotICogICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KLSAqICAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCi0gKiAgICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCi0gKiAgICBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoZSBYTUwKLSAqICAgIFNjaGVtYSBvciBYTUwgbmFtZXNwYWNlcyBjaGFuZ2UsIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZG9jdW1lbnQgYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCB3aWxsIGNoYW5nZQotICogICAgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2Qgd2lsbCBub3QgY2hhbmdlLgorICogICAgPGRpdiBpZD0ibnN2ZXJzaW9uaW5nIiB4bWw6aWQ9Im5zdmVyc2lvbmluZyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgIDxoMj4KKyAqICAgICAgIDxhIG5hbWU9Im5zdmVyc2lvbmluZyI+VmVyc2lvbmluZyBwb2xpY3kgZm9yIHRoaXMgc2NoZW1hIGRvY3VtZW50PC9hPgorICogICAgIDwvaDI+CisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIEluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKKyAqICAgICAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0CisgKiAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QiPgorICogICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Q8L2E+LgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKKyAqICAgICAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTAorICogICAgICAgU2NoZW1hIGl0c2VsZiwgb3Igd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywKKyAqICAgICAgIGlmIHRoZSBYTUwgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcworICogICAgICAgZG9jdW1lbnQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QgCisgKiAgICAgICA8L2E+IAorICogICAgICAgd2lsbCBjaGFuZ2UgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0IAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QgCisgKiAgICAgICA8L2E+IAorICogICAgICAgd2lsbCBub3QgY2hhbmdlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgUHJldmlvdXMgZGF0ZWQgKGFuZCB1bmNoYW5naW5nKSB2ZXJzaW9ucyBvZiB0aGlzIHNjaGVtYSAKKyAqICAgICAgIGRvY3VtZW50IGFyZSBhdDoKKyAqICAgICAgPC9wPgorICogICAgICA8dWw+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwNy8wOC94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA3LzA4L3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8xMC94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA0LzEwL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgIDwvdWw+CisgKiAgICAgPC9kaXY+CisgKiAgICA8L2Rpdj4KICAqICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcEZhY3RvcnkKQEAgLTQ3NCwxMyArNDUxLDQwIEBACiAJaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVMgPSAxMTsKIAogCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRlbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEpTUF9QUk9QRVJUWV9HUk9VUF9fREVGQVVMVF9DT05URU5UX1RZUEUgPSAxMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CdWZmZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0JVRkZFUiA9IDEzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVycm9yIE9uIFVuZGVjbGFyZWQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19FUlJPUl9PTl9VTkRFQ0xBUkVEX05BTUVTUEFDRSA9IDE0OworCisJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX19JRCA9IDEyOworCWludCBKU1BfUFJPUEVSVFlfR1JPVVBfX0lEID0gMTU7CiAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvcGVydHkgR3JvdXA8L2VtPicgY2xhc3MuCkBAIC00ODksNyArNDkzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgSlNQX1BST1BFUlRZX0dST1VQX0ZFQVRVUkVfQ09VTlQgPSAxMzsKKwlpbnQgSlNQX1BST1BFUlRZX0dST1VQX0ZFQVRVUkVfQ09VTlQgPSAxNjsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5UYWdMaWJJbXBsIDxlbT5UYWcgTGliPC9lbT59JyBjbGFzcy4KQEAgLTczNCw2ICs3MzgsMzkgQEAKIAlFQXR0cmlidXRlIGdldEpzcFByb3BlcnR5R3JvdXBfVHJpbURpcmVjdGl2ZVdoaXRlc3BhY2VzKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0RGVmYXVsdENvbnRlbnRUeXBlIDxlbT5EZWZhdWx0IENvbnRlbnQgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgQ29udGVudCBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNnZXREZWZhdWx0Q29udGVudFR5cGUoKQorCSAqIEBzZWUgI2dldEpzcFByb3BlcnR5R3JvdXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEpzcFByb3BlcnR5R3JvdXBfRGVmYXVsdENvbnRlbnRUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0QnVmZmVyIDxlbT5CdWZmZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CdWZmZXI8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BQcm9wZXJ0eUdyb3VwI2dldEJ1ZmZlcigpCisJICogQHNlZSAjZ2V0SnNwUHJvcGVydHlHcm91cCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0SnNwUHJvcGVydHlHcm91cF9CdWZmZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc0Vycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlIDxlbT5FcnJvciBPbiBVbmRlY2xhcmVkIE5hbWVzcGFjZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVycm9yIE9uIFVuZGVjbGFyZWQgTmFtZXNwYWNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwUHJvcGVydHlHcm91cCNpc0Vycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKCkKKwkgKiBAc2VlICNnZXRKc3BQcm9wZXJ0eUdyb3VwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRKc3BQcm9wZXJ0eUdyb3VwX0Vycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLkpzcFByb3BlcnR5R3JvdXAjZ2V0SWQgPGVtPklkPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtOTYwLDYgKzk5NywzMCBAQAogCQlFQXR0cmlidXRlIEpTUF9QUk9QRVJUWV9HUk9VUF9fVFJJTV9ESVJFQ1RJVkVfV0hJVEVTUEFDRVMgPSBlSU5TVEFOQ0UuZ2V0SnNwUHJvcGVydHlHcm91cF9UcmltRGlyZWN0aXZlV2hpdGVzcGFjZXMoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGVudCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19ERUZBVUxUX0NPTlRFTlRfVFlQRSA9IGVJTlNUQU5DRS5nZXRKc3BQcm9wZXJ0eUdyb3VwX0RlZmF1bHRDb250ZW50VHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnVmZmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19CVUZGRVIgPSBlSU5TVEFOQ0UuZ2V0SnNwUHJvcGVydHlHcm91cF9CdWZmZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVycm9yIE9uIFVuZGVjbGFyZWQgTmFtZXNwYWNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgSlNQX1BST1BFUlRZX0dST1VQX19FUlJPUl9PTl9VTkRFQ0xBUkVEX05BTUVTUEFDRSA9IGVJTlNUQU5DRS5nZXRKc3BQcm9wZXJ0eUdyb3VwX0Vycm9yT25VbmRlY2xhcmVkTmFtZXNwYWNlKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BBZGFwdGVyRmFjdG9yeS5qYXZhCmluZGV4IDEzMDExYTEuLjMyNjY4NGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcEFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTU4LDYgKzU4LDcgQEAKIAkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewogCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewogCQkJcmV0dXJuIHRydWU7CkBAIC02OSwyMyArNzAsMjcgQEAKIAl9CiAKIAkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJvdGVjdGVkIEpzcFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBKc3BTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VKc3BDb25maWcoSnNwQ29uZmlnIG9iamVjdCkgeworCXByb3RlY3RlZCBKc3BTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgSnNwU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSnNwQ29uZmlnKEpzcENvbmZpZyBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSnNwQ29uZmlnQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlSnNwUHJvcGVydHlHcm91cChKc3BQcm9wZXJ0eUdyb3VwIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlSnNwUHJvcGVydHlHcm91cChKc3BQcm9wZXJ0eUdyb3VwIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVKc3BQcm9wZXJ0eUdyb3VwQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVGFnTGliKFRhZ0xpYiBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhZ0xpYihUYWdMaWIgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVRhZ0xpYkFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKIAkJCX0KIAkJfTsKQEAgLTk4LDggKzEwMyw5IEBACiAJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKIAl9CiAKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFJlc291cmNlRmFjdG9yeUltcGwuamF2YQppbmRleCBhNjFhZTBhLi5jMjA4ZmQxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFJlc291cmNlRmFjdG9yeUltcGwuamF2YQpAQCAtNDIsNiArNDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewogCQlYTUxSZXNvdXJjZSByZXN1bHQgPSBuZXcgSnNwUmVzb3VyY2VJbXBsKHVyaSk7CiAJCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFN3aXRjaC5qYXZhCmluZGV4IDAxZGFmYjAuLmRjMmZmZDYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwU3dpdGNoLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BTd2l0Y2guamF2YQpAQCAtMzIsNyArMzIsNyBAQAogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBKc3BTd2l0Y2ggeworcHVibGljIGNsYXNzIEpzcFN3aXRjaDxUPiB7CiAJLyoqCiAJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTYwLDcgKzYwLDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgeworCXB1YmxpYyBUIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewogCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7CiAJfQogCkBAIC03MSwxNiArNzEsMTYgQEAKIAkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCXByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewogCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKIAkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwogCQl9CiAJCWVsc2UgewotCQkJTGlzdCBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOworCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CiAJCQlyZXR1cm4KIAkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwogCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKIAkJfQogCX0KIApAQCAtOTEsMjMgKzkxLDIzIEBACiAJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKIAkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHOiB7CiAJCQkJSnNwQ29uZmlnIGpzcENvbmZpZyA9IChKc3BDb25maWcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUpzcENvbmZpZyhqc3BDb25maWcpOworCQkJCVQgcmVzdWx0ID0gY2FzZUpzcENvbmZpZyhqc3BDb25maWcpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVA6IHsKIAkJCQlKc3BQcm9wZXJ0eUdyb3VwIGpzcFByb3BlcnR5R3JvdXAgPSAoSnNwUHJvcGVydHlHcm91cCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlSnNwUHJvcGVydHlHcm91cChqc3BQcm9wZXJ0eUdyb3VwKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VKc3BQcm9wZXJ0eUdyb3VwKGpzcFByb3BlcnR5R3JvdXApOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCOiB7CiAJCQkJVGFnTGliIHRhZ0xpYiA9IChUYWdMaWIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRhZ0xpYih0YWdMaWIpOworCQkJCVQgcmVzdWx0ID0gY2FzZVRhZ0xpYih0YWdMaWIpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KQEAgLTExNiw2MiArMTE2LDYyIEBACiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmZpZzwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25maWc8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uZmlnPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmZpZzwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlSnNwQ29uZmlnKEpzcENvbmZpZyBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlSnNwQ29uZmlnKEpzcENvbmZpZyBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnR5IEdyb3VwPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnR5IEdyb3VwPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnR5IEdyb3VwPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnR5IEdyb3VwPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VKc3BQcm9wZXJ0eUdyb3VwKEpzcFByb3BlcnR5R3JvdXAgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUpzcFByb3BlcnR5R3JvdXAoSnNwUHJvcGVydHlHcm91cCBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhZyBMaWI8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFnIExpYjwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYWcgTGliPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhZyBMaWI8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRhZ0xpYihUYWdMaWIgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZVRhZ0xpYihUYWdMaWIgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCXB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BYTUxQcm9jZXNzb3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvanNwL2ludGVybmFsL3V0aWwvSnNwWE1MUHJvY2Vzc29yLmphdmEKaW5kZXggMjc1MWY5Ni4uZGJiNTQ5MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BYTUxQcm9jZXNzb3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcFhNTFByb2Nlc3Nvci5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS51dGlsLlhNTFByb2Nlc3NvcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2U7CkBAIC00Miw3ICs0Myw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0UmVnaXN0cmF0aW9ucygpIHsKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTWFwPFN0cmluZywgUmVzb3VyY2UuRmFjdG9yeT4gZ2V0UmVnaXN0cmF0aW9ucygpIHsKIAkJaWYgKHJlZ2lzdHJhdGlvbnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UmVnaXN0cmF0aW9ucygpOwogCQkJcmVnaXN0cmF0aW9ucy5wdXQoWE1MX0VYVEVOU0lPTiwgbmV3IEpzcFJlc291cmNlRmFjdG9yeUltcGwoKSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9BYnNvbHV0ZU9yZGVyaW5nVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvQWJzb2x1dGVPcmRlcmluZ1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGU4NzIxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvQWJzb2x1dGVPcmRlcmluZ1R5cGUuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQ6IEFic29sdXRlT3JkZXJpbmdUeXBlLmphdmEsdiAxLjEgMjAwOS8xMC8xNSAxODo1MjowMyBjYW5kZXJzb24gRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFic29sdXRlIE9yZGVyaW5nIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBQbGVhc2Ugc2VlIHNlY3Rpb24gOC4yLjIgb2YgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgMy4wCisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BYnNvbHV0ZU9yZGVyaW5nVHlwZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkFic29sdXRlT3JkZXJpbmdUeXBlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkFic29sdXRlT3JkZXJpbmdUeXBlI2dldE90aGVycyA8ZW0+T3RoZXJzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEFic29sdXRlT3JkZXJpbmdUeXBlKCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEFic29sdXRlT3JkZXJpbmdUeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0QWJzb2x1dGVPcmRlcmluZ1R5cGVfR3JvdXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlGZWF0dXJlTWFwIGdldEdyb3VwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0QWJzb2x1dGVPcmRlcmluZ1R5cGVfTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8U3RyaW5nPiBnZXROYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdGhlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5PcmRlcmluZ090aGVyc1R5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3RoZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3RoZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRBYnNvbHV0ZU9yZGVyaW5nVHlwZV9PdGhlcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PE9yZGVyaW5nT3RoZXJzVHlwZT4gZ2V0T3RoZXJzKCk7CisKK30gLy8gQWJzb2x1dGVPcmRlcmluZ1R5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0F1dGhDb25zdHJhaW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9BdXRoQ29uc3RyYWludC5qYXZhCmluZGV4IDYwMDUxMGIuLjVlYmJhYWIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0F1dGhDb25zdHJhaW50LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvQXV0aENvbnN0cmFpbnQuamF2YQpAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKIAogLyoqCkBAIC0yMiwxOSArMjMsMjAgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgYXV0aC1jb25zdHJhaW50VHlwZSBpbmRpY2F0ZXMgdGhlIHVzZXIgcm9sZXMgdGhhdAotICogCXNob3VsZCBiZSBwZXJtaXR0ZWQgYWNjZXNzIHRvIHRoaXMgcmVzb3VyY2UKLSAqIAljb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lIHVzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kCi0gKiAJdG8gdGhlIHJvbGUtbmFtZSBvZiBvbmUgb2YgdGhlIHNlY3VyaXR5LXJvbGUgZWxlbWVudHMKLSAqIAlkZWZpbmVkIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbiwgb3IgYmUgdGhlIHNwZWNpYWxseQotICogCXJlc2VydmVkIHJvbGUtbmFtZSAiKiIgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvcgotICogCWluZGljYXRpbmcgYWxsIHJvbGVzIGluIHRoZSB3ZWIgYXBwbGljYXRpb24uIElmIGJvdGggIioiCi0gKiAJYW5kIHJvbGVuYW1lcyBhcHBlYXIsIHRoZSBjb250YWluZXIgaW50ZXJwcmV0cyB0aGlzIGFzIGFsbAotICogCXJvbGVzLiAgSWYgbm8gcm9sZXMgYXJlIGRlZmluZWQsIG5vIHVzZXIgaXMgYWxsb3dlZCBhY2Nlc3MKLSAqIAl0byB0aGUgcG9ydGlvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIGRlc2NyaWJlZCBieSB0aGUKLSAqIAljb250YWluaW5nIHNlY3VyaXR5LWNvbnN0cmFpbnQuICBUaGUgY29udGFpbmVyIG1hdGNoZXMKLSAqIAlyb2xlIG5hbWVzIGNhc2Ugc2Vuc2l0aXZlbHkgd2hlbiBkZXRlcm1pbmluZyBhY2Nlc3MuCi0gKiAKKyAqICAgICAgICAgVGhlIGF1dGgtY29uc3RyYWludFR5cGUgaW5kaWNhdGVzIHRoZSB1c2VyIHJvbGVzIHRoYXQKKyAqICAgICAgICAgc2hvdWxkIGJlIHBlcm1pdHRlZCBhY2Nlc3MgdG8gdGhpcyByZXNvdXJjZQorICogICAgICAgICBjb2xsZWN0aW9uLiBUaGUgcm9sZS1uYW1lIHVzZWQgaGVyZSBtdXN0IGVpdGhlciBjb3JyZXNwb25kCisgKiAgICAgICAgIHRvIHRoZSByb2xlLW5hbWUgb2Ygb25lIG9mIHRoZSBzZWN1cml0eS1yb2xlIGVsZW1lbnRzCisgKiAgICAgICAgIGRlZmluZWQgZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLCBvciBiZSB0aGUgc3BlY2lhbGx5CisgKiAgICAgICAgIHJlc2VydmVkIHJvbGUtbmFtZSAiKiIgdGhhdCBpcyBhIGNvbXBhY3Qgc3ludGF4IGZvcgorICogICAgICAgICBpbmRpY2F0aW5nIGFsbCByb2xlcyBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLiBJZiBib3RoICIqIgorICogICAgICAgICBhbmQgcm9sZW5hbWVzIGFwcGVhciwgdGhlIGNvbnRhaW5lciBpbnRlcnByZXRzIHRoaXMgYXMgYWxsCisgKiAgICAgICAgIHJvbGVzLiAgSWYgbm8gcm9sZXMgYXJlIGRlZmluZWQsIG5vIHVzZXIgaXMgYWxsb3dlZCBhY2Nlc3MKKyAqICAgICAgICAgdG8gdGhlIHBvcnRpb24gb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZXNjcmliZWQgYnkgdGhlCisgKiAgICAgICAgIGNvbnRhaW5pbmcgc2VjdXJpdHktY29uc3RyYWludC4gIFRoZSBjb250YWluZXIgbWF0Y2hlcworICogICAgICAgICByb2xlIG5hbWVzIGNhc2Ugc2Vuc2l0aXZlbHkgd2hlbiBkZXRlcm1pbmluZyBhY2Nlc3MuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBXZWIgMi41CiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC02NSw3ICs2Nyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGVzY3JpcHRpb25zKCk7CisJTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KQEAgLTgwLDcgKzgyLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0QXV0aENvbnN0cmFpbnRfUm9sZU5hbWVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRSb2xlTmFtZXMoKTsKKwlMaXN0PFN0cmluZz4gZ2V0Um9sZU5hbWVzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvQ29va2llQ29tbWVudFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Nvb2tpZUNvbW1lbnRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkNWM1ZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Nvb2tpZUNvbW1lbnRUeXBlLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkOiBDb29raWVDb21tZW50VHlwZS5qYXZhLHYgMS4xIDIwMDkvMTAvMTUgMTg6NTI6MDMgY2FuZGVyc29uIEV4cCAkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db29raWUgQ29tbWVudCBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgVGhlIGNvbW1lbnQgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGFueSBzZXNzaW9uIHRyYWNraW5nCisgKiAgICAgICAgIGNvb2tpZXMgY3JlYXRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFVzZWQgaW46IGNvb2tpZS1jb25maWcKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIFdlYiAzLjAKKyAqICAgICAgIAorICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbW1lbnRUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRDb29raWVDb21tZW50VHlwZSgpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDb29raWVDb21tZW50VHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldENvb2tpZUNvbW1lbnRUeXBlX1ZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb21tZW50VHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBDb29raWVDb21tZW50VHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvQ29va2llQ29uZmlnVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvQ29va2llQ29uZmlnVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5N2NlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Db29raWVDb25maWdUeXBlLmphdmEKQEAgLTAsMCArMSwzNDIgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogQ29va2llQ29uZmlnVHlwZS5qYXZhLHYgMS4xIDIwMDkvMTAvMTUgMTg6NTI6MDMgY2FuZGVyc29uIEV4cCAkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvb2tpZSBDb25maWcgVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKyAqIAorICogCisgKiAgICAgICAgIFRoZSBjb29raWUtY29uZmlnVHlwZSBkZWZpbmVzIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUKKyAqICAgICAgICAgc2Vzc2lvbiB0cmFja2luZyBjb29raWVzIG9mIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorICogICAgICAgICAKKyAqICAgICAgICAgVXNlZCBpbjogc2Vzc2lvbi1jb25maWcKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIFdlYiAzLjAKKyAqICAgICAgIAorICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNnZXREb21haW4gPGVtPkRvbWFpbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNnZXRQYXRoIDxlbT5QYXRoPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb25maWdUeXBlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGUjaXNIdHRwT25seSA8ZW0+SHR0cCBPbmx5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb25maWdUeXBlI2lzU2VjdXJlIDxlbT5TZWN1cmU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGUjZ2V0TWF4QWdlIDxlbT5NYXggQWdlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb25maWdUeXBlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRDb29raWVDb25maWdUeXBlKCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIENvb2tpZUNvbmZpZ1R5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoZSBuYW1lIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byBhbnkgc2Vzc2lvbiB0cmFja2luZworCSAqICAgICAgICAgICAgIGNvb2tpZXMgY3JlYXRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKwkgKiAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBKU0VTU0lPTklECisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgV2ViIDMuMAorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0TmFtZShDb29raWVOYW1lVHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0Q29va2llQ29uZmlnVHlwZV9OYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ29va2llTmFtZVR5cGUgZ2V0TmFtZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXROYW1lKENvb2tpZU5hbWVUeXBlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRvbWFpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIGRvbWFpbiBuYW1lIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byBhbnkgc2Vzc2lvbiB0cmFja2luZworCSAqICAgICAgICAgICAgIGNvb2tpZXMgY3JlYXRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgMy4wCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Eb21haW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldERvbWFpbihDb29raWVEb21haW5UeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRDb29raWVDb25maWdUeXBlX0RvbWFpbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvb2tpZURvbWFpblR5cGUgZ2V0RG9tYWluKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb25maWdUeXBlI2dldERvbWFpbiA8ZW0+RG9tYWluPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Eb21haW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldERvbWFpbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RG9tYWluKENvb2tpZURvbWFpblR5cGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGF0aDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIHBhdGggdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGFueSBzZXNzaW9uIHRyYWNraW5nCisJICogICAgICAgICAgICAgY29va2llcyBjcmVhdGVkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIFdlYiAzLjAKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhdGg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFBhdGgoQ29va2llUGF0aFR5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldENvb2tpZUNvbmZpZ1R5cGVfUGF0aCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvb2tpZVBhdGhUeXBlIGdldFBhdGgoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGUjZ2V0UGF0aCA8ZW0+UGF0aDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGF0aDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0UGF0aCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UGF0aChDb29raWVQYXRoVHlwZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgY29tbWVudCB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gYW55IHNlc3Npb24gdHJhY2tpbmcKKwkgKiAgICAgICAgICAgICBjb29raWVzIGNyZWF0ZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgV2ViIDMuMAorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0Q29tbWVudChDb29raWVDb21tZW50VHlwZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0Q29va2llQ29uZmlnVHlwZV9Db21tZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ29va2llQ29tbWVudFR5cGUgZ2V0Q29tbWVudCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRDb21tZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb21tZW50KENvb2tpZUNvbW1lbnRUeXBlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh0dHAgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgYW55IHNlc3Npb24gdHJhY2tpbmcgY29va2llcyBjcmVhdGVkIAorCSAqICAgICAgICAgICAgIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uIHdpbGwgYmUgbWFya2VkIGFzIEh0dHBPbmx5CisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgV2ViIDMuMAorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHR0cCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldEh0dHBPbmx5KCkKKwkgKiBAc2VlICN1bnNldEh0dHBPbmx5KCkKKwkgKiBAc2VlICNzZXRIdHRwT25seShib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRDb29raWVDb25maWdUeXBlX0h0dHBPbmx5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0h0dHBPbmx5KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb25maWdUeXBlI2lzSHR0cE9ubHkgPGVtPkh0dHAgT25seTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHR0cCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldEh0dHBPbmx5KCkKKwkgKiBAc2VlICN1bnNldEh0dHBPbmx5KCkKKwkgKiBAc2VlICNpc0h0dHBPbmx5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRIdHRwT25seShib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNpc0h0dHBPbmx5IDxlbT5IdHRwIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0SHR0cE9ubHkoKQorCSAqIEBzZWUgI2lzSHR0cE9ubHkoKQorCSAqIEBzZWUgI3NldEh0dHBPbmx5KGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRIdHRwT25seSgpOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb25maWdUeXBlI2lzSHR0cE9ubHkgPGVtPkh0dHAgT25seTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHR0cCBPbmx5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogQHNlZSAjdW5zZXRIdHRwT25seSgpCisJICogQHNlZSAjaXNIdHRwT25seSgpCisJICogQHNlZSAjc2V0SHR0cE9ubHkoYm9vbGVhbikKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NldEh0dHBPbmx5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN1cmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIGFueSBzZXNzaW9uIHRyYWNraW5nIGNvb2tpZXMgY3JlYXRlZCAKKwkgKiAgICAgICAgICAgICBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbiB3aWxsIGJlIG1hcmtlZCBhcyBzZWN1cmUKKwkgKiAgICAgICAgICAgICBldmVuIGlmIHRoZSByZXF1ZXN0IHRoYXQgaW5pdGlhdGVkIHRoZSBjb3JyZXNwb25kaW5nIHNlc3Npb24KKwkgKiAgICAgICAgICAgICBpcyB1c2luZyBwbGFpbiBIVFRQIGluc3RlYWQgb2YgSFRUUFMKKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgMy4wCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cmU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0U2VjdXJlKCkKKwkgKiBAc2VlICN1bnNldFNlY3VyZSgpCisJICogQHNlZSAjc2V0U2VjdXJlKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldENvb2tpZUNvbmZpZ1R5cGVfU2VjdXJlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NlY3VyZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNpc1NlY3VyZSA8ZW0+U2VjdXJlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN1cmU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0U2VjdXJlKCkKKwkgKiBAc2VlICN1bnNldFNlY3VyZSgpCisJICogQHNlZSAjaXNTZWN1cmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNlY3VyZShib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNpc1NlY3VyZSA8ZW0+U2VjdXJlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1NldFNlY3VyZSgpCisJICogQHNlZSAjaXNTZWN1cmUoKQorCSAqIEBzZWUgI3NldFNlY3VyZShib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHVuc2V0U2VjdXJlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGUjaXNTZWN1cmUgPGVtPlNlY3VyZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdXJlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogQHNlZSAjdW5zZXRTZWN1cmUoKQorCSAqIEBzZWUgI2lzU2VjdXJlKCkKKwkgKiBAc2VlICNzZXRTZWN1cmUoYm9vbGVhbikKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NldFNlY3VyZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWF4IEFnZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIGxpZmV0aW1lIChpbiBzZWNvbmRzKSB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gYW55CisJICogICAgICAgICAgICAgc2Vzc2lvbiB0cmFja2luZyBjb29raWVzIGNyZWF0ZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisJICogICAgICAgICAgICAgRGVmYXVsdCBpcyAtMQorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIFdlYiAzLjAKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1heCBBZ2U8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1heEFnZShCaWdJbnRlZ2VyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRDb29raWVDb25maWdUeXBlX01heEFnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUJpZ0ludGVnZXIgZ2V0TWF4QWdlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb25maWdUeXBlI2dldE1heEFnZSA8ZW0+TWF4IEFnZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWF4IEFnZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TWF4QWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXhBZ2UoQmlnSW50ZWdlciB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElkKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0Q29va2llQ29uZmlnVHlwZV9JZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXRJZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBDb29raWVDb25maWdUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Db29raWVEb21haW5UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Db29raWVEb21haW5UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyYmMyYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Nvb2tpZURvbWFpblR5cGUuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQ6IENvb2tpZURvbWFpblR5cGUuamF2YSx2IDEuMSAyMDA5LzEwLzE1IDE4OjUyOjAzIGNhbmRlcnNvbiBFeHAgJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29va2llIERvbWFpbiBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgVGhlIGRvbWFpbiBuYW1lIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byBhbnkgc2Vzc2lvbiB0cmFja2luZworICogICAgICAgICBjb29raWVzIGNyZWF0ZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgKiAgICAgICAgIAorICogICAgICAgICBVc2VkIGluOiBjb29raWUtY29uZmlnCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgMy4wCisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVEb21haW5UeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRDb29raWVEb21haW5UeXBlKCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIENvb2tpZURvbWFpblR5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRDb29raWVEb21haW5UeXBlX1ZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVEb21haW5UeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOworCit9IC8vIENvb2tpZURvbWFpblR5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Nvb2tpZU5hbWVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Db29raWVOYW1lVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzhlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Db29raWVOYW1lVHlwZS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogQ29va2llTmFtZVR5cGUuamF2YSx2IDEuMSAyMDA5LzEwLzE1IDE4OjUyOjAzIGNhbmRlcnNvbiBFeHAgJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29va2llIE5hbWUgVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKyAqIAorICogCisgKiAgICAgICAgIFRoZSBuYW1lIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byBhbnkgc2Vzc2lvbiB0cmFja2luZworICogICAgICAgICBjb29raWVzIGNyZWF0ZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24uCisgKiAgICAgICAgIFRoZSBkZWZhdWx0IGlzIEpTRVNTSU9OSUQKKyAqICAgICAgICAgCisgKiAgICAgICAgIFVzZWQgaW46IGNvb2tpZS1jb25maWcKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIFdlYiAzLjAKKyAqICAgICAgIAorICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZU5hbWVUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRDb29raWVOYW1lVHlwZSgpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDb29raWVOYW1lVHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldENvb2tpZU5hbWVUeXBlX1ZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVOYW1lVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBDb29raWVOYW1lVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvQ29va2llUGF0aFR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Nvb2tpZVBhdGhUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRlZTYxZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Nvb2tpZVBhdGhUeXBlLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkOiBDb29raWVQYXRoVHlwZS5qYXZhLHYgMS4xIDIwMDkvMTAvMTUgMTg6NTI6MDMgY2FuZGVyc29uIEV4cCAkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db29raWUgUGF0aCBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgVGhlIHBhdGggdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGFueSBzZXNzaW9uIHRyYWNraW5nCisgKiAgICAgICAgIGNvb2tpZXMgY3JlYXRlZCBieSB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFVzZWQgaW46IGNvb2tpZS1jb25maWcKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIFdlYiAzLjAKKyAqICAgICAgIAorICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZVBhdGhUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRDb29raWVQYXRoVHlwZSgpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDb29raWVQYXRoVHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldENvb2tpZVBhdGhUeXBlX1ZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldFZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVQYXRoVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBDb29raWVQYXRoVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRGlzcGF0Y2hlclR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Rpc3BhdGNoZXJUeXBlLmphdmEKaW5kZXggYzEzOTM1Ni4uNWFhNzRkZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRGlzcGF0Y2hlclR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9EaXNwYXRjaGVyVHlwZS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjQsMjMgKzI0LDc3IEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIGRpc3BhdGNoZXIgaGFzIGZvdXIgbGVnYWwgdmFsdWVzOiBGT1JXQVJELCBSRVFVRVNULCBJTkNMVURFLAotICogCWFuZCBFUlJPUi4gQSB2YWx1ZSBvZiBGT1JXQVJEIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkCi0gKiAJdW5kZXIgUmVxdWVzdERpc3BhdGNoZXIuZm9yd2FyZCgpIGNhbGxzLiAgQSB2YWx1ZSBvZiBSRVFVRVNUCi0gKiAJbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvCi0gKiAJdGhlIHBhdGggb3Igc2VydmxldC4gQSB2YWx1ZSBvZiBJTkNMVURFIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZQotICogCWFwcGxpZWQgdW5kZXIgUmVxdWVzdERpc3BhdGNoZXIuaW5jbHVkZSgpIGNhbGxzLiAgQSB2YWx1ZSBvZgotICogCUVSUk9SIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyIHRoZSBlcnJvciBwYWdlCi0gKiAJbWVjaGFuaXNtLiAgVGhlIGFic2VuY2Ugb2YgYW55IGRpc3BhdGNoZXIgZWxlbWVudHMgaW4gYQotICogCWZpbHRlci1tYXBwaW5nIGluZGljYXRlcyBhIGRlZmF1bHQgb2YgYXBwbHlpbmcgZmlsdGVycyBvbmx5IHVuZGVyCi0gKiAJb3JkaW5hcnkgY2xpZW50IGNhbGxzIHRvIHRoZSBwYXRoIG9yIHNlcnZsZXQuCi0gKiAKKyAqICAgICAgICAgVGhlIGRpc3BhdGNoZXIgaGFzIGZpdmUgbGVnYWwgdmFsdWVzOiBGT1JXQVJELCBSRVFVRVNULAorICogICAgICAgICBJTkNMVURFLCBBU1lOQywgYW5kIEVSUk9SLgorICogICAgICAgICAKKyAqICAgICAgICAgQSB2YWx1ZSBvZiBGT1JXQVJEIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyCisgKiAgICAgICAgIFJlcXVlc3REaXNwYXRjaGVyLmZvcndhcmQoKSBjYWxscy4KKyAqICAgICAgICAgQSB2YWx1ZSBvZiBSRVFVRVNUIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyCisgKiAgICAgICAgIG9yZGluYXJ5IGNsaWVudCBjYWxscyB0byB0aGUgcGF0aCBvciBzZXJ2bGV0LgorICogICAgICAgICBBIHZhbHVlIG9mIElOQ0xVREUgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIKKyAqICAgICAgICAgUmVxdWVzdERpc3BhdGNoZXIuaW5jbHVkZSgpIGNhbGxzLgorICogICAgICAgICBBIHZhbHVlIG9mIEFTWU5DIG1lYW5zIHRoZSBGaWx0ZXIgd2lsbCBiZSBhcHBsaWVkIHVuZGVyCisgKiAgICAgICAgIGNhbGxzIGRpc3BhdGNoZWQgZnJvbSBhbiBBc3luY0NvbnRleHQuCisgKiAgICAgICAgIEEgdmFsdWUgb2YgRVJST1IgbWVhbnMgdGhlIEZpbHRlciB3aWxsIGJlIGFwcGxpZWQgdW5kZXIgdGhlCisgKiAgICAgICAgIGVycm9yIHBhZ2UgbWVjaGFuaXNtLgorICogICAgICAgICAKKyAqICAgICAgICAgVGhlIGFic2VuY2Ugb2YgYW55IGRpc3BhdGNoZXIgZWxlbWVudHMgaW4gYSBmaWx0ZXItbWFwcGluZworICogICAgICAgICBpbmRpY2F0ZXMgYSBkZWZhdWx0IG9mIGFwcGx5aW5nIGZpbHRlcnMgb25seSB1bmRlciBvcmRpbmFyeQorICogICAgICAgICBjbGllbnQgY2FsbHMgdG8gdGhlIHBhdGggb3Igc2VydmxldC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiAyLjUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldERpc3BhdGNoZXJUeXBlKCkKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpc3BhdGNoZXJUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKK3B1YmxpYyBlbnVtIERpc3BhdGNoZXJUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkZPUldBUkQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRk9SV0FSRAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUZPUldBUkRfTElURVJBTCgwLCAiRk9SV0FSRCIsICJGT1JXQVJEIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPklOQ0xVREU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSU5DTFVERQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUlOQ0xVREVfTElURVJBTCgxLCAiSU5DTFVERSIsICJJTkNMVURFIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPlJFUVVFU1Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUkVRVUVTVAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVJFUVVFU1RfTElURVJBTCgyLCAiUkVRVUVTVCIsICJSRVFVRVNUIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFTWU5DPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0FTWU5DCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQVNZTkNfTElURVJBTCgzLCAiQVNZTkMiLCAiQVNZTkMiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyoqCisJICogVGhlICc8ZW0+PGI+RVJST1I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRVJST1IKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlFUlJPUl9MSVRFUkFMKDQsICJFUlJPUiIsICJFUlJPUiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5GT1JXQVJEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC04NCw2ICsxMzgsMjEgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVRVNUID0gMjsKIAogCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFTWU5DPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogICAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgMy4wCisJICogICAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEBzZWUgI0FTWU5DX0xJVEVSQUwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1lOQyA9IDM7CisKKwkvKioKIAkgKiBUaGUgJzxlbT48Yj5FUlJPUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtOTUsNDcgKzE2NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Rk9SV0FSRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGT1JXQVJECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBGT1JXQVJEX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoRk9SV0FSRCwgIkZPUldBUkQiLCAiRk9SV0FSRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOQ0xVREU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5DTFVERQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzcGF0Y2hlclR5cGUgSU5DTFVERV9MSVRFUkFMID0gbmV3IERpc3BhdGNoZXJUeXBlKElOQ0xVREUsICJJTkNMVURFIiwgIklOQ0xVREUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVFVRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUVVFU1QKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpc3BhdGNoZXJUeXBlIFJFUVVFU1RfTElURVJBTCA9IG5ldyBEaXNwYXRjaGVyVHlwZShSRVFVRVNULCAiUkVRVUVTVCIsICJSRVFVRVNUIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVJST1I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVJST1IKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpc3BhdGNoZXJUeXBlIEVSUk9SX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoRVJST1IsICJFUlJPUiIsICJFUlJPUiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDQ7CiAKIAkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RGlzcGF0Y2hlciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KQEAgLTE0OCw2ICsxNzcsNyBAQAogCQkJRk9SV0FSRF9MSVRFUkFMLAogCQkJSU5DTFVERV9MSVRFUkFMLAogCQkJUkVRVUVTVF9MSVRFUkFMLAorCQkJQVNZTkNfTElURVJBTCwKIAkJCUVSUk9SX0xJVEVSQUwsCiAJCX07CiAKQEAgLTE1Nyw3ICsxODcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxEaXNwYXRjaGVyVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCkBAIC0yMDIsMTkgKzIzMiw4MCBAQAogCQkJY2FzZSBGT1JXQVJEOiByZXR1cm4gRk9SV0FSRF9MSVRFUkFMOwogCQkJY2FzZSBJTkNMVURFOiByZXR1cm4gSU5DTFVERV9MSVRFUkFMOwogCQkJY2FzZSBSRVFVRVNUOiByZXR1cm4gUkVRVUVTVF9MSVRFUkFMOworCQkJY2FzZSBBU1lOQzogcmV0dXJuIEFTWU5DX0xJVEVSQUw7CiAJCQljYXNlIEVSUk9SOiByZXR1cm4gRVJST1JfTElURVJBTDsKIAkJfQotCQlyZXR1cm4gbnVsbDsJCisJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKIAkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHJpdmF0ZSBEaXNwYXRjaGVyVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQlzdXBlcih2YWx1ZSwgbmFtZSwgbGl0ZXJhbCk7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKIAl9CiAKLX0gLy9EaXNwYXRjaGVyVHlwZQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9FcnJvclBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Vycm9yUGFnZS5qYXZhCmluZGV4IDEwYTRkYzUuLjUzYzg1ZGYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Vycm9yUGFnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Vycm9yUGFnZS5qYXZhCkBAIC0yMiwxMiArMjIsMTkgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgZXJyb3ItcGFnZVR5cGUgY29udGFpbnMgYSBtYXBwaW5nIGJldHdlZW4gYW4gZXJyb3IgY29kZQotICogCW9yIGV4Y2VwdGlvbiB0eXBlIHRvIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgaW4gdGhlIHdlYgotICogCWFwcGxpY2F0aW9uLgotICogCi0gKiAJVXNlZCBpbjogd2ViLWFwcAotICogCisgKiAgICAgICAgIFRoZSBlcnJvci1wYWdlVHlwZSBjb250YWlucyBhIG1hcHBpbmcgYmV0d2VlbiBhbiBlcnJvciBjb2RlCisgKiAgICAgICAgIG9yIGV4Y2VwdGlvbiB0eXBlIHRvIHRoZSBwYXRoIG9mIGEgcmVzb3VyY2UgaW4gdGhlIHdlYgorICogICAgICAgICBhcHBsaWNhdGlvbi4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEVycm9yLXBhZ2UgZGVjbGFyYXRpb25zIHVzaW5nIHRoZSBleGNlcHRpb24tdHlwZSBlbGVtZW50IGluCisgKiAgICAgICAgIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSB1bmlxdWUgdXAgdG8gdGhlIGNsYXNzIG5hbWUgb2YKKyAqICAgICAgICAgdGhlIGV4Y2VwdGlvbi10eXBlLiBTaW1pbGFybHksIGVycm9yLXBhZ2UgZGVjbGFyYXRpb25zIHVzaW5nIHRoZQorICogICAgICAgICBzdGF0dXMtY29kZSBlbGVtZW50IG11c3QgYmUgdW5pcXVlIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAqICAgICAgICAgdXAgdG8gdGhlIHN0YXR1cyBjb2RlLgorICogICAgICAgICAKKyAqICAgICAgICAgVXNlZCBpbjogd2ViLWFwcAorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNzgsMTAgKzg1LDExIEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICAgIFRoZSBleGNlcHRpb24tdHlwZSBjb250YWlucyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcwotCSAqIAkgICAgICBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4KLQkgKiAKLQkgKiAJICAgIAorCSAqICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbi10eXBlIGNvbnRhaW5zIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCisJICogICAgICAgICAgICAgICBuYW1lIG9mIGEgSmF2YSBleGNlcHRpb24gdHlwZS4KKwkgKiAgICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQorCSAqICAgICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNlcHRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0RXhjZXB0aW9uVHlwZShTdHJpbmcpCkBAIC0xMDcsMTIgKzExNSwxMyBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZQotCSAqIAkgICAgcmVzb3VyY2UgaW4gdGhlIHdlYiBhcHBsaWNhdGlvbiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgotCSAqIAkgICAgdGhlIHdlYiBhcHBsaWNhdGlvbi4gVGhlIHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBtdXN0IGhhdmUKLQkgKiAJICAgIGEgbGVhZGluZyBgLycuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIGxvY2F0aW9uIGVsZW1lbnQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZQorCSAqICAgICAgICAgICAgIHJlc291cmNlIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKKwkgKiAgICAgICAgICAgICB0aGUgd2ViIGFwcGxpY2F0aW9uLiBUaGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIG11c3QgaGF2ZQorCSAqICAgICAgICAgICAgIGEgbGVhZGluZyBgLycuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldExvY2F0aW9uKFN0cmluZykKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0ZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRmlsdGVyLmphdmEKaW5kZXggYzQxMDNmMy4uMzdkNTdkYSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRmlsdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRmlsdGVyLmphdmEKQEAgLTEyLDcgKzEyLDExIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZTsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjIsMTUgKzI2LDE2IEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIGZpbHRlclR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGEgZmlsdGVyIGluIHRoZSB3ZWIKLSAqIAlhcHBsaWNhdGlvbi4gVGhlIGZpbHRlciBpcyBtYXBwZWQgdG8gZWl0aGVyIGEgc2VydmxldCBvciBhCi0gKiAJVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nIHRoZQotICogCWZpbHRlci1uYW1lIHZhbHVlIHRvIHJlZmVyZW5jZS4gRmlsdGVycyBjYW4gYWNjZXNzIHRoZQotICogCWluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZGVjbGFyZWQgaW4gdGhlIGRlcGxveW1lbnQKLSAqIAlkZXNjcmlwdG9yIGF0IHJ1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLgotICogCi0gKiAJVXNlZCBpbjogd2ViLWFwcAotICogCisgKiAgICAgICAgIFRoZSBmaWx0ZXJUeXBlIGlzIHVzZWQgdG8gZGVjbGFyZSBhIGZpbHRlciBpbiB0aGUgd2ViCisgKiAgICAgICAgIGFwcGxpY2F0aW9uLiBUaGUgZmlsdGVyIGlzIG1hcHBlZCB0byBlaXRoZXIgYSBzZXJ2bGV0IG9yIGEKKyAqICAgICAgICAgVVJMIHBhdHRlcm4gaW4gdGhlIGZpbHRlci1tYXBwaW5nIGVsZW1lbnQsIHVzaW5nIHRoZQorICogICAgICAgICBmaWx0ZXItbmFtZSB2YWx1ZSB0byByZWZlcmVuY2UuIEZpbHRlcnMgY2FuIGFjY2VzcyB0aGUKKyAqICAgICAgICAgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBkZWNsYXJlZCBpbiB0aGUgZGVwbG95bWVudAorICogICAgICAgICBkZXNjcmlwdG9yIGF0IHJ1bnRpbWUgdmlhIHRoZSBGaWx0ZXJDb25maWcgaW50ZXJmYWNlLgorICogICAgICAgICAKKyAqICAgICAgICAgVXNlZCBpbjogd2ViLWFwcAorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNDIsNiArNDcsNyBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRGaWx0ZXJOYW1lIDxlbT5GaWx0ZXIgTmFtZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldEZpbHRlckNsYXNzIDxlbT5GaWx0ZXIgQ2xhc3M8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNpc0FzeW5jU3VwcG9ydGVkIDxlbT5Bc3luYyBTdXBwb3J0ZWQ8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CiAgKiA8L3VsPgpAQCAtNjUsNyArNzEsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGaWx0ZXJfRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtODAsNyArODYsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGaWx0ZXJfRGlzcGxheU5hbWVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKKwlMaXN0PERpc3BsYXlOYW1lPiBnZXREaXNwbGF5TmFtZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTk1LDcgKzEwMSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlcl9JY29ucygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKKwlMaXN0PEljb24+IGdldEljb25zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWx0ZXIgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMTI5LDkgKzEzNSwxMCBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIGZpbHRlci4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgZmlsdGVyLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiAyLjUKKwkgKiAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbHRlciBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCiAJICogQHNlZSAjc2V0RmlsdGVyQ2xhc3MoU3RyaW5nKQpAQCAtMTUxLDYgKzE1OCw1OSBAQAogCXZvaWQgc2V0RmlsdGVyQ2xhc3MoU3RyaW5nIHZhbHVlKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzeW5jIFN1cHBvcnRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgV2ViIDMuMAorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXN5bmMgU3VwcG9ydGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldEFzeW5jU3VwcG9ydGVkKCkKKwkgKiBAc2VlICN1bnNldEFzeW5jU3VwcG9ydGVkKCkKKwkgKiBAc2VlICNzZXRBc3luY1N1cHBvcnRlZChib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRGaWx0ZXJfQXN5bmNTdXBwb3J0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzQXN5bmNTdXBwb3J0ZWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNpc0FzeW5jU3VwcG9ydGVkIDxlbT5Bc3luYyBTdXBwb3J0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFzeW5jIFN1cHBvcnRlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRBc3luY1N1cHBvcnRlZCgpCisJICogQHNlZSAjdW5zZXRBc3luY1N1cHBvcnRlZCgpCisJICogQHNlZSAjaXNBc3luY1N1cHBvcnRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QXN5bmNTdXBwb3J0ZWQoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNpc0FzeW5jU3VwcG9ydGVkIDxlbT5Bc3luYyBTdXBwb3J0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0QXN5bmNTdXBwb3J0ZWQoKQorCSAqIEBzZWUgI2lzQXN5bmNTdXBwb3J0ZWQoKQorCSAqIEBzZWUgI3NldEFzeW5jU3VwcG9ydGVkKGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRBc3luY1N1cHBvcnRlZCgpOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIjaXNBc3luY1N1cHBvcnRlZCA8ZW0+QXN5bmMgU3VwcG9ydGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3luYyBTdXBwb3J0ZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldEFzeW5jU3VwcG9ydGVkKCkKKwkgKiBAc2VlICNpc0FzeW5jU3VwcG9ydGVkKCkKKwkgKiBAc2VlICNzZXRBc3luY1N1cHBvcnRlZChib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0QXN5bmNTdXBwb3J0ZWQoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KIAkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWV9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0xNTgsMTYgKzIxOCwxNyBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIGluaXQtcGFyYW0gZWxlbWVudCBjb250YWlucyBhIG5hbWUvdmFsdWUgcGFpciBhcwotCSAqIAkgICAgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gb2YgYSBzZXJ2bGV0IGZpbHRlcgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSBpbml0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgYSBuYW1lL3ZhbHVlIHBhaXIgYXMKKwkgKiAgICAgICAgICAgICBhbiBpbml0aWFsaXphdGlvbiBwYXJhbSBvZiBhIHNlcnZsZXQgZmlsdGVyCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlcl9Jbml0UGFyYW1zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRJbml0UGFyYW1zKCk7CisJTGlzdDxQYXJhbVZhbHVlPiBnZXRJbml0UGFyYW1zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRmlsdGVyTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRmlsdGVyTWFwcGluZy5qYXZhCmluZGV4IDIxZWY0YmYuLjJmNmQzYmQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0ZpbHRlck1hcHBpbmcuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9GaWx0ZXJNYXBwaW5nLmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU7CiAKIC8qKgogICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTI0LDIyICsyNSwyMyBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCURlY2xhcmF0aW9uIG9mIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaW4gdGhpcyB3ZWIKLSAqIAlhcHBsaWNhdGlvbiBpcyBkb25lIGJ5IHVzaW5nIGZpbHRlci1tYXBwaW5nVHlwZS4KLSAqIAlUaGUgY29udGFpbmVyIHVzZXMgdGhlIGZpbHRlci1tYXBwaW5nCi0gKiAJZGVjbGFyYXRpb25zIHRvIGRlY2lkZSB3aGljaCBmaWx0ZXJzIHRvIGFwcGx5IHRvIGEgcmVxdWVzdCwKLSAqIAlhbmQgaW4gd2hhdCBvcmRlci4gVGhlIGNvbnRhaW5lciBtYXRjaGVzIHRoZSByZXF1ZXN0IFVSSSB0bwotICogCWEgU2VydmxldCBpbiB0aGUgbm9ybWFsIHdheS4gVG8gZGV0ZXJtaW5lIHdoaWNoIGZpbHRlcnMgdG8KLSAqIAlhcHBseSBpdCBtYXRjaGVzIGZpbHRlci1tYXBwaW5nIGRlY2xhcmF0aW9ucyBlaXRoZXIgb24KLSAqIAlzZXJ2bGV0LW5hbWUsIG9yIG9uIHVybC1wYXR0ZXJuIGZvciBlYWNoIGZpbHRlci1tYXBwaW5nCi0gKiAJZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoIHN0eWxlIGlzIHVzZWQuIFRoZSBvcmRlciBpbgotICogCXdoaWNoIGZpbHRlcnMgYXJlIGludm9rZWQgaXMgdGhlIG9yZGVyIGluIHdoaWNoCi0gKiAJZmlsdGVyLW1hcHBpbmcgZGVjbGFyYXRpb25zIHRoYXQgbWF0Y2ggYSByZXF1ZXN0IFVSSSBmb3IgYQotICogCXNlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZQotICogCWZpbHRlci1uYW1lIHZhbHVlIG11c3QgYmUgdGhlIHZhbHVlIG9mIHRoZSBmaWx0ZXItbmFtZQotICogCXN1Yi1lbGVtZW50cyBvZiBvbmUgb2YgdGhlIGZpbHRlciBkZWNsYXJhdGlvbnMgaW4gdGhlCi0gKiAJZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICogCisgKiAgICAgICAgIERlY2xhcmF0aW9uIG9mIHRoZSBmaWx0ZXIgbWFwcGluZ3MgaW4gdGhpcyB3ZWIKKyAqICAgICAgICAgYXBwbGljYXRpb24gaXMgZG9uZSBieSB1c2luZyBmaWx0ZXItbWFwcGluZ1R5cGUuIAorICogICAgICAgICBUaGUgY29udGFpbmVyIHVzZXMgdGhlIGZpbHRlci1tYXBwaW5nCisgKiAgICAgICAgIGRlY2xhcmF0aW9ucyB0byBkZWNpZGUgd2hpY2ggZmlsdGVycyB0byBhcHBseSB0byBhIHJlcXVlc3QsCisgKiAgICAgICAgIGFuZCBpbiB3aGF0IG9yZGVyLiBUaGUgY29udGFpbmVyIG1hdGNoZXMgdGhlIHJlcXVlc3QgVVJJIHRvCisgKiAgICAgICAgIGEgU2VydmxldCBpbiB0aGUgbm9ybWFsIHdheS4gVG8gZGV0ZXJtaW5lIHdoaWNoIGZpbHRlcnMgdG8KKyAqICAgICAgICAgYXBwbHkgaXQgbWF0Y2hlcyBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgZWl0aGVyIG9uCisgKiAgICAgICAgIHNlcnZsZXQtbmFtZSwgb3Igb24gdXJsLXBhdHRlcm4gZm9yIGVhY2ggZmlsdGVyLW1hcHBpbmcKKyAqICAgICAgICAgZWxlbWVudCwgZGVwZW5kaW5nIG9uIHdoaWNoIHN0eWxlIGlzIHVzZWQuIFRoZSBvcmRlciBpbgorICogICAgICAgICB3aGljaCBmaWx0ZXJzIGFyZSBpbnZva2VkIGlzIHRoZSBvcmRlciBpbiB3aGljaAorICogICAgICAgICBmaWx0ZXItbWFwcGluZyBkZWNsYXJhdGlvbnMgdGhhdCBtYXRjaCBhIHJlcXVlc3QgVVJJIGZvciBhCisgKiAgICAgICAgIHNlcnZsZXQgYXBwZWFyIGluIHRoZSBsaXN0IG9mIGZpbHRlci1tYXBwaW5nIGVsZW1lbnRzLlRoZQorICogICAgICAgICBmaWx0ZXItbmFtZSB2YWx1ZSBtdXN0IGJlIHRoZSB2YWx1ZSBvZiB0aGUgZmlsdGVyLW5hbWUKKyAqICAgICAgICAgc3ViLWVsZW1lbnRzIG9mIG9uZSBvZiB0aGUgZmlsdGVyIGRlY2xhcmF0aW9ucyBpbiB0aGUKKyAqICAgICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtMTEzLDcgKzExNSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlck1hcHBpbmdfVXJsUGF0dGVybnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFVybFBhdHRlcm5zKCk7CisJTGlzdDxVcmxQYXR0ZXJuVHlwZT4gZ2V0VXJsUGF0dGVybnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZsZXQgTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgpAQCAtMTI4LDcgKzEzMCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldEZpbHRlck1hcHBpbmdfU2VydmxldE5hbWVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRTZXJ2bGV0TmFtZXMoKTsKKwlMaXN0PFN0cmluZz4gZ2V0U2VydmxldE5hbWVzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCkBAIC0xNDUsNyArMTQ3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0RmlsdGVyTWFwcGluZ19EaXNwYXRjaGVycygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0RGlzcGF0Y2hlcnMoKTsKKwlMaXN0PERpc3BhdGNoZXJUeXBlPiBnZXREaXNwYXRjaGVycygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0Zvcm1Mb2dpbkNvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRm9ybUxvZ2luQ29uZmlnLmphdmEKaW5kZXggMTM1NmZjNi4uNDRhNWRmNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRm9ybUxvZ2luQ29uZmlnLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvRm9ybUxvZ2luQ29uZmlnLmphdmEKQEAgLTIwLDEyICsyMCwxMyBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSBmb3JtLWxvZ2luLWNvbmZpZ1R5cGUgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IKLSAqIAlwYWdlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGluIGZvcm0gYmFzZWQgbG9naW4uIElmIGZvcm0gYmFzZWQKLSAqIAlhdXRoZW50aWNhdGlvbiBpcyBub3QgdXNlZCwgdGhlc2UgZWxlbWVudHMgYXJlIGlnbm9yZWQuCisgKiAgICAgICAgIFRoZSBmb3JtLWxvZ2luLWNvbmZpZ1R5cGUgc3BlY2lmaWVzIHRoZSBsb2dpbiBhbmQgZXJyb3IKKyAqICAgICAgICAgcGFnZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiBmb3JtIGJhc2VkIGxvZ2luLiBJZiBmb3JtIGJhc2VkCisgKiAgICAgICAgIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCB1c2VkLCB0aGVzZSBlbGVtZW50cyBhcmUgaWdub3JlZC4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFVzZWQgaW46IGxvZ2luLWNvbmZpZwogICogCi0gKiAJVXNlZCBpbjogbG9naW4tY29uZmlnCi0gKiAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNSAgICAgICAgCiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC01MCwxMiArNTEsMTMgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSBmb3JtLWxvZ2luLXBhZ2UgZWxlbWVudCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgd2ViCi0JICogCSAgICBhcHAgd2hlcmUgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgdXNlZCBmb3IgbG9naW4gY2FuIGJlCi0JICogCSAgICBmb3VuZC4gIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAotCSAqIAkgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgZm9ybS1sb2dpbi1wYWdlIGVsZW1lbnQgZGVmaW5lcyB0aGUgbG9jYXRpb24gaW4gdGhlIHdlYgorCSAqICAgICAgICAgICAgIGFwcCB3aGVyZSB0aGUgcGFnZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBsb2dpbiBjYW4gYmUKKwkgKiAgICAgICAgICAgICBmb3VuZC4gIFRoZSBwYXRoIGJlZ2lucyB3aXRoIGEgbGVhZGluZyAvIGFuZCBpcyBpbnRlcnByZXRlZAorCSAqICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rm9ybSBMb2dpbiBQYWdlPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRGb3JtTG9naW5QYWdlKFN0cmluZykKQEAgLTgxLDEzICs4MywxNCBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluCi0JICogCSAgICB0aGUgd2ViIGFwcCB3aGVyZSB0aGUgZXJyb3IgcGFnZSB0aGF0IGlzIGRpc3BsYXllZAotCSAqIAkgICAgd2hlbiBsb2dpbiBpcyBub3Qgc3VjY2Vzc2Z1bCBjYW4gYmUgZm91bmQuCi0JICogCSAgICBUaGUgcGF0aCBiZWdpbnMgd2l0aCBhIGxlYWRpbmcgLyBhbmQgaXMgaW50ZXJwcmV0ZWQKLQkgKiAJICAgIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBXQVIuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgVGhlIGZvcm0tZXJyb3ItcGFnZSBlbGVtZW50IGRlZmluZXMgdGhlIGxvY2F0aW9uIGluCisJICogICAgICAgICAgICAgdGhlIHdlYiBhcHAgd2hlcmUgdGhlIGVycm9yIHBhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQKKwkgKiAgICAgICAgICAgICB3aGVuIGxvZ2luIGlzIG5vdCBzdWNjZXNzZnVsIGNhbiBiZSBmb3VuZC4gCisJICogICAgICAgICAgICAgVGhlIHBhdGggYmVnaW5zIHdpdGggYSBsZWFkaW5nIC8gYW5kIGlzIGludGVycHJldGVkCisJICogICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIFdBUi4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBXZWIgMi41CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtIEVycm9yIFBhZ2U8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldEZvcm1FcnJvclBhZ2UoU3RyaW5nKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvSVdlYkNvbW1vbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvSVdlYkNvbW1vbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZjFhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9JV2ViQ29tbW9uLmphdmEKQEAgLTAsMCArMSw3ODQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlcnZpY2VSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHA8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jZ2V0TW9kdWxlTmFtZSA8ZW0+TW9kdWxlIE5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXREaXN0cmlidXRhYmxlcyA8ZW0+RGlzdHJpYnV0YWJsZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jZ2V0Q29udGV4dFBhcmFtcyA8ZW0+Q29udGV4dCBQYXJhbXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jZ2V0RmlsdGVycyA8ZW0+RmlsdGVyczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRGaWx0ZXJNYXBwaW5ncyA8ZW0+RmlsdGVyIE1hcHBpbmdzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2dldExpc3RlbmVycyA8ZW0+TGlzdGVuZXJzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2dldFNlcnZsZXRzIDxlbT5TZXJ2bGV0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRTZXJ2bGV0TWFwcGluZ3MgPGVtPlNlcnZsZXQgTWFwcGluZ3M8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jZ2V0U2Vzc2lvbkNvbmZpZ3MgPGVtPlNlc3Npb24gQ29uZmlnczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRNaW1lTWFwcGluZ3MgPGVtPk1pbWUgTWFwcGluZ3M8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jZ2V0V2VsY29tZUZpbGVMaXN0cyA8ZW0+V2VsY29tZSBGaWxlIExpc3RzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2dldEVycm9yUGFnZXMgPGVtPkVycm9yIFBhZ2VzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2dldEpzcENvbmZpZ3MgPGVtPkpzcCBDb25maWdzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2dldFNlY3VyaXR5Q29uc3RyYWludHMgPGVtPlNlY3VyaXR5IENvbnN0cmFpbnRzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2dldExvZ2luQ29uZmlncyA8ZW0+TG9naW4gQ29uZmlnczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRTZWN1cml0eVJvbGVzIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRFbnZFbnRyaWVzIDxlbT5FbnYgRW50cmllczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRFamJSZWZzIDxlbT5FamIgUmVmczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jZ2V0UmVzb3VyY2VSZWZzIDxlbT5SZXNvdXJjZSBSZWZzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMgPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2dldERhdGFTb3VyY2UgPGVtPkRhdGEgU291cmNlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRBYnNvbHV0ZU9yZGVyaW5nIDxlbT5BYnNvbHV0ZSBPcmRlcmluZzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcCgpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBJV2ViQ29tbW9uIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0dyb3VwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRmVhdHVyZU1hcCBnZXRHcm91cCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9ufS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0Rlc2NyaXB0aW9ucygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0Rpc3BsYXlOYW1lcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8RGlzcGxheU5hbWU+IGdldERpc3BsYXlOYW1lcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JY29uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfSWNvbnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PEljb24+IGdldEljb25zKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXN0cmlidXRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbXB0eVR5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzdHJpYnV0YWJsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXN0cmlidXRhYmxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0Rpc3RyaWJ1dGFibGVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxFbXB0eVR5cGU+IGdldERpc3RyaWJ1dGFibGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZXh0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoZSBjb250ZXh0LXBhcmFtIGVsZW1lbnQgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uCisJICogICAgICAgICAgICAgb2YgYSB3ZWIgYXBwbGljYXRpb24ncyBzZXJ2bGV0IGNvbnRleHQKKwkgKiAgICAgICAgICAgICBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiAyLjUKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRleHQgUGFyYW1zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfQ29udGV4dFBhcmFtcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8UGFyYW1WYWx1ZT4gZ2V0Q29udGV4dFBhcmFtcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmlsdGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaWx0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmlsdGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0ZpbHRlcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PEZpbHRlcj4gZ2V0RmlsdGVycygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmlsdGVyIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZ30uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaWx0ZXIgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWx0ZXIgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9GaWx0ZXJNYXBwaW5ncygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8RmlsdGVyTWFwcGluZz4gZ2V0RmlsdGVyTWFwcGluZ3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lcn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MaXN0ZW5lcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaXN0ZW5lcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9MaXN0ZW5lcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PExpc3RlbmVyPiBnZXRMaXN0ZW5lcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZsZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2bGV0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfU2VydmxldHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PFNlcnZsZXQ+IGdldFNlcnZsZXRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2bGV0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmd9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmxldCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PFNlcnZsZXRNYXBwaW5nPiBnZXRTZXJ2bGV0TWFwcGluZ3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlc3Npb24gQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWd9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2Vzc2lvbiBDb25maWdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2Vzc2lvbiBDb25maWdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZ3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PFNlc3Npb25Db25maWc+IGdldFNlc3Npb25Db25maWdzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaW1lIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmd9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWltZSBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbWUgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9NaW1lTWFwcGluZ3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PE1pbWVNYXBwaW5nPiBnZXRNaW1lTWFwcGluZ3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlbGNvbWUgRmlsZSBMaXN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlbGNvbWVGaWxlTGlzdH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XZWxjb21lIEZpbGUgTGlzdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWxjb21lIEZpbGUgTGlzdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9XZWxjb21lRmlsZUxpc3RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxXZWxjb21lRmlsZUxpc3Q+IGdldFdlbGNvbWVGaWxlTGlzdHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVycm9yIFBhZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVycm9yIFBhZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXJyb3IgUGFnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9FcnJvclBhZ2VzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxFcnJvclBhZ2U+IGdldEVycm9yUGFnZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpzcCBDb25maWdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpzcCBDb25maWdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SnNwIENvbmZpZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9Kc3BDb25maWdzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxKc3BDb25maWc+IGdldEpzcENvbmZpZ3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3VyaXR5IENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdXJpdHkgQ29uc3RyYWludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9TZWN1cml0eUNvbnN0cmFpbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxTZWN1cml0eUNvbnN0cmFpbnQ+IGdldFNlY3VyaXR5Q29uc3RyYWludHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvZ2luIENvbmZpZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2dpbkNvbmZpZ30uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2dpbiBDb25maWdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9naW4gQ29uZmlnczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0xvZ2luQ29uZmlncygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8TG9naW5Db25maWc+IGdldExvZ2luQ29uZmlncygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9TZWN1cml0eVJvbGVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxTZWN1cml0eVJvbGU+IGdldFNlY3VyaXR5Um9sZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudiBFbnRyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW52IEVudHJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9FbnZFbnRyaWVzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxFbnZFbnRyeT4gZ2V0RW52RW50cmllcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9FamJSZWZzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxFamJSZWY+IGdldEVqYlJlZnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9FamJMb2NhbFJlZnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PEVqYkxvY2FsUmVmPiBnZXRFamJMb2NhbFJlZnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZpY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZpY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1NlcnZpY2VSZWZzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxTZXJ2aWNlUmVmPiBnZXRTZXJ2aWNlUmVmcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1Jlc291cmNlUmVmcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8UmVzb3VyY2VSZWY+IGdldFJlc291cmNlUmVmcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWZ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1Jlc291cmNlRW52UmVmcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8UmVzb3VyY2VFbnZSZWY+IGdldFJlc291cmNlRW52UmVmcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxNZXNzYWdlRGVzdGluYXRpb25SZWY+IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWZ9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8UGVyc2lzdGVuY2VDb250ZXh0UmVmPiBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1BlcnNpc3RlbmNlVW5pdFJlZnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PFBlcnNpc3RlbmNlVW5pdFJlZj4gZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBDb25zdHJ1Y3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1Bvc3RDb25zdHJ1Y3RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gZ2V0UG9zdENvbnN0cnVjdHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaWZlY3ljbGVDYWxsYmFja30uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmUgRGVzdHJveXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgRGVzdHJveXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9QcmVEZXN0cm95cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IGdldFByZURlc3Ryb3lzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXRhIFNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EYXRhU291cmNlVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EYXRhIFNvdXJjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgU291cmNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfRGF0YVNvdXJjZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8RGF0YVNvdXJjZVR5cGU+IGdldERhdGFTb3VyY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvbn0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8TWVzc2FnZURlc3RpbmF0aW9uPiBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3R9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3MgTGlzdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgMy4wCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0xvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0PiBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW9kdWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIFdlYiAzLjAKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vZHVsZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfTW9kdWxlTmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8U3RyaW5nPiBnZXRNb2R1bGVOYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BYnNvbHV0ZSBPcmRlcmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkFic29sdXRlT3JkZXJpbmdUeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIFdlYiAzLjAKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFic29sdXRlIE9yZGVyaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfQWJzb2x1dGVPcmRlcmluZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8QWJzb2x1dGVPcmRlcmluZ1R5cGU+IGdldEFic29sdXRlT3JkZXJpbmcoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0SWQoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfSWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0SWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgIFRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgZGVmaW5lcyB3aGV0aGVyIHRoaXMKKwkgKiAgICAgICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFuZCBvdGhlciByZWxhdGVkIGRlcGxveW1lbnQKKwkgKiAgICAgICAgICAgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbW9kdWxlIChlLmcuLCB3ZWIgc2VydmljZQorCSAqICAgICAgICAgICBkZXNjcmlwdG9ycykgYXJlIGNvbXBsZXRlLCBvciB3aGV0aGVyIHRoZSBjbGFzcworCSAqICAgICAgICAgICBmaWxlcyBhdmFpbGFibGUgdG8gdGhpcyBtb2R1bGUgYW5kIHBhY2thZ2VkIHdpdGgKKwkgKiAgICAgICAgICAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCisJICogICAgICAgICAgIHRoYXQgc3BlY2lmeSBkZXBsb3ltZW50IGluZm9ybWF0aW9uLgorCSAqICAgICAgICAgICAKKwkgKiAgICAgICAgICAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQKKwkgKiAgICAgICAgICAgdG9vbCBtdXN0IGlnbm9yZSBhbnkgYW5ub3RhdGlvbnMgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQKKwkgKiAgICAgICAgICAgaW5mb3JtYXRpb24sIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQgaW4gdGhlIGNsYXNzIGZpbGVzCisJICogICAgICAgICAgIG9mIHRoZSBhcHBsaWNhdGlvbi4KKwkgKiAgICAgICAgICAgCisJICogICAgICAgICAgIElmIG1ldGFkYXRhLWNvbXBsZXRlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgc2V0IHRvCisJICogICAgICAgICAgICJmYWxzZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcworCSAqICAgICAgICAgICBmaWxlcyBvZiB0aGUgYXBwbGljYXRpb24gZm9yIGFubm90YXRpb25zLCBhcworCSAqICAgICAgICAgICBzcGVjaWZpZWQgYnkgdGhlIHNwZWNpZmljYXRpb25zLgorCSAqICAgICAgICAgICAKKwkgKiAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQorCSAqICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldE1ldGFkYXRhQ29tcGxldGUoKQorCSAqIEBzZWUgI3Vuc2V0TWV0YWRhdGFDb21wbGV0ZSgpCisJICogQHNlZSAjc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfTWV0YWRhdGFDb21wbGV0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNNZXRhZGF0YUNvbXBsZXRlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldE1ldGFkYXRhQ29tcGxldGUoKQorCSAqIEBzZWUgI3Vuc2V0TWV0YWRhdGFDb21wbGV0ZSgpCisJICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uI2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0TWV0YWRhdGFDb21wbGV0ZSgpCisJICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKKwkgKiBAc2VlICNzZXRNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldE1ldGFkYXRhQ29tcGxldGUoKQorCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCisJICogQHNlZSAjc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU2V0TWV0YWRhdGFDb21wbGV0ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZQorCSAqIEBzZWUgI2lzU2V0VmVyc2lvbigpCisJICogQHNlZSAjdW5zZXRWZXJzaW9uKCkKKwkgKiBAc2VlICNzZXRWZXJzaW9uKFdlYkFwcFZlcnNpb25UeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfVmVyc2lvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCVdlYkFwcFZlcnNpb25UeXBlIGdldFZlcnNpb24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZQorCSAqIEBzZWUgI2lzU2V0VmVyc2lvbigpCisJICogQHNlZSAjdW5zZXRWZXJzaW9uKCkKKwkgKiBAc2VlICNnZXRWZXJzaW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRWZXJzaW9uKFdlYkFwcFZlcnNpb25UeXBlIHZhbHVlKTsKKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1NldFZlcnNpb24oKQorCSAqIEBzZWUgI2dldFZlcnNpb24oKQorCSAqIEBzZWUgI3NldFZlcnNpb24oV2ViQXBwVmVyc2lvblR5cGUpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRWZXJzaW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24jZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCisJICogQHNlZSAjZ2V0VmVyc2lvbigpCisJICogQHNlZSAjc2V0VmVyc2lvbihXZWJBcHBWZXJzaW9uVHlwZSkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NldFZlcnNpb24oKTsKKworfSAvLyBXZWJBcHAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9JV2ViRnJhZ21lbnRSZXNvdXJjZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvSVdlYkZyYWdtZW50UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmM4MDBlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvSVdlYkZyYWdtZW50UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitwdWJsaWMgaW50ZXJmYWNlIElXZWJGcmFnbWVudFJlc291cmNlIHsKKworCS8qKgorCSAqIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgRUxpc3QuCisJICovCisJcHVibGljIGFic3RyYWN0IEVPYmplY3QgZ2V0Um9vdE9iamVjdCgpOworCisJLyoqCisJICogUmV0dXJuIHRoZSB3ZWIgZnJhZ21lbnQgcm9vdAorCSAqLworCXB1YmxpYyBhYnN0cmFjdCBXZWJGcmFnbWVudCBnZXRXZWJGcmFnbWVudCgpOworCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvSVdlYlJlc291cmNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9JV2ViUmVzb3VyY2UuamF2YQppbmRleCA2MDEzZDQ0Li40MTVjODkxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9JV2ViUmVzb3VyY2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9JV2ViUmVzb3VyY2UuamF2YQpAQCAtMSwzICsxLDEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTG9jYWxlRW5jb2RpbmdNYXBwaW5nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Mb2NhbGVFbmNvZGluZ01hcHBpbmcuamF2YQppbmRleCAyMjRiMzJmLi5hODdjZjU4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Mb2NhbGVFbmNvZGluZ01hcHBpbmcuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Mb2NhbGVFbmNvZGluZ01hcHBpbmcuamF2YQpAQCAtMjAsMTEgKzIwLDEyIEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nIGNvbnRhaW5zIGxvY2FsZSBuYW1lIGFuZAotICogCWVuY29kaW5nIG5hbWUuIFRoZSBsb2NhbGUgbmFtZSBtdXN0IGJlIGVpdGhlciAiTGFuZ3VhZ2UtY29kZSIsCi0gKiAJc3VjaCBhcyAiamEiLCBkZWZpbmVkIGJ5IElTTy02Mzkgb3IgIkxhbmd1YWdlLWNvZGVfQ291bnRyeS1jb2RlIiwKLSAqIAlzdWNoIGFzICJqYV9KUCIuICAiQ291bnRyeSBjb2RlIiBpcyBkZWZpbmVkIGJ5IElTTy0zMTY2LgotICogCisgKiAgICAgICAgIFRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZyBjb250YWlucyBsb2NhbGUgbmFtZSBhbmQKKyAqICAgICAgICAgZW5jb2RpbmcgbmFtZS4gVGhlIGxvY2FsZSBuYW1lIG11c3QgYmUgZWl0aGVyICJMYW5ndWFnZS1jb2RlIiwKKyAqICAgICAgICAgc3VjaCBhcyAiamEiLCBkZWZpbmVkIGJ5IElTTy02Mzkgb3IgIkxhbmd1YWdlLWNvZGVfQ291bnRyeS1jb2RlIiwKKyAqICAgICAgICAgc3VjaCBhcyAiamFfSlAiLiAgIkNvdW50cnkgY29kZSIgaXMgZGVmaW5lZCBieSBJU08tMzE2Ni4KKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiAyLjUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0xvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0xvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QuamF2YQppbmRleCBmNTcyNGVlLi5lZDlkNGRlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdC5qYXZhCkBAIC0yMiw5ICsyMiwxMCBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IGNvbnRhaW5zIG9uZSBvciBtb3JlCi0gKiAJbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcocykuCi0gKiAKKyAqICAgICAgICAgVGhlIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QgY29udGFpbnMgb25lIG9yIG1vcmUKKyAqICAgICAgICAgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmcocykuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBXZWIgMi41CiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC01NCw3ICs1NSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKTsKKwlMaXN0PExvY2FsZUVuY29kaW5nTWFwcGluZz4gZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTG9naW5Db25maWcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL0xvZ2luQ29uZmlnLmphdmEKaW5kZXggY2M5YThiYS4uYjAyN2I3MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTG9naW5Db25maWcuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Mb2dpbkNvbmZpZy5qYXZhCkBAIC0yMCwxMyArMjAsMTQgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgbG9naW4tY29uZmlnVHlwZSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYXV0aGVudGljYXRpb24KLSAqIAltZXRob2QgdGhhdCBzaG91bGQgYmUgdXNlZCwgdGhlIHJlYWxtIG5hbWUgdGhhdCBzaG91bGQgYmUKLSAqIAl1c2VkIGZvciB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgdGhlIGF0dHJpYnV0ZXMgdGhhdCBhcmUKLSAqIAluZWVkZWQgYnkgdGhlIGZvcm0gbG9naW4gbWVjaGFuaXNtLgotICogCi0gKiAJVXNlZCBpbjogd2ViLWFwcAotICogCisgKiAgICAgICAgIFRoZSBsb2dpbi1jb25maWdUeXBlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBhdXRoZW50aWNhdGlvbgorICogICAgICAgICBtZXRob2QgdGhhdCBzaG91bGQgYmUgdXNlZCwgdGhlIHJlYWxtIG5hbWUgdGhhdCBzaG91bGQgYmUKKyAqICAgICAgICAgdXNlZCBmb3IgdGhpcyBhcHBsaWNhdGlvbiwgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoYXQgYXJlCisgKiAgICAgICAgIG5lZWRlZCBieSB0aGUgZm9ybSBsb2dpbiBtZWNoYW5pc20uCisgKiAgICAgICAgIAorICogICAgICAgICBVc2VkIGluOiB3ZWItYXBwCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBXZWIgMi41CiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC03NywxMCArNzgsMTEgQEAKIAkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KIAkgKiAKIAkgKiAKLQkgKiAJICAgIFRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvCi0JICogCSAgICB1c2UgaW4gSFRUUCBCYXNpYyBhdXRob3JpemF0aW9uLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSByZWFsbSBuYW1lIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSByZWFsbSBuYW1lIHRvCisJICogICAgICAgICAgICAgdXNlIGluIEhUVFAgQmFzaWMgYXV0aG9yaXphdGlvbi4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBXZWIgMi41CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFsbSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRSZWFsbU5hbWUoU3RyaW5nKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTWltZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL01pbWVNYXBwaW5nLmphdmEKaW5kZXggNDA0YmM1Ny4uZDc0N2E0MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTWltZU1hcHBpbmcuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9NaW1lTWFwcGluZy5qYXZhCkBAIC0yMCwxMSArMjAsMTIgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgbWltZS1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgotICogCWFuZCBhIG1pbWUgdHlwZS4KLSAqIAotICogCVVzZWQgaW46IHdlYi1hcHAKLSAqIAorICogICAgICAgICBUaGUgbWltZS1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGFuIGV4dGVuc2lvbgorICogICAgICAgICBhbmQgYSBtaW1lIHR5cGUuCisgKiAgICAgICAgIAorICogICAgICAgICBVc2VkIGluOiB3ZWItYXBwCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBXZWIgMi41CiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9NdWx0aXBhcnRDb25maWdUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9NdWx0aXBhcnRDb25maWdUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkMWNmZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL011bHRpcGFydENvbmZpZ1R5cGUuamF2YQpAQCAtMCwwICsxLDIyNiBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkOiBNdWx0aXBhcnRDb25maWdUeXBlLmphdmEsdiAxLjIgMjAxMC8wMS8xNSAxNDozMjowNiBjYW5kZXJzb24gRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TXVsdGlwYXJ0IENvbmZpZyBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlCisgKiAgICAgICAgIGhhbmRsaW5nIG9mIG11bHRpcGFydC9mb3JtLWRhdGEgcmVxdWVzdHMuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgMy4wCisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NdWx0aXBhcnRDb25maWdUeXBlI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTXVsdGlwYXJ0Q29uZmlnVHlwZSNnZXRNYXhGaWxlU2l6ZSA8ZW0+TWF4IEZpbGUgU2l6ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTXVsdGlwYXJ0Q29uZmlnVHlwZSNnZXRNYXhSZXF1ZXN0U2l6ZSA8ZW0+TWF4IFJlcXVlc3QgU2l6ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTXVsdGlwYXJ0Q29uZmlnVHlwZSNnZXRGaWxlU2l6ZVRocmVzaG9sZCA8ZW0+RmlsZSBTaXplIFRocmVzaG9sZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRNdWx0aXBhcnRDb25maWdUeXBlKCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIE11bHRpcGFydENvbmZpZ1R5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgZGlyZWN0b3J5IGxvY2F0aW9uIHdoZXJlIHVwbG9hZGVkIGZpbGVzIHdpbGwgYmUgc3RvcmVkCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TG9jYXRpb24oU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRNdWx0aXBhcnRDb25maWdUeXBlX0xvY2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldExvY2F0aW9uKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NdWx0aXBhcnRDb25maWdUeXBlI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWF4IEZpbGUgU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWF4IEZpbGUgU2l6ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgbWF4aW11bSBzaXplIGxpbWl0IG9mIHVwbG9hZGVkIGZpbGVzCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXggRmlsZSBTaXplPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldE1heEZpbGVTaXplKCkKKwkgKiBAc2VlICN1bnNldE1heEZpbGVTaXplKCkKKwkgKiBAc2VlICNzZXRNYXhGaWxlU2l6ZShsb25nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRNdWx0aXBhcnRDb25maWdUeXBlX01heEZpbGVTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJbG9uZyBnZXRNYXhGaWxlU2l6ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTXVsdGlwYXJ0Q29uZmlnVHlwZSNnZXRNYXhGaWxlU2l6ZSA8ZW0+TWF4IEZpbGUgU2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWF4IEZpbGUgU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRNYXhGaWxlU2l6ZSgpCisJICogQHNlZSAjdW5zZXRNYXhGaWxlU2l6ZSgpCisJICogQHNlZSAjZ2V0TWF4RmlsZVNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1heEZpbGVTaXplKGxvbmcgdmFsdWUpOworCisJLyoqCisJICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NdWx0aXBhcnRDb25maWdUeXBlI2dldE1heEZpbGVTaXplIDxlbT5NYXggRmlsZSBTaXplPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1NldE1heEZpbGVTaXplKCkKKwkgKiBAc2VlICNnZXRNYXhGaWxlU2l6ZSgpCisJICogQHNlZSAjc2V0TWF4RmlsZVNpemUobG9uZykKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCB1bnNldE1heEZpbGVTaXplKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk11bHRpcGFydENvbmZpZ1R5cGUjZ2V0TWF4RmlsZVNpemUgPGVtPk1heCBGaWxlIFNpemU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1heCBGaWxlIFNpemU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KKwkgKiBAc2VlICN1bnNldE1heEZpbGVTaXplKCkKKwkgKiBAc2VlICNnZXRNYXhGaWxlU2l6ZSgpCisJICogQHNlZSAjc2V0TWF4RmlsZVNpemUobG9uZykKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NldE1heEZpbGVTaXplKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXggUmVxdWVzdCBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXggUmVxdWVzdCBTaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgIFRoZSBtYXhpbXVtIHNpemUgbGltaXQgb2YgbXVsdGlwYXJ0L2Zvcm0tZGF0YSByZXF1ZXN0cworCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWF4IFJlcXVlc3QgU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRNYXhSZXF1ZXN0U2l6ZSgpCisJICogQHNlZSAjdW5zZXRNYXhSZXF1ZXN0U2l6ZSgpCisJICogQHNlZSAjc2V0TWF4UmVxdWVzdFNpemUobG9uZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZV9NYXhSZXF1ZXN0U2l6ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWxvbmcgZ2V0TWF4UmVxdWVzdFNpemUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk11bHRpcGFydENvbmZpZ1R5cGUjZ2V0TWF4UmVxdWVzdFNpemUgPGVtPk1heCBSZXF1ZXN0IFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1heCBSZXF1ZXN0IFNpemU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0TWF4UmVxdWVzdFNpemUoKQorCSAqIEBzZWUgI3Vuc2V0TWF4UmVxdWVzdFNpemUoKQorCSAqIEBzZWUgI2dldE1heFJlcXVlc3RTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXhSZXF1ZXN0U2l6ZShsb25nIHZhbHVlKTsKKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTXVsdGlwYXJ0Q29uZmlnVHlwZSNnZXRNYXhSZXF1ZXN0U2l6ZSA8ZW0+TWF4IFJlcXVlc3QgU2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTZXRNYXhSZXF1ZXN0U2l6ZSgpCisJICogQHNlZSAjZ2V0TWF4UmVxdWVzdFNpemUoKQorCSAqIEBzZWUgI3NldE1heFJlcXVlc3RTaXplKGxvbmcpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRNYXhSZXF1ZXN0U2l6ZSgpOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NdWx0aXBhcnRDb25maWdUeXBlI2dldE1heFJlcXVlc3RTaXplIDxlbT5NYXggUmVxdWVzdCBTaXplPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXggUmVxdWVzdCBTaXplPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogQHNlZSAjdW5zZXRNYXhSZXF1ZXN0U2l6ZSgpCisJICogQHNlZSAjZ2V0TWF4UmVxdWVzdFNpemUoKQorCSAqIEBzZWUgI3NldE1heFJlcXVlc3RTaXplKGxvbmcpCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNTZXRNYXhSZXF1ZXN0U2l6ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmlsZSBTaXplIFRocmVzaG9sZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmlsZSBTaXplIFRocmVzaG9sZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgc2l6ZSB0aHJlc2hvbGQgYWZ0ZXIgd2hpY2ggYW4gdXBsb2FkZWQgZmlsZSB3aWxsIGJlCisJICogICAgICAgICAgICAgd3JpdHRlbiB0byBkaXNrCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWxlIFNpemUgVGhyZXNob2xkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRGaWxlU2l6ZVRocmVzaG9sZChCaWdJbnRlZ2VyKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRNdWx0aXBhcnRDb25maWdUeXBlX0ZpbGVTaXplVGhyZXNob2xkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQmlnSW50ZWdlciBnZXRGaWxlU2l6ZVRocmVzaG9sZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTXVsdGlwYXJ0Q29uZmlnVHlwZSNnZXRGaWxlU2l6ZVRocmVzaG9sZCA8ZW0+RmlsZSBTaXplIFRocmVzaG9sZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmlsZSBTaXplIFRocmVzaG9sZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0RmlsZVNpemVUaHJlc2hvbGQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEZpbGVTaXplVGhyZXNob2xkKEJpZ0ludGVnZXIgdmFsdWUpOworCit9IC8vIE11bHRpcGFydENvbmZpZ1R5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL051bGxDaGFyVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTnVsbENoYXJUeXBlLmphdmEKaW5kZXggNDk2OTg3YS4uZDdjN2FhNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTnVsbENoYXJUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvTnVsbENoYXJUeXBlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yNCw3ICsyNCwxNyBAQAogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldE51bGxDaGFyVHlwZSgpCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQ2hhclR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgeworcHVibGljIGVudW0gTnVsbENoYXJUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgoreworCS8qKgorCSAqIFRoZSAnPGVtPjxiPjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNfCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJX19MSVRFUkFMKDAsICJfIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTQwLDE2ICs1MCw2IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgXyA9IDA7CiAKIAkvKioKLQkgKiBUaGUgJzxlbT48Yj48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjXwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTnVsbENoYXJUeXBlIF9fTElURVJBTCA9IG5ldyBOdWxsQ2hhclR5cGUoXywgIl8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCiAJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk51bGwgQ2hhciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNjYsNyArNjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxOdWxsQ2hhclR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TnVsbCBDaGFyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCkBAIC0xMTAsMTcgKzExMCw3NyBAQAogCQlzd2l0Y2ggKHZhbHVlKSB7CiAJCQljYXNlIF86IHJldHVybiBfX0xJVEVSQUw7CiAJCX0KLQkJcmV0dXJuIG51bGw7CQorCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCiAJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwogCXByaXZhdGUgTnVsbENoYXJUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lLCBsaXRlcmFsKTsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwogCX0KIAotfSAvL051bGxDaGFyVHlwZQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9PcmRlcmluZ09yZGVyaW5nVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvT3JkZXJpbmdPcmRlcmluZ1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTIxYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvT3JkZXJpbmdPcmRlcmluZ1R5cGUuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQ6IE9yZGVyaW5nT3JkZXJpbmdUeXBlLmphdmEsdiAxLjEgMjAwOS8xMC8xNSAxODo1MjowMyBjYW5kZXJzb24gRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3JkZXJpbmcgT3JkZXJpbmcgVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKyAqIAorICogCisgKiAgICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyBhIHNlcXVlbmNlIG9mICJuYW1lIiBlbGVtZW50cywgZWFjaCBvZgorICogICAgICAgICB3aGljaAorICogICAgICAgICByZWZlcnMgdG8gYW4gYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiByZXNvdXJjZSBieSB0aGUgIm5hbWUiCisgKiAgICAgICAgIGRlY2xhcmVkIG9uIGl0cyB3ZWIueG1sIGZyYWdtZW50LiAgVGhpcyBlbGVtZW50IGNhbiBhbHNvIGNvbnRhaW4KKyAqICAgICAgICAgYSBzaW5nbGUgIm90aGVycyIgZWxlbWVudCB3aGljaCBzcGVjaWZpZXMgdGhhdCB0aGlzIGRvY3VtZW50CisgKiAgICAgICAgIGNvbWVzCisgKiAgICAgICAgIGJlZm9yZSBvciBhZnRlciBvdGhlciBkb2N1bWVudHMgd2l0aGluIHRoZSBhcHBsaWNhdGlvbi4KKyAqICAgICAgICAgU2VlIHNlY3Rpb24gOC4yLjIgb2YgdGhlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgMy4wCisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5PcmRlcmluZ09yZGVyaW5nVHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5PcmRlcmluZ09yZGVyaW5nVHlwZSNnZXRPdGhlcnMgPGVtPk90aGVyczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRPcmRlcmluZ09yZGVyaW5nVHlwZSgpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBPcmRlcmluZ09yZGVyaW5nVHlwZSBleHRlbmRzIEphdmFFRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldE9yZGVyaW5nT3JkZXJpbmdUeXBlX05hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PFN0cmluZz4gZ2V0TmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3RoZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PdGhlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3RoZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRPdGhlcnMoT3JkZXJpbmdPdGhlcnNUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRPcmRlcmluZ09yZGVyaW5nVHlwZV9PdGhlcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlPcmRlcmluZ090aGVyc1R5cGUgZ2V0T3RoZXJzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5PcmRlcmluZ09yZGVyaW5nVHlwZSNnZXRPdGhlcnMgPGVtPk90aGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3RoZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRPdGhlcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE90aGVycyhPcmRlcmluZ090aGVyc1R5cGUgdmFsdWUpOworCit9IC8vIE9yZGVyaW5nT3JkZXJpbmdUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9PcmRlcmluZ090aGVyc1R5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL09yZGVyaW5nT3RoZXJzVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4M2M1MWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9PcmRlcmluZ090aGVyc1R5cGUuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQ6IE9yZGVyaW5nT3RoZXJzVHlwZS5qYXZhLHYgMS4xIDIwMDkvMTAvMTUgMTg6NTI6MDMgY2FuZGVyc29uIEV4cCAkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcmRlcmluZyBPdGhlcnMgVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKyAqIAorICogCisgKiAgICAgICAgIFRoaXMgZWxlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGUgb3JkZXJpbmcgc3ViLWVsZW1lbnQgaW4gd2hpY2gKKyAqICAgICAgICAgaXQgd2FzIHBsYWNlZCBzaG91bGQgdGFrZSBzcGVjaWFsIGFjdGlvbiByZWdhcmRpbmcgdGhlIG9yZGVyaW5nCisgKiAgICAgICAgIG9mIHRoaXMgYXBwbGljYXRpb24gcmVzb3VyY2UgcmVsYXRpdmUgdG8gb3RoZXIgYXBwbGljYXRpb24KKyAqICAgICAgICAgY29uZmlndXJhdGlvbiByZXNvdXJjZXMuCisgKiAgICAgICAgIFNlZSBzZWN0aW9uIDguMi4yIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgV2ViIDMuMAorICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdPdGhlcnNUeXBlI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRPcmRlcmluZ090aGVyc1R5cGUoKQorICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0CisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3JkZXJpbmdPdGhlcnNUeXBlIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldElkKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0T3JkZXJpbmdPdGhlcnNUeXBlX0lkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5PcmRlcmluZ090aGVyc1R5cGUjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gT3JkZXJpbmdPdGhlcnNUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9PcmRlcmluZ1R5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL09yZGVyaW5nVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZWRkOTEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9PcmRlcmluZ1R5cGUuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQ6IE9yZGVyaW5nVHlwZS5qYXZhLHYgMS4xIDIwMDkvMTAvMTUgMTg6NTI6MDMgY2FuZGVyc29uIEV4cCAkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcmRlcmluZyBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAKKyAqICAgICAgICAgUGxlYXNlIHNlZSBzZWN0aW9uIDguMi4yIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgV2ViIDMuMAorICogICAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdUeXBlI2dldEFmdGVyIDxlbT5BZnRlcjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdUeXBlI2dldEJlZm9yZSA8ZW0+QmVmb3JlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldE9yZGVyaW5nVHlwZSgpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBPcmRlcmluZ1R5cGUgZXh0ZW5kcyBKYXZhRUVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFmdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QWZ0ZXIoT3JkZXJpbmdPcmRlcmluZ1R5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldE9yZGVyaW5nVHlwZV9BZnRlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCU9yZGVyaW5nT3JkZXJpbmdUeXBlIGdldEFmdGVyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5PcmRlcmluZ1R5cGUjZ2V0QWZ0ZXIgPGVtPkFmdGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QWZ0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFmdGVyKE9yZGVyaW5nT3JkZXJpbmdUeXBlIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJlZm9yZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmVmb3JlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJlZm9yZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QmVmb3JlKE9yZGVyaW5nT3JkZXJpbmdUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRPcmRlcmluZ1R5cGVfQmVmb3JlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJT3JkZXJpbmdPcmRlcmluZ1R5cGUgZ2V0QmVmb3JlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5PcmRlcmluZ1R5cGUjZ2V0QmVmb3JlIDxlbT5CZWZvcmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJlZm9yZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0QmVmb3JlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCZWZvcmUoT3JkZXJpbmdPcmRlcmluZ1R5cGUgdmFsdWUpOworCit9IC8vIE9yZGVyaW5nVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvU2VjdXJpdHlDb25zdHJhaW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZWN1cml0eUNvbnN0cmFpbnQuamF2YQppbmRleCBiNDNiMTA1Li5lMWM3M2U4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZWN1cml0eUNvbnN0cmFpbnQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZWN1cml0eUNvbnN0cmFpbnQuamF2YQpAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKIAogLyoqCkBAIC0yMiwxMiArMjMsMTMgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgc2VjdXJpdHktY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBhc3NvY2lhdGUKLSAqIAlzZWN1cml0eSBjb25zdHJhaW50cyB3aXRoIG9uZSBvciBtb3JlIHdlYiByZXNvdXJjZQotICogCWNvbGxlY3Rpb25zCi0gKiAKLSAqIAlVc2VkIGluOiB3ZWItYXBwCi0gKiAKKyAqICAgICAgICAgVGhlIHNlY3VyaXR5LWNvbnN0cmFpbnRUeXBlIGlzIHVzZWQgdG8gYXNzb2NpYXRlCisgKiAgICAgICAgIHNlY3VyaXR5IGNvbnN0cmFpbnRzIHdpdGggb25lIG9yIG1vcmUgd2ViIHJlc291cmNlCisgKiAgICAgICAgIGNvbGxlY3Rpb25zCisgKiAgICAgICAgIAorICogICAgICAgICBVc2VkIGluOiB3ZWItYXBwCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBXZWIgMi41CiAgKiAgICAgICAKICAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICAqCkBAIC02MCw3ICs2Miw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZXMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERpc3BsYXlOYW1lcygpOworCUxpc3Q8RGlzcGxheU5hbWU+IGdldERpc3BsYXlOYW1lcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2ViIFJlc291cmNlIENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTc1LDcgKzc3LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKTsKKwlMaXN0PFdlYlJlc291cmNlQ29sbGVjdGlvbj4gZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0aCBDb25zdHJhaW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZXJ2bGV0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZXJ2bGV0LmphdmEKaW5kZXggZDMzNTNlOS4uYjYxMTkxZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvU2VydmxldC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1NlcnZsZXQuamF2YQpAQCAtMTIsOCArMTIsMTMgQEAKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlUmVmOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yMywxNCArMjgsMTUgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgc2VydmxldFR5cGUgaXMgdXNlZCB0byBkZWNsYXJlIGEgc2VydmxldC4KLSAqIAlJdCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhCi0gKiAJc2VydmxldC4gSWYgYSBqc3AtZmlsZSBpcyBzcGVjaWZpZWQgYW5kIHRoZSBsb2FkLW9uLXN0YXJ0dXAKLSAqIAllbGVtZW50IGlzIHByZXNlbnQsIHRoZW4gdGhlIEpTUCBzaG91bGQgYmUgcHJlY29tcGlsZWQgYW5kCi0gKiAJbG9hZGVkLgotICogCi0gKiAJVXNlZCBpbjogd2ViLWFwcAotICogCisgKiAgICAgICAgIFRoZSBzZXJ2bGV0VHlwZSBpcyB1c2VkIHRvIGRlY2xhcmUgYSBzZXJ2bGV0LgorICogICAgICAgICBJdCBjb250YWlucyB0aGUgZGVjbGFyYXRpdmUgZGF0YSBvZiBhCisgKiAgICAgICAgIHNlcnZsZXQuIElmIGEganNwLWZpbGUgaXMgc3BlY2lmaWVkIGFuZCB0aGUgbG9hZC1vbi1zdGFydHVwCisgKiAgICAgICAgIGVsZW1lbnQgaXMgcHJlc2VudCwgdGhlbiB0aGUgSlNQIHNob3VsZCBiZSBwcmVjb21waWxlZCBhbmQKKyAqICAgICAgICAgbG9hZGVkLgorICogICAgICAgICAKKyAqICAgICAgICAgVXNlZCBpbjogd2ViLWFwcAorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNDUsOCArNTEsMTEgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldEpzcEZpbGUgPGVtPkpzcCBGaWxlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldExvYWRPblN0YXJ0dXAgPGVtPkxvYWQgT24gU3RhcnR1cDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNpc0VuYWJsZWQgPGVtPkVuYWJsZWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjaXNBc3luY1N1cHBvcnRlZCA8ZW0+QXN5bmMgU3VwcG9ydGVkPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldFJ1bkFzIDxlbT5SdW4gQXM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0U2VjdXJpdHlSb2xlUmVmcyA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2dldE11bHRpcGFydENvbmZpZyA8ZW0+TXVsdGlwYXJ0IENvbmZpZzwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgogICogPC91bD4KICAqIDwvcD4KQEAgLTY5LDcgKzc4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VydmxldF9EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC04NCw3ICs5Myw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRfRGlzcGxheU5hbWVzKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREaXNwbGF5TmFtZXMoKTsKKwlMaXN0PERpc3BsYXlOYW1lPiBnZXREaXNwbGF5TmFtZXMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTk5LDcgKzEwOCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRfSWNvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldEljb25zKCk7CisJTGlzdDxJY29uPiBnZXRJY29ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VydmxldCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMzMsMTAgKzE0MiwxMSBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgICBUaGUgc2VydmxldC1jbGFzcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBmdWxseQotCSAqIAkgICAgICBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgc2VydmxldC4KLQkgKiAKLQkgKiAJICAgIAorCSAqICAgICAgICAgICAgICAgVGhlIHNlcnZsZXQtY2xhc3MgZWxlbWVudCBjb250YWlucyB0aGUgZnVsbHkKKwkgKiAgICAgICAgICAgICAgIHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBzZXJ2bGV0LgorCSAqICAgICAgICAgICAgICAgCisJICogICAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBXZWIgMi41CisJICogICAgICAgICAgICAgCiAJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFNlcnZsZXRDbGFzcyhTdHJpbmcpCkBAIC0xOTMsNyArMjAzLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VydmxldF9Jbml0UGFyYW1zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRJbml0UGFyYW1zKCk7CisJTGlzdDxQYXJhbVZhbHVlPiBnZXRJbml0UGFyYW1zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2FkIE9uIFN0YXJ0dXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTIwMiwyNCArMjEyLDI1IEBACiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCiAJICogCi0JICogCSAgICBUaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcwotCSAqIAkgICAgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkIChpbnN0YW50aWF0ZWQgYW5kIGhhdmUKLQkgKiAJICAgIGl0cyBpbml0KCkgY2FsbGVkKSBvbiB0aGUgc3RhcnR1cCBvZiB0aGUgd2ViCi0JICogCSAgICBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mIHRoZXNlCi0JICogCSAgICBlbGVtZW50IG11c3QgYmUgYW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBvcmRlciBpbgotCSAqIAkgICAgd2hpY2ggdGhlIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZC4gSWYgdGhlIHZhbHVlCi0JICogCSAgICBpcyBhIG5lZ2F0aXZlIGludGVnZXIsIG9yIHRoZSBlbGVtZW50IGlzIG5vdAotCSAqIAkgICAgcHJlc2VudCwgdGhlIGNvbnRhaW5lciBpcyBmcmVlIHRvIGxvYWQgdGhlIHNlcnZsZXQKLQkgKiAJICAgIHdoZW5ldmVyIGl0IGNob29zZXMuIElmIHRoZSB2YWx1ZSBpcyBhIHBvc2l0aXZlCi0JICogCSAgICBpbnRlZ2VyIG9yIDAsIHRoZSBjb250YWluZXIgbXVzdCBsb2FkIGFuZAotCSAqIAkgICAgaW5pdGlhbGl6ZSB0aGUgc2VydmxldCBhcyB0aGUgYXBwbGljYXRpb24gaXMKLQkgKiAJICAgIGRlcGxveWVkLiBUaGUgY29udGFpbmVyIG11c3QgZ3VhcmFudGVlIHRoYXQKLQkgKiAJICAgIHNlcnZsZXRzIG1hcmtlZCB3aXRoIGxvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQKLQkgKiAJICAgIGJlZm9yZSBzZXJ2bGV0cyBtYXJrZWQgd2l0aCBoaWdoZXIgaW50ZWdlcnMuIFRoZQotCSAqIAkgICAgY29udGFpbmVyIG1heSBjaG9vc2UgdGhlIG9yZGVyIG9mIGxvYWRpbmcgb2YKLQkgKiAJICAgIHNlcnZsZXRzIHdpdGggdGhlIHNhbWUgbG9hZC1vbi1zdGFydC11cCB2YWx1ZS4KLQkgKiAKLQkgKiAJICAKKwkgKiAgICAgICAgICAgICBUaGUgbG9hZC1vbi1zdGFydHVwIGVsZW1lbnQgaW5kaWNhdGVzIHRoYXQgdGhpcworCSAqICAgICAgICAgICAgIHNlcnZsZXQgc2hvdWxkIGJlIGxvYWRlZCAoaW5zdGFudGlhdGVkIGFuZCBoYXZlCisJICogICAgICAgICAgICAgaXRzIGluaXQoKSBjYWxsZWQpIG9uIHRoZSBzdGFydHVwIG9mIHRoZSB3ZWIKKwkgKiAgICAgICAgICAgICBhcHBsaWNhdGlvbi4gVGhlIG9wdGlvbmFsIGNvbnRlbnRzIG9mIHRoZXNlCisJICogICAgICAgICAgICAgZWxlbWVudCBtdXN0IGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgb3JkZXIgaW4KKwkgKiAgICAgICAgICAgICB3aGljaCB0aGUgc2VydmxldCBzaG91bGQgYmUgbG9hZGVkLiBJZiB0aGUgdmFsdWUKKwkgKiAgICAgICAgICAgICBpcyBhIG5lZ2F0aXZlIGludGVnZXIsIG9yIHRoZSBlbGVtZW50IGlzIG5vdAorCSAqICAgICAgICAgICAgIHByZXNlbnQsIHRoZSBjb250YWluZXIgaXMgZnJlZSB0byBsb2FkIHRoZSBzZXJ2bGV0CisJICogICAgICAgICAgICAgd2hlbmV2ZXIgaXQgY2hvb3Nlcy4gSWYgdGhlIHZhbHVlIGlzIGEgcG9zaXRpdmUKKwkgKiAgICAgICAgICAgICBpbnRlZ2VyIG9yIDAsIHRoZSBjb250YWluZXIgbXVzdCBsb2FkIGFuZAorCSAqICAgICAgICAgICAgIGluaXRpYWxpemUgdGhlIHNlcnZsZXQgYXMgdGhlIGFwcGxpY2F0aW9uIGlzCisJICogICAgICAgICAgICAgZGVwbG95ZWQuIFRoZSBjb250YWluZXIgbXVzdCBndWFyYW50ZWUgdGhhdAorCSAqICAgICAgICAgICAgIHNlcnZsZXRzIG1hcmtlZCB3aXRoIGxvd2VyIGludGVnZXJzIGFyZSBsb2FkZWQKKwkgKiAgICAgICAgICAgICBiZWZvcmUgc2VydmxldHMgbWFya2VkIHdpdGggaGlnaGVyIGludGVnZXJzLiBUaGUKKwkgKiAgICAgICAgICAgICBjb250YWluZXIgbWF5IGNob29zZSB0aGUgb3JkZXIgb2YgbG9hZGluZyBvZgorCSAqICAgICAgICAgICAgIHNlcnZsZXRzIHdpdGggdGhlIHNhbWUgbG9hZC1vbi1zdGFydC11cCB2YWx1ZS4KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA1LCBXZWIgMi41CisJICogICAgICAgICAgIAogCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2FkIE9uIFN0YXJ0dXA8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldExvYWRPblN0YXJ0dXAoT2JqZWN0KQpAQCAtMjM5LDYgKzI1MCwxMTIgQEAKIAl2b2lkIHNldExvYWRPblN0YXJ0dXAoT2JqZWN0IHZhbHVlKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIFdlYiAzLjAKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVuYWJsZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2V0RW5hYmxlZCgpCisJICogQHNlZSAjdW5zZXRFbmFibGVkKCkKKwkgKiBAc2VlICNzZXRFbmFibGVkKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRfRW5hYmxlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNFbmFibGVkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2lzRW5hYmxlZCA8ZW0+RW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTZXRFbmFibGVkKCkKKwkgKiBAc2VlICN1bnNldEVuYWJsZWQoKQorCSAqIEBzZWUgI2lzRW5hYmxlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RW5hYmxlZChib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNpc0VuYWJsZWQgPGVtPkVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0RW5hYmxlZCgpCisJICogQHNlZSAjaXNFbmFibGVkKCkKKwkgKiBAc2VlICNzZXRFbmFibGVkKGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRFbmFibGVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjaXNFbmFibGVkIDxlbT5FbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbmFibGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogQHNlZSAjdW5zZXRFbmFibGVkKCkKKwkgKiBAc2VlICNpc0VuYWJsZWQoKQorCSAqIEBzZWUgI3NldEVuYWJsZWQoYm9vbGVhbikKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NldEVuYWJsZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzeW5jIFN1cHBvcnRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgV2ViIDMuMAorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXN5bmMgU3VwcG9ydGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldEFzeW5jU3VwcG9ydGVkKCkKKwkgKiBAc2VlICN1bnNldEFzeW5jU3VwcG9ydGVkKCkKKwkgKiBAc2VlICNzZXRBc3luY1N1cHBvcnRlZChib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXJ2bGV0X0FzeW5jU3VwcG9ydGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0FzeW5jU3VwcG9ydGVkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2lzQXN5bmNTdXBwb3J0ZWQgPGVtPkFzeW5jIFN1cHBvcnRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXN5bmMgU3VwcG9ydGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1NldEFzeW5jU3VwcG9ydGVkKCkKKwkgKiBAc2VlICN1bnNldEFzeW5jU3VwcG9ydGVkKCkKKwkgKiBAc2VlICNpc0FzeW5jU3VwcG9ydGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBc3luY1N1cHBvcnRlZChib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNpc0FzeW5jU3VwcG9ydGVkIDxlbT5Bc3luYyBTdXBwb3J0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2V0QXN5bmNTdXBwb3J0ZWQoKQorCSAqIEBzZWUgI2lzQXN5bmNTdXBwb3J0ZWQoKQorCSAqIEBzZWUgI3NldEFzeW5jU3VwcG9ydGVkKGJvb2xlYW4pCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgdW5zZXRBc3luY1N1cHBvcnRlZCgpOworCisJLyoqCisJICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2lzQXN5bmNTdXBwb3J0ZWQgPGVtPkFzeW5jIFN1cHBvcnRlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXN5bmMgU3VwcG9ydGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCisJICogQHNlZSAjdW5zZXRBc3luY1N1cHBvcnRlZCgpCisJICogQHNlZSAjaXNBc3luY1N1cHBvcnRlZCgpCisJICogQHNlZSAjc2V0QXN5bmNTdXBwb3J0ZWQoYm9vbGVhbikKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NldEFzeW5jU3VwcG9ydGVkKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SdW4gQXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDxwPgpAQCAtMjc2LDcgKzM5MywzMyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXJ2bGV0X1NlY3VyaXR5Um9sZVJlZnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFNlY3VyaXR5Um9sZVJlZnMoKTsKKwlMaXN0PFNlY3VyaXR5Um9sZVJlZj4gZ2V0U2VjdXJpdHlSb2xlUmVmcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVsdGlwYXJ0IENvbmZpZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgV2ViIDMuMAorCSAqICAgICAgICAgICAKKwkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGlwYXJ0IENvbmZpZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0TXVsdGlwYXJ0Q29uZmlnKE11bHRpcGFydENvbmZpZ1R5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFNlcnZsZXRfTXVsdGlwYXJ0Q29uZmlnKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTXVsdGlwYXJ0Q29uZmlnVHlwZSBnZXRNdWx0aXBhcnRDb25maWcoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0TXVsdGlwYXJ0Q29uZmlnIDxlbT5NdWx0aXBhcnQgQ29uZmlnPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBhcnQgQ29uZmlnPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRNdWx0aXBhcnRDb25maWcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE11bHRpcGFydENvbmZpZyhNdWx0aXBhcnRDb25maWdUeXBlIHZhbHVlKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZXJ2bGV0TWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvU2VydmxldE1hcHBpbmcuamF2YQppbmRleCAzMmJjNmFiLi4yNTEzNzJjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZXJ2bGV0TWFwcGluZy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1NlcnZsZXRNYXBwaW5nLmphdmEKQEAgLTEzLDYgKzEzLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yMiwxMSArMjMsMTIgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgc2VydmxldC1tYXBwaW5nVHlwZSBkZWZpbmVzIGEgbWFwcGluZyBiZXR3ZWVuIGEKLSAqIAlzZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuLgotICogCi0gKiAJVXNlZCBpbjogd2ViLWFwcAotICogCisgKiAgICAgICAgIFRoZSBzZXJ2bGV0LW1hcHBpbmdUeXBlIGRlZmluZXMgYSBtYXBwaW5nIGJldHdlZW4gYQorICogICAgICAgICBzZXJ2bGV0IGFuZCBhIHVybCBwYXR0ZXJuLiAKKyAqICAgICAgICAgCisgKiAgICAgICAgIFVzZWQgaW46IHdlYi1hcHAKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiAyLjUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTgyLDcgKzg0LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0U2VydmxldE1hcHBpbmdfVXJsUGF0dGVybnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldFVybFBhdHRlcm5zKCk7CisJTGlzdDxVcmxQYXR0ZXJuVHlwZT4gZ2V0VXJsUGF0dGVybnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZXNzaW9uQ29uZmlnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9TZXNzaW9uQ29uZmlnLmphdmEKaW5kZXggNWE0MGIxNy4uMDNkYzgxMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvU2Vzc2lvbkNvbmZpZy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1Nlc3Npb25Db25maWcuamF2YQpAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwogCiAvKioKQEAgLTIyLDExICsyMywxMiBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSBzZXNzaW9uLWNvbmZpZ1R5cGUgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzCi0gKiAJZm9yIHRoaXMgd2ViIGFwcGxpY2F0aW9uLgotICogCi0gKiAJVXNlZCBpbjogd2ViLWFwcAotICogCisgKiAgICAgICAgIFRoZSBzZXNzaW9uLWNvbmZpZ1R5cGUgZGVmaW5lcyB0aGUgc2Vzc2lvbiBwYXJhbWV0ZXJzCisgKiAgICAgICAgIGZvciB0aGlzIHdlYiBhcHBsaWNhdGlvbi4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFVzZWQgaW46IHdlYi1hcHAKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiAyLjUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTM0LDYgKzM2LDggQEAKICAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKICAqIDx1bD4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXNzaW9uQ29uZmlnI2dldFNlc3Npb25UaW1lb3V0IDxlbT5TZXNzaW9uIFRpbWVvdXQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWcjZ2V0Q29va2llQ29uZmlnIDxlbT5Db29raWUgQ29uZmlnPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXNzaW9uQ29uZmlnI2dldFRyYWNraW5nTW9kZSA8ZW0+VHJhY2tpbmcgTW9kZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZyNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgogICogPC91bD4KICAqIDwvcD4KQEAgLTUwLDE2ICs1NCwxNyBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIHNlc3Npb24tdGltZW91dCBlbGVtZW50IGRlZmluZXMgdGhlIGRlZmF1bHQKLQkgKiAJICAgIHNlc3Npb24gdGltZW91dCBpbnRlcnZhbCBmb3IgYWxsIHNlc3Npb25zIGNyZWF0ZWQKLQkgKiAJICAgIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgc3BlY2lmaWVkIHRpbWVvdXQKLQkgKiAJICAgIG11c3QgYmUgZXhwcmVzc2VkIGluIGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCi0JICogCSAgICBJZiB0aGUgdGltZW91dCBpcyAwIG9yIGxlc3MsIHRoZSBjb250YWluZXIgZW5zdXJlcwotCSAqIAkgICAgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHNlc3Npb25zIGlzIG5ldmVyIHRvIHRpbWUKLQkgKiAJICAgIG91dC4gSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb250YWluZXIKLQkgKiAJICAgIG11c3Qgc2V0IGl0cyBkZWZhdWx0IHRpbWVvdXQgcGVyaW9kLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSBzZXNzaW9uLXRpbWVvdXQgZWxlbWVudCBkZWZpbmVzIHRoZSBkZWZhdWx0CisJICogICAgICAgICAgICAgc2Vzc2lvbiB0aW1lb3V0IGludGVydmFsIGZvciBhbGwgc2Vzc2lvbnMgY3JlYXRlZAorCSAqICAgICAgICAgICAgIGluIHRoaXMgd2ViIGFwcGxpY2F0aW9uLiBUaGUgc3BlY2lmaWVkIHRpbWVvdXQKKwkgKiAgICAgICAgICAgICBtdXN0IGJlIGV4cHJlc3NlZCBpbiBhIHdob2xlIG51bWJlciBvZiBtaW51dGVzLgorCSAqICAgICAgICAgICAgIElmIHRoZSB0aW1lb3V0IGlzIDAgb3IgbGVzcywgdGhlIGNvbnRhaW5lciBlbnN1cmVzCisJICogICAgICAgICAgICAgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHNlc3Npb25zIGlzIG5ldmVyIHRvIHRpbWUKKwkgKiAgICAgICAgICAgICBvdXQuIElmIHRoaXMgZWxlbWVudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgY29udGFpbmVyCisJICogICAgICAgICAgICAgbXVzdCBzZXQgaXRzIGRlZmF1bHQgdGltZW91dCBwZXJpb2QuCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2Vzc2lvbiBUaW1lb3V0PC9lbT4nIGF0dHJpYnV0ZS4KIAkgKiBAc2VlICNzZXRTZXNzaW9uVGltZW91dChCaWdJbnRlZ2VyKQpAQCAtNzksNiArODQsNTggQEAKIAl2b2lkIHNldFNlc3Npb25UaW1lb3V0KEJpZ0ludGVnZXIgdmFsdWUpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29va2llIENvbmZpZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICAgICAgVGhlIGNvb2tpZS1jb25maWcgZWxlbWVudCBkZWZpbmVzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZQorCSAqICAgICAgICAgICAgIHNlc3Npb24gdHJhY2tpbmcgY29va2llcyBjcmVhdGVkIGJ5IHRoaXMgd2ViIGFwcGxpY2F0aW9uLgorCSAqICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDYsIFdlYiAzLjAKKwkgKiAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvb2tpZSBDb25maWc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldENvb2tpZUNvbmZpZyhDb29raWVDb25maWdUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXNzaW9uQ29uZmlnX0Nvb2tpZUNvbmZpZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvb2tpZUNvbmZpZ1R5cGUgZ2V0Q29va2llQ29uZmlnKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXNzaW9uQ29uZmlnI2dldENvb2tpZUNvbmZpZyA8ZW0+Q29va2llIENvbmZpZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29va2llIENvbmZpZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0Q29va2llQ29uZmlnKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRDb29raWVDb25maWcoQ29va2llQ29uZmlnVHlwZSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFja2luZyBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhY2tpbmdNb2RlVHlwZX0uCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhY2tpbmdNb2RlVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICBUaGUgdHJhY2tpbmctbW9kZSBlbGVtZW50IGRlZmluZXMgdGhlIHRyYWNraW5nIG1vZGVzCisJICogICAgICAgICAgICAgZm9yIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyB3ZWIgYXBwbGljYXRpb24KKwkgKiAgICAgICAgICAgICAKKwkgKiAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgMy4wCisJICogICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmFja2luZyBNb2RlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhY2tpbmdNb2RlVHlwZQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRTZXNzaW9uQ29uZmlnX1RyYWNraW5nTW9kZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8VHJhY2tpbmdNb2RlVHlwZT4gZ2V0VHJhY2tpbmdNb2RlKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPHA+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9UcmFja2luZ01vZGVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9UcmFja2luZ01vZGVUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlOTRkMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1RyYWNraW5nTW9kZVR5cGUuamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkOiBUcmFja2luZ01vZGVUeXBlLmphdmEsdiAxLjEgMjAwOS8xMC8xNSAxODo1MjowMyBjYW5kZXJzb24gRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlRyYWNraW5nIE1vZGUgVHlwZTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgICBUaGUgdHJhY2tpbmcgbW9kZXMgZm9yIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyB3ZWIKKyAqICAgICAgICAgYXBwbGljYXRpb24KKyAqICAgICAgICAgCisgKiAgICAgICAgIFVzZWQgaW46IHNlc3Npb24tY29uZmlnCisgKiAgICAgICAgIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgMy4wCisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRUcmFja2luZ01vZGVUeXBlKCkKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gVHJhY2tpbmdNb2RlVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNPT0tJRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDT09LSUVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDT09LSUUoMCwgIkNPT0tJRSIsICJDT09LSUUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VUkw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjVVJMX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJVVJMKDEsICJVUkwiLCAiVVJMIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+U1NMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NTTF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVNTTCgyLCAiU1NMIiwgIlNTTCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNPT0tJRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q09PS0lFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NPT0tJRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPT0tJRV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VUkw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlVSTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNVUkwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUkxfVkFMVUUgPSAxOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+U1NMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TU0w8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU1NMCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1NMX1ZBTFVFID0gMjsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFja2luZyBNb2RlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYWNraW5nTW9kZVR5cGVbXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgVHJhY2tpbmdNb2RlVHlwZVtdIHsKKwkJCUNPT0tJRSwKKwkJCVVSTCwKKwkJCVNTTCwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFja2luZyBNb2RlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxUcmFja2luZ01vZGVUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYWNraW5nIE1vZGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRyYWNraW5nTW9kZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlUcmFja2luZ01vZGVUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VHJhY2tpbmcgTW9kZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVHJhY2tpbmdNb2RlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVRyYWNraW5nTW9kZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRyYWNraW5nIE1vZGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRyYWNraW5nTW9kZVR5cGUgZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIENPT0tJRV9WQUxVRTogcmV0dXJuIENPT0tJRTsKKwkJCWNhc2UgVVJMX1ZBTFVFOiByZXR1cm4gVVJMOworCQkJY2FzZSBTU0xfVkFMVUU6IHJldHVybiBTU0w7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIFRyYWNraW5nTW9kZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vVHJhY2tpbmdNb2RlVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5qYXZhCmluZGV4IDYzMjE3MjAuLjcyYTI4NDMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yNCwyNyArMjQsNTYgQEAKICAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogICogCiAgKiAKLSAqIAlUaGUgdHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24KLSAqIAliZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHNob3VsZCBiZSBOT05FLCBJTlRFR1JBTCwgb3IKLSAqIAlDT05GSURFTlRJQUwuIE5PTkUgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24gZG9lcyBub3QKLSAqIAlyZXF1aXJlIGFueSB0cmFuc3BvcnQgZ3VhcmFudGVlcy4gQSB2YWx1ZSBvZiBJTlRFR1JBTCBtZWFucwotICogCXRoYXQgdGhlIGFwcGxpY2F0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIGRhdGEgc2VudCBiZXR3ZWVuIHRoZQotICogCWNsaWVudCBhbmQgc2VydmVyIGJlIHNlbnQgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGNhbid0IGJlCi0gKiAJY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24KLSAqIAlyZXF1aXJlcyB0aGF0IHRoZSBkYXRhIGJlIHRyYW5zbWl0dGVkIGluIGEgZmFzaGlvbiB0aGF0Ci0gKiAJcHJldmVudHMgb3RoZXIgZW50aXRpZXMgZnJvbSBvYnNlcnZpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZQotICogCXRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZSBJTlRFR1JBTCBvcgotICogCUNPTkZJREVOVElBTCBmbGFnIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIFNTTCBpcwotICogCXJlcXVpcmVkLgotICogCi0gKiAJVXNlZCBpbjogdXNlci1kYXRhLWNvbnN0cmFpbnQKLSAqIAorICogICAgICAgICBUaGUgdHJhbnNwb3J0LWd1YXJhbnRlZVR5cGUgc3BlY2lmaWVzIHRoYXQgdGhlIGNvbW11bmljYXRpb24KKyAqICAgICAgICAgYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBzaG91bGQgYmUgTk9ORSwgSU5URUdSQUwsIG9yCisgKiAgICAgICAgIENPTkZJREVOVElBTC4gTk9ORSBtZWFucyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdAorICogICAgICAgICByZXF1aXJlIGFueSB0cmFuc3BvcnQgZ3VhcmFudGVlcy4gQSB2YWx1ZSBvZiBJTlRFR1JBTCBtZWFucworICogICAgICAgICB0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGF0IHRoZSBkYXRhIHNlbnQgYmV0d2VlbiB0aGUKKyAqICAgICAgICAgY2xpZW50IGFuZCBzZXJ2ZXIgYmUgc2VudCBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgY2FuJ3QgYmUKKyAqICAgICAgICAgY2hhbmdlZCBpbiB0cmFuc2l0LiBDT05GSURFTlRJQUwgbWVhbnMgdGhhdCB0aGUgYXBwbGljYXRpb24KKyAqICAgICAgICAgcmVxdWlyZXMgdGhhdCB0aGUgZGF0YSBiZSB0cmFuc21pdHRlZCBpbiBhIGZhc2hpb24gdGhhdAorICogICAgICAgICBwcmV2ZW50cyBvdGhlciBlbnRpdGllcyBmcm9tIG9ic2VydmluZyB0aGUgY29udGVudHMgb2YgdGhlCisgKiAgICAgICAgIHRyYW5zbWlzc2lvbi4gSW4gbW9zdCBjYXNlcywgdGhlIHByZXNlbmNlIG9mIHRoZSBJTlRFR1JBTCBvcgorICogICAgICAgICBDT05GSURFTlRJQUwgZmxhZyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiBTU0wgaXMKKyAqICAgICAgICAgcmVxdWlyZWQuCisgKiAgICAgICAgIAorICogICAgICAgICBVc2VkIGluOiB1c2VyLWRhdGEtY29uc3RyYWludAorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKK3B1YmxpYyBlbnVtIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCit7CisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOT05FCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTk9ORV9MSVRFUkFMKDAsICJOT05FIiwgIk5PTkUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyoqCisJICogVGhlICc8ZW0+PGI+SU5URUdSQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjSU5URUdSQUwKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlJTlRFR1JBTF9MSVRFUkFMKDEsICJJTlRFR1JBTCIsICJJTlRFR1JBTCIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DT05GSURFTlRJQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ09ORklERU5USUFMCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQ09ORklERU5USUFMX0xJVEVSQUwoMiwgIkNPTkZJREVOVElBTCIsICJDT05GSURFTlRJQUwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtODgsMzYgKzExNyw2IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09ORklERU5USUFMID0gMjsKIAogCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBOT05FX0xJVEVSQUwgPSBuZXcgVHJhbnNwb3J0R3VhcmFudGVlVHlwZShOT05FLCAiTk9ORSIsICJOT05FIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5URUdSQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5URUdSQUwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgSU5URUdSQUxfTElURVJBTCA9IG5ldyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKElOVEVHUkFMLCAiSU5URUdSQUwiLCAiSU5URUdSQUwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DT05GSURFTlRJQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ09ORklERU5USUFMCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIENPTkZJREVOVElBTF9MSVRFUkFMID0gbmV3IFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoQ09ORklERU5USUFMLCAiQ09ORklERU5USUFMIiwgIkNPTkZJREVOVElBTCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMzYsNyArMTM1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8VHJhbnNwb3J0R3VhcmFudGVlVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCkBAIC0xODIsMTcgKzE4MSw3NyBAQAogCQkJY2FzZSBJTlRFR1JBTDogcmV0dXJuIElOVEVHUkFMX0xJVEVSQUw7CiAJCQljYXNlIENPTkZJREVOVElBTDogcmV0dXJuIENPTkZJREVOVElBTF9MSVRFUkFMOwogCQl9Ci0JCXJldHVybiBudWxsOwkKKwkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgogCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwcml2YXRlIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CiAJfQogCi19IC8vVHJhbnNwb3J0R3VhcmFudGVlVHlwZQorCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9Vc2VyRGF0YUNvbnN0cmFpbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1VzZXJEYXRhQ29uc3RyYWludC5qYXZhCmluZGV4IDdkZDM0NmUuLjE2MzM0N2QgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1VzZXJEYXRhQ29uc3RyYWludC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1VzZXJEYXRhQ29uc3RyYWludC5qYXZhCkBAIC0xMiw2ICsxMiw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwogCiAvKioKQEAgLTIyLDEyICsyMywxMyBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSB1c2VyLWRhdGEtY29uc3RyYWludFR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSBob3cKLSAqIAlkYXRhIGNvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUKLSAqIAlwcm90ZWN0ZWQuCi0gKiAKLSAqIAlVc2VkIGluOiBzZWN1cml0eS1jb25zdHJhaW50Ci0gKiAKKyAqICAgICAgICAgVGhlIHVzZXItZGF0YS1jb25zdHJhaW50VHlwZSBpcyB1c2VkIHRvIGluZGljYXRlIGhvdworICogICAgICAgICBkYXRhIGNvbW11bmljYXRlZCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIGNvbnRhaW5lciBzaG91bGQgYmUKKyAqICAgICAgICAgcHJvdGVjdGVkLgorICogICAgICAgICAKKyAqICAgICAgICAgVXNlZCBpbjogc2VjdXJpdHktY29uc3RyYWludAorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKgpAQCAtNTgsMTEgKzYwLDEwIEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOworCUxpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnNwb3J0IEd1YXJhbnRlZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJOT05FIjwvY29kZT4uCiAJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhbnNwb3J0R3VhcmFudGVlVHlwZX0uCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8cD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkFwcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViQXBwLmphdmEKaW5kZXggNGQ0OGQ3MS4uNTFhNWVkNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViQXBwLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViQXBwLmphdmEKQEAgLTEyLDEwICsxMiw2IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHA8L2I+PC9lbT4nLgpAQCAtMjUsNiArMjEsNyBAQAogICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgogICogPHVsPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRNb2R1bGVOYW1lIDxlbT5Nb2R1bGUgTmFtZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RGlzcGxheU5hbWVzIDxlbT5EaXNwbGF5IE5hbWVzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0SWNvbnMgPGVtPkljb25zPC9lbT59PC9saT4KQEAgLTU0LDggKzUxLDEwIEBACiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFBlcnNpc3RlbmNlVW5pdFJlZnMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RGF0YVNvdXJjZSA8ZW0+RGF0YSBTb3VyY2U8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRNZXNzYWdlRGVzdGluYXRpb25zIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldEFic29sdXRlT3JkZXJpbmcgPGVtPkFic29sdXRlIE9yZGVyaW5nPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgpAQCAtNjYsNjQyICs2NSwzOSBAQAogICogQGV4dGVuZHMgSmF2YUVFT2JqZWN0CiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgV2ViQXBwIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0dyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cCgpOworcHVibGljIGludGVyZmFjZSBXZWJBcHAgZXh0ZW5kcyBJV2ViQ29tbW9uIHsKIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9EZXNjcmlwdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERlc2NyaXB0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNwbGF5IE5hbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzcGxheSBOYW1lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0Rpc3BsYXlOYW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RGlzcGxheU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5JY29ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkljb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWNvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9JY29ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0SWNvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc3RyaWJ1dGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXN0cmlidXRhYmxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc3RyaWJ1dGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfRGlzdHJpYnV0YWJsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldERpc3RyaWJ1dGFibGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZXh0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QYXJhbVZhbHVlfS4KKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb2R1bGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCi0JICogCi0JICogCSAgICBUaGUgY29udGV4dC1wYXJhbSBlbGVtZW50IGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbgotCSAqIAkgICAgb2YgYSB3ZWIgYXBwbGljYXRpb24ncyBzZXJ2bGV0IGNvbnRleHQKLQkgKiAJICAgIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCi0JICogCi0JICogCSAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgV2ViIDMuMAorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGV4dCBQYXJhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9Db250ZXh0UGFyYW1zKCkKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2R1bGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX01vZHVsZU5hbWUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlMaXN0IGdldENvbnRleHRQYXJhbXMoKTsKKwlMaXN0PFN0cmluZz4gZ2V0TW9kdWxlTmFtZSgpOwogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmlsdGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GaWx0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmlsdGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0ZpbHRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEZpbHRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbHRlciBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmlsdGVyIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmlsdGVyIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEZpbHRlck1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfTGlzdGVuZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlcnZsZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2bGV0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfU2VydmxldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlcnZsZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2bGV0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VydmxldCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcnZsZXQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFNlcnZsZXRNYXBwaW5ncygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2Vzc2lvbiBDb25maWdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXNzaW9uIENvbmZpZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXNzaW9uIENvbmZpZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9TZXNzaW9uQ29uZmlncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2Vzc2lvbkNvbmZpZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbWUgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NaW1lTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaW1lIE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWltZSBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX01pbWVNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0TWltZU1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWxjb21lIEZpbGUgTGlzdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2VsY29tZSBGaWxlIExpc3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2VsY29tZSBGaWxlIExpc3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfV2VsY29tZUZpbGVMaXN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0V2VsY29tZUZpbGVMaXN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXJyb3IgUGFnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXJyb3IgUGFnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FcnJvciBQYWdlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVycm9yUGFnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpzcCBDb25maWdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpzcCBDb25maWdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SnNwIENvbmZpZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9Kc3BDb25maWdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRKc3BDb25maWdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN1cml0eSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfU2VjdXJpdHlDb25zdHJhaW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9naW4gQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvZ2luIENvbmZpZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2dpbiBDb25maWdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfTG9naW5Db25maWdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRMb2dpbkNvbmZpZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN1cml0eSBSb2xlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3VyaXR5IFJvbGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VjdXJpdHlSb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW52IEVudHJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW52IEVudHJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnYgRW50cmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0VudkVudHJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldEVudkVudHJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FamIgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVqYiBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfRWpiUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RWpiUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWpiIExvY2FsIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWpiIExvY2FsIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0VqYkxvY2FsUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0RWpiTG9jYWxSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXJ2aWNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9TZXJ2aWNlUmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0U2VydmljZVJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9SZXNvdXJjZVJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFJlc291cmNlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX1Jlc291cmNlRW52UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWZ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3QgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlVW5pdFJlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdCBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBDb25zdHJ1Y3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfUG9zdENvbnN0cnVjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFBvc3RDb25zdHJ1Y3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIERlc3Ryb3lzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfUHJlRGVzdHJveXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldFByZURlc3Ryb3lzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzIExpc3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzIExpc3RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0IGdldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFic29sdXRlIE9yZGVyaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQWJzb2x1dGVPcmRlcmluZ1R5cGV9LgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAJICogCi0JICogCi0JICogCSAgVGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBkZWZpbmVzIHdoZXRoZXIgdGhpcwotCSAqIAkgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBhbmQgb3RoZXIgcmVsYXRlZCBkZXBsb3ltZW50Ci0JICogCSAgZGVzY3JpcHRvcnMgZm9yIHRoaXMgbW9kdWxlIChlLmcuLCB3ZWIgc2VydmljZQotCSAqIAkgIGRlc2NyaXB0b3JzKSBhcmUgY29tcGxldGUsIG9yIHdoZXRoZXIgdGhlIGNsYXNzCi0JICogCSAgZmlsZXMgYXZhaWxhYmxlIHRvIHRoaXMgbW9kdWxlIGFuZCBwYWNrYWdlZCB3aXRoCi0JICogCSAgdGhpcyBhcHBsaWNhdGlvbiBzaG91bGQgYmUgZXhhbWluZWQgZm9yIGFubm90YXRpb25zCi0JICogCSAgdGhhdCBzcGVjaWZ5IGRlcGxveW1lbnQgaW5mb3JtYXRpb24uCi0JICogCi0JICogCSAgSWYgbWV0YWRhdGEtY29tcGxldGUgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIGRlcGxveW1lbnQKLQkgKiAJICB0b29sIG11c3QgaWdub3JlIGFueSBhbm5vdGF0aW9ucyB0aGF0IHNwZWNpZnkgZGVwbG95bWVudAotCSAqIAkgIGluZm9ybWF0aW9uLCB3aGljaCBtaWdodCBiZSBwcmVzZW50IGluIHRoZSBjbGFzcyBmaWxlcwotCSAqIAkgIG9mIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiAKLQkgKiAJICBJZiBtZXRhZGF0YS1jb21wbGV0ZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIHNldCB0bwotCSAqIAkgICJmYWxzZSIsIHRoZSBkZXBsb3ltZW50IHRvb2wgbXVzdCBleGFtaW5lIHRoZSBjbGFzcwotCSAqIAkgIGZpbGVzIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgYW5ub3RhdGlvbnMsIGFzCi0JICogCSAgc3BlY2lmaWVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucy4KLQkgKiAKLQkgKiAJCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNiwgV2ViIDMuMAorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNzZXRNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcF9NZXRhZGF0YUNvbXBsZXRlKCkKKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BYnNvbHV0ZSBPcmRlcmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwX0Fic29sdXRlT3JkZXJpbmcoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlib29sZWFuIGlzTWV0YWRhdGFDb21wbGV0ZSgpOworCUxpc3Q8QWJzb2x1dGVPcmRlcmluZ1R5cGU+IGdldEFic29sdXRlT3JkZXJpbmcoKTsKIAotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICN1bnNldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI2lzTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0YWRhdGFDb21wbGV0ZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNzZXRNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNZXRhZGF0YUNvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAc2VlICNzZXRNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjIuNSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZQotCSAqIEBzZWUgI2lzU2V0VmVyc2lvbigpCi0JICogQHNlZSAjdW5zZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRWZXJzaW9uKFdlYkFwcFZlcnNpb25UeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJBcHBfVmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlYkFwcFZlcnNpb25UeXBlIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlCi0JICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKLQkgKiBAc2VlICN1bnNldFZlcnNpb24oKQotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZlcnNpb24oV2ViQXBwVmVyc2lvblR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNzZXRWZXJzaW9uKFdlYkFwcFZlcnNpb25UeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmVyc2lvbigpCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQHNlZSAjc2V0VmVyc2lvbihXZWJBcHBWZXJzaW9uVHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFZlcnNpb24oKTsKIAogfSAvLyBXZWJBcHAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IuamF2YQppbmRleCA0YzU2ZmFhLi5kZDEzODc4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yLmphdmEKQEAgLTY1LDcgKzY1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKTsKKwlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhNTE5TUHJlZml4TWFwKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCkBAIC04MSwzMiArODEsMTIgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKKwlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWIgQXBwPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAKLQkgKiAJVGhlIHdlYi1hcHAgZWxlbWVudCBpcyB0aGUgcm9vdCBvZiB0aGUgZGVwbG95bWVudAotCSAqIAlkZXNjcmlwdG9yIGZvciBhIHdlYiBhcHBsaWNhdGlvbi4gIE5vdGUgdGhhdCB0aGUgc3ViLWVsZW1lbnRzCi0JICogCW9mIHRoaXMgZWxlbWVudCBjYW4gYmUgaW4gdGhlIGFyYml0cmFyeSBvcmRlci4gQmVjYXVzZSBvZgotCSAqIAl0aGF0LCB0aGUgbXVsdGlwbGljaXR5IG9mIHRoZSBlbGVtZW50cyBvZiBkaXN0cmlidXRhYmxlLAotCSAqIAlzZXNzaW9uLWNvbmZpZywgd2VsY29tZS1maWxlLWxpc3QsIGpzcC1jb25maWcsIGxvZ2luLWNvbmZpZywKLQkgKiAJYW5kIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3Qgd2FzIGNoYW5nZWQgZnJvbSAiPyIgdG8gIioiCi0JICogCWluIHRoaXMgc2NoZW1hLiAgSG93ZXZlciwgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpbnN0YW5jZQotCSAqIAlmaWxlIG11c3Qgbm90IGNvbnRhaW4gbXVsdGlwbGUgZWxlbWVudHMgb2Ygc2Vzc2lvbi1jb25maWcsCi0JICogCWpzcC1jb25maWcsIGFuZCBsb2dpbi1jb25maWcuIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGVsZW1lbnRzIG9mCi0JICogCXdlbGNvbWUtZmlsZS1saXN0IG9yIGxvY2FsZS1lbmNvZGluZy1tYXBwaW5nLWxpc3QsIHRoZSBjb250YWluZXIKLQkgKiAJbXVzdCBjb25jYXRlbmF0ZSB0aGUgZWxlbWVudCBjb250ZW50cy4gIFRoZSBtdWx0aXBsZSBvY2N1cmVuY2UKLQkgKiAJb2YgdGhlIGVsZW1lbnQgZGlzdHJpYnV0YWJsZSBpcyByZWR1bmRhbnQgYW5kIHRoZSBjb250YWluZXIKLQkgKiAJdHJlYXRzIHRoYXQgY2FzZSBleGFjdGx5IGluIHRoZSBzYW1lIHdheSB3aGVuIHRoZXJlIGlzIG9ubHkKLQkgKiAJb25lIGRpc3RyaWJ1dGFibGUuCi0JICogCi0JICogICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldlYiBBcHA8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgogCSAqIEBzZWUgI3NldFdlYkFwcChXZWJBcHApCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1dlYkFwcCgpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJBcHBWZXJzaW9uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViQXBwVmVyc2lvblR5cGUuamF2YQppbmRleCAwZDQ1MmMzLi5jMGIyMzUwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJBcHBWZXJzaW9uVHlwZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkFwcFZlcnNpb25UeXBlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwogCiAvKioKICAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC0yNCwxNiArMjQsMTAyIEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhpcyB0eXBlIGNvbnRhaW5zIHRoZSByZWNvZ25pemVkIHZlcnNpb25zIG9mCi0gKiAJd2ViLWFwcGxpY2F0aW9uIHN1cHBvcnRlZC4gSXQgaXMgdXNlZCB0byBkZXNpZ25hdGUgdGhlCi0gKiAJdmVyc2lvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLgotICogCisgKiAgICAgICAgIFRoaXMgdHlwZSBjb250YWlucyB0aGUgcmVjb2duaXplZCB2ZXJzaW9ucyBvZgorICogICAgICAgICB3ZWItYXBwbGljYXRpb24gc3VwcG9ydGVkLiBJdCBpcyB1c2VkIHRvIGRlc2lnbmF0ZSB0aGUKKyAqICAgICAgICAgdmVyc2lvbiBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLgorICogICAgICAgICAKKyAqICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQogICogICAgICAgCiAgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViQXBwVmVyc2lvblR5cGUoKQogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV2ViQXBwVmVyc2lvblR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgeworcHVibGljIGVudW0gV2ViQXBwVmVyc2lvblR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCit7CisJLyoqCisJICogVGhlICc8ZW0+PGI+MjI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjXzIyCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJXzIyX0xJVEVSQUwoLTEsICJfMjIiLCAiMi4yIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCS8qKgorCSAqIFRoZSAnPGVtPjxiPjIzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI18yMworCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCV8yM19MSVRFUkFMKC0yLCAiXzIzIiwgIjIuMyIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj4yNDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNfMjQKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlfMjRfTElURVJBTCgtMSwgIl8yNCIsICIyLjQiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyoqCisJICogVGhlICc8ZW0+PGI+MjU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjXzI1CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJXzI1X0xJVEVSQUwoMCwgIl8yNSIsICIyLjUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyoqCisJICogVGhlICc8ZW0+PGI+MzA8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjXzMwCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJXzMwX0xJVEVSQUwoMSwgIl8zMCIsICIzLjAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJLyoqCisJICogVGhlICc8ZW0+PGI+MjI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPjIyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI18yMl9MSVRFUkFMCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgXzIyID0gLTM7CisJLyoqCisJICogVGhlICc8ZW0+PGI+MjM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPjIzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI18yM19MSVRFUkFMCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgXzIzID0gLTI7CisJLyoqCisJICogVGhlICc8ZW0+PGI+MjQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPjI0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI18yNF9MSVRFUkFMCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgXzI0ID0gLTE7CiAJLyoqCiAJICogVGhlICc8ZW0+PGI+MjU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTQ5LDE0ICsxMzUsMTggQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfMjUgPSAwOwogCiAJLyoqCi0JICogVGhlICc8ZW0+PGI+MjU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIFRoZSAnPGVtPjxiPjMwPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj4zMDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNfMjUKKwkgKiBAc2VlICNfMzBfTElURVJBTAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgV2ViQXBwVmVyc2lvblR5cGUgXzI1X0xJVEVSQUwgPSBuZXcgV2ViQXBwVmVyc2lvblR5cGUoXzI1LCAiXzI1IiwgIjIuNSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfMzAgPSAxOwogCiAJLyoqCiAJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkFwcCBWZXJzaW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgpAQCAtNjYsNyArMTU2LDExIEBACiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgV2ViQXBwVmVyc2lvblR5cGVbXSBWQUxVRVNfQVJSQVkgPQogCQluZXcgV2ViQXBwVmVyc2lvblR5cGVbXSB7CisJCQlfMjJfTElURVJBTCwKKwkJCV8yM19MSVRFUkFMLAorCQkJXzI0X0xJVEVSQUwsCiAJCQlfMjVfTElURVJBTCwKKwkJCV8zMF9MSVRFUkFMLAogCQl9OwogCiAJLyoqCkBAIC03NSw3ICsxNjksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxXZWJBcHBWZXJzaW9uVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgJzxlbT48Yj5BcHAgVmVyc2lvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgpAQCAtMTE3LDE5ICsyMTEsODMgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFdlYkFwcFZlcnNpb25UeXBlIGdldChpbnQgdmFsdWUpIHsKIAkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBfMjI6IHJldHVybiBfMjVfTElURVJBTDsKKwkJCWNhc2UgXzIzOiByZXR1cm4gXzI1X0xJVEVSQUw7CisJCQljYXNlIF8yNDogcmV0dXJuIF8yNV9MSVRFUkFMOwogCQkJY2FzZSBfMjU6IHJldHVybiBfMjVfTElURVJBTDsKKwkJCWNhc2UgXzMwOiByZXR1cm4gXzMwX0xJVEVSQUw7CiAJCX0KLQkJcmV0dXJuIG51bGw7CQorCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCiAJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwogCXByaXZhdGUgV2ViQXBwVmVyc2lvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CiAJfQogCi19IC8vV2ViQXBwVmVyc2lvblR5cGUKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViRmFjdG9yeS5qYXZhCmluZGV4IDg2YTYwMTIuLmZiNmY2ZGIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYkZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJGYWN0b3J5LmphdmEKQEAgLTMyLDYgKzMyLDE1IEBACiAJV2ViRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZhY3RvcnlJbXBsLmluaXQoKTsKIAogCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWJzb2x1dGUgT3JkZXJpbmcgVHlwZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWJzb2x1dGUgT3JkZXJpbmcgVHlwZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQWJzb2x1dGVPcmRlcmluZ1R5cGUgY3JlYXRlQWJzb2x1dGVPcmRlcmluZ1R5cGUoKTsKKworCS8qKgogCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC00MSw2ICs1MCw1MSBAQAogCUF1dGhDb25zdHJhaW50IGNyZWF0ZUF1dGhDb25zdHJhaW50KCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvb2tpZSBDb21tZW50IFR5cGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvb2tpZSBDb21tZW50IFR5cGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvb2tpZUNvbW1lbnRUeXBlIGNyZWF0ZUNvb2tpZUNvbW1lbnRUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvb2tpZSBDb25maWcgVHlwZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29va2llIENvbmZpZyBUeXBlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDb29raWVDb25maWdUeXBlIGNyZWF0ZUNvb2tpZUNvbmZpZ1R5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29va2llIERvbWFpbiBUeXBlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db29raWUgRG9tYWluIFR5cGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUNvb2tpZURvbWFpblR5cGUgY3JlYXRlQ29va2llRG9tYWluVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db29raWUgTmFtZSBUeXBlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db29raWUgTmFtZSBUeXBlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDb29raWVOYW1lVHlwZSBjcmVhdGVDb29raWVOYW1lVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db29raWUgUGF0aCBUeXBlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db29raWUgUGF0aCBUeXBlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDb29raWVQYXRoVHlwZSBjcmVhdGVDb29raWVQYXRoVHlwZSgpOworCisJLyoqCiAJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FcnJvciBQYWdlPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMTMsNiArMTY3LDQyIEBACiAJTWltZU1hcHBpbmcgY3JlYXRlTWltZU1hcHBpbmcoKTsKIAogCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TXVsdGlwYXJ0IENvbmZpZyBUeXBlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NdWx0aXBhcnQgQ29uZmlnIFR5cGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCU11bHRpcGFydENvbmZpZ1R5cGUgY3JlYXRlTXVsdGlwYXJ0Q29uZmlnVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlcmluZyBPcmRlcmluZyBUeXBlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlcmluZyBPcmRlcmluZyBUeXBlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlPcmRlcmluZ09yZGVyaW5nVHlwZSBjcmVhdGVPcmRlcmluZ09yZGVyaW5nVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlcmluZyBPdGhlcnMgVHlwZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3JkZXJpbmcgT3RoZXJzIFR5cGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCU9yZGVyaW5nT3RoZXJzVHlwZSBjcmVhdGVPcmRlcmluZ090aGVyc1R5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3JkZXJpbmcgVHlwZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3JkZXJpbmcgVHlwZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJT3JkZXJpbmdUeXBlIGNyZWF0ZU9yZGVyaW5nVHlwZSgpOworCisJLyoqCiAJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xNzYsNiArMjY2LDE1IEBACiAJV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IgY3JlYXRlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKTsKIAogCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RnJhZ21lbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkZyYWdtZW50PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlXZWJGcmFnbWVudCBjcmVhdGVXZWJGcmFnbWVudCgpOworCisJLyoqCiAJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZSBDb2xsZWN0aW9uPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJGcmFnbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDY2YjUxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2ViRnJhZ21lbnQuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQ6IFdlYkZyYWdtZW50LmphdmEsdiAxLjMgMjAxMC8wMi8xMSAwNjoyMjo1MSBjYW5kZXJzb24gRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GcmFnbWVudDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKyAqIAorICogICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgMy4wCisgKiAgICAgICAKKyAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0RGlzdHJpYnV0YWJsZXMgPGVtPkRpc3RyaWJ1dGFibGVzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRDb250ZXh0UGFyYW1zIDxlbT5Db250ZXh0IFBhcmFtczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0RmlsdGVycyA8ZW0+RmlsdGVyczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0RmlsdGVyTWFwcGluZ3MgPGVtPkZpbHRlciBNYXBwaW5nczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0TGlzdGVuZXJzIDxlbT5MaXN0ZW5lcnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldFNlcnZsZXRzIDxlbT5TZXJ2bGV0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0U2VydmxldE1hcHBpbmdzIDxlbT5TZXJ2bGV0IE1hcHBpbmdzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRTZXNzaW9uQ29uZmlncyA8ZW0+U2Vzc2lvbiBDb25maWdzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRNaW1lTWFwcGluZ3MgPGVtPk1pbWUgTWFwcGluZ3M8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldFdlbGNvbWVGaWxlTGlzdHMgPGVtPldlbGNvbWUgRmlsZSBMaXN0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0RXJyb3JQYWdlcyA8ZW0+RXJyb3IgUGFnZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldEpzcENvbmZpZ3MgPGVtPkpzcCBDb25maWdzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRTZWN1cml0eUNvbnN0cmFpbnRzIDxlbT5TZWN1cml0eSBDb25zdHJhaW50czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0TG9naW5Db25maWdzIDxlbT5Mb2dpbiBDb25maWdzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRTZWN1cml0eVJvbGVzIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRSZXNvdXJjZVJlZnMgPGVtPlJlc291cmNlIFJlZnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldERhdGFTb3VyY2UgPGVtPkRhdGEgU291cmNlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRNZXNzYWdlRGVzdGluYXRpb25zIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzIExpc3RzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRPcmRlcmluZyA8ZW0+T3JkZXJpbmc8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJGcmFnbWVudCgpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBXZWJGcmFnbWVudCBleHRlbmRzIElXZWJDb21tb24geworCQorCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYkZyYWdtZW50X05hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMaXN0PFN0cmluZz4gZ2V0TmFtZSgpOworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlcmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk9yZGVyaW5nVHlwZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcmRlcmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJGcmFnbWVudF9PcmRlcmluZygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUxpc3Q8T3JkZXJpbmdUeXBlPiBnZXRPcmRlcmluZygpOworCit9IC8vIFdlYkZyYWdtZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9XZWJSZXNvdXJjZUNvbGxlY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYlJlc291cmNlQ29sbGVjdGlvbi5qYXZhCmluZGV4IDA0YWNhMDEuLjc3Y2FkNGUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYlJlc291cmNlQ29sbGVjdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlYlJlc291cmNlQ29sbGVjdGlvbi5qYXZhCkBAIC0xMiw3ICsxMiw5IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZTsKIAogLyoqCiAgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtMjIsMTQgKzI0LDE5IEBACiAgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICAqIAogICogCi0gKiAJVGhlIHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uVHlwZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0Ci0gKiAJb2YgdGhlIHJlc291cmNlcyBhbmQgSFRUUCBtZXRob2RzIG9uIHRob3NlIHJlc291cmNlcyB3aXRoaW4KLSAqIAlhIHdlYiBhcHBsaWNhdGlvbiB0byB3aGljaCBhIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYKLSAqIAlubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludAotICogCWFwcGxpZXMgdG8gYWxsIEhUVFAgbWV0aG9kcy4KLSAqIAotICogCVVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKLSAqIAorICogICAgICAgICBUaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb25UeXBlIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlCisgKiAgICAgICAgIHJlc291cmNlcyBhbmQgSFRUUCBtZXRob2RzIG9uIHRob3NlIHJlc291cmNlcyB0byB3aGljaCBhCisgKiAgICAgICAgIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcy4gSWYgbm8gSFRUUCBtZXRob2RzIGFyZSBzcGVjaWZpZWQsCisgKiAgICAgICAgIHRoZW4gdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcyB0byBhbGwgSFRUUCBtZXRob2RzLgorICogICAgICAgICBJZiBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCBieSBodHRwLW1ldGhvZC1vbWlzc2lvbgorICogICAgICAgICBlbGVtZW50cywgdGhlIHNlY3VyaXR5IGNvbnN0cmFpbnQgYXBwbGllcyB0byBhbGwgbWV0aG9kcworICogICAgICAgICBleGNlcHQgdGhvc2UgaWRlbnRpZmllZCBpbiB0aGUgY29sbGVjdGlvbi4KKyAqICAgICAgICAgaHR0cC1tZXRob2Qtb21pc3Npb24gYW5kIGh0dHAtbWV0aG9kIGVsZW1lbnRzIGFyZSBuZXZlcgorICogICAgICAgICBtaXhlZCBpbiB0aGUgc2FtZSBjb2xsZWN0aW9uLiAKKyAqICAgICAgICAgCisgKiAgICAgICAgIFVzZWQgaW46IHNlY3VyaXR5LWNvbnN0cmFpbnQKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiAyLjUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTQwLDYgKzQ3LDcgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0RGVzY3JpcHRpb25zIDxlbT5EZXNjcmlwdGlvbnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRVcmxQYXR0ZXJucyA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0SHR0cE1ldGhvZHMgPGVtPkh0dHAgTWV0aG9kczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldEh0dHBNZXRob2RPbWlzc2lvbiA8ZW0+SHR0cCBNZXRob2QgT21pc3Npb248L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgogICogPC91bD4KICAqIDwvcD4KQEAgLTU2LDEwICs2NCwxMSBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIHdlYi1yZXNvdXJjZS1uYW1lIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMgd2ViCi0JICogCSAgICByZXNvdXJjZSBjb2xsZWN0aW9uLgotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSB3ZWItcmVzb3VyY2UtbmFtZSBjb250YWlucyB0aGUgbmFtZSBvZiB0aGlzIHdlYgorCSAqICAgICAgICAgICAgIHJlc291cmNlIGNvbGxlY3Rpb24uCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIFJlc291cmNlIE5hbWU8L2VtPicgYXR0cmlidXRlLgogCSAqIEBzZWUgI3NldFdlYlJlc291cmNlTmFtZShTdHJpbmcpCkBAIC05MSw3ICsxMDAsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb25zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXREZXNjcmlwdGlvbnMoKTsKKwlMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKTsKIAogCS8qKgogCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVybCBQYXR0ZXJuczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMDYsNyArMTE1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VybFBhdHRlcm5zKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JTGlzdCBnZXRVcmxQYXR0ZXJucygpOworCUxpc3Q8VXJsUGF0dGVyblR5cGU+IGdldFVybFBhdHRlcm5zKCk7CiAKIAkvKioKIAkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IdHRwIE1ldGhvZHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgpAQCAtMTE3LDExICsxMjYsNDAgQEAKIAkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCiAJICogPC9wPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqICAgICAgICAgICAgICAgRWFjaCBodHRwLW1ldGhvZCBuYW1lcyBhbiBIVFRQIG1ldGhvZCB0byB3aGljaCB0aGUKKwkgKiAgICAgICAgICAgICAgIGNvbnN0cmFpbnQgYXBwbGllcy4KKwkgKiAgICAgICAgICAgICAgIAorCSAqICAgICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQorCSAqICAgICAgICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KIAkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IdHRwIE1ldGhvZHM8L2VtPicgYXR0cmlidXRlIGxpc3QuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0SHR0cE1ldGhvZHMoKTsKKwlMaXN0PFN0cmluZz4gZ2V0SHR0cE1ldGhvZHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh0dHAgTWV0aG9kIE9taXNzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KKwkgKiAKKwkgKiAKKwkgKiAgICAgICAgICAgICAgIEVhY2ggaHR0cC1tZXRob2Qtb21pc3Npb24gbmFtZXMgYW4gSFRUUCBtZXRob2QgdG8KKwkgKiAgICAgICAgICAgICAgIHdoaWNoIHRoZSBjb25zdHJhaW50IGRvZXMgbm90IGFwcGx5LgorCSAqICAgICAgICAgICAgICAgCisJICogICAgICAgICAgICAgICBAc2luY2UgSmF2YSBFRSA2LCBXZWIgMy4wCisJICogICAgICAgICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh0dHAgTWV0aG9kIE9taXNzaW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZSNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZE9taXNzaW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGlzdDxTdHJpbmc+IGdldEh0dHBNZXRob2RPbWlzc2lvbigpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL1dlbGNvbWVGaWxlTGlzdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2VsY29tZUZpbGVMaXN0LmphdmEKaW5kZXggMjg3MmNhZC4uZGI4ODFhZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2VsY29tZUZpbGVMaXN0LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvV2VsY29tZUZpbGVMaXN0LmphdmEKQEAgLTIyLDExICsyMiwxMiBAQAogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKICAqIAotICogCVRoZSB3ZWxjb21lLWZpbGUtbGlzdCBjb250YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VsY29tZQotICogCWZpbGVzIGVsZW1lbnRzLgotICogCi0gKiAJVXNlZCBpbjogd2ViLWFwcAotICogCisgKiAgICAgICAgIFRoZSB3ZWxjb21lLWZpbGUtbGlzdCBjb250YWlucyBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VsY29tZQorICogICAgICAgICBmaWxlcyBlbGVtZW50cy4KKyAqICAgICAgICAgCisgKiAgICAgICAgIFVzZWQgaW46IHdlYi1hcHAKKyAqICAgICAgICAgCisgKiAgICAgICAgIEBzaW5jZSBKYXZhIEVFIDUsIFdlYiAyLjUKICAqICAgICAgIAogICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgogICoKQEAgLTUxLDE2ICs1MiwxNyBAQAogCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgogCSAqIAogCSAqIAotCSAqIAkgICAgVGhlIHdlbGNvbWUtZmlsZSBlbGVtZW50IGNvbnRhaW5zIGZpbGUgbmFtZSB0byB1c2UKLQkgKiAJICAgIGFzIGEgZGVmYXVsdCB3ZWxjb21lIGZpbGUsIHN1Y2ggYXMgaW5kZXguaHRtbAotCSAqIAotCSAqIAkgIAorCSAqICAgICAgICAgICAgIFRoZSB3ZWxjb21lLWZpbGUgZWxlbWVudCBjb250YWlucyBmaWxlIG5hbWUgdG8gdXNlCisJICogICAgICAgICAgICAgYXMgYSBkZWZhdWx0IHdlbGNvbWUgZmlsZSwgc3VjaCBhcyBpbmRleC5odG1sCisJICogICAgICAgICAgICAgCisJICogICAgICAgICAgICAgQHNpbmNlIEphdmEgRUUgNSwgV2ViIDIuNQorCSAqICAgICAgICAgICAKIAkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2VsY29tZSBGaWxlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UjZ2V0V2VsY29tZUZpbGVMaXN0X1dlbGNvbWVGaWxlcygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCUxpc3QgZ2V0V2VsY29tZUZpbGVzKCk7CisJTGlzdDxTdHJpbmc+IGdldFdlbGNvbWVGaWxlcygpOwogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvQWJzb2x1dGVPcmRlcmluZ1R5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0Fic29sdXRlT3JkZXJpbmdUeXBlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzRlMDkKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0Fic29sdXRlT3JkZXJpbmdUeXBlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjE3IEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQ6IEFic29sdXRlT3JkZXJpbmdUeXBlSW1wbC5qYXZhLHYgMS4xIDIwMDkvMTAvMTUgMTg6NTI6MDUgY2FuZGVyc29uIEV4cCAkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BYnNvbHV0ZU9yZGVyaW5nVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5PcmRlcmluZ090aGVyc1R5cGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWJzb2x1dGUgT3JkZXJpbmcgVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5BYnNvbHV0ZU9yZGVyaW5nVHlwZUltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkFic29sdXRlT3JkZXJpbmdUeXBlSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkFic29sdXRlT3JkZXJpbmdUeXBlSW1wbCNnZXRPdGhlcnMgPGVtPk90aGVyczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEFic29sdXRlT3JkZXJpbmdUeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQWJzb2x1dGVPcmRlcmluZ1R5cGUgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEdyb3VwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBYnNvbHV0ZU9yZGVyaW5nVHlwZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLkFCU09MVVRFX09SREVSSU5HX1RZUEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7CisJCWlmIChncm91cCA9PSBudWxsKSB7CisJCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgV2ViUGFja2FnZS5BQlNPTFVURV9PUkRFUklOR19UWVBFX19HUk9VUCk7CisJCX0KKwkJcmV0dXJuIGdyb3VwOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLkFCU09MVVRFX09SREVSSU5HX1RZUEVfX05BTUUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PE9yZGVyaW5nT3RoZXJzVHlwZT4gZ2V0T3RoZXJzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuQUJTT0xVVEVfT1JERVJJTkdfVFlQRV9fT1RIRVJTKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuQUJTT0xVVEVfT1JERVJJTkdfVFlQRV9fR1JPVVA6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYlBhY2thZ2UuQUJTT0xVVEVfT1JERVJJTkdfVFlQRV9fT1RIRVJTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T3RoZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLkFCU09MVVRFX09SREVSSU5HX1RZUEVfX0dST1VQOgorCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwKCk7CisJCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5nZXRXcmFwcGVyKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuQUJTT0xVVEVfT1JERVJJTkdfVFlQRV9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLkFCU09MVVRFX09SREVSSU5HX1RZUEVfX09USEVSUzoKKwkJCQlyZXR1cm4gZ2V0T3RoZXJzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5BQlNPTFVURV9PUkRFUklOR19UWVBFX19HUk9VUDoKKwkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAoKSkuc2V0KG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuQUJTT0xVVEVfT1JERVJJTkdfVFlQRV9fTkFNRToKKwkJCQlnZXROYW1lKCkuY2xlYXIoKTsKKwkJCQlnZXROYW1lKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuQUJTT0xVVEVfT1JERVJJTkdfVFlQRV9fT1RIRVJTOgorCQkJCWdldE90aGVycygpLmNsZWFyKCk7CisJCQkJZ2V0T3RoZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBPcmRlcmluZ090aGVyc1R5cGU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLkFCU09MVVRFX09SREVSSU5HX1RZUEVfX0dST1VQOgorCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuQUJTT0xVVEVfT1JERVJJTkdfVFlQRV9fTkFNRToKKwkJCQlnZXROYW1lKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuQUJTT0xVVEVfT1JERVJJTkdfVFlQRV9fT1RIRVJTOgorCQkJCWdldE90aGVycygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuQUJTT0xVVEVfT1JERVJJTkdfVFlQRV9fR1JPVVA6CisJCQkJcmV0dXJuIGdyb3VwICE9IG51bGwgJiYgIWdyb3VwLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5BQlNPTFVURV9PUkRFUklOR19UWVBFX19OQU1FOgorCQkJCXJldHVybiAhZ2V0TmFtZSgpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5BQlNPTFVURV9PUkRFUklOR19UWVBFX19PVEhFUlM6CisJCQkJcmV0dXJuICFnZXRPdGhlcnMoKS5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChncm91cDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChncm91cCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0Fic29sdXRlT3JkZXJpbmdUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9BdXRoQ29uc3RyYWludEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvQXV0aENvbnN0cmFpbnRJbXBsLmphdmEKaW5kZXggMGUxZWNhZi4uYzQ0NTBlNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9BdXRoQ29uc3RyYWludEltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0F1dGhDb25zdHJhaW50SW1wbC5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlTmFtZXMoKSA8ZW0+Um9sZSBOYW1lczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCkBAIC02OCw3ICs2OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHJvbGVOYW1lcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gcm9sZU5hbWVzOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMDQsNiArMTA0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLkFVVEhfQ09OU1RSQUlOVDsKIAl9CkBAIC0xMTMsOSArMTE0LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgeworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CiAJCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TKTsKKwkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMTI1LDkgKzEyNiw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFJvbGVOYW1lcygpIHsKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJvbGVOYW1lcygpIHsKIAkJaWYgKHJvbGVOYW1lcyA9PSBudWxsKSB7Ci0JCQlyb2xlTmFtZXMgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fUk9MRV9OQU1FUyk7CisJCQlyb2xlTmFtZXMgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UX19ST0xFX05BTUVTKTsKIAkJfQogCQlyZXR1cm4gcm9sZU5hbWVzOwogCX0KQEAgLTE1OCwxMCArMTU5LDExIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC0xNzEsNiArMTczLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgpAQCAtMTg4LDE1ICsxOTEsMTcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKIAkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmlwdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1JPTEVfTkFNRVM6CiAJCQkJZ2V0Um9sZU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRSb2xlTmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFJvbGVOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0yMTAsNiArMjE1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKQEAgLTIzMCw2ICsyMzYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgpAQCAtMjQ3LDYgKzI1NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Db29raWVDb21tZW50VHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvQ29va2llQ29tbWVudFR5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyMWQzZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvQ29va2llQ29tbWVudFR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogQ29va2llQ29tbWVudFR5cGVJbXBsLmphdmEsdiAxLjEgMjAwOS8xMC8xNSAxODo1MjowNSBjYW5kZXJzb24gRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29tbWVudFR5cGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29va2llIENvbW1lbnQgVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Db29raWVDb21tZW50VHlwZUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ29va2llQ29tbWVudFR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDb29raWVDb21tZW50VHlwZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29va2llQ29tbWVudFR5cGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5DT09LSUVfQ09NTUVOVF9UWVBFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKKwkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7CisJCXZhbHVlID0gbmV3VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuQ09PS0lFX0NPTU1FTlRfVFlQRV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09NTUVOVF9UWVBFX19WQUxVRToKKwkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9DT01NRU5UX1RZUEVfX1ZBTFVFOgorCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTU1FTlRfVFlQRV9fVkFMVUU6CisJCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9DT01NRU5UX1RZUEVfX1ZBTFVFOgorCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQodmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Db29raWVDb21tZW50VHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvQ29va2llQ29uZmlnVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvQ29va2llQ29uZmlnVHlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTJiNWRiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Db29raWVDb25maWdUeXBlSW1wbC5qYXZhCkBAIC0wLDAgKzEsNjgyIEBACisvKioKKyAqIDxjb3B5cmlnaHQ+CisgKiA8L2NvcHlyaWdodD4KKyAqCisgKiAkSWQ6IENvb2tpZUNvbmZpZ1R5cGVJbXBsLmphdmEsdiAxLjEgMjAwOS8xMC8xNSAxODo1MjowNSBjYW5kZXJzb24gRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbW1lbnRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llRG9tYWluVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVOYW1lVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVQYXRoVHlwZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db29raWUgQ29uZmlnIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQ29va2llQ29uZmlnVHlwZUltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Db29raWVDb25maWdUeXBlSW1wbCNnZXREb21haW4gPGVtPkRvbWFpbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Db29raWVDb25maWdUeXBlSW1wbCNnZXRQYXRoIDxlbT5QYXRoPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZUNvbmZpZ1R5cGVJbXBsI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQ29va2llQ29uZmlnVHlwZUltcGwjaXNIdHRwT25seSA8ZW0+SHR0cCBPbmx5PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZUNvbmZpZ1R5cGVJbXBsI2lzU2VjdXJlIDxlbT5TZWN1cmU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQ29va2llQ29uZmlnVHlwZUltcGwjZ2V0TWF4QWdlIDxlbT5NYXggQWdlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZUNvbmZpZ1R5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENvb2tpZUNvbmZpZ1R5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDb29raWVDb25maWdUeXBlIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBDb29raWVOYW1lVHlwZSBuYW1lOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RG9tYWluKCkgPGVtPkRvbWFpbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0RG9tYWluKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29va2llRG9tYWluVHlwZSBkb21haW47CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXRoKCkgPGVtPlBhdGg8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBhdGgoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBDb29raWVQYXRoVHlwZSBwYXRoOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRDb21tZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29va2llQ29tbWVudFR5cGUgY29tbWVudDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0h0dHBPbmx5KCkgPGVtPkh0dHAgT25seTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNIdHRwT25seSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEhUVFBfT05MWV9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIdHRwT25seSgpIDxlbT5IdHRwIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzSHR0cE9ubHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGh0dHBPbmx5ID0gSFRUUF9PTkxZX0VERUZBVUxUOworCisJLyoqCisJICogVGhpcyBpcyB0cnVlIGlmIHRoZSBIdHRwIE9ubHkgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGh0dHBPbmx5RVNldDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NlY3VyZSgpIDxlbT5TZWN1cmU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2VjdXJlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0VDVVJFX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NlY3VyZSgpIDxlbT5TZWN1cmU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2VjdXJlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzZWN1cmUgPSBTRUNVUkVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNlY3VyZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2VjdXJlRVNldDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXhBZ2UoKSA8ZW0+TWF4IEFnZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWF4QWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTUFYX0FHRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXhBZ2UoKSA8ZW0+TWF4IEFnZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWF4QWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQmlnSW50ZWdlciBtYXhBZ2UgPSBNQVhfQUdFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29va2llQ29uZmlnVHlwZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLkNPT0tJRV9DT05GSUdfVFlQRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29va2llTmFtZVR5cGUgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TmFtZShDb29raWVOYW1lVHlwZSBuZXdOYW1lLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCUNvb2tpZU5hbWVUeXBlIG9sZE5hbWUgPSBuYW1lOworCQluYW1lID0gbmV3TmFtZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX05BTUUsIG9sZE5hbWUsIG5ld05hbWUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWUoQ29va2llTmFtZVR5cGUgbmV3TmFtZSkgeworCQlpZiAobmV3TmFtZSAhPSBuYW1lKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChuYW1lICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5hbWUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fTkFNRSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3TmFtZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdOYW1lKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX05BTUUsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0TmFtZShuZXdOYW1lLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19OQU1FLCBuZXdOYW1lLCBuZXdOYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvb2tpZURvbWFpblR5cGUgZ2V0RG9tYWluKCkgeworCQlyZXR1cm4gZG9tYWluOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERvbWFpbihDb29raWVEb21haW5UeXBlIG5ld0RvbWFpbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlDb29raWVEb21haW5UeXBlIG9sZERvbWFpbiA9IGRvbWFpbjsKKwkJZG9tYWluID0gbmV3RG9tYWluOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fRE9NQUlOLCBvbGREb21haW4sIG5ld0RvbWFpbik7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RG9tYWluKENvb2tpZURvbWFpblR5cGUgbmV3RG9tYWluKSB7CisJCWlmIChuZXdEb21haW4gIT0gZG9tYWluKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChkb21haW4gIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZG9tYWluKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX0RPTUFJTiwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3RG9tYWluICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0RvbWFpbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19ET01BSU4sIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0RG9tYWluKG5ld0RvbWFpbiwgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fRE9NQUlOLCBuZXdEb21haW4sIG5ld0RvbWFpbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb29raWVQYXRoVHlwZSBnZXRQYXRoKCkgeworCQlyZXR1cm4gcGF0aDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQYXRoKENvb2tpZVBhdGhUeXBlIG5ld1BhdGgsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJQ29va2llUGF0aFR5cGUgb2xkUGF0aCA9IHBhdGg7CisJCXBhdGggPSBuZXdQYXRoOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fUEFUSCwgb2xkUGF0aCwgbmV3UGF0aCk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UGF0aChDb29raWVQYXRoVHlwZSBuZXdQYXRoKSB7CisJCWlmIChuZXdQYXRoICE9IHBhdGgpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKHBhdGggIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcGF0aCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19QQVRILCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdQYXRoICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1BhdGgpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fUEFUSCwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRQYXRoKG5ld1BhdGgsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX1BBVEgsIG5ld1BhdGgsIG5ld1BhdGgpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29va2llQ29tbWVudFR5cGUgZ2V0Q29tbWVudCgpIHsKKwkJcmV0dXJuIGNvbW1lbnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29tbWVudChDb29raWVDb21tZW50VHlwZSBuZXdDb21tZW50LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCUNvb2tpZUNvbW1lbnRUeXBlIG9sZENvbW1lbnQgPSBjb21tZW50OworCQljb21tZW50ID0gbmV3Q29tbWVudDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX0NPTU1FTlQsIG9sZENvbW1lbnQsIG5ld0NvbW1lbnQpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoQ29va2llQ29tbWVudFR5cGUgbmV3Q29tbWVudCkgeworCQlpZiAobmV3Q29tbWVudCAhPSBjb21tZW50KSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChjb21tZW50ICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbW1lbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fQ09NTUVOVCwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3Q29tbWVudCAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb21tZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX0NPTU1FTlQsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0Q29tbWVudChuZXdDb21tZW50LCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19DT01NRU5ULCBuZXdDb21tZW50LCBuZXdDb21tZW50KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNIdHRwT25seSgpIHsKKwkJcmV0dXJuIGh0dHBPbmx5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEh0dHBPbmx5KGJvb2xlYW4gbmV3SHR0cE9ubHkpIHsKKwkJYm9vbGVhbiBvbGRIdHRwT25seSA9IGh0dHBPbmx5OworCQlodHRwT25seSA9IG5ld0h0dHBPbmx5OworCQlib29sZWFuIG9sZEh0dHBPbmx5RVNldCA9IGh0dHBPbmx5RVNldDsKKwkJaHR0cE9ubHlFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX0hUVFBfT05MWSwgb2xkSHR0cE9ubHksIGh0dHBPbmx5LCAhb2xkSHR0cE9ubHlFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdW5zZXRIdHRwT25seSgpIHsKKwkJYm9vbGVhbiBvbGRIdHRwT25seSA9IGh0dHBPbmx5OworCQlib29sZWFuIG9sZEh0dHBPbmx5RVNldCA9IGh0dHBPbmx5RVNldDsKKwkJaHR0cE9ubHkgPSBIVFRQX09OTFlfRURFRkFVTFQ7CisJCWh0dHBPbmx5RVNldCA9IGZhbHNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19IVFRQX09OTFksIG9sZEh0dHBPbmx5LCBIVFRQX09OTFlfRURFRkFVTFQsIG9sZEh0dHBPbmx5RVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0SHR0cE9ubHkoKSB7CisJCXJldHVybiBodHRwT25seUVTZXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisJCXJldHVybiBzZWN1cmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U2VjdXJlKGJvb2xlYW4gbmV3U2VjdXJlKSB7CisJCWJvb2xlYW4gb2xkU2VjdXJlID0gc2VjdXJlOworCQlzZWN1cmUgPSBuZXdTZWN1cmU7CisJCWJvb2xlYW4gb2xkU2VjdXJlRVNldCA9IHNlY3VyZUVTZXQ7CisJCXNlY3VyZUVTZXQgPSB0cnVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fU0VDVVJFLCBvbGRTZWN1cmUsIHNlY3VyZSwgIW9sZFNlY3VyZUVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldFNlY3VyZSgpIHsKKwkJYm9vbGVhbiBvbGRTZWN1cmUgPSBzZWN1cmU7CisJCWJvb2xlYW4gb2xkU2VjdXJlRVNldCA9IHNlY3VyZUVTZXQ7CisJCXNlY3VyZSA9IFNFQ1VSRV9FREVGQVVMVDsKKwkJc2VjdXJlRVNldCA9IGZhbHNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19TRUNVUkUsIG9sZFNlY3VyZSwgU0VDVVJFX0VERUZBVUxULCBvbGRTZWN1cmVFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZXRTZWN1cmUoKSB7CisJCXJldHVybiBzZWN1cmVFU2V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCaWdJbnRlZ2VyIGdldE1heEFnZSgpIHsKKwkJcmV0dXJuIG1heEFnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXhBZ2UoQmlnSW50ZWdlciBuZXdNYXhBZ2UpIHsKKwkJQmlnSW50ZWdlciBvbGRNYXhBZ2UgPSBtYXhBZ2U7CisJCW1heEFnZSA9IG5ld01heEFnZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX01BWF9BR0UsIG9sZE1heEFnZSwgbWF4QWdlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgeworCQlTdHJpbmcgb2xkSWQgPSBpZDsKKwkJaWQgPSBuZXdJZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX0lELCBvbGRJZCwgaWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19OQU1FOgorCQkJCXJldHVybiBiYXNpY1NldE5hbWUobnVsbCwgbXNncyk7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19ET01BSU46CisJCQkJcmV0dXJuIGJhc2ljU2V0RG9tYWluKG51bGwsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fUEFUSDoKKwkJCQlyZXR1cm4gYmFzaWNTZXRQYXRoKG51bGwsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fQ09NTUVOVDoKKwkJCQlyZXR1cm4gYmFzaWNTZXRDb21tZW50KG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19OQU1FOgorCQkJCXJldHVybiBnZXROYW1lKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19ET01BSU46CisJCQkJcmV0dXJuIGdldERvbWFpbigpOworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fUEFUSDoKKwkJCQlyZXR1cm4gZ2V0UGF0aCgpOworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fQ09NTUVOVDoKKwkJCQlyZXR1cm4gZ2V0Q29tbWVudCgpOworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fSFRUUF9PTkxZOgorCQkJCXJldHVybiBpc0h0dHBPbmx5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19TRUNVUkU6CisJCQkJcmV0dXJuIGlzU2VjdXJlKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19NQVhfQUdFOgorCQkJCXJldHVybiBnZXRNYXhBZ2UoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX0lEOgorCQkJCXJldHVybiBnZXRJZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19OQU1FOgorCQkJCXNldE5hbWUoKENvb2tpZU5hbWVUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19ET01BSU46CisJCQkJc2V0RG9tYWluKChDb29raWVEb21haW5UeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19QQVRIOgorCQkJCXNldFBhdGgoKENvb2tpZVBhdGhUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19DT01NRU5UOgorCQkJCXNldENvbW1lbnQoKENvb2tpZUNvbW1lbnRUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19IVFRQX09OTFk6CisJCQkJc2V0SHR0cE9ubHkoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX1NFQ1VSRToKKwkJCQlzZXRTZWN1cmUoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX01BWF9BR0U6CisJCQkJc2V0TWF4QWdlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19JRDoKKwkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fTkFNRToKKwkJCQlzZXROYW1lKChDb29raWVOYW1lVHlwZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19ET01BSU46CisJCQkJc2V0RG9tYWluKChDb29raWVEb21haW5UeXBlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX1BBVEg6CisJCQkJc2V0UGF0aCgoQ29va2llUGF0aFR5cGUpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRV9fQ09NTUVOVDoKKwkJCQlzZXRDb21tZW50KChDb29raWVDb21tZW50VHlwZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19IVFRQX09OTFk6CisJCQkJdW5zZXRIdHRwT25seSgpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX1NFQ1VSRToKKwkJCQl1bnNldFNlY3VyZSgpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX01BWF9BR0U6CisJCQkJc2V0TWF4QWdlKE1BWF9BR0VfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX0lEOgorCQkJCXNldElkKElEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX05BTUU6CisJCQkJcmV0dXJuIG5hbWUgIT0gbnVsbDsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX0RPTUFJTjoKKwkJCQlyZXR1cm4gZG9tYWluICE9IG51bGw7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19QQVRIOgorCQkJCXJldHVybiBwYXRoICE9IG51bGw7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19DT01NRU5UOgorCQkJCXJldHVybiBjb21tZW50ICE9IG51bGw7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19IVFRQX09OTFk6CisJCQkJcmV0dXJuIGlzU2V0SHR0cE9ubHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX1NFQ1VSRToKKwkJCQlyZXR1cm4gaXNTZXRTZWN1cmUoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEVfX01BWF9BR0U6CisJCQkJcmV0dXJuIE1BWF9BR0VfRURFRkFVTFQgPT0gbnVsbCA/IG1heEFnZSAhPSBudWxsIDogIU1BWF9BR0VfRURFRkFVTFQuZXF1YWxzKG1heEFnZSk7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTkZJR19UWVBFX19JRDoKKwkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGh0dHBPbmx5OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoaHR0cE9ubHlFU2V0KSByZXN1bHQuYXBwZW5kKGh0dHBPbmx5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBzZWN1cmU6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChzZWN1cmVFU2V0KSByZXN1bHQuYXBwZW5kKHNlY3VyZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgbWF4QWdlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKG1heEFnZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoaWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Db29raWVDb25maWdUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Db29raWVEb21haW5UeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Db29raWVEb21haW5UeXBlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MzM0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0Nvb2tpZURvbWFpblR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogQ29va2llRG9tYWluVHlwZUltcGwuamF2YSx2IDEuMSAyMDA5LzEwLzE1IDE4OjUyOjA1IGNhbmRlcnNvbiBFeHAgJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVEb21haW5UeXBlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvb2tpZSBEb21haW4gVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Db29raWVEb21haW5UeXBlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDb29raWVEb21haW5UeXBlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ29va2llRG9tYWluVHlwZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29va2llRG9tYWluVHlwZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLkNPT0tJRV9ET01BSU5fVFlQRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7CisJCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOworCQl2YWx1ZSA9IG5ld1ZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkNPT0tJRV9ET01BSU5fVFlQRV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfRE9NQUlOX1RZUEVfX1ZBTFVFOgorCQkJCXJldHVybiBnZXRWYWx1ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0RPTUFJTl9UWVBFX19WQUxVRToKKwkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9ET01BSU5fVFlQRV9fVkFMVUU6CisJCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9ET01BSU5fVFlQRV9fVkFMVUU6CisJCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0Nvb2tpZURvbWFpblR5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0Nvb2tpZU5hbWVUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Db29raWVOYW1lVHlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzhlNjAxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Db29raWVOYW1lVHlwZUltcGwuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkOiBDb29raWVOYW1lVHlwZUltcGwuamF2YSx2IDEuMSAyMDA5LzEwLzE1IDE4OjUyOjA1IGNhbmRlcnNvbiBFeHAgJAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVOYW1lVHlwZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db29raWUgTmFtZSBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZU5hbWVUeXBlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDb29raWVOYW1lVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENvb2tpZU5hbWVUeXBlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDb29raWVOYW1lVHlwZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLkNPT0tJRV9OQU1FX1RZUEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgeworCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKKwkJdmFsdWUgPSBuZXdWYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5DT09LSUVfTkFNRV9UWVBFX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9OQU1FX1RZUEVfX1ZBTFVFOgorCQkJCXJldHVybiBnZXRWYWx1ZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX05BTUVfVFlQRV9fVkFMVUU6CisJCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfTkFNRV9UWVBFX19WQUxVRToKKwkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX05BTUVfVFlQRV9fVkFMVUU6CisJCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0Nvb2tpZU5hbWVUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Db29raWVQYXRoVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvQ29va2llUGF0aFR5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjMmEwZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvQ29va2llUGF0aFR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogQ29va2llUGF0aFR5cGVJbXBsLmphdmEsdiAxLjEgMjAwOS8xMC8xNSAxODo1MjowNSBjYW5kZXJzb24gRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llUGF0aFR5cGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29va2llIFBhdGggVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Db29raWVQYXRoVHlwZUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ29va2llUGF0aFR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBDb29raWVQYXRoVHlwZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ29va2llUGF0aFR5cGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5DT09LSUVfUEFUSF9UWVBFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKKwkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7CisJCXZhbHVlID0gbmV3VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuQ09PS0lFX1BBVEhfVFlQRV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfUEFUSF9UWVBFX19WQUxVRToKKwkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9QQVRIX1RZUEVfX1ZBTFVFOgorCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX1BBVEhfVFlQRV9fVkFMVUU6CisJCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9QQVRIX1RZUEVfX1ZBTFVFOgorCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQodmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Db29raWVQYXRoVHlwZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRXJyb3JQYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9FcnJvclBhZ2VJbXBsLmphdmEKaW5kZXggMmVlZDgzNy4uOWJlZDQ1MSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9FcnJvclBhZ2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9FcnJvclBhZ2VJbXBsLmphdmEKQEAgLTEzNCw2ICsxMzQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuRVJST1JfUEFHRTsKIAl9CkBAIC0yMjcsNiArMjI4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0VSUk9SX0NPREU6CkBAIC0yNDYsNiArMjQ4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5FUlJPUl9QQUdFX19FUlJPUl9DT0RFOgpAQCAtMjY5LDYgKzI3Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRV9fRVJST1JfQ09ERToKQEAgLTI5Miw2ICsyOTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0VfX0VSUk9SX0NPREU6CkBAIC0zMTEsNiArMzE2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0ZpbHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRmlsdGVySW1wbC5qYXZhCmluZGV4IGFkOTgxNDcuLjZjZTNkZmEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRmlsdGVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRmlsdGVySW1wbC5qYXZhCkBAIC00OCw2ICs0OCw3IEBACiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsI2dldEZpbHRlck5hbWUgPGVtPkZpbHRlciBOYW1lPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlckltcGwjZ2V0RmlsdGVyQ2xhc3MgPGVtPkZpbHRlciBDbGFzczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsI2lzQXN5bmNTdXBwb3J0ZWQgPGVtPkFzeW5jIFN1cHBvcnRlZDwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJJbXBsI2dldEluaXRQYXJhbXMgPGVtPkluaXQgUGFyYW1zPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkZpbHRlckltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CkBAIC02NCw3ICs2NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRlc2NyaXB0aW9ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERlc2NyaXB0aW9uPiBkZXNjcmlwdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwbGF5TmFtZXMoKSA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03NCw3ICs3NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERpc3BsYXlOYW1lPiBkaXNwbGF5TmFtZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJY29ucygpIDxlbT5JY29uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC04NCw3ICs4NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGljb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8SWNvbj4gaWNvbnM7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmlsdGVyTmFtZSgpIDxlbT5GaWx0ZXIgTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTI3LDYgKzEyOCwzNSBAQAogCXByb3RlY3RlZCBTdHJpbmcgZmlsdGVyQ2xhc3MgPSBGSUxURVJfQ0xBU1NfRURFRkFVTFQ7CiAKIAkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBc3luY1N1cHBvcnRlZCgpIDxlbT5Bc3luYyBTdXBwb3J0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzQXN5bmNTdXBwb3J0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBU1lOQ19TVVBQT1JURURfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXN5bmNTdXBwb3J0ZWQoKSA8ZW0+QXN5bmMgU3VwcG9ydGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0FzeW5jU3VwcG9ydGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhc3luY1N1cHBvcnRlZCA9IEFTWU5DX1NVUFBPUlRFRF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQXN5bmMgU3VwcG9ydGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhc3luY1N1cHBvcnRlZEVTZXQ7CisKKwkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0UGFyYW1zKCkgPGVtPkluaXQgUGFyYW1zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMTM0LDcgKzE2NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGluaXRQYXJhbXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxQYXJhbVZhbHVlPiBpbml0UGFyYW1zOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNzAsNiArMjAwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLkZJTFRFUjsKIAl9CkBAIC0xNzksOSArMjEwLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgeworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CiAJCWlmIChkZXNjcmlwdGlvbnMgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLkZJTFRFUl9fREVTQ1JJUFRJT05TKTsKKwkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuRklMVEVSX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMTkxLDkgKzIyMiw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKKwlwdWJsaWMgTGlzdDxEaXNwbGF5TmFtZT4gZ2V0RGlzcGxheU5hbWVzKCkgewogCQlpZiAoZGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWRpc3BsYXlOYW1lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5GSUxURVJfX0RJU1BMQVlfTkFNRVMpOworCQkJZGlzcGxheU5hbWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PERpc3BsYXlOYW1lPihEaXNwbGF5TmFtZS5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5GSUxURVJfX0RJU1BMQVlfTkFNRVMpOwogCQl9CiAJCXJldHVybiBkaXNwbGF5TmFtZXM7CiAJfQpAQCAtMjAzLDkgKzIzNCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgeworCXB1YmxpYyBMaXN0PEljb24+IGdldEljb25zKCkgewogCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5GSUxURVJfX0lDT05TKTsKKwkJCWljb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEljb24+KEljb24uY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuRklMVEVSX19JQ09OUyk7CiAJCX0KIAkJcmV0dXJuIGljb25zOwogCX0KQEAgLTI1Nyw5ICsyODgsNTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SW5pdFBhcmFtcygpIHsKKwlwdWJsaWMgYm9vbGVhbiBpc0FzeW5jU3VwcG9ydGVkKCkgeworCQlyZXR1cm4gYXN5bmNTdXBwb3J0ZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QXN5bmNTdXBwb3J0ZWQoYm9vbGVhbiBuZXdBc3luY1N1cHBvcnRlZCkgeworCQlib29sZWFuIG9sZEFzeW5jU3VwcG9ydGVkID0gYXN5bmNTdXBwb3J0ZWQ7CisJCWFzeW5jU3VwcG9ydGVkID0gbmV3QXN5bmNTdXBwb3J0ZWQ7CisJCWJvb2xlYW4gb2xkQXN5bmNTdXBwb3J0ZWRFU2V0ID0gYXN5bmNTdXBwb3J0ZWRFU2V0OworCQlhc3luY1N1cHBvcnRlZEVTZXQgPSB0cnVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLkZJTFRFUl9fQVNZTkNfU1VQUE9SVEVELCBvbGRBc3luY1N1cHBvcnRlZCwgYXN5bmNTdXBwb3J0ZWQsICFvbGRBc3luY1N1cHBvcnRlZEVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldEFzeW5jU3VwcG9ydGVkKCkgeworCQlib29sZWFuIG9sZEFzeW5jU3VwcG9ydGVkID0gYXN5bmNTdXBwb3J0ZWQ7CisJCWJvb2xlYW4gb2xkQXN5bmNTdXBwb3J0ZWRFU2V0ID0gYXN5bmNTdXBwb3J0ZWRFU2V0OworCQlhc3luY1N1cHBvcnRlZCA9IEFTWU5DX1NVUFBPUlRFRF9FREVGQVVMVDsKKwkJYXN5bmNTdXBwb3J0ZWRFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgV2ViUGFja2FnZS5GSUxURVJfX0FTWU5DX1NVUFBPUlRFRCwgb2xkQXN5bmNTdXBwb3J0ZWQsIEFTWU5DX1NVUFBPUlRFRF9FREVGQVVMVCwgb2xkQXN5bmNTdXBwb3J0ZWRFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZXRBc3luY1N1cHBvcnRlZCgpIHsKKwkJcmV0dXJuIGFzeW5jU3VwcG9ydGVkRVNldDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxQYXJhbVZhbHVlPiBnZXRJbml0UGFyYW1zKCkgewogCQlpZiAoaW5pdFBhcmFtcyA9PSBudWxsKSB7Ci0JCQlpbml0UGFyYW1zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFBhcmFtVmFsdWUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUyk7CisJCQlpbml0UGFyYW1zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFBhcmFtVmFsdWU+KFBhcmFtVmFsdWUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUyk7CiAJCX0KIAkJcmV0dXJuIGluaXRQYXJhbXM7CiAJfQpAQCAtMjkwLDE2ICszNjcsMTcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19JQ09OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SW5pdFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJbml0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtMzA5LDYgKzM4Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0RFU0NSSVBUSU9OUzoKQEAgLTMyMSw2ICs0MDAsOCBAQAogCQkJCXJldHVybiBnZXRGaWx0ZXJOYW1lKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19GSUxURVJfQ0xBU1M6CiAJCQkJcmV0dXJuIGdldEZpbHRlckNsYXNzKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19BU1lOQ19TVVBQT1JURUQ6CisJCQkJcmV0dXJuIGlzQXN5bmNTdXBwb3J0ZWQoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1TOgogCQkJCXJldHVybiBnZXRJbml0UGFyYW1zKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19JRDoKQEAgLTMzNCwxOSArNDE1LDIxIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19ESVNQTEFZX05BTUVTOgogCQkJCWdldERpc3BsYXlOYW1lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzcGxheU5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERpc3BsYXlOYW1lPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fSUNPTlM6CiAJCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSWNvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9OQU1FOgogCQkJCXNldEZpbHRlck5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0zNTQsOSArNDM3LDEyIEBACiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19GSUxURVJfQ0xBU1M6CiAJCQkJc2V0RmlsdGVyQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fQVNZTkNfU1VQUE9SVEVEOgorCQkJCXNldEFzeW5jU3VwcG9ydGVkKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUzoKIAkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlnZXRJbml0UGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRJbml0UGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQYXJhbVZhbHVlPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0zNzAsNiArNDU2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0RFU0NSSVBUSU9OUzoKQEAgLTM4Nyw2ICs0NzQsOSBAQAogCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fRklMVEVSX0NMQVNTOgogCQkJCXNldEZpbHRlckNsYXNzKEZJTFRFUl9DTEFTU19FREVGQVVMVCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fQVNZTkNfU1VQUE9SVEVEOgorCQkJCXVuc2V0QXN5bmNTdXBwb3J0ZWQoKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUzoKIAkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CkBAIC00MDIsNiArNDkyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0RFU0NSSVBUSU9OUzoKQEAgLTQxNCw2ICs1MDUsOCBAQAogCQkJCXJldHVybiBGSUxURVJfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZmlsdGVyTmFtZSAhPSBudWxsIDogIUZJTFRFUl9OQU1FX0VERUZBVUxULmVxdWFscyhmaWx0ZXJOYW1lKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0ZJTFRFUl9DTEFTUzoKIAkJCQlyZXR1cm4gRklMVEVSX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBmaWx0ZXJDbGFzcyAhPSBudWxsIDogIUZJTFRFUl9DTEFTU19FREVGQVVMVC5lcXVhbHMoZmlsdGVyQ2xhc3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9fQVNZTkNfU1VQUE9SVEVEOgorCQkJCXJldHVybiBpc1NldEFzeW5jU3VwcG9ydGVkKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX19JTklUX1BBUkFNUzoKIAkJCQlyZXR1cm4gaW5pdFBhcmFtcyAhPSBudWxsICYmICFpbml0UGFyYW1zLmlzRW1wdHkoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfX0lEOgpAQCAtNDI3LDYgKzUyMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApAQCAtNDM1LDYgKzUyOSw4IEBACiAJCXJlc3VsdC5hcHBlbmQoZmlsdGVyTmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgZmlsdGVyQ2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZmlsdGVyQ2xhc3MpOworCQlyZXN1bHQuYXBwZW5kKCIsIGFzeW5jU3VwcG9ydGVkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoYXN5bmNTdXBwb3J0ZWRFU2V0KSByZXN1bHQuYXBwZW5kKGFzeW5jU3VwcG9ydGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRmlsdGVyTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRmlsdGVyTWFwcGluZ0ltcGwuamF2YQppbmRleCA1OTQxNWE3Li41ZTQyY2ZhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0ZpbHRlck1hcHBpbmdJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9GaWx0ZXJNYXBwaW5nSW1wbC5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlck1hcHBpbmc7CiAKQEAgLTgxLDcgKzgyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cCA9IG51bGw7CisJcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNwYXRjaGVycygpIDxlbT5EaXNwYXRjaGVyczwvZW0+fScgYXR0cmlidXRlIGxpc3QuCkBAIC05MSw3ICs5Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BhdGNoZXJzID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGlzcGF0Y2hlclR5cGU+IGRpc3BhdGNoZXJzOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMjcsNiArMTI4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLkZJTFRFUl9NQVBQSU5HOwogCX0KQEAgLTE2OSw4ICsxNzEsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRVcmxQYXR0ZXJucygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOUyk7CisJcHVibGljIExpc3Q8VXJsUGF0dGVyblR5cGU+IGdldFVybFBhdHRlcm5zKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOUyk7CiAJfQogCiAJLyoqCkBAIC0xNzgsOCArMTgwLDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0U2VydmxldE5hbWVzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5GSUxURVJfTUFQUElOR19fU0VSVkxFVF9OQU1FUyk7CisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRTZXJ2bGV0TmFtZXMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5GSUxURVJfTUFQUElOR19fU0VSVkxFVF9OQU1FUyk7CiAJfQogCiAJLyoqCkBAIC0xODcsOSArMTg5LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGlzcGF0Y2hlcnMoKSB7CisJcHVibGljIExpc3Q8RGlzcGF0Y2hlclR5cGU+IGdldERpc3BhdGNoZXJzKCkgewogCQlpZiAoZGlzcGF0Y2hlcnMgPT0gbnVsbCkgewotCQkJZGlzcGF0Y2hlcnMgPSBuZXcgRURhdGFUeXBlRUxpc3QoRGlzcGF0Y2hlclR5cGUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJTKTsKKwkJCWRpc3BhdGNoZXJzID0gbmV3IEVEYXRhVHlwZUVMaXN0PERpc3BhdGNoZXJUeXBlPihEaXNwYXRjaGVyVHlwZS5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fRElTUEFUQ0hFUlMpOwogCQl9CiAJCXJldHVybiBkaXNwYXRjaGVyczsKIAl9CkBAIC0yMjAsMTIgKzIyMiwxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0dST1VQOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0R3JvdXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRVcmxQYXR0ZXJucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRVcmxQYXR0ZXJucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTIzNSw2ICsyMzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0ZJTFRFUl9OQU1FOgpAQCAtMjU5LDYgKzI2Myw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0ZJTFRFUl9OQU1FOgpAQCAtMjY5LDE1ICsyNzUsMTUgQEAKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOUzoKIAkJCQlnZXRVcmxQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQkJZ2V0VXJsUGF0dGVybnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFVybFBhdHRlcm5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBVcmxQYXR0ZXJuVHlwZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElOR19fU0VSVkxFVF9OQU1FUzoKIAkJCQlnZXRTZXJ2bGV0TmFtZXMoKS5jbGVhcigpOwotCQkJCWdldFNlcnZsZXROYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0U2VydmxldE5hbWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkdfX0RJU1BBVENIRVJTOgogCQkJCWdldERpc3BhdGNoZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwYXRjaGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0RGlzcGF0Y2hlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERpc3BhdGNoZXJUeXBlPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19JRDoKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTI5MSw2ICsyOTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19GSUxURVJfTkFNRToKQEAgLTMyMCw2ICszMjcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19GSUxURVJfTkFNRToKQEAgLTM0Myw2ICszNTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvRm9ybUxvZ2luQ29uZmlnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Gb3JtTG9naW5Db25maWdJbXBsLmphdmEKaW5kZXggZDg0NDg1Ni4uNmMwMjhiYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Gb3JtTG9naW5Db25maWdJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Gb3JtTG9naW5Db25maWdJbXBsLmphdmEKQEAgLTExMSw2ICsxMTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuRk9STV9MT0dJTl9DT05GSUc7CiAJfQpAQCAtMTgzLDYgKzE4NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFOgpAQCAtMjAwLDYgKzIwMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0ZPUk1fTE9HSU5fUEFHRToKQEAgLTIyMCw2ICsyMjMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0U6CkBAIC0yNDAsNiArMjQ0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9QQUdFOgpAQCAtMjU3LDYgKzI2Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Mb2NhbGVFbmNvZGluZ01hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0xvY2FsZUVuY29kaW5nTWFwcGluZ0ltcGwuamF2YQppbmRleCBiZjY4ZjIxLi5lM2JmYjE2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0xvY2FsZUVuY29kaW5nTWFwcGluZ0ltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0xvY2FsZUVuY29kaW5nTWFwcGluZ0ltcGwuamF2YQpAQCAtMTExLDYgKzExMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5MT0NBTEVfRU5DT0RJTkdfTUFQUElORzsKIAl9CkBAIC0xODMsNiArMTg0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19MT0NBTEU6CkBAIC0yMDAsNiArMjAyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFOgpAQCAtMjIwLDYgKzIyMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRToKQEAgLTI0MCw2ICsyNDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX19MT0NBTEU6CkBAIC0yNTcsNiArMjYyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0xvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0xvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RJbXBsLmphdmEKaW5kZXggMjI1ZGE0Ny4uOWMyM2RkMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwuamF2YQpAQCAtNTUsNyArNTUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBsb2NhbEVuY29kaW5nTWFwcGluZ3MgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxMb2NhbGVFbmNvZGluZ01hcHBpbmc+IGxvY2FsRW5jb2RpbmdNYXBwaW5nczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtOTEsNiArOTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVDsKIAl9CkBAIC0xMDAsOSArMTAxLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkgeworCXB1YmxpYyBMaXN0PExvY2FsZUVuY29kaW5nTWFwcGluZz4gZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkgewogCQlpZiAobG9jYWxFbmNvZGluZ01hcHBpbmdzID09IG51bGwpIHsKLQkJCWxvY2FsRW5jb2RpbmdNYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChMb2NhbGVFbmNvZGluZ01hcHBpbmcuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1MpOworCQkJbG9jYWxFbmNvZGluZ01hcHBpbmdzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PExvY2FsZUVuY29kaW5nTWFwcGluZz4oTG9jYWxlRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTKTsKIAkJfQogCQlyZXR1cm4gbG9jYWxFbmNvZGluZ01hcHBpbmdzOwogCX0KQEAgLTEzMywxMCArMTM0LDExIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC0xNDYsNiArMTQ4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgpAQCAtMTYxLDExICsxNjQsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUzoKIAkJCQlnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldExvY2FsRW5jb2RpbmdNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBMb2NhbGVFbmNvZGluZ01hcHBpbmc+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVF9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0xNzksNiArMTg0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5MT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUzoKQEAgLTE5Niw2ICsyMDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgpAQCAtMjExLDYgKzIxOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Mb2dpbkNvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvTG9naW5Db25maWdJbXBsLmphdmEKaW5kZXggNTY0YTM4ZS4uMTFhNzJkOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Mb2dpbkNvbmZpZ0ltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL0xvZ2luQ29uZmlnSW1wbC5qYXZhCkBAIC04OSw3ICs4OSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEZvcm1Mb2dpbkNvbmZpZyBmb3JtTG9naW5Db25maWcgPSBudWxsOworCXByb3RlY3RlZCBGb3JtTG9naW5Db25maWcgZm9ybUxvZ2luQ29uZmlnOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMjUsNiArMTI1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLkxPR0lOX0NPTkZJRzsKIAl9CkBAIC0yNDAsNiArMjQxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fRk9STV9MT0dJTl9DT05GSUc6CkBAIC0yNTMsNiArMjU1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0Q6CkBAIC0yNzIsNiArMjc1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9EOgpAQCAtMjk1LDYgKzI5OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRDoKQEAgLTMxOCw2ICszMjMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkxPR0lOX0NPTkZJR19fQVVUSF9NRVRIT0Q6CkBAIC0zMzcsNiArMzQzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL01pbWVNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9NaW1lTWFwcGluZ0ltcGwuamF2YQppbmRleCA5ZGJmNjlmLi40ZTMxMGQ4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL01pbWVNYXBwaW5nSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvTWltZU1hcHBpbmdJbXBsLmphdmEKQEAgLTExMSw2ICsxMTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuTUlNRV9NQVBQSU5HOwogCX0KQEAgLTE4Myw2ICsxODQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT046CkBAIC0yMDAsNiArMjAyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5NSU1FX01BUFBJTkdfX0VYVEVOU0lPTjoKQEAgLTIyMCw2ICsyMjMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfTUFQUElOR19fRVhURU5TSU9OOgpAQCAtMjQwLDYgKzI0NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT046CkBAIC0yNTcsNiArMjYyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL011bHRpcGFydENvbmZpZ1R5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL011bHRpcGFydENvbmZpZ1R5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkOGViZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvTXVsdGlwYXJ0Q29uZmlnVHlwZUltcGwuamF2YQpAQCAtMCwwICsxLDQwMCBAQAorLyoqCisgKiA8Y29weXJpZ2h0PgorICogPC9jb3B5cmlnaHQ+CisgKgorICogJElkOiBNdWx0aXBhcnRDb25maWdUeXBlSW1wbC5qYXZhLHYgMS4xIDIwMDkvMTAvMTUgMTg6NTI6MDUgY2FuZGVyc29uIEV4cCAkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTXVsdGlwYXJ0Q29uZmlnVHlwZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NdWx0aXBhcnQgQ29uZmlnIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTXVsdGlwYXJ0Q29uZmlnVHlwZUltcGwjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLk11bHRpcGFydENvbmZpZ1R5cGVJbXBsI2dldE1heEZpbGVTaXplIDxlbT5NYXggRmlsZSBTaXplPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLk11bHRpcGFydENvbmZpZ1R5cGVJbXBsI2dldE1heFJlcXVlc3RTaXplIDxlbT5NYXggUmVxdWVzdCBTaXplPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLk11bHRpcGFydENvbmZpZ1R5cGVJbXBsI2dldEZpbGVTaXplVGhyZXNob2xkIDxlbT5GaWxlIFNpemUgVGhyZXNob2xkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgTXVsdGlwYXJ0Q29uZmlnVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE11bHRpcGFydENvbmZpZ1R5cGUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TG9jYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRMb2NhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvbiA9IExPQ0FUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1heEZpbGVTaXplKCkgPGVtPk1heCBGaWxlIFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1heEZpbGVTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgTUFYX0ZJTEVfU0laRV9FREVGQVVMVCA9IDBMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4RmlsZVNpemUoKSA8ZW0+TWF4IEZpbGUgU2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWF4RmlsZVNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBsb25nIG1heEZpbGVTaXplID0gTUFYX0ZJTEVfU0laRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTWF4IEZpbGUgU2l6ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gbWF4RmlsZVNpemVFU2V0OworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1heFJlcXVlc3RTaXplKCkgPGVtPk1heCBSZXF1ZXN0IFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1heFJlcXVlc3RTaXplKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgTUFYX1JFUVVFU1RfU0laRV9FREVGQVVMVCA9IDBMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4UmVxdWVzdFNpemUoKSA8ZW0+TWF4IFJlcXVlc3QgU2l6ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWF4UmVxdWVzdFNpemUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBsb25nIG1heFJlcXVlc3RTaXplID0gTUFYX1JFUVVFU1RfU0laRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTWF4IFJlcXVlc3QgU2l6ZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gbWF4UmVxdWVzdFNpemVFU2V0OworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbGVTaXplVGhyZXNob2xkKCkgPGVtPkZpbGUgU2l6ZSBUaHJlc2hvbGQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEZpbGVTaXplVGhyZXNob2xkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRklMRV9TSVpFX1RIUkVTSE9MRF9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWxlU2l6ZVRocmVzaG9sZCgpIDxlbT5GaWxlIFNpemUgVGhyZXNob2xkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRGaWxlU2l6ZVRocmVzaG9sZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJpZ0ludGVnZXIgZmlsZVNpemVUaHJlc2hvbGQgPSBGSUxFX1NJWkVfVEhSRVNIT0xEX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE11bHRpcGFydENvbmZpZ1R5cGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5NVUxUSVBBUlRfQ09ORklHX1RZUEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKKwkJcmV0dXJuIGxvY2F0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbikgeworCQlTdHJpbmcgb2xkTG9jYXRpb24gPSBsb2NhdGlvbjsKKwkJbG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5NVUxUSVBBUlRfQ09ORklHX1RZUEVfX0xPQ0FUSU9OLCBvbGRMb2NhdGlvbiwgbG9jYXRpb24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgbG9uZyBnZXRNYXhGaWxlU2l6ZSgpIHsKKwkJcmV0dXJuIG1heEZpbGVTaXplOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1heEZpbGVTaXplKGxvbmcgbmV3TWF4RmlsZVNpemUpIHsKKwkJbG9uZyBvbGRNYXhGaWxlU2l6ZSA9IG1heEZpbGVTaXplOworCQltYXhGaWxlU2l6ZSA9IG5ld01heEZpbGVTaXplOworCQlib29sZWFuIG9sZE1heEZpbGVTaXplRVNldCA9IG1heEZpbGVTaXplRVNldDsKKwkJbWF4RmlsZVNpemVFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5NVUxUSVBBUlRfQ09ORklHX1RZUEVfX01BWF9GSUxFX1NJWkUsIG9sZE1heEZpbGVTaXplLCBtYXhGaWxlU2l6ZSwgIW9sZE1heEZpbGVTaXplRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHVuc2V0TWF4RmlsZVNpemUoKSB7CisJCWxvbmcgb2xkTWF4RmlsZVNpemUgPSBtYXhGaWxlU2l6ZTsKKwkJYm9vbGVhbiBvbGRNYXhGaWxlU2l6ZUVTZXQgPSBtYXhGaWxlU2l6ZUVTZXQ7CisJCW1heEZpbGVTaXplID0gTUFYX0ZJTEVfU0laRV9FREVGQVVMVDsKKwkJbWF4RmlsZVNpemVFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgV2ViUGFja2FnZS5NVUxUSVBBUlRfQ09ORklHX1RZUEVfX01BWF9GSUxFX1NJWkUsIG9sZE1heEZpbGVTaXplLCBNQVhfRklMRV9TSVpFX0VERUZBVUxULCBvbGRNYXhGaWxlU2l6ZUVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NldE1heEZpbGVTaXplKCkgeworCQlyZXR1cm4gbWF4RmlsZVNpemVFU2V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBsb25nIGdldE1heFJlcXVlc3RTaXplKCkgeworCQlyZXR1cm4gbWF4UmVxdWVzdFNpemU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWF4UmVxdWVzdFNpemUobG9uZyBuZXdNYXhSZXF1ZXN0U2l6ZSkgeworCQlsb25nIG9sZE1heFJlcXVlc3RTaXplID0gbWF4UmVxdWVzdFNpemU7CisJCW1heFJlcXVlc3RTaXplID0gbmV3TWF4UmVxdWVzdFNpemU7CisJCWJvb2xlYW4gb2xkTWF4UmVxdWVzdFNpemVFU2V0ID0gbWF4UmVxdWVzdFNpemVFU2V0OworCQltYXhSZXF1ZXN0U2l6ZUVTZXQgPSB0cnVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLk1VTFRJUEFSVF9DT05GSUdfVFlQRV9fTUFYX1JFUVVFU1RfU0laRSwgb2xkTWF4UmVxdWVzdFNpemUsIG1heFJlcXVlc3RTaXplLCAhb2xkTWF4UmVxdWVzdFNpemVFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgdW5zZXRNYXhSZXF1ZXN0U2l6ZSgpIHsKKwkJbG9uZyBvbGRNYXhSZXF1ZXN0U2l6ZSA9IG1heFJlcXVlc3RTaXplOworCQlib29sZWFuIG9sZE1heFJlcXVlc3RTaXplRVNldCA9IG1heFJlcXVlc3RTaXplRVNldDsKKwkJbWF4UmVxdWVzdFNpemUgPSBNQVhfUkVRVUVTVF9TSVpFX0VERUZBVUxUOworCQltYXhSZXF1ZXN0U2l6ZUVTZXQgPSBmYWxzZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBXZWJQYWNrYWdlLk1VTFRJUEFSVF9DT05GSUdfVFlQRV9fTUFYX1JFUVVFU1RfU0laRSwgb2xkTWF4UmVxdWVzdFNpemUsIE1BWF9SRVFVRVNUX1NJWkVfRURFRkFVTFQsIG9sZE1heFJlcXVlc3RTaXplRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0TWF4UmVxdWVzdFNpemUoKSB7CisJCXJldHVybiBtYXhSZXF1ZXN0U2l6ZUVTZXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJpZ0ludGVnZXIgZ2V0RmlsZVNpemVUaHJlc2hvbGQoKSB7CisJCXJldHVybiBmaWxlU2l6ZVRocmVzaG9sZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGaWxlU2l6ZVRocmVzaG9sZChCaWdJbnRlZ2VyIG5ld0ZpbGVTaXplVGhyZXNob2xkKSB7CisJCUJpZ0ludGVnZXIgb2xkRmlsZVNpemVUaHJlc2hvbGQgPSBmaWxlU2l6ZVRocmVzaG9sZDsKKwkJZmlsZVNpemVUaHJlc2hvbGQgPSBuZXdGaWxlU2l6ZVRocmVzaG9sZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5NVUxUSVBBUlRfQ09ORklHX1RZUEVfX0ZJTEVfU0laRV9USFJFU0hPTEQsIG9sZEZpbGVTaXplVGhyZXNob2xkLCBmaWxlU2l6ZVRocmVzaG9sZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5NVUxUSVBBUlRfQ09ORklHX1RZUEVfX0xPQ0FUSU9OOgorCQkJCXJldHVybiBnZXRMb2NhdGlvbigpOworCQkJY2FzZSBXZWJQYWNrYWdlLk1VTFRJUEFSVF9DT05GSUdfVFlQRV9fTUFYX0ZJTEVfU0laRToKKwkJCQlyZXR1cm4gZ2V0TWF4RmlsZVNpemUoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5NVUxUSVBBUlRfQ09ORklHX1RZUEVfX01BWF9SRVFVRVNUX1NJWkU6CisJCQkJcmV0dXJuIGdldE1heFJlcXVlc3RTaXplKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuTVVMVElQQVJUX0NPTkZJR19UWVBFX19GSUxFX1NJWkVfVEhSRVNIT0xEOgorCQkJCXJldHVybiBnZXRGaWxlU2l6ZVRocmVzaG9sZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuTVVMVElQQVJUX0NPTkZJR19UWVBFX19MT0NBVElPTjoKKwkJCQlzZXRMb2NhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuTVVMVElQQVJUX0NPTkZJR19UWVBFX19NQVhfRklMRV9TSVpFOgorCQkJCXNldE1heEZpbGVTaXplKChMb25nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuTVVMVElQQVJUX0NPTkZJR19UWVBFX19NQVhfUkVRVUVTVF9TSVpFOgorCQkJCXNldE1heFJlcXVlc3RTaXplKChMb25nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuTVVMVElQQVJUX0NPTkZJR19UWVBFX19GSUxFX1NJWkVfVEhSRVNIT0xEOgorCQkJCXNldEZpbGVTaXplVGhyZXNob2xkKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLk1VTFRJUEFSVF9DT05GSUdfVFlQRV9fTE9DQVRJT046CisJCQkJc2V0TG9jYXRpb24oTE9DQVRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5NVUxUSVBBUlRfQ09ORklHX1RZUEVfX01BWF9GSUxFX1NJWkU6CisJCQkJdW5zZXRNYXhGaWxlU2l6ZSgpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5NVUxUSVBBUlRfQ09ORklHX1RZUEVfX01BWF9SRVFVRVNUX1NJWkU6CisJCQkJdW5zZXRNYXhSZXF1ZXN0U2l6ZSgpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5NVUxUSVBBUlRfQ09ORklHX1RZUEVfX0ZJTEVfU0laRV9USFJFU0hPTEQ6CisJCQkJc2V0RmlsZVNpemVUaHJlc2hvbGQoRklMRV9TSVpFX1RIUkVTSE9MRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuTVVMVElQQVJUX0NPTkZJR19UWVBFX19MT0NBVElPTjoKKwkJCQlyZXR1cm4gTE9DQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGxvY2F0aW9uICE9IG51bGwgOiAhTE9DQVRJT05fRURFRkFVTFQuZXF1YWxzKGxvY2F0aW9uKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5NVUxUSVBBUlRfQ09ORklHX1RZUEVfX01BWF9GSUxFX1NJWkU6CisJCQkJcmV0dXJuIGlzU2V0TWF4RmlsZVNpemUoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5NVUxUSVBBUlRfQ09ORklHX1RZUEVfX01BWF9SRVFVRVNUX1NJWkU6CisJCQkJcmV0dXJuIGlzU2V0TWF4UmVxdWVzdFNpemUoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5NVUxUSVBBUlRfQ09ORklHX1RZUEVfX0ZJTEVfU0laRV9USFJFU0hPTEQ6CisJCQkJcmV0dXJuIEZJTEVfU0laRV9USFJFU0hPTERfRURFRkFVTFQgPT0gbnVsbCA/IGZpbGVTaXplVGhyZXNob2xkICE9IG51bGwgOiAhRklMRV9TSVpFX1RIUkVTSE9MRF9FREVGQVVMVC5lcXVhbHMoZmlsZVNpemVUaHJlc2hvbGQpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobG9jYXRpb246ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobG9jYXRpb24pOworCQlyZXN1bHQuYXBwZW5kKCIsIG1heEZpbGVTaXplOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAobWF4RmlsZVNpemVFU2V0KSByZXN1bHQuYXBwZW5kKG1heEZpbGVTaXplKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBtYXhSZXF1ZXN0U2l6ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKG1heFJlcXVlc3RTaXplRVNldCkgcmVzdWx0LmFwcGVuZChtYXhSZXF1ZXN0U2l6ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgZmlsZVNpemVUaHJlc2hvbGQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoZmlsZVNpemVUaHJlc2hvbGQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9NdWx0aXBhcnRDb25maWdUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9PcmRlcmluZ09yZGVyaW5nVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvT3JkZXJpbmdPcmRlcmluZ1R5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjYmQ5OQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvT3JkZXJpbmdPcmRlcmluZ1R5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwyMzkgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogT3JkZXJpbmdPcmRlcmluZ1R5cGVJbXBsLmphdmEsdiAxLjEgMjAwOS8xMC8xNSAxODo1MjowNSBjYW5kZXJzb24gRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdPcmRlcmluZ1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdPdGhlcnNUeXBlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9yZGVyaW5nIE9yZGVyaW5nIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuT3JkZXJpbmdPcmRlcmluZ1R5cGVJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuT3JkZXJpbmdPcmRlcmluZ1R5cGVJbXBsI2dldE90aGVycyA8ZW0+T3RoZXJzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgT3JkZXJpbmdPcmRlcmluZ1R5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBPcmRlcmluZ09yZGVyaW5nVHlwZSB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IG5hbWU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdGhlcnMoKSA8ZW0+T3RoZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRPdGhlcnMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBPcmRlcmluZ090aGVyc1R5cGUgb3RoZXJzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIE9yZGVyaW5nT3JkZXJpbmdUeXBlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuT1JERVJJTkdfT1JERVJJTkdfVFlQRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE5hbWUoKSB7CisJCWlmIChuYW1lID09IG51bGwpIHsKKwkJCW5hbWUgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuT1JERVJJTkdfT1JERVJJTkdfVFlQRV9fTkFNRSk7CisJCX0KKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE9yZGVyaW5nT3RoZXJzVHlwZSBnZXRPdGhlcnMoKSB7CisJCXJldHVybiBvdGhlcnM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T3RoZXJzKE9yZGVyaW5nT3RoZXJzVHlwZSBuZXdPdGhlcnMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJT3JkZXJpbmdPdGhlcnNUeXBlIG9sZE90aGVycyA9IG90aGVyczsKKwkJb3RoZXJzID0gbmV3T3RoZXJzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLk9SREVSSU5HX09SREVSSU5HX1RZUEVfX09USEVSUywgb2xkT3RoZXJzLCBuZXdPdGhlcnMpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE90aGVycyhPcmRlcmluZ090aGVyc1R5cGUgbmV3T3RoZXJzKSB7CisJCWlmIChuZXdPdGhlcnMgIT0gb3RoZXJzKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChvdGhlcnMgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb3RoZXJzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV2ViUGFja2FnZS5PUkRFUklOR19PUkRFUklOR19UWVBFX19PVEhFUlMsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld090aGVycyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPdGhlcnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLk9SREVSSU5HX09SREVSSU5HX1RZUEVfX09USEVSUywgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRPdGhlcnMobmV3T3RoZXJzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuT1JERVJJTkdfT1JERVJJTkdfVFlQRV9fT1RIRVJTLCBuZXdPdGhlcnMsIG5ld090aGVycykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5PUkRFUklOR19PUkRFUklOR19UWVBFX19PVEhFUlM6CisJCQkJcmV0dXJuIGJhc2ljU2V0T3RoZXJzKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuT1JERVJJTkdfT1JERVJJTkdfVFlQRV9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLk9SREVSSU5HX09SREVSSU5HX1RZUEVfX09USEVSUzoKKwkJCQlyZXR1cm4gZ2V0T3RoZXJzKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5PUkRFUklOR19PUkRFUklOR19UWVBFX19OQU1FOgorCQkJCWdldE5hbWUoKS5jbGVhcigpOworCQkJCWdldE5hbWUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5PUkRFUklOR19PUkRFUklOR19UWVBFX19PVEhFUlM6CisJCQkJc2V0T3RoZXJzKChPcmRlcmluZ090aGVyc1R5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuT1JERVJJTkdfT1JERVJJTkdfVFlQRV9fTkFNRToKKwkJCQlnZXROYW1lKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuT1JERVJJTkdfT1JERVJJTkdfVFlQRV9fT1RIRVJTOgorCQkJCXNldE90aGVycygoT3JkZXJpbmdPdGhlcnNUeXBlKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLk9SREVSSU5HX09SREVSSU5HX1RZUEVfX05BTUU6CisJCQkJcmV0dXJuIG5hbWUgIT0gbnVsbCAmJiAhbmFtZS5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuT1JERVJJTkdfT1JERVJJTkdfVFlQRV9fT1RIRVJTOgorCQkJCXJldHVybiBvdGhlcnMgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobmFtZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL09yZGVyaW5nT3JkZXJpbmdUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9PcmRlcmluZ090aGVyc1R5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL09yZGVyaW5nT3RoZXJzVHlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTFkNDcxCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9PcmRlcmluZ090aGVyc1R5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogT3JkZXJpbmdPdGhlcnNUeXBlSW1wbC5qYXZhLHYgMS4xIDIwMDkvMTAvMTUgMTg6NTI6MDUgY2FuZGVyc29uIEV4cCAkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk9yZGVyaW5nT3RoZXJzVHlwZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcmRlcmluZyBPdGhlcnMgVHlwZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5PcmRlcmluZ090aGVyc1R5cGVJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE9yZGVyaW5nT3RoZXJzVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE9yZGVyaW5nT3RoZXJzVHlwZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldElkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGlkID0gSURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgT3JkZXJpbmdPdGhlcnNUeXBlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuT1JERVJJTkdfT1RIRVJTX1RZUEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgeworCQlTdHJpbmcgb2xkSWQgPSBpZDsKKwkJaWQgPSBuZXdJZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5PUkRFUklOR19PVEhFUlNfVFlQRV9fSUQsIG9sZElkLCBpZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5PUkRFUklOR19PVEhFUlNfVFlQRV9fSUQ6CisJCQkJcmV0dXJuIGdldElkKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5PUkRFUklOR19PVEhFUlNfVFlQRV9fSUQ6CisJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5PUkRFUklOR19PVEhFUlNfVFlQRV9fSUQ6CisJCQkJc2V0SWQoSURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLk9SREVSSU5HX09USEVSU19UWVBFX19JRDoKKwkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGlkKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vT3JkZXJpbmdPdGhlcnNUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9PcmRlcmluZ1R5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL09yZGVyaW5nVHlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmM0NGE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9PcmRlcmluZ1R5cGVJbXBsLmphdmEKQEAgLTAsMCArMSwyNDcgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogT3JkZXJpbmdUeXBlSW1wbC5qYXZhLHYgMS4xIDIwMDkvMTAvMTUgMTg6NTI6MDUgY2FuZGVyc29uIEV4cCAkCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdPcmRlcmluZ1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdUeXBlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9yZGVyaW5nIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuT3JkZXJpbmdUeXBlSW1wbCNnZXRBZnRlciA8ZW0+QWZ0ZXI8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuT3JkZXJpbmdUeXBlSW1wbCNnZXRCZWZvcmUgPGVtPkJlZm9yZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIE9yZGVyaW5nVHlwZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE9yZGVyaW5nVHlwZSB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWZ0ZXIoKSA8ZW0+QWZ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFmdGVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgT3JkZXJpbmdPcmRlcmluZ1R5cGUgYWZ0ZXI7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCZWZvcmUoKSA8ZW0+QmVmb3JlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCZWZvcmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBPcmRlcmluZ09yZGVyaW5nVHlwZSBiZWZvcmU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgT3JkZXJpbmdUeXBlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuT1JERVJJTkdfVFlQRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT3JkZXJpbmdPcmRlcmluZ1R5cGUgZ2V0QWZ0ZXIoKSB7CisJCXJldHVybiBhZnRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBZnRlcihPcmRlcmluZ09yZGVyaW5nVHlwZSBuZXdBZnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlPcmRlcmluZ09yZGVyaW5nVHlwZSBvbGRBZnRlciA9IGFmdGVyOworCQlhZnRlciA9IG5ld0FmdGVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLk9SREVSSU5HX1RZUEVfX0FGVEVSLCBvbGRBZnRlciwgbmV3QWZ0ZXIpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFmdGVyKE9yZGVyaW5nT3JkZXJpbmdUeXBlIG5ld0FmdGVyKSB7CisJCWlmIChuZXdBZnRlciAhPSBhZnRlcikgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYWZ0ZXIgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWZ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLk9SREVSSU5HX1RZUEVfX0FGVEVSLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdBZnRlciAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBZnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYlBhY2thZ2UuT1JERVJJTkdfVFlQRV9fQUZURVIsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0QWZ0ZXIobmV3QWZ0ZXIsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5PUkRFUklOR19UWVBFX19BRlRFUiwgbmV3QWZ0ZXIsIG5ld0FmdGVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE9yZGVyaW5nT3JkZXJpbmdUeXBlIGdldEJlZm9yZSgpIHsKKwkJcmV0dXJuIGJlZm9yZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRCZWZvcmUoT3JkZXJpbmdPcmRlcmluZ1R5cGUgbmV3QmVmb3JlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCU9yZGVyaW5nT3JkZXJpbmdUeXBlIG9sZEJlZm9yZSA9IGJlZm9yZTsKKwkJYmVmb3JlID0gbmV3QmVmb3JlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLk9SREVSSU5HX1RZUEVfX0JFRk9SRSwgb2xkQmVmb3JlLCBuZXdCZWZvcmUpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJlZm9yZShPcmRlcmluZ09yZGVyaW5nVHlwZSBuZXdCZWZvcmUpIHsKKwkJaWYgKG5ld0JlZm9yZSAhPSBiZWZvcmUpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKGJlZm9yZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCliZWZvcmUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLk9SREVSSU5HX1RZUEVfX0JFRk9SRSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3QmVmb3JlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0JlZm9yZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYlBhY2thZ2UuT1JERVJJTkdfVFlQRV9fQkVGT1JFLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEJlZm9yZShuZXdCZWZvcmUsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5PUkRFUklOR19UWVBFX19CRUZPUkUsIG5ld0JlZm9yZSwgbmV3QmVmb3JlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLk9SREVSSU5HX1RZUEVfX0FGVEVSOgorCQkJCXJldHVybiBiYXNpY1NldEFmdGVyKG51bGwsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLk9SREVSSU5HX1RZUEVfX0JFRk9SRToKKwkJCQlyZXR1cm4gYmFzaWNTZXRCZWZvcmUobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5PUkRFUklOR19UWVBFX19BRlRFUjoKKwkJCQlyZXR1cm4gZ2V0QWZ0ZXIoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5PUkRFUklOR19UWVBFX19CRUZPUkU6CisJCQkJcmV0dXJuIGdldEJlZm9yZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuT1JERVJJTkdfVFlQRV9fQUZURVI6CisJCQkJc2V0QWZ0ZXIoKE9yZGVyaW5nT3JkZXJpbmdUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuT1JERVJJTkdfVFlQRV9fQkVGT1JFOgorCQkJCXNldEJlZm9yZSgoT3JkZXJpbmdPcmRlcmluZ1R5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuT1JERVJJTkdfVFlQRV9fQUZURVI6CisJCQkJc2V0QWZ0ZXIoKE9yZGVyaW5nT3JkZXJpbmdUeXBlKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5PUkRFUklOR19UWVBFX19CRUZPUkU6CisJCQkJc2V0QmVmb3JlKChPcmRlcmluZ09yZGVyaW5nVHlwZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5PUkRFUklOR19UWVBFX19BRlRFUjoKKwkJCQlyZXR1cm4gYWZ0ZXIgIT0gbnVsbDsKKwkJCWNhc2UgV2ViUGFja2FnZS5PUkRFUklOR19UWVBFX19CRUZPUkU6CisJCQkJcmV0dXJuIGJlZm9yZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKK30gLy9PcmRlcmluZ1R5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Q29uc3RyYWludEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50SW1wbC5qYXZhCmluZGV4IGRlNzY5YzcuLmZhYTkxODMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50SW1wbC5qYXZhCkBAIC02Miw3ICs2Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGRpc3BsYXlOYW1lcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PERpc3BsYXlOYW1lPiBkaXNwbGF5TmFtZXM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkgPGVtPldlYiBSZXNvdXJjZSBDb2xsZWN0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC03Miw3ICs3Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IHdlYlJlc291cmNlQ29sbGVjdGlvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxXZWJSZXNvdXJjZUNvbGxlY3Rpb24+IHdlYlJlc291cmNlQ29sbGVjdGlvbnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRoQ29uc3RyYWludCgpIDxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KQEAgLTgyLDcgKzgyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgQXV0aENvbnN0cmFpbnQgYXV0aENvbnN0cmFpbnQgPSBudWxsOworCXByb3RlY3RlZCBBdXRoQ29uc3RyYWludCBhdXRoQ29uc3RyYWludDsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZXJEYXRhQ29uc3RyYWludCgpIDxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgpAQCAtOTIsNyArOTIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBVc2VyRGF0YUNvbnN0cmFpbnQgdXNlckRhdGFDb25zdHJhaW50ID0gbnVsbDsKKwlwcm90ZWN0ZWQgVXNlckRhdGFDb25zdHJhaW50IHVzZXJEYXRhQ29uc3RyYWludDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTI4LDYgKzEyOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5TRUNVUklUWV9DT05TVFJBSU5UOwogCX0KQEAgLTEzNyw5ICsxMzgsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7CisJcHVibGljIExpc3Q8RGlzcGxheU5hbWU+IGdldERpc3BsYXlOYW1lcygpIHsKIAkJaWYgKGRpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FUyk7CisJCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGlzcGxheU5hbWU+KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVMpOwogCQl9CiAJCXJldHVybiBkaXNwbGF5TmFtZXM7CiAJfQpAQCAtMTQ5LDkgKzE1MCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKSB7CisJcHVibGljIExpc3Q8V2ViUmVzb3VyY2VDb2xsZWN0aW9uPiBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkgewogCQlpZiAod2ViUmVzb3VyY2VDb2xsZWN0aW9ucyA9PSBudWxsKSB7Ci0JCQl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlMpOworCQkJd2ViUmVzb3VyY2VDb2xsZWN0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxXZWJSZXNvdXJjZUNvbGxlY3Rpb24+KFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTlMpOwogCQl9CiAJCXJldHVybiB3ZWJSZXNvdXJjZUNvbGxlY3Rpb25zOwogCX0KQEAgLTI2OCwxMiArMjY5LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQ6CiAJCQkJcmV0dXJuIGJhc2ljU2V0QXV0aENvbnN0cmFpbnQobnVsbCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fVVNFUl9EQVRBX0NPTlNUUkFJTlQ6CkBAIC0yODcsNiArMjg5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVM6CkBAIC0zMDgsMTUgKzMxMSwxNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVM6CiAJCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzcGxheU5hbWU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fV0VCX1JFU09VUkNFX0NPTExFQ1RJT05TOgogCQkJCWdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFdlYlJlc291cmNlQ29sbGVjdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFdlYlJlc291cmNlQ29sbGVjdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19BVVRIX0NPTlNUUkFJTlQ6CiAJCQkJc2V0QXV0aENvbnN0cmFpbnQoKEF1dGhDb25zdHJhaW50KW5ld1ZhbHVlKTsKQEAgLTMzNiw2ICszNDEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRVM6CkBAIC0zNjIsNiArMzY4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTOgpAQCAtMzgzLDYgKzM5MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9TZXJ2bGV0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9TZXJ2bGV0SW1wbC5qYXZhCmluZGV4IGY1MzFmMWUuLmRjNDBjNWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2VydmxldEltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRJbXBsLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUnVuQXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZjsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk11bHRpcGFydENvbmZpZ1R5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7CkBAIC01Myw4ICs1NCwxMSBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwjZ2V0SnNwRmlsZSA8ZW0+SnNwIEZpbGU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwjZ2V0SW5pdFBhcmFtcyA8ZW0+SW5pdCBQYXJhbXM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwjZ2V0TG9hZE9uU3RhcnR1cCA8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsI2lzRW5hYmxlZCA8ZW0+RW5hYmxlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbCNpc0FzeW5jU3VwcG9ydGVkIDxlbT5Bc3luYyBTdXBwb3J0ZWQ8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwjZ2V0UnVuQXMgPGVtPlJ1biBBczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0SW1wbCNnZXRTZWN1cml0eVJvbGVSZWZzIDxlbT5TZWN1cml0eSBSb2xlIFJlZnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGwjZ2V0TXVsdGlwYXJ0Q29uZmlnIDxlbT5NdWx0aXBhcnQgQ29uZmlnPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlcnZsZXRJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICogPC9wPgpAQCAtNzAsNyArNzQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb25zOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzcGxheU5hbWVzKCkgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtODAsNyArODQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkaXNwbGF5TmFtZXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxEaXNwbGF5TmFtZT4gZGlzcGxheU5hbWVzOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWNvbnMoKSA8ZW0+SWNvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtOTAsNyArOTQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBpY29ucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PEljb24+IGljb25zOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcnZsZXROYW1lKCkgPGVtPlNlcnZsZXQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTYwLDcgKzE2NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIEVMaXN0IGluaXRQYXJhbXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxQYXJhbVZhbHVlPiBpbml0UGFyYW1zOwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvYWRPblN0YXJ0dXAoKSA8ZW0+TG9hZCBPbiBTdGFydHVwPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xODMsNiArMTg3LDY0IEBACiAJcHJvdGVjdGVkIE9iamVjdCBsb2FkT25TdGFydHVwID0gTE9BRF9PTl9TVEFSVFVQX0VERUZBVUxUOwogCiAJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW5hYmxlZCgpIDxlbT5FbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0VuYWJsZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTkFCTEVEX0VERUZBVUxUID0gdHJ1ZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW5hYmxlZCgpIDxlbT5FbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0VuYWJsZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQgPSBFTkFCTEVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFbmFibGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVkRVNldDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FzeW5jU3VwcG9ydGVkKCkgPGVtPkFzeW5jIFN1cHBvcnRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNBc3luY1N1cHBvcnRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFTWU5DX1NVUFBPUlRFRF9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBc3luY1N1cHBvcnRlZCgpIDxlbT5Bc3luYyBTdXBwb3J0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzQXN5bmNTdXBwb3J0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGFzeW5jU3VwcG9ydGVkID0gQVNZTkNfU1VQUE9SVEVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBc3luYyBTdXBwb3J0ZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGFzeW5jU3VwcG9ydGVkRVNldDsKKworCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJ1bkFzKCkgPGVtPlJ1biBBczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xOTAsNyArMjUyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgUnVuQXMgcnVuQXMgPSBudWxsOworCXByb3RlY3RlZCBSdW5BcyBydW5BczsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3VyaXR5Um9sZVJlZnMoKSA8ZW0+U2VjdXJpdHkgUm9sZSBSZWZzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTIwMCw3ICsyNjIsMTcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc2VjdXJpdHlSb2xlUmVmcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFNlY3VyaXR5Um9sZVJlZj4gc2VjdXJpdHlSb2xlUmVmczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11bHRpcGFydENvbmZpZygpIDxlbT5NdWx0aXBhcnQgQ29uZmlnPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNdWx0aXBhcnRDb25maWcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBNdWx0aXBhcnRDb25maWdUeXBlIG11bHRpcGFydENvbmZpZzsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMjM2LDYgKzMwOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5TRVJWTEVUOwogCX0KQEAgLTI0NSw5ICszMTgsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuU0VSVkxFVF9fREVTQ1JJUFRJT05TKTsKKwkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuU0VSVkxFVF9fREVTQ1JJUFRJT05TKTsKIAkJfQogCQlyZXR1cm4gZGVzY3JpcHRpb25zOwogCX0KQEAgLTI1Nyw5ICszMzAsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXNwbGF5TmFtZXMoKSB7CisJcHVibGljIExpc3Q8RGlzcGxheU5hbWU+IGdldERpc3BsYXlOYW1lcygpIHsKIAkJaWYgKGRpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGlzcGxheU5hbWUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuU0VSVkxFVF9fRElTUExBWV9OQU1FUyk7CisJCQlkaXNwbGF5TmFtZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGlzcGxheU5hbWU+KERpc3BsYXlOYW1lLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLlNFUlZMRVRfX0RJU1BMQVlfTkFNRVMpOwogCQl9CiAJCXJldHVybiBkaXNwbGF5TmFtZXM7CiAJfQpAQCAtMjY5LDkgKzM0Miw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgeworCXB1YmxpYyBMaXN0PEljb24+IGdldEljb25zKCkgewogCQlpZiAoaWNvbnMgPT0gbnVsbCkgewotCQkJaWNvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoSWNvbi5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5TRVJWTEVUX19JQ09OUyk7CisJCQlpY29ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxJY29uPihJY29uLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLlNFUlZMRVRfX0lDT05TKTsKIAkJfQogCQlyZXR1cm4gaWNvbnM7CiAJfQpAQCAtMzQ0LDkgKzQxNyw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEluaXRQYXJhbXMoKSB7CisJcHVibGljIExpc3Q8UGFyYW1WYWx1ZT4gZ2V0SW5pdFBhcmFtcygpIHsKIAkJaWYgKGluaXRQYXJhbXMgPT0gbnVsbCkgewotCQkJaW5pdFBhcmFtcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChQYXJhbVZhbHVlLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLlNFUlZMRVRfX0lOSVRfUEFSQU1TKTsKKwkJCWluaXRQYXJhbXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8UGFyYW1WYWx1ZT4oUGFyYW1WYWx1ZS5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5TRVJWTEVUX19JTklUX1BBUkFNUyk7CiAJCX0KIAkJcmV0dXJuIGluaXRQYXJhbXM7CiAJfQpAQCAtMzc3LDYgKzQ1MCw5OCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7CisJCXJldHVybiBlbmFibGVkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBuZXdFbmFibGVkKSB7CisJCWJvb2xlYW4gb2xkRW5hYmxlZCA9IGVuYWJsZWQ7CisJCWVuYWJsZWQgPSBuZXdFbmFibGVkOworCQlib29sZWFuIG9sZEVuYWJsZWRFU2V0ID0gZW5hYmxlZEVTZXQ7CisJCWVuYWJsZWRFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRVJWTEVUX19FTkFCTEVELCBvbGRFbmFibGVkLCBlbmFibGVkLCAhb2xkRW5hYmxlZEVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldEVuYWJsZWQoKSB7CisJCWJvb2xlYW4gb2xkRW5hYmxlZCA9IGVuYWJsZWQ7CisJCWJvb2xlYW4gb2xkRW5hYmxlZEVTZXQgPSBlbmFibGVkRVNldDsKKwkJZW5hYmxlZCA9IEVOQUJMRURfRURFRkFVTFQ7CisJCWVuYWJsZWRFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgV2ViUGFja2FnZS5TRVJWTEVUX19FTkFCTEVELCBvbGRFbmFibGVkLCBFTkFCTEVEX0VERUZBVUxULCBvbGRFbmFibGVkRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0RW5hYmxlZCgpIHsKKwkJcmV0dXJuIGVuYWJsZWRFU2V0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQXN5bmNTdXBwb3J0ZWQoKSB7CisJCXJldHVybiBhc3luY1N1cHBvcnRlZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBc3luY1N1cHBvcnRlZChib29sZWFuIG5ld0FzeW5jU3VwcG9ydGVkKSB7CisJCWJvb2xlYW4gb2xkQXN5bmNTdXBwb3J0ZWQgPSBhc3luY1N1cHBvcnRlZDsKKwkJYXN5bmNTdXBwb3J0ZWQgPSBuZXdBc3luY1N1cHBvcnRlZDsKKwkJYm9vbGVhbiBvbGRBc3luY1N1cHBvcnRlZEVTZXQgPSBhc3luY1N1cHBvcnRlZEVTZXQ7CisJCWFzeW5jU3VwcG9ydGVkRVNldCA9IHRydWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdlYlBhY2thZ2UuU0VSVkxFVF9fQVNZTkNfU1VQUE9SVEVELCBvbGRBc3luY1N1cHBvcnRlZCwgYXN5bmNTdXBwb3J0ZWQsICFvbGRBc3luY1N1cHBvcnRlZEVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldEFzeW5jU3VwcG9ydGVkKCkgeworCQlib29sZWFuIG9sZEFzeW5jU3VwcG9ydGVkID0gYXN5bmNTdXBwb3J0ZWQ7CisJCWJvb2xlYW4gb2xkQXN5bmNTdXBwb3J0ZWRFU2V0ID0gYXN5bmNTdXBwb3J0ZWRFU2V0OworCQlhc3luY1N1cHBvcnRlZCA9IEFTWU5DX1NVUFBPUlRFRF9FREVGQVVMVDsKKwkJYXN5bmNTdXBwb3J0ZWRFU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgV2ViUGFja2FnZS5TRVJWTEVUX19BU1lOQ19TVVBQT1JURUQsIG9sZEFzeW5jU3VwcG9ydGVkLCBBU1lOQ19TVVBQT1JURURfRURFRkFVTFQsIG9sZEFzeW5jU3VwcG9ydGVkRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2V0QXN5bmNTdXBwb3J0ZWQoKSB7CisJCXJldHVybiBhc3luY1N1cHBvcnRlZEVTZXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIFJ1bkFzIGdldFJ1bkFzKCkgewogCQlyZXR1cm4gcnVuQXM7CiAJfQpAQCAtNDIwLDkgKzU4NSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlY3VyaXR5Um9sZVJlZnMoKSB7CisJcHVibGljIExpc3Q8U2VjdXJpdHlSb2xlUmVmPiBnZXRTZWN1cml0eVJvbGVSZWZzKCkgewogCQlpZiAoc2VjdXJpdHlSb2xlUmVmcyA9PSBudWxsKSB7Ci0JCQlzZWN1cml0eVJvbGVSZWZzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5TRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlMpOworCQkJc2VjdXJpdHlSb2xlUmVmcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTZWN1cml0eVJvbGVSZWY+KFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5TRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlMpOwogCQl9CiAJCXJldHVybiBzZWN1cml0eVJvbGVSZWZzOwogCX0KQEAgLTQzMiw2ICs1OTcsNDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIE11bHRpcGFydENvbmZpZ1R5cGUgZ2V0TXVsdGlwYXJ0Q29uZmlnKCkgeworCQlyZXR1cm4gbXVsdGlwYXJ0Q29uZmlnOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE11bHRpcGFydENvbmZpZyhNdWx0aXBhcnRDb25maWdUeXBlIG5ld011bHRpcGFydENvbmZpZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlNdWx0aXBhcnRDb25maWdUeXBlIG9sZE11bHRpcGFydENvbmZpZyA9IG11bHRpcGFydENvbmZpZzsKKwkJbXVsdGlwYXJ0Q29uZmlnID0gbmV3TXVsdGlwYXJ0Q29uZmlnOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFUlZMRVRfX01VTFRJUEFSVF9DT05GSUcsIG9sZE11bHRpcGFydENvbmZpZywgbmV3TXVsdGlwYXJ0Q29uZmlnKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNdWx0aXBhcnRDb25maWcoTXVsdGlwYXJ0Q29uZmlnVHlwZSBuZXdNdWx0aXBhcnRDb25maWcpIHsKKwkJaWYgKG5ld011bHRpcGFydENvbmZpZyAhPSBtdWx0aXBhcnRDb25maWcpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKG11bHRpcGFydENvbmZpZyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCltdWx0aXBhcnRDb25maWcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLlNFUlZMRVRfX01VTFRJUEFSVF9DT05GSUcsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld011bHRpcGFydENvbmZpZyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNdWx0aXBhcnRDb25maWcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLlNFUlZMRVRfX01VTFRJUEFSVF9DT05GSUcsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0TXVsdGlwYXJ0Q29uZmlnKG5ld011bHRpcGFydENvbmZpZywgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXZWJQYWNrYWdlLlNFUlZMRVRfX01VTFRJUEFSVF9DT05GSUcsIG5ld011bHRpcGFydENvbmZpZywgbmV3TXVsdGlwYXJ0Q29uZmlnKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKIAkJcmV0dXJuIGlkOwogCX0KQEAgLTQ1MywyMCArNjYxLDIzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19ESVNQTEFZX05BTUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzcGxheU5hbWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSUNPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJY29ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSU5JVF9QQVJBTVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRJbml0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEluaXRQYXJhbXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1JVTl9BUzoKIAkJCQlyZXR1cm4gYmFzaWNTZXRSdW5BcyhudWxsLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN1cml0eVJvbGVSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlY3VyaXR5Um9sZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX01VTFRJUEFSVF9DT05GSUc6CisJCQkJcmV0dXJuIGJhc2ljU2V0TXVsdGlwYXJ0Q29uZmlnKG51bGwsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC00NzYsNiArNjg3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0RFU0NSSVBUSU9OUzoKQEAgLTQ5NCwxMCArNzA2LDE2IEBACiAJCQkJcmV0dXJuIGdldEluaXRQYXJhbXMoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVA6CiAJCQkJcmV0dXJuIGdldExvYWRPblN0YXJ0dXAoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19FTkFCTEVEOgorCQkJCXJldHVybiBpc0VuYWJsZWQoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19BU1lOQ19TVVBQT1JURUQ6CisJCQkJcmV0dXJuIGlzQXN5bmNTdXBwb3J0ZWQoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19SVU5fQVM6CiAJCQkJcmV0dXJuIGdldFJ1bkFzKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTOgogCQkJCXJldHVybiBnZXRTZWN1cml0eVJvbGVSZWZzKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fTVVMVElQQVJUX0NPTkZJRzoKKwkJCQlyZXR1cm4gZ2V0TXVsdGlwYXJ0Q29uZmlnKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSUQ6CiAJCQkJcmV0dXJuIGdldElkKCk7CiAJCX0KQEAgLTUwOSwxOSArNzI3LDIxIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0RJU1BMQVlfTkFNRVM6CiAJCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzcGxheU5hbWU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fSUNPTlM6CiAJCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSWNvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX05BTUU6CiAJCQkJc2V0U2VydmxldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC01MzQsMTcgKzc1NCwyNiBAQAogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19JTklUX1BBUkFNUzoKIAkJCQlnZXRJbml0UGFyYW1zKCkuY2xlYXIoKTsKLQkJCQlnZXRJbml0UGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRJbml0UGFyYW1zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQYXJhbVZhbHVlPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0xPQURfT05fU1RBUlRVUDoKLQkJCQlzZXRMb2FkT25TdGFydHVwKChPYmplY3QpbmV3VmFsdWUpOworCQkJCXNldExvYWRPblN0YXJ0dXAobmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19FTkFCTEVEOgorCQkJCXNldEVuYWJsZWQoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19BU1lOQ19TVVBQT1JURUQ6CisJCQkJc2V0QXN5bmNTdXBwb3J0ZWQoKEJvb2xlYW4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19SVU5fQVM6CiAJCQkJc2V0UnVuQXMoKFJ1bkFzKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fU0VDVVJJVFlfUk9MRV9SRUZTOgogCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFNlY3VyaXR5Um9sZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3VyaXR5Um9sZVJlZj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19NVUxUSVBBUlRfQ09ORklHOgorCQkJCXNldE11bHRpcGFydENvbmZpZygoTXVsdGlwYXJ0Q29uZmlnVHlwZSluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX0lEOgogCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwpAQCAtNTU4LDYgKzc4Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fREVTQ1JJUFRJT05TOgpAQCAtNTg0LDEyICs4MTQsMjEgQEAKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVA6CiAJCQkJc2V0TG9hZE9uU3RhcnR1cChMT0FEX09OX1NUQVJUVVBfRURFRkFVTFQpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19FTkFCTEVEOgorCQkJCXVuc2V0RW5hYmxlZCgpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19BU1lOQ19TVVBQT1JURUQ6CisJCQkJdW5zZXRBc3luY1N1cHBvcnRlZCgpOworCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19SVU5fQVM6CiAJCQkJc2V0UnVuQXMoKFJ1bkFzKW51bGwpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19TRUNVUklUWV9ST0xFX1JFRlM6CiAJCQkJZ2V0U2VjdXJpdHlSb2xlUmVmcygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX01VTFRJUEFSVF9DT05GSUc6CisJCQkJc2V0TXVsdGlwYXJ0Q29uZmlnKChNdWx0aXBhcnRDb25maWdUeXBlKW51bGwpOworCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19JRDoKIAkJCQlzZXRJZChJRF9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwpAQCAtNjAyLDYgKzg0MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fREVTQ1JJUFRJT05TOgpAQCAtNjIwLDEwICs4NjAsMTYgQEAKIAkJCQlyZXR1cm4gaW5pdFBhcmFtcyAhPSBudWxsICYmICFpbml0UGFyYW1zLmlzRW1wdHkoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19MT0FEX09OX1NUQVJUVVA6CiAJCQkJcmV0dXJuIExPQURfT05fU1RBUlRVUF9FREVGQVVMVCA9PSBudWxsID8gbG9hZE9uU3RhcnR1cCAhPSBudWxsIDogIUxPQURfT05fU1RBUlRVUF9FREVGQVVMVC5lcXVhbHMobG9hZE9uU3RhcnR1cCk7CisJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fRU5BQkxFRDoKKwkJCQlyZXR1cm4gaXNTZXRFbmFibGVkKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fQVNZTkNfU1VQUE9SVEVEOgorCQkJCXJldHVybiBpc1NldEFzeW5jU3VwcG9ydGVkKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9fUlVOX0FTOgogCQkJCXJldHVybiBydW5BcyAhPSBudWxsOwogCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUzoKIAkJCQlyZXR1cm4gc2VjdXJpdHlSb2xlUmVmcyAhPSBudWxsICYmICFzZWN1cml0eVJvbGVSZWZzLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19NVUxUSVBBUlRfQ09ORklHOgorCQkJCXJldHVybiBtdWx0aXBhcnRDb25maWcgIT0gbnVsbDsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX19JRDoKIAkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKIAkJfQpAQCAtNjM1LDYgKzg4MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApAQCAtNjQ3LDYgKzg5NCwxMCBAQAogCQlyZXN1bHQuYXBwZW5kKGpzcEZpbGUpOwogCQlyZXN1bHQuYXBwZW5kKCIsIGxvYWRPblN0YXJ0dXA6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobG9hZE9uU3RhcnR1cCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgZW5hYmxlZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGVuYWJsZWRFU2V0KSByZXN1bHQuYXBwZW5kKGVuYWJsZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIGFzeW5jU3VwcG9ydGVkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoYXN5bmNTdXBwb3J0ZWRFU2V0KSByZXN1bHQuYXBwZW5kKGFzeW5jU3VwcG9ydGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2VydmxldE1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRNYXBwaW5nSW1wbC5qYXZhCmluZGV4IGVlMzUyZjAuLjdkNzY2YjYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2VydmxldE1hcHBpbmdJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9TZXJ2bGV0TWFwcGluZ0ltcGwuamF2YQpAQCAtNzcsNyArNzcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCB1cmxQYXR0ZXJucyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFVybFBhdHRlcm5UeXBlPiB1cmxQYXR0ZXJuczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTEzLDYgKzExMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5TRVJWTEVUX01BUFBJTkc7CiAJfQpAQCAtMTQzLDkgKzE0NCw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFVybFBhdHRlcm5zKCkgeworCXB1YmxpYyBMaXN0PFVybFBhdHRlcm5UeXBlPiBnZXRVcmxQYXR0ZXJucygpIHsKIAkJaWYgKHVybFBhdHRlcm5zID09IG51bGwpIHsKLQkJCXVybFBhdHRlcm5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFVybFBhdHRlcm5UeXBlLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk5TKTsKKwkJCXVybFBhdHRlcm5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFVybFBhdHRlcm5UeXBlPihVcmxQYXR0ZXJuVHlwZS5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOUyk7CiAJCX0KIAkJcmV0dXJuIHVybFBhdHRlcm5zOwogCX0KQEAgLTE3NiwxMCArMTc3LDExIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFVybFBhdHRlcm5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFVybFBhdHRlcm5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtMTg5LDYgKzE5MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1NFUlZMRVRfTkFNRToKQEAgLTIwNiw2ICsyMDksOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fU0VSVkxFVF9OQU1FOgpAQCAtMjEzLDcgKzIxOCw3IEBACiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk5TOgogCQkJCWdldFVybFBhdHRlcm5zKCkuY2xlYXIoKTsKLQkJCQlnZXRVcmxQYXR0ZXJucygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0VXJsUGF0dGVybnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFVybFBhdHRlcm5UeXBlPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0yMjcsNiArMjMyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1NFUlZMRVRfTkFNRToKQEAgLTI0Nyw2ICsyNTMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fU0VSVkxFVF9OQU1FOgpAQCAtMjY0LDYgKzI3MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9TZXNzaW9uQ29uZmlnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9TZXNzaW9uQ29uZmlnSW1wbC5qYXZhCmluZGV4IDRmYmVkOGQuLjgwODFkOWMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvU2Vzc2lvbkNvbmZpZ0ltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25Db25maWdJbXBsLmphdmEKQEAgLTEyLDE1ICsxMiwyMyBAQAogCiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb25maWdUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWc7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFja2luZ01vZGVUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7CiAKIC8qKgpAQCAtMzEsNiArMzksOCBAQAogICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CiAgKiA8dWw+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQ29uZmlnSW1wbCNnZXRTZXNzaW9uVGltZW91dCA8ZW0+U2Vzc2lvbiBUaW1lb3V0PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLlNlc3Npb25Db25maWdJbXBsI2dldENvb2tpZUNvbmZpZyA8ZW0+Q29va2llIENvbmZpZzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXNzaW9uQ29uZmlnSW1wbCNnZXRUcmFja2luZ01vZGUgPGVtPlRyYWNraW5nIE1vZGU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2Vzc2lvbkNvbmZpZ0ltcGwjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CkBAIC01OSw2ICs2OSwyNiBAQAogCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHNlc3Npb25UaW1lb3V0ID0gU0VTU0lPTl9USU1FT1VUX0VERUZBVUxUOwogCiAJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29va2llQ29uZmlnKCkgPGVtPkNvb2tpZSBDb25maWc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENvb2tpZUNvbmZpZygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIENvb2tpZUNvbmZpZ1R5cGUgY29va2llQ29uZmlnOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHJhY2tpbmdNb2RlKCkgPGVtPlRyYWNraW5nIE1vZGU8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VHJhY2tpbmdNb2RlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8VHJhY2tpbmdNb2RlVHlwZT4gdHJhY2tpbmdNb2RlOworCisJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTkyLDYgKzEyMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViUGFja2FnZS5MaXRlcmFscy5TRVNTSU9OX0NPTkZJRzsKIAl9CkBAIC0xMjIsNiArMTUzLDYxIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBDb29raWVDb25maWdUeXBlIGdldENvb2tpZUNvbmZpZygpIHsKKwkJcmV0dXJuIGNvb2tpZUNvbmZpZzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb29raWVDb25maWcoQ29va2llQ29uZmlnVHlwZSBuZXdDb29raWVDb25maWcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJQ29va2llQ29uZmlnVHlwZSBvbGRDb29raWVDb25maWcgPSBjb29raWVDb25maWc7CisJCWNvb2tpZUNvbmZpZyA9IG5ld0Nvb2tpZUNvbmZpZzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fQ09PS0lFX0NPTkZJRywgb2xkQ29va2llQ29uZmlnLCBuZXdDb29raWVDb25maWcpOworCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOworCQl9CisJCXJldHVybiBtc2dzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvb2tpZUNvbmZpZyhDb29raWVDb25maWdUeXBlIG5ld0Nvb2tpZUNvbmZpZykgeworCQlpZiAobmV3Q29va2llQ29uZmlnICE9IGNvb2tpZUNvbmZpZykgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoY29va2llQ29uZmlnICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvb2tpZUNvbmZpZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdlYlBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX0NPT0tJRV9DT05GSUcsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0Nvb2tpZUNvbmZpZyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb29raWVDb25maWcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHX19DT09LSUVfQ09ORklHLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldENvb2tpZUNvbmZpZyhuZXdDb29raWVDb25maWcsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fQ09PS0lFX0NPTkZJRywgbmV3Q29va2llQ29uZmlnLCBuZXdDb29raWVDb25maWcpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxUcmFja2luZ01vZGVUeXBlPiBnZXRUcmFja2luZ01vZGUoKSB7CisJCWlmICh0cmFja2luZ01vZGUgPT0gbnVsbCkgeworCQkJdHJhY2tpbmdNb2RlID0gbmV3IEVEYXRhVHlwZUVMaXN0PFRyYWNraW5nTW9kZVR5cGU+KFRyYWNraW5nTW9kZVR5cGUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1RSQUNLSU5HX01PREUpOworCQl9CisJCXJldHVybiB0cmFja2luZ01vZGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKIAkJcmV0dXJuIGlkOwogCX0KQEAgLTE0MywxMCArMjI5LDI5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fQ09PS0lFX0NPTkZJRzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRDb29raWVDb25maWcobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUOgogCQkJCXJldHVybiBnZXRTZXNzaW9uVGltZW91dCgpOworCQkJY2FzZSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHX19DT09LSUVfQ09ORklHOgorCQkJCXJldHVybiBnZXRDb29raWVDb25maWcoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fVFJBQ0tJTkdfTU9ERToKKwkJCQlyZXR1cm4gZ2V0VHJhY2tpbmdNb2RlKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX0lEOgogCQkJCXJldHVybiBnZXRJZCgpOwogCQl9CkBAIC0xNTgsNiArMjYzLDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUOgpAQCAtMTcwLDYgKzI3NywxMyBAQAogCQkJCQkvLyBkbyBub3RoaW5nIGlmIHZhbHVlIGlzIG5vdCBJbnRlZ2VyIG9yIEJpZ0ludGVnZXIuCiAJCQkJfQogCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fQ09PS0lFX0NPTkZJRzoKKwkJCQlzZXRDb29raWVDb25maWcoKENvb2tpZUNvbmZpZ1R5cGUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fVFJBQ0tJTkdfTU9ERToKKwkJCQlnZXRUcmFja2luZ01vZGUoKS5jbGVhcigpOworCQkJCWdldFRyYWNraW5nTW9kZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVHJhY2tpbmdNb2RlVHlwZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwpAQCAtMTgyLDExICsyOTYsMTggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fU0VTU0lPTl9USU1FT1VUOgogCQkJCXNldFNlc3Npb25UaW1lb3V0KFNFU1NJT05fVElNRU9VVF9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHX19DT09LSUVfQ09ORklHOgorCQkJCXNldENvb2tpZUNvbmZpZygoQ29va2llQ29uZmlnVHlwZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1RSQUNLSU5HX01PREU6CisJCQkJZ2V0VHJhY2tpbmdNb2RlKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX0lEOgogCQkJCXNldElkKElEX0VERUZBVUxUKTsKIAkJCQlyZXR1cm47CkBAIC0xOTksMTAgKzMyMCwxNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQ6CiAJCQkJcmV0dXJuIFNFU1NJT05fVElNRU9VVF9FREVGQVVMVCA9PSBudWxsID8gc2Vzc2lvblRpbWVvdXQgIT0gbnVsbCA6ICFTRVNTSU9OX1RJTUVPVVRfRURFRkFVTFQuZXF1YWxzKHNlc3Npb25UaW1lb3V0KTsKKwkJCWNhc2UgV2ViUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fQ09PS0lFX0NPTkZJRzoKKwkJCQlyZXR1cm4gY29va2llQ29uZmlnICE9IG51bGw7CisJCQljYXNlIFdlYlBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1RSQUNLSU5HX01PREU6CisJCQkJcmV0dXJuIHRyYWNraW5nTW9kZSAhPSBudWxsICYmICF0cmFja2luZ01vZGUuaXNFbXB0eSgpOwogCQkJY2FzZSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHX19JRDoKIAkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKIAkJfQpAQCAtMjE0LDEyICszNDAsMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwogCQlyZXN1bHQuYXBwZW5kKCIgKHNlc3Npb25UaW1lb3V0OiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHNlc3Npb25UaW1lb3V0KTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0cmFja2luZ01vZGU6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQodHJhY2tpbmdNb2RlKTsKIAkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvVXNlckRhdGFDb25zdHJhaW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsLmphdmEKaW5kZXggMDA3MWFkMS4uZTEzMDQ5MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZGVzY3JpcHRpb25zID0gbnVsbDsKKwlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpcHRpb24+IGRlc2NyaXB0aW9uczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc3BvcnRHdWFyYW50ZWUoKSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtODcsNyArODcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRyYW5zcG9ydEd1YXJhbnRlZUVTZXQgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiB0cmFuc3BvcnRHdWFyYW50ZWVFU2V0OwogCiAJLyoqCiAJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xMjMsNiArMTIzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJQYWNrYWdlLkxpdGVyYWxzLlVTRVJfREFUQV9DT05TVFJBSU5UOwogCX0KQEAgLTEzMiw5ICsxMzMsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXREZXNjcmlwdGlvbnMoKSB7CisJcHVibGljIExpc3Q8RGVzY3JpcHRpb24+IGdldERlc2NyaXB0aW9ucygpIHsKIAkJaWYgKGRlc2NyaXB0aW9ucyA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUyk7CisJCQlkZXNjcmlwdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8RGVzY3JpcHRpb24+KERlc2NyaXB0aW9uLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlMpOwogCQl9CiAJCXJldHVybiBkZXNjcmlwdGlvbnM7CiAJfQpAQCAtMjExLDEwICsyMTIsMTEgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CiAJfQpAQCAtMjI0LDYgKzIyNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgpAQCAtMjQxLDExICsyNDQsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19UUkFOU1BPUlRfR1VBUkFOVEVFOgogCQkJCXNldFRyYW5zcG9ydEd1YXJhbnRlZSgoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSluZXdWYWx1ZSk7CkBAIC0yNjIsNiArMjY3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT05TOgpAQCAtMjgyLDYgKzI4OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OUzoKQEAgLTI5OSw2ICszMDYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhCmluZGV4IGQxNmJkYzQuLjhmMzhhZWMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YQpAQCAtNTksNyArNTksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIG1peGVkID0gbnVsbDsKKwlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBtaXhlZDsKIAogCS8qKgogCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhNTE5TUHJlZml4TWFwKCkgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nIG1hcC4KQEAgLTY5LDcgKzY5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4TUxOU1ByZWZpeE1hcCA9IG51bGw7CisJcHJvdGVjdGVkIEVNYXA8U3RyaW5nLCBTdHJpbmc+IHhNTE5TUHJlZml4TWFwOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScgbWFwLgpAQCAtNzksNyArNzksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTWFwIHhTSVNjaGVtYUxvY2F0aW9uID0gbnVsbDsKKwlwcm90ZWN0ZWQgRU1hcDxTdHJpbmcsIFN0cmluZz4geFNJU2NoZW1hTG9jYXRpb247CiAKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtOTUsNiArOTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1I7CiAJfQpAQCAtMTE2LDkgKzExNyw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKSB7CisJcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0WE1MTlNQcmVmaXhNYXAoKSB7CiAJCWlmICh4TUxOU1ByZWZpeE1hcCA9PSBudWxsKSB7Ci0JCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQKTsKKwkJCXhNTE5TUHJlZml4TWFwID0gbmV3IEVjb3JlRU1hcDxTdHJpbmcsU3RyaW5nPihFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVApOwogCQl9CiAJCXJldHVybiB4TUxOU1ByZWZpeE1hcC5tYXAoKTsKIAl9CkBAIC0xMjgsOSArMTI5LDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE1hcCBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKKwlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKIAkJaWYgKHhTSVNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKLQkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcChFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOworCQkJeFNJU2NoZW1hTG9jYXRpb24gPSBuZXcgRWNvcmVFTWFwPFN0cmluZyxTdHJpbmc+KEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HX1RPX1NUUklOR19NQVBfRU5UUlksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTik7CiAJCX0KIAkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uLm1hcCgpOwogCX0KQEAgLTE2NywxNCArMTY4LDE1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhNTE5TUHJlZml4TWFwKCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkoKEVNYXAuSW50ZXJuYWxNYXBWaWV3KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9BUFA6CiAJCQkJcmV0dXJuIGJhc2ljU2V0V2ViQXBwKG51bGwsIG1zZ3MpOwogCQl9CkBAIC0xODYsMTYgKzE4OCwxNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgogCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldE1peGVkKCk7CiAJCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5nZXRXcmFwcGVyKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCk7CisJCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpOwogCQkJCWVsc2UgcmV0dXJuIGdldFhNTE5TUHJlZml4TWFwKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCk7CisJCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpOwogCQkJCWVsc2UgcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9BUFA6CiAJCQkJcmV0dXJuIGdldFdlYkFwcCgpOwpAQCAtMjA4LDE2ICsyMTEsMTcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6CiAJCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChuZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7CisJCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZykoKEVNYXAuSW50ZXJuYWxNYXBWaWV3PFN0cmluZywgU3RyaW5nPilnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldylnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7CisJCQkJKChFU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZykoKEVNYXAuSW50ZXJuYWxNYXBWaWV3PFN0cmluZywgU3RyaW5nPilnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCkpLnNldChuZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfQVBQOgogCQkJCXNldFdlYkFwcCgoV2ViQXBwKW5ld1ZhbHVlKTsKQEAgLTIzMSw2ICsyMzUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKQEAgLTI1NCw2ICsyNTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKQEAgLTI3Myw2ICsyNzksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2ViQXBwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJBcHBJbXBsLmphdmEKaW5kZXggYTExOWIyMS4uYzU3OGU5ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJBcHBJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJBcHBJbXBsLmphdmEKQEAgLTI2LDkgKzI2LDQxIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRhdGFTb3VyY2VUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGlzcGxheU5hbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYkxvY2FsUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVtcHR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW52RW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkljb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpZmVjeWNsZUNhbGxiYWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb25SZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBhcmFtVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlBlcnNpc3RlbmNlQ29udGV4dFJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VydmljZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5Kc3BDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQWJzb2x1dGVPcmRlcmluZ1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwVmVyc2lvblR5cGU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKIAogLyoqCkBAIC0zOSw2ICs3MSw3IEBACiAgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKICAqIDx1bD4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0TW9kdWxlTmFtZSA8ZW0+TW9kdWxlIE5hbWU8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldERpc3BsYXlOYW1lcyA8ZW0+RGlzcGxheSBOYW1lczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+CkBAIC02OCw4ICsxMDEsMTAgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0UG9zdENvbnN0cnVjdHMgPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXREYXRhU291cmNlIDxlbT5EYXRhIFNvdXJjZTwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJBcHBJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzIExpc3RzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0QWJzb2x1dGVPcmRlcmluZyA8ZW0+QWJzb2x1dGUgT3JkZXJpbmc8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViQXBwSW1wbCNpc01ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcEltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+CkBAIC04Nyw3ICsxMjIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwID0gbnVsbDsKKwlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtMTM2LDcgKzE3MSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZUVTZXQgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlRVNldDsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTE0Niw3ICsxODEsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgV2ViQXBwVmVyc2lvblR5cGUgVkVSU0lPTl9FREVGQVVMVCA9IFdlYkFwcFZlcnNpb25UeXBlLl8yNV9MSVRFUkFMOworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgV2ViQXBwVmVyc2lvblR5cGUgVkVSU0lPTl9FREVGQVVMVCA9IFdlYkFwcFZlcnNpb25UeXBlLl8zMF9MSVRFUkFMOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCkBAIC0xNjUsNyArMjAwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2ZXJzaW9uRVNldCA9IGZhbHNlOworCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25FU2V0OwogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KQEAgLTE4MSw2ICsyMTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUDsKIAl9CkBAIC0yMDIsOCArMjM4LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19ERVNDUklQVElPTlMpOworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19ERVNDUklQVElPTlMpOwogCX0KIAogCS8qKgpAQCAtMjExLDggKzI0Nyw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERpc3BsYXlOYW1lcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fRElTUExBWV9OQU1FUyk7CisJcHVibGljIExpc3Q8RGlzcGxheU5hbWU+IGdldERpc3BsYXlOYW1lcygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0RJU1BMQVlfTkFNRVMpOwogCX0KIAogCS8qKgpAQCAtMjIwLDggKzI1Niw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEljb25zKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19JQ09OUyk7CisJcHVibGljIExpc3Q8SWNvbj4gZ2V0SWNvbnMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19JQ09OUyk7CiAJfQogCiAJLyoqCkBAIC0yMjksOCArMjY1LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RGlzdHJpYnV0YWJsZXMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0RJU1RSSUJVVEFCTEVTKTsKKwlwdWJsaWMgTGlzdDxFbXB0eVR5cGU+IGdldERpc3RyaWJ1dGFibGVzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fRElTVFJJQlVUQUJMRVMpOwogCX0KIAogCS8qKgpAQCAtMjM4LDggKzI3NCw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbnRleHRQYXJhbXMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TKTsKKwlwdWJsaWMgTGlzdDxQYXJhbVZhbHVlPiBnZXRDb250ZXh0UGFyYW1zKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVMpOwogCX0KIAogCS8qKgpAQCAtMjQ3LDggKzI4Myw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpbHRlcnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0ZJTFRFUlMpOworCXB1YmxpYyBMaXN0PEZpbHRlcj4gZ2V0RmlsdGVycygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0ZJTFRFUlMpOwogCX0KIAogCS8qKgpAQCAtMjU2LDggKzI5Miw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpbHRlck1hcHBpbmdzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19GSUxURVJfTUFQUElOR1MpOworCXB1YmxpYyBMaXN0PEZpbHRlck1hcHBpbmc+IGdldEZpbHRlck1hcHBpbmdzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fRklMVEVSX01BUFBJTkdTKTsKIAl9CiAKIAkvKioKQEAgLTI2NSw4ICszMDEsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0xJU1RFTkVSUyk7CisJcHVibGljIExpc3Q8TGlzdGVuZXI+IGdldExpc3RlbmVycygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0xJU1RFTkVSUyk7CiAJfQogCiAJLyoqCkBAIC0yNzQsOCArMzEwLDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0U2VydmxldHMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1NFUlZMRVRTKTsKKwlwdWJsaWMgTGlzdDxTZXJ2bGV0PiBnZXRTZXJ2bGV0cygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1NFUlZMRVRTKTsKIAl9CiAKIAkvKioKQEAgLTI4Myw4ICszMTksOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2bGV0TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MpOworCXB1YmxpYyBMaXN0PFNlcnZsZXRNYXBwaW5nPiBnZXRTZXJ2bGV0TWFwcGluZ3MoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTKTsKIAl9CiAKIAkvKioKQEAgLTI5Miw4ICszMjgsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXNzaW9uQ29uZmlncygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fU0VTU0lPTl9DT05GSUdTKTsKKwlwdWJsaWMgTGlzdDxTZXNzaW9uQ29uZmlnPiBnZXRTZXNzaW9uQ29uZmlncygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1NFU1NJT05fQ09ORklHUyk7CiAJfQogCiAJLyoqCkBAIC0zMDEsOCArMzM3LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0TWltZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19NSU1FX01BUFBJTkdTKTsKKwlwdWJsaWMgTGlzdDxNaW1lTWFwcGluZz4gZ2V0TWltZU1hcHBpbmdzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fTUlNRV9NQVBQSU5HUyk7CiAJfQogCiAJLyoqCkBAIC0zMTAsOCArMzQ2LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0V2VsY29tZUZpbGVMaXN0cygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fV0VMQ09NRV9GSUxFX0xJU1RTKTsKKwlwdWJsaWMgTGlzdDxXZWxjb21lRmlsZUxpc3Q+IGdldFdlbGNvbWVGaWxlTGlzdHMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19XRUxDT01FX0ZJTEVfTElTVFMpOwogCX0KIAogCS8qKgpAQCAtMzE5LDggKzM1NSw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEVycm9yUGFnZXMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0VSUk9SX1BBR0VTKTsKKwlwdWJsaWMgTGlzdDxFcnJvclBhZ2U+IGdldEVycm9yUGFnZXMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19FUlJPUl9QQUdFUyk7CiAJfQogCiAJLyoqCkBAIC0zMjgsOCArMzY0LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0SnNwQ29uZmlncygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fSlNQX0NPTkZJR1MpOworCXB1YmxpYyBMaXN0PEpzcENvbmZpZz4gZ2V0SnNwQ29uZmlncygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0pTUF9DT05GSUdTKTsKIAl9CiAKIAkvKioKQEAgLTMzNyw4ICszNzMsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWN1cml0eUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19TRUNVUklUWV9DT05TVFJBSU5UUyk7CisJcHVibGljIExpc3Q8U2VjdXJpdHlDb25zdHJhaW50PiBnZXRTZWN1cml0eUNvbnN0cmFpbnRzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fU0VDVVJJVFlfQ09OU1RSQUlOVFMpOwogCX0KIAogCS8qKgpAQCAtMzQ2LDggKzM4Miw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldExvZ2luQ29uZmlncygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fTE9HSU5fQ09ORklHUyk7CisJcHVibGljIExpc3Q8TG9naW5Db25maWc+IGdldExvZ2luQ29uZmlncygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0xPR0lOX0NPTkZJR1MpOwogCX0KIAogCS8qKgpAQCAtMzU1LDggKzM5MSw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlY3VyaXR5Um9sZXMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTKTsKKwlwdWJsaWMgTGlzdDxTZWN1cml0eVJvbGU+IGdldFNlY3VyaXR5Um9sZXMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19TRUNVUklUWV9ST0xFUyk7CiAJfQogCiAJLyoqCkBAIC0zNjQsOCArNDAwLDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RW52RW50cmllcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fRU5WX0VOVFJJRVMpOworCXB1YmxpYyBMaXN0PEVudkVudHJ5PiBnZXRFbnZFbnRyaWVzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fRU5WX0VOVFJJRVMpOwogCX0KIAogCS8qKgpAQCAtMzczLDggKzQwOSw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldEVqYlJlZnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0VKQl9SRUZTKTsKKwlwdWJsaWMgTGlzdDxFamJSZWY+IGdldEVqYlJlZnMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19FSkJfUkVGUyk7CiAJfQogCiAJLyoqCkBAIC0zODIsOCArNDE4LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0RWpiTG9jYWxSZWZzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19FSkJfTE9DQUxfUkVGUyk7CisJcHVibGljIExpc3Q8RWpiTG9jYWxSZWY+IGdldEVqYkxvY2FsUmVmcygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0VKQl9MT0NBTF9SRUZTKTsKIAl9CiAKIAkvKioKQEAgLTM5MSw4ICs0MjcsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZXJ2aWNlUmVmcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fU0VSVklDRV9SRUZTKTsKKwlwdWJsaWMgTGlzdDxTZXJ2aWNlUmVmPiBnZXRTZXJ2aWNlUmVmcygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1NFUlZJQ0VfUkVGUyk7CiAJfQogCiAJLyoqCkBAIC00MDAsOCArNDM2LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VSZWZzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19SRVNPVVJDRV9SRUZTKTsKKwlwdWJsaWMgTGlzdDxSZXNvdXJjZVJlZj4gZ2V0UmVzb3VyY2VSZWZzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUyk7CiAJfQogCiAJLyoqCkBAIC00MDksOCArNDQ1LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUyk7CisJcHVibGljIExpc3Q8UmVzb3VyY2VFbnZSZWY+IGdldFJlc291cmNlRW52UmVmcygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1JFU09VUkNFX0VOVl9SRUZTKTsKIAl9CiAKIAkvKioKQEAgLTQxOCw4ICs0NTQsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOworCXB1YmxpYyBMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvblJlZj4gZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7CiAJfQogCiAJLyoqCkBAIC00MjcsOCArNDYzLDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTKTsKKwlwdWJsaWMgTGlzdDxQZXJzaXN0ZW5jZUNvbnRleHRSZWY+IGdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMpOwogCX0KIAogCS8qKgpAQCAtNDM2LDggKzQ3Miw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSB7Ci0JCXJldHVybiAoKEZlYXR1cmVNYXApZ2V0R3JvdXAoKSkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7CisJcHVibGljIExpc3Q8UGVyc2lzdGVuY2VVbml0UmVmPiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKIAl9CiAKIAkvKioKQEAgLTQ0NSw4ICs0ODEsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQb3N0Q29uc3RydWN0cygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fUE9TVF9DT05TVFJVQ1RTKTsKKwlwdWJsaWMgTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gZ2V0UG9zdENvbnN0cnVjdHMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19QT1NUX0NPTlNUUlVDVFMpOwogCX0KIAogCS8qKgpAQCAtNDU0LDggKzQ5MCw4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldFByZURlc3Ryb3lzKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19QUkVfREVTVFJPWVMpOworCXB1YmxpYyBMaXN0PExpZmVjeWNsZUNhbGxiYWNrPiBnZXRQcmVEZXN0cm95cygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX1BSRV9ERVNUUk9ZUyk7CiAJfQogCiAJLyoqCkBAIC00NjMsOCArNDk5LDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlMpOworCXB1YmxpYyBMaXN0PERhdGFTb3VyY2VUeXBlPiBnZXREYXRhU291cmNlKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fREFUQV9TT1VSQ0UpOwogCX0KIAogCS8qKgpAQCAtNDcyLDggKzUwOCwzNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcClnZXRHcm91cCgpKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9fTE9DQUxfRU5DT0RJTkdfTUFQUElOR1NfTElTVFMpOworCXB1YmxpYyBMaXN0PE1lc3NhZ2VEZXN0aW5hdGlvbj4gZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0PiBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1vZHVsZU5hbWUoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19NT0RVTEVfTkFNRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8QWJzb2x1dGVPcmRlcmluZ1R5cGU+IGdldEFic29sdXRlT3JkZXJpbmcoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX19BQlNPTFVURV9PUkRFUklORyk7CiAJfQogCiAJLyoqCkBAIC01OTQsNzIgKzY1Nyw3NyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fR1JPVVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fREVTQ1JJUFRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERlc2NyaXB0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRElTUExBWV9OQU1FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREaXNwbGF5TmFtZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0lDT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SWNvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RGlzdHJpYnV0YWJsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGlzdHJpYnV0YWJsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0NPTlRFWFRfUEFSQU1TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0Q29udGV4dFBhcmFtcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb250ZXh0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19GSUxURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RmlsdGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRGaWx0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19GSUxURVJfTUFQUElOR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRGaWx0ZXJNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRGaWx0ZXJNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTElTVEVORVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TGlzdGVuZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldExpc3RlbmVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2bGV0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZXJ2bGV0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlcnZsZXRNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZXJ2bGV0TWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFNlc3Npb25Db25maWdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlc3Npb25Db25maWdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NSU1FX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWltZU1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1pbWVNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fV0VMQ09NRV9GSUxFX0xJU1RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0V2VsY29tZUZpbGVMaXN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRXZWxjb21lRmlsZUxpc3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVycm9yUGFnZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RXJyb3JQYWdlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fSlNQX0NPTkZJR1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRKc3BDb25maWdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEpzcENvbmZpZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX0NPTlNUUkFJTlRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZWN1cml0eUNvbnN0cmFpbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TG9naW5Db25maWdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldExvZ2luQ29uZmlncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZWN1cml0eVJvbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlY3VyaXR5Um9sZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0VOVl9FTlRSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RW52RW50cmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRFbnZFbnRyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FSkJfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEVqYlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RWpiUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFamJMb2NhbFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RWpiTG9jYWxSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVJWSUNFX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZXJ2aWNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFJlc291cmNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRSZXNvdXJjZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1JFU09VUkNFX0VOVl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUE9TVF9DT05TVFJVQ1RTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0UG9zdENvbnN0cnVjdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UG9zdENvbnN0cnVjdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BSRV9ERVNUUk9ZUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZURlc3Ryb3lzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByZURlc3Ryb3lzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19EQVRBX1NPVVJDRToKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERhdGFTb3VyY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19BQlNPTFVURV9PUkRFUklORzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEFic29sdXRlT3JkZXJpbmcoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC02NjksMTEgKzczNywxNCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fR1JPVVA6CiAJCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAoKTsKIAkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLmdldFdyYXBwZXIoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NT0RVTEVfTkFNRToKKwkJCQlyZXR1cm4gZ2V0TW9kdWxlTmFtZSgpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RFU0NSSVBUSU9OUzoKIAkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25zKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRElTUExBWV9OQU1FUzoKQEAgLTczMiwxNCArODAzLDE4IEBACiAJCQkJcmV0dXJuIGdldFBvc3RDb25zdHJ1Y3RzKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUFJFX0RFU1RST1lTOgogCQkJCXJldHVybiBnZXRQcmVEZXN0cm95cygpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RBVEFfU09VUkNFOgorCQkJCXJldHVybiBnZXREYXRhU291cmNlKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6CiAJCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUzoKIAkJCQlyZXR1cm4gZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19BQlNPTFVURV9PUkRFUklORzoKKwkJCQlyZXR1cm4gZ2V0QWJzb2x1dGVPcmRlcmluZygpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0lEOgogCQkJCXJldHVybiBnZXRJZCgpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXJldHVybiBpc01ldGFkYXRhQ29tcGxldGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisJCQkJcmV0dXJuIGlzTWV0YWRhdGFDb21wbGV0ZSgpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1ZFUlNJT046CiAJCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKIAkJfQpAQCAtNzUxLDE0MCArODI2LDE1NCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0dST1VQOgogCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5zZXQobmV3VmFsdWUpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NT0RVTEVfTkFNRToKKwkJCQlnZXRNb2R1bGVOYW1lKCkuY2xlYXIoKTsKKwkJCQlnZXRNb2R1bGVOYW1lKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGVzY3JpcHRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RJU1BMQVlfTkFNRVM6CiAJCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXREaXNwbGF5TmFtZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzcGxheU5hbWU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fSUNPTlM6CiAJCQkJZ2V0SWNvbnMoKS5jbGVhcigpOwotCQkJCWdldEljb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRJY29ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSWNvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19ESVNUUklCVVRBQkxFUzoKIAkJCQlnZXREaXN0cmlidXRhYmxlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RGlzdHJpYnV0YWJsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERpc3RyaWJ1dGFibGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFbXB0eVR5cGU+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVM6CiAJCQkJZ2V0Q29udGV4dFBhcmFtcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGV4dFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0Q29udGV4dFBhcmFtcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGFyYW1WYWx1ZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19GSUxURVJTOgogCQkJCWdldEZpbHRlcnMoKS5jbGVhcigpOwotCQkJCWdldEZpbHRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEZpbHRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEZpbHRlcj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19GSUxURVJfTUFQUElOR1M6CiAJCQkJZ2V0RmlsdGVyTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldEZpbHRlck1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRGaWx0ZXJNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRmlsdGVyTWFwcGluZz4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MSVNURU5FUlM6CiAJCQkJZ2V0TGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRMaXN0ZW5lcnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldExpc3RlbmVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTGlzdGVuZXI+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVkxFVFM6CiAJCQkJZ2V0U2VydmxldHMoKS5jbGVhcigpOwotCQkJCWdldFNlcnZsZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRTZXJ2bGV0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VydmxldD4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19TRVJWTEVUX01BUFBJTkdTOgogCQkJCWdldFNlcnZsZXRNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VydmxldE1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRTZXJ2bGV0TWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlcnZsZXRNYXBwaW5nPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFU1NJT05fQ09ORklHUzoKIAkJCQlnZXRTZXNzaW9uQ29uZmlncygpLmNsZWFyKCk7Ci0JCQkJZ2V0U2Vzc2lvbkNvbmZpZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFNlc3Npb25Db25maWdzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZXNzaW9uQ29uZmlnPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01JTUVfTUFQUElOR1M6CiAJCQkJZ2V0TWltZU1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRNaW1lTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldE1pbWVNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWltZU1hcHBpbmc+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fV0VMQ09NRV9GSUxFX0xJU1RTOgogCQkJCWdldFdlbGNvbWVGaWxlTGlzdHMoKS5jbGVhcigpOwotCQkJCWdldFdlbGNvbWVGaWxlTGlzdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFdlbGNvbWVGaWxlTGlzdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFdlbGNvbWVGaWxlTGlzdD4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FUlJPUl9QQUdFUzoKIAkJCQlnZXRFcnJvclBhZ2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRFcnJvclBhZ2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRFcnJvclBhZ2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFcnJvclBhZ2U+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fSlNQX0NPTkZJR1M6CiAJCQkJZ2V0SnNwQ29uZmlncygpLmNsZWFyKCk7Ci0JCQkJZ2V0SnNwQ29uZmlncygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SnNwQ29uZmlncygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSnNwQ29uZmlnPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX0NPTlNUUkFJTlRTOgogCQkJCWdldFNlY3VyaXR5Q29uc3RyYWludHMoKS5jbGVhcigpOwotCQkJCWdldFNlY3VyaXR5Q29uc3RyYWludHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFNlY3VyaXR5Q29uc3RyYWludHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3VyaXR5Q29uc3RyYWludD4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0dJTl9DT05GSUdTOgogCQkJCWdldExvZ2luQ29uZmlncygpLmNsZWFyKCk7Ci0JCQkJZ2V0TG9naW5Db25maWdzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRMb2dpbkNvbmZpZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIExvZ2luQ29uZmlnPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1NFQ1VSSVRZX1JPTEVTOgogCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5jbGVhcigpOwotCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3VyaXR5Um9sZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FTlZfRU5UUklFUzoKIAkJCQlnZXRFbnZFbnRyaWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnZFbnRyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRFbnZFbnRyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFbnZFbnRyeT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19FSkJfUkVGUzoKIAkJCQlnZXRFamJSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRFamJSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFamJSZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlM6CiAJCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRFamJMb2NhbFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldEVqYkxvY2FsUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRWpiTG9jYWxSZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fU0VSVklDRV9SRUZTOgogCQkJCWdldFNlcnZpY2VSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRTZXJ2aWNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlcnZpY2VSZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUzoKIAkJCQlnZXRSZXNvdXJjZVJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXNvdXJjZVJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19SRVNPVVJDRV9FTlZfUkVGUzoKIAkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOwotCQkJCWdldFJlc291cmNlRW52UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXNvdXJjZUVudlJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6CiAJCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWVzc2FnZURlc3RpbmF0aW9uUmVmPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKIAkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW5jZUNvbnRleHRSZWY+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgogCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5jbGVhcigpOwotCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFJlZj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19QT1NUX0NPTlNUUlVDVFM6CiAJCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5jbGVhcigpOwotCQkJCWdldFBvc3RDb25zdHJ1Y3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKKwkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTGlmZWN5Y2xlQ2FsbGJhY2s+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUFJFX0RFU1RST1lTOgogCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmVEZXN0cm95cygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0UHJlRGVzdHJveXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIExpZmVjeWNsZUNhbGxiYWNrPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RBVEFfU09VUkNFOgorCQkJCWdldERhdGFTb3VyY2UoKS5jbGVhcigpOworCQkJCWdldERhdGFTb3VyY2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERhdGFTb3VyY2VUeXBlPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgogCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1lc3NhZ2VEZXN0aW5hdGlvbj4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUzoKIAkJCQlnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0FCU09MVVRFX09SREVSSU5HOgorCQkJCWdldEFic29sdXRlT3JkZXJpbmcoKS5jbGVhcigpOworCQkJCWdldEFic29sdXRlT3JkZXJpbmcoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEFic29sdXRlT3JkZXJpbmdUeXBlPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0lEOgogCQkJCXNldElkKChTdHJpbmcpbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVRBREFUQV9DT01QTEVURToKLQkJCQlzZXRNZXRhZGF0YUNvbXBsZXRlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOworCQkJCXNldE1ldGFkYXRhQ29tcGxldGUoKEJvb2xlYW4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19WRVJTSU9OOgogCQkJCXNldFZlcnNpb24oKFdlYkFwcFZlcnNpb25UeXBlKW5ld1ZhbHVlKTsKQEAgLTg5OCwxMSArOTg3LDE1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fR1JPVVA6CiAJCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwogCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NT0RVTEVfTkFNRToKKwkJCQlnZXRNb2R1bGVOYW1lKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOwpAQCAtOTkwLDEyICsxMDgzLDE4IEBACiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUFJFX0RFU1RST1lTOgogCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fREFUQV9TT1VSQ0U6CisJCQkJZ2V0RGF0YVNvdXJjZSgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgogCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUzoKIAkJCQlnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpLmNsZWFyKCk7CiAJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0FCU09MVVRFX09SREVSSU5HOgorCQkJCWdldEFic29sdXRlT3JkZXJpbmcoKS5jbGVhcigpOworCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19JRDoKIAkJCQlzZXRJZChJRF9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwpAQCAtMTAxNCwxMCArMTExMywxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0dST1VQOgogCQkJCXJldHVybiBncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fTU9EVUxFX05BTUU6CisJCQkJcmV0dXJuICFnZXRNb2R1bGVOYW1lKCkuaXNFbXB0eSgpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0RFU0NSSVBUSU9OUzoKIAkJCQlyZXR1cm4gIWdldERlc2NyaXB0aW9ucygpLmlzRW1wdHkoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19ESVNQTEFZX05BTUVTOgpAQCAtMTA3NiwxMCArMTE3OCwxNCBAQAogCQkJCXJldHVybiAhZ2V0UG9zdENvbnN0cnVjdHMoKS5pc0VtcHR5KCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fUFJFX0RFU1RST1lTOgogCQkJCXJldHVybiAhZ2V0UHJlRGVzdHJveXMoKS5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9fREFUQV9TT1VSQ0U6CisJCQkJcmV0dXJuICFnZXREYXRhU291cmNlKCkuaXNFbXB0eSgpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TOgogCQkJCXJldHVybiAhZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpLmlzRW1wdHkoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUzoKIAkJCQlyZXR1cm4gIWdldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkuaXNFbXB0eSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfX0FCU09MVVRFX09SREVSSU5HOgorCQkJCXJldHVybiAhZ2V0QWJzb2x1dGVPcmRlcmluZygpLmlzRW1wdHkoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19JRDoKIAkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlkICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlkKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX19NRVRBREFUQV9DT01QTEVURToKQEAgLTEwOTUsNiArMTIwMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJGYWN0b3J5SW1wbC5qYXZhCmluZGV4IGJiYTMyY2IuLjQyY2I5MjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2ViRmFjdG9yeUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYkZhY3RvcnlJbXBsLmphdmEKQEAgLTcxLDkgKzcxLDE2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CiAJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuQUJTT0xVVEVfT1JERVJJTkdfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFic29sdXRlT3JkZXJpbmdUeXBlKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuQVVUSF9DT05TVFJBSU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQXV0aENvbnN0cmFpbnQoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09NTUVOVF9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29va2llQ29tbWVudFR5cGUoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb29raWVDb25maWdUeXBlKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0RPTUFJTl9UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29va2llRG9tYWluVHlwZSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9OQU1FX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb29raWVOYW1lVHlwZSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9QQVRIX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb29raWVQYXRoVHlwZSgpOwogCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVFcnJvclBhZ2UoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVGaWx0ZXIoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5GSUxURVJfTUFQUElORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUZpbHRlck1hcHBpbmcoKTsKQEAgLTgyLDYgKzg5LDEwIEBACiAJCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUc6IHJldHVybiAoRU9iamVjdCljcmVhdGVMb2dpbkNvbmZpZygpOwogCQkJY2FzZSBXZWJQYWNrYWdlLk1JTUVfTUFQUElORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1pbWVNYXBwaW5nKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuTVVMVElQQVJUX0NPTkZJR19UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTXVsdGlwYXJ0Q29uZmlnVHlwZSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLk9SREVSSU5HX09SREVSSU5HX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVPcmRlcmluZ09yZGVyaW5nVHlwZSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLk9SREVSSU5HX09USEVSU19UWVBFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlT3JkZXJpbmdPdGhlcnNUeXBlKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuT1JERVJJTkdfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU9yZGVyaW5nVHlwZSgpOwogCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVTZWN1cml0eUNvbnN0cmFpbnQoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlU2VydmxldCgpOwogCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTUFQUElORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNlcnZsZXRNYXBwaW5nKCk7CkBAIC04OSw2ICsxMDAsNyBAQAogCQkJY2FzZSBXZWJQYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVXNlckRhdGFDb25zdHJhaW50KCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdlYkFwcCgpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVXZWJGcmFnbWVudCgpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uKCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVXZWxjb21lRmlsZUxpc3QoKTsKIAkJCWRlZmF1bHQ6CkBAIC0xMDEsMTIgKzExMywxNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewogCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBXZWJQYWNrYWdlLkRJU1BBVENIRVJfVFlQRToKIAkJCQlyZXR1cm4gY3JlYXRlRGlzcGF0Y2hlclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5OVUxMX0NIQVJfVFlQRToKIAkJCQlyZXR1cm4gY3JlYXRlTnVsbENoYXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIFdlYlBhY2thZ2UuVFJBQ0tJTkdfTU9ERV9UWVBFOgorCQkJCXJldHVybiBjcmVhdGVUcmFja2luZ01vZGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIFdlYlBhY2thZ2UuVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFOgogCQkJCXJldHVybiBjcmVhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9WRVJTSU9OX1RZUEU6CkBAIC0xMzUsNiArMTUwLDggQEAKIAkJCQlyZXR1cm4gY3JlYXRlTnVsbENoYXJUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9OQU1FX1RZUEU6CiAJCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXROYW1lVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBXZWJQYWNrYWdlLlRSQUNLSU5HX01PREVfVFlQRV9PQkpFQ1Q6CisJCQkJcmV0dXJuIGNyZWF0ZVRyYWNraW5nTW9kZVR5cGVPYmplY3RGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5UUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEVfT0JKRUNUOgogCQkJCXJldHVybiBjcmVhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0FSX1BBVEhfVFlQRToKQEAgLTE1MSwxMiArMTY4LDE1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CiAJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuRElTUEFUQ0hFUl9UWVBFOgogCQkJCXJldHVybiBjb252ZXJ0RGlzcGF0Y2hlclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJY2FzZSBXZWJQYWNrYWdlLk5VTExfQ0hBUl9UWVBFOgogCQkJCXJldHVybiBjb252ZXJ0TnVsbENoYXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5UUkFDS0lOR19NT0RFX1RZUEU6CisJCQkJcmV0dXJuIGNvbnZlcnRUcmFja2luZ01vZGVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5UUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEU6CiAJCQkJcmV0dXJuIGNvbnZlcnRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX1ZFUlNJT05fVFlQRToKQEAgLTE4NSw2ICsyMDUsOCBAQAogCQkJCXJldHVybiBjb252ZXJ0TnVsbENoYXJUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUX05BTUVfVFlQRToKIAkJCQlyZXR1cm4gY29udmVydFNlcnZsZXROYW1lVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIFdlYlBhY2thZ2UuVFJBQ0tJTkdfTU9ERV9UWVBFX09CSkVDVDoKKwkJCQlyZXR1cm4gY29udmVydFRyYWNraW5nTW9kZVR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJY2FzZSBXZWJQYWNrYWdlLlRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRV9PQkpFQ1Q6CiAJCQkJcmV0dXJuIGNvbnZlcnRUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XQVJfUEFUSF9UWVBFOgpAQCAtMjAxLDYgKzIyMywxNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgQWJzb2x1dGVPcmRlcmluZ1R5cGUgY3JlYXRlQWJzb2x1dGVPcmRlcmluZ1R5cGUoKSB7CisJCUFic29sdXRlT3JkZXJpbmdUeXBlSW1wbCBhYnNvbHV0ZU9yZGVyaW5nVHlwZSA9IG5ldyBBYnNvbHV0ZU9yZGVyaW5nVHlwZUltcGwoKTsKKwkJcmV0dXJuIGFic29sdXRlT3JkZXJpbmdUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBBdXRoQ29uc3RyYWludCBjcmVhdGVBdXRoQ29uc3RyYWludCgpIHsKIAkJQXV0aENvbnN0cmFpbnRJbXBsIGF1dGhDb25zdHJhaW50ID0gbmV3IEF1dGhDb25zdHJhaW50SW1wbCgpOwogCQlyZXR1cm4gYXV0aENvbnN0cmFpbnQ7CkBAIC0yMTEsNiArMjQzLDU2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBDb29raWVDb21tZW50VHlwZSBjcmVhdGVDb29raWVDb21tZW50VHlwZSgpIHsKKwkJQ29va2llQ29tbWVudFR5cGVJbXBsIGNvb2tpZUNvbW1lbnRUeXBlID0gbmV3IENvb2tpZUNvbW1lbnRUeXBlSW1wbCgpOworCQlyZXR1cm4gY29va2llQ29tbWVudFR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvb2tpZUNvbmZpZ1R5cGUgY3JlYXRlQ29va2llQ29uZmlnVHlwZSgpIHsKKwkJQ29va2llQ29uZmlnVHlwZUltcGwgY29va2llQ29uZmlnVHlwZSA9IG5ldyBDb29raWVDb25maWdUeXBlSW1wbCgpOworCQlyZXR1cm4gY29va2llQ29uZmlnVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ29va2llRG9tYWluVHlwZSBjcmVhdGVDb29raWVEb21haW5UeXBlKCkgeworCQlDb29raWVEb21haW5UeXBlSW1wbCBjb29raWVEb21haW5UeXBlID0gbmV3IENvb2tpZURvbWFpblR5cGVJbXBsKCk7CisJCXJldHVybiBjb29raWVEb21haW5UeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDb29raWVOYW1lVHlwZSBjcmVhdGVDb29raWVOYW1lVHlwZSgpIHsKKwkJQ29va2llTmFtZVR5cGVJbXBsIGNvb2tpZU5hbWVUeXBlID0gbmV3IENvb2tpZU5hbWVUeXBlSW1wbCgpOworCQlyZXR1cm4gY29va2llTmFtZVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENvb2tpZVBhdGhUeXBlIGNyZWF0ZUNvb2tpZVBhdGhUeXBlKCkgeworCQlDb29raWVQYXRoVHlwZUltcGwgY29va2llUGF0aFR5cGUgPSBuZXcgQ29va2llUGF0aFR5cGVJbXBsKCk7CisJCXJldHVybiBjb29raWVQYXRoVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRXJyb3JQYWdlIGNyZWF0ZUVycm9yUGFnZSgpIHsKIAkJRXJyb3JQYWdlSW1wbCBlcnJvclBhZ2UgPSBuZXcgRXJyb3JQYWdlSW1wbCgpOwogCQlyZXR1cm4gZXJyb3JQYWdlOwpAQCAtMjkxLDYgKzM3Myw0NiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgTXVsdGlwYXJ0Q29uZmlnVHlwZSBjcmVhdGVNdWx0aXBhcnRDb25maWdUeXBlKCkgeworCQlNdWx0aXBhcnRDb25maWdUeXBlSW1wbCBtdWx0aXBhcnRDb25maWdUeXBlID0gbmV3IE11bHRpcGFydENvbmZpZ1R5cGVJbXBsKCk7CisJCXJldHVybiBtdWx0aXBhcnRDb25maWdUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBPcmRlcmluZ09yZGVyaW5nVHlwZSBjcmVhdGVPcmRlcmluZ09yZGVyaW5nVHlwZSgpIHsKKwkJT3JkZXJpbmdPcmRlcmluZ1R5cGVJbXBsIG9yZGVyaW5nT3JkZXJpbmdUeXBlID0gbmV3IE9yZGVyaW5nT3JkZXJpbmdUeXBlSW1wbCgpOworCQlyZXR1cm4gb3JkZXJpbmdPcmRlcmluZ1R5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE9yZGVyaW5nT3RoZXJzVHlwZSBjcmVhdGVPcmRlcmluZ090aGVyc1R5cGUoKSB7CisJCU9yZGVyaW5nT3RoZXJzVHlwZUltcGwgb3JkZXJpbmdPdGhlcnNUeXBlID0gbmV3IE9yZGVyaW5nT3RoZXJzVHlwZUltcGwoKTsKKwkJcmV0dXJuIG9yZGVyaW5nT3RoZXJzVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgT3JkZXJpbmdUeXBlIGNyZWF0ZU9yZGVyaW5nVHlwZSgpIHsKKwkJT3JkZXJpbmdUeXBlSW1wbCBvcmRlcmluZ1R5cGUgPSBuZXcgT3JkZXJpbmdUeXBlSW1wbCgpOworCQlyZXR1cm4gb3JkZXJpbmdUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBTZWN1cml0eUNvbnN0cmFpbnQgY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50KCkgewogCQlTZWN1cml0eUNvbnN0cmFpbnRJbXBsIHNlY3VyaXR5Q29uc3RyYWludCA9IG5ldyBTZWN1cml0eUNvbnN0cmFpbnRJbXBsKCk7CiAJCXJldHVybiBzZWN1cml0eUNvbnN0cmFpbnQ7CkBAIC0zNjEsNiArNDgzLDE2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBXZWJGcmFnbWVudCBjcmVhdGVXZWJGcmFnbWVudCgpIHsKKwkJV2ViRnJhZ21lbnRJbXBsIHdlYkZyYWdtZW50ID0gbmV3IFdlYkZyYWdtZW50SW1wbCgpOworCQlyZXR1cm4gd2ViRnJhZ21lbnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIFdlYlJlc291cmNlQ29sbGVjdGlvbiBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKSB7CiAJCVdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwgd2ViUmVzb3VyY2VDb2xsZWN0aW9uID0gbmV3IFdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwoKTsKIAkJcmV0dXJuIHdlYlJlc291cmNlQ29sbGVjdGlvbjsKQEAgLTQyMSw2ICs1NTMsMjYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIFRyYWNraW5nTW9kZVR5cGUgY3JlYXRlVHJhY2tpbmdNb2RlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlUcmFja2luZ01vZGVUeXBlIHJlc3VsdCA9IFRyYWNraW5nTW9kZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFRyYWNraW5nTW9kZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBjcmVhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgcmVzdWx0ID0gVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKIAkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCkBAIC00ODAsNyArNjMyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHVibGljIERpc3BhdGNoZXJUeXBlIGNyZWF0ZURpc3BhdGNoZXJUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoRGlzcGF0Y2hlclR5cGUpY3JlYXRlRGlzcGF0Y2hlclR5cGVGcm9tU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuRElTUEFUQ0hFUl9UWVBFLCBpbml0aWFsVmFsdWUpOworCQlyZXR1cm4gY3JlYXRlRGlzcGF0Y2hlclR5cGVGcm9tU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuRElTUEFUQ0hFUl9UWVBFLCBpbml0aWFsVmFsdWUpOwogCX0KIAogCS8qKgpAQCAtNTM0LDcgKzY4Niw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBTdHJpbmcgY3JlYXRlRmlsdGVyTmFtZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpY3JlYXRlTm9uRW1wdHlTdHJpbmdUeXBlRnJvbVN0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLk5PTl9FTVBUWV9TVFJJTkdfVFlQRSwgaW5pdGlhbFZhbHVlKTsKKwkJcmV0dXJuIGNyZWF0ZU5vbkVtcHR5U3RyaW5nVHlwZUZyb21TdHJpbmcoV2ViUGFja2FnZS5MaXRlcmFscy5OT05fRU1QVFlfU1RSSU5HX1RZUEUsIGluaXRpYWxWYWx1ZSk7CiAJfQogCiAJLyoqCkBAIC01NzQsNyArNzI2LDcgQEAKIAkJT2JqZWN0IHJlc3VsdCA9IG51bGw7CiAJCVJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uID0gbnVsbDsKIAkJdHJ5IHsKLQkJCXJlc3VsdCA9IChPYmplY3QpY3JlYXRlTnVsbENoYXJUeXBlRnJvbVN0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLk5VTExfQ0hBUl9UWVBFLCBpbml0aWFsVmFsdWUpOworCQkJcmVzdWx0ID0gY3JlYXRlTnVsbENoYXJUeXBlRnJvbVN0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLk5VTExfQ0hBUl9UWVBFLCBpbml0aWFsVmFsdWUpOwogCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIERpYWdub3N0aWNpYW4uSU5TVEFOQ0UudmFsaWRhdGUoZURhdGFUeXBlLCByZXN1bHQsIG51bGwsIG51bGwpKSB7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KQEAgLTU4Myw3ICs3MzUsNyBAQAogCQkJZXhjZXB0aW9uID0gZTsKIAkJfQogCQl0cnkgewotCQkJcmVzdWx0ID0gKE9iamVjdClYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5MaXRlcmFscy5JTlRFR0VSLCBpbml0aWFsVmFsdWUpOworCQkJcmVzdWx0ID0gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHMuSU5URUdFUiwgaW5pdGlhbFZhbHVlKTsKIAkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVEYXRhVHlwZSwgcmVzdWx0LCBudWxsLCBudWxsKSkgewogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CkBAIC02MjAsNyArNzcyLDcgQEAKIAkJfQogCQlTdHJpbmcgdmFsdWUgPSBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CiAJCWlmICh2YWx1ZSAhPSBudWxsKSByZXR1cm4gdmFsdWU7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdmFsdWU6ICciK2luc3RhbmNlVmFsdWUrIicgZm9yIGRhdGF0eXBlIDoiK2VEYXRhVHlwZS5nZXROYW1lKCkpOworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHZhbHVlOiAnIitpbnN0YW5jZVZhbHVlKyInIGZvciBkYXRhdHlwZSA6IitlRGF0YVR5cGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJfQogCiAJLyoqCkBAIC02ODMsNyArODM1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHVibGljIE51bGxDaGFyVHlwZSBjcmVhdGVOdWxsQ2hhclR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChOdWxsQ2hhclR5cGUpY3JlYXRlTnVsbENoYXJUeXBlRnJvbVN0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLk5VTExfQ0hBUl9UWVBFLCBpbml0aWFsVmFsdWUpOworCQlyZXR1cm4gY3JlYXRlTnVsbENoYXJUeXBlRnJvbVN0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLk5VTExfQ0hBUl9UWVBFLCBpbml0aWFsVmFsdWUpOwogCX0KIAogCS8qKgpAQCAtNzAxLDcgKzg1Myw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBTdHJpbmcgY3JlYXRlU2VydmxldE5hbWVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKWNyZWF0ZU5vbkVtcHR5U3RyaW5nVHlwZUZyb21TdHJpbmcoV2ViUGFja2FnZS5MaXRlcmFscy5OT05fRU1QVFlfU1RSSU5HX1RZUEUsIGluaXRpYWxWYWx1ZSk7CisJCXJldHVybiBjcmVhdGVOb25FbXB0eVN0cmluZ1R5cGVGcm9tU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTk9OX0VNUFRZX1NUUklOR19UWVBFLCBpbml0aWFsVmFsdWUpOwogCX0KIAogCS8qKgpAQCAtNzE4LDggKzg3MCwyNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgVHJhY2tpbmdNb2RlVHlwZSBjcmVhdGVUcmFja2luZ01vZGVUeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCXJldHVybiBjcmVhdGVUcmFja2luZ01vZGVUeXBlRnJvbVN0cmluZyhXZWJQYWNrYWdlLkxpdGVyYWxzLlRSQUNLSU5HX01PREVfVFlQRSwgaW5pdGlhbFZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUcmFja2luZ01vZGVUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGNvbnZlcnRUcmFja2luZ01vZGVUeXBlVG9TdHJpbmcoV2ViUGFja2FnZS5MaXRlcmFscy5UUkFDS0lOR19NT0RFX1RZUEUsIGluc3RhbmNlVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIGNyZWF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKWNyZWF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGVGcm9tU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFLCBpbml0aWFsVmFsdWUpOworCQlyZXR1cm4gY3JlYXRlVHJhbnNwb3J0R3VhcmFudGVlVHlwZUZyb21TdHJpbmcoV2ViUGFja2FnZS5MaXRlcmFscy5UUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEUsIGluaXRpYWxWYWx1ZSk7CiAJfQogCiAJLyoqCkBAIC03NTUsNyArOTI1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHVibGljIFdlYkFwcFZlcnNpb25UeXBlIGNyZWF0ZVdlYkFwcFZlcnNpb25UeXBlT2JqZWN0RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoV2ViQXBwVmVyc2lvblR5cGUpY3JlYXRlV2ViQXBwVmVyc2lvblR5cGVGcm9tU3RyaW5nKFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9WRVJTSU9OX1RZUEUsIGluaXRpYWxWYWx1ZSk7CisJCXJldHVybiBjcmVhdGVXZWJBcHBWZXJzaW9uVHlwZUZyb21TdHJpbmcoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX1ZFUlNJT05fVFlQRSwgaW5pdGlhbFZhbHVlKTsKIAl9CiAKIAkvKioKQEAgLTc4Miw2ICs5NTIsNyBAQAogCSAqIEBkZXByZWNhdGVkCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBEZXByZWNhdGVkCiAJcHVibGljIHN0YXRpYyBXZWJQYWNrYWdlIGdldFBhY2thZ2UoKSB7CiAJCXJldHVybiBXZWJQYWNrYWdlLmVJTlNUQU5DRTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYkZyYWdtZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJGcmFnbWVudEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjE3YzM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJGcmFnbWVudEltcGwuamF2YQpAQCAtMCwwICsxLDEyMzAgQEAKKy8qKgorICogPGNvcHlyaWdodD4KKyAqIDwvY29weXJpZ2h0PgorICoKKyAqICRJZDogV2ViRnJhZ21lbnRJbXBsLmphdmEsdiAxLjMgMjAxMC8wMi8xMSAwNjoyMjo1MCBjYW5kZXJzb24gRXhwICQKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRGF0YVNvdXJjZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRW1wdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSWNvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlmZWN5Y2xlQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5NZXNzYWdlRGVzdGluYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLk1lc3NhZ2VEZXN0aW5hdGlvblJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VDb250ZXh0UmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZVVuaXRSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlRW52UmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuSnNwQ29uZmlnOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQWJzb2x1dGVPcmRlcmluZ1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTG9naW5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTWltZU1hcHBpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwVmVyc2lvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZyYWdtZW50PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZyYWdtZW50SW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsI2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZyYWdtZW50SW1wbCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsI2dldEljb25zIDxlbT5JY29uczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwjZ2V0RGlzdHJpYnV0YWJsZXMgPGVtPkRpc3RyaWJ1dGFibGVzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZyYWdtZW50SW1wbCNnZXRDb250ZXh0UGFyYW1zIDxlbT5Db250ZXh0IFBhcmFtczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwjZ2V0RmlsdGVycyA8ZW0+RmlsdGVyczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwjZ2V0RmlsdGVyTWFwcGluZ3MgPGVtPkZpbHRlciBNYXBwaW5nczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwjZ2V0TGlzdGVuZXJzIDxlbT5MaXN0ZW5lcnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsI2dldFNlcnZsZXRzIDxlbT5TZXJ2bGV0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwjZ2V0U2VydmxldE1hcHBpbmdzIDxlbT5TZXJ2bGV0IE1hcHBpbmdzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZyYWdtZW50SW1wbCNnZXRTZXNzaW9uQ29uZmlncyA8ZW0+U2Vzc2lvbiBDb25maWdzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZyYWdtZW50SW1wbCNnZXRNaW1lTWFwcGluZ3MgPGVtPk1pbWUgTWFwcGluZ3M8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsI2dldFdlbGNvbWVGaWxlTGlzdHMgPGVtPldlbGNvbWUgRmlsZSBMaXN0czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwjZ2V0RXJyb3JQYWdlcyA8ZW0+RXJyb3IgUGFnZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsI2dldEpzcENvbmZpZ3MgPGVtPkpzcCBDb25maWdzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZyYWdtZW50SW1wbCNnZXRTZWN1cml0eUNvbnN0cmFpbnRzIDxlbT5TZWN1cml0eSBDb25zdHJhaW50czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwjZ2V0TG9naW5Db25maWdzIDxlbT5Mb2dpbiBDb25maWdzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZyYWdtZW50SW1wbCNnZXRTZWN1cml0eVJvbGVzIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwjZ2V0RW52RW50cmllcyA8ZW0+RW52IEVudHJpZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsI2dldEVqYlJlZnMgPGVtPkVqYiBSZWZzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZyYWdtZW50SW1wbCNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZyYWdtZW50SW1wbCNnZXRTZXJ2aWNlUmVmcyA8ZW0+U2VydmljZSBSZWZzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZyYWdtZW50SW1wbCNnZXRSZXNvdXJjZVJlZnMgPGVtPlJlc291cmNlIFJlZnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsI2dldFJlc291cmNlRW52UmVmcyA8ZW0+UmVzb3VyY2UgRW52IFJlZnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsI2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwjZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZyYWdtZW50SW1wbCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsI2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsI2dldFByZURlc3Ryb3lzIDxlbT5QcmUgRGVzdHJveXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsI2dldERhdGFTb3VyY2UgPGVtPkRhdGEgU291cmNlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZyYWdtZW50SW1wbCNnZXRNZXNzYWdlRGVzdGluYXRpb25zIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwjZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMgPGVtPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzIExpc3RzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkZyYWdtZW50SW1wbCNnZXRPcmRlcmluZyA8ZW0+T3JkZXJpbmc8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwjaXNNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFdlYkZyYWdtZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV2ViRnJhZ21lbnQgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEdyb3VwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRJZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBpZCA9IElEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWV0YWRhdGFDb21wbGV0ZSgpIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWV0YWRhdGFDb21wbGV0ZSgpIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNNZXRhZGF0YUNvbXBsZXRlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlID0gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1ldGFkYXRhIENvbXBsZXRlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlRVNldDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFZlcnNpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgV2ViQXBwVmVyc2lvblR5cGUgVkVSU0lPTl9FREVGQVVMVCA9IFdlYkFwcFZlcnNpb25UeXBlLl8yNV9MSVRFUkFMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRWZXJzaW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgV2ViQXBwVmVyc2lvblR5cGUgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZlcnNpb24gYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25FU2V0OworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFdlYkZyYWdtZW50SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwKCkgeworCQlpZiAoZ3JvdXAgPT0gbnVsbCkgeworCQkJZ3JvdXAgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19HUk9VUCk7CisJCX0KKwkJcmV0dXJuIGdyb3VwOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PERlc2NyaXB0aW9uPiBnZXREZXNjcmlwdGlvbnMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfRlJBR01FTlRfX0RFU0NSSVBUSU9OUyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8RGlzcGxheU5hbWU+IGdldERpc3BsYXlOYW1lcygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9GUkFHTUVOVF9fRElTUExBWV9OQU1FUyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8SWNvbj4gZ2V0SWNvbnMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfRlJBR01FTlRfX0lDT05TKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE5hbWUoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfRlJBR01FTlRfX05BTUUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PEVtcHR5VHlwZT4gZ2V0RGlzdHJpYnV0YWJsZXMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfRlJBR01FTlRfX0RJU1RSSUJVVEFCTEVTKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxQYXJhbVZhbHVlPiBnZXRDb250ZXh0UGFyYW1zKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UX19DT05URVhUX1BBUkFNUyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8RmlsdGVyPiBnZXRGaWx0ZXJzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UX19GSUxURVJTKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxGaWx0ZXJNYXBwaW5nPiBnZXRGaWx0ZXJNYXBwaW5ncygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9GUkFHTUVOVF9fRklMVEVSX01BUFBJTkdTKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UX19MSVNURU5FUlMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PFNlcnZsZXQ+IGdldFNlcnZsZXRzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UX19TRVJWTEVUUyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8U2VydmxldE1hcHBpbmc+IGdldFNlcnZsZXRNYXBwaW5ncygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9GUkFHTUVOVF9fU0VSVkxFVF9NQVBQSU5HUyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8U2Vzc2lvbkNvbmZpZz4gZ2V0U2Vzc2lvbkNvbmZpZ3MoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfRlJBR01FTlRfX1NFU1NJT05fQ09ORklHUyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8TWltZU1hcHBpbmc+IGdldE1pbWVNYXBwaW5ncygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9GUkFHTUVOVF9fTUlNRV9NQVBQSU5HUyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8V2VsY29tZUZpbGVMaXN0PiBnZXRXZWxjb21lRmlsZUxpc3RzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UX19XRUxDT01FX0ZJTEVfTElTVFMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PEVycm9yUGFnZT4gZ2V0RXJyb3JQYWdlcygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9GUkFHTUVOVF9fRVJST1JfUEFHRVMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PEpzcENvbmZpZz4gZ2V0SnNwQ29uZmlncygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9GUkFHTUVOVF9fSlNQX0NPTkZJR1MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PFNlY3VyaXR5Q29uc3RyYWludD4gZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9GUkFHTUVOVF9fU0VDVVJJVFlfQ09OU1RSQUlOVFMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PExvZ2luQ29uZmlnPiBnZXRMb2dpbkNvbmZpZ3MoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfRlJBR01FTlRfX0xPR0lOX0NPTkZJR1MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PFNlY3VyaXR5Um9sZT4gZ2V0U2VjdXJpdHlSb2xlcygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9GUkFHTUVOVF9fU0VDVVJJVFlfUk9MRVMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PEVudkVudHJ5PiBnZXRFbnZFbnRyaWVzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UX19FTlZfRU5UUklFUyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8RWpiUmVmPiBnZXRFamJSZWZzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UX19FSkJfUkVGUyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8RWpiTG9jYWxSZWY+IGdldEVqYkxvY2FsUmVmcygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9GUkFHTUVOVF9fRUpCX0xPQ0FMX1JFRlMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PFNlcnZpY2VSZWY+IGdldFNlcnZpY2VSZWZzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UX19TRVJWSUNFX1JFRlMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PFJlc291cmNlUmVmPiBnZXRSZXNvdXJjZVJlZnMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfRlJBR01FTlRfX1JFU09VUkNFX1JFRlMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PFJlc291cmNlRW52UmVmPiBnZXRSZXNvdXJjZUVudlJlZnMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfRlJBR01FTlRfX1JFU09VUkNFX0VOVl9SRUZTKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxNZXNzYWdlRGVzdGluYXRpb25SZWY+IGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfRlJBR01FTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8UGVyc2lzdGVuY2VDb250ZXh0UmVmPiBnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PFBlcnNpc3RlbmNlVW5pdFJlZj4gZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpIHsKKwkJcmV0dXJuIGdldEdyb3VwKCkubGlzdChXZWJQYWNrYWdlLkxpdGVyYWxzLldFQl9GUkFHTUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxMaWZlY3ljbGVDYWxsYmFjaz4gZ2V0UG9zdENvbnN0cnVjdHMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfRlJBR01FTlRfX1BPU1RfQ09OU1RSVUNUUyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8TGlmZWN5Y2xlQ2FsbGJhY2s+IGdldFByZURlc3Ryb3lzKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UX19QUkVfREVTVFJPWVMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMaXN0PERhdGFTb3VyY2VUeXBlPiBnZXREYXRhU291cmNlKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UX19EQVRBX1NPVVJDRSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8TWVzc2FnZURlc3RpbmF0aW9uPiBnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExpc3Q8TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdD4gZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKSB7CisJCXJldHVybiBnZXRHcm91cCgpLmxpc3QoV2ViUGFja2FnZS5MaXRlcmFscy5XRUJfRlJBR01FTlRfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTGlzdDxPcmRlcmluZ1R5cGU+IGdldE9yZGVyaW5nKCkgeworCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX0ZSQUdNRU5UX19PUkRFUklORyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIGlkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgeworCQlTdHJpbmcgb2xkSWQgPSBpZDsKKwkJaWQgPSBuZXdJZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0lELCBvbGRJZCwgaWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01ldGFkYXRhQ29tcGxldGUoKSB7CisJCXJldHVybiBtZXRhZGF0YUNvbXBsZXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1ldGFkYXRhQ29tcGxldGUoYm9vbGVhbiBuZXdNZXRhZGF0YUNvbXBsZXRlKSB7CisJCWJvb2xlYW4gb2xkTWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7CisJCW1ldGFkYXRhQ29tcGxldGUgPSBuZXdNZXRhZGF0YUNvbXBsZXRlOworCQlib29sZWFuIG9sZE1ldGFkYXRhQ29tcGxldGVFU2V0ID0gbWV0YWRhdGFDb21wbGV0ZUVTZXQ7CisJCW1ldGFkYXRhQ29tcGxldGVFU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX01FVEFEQVRBX0NPTVBMRVRFLCBvbGRNZXRhZGF0YUNvbXBsZXRlLCBtZXRhZGF0YUNvbXBsZXRlLCAhb2xkTWV0YWRhdGFDb21wbGV0ZUVTZXQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCB1bnNldE1ldGFkYXRhQ29tcGxldGUoKSB7CisJCWJvb2xlYW4gb2xkTWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7CisJCWJvb2xlYW4gb2xkTWV0YWRhdGFDb21wbGV0ZUVTZXQgPSBtZXRhZGF0YUNvbXBsZXRlRVNldDsKKwkJbWV0YWRhdGFDb21wbGV0ZSA9IE1FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxUOworCQltZXRhZGF0YUNvbXBsZXRlRVNldCA9IGZhbHNlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19NRVRBREFUQV9DT01QTEVURSwgb2xkTWV0YWRhdGFDb21wbGV0ZSwgTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQsIG9sZE1ldGFkYXRhQ29tcGxldGVFU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCkgeworCQlyZXR1cm4gbWV0YWRhdGFDb21wbGV0ZUVTZXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFdlYkFwcFZlcnNpb25UeXBlIGdldFZlcnNpb24oKSB7CisJCXJldHVybiB2ZXJzaW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oV2ViQXBwVmVyc2lvblR5cGUgbmV3VmVyc2lvbikgeworCQlXZWJBcHBWZXJzaW9uVHlwZSBvbGRWZXJzaW9uID0gdmVyc2lvbjsKKwkJdmVyc2lvbiA9IG5ld1ZlcnNpb24gPT0gbnVsbCA/IFZFUlNJT05fRURFRkFVTFQgOiBuZXdWZXJzaW9uOworCQlib29sZWFuIG9sZFZlcnNpb25FU2V0ID0gdmVyc2lvbkVTZXQ7CisJCXZlcnNpb25FU2V0ID0gdHJ1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24sICFvbGRWZXJzaW9uRVNldCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHVuc2V0VmVyc2lvbigpIHsKKwkJV2ViQXBwVmVyc2lvblR5cGUgb2xkVmVyc2lvbiA9IHZlcnNpb247CisJCWJvb2xlYW4gb2xkVmVyc2lvbkVTZXQgPSB2ZXJzaW9uRVNldDsKKwkJdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7CisJCXZlcnNpb25FU2V0ID0gZmFsc2U7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1ZFUlNJT04sIG9sZFZlcnNpb24sIFZFUlNJT05fRURFRkFVTFQsIG9sZFZlcnNpb25FU2V0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZXRWZXJzaW9uKCkgeworCQlyZXR1cm4gdmVyc2lvbkVTZXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fR1JPVVA6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19ERVNDUklQVElPTlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fRElTUExBWV9OQU1FUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERpc3BsYXlOYW1lcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19JQ09OUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEljb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0RJU1RSSUJVVEFCTEVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGlzdHJpYnV0YWJsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fQ09OVEVYVF9QQVJBTVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb250ZXh0UGFyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0ZJTFRFUlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRGaWx0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0ZJTFRFUl9NQVBQSU5HUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEZpbHRlck1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0xJU1RFTkVSUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldExpc3RlbmVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19TRVJWTEVUUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlcnZsZXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1NFUlZMRVRfTUFQUElOR1M6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZXJ2bGV0TWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VTU0lPTl9DT05GSUdTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2Vzc2lvbkNvbmZpZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fTUlNRV9NQVBQSU5HUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1pbWVNYXBwaW5ncygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19XRUxDT01FX0ZJTEVfTElTVFM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRXZWxjb21lRmlsZUxpc3RzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0VSUk9SX1BBR0VTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RXJyb3JQYWdlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19KU1BfQ09ORklHUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEpzcENvbmZpZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VDVVJJVFlfQ09OU1RSQUlOVFM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZWN1cml0eUNvbnN0cmFpbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0xPR0lOX0NPTkZJR1M6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRMb2dpbkNvbmZpZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VDVVJJVFlfUk9MRVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZWN1cml0eVJvbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0VOVl9FTlRSSUVTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RW52RW50cmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19FSkJfUkVGUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVqYlJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fRUpCX0xPQ0FMX1JFRlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRFamJMb2NhbFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VSVklDRV9SRUZTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U2VydmljZVJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fUkVTT1VSQ0VfUkVGUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFJlc291cmNlUmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFJlc291cmNlRW52UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19QT1NUX0NPTlNUUlVDVFM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQb3N0Q29uc3RydWN0cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19QUkVfREVTVFJPWVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcmVEZXN0cm95cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19EQVRBX1NPVVJDRToKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldERhdGFTb3VyY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fT1JERVJJTkc6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRPcmRlcmluZygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0dST1VQOgorCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwKCk7CisJCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cCgpKS5nZXRXcmFwcGVyKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19OQU1FOgorCQkJCXJldHVybiBnZXROYW1lKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19ERVNDUklQVElPTlM6CisJCQkJcmV0dXJuIGdldERlc2NyaXB0aW9ucygpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fRElTUExBWV9OQU1FUzoKKwkJCQlyZXR1cm4gZ2V0RGlzcGxheU5hbWVzKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19JQ09OUzoKKwkJCQlyZXR1cm4gZ2V0SWNvbnMoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0RJU1RSSUJVVEFCTEVTOgorCQkJCXJldHVybiBnZXREaXN0cmlidXRhYmxlcygpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fQ09OVEVYVF9QQVJBTVM6CisJCQkJcmV0dXJuIGdldENvbnRleHRQYXJhbXMoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0ZJTFRFUlM6CisJCQkJcmV0dXJuIGdldEZpbHRlcnMoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0ZJTFRFUl9NQVBQSU5HUzoKKwkJCQlyZXR1cm4gZ2V0RmlsdGVyTWFwcGluZ3MoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0xJU1RFTkVSUzoKKwkJCQlyZXR1cm4gZ2V0TGlzdGVuZXJzKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19TRVJWTEVUUzoKKwkJCQlyZXR1cm4gZ2V0U2VydmxldHMoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1NFUlZMRVRfTUFQUElOR1M6CisJCQkJcmV0dXJuIGdldFNlcnZsZXRNYXBwaW5ncygpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VTU0lPTl9DT05GSUdTOgorCQkJCXJldHVybiBnZXRTZXNzaW9uQ29uZmlncygpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fTUlNRV9NQVBQSU5HUzoKKwkJCQlyZXR1cm4gZ2V0TWltZU1hcHBpbmdzKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19XRUxDT01FX0ZJTEVfTElTVFM6CisJCQkJcmV0dXJuIGdldFdlbGNvbWVGaWxlTGlzdHMoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0VSUk9SX1BBR0VTOgorCQkJCXJldHVybiBnZXRFcnJvclBhZ2VzKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19KU1BfQ09ORklHUzoKKwkJCQlyZXR1cm4gZ2V0SnNwQ29uZmlncygpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VDVVJJVFlfQ09OU1RSQUlOVFM6CisJCQkJcmV0dXJuIGdldFNlY3VyaXR5Q29uc3RyYWludHMoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0xPR0lOX0NPTkZJR1M6CisJCQkJcmV0dXJuIGdldExvZ2luQ29uZmlncygpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VDVVJJVFlfUk9MRVM6CisJCQkJcmV0dXJuIGdldFNlY3VyaXR5Um9sZXMoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0VOVl9FTlRSSUVTOgorCQkJCXJldHVybiBnZXRFbnZFbnRyaWVzKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19FSkJfUkVGUzoKKwkJCQlyZXR1cm4gZ2V0RWpiUmVmcygpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fRUpCX0xPQ0FMX1JFRlM6CisJCQkJcmV0dXJuIGdldEVqYkxvY2FsUmVmcygpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VSVklDRV9SRUZTOgorCQkJCXJldHVybiBnZXRTZXJ2aWNlUmVmcygpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fUkVTT1VSQ0VfUkVGUzoKKwkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VSZWZzKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKKwkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnZSZWZzKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlM6CisJCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKKwkJCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgorCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19QT1NUX0NPTlNUUlVDVFM6CisJCQkJcmV0dXJuIGdldFBvc3RDb25zdHJ1Y3RzKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19QUkVfREVTVFJPWVM6CisJCQkJcmV0dXJuIGdldFByZURlc3Ryb3lzKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19EQVRBX1NPVVJDRToKKwkJCQlyZXR1cm4gZ2V0RGF0YVNvdXJjZSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlM6CisJCQkJcmV0dXJuIGdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTOgorCQkJCXJldHVybiBnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fT1JERVJJTkc6CisJCQkJcmV0dXJuIGdldE9yZGVyaW5nKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19JRDoKKwkJCQlyZXR1cm4gZ2V0SWQoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX01FVEFEQVRBX0NPTVBMRVRFOgorCQkJCXJldHVybiBpc01ldGFkYXRhQ29tcGxldGUoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1ZFUlNJT046CisJCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fR1JPVVA6CisJCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLnNldChuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fTkFNRToKKwkJCQlnZXROYW1lKCkuY2xlYXIoKTsKKwkJCQlnZXROYW1lKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19ERVNDUklQVElPTlM6CisJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERlc2NyaXB0aW9uPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fRElTUExBWV9OQU1FUzoKKwkJCQlnZXREaXNwbGF5TmFtZXMoKS5jbGVhcigpOworCQkJCWdldERpc3BsYXlOYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzcGxheU5hbWU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19JQ09OUzoKKwkJCQlnZXRJY29ucygpLmNsZWFyKCk7CisJCQkJZ2V0SWNvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEljb24+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19ESVNUUklCVVRBQkxFUzoKKwkJCQlnZXREaXN0cmlidXRhYmxlcygpLmNsZWFyKCk7CisJCQkJZ2V0RGlzdHJpYnV0YWJsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEVtcHR5VHlwZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0NPTlRFWFRfUEFSQU1TOgorCQkJCWdldENvbnRleHRQYXJhbXMoKS5jbGVhcigpOworCQkJCWdldENvbnRleHRQYXJhbXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFBhcmFtVmFsdWU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19GSUxURVJTOgorCQkJCWdldEZpbHRlcnMoKS5jbGVhcigpOworCQkJCWdldEZpbHRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEZpbHRlcj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0ZJTFRFUl9NQVBQSU5HUzoKKwkJCQlnZXRGaWx0ZXJNYXBwaW5ncygpLmNsZWFyKCk7CisJCQkJZ2V0RmlsdGVyTWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEZpbHRlck1hcHBpbmc+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19MSVNURU5FUlM6CisJCQkJZ2V0TGlzdGVuZXJzKCkuY2xlYXIoKTsKKwkJCQlnZXRMaXN0ZW5lcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIExpc3RlbmVyPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VSVkxFVFM6CisJCQkJZ2V0U2VydmxldHMoKS5jbGVhcigpOworCQkJCWdldFNlcnZsZXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZXJ2bGV0PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VSVkxFVF9NQVBQSU5HUzoKKwkJCQlnZXRTZXJ2bGV0TWFwcGluZ3MoKS5jbGVhcigpOworCQkJCWdldFNlcnZsZXRNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VydmxldE1hcHBpbmc+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19TRVNTSU9OX0NPTkZJR1M6CisJCQkJZ2V0U2Vzc2lvbkNvbmZpZ3MoKS5jbGVhcigpOworCQkJCWdldFNlc3Npb25Db25maWdzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZXNzaW9uQ29uZmlnPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fTUlNRV9NQVBQSU5HUzoKKwkJCQlnZXRNaW1lTWFwcGluZ3MoKS5jbGVhcigpOworCQkJCWdldE1pbWVNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWltZU1hcHBpbmc+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19XRUxDT01FX0ZJTEVfTElTVFM6CisJCQkJZ2V0V2VsY29tZUZpbGVMaXN0cygpLmNsZWFyKCk7CisJCQkJZ2V0V2VsY29tZUZpbGVMaXN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV2VsY29tZUZpbGVMaXN0PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fRVJST1JfUEFHRVM6CisJCQkJZ2V0RXJyb3JQYWdlcygpLmNsZWFyKCk7CisJCQkJZ2V0RXJyb3JQYWdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRXJyb3JQYWdlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fSlNQX0NPTkZJR1M6CisJCQkJZ2V0SnNwQ29uZmlncygpLmNsZWFyKCk7CisJCQkJZ2V0SnNwQ29uZmlncygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSnNwQ29uZmlnPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VDVVJJVFlfQ09OU1RSQUlOVFM6CisJCQkJZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpLmNsZWFyKCk7CisJCQkJZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VjdXJpdHlDb25zdHJhaW50PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fTE9HSU5fQ09ORklHUzoKKwkJCQlnZXRMb2dpbkNvbmZpZ3MoKS5jbGVhcigpOworCQkJCWdldExvZ2luQ29uZmlncygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTG9naW5Db25maWc+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19TRUNVUklUWV9ST0xFUzoKKwkJCQlnZXRTZWN1cml0eVJvbGVzKCkuY2xlYXIoKTsKKwkJCQlnZXRTZWN1cml0eVJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWN1cml0eVJvbGU+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19FTlZfRU5UUklFUzoKKwkJCQlnZXRFbnZFbnRyaWVzKCkuY2xlYXIoKTsKKwkJCQlnZXRFbnZFbnRyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFbnZFbnRyeT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0VKQl9SRUZTOgorCQkJCWdldEVqYlJlZnMoKS5jbGVhcigpOworCQkJCWdldEVqYlJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEVqYlJlZj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0VKQl9MT0NBTF9SRUZTOgorCQkJCWdldEVqYkxvY2FsUmVmcygpLmNsZWFyKCk7CisJCQkJZ2V0RWpiTG9jYWxSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFamJMb2NhbFJlZj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1NFUlZJQ0VfUkVGUzoKKwkJCQlnZXRTZXJ2aWNlUmVmcygpLmNsZWFyKCk7CisJCQkJZ2V0U2VydmljZVJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlcnZpY2VSZWY+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19SRVNPVVJDRV9SRUZTOgorCQkJCWdldFJlc291cmNlUmVmcygpLmNsZWFyKCk7CisJCQkJZ2V0UmVzb3VyY2VSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXNvdXJjZVJlZj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1JFU09VUkNFX0VOVl9SRUZTOgorCQkJCWdldFJlc291cmNlRW52UmVmcygpLmNsZWFyKCk7CisJCQkJZ2V0UmVzb3VyY2VFbnZSZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXNvdXJjZUVudlJlZj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKKwkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKKwkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXNzYWdlRGVzdGluYXRpb25SZWY+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6CisJCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmNsZWFyKCk7CisJCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGVyc2lzdGVuY2VDb250ZXh0UmVmPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgorCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5jbGVhcigpOworCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFJlZj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1BPU1RfQ09OU1RSVUNUUzoKKwkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7CisJCQkJZ2V0UG9zdENvbnN0cnVjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIExpZmVjeWNsZUNhbGxiYWNrPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fUFJFX0RFU1RST1lTOgorCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKKwkJCQlnZXRQcmVEZXN0cm95cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTGlmZWN5Y2xlQ2FsbGJhY2s+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19EQVRBX1NPVVJDRToKKwkJCQlnZXREYXRhU291cmNlKCkuY2xlYXIoKTsKKwkJCQlnZXREYXRhU291cmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEYXRhU291cmNlVHlwZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgorCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5jbGVhcigpOworCQkJCWdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE1lc3NhZ2VEZXN0aW5hdGlvbj4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTOgorCQkJCWdldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkuY2xlYXIoKTsKKwkJCQlnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX09SREVSSU5HOgorCQkJCWdldE9yZGVyaW5nKCkuY2xlYXIoKTsKKwkJCQlnZXRPcmRlcmluZygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgT3JkZXJpbmdUeXBlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fSUQ6CisJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fTUVUQURBVEFfQ09NUExFVEU6CisJCQkJc2V0TWV0YWRhdGFDb21wbGV0ZSgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fVkVSU0lPTjoKKwkJCQlzZXRWZXJzaW9uKChXZWJBcHBWZXJzaW9uVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0dST1VQOgorCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19OQU1FOgorCQkJCWdldE5hbWUoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0RFU0NSSVBUSU9OUzoKKwkJCQlnZXREZXNjcmlwdGlvbnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0RJU1BMQVlfTkFNRVM6CisJCQkJZ2V0RGlzcGxheU5hbWVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19JQ09OUzoKKwkJCQlnZXRJY29ucygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fRElTVFJJQlVUQUJMRVM6CisJCQkJZ2V0RGlzdHJpYnV0YWJsZXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0NPTlRFWFRfUEFSQU1TOgorCQkJCWdldENvbnRleHRQYXJhbXMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0ZJTFRFUlM6CisJCQkJZ2V0RmlsdGVycygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fRklMVEVSX01BUFBJTkdTOgorCQkJCWdldEZpbHRlck1hcHBpbmdzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19MSVNURU5FUlM6CisJCQkJZ2V0TGlzdGVuZXJzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19TRVJWTEVUUzoKKwkJCQlnZXRTZXJ2bGV0cygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VSVkxFVF9NQVBQSU5HUzoKKwkJCQlnZXRTZXJ2bGV0TWFwcGluZ3MoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1NFU1NJT05fQ09ORklHUzoKKwkJCQlnZXRTZXNzaW9uQ29uZmlncygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fTUlNRV9NQVBQSU5HUzoKKwkJCQlnZXRNaW1lTWFwcGluZ3MoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1dFTENPTUVfRklMRV9MSVNUUzoKKwkJCQlnZXRXZWxjb21lRmlsZUxpc3RzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19FUlJPUl9QQUdFUzoKKwkJCQlnZXRFcnJvclBhZ2VzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19KU1BfQ09ORklHUzoKKwkJCQlnZXRKc3BDb25maWdzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19TRUNVUklUWV9DT05TVFJBSU5UUzoKKwkJCQlnZXRTZWN1cml0eUNvbnN0cmFpbnRzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19MT0dJTl9DT05GSUdTOgorCQkJCWdldExvZ2luQ29uZmlncygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VDVVJJVFlfUk9MRVM6CisJCQkJZ2V0U2VjdXJpdHlSb2xlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fRU5WX0VOVFJJRVM6CisJCQkJZ2V0RW52RW50cmllcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fRUpCX1JFRlM6CisJCQkJZ2V0RWpiUmVmcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fRUpCX0xPQ0FMX1JFRlM6CisJCQkJZ2V0RWpiTG9jYWxSZWZzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19TRVJWSUNFX1JFRlM6CisJCQkJZ2V0U2VydmljZVJlZnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1JFU09VUkNFX1JFRlM6CisJCQkJZ2V0UmVzb3VyY2VSZWZzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19SRVNPVVJDRV9FTlZfUkVGUzoKKwkJCQlnZXRSZXNvdXJjZUVudlJlZnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUzoKKwkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlM6CisJCQkJZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTOgorCQkJCWdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1BPU1RfQ09OU1RSVUNUUzoKKwkJCQlnZXRQb3N0Q29uc3RydWN0cygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fUFJFX0RFU1RST1lTOgorCQkJCWdldFByZURlc3Ryb3lzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19EQVRBX1NPVVJDRToKKwkJCQlnZXREYXRhU291cmNlKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUzoKKwkJCQlnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUzoKKwkJCQlnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fT1JERVJJTkc6CisJCQkJZ2V0T3JkZXJpbmcoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0lEOgorCQkJCXNldElkKElEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19NRVRBREFUQV9DT01QTEVURToKKwkJCQl1bnNldE1ldGFkYXRhQ29tcGxldGUoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19WRVJTSU9OOgorCQkJCXVuc2V0VmVyc2lvbigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fR1JPVVA6CisJCQkJcmV0dXJuIGdyb3VwICE9IG51bGwgJiYgIWdyb3VwLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX05BTUU6CisJCQkJcmV0dXJuICFnZXROYW1lKCkuaXNFbXB0eSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fREVTQ1JJUFRJT05TOgorCQkJCXJldHVybiAhZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fRElTUExBWV9OQU1FUzoKKwkJCQlyZXR1cm4gIWdldERpc3BsYXlOYW1lcygpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0lDT05TOgorCQkJCXJldHVybiAhZ2V0SWNvbnMoKS5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19ESVNUUklCVVRBQkxFUzoKKwkJCQlyZXR1cm4gIWdldERpc3RyaWJ1dGFibGVzKCkuaXNFbXB0eSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fQ09OVEVYVF9QQVJBTVM6CisJCQkJcmV0dXJuICFnZXRDb250ZXh0UGFyYW1zKCkuaXNFbXB0eSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fRklMVEVSUzoKKwkJCQlyZXR1cm4gIWdldEZpbHRlcnMoKS5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19GSUxURVJfTUFQUElOR1M6CisJCQkJcmV0dXJuICFnZXRGaWx0ZXJNYXBwaW5ncygpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0xJU1RFTkVSUzoKKwkJCQlyZXR1cm4gIWdldExpc3RlbmVycygpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1NFUlZMRVRTOgorCQkJCXJldHVybiAhZ2V0U2VydmxldHMoKS5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19TRVJWTEVUX01BUFBJTkdTOgorCQkJCXJldHVybiAhZ2V0U2VydmxldE1hcHBpbmdzKCkuaXNFbXB0eSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fU0VTU0lPTl9DT05GSUdTOgorCQkJCXJldHVybiAhZ2V0U2Vzc2lvbkNvbmZpZ3MoKS5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19NSU1FX01BUFBJTkdTOgorCQkJCXJldHVybiAhZ2V0TWltZU1hcHBpbmdzKCkuaXNFbXB0eSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fV0VMQ09NRV9GSUxFX0xJU1RTOgorCQkJCXJldHVybiAhZ2V0V2VsY29tZUZpbGVMaXN0cygpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0VSUk9SX1BBR0VTOgorCQkJCXJldHVybiAhZ2V0RXJyb3JQYWdlcygpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0pTUF9DT05GSUdTOgorCQkJCXJldHVybiAhZ2V0SnNwQ29uZmlncygpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1NFQ1VSSVRZX0NPTlNUUkFJTlRTOgorCQkJCXJldHVybiAhZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0xPR0lOX0NPTkZJR1M6CisJCQkJcmV0dXJuICFnZXRMb2dpbkNvbmZpZ3MoKS5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19TRUNVUklUWV9ST0xFUzoKKwkJCQlyZXR1cm4gIWdldFNlY3VyaXR5Um9sZXMoKS5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19FTlZfRU5UUklFUzoKKwkJCQlyZXR1cm4gIWdldEVudkVudHJpZXMoKS5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19FSkJfUkVGUzoKKwkJCQlyZXR1cm4gIWdldEVqYlJlZnMoKS5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19FSkJfTE9DQUxfUkVGUzoKKwkJCQlyZXR1cm4gIWdldEVqYkxvY2FsUmVmcygpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1NFUlZJQ0VfUkVGUzoKKwkJCQlyZXR1cm4gIWdldFNlcnZpY2VSZWZzKCkuaXNFbXB0eSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fUkVTT1VSQ0VfUkVGUzoKKwkJCQlyZXR1cm4gIWdldFJlc291cmNlUmVmcygpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1JFU09VUkNFX0VOVl9SRUZTOgorCQkJCXJldHVybiAhZ2V0UmVzb3VyY2VFbnZSZWZzKCkuaXNFbXB0eSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTOgorCQkJCXJldHVybiAhZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUzoKKwkJCQlyZXR1cm4gIWdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKS5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19QRVJTSVNURU5DRV9VTklUX1JFRlM6CisJCQkJcmV0dXJuICFnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkuaXNFbXB0eSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fUE9TVF9DT05TVFJVQ1RTOgorCQkJCXJldHVybiAhZ2V0UG9zdENvbnN0cnVjdHMoKS5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19QUkVfREVTVFJPWVM6CisJCQkJcmV0dXJuICFnZXRQcmVEZXN0cm95cygpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0RBVEFfU09VUkNFOgorCQkJCXJldHVybiAhZ2V0RGF0YVNvdXJjZSgpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX01FU1NBR0VfREVTVElOQVRJT05TOgorCQkJCXJldHVybiAhZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlRfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTOgorCQkJCXJldHVybiAhZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKS5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19PUkRFUklORzoKKwkJCQlyZXR1cm4gIWdldE9yZGVyaW5nKCkuaXNFbXB0eSgpOworCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVF9fSUQ6CisJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19NRVRBREFUQV9DT01QTEVURToKKwkJCQlyZXR1cm4gaXNTZXRNZXRhZGF0YUNvbXBsZXRlKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0ZSQUdNRU5UX19WRVJTSU9OOgorCQkJCXJldHVybiBpc1NldFZlcnNpb24oKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChpZCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbWV0YWRhdGFDb21wbGV0ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKG1ldGFkYXRhQ29tcGxldGVFU2V0KSByZXN1bHQuYXBwZW5kKG1ldGFkYXRhQ29tcGxldGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOyAvLyROT04tTkxTLTEkCisJCWlmICh2ZXJzaW9uRVNldCkgcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCisJcHVibGljIExpc3Q8QWJzb2x1dGVPcmRlcmluZ1R5cGU+IGdldEFic29sdXRlT3JkZXJpbmcoKSB7CisJCS8vIE5vdCBmb3IgdXNlLiBJbmhlcml0ZWQgZnJvbSBDb21wb3NpdGVXZWJBcHAgZHVlIHRvIHdlYiBhcHAncyBpbnRlcmZhY2VzCisJCXJldHVybiBudWxsOworCX0KKworCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TW9kdWxlTmFtZSgpIHsKKwkJLy8gTm90IGZvciB1c2UuIEluaGVyaXRlZCBmcm9tIENvbXBvc2l0ZVdlYkFwcCBkdWUgdG8gd2ViIGFwcCdzIGludGVyZmFjZXMKKwkJcmV0dXJuIG51bGw7CisJfQorCit9IC8vV2ViRnJhZ21lbnRJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYlBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYlBhY2thZ2VJbXBsLmphdmEKaW5kZXggOWE0MmJjYS4uNmY2MGNiOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJQYWNrYWdlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL2ltcGwvV2ViUGFja2FnZUltcGwuamF2YQpAQCAtMjYsMjcgKzI2LDIwIEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC5pbXBsLkphdmFlZVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luLkoyRUVDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVJbml0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2U7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQWJzb2x1dGVPcmRlcmluZ1R5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQXV0aENvbnN0cmFpbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29tbWVudFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVEb21haW5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZU5hbWVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZVBhdGhUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkRpc3BhdGNoZXJUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXI7CkBAIC01NiwxNiArNDksMjIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Mb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkxvZ2luQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk1pbWVNYXBwaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk11bHRpcGFydENvbmZpZ1R5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTnVsbENoYXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk9yZGVyaW5nT3JkZXJpbmdUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk9yZGVyaW5nT3RoZXJzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5PcmRlcmluZ1R5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VjdXJpdHlDb25zdHJhaW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFja2luZ01vZGVUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVXNlckRhdGFDb25zdHJhaW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHBWZXJzaW9uVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3Q7CkBAIC04Niw2ICs4NSwxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwcml2YXRlIEVDbGFzcyBhYnNvbHV0ZU9yZGVyaW5nVHlwZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwcml2YXRlIEVDbGFzcyBhdXRoQ29uc3RyYWludEVDbGFzcyA9IG51bGw7CiAKIAkvKioKQEAgLTkzLDYgKzk5LDQxIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXByaXZhdGUgRUNsYXNzIGNvb2tpZUNvbW1lbnRUeXBlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGNvb2tpZUNvbmZpZ1R5cGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY29va2llRG9tYWluVHlwZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjb29raWVOYW1lVHlwZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjb29raWVQYXRoVHlwZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwcml2YXRlIEVDbGFzcyBlcnJvclBhZ2VFQ2xhc3MgPSBudWxsOwogCiAJLyoqCkBAIC0xNDksNiArMTkwLDM0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXByaXZhdGUgRUNsYXNzIG11bHRpcGFydENvbmZpZ1R5cGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgb3JkZXJpbmdPcmRlcmluZ1R5cGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgb3JkZXJpbmdPdGhlcnNUeXBlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIG9yZGVyaW5nVHlwZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwcml2YXRlIEVDbGFzcyBzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MgPSBudWxsOwogCiAJLyoqCkBAIC0xOTgsNiArMjY3LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXByaXZhdGUgRUNsYXNzIHdlYkZyYWdtZW50RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXByaXZhdGUgRUNsYXNzIHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcyA9IG51bGw7CiAKIAkvKioKQEAgLTIyNiw2ICszMDIsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHJpdmF0ZSBFRW51bSB0cmFja2luZ01vZGVUeXBlRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHJpdmF0ZSBFRW51bSB0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0gPSBudWxsOwogCiAJLyoqCkBAIC0zMjQsNiArNDA3LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXByaXZhdGUgRURhdGFUeXBlIHRyYWNraW5nTW9kZVR5cGVPYmplY3RFRGF0YVR5cGUgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHJpdmF0ZSBFRGF0YVR5cGUgdHJhbnNwb3J0R3VhcmFudGVlVHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7CiAKIAkvKioKQEAgLTM2NCwyMyArNDU0LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKwlwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CiAKIAkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIFdlYlBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBzZWUgI2VOU19VUkkKQEAgLTM5Miw3ICs0NzIsNyBAQAogCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoV2ViUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJQYWNrYWdlLmVOU19VUkkpOwogCiAJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJV2ViUGFja2FnZUltcGwgdGhlV2ViUGFja2FnZSA9IChXZWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFdlYlBhY2thZ2VJbXBsKCkpOworCQlXZWJQYWNrYWdlSW1wbCB0aGVXZWJQYWNrYWdlID0gKFdlYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBXZWJQYWNrYWdlSW1wbCgpKTsKIAogCQlpc0luaXRlZCA9IHRydWU7CiAKQEAgLTQwMCwyOCArNDgwLDExIEBACiAJCVhNTE5hbWVzcGFjZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CiAKLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKYXZhZWVQYWNrYWdlSW1wbCB0aGVKYXZhZWVQYWNrYWdlID0gKEphdmFlZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmF2YWVlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIDogSmF2YWVlUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSA9IChBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KIAkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKIAkJdGhlV2ViUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKYXZhZWVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CiAKIAkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQogCQl0aGVXZWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmF2YWVlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKIAogCQkvLyBSZWdpc3RlciBwYWNrYWdlIHZhbGlkYXRvcgogCQlFVmFsaWRhdG9yLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dApAQCAtNDM1LDYgKzQ5OCwxMiBAQAogCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCiAJCXRoZVdlYlBhY2thZ2UuZnJlZXplKCk7CiAKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoV2ViUGFja2FnZS5lTlNfVVJJLCB0aGVXZWJQYWNrYWdlKTsKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KFdlYlBhY2thZ2UuZU5TX1VSSTIsIHRoZVdlYlBhY2thZ2UpOworCisJCUoyRUVJbml0LmluaXRFTUZNb2RlbHMoKTsKIAkJcmV0dXJuIHRoZVdlYlBhY2thZ2U7CiAJfQogCkBAIC00NDMsNiArNTEyLDQyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzb2x1dGVPcmRlcmluZ1R5cGUoKSB7CisJCXJldHVybiBhYnNvbHV0ZU9yZGVyaW5nVHlwZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBYnNvbHV0ZU9yZGVyaW5nVHlwZV9Hcm91cCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFic29sdXRlT3JkZXJpbmdUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWJzb2x1dGVPcmRlcmluZ1R5cGVfTmFtZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWFic29sdXRlT3JkZXJpbmdUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QWJzb2x1dGVPcmRlcmluZ1R5cGVfT3RoZXJzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYWJzb2x1dGVPcmRlcmluZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUNsYXNzIGdldEF1dGhDb25zdHJhaW50KCkgewogCQlyZXR1cm4gYXV0aENvbnN0cmFpbnRFQ2xhc3M7CiAJfQpAQCAtNDc5LDYgKzU4NCwxNTkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVDbGFzcyBnZXRDb29raWVDb21tZW50VHlwZSgpIHsKKwkJcmV0dXJuIGNvb2tpZUNvbW1lbnRUeXBlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvb2tpZUNvbW1lbnRUeXBlX1ZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29va2llQ29tbWVudFR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldENvb2tpZUNvbmZpZ1R5cGUoKSB7CisJCXJldHVybiBjb29raWVDb25maWdUeXBlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvb2tpZUNvbmZpZ1R5cGVfTmFtZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNvb2tpZUNvbmZpZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb29raWVDb25maWdUeXBlX0RvbWFpbigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNvb2tpZUNvbmZpZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb29raWVDb25maWdUeXBlX1BhdGgoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSljb29raWVDb25maWdUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29va2llQ29uZmlnVHlwZV9Db21tZW50KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpY29va2llQ29uZmlnVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvb2tpZUNvbmZpZ1R5cGVfSHR0cE9ubHkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljb29raWVDb25maWdUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29va2llQ29uZmlnVHlwZV9TZWN1cmUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljb29raWVDb25maWdUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29va2llQ29uZmlnVHlwZV9NYXhBZ2UoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljb29raWVDb25maWdUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29va2llQ29uZmlnVHlwZV9JZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNvb2tpZUNvbmZpZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldENvb2tpZURvbWFpblR5cGUoKSB7CisJCXJldHVybiBjb29raWVEb21haW5UeXBlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvb2tpZURvbWFpblR5cGVfVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljb29raWVEb21haW5UeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDb29raWVOYW1lVHlwZSgpIHsKKwkJcmV0dXJuIGNvb2tpZU5hbWVUeXBlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENvb2tpZU5hbWVUeXBlX1ZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29va2llTmFtZVR5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldENvb2tpZVBhdGhUeXBlKCkgeworCQlyZXR1cm4gY29va2llUGF0aFR5cGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29va2llUGF0aFR5cGVfVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljb29raWVQYXRoVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQ2xhc3MgZ2V0RXJyb3JQYWdlKCkgewogCQlyZXR1cm4gZXJyb3JQYWdlRUNsYXNzOwogCX0KQEAgLTU3OCw4ICs4MzYsMTcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmlsdGVyX0FzeW5jU3VwcG9ydGVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVSZWZlcmVuY2UgZ2V0RmlsdGVyX0luaXRQYXJhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlmaWx0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWZpbHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwogCX0KIAogCS8qKgpAQCAtNTg4LDcgKzg1NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBFQXR0cmlidXRlIGdldEZpbHRlcl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpbHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmlsdGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7CiAJfQogCiAJLyoqCkBAIC04MzksNiArMTEwNiwxMjMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVDbGFzcyBnZXRNdWx0aXBhcnRDb25maWdUeXBlKCkgeworCQlyZXR1cm4gbXVsdGlwYXJ0Q29uZmlnVHlwZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNdWx0aXBhcnRDb25maWdUeXBlX0xvY2F0aW9uKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbXVsdGlwYXJ0Q29uZmlnVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldE11bHRpcGFydENvbmZpZ1R5cGVfTWF4RmlsZVNpemUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSltdWx0aXBhcnRDb25maWdUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZV9NYXhSZXF1ZXN0U2l6ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKW11bHRpcGFydENvbmZpZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNdWx0aXBhcnRDb25maWdUeXBlX0ZpbGVTaXplVGhyZXNob2xkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbXVsdGlwYXJ0Q29uZmlnVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0T3JkZXJpbmdPcmRlcmluZ1R5cGUoKSB7CisJCXJldHVybiBvcmRlcmluZ09yZGVyaW5nVHlwZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPcmRlcmluZ09yZGVyaW5nVHlwZV9OYW1lKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpb3JkZXJpbmdPcmRlcmluZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRPcmRlcmluZ09yZGVyaW5nVHlwZV9PdGhlcnMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlvcmRlcmluZ09yZGVyaW5nVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0T3JkZXJpbmdPdGhlcnNUeXBlKCkgeworCQlyZXR1cm4gb3JkZXJpbmdPdGhlcnNUeXBlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldE9yZGVyaW5nT3RoZXJzVHlwZV9JZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKW9yZGVyaW5nT3RoZXJzVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0T3JkZXJpbmdUeXBlKCkgeworCQlyZXR1cm4gb3JkZXJpbmdUeXBlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldE9yZGVyaW5nVHlwZV9BZnRlcigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKW9yZGVyaW5nVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldE9yZGVyaW5nVHlwZV9CZWZvcmUoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlvcmRlcmluZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUNsYXNzIGdldFNlY3VyaXR5Q29uc3RyYWludCgpIHsKIAkJcmV0dXJuIHNlY3VyaXR5Q29uc3RyYWludEVDbGFzczsKIAl9CkBAIC05NzQsOCArMTM1OCwyNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0X0VuYWJsZWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VydmxldF9Bc3luY1N1cHBvcnRlZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X1J1bkFzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOworCQlyZXR1cm4gKEVSZWZlcmVuY2Upc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKIAl9CiAKIAkvKioKQEAgLTk4NCw3ICsxMzg2LDE2IEBACiAJICogQGdlbmVyYXRlZAogCSAqLwogCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VydmxldF9NdWx0aXBhcnRDb25maWcoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzZXJ2bGV0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTIpOwogCX0KIAogCS8qKgpAQCAtOTkzLDcgKzE0MDQsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0X0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VydmxldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlcnZsZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7CiAJfQogCiAJLyoqCkBAIC0xMDU1LDggKzE0NjYsMjYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0U2Vzc2lvbkNvbmZpZ19Db29raWVDb25maWcoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlzZXNzaW9uQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkNvbmZpZ19UcmFja2luZ01vZGUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlzZXNzaW9uQ29uZmlnRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2Vzc2lvbkNvbmZpZ19JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXNlc3Npb25Db25maWdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKIAl9CiAKIAkvKioKQEAgLTExMTksMTUgKzE1NDgsNiBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRGVzY3JpcHRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0Rpc3BsYXlOYW1lcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwogCX0KIApAQCAtMTEzNiw3ICsxNTU2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0ljb25zKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9EaXNwbGF5TmFtZXMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKIAl9CiAKQEAgLTExNDUsNyArMTU2NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9EaXN0cmlidXRhYmxlcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfSWNvbnMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKIAl9CiAKQEAgLTExNTQsNyArMTU3NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9EaXN0cmlidXRhYmxlcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwogCX0KIApAQCAtMTE2Myw3ICsxNTgzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0ZpbHRlcnMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0NvbnRleHRQYXJhbXMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKIAl9CiAKQEAgLTExNzIsNyArMTU5Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9GaWx0ZXJNYXBwaW5ncygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRmlsdGVycygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwogCX0KIApAQCAtMTE4MSw3ICsxNjAxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xpc3RlbmVycygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKIAl9CiAKQEAgLTExOTAsNyArMTYxMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXJ2bGV0cygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfTGlzdGVuZXJzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7CiAJfQogCkBAIC0xMTk5LDcgKzE2MTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VydmxldE1hcHBpbmdzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXJ2bGV0cygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKIAl9CiAKQEAgLTEyMDgsNyArMTYyOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXNzaW9uQ29uZmlncygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VydmxldE1hcHBpbmdzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwogCX0KIApAQCAtMTIxNyw3ICsxNjM3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX01pbWVNYXBwaW5ncygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZ3MoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7CiAJfQogCkBAIC0xMjI2LDcgKzE2NDYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfV2VsY29tZUZpbGVMaXN0cygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfTWltZU1hcHBpbmdzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwogCX0KIApAQCAtMTIzNSw3ICsxNjU1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1dlbGNvbWVGaWxlTGlzdHMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7CiAJfQogCkBAIC0xMjQ0LDcgKzE2NjQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfSnNwQ29uZmlncygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRXJyb3JQYWdlcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKIAl9CiAKQEAgLTEyNTMsNyArMTY3Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZWN1cml0eUNvbnN0cmFpbnRzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9Kc3BDb25maWdzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTYpOwogCX0KIApAQCAtMTI2Miw3ICsxNjgyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xvZ2luQ29uZmlncygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VjdXJpdHlDb25zdHJhaW50cygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKIAl9CiAKQEAgLTEyNzEsNyArMTY5MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZWN1cml0eVJvbGVzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9Mb2dpbkNvbmZpZ3MoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7CiAJfQogCkBAIC0xMjgwLDcgKzE3MDAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRW52RW50cmllcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE5KTsKIAl9CiAKQEAgLTEyODksNyArMTcwOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9FamJSZWZzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9FbnZFbnRyaWVzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjApOwogCX0KIApAQCAtMTI5OCw3ICsxNzE4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0VqYkxvY2FsUmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRWpiUmVmcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKIAl9CiAKQEAgLTEzMDcsNyArMTcyNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9TZXJ2aWNlUmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfRWpiTG9jYWxSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjIpOwogCX0KIApAQCAtMTMxNiw3ICsxNzM2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1Jlc291cmNlUmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfU2VydmljZVJlZnMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7CiAJfQogCkBAIC0xMzI1LDcgKzE3NDUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfUmVzb3VyY2VFbnZSZWZzKCkgeworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9SZXNvdXJjZVJlZnMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7CiAJfQogCkBAIC0xMzM0LDcgKzE3NTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfUmVzb3VyY2VFbnZSZWZzKCkgewogCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwogCX0KIApAQCAtMTM0Myw3ICsxNzYzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7CiAJfQogCkBAIC0xMzUyLDcgKzE3NzIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfUGVyc2lzdGVuY2VVbml0UmVmcygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI3KTsKIAl9CiAKQEAgLTEzNjEsNyArMTc4MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9Qb3N0Q29uc3RydWN0cygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfUGVyc2lzdGVuY2VVbml0UmVmcygpIHsKIAkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKIAl9CiAKQEAgLTEzNzAsNyArMTc5MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcF9QcmVEZXN0cm95cygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfUG9zdENvbnN0cnVjdHMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOSk7CiAJfQogCkBAIC0xMzc5LDcgKzE3OTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpIHsKKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfUHJlRGVzdHJveXMoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMCk7CiAJfQogCkBAIC0xMzg4LDcgKzE4MDgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKSB7CisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0RhdGFTb3VyY2UoKSB7CiAJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMSk7CiAJfQogCkBAIC0xMzk3LDggKzE4MTcsNDQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0xvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYkFwcF9Nb2R1bGVOYW1lKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwX0Fic29sdXRlT3JkZXJpbmcoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCiAJcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViQXBwX0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzIpOworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViQXBwRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzUpOwogCX0KIAogCS8qKgpAQCAtMTQwNyw3ICsxODYzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAJcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViQXBwX01ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMyk7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJBcHBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNik7CiAJfQogCiAJLyoqCkBAIC0xNDE2LDcgKzE4NzIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJBcHBfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXdlYkFwcEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM3KTsKIAl9CiAKIAkvKioKQEAgLTE0NjksNiArMTkyNSwzNTcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVDbGFzcyBnZXRXZWJGcmFnbWVudCgpIHsKKwkJcmV0dXJuIHdlYkZyYWdtZW50RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYkZyYWdtZW50X0dyb3VwKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9EZXNjcmlwdGlvbnMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJGcmFnbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0Rpc3BsYXlOYW1lcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkZyYWdtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfSWNvbnMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJGcmFnbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYkZyYWdtZW50X05hbWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJGcmFnbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0Rpc3RyaWJ1dGFibGVzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9Db250ZXh0UGFyYW1zKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9GaWx0ZXJzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9GaWx0ZXJNYXBwaW5ncygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkZyYWdtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfTGlzdGVuZXJzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9TZXJ2bGV0cygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkZyYWdtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X1NlcnZsZXRNYXBwaW5ncygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkZyYWdtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X1Nlc3Npb25Db25maWdzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfTWltZU1hcHBpbmdzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfV2VsY29tZUZpbGVMaXN0cygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkZyYWdtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0Vycm9yUGFnZXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJGcmFnbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9Kc3BDb25maWdzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfU2VjdXJpdHlDb25zdHJhaW50cygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkZyYWdtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0xvZ2luQ29uZmlncygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkZyYWdtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X1NlY3VyaXR5Um9sZXMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJGcmFnbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE5KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9FbnZFbnRyaWVzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfRWpiUmVmcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkZyYWdtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0VqYkxvY2FsUmVmcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkZyYWdtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X1NlcnZpY2VSZWZzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfUmVzb3VyY2VSZWZzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfUmVzb3VyY2VFbnZSZWZzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkZyYWdtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X1BlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJGcmFnbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyOCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfUG9zdENvbnN0cnVjdHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJGcmFnbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI5KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9QcmVEZXN0cm95cygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkZyYWdtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0RhdGFTb3VyY2UoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJGcmFnbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJGcmFnbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9PcmRlcmluZygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkZyYWdtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYkZyYWdtZW50X0lkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViRnJhZ21lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViRnJhZ21lbnRfTWV0YWRhdGFDb21wbGV0ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXdlYkZyYWdtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzYpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYkZyYWdtZW50X1ZlcnNpb24oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSl3ZWJGcmFnbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUNsYXNzIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbigpIHsKIAkJcmV0dXJuIHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzczsKIAl9CkBAIC0xNTE0LDcgKzIzMjEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSWQoKSB7CisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2RPbWlzc2lvbigpIHsKIAkJcmV0dXJuIChFQXR0cmlidXRlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwogCX0KIApAQCAtMTUyMyw2ICsyMzMwLDE1IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9JZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLwogCXB1YmxpYyBFQ2xhc3MgZ2V0V2VsY29tZUZpbGVMaXN0KCkgewogCQlyZXR1cm4gd2VsY29tZUZpbGVMaXN0RUNsYXNzOwogCX0KQEAgLTE1NjgsNiArMjM4NCwxNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0VHJhY2tpbmdNb2RlVHlwZSgpIHsKKwkJcmV0dXJuIHRyYWNraW5nTW9kZVR5cGVFRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRUVudW0gZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpIHsKIAkJcmV0dXJuIHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bTsKIAl9CkBAIC0xNjk0LDYgKzI1MTksMTUgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRUcmFja2luZ01vZGVUeXBlT2JqZWN0KCkgeworCQlyZXR1cm4gdHJhY2tpbmdNb2RlVHlwZU9iamVjdEVEYXRhVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgRURhdGFUeXBlIGdldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3QoKSB7CiAJCXJldHVybiB0cmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0RURhdGFUeXBlOwogCX0KQEAgLTE3NDQsMTEgKzI1NzgsMzggQEAKIAkJaXNDcmVhdGVkID0gdHJ1ZTsKIAogCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJYWJzb2x1dGVPcmRlcmluZ1R5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTT0xVVEVfT1JERVJJTkdfVFlQRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYWJzb2x1dGVPcmRlcmluZ1R5cGVFQ2xhc3MsIEFCU09MVVRFX09SREVSSU5HX1RZUEVfX0dST1VQKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShhYnNvbHV0ZU9yZGVyaW5nVHlwZUVDbGFzcywgQUJTT0xVVEVfT1JERVJJTkdfVFlQRV9fTkFNRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoYWJzb2x1dGVPcmRlcmluZ1R5cGVFQ2xhc3MsIEFCU09MVVRFX09SREVSSU5HX1RZUEVfX09USEVSUyk7CisKIAkJYXV0aENvbnN0cmFpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVVUSF9DT05TVFJBSU5UKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShhdXRoQ29uc3RyYWludEVDbGFzcywgQVVUSF9DT05TVFJBSU5UX19ERVNDUklQVElPTlMpOwogCQljcmVhdGVFQXR0cmlidXRlKGF1dGhDb25zdHJhaW50RUNsYXNzLCBBVVRIX0NPTlNUUkFJTlRfX1JPTEVfTkFNRVMpOwogCQljcmVhdGVFQXR0cmlidXRlKGF1dGhDb25zdHJhaW50RUNsYXNzLCBBVVRIX0NPTlNUUkFJTlRfX0lEKTsKIAorCQljb29raWVDb21tZW50VHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT09LSUVfQ09NTUVOVF9UWVBFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb29raWVDb21tZW50VHlwZUVDbGFzcywgQ09PS0lFX0NPTU1FTlRfVFlQRV9fVkFMVUUpOworCisJCWNvb2tpZUNvbmZpZ1R5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09PS0lFX0NPTkZJR19UWVBFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShjb29raWVDb25maWdUeXBlRUNsYXNzLCBDT09LSUVfQ09ORklHX1RZUEVfX05BTUUpOworCQljcmVhdGVFUmVmZXJlbmNlKGNvb2tpZUNvbmZpZ1R5cGVFQ2xhc3MsIENPT0tJRV9DT05GSUdfVFlQRV9fRE9NQUlOKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShjb29raWVDb25maWdUeXBlRUNsYXNzLCBDT09LSUVfQ09ORklHX1RZUEVfX1BBVEgpOworCQljcmVhdGVFUmVmZXJlbmNlKGNvb2tpZUNvbmZpZ1R5cGVFQ2xhc3MsIENPT0tJRV9DT05GSUdfVFlQRV9fQ09NTUVOVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY29va2llQ29uZmlnVHlwZUVDbGFzcywgQ09PS0lFX0NPTkZJR19UWVBFX19IVFRQX09OTFkpOworCQljcmVhdGVFQXR0cmlidXRlKGNvb2tpZUNvbmZpZ1R5cGVFQ2xhc3MsIENPT0tJRV9DT05GSUdfVFlQRV9fU0VDVVJFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb29raWVDb25maWdUeXBlRUNsYXNzLCBDT09LSUVfQ09ORklHX1RZUEVfX01BWF9BR0UpOworCQljcmVhdGVFQXR0cmlidXRlKGNvb2tpZUNvbmZpZ1R5cGVFQ2xhc3MsIENPT0tJRV9DT05GSUdfVFlQRV9fSUQpOworCisJCWNvb2tpZURvbWFpblR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09PS0lFX0RPTUFJTl9UWVBFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb29raWVEb21haW5UeXBlRUNsYXNzLCBDT09LSUVfRE9NQUlOX1RZUEVfX1ZBTFVFKTsKKworCQljb29raWVOYW1lVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT09LSUVfTkFNRV9UWVBFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjb29raWVOYW1lVHlwZUVDbGFzcywgQ09PS0lFX05BTUVfVFlQRV9fVkFMVUUpOworCisJCWNvb2tpZVBhdGhUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPT0tJRV9QQVRIX1RZUEUpOworCQljcmVhdGVFQXR0cmlidXRlKGNvb2tpZVBhdGhUeXBlRUNsYXNzLCBDT09LSUVfUEFUSF9UWVBFX19WQUxVRSk7CisKIAkJZXJyb3JQYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVSUk9SX1BBR0UpOwogCQljcmVhdGVFQXR0cmlidXRlKGVycm9yUGFnZUVDbGFzcywgRVJST1JfUEFHRV9fRVJST1JfQ09ERSk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoZXJyb3JQYWdlRUNsYXNzLCBFUlJPUl9QQUdFX19FWENFUFRJT05fVFlQRSk7CkBAIC0xNzYxLDYgKzI2MjIsNyBAQAogCQljcmVhdGVFUmVmZXJlbmNlKGZpbHRlckVDbGFzcywgRklMVEVSX19JQ09OUyk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoZmlsdGVyRUNsYXNzLCBGSUxURVJfX0ZJTFRFUl9OQU1FKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShmaWx0ZXJFQ2xhc3MsIEZJTFRFUl9fRklMVEVSX0NMQVNTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShmaWx0ZXJFQ2xhc3MsIEZJTFRFUl9fQVNZTkNfU1VQUE9SVEVEKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShmaWx0ZXJFQ2xhc3MsIEZJTFRFUl9fSU5JVF9QQVJBTVMpOwogCQljcmVhdGVFQXR0cmlidXRlKGZpbHRlckVDbGFzcywgRklMVEVSX19JRCk7CiAKQEAgLTE3OTcsNiArMjY1OSwyMyBAQAogCQljcmVhdGVFQXR0cmlidXRlKG1pbWVNYXBwaW5nRUNsYXNzLCBNSU1FX01BUFBJTkdfX01JTUVfVFlQRSk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUobWltZU1hcHBpbmdFQ2xhc3MsIE1JTUVfTUFQUElOR19fSUQpOwogCisJCW11bHRpcGFydENvbmZpZ1R5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTVVMVElQQVJUX0NPTkZJR19UWVBFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShtdWx0aXBhcnRDb25maWdUeXBlRUNsYXNzLCBNVUxUSVBBUlRfQ09ORklHX1RZUEVfX0xPQ0FUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShtdWx0aXBhcnRDb25maWdUeXBlRUNsYXNzLCBNVUxUSVBBUlRfQ09ORklHX1RZUEVfX01BWF9GSUxFX1NJWkUpOworCQljcmVhdGVFQXR0cmlidXRlKG11bHRpcGFydENvbmZpZ1R5cGVFQ2xhc3MsIE1VTFRJUEFSVF9DT05GSUdfVFlQRV9fTUFYX1JFUVVFU1RfU0laRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUobXVsdGlwYXJ0Q29uZmlnVHlwZUVDbGFzcywgTVVMVElQQVJUX0NPTkZJR19UWVBFX19GSUxFX1NJWkVfVEhSRVNIT0xEKTsKKworCQlvcmRlcmluZ09yZGVyaW5nVHlwZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhPUkRFUklOR19PUkRFUklOR19UWVBFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShvcmRlcmluZ09yZGVyaW5nVHlwZUVDbGFzcywgT1JERVJJTkdfT1JERVJJTkdfVFlQRV9fTkFNRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uob3JkZXJpbmdPcmRlcmluZ1R5cGVFQ2xhc3MsIE9SREVSSU5HX09SREVSSU5HX1RZUEVfX09USEVSUyk7CisKKwkJb3JkZXJpbmdPdGhlcnNUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE9SREVSSU5HX09USEVSU19UWVBFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShvcmRlcmluZ090aGVyc1R5cGVFQ2xhc3MsIE9SREVSSU5HX09USEVSU19UWVBFX19JRCk7CisKKwkJb3JkZXJpbmdUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE9SREVSSU5HX1RZUEUpOworCQljcmVhdGVFUmVmZXJlbmNlKG9yZGVyaW5nVHlwZUVDbGFzcywgT1JERVJJTkdfVFlQRV9fQUZURVIpOworCQljcmVhdGVFUmVmZXJlbmNlKG9yZGVyaW5nVHlwZUVDbGFzcywgT1JERVJJTkdfVFlQRV9fQkVGT1JFKTsKKwogCQlzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VDVVJJVFlfQ09OU1RSQUlOVCk7CiAJCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLCBTRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUVTKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9SRVNPVVJDRV9DT0xMRUNUSU9OUyk7CkBAIC0xODEzLDggKzI2OTIsMTEgQEAKIAkJY3JlYXRlRUF0dHJpYnV0ZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19KU1BfRklMRSk7CiAJCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fSU5JVF9QQVJBTVMpOwogCQljcmVhdGVFQXR0cmlidXRlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX0xPQURfT05fU1RBUlRVUCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fRU5BQkxFRCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fQVNZTkNfU1VQUE9SVEVEKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShzZXJ2bGV0RUNsYXNzLCBTRVJWTEVUX19SVU5fQVMpOwogCQljcmVhdGVFUmVmZXJlbmNlKHNlcnZsZXRFQ2xhc3MsIFNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fTVVMVElQQVJUX0NPTkZJRyk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoc2VydmxldEVDbGFzcywgU0VSVkxFVF9fSUQpOwogCiAJCXNlcnZsZXRNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFUlZMRVRfTUFQUElORyk7CkBAIC0xODI0LDYgKzI3MDYsOCBAQAogCiAJCXNlc3Npb25Db25maWdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VTU0lPTl9DT05GSUcpOwogCQljcmVhdGVFQXR0cmlidXRlKHNlc3Npb25Db25maWdFQ2xhc3MsIFNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQpOworCQljcmVhdGVFUmVmZXJlbmNlKHNlc3Npb25Db25maWdFQ2xhc3MsIFNFU1NJT05fQ09ORklHX19DT09LSUVfQ09ORklHKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShzZXNzaW9uQ29uZmlnRUNsYXNzLCBTRVNTSU9OX0NPTkZJR19fVFJBQ0tJTkdfTU9ERSk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUoc2Vzc2lvbkNvbmZpZ0VDbGFzcywgU0VTU0lPTl9DT05GSUdfX0lEKTsKIAogCQl1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVVNFUl9EQVRBX0NPTlNUUkFJTlQpOwpAQCAtMTgzMyw2ICsyNzE3LDcgQEAKIAogCQl3ZWJBcHBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VCX0FQUCk7CiAJCWNyZWF0ZUVBdHRyaWJ1dGUod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19HUk9VUCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19NT0RVTEVfTkFNRSk7CiAJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19ERVNDUklQVElPTlMpOwogCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fRElTUExBWV9OQU1FUyk7CiAJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19JQ09OUyk7CkBAIC0xODYyLDggKzI3NDcsMTAgQEAKIAkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyk7CiAJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRUNsYXNzLCBXRUJfQVBQX19QT1NUX0NPTlNUUlVDVFMpOwogCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcEVDbGFzcywgV0VCX0FQUF9fUFJFX0RFU1RST1lTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0RBVEFfU09VUkNFKTsKIAkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TKTsKIAkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0FCU09MVVRFX09SREVSSU5HKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX0lEKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX01FVEFEQVRBX0NPTVBMRVRFKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJBcHBFQ2xhc3MsIFdFQl9BUFBfX1ZFUlNJT04pOwpAQCAtMTg3NCwxMSArMjc2MSw1MiBAQAogCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTik7CiAJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfQVBQKTsKIAorCQl3ZWJGcmFnbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXRUJfRlJBR01FTlQpOworCQljcmVhdGVFQXR0cmlidXRlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX0dST1VQKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJGcmFnbWVudEVDbGFzcywgV0VCX0ZSQUdNRU5UX19OQU1FKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJGcmFnbWVudEVDbGFzcywgV0VCX0ZSQUdNRU5UX19ERVNDUklQVElPTlMpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX0RJU1BMQVlfTkFNRVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX0lDT05TKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJGcmFnbWVudEVDbGFzcywgV0VCX0ZSQUdNRU5UX19ESVNUUklCVVRBQkxFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViRnJhZ21lbnRFQ2xhc3MsIFdFQl9GUkFHTUVOVF9fQ09OVEVYVF9QQVJBTVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX0ZJTFRFUlMpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX0ZJTFRFUl9NQVBQSU5HUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViRnJhZ21lbnRFQ2xhc3MsIFdFQl9GUkFHTUVOVF9fTElTVEVORVJTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJGcmFnbWVudEVDbGFzcywgV0VCX0ZSQUdNRU5UX19TRVJWTEVUUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViRnJhZ21lbnRFQ2xhc3MsIFdFQl9GUkFHTUVOVF9fU0VSVkxFVF9NQVBQSU5HUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViRnJhZ21lbnRFQ2xhc3MsIFdFQl9GUkFHTUVOVF9fU0VTU0lPTl9DT05GSUdTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJGcmFnbWVudEVDbGFzcywgV0VCX0ZSQUdNRU5UX19NSU1FX01BUFBJTkdTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJGcmFnbWVudEVDbGFzcywgV0VCX0ZSQUdNRU5UX19XRUxDT01FX0ZJTEVfTElTVFMpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX0VSUk9SX1BBR0VTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJGcmFnbWVudEVDbGFzcywgV0VCX0ZSQUdNRU5UX19KU1BfQ09ORklHUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViRnJhZ21lbnRFQ2xhc3MsIFdFQl9GUkFHTUVOVF9fU0VDVVJJVFlfQ09OU1RSQUlOVFMpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX0xPR0lOX0NPTkZJR1MpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX1NFQ1VSSVRZX1JPTEVTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJGcmFnbWVudEVDbGFzcywgV0VCX0ZSQUdNRU5UX19FTlZfRU5UUklFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViRnJhZ21lbnRFQ2xhc3MsIFdFQl9GUkFHTUVOVF9fRUpCX1JFRlMpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX0VKQl9MT0NBTF9SRUZTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJGcmFnbWVudEVDbGFzcywgV0VCX0ZSQUdNRU5UX19TRVJWSUNFX1JFRlMpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX1JFU09VUkNFX1JFRlMpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX1JFU09VUkNFX0VOVl9SRUZTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJGcmFnbWVudEVDbGFzcywgV0VCX0ZSQUdNRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRlMpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViRnJhZ21lbnRFQ2xhc3MsIFdFQl9GUkFHTUVOVF9fUEVSU0lTVEVOQ0VfVU5JVF9SRUZTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJGcmFnbWVudEVDbGFzcywgV0VCX0ZSQUdNRU5UX19QT1NUX0NPTlNUUlVDVFMpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX1BSRV9ERVNUUk9ZUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViRnJhZ21lbnRFQ2xhc3MsIFdFQl9GUkFHTUVOVF9fREFUQV9TT1VSQ0UpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX01FU1NBR0VfREVTVElOQVRJT05TKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJGcmFnbWVudEVDbGFzcywgV0VCX0ZSQUdNRU5UX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViRnJhZ21lbnRFQ2xhc3MsIFdFQl9GUkFHTUVOVF9fT1JERVJJTkcpOworCQljcmVhdGVFQXR0cmlidXRlKHdlYkZyYWdtZW50RUNsYXNzLCBXRUJfRlJBR01FTlRfX0lEKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJGcmFnbWVudEVDbGFzcywgV0VCX0ZSQUdNRU5UX19NRVRBREFUQV9DT01QTEVURSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUod2ViRnJhZ21lbnRFQ2xhc3MsIFdFQl9GUkFHTUVOVF9fVkVSU0lPTik7CisKIAkJd2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRSk7CiAJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TKTsKIAkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19VUkxfUEFUVEVSTlMpOwogCQljcmVhdGVFQXR0cmlidXRlKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUod2ViUmVzb3VyY2VDb2xsZWN0aW9uRUNsYXNzLCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RfT01JU1NJT04pOwogCQljcmVhdGVFQXR0cmlidXRlKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0lEKTsKIAogCQl3ZWxjb21lRmlsZUxpc3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VMQ09NRV9GSUxFX0xJU1QpOwpAQCAtMTg4OCw2ICsyODE2LDcgQEAKIAkJLy8gQ3JlYXRlIGVudW1zCiAJCWRpc3BhdGNoZXJUeXBlRUVudW0gPSBjcmVhdGVFRW51bShESVNQQVRDSEVSX1RZUEUpOwogCQludWxsQ2hhclR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKE5VTExfQ0hBUl9UWVBFKTsKKwkJdHJhY2tpbmdNb2RlVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oVFJBQ0tJTkdfTU9ERV9UWVBFKTsKIAkJdHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFKTsKIAkJd2ViQXBwVmVyc2lvblR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFdFQl9BUFBfVkVSU0lPTl9UWVBFKTsKIApAQCAtMTkwNCw2ICsyODMzLDcgQEAKIAkJbm9uRW1wdHlTdHJpbmdUeXBlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKE5PTl9FTVBUWV9TVFJJTkdfVFlQRSk7CiAJCW51bGxDaGFyVHlwZU9iamVjdEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShOVUxMX0NIQVJfVFlQRV9PQkpFQ1QpOwogCQlzZXJ2bGV0TmFtZVR5cGVFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoU0VSVkxFVF9OQU1FX1RZUEUpOworCQl0cmFja2luZ01vZGVUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFRSQUNLSU5HX01PREVfVFlQRV9PQkpFQ1QpOwogCQl0cmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFRSQU5TUE9SVF9HVUFSQU5URUVfVFlQRV9PQkpFQ1QpOwogCQl3YXJQYXRoVHlwZUVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShXQVJfUEFUSF9UWVBFKTsKIAkJd2ViQXBwVmVyc2lvblR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoV0VCX0FQUF9WRVJTSU9OX1RZUEVfT0JKRUNUKTsKQEAgLTE5MzcsMTkxICsyODY3LDMwOSBAQAogCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKIAkJSnNwUGFja2FnZSB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKTsKIAotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKIAotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGF1dGhDb25zdHJhaW50RUNsYXNzLCBBdXRoQ29uc3RyYWludC5jbGFzcywgIkF1dGhDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQXV0aENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aENvbnN0cmFpbnRfUm9sZU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lcyIsIG51bGwsIDAsIC0xLCBBdXRoQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aENvbnN0cmFpbnRfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQXV0aENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCiAKLQkJaW5pdEVDbGFzcyhlcnJvclBhZ2VFQ2xhc3MsIEVycm9yUGFnZS5jbGFzcywgIkVycm9yUGFnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFcnJvclBhZ2VfRXJyb3JDb2RlKCksIHRoaXMuZ2V0RXJyb3JDb2RlVHlwZSgpLCAiZXJyb3JDb2RlIiwgbnVsbCwgMCwgMSwgRXJyb3JQYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFcnJvclBhZ2VfRXhjZXB0aW9uVHlwZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJleGNlcHRpb25UeXBlIiwgbnVsbCwgMCwgMSwgRXJyb3JQYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRFcnJvclBhZ2VfTG9jYXRpb24oKSwgdGhpcy5nZXRXYXJQYXRoVHlwZSgpLCAibG9jYXRpb24iLCBudWxsLCAxLCAxLCBFcnJvclBhZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEVycm9yUGFnZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBFcnJvclBhZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGZpbHRlckVDbGFzcywgRmlsdGVyLmNsYXNzLCAiRmlsdGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlcl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJfRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyX0ljb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlcl9GaWx0ZXJOYW1lKCksIHRoaXMuZ2V0RmlsdGVyTmFtZVR5cGUoKSwgImZpbHRlck5hbWUiLCBudWxsLCAxLCAxLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlcl9GaWx0ZXJDbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJmaWx0ZXJDbGFzcyIsIG51bGwsIDEsIDEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyX0luaXRQYXJhbXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXJhbVZhbHVlKCksIG51bGwsICJpbml0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhmaWx0ZXJNYXBwaW5nRUNsYXNzLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAiRmlsdGVyTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlck5hbWUoKSwgdGhpcy5nZXRGaWx0ZXJOYW1lVHlwZSgpLCAiZmlsdGVyTmFtZSIsIG51bGwsIDEsIDEsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlck1hcHBpbmdfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlck1hcHBpbmdfVXJsUGF0dGVybnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRVcmxQYXR0ZXJuVHlwZSgpLCBudWxsLCAidXJsUGF0dGVybnMiLCBudWxsLCAwLCAtMSwgRmlsdGVyTWFwcGluZy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJNYXBwaW5nX1NlcnZsZXROYW1lcygpLCB0aGlzLmdldFNlcnZsZXROYW1lVHlwZSgpLCAic2VydmxldE5hbWVzIiwgbnVsbCwgMCwgLTEsIEZpbHRlck1hcHBpbmcuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlck1hcHBpbmdfRGlzcGF0Y2hlcnMoKSwgdGhpcy5nZXREaXNwYXRjaGVyVHlwZSgpLCAiZGlzcGF0Y2hlcnMiLCAiRk9SV0FSRCIsIDAsIDQsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyTWFwcGluZ19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhmb3JtTG9naW5Db25maWdFQ2xhc3MsIEZvcm1Mb2dpbkNvbmZpZy5jbGFzcywgIkZvcm1Mb2dpbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpLCB0aGlzLmdldFdhclBhdGhUeXBlKCksICJmb3JtTG9naW5QYWdlIiwgbnVsbCwgMSwgMSwgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRGb3JtTG9naW5Db25maWdfRm9ybUVycm9yUGFnZSgpLCB0aGlzLmdldFdhclBhdGhUeXBlKCksICJmb3JtRXJyb3JQYWdlIiwgbnVsbCwgMSwgMSwgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRGb3JtTG9naW5Db25maWdfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhsb2NhbGVFbmNvZGluZ01hcHBpbmdFQ2xhc3MsIExvY2FsZUVuY29kaW5nTWFwcGluZy5jbGFzcywgIkxvY2FsZUVuY29kaW5nTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCksIHRoaXMuZ2V0TG9jYWxlVHlwZSgpLCAibG9jYWxlIiwgbnVsbCwgMSwgMSwgTG9jYWxlRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKSwgdGhpcy5nZXRFbmNvZGluZ1R5cGUoKSwgImVuY29kaW5nIiwgbnVsbCwgMSwgMSwgTG9jYWxlRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTG9jYWxlRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhsb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzLCBMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0LmNsYXNzLCAiTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpLCB0aGlzLmdldExvY2FsZUVuY29kaW5nTWFwcGluZygpLCBudWxsLCAibG9jYWxFbmNvZGluZ01hcHBpbmdzIiwgbnVsbCwgMSwgLTEsIExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhsb2dpbkNvbmZpZ0VDbGFzcywgTG9naW5Db25maWcuY2xhc3MsICJMb2dpbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2dpbkNvbmZpZ19BdXRoTWV0aG9kKCksIHRoaXMuZ2V0QXV0aE1ldGhvZFR5cGUoKSwgImF1dGhNZXRob2QiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJyZWFsbU5hbWUiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCksIHRoaXMuZ2V0Rm9ybUxvZ2luQ29uZmlnKCksIG51bGwsICJmb3JtTG9naW5Db25maWciLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRMb2dpbkNvbmZpZ19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MobWltZU1hcHBpbmdFQ2xhc3MsIE1pbWVNYXBwaW5nLmNsYXNzLCAiTWltZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfRXh0ZW5zaW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJleHRlbnNpb24iLCBudWxsLCAxLCAxLCBNaW1lTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSwgdGhpcy5nZXRNaW1lVHlwZVR5cGUoKSwgIm1pbWVUeXBlIiwgbnVsbCwgMSwgMSwgTWltZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1pbWVNYXBwaW5nX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIE1pbWVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgIlNlY3VyaXR5Q29uc3RyYWludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKSwgdGhpcy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKSwgbnVsbCwgIndlYlJlc291cmNlQ29sbGVjdGlvbnMiLCBudWxsLCAxLCAtMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpLCB0aGlzLmdldEF1dGhDb25zdHJhaW50KCksIG51bGwsICJhdXRoQ29uc3RyYWludCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCksIHRoaXMuZ2V0VXNlckRhdGFDb25zdHJhaW50KCksIG51bGwsICJ1c2VyRGF0YUNvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlDb25zdHJhaW50X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Moc2VydmxldEVDbGFzcywgU2VydmxldC5jbGFzcywgIlNlcnZsZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9EaXNwbGF5TmFtZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpLCB0aGlzLmdldFNlcnZsZXROYW1lVHlwZSgpLCAic2VydmxldE5hbWUiLCBudWxsLCAxLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0X1NlcnZsZXRDbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJzZXJ2bGV0Q2xhc3MiLCBudWxsLCAwLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0X0pzcEZpbGUoKSwgdGhlSnNwUGFja2FnZS5nZXRKc3BGaWxlVHlwZSgpLCAianNwRmlsZSIsIG51bGwsIDAsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfSW5pdFBhcmFtcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBhcmFtVmFsdWUoKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKSwgdGhpcy5nZXRMb2FkT25TdGFydHVwVHlwZSgpLCAibG9hZE9uU3RhcnR1cCIsIG51bGwsIDAsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfUnVuQXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSdW5BcygpLCBudWxsLCAicnVuQXMiLCBudWxsLCAwLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfU2VjdXJpdHlSb2xlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlY3VyaXR5Um9sZVJlZigpLCBudWxsLCAic2VjdXJpdHlSb2xlUmVmcyIsIG51bGwsIDAsIC0xLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Moc2VydmxldE1hcHBpbmdFQ2xhc3MsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCAiU2VydmxldE1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldE1hcHBpbmdfU2VydmxldE5hbWUoKSwgdGhpcy5nZXRTZXJ2bGV0TmFtZVR5cGUoKSwgInNlcnZsZXROYW1lIiwgbnVsbCwgMSwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRNYXBwaW5nX1VybFBhdHRlcm5zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VXJsUGF0dGVyblR5cGUoKSwgbnVsbCwgInVybFBhdHRlcm5zIiwgbnVsbCwgMSwgLTEsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRNYXBwaW5nX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhzZXNzaW9uQ29uZmlnRUNsYXNzLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAiU2Vzc2lvbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uQ29uZmlnX1Nlc3Npb25UaW1lb3V0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludGVnZXIoKSwgInNlc3Npb25UaW1lb3V0IiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkNvbmZpZ19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIlVzZXJEYXRhQ29uc3RyYWludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBVc2VyRGF0YUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VXNlckRhdGFDb25zdHJhaW50X1RyYW5zcG9ydEd1YXJhbnRlZSgpLCB0aGlzLmdldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoKSwgInRyYW5zcG9ydEd1YXJhbnRlZSIsICJOT05FIiwgMSwgMSwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VXNlckRhdGFDb25zdHJhaW50X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mod2ViQXBwRUNsYXNzLCBXZWJBcHAuY2xhc3MsICJXZWJBcHAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViQXBwX0dyb3VwKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cCIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0ljb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SWNvbigpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9EaXN0cmlidXRhYmxlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVtcHR5VHlwZSgpLCBudWxsLCAiZGlzdHJpYnV0YWJsZXMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGFyYW1WYWx1ZSgpLCBudWxsLCAiY29udGV4dFBhcmFtcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0ZpbHRlcnMoKSwgdGhpcy5nZXRGaWx0ZXIoKSwgbnVsbCwgImZpbHRlcnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9GaWx0ZXJNYXBwaW5ncygpLCB0aGlzLmdldEZpbHRlck1hcHBpbmcoKSwgbnVsbCwgImZpbHRlck1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTGlzdGVuZXJzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlzdGVuZXIoKSwgbnVsbCwgImxpc3RlbmVycyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1NlcnZsZXRzKCksIHRoaXMuZ2V0U2VydmxldCgpLCBudWxsLCAic2VydmxldHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKSwgdGhpcy5nZXRTZXJ2bGV0TWFwcGluZygpLCBudWxsLCAic2VydmxldE1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZ3MoKSwgdGhpcy5nZXRTZXNzaW9uQ29uZmlnKCksIG51bGwsICJzZXNzaW9uQ29uZmlncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX01pbWVNYXBwaW5ncygpLCB0aGlzLmdldE1pbWVNYXBwaW5nKCksIG51bGwsICJtaW1lTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9XZWxjb21lRmlsZUxpc3RzKCksIHRoaXMuZ2V0V2VsY29tZUZpbGVMaXN0KCksIG51bGwsICJ3ZWxjb21lRmlsZUxpc3RzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRXJyb3JQYWdlcygpLCB0aGlzLmdldEVycm9yUGFnZSgpLCBudWxsLCAiZXJyb3JQYWdlcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0pzcENvbmZpZ3MoKSwgdGhlSnNwUGFja2FnZS5nZXRKc3BDb25maWcoKSwgbnVsbCwgImpzcENvbmZpZ3MiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZWN1cml0eUNvbnN0cmFpbnRzKCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCksIG51bGwsICJzZWN1cml0eUNvbnN0cmFpbnRzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTG9naW5Db25maWdzKCksIHRoaXMuZ2V0TG9naW5Db25maWcoKSwgbnVsbCwgImxvZ2luQ29uZmlncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1NlY3VyaXR5Um9sZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZWN1cml0eVJvbGUoKSwgbnVsbCwgInNlY3VyaXR5Um9sZXMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9FbnZFbnRyaWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW52RW50cnkoKSwgbnVsbCwgImVudkVudHJpZXMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9FamJSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiUmVmKCksIG51bGwsICJlamJSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRWpiTG9jYWxSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiTG9jYWxSZWYoKSwgbnVsbCwgImVqYkxvY2FsUmVmcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1NlcnZpY2VSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9SZXNvdXJjZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfUmVzb3VyY2VFbnZSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvblJlZnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZUNvbnRleHRSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfUGVyc2lzdGVuY2VVbml0UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFBlcnNpc3RlbmNlVW5pdFJlZigpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0UmVmcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1Bvc3RDb25zdHJ1Y3RzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2soKSwgbnVsbCwgInBvc3RDb25zdHJ1Y3RzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfUHJlRGVzdHJveXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicHJlRGVzdHJveXMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9NZXNzYWdlRGVzdGluYXRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25zIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKSwgdGhpcy5nZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KCksIG51bGwsICJsb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViQXBwX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJBcHBfTWV0YWRhdGFDb21wbGV0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJtZXRhZGF0YUNvbXBsZXRlIiwgbnVsbCwgMCwgMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYkFwcF9WZXJzaW9uKCksIHRoaXMuZ2V0V2ViQXBwVmVyc2lvblR5cGUoKSwgInZlcnNpb24iLCAiMi41IiwgMSwgMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvci5jbGFzcywgIldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJtaXhlZCIsIG51bGwsIDAsIC0xLCBudWxsLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhNTE5TUHJlZml4TWFwIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhTSVNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgbnVsbCwgIndlYkFwcCIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIldlYlJlc291cmNlQ29sbGVjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fV2ViUmVzb3VyY2VOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJ3ZWJSZXNvdXJjZU5hbWUiLCBudWxsLCAxLCAxLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVXJsUGF0dGVybnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRVcmxQYXR0ZXJuVHlwZSgpLCBudWxsLCAidXJsUGF0dGVybnMiLCBudWxsLCAxLCAtMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kcygpLCB0aGlzLmdldEh0dHBNZXRob2RUeXBlKCksICJodHRwTWV0aG9kcyIsIG51bGwsIDAsIC0xLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHdlbGNvbWVGaWxlTGlzdEVDbGFzcywgV2VsY29tZUZpbGVMaXN0LmNsYXNzLCAiV2VsY29tZUZpbGVMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdlbGNvbWVGaWxlTGlzdF9XZWxjb21lRmlsZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3ZWxjb21lRmlsZXMiLCBudWxsLCAxLCAtMSwgV2VsY29tZUZpbGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWxjb21lRmlsZUxpc3RfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgV2VsY29tZUZpbGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGRpc3BhdGNoZXJUeXBlRUVudW0sIERpc3BhdGNoZXJUeXBlLmNsYXNzLCAiRGlzcGF0Y2hlclR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuRk9SV0FSRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRpc3BhdGNoZXJUeXBlRUVudW0sIERpc3BhdGNoZXJUeXBlLklOQ0xVREVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5SRVFVRVNUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuRVJST1JfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKG51bGxDaGFyVHlwZUVFbnVtLCBOdWxsQ2hhclR5cGUuY2xhc3MsICJOdWxsQ2hhclR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwobnVsbENoYXJUeXBlRUVudW0sIE51bGxDaGFyVHlwZS5fX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bSh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuY2xhc3MsICJUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5OT05FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtLCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLklOVEVHUkFMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtLCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLkNPTkZJREVOVElBTF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0od2ViQXBwVmVyc2lvblR5cGVFRW51bSwgV2ViQXBwVmVyc2lvblR5cGUuY2xhc3MsICJXZWJBcHBWZXJzaW9uVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbCh3ZWJBcHBWZXJzaW9uVHlwZUVFbnVtLCBXZWJBcHBWZXJzaW9uVHlwZS5fMjVfTElURVJBTCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoYXV0aE1ldGhvZFR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkF1dGhNZXRob2RUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGRpc3BhdGNoZXJUeXBlT2JqZWN0RURhdGFUeXBlLCBEaXNwYXRjaGVyVHlwZS5jbGFzcywgIkRpc3BhdGNoZXJUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZW5jb2RpbmdUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJFbmNvZGluZ1R5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZXJyb3JDb2RlVHlwZUVEYXRhVHlwZSwgQmlnSW50ZWdlci5jbGFzcywgIkVycm9yQ29kZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZmlsdGVyTmFtZVR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkZpbHRlck5hbWVUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGh0dHBNZXRob2RUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJIdHRwTWV0aG9kVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShsb2FkT25TdGFydHVwVHlwZUVEYXRhVHlwZSwgT2JqZWN0LmNsYXNzLCAiTG9hZE9uU3RhcnR1cFR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUobG9jYWxlVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiTG9jYWxlVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShtaW1lVHlwZVR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIk1pbWVUeXBlVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShub25FbXB0eVN0cmluZ1R5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIk5vbkVtcHR5U3RyaW5nVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShudWxsQ2hhclR5cGVPYmplY3RFRGF0YVR5cGUsIE51bGxDaGFyVHlwZS5jbGFzcywgIk51bGxDaGFyVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHNlcnZsZXROYW1lVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiU2VydmxldE5hbWVUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3RFRGF0YVR5cGUsIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuY2xhc3MsICJUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUod2FyUGF0aFR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIldhclBhdGhUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHdlYkFwcFZlcnNpb25UeXBlT2JqZWN0RURhdGFUeXBlLCBXZWJBcHBWZXJzaW9uVHlwZS5jbGFzcywgIldlYkFwcFZlcnNpb25UeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSBhbm5vdGF0aW9ucwotCQkvLyBodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEKLQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7CisJCWJvb2xlYW4gaGFzTG9jayA9IGZhbHNlOworCQl0cnkgeworCQkJaGFzTG9jayA9IEoyRUVJbml0LmFxdWlyZUluaXRpYWxpemVQYWNrYWdlQ29udGVudHNMb2NrKCk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9CQkKKwkJCisJCXRyeXsKKwkJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkKKwkJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCQlpbml0RUNsYXNzKGFic29sdXRlT3JkZXJpbmdUeXBlRUNsYXNzLCBBYnNvbHV0ZU9yZGVyaW5nVHlwZS5jbGFzcywgIkFic29sdXRlT3JkZXJpbmdUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBYnNvbHV0ZU9yZGVyaW5nVHlwZV9Hcm91cCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAiLCBudWxsLCAwLCAtMSwgQWJzb2x1dGVPcmRlcmluZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBYnNvbHV0ZU9yZGVyaW5nVHlwZV9OYW1lKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0SmF2YUlkZW50aWZpZXIoKSwgIm5hbWUiLCBudWxsLCAwLCAtMSwgQWJzb2x1dGVPcmRlcmluZ1R5cGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBYnNvbHV0ZU9yZGVyaW5nVHlwZV9PdGhlcnMoKSwgdGhpcy5nZXRPcmRlcmluZ090aGVyc1R5cGUoKSwgbnVsbCwgIm90aGVycyIsIG51bGwsIDAsIC0xLCBBYnNvbHV0ZU9yZGVyaW5nVHlwZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhhdXRoQ29uc3RyYWludEVDbGFzcywgQXV0aENvbnN0cmFpbnQuY2xhc3MsICJBdXRoQ29uc3RyYWludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBBdXRoQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aENvbnN0cmFpbnRfUm9sZU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0Um9sZU5hbWUoKSwgInJvbGVOYW1lcyIsIG51bGwsIDAsIC0xLCBBdXRoQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEF1dGhDb25zdHJhaW50X0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEF1dGhDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoY29va2llQ29tbWVudFR5cGVFQ2xhc3MsIENvb2tpZUNvbW1lbnRUeXBlLmNsYXNzLCAiQ29va2llQ29tbWVudFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvb2tpZUNvbW1lbnRUeXBlX1ZhbHVlKCksIHRoaXMuZ2V0Tm9uRW1wdHlTdHJpbmdUeXBlKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIENvb2tpZUNvbW1lbnRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGNvb2tpZUNvbmZpZ1R5cGVFQ2xhc3MsIENvb2tpZUNvbmZpZ1R5cGUuY2xhc3MsICJDb29raWVDb25maWdUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRDb29raWVDb25maWdUeXBlX05hbWUoKSwgdGhpcy5nZXRDb29raWVOYW1lVHlwZSgpLCBudWxsLCAibmFtZSIsIG51bGwsIDAsIDEsIENvb2tpZUNvbmZpZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldENvb2tpZUNvbmZpZ1R5cGVfRG9tYWluKCksIHRoaXMuZ2V0Q29va2llRG9tYWluVHlwZSgpLCBudWxsLCAiZG9tYWluIiwgbnVsbCwgMCwgMSwgQ29va2llQ29uZmlnVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29va2llQ29uZmlnVHlwZV9QYXRoKCksIHRoaXMuZ2V0Q29va2llUGF0aFR5cGUoKSwgbnVsbCwgInBhdGgiLCBudWxsLCAwLCAxLCBDb29raWVDb25maWdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRDb29raWVDb25maWdUeXBlX0NvbW1lbnQoKSwgdGhpcy5nZXRDb29raWVDb21tZW50VHlwZSgpLCBudWxsLCAiY29tbWVudCIsIG51bGwsIDAsIDEsIENvb2tpZUNvbmZpZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvb2tpZUNvbmZpZ1R5cGVfSHR0cE9ubHkoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJodHRwT25seSIsIG51bGwsIDAsIDEsIENvb2tpZUNvbmZpZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29va2llQ29uZmlnVHlwZV9TZWN1cmUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRUcnVlRmFsc2VUeXBlKCksICJzZWN1cmUiLCBudWxsLCAwLCAxLCBDb29raWVDb25maWdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvb2tpZUNvbmZpZ1R5cGVfTWF4QWdlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludGVnZXIoKSwgIm1heEFnZSIsIG51bGwsIDAsIDEsIENvb2tpZUNvbmZpZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvb2tpZUNvbmZpZ1R5cGVfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgQ29va2llQ29uZmlnVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGNvb2tpZURvbWFpblR5cGVFQ2xhc3MsIENvb2tpZURvbWFpblR5cGUuY2xhc3MsICJDb29raWVEb21haW5UeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb29raWVEb21haW5UeXBlX1ZhbHVlKCksIHRoaXMuZ2V0Tm9uRW1wdHlTdHJpbmdUeXBlKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIENvb2tpZURvbWFpblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoY29va2llTmFtZVR5cGVFQ2xhc3MsIENvb2tpZU5hbWVUeXBlLmNsYXNzLCAiQ29va2llTmFtZVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvb2tpZU5hbWVUeXBlX1ZhbHVlKCksIHRoaXMuZ2V0Tm9uRW1wdHlTdHJpbmdUeXBlKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIENvb2tpZU5hbWVUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGNvb2tpZVBhdGhUeXBlRUNsYXNzLCBDb29raWVQYXRoVHlwZS5jbGFzcywgIkNvb2tpZVBhdGhUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb29raWVQYXRoVHlwZV9WYWx1ZSgpLCB0aGlzLmdldE5vbkVtcHR5U3RyaW5nVHlwZSgpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBDb29raWVQYXRoVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhlcnJvclBhZ2VFQ2xhc3MsIEVycm9yUGFnZS5jbGFzcywgIkVycm9yUGFnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXJyb3JQYWdlX0Vycm9yQ29kZSgpLCB0aGlzLmdldEVycm9yQ29kZVR5cGUoKSwgImVycm9yQ29kZSIsIG51bGwsIDAsIDEsIEVycm9yUGFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXJyb3JQYWdlX0V4Y2VwdGlvblR5cGUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAiZXhjZXB0aW9uVHlwZSIsIG51bGwsIDAsIDEsIEVycm9yUGFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXJyb3JQYWdlX0xvY2F0aW9uKCksIHRoaXMuZ2V0V2FyUGF0aFR5cGUoKSwgImxvY2F0aW9uIiwgbnVsbCwgMSwgMSwgRXJyb3JQYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFcnJvclBhZ2VfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgRXJyb3JQYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoZmlsdGVyRUNsYXNzLCBGaWx0ZXIuY2xhc3MsICJGaWx0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlcl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyX0Rpc3BsYXlOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJfSWNvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEZpbHRlcl9GaWx0ZXJOYW1lKCksIHRoaXMuZ2V0RmlsdGVyTmFtZVR5cGUoKSwgImZpbHRlck5hbWUiLCBudWxsLCAxLCAxLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEZpbHRlcl9GaWx0ZXJDbGFzcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NUeXBlKCksICJmaWx0ZXJDbGFzcyIsIG51bGwsIDAsIDEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyX0FzeW5jU3VwcG9ydGVkKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAiYXN5bmNTdXBwb3J0ZWQiLCBudWxsLCAwLCAxLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyX0luaXRQYXJhbXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXJhbVZhbHVlKCksIG51bGwsICJpbml0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGZpbHRlck1hcHBpbmdFQ2xhc3MsIEZpbHRlck1hcHBpbmcuY2xhc3MsICJGaWx0ZXJNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJNYXBwaW5nX0ZpbHRlck5hbWUoKSwgdGhpcy5nZXRGaWx0ZXJOYW1lVHlwZSgpLCAiZmlsdGVyTmFtZSIsIG51bGwsIDEsIDEsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEZpbHRlck1hcHBpbmdfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJNYXBwaW5nX1VybFBhdHRlcm5zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VXJsUGF0dGVyblR5cGUoKSwgbnVsbCwgInVybFBhdHRlcm5zIiwgbnVsbCwgMCwgLTEsIEZpbHRlck1hcHBpbmcuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEZpbHRlck1hcHBpbmdfU2VydmxldE5hbWVzKCksIHRoaXMuZ2V0U2VydmxldE5hbWVUeXBlKCksICJzZXJ2bGV0TmFtZXMiLCBudWxsLCAwLCAtMSwgRmlsdGVyTWFwcGluZy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEZpbHRlck1hcHBpbmdfRGlzcGF0Y2hlcnMoKSwgdGhpcy5nZXREaXNwYXRjaGVyVHlwZSgpLCAiZGlzcGF0Y2hlcnMiLCBudWxsLCAwLCA1LCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyTWFwcGluZ19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoZm9ybUxvZ2luQ29uZmlnRUNsYXNzLCBGb3JtTG9naW5Db25maWcuY2xhc3MsICJGb3JtTG9naW5Db25maWciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtTG9naW5QYWdlKCksIHRoaXMuZ2V0V2FyUGF0aFR5cGUoKSwgImZvcm1Mb2dpblBhZ2UiLCBudWxsLCAxLCAxLCBGb3JtTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEZvcm1Mb2dpbkNvbmZpZ19Gb3JtRXJyb3JQYWdlKCksIHRoaXMuZ2V0V2FyUGF0aFR5cGUoKSwgImZvcm1FcnJvclBhZ2UiLCBudWxsLCAxLCAxLCBGb3JtTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEZvcm1Mb2dpbkNvbmZpZ19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBGb3JtTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhsb2NhbGVFbmNvZGluZ01hcHBpbmdFQ2xhc3MsIExvY2FsZUVuY29kaW5nTWFwcGluZy5jbGFzcywgIkxvY2FsZUVuY29kaW5nTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nX0xvY2FsZSgpLCB0aGlzLmdldExvY2FsZVR5cGUoKSwgImxvY2FsZSIsIG51bGwsIDEsIDEsIExvY2FsZUVuY29kaW5nTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nX0VuY29kaW5nKCksIHRoaXMuZ2V0RW5jb2RpbmdUeXBlKCksICJlbmNvZGluZyIsIG51bGwsIDEsIDEsIExvY2FsZUVuY29kaW5nTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIExvY2FsZUVuY29kaW5nTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RFQ2xhc3MsIExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QuY2xhc3MsICJMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0X0xvY2FsRW5jb2RpbmdNYXBwaW5ncygpLCB0aGlzLmdldExvY2FsZUVuY29kaW5nTWFwcGluZygpLCBudWxsLCAibG9jYWxFbmNvZGluZ01hcHBpbmdzIiwgbnVsbCwgMSwgLTEsIExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGxvZ2luQ29uZmlnRUNsYXNzLCBMb2dpbkNvbmZpZy5jbGFzcywgIkxvZ2luQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRMb2dpbkNvbmZpZ19BdXRoTWV0aG9kKCksIHRoaXMuZ2V0QXV0aE1ldGhvZFR5cGUoKSwgImF1dGhNZXRob2QiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJyZWFsbU5hbWUiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCksIHRoaXMuZ2V0Rm9ybUxvZ2luQ29uZmlnKCksIG51bGwsICJmb3JtTG9naW5Db25maWciLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9naW5Db25maWdfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhtaW1lTWFwcGluZ0VDbGFzcywgTWltZU1hcHBpbmcuY2xhc3MsICJNaW1lTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfRXh0ZW5zaW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJleHRlbnNpb24iLCBudWxsLCAxLCAxLCBNaW1lTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSwgdGhpcy5nZXRNaW1lVHlwZVR5cGUoKSwgIm1pbWVUeXBlIiwgbnVsbCwgMSwgMSwgTWltZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1pbWVNYXBwaW5nX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldElEKCksICJpZCIsIG51bGwsIDAsIDEsIE1pbWVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MobXVsdGlwYXJ0Q29uZmlnVHlwZUVDbGFzcywgTXVsdGlwYXJ0Q29uZmlnVHlwZS5jbGFzcywgIk11bHRpcGFydENvbmZpZ1R5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE11bHRpcGFydENvbmZpZ1R5cGVfTG9jYXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgImxvY2F0aW9uIiwgbnVsbCwgMCwgMSwgTXVsdGlwYXJ0Q29uZmlnVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZV9NYXhGaWxlU2l6ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRMb25nKCksICJtYXhGaWxlU2l6ZSIsIG51bGwsIDAsIDEsIE11bHRpcGFydENvbmZpZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZV9NYXhSZXF1ZXN0U2l6ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRMb25nKCksICJtYXhSZXF1ZXN0U2l6ZSIsIG51bGwsIDAsIDEsIE11bHRpcGFydENvbmZpZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZV9GaWxlU2l6ZVRocmVzaG9sZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRlZ2VyKCksICJmaWxlU2l6ZVRocmVzaG9sZCIsIG51bGwsIDAsIDEsIE11bHRpcGFydENvbmZpZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Mob3JkZXJpbmdPcmRlcmluZ1R5cGVFQ2xhc3MsIE9yZGVyaW5nT3JkZXJpbmdUeXBlLmNsYXNzLCAiT3JkZXJpbmdPcmRlcmluZ1R5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE9yZGVyaW5nT3JkZXJpbmdUeXBlX05hbWUoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRKYXZhSWRlbnRpZmllcigpLCAibmFtZSIsIG51bGwsIDAsIC0xLCBPcmRlcmluZ09yZGVyaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE9yZGVyaW5nT3JkZXJpbmdUeXBlX090aGVycygpLCB0aGlzLmdldE9yZGVyaW5nT3RoZXJzVHlwZSgpLCBudWxsLCAib3RoZXJzIiwgbnVsbCwgMCwgMSwgT3JkZXJpbmdPcmRlcmluZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Mob3JkZXJpbmdPdGhlcnNUeXBlRUNsYXNzLCBPcmRlcmluZ090aGVyc1R5cGUuY2xhc3MsICJPcmRlcmluZ090aGVyc1R5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE9yZGVyaW5nT3RoZXJzVHlwZV9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBPcmRlcmluZ090aGVyc1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhvcmRlcmluZ1R5cGVFQ2xhc3MsIE9yZGVyaW5nVHlwZS5jbGFzcywgIk9yZGVyaW5nVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0T3JkZXJpbmdUeXBlX0FmdGVyKCksIHRoaXMuZ2V0T3JkZXJpbmdPcmRlcmluZ1R5cGUoKSwgbnVsbCwgImFmdGVyIiwgbnVsbCwgMCwgMSwgT3JkZXJpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRPcmRlcmluZ1R5cGVfQmVmb3JlKCksIHRoaXMuZ2V0T3JkZXJpbmdPcmRlcmluZ1R5cGUoKSwgbnVsbCwgImJlZm9yZSIsIG51bGwsIDAsIDEsIE9yZGVyaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgIlNlY3VyaXR5Q29uc3RyYWludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpLCB0aGlzLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbigpLCBudWxsLCAid2ViUmVzb3VyY2VDb2xsZWN0aW9ucyIsIG51bGwsIDEsIC0xLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpLCB0aGlzLmdldEF1dGhDb25zdHJhaW50KCksIG51bGwsICJhdXRoQ29uc3RyYWludCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlDb25zdHJhaW50X1VzZXJEYXRhQ29uc3RyYWludCgpLCB0aGlzLmdldFVzZXJEYXRhQ29uc3RyYWludCgpLCBudWxsLCAidXNlckRhdGFDb25zdHJhaW50IiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Moc2VydmxldEVDbGFzcywgU2VydmxldC5jbGFzcywgIlNlcnZsZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0X0Rpc3BsYXlOYW1lcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRfU2VydmxldE5hbWUoKSwgdGhpcy5nZXRTZXJ2bGV0TmFtZVR5cGUoKSwgInNlcnZsZXROYW1lIiwgbnVsbCwgMSwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldF9TZXJ2bGV0Q2xhc3MoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRGdWxseVF1YWxpZmllZENsYXNzVHlwZSgpLCAic2VydmxldENsYXNzIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldF9Kc3BGaWxlKCksIHRoZUpzcFBhY2thZ2UuZ2V0SnNwRmlsZVR5cGUoKSwgImpzcEZpbGUiLCBudWxsLCAwLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0X0luaXRQYXJhbXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQYXJhbVZhbHVlKCksIG51bGwsICJpbml0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRfTG9hZE9uU3RhcnR1cCgpLCB0aGlzLmdldExvYWRPblN0YXJ0dXBUeXBlKCksICJsb2FkT25TdGFydHVwIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldF9FbmFibGVkKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VHJ1ZUZhbHNlVHlwZSgpLCAiZW5hYmxlZCIsIG51bGwsIDAsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldF9Bc3luY1N1cHBvcnRlZCgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFRydWVGYWxzZVR5cGUoKSwgImFzeW5jU3VwcG9ydGVkIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0X1J1bkFzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UnVuQXMoKSwgbnVsbCwgInJ1bkFzIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9TZWN1cml0eVJvbGVSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlUmVmKCksIG51bGwsICJzZWN1cml0eVJvbGVSZWZzIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfTXVsdGlwYXJ0Q29uZmlnKCksIHRoaXMuZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZSgpLCBudWxsLCAibXVsdGlwYXJ0Q29uZmlnIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Moc2VydmxldE1hcHBpbmdFQ2xhc3MsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCAiU2VydmxldE1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRNYXBwaW5nX1NlcnZsZXROYW1lKCksIHRoaXMuZ2V0U2VydmxldE5hbWVUeXBlKCksICJzZXJ2bGV0TmFtZSIsIG51bGwsIDEsIDEsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFVybFBhdHRlcm5UeXBlKCksIG51bGwsICJ1cmxQYXR0ZXJucyIsIG51bGwsIDEsIC0xLCBTZXJ2bGV0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldE1hcHBpbmdfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhzZXNzaW9uQ29uZmlnRUNsYXNzLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAiU2Vzc2lvbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkNvbmZpZ19TZXNzaW9uVGltZW91dCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRlZ2VyKCksICJzZXNzaW9uVGltZW91dCIsIG51bGwsIDAsIDEsIFNlc3Npb25Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25Db25maWdfQ29va2llQ29uZmlnKCksIHRoaXMuZ2V0Q29va2llQ29uZmlnVHlwZSgpLCBudWxsLCAiY29va2llQ29uZmlnIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkNvbmZpZ19UcmFja2luZ01vZGUoKSwgdGhpcy5nZXRUcmFja2luZ01vZGVUeXBlKCksICJ0cmFja2luZ01vZGUiLCBudWxsLCAwLCAzLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkNvbmZpZ19JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3ModXNlckRhdGFDb25zdHJhaW50RUNsYXNzLCBVc2VyRGF0YUNvbnN0cmFpbnQuY2xhc3MsICJVc2VyRGF0YUNvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VXNlckRhdGFDb25zdHJhaW50X1RyYW5zcG9ydEd1YXJhbnRlZSgpLCB0aGlzLmdldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoKSwgInRyYW5zcG9ydEd1YXJhbnRlZSIsIG51bGwsIDEsIDEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRVc2VyRGF0YUNvbnN0cmFpbnRfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Mod2ViQXBwRUNsYXNzLCBXZWJBcHAuY2xhc3MsICJXZWJBcHAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFdlYkFwcF9Hcm91cCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViQXBwX01vZHVsZU5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0VG9rZW4oKSwgIm1vZHVsZU5hbWUiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0Rlc2NyaXB0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9JY29ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEljb24oKSwgbnVsbCwgImljb25zIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0Rpc3RyaWJ1dGFibGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RW1wdHlUeXBlKCksIG51bGwsICJkaXN0cmlidXRhYmxlcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGFyYW1WYWx1ZSgpLCBudWxsLCAiY29udGV4dFBhcmFtcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9GaWx0ZXJzKCksIHRoaXMuZ2V0RmlsdGVyKCksIG51bGwsICJmaWx0ZXJzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCksIHRoaXMuZ2V0RmlsdGVyTWFwcGluZygpLCBudWxsLCAiZmlsdGVyTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTGlzdGVuZXJzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlzdGVuZXIoKSwgbnVsbCwgImxpc3RlbmVycyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZXJ2bGV0cygpLCB0aGlzLmdldFNlcnZsZXQoKSwgbnVsbCwgInNlcnZsZXRzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpLCB0aGlzLmdldFNlcnZsZXRNYXBwaW5nKCksIG51bGwsICJzZXJ2bGV0TWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZ3MoKSwgdGhpcy5nZXRTZXNzaW9uQ29uZmlnKCksIG51bGwsICJzZXNzaW9uQ29uZmlncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKSwgdGhpcy5nZXRNaW1lTWFwcGluZygpLCBudWxsLCAibWltZU1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1dlbGNvbWVGaWxlTGlzdHMoKSwgdGhpcy5nZXRXZWxjb21lRmlsZUxpc3QoKSwgbnVsbCwgIndlbGNvbWVGaWxlTGlzdHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRXJyb3JQYWdlcygpLCB0aGlzLmdldEVycm9yUGFnZSgpLCBudWxsLCAiZXJyb3JQYWdlcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Kc3BDb25maWdzKCksIHRoZUpzcFBhY2thZ2UuZ2V0SnNwQ29uZmlnKCksIG51bGwsICJqc3BDb25maWdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1NlY3VyaXR5Q29uc3RyYWludHMoKSwgdGhpcy5nZXRTZWN1cml0eUNvbnN0cmFpbnQoKSwgbnVsbCwgInNlY3VyaXR5Q29uc3RyYWludHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTG9naW5Db25maWdzKCksIHRoaXMuZ2V0TG9naW5Db25maWcoKSwgbnVsbCwgImxvZ2luQ29uZmlncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZWN1cml0eVJvbGVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlKCksIG51bGwsICJzZWN1cml0eVJvbGVzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0VudkVudHJpZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFbnZFbnRyeSgpLCBudWxsLCAiZW52RW50cmllcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9FamJSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiUmVmKCksIG51bGwsICJlamJSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0VqYkxvY2FsUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVqYkxvY2FsUmVmKCksIG51bGwsICJlamJMb2NhbFJlZnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfU2VydmljZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9SZXNvdXJjZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1Jlc291cmNlRW52UmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFJlc291cmNlRW52UmVmKCksIG51bGwsICJyZXNvdXJjZUVudlJlZnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZUNvbnRleHRSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1BlcnNpc3RlbmNlVW5pdFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWYoKSwgbnVsbCwgInBlcnNpc3RlbmNlVW5pdFJlZnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfUG9zdENvbnN0cnVjdHMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicG9zdENvbnN0cnVjdHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfUHJlRGVzdHJveXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicHJlRGVzdHJveXMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRGF0YVNvdXJjZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldERhdGFTb3VyY2VUeXBlKCksIG51bGwsICJkYXRhU291cmNlIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKSwgdGhpcy5nZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KCksIG51bGwsICJsb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9BYnNvbHV0ZU9yZGVyaW5nKCksIHRoaXMuZ2V0QWJzb2x1dGVPcmRlcmluZ1R5cGUoKSwgbnVsbCwgImFic29sdXRlT3JkZXJpbmciLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJBcHBfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFdlYkFwcF9NZXRhZGF0YUNvbXBsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgIm1ldGFkYXRhQ29tcGxldGUiLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViQXBwX1ZlcnNpb24oKSwgdGhpcy5nZXRXZWJBcHBWZXJzaW9uVHlwZSgpLCAidmVyc2lvbiIsIG51bGwsIDEsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvci5jbGFzcywgIldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAibWl4ZWQiLCBudWxsLCAwLCAtMSwgbnVsbCwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieE1MTlNQcmVmaXhNYXAiLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhTSVNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIG51bGwsICJ3ZWJBcHAiLCBudWxsLCAwLCAtMiwgbnVsbCwgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyh3ZWJGcmFnbWVudEVDbGFzcywgV2ViRnJhZ21lbnQuY2xhc3MsICJXZWJGcmFnbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViRnJhZ21lbnRfR3JvdXAoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwIiwgbnVsbCwgMCwgLTEsIFdlYkZyYWdtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViRnJhZ21lbnRfTmFtZSgpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEphdmFJZGVudGlmaWVyKCksICJuYW1lIiwgbnVsbCwgMCwgLTEsIFdlYkZyYWdtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfRGVzY3JpcHRpb25zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfRGlzcGxheU5hbWVzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfSWNvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRJY29uKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfRGlzdHJpYnV0YWJsZXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFbXB0eVR5cGUoKSwgbnVsbCwgImRpc3RyaWJ1dGFibGVzIiwgbnVsbCwgMCwgLTEsIFdlYkZyYWdtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJGcmFnbWVudF9Db250ZXh0UGFyYW1zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGFyYW1WYWx1ZSgpLCBudWxsLCAiY29udGV4dFBhcmFtcyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfRmlsdGVycygpLCB0aGlzLmdldEZpbHRlcigpLCBudWxsLCAiZmlsdGVycyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfRmlsdGVyTWFwcGluZ3MoKSwgdGhpcy5nZXRGaWx0ZXJNYXBwaW5nKCksIG51bGwsICJmaWx0ZXJNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfTGlzdGVuZXJzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TGlzdGVuZXIoKSwgbnVsbCwgImxpc3RlbmVycyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfU2VydmxldHMoKSwgdGhpcy5nZXRTZXJ2bGV0KCksIG51bGwsICJzZXJ2bGV0cyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfU2VydmxldE1hcHBpbmdzKCksIHRoaXMuZ2V0U2VydmxldE1hcHBpbmcoKSwgbnVsbCwgInNlcnZsZXRNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfU2Vzc2lvbkNvbmZpZ3MoKSwgdGhpcy5nZXRTZXNzaW9uQ29uZmlnKCksIG51bGwsICJzZXNzaW9uQ29uZmlncyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfTWltZU1hcHBpbmdzKCksIHRoaXMuZ2V0TWltZU1hcHBpbmcoKSwgbnVsbCwgIm1pbWVNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfV2VsY29tZUZpbGVMaXN0cygpLCB0aGlzLmdldFdlbGNvbWVGaWxlTGlzdCgpLCBudWxsLCAid2VsY29tZUZpbGVMaXN0cyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfRXJyb3JQYWdlcygpLCB0aGlzLmdldEVycm9yUGFnZSgpLCBudWxsLCAiZXJyb3JQYWdlcyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfSnNwQ29uZmlncygpLCB0aGVKc3BQYWNrYWdlLmdldEpzcENvbmZpZygpLCBudWxsLCAianNwQ29uZmlncyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfU2VjdXJpdHlDb25zdHJhaW50cygpLCB0aGlzLmdldFNlY3VyaXR5Q29uc3RyYWludCgpLCBudWxsLCAic2VjdXJpdHlDb25zdHJhaW50cyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfTG9naW5Db25maWdzKCksIHRoaXMuZ2V0TG9naW5Db25maWcoKSwgbnVsbCwgImxvZ2luQ29uZmlncyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfU2VjdXJpdHlSb2xlcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfRW52RW50cmllcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldEVudkVudHJ5KCksIG51bGwsICJlbnZFbnRyaWVzIiwgbnVsbCwgMCwgLTEsIFdlYkZyYWdtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJGcmFnbWVudF9FamJSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0RWpiUmVmKCksIG51bGwsICJlamJSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkZyYWdtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJGcmFnbWVudF9FamJMb2NhbFJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRFamJMb2NhbFJlZigpLCBudWxsLCAiZWpiTG9jYWxSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkZyYWdtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJGcmFnbWVudF9TZXJ2aWNlUmVmcygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkZyYWdtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJGcmFnbWVudF9SZXNvdXJjZVJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkZyYWdtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJGcmFnbWVudF9SZXNvdXJjZUVudlJlZnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRSZXNvdXJjZUVudlJlZigpLCBudWxsLCAicmVzb3VyY2VFbnZSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkZyYWdtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJGcmFnbWVudF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkZyYWdtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJGcmFnbWVudF9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZUNvbnRleHRSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkZyYWdtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJGcmFnbWVudF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0UGVyc2lzdGVuY2VVbml0UmVmKCksIG51bGwsICJwZXJzaXN0ZW5jZVVuaXRSZWZzIiwgbnVsbCwgMCwgLTEsIFdlYkZyYWdtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJGcmFnbWVudF9Qb3N0Q29uc3RydWN0cygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldExpZmVjeWNsZUNhbGxiYWNrKCksIG51bGwsICJwb3N0Q29uc3RydWN0cyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfUHJlRGVzdHJveXMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXRMaWZlY3ljbGVDYWxsYmFjaygpLCBudWxsLCAicHJlRGVzdHJveXMiLCBudWxsLCAwLCAtMSwgV2ViRnJhZ21lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkZyYWdtZW50X0RhdGFTb3VyY2UoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREYXRhU291cmNlVHlwZSgpLCBudWxsLCAiZGF0YVNvdXJjZSIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpLCB0aGVKYXZhZWVQYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9ucyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKSwgdGhpcy5nZXRMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KCksIG51bGwsICJsb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cyIsIG51bGwsIDAsIC0xLCBXZWJGcmFnbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViRnJhZ21lbnRfT3JkZXJpbmcoKSwgdGhpcy5nZXRPcmRlcmluZ1R5cGUoKSwgbnVsbCwgIm9yZGVyaW5nIiwgbnVsbCwgMCwgLTEsIFdlYkZyYWdtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJGcmFnbWVudF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBXZWJGcmFnbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJGcmFnbWVudF9NZXRhZGF0YUNvbXBsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgIm1ldGFkYXRhQ29tcGxldGUiLCBudWxsLCAwLCAxLCBXZWJGcmFnbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJGcmFnbWVudF9WZXJzaW9uKCksIHRoaXMuZ2V0V2ViQXBwVmVyc2lvblR5cGUoKSwgInZlcnNpb24iLCBudWxsLCAxLCAxLCBXZWJGcmFnbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAiV2ViUmVzb3VyY2VDb2xsZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fV2ViUmVzb3VyY2VOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFRva2VuKCksICJ3ZWJSZXNvdXJjZU5hbWUiLCBudWxsLCAxLCAxLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbnMoKSwgdGhlSmF2YWVlUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VybFBhdHRlcm5zKCksIHRoZUphdmFlZVBhY2thZ2UuZ2V0VXJsUGF0dGVyblR5cGUoKSwgbnVsbCwgInVybFBhdHRlcm5zIiwgbnVsbCwgMSwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2RzKCksIHRoaXMuZ2V0SHR0cE1ldGhvZFR5cGUoKSwgImh0dHBNZXRob2RzIiwgbnVsbCwgMCwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kT21pc3Npb24oKSwgdGhpcy5nZXRIdHRwTWV0aG9kVHlwZSgpLCAiaHR0cE1ldGhvZE9taXNzaW9uIiwgbnVsbCwgMCwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJRCgpLCAiaWQiLCBudWxsLCAwLCAxLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyh3ZWxjb21lRmlsZUxpc3RFQ2xhc3MsIFdlbGNvbWVGaWxlTGlzdC5jbGFzcywgIldlbGNvbWVGaWxlTGlzdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2VsY29tZUZpbGVMaXN0X1dlbGNvbWVGaWxlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndlbGNvbWVGaWxlcyIsIG51bGwsIDEsIC0xLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWxjb21lRmlsZUxpc3RfSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SUQoKSwgImlkIiwgbnVsbCwgMCwgMSwgV2VsY29tZUZpbGVMaXN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCBJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCisJCQlpbml0RUVudW0oZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuY2xhc3MsICJEaXNwYXRjaGVyVHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuRk9SV0FSRF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5JTkNMVURFX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGRpc3BhdGNoZXJUeXBlRUVudW0sIERpc3BhdGNoZXJUeXBlLlJFUVVFU1RfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuQVNZTkNfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuRVJST1JfTElURVJBTCk7CisJCisJCQlpbml0RUVudW0obnVsbENoYXJUeXBlRUVudW0sIE51bGxDaGFyVHlwZS5jbGFzcywgIk51bGxDaGFyVHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwobnVsbENoYXJUeXBlRUVudW0sIE51bGxDaGFyVHlwZS5fX0xJVEVSQUwpOworCQorCQkJaW5pdEVFbnVtKHRyYWNraW5nTW9kZVR5cGVFRW51bSwgVHJhY2tpbmdNb2RlVHlwZS5jbGFzcywgIlRyYWNraW5nTW9kZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKHRyYWNraW5nTW9kZVR5cGVFRW51bSwgVHJhY2tpbmdNb2RlVHlwZS5DT09LSUUpOworCQkJYWRkRUVudW1MaXRlcmFsKHRyYWNraW5nTW9kZVR5cGVFRW51bSwgVHJhY2tpbmdNb2RlVHlwZS5VUkwpOworCQkJYWRkRUVudW1MaXRlcmFsKHRyYWNraW5nTW9kZVR5cGVFRW51bSwgVHJhY2tpbmdNb2RlVHlwZS5TU0wpOworCQorCQkJaW5pdEVFbnVtKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5jbGFzcywgIlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5OT05FX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVFRW51bSwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5JTlRFR1JBTF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuQ09ORklERU5USUFMX0xJVEVSQUwpOworCQorCQkJaW5pdEVFbnVtKHdlYkFwcFZlcnNpb25UeXBlRUVudW0sIFdlYkFwcFZlcnNpb25UeXBlLmNsYXNzLCAiV2ViQXBwVmVyc2lvblR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKHdlYkFwcFZlcnNpb25UeXBlRUVudW0sIFdlYkFwcFZlcnNpb25UeXBlLl8yNV9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbCh3ZWJBcHBWZXJzaW9uVHlwZUVFbnVtLCBXZWJBcHBWZXJzaW9uVHlwZS5fMzBfTElURVJBTCk7CisJCisJCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKKwkJCWluaXRFRGF0YVR5cGUoYXV0aE1ldGhvZFR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkF1dGhNZXRob2RUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVEYXRhVHlwZShkaXNwYXRjaGVyVHlwZU9iamVjdEVEYXRhVHlwZSwgRGlzcGF0Y2hlclR5cGUuY2xhc3MsICJEaXNwYXRjaGVyVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVEYXRhVHlwZShlbmNvZGluZ1R5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkVuY29kaW5nVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUoZXJyb3JDb2RlVHlwZUVEYXRhVHlwZSwgQmlnSW50ZWdlci5jbGFzcywgIkVycm9yQ29kZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGZpbHRlck5hbWVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJGaWx0ZXJOYW1lVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUoaHR0cE1ldGhvZFR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkh0dHBNZXRob2RUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVEYXRhVHlwZShsb2FkT25TdGFydHVwVHlwZUVEYXRhVHlwZSwgT2JqZWN0LmNsYXNzLCAiTG9hZE9uU3RhcnR1cFR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKGxvY2FsZVR5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIkxvY2FsZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKG1pbWVUeXBlVHlwZUVEYXRhVHlwZSwgU3RyaW5nLmNsYXNzLCAiTWltZVR5cGVUeXBlIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVEYXRhVHlwZShub25FbXB0eVN0cmluZ1R5cGVFRGF0YVR5cGUsIFN0cmluZy5jbGFzcywgIk5vbkVtcHR5U3RyaW5nVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUobnVsbENoYXJUeXBlT2JqZWN0RURhdGFUeXBlLCBOdWxsQ2hhclR5cGUuY2xhc3MsICJOdWxsQ2hhclR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUoc2VydmxldE5hbWVUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJTZXJ2bGV0TmFtZVR5cGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKHRyYWNraW5nTW9kZVR5cGVPYmplY3RFRGF0YVR5cGUsIFRyYWNraW5nTW9kZVR5cGUuY2xhc3MsICJUcmFja2luZ01vZGVUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKHRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3RFRGF0YVR5cGUsIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuY2xhc3MsICJUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0IiwgSVNfU0VSSUFMSVpBQkxFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RURhdGFUeXBlKHdhclBhdGhUeXBlRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsICJXYXJQYXRoVHlwZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFRGF0YVR5cGUod2ViQXBwVmVyc2lvblR5cGVPYmplY3RFRGF0YVR5cGUsIFdlYkFwcFZlcnNpb25UeXBlLmNsYXNzLCAiV2ViQXBwVmVyc2lvblR5cGVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCisJCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKKwkJCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQorCQkJY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiAJLyoqCkBAIC0yMTMzLDYgKzMxODEsMzggQEAKIAlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKSB7CiAJCVN0cmluZyBzb3VyY2UgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIjsgLy8kTk9OLU5MUy0xJAkJCQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChhYnNvbHV0ZU9yZGVyaW5nVHlwZUVDbGFzcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiYWJzb2x1dGVPcmRlcmluZ1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QWJzb2x1dGVPcmRlcmluZ1R5cGVfR3JvdXAoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZ3JvdXAiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRBYnNvbHV0ZU9yZGVyaW5nVHlwZV9OYW1lKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0QWJzb2x1dGVPcmRlcmluZ1R5cGVfT3RoZXJzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJvdGhlcnMiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KIAkJICAoYXV0aENvbnN0cmFpbnRFQ2xhc3MsIAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewpAQCAtMjE3MCwxMSArMzI1MCwxMzcgQEAKIAkJCSAiYmFzZVR5cGUiLCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3Rva2VuIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkJCiAJCWFkZEFubm90YXRpb24KKwkJICAoY29va2llQ29tbWVudFR5cGVFQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgImNvb2tpZS1jb21tZW50VHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgInNpbXBsZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29va2llQ29tbWVudFR5cGVfVmFsdWUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiOjAiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAia2luZCIsICJzaW1wbGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChjb29raWVDb25maWdUeXBlRUNsYXNzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJjb29raWUtY29uZmlnVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29va2llQ29uZmlnVHlwZV9OYW1lKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvb2tpZUNvbmZpZ1R5cGVfRG9tYWluKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJkb21haW4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29va2llQ29uZmlnVHlwZV9QYXRoKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJwYXRoIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvb2tpZUNvbmZpZ1R5cGVfQ29tbWVudCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiY29tbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRDb29raWVDb25maWdUeXBlX0h0dHBPbmx5KCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJodHRwLW9ubHkiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29va2llQ29uZmlnVHlwZV9TZWN1cmUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInNlY3VyZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRDb29raWVDb25maWdUeXBlX01heEFnZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibWF4LWFnZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvb2tpZUNvbmZpZ1R5cGVfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChjb29raWVEb21haW5UeXBlRUNsYXNzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJjb29raWUtZG9tYWluVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgInNpbXBsZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29va2llRG9tYWluVHlwZV9WYWx1ZSgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICI6MCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgInNpbXBsZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGNvb2tpZU5hbWVUeXBlRUNsYXNzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJjb29raWUtbmFtZVR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAia2luZCIsICJzaW1wbGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldENvb2tpZU5hbWVUeXBlX1ZhbHVlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgIjowIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImtpbmQiLCAic2ltcGxlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoY29va2llUGF0aFR5cGVFQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgImNvb2tpZS1wYXRoVHlwZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJraW5kIiwgInNpbXBsZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0Q29va2llUGF0aFR5cGVfVmFsdWUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiOjAiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAia2luZCIsICJzaW1wbGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgogCQkgIChkaXNwYXRjaGVyVHlwZUVFbnVtLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKIAkJCSAibmFtZSIsICJkaXNwYXRjaGVyVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCSAgIH0pOwkJCisJCSAgIH0pOwkJCQogCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGRpc3BhdGNoZXJUeXBlT2JqZWN0RURhdGFUeXBlLCAKIAkJICAgc291cmNlLCAKQEAgLTIyODQsNiArMzQ5MCwxNCBAQAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRGaWx0ZXJfQXN5bmNTdXBwb3J0ZWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImFzeW5jLXN1cHBvcnRlZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgogCQkgIChnZXRGaWx0ZXJfSW5pdFBhcmFtcygpLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKQEAgLTIzOTYsNyArMzYxMCw3IEBACiAJCSAgIG5ldyBTdHJpbmdbXSB7CiAJCQkgIm5hbWUiLCAiaHR0cC1tZXRob2RUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgImJhc2VUeXBlIiwgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSN0b2tlbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJICJwYXR0ZXJuIiwgIltcXHB7TH0tW1xccHtDY31cXHB7Wn1dXSsiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJwYXR0ZXJuIiwgIlshLX4tW1xcKFxcKTw+QCw7OlwiL1xcW1xcXT89XFx7XFx9XFxcXFxccHtafV1dKyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KIAkJICAobG9hZE9uU3RhcnR1cFR5cGVFRGF0YVR5cGUsIApAQCAtMjU0Miw2ICszNzU2LDQ1IEBACiAJCQkgInBhdHRlcm4iLCAiW15cXHB7Q2N9Xlxcc10rL1teXFxwe0NjfV5cXHNdKyIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCQogCQlhZGRBbm5vdGF0aW9uCisJCSAgKG11bHRpcGFydENvbmZpZ1R5cGVFQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgIm11bHRpcGFydC1jb25maWdUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRNdWx0aXBhcnRDb25maWdUeXBlX0xvY2F0aW9uKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJsb2NhdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRNdWx0aXBhcnRDb25maWdUeXBlX01heEZpbGVTaXplKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJtYXgtZmlsZS1zaXplIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldE11bHRpcGFydENvbmZpZ1R5cGVfTWF4UmVxdWVzdFNpemUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIm1heC1yZXF1ZXN0LXNpemUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZV9GaWxlU2l6ZVRocmVzaG9sZCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiZmlsZS1zaXplLXRocmVzaG9sZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgogCQkgIChub25FbXB0eVN0cmluZ1R5cGVFRGF0YVR5cGUsIAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewpAQCAtMjU2Myw2ICszODE2LDY2IEBACiAJCQkgImJhc2VUeXBlIiwgIm51bGwtY2hhclR5cGUiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQkKIAkJYWRkQW5ub3RhdGlvbgorCQkgIChvcmRlcmluZ09yZGVyaW5nVHlwZUVDbGFzcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAib3JkZXJpbmctb3JkZXJpbmdUeXBlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldE9yZGVyaW5nT3JkZXJpbmdUeXBlX05hbWUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIm5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRPcmRlcmluZ09yZGVyaW5nVHlwZV9PdGhlcnMoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIm90aGVycyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChvcmRlcmluZ090aGVyc1R5cGVFQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgIm9yZGVyaW5nLW90aGVyc1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAia2luZCIsICJlbXB0eSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0T3JkZXJpbmdPdGhlcnNUeXBlX0lkKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAob3JkZXJpbmdUeXBlRUNsYXNzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJvcmRlcmluZ1R5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0T3JkZXJpbmdUeXBlX0FmdGVyKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJhZnRlciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldE9yZGVyaW5nVHlwZV9CZWZvcmUoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImJlZm9yZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgogCQkgIChzZWN1cml0eUNvbnN0cmFpbnRFQ2xhc3MsIAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewpAQCAtMjY3OCw2ICszOTkxLDIyIEBACiAJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lIiwgImxvYWQtb24tc3RhcnR1cCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRTZXJ2bGV0X0VuYWJsZWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImVuYWJsZWQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0U2VydmxldF9Bc3luY1N1cHBvcnRlZCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiYXN5bmMtc3VwcG9ydGVkIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0U2VydmxldF9SdW5BcygpLCAKQEAgLTI2OTQsNiArNDAyMywxNCBAQAogCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAibmFtZSIsICJzZWN1cml0eS1yb2xlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRTZXJ2bGV0X011bHRpcGFydENvbmZpZygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibXVsdGlwYXJ0LWNvbmZpZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldFNlcnZsZXRfSWQoKSwgCkBAIC0yNzUzLDYgKzQwOTAsMjIgQEAKIAkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWUiLCAic2Vzc2lvbi10aW1lb3V0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFNlc3Npb25Db25maWdfQ29va2llQ29uZmlnKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJjb29raWUtY29uZmlnIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFNlc3Npb25Db25maWdfVHJhY2tpbmdNb2RlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJ0cmFja2luZy1tb2RlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0U2Vzc2lvbkNvbmZpZ19JZCgpLCAKQEAgLTI3NjIsNiArNDExNSwxOSBAQAogCQkJICJuYW1lIiwgImlkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkJCiAJCWFkZEFubm90YXRpb24KKwkJICAodHJhY2tpbmdNb2RlVHlwZUVFbnVtLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICJ0cmFja2luZy1tb2RlVHlwZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAodHJhY2tpbmdNb2RlVHlwZU9iamVjdEVEYXRhVHlwZSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAidHJhY2tpbmctbW9kZVR5cGU6T2JqZWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImJhc2VUeXBlIiwgInRyYWNraW5nLW1vZGVUeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkJCisJCWFkZEFubm90YXRpb24KIAkJICAodHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKQEAgLTI4MjUsNiArNDE5MSwxNSBAQAogCQkgICBuZXcgU3RyaW5nW10gewogCQkJICJraW5kIiwgImdyb3VwIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWUiLCAiZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYkFwcF9Nb2R1bGVOYW1lKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJtb2R1bGUtbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldFdlYkFwcF9EZXNjcmlwdGlvbnMoKSwgCkBAIC0zMDg4LDYgKzQ0NjMsMTUgQEAKIAkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYkFwcF9EYXRhU291cmNlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJkYXRhLXNvdXJjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgogCQkgIChnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpLCAKIAkJICAgc291cmNlLCAKIAkJICAgbmV3IFN0cmluZ1tdIHsKQEAgLTMwOTUsNyArNDQ3OSw3IEBACiAJCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgICB9KTsJCQorCQkgICB9KTsJCQkKIAkJYWRkQW5ub3RhdGlvbgogCQkgIChnZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKSwgCiAJCSAgIHNvdXJjZSwgCkBAIC0zMTA0LDYgKzQ0ODgsMTUgQEAKIAkJCSAibmFtZSIsICJsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYkFwcF9BYnNvbHV0ZU9yZGVyaW5nKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJhYnNvbHV0ZS1vcmRlcmluZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkgICB9KTsJCQogCQlhZGRBbm5vdGF0aW9uCiAJCSAgKGdldFdlYkFwcF9JZCgpLCAKQEAgLTMxNTMsNyArNDU0Niw3IEBACiAJCSAgIG5ldyBTdHJpbmdbXSB7CiAJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWUiLCAieHNpOnNjaGVtYUxvY2F0aW9uIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkJCisJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfV2ViQXBwKCksIAogCQkgICBzb3VyY2UsIApAQCAtMzE3Niw2ICs0NTY5LDM0NyBAQAogCQkJICJiYXNlVHlwZSIsICJ3ZWItYXBwLXZlcnNpb25UeXBlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJICAgfSk7CQkJCiAJCWFkZEFubm90YXRpb24KKwkJICAod2ViRnJhZ21lbnRFQ2xhc3MsIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJuYW1lIiwgIndlYi1mcmFnbWVudFR5cGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAia2luZCIsICJlbGVtZW50T25seSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfR3JvdXAoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZ3JvdXAiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9OYW1lKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfRGVzY3JpcHRpb25zKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJkZXNjcmlwdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9EaXNwbGF5TmFtZXMoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImRpc3BsYXktbmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9JY29ucygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWNvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9EaXN0cmlidXRhYmxlcygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiZGlzdHJpYnV0YWJsZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9Db250ZXh0UGFyYW1zKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJjb250ZXh0LXBhcmFtIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfRmlsdGVycygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiZmlsdGVyIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfRmlsdGVyTWFwcGluZ3MoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImZpbHRlci1tYXBwaW5nIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfTGlzdGVuZXJzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJsaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYkZyYWdtZW50X1NlcnZsZXRzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJzZXJ2bGV0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfU2VydmxldE1hcHBpbmdzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJzZXJ2bGV0LW1hcHBpbmciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9TZXNzaW9uQ29uZmlncygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAic2Vzc2lvbi1jb25maWciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9NaW1lTWFwcGluZ3MoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIm1pbWUtbWFwcGluZyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYkZyYWdtZW50X1dlbGNvbWVGaWxlTGlzdHMoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIndlbGNvbWUtZmlsZS1saXN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfRXJyb3JQYWdlcygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiZXJyb3ItcGFnZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYkZyYWdtZW50X0pzcENvbmZpZ3MoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImpzcC1jb25maWciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9TZWN1cml0eUNvbnN0cmFpbnRzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJzZWN1cml0eS1jb25zdHJhaW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfTG9naW5Db25maWdzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJsb2dpbi1jb25maWciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9TZWN1cml0eVJvbGVzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJzZWN1cml0eS1yb2xlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfRW52RW50cmllcygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiZW52LWVudHJ5IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYkZyYWdtZW50X0VqYlJlZnMoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImVqYi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfRWpiTG9jYWxSZWZzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJlamItbG9jYWwtcmVmIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYkZyYWdtZW50X1NlcnZpY2VSZWZzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJzZXJ2aWNlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9SZXNvdXJjZVJlZnMoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInJlc291cmNlLXJlZiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9SZXNvdXJjZUVudlJlZnMoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInJlc291cmNlLWVudi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAibWVzc2FnZS1kZXN0aW5hdGlvbi1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtY29udGV4dC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfUGVyc2lzdGVuY2VVbml0UmVmcygpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAicGVyc2lzdGVuY2UtdW5pdC1yZWYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZXNwYWNlIiwgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfUG9zdENvbnN0cnVjdHMoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInBvc3QtY29uc3RydWN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAiZ3JvdXAiLCAiI2dyb3VwOjAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYkZyYWdtZW50X1ByZURlc3Ryb3lzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJwcmUtZGVzdHJveSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9EYXRhU291cmNlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJkYXRhLXNvdXJjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImdyb3VwIiwgIiNncm91cDowIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJtZXNzYWdlLWRlc3RpbmF0aW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYkZyYWdtZW50X0xvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfT3JkZXJpbmcoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIm9yZGVyaW5nIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJncm91cCIsICIjZ3JvdXA6MCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViRnJhZ21lbnRfSWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiaWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9NZXRhZGF0YUNvbXBsZXRlKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIm1ldGFkYXRhLWNvbXBsZXRlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJGcmFnbWVudF9WZXJzaW9uKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInZlcnNpb24iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgogCQkgICh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIAogCQkgICBzb3VyY2UsIAogCQkgICBuZXcgU3RyaW5nW10gewpAQCAtMzIwNSw3ICs0OTM5LDcgQEAKIAkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWUiLCAidXJsLXBhdHRlcm4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJICAgfSk7CQkKKwkJICAgfSk7CQkJCiAJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2RzKCksIAogCQkgICBzb3VyY2UsIApAQCAtMzIxMyw2ICs0OTQ3LDE0IEBACiAJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJICJuYW1lIiwgImh0dHAtbWV0aG9kIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kT21pc3Npb24oKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgImh0dHAtbWV0aG9kLW9taXNzaW9uIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCSAgIH0pOwkJCiAJCWFkZEFubm90YXRpb24KIAkJICAoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0lkKCksIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYlJlc291cmNlQ29sbGVjdGlvbkltcGwuamF2YQppbmRleCBmNWE1MDY1Li5jYWVlYTg5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYlJlc291cmNlQ29sbGVjdGlvbkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlYlJlc291cmNlQ29sbGVjdGlvbkltcGwuamF2YQpAQCAtNDYsNiArNDYsNyBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCNnZXREZXNjcmlwdGlvbnMgPGVtPkRlc2NyaXB0aW9uczwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsI2dldFVybFBhdHRlcm5zIDxlbT5VcmwgUGF0dGVybnM8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCNnZXRIdHRwTWV0aG9kcyA8ZW0+SHR0cCBNZXRob2RzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlJlc291cmNlQ29sbGVjdGlvbkltcGwjZ2V0SHR0cE1ldGhvZE9taXNzaW9uIDxlbT5IdHRwIE1ldGhvZCBPbWlzc2lvbjwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICogPC9wPgpAQCAtODEsNyArODIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBkZXNjcmlwdGlvbnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb25zOwogCiAJLyoqCiAJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJsUGF0dGVybnMoKSA8ZW0+VXJsIFBhdHRlcm5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTkxLDcgKzkyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdXJsUGF0dGVybnMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxVcmxQYXR0ZXJuVHlwZT4gdXJsUGF0dGVybnM7CiAKIAkvKioKIAkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIdHRwTWV0aG9kcygpIDxlbT5IdHRwIE1ldGhvZHM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgpAQCAtMTAxLDcgKzEwMiwxNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCBodHRwTWV0aG9kcyA9IG51bGw7CisJcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gaHR0cE1ldGhvZHM7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIdHRwTWV0aG9kT21pc3Npb24oKSA8ZW0+SHR0cCBNZXRob2QgT21pc3Npb248L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SHR0cE1ldGhvZE9taXNzaW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBodHRwTWV0aG9kT21pc3Npb247CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTEzNyw2ICsxNDgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VCX1JFU09VUkNFX0NPTExFQ1RJT047CiAJfQpAQCAtMTY3LDkgKzE3OSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBMaXN0IGdldERlc2NyaXB0aW9ucygpIHsKKwlwdWJsaWMgTGlzdDxEZXNjcmlwdGlvbj4gZ2V0RGVzY3JpcHRpb25zKCkgewogCQlpZiAoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChEZXNjcmlwdGlvbi5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fREVTQ1JJUFRJT05TKTsKKwkJCWRlc2NyaXB0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxEZXNjcmlwdGlvbj4oRGVzY3JpcHRpb24uY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0RFU0NSSVBUSU9OUyk7CiAJCX0KIAkJcmV0dXJuIGRlc2NyaXB0aW9uczsKIAl9CkBAIC0xNzksOSArMTkxLDkgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIExpc3QgZ2V0VXJsUGF0dGVybnMoKSB7CisJcHVibGljIExpc3Q8VXJsUGF0dGVyblR5cGU+IGdldFVybFBhdHRlcm5zKCkgewogCQlpZiAodXJsUGF0dGVybnMgPT0gbnVsbCkgewotCQkJdXJsUGF0dGVybnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVXJsUGF0dGVyblR5cGUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOUyk7CisJCQl1cmxQYXR0ZXJucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxVcmxQYXR0ZXJuVHlwZT4oVXJsUGF0dGVyblR5cGUuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOUyk7CiAJCX0KIAkJcmV0dXJuIHVybFBhdHRlcm5zOwogCX0KQEAgLTE5MSw5ICsyMDMsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRIdHRwTWV0aG9kcygpIHsKKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEh0dHBNZXRob2RzKCkgewogCQlpZiAoaHR0cE1ldGhvZHMgPT0gbnVsbCkgewotCQkJaHR0cE1ldGhvZHMgPSBuZXcgRURhdGFUeXBlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRFMpOworCQkJaHR0cE1ldGhvZHMgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EUyk7CiAJCX0KIAkJcmV0dXJuIGh0dHBNZXRob2RzOwogCX0KQEAgLTIwMyw2ICsyMTUsMTggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRIdHRwTWV0aG9kT21pc3Npb24oKSB7CisJCWlmIChodHRwTWV0aG9kT21pc3Npb24gPT0gbnVsbCkgeworCQkJaHR0cE1ldGhvZE9taXNzaW9uID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRF9PTUlTU0lPTik7CisJCX0KKwkJcmV0dXJuIGh0dHBNZXRob2RPbWlzc2lvbjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldElkKCkgewogCQlyZXR1cm4gaWQ7CiAJfQpAQCAtMjI0LDEyICsyNDgsMTMgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXREZXNjcmlwdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RGVzY3JpcHRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fVVJMX1BBVFRFUk5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VXJsUGF0dGVybnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VXJsUGF0dGVybnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwogCQl9CiAJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKIAl9CkBAIC0yMzksNiArMjY0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRToKQEAgLTI0OSw2ICsyNzUsOCBAQAogCQkJCXJldHVybiBnZXRVcmxQYXR0ZXJucygpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRFM6CiAJCQkJcmV0dXJuIGdldEh0dHBNZXRob2RzKCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EX09NSVNTSU9OOgorCQkJCXJldHVybiBnZXRIdHRwTWV0aG9kT21pc3Npb24oKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSUQ6CiAJCQkJcmV0dXJuIGdldElkKCk7CiAJCX0KQEAgLTI2MCw2ICsyODgsOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRToKQEAgLTI2NywxNSArMjk3LDE5IEBACiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19ERVNDUklQVElPTlM6CiAJCQkJZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXREZXNjcmlwdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVzY3JpcHRpb24+KW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1VSTF9QQVRURVJOUzoKIAkJCQlnZXRVcmxQYXR0ZXJucygpLmNsZWFyKCk7Ci0JCQkJZ2V0VXJsUGF0dGVybnMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFVybFBhdHRlcm5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBVcmxQYXR0ZXJuVHlwZT4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RTOgogCQkJCWdldEh0dHBNZXRob2RzKCkuY2xlYXIoKTsKLQkJCQlnZXRIdHRwTWV0aG9kcygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7CisJCQkJZ2V0SHR0cE1ldGhvZHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RfT01JU1NJT046CisJCQkJZ2V0SHR0cE1ldGhvZE9taXNzaW9uKCkuY2xlYXIoKTsKKwkJCQlnZXRIdHRwTWV0aG9kT21pc3Npb24oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwogCQkJCXJldHVybjsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSUQ6CiAJCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7CkBAIC0yODksNiArMzIzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUU6CkBAIC0zMDMsNiArMzM4LDkgQEAKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RTOgogCQkJCWdldEh0dHBNZXRob2RzKCkuY2xlYXIoKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EX09NSVNTSU9OOgorCQkJCWdldEh0dHBNZXRob2RPbWlzc2lvbigpLmNsZWFyKCk7CisJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19JRDoKIAkJCQlzZXRJZChJRF9FREVGQVVMVCk7CiAJCQkJcmV0dXJuOwpAQCAtMzE1LDYgKzM1Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FOgpAQCAtMzI1LDYgKzM2NCw4IEBACiAJCQkJcmV0dXJuIHVybFBhdHRlcm5zICE9IG51bGwgJiYgIXVybFBhdHRlcm5zLmlzRW1wdHkoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RTOgogCQkJCXJldHVybiBodHRwTWV0aG9kcyAhPSBudWxsICYmICFodHRwTWV0aG9kcy5pc0VtcHR5KCk7CisJCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0hUVFBfTUVUSE9EX09NSVNTSU9OOgorCQkJCXJldHVybiBodHRwTWV0aG9kT21pc3Npb24gIT0gbnVsbCAmJiAhaHR0cE1ldGhvZE9taXNzaW9uLmlzRW1wdHkoKTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSUQ6CiAJCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7CiAJCX0KQEAgLTMzNiw2ICszNzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKQEAgLTM0NCw2ICszODYsOCBAQAogCQlyZXN1bHQuYXBwZW5kKHdlYlJlc291cmNlTmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoIiwgaHR0cE1ldGhvZHM6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoaHR0cE1ldGhvZHMpOworCQlyZXN1bHQuYXBwZW5kKCIsIGh0dHBNZXRob2RPbWlzc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChodHRwTWV0aG9kT21pc3Npb24pOwogCQlyZXN1bHQuYXBwZW5kKCIsIGlkOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGlkKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvaW1wbC9XZWxjb21lRmlsZUxpc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlTGlzdEltcGwuamF2YQppbmRleCA0NTE4Yjk3Li5hODU2MTE1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlTGlzdEltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlTGlzdEltcGwuamF2YQpAQCAtNTEsNyArNTEsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3ZWxjb21lRmlsZXMgPSBudWxsOworCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHdlbGNvbWVGaWxlczsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgpAQCAtODcsNiArODcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYlBhY2thZ2UuTGl0ZXJhbHMuV0VMQ09NRV9GSUxFX0xJU1Q7CiAJfQpAQCAtOTYsOSArOTcsOSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXZWxjb21lRmlsZXMoKSB7CisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRXZWxjb21lRmlsZXMoKSB7CiAJCWlmICh3ZWxjb21lRmlsZXMgPT0gbnVsbCkgewotCQkJd2VsY29tZUZpbGVzID0gbmV3IEVEYXRhVHlwZUVMaXN0KFN0cmluZy5jbGFzcywgdGhpcywgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VMQ09NRV9GSUxFUyk7CisJCQl3ZWxjb21lRmlsZXMgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFdlYlBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFTENPTUVfRklMRVMpOwogCQl9CiAJCXJldHVybiB3ZWxjb21lRmlsZXM7CiAJfQpAQCAtMTI5LDYgKzEzMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VMQ09NRV9GSUxFUzoKQEAgLTE0NCwxMSArMTQ2LDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFTENPTUVfRklMRVM6CiAJCQkJZ2V0V2VsY29tZUZpbGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRXZWxjb21lRmlsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOworCQkJCWdldFdlbGNvbWVGaWxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19JRDoKIAkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKQEAgLTE2Miw2ICsxNjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJQYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUxDT01FX0ZJTEVTOgpAQCAtMTc5LDYgKzE4NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFTENPTUVfRklMRVM6CkBAIC0xOTQsNiArMjAwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9tZXRhZGF0YS9XZWJQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC9tZXRhZGF0YS9XZWJQYWNrYWdlLmphdmEKaW5kZXggZmVkMWE0YS4uMmVjMTg0MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvbWV0YWRhdGEvV2ViUGFja2FnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL21ldGFkYXRhL1dlYlBhY2thZ2UuamF2YQpAQCAtMzEsMzExICszMSwyNTUgQEAKICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAgKiAKLSAqICAgICAgIEAoIyl3ZWItYXBwXzJfNS54c2RzCTEuNjIgMDUvMDgvMDYKLSAqICAgICAKICAqIAotICogCi0gKiAgICAgICBDb3B5cmlnaHQgMjAwMy0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqICAgICAgIDQxNTAgTmV0d29yayBDaXJjbGUKLSAqICAgICAgIFNhbnRhIENsYXJhLCBDYWxpZm9ybmlhIDk1MDU0Ci0gKiAgICAgICBVLlMuQQotICogICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIAotICogICAgICAgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBoYXMgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cwotICogICAgICAgcmVsYXRpbmcgdG8gdGVjaG5vbG9neSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gSW4KLSAqICAgICAgIHBhcnRpY3VsYXIsIGFuZCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZXNlIGludGVsbGVjdHVhbAotICogICAgICAgcHJvcGVydHkgcmlnaHRzIG1heSBpbmNsdWRlIG9uZSBvciBtb3JlIG9mIHRoZSBVLlMuIHBhdGVudHMKLSAqICAgICAgIGxpc3RlZCBhdCBodHRwOi8vd3d3LnN1bi5jb20vcGF0ZW50cyBhbmQgb25lIG9yIG1vcmUKLSAqICAgICAgIGFkZGl0aW9uYWwgcGF0ZW50cyBvciBwZW5kaW5nIHBhdGVudCBhcHBsaWNhdGlvbnMgaW4gdGhlCi0gKiAgICAgICBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIFRoaXMgZG9jdW1lbnQgYW5kIHRoZSB0ZWNobm9sb2d5IHdoaWNoIGl0IGRlc2NyaWJlcyBhcmUKLSAqICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2VzIHJlc3RyaWN0aW5nIHRoZWlyIHVzZSwgY29weWluZywKLSAqICAgICAgIGRpc3RyaWJ1dGlvbiwgYW5kIGRlY29tcGlsYXRpb24uIE5vIHBhcnQgb2YgdGhpcyBkb2N1bWVudAotICogICAgICAgbWF5IGJlIHJlcHJvZHVjZWQgaW4gYW55IGZvcm0gYnkgYW55IG1lYW5zIHdpdGhvdXQgcHJpb3IKLSAqICAgICAgIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiBTdW4gYW5kIGl0cyBsaWNlbnNvcnMsIGlmIGFueS4KLSAqIAotICogICAgICAgVGhpcmQtcGFydHkgc29mdHdhcmUsIGluY2x1ZGluZyBmb250IHRlY2hub2xvZ3ksIGlzCi0gKiAgICAgICBjb3B5cmlnaHRlZCBhbmQgbGljZW5zZWQgZnJvbSBTdW4gc3VwcGxpZXJzLgotICogCi0gKiAgICAgICBTdW4sIFN1biBNaWNyb3N5c3RlbXMsIHRoZSBTdW4gbG9nbywgU29sYXJpcywgSmF2YSwgSjJFRSwKLSAqICAgICAgIEphdmFTZXJ2ZXIgUGFnZXMsIEVudGVycHJpc2UgSmF2YUJlYW5zIGFuZCB0aGUgSmF2YSBDb2ZmZWUKLSAqICAgICAgIEN1cCBsb2dvIGFyZSB0cmFkZW1hcmtzIG9yIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiBTdW4KLSAqICAgICAgIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBGZWRlcmFsIEFjcXVpc2l0aW9uczogQ29tbWVyY2lhbCBTb2Z0d2FyZSAtIEdvdmVybm1lbnQgVXNlcnMKLSAqICAgICAgIFN1YmplY3QgdG8gU3RhbmRhcmQgTGljZW5zZSBUZXJtcyBhbmQgQ29uZGl0aW9ucy4KLSAqIAotICogICAgIAotICogCisgKiAgICAgICAkSWQ6IFdlYlBhY2thZ2UuamF2YSx2IDEuNiAyMDEwLzA1LzE5IDE5OjUzOjEwIGNhbmRlcnNvbiBFeHAgJAogICogICAgICAgCisgKiAgICAgCiAgKiAKLSAqIAlUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgU2VydmxldCAyLjUgZGVwbG95bWVudCBkZXNjcmlwdG9yLgotICogCVRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbXVzdCBiZSBuYW1lZCAiV0VCLUlORi93ZWIueG1sIiBpbiB0aGUKLSAqIAl3ZWIgYXBwbGljYXRpb24ncyB3YXIgZmlsZS4gIEFsbCBTZXJ2bGV0IGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKLSAqIAltdXN0IGluZGljYXRlIHRoZSB3ZWIgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFCi0gKiAJbmFtZXNwYWNlOgotICogCi0gKiAJaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlCi0gKiAKLSAqIAlhbmQgYnkgaW5kaWNhdGluZyB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5Ci0gKiAJdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLSAqIAotICogCSAgICAmbHQ7d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICogCSAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gKiAJICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCi0gKiAJICAgICAgdmVyc2lvbj0iMi41IiZndDsKLSAqIAkgICAgICAuLi4KLSAqIAkgICAgJmx0Oy93ZWItYXBwJmd0OwotICogCi0gKiAJVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCi0gKiAJdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQotICogCW5hbWVzcGFjZSB3aXRoIHRoZSBmb2xsb3dpbmcgbG9jYXRpb246Ci0gKiAKLSAqIAlodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkCi0gKiAKLSAqIAkKKyAqIDwhW0NEQVRBW1sKKyAqICAgICAgIFRoaXMgaXMgdGhlIGNvbW1vbiBYTUwgU2NoZW1hIGZvciB0aGUgU2VydmxldCAzLjAgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICogICAgICAgVGhpcyBmaWxlIGlzIGluIHR1cm4gdXNlZCBieSB3ZWIueG1sIGFuZCB3ZWItZnJhZ21lbnQueG1sCisgKiAgICAgICB3ZWIgYXBwbGljYXRpb24ncyB3YXIgZmlsZS4gIEFsbCBTZXJ2bGV0IGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKKyAqICAgICAgIG11c3QgaW5kaWNhdGUgdGhlIHdlYiBjb21tb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFCisgKiAgICAgICBuYW1lc3BhY2U6CisgKiAgICAgICAKKyAqICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSAKKyAqICAgICAgIAorICogICAgICAgYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSAKKyAqICAgICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6IAorICogICAgICAgCisgKiAgICAgICA8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICogICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAqICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgorICogICAgICAgdmVyc2lvbj0iMy4wIj4gCisgKiAgICAgICAuLi4KKyAqICAgICAgIDwvd2ViLWFwcD4KKyAqICAgICAgIAorICogICAgICAgVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCisgKiAgICAgICB0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKYXZhIEVFCisgKiAgICAgICBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgorICogICAgICAgCisgKiAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWNvbW1vbl8zXzAueHNkCisgKiAgICAgICAKKyAqIF1dPgogICogICAgIAogICogCiAgKiAKICAqICAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKICAqICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KLSAqIAorICogICAgICAgCiAgKiAgICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCi0gKiAJc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKLSAqIAlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKLSAqIAl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCi0gKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKLSAqIAlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQotICogCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQotICogCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgotICogCi0gKiAgICAgCi0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfNS54c2RzCTEuNjUgMDYvMDIvMTcKKyAqICAgICAgIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90CisgKiAgICAgICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKKyAqICAgICAgIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKKyAqICAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCisgKiAgICAgICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQorICogICAgICAgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCisgKiAgICAgICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KKyAqICAgICAgIAogICogICAgIAogICogCiAgKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCisgKiAgICAgICAkSWQ6IFdlYlBhY2thZ2UuamF2YSx2IDEuNiAyMDEwLzA1LzE5IDE5OjUzOjEwIGNhbmRlcnNvbiBFeHAgJAorICogICAgICAgCiAgKiAgICAgCiAgKiAKICAqIAotICogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyB0aGF0IGFwcGVhciBpbiB0aGUgY29tbW9uCi0gKiBzaGFyZWFibGUgc2NoZW1hKHMpIG9mIEoyRUUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLSAqIGludGVycHJldGVkIHdpdGggcmVzcGVjdCB0byB0aGUgY29udGV4dCB0aGV5IGFyZSBpbmNsdWRlZDoKLSAqIAotICogRGVwbG95bWVudCBDb21wb25lbnQgbWF5IGluZGljYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICogICAgIGoyZWUgYXBwbGljYXRpb247Ci0gKiAgICAgYXBwbGljYXRpb24gY2xpZW50OwotICogICAgIHdlYiBhcHBsaWNhdGlvbjsKLSAqICAgICBlbnRlcnByaXNlIGJlYW47Ci0gKiAgICAgcmVzb3VyY2UgYWRhcHRlcjsKLSAqIAotICogRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAqICAgICBlYXIgZmlsZTsKLSAqICAgICB3YXIgZmlsZTsKLSAqICAgICBqYXIgZmlsZTsKLSAqICAgICByYXIgZmlsZTsKLSAqIAotICogCi0gKiAKLSAqICAgICAgIEAoIylqYXZhZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzIueHNkcwkxLjE5IDAyLzEzLzA2CisgKiAgICAgICBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KKyAqICAgICAgIHNoYXJlYWJsZSBzY2hlbWEocykgb2YgSmF2YSBFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQorICogICAgICAgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgorICogICAgICAgCisgKiAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICBqYXZhIGVlIGFwcGxpY2F0aW9uOworICogICAgICAgYXBwbGljYXRpb24gY2xpZW50OworICogICAgICAgd2ViIGFwcGxpY2F0aW9uOworICogICAgICAgZW50ZXJwcmlzZSBiZWFuOworICogICAgICAgcmVzb3VyY2UgYWRhcHRlcjsgCisgKiAgICAgICAKKyAqICAgICAgIERlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICBlYXIgZmlsZTsKKyAqICAgICAgIHdhciBmaWxlOworICogICAgICAgamFyIGZpbGU7CisgKiAgICAgICByYXIgZmlsZTsKKyAqICAgICAgIAogICogICAgIAogICogCiAgKiAKLSAqICAgICAgIENvcHlyaWdodCAyMDAzLTIwMDYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgotICogICAgICAgNDE1MCBOZXR3b3JrIENpcmNsZQotICogICAgICAgU2FudGEgQ2xhcmEsIENhbGlmb3JuaWEgOTUwNTQKLSAqICAgICAgIFUuUy5BCi0gKiAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiAgICAgICBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGhhcyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCi0gKiAgICAgICByZWxhdGluZyB0byB0ZWNobm9sb2d5IGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50LiBJbgotICogICAgICAgcGFydGljdWxhciwgYW5kIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlc2UgaW50ZWxsZWN0dWFsCi0gKiAgICAgICBwcm9wZXJ0eSByaWdodHMgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgb2YgdGhlIFUuUy4gcGF0ZW50cwotICogICAgICAgbGlzdGVkIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9wYXRlbnRzIGFuZCBvbmUgb3IgbW9yZQotICogICAgICAgYWRkaXRpb25hbCBwYXRlbnRzIG9yIHBlbmRpbmcgcGF0ZW50IGFwcGxpY2F0aW9ucyBpbiB0aGUKLSAqICAgICAgIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgVGhpcyBkb2N1bWVudCBhbmQgdGhlIHRlY2hub2xvZ3kgd2hpY2ggaXQgZGVzY3JpYmVzIGFyZQotICogICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZXMgcmVzdHJpY3RpbmcgdGhlaXIgdXNlLCBjb3B5aW5nLAotICogICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgZGVjb21waWxhdGlvbi4gTm8gcGFydCBvZiB0aGlzIGRvY3VtZW50Ci0gKiAgICAgICBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBieSBhbnkgbWVhbnMgd2l0aG91dCBwcmlvcgotICogICAgICAgd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIFN1biBhbmQgaXRzIGxpY2Vuc29ycywgaWYgYW55LgotICogCi0gKiAgICAgICBUaGlyZC1wYXJ0eSBzb2Z0d2FyZSwgaW5jbHVkaW5nIGZvbnQgdGVjaG5vbG9neSwgaXMKLSAqICAgICAgIGNvcHlyaWdodGVkIGFuZCBsaWNlbnNlZCBmcm9tIFN1biBzdXBwbGllcnMuCi0gKiAKLSAqICAgICAgIFN1biwgU3VuIE1pY3Jvc3lzdGVtcywgdGhlIFN1biBsb2dvLCBTb2xhcmlzLCBKYXZhLCBKMkVFLAotICogICAgICAgSmF2YVNlcnZlciBQYWdlcywgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYW5kIHRoZSBKYXZhIENvZmZlZQotICogICAgICAgQ3VwIGxvZ28gYXJlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIFN1bgotICogICAgICAgTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVLlMuIGFuZCBvdGhlciBjb3VudHJpZXMuCi0gKiAKLSAqICAgICAgIEZlZGVyYWwgQWNxdWlzaXRpb25zOiBDb21tZXJjaWFsIFNvZnR3YXJlIC0gR292ZXJubWVudCBVc2VycwotICogICAgICAgU3ViamVjdCB0byBTdGFuZGFyZCBMaWNlbnNlIFRlcm1zIGFuZCBDb25kaXRpb25zLgotICogCisgKiAgICAgICAkSWQ6IFdlYlBhY2thZ2UuamF2YSx2IDEuNiAyMDEwLzA1LzE5IDE5OjUzOjEwIGNhbmRlcnNvbiBFeHAgJAorICogICAgICAgCiAgKiAgICAgCiAgKiAKICAqIAogICogICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKLSAqIAorICogICAgICAgCiAgKiAgICAgCiAgKiAKLSAqICAgIFNlZSBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCBhbmQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbmFtZXNwYWNlLgorICogICAgPGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgKiAgICAgPGgxPkFib3V0IHRoZSBYTUwgbmFtZXNwYWNlPC9oMT4KICAqIAotICogICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCi0gKiAgICAgc3VpdGFibGUgZm9yIGltcG9ydCBieSBvdGhlciBzY2hlbWEgZG9jdW1lbnRzLiAgCi0gKiAKLSAqICAgICBOb3RlIHRoYXQgbG9jYWwgbmFtZXMgaW4gdGhpcyBuYW1lc3BhY2UgYXJlIGludGVuZGVkIHRvIGJlIGRlZmluZWQKLSAqICAgICBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuICBUaGUKLSAqICAgICBmb2xsb3dpbmcgbmFtZXMgYXJlIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFuZCBzaG91bGQKLSAqICAgICBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZyBHcm91cCwKLSAqICAgICBzcGVjaWZpY2F0aW9uLCBvciBkb2N1bWVudCBpbnN0YW5jZToKLSAqIAotICogICAgIGJhc2UgKGFzIGFuIGF0dHJpYnV0ZSBuYW1lKTogZGVub3RlcyBhbiBhdHRyaWJ1dGUgd2hvc2UgdmFsdWUKLSAqICAgICAgICAgIHByb3ZpZGVzIGEgVVJJIHRvIGJlIHVzZWQgYXMgdGhlIGJhc2UgZm9yIGludGVycHJldGluZyBhbnkKLSAqICAgICAgICAgIHJlbGF0aXZlIFVSSXMgaW4gdGhlIHNjb3BlIG9mIHRoZSBlbGVtZW50IG9uIHdoaWNoIGl0Ci0gKiAgICAgICAgICBhcHBlYXJzOyBpdHMgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkCi0gKiAgICAgICAgICBieSB2aXJ0dWUgb2YgaXRzIGRlZmluaXRpb24gaW4gdGhlIFhNTCBCYXNlIHNwZWNpZmljYXRpb24uCi0gKiAKLSAqICAgICBpZCAgIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCi0gKiAgICAgICAgICBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSBJRC4KLSAqICAgICAgICAgIFRoZSB4bWw6aWQgc3BlY2lmaWNhdGlvbiBpcyBub3QgeWV0IGEgVzNDIFJlY29tbWVuZGF0aW9uLAotICogICAgICAgICAgYnV0IHRoaXMgYXR0cmlidXRlIGlzIGluY2x1ZGVkIGhlcmUgdG8gZmFjaWxpdGF0ZSBleHBlcmltZW50YXRpb24KLSAqICAgICAgICAgIHdpdGggdGhlIG1lY2hhbmlzbXMgaXQgcHJvcG9zZXMuICBOb3RlIHRoYXQgaXQgaXMgX25vdF8gaW5jbHVkZWQKLSAqICAgICAgICAgIGluIHRoZSBzcGVjaWFsQXR0cnMgYXR0cmlidXRlIGdyb3VwLgotICogCi0gKiAgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQotICogICAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgotICogICAgICAgICAgYW55IGVsZW1lbnQ7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKLSAqICAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCi0gKiAgIAotICogICAgIHNwYWNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlCi0gKiAgICAgICAgICB2YWx1ZSBpcyBhIGtleXdvcmQgaW5kaWNhdGluZyB3aGF0IHdoaXRlc3BhY2UgcHJvY2Vzc2luZwotICogICAgICAgICAgZGlzY2lwbGluZSBpcyBpbnRlbmRlZCBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQ7IGl0cwotICogICAgICAgICAgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IHZpcnR1ZSBvZiBpdHMKLSAqICAgICAgICAgIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLgotICogCi0gKiAgICAgRmF0aGVyIChpbiBhbnkgY29udGV4dCBhdCBhbGwpOiBkZW5vdGVzIEpvbiBCb3NhaywgdGhlIGNoYWlyIG9mIAotICogICAgICAgICAgdGhlIG9yaWdpbmFsIFhNTCBXb3JraW5nIEdyb3VwLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IAotICogICAgICAgICAgdGhlIGZvbGxvd2luZyBkZWNpc2lvbiBvZiB0aGUgVzNDIFhNTCBQbGVuYXJ5IGFuZCAKLSAqICAgICAgICAgIFhNTCBDb29yZGluYXRpb24gZ3JvdXBzOgotICogCi0gKiAgICAgICAgICAgICAgSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZCBkZWRpY2F0aW9uCi0gKiAgICAgICAgICAgICAgdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mIEZlYnJ1YXJ5LCAyMDAwCi0gKiAgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZQotICogICAgICAgICAgICAgIHhtbDpGYXRoZXIKLSAqICAgCi0gKiBUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAotICogICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5Ci0gKiAgICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcsIHhtbDpzcGFjZSBvciB4bWw6aWQKLSAqICAgICAgICAgYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KLSAqIAotICogICAgICAgICBUbyBlbmFibGUgdGhpcywgc3VjaCBhIHNjaGVtYSBtdXN0IGltcG9ydCB0aGlzIHNjaGVtYQotICogICAgICAgICBmb3IgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKLSAqICAgICAgICAgJmx0O3NjaGVtYSAuIC4gLiZndDsKLSAqICAgICAgICAgIC4gLiAuCi0gKiAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgotICogICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8mZ3Q7Ci0gKiAKLSAqICAgICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcwotICogICAgICAgICBvciB0aGUgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCi0gKiAKLSAqICAgICAgICAgJmx0O3R5cGUgLiAuIC4mZ3Q7Ci0gKiAgICAgICAgICAuIC4gLgotICogICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvJmd0OwotICogIAotICogICAgICAgICAgd2lsbCBkZWZpbmUgYSB0eXBlIHdoaWNoIHdpbGwgc2NoZW1hLXZhbGlkYXRlIGFuIGluc3RhbmNlCi0gKiAgICAgICAgICBlbGVtZW50IHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMKLSAqIEluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKLSAqICAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0Ci0gKiAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L3htbC54c2QuCi0gKiAgICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkLgotICogICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKLSAqICAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTCBTY2hlbWEKLSAqICAgIGl0c2VsZiwgb3Igd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTAotICogICAgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBhdAotICogICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIHdpbGwgY2hhbmdlCi0gKiAgICBhY2NvcmRpbmdseTsgdGhlIHZlcnNpb24gYXQKLSAqICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgveG1sLnhzZCB3aWxsIG5vdCBjaGFuZ2UuCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCisgKiAgICAgICBzdWl0YWJsZSBmb3IgaW1wb3J0IGJ5IG90aGVyIHNjaGVtYSBkb2N1bWVudHMuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwiPgorICogICAgICAgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWw8L2E+IGFuZAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCI+CisgKiAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sPC9hPiBmb3IgaW5mb3JtYXRpb24gCisgKiAgICAgICBhYm91dCB0aGlzIG5hbWVzcGFjZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIE5vdGUgdGhhdCBsb2NhbCBuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgaW50ZW5kZWQgdG8gYmUKKyAqICAgICAgIGRlZmluZWQgb25seSBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBvciBpdHMgc3ViZ3JvdXBzLgorICogICAgICAgVGhlIG5hbWVzIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBsaXN0ZWQgYmVsb3cuCisgKiAgICAgICBUaGV5IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZworICogICAgICAgR3JvdXAsIHNwZWNpZmljYXRpb24sIG9yIGRvY3VtZW50IGluc3RhbmNlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPiAgIAorICogICAgICAgU2VlIGZ1cnRoZXIgYmVsb3cgaW4gdGhpcyBkb2N1bWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8YSBocmVmPSIjdXNhZ2UiPmhvdyB0byByZWZlciB0byB0aGlzIHNjaGVtYSBkb2N1bWVudCBmcm9tIHlvdXIgb3duCisgKiAgICAgICBYU0Qgc2NoZW1hIGRvY3VtZW50czwvYT4gYW5kIGFib3V0IDxhIGhyZWY9IiNuc3ZlcnNpb25pbmciPnRoZQorICogICAgICAgbmFtZXNwYWNlLXZlcnNpb25pbmcgcG9saWN5IGdvdmVybmluZyB0aGlzIHNjaGVtYSBkb2N1bWVudDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgogICogICAKICAqIAotICogICAgICAgQCgjKWpzcF8yXzEueHNkcwkxLjUgMDgvMTEvMDUKKyAqICAgIDxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgCisgKiAgICAgPGgzPkZhdGhlciAoaW4gYW55IGNvbnRleHQgYXQgYWxsKTwvaDM+IAorICogCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIGRlbm90ZXMgSm9uIEJvc2FrLCB0aGUgY2hhaXIgb2YgCisgKiAgICAgICB0aGUgb3JpZ2luYWwgWE1MIFdvcmtpbmcgR3JvdXAuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQgYnkgCisgKiAgICAgICB0aGUgZm9sbG93aW5nIGRlY2lzaW9uIG9mIHRoZSBXM0MgWE1MIFBsZW5hcnkgYW5kIAorICogICAgICAgWE1MIENvb3JkaW5hdGlvbiBncm91cHM6CisgKiAgICAgIDwvcD4KKyAqICAgICAgPGJsb2NrcXVvdGU+CisgKiAgICAgICAgPHA+CisgKiAJSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZAorICogCWRlZGljYXRpb24gdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mCisgKiAJRmVicnVhcnksIDIwMDAsIHJlc2VydmVzIGZvciBKb24gQm9zYWsgaW4gcGVycGV0dWl0eQorICogCXRoZSBYTUwgbmFtZSAieG1sOkZhdGhlciIuCisgKiAgICAgICAgPC9wPgorICogICAgICA8L2Jsb2NrcXVvdGU+CisgKiAgICAgPC9kaXY+CisgKiAgICA8L2Rpdj4KKyAqICAgCisgKiAKKyAqICAgIDxkaXYgaWQ9InVzYWdlIiB4bWw6aWQ9InVzYWdlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgKiAgICAgPGgyPgorICogICAgICAgPGEgbmFtZT0idXNhZ2UiPkFib3V0IHRoaXMgc2NoZW1hIGRvY3VtZW50PC9hPgorICogICAgIDwvaDI+CisgKiAKKyAqICAgICA8ZGl2IGNsYXNzPSJib2R5dGV4dCI+CisgKiAgICAgIDxwPgorICogICAgICAgVGhpcyBzY2hlbWEgZGVmaW5lcyBhdHRyaWJ1dGVzIGFuZCBhbiBhdHRyaWJ1dGUgZ3JvdXAgc3VpdGFibGUKKyAqICAgICAgIGZvciB1c2UgYnkgc2NoZW1hcyB3aXNoaW5nIHRvIGFsbG93IDxjb2RlPnhtbDpiYXNlPC9jb2RlPiwKKyAqICAgICAgIDxjb2RlPnhtbDpsYW5nPC9jb2RlPiwgPGNvZGU+eG1sOnNwYWNlPC9jb2RlPiBvcgorICogICAgICAgPGNvZGU+eG1sOmlkPC9jb2RlPiBhdHRyaWJ1dGVzIG9uIGVsZW1lbnRzIHRoZXkgZGVmaW5lLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEgZm9yCisgKiAgICAgICB0aGUgWE1MIG5hbWVzcGFjZSwgZS5nLiBhcyBmb2xsb3dzOgorICogICAgICA8L3A+CisgKiAgICAgIDxwcmU+CisgKiAgICAgICAgICAgJmx0O3NjaGVtYSAuIC4gLiZndDsKKyAqICAgICAgICAgICAgLiAuIC4KKyAqICAgICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKKyAqICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIi8mZ3Q7CisgKiAgICAgIDwvcHJlPgorICogICAgICA8cD4KKyAqICAgICAgIG9yCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHByZT4KKyAqICAgICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKKyAqICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIi8mZ3Q7CisgKiAgICAgIDwvcHJlPgorICogICAgICA8cD4KKyAqICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMgb3IgdGhlCisgKiAgICAgICBncm91cCBkZWZpbmVkIGJlbG93IHdpbGwgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QsIGUuZy4KKyAqICAgICAgPC9wPgorICogICAgICA8cHJlPgorICogICAgICAgICAgICZsdDt0eXBlIC4gLiAuJmd0OworICogICAgICAgICAgICAuIC4gLgorICogICAgICAgICAgICAmbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJ4bWw6c3BlY2lhbEF0dHJzIi8mZ3Q7CisgKiAgICAgIDwvcHJlPgorICogICAgICA8cD4KKyAqICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZSBlbGVtZW50CisgKiAgICAgICB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzLgorICogICAgICA8L3A+CisgKiAgICAgPC9kaXY+CisgKiAgICA8L2Rpdj4KKyAqICAgCisgKiAKKyAqICAgIDxkaXYgaWQ9Im5zdmVyc2lvbmluZyIgeG1sOmlkPSJuc3ZlcnNpb25pbmciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAqICAgICA8aDI+CisgKiAgICAgICA8YSBuYW1lPSJuc3ZlcnNpb25pbmciPlZlcnNpb25pbmcgcG9saWN5IGZvciB0aGlzIHNjaGVtYSBkb2N1bWVudDwvYT4KKyAqICAgICA8L2gyPgorICogICAgIDxkaXYgY2xhc3M9ImJvZHl0ZXh0Ij4KKyAqICAgICAgPHA+CisgKiAgICAgICBJbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCisgKiAgICAgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2Q8L2E+LgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKKyAqICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCI+CisgKiAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkPC9hPi4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCisgKiAgICAgICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwKKyAqICAgICAgIFNjaGVtYSBpdHNlbGYsIG9yIHdpdGggdGhlIFhNTCBuYW1lc3BhY2UgaXRzZWxmLiAgSW4gb3RoZXIgd29yZHMsCisgKiAgICAgICBpZiB0aGUgWE1MIFNjaGVtYSBvciBYTUwgbmFtZXNwYWNlcyBjaGFuZ2UsIHRoZSB2ZXJzaW9uIG9mIHRoaXMKKyAqICAgICAgIGRvY3VtZW50IGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCI+CisgKiAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIAorICogICAgICAgPC9hPiAKKyAqICAgICAgIHdpbGwgY2hhbmdlIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdCAKKyAqICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZCI+CisgKiAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIAorICogICAgICAgPC9hPiAKKyAqICAgICAgIHdpbGwgbm90IGNoYW5nZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIFByZXZpb3VzIGRhdGVkIChhbmQgdW5jaGFuZ2luZykgdmVyc2lvbnMgb2YgdGhpcyBzY2hlbWEgCisgKiAgICAgICBkb2N1bWVudCBhcmUgYXQ6CisgKiAgICAgIDwvcD4KKyAqICAgICAgPHVsPgorICogICAgICAgPGxpPgorICogICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZCI+CisgKiAJaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkPC9hPgorICogICAgICAgICA8L2xpPgorICogICAgICAgPGxpPgorICogICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDgveG1sLnhzZCI+CisgKiAJaHR0cDovL3d3dy53My5vcmcvMjAwNy8wOC94bWwueHNkPC9hPgorICogICAgICAgICA8L2xpPgorICogICAgICAgPGxpPgorICogICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDQvMTAveG1sLnhzZCI+CisgKiAJaHR0cDovL3d3dy53My5vcmcvMjAwNC8xMC94bWwueHNkPC9hPgorICogICAgICAgICA8L2xpPgorICogICAgICAgPGxpPgorICogICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZCI+CisgKiAJaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkPC9hPgorICogICAgICAgICA8L2xpPgorICogICAgICA8L3VsPgorICogICAgIDwvZGl2PgorICogICAgPC9kaXY+CisgKiAgIAorICogCisgKiAgICAgICBAKCMpanNwXzJfMi54c2RzCTAyLzI2LzA5CiAgKiAgICAgCiAgKiAKICAqIAotICogICAgICAgQ29weXJpZ2h0IDIwMDMtMjAwNiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKiAgICAgICA0MTUwIE5ldHdvcmsgQ2lyY2xlCi0gKiAgICAgICBTYW50YSBDbGFyYSwgQ2FsaWZvcm5pYSA5NTA1NAotICogICAgICAgVS5TLkEKLSAqICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKLSAqICAgICAgIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaGFzIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMKLSAqICAgICAgIHJlbGF0aW5nIHRvIHRlY2hub2xvZ3kgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEluCi0gKiAgICAgICBwYXJ0aWN1bGFyLCBhbmQgd2l0aG91dCBsaW1pdGF0aW9uLCB0aGVzZSBpbnRlbGxlY3R1YWwKLSAqICAgICAgIHByb3BlcnR5IHJpZ2h0cyBtYXkgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgVS5TLiBwYXRlbnRzCi0gKiAgICAgICBsaXN0ZWQgYXQgaHR0cDovL3d3dy5zdW4uY29tL3BhdGVudHMgYW5kIG9uZSBvciBtb3JlCi0gKiAgICAgICBhZGRpdGlvbmFsIHBhdGVudHMgb3IgcGVuZGluZyBwYXRlbnQgYXBwbGljYXRpb25zIGluIHRoZQotICogICAgICAgVS5TLiBhbmQgb3RoZXIgY291bnRyaWVzLgotICogCi0gKiAgICAgICBUaGlzIGRvY3VtZW50IGFuZCB0aGUgdGVjaG5vbG9neSB3aGljaCBpdCBkZXNjcmliZXMgYXJlCi0gKiAgICAgICBkaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlcyByZXN0cmljdGluZyB0aGVpciB1c2UsIGNvcHlpbmcsCi0gKiAgICAgICBkaXN0cmlidXRpb24sIGFuZCBkZWNvbXBpbGF0aW9uLiBObyBwYXJ0IG9mIHRoaXMgZG9jdW1lbnQKLSAqICAgICAgIG1heSBiZSByZXByb2R1Y2VkIGluIGFueSBmb3JtIGJ5IGFueSBtZWFucyB3aXRob3V0IHByaW9yCi0gKiAgICAgICB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgU3VuIGFuZCBpdHMgbGljZW5zb3JzLCBpZiBhbnkuCi0gKiAKLSAqICAgICAgIFRoaXJkLXBhcnR5IHNvZnR3YXJlLCBpbmNsdWRpbmcgZm9udCB0ZWNobm9sb2d5LCBpcwotICogICAgICAgY29weXJpZ2h0ZWQgYW5kIGxpY2Vuc2VkIGZyb20gU3VuIHN1cHBsaWVycy4KLSAqIAotICogICAgICAgU3VuLCBTdW4gTWljcm9zeXN0ZW1zLCB0aGUgU3VuIGxvZ28sIFNvbGFyaXMsIEphdmEsIEoyRUUsCi0gKiAgICAgICBKYXZhU2VydmVyIFBhZ2VzLCBFbnRlcnByaXNlIEphdmFCZWFucyBhbmQgdGhlIEphdmEgQ29mZmVlCi0gKiAgICAgICBDdXAgbG9nbyBhcmUgdHJhZGVtYXJrcyBvciByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YgU3VuCi0gKiAgICAgICBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFUuUy4gYW5kIG90aGVyIGNvdW50cmllcy4KLSAqIAotICogICAgICAgRmVkZXJhbCBBY3F1aXNpdGlvbnM6IENvbW1lcmNpYWwgU29mdHdhcmUgLSBHb3Zlcm5tZW50IFVzZXJzCi0gKiAgICAgICBTdWJqZWN0IHRvIFN0YW5kYXJkIExpY2Vuc2UgVGVybXMgYW5kIENvbmRpdGlvbnMuCi0gKiAKLSAqICAgICAKLSAqIAotICogCi0gKiAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSlNQIDIuMSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSAqICAgICAgIHR5cGVzLiAgVGhlIEpTUCAyLjEgc2NoZW1hIGNvbnRhaW5zIGFsbCB0aGUgc3BlY2lhbAorICogICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIEpTUCAyLjIgZGVwbG95bWVudCBkZXNjcmlwdG9yCisgKiAgICAgICB0eXBlcy4gIFRoZSBKU1AgMi4yIHNjaGVtYSBjb250YWlucyBhbGwgdGhlIHNwZWNpYWwKICAqICAgICAgIHN0cnVjdHVyZXMgYW5kIGRhdGF0eXBlcyB0aGF0IGFyZSBuZWNlc3NhcnkgdG8gdXNlIEpTUCBmaWxlcwogICogICAgICAgZnJvbSBhIHdlYiBhcHBsaWNhdGlvbi4KICAqIAotICogICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2NoZW1hIGlzIHVzZWQgYnkgdGhlIHdlYi1hcHBfMl81LnhzZAorICogICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2NoZW1hIGlzIHVzZWQgYnkgdGhlIHdlYi1jb21tb25fM18wLnhzZAogICogICAgICAgZmlsZSB0byBkZWZpbmUgSlNQIHNwZWNpZmljIGNvbnRlbnQuCiAgKiAKICAqICAgICAKQEAgLTM3MCw5ICszMTQsMTEgQEAKIAkvKioKIAkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhlIHBhY2thZ2UgbXVzdCBiZSByZWdpc3RlcmVkIHdpdGggdGhlIEphdmEgRUUgNSBhbmQgSmF2YSBFRSA2IHhzZHMsIHNpbmNlIGl0IGlzIHVzZWQgZm9yIGJvdGggCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICovCiAJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI7IC8vJE5PTi1OTFMtMSQKKwlTdHJpbmcgZU5TX1VSSTIgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgogCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgpAQCAtMzkxLDYgKzMzNyw1MiBAQAogCVdlYlBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbC5pbml0KCk7CiAKIAkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQWJzb2x1dGVPcmRlcmluZ1R5cGVJbXBsIDxlbT5BYnNvbHV0ZSBPcmRlcmluZyBUeXBlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5BYnNvbHV0ZU9yZGVyaW5nVHlwZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0QWJzb2x1dGVPcmRlcmluZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQUJTT0xVVEVfT1JERVJJTkdfVFlQRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU09MVVRFX09SREVSSU5HX1RZUEVfX0dST1VQID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNPTFVURV9PUkRFUklOR19UWVBFX19OQU1FID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdGhlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFCU09MVVRFX09SREVSSU5HX1RZUEVfX09USEVSUyA9IDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzb2x1dGUgT3JkZXJpbmcgVHlwZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBQlNPTFVURV9PUkRFUklOR19UWVBFX0ZFQVRVUkVfQ09VTlQgPSAzOworCisJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkF1dGhDb25zdHJhaW50SW1wbCA8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT59JyBjbGFzcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzk4LDcgKzM5MCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEF1dGhDb25zdHJhaW50KCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IEFVVEhfQ09OU1RSQUlOVCA9IDA7CisJaW50IEFVVEhfQ09OU1RSQUlOVCA9IDE7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTQzNyw2ICs0MjksMjA5IEBACiAJaW50IEFVVEhfQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gMzsKIAogCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Db29raWVDb21tZW50VHlwZUltcGwgPGVtPkNvb2tpZSBDb21tZW50IFR5cGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZUNvbW1lbnRUeXBlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRDb29raWVDb21tZW50VHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDT09LSUVfQ09NTUVOVF9UWVBFID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPT0tJRV9DT01NRU5UX1RZUEVfX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db29raWUgQ29tbWVudCBUeXBlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPT0tJRV9DT01NRU5UX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQ29va2llQ29uZmlnVHlwZUltcGwgPGVtPkNvb2tpZSBDb25maWcgVHlwZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQ29va2llQ29uZmlnVHlwZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0Q29va2llQ29uZmlnVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDT09LSUVfQ09ORklHX1RZUEUgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT09LSUVfQ09ORklHX1RZUEVfX05BTUUgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRvbWFpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPT0tJRV9DT05GSUdfVFlQRV9fRE9NQUlOID0gMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXRoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09PS0lFX0NPTkZJR19UWVBFX19QQVRIID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09PS0lFX0NPTkZJR19UWVBFX19DT01NRU5UID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IdHRwIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT09LSUVfQ09ORklHX1RZUEVfX0hUVFBfT05MWSA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09PS0lFX0NPTkZJR19UWVBFX19TRUNVUkUgPSA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1heCBBZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT09LSUVfQ09ORklHX1RZUEVfX01BWF9BR0UgPSA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09PS0lFX0NPTkZJR19UWVBFX19JRCA9IDc7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29va2llIENvbmZpZyBUeXBlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPT0tJRV9DT05GSUdfVFlQRV9GRUFUVVJFX0NPVU5UID0gODsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Db29raWVEb21haW5UeXBlSW1wbCA8ZW0+Q29va2llIERvbWFpbiBUeXBlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Db29raWVEb21haW5UeXBlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRDb29raWVEb21haW5UeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENPT0tJRV9ET01BSU5fVFlQRSA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDT09LSUVfRE9NQUlOX1RZUEVfX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db29raWUgRG9tYWluIFR5cGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09PS0lFX0RPTUFJTl9UWVBFX0ZFQVRVUkVfQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZU5hbWVUeXBlSW1wbCA8ZW0+Q29va2llIE5hbWUgVHlwZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQ29va2llTmFtZVR5cGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldENvb2tpZU5hbWVUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENPT0tJRV9OQU1FX1RZUEUgPSA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09PS0lFX05BTUVfVFlQRV9fVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvb2tpZSBOYW1lIFR5cGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ09PS0lFX05BTUVfVFlQRV9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Db29raWVQYXRoVHlwZUltcGwgPGVtPkNvb2tpZSBQYXRoIFR5cGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZVBhdGhUeXBlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRDb29raWVQYXRoVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDT09LSUVfUEFUSF9UWVBFID0gNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPT0tJRV9QQVRIX1RZUEVfX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db29raWUgUGF0aCBUeXBlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENPT0tJRV9QQVRIX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDE7CisKKwkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuRXJyb3JQYWdlSW1wbCA8ZW0+RXJyb3IgUGFnZTwvZW0+fScgY2xhc3MuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTQ0NCw3ICs2MzksNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRFcnJvclBhZ2UoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgRVJST1JfUEFHRSA9IDE7CisJaW50IEVSUk9SX1BBR0UgPSA3OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVycm9yIENvZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTQ5OSw3ICs2OTQsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRGaWx0ZXIoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgRklMVEVSID0gMjsKKwlpbnQgRklMVEVSID0gODsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtNTQ3LDEzICs3NDIsMjIgQEAKIAlpbnQgRklMVEVSX19GSUxURVJfQ0xBU1MgPSA0OwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzeW5jIFN1cHBvcnRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEZJTFRFUl9fQVNZTkNfU1VQUE9SVEVEID0gNTsKKworCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbml0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgRklMVEVSX19JTklUX1BBUkFNUyA9IDU7CisJaW50IEZJTFRFUl9fSU5JVF9QQVJBTVMgPSA2OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC01NjIsNyArNzY2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgRklMVEVSX19JRCA9IDY7CisJaW50IEZJTFRFUl9fSUQgPSA3OwogCiAJLyoqCiAJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZpbHRlcjwvZW0+JyBjbGFzcy4KQEAgLTU3MSw3ICs3NzUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBGSUxURVJfRkVBVFVSRV9DT1VOVCA9IDc7CisJaW50IEZJTFRFUl9GRUFUVVJFX0NPVU5UID0gODsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5GaWx0ZXJNYXBwaW5nSW1wbCA8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgpAQCAtNTgxLDcgKzc4NSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEZpbHRlck1hcHBpbmcoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgRklMVEVSX01BUFBJTkcgPSAzOworCWludCBGSUxURVJfTUFQUElORyA9IDk7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTY1NCw3ICs4NTgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRGb3JtTG9naW5Db25maWcoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgRk9STV9MT0dJTl9DT05GSUcgPSA0OworCWludCBGT1JNX0xPR0lOX0NPTkZJRyA9IDEwOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZvcm0gTG9naW4gUGFnZTwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtNzAwLDcgKzkwNCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldExvY2FsZUVuY29kaW5nTWFwcGluZygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBMT0NBTEVfRU5DT0RJTkdfTUFQUElORyA9IDU7CisJaW50IExPQ0FMRV9FTkNPRElOR19NQVBQSU5HID0gMTE7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC03NDYsNyArOTUwLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBMT0NBTEVfRU5DT0RJTkdfTUFQUElOR19MSVNUID0gNjsKKwlpbnQgTE9DQUxFX0VOQ09ESU5HX01BUFBJTkdfTElTVCA9IDEyOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2FsIEVuY29kaW5nIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTc4Myw3ICs5ODcsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRMb2dpbkNvbmZpZygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBMT0dJTl9DT05GSUcgPSA3OworCWludCBMT0dJTl9DT05GSUcgPSAxMzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRoIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtODM4LDcgKzEwNDIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRNaW1lTWFwcGluZygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBNSU1FX01BUFBJTkcgPSA4OworCWludCBNSU1FX01BUFBJTkcgPSAxNDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlbnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTg3Nyw2ICsxMDgxLDE2MyBAQAogCWludCBNSU1FX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IDM7CiAKIAkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTXVsdGlwYXJ0Q29uZmlnVHlwZUltcGwgPGVtPk11bHRpcGFydCBDb25maWcgVHlwZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTXVsdGlwYXJ0Q29uZmlnVHlwZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBNVUxUSVBBUlRfQ09ORklHX1RZUEUgPSAxNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE1VTFRJUEFSVF9DT05GSUdfVFlQRV9fTE9DQVRJT04gPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1heCBGaWxlIFNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSVBBUlRfQ09ORklHX1RZUEVfX01BWF9GSUxFX1NJWkUgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1heCBSZXF1ZXN0IFNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSVBBUlRfQ09ORklHX1RZUEVfX01BWF9SRVFVRVNUX1NJWkUgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbGUgU2l6ZSBUaHJlc2hvbGQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSVBBUlRfQ09ORklHX1RZUEVfX0ZJTEVfU0laRV9USFJFU0hPTEQgPSAzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk11bHRpcGFydCBDb25maWcgVHlwZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBNVUxUSVBBUlRfQ09ORklHX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDQ7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuT3JkZXJpbmdPcmRlcmluZ1R5cGVJbXBsIDxlbT5PcmRlcmluZyBPcmRlcmluZyBUeXBlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5PcmRlcmluZ09yZGVyaW5nVHlwZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0T3JkZXJpbmdPcmRlcmluZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgT1JERVJJTkdfT1JERVJJTkdfVFlQRSA9IDE2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE9SREVSSU5HX09SREVSSU5HX1RZUEVfX05BTUUgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk90aGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE9SREVSSU5HX09SREVSSU5HX1RZUEVfX09USEVSUyA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+T3JkZXJpbmcgT3JkZXJpbmcgVHlwZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBPUkRFUklOR19PUkRFUklOR19UWVBFX0ZFQVRVUkVfQ09VTlQgPSAyOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLk9yZGVyaW5nT3RoZXJzVHlwZUltcGwgPGVtPk9yZGVyaW5nIE90aGVycyBUeXBlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5PcmRlcmluZ090aGVyc1R5cGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE9yZGVyaW5nT3RoZXJzVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBPUkRFUklOR19PVEhFUlNfVFlQRSA9IDE3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgT1JERVJJTkdfT1RIRVJTX1RZUEVfX0lEID0gMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5PcmRlcmluZyBPdGhlcnMgVHlwZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBPUkRFUklOR19PVEhFUlNfVFlQRV9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5PcmRlcmluZ1R5cGVJbXBsIDxlbT5PcmRlcmluZyBUeXBlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5PcmRlcmluZ1R5cGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE9yZGVyaW5nVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBPUkRFUklOR19UWVBFID0gMTg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWZ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBPUkRFUklOR19UWVBFX19BRlRFUiA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmVmb3JlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgT1JERVJJTkdfVFlQRV9fQkVGT1JFID0gMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5PcmRlcmluZyBUeXBlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IE9SREVSSU5HX1RZUEVfRkVBVFVSRV9DT1VOVCA9IDI7CisKKwkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VjdXJpdHlDb25zdHJhaW50SW1wbCA8ZW0+U2VjdXJpdHkgQ29uc3RyYWludDwvZW0+fScgY2xhc3MuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTg4NCw3ICsxMjQ1LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0U2VjdXJpdHlDb25zdHJhaW50KCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IFNFQ1VSSVRZX0NPTlNUUkFJTlQgPSA5OworCWludCBTRUNVUklUWV9DT05TVFJBSU5UID0gMTk7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzcGxheSBOYW1lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC05NDgsNyArMTMwOSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFNlcnZsZXQoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgU0VSVkxFVCA9IDEwOworCWludCBTRVJWTEVUID0gMjA7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEwMjMsMTMgKzEzODQsMzEgQEAKIAlpbnQgU0VSVkxFVF9fTE9BRF9PTl9TVEFSVFVQID0gNzsKIAogCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VSVkxFVF9fRU5BQkxFRCA9IDg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXN5bmMgU3VwcG9ydGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VSVkxFVF9fQVNZTkNfU1VQUE9SVEVEID0gOTsKKworCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SdW4gQXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBTRVJWTEVUX19SVU5fQVMgPSA4OworCWludCBTRVJWTEVUX19SVU5fQVMgPSAxMDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBSb2xlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTAzOCw3ICsxNDE3LDE2IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IDk7CisJaW50IFNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IDExOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk11bHRpcGFydCBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVJWTEVUX19NVUxUSVBBUlRfQ09ORklHID0gMTI7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTEwNDcsNyArMTQzNSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFNFUlZMRVRfX0lEID0gMTA7CisJaW50IFNFUlZMRVRfX0lEID0gMTM7CiAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VydmxldDwvZW0+JyBjbGFzcy4KQEAgLTEwNTYsNyArMTQ0NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFNFUlZMRVRfRkVBVFVSRV9DT1VOVCA9IDExOworCWludCBTRVJWTEVUX0ZFQVRVUkVfQ09VTlQgPSAxNDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZXJ2bGV0TWFwcGluZ0ltcGwgPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+fScgY2xhc3MuCkBAIC0xMDY2LDcgKzE0NTQsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRTZXJ2bGV0TWFwcGluZygpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBTRVJWTEVUX01BUFBJTkcgPSAxMTsKKwlpbnQgU0VSVkxFVF9NQVBQSU5HID0gMjE7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VydmxldCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMTEyLDcgKzE1MDAsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRTZXNzaW9uQ29uZmlnKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IFNFU1NJT05fQ09ORklHID0gMTI7CisJaW50IFNFU1NJT05fQ09ORklHID0gMjI7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUaW1lb3V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xMTI0LDEzICsxNTEyLDMxIEBACiAJaW50IFNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQgPSAwOwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvb2tpZSBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBTRVNTSU9OX0NPTkZJR19fQ09PS0lFX0NPTkZJRyA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhY2tpbmcgTW9kZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgU0VTU0lPTl9DT05GSUdfX1RSQUNLSU5HX01PREUgPSAyOworCisJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgU0VTU0lPTl9DT05GSUdfX0lEID0gMTsKKwlpbnQgU0VTU0lPTl9DT05GSUdfX0lEID0gMzsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZXNzaW9uIENvbmZpZzwvZW0+JyBjbGFzcy4KQEAgLTExMzksNyArMTU0NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFNFU1NJT05fQ09ORklHX0ZFQVRVUkVfQ09VTlQgPSAyOworCWludCBTRVNTSU9OX0NPTkZJR19GRUFUVVJFX0NPVU5UID0gNDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsIDxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+fScgY2xhc3MuCkBAIC0xMTQ5LDcgKzE1NTUsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRVc2VyRGF0YUNvbnN0cmFpbnQoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgVVNFUl9EQVRBX0NPTlNUUkFJTlQgPSAxMzsKKwlpbnQgVVNFUl9EQVRBX0NPTlNUUkFJTlQgPSAyMzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTE5NSw3ICsxNjAxLDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0V2ViQXBwKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IFdFQl9BUFAgPSAxNDsKKwlpbnQgV0VCX0FQUCA9IDI0OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KQEAgLTEyMDcsMTMgKzE2MTMsMjIgQEAKIAlpbnQgV0VCX0FQUF9fR1JPVVAgPSAwOwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfQVBQX19NT0RVTEVfTkFNRSA9IDE7CisKKwkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBXRUJfQVBQX19ERVNDUklQVElPTlMgPSAxOworCWludCBXRUJfQVBQX19ERVNDUklQVElPTlMgPSAyOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTIyMiw3ICsxNjM3LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fRElTUExBWV9OQU1FUyA9IDI7CisJaW50IFdFQl9BUFBfX0RJU1BMQVlfTkFNRVMgPSAzOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkljb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEyMzEsNyArMTY0Niw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFdFQl9BUFBfX0lDT05TID0gMzsKKwlpbnQgV0VCX0FQUF9fSUNPTlMgPSA0OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3RyaWJ1dGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEyNDAsNyArMTY1NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFdFQl9BUFBfX0RJU1RSSUJVVEFCTEVTID0gNDsKKwlpbnQgV0VCX0FQUF9fRElTVFJJQlVUQUJMRVMgPSA1OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRleHQgUGFyYW1zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEyNDksNyArMTY2NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFdFQl9BUFBfX0NPTlRFWFRfUEFSQU1TID0gNTsKKwlpbnQgV0VCX0FQUF9fQ09OVEVYVF9QQVJBTVMgPSA2OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbHRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTI1OCw3ICsxNjczLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fRklMVEVSUyA9IDY7CisJaW50IFdFQl9BUFBfX0ZJTFRFUlMgPSA3OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbHRlciBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMjY3LDcgKzE2ODIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBXRUJfQVBQX19GSUxURVJfTUFQUElOR1MgPSA3OworCWludCBXRUJfQVBQX19GSUxURVJfTUFQUElOR1MgPSA4OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMjc2LDcgKzE2OTEsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBXRUJfQVBQX19MSVNURU5FUlMgPSA4OworCWludCBXRUJfQVBQX19MSVNURU5FUlMgPSA5OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEyODUsNyArMTcwMCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFdFQl9BUFBfX1NFUlZMRVRTID0gOTsKKwlpbnQgV0VCX0FQUF9fU0VSVkxFVFMgPSAxMDsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2bGV0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEyOTQsNyArMTcwOSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFdFQl9BUFBfX1NFUlZMRVRfTUFQUElOR1MgPSAxMDsKKwlpbnQgV0VCX0FQUF9fU0VSVkxFVF9NQVBQSU5HUyA9IDExOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlc3Npb24gQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMzAzLDcgKzE3MTgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBXRUJfQVBQX19TRVNTSU9OX0NPTkZJR1MgPSAxMTsKKwlpbnQgV0VCX0FQUF9fU0VTU0lPTl9DT05GSUdTID0gMTI7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWltZSBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMzEyLDcgKzE3MjcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBXRUJfQVBQX19NSU1FX01BUFBJTkdTID0gMTI7CisJaW50IFdFQl9BUFBfX01JTUVfTUFQUElOR1MgPSAxMzsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWxjb21lIEZpbGUgTGlzdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTMyMSw3ICsxNzM2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fV0VMQ09NRV9GSUxFX0xJU1RTID0gMTM7CisJaW50IFdFQl9BUFBfX1dFTENPTUVfRklMRV9MSVNUUyA9IDE0OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVycm9yIFBhZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEzMzAsNyArMTc0NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFdFQl9BUFBfX0VSUk9SX1BBR0VTID0gMTQ7CisJaW50IFdFQl9BUFBfX0VSUk9SX1BBR0VTID0gMTU7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SnNwIENvbmZpZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTMzOSw3ICsxNzU0LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fSlNQX0NPTkZJR1MgPSAxNTsKKwlpbnQgV0VCX0FQUF9fSlNQX0NPTkZJR1MgPSAxNjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN1cml0eSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMzQ4LDcgKzE3NjMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBXRUJfQVBQX19TRUNVUklUWV9DT05TVFJBSU5UUyA9IDE2OworCWludCBXRUJfQVBQX19TRUNVUklUWV9DT05TVFJBSU5UUyA9IDE3OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvZ2luIENvbmZpZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTM1Nyw3ICsxNzcyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fTE9HSU5fQ09ORklHUyA9IDE3OworCWludCBXRUJfQVBQX19MT0dJTl9DT05GSUdTID0gMTg7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTM2Niw3ICsxNzgxLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVMgPSAxODsKKwlpbnQgV0VCX0FQUF9fU0VDVVJJVFlfUk9MRVMgPSAxOTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xMzc1LDcgKzE3OTAsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBXRUJfQVBQX19FTlZfRU5UUklFUyA9IDE5OworCWludCBXRUJfQVBQX19FTlZfRU5UUklFUyA9IDIwOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTEzODQsNyArMTc5OSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFdFQl9BUFBfX0VKQl9SRUZTID0gMjA7CisJaW50IFdFQl9BUFBfX0VKQl9SRUZTID0gMjE7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIExvY2FsIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTM5Myw3ICsxODA4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlMgPSAyMTsKKwlpbnQgV0VCX0FQUF9fRUpCX0xPQ0FMX1JFRlMgPSAyMjsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTQwMiw3ICsxODE3LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fU0VSVklDRV9SRUZTID0gMjI7CisJaW50IFdFQl9BUFBfX1NFUlZJQ0VfUkVGUyA9IDIzOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTQxMSw3ICsxODI2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fUkVTT1VSQ0VfUkVGUyA9IDIzOworCWludCBXRUJfQVBQX19SRVNPVVJDRV9SRUZTID0gMjQ7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTQyMCw3ICsxODM1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fUkVTT1VSQ0VfRU5WX1JFRlMgPSAyNDsKKwlpbnQgV0VCX0FQUF9fUkVTT1VSQ0VfRU5WX1JFRlMgPSAyNTsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTQyOSw3ICsxODQ0LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gMjU7CisJaW50IFdFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05fUkVGUyA9IDI2OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xNDM4LDcgKzE4NTMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCWludCBXRUJfQVBQX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMgPSAyNjsKKwlpbnQgV0VCX0FQUF9fUEVSU0lTVEVOQ0VfQ09OVEVYVF9SRUZTID0gMjc7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE0NDcsNyArMTg2Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFdFQl9BUFBfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyA9IDI3OworCWludCBXRUJfQVBQX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSAyODsKIAogCS8qKgogCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTQ1Niw3ICsxODcxLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fUE9TVF9DT05TVFJVQ1RTID0gMjg7CisJaW50IFdFQl9BUFBfX1BPU1RfQ09OU1RSVUNUUyA9IDI5OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBEZXN0cm95czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCkBAIC0xNDY1LDcgKzE4ODAsMTYgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fUFJFX0RFU1RST1lTID0gMjk7CisJaW50IFdFQl9BUFBfX1BSRV9ERVNUUk9ZUyA9IDMwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGEgU291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfQVBQX19EQVRBX1NPVVJDRSA9IDMxOwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KQEAgLTE0NzQsNyArMTg5OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFdFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TID0gMzA7CisJaW50IFdFQl9BUFBfX01FU1NBR0VfREVTVElOQVRJT05TID0gMzI7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3MgTGlzdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgpAQCAtMTQ4Myw3ICsxOTA3LDE2IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFdFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTID0gMzE7CisJaW50IFdFQl9BUFBfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTX0xJU1RTID0gMzM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWJzb2x1dGUgT3JkZXJpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9BUFBfX0FCU09MVVRFX09SREVSSU5HID0gMzQ7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTE0OTIsNyArMTkyNSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFdFQl9BUFBfX0lEID0gMzI7CisJaW50IFdFQl9BUFBfX0lEID0gMzU7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KQEAgLTE1MDEsNyArMTkzNCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JaW50IFdFQl9BUFBfX01FVEFEQVRBX0NPTVBMRVRFID0gMzM7CisJaW50IFdFQl9BUFBfX01FVEFEQVRBX0NPTVBMRVRFID0gMzY7CiAKIAkvKioKIAkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgpAQCAtMTUxMCw3ICsxOTQzLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9fVkVSU0lPTiA9IDM0OworCWludCBXRUJfQVBQX19WRVJTSU9OID0gMzc7CiAKIAkvKioKIAkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXBwPC9lbT4nIGNsYXNzLgpAQCAtMTUxOSw3ICsxOTUyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9GRUFUVVJFX0NPVU5UID0gMzU7CisJaW50IFdFQl9BUFBfRkVBVFVSRV9DT1VOVCA9IDM4OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCA8ZW0+QXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCkBAIC0xNTI5LDcgKzE5NjIsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IDE1OworCWludCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IDI1OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KQEAgLTE1NzcsNiArMjAxMCwzNjcgQEAKIAlpbnQgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IDQ7CiAKIAkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsIDxlbT5GcmFnbWVudDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViRnJhZ21lbnRJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlYkZyYWdtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVCA9IDI2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfRlJBR01FTlRfX0dST1VQID0gMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfRlJBR01FTlRfX05BTUUgPSAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0VCX0ZSQUdNRU5UX19ERVNDUklQVElPTlMgPSAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3BsYXkgTmFtZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fRElTUExBWV9OQU1FUyA9IDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWNvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fSUNPTlMgPSA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc3RyaWJ1dGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfRlJBR01FTlRfX0RJU1RSSUJVVEFCTEVTID0gNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZXh0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0VCX0ZSQUdNRU5UX19DT05URVhUX1BBUkFNUyA9IDY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0VCX0ZSQUdNRU5UX19GSUxURVJTID0gNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXIgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fRklMVEVSX01BUFBJTkdTID0gODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fTElTVEVORVJTID0gOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2bGV0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0VCX0ZSQUdNRU5UX19TRVJWTEVUUyA9IDEwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fU0VSVkxFVF9NQVBQSU5HUyA9IDExOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlc3Npb24gQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0VCX0ZSQUdNRU5UX19TRVNTSU9OX0NPTkZJR1MgPSAxMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW1lIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfRlJBR01FTlRfX01JTUVfTUFQUElOR1MgPSAxMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWxjb21lIEZpbGUgTGlzdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fV0VMQ09NRV9GSUxFX0xJU1RTID0gMTQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXJyb3IgUGFnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fRVJST1JfUEFHRVMgPSAxNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kc3AgQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0VCX0ZSQUdNRU5UX19KU1BfQ09ORklHUyA9IDE2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfRlJBR01FTlRfX1NFQ1VSSVRZX0NPTlNUUkFJTlRTID0gMTc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9naW4gQ29uZmlnczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0VCX0ZSQUdNRU5UX19MT0dJTl9DT05GSUdTID0gMTg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJpdHkgUm9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fU0VDVVJJVFlfUk9MRVMgPSAxOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnYgRW50cmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0VCX0ZSQUdNRU5UX19FTlZfRU5UUklFUyA9IDIwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfRlJBR01FTlRfX0VKQl9SRUZTID0gMjE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWpiIExvY2FsIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fRUpCX0xPQ0FMX1JFRlMgPSAyMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXJ2aWNlIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fU0VSVklDRV9SRUZTID0gMjM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0VCX0ZSQUdNRU5UX19SRVNPVVJDRV9SRUZTID0gMjQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlMgPSAyNTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gMjY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgQ29udGV4dCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfRlJBR01FTlRfX1BFUlNJU1RFTkNFX0NPTlRFWFRfUkVGUyA9IDI3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0VCX0ZSQUdNRU5UX19QRVJTSVNURU5DRV9VTklUX1JFRlMgPSAyODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fUE9TVF9DT05TVFJVQ1RTID0gMjk7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIERlc3Ryb3lzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfRlJBR01FTlRfX1BSRV9ERVNUUk9ZUyA9IDMwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGEgU291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfRlJBR01FTlRfX0RBVEFfU09VUkNFID0gMzE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTlMgPSAzMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0VCX0ZSQUdNRU5UX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUyA9IDMzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfRlJBR01FTlRfX09SREVSSU5HID0gMzQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfRlJBR01FTlRfX0lEID0gMzU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfRlJBR01FTlRfX01FVEFEQVRBX0NPTVBMRVRFID0gMzY7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9fVkVSU0lPTiA9IDM3OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZyYWdtZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9GUkFHTUVOVF9GRUFUVVJFX0NPVU5UID0gMzg7CisKKwkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCA8ZW0+UmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+fScgY2xhc3MuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTE1ODQsNyArMjM3OCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlYlJlc291cmNlQ29sbGVjdGlvbigpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTiA9IDE2OworCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTiA9IDI3OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlYiBSZXNvdXJjZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCkBAIC0xNjIzLDEzICsyNDE3LDIyIEBACiAJaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRFMgPSAzOwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh0dHAgTWV0aG9kIE9taXNzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RfT01JU1NJT04gPSA0OworCisJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0lEID0gNDsKKwlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX0lEID0gNTsKIAogCS8qKgogCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBDb2xsZWN0aW9uPC9lbT4nIGNsYXNzLgpAQCAtMTYzOCw3ICsyNDQxLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlpbnQgV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IDU7CisJaW50IFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgPSA2OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlbGNvbWVGaWxlTGlzdEltcGwgPGVtPldlbGNvbWUgRmlsZSBMaXN0PC9lbT59JyBjbGFzcy4KQEAgLTE2NDgsNyArMjQ1MSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlbGNvbWVGaWxlTGlzdCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBXRUxDT01FX0ZJTEVfTElTVCA9IDE3OworCWludCBXRUxDT01FX0ZJTEVfTElTVCA9IDI4OwogCiAJLyoqCiAJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlbGNvbWUgRmlsZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgpAQCAtMTY4NSw3ICsyNDg4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0RGlzcGF0Y2hlclR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgRElTUEFUQ0hFUl9UWVBFID0gMTg7CisJaW50IERJU1BBVENIRVJfVFlQRSA9IDI5OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5OdWxsQ2hhclR5cGUgPGVtPk51bGwgQ2hhciBUeXBlPC9lbT59JyBlbnVtLgpAQCAtMTY5NSw3ICsyNDk4LDE3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE51bGxDaGFyVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBOVUxMX0NIQVJfVFlQRSA9IDE5OworCWludCBOVUxMX0NIQVJfVFlQRSA9IDMwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFja2luZ01vZGVUeXBlIDxlbT5UcmFja2luZyBNb2RlIFR5cGU8L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYWNraW5nTW9kZVR5cGUKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0VHJhY2tpbmdNb2RlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBUUkFDS0lOR19NT0RFX1RZUEUgPSAzMTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhbnNwb3J0R3VhcmFudGVlVHlwZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9lbT59JyBlbnVtLgpAQCAtMTcwNSw3ICsyNTE4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBUUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEUgPSAyMDsKKwlpbnQgVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFID0gMzI7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcFZlcnNpb25UeXBlIDxlbT5BcHAgVmVyc2lvbiBUeXBlPC9lbT59JyBlbnVtLgpAQCAtMTcxNSw3ICsyNTI4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0V2ViQXBwVmVyc2lvblR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9WRVJTSU9OX1RZUEUgPSAyMTsKKwlpbnQgV0VCX0FQUF9WRVJTSU9OX1RZUEUgPSAzMzsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+QXV0aCBNZXRob2QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCkBAIC0xNzI1LDcgKzI1MzgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRBdXRoTWV0aG9kVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBBVVRIX01FVEhPRF9UWVBFID0gMjI7CisJaW50IEFVVEhfTUVUSE9EX1RZUEUgPSAzNDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RGlzcGF0Y2hlciBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCkBAIC0xNzM1LDcgKzI1NDgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXREaXNwYXRjaGVyVHlwZU9iamVjdCgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBESVNQQVRDSEVSX1RZUEVfT0JKRUNUID0gMjM7CisJaW50IERJU1BBVENIRVJfVFlQRV9PQkpFQ1QgPSAzNTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RW5jb2RpbmcgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCkBAIC0xNzQ1LDcgKzI1NTgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRFbmNvZGluZ1R5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgRU5DT0RJTkdfVFlQRSA9IDI0OworCWludCBFTkNPRElOR19UWVBFID0gMzY7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVycm9yIENvZGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCkBAIC0xNzU1LDcgKzI1NjgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRFcnJvckNvZGVUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IEVSUk9SX0NPREVfVFlQRSA9IDI1OworCWludCBFUlJPUl9DT0RFX1RZUEUgPSAzNzsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RmlsdGVyIE5hbWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCkBAIC0xNzY1LDcgKzI1NzgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRGaWx0ZXJOYW1lVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBGSUxURVJfTkFNRV9UWVBFID0gMjY7CisJaW50IEZJTFRFUl9OQU1FX1RZUEUgPSAzODsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHR0cCBNZXRob2QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCkBAIC0xNzc1LDcgKzI1ODgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRIdHRwTWV0aG9kVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBIVFRQX01FVEhPRF9UWVBFID0gMjc7CisJaW50IEhUVFBfTUVUSE9EX1RZUEUgPSAzOTsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TG9hZCBPbiBTdGFydHVwIFR5cGU8L2VtPicgZGF0YSB0eXBlLgpAQCAtMTc4NSw3ICsyNTk4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TG9hZE9uU3RhcnR1cFR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgTE9BRF9PTl9TVEFSVFVQX1RZUEUgPSAyODsKKwlpbnQgTE9BRF9PTl9TVEFSVFVQX1RZUEUgPSA0MDsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TG9jYWxlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgpAQCAtMTc5NSw3ICsyNjA4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0TG9jYWxlVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBMT0NBTEVfVFlQRSA9IDI5OworCWludCBMT0NBTEVfVFlQRSA9IDQxOwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NaW1lIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCkBAIC0xODA1LDcgKzI2MTgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRNaW1lVHlwZVR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgTUlNRV9UWVBFX1RZUEUgPSAzMDsKKwlpbnQgTUlNRV9UWVBFX1RZUEUgPSA0MjsKIAogCS8qKgogCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Tm9uIEVtcHR5IFN0cmluZyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KQEAgLTE4MTUsNyArMjYyOCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE5vbkVtcHR5U3RyaW5nVHlwZSgpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCWludCBOT05fRU1QVFlfU1RSSU5HX1RZUEUgPSAzMTsKKwlpbnQgTk9OX0VNUFRZX1NUUklOR19UWVBFID0gNDM7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk51bGwgQ2hhciBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCkBAIC0xODI1LDcgKzI2MzgsNyBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXROdWxsQ2hhclR5cGVPYmplY3QoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgTlVMTF9DSEFSX1RZUEVfT0JKRUNUID0gMzI7CisJaW50IE5VTExfQ0hBUl9UWVBFX09CSkVDVCA9IDQ0OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TZXJ2bGV0IE5hbWUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCkBAIC0xODM1LDcgKzI2NDgsMTcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0U2VydmxldE5hbWVUeXBlKCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JaW50IFNFUlZMRVRfTkFNRV9UWVBFID0gMzM7CisJaW50IFNFUlZMRVRfTkFNRV9UWVBFID0gNDU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlRyYWNraW5nIE1vZGUgVHlwZSBPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFja2luZ01vZGVUeXBlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFRyYWNraW5nTW9kZVR5cGVPYmplY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVFJBQ0tJTkdfTU9ERV9UWVBFX09CSkVDVCA9IDQ2OwogCiAJLyoqCiAJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KQEAgLTE4NDUsNyArMjY2OCw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3QoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFX09CSkVDVCA9IDM0OworCWludCBUUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEVfT0JKRUNUID0gNDc7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPldhciBQYXRoIFR5cGU8L2VtPicgZGF0YSB0eXBlLgpAQCAtMTg1NSw3ICsyNjc4LDcgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0V2FyUGF0aFR5cGUoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgV0FSX1BBVEhfVFlQRSA9IDM1OworCWludCBXQVJfUEFUSF9UWVBFID0gNDg7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFwcCBWZXJzaW9uIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KQEAgLTE4NjUsMTAgKzI2ODgsNTMgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0V2ViQXBwVmVyc2lvblR5cGVPYmplY3QoKQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlpbnQgV0VCX0FQUF9WRVJTSU9OX1RZUEVfT0JKRUNUID0gMzY7CisJaW50IFdFQl9BUFBfVkVSU0lPTl9UWVBFX09CSkVDVCA9IDQ5OwogCiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BYnNvbHV0ZU9yZGVyaW5nVHlwZSA8ZW0+QWJzb2x1dGUgT3JkZXJpbmcgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnNvbHV0ZSBPcmRlcmluZyBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQWJzb2x1dGVPcmRlcmluZ1R5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEFic29sdXRlT3JkZXJpbmdUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQWJzb2x1dGVPcmRlcmluZ1R5cGUjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkFic29sdXRlT3JkZXJpbmdUeXBlI2dldEdyb3VwKCkKKwkgKiBAc2VlICNnZXRBYnNvbHV0ZU9yZGVyaW5nVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QWJzb2x1dGVPcmRlcmluZ1R5cGVfR3JvdXAoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BYnNvbHV0ZU9yZGVyaW5nVHlwZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5OYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQWJzb2x1dGVPcmRlcmluZ1R5cGUjZ2V0TmFtZSgpCisJICogQHNlZSAjZ2V0QWJzb2x1dGVPcmRlcmluZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEFic29sdXRlT3JkZXJpbmdUeXBlX05hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BYnNvbHV0ZU9yZGVyaW5nVHlwZSNnZXRPdGhlcnMgPGVtPk90aGVyczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3RoZXJzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQWJzb2x1dGVPcmRlcmluZ1R5cGUjZ2V0T3RoZXJzKCkKKwkgKiBAc2VlICNnZXRBYnNvbHV0ZU9yZGVyaW5nVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QWJzb2x1dGVPcmRlcmluZ1R5cGVfT3RoZXJzKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BdXRoQ29uc3RyYWludCA8ZW0+QXV0aCBDb25zdHJhaW50PC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMTkxMiw2ICsyNzc4LDE4OCBAQAogCUVBdHRyaWJ1dGUgZ2V0QXV0aENvbnN0cmFpbnRfSWQoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbW1lbnRUeXBlIDxlbT5Db29raWUgQ29tbWVudCBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvb2tpZSBDb21tZW50IFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb21tZW50VHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q29va2llQ29tbWVudFR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29tbWVudFR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb21tZW50VHlwZSNnZXRWYWx1ZSgpCisJICogQHNlZSAjZ2V0Q29va2llQ29tbWVudFR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENvb2tpZUNvbW1lbnRUeXBlX1ZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb25maWdUeXBlIDxlbT5Db29raWUgQ29uZmlnIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29va2llIENvbmZpZyBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q29va2llQ29uZmlnVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb25maWdUeXBlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5OYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNnZXROYW1lKCkKKwkgKiBAc2VlICNnZXRDb29raWVDb25maWdUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRDb29raWVDb25maWdUeXBlX05hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNnZXREb21haW4gPGVtPkRvbWFpbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkRvbWFpbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGUjZ2V0RG9tYWluKCkKKwkgKiBAc2VlICNnZXRDb29raWVDb25maWdUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRDb29raWVDb25maWdUeXBlX0RvbWFpbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb25maWdUeXBlI2dldFBhdGggPGVtPlBhdGg8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QYXRoPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNnZXRQYXRoKCkKKwkgKiBAc2VlICNnZXRDb29raWVDb25maWdUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRDb29raWVDb25maWdUeXBlX1BhdGgoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29tbWVudDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGUjZ2V0Q29tbWVudCgpCisJICogQHNlZSAjZ2V0Q29va2llQ29uZmlnVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Q29va2llQ29uZmlnVHlwZV9Db21tZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGUjaXNIdHRwT25seSA8ZW0+SHR0cCBPbmx5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHR0cCBPbmx5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNpc0h0dHBPbmx5KCkKKwkgKiBAc2VlICNnZXRDb29raWVDb25maWdUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb29raWVDb25maWdUeXBlX0h0dHBPbmx5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGUjaXNTZWN1cmUgPGVtPlNlY3VyZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlY3VyZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGUjaXNTZWN1cmUoKQorCSAqIEBzZWUgI2dldENvb2tpZUNvbmZpZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENvb2tpZUNvbmZpZ1R5cGVfU2VjdXJlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGUjZ2V0TWF4QWdlIDxlbT5NYXggQWdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWF4IEFnZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGUjZ2V0TWF4QWdlKCkKKwkgKiBAc2VlICNnZXRDb29raWVDb25maWdUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb29raWVDb25maWdUeXBlX01heEFnZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb25maWdUeXBlI2dldElkIDxlbT5JZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSNnZXRJZCgpCisJICogQHNlZSAjZ2V0Q29va2llQ29uZmlnVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q29va2llQ29uZmlnVHlwZV9JZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llRG9tYWluVHlwZSA8ZW0+Q29va2llIERvbWFpbiBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvb2tpZSBEb21haW4gVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZURvbWFpblR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENvb2tpZURvbWFpblR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llRG9tYWluVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZURvbWFpblR5cGUjZ2V0VmFsdWUoKQorCSAqIEBzZWUgI2dldENvb2tpZURvbWFpblR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENvb2tpZURvbWFpblR5cGVfVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZU5hbWVUeXBlIDxlbT5Db29raWUgTmFtZSBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvb2tpZSBOYW1lIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVOYW1lVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q29va2llTmFtZVR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llTmFtZVR5cGUjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVOYW1lVHlwZSNnZXRWYWx1ZSgpCisJICogQHNlZSAjZ2V0Q29va2llTmFtZVR5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENvb2tpZU5hbWVUeXBlX1ZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVQYXRoVHlwZSA8ZW0+Q29va2llIFBhdGggVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db29raWUgUGF0aCBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llUGF0aFR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENvb2tpZVBhdGhUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZVBhdGhUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llUGF0aFR5cGUjZ2V0VmFsdWUoKQorCSAqIEBzZWUgI2dldENvb2tpZVBhdGhUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDb29raWVQYXRoVHlwZV9WYWx1ZSgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlIDxlbT5FcnJvciBQYWdlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMjAzMSw2ICszMDc5LDE3IEBACiAJRUF0dHJpYnV0ZSBnZXRGaWx0ZXJfRmlsdGVyQ2xhc3MoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyI2lzQXN5bmNTdXBwb3J0ZWQgPGVtPkFzeW5jIFN1cHBvcnRlZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFzeW5jIFN1cHBvcnRlZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNpc0FzeW5jU3VwcG9ydGVkKCkKKwkgKiBAc2VlICNnZXRGaWx0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEZpbHRlcl9Bc3luY1N1cHBvcnRlZCgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciNnZXRJbml0UGFyYW1zIDxlbT5Jbml0IFBhcmFtczwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTIzNDQsNiArMzQwMywxNDUgQEAKIAlFQXR0cmlidXRlIGdldE1pbWVNYXBwaW5nX0lkKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NdWx0aXBhcnRDb25maWdUeXBlIDxlbT5NdWx0aXBhcnQgQ29uZmlnIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TXVsdGlwYXJ0IENvbmZpZyBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTXVsdGlwYXJ0Q29uZmlnVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NdWx0aXBhcnRDb25maWdUeXBlI2dldExvY2F0aW9uIDxlbT5Mb2NhdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2F0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTXVsdGlwYXJ0Q29uZmlnVHlwZSNnZXRMb2NhdGlvbigpCisJICogQHNlZSAjZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZV9Mb2NhdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NdWx0aXBhcnRDb25maWdUeXBlI2dldE1heEZpbGVTaXplIDxlbT5NYXggRmlsZSBTaXplPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWF4IEZpbGUgU2l6ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk11bHRpcGFydENvbmZpZ1R5cGUjZ2V0TWF4RmlsZVNpemUoKQorCSAqIEBzZWUgI2dldE11bHRpcGFydENvbmZpZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldE11bHRpcGFydENvbmZpZ1R5cGVfTWF4RmlsZVNpemUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTXVsdGlwYXJ0Q29uZmlnVHlwZSNnZXRNYXhSZXF1ZXN0U2l6ZSA8ZW0+TWF4IFJlcXVlc3QgU2l6ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1heCBSZXF1ZXN0IFNpemU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5NdWx0aXBhcnRDb25maWdUeXBlI2dldE1heFJlcXVlc3RTaXplKCkKKwkgKiBAc2VlICNnZXRNdWx0aXBhcnRDb25maWdUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRNdWx0aXBhcnRDb25maWdUeXBlX01heFJlcXVlc3RTaXplKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk11bHRpcGFydENvbmZpZ1R5cGUjZ2V0RmlsZVNpemVUaHJlc2hvbGQgPGVtPkZpbGUgU2l6ZSBUaHJlc2hvbGQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWxlIFNpemUgVGhyZXNob2xkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTXVsdGlwYXJ0Q29uZmlnVHlwZSNnZXRGaWxlU2l6ZVRocmVzaG9sZCgpCisJICogQHNlZSAjZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZV9GaWxlU2l6ZVRocmVzaG9sZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdPcmRlcmluZ1R5cGUgPGVtPk9yZGVyaW5nIE9yZGVyaW5nIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3JkZXJpbmcgT3JkZXJpbmcgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk9yZGVyaW5nT3JkZXJpbmdUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRPcmRlcmluZ09yZGVyaW5nVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk9yZGVyaW5nT3JkZXJpbmdUeXBlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5PcmRlcmluZ09yZGVyaW5nVHlwZSNnZXROYW1lKCkKKwkgKiBAc2VlICNnZXRPcmRlcmluZ09yZGVyaW5nVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0T3JkZXJpbmdPcmRlcmluZ1R5cGVfTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5PcmRlcmluZ09yZGVyaW5nVHlwZSNnZXRPdGhlcnMgPGVtPk90aGVyczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk90aGVyczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk9yZGVyaW5nT3JkZXJpbmdUeXBlI2dldE90aGVycygpCisJICogQHNlZSAjZ2V0T3JkZXJpbmdPcmRlcmluZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldE9yZGVyaW5nT3JkZXJpbmdUeXBlX090aGVycygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdPdGhlcnNUeXBlIDxlbT5PcmRlcmluZyBPdGhlcnMgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcmRlcmluZyBPdGhlcnMgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk9yZGVyaW5nT3RoZXJzVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0T3JkZXJpbmdPdGhlcnNUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk9yZGVyaW5nT3RoZXJzVHlwZSNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk9yZGVyaW5nT3RoZXJzVHlwZSNnZXRJZCgpCisJICogQHNlZSAjZ2V0T3JkZXJpbmdPdGhlcnNUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRPcmRlcmluZ090aGVyc1R5cGVfSWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk9yZGVyaW5nVHlwZSA8ZW0+T3JkZXJpbmcgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcmRlcmluZyBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRPcmRlcmluZ1R5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdUeXBlI2dldEFmdGVyIDxlbT5BZnRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkFmdGVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdUeXBlI2dldEFmdGVyKCkKKwkgKiBAc2VlICNnZXRPcmRlcmluZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldE9yZGVyaW5nVHlwZV9BZnRlcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5PcmRlcmluZ1R5cGUjZ2V0QmVmb3JlIDxlbT5CZWZvcmU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5CZWZvcmU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5PcmRlcmluZ1R5cGUjZ2V0QmVmb3JlKCkKKwkgKiBAc2VlICNnZXRPcmRlcmluZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldE9yZGVyaW5nVHlwZV9CZWZvcmUoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCA8ZW0+U2VjdXJpdHkgQ29uc3RyYWludDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTI1MDcsNiArMzcwNSwyOCBAQAogCUVBdHRyaWJ1dGUgZ2V0U2VydmxldF9Mb2FkT25TdGFydHVwKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjaXNFbmFibGVkIDxlbT5FbmFibGVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5hYmxlZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjaXNFbmFibGVkKCkKKwkgKiBAc2VlICNnZXRTZXJ2bGV0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRTZXJ2bGV0X0VuYWJsZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNpc0FzeW5jU3VwcG9ydGVkIDxlbT5Bc3luYyBTdXBwb3J0ZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Bc3luYyBTdXBwb3J0ZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0I2lzQXN5bmNTdXBwb3J0ZWQoKQorCSAqIEBzZWUgI2dldFNlcnZsZXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNlcnZsZXRfQXN5bmNTdXBwb3J0ZWQoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRSdW5BcyA8ZW0+UnVuIEFzPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMjUyOSw2ICszNzQ5LDE3IEBACiAJRVJlZmVyZW5jZSBnZXRTZXJ2bGV0X1NlY3VyaXR5Um9sZVJlZnMoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRNdWx0aXBhcnRDb25maWcgPGVtPk11bHRpcGFydCBDb25maWc8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NdWx0aXBhcnQgQ29uZmlnPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCNnZXRNdWx0aXBhcnRDb25maWcoKQorCSAqIEBzZWUgI2dldFNlcnZsZXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFNlcnZsZXRfTXVsdGlwYXJ0Q29uZmlnKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQjZ2V0SWQgPGVtPklkPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMjYwNCw2ICszODM1LDI4IEBACiAJRUF0dHJpYnV0ZSBnZXRTZXNzaW9uQ29uZmlnX1Nlc3Npb25UaW1lb3V0KCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWcjZ2V0Q29va2llQ29uZmlnIDxlbT5Db29raWUgQ29uZmlnPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29va2llIENvbmZpZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWcjZ2V0Q29va2llQ29uZmlnKCkKKwkgKiBAc2VlICNnZXRTZXNzaW9uQ29uZmlnKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRTZXNzaW9uQ29uZmlnX0Nvb2tpZUNvbmZpZygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWcjZ2V0VHJhY2tpbmdNb2RlIDxlbT5UcmFja2luZyBNb2RlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5UcmFja2luZyBNb2RlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2Vzc2lvbkNvbmZpZyNnZXRUcmFja2luZ01vZGUoKQorCSAqIEBzZWUgI2dldFNlc3Npb25Db25maWcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFNlc3Npb25Db25maWdfVHJhY2tpbmdNb2RlKCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlc3Npb25Db25maWcjZ2V0SWQgPGVtPklkPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMjk5OCw2ICs0MjUxLDE3IEBACiAJRVJlZmVyZW5jZSBnZXRXZWJBcHBfUHJlRGVzdHJveXMoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0RGF0YVNvdXJjZSA8ZW0+RGF0YSBTb3VyY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRhdGEgU291cmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwI2dldERhdGFTb3VyY2UoKQorCSAqIEBzZWUgI2dldFdlYkFwcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0V2ViQXBwX0RhdGFTb3VyY2UoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0TWVzc2FnZURlc3RpbmF0aW9ucyA8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0zMDIwLDYgKzQyODQsMjggQEAKIAlFUmVmZXJlbmNlIGdldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRNb2R1bGVOYW1lIDxlbT5Nb2R1bGUgTmFtZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TW9kdWxlIE5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0TW9kdWxlTmFtZSgpCisJICogQHNlZSAjZ2V0V2ViQXBwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRXZWJBcHBfTW9kdWxlTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCNnZXRBYnNvbHV0ZU9yZGVyaW5nIDxlbT5BYnNvbHV0ZSBPcmRlcmluZzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWJzb2x1dGUgT3JkZXJpbmc8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0QWJzb2x1dGVPcmRlcmluZygpCisJICogQHNlZSAjZ2V0V2ViQXBwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXZWJBcHBfQWJzb2x1dGVPcmRlcmluZygpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAjZ2V0SWQgPGVtPklkPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzEwNyw2ICs0MzkzLDQzNCBAQAogCUVSZWZlcmVuY2UgZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfV2ViQXBwKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCA8ZW0+RnJhZ21lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RnJhZ21lbnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0V2ViRnJhZ21lbnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0R3JvdXAoKQorCSAqIEBzZWUgI2dldFdlYkZyYWdtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRXZWJGcmFnbWVudF9Hcm91cCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldERlc2NyaXB0aW9ucyA8ZW0+RGVzY3JpcHRpb25zPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EZXNjcmlwdGlvbnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXREZXNjcmlwdGlvbnMoKQorCSAqIEBzZWUgI2dldFdlYkZyYWdtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9EZXNjcmlwdGlvbnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXREaXNwbGF5TmFtZXMgPGVtPkRpc3BsYXkgTmFtZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRpc3BsYXkgTmFtZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXREaXNwbGF5TmFtZXMoKQorCSAqIEBzZWUgI2dldFdlYkZyYWdtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9EaXNwbGF5TmFtZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRJY29ucyA8ZW0+SWNvbnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkljb25zPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0SWNvbnMoKQorCSAqIEBzZWUgI2dldFdlYkZyYWdtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9JY29ucygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk5hbWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXROYW1lKCkKKwkgKiBAc2VlICNnZXRXZWJGcmFnbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0V2ViRnJhZ21lbnRfTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldERpc3RyaWJ1dGFibGVzIDxlbT5EaXN0cmlidXRhYmxlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGlzdHJpYnV0YWJsZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXREaXN0cmlidXRhYmxlcygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0Rpc3RyaWJ1dGFibGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0Q29udGV4dFBhcmFtcyA8ZW0+Q29udGV4dCBQYXJhbXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRleHQgUGFyYW1zPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0Q29udGV4dFBhcmFtcygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0NvbnRleHRQYXJhbXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRGaWx0ZXJzIDxlbT5GaWx0ZXJzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5GaWx0ZXJzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0RmlsdGVycygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0ZpbHRlcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRGaWx0ZXJNYXBwaW5ncyA8ZW0+RmlsdGVyIE1hcHBpbmdzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5GaWx0ZXIgTWFwcGluZ3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRGaWx0ZXJNYXBwaW5ncygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0ZpbHRlck1hcHBpbmdzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0TGlzdGVuZXJzIDxlbT5MaXN0ZW5lcnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkxpc3RlbmVyczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldExpc3RlbmVycygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0xpc3RlbmVycygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldFNlcnZsZXRzIDxlbT5TZXJ2bGV0czwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VydmxldHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRTZXJ2bGV0cygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X1NlcnZsZXRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0U2VydmxldE1hcHBpbmdzIDxlbT5TZXJ2bGV0IE1hcHBpbmdzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZXJ2bGV0IE1hcHBpbmdzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0U2VydmxldE1hcHBpbmdzKCkKKwkgKiBAc2VlICNnZXRXZWJGcmFnbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfU2VydmxldE1hcHBpbmdzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0U2Vzc2lvbkNvbmZpZ3MgPGVtPlNlc3Npb24gQ29uZmlnczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2Vzc2lvbiBDb25maWdzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0U2Vzc2lvbkNvbmZpZ3MoKQorCSAqIEBzZWUgI2dldFdlYkZyYWdtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9TZXNzaW9uQ29uZmlncygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldE1pbWVNYXBwaW5ncyA8ZW0+TWltZSBNYXBwaW5nczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWltZSBNYXBwaW5nczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldE1pbWVNYXBwaW5ncygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X01pbWVNYXBwaW5ncygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldFdlbGNvbWVGaWxlTGlzdHMgPGVtPldlbGNvbWUgRmlsZSBMaXN0czwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+V2VsY29tZSBGaWxlIExpc3RzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0V2VsY29tZUZpbGVMaXN0cygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X1dlbGNvbWVGaWxlTGlzdHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRFcnJvclBhZ2VzIDxlbT5FcnJvciBQYWdlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXJyb3IgUGFnZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRFcnJvclBhZ2VzKCkKKwkgKiBAc2VlICNnZXRXZWJGcmFnbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfRXJyb3JQYWdlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldEpzcENvbmZpZ3MgPGVtPkpzcCBDb25maWdzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Kc3AgQ29uZmlnczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldEpzcENvbmZpZ3MoKQorCSAqIEBzZWUgI2dldFdlYkZyYWdtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9Kc3BDb25maWdzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0U2VjdXJpdHlDb25zdHJhaW50cyA8ZW0+U2VjdXJpdHkgQ29uc3RyYWludHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0U2VjdXJpdHlDb25zdHJhaW50cygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X1NlY3VyaXR5Q29uc3RyYWludHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRMb2dpbkNvbmZpZ3MgPGVtPkxvZ2luIENvbmZpZ3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkxvZ2luIENvbmZpZ3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRMb2dpbkNvbmZpZ3MoKQorCSAqIEBzZWUgI2dldFdlYkZyYWdtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9Mb2dpbkNvbmZpZ3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRTZWN1cml0eVJvbGVzIDxlbT5TZWN1cml0eSBSb2xlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VjdXJpdHkgUm9sZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRTZWN1cml0eVJvbGVzKCkKKwkgKiBAc2VlICNnZXRXZWJGcmFnbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfU2VjdXJpdHlSb2xlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldEVudkVudHJpZXMgPGVtPkVudiBFbnRyaWVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnYgRW50cmllczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldEVudkVudHJpZXMoKQorCSAqIEBzZWUgI2dldFdlYkZyYWdtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9FbnZFbnRyaWVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0RWpiUmVmcyA8ZW0+RWpiIFJlZnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVqYiBSZWZzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0RWpiUmVmcygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0VqYlJlZnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRFamJMb2NhbFJlZnMgPGVtPkVqYiBMb2NhbCBSZWZzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FamIgTG9jYWwgUmVmczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldEVqYkxvY2FsUmVmcygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0VqYkxvY2FsUmVmcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldFNlcnZpY2VSZWZzIDxlbT5TZXJ2aWNlIFJlZnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlcnZpY2UgUmVmczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldFNlcnZpY2VSZWZzKCkKKwkgKiBAc2VlICNnZXRXZWJGcmFnbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfU2VydmljZVJlZnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRSZXNvdXJjZVJlZnMgPGVtPlJlc291cmNlIFJlZnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlIFJlZnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRSZXNvdXJjZVJlZnMoKQorCSAqIEBzZWUgI2dldFdlYkZyYWdtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9SZXNvdXJjZVJlZnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRSZXNvdXJjZUVudlJlZnMgPGVtPlJlc291cmNlIEVudiBSZWZzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZSBFbnYgUmVmczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldFJlc291cmNlRW52UmVmcygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X1Jlc291cmNlRW52UmVmcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMgPGVtPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWZzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZzIDxlbT5QZXJzaXN0ZW5jZSBDb250ZXh0IFJlZnM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKQorCSAqIEBzZWUgI2dldFdlYkZyYWdtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXZWJGcmFnbWVudF9QZXJzaXN0ZW5jZUNvbnRleHRSZWZzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0UGVyc2lzdGVuY2VVbml0UmVmcyA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IFJlZnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkKKwkgKiBAc2VlICNnZXRXZWJGcmFnbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfUGVyc2lzdGVuY2VVbml0UmVmcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldFBvc3RDb25zdHJ1Y3RzIDxlbT5Qb3N0IENvbnN0cnVjdHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlBvc3QgQ29uc3RydWN0czwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldFBvc3RDb25zdHJ1Y3RzKCkKKwkgKiBAc2VlICNnZXRXZWJGcmFnbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfUG9zdENvbnN0cnVjdHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRQcmVEZXN0cm95cyA8ZW0+UHJlIERlc3Ryb3lzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QcmUgRGVzdHJveXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRQcmVEZXN0cm95cygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X1ByZURlc3Ryb3lzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0RGF0YVNvdXJjZSA8ZW0+RGF0YSBTb3VyY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkRhdGEgU291cmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0RGF0YVNvdXJjZSgpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0RhdGFTb3VyY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRNZXNzYWdlRGVzdGluYXRpb25zIDxlbT5NZXNzYWdlIERlc3RpbmF0aW9uczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWVzc2FnZSBEZXN0aW5hdGlvbnM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRNZXNzYWdlRGVzdGluYXRpb25zKCkKKwkgKiBAc2VlICNnZXRXZWJGcmFnbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldExvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzIDxlbT5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TG9jYWwgRW5jb2RpbmcgTWFwcGluZ3MgTGlzdHM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRMb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkZyYWdtZW50X0xvY2FsRW5jb2RpbmdNYXBwaW5nc0xpc3RzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0T3JkZXJpbmcgPGVtPk9yZGVyaW5nPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5PcmRlcmluZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2dldE9yZGVyaW5nKCkKKwkgKiBAc2VlICNnZXRXZWJGcmFnbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0V2ViRnJhZ21lbnRfT3JkZXJpbmcoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0SWQgPGVtPklkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRJZCgpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFdlYkZyYWdtZW50X0lkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2lzTWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50I2lzTWV0YWRhdGFDb21wbGV0ZSgpCisJICogQHNlZSAjZ2V0V2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFdlYkZyYWdtZW50X01ldGFkYXRhQ29tcGxldGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcnNpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCNnZXRWZXJzaW9uKCkKKwkgKiBAc2VlICNnZXRXZWJGcmFnbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0V2ViRnJhZ21lbnRfVmVyc2lvbigpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uIDxlbT5SZXNvdXJjZSBDb2xsZWN0aW9uPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzE2MSw2ICs0ODc1LDE3IEBACiAJRUF0dHJpYnV0ZSBnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZHMoKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0SHR0cE1ldGhvZE9taXNzaW9uIDxlbT5IdHRwIE1ldGhvZCBPbWlzc2lvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SHR0cCBNZXRob2QgT21pc3Npb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJSZXNvdXJjZUNvbGxlY3Rpb24jZ2V0SHR0cE1ldGhvZE9taXNzaW9uKCkKKwkgKiBAc2VlICNnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kT21pc3Npb24oKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViUmVzb3VyY2VDb2xsZWN0aW9uI2dldElkIDxlbT5JZDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTMyMjQsNiArNDk0OSwxNiBAQAogCUVFbnVtIGdldE51bGxDaGFyVHlwZSgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFja2luZ01vZGVUeXBlIDxlbT5UcmFja2luZyBNb2RlIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5UcmFja2luZyBNb2RlIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFja2luZ01vZGVUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldFRyYWNraW5nTW9kZVR5cGUoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhbnNwb3J0R3VhcmFudGVlVHlwZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlPC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzM2NCw2ICs1MDk5LDE2IEBACiAJRURhdGFUeXBlIGdldFNlcnZsZXROYW1lVHlwZSgpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYWNraW5nTW9kZVR5cGUgPGVtPlRyYWNraW5nIE1vZGUgVHlwZSBPYmplY3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlRyYWNraW5nIE1vZGUgVHlwZSBPYmplY3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFja2luZ01vZGVUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVEYXRhVHlwZSBnZXRUcmFja2luZ01vZGVUeXBlT2JqZWN0KCk7CisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhbnNwb3J0R3VhcmFudGVlVHlwZSA8ZW0+VHJhbnNwb3J0IEd1YXJhbnRlZSBUeXBlIE9iamVjdDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTM0MTYsNiArNTE2MSw0MCBAQAogCSAqLwogCWludGVyZmFjZSBMaXRlcmFscyAgewogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQWJzb2x1dGVPcmRlcmluZ1R5cGVJbXBsIDxlbT5BYnNvbHV0ZSBPcmRlcmluZyBUeXBlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5BYnNvbHV0ZU9yZGVyaW5nVHlwZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldEFic29sdXRlT3JkZXJpbmdUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEFCU09MVVRFX09SREVSSU5HX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0QWJzb2x1dGVPcmRlcmluZ1R5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBBQlNPTFVURV9PUkRFUklOR19UWVBFX19HUk9VUCA9IGVJTlNUQU5DRS5nZXRBYnNvbHV0ZU9yZGVyaW5nVHlwZV9Hcm91cCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQUJTT0xVVEVfT1JERVJJTkdfVFlQRV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRBYnNvbHV0ZU9yZGVyaW5nVHlwZV9OYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdGhlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFCU09MVVRFX09SREVSSU5HX1RZUEVfX09USEVSUyA9IGVJTlNUQU5DRS5nZXRBYnNvbHV0ZU9yZGVyaW5nVHlwZV9PdGhlcnMoKTsKKworCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQXV0aENvbnN0cmFpbnRJbXBsIDxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTM0NTAsNiArNTIyOSwxNTIgQEAKIAkJRUF0dHJpYnV0ZSBBVVRIX0NPTlNUUkFJTlRfX0lEID0gZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X0lkKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZUNvbW1lbnRUeXBlSW1wbCA8ZW0+Q29va2llIENvbW1lbnQgVHlwZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuQ29va2llQ29tbWVudFR5cGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRDb29raWVDb21tZW50VHlwZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBDT09LSUVfQ09NTUVOVF9UWVBFID0gZUlOU1RBTkNFLmdldENvb2tpZUNvbW1lbnRUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENPT0tJRV9DT01NRU5UX1RZUEVfX1ZBTFVFID0gZUlOU1RBTkNFLmdldENvb2tpZUNvbW1lbnRUeXBlX1ZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZUNvbmZpZ1R5cGVJbXBsIDxlbT5Db29raWUgQ29uZmlnIFR5cGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZUNvbmZpZ1R5cGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRDb29raWVDb25maWdUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENPT0tJRV9DT05GSUdfVFlQRSA9IGVJTlNUQU5DRS5nZXRDb29raWVDb25maWdUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQ09PS0lFX0NPTkZJR19UWVBFX19OQU1FID0gZUlOU1RBTkNFLmdldENvb2tpZUNvbmZpZ1R5cGVfTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RG9tYWluPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQ09PS0lFX0NPTkZJR19UWVBFX19ET01BSU4gPSBlSU5TVEFOQ0UuZ2V0Q29va2llQ29uZmlnVHlwZV9Eb21haW4oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhdGg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBDT09LSUVfQ09ORklHX1RZUEVfX1BBVEggPSBlSU5TVEFOQ0UuZ2V0Q29va2llQ29uZmlnVHlwZV9QYXRoKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQ09PS0lFX0NPTkZJR19UWVBFX19DT01NRU5UID0gZUlOU1RBTkNFLmdldENvb2tpZUNvbmZpZ1R5cGVfQ29tbWVudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SHR0cCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ09PS0lFX0NPTkZJR19UWVBFX19IVFRQX09OTFkgPSBlSU5TVEFOQ0UuZ2V0Q29va2llQ29uZmlnVHlwZV9IdHRwT25seSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdXJlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ09PS0lFX0NPTkZJR19UWVBFX19TRUNVUkUgPSBlSU5TVEFOQ0UuZ2V0Q29va2llQ29uZmlnVHlwZV9TZWN1cmUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1heCBBZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDT09LSUVfQ09ORklHX1RZUEVfX01BWF9BR0UgPSBlSU5TVEFOQ0UuZ2V0Q29va2llQ29uZmlnVHlwZV9NYXhBZ2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ09PS0lFX0NPTkZJR19UWVBFX19JRCA9IGVJTlNUQU5DRS5nZXRDb29raWVDb25maWdUeXBlX0lkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZURvbWFpblR5cGVJbXBsIDxlbT5Db29raWUgRG9tYWluIFR5cGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZURvbWFpblR5cGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRDb29raWVEb21haW5UeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENPT0tJRV9ET01BSU5fVFlQRSA9IGVJTlNUQU5DRS5nZXRDb29raWVEb21haW5UeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENPT0tJRV9ET01BSU5fVFlQRV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0Q29va2llRG9tYWluVHlwZV9WYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Db29raWVOYW1lVHlwZUltcGwgPGVtPkNvb2tpZSBOYW1lIFR5cGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZU5hbWVUeXBlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0Q29va2llTmFtZVR5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQ09PS0lFX05BTUVfVFlQRSA9IGVJTlNUQU5DRS5nZXRDb29raWVOYW1lVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDT09LSUVfTkFNRV9UWVBFX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRDb29raWVOYW1lVHlwZV9WYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5Db29raWVQYXRoVHlwZUltcGwgPGVtPkNvb2tpZSBQYXRoIFR5cGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLkNvb2tpZVBhdGhUeXBlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGwjZ2V0Q29va2llUGF0aFR5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQ09PS0lFX1BBVEhfVFlQRSA9IGVJTlNUQU5DRS5nZXRDb29raWVQYXRoVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDT09LSUVfUEFUSF9UWVBFX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRDb29raWVQYXRoVHlwZV9WYWx1ZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5FcnJvclBhZ2VJbXBsIDxlbT5FcnJvciBQYWdlPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0zNTQyLDYgKzU0NjcsMTQgQEAKIAkJRUF0dHJpYnV0ZSBGSUxURVJfX0ZJTFRFUl9DTEFTUyA9IGVJTlNUQU5DRS5nZXRGaWx0ZXJfRmlsdGVyQ2xhc3MoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzeW5jIFN1cHBvcnRlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEZJTFRFUl9fQVNZTkNfU1VQUE9SVEVEID0gZUlOU1RBTkNFLmdldEZpbHRlcl9Bc3luY1N1cHBvcnRlZCgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5pdCBQYXJhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzc4Niw2ICs1NzE5LDExOCBAQAogCQlFQXR0cmlidXRlIE1JTUVfTUFQUElOR19fSUQgPSBlSU5TVEFOQ0UuZ2V0TWltZU1hcHBpbmdfSWQoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTXVsdGlwYXJ0Q29uZmlnVHlwZUltcGwgPGVtPk11bHRpcGFydCBDb25maWcgVHlwZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuTXVsdGlwYXJ0Q29uZmlnVHlwZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE11bHRpcGFydENvbmZpZ1R5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgTVVMVElQQVJUX0NPTkZJR19UWVBFID0gZUlOU1RBTkNFLmdldE11bHRpcGFydENvbmZpZ1R5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTVVMVElQQVJUX0NPTkZJR19UWVBFX19MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXRNdWx0aXBhcnRDb25maWdUeXBlX0xvY2F0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXggRmlsZSBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgTVVMVElQQVJUX0NPTkZJR19UWVBFX19NQVhfRklMRV9TSVpFID0gZUlOU1RBTkNFLmdldE11bHRpcGFydENvbmZpZ1R5cGVfTWF4RmlsZVNpemUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1heCBSZXF1ZXN0IFNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBNVUxUSVBBUlRfQ09ORklHX1RZUEVfX01BWF9SRVFVRVNUX1NJWkUgPSBlSU5TVEFOQ0UuZ2V0TXVsdGlwYXJ0Q29uZmlnVHlwZV9NYXhSZXF1ZXN0U2l6ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmlsZSBTaXplIFRocmVzaG9sZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIE1VTFRJUEFSVF9DT05GSUdfVFlQRV9fRklMRV9TSVpFX1RIUkVTSE9MRCA9IGVJTlNUQU5DRS5nZXRNdWx0aXBhcnRDb25maWdUeXBlX0ZpbGVTaXplVGhyZXNob2xkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLk9yZGVyaW5nT3JkZXJpbmdUeXBlSW1wbCA8ZW0+T3JkZXJpbmcgT3JkZXJpbmcgVHlwZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuT3JkZXJpbmdPcmRlcmluZ1R5cGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRPcmRlcmluZ09yZGVyaW5nVHlwZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBPUkRFUklOR19PUkRFUklOR19UWVBFID0gZUlOU1RBTkNFLmdldE9yZGVyaW5nT3JkZXJpbmdUeXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBPUkRFUklOR19PUkRFUklOR19UWVBFX19OQU1FID0gZUlOU1RBTkNFLmdldE9yZGVyaW5nT3JkZXJpbmdUeXBlX05hbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk90aGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIE9SREVSSU5HX09SREVSSU5HX1RZUEVfX09USEVSUyA9IGVJTlNUQU5DRS5nZXRPcmRlcmluZ09yZGVyaW5nVHlwZV9PdGhlcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuT3JkZXJpbmdPdGhlcnNUeXBlSW1wbCA8ZW0+T3JkZXJpbmcgT3RoZXJzIFR5cGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLk9yZGVyaW5nT3RoZXJzVHlwZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldE9yZGVyaW5nT3RoZXJzVHlwZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBPUkRFUklOR19PVEhFUlNfVFlQRSA9IGVJTlNUQU5DRS5nZXRPcmRlcmluZ090aGVyc1R5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgT1JERVJJTkdfT1RIRVJTX1RZUEVfX0lEID0gZUlOU1RBTkNFLmdldE9yZGVyaW5nT3RoZXJzVHlwZV9JZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5PcmRlcmluZ1R5cGVJbXBsIDxlbT5PcmRlcmluZyBUeXBlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5PcmRlcmluZ1R5cGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRPcmRlcmluZ1R5cGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgT1JERVJJTkdfVFlQRSA9IGVJTlNUQU5DRS5nZXRPcmRlcmluZ1R5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFmdGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgT1JERVJJTkdfVFlQRV9fQUZURVIgPSBlSU5TVEFOQ0UuZ2V0T3JkZXJpbmdUeXBlX0FmdGVyKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CZWZvcmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBPUkRFUklOR19UWVBFX19CRUZPUkUgPSBlSU5TVEFOQ0UuZ2V0T3JkZXJpbmdUeXBlX0JlZm9yZSgpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5TZWN1cml0eUNvbnN0cmFpbnRJbXBsIDxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0zOTEwLDYgKzU5NTUsMjIgQEAKIAkJRUF0dHJpYnV0ZSBTRVJWTEVUX19MT0FEX09OX1NUQVJUVVAgPSBlSU5TVEFOQ0UuZ2V0U2VydmxldF9Mb2FkT25TdGFydHVwKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgU0VSVkxFVF9fRU5BQkxFRCA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X0VuYWJsZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzeW5jIFN1cHBvcnRlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNFUlZMRVRfX0FTWU5DX1NVUFBPUlRFRCA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X0FzeW5jU3VwcG9ydGVkKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SdW4gQXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTM5MjYsNiArNTk4NywxNCBAQAogCQlFUmVmZXJlbmNlIFNFUlZMRVRfX1NFQ1VSSVRZX1JPTEVfUkVGUyA9IGVJTlNUQU5DRS5nZXRTZXJ2bGV0X1NlY3VyaXR5Um9sZVJlZnMoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk11bHRpcGFydCBDb25maWc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBTRVJWTEVUX19NVUxUSVBBUlRfQ09ORklHID0gZUlOU1RBTkNFLmdldFNlcnZsZXRfTXVsdGlwYXJ0Q29uZmlnKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzk4Niw2ICs2MDU1LDIyIEBACiAJCUVBdHRyaWJ1dGUgU0VTU0lPTl9DT05GSUdfX1NFU1NJT05fVElNRU9VVCA9IGVJTlNUQU5DRS5nZXRTZXNzaW9uQ29uZmlnX1Nlc3Npb25UaW1lb3V0KCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db29raWUgQ29uZmlnPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgU0VTU0lPTl9DT05GSUdfX0NPT0tJRV9DT05GSUcgPSBlSU5TVEFOQ0UuZ2V0U2Vzc2lvbkNvbmZpZ19Db29raWVDb25maWcoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYWNraW5nIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFNFU1NJT05fQ09ORklHX19UUkFDS0lOR19NT0RFID0gZUlOU1RBTkNFLmdldFNlc3Npb25Db25maWdfVHJhY2tpbmdNb2RlKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNDI3OCw2ICs2MzYzLDE0IEBACiAJCUVSZWZlcmVuY2UgV0VCX0FQUF9fUFJFX0RFU1RST1lTID0gZUlOU1RBTkNFLmdldFdlYkFwcF9QcmVEZXN0cm95cygpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBTb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0RBVEFfU09VUkNFID0gZUlOU1RBTkNFLmdldFdlYkFwcF9EYXRhU291cmNlKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC00Mjk0LDYgKzYzODcsMjIgQEAKIAkJRVJlZmVyZW5jZSBXRUJfQVBQX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUyA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdzTGlzdHMoKTsKIAogCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZHVsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBXRUJfQVBQX19NT0RVTEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRXZWJBcHBfTW9kdWxlTmFtZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWJzb2x1dGUgT3JkZXJpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFdFQl9BUFBfX0FCU09MVVRFX09SREVSSU5HID0gZUlOU1RBTkNFLmdldFdlYkFwcF9BYnNvbHV0ZU9yZGVyaW5nKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNDM2MCw2ICs2NDY5LDMyMCBAQAogCQlFUmVmZXJlbmNlIFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfQVBQID0gZUlOU1RBTkNFLmdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1dlYkFwcCgpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwgPGVtPkZyYWdtZW50PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJGcmFnbWVudEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFdlYkZyYWdtZW50KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFdFQl9GUkFHTUVOVCA9IGVJTlNUQU5DRS5nZXRXZWJGcmFnbWVudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFdFQl9GUkFHTUVOVF9fR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0V2ViRnJhZ21lbnRfR3JvdXAoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgV0VCX0ZSQUdNRU5UX19ERVNDUklQVElPTlMgPSBlSU5TVEFOQ0UuZ2V0V2ViRnJhZ21lbnRfRGVzY3JpcHRpb25zKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNwbGF5IE5hbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX0RJU1BMQVlfTkFNRVMgPSBlSU5TVEFOQ0UuZ2V0V2ViRnJhZ21lbnRfRGlzcGxheU5hbWVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JY29uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgV0VCX0ZSQUdNRU5UX19JQ09OUyA9IGVJTlNUQU5DRS5nZXRXZWJGcmFnbWVudF9JY29ucygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgV0VCX0ZSQUdNRU5UX19OQU1FID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X05hbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpc3RyaWJ1dGFibGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX0RJU1RSSUJVVEFCTEVTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X0Rpc3RyaWJ1dGFibGVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250ZXh0IFBhcmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgV0VCX0ZSQUdNRU5UX19DT05URVhUX1BBUkFNUyA9IGVJTlNUQU5DRS5nZXRXZWJGcmFnbWVudF9Db250ZXh0UGFyYW1zKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWx0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX0ZJTFRFUlMgPSBlSU5TVEFOQ0UuZ2V0V2ViRnJhZ21lbnRfRmlsdGVycygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmlsdGVyIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX0ZJTFRFUl9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRXZWJGcmFnbWVudF9GaWx0ZXJNYXBwaW5ncygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRXZWJGcmFnbWVudF9MaXN0ZW5lcnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcnZsZXRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX1NFUlZMRVRTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X1NlcnZsZXRzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXJ2bGV0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX1NFUlZMRVRfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0V2ViRnJhZ21lbnRfU2VydmxldE1hcHBpbmdzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZXNzaW9uIENvbmZpZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFdFQl9GUkFHTUVOVF9fU0VTU0lPTl9DT05GSUdTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X1Nlc3Npb25Db25maWdzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NaW1lIE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX01JTUVfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0V2ViRnJhZ21lbnRfTWltZU1hcHBpbmdzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWxjb21lIEZpbGUgTGlzdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFdFQl9GUkFHTUVOVF9fV0VMQ09NRV9GSUxFX0xJU1RTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X1dlbGNvbWVGaWxlTGlzdHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVycm9yIFBhZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX0VSUk9SX1BBR0VTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X0Vycm9yUGFnZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkpzcCBDb25maWdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX0pTUF9DT05GSUdTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X0pzcENvbmZpZ3MoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX1NFQ1VSSVRZX0NPTlNUUkFJTlRTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X1NlY3VyaXR5Q29uc3RyYWludHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvZ2luIENvbmZpZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFdFQl9GUkFHTUVOVF9fTE9HSU5fQ09ORklHUyA9IGVJTlNUQU5DRS5nZXRXZWJGcmFnbWVudF9Mb2dpbkNvbmZpZ3MoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3VyaXR5IFJvbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX1NFQ1VSSVRZX1JPTEVTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X1NlY3VyaXR5Um9sZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudiBFbnRyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX0VOVl9FTlRSSUVTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X0VudkVudHJpZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX0VKQl9SRUZTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X0VqYlJlZnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVqYiBMb2NhbCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX0VKQl9MT0NBTF9SRUZTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X0VqYkxvY2FsUmVmcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VydmljZSBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX1NFUlZJQ0VfUkVGUyA9IGVJTlNUQU5DRS5nZXRXZWJGcmFnbWVudF9TZXJ2aWNlUmVmcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgV0VCX0ZSQUdNRU5UX19SRVNPVVJDRV9SRUZTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X1Jlc291cmNlUmVmcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRW52IFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFdFQl9GUkFHTUVOVF9fUkVTT1VSQ0VfRU5WX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0V2ViRnJhZ21lbnRfUmVzb3VyY2VFbnZSZWZzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uIFJlZnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFdFQl9GUkFHTUVOVF9fTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIENvbnRleHQgUmVmczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgV0VCX0ZSQUdNRU5UX19QRVJTSVNURU5DRV9DT05URVhUX1JFRlMgPSBlSU5TVEFOQ0UuZ2V0V2ViRnJhZ21lbnRfUGVyc2lzdGVuY2VDb250ZXh0UmVmcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBSZWZzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfRlJBR01FTlRfX1BFUlNJU1RFTkNFX1VOSVRfUkVGUyA9IGVJTlNUQU5DRS5nZXRXZWJGcmFnbWVudF9QZXJzaXN0ZW5jZVVuaXRSZWZzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IENvbnN0cnVjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFdFQl9GUkFHTUVOVF9fUE9TVF9DT05TVFJVQ1RTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X1Bvc3RDb25zdHJ1Y3RzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgRGVzdHJveXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFdFQl9GUkFHTUVOVF9fUFJFX0RFU1RST1lTID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X1ByZURlc3Ryb3lzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhIFNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgV0VCX0ZSQUdNRU5UX19EQVRBX1NPVVJDRSA9IGVJTlNUQU5DRS5nZXRXZWJGcmFnbWVudF9EYXRhU291cmNlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXNzYWdlIERlc3RpbmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgV0VCX0ZSQUdNRU5UX19NRVNTQUdFX0RFU1RJTkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRXZWJGcmFnbWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NhbCBFbmNvZGluZyBNYXBwaW5ncyBMaXN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgV0VCX0ZSQUdNRU5UX19MT0NBTF9FTkNPRElOR19NQVBQSU5HU19MSVNUUyA9IGVJTlNUQU5DRS5nZXRXZWJGcmFnbWVudF9Mb2NhbEVuY29kaW5nTWFwcGluZ3NMaXN0cygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFdFQl9GUkFHTUVOVF9fT1JERVJJTkcgPSBlSU5TVEFOQ0UuZ2V0V2ViRnJhZ21lbnRfT3JkZXJpbmcoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgV0VCX0ZSQUdNRU5UX19JRCA9IGVJTlNUQU5DRS5nZXRXZWJGcmFnbWVudF9JZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBXRUJfRlJBR01FTlRfX01FVEFEQVRBX0NPTVBMRVRFID0gZUlOU1RBTkNFLmdldFdlYkZyYWdtZW50X01ldGFkYXRhQ29tcGxldGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBXRUJfRlJBR01FTlRfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0V2ViRnJhZ21lbnRfVmVyc2lvbigpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJSZXNvdXJjZUNvbGxlY3Rpb25JbXBsIDxlbT5SZXNvdXJjZSBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC00NDAyLDYgKzY4MjUsMTQgQEAKIAkJRUF0dHJpYnV0ZSBXRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fSFRUUF9NRVRIT0RTID0gZUlOU1RBTkNFLmdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kcygpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SHR0cCBNZXRob2QgT21pc3Npb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFdFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19IVFRQX01FVEhPRF9PTUlTU0lPTiA9IGVJTlNUQU5DRS5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZE9taXNzaW9uKCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCiAJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtNDQ1Niw2ICs2ODg3LDE2IEBACiAJCUVFbnVtIE5VTExfQ0hBUl9UWVBFID0gZUlOU1RBTkNFLmdldE51bGxDaGFyVHlwZSgpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuVHJhY2tpbmdNb2RlVHlwZSA8ZW0+VHJhY2tpbmcgTW9kZSBUeXBlPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5UcmFja2luZ01vZGVUeXBlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwuaW1wbC5XZWJQYWNrYWdlSW1wbCNnZXRUcmFja2luZ01vZGVUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gVFJBQ0tJTkdfTU9ERV9UWVBFID0gZUlOU1RBTkNFLmdldFRyYWNraW5nTW9kZVR5cGUoKTsKKworCQkvKioKIAkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgPGVtPlRyYW5zcG9ydCBHdWFyYW50ZWUgVHlwZTwvZW0+fScgZW51bS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC00NTk2LDYgKzcwMzcsMTYgQEAKIAkJRURhdGFUeXBlIFNFUlZMRVRfTkFNRV9UWVBFID0gZUlOU1RBTkNFLmdldFNlcnZsZXROYW1lVHlwZSgpOwogCiAJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+VHJhY2tpbmcgTW9kZSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlRyYWNraW5nTW9kZVR5cGUKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5pbXBsLldlYlBhY2thZ2VJbXBsI2dldFRyYWNraW5nTW9kZVR5cGVPYmplY3QoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRGF0YVR5cGUgVFJBQ0tJTkdfTU9ERV9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRUcmFja2luZ01vZGVUeXBlT2JqZWN0KCk7CisKKwkJLyoqCiAJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGUgT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KIAkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYkFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggMjU4YzgwMi4uNzBkZDM2MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtNTgsNiArNTgsNyBAQAogCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKQEAgLTY5LDY4ICs3MCwxMzEgQEAKIAl9CiAKIAkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJvdGVjdGVkIFdlYlN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBXZWJTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBdXRoQ29uc3RyYWludChBdXRoQ29uc3RyYWludCBvYmplY3QpIHsKKwlwcm90ZWN0ZWQgV2ViU3dpdGNoPEFkYXB0ZXI+IG1vZGVsU3dpdGNoID0KKwkJbmV3IFdlYlN3aXRjaDxBZGFwdGVyPigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUFic29sdXRlT3JkZXJpbmdUeXBlKEFic29sdXRlT3JkZXJpbmdUeXBlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVBYnNvbHV0ZU9yZGVyaW5nVHlwZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVBdXRoQ29uc3RyYWludEFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUVycm9yUGFnZShFcnJvclBhZ2Ugb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb29raWVDb21tZW50VHlwZShDb29raWVDb21tZW50VHlwZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29va2llQ29tbWVudFR5cGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb29raWVDb25maWdUeXBlKENvb2tpZUNvbmZpZ1R5cGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNvb2tpZUNvbmZpZ1R5cGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb29raWVEb21haW5UeXBlKENvb2tpZURvbWFpblR5cGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNvb2tpZURvbWFpblR5cGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb29raWVOYW1lVHlwZShDb29raWVOYW1lVHlwZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29va2llTmFtZVR5cGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb29raWVQYXRoVHlwZShDb29raWVQYXRoVHlwZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ29va2llUGF0aFR5cGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFcnJvclBhZ2UoRXJyb3JQYWdlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFcnJvclBhZ2VBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VGaWx0ZXIoRmlsdGVyIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRmlsdGVyKEZpbHRlciBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRmlsdGVyQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRmlsdGVyTWFwcGluZyhGaWx0ZXJNYXBwaW5nIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlRmlsdGVyTWFwcGluZyhGaWx0ZXJNYXBwaW5nIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVGaWx0ZXJNYXBwaW5nQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlRm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZyBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUZvcm1Mb2dpbkNvbmZpZyhGb3JtTG9naW5Db25maWcgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUZvcm1Mb2dpbkNvbmZpZ0FkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZUxvY2FsZUVuY29kaW5nTWFwcGluZyhMb2NhbGVFbmNvZGluZ01hcHBpbmcgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMb2NhbGVFbmNvZGluZ01hcHBpbmcoTG9jYWxlRW5jb2RpbmdNYXBwaW5nIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVMb2NhbGVFbmNvZGluZ01hcHBpbmdBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3Qgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KExvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3Qgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3RBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZUxvZ2luQ29uZmlnKExvZ2luQ29uZmlnIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVMb2dpbkNvbmZpZ0FkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZU1pbWVNYXBwaW5nKE1pbWVNYXBwaW5nIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTWltZU1hcHBpbmcoTWltZU1hcHBpbmcgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZU1pbWVNYXBwaW5nQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU11bHRpcGFydENvbmZpZ1R5cGUoTXVsdGlwYXJ0Q29uZmlnVHlwZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTXVsdGlwYXJ0Q29uZmlnVHlwZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU9yZGVyaW5nT3JkZXJpbmdUeXBlKE9yZGVyaW5nT3JkZXJpbmdUeXBlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVPcmRlcmluZ09yZGVyaW5nVHlwZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU9yZGVyaW5nT3RoZXJzVHlwZShPcmRlcmluZ090aGVyc1R5cGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU9yZGVyaW5nT3RoZXJzVHlwZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZU9yZGVyaW5nVHlwZShPcmRlcmluZ1R5cGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZU9yZGVyaW5nVHlwZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNlY3VyaXR5Q29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5Q29uc3RyYWludEFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXQoU2VydmxldCBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVNlcnZsZXQoU2VydmxldCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlU2VydmxldEFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRNYXBwaW5nKFNlcnZsZXRNYXBwaW5nIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2VydmxldE1hcHBpbmcoU2VydmxldE1hcHBpbmcgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRNYXBwaW5nQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlU2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlU2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVTZXNzaW9uQ29uZmlnQWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlVXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVVzZXJEYXRhQ29uc3RyYWludChVc2VyRGF0YUNvbnN0cmFpbnQgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludEFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYkFwcChXZWJBcHAgb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXZWJBcHAoV2ViQXBwIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXZWJBcHBBZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcihXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIEFkYXB0ZXIgY2FzZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckFkYXB0ZXIoKTsKIAkJCX0KLQkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gb2JqZWN0KSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXZWJGcmFnbWVudChXZWJGcmFnbWVudCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlV2ViRnJhZ21lbnRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXZWJSZXNvdXJjZUNvbGxlY3Rpb24oV2ViUmVzb3VyY2VDb2xsZWN0aW9uIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb25BZGFwdGVyKCk7CiAJCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWxjb21lRmlsZUxpc3QoV2VsY29tZUZpbGVMaXN0IG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlV2VsY29tZUZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlV2VsY29tZUZpbGVMaXN0QWRhcHRlcigpOwogCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwogCQkJfQogCQl9OwpAQCAtMTQzLDEyICsyMDcsMjcgQEAKIAkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJCXJldHVybiBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwogCX0KIAogCiAJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BYnNvbHV0ZU9yZGVyaW5nVHlwZSA8ZW0+QWJzb2x1dGUgT3JkZXJpbmcgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5BYnNvbHV0ZU9yZGVyaW5nVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBYnNvbHV0ZU9yZGVyaW5nVHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgogCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQXV0aENvbnN0cmFpbnQgPGVtPkF1dGggQ29uc3RyYWludDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CkBAIC0xNjMsNiArMjQyLDc2IEBACiAJfQogCiAJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb21tZW50VHlwZSA8ZW0+Q29va2llIENvbW1lbnQgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5Db29raWVDb21tZW50VHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb29raWVDb21tZW50VHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llQ29uZmlnVHlwZSA8ZW0+Q29va2llIENvbmZpZyBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZUNvbmZpZ1R5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29va2llQ29uZmlnVHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llRG9tYWluVHlwZSA8ZW0+Q29va2llIERvbWFpbiBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZURvbWFpblR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29va2llRG9tYWluVHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llTmFtZVR5cGUgPGVtPkNvb2tpZSBOYW1lIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuQ29va2llTmFtZVR5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29va2llTmFtZVR5cGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZVBhdGhUeXBlIDxlbT5Db29raWUgUGF0aCBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkNvb2tpZVBhdGhUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvb2tpZVBhdGhUeXBlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCiAJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5FcnJvclBhZ2UgPGVtPkVycm9yIFBhZ2U8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwpAQCAtMjc1LDYgKzQyNCw2MiBAQAogCX0KIAogCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuTXVsdGlwYXJ0Q29uZmlnVHlwZSA8ZW0+TXVsdGlwYXJ0IENvbmZpZyBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk11bHRpcGFydENvbmZpZ1R5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlTXVsdGlwYXJ0Q29uZmlnVHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdPcmRlcmluZ1R5cGUgPGVtPk9yZGVyaW5nIE9yZGVyaW5nIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdPcmRlcmluZ1R5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlT3JkZXJpbmdPcmRlcmluZ1R5cGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk9yZGVyaW5nT3RoZXJzVHlwZSA8ZW0+T3JkZXJpbmcgT3RoZXJzIFR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdPdGhlcnNUeXBlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU9yZGVyaW5nT3RoZXJzVHlwZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuT3JkZXJpbmdUeXBlIDxlbT5PcmRlcmluZyBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLk9yZGVyaW5nVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVPcmRlcmluZ1R5cGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlY3VyaXR5Q29uc3RyYWludCA8ZW0+U2VjdXJpdHkgQ29uc3RyYWludDwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CkBAIC0zNzMsNiArNTc4LDIwIEBACiAJfQogCiAJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudCA8ZW0+RnJhZ21lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViRnJhZ21lbnRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYlJlc291cmNlQ29sbGVjdGlvbiA8ZW0+UmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDQ2NDAxYmIuLmRkNzZiYzQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCkBAIC00MCw2ICs0MCw3IEBACiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewogCQlYTUxSZXNvdXJjZSByZXN1bHQgPSBuZXcgV2ViUmVzb3VyY2VJbXBsKHVyaSk7CiAJCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlJlc291cmNlSW1wbC5qYXZhCmluZGV4IDNjZGQxYzEuLjA0MmQ5NjYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViUmVzb3VyY2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJSZXNvdXJjZUltcGwuamF2YQpAQCAtMjgsNyArMjgsNyBAQAogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC51dGlsLldlYlJlc291cmNlRmFjdG9yeUltcGwKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIFdlYlJlc291cmNlSW1wbCBleHRlbmRzIEphdmFlZVJlc291cmNlSW1wbCBpbXBsZW1lbnRzIElSb290T2JqZWN0UmVzb3VyY2UsIElXZWJSZXNvdXJjZXsKK3B1YmxpYyBjbGFzcyBXZWJSZXNvdXJjZUltcGwgZXh0ZW5kcyBKYXZhZWVSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBJUm9vdE9iamVjdFJlc291cmNlLCBJV2ViUmVzb3VyY2UgewogCS8qKgogCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CkBAIC00MCwxNiArNDAsMTggQEAKIAkJc3VwZXIodXJpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgWE1MTG9hZCBjcmVhdGVYTUxMb2FkKCkgewogCQkgcmV0dXJuIG5ldyBKRUVYTUxMb2FkSW1wbChjcmVhdGVYTUxIZWxwZXIoKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFhNTEhlbHBlciBjcmVhdGVYTUxIZWxwZXIoKSB7CiAJCQogCQlyZXR1cm4gbmV3IFdlYlhNTEhlbHBlckltcGwodGhpcyk7CiAJfQogCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLnV0aWwuSVdlYlJlc291cmNlI2dldFJvb3RPYmplY3QoKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYlJlc291cmNlI2dldFJvb3RPYmplY3QoKQogCSAqLwogCXB1YmxpYyBFT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7CiAJCWlmIChjb250ZW50cyA9PSBudWxsIHx8IGNvbnRlbnRzLmlzRW1wdHkoKSkKQEAgLTYxLDcgKzYzLDcgQEAKIAkJcmV0dXJuIChFT2JqZWN0KSgoV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3Ipcm9vdCkuZ2V0V2ViQXBwKCk7CiAJfQogCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLnV0aWwuSVdlYlJlc291cmNlI2dldFdlYkFwcCgpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViUmVzb3VyY2UjZ2V0V2ViQXBwKCkKIAkgKi8KIAlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKIAkJcmV0dXJuIChXZWJBcHApZ2V0Um9vdE9iamVjdCgpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViU3dpdGNoLmphdmEKaW5kZXggMmY2ODhiZi4uYmM2MTM3NyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJTd2l0Y2guamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlN3aXRjaC5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIFdlYlN3aXRjaCB7CitwdWJsaWMgY2xhc3MgV2ViU3dpdGNoPFQ+IHsKIAkvKioKIAkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgpAQCAtNjAsNyArNjAsNyBAQAogCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7CiAJCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKIAl9CiAKQEAgLTcxLDE2ICs3MSwxNiBAQAogCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CiAJCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewogCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7CiAJCX0KIAkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7CisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKIAkJCXJldHVybgogCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CiAJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKLQkJCQkJZG9Td2l0Y2goKEVDbGFzcyllU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwogCQl9CiAJfQogCkBAIC05MSwxMTMgKzkxLDE3OSBAQAogCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CiAJCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7CisJCQljYXNlIFdlYlBhY2thZ2UuQUJTT0xVVEVfT1JERVJJTkdfVFlQRTogeworCQkJCUFic29sdXRlT3JkZXJpbmdUeXBlIGFic29sdXRlT3JkZXJpbmdUeXBlID0gKEFic29sdXRlT3JkZXJpbmdUeXBlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQWJzb2x1dGVPcmRlcmluZ1R5cGUoYWJzb2x1dGVPcmRlcmluZ1R5cGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KIAkJCWNhc2UgV2ViUGFja2FnZS5BVVRIX0NPTlNUUkFJTlQ6IHsKIAkJCQlBdXRoQ29uc3RyYWludCBhdXRoQ29uc3RyYWludCA9IChBdXRoQ29uc3RyYWludCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXV0aENvbnN0cmFpbnQoYXV0aENvbnN0cmFpbnQpOworCQkJCVQgcmVzdWx0ID0gY2FzZUF1dGhDb25zdHJhaW50KGF1dGhDb25zdHJhaW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0NPTU1FTlRfVFlQRTogeworCQkJCUNvb2tpZUNvbW1lbnRUeXBlIGNvb2tpZUNvbW1lbnRUeXBlID0gKENvb2tpZUNvbW1lbnRUeXBlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQ29va2llQ29tbWVudFR5cGUoY29va2llQ29tbWVudFR5cGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09ORklHX1RZUEU6IHsKKwkJCQlDb29raWVDb25maWdUeXBlIGNvb2tpZUNvbmZpZ1R5cGUgPSAoQ29va2llQ29uZmlnVHlwZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUNvb2tpZUNvbmZpZ1R5cGUoY29va2llQ29uZmlnVHlwZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9ET01BSU5fVFlQRTogeworCQkJCUNvb2tpZURvbWFpblR5cGUgY29va2llRG9tYWluVHlwZSA9IChDb29raWVEb21haW5UeXBlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQ29va2llRG9tYWluVHlwZShjb29raWVEb21haW5UeXBlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX05BTUVfVFlQRTogeworCQkJCUNvb2tpZU5hbWVUeXBlIGNvb2tpZU5hbWVUeXBlID0gKENvb2tpZU5hbWVUeXBlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQ29va2llTmFtZVR5cGUoY29va2llTmFtZVR5cGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfUEFUSF9UWVBFOiB7CisJCQkJQ29va2llUGF0aFR5cGUgY29va2llUGF0aFR5cGUgPSAoQ29va2llUGF0aFR5cGUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDb29raWVQYXRoVHlwZShjb29raWVQYXRoVHlwZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBXZWJQYWNrYWdlLkVSUk9SX1BBR0U6IHsKIAkJCQlFcnJvclBhZ2UgZXJyb3JQYWdlID0gKEVycm9yUGFnZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXJyb3JQYWdlKGVycm9yUGFnZSk7CisJCQkJVCByZXN1bHQgPSBjYXNlRXJyb3JQYWdlKGVycm9yUGFnZSk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUjogewogCQkJCUZpbHRlciBmaWx0ZXIgPSAoRmlsdGVyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGaWx0ZXIoZmlsdGVyKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VGaWx0ZXIoZmlsdGVyKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIFdlYlBhY2thZ2UuRklMVEVSX01BUFBJTkc6IHsKIAkJCQlGaWx0ZXJNYXBwaW5nIGZpbHRlck1hcHBpbmcgPSAoRmlsdGVyTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRmlsdGVyTWFwcGluZyhmaWx0ZXJNYXBwaW5nKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VGaWx0ZXJNYXBwaW5nKGZpbHRlck1hcHBpbmcpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgV2ViUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJRzogewogCQkJCUZvcm1Mb2dpbkNvbmZpZyBmb3JtTG9naW5Db25maWcgPSAoRm9ybUxvZ2luQ29uZmlnKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VGb3JtTG9naW5Db25maWcoZm9ybUxvZ2luQ29uZmlnKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VGb3JtTG9naW5Db25maWcoZm9ybUxvZ2luQ29uZmlnKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIFdlYlBhY2thZ2UuTE9DQUxFX0VOQ09ESU5HX01BUFBJTkc6IHsKIAkJCQlMb2NhbGVFbmNvZGluZ01hcHBpbmcgbG9jYWxlRW5jb2RpbmdNYXBwaW5nID0gKExvY2FsZUVuY29kaW5nTWFwcGluZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9jYWxlRW5jb2RpbmdNYXBwaW5nKGxvY2FsZUVuY29kaW5nTWFwcGluZyk7CisJCQkJVCByZXN1bHQgPSBjYXNlTG9jYWxlRW5jb2RpbmdNYXBwaW5nKGxvY2FsZUVuY29kaW5nTWFwcGluZyk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBXZWJQYWNrYWdlLkxPQ0FMRV9FTkNPRElOR19NQVBQSU5HX0xJU1Q6IHsKIAkJCQlMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IGxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QgPSAoTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdChsb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0KGxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgV2ViUGFja2FnZS5MT0dJTl9DT05GSUc6IHsKIAkJCQlMb2dpbkNvbmZpZyBsb2dpbkNvbmZpZyA9IChMb2dpbkNvbmZpZyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTG9naW5Db25maWcobG9naW5Db25maWcpOworCQkJCVQgcmVzdWx0ID0gY2FzZUxvZ2luQ29uZmlnKGxvZ2luQ29uZmlnKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIFdlYlBhY2thZ2UuTUlNRV9NQVBQSU5HOiB7CiAJCQkJTWltZU1hcHBpbmcgbWltZU1hcHBpbmcgPSAoTWltZU1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU1pbWVNYXBwaW5nKG1pbWVNYXBwaW5nKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VNaW1lTWFwcGluZyhtaW1lTWFwcGluZyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBXZWJQYWNrYWdlLk1VTFRJUEFSVF9DT05GSUdfVFlQRTogeworCQkJCU11bHRpcGFydENvbmZpZ1R5cGUgbXVsdGlwYXJ0Q29uZmlnVHlwZSA9IChNdWx0aXBhcnRDb25maWdUeXBlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlTXVsdGlwYXJ0Q29uZmlnVHlwZShtdWx0aXBhcnRDb25maWdUeXBlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIFdlYlBhY2thZ2UuT1JERVJJTkdfT1JERVJJTkdfVFlQRTogeworCQkJCU9yZGVyaW5nT3JkZXJpbmdUeXBlIG9yZGVyaW5nT3JkZXJpbmdUeXBlID0gKE9yZGVyaW5nT3JkZXJpbmdUeXBlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlT3JkZXJpbmdPcmRlcmluZ1R5cGUob3JkZXJpbmdPcmRlcmluZ1R5cGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgV2ViUGFja2FnZS5PUkRFUklOR19PVEhFUlNfVFlQRTogeworCQkJCU9yZGVyaW5nT3RoZXJzVHlwZSBvcmRlcmluZ090aGVyc1R5cGUgPSAoT3JkZXJpbmdPdGhlcnNUeXBlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlT3JkZXJpbmdPdGhlcnNUeXBlKG9yZGVyaW5nT3RoZXJzVHlwZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBXZWJQYWNrYWdlLk9SREVSSU5HX1RZUEU6IHsKKwkJCQlPcmRlcmluZ1R5cGUgb3JkZXJpbmdUeXBlID0gKE9yZGVyaW5nVHlwZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZU9yZGVyaW5nVHlwZShvcmRlcmluZ1R5cGUpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgV2ViUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UOiB7CiAJCQkJU2VjdXJpdHlDb25zdHJhaW50IHNlY3VyaXR5Q29uc3RyYWludCA9IChTZWN1cml0eUNvbnN0cmFpbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlY3VyaXR5Q29uc3RyYWludChzZWN1cml0eUNvbnN0cmFpbnQpOworCQkJCVQgcmVzdWx0ID0gY2FzZVNlY3VyaXR5Q29uc3RyYWludChzZWN1cml0eUNvbnN0cmFpbnQpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUOiB7CiAJCQkJU2VydmxldCBzZXJ2bGV0ID0gKFNlcnZsZXQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZsZXQoc2VydmxldCk7CisJCQkJVCByZXN1bHQgPSBjYXNlU2VydmxldChzZXJ2bGV0KTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIFdlYlBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HOiB7CiAJCQkJU2VydmxldE1hcHBpbmcgc2VydmxldE1hcHBpbmcgPSAoU2VydmxldE1hcHBpbmcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlcnZsZXRNYXBwaW5nKHNlcnZsZXRNYXBwaW5nKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VTZXJ2bGV0TWFwcGluZyhzZXJ2bGV0TWFwcGluZyk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBXZWJQYWNrYWdlLlNFU1NJT05fQ09ORklHOiB7CiAJCQkJU2Vzc2lvbkNvbmZpZyBzZXNzaW9uQ29uZmlnID0gKFNlc3Npb25Db25maWcpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVNlc3Npb25Db25maWcoc2Vzc2lvbkNvbmZpZyk7CisJCQkJVCByZXN1bHQgPSBjYXNlU2Vzc2lvbkNvbmZpZyhzZXNzaW9uQ29uZmlnKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIFdlYlBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlQ6IHsKIAkJCQlVc2VyRGF0YUNvbnN0cmFpbnQgdXNlckRhdGFDb25zdHJhaW50ID0gKFVzZXJEYXRhQ29uc3RyYWludCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVXNlckRhdGFDb25zdHJhaW50KHVzZXJEYXRhQ29uc3RyYWludCk7CisJCQkJVCByZXN1bHQgPSBjYXNlVXNlckRhdGFDb25zdHJhaW50KHVzZXJEYXRhQ29uc3RyYWludCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFA6IHsKIAkJCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2ViQXBwKHdlYkFwcCk7CisJCQkJVCByZXN1bHQgPSBjYXNlV2ViQXBwKHdlYkFwcCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SOiB7CiAJCQkJV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3Igd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IgPSAoV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcih3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9GUkFHTUVOVDogeworCQkJCVdlYkZyYWdtZW50IHdlYkZyYWdtZW50ID0gKFdlYkZyYWdtZW50KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlV2ViRnJhZ21lbnQod2ViRnJhZ21lbnQpOwogCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CiAJCQkJcmV0dXJuIHJlc3VsdDsKIAkJCX0KIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTjogewogCQkJCVdlYlJlc291cmNlQ29sbGVjdGlvbiB3ZWJSZXNvdXJjZUNvbGxlY3Rpb24gPSAoV2ViUmVzb3VyY2VDb2xsZWN0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWJSZXNvdXJjZUNvbGxlY3Rpb24od2ViUmVzb3VyY2VDb2xsZWN0aW9uKTsKKwkJCQlUIHJlc3VsdCA9IGNhc2VXZWJSZXNvdXJjZUNvbGxlY3Rpb24od2ViUmVzb3VyY2VDb2xsZWN0aW9uKTsKIAkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1Q6IHsKIAkJCQlXZWxjb21lRmlsZUxpc3Qgd2VsY29tZUZpbGVMaXN0ID0gKFdlbGNvbWVGaWxlTGlzdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2VsY29tZUZpbGVMaXN0KHdlbGNvbWVGaWxlTGlzdCk7CisJCQkJVCByZXN1bHQgPSBjYXNlV2VsY29tZUZpbGVMaXN0KHdlbGNvbWVGaWxlTGlzdCk7CiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQpAQCAtMjA2LDI4NyArMjcyLDQ1MiBAQAogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzb2x1dGUgT3JkZXJpbmcgVHlwZTwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwogCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWJzb2x1dGUgT3JkZXJpbmcgVHlwZTwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlQXV0aENvbnN0cmFpbnQoQXV0aENvbnN0cmFpbnQgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUFic29sdXRlT3JkZXJpbmdUeXBlKEFic29sdXRlT3JkZXJpbmdUeXBlIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXJyb3IgUGFnZTwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXJyb3IgUGFnZTwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdXRoIENvbnN0cmFpbnQ8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVycm9yUGFnZShFcnJvclBhZ2Ugb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvb2tpZSBDb21tZW50IFR5cGU8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvb2tpZSBDb21tZW50IFR5cGU8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlcihGaWx0ZXIgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUNvb2tpZUNvbW1lbnRUeXBlKENvb2tpZUNvbW1lbnRUeXBlIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29va2llIENvbmZpZyBUeXBlPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbHRlciBNYXBwaW5nPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvb2tpZSBDb25maWcgVHlwZTwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlRmlsdGVyTWFwcGluZyhGaWx0ZXJNYXBwaW5nIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VDb29raWVDb25maWdUeXBlKENvb2tpZUNvbmZpZ1R5cGUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db29raWUgRG9tYWluIFR5cGU8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29va2llIERvbWFpbiBUeXBlPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VDb29raWVEb21haW5UeXBlKENvb2tpZURvbWFpblR5cGUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZzwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db29raWUgTmFtZSBUeXBlPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvb2tpZSBOYW1lIFR5cGU8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUxvY2FsZUVuY29kaW5nTWFwcGluZyhMb2NhbGVFbmNvZGluZ01hcHBpbmcgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUNvb2tpZU5hbWVUeXBlKENvb2tpZU5hbWVUeXBlIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9jYWxlIEVuY29kaW5nIE1hcHBpbmcgTGlzdDwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db29raWUgUGF0aCBUeXBlPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29va2llIFBhdGggVHlwZTwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdChMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VDb29raWVQYXRoVHlwZShDb29raWVQYXRoVHlwZSBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvZ2luIENvbmZpZzwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FcnJvciBQYWdlPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvZ2luIENvbmZpZzwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FcnJvciBQYWdlPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlRXJyb3JQYWdlKEVycm9yUGFnZSBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbWUgTWFwcGluZzwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GaWx0ZXI8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWltZSBNYXBwaW5nPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbHRlcjwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlTWltZU1hcHBpbmcoTWltZU1hcHBpbmcgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUZpbHRlcihGaWx0ZXIgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZpbHRlciBNYXBwaW5nPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2VtPicuCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RmlsdGVyIE1hcHBpbmc8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Q29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUZpbHRlck1hcHBpbmcoRmlsdGVyTWFwcGluZyBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQ8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Rm9ybSBMb2dpbiBDb25maWc8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldDwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Gb3JtIExvZ2luIENvbmZpZzwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VydmxldChTZXJ2bGV0IG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldCBNYXBwaW5nPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZzwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlU2VydmxldE1hcHBpbmcoU2VydmxldE1hcHBpbmcgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZUxvY2FsZUVuY29kaW5nTWFwcGluZyhMb2NhbGVFbmNvZGluZ01hcHBpbmcgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXNzaW9uIENvbmZpZzwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Mb2NhbGUgRW5jb2RpbmcgTWFwcGluZyBMaXN0PC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlc3Npb24gQ29uZmlnPC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvY2FsZSBFbmNvZGluZyBNYXBwaW5nIExpc3Q8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVNlc3Npb25Db25maWcoU2Vzc2lvbkNvbmZpZyBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdChMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VXNlciBEYXRhIENvbnN0cmFpbnQ8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TG9naW4gQ29uZmlnPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxvZ2luIENvbmZpZzwvZW0+Jy4KIAkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIE9iamVjdCBjYXNlVXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCBvYmplY3QpIHsKKwlwdWJsaWMgVCBjYXNlTG9naW5Db25maWcoTG9naW5Db25maWcgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHA8L2VtPicuCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWltZSBNYXBwaW5nPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcDwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NaW1lIE1hcHBpbmc8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlYkFwcChXZWJBcHAgb2JqZWN0KSB7CisJcHVibGljIFQgY2FzZU1pbWVNYXBwaW5nKE1pbWVNYXBwaW5nIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NdWx0aXBhcnQgQ29uZmlnIFR5cGU8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NdWx0aXBhcnQgQ29uZmlnIFR5cGU8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VNdWx0aXBhcnRDb25maWdUeXBlKE11bHRpcGFydENvbmZpZ1R5cGUgb2JqZWN0KSB7CiAJCXJldHVybiBudWxsOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBDb2xsZWN0aW9uPC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9yZGVyaW5nIE9yZGVyaW5nIFR5cGU8L2VtPicuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKIAkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+Jy4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcmRlcmluZyBPcmRlcmluZyBUeXBlPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJSZXNvdXJjZUNvbGxlY3Rpb24oV2ViUmVzb3VyY2VDb2xsZWN0aW9uIG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VPcmRlcmluZ09yZGVyaW5nVHlwZShPcmRlcmluZ09yZGVyaW5nVHlwZSBvYmplY3QpIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlbGNvbWUgRmlsZSBMaXN0PC9lbT4nLgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9yZGVyaW5nIE90aGVycyBUeXBlPC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlbGNvbWUgRmlsZSBMaXN0PC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9yZGVyaW5nIE90aGVycyBUeXBlPC9lbT4nLgogCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXZWxjb21lRmlsZUxpc3QoV2VsY29tZUZpbGVMaXN0IG9iamVjdCkgeworCXB1YmxpYyBUIGNhc2VPcmRlcmluZ090aGVyc1R5cGUoT3JkZXJpbmdPdGhlcnNUeXBlIG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcmRlcmluZyBUeXBlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3JkZXJpbmcgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZU9yZGVyaW5nVHlwZShPcmRlcmluZ1R5cGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3VyaXR5IENvbnN0cmFpbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN1cml0eSBDb25zdHJhaW50PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU2VjdXJpdHlDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U2VydmxldDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VTZXJ2bGV0KFNlcnZsZXQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlcnZsZXQgTWFwcGluZzwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVNlcnZsZXRNYXBwaW5nKFNlcnZsZXRNYXBwaW5nIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZXNzaW9uIENvbmZpZzwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlc3Npb24gQ29uZmlnPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlU2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Vc2VyIERhdGEgQ29uc3RyYWludDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVzZXIgRGF0YSBDb25zdHJhaW50PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlVXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlV2ViQXBwKFdlYkFwcCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcihXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RnJhZ21lbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GcmFnbWVudDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVdlYkZyYWdtZW50KFdlYkZyYWdtZW50IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBDb2xsZWN0aW9uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2UgQ29sbGVjdGlvbjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlbGNvbWUgRmlsZSBMaXN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2VsY29tZSBGaWxlIExpc3Q8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VXZWxjb21lRmlsZUxpc3QoV2VsY29tZUZpbGVMaXN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CiAJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCiAJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKKwlwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlZhbGlkYXRvci5qYXZhCmluZGV4IDNmNjllY2YuLjAwMjhiZjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViVmFsaWRhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJWYWxpZGF0b3IuamF2YQpAQCAtMTIsMTMgKzEyLDEzIEBACiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIAotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljQ2hhaW47CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKIApAQCAtMTAwLDIwICsxMDAsMzQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewogCSAgcmV0dXJuIFdlYlBhY2thZ2UuZUlOU1RBTkNFOwogCX0KIAogCS8qKgotCSAqIENhbGxzIDxjb2RlPnZhbGlkYXRlWFhYPC9jb2RlPiBmb3IgdGhlIGNvcnJlc29uZGluZyBjbGFzc2lmaWVyIG9mIHRoZSBtb2RlbC4KKwkgKiBDYWxscyA8Y29kZT52YWxpZGF0ZVhYWDwvY29kZT4gZm9yIHRoZSBjb3JyZXNwb25kaW5nIGNsYXNzaWZpZXIgb2YgdGhlIG1vZGVsLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKGludCBjbGFzc2lmaWVySUQsIE9iamVjdCB2YWx1ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlKGludCBjbGFzc2lmaWVySUQsIE9iamVjdCB2YWx1ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgV2ViUGFja2FnZS5BQlNPTFVURV9PUkRFUklOR19UWVBFOgorCQkJCXJldHVybiB2YWxpZGF0ZUFic29sdXRlT3JkZXJpbmdUeXBlKChBYnNvbHV0ZU9yZGVyaW5nVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQkJY2FzZSBXZWJQYWNrYWdlLkFVVEhfQ09OU1RSQUlOVDoKIAkJCQlyZXR1cm4gdmFsaWRhdGVBdXRoQ29uc3RyYWludCgoQXV0aENvbnN0cmFpbnQpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfQ09NTUVOVF9UWVBFOgorCQkJCXJldHVybiB2YWxpZGF0ZUNvb2tpZUNvbW1lbnRUeXBlKChDb29raWVDb21tZW50VHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9DT05GSUdfVFlQRToKKwkJCQlyZXR1cm4gdmFsaWRhdGVDb29raWVDb25maWdUeXBlKChDb29raWVDb25maWdUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJCQljYXNlIFdlYlBhY2thZ2UuQ09PS0lFX0RPTUFJTl9UWVBFOgorCQkJCXJldHVybiB2YWxpZGF0ZUNvb2tpZURvbWFpblR5cGUoKENvb2tpZURvbWFpblR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwkJCWNhc2UgV2ViUGFja2FnZS5DT09LSUVfTkFNRV9UWVBFOgorCQkJCXJldHVybiB2YWxpZGF0ZUNvb2tpZU5hbWVUeXBlKChDb29raWVOYW1lVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOworCQkJY2FzZSBXZWJQYWNrYWdlLkNPT0tJRV9QQVRIX1RZUEU6CisJCQkJcmV0dXJuIHZhbGlkYXRlQ29va2llUGF0aFR5cGUoKENvb2tpZVBhdGhUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuRVJST1JfUEFHRToKIAkJCQlyZXR1cm4gdmFsaWRhdGVFcnJvclBhZ2UoKEVycm9yUGFnZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQkJY2FzZSBXZWJQYWNrYWdlLkZJTFRFUjoKQEAgLTEzMCw2ICsxNDQsMTQgQEAKIAkJCQlyZXR1cm4gdmFsaWRhdGVMb2dpbkNvbmZpZygoTG9naW5Db25maWcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgV2ViUGFja2FnZS5NSU1FX01BUFBJTkc6CiAJCQkJcmV0dXJuIHZhbGlkYXRlTWltZU1hcHBpbmcoKE1pbWVNYXBwaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJCQljYXNlIFdlYlBhY2thZ2UuTVVMVElQQVJUX0NPTkZJR19UWVBFOgorCQkJCXJldHVybiB2YWxpZGF0ZU11bHRpcGFydENvbmZpZ1R5cGUoKE11bHRpcGFydENvbmZpZ1R5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwkJCWNhc2UgV2ViUGFja2FnZS5PUkRFUklOR19PUkRFUklOR19UWVBFOgorCQkJCXJldHVybiB2YWxpZGF0ZU9yZGVyaW5nT3JkZXJpbmdUeXBlKChPcmRlcmluZ09yZGVyaW5nVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOworCQkJY2FzZSBXZWJQYWNrYWdlLk9SREVSSU5HX09USEVSU19UWVBFOgorCQkJCXJldHVybiB2YWxpZGF0ZU9yZGVyaW5nT3RoZXJzVHlwZSgoT3JkZXJpbmdPdGhlcnNUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJCQljYXNlIFdlYlBhY2thZ2UuT1JERVJJTkdfVFlQRToKKwkJCQlyZXR1cm4gdmFsaWRhdGVPcmRlcmluZ1R5cGUoKE9yZGVyaW5nVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQkJY2FzZSBXZWJQYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlQ6CiAJCQkJcmV0dXJuIHZhbGlkYXRlU2VjdXJpdHlDb25zdHJhaW50KChTZWN1cml0eUNvbnN0cmFpbnQpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgV2ViUGFja2FnZS5TRVJWTEVUOgpAQCAtMTQ0LDYgKzE2Niw4IEBACiAJCQkJcmV0dXJuIHZhbGlkYXRlV2ViQXBwKChXZWJBcHApdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUjoKIAkJCQlyZXR1cm4gdmFsaWRhdGVXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigoV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwkJCWNhc2UgV2ViUGFja2FnZS5XRUJfRlJBR01FTlQ6CisJCQkJcmV0dXJuIHZhbGlkYXRlV2ViRnJhZ21lbnQoKFdlYkZyYWdtZW50KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT046CiAJCQkJcmV0dXJuIHZhbGlkYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uKChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgV2ViUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVDoKQEAgLTE1Miw2ICsxNzYsOCBAQAogCQkJCXJldHVybiB2YWxpZGF0ZURpc3BhdGNoZXJUeXBlKChEaXNwYXRjaGVyVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQkJY2FzZSBXZWJQYWNrYWdlLk5VTExfQ0hBUl9UWVBFOgogCQkJCXJldHVybiB2YWxpZGF0ZU51bGxDaGFyVHlwZSgoTnVsbENoYXJUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJCQljYXNlIFdlYlBhY2thZ2UuVFJBQ0tJTkdfTU9ERV9UWVBFOgorCQkJCXJldHVybiB2YWxpZGF0ZVRyYWNraW5nTW9kZVR5cGUoKFRyYWNraW5nTW9kZVR5cGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJCWNhc2UgV2ViUGFja2FnZS5UUkFOU1BPUlRfR1VBUkFOVEVFX1RZUEU6CiAJCQkJcmV0dXJuIHZhbGlkYXRlVHJhbnNwb3J0R3VhcmFudGVlVHlwZSgoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQkJY2FzZSBXZWJQYWNrYWdlLldFQl9BUFBfVkVSU0lPTl9UWVBFOgpAQCAtMTgwLDEzICsyMDYsMTUgQEAKIAkJCQlyZXR1cm4gdmFsaWRhdGVOdWxsQ2hhclR5cGVPYmplY3QoKE51bGxDaGFyVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQkJY2FzZSBXZWJQYWNrYWdlLlNFUlZMRVRfTkFNRV9UWVBFOgogCQkJCXJldHVybiB2YWxpZGF0ZVNlcnZsZXROYW1lVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJCQljYXNlIFdlYlBhY2thZ2UuVFJBQ0tJTkdfTU9ERV9UWVBFX09CSkVDVDoKKwkJCQlyZXR1cm4gdmFsaWRhdGVUcmFja2luZ01vZGVUeXBlT2JqZWN0KChUcmFja2luZ01vZGVUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuVFJBTlNQT1JUX0dVQVJBTlRFRV9UWVBFX09CSkVDVDoKIAkJCQlyZXR1cm4gdmFsaWRhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0KChUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0FSX1BBVEhfVFlQRToKIAkJCQlyZXR1cm4gdmFsaWRhdGVXYXJQYXRoVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCQljYXNlIFdlYlBhY2thZ2UuV0VCX0FQUF9WRVJTSU9OX1RZUEVfT0JKRUNUOgogCQkJCXJldHVybiB2YWxpZGF0ZVdlYkFwcFZlcnNpb25UeXBlT2JqZWN0KChXZWJBcHBWZXJzaW9uVHlwZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJZGVmYXVsdDogCisJCQlkZWZhdWx0OgogCQkJCXJldHVybiB0cnVlOwogCQl9CiAJfQpAQCAtMTk2LDcgKzIyNCwxNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IGF1dGhDb25zdHJhaW50LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBYnNvbHV0ZU9yZGVyaW5nVHlwZShBYnNvbHV0ZU9yZGVyaW5nVHlwZSBhYnNvbHV0ZU9yZGVyaW5nVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpYWJzb2x1dGVPcmRlcmluZ1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IGF1dGhDb25zdHJhaW50LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClhdXRoQ29uc3RyYWludCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtMjA1LDcgKzI0Miw1MiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVycm9yUGFnZShFcnJvclBhZ2UgZXJyb3JQYWdlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb29raWVDb21tZW50VHlwZShDb29raWVDb21tZW50VHlwZSBjb29raWVDb21tZW50VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpY29va2llQ29tbWVudFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvb2tpZUNvbmZpZ1R5cGUoQ29va2llQ29uZmlnVHlwZSBjb29raWVDb25maWdUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCljb29raWVDb25maWdUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb29raWVEb21haW5UeXBlKENvb2tpZURvbWFpblR5cGUgY29va2llRG9tYWluVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpY29va2llRG9tYWluVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29va2llTmFtZVR5cGUoQ29va2llTmFtZVR5cGUgY29va2llTmFtZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CisJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWNvb2tpZU5hbWVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb29raWVQYXRoVHlwZShDb29raWVQYXRoVHlwZSBjb29raWVQYXRoVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpY29va2llUGF0aFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVycm9yUGFnZShFcnJvclBhZ2UgZXJyb3JQYWdlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCllcnJvclBhZ2UsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTIxNCw3ICsyOTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZpbHRlcihGaWx0ZXIgZmlsdGVyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGaWx0ZXIoRmlsdGVyIGZpbHRlciwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpZmlsdGVyLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0yMjMsNyArMzA1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGaWx0ZXJNYXBwaW5nKEZpbHRlck1hcHBpbmcgZmlsdGVyTWFwcGluZywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRmlsdGVyTWFwcGluZyhGaWx0ZXJNYXBwaW5nIGZpbHRlck1hcHBpbmcsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWZpbHRlck1hcHBpbmcsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTIzMiw3ICszMTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZvcm1Mb2dpbkNvbmZpZyhGb3JtTG9naW5Db25maWcgZm9ybUxvZ2luQ29uZmlnLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGb3JtTG9naW5Db25maWcoRm9ybUxvZ2luQ29uZmlnIGZvcm1Mb2dpbkNvbmZpZywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3QpZm9ybUxvZ2luQ29uZmlnLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0yNDEsNyArMzIzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMb2NhbGVFbmNvZGluZ01hcHBpbmcoTG9jYWxlRW5jb2RpbmdNYXBwaW5nIGxvY2FsZUVuY29kaW5nTWFwcGluZywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nKExvY2FsZUVuY29kaW5nTWFwcGluZyBsb2NhbGVFbmNvZGluZ01hcHBpbmcsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWxvY2FsZUVuY29kaW5nTWFwcGluZywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtMjUwLDcgKzMzMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdChMb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0IGxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvY2FsZUVuY29kaW5nTWFwcGluZ0xpc3QoTG9jYWxlRW5jb2RpbmdNYXBwaW5nTGlzdCBsb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClsb2NhbGVFbmNvZGluZ01hcHBpbmdMaXN0LCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0yNTksNyArMzQxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMb2dpbkNvbmZpZyhMb2dpbkNvbmZpZyBsb2dpbkNvbmZpZywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTG9naW5Db25maWcoTG9naW5Db25maWcgbG9naW5Db25maWcsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KWxvZ2luQ29uZmlnLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0yNjgsNyArMzUwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNaW1lTWFwcGluZyhNaW1lTWFwcGluZyBtaW1lTWFwcGluZywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWltZU1hcHBpbmcoTWltZU1hcHBpbmcgbWltZU1hcHBpbmcsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KW1pbWVNYXBwaW5nLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0yNzcsNyArMzU5LDQzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VjdXJpdHlDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBzZWN1cml0eUNvbnN0cmFpbnQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU11bHRpcGFydENvbmZpZ1R5cGUoTXVsdGlwYXJ0Q29uZmlnVHlwZSBtdWx0aXBhcnRDb25maWdUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCltdWx0aXBhcnRDb25maWdUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPcmRlcmluZ09yZGVyaW5nVHlwZShPcmRlcmluZ09yZGVyaW5nVHlwZSBvcmRlcmluZ09yZGVyaW5nVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpb3JkZXJpbmdPcmRlcmluZ1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU9yZGVyaW5nT3RoZXJzVHlwZShPcmRlcmluZ090aGVyc1R5cGUgb3JkZXJpbmdPdGhlcnNUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClvcmRlcmluZ090aGVyc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU9yZGVyaW5nVHlwZShPcmRlcmluZ1R5cGUgb3JkZXJpbmdUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClvcmRlcmluZ1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlY3VyaXR5Q29uc3RyYWludChTZWN1cml0eUNvbnN0cmFpbnQgc2VjdXJpdHlDb25zdHJhaW50LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClzZWN1cml0eUNvbnN0cmFpbnQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTI4Niw3ICs0MDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZsZXQoU2VydmxldCBzZXJ2bGV0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2bGV0KFNlcnZsZXQgc2VydmxldCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpc2VydmxldCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtMjk1LDcgKzQxMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VydmxldE1hcHBpbmcoU2VydmxldE1hcHBpbmcgc2VydmxldE1hcHBpbmcsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlcnZsZXRNYXBwaW5nKFNlcnZsZXRNYXBwaW5nIHNlcnZsZXRNYXBwaW5nLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClzZXJ2bGV0TWFwcGluZywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtMzA0LDcgKzQyMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIHNlc3Npb25Db25maWcsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVNlc3Npb25Db25maWcoU2Vzc2lvbkNvbmZpZyBzZXNzaW9uQ29uZmlnLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdClzZXNzaW9uQ29uZmlnLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0zMTMsNyArNDMxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVc2VyRGF0YUNvbnN0cmFpbnQoVXNlckRhdGFDb25zdHJhaW50IHVzZXJEYXRhQ29uc3RyYWludCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVXNlckRhdGFDb25zdHJhaW50KFVzZXJEYXRhQ29uc3RyYWludCB1c2VyRGF0YUNvbnN0cmFpbnQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXVzZXJEYXRhQ29uc3RyYWludCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtMzIyLDcgKzQ0MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2ViQXBwKFdlYkFwcCB3ZWJBcHAsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdlYkFwcChXZWJBcHAgd2ViQXBwLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCgoRU9iamVjdCl3ZWJBcHAsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTMzMSw3ICs0NDksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcihXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciB3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTM0MCw3ICs0NTgsMTYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oV2ViUmVzb3VyY2VDb2xsZWN0aW9uIHdlYlJlc291cmNlQ29sbGVjdGlvbiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2ViRnJhZ21lbnQoV2ViRnJhZ21lbnQgd2ViRnJhZ21lbnQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CisJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXdlYkZyYWdtZW50LCBkaWFnbm9zdGljcywgY29udGV4dCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oV2ViUmVzb3VyY2VDb2xsZWN0aW9uIHdlYlJlc291cmNlQ29sbGVjdGlvbiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoKEVPYmplY3Qpd2ViUmVzb3VyY2VDb2xsZWN0aW9uLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC0zNDksNyArNDc2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWxjb21lRmlsZUxpc3QoV2VsY29tZUZpbGVMaXN0IHdlbGNvbWVGaWxlTGlzdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2VsY29tZUZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCB3ZWxjb21lRmlsZUxpc3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KChFT2JqZWN0KXdlbGNvbWVGaWxlTGlzdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtMzU4LDcgKzQ4NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGlzcGF0Y2hlclR5cGUoRGlzcGF0Y2hlclR5cGUgZGlzcGF0Y2hlclR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURpc3BhdGNoZXJUeXBlKERpc3BhdGNoZXJUeXBlIGRpc3BhdGNoZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTM2Nyw3ICs0OTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU51bGxDaGFyVHlwZShOdWxsQ2hhclR5cGUgbnVsbENoYXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOdWxsQ2hhclR5cGUoTnVsbENoYXJUeXBlIG51bGxDaGFyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC0zNzYsNyArNTAzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgdHJhbnNwb3J0R3VhcmFudGVlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHJhY2tpbmdNb2RlVHlwZShUcmFja2luZ01vZGVUeXBlIHRyYWNraW5nTW9kZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtMzg1LDcgKzUxMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2ViQXBwVmVyc2lvblR5cGUoV2ViQXBwVmVyc2lvblR5cGUgd2ViQXBwVmVyc2lvblR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSB0cmFuc3BvcnRHdWFyYW50ZWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTM5NCw3ICs1MjEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF1dGhNZXRob2RUeXBlKFN0cmluZyBhdXRoTWV0aG9kVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2ViQXBwVmVyc2lvblR5cGUoV2ViQXBwVmVyc2lvblR5cGUgd2ViQXBwVmVyc2lvblR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtNDAzLDcgKzUzMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGlzcGF0Y2hlclR5cGVPYmplY3QoRGlzcGF0Y2hlclR5cGUgZGlzcGF0Y2hlclR5cGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF1dGhNZXRob2RUeXBlKFN0cmluZyBhdXRoTWV0aG9kVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC00MTIsNyArNTM5LDE2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW5jb2RpbmdUeXBlKFN0cmluZyBlbmNvZGluZ1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURpc3BhdGNoZXJUeXBlT2JqZWN0KERpc3BhdGNoZXJUeXBlIGRpc3BhdGNoZXJUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVuY29kaW5nVHlwZShTdHJpbmcgZW5jb2RpbmdUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRW5jb2RpbmdUeXBlX1BhdHRlcm4oZW5jb2RpbmdUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtNDI2LDcgKzU2Miw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBFTkNPRElOR19UWVBFX19QQVRURVJOX19WQUxVRVMgPQogCQluZXcgUGF0dGVybk1hdGNoZXIgW11bXSB7CiAJCQluZXcgUGF0dGVybk1hdGNoZXIgW10gewotCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCJbXlxcc10rIikKKwkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiW15cXHNdKyIpIC8vJE5PTi1OTFMtMSQKIAkJCX0KIAkJfTsKIApAQCAtNDM2LDcgKzU3Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW5jb2RpbmdUeXBlX1BhdHRlcm4oU3RyaW5nIGVuY29kaW5nVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW5jb2RpbmdUeXBlX1BhdHRlcm4oU3RyaW5nIGVuY29kaW5nVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlUGF0dGVybihXZWJQYWNrYWdlLkxpdGVyYWxzLkVOQ09ESU5HX1RZUEUsIGVuY29kaW5nVHlwZSwgRU5DT0RJTkdfVFlQRV9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC00NDUsNyArNTgxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFcnJvckNvZGVUeXBlKEJpZ0ludGVnZXIgZXJyb3JDb2RlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRXJyb3JDb2RlVHlwZShCaWdJbnRlZ2VyIGVycm9yQ29kZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCWJvb2xlYW4gcmVzdWx0ID0geG1sVHlwZVZhbGlkYXRvci52YWxpZGF0ZVBvc2l0aXZlSW50ZWdlcl9NaW4oZXJyb3JDb2RlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQlpZiAocmVzdWx0IHx8IGRpYWdub3N0aWNzICE9IG51bGwpIHJlc3VsdCAmPSB2YWxpZGF0ZUVycm9yQ29kZVR5cGVfUGF0dGVybihlcnJvckNvZGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCXJldHVybiByZXN1bHQ7CkBAIC00NjAsNyArNTk2LDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsICBQYXR0ZXJuTWF0Y2hlciBbXVtdIEVSUk9SX0NPREVfVFlQRV9fUEFUVEVSTl9fVkFMVUVTID0KIAkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdW10gewogCQkJbmV3IFBhdHRlcm5NYXRjaGVyIFtdIHsKLQkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiXFxkezN9IikKKwkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiXFxkezN9IikgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9OwogCkBAIC00NzAsNyArNjA2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFcnJvckNvZGVUeXBlX1BhdHRlcm4oQmlnSW50ZWdlciBlcnJvckNvZGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFcnJvckNvZGVUeXBlX1BhdHRlcm4oQmlnSW50ZWdlciBlcnJvckNvZGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKFdlYlBhY2thZ2UuTGl0ZXJhbHMuRVJST1JfQ09ERV9UWVBFLCBlcnJvckNvZGVUeXBlLCBFUlJPUl9DT0RFX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtNDc5LDcgKzYxNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRmlsdGVyTmFtZVR5cGUoU3RyaW5nIGZpbHRlck5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGaWx0ZXJOYW1lVHlwZShTdHJpbmcgZmlsdGVyTmFtZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOb25FbXB0eVN0cmluZ1R5cGVfTWluTGVuZ3RoKGZpbHRlck5hbWVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtNDg5LDcgKzYyNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHR0cE1ldGhvZFR5cGUoU3RyaW5nIGh0dHBNZXRob2RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIdHRwTWV0aG9kVHlwZShTdHJpbmcgaHR0cE1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIdHRwTWV0aG9kVHlwZV9QYXR0ZXJuKGh0dHBNZXRob2RUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtNTAzLDcgKzYzOSw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBIVFRQX01FVEhPRF9UWVBFX19QQVRURVJOX19WQUxVRVMgPQogCQluZXcgUGF0dGVybk1hdGNoZXIgW11bXSB7CiAJCQluZXcgUGF0dGVybk1hdGNoZXIgW10gewotCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCJbXFxwe0x9LVtcXHB7Q2N9XFxwe1p9XV0rIikKKwkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiWyEtfi1bXFwoXFwpPD5ALDs6XCIvXFxbXFxdPz1cXHtcXH1cXFxcXFxwe1p9XV0rIikgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9OwogCkBAIC01MTMsNyArNjQ5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIdHRwTWV0aG9kVHlwZV9QYXR0ZXJuKFN0cmluZyBodHRwTWV0aG9kVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHR0cE1ldGhvZFR5cGVfUGF0dGVybihTdHJpbmcgaHR0cE1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB2YWxpZGF0ZVBhdHRlcm4oV2ViUGFja2FnZS5MaXRlcmFscy5IVFRQX01FVEhPRF9UWVBFLCBodHRwTWV0aG9kVHlwZSwgSFRUUF9NRVRIT0RfVFlQRV9fUEFUVEVSTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJfQogCkBAIC01MjIsNyArNjU4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMb2FkT25TdGFydHVwVHlwZShPYmplY3QgbG9hZE9uU3RhcnR1cFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvYWRPblN0YXJ0dXBUeXBlKE9iamVjdCBsb2FkT25TdGFydHVwVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUxvYWRPblN0YXJ0dXBUeXBlX01lbWJlclR5cGVzKGxvYWRPblN0YXJ0dXBUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtNTMzLDcgKzY2OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTG9hZE9uU3RhcnR1cFR5cGVfTWVtYmVyVHlwZXMoT2JqZWN0IGxvYWRPblN0YXJ0dXBUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMb2FkT25TdGFydHVwVHlwZV9NZW1iZXJUeXBlcyhPYmplY3QgbG9hZE9uU3RhcnR1cFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCWlmIChkaWFnbm9zdGljcyAhPSBudWxsKSB7CiAJCQlCYXNpY0RpYWdub3N0aWMgdGVtcERpYWdub3N0aWNzID0gbmV3IEJhc2ljRGlhZ25vc3RpYygpOwogCQkJaWYgKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTlVMTF9DSEFSX1RZUEUuaXNJbnN0YW5jZShsb2FkT25TdGFydHVwVHlwZSkpIHsKQEAgLTU0Miw5ICs2NzgsOCBAQAogCQkJaWYgKFhNTFR5cGVQYWNrYWdlLkxpdGVyYWxzLklOVEVHRVIuaXNJbnN0YW5jZShsb2FkT25TdGFydHVwVHlwZSkpIHsKIAkJCQlpZiAoeG1sVHlwZVZhbGlkYXRvci52YWxpZGF0ZUludGVnZXIoKEJpZ0ludGVnZXIpbG9hZE9uU3RhcnR1cFR5cGUsIHRlbXBEaWFnbm9zdGljcywgY29udGV4dCkpIHJldHVybiB0cnVlOwogCQkJfQotCQkJTGlzdCBjaGlsZHJlbiA9IHRlbXBEaWFnbm9zdGljcy5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJCWRpYWdub3N0aWNzLmFkZCgoRGlhZ25vc3RpYyljaGlsZHJlbi5nZXQoaSkpOworCQkJZm9yIChEaWFnbm9zdGljIGRpYWdub3N0aWMgOiB0ZW1wRGlhZ25vc3RpY3MuZ2V0Q2hpbGRyZW4oKSkgeworCQkJCWRpYWdub3N0aWNzLmFkZChkaWFnbm9zdGljKTsKIAkJCX0KIAkJfQogCQllbHNlIHsKQEAgLTU2Myw3ICs2OTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvY2FsZVR5cGUoU3RyaW5nIGxvY2FsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvY2FsZVR5cGUoU3RyaW5nIGxvY2FsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVMb2NhbGVUeXBlX1BhdHRlcm4obG9jYWxlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTU3Nyw3ICs3MTIsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgIFBhdHRlcm5NYXRjaGVyIFtdW10gTE9DQUxFX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUyA9CiAJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXVtdIHsKIAkJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXSB7Ci0JCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIlthLXpdezJ9KF98LSk/KFtcXHB7TH1cXC1cXHB7TmR9XXsyfSk/IikKKwkJCQlYTUxUeXBlVXRpbC5jcmVhdGVQYXR0ZXJuTWF0Y2hlcigiW2Etel17Mn0oX3wtKT8oW1xccHtMfVxcLVxccHtOZH1dezJ9KT8iKSAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX07CiAKQEAgLTU4Nyw3ICs3MjIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxvY2FsZVR5cGVfUGF0dGVybihTdHJpbmcgbG9jYWxlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTG9jYWxlVHlwZV9QYXR0ZXJuKFN0cmluZyBsb2NhbGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTE9DQUxFX1RZUEUsIGxvY2FsZVR5cGUsIExPQ0FMRV9UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTU5Niw3ICs3MzEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1pbWVUeXBlVHlwZShTdHJpbmcgbWltZVR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNaW1lVHlwZVR5cGUoU3RyaW5nIG1pbWVUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU1pbWVUeXBlVHlwZV9QYXR0ZXJuKG1pbWVUeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTYxMCw3ICs3NDUsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgIFBhdHRlcm5NYXRjaGVyIFtdW10gTUlNRV9UWVBFX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUyA9CiAJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXVtdIHsKIAkJCW5ldyBQYXR0ZXJuTWF0Y2hlciBbXSB7Ci0JCQkJWE1MVHlwZVV0aWwuY3JlYXRlUGF0dGVybk1hdGNoZXIoIlteXFxwe0NjfV5cXHNdKy9bXlxccHtDY31eXFxzXSsiKQorCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCJbXlxccHtDY31eXFxzXSsvW15cXHB7Q2N9Xlxcc10rIikgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9OwogCkBAIC02MjAsNyArNzU1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNaW1lVHlwZVR5cGVfUGF0dGVybihTdHJpbmcgbWltZVR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNaW1lVHlwZVR5cGVfUGF0dGVybihTdHJpbmcgbWltZVR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlyZXR1cm4gdmFsaWRhdGVQYXR0ZXJuKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTUlNRV9UWVBFX1RZUEUsIG1pbWVUeXBlVHlwZSwgTUlNRV9UWVBFX1RZUEVfX1BBVFRFUk5fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCX0KIApAQCAtNjI5LDcgKzc2NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTm9uRW1wdHlTdHJpbmdUeXBlKFN0cmluZyBub25FbXB0eVN0cmluZ1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKKwlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5vbkVtcHR5U3RyaW5nVHlwZShTdHJpbmcgbm9uRW1wdHlTdHJpbmdUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcDxPYmplY3QsIE9iamVjdD4gY29udGV4dCkgewogCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTm9uRW1wdHlTdHJpbmdUeXBlX01pbkxlbmd0aChub25FbXB0eVN0cmluZ1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC02NDAsMTAgKzc3NSwxMCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5vbkVtcHR5U3RyaW5nVHlwZV9NaW5MZW5ndGgoU3RyaW5nIG5vbkVtcHR5U3RyaW5nVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbm9uRW1wdHlTdHJpbmdUeXBlLmxlbmd0aCgpOyAgCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOb25FbXB0eVN0cmluZ1R5cGVfTWluTGVuZ3RoKFN0cmluZyBub25FbXB0eVN0cmluZ1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CisJCWludCBsZW5ndGggPSBub25FbXB0eVN0cmluZ1R5cGUubGVuZ3RoKCk7CiAJCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoID49IDE7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAorCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKQogCQkJcmVwb3J0TWluTGVuZ3RoVmlvbGF0aW9uKFdlYlBhY2thZ2UuTGl0ZXJhbHMuTk9OX0VNUFRZX1NUUklOR19UWVBFLCBub25FbXB0eVN0cmluZ1R5cGUsIGxlbmd0aCwgMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTY1Myw3ICs3ODgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU51bGxDaGFyVHlwZU9iamVjdChOdWxsQ2hhclR5cGUgbnVsbENoYXJUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOdWxsQ2hhclR5cGVPYmplY3QoTnVsbENoYXJUeXBlIG51bGxDaGFyVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC02NjIsNyArNzk3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTZXJ2bGV0TmFtZVR5cGUoU3RyaW5nIHNlcnZsZXROYW1lVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU2VydmxldE5hbWVUeXBlKFN0cmluZyBzZXJ2bGV0TmFtZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOb25FbXB0eVN0cmluZ1R5cGVfTWluTGVuZ3RoKHNlcnZsZXROYW1lVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KQEAgLTY3Miw3ICs4MDcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGVPYmplY3QoVHJhbnNwb3J0R3VhcmFudGVlVHlwZSB0cmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUcmFja2luZ01vZGVUeXBlT2JqZWN0KFRyYWNraW5nTW9kZVR5cGUgdHJhY2tpbmdNb2RlVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC02ODEsNyArODE2LDE2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2FyUGF0aFR5cGUoU3RyaW5nIHdhclBhdGhUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUcmFuc3BvcnRHdWFyYW50ZWVUeXBlT2JqZWN0KFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgdHJhbnNwb3J0R3VhcmFudGVlVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXYXJQYXRoVHlwZShTdHJpbmcgd2FyUGF0aFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVXYXJQYXRoVHlwZV9QYXR0ZXJuKHdhclBhdGhUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtNjk1LDcgKzgzOSw3IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCAgUGF0dGVybk1hdGNoZXIgW11bXSBXQVJfUEFUSF9UWVBFX19QQVRURVJOX19WQUxVRVMgPQogCQluZXcgUGF0dGVybk1hdGNoZXIgW11bXSB7CiAJCQluZXcgUGF0dGVybk1hdGNoZXIgW10gewotCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCIvLioiKQorCQkJCVhNTFR5cGVVdGlsLmNyZWF0ZVBhdHRlcm5NYXRjaGVyKCIvLioiKSAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX07CiAKQEAgLTcwNSw3ICs4NDksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdhclBhdGhUeXBlX1BhdHRlcm4oU3RyaW5nIHdhclBhdGhUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7CisJcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXYXJQYXRoVHlwZV9QYXR0ZXJuKFN0cmluZyB3YXJQYXRoVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXA8T2JqZWN0LCBPYmplY3Q+IGNvbnRleHQpIHsKIAkJcmV0dXJuIHZhbGlkYXRlUGF0dGVybihXZWJQYWNrYWdlLkxpdGVyYWxzLldBUl9QQVRIX1RZUEUsIHdhclBhdGhUeXBlLCBXQVJfUEFUSF9UWVBFX19QQVRURVJOX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKIAl9CiAKQEAgLTcxNCw4ICs4NTgsMjIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWJBcHBWZXJzaW9uVHlwZU9iamVjdChXZWJBcHBWZXJzaW9uVHlwZSB3ZWJBcHBWZXJzaW9uVHlwZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgeworCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2ViQXBwVmVyc2lvblR5cGVPYmplY3QoV2ViQXBwVmVyc2lvblR5cGUgd2ViQXBwVmVyc2lvblR5cGVPYmplY3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwPE9iamVjdCwgT2JqZWN0PiBjb250ZXh0KSB7CiAJCXJldHVybiB0cnVlOwogCX0KIAorCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc291cmNlIGxvY2F0b3IgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZmV0Y2ggbWVzc2FnZXMgZm9yIHRoaXMgdmFsaWRhdG9yJ3MgZGlhZ25vc3RpY3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisJCS8vIFRPRE8KKwkJLy8gU3BlY2lhbGl6ZSB0aGlzIHRvIHJldHVybiBhIHJlc291cmNlIGxvY2F0b3IgZm9yIG1lc3NhZ2VzIHNwZWNpZmljIHRvIHRoaXMgdmFsaWRhdG9yLgorCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAorCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VMb2NhdG9yKCk7CisJfQorCiB9IC8vV2ViVmFsaWRhdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlhNTEhlbHBlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViWE1MSGVscGVySW1wbC5qYXZhCmluZGV4IDE3MWQzOGYuLjViM2NiZjUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViWE1MSGVscGVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViWE1MSGVscGVySW1wbC5qYXZhCkBAIC0yMiwxNiArMjIsMTcgQEAKIAogCXB1YmxpYyBXZWJYTUxIZWxwZXJJbXBsKFhNTFJlc291cmNlIHJlc291cmNlKSB7CiAJCXN1cGVyKHJlc291cmNlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRVUkkoU3RyaW5nIHByZWZpeCkgewotCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscygiIikpCisJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXguZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAogCQkJcmV0dXJuIFdlYlBhY2thZ2UuZU5TX1VSSTsKIAkJZWxzZQogCQkJcmV0dXJuIHN1cGVyLmdldFVSSShwcmVmaXgpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0UU5hbWUoRVBhY2thZ2UgZVBhY2thZ2UsIFN0cmluZyBuYW1lLCBib29sZWFuIG11c3RIYXZlUHJlZml4KSB7CiAJCVN0cmluZyBuc1ByZWZpeCA9IGdldFByZWZpeChlUGFja2FnZSwgbXVzdEhhdmVQcmVmaXgpOwogCQkvLyBOb3QgdXNpbmcgRUU1IHBhY2thZ2UgbmFtZXNwYWNlIC0gZGVmYXVsdCBqZWU1IG5hbWVzcGFjZSBpcyB1c2VkCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlhNTFByb2Nlc3Nvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWIvaW50ZXJuYWwvdXRpbC9XZWJYTUxQcm9jZXNzb3IuamF2YQppbmRleCAzYThmZjE4Li5iMjBkZGYxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYi9pbnRlcm5hbC91dGlsL1dlYlhNTFByb2Nlc3Nvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViL2ludGVybmFsL3V0aWwvV2ViWE1MUHJvY2Vzc29yLmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLnV0aWwuWE1MUHJvY2Vzc29yOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKQEAgLTQyLDcgKzQzLDggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJvdGVjdGVkIE1hcCBnZXRSZWdpc3RyYXRpb25zKCkgeworCUBPdmVycmlkZQorCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBSZXNvdXJjZS5GYWN0b3J5PiBnZXRSZWdpc3RyYXRpb25zKCkgewogCQlpZiAocmVnaXN0cmF0aW9ucyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRSZWdpc3RyYXRpb25zKCk7CiAJCQlyZWdpc3RyYXRpb25zLnB1dChYTUxfRVhURU5TSU9OLCBuZXcgV2ViUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViYXBwL1dlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZjNhMTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2ViIEFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFdlYkFwcCA8ZW0+V2ViIEFwcDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuaW50ZXJuYWwubWV0YWRhdGEuV2ViYXBwUGFja2FnZSNnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpCisgKiBAZXh0ZW5kcyBKYXZhRUVPYmplY3QKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciBleHRlbmRzIEphdmFFRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1peGVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJhcHBQYWNrYWdlI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRmVhdHVyZU1hcCBnZXRNaXhlZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgorCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCisJICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJhcHBQYWNrYWdlI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYTUxOU1ByZWZpeE1hcCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgorCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCisJICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJhcHBQYWNrYWdlI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2ViIEFwcDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisJICogCisJICogCisJICogICAgICAgICBUaGUgd2ViLWFwcCBlbGVtZW50IGlzIHRoZSByb290IG9mIHRoZSBkZXBsb3ltZW50CisJICogICAgICAgICBkZXNjcmlwdG9yIGZvciBhIHdlYiBhcHBsaWNhdGlvbi4gIE5vdGUgdGhhdCB0aGUgc3ViLWVsZW1lbnRzCisJICogICAgICAgICBvZiB0aGlzIGVsZW1lbnQgY2FuIGJlIGluIHRoZSBhcmJpdHJhcnkgb3JkZXIuIEJlY2F1c2Ugb2YKKwkgKiAgICAgICAgIHRoYXQsIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIGVsZW1lbnRzIG9mIGRpc3RyaWJ1dGFibGUsCisJICogICAgICAgICBzZXNzaW9uLWNvbmZpZywgd2VsY29tZS1maWxlLWxpc3QsIGpzcC1jb25maWcsIGxvZ2luLWNvbmZpZywKKwkgKiAgICAgICAgIGFuZCBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IHdhcyBjaGFuZ2VkIGZyb20gIj8iIHRvICIqIgorCSAqICAgICAgICAgaW4gdGhpcyBzY2hlbWEuICBIb3dldmVyLCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluc3RhbmNlCisJICogICAgICAgICBmaWxlIG11c3Qgbm90IGNvbnRhaW4gbXVsdGlwbGUgZWxlbWVudHMgb2Ygc2Vzc2lvbi1jb25maWcsCisJICogICAgICAgICBqc3AtY29uZmlnLCBhbmQgbG9naW4tY29uZmlnLiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cyBvZgorCSAqICAgICAgICAgd2VsY29tZS1maWxlLWxpc3Qgb3IgbG9jYWxlLWVuY29kaW5nLW1hcHBpbmctbGlzdCwgdGhlIGNvbnRhaW5lcgorCSAqICAgICAgICAgbXVzdCBjb25jYXRlbmF0ZSB0aGUgZWxlbWVudCBjb250ZW50cy4gIFRoZSBtdWx0aXBsZSBvY2N1cmVuY2UKKwkgKiAgICAgICAgIG9mIHRoZSBlbGVtZW50IGRpc3RyaWJ1dGFibGUgaXMgcmVkdW5kYW50IGFuZCB0aGUgY29udGFpbmVyCisJICogICAgICAgICB0cmVhdHMgdGhhdCBjYXNlIGV4YWN0bHkgaW4gdGhlIHNhbWUgd2F5IHdoZW4gdGhlcmUgaXMgb25seQorCSAqICAgICAgICAgb25lIGRpc3RyaWJ1dGFibGUuIAorCSAqICAgICAgICAgCisJICogICAgICAgCisJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldlYiBBcHA8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFdlYkFwcChXZWJBcHApCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJhcHBQYWNrYWdlI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1dlYkFwcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCVdlYkFwcCBnZXRXZWJBcHAoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFdlYkFwcCA8ZW0+V2ViIEFwcDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2ViIEFwcDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0V2ViQXBwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRXZWJBcHAoV2ViQXBwIHZhbHVlKTsKKworfSAvLyBXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJhcHAvV2ViYXBwRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJhcHAvV2ViYXBwRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjQwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9XZWJhcHBGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJhcHBQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLm1ldGFkYXRhLldlYmFwcFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBXZWJhcHBGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgeworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJV2ViYXBwRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC5pbXBsLldlYmFwcEZhY3RvcnlJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2ViIEFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlYiBBcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciBjcmVhdGVXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlXZWJhcHBQYWNrYWdlIGdldFdlYmFwcFBhY2thZ2UoKTsKKworfSAvL1dlYmFwcEZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViYXBwL2ludGVybmFsL2ltcGwvV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9pbnRlcm5hbC9pbXBsL1dlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjZjODYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9pbnRlcm5hbC9pbXBsL1dlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbC5qYXZhCkBAIC0wLDAgKzEsMjk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLm1ldGFkYXRhLldlYmFwcFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWIgQXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuaW50ZXJuYWwuaW1wbC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC5pbXBsLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuaW50ZXJuYWwuaW1wbC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLmltcGwuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldFdlYkFwcCA8ZW0+V2ViIEFwcDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1peGVkKCkgPGVtPk1peGVkPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE1peGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBtaXhlZDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhNTE5TUHJlZml4TWFwKCkgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nIG1hcC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFhNTE5TUHJlZml4TWFwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRU1hcDxTdHJpbmcsIFN0cmluZz4geE1MTlNQcmVmaXhNYXA7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59JyBtYXAuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVNYXA8U3RyaW5nLCBTdHJpbmc+IHhTSVNjaGVtYUxvY2F0aW9uOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIFdlYmFwcFBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEZlYXR1cmVNYXAgZ2V0TWl4ZWQoKSB7CisJCWlmIChtaXhlZCA9PSBudWxsKSB7CisJCQltaXhlZCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgV2ViYXBwUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQpOworCQl9CisJCXJldHVybiBtaXhlZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYTUxOU1ByZWZpeE1hcCgpIHsKKwkJaWYgKHhNTE5TUHJlZml4TWFwID09IG51bGwpIHsKKwkJCXhNTE5TUHJlZml4TWFwID0gbmV3IEVjb3JlRU1hcDxTdHJpbmcsU3RyaW5nPihFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFdlYmFwcFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVApOworCQl9CisJCXJldHVybiB4TUxOU1ByZWZpeE1hcC5tYXAoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpIHsKKwkJaWYgKHhTSVNjaGVtYUxvY2F0aW9uID09IG51bGwpIHsKKwkJCXhTSVNjaGVtYUxvY2F0aW9uID0gbmV3IEVjb3JlRU1hcDxTdHJpbmcsU3RyaW5nPihFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFdlYmFwcFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOworCQl9CisJCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbi5tYXAoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgV2ViQXBwIGdldFdlYkFwcCgpIHsKKwkJcmV0dXJuIChXZWJBcHApZ2V0TWl4ZWQoKS5nZXQoV2ViYXBwUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUCwgdHJ1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHAsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChXZWJhcHBQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfQVBQLCBuZXdXZWJBcHAsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7CisJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoV2ViYXBwUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUCwgbmV3V2ViQXBwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYmFwcFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWl4ZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJhcHBQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYmFwcFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikoKEVNYXAuSW50ZXJuYWxNYXBWaWV3PFN0cmluZywgU3RyaW5nPilnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViYXBwUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUDoKKwkJCQlyZXR1cm4gYmFzaWNTZXRXZWJBcHAobnVsbCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViYXBwUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6CisJCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0TWl4ZWQoKTsKKwkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmdldFdyYXBwZXIoKTsKKwkJCWNhc2UgV2ViYXBwUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKKwkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKEVNYXAuSW50ZXJuYWxNYXBWaWV3PFN0cmluZywgU3RyaW5nPilnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCk7CisJCQkJZWxzZSByZXR1cm4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKKwkJCWNhc2UgV2ViYXBwUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKKwkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKEVNYXAuSW50ZXJuYWxNYXBWaWV3PFN0cmluZywgU3RyaW5nPilnZXRYU0lTY2hlbWFMb2NhdGlvbigpKS5lTWFwKCk7CisJCQkJZWxzZSByZXR1cm4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKKwkJCWNhc2UgV2ViYXBwUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUDoKKwkJCQlyZXR1cm4gZ2V0V2ViQXBwKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViYXBwUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQ6CisJCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChuZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJhcHBQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgorCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViYXBwUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKKwkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKSgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYmFwcFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9BUFA6CisJCQkJc2V0V2ViQXBwKChXZWJBcHApbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdlYmFwcFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgorCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYmFwcFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVA6CisJCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViYXBwUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKKwkJCQlnZXRYU0lTY2hlbWFMb2NhdGlvbigpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJhcHBQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfQVBQOgorCQkJCXNldFdlYkFwcCgoV2ViQXBwKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJhcHBQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKKwkJCQlyZXR1cm4gbWl4ZWQgIT0gbnVsbCAmJiAhbWl4ZWQuaXNFbXB0eSgpOworCQkJY2FzZSBXZWJhcHBQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgorCQkJCXJldHVybiB4TUxOU1ByZWZpeE1hcCAhPSBudWxsICYmICF4TUxOU1ByZWZpeE1hcC5pc0VtcHR5KCk7CisJCQljYXNlIFdlYmFwcFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046CisJCQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgIXhTSVNjaGVtYUxvY2F0aW9uLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViYXBwUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUDoKKwkJCQlyZXR1cm4gZ2V0V2ViQXBwKCkgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG1peGVkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKG1peGVkKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9pbnRlcm5hbC9pbXBsL1dlYmFwcEZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9pbnRlcm5hbC9pbXBsL1dlYmFwcEZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1MjUwNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViYXBwL2ludGVybmFsL2ltcGwvV2ViYXBwRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJhcHBQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFdlYmFwcEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgV2ViYXBwRmFjdG9yeSB7CisJLyoqCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgV2ViYXBwRmFjdG9yeSBpbml0KCkgeworCQl0cnkgeworCQkJV2ViYXBwRmFjdG9yeSB0aGVXZWJhcHBGYWN0b3J5ID0gKFdlYmFwcEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWJhcHAiKTsgLy8kTk9OLU5MUy0xJCAKKwkJCWlmICh0aGVXZWJhcHBGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhlV2ViYXBwRmFjdG9yeTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJcmV0dXJuIG5ldyBXZWJhcHBGYWN0b3J5SW1wbCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFdlYmFwcEZhY3RvcnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFdlYmFwcFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJfQorCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciBjcmVhdGVXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKKwkJV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsIHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yID0gbmV3IFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCgpOworCQlyZXR1cm4gd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFdlYmFwcFBhY2thZ2UgZ2V0V2ViYXBwUGFja2FnZSgpIHsKKwkJcmV0dXJuIChXZWJhcHBQYWNrYWdlKWdldEVQYWNrYWdlKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZGVwcmVjYXRlZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlARGVwcmVjYXRlZAorCXB1YmxpYyBzdGF0aWMgV2ViYXBwUGFja2FnZSBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gV2ViYXBwUGFja2FnZS5lSU5TVEFOQ0U7CisJfQorCit9IC8vV2ViYXBwRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViYXBwL2ludGVybmFsL2ltcGwvV2ViYXBwUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViYXBwL2ludGVybmFsL2ltcGwvV2ViYXBwUGFja2FnZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGYyMzM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJhcHAvaW50ZXJuYWwvaW1wbC9XZWJhcHBQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLm5hbWVzcGFjZS5YTUxOYW1lc3BhY2VQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUluaXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5pbnRlcm5hbC5tZXRhZGF0YS5XZWJQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuV2ViYXBwRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLm1ldGFkYXRhLldlYmFwcFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgV2ViYXBwUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBXZWJhcHBQYWNrYWdlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyB3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJhcHBQYWNrYWdlI2VOU19VUkkKKwkgKiBAc2VlICNpbml0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBXZWJhcHBQYWNrYWdlSW1wbCgpIHsKKwkJc3VwZXIoZU5TX1VSSSwgV2ViYXBwRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgdm9sYXRpbGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIFdlYmFwcFBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCisJICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2VOU19VUkkKKwkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFdlYmFwcFBhY2thZ2UgaW5pdCgpIHsKKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFdlYmFwcFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCisJCVdlYmFwcFBhY2thZ2VJbXBsIHRoZVdlYmFwcFBhY2thZ2UgPSAoV2ViYXBwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IFdlYmFwcFBhY2thZ2VJbXBsKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJWE1MTmFtZXNwYWNlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlV2ViYXBwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCisJCXRoZVdlYmFwcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlV2ViYXBwUGFja2FnZS5mcmVlemUoKTsKKworICAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChXZWJhcHBQYWNrYWdlLmVOU19VUkksIHRoZVdlYmFwcFBhY2thZ2UpOworCisJCUoyRUVJbml0LmluaXRFTUZNb2RlbHMoKTsKKwkJcmV0dXJuIHRoZVdlYmFwcFBhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKKwkJcmV0dXJuIHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1dlYkFwcCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFdlYmFwcEZhY3RvcnkgZ2V0V2ViYXBwRmFjdG9yeSgpIHsKKwkJcmV0dXJuIChXZWJhcHBGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47CisJCWlzQ3JlYXRlZCA9IHRydWU7CisKKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCXdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZSh3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hNTE5TX1BSRUZJWF9NQVApOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTik7CisJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfQVBQKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOworCisJLyoqCisJICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKKwkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47CisJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOworCisJCS8vIEluaXRpYWxpemUgcGFja2FnZQorCQlzZXROYW1lKGVOQU1FKTsKKwkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7CisJCXNldE5zVVJJKGVOU19VUkkpOworCisJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKKwkJV2ViUGFja2FnZSB0aGVXZWJQYWNrYWdlID0gKFdlYlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJYm9vbGVhbiBoYXNMb2NrID0gZmFsc2U7CisJCXRyeSB7CisJCQloYXNMb2NrID0gSjJFRUluaXQuYXF1aXJlSW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50c0xvY2soKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJSjJFRUNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCX0JCQorCQkKKwkJdHJ5eworCQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQorCQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJCWluaXRFQ2xhc3Mod2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yLmNsYXNzLCAiV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJtaXhlZCIsIG51bGwsIDAsIC0xLCBudWxsLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4TUxOU1ByZWZpeE1hcCIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieFNJU2NoZW1hTG9jYXRpb24iLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9XZWJBcHAoKSwgdGhlV2ViUGFja2FnZS5nZXRXZWJBcHAoKSwgbnVsbCwgIndlYkFwcCIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQkvLyBDcmVhdGUgcmVzb3VyY2UKKwkJCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCQorCQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCisJCQkvLyBodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEKKwkJCWNyZWF0ZUV4dGVuZGVkTWV0YURhdGFBbm5vdGF0aW9ucygpOworCQl9ZmluYWxseXsKKwkJCWlmKCBoYXNMb2NrICkKKwkJCQlKMkVFSW5pdC5yZWxlYXNlSW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50c0xvY2soKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9ucyBmb3IgPGI+aHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhPC9iPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKSB7CisJCVN0cmluZyBzb3VyY2UgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIjsgLy8kTk9OLU5MUy0xJAkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAibmFtZSIsICIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAia2luZCIsICJtaXhlZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiZWxlbWVudFdpbGRjYXJkIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAiOm1peGVkIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJ4bWxuczpwcmVmaXgiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgInhzaTpzY2hlbWFMb2NhdGlvbiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1dlYkFwcCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAid2ViLWFwcCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lc3BhY2UiLCAiIyN0YXJnZXROYW1lc3BhY2UiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsKKwl9CisKK30gLy9XZWJhcHBQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJhcHAvaW50ZXJuYWwvbWV0YWRhdGEvV2ViYXBwUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJhcHAvaW50ZXJuYWwvbWV0YWRhdGEvV2ViYXBwUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMWYyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9pbnRlcm5hbC9tZXRhZGF0YS9XZWJhcHBQYWNrYWdlLmphdmEKQEAgLTAsMCArMSw1NjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLm1ldGFkYXRhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuV2ViYXBwRmFjdG9yeTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50CisgKiA8dWw+CisgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorICogPC91bD4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CisgKiAKKyAqIAorICogICAgICAgJElkOiBXZWJhcHBQYWNrYWdlLmphdmEsdiAxLjMgMjAxMC8wMS8xNSAxNDozMjowNyBjYW5kZXJzb24gRXhwICQKKyAqICAgICAgIAorICogICAgIAorICogCisgKiA8IVtDREFUQVtbCisgKiAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgU2VydmxldCAzLjAgZGVwbG95bWVudCBkZXNjcmlwdG9yLgorICogICAgICAgVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtdXN0IGJlIG5hbWVkICJXRUItSU5GL3dlYi54bWwiIGluIHRoZQorICogICAgICAgd2ViIGFwcGxpY2F0aW9uJ3Mgd2FyIGZpbGUuICBBbGwgU2VydmxldCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCisgKiAgICAgICBtdXN0IGluZGljYXRlIHRoZSB3ZWIgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFCisgKiAgICAgICBuYW1lc3BhY2U6CisgKiAgICAgICAKKyAqICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSAKKyAqICAgICAgIAorICogICAgICAgYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSAKKyAqICAgICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6IAorICogICAgICAgCisgKiAgICAgICA8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICogICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAqICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iLi4uIgorICogICAgICAgdmVyc2lvbj0iMy4wIj4gCisgKiAgICAgICAuLi4KKyAqICAgICAgIDwvd2ViLWFwcD4KKyAqICAgICAgIAorICogICAgICAgVGhlIGluc3RhbmNlIGRvY3VtZW50cyBtYXkgaW5kaWNhdGUgdGhlIHB1Ymxpc2hlZCB2ZXJzaW9uIG9mCisgKiAgICAgICB0aGUgc2NoZW1hIHVzaW5nIHRoZSB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIGZvciBKYXZhIEVFCisgKiAgICAgICBuYW1lc3BhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uOgorICogICAgICAgCisgKiAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkCisgKiAgICAgICAKKyAqIF1dPgorICogICAgIAorICogCisgKiAKKyAqICAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKKyAqICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KKyAqICAgICAgIAorICogICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQorICogICAgICAgc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKKyAqICAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhcmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZgorICogICAgICAgdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQorICogICAgICAgc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKKyAqICAgICAgIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgSW4gZ2VuZXJhbCwgcmVsYXRpdmUgbmFtZXMgYXJlCisgKiAgICAgICBwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKKyAqICAgICAgIG5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgorICogICAgICAgCisgKiAgICAgCisgKiAKKyAqIAorICogICAgICAgJElkOiBXZWJhcHBQYWNrYWdlLmphdmEsdiAxLjMgMjAxMC8wMS8xNSAxNDozMjowNyBjYW5kZXJzb24gRXhwICQKKyAqICAgICAgIAorICogICAgIAorICogCisgKiA8IVtDREFUQVtbCisgKiAgICAgICBUaGlzIGlzIHRoZSBjb21tb24gWE1MIFNjaGVtYSBmb3IgdGhlIFNlcnZsZXQgMy4wIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAqICAgICAgIFRoaXMgZmlsZSBpcyBpbiB0dXJuIHVzZWQgYnkgd2ViLnhtbCBhbmQgd2ViLWZyYWdtZW50LnhtbAorICogICAgICAgd2ViIGFwcGxpY2F0aW9uJ3Mgd2FyIGZpbGUuICBBbGwgU2VydmxldCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCisgKiAgICAgICBtdXN0IGluZGljYXRlIHRoZSB3ZWIgY29tbW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRQorICogICAgICAgbmFtZXNwYWNlOgorICogICAgICAgCisgKiAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgCisgKiAgICAgICAKKyAqICAgICAgIGFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgCisgKiAgICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OiAKKyAqICAgICAgIAorICogICAgICAgPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKKyAqICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgKiAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKKyAqICAgICAgIHZlcnNpb249IjMuMCI+IAorICogICAgICAgLi4uCisgKiAgICAgICA8L3dlYi1hcHA+CisgKiAgICAgICAKKyAqICAgICAgIFRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgorICogICAgICAgdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQorICogICAgICAgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKKyAqICAgICAgIAorICogICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1jb21tb25fM18wLnhzZAorICogICAgICAgCisgKiBdXT4KKyAqICAgICAKKyAqIAorICogCisgKiAgICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCisgKiAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCisgKiAgICAgICAKKyAqICAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKKyAqICAgICAgIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90CisgKiAgICAgICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKKyAqICAgICAgIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKKyAqICAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCisgKiAgICAgICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQorICogICAgICAgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCisgKiAgICAgICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KKyAqICAgICAgIAorICogICAgIAorICogCisgKiAKKyAqICAgICAgICRJZDogV2ViYXBwUGFja2FnZS5qYXZhLHYgMS4zIDIwMTAvMDEvMTUgMTQ6MzI6MDcgY2FuZGVyc29uIEV4cCAkCisgKiAgICAgICAKKyAqICAgICAKKyAqIAorICogCisgKiAgICAgICBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIHRoYXQgYXBwZWFyIGluIHRoZSBjb21tb24KKyAqICAgICAgIHNoYXJlYWJsZSBzY2hlbWEocykgb2YgSmF2YSBFRSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHNob3VsZCBiZQorICogICAgICAgaW50ZXJwcmV0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBjb250ZXh0IHRoZXkgYXJlIGluY2x1ZGVkOgorICogICAgICAgCisgKiAgICAgICBEZXBsb3ltZW50IENvbXBvbmVudCBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICBqYXZhIGVlIGFwcGxpY2F0aW9uOworICogICAgICAgYXBwbGljYXRpb24gY2xpZW50OworICogICAgICAgd2ViIGFwcGxpY2F0aW9uOworICogICAgICAgZW50ZXJwcmlzZSBiZWFuOworICogICAgICAgcmVzb3VyY2UgYWRhcHRlcjsgCisgKiAgICAgICAKKyAqICAgICAgIERlcGxveW1lbnQgRmlsZSBtYXkgaW5kaWNhdGUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICBlYXIgZmlsZTsKKyAqICAgICAgIHdhciBmaWxlOworICogICAgICAgamFyIGZpbGU7CisgKiAgICAgICByYXIgZmlsZTsKKyAqICAgICAgIAorICogICAgIAorICogCisgKiAKKyAqICAgICAgICRJZDogV2ViYXBwUGFja2FnZS5qYXZhLHYgMS4zIDIwMTAvMDEvMTUgMTQ6MzI6MDcgY2FuZGVyc29uIEV4cCAkCisgKiAgICAgICAKKyAqICAgICAKKyAqIAorICogCisgKiAgICAgICAoQykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gMjAwMgorICogICAgICAgCisgKiAgICAgCisgKiAKKyAqICAgIDxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgIDxoMT5BYm91dCB0aGUgWE1MIG5hbWVzcGFjZTwvaDE+CisgKiAKKyAqICAgICA8ZGl2IGNsYXNzPSJib2R5dGV4dCI+CisgKiAgICAgIDxwPgorICogICAgICAgVGhpcyBzY2hlbWEgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBYTUwgbmFtZXNwYWNlLCBpbiBhIGZvcm0KKyAqICAgICAgIHN1aXRhYmxlIGZvciBpbXBvcnQgYnkgb3RoZXIgc2NoZW1hIGRvY3VtZW50cy4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbCI+CisgKiAgICAgICBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuaHRtbDwvYT4gYW5kCisgKiAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIj4KKyAqICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWw8L2E+IGZvciBpbmZvcm1hdGlvbiAKKyAqICAgICAgIGFib3V0IHRoaXMgbmFtZXNwYWNlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgTm90ZSB0aGF0IGxvY2FsIG5hbWVzIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBpbnRlbmRlZCB0byBiZQorICogICAgICAgZGVmaW5lZCBvbmx5IGJ5IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtIG9yIGl0cyBzdWJncm91cHMuCisgKiAgICAgICBUaGUgbmFtZXMgY3VycmVudGx5IGRlZmluZWQgaW4gdGhpcyBuYW1lc3BhY2UgYXJlIGxpc3RlZCBiZWxvdy4KKyAqICAgICAgIFRoZXkgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggY29uZmxpY3Rpbmcgc2VtYW50aWNzIGJ5IGFueSBXb3JraW5nCisgKiAgICAgICBHcm91cCwgc3BlY2lmaWNhdGlvbiwgb3IgZG9jdW1lbnQgaW5zdGFuY2UuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+ICAgCisgKiAgICAgICBTZWUgZnVydGhlciBiZWxvdyBpbiB0aGlzIGRvY3VtZW50IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IDxhIGhyZWY9IiN1c2FnZSI+aG93IHRvIHJlZmVyIHRvIHRoaXMgc2NoZW1hIGRvY3VtZW50IGZyb20geW91ciBvd24KKyAqICAgICAgIFhTRCBzY2hlbWEgZG9jdW1lbnRzPC9hPiBhbmQgYWJvdXQgPGEgaHJlZj0iI25zdmVyc2lvbmluZyI+dGhlCisgKiAgICAgICBuYW1lc3BhY2UtdmVyc2lvbmluZyBwb2xpY3kgZ292ZXJuaW5nIHRoaXMgc2NoZW1hIGRvY3VtZW50PC9hPi4KKyAqICAgICAgPC9wPgorICogICAgIDwvZGl2PgorICogICAgPC9kaXY+CisgKiAgIAorICogCisgKiAgICA8ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAqICAgIAorICogICAgIDxoMz5GYXRoZXIgKGluIGFueSBjb250ZXh0IGF0IGFsbCk8L2gzPiAKKyAqIAorICogICAgIDxkaXYgY2xhc3M9ImJvZHl0ZXh0Ij4KKyAqICAgICAgPHA+CisgKiAgICAgICBkZW5vdGVzIEpvbiBCb3NhaywgdGhlIGNoYWlyIG9mIAorICogICAgICAgdGhlIG9yaWdpbmFsIFhNTCBXb3JraW5nIEdyb3VwLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IAorICogICAgICAgdGhlIGZvbGxvd2luZyBkZWNpc2lvbiBvZiB0aGUgVzNDIFhNTCBQbGVuYXJ5IGFuZCAKKyAqICAgICAgIFhNTCBDb29yZGluYXRpb24gZ3JvdXBzOgorICogICAgICA8L3A+CisgKiAgICAgIDxibG9ja3F1b3RlPgorICogICAgICAgIDxwPgorICogCUluIGFwcHJlY2lhdGlvbiBmb3IgaGlzIHZpc2lvbiwgbGVhZGVyc2hpcCBhbmQKKyAqIAlkZWRpY2F0aW9uIHRoZSBXM0MgWE1MIFBsZW5hcnkgb24gdGhpcyAxMHRoIGRheSBvZgorICogCUZlYnJ1YXJ5LCAyMDAwLCByZXNlcnZlcyBmb3IgSm9uIEJvc2FrIGluIHBlcnBldHVpdHkKKyAqIAl0aGUgWE1MIG5hbWUgInhtbDpGYXRoZXIiLgorICogICAgICAgIDwvcD4KKyAqICAgICAgPC9ibG9ja3F1b3RlPgorICogICAgIDwvZGl2PgorICogICAgPC9kaXY+CisgKiAgIAorICogCisgKiAgICA8ZGl2IGlkPSJ1c2FnZSIgeG1sOmlkPSJ1c2FnZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgIDxoMj4KKyAqICAgICAgIDxhIG5hbWU9InVzYWdlIj5BYm91dCB0aGlzIHNjaGVtYSBkb2N1bWVudDwvYT4KKyAqICAgICA8L2gyPgorICogCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIFRoaXMgc2NoZW1hIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgYW4gYXR0cmlidXRlIGdyb3VwIHN1aXRhYmxlCisgKiAgICAgICBmb3IgdXNlIGJ5IHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyA8Y29kZT54bWw6YmFzZTwvY29kZT4sCisgKiAgICAgICA8Y29kZT54bWw6bGFuZzwvY29kZT4sIDxjb2RlPnhtbDpzcGFjZTwvY29kZT4gb3IKKyAqICAgICAgIDxjb2RlPnhtbDppZDwvY29kZT4gYXR0cmlidXRlcyBvbiBlbGVtZW50cyB0aGV5IGRlZmluZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIFRvIGVuYWJsZSB0aGlzLCBzdWNoIGEgc2NoZW1hIG11c3QgaW1wb3J0IHRoaXMgc2NoZW1hIGZvcgorICogICAgICAgdGhlIFhNTCBuYW1lc3BhY2UsIGUuZy4gYXMgZm9sbG93czoKKyAqICAgICAgPC9wPgorICogICAgICA8cHJlPgorICogICAgICAgICAgICZsdDtzY2hlbWEgLiAuIC4mZ3Q7CisgKiAgICAgICAgICAgIC4gLiAuCisgKiAgICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICBvcgorICogICAgICA8L3A+CisgKiAgICAgIDxwcmU+CisgKiAgICAgICAgICAgICZsdDtpbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZCIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICBTdWJzZXF1ZW50bHksIHF1YWxpZmllZCByZWZlcmVuY2UgdG8gYW55IG9mIHRoZSBhdHRyaWJ1dGVzIG9yIHRoZQorICogICAgICAgZ3JvdXAgZGVmaW5lZCBiZWxvdyB3aWxsIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LCBlLmcuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHByZT4KKyAqICAgICAgICAgICAmbHQ7dHlwZSAuIC4gLiZndDsKKyAqICAgICAgICAgICAgLiAuIC4KKyAqICAgICAgICAgICAgJmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0ieG1sOnNwZWNpYWxBdHRycyIvJmd0OworICogICAgICA8L3ByZT4KKyAqICAgICAgPHA+CisgKiAgICAgICB3aWxsIGRlZmluZSBhIHR5cGUgd2hpY2ggd2lsbCBzY2hlbWEtdmFsaWRhdGUgYW4gaW5zdGFuY2UgZWxlbWVudAorICogICAgICAgd2l0aCBhbnkgb2YgdGhvc2UgYXR0cmlidXRlcy4KKyAqICAgICAgPC9wPgorICogICAgIDwvZGl2PgorICogICAgPC9kaXY+CisgKiAgIAorICogCisgKiAgICA8ZGl2IGlkPSJuc3ZlcnNpb25pbmciIHhtbDppZD0ibnN2ZXJzaW9uaW5nIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgKiAgICAgPGgyPgorICogICAgICAgPGEgbmFtZT0ibnN2ZXJzaW9uaW5nIj5WZXJzaW9uaW5nIHBvbGljeSBmb3IgdGhpcyBzY2hlbWEgZG9jdW1lbnQ8L2E+CisgKiAgICAgPC9oMj4KKyAqICAgICA8ZGl2IGNsYXNzPSJib2R5dGV4dCI+CisgKiAgICAgIDxwPgorICogICAgICAgSW4ga2VlcGluZyB3aXRoIHRoZSBYTUwgU2NoZW1hIFdHJ3Mgc3RhbmRhcmQgdmVyc2lvbmluZworICogICAgICAgcG9saWN5LCB0aGlzIHNjaGVtYSBkb2N1bWVudCB3aWxsIHBlcnNpc3QgYXQKKyAqICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZCI+CisgKiAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkPC9hPi4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIEF0IHRoZSBkYXRlIG9mIGlzc3VlIGl0IGNhbiBhbHNvIGJlIGZvdW5kIGF0CisgKiAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiPgorICogICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBUaGUgc2NoZW1hIGRvY3VtZW50IGF0IHRoYXQgVVJJIG1heSBob3dldmVyIGNoYW5nZSBpbiB0aGUgZnV0dXJlLAorICogICAgICAgaW4gb3JkZXIgdG8gcmVtYWluIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgWE1MCisgKiAgICAgICBTY2hlbWEgaXRzZWxmLCBvciB3aXRoIHRoZSBYTUwgbmFtZXNwYWNlIGl0c2VsZi4gIEluIG90aGVyIHdvcmRzLAorICogICAgICAgaWYgdGhlIFhNTCBTY2hlbWEgb3IgWE1MIG5hbWVzcGFjZXMgY2hhbmdlLCB0aGUgdmVyc2lvbiBvZiB0aGlzCisgKiAgICAgICBkb2N1bWVudCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiPgorICogICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCAKKyAqICAgICAgIDwvYT4gCisgKiAgICAgICB3aWxsIGNoYW5nZSBhY2NvcmRpbmdseTsgdGhlIHZlcnNpb24gYXQgCisgKiAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QiPgorICogICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZCAKKyAqICAgICAgIDwvYT4gCisgKiAgICAgICB3aWxsIG5vdCBjaGFuZ2UuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBQcmV2aW91cyBkYXRlZCAoYW5kIHVuY2hhbmdpbmcpIHZlcnNpb25zIG9mIHRoaXMgc2NoZW1hIAorICogICAgICAgZG9jdW1lbnQgYXJlIGF0OgorICogICAgICA8L3A+CisgKiAgICAgIDx1bD4KKyAqICAgICAgIDxsaT4KKyAqICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QiPgorICogCWh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZDwvYT4KKyAqICAgICAgICAgPC9saT4KKyAqICAgICAgIDxsaT4KKyAqICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDA3LzA4L3htbC54c2QiPgorICogCWh0dHA6Ly93d3cudzMub3JnLzIwMDcvMDgveG1sLnhzZDwvYT4KKyAqICAgICAgICAgPC9saT4KKyAqICAgICAgIDxsaT4KKyAqICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDA0LzEwL3htbC54c2QiPgorICogCWh0dHA6Ly93d3cudzMub3JnLzIwMDQvMTAveG1sLnhzZDwvYT4KKyAqICAgICAgICAgPC9saT4KKyAqICAgICAgIDxsaT4KKyAqICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2QiPgorICogCWh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZDwvYT4KKyAqICAgICAgICAgPC9saT4KKyAqICAgICAgPC91bD4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgorICogICAKKyAqIAorICogICAgICAgQCgjKWpzcF8yXzIueHNkcwkwMi8yNi8wOQorICogICAgIAorICogCisgKiAKKyAqICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBKU1AgMi4yIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICogICAgICAgdHlwZXMuICBUaGUgSlNQIDIuMiBzY2hlbWEgY29udGFpbnMgYWxsIHRoZSBzcGVjaWFsCisgKiAgICAgICBzdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdGhhdCBhcmUgbmVjZXNzYXJ5IHRvIHVzZSBKU1AgZmlsZXMKKyAqICAgICAgIGZyb20gYSB3ZWIgYXBwbGljYXRpb24uCisgKiAKKyAqICAgICAgIFRoZSBjb250ZW50cyBvZiB0aGlzIHNjaGVtYSBpcyB1c2VkIGJ5IHRoZSB3ZWItY29tbW9uXzNfMC54c2QKKyAqICAgICAgIGZpbGUgdG8gZGVmaW5lIEpTUCBzcGVjaWZpYyBjb250ZW50LgorICogCisgKiAgICAgCisgKiAKKyAqIAorICogICAgICAgVGhlIGZvbGxvd2luZyBjb252ZW50aW9ucyBhcHBseSB0byBhbGwgSmF2YSBFRQorICogICAgICAgZGVwbG95bWVudCBkZXNjcmlwdG9yIGVsZW1lbnRzIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgorICogCisgKiAgICAgICAtIEluIGVsZW1lbnRzIHRoYXQgc3BlY2lmeSBhIHBhdGhuYW1lIHRvIGEgZmlsZSB3aXRoaW4gdGhlCisgKiAJc2FtZSBKQVIgZmlsZSwgcmVsYXRpdmUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZSBub3QKKyAqIAlzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKKyAqIAl0aGUgSkFSIGZpbGUncyBuYW1lc3BhY2UuICBBYnNvbHV0ZSBmaWxlbmFtZXMgKGkuZS4sIHRob3NlCisgKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFsc28gc3BlY2lmeSBuYW1lcyBpbiB0aGUgcm9vdCBvZiB0aGUKKyAqIAlKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQorICogCXByZWZlcnJlZC4gIFRoZSBleGNlcHRpb24gaXMgLndhciBmaWxlcyB3aGVyZSBhYnNvbHV0ZQorICogCW5hbWVzIGFyZSBwcmVmZXJyZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIFNlcnZsZXQgQVBJLgorICogCisgKiAgICAgCisgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLldlYmFwcEZhY3RvcnkKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBXZWJhcHBQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgeworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOQU1FID0gIndlYmFwcCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYmFwcCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gIndlYmFwcCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJV2ViYXBwUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC5pbXBsLldlYmFwcFBhY2thZ2VJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuaW50ZXJuYWwuaW1wbC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwgPGVtPldlYiBBcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuaW50ZXJuYWwuaW1wbC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLmltcGwuV2ViYXBwUGFja2FnZUltcGwjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgQXBwPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9BUFAgPSAzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldlYiBBcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSA0OworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciA8ZW0+V2ViIEFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V2ViIEFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk1peGVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0TWl4ZWQoKQorCSAqIEBzZWUgI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRYTUxOU1ByZWZpeE1hcCgpCisJICogQHNlZSAjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKKwkgKiBAc2VlICNnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0V2ViQXBwIDxlbT5XZWIgQXBwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V2ViIEFwcDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFdlYkFwcCgpCisJICogQHNlZSAjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1dlYkFwcCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJV2ViYXBwRmFjdG9yeSBnZXRXZWJhcHBGYWN0b3J5KCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKwkgKiA8dWw+CisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CisJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKwkgKiA8L3VsPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnRlcmZhY2UgTGl0ZXJhbHMgeworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLmltcGwuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsIDxlbT5XZWIgQXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLmltcGwuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuaW50ZXJuYWwuaW1wbC5XZWJhcHBQYWNrYWdlSW1wbCNnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRCA9IGVJTlNUQU5DRS5nZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQID0gZUlOU1RBTkNFLmdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldlYiBBcHA8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0FQUCA9IGVJTlNUQU5DRS5nZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9XZWJBcHAoKTsKKworCX0KKworfSAvL1dlYmFwcFBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViYXBwL2ludGVybmFsL3V0aWwvV2ViYXBwQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViYXBwL2ludGVybmFsL3V0aWwvV2ViYXBwQWRhcHRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E3YmNjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJhcHAvaW50ZXJuYWwvdXRpbC9XZWJhcHBBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuaW50ZXJuYWwubWV0YWRhdGEuV2ViYXBwUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLm1ldGFkYXRhLldlYmFwcFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFdlYmFwcEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBXZWJhcHBQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgV2ViYXBwQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gV2ViYXBwUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgeworCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBUaGUgc3dpdGNoIHRoYXQgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFdlYmFwcFN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9CisJCW5ldyBXZWJhcHBTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcihXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgorCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgeworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKKwl9CisKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IgPGVtPldlYiBBcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL1dlYmFwcEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9pbnRlcm5hbC91dGlsL1dlYmFwcFJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViYXBwL2ludGVybmFsL3V0aWwvV2ViYXBwUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMGU3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9pbnRlcm5hbC91dGlsL1dlYmFwcFJlc291cmNlRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLnV0aWwuV2ViYXBwUmVzb3VyY2VJbXBsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBXZWJhcHBSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7CisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgV2ViYXBwUmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgeworCQlYTUxSZXNvdXJjZSByZXN1bHQgPSBuZXcgV2ViYXBwUmVzb3VyY2VJbXBsKHVyaSk7CisJCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKKwkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOworCisJCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NDSEVNQV9MT0NBVElPTiwgQm9vbGVhbi5UUlVFKTsKKworCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7CisJCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKKworCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworfSAvL1dlYmFwcFJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViYXBwL2ludGVybmFsL3V0aWwvV2ViYXBwUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9pbnRlcm5hbC91dGlsL1dlYmFwcFJlc291cmNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYzdhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9pbnRlcm5hbC91dGlsL1dlYmFwcFJlc291cmNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLnV0aWwuV2ViYXBwUmVzb3VyY2VGYWN0b3J5SW1wbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgV2ViYXBwUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIHsKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgV2ViYXBwUmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKKwkJc3VwZXIodXJpKTsKKwl9CisKK30gLy9XZWJhcHBSZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViYXBwL2ludGVybmFsL3V0aWwvV2ViYXBwU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9pbnRlcm5hbC91dGlsL1dlYmFwcFN3aXRjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZjM1YzIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9pbnRlcm5hbC91dGlsL1dlYmFwcFN3aXRjaC5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLm1ldGFkYXRhLldlYmFwcFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCisgKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9CisgKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCisgKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAorICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCisgKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJhcHAuaW50ZXJuYWwubWV0YWRhdGEuV2ViYXBwUGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgV2ViYXBwU3dpdGNoPFQ+IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFdlYmFwcFBhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBXZWJhcHBTd2l0Y2goKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gV2ViYXBwUGFja2FnZS5lSU5TVEFOQ0U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7CisJCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKKwkJfQorCQllbHNlIHsKKwkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOworCQkJcmV0dXJuCisJCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KKwkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgorCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgV2ViYXBwUGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUjogeworCQkJCVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yID0gKFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3Iod2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBBcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIEFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcihXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9XZWJhcHBTd2l0Y2gKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViYXBwL2ludGVybmFsL3V0aWwvV2ViYXBwWE1MUHJvY2Vzc29yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9pbnRlcm5hbC91dGlsL1dlYmFwcFhNTFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NjRhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmFwcC9pbnRlcm5hbC91dGlsL1dlYmFwcFhNTFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS51dGlsLlhNTFByb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLm1ldGFkYXRhLldlYmFwcFBhY2thZ2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIFhNTCBkb2N1bWVudHMKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFdlYmFwcFhNTFByb2Nlc3NvciBleHRlbmRzIFhNTFByb2Nlc3NvciB7CisKKwkvKioKKwkgKiBQdWJsaWMgY29uc3RydWN0b3IgdG8gaW5zdGFudGlhdGUgdGhlIGhlbHBlci4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgV2ViYXBwWE1MUHJvY2Vzc29yKCkgeworCQlzdXBlcigoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UpKTsKKwkJV2ViYXBwUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJfQorCQorCS8qKgorCSAqIFJlZ2lzdGVyIGZvciAiKiIgYW5kICJ4bWwiIGZpbGUgZXh0ZW5zaW9ucyB0aGUgV2ViYXBwUmVzb3VyY2VGYWN0b3J5SW1wbCBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBSZXNvdXJjZS5GYWN0b3J5PiBnZXRSZWdpc3RyYXRpb25zKCkgeworCQlpZiAocmVnaXN0cmF0aW9ucyA9PSBudWxsKSB7CisJCQlzdXBlci5nZXRSZWdpc3RyYXRpb25zKCk7CisJCQlyZWdpc3RyYXRpb25zLnB1dChYTUxfRVhURU5TSU9OLCBuZXcgV2ViYXBwUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKKwkJCXJlZ2lzdHJhdGlvbnMucHV0KFNUQVJfRVhURU5TSU9OLCBuZXcgV2ViYXBwUmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKKwkJfQorCQlyZXR1cm4gcmVnaXN0cmF0aW9uczsKKwl9CisKK30gLy9XZWJhcHBYTUxQcm9jZXNzb3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViZnJhZ21lbnQvV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViZnJhZ21lbnQvV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDdiNDFlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJmcmFnbWVudC9XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvci5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50OworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRnJhZ21lbnQ7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlYiBBcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFdlYkZyYWdtZW50IDxlbT5XZWIgRnJhZ21lbnQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuaW50ZXJuYWwubWV0YWRhdGEuV2ViZnJhZ21lbnRQYWNrYWdlI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkKKyAqIEBleHRlbmRzIEphdmFFRU9iamVjdAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIGV4dGVuZHMgSmF2YUVFT2JqZWN0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuaW50ZXJuYWwubWV0YWRhdGEuV2ViZnJhZ21lbnRQYWNrYWdlI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRmVhdHVyZU1hcCBnZXRNaXhlZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgorCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCisJICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LmludGVybmFsLm1ldGFkYXRhLldlYmZyYWdtZW50UGFja2FnZSNnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KKwkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAorCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicgbWFwLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJmcmFnbWVudFBhY2thZ2UjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XZWIgRnJhZ21lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorCSAqIAorCSAqIAorCSAqIAlUaGUgd2ViLWZyYWdtZW50IGVsZW1lbnQgaXMgdGhlIHJvb3Qgb2YgdGhlIGRlcGxveW1lbnQKKwkgKiAJZGVzY3JpcHRvciBmb3IgYSB3ZWIgZnJhZ21lbnQuICBOb3RlIHRoYXQgdGhlIHN1Yi1lbGVtZW50cworCSAqIAlvZiB0aGlzIGVsZW1lbnQgY2FuIGJlIGluIHRoZSBhcmJpdHJhcnkgb3JkZXIuIEJlY2F1c2Ugb2YKKwkgKiAJdGhhdCwgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgZWxlbWVudHMgb2YgZGlzdHJpYnV0YWJsZSwKKwkgKiAJc2Vzc2lvbi1jb25maWcsIHdlbGNvbWUtZmlsZS1saXN0LCBqc3AtY29uZmlnLCBsb2dpbi1jb25maWcsCisJICogCWFuZCBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0IHdhcyBjaGFuZ2VkIGZyb20gIj8iIHRvICIqIgorCSAqIAlpbiB0aGlzIHNjaGVtYS4gIEhvd2V2ZXIsIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaW5zdGFuY2UKKwkgKiAJZmlsZSBtdXN0IG5vdCBjb250YWluIG11bHRpcGxlIGVsZW1lbnRzIG9mIHNlc3Npb24tY29uZmlnLAorCSAqIAlqc3AtY29uZmlnLCBhbmQgbG9naW4tY29uZmlnLiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBlbGVtZW50cyBvZgorCSAqIAl3ZWxjb21lLWZpbGUtbGlzdCBvciBsb2NhbGUtZW5jb2RpbmctbWFwcGluZy1saXN0LCB0aGUgY29udGFpbmVyCisJICogCW11c3QgY29uY2F0ZW5hdGUgdGhlIGVsZW1lbnQgY29udGVudHMuICBUaGUgbXVsdGlwbGUgb2NjdXJlbmNlCisJICogCW9mIHRoZSBlbGVtZW50IGRpc3RyaWJ1dGFibGUgaXMgcmVkdW5kYW50IGFuZCB0aGUgY29udGFpbmVyCisJICogCXRyZWF0cyB0aGF0IGNhc2UgZXhhY3RseSBpbiB0aGUgc2FtZSB3YXkgd2hlbiB0aGVyZSBpcyBvbmx5CisJICogCW9uZSBkaXN0cmlidXRhYmxlLgorCSAqIAorCSAqICAgICAgIAorCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgRnJhZ21lbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI3NldFdlYkZyYWdtZW50KFdlYkZyYWdtZW50KQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJmcmFnbWVudFBhY2thZ2UjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfV2ViRnJhZ21lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlXZWJGcmFnbWVudCBnZXRXZWJGcmFnbWVudCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciNnZXRXZWJGcmFnbWVudCA8ZW0+V2ViIEZyYWdtZW50PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWIgRnJhZ21lbnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFdlYkZyYWdtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRXZWJGcmFnbWVudChXZWJGcmFnbWVudCB2YWx1ZSk7CisKK30gLy8gV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViZnJhZ21lbnQvV2ViZnJhZ21lbnRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L1dlYmZyYWdtZW50RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwM2FlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L1dlYmZyYWdtZW50RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LmludGVybmFsLm1ldGFkYXRhLldlYmZyYWdtZW50UGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCisgKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LmludGVybmFsLm1ldGFkYXRhLldlYmZyYWdtZW50UGFja2FnZQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFdlYmZyYWdtZW50RmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5IHsKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVdlYmZyYWdtZW50RmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LmludGVybmFsLmltcGwuV2ViZnJhZ21lbnRGYWN0b3J5SW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlYiBBcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWIgQXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IgY3JlYXRlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJV2ViZnJhZ21lbnRQYWNrYWdlIGdldFdlYmZyYWdtZW50UGFja2FnZSgpOworCit9IC8vV2ViZnJhZ21lbnRGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L2ludGVybmFsL2ltcGwvV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L2ludGVybmFsL2ltcGwvV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0MTMzYgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViZnJhZ21lbnQvaW50ZXJuYWwvaW1wbC9XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwuamF2YQpAQCAtMCwwICsxLDI5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRU1hcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGcmFnbWVudDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LmludGVybmFsLm1ldGFkYXRhLldlYmZyYWdtZW50UGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlYiBBcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LmludGVybmFsLmltcGwuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsI2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5pbXBsLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5pbXBsLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5pbXBsLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCNnZXRXZWJGcmFnbWVudCA8ZW0+V2ViIEZyYWdtZW50PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWl4ZWQoKSA8ZW0+TWl4ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWl4ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBGZWF0dXJlTWFwIG1peGVkOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WE1MTlNQcmVmaXhNYXAoKSA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScgbWFwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0WE1MTlNQcmVmaXhNYXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTWFwPFN0cmluZywgU3RyaW5nPiB4TUxOU1ByZWZpeE1hcDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkgPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn0nIG1hcC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRU1hcDxTdHJpbmcsIFN0cmluZz4geFNJU2NoZW1hTG9jYXRpb247CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gV2ViZnJhZ21lbnRQYWNrYWdlLkxpdGVyYWxzLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBGZWF0dXJlTWFwIGdldE1peGVkKCkgeworCQlpZiAobWl4ZWQgPT0gbnVsbCkgeworCQkJbWl4ZWQgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFdlYmZyYWdtZW50UGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQpOworCQl9CisJCXJldHVybiBtaXhlZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYTUxOU1ByZWZpeE1hcCgpIHsKKwkJaWYgKHhNTE5TUHJlZml4TWFwID09IG51bGwpIHsKKwkJCXhNTE5TUHJlZml4TWFwID0gbmV3IEVjb3JlRU1hcDxTdHJpbmcsU3RyaW5nPihFY29yZVBhY2thZ2UuTGl0ZXJhbHMuRVNUUklOR19UT19TVFJJTkdfTUFQX0VOVFJZLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIFdlYmZyYWdtZW50UGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCk7CisJCX0KKwkJcmV0dXJuIHhNTE5TUHJlZml4TWFwLm1hcCgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhTSVNjaGVtYUxvY2F0aW9uKCkgeworCQlpZiAoeFNJU2NoZW1hTG9jYXRpb24gPT0gbnVsbCkgeworCQkJeFNJU2NoZW1hTG9jYXRpb24gPSBuZXcgRWNvcmVFTWFwPFN0cmluZyxTdHJpbmc+KEVjb3JlUGFja2FnZS5MaXRlcmFscy5FU1RSSU5HX1RPX1NUUklOR19NQVBfRU5UUlksIEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbC5jbGFzcywgdGhpcywgV2ViZnJhZ21lbnRQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKKwkJfQorCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb24ubWFwKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFdlYkZyYWdtZW50IGdldFdlYkZyYWdtZW50KCkgeworCQlyZXR1cm4gKFdlYkZyYWdtZW50KWdldE1peGVkKCkuZ2V0KFdlYmZyYWdtZW50UGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0ZSQUdNRU5ULCB0cnVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXZWJGcmFnbWVudChXZWJGcmFnbWVudCBuZXdXZWJGcmFnbWVudCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmJhc2ljQWRkKFdlYmZyYWdtZW50UGFja2FnZS5MaXRlcmFscy5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0ZSQUdNRU5ULCBuZXdXZWJGcmFnbWVudCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0V2ViRnJhZ21lbnQoV2ViRnJhZ21lbnQgbmV3V2ViRnJhZ21lbnQpIHsKKwkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChXZWJmcmFnbWVudFBhY2thZ2UuTGl0ZXJhbHMuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9GUkFHTUVOVCwgbmV3V2ViRnJhZ21lbnQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV2ViZnJhZ21lbnRQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19NSVhFRDoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1peGVkKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJCWNhc2UgV2ViZnJhZ21lbnRQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCQljYXNlIFdlYmZyYWdtZW50UGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWFNJX1NDSEVNQV9MT0NBVElPTjoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQkJY2FzZSBXZWJmcmFnbWVudFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9GUkFHTUVOVDoKKwkJCQlyZXR1cm4gYmFzaWNTZXRXZWJGcmFnbWVudChudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJmcmFnbWVudFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgorCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldE1peGVkKCk7CisJCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5nZXRXcmFwcGVyKCk7CisJCQljYXNlIFdlYmZyYWdtZW50UGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKKwkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKEVNYXAuSW50ZXJuYWxNYXBWaWV3PFN0cmluZywgU3RyaW5nPilnZXRYTUxOU1ByZWZpeE1hcCgpKS5lTWFwKCk7CisJCQkJZWxzZSByZXR1cm4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKKwkJCWNhc2UgV2ViZnJhZ21lbnRQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgorCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoRU1hcC5JbnRlcm5hbE1hcFZpZXc8U3RyaW5nLCBTdHJpbmc+KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmVNYXAoKTsKKwkJCQllbHNlIHJldHVybiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOworCQkJY2FzZSBXZWJmcmFnbWVudFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9GUkFHTUVOVDoKKwkJCQlyZXR1cm4gZ2V0V2ViRnJhZ21lbnQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJmcmFnbWVudFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgorCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQobmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViZnJhZ21lbnRQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YTUxOU19QUkVGSVhfTUFQOgorCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WE1MTlNQcmVmaXhNYXAoKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViZnJhZ21lbnRQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgorCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpKChFTWFwLkludGVybmFsTWFwVmlldzxTdHJpbmcsIFN0cmluZz4pZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSkuZU1hcCgpKS5zZXQobmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViZnJhZ21lbnRQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfRlJBR01FTlQ6CisJCQkJc2V0V2ViRnJhZ21lbnQoKFdlYkZyYWdtZW50KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJmcmFnbWVudFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgorCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdlYmZyYWdtZW50UGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKKwkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXZWJmcmFnbWVudFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046CisJCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV2ViZnJhZ21lbnRQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfRlJBR01FTlQ6CisJCQkJc2V0V2ViRnJhZ21lbnQoKFdlYkZyYWdtZW50KW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXZWJmcmFnbWVudFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX01JWEVEOgorCQkJCXJldHVybiBtaXhlZCAhPSBudWxsICYmICFtaXhlZC5pc0VtcHR5KCk7CisJCQljYXNlIFdlYmZyYWdtZW50UGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUDoKKwkJCQlyZXR1cm4geE1MTlNQcmVmaXhNYXAgIT0gbnVsbCAmJiAheE1MTlNQcmVmaXhNYXAuaXNFbXB0eSgpOworCQkJY2FzZSBXZWJmcmFnbWVudFBhY2thZ2UuV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1hTSV9TQ0hFTUFfTE9DQVRJT046CisJCQkJcmV0dXJuIHhTSVNjaGVtYUxvY2F0aW9uICE9IG51bGwgJiYgIXhTSVNjaGVtYUxvY2F0aW9uLmlzRW1wdHkoKTsKKwkJCWNhc2UgV2ViZnJhZ21lbnRQYWNrYWdlLldFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19XRUJfRlJBR01FTlQ6CisJCQkJcmV0dXJuIGdldFdlYkZyYWdtZW50KCkgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG1peGVkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKG1peGVkKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L2ludGVybmFsL2ltcGwvV2ViZnJhZ21lbnRGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJmcmFnbWVudC9pbnRlcm5hbC9pbXBsL1dlYmZyYWdtZW50RmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhiOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJmcmFnbWVudC9pbnRlcm5hbC9pbXBsL1dlYmZyYWdtZW50RmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJmcmFnbWVudFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgV2ViZnJhZ21lbnRGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFdlYmZyYWdtZW50RmFjdG9yeSB7CisJLyoqCisJICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgV2ViZnJhZ21lbnRGYWN0b3J5IGluaXQoKSB7CisJCXRyeSB7CisJCQlXZWJmcmFnbWVudEZhY3RvcnkgdGhlV2ViZnJhZ21lbnRGYWN0b3J5ID0gKFdlYmZyYWdtZW50RmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYmZyYWdtZW50Iik7IC8vJE5PTi1OTFMtMSQgCisJCQlpZiAodGhlV2ViZnJhZ21lbnRGYWN0b3J5ICE9IG51bGwpIHsKKwkJCQlyZXR1cm4gdGhlV2ViZnJhZ21lbnRGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IFdlYmZyYWdtZW50RmFjdG9yeUltcGwoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBXZWJmcmFnbWVudEZhY3RvcnlJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CisJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFdlYmZyYWdtZW50UGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCk7CisJCQlkZWZhdWx0OgorCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIGNyZWF0ZVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkgeworCQlXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwgd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IgPSBuZXcgV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsKCk7CisJCXJldHVybiB3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgV2ViZnJhZ21lbnRQYWNrYWdlIGdldFdlYmZyYWdtZW50UGFja2FnZSgpIHsKKwkJcmV0dXJuIChXZWJmcmFnbWVudFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBkZXByZWNhdGVkCisJICogQGdlbmVyYXRlZAorCSAqLworCUBEZXByZWNhdGVkCisJcHVibGljIHN0YXRpYyBXZWJmcmFnbWVudFBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKKwkJcmV0dXJuIFdlYmZyYWdtZW50UGFja2FnZS5lSU5TVEFOQ0U7CisJfQorCit9IC8vV2ViZnJhZ21lbnRGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJmcmFnbWVudC9pbnRlcm5hbC9pbXBsL1dlYmZyYWdtZW50UGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViZnJhZ21lbnQvaW50ZXJuYWwvaW1wbC9XZWJmcmFnbWVudFBhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlNDQ4YwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViZnJhZ21lbnQvaW50ZXJuYWwvaW1wbC9XZWJmcmFnbWVudFBhY2thZ2VJbXBsLmphdmEKQEAgLTAsMCArMSwyOTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC5uYW1lc3BhY2UuWE1MTmFtZXNwYWNlUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luLkoyRUVDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVJbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuV2ViZnJhZ21lbnRGYWN0b3J5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJmcmFnbWVudFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgV2ViZnJhZ21lbnRQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFdlYmZyYWdtZW50UGFja2FnZSB7CisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJmcmFnbWVudFBhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIFdlYmZyYWdtZW50UGFja2FnZUltcGwoKSB7CisJCXN1cGVyKGVOU19VUkksIFdlYmZyYWdtZW50RmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgdm9sYXRpbGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIFdlYmZyYWdtZW50UGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZU5TX1VSSQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgV2ViZnJhZ21lbnRQYWNrYWdlIGluaXQoKSB7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChXZWJmcmFnbWVudFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViZnJhZ21lbnRQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJV2ViZnJhZ21lbnRQYWNrYWdlSW1wbCB0aGVXZWJmcmFnbWVudFBhY2thZ2UgPSAoV2ViZnJhZ21lbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgV2ViZnJhZ21lbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBXZWJmcmFnbWVudFBhY2thZ2VJbXBsKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJWE1MTmFtZXNwYWNlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisKKwkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKKwkJdGhlV2ViZnJhZ21lbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlV2ViZnJhZ21lbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKworCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCisJCXRoZVdlYmZyYWdtZW50UGFja2FnZS5mcmVlemUoKTsKKworICAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChXZWJmcmFnbWVudFBhY2thZ2UuZU5TX1VSSSwgdGhlV2ViZnJhZ21lbnRQYWNrYWdlKTsKKworCQlKMkVFSW5pdC5pbml0RU1GTW9kZWxzKCk7CisJCXJldHVybiB0aGVXZWJmcmFnbWVudFBhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpIHsKKwkJcmV0dXJuIHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWFNJU2NoZW1hTG9jYXRpb24oKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSl3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1dlYkZyYWdtZW50KCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgV2ViZnJhZ21lbnRGYWN0b3J5IGdldFdlYmZyYWdtZW50RmFjdG9yeSgpIHsKKwkJcmV0dXJuIChXZWJmcmFnbWVudEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcworCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7CisJCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKKwkJaXNDcmVhdGVkID0gdHJ1ZTsKKworCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKKwkJd2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1IpOworCQljcmVhdGVFQXR0cmlidXRlKHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQpOworCQljcmVhdGVFUmVmZXJlbmNlKHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uod2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JFQ2xhc3MsIFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OKTsKKwkJY3JlYXRlRVJlZmVyZW5jZSh3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1JfX1dFQl9GUkFHTUVOVCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCisJICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOworCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKKwkJc2V0TmFtZShlTkFNRSk7CisJCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOworCQlzZXROc1VSSShlTlNfVVJJKTsKKworCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCisJCVdlYlBhY2thZ2UgdGhlV2ViUGFja2FnZSA9IChXZWJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYlBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycworCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworCisJCWJvb2xlYW4gaGFzTG9jayA9IGZhbHNlOworCQl0cnkgeworCQkJaGFzTG9jayA9IEoyRUVJbml0LmFxdWlyZUluaXRpYWxpemVQYWNrYWdlQ29udGVudHNMb2NrKCk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9CQkKKwkJCisJCXRyeXsKKwkJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkKKwkJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCQlpbml0RUNsYXNzKHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yRUNsYXNzLCBXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvci5jbGFzcywgIldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAibWl4ZWQiLCBudWxsLCAwLCAtMSwgbnVsbCwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hNTE5TUHJlZml4TWFwKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieE1MTlNQcmVmaXhNYXAiLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgbnVsbCwgInhTSVNjaGVtYUxvY2F0aW9uIiwgbnVsbCwgMCwgLTEsIG51bGwsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfV2ViRnJhZ21lbnQoKSwgdGhlV2ViUGFja2FnZS5nZXRXZWJGcmFnbWVudCgpLCBudWxsLCAid2ViRnJhZ21lbnQiLCBudWxsLCAwLCAtMiwgbnVsbCwgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJLy8gQ3JlYXRlIHJlc291cmNlCisJCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwkKKwkJCS8vIENyZWF0ZSBhbm5vdGF0aW9ucworCQkJLy8gaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhCisJCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKKwkJfWZpbmFsbHl7CisJCQlpZiggaGFzTG9jayApCisJCQkJSjJFRUluaXQucmVsZWFzZUluaXRpYWxpemVQYWNrYWdlQ29udGVudHNMb2NrKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YTwvYj4uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCkgeworCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI7IC8vJE5PTi1OTFMtMSQJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgICh3ZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckVDbGFzcywgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgIm5hbWUiLCAiIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgImtpbmQiLCAibWl4ZWQiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQorCQlhZGRBbm5vdGF0aW9uCisJCSAgKGdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX01peGVkKCksIAorCQkgICBzb3VyY2UsIAorCQkgICBuZXcgU3RyaW5nW10geworCQkJICJraW5kIiwgImVsZW1lbnRXaWxkY2FyZCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJICJuYW1lIiwgIjptaXhlZCIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOwkJCisJCWFkZEFubm90YXRpb24KKwkJICAoZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfWE1MTlNQcmVmaXhNYXAoKSwgCisJCSAgIHNvdXJjZSwgCisJCSAgIG5ldyBTdHJpbmdbXSB7CisJCQkgImtpbmQiLCAiYXR0cmlidXRlIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAieG1sbnM6cHJlZml4IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJICAgfSk7CQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJhdHRyaWJ1dGUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCSAibmFtZSIsICJ4c2k6c2NoZW1hTG9jYXRpb24iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkgICB9KTsJCQkKKwkJYWRkQW5ub3RhdGlvbgorCQkgIChnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9XZWJGcmFnbWVudCgpLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAia2luZCIsICJlbGVtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWUiLCAid2ViLWZyYWdtZW50IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCSAgIH0pOworCX0KKworfSAvL1dlYmZyYWdtZW50UGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViZnJhZ21lbnQvaW50ZXJuYWwvbWV0YWRhdGEvV2ViZnJhZ21lbnRQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L2ludGVybmFsL21ldGFkYXRhL1dlYmZyYWdtZW50UGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ODlhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L2ludGVybmFsL21ldGFkYXRhL1dlYmZyYWdtZW50UGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsNTU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LmludGVybmFsLm1ldGFkYXRhOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5XZWJmcmFnbWVudEZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAorICogPHVsPgorICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKyAqIDwvdWw+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgorICogCisgKiAgICAgICBAKCMpd2ViLWZyYWdtZW50XzNfMC54c2RzCisgKiAgICAgCisgKiAKKyAqICAgICAgIDwhW0NEQVRBW1sKKyAqICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBTZXJ2bGV0IDMuMCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuCisgKiAgICAgICBUaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIG11c3QgYmUgbmFtZWQgIk1FVEEtSU5GL3dlYi1mcmFnbWVudC54bWwiCisgKiAgICAgICBpbiB0aGUgd2ViIGZyYWdtZW50J3MgamFyIGZpbGUuICBBbGwgU2VydmxldCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCisgKiAgICAgICBtdXN0IGluZGljYXRlIHRoZSB3ZWIgYXBwbGljYXRpb24gc2NoZW1hIGJ5IHVzaW5nIHRoZSBKYXZhIEVFCisgKiAgICAgICBuYW1lc3BhY2U6CisgKiAgICAgICAKKyAqICAgICAgIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSAKKyAqICAgICAgIAorICogICAgICAgYW5kIGJ5IGluZGljYXRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSAKKyAqICAgICAgIHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6IAorICogICAgICAgCisgKiAgICAgICA8d2ViLWZyYWdtZW50IHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgKiAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICogICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSIuLi4iCisgKiAgICAgICB2ZXJzaW9uPSIzLjAiPiAKKyAqICAgICAgIC4uLgorICogICAgICAgPC93ZWItZnJhZ21lbnQ+CisgKiAgICAgICAKKyAqICAgICAgIFRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgorICogICAgICAgdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQorICogICAgICAgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKKyAqICAgICAgIAorICogICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mcmFnbWVudF8zXzAueHNkCisgKiAgICAgICAKKyAqICAgICAgIF1dPgorICogICAgIAorICogCisgKiAKKyAqICAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKKyAqICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KKyAqIAorICogICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQorICogCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90CisgKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCisgKiAJdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQorICogCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCisgKiAJSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKKyAqIAlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKKyAqIAluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KKyAqIAorICogICAgIAorICogCisgKiAKKyAqICAgICAgICRJZDogV2ViZnJhZ21lbnRQYWNrYWdlLmphdmEsdiAxLjQgMjAxMC8wMi8xMSAwNjoyMjo1MCBjYW5kZXJzb24gRXhwICQKKyAqICAgICAgIAorICogICAgIAorICogCisgKiA8IVtDREFUQVtbCisgKiAgICAgICBUaGlzIGlzIHRoZSBjb21tb24gWE1MIFNjaGVtYSBmb3IgdGhlIFNlcnZsZXQgMy4wIGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAqICAgICAgIFRoaXMgZmlsZSBpcyBpbiB0dXJuIHVzZWQgYnkgd2ViLnhtbCBhbmQgd2ViLWZyYWdtZW50LnhtbAorICogICAgICAgd2ViIGFwcGxpY2F0aW9uJ3Mgd2FyIGZpbGUuICBBbGwgU2VydmxldCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzCisgKiAgICAgICBtdXN0IGluZGljYXRlIHRoZSB3ZWIgY29tbW9uIHNjaGVtYSBieSB1c2luZyB0aGUgSmF2YSBFRQorICogICAgICAgbmFtZXNwYWNlOgorICogICAgICAgCisgKiAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgCisgKiAgICAgICAKKyAqICAgICAgIGFuZCBieSBpbmRpY2F0aW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgCisgKiAgICAgICB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OiAKKyAqICAgICAgIAorICogICAgICAgPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKKyAqICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgKiAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Ii4uLiIKKyAqICAgICAgIHZlcnNpb249IjMuMCI+IAorICogICAgICAgLi4uCisgKiAgICAgICA8L3dlYi1hcHA+CisgKiAgICAgICAKKyAqICAgICAgIFRoZSBpbnN0YW5jZSBkb2N1bWVudHMgbWF5IGluZGljYXRlIHRoZSBwdWJsaXNoZWQgdmVyc2lvbiBvZgorICogICAgICAgdGhlIHNjaGVtYSB1c2luZyB0aGUgeHNpOnNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBmb3IgSmF2YSBFRQorICogICAgICAgbmFtZXNwYWNlIHdpdGggdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKKyAqICAgICAgIAorICogICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1jb21tb25fM18wLnhzZAorICogICAgICAgCisgKiBdXT4KKyAqICAgICAKKyAqIAorICogCisgKiAgICAgICBUaGUgZm9sbG93aW5nIGNvbnZlbnRpb25zIGFwcGx5IHRvIGFsbCBKYXZhIEVFCisgKiAgICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZWxlbWVudHMgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCisgKiAgICAgICAKKyAqICAgICAgIC0gSW4gZWxlbWVudHMgdGhhdCBzcGVjaWZ5IGEgcGF0aG5hbWUgdG8gYSBmaWxlIHdpdGhpbiB0aGUKKyAqICAgICAgIHNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90CisgKiAgICAgICBzdGFydGluZyB3aXRoICIvIikgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YKKyAqICAgICAgIHRoZSBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEFic29sdXRlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2UKKyAqICAgICAgIHN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCisgKiAgICAgICBKQVIgZmlsZSdzIG5hbWVzcGFjZS4gIEluIGdlbmVyYWwsIHJlbGF0aXZlIG5hbWVzIGFyZQorICogICAgICAgcHJlZmVycmVkLiAgVGhlIGV4Y2VwdGlvbiBpcyAud2FyIGZpbGVzIHdoZXJlIGFic29sdXRlCisgKiAgICAgICBuYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KKyAqICAgICAgIAorICogICAgIAorICogCisgKiAKKyAqICAgICAgICRJZDogV2ViZnJhZ21lbnRQYWNrYWdlLmphdmEsdiAxLjQgMjAxMC8wMi8xMSAwNjoyMjo1MCBjYW5kZXJzb24gRXhwICQKKyAqICAgICAgIAorICogICAgIAorICogCisgKiAKKyAqICAgICAgIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgdGhhdCBhcHBlYXIgaW4gdGhlIGNvbW1vbgorICogICAgICAgc2hhcmVhYmxlIHNjaGVtYShzKSBvZiBKYXZhIEVFIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgc2hvdWxkIGJlCisgKiAgICAgICBpbnRlcnByZXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGNvbnRleHQgdGhleSBhcmUgaW5jbHVkZWQ6CisgKiAgICAgICAKKyAqICAgICAgIERlcGxveW1lbnQgQ29tcG9uZW50IG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqICAgICAgIGphdmEgZWUgYXBwbGljYXRpb247CisgKiAgICAgICBhcHBsaWNhdGlvbiBjbGllbnQ7CisgKiAgICAgICB3ZWIgYXBwbGljYXRpb247CisgKiAgICAgICBlbnRlcnByaXNlIGJlYW47CisgKiAgICAgICByZXNvdXJjZSBhZGFwdGVyOyAKKyAqICAgICAgIAorICogICAgICAgRGVwbG95bWVudCBGaWxlIG1heSBpbmRpY2F0ZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqICAgICAgIGVhciBmaWxlOworICogICAgICAgd2FyIGZpbGU7CisgKiAgICAgICBqYXIgZmlsZTsKKyAqICAgICAgIHJhciBmaWxlOworICogICAgICAgCisgKiAgICAgCisgKiAKKyAqIAorICogICAgICAgJElkOiBXZWJmcmFnbWVudFBhY2thZ2UuamF2YSx2IDEuNCAyMDEwLzAyLzExIDA2OjIyOjUwIGNhbmRlcnNvbiBFeHAgJAorICogICAgICAgCisgKiAgICAgCisgKiAKKyAqIAorICogICAgICAgKEMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIDIwMDIKKyAqICAgICAgIAorICogICAgIAorICogCisgKiAgICA8ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAqICAgICA8aDE+QWJvdXQgdGhlIFhNTCBuYW1lc3BhY2U8L2gxPgorICogCisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIFRoaXMgc2NoZW1hIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgWE1MIG5hbWVzcGFjZSwgaW4gYSBmb3JtCisgKiAgICAgICBzdWl0YWJsZSBmb3IgaW1wb3J0IGJ5IG90aGVyIHNjaGVtYSBkb2N1bWVudHMuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWwiPgorICogICAgICAgaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLmh0bWw8L2E+IGFuZAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCI+CisgKiAgICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sPC9hPiBmb3IgaW5mb3JtYXRpb24gCisgKiAgICAgICBhYm91dCB0aGlzIG5hbWVzcGFjZS4KKyAqICAgICAgPC9wPgorICogICAgICA8cD4KKyAqICAgICAgIE5vdGUgdGhhdCBsb2NhbCBuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgaW50ZW5kZWQgdG8gYmUKKyAqICAgICAgIGRlZmluZWQgb25seSBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBvciBpdHMgc3ViZ3JvdXBzLgorICogICAgICAgVGhlIG5hbWVzIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBsaXN0ZWQgYmVsb3cuCisgKiAgICAgICBUaGV5IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIGNvbmZsaWN0aW5nIHNlbWFudGljcyBieSBhbnkgV29ya2luZworICogICAgICAgR3JvdXAsIHNwZWNpZmljYXRpb24sIG9yIGRvY3VtZW50IGluc3RhbmNlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPiAgIAorICogICAgICAgU2VlIGZ1cnRoZXIgYmVsb3cgaW4gdGhpcyBkb2N1bWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8YSBocmVmPSIjdXNhZ2UiPmhvdyB0byByZWZlciB0byB0aGlzIHNjaGVtYSBkb2N1bWVudCBmcm9tIHlvdXIgb3duCisgKiAgICAgICBYU0Qgc2NoZW1hIGRvY3VtZW50czwvYT4gYW5kIGFib3V0IDxhIGhyZWY9IiNuc3ZlcnNpb25pbmciPnRoZQorICogICAgICAgbmFtZXNwYWNlLXZlcnNpb25pbmcgcG9saWN5IGdvdmVybmluZyB0aGlzIHNjaGVtYSBkb2N1bWVudDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgorICogICAKKyAqIAorICogICAgPGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgKiAgICAKKyAqICAgICA8aDM+RmF0aGVyIChpbiBhbnkgY29udGV4dCBhdCBhbGwpPC9oMz4gCisgKiAKKyAqICAgICA8ZGl2IGNsYXNzPSJib2R5dGV4dCI+CisgKiAgICAgIDxwPgorICogICAgICAgZGVub3RlcyBKb24gQm9zYWssIHRoZSBjaGFpciBvZiAKKyAqICAgICAgIHRoZSBvcmlnaW5hbCBYTUwgV29ya2luZyBHcm91cC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZCBieSAKKyAqICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjaXNpb24gb2YgdGhlIFczQyBYTUwgUGxlbmFyeSBhbmQgCisgKiAgICAgICBYTUwgQ29vcmRpbmF0aW9uIGdyb3VwczoKKyAqICAgICAgPC9wPgorICogICAgICA8YmxvY2txdW90ZT4KKyAqICAgICAgICA8cD4KKyAqIAlJbiBhcHByZWNpYXRpb24gZm9yIGhpcyB2aXNpb24sIGxlYWRlcnNoaXAgYW5kCisgKiAJZGVkaWNhdGlvbiB0aGUgVzNDIFhNTCBQbGVuYXJ5IG9uIHRoaXMgMTB0aCBkYXkgb2YKKyAqIAlGZWJydWFyeSwgMjAwMCwgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5CisgKiAJdGhlIFhNTCBuYW1lICJ4bWw6RmF0aGVyIi4KKyAqICAgICAgICA8L3A+CisgKiAgICAgIDwvYmxvY2txdW90ZT4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgorICogICAKKyAqIAorICogICAgPGRpdiBpZD0idXNhZ2UiIHhtbDppZD0idXNhZ2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKyAqICAgICA8aDI+CisgKiAgICAgICA8YSBuYW1lPSJ1c2FnZSI+QWJvdXQgdGhpcyBzY2hlbWEgZG9jdW1lbnQ8L2E+CisgKiAgICAgPC9oMj4KKyAqIAorICogICAgIDxkaXYgY2xhc3M9ImJvZHl0ZXh0Ij4KKyAqICAgICAgPHA+CisgKiAgICAgICBUaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cCBzdWl0YWJsZQorICogICAgICAgZm9yIHVzZSBieSBzY2hlbWFzIHdpc2hpbmcgdG8gYWxsb3cgPGNvZGU+eG1sOmJhc2U8L2NvZGU+LAorICogICAgICAgPGNvZGU+eG1sOmxhbmc8L2NvZGU+LCA8Y29kZT54bWw6c3BhY2U8L2NvZGU+IG9yCisgKiAgICAgICA8Y29kZT54bWw6aWQ8L2NvZGU+IGF0dHJpYnV0ZXMgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBUbyBlbmFibGUgdGhpcywgc3VjaCBhIHNjaGVtYSBtdXN0IGltcG9ydCB0aGlzIHNjaGVtYSBmb3IKKyAqICAgICAgIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6CisgKiAgICAgIDwvcD4KKyAqICAgICAgPHByZT4KKyAqICAgICAgICAgICAmbHQ7c2NoZW1hIC4gLiAuJmd0OworICogICAgICAgICAgICAuIC4gLgorICogICAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgorICogICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLyZndDsKKyAqICAgICAgPC9wcmU+CisgKiAgICAgIDxwPgorICogICAgICAgb3IKKyAqICAgICAgPC9wPgorICogICAgICA8cHJlPgorICogICAgICAgICAgICAmbHQ7aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgorICogICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QiLyZndDsKKyAqICAgICAgPC9wcmU+CisgKiAgICAgIDxwPgorICogICAgICAgU3Vic2VxdWVudGx5LCBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGFueSBvZiB0aGUgYXR0cmlidXRlcyBvciB0aGUKKyAqICAgICAgIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgorICogICAgICA8L3A+CisgKiAgICAgIDxwcmU+CisgKiAgICAgICAgICAgJmx0O3R5cGUgLiAuIC4mZ3Q7CisgKiAgICAgICAgICAgIC4gLiAuCisgKiAgICAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLyZndDsKKyAqICAgICAgPC9wcmU+CisgKiAgICAgIDxwPgorICogICAgICAgd2lsbCBkZWZpbmUgYSB0eXBlIHdoaWNoIHdpbGwgc2NoZW1hLXZhbGlkYXRlIGFuIGluc3RhbmNlIGVsZW1lbnQKKyAqICAgICAgIHdpdGggYW55IG9mIHRob3NlIGF0dHJpYnV0ZXMuCisgKiAgICAgIDwvcD4KKyAqICAgICA8L2Rpdj4KKyAqICAgIDwvZGl2PgorICogICAKKyAqIAorICogICAgPGRpdiBpZD0ibnN2ZXJzaW9uaW5nIiB4bWw6aWQ9Im5zdmVyc2lvbmluZyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorICogICAgIDxoMj4KKyAqICAgICAgIDxhIG5hbWU9Im5zdmVyc2lvbmluZyI+VmVyc2lvbmluZyBwb2xpY3kgZm9yIHRoaXMgc2NoZW1hIGRvY3VtZW50PC9hPgorICogICAgIDwvaDI+CisgKiAgICAgPGRpdiBjbGFzcz0iYm9keXRleHQiPgorICogICAgICA8cD4KKyAqICAgICAgIEluIGtlZXBpbmcgd2l0aCB0aGUgWE1MIFNjaGVtYSBXRydzIHN0YW5kYXJkIHZlcnNpb25pbmcKKyAqICAgICAgIHBvbGljeSwgdGhpcyBzY2hlbWEgZG9jdW1lbnQgd2lsbCBwZXJzaXN0IGF0CisgKiAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QiPgorICogICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDkvMDEveG1sLnhzZDwvYT4uCisgKiAgICAgIDwvcD4KKyAqICAgICAgPHA+CisgKiAgICAgICBBdCB0aGUgZGF0ZSBvZiBpc3N1ZSBpdCBjYW4gYWxzbyBiZSBmb3VuZCBhdAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Q8L2E+LgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgVGhlIHNjaGVtYSBkb2N1bWVudCBhdCB0aGF0IFVSSSBtYXkgaG93ZXZlciBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwKKyAqICAgICAgIGluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhNTAorICogICAgICAgU2NoZW1hIGl0c2VsZiwgb3Igd2l0aCB0aGUgWE1MIG5hbWVzcGFjZSBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywKKyAqICAgICAgIGlmIHRoZSBYTUwgU2NoZW1hIG9yIFhNTCBuYW1lc3BhY2VzIGNoYW5nZSwgdGhlIHZlcnNpb24gb2YgdGhpcworICogICAgICAgZG9jdW1lbnQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QgCisgKiAgICAgICA8L2E+IAorICogICAgICAgd2lsbCBjaGFuZ2UgYWNjb3JkaW5nbHk7IHRoZSB2ZXJzaW9uIGF0IAorICogICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2QgCisgKiAgICAgICA8L2E+IAorICogICAgICAgd2lsbCBub3QgY2hhbmdlLgorICogICAgICA8L3A+CisgKiAgICAgIDxwPgorICogICAgICAgUHJldmlvdXMgZGF0ZWQgKGFuZCB1bmNoYW5naW5nKSB2ZXJzaW9ucyBvZiB0aGlzIHNjaGVtYSAKKyAqICAgICAgIGRvY3VtZW50IGFyZSBhdDoKKyAqICAgICAgPC9wPgorICogICAgICA8dWw+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwOS8wMS94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA5LzAxL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwNy8wOC94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA3LzA4L3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwNC8xMC94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDA0LzEwL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgICA8bGk+CisgKiAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIj4KKyAqIAlodHRwOi8vd3d3LnczLm9yZy8yMDAxLzAzL3htbC54c2Q8L2E+CisgKiAgICAgICAgIDwvbGk+CisgKiAgICAgIDwvdWw+CisgKiAgICAgPC9kaXY+CisgKiAgICA8L2Rpdj4KKyAqICAgCisgKiAKKyAqICAgICAgIEAoIylqc3BfMl8yLnhzZHMJMDIvMjYvMDkKKyAqICAgICAKKyAqIAorICogCisgKiAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgSlNQIDIuMiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAqICAgICAgIHR5cGVzLiAgVGhlIEpTUCAyLjIgc2NoZW1hIGNvbnRhaW5zIGFsbCB0aGUgc3BlY2lhbAorICogICAgICAgc3RydWN0dXJlcyBhbmQgZGF0YXR5cGVzIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byB1c2UgSlNQIGZpbGVzCisgKiAgICAgICBmcm9tIGEgd2ViIGFwcGxpY2F0aW9uLgorICogCisgKiAgICAgICBUaGUgY29udGVudHMgb2YgdGhpcyBzY2hlbWEgaXMgdXNlZCBieSB0aGUgd2ViLWNvbW1vbl8zXzAueHNkCisgKiAgICAgICBmaWxlIHRvIGRlZmluZSBKU1Agc3BlY2lmaWMgY29udGVudC4KKyAqIAorICogICAgIAorICogCisgKiAKKyAqICAgICAgIFRoZSBmb2xsb3dpbmcgY29udmVudGlvbnMgYXBwbHkgdG8gYWxsIEphdmEgRUUKKyAqICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBlbGVtZW50cyB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KKyAqIAorICogICAgICAgLSBJbiBlbGVtZW50cyB0aGF0IHNwZWNpZnkgYSBwYXRobmFtZSB0byBhIGZpbGUgd2l0aGluIHRoZQorICogCXNhbWUgSkFSIGZpbGUsIHJlbGF0aXZlIGZpbGVuYW1lcyAoaS5lLiwgdGhvc2Ugbm90CisgKiAJc3RhcnRpbmcgd2l0aCAiLyIpIGFyZSBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mCisgKiAJdGhlIEpBUiBmaWxlJ3MgbmFtZXNwYWNlLiAgQWJzb2x1dGUgZmlsZW5hbWVzIChpLmUuLCB0aG9zZQorICogCXN0YXJ0aW5nIHdpdGggIi8iKSBhbHNvIHNwZWNpZnkgbmFtZXMgaW4gdGhlIHJvb3Qgb2YgdGhlCisgKiAJSkFSIGZpbGUncyBuYW1lc3BhY2UuICBJbiBnZW5lcmFsLCByZWxhdGl2ZSBuYW1lcyBhcmUKKyAqIAlwcmVmZXJyZWQuICBUaGUgZXhjZXB0aW9uIGlzIC53YXIgZmlsZXMgd2hlcmUgYWJzb2x1dGUKKyAqIAluYW1lcyBhcmUgcHJlZmVycmVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBTZXJ2bGV0IEFQSS4KKyAqIAorICogICAgIAorICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LldlYmZyYWdtZW50RmFjdG9yeQorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFdlYmZyYWdtZW50UGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTkFNRSA9ICJ3ZWJmcmFnbWVudCI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mcmFnbWVudF8zXzAueHNkIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJU3RyaW5nIGVOU19QUkVGSVggPSAid2ViZnJhZ21lbnQiOyAvLyROT04tTkxTLTEkCisKKwkvKioKKwkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVdlYmZyYWdtZW50UGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LmludGVybmFsLmltcGwuV2ViZnJhZ21lbnRQYWNrYWdlSW1wbC5pbml0KCk7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuaW50ZXJuYWwuaW1wbC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckltcGwgPGVtPldlYiBBcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5pbXBsLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5pbXBsLldlYmZyYWdtZW50UGFja2FnZUltcGwjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQgPSAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCA9IDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWIgRnJhZ21lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0ZSQUdNRU5UID0gMzsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5XZWIgQXBwIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gNDsKKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciA8ZW0+V2ViIEFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V2ViIEFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5NaXhlZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0TWl4ZWQoKQorCSAqIEBzZWUgI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9NaXhlZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WE1MTlNQcmVmaXhNYXAoKQorCSAqIEBzZWUgI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQorCSAqIEBzZWUgI2dldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YU0lTY2hlbWFMb2NhdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFdlYkZyYWdtZW50IDxlbT5XZWIgRnJhZ21lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5XZWIgRnJhZ21lbnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yI2dldFdlYkZyYWdtZW50KCkKKwkgKiBAc2VlICNnZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfV2ViRnJhZ21lbnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogQGdlbmVyYXRlZAorCSAqLworCVdlYmZyYWdtZW50RmFjdG9yeSBnZXRXZWJmcmFnbWVudEZhY3RvcnkoKTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAorCSAqIDx1bD4KKwkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKwkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKwkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgorCSAqIDwvdWw+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCWludGVyZmFjZSBMaXRlcmFscyB7CisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5pbXBsLldlYkFwcERlcGxveW1lbnREZXNjcmlwdG9ySW1wbCA8ZW0+V2ViIEFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LmludGVybmFsLmltcGwuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5pbXBsLldlYmZyYWdtZW50UGFja2FnZUltcGwjZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgV0VCX0FQUF9ERVBMT1lNRU5UX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fTUlYRUQgPSBlSU5TVEFOQ0UuZ2V0V2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JfTWl4ZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fWE1MTlNfUFJFRklYX01BUCA9IGVJTlNUQU5DRS5nZXRXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcl9YTUxOU1ByZWZpeE1hcCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFdFQl9BUFBfREVQTE9ZTUVOVF9ERVNDUklQVE9SX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1hTSVNjaGVtYUxvY2F0aW9uKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XZWIgRnJhZ21lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBXRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUl9fV0VCX0ZSQUdNRU5UID0gZUlOU1RBTkNFLmdldFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yX1dlYkZyYWdtZW50KCk7CisKKwl9CisKK30gLy9XZWJmcmFnbWVudFBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViZnJhZ21lbnQvaW50ZXJuYWwvdXRpbC9XZWJmcmFnbWVudEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L2ludGVybmFsL3V0aWwvV2ViZnJhZ21lbnRBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjM2E0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L2ludGVybmFsL3V0aWwvV2ViZnJhZ21lbnRBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LmludGVybmFsLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuaW50ZXJuYWwubWV0YWRhdGEuV2ViZnJhZ21lbnRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJmcmFnbWVudFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFdlYmZyYWdtZW50QWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIFdlYmZyYWdtZW50UGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFdlYmZyYWdtZW50QWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gV2ViZnJhZ21lbnRQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgV2ViZnJhZ21lbnRTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgV2ViZnJhZ21lbnRTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcihXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgorCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgeworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKKwl9CisKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciA8ZW0+V2ViIEFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5XZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9XZWJmcmFnbWVudEFkYXB0ZXJGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L2ludGVybmFsL3V0aWwvV2ViZnJhZ21lbnRSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L2ludGVybmFsL3V0aWwvV2ViZnJhZ21lbnRSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1MDQxOAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViZnJhZ21lbnQvaW50ZXJuYWwvdXRpbC9XZWJmcmFnbWVudFJlc291cmNlRmFjdG9yeUltcGwuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmZyYWdtZW50LmludGVybmFsLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC51dGlsLldlYmZyYWdtZW50UmVzb3VyY2VJbXBsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBXZWJmcmFnbWVudFJlc291cmNlRmFjdG9yeUltcGwgZXh0ZW5kcyBSZXNvdXJjZUZhY3RvcnlJbXBsIHsKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBXZWJmcmFnbWVudFJlc291cmNlRmFjdG9yeUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKKwkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IFdlYmZyYWdtZW50UmVzb3VyY2VJbXBsKHVyaSk7CisJCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKKwkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOworCisJCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NDSEVNQV9MT0NBVElPTiwgQm9vbGVhbi5UUlVFKTsKKworCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7CisJCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKKworCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworfSAvL1dlYmZyYWdtZW50UmVzb3VyY2VGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJmcmFnbWVudC9pbnRlcm5hbC91dGlsL1dlYmZyYWdtZW50UmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L2ludGVybmFsL3V0aWwvV2ViZnJhZ21lbnRSZXNvdXJjZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTA2MDRhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJmcmFnbWVudC9pbnRlcm5hbC91dGlsL1dlYmZyYWdtZW50UmVzb3VyY2VJbXBsLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MTG9hZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSkVFWE1MTG9hZEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWwuSmF2YWVlUmVzb3VyY2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJGcmFnbWVudFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZyYWdtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuSVJvb3RPYmplY3RSZXNvdXJjZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlJlc291cmNlIDwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuaW50ZXJuYWwudXRpbC5XZWJmcmFnbWVudFJlc291cmNlRmFjdG9yeUltcGwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFdlYmZyYWdtZW50UmVzb3VyY2VJbXBsIGV4dGVuZHMgSmF2YWVlUmVzb3VyY2VJbXBsIGltcGxlbWVudHMgSVJvb3RPYmplY3RSZXNvdXJjZSwgSVdlYkZyYWdtZW50UmVzb3VyY2UgeworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHVyaSB0aGUgVVJJIG9mIHRoZSBuZXcgcmVzb3VyY2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBXZWJmcmFnbWVudFJlc291cmNlSW1wbChVUkkgdXJpKSB7CisJCXN1cGVyKHVyaSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFhNTExvYWQgY3JlYXRlWE1MTG9hZCgpIHsKKwkJIHJldHVybiBuZXcgSkVFWE1MTG9hZEltcGwoY3JlYXRlWE1MSGVscGVyKCkpOworCX0KKworCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCkgeworCQkKKwkJcmV0dXJuIG5ldyBXZWJmcmFnbWVudFhNTEhlbHBlckltcGwodGhpcyk7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuSUNvbm5lY3RvclJlc291cmNlI2dldFJvb3RPYmplY3QoKQorCSAqLworCXB1YmxpYyBFT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7CisJCWlmIChjb250ZW50cyA9PSBudWxsIHx8IGNvbnRlbnRzLmlzRW1wdHkoKSkKKwkJCXJldHVybiBudWxsOworCQlPYmplY3Qgcm9vdCA9IGdldENvbnRlbnRzKCkuZ2V0KDApOworCQlpZihyb290ID09IG51bGwpeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIChFT2JqZWN0KSgoV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3Ipcm9vdCkuZ2V0V2ViRnJhZ21lbnQoKTsKKwl9CisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuSUNvbm5lY3RvclJlc291cmNlI2dldENvbm5lY3RvcigpCisJICovCisJcHVibGljIFdlYkZyYWdtZW50IGdldFdlYkZyYWdtZW50KCkgeworCQlyZXR1cm4gKFdlYkZyYWdtZW50KWdldFJvb3RPYmplY3QoKTsKKwl9CisKK30gLy9XZWJmcmFnbWVudFJlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJmcmFnbWVudC9pbnRlcm5hbC91dGlsL1dlYmZyYWdtZW50U3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L2ludGVybmFsL3V0aWwvV2ViZnJhZ21lbnRTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQyMWViCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJmcmFnbWVudC9pbnRlcm5hbC91dGlsL1dlYmZyYWdtZW50U3dpdGNoLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuaW50ZXJuYWwudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuKjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuaW50ZXJuYWwubWV0YWRhdGEuV2ViZnJhZ21lbnRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQorICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuaW50ZXJuYWwubWV0YWRhdGEuV2ViZnJhZ21lbnRQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBXZWJmcmFnbWVudFN3aXRjaDxUPiB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBXZWJmcmFnbWVudFBhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBXZWJmcmFnbWVudFN3aXRjaCgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBXZWJmcmFnbWVudFBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOworCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgeworCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7CisJCX0KKwkJZWxzZSB7CisJCQlMaXN0PEVDbGFzcz4gZVN1cGVyVHlwZXMgPSB0aGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKTsKKwkJCXJldHVybgorCQkJCWVTdXBlclR5cGVzLmlzRW1wdHkoKSA/CisJCQkJCWRlZmF1bHRDYXNlKHRoZUVPYmplY3QpIDoKKwkJCQkJZG9Td2l0Y2goZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7CisJCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7CisJCQljYXNlIFdlYmZyYWdtZW50UGFja2FnZS5XRUJfQVBQX0RFUExPWU1FTlRfREVTQ1JJUFRPUjogeworCQkJCVdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yIHdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yID0gKFdlYkFwcERlcGxveW1lbnREZXNjcmlwdG9yKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlV2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3Iod2ViQXBwRGVwbG95bWVudERlc2NyaXB0b3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlYiBBcHAgRGVwbG95bWVudCBEZXNjcmlwdG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2ViIEFwcCBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvcihXZWJBcHBEZXBsb3ltZW50RGVzY3JpcHRvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9XZWJmcmFnbWVudFN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJmcmFnbWVudC9pbnRlcm5hbC91dGlsL1dlYmZyYWdtZW50WE1MSGVscGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJmcmFnbWVudC9pbnRlcm5hbC91dGlsL1dlYmZyYWdtZW50WE1MSGVscGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZGI1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvamVlLW1vZGVscy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL3dlYmZyYWdtZW50L2ludGVybmFsL3V0aWwvV2ViZnJhZ21lbnRYTUxIZWxwZXJJbXBsLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuaW50ZXJuYWwudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5tZXRhZGF0YS5Kc3BQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJmcmFnbWVudFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLnV0aWwuSkVFWE1MSGVscGVySW1wbDsKKworcHVibGljIGNsYXNzIFdlYmZyYWdtZW50WE1MSGVscGVySW1wbCBleHRlbmRzIEpFRVhNTEhlbHBlckltcGwgeworCisJcHVibGljIFdlYmZyYWdtZW50WE1MSGVscGVySW1wbChYTUxSZXNvdXJjZSByZXNvdXJjZSkgeworCQlzdXBlcihyZXNvdXJjZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVUkkoU3RyaW5nIHByZWZpeCkgeworCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBXZWJmcmFnbWVudFBhY2thZ2UuZU5TX1VSSTsKKwkJZWxzZQorCQkJcmV0dXJuIHN1cGVyLmdldFVSSShwcmVmaXgpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UU5hbWUoRVBhY2thZ2UgZVBhY2thZ2UsIFN0cmluZyBuYW1lLCBib29sZWFuIG11c3RIYXZlUHJlZml4KSB7CisJCVN0cmluZyBuc1ByZWZpeCA9IGdldFByZWZpeChlUGFja2FnZSwgbXVzdEhhdmVQcmVmaXgpOworCQkvLyBOb3QgdXNpbmcgRUU1IHBhY2thZ2UgbmFtZXNwYWNlIC0gZGVmYXVsdCBqZWU1IG5hbWVzcGFjZSBpcyB1c2VkCisJCWlmIChuc1ByZWZpeC5lcXVhbHMoV2ViZnJhZ21lbnRQYWNrYWdlLmVOU19QUkVGSVgpIHx8IG5zUHJlZml4LmVxdWFscyhXZWJQYWNrYWdlLmVOU19QUkVGSVgpIHx8IG5zUHJlZml4LmVxdWFscyhKc3BQYWNrYWdlLmVOU19QUkVGSVgpKSB7CisJCQlyZXR1cm4gbmFtZTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gc3VwZXIuZ2V0UU5hbWUoZVBhY2thZ2UsIG5hbWUsIG11c3RIYXZlUHJlZml4KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoRUNsYXNzIGNsYXNzMSwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNFbGVtZW50KSB7CisJCQorCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdCA9IHN1cGVyLmdldEZlYXR1cmUoY2xhc3MxLCBuYW1lc3BhY2VVUkksIG5hbWUsIGlzRWxlbWVudCk7CisJCWlmIChmZWF0ID09IG51bGwpCisJCXsKKwkJCS8vVHJ5IHRvIHVzZSB3ZWItYXBwIG5hbWVzcGFjZQorCQkJZmVhdCA9IHN1cGVyLmdldEZlYXR1cmUoY2xhc3MxLCBXZWJQYWNrYWdlLmVOU19VUkksIG5hbWUsIGlzRWxlbWVudCk7CisJCX0KKwkJaWYgKGZlYXQgPT0gbnVsbCkKKwkJeworCQkJLy9UcnkgdG8gdXNlIEpTUCBuYW1lc3BhY2UKKwkJCWZlYXQgPSBzdXBlci5nZXRGZWF0dXJlKGNsYXNzMSwgSnNwUGFja2FnZS5lTlNfVVJJLCBuYW1lLCBpc0VsZW1lbnQpOworCQl9CisJCXJldHVybiBmZWF0OworCQkKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViZnJhZ21lbnQvaW50ZXJuYWwvdXRpbC9XZWJmcmFnbWVudFhNTFByb2Nlc3Nvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL2plZS1tb2RlbHMvb3JnL2VjbGlwc2UvanN0L2phdmFlZS93ZWJmcmFnbWVudC9pbnRlcm5hbC91dGlsL1dlYmZyYWdtZW50WE1MUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3NjM3MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9qZWUtbW9kZWxzL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvd2ViZnJhZ21lbnQvaW50ZXJuYWwvdXRpbC9XZWJmcmFnbWVudFhNTFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViZnJhZ21lbnQuaW50ZXJuYWwudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLnV0aWwuWE1MUHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJmcmFnbWVudFBhY2thZ2U7CisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIFhNTCBkb2N1bWVudHMKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFdlYmZyYWdtZW50WE1MUHJvY2Vzc29yIGV4dGVuZHMgWE1MUHJvY2Vzc29yIHsKKworCS8qKgorCSAqIFB1YmxpYyBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSB0aGUgaGVscGVyLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBXZWJmcmFnbWVudFhNTFByb2Nlc3NvcigpIHsKKwkJc3VwZXIoKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFKSk7CisJCVdlYmZyYWdtZW50UGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CisJfQorCQorCS8qKgorCSAqIFJlZ2lzdGVyIGZvciAiKiIgYW5kICJ4bWwiIGZpbGUgZXh0ZW5zaW9ucyB0aGUgV2ViZnJhZ21lbnRSZXNvdXJjZUZhY3RvcnlJbXBsIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFJlc291cmNlLkZhY3Rvcnk+IGdldFJlZ2lzdHJhdGlvbnMoKSB7CisJCWlmIChyZWdpc3RyYXRpb25zID09IG51bGwpIHsKKwkJCXN1cGVyLmdldFJlZ2lzdHJhdGlvbnMoKTsKKwkJCXJlZ2lzdHJhdGlvbnMucHV0KFhNTF9FWFRFTlNJT04sIG5ldyBXZWJmcmFnbWVudFJlc291cmNlRmFjdG9yeUltcGwoKSk7CisJCQlyZWdpc3RyYXRpb25zLnB1dChTVEFSX0VYVEVOU0lPTiwgbmV3IFdlYmZyYWdtZW50UmVzb3VyY2VGYWN0b3J5SW1wbCgpKTsKKwkJfQorCQlyZXR1cm4gcmVnaXN0cmF0aW9uczsKKwl9CisKK30gLy9XZWJmcmFnbWVudFhNTFByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZGVsL2oyZWUuZ2VubW9kZWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvajJlZS5nZW5tb2RlbAppbmRleCBjYzk3MmI0Li41N2ZlMDk2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvajJlZS5nZW5tb2RlbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvajJlZS5nZW5tb2RlbApAQCAtMiw4ICsyLDkgQEAKIDxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgogICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCiAgICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiIG1vZGVsTmFtZT0iSjJlZSIgdGVzdHNEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cyIKLSAgICBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIucm9zZSIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmFNb2RlbC5nZW5tb2RlbCMvL2phdmEiPgorICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiIG1vZGVsTmFtZT0iSjJlZSIgbm9uTkxTTWFya2Vycz0idHJ1ZSIKKyAgICB0ZXN0c0RpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzIiBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS5lbWYuaW1wb3J0ZXIucm9zZSIKKyAgICBydW50aW1lVmVyc2lvbj0iMi41IiB1c2VkR2VuUGFja2FnZXM9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUgLi4vLi4vb3JnLmVjbGlwc2UuamVtL21vZGVsL2phdmFNb2RlbC5nZW5tb2RlbCMvL2phdmEiPgogICA8Zm9yZWlnbk1vZGVsPi4uXHJvc2VcajJlZS5tZGw8L2ZvcmVpZ25Nb2RlbD4KICAgPGZvcmVpZ25Nb2RlbD5XT1JLU1BBQ0VfUk9PVDwvZm9yZWlnbk1vZGVsPgogICA8Zm9yZWlnbk1vZGVsPkQ6XHdvcmtcTTU8L2ZvcmVpZ25Nb2RlbD4KQEAgLTg0Niw2ICs4NDcsMTEgQEAKICAgPC9nZW5QYWNrYWdlcz4KICAgPGdlblBhY2thZ2VzIHByZWZpeD0iV3NkZCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCiAgICAgICBjbGFzc1BhY2thZ2VTdWZmaXg9ImludGVybmFsLmltcGwiIHV0aWxpdHlQYWNrYWdlU3VmZml4PSJpbnRlcm5hbC51dGlsIiBlY29yZVBhY2thZ2U9IndzZGQuZWNvcmUjLyI+CisgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09IndzZGQuZWNvcmUjLy9BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSI+CisgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IndzZGQuZWNvcmUjLy9BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZS9BTk9OWU1PVVMiLz4KKyAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0id3NkZC5lY29yZSMvL0FkZHJlc3NpbmdSZXNwb25zZXNUeXBlL05PTkFOT05ZTU9VUyIvPgorICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ3c2RkLmVjb3JlIy8vQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUvQUxMIi8+CisgICAgPC9nZW5FbnVtcz4KICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vV2ViU2VydmljZXMiPgogICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vV2ViU2VydmljZXMvd2ViU2VydmljZURlc2NyaXB0aW9ucyIvPgogICAgIDwvZ2VuQ2xhc3Nlcz4KQEAgLTg3NSw2ICs4ODEsMTIgQEAKICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvZGVzY3JpcHRpb25UeXBlIi8+CiAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L2Rpc3BsYXlOYW1lVHlwZSIvPgogICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vUG9ydENvbXBvbmVudC9pY29uVHlwZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vUG9ydENvbXBvbmVudC93c2RsU2VydmljZSIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L2VuYWJsZU10b20iLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RkLmVjb3JlIy8vUG9ydENvbXBvbmVudC9wcm90b2NvbEJpbmRpbmciLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL1BvcnRDb21wb25lbnQvaGFuZGxlckNoYWlucyIvPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9Qb3J0Q29tcG9uZW50L210b21UaHJlc2hvbGQiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vUG9ydENvbXBvbmVudC9yZXNwZWN0QmluZGluZyIvPgogICAgIDwvZ2VuQ2xhc3Nlcz4KICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vV1NETFBvcnQiLz4KICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vU2VydmljZUltcGxCZWFuIj4KQEAgLTg5Niw1ICs5MDgsMjMgQEAKICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL0hhbmRsZXIvc29hcFJvbGVzIi8+CiAgICAgPC9nZW5DbGFzc2VzPgogICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGQuZWNvcmUjLy9CZWFuTGluayIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGQuZWNvcmUjLy9XU0RMU2VydmljZSIvPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGQuZWNvcmUjLy9IYW5kbGVyQ2hhaW4iPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9IYW5kbGVyQ2hhaW4vc2VydmljZU5hbWVQYXR0ZXJuIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL0hhbmRsZXJDaGFpbi9wb3J0TmFtZVBhdHRlcm4iLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB3c2RkLmVjb3JlIy8vSGFuZGxlckNoYWluL3Byb3RvY29sQmluZGluZ3MiLz4KKyAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugd3NkZC5lY29yZSMvL0hhbmRsZXJDaGFpbi9oYW5kbGVycyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vSGFuZGxlcnNDaGFpbnMiPgorICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB3c2RkLmVjb3JlIy8vSGFuZGxlcnNDaGFpbnMvaGFuZGxlckNoYWluIi8+CisgICAgPC9nZW5DbGFzc2VzPgorICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IndzZGQuZWNvcmUjLy9SZXNwZWN0QmluZGluZ1R5cGUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9SZXNwZWN0QmluZGluZ1R5cGUvZW5hYmxlZCIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KKyAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ3c2RkLmVjb3JlIy8vQWRkcmVzc2luZ1R5cGUiPgorICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHdzZGQuZWNvcmUjLy9BZGRyZXNzaW5nVHlwZS9lbmFibGVkIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL0FkZHJlc3NpbmdUeXBlL3JlcXVpcmVkIi8+CisgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgd3NkZC5lY29yZSMvL0FkZHJlc3NpbmdUeXBlL3Jlc3BvbnNlcyIvPgorICAgIDwvZ2VuQ2xhc3Nlcz4KICAgPC9nZW5QYWNrYWdlcz4KIDwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9kZWwvd3NkZC5lY29yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2RkLmVjb3JlCmluZGV4IDVkNDAwZjMuLmFhYzZhNDQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2RkLmVjb3JlCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2RlbC93c2RkLmVjb3JlCkBAIC04MSw2ICs4MSwxMSBAQAogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm90b2NvbEJpbmRpbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGFuZGxlckNoYWlucyIgZVR5cGU9IiMvL0hhbmRsZXJzQ2hhaW5zIgogICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgorICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtdG9tVGhyZXNob2xkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUJpZ0ludGVnZXIiLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcGVjdEJpbmRpbmciIGVUeXBlPSIjLy9SZXNwZWN0QmluZGluZ1R5cGUiCisgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZHJlc3NpbmciIGVUeXBlPSIjLy9BZGRyZXNzaW5nVHlwZSIKKyAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KICAgPC9lQ2xhc3NpZmllcnM+CiAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV1NETFBvcnQiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9RTmFtZSI+CiAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgpAQCAtMTQ3LDQgKzE1MiwxNyBAQAogICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJoYW5kbGVyQ2hhaW4iIHVwcGVyQm91bmQ9Ii0xIgogICAgICAgICBlVHlwZT0iIy8vSGFuZGxlckNoYWluIiBjb250YWlubWVudD0idHJ1ZSIvPgogICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNwZWN0QmluZGluZ1R5cGUiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9KMkVFRU9iamVjdCI+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVuYWJsZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FQm9vbGVhbiIvPgorICA8L2VDbGFzc2lmaWVycz4KKyAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBZGRyZXNzaW5nVHlwZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0oyRUVFT2JqZWN0Ij4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW5hYmxlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VCb29sZWFuIi8+CisgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcXVpcmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIHBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRUJvb2xlYW4iLz4KKyAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzcG9uc2VzIiBlVHlwZT0iIy8vQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CisgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSI+CisgICAgPGVMaXRlcmFscyBuYW1lPSJBTk9OWU1PVVMiLz4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PTkFOT05ZTU9VUyIgdmFsdWU9IjEiLz4KKyAgICA8ZUxpdGVyYWxzIG5hbWU9IkFMTCIgdmFsdWU9IjIiLz4KKyAgPC9lQ2xhc3NpZmllcnM+CiA8L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvbW9majJlZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvbW9majJlZS5wcm9wZXJ0aWVzCmluZGV4IDllZjk0MGQuLjM4ZTA0NTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL21vZmoyZWUucHJvcGVydGllcworKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9tb2ZqMmVlLnByb3BlcnRpZXMKQEAgLTI2LDMgKzI2LDQgQEAKIE1JR1JBVEVEX0RFRkFVTFRfREFUQVNPVVJDRV9NU0c9TWlncmF0ZWQgZGVmYXVsdCBEYXRhc291cmNlIGJpbmRpbmcgdG8gYSBkZWZhdWx0IENNUCBDb25uZWN0aW9uIEZhY3RvcnkgYmluZGluZyBmb3IgRUpCIEpBUi4KIEoyRUVfVkVSU0lPTl9OVUxMX0VSUk9SPVVuYWJsZSB0byBnZXQgSmF2YSBFRSB2ZXJzaW9uIG9mIG9iamVjdCBiZWNhdXNlIGl0IGlzIG5vdCBjb250YWluZWQgYnkgYSBkb2N1bWVudC4KIEoyRUVfVkVSU0lPTl9QUk9YWV9FUlJPUj1VbmFibGUgdG8gZ2V0IEphdmEgRUUgdmVyc2lvbiBvZiByZWZlcmVuY2VkIG9iamVjdCBiZWNhdXNlIHRoZSBwcm94eSBjYW5ub3QgYmUgcmVzb2x2ZWQuICBDaGVjayB0aGUgaWRzIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZXMuICBIUkVGID0gezB9LgorSU5WQUxJRF9ST0xFX1NPVVJDRV9fRU5USVRZX0JFQU49VGhlIEVKQiBSZWxhdGlvbnNoaXAgXCJ7MH1cIiBzcGVjaWZpZXMgYW4gaW52YWxpZCBlbnRpdHkgYmVhbiBcInsxfVwiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRmFjdG9yeUltcGwuamF2YQppbmRleCBjYjU5M2NhLi40YjUzODU3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRmFjdG9yeUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uRmFjdG9yeUltcGwuamF2YQpAQCAtMzcsNyArMzcsNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgQXBwbGljYXRpb25GYWN0b3J5IGluaXQoKSB7CiAJCXRyeSB7Ci0JCQlBcHBsaWNhdGlvbkZhY3RvcnkgdGhlQXBwbGljYXRpb25GYWN0b3J5ID0gKEFwcGxpY2F0aW9uRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiYXBwbGljYXRpb24ueG1pIik7IAorCQkJQXBwbGljYXRpb25GYWN0b3J5IHRoZUFwcGxpY2F0aW9uRmFjdG9yeSA9IChBcHBsaWNhdGlvbkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImFwcGxpY2F0aW9uLnhtaSIpOyAgLy8kTk9OLU5MUy0xJAogCQkJaWYgKHRoZUFwcGxpY2F0aW9uRmFjdG9yeSAhPSBudWxsKSB7CiAJCQkJcmV0dXJuIHRoZUFwcGxpY2F0aW9uRmFjdG9yeTsKIAkJCX0KQEAgLTU2LDYgKzU2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKIAkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OOiByZXR1cm4gY3JlYXRlQXBwbGljYXRpb24oKTsKQEAgLTY1LDcgKzY2LDcgQEAKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkVKQl9NT0RVTEU6IHJldHVybiBjcmVhdGVFamJNb2R1bGUoKTsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkNPTk5FQ1RPUl9NT0RVTEU6IHJldHVybiBjcmVhdGVDb25uZWN0b3JNb2R1bGUoKTsKIAkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25JbXBsLmphdmEKaW5kZXggOGZiNmVlYS4uMjc5MzZmYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uSW1wbC5qYXZhCkBAIC03OCw2ICs3OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OOwogCX0KQEAgLTE2Myw2ICsxNjQsNyBAQAogCS8qKgogCSAqCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7CiAJCXN1cGVyLnNldERpc3BsYXlOYW1lKG5ld0Rpc3BsYXlOYW1lKTsKIAl9CkBAIC0xODcsNiArMTg5LDcgQEAKIAkvKioKIAkgKlRoaXMgcmV0dXJucyB0aGUgajJlZSB2ZXJzaW9uIGlkLiBDb21wYXJlIHdpdGggSjJFRVZlcnNpb25Db25zdGFudHMgdG8gZGV0ZXJtaW5lIGoyZWUgbGV2ZWwKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKIAkJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7CiAJCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwpAQCAtMjMyLDYgKzIzNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTOgpAQCAtMjQ1LDYgKzI0OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19TRUNVUklUWV9ST0xFUzoKQEAgLTI2MCw2ICsyNjUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fVkVSU0lPTjoKQEAgLTI3Nyw2ICsyODMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuQVBQTElDQVRJT05fX1ZFUlNJT046CkBAIC0yOTksNiArMzA2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19WRVJTSU9OOgpAQCAtMzE5LDYgKzMyNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5BUFBMSUNBVElPTl9fVkVSU0lPTjoKQEAgLTMzNCwxMSArMzQzLDEyIEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlcnNpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHZlcnNpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQppbmRleCA1NjZlMGIwLi44N2JmODgxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQpAQCAtMjUsMjkgKzI1LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uSmF2YUNsaWVudE1vZHVsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKIAogCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25QYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uUGFja2FnZSwgRVBhY2thZ2UgeworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBBcHBsaWNhdGlvblBhY2thZ2UgewogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMDIsNyArODUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisJcHJpdmF0ZSB2b2xhdGlsZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwogCiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCkBAIC0xMTEsOCArOTQsOCBAQAogCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoQXBwbGljYXRpb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKTsKIAogCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEFwcGxpY2F0aW9uUGFja2FnZUltcGwoKSk7Ci0KKwkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkgKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgQXBwbGljYXRpb25QYWNrYWdlSW1wbCgpKTsKKwkJCiAJCWlzSW5pdGVkID0gdHJ1ZTsKIAogCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKQEAgLTEyMCw0OSArMTAzLDIwIEBACiAJCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKIAogCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzY29tbW9uUGFja2FnZUltcGwgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7CiAKIAkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKIAkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CiAKIAkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQogCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKIAogCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCiAJCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5mcmVlemUoKTsKIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJLCB0aGVBcHBsaWNhdGlvblBhY2thZ2UpOworCisJCUoyRUVJbml0LmluaXRFTUZNb2RlbHMoKTsKIAkJcmV0dXJuIHRoZUFwcGxpY2F0aW9uUGFja2FnZTsKIAl9CiAKQEAgLTMzMiwzMyArMjg2LDQ1IEBACiAJCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7CiAJCUFwcGxpY2F0aW9uUGFja2FnZSB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpOwogCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJYXBwbGljYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJbW9kdWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXdlYk1vZHVsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRNb2R1bGUoKSk7Ci0JCWphdmFDbGllbnRNb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlKCkpOwotCQllamJNb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlKCkpOwotCQljb25uZWN0b3JNb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoYXBwbGljYXRpb25FQ2xhc3MsIEFwcGxpY2F0aW9uLmNsYXNzLCAiQXBwbGljYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uX1ZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRNb2R1bGUoKSwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlX0FwcGxpY2F0aW9uKCksICJtb2R1bGVzIiwgbnVsbCwgMSwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobW9kdWxlRUNsYXNzLCBNb2R1bGUuY2xhc3MsICJNb2R1bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9VcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaSIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TW9kdWxlX0FsdEREKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhbHRERCIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TW9kdWxlX0FwcGxpY2F0aW9uKCksIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmdldEFwcGxpY2F0aW9uKCksIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmdldEFwcGxpY2F0aW9uX01vZHVsZXMoKSwgImFwcGxpY2F0aW9uIiwgbnVsbCwgMCwgMSwgTW9kdWxlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2ViTW9kdWxlRUNsYXNzLCBXZWJNb2R1bGUuY2xhc3MsICJXZWJNb2R1bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYk1vZHVsZV9Db250ZXh0Um9vdCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29udGV4dFJvb3QiLCBudWxsLCAwLCAxLCBXZWJNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqYXZhQ2xpZW50TW9kdWxlRUNsYXNzLCBKYXZhQ2xpZW50TW9kdWxlLmNsYXNzLCAiSmF2YUNsaWVudE1vZHVsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGVqYk1vZHVsZUVDbGFzcywgRWpiTW9kdWxlLmNsYXNzLCAiRWpiTW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY29ubmVjdG9yTW9kdWxlRUNsYXNzLCBDb25uZWN0b3JNb2R1bGUuY2xhc3MsICJDb25uZWN0b3JNb2R1bGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWJvb2xlYW4gaGFzTG9jayA9IGZhbHNlOworCQl0cnkgeworCQkJaGFzTG9jayA9IEoyRUVJbml0LmFxdWlyZUluaXRpYWxpemVQYWNrYWdlQ29udGVudHNMb2NrKCk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9CQkKKwkJCisJCXRyeXsKKwkJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJCWFwcGxpY2F0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7CisJCQltb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCXdlYk1vZHVsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRNb2R1bGUoKSk7CisJCQlqYXZhQ2xpZW50TW9kdWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmdldE1vZHVsZSgpKTsKKwkJCWVqYk1vZHVsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRNb2R1bGUoKSk7CisJCQljb25uZWN0b3JNb2R1bGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlKCkpOworCQorCQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJCWluaXRFQ2xhc3MoYXBwbGljYXRpb25FQ2xhc3MsIEFwcGxpY2F0aW9uLmNsYXNzLCAiQXBwbGljYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uX1ZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fU2VjdXJpdHlSb2xlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25fTW9kdWxlcygpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRNb2R1bGUoKSwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuZ2V0TW9kdWxlX0FwcGxpY2F0aW9uKCksICJtb2R1bGVzIiwgbnVsbCwgMSwgLTEsIEFwcGxpY2F0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKG1vZHVsZUVDbGFzcywgTW9kdWxlLmNsYXNzLCAiTW9kdWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNb2R1bGVfVXJpKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmkiLCBudWxsLCAwLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZV9BbHRERCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWx0REQiLCBudWxsLCAwLCAxLCBNb2R1bGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1vZHVsZV9BcHBsaWNhdGlvbigpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRBcHBsaWNhdGlvbigpLCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5nZXRBcHBsaWNhdGlvbl9Nb2R1bGVzKCksICJhcHBsaWNhdGlvbiIsIG51bGwsIDAsIDEsIE1vZHVsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyh3ZWJNb2R1bGVFQ2xhc3MsIFdlYk1vZHVsZS5jbGFzcywgIldlYk1vZHVsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViTW9kdWxlX0NvbnRleHRSb290KCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb250ZXh0Um9vdCIsIG51bGwsIDAsIDEsIFdlYk1vZHVsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhqYXZhQ2xpZW50TW9kdWxlRUNsYXNzLCBKYXZhQ2xpZW50TW9kdWxlLmNsYXNzLCAiSmF2YUNsaWVudE1vZHVsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhlamJNb2R1bGVFQ2xhc3MsIEVqYk1vZHVsZS5jbGFzcywgIkVqYk1vZHVsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhjb25uZWN0b3JNb2R1bGVFQ2xhc3MsIENvbm5lY3Rvck1vZHVsZS5jbGFzcywgIkNvbm5lY3Rvck1vZHVsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQl9ZmluYWxseXsKKwkJCWlmKCBoYXNMb2NrICkKKwkJCQlKMkVFSW5pdC5yZWxlYXNlSW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50c0xvY2soKTsKKwkJfQogCX0KIAogfSAvL0FwcGxpY2F0aW9uUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25SZXNvdXJjZUZhY3RvcnkuamF2YQppbmRleCA4YjJmZWZjLi45ODI2NWMzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeS5qYXZhCkBAIC01Niw3ICs1Niw4IEBACiAgICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlcikKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgeworICAgIEBPdmVycmlkZQorCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7CiAJCXJldHVybiBuZXcgQXBwbGljYXRpb25SZXNvdXJjZUltcGwodXJpLCBhUmVuZGVyZXIpOwogICAgIH0KIAkvKioKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25SZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25SZXNvdXJjZUltcGwuamF2YQppbmRleCAxOWRkYWQ5Li44ZTg2ZWQzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uUmVzb3VyY2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvblJlc291cmNlSW1wbC5qYXZhCkBAIC0zOCw2ICszOCw3IEBACiAgICAgfQogCS8qKgogCSogUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBFTGlzdC4JICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFwcGxpY2F0aW9uIGdldEFwcGxpY2F0aW9uKCkgewogCQlyZXR1cm4gKEFwcGxpY2F0aW9uKSBnZXRSb290T2JqZWN0KCk7CiAJfQpAQCAtNjAsNiArNjEsNyBAQAogICAgIH0KIAkvKiBBcHAgdmVyc2lvbiBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIEoyRUUgdmVyc2lvbgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHsKIAkJcmV0dXJuIGdldE1vZHVsZVZlcnNpb25JRCgpOwogCX0KQEAgLTcwLDEwICs3MiwxMiBAQAogICAgIC8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1N5c3RlbUlEKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzI7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV9BbHRfMV8yX1N5c3RlbUlEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9BTFRfU1lTVEVNSURfMV8yOwogCX0KQEAgLTgxLDEwICs4NSwxMiBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1N5c3RlbUlEKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9TWVNURU1JRF8xXzM7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV9BbHRfMV8zX1N5c3RlbUlEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9BTFRfU1lTVEVNSURfMV8zOwogCX0KQEAgLTkyLDYgKzk4LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9QdWJsaWNJRCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpIHsKIAkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fUFVCTElDSURfMV8yOwogCX0KQEAgLTk5LDEyICsxMDYsMTQgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19QdWJsaWNJRCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19QdWJsaWNJRCgpIHsKIAkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fUFVCTElDSURfMV8zOwogCX0KIAkvKiAKIAkgKiBUaGlzIGRpcmVjdGx5IHNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCkgewogCQlzdXBlci5zZXRWZXJzaW9uSUQoaWQpOwogCQlzd2l0Y2ggKGlkKSB7CkBAIC0xMjIsNiArMTMxLDcgQEAKIAkJLyoKIAkJICogQmFzZWQgb24gdGhlIEoyRUUgdmVyc2lvbiwgdGhpcyB3aWxsIHNldCB0aGUgbW9kdWxlIHZlcnNpb24oU2FtZSBhcyBKMkVFIFZlcnNpb24gZm9yIEFwcGxpY2F0aW9uKQogCQkgKi8KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uSUQoaW50IGlkKSB7CiAJCXByaW1TZXRWZXJzaW9uSUQoaWQpOwogCQlzd2l0Y2ggKGlkKSB7CkBAIC0xNDAsNiArMTUwLDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uaW1wbC5YTUxSZXNvdXJjZUltcGwjc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkgewogCQlBcHBsaWNhdGlvbiBhcHAgPSBnZXRBcHBsaWNhdGlvbigpOwogCQlpZiAoYXBwID09IG51bGwpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rvck1vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlSW1wbC5qYXZhCmluZGV4IDU4YjIzYzAuLjk1Y2Q4NDEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yTW9kdWxlSW1wbC5qYXZhCkBAIC0yOCwxMCArMjgsMTIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuQ09OTkVDVE9SX01PRFVMRTsKIAl9CiAKK0BPdmVycmlkZQogcHVibGljIGJvb2xlYW4gaXNDb25uZWN0b3JNb2R1bGUoKSB7CiAJCXJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9FamJNb2R1bGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0VqYk1vZHVsZUltcGwuamF2YQppbmRleCAxY2VlMTVkLi5iNmQ4MmI5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0VqYk1vZHVsZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0VqYk1vZHVsZUltcGwuamF2YQpAQCAtMjgsMTAgKzI4LDEyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkVKQl9NT0RVTEU7CiAJfQogCitAT3ZlcnJpZGUKIHB1YmxpYyBib29sZWFuIGlzRWpiTW9kdWxlKCkgewogCXJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9KYXZhQ2xpZW50TW9kdWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9KYXZhQ2xpZW50TW9kdWxlSW1wbC5qYXZhCmluZGV4IDg4YTAzMmEuLjg2MDc0MTkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSmF2YUNsaWVudE1vZHVsZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0phdmFDbGllbnRNb2R1bGVJbXBsLmphdmEKQEAgLTI4LDEwICsyOCwxMiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5KQVZBX0NMSUVOVF9NT0RVTEU7CiAJfQogCitAT3ZlcnJpZGUKIHB1YmxpYyBib29sZWFuIGlzSmF2YU1vZHVsZSgpIHsKIAlyZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTW9kdWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbXBsLmphdmEKaW5kZXggMDk0ODk1OC4uNzQ1NGYwYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Nb2R1bGVJbXBsLmphdmEKQEAgLTcwLDYgKzcwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTU9EVUxFOwogCX0KQEAgLTE0Nyw4ICsxNDgsOCBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBuZXdBcHBsaWNhdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3QXBwbGljYXRpb24sIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7CisJCU5vdGlmaWNhdGlvbkNoYWluIGlubmVyTXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KW5ld0FwcGxpY2F0aW9uLCBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTiwgbXNncyk7CisJCXJldHVybiBpbm5lck1zZ3M7CiAJfQogCiAJLyoqCkBAIC0xNTcsNyArMTU4LDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBuZXdBcHBsaWNhdGlvbikgewogCQlpZiAobmV3QXBwbGljYXRpb24gIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fQVBQTElDQVRJT04gJiYgbmV3QXBwbGljYXRpb24gIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdBcHBsaWNhdGlvbikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwogCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCiAJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CkBAIC0xNzUsMTIgKzE3NiwxNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQlyZXR1cm4gYmFzaWNTZXRBcHBsaWNhdGlvbigoQXBwbGljYXRpb24pb3RoZXJFbmQsIG1zZ3MpOworCQkJCU5vdGlmaWNhdGlvbkNoYWluIGlubmVyTXNncyA9IG1zZ3M7CisJCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpeworCQkJCQlpbm5lck1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOworCQkJCX0KKwkJCQlyZXR1cm4gYmFzaWNTZXRBcHBsaWNhdGlvbigoQXBwbGljYXRpb24pb3RoZXJFbmQsIGlubmVyTXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTE5MCw2ICsxOTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX0FQUExJQ0FUSU9OOgpAQCAtMjAzLDYgKzIwOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19BUFBMSUNBVElPTjoKQEAgLTIxNiw2ICsyMjIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1VSSToKQEAgLTIzMyw2ICsyNDAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkk6CkBAIC0yNTMsNiArMjYxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLk1PRFVMRV9fVVJJOgpAQCAtMjczLDYgKzI4Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5NT0RVTEVfX1VSSToKQEAgLTI4OCwxMyArMjk4LDE0IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVyaTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAodXJpOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWx0REQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGFsdEREOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGFsdEREKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CkBAIC0zMTEsNyArMzIyLDcgQEAKIAkJaWYgKGVSZXNvdXJjZSgpICE9IG51bGwpCiAJCQlyZXR1cm4gZVJlc291cmNlKCkuZ2V0VVJJRnJhZ21lbnQodGhpcyk7CiAJCWVsc2UKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIG51bGw7CiAJfQogCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYk1vZHVsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViTW9kdWxlSW1wbC5qYXZhCmluZGV4IDBiYmUzYzMuLjBkZDZkNDcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViTW9kdWxlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViTW9kdWxlSW1wbC5qYXZhCkBAIC00OCwxMCArNDgsMTIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuV0VCX01PRFVMRTsKIAl9CiAKK0BPdmVycmlkZQogcHVibGljIGJvb2xlYW4gaXNXZWJNb2R1bGUoKSB7CiAJcmV0dXJuIHRydWU7CiB9CkBAIC03OSw2ICs4MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9NT0RVTEVfX0NPTlRFWFRfUk9PVDoKQEAgLTkyLDYgKzk1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLldFQl9NT0RVTEVfX0NPTlRFWFRfUk9PVDoKQEAgLTEwNiw2ICsxMTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuV0VCX01PRFVMRV9fQ09OVEVYVF9ST09UOgpAQCAtMTIwLDYgKzEyNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19DT05URVhUX1JPT1Q6CkBAIC0xMzEsMTEgKzEzNywxMiBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb250ZXh0Um9vdDogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoY29udGV4dFJvb3Q6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoY29udGV4dFJvb3QpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL3V0aWwvQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggNWE4MjllYy4uNTRhMzE0MSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9BcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIAkJCW1vZGVsUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpOwogCQl9CiAJfQorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKIAkJaWYgKHR5cGUgPT0gbW9kZWxQYWNrYWdlKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKQEAgLTQ1LDI2ICs0NiwzMyBAQAogCX0KIAogCXByb3RlY3RlZCBBcHBsaWNhdGlvblN3aXRjaCBzdyA9IG5ldyBBcHBsaWNhdGlvblN3aXRjaCgpIHsKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGUoTW9kdWxlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZUFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlV2ViTW9kdWxlKFdlYk1vZHVsZSBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVXZWJNb2R1bGVBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFDbGllbnRNb2R1bGUoSmF2YUNsaWVudE1vZHVsZSBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVKYXZhQ2xpZW50TW9kdWxlQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VFamJNb2R1bGUoRWpiTW9kdWxlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUVqYk1vZHVsZUFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlQ29ubmVjdG9yTW9kdWxlKENvbm5lY3Rvck1vZHVsZSBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVDb25uZWN0b3JNb2R1bGVBZGFwdGVyKCk7CiAJCX0KIAl9OwogCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKIAkJcmV0dXJuIChBZGFwdGVyKXN3LmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CiAJfQpAQCAtMTE4LDM2ICsxMjYsNDcgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgQXBwbGljYXRpb25Td2l0Y2ggbW9kZWxTd2l0Y2ggPQogCQluZXcgQXBwbGljYXRpb25Td2l0Y2goKSB7CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVBcHBsaWNhdGlvbkFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlTW9kdWxlKE1vZHVsZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTW9kdWxlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJNb2R1bGUoV2ViTW9kdWxlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXZWJNb2R1bGVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFDbGllbnRNb2R1bGUoSmF2YUNsaWVudE1vZHVsZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSmF2YUNsaWVudE1vZHVsZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRWpiTW9kdWxlKEVqYk1vZHVsZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRWpiTW9kdWxlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3JNb2R1bGUoQ29ubmVjdG9yTW9kdWxlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVDb25uZWN0b3JNb2R1bGVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uX01vZHVsZShNb2R1bGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uX01vZHVsZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwogCQkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L1Jlc0F1dGhBcHBsaWNhdGlvblR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9SZXNBdXRoQXBwbGljYXRpb25UeXBlLmphdmEKaW5kZXggMDkwMjE5MC4uOThmZjM5ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L1Jlc0F1dGhBcHBsaWNhdGlvblR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvUmVzQXV0aEFwcGxpY2F0aW9uVHlwZS5qYXZhCkBAIC01NSw3ICs1NSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoQXBwbGljYXRpb25UeXBlIEFQUExJQ0FUSU9OX0xJVEVSQUwgPSBuZXcgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZShBUFBMSUNBVElPTiwgIkFwcGxpY2F0aW9uIiwgIkFwcGxpY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc0F1dGhBcHBsaWNhdGlvblR5cGUgQVBQTElDQVRJT05fTElURVJBTCA9IG5ldyBSZXNBdXRoQXBwbGljYXRpb25UeXBlKEFQUExJQ0FUSU9OLCAiQXBwbGljYXRpb24iLCAiQXBwbGljYXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtNjksNyArNjksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSBDT05UQUlORVJfTElURVJBTCA9IG5ldyBSZXNBdXRoQXBwbGljYXRpb25UeXBlKENPTlRBSU5FUiwgIkNvbnRhaW5lciIsICJDb250YWluZXIiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSBDT05UQUlORVJfTElURVJBTCA9IG5ldyBSZXNBdXRoQXBwbGljYXRpb25UeXBlKENPTlRBSU5FUiwgIkNvbnRhaW5lciIsICJDb250YWluZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+UmVzIEF1dGggQXBwbGljYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50SW1wbC5qYXZhCmluZGV4IGYyZDY2YjkuLjdiYzNiOGYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50SW1wbC5qYXZhCkBAIC0xMjIsNiArMTIyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBDbGllbnRQYWNrYWdlLkxpdGVyYWxzLkFQUExJQ0FUSU9OX0NMSUVOVDsKIAl9CkBAIC0xNzYsNiArMTc3LDcgQEAKIC8qKgogICpUaGlzIHJldHVybnMgdGhlIGoyZWUgdmVyc2lvbiBpZC4gQ29tcGFyZSB3aXRoIEoyRUVWZXJzaW9uQ29uc3RhbnRzIHRvIGRldGVybWluZSBqMmVlIGxldmVsCiAgKi8KK0BPdmVycmlkZQogcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAJSjJFRVZlcnNpb25SZXNvdXJjZSByZXMgPSAoSjJFRVZlcnNpb25SZXNvdXJjZSkgZVJlc291cmNlKCk7CiAJaWYgKHJlcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CkBAIC0zNDQsNiArMzQ2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVF9fUkVTT1VSQ0VfUkVGUzoKQEAgLTM2OSw2ICszNzIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OOgpAQCAtMzk5LDYgKzQwMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OOgpAQCAtNDQ0LDYgKzQ0OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OOgpAQCAtNDgyLDYgKzQ4OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OOgpAQCAtNTA5LDExICs1MTYsMTIgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmVyc2lvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAodmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkuamF2YQppbmRleCBiNDJkNGZlLi5jMTNiNzAzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VGYWN0b3J5LmphdmEKQEAgLTU0LDYgKzU0LDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKFVSSSwgUmVuZGVyZXIpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKIAkJcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0FwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2VJbXBsLmphdmEKaW5kZXggZDIxNjI0Ni4uZTk4M2UyOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlSW1wbC5qYXZhCkBAIC01NSwxMCArNTUsMTIgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpIHsKIAkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9TWVNURU1JRF8xXzI7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV9BbHRfMV8yX1N5c3RlbUlEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0FMVF9TWVNURU1JRF8xXzI7CiAJfQpAQCAtNjYsMTAgKzY4LDEyIEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSB7CiAJCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU1lTVEVNSURfMV8zOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEoyRUVfQWx0XzFfM19TeXN0ZW1JRCgpIHsKIAkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9BTFRfU1lTVEVNSURfMV8zOwogCX0KQEAgLTc3LDEyICs4MSwxNCBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1B1YmxpY0lEKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX1BVQkxJQ0lEXzFfMjsKIAl9CiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfUHVibGljSUQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKSB7CiAJCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfUFVCTElDSURfMV8zOwogCX0KQEAgLTEwNywxMiArMTEzLDE0IEBACiAKIAkvKiBBcHAgY2xpZW50IHZlcnNpb24gaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBKMkVFIHZlcnNpb24KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB7CiAJCXJldHVybiBnZXRNb2R1bGVWZXJzaW9uSUQoKTsKIAl9CiAJLyogCiAJICogVGhpcyBkaXJlY3RseSBzZXRzIHRoZSBtb2R1bGUgdmVyc2lvbiBpZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE1vZHVsZVZlcnNpb25JRChpbnQgaWQpIHsKIAkJc3VwZXIuc2V0VmVyc2lvbklEKGlkKTsKIAkJc3dpdGNoIChpZCkgewpAQCAtMTMwLDYgKzEzOCw3IEBACiAJCS8qCiAJCSAqIEJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBzZXQgdGhlIG1vZHVsZSB2ZXJzaW9uKFNhbWUgYXMgSjJFRSBWZXJzaW9uIGZvciBBcHAgY2xpZW50KQogCQkgKi8KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uSUQoaW50IGlkKSB7CiAJCXByaW1TZXRWZXJzaW9uSUQoaWQpOwogCQlzd2l0Y2ggKGlkKSB7CkBAIC0xNDcsNiArMTU2LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uaW1wbC5YTUxSZXNvdXJjZUltcGwjc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkgewogCQlBcHBsaWNhdGlvbkNsaWVudCBjbHQgPSBnZXRBcHBsaWNhdGlvbkNsaWVudCgpOwogCQlpZiAoY2x0ID09IG51bGwpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9DbGllbnRGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQ2xpZW50RmFjdG9yeUltcGwuamF2YQppbmRleCBhN2IyZjcyLi43MDg3ZmJiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9DbGllbnRGYWN0b3J5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0NsaWVudEZhY3RvcnlJbXBsLmphdmEKQEAgLTM0LDcgKzM0LDcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIENsaWVudEZhY3RvcnkgaW5pdCgpIHsKIAkJdHJ5IHsKLQkJCUNsaWVudEZhY3RvcnkgdGhlQ2xpZW50RmFjdG9yeSA9IChDbGllbnRGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJjbGllbnQueG1pIik7IAorCQkJQ2xpZW50RmFjdG9yeSB0aGVDbGllbnRGYWN0b3J5ID0gKENsaWVudEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImNsaWVudC54bWkiKTsgIC8vJE5PTi1OTFMtMSQKIAkJCWlmICh0aGVDbGllbnRGYWN0b3J5ICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gdGhlQ2xpZW50RmFjdG9yeTsKIAkJCX0KQEAgLTUzLDExICs1MywxMiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewogCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBDbGllbnRQYWNrYWdlLkFQUExJQ0FUSU9OX0NMSUVOVDogcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50KCk7CiAJCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAl9CiAKQEAgLTY2LDEyICs2NywxMyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewogCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBDbGllbnRQYWNrYWdlLlJFU19BVVRIX0FQUExJQ0FUSU9OX1RZUEU6CiAJCQkJcmV0dXJuIGNyZWF0ZVJlc0F1dGhBcHBsaWNhdGlvblR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJfQogCX0KIApAQCAtODAsMTIgKzgyLDEzIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CiAJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CiAJCQljYXNlIENsaWVudFBhY2thZ2UuUkVTX0FVVEhfQVBQTElDQVRJT05fVFlQRToKIAkJCQlyZXR1cm4gY29udmVydFJlc0F1dGhBcHBsaWNhdGlvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9CiAJfQogCkBAIC0xMDcsNyArMTEwLDcgQEAKIAkgKi8KIAlwdWJsaWMgUmVzQXV0aEFwcGxpY2F0aW9uVHlwZSBjcmVhdGVSZXNBdXRoQXBwbGljYXRpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCVJlc0F1dGhBcHBsaWNhdGlvblR5cGUgcmVzdWx0ID0gUmVzQXV0aEFwcGxpY2F0aW9uVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQ2xpZW50UGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC9pbXBsL0NsaWVudFBhY2thZ2VJbXBsLmphdmEKaW5kZXggMjZhNTMwYi4uYmQyZTcxMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL2ltcGwvQ2xpZW50UGFja2FnZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvaW1wbC9DbGllbnRQYWNrYWdlSW1wbC5qYXZhCkBAIC0xOCwzMyArMTgsMTcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50RmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuUmVzQXV0aEFwcGxpY2F0aW9uVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwucGx1Z2luLkoyRUVDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVJbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7CiAKIAotcHVibGljIGNsYXNzIENsaWVudFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ2xpZW50UGFja2FnZSwgRVBhY2thZ2UgeworcHVibGljIGNsYXNzIENsaWVudFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ2xpZW50UGFja2FnZSB7CiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTcxLDcgKzU1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCXByaXZhdGUgdm9sYXRpbGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKIAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgpAQCAtODAsNTggKzY0LDMyIEBACiAJCWlmIChpc0luaXRlZCkgcmV0dXJuIChDbGllbnRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSk7CiAKIAkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIENsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgQ2xpZW50UGFja2FnZUltcGwoKSk7CisJCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAKKwkJCShDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YKKwkJCQkJQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcKKwkJCQkJCQlDbGllbnRQYWNrYWdlSW1wbCgpKTsKIAorCQkKIAkJaXNJbml0ZWQgPSB0cnVlOwogCiAJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwogCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CiAKLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzY29tbW9uUGFja2FnZUltcGwgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KIAkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKIAkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CiAKIAkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQogCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKIAogCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCiAJCXRoZUNsaWVudFBhY2thZ2UuZnJlZXplKCk7CiAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChDbGllbnRQYWNrYWdlLmVOU19VUkksIHRoZUNsaWVudFBhY2thZ2UpOworCisJCUoyRUVJbml0LmluaXRFTUZNb2RlbHMoKTsKKwogCQlyZXR1cm4gdGhlQ2xpZW50UGFja2FnZTsKIAl9CiAKQEAgLTI5MSwyOCArMjQ5LDQwIEBACiAJCUphdmFSZWZQYWNrYWdlIHRoZUphdmFSZWZQYWNrYWdlID0gKEphdmFSZWZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpOwogCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSk7CiAKLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlhcHBsaWNhdGlvbkNsaWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoYXBwbGljYXRpb25DbGllbnRFQ2xhc3MsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAiQXBwbGljYXRpb25DbGllbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VSZWZzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UmVzb3VyY2VSZWYoKSwgbnVsbCwgInJlc291cmNlUmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfRW52aXJvbm1lbnRQcm9wcygpLCB0aGVDb21tb25QYWNrYWdlLmdldEVudkVudHJ5KCksIG51bGwsICJlbnZpcm9ubWVudFByb3BzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9FamJSZWZlcmVuY2VzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RWpiUmVmKCksIG51bGwsICJlamJSZWZlcmVuY2VzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9SZXNvdXJjZUVudlJlZnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRSZXNvdXJjZUVudlJlZigpLCBudWxsLCAicmVzb3VyY2VFbnZSZWZzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9DYWxsYmFja0hhbmRsZXIoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJjYWxsYmFja0hhbmRsZXIiLCBudWxsLCAwLCAxLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKSwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25zIiwgbnVsbCwgMCwgLTEsIEFwcGxpY2F0aW9uQ2xpZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShyZXNBdXRoQXBwbGljYXRpb25UeXBlRUVudW0sIFJlc0F1dGhBcHBsaWNhdGlvblR5cGUuY2xhc3MsICJSZXNBdXRoQXBwbGljYXRpb25UeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoQXBwbGljYXRpb25UeXBlRUVudW0sIFJlc0F1dGhBcHBsaWNhdGlvblR5cGUuQVBQTElDQVRJT05fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoQXBwbGljYXRpb25UeXBlRUVudW0sIFJlc0F1dGhBcHBsaWNhdGlvblR5cGUuQ09OVEFJTkVSX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwkJYm9vbGVhbiBoYXNMb2NrID0gZmFsc2U7CisJCXRyeSB7CisJCQloYXNMb2NrID0gSjJFRUluaXQuYXF1aXJlSW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50c0xvY2soKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJSjJFRUNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCX0JCQorCQkKKwkJdHJ5eworCQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQkJYXBwbGljYXRpb25DbGllbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKKwkKKwkJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCQlpbml0RUNsYXNzKGFwcGxpY2F0aW9uQ2xpZW50RUNsYXNzLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIkFwcGxpY2F0aW9uQ2xpZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBcHBsaWNhdGlvbkNsaWVudF9WZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZXJzaW9uIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1Jlc291cmNlUmVmcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFJlc291cmNlUmVmKCksIG51bGwsICJyZXNvdXJjZVJlZnMiLCBudWxsLCAwLCAtMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X0Vudmlyb25tZW50UHJvcHMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRFbnZFbnRyeSgpLCBudWxsLCAiZW52aXJvbm1lbnRQcm9wcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfRWpiUmVmZXJlbmNlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmZXJlbmNlcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfUmVzb3VyY2VFbnZSZWZzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfQ2FsbGJhY2tIYW5kbGVyKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiY2FsbGJhY2tIYW5kbGVyIiwgbnVsbCwgMCwgMSwgQXBwbGljYXRpb25DbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCksIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCB0aGVDb21tb25QYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9ucyIsIG51bGwsIDAsIC0xLCBBcHBsaWNhdGlvbkNsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKKwkJCWluaXRFRW51bShyZXNBdXRoQXBwbGljYXRpb25UeXBlRUVudW0sIFJlc0F1dGhBcHBsaWNhdGlvblR5cGUuY2xhc3MsICJSZXNBdXRoQXBwbGljYXRpb25UeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoQXBwbGljYXRpb25UeXBlRUVudW0sIFJlc0F1dGhBcHBsaWNhdGlvblR5cGUuQVBQTElDQVRJT05fTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aEFwcGxpY2F0aW9uVHlwZUVFbnVtLCBSZXNBdXRoQXBwbGljYXRpb25UeXBlLkNPTlRBSU5FUl9MSVRFUkFMKTsKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiB9IC8vQ2xpZW50UGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC91dGlsL0NsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvaW50ZXJuYWwvdXRpbC9DbGllbnRBZGFwdGVyRmFjdG9yeS5qYXZhCmluZGV4IDRhZDcwY2UuLjIzMTNhNTEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC9pbnRlcm5hbC91dGlsL0NsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L2ludGVybmFsL3V0aWwvQ2xpZW50QWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMjksNiArMjksNyBAQAogCQkJbW9kZWxQYWNrYWdlID0gKENsaWVudFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKTsKIAkJfQogCX0KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CiAJCWlmICh0eXBlID09IG1vZGVsUGFja2FnZSkgewogCQkJcmV0dXJuIHRydWU7CkBAIC00MCwxMSArNDEsMTMgQEAKIAl9CiAKIAlwcm90ZWN0ZWQgQ2xpZW50U3dpdGNoIHN3ID0gbmV3IENsaWVudFN3aXRjaCgpIHsKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUFwcGxpY2F0aW9uQ2xpZW50KEFwcGxpY2F0aW9uQ2xpZW50IG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50QWRhcHRlcigpOwogCQl9CiAJfTsKIAorCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7CiAJCXJldHVybiAoQWRhcHRlcilzdy5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwogCX0KQEAgLTc4LDE4ICs4MSwyMyBAQAogCSAqLwogCXByb3RlY3RlZCBDbGllbnRTd2l0Y2ggbW9kZWxTd2l0Y2ggPQogCQluZXcgQ2xpZW50U3dpdGNoKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VBcHBsaWNhdGlvbkNsaWVudChBcHBsaWNhdGlvbkNsaWVudCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYXRpb25DbGllbnRBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKIAkJCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FamJSZWZUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRWpiUmVmVHlwZS5qYXZhCmluZGV4IGY0MmJlNzEuLmE4MTZmNTMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FamJSZWZUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VqYlJlZlR5cGUuamF2YQpAQCAtNDcsNyArNDcsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWpiUmVmVHlwZSBTRVNTSU9OX0xJVEVSQUwgPSBuZXcgRWpiUmVmVHlwZShTRVNTSU9OLCAiU2Vzc2lvbiIsICJTZXNzaW9uIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEVqYlJlZlR5cGUgU0VTU0lPTl9MSVRFUkFMID0gbmV3IEVqYlJlZlR5cGUoU0VTU0lPTiwgIlNlc3Npb24iLCAiU2Vzc2lvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC02MSw3ICs2MSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFamJSZWZUeXBlIEVOVElUWV9MSVRFUkFMID0gbmV3IEVqYlJlZlR5cGUoRU5USVRZLCAiRW50aXR5IiwgIkVudGl0eSIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBFamJSZWZUeXBlIEVOVElUWV9MSVRFUkFMID0gbmV3IEVqYlJlZlR5cGUoRU5USVRZLCAiRW50aXR5IiwgIkVudGl0eSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5FamIgUmVmIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VudkVudHJ5VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL0VudkVudHJ5VHlwZS5qYXZhCmluZGV4IGYyYzlkZGIuLjhlZDEzNWEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9FbnZFbnRyeVR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vRW52RW50cnlUeXBlLmphdmEKQEAgLTc1LDcgKzc1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBTVFJJTkdfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoU1RSSU5HLCAiU3RyaW5nIiwgIlN0cmluZyIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgU1RSSU5HX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKFNUUklORywgIlN0cmluZyIsICJTdHJpbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5JbnRlZ2VyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTg5LDcgKzg5LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBJTlRFR0VSX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKElOVEVHRVIsICJJbnRlZ2VyIiwgIkludGVnZXIiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIElOVEVHRVJfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoSU5URUdFUiwgIkludGVnZXIiLCAiSW50ZWdlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPkJvb2xlYW48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtMTAzLDcgKzEwMyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgQk9PTEVBTl9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShCT09MRUFOLCAiQm9vbGVhbiIsICJCb29sZWFuIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBCT09MRUFOX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKEJPT0xFQU4sICJCb29sZWFuIiwgIkJvb2xlYW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5Eb3VibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtMTE3LDcgKzExNyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgRE9VQkxFX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKERPVUJMRSwgIkRvdWJsZSIsICJEb3VibGUiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIERPVUJMRV9MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShET1VCTEUsICJEb3VibGUiLCAiRG91YmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+Qnl0ZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC0xMzEsNyArMTMxLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBCWVRFX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKEJZVEUsICJCeXRlIiwgIkJ5dGUiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIEJZVEVfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoQllURSwgIkJ5dGUiLCAiQnl0ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPlNob3J0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTE0NSw3ICsxNDUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIFNIT1JUX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKFNIT1JULCAiU2hvcnQiLCAiU2hvcnQiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIFNIT1JUX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKFNIT1JULCAiU2hvcnQiLCAiU2hvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5Mb25nPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTE1OSw3ICsxNTksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW52RW50cnlUeXBlIExPTkdfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoTE9ORywgIkxvbmciLCAiTG9uZyIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgTE9OR19MSVRFUkFMID0gbmV3IEVudkVudHJ5VHlwZShMT05HLCAiTG9uZyIsICJMb25nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+RmxvYXQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtMTczLDcgKzE3Myw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgRkxPQVRfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoRkxPQVQsICJGbG9hdCIsICJGbG9hdCIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgRkxPQVRfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoRkxPQVQsICJGbG9hdCIsICJGbG9hdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPkNoYXJhY3RlcjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC0xODcsNyArMTg3LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVudkVudHJ5VHlwZSBDSEFSQUNURVJfTElURVJBTCA9IG5ldyBFbnZFbnRyeVR5cGUoQ0hBUkFDVEVSLCAiQ2hhcmFjdGVyIiwgIkNoYXJhY3RlciIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBFbnZFbnRyeVR5cGUgQ0hBUkFDVEVSX0xJVEVSQUwgPSBuZXcgRW52RW50cnlUeXBlKENIQVJBQ1RFUiwgIkNoYXJhY3RlciIsICJDaGFyYWN0ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RW52IEVudHJ5IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL01lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5qYXZhCmluZGV4IGU1OWY2YTMuLjMwNTkzMzEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9NZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmphdmEKQEAgLTcxLDcgKzcxLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBDT05TVU1FU19MSVRFUkFMID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZShDT05TVU1FUywgIkNvbnN1bWVzIiwgIkNvbnN1bWVzIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBDT05TVU1FU19MSVRFUkFMID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZShDT05TVU1FUywgIkNvbnN1bWVzIiwgIkNvbnN1bWVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+UHJvZHVjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtODUsNyArODUsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIFBST0RVQ0VTX0xJVEVSQUwgPSBuZXcgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKFBST0RVQ0VTLCAiUHJvZHVjZXMiLCAiUHJvZHVjZXMiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIFBST0RVQ0VTX0xJVEVSQUwgPSBuZXcgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKFBST0RVQ0VTLCAiUHJvZHVjZXMiLCAiUHJvZHVjZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5Db25zdW1lcyBQcm9kdWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC05OSw3ICs5OSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUgQ09OU1VNRVNfUFJPRFVDRVNfTElURVJBTCA9IG5ldyBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUoQ09OU1VNRVNfUFJPRFVDRVMsICJDb25zdW1lc1Byb2R1Y2VzIiwgIkNvbnN1bWVzUHJvZHVjZXMiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIENPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUwgPSBuZXcgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKENPTlNVTUVTX1BST0RVQ0VTLCAiQ29uc3VtZXNQcm9kdWNlcyIsICJDb25zdW1lc1Byb2R1Y2VzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gVXNhZ2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUmVzQXV0aFR5cGVCYXNlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUmVzQXV0aFR5cGVCYXNlLmphdmEKaW5kZXggMDM2ZTRkMC4uM2MzMGQyNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc0F1dGhUeXBlQmFzZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNBdXRoVHlwZUJhc2UuamF2YQpAQCAtNzgsNyArNzgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aFR5cGVCYXNlIENPTlRBSU5FUl9MSVRFUkFMID0gbmV3IFJlc0F1dGhUeXBlQmFzZShDT05UQUlORVIsICJDb250YWluZXIiLCAiQ29udGFpbmVyIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlQmFzZSBDT05UQUlORVJfTElURVJBTCA9IG5ldyBSZXNBdXRoVHlwZUJhc2UoQ09OVEFJTkVSLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTkyLDcgKzkyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlQmFzZSBBUFBMSUNBVElPTl9MSVRFUkFMID0gbmV3IFJlc0F1dGhUeXBlQmFzZShBUFBMSUNBVElPTiwgIkFwcGxpY2F0aW9uIiwgIkFwcGxpY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlQmFzZSBBUFBMSUNBVElPTl9MSVRFUkFMID0gbmV3IFJlc0F1dGhUeXBlQmFzZShBUFBMSUNBVElPTiwgIkFwcGxpY2F0aW9uIiwgIkFwcGxpY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+U0VSVkxFVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC0xMDYsNyArMTA2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc0F1dGhUeXBlQmFzZSBTRVJWTEVUX0xJVEVSQUwgPSBuZXcgUmVzQXV0aFR5cGVCYXNlKFNFUlZMRVQsICJTRVJWTEVUIiwgIlNFUlZMRVQiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aFR5cGVCYXNlIFNFUlZMRVRfTElURVJBTCA9IG5ldyBSZXNBdXRoVHlwZUJhc2UoU0VSVkxFVCwgIlNFUlZMRVQiLCAiU0VSVkxFVCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXMgQXV0aCBUeXBlIEJhc2U8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc1NoYXJpbmdTY29wZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9SZXNTaGFyaW5nU2NvcGVUeXBlLmphdmEKaW5kZXggNWU1NGE5My4uNjA2Y2E4MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL1Jlc1NoYXJpbmdTY29wZVR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vUmVzU2hhcmluZ1Njb3BlVHlwZS5qYXZhCkBAIC00OCw3ICs0OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNTaGFyaW5nU2NvcGVUeXBlIFNIQVJFQUJMRV9MSVRFUkFMID0gbmV3IFJlc1NoYXJpbmdTY29wZVR5cGUoU0hBUkVBQkxFLCAiU2hhcmVhYmxlIiwgIlNoYXJlYWJsZSIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBSZXNTaGFyaW5nU2NvcGVUeXBlIFNIQVJFQUJMRV9MSVRFUkFMID0gbmV3IFJlc1NoYXJpbmdTY29wZVR5cGUoU0hBUkVBQkxFLCAiU2hhcmVhYmxlIiwgIlNoYXJlYWJsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPlVuc2hhcmVhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTYyLDcgKzYyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc1NoYXJpbmdTY29wZVR5cGUgVU5TSEFSRUFCTEVfTElURVJBTCA9IG5ldyBSZXNTaGFyaW5nU2NvcGVUeXBlKFVOU0hBUkVBQkxFLCAiVW5zaGFyZWFibGUiLCAiVW5zaGFyZWFibGUiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzU2hhcmluZ1Njb3BlVHlwZSBVTlNIQVJFQUJMRV9MSVRFUkFMID0gbmV3IFJlc1NoYXJpbmdTY29wZVR5cGUoVU5TSEFSRUFCTEUsICJVbnNoYXJlYWJsZSIsICJVbnNoYXJlYWJsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXMgU2hhcmluZyBTY29wZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vbkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Db21tb25GYWN0b3J5SW1wbC5qYXZhCmluZGV4IDcyNzI4NjEuLjQxZTk0ZTEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vbkZhY3RvcnlJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvQ29tbW9uRmFjdG9yeUltcGwuamF2YQpAQCAtNjQsNyArNjQsNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgQ29tbW9uRmFjdG9yeSBpbml0KCkgewogCQl0cnkgewotCQkJQ29tbW9uRmFjdG9yeSB0aGVDb21tb25GYWN0b3J5ID0gKENvbW1vbkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImNvbW1vbi54bWkiKTsgCisJCQlDb21tb25GYWN0b3J5IHRoZUNvbW1vbkZhY3RvcnkgPSAoQ29tbW9uRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiY29tbW9uLnhtaSIpOyAgLy8kTk9OLU5MUy0xJAogCQkJaWYgKHRoZUNvbW1vbkZhY3RvcnkgIT0gbnVsbCkgewogCQkJCXJldHVybiB0aGVDb21tb25GYWN0b3J5OwogCQkJfQpAQCAtOTAsNiArOTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewogCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUY6IHJldHVybiBjcmVhdGVFamJSZWYoKTsKQEAgLTExNiw3ICsxMTcsNyBAQAogCQkJY2FzZSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVDogcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0KCk7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuSjJFRUVfQVRUUklCVVRFOiByZXR1cm4gY3JlYXRlSjJFRUVBdHRyaWJ1dGUoKTsKIAkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJfQogCX0KIApAQCAtMTI1LDYgKzEyNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX1RZUEU6CkBAIC0xMzgsNyArMTQwLDcgQEAKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1VTQUdFX1RZUEU6CiAJCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9CiAJfQogCkBAIC0xNDcsNiArMTQ5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKIAkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfVFlQRToKQEAgLTE2MCw3ICsxNjMsNyBAQAogCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fVVNBR0VfVFlQRToKIAkJCQlyZXR1cm4gY29udmVydE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAl9CiAKQEAgLTQwMSw3ICs0MDQsNyBAQAogCSAqLwogCXB1YmxpYyBFbnZFbnRyeVR5cGUgY3JlYXRlRW52RW50cnlUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCUVudkVudHJ5VHlwZSByZXN1bHQgPSBFbnZFbnRyeVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTQyMSw3ICs0MjQsNyBAQAogCSAqLwogCXB1YmxpYyBSZXNBdXRoVHlwZUJhc2UgY3JlYXRlUmVzQXV0aFR5cGVCYXNlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCVJlc0F1dGhUeXBlQmFzZSByZXN1bHQgPSBSZXNBdXRoVHlwZUJhc2UuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTQ0MSw3ICs0NDQsNyBAQAogCSAqLwogCXB1YmxpYyBFamJSZWZUeXBlIGNyZWF0ZUVqYlJlZlR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJRWpiUmVmVHlwZSByZXN1bHQgPSBFamJSZWZUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC00NjEsNyArNDY0LDcgQEAKIAkgKi8KIAlwdWJsaWMgUmVzU2hhcmluZ1Njb3BlVHlwZSBjcmVhdGVSZXNTaGFyaW5nU2NvcGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCVJlc1NoYXJpbmdTY29wZVR5cGUgcmVzdWx0ID0gUmVzU2hhcmluZ1Njb3BlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtNDgxLDcgKzQ4NCw3IEBACiAJICovCiAJcHVibGljIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIHJlc3VsdCA9IE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvQ29tbW9uUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbW1vblBhY2thZ2VJbXBsLmphdmEKaW5kZXggNmU5YzBiMS4uMjk5YTkyMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvQ29tbW9uUGFja2FnZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Db21tb25QYWNrYWdlSW1wbC5qYXZhCkBAIC0xOCwxMCArMTgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LmludGVybmFsLmltcGwuQ2xpZW50UGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwpAQCAtNTMsMjYgKzQ5LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Vc2VDYWxsZXJJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUluaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKIAogCi1wdWJsaWMgY2xhc3MgQ29tbW9uUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBDb21tb25QYWNrYWdlLCBFUGFja2FnZSB7CitwdWJsaWMgY2xhc3MgQ29tbW9uUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBDb21tb25QYWNrYWdlIHsKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMjg4LDcgKzI3MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKwlwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CiAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KQEAgLTI5Nyw3ICsyNzksMTAgQEAKIAkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKIAogCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBDb21tb25QYWNrYWdlSW1wbCgpKTsKKwkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IAorCQkJKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZgorCQkJCQlDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldworCQkJCQkJCUNvbW1vblBhY2thZ2VJbXBsKCkpOwogCiAJCWlzSW5pdGVkID0gdHJ1ZTsKIApAQCAtMzA1LDUwICsyOTAsMjAgQEAKIAkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKIAkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAoVGFnbGliUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgOiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSA6IEpjYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IChXc2RkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgOiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UpOwotCiAJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCiAJCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwogCiAJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKIAkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CiAKIAkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAogCQl0aGVDb21tb25QYWNrYWdlLmZyZWV6ZSgpOwogCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoQ29tbW9uUGFja2FnZS5lTlNfVVJJLCB0aGVDb21tb25QYWNrYWdlKTsKKworCQlKMkVFSW5pdC5pbml0RU1GTW9kZWxzKCk7CisKIAkJcmV0dXJuIHRoZUNvbW1vblBhY2thZ2U7CiAJfQogCkBAIC0xMzc3LDE4NiArMTMzMiwxOTggQEAKIAkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpOwogCQlFY29yZVBhY2thZ2UgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7CiAKLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQllamJSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZW52RW50cnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKMkVFRU9iamVjdCgpKTsKLQkJcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKMkVFRU9iamVjdCgpKTsKLQkJc2VjdXJpdHlSb2xlUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXNlY3VyaXR5Um9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQlyZXNvdXJjZUVudlJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQllamJMb2NhbFJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVqYlJlZigpKTsKLQkJcnVuQXNTcGVjaWZpZWRJZGVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlY3VyaXR5SWRlbnRpdHkoKSk7Ci0JCWlkZW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWljb25UeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWRpc3BsYXlOYW1lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQltZXNzYWdlRGVzdGluYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJcGFyYW1WYWx1ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQlkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJc2VjdXJpdHlJZGVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOwotCQl1c2VDYWxsZXJJZGVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlY3VyaXR5SWRlbnRpdHkoKSk7Ci0JCWRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXFOYW1lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWxpc3RlbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJajJFRUVBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVBdHRyaWJ1dGUoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhlamJSZWZFQ2xhc3MsIEVqYlJlZi5jbGFzcywgIkVqYlJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9UeXBlKCksIHRoaXMuZ2V0RWpiUmVmVHlwZSgpLCAidHlwZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfSG9tZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaG9tZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX1JlbW90ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVtb3RlIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfTGluaygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGluayIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RWpiUmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZW52RW50cnlFQ2xhc3MsIEVudkVudHJ5LmNsYXNzLCAiRW52RW50cnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVudkVudHJ5X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVudkVudHJ5X1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9UeXBlKCksIHRoaXMuZ2V0RW52RW50cnlUeXBlKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJlc291cmNlUmVmRUNsYXNzLCBSZXNvdXJjZVJlZi5jbGFzcywgIlJlc291cmNlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX0F1dGgoKSwgdGhpcy5nZXRSZXNBdXRoVHlwZUJhc2UoKSwgImF1dGgiLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9MaW5rKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsaW5rIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX1Jlc1NoYXJpbmdTY29wZSgpLCB0aGlzLmdldFJlc1NoYXJpbmdTY29wZVR5cGUoKSwgInJlc1NoYXJpbmdTY29wZSIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlUmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eVJvbGVSZWZFQ2xhc3MsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIlNlY3VyaXR5Um9sZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlUmVmX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Um9sZVJlZl9MaW5rKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsaW5rIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eVJvbGVSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZWN1cml0eVJvbGVFQ2xhc3MsIFNlY3VyaXR5Um9sZS5jbGFzcywgIlNlY3VyaXR5Um9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyb2xlTmFtZSIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgU2VjdXJpdHlSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocmVzb3VyY2VFbnZSZWZFQ2xhc3MsIFJlc291cmNlRW52UmVmLmNsYXNzLCAiUmVzb3VyY2VFbnZSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUVudlJlZl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlRW52UmVmX1R5cGUoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJ0eXBlIiwgbnVsbCwgMSwgMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlRW52UmVmX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VFbnZSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlamJMb2NhbFJlZkVDbGFzcywgRUpCTG9jYWxSZWYuY2xhc3MsICJFSkJMb2NhbFJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCTG9jYWxSZWZfTG9jYWxIb21lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhbEhvbWUiLCBudWxsLCAwLCAxLCBFSkJMb2NhbFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCTG9jYWxSZWZfTG9jYWwoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxvY2FsIiwgbnVsbCwgMCwgMSwgRUpCTG9jYWxSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhydW5Bc1NwZWNpZmllZElkZW50aXR5RUNsYXNzLCBSdW5Bc1NwZWNpZmllZElkZW50aXR5LmNsYXNzLCAiUnVuQXNTcGVjaWZpZWRJZGVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UnVuQXNTcGVjaWZpZWRJZGVudGl0eV9JZGVudGl0eSgpLCB0aGlzLmdldElkZW50aXR5KCksIG51bGwsICJpZGVudGl0eSIsIG51bGwsIDAsIDEsIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhpZGVudGl0eUVDbGFzcywgSWRlbnRpdHkuY2xhc3MsICJJZGVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWRlbnRpdHlfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgSWRlbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldElkZW50aXR5X1JvbGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyb2xlTmFtZSIsIG51bGwsIDAsIDEsIElkZW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRJZGVudGl0eV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIElkZW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaWNvblR5cGVFQ2xhc3MsIEljb25UeXBlLmNsYXNzLCAiSWNvblR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEljb25UeXBlX1NtYWxsSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic21hbGxJY29uIiwgbnVsbCwgMCwgMSwgSWNvblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEljb25UeXBlX0xhcmdlSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFyZ2VJY29uIiwgbnVsbCwgMCwgMSwgSWNvblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEljb25UeXBlX0xhbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxhbmciLCBudWxsLCAwLCAxLCBJY29uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRpc3BsYXlOYW1lRUNsYXNzLCBEaXNwbGF5TmFtZS5jbGFzcywgIkRpc3BsYXlOYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNwbGF5TmFtZV9MYW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYW5nIiwgbnVsbCwgMCwgMSwgRGlzcGxheU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc3BsYXlOYW1lX1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIERpc3BsYXlOYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWVzc2FnZURlc3RpbmF0aW9uUmVmRUNsYXNzLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb25SZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX1VzYWdlKCksIHRoaXMuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlKCksICJ1c2FnZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX0xpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxpbmsiLCBudWxsLCAwLCAxLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1lc3NhZ2VEZXN0aW5hdGlvbkVDbGFzcywgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAiTWVzc2FnZURlc3RpbmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25fTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBhcmFtVmFsdWVFQ2xhc3MsIFBhcmFtVmFsdWUuY2xhc3MsICJQYXJhbVZhbHVlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQYXJhbVZhbHVlX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQYXJhbVZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQYXJhbVZhbHVlX1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUGFyYW1WYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLCBEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAiRGVzY3JpcHRpb25Hcm91cCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RGVzY3JpcHRpb25Hcm91cF9JY29ucygpLCB0aGlzLmdldEljb25UeXBlKCksIG51bGwsICJpY29ucyIsIG51bGwsIDAsIC0xLCBEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lcygpLCB0aGlzLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgRGVzY3JpcHRpb25Hcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RGVzY3JpcHRpb25Hcm91cF9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIERlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqbmRpRW52UmVmc0dyb3VwRUNsYXNzLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAiSk5ESUVudlJlZnNHcm91cCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKTkRJRW52UmVmc0dyb3VwX0Vudmlyb25tZW50UHJvcGVydGllcygpLCB0aGlzLmdldEVudkVudHJ5KCksIG51bGwsICJlbnZpcm9ubWVudFByb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgSk5ESUVudlJlZnNHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Sk5ESUVudlJlZnNHcm91cF9SZXNvdXJjZVJlZnMoKSwgdGhpcy5nZXRSZXNvdXJjZVJlZigpLCBudWxsLCAicmVzb3VyY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpORElFbnZSZWZzR3JvdXBfRWpiUmVmcygpLCB0aGlzLmdldEVqYlJlZigpLCBudWxsLCAiZWpiUmVmcyIsIG51bGwsIDAsIC0xLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlRW52UmVmcygpLCB0aGlzLmdldFJlc291cmNlRW52UmVmKCksIG51bGwsICJyZXNvdXJjZUVudlJlZnMiLCBudWxsLCAwLCAtMSwgSk5ESUVudlJlZnNHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJMb2NhbFJlZnMoKSwgdGhpcy5nZXRFSkJMb2NhbFJlZigpLCBudWxsLCAiZWpiTG9jYWxSZWZzIiwgbnVsbCwgMCwgLTEsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpORElFbnZSZWZzR3JvdXBfTWVzc2FnZURlc3RpbmF0aW9uUmVmcygpLCB0aGlzLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9uUmVmcyIsIG51bGwsIDAsIC0xLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKTkRJRW52UmVmc0dyb3VwX1NlcnZpY2VSZWZzKCksIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VjdXJpdHlJZGVudGl0eUVDbGFzcywgU2VjdXJpdHlJZGVudGl0eS5jbGFzcywgIlNlY3VyaXR5SWRlbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlJZGVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5SWRlbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh1c2VDYWxsZXJJZGVudGl0eUVDbGFzcywgVXNlQ2FsbGVySWRlbnRpdHkuY2xhc3MsICJVc2VDYWxsZXJJZGVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGRlc2NyaXB0aW9uRUNsYXNzLCBEZXNjcmlwdGlvbi5jbGFzcywgIkRlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmlwdGlvbl9MYW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYW5nIiwgbnVsbCwgMCwgMSwgRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlc2NyaXB0aW9uX1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocU5hbWVFQ2xhc3MsIFFOYW1lLmNsYXNzLCAiUU5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFFOYW1lX05hbWVzcGFjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIiwgbnVsbCwgMCwgMSwgUU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFFOYW1lX0xvY2FsUGFydCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYWxQYXJ0IiwgbnVsbCwgMCwgMSwgUU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFFOYW1lX0NvbWJpbmVkUU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbWJpbmVkUU5hbWUiLCBudWxsLCAwLCAxLCBRTmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UU5hbWVfSW50ZXJuYWxQcmVmaXhPck5zVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpbnRlcm5hbFByZWZpeE9yTnNVUkkiLCBudWxsLCAwLCAxLCBRTmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxpc3RlbmVyRUNsYXNzLCBMaXN0ZW5lci5jbGFzcywgIkxpc3RlbmVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMaXN0ZW5lcl9MaXN0ZW5lckNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAibGlzdGVuZXJDbGFzcyIsIG51bGwsIDEsIDEsIExpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBFQ2xhc3MsIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAiQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX1NtYWxsSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic21hbGxJY29uIiwgbnVsbCwgMCwgMSwgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0xhcmdlSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFyZ2VJY29uIiwgbnVsbCwgMCwgMSwgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGlzcGxheU5hbWUiLCBudWxsLCAwLCAxLCBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGoyRUVFT2JqZWN0RUNsYXNzLCBKMkVFRU9iamVjdC5jbGFzcywgIkoyRUVFT2JqZWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoajJFRUVBdHRyaWJ1dGVFQ2xhc3MsIEoyRUVFQXR0cmlidXRlLmNsYXNzLCAiSjJFRUVBdHRyaWJ1dGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuY2xhc3MsICJFbnZFbnRyeVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuU1RSSU5HX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5JTlRFR0VSX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5CT09MRUFOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5ET1VCTEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkJZVEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLlNIT1JUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5MT05HX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5GTE9BVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuQ0hBUkFDVEVSX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShyZXNBdXRoVHlwZUJhc2VFRW51bSwgUmVzQXV0aFR5cGVCYXNlLmNsYXNzLCAiUmVzQXV0aFR5cGVCYXNlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoVHlwZUJhc2VFRW51bSwgUmVzQXV0aFR5cGVCYXNlLkNPTlRBSU5FUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc0F1dGhUeXBlQmFzZUVFbnVtLCBSZXNBdXRoVHlwZUJhc2UuQVBQTElDQVRJT05fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoVHlwZUJhc2VFRW51bSwgUmVzQXV0aFR5cGVCYXNlLlNFUlZMRVRfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGVqYlJlZlR5cGVFRW51bSwgRWpiUmVmVHlwZS5jbGFzcywgIkVqYlJlZlR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVqYlJlZlR5cGVFRW51bSwgRWpiUmVmVHlwZS5TRVNTSU9OX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZWpiUmVmVHlwZUVFbnVtLCBFamJSZWZUeXBlLkVOVElUWV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0ocmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtLCBSZXNTaGFyaW5nU2NvcGVUeXBlLmNsYXNzLCAiUmVzU2hhcmluZ1Njb3BlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwocmVzU2hhcmluZ1Njb3BlVHlwZUVFbnVtLCBSZXNTaGFyaW5nU2NvcGVUeXBlLlNIQVJFQUJMRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSwgUmVzU2hhcmluZ1Njb3BlVHlwZS5VTlNIQVJFQUJMRV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0obWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0sIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5jbGFzcywgIk1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwobWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0sIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5DT05TVU1FU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuUFJPRFVDRVNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bSwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLkNPTlNVTUVTX1BST0RVQ0VTX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwkJYm9vbGVhbiBoYXNMb2NrID0gZmFsc2U7CisJCXRyeSB7CisJCQloYXNMb2NrID0gSjJFRUluaXQuYXF1aXJlSW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50c0xvY2soKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJSjJFRUNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCX0JCQorCQkKKwkJdHJ5eworCQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQkJZWpiUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQllbnZFbnRyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOworCQkJcmVzb3VyY2VSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCXNlY3VyaXR5Um9sZVJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOworCQkJc2VjdXJpdHlSb2xlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQlyZXNvdXJjZUVudlJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOworCQkJZWpiTG9jYWxSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFamJSZWYoKSk7CisJCQlydW5Bc1NwZWNpZmllZElkZW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0U2VjdXJpdHlJZGVudGl0eSgpKTsKKwkJCWlkZW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQlpY29uVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOworCQkJZGlzcGxheU5hbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCW1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOworCQkJbWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7CisJCQlwYXJhbVZhbHVlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQlkZXNjcmlwdGlvbkdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQlqbmRpRW52UmVmc0dyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7CisJCQlzZWN1cml0eUlkZW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQl1c2VDYWxsZXJJZGVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlY3VyaXR5SWRlbnRpdHkoKSk7CisJCQlkZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEoyRUVFT2JqZWN0KCkpOworCQkJcU5hbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCWxpc3RlbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7CisJCQljb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaXB0aW9uR3JvdXAoKSk7CisJCQlqMkVFRUF0dHJpYnV0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RUF0dHJpYnV0ZSgpKTsKKwkKKwkJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCQlpbml0RUNsYXNzKGVqYlJlZkVDbGFzcywgRWpiUmVmLmNsYXNzLCAiRWpiUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEVqYlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWpiUmVmX1R5cGUoKSwgdGhpcy5nZXRFamJSZWZUeXBlKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9Ib21lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJob21lIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfUmVtb3RlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZW1vdGUiLCBudWxsLCAwLCAxLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVqYlJlZl9MaW5rKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsaW5rIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFamJSZWZfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgRWpiUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFamJSZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFamJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoZW52RW50cnlFQ2xhc3MsIEVudkVudHJ5LmNsYXNzLCAiRW52RW50cnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVudkVudHJ5X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVudkVudHJ5X1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIEVudkVudHJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFbnZFbnRyeV9UeXBlKCksIHRoaXMuZ2V0RW52RW50cnlUeXBlKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgRW52RW50cnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW52RW50cnlfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFbnZFbnRyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhyZXNvdXJjZVJlZkVDbGFzcywgUmVzb3VyY2VSZWYuY2xhc3MsICJSZXNvdXJjZVJlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlUmVmX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9BdXRoKCksIHRoaXMuZ2V0UmVzQXV0aFR5cGVCYXNlKCksICJhdXRoIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VSZWZfTGluaygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGluayIsIG51bGwsIDAsIDEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZVJlZl9SZXNTaGFyaW5nU2NvcGUoKSwgdGhpcy5nZXRSZXNTaGFyaW5nU2NvcGVUeXBlKCksICJyZXNTaGFyaW5nU2NvcGUiLCBudWxsLCAwLCAxLCBSZXNvdXJjZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZVJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHNlY3VyaXR5Um9sZVJlZkVDbGFzcywgU2VjdXJpdHlSb2xlUmVmLmNsYXNzLCAiU2VjdXJpdHlSb2xlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eVJvbGVSZWZfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlUmVmX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlUmVmX0xpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxpbmsiLCBudWxsLCAwLCAxLCBTZWN1cml0eVJvbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Um9sZVJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5Um9sZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhzZWN1cml0eVJvbGVFQ2xhc3MsIFNlY3VyaXR5Um9sZS5jbGFzcywgIlNlY3VyaXR5Um9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlSb2xlX1JvbGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyb2xlTmFtZSIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Um9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlSb2xlX0Rlc2NyaXB0aW9ucygpLCB0aGlzLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgU2VjdXJpdHlSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHJlc291cmNlRW52UmVmRUNsYXNzLCBSZXNvdXJjZUVudlJlZi5jbGFzcywgIlJlc291cmNlRW52UmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBSZXNvdXJjZUVudlJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VFbnZSZWZfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUVudlJlZl9UeXBlKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAidHlwZSIsIG51bGwsIDEsIDEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUVudlJlZl9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlRW52UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGVqYkxvY2FsUmVmRUNsYXNzLCBFSkJMb2NhbFJlZi5jbGFzcywgIkVKQkxvY2FsUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJMb2NhbFJlZl9Mb2NhbEhvbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxvY2FsSG9tZSIsIG51bGwsIDAsIDEsIEVKQkxvY2FsUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJMb2NhbFJlZl9Mb2NhbCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYWwiLCBudWxsLCAwLCAxLCBFSkJMb2NhbFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhydW5Bc1NwZWNpZmllZElkZW50aXR5RUNsYXNzLCBSdW5Bc1NwZWNpZmllZElkZW50aXR5LmNsYXNzLCAiUnVuQXNTcGVjaWZpZWRJZGVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UnVuQXNTcGVjaWZpZWRJZGVudGl0eV9JZGVudGl0eSgpLCB0aGlzLmdldElkZW50aXR5KCksIG51bGwsICJpZGVudGl0eSIsIG51bGwsIDAsIDEsIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoaWRlbnRpdHlFQ2xhc3MsIElkZW50aXR5LmNsYXNzLCAiSWRlbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldElkZW50aXR5X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIElkZW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRJZGVudGl0eV9Sb2xlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicm9sZU5hbWUiLCBudWxsLCAwLCAxLCBJZGVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0SWRlbnRpdHlfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBJZGVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhpY29uVHlwZUVDbGFzcywgSWNvblR5cGUuY2xhc3MsICJJY29uVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvblR5cGVfU21hbGxJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzbWFsbEljb24iLCBudWxsLCAwLCAxLCBJY29uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvblR5cGVfTGFyZ2VJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYXJnZUljb24iLCBudWxsLCAwLCAxLCBJY29uVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SWNvblR5cGVfTGFuZygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFuZyIsIG51bGwsIDAsIDEsIEljb25UeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGRpc3BsYXlOYW1lRUNsYXNzLCBEaXNwbGF5TmFtZS5jbGFzcywgIkRpc3BsYXlOYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXREaXNwbGF5TmFtZV9MYW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYW5nIiwgbnVsbCwgMCwgMSwgRGlzcGxheU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldERpc3BsYXlOYW1lX1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIERpc3BsYXlOYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKG1lc3NhZ2VEZXN0aW5hdGlvblJlZkVDbGFzcywgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAiTWVzc2FnZURlc3RpbmF0aW9uUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9Vc2FnZSgpLCB0aGlzLmdldE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZSgpLCAidXNhZ2UiLCBudWxsLCAwLCAxLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZl9MaW5rKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsaW5rIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRGVzdGluYXRpb25SZWZfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXNzYWdlRGVzdGluYXRpb25SZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MobWVzc2FnZURlc3RpbmF0aW9uRUNsYXNzLCBNZXNzYWdlRGVzdGluYXRpb24uY2xhc3MsICJNZXNzYWdlRGVzdGluYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEZXN0aW5hdGlvbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHBhcmFtVmFsdWVFQ2xhc3MsIFBhcmFtVmFsdWUuY2xhc3MsICJQYXJhbVZhbHVlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRQYXJhbVZhbHVlX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBQYXJhbVZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRQYXJhbVZhbHVlX1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFBhcmFtVmFsdWVfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUGFyYW1WYWx1ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UGFyYW1WYWx1ZV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFBhcmFtVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoZGVzY3JpcHRpb25Hcm91cEVDbGFzcywgRGVzY3JpcHRpb25Hcm91cC5jbGFzcywgIkRlc2NyaXB0aW9uR3JvdXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldERlc2NyaXB0aW9uR3JvdXBfSWNvbnMoKSwgdGhpcy5nZXRJY29uVHlwZSgpLCBudWxsLCAiaWNvbnMiLCBudWxsLCAwLCAtMSwgRGVzY3JpcHRpb25Hcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RGVzY3JpcHRpb25Hcm91cF9EaXNwbGF5TmFtZXMoKSwgdGhpcy5nZXREaXNwbGF5TmFtZSgpLCBudWxsLCAiZGlzcGxheU5hbWVzIiwgbnVsbCwgMCwgLTEsIERlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldERlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGpuZGlFbnZSZWZzR3JvdXBFQ2xhc3MsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICJKTkRJRW52UmVmc0dyb3VwIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEpORElFbnZSZWZzR3JvdXBfRW52aXJvbm1lbnRQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0RW52RW50cnkoKSwgbnVsbCwgImVudmlyb25tZW50UHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRKTkRJRW52UmVmc0dyb3VwX1Jlc291cmNlUmVmcygpLCB0aGlzLmdldFJlc291cmNlUmVmKCksIG51bGwsICJyZXNvdXJjZVJlZnMiLCBudWxsLCAwLCAtMSwgSk5ESUVudlJlZnNHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJSZWZzKCksIHRoaXMuZ2V0RWpiUmVmKCksIG51bGwsICJlamJSZWZzIiwgbnVsbCwgMCwgLTEsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEpORElFbnZSZWZzR3JvdXBfUmVzb3VyY2VFbnZSZWZzKCksIHRoaXMuZ2V0UmVzb3VyY2VFbnZSZWYoKSwgbnVsbCwgInJlc291cmNlRW52UmVmcyIsIG51bGwsIDAsIC0xLCBKTkRJRW52UmVmc0dyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRKTkRJRW52UmVmc0dyb3VwX0VqYkxvY2FsUmVmcygpLCB0aGlzLmdldEVKQkxvY2FsUmVmKCksIG51bGwsICJlamJMb2NhbFJlZnMiLCBudWxsLCAwLCAtMSwgSk5ESUVudlJlZnNHcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Sk5ESUVudlJlZnNHcm91cF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIHRoaXMuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb25SZWZzIiwgbnVsbCwgMCwgLTEsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEpORElFbnZSZWZzR3JvdXBfU2VydmljZVJlZnMoKSwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMCwgLTEsIEpORElFbnZSZWZzR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Moc2VjdXJpdHlJZGVudGl0eUVDbGFzcywgU2VjdXJpdHlJZGVudGl0eS5jbGFzcywgIlNlY3VyaXR5SWRlbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5SWRlbnRpdHlfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlJZGVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbnMoKSwgdGhpcy5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5SWRlbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3ModXNlQ2FsbGVySWRlbnRpdHlFQ2xhc3MsIFVzZUNhbGxlcklkZW50aXR5LmNsYXNzLCAiVXNlQ2FsbGVySWRlbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoZGVzY3JpcHRpb25FQ2xhc3MsIERlc2NyaXB0aW9uLmNsYXNzLCAiRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldERlc2NyaXB0aW9uX0xhbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxhbmciLCBudWxsLCAwLCAxLCBEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVzY3JpcHRpb25fVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MocU5hbWVFQ2xhc3MsIFFOYW1lLmNsYXNzLCAiUU5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFFOYW1lX05hbWVzcGFjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIiwgbnVsbCwgMCwgMSwgUU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFFOYW1lX0xvY2FsUGFydCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYWxQYXJ0IiwgbnVsbCwgMCwgMSwgUU5hbWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFFOYW1lX0NvbWJpbmVkUU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbWJpbmVkUU5hbWUiLCBudWxsLCAwLCAxLCBRTmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UU5hbWVfSW50ZXJuYWxQcmVmaXhPck5zVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpbnRlcm5hbFByZWZpeE9yTnNVUkkiLCBudWxsLCAwLCAxLCBRTmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhsaXN0ZW5lckVDbGFzcywgTGlzdGVuZXIuY2xhc3MsICJMaXN0ZW5lciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TGlzdGVuZXJfTGlzdGVuZXJDbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImxpc3RlbmVyQ2xhc3MiLCBudWxsLCAxLCAxLCBMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhjb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEVDbGFzcywgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICJDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfU21hbGxJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzbWFsbEljb24iLCBudWxsLCAwLCAxLCBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfTGFyZ2VJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYXJnZUljb24iLCBudWxsLCAwLCAxLCBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX0Rpc3BsYXlOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkaXNwbGF5TmFtZSIsIG51bGwsIDAsIDEsIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGoyRUVFT2JqZWN0RUNsYXNzLCBKMkVFRU9iamVjdC5jbGFzcywgIkoyRUVFT2JqZWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGoyRUVFQXR0cmlidXRlRUNsYXNzLCBKMkVFRUF0dHJpYnV0ZS5jbGFzcywgIkoyRUVFQXR0cmlidXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCisJCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscworCQkJaW5pdEVFbnVtKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuY2xhc3MsICJFbnZFbnRyeVR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuU1RSSU5HX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuSU5URUdFUl9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChlbnZFbnRyeVR5cGVFRW51bSwgRW52RW50cnlUeXBlLkJPT0xFQU5fTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5ET1VCTEVfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5CWVRFX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuU0hPUlRfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5MT05HX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGVudkVudHJ5VHlwZUVFbnVtLCBFbnZFbnRyeVR5cGUuRkxPQVRfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoZW52RW50cnlUeXBlRUVudW0sIEVudkVudHJ5VHlwZS5DSEFSQUNURVJfTElURVJBTCk7CisJCisJCQlpbml0RUVudW0ocmVzQXV0aFR5cGVCYXNlRUVudW0sIFJlc0F1dGhUeXBlQmFzZS5jbGFzcywgIlJlc0F1dGhUeXBlQmFzZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aFR5cGVCYXNlRUVudW0sIFJlc0F1dGhUeXBlQmFzZS5DT05UQUlORVJfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aFR5cGVCYXNlRUVudW0sIFJlc0F1dGhUeXBlQmFzZS5BUFBMSUNBVElPTl9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoVHlwZUJhc2VFRW51bSwgUmVzQXV0aFR5cGVCYXNlLlNFUlZMRVRfTElURVJBTCk7CisJCisJCQlpbml0RUVudW0oZWpiUmVmVHlwZUVFbnVtLCBFamJSZWZUeXBlLmNsYXNzLCAiRWpiUmVmVHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwoZWpiUmVmVHlwZUVFbnVtLCBFamJSZWZUeXBlLlNFU1NJT05fTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoZWpiUmVmVHlwZUVFbnVtLCBFamJSZWZUeXBlLkVOVElUWV9MSVRFUkFMKTsKKwkKKwkJCWluaXRFRW51bShyZXNTaGFyaW5nU2NvcGVUeXBlRUVudW0sIFJlc1NoYXJpbmdTY29wZVR5cGUuY2xhc3MsICJSZXNTaGFyaW5nU2NvcGVUeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChyZXNTaGFyaW5nU2NvcGVUeXBlRUVudW0sIFJlc1NoYXJpbmdTY29wZVR5cGUuU0hBUkVBQkxFX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKHJlc1NoYXJpbmdTY29wZVR5cGVFRW51bSwgUmVzU2hhcmluZ1Njb3BlVHlwZS5VTlNIQVJFQUJMRV9MSVRFUkFMKTsKKwkKKwkJCWluaXRFRW51bShtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bSwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLmNsYXNzLCAiTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChtZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGVFRW51bSwgTWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlLkNPTlNVTUVTX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKG1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZUVFbnVtLCBNZXNzYWdlRGVzdGluYXRpb25Vc2FnZVR5cGUuUFJPRFVDRVNfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwobWVzc2FnZURlc3RpbmF0aW9uVXNhZ2VUeXBlRUVudW0sIE1lc3NhZ2VEZXN0aW5hdGlvblVzYWdlVHlwZS5DT05TVU1FU19QUk9EVUNFU19MSVRFUkFMKTsKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiB9IC8vQ29tbW9uUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsLmphdmEKaW5kZXggMDBjOGQ3ZS4uOWM2MTNkNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJbXBsLmphdmEKQEAgLTEzNCw2ICsxMzQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUDsKIAl9CkBAIC00MzgsNiArNDM5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT046CkBAIC00NTcsNiArNDU5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5DT01QQVRJQklMSVRZX0RFU0NSSVBUSU9OX0dST1VQX19TTUFMTF9JQ09OOgpAQCAtNDgwLDYgKzQ4Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTjoKQEAgLTUwMyw2ICs1MDcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkNPTVBBVElCSUxJVFlfREVTQ1JJUFRJT05fR1JPVVBfX1NNQUxMX0lDT046CkBAIC01MjIsMTcgKzUyNywxOCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc21hbGxJY29uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzbWFsbEljb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoc21hbGxJY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYXJnZUljb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGxhcmdlSWNvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChsYXJnZUljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGlzcGxheU5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGRpc3BsYXlOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRpc3BsYXlOYW1lKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvbkdyb3VwQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIuamF2YQppbmRleCBkODdiMmQ3Li5lZDUzODIzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvbkdyb3VwQWRhcHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uR3JvdXBBZGFwdGVyLmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKIAkJCS8qIChub24tSmF2YWRvYykKIAkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQogCQkgKi8KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewogCQkJaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRpb25Hcm91cF9JY29ucygpIHx8CiAJCQkJCW1zZy5nZXRGZWF0dXJlKCkgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SWNvblR5cGVfTGFyZ2VJY29uKCkgfHwKQEAgLTExMiw2ICsxMTMsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjc2V0VGFyZ2V0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKIAkJaWYgKG5ld1RhcmdldCBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKQogCQkJc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvbkdyb3VwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25Hcm91cEltcGwuamF2YQppbmRleCA0Y2UyZTk5Li5kMThjODY3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvbkdyb3VwSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uR3JvdXBJbXBsLmphdmEKQEAgLTc2LDYgKzc2LDcgQEAKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPjwhLS0gZW5kLXVzZXItZG9jIC0tPkBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRJT05fR1JPVVA7CiAJfQpAQCAtMTE1LDYgKzExNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fSUNPTlM6CkBAIC0xMzIsNiArMTM0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUzoKQEAgLTE0OSw2ICsxNTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUzoKQEAgLTE3Miw2ICsxNzYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUzoKQEAgLTE5Miw2ICsxOTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX0dST1VQX19JQ09OUzoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25JbXBsLmphdmEKaW5kZXggNjAxMGE5ZC4uYmI0YzE2MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25JbXBsLmphdmEKQEAgLTg2LDYgKzg2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUSU9OOwogCX0KQEAgLTEzNyw2ICsxMzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fX0xBTkc6CkBAIC0xNTIsNiArMTU0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9fTEFORzoKQEAgLTE2OSw2ICsxNzIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HOgpAQCAtMTg2LDYgKzE5MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuREVTQ1JJUFRJT05fX0xBTkc6CkBAIC0yMDEsMTMgKzIwNiwxNCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobGFuZzogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAobGFuZzogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChsYW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodmFsdWUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rpc3BsYXlOYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVJbXBsLmphdmEKaW5kZXggNmMwZDAyMC4uNDIxNjEwYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVJbXBsLmphdmEKQEAgLTg2LDYgKzg2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkRJU1BMQVlfTkFNRTsKIAl9CkBAIC0xMzcsNiArMTM4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9fTEFORzoKQEAgLTE1Miw2ICsxNTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9fTEFORzoKQEAgLTE2OSw2ICsxNzIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9fTEFORzoKQEAgLTE4Niw2ICsxOTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9fTEFORzoKQEAgLTIwMSwxMyArMjA2LDE0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsYW5nOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChsYW5nOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGxhbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRUpCTG9jYWxSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FSkJMb2NhbFJlZkltcGwuamF2YQppbmRleCAyMjgxMzIwLi5hNGVkNjRlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FSkJMb2NhbFJlZkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FSkJMb2NhbFJlZkltcGwuamF2YQpAQCAtNzEsNiArNzEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuRUpCX0xPQ0FMX1JFRjsKIAl9CkBAIC0xMjIsNiArMTIzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMX0hPTUU6CkBAIC0xMzcsNiArMTM5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfTE9DQUxfUkVGX19MT0NBTF9IT01FOgpAQCAtMTU0LDYgKzE1Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRToKQEAgLTE3MSw2ICsxNzUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9MT0NBTF9SRUZfX0xPQ0FMX0hPTUU6CkBAIC0xODYsMTMgKzE5MSwxNCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobG9jYWxIb21lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChsb2NhbEhvbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobG9jYWxIb21lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2NhbDogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgbG9jYWw6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobG9jYWwpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKQEAgLTIwMSwxMiArMjA3LDE0IEBACiAvKioKICAqIFJldHVybiB0cnVlIGlmIHRoZSBlamJyZWYgaXMgZm9yIGEgbG9jYWwgZWpiIGludGVyZmFjZS4KICAqLworQE92ZXJyaWRlCiBwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCl7CiAJcmV0dXJuIHRydWU7CiB9CiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkVqYlJlZiNnZXRSZW1vdGUoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlKCkgewogCQlyZXR1cm4gZ2V0TG9jYWwoKTsgLy9mb3J3YXJkIHRvIHRoZSBsb2NhbAogCX0KQEAgLTIxNCw2ICsyMjIsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5FamJSZWYjc2V0UmVtb3RlKGphdmEubGFuZy5TdHJpbmcpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0UmVtb3RlKFN0cmluZyB2YWx1ZSkgewogCQlzZXRMb2NhbCh2YWx1ZSk7IC8vZm9yd2FyZCB0byB0aGUgbG9jYWwKIAl9CkBAIC0yMjEsMTIgKzIzMCwxNCBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5FamJSZWYjZ2V0SG9tZSgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRIb21lKCkgewogCQlyZXR1cm4gZ2V0TG9jYWxIb21lKCk7IC8vZm9yd2FyZCB0byB0aGUgbG9jYWwgaG9tZQogCX0KIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uRWpiUmVmI3NldEhvbWUoamF2YS5sYW5nLlN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRIb21lKFN0cmluZyB2YWx1ZSkgewogCQlzZXRMb2NhbEhvbWUodmFsdWUpOyAvL2ZvcndhcmQgdG8gdGhlIGxvY2FsIGhvbWUKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FamJSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FamJSZWZJbXBsLmphdmEKaW5kZXggYTZlNTlmMS4uZjNlYjk2MSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvRWpiUmVmSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VqYlJlZkltcGwuamF2YQpAQCAtMTQ3LDYgKzE0Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5FSkJfUkVGOwogCX0KQEAgLTM2Myw2ICszNjQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fREVTQ1JJUFRJT05TOgpAQCAtMzc2LDYgKzM3OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19OQU1FOgpAQCAtNDAxLDYgKzQwNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX1JFRl9fTkFNRToKQEAgLTQzNCw2ICs0MzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX05BTUU6CkBAIC00NjYsNiArNDcxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5FSkJfUkVGX19OQU1FOgpAQCAtNDg5LDIxICs0OTUsMjIgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsKLQkJaWYgKHR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBob21lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgaG9tZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChob21lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1vdGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJlbW90ZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChyZW1vdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbms6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGxpbms6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobGluayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9FbnZFbnRyeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VudkVudHJ5SW1wbC5qYXZhCmluZGV4IDQzMWY3M2QuLjZiN2EwYjYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VudkVudHJ5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0VudkVudHJ5SW1wbC5qYXZhCkBAIC0xMTcsNiArMTE3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkVOVl9FTlRSWTsKIAl9CkBAIC0yNDEsNiArMjQyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT05TOgpAQCAtMjU0LDYgKzI1Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OOgpAQCAtMjc1LDYgKzI3OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuRU5WX0VOVFJZX19ERVNDUklQVElPTjoKQEAgLTMwMiw2ICszMDYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkVOVl9FTlRSWV9fREVTQ1JJUFRJT046CkBAIC0zMjgsNiArMzMzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OOgpAQCAtMzQ3LDE4ICszNTMsMTkgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCWlmICh0eXBlRVNldCkgcmVzdWx0LmFwcGVuZCh0eXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9JY29uVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0ljb25UeXBlSW1wbC5qYXZhCmluZGV4IGFlNjQ2MWUuLmZkYzEwOGYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0ljb25UeXBlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0ljb25UeXBlSW1wbC5qYXZhCkBAIC0xMDcsNiArMTA3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLklDT05fVFlQRTsKIAl9CkBAIC0xNzksNiArMTgwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fU01BTExfSUNPTjoKQEAgLTE5Niw2ICsxOTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fU01BTExfSUNPTjoKQEAgLTIxNiw2ICsyMTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fU01BTExfSUNPTjoKQEAgLTIzNiw2ICsyNDAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fU01BTExfSUNPTjoKQEAgLTI1MywxNSArMjU4LDE2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzbWFsbEljb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHNtYWxsSWNvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChzbWFsbEljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhcmdlSWNvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgbGFyZ2VJY29uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGxhcmdlSWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFuZzogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgbGFuZzogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChsYW5nKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9JZGVudGl0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0lkZW50aXR5SW1wbC5qYXZhCmluZGV4IDhjYzllYmQuLjRlOGZiYjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0lkZW50aXR5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0lkZW50aXR5SW1wbC5qYXZhCkBAIC04MCw2ICs4MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5JREVOVElUWTsKIAl9CkBAIC0xNDEsNiArMTQyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTlM6CkBAIC0xNTQsNiArMTU2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTjoKQEAgLTE3MSw2ICsxNzQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTjoKQEAgLTE5Miw2ICsxOTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTjoKQEAgLTIxMiw2ICsyMTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLklERU5USVRZX19ERVNDUklQVElPTjoKQEAgLTIyNywxMyArMjMzLDE0IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm9sZU5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJvbGVOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHJvbGVOYW1lKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFRUF0dHJpYnV0ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVFQXR0cmlidXRlSW1wbC5qYXZhCmluZGV4IDViOTEzMzcuLmI4MjBhMmMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVFQXR0cmlidXRlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVFQXR0cmlidXRlSW1wbC5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5KMkVFRV9BVFRSSUJVVEU7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRUVPYmplY3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFRU9iamVjdEltcGwuamF2YQppbmRleCA3ZTI5NDdlLi4yNGQ2NTVkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFRU9iamVjdEltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFRU9iamVjdEltcGwuamF2YQpAQCAtMzksNiArMzksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuSjJFRUVfT0JKRUNUOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0oyRUVSZXNvdXJjZUZhY3RvcnlEb21SZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291cmNlRmFjdG9yeURvbVJlZ2lzdHJ5LmphdmEKaW5kZXggOGViNTkxNS4uMTE4ZTQ0MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291cmNlRmFjdG9yeURvbVJlZ2lzdHJ5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291cmNlRmFjdG9yeURvbVJlZ2lzdHJ5LmphdmEKQEAgLTEwLDkgKzEwLDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIENyZWF0ZWQgb24gTWF5IDIwLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsOwogCkBAIC0zMiw5ICsyOSw2IEBACiAKIC8qKgogICogQGF1dGhvciBtZGVsZGVyCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCiAgKi8KIHB1YmxpYyBjbGFzcyBKMkVFUmVzb3VyY2VGYWN0b3J5RG9tUmVnaXN0cnkKICAgICAgICAgZXh0ZW5kcyBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQppbmRleCAzMjI5YWJhLi4zYWUxOTcxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuamF2YQpAQCAtMTEsNiArMTEsMTQgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJKYXJSZXNvdXJjZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVYTUlSZXNvdXJjZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuV2ViQXBwUmVzb3VyY2VGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwud3NkZC5Xc2RkUmVzb3VyY2VGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5GaWxlTmFtZVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwogCiAKQEAgLTE4LDEwICsyNiwyNSBAQAogCQogCXB1YmxpYyBzdGF0aWMgSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwogCisJc3RhdGljIHsKKwkJRUpCSmFyUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7CisJCVdlYkFwcFJlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOworCQlBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOworCQlBcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOworCQlDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKKwkJV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKKwkJV3NkZFJlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOworCQkvL3JlZ2lzdGVyKCkgaXMgbm90IGNhbGxlZCBvbiB0aGUgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5IGJlY2F1c2UKKwkJLy90aGUgamF4cHJjLW1hcHBpbmcgZGVzY3JpcHRvciBkb2VzIG5vdCBoYXZlIGEgc3RhbmRhcmQgc2hvcnQgbmFtZS4KKwkJLy9UaGUgc2hvcnQgbmFtZXMgaGF2ZSB0byBiZSByZWdpc3RlcmVkIG9uY2UgdGhleSBhcmUga25vd24uCisJCUoyRUVYTUlSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKKwl9CisJCiAJcHVibGljIEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpIHsKIAkJc3VwZXIoKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlLkZhY3RvcnkgZGVsZWdhdGVkR2V0RmFjdG9yeShVUkkgdXJpKSB7CiAJCWlmIChKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UgPT0gdGhpcykKIAkJCXJldHVybiBzdXBlci5kZWxlZ2F0ZWRHZXRGYWN0b3J5KHVyaSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KTkRJRW52UmVmc0dyb3VwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvSk5ESUVudlJlZnNHcm91cEltcGwuamF2YQppbmRleCA1NDliOGViLi41NDdkZTc4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9KTkRJRW52UmVmc0dyb3VwSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0pORElFbnZSZWZzR3JvdXBJbXBsLmphdmEKQEAgLTEzMyw2ICsxMzMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuSk5ESV9FTlZfUkVGU19HUk9VUDsKIAl9CkBAIC0yMjYsNiArMjI3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VOVklST05NRU5UX1BST1BFUlRJRVM6CkBAIC0yNTEsNiArMjUzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VOVklST05NRU5UX1BST1BFUlRJRVM6CkBAIC0yNzYsNiArMjc5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5KTkRJX0VOVl9SRUZTX0dST1VQX19FTlZJUk9OTUVOVF9QUk9QRVJUSUVTOgpAQCAtMzE1LDYgKzMxOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUzoKQEAgLTM0Nyw2ICszNTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkpORElfRU5WX1JFRlNfR1JPVVBfX0VOVklST05NRU5UX1BST1BFUlRJRVM6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9MaXN0ZW5lckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0xpc3RlbmVySW1wbC5qYXZhCmluZGV4IGFmOGJhOTEuLmRlMWIwNTAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0xpc3RlbmVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL0xpc3RlbmVySW1wbC5qYXZhCkBAIC00Myw2ICs0Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5MSVNURU5FUjsKIAl9CkBAIC04Nyw2ICs4OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1M6CkBAIC0xMDEsNiArMTAzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1M6CkBAIC0xMTUsNiArMTE4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1M6CkBAIC0xMjksNiArMTMzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5MSVNURU5FUl9fTElTVEVORVJfQ0xBU1M6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9NZXNzYWdlRGVzdGluYXRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9NZXNzYWdlRGVzdGluYXRpb25JbXBsLmphdmEKaW5kZXggODhiZGMzZC4uMGVmYmRjNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvbkltcGwuamF2YQpAQCAtNjUsNiArNjUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuTUVTU0FHRV9ERVNUSU5BVElPTjsKIAl9CkBAIC05NSw2ICs5Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FOgpAQCAtMTA4LDYgKzExMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9fTkFNRToKQEAgLTEyMiw2ICsxMjUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fX05BTUU6CkBAIC0xMzYsNiArMTQwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FOgpAQCAtMTQ5LDExICsxNTQsMTIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvTWVzc2FnZURlc3RpbmF0aW9uUmVmSW1wbC5qYXZhCmluZGV4IDg1ZGFlZDQuLjg0YjI4NjEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEZXN0aW5hdGlvblJlZkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9NZXNzYWdlRGVzdGluYXRpb25SZWZJbXBsLmphdmEKQEAgLTE1NCw2ICsxNTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUY7CiAJfQpAQCAtMjc4LDYgKzI3OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fREVTQ1JJUFRJT05TOgpAQCAtMjkxLDYgKzI5Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTkFNRToKQEAgLTMxMiw2ICszMTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLk1FU1NBR0VfREVTVElOQVRJT05fUkVGX19OQU1FOgpAQCAtMzM5LDYgKzM0Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuTUVTU0FHRV9ERVNUSU5BVElPTl9SRUZfX05BTUU6CkBAIC0zNjUsNiArMzcwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTkFNRToKQEAgLTM4NiwxNyArMzkyLDE4IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXNhZ2U6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHVzYWdlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHVzYWdlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGxpbmspOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1BhcmFtVmFsdWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9QYXJhbVZhbHVlSW1wbC5qYXZhCmluZGV4IDVmNDIyN2YuLjA5YmVkYWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1BhcmFtVmFsdWVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUGFyYW1WYWx1ZUltcGwuamF2YQpAQCAtMTI2LDYgKzEyNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5QQVJBTV9WQUxVRTsKIAl9CkBAIC0yMTAsNiArMjExLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19ERVNDUklQVElPTlM6CkBAIC0yMjMsNiArMjI1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19OQU1FOgpAQCAtMjQyLDYgKzI0NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuUEFSQU1fVkFMVUVfX05BTUU6CkBAIC0yNjYsNiArMjcwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fTkFNRToKQEAgLTI4OSw2ICsyOTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlBBUkFNX1ZBTFVFX19OQU1FOgpAQCAtMzA4LDE1ICszMTQsMTYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1FOYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUU5hbWVJbXBsLmphdmEKaW5kZXggOGY1ZTk0OC4uYmFjZjQ5NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUU5hbWVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUU5hbWVJbXBsLmphdmEKQEAgLTEzMSw2ICsxMzEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuUU5BTUU7CiAJfQpAQCAtMjk0LDYgKzI5NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSToKQEAgLTMxMyw2ICszMTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOgpAQCAtMzM2LDYgKzMzOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuUU5BTUVfX05BTUVTUEFDRV9VUkk6CkBAIC0zNTksNiArMzYzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5RTkFNRV9fTkFNRVNQQUNFX1VSSToKQEAgLTM3OCw2ICszODMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIGVJc1NldCBmb3IgbmFtZXNwYWNlIHVyaSBtdXN0IGJlIGRlcml2ZWQgaWYgbnVsbCBzbyBuYW1lc3BhY2VVUkkgISA9IG51bGwgYW5kIGludGVybmFsUHJlZml4T3JOc1VSSSAhPSBudWxsIG11c3QgYm90aCBiZSBjaGVjay4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7CiAJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJOgpAQCAtMzk3LDE3ICs0MDMsMTggQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWVzcGFjZVVSSTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAobmFtZXNwYWNlVVJJOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG5hbWVzcGFjZVVSSSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbG9jYWxQYXJ0OiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBsb2NhbFBhcnQ6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobG9jYWxQYXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb21iaW5lZFFOYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjb21iaW5lZFFOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGNvbWJpbmVkUU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGludGVybmFsUHJlZml4T3JOc1VSSTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgaW50ZXJuYWxQcmVmaXhPck5zVVJJOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGludGVybmFsUHJlZml4T3JOc1VSSSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUmVzb3VyY2VFbnZSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUVudlJlZkltcGwuamF2YQppbmRleCBhYzJiNzJlLi44OTEwNWU5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUVudlJlZkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUVudlJlZkltcGwuamF2YQpAQCAtOTIsNiArOTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuUkVTT1VSQ0VfRU5WX1JFRjsKIAl9CkBAIC0yMDUsNiArMjA2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OUzoKQEAgLTIxOCw2ICsyMjAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT046CkBAIC0yMzgsNiArMjQxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9FTlZfUkVGX19ERVNDUklQVElPTjoKQEAgLTI2Miw2ICsyNjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX0VOVl9SRUZfX0RFU0NSSVBUSU9OOgpAQCAtMjg1LDYgKzI5MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT046CkBAIC0zMDIsMTMgKzMwOCwxNCBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUmVzb3VyY2VSZWZJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVJlZkltcGwuamF2YQppbmRleCBkZGY3ZTljLi42NGVmNWQzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVJlZkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SZXNvdXJjZVJlZkltcGwuamF2YQpAQCAtMTYxLDYgKzE2MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5SRVNPVVJDRV9SRUY7CiAJfQpAQCAtMzU0LDYgKzM1NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OUzoKQEAgLTM2Nyw2ICszNjksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTjoKQEAgLTM5Miw2ICszOTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlJFU09VUkNFX1JFRl9fREVTQ1JJUFRJT046CkBAIC00MjUsNiArNDI5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5SRVNPVVJDRV9SRUZfX0RFU0NSSVBUSU9OOgpAQCAtNDU3LDYgKzQ2Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTjoKQEAgLTQ4MCwyMiArNDg2LDIzIEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGg6ICIpOwotCQlpZiAoYXV0aEVTZXQpIHJlc3VsdC5hcHBlbmQoYXV0aCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbms6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGg6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChhdXRoRVNldCkgcmVzdWx0LmFwcGVuZChhdXRoKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc1NoYXJpbmdTY29wZTogIik7Ci0JCWlmIChyZXNTaGFyaW5nU2NvcGVFU2V0KSByZXN1bHQuYXBwZW5kKHJlc1NoYXJpbmdTY29wZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJlc1NoYXJpbmdTY29wZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHJlc1NoYXJpbmdTY29wZUVTZXQpIHJlc3VsdC5hcHBlbmQocmVzU2hhcmluZ1Njb3BlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUnVuQXNTcGVjaWZpZWRJZGVudGl0eUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHlJbXBsLmphdmEKaW5kZXggZjJmMzBjNS4uYTUyNWYyZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvUnVuQXNTcGVjaWZpZWRJZGVudGl0eUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9SdW5Bc1NwZWNpZmllZElkZW50aXR5SW1wbC5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZOwogCX0KQEAgLTkwLDYgKzkxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZOgpAQCAtMTAzLDYgKzEwNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWToKQEAgLTExNiw2ICsxMTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZOgpAQCAtMTMwLDYgKzEzNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuUlVOX0FTX1NQRUNJRklFRF9JREVOVElUWV9fSURFTlRJVFk6CkBAIC0xNDQsNiArMTQ5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5SVU5fQVNfU1BFQ0lGSUVEX0lERU5USVRZX19JREVOVElUWToKQEAgLTE1NSw2ICsxNjEsNyBAQAogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHkjaXNSdW5Bc1NwZWNpZmllZElkZW50aXR5KCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc1J1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Q29uc3RyYWludEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Q29uc3RyYWludEFkYXB0ZXIuamF2YQppbmRleCBiZjY2OGY3Li45MDk2OTRlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eUNvbnN0cmFpbnRBZGFwdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlDb25zdHJhaW50QWRhcHRlci5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiAJCQkvKiAobm9uLUphdmFkb2MpCiAJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKIAkJICovCisJCUBPdmVycmlkZQogCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKIAkJCWlmIChtc2cuZ2V0RmVhdHVyZSgpID09IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lcygpKSB7CiAJCQkJCXN5bmNoRGlzcGxheU5hbWUoKTsKQEAgLTU0LDYgKzU1LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI3NldFRhcmdldChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcikKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7CiAJCWlmIChuZXdUYXJnZXQgaW5zdGFuY2VvZiBTZWN1cml0eUNvbnN0cmFpbnQpCiAJCQlzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5SWRlbnRpdHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eUlkZW50aXR5SW1wbC5qYXZhCmluZGV4IGFkNTM2NTkuLmY5ZTUwNDggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5SWRlbnRpdHlJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlJZGVudGl0eUltcGwuamF2YQpAQCAtNjcsNiArNjcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuU0VDVVJJVFlfSURFTlRJVFk7CiAJfQpAQCAtNzQsMTQgKzc1LDQ3IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gCiAJICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uR2VuKCkgewogCQlyZXR1cm4gZGVzY3JpcHRpb247CiAJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCWlmICghZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7CisJCQlEZXNjcmlwdGlvbiBkID0gKERlc2NyaXB0aW9uKSBnZXREZXNjcmlwdGlvbnMoKS5nZXQoMCk7CisJCQlpZiAoZCAhPSBudWxsKQorCQkJCWRlc2NyaXB0aW9uID0gZC5nZXRWYWx1ZSgpOworCQl9CisJCXJldHVybiBnZXREZXNjcmlwdGlvbkdlbigpOworCX0KIAorCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgeworCQlTdHJpbmcgZGVzY3JpcHRpb25WYWx1ZSA9IG5ld0Rlc2NyaXB0aW9uOworCQlpZiAoZ2V0RGVzY3JpcHRpb25zKCkgIT0gbnVsbCkgeworCQkJaWYobmV3RGVzY3JpcHRpb24gPT0gbnVsbCB8fCBuZXdEZXNjcmlwdGlvbi5sZW5ndGgoKSA8IDEpIHsKKwkJCQlpZighZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7CisJCQkJCWdldERlc2NyaXB0aW9ucygpLnJlbW92ZSgwKTsKKwkJCQkJaWYoIWdldERlc2NyaXB0aW9ucygpLmlzRW1wdHkoKSkgeworCQkJCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOworCQkJCQkJZGVzY3JpcHRpb25WYWx1ZSA9IGQuZ2V0VmFsdWUoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoZ2V0RGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB7CisJCQkJRGVzY3JpcHRpb24gZCA9IG5ldyBEZXNjcmlwdGlvbkltcGwoKTsKKwkJCQlkLnNldFZhbHVlKGRlc2NyaXB0aW9uVmFsdWUpOworCQkJCWdldERlc2NyaXB0aW9ucygpLmFkZChkKTsKKwkJCX0gZWxzZSB7CisJCQkJRGVzY3JpcHRpb24gZCA9IChEZXNjcmlwdGlvbikgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KDApOworCQkJCWlmIChkICE9IG51bGwpCisJCQkJCWQuc2V0VmFsdWUoZGVzY3JpcHRpb25WYWx1ZSk7CisJCQl9CisJCX0KKwkJc2V0RGVzY3JpcHRpb25HZW4oZGVzY3JpcHRpb25WYWx1ZSk7CisJfQorCQogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgeworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uR2VuKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewogCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKIAkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKIAkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQpAQCAtMTA1LDYgKzEzOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT05TOgpAQCAtMTE4LDYgKzE1Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT046CkBAIC0xMzMsNiArMTY5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT046CkBAIC0xNTEsNiArMTg4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT046CkBAIC0xNjgsNiArMjA2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9JREVOVElUWV9fREVTQ1JJUFRJT046CkBAIC0xODEsMTEgKzIyMCwxMiBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZUltcGwuamF2YQppbmRleCAzMThhYTg4Li5hNjkxMzJlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eVJvbGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlSW1wbC5qYXZhCkBAIC04MiwxMCArODIsMTIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLlNFQ1VSSVRZX1JPTEU7CiAJfQogCitAT3ZlcnJpZGUKIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCWlmIChpbkVjbGlwc2UpCiAJCXJldHVybiBzdXBlci5lcXVhbHMobyk7CkBAIC0xMDIsMTEgKzEwNCwxMyBAQAogCX0KIAlyZXR1cm4gZmFsc2U7CiB9CitAT3ZlcnJpZGUKIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJaWYgKGluRWNsaXBzZSB8fCBnZXRSb2xlTmFtZSgpID09IG51bGwpCiAJCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwogCXJldHVybiBnZXRSb2xlTmFtZSgpLmhhc2hDb2RlKCk7CiB9CitAT3ZlcnJpZGUKIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJU3RyaW5nIG5hbWUgPSBnZXRSb2xlTmFtZSgpID09IG51bGwgPyAiPHVua25vd24+IiA6IGdldFJvbGVOYW1lKCk7IC8vJE5PTi1OTFMtMSQKIAlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKCIgKyBuYW1lICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKQEAgLTE4OCw2ICsxOTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT05TOgpAQCAtMjAxLDYgKzIwNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTjoKQEAgLTIxOCw2ICsyMjQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfX0RFU0NSSVBUSU9OOgpAQCAtMjM5LDYgKzI0Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9fREVTQ1JJUFRJT046CkBAIC0yNTksNiArMjY3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTjoKQEAgLTI3OCw5ICsyODcsOSBAQAogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByb2xlTmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgcm9sZU5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQocm9sZU5hbWUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Um9sZVJlZkltcGwuamF2YQppbmRleCAyMGJmZDBkLi5iNTNiYWZiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eVJvbGVSZWZJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvU2VjdXJpdHlSb2xlUmVmSW1wbC5qYXZhCkBAIC05Myw2ICs5Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5MaXRlcmFscy5TRUNVUklUWV9ST0xFX1JFRjsKIAl9CkBAIC0xNzAsNiArMTcxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19ERVNDUklQVElPTlM6CkBAIC0xODMsNiArMTg1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19OQU1FOgpAQCAtMjAyLDYgKzIwNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfUk9MRV9SRUZfX05BTUU6CkBAIC0yMjYsNiArMjMwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX1JFRl9fTkFNRToKQEAgLTI0OSw2ICsyNTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19OQU1FOgpAQCAtMjY2LDE1ICsyNzIsMTYgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbms6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGxpbms6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobGluayk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvVXNlQ2FsbGVySWRlbnRpdHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Vc2VDYWxsZXJJZGVudGl0eUltcGwuamF2YQppbmRleCA2OTQ0NDM0Li5iY2Q4OTUwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Vc2VDYWxsZXJJZGVudGl0eUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9Vc2VDYWxsZXJJZGVudGl0eUltcGwuamF2YQpAQCAtMjksNiArMjksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIENvbW1vblBhY2thZ2UuTGl0ZXJhbHMuVVNFX0NBTExFUl9JREVOVElUWTsKIAl9CkBAIC0zNiw2ICszNyw3IEBACiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uU2VjdXJpdHlJZGVudGl0eSNpc1VzZUNhbGxlcklkZW50aXR5KCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc1VzZUNhbGxlcklkZW50aXR5KCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9YTUxSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlRmFjdG9yeS5qYXZhCmluZGV4IDMyOWI3YWYuLjMyNGM2NjIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9pbXBsL1hNTFJlc291cmNlRmFjdG9yeS5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiAvKioKICAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlRmFjdG9yeUltcGwjY3JlYXRlUmVzb3VyY2UoVVJJKQogICovCitAT3ZlcnJpZGUKIHB1YmxpYyBmaW5hbCBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7CiAJWE1MUmVzb3VyY2UgcmVzb3VyY2UgPSBwcmltQ3JlYXRlUmVzb3VyY2UodXJpKTsKIAlyZXNvdXJjZS5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL2ltcGwvWE1MUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9YTUxSZXNvdXJjZUltcGwuamF2YQppbmRleCA1NjJkYjQxLi45ZjJhMjA0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9YTUxSZXNvdXJjZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvaW1wbC9YTUxSZXNvdXJjZUltcGwuamF2YQpAQCAtNDgsMTAgKzQ4LDEwIEBACiAJCiAJCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm9vdFZlcnNpb25BZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEFEQVBURVJfVFlQRSA9IFJvb3RWZXJzaW9uQWRhcHRlci5jbGFzcy5nZXROYW1lKCk7CiAJCS8qIChub24tSmF2YWRvYykKIAkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKIAkJICovCisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7CiAJCQlyZXR1cm4gc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKTsKIAkJfQpAQCAtNTksNiArNTksNyBAQAogCQkvKiAobm9uLUphdmFkb2MpCiAJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKIAkJICovCisJCUBPdmVycmlkZQogCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKIAkJCWlmIChtc2cuZ2V0RmVhdHVyZUlEKG51bGwpID09IFJFU09VUkNFX19DT05URU5UUyAmJgogCQkJCW1zZy5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uQUREKSB7CkBAIC05OSw2ICsxMDAsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2luaXRpYWxpemVDb250ZW50cygpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnRlbnRzKCkgewogCQlzdXBlci5pbml0aWFsaXplQ29udGVudHMoKTsKIAkJZUFkYXB0ZXJzKCkuYWRkKG5ldyBSb290VmVyc2lvbkFkYXB0ZXIoKSk7CkBAIC0xMjYsNiArMTI4LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlSW1wbCNnZXREZWZhdWx0VmVyc2lvbklEKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRWZXJzaW9uSUQoKSB7CiAJCXJldHVybiBKMkVFXzFfNF9JRDsKIAl9CkBAIC0xMzQsNiArMTM3LDcgQEAKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI3NldERvY3R5cGVWYWx1ZXMoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKIAkgKiBUaGlzIGlzIHNldHRpbmcgdGhlIG1vZHVsZSB2ZXJzaW9uIG9uIHRoZSByZXNvdXJjZSwgd2hlcmUgdmFsdWVzIGFyZSBkaWZmZXJlbnQgdGhhdCB0aGUgSjJFRSB2ZXJzaW9uLCB0aGlzIHdpbGwgYmUgb3ZlcnJpZGRlbgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKIAkJaW50IHZlcnNpb24gPSBKMkVFXzFfNF9JRDsKIAkJaWYgKHN5c3RlbUlkID09IG51bGwpIApAQCAtMTQzLDEzICsxNDcsMTYgQEAKIAkJZWxzZSBpZiAoc3lzdGVtSWQuZXF1YWxzKGdldEoyRUVfMV8yX1N5c3RlbUlEKCkpIHx8IHN5c3RlbUlkLmVxdWFscyhnZXRKMkVFX0FsdF8xXzJfU3lzdGVtSUQoKSkpCiAJCQl2ZXJzaW9uID0gSjJFRV8xXzJfSUQ7CiAJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJc2V0SjJFRVZlcnNpb25JRCh2ZXJzaW9uKTsKKwkJLy9Pbmx5IHNldCBpZiB2ZXJzaW9uSUQgbm90IHNldCBpZiB2ZXJzaW9uIGlzIDE0CisJCWlmICgodmVyc2lvbiAhPSBKMkVFXzFfNF9JRCkgfHwgKHZlcnNpb24gPT0gSjJFRV8xXzRfSUQgJiYgZ2V0TW9kdWxlVmVyc2lvbklEKCkgPT0gMCkpCisJCQlzZXRKMkVFVmVyc2lvbklEKHZlcnNpb24pOwogCX0KIAogCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2UjdXNlc0RURCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gdXNlc0RURCgpIHsKIAkJcmV0dXJuIChnZXRWZXJzaW9uSUQoKSA9PSBKMkVFXzFfMl9JRCkgfHwgKGdldFZlcnNpb25JRCgpID09IEoyRUVfMV8zX0lEKTsKIAl9CkBAIC0xNTgsNiArMTY1LDcgQEAKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuVHJhbnNsYXRvclJlc291cmNlI3NldFZlcnNpb25JRChpbnQpCiAJICogQGRlcHJlY2F0ZWQsIFVzZSBzZXRKMkVFVmVyc2lvbklEKCkgdG8gc2V0IG1vZHVsZSB2ZXJzaW9uIGJhc2VkIG9uIGoyZWUgdmVyc2lvbgogCSAqKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uSUQoaW50IGlkKSB7CiAJCXNldEoyRUVWZXJzaW9uSUQoaWQpOwogCX0KQEAgLTIwMyw2ICsyMTEsNyBAQAogCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBpZCkgewogCQlzZXREb2N0eXBlVmFsdWVzKGdldFB1YmxpY0lkKCksIGlkKTsKIAl9CisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0UHVibGljSWQoKSB7CiAJCXN3aXRjaCAoZ2V0VmVyc2lvbklEKCkpIHsKIAkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6CkBAIC0yMTQsNiArMjIzLDcgQEAKIAkJfQkKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTeXN0ZW1JZCgpIHsKIAkJc3dpdGNoIChnZXRWZXJzaW9uSUQoKSkgewogCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKQEAgLTI1MCw2ICsyNjAsNyBAQAogCX0KIAkKIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXNvdXJjZVNldChSZXNvdXJjZVNldCBhUmVzb3VyY2VTZXQsIE5vdGlmaWNhdGlvbkNoYWluIG5vdGlmaWNhdGlvbnMpIHsKIAkJaWYgKGFSZXNvdXJjZVNldCA9PSBudWxsICYmIHRoaXMucmVzb3VyY2VTZXQgIT0gbnVsbCkKIAkJCXByZURlbGV0ZSgpOwpAQCAtMjYzLDEwICsyNzQsMTIgQEAKIAkvKioKIAkgKiBAZGVwcmVjYXRlZCAtIHVzZSBnZXRKMkVFVmVyc2lvbklEKCkgYW5kIGdldE1vZHVsZVZlcnNpb25JRCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB7CiAJCXJldHVybiBnZXRKMkVFVmVyc2lvbklEKCk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKIAkJcmV0dXJuIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5JTlNUQU5DRTsKIAl9CQpAQCAtMjkwLDYgKzMwMyw3IEBACiAJCXJldHVybiBuZXcgQmlnRGVjaW1hbChTdHJpbmcudmFsdWVPZih2ZXIpKS5tb3ZlUG9pbnRMZWZ0KDEpLnRvU3RyaW5nKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbG9hZEV4aXN0aW5nKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlib29sZWFuIGxvY2FsTmVlZHNTeW5jID0gZmFsc2U7CiAJCXN5bmNocm9uaXplZCAobmVlZHNTeW5jKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9Db21tb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvQ29tbW9uQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCAxMTk2NWNiLi5jNWQ0N2NmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9Db21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTU4LDYgKzU4LDcgQEAKIAkJCW1vZGVsUGFja2FnZSA9IChDb21tb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSk7CiAJCX0KIAl9CisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewogCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKIAkJCXJldHVybiB0cnVlOwpAQCAtNjgsNiArNjksNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKIAkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CiAJfQpAQCAtMTQxLDkzICsxNDMsMTIzIEBACiAJICovCiAJcHJvdGVjdGVkIENvbW1vblN3aXRjaCBtb2RlbFN3aXRjaCA9CiAJCW5ldyBDb21tb25Td2l0Y2goKSB7CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUVqYlJlZihFamJSZWYgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVqYlJlZkFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRW52RW50cnkoRW52RW50cnkgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVudkVudHJ5QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZVJlZihSZXNvdXJjZVJlZiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VSZWZBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVNlY3VyaXR5Um9sZVJlZihTZWN1cml0eVJvbGVSZWYgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5Um9sZVJlZkFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlSb2xlKFNlY3VyaXR5Um9sZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlSb2xlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZUVudlJlZihSZXNvdXJjZUVudlJlZiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VFbnZSZWZBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQkxvY2FsUmVmKEVKQkxvY2FsUmVmIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFSkJMb2NhbFJlZkFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlUnVuQXNTcGVjaWZpZWRJZGVudGl0eShSdW5Bc1NwZWNpZmllZElkZW50aXR5IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VJZGVudGl0eShJZGVudGl0eSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSWRlbnRpdHlBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUljb25UeXBlKEljb25UeXBlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVJY29uVHlwZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRGlzcGxheU5hbWUoRGlzcGxheU5hbWUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZURpc3BsYXlOYW1lQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRGVzdGluYXRpb25SZWYoTWVzc2FnZURlc3RpbmF0aW9uUmVmIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWZBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEZXN0aW5hdGlvbihNZXNzYWdlRGVzdGluYXRpb24gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbkFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlUGFyYW1WYWx1ZShQYXJhbVZhbHVlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVQYXJhbVZhbHVlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUpORElFbnZSZWZzR3JvdXAoSk5ESUVudlJlZnNHcm91cCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSk5ESUVudlJlZnNHcm91cEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlJZGVudGl0eShTZWN1cml0eUlkZW50aXR5IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVTZWN1cml0eUlkZW50aXR5QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VVc2VDYWxsZXJJZGVudGl0eShVc2VDYWxsZXJJZGVudGl0eSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHlBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uKERlc2NyaXB0aW9uIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlUU5hbWUoUU5hbWUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVFOYW1lQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VMaXN0ZW5lcihMaXN0ZW5lciBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTGlzdGVuZXJBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRUF0dHJpYnV0ZShKMkVFRUF0dHJpYnV0ZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSjJFRUVBdHRyaWJ1dGVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUVNb2RlbEVsZW1lbnQoRU1vZGVsRWxlbWVudCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRU1vZGVsRWxlbWVudEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRU5hbWVkRWxlbWVudChFTmFtZWRFbGVtZW50IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VFVHlwZWRFbGVtZW50KEVUeXBlZEVsZW1lbnQgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUVTdHJ1Y3R1cmFsRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRUF0dHJpYnV0ZShFQXR0cmlidXRlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFQXR0cmlidXRlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CiAJCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9EZWZhdWx0ZWRBZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvRGVmYXVsdGVkQWRhcHRlckltcGwuamF2YQppbmRleCA0MDU0MDkxLi43YTk3MWZlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9EZWZhdWx0ZWRBZGFwdGVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL0RlZmF1bHRlZEFkYXB0ZXJJbXBsLmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIAlzdXBlcigpOwogfQogcHVibGljIGFic3RyYWN0IEVPYmplY3QgZGVmYXVsdENvbnRhaW5lcigpOworQE92ZXJyaWRlCiBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7CiAJcmV0dXJuIEFEQVBURVJfS0VZLmVxdWFscyh0eXBlKTsKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL1htbFNwZWNpZmllZERhdGFBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvdXRpbC9YbWxTcGVjaWZpZWREYXRhQWRhcHRlci5qYXZhCmluZGV4IDY3ZDE5MzQuLjEzYjZkZmIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC91dGlsL1htbFNwZWNpZmllZERhdGFBZGFwdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3V0aWwvWG1sU3BlY2lmaWVkRGF0YUFkYXB0ZXIuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogcHVibGljIFhtbFNwZWNpZmllZERhdGFBZGFwdGVyKCkgewogCXN1cGVyKCk7CiB9CitAT3ZlcnJpZGUKIHB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKIAlyZXR1cm4gQURBUFRFUl9LRVkuZXF1YWxzKHR5cGUpOwogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0Rlc3RpbmF0aW9uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL0Rlc3RpbmF0aW9uVHlwZS5qYXZhCmluZGV4IDlhYmIzOWYuLjRmOTE3YTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9EZXN0aW5hdGlvblR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvRGVzdGluYXRpb25UeXBlLmphdmEKQEAgLTQ4LDcgKzQ4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlc3RpbmF0aW9uVHlwZSBRVUVVRV9MSVRFUkFMID0gbmV3IERlc3RpbmF0aW9uVHlwZShRVUVVRSwgIlF1ZXVlIiwgIlF1ZXVlIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIERlc3RpbmF0aW9uVHlwZSBRVUVVRV9MSVRFUkFMID0gbmV3IERlc3RpbmF0aW9uVHlwZShRVUVVRSwgIlF1ZXVlIiwgIlF1ZXVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+VG9waWM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtNjIsNyArNjIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVzdGluYXRpb25UeXBlIFRPUElDX0xJVEVSQUwgPSBuZXcgRGVzdGluYXRpb25UeXBlKFRPUElDLCAiVG9waWMiLCAiVG9waWMiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVzdGluYXRpb25UeXBlIFRPUElDX0xJVEVSQUwgPSBuZXcgRGVzdGluYXRpb25UeXBlKFRPUElDLCAiVG9waWMiLCAiVG9waWMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RGVzdGluYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTWV0aG9kRWxlbWVudEtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXRob2RFbGVtZW50S2luZC5qYXZhCmluZGV4IDNlMGQyZDMuLmYyN2NhMTIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXRob2RFbGVtZW50S2luZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NZXRob2RFbGVtZW50S2luZC5qYXZhCkBAIC03MCw3ICs3MCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RFbGVtZW50S2luZCBVTlNQRUNJRklFRF9MSVRFUkFMID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kKFVOU1BFQ0lGSUVELCAiVW5zcGVjaWZpZWQiLCAiVW5zcGVjaWZpZWQiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmQgVU5TUEVDSUZJRURfTElURVJBTCA9IG5ldyBNZXRob2RFbGVtZW50S2luZChVTlNQRUNJRklFRCwgIlVuc3BlY2lmaWVkIiwgIlVuc3BlY2lmaWVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTg0LDcgKzg0LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZEVsZW1lbnRLaW5kIFJFTU9URV9MSVRFUkFMID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kKFJFTU9URSwgIlJlbW90ZSIsICJSZW1vdGUiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmQgUkVNT1RFX0xJVEVSQUwgPSBuZXcgTWV0aG9kRWxlbWVudEtpbmQoUkVNT1RFLCAiUmVtb3RlIiwgIlJlbW90ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPkhvbWU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtOTgsNyArOTgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmQgSE9NRV9MSVRFUkFMID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kKEhPTUUsICJIb21lIiwgIkhvbWUiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmQgSE9NRV9MSVRFUkFMID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kKEhPTUUsICJIb21lIiwgIkhvbWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5Mb2NhbDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC0xMTIsNyArMTEyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZEVsZW1lbnRLaW5kIExPQ0FMX0xJVEVSQUwgPSBuZXcgTWV0aG9kRWxlbWVudEtpbmQoTE9DQUwsICJMb2NhbCIsICJMb2NhbCIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RFbGVtZW50S2luZCBMT0NBTF9MSVRFUkFMID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kKExPQ0FMLCAiTG9jYWwiLCAiTG9jYWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBIb21lPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTEyNiw3ICsxMjYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmQgTE9DQUxfSE9NRV9MSVRFUkFMID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kKExPQ0FMX0hPTUUsICJMb2NhbEhvbWUiLCAiTG9jYWxIb21lIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZEVsZW1lbnRLaW5kIExPQ0FMX0hPTUVfTElURVJBTCA9IG5ldyBNZXRob2RFbGVtZW50S2luZChMT0NBTF9IT01FLCAiTG9jYWxIb21lIiwgIkxvY2FsSG9tZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPlNlcnZpY2UgRW5kcG9pbnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtMTQwLDcgKzE0MCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXRob2RFbGVtZW50S2luZCBTRVJWSUNFX0VORFBPSU5UX0xJVEVSQUwgPSBuZXcgTWV0aG9kRWxlbWVudEtpbmQoU0VSVklDRV9FTkRQT0lOVCwgIlNlcnZpY2VFbmRwb2ludCIsICJTZXJ2aWNlRW5kcG9pbnQiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kRWxlbWVudEtpbmQgU0VSVklDRV9FTkRQT0lOVF9MSVRFUkFMID0gbmV3IE1ldGhvZEVsZW1lbnRLaW5kKFNFUlZJQ0VfRU5EUE9JTlQsICJTZXJ2aWNlRW5kcG9pbnQiLCAiU2VydmljZUVuZHBvaW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL011bHRpcGxpY2l0eUtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9NdWx0aXBsaWNpdHlLaW5kLmphdmEKaW5kZXggMDcxNzRjMi4uN2NhNjQwYSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL011bHRpcGxpY2l0eUtpbmQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvTXVsdGlwbGljaXR5S2luZC5qYXZhCkBAIC00OCw3ICs0OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNdWx0aXBsaWNpdHlLaW5kIE9ORV9MSVRFUkFMID0gbmV3IE11bHRpcGxpY2l0eUtpbmQoT05FLCAiT25lIiwgIk9uZSIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBNdWx0aXBsaWNpdHlLaW5kIE9ORV9MSVRFUkFMID0gbmV3IE11bHRpcGxpY2l0eUtpbmQoT05FLCAiT25lIiwgIk9uZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPk1hbnk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtNjIsNyArNjIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTXVsdGlwbGljaXR5S2luZCBNQU5ZX0xJVEVSQUwgPSBuZXcgTXVsdGlwbGljaXR5S2luZChNQU5ZLCAiTWFueSIsICJNYW55Iik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE11bHRpcGxpY2l0eUtpbmQgTUFOWV9MSVRFUkFMID0gbmV3IE11bHRpcGxpY2l0eUtpbmQoTUFOWSwgIk1hbnkiLCAiTWFueSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5NdWx0aXBsaWNpdHkgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvUmV0dXJuVHlwZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9SZXR1cm5UeXBlTWFwcGluZy5qYXZhCmluZGV4IGRjZTQyZTIuLmI0OTg2ZmYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9SZXR1cm5UeXBlTWFwcGluZy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9SZXR1cm5UeXBlTWFwcGluZy5qYXZhCkBAIC00OCw3ICs0OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXR1cm5UeXBlTWFwcGluZyBMT0NBTF9MSVRFUkFMID0gbmV3IFJldHVyblR5cGVNYXBwaW5nKExPQ0FMLCAiTG9jYWwiLCAiTG9jYWwiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV0dXJuVHlwZU1hcHBpbmcgTE9DQUxfTElURVJBTCA9IG5ldyBSZXR1cm5UeXBlTWFwcGluZyhMT0NBTCwgIkxvY2FsIiwgIkxvY2FsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+UmVtb3RlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTYyLDcgKzYyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJldHVyblR5cGVNYXBwaW5nIFJFTU9URV9MSVRFUkFMID0gbmV3IFJldHVyblR5cGVNYXBwaW5nKFJFTU9URSwgIlJlbW90ZSIsICJSZW1vdGUiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV0dXJuVHlwZU1hcHBpbmcgUkVNT1RFX0xJVEVSQUwgPSBuZXcgUmV0dXJuVHlwZU1hcHBpbmcoUkVNT1RFLCAiUmVtb3RlIiwgIlJlbW90ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5SZXR1cm4gVHlwZSBNYXBwaW5nPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TZXNzaW9uVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1Nlc3Npb25UeXBlLmphdmEKaW5kZXggNmU5MWM3YS4uODkzMGFmYSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1Nlc3Npb25UeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1Nlc3Npb25UeXBlLmphdmEKQEAgLTM1LDYgKzM1LDEwIEBACiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVMRVNTPSAxOworCS8qKgorCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTkdMRVRPTj0gMjsKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPlN0YXRlZnVsPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTQ4LDcgKzUyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNlc3Npb25UeXBlIFNUQVRFRlVMX0xJVEVSQUwgPSBuZXcgU2Vzc2lvblR5cGUoU1RBVEVGVUwsICJTdGF0ZWZ1bCIsICJTdGF0ZWZ1bCIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTZXNzaW9uVHlwZSBTVEFURUZVTF9MSVRFUkFMID0gbmV3IFNlc3Npb25UeXBlKFNUQVRFRlVMLCAiU3RhdGVmdWwiLCAiU3RhdGVmdWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5TdGF0ZWxlc3M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtNjIsNyArNjYsMjEgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNlc3Npb25UeXBlIFNUQVRFTEVTU19MSVRFUkFMID0gbmV3IFNlc3Npb25UeXBlKFNUQVRFTEVTUywgIlN0YXRlbGVzcyIsICJTdGF0ZWxlc3MiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU2Vzc2lvblR5cGUgU1RBVEVMRVNTX0xJVEVSQUwgPSBuZXcgU2Vzc2lvblR5cGUoU1RBVEVMRVNTLCAiU3RhdGVsZXNzIiwgIlN0YXRlbGVzcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNpbmdsZXRvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNpbmdsZXRvbjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTSU5HTEVUT04KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNlc3Npb25UeXBlIFNJTkdMRVRPTl9MSVRFUkFMID0gbmV3IFNlc3Npb25UeXBlKFNJTkdMRVRPTiwgIlNpbmdsZXRvbiIsICJTaW5nbGV0b24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+U2Vzc2lvbiBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KQEAgLTc0LDYgKzkyLDcgQEAKIAkJbmV3IFNlc3Npb25UeXBlW10gewogCQkJU1RBVEVGVUxfTElURVJBTCwKIAkJCVNUQVRFTEVTU19MSVRFUkFMLAorCQkJU0lOR0xFVE9OX0xJVEVSQUwsCiAJCX07CiAKIAkvKioKQEAgLTEzMCw2ICsxNDksNyBAQAogCQlzd2l0Y2ggKHZhbHVlKSB7CiAJCQljYXNlIFNUQVRFRlVMOiByZXR1cm4gU1RBVEVGVUxfTElURVJBTDsKIAkJCWNhc2UgU1RBVEVMRVNTOiByZXR1cm4gU1RBVEVMRVNTX0xJVEVSQUw7CisJCQljYXNlIFNJTkdMRVRPTjogcmV0dXJuIFNJTkdMRVRPTl9MSVRFUkFMOwogCQl9CiAJCXJldHVybiBudWxsOwkKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5qYXZhCmluZGV4IDg3YzhlNzkuLjFkOTVkZTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9TdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5qYXZhCkBAIC00OCw3ICs0OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBEVVJBQkxFX0xJVEVSQUwgPSBuZXcgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQoRFVSQUJMRSwgIkR1cmFibGUiLCAiRHVyYWJsZSIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCBEVVJBQkxFX0xJVEVSQUwgPSBuZXcgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQoRFVSQUJMRSwgIkR1cmFibGUiLCAiRHVyYWJsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPk5vbiBEdXJhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTYyLDcgKzYyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIE5PTl9EVVJBQkxFX0xJVEVSQUwgPSBuZXcgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQoTk9OX0RVUkFCTEUsICJOb25EdXJhYmxlIiwgIk5vbkR1cmFibGUiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQgTk9OX0RVUkFCTEVfTElURVJBTCA9IG5ldyBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZChOT05fRFVSQUJMRSwgIk5vbkR1cmFibGUiLCAiTm9uRHVyYWJsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5TdWJzY3JpcHRpb24gRHVyYWJpbGl0eSBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuamF2YQppbmRleCA0NDI4ZWFhLi45ZWNhZmQ5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1RyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5qYXZhCkBAIC02NCw3ICs2NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgTk9UX1NVUFBPUlRFRF9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShOT1RfU1VQUE9SVEVELCAiTm90U3VwcG9ydGVkIiwgIk5vdFN1cHBvcnRlZCIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgTk9UX1NVUFBPUlRFRF9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShOT1RfU1VQUE9SVEVELCAiTm90U3VwcG9ydGVkIiwgIk5vdFN1cHBvcnRlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPlN1cHBvcnRzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTc4LDcgKzc4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBTVVBQT1JUU19MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShTVVBQT1JUUywgIlN1cHBvcnRzIiwgIlN1cHBvcnRzIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBTVVBQT1JUU19MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShTVVBQT1JUUywgIlN1cHBvcnRzIiwgIlN1cHBvcnRzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtOTIsNyArOTIsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIFJFUVVJUkVEX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKFJFUVVJUkVELCAiUmVxdWlyZWQiLCAiUmVxdWlyZWQiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIFJFUVVJUkVEX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKFJFUVVJUkVELCAiUmVxdWlyZWQiLCAiUmVxdWlyZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5SZXF1aXJlcyBOZXc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtMTA2LDcgKzEwNiw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgUkVRVUlSRVNfTkVXX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKFJFUVVJUkVTX05FVywgIlJlcXVpcmVzTmV3IiwgIlJlcXVpcmVzTmV3Iik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBSRVFVSVJFU19ORVdfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoUkVRVUlSRVNfTkVXLCAiUmVxdWlyZXNOZXciLCAiUmVxdWlyZXNOZXciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5NYW5kYXRvcnk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtMTIwLDcgKzEyMCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgTUFOREFUT1JZX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKE1BTkRBVE9SWSwgIk1hbmRhdG9yeSIsICJNYW5kYXRvcnkiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIE1BTkRBVE9SWV9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZShNQU5EQVRPUlksICJNYW5kYXRvcnkiLCAiTWFuZGF0b3J5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+TmV2ZXI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtMTM0LDcgKzEzNCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgTkVWRVJfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoTkVWRVIsICJOZXZlciIsICJOZXZlciIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgTkVWRVJfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoTkVWRVIsICJOZXZlciIsICJOZXZlciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBBdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvVHJhbnNhY3Rpb25UeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvVHJhbnNhY3Rpb25UeXBlLmphdmEKaW5kZXggY2I3M2M5OC4uYmNlMjY1YiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL1RyYW5zYWN0aW9uVHlwZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9UcmFuc2FjdGlvblR5cGUuamF2YQpAQCAtNDgsNyArNDgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25UeXBlIEJFQU5fTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvblR5cGUoQkVBTiwgIkJlYW4iLCAiQmVhbiIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGUgQkVBTl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uVHlwZShCRUFOLCAiQmVhbiIsICJCZWFuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTYyLDcgKzYyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uVHlwZSBDT05UQUlORVJfTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvblR5cGUoQ09OVEFJTkVSLCAiQ29udGFpbmVyIiwgIkNvbnRhaW5lciIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2FjdGlvblR5cGUgQ09OVEFJTkVSX0xJVEVSQUwgPSBuZXcgVHJhbnNhY3Rpb25UeXBlKENPTlRBSU5FUiwgIkNvbnRhaW5lciIsICJDb250YWluZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BYnN0cmFjdFJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fic3RyYWN0UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhCmluZGV4IGY3Y2ZkYjcuLjU1OWFkOWQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fic3RyYWN0UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fic3RyYWN0UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiAJCXN1cGVyKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIExpc3QgZmlsdGVyTm90Y2FjaGVkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7CiAJCUxpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJSXRlcmF0b3IgaXQgPSBnZXRTb3VyY2VSb2xlcyhjbXApLml0ZXJhdG9yKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BYnN0cmFjdFJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWJzdHJhY3RSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YQppbmRleCA4MDY1ZWJkLi4wZmM1MmNkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BYnN0cmFjdFJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fic3RyYWN0UmVxdWlyZWRSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIHB1YmxpYyBBYnN0cmFjdFJlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlcigpIHsKIAlzdXBlcigpOwogfQorQE92ZXJyaWRlCiBwcm90ZWN0ZWQgTGlzdCBmaWx0ZXJOb3RjYWNoZWQoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKIAlMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwogCUxpc3QgYWxsUm9sZXMgPSBnZXRSb2xlc1RvRmlsdGVyKGNtcCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ0ltcGwuamF2YQppbmRleCA5NjVjZTU0Li44NjNkNWZhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdJbXBsLmphdmEKQEAgLTczLDYgKzczLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkFDVElWQVRJT05fQ09ORklHOwogCX0KQEAgLTEwNiw2ICsxMDcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUdfX0NPTkZJR19QUk9QRVJUSUVTOgpAQCAtMTIxLDYgKzEyMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fQ09ORklHX1BST1BFUlRJRVM6CkBAIC0xMzYsNiArMTM5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fQ09ORklHX1BST1BFUlRJRVM6CkBAIC0xNTUsNiArMTU5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fQ09ORklHX1BST1BFUlRJRVM6CkBAIC0xNzIsNiArMTc3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19fQ09ORklHX1BST1BFUlRJRVM6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlJbXBsLmphdmEKaW5kZXggOGI2YmFiYS4uNTY3NTYwZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0eUltcGwuamF2YQpAQCAtODcsNiArODcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVFk7CiAJfQpAQCAtMTM4LDYgKzEzOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fVkFMVUU6CkBAIC0xNTMsNiArMTU1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fVkFMVUU6CkBAIC0xNzAsNiArMTczLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fVkFMVUU6CkBAIC0xODcsNiArMTkxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5BQ1RJVkFUSU9OX0NPTkZJR19QUk9QRVJUWV9fVkFMVUU6CkBAIC0yMDIsMTMgKzIwNywxNCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fzc2VtYmx5RGVzY3JpcHRvckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0Fzc2VtYmx5RGVzY3JpcHRvckltcGwuamF2YQppbmRleCA5ZDRiOGFhLi41Mzk5NzhlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Bc3NlbWJseURlc2NyaXB0b3JJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQXNzZW1ibHlEZXNjcmlwdG9ySW1wbC5qYXZhCkBAIC04MSw2ICs4MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5BU1NFTUJMWV9ERVNDUklQVE9SOwogCX0KQEAgLTE4OSw3ICsxOTAsNyBAQAogCXB1YmxpYyB2b2lkIHNldEVqYkphcihFSkJKYXIgbmV3RWpiSmFyKSB7CiAJCWlmIChuZXdFamJKYXIgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5BU1NFTUJMWV9ERVNDUklQVE9SX19FSkJfSkFSICYmIG5ld0VqYkphciAhPSBudWxsKSkgewogCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0VqYkphcikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwogCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCiAJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CkBAIC0yNjgsNiArMjY5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKQEAgLTI4Nyw2ICsyODksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQVNTRU1CTFlfREVTQ1JJUFRPUl9fTUVUSE9EX1BFUk1JU1NJT05TOgpAQCAtMzEwLDYgKzMxMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX0VKQl9KQVI6CkBAIC0zMjMsNiArMzI3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKQEAgLTM0Niw2ICszNTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKQEAgLTM3OSw2ICszODUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKQEAgLTQwOCw2ICs0MTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkFTU0VNQkxZX0RFU0NSSVBUT1JfX01FVEhPRF9QRVJNSVNTSU9OUzoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUEF0dHJpYnV0ZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NNUEF0dHJpYnV0ZUltcGwuamF2YQppbmRleCA4NzY2OGU5Li41NWJhMDFmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVBBdHRyaWJ1dGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQ01QQXR0cmlidXRlSW1wbC5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CkBAIC00MSw3ICs0MCw3IEBACiAgKiBEZXNjcmliZXMgYSBjb250YWluZXItbWFuYWdlZCBmaWVsZC4gVGhlIGZpZWxkIGVsZW1lbnQgaW5jbHVkZXMgYW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkLCBhbmQgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgogCiAgKi8KLXB1YmxpYyBjbGFzcyBDTVBBdHRyaWJ1dGVJbXBsIGV4dGVuZHMgRUF0dHJpYnV0ZUltcGwgaW1wbGVtZW50cyBDTVBBdHRyaWJ1dGUsIEVBdHRyaWJ1dGUgeworcHVibGljIGNsYXNzIENNUEF0dHJpYnV0ZUltcGwgZXh0ZW5kcyBFQXR0cmlidXRlSW1wbCBpbXBsZW1lbnRzIENNUEF0dHJpYnV0ZSB7CiAKIAkvKioKIAkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTgyLDYgKzgxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkNNUF9BVFRSSUJVVEU7CiAJfQpAQCAtMjg2LDYgKzI4Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTlM6CkBAIC0yOTksNiArMzAwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OOgpAQCAtMzE0LDYgKzMxNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQ01QX0FUVFJJQlVURV9fREVTQ1JJUFRJT046CkBAIC0zMzIsNiArMzM1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5DTVBfQVRUUklCVVRFX19ERVNDUklQVElPTjoKQEAgLTM0OSw2ICszNTMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNNUF9BVFRSSUJVVEVfX0RFU0NSSVBUSU9OOgpAQCAtMzYyLDYgKzM2Nyw3IEBACiAJLyoqCiAJICogVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCXJldHVybiBzdXBlci50b1N0cmluZygpICsgIiA6OiAiICsgZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMzY5LDkgKzM3NSwxMSBAQAogCSAqIFJldHVybnMgdHJ1ZSBpZiBhIHRhcmdldEF0dHJpYnV0ZSBpcyBiZWluZyB1c2VkLgogCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0Rlcml2ZWQoKSB7CiAJCXJldHVybiBkZXJpdmVkOwogCX0KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXREZXJpdmVkKGJvb2xlYW4gYUJvb2xlYW4pIHsKIAkJaWYgKGFCb29sZWFuICYmIGdldEVUeXBlKCkgPT0gbnVsbCkKIAkJCWdldFR5cGUoKTsgLy9UaGlzIGVuc3VyZXMgdGhhdCB0aGUgdHlwZSBpcyBzZXQuCkBAIC0zODQsNyArMzkyLDcgQEAKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQ01SRmllbGRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVJGaWVsZEltcGwuamF2YQppbmRleCA1MDUyYTRkLi4wOGNkYTRmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVJGaWVsZEltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9DTVJGaWVsZEltcGwuamF2YQpAQCAtNDUsNiArNDUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQ01SX0ZJRUxEOwogCX0KQEAgLTYwLDEwICs2MSwxMiBAQAogCXJldHVybiBjb2xsZWN0aW9uVHlwZSA9PSBudWxsID8gbnVsbCA6IGNvbGxlY3Rpb25UeXBlLmdldFF1YWxpZmllZE5hbWUoKTsKIH0gICAgICAgICAgCiAKK0BPdmVycmlkZQogcHVibGljIGJvb2xlYW4gaXNQcmltS2V5RmllbGQoKXsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKK0BPdmVycmlkZQogcHVibGljIGJvb2xlYW4gaXNDTVJGaWVsZCgpIHsKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTc0LDcgKzc3LDcgQEAKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbiAKIAkgKi8KIAlwdWJsaWMgRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRSb2xlKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRSkgcmV0dXJuIG51bGw7CisJCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEKCkgIT0gRWpiUGFja2FnZS5DTVJfRklFTERfX1JPTEUpIHJldHVybiBudWxsOwogCQlyZXR1cm4gKEVKQlJlbGF0aW9uc2hpcFJvbGUpZUNvbnRhaW5lcigpOwogCX0KIApAQCAtOTIsOSArOTUsOSBAQAogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLwogCXB1YmxpYyB2b2lkIHNldFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSBuZXdSb2xlKSB7Ci0JCWlmIChuZXdSb2xlICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFICYmIG5ld1JvbGUgIT0gbnVsbCkpIHsKKwkJaWYgKG5ld1JvbGUgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQoKSAhPSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRSAmJiBuZXdSb2xlICE9IG51bGwpKSB7CiAJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3Um9sZSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwogCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCiAJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CkBAIC0xNDYsNiArMTQ5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRToKQEAgLTE2MSw2ICsxNjUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFOgpAQCAtMTc0LDggKzE3OSw5IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQoKSkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNNUl9GSUVMRF9fUk9MRToKIAkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0NNUl9GSUVMRCwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgbXNncyk7CiAJCX0KQEAgLTE4Nyw2ICsxOTMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFOgpAQCAtMjAzLDYgKzIxMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFOgpAQCAtMjIwLDYgKzIyOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFOgpAQCAtMjM3LDYgKzI0Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQ01SX0ZJRUxEX19ST0xFOgpAQCAtMjUwLDYgKzI2MCw3IEBACiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5DTVBBdHRyaWJ1dGVJbXBsI2dldENNUEVudGl0eSgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZ2V0Q01QRW50aXR5KCkgewogCQlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUgPSBnZXRSb2xlKCk7CiAJCWlmIChyb2xlICE9IG51bGwpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Db250YWluZXJNYW5hZ2VkRW50aXR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvQ29udGFpbmVyTWFuYWdlZEVudGl0eUltcGwuamF2YQppbmRleCAyYWJmMGFhLi4xYTIwN2I2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Db250YWluZXJNYW5hZ2VkRW50aXR5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlJbXBsLmphdmEKQEAgLTE0Myw2ICsxNDMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZOwogCX0KQEAgLTI4MSw2ICsyODIsNyBAQAogLyogKG5vbi1KYXZhZG9jKQogICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIuRW50ZXJwcmlzZUJlYW4jZ2V0VmVyc2lvbklEKCkKICAqLworQE92ZXJyaWRlCiBwdWJsaWMgaW50IGdldFZlcnNpb25JRCgpIHsKIAlyZXR1cm4gZ2V0Q01QVmVyc2lvbklEKCk7CiB9cHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlUmVtb3RlUXVlcnlKYXZhTWV0aG9kcygpIHsKQEAgLTM1MCw2ICszNTIsNyBAQAogLyoqCiAgKiBpc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkgbWV0aG9kIGNvbW1lbnQuCiAgKi8KK0BPdmVycmlkZQogcHVibGljIGJvb2xlYW4gaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewogCXJldHVybiB0cnVlOwogfQpAQCAtMzg2LDEyICszODksMTQgQEAKIC8qKgogICogaXNWZXJzaW9uMV9YIG1ldGhvZCBjb21tZW50LgogICovCitAT3ZlcnJpZGUKIHB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjFfWCgpIHsKIAlyZXR1cm4gZ2V0VmVyc2lvbigpLmVxdWFscyhDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMV9YKTsKIH0KIC8qKgogICogaXNWZXJzaW9uMl9YIG1ldGhvZCBjb21tZW50LgogICovCitAT3ZlcnJpZGUKIHB1YmxpYyBib29sZWFuIGlzVmVyc2lvbjJfWCgpIHsKIAlyZXR1cm4gZ2V0VmVyc2lvbigpLmVxdWFscyhDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMl9YKTsKIH0KQEAgLTQ5MywxMyArNDk4LDE0IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlcnNpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHZlcnNpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWJzdHJhY3RTY2hlbWFOYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBhYnN0cmFjdFNjaGVtYU5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoYWJzdHJhY3RTY2hlbWFOYW1lKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CkBAIC02MTgsNiArNjI0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fUVVFUklFUzoKQEAgLTYzMSw2ICs2MzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuQ09OVEFJTkVSX01BTkFHRURfRU5USVRZX19QRVJTSVNURU5UX0FUVFJJQlVURVM6CkBAIC02NDYsNiArNjU0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fVkVSU0lPTjoKQEAgLTY3Miw2ICs2ODEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fVkVSU0lPTjoKQEAgLTcwOCw2ICs3MTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fVkVSU0lPTjoKQEAgLTc0MCw2ICs3NTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWV9fVkVSU0lPTjoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQjIwRmxhdHRlbmVkUm9sZVNoYXBlU3RyYXRlZ3kuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQjIwRmxhdHRlbmVkUm9sZVNoYXBlU3RyYXRlZ3kuamF2YQppbmRleCBiZDBmNDA1Li43Y2FjY2Q1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkIyMEZsYXR0ZW5lZFJvbGVTaGFwZVN0cmF0ZWd5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCMjBGbGF0dGVuZWRSb2xlU2hhcGVTdHJhdGVneS5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiAJcHVibGljIEVKQjIwRmxhdHRlbmVkUm9sZVNoYXBlU3RyYXRlZ3koQ29tbW9uUmVsYXRpb25zaGlwUm9sZSBhUm9sZSkgewogCQlzdXBlcihhUm9sZSk7CiAJfQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIGNhbkNvbnRpbnVlKCkgewogCQlyZXR1cm4gIWJ1c3kgJiYgcm9sZS5nZXROYW1lKCkgIT0gbnVsbCAmJiAocm9sZS5pc0ZvcndhcmQoKSB8fAogCQkJKHJvbGUuaXNNYW55KCkgJiYgKHJvbGUuZ2V0T3Bwb3NpdGVBc0NvbW1vblJvbGUoKSA9PSBudWxsIHx8CkBAIC01MSw2ICs1Miw3IEBACiAJLyoqCiAJICogQHNlZSBSb2xlU2hhcGVTdHJhdGVneSNyZWNvbmNpbGVBdHRyaWJ1dGVzKENvbW1vblJlbGF0aW9uc2hpcFJvbGUsIFN0cmluZywgTGlzdCwgTGlzdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCByZWNvbmNpbGVBdHRyaWJ1dGVzKENvbW1vblJlbGF0aW9uc2hpcFJvbGUgYVJvbGUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0IGFMaXN0LCBMaXN0IGNvbXB1dGVkTmFtZXMpIHsKIAkJCiAJCVJlc291cmNlIHJlcyA9IGFSb2xlLmVSZXNvdXJjZSgpOwpAQCAtMTMyLDcgKzEzNCw3IEBACiAJcHJvdGVjdGVkIENNUEF0dHJpYnV0ZSBjcmVhdGVQZXJzaXN0ZW50QXR0cmlidXRlKFN0cmluZyBhTmFtZSkgewogCQlDTVBBdHRyaWJ1dGUgYXR0cmlidXRlID0gKChFamJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkpLmdldEVqYkZhY3RvcnkoKS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKIAkJYXR0cmlidXRlLnNldE5hbWUoYU5hbWUpOwotCQlhdHRyaWJ1dGUuc2V0RGVzY3JpcHRpb24oIkdlbmVyYXRlZCB0byBzdXBwb3J0IHJlbGF0aW9uc2hpcHMuICBEbyBOT1QgZGVsZXRlLiIpOworCQlhdHRyaWJ1dGUuc2V0RGVzY3JpcHRpb24oIkdlbmVyYXRlZCB0byBzdXBwb3J0IHJlbGF0aW9uc2hpcHMuICBEbyBOT1QgZGVsZXRlLiIpOyAvLyROT04tTkxTLTEkCiAJCXJldHVybiBhdHRyaWJ1dGU7CiAJfQogCS8qKgpAQCAtMTUxLDcgKzE1Myw3IEBACiAJICovCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdEtleVJvbGVBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5LCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgTGlzdCBhTGlzdCwgTGlzdCBjb21wdXRlZE5hbWVzKSB7CiAJCWlmKHZpc2l0ZWRLZXlUeXBlcy5jb250YWlucyhlbnRpdHkpKXsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJLZXkgcm9sZSBjeWNsZSBkZXRlY3RlZCIpOworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIktleSByb2xlIGN5Y2xlIGRldGVjdGVkIik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCQl2aXNpdGVkS2V5VHlwZXMuYWRkKGVudGl0eSk7CiAJCWphdmEudXRpbC5JdGVyYXRvciBpdCA9IGVudGl0eS5nZXRGaWx0ZXJlZEZlYXR1cmVzKEtleVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuc2luZ2xldG9uKCkpLml0ZXJhdG9yKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJJbXBsLmphdmEKaW5kZXggOTc3YTcwZS4uMWUxZDAzMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCSmFySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphckltcGwuamF2YQpAQCAtMTAzLDYgKzEwMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FSkJfSkFSOwogCX0KQEAgLTMxOSw2ICszMjAsNyBAQAogCS8qKgogCSAqCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7CiAJCXN1cGVyLnNldERpc3BsYXlOYW1lKG5ld0Rpc3BsYXlOYW1lKTsKIAl9CkBAIC0zNjgsMTUgKzM3MCwxNyBAQAogCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEOwogCQkJaWYgKHZlcnNpb24uZXF1YWxzKCIxLjAiKSkgLy8kTk9OLU5MUy0xJAogCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8wX0lEOworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogCQl9CiAJCXJldHVybiBlamJSZXMuZ2V0TW9kdWxlVmVyc2lvbklEKCk7CiAJfQogCS8qKgogCSAqVGhpcyByZXR1cm5zIHRoZSBqMmVlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgajJlZSBsZXZlbAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogCQlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKSBlUmVzb3VyY2UoKTsKLQkJaWYgKHJlcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJYTUxSZXNvdXJjZSBpcyBudWxsIik7CisJCWlmIChyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiWE1MUmVzb3VyY2UgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCiAJCXJldHVybiByZXMuZ2V0SjJFRVZlcnNpb25JRCgpOwogCX0KIApAQCAtNDg5LDYgKzQ5Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SOgpAQCAtNTEwLDYgKzUxNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19BU1NFTUJMWV9ERVNDUklQVE9SOgpAQCAtNTI3LDYgKzUzMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FSkJfQ0xJRU5UX0pBUjoKQEAgLTU0OCw2ICs1NTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9KQVJfX0VKQl9DTElFTlRfSkFSOgpAQCAtNTc1LDYgKzU4Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX0pBUl9fRUpCX0NMSUVOVF9KQVI6CkBAIC02MDEsNiArNjEwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfSkFSX19FSkJfQ0xJRU5UX0pBUjoKQEAgLTYyMCwxMyArNjMwLDE0IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGVqYkNsaWVudEphcjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZWpiQ2xpZW50SmFyOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGVqYkNsaWVudEphcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJKYXJSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphclJlc291cmNlRmFjdG9yeS5qYXZhCmluZGV4IDkzMTQyZWUuLjA2ZjcwZTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphclJlc291cmNlRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQkphclJlc291cmNlRmFjdG9yeS5qYXZhCkBAIC01NSw2ICs1NSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlcikKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewogCQlyZXR1cm4gbmV3IEVKQlJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCTWV0aG9kQ2F0ZWdvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJNZXRob2RDYXRlZ29yeUltcGwuamF2YQppbmRleCBjNGM0ODdkLi5kOTNhNGQ1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJNZXRob2RDYXRlZ29yeUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJNZXRob2RDYXRlZ29yeUltcGwuamF2YQpAQCAtMjksNiArMjksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuRUpCX01FVEhPRF9DQVRFR09SWTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uSW1wbC5qYXZhCmluZGV4IDMwNDBmNGIuLmY5OTMzM2QgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uSW1wbC5qYXZhCkBAIC05OCw2ICs5OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FSkJfUkVMQVRJT047CiAJfQpAQCAtMjMxLDcgKzIzMiw3IEBACiAJcHVibGljIHZvaWQgc2V0UmVsYXRpb25zaGlwTGlzdChSZWxhdGlvbnNoaXBzIG5ld1JlbGF0aW9uc2hpcExpc3QpIHsKIAkJaWYgKG5ld1JlbGF0aW9uc2hpcExpc3QgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNUICYmIG5ld1JlbGF0aW9uc2hpcExpc3QgIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdSZWxhdGlvbnNoaXBMaXN0KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTI3NSw2ICsyNzYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVDoKQEAgLTI5Miw2ICsyOTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19SRUxBVElPTlNISVBfTElTVDoKQEAgLTMwOSw2ICszMTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX1JFTEFUSU9OU0hJUF9MSVNUOgpAQCAtMzIyLDYgKzMyNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OOgpAQCAtMzQzLDYgKzM0OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OX19ERVNDUklQVElPTjoKQEAgLTM3MSw2ICszNzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTl9fREVTQ1JJUFRJT046CkBAIC0zOTcsNiArNDA0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05fX0RFU0NSSVBUSU9OOgpAQCAtNDE2LDEzICs0MjQsMTQgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uc2hpcFJvbGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbC5qYXZhCmluZGV4IDY1NDVmZTUuLjEwMTM5NjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlbGF0aW9uc2hpcFJvbGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVsYXRpb25zaGlwUm9sZUltcGwuamF2YQpAQCAtMTkzLDYgKzE5Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5FSkJfUkVMQVRJT05TSElQX1JPTEU7CiAJfQpAQCAtMzk1LDYgKzM5Niw3IEBACiAJcHVibGljIHZvaWQgc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nIHVuaXF1ZU5hbWUpIHsKIAkJZk5hbWUgPSB1bmlxdWVOYW1lOwogCX0KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAodG9TdHJpbmdHdWFyZCkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAJCXRyeSB7CkBAIC03MjcsNiArNzI5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fUkVMQVRJT05TSElQOgpAQCAtNzUwLDYgKzc1Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUDoKQEAgLTc2OSw2ICs3NzMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX1JFTEFUSU9OU0hJUDoKQEAgLTc4Miw2ICs3ODcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTjoKQEAgLTgwOSw2ICs4MTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVKQl9SRUxBVElPTlNISVBfUk9MRV9fREVTQ1JJUFRJT046CkBAIC04NDUsNiArODUyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FSkJfUkVMQVRJT05TSElQX1JPTEVfX0RFU0NSSVBUSU9OOgpAQCAtODgwLDYgKzg4OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19ERVNDUklQVElPTjoKQEAgLTkwOSwxNCArOTE4LDE0IEBACiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJvbGVOYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByb2xlTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChyb2xlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbXVsdGlwbGljaXR5OiAiKTsKLQkJaWYgKG11bHRpcGxpY2l0eUVTZXQpIHJlc3VsdC5hcHBlbmQobXVsdGlwbGljaXR5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZURlbGV0ZTogIik7Ci0JCWlmIChjYXNjYWRlRGVsZXRlRVNldCkgcmVzdWx0LmFwcGVuZChjYXNjYWRlRGVsZXRlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7CisJCXJlc3VsdC5hcHBlbmQoIiwgbXVsdGlwbGljaXR5OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAobXVsdGlwbGljaXR5RVNldCkgcmVzdWx0LmFwcGVuZChtdWx0aXBsaWNpdHkpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGVEZWxldGU6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChjYXNjYWRlRGVsZXRlRVNldCkgcmVzdWx0LmFwcGVuZChjYXNjYWRlRGVsZXRlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAJfQpAQCAtOTUyLDcgKzk2MSw3IEBACiAJcHVibGljIHZvaWQgc2V0UmVsYXRpb25zaGlwR2VuKEVKQlJlbGF0aW9uIG5ld1JlbGF0aW9uc2hpcCkgewogCQlpZiAobmV3UmVsYXRpb25zaGlwICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuRUpCX1JFTEFUSU9OU0hJUF9ST0xFX19SRUxBVElPTlNISVAgJiYgbmV3UmVsYXRpb25zaGlwICE9IG51bGwpKSB7CiAJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3UmVsYXRpb25zaGlwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VKQlJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVzb3VyY2VJbXBsLmphdmEKaW5kZXggMWZhYWM4MS4uM2NmNjQ3MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVzb3VyY2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRUpCUmVzb3VyY2VJbXBsLmphdmEKQEAgLTk0LDYgKzk0LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9QdWJsaWNJRCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpIHsKIAkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX1BVQkxJQ0lEXzFfMTsKIAl9CkBAIC0xMDEsMTAgKzEwMiwxMiBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1N5c3RlbUlEKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5FSkJKQVJfU1lTVEVNSURfMV8xOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEoyRUVfQWx0XzFfMl9TeXN0ZW1JRCgpIHsKIAkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX0FMVF9TWVNURU1JRF8xXzE7CiAJfQpAQCAtMTEyLDYgKzExNSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfUHVibGljSUQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKSB7CiAJCXJldHVybiBKMkVFQ29uc3RhbnRzLkVKQkpBUl9QVUJMSUNJRF8yXzA7CiAJfQpAQCAtMTE5LDEwICsxMjMsMTIgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19TeXN0ZW1JRCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKIAkJcmV0dXJuIEoyRUVDb25zdGFudHMuRUpCSkFSX1NZU1RFTUlEXzJfMDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRKMkVFX0FsdF8xXzNfU3lzdGVtSUQoKSB7CiAJCXJldHVybiBKMkVFQ29uc3RhbnRzLkVKQkpBUl9BTFRfU1lTVEVNSURfMl8wOwogCX0KQEAgLTEzNiw2ICsxNDIsNyBAQAogCQogCS8qIFJldHVybiBKMkVFIHZlcnNpb24gYmFzZWQgb24gbW9kdWxlIHZlcnNpb24KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB7CiAJCXN3aXRjaCAoZ2V0TW9kdWxlVmVyc2lvbklEKCkpIHsKIAkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMF9JRCA6CkBAIC0xNDgsNiArMTU1LDggQEAKIAkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7CiAJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8zXzBfSUQgOgogCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOworCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18xX0lEIDoKKwkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKIAkJCWRlZmF1bHQgOgogCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwogCQl9CkBAIC0xNjcsOSArMTc2LDE0IEBACiAJLyogCiAJICogVGhpcyBkaXJlY3RseSBzZXRzIHRoZSBtb2R1bGUgdmVyc2lvbiBpZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE1vZHVsZVZlcnNpb25JRChpbnQgaWQpIHsKIAkJc3VwZXIuc2V0VmVyc2lvbklEKGlkKTsKIAkJc3dpdGNoIChpZCkgeworCQkJCWNhc2UgKEVKQl8zXzFfSUQpIDoKKwkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKKwkJCQkJcHJpbVNldFZlcnNpb25JRChFSkJfM18xX0lEKTsKKwkJCQkJYnJlYWs7CiAJCQkJY2FzZSAoRUpCXzNfMF9JRCkgOgogCQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwogCQkJCQlwcmltU2V0VmVyc2lvbklEKEVKQl8zXzBfSUQpOwpAQCAtMTkzLDggKzIwNywxMyBAQAogCS8qCiAJICogQmFzZWQgb24gdGhlIEoyRUUgdmVyc2lvbiwgdGhpcyB3aWxsIHNldCB0aGUgbW9kdWxlIHZlcnNpb24KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCkgewogCXN3aXRjaCAoaWQpIHsKKwkJY2FzZSAoSkVFXzZfMF9JRCkgOgorCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKKwkJCQkJcHJpbVNldFZlcnNpb25JRChFSkJfM18xX0lEKTsKKwkJCQkJYnJlYWs7CiAJCWNhc2UgKEpFRV81XzBfSUQpIDoKIAkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7CiAJCQkJCXByaW1TZXRWZXJzaW9uSUQoRUpCXzNfMF9JRCk7CkBAIC0yMTYsMTIgKzIzNSwxNCBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRWZXJzaW9uSUQoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFZlcnNpb25JRCgpIHsKIAkJcmV0dXJuIEVKQl8yXzFfSUQ7CiAJfQogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5pbXBsLlhNTFJlc291cmNlSW1wbCNzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKSB7CiAJCUVKQkphciBlamJKYXIgPSBnZXRFSkJKYXIoKTsKIAkJaWYgKGVqYkphciA9PSBudWxsKQpAQCAtMjM2LDYgKzI1Nyw3IEBACiAJcHVibGljIGJvb2xlYW4gaXNCYXRjaE1vZGUoKSB7CiAJCXJldHVybiByZW5kZXJlci5pc0JhdGNoTW9kZSgpOwogCX0KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXREb2N0eXBlVmFsdWVzKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7CiAJCQogCQlpbnQgbXlWZXJzaW9uID0gSjJFRV8xXzRfSUQ7CkBAIC0yNTYsMTEgKzI3OCwxMiBAQAogCQl0cnkgewogCQkJaW4gPSBhZmlsZS5nZXRDb250ZW50cygpOwogCQkJcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhpbik7CisJCQlyZXR1cm4gcXVpY2tQZWVrLmdldFZlcnNpb24oKTsKIAkJfQogCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CiAJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQotCXJldHVybiBxdWlja1BlZWsuZ2V0VmVyc2lvbigpOworCQogCX0KIAlyZXR1cm4gZ2V0TW9kdWxlVmVyc2lvbklEKCk7CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRWpiRmFjdG9yeUltcGwuamF2YQppbmRleCBiNDU0OWEwLi4yYWMxMzY1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJGYWN0b3J5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYkZhY3RvcnlJbXBsLmphdmEKQEAgLTc2LDcgKzc2LDcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIEVqYkZhY3RvcnkgaW5pdCgpIHsKIAkJdHJ5IHsKLQkJCUVqYkZhY3RvcnkgdGhlRWpiRmFjdG9yeSA9IChFamJGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJlamIueG1pIik7IAorCQkJRWpiRmFjdG9yeSB0aGVFamJGYWN0b3J5ID0gKEVqYkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImVqYi54bWkiKTsgIC8vJE5PTi1OTFMtMSQKIAkJCWlmICh0aGVFamJGYWN0b3J5ICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gdGhlRWpiRmFjdG9yeTsKIAkJCX0KQEAgLTEwNCw2ICsxMDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewogCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBFamJQYWNrYWdlLkNPTlRBSU5FUl9NQU5BR0VEX0VOVElUWTogcmV0dXJuIGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKQEAgLTEyOSw3ICsxMzAsNyBAQAogCQkJY2FzZSBFamJQYWNrYWdlLkFDVElWQVRJT05fQ09ORklHX1BST1BFUlRZOiByZXR1cm4gY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCk7CiAJCQljYXNlIEVqYlBhY2thZ2UuQUNUSVZBVElPTl9DT05GSUc6IHJldHVybiBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnKCk7CiAJCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAl9CiAKQEAgLTEzOCw2ICsxMzksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewogCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBFamJQYWNrYWdlLlRSQU5TQUNUSU9OX0FUVFJJQlVURV9UWVBFOgpAQCAtMTU5LDcgKzE2MSw3IEBACiAJCQljYXNlIEVqYlBhY2thZ2UuTVVMVElQTElDSVRZX0tJTkQ6CiAJCQkJcmV0dXJuIGNyZWF0ZU11bHRpcGxpY2l0eUtpbmRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJfQogCX0KIApAQCAtMTY4LDYgKzE3MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CiAJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuVFJBTlNBQ1RJT05fQVRUUklCVVRFX1RZUEU6CkBAIC0xODksNyArMTkyLDcgQEAKIAkJCWNhc2UgRWpiUGFja2FnZS5NVUxUSVBMSUNJVFlfS0lORDoKIAkJCQlyZXR1cm4gY29udmVydE11bHRpcGxpY2l0eUtpbmRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwogCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9CiAJfQogCkBAIC00MzMsNyArNDM2LDcgQEAKIAkgKi8KIAlwdWJsaWMgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIGNyZWF0ZVRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewogCQlUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgcmVzdWx0ID0gVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC00NTMsNyArNDU2LDcgQEAKIAkgKi8KIAlwdWJsaWMgVHJhbnNhY3Rpb25UeXBlIGNyZWF0ZVRyYW5zYWN0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewogCQlUcmFuc2FjdGlvblR5cGUgcmVzdWx0ID0gVHJhbnNhY3Rpb25UeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC00NzMsNyArNDc2LDcgQEAKIAkgKi8KIAlwdWJsaWMgU2Vzc2lvblR5cGUgY3JlYXRlU2Vzc2lvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJU2Vzc2lvblR5cGUgcmVzdWx0ID0gU2Vzc2lvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTQ5Myw3ICs0OTYsNyBAQAogCSAqLwogCXB1YmxpYyBNZXRob2RFbGVtZW50S2luZCBjcmVhdGVNZXRob2RFbGVtZW50S2luZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewogCQlNZXRob2RFbGVtZW50S2luZCByZXN1bHQgPSBNZXRob2RFbGVtZW50S2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtNTEzLDcgKzUxNiw3IEBACiAJICovCiAJcHVibGljIEFja25vd2xlZGdlTW9kZSBjcmVhdGVBY2tub3dsZWRnZU1vZGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJQWNrbm93bGVkZ2VNb2RlIHJlc3VsdCA9IEFja25vd2xlZGdlTW9kZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtNTMzLDcgKzUzNiw3IEBACiAJICovCiAJcHVibGljIFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIGNyZWF0ZVN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCVN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIHJlc3VsdCA9IFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC01NTMsNyArNTU2LDcgQEAKIAkgKi8KIAlwdWJsaWMgUmV0dXJuVHlwZU1hcHBpbmcgY3JlYXRlUmV0dXJuVHlwZU1hcHBpbmdGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJUmV0dXJuVHlwZU1hcHBpbmcgcmVzdWx0ID0gUmV0dXJuVHlwZU1hcHBpbmcuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTU3Myw3ICs1NzYsNyBAQAogCSAqLwogCXB1YmxpYyBEZXN0aW5hdGlvblR5cGUgY3JlYXRlRGVzdGluYXRpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCURlc3RpbmF0aW9uVHlwZSByZXN1bHQgPSBEZXN0aW5hdGlvblR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTU5Myw3ICs1OTYsNyBAQAogCSAqLwogCXB1YmxpYyBNdWx0aXBsaWNpdHlLaW5kIGNyZWF0ZU11bHRpcGxpY2l0eUtpbmRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJTXVsdGlwbGljaXR5S2luZCByZXN1bHQgPSBNdWx0aXBsaWNpdHlLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJCXJldHVybiByZXN1bHQ7CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRWpiUGFja2FnZUltcGwuamF2YQppbmRleCBjNDkyNGM4Li5kZGQyNzdmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FamJQYWNrYWdlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VqYlBhY2thZ2VJbXBsLmphdmEKQEAgLTE4LDEyICsxOCw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQWNrbm93bGVkZ2VNb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7CkBAIC01OCwyMyArNTQsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKIAogCi1wdWJsaWMgY2xhc3MgRWpiUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBFamJQYWNrYWdlLCBFUGFja2FnZSB7CitwdWJsaWMgY2xhc3MgRWpiUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBFamJQYWNrYWdlIHsKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMzExLDcgKzI5NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKwlwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CiAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KQEAgLTMyMCw1OCArMzAzLDMyIEBACiAJCWlmIChpc0luaXRlZCkgcmV0dXJuIChFamJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSk7CiAKIAkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgRWpiUGFja2FnZUltcGwoKSk7Ci0KKwkJCisJCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPQorCQkJKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZgorCQkJRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcKKwkJCUVqYlBhY2thZ2VJbXBsKCkpOworCQkKIAkJaXNJbml0ZWQgPSB0cnVlOwogCiAJCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwogCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CiAKLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQ2xpZW50UGFja2FnZUltcGwgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IENsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpzcFBhY2thZ2VJbXBsIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpzcFBhY2thZ2UuZU5TX1VSSSkgOiBKc3BQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzY29tbW9uUGFja2FnZUltcGwgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KIAkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKIAkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CiAKIAkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQogCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKIAogCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCiAJCXRoZUVqYlBhY2thZ2UuZnJlZXplKCk7CiAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChFamJQYWNrYWdlLmVOU19VUkksIHRoZUVqYlBhY2thZ2UpOworCisJCUoyRUVJbml0LmluaXRFTUZNb2RlbHMoKTsKKwogCQlyZXR1cm4gdGhlRWpiUGFja2FnZTsKIAl9CiAKQEAgLTE1NTgsMjI0ICsxNTE1LDIzNyBAQAogCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwogCQlKYXZhUmVmUGFja2FnZSB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKIAotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFbnRpdHkoKSk7Ci0JCW1ldGhvZFBlcm1pc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCW1ldGhvZFRyYW5zYWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXNlc3Npb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFbnRlcnByaXNlQmVhbigpKTsKLQkJZW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RW50ZXJwcmlzZUJlYW4oKSk7Ci0JCWVudGVycHJpc2VCZWFuRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Sk5ESUVudlJlZnNHcm91cCgpKTsKLQkJZWpiTWV0aG9kQ2F0ZWdvcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZWpiSmFyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJY21wQXR0cmlidXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVBdHRyaWJ1dGUoKSk7Ci0JCXJlbGF0aW9uc2hpcHNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJcXVlcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZWpiUmVsYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlyb2xlU291cmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWNtckZpZWxkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q01QQXR0cmlidXRlKCkpOwotCQltZXNzYWdlRHJpdmVuRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RW50ZXJwcmlzZUJlYW4oKSk7Ci0JCW1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlleGNsdWRlTGlzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlxdWVyeU1ldGhvZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCWFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlhY3RpdmF0aW9uQ29uZmlnRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhjb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLCBDb250YWluZXJNYW5hZ2VkRW50aXR5LmNsYXNzLCAiQ29udGFpbmVyTWFuYWdlZEVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9WZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZXJzaW9uIiwgIjIueCIsIDAsIDEsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQWJzdHJhY3RTY2hlbWFOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhYnN0cmFjdFNjaGVtYU5hbWUiLCBudWxsLCAwLCAxLCBDb250YWluZXJNYW5hZ2VkRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1BlcnNpc3RlbnRBdHRyaWJ1dGVzKCksIHRoaXMuZ2V0Q01QQXR0cmlidXRlKCksIG51bGwsICJwZXJzaXN0ZW50QXR0cmlidXRlcyIsIG51bGwsIDAsIC0xLCBDb250YWluZXJNYW5hZ2VkRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X0tleUF0dHJpYnV0ZXMoKSwgdGhpcy5nZXRDTVBBdHRyaWJ1dGUoKSwgbnVsbCwgImtleUF0dHJpYnV0ZXMiLCBudWxsLCAwLCAtMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9RdWVyaWVzKCksIHRoaXMuZ2V0UXVlcnkoKSwgdGhpcy5nZXRRdWVyeV9FbnRpdHkoKSwgInF1ZXJpZXMiLCBudWxsLCAwLCAtMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9DTVBBdHRyaWJ1dGUoKSwgdGhpcy5nZXRDTVBBdHRyaWJ1dGUoKSwgbnVsbCwgIkNNUEF0dHJpYnV0ZSIsIG51bGwsIDAsIC0xLCBDb250YWluZXJNYW5hZ2VkRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ByaW1LZXlGaWVsZCgpLCB0aGlzLmdldENNUEF0dHJpYnV0ZSgpLCBudWxsLCAicHJpbUtleUZpZWxkIiwgbnVsbCwgMCwgMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZFBlcm1pc3Npb25FQ2xhc3MsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICJNZXRob2RQZXJtaXNzaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBlcm1pc3Npb25fVW5jaGVja2VkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAidW5jaGVja2VkIiwgbnVsbCwgMCwgMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQZXJtaXNzaW9uX0Fzc2VtYmx5RGVzY3JpcHRvcigpLCB0aGlzLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLCB0aGlzLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpLCAiYXNzZW1ibHlEZXNjcmlwdG9yIiwgbnVsbCwgMSwgMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGVybWlzc2lvbl9Sb2xlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAicm9sZXMiLCBudWxsLCAxLCAtMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGVybWlzc2lvbl9NZXRob2RFbGVtZW50cygpLCB0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSwgbnVsbCwgIm1ldGhvZEVsZW1lbnRzIiwgbnVsbCwgMSwgLTEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICJBc3NlbWJseURlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpLCB0aGlzLmdldE1ldGhvZFBlcm1pc3Npb24oKSwgdGhpcy5nZXRNZXRob2RQZXJtaXNzaW9uX0Fzc2VtYmx5RGVzY3JpcHRvcigpLCAibWV0aG9kUGVybWlzc2lvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kVHJhbnNhY3Rpb25zKCksIHRoaXMuZ2V0TWV0aG9kVHJhbnNhY3Rpb24oKSwgdGhpcy5nZXRNZXRob2RUcmFuc2FjdGlvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgIm1ldGhvZFRyYW5zYWN0aW9ucyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9FamJKYXIoKSwgdGhpcy5nZXRFSkJKYXIoKSwgdGhpcy5nZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCksICJlamJKYXIiLCBudWxsLCAwLCAxLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9TZWN1cml0eVJvbGVzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlKCksIG51bGwsICJzZWN1cml0eVJvbGVzIiwgbnVsbCwgMCwgLTEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0V4Y2x1ZGVMaXN0KCksIHRoaXMuZ2V0RXhjbHVkZUxpc3QoKSwgbnVsbCwgImV4Y2x1ZGVMaXN0IiwgbnVsbCwgMCwgMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9ucyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RUcmFuc2FjdGlvbkVDbGFzcywgTWV0aG9kVHJhbnNhY3Rpb24uY2xhc3MsICJNZXRob2RUcmFuc2FjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVHJhbnNhY3Rpb25fVHJhbnNhY3Rpb25BdHRyaWJ1dGUoKSwgdGhpcy5nZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUoKSwgInRyYW5zYWN0aW9uQXR0cmlidXRlIiwgbnVsbCwgMCwgMSwgTWV0aG9kVHJhbnNhY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVHJhbnNhY3Rpb25fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgTWV0aG9kVHJhbnNhY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFRyYW5zYWN0aW9uX0Fzc2VtYmx5RGVzY3JpcHRvcigpLCB0aGlzLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpLCB0aGlzLmdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RUcmFuc2FjdGlvbnMoKSwgImFzc2VtYmx5RGVzY3JpcHRvciIsIG51bGwsIDEsIDEsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RUcmFuc2FjdGlvbl9NZXRob2RFbGVtZW50cygpLCB0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSwgbnVsbCwgIm1ldGhvZEVsZW1lbnRzIiwgbnVsbCwgMSwgLTEsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RUcmFuc2FjdGlvbl9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2Vzc2lvbkVDbGFzcywgU2Vzc2lvbi5jbGFzcywgIlNlc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25fVHJhbnNhY3Rpb25UeXBlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25UeXBlKCksICJ0cmFuc2FjdGlvblR5cGUiLCBudWxsLCAwLCAxLCBTZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlc3Npb25fU2Vzc2lvblR5cGUoKSwgdGhpcy5nZXRTZXNzaW9uVHlwZSgpLCAic2Vzc2lvblR5cGUiLCBudWxsLCAwLCAxLCBTZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25fU2VydmljZUVuZHBvaW50KCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAic2VydmljZUVuZHBvaW50IiwgbnVsbCwgMCwgMSwgU2Vzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVudGl0eUVDbGFzcywgRW50aXR5LmNsYXNzLCAiRW50aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlfUmVlbnRyYW50KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVlbnRyYW50IiwgbnVsbCwgMCwgMSwgRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eV9QcmltYXJ5S2V5KCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAicHJpbWFyeUtleSIsIG51bGwsIDEsIDEsIEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVudGVycHJpc2VCZWFuRUNsYXNzLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIkVudGVycHJpc2VCZWFuIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVudGVycHJpc2VCZWFuX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fU2VjdXJpdHlSb2xlUmVmcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFNlY3VyaXR5Um9sZVJlZigpLCBudWxsLCAic2VjdXJpdHlSb2xlUmVmcyIsIG51bGwsIDAsIC0xLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fRWpiQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJlamJDbGFzcyIsIG51bGwsIDEsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbl9Ib21lSW50ZXJmYWNlKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiaG9tZUludGVyZmFjZSIsIG51bGwsIDEsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJyZW1vdGVJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fRWpiSmFyKCksIHRoaXMuZ2V0RUpCSmFyKCksIHRoaXMuZ2V0RUpCSmFyX0VudGVycHJpc2VCZWFucygpLCAiZWpiSmFyIiwgbnVsbCwgMSwgMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5SWRlbnRpdHkoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRTZWN1cml0eUlkZW50aXR5KCksIG51bGwsICJzZWN1cml0eUlkZW50aXR5IiwgbnVsbCwgMCwgMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX0xvY2FsSG9tZUludGVyZmFjZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImxvY2FsSG9tZUludGVyZmFjZSIsIG51bGwsIDAsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImxvY2FsSW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlamJNZXRob2RDYXRlZ29yeUVDbGFzcywgRUpCTWV0aG9kQ2F0ZWdvcnkuY2xhc3MsICJFSkJNZXRob2RDYXRlZ29yeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGVqYkphckVDbGFzcywgRUpCSmFyLmNsYXNzLCAiRUpCSmFyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJKYXJfRWpiQ2xpZW50SmFyKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlamJDbGllbnRKYXIiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVKQkphcl9WZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZXJzaW9uIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCksIHRoaXMuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCksIHRoaXMuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0VqYkphcigpLCAiYXNzZW1ibHlEZXNjcmlwdG9yIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCksIHRoaXMuZ2V0RW50ZXJwcmlzZUJlYW4oKSwgdGhpcy5nZXRFbnRlcnByaXNlQmVhbl9FamJKYXIoKSwgImVudGVycHJpc2VCZWFucyIsIG51bGwsIDEsIC0xLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVKQkphcl9SZWxhdGlvbnNoaXBMaXN0KCksIHRoaXMuZ2V0UmVsYXRpb25zaGlwcygpLCB0aGlzLmdldFJlbGF0aW9uc2hpcHNfRWpiSmFyKCksICJyZWxhdGlvbnNoaXBMaXN0IiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kRWxlbWVudEVDbGFzcywgTWV0aG9kRWxlbWVudC5jbGFzcywgIk1ldGhvZEVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfUGFybXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcm1zIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kRWxlbWVudF9UeXBlKCksIHRoaXMuZ2V0TWV0aG9kRWxlbWVudEtpbmQoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kRWxlbWVudF9FbnRlcnByaXNlQmVhbigpLCB0aGlzLmdldEVudGVycHJpc2VCZWFuKCksIG51bGwsICJlbnRlcnByaXNlQmVhbiIsIG51bGwsIDEsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZEVsZW1lbnRfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY21wQXR0cmlidXRlRUNsYXNzLCBDTVBBdHRyaWJ1dGUuY2xhc3MsICJDTVBBdHRyaWJ1dGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBDTVBBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENNUEF0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIENNUEF0dHJpYnV0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJlbGF0aW9uc2hpcHNFQ2xhc3MsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICJSZWxhdGlvbnNoaXBzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aW9uc2hpcHNfRWpiSmFyKCksIHRoaXMuZ2V0RUpCSmFyKCksIHRoaXMuZ2V0RUpCSmFyX1JlbGF0aW9uc2hpcExpc3QoKSwgImVqYkphciIsIG51bGwsIDEsIDEsIFJlbGF0aW9uc2hpcHMuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCksIHRoaXMuZ2V0RUpCUmVsYXRpb24oKSwgdGhpcy5nZXRFSkJSZWxhdGlvbl9SZWxhdGlvbnNoaXBMaXN0KCksICJlamJSZWxhdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVsYXRpb25zaGlwcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhxdWVyeUVDbGFzcywgUXVlcnkuY2xhc3MsICJRdWVyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UXVlcnlfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFF1ZXJ5X0VqYlFMKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlamJRTCIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRRdWVyeV9SZXR1cm5UeXBlTWFwcGluZygpLCB0aGlzLmdldFJldHVyblR5cGVNYXBwaW5nKCksICJyZXR1cm5UeXBlTWFwcGluZyIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5X1F1ZXJ5TWV0aG9kKCksIHRoaXMuZ2V0UXVlcnlNZXRob2QoKSwgdGhpcy5nZXRRdWVyeU1ldGhvZF9RdWVyeSgpLCAicXVlcnlNZXRob2QiLCBudWxsLCAxLCAxLCBRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UXVlcnlfRW50aXR5KCksIHRoaXMuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpLCB0aGlzLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUXVlcmllcygpLCAiZW50aXR5IiwgbnVsbCwgMCwgMSwgUXVlcnkuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5X0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlamJSZWxhdGlvbkVDbGFzcywgRUpCUmVsYXRpb24uY2xhc3MsICJFSkJSZWxhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25fUmVsYXRpb25zaGlwTGlzdCgpLCB0aGlzLmdldFJlbGF0aW9uc2hpcHMoKSwgdGhpcy5nZXRSZWxhdGlvbnNoaXBzX0VqYlJlbGF0aW9ucygpLCAicmVsYXRpb25zaGlwTGlzdCIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbl9SZWxhdGlvbnNoaXBSb2xlcygpLCB0aGlzLmdldEVKQlJlbGF0aW9uc2hpcFJvbGUoKSwgdGhpcy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1JlbGF0aW9uc2hpcCgpLCAicmVsYXRpb25zaGlwUm9sZXMiLCBudWxsLCAyLCAyLCBFSkJSZWxhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25fRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFSkJSZWxhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICJFSkJSZWxhdGlvbnNoaXBSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfUm9sZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJvbGVOYW1lIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9NdWx0aXBsaWNpdHkoKSwgdGhpcy5nZXRNdWx0aXBsaWNpdHlLaW5kKCksICJtdWx0aXBsaWNpdHkiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ2FzY2FkZURlbGV0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImNhc2NhZGVEZWxldGUiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfUmVsYXRpb25zaGlwKCksIHRoaXMuZ2V0RUpCUmVsYXRpb24oKSwgdGhpcy5nZXRFSkJSZWxhdGlvbl9SZWxhdGlvbnNoaXBSb2xlcygpLCAicmVsYXRpb25zaGlwIiwgbnVsbCwgMSwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9Tb3VyY2UoKSwgdGhpcy5nZXRSb2xlU291cmNlKCksIHRoaXMuZ2V0Um9sZVNvdXJjZV9Sb2xlKCksICJzb3VyY2UiLCBudWxsLCAxLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0NtckZpZWxkKCksIHRoaXMuZ2V0Q01SRmllbGQoKSwgdGhpcy5nZXRDTVJGaWVsZF9Sb2xlKCksICJjbXJGaWVsZCIsIG51bGwsIDEsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9sZVNvdXJjZUVDbGFzcywgUm9sZVNvdXJjZS5jbGFzcywgIlJvbGVTb3VyY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVTb3VyY2VfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgUm9sZVNvdXJjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Um9sZVNvdXJjZV9Sb2xlKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpLCB0aGlzLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfU291cmNlKCksICJyb2xlIiwgbnVsbCwgMSwgMSwgUm9sZVNvdXJjZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Um9sZVNvdXJjZV9FbnRpdHlCZWFuKCksIHRoaXMuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eSgpLCBudWxsLCAiZW50aXR5QmVhbiIsIG51bGwsIDEsIDEsIFJvbGVTb3VyY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJvbGVTb3VyY2VfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBSb2xlU291cmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY21yRmllbGRFQ2xhc3MsIENNUkZpZWxkLmNsYXNzLCAiQ01SRmllbGQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENNUkZpZWxkX1JvbGUoKSwgdGhpcy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9DbXJGaWVsZCgpLCAicm9sZSIsIG51bGwsIDAsIDEsIENNUkZpZWxkLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDTVJGaWVsZF9Db2xsZWN0aW9uVHlwZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImNvbGxlY3Rpb25UeXBlIiwgbnVsbCwgMCwgMSwgQ01SRmllbGQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXNzYWdlRHJpdmVuRUNsYXNzLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAiTWVzc2FnZURyaXZlbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbl9UcmFuc2FjdGlvblR5cGUoKSwgdGhpcy5nZXRUcmFuc2FjdGlvblR5cGUoKSwgInRyYW5zYWN0aW9uVHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlU2VsZWN0b3IoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1lc3NhZ2VTZWxlY3RvciIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5fQWNrbm93bGVkZ2VNb2RlKCksIHRoaXMuZ2V0QWNrbm93bGVkZ2VNb2RlKCksICJhY2tub3dsZWRnZU1vZGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5fTGluaygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGluayIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5fRGVzdGluYXRpb24oKSwgdGhpcy5nZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24oKSwgdGhpcy5nZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fQmVhbigpLCAiZGVzdGluYXRpb24iLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuX0FjdGl2YXRpb25Db25maWcoKSwgdGhpcy5nZXRBY3RpdmF0aW9uQ29uZmlnKCksIG51bGwsICJhY3RpdmF0aW9uQ29uZmlnIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlRGVzdGluYXRpb24oKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb24iLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuX01lc3NhZ2luZ1R5cGUoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJtZXNzYWdpbmdUeXBlIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkVDbGFzcywgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uLmNsYXNzLCAiTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fVHlwZSgpLCB0aGlzLmdldERlc3RpbmF0aW9uVHlwZSgpLCAidHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fU3Vic2NyaXB0aW9uRHVyYWJpbGl0eSgpLCB0aGlzLmdldFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kKCksICJzdWJzY3JpcHRpb25EdXJhYmlsaXR5IiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbl9CZWFuKCksIHRoaXMuZ2V0TWVzc2FnZURyaXZlbigpLCB0aGlzLmdldE1lc3NhZ2VEcml2ZW5fRGVzdGluYXRpb24oKSwgImJlYW4iLCBudWxsLCAxLCAxLCBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhleGNsdWRlTGlzdEVDbGFzcywgRXhjbHVkZUxpc3QuY2xhc3MsICJFeGNsdWRlTGlzdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgRXhjbHVkZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEV4Y2x1ZGVMaXN0X01ldGhvZEVsZW1lbnRzKCksIHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpLCBudWxsLCAibWV0aG9kRWxlbWVudHMiLCBudWxsLCAxLCAtMSwgRXhjbHVkZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEV4Y2x1ZGVMaXN0X0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgRXhjbHVkZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhxdWVyeU1ldGhvZEVDbGFzcywgUXVlcnlNZXRob2QuY2xhc3MsICJRdWVyeU1ldGhvZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UXVlcnlNZXRob2RfUXVlcnkoKSwgdGhpcy5nZXRRdWVyeSgpLCB0aGlzLmdldFF1ZXJ5X1F1ZXJ5TWV0aG9kKCksICJxdWVyeSIsIG51bGwsIDEsIDEsIFF1ZXJ5TWV0aG9kLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuY2xhc3MsICJBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYWN0aXZhdGlvbkNvbmZpZ0VDbGFzcywgQWN0aXZhdGlvbkNvbmZpZy5jbGFzcywgIkFjdGl2YXRpb25Db25maWciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFjdGl2YXRpb25Db25maWdfQ29uZmlnUHJvcGVydGllcygpLCB0aGlzLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpLCBudWxsLCAiY29uZmlnUHJvcGVydGllcyIsIG51bGwsIDEsIC0xLCBBY3RpdmF0aW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBY3RpdmF0aW9uQ29uZmlnX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQWN0aXZhdGlvbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0odHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5jbGFzcywgIlRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5OT1RfU1VQUE9SVEVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5TVVBQT1JUU19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuUkVRVUlSRURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLlJFUVVJUkVTX05FV19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTUFOREFUT1JZX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5ORVZFUl9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0odHJhbnNhY3Rpb25UeXBlRUVudW0sIFRyYW5zYWN0aW9uVHlwZS5jbGFzcywgIlRyYW5zYWN0aW9uVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25UeXBlRUVudW0sIFRyYW5zYWN0aW9uVHlwZS5CRUFOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25UeXBlRUVudW0sIFRyYW5zYWN0aW9uVHlwZS5DT05UQUlORVJfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHNlc3Npb25UeXBlRUVudW0sIFNlc3Npb25UeXBlLmNsYXNzLCAiU2Vzc2lvblR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHNlc3Npb25UeXBlRUVudW0sIFNlc3Npb25UeXBlLlNUQVRFRlVMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoc2Vzc2lvblR5cGVFRW51bSwgU2Vzc2lvblR5cGUuU1RBVEVMRVNTX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5jbGFzcywgIk1ldGhvZEVsZW1lbnRLaW5kIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG1ldGhvZEVsZW1lbnRLaW5kRUVudW0sIE1ldGhvZEVsZW1lbnRLaW5kLlJFTU9URV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG1ldGhvZEVsZW1lbnRLaW5kRUVudW0sIE1ldGhvZEVsZW1lbnRLaW5kLkhPTUVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5MT0NBTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKG1ldGhvZEVsZW1lbnRLaW5kRUVudW0sIE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0hPTUVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5TRVJWSUNFX0VORFBPSU5UX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShhY2tub3dsZWRnZU1vZGVFRW51bSwgQWNrbm93bGVkZ2VNb2RlLmNsYXNzLCAiQWNrbm93bGVkZ2VNb2RlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChhY2tub3dsZWRnZU1vZGVFRW51bSwgQWNrbm93bGVkZ2VNb2RlLkFVVE9fQUNLTk9XTEVER0VfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChhY2tub3dsZWRnZU1vZGVFRW51bSwgQWNrbm93bGVkZ2VNb2RlLkRVUFNfT0tfQUNLTk9XTEVER0VfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kRUVudW0sIFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kLmNsYXNzLCAiU3Vic2NyaXB0aW9uRHVyYWJpbGl0eUtpbmQiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kRUVudW0sIFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kLkRVUkFCTEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChzdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEVFbnVtLCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5OT05fRFVSQUJMRV9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0ocmV0dXJuVHlwZU1hcHBpbmdFRW51bSwgUmV0dXJuVHlwZU1hcHBpbmcuY2xhc3MsICJSZXR1cm5UeXBlTWFwcGluZyIpOwotCQlhZGRFRW51bUxpdGVyYWwocmV0dXJuVHlwZU1hcHBpbmdFRW51bSwgUmV0dXJuVHlwZU1hcHBpbmcuTE9DQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXR1cm5UeXBlTWFwcGluZ0VFbnVtLCBSZXR1cm5UeXBlTWFwcGluZy5SRU1PVEVfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGRlc3RpbmF0aW9uVHlwZUVFbnVtLCBEZXN0aW5hdGlvblR5cGUuY2xhc3MsICJEZXN0aW5hdGlvblR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRlc3RpbmF0aW9uVHlwZUVFbnVtLCBEZXN0aW5hdGlvblR5cGUuUVVFVUVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkZXN0aW5hdGlvblR5cGVFRW51bSwgRGVzdGluYXRpb25UeXBlLlRPUElDX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShtdWx0aXBsaWNpdHlLaW5kRUVudW0sIE11bHRpcGxpY2l0eUtpbmQuY2xhc3MsICJNdWx0aXBsaWNpdHlLaW5kIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChtdWx0aXBsaWNpdHlLaW5kRUVudW0sIE11bHRpcGxpY2l0eUtpbmQuT05FX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwobXVsdGlwbGljaXR5S2luZEVFbnVtLCBNdWx0aXBsaWNpdHlLaW5kLk1BTllfTElURVJBTCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCQlib29sZWFuIGhhc0xvY2sgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCWhhc0xvY2sgPSBKMkVFSW5pdC5hcXVpcmVJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJfQkJCisJCQorCQl0cnl7CisJCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCQljb250YWluZXJNYW5hZ2VkRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RW50aXR5KCkpOworCQkJbWV0aG9kUGVybWlzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQltZXRob2RUcmFuc2FjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJc2Vzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVudGVycHJpc2VCZWFuKCkpOworCQkJZW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RW50ZXJwcmlzZUJlYW4oKSk7CisJCQllbnRlcnByaXNlQmVhbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEpORElFbnZSZWZzR3JvdXAoKSk7CisJCQllamJNZXRob2RDYXRlZ29yeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJZWpiSmFyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7CisJCQltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQljbXBBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRUF0dHJpYnV0ZSgpKTsKKwkJCXJlbGF0aW9uc2hpcHNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCXF1ZXJ5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQllamJSZWxhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJZWpiUmVsYXRpb25zaGlwUm9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJcm9sZVNvdXJjZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJY21yRmllbGRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDTVBBdHRyaWJ1dGUoKSk7CisJCQltZXNzYWdlRHJpdmVuRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RW50ZXJwcmlzZUJlYW4oKSk7CisJCQltZXNzYWdlRHJpdmVuRGVzdGluYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCWV4Y2x1ZGVMaXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQlxdWVyeU1ldGhvZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7CisJCQlhY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCWFjdGl2YXRpb25Db25maWdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkKKwkJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCQlpbml0RUNsYXNzKGNvbnRhaW5lck1hbmFnZWRFbnRpdHlFQ2xhc3MsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICJDb250YWluZXJNYW5hZ2VkRW50aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlcnNpb24iLCAiMi54IiwgMCwgMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X0Fic3RyYWN0U2NoZW1hTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWJzdHJhY3RTY2hlbWFOYW1lIiwgbnVsbCwgMCwgMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QZXJzaXN0ZW50QXR0cmlidXRlcygpLCB0aGlzLmdldENNUEF0dHJpYnV0ZSgpLCBudWxsLCAicGVyc2lzdGVudEF0dHJpYnV0ZXMiLCBudWxsLCAwLCAtMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9LZXlBdHRyaWJ1dGVzKCksIHRoaXMuZ2V0Q01QQXR0cmlidXRlKCksIG51bGwsICJrZXlBdHRyaWJ1dGVzIiwgbnVsbCwgMCwgLTEsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfUXVlcmllcygpLCB0aGlzLmdldFF1ZXJ5KCksIHRoaXMuZ2V0UXVlcnlfRW50aXR5KCksICJxdWVyaWVzIiwgbnVsbCwgMCwgLTEsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldENvbnRhaW5lck1hbmFnZWRFbnRpdHlfQ01QQXR0cmlidXRlKCksIHRoaXMuZ2V0Q01QQXR0cmlidXRlKCksIG51bGwsICJDTVBBdHRyaWJ1dGUiLCBudWxsLCAwLCAtMSwgQ29udGFpbmVyTWFuYWdlZEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9QcmltS2V5RmllbGQoKSwgdGhpcy5nZXRDTVBBdHRyaWJ1dGUoKSwgbnVsbCwgInByaW1LZXlGaWVsZCIsIG51bGwsIDAsIDEsIENvbnRhaW5lck1hbmFnZWRFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MobWV0aG9kUGVybWlzc2lvbkVDbGFzcywgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIk1ldGhvZFBlcm1pc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBlcm1pc3Npb25fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGVybWlzc2lvbl9VbmNoZWNrZWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ1bmNoZWNrZWQiLCBudWxsLCAwLCAxLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBlcm1pc3Npb25fQXNzZW1ibHlEZXNjcmlwdG9yKCksIHRoaXMuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCksIHRoaXMuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX01ldGhvZFBlcm1pc3Npb25zKCksICJhc3NlbWJseURlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQZXJtaXNzaW9uX1JvbGVzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlKCksIG51bGwsICJyb2xlcyIsIG51bGwsIDEsIC0xLCBNZXRob2RQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQZXJtaXNzaW9uX01ldGhvZEVsZW1lbnRzKCksIHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpLCBudWxsLCAibWV0aG9kRWxlbWVudHMiLCBudWxsLCAxLCAtMSwgTWV0aG9kUGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoYXNzZW1ibHlEZXNjcmlwdG9yRUNsYXNzLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICJBc3NlbWJseURlc2NyaXB0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9NZXRob2RQZXJtaXNzaW9ucygpLCB0aGlzLmdldE1ldGhvZFBlcm1pc3Npb24oKSwgdGhpcy5nZXRNZXRob2RQZXJtaXNzaW9uX0Fzc2VtYmx5RGVzY3JpcHRvcigpLCAibWV0aG9kUGVybWlzc2lvbnMiLCBudWxsLCAwLCAtMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kVHJhbnNhY3Rpb25zKCksIHRoaXMuZ2V0TWV0aG9kVHJhbnNhY3Rpb24oKSwgdGhpcy5nZXRNZXRob2RUcmFuc2FjdGlvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgIm1ldGhvZFRyYW5zYWN0aW9ucyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9FamJKYXIoKSwgdGhpcy5nZXRFSkJKYXIoKSwgdGhpcy5nZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCksICJlamJKYXIiLCBudWxsLCAwLCAxLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFzc2VtYmx5RGVzY3JpcHRvcl9TZWN1cml0eVJvbGVzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlKCksIG51bGwsICJzZWN1cml0eVJvbGVzIiwgbnVsbCwgMCwgLTEsIEFzc2VtYmx5RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0V4Y2x1ZGVMaXN0KCksIHRoaXMuZ2V0RXhjbHVkZUxpc3QoKSwgbnVsbCwgImV4Y2x1ZGVMaXN0IiwgbnVsbCwgMCwgMSwgQXNzZW1ibHlEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBc3NlbWJseURlc2NyaXB0b3JfTWVzc2FnZURlc3RpbmF0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9ucyIsIG51bGwsIDAsIC0xLCBBc3NlbWJseURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MobWV0aG9kVHJhbnNhY3Rpb25FQ2xhc3MsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAiTWV0aG9kVHJhbnNhY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFRyYW5zYWN0aW9uX1RyYW5zYWN0aW9uQXR0cmlidXRlKCksIHRoaXMuZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlKCksICJ0cmFuc2FjdGlvbkF0dHJpYnV0ZSIsIG51bGwsIDAsIDEsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFRyYW5zYWN0aW9uX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIE1ldGhvZFRyYW5zYWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RUcmFuc2FjdGlvbl9Bc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3IoKSwgdGhpcy5nZXRBc3NlbWJseURlc2NyaXB0b3JfTWV0aG9kVHJhbnNhY3Rpb25zKCksICJhc3NlbWJseURlc2NyaXB0b3IiLCBudWxsLCAxLCAxLCBNZXRob2RUcmFuc2FjdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kVHJhbnNhY3Rpb25fTWV0aG9kRWxlbWVudHMoKSwgdGhpcy5nZXRNZXRob2RFbGVtZW50KCksIG51bGwsICJtZXRob2RFbGVtZW50cyIsIG51bGwsIDEsIC0xLCBNZXRob2RUcmFuc2FjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kVHJhbnNhY3Rpb25fRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RUcmFuc2FjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhzZXNzaW9uRUNsYXNzLCBTZXNzaW9uLmNsYXNzLCAiU2Vzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbl9UcmFuc2FjdGlvblR5cGUoKSwgdGhpcy5nZXRUcmFuc2FjdGlvblR5cGUoKSwgInRyYW5zYWN0aW9uVHlwZSIsIG51bGwsIDAsIDEsIFNlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbl9TZXNzaW9uVHlwZSgpLCB0aGlzLmdldFNlc3Npb25UeXBlKCksICJzZXNzaW9uVHlwZSIsIG51bGwsIDAsIDEsIFNlc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbl9TZXJ2aWNlRW5kcG9pbnQoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJzZXJ2aWNlRW5kcG9pbnQiLCBudWxsLCAwLCAxLCBTZXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGVudGl0eUVDbGFzcywgRW50aXR5LmNsYXNzLCAiRW50aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlfUmVlbnRyYW50KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVlbnRyYW50IiwgbnVsbCwgMCwgMSwgRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eV9QcmltYXJ5S2V5KCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAicHJpbWFyeUtleSIsIG51bGwsIDEsIDEsIEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhlbnRlcnByaXNlQmVhbkVDbGFzcywgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICJFbnRlcnByaXNlQmVhbiIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRlcnByaXNlQmVhbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRTZWN1cml0eVJvbGVSZWYoKSwgbnVsbCwgInNlY3VyaXR5Um9sZVJlZnMiLCBudWxsLCAwLCAtMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX0VqYkNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiZWpiQ2xhc3MiLCBudWxsLCAxLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fSG9tZUludGVyZmFjZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImhvbWVJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fUmVtb3RlSW50ZXJmYWNlKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAicmVtb3RlSW50ZXJmYWNlIiwgbnVsbCwgMSwgMSwgRW50ZXJwcmlzZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVudGVycHJpc2VCZWFuX0VqYkphcigpLCB0aGlzLmdldEVKQkphcigpLCB0aGlzLmdldEVKQkphcl9FbnRlcnByaXNlQmVhbnMoKSwgImVqYkphciIsIG51bGwsIDEsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbl9TZWN1cml0eUlkZW50aXR5KCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlJZGVudGl0eSgpLCBudWxsLCAic2VjdXJpdHlJZGVudGl0eSIsIG51bGwsIDAsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEhvbWVJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJsb2NhbEhvbWVJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBFbnRlcnByaXNlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RW50ZXJwcmlzZUJlYW5fTG9jYWxJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJsb2NhbEludGVyZmFjZSIsIG51bGwsIDAsIDEsIEVudGVycHJpc2VCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGVqYk1ldGhvZENhdGVnb3J5RUNsYXNzLCBFSkJNZXRob2RDYXRlZ29yeS5jbGFzcywgIkVKQk1ldGhvZENhdGVnb3J5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGVqYkphckVDbGFzcywgRUpCSmFyLmNsYXNzLCAiRUpCSmFyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJKYXJfRWpiQ2xpZW50SmFyKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlamJDbGllbnRKYXIiLCBudWxsLCAwLCAxLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVKQkphcl9WZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZXJzaW9uIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfQXNzZW1ibHlEZXNjcmlwdG9yKCksIHRoaXMuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCksIHRoaXMuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yX0VqYkphcigpLCAiYXNzZW1ibHlEZXNjcmlwdG9yIiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFSkJKYXJfRW50ZXJwcmlzZUJlYW5zKCksIHRoaXMuZ2V0RW50ZXJwcmlzZUJlYW4oKSwgdGhpcy5nZXRFbnRlcnByaXNlQmVhbl9FamJKYXIoKSwgImVudGVycHJpc2VCZWFucyIsIG51bGwsIDEsIC0xLCBFSkJKYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVKQkphcl9SZWxhdGlvbnNoaXBMaXN0KCksIHRoaXMuZ2V0UmVsYXRpb25zaGlwcygpLCB0aGlzLmdldFJlbGF0aW9uc2hpcHNfRWpiSmFyKCksICJyZWxhdGlvbnNoaXBMaXN0IiwgbnVsbCwgMCwgMSwgRUpCSmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICJNZXRob2RFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X1Bhcm1zKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJtcyIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfVHlwZSgpLCB0aGlzLmdldE1ldGhvZEVsZW1lbnRLaW5kKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZEVsZW1lbnRfRW50ZXJwcmlzZUJlYW4oKSwgdGhpcy5nZXRFbnRlcnByaXNlQmVhbigpLCBudWxsLCAiZW50ZXJwcmlzZUJlYW4iLCBudWxsLCAxLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhjbXBBdHRyaWJ1dGVFQ2xhc3MsIENNUEF0dHJpYnV0ZS5jbGFzcywgIkNNUEF0dHJpYnV0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q01QQXR0cmlidXRlX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIENNUEF0dHJpYnV0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q01QQXR0cmlidXRlX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgQ01QQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHJlbGF0aW9uc2hpcHNFQ2xhc3MsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICJSZWxhdGlvbnNoaXBzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZWxhdGlvbnNoaXBzX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aW9uc2hpcHNfRWpiSmFyKCksIHRoaXMuZ2V0RUpCSmFyKCksIHRoaXMuZ2V0RUpCSmFyX1JlbGF0aW9uc2hpcExpc3QoKSwgImVqYkphciIsIG51bGwsIDEsIDEsIFJlbGF0aW9uc2hpcHMuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCksIHRoaXMuZ2V0RUpCUmVsYXRpb24oKSwgdGhpcy5nZXRFSkJSZWxhdGlvbl9SZWxhdGlvbnNoaXBMaXN0KCksICJlamJSZWxhdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVsYXRpb25zaGlwcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVsYXRpb25zaGlwc19EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFJlbGF0aW9uc2hpcHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MocXVlcnlFQ2xhc3MsIFF1ZXJ5LmNsYXNzLCAiUXVlcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFF1ZXJ5X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRRdWVyeV9FamJRTCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZWpiUUwiLCBudWxsLCAwLCAxLCBRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UXVlcnlfUmV0dXJuVHlwZU1hcHBpbmcoKSwgdGhpcy5nZXRSZXR1cm5UeXBlTWFwcGluZygpLCAicmV0dXJuVHlwZU1hcHBpbmciLCBudWxsLCAwLCAxLCBRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRRdWVyeV9RdWVyeU1ldGhvZCgpLCB0aGlzLmdldFF1ZXJ5TWV0aG9kKCksIHRoaXMuZ2V0UXVlcnlNZXRob2RfUXVlcnkoKSwgInF1ZXJ5TWV0aG9kIiwgbnVsbCwgMSwgMSwgUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFF1ZXJ5X0VudGl0eSgpLCB0aGlzLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSwgdGhpcy5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1F1ZXJpZXMoKSwgImVudGl0eSIsIG51bGwsIDAsIDEsIFF1ZXJ5LmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRRdWVyeV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGVqYlJlbGF0aW9uRUNsYXNzLCBFSkJSZWxhdGlvbi5jbGFzcywgIkVKQlJlbGF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25fTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbl9SZWxhdGlvbnNoaXBMaXN0KCksIHRoaXMuZ2V0UmVsYXRpb25zaGlwcygpLCB0aGlzLmdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCksICJyZWxhdGlvbnNoaXBMaXN0IiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uX1JlbGF0aW9uc2hpcFJvbGVzKCksIHRoaXMuZ2V0RUpCUmVsYXRpb25zaGlwUm9sZSgpLCB0aGlzLmdldEVKQlJlbGF0aW9uc2hpcFJvbGVfUmVsYXRpb25zaGlwKCksICJyZWxhdGlvbnNoaXBSb2xlcyIsIG51bGwsIDIsIDIsIEVKQlJlbGF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbl9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEVKQlJlbGF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGVqYlJlbGF0aW9uc2hpcFJvbGVFQ2xhc3MsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICJFSkJSZWxhdGlvbnNoaXBSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfUm9sZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJvbGVOYW1lIiwgbnVsbCwgMCwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9NdWx0aXBsaWNpdHkoKSwgdGhpcy5nZXRNdWx0aXBsaWNpdHlLaW5kKCksICJtdWx0aXBsaWNpdHkiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfQ2FzY2FkZURlbGV0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImNhc2NhZGVEZWxldGUiLCBudWxsLCAwLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfUmVsYXRpb25zaGlwKCksIHRoaXMuZ2V0RUpCUmVsYXRpb24oKSwgdGhpcy5nZXRFSkJSZWxhdGlvbl9SZWxhdGlvbnNoaXBSb2xlcygpLCAicmVsYXRpb25zaGlwIiwgbnVsbCwgMSwgMSwgRUpCUmVsYXRpb25zaGlwUm9sZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUpCUmVsYXRpb25zaGlwUm9sZV9Tb3VyY2UoKSwgdGhpcy5nZXRSb2xlU291cmNlKCksIHRoaXMuZ2V0Um9sZVNvdXJjZV9Sb2xlKCksICJzb3VyY2UiLCBudWxsLCAxLCAxLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0NtckZpZWxkKCksIHRoaXMuZ2V0Q01SRmllbGQoKSwgdGhpcy5nZXRDTVJGaWVsZF9Sb2xlKCksICJjbXJGaWVsZCIsIG51bGwsIDEsIDEsIEVKQlJlbGF0aW9uc2hpcFJvbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVKQlJlbGF0aW9uc2hpcFJvbGVfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFSkJSZWxhdGlvbnNoaXBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHJvbGVTb3VyY2VFQ2xhc3MsIFJvbGVTb3VyY2UuY2xhc3MsICJSb2xlU291cmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFJvbGVTb3VyY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJvbGVTb3VyY2VfUm9sZSgpLCB0aGlzLmdldEVKQlJlbGF0aW9uc2hpcFJvbGUoKSwgdGhpcy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX1NvdXJjZSgpLCAicm9sZSIsIG51bGwsIDEsIDEsIFJvbGVTb3VyY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJvbGVTb3VyY2VfRW50aXR5QmVhbigpLCB0aGlzLmdldENvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSwgbnVsbCwgImVudGl0eUJlYW4iLCBudWxsLCAxLCAxLCBSb2xlU291cmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRSb2xlU291cmNlX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUm9sZVNvdXJjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhjbXJGaWVsZEVDbGFzcywgQ01SRmllbGQuY2xhc3MsICJDTVJGaWVsZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q01SRmllbGRfUm9sZSgpLCB0aGlzLmdldEVKQlJlbGF0aW9uc2hpcFJvbGUoKSwgdGhpcy5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlX0NtckZpZWxkKCksICJyb2xlIiwgbnVsbCwgMCwgMSwgQ01SRmllbGQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldENNUkZpZWxkX0NvbGxlY3Rpb25UeXBlKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiY29sbGVjdGlvblR5cGUiLCBudWxsLCAwLCAxLCBDTVJGaWVsZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhtZXNzYWdlRHJpdmVuRUNsYXNzLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAiTWVzc2FnZURyaXZlbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbl9UcmFuc2FjdGlvblR5cGUoKSwgdGhpcy5nZXRUcmFuc2FjdGlvblR5cGUoKSwgInRyYW5zYWN0aW9uVHlwZSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlU2VsZWN0b3IoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1lc3NhZ2VTZWxlY3RvciIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5fQWNrbm93bGVkZ2VNb2RlKCksIHRoaXMuZ2V0QWNrbm93bGVkZ2VNb2RlKCksICJhY2tub3dsZWRnZU1vZGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE1lc3NhZ2VEcml2ZW5fTGluaygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGluayIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VEcml2ZW5fRGVzdGluYXRpb24oKSwgdGhpcy5nZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24oKSwgdGhpcy5nZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fQmVhbigpLCAiZGVzdGluYXRpb24iLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuX0FjdGl2YXRpb25Db25maWcoKSwgdGhpcy5nZXRBY3RpdmF0aW9uQ29uZmlnKCksIG51bGwsICJhY3RpdmF0aW9uQ29uZmlnIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWVzc2FnZURyaXZlbl9NZXNzYWdlRGVzdGluYXRpb24oKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJtZXNzYWdlRGVzdGluYXRpb24iLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuX01lc3NhZ2luZ1R5cGUoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJtZXNzYWdpbmdUeXBlIiwgbnVsbCwgMCwgMSwgTWVzc2FnZURyaXZlbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhtZXNzYWdlRHJpdmVuRGVzdGluYXRpb25FQ2xhc3MsIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5jbGFzcywgIk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1R5cGUoKSwgdGhpcy5nZXREZXN0aW5hdGlvblR5cGUoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uX1N1YnNjcmlwdGlvbkR1cmFiaWxpdHkoKSwgdGhpcy5nZXRTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZCgpLCAic3Vic2NyaXB0aW9uRHVyYWJpbGl0eSIsIG51bGwsIDAsIDEsIE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25fQmVhbigpLCB0aGlzLmdldE1lc3NhZ2VEcml2ZW4oKSwgdGhpcy5nZXRNZXNzYWdlRHJpdmVuX0Rlc3RpbmF0aW9uKCksICJiZWFuIiwgbnVsbCwgMSwgMSwgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGV4Y2x1ZGVMaXN0RUNsYXNzLCBFeGNsdWRlTGlzdC5jbGFzcywgIkV4Y2x1ZGVMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFeGNsdWRlTGlzdF9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBFeGNsdWRlTGlzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXhjbHVkZUxpc3RfTWV0aG9kRWxlbWVudHMoKSwgdGhpcy5nZXRNZXRob2RFbGVtZW50KCksIG51bGwsICJtZXRob2RFbGVtZW50cyIsIG51bGwsIDEsIC0xLCBFeGNsdWRlTGlzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXhjbHVkZUxpc3RfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBFeGNsdWRlTGlzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhxdWVyeU1ldGhvZEVDbGFzcywgUXVlcnlNZXRob2QuY2xhc3MsICJRdWVyeU1ldGhvZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UXVlcnlNZXRob2RfUXVlcnkoKSwgdGhpcy5nZXRRdWVyeSgpLCB0aGlzLmdldFF1ZXJ5X1F1ZXJ5TWV0aG9kKCksICJxdWVyeSIsIG51bGwsIDEsIDEsIFF1ZXJ5TWV0aG9kLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUVDbGFzcywgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAiQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhhY3RpdmF0aW9uQ29uZmlnRUNsYXNzLCBBY3RpdmF0aW9uQ29uZmlnLmNsYXNzLCAiQWN0aXZhdGlvbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QWN0aXZhdGlvbkNvbmZpZ19Db25maWdQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCksIG51bGwsICJjb25maWdQcm9wZXJ0aWVzIiwgbnVsbCwgMSwgLTEsIEFjdGl2YXRpb25Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFjdGl2YXRpb25Db25maWdfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBBY3RpdmF0aW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscworCQkJaW5pdEVFbnVtKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuY2xhc3MsICJUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuTk9UX1NVUFBPUlRFRF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGVFRW51bSwgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlLlNVUFBPUlRTX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZUVFbnVtLCBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuUkVRVUlSRURfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5SRVFVSVJFU19ORVdfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5NQU5EQVRPUllfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlRUVudW0sIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5ORVZFUl9MSVRFUkFMKTsKKwkKKwkJCWluaXRFRW51bSh0cmFuc2FjdGlvblR5cGVFRW51bSwgVHJhbnNhY3Rpb25UeXBlLmNsYXNzLCAiVHJhbnNhY3Rpb25UeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvblR5cGVFRW51bSwgVHJhbnNhY3Rpb25UeXBlLkJFQU5fTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25UeXBlRUVudW0sIFRyYW5zYWN0aW9uVHlwZS5DT05UQUlORVJfTElURVJBTCk7CisJCisJCQlpbml0RUVudW0oc2Vzc2lvblR5cGVFRW51bSwgU2Vzc2lvblR5cGUuY2xhc3MsICJTZXNzaW9uVHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwoc2Vzc2lvblR5cGVFRW51bSwgU2Vzc2lvblR5cGUuU1RBVEVGVUxfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoc2Vzc2lvblR5cGVFRW51bSwgU2Vzc2lvblR5cGUuU1RBVEVMRVNTX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKHNlc3Npb25UeXBlRUVudW0sIFNlc3Npb25UeXBlLlNJTkdMRVRPTl9MSVRFUkFMKTsKKwkKKwkJCWluaXRFRW51bShtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5jbGFzcywgIk1ldGhvZEVsZW1lbnRLaW5kIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5SRU1PVEVfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwobWV0aG9kRWxlbWVudEtpbmRFRW51bSwgTWV0aG9kRWxlbWVudEtpbmQuSE9NRV9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5MT0NBTF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChtZXRob2RFbGVtZW50S2luZEVFbnVtLCBNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKG1ldGhvZEVsZW1lbnRLaW5kRUVudW0sIE1ldGhvZEVsZW1lbnRLaW5kLlNFUlZJQ0VfRU5EUE9JTlRfTElURVJBTCk7CisJCisJCQlpbml0RUVudW0oYWNrbm93bGVkZ2VNb2RlRUVudW0sIEFja25vd2xlZGdlTW9kZS5jbGFzcywgIkFja25vd2xlZGdlTW9kZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwoYWNrbm93bGVkZ2VNb2RlRUVudW0sIEFja25vd2xlZGdlTW9kZS5BVVRPX0FDS05PV0xFREdFX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGFja25vd2xlZGdlTW9kZUVFbnVtLCBBY2tub3dsZWRnZU1vZGUuRFVQU19PS19BQ0tOT1dMRURHRV9MSVRFUkFMKTsKKwkKKwkJCWluaXRFRW51bShzdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEVFbnVtLCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5jbGFzcywgIlN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChzdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZEVFbnVtLCBTdWJzY3JpcHRpb25EdXJhYmlsaXR5S2luZC5EVVJBQkxFX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKHN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kRUVudW0sIFN1YnNjcmlwdGlvbkR1cmFiaWxpdHlLaW5kLk5PTl9EVVJBQkxFX0xJVEVSQUwpOworCQorCQkJaW5pdEVFbnVtKHJldHVyblR5cGVNYXBwaW5nRUVudW0sIFJldHVyblR5cGVNYXBwaW5nLmNsYXNzLCAiUmV0dXJuVHlwZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKHJldHVyblR5cGVNYXBwaW5nRUVudW0sIFJldHVyblR5cGVNYXBwaW5nLkxPQ0FMX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKHJldHVyblR5cGVNYXBwaW5nRUVudW0sIFJldHVyblR5cGVNYXBwaW5nLlJFTU9URV9MSVRFUkFMKTsKKwkKKwkJCWluaXRFRW51bShkZXN0aW5hdGlvblR5cGVFRW51bSwgRGVzdGluYXRpb25UeXBlLmNsYXNzLCAiRGVzdGluYXRpb25UeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChkZXN0aW5hdGlvblR5cGVFRW51bSwgRGVzdGluYXRpb25UeXBlLlFVRVVFX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGRlc3RpbmF0aW9uVHlwZUVFbnVtLCBEZXN0aW5hdGlvblR5cGUuVE9QSUNfTElURVJBTCk7CisJCisJCQlpbml0RUVudW0obXVsdGlwbGljaXR5S2luZEVFbnVtLCBNdWx0aXBsaWNpdHlLaW5kLmNsYXNzLCAiTXVsdGlwbGljaXR5S2luZCIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwobXVsdGlwbGljaXR5S2luZEVFbnVtLCBNdWx0aXBsaWNpdHlLaW5kLk9ORV9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChtdWx0aXBsaWNpdHlLaW5kRUVudW0sIE11bHRpcGxpY2l0eUtpbmQuTUFOWV9MSVRFUkFMKTsKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiB9IC8vRWpiUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VudGVycHJpc2VCZWFuSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50ZXJwcmlzZUJlYW5JbXBsLmphdmEKaW5kZXggMGY1YzkxNC4uNzdkODRjMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50ZXJwcmlzZUJlYW5JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50ZXJwcmlzZUJlYW5JbXBsLmphdmEKQEAgLTEyMyw2ICsxMjMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuRU5URVJQUklTRV9CRUFOOwogCX0KQEAgLTM0Myw5ICszNDQsOSBAQAogCQl3aGlsZSggaXQuaGFzTmV4dCgpKXsKIAkJCUphdmFDbGFzcyAgaW50ZXJmYWNlQ2xhc3MgPSAoSmF2YUNsYXNzKWl0Lm5leHQoKTsKIAkJCVN0cmluZyBpbnRlcmZhY2VOYW1lID0gaW50ZXJmYWNlQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJaWYoICFpbnRlcmZhY2VOYW1lLmVxdWFscygiamF2YXguZWpiLk1lc3NhZ2VEcml2ZW5CZWFuIikgJiYgCi0JCQkJCSFpbnRlcmZhY2VOYW1lLmVxdWFscygiamF2YXguZWpiLkVudGl0eUJlYW4iKSYmCi0JCQkJCSFpbnRlcmZhY2VOYW1lLmVxdWFscygiamF2YXguZWpiLlNlc3Npb25CZWFuIikpeworCQkJaWYoICFpbnRlcmZhY2VOYW1lLmVxdWFscygiamF2YXguZWpiLk1lc3NhZ2VEcml2ZW5CZWFuIikgJiYgIC8vJE5PTi1OTFMtMSQKKwkJCQkJIWludGVyZmFjZU5hbWUuZXF1YWxzKCJqYXZheC5lamIuRW50aXR5QmVhbiIpJiYgLy8kTk9OLU5MUy0xJAorCQkJCQkhaW50ZXJmYWNlTmFtZS5lcXVhbHMoImphdmF4LmVqYi5TZXNzaW9uQmVhbiIpKXsgLy8kTk9OLU5MUy0xJAogCQkJCXJlc3VsdC5hZGRBbGwoIGdldEF2YWlsYWJsZU1ldGhvZEVsZW1lbnRzKGludGVyZmFjZUNsYXNzLCBNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKSk7CiAJCQl9CiAJCX0KQEAgLTczOSwxMiArNzQwLDE0IEBACiAJCX0KIAkJcmV0dXJuIHJlc3VsdDsKIAl9CisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIigiICsgZ2V0TmFtZSgpICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAl9CiAJLyoqCiAJICoKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKIAkJc3VwZXIuc2V0RGlzcGxheU5hbWUobmV3RGlzcGxheU5hbWUpOwogCX0KQEAgLTkwMyw3ICs5MDYsNyBAQAogCXB1YmxpYyB2b2lkIHNldEVqYkphcihFSkJKYXIgbmV3RWpiSmFyKSB7CiAJCWlmIChuZXdFamJKYXIgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVIgJiYgbmV3RWpiSmFyICE9IG51bGwpKSB7CiAJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RWpiSmFyKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTEwMzMsNiArMTAzNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVI6CkBAIC0xMDQ4LDYgKzEwNTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19TRUNVUklUWV9ST0xFX1JFRlM6CkBAIC0xMDY1LDYgKzEwNzAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX0VKQl9KQVI6CkBAIC0xMDc4LDYgKzEwODQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19OQU1FOgpAQCAtMTExMiw2ICsxMTE5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRFUlBSSVNFX0JFQU5fX05BTUU6CkBAIC0xMTUxLDYgKzExNTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVOVEVSUFJJU0VfQkVBTl9fTkFNRToKQEAgLTExODksNiArMTE5OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5URVJQUklTRV9CRUFOX19OQU1FOgpAQCAtMTIyMCw3ICsxMjMwLDcgQEAKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpAQCAtMTI3MSw3ICsxMjgxLDYgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50I2dldEVBbm5vdGF0aW9uKGphdmEubGFuZy5TdHJpbmcpCiAJICovCiAJcHVibGljIEVBbm5vdGF0aW9uIGdldEVBbm5vdGF0aW9uKFN0cmluZyBzb3VyY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKQEAgLTEyNzksNyArMTI4OCw2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudCNnZXRFQW5ub3RhdGlvbnMoKQogCSAqLwogCXB1YmxpYyBFTGlzdCBnZXRFQW5ub3RhdGlvbnMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIG51bGw7CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FbnRpdHlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9FbnRpdHlJbXBsLmphdmEKaW5kZXggMmI4MTIxNC4uYWExOTE4MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRW50aXR5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0VudGl0eUltcGwuamF2YQpAQCAtMTksNyArMTksNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7CiAKIC8qKgpAQCAtMzEsNyArMzAsNyBAQAogICogVGhlIG90aGVyIGVsZW1lbnRzIHRoYXQgYXJlIG9wdGlvbmFsIGFyZSAib3B0aW9uYWwiIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgYXJlIG9taXR0ZWQgaWYgdGhlIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LiBBdCBsZWFzdCBvbmUgY21wLWZpZWxkIGVsZW1lbnQgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yIGlmCiAgKiB0aGUgZW50aXR5J3MgcGVyc2lzdGVuY2UtdHlwZSBpcyBDb250YWluZXIgYW5kIHRoZSBjbXAtdmVyc2lvbiBpcyAxLngsIGFuZCBub25lIG11c3Qgbm90IGJlIHByZXNlbnQgaWYgdGhlIGVudGl0eSdzIHBlcnNpc3RlbmNlLXR5cGUgaXMgQmVhbi4KICAqLwotcHVibGljIGNsYXNzIEVudGl0eUltcGwgZXh0ZW5kcyBFbnRlcnByaXNlQmVhbkltcGwgaW1wbGVtZW50cyBFbnRpdHksIEVudGVycHJpc2VCZWFuIHsKK3B1YmxpYyBjbGFzcyBFbnRpdHlJbXBsIGV4dGVuZHMgRW50ZXJwcmlzZUJlYW5JbXBsIGltcGxlbWVudHMgRW50aXR5IHsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlZW50cmFudCgpIDxlbT5SZWVudHJhbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTc0LDYgKzczLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVOVElUWTsKIAl9CkBAIC04Niw2ICs4Niw3IEBACiAgKiBSZXR1cm4gdHJ1ZSBpZiBAYUphdmFDbGFzcyBhcyBlcXVhbCB0byB0aGUKICAqIGhvbWUsIHJlbW90ZSwgYmVhbiBjbGFzcywgb3Iga2V5IGNsYXNzLgogICovCitAT3ZlcnJpZGUKIHB1YmxpYyBib29sZWFuIGhhc0phdmFSZWZlcmVuY2UoSmF2YUNsYXNzIGFKYXZhQ2xhc3MpIHsKIAlib29sZWFuIHJlc3VsdCA9IHN1cGVyLmhhc0phdmFSZWZlcmVuY2UoYUphdmFDbGFzcyk7CiAJaWYgKCFyZXN1bHQgJiYgYUphdmFDbGFzcyAhPSBudWxsKQpAQCAtOTMsOSArOTQsMTEgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogLy9SZXR1cm4gZmFsc2UgYnkgZGVmYXVsdAorQE92ZXJyaWRlCiBwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSB7CiAJcmV0dXJuIGZhbHNlOwogfQorQE92ZXJyaWRlCiBwdWJsaWMgYm9vbGVhbiBpc0VudGl0eSgpIHsKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTEwNiw2ICsxMDksNyBAQAogCXJldHVybiBnZXRQcmltYXJ5S2V5KCk7CiB9CiAKK0BPdmVycmlkZQogcHVibGljIGphdmEubGFuZy5PYmplY3QgcHJpbVJlZlZhbHVlKEVPYmplY3QgZmVhdHVyZSkgewogCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKCgoRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmUpLmdldEZlYXR1cmVJRCgpLCAoKEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlKS5nZXRDb250YWluZXJDbGFzcygpKSkgewogCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRUVOVFJBTlQ6IHJldHVybiBuZXcgQm9vbGVhbihpc1JlZW50cmFudCgpKTsKQEAgLTE5OCw2ICsyMDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRUVOVFJBTlQ6CkBAIC0yMTQsNiArMjE5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FTlRJVFlfX1JFRU5UUkFOVDoKQEAgLTIzMSw2ICsyMzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVOVElUWV9fUkVFTlRSQU5UOgpAQCAtMjQ4LDYgKzI1NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRU5USVRZX19SRUVOVFJBTlQ6CkBAIC0yNjEsMTIgKzI2OSwxMyBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZWVudHJhbnQ6ICIpOwotCQlpZiAocmVlbnRyYW50RVNldCkgcmVzdWx0LmFwcGVuZChyZWVudHJhbnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChyZWVudHJhbnQ6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChyZWVudHJhbnRFU2V0KSByZXN1bHQuYXBwZW5kKHJlZW50cmFudCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0V4Y2x1ZGVMaXN0SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRXhjbHVkZUxpc3RJbXBsLmphdmEKaW5kZXggMjM4ZGJhMy4uYWNhNDliMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRXhjbHVkZUxpc3RJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvRXhjbHVkZUxpc3RJbXBsLmphdmEKQEAgLTc3LDYgKzc3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLkVYQ0xVREVfTElTVDsKIAl9CkBAIC0xMjUsNiArMTI2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fTUVUSE9EX0VMRU1FTlRTOgpAQCAtMTQwLDYgKzE0Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OOgpAQCAtMTU3LDYgKzE2MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuRVhDTFVERV9MSVNUX19ERVNDUklQVElPTjoKQEAgLTE3OSw2ICsxODMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLkVYQ0xVREVfTElTVF9fREVTQ1JJUFRJT046CkBAIC0xOTksNiArMjA0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5FWENMVURFX0xJU1RfX0RFU0NSSVBUSU9OOgpAQCAtMjE0LDExICsyMjAsMTIgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9LZXlSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9LZXlSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKaW5kZXggMTk0MzZjMS4uMTc3NWE4YiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvS2V5UmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0tleVJlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogLyoqCiAgKiBSZXR1cm4gdGhlIHByb3BlciBsaXN0IG9mIGF0dHJpYnV0ZXMgZnJvbSBjbXBFeHQuCiAgKi8KK0BPdmVycmlkZQogcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFNvdXJjZVJvbGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7CiAJcmV0dXJuIGNtcC5nZXRGaWx0ZXJlZEZlYXR1cmVzKEtleVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuc2luZ2xldG9uKCkpOwogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvS2V5UmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCmluZGV4IGJmN2NiNzkuLmRiNDY2Y2QgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0tleVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9LZXlSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKQEAgLTI5LDcgKzI5LDggQEAKIAogICAgIHByaXZhdGUgc3RhdGljIEtleVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgc2luZ2xldG9uOwogCi0gICAgcHJvdGVjdGVkIExpc3QgZmlsdGVyTm90Y2FjaGVkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7CisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIExpc3QgZmlsdGVyTm90Y2FjaGVkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7CiAgICAgICAgIExpc3Qga2V5Um9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgIEl0ZXJhdG9yIGl0ID0gZ2V0UmVsYXRpb25zaGlwUm9sZXMoY21wKS5pdGVyYXRvcigpOwogICAgICAgICBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGU7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbEtleUF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxLZXlBdHRyaWJ1dGVGaWx0ZXIuamF2YQppbmRleCA2ZDgwYmZjLi5iOTg0YmVlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbEtleUF0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsS2V5QXR0cmlidXRlRmlsdGVyLmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIC8qKgogICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LgogICovCitAT3ZlcnJpZGUKIHByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXRTb3VyY2VBdHRyaWJ1dGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7CiAJcmV0dXJuIG5ldyBBcnJheUxpc3QoY21wLmdldEtleUF0dHJpYnV0ZXMoKSk7CiB9CkBAIC0zNiw2ICszNyw3IEBACiAgKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbkF0dHJpYnV0ZSBhbHNvIGV4aXN0cyBpbiB0aGUgc3VwZXJFbnRpdHkuCiAgKiBGb3IgdGhpcyBmaWx0ZXIsIG9ubHkgdGhlIG5hbWUgaGFzIHRvIGJlIHRoZSBzYW1lLgogICovCitAT3ZlcnJpZGUKIHByb3RlY3RlZCBib29sZWFuIGlzU3VwZXJ0eXBlQXR0cmlidXRlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgc3VwZXJFbnRpdHksIENNUEF0dHJpYnV0ZSBhbkF0dHJpYnV0ZSkgewogCUNNUEF0dHJpYnV0ZSBmb3VuZCA9IHN1cGVyRW50aXR5LmdldEtleUF0dHJpYnV0ZShhbkF0dHJpYnV0ZS5nZXROYW1lKCkpOwogCXJldHVybiBmb3VuZCAhPSBudWxsOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEKaW5kZXggMTg5NTM1ZC4uOGM2MDA4ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbE1vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiAJICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiBhdHRyaWJ1dGVzIGZyb20gY21wRXh0LiBSZXR1cm4gbG9jYWwKIAkgKiBhdHRyaWJ1dGVzIG1pbnVzIHRob3NlIGFkZGVkIGR1ZSB0byBSZWxhdGlvbnNoaXAgUm9sZXMuCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFNvdXJjZUF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKIAkJamF2YS51dGlsLkxpc3QgbG9jYWwgPSBudWxsLCBsb2NhbFJvbGVBdHRyaWJ1dGVzOyAKIAkJbG9jYWwgPSBjbXAuZ2V0RmlsdGVyZWRGZWF0dXJlcyhMb2NhbFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIuc2luZ2xldG9uKCkpOwpAQCAtNDEsNiArNDIsNyBAQAogCSAqIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFuQXR0cmlidXRlIGFsc28gZXhpc3RzIGluIHRoZQogCSAqIHN1cGVyRW50aXR5LiBGb3IgdGhpcyBmaWx0ZXIsIG9ubHkgdGhlIG5hbWUgaGFzIHRvIGJlIHRoZSBzYW1lLgogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIGlzU3VwZXJ0eXBlQXR0cmlidXRlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgc3VwZXJFbnRpdHksIENNUEF0dHJpYnV0ZSBhbkF0dHJpYnV0ZSkgewogCQlDTVBBdHRyaWJ1dGUgZm91bmQgPSBzdXBlckVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKGFuQXR0cmlidXRlLmdldE5hbWUoKSk7CiAJCXJldHVybiBmb3VuZCAhPSBudWxsOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxPcHBvc2l0ZVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsT3Bwb3NpdGVSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKaW5kZXggZjZhZDM3NC4uMjE5NmFkZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxPcHBvc2l0ZVJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbE9wcG9zaXRlUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCkBAIC0zMiw3ICszMiw4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIGEgTGlzdCB3aXRoIHRoZSBvcHBvc2l0ZSByb2xlcyBmb3IgdGhlIGxvY2FsIHJlbGF0aW9uc2hpcCByb2xlcy4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBmaWx0ZXJOb3RjYWNoZWQoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTGlzdCBmaWx0ZXJOb3RjYWNoZWQoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKICAgICAgICAgTGlzdCBvcHBvc2l0ZVJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgICBJdGVyYXRvciBpdCA9IGdldExvY2FsUmVsYXRpb25zaGlwUm9sZXMoY21wKS5pdGVyYXRvcigpOwogICAgICAgICBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGUsIG9wcG9zaXRlOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIuamF2YQppbmRleCBiMWM1NWJhLi5mNzI2MWZlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Mb2NhbFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogLyoqCiAgKiBSZXR1cm4gdGhlIHByb3BlciBsaXN0IG9mIGF0dHJpYnV0ZXMgZnJvbSBjbXBFeHQuCiAgKi8KK0BPdmVycmlkZQogcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFNvdXJjZUF0dHJpYnV0ZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKIAlyZXR1cm4gbmV3IEFycmF5TGlzdChjbXAuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKSk7CiB9CkBAIC0zNyw2ICszOCw3IEBACiAgKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbkF0dHJpYnV0ZSBhbHNvIGV4aXN0cyBpbiB0aGUgc3VwZXJFbnRpdHkuCiAgKiBGb3IgdGhpcyBmaWx0ZXIsIG9ubHkgdGhlIG5hbWUgaGFzIHRvIGJlIHRoZSBzYW1lLgogICovCitAT3ZlcnJpZGUKIHByb3RlY3RlZCBib29sZWFuIGlzU3VwZXJ0eXBlQXR0cmlidXRlKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgc3VwZXJFbnRpdHksIENNUEF0dHJpYnV0ZSBhbkF0dHJpYnV0ZSkgewogCUNNUEF0dHJpYnV0ZSBmb3VuZCA9IHN1cGVyRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoYW5BdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKIAlyZXR1cm4gZm91bmQgIT0gbnVsbDsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKaW5kZXggNzllZTIxNC4uM2Y5YTE0MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxSZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIC8qKgogICogUmV0dXJuIHRoZSBwcm9wZXIgbGlzdCBvZiByb2xlcyBmcm9tIGNtcEV4dC4KICAqLworQE92ZXJyaWRlCiBwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0U291cmNlUm9sZXMoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKICAgIHJldHVybiBnZXRSZWxhdGlvbnNoaXBSb2xlcyhjbXApOyAKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL0xvY2FsUmVsYXRpb25zaGlwUm9sZUtleUF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxSZWxhdGlvbnNoaXBSb2xlS2V5QXR0cmlidXRlRmlsdGVyLmphdmEKaW5kZXggYjlhNWI3ZC4uMDk5YWY4ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxSZWxhdGlvbnNoaXBSb2xlS2V5QXR0cmlidXRlRmlsdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTG9jYWxSZWxhdGlvbnNoaXBSb2xlS2V5QXR0cmlidXRlRmlsdGVyLmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKIC8qKgogICogZmlsdGVyIG1ldGhvZCBjb21tZW50LgogICovCitAT3ZlcnJpZGUKIHB1YmxpYyBMaXN0IGZpbHRlcihDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewogCUxpc3QgYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKIAlJdGVyYXRvciBpdCA9IGdldFNvdXJjZVJvbGVzKGNtcCkuaXRlcmF0b3IoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbkltcGwuamF2YQppbmRleCA3OGVmMDFkLi41MTBjMGEyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb25JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uSW1wbC5qYXZhCkBAIC04Niw2ICs4Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTjsKIAl9CkBAIC0yMDksNyArMjEwLDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRCZWFuKE1lc3NhZ2VEcml2ZW4gbmV3QmVhbikgewogCQlpZiAobmV3QmVhbiAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOICYmIG5ld0JlYW4gIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdCZWFuKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTIyNyw2ICsyMjgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX0JFQU46CkBAIC0yNDIsNiArMjQ0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOOgpAQCAtMjU1LDYgKzI1OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19CRUFOOgpAQCAtMjY4LDYgKzI3Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRToKQEAgLTI4NSw2ICsyOTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX0RFU1RJTkFUSU9OX19UWVBFOgpAQCAtMzA1LDYgKzMxMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fREVTVElOQVRJT05fX1RZUEU6CkBAIC0zMjUsNiArMzMyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9ERVNUSU5BVElPTl9fVFlQRToKQEAgLTM0MCwxNCArMzQ4LDE1IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlpZiAodHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1YnNjcmlwdGlvbkR1cmFiaWxpdHk6ICIpOwotCQlpZiAoc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQpIHJlc3VsdC5hcHBlbmQoc3Vic2NyaXB0aW9uRHVyYWJpbGl0eSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmICh0eXBlRVNldCkgcmVzdWx0LmFwcGVuZCh0eXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBzdWJzY3JpcHRpb25EdXJhYmlsaXR5OiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoc3Vic2NyaXB0aW9uRHVyYWJpbGl0eUVTZXQpIHJlc3VsdC5hcHBlbmQoc3Vic2NyaXB0aW9uRHVyYWJpbGl0eSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEcml2ZW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXNzYWdlRHJpdmVuSW1wbC5qYXZhCmluZGV4IGI4MWRhNTIuLjdkZDQ2MWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01lc3NhZ2VEcml2ZW5JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWVzc2FnZURyaXZlbkltcGwuamF2YQpAQCAtMTU3LDEwICsxNTcsMTIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfRFJJVkVOOwogCX0KIAorQE92ZXJyaWRlCiBwdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2VEcml2ZW4oKSB7CiAJcmV0dXJuIHRydWU7CiB9CkBAIC00NzAsNiArNDcyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19ERVNUSU5BVElPTjoKQEAgLTQ4NSw2ICs0ODgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX0RFU1RJTkFUSU9OOgpAQCAtNTAwLDYgKzUwNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fVFJBTlNBQ1RJT05fVFlQRToKQEAgLTUyOSw2ICs1MzQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FU1NBR0VfRFJJVkVOX19UUkFOU0FDVElPTl9UWVBFOgpAQCAtNTY0LDYgKzU3MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVTU0FHRV9EUklWRU5fX1RSQU5TQUNUSU9OX1RZUEU6CkBAIC01OTksNiArNjA2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVNTQUdFX0RSSVZFTl9fVFJBTlNBQ1RJT05fVFlQRToKQEAgLTYyNCwxNyArNjMyLDE4IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRyYW5zYWN0aW9uVHlwZTogIik7Ci0JCWlmICh0cmFuc2FjdGlvblR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHRyYW5zYWN0aW9uVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1lc3NhZ2VTZWxlY3RvcjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAodHJhbnNhY3Rpb25UeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodHJhbnNhY3Rpb25UeXBlRVNldCkgcmVzdWx0LmFwcGVuZCh0cmFuc2FjdGlvblR5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIG1lc3NhZ2VTZWxlY3RvcjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChtZXNzYWdlU2VsZWN0b3IpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFja25vd2xlZGdlTW9kZTogIik7Ci0JCWlmIChhY2tub3dsZWRnZU1vZGVFU2V0KSByZXN1bHQuYXBwZW5kKGFja25vd2xlZGdlTW9kZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbms6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGFja25vd2xlZGdlTW9kZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGFja25vd2xlZGdlTW9kZUVTZXQpIHJlc3VsdC5hcHBlbmQoYWNrbm93bGVkZ2VNb2RlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGxpbmspOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKQEAgLTY0Myw2ICs2NTIsNyBAQAogCS8qCiAJICogQHNlZSBFbnRlcnByaXNlQmVhbiNnZXRBdmFpbGFibGVMb2NhbEhvbWVNZXRob2RFbGVtZW50cygpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlTG9jYWxIb21lTWV0aG9kRWxlbWVudHMoKSB7CiAJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwogCX0KQEAgLTY1MCw2ICs2NjAsNyBAQAogCS8qCiAJICogQHNlZSBFbnRlcnByaXNlQmVhbiNnZXRBdmFpbGFibGVMb2NhbE1ldGhvZEVsZW1lbnRzKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVMb2NhbE1ldGhvZEVsZW1lbnRzKCkgewogCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKIAl9CkBAIC02NTcsNiArNjY4LDcgQEAKIAkvKgogCSAqIEBzZWUgRW50ZXJwcmlzZUJlYW4jZ2V0QXZhaWxhYmxlUmVtb3RlTWV0aG9kRWxlbWVudHMoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJlbW90ZU1ldGhvZEVsZW1lbnRzKCkgewogCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKIAl9CkBAIC02NjQsNiArNjc2LDcgQEAKIAkvKgogCSAqIEBzZWUgRW50ZXJwcmlzZUJlYW5JbXBsI2dldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVVuc3BlY2lmaWVkTWV0aG9kRWxlbWVudFNpZ25hdHVyZXMoKSB7CiAJCS8vVGhlcmUgaXMgb25seSB0aGUgb25NZXNzYWdlIG1ldGhvZAogCQlMaXN0IHNpZ3MgPSBuZXcgQXJyYXlMaXN0KDEpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEKaW5kZXggMjg4NDliZi4uMjNkNmRiZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCkBAIC0yODQsNiArMjg0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UOwogCX0KQEAgLTM1MCwxMiArMzUxLDkgQEAKIAlmb3IgKGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyBpKyspCiAJewogCQl0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKChTdHJpbmcpdi5nZXQoaSksIiwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodG9rICE9IG51bGwpCisJCXdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKQogCQl7Ci0JCQl3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkKLQkJCXsKLQkJCQlwYXJhbXNMaXN0LmFkZCh0b2submV4dFRva2VuKCkpOwotCQkJfQorCQkJcGFyYW1zTGlzdC5hZGQodG9rLm5leHRUb2tlbigpKTsKIAkJfQogCX0KIAlyZXR1cm4gcGFyYW1zTGlzdDsKQEAgLTQxNSw2ICs0MTMsNyBAQAogCQkgICAgCSAgICBicmVhazsKIAkJICAgIAl9CiAJCSAgIH0KKwkJLy8kRkFMTC1USFJPVUdIJAogCQljYXNlIE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEIDoKIAkJCXsKIAkJCQlpZiAoZWpiLmlzTWVzc2FnZURyaXZlbigpKQpAQCAtNDI5LDcgKzQyOCwxMCBAQAogCQkJCWJyZWFrOwogCQkJfQogCX0KLQlyZXR1cm4gKE1ldGhvZFtdKSByZXN1bHQudG9BcnJheShuZXcgTWV0aG9kW3Jlc3VsdC5zaXplKCldKTsKKwlpZihyZXN1bHQgIT0gbnVsbCl7CisJCXJldHVybiAoTWV0aG9kW10pIHJlc3VsdC50b0FycmF5KG5ldyBNZXRob2RbcmVzdWx0LnNpemUoKV0pOworCX0KKwlyZXR1cm4gbnVsbDsKIH0KIC8qKgogICogQW5zd2VyIGEgbGlzdCBvZiBhbGwgdGhlIG1ldGhvZHMgZm9yIHdoaWNoIHRoaXMgbWV0aG9kIGVsZW1lbnQgYXBwbGllcy4gIFRoZSBmb2xsb3dpbmcgcnVsZXMgYXJlIHVzZWQ6CkBAIC02NzcsNiArNjc5LDcgQEAKIAkJCQkJY2xhc3MgTXlUeXBlTmFtZVJlcXVlc3RvciBleHRlbmRzIFR5cGVOYW1lUmVxdWVzdG9yIHsKIAkJCQkJCWJvb2xlYW4gaXNOZXN0ZWQgPSBmYWxzZTsKIAorCQkJCQkJQE92ZXJyaWRlCiAJCQkJCQlwdWJsaWMgdm9pZCBhY2NlcHRUeXBlKGludCBtb2RpZmllcnMsIGNoYXJbXSBwYWNrYWdlTmFtZSwgY2hhcltdIHNpbXBsZVR5cGVOYW1lLCBjaGFyW11bXSBlbmNsb3NpbmdUeXBlTmFtZXMsIFN0cmluZyBwYXRoKSB7CiAJCQkJCQkJaXNOZXN0ZWQgPSB0cnVlOwogCQkJCQkJfQpAQCAtOTYwLDYgKzk2Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fREVTQ1JJUFRJT05TOgpAQCAtOTczLDYgKzk3Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKQEAgLTk5Nyw2ICsxMDAyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKQEAgLTEwMjcsNiArMTAzMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6CkBAIC0xMDU2LDYgKzEwNjMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgpAQCAtMTA3NywxNyArMTA4NSwxOCBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcm1zOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBwYXJtczogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChwYXJtcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCWlmICh0eXBlRVNldCkgcmVzdWx0LmFwcGVuZCh0eXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmICh0eXBlRVNldCkgcmVzdWx0LmFwcGVuZCh0eXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kUGVybWlzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFBlcm1pc3Npb25JbXBsLmphdmEKaW5kZXggNzMwYjYxOS4uNDViZTBjZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTWV0aG9kUGVybWlzc2lvbkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RQZXJtaXNzaW9uSW1wbC5qYXZhCkBAIC0xMDcsNiArMTA3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QRVJNSVNTSU9OOwogCX0KQEAgLTI0NSw3ICsyNDYsNyBAQAogCXB1YmxpYyB2b2lkIHNldEFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3IgbmV3QXNzZW1ibHlEZXNjcmlwdG9yKSB7CiAJCWlmIChuZXdBc3NlbWJseURlc2NyaXB0b3IgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUiAmJiBuZXdBc3NlbWJseURlc2NyaXB0b3IgIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdBc3NlbWJseURlc2NyaXB0b3IpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCiAJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKIAkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQogCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwpAQCAtMjk1LDYgKzI5Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfUEVSTUlTU0lPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKQEAgLTMxMCw2ICszMTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6CkBAIC0zMjcsNiArMzMwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1BFUk1JU1NJT05fX0FTU0VNQkxZX0RFU0NSSVBUT1I6CkBAIC0zNDAsNiArMzQ0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKQEAgLTM2Myw2ICszNjgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKQEAgLTM5NSw2ICs0MDEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKQEAgLTQyNCw2ICs0MzEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKQEAgLTQ0NSwxNCArNDUzLDE1IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdW5jaGVja2VkOiAiKTsKLQkJaWYgKHVuY2hlY2tlZEVTZXQpIHJlc3VsdC5hcHBlbmQodW5jaGVja2VkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdW5jaGVja2VkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAodW5jaGVja2VkRVNldCkgcmVzdWx0LmFwcGVuZCh1bmNoZWNrZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9NZXRob2RUcmFuc2FjdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFRyYW5zYWN0aW9uSW1wbC5qYXZhCmluZGV4IDQ3ZThlNjcuLjdhMDdlNjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFRyYW5zYWN0aW9uSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01ldGhvZFRyYW5zYWN0aW9uSW1wbC5qYXZhCkBAIC0xMDMsNiArMTAzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBFamJQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9UUkFOU0FDVElPTjsKIAl9CkBAIC0yMzMsNyArMjM0LDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRBc3NlbWJseURlc2NyaXB0b3IoQXNzZW1ibHlEZXNjcmlwdG9yIG5ld0Fzc2VtYmx5RGVzY3JpcHRvcikgewogCQlpZiAobmV3QXNzZW1ibHlEZXNjcmlwdG9yICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SICYmIG5ld0Fzc2VtYmx5RGVzY3JpcHRvciAhPSBudWxsKSkgewogCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0Fzc2VtYmx5RGVzY3JpcHRvcikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwogCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCiAJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CkBAIC0yNzMsNiArMjc0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKQEAgLTI4OCw2ICsyOTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19BU1NFTUJMWV9ERVNDUklQVE9SOgpAQCAtMzA1LDYgKzMwOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fQVNTRU1CTFlfREVTQ1JJUFRPUjoKQEAgLTMxOCw2ICszMjIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19UUkFOU0FDVElPTl9BVFRSSUJVVEU6CkBAIC0zMzksNiArMzQ0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5NRVRIT0RfVFJBTlNBQ1RJT05fX1RSQU5TQUNUSU9OX0FUVFJJQlVURToKQEAgLTM2Nyw2ICszNzMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLk1FVEhPRF9UUkFOU0FDVElPTl9fVFJBTlNBQ1RJT05fQVRUUklCVVRFOgpAQCAtMzkzLDYgKzQwMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuTUVUSE9EX1RSQU5TQUNUSU9OX19UUkFOU0FDVElPTl9BVFRSSUJVVEU6CkBAIC00MTIsMTMgKzQyMCwxNCBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0cmFuc2FjdGlvbkF0dHJpYnV0ZTogIik7Ci0JCWlmICh0cmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25BdHRyaWJ1dGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAodHJhbnNhY3Rpb25BdHRyaWJ1dGU6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmICh0cmFuc2FjdGlvbkF0dHJpYnV0ZUVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25BdHRyaWJ1dGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Nb2RlbGxlZEtleUF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTW9kZWxsZWRLZXlBdHRyaWJ1dGVGaWx0ZXIuamF2YQppbmRleCA5M2RhM2VhLi43YThmZDU5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Nb2RlbGxlZEtleUF0dHJpYnV0ZUZpbHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01vZGVsbGVkS2V5QXR0cmlidXRlRmlsdGVyLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIHB1YmxpYyBjbGFzcyBNb2RlbGxlZEtleUF0dHJpYnV0ZUZpbHRlciBleHRlbmRzIENvbnRhaW5lck1hbmFnZWRFbnRpdHlGaWx0ZXIgewogCXByaXZhdGUgc3RhdGljIE1vZGVsbGVkS2V5QXR0cmlidXRlRmlsdGVyIHNpbmdsZXRvbjsKIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBMaXN0IGZpbHRlck5vdGNhY2hlZChDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewogCQlyZXR1cm4gZ2V0U291cmNlQXR0cmlidXRlcyhjbXApOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL01vZGVsbGVkUGVyc2lzdGVudEF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEKaW5kZXggOTlkMzhhZi4uNDZhZmM4OCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTW9kZWxsZWRQZXJzaXN0ZW50QXR0cmlidXRlRmlsdGVyLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIAkKIAlwcml2YXRlIHN0YXRpYyBNb2RlbGxlZFBlcnNpc3RlbnRBdHRyaWJ1dGVGaWx0ZXIgc2luZ2xldG9uOwogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIExpc3QgZmlsdGVyTm90Y2FjaGVkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7CiAJCXJldHVybiBnZXRTb3VyY2VBdHRyaWJ1dGVzKGNtcCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvTm9uS2V5UmVxdWlyZWRSb2xlRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Ob25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIuamF2YQppbmRleCBhZDZjMDI5Li45ZGY4Mzc3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Ob25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Ob25LZXlSZXF1aXJlZFJvbGVGaWx0ZXIuamF2YQpAQCAtMjgsNyArMjgsOCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgTm9uS2V5UmVxdWlyZWRSb2xlRmlsdGVyIHNpbmdsZXRvbjsKIAotICAgIHByb3RlY3RlZCBMaXN0IGZpbHRlck5vdGNhY2hlZChDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgeworICAgIEBPdmVycmlkZQorCXByb3RlY3RlZCBMaXN0IGZpbHRlck5vdGNhY2hlZChDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewogICAgICAgICBMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwogICAgICAgICBJdGVyYXRvciBpdCA9IGdldFJlbGF0aW9uc2hpcFJvbGVzKGNtcCkuaXRlcmF0b3IoKTsKICAgICAgICAgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByb2xlOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUXVlcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9RdWVyeUltcGwuamF2YQppbmRleCA0NjA2OGViLi40ZmFlNmVmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9RdWVyeUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9RdWVyeUltcGwuamF2YQpAQCAtMTEyLDYgKzExMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5RVUVSWTsKIAl9CkBAIC0zMDksNyArMzEwLDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRFbnRpdHkoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBuZXdFbnRpdHkpIHsKIAkJaWYgKG5ld0VudGl0eSAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlFVRVJZX19FTlRJVFkgJiYgbmV3RW50aXR5ICE9IG51bGwpKSB7CiAJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RW50aXR5KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTMzOSw2ICszNDAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1FVRVJZX01FVEhPRDoKQEAgLTM1OCw2ICszNjAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfX1FVRVJZX01FVEhPRDoKQEAgLTM3NSw2ICszNzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fRU5USVRZOgpAQCAtMzg4LDYgKzM5Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046CkBAIC00MTEsNiArNDE2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046CkBAIC00NDEsNiArNDQ3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046CkBAIC00NzAsNiArNDc3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9fREVTQ1JJUFRJT046CkBAIC00OTEsMTYgKzQ5OSwxNyBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVqYlFMOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBlamJRTDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChlamJRTCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmV0dXJuVHlwZU1hcHBpbmc6ICIpOwotCQlpZiAocmV0dXJuVHlwZU1hcHBpbmdFU2V0KSByZXN1bHQuYXBwZW5kKHJldHVyblR5cGVNYXBwaW5nKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7CisJCXJlc3VsdC5hcHBlbmQoIiwgcmV0dXJuVHlwZU1hcHBpbmc6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChyZXR1cm5UeXBlTWFwcGluZ0VTZXQpIHJlc3VsdC5hcHBlbmQocmV0dXJuVHlwZU1hcHBpbmcpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9RdWVyeU1ldGhvZEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5TWV0aG9kSW1wbC5qYXZhCmluZGV4IDk4MjE1ZTMuLmU4YmFkNjggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5TWV0aG9kSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1F1ZXJ5TWV0aG9kSW1wbC5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5RVUVSWV9NRVRIT0Q7CiAJfQpAQCAtNDcsNiArNDgsNyBAQAogICogRm9yIFF1ZXJ5IG1ldGhvZHMsIHRoZWlyIGVudGVycHJpc2UgYmVhbiBtdXN0IGJlIGRlcml2ZWQuCiAgKiBJdCBpcyB0aGUgRW50aXR5IHdoaWNoIGNvbnRhaW5zIHRoZSBRdWVyeS4KICAqLworQE92ZXJyaWRlCiBwdWJsaWMgRW50ZXJwcmlzZUJlYW4gZ2V0RW50ZXJwcmlzZUJlYW4oKSB7CiAJaWYgKGVudGVycHJpc2VCZWFuID09IG51bGwpIHsKIAkJaWYgKGdldFF1ZXJ5KCkgIT0gbnVsbCkKQEAgLTEwNCw2ICsxMDYsNyBAQAogICogd2hlbiB0aGUgc2FtZSBtZXRob2Qgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgZXhpc3RzIG9uIGJvdGggdGhlIGhvbWUgYW5kCiAgKiBsb2NhbCBob21lLgogICovCitAT3ZlcnJpZGUKIHB1YmxpYyBNZXRob2RbXSBnZXRNZXRob2RzKCkgewogCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgyKTsKIAlpZiAoZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImVqYlNlbGVjdCIpKSB7IC8vJE5PTi1OTFMtMSQKQEAgLTE1NCw3ICsxNTcsNyBAQAogCXB1YmxpYyB2b2lkIHNldFF1ZXJ5KFF1ZXJ5IG5ld1F1ZXJ5KSB7CiAJCWlmIChuZXdRdWVyeSAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlkgJiYgbmV3UXVlcnkgIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdRdWVyeSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwogCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCiAJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CkBAIC0xNzIsNiArMTc1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlk6CkBAIC0xODcsNiArMTkxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlk6CkBAIC0yMDAsNiArMjA1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWToKQEAgLTIxMyw2ICsyMTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWToKQEAgLTIyNiw2ICsyMzMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlFVRVJZX01FVEhPRF9fUVVFUlk6CkBAIC0yNDAsNiArMjQ4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5RVUVSWV9NRVRIT0RfX1FVRVJZOgpAQCAtMjU0LDYgKzI2Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuUVVFUllfTUVUSE9EX19RVUVSWToKQEAgLTI2Niw2ICsyNzYsNyBAQAogCSAqIFlvdSBzaG91bGQgdXNlIGdldENsaWVudFR5cGVKYXZhQ2xhc3NlcyB0byBlbnN1cmUgeW91IHBpY2sgdXAgYm90aCBob21lIGludGVyZmFjZXMKIAkgKiBpZiB0aGV5IGV4aXN0LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0VHlwZUphdmFDbGFzcygpIHsKIAkJSmF2YUNsYXNzW10gcmVzdWx0ID0gZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzKCk7CiAJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoID4gMCkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcFJvbGVBdHRyaWJ1dGVGaWx0ZXIuamF2YQppbmRleCBjNmZiODRkLi41MzM3ZTI3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZWxhdGlvbnNoaXBSb2xlQXR0cmlidXRlRmlsdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwUm9sZUF0dHJpYnV0ZUZpbHRlci5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiAvKioKICAqIFJldHVybiB0aGUgcHJvcGVyIGxpc3Qgb2Ygcm9sZXMgZnJvbSBjbXBFeHQuCiAgKi8KK0BPdmVycmlkZQogcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFNvdXJjZVJvbGVzKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7IAogCSAgIHJldHVybiBnZXRSZWxhdGlvbnNoaXBSb2xlcyhjbXApOyAKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcHNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZWxhdGlvbnNoaXBzSW1wbC5qYXZhCmluZGV4IGFhNWYzYjYuLjdkY2MyYjIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlbGF0aW9uc2hpcHNJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVsYXRpb25zaGlwc0ltcGwuamF2YQpAQCAtNzQsNiArNzQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEVqYlBhY2thZ2UuTGl0ZXJhbHMuUkVMQVRJT05TSElQUzsKIAl9CkBAIC0xMjIsNyArMTIzLDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRFamJKYXIoRUpCSmFyIG5ld0VqYkphcikgewogCQlpZiAobmV3RWpiSmFyICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fRUpCX0pBUiAmJiBuZXdFamJKYXIgIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdFamJKYXIpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCiAJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKIAkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQogCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwpAQCAtMTY0LDYgKzE2NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSOgpAQCAtMTgxLDYgKzE4Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19FSkJfSkFSOgpAQCAtMTk4LDYgKzIwMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0VKQl9KQVI6CkBAIC0yMTEsNiArMjE1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OOgpAQCAtMjMwLDYgKzIzNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuUkVMQVRJT05TSElQU19fREVTQ1JJUFRJT046CkBAIC0yNTUsNiArMjYxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5SRUxBVElPTlNISVBTX19ERVNDUklQVElPTjoKQEAgLTI3OCw2ICsyODUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlJFTEFUSU9OU0hJUFNfX0RFU0NSSVBUSU9OOgpAQCAtMjk1LDExICszMDMsMTIgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUmVxdWlyZWRMb2NhbFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YQppbmRleCBmNjdjYjk5Li5mMzdiNGU3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZExvY2FsUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlcXVpcmVkTG9jYWxSZWxhdGlvbnNoaXBSb2xlRmlsdGVyLmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKICAqLwogcHVibGljIGNsYXNzIFJlcXVpcmVkTG9jYWxSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgewogCXByaXZhdGUgc3RhdGljIFJlcXVpcmVkTG9jYWxSZWxhdGlvbnNoaXBSb2xlRmlsdGVyIHNpbmdsZXRvbjsKK0BPdmVycmlkZQogcHJvdGVjdGVkIGphdmEudXRpbC5MaXN0IGdldFJvbGVzVG9GaWx0ZXIoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXApIHsKICAgICBFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgbW9kSGVscGVyID0gZ2V0RWpiTW9kdWxlRXh0SGVscGVyKGNtcCk7CiAJaWYobW9kSGVscGVyICE9IG51bGwpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCmluZGV4IDQyY2U4MjEuLjMxYjQyYWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JlcXVpcmVkUmVsYXRpb25zaGlwUm9sZUZpbHRlci5qYXZhCkBAIC0yMiw3ICsyMiw4IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBSZXF1aXJlZFJlbGF0aW9uc2hpcFJvbGVGaWx0ZXIgc2luZ2xldG9uOwogCi0gICAgcHJvdGVjdGVkIExpc3QgZmlsdGVyTm90Y2FjaGVkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7CisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIExpc3QgZmlsdGVyTm90Y2FjaGVkKENvbnRhaW5lck1hbmFnZWRFbnRpdHkgY21wKSB7CiAgICAgICAgIExpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgIEl0ZXJhdG9yIGl0ID0gZ2V0UmVsYXRpb25zaGlwUm9sZXMoY21wKS5pdGVyYXRvcigpOwogICAgICAgICBDb21tb25SZWxhdGlvbnNoaXBSb2xlIHJvbGU7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Sb2xlU291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvUm9sZVNvdXJjZUltcGwuamF2YQppbmRleCA3M2RlZWEwLi4yYWEwZTUxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9Sb2xlU291cmNlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1JvbGVTb3VyY2VJbXBsLmphdmEKQEAgLTEyLDYgKzEyLDkgQEAKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKQEAgLTIzLDEwICsyNiwxNSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuTU9GSjJFRVJlc291cmNlSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbjsKIAogLyoqCiAgKiBEZXNpZ25hdGVzIHRoZSBzb3VyY2Ugb2YgYSByb2xlIHRoYXQgcGFydGljaXBhdGVzIGluIGEgcmVsYXRpb25zaGlwLiBBIHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBlbGVtZW50IHVuaXF1ZWx5IGlkZW50aWZpZXMgYW4gZW50aXR5IGJlYW4uCkBAIC03NCw2ICs4Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5ST0xFX1NPVVJDRTsKIAl9CkBAIC0xMTksNyArMTI4LDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRSb2xlKEVKQlJlbGF0aW9uc2hpcFJvbGUgbmV3Um9sZSkgewogCQlpZiAobmV3Um9sZSAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFICYmIG5ld1JvbGUgIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdSb2xlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTE4NSw2ICsxOTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuUk9MRV9TT1VSQ0VfX1JPTEU6CkBAIC0yMDAsNiArMjEwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFOgpAQCAtMjE1LDYgKzIyNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19ST0xFOgpAQCAtMjI4LDYgKzI0MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fREVTQ1JJUFRJT046CkBAIC0yNDgsNiArMjYxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fREVTQ1JJUFRJT046CkBAIC0yNTcsNyArMjcxLDI1IEBACiAJCQkJc2V0Um9sZSgoRUpCUmVsYXRpb25zaGlwUm9sZSluZXdWYWx1ZSk7CiAJCQkJcmV0dXJuOwogCQkJY2FzZSBFamJQYWNrYWdlLlJPTEVfU09VUkNFX19FTlRJVFlfQkVBTjoKLQkJCQlzZXRFbnRpdHlCZWFuKChDb250YWluZXJNYW5hZ2VkRW50aXR5KW5ld1ZhbHVlKTsKKwkJCQlpZihuZXdWYWx1ZSBpbnN0YW5jZW9mIENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIHsKKwkJCQkJc2V0RW50aXR5QmVhbigoQ29udGFpbmVyTWFuYWdlZEVudGl0eSluZXdWYWx1ZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJU3RyaW5nIHJlbGF0aW9uc2hpcE5hbWUgPSB0aGlzLmdldFJvbGUoKS5nZXRSZWxhdGlvbnNoaXAoKS5nZXROYW1lKCk7CisJCQkJCVN0cmluZyBiZWFuTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCisJCQkJCWlmKHJlbGF0aW9uc2hpcE5hbWUgPT0gbnVsbCkKKwkJCQkJCXJlbGF0aW9uc2hpcE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJCQlpZihuZXdWYWx1ZSBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuKSB7CisJCQkJCQliZWFuTmFtZSA9ICgoRW50ZXJwcmlzZUJlYW4pbmV3VmFsdWUpLmdldE5hbWUoKTsKKwkJCQkJfSBlbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKSB7CisJCQkJCQliZWFuTmFtZSA9ICgoU2Vzc2lvbkJlYW4pbmV3VmFsdWUpLmdldEVqYk5hbWUoKTsKKwkJCQkJfWVsc2UgaWYobmV3VmFsdWUgaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuQmVhbikgeworCQkJCQkJYmVhbk5hbWUgPSAoKE1lc3NhZ2VEcml2ZW5CZWFuKW5ld1ZhbHVlKS5nZXRFamJOYW1lKCk7CisJCQkJCX0KKwkJCQkJaWYoYmVhbk5hbWUgPT0gbnVsbCkgeworCQkJCQkJYmVhbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoSjJFRUNvcmVQbHVnaW4uZ2V0UGx1Z2luSUQoKSkpLmxvZyggbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLEoyRUVDb3JlUGx1Z2luLmdldFBsdWdpbklEKCksIE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuSU5WQUxJRF9ST0xFX1NPVVJDRV9fRU5USVRZX0JFQU4sIG5ldyBPYmplY3RbXXtyZWxhdGlvbnNoaXBOYW1lLCBiZWFuTmFtZX0pKSk7CisJCQkJfQogCQkJCXJldHVybjsKIAkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fREVTQ1JJUFRJT05TOgogCQkJCWdldERlc2NyaXB0aW9ucygpLmNsZWFyKCk7CkBAIC0yNzIsNiArMzA0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fREVTQ1JJUFRJT046CkBAIC0yOTUsNiArMzI4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5ST0xFX1NPVVJDRV9fREVTQ1JJUFRJT046CkBAIC0zMTIsMTEgKzM0NiwxMiBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvaW1wbC9TZXNzaW9uSW1wbC5qYXZhCmluZGV4IDA1NWNlZGIuLjFhM2RiNTEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU2Vzc2lvbkltcGwuamF2YQpAQCAtMTYsNyArMTYsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb25UeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5UcmFuc2FjdGlvblR5cGU7CkBAIC0yNSw3ICsyNCw3IEBACiAgKiBUaGUgc2Vzc2lvbiBlbGVtZW50IGRlY2xhcmVzIGFuIHNlc3Npb24gYmVhbi4gVGhlIGRlY2xhcmF0aW9uIGNvbnNpc3RzIG9mOiBhbiBvcHRpb25hbCBkZXNjcmlwdGlvbjsgb3B0aW9uYWwgZGlzcGxheSBuYW1lOyBvcHRpb25hbCBzbWFsbCBpY29uIGZpbGUgbmFtZTsgb3B0aW9uYWwgbGFyZ2UgaWNvbiBmaWxlIG5hbWU7IGEgbmFtZSBhc3NpZ25lZAogICogdG8gdGhlIGVudGVycHJpc2UgYmVhbiBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdGlvbjsgdGhlIG5hbWVzIG9mIHRoZSBzZXNzaW9uIGJlYW4ncyBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcywgaWYgYW55OyB0aGUgbmFtZXMgb2YgdGhlIHNlc3Npb24gYmVhbidzIGxvY2FsIGhvbWUgYW5kIGxvY2FsIGludGVyZmFjZXMsIGlmIGFueTsgdGhlIHNlc3Npb24gYmVhbidzIGltcGxlbWVudGF0aW9uIGNsYXNzOyB0aGUgc2Vzc2lvbiBiZWFuJ3Mgc3RhdGUgbWFuYWdlbWVudCB0eXBlOyB0aGUgc2Vzc2lvbiBiZWFuJ3MgdHJhbnNhY3Rpb24gbWFuYWdlbWVudCB0eXBlOyBhbiBvcHRpb25hbCBkZWNsYXJhdGlvbiBvZiB0aGUgYmVhbidzIGVudmlyb25tZW50IGVudHJpZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBiZWFuJ3MgbG9jYWwgRUpCIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSByb2xlIHJlZmVyZW5jZXM7IGFuIG9wdGlvbmFsIGRlY2xhcmF0aW9uIG9mIHRoZSBzZWN1cml0eSBpZGVudGl0eSB0byBiZSB1c2VkIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBiZWFuJ3MgbWV0aG9kczsgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBtYW5hZ2VyIGNvbm5lY3Rpb24gZmFjdG9yeSByZWZlcmVuY2VzOyBhbmQgYW4gb3B0aW9uYWwgZGVjbGFyYXRpb24gb2YgdGhlIGJlYW4ncyByZXNvdXJjZSBlbnZpcm9ubWVudCByZWZlcmVuY2VzLiBUaGUgZWxlbWVudHMgdGhhdCBhcmUgb3B0aW9uYWwgYXJlICJvcHRpb25hbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhleSBhcmUgb21pdHRlZCB3aGVuIGlmIGxpc3RzIHJlcHJlc2VudGVkIGJ5IHRoZW0gYXJlIGVtcHR5LgogICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbkltcGwgZXh0ZW5kcyBFbnRlcnByaXNlQmVhbkltcGwgaW1wbGVtZW50cyBTZXNzaW9uLCBFbnRlcnByaXNlQmVhbiB7CitwdWJsaWMgY2xhc3MgU2Vzc2lvbkltcGwgZXh0ZW5kcyBFbnRlcnByaXNlQmVhbkltcGwgaW1wbGVtZW50cyBTZXNzaW9uIHsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2FjdGlvblR5cGUoKSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgpAQCAtOTQsMTAgKzkzLDEyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gRWpiUGFja2FnZS5MaXRlcmFscy5TRVNTSU9OOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzU2Vzc2lvbigpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQpAQCAtMTk3LDYgKzE5OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0U2VydmljZUVuZHBvaW50KCkgewogCQlpZiAoc2VydmljZUVuZHBvaW50ICE9IG51bGwgJiYgc2VydmljZUVuZHBvaW50LmVJc1Byb3h5KCkpIHsKIAkJCUludGVybmFsRU9iamVjdCBvbGRTZXJ2aWNlRW5kcG9pbnQgPSAoSW50ZXJuYWxFT2JqZWN0KXNlcnZpY2VFbmRwb2ludDsKQEAgLTIzNSw2ICsyMzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fVFJBTlNBQ1RJT05fVFlQRToKQEAgLTI1Myw2ICsyNTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBFamJQYWNrYWdlLlNFU1NJT05fX1RSQU5TQUNUSU9OX1RZUEU6CkBAIC0yNzMsNiArMjc3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OX19UUkFOU0FDVElPTl9UWVBFOgpAQCAtMjkzLDYgKzI5OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEVqYlBhY2thZ2UuU0VTU0lPTl9fVFJBTlNBQ1RJT05fVFlQRToKQEAgLTMwOCwxNCArMzE0LDE1IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRyYW5zYWN0aW9uVHlwZTogIik7Ci0JCWlmICh0cmFuc2FjdGlvblR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHRyYW5zYWN0aW9uVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlc3Npb25UeXBlOiAiKTsKLQkJaWYgKHNlc3Npb25UeXBlRVNldCkgcmVzdWx0LmFwcGVuZChzZXNzaW9uVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHRyYW5zYWN0aW9uVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHRyYW5zYWN0aW9uVHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25UeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBzZXNzaW9uVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHNlc3Npb25UeXBlRVNldCkgcmVzdWx0LmFwcGVuZChzZXNzaW9uVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC9pbXBsL1N1cGVydHlwZUNNUEF0dHJpYnV0ZUZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyLmphdmEKaW5kZXggN2U1MjM2YS4uYTlkYTQ3YyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL2ltcGwvU3VwZXJ0eXBlQ01QQXR0cmlidXRlRmlsdGVyLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIAlzdXBlcigpOwogfQogCitAT3ZlcnJpZGUKIHByb3RlY3RlZCBMaXN0IGZpbHRlck5vdGNhY2hlZChDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCkgewogCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgc3VwZXJ0eXBlID0gbnVsbDsKIAlFamJNb2R1bGVFeHRlbnNpb25IZWxwZXIgZXh0ZW5zaW9uSGVscGVyID0gZ2V0RWpiTW9kdWxlRXh0SGVscGVyKGNtcCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBGaWVsZERlc2NyaXB0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NNUEZpZWxkRGVzY3JpcHRvci5qYXZhCmluZGV4IDhjNmQwNjcuLjYxMGU1MmYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NNUEZpZWxkRGVzY3JpcHRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NNUEZpZWxkRGVzY3JpcHRvci5qYXZhCkBAIC01NSw2ICs1NSw3IEBACiAgKiBhbmQge0BsaW5rIEphdmFQYXJhbWV0ZXJEZXNjcmlwdG9yI2dldE5hbWUoKX0gbWV0aG9kcyBhcmUgdXNlZAogICogdG8gYnVpbGQgdGhlIHJlc3VsdC4KICAqLworQE92ZXJyaWRlCiBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKIAlzYi5hcHBlbmQoZ2V0VHlwZSgpKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NNUEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NNUEtleVN5bmNocm9uaXphdGlvbkFkYXB0ZXIuamF2YQppbmRleCBiZmMxOGExLi4zYzY5YjMzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9DTVBLZXlTeW5jaHJvbml6YXRpb25BZGFwdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvQ01QS2V5U3luY2hyb25pemF0aW9uQWRhcHRlci5qYXZhCkBAIC0xMzksNiArMTM5LDcgQEAKIAkJfQogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJaWYgKGlzVXBkYXRpbmcgfHwgIWlzRW5hYmxlZCkgcmV0dXJuOyAvL3dlIGRvbid0IHdhbnQgdG8gcmVhY3QgdG8gb3VyIG93biBjaGFuZ2VzCiAJCXRyeSB7CkBAIC0zOTksNiArNDAwLDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI3NldFRhcmdldChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcikKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7CiAJCXN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOyAKIAl9CkBAIC00MDcsNyArNDA5LDggQEAKICAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7CisgICAgQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewogICAgICAgICByZXR1cm4gQURBUFRFUl9UWVBFLmVxdWFscyh0eXBlKTsKICAgICB9CiAgICAgLy9UbyB0dXJuIHN5bmMgb24gb3Igb2ZmCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9Db21tb25SZWxhdGlvbnNoaXBBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhCmluZGV4IDRhZDU2YTMuLmE0OGZmNDggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0NvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewogCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewogCQkJY2FzZSBOb3RpZmljYXRpb24uQUREIDoKQEAgLTE2Myw2ICsxNjQsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjc2V0VGFyZ2V0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBub3RpZmllcikgewogCQkvL09ubHkgc2V0IHRoZSB0YXJnZXQgaWYgaXQgaXMgYSBDb21tb25SZWxhdGlvbnNoaXAKIAkJaWYgKG5vdGlmaWVyID09IG51bGwgfHwgbm90aWZpZXIgaW5zdGFuY2VvZiBDb21tb25SZWxhdGlvbnNoaXApCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FSkJBdHRyaWJ1dGVNYWludGVuYW5jZUZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FSkJBdHRyaWJ1dGVNYWludGVuYW5jZUZhY3RvcnlJbXBsLmphdmEKaW5kZXggY2E1NTU5MS4uNTI0YzA3OCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRUpCQXR0cmlidXRlTWFpbnRlbmFuY2VGYWN0b3J5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGwuamF2YQpAQCAtMjYsMjAgKzI2LDI0IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnV0aWwuRWpiQWRhcHRlckZhY3RvcnkjY3JlYXRlQWRhcHRlcihvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcikKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewogCQlBZGFwdGVyIHRhcmdldEFkYXB0ZXIgPSAoQWRhcHRlcikgbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKIAkJcmV0dXJuIEV4dGVuZGVkRWNvcmVVdGlsLmNyZWF0ZUFkYXB0ZXJGb3JMb2FkaW5nKHRhcmdldEFkYXB0ZXIsIChFT2JqZWN0KSB0YXJnZXQpOwogCX0KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCUmVsYXRpb25BZGFwdGVyKCkgewogCQlyZXR1cm4gbmV3IEVKQlJlbGF0aW9uQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyKCk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlbGF0aW9uc2hpcHNBZGFwdGVyKCkgewogCQlyZXR1cm4gbmV3IFJlbGF0aW9uc2hpcHNBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CiAJCXJldHVybiBBREFQVEVSX0tFWSA9PSB0eXBlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VKQlJlbGF0aW9uQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FSkJSZWxhdGlvbkF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhCmluZGV4IGViY2Y3MTguLjYwN2M5YjQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VKQlJlbGF0aW9uQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRUpCUmVsYXRpb25BdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLnV0aWwuQ29tbW9uUmVsYXRpb25zaGlwQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyI2lzUmVsYXRpb25zaGlwUm9sZXNTRihFT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIGlzUmVsYXRpb25zaGlwUm9sZXNTRihFT2JqZWN0IHNmKSB7CiAJCXJldHVybiBzZiA9PSBFSkJfUEFDSy5nZXRFSkJSZWxhdGlvbl9SZWxhdGlvbnNoaXBSb2xlcygpOwogCX0KQEAgLTMxLDYgKzMyLDcgQEAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsLkNvbW1vblJlbGF0aW9uc2hpcEF0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlciNpc1JlbGF0aW9uc2hpcHNTRihFT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIGlzUmVsYXRpb25zaGlwc1NGKEVPYmplY3Qgc2YpIHsKIAkJcmV0dXJuIHNmID09IEVKQl9QQUNLLmdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCk7CiAJfQpAQCAtMzgsNiArNDAsNyBAQAogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7CiAJCXJldHVybiBFSkJBdHRyaWJ1dGVNYWludGVuYW5jZUZhY3RvcnlJbXBsLkFEQVBURVJfS0VZID09IHR5cGU7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL0VqYkFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggZmVkZTg5NC4uNDA1NzgxOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvRWpiQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9FamJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC01Niw2ICs1Niw3IEBACiAJCQltb2RlbFBhY2thZ2UgPSAoRWpiUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKTsKIAkJfQogCX0KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CiAJCWlmICh0eXBlID09IG1vZGVsUGFja2FnZSkgewogCQkJcmV0dXJuIHRydWU7CkBAIC02Niw4OCArNjcsMTE2IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAJcHJvdGVjdGVkIEVqYlN3aXRjaCBzdyA9IG5ldyBFamJTd2l0Y2goKSB7CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQZXJtaXNzaW9uKE1ldGhvZFBlcm1pc3Npb24gb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGVybWlzc2lvbkFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlQXNzZW1ibHlEZXNjcmlwdG9yKEFzc2VtYmx5RGVzY3JpcHRvciBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVBc3NlbWJseURlc2NyaXB0b3JBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFRyYW5zYWN0aW9uKE1ldGhvZFRyYW5zYWN0aW9uIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VFbnRlcnByaXNlQmVhbihFbnRlcnByaXNlQmVhbiBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVFbnRlcnByaXNlQmVhbkFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlRW50aXR5KEVudGl0eSBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVFbnRpdHlBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5QWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VDTVBBdHRyaWJ1dGUoQ01QQXR0cmlidXRlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUNNUEF0dHJpYnV0ZUFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlQ01SRmllbGQoQ01SRmllbGQgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlQ01SRmllbGRBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUVKQlJlbGF0aW9uc2hpcFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbihFSkJSZWxhdGlvbiBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVFSkJSZWxhdGlvbkFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlUmVsYXRpb25zaGlwcyhSZWxhdGlvbnNoaXBzIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZVJlbGF0aW9uc2hpcHNBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphcihFSkJKYXIgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlRUpCSmFyQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VSb2xlU291cmNlKFJvbGVTb3VyY2Ugb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlUm9sZVNvdXJjZUFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlUXVlcnkoUXVlcnkgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlUXVlcnlBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZVF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZVF1ZXJ5TWV0aG9kQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlRXhjbHVkZUxpc3QoRXhjbHVkZUxpc3Qgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlRXhjbHVkZUxpc3RBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZVNlc3Npb24oU2Vzc2lvbiBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVTZXNzaW9uQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlRHJpdmVuKE1lc3NhZ2VEcml2ZW4gb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURyaXZlbkFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVNZXNzYWdlRHJpdmVuRGVzdGluYXRpb25BZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2YXRpb25Db25maWcoQWN0aXZhdGlvbkNvbmZpZyBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVBY3RpdmF0aW9uQ29uZmlnQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eUFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlRUpCTWV0aG9kQ2F0ZWdvcnkoRUpCTWV0aG9kQ2F0ZWdvcnkgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlRUpCTWV0aG9kQ2F0ZWdvcnlBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVFQXR0cmlidXRlQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VFU3RydWN0dXJhbEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUVTdHJ1Y3R1cmFsRmVhdHVyZUFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlRU1vZGVsRWxlbWVudChFTW9kZWxFbGVtZW50IG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUVNb2RlbEVsZW1lbnRBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpOwogCQl9CiAJfTsKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewogCQlyZXR1cm4gKEFkYXB0ZXIpIHN3LmRvU3dpdGNoKChFT2JqZWN0KSB0YXJnZXQpOwogCX0KQEAgLTI2NSwxMDUgKzI5NCwxMzkgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgRWpiU3dpdGNoIG1vZGVsU3dpdGNoID0KIAkJbmV3IEVqYlN3aXRjaCgpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlQ29udGFpbmVyTWFuYWdlZEVudGl0eShDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXRob2RQZXJtaXNzaW9uKE1ldGhvZFBlcm1pc3Npb24gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFBlcm1pc3Npb25BZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUFzc2VtYmx5RGVzY3JpcHRvcihBc3NlbWJseURlc2NyaXB0b3Igb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvckFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kVHJhbnNhY3Rpb24oTWV0aG9kVHJhbnNhY3Rpb24gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXNzaW9uKFNlc3Npb24gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVNlc3Npb25BZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUVudGl0eShFbnRpdHkgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVudGl0eUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRW50ZXJwcmlzZUJlYW4oRW50ZXJwcmlzZUJlYW4gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVudGVycHJpc2VCZWFuQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJNZXRob2RDYXRlZ29yeShFSkJNZXRob2RDYXRlZ29yeSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRUpCTWV0aG9kQ2F0ZWdvcnlBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQkphcihFSkJKYXIgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVKQkphckFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlTWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VDTVBBdHRyaWJ1dGUoQ01QQXR0cmlidXRlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVDTVBBdHRyaWJ1dGVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVJlbGF0aW9uc2hpcHMoUmVsYXRpb25zaGlwcyBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUmVsYXRpb25zaGlwc0FkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlUXVlcnkoUXVlcnkgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVF1ZXJ5QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VFSkJSZWxhdGlvbihFSkJSZWxhdGlvbiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRUpCUmVsYXRpb25BZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQlJlbGF0aW9uc2hpcFJvbGUoRUpCUmVsYXRpb25zaGlwUm9sZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlUm9sZVNvdXJjZShSb2xlU291cmNlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVSb2xlU291cmNlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VDTVJGaWVsZChDTVJGaWVsZCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQ01SRmllbGRBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZU1lc3NhZ2VEcml2ZW4oTWVzc2FnZURyaXZlbiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURyaXZlbkFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKE1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VFeGNsdWRlTGlzdChFeGNsdWRlTGlzdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRXhjbHVkZUxpc3RBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVF1ZXJ5TWV0aG9kKFF1ZXJ5TWV0aG9kIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVRdWVyeU1ldGhvZEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VBY3RpdmF0aW9uQ29uZmlnKEFjdGl2YXRpb25Db25maWcgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUFjdGl2YXRpb25Db25maWdBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFT2JqZWN0KEoyRUVFT2JqZWN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVKMkVFRU9iamVjdEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb25Hcm91cChEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUpORElFbnZSZWZzR3JvdXAoSk5ESUVudlJlZnNHcm91cCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSk5ESUVudlJlZnNHcm91cEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRU1vZGVsRWxlbWVudChFTW9kZWxFbGVtZW50IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFTW9kZWxFbGVtZW50QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZWRFbGVtZW50KEVOYW1lZEVsZW1lbnQgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVOYW1lZEVsZW1lbnRBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUVUeXBlZEVsZW1lbnQoRVR5cGVkRWxlbWVudCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRVR5cGVkRWxlbWVudEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRVN0cnVjdHVyYWxGZWF0dXJlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VFQXR0cmlidXRlKEVBdHRyaWJ1dGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVBdHRyaWJ1dGVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUoyRUVFQXR0cmlidXRlKEoyRUVFQXR0cmlidXRlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVKMkVFRUF0dHJpYnV0ZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwogCQkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvTURCQWN0aXZhdGlvbkNvbmZpZ01vZGVsVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvTURCQWN0aXZhdGlvbkNvbmZpZ01vZGVsVXRpbC5qYXZhCmluZGV4IDNmZDIzYWYuLjZjZjc0ZjYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL01EQkFjdGl2YXRpb25Db25maWdNb2RlbFV0aWwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9NREJBY3RpdmF0aW9uQ29uZmlnTW9kZWxVdGlsLmphdmEKQEAgLTEwLDkgKzEwLDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIENyZWF0ZWQgb24gSmFuIDMwLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwudXRpbDsKIApAQCAtMjAsOSArMTcsNiBAQAogCiAvKioKICAqIEBhdXRob3IgdmlqYXliCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwdWJsaWMgY2xhc3MgTURCQWN0aXZhdGlvbkNvbmZpZ01vZGVsVXRpbCB7CiAgICAgCkBAIC00Nyw3ICs0MSw2IEBACiAgICAgICovCiAgICAgcHVibGljIE1EQkFjdGl2YXRpb25Db25maWdNb2RlbFV0aWwoKSB7CiAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgogICAgIH0KICAgICAKICAgICBwdWJsaWMgc3RhdGljIEhhc2hNYXAgY3JlYXRlU3RhbmRhcmRBY3RpdmF0aW9uQ29uZmlnTWFwKCkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvUmVsYXRpb25zaGlwc0F0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL2ludGVybmFsL3V0aWwvUmVsYXRpb25zaGlwc0F0dHJpYnV0ZU1haW50ZW5hbmNlQWRhcHRlci5qYXZhCmluZGV4IDJhMGFlODguLmI3MzEzMWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi9pbnRlcm5hbC91dGlsL1JlbGF0aW9uc2hpcHNBdHRyaWJ1dGVNYWludGVuYW5jZUFkYXB0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvaW50ZXJuYWwvdXRpbC9SZWxhdGlvbnNoaXBzQXR0cmlidXRlTWFpbnRlbmFuY2VBZGFwdGVyLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24pCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7CiAJCWlmICgoRVN0cnVjdHVyYWxGZWF0dXJlKW1zZy5nZXRGZWF0dXJlKCkgPT0gRWpiRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpLmdldFJlbGF0aW9uc2hpcHNfRWpiUmVsYXRpb25zKCkpIHsKIAkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFQ29uc3RhbnRzLmphdmEKaW5kZXggNDhlYmFiZS4uM2QwODM2MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRUNvbnN0YW50cy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVDb25zdGFudHMuamF2YQpAQCAtNTEsNyArNTEsOCBAQAogICAgIFN0cmluZyBBUFBfQ0xJRU5UX1NZU1RFTUlEXzFfMyAgICAgICAgICA9ICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZCI7IC8vJE5PTi1OTFMtMSQKICAgICBTdHJpbmcgQVBQX0NMSUVOVF9BTFRfU1lTVEVNSURfMV8zICAgICAgPSAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb24tY2xpZW50XzEuMy5kdGQiOyAvLyROT04tTkxTLTEkCiAgICAgU3RyaW5nIEFQUF9DTElFTlRfU0NIRU1BXzFfNCAgICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZCI7Ly8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBBUFBfQ0xJRU5UX1NDSEVNQV81ICAgICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZCI7IC8vJE5PTi1OTFMtMSQgLy8gRUpCMworICAgIFN0cmluZyBBUFBfQ0xJRU5UX1NDSEVNQV81ICAgICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZCI7IC8vJE5PTi1OTFMtMSQKKyAgICBTdHJpbmcgQVBQX0NMSUVOVF9TQ0hFTUFfNiAgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNi54c2QiOyAvLyROT04tTkxTLTEkIC8vIEVKQjMKICAgICAKICAgICAvL0FwcGxpY2F0aW9uIGNvbnN0YW50cwogICAgIC8qKiAiQXBwbGljYXRpb25fSUQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02MSw3ICs2Miw4IEBACiAgICAgVVJJIEFQUExJQ0FUSU9OX0REX1VSSV9PQkogICAgICAgICAgICAgICAgICAgICAgPSAgICAgICBVUkkuY3JlYXRlVVJJKEFQUExJQ0FUSU9OX0REX1VSSSk7CiAgICAgLyoqICJhcHBsaWNhdGlvbi54bWwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICBTdHJpbmcgQVBQTElDQVRJT05fRERfU0hPUlRfTkFNRSAgICAgICAgPSAgICAgICAiYXBwbGljYXRpb24ueG1sIjsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBFQVJfRklMRV9FWFQgPSAiLmVhciI7IC8vLy8kTk9OLU5MUy0xJAorIC8vIEBkZXByZWNhdGVkIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzLkVBUl9FWFQKKyAgICBTdHJpbmcgRUFSX0ZJTEVfRVhUID0gIi5lYXIiOyAvLyROT04tTkxTLTEkCiAgICAgLyoqIERvYyB0eXBlIGZvciBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzICovCiAgICAgU3RyaW5nIEFQUExJQ0FUSU9OX0RPQ1RZUEUgICAgICAgICAgICAgICAgICAgICAgPSAgICAgICAiYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCiAgICAgU3RyaW5nIEFQUExJQ0FUSU9OX1BVQkxJQ0lEXzFfMiAgICAgICAgID0gICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4yLy9FTiI7IC8vJE5PTi1OTFMtMSQKQEAgLTc0LDcgKzc2LDggQEAKICAgICBTdHJpbmcgQVBQTElDQVRJT05fU1lTVEVNSURfMV80ICAgICAgICAgPSAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb25fMV80LmR0ZCI7IC8vJE5PTi1OTFMtMSQKICAgICBTdHJpbmcgQVBQTElDQVRJT05fQUxUX1NZU1RFTUlEXzFfNCA9ICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb25fMV80LmR0ZCI7IC8vJE5PTi1OTFMtMSQKICAgICBTdHJpbmcgQVBQTElDQVRJT05fU0NIRU1BXzFfNCAgICAgICA9ICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiOy8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgQVBQTElDQVRJT05fU0NIRU1BXzUgICAgICAgICA9ICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbl81LnhzZCI7IC8vJE5PTi1OTFMtMSQgLy8gRUpCMworICAgIFN0cmluZyBBUFBMSUNBVElPTl9TQ0hFTUFfNSAgICAgICAgID0gICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkIjsgLy8kTk9OLU5MUy0xJAorICAgIFN0cmluZyBBUFBMSUNBVElPTl9TQ0hFTUFfNiAgICAgICAgID0gICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzYueHNkIjsgLy8kTk9OLU5MUy0xJCAKICAgICAKICAgICAvL0VKQiBKYXIgQ29uc3RhbnRzCiAgICAgLyoqICJlamItamFyX0lEIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtOTYsMTMgKzk5LDIzIEBACiAgICAgU3RyaW5nIEVKQkpBUl9BTFRfU1lTVEVNSURfMl8wICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2VqYi1qYXJfMi4wLmR0ZCI7IC8vJE5PTi1OTFMtMSQKICAgICBTdHJpbmcgRUpCSkFSX1NDSEVNQV8yXzEgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2VqYi1qYXJfMl8xLnhzZCI7Ly8kTk9OLU5MUy0xJAogICAgIFN0cmluZyBFSkJKQVJfU0NIRU1BXzJfMV9OUyAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2VqYi1qYXJfMl8xLnhzZCI7Ly8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBFSkJKQVJfU0NIRU1BXzNfMCAgICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18wLnhzZCI7IC8vJE5PTi1OTFMtMSQgLy8gRUpCMwotICAgIFN0cmluZyBFSkJKQVJfU0NIRU1BXzNfMF9OUyAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkIjsgLy8kTk9OLU5MUy0xJCAvLyBFSkIzCisgICAgU3RyaW5nIEVKQkpBUl9TQ0hFTUFfM18wICAgICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkIjsgLy8kTk9OLU5MUy0xJCAKKyAgICBTdHJpbmcgRUpCSkFSX1NDSEVNQV8zXzBfTlMgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2VqYi1qYXJfM18wLnhzZCI7IC8vJE5PTi1OTFMtMSQKKyAgICBTdHJpbmcgRUpCSkFSX1NDSEVNQV8zXzEgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9lamItamFyXzNfMS54c2QiOyAvLyROT04tTkxTLTEkIAorICAgIFN0cmluZyBFSkJKQVJfU0NIRU1BXzNfMV9OUyAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzEueHNkIjsgLy8kTk9OLU5MUy0xJCAKICAgICAKICAgICAvLyBFQVIgY29uc3RhbnRzCiAgICAgCi0gICAgU3RyaW5nIEVBUl9ST09UX0RJUgkJCQk9CSIvIjsKLSAgICBTdHJpbmcgRUFSX0RFRkFVTFRfTElCX0RJUgkJPQkiL2xpYiI7CisgICAgU3RyaW5nIEVBUl9ST09UX0RJUgkJCQk9CSIvIjsgLy8kTk9OLU5MUy0xJAorICAgIFN0cmluZyBFQVJfREVGQVVMVF9MSUJfRElSCQk9CSIvbGliIjsgLy8kTk9OLU5MUy0xJAorICAgIAorICAgIC8vIFdlYiBGcmFnbWVudHMgQ29uc3RhbnRzIAorICAgIFN0cmluZyAJV0VCRlJBR01FTlRfRE9DVFlQRSAgICAgICAgID0gICAgICAgIndlYi1mcmFnbWVudCI7IC8vJE5PTi1OTFMtMSQKKyAgICBTdHJpbmcgIFdFQkZSQUdNRU5UX0lECQkJCT0gCQkiV2ViRnJhZ21lbnRfSUQiOyAvLyROT04tTkxTLTEkCisgICAgU3RyaW5nIAlXRUJGUkFHTUVOVF9ERF9VUkkJCQk9CQkiTUVUQS1JTkYvd2ViLWZyYWdtZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKKyAgICBVUkkgCVdFQkZSQUdNRU5UX0REX1VSSV9PQkogICAgICA9ICAgICAgIFVSSS5jcmVhdGVVUkkoV0VCRlJBR01FTlRfRERfVVJJKTsKKyAgICBTdHJpbmcgCVdFQkZSQUdNRU5UX0REX1NIT1JUX05BTUUgICA9ICAgICAgICJ3ZWItZnJhZ21lbnQueG1sIjsgLy8kTk9OLU5MUy0xJAorICAgIFN0cmluZyAgV0VCRlJBR01FTlRfU0NIRU1BXzNfMCAJCT0gCQkiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZnJhZ21lbnRfM18wLnhzZCI7IC8vJE5PTi1OTFMtMSQKICAgICAKICAgICAvL1dlYiBhcHAgQ29uc3RhbnRzCiAgICAgLyoqICJXZWJBcHBfSUQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTI0LDYgKzEzNyw5IEBACiAgICAgU3RyaW5nIFdFQkFQUF9BTFRfU1lTVEVNSURfMl8zICA9ICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzIuMy5kdGQiOyAvLyROT04tTkxTLTEkCiAgICAgU3RyaW5nIFdFQkFQUF9TQ0hFTUFfMl80ICAgICAgICA9ICAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiOy8vJE5PTi1OTFMtMSQKICAgICBTdHJpbmcgV0VCQVBQX1NDSEVNQV8yXzUgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiOy8vJE5PTi1OTFMtMSQKKyAgICBTdHJpbmcgV0VCQVBQX1NDSEVNQV8zXzAgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiOy8vJE5PTi1OTFMtMSQKKyAgICAvKiogIldFQi1JTkYvZWpiLWphci54bWwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgU3RyaW5nIEVKQkpBUl9JTl9XQVJfRERfVVJJICAgICAgICAgICAgICAgID0gICAiV0VCLUlORi9lamItamFyLnhtbCI7IC8vJE5PTi1OTFMtMSQKICAgICAvL0oyQyBSZXNvdXJjZSBBZGFwdGVyIENvbnN0YW50cwogICAgIC8qKiAiSjJDUmVzb3VyY2VBZGFwdGVyX0lEIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgU3RyaW5nIFJBUl9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICAgICAgICJKMkNSZXNvdXJjZUFkYXB0ZXJfSUQiOyAvLyROT04tTkxTLTEkCkBAIC0xMzksNyArMTU1LDcgQEAKICAgICBTdHJpbmcgQ09OTkVDVE9SX1NZU1RFTUlEXzFfMCAgICAgICAgICAgPSAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvY29ubmVjdG9yXzFfMC5kdGQiOyAvLyROT04tTkxTLTEkCiAgICAgU3RyaW5nIENPTk5FQ1RPUl9BTFRfU1lTVEVNSURfMV8wICAgICAgID0gICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2Nvbm5lY3Rvcl8xLjAuZHRkIjsgLy8kTk9OLU5MUy0xJAogICAgIFN0cmluZyBDT05ORUNUT1JfU0NIRU1BXzFfNSAgICAgICAgID0gICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkIjsvLyROT04tTkxTLTEkCi0gICAgCisgICAgU3RyaW5nIENPTk5FQ1RPUl9TQ0hFTUFfMV82ICAgICAgICAgPSAgICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2Nvbm5lY3Rvcl8xXzYueHNkIjsvLyROT04tTkxTLTEkCiAgICAgLy9XZWIgU2VydmljZXMgQ29uc3RhbnRzCiAgICAgLyoqIERvYyB0eXBlIGZvciB3ZWJzZXJ2aWNlcyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzICovCiAgICAgU3RyaW5nIFdFQl9TRVJWSUNFU19DTElFTlRfRE9DVFlQRSAgICAgID0gIndlYnNlcnZpY2VzY2xpZW50IjsgIC8vJE5PTi1OTFMtMSQKQEAgLTE2OCw3ICsxODQsOSBAQAogICAgIFN0cmluZyBXRUJTRVJWSUNFX1NDSEVNQV9MT0NfU1VOXzFfMSA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2oyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiOy8vJE5PTi1OTFMtMSQKICAgICBTdHJpbmcgV0VCU0VSVklDRV9TQ0hFTUFfMV8yID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzIueHNkIjsvLyROT04tTkxTLTEkCiAgICAgU3RyaW5nIFdFQlNFUlZJQ0VfU0NIRU1BX0xPQ19TVU5fMV8yID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QiOy8vJE5PTi1OTFMtMSQKLSAgICAKKyAgICBTdHJpbmcgV0VCU0VSVklDRV9TQ0hFTUFfMV8zID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvamF2YWVlX3dlYl9zZXJ2aWNlc18xXzMueHNkIjsvLyROT04tTkxTLTEkCisgICAgU3RyaW5nIFdFQlNFUlZJQ0VfU0NIRU1BX0xPQ19TVU5fMV8zID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMy54c2QiOy8vJE5PTi1OTFMtMSQKKyAgICAgICAgCiAgICAgLy9NaXNjZWxsYW5lb3VzIGNvbnN0YW50cwogICAgIC8qKiAiVVRGLTgiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIFN0cmluZyBERUZBVUxUX1hNTF9FTkNPRElORyAgICAgICAgICAgICA9ICAgICAgICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKQEAgLTE4NSwxNiArMjAzLDIyIEBACiAgICAgU3RyaW5nIFhTSV9OU19VUkwgICAgICAgICAgICAgICAgICAgICAgID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJCAKICAgICBTdHJpbmcgQVBQTElDQVRJT05fU0NIRU1BX0xPQ18xXzQgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIjsgLy8kTk9OLU5MUy0xJAogICAgIFN0cmluZyBBUFBMSUNBVElPTl9TQ0hFTUFfTE9DXzUgICAgICAgICA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNS54c2QiOyAvLyROT04tTkxTLTEkICAgICAgICAvLyBFSkIzCisgICAgU3RyaW5nIEFQUExJQ0FUSU9OX1NDSEVNQV9MT0NfNiAgICAgICAgID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbl82LnhzZCI7IC8vJE5PTi1OTFMtMSQgICAgICAgIC8vIEVBUjYKICAgICBTdHJpbmcgQVBQX0NMSUVOVF9TQ0hFTUFfTE9DXzFfNCAgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbi1jbGllbnRfMV80LnhzZCI7IC8vJE5PTi1OTFMtMSQKICAgICBTdHJpbmcgQVBQX0NMSUVOVF9TQ0hFTUFfTE9DXzUgICAgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZCI7IC8vJE5PTi1OTFMtMSQgLy9FSkIzCisgICAgU3RyaW5nIEFQUF9DTElFTlRfU0NIRU1BX0xPQ182ICAgICAgICAgID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNi54c2QiOyAvLyROT04tTkxTLTEkIC8vQXBwQ2xpZW50IDYKICAgICBTdHJpbmcgRUpCX0pBUl9TQ0hFTUFfTE9DXzJfMSAgICAgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9lamItamFyXzJfMS54c2QiOyAvLyROT04tTkxTLTEkCiAgICAgU3RyaW5nIEVKQl9KQVJfU0NIRU1BX0xPQ18zXzAgICAgCQk9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzAueHNkIjsgLy8kTk9OLU5MUy0xJCAvLyBFSkIzCisgICAgU3RyaW5nIEVKQl9KQVJfU0NIRU1BX0xPQ18zXzEgICAgCQk9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvZWpiLWphcl8zXzEueHNkIjsgLy8kTk9OLU5MUy0xJCAvLyBFSkIzLjEKICAgICBTdHJpbmcgQ09OTkVDVE9SX1NDSEVNQV9MT0NfMV81ICAgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9jb25uZWN0b3JfMV81LnhzZCI7IC8vJE5PTi1OTFMtMSQKKyAgICBTdHJpbmcgQ09OTkVDVE9SX1NDSEVNQV9MT0NfMV82ICAgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2Nvbm5lY3Rvcl8xXzYueHNkIjsgLy8kTk9OLU5MUy0xJAogICAgIFN0cmluZyBXRUJfQVBQX1NDSEVNQV9MT0NfMl80ICAgICAgICAgICA9ICJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCI7IC8vJE5PTi1OTFMtMSQKICAgICBTdHJpbmcgV0VCX0FQUF9TQ0hFTUFfTE9DXzJfNSAgICAgICAgICAgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI7IC8vJE5PTi1OTFMtMSQgLy9FSkIzCisgICAgU3RyaW5nIFdFQl9BUFBfU0NIRU1BX0xPQ18zXzAgICAgICAgICAgID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiOyAvLyROT04tTkxTLTEkIC8vV2ViIDMKICAgICBTdHJpbmcgV0VCX1NFUlZJQ0VTX0NMSUVOVF9TQ0hFTUFfTE9DXzFfMSA9ICJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzEueHNkIjsgLy8kTk9OLU5MUy0xJAogICAgIFN0cmluZyBKU1BfU0NIRU1BX0xPQ18yXzAgICAgICAgICAgICAgICA9ICAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9qc3BfMl8wLnhzZCI7IC8vJE5PTi1OTFMtMSQKICAgICBTdHJpbmcgSlNQX1NDSEVNQV9MT0NfMl8xICAgICAgICAgICAgICAgPSAgImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qc3BfMl8xLnhzZCI7IC8vJE5PTi1OTFMtMSQgLy9FSkIzCisgICAgU3RyaW5nIFdFQkZSQUdNRU5UX1NDSEVNQV9MT0NfM18wICAgICAgID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZnJhZ21lbnRfM18wLnhzZCI7IC8vJE5PTi1OTFMtMSQgLy9XZWIgRnJhZ21lbnQzCiAgICAgCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX01PREVMX05BTUUgPSAiRUFSX1ZBTElEQVRJT04iOyAvLyROT04tTkxTLTEkCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFSW5pdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRUluaXQuamF2YQppbmRleCA1Y2MxYzUyLi41NGM1Y2M4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFSW5pdC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVJbml0LmphdmEKQEAgLTEyLDM3ICsxMiw0MyBAQAogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblJlc291cmNlRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50RmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuRUpCSmFyUmVzb3VyY2VGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYkZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC51dGlsLkVKQkF0dHJpYnV0ZU1haW50ZW5hbmNlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVYTUlSZXNvdXJjZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwueG1sLkoyRUVYbWxEdERFbnRpdHlSZXNvbHZlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5Db25uZWN0b3JSZXNvdXJjZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlRhZ2xpYlBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLmltcGwuVGFnbGliUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYkFwcFJlc291cmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLldzZGRSZXNvdXJjZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwpAQCAtNTAsMTYgKzU2LDMzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5OworLy9pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FbmNvZGVyRGVjb2RlclJlZ2lzdHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUGFzc3dvcmRFbmNvZGVyRGVjb2RlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuUmV2aXNpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LkFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmltcGwuQXBwbGljYXRpb25jbGllbnRQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwuaW1wbC5KYXZhZWVQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuaW50ZXJuYWwubWV0YWRhdGEuSmF2YWVlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuV2ViUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuaW50ZXJuYWwubWV0YWRhdGEuV2ViUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYmFwcC5pbnRlcm5hbC5pbXBsLldlYmFwcFBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViYXBwLmludGVybmFsLm1ldGFkYXRhLldlYmFwcFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5pbXBsLldlYmZyYWdtZW50UGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWJmcmFnbWVudC5pbnRlcm5hbC5tZXRhZGF0YS5XZWJmcmFnbWVudFBhY2thZ2U7CiAKIC8qKgogICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KQEAgLTc5LDEzICsxMDIsMTMgQEAKIAkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY2x6LmdldFJlc291cmNlKCJWZXJzaW9uLmNsYXNzIikpOyAgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9IGNhdGNoKFRocm93YWJsZSB0KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0gd2hpbGUgbG9nZ2luZyB2ZXJzaW9uICIgKyB0KTsKLQkJCXQucHJpbnRTdGFja1RyYWNlKCk7CisJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcih0KTsKIAkJfSAKIAl9CiAJCiAJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CiAJcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHBsdWdpbl9pbml0aWFsaXplZCA9IGZhbHNlOworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW1mTW9kZWxzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKIAlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKIAkJaW5pdCh0cnVlKTsKIAl9CkBAIC05Niw4ICsxMTksMTAgQEAKIAkJCXNldERlZmF1bHRFbmNvZGVyRGVjb2RlcigpOwogCQkJRE9NVXRpbGl0aWVzLnNldERlZmF1bHRFbnRpdHlSZXNvbHZlcihKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuSU5TVEFOQ0UpOwogCQkJb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuaW5pdC5KYXZhSW5pdC5pbml0KHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpOwotCQkJaWYgKHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpCisJCQlpZiAoc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcyl7CiAJCQkJcHJlUmVnaXN0ZXJQYWNrYWdlcygpOworCQkJCXByZXJlZ2lzdGVySmF2YUVFUGFja2FnZXMoKTsKKwkJCX0KIAkJCWluaXRSZXNvdXJjZUZhY3RvcmllcygpOwogCQkJRWpiRmFjdG9yeUltcGwuaW50ZXJuYWxSZWdpc3RlckVKQlJlbGF0aW9uQWRhcHRlckZhY3RvcnkobmV3IEFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRvcigpIHsKIAkJCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnkoKSB7CkBAIC0yMzYsMjkgKzI2MSw1OSBAQAogCQl9KTsJCiAJCQogCX0KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHByZXJlZ2lzdGVySmF2YUVFUGFja2FnZXMoKSB7CisJCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkksIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeworCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgeworCQkJCXJldHVybiBKYXZhZWVQYWNrYWdlLmVJTlNUQU5DRTsKKwkJCX0KKworCQkJcHVibGljIEVGYWN0b3J5IGdldEVGYWN0b3J5KCkgeworCQkJCXJldHVybiBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRTsKKwkJCX0KKwkJfSk7CisJCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkksIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeworCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgeworCQkJCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRTsKKwkJCX0KKworCQkJcHVibGljIEVGYWN0b3J5IGdldEVGYWN0b3J5KCkgeworCQkJCXJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRTsKKwkJCX0KKwkJfSk7CisJCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZShXZWJQYWNrYWdlLmVOU19VUkksIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeworCQkJcHVibGljIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgeworCQkJCXJldHVybiBXZWJQYWNrYWdlLmVJTlNUQU5DRTsKKwkJCX0KKworCQkJcHVibGljIEVGYWN0b3J5IGdldEVGYWN0b3J5KCkgeworCQkJCXJldHVybiBXZWJGYWN0b3J5LmVJTlNUQU5DRTsKKwkJCX0KKwkJfSk7CisJCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7CisJCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7CisJCQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7CisJCQl9CisKKwkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKKwkJCQlyZXR1cm4gQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRTsKKwkJCX0KKwkJfSk7CisJCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZShBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZU5TX1VSSSwgbmV3IEVQYWNrYWdlLkRlc2NyaXB0b3IoKSB7CisJCQlwdWJsaWMgRVBhY2thZ2UgZ2V0RVBhY2thZ2UoKSB7CisJCQkJcmV0dXJuIEFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5lSU5TVEFOQ0U7CisJCQl9CisKKwkJCXB1YmxpYyBFRmFjdG9yeSBnZXRFRmFjdG9yeSgpIHsKKwkJCQlyZXR1cm4gQXBwbGljYXRpb25jbGllbnRGYWN0b3J5LmVJTlNUQU5DRTsKKwkJCX0KKwkJfSk7CisKKwl9CiAKIAlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFJlc291cmNlRmFjdG9yaWVzKCkgewogCQkvL01ha2UgcHJvdGVjdGVkCQogCQlSZXZpc2l0LnJldmlzaXQoKTsKIAotCQkvLyBPbmx5IHJlZ2lzdGVyIHRoZSBkZWZhdWx0IGZhY3RvcmllcyBpZiBhbm90aGVyIHNldCBoYXMgbm90Ci0JCS8vIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLgotCi0JCVJlc291cmNlLkZhY3RvcnkgajJlZSA9IEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSV9PQkopOwotCQlSZXNvdXJjZS5GYWN0b3J5IGRlZmF1bHRGYWN0ID0gSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkoVVJJLmNyZWF0ZVVSSShSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LkRFRkFVTFRfRVhURU5TSU9OKSk7Ci0JCWlmIChqMmVlID09IGRlZmF1bHRGYWN0KSB7Ci0JCQlFSkJKYXJSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKLQkJCVdlYkFwcFJlc291cmNlRmFjdG9yeS5yZWdpc3RlcigpOwotCQkJQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKLQkJCUFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCQlDb25uZWN0b3JSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKLQkJCVdlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCQlXc2RkUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKCk7Ci0JCQkvL3JlZ2lzdGVyKCkgaXMgbm90IGNhbGxlZCBvbiB0aGUgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5IGJlY2F1c2UKLQkJCS8vdGhlIGpheHByYy1tYXBwaW5nIGRlc2NyaXB0b3IgZG9lcyBub3QgaGF2ZSBhIHN0YW5kYXJkIHNob3J0IG5hbWUuCi0JCQkvL1RoZSBzaG9ydCBuYW1lcyBoYXZlIHRvIGJlIHJlZ2lzdGVyZWQgb25jZSB0aGV5IGFyZSBrbm93bi4KLQkJCUoyRUVYTUlSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoKTsKLQkJfQogCQlFSkJKYXJSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXJEdGRzKCk7CiAJCVdlYkFwcFJlc291cmNlRmFjdG9yeS5yZWdpc3RlckR0ZHMoKTsKIAkJQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXJEdGRzKCk7CkBAIC0yNzIsNCArMzI3LDEzMCBAQAogCQkvLyBIZXJlJ3Mgd2hlcmUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB3b3VsZCBiZSByZWFkLgogCQlwbHVnaW5faW5pdGlhbGl6ZWQgPSBiUGx1Z2luSW5pdDsKIAl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEVNRk1vZGVscygpCisJeworCQlpZiAoIWVtZk1vZGVsc0luaXRpYWxpemVkKQorCQl7CisJCQllbWZNb2RlbHNJbml0aWFsaXplZCA9IHRydWU7CisJCQkvLyBwdXQgdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBvbiBpdHMgb3duIHRocmVhZC4KKwkJCVRocmVhZCBqMmVlRW1mSW5pdFRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCl7CisJCQkJcHVibGljIHZvaWQgcnVuKCkKKwkJCQl7CisJCQkJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCisJCQkJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCQkJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKy8vCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7CisvLwkJCQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworLy8JCQkJCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCQkJCQorCQkJCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOworCQkJCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQkJCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJCisJCQkJCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7CisJCQkJCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCQkJCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQkJCQkKKwkJCQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJCQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCQkJCQorCQkJCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOworCQkJCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQkJCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJCisJCQkJCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJCQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQkJCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQkJCQkKKwkJCQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJCQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCQkJCQorCQkJCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7CisJCQkJCXRoZVdzY29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJCisJCQkJCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IChXc2RkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgOiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UpOworCQkJCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQkJCQkKKwkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOworCQkJCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCQkJCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJCQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJCQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCQkJfQorCQkJfSk7CisJCQlqMmVlRW1mSW5pdFRocmVhZC5zdGFydCgpOworCisJCQkKKwkJCS8vIHB1dCB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIG9uIGl0cyBvd24gdGhyZWFkLgorCQkJVGhyZWFkIGphdmFlZUVtZkluaXRUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpeworCQkJCXB1YmxpYyB2b2lkIHJ1bigpCisJCQkJeworCQkJCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcworCQkJCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cworCQkJCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCisJCQkJCQorCQkJCQlKYXZhZWVQYWNrYWdlSW1wbCB0aGVKYXZhZWVQYWNrYWdlID0gKEphdmFlZVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmF2YWVlUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhZWVQYWNrYWdlLmVOU19VUkkpIDogSmF2YWVlUGFja2FnZS5lSU5TVEFOQ0UpOworCQkJCQl0aGVKYXZhZWVQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQkJCQl0aGVKYXZhZWVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJCisJCQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLmltcGwuSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLmludGVybmFsLm1ldGFkYXRhLkpjYVBhY2thZ2UuZU5TX1VSSSkgOiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpjYS5pbnRlcm5hbC5tZXRhZGF0YS5KY2FQYWNrYWdlLmVJTlNUQU5DRSk7CisJCQkJCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisJCQkJCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQkJCQkKKwkJCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLmltcGwuSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2Uob3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZS5lTlNfVVJJKSA6IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuanNwLmludGVybmFsLm1ldGFkYXRhLkpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJCQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJdGhlSnNwUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCQkJCQorCQkJCQlBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSA9IChBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbmNsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7CisJCQkJCXRoZUFwcGxpY2F0aW9uY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJdGhlQXBwbGljYXRpb25jbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJCisJCQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2Uob3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5tZXRhZGF0YS5BcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJCQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQkJCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQkJCQkKKwkJCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLmltcGwuRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2Uob3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZS5lTlNfVVJJKSA6IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLmludGVybmFsLm1ldGFkYXRhLkVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJCQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJCQkJV2ViUGFja2FnZUltcGwgdGhlV2ViUGFja2FnZSA9IChXZWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViUGFja2FnZS5lTlNfVVJJKSA6IFdlYlBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJCQkJdGhlV2ViUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJdGhlV2ViUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CisJCQkJCQorCQkJCQlXZWJhcHBQYWNrYWdlSW1wbCB0aGVXZWJhcHBQYWNrYWdlID0gKFdlYmFwcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBQYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwUGFja2FnZS5lSU5TVEFOQ0UpOworCQkJCQl0aGVXZWJhcHBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQkJCQl0aGVXZWJhcHBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKKwkJCQkJCisJCQkJCVdlYmZyYWdtZW50UGFja2FnZUltcGwgdGhlV2ViZnJhZ21lbnRQYWNrYWdlID0gKFdlYmZyYWdtZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmZyYWdtZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmZyYWdtZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJmcmFnbWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJmcmFnbWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKKwkJCQkJdGhlV2ViZnJhZ21lbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCQkJCQl0aGVXZWJmcmFnbWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCQkJCX0KKwkJCX0pOworCQkJamF2YWVlRW1mSW5pdFRocmVhZC5zdGFydCgpOworCQl9CisJCQorCX0KKworCXByaXZhdGUgc3RhdGljIElMb2NrIGxvY2s7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBkZWxheSA9IDMwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgSUxvY2sgZ2V0TG9jaygpIHsKKyAgICAgICAgaWYgKGxvY2sgPT0gbnVsbCkKKyAgICAgICAgICAgIGxvY2sgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKKyAgICAgICAgcmV0dXJuIGxvY2s7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpIHsKKyAgICAgICAgZ2V0TG9jaygpLnJlbGVhc2UoKTsKKyAgICB9CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFxdWlyZUluaXRpYWxpemVQYWNrYWdlQ29udGVudHNMb2NrKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9ueworICAgIAlyZXR1cm4gZ2V0TG9jaygpLmFjcXVpcmUoZGVsYXkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVNdWx0aVN0YXR1cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRU11bHRpU3RhdHVzLmphdmEKaW5kZXggMTFmOTFkYi4uMzExNTM4ZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRU11bHRpU3RhdHVzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRU11bHRpU3RhdHVzLmphdmEKQEAgLTUyLDEwICs1MiwxMiBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEoyRUVTdGF0dXNbXSBnZXRDaGlsZHJlbigpIHsKIAkJcmV0dXJuIGNoaWxkcmVuOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzTXVsdGlTdGF0dXMoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTgzLDYgKzg1LDcgQEAKIAkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdGF0dXMsIHN1aXRhYmxlIAogCSAqIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKIAkJYnVmLmFwcGVuZCgiIGNoaWxkcmVuPXsiKTsgLy8kTk9OLU5MUy0xJApAQCAtOTksNiArMTAyLDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuaGVscGVyLkoyRUVTdGF0dXMjYXBwZW5kKEoyRUVTdGF0dXMpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEoyRUVTdGF0dXMgYXBwZW5kKEoyRUVTdGF0dXMgYVN0YXR1cykgewogCQlpZiAoYVN0YXR1cyAhPSBudWxsKQogCQkJbWVyZ2UoYVN0YXR1cyk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFU3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFU3RhdHVzLmphdmEKaW5kZXggM2I5YjJiZC4uMmNkNTdmNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVN0YXR1cy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVTdGF0dXMuamF2YQpAQCAtNjYsNyArNjYsNyBAQAogCX0KIAkKIAlwdWJsaWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgYVBhdHRlcm4sIFN0cmluZyBhcmcxKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChhUGF0dGVybiwgbmV3IFN0cmluZ1tde2FyZzF9KTsKKwkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGFQYXR0ZXJuLCBuZXcgT2JqZWN0W117YXJnMX0pOwogCX0KIAkKIAkvKioKQEAgLTE5NCw2ICsxOTQsNyBAQAogCQlyZXR1cm4gdGFyZ2V0T2JqZWN0OwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CiAJCWJ1Zi5hcHBlbmQoIk1pZ3JhdGlvblN0YXR1cyAiKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVZlcnNpb25Db25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVWZXJzaW9uQ29uc3RhbnRzLmphdmEKaW5kZXggNDk3NGE2My4uMGI4NTRkYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRVZlcnNpb25Db25zdGFudHMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFVmVyc2lvbkNvbnN0YW50cy5qYXZhCkBAIC0yNiwyMCArMjYsMjUgQEAKIAlwdWJsaWMgaW50IEFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFID0gMzsKIAlwdWJsaWMgaW50IFdFQl9UWVBFID0gNDsKIAlwdWJsaWMgaW50IFdFQlNFUlZJQ0VTX1RZUEUgPSA1OworCXB1YmxpYyBpbnQgV0VCRlJBR01FTlRfVFlQRSA9IDY7CiAJCiAJcHVibGljIGludCBKMkVFXzFfMl9JRCA9IDEyOwogCXB1YmxpYyBpbnQgSjJFRV8xXzNfSUQgPSAxMzsKIAlwdWJsaWMgaW50IEoyRUVfMV80X0lEID0gMTQ7CiAJcHVibGljIGludCBKRUVfNV8wX0lEID0gNTA7CisJcHVibGljIGludCBKRUVfNl8wX0lEID0gNjA7CiAJcHVibGljIGludCBFSkJfMV8wX0lEID0gMTA7CQogCXB1YmxpYyBpbnQgRUpCXzFfMV9JRCA9IDExOwkKIAlwdWJsaWMgaW50IEVKQl8yXzBfSUQgPSAyMDsJCiAJcHVibGljIGludCBFSkJfMl8xX0lEID0gMjE7CQogCXB1YmxpYyBpbnQgRUpCXzNfMF9JRCA9IDMwOworCXB1YmxpYyBpbnQgRUpCXzNfMV9JRCA9IDMxOwogCXB1YmxpYyBpbnQgV0VCXzJfMl9JRCA9IDIyOwogCXB1YmxpYyBpbnQgV0VCXzJfM19JRCA9IDIzOwogCXB1YmxpYyBpbnQgV0VCXzJfNF9JRCA9IDI0OwogCXB1YmxpYyBpbnQgV0VCXzJfNV9JRCA9IDI1OworCXB1YmxpYyBpbnQgV0VCXzNfMF9JRCA9IDMwOworCXB1YmxpYyBpbnQgV0VCRlJBR01FTlRfM18wX0lEID0gMzA7CiAJcHVibGljIGludCBUQUdMSUJfMV8xX0lEID0gMTE7CiAJcHVibGljIGludCBUQUdMSUJfMV8yX0lEID0gMTI7CiAJcHVibGljIGludCBUQUdMSUJfMl8wX0lEID0gMjA7CkBAIC01MCwxMSArNTUsMTQgQEAKIAlwdWJsaWMgaW50IFNFUlZMRVRfMl8zID0gMjM7CiAJcHVibGljIGludCBTRVJWTEVUXzJfNCA9IDI0OwogCXB1YmxpYyBpbnQgU0VSVkxFVF8yXzUgPSAyNTsKKwlwdWJsaWMgaW50IFNFUlZMRVRfM18wID0gMzA7CiAJcHVibGljIGludCBKQ0FfMV8wX0lEID0gMTA7CiAJcHVibGljIGludCBKQ0FfMV81X0lEID0gMTU7CisJcHVibGljIGludCBKQ0FfMV82X0lEID0gMTY7CiAJcHVibGljIGludCBXRUJTRVJWSUNFU18xXzBfSUQgPSAxMDsKIAlwdWJsaWMgaW50IFdFQlNFUlZJQ0VTXzFfMV9JRCA9IDExOwogCXB1YmxpYyBpbnQgV0VCU0VSVklDRVNfMV8yX0lEID0gMTI7CisJcHVibGljIGludCBXRUJTRVJWSUNFU18xXzNfSUQgPSAxMzsKIAlwdWJsaWMgU3RyaW5nIEoyRUVfMV80X1RFWFQgCQk9ICIxLjQiOyAvLyROT04tTkxTLTEkCiAJCiAKQEAgLTY1LDYgKzczLDcgQEAKIAlwdWJsaWMgaW50IFZFUlNJT05fMV8zID0gMTM7CQogCXB1YmxpYyBpbnQgVkVSU0lPTl8xXzQgPSAxNDsKIAlwdWJsaWMgaW50IFZFUlNJT05fMV81ID0gMTU7CisJcHVibGljIGludCBWRVJTSU9OXzFfNiA9IDE2OwogCXB1YmxpYyBpbnQgVkVSU0lPTl8yXzAgPSAyMDsKIAlwdWJsaWMgaW50IFZFUlNJT05fMl8xID0gMjE7CQogCXB1YmxpYyBpbnQgVkVSU0lPTl8yXzIgPSAyMjsJCkBAIC03Miw3ICs4MSw5IEBACiAJcHVibGljIGludCBWRVJTSU9OXzJfNCA9IDI0OwkKIAlwdWJsaWMgaW50IFZFUlNJT05fMl81ID0gMjU7IAogCXB1YmxpYyBpbnQgVkVSU0lPTl8zXzAgPSAzMDsgCisJcHVibGljIGludCBWRVJTSU9OXzNfMSA9IDMxOyAKIAlwdWJsaWMgaW50IFZFUlNJT05fNV8wID0gNTA7IAorCXB1YmxpYyBpbnQgVkVSU0lPTl82XzAgPSA2MDsgCiAJCiAJcHVibGljIFN0cmluZyBWRVJTSU9OXzFfMF9URVhUCQk9ICIxLjAiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIFN0cmluZyBWRVJTSU9OXzFfMV9URVhUICAgIAk9ICIxLjEiOyAvLyROT04tTkxTLTEkCkBAIC04MCw2ICs5MSw3IEBACiAJcHVibGljIFN0cmluZyBWRVJTSU9OXzFfM19URVhUCQk9ICIxLjMiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIFN0cmluZyBWRVJTSU9OXzFfNF9URVhUCQk9ICIxLjQiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIFN0cmluZyBWRVJTSU9OXzFfNV9URVhUCQk9ICIxLjUiOyAvLyROT04tTkxTLTEkCisJcHVibGljIFN0cmluZyBWRVJTSU9OXzFfNl9URVhUCQk9ICIxLjYiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIFN0cmluZyBWRVJTSU9OXzJfMF9URVhUCQk9ICIyLjAiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIFN0cmluZyBWRVJTSU9OXzJfMV9URVhUCQk9ICIyLjEiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIFN0cmluZyBWRVJTSU9OXzJfMl9URVhUCQk9ICIyLjIiOyAvLyROT04tTkxTLTEkCkBAIC04Nyw3ICs5OSwxMCBAQAogCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzRfVEVYVAkJPSAiMi40IjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8yXzVfVEVYVAkJPSAiMi41IjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8zXzBfVEVYVAkJPSAiMy4wIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl8zXzFfVEVYVAkJPSAiMy4xIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl81XzBfVEVYVAkJPSAiNS4wIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl82XzBfVEVYVAkJPSAiNi4wIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBTdHJpbmcgVkVSU0lPTl81X1RFWFQgICAgICAgID0gIjUiOyAgIC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgU3RyaW5nIFZFUlNJT05fNl9URVhUICAgICAgICA9ICI2IjsgICAvLyROT04tTkxTLTEkCiAJCQkJCQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvTU9GSjJFRVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvTU9GSjJFRVJlc291cmNlSGFuZGxlci5qYXZhCmluZGV4IDQxZDgzOWEuLmY3Nzk4MWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL01PRkoyRUVSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NT0ZKMkVFUmVzb3VyY2VIYW5kbGVyLmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBNSUdSQVRFRF9ERUZBVUxUX0RBVEFTT1VSQ0VfTVNHOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVfVkVSU0lPTl9OVUxMX0VSUk9SOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVfVkVSU0lPTl9QUk9YWV9FUlJPUjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1JPTEVfU09VUkNFX19FTlRJVFlfQkVBTjsKIAogCXN0YXRpYyB7CiAJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1PRkoyRUVSZXNvdXJjZUhhbmRsZXIuY2xhc3MpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV3JhcHBlZEV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV3JhcHBlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDVjMDIxMDAuLjc2OGYzNGIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dyYXBwZWRFeGNlcHRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XcmFwcGVkRXhjZXB0aW9uLmphdmEKQEAgLTE3LDYgKzE3LDEwIEBACiAgKiBjYXVzZXMgdGhpcyBleGNlcHRpb24gdG8gYmUgdGhyb3duCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXcmFwcGVkRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIGltcGxlbWVudHMgSVdyYXBwZWRFeGNlcHRpb24geworCS8qKgorCSAqIAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI0Nzc0ODg1NzQzODc1NDQ0NjdMOwogCS8qKiBUaGUgZXhjZXB0aW9uIHdoaWNoIG5lY2Vzc2l0YXRlZCB0aGlzIGV4Y2VwdGlvbiAqLwogCXByb3RlY3RlZCBFeGNlcHRpb24gbmVzdGVkRXhjZXB0aW9uOwogCkBAIC01NCwxMiArNTgsMTQgQEAKICAqIEFkZGVkIHRvIHByb3ZpZGUgY29tcGF0aWJpbGl0eSBmb3IgdGhlIEphdmEgMS40LjIgYWRkaXRpb24gb2YKICAqIDxjb2RlPlRocm93YWJsZS5nZXRDYXVzZSgpPC9jb2RlPi4KICAqLworQE92ZXJyaWRlCiBwdWJsaWMgamF2YS5sYW5nLlRocm93YWJsZSBnZXRDYXVzZSgpIHsKIAlyZXR1cm4gZ2V0TmVzdGVkRXhjZXB0aW9uKCk7CiB9CiAvKioKICAqIFByaW50IG91dCBhIHN0YWNrIHRyYWNlIHRvIHRoZSBzeXN0ZW0gZXJyLgogICovCitAT3ZlcnJpZGUKIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZSgpIHsKIAlwcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CiB9CkBAIC02Nyw2ICs3Myw3IEBACiAqIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuCiAqIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCiAqLworQE92ZXJyaWRlCiBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFN0cmVhbSBzKSB7CiAJaWYgKG5lc3RlZEV4Y2VwdGlvbiAhPSBudWxsKSB7CiAJCXMucHJpbnRsbih0aGlzKTsKQEAgLTgwLDYgKzg3LDcgQEAKICogUHJpbnRzIHRoZSBleGNlcHRpb24gdG8gU3lzdGVtLmVyci4KICogSWYgd2UgaGF2ZSBhIG5lc3RlZCBleGNlcHRpb24sIHByaW50IGl0cyBzdGFjay4KICovCitAT3ZlcnJpZGUKIHB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShqYXZhLmlvLlByaW50V3JpdGVyIHMpIHsKIAlpZiAobmVzdGVkRXhjZXB0aW9uICE9IG51bGwpIHsKIAkJcy5wcmludGxuKHRoaXMpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dyYXBwZWRSdW50aW1lRXhjZXB0aW9uLmphdmEKaW5kZXggMGYzYTFhZC4uOTc5MDFlZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV3JhcHBlZFJ1bnRpbWVFeGNlcHRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XcmFwcGVkUnVudGltZUV4Y2VwdGlvbi5qYXZhCkBAIC01OSwxMiArNTksMTQgQEAKICAqIDxjb2RlPlRocm93YWJsZS5nZXRDYXVzZSgpPC9jb2RlPi4KICAqIEByZXR1cm4gVGhlIG5lc3RlZCBleGNlcHRpb24gaGVsZCBieSB0aGUgcmVjZWl2ZXIuCiAgKi8KK0BPdmVycmlkZQogcHVibGljIGphdmEubGFuZy5UaHJvd2FibGUgZ2V0Q2F1c2UoKSB7CiAJcmV0dXJuIGdldE5lc3RlZEV4Y2VwdGlvbigpOwogfQogLyoqCiAgKiBQcmludCBvdXQgYSBzdGFjayB0cmFjZSB0byB0aGUgc3lzdGVtIGVyci4KICAqLworQE92ZXJyaWRlCiBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoKSB7CiAJcHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwogfQpAQCAtNzIsNiArNzQsNyBAQAogKiBQcmludHMgdGhlIGV4Y2VwdGlvbiB0byBTeXN0ZW0uZXJyLgogKiBJZiB3ZSBoYXZlIGEgbmVzdGVkIGV4Y2VwdGlvbiwgcHJpbnQgaXRzIHN0YWNrLgogKi8KK0BPdmVycmlkZQogcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKGphdmEuaW8uUHJpbnRTdHJlYW0gcykgewogCWlmIChuZXN0ZWRFeGNlcHRpb24gIT0gbnVsbCkgewogCQlzLnByaW50bG4odGhpcyk7CkBAIC04NSw2ICs4OCw3IEBACiAqIFByaW50cyB0aGUgZXhjZXB0aW9uIHRvIFN5c3RlbS5lcnIuCiAqIElmIHdlIGhhdmUgYSBuZXN0ZWQgZXhjZXB0aW9uLCBwcmludCBpdHMgc3RhY2suCiAqLworQE92ZXJyaWRlCiBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoamF2YS5pby5QcmludFdyaXRlciBzKSB7CiAJaWYgKG5lc3RlZEV4Y2VwdGlvbiAhPSBudWxsKSB7CiAJCXMucHJpbnRsbih0aGlzKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFWE1JUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFWE1JUmVzb3VyY2UuamF2YQppbmRleCA2MDAxNThhLi4xZTkwOGI0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVhNSVJlc291cmNlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0oyRUVYTUlSZXNvdXJjZS5qYXZhCkBAIC0zOCwyMSArMzgsMTggQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlI2dldEoyRUVWZXJzaW9uSUQoKQogCSAqLwogCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7CiAJfQogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlI2dldE1vZHVsZVZlcnNpb25JRCgpCiAJICovCiAJcHVibGljIGludCBnZXRNb2R1bGVWZXJzaW9uSUQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIDA7CiAJfQogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblJlc291cmNlI2dldFZlcnNpb25JRCgpCiAJICovCiAJcHVibGljIGludCBnZXRWZXJzaW9uSUQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIDA7CiAJfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0oyRUVYTUlSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFWE1JUmVzb3VyY2VGYWN0b3J5LmphdmEKaW5kZXggYzM1NjJkMi4uNGU4M2E0NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0oyRUVYTUlSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVhNSVJlc291cmNlRmFjdG9yeS5qYXZhCkBAIC00NCw2ICs0NCw3IEBACiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UuRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShVUkkpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKIAkJSjJFRVhNSVJlc291cmNlIHJlc291cmNlID0gbmV3IEoyRUVYTUlSZXNvdXJjZSh1cmkpOwogCQlyZXR1cm4gcmVzb3VyY2U7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vWE1MUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9YTUxSZXNvdXJjZS5qYXZhCmluZGV4IGQwY2I5NWIuLjA4YzJjZmUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9YTUxSZXNvdXJjZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9YTUxSZXNvdXJjZS5qYXZhCkBAIC0yMyw3ICsyMyw5IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFSX1RZUEUgPSA1OwogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFQl9TRVJWSUNFU19DTElFTlRfVFlQRSA9IDY7CiAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVEX0VSUk9SX01TRyA9ICJUaGlzIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQgYW5kIGNhbiBubyBsb25nZXIgYmUgdXNlZC4iOyAvKioKKwkvL1RPRE8gdGhpcyBtYXkgYmUgZGVhZAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURURfRVJST1JfTVNHID0gIlRoaXMgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLiI7Ly8kTk9OLU5MUy0xJCAKKwkvKiogCiAJICogSXMgdGhpcyBhIHJlc291cmNlIGxvYWRlZCBhcyBhbiBhbHRlcm5hdGUgZGVwbG95bWVudCBkZXNjcmlwdG9yPwogCSAqLwogCWJvb2xlYW4gaXNBbHQoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvYXBwbGljYXRpb24vQXBwbGljYXRpb25UcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2FwcGxpY2F0aW9uL0FwcGxpY2F0aW9uVHJhbnNsYXRvci5qYXZhCmluZGV4IDYzODVlZmMuLjY5ZGMwM2MgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvYXBwbGljYXRpb24vQXBwbGljYXRpb25UcmFuc2xhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9hcHBsaWNhdGlvbi9BcHBsaWNhdGlvblRyYW5zbGF0b3IuamF2YQpAQCAtNDYsNiArNDYsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7CiAJCXN3aXRjaCAodmVyc2lvbklEKSB7CiAJCQljYXNlIChKMkVFXzFfMl9JRCkgOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9hcHBsaWNhdGlvbi9Nb2R1bGVUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2FwcGxpY2F0aW9uL01vZHVsZVRyYW5zbGF0b3IuamF2YQppbmRleCAxZmZkMWU5Li4zMDdhNGU2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2FwcGxpY2F0aW9uL01vZHVsZVRyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2FwcGxpY2F0aW9uL01vZHVsZVRyYW5zbGF0b3IuamF2YQpAQCAtMTAyLDYgKzEwMiw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKIAkJaWYgKG8gPT0gbnVsbCkgCiAJCQlyZXR1cm4gQ29tbW9uVHJhbnNsYXRvcnMuRU1QVFlfQ0hJTERSRU47CkBAIC0xMjAsNiArMTIxLDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewogCQlBcHBsaWNhdGlvbkZhY3RvcnkgZmFjdCA9IEFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0U7CiAJCWlmIChFSkIuZXF1YWxzKHJlYWRBaGVhZE5hbWUpKQpAQCAtMTM3LDYgKzEzOSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjaXNNYW5hZ2VkQnlQYXJlbnQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jbGllbnQvQXBwbGljYXRpb25DbGllbnRUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NsaWVudC9BcHBsaWNhdGlvbkNsaWVudFRyYW5zbGF0b3IuamF2YQppbmRleCA3NmYxZjZlLi4xYjRmZTA5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NsaWVudC9BcHBsaWNhdGlvbkNsaWVudFRyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NsaWVudC9BcHBsaWNhdGlvbkNsaWVudFRyYW5zbGF0b3IuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7CiAJCXN3aXRjaCAodmVyc2lvbklEKSB7CiAJCQljYXNlIChKMkVFXzFfMl9JRCkgOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vQm9vbGVhblRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEKaW5kZXggZGJlZjRjNy4uOWJhZTViZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vQm9vbGVhblRyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9Cb29sZWFuVHJhbnNsYXRvci5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKIAkJaWYgKHN0clZhbHVlID09IG51bGwpCiAJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0VudkVudHJ5VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vRW52RW50cnlUcmFuc2xhdG9yLmphdmEKaW5kZXggY2Y2ZWM2Mi4uNzkzYzcyOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vRW52RW50cnlUcmFuc2xhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vRW52RW50cnlUcmFuc2xhdG9yLmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvYmosIGludCB2ZXJzaW9uSUQpIHsKIAkJLy9IYXZhIHRvIHlvdSBjcmVhdGUgYSBkaWZmZXJlbnQgb25lIGVhY2ggdGltZQogCQljaGlsZHJlbiA9IGNyZWF0ZUNoaWxkcmVuKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9FbnZFbnRyeVR5cGVUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9FbnZFbnRyeVR5cGVUcmFuc2xhdG9yLmphdmEKaW5kZXggYWZlY2Q1Ni4uZGQwNTgwMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vRW52RW50cnlUeXBlVHJhbnNsYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0VudkVudHJ5VHlwZVRyYW5zbGF0b3IuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7CQkKIAkJaWYgKHN0clZhbHVlICE9IG51bGwgJiYgc3RyVmFsdWUuc3RhcnRzV2l0aChKQVZBX0xBTkcpKSAKIAkJCXJldHVybiBzdXBlci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShzdHJWYWx1ZS5zdWJzdHJpbmcoU1VCU1RSSU5HX0xFTkdUSCksIG93bmVyKTsKQEAgLTM2LDYgKzM3LDcgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewogCQlpZiAodmFsdWUgIT0gbnVsbCkgCiAJCQlyZXR1cm4gSkFWQV9MQU5HICsgKChFbnVtZXJhdG9yKXZhbHVlKS5nZXROYW1lKCk7IApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vSmF2YUNsYXNzVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vSmF2YUNsYXNzVHJhbnNsYXRvci5qYXZhCmluZGV4IGU4ZDI0ZjkuLjE5NmIwY2QgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL0phdmFDbGFzc1RyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9KYXZhQ2xhc3NUcmFuc2xhdG9yLmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIAkJc3VwZXIoZG9tTmFtZUFuZFBhdGgsIGFGZWF0dXJlLCBzdHlsZSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lLCBTdHJpbmcgdmFsdWUsIE5vdGlmaWVyIG93bmVyKSB7CiAJCU9iamVjdCByZXN1bHQgPSBudWxsOwogCQlpZiAodmFsdWUgIT0gbnVsbCkgewpAQCAtNzMsNiArNzQsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7CiAJCWlmIChzdHJWYWx1ZSAhPSBudWxsKSB7CiAJCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IHJlbW92ZVByZWNlZWRpbmdBbmRUcmFpbGluZ1BlcmlvZHMoc3RyVmFsdWUudHJpbSgpKTsJCQpAQCAtODgsMzEgKzkwLDQ0IEBACiAJCQkJCQkJamF2YUNsYXNzID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKHF1YWxpZmllZE5hbWUsIHJzKTsKIAkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAJCQkJCQkJLy9JZ25vcmUKKwkJCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQkJCX0KIAkJCQkJCWlmIChqYXZhQ2xhc3MgIT0gbnVsbCkKIAkJCQkJCQlyZXR1cm4gamF2YUNsYXNzOwogCQkJCQl9CiAJCQkJfQogCQkJfQotCQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZihxdWFsaWZpZWROYW1lKTsKKwkJCXRyeXsKKwkJCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKHF1YWxpZmllZE5hbWUpOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpeworCQkJCS8vSWdub3JlCisJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCXByaXZhdGUgU3RyaW5nIHJlbW92ZVByZWNlZWRpbmdBbmRUcmFpbGluZ1BlcmlvZHMoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKIAkJY2hhcltdIGNoYXJhY3RlcnMgPSBxdWFsaWZpZWROYW1lLnRvQ2hhckFycmF5KCk7CiAJCWludCBzdGFydEluZGV4ID0gMDsKLQkJZm9yICg7IHN0YXJ0SW5kZXggPCBjaGFyYWN0ZXJzLmxlbmd0aCAmJiBjaGFyYWN0ZXJzW3N0YXJ0SW5kZXhdID09ICcuJzsgc3RhcnRJbmRleCsrKTsKKwkJZm9yICg7IHN0YXJ0SW5kZXggPCBjaGFyYWN0ZXJzLmxlbmd0aCAmJiBjaGFyYWN0ZXJzW3N0YXJ0SW5kZXhdID09ICcuJzsgc3RhcnRJbmRleCsrKXsKKwkJCS8vZG8gbm90aGluZyBzaW1wbHkgaW5jcmVtZW50aW5nIHN0YXJ0SW5kZXgKKwkJfQorCQkvLyBIYW5kbGUgY2FzZSB3aGVyZSBhbGwgY2hhcnMgaW4gdGhlIHF1YWxpZmllZE5hbWUgYXJlIHBlcmlvZHMKKwkJaWYoc3RhcnRJbmRleCA+PSBjaGFyYWN0ZXJzLmxlbmd0aCkKKwkJCXJldHVybiBxdWFsaWZpZWROYW1lOwogCQlpbnQgcXVhbGlmaWVkTmFtZUVuZCA9IHF1YWxpZmllZE5hbWUubGVuZ3RoKCkgLSAxOwogCQlpbnQgZW5kSW5kZXggPSBxdWFsaWZpZWROYW1lRW5kOwotCQlmb3IgKDsgZW5kSW5kZXggPiAtMSAmJiBjaGFyYWN0ZXJzW2VuZEluZGV4XSA9PSAnLic7IGVuZEluZGV4LS0pCi0JCWlmIChzdGFydEluZGV4ID09IDAgJiYgZW5kSW5kZXggPT0gcXVhbGlmaWVkTmFtZUVuZCkKLQkJCXJldHVybiBxdWFsaWZpZWROYW1lOworCQlmb3IgKDsgZW5kSW5kZXggPiAtMSAmJiBjaGFyYWN0ZXJzW2VuZEluZGV4XSA9PSAnLic7IGVuZEluZGV4LS0pIHsKKwkJCWlmIChzdGFydEluZGV4ID09IDAgJiYgZW5kSW5kZXggPT0gcXVhbGlmaWVkTmFtZUVuZCkKKwkJCQlyZXR1cm4gcXVhbGlmaWVkTmFtZTsKKwkJfQkKIAkJcmV0dXJuIHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4ICsgMSk7CisJCQogCX0JCiAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewogCQlpZiAodmFsdWUgIT0gbnVsbCkKIAkJCXJldHVybiAoKEphdmFDbGFzcykgdmFsdWUpLmdldFF1YWxpZmllZE5hbWUoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL1Jlc0F1dGhUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2NvbW1vbi9SZXNBdXRoVHJhbnNsYXRvci5qYXZhCmluZGV4IGZkZjhiOTguLjkwMDFmZmYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29tbW9uL1Jlc0F1dGhUcmFuc2xhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb21tb24vUmVzQXV0aFRyYW5zbGF0b3IuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRTdHJpbmdUb1ZhbHVlKGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0clZhbHVlLCBFT2JqZWN0IG93bmVyKSB7CiAJCWlmIChpc1dlYigoUmVzb3VyY2VSZWYpb3duZXIpKQogCQkJcmV0dXJuIGNvbnZlcnRXZWJTdHJpbmdUb1ZhbHVlKHN0clZhbHVlLCBvd25lcik7CkBAIC02MCw2ICs2MSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFZhbHVlVG9TdHJpbmcoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKIAkJaWYgKGlzV2ViMjIoKChSZXNvdXJjZVJlZilvd25lcikpKQogCQkJcmV0dXJuIGNvbnZlcnRXZWJWYWx1ZVRvU3RyaW5nKHZhbHVlLCBvd25lcik7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2Nvbm5lY3Rvci9Db25uZWN0b3JUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2Nvbm5lY3Rvci9Db25uZWN0b3JUcmFuc2xhdG9yLmphdmEKaW5kZXggODI2MTZiOC4uMjNlZmZkMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9jb25uZWN0b3IvQ29ubmVjdG9yVHJhbnNsYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvY29ubmVjdG9yL0Nvbm5lY3RvclRyYW5zbGF0b3IuamF2YQpAQCAtNTMsNiArNTMsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7CiAJCXN3aXRjaCAodmVyc2lvbklEKSB7CiAJCQljYXNlIChKMkVFXzFfMl9JRCkgOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQWNrbm93bGVkZ2VNb2RlVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQWNrbm93bGVkZ2VNb2RlVHJhbnNsYXRvci5qYXZhCmluZGV4IGM4ZmVmMjUuLmM2ZThjYmUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0Fja25vd2xlZGdlTW9kZVRyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9BY2tub3dsZWRnZU1vZGVUcmFuc2xhdG9yLmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIAl9CiAJCiAJCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKIAkJaWYgKEFVVE9fQUNLTk9XTEVER0UuZXF1YWxzSWdub3JlQ2FzZShzdHJWYWx1ZSkpCiAJCQlyZXR1cm4gQWNrbm93bGVkZ2VNb2RlLkFVVE9fQUNLTk9XTEVER0VfTElURVJBTDsKQEAgLTQ2LDYgKzQ3LDcgQEAKIAkJCXJldHVybiBzdXBlci5jb252ZXJ0U3RyaW5nVG9WYWx1ZShzdHJWYWx1ZSwgb3duZXIpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7CiAJCWlmIChBY2tub3dsZWRnZU1vZGUuQVVUT19BQ0tOT1dMRURHRV9MSVRFUkFMLmVxdWFscyh2YWx1ZSkpIAogCQkJcmV0dXJuIEFVVE9fQUNLTk9XTEVER0U7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9DTVBGaWVsZFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NNUEZpZWxkVHJhbnNsYXRvci5qYXZhCmluZGV4IDc4NjFhNmYuLmU4MDgwY2UgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NNUEZpZWxkVHJhbnNsYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NNUEZpZWxkVHJhbnNsYXRvci5qYXZhCkBAIC00NSw2ICs0NSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oKSB7CiAJCWlmIChjaGlsZHJlbiA9PSBudWxsKQogCQkJY2hpbGRyZW4gPSBjcmVhdGVDaGlsZHJlbigpOwpAQCAtNjIsNiArNjMsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldE1PRkNoaWxkcmVuKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldE1PRkNoaWxkcmVuKEVPYmplY3QgbW9mT2JqZWN0KSB7CiAJCXN3aXRjaCgoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpbW9mT2JqZWN0KS5nZXRWZXJzaW9uSUQoKSkgeyAgCiAJCQkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NNUFZlcnNpb25UcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9DTVBWZXJzaW9uVHJhbnNsYXRvci5qYXZhCmluZGV4IGYxNzQzY2QuLjY4NTM3NzQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NNUFZlcnNpb25UcmFuc2xhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQ01QVmVyc2lvblRyYW5zbGF0b3IuamF2YQpAQCAtMzgsNiArMzgsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0TU9GVmFsdWUoRU9iamVjdCBtb2ZPYmplY3QpIHsKIAkJRUpCSmFyIHBhcmVudCA9ICgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSltb2ZPYmplY3QpLmdldEVqYkphcigpOwogCQlpZiAocGFyZW50LmdldFZlcnNpb25JRCgpID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9Db250YWluZXJNYW5hZ2VkRW50aXR5VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvQ29udGFpbmVyTWFuYWdlZEVudGl0eVRyYW5zbGF0b3IuamF2YQppbmRleCBjZTQ3YTM1Li5iNzhlODk4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9Db250YWluZXJNYW5hZ2VkRW50aXR5VHJhbnNsYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0NvbnRhaW5lck1hbmFnZWRFbnRpdHlUcmFuc2xhdG9yLmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewogCQlyZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwogCX0KQEAgLTYwLDYgKzYxLDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewogCQlzd2l0Y2ggKHZlcnNpb25JRCkgewogCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKQEAgLTc0LDYgKzc2LDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VUeXBlKCkgewogCQlyZXR1cm4gQ09OVEFJTkVSOwogCX0KQEAgLTgxLDYgKzg0LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYi5FbnRpdHlUcmFuc2xhdG9yI2dldFNwZWNpZmljTWFwcygpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRTcGVjaWZpY01hcHMoaW50IHZlcnNpb25JRCkgewogCQlUcmFuc2xhdG9yW10gY21wVHJhbnNsYXRvcnMgPSBuZXcgVHJhbnNsYXRvcltdIHsKIAkJCS8vQmVnaW4gRUpCIDIuMCBhZGRlZApAQCAtOTUsNiArOTksNyBAQAogCX0KIAkKIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldEVuZE1hcHMxMygpIHsKIAkJLy9BZGRlZCBmb3IgRUpCIDIuMAogCQlUcmFuc2xhdG9yW10gcXVlcnlUID0gbmV3IFRyYW5zbGF0b3JbXSB7CkBAIC0xMDMsNiArMTA4LDcgQEAKIAkJcmV0dXJuIChUcmFuc2xhdG9yW10pIGNvbmNhdChzdXBlci5nZXRFbmRNYXBzMTMoKSwgcXVlcnlUKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRFbmRNYXBzMTQoKSB7CiAJCQkvL0FkZGVkIGZvciBFSkIgMi4wCiAJCQlUcmFuc2xhdG9yW10gcXVlcnlUID0gbmV3IFRyYW5zbGF0b3JbXSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9FSkJKYXJUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9FSkJKYXJUcmFuc2xhdG9yLmphdmEKaW5kZXggNDlhZmQ1My4uMmQ3N2NlMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvRUpCSmFyVHJhbnNsYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VKQkphclRyYW5zbGF0b3IuamF2YQpAQCAtODMsNiArODMsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7CiAJCXN3aXRjaCAodmVyc2lvbklEKSB7CiAJCQljYXNlIChKMkVFXzFfMl9JRCkgOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvRW50ZXJwcmlzZUJlYW5zVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvRW50ZXJwcmlzZUJlYW5zVHJhbnNsYXRvci5qYXZhCmluZGV4IDFmZTAzZWMuLmU0NzE2N2MgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VudGVycHJpc2VCZWFuc1RyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9FbnRlcnByaXNlQmVhbnNUcmFuc2xhdG9yLmphdmEKQEAgLTU1LDYgKzU1LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuTXVsdGlPYmplY3RUcmFuc2xhdG9yI2dldERlbGVnYXRlRm9yKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBUcmFuc2xhdG9yIGdldERlbGVnYXRlRm9yKEVPYmplY3QgbykgewogCQlzd2l0Y2ggKG8uZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIHsKIAkJCWNhc2UgRWpiUGFja2FnZS5TRVNTSU9OIDoKQEAgLTY5LDYgKzcwLDcgQEAKIAkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQmVhbiB0eXBlIGRlbGVnYXRlIGV4cGVjdGVkIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVHJhbnNsYXRvciBnZXREZWxlZ2F0ZUZvcihTdHJpbmcgZG9tTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKIAkJVHJhbnNsYXRvciByZXN1bHQgPSBudWxsOwogCQlpZiAocmVhZEFoZWFkTmFtZSAhPSBudWxsKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvRW50aXR5VHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvRW50aXR5VHJhbnNsYXRvci5qYXZhCmluZGV4IGVmMDVhYzQuLmYyYWIyODggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL0VudGl0eVRyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9FbnRpdHlUcmFuc2xhdG9yLmphdmEKQEAgLTQxLDYgKzQxLDcgQEAKIAkJLyogKG5vbi1KYXZhZG9jKQogCQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2V4dHJhY3RTdHJpbmdWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKIAkJICovCisJCUBPdmVycmlkZQogCQlwdWJsaWMgU3RyaW5nIGV4dHJhY3RTdHJpbmdWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgewogCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVHlwZSgpOwogCQl9CkBAIC00OCw2ICs0OSw3IEBACiAJCS8qIChub24tSmF2YWRvYykKIAkJCSAgICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0VmFsdWVUb1N0cmluZyhqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKIAkJCSAgICovCisJCUBPdmVycmlkZQogCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewogCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVHlwZSgpOwogCQl9CkBAIC01NSw2ICs1Nyw3IEBACiAJCS8qIChub24tSmF2YWRvYykKIAkJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZDaGlsZHJlbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKIAkJICovCisJCUBPdmVycmlkZQogCQlwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgewogCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZ2V0UGVyc2lzdGVuY2VUeXBlKCkpOwogCQl9CkBAIC03Niw2ICs3OSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamIuQWJzdHJhY3RFSkJUcmFuc2xhdG9yI2dldFNwZWNpZmljTWFwcygpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRTcGVjaWZpY01hcHMoaW50IHZlcnNpb25JRCkgewogCQlUcmFuc2xhdG9yIHJlZW50cmFudFRyYW5zbGF0b3IgPSBudWxsOwogCQlzd2l0Y2ggKHZlcnNpb25JRCkgewpAQCAtODUsOCArODksNiBAQAogCQkJCWJyZWFrOwogCQkJY2FzZSBKMkVFXzFfNF9JRCA6CiAJCQkJcmVlbnRyYW50VHJhbnNsYXRvciA9IG5ldyBCb29sZWFuVHJhbnNsYXRvcihSRUVOVFJBTlQsIEVKQl9QS0cuZ2V0RW50aXR5X1JlZW50cmFudCgpKTsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwogCQl9CiAJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsgbmV3IFBlcnNpc3RlbmNlVHlwZVRyYW5zbGF0b3IoKSwgbmV3IEphdmFDbGFzc1RyYW5zbGF0b3IoUFJJTV9LRVlfQ0xBU1MsIEVKQl9QS0cuZ2V0RW50aXR5X1ByaW1hcnlLZXkoKSksIHJlZW50cmFudFRyYW5zbGF0b3IgfTsKIAl9CkBAIC05NCw2ICs5Niw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY3JlYXRlRU1GT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKIAkJcmV0dXJuIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVudGl0eSgpOwogCX0KQEAgLTEwMSw2ICsxMDQsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7CiAJCXN3aXRjaCAodmVyc2lvbklEKSB7CiAJCQljYXNlIChKMkVFXzFfMl9JRCkgOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uVHlwZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvblR5cGVUcmFuc2xhdG9yLmphdmEKaW5kZXggNzI0OTAyOC4uMmI3NjBkNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uVHlwZVRyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXNzYWdlRHJpdmVuRGVzdGluYXRpb25UeXBlVHJhbnNsYXRvci5qYXZhCkBAIC00MCwxMSArNDAsMTEgQEAKIAkvKioKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NvbnZlcnRWYWx1ZVRvU3RyaW5nKGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7CiAJCWlmICh2YWx1ZSAhPSBudWxsKXsKIAkJCUVudW1lcmF0b3IgZW51bWVyYXRvciA9IChFbnVtZXJhdG9yKSB2YWx1ZTsKLQkJCWlmIChlbnVtZXJhdG9yICE9IG51bGwpCi0JCQkJcmV0dXJuIEpBVkFYX0pNUyArIGVudW1lcmF0b3IudG9TdHJpbmcoKTsKKwkJCXJldHVybiBKQVZBWF9KTVMgKyBlbnVtZXJhdG9yLnRvU3RyaW5nKCk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmNvbnZlcnRWYWx1ZVRvU3RyaW5nKHZhbHVlLCBvd25lcik7CiAJfQpAQCAtNTIsNiArNTIsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKIAkJU3RyaW5nIGNvcnJlY3QgPSBzdHJWYWx1ZTsKIAkJaWYgKHN0clZhbHVlICE9IG51bGwpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXNzYWdlRHJpdmVuVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWVzc2FnZURyaXZlblRyYW5zbGF0b3IuamF2YQppbmRleCA4ZDljNzYyLi4zYmM4MjYwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXNzYWdlRHJpdmVuVHJhbnNsYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01lc3NhZ2VEcml2ZW5UcmFuc2xhdG9yLmphdmEKQEAgLTM5LDYgKzM5LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2RlbC50cmFuc2xhdG9yLmVqYi5BYnN0cmFjdEVKQlRyYW5zbGF0b3IjZ2V0U3BlY2lmaWNNYXBzKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldFNwZWNpZmljTWFwcyhpbnQgdmVyc2lvbklEKSB7CiAJCXN3aXRjaCAodmVyc2lvbklEKSB7CiAJCQljYXNlIEoyRUVfMV80X0lEOgpAQCAtMTE4LDYgKzExOSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKIAkJc3dpdGNoICh2ZXJzaW9uSUQpIHsKIAkJCWNhc2UgKEoyRUVfMV8yX0lEKSA6CkBAIC0xMzcsNiArMTM5LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewogCQlyZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZURyaXZlbigpOwogCX0KQEAgLTE0NSw2ICsxNDgsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZGVsLnRyYW5zbGF0b3IuZWpiLkFic3RyYWN0RUpCVHJhbnNsYXRvciNnZXRFbmRNYXBzMTMoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RW5kTWFwczEzKCkgewogCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CiAJCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FTlZfRU5UUllfMV8zLApAQCAtMTU2LDYgKzE2MCw3IEBACiAJCX07CiAJfQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RW5kTWFwczE0KCkgewogCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CiAJCQlDb21tb25UcmFuc2xhdG9ycy5KTkRJX1JFRl9HUk9VUF9FTlZfRU5UUllfMV80LApAQCAtMTcyLDYgKzE3Nyw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamIuQWJzdHJhY3RFSkJUcmFuc2xhdG9yI3VzZXNIb21lUmVtb3RlQXR0cmlidXRlcygpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gdXNlc0hvbWVSZW1vdGVBdHRyaWJ1dGVzKCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWV0aG9kRWxlbWVudEtpbmRUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXRob2RFbGVtZW50S2luZFRyYW5zbGF0b3IuamF2YQppbmRleCA2Njg3MzVhLi4wY2I2YjEwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXRob2RFbGVtZW50S2luZFRyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXRob2RFbGVtZW50S2luZFRyYW5zbGF0b3IuamF2YQpAQCAtMzIsMTAgKzMyLDEzIEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKIAkJT2JqZWN0IG9iaiA9IHN1cGVyLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKHN0clZhbHVlLCBvd25lcik7CiAJCWlmKG9iaiAhPSBudWxsKQogCQkJcmV0dXJuIG9iajsKKwkJaWYgKHN0clZhbHVlID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKIAkJU3RyaW5nIGNvcnJlY3QgPSBzdHJWYWx1ZTsKIAkJaWYgKHN0clZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoIkhPTUUiKSkgLy8kTk9OLU5MUy0xJAogCQkJY29ycmVjdCA9ICJIb21lIjsgLy8kTk9OLU5MUy0xJApAQCAtNTEsNyArNTQsOCBAQAogCS8qIChub24tSmF2YWRvYykKICAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2lzU2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZXRNT0ZWYWx1ZShFT2JqZWN0IGVtZk9iamVjdCkgeworICAgIEBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzU2V0TU9GVmFsdWUoRU9iamVjdCBlbWZPYmplY3QpIHsKICAgICAgICAgaWYgKCgoTWV0aG9kRWxlbWVudCllbWZPYmplY3QpLmdldFR5cGUoKSA9PSBNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKQogICAgICAgICAJcmV0dXJuIGZhbHNlOwogICAgICAgICByZXR1cm4gc3VwZXIuaXNTZXRNT0ZWYWx1ZShlbWZPYmplY3QpOwpAQCAtNjAsNiArNjQsNyBAQAogICAgIC8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldE1PRkNoaWxkcmVuKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldE1PRkNoaWxkcmVuKEVPYmplY3QgbW9mT2JqZWN0KSB7CiAJCUxpc3QgcmVzdWx0ID0gc3VwZXIuZ2V0TU9GQ2hpbGRyZW4obW9mT2JqZWN0KTsKIAkJaWYocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IDApIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01ldGhvZFBhcmFtc1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL01ldGhvZFBhcmFtc1RyYW5zbGF0b3IuamF2YQppbmRleCA5ODgyNTJmLi43OGY4ZWU2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NZXRob2RQYXJhbXNUcmFuc2xhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTWV0aG9kUGFyYW1zVHJhbnNsYXRvci5qYXZhCkBAIC00NywyMSArNDcsMjQgQEAKICAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNpc011bHRpVmFsdWVkKCkKICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpVmFsdWVkKCkgeworICAgIEBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzTXVsdGlWYWx1ZWQoKSB7CiAJCXJldHVybiB0cnVlOwogICAgIH0KICAgICAKICAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRNT0ZDaGlsZHJlbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKICAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBnZXRNT0ZDaGlsZHJlbihFT2JqZWN0IG1vZk9iamVjdCkgeworICAgIEBPdmVycmlkZQorCXB1YmxpYyBMaXN0IGdldE1PRkNoaWxkcmVuKEVPYmplY3QgbW9mT2JqZWN0KSB7CiAgCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KW1vZk9iamVjdCkuZ2V0TWV0aG9kUGFyYW1zKCk7CiAgICAgfQogICAgIAogICAgIC8qIChub24tSmF2YWRvYykKICAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKKyAgICBAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShFT2JqZWN0IG1vZk9iamVjdCwgT2JqZWN0IHZhbHVlKSB7CiAJCUxpc3QgbWV0aG9kUGFyYW1zID0gKChNZXRob2RFbGVtZW50KW1vZk9iamVjdCkuZ2V0TWV0aG9kUGFyYW1zKCk7CiAJCQogICAgIAlpZih2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCkgeyAgCkBAIC03NSw2ICs3OCw3IEBACiAgICAgLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3Ijc2V0TU9GVmFsdWUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIsIGphdmEubGFuZy5PYmplY3QsIGludCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZShOb3RpZmllciBvd25lciwgT2JqZWN0IHZhbHVlLCBpbnQgbmV3SW5kZXgpIHsKIAkJKChNZXRob2RFbGVtZW50KW93bmVyKS5hZGRNZXRob2RQYXJhbXMoKFN0cmluZyl2YWx1ZSk7CiAJfQpAQCAtODIsMTMgKzg2LDE1IEBACiAgICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY2xlYXJMaXN0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyTGlzdChFT2JqZWN0IG1vZk9iamVjdCkgeworICAgIEBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNsZWFyTGlzdChFT2JqZWN0IG1vZk9iamVjdCkgewogCQkoKE1ldGhvZEVsZW1lbnQpbW9mT2JqZWN0KS5lVW5zZXQoZmVhdHVyZSk7CiAgICAgfQogICAgIAogICAgIC8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3Nob3VsZFJlbmRlckVtcHR5RE9NUGF0aChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZW5kZXJFbXB0eURPTVBhdGgoRU9iamVjdCBlT2JqZWN0KSB7CiAJCU1ldGhvZEVsZW1lbnQgbWUgPSAoKE1ldGhvZEVsZW1lbnQpZU9iamVjdCk7CiAJCXJldHVybiBtZS5oYXNNZXRob2RQYXJhbXMoKSAmJiBtZS5nZXRNZXRob2RQYXJhbXMoKS5pc0VtcHR5KCk7CkBAIC05Nyw2ICsxMDMsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI3NldE1PRlZhbHVlRnJvbUVtcHR5RE9NUGF0aChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRNT0ZWYWx1ZUZyb21FbXB0eURPTVBhdGgoRU9iamVjdCBlT2JqZWN0KSB7CiAJCSgoTWV0aG9kRWxlbWVudCllT2JqZWN0KS5hcHBseVplcm9QYXJhbXMoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NdWx0aXBsaWNpdHlUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9NdWx0aXBsaWNpdHlUcmFuc2xhdG9yLmphdmEKaW5kZXggZGRkMWI1Yi4uODg2YzJjNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvTXVsdGlwbGljaXR5VHJhbnNsYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL011bHRpcGxpY2l0eVRyYW5zbGF0b3IuamF2YQpAQCAtMzYsMTMgKzM2LDE2IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY29udmVydFN0cmluZ1RvVmFsdWUoamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyVmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKIAkJU3RyaW5nIGNvcnJlY3QgPSBzdHJWYWx1ZTsKLQkJaWYgKHN0clZhbHVlLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJPTkUiKSkgLy8kTk9OLU5MUy0xJAotCQkJY29ycmVjdCA9ICJPbmUiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgaWYgKHN0clZhbHVlLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJNQU5ZIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvcnJlY3QgPSAiTWFueSI7IC8vJE5PTi1OTFMtMSQKLQkJCQorCQlpZiAoc3RyVmFsdWUgIT0gbnVsbCkKKwkJeworCQkJaWYgKHN0clZhbHVlLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJPTkUiKSkgLy8kTk9OLU5MUy0xJAorCQkJCWNvcnJlY3QgPSAiT25lIjsgLy8kTk9OLU5MUy0xJAorCQkJZWxzZSBpZiAoc3RyVmFsdWUudG9VcHBlckNhc2UoKS5lcXVhbHMoIk1BTlkiKSkgLy8kTk9OLU5MUy0xJAorCQkJCWNvcnJlY3QgPSAiTWFueSI7IC8vJE5PTi1OTFMtMSQKKwkJfQkKIAkJcmV0dXJuIHN1cGVyLmNvbnZlcnRTdHJpbmdUb1ZhbHVlKGNvcnJlY3QsIG93bmVyKTsKIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1ByaW1LZXlGaWVsZFRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1ByaW1LZXlGaWVsZFRyYW5zbGF0b3IuamF2YQppbmRleCAyMGQzMTI0Li43N2ZmYTQ3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9QcmltS2V5RmllbGRUcmFuc2xhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvUHJpbUtleUZpZWxkVHJhbnNsYXRvci5qYXZhCkBAIC01MSw2ICs1MSw3IEBACiAJLyoqCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjb252ZXJ0U3RyaW5nVG9WYWx1ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJWYWx1ZSwgRU9iamVjdCBvd25lcikgewogCQkvLyB0cnkgYW5kIGNvbnZlcnQgdGhlIHN0cmluZyB0byBhIGNtcCBhdHRyaWJ1dGUsIG90aGVyd2lzZSBjcmVhdGUgYSBwcm94eQogCQlPYmplY3QgcmVzdWx0ID0gc3VwZXIuY29udmVydFN0cmluZ1RvVmFsdWUoc3RyVmFsdWUsIG93bmVyKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1NlY3VyaXR5SWRlbnRpdHlUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9TZWN1cml0eUlkZW50aXR5VHJhbnNsYXRvci5qYXZhCmluZGV4IGMyMTliNzcuLjAxNTBmZTMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1NlY3VyaXR5SWRlbnRpdHlUcmFuc2xhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvU2VjdXJpdHlJZGVudGl0eVRyYW5zbGF0b3IuamF2YQpAQCAtNzIsNiArNzIsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7CiAJCWlmIChvID09IG51bGwpCiAJCQlyZXR1cm4gQ29tbW9uVHJhbnNsYXRvcnMuRU1QVFlfQ0hJTERSRU47CkBAIC04Nyw2ICs4OCw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjY3JlYXRlRU1GT2JqZWN0KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY3JlYXRlRU1GT2JqZWN0KFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHJlYWRBaGVhZE5hbWUpIHsKIAkJQ29tbW9uRmFjdG9yeSBmYWN0ID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0U7IAogCQlpZiAoUlVOX0FTLmVxdWFscyhyZWFkQWhlYWROYW1lKSkgewpAQCAtOTksNiArMTAxLDcgQEAKIAkJCXJldHVybiBudWxsOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvU2Vzc2lvblRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3IvZWpiL1Nlc3Npb25UcmFuc2xhdG9yLmphdmEKaW5kZXggODUzZDRjMy4uNTU4ZGY3MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci9lamIvU2Vzc2lvblRyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL2VqYi9TZXNzaW9uVHJhbnNsYXRvci5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kZWwudHJhbnNsYXRvci5lamIuQWJzdHJhY3RFSkJUcmFuc2xhdG9yI2dldFNwZWNpZmljTWFwcygpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRTcGVjaWZpY01hcHMoaW50IHZlcnNpb25JRCkgewogCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7CiAJCQluZXcgVHJhbnNsYXRvcihTRVNTSU9OX1RZUEUsIEVKQl9QS0cuZ2V0U2Vzc2lvbl9TZXNzaW9uVHlwZSgpLCBVTlNFVF9JRl9OVUxMKSwgCQkvL0VudW1lcmF0aW9uCkBAIC01MCw2ICs1MSw3IEBACiAJICogCiAJICogU3VwcG9ydCAxLjQgYW5kIDEuMwogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0RUpCQ2xhc3NNYXAoKSB7CiAJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsJCQkKIAkJCS8vSjJFRSAxLjQKQEAgLTY0LDYgKzY2LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewogCQlyZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwogCX0KQEAgLTcyLDYgKzc1LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewogCQlzd2l0Y2ggKHZlcnNpb25JRCkgewogCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vRXJyb3JQYWdlVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9FcnJvclBhZ2VUcmFuc2xhdG9yLmphdmEKaW5kZXggNDVjMDU3Ny4uMzAxNWE2NyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9FcnJvclBhZ2VUcmFuc2xhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9FcnJvclBhZ2VUcmFuc2xhdG9yLmphdmEKQEAgLTQ2LDYgKzQ2LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewogCQlXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZmFjdCA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7CiAJCWlmIChFUlJPUl9DT0RFLmVxdWFscyhyZWFkQWhlYWROYW1lKSkKQEAgLTU5LDYgKzYwLDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewogCQlpZiAobyA9PSBudWxsKQogCQkJcmV0dXJuIENvbW1vblRyYW5zbGF0b3JzLkVNUFRZX0NISUxEUkVOOwpAQCAtNzAsNiArNzIsNyBAQAogCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3I6IEVycm9yQ29kZSBleHBlY3RlZCIpOyAvLyROT04tTkxTLTEkCiAJfQogCQkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vV2ViQXBwVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9XZWJBcHBUcmFuc2xhdG9yLmphdmEKaW5kZXggMDg0MjZkMy4uMjM4NTNhYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9XZWJBcHBUcmFuc2xhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9XZWJBcHBUcmFuc2xhdG9yLmphdmEKQEAgLTcwLDYgKzcwLDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewogCQlzd2l0Y2ggKHZlcnNpb25JRCkgewogCQkJY2FzZSAoSjJFRV8xXzJfSUQpIDoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vV2ViVHlwZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2ViYXBwbGljYXRpb24vV2ViVHlwZVRyYW5zbGF0b3IuamF2YQppbmRleCAyMjAyN2IyLi4xMTk2N2NiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYmFwcGxpY2F0aW9uL1dlYlR5cGVUcmFuc2xhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJhcHBsaWNhdGlvbi9XZWJUeXBlVHJhbnNsYXRvci5qYXZhCkBAIC0zNiwxMyArMzYsMTQgQEAKIAl9OwogCQogCXB1YmxpYyBXZWJUeXBlVHJhbnNsYXRvcigpIHsKLQkJc3VwZXIoU0VSVkxFVF9DTEFTUysnLCcrSlNQX0ZJTEUsIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmxldF9XZWJUeXBlKCkpOworCQlzdXBlcihTRVJWTEVUX0NMQVNTKycsJytKU1BfRklMRSwgV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0X1dlYlR5cGUoKSwgVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCk7CiAJfQogCiAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewogCQlpZiAobyA9PSBudWxsKQogCQkJcmV0dXJuIENvbW1vblRyYW5zbGF0b3JzLkVNUFRZX0NISUxEUkVOOwpAQCAtNTUsNiArNTYsNyBAQAogCX0KIAkKIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldERPTU5hbWUoT2JqZWN0IHZhbHVlKSB7CiAJCWlmICgoKFdlYlR5cGUpdmFsdWUpLmlzSnNwVHlwZSgpKQogCQkJcmV0dXJuIEpTUF9GSUxFOwpAQCAtNjksNiArNzEsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7CiAJCVdlYmFwcGxpY2F0aW9uRmFjdG9yeSBmYWN0ID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKIAkJaWYgKFNFUlZMRVRfQ0xBU1MuZXF1YWxzKG5vZGVOYW1lKSkKQEAgLTc5LDYgKzgyLDcgQEAKIAkJCXJldHVybiBudWxsOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvRUpCTGlua1RyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvRUpCTGlua1RyYW5zbGF0b3IuamF2YQppbmRleCA4ZmU2ZDhkLi5jMzRiNWNmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0VKQkxpbmtUcmFuc2xhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9FSkJMaW5rVHJhbnNsYXRvci5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKIAkJaWYgKG8gPT0gbnVsbCkKIAkJCXJldHVybiBDb21tb25UcmFuc2xhdG9ycy5FTVBUWV9DSElMRFJFTjsKQEAgLTQxLDYgKzQyLDcgQEAKIAl9CiAJCiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRET01OYW1lKE9iamVjdCB2YWx1ZSkgewogCSAgcmV0dXJuIEVKQl9MSU5LOwogCX0KQEAgLTUwLDEyICs1MiwxNCBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7CiAJCVdzZGRGYWN0b3J5IGZhY3QgPSBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V3NkZEZhY3RvcnkoKTsKIAkJcmV0dXJuIGZhY3QuY3JlYXRlRUpCTGluaygpOwogCiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9FbGVtZW50TmFtZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvRWxlbWVudE5hbWVUcmFuc2xhdG9yLmphdmEKaW5kZXggZGQzOTEzZS4uNTc3NmJlYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9FbGVtZW50TmFtZVRyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0VsZW1lbnROYW1lVHJhbnNsYXRvci5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKIAkJaWYgKG8gPT0gbnVsbCkKIAkJCXJldHVybiBDb21tb25UcmFuc2xhdG9ycy5FTVBUWV9DSElMRFJFTjsKQEAgLTQwLDYgKzQxLDcgQEAKIAl9CiAJCiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRET01OYW1lKE9iamVjdCB2YWx1ZSkgewogCSAgcmV0dXJuIEVMRU1FTlRfTkFNRTsKIAl9CkBAIC00OSwxMiArNTEsMTQgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewogCQlKYXhycGNtYXBGYWN0b3J5IGZhY3QgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXhycGNtYXBGYWN0b3J5KCk7CiAJCXJldHVybiBmYWN0LmNyZWF0ZUVsZW1lbnROYW1lKCk7CiAKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0ludGVyZmFjZU1hcHBpbmdUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0ludGVyZmFjZU1hcHBpbmdUcmFuc2xhdG9yLmphdmEKaW5kZXggMTViZDRhMS4uODI1NDc0NyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9JbnRlcmZhY2VNYXBwaW5nVHJhbnNsYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvSW50ZXJmYWNlTWFwcGluZ1RyYW5zbGF0b3IuamF2YQpAQCAtNjIsNiArNjIsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7CiAJCWlmIChvID09IG51bGwpCiAJCQlyZXR1cm4gQ29tbW9uVHJhbnNsYXRvcnMuRU1QVFlfQ0hJTERSRU47CkBAIC03NCw2ICs3NSw3IEBACiAJfQogCQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0RE9NTmFtZShPYmplY3QgdmFsdWUpIHsKIAkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU2VydmljZUludGVyZmFjZU1hcHBpbmcpCiAJCQlyZXR1cm4gU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElORzsKQEAgLTg4LDYgKzkwLDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewogCQlKYXhycGNtYXBGYWN0b3J5IGZhY3QgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXhycGNtYXBGYWN0b3J5KCk7CiAJCWlmIChTRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HLmVxdWFscyhub2RlTmFtZSkpCkBAIC05OCw2ICsxMDEsNyBAQAogCQkJcmV0dXJuIG51bGw7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEJ5UGFyZW50KCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9KYXhycGNtYXBUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0pheHJwY21hcFRyYW5zbGF0b3IuamF2YQppbmRleCBmNmJlZTQxLi45NDJjZGVhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0pheHJwY21hcFRyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL0pheHJwY21hcFRyYW5zbGF0b3IuamF2YQpAQCAtNDAsNiArNDAsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7CiAJICAgIGpheHJwY21hcFBhY2thZ2UgPSBKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRTsKIAkJY29tbW9uUGFja2FnZSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9TT0FQUm9sZVRyYW5zbGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvU09BUFJvbGVUcmFuc2xhdG9yLmphdmEKaW5kZXggZmQwYTM1YS4uMGFlNWM4NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9TT0FQUm9sZVRyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1NPQVBSb2xlVHJhbnNsYXRvci5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCwgaW50KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8sIGludCB2ZXJzaW9uSUQpIHsKIAkJaWYgKG8gPT0gbnVsbCkKIAkJCXJldHVybiBDb21tb25UcmFuc2xhdG9ycy5FTVBUWV9DSElMRFJFTjsKQEAgLTQzLDYgKzQ0LDcgQEAKIAl9CiAJCiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRET01OYW1lKE9iamVjdCB2YWx1ZSkgewogCSAgcmV0dXJuIFNPQVBfUk9MRTsKIAl9CkBAIC01MiwxMiArNTQsMTQgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNjcmVhdGVFTUZPYmplY3QoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGVFTUZPYmplY3QoU3RyaW5nIG5vZGVOYW1lLCBTdHJpbmcgcmVhZEFoZWFkTmFtZSkgewogCQlXc2NvbW1vbkZhY3RvcnkgZmFjdCA9IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V3Njb21tb25GYWN0b3J5KCk7CiAJCXJldHVybiBmYWN0LmNyZWF0ZVNPQVBSb2xlKCk7CiAKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkQnlQYXJlbnQoKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1NlcnZsZXRMaW5rVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9TZXJ2bGV0TGlua1RyYW5zbGF0b3IuamF2YQppbmRleCBjZjNhYmRhLi45NTdhMTNhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1NlcnZsZXRMaW5rVHJhbnNsYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvU2VydmxldExpbmtUcmFuc2xhdG9yLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbihPYmplY3QgbywgaW50IHZlcnNpb25JRCkgewogCQlpZiAobyA9PSBudWxsKQogCQkJcmV0dXJuIENvbW1vblRyYW5zbGF0b3JzLkVNUFRZX0NISUxEUkVOOwpAQCAtNDIsNiArNDMsNyBAQAogCX0KIAkKIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldERPTU5hbWUoT2JqZWN0IHZhbHVlKSB7CiAJICByZXR1cm4gU0VSVkxFVF9MSU5LOwogCX0KQEAgLTUxLDEyICs1MywxNCBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2NyZWF0ZUVNRk9iamVjdChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUVNRk9iamVjdChTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyByZWFkQWhlYWROYW1lKSB7CiAJCVdzZGRGYWN0b3J5IGZhY3QgPSBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V3NkZEZhY3RvcnkoKTsKIAkJcmV0dXJuIGZhY3QuY3JlYXRlU2VydmxldExpbmsoKTsKIAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRCeVBhcmVudCgpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV2ViU2VydmljZXNUcmFuc2xhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VzVHJhbnNsYXRvci5qYXZhCmluZGV4IGM5ZGUxYWQuLmRhOTEyNmEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV2ViU2VydmljZXNUcmFuc2xhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9XZWJTZXJ2aWNlc1RyYW5zbGF0b3IuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7CiAJCWlmIChjaGlsZHJlbjEzID09IG51bGwpCiAJCQljaGlsZHJlbjEzID0gY3JlYXRlMTNDaGlsZHJlbigpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9Xc2RkVHJhbnNsYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kZWwvdHJhbnNsYXRvci93ZWJzZXJ2aWNlcy9Xc2RkVHJhbnNsYXRvci5qYXZhCmluZGV4IGIyN2E1ZTIuLjdmODM0OWMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZGVsL3RyYW5zbGF0b3Ivd2Vic2VydmljZXMvV3NkZFRyYW5zbGF0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2RlbC90cmFuc2xhdG9yL3dlYnNlcnZpY2VzL1dzZGRUcmFuc2xhdG9yLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIAlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMDsKIAlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMTsKIAlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMjsKKwlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gY2hpbGRyZW4xMzsKIAogCXByaXZhdGUgc3RhdGljIFdzZGRQYWNrYWdlIFdTRERfUEtHID0gV3NkZFBhY2thZ2UuZUlOU1RBTkNFOwogCXByaXZhdGUgc3RhdGljIFdzY29tbW9uUGFja2FnZSBXU0NPTU1PTl9QS0cgPSBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwpAQCAtNDYsNiArNDcsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QsIGludCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKE9iamVjdCBvLCBpbnQgdmVyc2lvbklEKSB7CiAJICAgIAogCQkKQEAgLTY0LDEyICs2NiwxOCBAQAogCQkJCQkJY2hpbGRyZW4xMSA9IGNyZWF0ZTExQ2hpbGRyZW4oKTsKIAkJCQkJfQogCQkJCQlyZXR1cm4gY2hpbGRyZW4xMTsgCi0JCQlkZWZhdWx0IDoKKwkJCWNhc2UgKEpFRV81XzBfSUQpIDoKIAkJCQlpZiAoY2hpbGRyZW4xMiA9PSBudWxsKQogCQkJCXsKIAkJCQkJY2hpbGRyZW4xMiA9IGNyZWF0ZTEyQ2hpbGRyZW4oKTsKIAkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuMTI7IAorCQkJCXJldHVybiBjaGlsZHJlbjEyOworCQkJZGVmYXVsdCA6CisJCQkJaWYgKGNoaWxkcmVuMTMgPT0gbnVsbCkKKwkJCQl7CisJCQkJCWNoaWxkcmVuMTMgPSBjcmVhdGUxM0NoaWxkcmVuKCk7CisJCQkJfQorCQkJCXJldHVybiBjaGlsZHJlbjEzOwogCQl9CiAJfQogCkBAIC0xMDAsNyArMTA4LDcgQEAKIAkJfTsKIAl9CiAJCi1wcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNyZWF0ZTEyQ2hpbGRyZW4oKSB7CisJcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjcmVhdGUxMkNoaWxkcmVuKCkgewogCQkKIAkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewogCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLApAQCAtMTE1LDYgKzEyMywyMSBAQAogCQl9OwogCX0KIAorCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY3JlYXRlMTNDaGlsZHJlbigpIHsKKwkJCisJCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKKwkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKKwkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TLCBKQVZBRUVfTlNfVVJMKSwKKwkJCW5ldyBDb25zdGFudEF0dHJpYnV0ZVRyYW5zbGF0b3IoWE1MX05TX1hTSSwgWFNJX05TX1VSTCksCisJCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFhTSV9TQ0hFTUFfTE9DQVRJT04sIEpBVkFFRV9OU19VUkwrJyAnK1dlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfTE9DXzFfMyksCisJCQluZXcgQ29uc3RhbnRBdHRyaWJ1dGVUcmFuc2xhdG9yKFZFUlNJT04sIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfVkVSU0lPTl8xXzMpLAkJCSAgCisJCQlDb21tb25UcmFuc2xhdG9ycy5ERVNDUklQVElPTlNfVFJBTlNMQVRPUiwKKwkJCUNvbW1vblRyYW5zbGF0b3JzLkRJU1BMQVlOQU1FU19UUkFOU0xBVE9SLAorCQkJQ29tbW9uVHJhbnNsYXRvcnMuSUNPTlNfVFJBTlNMQVRPUiwJCQkKKwkJCWNyZWF0ZTEzV2ViU2VydmljZURlc2NUcmFuc2xhdG9yKCkKKwkJfTsKKwl9CisKIAlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMFdlYlNlcnZpY2VEZXNjVHJhbnNsYXRvcigpIHsKIAkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFdFQlNFUlZJQ0VfREVTQ1JJUFRJT04sIFdTRERfUEtHLmdldFdlYlNlcnZpY2VzX1dlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSk7CiAJCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKQEAgLTE0Nyw3ICsxNzAsNyBAQAogCQlyZXR1cm4gcmVzdWx0OwkKIAl9CiAJCi1wdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMldlYlNlcnZpY2VEZXNjVHJhbnNsYXRvcigpIHsKKwlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMldlYlNlcnZpY2VEZXNjVHJhbnNsYXRvcigpIHsKIAkgICAgCiAJCUdlbmVyaWNUcmFuc2xhdG9yIHJlc3VsdCA9IG5ldyBHZW5lcmljVHJhbnNsYXRvcihXRUJTRVJWSUNFX0RFU0NSSVBUSU9OLCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkpOwogCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7CkBAIC0xNjMsNyArMTg2LDIxIEBACiAJCXJldHVybiByZXN1bHQ7CQogCX0KIAotCisJcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTNXZWJTZXJ2aWNlRGVzY1RyYW5zbGF0b3IoKSB7CisJICAgIAorCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV0VCU0VSVklDRV9ERVNDUklQVElPTiwgV1NERF9QS0cuZ2V0V2ViU2VydmljZXNfV2ViU2VydmljZURlc2NyaXB0aW9ucygpKTsKKwkJcmVzdWx0LnNldENoaWxkcmVuKG5ldyBUcmFuc2xhdG9yW10geworCQkJSURUcmFuc2xhdG9yLklOU1RBTkNFLAorCQkJY3JlYXRlMTFEZXNjcmlwdGlvblRyYW5zbGF0b3IoV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uVHlwZSgpKSwKKwkJCWNyZWF0ZTExRGlzcGxheU5hbWVUcmFuc2xhdG9yKFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKSksCQkJCisJCQljcmVhdGUxMUljb25UcmFuc2xhdG9yKFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JY29uVHlwZSgpKSwJCQkKKwkJCW5ldyBUcmFuc2xhdG9yKFdFQlNFUlZJQ0VfREVTQ1JJUFRJT05fTkFNRSwgV1NERF9QS0cuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUoKSksCisJCQluZXcgVHJhbnNsYXRvcihXU0RMX0ZJTEUsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Xc2RsRmlsZSgpKSwJCQkKKwkJCW5ldyBUcmFuc2xhdG9yKEpBWFJQQ19NQVBQSU5HX0ZJTEUsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9KYXhycGNNYXBwaW5nRmlsZSgpKSwJCQkKKwkJCWNyZWF0ZTEzUG9ydENvbXBvbmVudFRyYW5zbGF0b3IoKQkJCSAgCisJCX0pOworCQlyZXR1cm4gcmVzdWx0OwkKKwl9CiAKIAlwdWJsaWMgVHJhbnNsYXRvciBjcmVhdGUxMFBvcnRDb21wb25lbnRUcmFuc2xhdG9yKCkgewogCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoUE9SVF9DT01QT05FTlQsIFdTRERfUEtHLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Qb3J0Q29tcG9uZW50cygpKTsKQEAgLTE5OCw2ICsyMzUsNyBAQAogCQl9KTsKIAkJcmV0dXJuIHJlc3VsdDsJCiAJfQorCiAJcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTJQb3J0Q29tcG9uZW50VHJhbnNsYXRvcigpIHsKIAkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFBPUlRfQ09NUE9ORU5ULCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKSk7CiAJCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKQEAgLTIxOSw2ICsyNTcsMjcgQEAKIAkJcmV0dXJuIHJlc3VsdDsJCiAJfQogCisJcHVibGljIFRyYW5zbGF0b3IgY3JlYXRlMTNQb3J0Q29tcG9uZW50VHJhbnNsYXRvcigpIHsKKwkJR2VuZXJpY1RyYW5zbGF0b3IgcmVzdWx0ID0gbmV3IEdlbmVyaWNUcmFuc2xhdG9yKFBPUlRfQ09NUE9ORU5ULCBXU0REX1BLRy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKSk7CisJCXJlc3VsdC5zZXRDaGlsZHJlbihuZXcgVHJhbnNsYXRvcltdIHsKKwkJCUlEVHJhbnNsYXRvci5JTlNUQU5DRSwKKwkJCW5ldyBUcmFuc2xhdG9yKERFU0NSSVBUSU9OLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uKCkpLAkJCQorCQkJbmV3IFRyYW5zbGF0b3IoRElTUExBWV9OQU1FLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCkpLAkJCQorCQkJbmV3IFRyYW5zbGF0b3IoU01BTExfSUNPTiwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKSksCQkJCisJCQluZXcgVHJhbnNsYXRvcihMQVJHRV9JQ09OLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X0xhcmdlSWNvbigpKSwJCQkJCisJCQluZXcgVHJhbnNsYXRvcihQT1JUX0NPTVBPTkVOVF9OQU1FLCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1BvcnRDb21wb25lbnROYW1lKCkpLAorCQkJQ29tbW9uVHJhbnNsYXRvcnMuY3JlYXRlUU5hbWVUcmFuc2xhdG9yKFdTRExfU0VSVklDRSwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9Xc2RsU2VydmljZSgpKSwKKwkJCUNvbW1vblRyYW5zbGF0b3JzLmNyZWF0ZVFOYW1lVHJhbnNsYXRvcihXU0RMX1BPUlQsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfV3NkbFBvcnQoKSksCisJCQluZXcgQm9vbGVhblRyYW5zbGF0b3IoRU5BQkxFX01UT00sIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfRW5hYmxlTXRvbSgpKSwKKwkJCW5ldyBUcmFuc2xhdG9yKFBST1RPQ09MX0JJTkRJTkcsIFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfUHJvdG9jb2xCaW5kaW5nKCkpLAorCQkJbmV3IFRyYW5zbGF0b3IoU0VSVklDRV9FTlBPSU5UX0lOVEVSRkFDRSwgV1NERF9QS0cuZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSksCisJCQljcmVhdGVTZXJ2aWNlSW1wbEJlYW5UcmFuc2xhdG9yKCksCisJCQljcmVhdGVIYW5kbGVyMTFUcmFuc2xhdG9yKFdTRERfUEtHLmdldFBvcnRDb21wb25lbnRfSGFuZGxlcnMoKSksCisJCQljcmVhdGVIYW5kbGVyQ2hhaW5zMTJUcmFuc2xhdG9yKCkKKwkJfSk7CisJCXJldHVybiByZXN1bHQ7CQorCX0KKwogCXB1YmxpYyBUcmFuc2xhdG9yIGNyZWF0ZTEwV3NkbFBvcnRUcmFuc2xhdG9yKCkgewogCQlHZW5lcmljVHJhbnNsYXRvciByZXN1bHQgPSBuZXcgR2VuZXJpY1RyYW5zbGF0b3IoV1NETF9QT1JULCBXU0REX1BLRy5nZXRQb3J0Q29tcG9uZW50X1dzZGxQb3J0KCkpOwogCQlyZXN1bHQuc2V0Q2hpbGRyZW4obmV3IFRyYW5zbGF0b3JbXSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC94bWwvWG1sRG9jdW1lbnRSZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9YbWxEb2N1bWVudFJlYWRlci5qYXZhCmluZGV4IDlhNzU3NjAuLjAyNjU1YzEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9YbWxEb2N1bWVudFJlYWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3htbC9YbWxEb2N1bWVudFJlYWRlci5qYXZhCkBAIC00NywxMCArNDcsMTIgQEAKICAqIENyZWF0aW9uIGRhdGU6ICgwMy8xOS8wMSAxMDoxMzoyNiBBTSkKICAqIEByZXR1cm4gb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIKICAqLworQE92ZXJyaWRlCiBwdWJsaWMgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIgY3JlYXRlRGVmYXVsdEVudGl0eVJlc29sdmVyKCkgewogCXJldHVybiBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuSU5TVEFOQ0U7CiB9CiAKK0BPdmVycmlkZQogcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGFuRXhjZXB0aW9uKSB7CiAJaWYgKGFuRXhjZXB0aW9uIGluc3RhbmNlb2YgU0FYUGFyc2VFeGNlcHRpb24pIAogCQloYW5kbGVFeGNlcHRpb24oYU1lc3NhZ2UsIChTQVhQYXJzZUV4Y2VwdGlvbikgYW5FeGNlcHRpb24pOwpAQCAtNjEsNiArNjMsNyBAQAogCXByaW1IYW5kbGVFeGNlcHRpb24oSjJFRVhNTFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoWE1MUGFyc2VSZXNvdXJjZUhhbmRsZXIucGFyc2VfZXhjZXB0aW9uX29jY3VyZWRfRVhDXywgKG5ldyBPYmplY3RbXSB7bmV3IEludGVnZXIocGFyc2VFeGNlcHRpb24uZ2V0TGluZU51bWJlcigpKSwgbmV3IEludGVnZXIocGFyc2VFeGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCkpIH0pKSwgcGFyc2VFeGNlcHRpb24pOyAgCiAJLy8kTk9OLU5MUy0xJCA9ICJBbiBFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcGFyc2luZyB4bWw6IHswfSBMaW5lICM6IHsxfSA6Q29sdW1uICM6ICIKIH0KK0BPdmVycmlkZQogcHJvdGVjdGVkIHZvaWQgcHJpbUhhbmRsZUV4Y2VwdGlvbihTdHJpbmcgYU1lc3NhZ2UsIFRocm93YWJsZSBhbkV4Y2VwdGlvbikgewogCWlmIChhbkV4Y2VwdGlvbiBpbnN0YW5jZW9mIEV4Y2VwdGlvbikKIAkJdGhyb3cgbmV3IFdyYXBwZWRSdW50aW1lRXhjZXB0aW9uKGFNZXNzYWdlLCAoRXhjZXB0aW9uKWFuRXhjZXB0aW9uKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUuamF2YQppbmRleCBlZDAzNTI1Li44Y2MyMGQ4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS5qYXZhCkBAIC00OCw3ICs0OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgQkFTSUNfUEFTU1dPUkRfTElURVJBTCA9IG5ldyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoQkFTSUNfUEFTU1dPUkQsICJCYXNpY1Bhc3N3b3JkIiwgIkJhc2ljUGFzc3dvcmQiKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgQkFTSUNfUEFTU1dPUkRfTElURVJBTCA9IG5ldyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUoQkFTSUNfUEFTU1dPUkQsICJCYXNpY1Bhc3N3b3JkIiwgIkJhc2ljUGFzc3dvcmQiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPktlcmJ2NTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC02Miw3ICs2Miw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgS0VSQlY1X0xJVEVSQUwgPSBuZXcgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKEtFUkJWNSwgIktlcmJ2NSIsICJLZXJidjUiKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgS0VSQlY1X0xJVEVSQUwgPSBuZXcgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKEtFUkJWNSwgIktlcmJ2NSIsICJLZXJidjUiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5BdXRoZW50aWNhdGlvbiBNZWNoYW5pc20gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL1RyYW5zYWN0aW9uU3VwcG9ydEtpbmQuamF2YQppbmRleCBmOWU3NjY2Li5hZmI0NmE4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9UcmFuc2FjdGlvblN1cHBvcnRLaW5kLmphdmEKQEAgLTUyLDcgKzUyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgTk9fVFJBTlNBQ1RJT05fTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kKE5PX1RSQU5TQUNUSU9OLCAiTm9UcmFuc2FjdGlvbiIsICJOb1RyYW5zYWN0aW9uIik7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBOT19UUkFOU0FDVElPTl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoTk9fVFJBTlNBQ1RJT04sICJOb1RyYW5zYWN0aW9uIiwgIk5vVHJhbnNhY3Rpb24iKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPkxvY2FsIFRyYW5zYWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTY2LDcgKzY2LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgTE9DQUxfVFJBTlNBQ1RJT05fTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kKExPQ0FMX1RSQU5TQUNUSU9OLCAiTG9jYWxUcmFuc2FjdGlvbiIsICJMb2NhbFRyYW5zYWN0aW9uIik7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBMT0NBTF9UUkFOU0FDVElPTl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoTE9DQUxfVFJBTlNBQ1RJT04sICJMb2NhbFRyYW5zYWN0aW9uIiwgIkxvY2FsVHJhbnNhY3Rpb24iKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPlhBIFRyYW5zYWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTgwLDcgKzgwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQgWEFfVFJBTlNBQ1RJT05fTElURVJBTCA9IG5ldyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kKFhBX1RSQU5TQUNUSU9OLCAiWEFUcmFuc2FjdGlvbiIsICJYQVRyYW5zYWN0aW9uIik7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZCBYQV9UUkFOU0FDVElPTl9MSVRFUkFMID0gbmV3IFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoWEFfVFJBTlNBQ1RJT04sICJYQVRyYW5zYWN0aW9uIiwgIlhBVHJhbnNhY3Rpb24iKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc2FjdGlvbiBTdXBwb3J0IEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQWN0aXZhdGlvblNwZWNJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uU3BlY0ltcGwuamF2YQppbmRleCAxNWZkOTVjLi5hMzk5NDNkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uU3BlY0ltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BY3RpdmF0aW9uU3BlY0ltcGwuamF2YQpAQCAtODUsNiArODUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZBVElPTl9TUEVDOwogCX0KQEAgLTEyNyw2ICsxMjgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVElFUzoKQEAgLTE0MCw2ICsxNDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19BQ1RJVkFUSU9OX1NQRUNfQ0xBU1M6CkBAIC0xNTUsNiArMTU4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05fU1BFQ19DTEFTUzoKQEAgLTE3Myw2ICsxNzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkFDVElWQVRJT05fU1BFQ19fQUNUSVZBVElPTl9TUEVDX0NMQVNTOgpAQCAtMTkwLDYgKzE5NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19BQ1RJVkFUSU9OX1NQRUNfQ0xBU1M6CkBAIC0yMDUsMTEgKzIxMSwxMiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWN0aXZhdGlvblNwZWNDbGFzczogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoYWN0aXZhdGlvblNwZWNDbGFzczogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChhY3RpdmF0aW9uU3BlY0NsYXNzKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BZG1pbk9iamVjdEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0FkbWluT2JqZWN0SW1wbC5qYXZhCmluZGV4IGE2YjVkNzcuLjhjNjIzZDMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0FkbWluT2JqZWN0SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0FkbWluT2JqZWN0SW1wbC5qYXZhCkBAIC0xMDYsNiArMTA2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLkFETUlOX09CSkVDVDsKIAl9CkBAIC0xNjksNiArMTcwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQ09ORklHX1BST1BFUlRJRVM6CkBAIC0xODIsNiArMTg0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0lOVEVSRkFDRToKQEAgLTE5OSw2ICsyMDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0lOVEVSRkFDRToKQEAgLTIyMCw2ICsyMjQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0lOVEVSRkFDRToKQEAgLTI0MCw2ICsyNDUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0lOVEVSRkFDRToKQEAgLTI1NywxMyArMjYzLDE0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhZG1pbk9iamVjdEludGVyZmFjZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoYWRtaW5PYmplY3RJbnRlcmZhY2U6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoYWRtaW5PYmplY3RJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFkbWluT2JqZWN0Q2xhc3M6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGFkbWluT2JqZWN0Q2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoYWRtaW5PYmplY3RDbGFzcyk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQXV0aGVudGljYXRpb25NZWNoYW5pc21JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwuamF2YQppbmRleCAwOTIyNTc2Li41NjcyMTg3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbUltcGwuamF2YQpAQCAtMTQ1LDYgKzE0NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5BVVRIRU5USUNBVElPTl9NRUNIQU5JU007CiAJfQpAQCAtMjY5LDE5ICsyNzAsMjAgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgYXV0aGVudGljYXRpb25NZWNoYW5pc206ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoYXV0aGVudGljYXRpb25NZWNoYW5pc20pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZTogIik7Ci0JCWlmIChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyZWRlbnRpYWxJbnRlcmZhY2U6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQoYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBjcmVkZW50aWFsSW50ZXJmYWNlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGNyZWRlbnRpYWxJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGN1c3RvbUF1dGhNZWNoVHlwZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgY3VzdG9tQXV0aE1lY2hUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGN1c3RvbUF1dGhNZWNoVHlwZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpAQCAtMzI5LDYgKzMzMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OUzoKQEAgLTM0Miw2ICszNDUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTjoKQEAgLTM2NSw2ICszNjksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fREVTQ1JJUFRJT046CkBAIC0zOTUsNiArNDAwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OOgpAQCAtNDI0LDYgKzQzMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTjoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0NvbmZpZ1Byb3BlcnR5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29uZmlnUHJvcGVydHlJbXBsLmphdmEKaW5kZXggOGU3NWI5Mi4uZGNlYjgwMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29uZmlnUHJvcGVydHlJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29uZmlnUHJvcGVydHlJbXBsLmphdmEKQEAgLTExOSw2ICsxMTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuQ09ORklHX1BST1BFUlRZOwogCX0KQEAgLTIyNyw2ICsyMjgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTlM6CkBAIC0yNDAsNiArMjQyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT046CkBAIC0yNjEsNiArMjY0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OOgpAQCAtMjg4LDYgKzI5Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19ERVNDUklQVElPTjoKQEAgLTMxNCw2ICszMTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT046CkBAIC0zMzMsMTcgKzMzOSwxOCBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodmFsdWUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3Rpb25EZWZpbml0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsLmphdmEKaW5kZXggODIyZTE0MS4uNTgwMGVhMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdGlvbkRlZmluaXRpb25JbXBsLmphdmEKQEAgLTE2OSw2ICsxNjksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuQ09OTkVDVElPTl9ERUZJTklUSU9OOwogCX0KQEAgLTI5NSw2ICsyOTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVElFUzoKQEAgLTMwOCw2ICszMTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUzoKQEAgLTMzMSw2ICszMzQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RJT05fREVGSU5JVElPTl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1M6CkBAIC0zNjEsNiArMzY1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTOgpAQCAtMzkwLDYgKzM5NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUzoKQEAgLTQxMywxOSArNDE5LDIwIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzczogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAobWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3M6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uSW50ZXJmYWNlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uSW50ZXJmYWNlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25JbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25JbXBsQ2xhc3M6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25JbXBsQ2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbkltcGxDbGFzcyk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9ySW1wbC5qYXZhCmluZGV4IGQ5ZjdkYzUuLmRiNjNkNDAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0Nvbm5lY3RvckltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JJbXBsLmphdmEKQEAgLTEwMSw2ICsxMDEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuQ09OTkVDVE9SOwogCX0KQEAgLTEwOCw2ICsxMDksNyBAQAogCS8qKgogCSAqCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7CiAJCXN1cGVyLnNldERpc3BsYXlOYW1lKG5ld0Rpc3BsYXlOYW1lKTsKIAl9CkBAIC0yODYsNiArMjg4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fTElDRU5TRToKQEAgLTMwMSw2ICszMDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRU5ET1JfTkFNRToKQEAgLTMyNCw2ICszMjgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVORE9SX05BTUU6CkBAIC0zNTMsNiArMzU4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1ZFTkRPUl9OQU1FOgpAQCAtMzgyLDYgKzM4OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRU5ET1JfTkFNRToKQEAgLTQwMywxNyArNDEwLDE4IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlbmRvck5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHZlbmRvck5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodmVuZG9yTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3BlY1ZlcnNpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHNwZWNWZXJzaW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHNwZWNWZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlaXNUeXBlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBlaXNUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGVpc1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JSZXNvdXJjZUZhY3RvcnkuamF2YQppbmRleCA0N2QzZDBlLi40ZjBmYWVjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JSZXNvdXJjZUZhY3RvcnkuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU1lTVEVNSURfMV8wLCAiY29ubmVjdG9yXzFfMC5kdGQiKTsgLy8kTk9OLU5MUy0xJAogCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfQUxUX1NZU1RFTUlEXzFfMCwgImNvbm5lY3Rvcl8xLjAuZHRkIik7IC8vJE5PTi1OTFMtMSQKIAkJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NDSEVNQV9MT0NfMV81LCAiY29ubmVjdG9yXzFfNS54c2QiKTsgLy8kTk9OLU5MUy0xJAorCQlKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfU0NIRU1BX0xPQ18xXzYsICJjb25uZWN0b3JfMV82LnhzZCIpOyAvLyROT04tTkxTLTEkCiAJfSAKIAkKIApAQCAtNTIsNyArNTMsOCBAQAogICAgIC8qIChub24tSmF2YWRvYykKICAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewogCQlyZXR1cm4gbmV3IENvbm5lY3RvclJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvQ29ubmVjdG9yUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JSZXNvdXJjZUltcGwuamF2YQppbmRleCBlZjJjZTZlLi4xMTc5YmIxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JSZXNvdXJjZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9Db25uZWN0b3JSZXNvdXJjZUltcGwuamF2YQpAQCAtNTcsMTAgKzU3LDEyIEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSB7CiAJCXJldHVybiBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9TWVNURU1JRF8xXzA7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV9BbHRfMV8yX1N5c3RlbUlEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfQUxUX1NZU1RFTUlEXzFfMDsKIAl9CkBAIC02OCwxMCArNzAsMTIgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19TeXN0ZW1JRCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKIAkJcmV0dXJuIEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1NZU1RFTUlEXzFfMDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRKMkVFX0FsdF8xXzNfU3lzdGVtSUQoKSB7CiAJCXJldHVybiBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9BTFRfU1lTVEVNSURfMV8wOwogCX0KQEAgLTc5LDYgKzgzLDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9QdWJsaWNJRCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpIHsKIAkJcmV0dXJuIEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1BVQkxJQ0lEXzFfMDsKIAl9CkBAIC04Niw2ICs5MSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfUHVibGljSUQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKSB7CiAJCXJldHVybiBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9QVUJMSUNJRF8xXzA7CiAJfQpAQCAtMTA0LDYgKzExMCw3IEBACiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLlRyYW5zbGF0b3JSZXNvdXJjZSNzZXREb2N0eXBlVmFsdWVzKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAJICogVGhpcyBpcyBzZXR0aW5nIHRoZSBtb2R1bGUgdmVyc2lvbiBvbiB0aGUgcmVzb3VyY2UuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0RG9jdHlwZVZhbHVlcyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewogCQlpbnQgdmVyc2lvbiA9IEpDQV8xXzVfSUQ7CiAJCWlmIChzeXN0ZW1JZCA9PSBudWxsKSAKQEAgLTExNiwxMSArMTIzLDE3IEBACiAJLyogCiAJICogVGhpcyBkaXJlY3RseSBzZXRzIHRoZSBtb2R1bGUgdmVyc2lvbiBpZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE1vZHVsZVZlcnNpb25JRChpbnQgaWQpIHsKIAkJc3VwZXIuc2V0VmVyc2lvbklEKGlkKTsKIAkJc3dpdGNoIChpZCkgeworCQkJCWNhc2UgKEpDQV8xXzZfSUQpIDoKKwkJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKKwkJCQkJcHJpbVNldFZlcnNpb25JRChKQ0FfMV82X0lEKTsKKwkJCQkJYnJlYWs7CiAJCQkJY2FzZSAoSkNBXzFfNV9JRCkgOgogCQkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOworCQkJCQlwcmltU2V0VmVyc2lvbklEKEpDQV8xXzVfSUQpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIChKQ0FfMV8wX0lEKSA6CiAJCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMoZ2V0SjJFRV8xXzNfUHVibGljSUQoKSwgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSk7CkBAIC0xMzAsOCArMTQzLDE3IEBACiAJCS8qCiAJCSAqIEJhc2VkIG9uIHRoZSBKMkVFIHZlcnNpb24sIHRoaXMgd2lsbCBzZXQgdGhlIG1vZHVsZSB2ZXJzaW9uCiAJCSAqLworCQlAT3ZlcnJpZGUKIAkJcHVibGljIHZvaWQgc2V0SjJFRVZlcnNpb25JRChpbnQgaWQpIHsKIAkJc3dpdGNoIChpZCkgeworCQkJY2FzZShKRUVfNl8wX0lEKSA6CisJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOworCQkJCQlwcmltU2V0VmVyc2lvbklEKEpDQV8xXzZfSUQpOworCQkJCQlicmVhazsKKwkJCWNhc2UoSkVFXzVfMF9JRCkgOgorCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKKwkJCQkJcHJpbVNldFZlcnNpb25JRChKQ0FfMV81X0lEKTsKKwkJCQkJYnJlYWs7CiAJCQljYXNlIChKMkVFXzFfNF9JRCkgOgogCQkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7CiAJCQkJCQlwcmltU2V0VmVyc2lvbklEKEpDQV8xXzVfSUQpOwpAQCAtMTU0LDEyICsxNzYsMTUgQEAKIAl9CiAJLyogUmV0dXJuIEoyRUUgdmVyc2lvbiBiYXNlZCBvbiBtb2R1bGUgdmVyc2lvbgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHsKIAkJc3dpdGNoIChnZXRNb2R1bGVWZXJzaW9uSUQoKSkgewogCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lEIDoKIAkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7CiAJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQgOgogCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKKwkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNl9JRCA6CisJCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ7CiAJCQlkZWZhdWx0IDoKIAkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKIAkJfQpAQCAtMTY3LDYgKzE5Miw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewogCQlyZXR1cm4gSkNBXzFfNV9JRDsKIAl9CkBAIC0xNzQsNiArMjAwLDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uaW1wbC5YTUxSZXNvdXJjZUltcGwjc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkgewogCQlDb25uZWN0b3IgY29ubiA9IGdldENvbm5lY3RvcigpOwogCQlpZiAoY29ubiA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEKaW5kZXggNzUwZjA5ZC4uOWMyNDM3NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvSW5ib3VuZFJlc291cmNlQWRhcHRlckltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9JbmJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhCkBAIC01OSw2ICs1OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVI7CiAJfQpAQCAtMTExLDYgKzExMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUjoKQEAgLTEyNCw2ICsxMjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFX0FEQVBURVI6CkBAIC0xMzcsNiArMTQwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUjoKQEAgLTE1MSw2ICsxNTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLklOQk9VTkRfUkVTT1VSQ0VfQURBUFRFUl9fTUVTU0FHRV9BREFQVEVSOgpAQCAtMTY1LDYgKzE3MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuSU5CT1VORF9SRVNPVVJDRV9BREFQVEVSX19NRVNTQUdFX0FEQVBURVI6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9KY2FGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvSmNhRmFjdG9yeUltcGwuamF2YQppbmRleCA2Y2RiMjhkLi44MjNmZWFkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9KY2FGYWN0b3J5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0pjYUZhY3RvcnlJbXBsLmphdmEKQEAgLTQ4LDcgKzQ4LDcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIEpjYUZhY3RvcnkgaW5pdCgpIHsKIAkJdHJ5IHsKLQkJCUpjYUZhY3RvcnkgdGhlSmNhRmFjdG9yeSA9IChKY2FGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqY2EueG1pIik7IAorCQkJSmNhRmFjdG9yeSB0aGVKY2FGYWN0b3J5ID0gKEpjYUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImpjYS54bWkiKTsgIC8vJE5PTi1OTFMtMSQKIAkJCWlmICh0aGVKY2FGYWN0b3J5ICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gdGhlSmNhRmFjdG9yeTsKIAkJCX0KQEAgLTY3LDYgKzY3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKIAkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1I6IHJldHVybiBjcmVhdGVDb25uZWN0b3IoKTsKQEAgLTg0LDcgKzg1LDcgQEAKIAkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUM6IHJldHVybiBjcmVhdGVBY3RpdmF0aW9uU3BlYygpOwogCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFOiByZXR1cm4gY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKTsKIAkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJfQogCX0KIApAQCAtOTMsNiArOTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewogCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFOgpAQCAtMTAwLDcgKzEwMiw3IEBACiAJCQljYXNlIEpjYVBhY2thZ2UuVFJBTlNBQ1RJT05fU1VQUE9SVF9LSU5EOgogCQkJCXJldHVybiBjcmVhdGVUcmFuc2FjdGlvblN1cHBvcnRLaW5kRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CiAJCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAl9CiAKQEAgLTEwOSw2ICsxMTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewogCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9UWVBFOgpAQCAtMTE2LDcgKzExOSw3IEBACiAJCQljYXNlIEpjYVBhY2thZ2UuVFJBTlNBQ1RJT05fU1VQUE9SVF9LSU5EOgogCQkJCXJldHVybiBjb252ZXJ0VHJhbnNhY3Rpb25TdXBwb3J0S2luZFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAl9CiAKQEAgLTIyMyw3ICsyMjYsNyBAQAogCSAqLwogCXB1YmxpYyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUgY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSByZXN1bHQgPSBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTI0Myw3ICsyNDYsNyBAQAogCSAqLwogCXB1YmxpYyBUcmFuc2FjdGlvblN1cHBvcnRLaW5kIGNyZWF0ZVRyYW5zYWN0aW9uU3VwcG9ydEtpbmRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJVHJhbnNhY3Rpb25TdXBwb3J0S2luZCByZXN1bHQgPSBUcmFuc2FjdGlvblN1cHBvcnRLaW5kLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJCXJldHVybiByZXN1bHQ7CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9KY2FQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvSmNhUGFja2FnZUltcGwuamF2YQppbmRleCA3ODAxNjRiLi4yMzM0OTBlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9KY2FQYWNrYWdlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0pjYVBhY2thZ2VJbXBsLmphdmEKQEAgLTE4LDE0ICsxOCw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWN0aXZhdGlvblNwZWM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKQEAgLTQ0LDIxICszOSw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5UcmFuc2FjdGlvblN1cHBvcnRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKIAogCi1wdWJsaWMgY2xhc3MgSmNhUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBKY2FQYWNrYWdlLCBFUGFja2FnZSB7CitwdWJsaWMgY2xhc3MgSmNhUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBKY2FQYWNrYWdlIHsKIAkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMTgzLDcgKzE2Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKwlwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CiAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KQEAgLTE5Miw3ICsxNzUsMTAgQEAKIAkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEpjYVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKTsKIAogCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBKY2FQYWNrYWdlSW1wbCgpKTsKKwkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IAorCQkJKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZgorCQkJCQlKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldworCQkJCQkJCUpjYVBhY2thZ2VJbXBsKCkpOwogCiAJCWlzSW5pdGVkID0gdHJ1ZTsKIApAQCAtMjAwLDUwICsxODYsMjAgQEAKIAkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKIAkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAoVGFnbGliUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgOiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IChXc2RkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgOiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UpOwotCiAJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCiAJCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwogCiAJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKIAkJdGhlSmNhUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CiAKIAkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAogCQl0aGVKY2FQYWNrYWdlLmZyZWV6ZSgpOwogCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoSmNhUGFja2FnZS5lTlNfVVJJLCB0aGVKY2FQYWNrYWdlKTsKKworCQlKMkVFSW5pdC5pbml0RU1GTW9kZWxzKCk7CisKIAkJcmV0dXJuIHRoZUpjYVBhY2thZ2U7CiAJfQogCkBAIC05NjgsMTIxICs5MjQsMTMzIEBACiAJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKIAkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKIAotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWNvbm5lY3RvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCQlyZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJY29uZmlnUHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWxpY2Vuc2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQltZXNzYWdlQWRhcHRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQljb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlhZG1pbk9iamVjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQltZXNzYWdlTGlzdGVuZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJYWN0aXZhdGlvblNwZWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJcmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGNvbm5lY3RvckVDbGFzcywgQ29ubmVjdG9yLmNsYXNzLCAiQ29ubmVjdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0b3JfVmVuZG9yTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVuZG9yTmFtZSIsIG51bGwsIDAsIDEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzcGVjVmVyc2lvbiIsIG51bGwsIDAsIDEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdG9yX0Vpc1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVpc1R5cGUiLCBudWxsLCAwLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rvcl9WZXJzaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2ZXJzaW9uIiwgbnVsbCwgMCwgMSwgQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb25uZWN0b3JfTGljZW5zZSgpLCB0aGlzLmdldExpY2Vuc2UoKSwgbnVsbCwgImxpY2Vuc2UiLCBudWxsLCAwLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbm5lY3Rvcl9SZXNvdXJjZUFkYXB0ZXIoKSwgdGhpcy5nZXRSZXNvdXJjZUFkYXB0ZXIoKSwgbnVsbCwgInJlc291cmNlQWRhcHRlciIsIG51bGwsIDEsIDEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJlc291cmNlQWRhcHRlckVDbGFzcywgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAiUmVzb3VyY2VBZGFwdGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkludGVyZmFjZSIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbXBsQ2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbm5lY3Rpb25JbXBsQ2xhc3MiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKSwgdGhpcy5nZXRUcmFuc2FjdGlvblN1cHBvcnRLaW5kKCksICJ0cmFuc2FjdGlvblN1cHBvcnQiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVhdXRoZW50aWNhdGlvblN1cHBvcnQiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlQWRhcHRlckNsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZXNvdXJjZUFkYXB0ZXJDbGFzcyIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbnMoKSwgdGhpcy5nZXRTZWN1cml0eVBlcm1pc3Npb24oKSwgbnVsbCwgInNlY3VyaXR5UGVybWlzc2lvbnMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCksIHRoaXMuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc20oKSwgbnVsbCwgImF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlQWRhcHRlcl9Db25maWdQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0Q29uZmlnUHJvcGVydHkoKSwgbnVsbCwgImNvbmZpZ1Byb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSwgdGhpcy5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpLCBudWxsLCAib3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCksIHRoaXMuZ2V0SW5ib3VuZFJlc291cmNlQWRhcHRlcigpLCBudWxsLCAiaW5ib3VuZFJlc291cmNlQWRhcHRlciIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VBZGFwdGVyX0FkbWluT2JqZWN0cygpLCB0aGlzLmdldEFkbWluT2JqZWN0KCksIG51bGwsICJhZG1pbk9iamVjdHMiLCBudWxsLCAwLCAtMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCAiQXV0aGVudGljYXRpb25NZWNoYW5pc20iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYXV0aGVudGljYXRpb25NZWNoYW5pc20iLCBudWxsLCAwLCAxLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCksIHRoaXMuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCksICJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiLCBudWxsLCAwLCAxLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjcmVkZW50aWFsSW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0N1c3RvbUF1dGhNZWNoVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY3VzdG9tQXV0aE1lY2hUeXBlIiwgbnVsbCwgMCwgMSwgQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbmZpZ1Byb3BlcnR5RUNsYXNzLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIkNvbmZpZ1Byb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uZmlnUHJvcGVydHlfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25maWdQcm9wZXJ0eV9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgQ29uZmlnUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VjdXJpdHlQZXJtaXNzaW9uRUNsYXNzLCBTZWN1cml0eVBlcm1pc3Npb24uY2xhc3MsICJTZWN1cml0eVBlcm1pc3Npb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBTZWN1cml0eVBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5UGVybWlzc2lvbl9TcGVjaWZpY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzcGVjaWZpY2F0aW9uIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlQZXJtaXNzaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eVBlcm1pc3Npb25fRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eVBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhsaWNlbnNlRUNsYXNzLCBMaWNlbnNlLmNsYXNzLCAiTGljZW5zZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGljZW5zZV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBMaWNlbnNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRMaWNlbnNlX1JlcXVpcmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVxdWlyZWQiLCBudWxsLCAwLCAxLCBMaWNlbnNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBMaWNlbnNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgSW5ib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcywgIkluYm91bmRSZXNvdXJjZUFkYXB0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXJfTWVzc2FnZUFkYXB0ZXIoKSwgdGhpcy5nZXRNZXNzYWdlQWRhcHRlcigpLCBudWxsLCAibWVzc2FnZUFkYXB0ZXIiLCBudWxsLCAwLCAxLCBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mob3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAiT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVhdXRoZW50aWNhdGlvblN1cHBvcnQiLCBudWxsLCAwLCAxLCBPdXRib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9UcmFuc2FjdGlvblN1cHBvcnQoKSwgdGhpcy5nZXRUcmFuc2FjdGlvblN1cHBvcnRLaW5kKCksICJ0cmFuc2FjdGlvblN1cHBvcnQiLCBudWxsLCAwLCAxLCBPdXRib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRGVmaW5pdGlvbnMoKSwgdGhpcy5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbigpLCBudWxsLCAiY29ubmVjdGlvbkRlZmluaXRpb25zIiwgbnVsbCwgMCwgLTEsIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSwgdGhpcy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpLCBudWxsLCAiYXV0aGVudGljYXRpb25NZWNoYW5pc21zIiwgbnVsbCwgMCwgLTEsIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWVzc2FnZUFkYXB0ZXJFQ2xhc3MsIE1lc3NhZ2VBZGFwdGVyLmNsYXNzLCAiTWVzc2FnZUFkYXB0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VBZGFwdGVyX01lc3NhZ2VMaXN0ZW5lcnMoKSwgdGhpcy5nZXRNZXNzYWdlTGlzdGVuZXIoKSwgbnVsbCwgIm1lc3NhZ2VMaXN0ZW5lcnMiLCBudWxsLCAxLCAtMSwgTWVzc2FnZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcywgQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsICJDb25uZWN0aW9uRGVmaW5pdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzIiwgbnVsbCwgMCwgMSwgQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSIsIG51bGwsIDAsIDEsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MiLCBudWxsLCAwLCAxLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkludGVyZmFjZSIsIG51bGwsIDAsIDEsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25uZWN0aW9uSW1wbENsYXNzIiwgbnVsbCwgMCwgMSwgQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0NvbmZpZ1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRDb25maWdQcm9wZXJ0eSgpLCBudWxsLCAiY29uZmlnUHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFkbWluT2JqZWN0RUNsYXNzLCBBZG1pbk9iamVjdC5jbGFzcywgIkFkbWluT2JqZWN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBZG1pbk9iamVjdF9BZG1pbk9iamVjdEludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWRtaW5PYmplY3RJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBBZG1pbk9iamVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWRtaW5PYmplY3RfQWRtaW5PYmplY3RDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWRtaW5PYmplY3RDbGFzcyIsIG51bGwsIDAsIDEsIEFkbWluT2JqZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBZG1pbk9iamVjdF9Db25maWdQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0Q29uZmlnUHJvcGVydHkoKSwgbnVsbCwgImNvbmZpZ1Byb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgQWRtaW5PYmplY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXNzYWdlTGlzdGVuZXJFQ2xhc3MsIE1lc3NhZ2VMaXN0ZW5lci5jbGFzcywgIk1lc3NhZ2VMaXN0ZW5lciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZUxpc3RlbmVyX01lc3NhZ2VMaXN0ZW5lclR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1lc3NhZ2VMaXN0ZW5lclR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VMaXN0ZW5lcl9BY3RpdmF0aW9uU3BlYygpLCB0aGlzLmdldEFjdGl2YXRpb25TcGVjKCksIG51bGwsICJhY3RpdmF0aW9uU3BlYyIsIG51bGwsIDEsIDEsIE1lc3NhZ2VMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFjdGl2YXRpb25TcGVjRUNsYXNzLCBBY3RpdmF0aW9uU3BlYy5jbGFzcywgIkFjdGl2YXRpb25TcGVjIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uU3BlY0NsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhY3RpdmF0aW9uU3BlY0NsYXNzIiwgbnVsbCwgMCwgMSwgQWN0aXZhdGlvblNwZWMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFjdGl2YXRpb25TcGVjX1JlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpLCB0aGlzLmdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKCksIG51bGwsICJyZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgQWN0aXZhdGlvblNwZWMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUVDbGFzcywgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuY2xhc3MsICJSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFRW51bSwgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLmNsYXNzLCAiQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFRW51bSwgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLkJBU0lDX1BBU1NXT1JEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRUVudW0sIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS5LRVJCVjVfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKHRyYW5zYWN0aW9uU3VwcG9ydEtpbmRFRW51bSwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5jbGFzcywgIlRyYW5zYWN0aW9uU3VwcG9ydEtpbmQiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uU3VwcG9ydEtpbmRFRW51bSwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5OT19UUkFOU0FDVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uU3VwcG9ydEtpbmRFRW51bSwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5MT0NBTF9UUkFOU0FDVElPTl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uU3VwcG9ydEtpbmRFRW51bSwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5YQV9UUkFOU0FDVElPTl9MSVRFUkFMKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCWJvb2xlYW4gaGFzTG9jayA9IGZhbHNlOworCQl0cnkgeworCQkJaGFzTG9jayA9IEoyRUVJbml0LmFxdWlyZUluaXRpYWxpemVQYWNrYWdlQ29udGVudHNMb2NrKCk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9CQkKKwkJCisJCXRyeXsKKwkJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJCWNvbm5lY3RvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOworCQkJcmVzb3VyY2VBZGFwdGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQlhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJY29uZmlnUHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCXNlY3VyaXR5UGVybWlzc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJbGljZW5zZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJaW5ib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCW1lc3NhZ2VBZGFwdGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQljb25uZWN0aW9uRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJYWRtaW5PYmplY3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCW1lc3NhZ2VMaXN0ZW5lckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJYWN0aXZhdGlvblNwZWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCXJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCisJCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycworCQkJaW5pdEVDbGFzcyhjb25uZWN0b3JFQ2xhc3MsIENvbm5lY3Rvci5jbGFzcywgIkNvbm5lY3RvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdG9yX1ZlbmRvck5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlbmRvck5hbWUiLCBudWxsLCAwLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rvcl9TcGVjVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3BlY1ZlcnNpb24iLCBudWxsLCAwLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rvcl9FaXNUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlaXNUeXBlIiwgbnVsbCwgMCwgMSwgQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0b3JfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29ubmVjdG9yX0xpY2Vuc2UoKSwgdGhpcy5nZXRMaWNlbnNlKCksIG51bGwsICJsaWNlbnNlIiwgbnVsbCwgMCwgMSwgQ29ubmVjdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRDb25uZWN0b3JfUmVzb3VyY2VBZGFwdGVyKCksIHRoaXMuZ2V0UmVzb3VyY2VBZGFwdGVyKCksIG51bGwsICJyZXNvdXJjZUFkYXB0ZXIiLCBudWxsLCAxLCAxLCBDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MocmVzb3VyY2VBZGFwdGVyRUNsYXNzLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICJSZXNvdXJjZUFkYXB0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlQWRhcHRlcl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MiLCBudWxsLCAwLCAxLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb25uZWN0aW9uSW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkltcGxDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkltcGxDbGFzcyIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpLCB0aGlzLmdldFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoKSwgInRyYW5zYWN0aW9uU3VwcG9ydCIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VBZGFwdGVyQ2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJlc291cmNlQWRhcHRlckNsYXNzIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUFkYXB0ZXJfU2VjdXJpdHlQZXJtaXNzaW9ucygpLCB0aGlzLmdldFNlY3VyaXR5UGVybWlzc2lvbigpLCBudWxsLCAic2VjdXJpdHlQZXJtaXNzaW9ucyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSwgdGhpcy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpLCBudWxsLCAiYXV0aGVudGljYXRpb25NZWNoYW5pc21zIiwgbnVsbCwgMCwgLTEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRDb25maWdQcm9wZXJ0eSgpLCBudWxsLCAiY29uZmlnUHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlQWRhcHRlcigpLCB0aGlzLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCksIG51bGwsICJvdXRib3VuZFJlc291cmNlQWRhcHRlciIsIG51bGwsIDAsIDEsIFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSwgdGhpcy5nZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCksIG51bGwsICJpbmJvdW5kUmVzb3VyY2VBZGFwdGVyIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZUFkYXB0ZXJfQWRtaW5PYmplY3RzKCksIHRoaXMuZ2V0QWRtaW5PYmplY3QoKSwgbnVsbCwgImFkbWluT2JqZWN0cyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoYXV0aGVudGljYXRpb25NZWNoYW5pc21FQ2xhc3MsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCAiQXV0aGVudGljYXRpb25NZWNoYW5pc20iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYXV0aGVudGljYXRpb25NZWNoYW5pc20iLCBudWxsLCAwLCAxLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCksIHRoaXMuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCksICJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGUiLCBudWxsLCAwLCAxLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjcmVkZW50aWFsSW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0N1c3RvbUF1dGhNZWNoVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY3VzdG9tQXV0aE1lY2hUeXBlIiwgbnVsbCwgMCwgMSwgQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhjb25maWdQcm9wZXJ0eUVDbGFzcywgQ29uZmlnUHJvcGVydHkuY2xhc3MsICJDb25maWdQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ29uZmlnUHJvcGVydHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbmZpZ1Byb3BlcnR5X05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uZmlnUHJvcGVydHlfVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidHlwZSIsIG51bGwsIDAsIDEsIENvbmZpZ1Byb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb25maWdQcm9wZXJ0eV9WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29uZmlnUHJvcGVydHlfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBDb25maWdQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhzZWN1cml0eVBlcm1pc3Npb25FQ2xhc3MsIFNlY3VyaXR5UGVybWlzc2lvbi5jbGFzcywgIlNlY3VyaXR5UGVybWlzc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFNlY3VyaXR5UGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX1NwZWNpZmljYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNwZWNpZmljYXRpb24iLCBudWxsLCAwLCAxLCBTZWN1cml0eVBlcm1pc3Npb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFNlY3VyaXR5UGVybWlzc2lvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhsaWNlbnNlRUNsYXNzLCBMaWNlbnNlLmNsYXNzLCAiTGljZW5zZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGljZW5zZV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBMaWNlbnNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRMaWNlbnNlX1JlcXVpcmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVxdWlyZWQiLCBudWxsLCAwLCAxLCBMaWNlbnNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldExpY2Vuc2VfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBMaWNlbnNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGluYm91bmRSZXNvdXJjZUFkYXB0ZXJFQ2xhc3MsIEluYm91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICJJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX01lc3NhZ2VBZGFwdGVyKCksIHRoaXMuZ2V0TWVzc2FnZUFkYXB0ZXIoKSwgbnVsbCwgIm1lc3NhZ2VBZGFwdGVyIiwgbnVsbCwgMCwgMSwgSW5ib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhvdXRib3VuZFJlc291cmNlQWRhcHRlckVDbGFzcywgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICJPdXRib3VuZFJlc291cmNlQWRhcHRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCIsIG51bGwsIDAsIDEsIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpLCB0aGlzLmdldFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQoKSwgInRyYW5zYWN0aW9uU3VwcG9ydCIsIG51bGwsIDAsIDEsIE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25EZWZpbml0aW9ucygpLCB0aGlzLmdldENvbm5lY3Rpb25EZWZpbml0aW9uKCksIG51bGwsICJjb25uZWN0aW9uRGVmaW5pdGlvbnMiLCBudWxsLCAwLCAtMSwgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpLCB0aGlzLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCksIG51bGwsICJhdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMiLCBudWxsLCAwLCAtMSwgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MobWVzc2FnZUFkYXB0ZXJFQ2xhc3MsIE1lc3NhZ2VBZGFwdGVyLmNsYXNzLCAiTWVzc2FnZUFkYXB0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VBZGFwdGVyX01lc3NhZ2VMaXN0ZW5lcnMoKSwgdGhpcy5nZXRNZXNzYWdlTGlzdGVuZXIoKSwgbnVsbCwgIm1lc3NhZ2VMaXN0ZW5lcnMiLCBudWxsLCAxLCAtMSwgTWVzc2FnZUFkYXB0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoY29ubmVjdGlvbkRlZmluaXRpb25FQ2xhc3MsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAiQ29ubmVjdGlvbkRlZmluaXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rpb25EZWZpbml0aW9uX01hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcyIsIG51bGwsIDAsIDEsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzIiwgbnVsbCwgMCwgMSwgQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbm5lY3Rpb25JbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBDb25uZWN0aW9uRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkltcGxDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29ubmVjdGlvbkltcGxDbGFzcyIsIG51bGwsIDAsIDEsIENvbm5lY3Rpb25EZWZpbml0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25maWdQcm9wZXJ0aWVzKCksIHRoaXMuZ2V0Q29uZmlnUHJvcGVydHkoKSwgbnVsbCwgImNvbmZpZ1Byb3BlcnRpZXMiLCBudWxsLCAwLCAtMSwgQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoYWRtaW5PYmplY3RFQ2xhc3MsIEFkbWluT2JqZWN0LmNsYXNzLCAiQWRtaW5PYmplY3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEFkbWluT2JqZWN0X0FkbWluT2JqZWN0SW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhZG1pbk9iamVjdEludGVyZmFjZSIsIG51bGwsIDAsIDEsIEFkbWluT2JqZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBZG1pbk9iamVjdF9BZG1pbk9iamVjdENsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhZG1pbk9iamVjdENsYXNzIiwgbnVsbCwgMCwgMSwgQWRtaW5PYmplY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRDb25maWdQcm9wZXJ0eSgpLCBudWxsLCAiY29uZmlnUHJvcGVydGllcyIsIG51bGwsIDAsIC0xLCBBZG1pbk9iamVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhtZXNzYWdlTGlzdGVuZXJFQ2xhc3MsIE1lc3NhZ2VMaXN0ZW5lci5jbGFzcywgIk1lc3NhZ2VMaXN0ZW5lciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWVzc2FnZUxpc3RlbmVyX01lc3NhZ2VMaXN0ZW5lclR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1lc3NhZ2VMaXN0ZW5lclR5cGUiLCBudWxsLCAwLCAxLCBNZXNzYWdlTGlzdGVuZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1lc3NhZ2VMaXN0ZW5lcl9BY3RpdmF0aW9uU3BlYygpLCB0aGlzLmdldEFjdGl2YXRpb25TcGVjKCksIG51bGwsICJhY3RpdmF0aW9uU3BlYyIsIG51bGwsIDEsIDEsIE1lc3NhZ2VMaXN0ZW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhhY3RpdmF0aW9uU3BlY0VDbGFzcywgQWN0aXZhdGlvblNwZWMuY2xhc3MsICJBY3RpdmF0aW9uU3BlYyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZhdGlvblNwZWNfQWN0aXZhdGlvblNwZWNDbGFzcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYWN0aXZhdGlvblNwZWNDbGFzcyIsIG51bGwsIDAsIDEsIEFjdGl2YXRpb25TcGVjLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRBY3RpdmF0aW9uU3BlY19SZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKSwgdGhpcy5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpLCBudWxsLCAicmVxdWlyZWRDb25maWdQcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIEFjdGl2YXRpb25TcGVjLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlRUNsYXNzLCBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5jbGFzcywgIlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCisJCQlpbml0RUVudW0oYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRUVudW0sIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS5jbGFzcywgIkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwoYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlRUVudW0sIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZS5CQVNJQ19QQVNTV09SRF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChhdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVFRW51bSwgQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlLktFUkJWNV9MSVRFUkFMKTsKKwkKKwkJCWluaXRFRW51bSh0cmFuc2FjdGlvblN1cHBvcnRLaW5kRUVudW0sIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQuY2xhc3MsICJUcmFuc2FjdGlvblN1cHBvcnRLaW5kIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc2FjdGlvblN1cHBvcnRLaW5kRUVudW0sIFRyYW5zYWN0aW9uU3VwcG9ydEtpbmQuTk9fVFJBTlNBQ1RJT05fTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwodHJhbnNhY3Rpb25TdXBwb3J0S2luZEVFbnVtLCBUcmFuc2FjdGlvblN1cHBvcnRLaW5kLkxPQ0FMX1RSQU5TQUNUSU9OX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKHRyYW5zYWN0aW9uU3VwcG9ydEtpbmRFRW51bSwgVHJhbnNhY3Rpb25TdXBwb3J0S2luZC5YQV9UUkFOU0FDVElPTl9MSVRFUkFMKTsKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9MaWNlbnNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTGljZW5zZUltcGwuamF2YQppbmRleCA1MGQ0MzNhLi5iNjgzNTk1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9MaWNlbnNlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL0xpY2Vuc2VJbXBsLmphdmEKQEAgLTkwLDYgKzkwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLkxJQ0VOU0U7CiAJfQpAQCAtMTcwLDYgKzE3MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTlM6CkBAIC0xODMsNiArMTg1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OOgpAQCAtMjAwLDYgKzIwMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fREVTQ1JJUFRJT046CkBAIC0yMjEsNiArMjI1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTjoKQEAgLTI0MSw2ICsyNDYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OOgpAQCAtMjU2LDE0ICsyNjIsMTUgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXF1aXJlZDogIik7Ci0JCWlmIChyZXF1aXJlZEVTZXQpIHJlc3VsdC5hcHBlbmQocmVxdWlyZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByZXF1aXJlZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHJlcXVpcmVkRVNldCkgcmVzdWx0LmFwcGVuZChyZXF1aXJlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VBZGFwdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUFkYXB0ZXJJbXBsLmphdmEKaW5kZXggMzEyYmEyYi4uNGM3ODliOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUFkYXB0ZXJJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUFkYXB0ZXJJbXBsLmphdmEKQEAgLTYyLDYgKzYyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLk1FU1NBR0VfQURBUFRFUjsKIAl9CkBAIC04Myw2ICs4NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVJfX01FU1NBR0VfTElTVEVORVJTOgpAQCAtOTYsNiArOTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFX0xJU1RFTkVSUzoKQEAgLTEwOSw2ICsxMTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRV9MSVNURU5FUlM6CkBAIC0xMjQsNiArMTI4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0FEQVBURVJfX01FU1NBR0VfTElTVEVORVJTOgpAQCAtMTM4LDYgKzE0Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9BREFQVEVSX19NRVNTQUdFX0xJU1RFTkVSUzoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VMaXN0ZW5lckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL01lc3NhZ2VMaXN0ZW5lckltcGwuamF2YQppbmRleCBkOTZiZDYyLi44NjU3ODVkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9NZXNzYWdlTGlzdGVuZXJJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvTWVzc2FnZUxpc3RlbmVySW1wbC5qYXZhCkBAIC04MCw2ICs4MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5NRVNTQUdFX0xJU1RFTkVSOwogCX0KQEAgLTE1Myw2ICsxNTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDOgpAQCAtMTY2LDYgKzE2OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFX0xJU1RFTkVSX1RZUEU6CkBAIC0xODEsNiArMTg0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFX0xJU1RFTkVSX1RZUEU6CkBAIC0xOTgsNiArMjAyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFX0xJU1RFTkVSX1RZUEU6CkBAIC0yMTUsNiArMjIwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5NRVNTQUdFX0xJU1RFTkVSX19NRVNTQUdFX0xJU1RFTkVSX1RZUEU6CkBAIC0yMzAsMTEgKzIzNiwxMiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWVzc2FnZUxpc3RlbmVyVHlwZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAobWVzc2FnZUxpc3RlbmVyVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChtZXNzYWdlTGlzdGVuZXJUeXBlKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9PdXRib3VuZFJlc291cmNlQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhCmluZGV4IDMxZjk0MmIuLjBlNzE0NjQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL091dGJvdW5kUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhCkBAIC0xMzcsNiArMTM3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVI7CiAJfQpAQCAtMjYyLDYgKzI2Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0RFRklOSVRJT05TOgpAQCAtMjc3LDYgKzI3OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQ6CkBAIC0yOTYsNiArMjk5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQ6CkBAIC0zMjEsNiArMzI1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQ6CkBAIC0zNDQsNiArMzQ5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQ6CkBAIC0zNjMsMTQgKzM2OSwxNSBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVhdXRoZW50aWNhdGlvblN1cHBvcnQ6ICIpOwotCQlpZiAocmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0KSByZXN1bHQuYXBwZW5kKHJlYXV0aGVudGljYXRpb25TdXBwb3J0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHJhbnNhY3Rpb25TdXBwb3J0OiAiKTsKLQkJaWYgKHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25TdXBwb3J0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7CisJCXJlc3VsdC5hcHBlbmQoIiAocmVhdXRoZW50aWNhdGlvblN1cHBvcnQ6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydEVTZXQpIHJlc3VsdC5hcHBlbmQocmVhdXRoZW50aWNhdGlvblN1cHBvcnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIHRyYW5zYWN0aW9uU3VwcG9ydDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25TdXBwb3J0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwuamF2YQppbmRleCBjZTdkYzcwLi5hY2ZkODk0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUltcGwuamF2YQpAQCAtODUsNiArODUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEpjYVBhY2thZ2UuTGl0ZXJhbHMuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEU7CiAJfQpAQCAtMTI3LDYgKzEyOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fREVTQ1JJUFRJT05TOgpAQCAtMTQwLDYgKzE0Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fTkFNRToKQEAgLTE1NSw2ICsxNTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX19OQU1FOgpAQCAtMTczLDYgKzE3Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX05BTUU6CkBAIC0xOTAsNiArMTk1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5SRVFVSVJFRF9DT05GSUdfUFJPUEVSVFlfVFlQRV9fTkFNRToKQEAgLTIwNSwxMSArMjExLDEyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlQWRhcHRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1Jlc291cmNlQWRhcHRlckltcGwuamF2YQppbmRleCAzMDkwNDVhLi45YTI3YmY3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9SZXNvdXJjZUFkYXB0ZXJJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvUmVzb3VyY2VBZGFwdGVySW1wbC5qYXZhCkBAIC0yMzQsNiArMjM0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKY2FQYWNrYWdlLkxpdGVyYWxzLlJFU09VUkNFX0FEQVBURVI7CiAJfQpAQCAtNTc2LDYgKzU3Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19TRUNVUklUWV9QRVJNSVNTSU9OUzoKQEAgLTU5OSw2ICs2MDEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1M6CkBAIC02MzgsNiArNjQxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUzoKQEAgLTY5NSw2ICs2OTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX01BTkFHRURfQ09OTkVDVElPTl9GQUNUT1JZX0NMQVNTOgpAQCAtNzQ4LDYgKzc1Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fTUFOQUdFRF9DT05ORUNUSU9OX0ZBQ1RPUllfQ0xBU1M6CkBAIC03ODUsMjUgKzc5MSwyNiBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzczogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAobWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChjb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3M6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uSW50ZXJmYWNlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uSW50ZXJmYWNlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGNvbm5lY3Rpb25JbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25JbXBsQ2xhc3M6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGNvbm5lY3Rpb25JbXBsQ2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoY29ubmVjdGlvbkltcGxDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHJhbnNhY3Rpb25TdXBwb3J0OiAiKTsKLQkJaWYgKHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25TdXBwb3J0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhdXRoZW50aWNhdGlvblN1cHBvcnQ6ICIpOwotCQlpZiAocmVhdXRoZW50aWNhdGlvblN1cHBvcnRFU2V0KSByZXN1bHQuYXBwZW5kKHJlYXV0aGVudGljYXRpb25TdXBwb3J0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VBZGFwdGVyQ2xhc3M6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHRyYW5zYWN0aW9uU3VwcG9ydDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHRyYW5zYWN0aW9uU3VwcG9ydEVTZXQpIHJlc3VsdC5hcHBlbmQodHJhbnNhY3Rpb25TdXBwb3J0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHJlYXV0aGVudGljYXRpb25TdXBwb3J0RVNldCkgcmVzdWx0LmFwcGVuZChyZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgcmVzb3VyY2VBZGFwdGVyQ2xhc3M6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQocmVzb3VyY2VBZGFwdGVyQ2xhc3MpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5UGVybWlzc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5UGVybWlzc2lvbkltcGwuamF2YQppbmRleCA5Y2ZkZDFjLi4wNWY4ZjdkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvaW1wbC9TZWN1cml0eVBlcm1pc3Npb25JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL2ltcGwvU2VjdXJpdHlQZXJtaXNzaW9uSW1wbC5qYXZhCkBAIC04Myw2ICs4Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmNhUGFja2FnZS5MaXRlcmFscy5TRUNVUklUWV9QRVJNSVNTSU9OOwogCX0KQEAgLTE0MCw2ICsxNDEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TOgpAQCAtMTUzLDYgKzE1NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKQEAgLTE3MCw2ICsxNzMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKY2FQYWNrYWdlLlNFQ1VSSVRZX1BFUk1JU1NJT05fX0RFU0NSSVBUSU9OOgpAQCAtMTkxLDYgKzE5NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT046CkBAIC0yMTEsNiArMjE2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTjoKQEAgLTIyNiwxMyArMjMyLDE0IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3BlY2lmaWNhdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgc3BlY2lmaWNhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChzcGVjaWZpY2F0aW9uKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3V0aWwvSmNhQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCBiYmRlMThmLi45NjVhN2MxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvdXRpbC9KY2FBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC91dGlsL0pjYUFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTQ0LDYgKzQ0LDcgQEAKIAkJCW1vZGVsUGFja2FnZSA9IChKY2FQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSk7CiAJCX0KIAl9CisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewogCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKIAkJCXJldHVybiB0cnVlOwpAQCAtNTUsMjYgKzU2LDMzIEBACiAJfQogCiAJcHJvdGVjdGVkIEpjYVN3aXRjaCBzdyA9IG5ldyBKY2FTd2l0Y2goKSB7CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VDb25uZWN0b3IoQ29ubmVjdG9yIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3RvckFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlTGljZW5zZShMaWNlbnNlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUxpY2Vuc2VBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlQWRhcHRlcihSZXNvdXJjZUFkYXB0ZXIgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eVBlcm1pc3Npb24oU2VjdXJpdHlQZXJtaXNzaW9uIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbkFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlQXV0aGVudGljYXRpb25NZWNoYW5pc20oQXV0aGVudGljYXRpb25NZWNoYW5pc20gb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21BZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUNvbmZpZ1Byb3BlcnR5KENvbmZpZ1Byb3BlcnR5IG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUNvbmZpZ1Byb3BlcnR5QWRhcHRlcigpOwogCQl9CiAJfTsKIAorCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7CiAJCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOyAvLyBzdwogCX0KQEAgLTEyOCw1NyArMTM2LDc1IEBACiAJICovCiAJcHJvdGVjdGVkIEpjYVN3aXRjaCBtb2RlbFN3aXRjaCA9CiAJCW5ldyBKY2FTd2l0Y2goKSB7CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbm5lY3RvcihDb25uZWN0b3Igb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3RvckFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VBZGFwdGVyKFJlc291cmNlQWRhcHRlciBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VBdXRoZW50aWNhdGlvbk1lY2hhbmlzbShBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21BZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbmZpZ1Byb3BlcnR5KENvbmZpZ1Byb3BlcnR5IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVDb25maWdQcm9wZXJ0eUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlQZXJtaXNzaW9uKFNlY3VyaXR5UGVybWlzc2lvbiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VMaWNlbnNlKExpY2Vuc2Ugb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUxpY2Vuc2VBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUluYm91bmRSZXNvdXJjZUFkYXB0ZXIoSW5ib3VuZFJlc291cmNlQWRhcHRlciBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlckFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlQWRhcHRlcihNZXNzYWdlQWRhcHRlciBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZUFkYXB0ZXJBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbm5lY3Rpb25EZWZpbml0aW9uKENvbm5lY3Rpb25EZWZpbml0aW9uIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVDb25uZWN0aW9uRGVmaW5pdGlvbkFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlQWRtaW5PYmplY3QoQWRtaW5PYmplY3Qgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUFkbWluT2JqZWN0QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VNZXNzYWdlTGlzdGVuZXIoTWVzc2FnZUxpc3RlbmVyIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlTGlzdGVuZXJBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUFjdGl2YXRpb25TcGVjKEFjdGl2YXRpb25TcGVjIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVBY3RpdmF0aW9uU3BlY0FkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CiAJCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9KU1BDb25maWdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9KU1BDb25maWdJbXBsLmphdmEKaW5kZXggMTE0NDM3Ni4uY2U4YWEzZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSlNQQ29uZmlnSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pTUENvbmZpZ0ltcGwuamF2YQpAQCAtNzQsNiArNzQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEpzcFBhY2thZ2UuTGl0ZXJhbHMuSlNQX0NPTkZJRzsKIAl9CkBAIC0xMDcsNiArMTA4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1RBR19MSUJTOgpAQCAtMTIyLDYgKzEyNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUzoKQEAgLTEzNyw2ICsxNDAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9DT05GSUdfX1RBR19MSUJTOgpAQCAtMTU2LDYgKzE2MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX0NPTkZJR19fVEFHX0xJQlM6CkBAIC0xNzMsNiArMTc4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUzoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pTUFByb3BlcnR5R3JvdXBJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9KU1BQcm9wZXJ0eUdyb3VwSW1wbC5qYXZhCmluZGV4IGQ3MjBkN2IuLjIxZWI5MzkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pTUFByb3BlcnR5R3JvdXBJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSlNQUHJvcGVydHlHcm91cEltcGwuamF2YQpAQCAtMTkzLDYgKzE5Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSnNwUGFja2FnZS5MaXRlcmFscy5KU1BfUFJPUEVSVFlfR1JPVVA7CiAJfQpAQCAtMzk3LDYgKzM5OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOOgpAQCAtNDIyLDYgKzQyNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTjoKQEAgLTQ1Nyw2ICs0NjAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKc3BQYWNrYWdlLkpTUF9QUk9QRVJUWV9HUk9VUF9fVVJMX1BBVFRFUk46CkBAIC00ODksNiArNDkzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfUFJPUEVSVFlfR1JPVVBfX1VSTF9QQVRURVJOOgpAQCAtNTE0LDIzICs1MTksMjQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVybFBhdHRlcm46ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHVybFBhdHRlcm46ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodXJsUGF0dGVybik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWxJZ25vcmVkOiAiKTsKLQkJaWYgKGVsSWdub3JlZEVTZXQpIHJlc3VsdC5hcHBlbmQoZWxJZ25vcmVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFnZUVuY29kaW5nOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBlbElnbm9yZWQ6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChlbElnbm9yZWRFU2V0KSByZXN1bHQuYXBwZW5kKGVsSWdub3JlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgcGFnZUVuY29kaW5nOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHBhZ2VFbmNvZGluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2NyaXB0aW5nSW52YWxpZDogIik7Ci0JCWlmIChzY3JpcHRpbmdJbnZhbGlkRVNldCkgcmVzdWx0LmFwcGVuZChzY3JpcHRpbmdJbnZhbGlkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNYTUw6ICIpOwotCQlpZiAoaXNYTUxFU2V0KSByZXN1bHQuYXBwZW5kKGlzWE1MKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW5jbHVkZVByZWx1ZGVzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzY3JpcHRpbmdJbnZhbGlkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoc2NyaXB0aW5nSW52YWxpZEVTZXQpIHJlc3VsdC5hcHBlbmQoc2NyaXB0aW5nSW52YWxpZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgaXNYTUw6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChpc1hNTEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNYTUwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIGluY2x1ZGVQcmVsdWRlczogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpbmNsdWRlUHJlbHVkZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluY2x1ZGVDb2RhczogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgaW5jbHVkZUNvZGFzOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGluY2x1ZGVDb2Rhcyk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSnNwRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcEZhY3RvcnlJbXBsLmphdmEKaW5kZXggZjllNWM3Mi4uNjIzN2FkNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSnNwRmFjdG9yeUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BGYWN0b3J5SW1wbC5qYXZhCkBAIC0zNiw3ICszNiw3IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBKc3BGYWN0b3J5IGluaXQoKSB7CiAJCXRyeSB7Ci0JCQlKc3BGYWN0b3J5IHRoZUpzcEZhY3RvcnkgPSAoSnNwRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgianNwLnhtaSIpOyAKKwkJCUpzcEZhY3RvcnkgdGhlSnNwRmFjdG9yeSA9IChKc3BGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqc3AueG1pIik7ICAvLyROT04tTkxTLTEkCiAJCQlpZiAodGhlSnNwRmFjdG9yeSAhPSBudWxsKSB7CiAJCQkJcmV0dXJuIHRoZUpzcEZhY3Rvcnk7CiAJCQl9CkBAIC02MiwxMyArNjIsMTQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKIAkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHOiByZXR1cm4gY3JlYXRlSlNQQ29uZmlnKCk7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQOiByZXR1cm4gY3JlYXRlSlNQUHJvcGVydHlHcm91cCgpOwogCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEU6IHJldHVybiBjcmVhdGVUYWdMaWJSZWZUeXBlKCk7CiAJCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcFBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9Kc3BQYWNrYWdlSW1wbC5qYXZhCmluZGV4IDlkNWFkZjYuLjJmODY2NWMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL0pzcFBhY2thZ2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvSnNwUGFja2FnZUltcGwuamF2YQpAQCAtMTcsMzEgKzE3LDE0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BQcm9wZXJ0eUdyb3VwOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5UYWdMaWJSZWZUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKIAogCiAvKioKQEAgLTk2LDcgKzc5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCXByaXZhdGUgdm9sYXRpbGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKIAogCS8qKgogCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwpAQCAtMTI0LDcgKzEwNywxMCBAQAogCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoSnNwUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpOwogCiAJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBKc3BQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEpzcFBhY2thZ2VJbXBsKCkpOworCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gCisJCQkoSnNwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mCisJCQkJCUpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3CisJCQkJCQkJSnNwUGFja2FnZUltcGwoKSk7CiAKIAkJaXNJbml0ZWQgPSB0cnVlOwogCkBAIC0xMzIsNTAgKzExOCwyMCBAQAogCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CiAKLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQ2xpZW50UGFja2FnZUltcGwgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IENsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UgPSAoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKY2FQYWNrYWdlSW1wbCB0aGVKY2FQYWNrYWdlID0gKEpjYVBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSmNhUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKY2FQYWNrYWdlLmVOU19VUkkpIDogSmNhUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIDogV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzY29tbW9uUGFja2FnZUltcGwgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSA6IFdzZGRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KIAkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKIAkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKY2FQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CiAKIAkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQogCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKIAogCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCiAJCXRoZUpzcFBhY2thZ2UuZnJlZXplKCk7CiAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChKc3BQYWNrYWdlLmVOU19VUkksIHRoZUpzcFBhY2thZ2UpOworCisJCUoyRUVJbml0LmluaXRFTUZNb2RlbHMoKTsKKwogCQlyZXR1cm4gdGhlSnNwUGFja2FnZTsKIAl9CiAKQEAgLTM3NywzMSArMzMzLDQzIEBACiAJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKIAkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKIAotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWpzcENvbmZpZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCXRhZ0xpYlJlZlR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGpzcENvbmZpZ0VDbGFzcywgSlNQQ29uZmlnLmNsYXNzLCAiSlNQQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BDb25maWdfVGFnTGlicygpLCB0aGlzLmdldFRhZ0xpYlJlZlR5cGUoKSwgbnVsbCwgInRhZ0xpYnMiLCBudWxsLCAwLCAtMSwgSlNQQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BDb25maWdfUHJvcGVydHlHcm91cHMoKSwgdGhpcy5nZXRKU1BQcm9wZXJ0eUdyb3VwKCksIG51bGwsICJwcm9wZXJ0eUdyb3VwcyIsIG51bGwsIDAsIC0xLCBKU1BDb25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAiSlNQUHJvcGVydHlHcm91cCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQUHJvcGVydHlHcm91cF9VcmxQYXR0ZXJuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmxQYXR0ZXJuIiwgbnVsbCwgMCwgLTEsIEpTUFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFByb3BlcnR5R3JvdXBfRWxJZ25vcmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZWxJZ25vcmVkIiwgInRydWUiLCAwLCAxLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFByb3BlcnR5R3JvdXBfUGFnZUVuY29kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYWdlRW5jb2RpbmciLCBudWxsLCAwLCAxLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BQcm9wZXJ0eUdyb3VwX1NjcmlwdGluZ0ludmFsaWQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJzY3JpcHRpbmdJbnZhbGlkIiwgInRydWUiLCAwLCAxLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFByb3BlcnR5R3JvdXBfSXNYTUwoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJpc1hNTCIsICJmYWxzZSIsIDAsIDEsIEpTUFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlUHJlbHVkZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImluY2x1ZGVQcmVsdWRlcyIsIG51bGwsIDAsIC0xLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVDb2RhcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5jbHVkZUNvZGFzIiwgbnVsbCwgMCwgLTEsIEpTUFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0YWdMaWJSZWZUeXBlRUNsYXNzLCBUYWdMaWJSZWZUeXBlLmNsYXNzLCAiVGFnTGliUmVmVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliUmVmVHlwZV9UYWdsaWJVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRhZ2xpYlVSSSIsIG51bGwsIDAsIDEsIFRhZ0xpYlJlZlR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYlJlZlR5cGVfVGFnbGliTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRhZ2xpYkxvY2F0aW9uIiwgbnVsbCwgMCwgMSwgVGFnTGliUmVmVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCWJvb2xlYW4gaGFzTG9jayA9IGZhbHNlOworCQl0cnkgeworCQkJaGFzTG9jayA9IEoyRUVJbml0LmFxdWlyZUluaXRpYWxpemVQYWNrYWdlQ29udGVudHNMb2NrKCk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9CQkKKwkJCisJCXRyeXsKKwkJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJCWpzcENvbmZpZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJanNwUHJvcGVydHlHcm91cEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOworCQkJdGFnTGliUmVmVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQorCQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJCWluaXRFQ2xhc3MoanNwQ29uZmlnRUNsYXNzLCBKU1BDb25maWcuY2xhc3MsICJKU1BDb25maWciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEpTUENvbmZpZ19UYWdMaWJzKCksIHRoaXMuZ2V0VGFnTGliUmVmVHlwZSgpLCBudWxsLCAidGFnTGlicyIsIG51bGwsIDAsIC0xLCBKU1BDb25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEpTUENvbmZpZ19Qcm9wZXJ0eUdyb3VwcygpLCB0aGlzLmdldEpTUFByb3BlcnR5R3JvdXAoKSwgbnVsbCwgInByb3BlcnR5R3JvdXBzIiwgbnVsbCwgMCwgLTEsIEpTUENvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhqc3BQcm9wZXJ0eUdyb3VwRUNsYXNzLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAiSlNQUHJvcGVydHlHcm91cCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQUHJvcGVydHlHcm91cF9VcmxQYXR0ZXJuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmxQYXR0ZXJuIiwgbnVsbCwgMCwgLTEsIEpTUFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEpTUFByb3BlcnR5R3JvdXBfRWxJZ25vcmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZWxJZ25vcmVkIiwgInRydWUiLCAwLCAxLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQUHJvcGVydHlHcm91cF9QYWdlRW5jb2RpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhZ2VFbmNvZGluZyIsIG51bGwsIDAsIDEsIEpTUFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEpTUFByb3BlcnR5R3JvdXBfU2NyaXB0aW5nSW52YWxpZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInNjcmlwdGluZ0ludmFsaWQiLCAidHJ1ZSIsIDAsIDEsIEpTUFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BQcm9wZXJ0eUdyb3VwX0lzWE1MKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaXNYTUwiLCAiZmFsc2UiLCAwLCAxLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQUHJvcGVydHlHcm91cF9JbmNsdWRlUHJlbHVkZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImluY2x1ZGVQcmVsdWRlcyIsIG51bGwsIDAsIC0xLCBKU1BQcm9wZXJ0eUdyb3VwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BQcm9wZXJ0eUdyb3VwX0luY2x1ZGVDb2RhcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaW5jbHVkZUNvZGFzIiwgbnVsbCwgMCwgLTEsIEpTUFByb3BlcnR5R3JvdXAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3ModGFnTGliUmVmVHlwZUVDbGFzcywgVGFnTGliUmVmVHlwZS5jbGFzcywgIlRhZ0xpYlJlZlR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYlJlZlR5cGVfVGFnbGliVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YWdsaWJVUkkiLCBudWxsLCAwLCAxLCBUYWdMaWJSZWZUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJSZWZUeXBlX1RhZ2xpYkxvY2F0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YWdsaWJMb2NhdGlvbiIsIG51bGwsIDAsIDEsIFRhZ0xpYlJlZlR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiB9IC8vSnNwUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL1RhZ0xpYlJlZlR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvaW1wbC9UYWdMaWJSZWZUeXBlSW1wbC5qYXZhCmluZGV4IGY0YTI0NDEuLmJiNGM1ZmMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC9pbXBsL1RhZ0xpYlJlZlR5cGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL2ltcGwvVGFnTGliUmVmVHlwZUltcGwuamF2YQpAQCAtODcsNiArODcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEpzcFBhY2thZ2UuTGl0ZXJhbHMuVEFHX0xJQl9SRUZfVFlQRTsKIAl9CkBAIC0xMzgsNiArMTM5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9VUkk6CkBAIC0xNTMsNiArMTU1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSnNwUGFja2FnZS5UQUdfTElCX1JFRl9UWVBFX19UQUdMSUJfVVJJOgpAQCAtMTcwLDYgKzE3Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX1VSSToKQEAgLTE4Nyw2ICsxOTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKc3BQYWNrYWdlLlRBR19MSUJfUkVGX1RZUEVfX1RBR0xJQl9VUkk6CkBAIC0yMDIsMTMgKzIwNywxNCBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFnbGliVVJJOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiICh0YWdsaWJVUkk6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodGFnbGliVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YWdsaWJMb2NhdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdGFnbGliTG9jYXRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodGFnbGliTG9jYXRpb24pOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvaW50ZXJuYWwvdXRpbC9Kc3BBZGFwdGVyRmFjdG9yeS5qYXZhCmluZGV4IDYyODM3OTkuLjBlYjQ5NGIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC9pbnRlcm5hbC91dGlsL0pzcEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL2ludGVybmFsL3V0aWwvSnNwQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtNjEsNiArNjEsNyBAQAogCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKQEAgLTc5LDI0ICs4MCwzMSBAQAogCSAqLwogCXByb3RlY3RlZCBKc3BTd2l0Y2ggbW9kZWxTd2l0Y2ggPQogCQluZXcgSnNwU3dpdGNoKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BDb25maWcoSlNQQ29uZmlnIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVKU1BDb25maWdBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUpTUFByb3BlcnR5R3JvdXAoSlNQUHJvcGVydHlHcm91cCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSlNQUHJvcGVydHlHcm91cEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlVGFnTGliUmVmVHlwZShUYWdMaWJSZWZUeXBlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVUYWdMaWJSZWZUeXBlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CiAJCQl9CkBAIC0xMTAsNiArMTE4LDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKIAkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0JvZHlDb250ZW50VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0JvZHlDb250ZW50VHlwZS5qYXZhCmluZGV4IDYyMWE0YWEuLmI2YjM4ZDMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9Cb2R5Q29udGVudFR5cGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvQm9keUNvbnRlbnRUeXBlLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvZHlDb250ZW50VHlwZSBUQUdERVBFTkRFTlRfTElURVJBTCA9IG5ldyBCb2R5Q29udGVudFR5cGUoVEFHREVQRU5ERU5ULCAidGFnZGVwZW5kZW50IiwgInRhZ2RlcGVuZGVudCIpOy8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvZHlDb250ZW50VHlwZSBUQUdERVBFTkRFTlRfTElURVJBTCA9IG5ldyBCb2R5Q29udGVudFR5cGUoVEFHREVQRU5ERU5ULCAidGFnZGVwZW5kZW50IiwgInRhZ2RlcGVuZGVudCIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+SlNQPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTcyLDcgKzcyLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvZHlDb250ZW50VHlwZSBKU1BfTElURVJBTCA9IG5ldyBCb2R5Q29udGVudFR5cGUoSlNQLCAiSlNQIiwgIkpTUCIpOy8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEJvZHlDb250ZW50VHlwZSBKU1BfTElURVJBTCA9IG5ldyBCb2R5Q29udGVudFR5cGUoSlNQLCAiSlNQIiwgIkpTUCIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+RW1wdHk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtODYsNyArODYsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9keUNvbnRlbnRUeXBlIEVNUFRZX0xJVEVSQUwgPSBuZXcgQm9keUNvbnRlbnRUeXBlKEVNUFRZLCAiZW1wdHkiLCAiZW1wdHkiKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBCb2R5Q29udGVudFR5cGUgRU1QVFlfTElURVJBTCA9IG5ldyBCb2R5Q29udGVudFR5cGUoRU1QVFksICJlbXB0eSIsICJlbXB0eSIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+U2NyaXB0bGVzczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvZHlDb250ZW50VHlwZSBTQ1JJUFRMRVNTX0xJVEVSQUwgPSBuZXcgQm9keUNvbnRlbnRUeXBlKFNDUklQVExFU1MsICJzY3JpcHRsZXNzIiwgInNjcmlwdGxlc3MiKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBCb2R5Q29udGVudFR5cGUgU0NSSVBUTEVTU19MSVRFUkFMID0gbmV3IEJvZHlDb250ZW50VHlwZShTQ1JJUFRMRVNTLCAic2NyaXB0bGVzcyIsICJzY3JpcHRsZXNzIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+Qm9keSBDb250ZW50IFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0pTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9KU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLmphdmEKaW5kZXggZjIwZWI3Ny4uMzBjYzIzOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL0pTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZS5qYXZhCkBAIC00Nyw3ICs0Nyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIE5FU1RFRF9MSVRFUkFMID0gbmV3IEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUoTkVTVEVELCAiTkVTVEVEIiwgIk5FU1RFRCIpOy8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgTkVTVEVEX0xJVEVSQUwgPSBuZXcgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZShORVNURUQsICJORVNURUQiLCAiTkVTVEVEIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5BVCBCRUdJTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC02MSw3ICs2MSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIEFUX0JFR0lOX0xJVEVSQUwgPSBuZXcgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZShBVF9CRUdJTiwgIkFUX0JFR0lOIiwgIkFUX0JFR0lOIik7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBBVF9CRUdJTl9MSVRFUkFMID0gbmV3IEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUoQVRfQkVHSU4sICJBVF9CRUdJTiIsICJBVF9CRUdJTiIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+QVQgRU5EPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTc1LDcgKzc1LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUgQVRfRU5EX0xJVEVSQUwgPSBuZXcgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZShBVF9FTkQsICJBVF9FTkQiLCAiQVRfRU5EIik7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSBBVF9FTkRfTElURVJBTCA9IG5ldyBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlKEFUX0VORCwgIkFUX0VORCIsICJBVF9FTkQiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5KU1AgU2NyaXB0aW5nIFZhcmlhYmxlIFNjb3BlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdsaWJQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvVGFnbGliUGFja2FnZS5qYXZhCmluZGV4IGNhODNlODQuLjE5N2U2MTkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9UYWdsaWJQYWNrYWdlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL1RhZ2xpYlBhY2thZ2UuamF2YQpAQCAtMzksNyArMzksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlTdHJpbmcgZU5BTUUgPSAidGFnbGliIjsKKwlTdHJpbmcgZU5BTUUgPSAidGFnbGliIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCiAJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KQEAgLTQ3LDcgKzQ3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JU3RyaW5nIGVOU19VUkkgPSAidGFnbGliLnhtaSI7CisJU3RyaW5nIGVOU19VUkkgPSAidGFnbGliLnhtaSI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgogCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgpAQCAtNTUsNyArNTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIiOworCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYiI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgogCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9FeHRlbnNpYmxlVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0V4dGVuc2libGVUeXBlSW1wbC5qYXZhCmluZGV4IGZkNmQ4YzguLjMwM2Q1NWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0V4dGVuc2libGVUeXBlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0V4dGVuc2libGVUeXBlSW1wbC5qYXZhCkBAIC02Niw2ICs2Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gVGFnbGliUGFja2FnZS5MaXRlcmFscy5FWFRFTlNJQkxFX1RZUEU7CiAJfQpAQCAtOTYsNiArOTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuRVhURU5TSUJMRV9UWVBFX19WQUxVRToKQEAgLTEwOSw2ICsxMTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkVYVEVOU0lCTEVfVFlQRV9fVkFMVUU6CkBAIC0xMjMsNiArMTI2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5FWFRFTlNJQkxFX1RZUEVfX1ZBTFVFOgpAQCAtMTM3LDYgKzE0MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuRVhURU5TSUJMRV9UWVBFX19WQUxVRToKQEAgLTE1MCwxMSArMTU1LDEyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodmFsdWUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0Z1bmN0aW9uSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvRnVuY3Rpb25JbXBsLmphdmEKaW5kZXggYjkwMjQyZS4uMTJhMzU1NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvRnVuY3Rpb25JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvRnVuY3Rpb25JbXBsLmphdmEKQEAgLTEzOSw2ICsxMzksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFRhZ2xpYlBhY2thZ2UuTGl0ZXJhbHMuRlVOQ1RJT047CiAJfQpAQCAtMjYxLDYgKzI2Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fRlVOQ1RJT05fRVhURU5TSU9OUzoKQEAgLTI3NCw2ICsyNzYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX05BTUU6CkBAIC0yOTYsNiArMjk5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5GVU5DVElPTl9fTkFNRToKQEAgLTMyMyw2ICszMjcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkZVTkNUSU9OX19OQU1FOgpAQCAtMzQ5LDYgKzM1NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuRlVOQ1RJT05fX05BTUU6CkBAIC0zNzAsMTUgKzM3NiwxNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzaWduYXR1cmU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHNpZ25hdHVyZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChzaWduYXR1cmUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4YW1wbGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGV4YW1wbGU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZXhhbXBsZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVGFnQXR0cmlidXRlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVGFnQXR0cmlidXRlSW1wbC5qYXZhCmluZGV4IDlhMDQ5ZDAuLmU4ZTFlN2EgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0pTUFRhZ0F0dHJpYnV0ZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BUYWdBdHRyaWJ1dGVJbXBsLmphdmEKQEAgLTEzOCw2ICsxMzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFRhZ2xpYlBhY2thZ2UuTGl0ZXJhbHMuSlNQX1RBR19BVFRSSUJVVEU7CiAJfQpAQCAtMzI0LDYgKzMyNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fREVTQ1JJUFRJT05TOgpAQCAtMzM3LDYgKzMzOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fTkFNRToKQEAgLTM2MSw2ICszNjQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBUYWdsaWJQYWNrYWdlLkpTUF9UQUdfQVRUUklCVVRFX19OQU1FOgpAQCAtMzkxLDYgKzM5NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1RBR19BVFRSSUJVVEVfX05BTUU6CkBAIC00MjAsNiArNDI1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX0FUVFJJQlVURV9fTkFNRToKQEAgLTQ0MSwxNyArNDQ3LDE4IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVxdWlyZWQ6ICIpOwotCQlpZiAocmVxdWlyZWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlcXVpcmVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcnRFeHByVmFsdWU6ICIpOwotCQlpZiAocnRFeHByVmFsdWVFU2V0KSByZXN1bHQuYXBwZW5kKHJ0RXhwclZhbHVlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZnJhZ21lbnQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJlcXVpcmVkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAocmVxdWlyZWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlcXVpcmVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCBydEV4cHJWYWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHJ0RXhwclZhbHVlRVNldCkgcmVzdWx0LmFwcGVuZChydEV4cHJWYWx1ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgZnJhZ21lbnQ6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZnJhZ21lbnQpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0pTUFRhZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL0pTUFRhZ0ltcGwuamF2YQppbmRleCAyYWFkYWI3Li43ODVjZmYwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BUYWdJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVGFnSW1wbC5qYXZhCkBAIC0xNTEsNiArMTUxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBUYWdsaWJQYWNrYWdlLkxpdGVyYWxzLkpTUF9UQUc7CiAJfQpAQCAtMzg3LDYgKzM4OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19BVFRSSUJVVEVTOgpAQCAtNDAyLDYgKzQwNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19CT0RZX0NPTlRFTlQ6CkBAIC00MzEsNiArNDM0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19CT0RZX0NPTlRFTlQ6CkBAIC00NjgsNiArNDcyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19CT0RZX0NPTlRFTlQ6CkBAIC01MDMsNiArNTA4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVEFHX19CT0RZX0NPTlRFTlQ6CkBAIC01MjgsMTcgKzUzNCwxOCBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChib2R5Q29udGVudDogIik7Ci0JCWlmIChib2R5Q29udGVudEVTZXQpIHJlc3VsdC5hcHBlbmQoYm9keUNvbnRlbnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGFtcGxlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChib2R5Q29udGVudDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGJvZHlDb250ZW50RVNldCkgcmVzdWx0LmFwcGVuZChib2R5Q29udGVudCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgZXhhbXBsZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChleGFtcGxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR5bmFtaWNBdHRyaWJ1dGVzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBkeW5hbWljQXR0cmlidXRlczogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChkeW5hbWljQXR0cmlidXRlcyk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvSlNQVmFyaWFibGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BWYXJpYWJsZUltcGwuamF2YQppbmRleCBiMTA1MzUxLi45YWMwZTMyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BWYXJpYWJsZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9KU1BWYXJpYWJsZUltcGwuamF2YQpAQCAtMTE0LDYgKzExNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gVGFnbGliUGFja2FnZS5MaXRlcmFscy5KU1BfVkFSSUFCTEU7CiAJfQpAQCAtMjQ4LDYgKzI0OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfVkFSSUFCTEVfX0RFU0NSSVBUSU9OUzoKQEAgLTI2MSw2ICsyNjMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOOgpAQCAtMjg1LDYgKzI4OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOOgpAQCAtMzE1LDYgKzMxOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOOgpAQCAtMzQ0LDYgKzM0OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1ZBUklBQkxFX19OQU1FX0dJVkVOOgpAQCAtMzY1LDE3ICszNzEsMTggQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZUdpdmVuOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChuYW1lR2l2ZW46ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobmFtZUdpdmVuKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lRnJvbUF0dHJpYnV0ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgbmFtZUZyb21BdHRyaWJ1dGU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobmFtZUZyb21BdHRyaWJ1dGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlY2xhcmU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGRlY2xhcmU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGVjbGFyZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2NvcGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHNjb3BlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHNjb3BlKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdGaWxlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnRmlsZUltcGwuamF2YQppbmRleCAwNDg2NDI5Li40NjU1YzI4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdGaWxlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ0ZpbGVJbXBsLmphdmEKQEAgLTEyNyw2ICsxMjcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFRhZ2xpYlBhY2thZ2UuTGl0ZXJhbHMuVEFHX0ZJTEU7CiAJfQpAQCAtMjExLDYgKzIxMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fVEFHX0VYVEVOU0lPTlM6CkBAIC0yMjQsNiArMjI2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19OQU1FOgpAQCAtMjQzLDYgKzI0Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEVfX05BTUU6CkBAIC0yNjcsNiArMjcxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfRklMRV9fTkFNRToKQEAgLTI5MCw2ICsyOTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlRBR19GSUxFX19OQU1FOgpAQCAtMzA5LDE1ICszMTUsMTYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGF0aDogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgcGF0aDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChwYXRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGFtcGxlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBleGFtcGxlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGV4YW1wbGUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ0xpYkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ0xpYkltcGwuamF2YQppbmRleCBkYmZiMTIzLi42NzNlNGQ1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdMaWJJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnTGliSW1wbC5qYXZhCkBAIC0xMzYsNiArMTM2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBUYWdsaWJQYWNrYWdlLkxpdGVyYWxzLlRBR19MSUI7CiAJfQpAQCAtMjIyLDYgKzIyMyw3IEBACiAJLyoqCiAJICoKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKIAkJc3VwZXIuc2V0RGlzcGxheU5hbWUoZGlzcGxheU5hbWUpOwogCX0KQEAgLTMyNiw2ICszMjgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHUzoKQEAgLTM0Nyw2ICszNTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OOgpAQCAtMzc2LDYgKzM4MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OOgpAQCAtNDE4LDYgKzQyMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OOgpAQCAtNDU2LDYgKzQ2Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0xJQl9fVEFHX0xJQl9WRVJTSU9OOgpAQCAtNDgzLDE3ICs0OTAsMTggQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFnTGliVmVyc2lvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAodGFnTGliVmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh0YWdMaWJWZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqc3BWZXJzaW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBqc3BWZXJzaW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGpzcFZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNob3J0TmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgc2hvcnROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHNob3J0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXJpOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB1cmk6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodXJpKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdsaWJGYWN0b3J5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnbGliRmFjdG9yeUltcGwuamF2YQppbmRleCBkZmQ3MzhiLi4yNzE3MmE2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdsaWJGYWN0b3J5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ2xpYkZhY3RvcnlJbXBsLmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIFRhZ2xpYkZhY3RvcnkgaW5pdCgpIHsKIAkJdHJ5IHsKLQkJCVRhZ2xpYkZhY3RvcnkgdGhlVGFnbGliRmFjdG9yeSA9IChUYWdsaWJGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJ0YWdsaWIueG1pIik7IAorCQkJVGFnbGliRmFjdG9yeSB0aGVUYWdsaWJGYWN0b3J5ID0gKFRhZ2xpYkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoInRhZ2xpYi54bWkiKTsgIC8vJE5PTi1OTFMtMSQKIAkJCWlmICh0aGVUYWdsaWJGYWN0b3J5ICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gdGhlVGFnbGliRmFjdG9yeTsKIAkJCX0KQEAgLTYxLDYgKzYxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKIAkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5UQUdfTElCOiByZXR1cm4gY3JlYXRlVGFnTGliKCk7CkBAIC03Miw3ICs3Myw3IEBACiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVEFHX0ZJTEU6IHJldHVybiBjcmVhdGVUYWdGaWxlKCk7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTjogcmV0dXJuIGNyZWF0ZVRsZEV4dGVuc2lvbigpOwogCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9CiAJfQogCkBAIC04MSw2ICs4Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuQk9EWV9DT05URU5UX1RZUEU6CkBAIC04OCw3ICs5MCw3IEBACiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuSlNQX1NDUklQVElOR19WQVJJQUJMRV9TQ09QRToKIAkJCQlyZXR1cm4gY3JlYXRlSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwogCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9CiAJfQogCkBAIC05Nyw2ICs5OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CiAJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuQk9EWV9DT05URU5UX1RZUEU6CkBAIC0xMDQsNyArMTA3LDcgQEAKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5KU1BfU0NSSVBUSU5HX1ZBUklBQkxFX1NDT1BFOgogCQkJCXJldHVybiBjb252ZXJ0SlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAl9CiAKQEAgLTE4OCw3ICsxOTEsNyBAQAogCSAqLwogCXB1YmxpYyBCb2R5Q29udGVudFR5cGUgY3JlYXRlQm9keUNvbnRlbnRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCUJvZHlDb250ZW50VHlwZSByZXN1bHQgPSBCb2R5Q29udGVudFR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTIwOCw3ICsyMTEsNyBAQAogCSAqLwogCXB1YmxpYyBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlIGNyZWF0ZUpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSByZXN1bHQgPSBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJCXJldHVybiByZXN1bHQ7CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdsaWJQYWNrYWdlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGFnbGliUGFja2FnZUltcGwuamF2YQppbmRleCA1NjQ5ZjJlLi5lZWUwYmE2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UYWdsaWJQYWNrYWdlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RhZ2xpYlBhY2thZ2VJbXBsLmphdmEKQEAgLTE5LDE4ICsxOSw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuQm9keUNvbnRlbnRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5FeHRlbnNpYmxlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuRnVuY3Rpb247CkBAIC00NSwxNiArMzYsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UbGRFeHRlbnNpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGFnbGliLmludGVybmFsLlZhbGlkYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwuaW1wbC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uaW50ZXJuYWwuaW1wbC5Xc2NvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGw7CiAKIAotcHVibGljIGNsYXNzIFRhZ2xpYlBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgVGFnbGliUGFja2FnZSwgRVBhY2thZ2UgeworcHVibGljIGNsYXNzIFRhZ2xpYlBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgVGFnbGliUGFja2FnZSB7CiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTE0NCw3ICsxMjgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisJcHJpdmF0ZSB2b2xhdGlsZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwogCiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCkBAIC0xNTMsNyArMTM3LDEwIEBACiAJCWlmIChpc0luaXRlZCkgcmV0dXJuIChUYWdsaWJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSk7CiAKIAkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlUYWdsaWJQYWNrYWdlSW1wbCB0aGVUYWdsaWJQYWNrYWdlID0gKFRhZ2xpYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgVGFnbGliUGFja2FnZUltcGwoKSk7CisJCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAKKwkJCShUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YKKwkJCQkJVGFnbGliUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcKKwkJCQkJCQlUYWdsaWJQYWNrYWdlSW1wbCgpKTsKIAogCQlpc0luaXRlZCA9IHRydWU7CiAKQEAgLTE2MSw1MCArMTQ4LDIwIEBACiAJCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CiAJCUphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKIAotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlDbGllbnRQYWNrYWdlSW1wbCB0aGVDbGllbnRQYWNrYWdlID0gKENsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDbGllbnRQYWNrYWdlLmVOU19VUkkpIDogQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlXzEgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlDb21tb25QYWNrYWdlSW1wbCB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIDogQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFamJQYWNrYWdlSW1wbCB0aGVFamJQYWNrYWdlID0gKEVqYlBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWpiUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFamJQYWNrYWdlLmVOU19VUkkpIDogRWpiUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZSA9IChXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUpjYVBhY2thZ2VJbXBsIHRoZUpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBKY2FQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEpjYVBhY2thZ2UuZU5TX1VSSSkgOiBKY2FQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlID0gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKLQogCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwogCQl0aGVUYWdsaWJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKIAogCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCiAJCXRoZVRhZ2xpYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDbGllbnRQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwogCiAJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKIAkJdGhlVGFnbGliUGFja2FnZS5mcmVlemUoKTsKIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSwgdGhlVGFnbGliUGFja2FnZSk7CisKKwkJSjJFRUluaXQuaW5pdEVNRk1vZGVscygpOworCiAJCXJldHVybiB0aGVUYWdsaWJQYWNrYWdlOwogCX0KIApAQCAtNzYyLDk0ICs3MTksMTA2IEBACiAJCUphdmFSZWZQYWNrYWdlIHRoZUphdmFSZWZQYWNrYWdlID0gKEphdmFSZWZQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEphdmFSZWZQYWNrYWdlLmVOU19VUkkpOwogCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7CiAKLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl0YWdMaWJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJanNwVGFnRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJanNwVGFnQXR0cmlidXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXZhbGlkYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlqc3BWYXJpYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlmdW5jdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCXRhZ0ZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbkdyb3VwKCkpOwotCQl0bGRFeHRlbnNpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZXh0ZW5zaWJsZVR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHRhZ0xpYkVDbGFzcywgVGFnTGliLmNsYXNzLCAiVGFnTGliIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJfVGFnTGliVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFnTGliVmVyc2lvbiIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliX0pzcFZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImpzcFZlcnNpb24iLCBudWxsLCAwLCAxLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYl9TaG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNob3J0TmFtZSIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliX1VyaSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJpIiwgbnVsbCwgMCwgMSwgVGFnTGliLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYWdMaWJfVGFncygpLCB0aGlzLmdldEpTUFRhZygpLCBudWxsLCAidGFncyIsIG51bGwsIDEsIC0xLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRhZ0xpYl9WYWxpZGF0b3IoKSwgdGhpcy5nZXRWYWxpZGF0b3IoKSwgbnVsbCwgInZhbGlkYXRvciIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VGFnTGliX0xpc3RlbmVycygpLCB0aGVDb21tb25QYWNrYWdlLmdldExpc3RlbmVyKCksIG51bGwsICJsaXN0ZW5lcnMiLCBudWxsLCAwLCAtMSwgVGFnTGliLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYWdMaWJfRnVuY3Rpb25zKCksIHRoaXMuZ2V0RnVuY3Rpb24oKSwgbnVsbCwgImZ1bmN0aW9ucyIsIG51bGwsIDAsIC0xLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRhZ0xpYl9UYWdsaWJFeHRlbnNpb25zKCksIHRoaXMuZ2V0VGxkRXh0ZW5zaW9uKCksIG51bGwsICJ0YWdsaWJFeHRlbnNpb25zIiwgbnVsbCwgMCwgLTEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGpzcFRhZ0VDbGFzcywgSlNQVGFnLmNsYXNzLCAiSlNQVGFnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUYWdfQm9keUNvbnRlbnQoKSwgdGhpcy5nZXRCb2R5Q29udGVudFR5cGUoKSwgImJvZHlDb250ZW50IiwgbnVsbCwgMCwgMSwgSlNQVGFnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ19FeGFtcGxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJleGFtcGxlIiwgbnVsbCwgMCwgMSwgSlNQVGFnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUYWdfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVGFnX0R5bmFtaWNBdHRyaWJ1dGVzKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZHluYW1pY0F0dHJpYnV0ZXMiLCBudWxsLCAwLCAxLCBKU1BUYWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpTUFRhZ19BdHRyaWJ1dGVzKCksIHRoaXMuZ2V0SlNQVGFnQXR0cmlidXRlKCksIG51bGwsICJhdHRyaWJ1dGVzIiwgbnVsbCwgMCwgLTEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQVGFnX1ZhcmlhYmxlcygpLCB0aGlzLmdldEpTUFZhcmlhYmxlKCksIG51bGwsICJ2YXJpYWJsZXMiLCBudWxsLCAwLCAtMSwgSlNQVGFnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BUYWdfVGFnQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJ0YWdDbGFzcyIsIG51bGwsIDEsIDEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQVGFnX1RlaUNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAidGVpQ2xhc3MiLCBudWxsLCAxLCAxLCBKU1BUYWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhqc3BUYWdBdHRyaWJ1dGVFQ2xhc3MsIEpTUFRhZ0F0dHJpYnV0ZS5jbGFzcywgIkpTUFRhZ0F0dHJpYnV0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVGFnQXR0cmlidXRlX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBKU1BUYWdBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ0F0dHJpYnV0ZV9SZXF1aXJlZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlcXVpcmVkIiwgbnVsbCwgMCwgMSwgSlNQVGFnQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ0F0dHJpYnV0ZV9SdEV4cHJWYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJ0RXhwclZhbHVlIiwgImZhbHNlIiwgMCwgMSwgSlNQVGFnQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ0F0dHJpYnV0ZV9GcmFnbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImZyYWdtZW50IiwgbnVsbCwgMCwgMSwgSlNQVGFnQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BUYWdBdHRyaWJ1dGVfVHlwZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInR5cGUiLCBudWxsLCAwLCAxLCBKU1BUYWdBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEpTUFRhZ0F0dHJpYnV0ZV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEpTUFRhZ0F0dHJpYnV0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHZhbGlkYXRvckVDbGFzcywgVmFsaWRhdG9yLmNsYXNzLCAiVmFsaWRhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRWYWxpZGF0b3JfVmFsaWRhdG9yQ2xhc3MoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJ2YWxpZGF0b3JDbGFzcyIsIG51bGwsIDAsIDEsIFZhbGlkYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VmFsaWRhdG9yX0luaXRQYXJhbXMoKSwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmdldEluaXRQYXJhbSgpLCBudWxsLCAiaW5pdFBhcmFtcyIsIG51bGwsIDAsIC0xLCBWYWxpZGF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFZhbGlkYXRvcl9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFZhbGlkYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGpzcFZhcmlhYmxlRUNsYXNzLCBKU1BWYXJpYWJsZS5jbGFzcywgIkpTUFZhcmlhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BWYXJpYWJsZV9OYW1lR2l2ZW4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVHaXZlbiIsIG51bGwsIDAsIDEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BWYXJpYWJsZV9OYW1lRnJvbUF0dHJpYnV0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZUZyb21BdHRyaWJ1dGUiLCBudWxsLCAwLCAxLCBKU1BWYXJpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVmFyaWFibGVfRGVjbGFyZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRlY2xhcmUiLCBudWxsLCAwLCAxLCBKU1BWYXJpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVmFyaWFibGVfU2NvcGUoKSwgdGhpcy5nZXRKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlKCksICJzY29wZSIsIG51bGwsIDAsIDEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BWYXJpYWJsZV9WYXJpYWJsZUNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAidmFyaWFibGVDbGFzcyIsIG51bGwsIDAsIDEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKU1BWYXJpYWJsZV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZnVuY3Rpb25FQ2xhc3MsIEZ1bmN0aW9uLmNsYXNzLCAiRnVuY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZ1bmN0aW9uX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBGdW5jdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RnVuY3Rpb25fU2lnbmF0dXJlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzaWduYXR1cmUiLCBudWxsLCAwLCAxLCBGdW5jdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RnVuY3Rpb25fRXhhbXBsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXhhbXBsZSIsIG51bGwsIDAsIDEsIEZ1bmN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGdW5jdGlvbl9GdW5jdGlvbkNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiZnVuY3Rpb25DbGFzcyIsIG51bGwsIDEsIDEsIEZ1bmN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGdW5jdGlvbl9GdW5jdGlvbkV4dGVuc2lvbnMoKSwgdGhpcy5nZXRUbGRFeHRlbnNpb24oKSwgbnVsbCwgImZ1bmN0aW9uRXh0ZW5zaW9ucyIsIG51bGwsIDAsIC0xLCBGdW5jdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRhZ0ZpbGVFQ2xhc3MsIFRhZ0ZpbGUuY2xhc3MsICJUYWdGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdGaWxlX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBUYWdGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdGaWxlX1BhdGgoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhdGgiLCBudWxsLCAwLCAxLCBUYWdGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdGaWxlX0V4YW1wbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImV4YW1wbGUiLCBudWxsLCAwLCAxLCBUYWdGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRUYWdGaWxlX1RhZ0V4dGVuc2lvbnMoKSwgdGhpcy5nZXRUbGRFeHRlbnNpb24oKSwgbnVsbCwgInRhZ0V4dGVuc2lvbnMiLCBudWxsLCAwLCAtMSwgVGFnRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRsZEV4dGVuc2lvbkVDbGFzcywgVGxkRXh0ZW5zaW9uLmNsYXNzLCAiVGxkRXh0ZW5zaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUbGRFeHRlbnNpb25fTmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2UiLCBudWxsLCAwLCAxLCBUbGRFeHRlbnNpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRsZEV4dGVuc2lvbl9FeHRlbnNpb25FbGVtZW50cygpLCB0aGlzLmdldEV4dGVuc2libGVUeXBlKCksIG51bGwsICJleHRlbnNpb25FbGVtZW50cyIsIG51bGwsIDEsIC0xLCBUbGRFeHRlbnNpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhleHRlbnNpYmxlVHlwZUVDbGFzcywgRXh0ZW5zaWJsZVR5cGUuY2xhc3MsICJFeHRlbnNpYmxlVHlwZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFeHRlbnNpYmxlVHlwZV9WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBFeHRlbnNpYmxlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oYm9keUNvbnRlbnRUeXBlRUVudW0sIEJvZHlDb250ZW50VHlwZS5jbGFzcywgIkJvZHlDb250ZW50VHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoYm9keUNvbnRlbnRUeXBlRUVudW0sIEJvZHlDb250ZW50VHlwZS5UQUdERVBFTkRFTlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChib2R5Q29udGVudFR5cGVFRW51bSwgQm9keUNvbnRlbnRUeXBlLkpTUF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGJvZHlDb250ZW50VHlwZUVFbnVtLCBCb2R5Q29udGVudFR5cGUuRU1QVFlfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChib2R5Q29udGVudFR5cGVFRW51bSwgQm9keUNvbnRlbnRUeXBlLlNDUklQVExFU1NfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGpzcFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVFRW51bSwgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZS5jbGFzcywgIkpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGpzcFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGVFRW51bSwgSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZS5ORVNURURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqc3BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlRUVudW0sIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuQVRfQkVHSU5fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChqc3BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlRUVudW0sIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuQVRfRU5EX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwkJYm9vbGVhbiBoYXNMb2NrID0gZmFsc2U7CisJCXRyeSB7CisJCQloYXNMb2NrID0gSjJFRUluaXQuYXF1aXJlSW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50c0xvY2soKTsKKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJSjJFRUNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCX0JCQorCQkKKwkJdHJ5eworCQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQkJdGFnTGliRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7CisJCQlqc3BUYWdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbkdyb3VwKCkpOworCQkJanNwVGFnQXR0cmlidXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQl2YWxpZGF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCWpzcFZhcmlhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQlmdW5jdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uR3JvdXAoKSk7CisJCQl0YWdGaWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKKwkJCXRsZEV4dGVuc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJZXh0ZW5zaWJsZVR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkKKwkJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCQlpbml0RUNsYXNzKHRhZ0xpYkVDbGFzcywgVGFnTGliLmNsYXNzLCAiVGFnTGliIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJfVGFnTGliVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFnTGliVmVyc2lvbiIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliX0pzcFZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImpzcFZlcnNpb24iLCBudWxsLCAwLCAxLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYl9TaG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNob3J0TmFtZSIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFnTGliX1VyaSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJpIiwgbnVsbCwgMCwgMSwgVGFnTGliLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRUYWdMaWJfVGFncygpLCB0aGlzLmdldEpTUFRhZygpLCBudWxsLCAidGFncyIsIG51bGwsIDEsIC0xLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFRhZ0xpYl9WYWxpZGF0b3IoKSwgdGhpcy5nZXRWYWxpZGF0b3IoKSwgbnVsbCwgInZhbGlkYXRvciIsIG51bGwsIDAsIDEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0VGFnTGliX0xpc3RlbmVycygpLCB0aGVDb21tb25QYWNrYWdlLmdldExpc3RlbmVyKCksIG51bGwsICJsaXN0ZW5lcnMiLCBudWxsLCAwLCAtMSwgVGFnTGliLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRUYWdMaWJfRnVuY3Rpb25zKCksIHRoaXMuZ2V0RnVuY3Rpb24oKSwgbnVsbCwgImZ1bmN0aW9ucyIsIG51bGwsIDAsIC0xLCBUYWdMaWIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFRhZ0xpYl9UYWdsaWJFeHRlbnNpb25zKCksIHRoaXMuZ2V0VGxkRXh0ZW5zaW9uKCksIG51bGwsICJ0YWdsaWJFeHRlbnNpb25zIiwgbnVsbCwgMCwgLTEsIFRhZ0xpYi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhqc3BUYWdFQ2xhc3MsIEpTUFRhZy5jbGFzcywgIkpTUFRhZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVGFnX0JvZHlDb250ZW50KCksIHRoaXMuZ2V0Qm9keUNvbnRlbnRUeXBlKCksICJib2R5Q29udGVudCIsIG51bGwsIDAsIDEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUYWdfRXhhbXBsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXhhbXBsZSIsIG51bGwsIDAsIDEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVGFnX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBKU1BUYWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEpTUFRhZ19EeW5hbWljQXR0cmlidXRlcygpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImR5bmFtaWNBdHRyaWJ1dGVzIiwgbnVsbCwgMCwgMSwgSlNQVGFnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRKU1BUYWdfQXR0cmlidXRlcygpLCB0aGlzLmdldEpTUFRhZ0F0dHJpYnV0ZSgpLCBudWxsLCAiYXR0cmlidXRlcyIsIG51bGwsIDAsIC0xLCBKU1BUYWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEpTUFRhZ19WYXJpYWJsZXMoKSwgdGhpcy5nZXRKU1BWYXJpYWJsZSgpLCBudWxsLCAidmFyaWFibGVzIiwgbnVsbCwgMCwgLTEsIEpTUFRhZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQVGFnX1RhZ0NsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAidGFnQ2xhc3MiLCBudWxsLCAxLCAxLCBKU1BUYWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEpTUFRhZ19UZWlDbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInRlaUNsYXNzIiwgbnVsbCwgMSwgMSwgSlNQVGFnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGpzcFRhZ0F0dHJpYnV0ZUVDbGFzcywgSlNQVGFnQXR0cmlidXRlLmNsYXNzLCAiSlNQVGFnQXR0cmlidXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUYWdBdHRyaWJ1dGVfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIEpTUFRhZ0F0dHJpYnV0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVGFnQXR0cmlidXRlX1JlcXVpcmVkKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVxdWlyZWQiLCBudWxsLCAwLCAxLCBKU1BUYWdBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVGFnQXR0cmlidXRlX1J0RXhwclZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicnRFeHByVmFsdWUiLCAiZmFsc2UiLCAwLCAxLCBKU1BUYWdBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUYWdBdHRyaWJ1dGVfRnJhZ21lbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJmcmFnbWVudCIsIG51bGwsIDAsIDEsIEpTUFRhZ0F0dHJpYnV0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0SlNQVGFnQXR0cmlidXRlX1R5cGUoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJ0eXBlIiwgbnVsbCwgMCwgMSwgSlNQVGFnQXR0cmlidXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRKU1BUYWdBdHRyaWJ1dGVfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBKU1BUYWdBdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3ModmFsaWRhdG9yRUNsYXNzLCBWYWxpZGF0b3IuY2xhc3MsICJWYWxpZGF0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFZhbGlkYXRvcl9WYWxpZGF0b3JDbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInZhbGlkYXRvckNsYXNzIiwgbnVsbCwgMCwgMSwgVmFsaWRhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRWYWxpZGF0b3JfSW5pdFBhcmFtcygpLCB0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuZ2V0SW5pdFBhcmFtKCksIG51bGwsICJpbml0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIFZhbGlkYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0VmFsaWRhdG9yX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgVmFsaWRhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGpzcFZhcmlhYmxlRUNsYXNzLCBKU1BWYXJpYWJsZS5jbGFzcywgIkpTUFZhcmlhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BWYXJpYWJsZV9OYW1lR2l2ZW4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVHaXZlbiIsIG51bGwsIDAsIDEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BWYXJpYWJsZV9OYW1lRnJvbUF0dHJpYnV0ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZUZyb21BdHRyaWJ1dGUiLCBudWxsLCAwLCAxLCBKU1BWYXJpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVmFyaWFibGVfRGVjbGFyZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRlY2xhcmUiLCBudWxsLCAwLCAxLCBKU1BWYXJpYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SlNQVmFyaWFibGVfU2NvcGUoKSwgdGhpcy5nZXRKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlKCksICJzY29wZSIsIG51bGwsIDAsIDEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRKU1BWYXJpYWJsZV9WYXJpYWJsZUNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAidmFyaWFibGVDbGFzcyIsIG51bGwsIDAsIDEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRKU1BWYXJpYWJsZV9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIEpTUFZhcmlhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGZ1bmN0aW9uRUNsYXNzLCBGdW5jdGlvbi5jbGFzcywgIkZ1bmN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRGdW5jdGlvbl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRnVuY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEZ1bmN0aW9uX1NpZ25hdHVyZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2lnbmF0dXJlIiwgbnVsbCwgMCwgMSwgRnVuY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEZ1bmN0aW9uX0V4YW1wbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImV4YW1wbGUiLCBudWxsLCAwLCAxLCBGdW5jdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RnVuY3Rpb25fRnVuY3Rpb25DbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImZ1bmN0aW9uQ2xhc3MiLCBudWxsLCAxLCAxLCBGdW5jdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RnVuY3Rpb25fRnVuY3Rpb25FeHRlbnNpb25zKCksIHRoaXMuZ2V0VGxkRXh0ZW5zaW9uKCksIG51bGwsICJmdW5jdGlvbkV4dGVuc2lvbnMiLCBudWxsLCAwLCAtMSwgRnVuY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3ModGFnRmlsZUVDbGFzcywgVGFnRmlsZS5jbGFzcywgIlRhZ0ZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFRhZ0ZpbGVfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFRhZ0ZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFRhZ0ZpbGVfUGF0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGF0aCIsIG51bGwsIDAsIDEsIFRhZ0ZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFRhZ0ZpbGVfRXhhbXBsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXhhbXBsZSIsIG51bGwsIDAsIDEsIFRhZ0ZpbGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFRhZ0ZpbGVfVGFnRXh0ZW5zaW9ucygpLCB0aGlzLmdldFRsZEV4dGVuc2lvbigpLCBudWxsLCAidGFnRXh0ZW5zaW9ucyIsIG51bGwsIDAsIC0xLCBUYWdGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHRsZEV4dGVuc2lvbkVDbGFzcywgVGxkRXh0ZW5zaW9uLmNsYXNzLCAiVGxkRXh0ZW5zaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRUbGRFeHRlbnNpb25fTmFtZXNwYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lc3BhY2UiLCBudWxsLCAwLCAxLCBUbGRFeHRlbnNpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFRsZEV4dGVuc2lvbl9FeHRlbnNpb25FbGVtZW50cygpLCB0aGlzLmdldEV4dGVuc2libGVUeXBlKCksIG51bGwsICJleHRlbnNpb25FbGVtZW50cyIsIG51bGwsIDEsIC0xLCBUbGRFeHRlbnNpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoZXh0ZW5zaWJsZVR5cGVFQ2xhc3MsIEV4dGVuc2libGVUeXBlLmNsYXNzLCAiRXh0ZW5zaWJsZVR5cGUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXh0ZW5zaWJsZVR5cGVfVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMCwgMSwgRXh0ZW5zaWJsZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCisJCQlpbml0RUVudW0oYm9keUNvbnRlbnRUeXBlRUVudW0sIEJvZHlDb250ZW50VHlwZS5jbGFzcywgIkJvZHlDb250ZW50VHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwoYm9keUNvbnRlbnRUeXBlRUVudW0sIEJvZHlDb250ZW50VHlwZS5UQUdERVBFTkRFTlRfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoYm9keUNvbnRlbnRUeXBlRUVudW0sIEJvZHlDb250ZW50VHlwZS5KU1BfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoYm9keUNvbnRlbnRUeXBlRUVudW0sIEJvZHlDb250ZW50VHlwZS5FTVBUWV9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChib2R5Q29udGVudFR5cGVFRW51bSwgQm9keUNvbnRlbnRUeXBlLlNDUklQVExFU1NfTElURVJBTCk7CisJCisJCQlpbml0RUVudW0oanNwU2NyaXB0aW5nVmFyaWFibGVTY29wZUVFbnVtLCBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLmNsYXNzLCAiSlNQU2NyaXB0aW5nVmFyaWFibGVTY29wZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwoanNwU2NyaXB0aW5nVmFyaWFibGVTY29wZUVFbnVtLCBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLk5FU1RFRF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChqc3BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlRUVudW0sIEpTUFNjcmlwdGluZ1ZhcmlhYmxlU2NvcGUuQVRfQkVHSU5fTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoanNwU2NyaXB0aW5nVmFyaWFibGVTY29wZUVFbnVtLCBKU1BTY3JpcHRpbmdWYXJpYWJsZVNjb3BlLkFUX0VORF9MSVRFUkFMKTsKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiB9IC8vVGFnbGliUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RsZEV4dGVuc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1RsZEV4dGVuc2lvbkltcGwuamF2YQppbmRleCAxYWUxZDllLi5jZWFlYmE0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9UbGRFeHRlbnNpb25JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVGxkRXh0ZW5zaW9uSW1wbC5qYXZhCkBAIC04NSw2ICs4NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gVGFnbGliUGFja2FnZS5MaXRlcmFscy5UTERfRVhURU5TSU9OOwogCX0KQEAgLTEyNyw2ICsxMjgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVExEX0VYVEVOU0lPTl9fRVhURU5TSU9OX0VMRU1FTlRTOgpAQCAtMTQwLDYgKzE0Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19OQU1FU1BBQ0U6CkBAIC0xNTUsNiArMTU4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19OQU1FU1BBQ0U6CkBAIC0xNzMsNiArMTc3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19OQU1FU1BBQ0U6CkBAIC0xOTAsNiArMTk1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5UTERfRVhURU5TSU9OX19OQU1FU1BBQ0U6CkBAIC0yMDUsMTEgKzIxMSwxMiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZXNwYWNlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChuYW1lc3BhY2U6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobmFtZXNwYWNlKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9WYWxpZGF0b3JJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvaW1wbC9WYWxpZGF0b3JJbXBsLmphdmEKaW5kZXggNTJhNDZhMS4uODgwNTQ2ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL2ltcGwvVmFsaWRhdG9ySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC9pbXBsL1ZhbGlkYXRvckltcGwuamF2YQpAQCAtNDksNiArNDksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFRhZ2xpYlBhY2thZ2UuTGl0ZXJhbHMuVkFMSURBVE9SOwogCX0KQEAgLTEyMCw2ICsxMjEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19JTklUX1BBUkFNUzoKQEAgLTEzNSw2ICsxMzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19WQUxJREFUT1JfQ0xBU1M6CkBAIC0xNTMsNiArMTU2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgVGFnbGliUGFja2FnZS5WQUxJREFUT1JfX1ZBTElEQVRPUl9DTEFTUzoKQEAgLTE3NSw2ICsxNzksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBUYWdsaWJQYWNrYWdlLlZBTElEQVRPUl9fVkFMSURBVE9SX0NMQVNTOgpAQCAtMTk1LDYgKzIwMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFRhZ2xpYlBhY2thZ2UuVkFMSURBVE9SX19WQUxJREFUT1JfQ0xBU1M6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvdXRpbC9UYWdsaWJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGFnbGliL2ludGVybmFsL3V0aWwvVGFnbGliQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCA5YTQ0MDYwLi45Yzc0NzkyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS90YWdsaWIvaW50ZXJuYWwvdXRpbC9UYWdsaWJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3RhZ2xpYi9pbnRlcm5hbC91dGlsL1RhZ2xpYkFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTM5LDYgKzM5LDcgQEAKIAkJCW1vZGVsUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSk7CiAJCX0KIAl9CisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewogCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKIAkJCXJldHVybiB0cnVlOwpAQCAtNTAsMjMgKzUxLDI5IEBACiAJfQogCiAJcHJvdGVjdGVkIFRhZ2xpYlN3aXRjaCBzdyA9IG5ldyBUYWdsaWJTd2l0Y2goKSB7CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWIoVGFnTGliIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZVRhZ0xpYkFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlVmFsaWRhdG9yKFZhbGlkYXRvciBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVWYWxpZGF0b3JBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUpTUFRhZyhKU1BUYWcgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlSlNQVGFnQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWdBdHRyaWJ1dGUoSlNQVGFnQXR0cmlidXRlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUpTUFRhZ0F0dHJpYnV0ZUFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlSlNQVmFyaWFibGUoSlNQVmFyaWFibGUgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlSlNQVmFyaWFibGVBZGFwdGVyKCk7CiAJCX0KIAl9OwogCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKIAkJcmV0dXJuIChBZGFwdGVyKXN3LmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CiAJfQpAQCAtMTE2LDQyICsxMjMsNTUgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgVGFnbGliU3dpdGNoIG1vZGVsU3dpdGNoID0KIAkJbmV3IFRhZ2xpYlN3aXRjaCgpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlVGFnTGliKFRhZ0xpYiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlVGFnTGliQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUYWcoSlNQVGFnIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVKU1BUYWdBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUpTUFRhZ0F0dHJpYnV0ZShKU1BUYWdBdHRyaWJ1dGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUpTUFRhZ0F0dHJpYnV0ZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlVmFsaWRhdG9yKFZhbGlkYXRvciBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BWYXJpYWJsZShKU1BWYXJpYWJsZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSlNQVmFyaWFibGVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUZ1bmN0aW9uKEZ1bmN0aW9uIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVGdW5jdGlvbkFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlVGFnRmlsZShUYWdGaWxlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVUYWdGaWxlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VUbGRFeHRlbnNpb24oVGxkRXh0ZW5zaW9uIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVUbGRFeHRlbnNpb25BZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUV4dGVuc2libGVUeXBlKEV4dGVuc2libGVUeXBlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFeHRlbnNpYmxlVHlwZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwogCQkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vQXV0aE1ldGhvZEtpbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0F1dGhNZXRob2RLaW5kLmphdmEKaW5kZXggNDIxYWI4ZC4uN2I1MjVlOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vQXV0aE1ldGhvZEtpbmQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9BdXRoTWV0aG9kS2luZC5qYXZhCkBAIC01OSw3ICs1OSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBdXRoTWV0aG9kS2luZCBVTlNQRUNJRklFRF9MSVRFUkFMID0gbmV3IEF1dGhNZXRob2RLaW5kKFVOU1BFQ0lGSUVELCAiVU5TUEVDSUZJRUQiLCAiVU5TUEVDSUZJRUQiKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBBdXRoTWV0aG9kS2luZCBVTlNQRUNJRklFRF9MSVRFUkFMID0gbmV3IEF1dGhNZXRob2RLaW5kKFVOU1BFQ0lGSUVELCAiVU5TUEVDSUZJRUQiLCAiVU5TUEVDSUZJRUQiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPkJBU0lDPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTczLDcgKzczLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEF1dGhNZXRob2RLaW5kIEJBU0lDX0xJVEVSQUwgPSBuZXcgQXV0aE1ldGhvZEtpbmQoQkFTSUMsICJCQVNJQyIsICJCQVNJQyIpOy8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIEF1dGhNZXRob2RLaW5kIEJBU0lDX0xJVEVSQUwgPSBuZXcgQXV0aE1ldGhvZEtpbmQoQkFTSUMsICJCQVNJQyIsICJCQVNJQyIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+RElHRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTg3LDcgKzg3LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEF1dGhNZXRob2RLaW5kIERJR0VTVF9MSVRFUkFMID0gbmV3IEF1dGhNZXRob2RLaW5kKERJR0VTVCwgIkRJR0VTVCIsICJESUdFU1QiKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBBdXRoTWV0aG9kS2luZCBESUdFU1RfTElURVJBTCA9IG5ldyBBdXRoTWV0aG9kS2luZChESUdFU1QsICJESUdFU1QiLCAiRElHRVNUIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5GT1JNPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTEwMSw3ICsxMDEsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQXV0aE1ldGhvZEtpbmQgRk9STV9MSVRFUkFMID0gbmV3IEF1dGhNZXRob2RLaW5kKEZPUk0sICJGT1JNIiwgIkZPUk0iKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBBdXRoTWV0aG9kS2luZCBGT1JNX0xJVEVSQUwgPSBuZXcgQXV0aE1ldGhvZEtpbmQoRk9STSwgIkZPUk0iLCAiRk9STSIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+Q0xJRU5UIENFUlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtMTE1LDcgKzExNSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBdXRoTWV0aG9kS2luZCBDTElFTlRfQ0VSVF9MSVRFUkFMID0gbmV3IEF1dGhNZXRob2RLaW5kKENMSUVOVF9DRVJULCAiQ0xJRU5UX0NFUlQiLCAiQ0xJRU5UX0NFUlQiKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBBdXRoTWV0aG9kS2luZCBDTElFTlRfQ0VSVF9MSVRFUkFMID0gbmV3IEF1dGhNZXRob2RLaW5kKENMSUVOVF9DRVJULCAiQ0xJRU5UX0NFUlQiLCAiQ0xJRU5UX0NFUlQiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5BdXRoIE1ldGhvZCBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Rpc3BhdGNoZXJUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9EaXNwYXRjaGVyVHlwZS5qYXZhCmluZGV4IDI5ZDA2YTAuLjljMDg3NWYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL0Rpc3BhdGNoZXJUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vRGlzcGF0Y2hlclR5cGUuamF2YQpAQCAtODMsNyArODMsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzcGF0Y2hlclR5cGUgRk9SV0FSRF9MSVRFUkFMID0gbmV3IERpc3BhdGNoZXJUeXBlKEZPUldBUkQsICJGT1JXQVJEIiwgIkZPUldBUkQiKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBGT1JXQVJEX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoRk9SV0FSRCwgIkZPUldBUkQiLCAiRk9SV0FSRCIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+SU5DTFVERTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC05Nyw3ICs5Nyw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBJTkNMVURFX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoSU5DTFVERSwgIklOQ0xVREUiLCAiSU5DTFVERSIpOy8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIERpc3BhdGNoZXJUeXBlIElOQ0xVREVfTElURVJBTCA9IG5ldyBEaXNwYXRjaGVyVHlwZShJTkNMVURFLCAiSU5DTFVERSIsICJJTkNMVURFIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5SRVFVRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTExMSw3ICsxMTEsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzcGF0Y2hlclR5cGUgUkVRVUVTVF9MSVRFUkFMID0gbmV3IERpc3BhdGNoZXJUeXBlKFJFUVVFU1QsICJSRVFVRVNUIiwgIlJFUVVFU1QiKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBSRVFVRVNUX0xJVEVSQUwgPSBuZXcgRGlzcGF0Y2hlclR5cGUoUkVRVUVTVCwgIlJFUVVFU1QiLCAiUkVRVUVTVCIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+RVJST1I8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtMTI1LDcgKzEyNSw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBFUlJPUl9MSVRFUkFMID0gbmV3IERpc3BhdGNoZXJUeXBlKEVSUk9SLCAiRVJST1IiLCAiRVJST1IiKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBEaXNwYXRjaGVyVHlwZSBFUlJPUl9MSVRFUkFMID0gbmV3IERpc3BhdGNoZXJUeXBlKEVSUk9SLCAiRVJST1IiLCAiRVJST1IiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5EaXNwYXRjaGVyIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vSFRUUE1ldGhvZFR5cGVFbnVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9IVFRQTWV0aG9kVHlwZUVudW0uamF2YQppbmRleCA3OTQ1NzcyLi4yZDExNjFlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9IVFRQTWV0aG9kVHlwZUVudW0uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9IVFRQTWV0aG9kVHlwZUVudW0uamF2YQpAQCAtMTYwLDcgKzE2MCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gR0VUX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKEdFVCwgIkdFVCIsICJHRVQiKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gR0VUX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKEdFVCwgIkdFVCIsICJHRVQiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPlBPU1Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtMTc0LDcgKzE3NCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gUE9TVF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShQT1NULCAiUE9TVCIsICJQT1NUIik7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFBPU1RfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oUE9TVCwgIlBPU1QiLCAiUE9TVCIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+UFVUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTE4OCw3ICsxODgsNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFBVVF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShQVVQsICJQVVQiLCAiUFVUIik7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFBVVF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShQVVQsICJQVVQiLCAiUFVUIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5ERUxFVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtMjAyLDcgKzIwMiw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gREVMRVRFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKERFTEVURSwgIkRFTEVURSIsICJERUxFVEUiKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gREVMRVRFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKERFTEVURSwgIkRFTEVURSIsICJERUxFVEUiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIFRoZSAnPGVtPjxiPkhFQUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgpAQCAtMjE2LDcgKzIxNiw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gSEVBRF9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShIRUFELCAiSEVBRCIsICJIRUFEIik7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIEhFQURfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oSEVBRCwgIkhFQUQiLCAiSEVBRCIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+T1BUSU9OUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC0yMzAsNyArMjMwLDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBPUFRJT05TX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKE9QVElPTlMsICJPUFRJT05TIiwgIk9QVElPTlMiKTsvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBIVFRQTWV0aG9kVHlwZUVudW0gT1BUSU9OU19MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShPUFRJT05TLCAiT1BUSU9OUyIsICJPUFRJT05TIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5UUkFDRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBUUkFDRV9MSVRFUkFMID0gbmV3IEhUVFBNZXRob2RUeXBlRW51bShUUkFDRSwgIlRSQUNFIiwgIlRSQUNFIik7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRUUE1ldGhvZFR5cGVFbnVtIFRSQUNFX0xJVEVSQUwgPSBuZXcgSFRUUE1ldGhvZFR5cGVFbnVtKFRSQUNFLCAiVFJBQ0UiLCAiVFJBQ0UiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8vV0VCREFWIHN1cHBvcnQKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEhUVFBNZXRob2RUeXBlRW51bSBBQ0tfTElURVJBTCA9IG5ldyBIVFRQTWV0aG9kVHlwZUVudW0oQUNLLCAiQUNLIiwgIkFDSyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1Jlc0F1dGhTZXJ2bGV0VHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vUmVzQXV0aFNlcnZsZXRUeXBlLmphdmEKaW5kZXggZDE0MDliYi4uM2MyMDM1ZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vUmVzQXV0aFNlcnZsZXRUeXBlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vUmVzQXV0aFNlcnZsZXRUeXBlLmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc0F1dGhTZXJ2bGV0VHlwZSBDT05UQUlORVJfTElURVJBTCA9IG5ldyBSZXNBdXRoU2VydmxldFR5cGUoQ09OVEFJTkVSLCAiQ09OVEFJTkVSIiwgIkNPTlRBSU5FUiIpOy8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJlc0F1dGhTZXJ2bGV0VHlwZSBDT05UQUlORVJfTElURVJBTCA9IG5ldyBSZXNBdXRoU2VydmxldFR5cGUoQ09OVEFJTkVSLCAiQ09OVEFJTkVSIiwgIkNPTlRBSU5FUiIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+U0VSVkxFVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC01OCw3ICs1OCw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXNBdXRoU2VydmxldFR5cGUgU0VSVkxFVF9MSVRFUkFMID0gbmV3IFJlc0F1dGhTZXJ2bGV0VHlwZShTRVJWTEVULCAiU0VSVkxFVCIsICJTRVJWTEVUIik7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgUmVzQXV0aFNlcnZsZXRUeXBlIFNFUlZMRVRfTElURVJBTCA9IG5ldyBSZXNBdXRoU2VydmxldFR5cGUoU0VSVkxFVCwgIlNFUlZMRVQiLCAiU0VSVkxFVCIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlJlcyBBdXRoIFNlcnZsZXQgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9UcmFuc3BvcnRHdWFyYW50ZWVUeXBlLmphdmEKaW5kZXggNzU5ZmY2Ni4uZjQ1Y2RiZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vVHJhbnNwb3J0R3VhcmFudGVlVHlwZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL1RyYW5zcG9ydEd1YXJhbnRlZVR5cGUuamF2YQpAQCAtNDksNyArNDksNyBAQAogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBOT05FX0xJVEVSQUwgPSBuZXcgVHJhbnNwb3J0R3VhcmFudGVlVHlwZShOT05FLCAiTk9ORSIsICJOT05FIik7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBOT05FX0xJVEVSQUwgPSBuZXcgVHJhbnNwb3J0R3VhcmFudGVlVHlwZShOT05FLCAiTk9ORSIsICJOT05FIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAkvKioKIAkgKiBUaGUgJzxlbT48Yj5JTlRFR1JBTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCkBAIC02Myw3ICs2Myw3IEBACiAJICogQGdlbmVyYXRlZAogCSAqIEBvcmRlcmVkCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIElOVEVHUkFMX0xJVEVSQUwgPSBuZXcgVHJhbnNwb3J0R3VhcmFudGVlVHlwZShJTlRFR1JBTCwgIklOVEVHUkFMIiwgIklOVEVHUkFMIik7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBJTlRFR1JBTF9MSVRFUkFMID0gbmV3IFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoSU5URUdSQUwsICJJTlRFR1JBTCIsICJJTlRFR1JBTCIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCiAJLyoqCiAJICogVGhlICc8ZW0+PGI+Q09ORklERU5USUFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KQEAgLTc3LDcgKzc3LDcgQEAKIAkgKiBAZ2VuZXJhdGVkCiAJICogQG9yZGVyZWQKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUgQ09ORklERU5USUFMX0xJVEVSQUwgPSBuZXcgVHJhbnNwb3J0R3VhcmFudGVlVHlwZShDT05GSURFTlRJQUwsICJDT05GSURFTlRJQUwiLCAiQ09ORklERU5USUFMIik7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNwb3J0R3VhcmFudGVlVHlwZSBDT05GSURFTlRJQUxfTElURVJBTCA9IG5ldyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlKENPTkZJREVOVElBTCwgIkNPTkZJREVOVElBTCIsICJDT05GSURFTlRJQUwiKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAogCS8qKgogCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UcmFuc3BvcnQgR3VhcmFudGVlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BdXRoQ29uc3RyYWludEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvQXV0aENvbnN0cmFpbnRJbXBsLmphdmEKaW5kZXggZDJlYjJjNy4uNDc2ZjdjMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9BdXRoQ29uc3RyYWludEltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0F1dGhDb25zdHJhaW50SW1wbC5qYXZhCkBAIC03NCw2ICs3NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkFVVEhfQ09OU1RSQUlOVDsKIAl9CkBAIC0xMzMsNyArMTM0LDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRTZWNDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBuZXdTZWNDb25zdHJhaW50KSB7CiAJCWlmIChuZXdTZWNDb25zdHJhaW50ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UICYmIG5ld1NlY0NvbnN0cmFpbnQgIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdTZWNDb25zdHJhaW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTE2Myw2ICsxNjQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgpAQCAtMTc4LDYgKzE4MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6CkBAIC0xOTMsNiArMTk2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5BVVRIX0NPTlNUUkFJTlRfX1NFQ19DT05TVFJBSU5UOgpAQCAtMjA2LDYgKzIxMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT046CkBAIC0yMjUsNiArMjMwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT046CkBAIC0yNTAsNiArMjU2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT046CkBAIC0yNzMsNiArMjgwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT046CkBAIC0yOTAsMTMgKzI5OCwxNCBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJvbGVzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByb2xlczogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChyb2xlcyk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Db250ZXh0UGFyYW1JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0NvbnRleHRQYXJhbUltcGwuamF2YQppbmRleCA0ZWQ3MjU4Li4yMTE4N2MwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0NvbnRleHRQYXJhbUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0NvbnRleHRQYXJhbUltcGwuamF2YQpAQCAtODAsNiArODAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5DT05URVhUX1BBUkFNOwogCX0KQEAgLTE2MSw3ICsxNjIsNyBAQAogCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7CiAJCWlmIChuZXdXZWJBcHAgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFAgJiYgbmV3V2ViQXBwICE9IG51bGwpKSB7CiAJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3V2ViQXBwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTE3OSw2ICsxODAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQOgpAQCAtMTk0LDYgKzE5Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1dFQl9BUFA6CkBAIC0yMDcsNiArMjEwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5DT05URVhUX1BBUkFNX19XRUJfQVBQOgpAQCAtMjIwLDYgKzIyNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUU6CkBAIC0yMzksNiArMjQ0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUU6CkBAIC0yNjIsNiArMjY4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUU6CkBAIC0yODUsNiArMjkyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUU6CkBAIC0zMDIsMTUgKzMxMCwxNiBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwYXJhbU5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHBhcmFtTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChwYXJhbU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcmFtVmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBhcmFtVmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQocGFyYW1WYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0Vycm9yQ29kZUVycm9yUGFnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXJyb3JDb2RlRXJyb3JQYWdlSW1wbC5qYXZhCmluZGV4IDQxZGVkMzcuLmMzYjJjYjYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXJyb3JDb2RlRXJyb3JQYWdlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXJyb3JDb2RlRXJyb3JQYWdlSW1wbC5qYXZhCkBAIC00Nyw2ICs0Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkVSUk9SX0NPREVfRVJST1JfUEFHRTsKIAl9CkBAIC01NCw2ICs1NSw3IEBACiAvKioKICAqIGlzRXJyb3JDb2RlIG1ldGhvZCBjb21tZW50LgogICovCitAT3ZlcnJpZGUKIHB1YmxpYyBib29sZWFuIGlzRXJyb3JDb2RlKCkgewogCXJldHVybiB0cnVlOwogfQpAQCAtODEsNiArODMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0VSUk9SX0NPREU6CkBAIC05NCw2ICs5Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9DT0RFX0VSUk9SX1BBR0VfX0VSUk9SX0NPREU6CkBAIC0xMDgsNiArMTEyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX0NPREVfRVJST1JfUEFHRV9fRVJST1JfQ09ERToKQEAgLTEyMiw2ICsxMjcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19FUlJPUl9DT0RFOgpAQCAtMTMzLDExICsxMzksMTIgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZXJyb3JDb2RlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChlcnJvckNvZGU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZXJyb3JDb2RlKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0Vycm9yUGFnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXJyb3JQYWdlSW1wbC5qYXZhCmluZGV4IDgzODVkZDEuLmI1ZDA1NjIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXJyb3JQYWdlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXJyb3JQYWdlSW1wbC5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkVSUk9SX1BBR0U7CiAJfQpAQCAtMTExLDcgKzExMiw3IEBACiAJcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKIAkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCiAJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKIAkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQogCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwpAQCAtMTI5LDYgKzEzMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFA6CkBAIC0xNDQsNiArMTQ2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fV0VCX0FQUDoKQEAgLTE1Nyw2ICsxNjAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX1dFQl9BUFA6CkBAIC0xNzAsNiArMTc0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fTE9DQVRJT046CkBAIC0xODUsNiArMTkwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVSUk9SX1BBR0VfX0xPQ0FUSU9OOgpAQCAtMjAyLDYgKzIwOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTjoKQEAgLTIxOSw2ICsyMjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfUEFHRV9fTE9DQVRJT046CkBAIC0yMzIsMTEgKzI0MCwxMiBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsb2NhdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAobG9jYXRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobG9jYXRpb24pOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXhjZXB0aW9uVHlwZUVycm9yUGFnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRXhjZXB0aW9uVHlwZUVycm9yUGFnZUltcGwuamF2YQppbmRleCAyZGNlMjNiLi5mYzE0OTQwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9FeGNlcHRpb25UeXBlRXJyb3JQYWdlSW1wbC5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0U7CiAJfQpAQCAtNTYsNiArNTcsNyBAQAogICogSGVscGVyIG1ldGhvZCB0byBzZXQgdGhlIEV4Y2VwdGlvblR5cGUgdG8gYSBKYXZhQ2xhc3MgaGF2aW5nIGEgZnVsbHkgcXVhbGlmaWVkCiAgKiBuYW1lIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVyCiAgKi8gCitAT3ZlcnJpZGUKIHB1YmxpYyBib29sZWFuIGlzRXhjZXB0aW9uVHlwZSgpIHsKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTEwOCw2ICsxMTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19FWENFUFRJT05fVFlQRToKQEAgLTEyMiw2ICsxMjUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVhDRVBUSU9OX1RZUEVfRVJST1JfUEFHRV9fRVhDRVBUSU9OX1RZUEU6CkBAIC0xMzYsNiArMTQwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkVYQ0VQVElPTl9UWVBFX0VSUk9SX1BBR0VfX0VYQ0VQVElPTl9UWVBFOgpAQCAtMTUwLDYgKzE1NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FWENFUFRJT05fVFlQRV9FUlJPUl9QQUdFX19FWENFUFRJT05fVFlQRToKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRmlsdGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9GaWx0ZXJJbXBsLmphdmEKaW5kZXggZGU4ZWE5ZC4uZmU0NDcyYSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9GaWx0ZXJJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9GaWx0ZXJJbXBsLmphdmEKQEAgLTc3LDYgKzc3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRklMVEVSOwogCX0KQEAgLTE2NSw2ICsxNjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX0lOSVRfUEFSQU1TOgpAQCAtMTgwLDYgKzE4Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fTkFNRToKQEAgLTIwMCw2ICsyMDMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19OQU1FOgpAQCAtMjI1LDYgKzIyOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfX05BTUU6CkBAIC0yNDgsNiArMjUzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9fTkFNRToKQEAgLTI2NSwxMSArMjcxLDEyIEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9GaWx0ZXJNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9GaWx0ZXJNYXBwaW5nSW1wbC5qYXZhCmluZGV4IDI1NjdhODUuLjNhM2UzYTUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRmlsdGVyTWFwcGluZ0ltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0ZpbHRlck1hcHBpbmdJbXBsLmphdmEKQEAgLTgwLDYgKzgwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRklMVEVSX01BUFBJTkc7CiAJfQpAQCAtMjA0LDYgKzIwNSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTjoKQEAgLTIyNSw2ICsyMjcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX01BUFBJTkdfX1VSTF9QQVRURVJOOgpAQCAtMjQ5LDYgKzI1Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GSUxURVJfTUFQUElOR19fVVJMX1BBVFRFUk46CkBAIC0yNzIsNiArMjc2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTjoKQEAgLTI4OSw2ICsyOTQsNyBAQAogCS8qKgogCSAqIChSZW1vdmVkIEdlbmVyYXRlZCBmbGFnIHRvIHByZXNlcnZlIG92ZXJyaWRlIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgTk9UIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTjoKQEAgLTMxNCwxMyArMzIwLDE0IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVybFBhdHRlcm46ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHVybFBhdHRlcm46ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodXJsUGF0dGVybik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGlzcGF0Y2hlclR5cGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGRpc3BhdGNoZXJUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRpc3BhdGNoZXJUeXBlKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0Zvcm1Mb2dpbkNvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRm9ybUxvZ2luQ29uZmlnSW1wbC5qYXZhCmluZGV4IGYxOWQ1NzQuLmM5ODAxNTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRm9ybUxvZ2luQ29uZmlnSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvRm9ybUxvZ2luQ29uZmlnSW1wbC5qYXZhCkBAIC02Niw2ICs2Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPUk1fTE9HSU5fQ09ORklHOwogCX0KQEAgLTEzMiw3ICsxMzMsNyBAQAogCXB1YmxpYyB2b2lkIHNldExvZ2luQ29uZmlnKExvZ2luQ29uZmlnIG5ld0xvZ2luQ29uZmlnKSB7CiAJCWlmIChuZXdMb2dpbkNvbmZpZyAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRk9STV9MT0dJTl9DT05GSUdfX0xPR0lOX0NPTkZJRyAmJiBuZXdMb2dpbkNvbmZpZyAhPSBudWxsKSkgewogCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0xvZ2luQ29uZmlnKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTE1MCw2ICsxNTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHOgpAQCAtMTY1LDYgKzE2Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19MT0dJTl9DT05GSUc6CkBAIC0xNzgsNiArMTgxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5GT1JNX0xPR0lOX0NPTkZJR19fTE9HSU5fQ09ORklHOgpAQCAtMTkxLDYgKzE5NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0U6CkBAIC0yMDgsNiArMjEzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0U6CkBAIC0yMjgsNiArMjM0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0U6CkBAIC0yNDgsNiArMjU1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0U6CkBAIC0yNjMsMTMgKzI3MSwxNCBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmb3JtTG9naW5QYWdlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChmb3JtTG9naW5QYWdlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGZvcm1Mb2dpblBhZ2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZvcm1FcnJvclBhZ2U6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGZvcm1FcnJvclBhZ2U6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZm9ybUVycm9yUGFnZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9IVFRQTWV0aG9kVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSFRUUE1ldGhvZFR5cGVJbXBsLmphdmEKaW5kZXggMWU1NjBjZi4uOTBlN2RmOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9IVFRQTWV0aG9kVHlwZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0hUVFBNZXRob2RUeXBlSW1wbC5qYXZhCkBAIC02Niw2ICs2Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkhUVFBfTUVUSE9EX1RZUEU7CiAJfQpAQCAtOTYsNiArOTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5IVFRQX01FVEhPRF9UWVBFX19IVFRQX01FVEhPRDoKQEAgLTEwOSw2ICsxMTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSFRUUF9NRVRIT0RfVFlQRV9fSFRUUF9NRVRIT0Q6CkBAIC0xMjMsNiArMTI2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEVfX0hUVFBfTUVUSE9EOgpAQCAtMTM3LDYgKzE0MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5IVFRQX01FVEhPRF9UWVBFX19IVFRQX01FVEhPRDoKQEAgLTE1MCwxMSArMTU1LDEyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChodHRwTWV0aG9kOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChodHRwTWV0aG9kOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGh0dHBNZXRob2QpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSW5pdFBhcmFtSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Jbml0UGFyYW1JbXBsLmphdmEKaW5kZXggNDM4YjY2Yy4uMjM5MWY3NyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Jbml0UGFyYW1JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Jbml0UGFyYW1JbXBsLmphdmEKQEAgLTc2LDYgKzc2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuSU5JVF9QQVJBTTsKIAl9CkBAIC0xMzksNiArMTQwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRToKQEAgLTE1Niw2ICsxNTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRToKQEAgLTE3Niw2ICsxNzksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRToKQEAgLTE5Niw2ICsyMDAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRToKQEAgLTIxMSwxNSArMjE2LDE2IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhcmFtTmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAocGFyYW1OYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHBhcmFtTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1WYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1WYWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChwYXJhbVZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSlNQVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvSlNQVHlwZUltcGwuamF2YQppbmRleCA3NDIyYzZkLi4zMzk5YjI5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0pTUFR5cGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9KU1BUeXBlSW1wbC5qYXZhCkBAIC00NywxMCArNDcsMTIgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuSlNQX1RZUEU7CiAJfQogCitAT3ZlcnJpZGUKIHB1YmxpYyBib29sZWFuIGlzSnNwVHlwZSgpIHsKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTc5LDYgKzgxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSlNQX1RZUEVfX0pTUF9GSUxFOgpAQCAtOTIsNiArOTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSlNQX1RZUEVfX0pTUF9GSUxFOgpAQCAtMTA2LDYgKzExMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5KU1BfVFlQRV9fSlNQX0ZJTEU6CkBAIC0xMjAsNiArMTI1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkpTUF9UWVBFX19KU1BfRklMRToKQEAgLTEzMSwxMSArMTM3LDEyIEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGpzcEZpbGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGpzcEZpbGU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoanNwRmlsZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTG9jYWxFbmNvZGluZ01hcHBpbmdJbXBsLmphdmEKaW5kZXggMmJmZDUyZC4uZjAzOGY0MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2NhbEVuY29kaW5nTWFwcGluZ0ltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0xvY2FsRW5jb2RpbmdNYXBwaW5nSW1wbC5qYXZhCkBAIC04Nyw2ICs4Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkc7CiAJfQpAQCAtMTM4LDYgKzEzOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRToKQEAgLTE1Myw2ICsxNTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19fTE9DQUxFOgpAQCAtMTcwLDYgKzE3Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX19MT0NBTEU6CkBAIC0xODcsNiArMTkxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPQ0FMX0VOQ09ESU5HX01BUFBJTkdfX0xPQ0FMRToKQEAgLTIwMiwxMyArMjA3LDE0IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsb2NhbGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGxvY2FsZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChsb2NhbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVuY29kaW5nOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBlbmNvZGluZzogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChlbmNvZGluZyk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwuamF2YQppbmRleCA2MzlmYWY5Li42ZTA5NWE5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEltcGwuamF2YQpAQCAtNjIsNiArNjIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1Q7CiAJfQpAQCAtODMsNiArODQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgpAQCAtOTYsNiArOTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgpAQCAtMTA5LDYgKzExMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgpAQCAtMTI0LDYgKzEyOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgpAQCAtMTM4LDYgKzE0Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX0xJU1RfX0xPQ0FMX0VOQ09ESU5HX01BUFBJTkdTOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2dpbkNvbmZpZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTG9naW5Db25maWdJbXBsLmphdmEKaW5kZXggOTVmOGY0NS4uZmI4MzYzNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Mb2dpbkNvbmZpZ0ltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL0xvZ2luQ29uZmlnSW1wbC5qYXZhCkBAIC0xMDIsNiArMTAyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTE9HSU5fQ09ORklHOwogCX0KQEAgLTIxOSw3ICsyMjAsNyBAQAogCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7CiAJCWlmIChuZXdXZWJBcHAgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCiAJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKIAkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQogCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwpAQCAtMjc2LDYgKzI3Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkxPR0lOX0NPTkZJR19fV0VCX0FQUDoKQEAgLTI5NSw2ICsyOTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFA6CkBAIC0zMTAsNiArMzEzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX1dFQl9BUFA6CkBAIC0zMjMsNiArMzI3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRDoKQEAgLTM0NCw2ICszNDksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRDoKQEAgLTM3MCw2ICszNzYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRDoKQEAgLTM5Niw2ICs0MDMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9HSU5fQ09ORklHX19BVVRIX01FVEhPRDoKQEAgLTQxNSwxNSArNDIzLDE2IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF1dGhNZXRob2Q6ICIpOwotCQlpZiAoYXV0aE1ldGhvZEVTZXQpIHJlc3VsdC5hcHBlbmQoYXV0aE1ldGhvZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlYWxtTmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoYXV0aE1ldGhvZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGF1dGhNZXRob2RFU2V0KSByZXN1bHQuYXBwZW5kKGF1dGhNZXRob2QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKCIsIHJlYWxtTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChyZWFsbU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGhvcml6YXRpb25NZXRob2Q6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGhvcml6YXRpb25NZXRob2Q6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoYXV0aG9yaXphdGlvbk1ldGhvZCk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9NaW1lTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvTWltZU1hcHBpbmdJbXBsLmphdmEKaW5kZXggZDlhMjRlOC4uYjZhNTFiNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9NaW1lTWFwcGluZ0ltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL01pbWVNYXBwaW5nSW1wbC5qYXZhCkBAIC02Niw2ICs2Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLk1JTUVfTUFQUElORzsKIAl9CkBAIC0xMzAsNyArMTMxLDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRXZWJBcHAoV2ViQXBwIG5ld1dlYkFwcCkgewogCQlpZiAobmV3V2ViQXBwICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFAgJiYgbmV3V2ViQXBwICE9IG51bGwpKSB7CiAJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3V2ViQXBwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTE0OCw2ICsxNDksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX1dFQl9BUFA6CkBAIC0xNjMsNiArMTY1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQOgpAQCAtMTc2LDYgKzE3OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19XRUJfQVBQOgpAQCAtMTg5LDYgKzE5Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fRVhURU5TSU9OOgpAQCAtMjA2LDYgKzIxMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5NSU1FX01BUFBJTkdfX0VYVEVOU0lPTjoKQEAgLTIyNiw2ICsyMzIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT046CkBAIC0yNDYsNiArMjUzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLk1JTUVfTUFQUElOR19fRVhURU5TSU9OOgpAQCAtMjYxLDEzICsyNjksMTQgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZXh0ZW5zaW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChleHRlbnNpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZXh0ZW5zaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaW1lVHlwZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgbWltZVR5cGU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobWltZVR5cGUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvUm9sZU5hbWVUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Sb2xlTmFtZVR5cGVJbXBsLmphdmEKaW5kZXggZWY4NGExMS4uZmNiODdiNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Sb2xlTmFtZVR5cGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Sb2xlTmFtZVR5cGVJbXBsLmphdmEKQEAgLTQ3LDYgKzQ3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9OQU1FX1RZUEU7CiAJfQpAQCAtNzMsNiArNzQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5ST0xFX05BTUVfVFlQRV9fUk9MRV9OQU1FOgpAQCAtODYsNiArODgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUk9MRV9OQU1FX1RZUEVfX1JPTEVfTkFNRToKQEAgLTEwMCw2ICsxMDMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUk9MRV9OQU1FX1RZUEVfX1JPTEVfTkFNRToKQEAgLTExNCw2ICsxMTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuUk9MRV9OQU1FX1RZUEVfX1JPTEVfTkFNRToKQEAgLTEyNSwxMSArMTMwLDEyIEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJvbGVOYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChyb2xlTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChyb2xlTmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZWN1cml0eUNvbnN0cmFpbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Q29uc3RyYWludEltcGwuamF2YQppbmRleCAxOGVjMmM4Li44Y2VhYWQ2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Q29uc3RyYWludEltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlY3VyaXR5Q29uc3RyYWludEltcGwuamF2YQpAQCAtOTIsNiArOTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5TRUNVUklUWV9DT05TVFJBSU5UOwogCX0KQEAgLTE0MSw3ICsxNDIsNyBAQAogCXB1YmxpYyB2b2lkIHNldFdlYkFwcChXZWJBcHAgbmV3V2ViQXBwKSB7CiAJCWlmIChuZXdXZWJBcHAgIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFAgJiYgbmV3V2ViQXBwICE9IG51bGwpKSB7CiAJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3V2ViQXBwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTI1OSw2ICsyNjAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQOgpAQCAtMjg0LDYgKzI4Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX1dFQl9BUFA6CkBAIC0zMDUsNiArMzA4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19XRUJfQVBQOgpAQCAtMzE4LDYgKzMyMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRToKQEAgLTM0MSw2ICszNDYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VDVVJJVFlfQ09OU1RSQUlOVF9fRElTUExBWV9OQU1FOgpAQCAtMzcyLDYgKzM3OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUU6CkBAIC00MDEsNiArNDA4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFQ1VSSVRZX0NPTlNUUkFJTlRfX0RJU1BMQVlfTkFNRToKQEAgLTQyNCwxMSArNDMyLDEyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkaXNwbGF5TmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGlzcGxheU5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGlzcGxheU5hbWUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldEltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldEltcGwuamF2YQppbmRleCBjMjgxM2E2Li5lYTlhMDg5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXJ2bGV0SW1wbC5qYXZhCkBAIC0xMTksNiArMTE5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuU0VSVkxFVDsKIAl9CkBAIC0xODksNiArMTkwLDcgQEAKIAkvKioKIAkgKgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewogCQlzdXBlci5zZXREaXNwbGF5TmFtZShuZXdEaXNwbGF5TmFtZSk7CiAJfQpAQCAtMjYzLDcgKzI2NSw3IEBACiAJcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKIAkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX0FQUCAmJiBuZXdXZWJBcHAgIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdXZWJBcHApKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCiAJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKIAkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQogCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwpAQCAtMzk2LDYgKzM5OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFA6CkBAIC00MTEsNiArNDE0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fV0VCX0FQUDoKQEAgLTQzNCw2ICs0MzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1dFQl9BUFA6CkBAIC00NDcsNiArNDUyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9OQU1FOgpAQCAtNDc0LDYgKzQ4MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX19TRVJWTEVUX05BTUU6CkBAIC01MTIsNiArNTE5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfX1NFUlZMRVRfTkFNRToKQEAgLTU0Nyw2ICs1NTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9OQU1FOgpAQCAtNTcyLDE0ICs1ODEsMTUgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2VydmxldE5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHNlcnZsZXROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHNlcnZsZXROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsb2FkT25TdGFydHVwOiAiKTsKLQkJaWYgKGxvYWRPblN0YXJ0dXBFU2V0KSByZXN1bHQuYXBwZW5kKGxvYWRPblN0YXJ0dXApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBsb2FkT25TdGFydHVwOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAobG9hZE9uU3RhcnR1cEVTZXQpIHJlc3VsdC5hcHBlbmQobG9hZE9uU3RhcnR1cCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldE1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRNYXBwaW5nSW1wbC5qYXZhCmluZGV4IGNhMjRkYzcuLjlkMTUwMjUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldE1hcHBpbmdJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXJ2bGV0TWFwcGluZ0ltcGwuamF2YQpAQCAtNzcsNiArNzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5TRVJWTEVUX01BUFBJTkc7CiAJfQpAQCAtMTQ1LDcgKzE0Niw3IEBACiAJcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKIAkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQICYmIG5ld1dlYkFwcCAhPSBudWxsKSkgewogCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1dlYkFwcCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwogCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCiAJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CkBAIC0xOTcsNiArMTk4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9NQVBQSU5HX19XRUJfQVBQOgpAQCAtMjEyLDYgKzIxNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fV0VCX0FQUDoKQEAgLTIyNSw2ICsyMjgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fV0VCX0FQUDoKQEAgLTIzOCw2ICsyNDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOOgpAQCAtMjU4LDYgKzI2Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOOgpAQCAtMjgxLDYgKzI4Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOOgpAQCAtMzA0LDYgKzMxMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX01BUFBJTkdfX1VSTF9QQVRURVJOOgpAQCAtMzIxLDEzICszMjksMTQgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXJsUGF0dGVybjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAodXJsUGF0dGVybjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh1cmxQYXR0ZXJuKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1NlcnZsZXRUeXBlSW1wbC5qYXZhCmluZGV4IGU0MjM3MjIuLjQ3Y2NmNTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2VydmxldFR5cGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXJ2bGV0VHlwZUltcGwuamF2YQpAQCAtNDcsMTAgKzQ3LDEyIEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLlNFUlZMRVRfVFlQRTsKIAl9CiAKK0BPdmVycmlkZQogcHVibGljIGJvb2xlYW4gaXNTZXJ2bGV0VHlwZSgpIHsKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTc2LDYgKzc4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9UWVBFX19DTEFTU19OQU1FOgpAQCAtODksNiArOTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9UWVBFX19DTEFTU19OQU1FOgpAQCAtMTAzLDYgKzEwNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVJWTEVUX1RZUEVfX0NMQVNTX05BTUU6CkBAIC0xMTcsNiArMTIyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfVFlQRV9fQ0xBU1NfTkFNRToKQEAgLTEyOCwxMSArMTM0LDEyIEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNsYXNzTmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoY2xhc3NOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGNsYXNzTmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXNzaW9uQ29uZmlnSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9TZXNzaW9uQ29uZmlnSW1wbC5qYXZhCmluZGV4IDlmNjI0NTMuLjBlODg1ZjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvU2Vzc2lvbkNvbmZpZ0ltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1Nlc3Npb25Db25maWdJbXBsLmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuU0VTU0lPTl9DT05GSUc7CiAJfQpAQCAtMTM0LDcgKzEzNSw3IEBACiAJcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKIAkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1dFQl9BUFAgJiYgbmV3V2ViQXBwICE9IG51bGwpKSB7CiAJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3V2ViQXBwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTE1Miw2ICsxNTMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUDoKQEAgLTE2Nyw2ICsxNjksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRVNTSU9OX0NPTkZJR19fV0VCX0FQUDoKQEAgLTE4MCw2ICsxODMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19XRUJfQVBQOgpAQCAtMTkzLDYgKzE5Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQ6CkBAIC0yMDgsNiArMjEzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQ6CkBAIC0yMjUsNiArMjMxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQ6CkBAIC0yNDIsNiArMjQ5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFU1NJT05fQ09ORklHX19TRVNTSU9OX1RJTUVPVVQ6CkBAIC0yNTUsMTIgKzI2MywxMyBAQAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzZXNzaW9uVGltZW91dDogIik7Ci0JCWlmIChzZXNzaW9uVGltZW91dEVTZXQpIHJlc3VsdC5hcHBlbmQoc2Vzc2lvblRpbWVvdXQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzZXNzaW9uVGltZW91dDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHNlc3Npb25UaW1lb3V0RVNldCkgcmVzdWx0LmFwcGVuZChzZXNzaW9uVGltZW91dCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvVGFnTGliUmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9UYWdMaWJSZWZJbXBsLmphdmEKaW5kZXggZGRmOGFkZS4uNjVlODEyNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9UYWdMaWJSZWZJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9UYWdMaWJSZWZJbXBsLmphdmEKQEAgLTY2LDYgKzY2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTGl0ZXJhbHMuVEFHX0xJQl9SRUY7CiAJfQpAQCAtMTM3LDcgKzEzOCw3IEBACiAJcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKIAkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1dFQl9BUFAgJiYgbmV3V2ViQXBwICE9IG51bGwpKSB7CiAJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3V2ViQXBwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTE1NSw2ICsxNTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fV0VCX0FQUDoKQEAgLTE3MCw2ICsxNzIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fV0VCX0FQUDoKQEAgLTE4Myw2ICsxODYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19XRUJfQVBQOgpAQCAtMTk2LDYgKzIwMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfVVJJOgpAQCAtMjEzLDYgKzIxOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5UQUdfTElCX1JFRl9fVEFHTElCX1VSSToKQEAgLTIzMyw2ICsyMzksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1RBR0xJQl9VUkk6CkBAIC0yNTMsNiArMjYwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlRBR19MSUJfUkVGX19UQUdMSUJfVVJJOgpAQCAtMjY4LDEzICsyNzYsMTQgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFnbGliVVJJOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiICh0YWdsaWJVUkk6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodGFnbGliVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YWdsaWJMb2NhdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdGFnbGliTG9jYXRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodGFnbGliTG9jYXRpb24pOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvVVJMUGF0dGVyblR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1VSTFBhdHRlcm5UeXBlSW1wbC5qYXZhCmluZGV4IDg3Mjg0ODkuLjFkM2ViY2EgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvVVJMUGF0dGVyblR5cGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9VUkxQYXR0ZXJuVHlwZUltcGwuamF2YQpAQCAtNTEsNiArNTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5VUkxfUEFUVEVSTl9UWVBFOwogCX0KQEAgLTk2LDcgKzk3LDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRSZXNDb2xsZWN0aW9uKFdlYlJlc291cmNlQ29sbGVjdGlvbiBuZXdSZXNDb2xsZWN0aW9uKSB7CiAJCWlmIChuZXdSZXNDb2xsZWN0aW9uICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTiAmJiBuZXdSZXNDb2xsZWN0aW9uICE9IG51bGwpKSB7CiAJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3UmVzQ29sbGVjdGlvbikpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwogCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCiAJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CkBAIC0xMTQsNiArMTE1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT046CkBAIC0xMjksNiArMTMxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fUkVTX0NPTExFQ1RJT046CkBAIC0xNDIsNiArMTQ1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19SRVNfQ09MTEVDVElPTjoKQEAgLTE1NSw2ICsxNTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTjoKQEAgLTE3MCw2ICsxNzUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fVVJMX1BBVFRFUk46CkBAIC0xODcsNiArMTkzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVSTF9QQVRURVJOX1RZUEVfX1VSTF9QQVRURVJOOgpAQCAtMjA0LDYgKzIxMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VUkxfUEFUVEVSTl9UWVBFX19VUkxfUEFUVEVSTjoKQEAgLTIxNywxMSArMjI1LDEyIEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVybFBhdHRlcm46ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHVybFBhdHRlcm46ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodXJsUGF0dGVybik7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9Vc2VyRGF0YUNvbnN0cmFpbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1VzZXJEYXRhQ29uc3RyYWludEltcGwuamF2YQppbmRleCAyNTgzNmM4Li4yNWQ3MWI4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1VzZXJEYXRhQ29uc3RyYWludEltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1VzZXJEYXRhQ29uc3RyYWludEltcGwuamF2YQpAQCAtOTMsNiArOTMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5VU0VSX0RBVEFfQ09OU1RSQUlOVDsKIAl9CkBAIC0xOTIsNyArMTkzLDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRTZWNDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBuZXdTZWNDb25zdHJhaW50KSB7CiAJCWlmIChuZXdTZWNDb25zdHJhaW50ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQgJiYgbmV3U2VjQ29uc3RyYWludCAhPSBudWxsKSkgewogCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1NlY0NvbnN0cmFpbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCiAJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKIAkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQogCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwpAQCAtMjIyLDYgKzIyMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19TRUNfQ09OU1RSQUlOVDoKQEAgLTIzNyw2ICsyMzksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6CkBAIC0yNTIsNiArMjU1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fU0VDX0NPTlNUUkFJTlQ6CkBAIC0yNjUsNiArMjY5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OOgpAQCAtMjg0LDYgKzI4OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT046CkBAIC0zMDgsNiArMzE0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlVTRVJfREFUQV9DT05TVFJBSU5UX19ERVNDUklQVElPTjoKQEAgLTMzMSw2ICszMzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVNFUl9EQVRBX0NPTlNUUkFJTlRfX0RFU0NSSVBUSU9OOgpAQCAtMzQ4LDE0ICszNTYsMTUgQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0cmFuc3BvcnRHdWFyYW50ZWU6ICIpOwotCQlpZiAodHJhbnNwb3J0R3VhcmFudGVlRVNldCkgcmVzdWx0LmFwcGVuZCh0cmFuc3BvcnRHdWFyYW50ZWUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB0cmFuc3BvcnRHdWFyYW50ZWU6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmICh0cmFuc3BvcnRHdWFyYW50ZWVFU2V0KSByZXN1bHQuYXBwZW5kKHRyYW5zcG9ydEd1YXJhbnRlZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJBcHBJbXBsLmphdmEKaW5kZXggMzM2NWYyNC4uOTc1YzBkYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJBcHBJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJBcHBJbXBsLmphdmEKQEAgLTIwNyw2ICsyMDcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5XRUJfQVBQOwogCX0KQEAgLTQ0Nyw2ICs0NDgsNyBAQAogCS8qKgogCSAqCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIG5ld0Rpc3BsYXlOYW1lKSB7CiAJCXN1cGVyLnNldERpc3BsYXlOYW1lKG5ld0Rpc3BsYXlOYW1lKTsKIAl9CkBAIC01NjIsMTMgKzU2NCwxMyBAQAogCQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgCiAJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogCQkJCi0JCQkJaWYgKHZlcnNpb24uZXF1YWxzKCIyLjQiKSkvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEOwotCQkJCWlmICh2ZXJzaW9uLmVxdWFscygiMi4zIikpLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRDsKLQkJCQlpZiAodmVyc2lvbi5lcXVhbHMoIjIuMiIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQ7Ci0JCQkKKwkJCWlmICh2ZXJzaW9uLmVxdWFscygiMi40IikpLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEOworCQkJaWYgKHZlcnNpb24uZXF1YWxzKCIyLjMiKSkvLyROT04tTkxTLTEkCisJCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQ7CisJCQlpZiAodmVyc2lvbi5lcXVhbHMoIjIuMiIpKS8vJE5PTi1OTFMtMSQKKwkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRDsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKIAkJfQogCQlyZXR1cm4gcmVzLmdldE1vZHVsZVZlcnNpb25JRCgpOwogCX0KQEAgLTU3Niw2ICs1NzgsNyBAQAogCS8qKgogCSAqVGhpcyByZXR1cm5zIHRoZSBqMmVlIHZlcnNpb24gaWQuIENvbXBhcmUgd2l0aCBKMkVFVmVyc2lvbkNvbnN0YW50cyB0byBkZXRlcm1pbmUgajJlZSBsZXZlbAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb25JRCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewogCQlKMkVFVmVyc2lvblJlc291cmNlIHJlcyA9IChKMkVFVmVyc2lvblJlc291cmNlKSBlUmVzb3VyY2UoKTsKIAkJaWYgKHJlcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CkBAIC04NTYsNiArODU5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVFM6CkBAIC04OTMsNiArODk3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fQ09OVEVYVFM6CkBAIC05NDAsNiArOTQ1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRElTVFJJQlVUQUJMRToKQEAgLTk5MSw2ICs5OTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUF9fRElTVFJJQlVUQUJMRToKQEAgLTEwNzUsNiArMTA4Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19ESVNUUklCVVRBQkxFOgpAQCAtMTE0Niw2ICsxMTU0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9BUFBfX0RJU1RSSUJVVEFCTEU6CkBAIC0xMTk1LDEzICsxMjA0LDE0IEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRpc3RyaWJ1dGFibGU6ICIpOwotCQlpZiAoZGlzdHJpYnV0YWJsZUVTZXQpIHJlc3VsdC5hcHBlbmQoZGlzdHJpYnV0YWJsZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZlcnNpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGRpc3RyaWJ1dGFibGU6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChkaXN0cmlidXRhYmxlRVNldCkgcmVzdWx0LmFwcGVuZChkaXN0cmlidXRhYmxlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkFwcFJlc291cmNlRmFjdG9yeS5qYXZhCmluZGV4IDYyYjc5ZjUuLmE3ZTZlZTQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJBcHBSZXNvdXJjZUZhY3RvcnkuamF2YQpAQCAtNjQsNiArNjQsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5I2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkksIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuUmVuZGVyZXIpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFRyYW5zbGF0b3JSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpLCBSZW5kZXJlciBhUmVuZGVyZXIpIHsKIAkJcmV0dXJuIG5ldyBXZWJBcHBSZXNvdXJjZUltcGwodXJpLCBhUmVuZGVyZXIpOwogCX0KQEAgLTkzLDcgKzk0LDcgQEAKIAkKIAlwdWJsaWMgc3RhdGljIFJlc291cmNlLkZhY3RvcnkgZ2V0UmVnaXN0ZXJlZEZhY3RvcnkoKSB7CiAKLQkJU3lzdGVtLmVyci5wcmludGxuKCJmZXRjaGluZyByZWdpc3RlcmVkIGZhY3RvcnkgZm9yIHdlYiBhcHAgdXJpIik7CisJCVN5c3RlbS5lcnIucHJpbnRsbigiZmV0Y2hpbmcgcmVnaXN0ZXJlZCBmYWN0b3J5IGZvciB3ZWIgYXBwIHVyaSIpOyAvLyROT04tTkxTLTEkCiAJCXJldHVybiBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUklfT0JKKTsKIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwUmVzb3VyY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYkFwcFJlc291cmNlSW1wbC5qYXZhCmluZGV4IGQ2N2FiYzkuLjZhNjYzYjggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViQXBwUmVzb3VyY2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJBcHBSZXNvdXJjZUltcGwuamF2YQpAQCAtNTEsNiArNTEsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1B1YmxpY0lEKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfUFVCTElDSURfMl8yOwogCX0KQEAgLTU4LDEwICs1OSwxMiBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8yX1N5c3RlbUlEKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1N5c3RlbUlEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8yOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEoyRUVfQWx0XzFfMl9TeXN0ZW1JRCgpIHsKIAkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCQVBQX0FMVF9TWVNURU1JRF8yXzI7CiAJfQpAQCAtNjksNiArNzIsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1B1YmxpY0lEKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1B1YmxpY0lEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfUFVCTElDSURfMl8zOwogCX0KQEAgLTc2LDEwICs4MCwxMiBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWV4bWwuWE1MUmVzb3VyY2VJbXBsI2dldEoyRUVfMV8zX1N5c3RlbUlEKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfU1lTVEVNSURfMl8zOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV9BbHRfMV8zX1N5c3RlbUlEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJBUFBfQUxUX1NZU1RFTUlEXzJfMzsKIAl9CkBAIC0xMzUsNiArMTQxLDcgQEAKIAl9CiAJLyogUmV0dXJuIEoyRUUgdmVyc2lvbiBiYXNlZCBvbiBtb2R1bGUgdmVyc2lvbgogCSovCisJQE92ZXJyaWRlCiAJcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgewogCQlzd2l0Y2ggKGdldE1vZHVsZVZlcnNpb25JRCgpKSB7CiAJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQgOgpAQCAtMTUwLDExICsxNTcsMTggQEAKIAkvKiAKIAkgKiBUaGlzIGRpcmVjdGx5IHNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCkgewogCXN1cGVyLnNldFZlcnNpb25JRChpZCk7CiAJc3dpdGNoIChpZCkgeworCQkJLy9FRTZUT0RPCisJCQljYXNlIChXRUJfMl81X0lEKSA6CisJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKKwkJCQlwcmltU2V0VmVyc2lvbklEKFdFQl8yXzVfSUQpOworCQkJCWJyZWFrOwogCQkJY2FzZSAoV0VCXzJfNF9JRCkgOgogCQkJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7CisJCQkJcHJpbVNldFZlcnNpb25JRChXRUJfMl80X0lEKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgKFdFQl8yXzNfSUQpIDoKIAkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKGdldEoyRUVfMV8zX1B1YmxpY0lEKCksIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkpOwpAQCAtMTY4LDggKzE4MiwxNCBAQAogCS8qCiAJICogQmFzZWQgb24gdGhlIEoyRUUgdmVyc2lvbiwgdGhpcyB3aWxsIHNldCB0aGUgbW9kdWxlIHZlcnNpb24KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCkgewogCXN3aXRjaCAoaWQpIHsKKwkJLy9FRTZUT0RPCisJCWNhc2UgKEpFRV81XzBfSUQpIDoKKwkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7CisJCQkJCXByaW1TZXRWZXJzaW9uSUQoV0VCXzJfNV9JRCk7CisJCWJyZWFrOwogCQljYXNlIChKMkVFXzFfNF9JRCkgOgogCQkJCQlwcmltU2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKIAkJCQkJcHJpbVNldFZlcnNpb25JRChXRUJfMl80X0lEKTsKQEAgLTE4Nyw2ICsyMDcsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRWZXJzaW9uSUQoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFZlcnNpb25JRCgpIHsKIAkJcmV0dXJuIFdFQl8yXzRfSUQ7CiAJfQpAQCAtMTk0LDYgKzIxNSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmltcGwuWE1MUmVzb3VyY2VJbXBsI3N5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpIHsKIAkJV2ViQXBwIGFwcCA9IGdldFdlYkFwcCgpOwogCQlpZiAoYXBwID09IG51bGwpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYlJlc291cmNlQ29sbGVjdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbC5qYXZhCmluZGV4IGE4YmNmY2UuLjk1MWIzYTMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbC5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CkBAIC00MSw3ICs0MCw3IEBACiAgKiBUaGUgd2ViLXJlc291cmNlLWNvbGxlY3Rpb24gZWxlbWVudCBpcyB1c2VkIHRvIGlkZW50aWZ5IGEgc3Vic2V0IG9mIHRoZSByZXNvdXJjZXMgYW5kIEhUVFAgbWV0aG9kcyBvbiB0aG9zZSByZXNvdXJjZXMgd2l0aGluIGEgd2ViIGFwcGxpY2F0aW9uIHRvIHdoaWNoIGEgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzLiBJZiBubyBIVFRQIG1ldGhvZHMgYXJlIHNwZWNpZmllZCwgdGhlbiB0aGUgc2VjdXJpdHkgY29uc3RyYWludCBhcHBsaWVzIHRvIGFsbCBIVFRQIG1ldGhvZHMuCiAKICAqLwotcHVibGljIGNsYXNzIFdlYlJlc291cmNlQ29sbGVjdGlvbkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlYlJlc291cmNlQ29sbGVjdGlvbiwgRU9iamVjdCB7CitwdWJsaWMgY2xhc3MgV2ViUmVzb3VyY2VDb2xsZWN0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV2ViUmVzb3VyY2VDb2xsZWN0aW9uIHsKIAogCS8qKgogCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWJSZXNvdXJjZU5hbWUoKSA8ZW0+V2ViIFJlc291cmNlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KQEAgLTEyNiw2ICsxMjUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTjsKIAl9CkBAIC0yMzIsNyArMjMyLDcgQEAKIAlwdWJsaWMgdm9pZCBzZXRTZWNDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBuZXdTZWNDb25zdHJhaW50KSB7CiAJCWlmIChuZXdTZWNDb25zdHJhaW50ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQgJiYgbmV3U2VjQ29uc3RyYWludCAhPSBudWxsKSkgewogCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld1NlY0NvbnN0cmFpbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCiAJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKIAkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQogCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwpAQCAtMjg4LDYgKzI4OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19TRUNfQ09OU1RSQUlOVDoKQEAgLTMwNSw2ICszMDYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQ6CkBAIC0zMjQsNiArMzI2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fU0VDX0NPTlNUUkFJTlQ6CkBAIC0zMzcsNiArMzQwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FOgpAQCAtMzY0LDYgKzM2OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfUkVTT1VSQ0VfQ09MTEVDVElPTl9fV0VCX1JFU09VUkNFX05BTUU6CkBAIC00MDQsNiArNDA5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFQl9SRVNPVVJDRV9DT0xMRUNUSU9OX19XRUJfUkVTT1VSQ0VfTkFNRToKQEAgLTQzOSw2ICs0NDUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FOgpAQCAtNDY0LDE3ICs0NzEsMTggQEAKIAkvKioKIAkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAod2ViUmVzb3VyY2VOYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiICh3ZWJSZXNvdXJjZU5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQod2ViUmVzb3VyY2VOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVybFBhdHRlcm46ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHVybFBhdHRlcm46ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodXJsUGF0dGVybik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHR0cE1ldGhvZDogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgaHR0cE1ldGhvZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChodHRwTWV0aG9kKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYlR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYlR5cGVJbXBsLmphdmEKaW5kZXggYWIzODk2NS4uNWJjMjc5OSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJUeXBlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViVHlwZUltcGwuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5XRUJfVFlQRTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYmFwcGxpY2F0aW9uRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbC5qYXZhCmluZGV4IDExZjAyYWYuLmMzM2Y1NDQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbC5qYXZhCkBAIC02NSw3ICs2NSw3IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgaW5pdCgpIHsKIAkJdHJ5IHsKLQkJCVdlYmFwcGxpY2F0aW9uRmFjdG9yeSB0aGVXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSAoV2ViYXBwbGljYXRpb25GYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJ3ZWJhcHBsaWNhdGlvbi54bWkiKTsgCisJCQlXZWJhcHBsaWNhdGlvbkZhY3RvcnkgdGhlV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gKFdlYmFwcGxpY2F0aW9uRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgid2ViYXBwbGljYXRpb24ueG1pIik7ICAvLyROT04tTkxTLTEkCiAJCQlpZiAodGhlV2ViYXBwbGljYXRpb25GYWN0b3J5ICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gdGhlV2ViYXBwbGljYXRpb25GYWN0b3J5OwogCQkJfQpAQCAtODYsNiArODYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewogCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX0FQUDogcmV0dXJuIGNyZWF0ZVdlYkFwcCgpOwpAQCAtMTE3LDcgKzExOCw3IEBACiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HOiByZXR1cm4gY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmcoKTsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkhUVFBfTUVUSE9EX1RZUEU6IHJldHVybiBjcmVhdGVIVFRQTWV0aG9kVHlwZSgpOwogCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQl9CiAJfQogCkBAIC0xMjYsNiArMTI3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlJFU19BVVRIX1NFUlZMRVRfVFlQRToKQEAgLTEzOSw3ICsxNDEsNyBAQAogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuQVVUSF9NRVRIT0RfS0lORDoKIAkJCQlyZXR1cm4gY3JlYXRlQXV0aE1ldGhvZEtpbmRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKIAkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJfQogCX0KIApAQCAtMTQ4LDYgKzE1MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CiAJCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5SRVNfQVVUSF9TRVJWTEVUX1RZUEU6CkBAIC0xNjEsNyArMTY0LDcgQEAKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfTUVUSE9EX0tJTkQ6CiAJCQkJcmV0dXJuIGNvbnZlcnRBdXRoTWV0aG9kS2luZFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CiAJCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAl9CiAKQEAgLTM5OSw3ICs0MDIsNyBAQAogCSAqLwogCXB1YmxpYyBSZXNBdXRoU2VydmxldFR5cGUgY3JlYXRlUmVzQXV0aFNlcnZsZXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCVJlc0F1dGhTZXJ2bGV0VHlwZSByZXN1bHQgPSBSZXNBdXRoU2VydmxldFR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTQxOSw3ICs0MjIsNyBAQAogCSAqLwogCXB1YmxpYyBIVFRQTWV0aG9kVHlwZUVudW0gY3JlYXRlSFRUUE1ldGhvZFR5cGVFbnVtRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CiAJCUhUVFBNZXRob2RUeXBlRW51bSByZXN1bHQgPSBIVFRQTWV0aG9kVHlwZUVudW0uZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTQzOSw3ICs0NDIsNyBAQAogCSAqLwogCXB1YmxpYyBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIGNyZWF0ZVRyYW5zcG9ydEd1YXJhbnRlZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJVHJhbnNwb3J0R3VhcmFudGVlVHlwZSByZXN1bHQgPSBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC00NTksNyArNDYyLDcgQEAKIAkgKi8KIAlwdWJsaWMgRGlzcGF0Y2hlclR5cGUgY3JlYXRlRGlzcGF0Y2hlclR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKIAkJRGlzcGF0Y2hlclR5cGUgcmVzdWx0ID0gRGlzcGF0Y2hlclR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTQ3OSw3ICs0ODIsNyBAQAogCSAqLwogCXB1YmxpYyBBdXRoTWV0aG9kS2luZCBjcmVhdGVBdXRoTWV0aG9kS2luZEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewogCQlBdXRoTWV0aG9kS2luZCByZXN1bHQgPSBBdXRoTWV0aG9kS2luZC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWJhcHBsaWNhdGlvblBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQppbmRleCAzNWJhY2NmLi5jOGFlMDY1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwuamF2YQpAQCAtMTgsMjAgKzE4LDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQ2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuaW50ZXJuYWwuaW1wbC5DbGllbnRQYWNrYWdlSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5Db21tb25QYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FamJQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5KY2FQYWNrYWdlSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLnBsdWdpbi5KMkVFQ29yZVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuaW50ZXJuYWwuaW1wbC5Kc3BQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuVGFnbGliUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50YWdsaWIuaW50ZXJuYWwuaW1wbC5UYWdsaWJQYWNrYWdlSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5BdXRoTWV0aG9kS2luZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW07CkBAIC02OCwxNSArNTgsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKIAogCi1wdWJsaWMgY2xhc3MgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIFdlYmFwcGxpY2F0aW9uUGFja2FnZSwgRVBhY2thZ2UgeworcHVibGljIGNsYXNzIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBXZWJhcHBsaWNhdGlvblBhY2thZ2UgewogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0zMjcsNyArMzExLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworCXByaXZhdGUgdm9sYXRpbGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKIAogCS8qKgogCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgpAQCAtMzM2LDcgKzMyMCwxMCBAQAogCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoV2ViYXBwbGljYXRpb25QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKTsKIAogCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwoKSk7CisJCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gCisJCQkoV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YKKwkJCQkJV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldworCQkJCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwoKSk7CiAKIAkJaXNJbml0ZWQgPSB0cnVlOwogCkBAIC0zNDQsNTAgKzMzMSwyMCBAQAogCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCQlKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7CiAKLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQ2xpZW50UGFja2FnZUltcGwgdGhlQ2xpZW50UGFja2FnZSA9IChDbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENsaWVudFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IENsaWVudFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQXBwbGljYXRpb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSA6IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsIHRoZUFwcGxpY2F0aW9uUGFja2FnZV8xID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJRWpiUGFja2FnZUltcGwgdGhlRWpiUGFja2FnZSA9IChFamJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVqYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWpiUGFja2FnZS5lTlNfVVJJKSA6IEVqYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJVGFnbGliUGFja2FnZUltcGwgdGhlVGFnbGliUGFja2FnZSA9IChUYWdsaWJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFRhZ2xpYlBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVGFnbGliUGFja2FnZS5lTlNfVVJJKSA6IFRhZ2xpYlBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSA6IEpjYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IChXc2RkUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3NkZFBhY2thZ2UuZU5TX1VSSSkgOiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UpOwotCiAJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCiAJCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWpiUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdzZGRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwogCiAJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKIAkJdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZV8xLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVUYWdsaWJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpzcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7CiAKIAkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAogCQl0aGVXZWJhcHBsaWNhdGlvblBhY2thZ2UuZnJlZXplKCk7CiAKKwkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCisJCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlKTsKKworCQlKMkVFSW5pdC5pbml0RU1GTW9kZWxzKCk7CisKIAkJcmV0dXJuIHRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZTsKIAl9CiAKQEAgLTE2MjMsMjc1ICsxNTgwLDI4NyBAQAogCQlKc3BQYWNrYWdlIHRoZUpzcFBhY2thZ2UgPSAoSnNwUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpOwogCQlKYXZhUmVmUGFja2FnZSB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKIAotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCXdlYkFwcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEpORElFbnZSZWZzR3JvdXAoKSk7Ci0JCWNvbnRleHRQYXJhbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlzZXJ2bGV0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCXNlcnZsZXRNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXNlc3Npb25Db25maWdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJbWltZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJd2VsY29tZUZpbGVMaXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWVycm9yUGFnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl0YWdMaWJSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlhdXRoQ29uc3RyYWludEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJbG9naW5Db25maWdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZm9ybUxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWluaXRQYXJhbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl3ZWJUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXNlcnZsZXRUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V2ViVHlwZSgpKTsKLQkJanNwVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdlYlR5cGUoKSk7Ci0JCXVybFBhdHRlcm5UeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXJvbGVOYW1lVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQl3ZWxjb21lRmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlleGNlcHRpb25UeXBlRXJyb3JQYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXJyb3JQYWdlKCkpOwotCQllcnJvckNvZGVFcnJvclBhZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFcnJvclBhZ2UoKSk7Ci0JCWZpbHRlck1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJZmlsdGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlsb2NhbEVuY29kaW5nTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlodHRwTWV0aG9kVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3Mod2ViQXBwRUNsYXNzLCBXZWJBcHAuY2xhc3MsICJXZWJBcHAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYkFwcF9EaXN0cmlidXRhYmxlKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZGlzdHJpYnV0YWJsZSIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJBcHBfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0NvbnRleHRzKCksIHRoaXMuZ2V0Q29udGV4dFBhcmFtKCksIHRoaXMuZ2V0Q29udGV4dFBhcmFtX1dlYkFwcCgpLCAiY29udGV4dHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRXJyb3JQYWdlcygpLCB0aGlzLmdldEVycm9yUGFnZSgpLCB0aGlzLmdldEVycm9yUGFnZV9XZWJBcHAoKSwgImVycm9yUGFnZXMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRmlsZUxpc3QoKSwgdGhpcy5nZXRXZWxjb21lRmlsZUxpc3QoKSwgdGhpcy5nZXRXZWxjb21lRmlsZUxpc3RfV2ViQXBwKCksICJmaWxlTGlzdCIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1RhZ0xpYnMoKSwgdGhpcy5nZXRUYWdMaWJSZWYoKSwgdGhpcy5nZXRUYWdMaWJSZWZfV2ViQXBwKCksICJ0YWdMaWJzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0NvbnN0cmFpbnRzKCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYkFwcCgpLCAiY29uc3RyYWludHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTG9naW5Db25maWcoKSwgdGhpcy5nZXRMb2dpbkNvbmZpZygpLCB0aGlzLmdldExvZ2luQ29uZmlnX1dlYkFwcCgpLCAibG9naW5Db25maWciLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKSwgdGhpcy5nZXRNaW1lTWFwcGluZygpLCB0aGlzLmdldE1pbWVNYXBwaW5nX1dlYkFwcCgpLCAibWltZU1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1Nlc3Npb25Db25maWcoKSwgdGhpcy5nZXRTZXNzaW9uQ29uZmlnKCksIHRoaXMuZ2V0U2Vzc2lvbkNvbmZpZ19XZWJBcHAoKSwgInNlc3Npb25Db25maWciLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKSwgdGhpcy5nZXRTZXJ2bGV0TWFwcGluZygpLCB0aGlzLmdldFNlcnZsZXRNYXBwaW5nX1dlYkFwcCgpLCAic2VydmxldE1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX1NlcnZsZXRzKCksIHRoaXMuZ2V0U2VydmxldCgpLCB0aGlzLmdldFNlcnZsZXRfV2ViQXBwKCksICJzZXJ2bGV0cyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZWN1cml0eVJvbGVzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlKCksIG51bGwsICJzZWN1cml0eVJvbGVzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0ZpbHRlcnMoKSwgdGhpcy5nZXRGaWx0ZXIoKSwgbnVsbCwgImZpbHRlcnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfRmlsdGVyTWFwcGluZ3MoKSwgdGhpcy5nZXRGaWx0ZXJNYXBwaW5nKCksIG51bGwsICJmaWx0ZXJNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9MaXN0ZW5lcnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRMaXN0ZW5lcigpLCBudWxsLCAibGlzdGVuZXJzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0NvbnRleHRQYXJhbXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRQYXJhbVZhbHVlKCksIG51bGwsICJjb250ZXh0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0pzcENvbmZpZygpLCB0aGVKc3BQYWNrYWdlLmdldEpTUENvbmZpZygpLCBudWxsLCAianNwQ29uZmlnIiwgbnVsbCwgMCwgMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpLCBudWxsLCAibWVzc2FnZURlc3RpbmF0aW9ucyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSwgdGhpcy5nZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSwgbnVsbCwgImxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbnRleHRQYXJhbUVDbGFzcywgQ29udGV4dFBhcmFtLmNsYXNzLCAiQ29udGV4dFBhcmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZXh0UGFyYW1fUGFyYW1OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbU5hbWUiLCBudWxsLCAwLCAxLCBDb250ZXh0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRleHRQYXJhbV9QYXJhbVZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbVZhbHVlIiwgbnVsbCwgMCwgMSwgQ29udGV4dFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZXh0UGFyYW1fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ29udGV4dFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250ZXh0UGFyYW1fV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX0NvbnRleHRzKCksICJ3ZWJBcHAiLCBudWxsLCAwLCAxLCBDb250ZXh0UGFyYW0uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZXJ2bGV0RUNsYXNzLCBTZXJ2bGV0LmNsYXNzLCAiU2VydmxldCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmxldE5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnRlZ2VyT2JqZWN0KCksICJsb2FkT25TdGFydHVwIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0X1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9TZXJ2bGV0cygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9XZWJUeXBlKCksIHRoaXMuZ2V0V2ViVHlwZSgpLCBudWxsLCAid2ViVHlwZSIsIG51bGwsIDEsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfUGFyYW1zKCksIHRoaXMuZ2V0SW5pdFBhcmFtKCksIG51bGwsICJwYXJhbXMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9TZWN1cml0eVJvbGVSZWZzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlUmVmKCksIG51bGwsICJzZWN1cml0eVJvbGVSZWZzIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfUnVuQXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5KCksIG51bGwsICJydW5BcyIsIG51bGwsIDAsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfSW5pdFBhcmFtcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFBhcmFtVmFsdWUoKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlcnZsZXRNYXBwaW5nRUNsYXNzLCBTZXJ2bGV0TWFwcGluZy5jbGFzcywgIlNlcnZsZXRNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0TWFwcGluZ19VcmxQYXR0ZXJuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmxQYXR0ZXJuIiwgbnVsbCwgMCwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRNYXBwaW5nX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2bGV0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldE1hcHBpbmdfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX1NlcnZsZXRNYXBwaW5ncygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRNYXBwaW5nX1NlcnZsZXQoKSwgdGhpcy5nZXRTZXJ2bGV0KCksIG51bGwsICJzZXJ2bGV0IiwgbnVsbCwgMSwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzZXNzaW9uQ29uZmlnRUNsYXNzLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAiU2Vzc2lvbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2Vzc2lvbkNvbmZpZ19TZXNzaW9uVGltZW91dCgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAic2Vzc2lvblRpbWVvdXQiLCBudWxsLCAwLCAxLCBTZXNzaW9uQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlc3Npb25Db25maWdfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX1Nlc3Npb25Db25maWcoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIFNlc3Npb25Db25maWcuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtaW1lTWFwcGluZ0VDbGFzcywgTWltZU1hcHBpbmcuY2xhc3MsICJNaW1lTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfRXh0ZW5zaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJleHRlbnNpb24iLCBudWxsLCAwLCAxLCBNaW1lTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1pbWVUeXBlIiwgbnVsbCwgMCwgMSwgTWltZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1pbWVNYXBwaW5nX1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIE1pbWVNYXBwaW5nLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2VsY29tZUZpbGVMaXN0RUNsYXNzLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsICJXZWxjb21lRmlsZUxpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlbGNvbWVGaWxlTGlzdF9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfRmlsZUxpc3QoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIFdlbGNvbWVGaWxlTGlzdC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2VsY29tZUZpbGVMaXN0X0ZpbGUoKSwgdGhpcy5nZXRXZWxjb21lRmlsZSgpLCB0aGlzLmdldFdlbGNvbWVGaWxlX0ZpbGVMaXN0KCksICJmaWxlIiwgbnVsbCwgMCwgLTEsIFdlbGNvbWVGaWxlTGlzdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVycm9yUGFnZUVDbGFzcywgRXJyb3JQYWdlLmNsYXNzLCAiRXJyb3JQYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFcnJvclBhZ2VfTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImxvY2F0aW9uIiwgbnVsbCwgMCwgMSwgRXJyb3JQYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFcnJvclBhZ2VfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIEVycm9yUGFnZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRhZ0xpYlJlZkVDbGFzcywgVGFnTGliUmVmLmNsYXNzLCAiVGFnTGliUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJSZWZfVGFnbGliVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YWdsaWJVUkkiLCBudWxsLCAwLCAxLCBUYWdMaWJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYlJlZl9UYWdsaWJMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFnbGliTG9jYXRpb24iLCBudWxsLCAwLCAxLCBUYWdMaWJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFRhZ0xpYlJlZl9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfVGFnTGlicygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgVGFnTGliUmVmLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Moc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICJTZWN1cml0eUNvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3VyaXR5Q29uc3RyYWludF9EaXNwbGF5TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGlzcGxheU5hbWUiLCBudWxsLCAwLCAxLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfQ29uc3RyYWludHMoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKSwgdGhpcy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKSwgdGhpcy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fU2VjQ29uc3RyYWludCgpLCAid2ViUmVzb3VyY2VDb2xsZWN0aW9ucyIsIG51bGwsIDEsIC0xLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9BdXRoQ29uc3RyYWludCgpLCB0aGlzLmdldEF1dGhDb25zdHJhaW50KCksIHRoaXMuZ2V0QXV0aENvbnN0cmFpbnRfU2VjQ29uc3RyYWludCgpLCAiYXV0aENvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKSwgdGhpcy5nZXRVc2VyRGF0YUNvbnN0cmFpbnQoKSwgdGhpcy5nZXRVc2VyRGF0YUNvbnN0cmFpbnRfU2VjQ29uc3RyYWludCgpLCAidXNlckRhdGFDb25zdHJhaW50IiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWVzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGlzcGxheU5hbWUoKSwgbnVsbCwgImRpc3BsYXlOYW1lcyIsIG51bGwsIDAsIC0xLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIldlYlJlc291cmNlQ29sbGVjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1dlYlJlc291cmNlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid2ViUmVzb3VyY2VOYW1lIiwgbnVsbCwgMCwgMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVXJsUGF0dGVybigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJsUGF0dGVybiIsIG51bGwsIDEsIC0xLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSHR0cE1ldGhvZCgpLCB0aGlzLmdldEhUVFBNZXRob2RUeXBlRW51bSgpLCAiaHR0cE1ldGhvZCIsIG51bGwsIDAsIC0xLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9TZWNDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1dlYlJlc291cmNlQ29sbGVjdGlvbnMoKSwgInNlY0NvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VUkxzKCksIHRoaXMuZ2V0VVJMUGF0dGVyblR5cGUoKSwgdGhpcy5nZXRVUkxQYXR0ZXJuVHlwZV9SZXNDb2xsZWN0aW9uKCksICJVUkxzIiwgbnVsbCwgMCwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fSFRUUHMoKSwgdGhpcy5nZXRIVFRQTWV0aG9kVHlwZSgpLCBudWxsLCAiSFRUUHMiLCBudWxsLCAwLCAtMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXV0aENvbnN0cmFpbnRFQ2xhc3MsIEF1dGhDb25zdHJhaW50LmNsYXNzLCAiQXV0aENvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEF1dGhDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoQ29uc3RyYWludF9Sb2xlcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicm9sZXMiLCBudWxsLCAwLCAtMSwgQXV0aENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF1dGhDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSwgdGhpcy5nZXRTZWN1cml0eUNvbnN0cmFpbnQoKSwgdGhpcy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSwgInNlY0NvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBBdXRoQ29uc3RyYWludC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBBdXRoQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHVzZXJEYXRhQ29uc3RyYWludEVDbGFzcywgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAiVXNlckRhdGFDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRVc2VyRGF0YUNvbnN0cmFpbnRfRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRVc2VyRGF0YUNvbnN0cmFpbnRfVHJhbnNwb3J0R3VhcmFudGVlKCksIHRoaXMuZ2V0VHJhbnNwb3J0R3VhcmFudGVlVHlwZSgpLCAidHJhbnNwb3J0R3VhcmFudGVlIiwgbnVsbCwgMCwgMSwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFVzZXJEYXRhQ29uc3RyYWludF9TZWNDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50KCksIHRoaXMuZ2V0U2VjdXJpdHlDb25zdHJhaW50X1VzZXJEYXRhQ29uc3RyYWludCgpLCAic2VjQ29uc3RyYWludCIsIG51bGwsIDAsIDEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpLCB0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCksIG51bGwsICJkZXNjcmlwdGlvbnMiLCBudWxsLCAwLCAtMSwgVXNlckRhdGFDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobG9naW5Db25maWdFQ2xhc3MsIExvZ2luQ29uZmlnLmNsYXNzLCAiTG9naW5Db25maWciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvZ2luQ29uZmlnX0F1dGhNZXRob2QoKSwgdGhpcy5nZXRBdXRoTWV0aG9kS2luZCgpLCAiYXV0aE1ldGhvZCIsIG51bGwsIDAsIDEsIExvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvZ2luQ29uZmlnX1JlYWxtTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmVhbG1OYW1lIiwgbnVsbCwgMCwgMSwgTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldExvZ2luQ29uZmlnX0F1dGhvcml6YXRpb25NZXRob2QoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImF1dGhvcml6YXRpb25NZXRob2QiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9naW5Db25maWdfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX0xvZ2luQ29uZmlnKCksICJ3ZWJBcHAiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCksIHRoaXMuZ2V0Rm9ybUxvZ2luQ29uZmlnKCksIHRoaXMuZ2V0Rm9ybUxvZ2luQ29uZmlnX0xvZ2luQ29uZmlnKCksICJmb3JtTG9naW5Db25maWciLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGZvcm1Mb2dpbkNvbmZpZ0VDbGFzcywgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCAiRm9ybUxvZ2luQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZm9ybUxvZ2luUGFnZSIsIG51bGwsIDAsIDEsIEZvcm1Mb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1FcnJvclBhZ2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZvcm1FcnJvclBhZ2UiLCBudWxsLCAwLCAxLCBGb3JtTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZvcm1Mb2dpbkNvbmZpZ19Mb2dpbkNvbmZpZygpLCB0aGlzLmdldExvZ2luQ29uZmlnKCksIHRoaXMuZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCksICJsb2dpbkNvbmZpZyIsIG51bGwsIDAsIDEsIEZvcm1Mb2dpbkNvbmZpZy5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGluaXRQYXJhbUVDbGFzcywgSW5pdFBhcmFtLmNsYXNzLCAiSW5pdFBhcmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fUGFyYW1OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbU5hbWUiLCBudWxsLCAwLCAxLCBJbml0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbVZhbHVlIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2ViVHlwZUVDbGFzcywgV2ViVHlwZS5jbGFzcywgIldlYlR5cGUiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHNlcnZsZXRUeXBlRUNsYXNzLCBTZXJ2bGV0VHlwZS5jbGFzcywgIlNlcnZsZXRUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0VHlwZV9DbGFzc05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNsYXNzTmFtZSIsIG51bGwsIDAsIDEsIFNlcnZsZXRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoanNwVHlwZUVDbGFzcywgSlNQVHlwZS5jbGFzcywgIkpTUFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEpTUFR5cGVfSnNwRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAianNwRmlsZSIsIG51bGwsIDAsIDEsIEpTUFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh1cmxQYXR0ZXJuVHlwZUVDbGFzcywgVVJMUGF0dGVyblR5cGUuY2xhc3MsICJVUkxQYXR0ZXJuVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VVJMUGF0dGVyblR5cGVfVXJsUGF0dGVybigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJsUGF0dGVybiIsIG51bGwsIDAsIDEsIFVSTFBhdHRlcm5UeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRVUkxQYXR0ZXJuVHlwZV9SZXNDb2xsZWN0aW9uKCksIHRoaXMuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCksIHRoaXMuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VSTHMoKSwgInJlc0NvbGxlY3Rpb24iLCBudWxsLCAwLCAxLCBVUkxQYXR0ZXJuVHlwZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVOYW1lVHlwZUVDbGFzcywgUm9sZU5hbWVUeXBlLmNsYXNzLCAiUm9sZU5hbWVUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlTmFtZVR5cGVfUm9sZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJvbGVOYW1lIiwgbnVsbCwgMCwgMSwgUm9sZU5hbWVUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod2VsY29tZUZpbGVFQ2xhc3MsIFdlbGNvbWVGaWxlLmNsYXNzLCAiV2VsY29tZUZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlbGNvbWVGaWxlX1dlbGNvbWVGaWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3ZWxjb21lRmlsZSIsIG51bGwsIDAsIDEsIFdlbGNvbWVGaWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWxjb21lRmlsZV9GaWxlTGlzdCgpLCB0aGlzLmdldFdlbGNvbWVGaWxlTGlzdCgpLCB0aGlzLmdldFdlbGNvbWVGaWxlTGlzdF9GaWxlKCksICJmaWxlTGlzdCIsIG51bGwsIDAsIDEsIFdlbGNvbWVGaWxlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXhjZXB0aW9uVHlwZUVycm9yUGFnZUVDbGFzcywgRXhjZXB0aW9uVHlwZUVycm9yUGFnZS5jbGFzcywgIkV4Y2VwdGlvblR5cGVFcnJvclBhZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEV4Y2VwdGlvblR5cGVFcnJvclBhZ2VfRXhjZXB0aW9uVHlwZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImV4Y2VwdGlvblR5cGUiLCBudWxsLCAxLCAxLCBFeGNlcHRpb25UeXBlRXJyb3JQYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZXJyb3JDb2RlRXJyb3JQYWdlRUNsYXNzLCBFcnJvckNvZGVFcnJvclBhZ2UuY2xhc3MsICJFcnJvckNvZGVFcnJvclBhZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVycm9yQ29kZUVycm9yUGFnZV9FcnJvckNvZGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVycm9yQ29kZSIsIG51bGwsIDAsIDEsIEVycm9yQ29kZUVycm9yUGFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGZpbHRlck1hcHBpbmdFQ2xhc3MsIEZpbHRlck1hcHBpbmcuY2xhc3MsICJGaWx0ZXJNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJNYXBwaW5nX1VybFBhdHRlcm4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVybFBhdHRlcm4iLCBudWxsLCAwLCAxLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRGaWx0ZXJNYXBwaW5nX0Rpc3BhdGNoZXJUeXBlKCksIHRoaXMuZ2V0RGlzcGF0Y2hlclR5cGUoKSwgImRpc3BhdGNoZXJUeXBlIiwgbnVsbCwgMCwgNCwgRmlsdGVyTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyTWFwcGluZ19GaWx0ZXIoKSwgdGhpcy5nZXRGaWx0ZXIoKSwgbnVsbCwgImZpbHRlciIsIG51bGwsIDEsIDEsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlck1hcHBpbmdfU2VydmxldCgpLCB0aGlzLmdldFNlcnZsZXQoKSwgbnVsbCwgInNlcnZsZXQiLCBudWxsLCAwLCAxLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZmlsdGVyRUNsYXNzLCBGaWx0ZXIuY2xhc3MsICJGaWx0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpbHRlcl9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJfSW5pdFBhcmFtcygpLCB0aGlzLmdldEluaXRQYXJhbSgpLCBudWxsLCAiaW5pdFBhcmFtcyIsIG51bGwsIDAsIC0xLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlcl9GaWx0ZXJDbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImZpbHRlckNsYXNzIiwgbnVsbCwgMSwgMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJfSW5pdFBhcmFtVmFsdWVzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UGFyYW1WYWx1ZSgpLCBudWxsLCAiaW5pdFBhcmFtVmFsdWVzIiwgbnVsbCwgMCwgLTEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcywgTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0LmNsYXNzLCAiTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCksIHRoaXMuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmcoKSwgbnVsbCwgImxvY2FsRW5jb2RpbmdNYXBwaW5ncyIsIG51bGwsIDEsIC0xLCBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhsb2NhbEVuY29kaW5nTWFwcGluZ0VDbGFzcywgTG9jYWxFbmNvZGluZ01hcHBpbmcuY2xhc3MsICJMb2NhbEVuY29kaW5nTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfTG9jYWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsb2NhbGUiLCBudWxsLCAwLCAxLCBMb2NhbEVuY29kaW5nTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdfRW5jb2RpbmcoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVuY29kaW5nIiwgbnVsbCwgMCwgMSwgTG9jYWxFbmNvZGluZ01hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhodHRwTWV0aG9kVHlwZUVDbGFzcywgSFRUUE1ldGhvZFR5cGUuY2xhc3MsICJIVFRQTWV0aG9kVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SFRUUE1ldGhvZFR5cGVfSHR0cE1ldGhvZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaHR0cE1ldGhvZCIsIG51bGwsIDAsIDEsIEhUVFBNZXRob2RUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bShyZXNBdXRoU2VydmxldFR5cGVFRW51bSwgUmVzQXV0aFNlcnZsZXRUeXBlLmNsYXNzLCAiUmVzQXV0aFNlcnZsZXRUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChyZXNBdXRoU2VydmxldFR5cGVFRW51bSwgUmVzQXV0aFNlcnZsZXRUeXBlLkNPTlRBSU5FUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHJlc0F1dGhTZXJ2bGV0VHlwZUVFbnVtLCBSZXNBdXRoU2VydmxldFR5cGUuU0VSVkxFVF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5jbGFzcywgIkhUVFBNZXRob2RUeXBlRW51bSIpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5HRVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlBPU1RfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlBVVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uREVMRVRFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5IRUFEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5PUFRJT05TX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5UUkFDRV9MSVRFUkFMKTsKLQkJLy9XRUJEQVYgc3VwcG9ydAotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5BQ0tfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkFDTF9MSVRFUkFMKTsgCi0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkJBU0VMSU5FX0NPTlRST0xfTElURVJBTCk7IAotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5CSU5EX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5CWUVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkNBTkNFTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uQ0hFQ0tJTl9MSVRFUkFMKTsgCi0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkNIRUNLT1VUX0xJVEVSQUwpOyAKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uQ09QWV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uRVJST1JSRVNQT05TRV9MSVRFUkFMKTsgCi0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLklORk9fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLklOVklURV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTEFCRUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkxPQ0tfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLk1FUkdFX0xJVEVSQUwpOyAKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTUVTU0FHRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTUtBQ1RJVklUWV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTUtDT0xfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLk1LV09SS1NQQUNFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5NT1ZFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5OT1RJRllfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlBSQUNLX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5QUk9QRklORF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uUFJPUFBBVENIX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5QUk9WSVNJT05BTFJFU1BPTlNFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5QVUJMSVNIX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5SRUJJTkRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlJFRElSRUNUUkVTUE9OU0VfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlJFR0lTVEVSX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5SRVBPUlRfTElURVJBTCk7IAotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5SRVFVRVNUX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5SRVNQT05TRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uU0VBUkNIX0xJVEVSQUwpOyAKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uU1VDQ0VTU1JFU1BPTlNFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5VTkJJTkRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlVOQ0hFQ0tPVVRfTElURVJBTCk7IAotCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5VTkxPQ0tfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlVQREFURV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uVkVSU0lPTl9DT05UUk9MX0xJVEVSQUwpOyAKLQotCisJCWJvb2xlYW4gaGFzTG9jayA9IGZhbHNlOworCQl0cnkgeworCQkJaGFzTG9jayA9IEoyRUVJbml0LmFxdWlyZUluaXRpYWxpemVQYWNrYWdlQ29udGVudHNMb2NrKCk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9CQkKIAkJCi0JCQotCQlpbml0RUVudW0odHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtLCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLmNsYXNzLCAiVHJhbnNwb3J0R3VhcmFudGVlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtLCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLk5PTkVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuSU5URUdSQUxfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuQ09ORklERU5USUFMX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5jbGFzcywgIkRpc3BhdGNoZXJUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5GT1JXQVJEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuSU5DTFVERV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRpc3BhdGNoZXJUeXBlRUVudW0sIERpc3BhdGNoZXJUeXBlLlJFUVVFU1RfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5FUlJPUl9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oYXV0aE1ldGhvZEtpbmRFRW51bSwgQXV0aE1ldGhvZEtpbmQuY2xhc3MsICJBdXRoTWV0aG9kS2luZCIpOwotCQlhZGRFRW51bUxpdGVyYWwoYXV0aE1ldGhvZEtpbmRFRW51bSwgQXV0aE1ldGhvZEtpbmQuVU5TUEVDSUZJRURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChhdXRoTWV0aG9kS2luZEVFbnVtLCBBdXRoTWV0aG9kS2luZC5CQVNJQ19MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGF1dGhNZXRob2RLaW5kRUVudW0sIEF1dGhNZXRob2RLaW5kLkRJR0VTVF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGF1dGhNZXRob2RLaW5kRUVudW0sIEF1dGhNZXRob2RLaW5kLkZPUk1fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChhdXRoTWV0aG9kS2luZEVFbnVtLCBBdXRoTWV0aG9kS2luZC5DTElFTlRfQ0VSVF9MSVRFUkFMKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCXRyeXsKKwkJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJCXdlYkFwcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEpORElFbnZSZWZzR3JvdXAoKSk7CisJCQljb250ZXh0UGFyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCXNlcnZsZXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKKwkJCXNlcnZsZXRNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQlzZXNzaW9uQ29uZmlnRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQltaW1lTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJd2VsY29tZUZpbGVMaXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQllcnJvclBhZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCXRhZ0xpYlJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJc2VjdXJpdHlDb25zdHJhaW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCWF1dGhDb25zdHJhaW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQl1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCWxvZ2luQ29uZmlnRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQlmb3JtTG9naW5Db25maWdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCWluaXRQYXJhbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJd2ViVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJc2VydmxldFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXZWJUeXBlKCkpOworCQkJanNwVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdlYlR5cGUoKSk7CisJCQl1cmxQYXR0ZXJuVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJcm9sZU5hbWVUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQl3ZWxjb21lRmlsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJZXhjZXB0aW9uVHlwZUVycm9yUGFnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVycm9yUGFnZSgpKTsKKwkJCWVycm9yQ29kZUVycm9yUGFnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEVycm9yUGFnZSgpKTsKKwkJCWZpbHRlck1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCWZpbHRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOworCQkJbG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQlsb2NhbEVuY29kaW5nTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJaHR0cE1ldGhvZFR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkKKwkJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCQlpbml0RUNsYXNzKHdlYkFwcEVDbGFzcywgV2ViQXBwLmNsYXNzLCAiV2ViQXBwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJBcHBfRGlzdHJpYnV0YWJsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRpc3RyaWJ1dGFibGUiLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViQXBwX1ZlcnNpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Db250ZXh0cygpLCB0aGlzLmdldENvbnRleHRQYXJhbSgpLCB0aGlzLmdldENvbnRleHRQYXJhbV9XZWJBcHAoKSwgImNvbnRleHRzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0Vycm9yUGFnZXMoKSwgdGhpcy5nZXRFcnJvclBhZ2UoKSwgdGhpcy5nZXRFcnJvclBhZ2VfV2ViQXBwKCksICJlcnJvclBhZ2VzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0ZpbGVMaXN0KCksIHRoaXMuZ2V0V2VsY29tZUZpbGVMaXN0KCksIHRoaXMuZ2V0V2VsY29tZUZpbGVMaXN0X1dlYkFwcCgpLCAiZmlsZUxpc3QiLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9UYWdMaWJzKCksIHRoaXMuZ2V0VGFnTGliUmVmKCksIHRoaXMuZ2V0VGFnTGliUmVmX1dlYkFwcCgpLCAidGFnTGlicyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Db25zdHJhaW50cygpLCB0aGlzLmdldFNlY3VyaXR5Q29uc3RyYWludCgpLCB0aGlzLmdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJBcHAoKSwgImNvbnN0cmFpbnRzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0xvZ2luQ29uZmlnKCksIHRoaXMuZ2V0TG9naW5Db25maWcoKSwgdGhpcy5nZXRMb2dpbkNvbmZpZ19XZWJBcHAoKSwgImxvZ2luQ29uZmlnIiwgbnVsbCwgMCwgMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTWltZU1hcHBpbmdzKCksIHRoaXMuZ2V0TWltZU1hcHBpbmcoKSwgdGhpcy5nZXRNaW1lTWFwcGluZ19XZWJBcHAoKSwgIm1pbWVNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZXNzaW9uQ29uZmlnKCksIHRoaXMuZ2V0U2Vzc2lvbkNvbmZpZygpLCB0aGlzLmdldFNlc3Npb25Db25maWdfV2ViQXBwKCksICJzZXNzaW9uQ29uZmlnIiwgbnVsbCwgMCwgMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfU2VydmxldE1hcHBpbmdzKCksIHRoaXMuZ2V0U2VydmxldE1hcHBpbmcoKSwgdGhpcy5nZXRTZXJ2bGV0TWFwcGluZ19XZWJBcHAoKSwgInNlcnZsZXRNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9TZXJ2bGV0cygpLCB0aGlzLmdldFNlcnZsZXQoKSwgdGhpcy5nZXRTZXJ2bGV0X1dlYkFwcCgpLCAic2VydmxldHMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfU2VjdXJpdHlSb2xlcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFNlY3VyaXR5Um9sZSgpLCBudWxsLCAic2VjdXJpdHlSb2xlcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9GaWx0ZXJzKCksIHRoaXMuZ2V0RmlsdGVyKCksIG51bGwsICJmaWx0ZXJzIiwgbnVsbCwgMCwgLTEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX0ZpbHRlck1hcHBpbmdzKCksIHRoaXMuZ2V0RmlsdGVyTWFwcGluZygpLCBudWxsLCAiZmlsdGVyTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTGlzdGVuZXJzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0TGlzdGVuZXIoKSwgbnVsbCwgImxpc3RlbmVycyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Db250ZXh0UGFyYW1zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UGFyYW1WYWx1ZSgpLCBudWxsLCAiY29udGV4dFBhcmFtcyIsIG51bGwsIDAsIC0xLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYkFwcF9Kc3BDb25maWcoKSwgdGhlSnNwUGFja2FnZS5nZXRKU1BDb25maWcoKSwgbnVsbCwgImpzcENvbmZpZyIsIG51bGwsIDAsIDEsIFdlYkFwcC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKSwgbnVsbCwgIm1lc3NhZ2VEZXN0aW5hdGlvbnMiLCBudWxsLCAwLCAtMSwgV2ViQXBwLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJBcHBfTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCksIHRoaXMuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCksIG51bGwsICJsb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QiLCBudWxsLCAwLCAxLCBXZWJBcHAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoY29udGV4dFBhcmFtRUNsYXNzLCBDb250ZXh0UGFyYW0uY2xhc3MsICJDb250ZXh0UGFyYW0iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbnRleHRQYXJhbV9QYXJhbU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcmFtTmFtZSIsIG51bGwsIDAsIDEsIENvbnRleHRQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGV4dFBhcmFtX1BhcmFtVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcmFtVmFsdWUiLCBudWxsLCAwLCAxLCBDb250ZXh0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldENvbnRleHRQYXJhbV9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBDb250ZXh0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldENvbnRleHRQYXJhbV9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfQ29udGV4dHMoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIENvbnRleHRQYXJhbS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhzZXJ2bGV0RUNsYXNzLCBTZXJ2bGV0LmNsYXNzLCAiU2VydmxldCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldF9TZXJ2bGV0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmxldE5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2bGV0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0X0xvYWRPblN0YXJ0dXAoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnRlZ2VyT2JqZWN0KCksICJsb2FkT25TdGFydHVwIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0X1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9TZXJ2bGV0cygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgU2VydmxldC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9XZWJUeXBlKCksIHRoaXMuZ2V0V2ViVHlwZSgpLCBudWxsLCAid2ViVHlwZSIsIG51bGwsIDEsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfUGFyYW1zKCksIHRoaXMuZ2V0SW5pdFBhcmFtKCksIG51bGwsICJwYXJhbXMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmxldF9TZWN1cml0eVJvbGVSZWZzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0U2VjdXJpdHlSb2xlUmVmKCksIG51bGwsICJzZWN1cml0eVJvbGVSZWZzIiwgbnVsbCwgMCwgLTEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfUnVuQXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRSdW5Bc1NwZWNpZmllZElkZW50aXR5KCksIG51bGwsICJydW5BcyIsIG51bGwsIDAsIDEsIFNlcnZsZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRfSW5pdFBhcmFtcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFBhcmFtVmFsdWUoKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgU2VydmxldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhzZXJ2bGV0TWFwcGluZ0VDbGFzcywgU2VydmxldE1hcHBpbmcuY2xhc3MsICJTZXJ2bGV0TWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmxldE1hcHBpbmdfVXJsUGF0dGVybigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidXJsUGF0dGVybiIsIG51bGwsIDAsIDEsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0TWFwcGluZ19OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgU2VydmxldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZsZXRNYXBwaW5nX1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9TZXJ2bGV0TWFwcGluZ3MoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2bGV0TWFwcGluZ19TZXJ2bGV0KCksIHRoaXMuZ2V0U2VydmxldCgpLCBudWxsLCAic2VydmxldCIsIG51bGwsIDEsIDEsIFNlcnZsZXRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHNlc3Npb25Db25maWdFQ2xhc3MsIFNlc3Npb25Db25maWcuY2xhc3MsICJTZXNzaW9uQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZXNzaW9uQ29uZmlnX1Nlc3Npb25UaW1lb3V0KCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJzZXNzaW9uVGltZW91dCIsIG51bGwsIDAsIDEsIFNlc3Npb25Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2Vzc2lvbkNvbmZpZ19XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfU2Vzc2lvbkNvbmZpZygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgU2Vzc2lvbkNvbmZpZy5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhtaW1lTWFwcGluZ0VDbGFzcywgTWltZU1hcHBpbmcuY2xhc3MsICJNaW1lTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfRXh0ZW5zaW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJleHRlbnNpb24iLCBudWxsLCAwLCAxLCBNaW1lTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWltZU1hcHBpbmdfTWltZVR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1pbWVUeXBlIiwgbnVsbCwgMCwgMSwgTWltZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldE1pbWVNYXBwaW5nX1dlYkFwcCgpLCB0aGlzLmdldFdlYkFwcCgpLCB0aGlzLmdldFdlYkFwcF9NaW1lTWFwcGluZ3MoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIE1pbWVNYXBwaW5nLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHdlbGNvbWVGaWxlTGlzdEVDbGFzcywgV2VsY29tZUZpbGVMaXN0LmNsYXNzLCAiV2VsY29tZUZpbGVMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWxjb21lRmlsZUxpc3RfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX0ZpbGVMaXN0KCksICJ3ZWJBcHAiLCBudWxsLCAwLCAxLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlbGNvbWVGaWxlTGlzdF9GaWxlKCksIHRoaXMuZ2V0V2VsY29tZUZpbGUoKSwgdGhpcy5nZXRXZWxjb21lRmlsZV9GaWxlTGlzdCgpLCAiZmlsZSIsIG51bGwsIDAsIC0xLCBXZWxjb21lRmlsZUxpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoZXJyb3JQYWdlRUNsYXNzLCBFcnJvclBhZ2UuY2xhc3MsICJFcnJvclBhZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVycm9yUGFnZV9Mb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYXRpb24iLCBudWxsLCAwLCAxLCBFcnJvclBhZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEVycm9yUGFnZV9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfRXJyb3JQYWdlcygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgRXJyb3JQYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHRhZ0xpYlJlZkVDbGFzcywgVGFnTGliUmVmLmNsYXNzLCAiVGFnTGliUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRUYWdMaWJSZWZfVGFnbGliVVJJKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ0YWdsaWJVUkkiLCBudWxsLCAwLCAxLCBUYWdMaWJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFRhZ0xpYlJlZl9UYWdsaWJMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGFnbGliTG9jYXRpb24iLCBudWxsLCAwLCAxLCBUYWdMaWJSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFRhZ0xpYlJlZl9XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfVGFnTGlicygpLCAid2ViQXBwIiwgbnVsbCwgMCwgMSwgVGFnTGliUmVmLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHNlY3VyaXR5Q29uc3RyYWludEVDbGFzcywgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAiU2VjdXJpdHlDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfRGlzcGxheU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRpc3BsYXlOYW1lIiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwKCksIHRoaXMuZ2V0V2ViQXBwX0NvbnN0cmFpbnRzKCksICJ3ZWJBcHAiLCBudWxsLCAwLCAxLCBTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlY3VyaXR5Q29uc3RyYWludF9XZWJSZXNvdXJjZUNvbGxlY3Rpb25zKCksIHRoaXMuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uKCksIHRoaXMuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1NlY0NvbnN0cmFpbnQoKSwgIndlYlJlc291cmNlQ29sbGVjdGlvbnMiLCBudWxsLCAxLCAtMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSwgdGhpcy5nZXRBdXRoQ29uc3RyYWludCgpLCB0aGlzLmdldEF1dGhDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSwgImF1dGhDb25zdHJhaW50IiwgbnVsbCwgMCwgMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZWN1cml0eUNvbnN0cmFpbnRfVXNlckRhdGFDb25zdHJhaW50KCksIHRoaXMuZ2V0VXNlckRhdGFDb25zdHJhaW50KCksIHRoaXMuZ2V0VXNlckRhdGFDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSwgInVzZXJEYXRhQ29uc3RyYWludCIsIG51bGwsIDAsIDEsIFNlY3VyaXR5Q29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lcygpLCB0aGVDb21tb25QYWNrYWdlLmdldERpc3BsYXlOYW1lKCksIG51bGwsICJkaXNwbGF5TmFtZXMiLCBudWxsLCAwLCAtMSwgU2VjdXJpdHlDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHdlYlJlc291cmNlQ29sbGVjdGlvbkVDbGFzcywgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAiV2ViUmVzb3VyY2VDb2xsZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fV2ViUmVzb3VyY2VOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3ZWJSZXNvdXJjZU5hbWUiLCBudWxsLCAwLCAxLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9VcmxQYXR0ZXJuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmxQYXR0ZXJuIiwgbnVsbCwgMSwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IdHRwTWV0aG9kKCksIHRoaXMuZ2V0SFRUUE1ldGhvZFR5cGVFbnVtKCksICJodHRwTWV0aG9kIiwgbnVsbCwgMCwgLTEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1NlY0NvbnN0cmFpbnQoKSwgdGhpcy5nZXRTZWN1cml0eUNvbnN0cmFpbnQoKSwgdGhpcy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfV2ViUmVzb3VyY2VDb2xsZWN0aW9ucygpLCAic2VjQ29uc3RyYWludCIsIG51bGwsIDAsIDEsIFdlYlJlc291cmNlQ29sbGVjdGlvbi5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX1VSTHMoKSwgdGhpcy5nZXRVUkxQYXR0ZXJuVHlwZSgpLCB0aGlzLmdldFVSTFBhdHRlcm5UeXBlX1Jlc0NvbGxlY3Rpb24oKSwgIlVSTHMiLCBudWxsLCAwLCAtMSwgV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYlJlc291cmNlQ29sbGVjdGlvbl9IVFRQcygpLCB0aGlzLmdldEhUVFBNZXRob2RUeXBlKCksIG51bGwsICJIVFRQcyIsIG51bGwsIDAsIC0xLCBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoYXV0aENvbnN0cmFpbnRFQ2xhc3MsIEF1dGhDb25zdHJhaW50LmNsYXNzLCAiQXV0aENvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEF1dGhDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRoQ29uc3RyYWludF9Sb2xlcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicm9sZXMiLCBudWxsLCAwLCAtMSwgQXV0aENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEF1dGhDb25zdHJhaW50X1NlY0NvbnN0cmFpbnQoKSwgdGhpcy5nZXRTZWN1cml0eUNvbnN0cmFpbnQoKSwgdGhpcy5nZXRTZWN1cml0eUNvbnN0cmFpbnRfQXV0aENvbnN0cmFpbnQoKSwgInNlY0NvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBBdXRoQ29uc3RyYWludC5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXV0aENvbnN0cmFpbnRfRGVzY3JpcHRpb25zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSwgbnVsbCwgImRlc2NyaXB0aW9ucyIsIG51bGwsIDAsIC0xLCBBdXRoQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyh1c2VyRGF0YUNvbnN0cmFpbnRFQ2xhc3MsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIlVzZXJEYXRhQ29uc3RyYWludCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VXNlckRhdGFDb25zdHJhaW50X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VXNlckRhdGFDb25zdHJhaW50X1RyYW5zcG9ydEd1YXJhbnRlZSgpLCB0aGlzLmdldFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUoKSwgInRyYW5zcG9ydEd1YXJhbnRlZSIsIG51bGwsIDAsIDEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRVc2VyRGF0YUNvbnN0cmFpbnRfU2VjQ29uc3RyYWludCgpLCB0aGlzLmdldFNlY3VyaXR5Q29uc3RyYWludCgpLCB0aGlzLmdldFNlY3VyaXR5Q29uc3RyYWludF9Vc2VyRGF0YUNvbnN0cmFpbnQoKSwgInNlY0NvbnN0cmFpbnQiLCBudWxsLCAwLCAxLCBVc2VyRGF0YUNvbnN0cmFpbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFVzZXJEYXRhQ29uc3RyYWludF9EZXNjcmlwdGlvbnMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvbigpLCBudWxsLCAiZGVzY3JpcHRpb25zIiwgbnVsbCwgMCwgLTEsIFVzZXJEYXRhQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhsb2dpbkNvbmZpZ0VDbGFzcywgTG9naW5Db25maWcuY2xhc3MsICJMb2dpbkNvbmZpZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9naW5Db25maWdfQXV0aE1ldGhvZCgpLCB0aGlzLmdldEF1dGhNZXRob2RLaW5kKCksICJhdXRoTWV0aG9kIiwgbnVsbCwgMCwgMSwgTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9naW5Db25maWdfUmVhbG1OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJyZWFsbU5hbWUiLCBudWxsLCAwLCAxLCBMb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TG9naW5Db25maWdfQXV0aG9yaXphdGlvbk1ldGhvZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiYXV0aG9yaXphdGlvbk1ldGhvZCIsIG51bGwsIDAsIDEsIExvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRMb2dpbkNvbmZpZ19XZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHAoKSwgdGhpcy5nZXRXZWJBcHBfTG9naW5Db25maWcoKSwgIndlYkFwcCIsIG51bGwsIDAsIDEsIExvZ2luQ29uZmlnLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRMb2dpbkNvbmZpZ19Gb3JtTG9naW5Db25maWcoKSwgdGhpcy5nZXRGb3JtTG9naW5Db25maWcoKSwgdGhpcy5nZXRGb3JtTG9naW5Db25maWdfTG9naW5Db25maWcoKSwgImZvcm1Mb2dpbkNvbmZpZyIsIG51bGwsIDAsIDEsIExvZ2luQ29uZmlnLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGZvcm1Mb2dpbkNvbmZpZ0VDbGFzcywgRm9ybUxvZ2luQ29uZmlnLmNsYXNzLCAiRm9ybUxvZ2luQ29uZmlnIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRGb3JtTG9naW5Db25maWdfRm9ybUxvZ2luUGFnZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZm9ybUxvZ2luUGFnZSIsIG51bGwsIDAsIDEsIEZvcm1Mb2dpbkNvbmZpZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Rm9ybUxvZ2luQ29uZmlnX0Zvcm1FcnJvclBhZ2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZvcm1FcnJvclBhZ2UiLCBudWxsLCAwLCAxLCBGb3JtTG9naW5Db25maWcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEZvcm1Mb2dpbkNvbmZpZ19Mb2dpbkNvbmZpZygpLCB0aGlzLmdldExvZ2luQ29uZmlnKCksIHRoaXMuZ2V0TG9naW5Db25maWdfRm9ybUxvZ2luQ29uZmlnKCksICJsb2dpbkNvbmZpZyIsIG51bGwsIDAsIDEsIEZvcm1Mb2dpbkNvbmZpZy5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhpbml0UGFyYW1FQ2xhc3MsIEluaXRQYXJhbS5jbGFzcywgIkluaXRQYXJhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1OYW1lIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1WYWx1ZSIsIG51bGwsIDAsIDEsIEluaXRQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIEluaXRQYXJhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyh3ZWJUeXBlRUNsYXNzLCBXZWJUeXBlLmNsYXNzLCAiV2ViVHlwZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHNlcnZsZXRUeXBlRUNsYXNzLCBTZXJ2bGV0VHlwZS5jbGFzcywgIlNlcnZsZXRUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0VHlwZV9DbGFzc05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNsYXNzTmFtZSIsIG51bGwsIDAsIDEsIFNlcnZsZXRUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGpzcFR5cGVFQ2xhc3MsIEpTUFR5cGUuY2xhc3MsICJKU1BUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRKU1BUeXBlX0pzcEZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImpzcEZpbGUiLCBudWxsLCAwLCAxLCBKU1BUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHVybFBhdHRlcm5UeXBlRUNsYXNzLCBVUkxQYXR0ZXJuVHlwZS5jbGFzcywgIlVSTFBhdHRlcm5UeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRVUkxQYXR0ZXJuVHlwZV9VcmxQYXR0ZXJuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmxQYXR0ZXJuIiwgbnVsbCwgMCwgMSwgVVJMUGF0dGVyblR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFVSTFBhdHRlcm5UeXBlX1Jlc0NvbGxlY3Rpb24oKSwgdGhpcy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKSwgdGhpcy5nZXRXZWJSZXNvdXJjZUNvbGxlY3Rpb25fVVJMcygpLCAicmVzQ29sbGVjdGlvbiIsIG51bGwsIDAsIDEsIFVSTFBhdHRlcm5UeXBlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHJvbGVOYW1lVHlwZUVDbGFzcywgUm9sZU5hbWVUeXBlLmNsYXNzLCAiUm9sZU5hbWVUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlTmFtZVR5cGVfUm9sZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInJvbGVOYW1lIiwgbnVsbCwgMCwgMSwgUm9sZU5hbWVUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHdlbGNvbWVGaWxlRUNsYXNzLCBXZWxjb21lRmlsZS5jbGFzcywgIldlbGNvbWVGaWxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWxjb21lRmlsZV9XZWxjb21lRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid2VsY29tZUZpbGUiLCBudWxsLCAwLCAxLCBXZWxjb21lRmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2VsY29tZUZpbGVfRmlsZUxpc3QoKSwgdGhpcy5nZXRXZWxjb21lRmlsZUxpc3QoKSwgdGhpcy5nZXRXZWxjb21lRmlsZUxpc3RfRmlsZSgpLCAiZmlsZUxpc3QiLCBudWxsLCAwLCAxLCBXZWxjb21lRmlsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhleGNlcHRpb25UeXBlRXJyb3JQYWdlRUNsYXNzLCBFeGNlcHRpb25UeXBlRXJyb3JQYWdlLmNsYXNzLCAiRXhjZXB0aW9uVHlwZUVycm9yUGFnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXhjZXB0aW9uVHlwZUVycm9yUGFnZV9FeGNlcHRpb25UeXBlKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiZXhjZXB0aW9uVHlwZSIsIG51bGwsIDEsIDEsIEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoZXJyb3JDb2RlRXJyb3JQYWdlRUNsYXNzLCBFcnJvckNvZGVFcnJvclBhZ2UuY2xhc3MsICJFcnJvckNvZGVFcnJvclBhZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEVycm9yQ29kZUVycm9yUGFnZV9FcnJvckNvZGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVycm9yQ29kZSIsIG51bGwsIDAsIDEsIEVycm9yQ29kZUVycm9yUGFnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhmaWx0ZXJNYXBwaW5nRUNsYXNzLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAiRmlsdGVyTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyTWFwcGluZ19VcmxQYXR0ZXJuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmxQYXR0ZXJuIiwgbnVsbCwgMCwgMSwgRmlsdGVyTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyTWFwcGluZ19EaXNwYXRjaGVyVHlwZSgpLCB0aGlzLmdldERpc3BhdGNoZXJUeXBlKCksICJkaXNwYXRjaGVyVHlwZSIsIG51bGwsIDAsIDQsIEZpbHRlck1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlck1hcHBpbmdfRmlsdGVyKCksIHRoaXMuZ2V0RmlsdGVyKCksIG51bGwsICJmaWx0ZXIiLCBudWxsLCAxLCAxLCBGaWx0ZXJNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRGaWx0ZXJNYXBwaW5nX1NlcnZsZXQoKSwgdGhpcy5nZXRTZXJ2bGV0KCksIG51bGwsICJzZXJ2bGV0IiwgbnVsbCwgMCwgMSwgRmlsdGVyTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhmaWx0ZXJFQ2xhc3MsIEZpbHRlci5jbGFzcywgIkZpbHRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RmlsdGVyX05hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlcl9Jbml0UGFyYW1zKCksIHRoaXMuZ2V0SW5pdFBhcmFtKCksIG51bGwsICJpbml0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIEZpbHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0RmlsdGVyX0ZpbHRlckNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiZmlsdGVyQ2xhc3MiLCBudWxsLCAxLCAxLCBGaWx0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEZpbHRlcl9Jbml0UGFyYW1WYWx1ZXMoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRQYXJhbVZhbHVlKCksIG51bGwsICJpbml0UGFyYW1WYWx1ZXMiLCBudWxsLCAwLCAtMSwgRmlsdGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEVDbGFzcywgTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0LmNsYXNzLCAiTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RfTG9jYWxFbmNvZGluZ01hcHBpbmdzKCksIHRoaXMuZ2V0TG9jYWxFbmNvZGluZ01hcHBpbmcoKSwgbnVsbCwgImxvY2FsRW5jb2RpbmdNYXBwaW5ncyIsIG51bGwsIDEsIC0xLCBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MobG9jYWxFbmNvZGluZ01hcHBpbmdFQ2xhc3MsIExvY2FsRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCAiTG9jYWxFbmNvZGluZ01hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldExvY2FsRW5jb2RpbmdNYXBwaW5nX0xvY2FsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibG9jYWxlIiwgbnVsbCwgMCwgMSwgTG9jYWxFbmNvZGluZ01hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldExvY2FsRW5jb2RpbmdNYXBwaW5nX0VuY29kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJlbmNvZGluZyIsIG51bGwsIDAsIDEsIExvY2FsRW5jb2RpbmdNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGh0dHBNZXRob2RUeXBlRUNsYXNzLCBIVFRQTWV0aG9kVHlwZS5jbGFzcywgIkhUVFBNZXRob2RUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRIVFRQTWV0aG9kVHlwZV9IdHRwTWV0aG9kKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJodHRwTWV0aG9kIiwgbnVsbCwgMCwgMSwgSFRUUE1ldGhvZFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCisJCQlpbml0RUVudW0ocmVzQXV0aFNlcnZsZXRUeXBlRUVudW0sIFJlc0F1dGhTZXJ2bGV0VHlwZS5jbGFzcywgIlJlc0F1dGhTZXJ2bGV0VHlwZSIpOyAvLyROT04tTkxTLTEkCisJCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aFNlcnZsZXRUeXBlRUVudW0sIFJlc0F1dGhTZXJ2bGV0VHlwZS5DT05UQUlORVJfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwocmVzQXV0aFNlcnZsZXRUeXBlRUVudW0sIFJlc0F1dGhTZXJ2bGV0VHlwZS5TRVJWTEVUX0xJVEVSQUwpOworCQorCQkJaW5pdEVFbnVtKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uY2xhc3MsICJIVFRQTWV0aG9kVHlwZUVudW0iKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uR0VUX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uUE9TVF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlBVVF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkRFTEVURV9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLkhFQURfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5PUFRJT05TX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uVFJBQ0VfTElURVJBTCk7CisJCQkvL1dFQkRBViBzdXBwb3J0CisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5BQ0tfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5BQ0xfTElURVJBTCk7IAorCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uQkFTRUxJTkVfQ09OVFJPTF9MSVRFUkFMKTsgCisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5CSU5EX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uQllFX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uQ0FOQ0VMX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uQ0hFQ0tJTl9MSVRFUkFMKTsgCisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5DSEVDS09VVF9MSVRFUkFMKTsgCisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5DT1BZX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uRVJST1JSRVNQT05TRV9MSVRFUkFMKTsgCisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5JTkZPX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uSU5WSVRFX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTEFCRUxfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5MT0NLX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTUVSR0VfTElURVJBTCk7IAorCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTUVTU0FHRV9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLk1LQUNUSVZJVFlfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5NS0NPTF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLk1LV09SS1NQQUNFX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uTU9WRV9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLk5PVElGWV9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlBSQUNLX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uUFJPUEZJTkRfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5QUk9QUEFUQ0hfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5QUk9WSVNJT05BTFJFU1BPTlNFX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uUFVCTElTSF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlJFQklORF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlJFRElSRUNUUkVTUE9OU0VfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5SRUdJU1RFUl9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChodHRwTWV0aG9kVHlwZUVudW1FRW51bSwgSFRUUE1ldGhvZFR5cGVFbnVtLlJFUE9SVF9MSVRFUkFMKTsgCisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5SRVFVRVNUX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uUkVTUE9OU0VfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5TRUFSQ0hfTElURVJBTCk7IAorCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uU1VDQ0VTU1JFU1BPTlNFX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uVU5CSU5EX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGh0dHBNZXRob2RUeXBlRW51bUVFbnVtLCBIVFRQTWV0aG9kVHlwZUVudW0uVU5DSEVDS09VVF9MSVRFUkFMKTsgCisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5VTkxPQ0tfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5VUERBVEVfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoaHR0cE1ldGhvZFR5cGVFbnVtRUVudW0sIEhUVFBNZXRob2RUeXBlRW51bS5WRVJTSU9OX0NPTlRST0xfTElURVJBTCk7IAorCQorCQorCQkJCisJCQkKKwkJCWluaXRFRW51bSh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuY2xhc3MsICJUcmFuc3BvcnRHdWFyYW50ZWVUeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuTk9ORV9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbCh0cmFuc3BvcnRHdWFyYW50ZWVUeXBlRUVudW0sIFRyYW5zcG9ydEd1YXJhbnRlZVR5cGUuSU5URUdSQUxfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwodHJhbnNwb3J0R3VhcmFudGVlVHlwZUVFbnVtLCBUcmFuc3BvcnRHdWFyYW50ZWVUeXBlLkNPTkZJREVOVElBTF9MSVRFUkFMKTsKKwkKKwkJCWluaXRFRW51bShkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5jbGFzcywgIkRpc3BhdGNoZXJUeXBlIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5GT1JXQVJEX0xJVEVSQUwpOworCQkJYWRkRUVudW1MaXRlcmFsKGRpc3BhdGNoZXJUeXBlRUVudW0sIERpc3BhdGNoZXJUeXBlLklOQ0xVREVfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoZGlzcGF0Y2hlclR5cGVFRW51bSwgRGlzcGF0Y2hlclR5cGUuUkVRVUVTVF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChkaXNwYXRjaGVyVHlwZUVFbnVtLCBEaXNwYXRjaGVyVHlwZS5FUlJPUl9MSVRFUkFMKTsKKwkKKwkJCWluaXRFRW51bShhdXRoTWV0aG9kS2luZEVFbnVtLCBBdXRoTWV0aG9kS2luZC5jbGFzcywgIkF1dGhNZXRob2RLaW5kIik7IC8vJE5PTi1OTFMtMSQKKwkJCWFkZEVFbnVtTGl0ZXJhbChhdXRoTWV0aG9kS2luZEVFbnVtLCBBdXRoTWV0aG9kS2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChhdXRoTWV0aG9kS2luZEVFbnVtLCBBdXRoTWV0aG9kS2luZC5CQVNJQ19MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChhdXRoTWV0aG9kS2luZEVFbnVtLCBBdXRoTWV0aG9kS2luZC5ESUdFU1RfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoYXV0aE1ldGhvZEtpbmRFRW51bSwgQXV0aE1ldGhvZEtpbmQuRk9STV9MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChhdXRoTWV0aG9kS2luZEVFbnVtLCBBdXRoTWV0aG9kS2luZC5DTElFTlRfQ0VSVF9MSVRFUkFMKTsKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiB9IC8vV2ViYXBwbGljYXRpb25QYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWxjb21lRmlsZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL2ludGVybmFsL2ltcGwvV2VsY29tZUZpbGVJbXBsLmphdmEKaW5kZXggZjdlYzUwZS4uMWJjMTUzNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWxjb21lRmlsZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlSW1wbC5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLkxpdGVyYWxzLldFTENPTUVfRklMRTsKIAl9CkBAIC05Nyw3ICs5OCw3IEBACiAJcHVibGljIHZvaWQgc2V0RmlsZUxpc3QoV2VsY29tZUZpbGVMaXN0IG5ld0ZpbGVMaXN0KSB7CiAJCWlmIChuZXdGaWxlTGlzdCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19GSUxFX0xJU1QgJiYgbmV3RmlsZUxpc3QgIT0gbnVsbCkpIHsKIAkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdGaWxlTGlzdCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwogCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCiAJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7CkBAIC0xMTUsNiArMTE2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19GSUxFX0xJU1Q6CkBAIC0xMzAsNiArMTMyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19GSUxFX0xJU1Q6CkBAIC0xNDMsNiArMTQ2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX0ZJTEVfTElTVDoKQEAgLTE1Niw2ICsxNjAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX1dFTENPTUVfRklMRToKQEAgLTE3MSw2ICsxNzYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19XRUxDT01FX0ZJTEU6CkBAIC0xODgsNiArMTk0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9fV0VMQ09NRV9GSUxFOgpAQCAtMjA1LDYgKzIxMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfX1dFTENPTUVfRklMRToKQEAgLTIxOCwxMSArMjI2LDEyIEBACiAJLyoqCiAJICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHdlbGNvbWVGaWxlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiICh3ZWxjb21lRmlsZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh3ZWxjb21lRmlsZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvaW1wbC9XZWxjb21lRmlsZUxpc3RJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlTGlzdEltcGwuamF2YQppbmRleCA3YWUzMTdhLi4yOWVjNmE3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlTGlzdEltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC9pbXBsL1dlbGNvbWVGaWxlTGlzdEltcGwuamF2YQpAQCAtNDksNiArNDksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MaXRlcmFscy5XRUxDT01FX0ZJTEVfTElTVDsKIAl9CkBAIC04NSw3ICs4Niw3IEBACiAJcHVibGljIHZvaWQgc2V0V2ViQXBwKFdlYkFwcCBuZXdXZWJBcHApIHsKIAkJaWYgKG5ld1dlYkFwcCAhPSBlSW50ZXJuYWxDb250YWluZXIoKSB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFAgJiYgbmV3V2ViQXBwICE9IG51bGwpKSB7CiAJCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3V2ViQXBwKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAogCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CiAJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKIAkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKQEAgLTExMyw2ICsxMTQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUDoKQEAgLTEzMCw2ICsxMzIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUDoKQEAgLTE0NSw2ICsxNDgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQOgpAQCAtMTU4LDYgKzE2Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQOgpAQCAtMTczLDYgKzE3OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUxDT01FX0ZJTEVfTElTVF9fV0VCX0FQUDoKQEAgLTE5MSw2ICsxOTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX0xJU1RfX1dFQl9BUFA6CkBAIC0yMDgsNiArMjE1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19XRUJfQVBQOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vaW50ZXJuYWwvdXRpbC9XZWJhcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL1dlYmFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCBlMGUwMGFmLi5kMDBkNDFmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL1dlYmFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi9pbnRlcm5hbC91dGlsL1dlYmFwcGxpY2F0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtNjAsNiArNjAsNyBAQAogCQkJbW9kZWxQYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSk7CiAJCX0KIAl9CisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewogCQlpZiAodHlwZSA9PSBtb2RlbFBhY2thZ2UpIHsKIAkJCXJldHVybiB0cnVlOwpAQCAtNzEsOTUgKzcyLDEyNSBAQAogCX0KIAogCXByb3RlY3RlZCBXZWJhcHBsaWNhdGlvblN3aXRjaCBzdyA9IG5ldyBXZWJhcHBsaWNhdGlvblN3aXRjaCgpIHsKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZVdlYkFwcChXZWJBcHAgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlV2ViQXBwQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VDb250ZXh0UGFyYW0oQ29udGV4dFBhcmFtIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUNvbnRleHRQYXJhbUFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlRXJyb3JQYWdlKEVycm9yUGFnZSBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVFcnJvclBhZ2VBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoRXhjZXB0aW9uVHlwZUVycm9yUGFnZSBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VFcnJvckNvZGVFcnJvclBhZ2UoRXJyb3JDb2RlRXJyb3JQYWdlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZUFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlV2VsY29tZUZpbGVMaXN0KFdlbGNvbWVGaWxlTGlzdCBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVXZWxjb21lRmlsZUxpc3RBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZVdlbGNvbWVGaWxlKFdlbGNvbWVGaWxlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZVdlbGNvbWVGaWxlQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VUYWdMaWJSZWYoVGFnTGliUmVmIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZVRhZ0xpYlJlZkFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlU2VjdXJpdHlDb25zdHJhaW50KFNlY3VyaXR5Q29uc3RyYWludCBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnRBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VVUkxQYXR0ZXJuVHlwZShVUkxQYXR0ZXJuVHlwZSBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVVUkxQYXR0ZXJuVHlwZUFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlSFRUUE1ldGhvZFR5cGUoSFRUUE1ldGhvZFR5cGUgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlSFRUUE1ldGhvZFR5cGVBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUF1dGhDb25zdHJhaW50KEF1dGhDb25zdHJhaW50IG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZUF1dGhDb25zdHJhaW50QWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VVc2VyRGF0YUNvbnN0cmFpbnQoVXNlckRhdGFDb25zdHJhaW50IG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZVVzZXJEYXRhQ29uc3RyYWludEFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlTG9naW5Db25maWcoTG9naW5Db25maWcgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlTG9naW5Db25maWdBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUZvcm1Mb2dpbkNvbmZpZyhGb3JtTG9naW5Db25maWcgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlRm9ybUxvZ2luQ29uZmlnQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VNaW1lTWFwcGluZyhNaW1lTWFwcGluZyBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVNaW1lTWFwcGluZ0FkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlU2Vzc2lvbkNvbmZpZyhTZXNzaW9uQ29uZmlnIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZVNlc3Npb25Db25maWdBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRNYXBwaW5nKFNlcnZsZXRNYXBwaW5nIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRNYXBwaW5nQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0KFNlcnZsZXQgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlU2VydmxldEFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlV2ViVHlwZShXZWJUeXBlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZVdlYlR5cGVBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZsZXRUeXBlKFNlcnZsZXRUeXBlIG9iamVjdCkgewogCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRUeXBlQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUeXBlKEpTUFR5cGUgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlSlNQVHlwZUFkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlSW5pdFBhcmFtKEluaXRQYXJhbSBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlcihGaWx0ZXIgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlRmlsdGVyQWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VGaWx0ZXJNYXBwaW5nKEZpbHRlck1hcHBpbmcgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlRmlsdGVyTWFwcGluZ0FkYXB0ZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdCBjYXNlUm9sZU5hbWVUeXBlKFJvbGVOYW1lVHlwZSBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVSb2xlTmFtZVR5cGVBZGFwdGVyKCk7CiAJCX0KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2FzZUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdChMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3Qgb2JqZWN0KSB7CiAJCQlyZXR1cm4gY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0QWRhcHRlcigpOwogCQl9CisJCUBPdmVycmlkZQogCQlwdWJsaWMgT2JqZWN0IGNhc2VMb2NhbEVuY29kaW5nTWFwcGluZyhMb2NhbEVuY29kaW5nTWFwcGluZyBvYmplY3QpIHsKIAkJCXJldHVybiBjcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0FkYXB0ZXIoKTsKIAkJfQogCX07CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewogCQlyZXR1cm4gKEFkYXB0ZXIpc3cuZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKIAl9CkBAIC0zMTksMTA1ICszNTAsMTM5IEBACiAJICovCiAJcHJvdGVjdGVkIFdlYmFwcGxpY2F0aW9uU3dpdGNoIG1vZGVsU3dpdGNoID0KIAkJbmV3IFdlYmFwcGxpY2F0aW9uU3dpdGNoKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJBcHAoV2ViQXBwIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXZWJBcHBBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbnRleHRQYXJhbShDb250ZXh0UGFyYW0gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUNvbnRleHRQYXJhbUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmxldChTZXJ2bGV0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVTZXJ2bGV0QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0TWFwcGluZyhTZXJ2bGV0TWFwcGluZyBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlU2VydmxldE1hcHBpbmdBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVNlc3Npb25Db25maWcoU2Vzc2lvbkNvbmZpZyBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlU2Vzc2lvbkNvbmZpZ0FkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlTWltZU1hcHBpbmcoTWltZU1hcHBpbmcgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZU1pbWVNYXBwaW5nQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWxjb21lRmlsZUxpc3QoV2VsY29tZUZpbGVMaXN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXZWxjb21lRmlsZUxpc3RBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUVycm9yUGFnZShFcnJvclBhZ2Ugb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVycm9yUGFnZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlVGFnTGliUmVmKFRhZ0xpYlJlZiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlVGFnTGliUmVmQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VTZWN1cml0eUNvbnN0cmFpbnQoU2VjdXJpdHlDb25zdHJhaW50IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVTZWN1cml0eUNvbnN0cmFpbnRBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYlJlc291cmNlQ29sbGVjdGlvbihXZWJSZXNvdXJjZUNvbGxlY3Rpb24gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbkFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlQXV0aENvbnN0cmFpbnQoQXV0aENvbnN0cmFpbnQgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUF1dGhDb25zdHJhaW50QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VVc2VyRGF0YUNvbnN0cmFpbnQoVXNlckRhdGFDb25zdHJhaW50IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnRBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUxvZ2luQ29uZmlnKExvZ2luQ29uZmlnIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVMb2dpbkNvbmZpZ0FkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRm9ybUxvZ2luQ29uZmlnKEZvcm1Mb2dpbkNvbmZpZyBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRm9ybUxvZ2luQ29uZmlnQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VJbml0UGFyYW0oSW5pdFBhcmFtIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYlR5cGUoV2ViVHlwZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlV2ViVHlwZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmxldFR5cGUoU2VydmxldFR5cGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVNlcnZsZXRUeXBlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VKU1BUeXBlKEpTUFR5cGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUpTUFR5cGVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVVSTFBhdHRlcm5UeXBlKFVSTFBhdHRlcm5UeXBlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVVUkxQYXR0ZXJuVHlwZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlUm9sZU5hbWVUeXBlKFJvbGVOYW1lVHlwZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUm9sZU5hbWVUeXBlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWxjb21lRmlsZShXZWxjb21lRmlsZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlV2VsY29tZUZpbGVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoRXhjZXB0aW9uVHlwZUVycm9yUGFnZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRXJyb3JDb2RlRXJyb3JQYWdlKEVycm9yQ29kZUVycm9yUGFnZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VGaWx0ZXJNYXBwaW5nKEZpbHRlck1hcHBpbmcgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUZpbHRlck1hcHBpbmdBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUZpbHRlcihGaWx0ZXIgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUZpbHRlckFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VMb2NhbEVuY29kaW5nTWFwcGluZyhMb2NhbEVuY29kaW5nTWFwcGluZyBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUhUVFBNZXRob2RUeXBlKEhUVFBNZXRob2RUeXBlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVIVFRQTWV0aG9kVHlwZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlSk5ESUVudlJlZnNHcm91cChKTkRJRW52UmVmc0dyb3VwIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVKTkRJRW52UmVmc0dyb3VwQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CiAJCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL1dlYlNlcnZpY2VDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvV2ViU2VydmljZUNvbnN0YW50cy5qYXZhCmluZGV4IDNjMTY1NmQuLjI5OTBiOTEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvV2ViU2VydmljZUNvbnN0YW50cy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvV2ViU2VydmljZUNvbnN0YW50cy5qYXZhCkBAIC0yMiw2ICsyMiw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfU0NIRU1BX0xPQ19TVU5fMV8xID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCI7Ly8kTk9OLU5MUy0xJAogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFX1NDSEVNQV9MT0NfMV8yID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QiOy8vJE5PTi1OTFMtMSQKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9TQ0hFTUFfTE9DX1NVTl8xXzIgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZCI7Ly8kTk9OLU5MUy0xJAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFX1NDSEVNQV9MT0NfMV8zID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qYXZhZWVfd2ViX3NlcnZpY2VzXzFfMy54c2QiOy8vJE5PTi1OTFMtMSQKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9TQ0hFTUFfTE9DX1NVTl8xXzMgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2phdmFlZV93ZWJfc2VydmljZXNfMV8zLnhzZCI7Ly8kTk9OLU5MUy0xJAogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VDTElFTlRfRERfU0hPUlRfTkFNRSAgID0gIndlYnNlcnZpY2VzY2xpZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRUNMSUVOVF9TWVNURU1JRCAgICA9ICJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMvZHRkL2oyZWVfd2ViX3NlcnZpY2VzX2NsaWVudF8xXzAuZHRkIjsgLy8kTk9OLU5MUy0xJApAQCAtNDIsOCArNDQsMTAgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCU0VSVklDRV8xXzBfSUQgPSAxMDsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCU0VSVklDRV8xXzFfSUQgPSAxMTsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCU0VSVklDRV8xXzJfSUQgPSAxMjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCU0VSVklDRV8xXzNfSUQgPSAxMzsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU0VSVklDRV9TQ0hFTUFfVkVSU0lPTl8xXzEgPSAiMS4xIjsvLyROT04tTkxTLTEkCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQlNFUlZJQ0VfU0NIRU1BX1ZFUlNJT05fMV8yID0gIjEuMiI7Ly8kTk9OLU5MUy0xJAorICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTRVJWSUNFX1NDSEVNQV9WRVJTSU9OXzFfMyA9ICIxLjMiOy8vJE5PTi1OTFMtMSQKIAogfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3V0aWwvRGVzY3JpcHRpb25Hcm91cEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC91dGlsL0Rlc2NyaXB0aW9uR3JvdXBIZWxwZXIuamF2YQppbmRleCBmMTNjNWM0Li41NTgxMWFlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3V0aWwvRGVzY3JpcHRpb25Hcm91cEhlbHBlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvdXRpbC9EZXNjcmlwdGlvbkdyb3VwSGVscGVyLmphdmEKQEAgLTI3LDcgKzI3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKIAotCisvL1RPRE8gdGhpcyBtYXkgYmUgZGVhZCBjb2RlIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQKIHB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvbkdyb3VwSGVscGVyCiB7CiAKQEAgLTczOCwxNSArNzM4LDE5IEBACiAgICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRFU0NSSVBUSU9OOgogICAgICAgICBzZXREZXNjcmlwdGlvbih3ZWJTZXJ2aWNlcywgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKICAgICAgICAgLy9icmVhazsKKwkJLy8kRkFMTC1USFJPVUdIJAogICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ESVNQTEFZX05BTUU6CiAgICAgICAgIHNldERpc3BsYXlOYW1lKHdlYlNlcnZpY2VzLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwogICAgICAgICAvL2JyZWFrOworCQkvLyRGQUxMLVRIUk9VR0gkCiAgICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLlNNQUxMX0lDT046CiAgICAgICAgIHNldFNtYWxsSWNvbih3ZWJTZXJ2aWNlcywgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKICAgICAgICAgLy9icmVhazsKKwkJLy8kRkFMTC1USFJPVUdIJAogICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5MQVJHRV9JQ09OOgogICAgICAgICBzZXRMYXJnZUljb24od2ViU2VydmljZXMsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7ICAgICAgICAKICAgICAgICAgLy9icmVhazsgICAgICAgIAorCQkvLyRGQUxMLVRIUk9VR0gkCiAgICAgICBkZWZhdWx0Oi8vZG8gbm90aGluZyA7CiAgICAgfQogICB9CkBAIC05NTYsMTUgKzk2MCwxOSBAQAogICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ERVNDUklQVElPTjoKICAgICAgICAgc2V0RGVzY3JpcHRpb24od2ViU2VydmljZURlc2NyaXB0aW9uLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwogICAgICAgICAvL2JyZWFrOworCQkvLyRGQUxMLVRIUk9VR0gkCiAgICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRJU1BMQVlfTkFNRToKICAgICAgICAgc2V0RGlzcGxheU5hbWUod2ViU2VydmljZURlc2NyaXB0aW9uLCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwogICAgICAgICAvL2JyZWFrOworCQkvLyRGQUxMLVRIUk9VR0gkCiAgICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLlNNQUxMX0lDT046CiAgICAgICAgIHNldFNtYWxsSWNvbih3ZWJTZXJ2aWNlRGVzY3JpcHRpb24sIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7CiAgICAgICAgIC8vYnJlYWs7CisJCS8vJEZBTEwtVEhST1VHSCQKICAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uTEFSR0VfSUNPTjoKICAgICAgICAgc2V0TGFyZ2VJY29uKHdlYlNlcnZpY2VEZXNjcmlwdGlvbiwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsgICAgICAgIAogICAgICAgICAvL2JyZWFrOyAgICAgICAgCisJCS8vJEZBTEwtVEhST1VHSCQKICAgICAgIGRlZmF1bHQ6CiAgICAgfQogICB9CkBAIC0xMTY5LDE1ICsxMTc3LDE5IEBACiAgICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRFU0NSSVBUSU9OOgogICAgICAgICBzZXREZXNjcmlwdGlvbihwb3J0Q29tcG9uZW50LCBpc0oyRUUxNCwgdmFsdWUsIHNldExhbmcpOwogICAgICAgICAvL2JyZWFrOworCQkvLyRGQUxMLVRIUk9VR0gkCiAgICAgICBjYXNlIERlc2NyaXB0aW9uR3JvdXBJdGVtLkRJU1BMQVlfTkFNRToKICAgICAgICAgc2V0RGlzcGxheU5hbWUocG9ydENvbXBvbmVudCwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKICAgICAgICAgLy9icmVhazsKKwkJLy8kRkFMTC1USFJPVUdIJAogICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5TTUFMTF9JQ09OOgogICAgICAgICBzZXRTbWFsbEljb24ocG9ydENvbXBvbmVudCwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKICAgICAgICAgLy9icmVhazsKKwkJLy8kRkFMTC1USFJPVUdIJAogICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5MQVJHRV9JQ09OOgogICAgICAgICBzZXRMYXJnZUljb24ocG9ydENvbXBvbmVudCwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsgICAgICAgIAogICAgICAgICAvL2JyZWFrOyAgICAgICAgCisJCS8vJEZBTEwtVEhST1VHSCQKICAgICAgIGRlZmF1bHQ6IAogICAgIH0KICAgfQpAQCAtMTM3NywxNSArMTM4OSwxOSBAQAogICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ERVNDUklQVElPTjoKICAgICAgICAgc2V0RGVzY3JpcHRpb24oaGFuZGxlciwgaXNKMkVFMTQsIHZhbHVlLCBzZXRMYW5nKTsKICAgICAgICAgLy9icmVhazsKKwkJLy8kRkFMTC1USFJPVUdIJAogICAgICAgY2FzZSBEZXNjcmlwdGlvbkdyb3VwSXRlbS5ESVNQTEFZX05BTUU6CiAgICAgICAgIHNldERpc3BsYXlOYW1lKGhhbmRsZXIsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7CiAgICAgICAgIC8vYnJlYWs7CisJCS8vJEZBTEwtVEhST1VHSCQKICAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uU01BTExfSUNPTjoKICAgICAgICAgc2V0U21hbGxJY29uKGhhbmRsZXIsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7CiAgICAgICAgIC8vYnJlYWs7CisJCS8vJEZBTEwtVEhST1VHSCQKICAgICAgIGNhc2UgRGVzY3JpcHRpb25Hcm91cEl0ZW0uTEFSR0VfSUNPTjoKICAgICAgICAgc2V0TGFyZ2VJY29uKGhhbmRsZXIsIGlzSjJFRTE0LCB2YWx1ZSwgc2V0TGFuZyk7ICAgICAgICAKICAgICAgICAgLy9icmVhazsgICAgICAgIAorCQkvLyRGQUxMLVRIUk9VR0gkCiAgICAgICBkZWZhdWx0Oi8vZG8gbm90aGluZyA7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3dzZGQvV3NkZFJlc291cmNlRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9pbnRlcm5hbC93c2RkL1dzZGRSZXNvdXJjZUZhY3RvcnkuamF2YQppbmRleCBhOGFiMWJhLi5mMTQ5ZDk3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2ludGVybmFsL3dzZGQvV3NkZFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvaW50ZXJuYWwvd3NkZC9Xc2RkUmVzb3VyY2VGYWN0b3J5LmphdmEKQEAgLTQ0LDYgKzQ0LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBjb20uaWJtLmV0b29scy5lbWYyeG1sLlJlbmRlcmVyKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7CiAJCXJldHVybiBuZXcgV3NkZFJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7CiAJfQpAQCAtNzYsOCArNzcsMTAgQEAKICAgICAvL2h0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy9kdGQvajJlZV93ZWJfc2VydmljZXNfMV8wLmR0ZAogICAJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TWVNURU1JRCwgImoyZWVfd2ViX3NlcnZpY2VzXzFfMC5kdGQiKTsvLyROT04tTkxTLTEkCiAJSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfTE9DXzFfMSwgImoyZWVfd2ViX3NlcnZpY2VzXzFfMS54c2QiKTsgLy8kTk9OLU5MUy0xJAotICAgIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX0xPQ19TVU5fMV8xLCAiajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCIpOyAvLyROT04tTkxTLTEkCQorICAgIEoyRUVYbWxEdERFbnRpdHlSZXNvbHZlci5yZWdpc3RlckR0RChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU0NIRU1BX0xPQ19TVU5fMV8xLCAiajJlZV93ZWJfc2VydmljZXNfMV8xLnhzZCIpOyAvLyROT04tTkxTLTEkCiAgICAgSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfTE9DXzFfMiwgImphdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZCIpOyAvLyROT04tTkxTLTEkCi0gICAgSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfTE9DX1NVTl8xXzIsICJqYXZhZWVfd2ViX3NlcnZpY2VzXzFfMi54c2QiKTsgLy8kTk9OLU5MUy0xJAkKKyAgICBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIucmVnaXN0ZXJEdEQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX1NDSEVNQV9MT0NfU1VOXzFfMiwgImphdmFlZV93ZWJfc2VydmljZXNfMV8yLnhzZCIpOyAvLyROT04tTkxTLTEkCisgICAgSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfTE9DXzFfMywgImphdmFlZV93ZWJfc2VydmljZXNfMV8zLnhzZCIpOyAvLyROT04tTkxTLTEkCisgICAgSjJFRVhtbER0REVudGl0eVJlc29sdmVyLnJlZ2lzdGVyRHREKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TQ0hFTUFfTE9DX1NVTl8xXzMsICJqYXZhZWVfd2ViX3NlcnZpY2VzXzFfMy54c2QiKTsgLy8kTk9OLU5MUy0xJAogICB9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvQ29tcG9uZW50U2NvcGVkUmVmc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRTY29wZWRSZWZzSW1wbC5qYXZhCmluZGV4IGFhNjMzMGQuLmIwNDc3MzYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRTY29wZWRSZWZzSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9Db21wb25lbnRTY29wZWRSZWZzSW1wbC5qYXZhCkBAIC04NSw3ICs4NSw4IEBACiAgICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICAgIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICAgIEBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkxpdGVyYWxzLkNPTVBPTkVOVF9TQ09QRURfUkVGUzsKIAl9CiAKQEAgLTEyNyw2ICsxMjgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX1NFUlZJQ0VfUkVGUzoKQEAgLTE0MCw2ICsxNDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX0NPTVBPTkVOVF9OQU1FOgpAQCAtMTU1LDYgKzE1OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX0NPTVBPTkVOVF9OQU1FOgpAQCAtMTczLDYgKzE3Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX0NPTVBPTkVOVF9OQU1FOgpAQCAtMTkwLDYgKzE5NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlNfX0NPTVBPTkVOVF9OQU1FOgpAQCAtMjA1LDExICsyMTEsMTIgQEAKICAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tcG9uZW50TmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoY29tcG9uZW50TmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChjb21wb25lbnROYW1lKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvSGFuZGxlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9IYW5kbGVySW1wbC5qYXZhCmluZGV4IDJlMzlmNWEuLjM2Nzk1MDggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9IYW5kbGVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9IYW5kbGVySW1wbC5qYXZhCkBAIC0xMzIsNiArMTMyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuTGl0ZXJhbHMuSEFORExFUjsKIAl9CkBAIC0xNzQsNiArMTc1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVM6CkBAIC0xODksNiArMTkxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FOgpAQCAtMjEzLDYgKzIxNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUU6CkBAIC0yNDYsNiArMjUwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRToKQEAgLTI3NSw2ICsyODAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FOgpAQCAtMzcyLDE1ICszNzgsMTYgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGhhbmRsZXJOYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChoYW5kbGVyTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChoYW5kbGVyTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc29hcFJvbGVzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzb2FwUm9sZXM6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoc29hcFJvbGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwb3J0TmFtZXM6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBvcnROYW1lczogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChwb3J0TmFtZXMpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9Qb3J0Q29tcG9uZW50UmVmSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1BvcnRDb21wb25lbnRSZWZJbXBsLmphdmEKaW5kZXggMzNiOTM4OC4uOGQyMjI3MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1BvcnRDb21wb25lbnRSZWZJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1BvcnRDb21wb25lbnRSZWZJbXBsLmphdmEKQEAgLTgwLDYgKzgwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuTGl0ZXJhbHMuUE9SVF9DT01QT05FTlRfUkVGOwogCX0KQEAgLTE1OSw2ICsxNjAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTks6CkBAIC0xNzUsNiArMTc3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSzoKQEAgLTE5Miw2ICsxOTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuUE9SVF9DT01QT05FTlRfUkVGX19QT1JUX0NPTVBPTkVOVF9MSU5LOgpAQCAtMjA5LDYgKzIxMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5QT1JUX0NPTVBPTkVOVF9SRUZfX1BPUlRfQ09NUE9ORU5UX0xJTks6CkBAIC0yMjQsNiArMjI5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvU2VydmljZVJlZkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSW1wbC5qYXZhCmluZGV4IDFlODM1MjguLjhiZTU4N2MgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlUmVmSW1wbC5qYXZhCkBAIC0xNjMsNiArMTYzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuTGl0ZXJhbHMuU0VSVklDRV9SRUY7CiAJfQpAQCAtMzQwLDYgKzM0MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19QT1JUX0NPTVBPTkVOVF9SRUZTOgpAQCAtMzU3LDYgKzM1OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRToKQEAgLTM4Myw2ICszODYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1NFUlZJQ0VfSU5URVJGQUNFOgpAQCAtNDE3LDYgKzQyMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5TRVJWSUNFX1JFRl9fU0VSVklDRV9JTlRFUkZBQ0U6CkBAIC00NDksNiArNDU0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX0lOVEVSRkFDRToKQEAgLTQ3NCwxNSArNDgwLDE2IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzZXJ2aWNlUmVmTmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoc2VydmljZVJlZk5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoc2VydmljZVJlZk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxGaWxlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsRmlsZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh3c2RsRmlsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgamF4cnBjTWFwcGluZ0ZpbGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGpheHJwY01hcHBpbmdGaWxlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGpheHJwY01hcHBpbmdGaWxlKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNDbGllbnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNDbGllbnRJbXBsLmphdmEKaW5kZXggYjVkZTEwZC4uZTU3ZDA4MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzQ2xpZW50SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0NsaWVudEltcGwuamF2YQpAQCAtNzQsNyArNzQsOCBAQAogICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5MaXRlcmFscy5XRUJfU0VSVklDRVNfQ0xJRU5UOwogCX0KIApAQCAtMTA3LDYgKzEwOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX0NPTVBPTkVOVF9TQ09QRURfUkVGUzoKQEAgLTEyMiw2ICsxMjQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19DT01QT05FTlRfU0NPUEVEX1JFRlM6CkBAIC0xMzcsNiArMTQwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX0NPTVBPTkVOVF9TQ09QRURfUkVGUzoKQEAgLTE1Niw2ICsxNjAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fQ09NUE9ORU5UX1NDT1BFRF9SRUZTOgpAQCAtMTczLDYgKzE3OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5XRUJfU0VSVklDRVNfQ0xJRU5UX19DT01QT05FTlRfU0NPUEVEX1JFRlM6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeS5qYXZhCmluZGV4IDkxOGJlYjYuLjdlZGNmMWEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0NsaWVudFJlc291cmNlRmFjdG9yeS5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiAgICAgICAgIHN1cGVyKGFSZW5kZXJlckZhY3RvcnkpOwogICAgIH0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgYVJlbmRlcmVyKSB7CiAJCXJldHVybiBuZXcgV2ViU2VydmljZXNSZXNvdXJjZUltcGwodXJpLCBhUmVuZGVyZXIpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc1Jlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzUmVzb3VyY2VJbXBsLmphdmEKaW5kZXggZDZiNWMwNC4uNTQ3M2M4YiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzUmVzb3VyY2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzUmVzb3VyY2VJbXBsLmphdmEKQEAgLTU1LDE2ICs1NSwyMCBAQAogICAgICAgICByZXR1cm4gV0VCX1NFUlZJQ0VTX0NMSUVOVF9UWVBFOwogICAgIH0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSB7CiAJCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfU1lTVEVNSURfMV8wOwogCX0KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8zX1N5c3RlbUlEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1NZU1RFTUlEXzFfMDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldEoyRUVfMV8yX1B1YmxpY0lEKCkgewogCQlyZXR1cm4gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX1BVQkxJQ0lEXzFfMDsKIAl9CisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19QdWJsaWNJRCgpIHsKIAkJcmV0dXJuIEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9QVUJMSUNJRF8xXzA7CiAJfQpAQCAtODIsNiArODYsNyBAQAogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5UcmFuc2xhdG9yUmVzb3VyY2Ujc2V0RG9jdHlwZVZhbHVlcyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQogCSAqIFRoaXMgaXMgc2V0dGluZyB0aGUgbW9kdWxlIHZlcnNpb24gb24gdGhlIHJlc291cmNlLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKIAkJaW50IHZlcnNpb24gPSBXRUJTRVJWSUNFU18xXzBfSUQ7CiAJCXN1cGVyLnNldERvY3R5cGVWYWx1ZXMocHVibGljSWQsIHN5c3RlbUlkKTsKQEAgLTkwLDYgKzk1LDcgQEAKIAkJLyogCiAJICogVGhpcyBkaXJlY3RseSBzZXRzIHRoZSBtb2R1bGUgdmVyc2lvbiBpZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldE1vZHVsZVZlcnNpb25JRChpbnQgaWQpIHsKIAkJc3VwZXIuc2V0VmVyc2lvbklEKGlkKTsKIAkJc3dpdGNoIChpZCkgewpAQCAtMTAxLDYgKzEwNyw3IEBACiAJLyoKIAkgKiBCYXNlZCBvbiB0aGUgSjJFRSB2ZXJzaW9uLCB0aGlzIHdpbGwgc2V0IHRoZSBtb2R1bGUgdmVyc2lvbgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldEoyRUVWZXJzaW9uSUQoaW50IGlkKSB7CiAJc3dpdGNoIChpZCkgewogCQljYXNlIChKMkVFXzFfM19JRCkgOgpAQCAtMTE1LDYgKzEyMiw3IEBACiAJfQogCS8qIFJldHVybiBKMkVFIHZlcnNpb24gYmFzZWQgb24gbW9kdWxlIHZlcnNpb24KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB7CiAJCXN3aXRjaCAoZ2V0TW9kdWxlVmVyc2lvbklEKCkpIHsKIAkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCU0VSVklDRVNfMV8wX0lEIDoKQEAgLTEzMiwxMiArMTQwLDE0IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUltcGwjZ2V0RGVmYXVsdFZlcnNpb25JRCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewogCQlyZXR1cm4gV0VCU0VSVklDRVNfMV8wX0lEOwogCX0KIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uaW1wbC5YTUxSZXNvdXJjZUltcGwjc3luY1ZlcnNpb25PZlJvb3RPYmplY3QoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkgewogCQkvL25vdCBtb2RlbCBmb3IgSjJFRSAxLjQgc28gbm8gb3BlcmF0aW9uIHJlcXVpcmVkLgogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2Vic2VydmljZV9jbGllbnRGYWN0b3J5SW1wbC5qYXZhCmluZGV4IDk1ZGVkMjYuLmM1ZWQ5OWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnlJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYnNlcnZpY2VfY2xpZW50RmFjdG9yeUltcGwuamF2YQpAQCAtMzksNyArMzksNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5IGluaXQoKSB7CiAJCXRyeSB7Ci0JCQlXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkgdGhlV2Vic2VydmljZV9jbGllbnRGYWN0b3J5ID0gKFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgid2Vic2VydmljZV9jbGllbnQueG1pIik7IAorCQkJV2Vic2VydmljZV9jbGllbnRGYWN0b3J5IHRoZVdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSA9IChXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoIndlYnNlcnZpY2VfY2xpZW50LnhtaSIpOyAgLy8kTk9OLU5MUy0xJAogCQkJaWYgKHRoZVdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSAhPSBudWxsKSB7CiAJCQkJcmV0dXJuIHRoZVdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKIAkJCX0KQEAgLTY1LDYgKzY1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKIAkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKIAkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGOiByZXR1cm4gY3JlYXRlU2VydmljZVJlZigpOwpAQCAtNzMsNyArNzQsNyBAQAogCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVDogcmV0dXJuIGNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50KCk7CiAJCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5DT01QT05FTlRfU0NPUEVEX1JFRlM6IHJldHVybiBjcmVhdGVDb21wb25lbnRTY29wZWRSZWZzKCk7CiAJCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL2ltcGwvV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbC5qYXZhCmluZGV4IGMzYTE2NjYuLjIzYzBjOGYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvaW1wbC9XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC9pbXBsL1dlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwuamF2YQpAQCAtMTcsMjIgKzE3LDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUluaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7CkBAIC00MCwxMCArMjcsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbDsKIAogCiAvKioKQEAgLTExMiw3ICs5NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKwlwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CiAKIAkvKioKIAkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKQEAgLTE0MCw3ICsxMjMsMTAgQEAKIAkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZU5TX1VSSSk7CiAKIAkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKCkpOworCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSA9IAorCQkJKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mCisJCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcKKwkJCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2VJbXBsKCkpOwogCiAJCWlzSW5pdGVkID0gdHJ1ZTsKIApAQCAtMTQ4LDUwICsxMzQsMjAgQEAKIAkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKIAkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAoVGFnbGliUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgOiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSA6IEpjYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSnNwUGFja2FnZUltcGwgdGhlSnNwUGFja2FnZSA9IChKc3BQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpzcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSnNwUGFja2FnZS5lTlNfVVJJKSA6IEpzcFBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV3Njb21tb25QYWNrYWdlSW1wbCB0aGVXc2NvbW1vblBhY2thZ2UgPSAoV3Njb21tb25QYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV3Njb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzY29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKLQogCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwogCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSnNwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKIAogCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCiAJCXRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwogCiAJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKIAkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmZyZWV6ZSgpOwogCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkksIHRoZVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZSk7CisKKwkJSjJFRUluaXQuaW5pdEVNRk1vZGVscygpOworCiAJCXJldHVybiB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7CiAJfQogCkBAIC00OTYsNDUgKzQ1Miw1NyBAQAogCQlDb21tb25QYWNrYWdlIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwogCQlKYXZhUmVmUGFja2FnZSB0aGVKYXZhUmVmUGFja2FnZSA9IChKYXZhUmVmUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKIAotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCXNlcnZpY2VSZWZFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJcG9ydENvbXBvbmVudFJlZkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQloYW5kbGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCXdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWNvbXBvbmVudFNjb3BlZFJlZnNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHNlcnZpY2VSZWZFQ2xhc3MsIFNlcnZpY2VSZWYuY2xhc3MsICJTZXJ2aWNlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJzZXJ2aWNlSW50ZXJmYWNlIiwgbnVsbCwgMSwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9TZXJ2aWNlUmVmTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmljZVJlZk5hbWUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX1dzZGxGaWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsRmlsZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImpheHJwY01hcHBpbmdGaWxlIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpLCB0aGlzLmdldFBvcnRDb21wb25lbnRSZWYoKSwgbnVsbCwgInBvcnRDb21wb25lbnRSZWZzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSwgdGhpcy5nZXRIYW5kbGVyKCksIG51bGwsICJoYW5kbGVycyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpLCB0aGVDb21tb25QYWNrYWdlLmdldFFOYW1lKCksIG51bGwsICJzZXJ2aWNlUW5hbWUiLCBudWxsLCAxLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocG9ydENvbXBvbmVudFJlZkVDbGFzcywgUG9ydENvbXBvbmVudFJlZi5jbGFzcywgIlBvcnRDb21wb25lbnRSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnRDb21wb25lbnRMaW5rIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaGFuZGxlckVDbGFzcywgSGFuZGxlci5jbGFzcywgIkhhbmRsZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImhhbmRsZXJOYW1lIiwgbnVsbCwgMCwgMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNvYXBSb2xlcyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIYW5kbGVyX1BvcnROYW1lcygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9ydE5hbWVzIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCksIHRoZUphdmFSZWZQYWNrYWdlLmdldEphdmFDbGFzcygpLCBudWxsLCAiaGFuZGxlckNsYXNzIiwgbnVsbCwgMSwgMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UGFyYW1WYWx1ZSgpLCBudWxsLCAiaW5pdFBhcmFtcyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSwgbnVsbCwgInNvYXBIZWFkZXJzIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3ZWJTZXJ2aWNlc0NsaWVudEVDbGFzcywgV2ViU2VydmljZXNDbGllbnQuY2xhc3MsICJXZWJTZXJ2aWNlc0NsaWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViU2VydmljZXNDbGllbnRfQ29tcG9uZW50U2NvcGVkUmVmcygpLCB0aGlzLmdldENvbXBvbmVudFNjb3BlZFJlZnMoKSwgbnVsbCwgImNvbXBvbmVudFNjb3BlZFJlZnMiLCBudWxsLCAwLCAtMSwgV2ViU2VydmljZXNDbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlNlcnZpY2VzQ2xpZW50X1NlcnZpY2VSZWZzKCksIHRoaXMuZ2V0U2VydmljZVJlZigpLCBudWxsLCAic2VydmljZVJlZnMiLCBudWxsLCAwLCAtMSwgV2ViU2VydmljZXNDbGllbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb21wb25lbnRTY29wZWRSZWZzRUNsYXNzLCBDb21wb25lbnRTY29wZWRSZWZzLmNsYXNzLCAiQ29tcG9uZW50U2NvcGVkUmVmcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21wb25lbnROYW1lIiwgbnVsbCwgMCwgMSwgQ29tcG9uZW50U2NvcGVkUmVmcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19TZXJ2aWNlUmVmcygpLCB0aGlzLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMSwgLTEsIENvbXBvbmVudFNjb3BlZFJlZnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCQlib29sZWFuIGhhc0xvY2sgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCWhhc0xvY2sgPSBKMkVFSW5pdC5hcXVpcmVJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJfQkJCisJCQorCQl0cnl7CisJCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCQlzZXJ2aWNlUmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7CisJCQlwb3J0Q29tcG9uZW50UmVmRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQloYW5kbGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7CisJCQl3ZWJTZXJ2aWNlc0NsaWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJY29tcG9uZW50U2NvcGVkUmVmc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQorCQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKKwkJCWluaXRFQ2xhc3Moc2VydmljZVJlZkVDbGFzcywgU2VydmljZVJlZi5jbGFzcywgIlNlcnZpY2VSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgInNlcnZpY2VJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlUmVmX1NlcnZpY2VSZWZOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2aWNlUmVmTmFtZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VSZWZfV3NkbEZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxGaWxlIiwgbnVsbCwgMCwgMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZVJlZl9KYXhycGNNYXBwaW5nRmlsZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF4cnBjTWFwcGluZ0ZpbGUiLCBudWxsLCAwLCAxLCBTZXJ2aWNlUmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCksIHRoaXMuZ2V0UG9ydENvbXBvbmVudFJlZigpLCBudWxsLCAicG9ydENvbXBvbmVudFJlZnMiLCBudWxsLCAwLCAtMSwgU2VydmljZVJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZVJlZl9IYW5kbGVycygpLCB0aGlzLmdldEhhbmRsZXIoKSwgbnVsbCwgImhhbmRsZXJzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCksIHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSwgbnVsbCwgInNlcnZpY2VRbmFtZSIsIG51bGwsIDEsIDEsIFNlcnZpY2VSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MocG9ydENvbXBvbmVudFJlZkVDbGFzcywgUG9ydENvbXBvbmVudFJlZi5jbGFzcywgIlBvcnRDb21wb25lbnRSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRSZWZfUG9ydENvbXBvbmVudExpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnRDb21wb25lbnRMaW5rIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudFJlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgdGhlSmF2YVJlZlBhY2thZ2UuZ2V0SmF2YUNsYXNzKCksIG51bGwsICJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLCBudWxsLCAxLCAxLCBQb3J0Q29tcG9uZW50UmVmLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGhhbmRsZXJFQ2xhc3MsIEhhbmRsZXIuY2xhc3MsICJIYW5kbGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJoYW5kbGVyTmFtZSIsIG51bGwsIDAsIDEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEhhbmRsZXJfU29hcFJvbGVzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzb2FwUm9sZXMiLCBudWxsLCAwLCAtMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SGFuZGxlcl9Qb3J0TmFtZXMoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnROYW1lcyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpLCB0aGVKYXZhUmVmUGFja2FnZS5nZXRKYXZhQ2xhc3MoKSwgbnVsbCwgImhhbmRsZXJDbGFzcyIsIG51bGwsIDEsIDEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJfSW5pdFBhcmFtcygpLCB0aGVDb21tb25QYWNrYWdlLmdldFBhcmFtVmFsdWUoKSwgbnVsbCwgImluaXRQYXJhbXMiLCBudWxsLCAwLCAtMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpLCB0aGVDb21tb25QYWNrYWdlLmdldFFOYW1lKCksIG51bGwsICJzb2FwSGVhZGVycyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHdlYlNlcnZpY2VzQ2xpZW50RUNsYXNzLCBXZWJTZXJ2aWNlc0NsaWVudC5jbGFzcywgIldlYlNlcnZpY2VzQ2xpZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJTZXJ2aWNlc0NsaWVudF9Db21wb25lbnRTY29wZWRSZWZzKCksIHRoaXMuZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpLCBudWxsLCAiY29tcG9uZW50U2NvcGVkUmVmcyIsIG51bGwsIDAsIC0xLCBXZWJTZXJ2aWNlc0NsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViU2VydmljZXNDbGllbnRfU2VydmljZVJlZnMoKSwgdGhpcy5nZXRTZXJ2aWNlUmVmKCksIG51bGwsICJzZXJ2aWNlUmVmcyIsIG51bGwsIDAsIC0xLCBXZWJTZXJ2aWNlc0NsaWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhjb21wb25lbnRTY29wZWRSZWZzRUNsYXNzLCBDb21wb25lbnRTY29wZWRSZWZzLmNsYXNzLCAiQ29tcG9uZW50U2NvcGVkUmVmcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjb21wb25lbnROYW1lIiwgbnVsbCwgMCwgMSwgQ29tcG9uZW50U2NvcGVkUmVmcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19TZXJ2aWNlUmVmcygpLCB0aGlzLmdldFNlcnZpY2VSZWYoKSwgbnVsbCwgInNlcnZpY2VSZWZzIiwgbnVsbCwgMSwgLTEsIENvbXBvbmVudFNjb3BlZFJlZnMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCS8vIENyZWF0ZSByZXNvdXJjZQorCQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCX1maW5hbGx5eworCQkJaWYoIGhhc0xvY2sgKQorCQkJCUoyRUVJbml0LnJlbGVhc2VJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9CiAJfQogCiB9IC8vV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC91dGlsL1dlYnNlcnZpY2VfY2xpZW50QWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NjbGllbnQvaW50ZXJuYWwvdXRpbC9XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggNGQ4OTM1YS4uZTJiOTVmYSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NsaWVudC9pbnRlcm5hbC91dGlsL1dlYnNlcnZpY2VfY2xpZW50QWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY2xpZW50L2ludGVybmFsL3V0aWwvV2Vic2VydmljZV9jbGllbnRBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC02Miw2ICs2Miw3IEBACiAJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKIAkJCXJldHVybiB0cnVlOwpAQCAtODAsMzAgKzgxLDM5IEBACiAJICovCiAJcHJvdGVjdGVkIFdlYnNlcnZpY2VfY2xpZW50U3dpdGNoIG1vZGVsU3dpdGNoID0KIAkJbmV3IFdlYnNlcnZpY2VfY2xpZW50U3dpdGNoKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlUmVmKFNlcnZpY2VSZWYgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVBvcnRDb21wb25lbnRSZWYoUG9ydENvbXBvbmVudFJlZiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUG9ydENvbXBvbmVudFJlZkFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlSGFuZGxlcihIYW5kbGVyIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVIYW5kbGVyQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWJTZXJ2aWNlc0NsaWVudChXZWJTZXJ2aWNlc0NsaWVudCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlV2ViU2VydmljZXNDbGllbnRBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBvbmVudFNjb3BlZFJlZnMoQ29tcG9uZW50U2NvcGVkUmVmcyBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmc0FkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlSjJFRUVPYmplY3QoSjJFRUVPYmplY3Qgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUoyRUVFT2JqZWN0QWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VEZXNjcmlwdGlvbkdyb3VwKERlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwogCQkJfQpAQCAtMTE3LDYgKzEyNyw3IEBACiAJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7CiAJCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvblR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvRGVzY3JpcHRpb25UeXBlSW1wbC5qYXZhCmluZGV4IDEzMmU0MzEuLjQ3ZGNkNjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9EZXNjcmlwdGlvblR5cGVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rlc2NyaXB0aW9uVHlwZUltcGwuamF2YQpAQCAtNDEsNyArNDEsOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV3Njb21tb25QYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUSU9OX1RZUEU7CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL0Rpc3BsYXlOYW1lVHlwZUltcGwuamF2YQppbmRleCAyNWE3OTU2Li5hNDk3NzAxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvRGlzcGxheU5hbWVUeXBlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9EaXNwbGF5TmFtZVR5cGVJbXBsLmphdmEKQEAgLTQxLDcgKzQxLDggQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKyAgQE92ZXJyaWRlCitwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdzY29tbW9uUGFja2FnZS5MaXRlcmFscy5ESVNQTEFZX05BTUVfVFlQRTsKIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Jbml0UGFyYW1JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvSW5pdFBhcmFtSW1wbC5qYXZhCmluZGV4IDZhZDJiZDUuLmQwNzQwMTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Jbml0UGFyYW1JbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL0luaXRQYXJhbUltcGwuamF2YQpAQCAtMTI4LDcgKzEyOCw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisgIEBPdmVycmlkZQorcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXc2NvbW1vblBhY2thZ2UuTGl0ZXJhbHMuSU5JVF9QQVJBTTsKIAl9CiAKQEAgLTIxMiw2ICsyMTMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUzoKQEAgLTIyNSw2ICsyMjcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FOgpAQCAtMjQ0LDYgKzI0Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FOgpAQCAtMjY4LDYgKzI3Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FOgpAQCAtMjkxLDYgKzI5Niw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FOgpAQCAtMzEwLDE1ICszMTYsMTYgQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICBAT3ZlcnJpZGUKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwYXJhbU5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHBhcmFtTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChwYXJhbU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcmFtVmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBhcmFtVmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQocGFyYW1WYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvUG9ydE5hbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvUG9ydE5hbWVJbXBsLmphdmEKaW5kZXggMTdmMTM2MC4uZWMzZDdiNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1BvcnROYW1lSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Qb3J0TmFtZUltcGwuamF2YQpAQCAtNjcsNyArNjcsOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV3Njb21tb25QYWNrYWdlLkxpdGVyYWxzLlBPUlRfTkFNRTsKIAl9CiAKQEAgLTk3LDYgKzk4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuUE9SVF9OQU1FX19QT1JUX05BTUU6CkBAIC0xMTAsNiArMTEyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlBPUlRfTkFNRV9fUE9SVF9OQU1FOgpAQCAtMTI0LDYgKzEyNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzY29tbW9uUGFja2FnZS5QT1JUX05BTUVfX1BPUlRfTkFNRToKQEAgLTEzOCw2ICsxNDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuUE9SVF9OQU1FX19QT1JUX05BTUU6CkBAIC0xNTEsMTEgKzE1NiwxMiBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgIEBPdmVycmlkZQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBvcnROYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChwb3J0TmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChwb3J0TmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NPQVBIZWFkZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckltcGwuamF2YQppbmRleCAyZjg0OTMyLi4wNTdlNTA5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvU09BUEhlYWRlckltcGwuamF2YQpAQCAtNDEsNyArNDEsOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV3Njb21tb25QYWNrYWdlLkxpdGVyYWxzLlNPQVBfSEVBREVSOwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NPQVBSb2xlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1NPQVBSb2xlSW1wbC5qYXZhCmluZGV4IDM3YzEwNDMuLjM1Mzg2NzkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9TT0FQUm9sZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvU09BUFJvbGVJbXBsLmphdmEKQEAgLTY3LDcgKzY3LDggQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKyAgQE92ZXJyaWRlCitwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdzY29tbW9uUGFja2FnZS5MaXRlcmFscy5TT0FQX1JPTEU7CiAJfQogCkBAIC05Nyw2ICs5OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRV9fU09BUF9ST0xFOgpAQCAtMTEwLDYgKzExMiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX1JPTEVfX1NPQVBfUk9MRToKQEAgLTEyNCw2ICsxMjcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9ST0xFX19TT0FQX1JPTEU6CkBAIC0xMzgsNiArMTQyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRV9fU09BUF9ST0xFOgpAQCAtMTUxLDExICsxNTYsMTIgQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICBAT3ZlcnJpZGUKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzb2FwUm9sZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoc29hcFJvbGU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoc29hcFJvbGUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Xc2NvbW1vbkZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvV3Njb21tb25GYWN0b3J5SW1wbC5qYXZhCmluZGV4IGE1YjlhMjYuLmU1ZWViNzggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Xc2NvbW1vbkZhY3RvcnlJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1dzY29tbW9uRmFjdG9yeUltcGwuamF2YQpAQCAtNDEsNyArNDEsNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgV3Njb21tb25GYWN0b3J5IGluaXQoKSB7CiAJCXRyeSB7Ci0JCQlXc2NvbW1vbkZhY3RvcnkgdGhlV3Njb21tb25GYWN0b3J5ID0gKFdzY29tbW9uRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgid3Njb21tb24ueG1pIik7IAorCQkJV3Njb21tb25GYWN0b3J5IHRoZVdzY29tbW9uRmFjdG9yeSA9IChXc2NvbW1vbkZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoIndzY29tbW9uLnhtaSIpOyAgLy8kTk9OLU5MUy0xJAogCQkJaWYgKHRoZVdzY29tbW9uRmFjdG9yeSAhPSBudWxsKSB7CiAJCQkJcmV0dXJuIHRoZVdzY29tbW9uRmFjdG9yeTsKIAkJCX0KQEAgLTY3LDcgKzY3LDggQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworICBAT3ZlcnJpZGUKK3B1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7CiAJCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7CiAJCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNOiByZXR1cm4gY3JlYXRlSW5pdFBhcmFtKCk7CiAJCQljYXNlIFdzY29tbW9uUGFja2FnZS5TT0FQX0hFQURFUjogcmV0dXJuIGNyZWF0ZVNPQVBIZWFkZXIoKTsKQEAgLTc2LDcgKzc3LDcgQEAKIAkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX1RZUEU6IHJldHVybiBjcmVhdGVEZXNjcmlwdGlvblR5cGUoKTsKIAkJCWNhc2UgV3Njb21tb25QYWNrYWdlLkRJU1BMQVlfTkFNRV9UWVBFOiByZXR1cm4gY3JlYXRlRGlzcGxheU5hbWVUeXBlKCk7CiAJCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Xc2NvbW1vblBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL2ltcGwvV3Njb21tb25QYWNrYWdlSW1wbC5qYXZhCmluZGV4IDBkN2Q4MjQuLmUyN2YxZDUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvaW1wbC9Xc2NvbW1vblBhY2thZ2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC9pbXBsL1dzY29tbW9uUGFja2FnZUltcGwuamF2YQpAQCAtMTcsMjQgKzE3LDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUluaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW07CkBAIC00Myw4ICsyOCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsOwogCiAKIC8qKgpAQCAtMTIxLDcgKzEwNCw3IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworICBwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CiAKIAkvKioKIAkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKQEAgLTE0OSw3ICsxMzIsMTAgQEAKIAkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFdzY29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSk7CiAKIAkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIFdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXc2NvbW1vblBhY2thZ2VJbXBsKCkpOworCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IAorCQkJKFdzY29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mCisJCQkJCVdzY29tbW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcKKwkJCQkJCQlXc2NvbW1vblBhY2thZ2VJbXBsKCkpOwogCiAJCWlzSW5pdGVkID0gdHJ1ZTsKIApAQCAtMTU3LDUwICsxNDMsMjEgQEAKIAkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKIAkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAoVGFnbGliUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgOiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSA6IEpjYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2RkUGFja2FnZUltcGwgdGhlV3NkZFBhY2thZ2UgPSAoV3NkZFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2RkUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdzZGRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpIDogV3NkZFBhY2thZ2UuZUlOU1RBTkNFKTsKIAogCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwogCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2RkUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKIAogCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCiAJCXRoZVdzY29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3NkZFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwogCiAJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKIAkJdGhlV3Njb21tb25QYWNrYWdlLmZyZWV6ZSgpOwogCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoV3Njb21tb25QYWNrYWdlLmVOU19VUkksIHRoZVdzY29tbW9uUGFja2FnZSk7CisKKwkJSjJFRUluaXQuaW5pdEVNRk1vZGVscygpOworCQkKIAkJcmV0dXJuIHRoZVdzY29tbW9uUGFja2FnZTsKIAl9CiAKQEAgLTM4NSwzNSArMzQyLDQ3IEBACiAJCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKIAkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKIAotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWluaXRQYXJhbUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlzb2FwSGVhZGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSk7Ci0JCXNvYXBSb2xlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXBvcnROYW1lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWRlc2NyaXB0aW9uVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uKCkpOwotCQlkaXNwbGF5TmFtZVR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKGluaXRQYXJhbUVDbGFzcywgSW5pdFBhcmFtLmNsYXNzLCAiSW5pdFBhcmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fUGFyYW1OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbU5hbWUiLCBudWxsLCAwLCAxLCBJbml0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbVZhbHVlIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRJbml0UGFyYW1fRGVzY3JpcHRpb25UeXBlcygpLCB0aGlzLmdldERlc2NyaXB0aW9uVHlwZSgpLCBudWxsLCAiZGVzY3JpcHRpb25UeXBlcyIsIG51bGwsIDAsIC0xLCBJbml0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzb2FwSGVhZGVyRUNsYXNzLCBTT0FQSGVhZGVyLmNsYXNzLCAiU09BUEhlYWRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHNvYXBSb2xlRUNsYXNzLCBTT0FQUm9sZS5jbGFzcywgIlNPQVBSb2xlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTT0FQUm9sZV9Tb2FwUm9sZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic29hcFJvbGUiLCBudWxsLCAwLCAxLCBTT0FQUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBvcnROYW1lRUNsYXNzLCBQb3J0TmFtZS5jbGFzcywgIlBvcnROYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0TmFtZV9Qb3J0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9ydE5hbWUiLCBudWxsLCAwLCAxLCBQb3J0TmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlc2NyaXB0aW9uVHlwZUVDbGFzcywgRGVzY3JpcHRpb25UeXBlLmNsYXNzLCAiRGVzY3JpcHRpb25UeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZGlzcGxheU5hbWVUeXBlRUNsYXNzLCBEaXNwbGF5TmFtZVR5cGUuY2xhc3MsICJEaXNwbGF5TmFtZVR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOworCQlib29sZWFuIGhhc0xvY2sgPSBmYWxzZTsKKwkJdHJ5IHsKKwkJCWhhc0xvY2sgPSBKMkVFSW5pdC5hcXVpcmVJbml0aWFsaXplUGFja2FnZUNvbnRlbnRzTG9jaygpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJfQkJCisJCQorCQl0cnl7CisJCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCisJCQlpbml0UGFyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCXNvYXBIZWFkZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRRTmFtZSgpKTsKKwkJCXNvYXBSb2xlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CisJCQlwb3J0TmFtZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJZGVzY3JpcHRpb25UeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb24oKSk7CisJCQlkaXNwbGF5TmFtZVR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXREaXNwbGF5TmFtZSgpKTsKKwkKKwkJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCQlpbml0RUNsYXNzKGluaXRQYXJhbUVDbGFzcywgSW5pdFBhcmFtLmNsYXNzLCAiSW5pdFBhcmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fUGFyYW1OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbU5hbWUiLCBudWxsLCAwLCAxLCBJbml0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEluaXRQYXJhbV9QYXJhbVZhbHVlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbVZhbHVlIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRJbml0UGFyYW1fRGVzY3JpcHRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgSW5pdFBhcmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRJbml0UGFyYW1fRGVzY3JpcHRpb25UeXBlcygpLCB0aGlzLmdldERlc2NyaXB0aW9uVHlwZSgpLCBudWxsLCAiZGVzY3JpcHRpb25UeXBlcyIsIG51bGwsIDAsIC0xLCBJbml0UGFyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Moc29hcEhlYWRlckVDbGFzcywgU09BUEhlYWRlci5jbGFzcywgIlNPQVBIZWFkZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Moc29hcFJvbGVFQ2xhc3MsIFNPQVBSb2xlLmNsYXNzLCAiU09BUFJvbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNPQVBSb2xlX1NvYXBSb2xlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzb2FwUm9sZSIsIG51bGwsIDAsIDEsIFNPQVBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHBvcnROYW1lRUNsYXNzLCBQb3J0TmFtZS5jbGFzcywgIlBvcnROYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0TmFtZV9Qb3J0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9ydE5hbWUiLCBudWxsLCAwLCAxLCBQb3J0TmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhkZXNjcmlwdGlvblR5cGVFQ2xhc3MsIERlc2NyaXB0aW9uVHlwZS5jbGFzcywgIkRlc2NyaXB0aW9uVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhkaXNwbGF5TmFtZVR5cGVFQ2xhc3MsIERpc3BsYXlOYW1lVHlwZS5jbGFzcywgIkRpc3BsYXlOYW1lVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJLy8gQ3JlYXRlIHJlc291cmNlCisJCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwkJfWZpbmFsbHl7CisJCQlpZiggaGFzTG9jayApCisJCQkJSjJFRUluaXQucmVsZWFzZUluaXRpYWxpemVQYWNrYWdlQ29udGVudHNMb2NrKCk7CisJCX0KIAl9CiAKIH0gLy9Xc2NvbW1vblBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL3V0aWwvV3Njb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi9pbnRlcm5hbC91dGlsL1dzY29tbW9uQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCA0NTM2MWUwLi5lYTc5NWE2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL2ludGVybmFsL3V0aWwvV3Njb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vaW50ZXJuYWwvdXRpbC9Xc2NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTY2LDcgKzY2LDggQEAKIAkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKKyAgQE92ZXJyaWRlCitwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKIAkJCXJldHVybiB0cnVlOwogCQl9CkBAIC04NCwzNiArODUsNDcgQEAKIAkgKi8KICAgcHJvdGVjdGVkIFdzY29tbW9uU3dpdGNoIG1vZGVsU3dpdGNoID0KIAkJbmV3IFdzY29tbW9uU3dpdGNoKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VJbml0UGFyYW0oSW5pdFBhcmFtIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVNPQVBIZWFkZXIoU09BUEhlYWRlciBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlU09BUEhlYWRlckFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlU09BUFJvbGUoU09BUFJvbGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVNPQVBSb2xlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0TmFtZShQb3J0TmFtZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUG9ydE5hbWVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uVHlwZShEZXNjcmlwdGlvblR5cGUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uVHlwZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRGlzcGxheU5hbWVUeXBlKERpc3BsYXlOYW1lVHlwZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRGlzcGxheU5hbWVUeXBlQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVFOYW1lKFFOYW1lIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVRTmFtZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRGVzY3JpcHRpb24oRGVzY3JpcHRpb24gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0aW9uQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VEaXNwbGF5TmFtZShEaXNwbGF5TmFtZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRGlzcGxheU5hbWVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKIAkJCX0KQEAgLTEyNyw3ICsxMzksOCBAQAogCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKyAgQE92ZXJyaWRlCitwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewogCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL0FkZHJlc3NpbmdSZXNwb25zZXNUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkZDdmMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkFkZHJlc3NpbmcgUmVzcG9uc2VzIFR5cGU8L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgZXh0ZW5kcyBBYnN0cmFjdEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFOT05ZTU9VUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QU5PTllNT1VTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0FOT05ZTU9VU19MSVRFUkFMCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5PTllNT1VTID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk5PTkFOT05ZTU9VUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9OQU5PTllNT1VTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PTkFOT05ZTU9VU19MSVRFUkFMCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9OQU5PTllNT1VTID0gMTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFMTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QUxMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0FMTF9MSVRFUkFMCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMID0gMjsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFOT05ZTU9VUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBTk9OWU1PVVMKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIEFOT05ZTU9VU19MSVRFUkFMID0gbmV3IEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlKEFOT05ZTU9VUywgIkFOT05ZTU9VUyIsICJBTk9OWU1PVVMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OT05BTk9OWU1PVVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9OQU5PTllNT1VTCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSBOT05BTk9OWU1PVVNfTElURVJBTCA9IG5ldyBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZShOT05BTk9OWU1PVVMsICJOT05BTk9OWU1PVVMiLCAiTk9OQU5PTllNT1VTIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+QUxMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0FMTAorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgQUxMX0xJVEVSQUwgPSBuZXcgQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUoQUxMLCAiQUxMIiwgIkFMTCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5BZGRyZXNzaW5nIFJlc3BvbnNlcyBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZVtdIHsKKwkJCUFOT05ZTU9VU19MSVRFUkFMLAorCQkJTk9OQU5PTllNT1VTX0xJVEVSQUwsCisJCQlBTExfTElURVJBTCwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5BZGRyZXNzaW5nIFJlc3BvbnNlcyBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5BZGRyZXNzaW5nIFJlc3BvbnNlcyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkFkZHJlc3NpbmcgUmVzcG9uc2VzIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5BZGRyZXNzaW5nIFJlc3BvbnNlcyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIEFOT05ZTU9VUzogcmV0dXJuIEFOT05ZTU9VU19MSVRFUkFMOworCQkJY2FzZSBOT05BTk9OWU1PVVM6IHJldHVybiBOT05BTk9OWU1PVVNfTElURVJBTDsKKwkJCWNhc2UgQUxMOiByZXR1cm4gQUxMX0xJVEVSQUw7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJc3VwZXIodmFsdWUsIG5hbWUsIGxpdGVyYWwpOworCX0KKworfSAvL0FkZHJlc3NpbmdSZXNwb25zZXNUeXBlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvQWRkcmVzc2luZ1R5cGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9BZGRyZXNzaW5nVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlM2JlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvQWRkcmVzc2luZ1R5cGUuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BZGRyZXNzaW5nIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkFkZHJlc3NpbmdUeXBlI2lzRW5hYmxlZCA8ZW0+RW5hYmxlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkFkZHJlc3NpbmdUeXBlI2lzUmVxdWlyZWQgPGVtPlJlcXVpcmVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQWRkcmVzc2luZ1R5cGUjZ2V0UmVzcG9uc2VzIDxlbT5SZXNwb25zZXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRBZGRyZXNzaW5nVHlwZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBBZGRyZXNzaW5nVHlwZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbmFibGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVuYWJsZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEVuYWJsZWQoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRBZGRyZXNzaW5nVHlwZV9FbmFibGVkKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0VuYWJsZWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5BZGRyZXNzaW5nVHlwZSNpc0VuYWJsZWQgPGVtPkVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVuYWJsZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzRW5hYmxlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RW5hYmxlZChib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXF1aXJlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0UmVxdWlyZWQoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRBZGRyZXNzaW5nVHlwZV9SZXF1aXJlZCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNSZXF1aXJlZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkFkZHJlc3NpbmdUeXBlI2lzUmVxdWlyZWQgPGVtPlJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNSZXF1aXJlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNwb25zZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGV9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzcG9uc2VzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNlczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUKKwkgKiBAc2VlICNzZXRSZXNwb25zZXMoQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0QWRkcmVzc2luZ1R5cGVfUmVzcG9uc2VzKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgZ2V0UmVzcG9uc2VzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQWRkcmVzc2luZ1R5cGUjZ2V0UmVzcG9uc2VzIDxlbT5SZXNwb25zZXM8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNlczwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUKKwkgKiBAc2VlICNnZXRSZXNwb25zZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJlc3BvbnNlcyhBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSB2YWx1ZSk7CisKK30gLy8gQWRkcmVzc2luZ1R5cGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Qb3J0Q29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvUG9ydENvbXBvbmVudC5qYXZhCmluZGV4IGVkMmU3ODguLjNiOTg1YWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Qb3J0Q29tcG9uZW50LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1BvcnRDb21wb25lbnQuamF2YQpAQCAtMTAsNiArMTAsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZDsKIAoraW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkoyRUVFT2JqZWN0OwpAQCAtNDYsNiArNDcsOSBAQAogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2lzRW5hYmxlTXRvbSA8ZW0+RW5hYmxlIE10b208L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFByb3RvY29sQmluZGluZyA8ZW0+UHJvdG9jb2wgQmluZGluZzwvZW0+fTwvbGk+CiAgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0SGFuZGxlckNoYWlucyA8ZW0+SGFuZGxlciBDaGFpbnM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldE10b21UaHJlc2hvbGQgPGVtPk10b20gVGhyZXNob2xkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRSZXNwZWN0QmluZGluZyA8ZW0+UmVzcGVjdCBCaW5kaW5nPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRBZGRyZXNzaW5nIDxlbT5BZGRyZXNzaW5nPC9lbT59PC9saT4KICAqIDwvdWw+CiAgKiA8L3A+CiAgKgpAQCAtNDcwLDQgKzQ3NCw4MiBAQAogCSAqLwogCXZvaWQgc2V0SGFuZGxlckNoYWlucyhIYW5kbGVyc0NoYWlucyB2YWx1ZSk7CiAKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NdG9tIFRocmVzaG9sZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TXRvbSBUaHJlc2hvbGQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXRvbSBUaHJlc2hvbGQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE10b21UaHJlc2hvbGQoQmlnSW50ZWdlcikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRQb3J0Q29tcG9uZW50X010b21UaHJlc2hvbGQoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlCaWdJbnRlZ2VyIGdldE10b21UaHJlc2hvbGQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldE10b21UaHJlc2hvbGQgPGVtPk10b20gVGhyZXNob2xkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdG9tIFRocmVzaG9sZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TXRvbVRocmVzaG9sZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TXRvbVRocmVzaG9sZChCaWdJbnRlZ2VyIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BlY3QgQmluZGluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzcGVjdCBCaW5kaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BlY3QgQmluZGluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UmVzcGVjdEJpbmRpbmcoUmVzcGVjdEJpbmRpbmdUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfUmVzcGVjdEJpbmRpbmcoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUmVzcGVjdEJpbmRpbmdUeXBlIGdldFJlc3BlY3RCaW5kaW5nKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRSZXNwZWN0QmluZGluZyA8ZW0+UmVzcGVjdCBCaW5kaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwZWN0IEJpbmRpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFJlc3BlY3RCaW5kaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRSZXNwZWN0QmluZGluZyhSZXNwZWN0QmluZGluZ1R5cGUgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRkcmVzc2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRkcmVzc2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRyZXNzaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRBZGRyZXNzaW5nKEFkZHJlc3NpbmdUeXBlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlI2dldFBvcnRDb21wb25lbnRfQWRkcmVzc2luZygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBZGRyZXNzaW5nVHlwZSBnZXRBZGRyZXNzaW5nKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRBZGRyZXNzaW5nIDxlbT5BZGRyZXNzaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRyZXNzaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRBZGRyZXNzaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBZGRyZXNzaW5nKEFkZHJlc3NpbmdUeXBlIHZhbHVlKTsKKwogfSAvLyBQb3J0Q29tcG9uZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvUmVzcGVjdEJpbmRpbmdUeXBlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvUmVzcGVjdEJpbmRpbmdUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiZTA1MwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9SZXNwZWN0QmluZGluZ1R5cGUuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc3BlY3QgQmluZGluZyBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5SZXNwZWN0QmluZGluZ1R5cGUjaXNFbmFibGVkIDxlbT5FbmFibGVkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2UjZ2V0UmVzcGVjdEJpbmRpbmdUeXBlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc3BlY3RCaW5kaW5nVHlwZSBleHRlbmRzIEoyRUVFT2JqZWN0IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbmFibGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVuYWJsZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEVuYWJsZWQoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZSNnZXRSZXNwZWN0QmluZGluZ1R5cGVfRW5hYmxlZCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNFbmFibGVkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUmVzcGVjdEJpbmRpbmdUeXBlI2lzRW5hYmxlZCA8ZW0+RW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNFbmFibGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gdmFsdWUpOworCit9IC8vIFJlc3BlY3RCaW5kaW5nVHlwZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZEZhY3RvcnkuamF2YQppbmRleCA3ODlmN2I3Li45MDZmYzkyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZEZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZEZhY3RvcnkuamF2YQpAQCAtMTM4LDYgKzEzOCwyNCBAQAogCUhhbmRsZXJzQ2hhaW5zIGNyZWF0ZUhhbmRsZXJzQ2hhaW5zKCk7CiAKIAkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc3BlY3QgQmluZGluZyBUeXBlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNwZWN0IEJpbmRpbmcgVHlwZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUmVzcGVjdEJpbmRpbmdUeXBlIGNyZWF0ZVJlc3BlY3RCaW5kaW5nVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BZGRyZXNzaW5nIFR5cGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFkZHJlc3NpbmcgVHlwZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQWRkcmVzc2luZ1R5cGUgY3JlYXRlQWRkcmVzc2luZ1R5cGUoKTsKKworCS8qKgogCSAqIFJldHVybnMgdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgbWV0aG9kIGlzIE5PVCBhcGksIGFuZCBtYXkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4gIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRQYWNrYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZFBhY2thZ2UuamF2YQppbmRleCA4MjI1MGMwLi4xMTVmYThhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZFBhY2thZ2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZFBhY2thZ2UuamF2YQpAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwpAQCAtNDM4LDEzICs0MzksNDAgQEAKIAlpbnQgUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE1OwogCiAJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk10b20gVGhyZXNob2xkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUE9SVF9DT01QT05FTlRfX01UT01fVEhSRVNIT0xEID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BlY3QgQmluZGluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUlRfQ09NUE9ORU5UX19SRVNQRUNUX0JJTkRJTkcgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkcmVzc2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFBPUlRfQ09NUE9ORU5UX19BRERSRVNTSU5HID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE4OworCisJLyoqCiAJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvcnQgQ29tcG9uZW50PC9lbT4nIGNsYXNzLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKiBAb3JkZXJlZAogCSAqLwotICBpbnQgUE9SVF9DT01QT05FTlRfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxNjsKKyAgaW50IFBPUlRfQ09NUE9ORU5UX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTk7CiAKIAkvKioKIAkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldTRExQb3J0SW1wbCA8ZW0+V1NETCBQb3J0PC9lbT59JyBjbGFzcy4KQEAgLTg5MCw2ICs5MTgsOTEgQEAKIAogCiAJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5SZXNwZWN0QmluZGluZ1R5cGVJbXBsIDxlbT5SZXNwZWN0IEJpbmRpbmcgVHlwZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlJlc3BlY3RCaW5kaW5nVHlwZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRSZXNwZWN0QmluZGluZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUkVTUEVDVF9CSU5ESU5HX1RZUEUgPSAxMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUkVTUEVDVF9CSU5ESU5HX1RZUEVfX0VOQUJMRUQgPSBDb21tb25QYWNrYWdlLkoyRUVFX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNwZWN0IEJpbmRpbmcgVHlwZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBSRVNQRUNUX0JJTkRJTkdfVFlQRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkFkZHJlc3NpbmdUeXBlSW1wbCA8ZW0+QWRkcmVzc2luZyBUeXBlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuQWRkcmVzc2luZ1R5cGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0QWRkcmVzc2luZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQUREUkVTU0lOR19UWVBFID0gMTM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFERFJFU1NJTkdfVFlQRV9fRU5BQkxFRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQUREUkVTU0lOR19UWVBFX19SRVFVSVJFRCA9IENvbW1vblBhY2thZ2UuSjJFRUVfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNlczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFERFJFU1NJTkdfVFlQRV9fUkVTUE9OU0VTID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWRkcmVzc2luZyBUeXBlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFERFJFU1NJTkdfVFlQRV9GRUFUVVJFX0NPVU5UID0gQ29tbW9uUGFja2FnZS5KMkVFRV9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSA8ZW0+QWRkcmVzc2luZyBSZXNwb25zZXMgVHlwZTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkFkZHJlc3NpbmdSZXNwb25zZXNUeXBlCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0QWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQUREUkVTU0lOR19SRVNQT05TRVNfVFlQRSA9IDE0OworCisKKwkvKioKIAkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXMgPGVtPldlYiBTZXJ2aWNlczwvZW0+fScuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xMjI4LDYgKzEzNDEsMzkgQEAKIAlFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfSGFuZGxlckNoYWlucygpOwogCiAJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRNdG9tVGhyZXNob2xkIDxlbT5NdG9tIFRocmVzaG9sZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk10b20gVGhyZXNob2xkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQjZ2V0TXRvbVRocmVzaG9sZCgpCisJICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9NdG9tVGhyZXNob2xkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldFJlc3BlY3RCaW5kaW5nIDxlbT5SZXNwZWN0IEJpbmRpbmc8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5SZXNwZWN0IEJpbmRpbmc8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRSZXNwZWN0QmluZGluZygpCisJICogQHNlZSAjZ2V0UG9ydENvbXBvbmVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0UG9ydENvbXBvbmVudF9SZXNwZWN0QmluZGluZygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudCNnZXRBZGRyZXNzaW5nIDxlbT5BZGRyZXNzaW5nPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QWRkcmVzc2luZzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50I2dldEFkZHJlc3NpbmcoKQorCSAqIEBzZWUgI2dldFBvcnRDb21wb25lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFBvcnRDb21wb25lbnRfQWRkcmVzc2luZygpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0IDxlbT5XU0RMIFBvcnQ8L2VtPn0nLgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgpAQCAtMTQ4Myw2ICsxNjI5LDgwIEBACiAJRVJlZmVyZW5jZSBnZXRIYW5kbGVyc0NoYWluc19IYW5kbGVyQ2hhaW4oKTsKIAogCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5SZXNwZWN0QmluZGluZ1R5cGUgPGVtPlJlc3BlY3QgQmluZGluZyBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlc3BlY3QgQmluZGluZyBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlJlc3BlY3RCaW5kaW5nVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0UmVzcGVjdEJpbmRpbmdUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5SZXNwZWN0QmluZGluZ1R5cGUjaXNFbmFibGVkIDxlbT5FbmFibGVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5hYmxlZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5SZXNwZWN0QmluZGluZ1R5cGUjaXNFbmFibGVkKCkKKwkgKiBAc2VlICNnZXRSZXNwZWN0QmluZGluZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJlc3BlY3RCaW5kaW5nVHlwZV9FbmFibGVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQWRkcmVzc2luZ1R5cGUgPGVtPkFkZHJlc3NpbmcgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BZGRyZXNzaW5nIFR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQWRkcmVzc2luZ1R5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEFkZHJlc3NpbmdUeXBlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5BZGRyZXNzaW5nVHlwZSNpc0VuYWJsZWQgPGVtPkVuYWJsZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbmFibGVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkFkZHJlc3NpbmdUeXBlI2lzRW5hYmxlZCgpCisJICogQHNlZSAjZ2V0QWRkcmVzc2luZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEFkZHJlc3NpbmdUeXBlX0VuYWJsZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkFkZHJlc3NpbmdUeXBlI2lzUmVxdWlyZWQgPGVtPlJlcXVpcmVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVxdWlyZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQWRkcmVzc2luZ1R5cGUjaXNSZXF1aXJlZCgpCisJICogQHNlZSAjZ2V0QWRkcmVzc2luZ1R5cGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldEFkZHJlc3NpbmdUeXBlX1JlcXVpcmVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5BZGRyZXNzaW5nVHlwZSNnZXRSZXNwb25zZXMgPGVtPlJlc3BvbnNlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3BvbnNlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5BZGRyZXNzaW5nVHlwZSNnZXRSZXNwb25zZXMoKQorCSAqIEBzZWUgI2dldEFkZHJlc3NpbmdUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRBZGRyZXNzaW5nVHlwZV9SZXNwb25zZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIDxlbT5BZGRyZXNzaW5nIFJlc3BvbnNlcyBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+QWRkcmVzc2luZyBSZXNwb25zZXMgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRW51bSBnZXRBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSgpOworCisJLyoqCiAJICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CkBAIC0xNzU5LDYgKzE5NzksMzAgQEAKIAkJRVJlZmVyZW5jZSBQT1JUX0NPTVBPTkVOVF9fSEFORExFUl9DSEFJTlMgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVyQ2hhaW5zKCk7CiAKIAkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NdG9tIFRocmVzaG9sZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFBPUlRfQ09NUE9ORU5UX19NVE9NX1RIUkVTSE9MRCA9IGVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X010b21UaHJlc2hvbGQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3BlY3QgQmluZGluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFBPUlRfQ09NUE9ORU5UX19SRVNQRUNUX0JJTkRJTkcgPSBlSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9SZXNwZWN0QmluZGluZygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkcmVzc2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFBPUlRfQ09NUE9ORU5UX19BRERSRVNTSU5HID0gZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfQWRkcmVzc2luZygpOworCisJCS8qKgogCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV1NETFBvcnRJbXBsIDxlbT5XU0RMIFBvcnQ8L2VtPn0nIGNsYXNzLgogCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KQEAgLTE5NjgsNiArMjIxMiw2OCBAQAogCQkgKi8KIAkJRVJlZmVyZW5jZSBIQU5ETEVSU19DSEFJTlNfX0hBTkRMRVJfQ0hBSU4gPSBlSU5TVEFOQ0UuZ2V0SGFuZGxlcnNDaGFpbnNfSGFuZGxlckNoYWluKCk7CiAKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5SZXNwZWN0QmluZGluZ1R5cGVJbXBsIDxlbT5SZXNwZWN0IEJpbmRpbmcgVHlwZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlJlc3BlY3RCaW5kaW5nVHlwZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Xc2RkUGFja2FnZUltcGwjZ2V0UmVzcGVjdEJpbmRpbmdUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJFU1BFQ1RfQklORElOR19UWVBFID0gZUlOU1RBTkNFLmdldFJlc3BlY3RCaW5kaW5nVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW5hYmxlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJFU1BFQ1RfQklORElOR19UWVBFX19FTkFCTEVEID0gZUlOU1RBTkNFLmdldFJlc3BlY3RCaW5kaW5nVHlwZV9FbmFibGVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5BZGRyZXNzaW5nVHlwZUltcGwgPGVtPkFkZHJlc3NpbmcgVHlwZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkFkZHJlc3NpbmdUeXBlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLldzZGRQYWNrYWdlSW1wbCNnZXRBZGRyZXNzaW5nVHlwZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBBRERSRVNTSU5HX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0QWRkcmVzc2luZ1R5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBBRERSRVNTSU5HX1RZUEVfX0VOQUJMRUQgPSBlSU5TVEFOQ0UuZ2V0QWRkcmVzc2luZ1R5cGVfRW5hYmxlZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBBRERSRVNTSU5HX1RZUEVfX1JFUVVJUkVEID0gZUlOU1RBTkNFLmdldEFkZHJlc3NpbmdUeXBlX1JlcXVpcmVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBBRERSRVNTSU5HX1RZUEVfX1JFU1BPTlNFUyA9IGVJTlNUQU5DRS5nZXRBZGRyZXNzaW5nVHlwZV9SZXNwb25zZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSA8ZW0+QWRkcmVzc2luZyBSZXNwb25zZXMgVHlwZTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkFkZHJlc3NpbmdSZXNwb25zZXNUeXBlCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuV3NkZFBhY2thZ2VJbXBsI2dldEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gQUREUkVTU0lOR19SRVNQT05TRVNfVFlQRSA9IGVJTlNUQU5DRS5nZXRBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSgpOworCiAJfQogCiB9IC8vV3NkZFBhY2thZ2UKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Xc2RkUmVzb3VyY2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9Xc2RkUmVzb3VyY2UuamF2YQppbmRleCBhNjI0MDhjLi4xZWQzMGMyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvV3NkZFJlc291cmNlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL1dzZGRSZXNvdXJjZS5qYXZhCkBAIC00Niw1ICs0NiwxMCBAQAogCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzV2ViU2VydmljZTFfMigpOworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgV2ViU2VydmljZSBpcyBvZiB2ZXJzaW9uIDEuMgorCSAqIEByZXR1cm4gYm9vbGVhbiB2YWx1ZQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzV2ViU2VydmljZTFfMygpOwogICAKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0FkZHJlc3NpbmdUeXBlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvQWRkcmVzc2luZ1R5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzODFhOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0FkZHJlc3NpbmdUeXBlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5BZGRyZXNzaW5nUmVzcG9uc2VzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQWRkcmVzc2luZ1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWRkcmVzc2luZyBUeXBlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5BZGRyZXNzaW5nVHlwZUltcGwjaXNFbmFibGVkIDxlbT5FbmFibGVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5BZGRyZXNzaW5nVHlwZUltcGwjaXNSZXF1aXJlZCA8ZW0+UmVxdWlyZWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLkFkZHJlc3NpbmdUeXBlSW1wbCNnZXRSZXNwb25zZXMgPGVtPlJlc3BvbnNlczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEFkZHJlc3NpbmdUeXBlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFkZHJlc3NpbmdUeXBlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFbmFibGVkKCkgPGVtPkVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRW5hYmxlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVOQUJMRURfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW5hYmxlZCgpIDxlbT5FbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0VuYWJsZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQgPSBFTkFCTEVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVxdWlyZWQoKSA8ZW0+UmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzUmVxdWlyZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVFVSVJFRF9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXF1aXJlZCgpIDxlbT5SZXF1aXJlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNSZXF1aXJlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZWQgPSBSRVFVSVJFRF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNwb25zZXMoKSA8ZW0+UmVzcG9uc2VzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZXNwb25zZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgUkVTUE9OU0VTX0VERUZBVUxUID0gQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUuQU5PTllNT1VTX0xJVEVSQUw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNwb25zZXMoKSA8ZW0+UmVzcG9uc2VzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZXNwb25zZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSByZXNwb25zZXMgPSBSRVNQT05TRVNfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQWRkcmVzc2luZ1R5cGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gV3NkZFBhY2thZ2UuTGl0ZXJhbHMuQUREUkVTU0lOR19UWVBFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKKwkJcmV0dXJuIGVuYWJsZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIG5ld0VuYWJsZWQpIHsKKwkJYm9vbGVhbiBvbGRFbmFibGVkID0gZW5hYmxlZDsKKwkJZW5hYmxlZCA9IG5ld0VuYWJsZWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLkFERFJFU1NJTkdfVFlQRV9fRU5BQkxFRCwgb2xkRW5hYmxlZCwgZW5hYmxlZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7CisJCXJldHVybiByZXF1aXJlZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChib29sZWFuIG5ld1JlcXVpcmVkKSB7CisJCWJvb2xlYW4gb2xkUmVxdWlyZWQgPSByZXF1aXJlZDsKKwkJcmVxdWlyZWQgPSBuZXdSZXF1aXJlZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuQUREUkVTU0lOR19UWVBFX19SRVFVSVJFRCwgb2xkUmVxdWlyZWQsIHJlcXVpcmVkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIGdldFJlc3BvbnNlcygpIHsKKwkJcmV0dXJuIHJlc3BvbnNlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXNwb25zZXMoQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUgbmV3UmVzcG9uc2VzKSB7CisJCUFkZHJlc3NpbmdSZXNwb25zZXNUeXBlIG9sZFJlc3BvbnNlcyA9IHJlc3BvbnNlczsKKwkJcmVzcG9uc2VzID0gbmV3UmVzcG9uc2VzID09IG51bGwgPyBSRVNQT05TRVNfRURFRkFVTFQgOiBuZXdSZXNwb25zZXM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLkFERFJFU1NJTkdfVFlQRV9fUkVTUE9OU0VTLCBvbGRSZXNwb25zZXMsIHJlc3BvbnNlcykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV3NkZFBhY2thZ2UuQUREUkVTU0lOR19UWVBFX19FTkFCTEVEOgorCQkJCXJldHVybiBpc0VuYWJsZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisJCQljYXNlIFdzZGRQYWNrYWdlLkFERFJFU1NJTkdfVFlQRV9fUkVRVUlSRUQ6CisJCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisJCQljYXNlIFdzZGRQYWNrYWdlLkFERFJFU1NJTkdfVFlQRV9fUkVTUE9OU0VTOgorCQkJCXJldHVybiBnZXRSZXNwb25zZXMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXc2RkUGFja2FnZS5BRERSRVNTSU5HX1RZUEVfX0VOQUJMRUQ6CisJCQkJc2V0RW5hYmxlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdzZGRQYWNrYWdlLkFERFJFU1NJTkdfVFlQRV9fUkVRVUlSRUQ6CisJCQkJc2V0UmVxdWlyZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXc2RkUGFja2FnZS5BRERSRVNTSU5HX1RZUEVfX1JFU1BPTlNFUzoKKwkJCQlzZXRSZXNwb25zZXMoKEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXc2RkUGFja2FnZS5BRERSRVNTSU5HX1RZUEVfX0VOQUJMRUQ6CisJCQkJc2V0RW5hYmxlZChFTkFCTEVEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdzZGRQYWNrYWdlLkFERFJFU1NJTkdfVFlQRV9fUkVRVUlSRUQ6CisJCQkJc2V0UmVxdWlyZWQoUkVRVUlSRURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgV3NkZFBhY2thZ2UuQUREUkVTU0lOR19UWVBFX19SRVNQT05TRVM6CisJCQkJc2V0UmVzcG9uc2VzKFJFU1BPTlNFU19FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdzZGRQYWNrYWdlLkFERFJFU1NJTkdfVFlQRV9fRU5BQkxFRDoKKwkJCQlyZXR1cm4gZW5hYmxlZCAhPSBFTkFCTEVEX0VERUZBVUxUOworCQkJY2FzZSBXc2RkUGFja2FnZS5BRERSRVNTSU5HX1RZUEVfX1JFUVVJUkVEOgorCQkJCXJldHVybiByZXF1aXJlZCAhPSBSRVFVSVJFRF9FREVGQVVMVDsKKwkJCWNhc2UgV3NkZFBhY2thZ2UuQUREUkVTU0lOR19UWVBFX19SRVNQT05TRVM6CisJCQkJcmV0dXJuIHJlc3BvbnNlcyAhPSBSRVNQT05TRVNfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChlbmFibGVkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKGVuYWJsZWQpOworCQlyZXN1bHQuYXBwZW5kKCIsIHJlcXVpcmVkOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXN1bHQuYXBwZW5kKHJlcXVpcmVkKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByZXNwb25zZXM6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQocmVzcG9uc2VzKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vQWRkcmVzc2luZ1R5cGVJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9CZWFuTGlua0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0JlYW5MaW5rSW1wbC5qYXZhCmluZGV4IDc4Y2I4NTcuLmIxZDBiOTggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0JlYW5MaW5rSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0JlYW5MaW5rSW1wbC5qYXZhCkBAIC00MSw3ICs0MSw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisgIEBPdmVycmlkZQorcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5CRUFOX0xJTks7CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9FSkJMaW5rSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvRUpCTGlua0ltcGwuamF2YQppbmRleCAwYWY1YjFkLi5iNmNlODdlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9FSkJMaW5rSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0VKQkxpbmtJbXBsLmphdmEKQEAgLTY2LDcgKzY2LDggQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKyAgQE92ZXJyaWRlCitwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdzZGRQYWNrYWdlLkxpdGVyYWxzLkVKQl9MSU5LOwogCX0KIApAQCAtOTYsNiArOTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLkVKQl9MSU5LX19FSkJfTElOSzoKQEAgLTEwOSw2ICsxMTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2RkUGFja2FnZS5FSkJfTElOS19fRUpCX0xJTks6CkBAIC0xMjMsNiArMTI2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuRUpCX0xJTktfX0VKQl9MSU5LOgpAQCAtMTM3LDYgKzE0MSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLkVKQl9MSU5LX19FSkJfTElOSzoKQEAgLTE1MCwxMSArMTU1LDEyIEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgQE92ZXJyaWRlCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZWpiTGluazogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoZWpiTGluazogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChlamJMaW5rKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9IYW5kbGVyQ2hhaW5JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9IYW5kbGVyQ2hhaW5JbXBsLmphdmEKaW5kZXggNDE5NzQ3MS4uMzUzZmMwOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlckNoYWluSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0hhbmRsZXJDaGFpbkltcGwuamF2YQpAQCAtMiw3ICsyLDcgQEAKICAqIDxjb3B5cmlnaHQ+CiAgKiA8L2NvcHlyaWdodD4KICAqCi0gKiAkSWQ6IEhhbmRsZXJDaGFpbkltcGwuamF2YSx2IDEuMSAyMDA3LzEyLzEyIDIyOjU3OjEzIGNicmlkZ2hhIEV4cCAkCisgKiAkSWQ6IEhhbmRsZXJDaGFpbkltcGwuamF2YSx2IDEuMyAyMDA5LzA2LzA5IDIyOjM4OjM5IGpzaG9sbCBFeHAgJAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsOwogCkBAIC0xMTksNiArMTE5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5IQU5ETEVSX0NIQUlOOwogCX0KQEAgLTE5NCw2ICsxOTUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfQ0hBSU5fX0hBTkRMRVJTOgpAQCAtMjA3LDYgKzIwOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk46CkBAIC0yMjYsNiArMjI5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk46CkBAIC0yNTEsNiArMjU1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk46CkBAIC0yNzQsNiArMjc5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTl9fU0VSVklDRV9OQU1FX1BBVFRFUk46CkBAIC0yOTMsMTUgKzI5OSwxNiBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2VydmljZU5hbWVQYXR0ZXJuOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzZXJ2aWNlTmFtZVBhdHRlcm46ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoc2VydmljZU5hbWVQYXR0ZXJuKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwb3J0TmFtZVBhdHRlcm46ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBvcnROYW1lUGF0dGVybjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChwb3J0TmFtZVBhdHRlcm4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb3RvY29sQmluZGluZ3M6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHByb3RvY29sQmluZGluZ3M6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQocHJvdG9jb2xCaW5kaW5ncyk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0hhbmRsZXJJbXBsLmphdmEKaW5kZXggYzZkZDk1NS4uNjZkOWM0ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlckltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9IYW5kbGVySW1wbC5qYXZhCkBAIC0xMzEsNyArMTMxLDggQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKyAgQE92ZXJyaWRlCitwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdzZGRQYWNrYWdlLkxpdGVyYWxzLkhBTkRMRVI7CiAJfQogCkBAIC0yMTgsNiArMjE5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19JTklUX1BBUkFNUzoKQEAgLTIzNSw2ICsyMzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRToKQEAgLTI1Niw2ICsyNTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSX19IQU5ETEVSX05BTUU6CkBAIC0yODUsNiArMjg5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FOgpAQCAtMzExLDYgKzMxNiw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRToKQEAgLTMzMiwxMyArMzM4LDE0IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgQE92ZXJyaWRlCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaGFuZGxlck5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGhhbmRsZXJOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGhhbmRsZXJOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoYW5kbGVyQ2xhc3M6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGhhbmRsZXJDbGFzczogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChoYW5kbGVyQ2xhc3MpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL0hhbmRsZXJzQ2hhaW5zSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlcnNDaGFpbnNJbXBsLmphdmEKaW5kZXggZWIxNzRhNi4uZDk3NDE4ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlcnNDaGFpbnNJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvSGFuZGxlcnNDaGFpbnNJbXBsLmphdmEKQEAgLTIsNyArMiw3IEBACiAgKiA8Y29weXJpZ2h0PgogICogPC9jb3B5cmlnaHQ+CiAgKgotICogJElkOiBIYW5kbGVyc0NoYWluc0ltcGwuamF2YSx2IDEuMSAyMDA3LzEyLzEyIDIyOjU3OjEzIGNicmlkZ2hhIEV4cCAkCisgKiAkSWQ6IEhhbmRsZXJzQ2hhaW5zSW1wbC5qYXZhLHYgMS4yIDIwMDkvMDYvMDkgMTk6MzU6NTUganNob2xsIEV4cCAkCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGw7CiAKQEAgLTYyLDYgKzYyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5IQU5ETEVSU19DSEFJTlM7CiAJfQpAQCAtODMsNiArODQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJTX0NIQUlOU19fSEFORExFUl9DSEFJTjoKQEAgLTk2LDYgKzk4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSU19DSEFJTlNfX0hBTkRMRVJfQ0hBSU46CkBAIC0xMDksNiArMTEyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUlNfQ0hBSU5TX19IQU5ETEVSX0NIQUlOOgpAQCAtMTI0LDYgKzEyOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJTX0NIQUlOU19fSEFORExFUl9DSEFJTjoKQEAgLTEzOCw2ICsxNDMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSU19DSEFJTlNfX0hBTkRMRVJfQ0hBSU46CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Qb3J0Q29tcG9uZW50SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvUG9ydENvbXBvbmVudEltcGwuamF2YQppbmRleCA0ODE0YjczLi5lMjdhNWNjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Qb3J0Q29tcG9uZW50SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1BvcnRDb21wb25lbnRJbXBsLmphdmEKQEAgLTEwLDYgKzEwLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKIAoraW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwpAQCAtMjQsOSArMjUsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFRU9iamVjdEltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkFkZHJlc3NpbmdUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyc0NoYWluczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUG9ydENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuUmVzcGVjdEJpbmRpbmdUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMU2VydmljZTsKQEAgLTU2LDYgKzU5LDkgQEAKICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNpc0VuYWJsZU10b20gPGVtPkVuYWJsZSBNdG9tPC9lbT59PC9saT4KICAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXRQcm90b2NvbEJpbmRpbmcgPGVtPlByb3RvY29sIEJpbmRpbmc8L2VtPn08L2xpPgogICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlBvcnRDb21wb25lbnRJbXBsI2dldEhhbmRsZXJDaGFpbnMgPGVtPkhhbmRsZXIgQ2hhaW5zPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbC5Qb3J0Q29tcG9uZW50SW1wbCNnZXRNdG9tVGhyZXNob2xkIDxlbT5NdG9tIFRocmVzaG9sZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjZ2V0UmVzcGVjdEJpbmRpbmcgPGVtPlJlc3BlY3QgQmluZGluZzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLmludGVybmFsLmltcGwuUG9ydENvbXBvbmVudEltcGwjZ2V0QWRkcmVzc2luZyA8ZW0+QWRkcmVzc2luZzwvZW0+fTwvbGk+CiAgKiA8L3VsPgogICogPC9wPgogICoKQEAgLTMwNCw2ICszMTAsNDYgQEAKIAlwcm90ZWN0ZWQgSGFuZGxlcnNDaGFpbnMgaGFuZGxlckNoYWluczsKIAogCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNdG9tVGhyZXNob2xkKCkgPGVtPk10b20gVGhyZXNob2xkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNdG9tVGhyZXNob2xkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTVRPTV9USFJFU0hPTERfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXRvbVRocmVzaG9sZCgpIDxlbT5NdG9tIFRocmVzaG9sZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TXRvbVRocmVzaG9sZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJpZ0ludGVnZXIgbXRvbVRocmVzaG9sZCA9IE1UT01fVEhSRVNIT0xEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcGVjdEJpbmRpbmcoKSA8ZW0+UmVzcGVjdCBCaW5kaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRSZXNwZWN0QmluZGluZygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFJlc3BlY3RCaW5kaW5nVHlwZSByZXNwZWN0QmluZGluZzsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZHJlc3NpbmcoKSA8ZW0+QWRkcmVzc2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QWRkcmVzc2luZygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEFkZHJlc3NpbmdUeXBlIGFkZHJlc3Npbmc7CisKKwkvKioKIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCkBAIC0zMTcsNyArMzYzLDggQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKyAgQE92ZXJyaWRlCitwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdzZGRQYWNrYWdlLkxpdGVyYWxzLlBPUlRfQ09NUE9ORU5UOwogCX0KIApAQCAtODA3LDYgKzg1NCwxMTQgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJcHVibGljIEJpZ0ludGVnZXIgZ2V0TXRvbVRocmVzaG9sZCgpIHsKKwkJcmV0dXJuIG10b21UaHJlc2hvbGQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TXRvbVRocmVzaG9sZChCaWdJbnRlZ2VyIG5ld010b21UaHJlc2hvbGQpIHsKKwkJQmlnSW50ZWdlciBvbGRNdG9tVGhyZXNob2xkID0gbXRvbVRocmVzaG9sZDsKKwkJbXRvbVRocmVzaG9sZCA9IG5ld010b21UaHJlc2hvbGQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19NVE9NX1RIUkVTSE9MRCwgb2xkTXRvbVRocmVzaG9sZCwgbXRvbVRocmVzaG9sZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSZXNwZWN0QmluZGluZ1R5cGUgZ2V0UmVzcGVjdEJpbmRpbmcoKSB7CisJCXJldHVybiByZXNwZWN0QmluZGluZzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXNwZWN0QmluZGluZyhSZXNwZWN0QmluZGluZ1R5cGUgbmV3UmVzcGVjdEJpbmRpbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJUmVzcGVjdEJpbmRpbmdUeXBlIG9sZFJlc3BlY3RCaW5kaW5nID0gcmVzcGVjdEJpbmRpbmc7CisJCXJlc3BlY3RCaW5kaW5nID0gbmV3UmVzcGVjdEJpbmRpbmc7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19SRVNQRUNUX0JJTkRJTkcsIG9sZFJlc3BlY3RCaW5kaW5nLCBuZXdSZXNwZWN0QmluZGluZyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0UmVzcGVjdEJpbmRpbmcoUmVzcGVjdEJpbmRpbmdUeXBlIG5ld1Jlc3BlY3RCaW5kaW5nKSB7CisJCWlmIChuZXdSZXNwZWN0QmluZGluZyAhPSByZXNwZWN0QmluZGluZykgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAocmVzcGVjdEJpbmRpbmcgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVzcGVjdEJpbmRpbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fUkVTUEVDVF9CSU5ESU5HLCBudWxsLCBtc2dzKTsKKwkJCWlmIChuZXdSZXNwZWN0QmluZGluZyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZXNwZWN0QmluZGluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19SRVNQRUNUX0JJTkRJTkcsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0UmVzcGVjdEJpbmRpbmcobmV3UmVzcGVjdEJpbmRpbmcsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1JFU1BFQ1RfQklORElORywgbmV3UmVzcGVjdEJpbmRpbmcsIG5ld1Jlc3BlY3RCaW5kaW5nKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkZHJlc3NpbmdUeXBlIGdldEFkZHJlc3NpbmcoKSB7CisJCXJldHVybiBhZGRyZXNzaW5nOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFkZHJlc3NpbmcoQWRkcmVzc2luZ1R5cGUgbmV3QWRkcmVzc2luZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlBZGRyZXNzaW5nVHlwZSBvbGRBZGRyZXNzaW5nID0gYWRkcmVzc2luZzsKKwkJYWRkcmVzc2luZyA9IG5ld0FkZHJlc3Npbmc7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgeworCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19BRERSRVNTSU5HLCBvbGRBZGRyZXNzaW5nLCBuZXdBZGRyZXNzaW5nKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBZGRyZXNzaW5nKEFkZHJlc3NpbmdUeXBlIG5ld0FkZHJlc3NpbmcpIHsKKwkJaWYgKG5ld0FkZHJlc3NpbmcgIT0gYWRkcmVzc2luZykgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYWRkcmVzc2luZyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhZGRyZXNzaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0FERFJFU1NJTkcsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0FkZHJlc3NpbmcgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWRkcmVzc2luZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19BRERSRVNTSU5HLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldEFkZHJlc3NpbmcobmV3QWRkcmVzc2luZywgbXNncyk7CisJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7CisJCX0KKwkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fQUREUkVTU0lORywgbmV3QWRkcmVzc2luZywgbmV3QWRkcmVzc2luZykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1dTRExfUE9SVDoKQEAgLTgyNSw2ICs5ODAsMTAgQEAKIAkJCQlyZXR1cm4gYmFzaWNTZXRXc2RsU2VydmljZShudWxsLCBtc2dzKTsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TOgogCQkJCXJldHVybiBiYXNpY1NldEhhbmRsZXJDaGFpbnMobnVsbCwgbXNncyk7CisJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19SRVNQRUNUX0JJTkRJTkc6CisJCQkJcmV0dXJuIGJhc2ljU2V0UmVzcGVjdEJpbmRpbmcobnVsbCwgbXNncyk7CisJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19BRERSRVNTSU5HOgorCQkJCXJldHVybiBiYXNpY1NldEFkZHJlc3NpbmcobnVsbCwgbXNncyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwogCX0KQEAgLTgzNCw2ICs5OTMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FOgpAQCAtODY4LDYgKzEwMjgsMTIgQEAKIAkJCQlyZXR1cm4gZ2V0UHJvdG9jb2xCaW5kaW5nKCk7CiAJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSX0NIQUlOUzoKIAkJCQlyZXR1cm4gZ2V0SGFuZGxlckNoYWlucygpOworCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fTVRPTV9USFJFU0hPTEQ6CisJCQkJcmV0dXJuIGdldE10b21UaHJlc2hvbGQoKTsKKwkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1JFU1BFQ1RfQklORElORzoKKwkJCQlyZXR1cm4gZ2V0UmVzcGVjdEJpbmRpbmcoKTsKKwkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0FERFJFU1NJTkc6CisJCQkJcmV0dXJuIGdldEFkZHJlc3NpbmcoKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKIAl9CkBAIC04NzcsNiArMTA0Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FOgpAQCAtOTI4LDYgKzEwOTUsMTUgQEAKIAkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TOgogCQkJCXNldEhhbmRsZXJDaGFpbnMoKEhhbmRsZXJzQ2hhaW5zKW5ld1ZhbHVlKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19NVE9NX1RIUkVTSE9MRDoKKwkJCQlzZXRNdG9tVGhyZXNob2xkKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19SRVNQRUNUX0JJTkRJTkc6CisJCQkJc2V0UmVzcGVjdEJpbmRpbmcoKFJlc3BlY3RCaW5kaW5nVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fQUREUkVTU0lORzoKKwkJCQlzZXRBZGRyZXNzaW5nKChBZGRyZXNzaW5nVHlwZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOwogCQl9CiAJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CiAJfQpAQCAtOTM3LDYgKzExMTMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fUE9SVF9DT01QT05FTlRfTkFNRToKQEAgLTk4Nyw2ICsxMTY0LDE1IEBACiAJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSX0NIQUlOUzoKIAkJCQlzZXRIYW5kbGVyQ2hhaW5zKChIYW5kbGVyc0NoYWlucyludWxsKTsKIAkJCQlyZXR1cm47CisJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19NVE9NX1RIUkVTSE9MRDoKKwkJCQlzZXRNdG9tVGhyZXNob2xkKE1UT01fVEhSRVNIT0xEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19SRVNQRUNUX0JJTkRJTkc6CisJCQkJc2V0UmVzcGVjdEJpbmRpbmcoKFJlc3BlY3RCaW5kaW5nVHlwZSludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19BRERSRVNTSU5HOgorCQkJCXNldEFkZHJlc3NpbmcoKEFkZHJlc3NpbmdUeXBlKW51bGwpOworCQkJCXJldHVybjsKIAkJfQogCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKIAl9CkBAIC05OTYsNiArMTE4Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FOgpAQCAtMTAzMCw2ICsxMjE3LDEyIEBACiAJCQkJcmV0dXJuIFBST1RPQ09MX0JJTkRJTkdfRURFRkFVTFQgPT0gbnVsbCA/IHByb3RvY29sQmluZGluZyAhPSBudWxsIDogIVBST1RPQ09MX0JJTkRJTkdfRURFRkFVTFQuZXF1YWxzKHByb3RvY29sQmluZGluZyk7CiAJCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19IQU5ETEVSX0NIQUlOUzoKIAkJCQlyZXR1cm4gaGFuZGxlckNoYWlucyAhPSBudWxsOworCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fTVRPTV9USFJFU0hPTEQ6CisJCQkJcmV0dXJuIE1UT01fVEhSRVNIT0xEX0VERUZBVUxUID09IG51bGwgPyBtdG9tVGhyZXNob2xkICE9IG51bGwgOiAhTVRPTV9USFJFU0hPTERfRURFRkFVTFQuZXF1YWxzKG10b21UaHJlc2hvbGQpOworCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fUkVTUEVDVF9CSU5ESU5HOgorCQkJCXJldHVybiByZXNwZWN0QmluZGluZyAhPSBudWxsOworCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fQUREUkVTU0lORzoKKwkJCQlyZXR1cm4gYWRkcmVzc2luZyAhPSBudWxsOwogCQl9CiAJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKIAl9CkBAIC0xMDM5LDI2ICsxMjMyLDI5IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgQE92ZXJyaWRlCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocG9ydENvbXBvbmVudE5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKHBvcnRDb21wb25lbnROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHBvcnRDb21wb25lbnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNtYWxsSWNvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgc21hbGxJY29uOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHNtYWxsSWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFyZ2VJY29uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBsYXJnZUljb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQobGFyZ2VJY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRpc3BsYXlOYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBkaXNwbGF5TmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChkaXNwbGF5TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZW5hYmxlTXRvbTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgZW5hYmxlTXRvbTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChlbmFibGVNdG9tKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm90b2NvbEJpbmRpbmc6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHByb3RvY29sQmluZGluZzogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChwcm90b2NvbEJpbmRpbmcpOworCQlyZXN1bHQuYXBwZW5kKCIsIG10b21UaHJlc2hvbGQ6ICIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQobXRvbVRocmVzaG9sZCk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1Jlc3BlY3RCaW5kaW5nVHlwZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1Jlc3BlY3RCaW5kaW5nVHlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWExNjA2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvUmVzcGVjdEJpbmRpbmdUeXBlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVFT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5SZXNwZWN0QmluZGluZ1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzcGVjdCBCaW5kaW5nIFR5cGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC5pbXBsLlJlc3BlY3RCaW5kaW5nVHlwZUltcGwjaXNFbmFibGVkIDxlbT5FbmFibGVkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUmVzcGVjdEJpbmRpbmdUeXBlSW1wbCBleHRlbmRzIEoyRUVFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlc3BlY3RCaW5kaW5nVHlwZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW5hYmxlZCgpIDxlbT5FbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0VuYWJsZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTkFCTEVEX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VuYWJsZWQoKSA8ZW0+RW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNFbmFibGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVkID0gRU5BQkxFRF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBSZXNwZWN0QmluZGluZ1R5cGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gV3NkZFBhY2thZ2UuTGl0ZXJhbHMuUkVTUEVDVF9CSU5ESU5HX1RZUEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgeworCQlyZXR1cm4gZW5hYmxlZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gbmV3RW5hYmxlZCkgeworCQlib29sZWFuIG9sZEVuYWJsZWQgPSBlbmFibGVkOworCQllbmFibGVkID0gbmV3RW5hYmxlZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgV3NkZFBhY2thZ2UuUkVTUEVDVF9CSU5ESU5HX1RZUEVfX0VOQUJMRUQsIG9sZEVuYWJsZWQsIGVuYWJsZWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIFdzZGRQYWNrYWdlLlJFU1BFQ1RfQklORElOR19UWVBFX19FTkFCTEVEOgorCQkJCXJldHVybiBpc0VuYWJsZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgV3NkZFBhY2thZ2UuUkVTUEVDVF9CSU5ESU5HX1RZUEVfX0VOQUJMRUQ6CisJCQkJc2V0RW5hYmxlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXc2RkUGFja2FnZS5SRVNQRUNUX0JJTkRJTkdfVFlQRV9fRU5BQkxFRDoKKwkJCQlzZXRFbmFibGVkKEVOQUJMRURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBXc2RkUGFja2FnZS5SRVNQRUNUX0JJTkRJTkdfVFlQRV9fRU5BQkxFRDoKKwkJCQlyZXR1cm4gZW5hYmxlZCAhPSBFTkFCTEVEX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoZW5hYmxlZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJcmVzdWx0LmFwcGVuZChlbmFibGVkKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vUmVzcGVjdEJpbmRpbmdUeXBlSW1wbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvU2VydmljZUltcGxCZWFuSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvU2VydmljZUltcGxCZWFuSW1wbC5qYXZhCmluZGV4IGJkOWI5YzAuLmQyM2RhZDAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VJbXBsQmVhbkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlSW1wbEJlYW5JbXBsLmphdmEKQEAgLTg0LDcgKzg0LDggQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKyAgQE92ZXJyaWRlCitwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdzZGRQYWNrYWdlLkxpdGVyYWxzLlNFUlZJQ0VfSU1QTF9CRUFOOwogCX0KIApAQCAtMjIyLDYgKzIyMyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSzoKQEAgLTIzOSw2ICsyNDEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FRUpCX0xJTks6CkBAIC0yNTYsNiArMjU5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSzoKQEAgLTI3Niw2ICsyODAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2RkUGFja2FnZS5TRVJWSUNFX0lNUExfQkVBTl9fRUVKQl9MSU5LOgpAQCAtMjk2LDYgKzMwMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FRUpCX0xJTks6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9TZXJ2bGV0TGlua0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1NlcnZsZXRMaW5rSW1wbC5qYXZhCmluZGV4IDAxYTk1YTYuLjIwNTViYWMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1NlcnZsZXRMaW5rSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1NlcnZsZXRMaW5rSW1wbC5qYXZhCkBAIC02Niw3ICs2Niw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisgIEBPdmVycmlkZQorcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5TRVJWTEVUX0xJTks7CiAJfQogCkBAIC05Niw2ICs5Nyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVkxFVF9MSU5LX19TRVJWTEVUX0xJTks6CkBAIC0xMDksNiArMTExLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVkxFVF9MSU5LX19TRVJWTEVUX0xJTks6CkBAIC0xMjMsNiArMTI2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVkxFVF9MSU5LX19TRVJWTEVUX0xJTks6CkBAIC0xMzcsNiArMTQxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVkxFVF9MSU5LX19TRVJWTEVUX0xJTks6CkBAIC0xNTAsMTEgKzE1NSwxMiBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgIEBPdmVycmlkZQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlcnZsZXRMaW5rOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChzZXJ2bGV0TGluazogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChzZXJ2bGV0TGluayk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV1NETFBvcnRJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydEltcGwuamF2YQppbmRleCA5NzMwYTc3Li4yODNhM2FiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydEltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydEltcGwuamF2YQpAQCAtNDEsNyArNDEsOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gV3NkZFBhY2thZ2UuTGl0ZXJhbHMuV1NETF9QT1JUOwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV1NETFNlcnZpY2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XU0RMU2VydmljZUltcGwuamF2YQppbmRleCBkMmM4MDY3Li45ZTdmYzZmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XU0RMU2VydmljZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XU0RMU2VydmljZUltcGwuamF2YQpAQCAtMiw3ICsyLDcgQEAKICAqIDxjb3B5cmlnaHQ+CiAgKiA8L2NvcHlyaWdodD4KICAqCi0gKiAkSWQ6IFdTRExTZXJ2aWNlSW1wbC5qYXZhLHYgMS4xIDIwMDcvMTIvMTIgMjI6NTc6MTMgY2JyaWRnaGEgRXhwICQKKyAqICRJZDogV1NETFNlcnZpY2VJbXBsLmphdmEsdiAxLjIgMjAwOS8wNi8wOSAxOTozNTo1NSBqc2hvbGwgRXhwICQKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKIApAQCAtMzcsNiArMzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdzZGRQYWNrYWdlLkxpdGVyYWxzLldTRExfU0VSVklDRTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlRGVzY3JpcHRpb25JbXBsLmphdmEKaW5kZXggZDk0MjM5OS4uOTI3Mjg3ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV2ViU2VydmljZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VEZXNjcmlwdGlvbkltcGwuamF2YQpAQCAtMjU0LDcgKzI1NCw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisgIEBPdmVycmlkZQorcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBXc2RkUGFja2FnZS5MaXRlcmFscy5XRUJfU0VSVklDRV9ERVNDUklQVElPTjsKIAl9CiAKQEAgLTY2NSw2ICs2NjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19QT1JUX0NPTVBPTkVOVFM6CkBAIC02ODQsNiArNjg2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRToKQEAgLTcxNyw2ICs3MjAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRToKQEAgLTc2Miw2ICs3NjYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRToKQEAgLTgwNiw2ICs4MTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSkFYUlBDX01BUFBJTkdfRklMRToKQEAgLTgzOSwyMyArODQ1LDI0IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgQE92ZXJyaWRlCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoamF4cnBjTWFwcGluZ0ZpbGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGpheHJwY01hcHBpbmdGaWxlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGpheHJwY01hcHBpbmdGaWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB3ZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHdlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxGaWxlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsRmlsZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh3c2RsRmlsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc21hbGxJY29uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzbWFsbEljb246ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoc21hbGxJY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYXJnZUljb246ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGxhcmdlSWNvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChsYXJnZUljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGlzcGxheU5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGRpc3BsYXlOYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGRpc3BsYXlOYW1lKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9XZWJTZXJ2aWNlc0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzSW1wbC5qYXZhCmluZGV4IDQyZDRjMGYuLmJhNzI2NjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dlYlNlcnZpY2VzSW1wbC5qYXZhCkBAIC02MywxNCArNjMsMTYgQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKyAgQE92ZXJyaWRlCitwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIFdzZGRQYWNrYWdlLkxpdGVyYWxzLldFQl9TRVJWSUNFUzsKIAl9CiAKICAgLyoqCiAgICAqCiAgICAqLwotICBwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKKyAgQE92ZXJyaWRlCitwdWJsaWMgdm9pZCBzZXREaXNwbGF5TmFtZShTdHJpbmcgbmV3RGlzcGxheU5hbWUpIHsKICAgCXN1cGVyLnNldERpc3BsYXlOYW1lKG5ld0Rpc3BsYXlOYW1lKTsKICAgfQogICAKQEAgLTkxLDYgKzkzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OUzoKQEAgLTEwNCw2ICsxMDcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TOgpAQCAtMTE3LDYgKzEyMSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TOgpAQCAtMTMyLDYgKzEzNyw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TOgpAQCAtMTQ2LDYgKzE1Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFU19fV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05TOgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV3NkZEZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Xc2RkRmFjdG9yeUltcGwuamF2YQppbmRleCBlY2FjY2Y3Li5kZDRlOGUyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Xc2RkRmFjdG9yeUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Xc2RkRmFjdG9yeUltcGwuamF2YQpAQCAtMTEsNiArMTEsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuaW50ZXJuYWwuaW1wbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwpAQCAtNDUsNyArNDYsNyBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgV3NkZEZhY3RvcnkgaW5pdCgpIHsKIAkJdHJ5IHsKLQkJCVdzZGRGYWN0b3J5IHRoZVdzZGRGYWN0b3J5ID0gKFdzZGRGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJ3c2RkLnhtaSIpOyAKKwkJCVdzZGRGYWN0b3J5IHRoZVdzZGRGYWN0b3J5ID0gKFdzZGRGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJ3c2RkLnhtaSIpOyAvLyROT04tTkxTLTEkIAogCQkJaWYgKHRoZVdzZGRGYWN0b3J5ICE9IG51bGwpIHsKIAkJCQlyZXR1cm4gdGhlV3NkZEZhY3Rvcnk7CiAJCQl9CkBAIC03MSw3ICs3Miw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKKyAgQE92ZXJyaWRlCitwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewogCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVM6IHJldHVybiBjcmVhdGVXZWJTZXJ2aWNlcygpOwogCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTjogcmV0dXJuIGNyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbigpOwpAQCAtODUsOCArODcsNDAgQEAKIAkJCWNhc2UgV3NkZFBhY2thZ2UuV1NETF9TRVJWSUNFOiByZXR1cm4gY3JlYXRlV1NETFNlcnZpY2UoKTsKIAkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9DSEFJTjogcmV0dXJuIGNyZWF0ZUhhbmRsZXJDaGFpbigpOwogCQkJY2FzZSBXc2RkUGFja2FnZS5IQU5ETEVSU19DSEFJTlM6IHJldHVybiBjcmVhdGVIYW5kbGVyc0NoYWlucygpOworCQkJY2FzZSBXc2RkUGFja2FnZS5SRVNQRUNUX0JJTkRJTkdfVFlQRTogcmV0dXJuIGNyZWF0ZVJlc3BlY3RCaW5kaW5nVHlwZSgpOworCQkJY2FzZSBXc2RkUGFja2FnZS5BRERSRVNTSU5HX1RZUEU6IHJldHVybiBjcmVhdGVBZGRyZXNzaW5nVHlwZSgpOwogCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgV3NkZFBhY2thZ2UuQUREUkVTU0lOR19SRVNQT05TRVNfVFlQRToKKwkJCQlyZXR1cm4gY3JlYXRlQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWRlZmF1bHQ6CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCX0KKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBXc2RkUGFja2FnZS5BRERSRVNTSU5HX1JFU1BPTlNFU19UWVBFOgorCQkJCXJldHVybiBjb252ZXJ0QWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJfQogCX0KIApAQCAtMjEyLDYgKzI0Niw0NiBAQAogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlc3BlY3RCaW5kaW5nVHlwZSBjcmVhdGVSZXNwZWN0QmluZGluZ1R5cGUoKSB7CisJCVJlc3BlY3RCaW5kaW5nVHlwZUltcGwgcmVzcGVjdEJpbmRpbmdUeXBlID0gbmV3IFJlc3BlY3RCaW5kaW5nVHlwZUltcGwoKTsKKwkJcmV0dXJuIHJlc3BlY3RCaW5kaW5nVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRkcmVzc2luZ1R5cGUgY3JlYXRlQWRkcmVzc2luZ1R5cGUoKSB7CisJCUFkZHJlc3NpbmdUeXBlSW1wbCBhZGRyZXNzaW5nVHlwZSA9IG5ldyBBZGRyZXNzaW5nVHlwZUltcGwoKTsKKwkJcmV0dXJuIGFkZHJlc3NpbmdUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSBjcmVhdGVBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSByZXN1bHQgPSBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKKwkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0QWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Xc2RkUGFja2FnZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRQYWNrYWdlSW1wbC5qYXZhCmluZGV4IGU2MGE4N2MuLjIzNmIxMTQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRQYWNrYWdlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRQYWNrYWdlSW1wbC5qYXZhCkBAIC0xMiwzNyArMTIsMjUgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5pbnRlcm5hbC5pbXBsLkNsaWVudFBhY2thZ2VJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkNvbW1vblBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLkVqYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkpjYVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5Kc3BQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5pbnRlcm5hbC5pbXBsLkpzcFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5UYWdsaWJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRhZ2xpYi5pbnRlcm5hbC5pbXBsLlRhZ2xpYlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYnNlcnZpY2VfY2xpZW50UGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUNvcmVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUluaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5pbnRlcm5hbC5pbXBsLldzY29tbW9uUGFja2FnZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkFkZHJlc3NpbmdSZXNwb25zZXNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5BZGRyZXNzaW5nVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbms7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbms7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXJDaGFpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcnNDaGFpbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlJlc3BlY3RCaW5kaW5nVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFuOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGluazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7CkBAIC0xNDYsNiArMTM0LDI3IEBACiAJcHJpdmF0ZSBFQ2xhc3MgaGFuZGxlcnNDaGFpbnNFQ2xhc3MgPSBudWxsOwogCiAJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgcmVzcGVjdEJpbmRpbmdUeXBlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGFkZHJlc3NpbmdUeXBlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gYWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGVFRW51bSA9IG51bGw7CisKKwkvKioKIAkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCiAJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKIAkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KQEAgLTE2OSwyMyArMTc4LDEzIEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOworICBwcml2YXRlIHZvbGF0aWxlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CiAKIAkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIFdzZGRQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgorCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQHNlZSAjZU5TX1VSSQpAQCAtMTk3LDU4ICsxOTYsMzEgQEAKIAkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFdzZGRQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdzZGRQYWNrYWdlLmVOU19VUkkpOwogCiAJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJV3NkZFBhY2thZ2VJbXBsIHRoZVdzZGRQYWNrYWdlID0gKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2RkUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBXc2RkUGFja2FnZUltcGwoKSk7CisJCVdzZGRQYWNrYWdlSW1wbCB0aGVXc2RkUGFja2FnZSA9IAorCQkJKFdzZGRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YKKwkJCQkJV3NkZFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3CisJCQkJCQkJV3NkZFBhY2thZ2VJbXBsKCkpOwogCiAJCWlzSW5pdGVkID0gdHJ1ZTsKIAogCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKIAkJSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwogCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNsaWVudFBhY2thZ2VJbXBsIHRoZUNsaWVudFBhY2thZ2UgPSAoQ2xpZW50UGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENsaWVudFBhY2thZ2UuZU5TX1VSSSkgOiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlQXBwbGljYXRpb25QYWNrYWdlID0gKEFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2VfMSA9IChBcHBsaWNhdGlvblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBBcHBsaWNhdGlvblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpIDogQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUNvbW1vblBhY2thZ2VJbXBsIHRoZUNvbW1vblBhY2thZ2UgPSAoQ29tbW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVqYlBhY2thZ2VJbXBsIHRoZUVqYlBhY2thZ2UgPSAoRWpiUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBFamJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVqYlBhY2thZ2UuZU5TX1VSSSkgOiBFamJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVRhZ2xpYlBhY2thZ2VJbXBsIHRoZVRhZ2xpYlBhY2thZ2UgPSAoVGFnbGliUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBUYWdsaWJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFRhZ2xpYlBhY2thZ2UuZU5TX1VSSSkgOiBUYWdsaWJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgdGhlV2ViYXBwbGljYXRpb25QYWNrYWdlID0gKFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFdlYmFwcGxpY2F0aW9uUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXZWJhcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkgOiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJSmNhUGFja2FnZUltcGwgdGhlSmNhUGFja2FnZSA9IChKY2FQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEpjYVBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKSA6IEpjYVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCB0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UgPSAoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lTlNfVVJJKSA6IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UpOwotCQlKc3BQYWNrYWdlSW1wbCB0aGVKc3BQYWNrYWdlID0gKEpzcFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgSnNwUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKc3BQYWNrYWdlLmVOU19VUkkpIDogSnNwUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlXc2NvbW1vblBhY2thZ2VJbXBsIHRoZVdzY29tbW9uUGFja2FnZSA9IChXc2NvbW1vblBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBXc2NvbW1vblBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoV3Njb21tb25QYWNrYWdlLmVOU19VUkkpIDogV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0KIAkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKIAkJdGhlV3NkZFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQXBwbGljYXRpb25QYWNrYWdlXzEuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVqYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVRhZ2xpYlBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlSmNhUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXc2NvbW1vblBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CiAKIAkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQogCQl0aGVXc2RkUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVBcHBsaWNhdGlvblBhY2thZ2VfMS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFamJQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlVGFnbGliUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVdlYmFwcGxpY2F0aW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUpjYVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVKc3BQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlV3Njb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKIAogCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCiAJCXRoZVdzZGRQYWNrYWdlLmZyZWV6ZSgpOwogCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KFdzZGRQYWNrYWdlLmVOU19VUkksIHRoZVdzZGRQYWNrYWdlKTsKKworCQlKMkVFSW5pdC5pbml0RU1GTW9kZWxzKCk7CisKIAkJcmV0dXJuIHRoZVdzZGRQYWNrYWdlOwogCX0KIApAQCAtNTMzLDYgKzUwNSwzMyBAQAogCiAJLyoqCiAJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9ydENvbXBvbmVudF9NdG9tVGhyZXNob2xkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X1Jlc3BlY3RCaW5kaW5nKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpcG9ydENvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQb3J0Q29tcG9uZW50X0FkZHJlc3NpbmcoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KQEAgLTc0OSw2ICs3NDgsNjkgQEAKIAogCS8qKgogCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0UmVzcGVjdEJpbmRpbmdUeXBlKCkgeworCQlyZXR1cm4gcmVzcGVjdEJpbmRpbmdUeXBlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc3BlY3RCaW5kaW5nVHlwZV9FbmFibGVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzcGVjdEJpbmRpbmdUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRBZGRyZXNzaW5nVHlwZSgpIHsKKwkJcmV0dXJuIGFkZHJlc3NpbmdUeXBlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEFkZHJlc3NpbmdUeXBlX0VuYWJsZWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhZGRyZXNzaW5nVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldEFkZHJlc3NpbmdUeXBlX1JlcXVpcmVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWRkcmVzc2luZ1R5cGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBZGRyZXNzaW5nVHlwZV9SZXNwb25zZXMoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlhZGRyZXNzaW5nVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZSgpIHsKKwkJcmV0dXJuIGFkZHJlc3NpbmdSZXNwb25zZXNUeXBlRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwpAQCAtODA4LDYgKzg3MCw5IEBACiAJCWNyZWF0ZUVBdHRyaWJ1dGUocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX0VOQUJMRV9NVE9NKTsKIAkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fUFJPVE9DT0xfQklORElORyk7CiAJCWNyZWF0ZUVSZWZlcmVuY2UocG9ydENvbXBvbmVudEVDbGFzcywgUE9SVF9DT01QT05FTlRfX0hBTkRMRVJfQ0hBSU5TKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShwb3J0Q29tcG9uZW50RUNsYXNzLCBQT1JUX0NPTVBPTkVOVF9fTVRPTV9USFJFU0hPTEQpOworCQljcmVhdGVFUmVmZXJlbmNlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19SRVNQRUNUX0JJTkRJTkcpOworCQljcmVhdGVFUmVmZXJlbmNlKHBvcnRDb21wb25lbnRFQ2xhc3MsIFBPUlRfQ09NUE9ORU5UX19BRERSRVNTSU5HKTsKIAogCQl3c2RsUG9ydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXU0RMX1BPUlQpOwogCkBAIC04NDEsNiArOTA2LDE3IEBACiAKIAkJaGFuZGxlcnNDaGFpbnNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSEFORExFUlNfQ0hBSU5TKTsKIAkJY3JlYXRlRVJlZmVyZW5jZShoYW5kbGVyc0NoYWluc0VDbGFzcywgSEFORExFUlNfQ0hBSU5TX19IQU5ETEVSX0NIQUlOKTsKKworCQlyZXNwZWN0QmluZGluZ1R5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVTUEVDVF9CSU5ESU5HX1RZUEUpOworCQljcmVhdGVFQXR0cmlidXRlKHJlc3BlY3RCaW5kaW5nVHlwZUVDbGFzcywgUkVTUEVDVF9CSU5ESU5HX1RZUEVfX0VOQUJMRUQpOworCisJCWFkZHJlc3NpbmdUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFERFJFU1NJTkdfVFlQRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYWRkcmVzc2luZ1R5cGVFQ2xhc3MsIEFERFJFU1NJTkdfVFlQRV9fRU5BQkxFRCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoYWRkcmVzc2luZ1R5cGVFQ2xhc3MsIEFERFJFU1NJTkdfVFlQRV9fUkVRVUlSRUQpOworCQljcmVhdGVFQXR0cmlidXRlKGFkZHJlc3NpbmdUeXBlRUNsYXNzLCBBRERSRVNTSU5HX1RZUEVfX1JFU1BPTlNFUyk7CisKKwkJLy8gQ3JlYXRlIGVudW1zCisJCWFkZHJlc3NpbmdSZXNwb25zZXNUeXBlRUVudW0gPSBjcmVhdGVFRW51bShBRERSRVNTSU5HX1JFU1BPTlNFU19UWVBFKTsKIAl9CiAKIAkvKioKQEAgLTg3MSw5MCArOTQ3LDEyMSBAQAogCQlXc2NvbW1vblBhY2thZ2UgdGhlV3Njb21tb25QYWNrYWdlID0gKFdzY29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShXc2NvbW1vblBhY2thZ2UuZU5TX1VSSSk7CiAJCUVjb3JlUGFja2FnZSB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKIAotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCXdlYlNlcnZpY2VzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCXdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlwb3J0Q29tcG9uZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCXdzZGxQb3J0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSk7Ci0JCXNlcnZpY2VJbXBsQmVhbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOwotCQlzZXJ2bGV0TGlua0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJlYW5MaW5rKCkpOwotCQllamJMaW5rRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QmVhbkxpbmsoKSk7Ci0JCWhhbmRsZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJYmVhbkxpbmtFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKLQkJd3NkbFNlcnZpY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRRTmFtZSgpKTsKLQkJaGFuZGxlckNoYWluRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0JCWhhbmRsZXJzQ2hhaW5zRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh3ZWJTZXJ2aWNlc0VDbGFzcywgV2ViU2VydmljZXMuY2xhc3MsICJXZWJTZXJ2aWNlcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViU2VydmljZXNfV2ViU2VydmljZURlc2NyaXB0aW9ucygpLCB0aGlzLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbigpLCBudWxsLCAid2ViU2VydmljZURlc2NyaXB0aW9ucyIsIG51bGwsIDEsIC0xLCBXZWJTZXJ2aWNlcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcywgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAiV2ViU2VydmljZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSmF4cnBjTWFwcGluZ0ZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImpheHJwY01hcHBpbmdGaWxlIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dzZGxGaWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsRmlsZSIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1NtYWxsSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic21hbGxJY29uIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fTGFyZ2VJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYXJnZUljb24iLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGlzcGxheU5hbWUiLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Qb3J0Q29tcG9uZW50cygpLCB0aGlzLmdldFBvcnRDb21wb25lbnQoKSwgbnVsbCwgInBvcnRDb21wb25lbnRzIiwgbnVsbCwgMSwgLTEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uVHlwZSgpLCB0aGVXc2NvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb25UeXBlKCksIG51bGwsICJkZXNjcmlwdGlvblR5cGUiLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKSwgdGhlV3Njb21tb25QYWNrYWdlLmdldERpc3BsYXlOYW1lVHlwZSgpLCBudWxsLCAiZGlzcGxheU5hbWVUeXBlIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSWNvblR5cGUoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRJY29uVHlwZSgpLCBudWxsLCAiaWNvblR5cGUiLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwb3J0Q29tcG9uZW50RUNsYXNzLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAiUG9ydENvbXBvbmVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudF9Qb3J0Q29tcG9uZW50TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9ydENvbXBvbmVudE5hbWUiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmljZUVuZHBvaW50SW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNtYWxsSWNvbiIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfTGFyZ2VJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYXJnZUljb24iLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50X0Rlc2NyaXB0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImRpc3BsYXlOYW1lIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudF9Xc2RsUG9ydCgpLCB0aGlzLmdldFdTRExQb3J0KCksIG51bGwsICJ3c2RsUG9ydCIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfU2VydmljZUltcGxCZWFuKCksIHRoaXMuZ2V0U2VydmljZUltcGxCZWFuKCksIG51bGwsICJzZXJ2aWNlSW1wbEJlYW4iLCBudWxsLCAxLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJzKCksIHRoaXMuZ2V0SGFuZGxlcigpLCBudWxsLCAiaGFuZGxlcnMiLCBudWxsLCAwLCAtMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvblR5cGUoKSwgdGhlV3Njb21tb25QYWNrYWdlLmdldERlc2NyaXB0aW9uVHlwZSgpLCBudWxsLCAiZGVzY3JpcHRpb25UeXBlIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZVR5cGUoKSwgdGhlV3Njb21tb25QYWNrYWdlLmdldERpc3BsYXlOYW1lVHlwZSgpLCBudWxsLCAiZGlzcGxheU5hbWVUeXBlIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudF9JY29uVHlwZSgpLCB0aGVDb21tb25QYWNrYWdlLmdldEljb25UeXBlKCksIG51bGwsICJpY29uVHlwZSIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfV3NkbFNlcnZpY2UoKSwgdGhpcy5nZXRXU0RMU2VydmljZSgpLCBudWxsLCAid3NkbFNlcnZpY2UiLCBudWxsLCAxLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50X0VuYWJsZU10b20oKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJlbmFibGVNdG9tIiwgIiIsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfUHJvdG9jb2xCaW5kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwcm90b2NvbEJpbmRpbmciLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJDaGFpbnMoKSwgdGhpcy5nZXRIYW5kbGVyc0NoYWlucygpLCBudWxsLCAiaGFuZGxlckNoYWlucyIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3c2RsUG9ydEVDbGFzcywgV1NETFBvcnQuY2xhc3MsICJXU0RMUG9ydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHNlcnZpY2VJbXBsQmVhbkVDbGFzcywgU2VydmljZUltcGxCZWFuLmNsYXNzLCAiU2VydmljZUltcGxCZWFuIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlSW1wbEJlYW5fRUVKQkxpbmsoKSwgdGhpcy5nZXRFSkJMaW5rKCksIG51bGwsICJlRUpCTGluayIsIG51bGwsIDAsIDEsIFNlcnZpY2VJbXBsQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUltcGxCZWFuX0VTZXJ2bGV0TGluaygpLCB0aGlzLmdldFNlcnZsZXRMaW5rKCksIG51bGwsICJlU2VydmxldExpbmsiLCBudWxsLCAwLCAxLCBTZXJ2aWNlSW1wbEJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpLCB0aGlzLmdldEJlYW5MaW5rKCksIG51bGwsICJiZWFuTGluayIsIG51bGwsIDAsIDEsIFNlcnZpY2VJbXBsQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlcnZsZXRMaW5rRUNsYXNzLCBTZXJ2bGV0TGluay5jbGFzcywgIlNlcnZsZXRMaW5rIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2bGV0TGlua19TZXJ2bGV0TGluaygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmxldExpbmsiLCBudWxsLCAwLCAxLCBTZXJ2bGV0TGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVqYkxpbmtFQ2xhc3MsIEVKQkxpbmsuY2xhc3MsICJFSkJMaW5rIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJMaW5rX0VqYkxpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVqYkxpbmsiLCBudWxsLCAwLCAxLCBFSkJMaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoaGFuZGxlckVDbGFzcywgSGFuZGxlci5jbGFzcywgIkhhbmRsZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImhhbmRsZXJOYW1lIiwgbnVsbCwgMCwgMSwgSGFuZGxlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImhhbmRsZXJDbGFzcyIsIG51bGwsIDAsIDEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJfSW5pdFBhcmFtcygpLCB0aGVXc2NvbW1vblBhY2thZ2UuZ2V0SW5pdFBhcmFtKCksIG51bGwsICJpbml0UGFyYW1zIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSwgdGhlV3Njb21tb25QYWNrYWdlLmdldFNPQVBIZWFkZXIoKSwgbnVsbCwgInNvYXBIZWFkZXJzIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJfU29hcFJvbGVzKCksIHRoZVdzY29tbW9uUGFja2FnZS5nZXRTT0FQUm9sZSgpLCBudWxsLCAic29hcFJvbGVzIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhiZWFuTGlua0VDbGFzcywgQmVhbkxpbmsuY2xhc3MsICJCZWFuTGluayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHdzZGxTZXJ2aWNlRUNsYXNzLCBXU0RMU2VydmljZS5jbGFzcywgIldTRExTZXJ2aWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoaGFuZGxlckNoYWluRUNsYXNzLCBIYW5kbGVyQ2hhaW4uY2xhc3MsICJIYW5kbGVyQ2hhaW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEhhbmRsZXJDaGFpbl9TZXJ2aWNlTmFtZVBhdHRlcm4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNlcnZpY2VOYW1lUGF0dGVybiIsIG51bGwsIDAsIDEsIEhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SGFuZGxlckNoYWluX1BvcnROYW1lUGF0dGVybigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicG9ydE5hbWVQYXR0ZXJuIiwgbnVsbCwgMCwgMSwgSGFuZGxlckNoYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRIYW5kbGVyQ2hhaW5fUHJvdG9jb2xCaW5kaW5ncygpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHJvdG9jb2xCaW5kaW5ncyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyQ2hhaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJDaGFpbl9IYW5kbGVycygpLCB0aGlzLmdldEhhbmRsZXIoKSwgbnVsbCwgImhhbmRsZXJzIiwgbnVsbCwgMSwgLTEsIEhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGhhbmRsZXJzQ2hhaW5zRUNsYXNzLCBIYW5kbGVyc0NoYWlucy5jbGFzcywgIkhhbmRsZXJzQ2hhaW5zIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyc0NoYWluc19IYW5kbGVyQ2hhaW4oKSwgdGhpcy5nZXRIYW5kbGVyQ2hhaW4oKSwgbnVsbCwgImhhbmRsZXJDaGFpbiIsIG51bGwsIDAsIC0xLCBIYW5kbGVyc0NoYWlucy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7CisJCWJvb2xlYW4gaGFzTG9jayA9IGZhbHNlOworCQl0cnkgeworCQkJaGFzTG9jayA9IEoyRUVJbml0LmFxdWlyZUluaXRpYWxpemVQYWNrYWdlQ29udGVudHNMb2NrKCk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCUoyRUVDb3JlUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9CQkKKwkJCisJCXRyeXsKKwkJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJCXdlYlNlcnZpY2VzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7CisJCQl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCXBvcnRDb21wb25lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCXdzZGxQb3J0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0UU5hbWUoKSk7CisJCQlzZXJ2aWNlSW1wbEJlYW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCXNlcnZsZXRMaW5rRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QmVhbkxpbmsoKSk7CisJCQllamJMaW5rRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QmVhbkxpbmsoKSk7CisJCQloYW5kbGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0Q29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSk7CisJCQliZWFuTGlua0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJd3NkbFNlcnZpY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRRTmFtZSgpKTsKKwkJCWhhbmRsZXJDaGFpbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJaGFuZGxlcnNDaGFpbnNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkJCXJlc3BlY3RCaW5kaW5nVHlwZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEoyRUVFT2JqZWN0KCkpOworCQkJYWRkcmVzc2luZ1R5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRKMkVFRU9iamVjdCgpKTsKKwkKKwkJCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCisJCQlpbml0RUNsYXNzKHdlYlNlcnZpY2VzRUNsYXNzLCBXZWJTZXJ2aWNlcy5jbGFzcywgIldlYlNlcnZpY2VzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJTZXJ2aWNlc19XZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCksIHRoaXMuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uKCksIG51bGwsICJ3ZWJTZXJ2aWNlRGVzY3JpcHRpb25zIiwgbnVsbCwgMSwgLTEsIFdlYlNlcnZpY2VzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHdlYlNlcnZpY2VEZXNjcmlwdGlvbkVDbGFzcywgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAiV2ViU2VydmljZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSmF4cnBjTWFwcGluZ0ZpbGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImpheHJwY01hcHBpbmdGaWxlIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1dzZGxGaWxlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsRmlsZSIsIG51bGwsIDAsIDEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1NtYWxsSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic21hbGxJY29uIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fTGFyZ2VJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJsYXJnZUljb24iLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGlzcGxheU5hbWUiLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Qb3J0Q29tcG9uZW50cygpLCB0aGlzLmdldFBvcnRDb21wb25lbnQoKSwgbnVsbCwgInBvcnRDb21wb25lbnRzIiwgbnVsbCwgMSwgLTEsIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rlc2NyaXB0aW9uVHlwZSgpLCB0aGVXc2NvbW1vblBhY2thZ2UuZ2V0RGVzY3JpcHRpb25UeXBlKCksIG51bGwsICJkZXNjcmlwdGlvblR5cGUiLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EaXNwbGF5TmFtZVR5cGUoKSwgdGhlV3Njb21tb25QYWNrYWdlLmdldERpc3BsYXlOYW1lVHlwZSgpLCBudWxsLCAiZGlzcGxheU5hbWVUeXBlIiwgbnVsbCwgMCwgMSwgV2ViU2VydmljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSWNvblR5cGUoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRJY29uVHlwZSgpLCBudWxsLCAiaWNvblR5cGUiLCBudWxsLCAwLCAxLCBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MocG9ydENvbXBvbmVudEVDbGFzcywgUG9ydENvbXBvbmVudC5jbGFzcywgIlBvcnRDb21wb25lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfUG9ydENvbXBvbmVudE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnRDb21wb25lbnROYW1lIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudF9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfU21hbGxJY29uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzbWFsbEljb24iLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50X0xhcmdlSWNvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFyZ2VJY29uIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkaXNwbGF5TmFtZSIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfV3NkbFBvcnQoKSwgdGhpcy5nZXRXU0RMUG9ydCgpLCBudWxsLCAid3NkbFBvcnQiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VJbXBsQmVhbigpLCB0aGlzLmdldFNlcnZpY2VJbXBsQmVhbigpLCBudWxsLCAic2VydmljZUltcGxCZWFuIiwgbnVsbCwgMSwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVycygpLCB0aGlzLmdldEhhbmRsZXIoKSwgbnVsbCwgImhhbmRsZXJzIiwgbnVsbCwgMCwgLTEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb25UeXBlKCksIHRoZVdzY29tbW9uUGFja2FnZS5nZXREZXNjcmlwdGlvblR5cGUoKSwgbnVsbCwgImRlc2NyaXB0aW9uVHlwZSIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfRGlzcGxheU5hbWVUeXBlKCksIHRoZVdzY29tbW9uUGFja2FnZS5nZXREaXNwbGF5TmFtZVR5cGUoKSwgbnVsbCwgImRpc3BsYXlOYW1lVHlwZSIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfSWNvblR5cGUoKSwgdGhlQ29tbW9uUGFja2FnZS5nZXRJY29uVHlwZSgpLCBudWxsLCAiaWNvblR5cGUiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X1dzZGxTZXJ2aWNlKCksIHRoaXMuZ2V0V1NETFNlcnZpY2UoKSwgbnVsbCwgIndzZGxTZXJ2aWNlIiwgbnVsbCwgMSwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydENvbXBvbmVudF9FbmFibGVNdG9tKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZW5hYmxlTXRvbSIsICIiLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfUHJvdG9jb2xCaW5kaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwcm90b2NvbEJpbmRpbmciLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJDaGFpbnMoKSwgdGhpcy5nZXRIYW5kbGVyc0NoYWlucygpLCBudWxsLCAiaGFuZGxlckNoYWlucyIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFBvcnRDb21wb25lbnRfTXRvbVRocmVzaG9sZCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJpZ0ludGVnZXIoKSwgIm10b21UaHJlc2hvbGQiLCBudWxsLCAwLCAxLCBQb3J0Q29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRQb3J0Q29tcG9uZW50X1Jlc3BlY3RCaW5kaW5nKCksIHRoaXMuZ2V0UmVzcGVjdEJpbmRpbmdUeXBlKCksIG51bGwsICJyZXNwZWN0QmluZGluZyIsIG51bGwsIDAsIDEsIFBvcnRDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFBvcnRDb21wb25lbnRfQWRkcmVzc2luZygpLCB0aGlzLmdldEFkZHJlc3NpbmdUeXBlKCksIG51bGwsICJhZGRyZXNzaW5nIiwgbnVsbCwgMCwgMSwgUG9ydENvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyh3c2RsUG9ydEVDbGFzcywgV1NETFBvcnQuY2xhc3MsICJXU0RMUG9ydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQorCQkJaW5pdEVDbGFzcyhzZXJ2aWNlSW1wbEJlYW5FQ2xhc3MsIFNlcnZpY2VJbXBsQmVhbi5jbGFzcywgIlNlcnZpY2VJbXBsQmVhbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUltcGxCZWFuX0VFSkJMaW5rKCksIHRoaXMuZ2V0RUpCTGluaygpLCBudWxsLCAiZUVKQkxpbmsiLCBudWxsLCAwLCAxLCBTZXJ2aWNlSW1wbEJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKSwgdGhpcy5nZXRTZXJ2bGV0TGluaygpLCBudWxsLCAiZVNlcnZsZXRMaW5rIiwgbnVsbCwgMCwgMSwgU2VydmljZUltcGxCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKSwgdGhpcy5nZXRCZWFuTGluaygpLCBudWxsLCAiYmVhbkxpbmsiLCBudWxsLCAwLCAxLCBTZXJ2aWNlSW1wbEJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3Moc2VydmxldExpbmtFQ2xhc3MsIFNlcnZsZXRMaW5rLmNsYXNzLCAiU2VydmxldExpbmsiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldFNlcnZsZXRMaW5rX1NlcnZsZXRMaW5rKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2bGV0TGluayIsIG51bGwsIDAsIDEsIFNlcnZsZXRMaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGVqYkxpbmtFQ2xhc3MsIEVKQkxpbmsuY2xhc3MsICJFSkJMaW5rIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRFSkJMaW5rX0VqYkxpbmsoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImVqYkxpbmsiLCBudWxsLCAwLCAxLCBFSkJMaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGhhbmRsZXJFQ2xhc3MsIEhhbmRsZXIuY2xhc3MsICJIYW5kbGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJoYW5kbGVyTmFtZSIsIG51bGwsIDAsIDEsIEhhbmRsZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJoYW5kbGVyQ2xhc3MiLCBudWxsLCAwLCAxLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyX0luaXRQYXJhbXMoKSwgdGhlV3Njb21tb25QYWNrYWdlLmdldEluaXRQYXJhbSgpLCBudWxsLCAiaW5pdFBhcmFtcyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCksIHRoZVdzY29tbW9uUGFja2FnZS5nZXRTT0FQSGVhZGVyKCksIG51bGwsICJzb2FwSGVhZGVycyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyX1NvYXBSb2xlcygpLCB0aGVXc2NvbW1vblBhY2thZ2UuZ2V0U09BUFJvbGUoKSwgbnVsbCwgInNvYXBSb2xlcyIsIG51bGwsIDAsIC0xLCBIYW5kbGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGJlYW5MaW5rRUNsYXNzLCBCZWFuTGluay5jbGFzcywgIkJlYW5MaW5rIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHdzZGxTZXJ2aWNlRUNsYXNzLCBXU0RMU2VydmljZS5jbGFzcywgIldTRExTZXJ2aWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKGhhbmRsZXJDaGFpbkVDbGFzcywgSGFuZGxlckNoYWluLmNsYXNzLCAiSGFuZGxlckNoYWluIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRIYW5kbGVyQ2hhaW5fU2VydmljZU5hbWVQYXR0ZXJuKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2aWNlTmFtZVBhdHRlcm4iLCBudWxsLCAwLCAxLCBIYW5kbGVyQ2hhaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEhhbmRsZXJDaGFpbl9Qb3J0TmFtZVBhdHRlcm4oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnROYW1lUGF0dGVybiIsIG51bGwsIDAsIDEsIEhhbmRsZXJDaGFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SGFuZGxlckNoYWluX1Byb3RvY29sQmluZGluZ3MoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInByb3RvY29sQmluZGluZ3MiLCBudWxsLCAwLCAtMSwgSGFuZGxlckNoYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RVJlZmVyZW5jZShnZXRIYW5kbGVyQ2hhaW5fSGFuZGxlcnMoKSwgdGhpcy5nZXRIYW5kbGVyKCksIG51bGwsICJoYW5kbGVycyIsIG51bGwsIDEsIC0xLCBIYW5kbGVyQ2hhaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoaGFuZGxlcnNDaGFpbnNFQ2xhc3MsIEhhbmRsZXJzQ2hhaW5zLmNsYXNzLCAiSGFuZGxlcnNDaGFpbnMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFUmVmZXJlbmNlKGdldEhhbmRsZXJzQ2hhaW5zX0hhbmRsZXJDaGFpbigpLCB0aGlzLmdldEhhbmRsZXJDaGFpbigpLCBudWxsLCAiaGFuZGxlckNoYWluIiwgbnVsbCwgMCwgLTEsIEhhbmRsZXJzQ2hhaW5zLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQlpbml0RUNsYXNzKHJlc3BlY3RCaW5kaW5nVHlwZUVDbGFzcywgUmVzcGVjdEJpbmRpbmdUeXBlLmNsYXNzLCAiUmVzcGVjdEJpbmRpbmdUeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNwZWN0QmluZGluZ1R5cGVfRW5hYmxlZCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImVuYWJsZWQiLCBudWxsLCAwLCAxLCBSZXNwZWN0QmluZGluZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkKKwkJCWluaXRFQ2xhc3MoYWRkcmVzc2luZ1R5cGVFQ2xhc3MsIEFkZHJlc3NpbmdUeXBlLmNsYXNzLCAiQWRkcmVzc2luZ1R5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEFkZHJlc3NpbmdUeXBlX0VuYWJsZWQoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJlbmFibGVkIiwgbnVsbCwgMCwgMSwgQWRkcmVzc2luZ1R5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJCWluaXRFQXR0cmlidXRlKGdldEFkZHJlc3NpbmdUeXBlX1JlcXVpcmVkKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVxdWlyZWQiLCBudWxsLCAwLCAxLCBBZGRyZXNzaW5nVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWRkcmVzc2luZ1R5cGVfUmVzcG9uc2VzKCksIHRoaXMuZ2V0QWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUoKSwgInJlc3BvbnNlcyIsIG51bGwsIDAsIDEsIEFkZHJlc3NpbmdUeXBlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCisJCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscworCQkJaW5pdEVFbnVtKGFkZHJlc3NpbmdSZXNwb25zZXNUeXBlRUVudW0sIEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlLmNsYXNzLCAiQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJYWRkRUVudW1MaXRlcmFsKGFkZHJlc3NpbmdSZXNwb25zZXNUeXBlRUVudW0sIEFkZHJlc3NpbmdSZXNwb25zZXNUeXBlLkFOT05ZTU9VU19MSVRFUkFMKTsKKwkJCWFkZEVFbnVtTGl0ZXJhbChhZGRyZXNzaW5nUmVzcG9uc2VzVHlwZUVFbnVtLCBBZGRyZXNzaW5nUmVzcG9uc2VzVHlwZS5OT05BTk9OWU1PVVNfTElURVJBTCk7CisJCQlhZGRFRW51bUxpdGVyYWwoYWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGVFRW51bSwgQWRkcmVzc2luZ1Jlc3BvbnNlc1R5cGUuQUxMX0xJVEVSQUwpOworCQorCQkJLy8gQ3JlYXRlIHJlc291cmNlCisJCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKwkJfWZpbmFsbHl7CisJCQlpZiggaGFzTG9jayApCisJCQkJSjJFRUluaXQucmVsZWFzZUluaXRpYWxpemVQYWNrYWdlQ29udGVudHNMb2NrKCk7CisJCX0KIAl9CiAKIH0gLy9Xc2RkUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRSZXNvdXJjZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC9pbXBsL1dzZGRSZXNvdXJjZUltcGwuamF2YQppbmRleCBjMTliMzY5Li44YjJiZmVmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvaW1wbC9Xc2RkUmVzb3VyY2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL2ltcGwvV3NkZFJlc291cmNlSW1wbC5qYXZhCkBAIC05OSwxMyArOTksMjIgQEAKICAgIHsKICAgICAgIHJldHVybiAoZ2V0TW9kdWxlVmVyc2lvbklEKCk9PVdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzJfSUQpOyAgCiAgICB9CisgICBwdWJsaWMgYm9vbGVhbiBpc1dlYlNlcnZpY2UxXzMoKQorICAgeworICAgICAgcmV0dXJuIChnZXRNb2R1bGVWZXJzaW9uSUQoKT09V2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfM19JRCk7ICAKKyAgIH0KIAogCS8qIAogCSAqIFRoaXMgZGlyZWN0bHkgc2V0cyB0aGUgbW9kdWxlIHZlcnNpb24gaWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRNb2R1bGVWZXJzaW9uSUQoaW50IGlkKSB7CiAJLy9zdXBlci5zZXRWZXJzaW9uSUQoaWQpOwogCXN3aXRjaCAoaWQpIHsKKwkJCWNhc2UgKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzNfSUQpIDoKKwkJCQlzdXBlci5zZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOworCQkJCXByaW1TZXRWZXJzaW9uSUQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfM19JRCk7CisJCQkJYnJlYWs7CiAJCQljYXNlIChXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8yX0lEKSA6CiAJCQkJc3VwZXIuc2V0RG9jdHlwZVZhbHVlcyhudWxsLCBudWxsKTsKIAkJCQlwcmltU2V0VmVyc2lvbklEKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzJfSUQpOwpAQCAtMTIyLDkgKzEzMSwxNCBAQAogCS8qCiAJICogQmFzZWQgb24gdGhlIEoyRUUgdmVyc2lvbiwgdGhpcyB3aWxsIHNldCB0aGUgbW9kdWxlIHZlcnNpb24KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCkgCiAgIHsKICAgICBzd2l0Y2ggKGlkKSB7CisgICAgCWNhc2UgKEpFRV82XzBfSUQpIDoKKwkJCQkJcHJpbVNldERvY3R5cGVWYWx1ZXMobnVsbCwgbnVsbCk7CisJCQkJCXByaW1TZXRWZXJzaW9uSUQoV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfM19JRCk7CisJCQkJCWJyZWFrOwogCSAgICBjYXNlIChKRUVfNV8wX0lEKSA6CiAJCQkJCXByaW1TZXREb2N0eXBlVmFsdWVzKG51bGwsIG51bGwpOwogCQkJCQlwcmltU2V0VmVyc2lvbklEKFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzJfSUQpOwpAQCAtMTQ3LDYgKzE2MSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfUHVibGljSUQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfUHVibGljSUQoKSB7CiAJICByZXR1cm4gIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9QVUJMSUNJRDsKIAl9CkBAIC0xNTQsNiArMTY5LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9TeXN0ZW1JRCgpIHsKIAkgIHJldHVybiBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfU1lTVEVNSUQ7CiAJfQpAQCAtMTYxLDYgKzE3Nyw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfUHVibGljSUQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKSB7CiAJICByZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFX1BVQkxJQ0lEOwogCX0KQEAgLTE2OCwxMiArMTg1LDE0IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfU3lzdGVtSUQoKSB7CiAgICAgcmV0dXJuIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV9TWVNURU1JRDsKIAl9CiAKIAkvKiBSZXR1cm4gSjJFRSB2ZXJzaW9uIGJhc2VkIG9uIG1vZHVsZSB2ZXJzaW9uCiAJKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uSUQoKSB7CiAJCXN3aXRjaCAoZ2V0TW9kdWxlVmVyc2lvbklEKCkpIHsKIAkJCWNhc2UgV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfMF9JRDoKQEAgLTE4MiwyNSArMjAxLDMwIEBACiAJCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwogCQkJY2FzZSBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8yX0lEIDoKIAkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKKwkJCWNhc2UgV2ViU2VydmljZUNvbnN0YW50cy5XRUJTRVJWSUNFXzFfM19JRCA6CisJCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ7CiAJCQlkZWZhdWx0IDoKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOworCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ7CiAJCX0KIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5lbWYyeG1sLmltcGwuVHJhbnNsYXRvclJlc291cmNlSW1wbCNnZXREZWZhdWx0VmVyc2lvbklEKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRWZXJzaW9uSUQoKSB7CiAJCXJldHVybiBXZWJTZXJ2aWNlQ29uc3RhbnRzLldFQlNFUlZJQ0VfMV8wX0lEOwogCX0KIAogCi0gIHByb3RlY3RlZCB2b2lkIHN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkKKyAgQE92ZXJyaWRlCitwcm90ZWN0ZWQgdm9pZCBzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpCiAgIHsKICAgICAvL0RvIG5vdGhpbmcgZm9yIG5vdyBzaW5jZSB0aGUgcm9vdCBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIHZlcnNpb24uCiAgIH0KIAogCitAT3ZlcnJpZGUKIHB1YmxpYyB2b2lkIHNldERvY3R5cGVWYWx1ZXMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKIAkKIAkJaW50IG15VmVyc2lvbiA9IEoyRUVfMV80X0lEOwpAQCAtMjIxLDIxICsyNDUsMTggQEAKIAkJdHJ5IHsKIAkJCWluID0gYWZpbGUuZ2V0Q29udGVudHMoKTsKIAkJCXF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoaW4pOworCQkJcmV0dXJuIHF1aWNrUGVlay5nZXRWZXJzaW9uKCk7CiAJCX0KIAkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJSjJFRUNvcmVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0KLQkJcmV0dXJuIHF1aWNrUGVlay5nZXRWZXJzaW9uKCk7CiAJfSBlbHNlewogCQlTdHJpbmcgcGF0aCA9IGdldFVSSSgpLnRvRmlsZVN0cmluZygpOwogCQlpZiAocGF0aCAhPSBudWxsKSB7CiAJCQl0cnkgewogCQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKTsKLQkJCQlpZiAoaW4gIT0gbnVsbCkgewotCi0JCQkJCXF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoaW4pOwotCQkJCQlyZXR1cm4gcXVpY2tQZWVrLmdldFZlcnNpb24oKTsKLQkJCQl9CisJCQkJcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhpbik7CisJCQkJcmV0dXJuIHF1aWNrUGVlay5nZXRWZXJzaW9uKCk7CiAJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZTEpIHsKIAkJCQlKMkVFQ29yZVBsdWdpbi5sb2dFcnJvcihlMSk7CiAJCQl9IGZpbmFsbHkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL3V0aWwvV3NkZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCBkMzI5NzQ1Li5kM2NkZTRiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtNzAsNyArNzAsOCBAQAogCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgeworICBAT3ZlcnJpZGUKK3B1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewogCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewogCQkJcmV0dXJuIHRydWU7CiAJCX0KQEAgLTgxLDYxICs4Miw4NiBAQAogCX0KIAogCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCiAgIHByb3RlY3RlZCBXc2RkU3dpdGNoIG1vZGVsU3dpdGNoID0KIAkJbmV3IFdzZGRTd2l0Y2goKSB7CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVdlYlNlcnZpY2VzKFdlYlNlcnZpY2VzIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXZWJTZXJ2aWNlc0FkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlV2ViU2VydmljZURlc2NyaXB0aW9uKFdlYlNlcnZpY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VQb3J0Q29tcG9uZW50KFBvcnRDb21wb25lbnQgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVBvcnRDb21wb25lbnRBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExQb3J0KFdTRExQb3J0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXU0RMUG9ydEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmljZUltcGxCZWFuKFNlcnZpY2VJbXBsQmVhbiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlU2VydmljZUltcGxCZWFuQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2bGV0TGluayhTZXJ2bGV0TGluayBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlU2VydmxldExpbmtBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUVKQkxpbmsoRUpCTGluayBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRUpCTGlua0FkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlSGFuZGxlcihIYW5kbGVyIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVIYW5kbGVyQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VCZWFuTGluayhCZWFuTGluayBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlQmVhbkxpbmtBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExTZXJ2aWNlKFdTRExTZXJ2aWNlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXU0RMU2VydmljZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlSGFuZGxlckNoYWluKEhhbmRsZXJDaGFpbiBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSGFuZGxlckNoYWluQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VIYW5kbGVyc0NoYWlucyhIYW5kbGVyc0NoYWlucyBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSGFuZGxlcnNDaGFpbnNBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBPYmplY3QgY2FzZVJlc3BlY3RCaW5kaW5nVHlwZShSZXNwZWN0QmluZGluZ1R5cGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJlc3BlY3RCaW5kaW5nVHlwZUFkYXB0ZXIoKTsKKwkJCX0KKwkJCUBPdmVycmlkZQorCQkJcHVibGljIE9iamVjdCBjYXNlQWRkcmVzc2luZ1R5cGUoQWRkcmVzc2luZ1R5cGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUFkZHJlc3NpbmdUeXBlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZURlc2NyaXB0aW9uR3JvdXAoRGVzY3JpcHRpb25Hcm91cCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRGVzY3JpcHRpb25Hcm91cEFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VRTmFtZShRTmFtZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUU5hbWVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRU9iamVjdEFkYXB0ZXIoKTsKIAkJCX0KQEAgLTE0OSw3ICsxNzUsOCBAQAogCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKyAgQE92ZXJyaWRlCitwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewogCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKIAl9CiAKQEAgLTMyMyw2ICszNTAsMzQgQEAKIAl9CiAKIAkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5SZXNwZWN0QmluZGluZ1R5cGUgPGVtPlJlc3BlY3QgQmluZGluZyBUeXBlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5SZXNwZWN0QmluZGluZ1R5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzcGVjdEJpbmRpbmdUeXBlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQWRkcmVzc2luZ1R5cGUgPGVtPkFkZHJlc3NpbmcgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQWRkcmVzc2luZ1R5cGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRkcmVzc2luZ1R5cGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKIAkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdCA8ZW0+SjJFRUUgT2JqZWN0PC9lbT59Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC91dGlsL1dzZGRTd2l0Y2guamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9tb2ZqMmVlL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC9pbnRlcm5hbC91dGlsL1dzZGRTd2l0Y2guamF2YQppbmRleCAyNzc1MjY4Li4xNmZhYmVmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvbW9majJlZS9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvaW50ZXJuYWwvdXRpbC9Xc2RkU3dpdGNoLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL21vZmoyZWUvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL2ludGVybmFsL3V0aWwvV3NkZFN3aXRjaC5qYXZhCkBAIC0xOTgsNiArMTk4LDIwIEBACiAJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKIAkJCQlyZXR1cm4gcmVzdWx0OwogCQkJfQorCQkJY2FzZSBXc2RkUGFja2FnZS5SRVNQRUNUX0JJTkRJTkdfVFlQRTogeworCQkJCVJlc3BlY3RCaW5kaW5nVHlwZSByZXNwZWN0QmluZGluZ1R5cGUgPSAoUmVzcGVjdEJpbmRpbmdUeXBlKXRoZUVPYmplY3Q7CisJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNwZWN0QmluZGluZ1R5cGUocmVzcGVjdEJpbmRpbmdUeXBlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChyZXNwZWN0QmluZGluZ1R5cGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgV3NkZFBhY2thZ2UuQUREUkVTU0lOR19UWVBFOiB7CisJCQkJQWRkcmVzc2luZ1R5cGUgYWRkcmVzc2luZ1R5cGUgPSAoQWRkcmVzc2luZ1R5cGUpdGhlRU9iamVjdDsKKwkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFkZHJlc3NpbmdUeXBlKGFkZHJlc3NpbmdUeXBlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VKMkVFRU9iamVjdChhZGRyZXNzaW5nVHlwZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQogCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwogCQl9CiAJfQpAQCAtMzgzLDYgKzM5NywzNiBAQAogCX0KIAogCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc3BlY3QgQmluZGluZyBUeXBlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzcGVjdCBCaW5kaW5nIFR5cGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBPYmplY3QgY2FzZVJlc3BlY3RCaW5kaW5nVHlwZShSZXNwZWN0QmluZGluZ1R5cGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFkZHJlc3NpbmcgVHlwZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFkZHJlc3NpbmcgVHlwZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE9iamVjdCBjYXNlQWRkcmVzc2luZ1R5cGUoQWRkcmVzc2luZ1R5cGUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgogCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkoyRUVFIE9iamVjdDwvZW0+Jy4KIAkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmluZGV4IDU4NGY1NTUuLjc5M2Q3ZGUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcGx1Z2luLnhtbAppbmRleCAzYjUxYTE1Li5iMWM5NzE1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcGx1Z2luLnhtbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvcGx1Z2luLnhtbApAQCAtMjA0LDUgKzIwNCw3MiBAQAogICAgICAgICA8L2NvbnRlbnRUeXBlQmluZGluZz4KICAgICAgPC9yZXNvdXJjZUZhY3Rvcnk+CiAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+CisgICAgICA8ZmFjdG9yeQorICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmludGVybmFsLmFkYXB0ZXIuV2ViQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+CisgICAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQiLz4KKyAgICAgIDwvZmFjdG9yeT4KKyAgICAgIDxmYWN0b3J5CisgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0IgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuaW50ZXJuYWwuYWRhcHRlci5XZWJBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KKyAgICAgICAgIDxhZGFwdGVyCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQiPgorICAgICAgICAgPC9hZGFwdGVyPgorICAgICAgPC9mYWN0b3J5PgorICAgICAgPGZhY3RvcnkKKyAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmludGVybmFsLmFkYXB0ZXIuV2ViQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+CisgICAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQiLz4KKyAgICAgIDwvZmFjdG9yeT4KKyAgICAgIDxmYWN0b3J5CisgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkZpbHRlckltcGwiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5pbnRlcm5hbC5hZGFwdGVyLldlYkFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgorICAgICAgICAgPGFkYXB0ZXIKKyAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCI+CisgICAgICAgICA8L2FkYXB0ZXI+CisgICAgICA8L2ZhY3Rvcnk+CisgICAgICA8ZmFjdG9yeQorICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuaW50ZXJuYWwuYWRhcHRlci5XZWJBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KKyAgICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCIvPgorICAgICAgPC9mYWN0b3J5PgorICAgICAgPGZhY3RvcnkKKyAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkxpc3RlbmVySW1wbCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmludGVybmFsLmFkYXB0ZXIuV2ViQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+CisgICAgICAgICA8YWRhcHRlcgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ij4KKyAgICAgICAgIDwvYWRhcHRlcj4KKyAgICAgIDwvZmFjdG9yeT4KKyAgICAgIDxmYWN0b3J5CisgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmludGVybmFsLmFkYXB0ZXIuRWpiQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+CisgICAgICAgICA8YWRhcHRlcgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ij4KKyAgICAgICAgIDwvYWRhcHRlcj4KKyAgICAgIDwvZmFjdG9yeT4KKyAgICAgIDxmYWN0b3J5CisgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmludGVybmFsLmFkYXB0ZXIuRWpiQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+CisgICAgICAgICA8YWRhcHRlcgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ij4KKyAgICAgICAgIDwvYWRhcHRlcj4KKyAgICAgIDwvZmFjdG9yeT4KKyAgICAgIDxmYWN0b3J5CisgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuaW50ZXJuYWwuYWRhcHRlci5FamJBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KKyAgICAgICAgIDxhZGFwdGVyCisgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQiPgorICAgICAgICAgPC9hZGFwdGVyPgorICAgICAgPC9mYWN0b3J5PgorICAgICAgPGZhY3RvcnkKKyAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbiIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmludGVybmFsLmFkYXB0ZXIuRWpiQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+CisgICAgICAgICA8YWRhcHRlcgorICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50Ij4KKyAgICAgICAgIDwvYWRhcHRlcj4KKyAgICAgIDwvZmFjdG9yeT4KKyAgIDwvZXh0ZW5zaW9uPgogCiA8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9KYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkuamF2YQppbmRleCA3YTcxYzc5Li4zODBhYmUyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL0pheHJwY21hcFJlc291cmNlRmFjdG9yeS5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5pbXBsLlRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgY29tLmlibS5ldG9vbHMuZW1mMnhtbC5SZW5kZXJlcikKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIGFSZW5kZXJlcikgewogCQlyZXR1cm4gbmV3IEpheHJwY21hcFJlc291cmNlSW1wbCh1cmksIGFSZW5kZXJlcik7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJbXBsLmphdmEKaW5kZXggYTkwOGZhNC4uMWQxYTg5NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySW1wbC5qYXZhCkBAIC04NSw3ICs4NSw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisgIEBPdmVycmlkZQorcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUjsKIAl9CiAKQEAgLTEyNyw2ICsxMjgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTOgpAQCAtMTQwLDYgKzE0Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0lEOgpAQCAtMTU1LDYgKzE1OCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRDoKQEAgLTE3Myw2ICsxNzcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkNPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUl9fSUQ6CkBAIC0xOTAsNiArMTk1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5DT05TVFJVQ1RPUl9QQVJBTUVURVJfT1JERVJfX0lEOgpAQCAtMjA1LDExICsyMTEsMTIgQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICBAT3ZlcnJpZGUKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoaWQpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0VsZW1lbnROYW1lSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvRWxlbWVudE5hbWVJbXBsLmphdmEKaW5kZXggYTA1NDhmMS4uODcxNDZlNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvRWxlbWVudE5hbWVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvRWxlbWVudE5hbWVJbXBsLmphdmEKQEAgLTg3LDcgKzg3LDggQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKyAgQE92ZXJyaWRlCitwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuRUxFTUVOVF9OQU1FOwogCX0KIApAQCAtMTM4LDYgKzEzOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX0lEOgpAQCAtMTUzLDYgKzE1NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19JRDoKQEAgLTE3MCw2ICsxNzMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVMRU1FTlRfTkFNRV9fSUQ6CkBAIC0xODcsNiArMTkxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FTEVNRU5UX05BTUVfX0lEOgpAQCAtMjAyLDEzICsyMDcsMTQgQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICBAT3ZlcnJpZGUKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRleHQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHRleHQ6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQodGV4dCk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvRXhjZXB0aW9uTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0V4Y2VwdGlvbk1hcHBpbmdJbXBsLmphdmEKaW5kZXggMDc4OGU4NC4uM2ExODM4MSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvRXhjZXB0aW9uTWFwcGluZ0ltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9FeGNlcHRpb25NYXBwaW5nSW1wbC5qYXZhCkBAIC0xMzQsNyArMTM0LDggQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKyAgQE92ZXJyaWRlCitwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuRVhDRVBUSU9OX01BUFBJTkc7CiAJfQogCkBAIC0yOTIsNiArMjkzLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19XU0RMX01FU1NBR0U6CkBAIC0zMDcsNiArMzA5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19JRDoKQEAgLTMyOCw2ICszMzEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19JRDoKQEAgLTM1NCw2ICszNTgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19JRDoKQEAgLTM4MCw2ICszODUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19JRDoKQEAgLTQwMSwxNSArNDA3LDE2IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgQE92ZXJyaWRlCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGNlcHRpb25UeXBlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBleGNlcHRpb25UeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGV4Y2VwdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxNZXNzYWdlUGFydE5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxNZXNzYWdlUGFydE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQod3NkbE1lc3NhZ2VQYXJ0TmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSW50ZXJmYWNlTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0ludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEKaW5kZXggODIxZGNhMC4uZTBhZDcwZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSW50ZXJmYWNlTWFwcGluZ0ltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9JbnRlcmZhY2VNYXBwaW5nSW1wbC5qYXZhCkBAIC00MCw3ICs0MCw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisgIEBPdmVycmlkZQorcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLklOVEVSRkFDRV9NQVBQSU5HOwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF2YVdTRExNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF2YVdTRExNYXBwaW5nSW1wbC5qYXZhCmluZGV4IDRkMmM5N2MuLmI0OWFkMGYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0phdmFXU0RMTWFwcGluZ0ltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXZhV1NETE1hcHBpbmdJbXBsLmphdmEKQEAgLTEyMSw3ICsxMjEsOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5KQVZBX1dTRExfTUFQUElORzsKIAl9CiAKQEAgLTE5OSw2ICsyMDAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX1BBQ0tBR0VfTUFQUElOR1M6CkBAIC0yMTgsNiArMjIwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JRDoKQEAgLTIzOSw2ICsyNDIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JRDoKQEAgLTI2OSw2ICsyNzMsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JRDoKQEAgLTI5NSw2ICszMDAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19JRDoKQEAgLTMxNiwxMSArMzIyLDEyIEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgQE92ZXJyaWRlCitwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CiAKIAkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGlkKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXZhWE1MVHlwZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXZhWE1MVHlwZU1hcHBpbmdJbXBsLmphdmEKaW5kZXggODEyMGQ5MS4uMjZkMDI0ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF2YVhNTFR5cGVNYXBwaW5nSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0phdmFYTUxUeXBlTWFwcGluZ0ltcGwuamF2YQpAQCAtMTYwLDcgKzE2MCw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisgIEBPdmVycmlkZQorcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLkpBVkFfWE1MX1RZUEVfTUFQUElORzsKIAl9CiAKQEAgLTMwOCw2ICszMDksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUU6CkBAIC0zMjMsNiArMzI1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fSUQ6CkBAIC0zNDYsNiArMzQ5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1hNTF9UWVBFX01BUFBJTkdfX0lEOgpAQCAtMzc2LDYgKzM4MCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19JRDoKQEAgLTQwNSw2ICs0MTAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fSUQ6CkBAIC00MjgsMTcgKzQzNCwxOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgIEBPdmVycmlkZQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2xhc3NUeXBlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjbGFzc1R5cGU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoY2xhc3NUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBxbmFtZVNjb3BlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBxbmFtZVNjb3BlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHFuYW1lU2NvcGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFub255bW91c1R5cGVRbmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgYW5vbnltb3VzVHlwZVFuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKGFub255bW91c1R5cGVRbmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwRmFjdG9yeUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0pheHJwY21hcEZhY3RvcnlJbXBsLmphdmEKaW5kZXggYTI2YTMxOS4uZWY0NTdlNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwRmFjdG9yeUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXhycGNtYXBGYWN0b3J5SW1wbC5qYXZhCkBAIC01Niw3ICs1Niw3IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBKYXhycGNtYXBGYWN0b3J5IGluaXQoKSB7CiAJCXRyeSB7Ci0JCQlKYXhycGNtYXBGYWN0b3J5IHRoZUpheHJwY21hcEZhY3RvcnkgPSAoSmF4cnBjbWFwRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgiamF4cnBjbWFwLnhtaSIpOyAKKwkJCUpheHJwY21hcEZhY3RvcnkgdGhlSmF4cnBjbWFwRmFjdG9yeSA9IChKYXhycGNtYXBGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqYXhycGNtYXAueG1pIik7ICAvLyROT04tTkxTLTEkCiAJCQlpZiAodGhlSmF4cnBjbWFwRmFjdG9yeSAhPSBudWxsKSB7CiAJCQkJcmV0dXJuIHRoZUpheHJwY21hcEZhY3Rvcnk7CiAJCQl9CkBAIC04Miw3ICs4Miw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKKyAgQE92ZXJyaWRlCitwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewogCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HOiByZXR1cm4gY3JlYXRlSmF2YVdTRExNYXBwaW5nKCk7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HOiByZXR1cm4gY3JlYXRlUGFja2FnZU1hcHBpbmcoKTsKQEAgLTEwNyw3ICsxMDgsNyBAQAogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUU6IHJldHVybiBjcmVhdGVXU0RMTWVzc2FnZVBhcnROYW1lKCk7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSU5URVJGQUNFX01BUFBJTkc6IHJldHVybiBjcmVhdGVJbnRlcmZhY2VNYXBwaW5nKCk7CiAJCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0pheHJwY21hcFBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9KYXhycGNtYXBQYWNrYWdlSW1wbC5qYXZhCmluZGV4IDNkYmU4ZTkuLjAyOGM4MTMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0pheHJwY21hcFBhY2thZ2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwUGFja2FnZUltcGwuamF2YQpAQCAtMjY2LDcgKzI2NiwxMCBAQAogCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoSmF4cnBjbWFwUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXhycGNtYXBQYWNrYWdlLmVOU19VUkkpOwogCiAJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJSmF4cnBjbWFwUGFja2FnZUltcGwgdGhlSmF4cnBjbWFwUGFja2FnZSA9IChKYXhycGNtYXBQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBKYXhycGNtYXBQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IEpheHJwY21hcFBhY2thZ2VJbXBsKCkpOworCQlKYXhycGNtYXBQYWNrYWdlSW1wbCB0aGVKYXhycGNtYXBQYWNrYWdlID0gCisJCQkoSmF4cnBjbWFwUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mCisJCQkJCUpheHJwY21hcFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3CisJCQkJCQkJSmF4cnBjbWFwUGFja2FnZUltcGwoKSk7CiAKIAkJaXNJbml0ZWQgPSB0cnVlOwogCkBAIC0yOTIsNiArMjk1LDkgQEAKIAkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAogCQl0aGVKYXhycGNtYXBQYWNrYWdlLmZyZWV6ZSgpOwogCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoSmF4cnBjbWFwUGFja2FnZS5lTlNfVVJJLCB0aGVKYXhycGNtYXBQYWNrYWdlKTsKKwogCQlyZXR1cm4gdGhlSmF4cnBjbWFwUGFja2FnZTsKIAl9CiAKQEAgLTEyNTcsMTEzICsxMjYzLDExMyBAQAogCQlpbnRlcmZhY2VNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUNvbW1vblBhY2thZ2UuZ2V0SjJFRUVPYmplY3QoKSk7CiAKIAkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhqYXZhV1NETE1hcHBpbmdFQ2xhc3MsIEphdmFXU0RMTWFwcGluZy5jbGFzcywgIkphdmFXU0RMTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YVdTRExNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIEphdmFXU0RMTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVdTRExNYXBwaW5nX1BhY2thZ2VNYXBwaW5ncygpLCB0aGlzLmdldFBhY2thZ2VNYXBwaW5nKCksIG51bGwsICJwYWNrYWdlTWFwcGluZ3MiLCBudWxsLCAxLCAtMSwgSmF2YVdTRExNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhV1NETE1hcHBpbmdfSmF2YVhNTFR5cGVNYXBwaW5ncygpLCB0aGlzLmdldEphdmFYTUxUeXBlTWFwcGluZygpLCBudWxsLCAiamF2YVhNTFR5cGVNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBKYXZhV1NETE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFXU0RMTWFwcGluZ19FeGNlcHRpb25NYXBwaW5ncygpLCB0aGlzLmdldEV4Y2VwdGlvbk1hcHBpbmcoKSwgbnVsbCwgImV4Y2VwdGlvbk1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIEphdmFXU0RMTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCksIHRoaXMuZ2V0SW50ZXJmYWNlTWFwcGluZygpLCBudWxsLCAiaW50ZXJmYWNlTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgSmF2YVdTRExNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUNsYXNzKGphdmFXU0RMTWFwcGluZ0VDbGFzcywgSmF2YVdTRExNYXBwaW5nLmNsYXNzLCAiSmF2YVdTRExNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEphdmFXU0RMTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBKYXZhV1NETE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVdTRExNYXBwaW5nX1BhY2thZ2VNYXBwaW5ncygpLCB0aGlzLmdldFBhY2thZ2VNYXBwaW5nKCksIG51bGwsICJwYWNrYWdlTWFwcGluZ3MiLCBudWxsLCAxLCAtMSwgSmF2YVdTRExNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldEphdmFXU0RMTWFwcGluZ19KYXZhWE1MVHlwZU1hcHBpbmdzKCksIHRoaXMuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nKCksIG51bGwsICJqYXZhWE1MVHlwZU1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIEphdmFXU0RMTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhV1NETE1hcHBpbmdfRXhjZXB0aW9uTWFwcGluZ3MoKSwgdGhpcy5nZXRFeGNlcHRpb25NYXBwaW5nKCksIG51bGwsICJleGNlcHRpb25NYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBKYXZhV1NETE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCksIHRoaXMuZ2V0SW50ZXJmYWNlTWFwcGluZygpLCBudWxsLCAiaW50ZXJmYWNlTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgSmF2YVdTRExNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCiAKLQkJaW5pdEVDbGFzcyhwYWNrYWdlTWFwcGluZ0VDbGFzcywgUGFja2FnZU1hcHBpbmcuY2xhc3MsICJQYWNrYWdlTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UGFja2FnZU1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgUGFja2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBhY2thZ2VNYXBwaW5nX1BhY2thZ2VUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYWNrYWdlVHlwZSIsIG51bGwsIDAsIDEsIFBhY2thZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQYWNrYWdlTWFwcGluZ19OYW1lc3BhY2VVUkkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWVzcGFjZVVSSSIsIG51bGwsIDAsIDEsIFBhY2thZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUNsYXNzKHBhY2thZ2VNYXBwaW5nRUNsYXNzLCBQYWNrYWdlTWFwcGluZy5jbGFzcywgIlBhY2thZ2VNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFBhY2thZ2VNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFBhY2thZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFBhY2thZ2VNYXBwaW5nX1BhY2thZ2VUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYWNrYWdlVHlwZSIsIG51bGwsIDAsIDEsIFBhY2thZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFBhY2thZ2VNYXBwaW5nX05hbWVzcGFjZVVSSSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZXNwYWNlVVJJIiwgbnVsbCwgMCwgMSwgUGFja2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKIAotCQlpbml0RUNsYXNzKGphdmFYTUxUeXBlTWFwcGluZ0VDbGFzcywgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAiSmF2YVhNTFR5cGVNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhWE1MVHlwZU1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhWE1MVHlwZU1hcHBpbmdfQ2xhc3NUeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJjbGFzc1R5cGUiLCBudWxsLCAwLCAxLCBKYXZhWE1MVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEphdmFYTUxUeXBlTWFwcGluZ19RbmFtZVNjb3BlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJxbmFtZVNjb3BlIiwgbnVsbCwgMCwgMSwgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKYXZhWE1MVHlwZU1hcHBpbmdfQW5vbnltb3VzVHlwZVFuYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJhbm9ueW1vdXNUeXBlUW5hbWUiLCBudWxsLCAwLCAxLCBKYXZhWE1MVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEphdmFYTUxUeXBlTWFwcGluZ19Sb290VHlwZVFuYW1lKCksIHRoaXMuZ2V0Um9vdFR5cGVRbmFtZSgpLCBudWxsLCAicm9vdFR5cGVRbmFtZSIsIG51bGwsIDEsIDEsIEphdmFYTUxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKSwgdGhpcy5nZXRWYXJpYWJsZU1hcHBpbmcoKSwgbnVsbCwgInZhcmlhYmxlTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUNsYXNzKGphdmFYTUxUeXBlTWFwcGluZ0VDbGFzcywgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAiSmF2YVhNTFR5cGVNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEphdmFYTUxUeXBlTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBKYXZhWE1MVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0NsYXNzVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY2xhc3NUeXBlIiwgbnVsbCwgMCwgMSwgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEphdmFYTUxUeXBlTWFwcGluZ19RbmFtZVNjb3BlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJxbmFtZVNjb3BlIiwgbnVsbCwgMCwgMSwgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEphdmFYTUxUeXBlTWFwcGluZ19Bbm9ueW1vdXNUeXBlUW5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImFub255bW91c1R5cGVRbmFtZSIsIG51bGwsIDAsIDEsIEphdmFYTUxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRKYXZhWE1MVHlwZU1hcHBpbmdfUm9vdFR5cGVRbmFtZSgpLCB0aGlzLmdldFJvb3RUeXBlUW5hbWUoKSwgbnVsbCwgInJvb3RUeXBlUW5hbWUiLCBudWxsLCAxLCAxLCBKYXZhWE1MVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKSwgdGhpcy5nZXRWYXJpYWJsZU1hcHBpbmcoKSwgbnVsbCwgInZhcmlhYmxlTWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCiAKLQkJaW5pdEVDbGFzcyhleGNlcHRpb25NYXBwaW5nRUNsYXNzLCBFeGNlcHRpb25NYXBwaW5nLmNsYXNzLCAiRXhjZXB0aW9uTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXhjZXB0aW9uTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBFeGNlcHRpb25NYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFeGNlcHRpb25NYXBwaW5nX0V4Y2VwdGlvblR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImV4Y2VwdGlvblR5cGUiLCBudWxsLCAwLCAxLCBFeGNlcHRpb25NYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxNZXNzYWdlUGFydE5hbWUiLCBudWxsLCAwLCAxLCBFeGNlcHRpb25NYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlKCksIHRoaXMuZ2V0V1NETE1lc3NhZ2UoKSwgbnVsbCwgIndzZGxNZXNzYWdlIiwgbnVsbCwgMSwgMSwgRXhjZXB0aW9uTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RXhjZXB0aW9uTWFwcGluZ19Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCksIHRoaXMuZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpLCBudWxsLCAiY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIsIG51bGwsIDAsIDEsIEV4Y2VwdGlvbk1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MoZXhjZXB0aW9uTWFwcGluZ0VDbGFzcywgRXhjZXB0aW9uTWFwcGluZy5jbGFzcywgIkV4Y2VwdGlvbk1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXhjZXB0aW9uTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBFeGNlcHRpb25NYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEV4Y2VwdGlvbk1hcHBpbmdfRXhjZXB0aW9uVHlwZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZXhjZXB0aW9uVHlwZSIsIG51bGwsIDAsIDEsIEV4Y2VwdGlvbk1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXhjZXB0aW9uTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsTWVzc2FnZVBhcnROYW1lIiwgbnVsbCwgMCwgMSwgRXhjZXB0aW9uTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlKCksIHRoaXMuZ2V0V1NETE1lc3NhZ2UoKSwgbnVsbCwgIndzZGxNZXNzYWdlIiwgbnVsbCwgMSwgMSwgRXhjZXB0aW9uTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RVJlZmVyZW5jZShnZXRFeGNlcHRpb25NYXBwaW5nX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKSwgdGhpcy5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKCksIG51bGwsICJjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIiwgbnVsbCwgMCwgMSwgRXhjZXB0aW9uTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAogCi0JCWluaXRFQ2xhc3Moc2VydmljZUludGVyZmFjZU1hcHBpbmdFQ2xhc3MsIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAiU2VydmljZUludGVyZmFjZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlSW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2aWNlSW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgU2VydmljZUludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1dzZGxTZXJ2aWNlTmFtZSgpLCB0aGlzLmdldFdTRExTZXJ2aWNlTmFtZSgpLCBudWxsLCAid3NkbFNlcnZpY2VOYW1lIiwgbnVsbCwgMSwgMSwgU2VydmljZUludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpLCB0aGlzLmdldFBvcnRNYXBwaW5nKCksIG51bGwsICJwb3J0TWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgU2VydmljZUludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3Moc2VydmljZUludGVyZmFjZU1hcHBpbmdFQ2xhc3MsIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAiU2VydmljZUludGVyZmFjZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmljZUludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfU2VydmljZUludGVyZmFjZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2VydmljZUludGVyZmFjZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1dzZGxTZXJ2aWNlTmFtZSgpLCB0aGlzLmdldFdTRExTZXJ2aWNlTmFtZSgpLCBudWxsLCAid3NkbFNlcnZpY2VOYW1lIiwgbnVsbCwgMSwgMSwgU2VydmljZUludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUludGVyZmFjZU1hcHBpbmdfUG9ydE1hcHBpbmdzKCksIHRoaXMuZ2V0UG9ydE1hcHBpbmcoKSwgbnVsbCwgInBvcnRNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAogCi0JCWluaXRFQ2xhc3Moc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0VDbGFzcywgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInNlcnZpY2VFbmRwb2ludEludGVyZmFjZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbFBvcnRUeXBlKCksIHRoaXMuZ2V0V1NETFBvcnRUeXBlKCksIG51bGwsICJ3c2RsUG9ydFR5cGUiLCBudWxsLCAxLCAxLCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCksIHRoaXMuZ2V0V1NETEJpbmRpbmcoKSwgbnVsbCwgIndzZGxCaW5kaW5nIiwgbnVsbCwgMSwgMSwgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncygpLCB0aGlzLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcoKSwgbnVsbCwgInNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3Moc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0VDbGFzcywgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5jbGFzcywgIlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UiLCBudWxsLCAwLCAxLCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbFBvcnRUeXBlKCksIHRoaXMuZ2V0V1NETFBvcnRUeXBlKCksIG51bGwsICJ3c2RsUG9ydFR5cGUiLCBudWxsLCAxLCAxLCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbEJpbmRpbmcoKSwgdGhpcy5nZXRXU0RMQmluZGluZygpLCBudWxsLCAid3NkbEJpbmRpbmciLCBudWxsLCAxLCAxLCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKSwgdGhpcy5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKCksIG51bGwsICJzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCiAKLQkJaW5pdEVDbGFzcyhyb290VHlwZVFuYW1lRUNsYXNzLCBSb290VHlwZVFuYW1lLmNsYXNzLCAiUm9vdFR5cGVRbmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVDbGFzcyhyb290VHlwZVFuYW1lRUNsYXNzLCBSb290VHlwZVFuYW1lLmNsYXNzLCAiUm9vdFR5cGVRbmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAogCi0JCWluaXRFQ2xhc3ModmFyaWFibGVNYXBwaW5nRUNsYXNzLCBWYXJpYWJsZU1hcHBpbmcuY2xhc3MsICJWYXJpYWJsZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFZhcmlhYmxlTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBWYXJpYWJsZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFZhcmlhYmxlTWFwcGluZ19KYXZhVmFyaWFibGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJqYXZhVmFyaWFibGVOYW1lIiwgbnVsbCwgMCwgMSwgVmFyaWFibGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRWYXJpYWJsZU1hcHBpbmdfWG1sRWxlbWVudE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInhtbEVsZW1lbnROYW1lIiwgbnVsbCwgMCwgMSwgVmFyaWFibGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRWYXJpYWJsZU1hcHBpbmdfRGF0YU1lbWJlcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRhdGFNZW1iZXIiLCBudWxsLCAwLCAxLCBWYXJpYWJsZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VmFyaWFibGVNYXBwaW5nX1htbEF0dHJpYnV0ZU5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInhtbEF0dHJpYnV0ZU5hbWUiLCBudWxsLCAwLCAxLCBWYXJpYWJsZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFZhcmlhYmxlTWFwcGluZ19YbWxXaWxkY2FyZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInhtbFdpbGRjYXJkIiwgbnVsbCwgMCwgMSwgVmFyaWFibGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3ModmFyaWFibGVNYXBwaW5nRUNsYXNzLCBWYXJpYWJsZU1hcHBpbmcuY2xhc3MsICJWYXJpYWJsZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0VmFyaWFibGVNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFZhcmlhYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRWYXJpYWJsZU1hcHBpbmdfSmF2YVZhcmlhYmxlTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF2YVZhcmlhYmxlTmFtZSIsIG51bGwsIDAsIDEsIFZhcmlhYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRWYXJpYWJsZU1hcHBpbmdfWG1sRWxlbWVudE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInhtbEVsZW1lbnROYW1lIiwgbnVsbCwgMCwgMSwgVmFyaWFibGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFZhcmlhYmxlTWFwcGluZ19EYXRhTWVtYmVyKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiZGF0YU1lbWJlciIsIG51bGwsIDAsIDEsIFZhcmlhYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFZhcmlhYmxlTWFwcGluZ19YbWxBdHRyaWJ1dGVOYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ4bWxBdHRyaWJ1dGVOYW1lIiwgbnVsbCwgMCwgMSwgVmFyaWFibGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFZhcmlhYmxlTWFwcGluZ19YbWxXaWxkY2FyZCgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInhtbFdpbGRjYXJkIiwgbnVsbCwgMCwgMSwgVmFyaWFibGVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKIAotCQlpbml0RUNsYXNzKHdzZGxNZXNzYWdlRUNsYXNzLCBXU0RMTWVzc2FnZS5jbGFzcywgIldTRExNZXNzYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKHdzZGxNZXNzYWdlRUNsYXNzLCBXU0RMTWVzc2FnZS5jbGFzcywgIldTRExNZXNzYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCiAKLQkJaW5pdEVDbGFzcyhjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyRUNsYXNzLCBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmNsYXNzLCAiQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0VsZW1lbnROYW1lcygpLCB0aGlzLmdldEVsZW1lbnROYW1lKCksIG51bGwsICJlbGVtZW50TmFtZXMiLCBudWxsLCAxLCAtMSwgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVDbGFzcyhjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyRUNsYXNzLCBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmNsYXNzLCAiQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9FbGVtZW50TmFtZXMoKSwgdGhpcy5nZXRFbGVtZW50TmFtZSgpLCBudWxsLCAiZWxlbWVudE5hbWVzIiwgbnVsbCwgMSwgLTEsIENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKIAotCQlpbml0RUNsYXNzKGVsZW1lbnROYW1lRUNsYXNzLCBFbGVtZW50TmFtZS5jbGFzcywgIkVsZW1lbnROYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbGVtZW50TmFtZV9JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBFbGVtZW50TmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RWxlbWVudE5hbWVfVGV4dCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidGV4dCIsIG51bGwsIDAsIDEsIEVsZW1lbnROYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUNsYXNzKGVsZW1lbnROYW1lRUNsYXNzLCBFbGVtZW50TmFtZS5jbGFzcywgIkVsZW1lbnROYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEVsZW1lbnROYW1lX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIEVsZW1lbnROYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldEVsZW1lbnROYW1lX1RleHQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInRleHQiLCBudWxsLCAwLCAxLCBFbGVtZW50TmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAogCi0JCWluaXRFQ2xhc3Mod3NkbFNlcnZpY2VOYW1lRUNsYXNzLCBXU0RMU2VydmljZU5hbWUuY2xhc3MsICJXU0RMU2VydmljZU5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQ2xhc3Mod3NkbFNlcnZpY2VOYW1lRUNsYXNzLCBXU0RMU2VydmljZU5hbWUuY2xhc3MsICJXU0RMU2VydmljZU5hbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKIAotCQlpbml0RUNsYXNzKHBvcnRNYXBwaW5nRUNsYXNzLCBQb3J0TWFwcGluZy5jbGFzcywgIlBvcnRNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQb3J0TWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBQb3J0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydE1hcHBpbmdfUG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnROYW1lIiwgbnVsbCwgMCwgMSwgUG9ydE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBvcnRNYXBwaW5nX0phdmFQb3J0TmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF2YVBvcnROYW1lIiwgbnVsbCwgMCwgMSwgUG9ydE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3MocG9ydE1hcHBpbmdFQ2xhc3MsIFBvcnRNYXBwaW5nLmNsYXNzLCAiUG9ydE1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydE1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgUG9ydE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydE1hcHBpbmdfUG9ydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBvcnROYW1lIiwgbnVsbCwgMCwgMSwgUG9ydE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0UG9ydE1hcHBpbmdfSmF2YVBvcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJqYXZhUG9ydE5hbWUiLCBudWxsLCAwLCAxLCBQb3J0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAogCi0JCWluaXRFQ2xhc3Mod3NkbFBvcnRUeXBlRUNsYXNzLCBXU0RMUG9ydFR5cGUuY2xhc3MsICJXU0RMUG9ydFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQ2xhc3Mod3NkbFBvcnRUeXBlRUNsYXNzLCBXU0RMUG9ydFR5cGUuY2xhc3MsICJXU0RMUG9ydFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKIAotCQlpbml0RUNsYXNzKHdzZGxCaW5kaW5nRUNsYXNzLCBXU0RMQmluZGluZy5jbGFzcywgIldTRExCaW5kaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUNsYXNzKHdzZGxCaW5kaW5nRUNsYXNzLCBXU0RMQmluZGluZy5jbGFzcywgIldTRExCaW5kaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCiAKLQkJaW5pdEVDbGFzcyhzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nRUNsYXNzLCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmNsYXNzLCAiU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0phdmFNZXRob2ROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJqYXZhTWV0aG9kTmFtZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbE9wZXJhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbE9wZXJhdGlvbiIsIG51bGwsIDAsIDEsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3JhcHBlZEVsZW1lbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ3cmFwcGVkRWxlbWVudCIsIG51bGwsIDAsIDEsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19NZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKSwgdGhpcy5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpLCBudWxsLCAibWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbFJldHVyblZhbHVlTWFwcGluZygpLCB0aGlzLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKSwgbnVsbCwgIndzZGxSZXR1cm5WYWx1ZU1hcHBpbmciLCBudWxsLCAwLCAxLCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUNsYXNzKHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdFQ2xhc3MsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICJTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0phdmFNZXRob2ROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJqYXZhTWV0aG9kTmFtZSIsIG51bGwsIDAsIDEsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsT3BlcmF0aW9uKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsT3BlcmF0aW9uIiwgbnVsbCwgMCwgMSwgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dyYXBwZWRFbGVtZW50KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAid3JhcHBlZEVsZW1lbnQiLCBudWxsLCAwLCAxLCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19NZXRob2RQYXJhbVBhcnRzTWFwcGluZ3MoKSwgdGhpcy5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpLCBudWxsLCAibWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCksIHRoaXMuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZygpLCBudWxsLCAid3NkbFJldHVyblZhbHVlTWFwcGluZyIsIG51bGwsIDAsIDEsIFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKIAotCQlpbml0RUNsYXNzKHdzZGxPcGVyYXRpb25FQ2xhc3MsIFdTRExPcGVyYXRpb24uY2xhc3MsICJXU0RMT3BlcmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMT3BlcmF0aW9uX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFdTRExPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExPcGVyYXRpb25fV3NkbE9wZXJhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbE9wZXJhdGlvbiIsIG51bGwsIDAsIDEsIFdTRExPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3Mod3NkbE9wZXJhdGlvbkVDbGFzcywgV1NETE9wZXJhdGlvbi5jbGFzcywgIldTRExPcGVyYXRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE9wZXJhdGlvbl9JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBXU0RMT3BlcmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFdTRExPcGVyYXRpb25fV3NkbE9wZXJhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAid3NkbE9wZXJhdGlvbiIsIG51bGwsIDAsIDEsIFdTRExPcGVyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKIAotCQlpbml0RUNsYXNzKG1ldGhvZFBhcmFtUGFydHNNYXBwaW5nRUNsYXNzLCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZy5jbGFzcywgIk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfUGFyYW1Qb3NpdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicGFyYW1Qb3NpdGlvbiIsIG51bGwsIDAsIDEsIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcmFtVHlwZSIsIG51bGwsIDAsIDEsIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19Xc2RsTWVzc2FnZU1hcHBpbmcoKSwgdGhpcy5nZXRXU0RMTWVzc2FnZU1hcHBpbmcoKSwgbnVsbCwgIndzZGxNZXNzYWdlTWFwcGluZyIsIG51bGwsIDEsIDEsIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUNsYXNzKG1ldGhvZFBhcmFtUGFydHNNYXBwaW5nRUNsYXNzLCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZy5jbGFzcywgIk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtUG9zaXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcmFtUG9zaXRpb24iLCBudWxsLCAwLCAxLCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19QYXJhbVR5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcmFtVHlwZSIsIG51bGwsIDAsIDEsIE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1dzZGxNZXNzYWdlTWFwcGluZygpLCB0aGlzLmdldFdTRExNZXNzYWdlTWFwcGluZygpLCBudWxsLCAid3NkbE1lc3NhZ2VNYXBwaW5nIiwgbnVsbCwgMSwgMSwgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKIAotCQlpbml0RUNsYXNzKHdzZGxSZXR1cm5WYWx1ZU1hcHBpbmdFQ2xhc3MsIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcuY2xhc3MsICJXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1ldGhvZFJldHVyblZhbHVlIiwgbnVsbCwgMCwgMSwgV1NETFJldHVyblZhbHVlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ3c2RsTWVzc2FnZVBhcnROYW1lIiwgbnVsbCwgMCwgMSwgV1NETFJldHVyblZhbHVlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZSgpLCB0aGlzLmdldFdTRExNZXNzYWdlKCksIG51bGwsICJ3c2RsTWVzc2FnZSIsIG51bGwsIDEsIDEsIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQ2xhc3Mod3NkbFJldHVyblZhbHVlTWFwcGluZ0VDbGFzcywgV1NETFJldHVyblZhbHVlTWFwcGluZy5jbGFzcywgIldTRExSZXR1cm5WYWx1ZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm1ldGhvZFJldHVyblZhbHVlIiwgbnVsbCwgMCwgMSwgV1NETFJldHVyblZhbHVlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxNZXNzYWdlUGFydE5hbWUiLCBudWxsLCAwLCAxLCBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCisJCWluaXRFUmVmZXJlbmNlKGdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfV3NkbE1lc3NhZ2UoKSwgdGhpcy5nZXRXU0RMTWVzc2FnZSgpLCBudWxsLCAid3NkbE1lc3NhZ2UiLCBudWxsLCAxLCAxLCBXU0RMUmV0dXJuVmFsdWVNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCiAKLQkJaW5pdEVDbGFzcyh3c2RsTWVzc2FnZU1hcHBpbmdFQ2xhc3MsIFdTRExNZXNzYWdlTWFwcGluZy5jbGFzcywgIldTRExNZXNzYWdlTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX0lkKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJpZCIsIG51bGwsIDAsIDEsIFdTRExNZXNzYWdlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxNZXNzYWdlUGFydE5hbWUiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdTRExNZXNzYWdlTWFwcGluZ19QYXJhbWV0ZXJNb2RlKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwYXJhbWV0ZXJNb2RlIiwgbnVsbCwgMCwgMSwgV1NETE1lc3NhZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMTWVzc2FnZU1hcHBpbmdfU29hcEhlYWRlcigpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInNvYXBIZWFkZXIiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlKCksIHRoaXMuZ2V0V1NETE1lc3NhZ2UoKSwgbnVsbCwgIndzZGxNZXNzYWdlIiwgbnVsbCwgMSwgMSwgV1NETE1lc3NhZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUNsYXNzKHdzZGxNZXNzYWdlTWFwcGluZ0VDbGFzcywgV1NETE1lc3NhZ2VNYXBwaW5nLmNsYXNzLCAiV1NETE1lc3NhZ2VNYXBwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFdTRExNZXNzYWdlTWFwcGluZ19JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxNZXNzYWdlUGFydE5hbWUiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1BhcmFtZXRlck1vZGUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInBhcmFtZXRlck1vZGUiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1NvYXBIZWFkZXIoKSwgZWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJzb2FwSGVhZGVyIiwgbnVsbCwgMCwgMSwgV1NETE1lc3NhZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlKCksIHRoaXMuZ2V0V1NETE1lc3NhZ2UoKSwgbnVsbCwgIndzZGxNZXNzYWdlIiwgbnVsbCwgMSwgMSwgV1NETE1lc3NhZ2VNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCiAKLQkJaW5pdEVDbGFzcyh3c2RsTWVzc2FnZVBhcnROYW1lRUNsYXNzLCBXU0RMTWVzc2FnZVBhcnROYW1lLmNsYXNzLCAiV1NETE1lc3NhZ2VQYXJ0TmFtZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9JZCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiaWQiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZVBhcnROYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMTWVzc2FnZVBhcnROYW1lX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxNZXNzYWdlUGFydE5hbWUiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZVBhcnROYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUNsYXNzKHdzZGxNZXNzYWdlUGFydE5hbWVFQ2xhc3MsIFdTRExNZXNzYWdlUGFydE5hbWUuY2xhc3MsICJXU0RMTWVzc2FnZVBhcnROYW1lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCisJCWluaXRFQXR0cmlidXRlKGdldFdTRExNZXNzYWdlUGFydE5hbWVfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgV1NETE1lc3NhZ2VQYXJ0TmFtZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAorCQlpbml0RUF0dHJpYnV0ZShnZXRXU0RMTWVzc2FnZVBhcnROYW1lX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIndzZGxNZXNzYWdlUGFydE5hbWUiLCBudWxsLCAwLCAxLCBXU0RMTWVzc2FnZVBhcnROYW1lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCiAKLQkJaW5pdEVDbGFzcyhpbnRlcmZhY2VNYXBwaW5nRUNsYXNzLCBJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAiSW50ZXJmYWNlTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVDbGFzcyhpbnRlcmZhY2VNYXBwaW5nRUNsYXNzLCBJbnRlcmZhY2VNYXBwaW5nLmNsYXNzLCAiSW50ZXJmYWNlTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAogCiAJCS8vIENyZWF0ZSByZXNvdXJjZQogCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL0pheHJwY21hcFJlc291cmNlSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwUmVzb3VyY2VJbXBsLmphdmEKaW5kZXggYWI3OGZlYy4uYWI4NTUwOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwUmVzb3VyY2VJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvSmF4cnBjbWFwUmVzb3VyY2VJbXBsLmphdmEKQEAgLTgyLDYgKzgyLDcgQEAKIAkvKiAKIAkgKiBUaGlzIGRpcmVjdGx5IHNldHMgdGhlIG1vZHVsZSB2ZXJzaW9uIGlkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2V0TW9kdWxlVmVyc2lvbklEKGludCBpZCkgewogCXN1cGVyLnNldFZlcnNpb25JRChpZCk7CiAJc3dpdGNoIChpZCkgewpAQCAtOTYsNiArOTcsNyBAQAogCS8qCiAJICogQmFzZWQgb24gdGhlIEoyRUUgdmVyc2lvbiwgdGhpcyB3aWxsIHNldCB0aGUgbW9kdWxlIHZlcnNpb24KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRKMkVFVmVyc2lvbklEKGludCBpZCkgCiAgIHsKICAgICBzd2l0Y2ggKGlkKSB7CkBAIC0xMTcsNiArMTE5LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfMl9QdWJsaWNJRCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRKMkVFXzFfMl9QdWJsaWNJRCgpIHsKIAkgIHJldHVybiAgV2ViU2VydmljZUNvbnN0YW50cy5KQVhSUENNQVBfUFVCTElDSUQ7CiAJfQpAQCAtMTI0LDYgKzEyNyw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzJfU3lzdGVtSUQoKSB7CiAJICByZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5KQVhSUENNQVBfU1lTVEVNSUQ7CiAJfQpAQCAtMTMxLDYgKzEzNSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZXhtbC5YTUxSZXNvdXJjZUltcGwjZ2V0SjJFRV8xXzNfUHVibGljSUQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRV8xXzNfUHVibGljSUQoKSB7CiAJICByZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5KQVhSUENNQVBfUFVCTElDSUQ7CiAJfQpAQCAtMTM4LDEyICsxNDMsMTQgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVleG1sLlhNTFJlc291cmNlSW1wbCNnZXRKMkVFXzFfM19TeXN0ZW1JRCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRKMkVFXzFfM19TeXN0ZW1JRCgpIHsKICAgICByZXR1cm4gV2ViU2VydmljZUNvbnN0YW50cy5KQVhSUENNQVBfU1lTVEVNSUQ7CiAJfQogCiAJLyogUmV0dXJuIEoyRUUgdmVyc2lvbiBiYXNlZCBvbiBtb2R1bGUgdmVyc2lvbgogCSovCisJQE92ZXJyaWRlCiAJcHVibGljIGludCBnZXRKMkVFVmVyc2lvbklEKCkgewogCQlzd2l0Y2ggKGdldE1vZHVsZVZlcnNpb25JRCgpKSB7CiAJCQljYXNlIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzBfSUQ6CkBAIC0xNTksMTEgKzE2NiwxMyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmVtZjJ4bWwuaW1wbC5UcmFuc2xhdG9yUmVzb3VyY2VJbXBsI2dldERlZmF1bHRWZXJzaW9uSUQoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFZlcnNpb25JRCgpIHsKIAkJcmV0dXJuIFdlYlNlcnZpY2VDb25zdGFudHMuV0VCU0VSVklDRV8xXzFfSUQ7CiAJfQogCi0gIHByb3RlY3RlZCB2b2lkIHN5bmNWZXJzaW9uT2ZSb290T2JqZWN0KCkKKyAgQE92ZXJyaWRlCitwcm90ZWN0ZWQgdm9pZCBzeW5jVmVyc2lvbk9mUm9vdE9iamVjdCgpCiAgIHsKICAgICAvL0RvIG5vdGhpbmcgZm9yIG5vdyBzaW5jZSB0aGUgcm9vdCBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIHZlcnNpb24uCiAgIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsLmphdmEKaW5kZXggMThiNGMxZC4uZGUyNzUzYSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJbXBsLmphdmEKQEAgLTEyMiw3ICsxMjIsOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElORzsKIAl9CiAKQEAgLTIzNyw2ICsyMzgsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX1dTRExfTUVTU0FHRV9NQVBQSU5HOgpAQCAtMjUwLDYgKzI1Miw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fSUQ6CkBAIC0yNjksNiArMjcyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fSUQ6CkBAIC0yOTIsNiArMjk2LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fSUQ6CkBAIC0zMTUsNiArMzIwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fSUQ6CkBAIC0zMzQsMTUgKzM0MCwxNiBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgIEBPdmVycmlkZQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1Qb3NpdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgcGFyYW1Qb3NpdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChwYXJhbVBvc2l0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbVR5cGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBhcmFtVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChwYXJhbVR5cGUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1BhY2thZ2VNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUGFja2FnZU1hcHBpbmdJbXBsLmphdmEKaW5kZXggNGYxZjQ1NS4uNGI2NmI2OCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUGFja2FnZU1hcHBpbmdJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUGFja2FnZU1hcHBpbmdJbXBsLmphdmEKQEAgLTEwOCw3ICsxMDgsOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5QQUNLQUdFX01BUFBJTkc7CiAJfQogCkBAIC0xODAsNiArMTgxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fSUQ6CkBAIC0xOTcsNiArMTk5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QQUNLQUdFX01BUFBJTkdfX0lEOgpAQCAtMjE3LDYgKzIyMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19JRDoKQEAgLTIzNyw2ICsyNDEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fSUQ6CkBAIC0yNTQsMTUgKzI1OSwxNiBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgIEBPdmVycmlkZQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFja2FnZVR5cGU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBhY2thZ2VUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHBhY2thZ2VUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lc3BhY2VVUkk6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWVzcGFjZVVSSTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChuYW1lc3BhY2VVUkkpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1BvcnRNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUG9ydE1hcHBpbmdJbXBsLmphdmEKaW5kZXggMGZmNzIyMi4uZGMwZDgxZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUG9ydE1hcHBpbmdJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUG9ydE1hcHBpbmdJbXBsLmphdmEKQEAgLTEwOCw3ICsxMDgsOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5QT1JUX01BUFBJTkc7CiAJfQogCkBAIC0xODAsNiArMTgxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSUQ6CkBAIC0xOTcsNiArMTk5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0lEOgpAQCAtMjE3LDYgKzIyMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19JRDoKQEAgLTIzNyw2ICsyNDEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBPUlRfTUFQUElOR19fSUQ6CkBAIC0yNTQsMTUgKzI1OSwxNiBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgIEBPdmVycmlkZQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9ydE5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHBvcnROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHBvcnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqYXZhUG9ydE5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGphdmFQb3J0TmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChqYXZhUG9ydE5hbWUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1Jvb3RUeXBlUW5hbWVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9Sb290VHlwZVFuYW1lSW1wbC5qYXZhCmluZGV4IDU5MGI2OTYuLjc4ZTczODEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1Jvb3RUeXBlUW5hbWVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvUm9vdFR5cGVRbmFtZUltcGwuamF2YQpAQCAtNDEsNyArNDEsOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5ST09UX1RZUEVfUU5BTUU7CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0ltcGwuamF2YQppbmRleCA5MzFkZWNkLi5iYWYzZGU2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEKQEAgLTEyOSw3ICsxMjksOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HOwogCX0KIApAQCAtMjc4LDYgKzI3OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRToKQEAgLTI5NSw2ICsyOTcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fSUQ6CkBAIC0zMTYsNiArMzE5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19JRDoKQEAgLTM0Myw2ICszNDcsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX0lEOgpAQCAtMzY5LDYgKzM3NCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fSUQ6CkBAIC0zOTAsMTMgKzM5NiwxNCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgIEBPdmVycmlkZQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2U6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0ltcGwuamF2YQppbmRleCA4OGQwODhlLi4wNDZlODFkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJbXBsLmphdmEKQEAgLTE2OSw3ICsxNjksOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HOwogCX0KIApAQCAtMzQyLDYgKzM0Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR1M6CkBAIC0zNTcsNiArMzU5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0lEOgpAQCAtMzgwLDYgKzM4Myw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSUQ6CkBAIC00MTAsNiArNDE0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19JRDoKQEAgLTQzOSw2ICs0NDQsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0lEOgpAQCAtNDYyLDE4ICs0NjgsMTkgQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICBAT3ZlcnJpZGUKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGphdmFNZXRob2ROYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBqYXZhTWV0aG9kTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChqYXZhTWV0aG9kTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3NkbE9wZXJhdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgd3NkbE9wZXJhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh3c2RsT3BlcmF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3cmFwcGVkRWxlbWVudDogIik7Ci0JCWlmICh3cmFwcGVkRWxlbWVudEVTZXQpIHJlc3VsdC5hcHBlbmQod3JhcHBlZEVsZW1lbnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB3cmFwcGVkRWxlbWVudDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHdyYXBwZWRFbGVtZW50RVNldCkgcmVzdWx0LmFwcGVuZCh3cmFwcGVkRWxlbWVudCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEKaW5kZXggZjQ3MzNkZC4uN2YzZDljNCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvU2VydmljZUludGVyZmFjZU1hcHBpbmdJbXBsLmphdmEKQEAgLTExNyw3ICsxMTcsOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HOwogCX0KIApAQCAtMjIzLDYgKzIyNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1NFUlZJQ0VfTkFNRToKQEAgLTIzOCw2ICsyNDAsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fSUQ6CkBAIC0yNTcsNiArMjYwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19JRDoKQEAgLTI4MSw2ICsyODUsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX0lEOgpAQCAtMzA0LDYgKzMwOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fSUQ6CkBAIC0zMjMsMTMgKzMyOSwxNCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgIEBPdmVycmlkZQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2VydmljZUludGVyZmFjZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgc2VydmljZUludGVyZmFjZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChzZXJ2aWNlSW50ZXJmYWNlKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9WYXJpYWJsZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9WYXJpYWJsZU1hcHBpbmdJbXBsLmphdmEKaW5kZXggNjZkNjZmMS4uZTM1OTYxMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvVmFyaWFibGVNYXBwaW5nSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1ZhcmlhYmxlTWFwcGluZ0ltcGwuamF2YQpAQCAtMTg5LDcgKzE4OSw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisgIEBPdmVycmlkZQorcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLlZBUklBQkxFX01BUFBJTkc7CiAJfQogCkBAIC0zNzQsNiArMzc1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0lEOgpAQCAtMzk3LDYgKzM5OSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSUQ6CkBAIC00MjYsNiArNDI5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5WQVJJQUJMRV9NQVBQSU5HX19JRDoKQEAgLTQ1NSw2ICs0NTksNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0lEOgpAQCAtNDc4LDIyICs0ODMsMjMgQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICBAT3ZlcnJpZGUKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGphdmFWYXJpYWJsZU5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIGphdmFWYXJpYWJsZU5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoamF2YVZhcmlhYmxlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgeG1sRWxlbWVudE5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHhtbEVsZW1lbnROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHhtbEVsZW1lbnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkYXRhTWVtYmVyOiAiKTsKLQkJaWYgKGRhdGFNZW1iZXJFU2V0KSByZXN1bHQuYXBwZW5kKGRhdGFNZW1iZXIpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB4bWxBdHRyaWJ1dGVOYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBkYXRhTWVtYmVyOiAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAoZGF0YU1lbWJlckVTZXQpIHJlc3VsdC5hcHBlbmQoZGF0YU1lbWJlcik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCisJCXJlc3VsdC5hcHBlbmQoIiwgeG1sQXR0cmlidXRlTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh4bWxBdHRyaWJ1dGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB4bWxXaWxkY2FyZDogIik7Ci0JCWlmICh4bWxXaWxkY2FyZEVTZXQpIHJlc3VsdC5hcHBlbmQoeG1sV2lsZGNhcmQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB4bWxXaWxkY2FyZDogIik7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKHhtbFdpbGRjYXJkRVNldCkgcmVzdWx0LmFwcGVuZCh4bWxXaWxkY2FyZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExCaW5kaW5nSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETEJpbmRpbmdJbXBsLmphdmEKaW5kZXggNTMwMzVmMS4uODg5Y2Y2MSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETEJpbmRpbmdJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETEJpbmRpbmdJbXBsLmphdmEKQEAgLTQxLDcgKzQxLDggQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKyAgQE92ZXJyaWRlCitwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKIAkJcmV0dXJuIEpheHJwY21hcFBhY2thZ2UuTGl0ZXJhbHMuV1NETF9CSU5ESU5HOwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE1lc3NhZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZUltcGwuamF2YQppbmRleCAzNmY2YjQ2Li40Y2RjMjg4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZUltcGwuamF2YQpAQCAtNDEsNyArNDEsOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5XU0RMX01FU1NBR0U7CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZU1hcHBpbmdJbXBsLmphdmEKaW5kZXggMWJkMjNkNC4uYjNmMWVlMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE1lc3NhZ2VNYXBwaW5nSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExNZXNzYWdlTWFwcGluZ0ltcGwuamF2YQpAQCAtMTUyLDcgKzE1Miw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisgIEBPdmVycmlkZQorcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLldTRExfTUVTU0FHRV9NQVBQSU5HOwogCX0KIApAQCAtMzEzLDYgKzMxNCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFOgpAQCAtMzI2LDYgKzMyOCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fSUQ6CkBAIC0zNDcsNiArMzUwLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fSUQ6CkBAIC0zNzMsNiArMzc3LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fSUQ6CkBAIC0zOTksNiArNDA0LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fSUQ6CkBAIC00MjAsMTggKzQyNiwxOSBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgIEBPdmVycmlkZQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3NkbE1lc3NhZ2VQYXJ0TmFtZTogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgd3NkbE1lc3NhZ2VQYXJ0TmFtZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh3c2RsTWVzc2FnZVBhcnROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbWV0ZXJNb2RlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBwYXJhbWV0ZXJNb2RlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHBhcmFtZXRlck1vZGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBIZWFkZXI6ICIpOwotCQlpZiAoc29hcEhlYWRlckVTZXQpIHJlc3VsdC5hcHBlbmQoc29hcEhlYWRlcik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHNvYXBIZWFkZXI6ICIpOyAvLyROT04tTkxTLTEkCisJCWlmIChzb2FwSGVhZGVyRVNldCkgcmVzdWx0LmFwcGVuZChzb2FwSGVhZGVyKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExNZXNzYWdlUGFydE5hbWVJbXBsLmphdmEKaW5kZXggODFhMjE1Ny4uNjVlOWQ0MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE1lc3NhZ2VQYXJ0TmFtZUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMTWVzc2FnZVBhcnROYW1lSW1wbC5qYXZhCkBAIC04Nyw3ICs4Nyw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisgIEBPdmVycmlkZQorcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLldTRExfTUVTU0FHRV9QQVJUX05BTUU7CiAJfQogCkBAIC0xMzgsNiArMTM5LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX0lEOgpAQCAtMTUzLDYgKzE1NSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fSUQ6CkBAIC0xNzAsNiArMTczLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfUEFSVF9OQU1FX19JRDoKQEAgLTE4Nyw2ICsxOTEsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX0lEOgpAQCAtMjAyLDEzICsyMDcsMTQgQEAKICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICBAT3ZlcnJpZGUKK3B1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKIAogCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7CisJCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxNZXNzYWdlUGFydE5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHdzZGxNZXNzYWdlUGFydE5hbWU6ICIpOyAvLyROT04tTkxTLTEkCiAJCXJlc3VsdC5hcHBlbmQod3NkbE1lc3NhZ2VQYXJ0TmFtZSk7CiAJCXJlc3VsdC5hcHBlbmQoJyknKTsKIAkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE9wZXJhdGlvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExPcGVyYXRpb25JbXBsLmphdmEKaW5kZXggMmU2YzlhZi4uZjZhYzI1MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETE9wZXJhdGlvbkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMT3BlcmF0aW9uSW1wbC5qYXZhCkBAIC04Nyw3ICs4Nyw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisgIEBPdmVycmlkZQorcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLldTRExfT1BFUkFUSU9OOwogCX0KIApAQCAtMTM4LDYgKzEzOSw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fSUQ6CkBAIC0xNTMsNiArMTU1LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fSUQ6CkBAIC0xNzAsNiArMTczLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fSUQ6CkBAIC0xODcsNiArMTkxLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fSUQ6CkBAIC0yMDIsMTMgKzIwNywxNCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgIEBPdmVycmlkZQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd3NkbE9wZXJhdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQoIiwgd3NkbE9wZXJhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZCh3c2RsT3BlcmF0aW9uKTsKIAkJcmVzdWx0LmFwcGVuZCgnKScpOwogCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydFR5cGVJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMUG9ydFR5cGVJbXBsLmphdmEKaW5kZXggNTUzYWE3Mi4uNjAxMDIwOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETFBvcnRUeXBlSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExQb3J0VHlwZUltcGwuamF2YQpAQCAtNDEsNyArNDEsOCBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworICBAT3ZlcnJpZGUKK3Byb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewogCQlyZXR1cm4gSmF4cnBjbWFwUGFja2FnZS5MaXRlcmFscy5XU0RMX1BPUlRfVFlQRTsKIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nSW1wbC5qYXZhCmluZGV4IDFiYzhkNGYuLmY1MjQ0ODUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETFJldHVyblZhbHVlTWFwcGluZ0ltcGwuamF2YQpAQCAtMTIyLDcgKzEyMiw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisgIEBPdmVycmlkZQorcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkc7CiAJfQogCkBAIC0yMzcsNiArMjM4LDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRToKQEAgLTI1MCw2ICsyNTIsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fSUQ6CkBAIC0yNjksNiArMjcyLDcgQEAKIAkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKIAkJc3dpdGNoIChmZWF0dXJlSUQpIHsKIAkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX1JFVFVSTl9WQUxVRV9NQVBQSU5HX19JRDoKQEAgLTI5Miw2ICsyOTYsNyBAQAogCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewogCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewogCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX0lEOgpAQCAtMzE1LDYgKzMyMCw3IEBACiAJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CiAJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CiAJCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fSUQ6CkBAIC0zMzQsMTUgKzM0MCwxNiBAQAogICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KIAkgKiBAZ2VuZXJhdGVkCiAJICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgIEBPdmVycmlkZQorcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwogCiAJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKIAkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWV0aG9kUmV0dXJuVmFsdWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGhvZFJldHVyblZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKG1ldGhvZFJldHVyblZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsTWVzc2FnZVBhcnROYW1lOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB3c2RsTWVzc2FnZVBhcnROYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXN1bHQuYXBwZW5kKHdzZGxNZXNzYWdlUGFydE5hbWUpOwogCQlyZXN1bHQuYXBwZW5kKCcpJyk7CiAJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExTZXJ2aWNlTmFtZUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC9pbXBsL1dTRExTZXJ2aWNlTmFtZUltcGwuamF2YQppbmRleCBkMmNlYzRjLi4yOWNmZmY4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvaW1wbC9XU0RMU2VydmljZU5hbWVJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL2ltcGwvV1NETFNlcnZpY2VOYW1lSW1wbC5qYXZhCkBAIC00MSw3ICs0MSw4IEBACiAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisgIEBPdmVycmlkZQorcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CiAJCXJldHVybiBKYXhycGNtYXBQYWNrYWdlLkxpdGVyYWxzLldTRExfU0VSVklDRV9OQU1FOwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL3V0aWwvSmF4cnBjbWFwQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS93ZWJzZXJ2aWNlcy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL2pheHJwY21hcC9pbnRlcm5hbC91dGlsL0pheHJwY21hcEFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggNGU0OGRlMS4uYmI3ZGRlMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlL3dlYnNlcnZpY2VzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2UvamF4cnBjbWFwL2ludGVybmFsL3V0aWwvSmF4cnBjbWFwQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUvd2Vic2VydmljZXMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS9qYXhycGNtYXAvaW50ZXJuYWwvdXRpbC9KYXhycGNtYXBBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC04MCw3ICs4MCw4IEBACiAJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CisgIEBPdmVycmlkZQorcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQpAQCAtOTgsNzggKzk5LDEwMyBAQAogCSAqLwogICBwcm90ZWN0ZWQgSmF4cnBjbWFwU3dpdGNoIG1vZGVsU3dpdGNoID0KIAkJbmV3IEpheHJwY21hcFN3aXRjaCgpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlSmF2YVdTRExNYXBwaW5nKEphdmFXU0RMTWFwcGluZyBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSmF2YVdTRExNYXBwaW5nQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VQYWNrYWdlTWFwcGluZyhQYWNrYWdlTWFwcGluZyBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlUGFja2FnZU1hcHBpbmdBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZUphdmFYTUxUeXBlTWFwcGluZyhKYXZhWE1MVHlwZU1hcHBpbmcgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUphdmFYTUxUeXBlTWFwcGluZ0FkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlRXhjZXB0aW9uTWFwcGluZyhFeGNlcHRpb25NYXBwaW5nIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFeGNlcHRpb25NYXBwaW5nQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyhTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZyBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlU2VydmljZUludGVyZmFjZU1hcHBpbmdBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0FkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlUm9vdFR5cGVRbmFtZShSb290VHlwZVFuYW1lIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVSb290VHlwZVFuYW1lQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VWYXJpYWJsZU1hcHBpbmcoVmFyaWFibGVNYXBwaW5nIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVWYXJpYWJsZU1hcHBpbmdBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExNZXNzYWdlKFdTRExNZXNzYWdlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXU0RMTWVzc2FnZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcihDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VFbGVtZW50TmFtZShFbGVtZW50TmFtZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlRWxlbWVudE5hbWVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExTZXJ2aWNlTmFtZShXU0RMU2VydmljZU5hbWUgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVdTRExTZXJ2aWNlTmFtZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlUG9ydE1hcHBpbmcoUG9ydE1hcHBpbmcgb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVBvcnRNYXBwaW5nQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VXU0RMUG9ydFR5cGUoV1NETFBvcnRUeXBlIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXU0RMUG9ydFR5cGVBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExCaW5kaW5nKFdTRExCaW5kaW5nIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXU0RMQmluZGluZ0FkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyhTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VXU0RMT3BlcmF0aW9uKFdTRExPcGVyYXRpb24gb2JqZWN0KSB7CiAJCQkJcmV0dXJuIGNyZWF0ZVdTRExPcGVyYXRpb25BZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZU1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0FkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlV1NETFJldHVyblZhbHVlTWFwcGluZyhXU0RMUmV0dXJuVmFsdWVNYXBwaW5nIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXU0RMUmV0dXJuVmFsdWVNYXBwaW5nQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VXU0RMTWVzc2FnZU1hcHBpbmcoV1NETE1lc3NhZ2VNYXBwaW5nIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVXU0RMTWVzc2FnZU1hcHBpbmdBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVdTRExNZXNzYWdlUGFydE5hbWUoV1NETE1lc3NhZ2VQYXJ0TmFtZSBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlV1NETE1lc3NhZ2VQYXJ0TmFtZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBjYXNlSW50ZXJmYWNlTWFwcGluZyhJbnRlcmZhY2VNYXBwaW5nIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpOwogCQkJfQorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgT2JqZWN0IGNhc2VKMkVFRU9iamVjdChKMkVFRU9iamVjdCBvYmplY3QpIHsKIAkJCQlyZXR1cm4gY3JlYXRlSjJFRUVPYmplY3RBZGFwdGVyKCk7CiAJCQl9CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBPYmplY3QgY2FzZVFOYW1lKFFOYW1lIG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVRTmFtZUFkYXB0ZXIoKTsKIAkJCX0KKwkJCUBPdmVycmlkZQogCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewogCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwogCQkJfQpAQCAtMTgzLDcgKzIwOSw4IEBACiAJICogQHJldHVybiB0aGUgYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uCiAJICogQGdlbmVyYXRlZAogCSAqLwotICBwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgeworICBAT3ZlcnJpZGUKK3B1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7CiAJCXJldHVybiAoQWRhcHRlciltb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCl0YXJnZXQpOwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTA3MWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iamNhX3VpIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTBkNjgwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1qY2F1aS5qYXIKLXRlbXAuZm9sZGVyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmVjOWQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5jb20uaWJtLmV0b29scy5jdGMuamF2YXByb2plY3RuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyOGFiOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNUaHUgTWF5IDEwIDE4OjM1OjA0IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjNhODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjAxLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnBsdWdpbi5KQ0FVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkO3gtaW50ZXJuYWw6PXRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qc3QuajJlZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53ZWIudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53ZWI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU3NTg2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBqY2FfdWkvLFwKLSAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9yYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWZiM2Q0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmMjVhMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlYzZiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL0V4cG9ydFJBUkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL0V4cG9ydFJBUkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTcwZjI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9FeHBvcnRSQVJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkJhc2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwudXRpbC5KQ0FVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRSQVJBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIGxhYmVsID0gSkNBVUlNZXNzYWdlcy5jb25uZWN0b3JfZXhwb3J0X2FjdGlvbl9sYWJlbF91aV87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAiZXhwb3J0X3Jhcl93aXoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRXhwb3J0UkFSQWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRUZXh0KGxhYmVsKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNvbW1vbi5hY3Rpb25zLkJhc2VBY3Rpb24jcHJpbVJ1bihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKSB7Ci0JCUNvbm5lY3RvckNvbXBvbmVudEV4cG9ydFdpemFyZCB3aXphcmQgPSBuZXcgQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkKCk7Ci0JCUoyRUVVSVBsdWdpbiBwbHVnaW4gPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQl3aXphcmQuaW5pdChwbHVnaW4uZ2V0V29ya2JlbmNoKCksIHNlbGVjdGlvbik7Ci0JCXdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyhwbHVnaW4uZ2V0RGlhbG9nU2V0dGluZ3MoKSk7Ci0KLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvYWN0aW9ucy9JQ29ubmVjdG9yQXJjaGl2ZUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL0lDb25uZWN0b3JBcmNoaXZlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzVmYzUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL0lDb25uZWN0b3JBcmNoaXZlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotCi0KLS8qKgotICogRGVmaW5lcyBjb25zdGFudHMgZm9yIENvbm5lY3RvciBBcmNoaXZlIG9wZXJhdGlvbnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3RvckFyY2hpdmVDb25zdGFudHMgewotCi0JLy9BY3Rpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0VYUE9SVF9BQ1RJT05fTEFCRUwgPSAiJWNvbm5lY3Rvci5leHBvcnQuYWN0aW9uLmxhYmVsX3VpXyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vR2VuZXJhbAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9QUk9KRUNUX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNvbm5lY3Rvcl9Qcm9qZWN0X1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0ZJTEVfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ29ubmVjdG9yX0ZpbGVfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9DT05ORUNUT1JfRklMRV9OQU1FU19JRCA9ICJFSkJJbXBvcnRXaXphcmRQYWdlMS5TVE9SRV9DT05ORUNUT1JfRklMRV9OQU1FU19JRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9DT05ORUNUT1JfRVhQT1JUX0ZJTEVfTkFNRVMgPSAiQ29uZW5jdG9yRXhwb3J0V2l6YXJkUGFnZTEuU1RPUkVfQ09OTkVDVE9SX0VYUE9SVF9GSUxFX05BTUVTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWl9JTUFHRSA9ICJjb25uZWN0b3JfaW1wb3J0X3dpeiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVJfQlJPV1NFX0JVVFRPTl9GSUxURVIgPSAiKi5yYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0VYVEVOU0lPTiA9ICJyYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVTX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlllc19VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk5vX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFU1RJT05fVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUXVlc3Rpb25fVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9fVUlfID0gIlJlc291cmNlX3swfV9hbHJlYWR5X2V4aXN0cy5fX1dvdWxkX3lvdV9saWtlX3RvX292ZXJ3cml0ZV9pdF9VSV8iOyAvLyROT04tTkxTLTEkCi0JLy9JbXBvcnQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW1wb3J0X1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0FfQ09OTkVDVE9SX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkltcG9ydF9hX0Nvbm5lY3Rvcl9wcm9qZWN0X2Zyb21fdGhlX2ZpbGVfc3lzdGVtX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUX0lOVE9fTkVXX09SX0VYSVNUSU5HX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkltcG9ydF9pbnRvX25ld19vcl9leGlzdGluZ19FbnRlcnByaXNlX0FwcGxpY2F0aW9uX3Byb2plY3RfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfSU1QT1JUX0lEXyA9ICJDb25uZWN0b3JQcm9qZWN0SW1wb3J0UGFnZTEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0lNUE9SVF9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDb25uZWN0b3JfSW1wb3J0X1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVJBUjEwMDAgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5pcmFyMTAwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vRXhwb3J0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0VYUE9SVF9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDb25uZWN0b3JfRXhwb3J0X1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX0NPTk5FQ1RPUl9fVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXhwb3J0X0Nvbm5lY3Rvcl9Qcm9qZWN0X3RvX3RoZV9sb2NhbF9maWxlX3N5c3RlbV9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktCRU5DSF9JRCA9ICJDb25uZWN0b3JFeHBvcnRQYWdlMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXhwb3J0X1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhfV0laX0lNQUdFID0gImNvbm5lY3Rvcl9leHBvcnRfd2l6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSQVIxMDAwID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIuZXJhcjEwMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvL0Vycm9ycwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQUJMRV9UT19DT01QTEVURV9USEVfT1BFTl9FUlJPUl8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJVbmFibGVfdG9fY29tcGxldGVfdGhlX29wZXJhdGlvbmR1bXBfY2F1c2VkX2J5X3RoaXNfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfUFJPQkxFTVNfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW1wb3J0X1Byb2JsZW1zX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0lNUE9SVF9fVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ29ubmVjdG9yX0ltcG9ydF9FcnJvcl9VSV8iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9FUlJPUl9VSV8gPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJbXBvcnRfRXJyb3JfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVfSkFSX0ZJTEVfRE9FU19OT1RfRVhJU1RfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGhlX2phcl9maWxlX2RvZXNfbm90X2V4aXN0X29yX2Nhbm5vdF9iZV9vcGVuZWQsX1VJXyIpICsgLy8kTk9OLU5MUy0xJAotCQkJCVJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNsaWNrX2Jyb3dzZV90b19zZWxlY3RfYV92YWxpZF9qYXJfb3JfZW50ZXJfYV92YWxpZF9qYXJfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfRVhQT1JUX0VSUk9SX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNvbm5lY3Rvcl9FeHBvcnRfRXJyb3JfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5OT1RfRVhQT1JUX0NMT1NFRF9QUk9KRUNUX1VJXyA9IFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNhbm5vdF9leHBvcnRfY2xvc2VkX3Byb2plY3RzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUmFyX0ZpbGVfTmFtZV9OZWVkZWRfVUlfID0gUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUmFyX0ZpbGVfTmFtZV9OZWVkZWRfVUlfIik7IC8vJE5PTi1OTFMtMSQKLQotfS8vIElDb25uZWN0b3JBcmNoaXZlQ29uc3RhbnRzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvSW1wb3J0UkFSQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvSW1wb3J0UkFSQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZDBkNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL0ltcG9ydFJBUkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkJhc2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0UkFSQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSBSQVJBcmNoaXZlVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJbXBvcnRfUkFSIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJpbXBvcnRfcmFyX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJbXBvcnRSQVJBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRleHQoTEFCRUwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQmFzZUFjdGlvbiNwcmltUnVuKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpIHsKLQotCQlDb25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQgd2l6YXJkID0gbmV3IENvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZCgpOwotCi0JCUoyRUVVSVBsdWdpbiBwbHVnaW4gPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCi0JCXdpemFyZC5pbml0KHBsdWdpbi5nZXRXb3JrYmVuY2goKSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0KLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3Q29ubmVjdG9yQ29tcG9uZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvTmV3Q29ubmVjdG9yQ29tcG9uZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NGEyZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL05ld0Nvbm5lY3RvckNvbXBvbmVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5BYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwudXRpbC5KQ0FVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yUHJvamVjdFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0KLQotLyoqCi0gKiBDcmVhdGVzIGFuIGFjdGlvbiBmb3IgdGhlIENvbm5lY3RvciBwcm9qZWN0Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb25uZWN0b3JDb21wb25lbnRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24gewotCi0JLy8gVE9ETyBNREUgMDItMjggRmluZCBjb3JyZWN0IGxhYmVsCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSBKQ0FVSU1lc3NhZ2VzLkpDQV9NT0RVTEVfV0laX1RJVExFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OID0gIm5ld2Vhcl93aXoiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIE5ld0Nvbm5lY3RvckNvbXBvbmVudEFjdGlvbigpIHsKLQkJc2V0VGV4dChMQUJFTCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfS8vIE5ld0Nvbm5lY3RvclByb2plY3RBY3Rpb24KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBJV29ya2JlbmNoCi0JICogICAgICAgICAgICB3b3JrYmVuY2ggLSBXb3JrYmVuY2ggdG8gYWRkIHRvIHRoaXMgd2l6YXJkIHRvby4KLQkgKiBAcGFyYW0gU3RyaW5nCi0JICogICAgICAgICAgICBsYWJlbCAtIExhYmVsIGZvciBwcm9qZWN0LgotCSAqIEBwYXJhbSBDbGFzc1tdCi0JICogICAgICAgICAgICBhY2NlcHRlZFR5cGVzIC0gTGlzdCBvZiBhY2NlcHRlZCB0eXBlcyBmb3IgdGhpcyB3aXphcmQKLQkgKi8KLQlwdWJsaWMgTmV3Q29ubmVjdG9yQ29tcG9uZW50QWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoLCBTdHJpbmcgbGFiZWwsIENsYXNzW10gYWNjZXB0ZWRUeXBlcykgewotCQlzdXBlcih3b3JrYmVuY2gsIGxhYmVsLCBhY2NlcHRlZFR5cGVzLCBmYWxzZSk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfS8vIE5ld0Nvbm5lY3RvclByb2plY3RBY3Rpb24KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gV2l6YXJkCi0JICovCi0JcHJvdGVjdGVkIFdpemFyZCBjcmVhdGVXaXphcmQoKSB7Ci0JCXJldHVybiBuZXcgQ29ubmVjdG9yUHJvamVjdFdpemFyZCgpOwotCX0vLyBjcmVhdGVXaXphcmQKLQotCS8qKgotCSAqIHNob3VsZEFjY2VwdEVsZW1lbnQgLSBBbHdheXMgdHJ1ZQotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iagotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFjY2VwdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdHJ1ZTsgLyogTmV3R3JvdXAuaXNPbkJ1aWxkUGF0aChvYmopICYmICFOZXdHcm91cC5pc0luQXJjaGl2ZShvYmopOyAqLwotCX0vLyBzaG91bGRBY2NlcHRFbGVtZW50Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWxvZ1RleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0vLyBOZXdDb25uZWN0b3JQcm9qZWN0QWN0aW9uCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL2FjdGlvbnMvUkFSQXJjaGl2ZVVJUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTc5NjcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC9hY3Rpb25zL1JBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotCi0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotcHVibGljIGNsYXNzIFJBUkFyY2hpdmVVSVJlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmZ1Jlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb3VyY2UgYnVuZGxlIHVzZWQgYnkgYWxsIGNsYXNzZXMgaW4gdGhpcyBQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoInJhcmFyY2hpdmV1aSIpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvZXMgbm90aGluZyAtIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgYW5kCi0JCQkvLyBnZXRTdHJpbmcoU3RyaW5nLCBTdHJpbmcpIHdpbGwgcmV0dXJuIHRoZSBrZXkKLQkJCS8vIGl0IHdhcyBjYWxsZWQgd2l0aAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCWlmIChmZ1Jlc291cmNlQnVuZGxlID09IG51bGwpIHsKLQkJCWZnUmVzb3VyY2VCdW5kbGUgPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl9Ci0KLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmdSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiAiISIgKyBrZXkgKyAiISI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncykgewotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gYXJncywgaW50IHgpIHsKLQotCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvcGx1Z2luL0pDQVVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3BsdWdpbi9KQ0FVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODNhNDJkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvcGx1Z2luL0pDQVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAxNSwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEpDQVVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQkvLwlUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEpDQVVJUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgSkNBVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkNBVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3V0aWwvSkNBVUlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC91dGlsL0pDQVVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3NDdmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3V0aWwvSkNBVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi1wdWJsaWMgY2xhc3MgSkNBVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiamNhX3VpIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEpDQVVJTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbm5lY3Rvcl9leHBvcnRfYWN0aW9uX2xhYmVsX3VpXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzExOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSkNBVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1BR0VfTE9BRF9FUlJPUiA9IF8wOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9NT0RVTEVfV0laX1RJVExFID0gXzE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX1ZFUlNJT05fTEJMID0gXzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX01PRFVMRV9NQUlOX1BHX1RJVExFID0gXzM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX01PRFVMRV9NQUlOX1BHX0RFU0MgPSBfNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfSU1QT1JUX01BSU5fUEdfREVTQyA9IF81OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9JTVBPUlRfTUFJTl9QR19USVRMRSA9IF82OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9GSUxFX0xCTCA9IF83OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9NT0RVTEVfTEJMID0gXzg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0VYUE9SVF9NQUlOX1BHX1RJVExFID0gXzk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0VYUE9SVF9NQUlOX1BHX0RFU0MgPSBfMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0ZBQ0VUX0NPTkZJR1VSQVRJT049IF8xMTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckNvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmVhNDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnMuQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVBcnRpZmFjdEV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotLyoqCi0gKiA8cD4KLSAqIFdpemFyZCB1c2VkIHRvIGV4cG9ydCBKMkVFIENvbm5lY3RvciBtb2R1bGUgc3RydWN0dXJlcyAKLSAqIGZyb20gdGhlIEVjbGlwc2UgV29ya2JlbmNoIHRvIGEgZGVwbG95YWJsZSBDb25uZWN0b3IgCi0gKiBBcmNoaXZlICoucmFyIGZpbGUuICAKLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudEV4cG9ydFdpemFyZCBleHRlbmRzIEoyRUVBcnRpZmFjdEV4cG9ydFdpemFyZCBpbXBsZW1lbnRzIElFeHBvcnRXaXphcmQgewotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIENyZWF0ZXMgYSB3aXphcmQgd2l0aCBubyBzZWxlY3Rpb24sIAotCSAqIG5vIG1vZGVsIGluc3RhbmNlLCBhbmQgbm8gb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIAotCSAqIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzCi0JICogYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIEBwYXJhbSBtb2RlbCBUaGUgbW9kZWwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcHJlLXBvcHVsYXRlIHdpemFyZCBjb250cm9scyBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0gICAgcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKTsKLSAgICB9Ci0JLyoqCi0JICogPHA+Ci0JICogQWRkcyB0aGUgZm9sbG93aW5nIHBhZ2VzOgotCSAqIDx1bD4KLQkgKiAJPGxpPiB7QGxpbmsgUkFSRXhwb3J0UGFnZX0gYXMgdGhlIG1haW4gd2l6YXJkIHBhZ2UgKHtAbGluayAjTUFJTl9QR30pIAotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IFJBUkV4cG9ydFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcsIGdldFNlbGVjdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfSAgIAotCSAqIAotCSAqIDxwPgotCSAqIFNldHMgdXAgdGhlIGRlZmF1bHQgd2l6YXJkIHBhZ2UgaW1hZ2UuIAotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0luaXQoKSB7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkpDQV9FWFBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0gCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRJbXBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3M2U4NGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVNb2R1bGVJbXBvcnRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsLkpDQVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRQYWdlIGV4dGVuZHMgSjJFRU1vZHVsZUltcG9ydFBhZ2UgewotCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEltcG9ydFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEpDQVVJTWVzc2FnZXMuSkNBX0lNUE9SVF9NQUlOX1BHX1RJVExFKTsKLQkJc2V0RGVzY3JpcHRpb24oSkNBVUlNZXNzYWdlcy5KQ0FfSU1QT1JUX01BSU5fUEdfREVTQyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5KQ0FfSU1QT1JUX1dJWkFSRF9CQU5ORVIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIEpDQVVJTWVzc2FnZXMuSkNBX0ZJTEVfTEJMOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIqLnJhciJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlTmFtZXNTdG9yZUlEKCkgewotCQlyZXR1cm4gIlJBUiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdEltcG9ydExhYmVsKCkgewotCQlyZXR1cm4gSkNBVUlNZXNzYWdlcy5KQ0FfTU9EVUxFX0xCTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmZvcG9wSUQoKSB7Ci0JCXJldHVybiBJSjJFRVVJQ29udGV4dElkcy5JTVBPUlRfUkFSX1dJWkFSRF9QQUdFOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZUZhY2V0SUQoKXsKLQkJcmV0dXJuIElKMkVFRmFjZXRDb25zdGFudHMuSkNBOwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWIzOTRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuSVByb2R1Y3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuUHJvZHVjdE1hbmFnZXI7Ci0KLS8qKgotICogPHA+Ci0gKiBXaXphcmQgdXNlZCB0byBpbXBvcnQgSjJFRSBDb25uZWN0b3IgbW9kdWxlIHN0cnVjdHVyZXMgaW50byB0aGUgRWNsaXBzZSBXb3JrYmVuY2ggZnJvbSBhbgotICogZXhpc3RpbmcgQ29ubmVjdG9yICoucmFyIGZpbGUuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQgZXh0ZW5kcyBKMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkIHsKLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGVzIGEgd2l6YXJkIHdpdGggbm8gc2VsZWN0aW9uLCBubyBtb2RlbCBpbnN0YW5jZSwgYW5kIG5vCi0JICogb3BlcmF0aW9uIGluc3RhbmNlLiBUaGUgbW9kZWwgYW5kIG9wZXJhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYXMgbmVlZGVkLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZSBvcGVyYXRpb24uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgVGhlIG1vZGVsIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByZS1wb3B1bGF0ZSB3aXphcmQgY29udHJvbHMgYW5kIGludGVyZmFjZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBBZGRzIGFuIHtAbGluayBSQVJJbXBvcnRQYWdlfSBhcyB0aGUgbWFpbiB3aXphcmQgcGFnZSAoe0BsaW5rICNNQUlOX1BHfSkuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IENvbm5lY3RvckNvbXBvbmVudEltcG9ydFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogCi0JICogPHA+Ci0JICogU2V0cyB1cCB0aGUgZGlhbG9nIHdpbmRvdyB0aXRsZSBhbmQgZGVmYXVsdCB3aXphcmQgcGFnZSBpbWFnZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZG9Jbml0KCkgewotCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5JTVBPUlRfV0laX1RJVExFKSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkpDQV9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwotCQkvLyB1cGRhdGVFQVJUb01vZGVsRnJvbVNlbGVjdGlvbihnZXRTcGVjaWZpY0RhdGFNb2RlbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kdWxlVmFsaWRhdG9yU3RyaW5ncygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnZhbGlkYXRpb24uVUlDb25uZWN0b3JWYWxpZGF0b3IifTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgewotICAgICAgICByZXR1cm4gUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfSkNBKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckZhY2V0SW5zdGFsbFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvckZhY2V0SW5zdGFsbFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4M2JkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JGYWNldEluc3RhbGxQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgkgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVNb2R1bGVGYWNldEluc3RhbGxQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5wcm9qZWN0LmZhY2V0LklDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsLkpDQVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckZhY2V0SW5zdGFsbFBhZ2UgZXh0ZW5kcyBKMkVFTW9kdWxlRmFjZXRJbnN0YWxsUGFnZSBpbXBsZW1lbnRzIElDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXByaXZhdGUgTGFiZWwgY29uZmlnRm9sZGVyTGFiZWw7Ci0JcHJpdmF0ZSBUZXh0IGNvbmZpZ0ZvbGRlcjsKLQkKLQlwcml2YXRlIFRleHQgb3V0cHV0Rm9sZGVyOwotCXByaXZhdGUgTGFiZWwgb3V0cHV0Rm9sZGVyTGFiZWw7Ci0JCi0JcHVibGljIENvbm5lY3RvckZhY2V0SW5zdGFsbFBhZ2UoKSB7Ci0JCXN1cGVyKElNb2R1bGVDb25zdGFudHMuSlNUX0NPTk5FQ1RPUl9NT0RVTEUpOwotCQlzZXRUaXRsZShKQ0FVSU1lc3NhZ2VzLkpDQV9NT0RVTEVfTUFJTl9QR19USVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKEpDQVVJTWVzc2FnZXMuSkNBX0ZBQ0VUX0NPTkZJR1VSQVRJT04pOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtFQVJfUFJPSkVDVF9OQU1FLCBDT05GSUdfRk9MREVSLCBPVVRQVVRfRk9MREVSfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLk5FV19DT05ORUNUT1JfV0laQVJEX1AzKTsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQkvL3NldHVwRWFyQ29udHJvbChjb21wb3NpdGUpOwotCQkKLQkJY29uZmlnRm9sZGVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbmZpZ0ZvbGRlckxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuU09VUkNFRk9MREVSKSk7Ci0JCWNvbmZpZ0ZvbGRlckxhYmVsLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQotCQljb25maWdGb2xkZXIgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQljb25maWdGb2xkZXIuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCQljb25maWdGb2xkZXIuc2V0RGF0YSgibGFiZWwiLCBjb25maWdGb2xkZXJMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGNvbmZpZ0ZvbGRlciwgQ09ORklHX0ZPTERFUiwgbnVsbCk7Ci0JCQotCQlvdXRwdXRGb2xkZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJb3V0cHV0Rm9sZGVyTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5PVVRQVVRGT0xERVIpKTsKLQkJb3V0cHV0Rm9sZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCQkKLQkJb3V0cHV0Rm9sZGVyID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJb3V0cHV0Rm9sZGVyLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQkJb3V0cHV0Rm9sZGVyLnNldERhdGEoImxhYmVsIiwgdGhpcy5vdXRwdXRGb2xkZXJMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KG91dHB1dEZvbGRlciwgT1VUUFVUX0ZPTERFUiwgbnVsbCk7Ci0JCQotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JQcm9qZWN0Rmlyc3RQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9qY2FfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3VpL2ludGVybmFsL3dpemFyZC9Db25uZWN0b3JQcm9qZWN0Rmlyc3RQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNWVlNzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yUHJvamVjdEZpcnN0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFQ29tcG9uZW50RmFjZXRDcmVhdGlvbldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLnV0aWwuSkNBVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yUHJvamVjdEZpcnN0UGFnZSBleHRlbmRzIEoyRUVDb21wb25lbnRGYWNldENyZWF0aW9uV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgQ29ubmVjdG9yUHJvamVjdEZpcnN0UGFnZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKQ0FVSU1lc3NhZ2VzLkpDQV9NT0RVTEVfTUFJTl9QR19USVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKEpDQVVJTWVzc2FnZXMuSkNBX01PRFVMRV9NQUlOX1BHX0RFU0MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuSkNBX1BST0pFQ1RfV0laQVJEX0JBTk5FUikpOwotCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuTkVXX0NPTk5FQ1RPUl9XSVpBUkRfUDEpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlRmFjZXRJRCgpIHsKLQkJcmV0dXJuIElKMkVFRmFjZXRDb25zdGFudHMuSkNBOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yUHJvamVjdFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvQ29ubmVjdG9yUHJvamVjdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDQzMDM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL0Nvbm5lY3RvclByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldC5Db25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsLkpDQVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5JUHJvZHVjdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5Qcm9kdWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JQcm9qZWN0V2l6YXJkIGV4dGVuZHMgTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkIHsKLQotCXB1YmxpYyBDb25uZWN0b3JQcm9qZWN0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShKQ0FVSU1lc3NhZ2VzLkpDQV9NT0RVTEVfV0laX1RJVExFKTsKLQl9Ci0JCi0JcHVibGljIENvbm5lY3RvclByb2plY3RXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEpDQVVJTWVzc2FnZXMuSkNBX01PRFVMRV9XSVpfVElUTEUpOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDb25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCWZpbmFsIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCWZpbmFsIFVSTCB1cmwgPSBidW5kbGUuZ2V0RW50cnkoImljb25zL2Z1bGwvd2l6YmFuL2Nvbm5lY3Rvcl93aXouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoInRlbXBsYXRlLmpzdC5jb25uZWN0b3IiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJV2l6YXJkUGFnZSBjcmVhdGVGaXJzdFBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgQ29ubmVjdG9yUHJvamVjdEZpcnN0UGFnZShtb2RlbCwgImZpcnN0LnBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpIHsKLSAgICAgICAgcmV0dXJuIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX0pDQSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvUkFSRXhwb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvamNhX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS91aS9pbnRlcm5hbC93aXphcmQvUkFSRXhwb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjYzNDgzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL2pjYV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdWkvaW50ZXJuYWwvd2l6YXJkL1JBUkV4cG9ydFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBEZWMgMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFTW9kdWxlRXhwb3J0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC51dGlsLkpDQVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFJBUkV4cG9ydFBhZ2UgZXh0ZW5kcyBKMkVFTW9kdWxlRXhwb3J0UGFnZSB7Ci0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIFJBUkV4cG9ydFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotCQlzZXRUaXRsZShKQ0FVSU1lc3NhZ2VzLkpDQV9FWFBPUlRfTUFJTl9QR19USVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKEpDQVVJTWVzc2FnZXMuSkNBX0VYUE9SVF9NQUlOX1BHX0RFU0MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuSkNBX0VYUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG9uZW50TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5KQ0FfUFJPSl9MQkwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbHRlckV4cHJlc3Npb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIqLnJhciJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUV4cG9ydFBhZ2UjaXNNZXRhVHlwZVN1cHBvcnRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTWV0YVR5cGVTdXBwb3J0ZWQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBDb25uZWN0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZ2V0SW5mb3BvcElEKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZm9wb3BJRCgpIHsKLQkJcmV0dXJuIElKMkVFVUlDb250ZXh0SWRzLkVYUE9SVF9SQVJfV0laQVJEX1BBR0U7Ci0JfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wbmVudElEKCkgewotICAgICAgICByZXR1cm4gIkpTVF9DT05ORUNUT1IiOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ5NjYzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVdUUCBKQ0EgVUkgUGx1Zy1pbgotamNhLm1vZHVsZV91aV89Q29ubmVjdG9yIE1vZHVsZQotbmV3LmpjYS5tb2R1bGUuZGVzY3JpcHRpb25fdWlfPUNyZWF0ZSBhIENvbm5lY3RvciBtb2R1bGUKLWNvbm5lY3Rvci5pbXBvcnQuZGVzY3JpcHRpb25fdWlfPUltcG9ydCBhbiBleHRlcm5hbCBDb25uZWN0b3IgUkFSIGZpbGUgaW50byBhIENvbm5lY3RvciBwcm9qZWN0Ci1jb25uZWN0b3IuZXhwb3J0LmRlc2NyaXB0aW9uX3VpXz1FeHBvcnQgYSBDb25uZWN0b3IgcHJvamVjdCBpbnRvIGEgQ29ubmVjdG9yIFJBUiBmaWxlCi1jb25uZWN0b3IuamFyLmZpbGVfdWlfPVJBUiBmaWxlCi1jb25uZWN0b3IubW9kdWxlX3VpXz1Db25uZWN0b3IgTW9kdWxlCi1uZXcuY29ubmVjdG9yLm1vZHVsZS5kZXNjcmlwdGlvbl91aV89Q3JlYXRlIGEgQ29ubmVjdG9yIHByb2plY3QKLWNvbm5lY3Rvci5pbXBvcnQuYWN0aW9uLmxhYmVsX3VpXz1JbXBvcnQgUkFSIEZpbGUuLi4KLWNvbm5lY3Rvci5leHBvcnQuYWN0aW9uLmxhYmVsX3VpXz1FeHBvcnQgUkFSIEZpbGUuLi4KLWNvbm5lY3Rvcl9tb2R1bGVfdWlfPUNvbm5lY3RvciBQcm9qZWN0Ci1uZXcuY29ubmVjdG9yLm1vZHVsZS5kZXNjcmlwdGlvbl91aV89Q3JlYXRlIGEgSjJFRSBjb25uZWN0b3IgcHJvamVjdAotY29ubmVjdG9ycy5hY3Rpb25TZXQ9SjJDCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwYzAyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8IS0tIENvbm5lY3RvciBNb2R1bGUgV2l6YXJkIC0tPgotICAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJKMkVFVUlQcm9qZWN0V2l6YXJkcyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVjb25uZWN0b3JfbW9kdWxlX3VpXyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdjb25uZWN0aW9ucHJqX3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwiCi0gICAgICAgICAgICBwcm9qZWN0PSJ0cnVlIgotICAgICAgICAgICAgZmluYWxQZXJzcGVjdGl2ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yUHJvamVjdFdpemFyZCI+Ci0gICAgICAgICA8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yUHJvamVjdFdpemFyZCI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImphdmFlZXByb2plY3QiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lbnVJbmRleCIgdmFsdWU9IjUwIiAvPgotICAgICAgICAgPC9jbGFzcz4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVuZXcuY29ubmVjdG9yLm1vZHVsZS5kZXNjcmlwdGlvbl91aV8KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotICAgICAgPC93aXphcmQ+Ci0gICAgPC9leHRlbnNpb24+Ci08IS0tIEpDQSBJbXBvcnQgV2l6YXJkIC0tPiAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfcmFyLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckNvbXBvbmVudEltcG9ydFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVjb25uZWN0b3IuamFyLmZpbGVfdWlfIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVjb25uZWN0b3IuaW1wb3J0LmRlc2NyaXB0aW9uX3VpXwotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZWxlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotICAgICAgICAgPC9zZWxlY3Rpb24+Ci0gICAgICAgPC93aXphcmQ+Ci0gICAgIDwvZXh0ZW5zaW9uPgotCi08IS0tIEpDQSBFeHBvcnQgV2l6YXJkIC0tPiAKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgIDx3aXphcmQKLSAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsIgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JDb21wb25lbnRFeHBvcnRXaXphcmQiCi0gICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZiIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkIgotICAgICAgICAgICBuYW1lPSIlY29ubmVjdG9yLmphci5maWxlX3VpXyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlY29ubmVjdG9yLmV4cG9ydC5kZXNjcmlwdGlvbl91aV8KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgIDwvd2l6YXJkPgotICAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXMiPgotICAgICAgPHdpemFyZC1wYWdlcyBhY3Rpb249ImpzdC5jb25uZWN0b3IuaW5zdGFsbCI+Ci0gICAgICAgIDxwYWdlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvckZhY2V0SW5zdGFsbFBhZ2UiLz4KLSAgICAgIDwvd2l6YXJkLXBhZ2VzPgotICAgIDwvZXh0ZW5zaW9uPgotICAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS9wcm9wZXJ0eV9maWxlcy9qY2FfdWkucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL3Byb3BlcnR5X2ZpbGVzL2pjYV91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGZmNWZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpL3Byb3BlcnR5X2ZpbGVzL2pjYV91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1fMD1GYWlsZWQgdG8gZmluZCB0aGUgaW1hZ2UgInswfSIuCi1fMT1OZXcgQ29ubmVjdG9yIFByb2plY3QKLV8yPUoyQyB2ZXJzaW9uOgotXzM9Q29ubmVjdG9yIFByb2plY3QKLV80PUNyZWF0ZSBhIHN0YW5kYWxvbmUgQ29ubmVjdG9yIG1vZHVsZSBvciBhZGQgaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LgotXzU9SW1wb3J0IGEgQ29ubmVjdG9yIG1vZHVsZSBmcm9tIHRoZSBmaWxlIHN5c3RlbQotXzY9Q29ubmVjdG9yIEltcG9ydAotXzc9Q29ubmVjdG9yIGZpbGU6Ci1fOD1Db25uZWN0b3IgbW9kdWxlOgotXzk9Q29ubmVjdG9yIEV4cG9ydAotXzEwPUV4cG9ydCBDb25uZWN0b3IgbW9kdWxlIHRvIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KLV8xMT1Db25maWd1cmUgQ29ubmVjdG9yIG1vZHVsZSBzZXR0aW5ncy4KLWNvbm5lY3Rvcl9leHBvcnRfYWN0aW9uX2xhYmVsX3VpXz1FeHBvcnQgUkFSIEZpbGUuLi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWViODM2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqY2EvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icmFycHJvamVjdC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqY2FlZGl0LyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImpjYS12YWxpZGF0aW9uLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5YjM2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotcnVudGltZQotdGVtcC5mb2xkZXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODVhYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzlhODE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSNNb24gRmViIDE4IDE1OjU3OjA5IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzQ4NGRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwNS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luVmVuZG9yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EuYXJjaGl2ZS5vcGVyYXRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnZhbGlkYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwubW9kdWxlLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLm1vZHVsZWNvcmUudXRpbCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYmRiMzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBqY2EvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICByYXJwcm9qZWN0LyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgamNhZWRpdC8sXAotICAgICAgICAgICAgICAgICAgICAgICAgIGpjYS12YWxpZGF0aW9uLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1vdXRwdXQuLiA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNzBlZDAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DT05UQUNUPWRhbmJlcmdAdXMuaWJtLmNvbQotQ29tcG9uZW50U2hvcnROYW1lPWVqYgotQ29tcG9uZW50RnVsbE5hbWU9RUpCCi1Db21wb25lbnRDb21wZXRlbmN5PUVNRgotSmF2YUNvbXBpbGUuMT1zcmNqYXIKLUJ1aWxkVmVyaWZpY2F0aW9uLjE9ZGlyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC9wYWNrYWdlLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTRkMmZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iY29tLmlibS5ldG9vbHMuZW1mLndvcmtiZW5jaCIgZGVmYXVsdD0icGFja2FnaW5nUGx1Z2luIiBiYXNlZGlyPSIuLy4uIj4KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFja2FnZURpciIgdmFsdWU9IiIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLmRpcmVjdG9yeSIgIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uaWQiIHZhbHVlPSJjb20uaWJtLmV0b29scy5lamIiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi52ZXJzaW9uIiAgdmFsdWU9IiIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0icGFja2FnaW5nUGx1Z2luIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHtwbHVnaW4uaWR9Ii8+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke3BhY2thZ2VEaXJ9L3BsdWdpbnMvJHtwbHVnaW4uaWR9XyR7cGx1Z2luLnZlcnNpb259Ij4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW4uZGlyZWN0b3J5fSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icGx1Z2luLnhtbCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InJ1bnRpbWUvZWpiLmphciIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9idWlsZC93c0J1aWxkLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkL3dzQnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2MwYjgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2J1aWxkL3dzQnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgcHJvamVjdCBbCi0JPCFFTlRJVFkgYmFzZUJ1aWxkIFNZU1RFTSAiZmlsZTouLi8uLi93c0J1aWxkRGVmLnhtbCI+Ci1dPgotCi08cHJvamVjdCBuYW1lPSJidWlsZFBsdWdpbiIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4vLi4iPgotCi08IS0tIGluY2x1ZGUgdGhlIGNvbW1vbiB4bWwgYnVpbGQgZmlsZSAtLT4KLSZiYXNlQnVpbGQ7Ci0KLTx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9InByZXBhcmUiIGlmPSJwbHVnaW4uaWQiPgotCTxhbnRjYWxsIHRhcmdldD0iYnVpbGRqYXIiPgotCQk8cGFyYW0gbmFtZT0iamFybmFtZSIgdmFsdWU9IiR7ZGVmYXVsdGphcm5hbWV9Ii8+Ci0JCTxwYXJhbSBuYW1lPSJqYXJjbGFzc3BhdGgiIHZhbHVlPSIke3BsdWdpbi5jbGFzc3BhdGh9Ii8+Ci0JPC9hbnRjYWxsPgotPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9jb21wb25lbnQueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczZTFkMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EiPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhIiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBY3RpdmF0aW9uU3BlY19yZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXNfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFjdGl2YXRpb25TcGVjX3JlcXVpcmVkQ29uZmlnUHJvcGVydGllc19SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZjE0MzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFjdGl2YXRpb25TcGVjX3JlcXVpcmVkQ29uZmlnUHJvcGVydGllc19SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQWRtaW5PYmplY3RfY29uZmlnUHJvcGVydGllc19Db25maWdQcm9wZXJ0eS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQWRtaW5PYmplY3RfY29uZmlnUHJvcGVydGllc19Db25maWdQcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ODdiNjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFkbWluT2JqZWN0X2NvbmZpZ1Byb3BlcnRpZXNfQ29uZmlnUHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIyYjFlZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3ZjRmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29uZmlnUHJvcGVydHlfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25maWdQcm9wZXJ0eV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdlMDUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25maWdQcm9wZXJ0eV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmZpZ1Byb3BlcnR5X2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbmZpZ1Byb3BlcnR5X2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmZkZmZhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25maWdQcm9wZXJ0eV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25uZWN0aW9uRGVmaW5pdGlvbl9jb25maWdQcm9wZXJ0aWVzX0NvbmZpZ1Byb3BlcnR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25uZWN0aW9uRGVmaW5pdGlvbl9jb25maWdQcm9wZXJ0aWVzX0NvbmZpZ1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3ZWZlNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb25fY29uZmlnUHJvcGVydGllc19Db25maWdQcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29ubmVjdG9yX2xpY2Vuc2VfTGljZW5zZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29ubmVjdG9yX2xpY2Vuc2VfTGljZW5zZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZmY0ODUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbm5lY3Rvcl9saWNlbnNlX0xpY2Vuc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbm5lY3Rvcl9yZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VBZGFwdGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb25uZWN0b3JfcmVzb3VyY2VBZGFwdGVyX1Jlc291cmNlQWRhcHRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YmJjNTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbm5lY3Rvcl9yZXNvdXJjZUFkYXB0ZXJfUmVzb3VyY2VBZGFwdGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTMzOGZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTMzZDQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNTFjYTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZVR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzBiYmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZTg4YmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfaWNvbnNfSWNvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXJfbWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUFkYXB0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXJfbWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUFkYXB0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzAxZTJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX21lc3NhZ2VBZGFwdGVyX01lc3NhZ2VBZGFwdGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMaWNlbnNlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGljZW5zZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjdlZWUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMaWNlbnNlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTGljZW5zZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMaWNlbnNlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGQxODg0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVMaWNlbnNlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1lc3NhZ2VBZGFwdGVyX21lc3NhZ2VMaXN0ZW5lcnNfTWVzc2FnZUxpc3RlbmVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXNzYWdlQWRhcHRlcl9tZXNzYWdlTGlzdGVuZXJzX01lc3NhZ2VMaXN0ZW5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNTA1MDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1lc3NhZ2VBZGFwdGVyX21lc3NhZ2VMaXN0ZW5lcnNfTWVzc2FnZUxpc3RlbmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXNzYWdlTGlzdGVuZXJfYWN0aXZhdGlvblNwZWNfQWN0aXZhdGlvblNwZWMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1lc3NhZ2VMaXN0ZW5lcl9hY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uU3BlYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjMwNDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1lc3NhZ2VMaXN0ZW5lcl9hY3RpdmF0aW9uU3BlY19BY3RpdmF0aW9uU3BlYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfYXV0aGVudGljYXRpb25NZWNoYW5pc21zX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcl9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbXNfQXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzRjYWE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcl9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbXNfQXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX2Nvbm5lY3Rpb25EZWZpbml0aW9uc19Db25uZWN0aW9uRGVmaW5pdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkRlZmluaXRpb25zX0Nvbm5lY3Rpb25EZWZpbml0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNkNjEzOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkRlZmluaXRpb25zX0Nvbm5lY3Rpb25EZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiN2VlZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDE4ODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9hZG1pbk9iamVjdHNfQWRtaW5PYmplY3QuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9hZG1pbk9iamVjdHNfQWRtaW5PYmplY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjE5MmI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfYWRtaW5PYmplY3RzX0FkbWluT2JqZWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfYXV0aGVudGljYXRpb25NZWNoYW5pc21zX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfYXV0aGVudGljYXRpb25NZWNoYW5pc21zX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlNDY3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtc19BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2NvbmZpZ1Byb3BlcnRpZXNfQ29uZmlnUHJvcGVydHkuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9jb25maWdQcm9wZXJ0aWVzX0NvbmZpZ1Byb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhMTQ5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX2NvbmZpZ1Byb3BlcnRpZXNfQ29uZmlnUHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9pbmJvdW5kUmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9pbmJvdW5kUmVzb3VyY2VBZGFwdGVyX0luYm91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODU3ZGUxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfaW5ib3VuZFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9vdXRib3VuZFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlQWRhcHRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNGExMmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlc291cmNlQWRhcHRlcl9vdXRib3VuZFJlc291cmNlQWRhcHRlcl9PdXRib3VuZFJlc291cmNlQWRhcHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVzb3VyY2VBZGFwdGVyX3NlY3VyaXR5UGVybWlzc2lvbnNfU2VjdXJpdHlQZXJtaXNzaW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfc2VjdXJpdHlQZXJtaXNzaW9uc19TZWN1cml0eVBlcm1pc3Npb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTk0YWZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZXNvdXJjZUFkYXB0ZXJfc2VjdXJpdHlQZXJtaXNzaW9uc19TZWN1cml0eVBlcm1pc3Npb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbl9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbl9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTI1YmVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN1cml0eVBlcm1pc3Npb25fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN1cml0eVBlcm1pc3Npb25fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODI4ZjQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN1cml0eVBlcm1pc3Npb25fZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0FjdGl2YXRpb25TcGVjLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZhdGlvblNwZWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzllYmJmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZhdGlvblNwZWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9BZG1pbk9iamVjdC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0FkbWluT2JqZWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2NDNkYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0FkbWluT2JqZWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNjg4MWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0NvbmZpZ1Byb3BlcnR5LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQ29uZmlnUHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGUzY2YyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQ29uZmlnUHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9Db25uZWN0aW9uRGVmaW5pdGlvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0Nvbm5lY3Rpb25EZWZpbml0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyMjQ2My4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0Nvbm5lY3Rpb25EZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQ29ubmVjdG9yLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvQ29ubmVjdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4NzQ3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0Nvbm5lY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0luYm91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4ZmI4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L0luYm91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9MaWNlbnNlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvTGljZW5zZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTRmZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9MaWNlbnNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvTWVzc2FnZUFkYXB0ZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9NZXNzYWdlQWRhcHRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNDU1MWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9NZXNzYWdlQWRhcHRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L01lc3NhZ2VMaXN0ZW5lci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L01lc3NhZ2VMaXN0ZW5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjI0NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9NZXNzYWdlTGlzdGVuZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9PdXRib3VuZFJlc291cmNlQWRhcHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiODJlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L091dGJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTRmZTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1Jlc291cmNlQWRhcHRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9pY29ucy9mdWxsL29iajE2L1Jlc291cmNlQWRhcHRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjRmM2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9SZXNvdXJjZUFkYXB0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9TZWN1cml0eVBlcm1pc3Npb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9TZWN1cml0eVBlcm1pc3Npb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZlM2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvU2VjdXJpdHlQZXJtaXNzaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2ljb25zL2Z1bGwvb2JqMTYvY29ubmVjdGlvbl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9jb25uZWN0aW9uX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZWZlNjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvaWNvbnMvZnVsbC9vYmoxNi9jb25uZWN0aW9uX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2EtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvdmFsaWRhdGlvbi9Db25uZWN0b3JIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS92YWxpZGF0aW9uL0Nvbm5lY3RvckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2RjOWVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS92YWxpZGF0aW9uL0Nvbm5lY3RvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMiwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0KLSAqIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbi5KMkVFVmFsaWRhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsLkNvbm5lY3RvckFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkNvbm5lY3Rvck1lc3NhZ2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaFJlcG9ydGVyOwotCi0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9ySGVscGVyIGV4dGVuZHMgSjJFRVZhbGlkYXRpb25IZWxwZXIgewotCXByb3RlY3RlZCBSQVJGaWxlIHJhckZpbGU7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIENvbm5lY3RvckhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQkJcmVnaXN0ZXJNb2RlbChDb25uZWN0b3JNZXNzYWdlQ29uc3RhbnRzLkNPTk5FQ1RPUl9NT0RFTF9OQU1FLCAibG9hZFJhckZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgUmFyIGZpbGUgZm9yIHZhbGlkYXRpb24KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBsb2FkUmFyRmlsZSgpIHsKLQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKTsKLQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wKTsKLQkJCi0JCXRyeSB7Ci0JCQlyYXJGaWxlID0gKFJBUkZpbGUpKChDb25uZWN0b3JBcnRpZmFjdEVkaXQpIGVkaXQpLmFzQXJjaGl2ZShmYWxzZSk7Ci0JCQlyZXR1cm4gcmFyRmlsZTsKLQkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZTEpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZTEpOwotCQl9ZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkJCi0JLyoqCi0JICogR2l2ZW4gYSByZXNvdXJjZSwgcmV0dXJuIGl0cyBub24tZWNsaXBzZS1zcGVjaWZpYyBsb2NhdGlvbi4gSWYgdGhpcyByZXNvdXJjZSwgb3IgdHlwZSBvZgotCSAqIHJlc291cmNlLCBpc24ndCBoYW5kbGVkIGJ5IHRoaXMgaGVscGVyLCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAicmFyLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHVibGljIHZvaWQgY2xlYW51cChXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgewotCQlpZihyYXJGaWxlICE9IG51bGwpewotCQkJcmFyRmlsZS5jbG9zZSgpOwotCQkJcmFyRmlsZSA9IG51bGw7Ci0JCX0KLQkJCi0JCXN1cGVyLmNsZWFudXAocmVwb3J0ZXIpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS92YWxpZGF0aW9uL1VJQ29ubmVjdG9yVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2EtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvdmFsaWRhdGlvbi9VSUNvbm5lY3RvclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzMxMDY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS92YWxpZGF0aW9uL1VJQ29ubmVjdG9yVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDIyLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLkNvbm5lY3RvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotCi0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVUlDb25uZWN0b3JWYWxpZGF0b3IgZXh0ZW5kcyBDb25uZWN0b3JWYWxpZGF0b3IgewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgVUlDb25uZWN0b3JWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRG9lcyB0aGUgdmFsaWRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb257Ci0JCQotCQlJUHJvamVjdCBwcm9qID0gKChJV29ya2JlbmNoQ29udGV4dCkgaGVscGVyKS5nZXRQcm9qZWN0KCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHdiTW9kdWxlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvaik7Ci0JCQotICAgICAgICBpZihKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvaikpIHsKLQkJCUlWaXJ0dWFsRmlsZSByYXJERCA9IHdiTW9kdWxlLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKEoyRUVDb25zdGFudHMuUkFSX0REX1VSSSk7Ci0JCQlpZiggcmFyREQuZXhpc3RzKCkpIHsJCQkKLQkJCQlzdGF0dXMgPSAgc3VwZXIudmFsaWRhdGVJbkpvYihoZWxwZXIsIHJlcG9ydGVyKTsKLQkJCX1lbHNlewotCQkJCUlNZXNzYWdlIGVycm9yTXNnID0gbmV3IE1lc3NhZ2UoZ2V0QmFzZU5hbWUoKSwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgRVJST1JfSU5WQUxJRF9DT05ORUNUT1JfRklMRSk7Ci0JCQkJc3RhdHVzID0gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKCBlcnJvck1zZy5nZXRUZXh0KCBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpKTsKLQkJCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJvck1zZyk7Ci0JCQl9Ci0JCQkvL3ZhbGlkYXRlSjJFRTE0RG9jVHlwZShoZWxwZXIsIGVkaXRNb2RlbCk7Ci0JCX0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgbmF0dXJlIGlzIGNvbnNpc3RlbnQgd2l0aCBkb2MgdHlwZS4KLQkgKi8KLS8vCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSjJFRTE0RG9jVHlwZShDb25uZWN0b3JIZWxwZXIgaGVscGVyLCBDb25uZWN0b3JFZGl0TW9kZWwgZWRpdE1vZGVsKSB7Ci0vLwotLy8JCWlmIChlZGl0TW9kZWwuZ2V0Q29ubmVjdG9yTmF0dXJlKCkuZ2V0SjJFRVZlcnNpb24oKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCAmJiBnZXRDb25uZWN0b3JERCgpLmdldFZlcnNpb25JRCgpIDwgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRCkgewotLy8JCQlTdHJpbmdbXSBwYXJhbXMgPSBuZXcgU3RyaW5nWzNdOwotLy8JCQlwYXJhbXNbMF0gPSBET0NUWVBFXzFfNDsKLS8vCQkJcGFyYW1zWzFdID0gaGVscGVyLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0vLwkJCXBhcmFtc1syXSA9IERPQ1RZUEVfMV8zOwotLy8JCQlhZGRFcnJvcihnZXRCYXNlTmFtZSgpLCBDT05ORUNUT1JfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl8sIHBhcmFtcyk7Ci0vLwkJfSBlbHNlIGlmIChlZGl0TW9kZWwuZ2V0Q29ubmVjdG9yTmF0dXJlKCkuZ2V0SjJFRVZlcnNpb24oKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCAmJiBnZXRDb25uZWN0b3JERCgpLmdldFZlcnNpb25JRCgpICE9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQpIHsKLS8vCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1szXTsKLS8vCQkJcGFyYW1zWzBdID0gRE9DVFlQRV8xXzM7Ci0vLwkJCXBhcmFtc1sxXSA9IGhlbHBlci5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotLy8JCQlwYXJhbXNbMl0gPSBET0NUWVBFXzFfNDsKLS8vCQkJYWRkRXJyb3IoZ2V0QmFzZU5hbWUoKSwgQ09OTkVDVE9SX0lOVkFMSURfRE9DX1RZUEVfRVJST1JfLCBwYXJhbXMpOwotLy8JCX0vLyBpZgotLy8JfS8vIHZhbGlkYXRlRG9jVHlwZVZzTmF0dXJlCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRkMTZlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQuSUNvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQlwdWJsaWMgQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZBQ0VUX0lEKSkgewotCQkJcmV0dXJuIEpDQTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTkZJR19GT0xERVIpKSB7Ci0JCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkpDQV9DT05URU5UX0ZPTERFUik7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhNT0RVTEVfVVJJKSkgewotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKS5yZXBsYWNlKCcgJywnXycpOwotCQkJcmV0dXJuIHByb2plY3ROYW1lICsgSUoyRUVNb2R1bGVDb25zdGFudHMuUkFSX0VYVDsgCi0JCX0gZWxzZSBpZihwcm9wZXJ0eU5hbWUuZXF1YWxzKEdFTkVSQVRFX0REKSl7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9ZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPVVRQVVRfRk9MREVSKSkgewotCQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldFN0cmluZyhKMkVFUHJlZmVyZW5jZXMuS2V5cy5KQ0FfT1VUUFVUX0ZPTERFUik7CQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBjb252ZXJ0RmFjZXRWZXJzaW9uVG9KMkVFVmVyc2lvbihJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCXJldHVybiBKMkVFVmVyc2lvblV0aWwuY29udmVydENvbm5lY3RvclZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvcGx1Z2luL0pDQVJlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9wbHVnaW4vSkNBUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NDI5Y2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9wbHVnaW4vSkNBUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBKQ0FSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gInJhciI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBKQ0FSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpY2Vuc2VJdGVtUHJvdmlkZXJfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXJfVUlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlcl9VSV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfdHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fdHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSW5ib3VuZFJlc291cmNlQWRhcHRlcl90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NZXNzYWdlQWRhcHRlcl90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NZXNzYWdlTGlzdGVuZXJfdHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQWN0aXZhdGlvblNwZWNfdHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfdHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQWRtaW5PYmplY3RfdHlwZTsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpDQVJlc291cmNlSGFuZGxlci5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvcGx1Z2luL0pjYU1vZHVsZUV4dGVuc2lvbkltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvcGx1Z2luL0pjYU1vZHVsZUV4dGVuc2lvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkZjI3MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3BsdWdpbi9KY2FNb2R1bGVFeHRlbnNpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyOSwgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUKLSAqIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9ucy5Db25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uRWFyTW9kdWxlRXh0ZW5zaW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uSmNhTW9kdWxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5wcm9qZWN0LmZhY2V0LkNvbm5lY3RvckZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgSmNhTW9kdWxlRXh0ZW5zaW9uSW1wbCBleHRlbmRzIEVhck1vZHVsZUV4dGVuc2lvbkltcGwgaW1wbGVtZW50cyBKY2FNb2R1bGVFeHRlbnNpb24gewotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKY2FNb2R1bGVFeHRlbnNpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uSmNhTW9kdWxlRXh0ZW5zaW9uI2NyZWF0ZVByb2plY3RJbmZvKCkKLQkgKi8KLQkvLwlwdWJsaWMgSjJFRUphdmFQcm9qZWN0SW5mbyBjcmVhdGVQcm9qZWN0SW5mbygpIHsKLQkvLwkJcmV0dXJuIG5ldyBDb25uZWN0b3JQcm9qZWN0SW5mbygpOwotCS8vCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5KY2FNb2R1bGVFeHRlbnNpb24jY3JlYXRlSW1wb3J0T3BlcmF0aW9uKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUuUkFSRmlsZSkKLQkgKi8KLQkvLwlwdWJsaWMgSjJFRUltcG9ydE9wZXJhdGlvbiBjcmVhdGVJbXBvcnRPcGVyYXRpb24oSVByb2plY3QgcHJvaiwgUkFSRmlsZSByYXJGaWxlKXsKLQkvLwkJcmV0dXJuIG5ldyBSQVJJbXBvcnRPcGVyYXRpb24ocHJvaiwgcmFyRmlsZSk7Ci0JLy8JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5FYXJNb2R1bGVFeHRlbnNpb24jY3JlYXRlUHJvamVjdERhdGFNb2RlbCgpCi0JICovCi0JcHVibGljIElEYXRhTW9kZWwgY3JlYXRlUHJvamVjdERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDb25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLkVhck1vZHVsZUV4dGVuc2lvbiNjcmVhdGVJbXBvcnREYXRhTW9kZWwoKQotCSAqLwotCXB1YmxpYyBJRGF0YU1vZGVsIGNyZWF0ZUltcG9ydERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL2ludGVybmFsL3BsdWdpbi9KY2FQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvcGx1Z2luL0pjYVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDQ5NzBiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvcGx1Z2luL0pjYVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW47Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5pbXBsLkNvbm5lY3RvclJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5XVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGEgdG9wLWxldmVsIGNsYXNzIG9mIHRoZSBqMmVlIHBsdWdpbi4KLSAqIAotICogQHNlZSBBYnN0cmFjdFVJUGx1Z2luIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIFVJIHBsdWdpbnMKLSAqLwotCi1wdWJsaWMgY2xhc3MgSmNhUGx1Z2luIGV4dGVuZHMgV1RQUGx1Z2luIGltcGxlbWVudHMgUmVzb3VyY2VMb2NhdG9yIHsKLQkvLyBEZWZhdWx0IGluc3RhbmNlIG9mIHRoZSByZWNlaXZlcgotCXByaXZhdGUgc3RhdGljIEpjYVBsdWdpbiBpbnN0OwotCXByb3RlY3RlZCBmaW5hbCBJUGF0aCBpY29uc0ZvbGRlciA9IG5ldyBQYXRoKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpLmdldEVudHJ5KCJpY29ucyIpLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EiOyAvLyROT04tTkxTLTEkCi0JLy8gVmFsaWRhdGlvbiBwYXJ0IG9mIHRoZSBwbHVnaW4KLQkvL0dsb2JhbCBSZXNvdXJjZVNldCAoc29tZXdoYXQgZ2xvYmFsKQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJQ09OX0RJUlMgPSBuZXcgU3RyaW5nW117Imljb25zL2Z1bGwvb2JqMTYiLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zL2Z1bGwvY3ZpZXcxNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC9jdG9vbDE2IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJpY29ucy9mdWxsL2NsY2wxNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC9vdnIxNiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC9leHRyYSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiaWNvbnMvZnVsbC93aXpiYW4iLCAvLyROT04tTkxTLTEkCi0JCQkJImljb25zIiwgLy8kTk9OLU5MUy0xJAotCQkJCSIifTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBKMkVFIHBsdWdpbiBhbmQgY2FjaGUgaXRzIGRlZmF1bHQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgSmNhUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoaW5zdCA9PSBudWxsKQotCQkJaW5zdCA9IHRoaXM7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXQgdGhlIHBsdWdpbiBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIHB1YmxpYyBKY2FQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3Q7Ci0JfQotCi0JLyoKLQkgKiBKYXZhZG9jIGNvcGllZCBmcm9tIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEJhc2VVUkwoKSB7Ci0JCXJldHVybiBnZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBnZXRzIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldEltYWdlVVJMKGtleSwgZ2V0QnVuZGxlKCkpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0SW5zdGFsbFVSTCgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBKY2FQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gaW5zdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBsdWdpbiBkaXJlY3RvcnkgbG9jYXRpb24tIHRoZSBkaXJlY3RvcnkgdGhhdCBhbGwgdGhlIHBsdWdpbnMgYXJlIGxvY2F0ZWQgaW4gKGkuZS4KLQkgKiBkOlxpbnN0YWxsZGlyXHBsdWdpbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFBsdWdpbkxvY2F0aW9uKFN0cmluZyBwbHVnaW5JZCkgewotLy8JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVBhdGggaW5zdGFsbFBhdGggPSBuZXcgUGF0aChidW5kbGUuZ2V0RW50cnkoIi8iKS50b0V4dGVybmFsRm9ybSgpKS5yZW1vdmVUcmFpbGluZ1NlcGFyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGluc3RhbGxTdHIgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKG5ldyBVUkwoaW5zdGFsbFBhdGgudG9TdHJpbmcoKSkpLmdldEZpbGUoKTsKLQkJCQlyZXR1cm4gbmV3IFBhdGgoaW5zdGFsbFN0cik7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEphdmFkb2MgY29waWVkIGZyb20gaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKGdldEJ1bmRsZSgpLCBrZXkpOwotCX0KLQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0W10gc3Vic3RpdHV0aW9ucykgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIHN1YnN0aXR1dGlvbnMpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luI2dldFBsdWdpbklEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJQ29ubmVjdG9yUmVzb3VyY2VGYWN0b3J5LnJlZ2lzdGVyKFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFKTsKLQl9CQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIGJvb2xlYW4gdHJhbnNsYXRlKSB7Ci0JCS8vIFRPRE8gRm9yIG5vdy4uLiAgdHJhbnNsYXRlIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIHN1YnN0aXR1dGlvbnMsIGJvb2xlYW4gdHJhbnNsYXRlKSB7Ci0JCS8vIFRPRE8gRm9yIG5vdy4uLiAgdHJhbnNsYXRlIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIGdldFN0cmluZyhrZXksc3Vic3RpdHV0aW9ucyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzUyYjE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5wcm9qZWN0LmZhY2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgd2FzIG5vdCBpbnRlbmRlZCB0byBiZSBwdWJsaWMgQVBJLiAgUGxlYXNlIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQuSUNvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXN9IAotICogCi0gKiBAZGVwcmVjYXRlZAotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvamVjdC5mYWNldC5Db25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvamVjdC5mYWNldC5Db25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciB7Ci0JcHVibGljIENvbm5lY3RvckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWNiMWUyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5XdHBVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5DbGFzc3BhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLm1vZHVsZWNvcmUudXRpbC5Db25uZWN0b3JBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFRmFjZXRJbnN0YWxsRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5GYWNldERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckZhY2V0SW5zdGFsbERlbGVnYXRlIGV4dGVuZHMgSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RPUl9YTUxfVEVNUExBVEVfMTAJCT0gInJhcnRwMTAueG1sIjsJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfWE1MX1RFTVBMQVRFXzE1CQk9ICJyYXJ0cDE1LnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl0cnkgewotCQkJSURhdGFNb2RlbCBtb2RlbCA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0KLQkJCWZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQotCQkJLy8gQWRkIFdUUCBuYXR1cmVzLgotCi0JCQlXdHBVdGlscy5hZGROYXR1cmVzKHByb2plY3QpOwotCi0JCQkvLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCi0KLQkJCWZpbmFsIElXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQlmaW5hbCBJUGF0aCBwanBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCk7Ci0KLQkJCS8vIFNldHVwIHRoZSBmbGV4aWJsZSBwcm9qZWN0IHN0cnVjdHVyZS4KLQotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIGZhbHNlKTsKLQotCQkJYy5jcmVhdGUoMCwgbnVsbCk7Ci0JCQlzZXRPdXRwdXRGb2xkZXIobW9kZWwsIGMpOwotCi0JCQlmaW5hbCBJVmlydHVhbEZvbGRlciByb290ID0gYy5nZXRSb290Rm9sZGVyKCk7Ci0JCQlJRm9sZGVyIHNvdXJjZUZvbGRlciA9IG51bGw7Ci0JCQlTdHJpbmcgY29uZmlnRm9sZGVyID0gbnVsbDsKLQkJCWNvbmZpZ0ZvbGRlciA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSKTsKLQkJCXJvb3QuY3JlYXRlTGluayhuZXcgUGF0aCgiLyIgKyBjb25maWdGb2xkZXIpLCAwLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGNvbmZpZ0ZvbGRlck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUik7Ci0JCQlJUGF0aCBjb25maWdGb2xkZXJwYXRoID0gcGpwYXRoLmFwcGVuZChjb25maWdGb2xkZXJOYW1lKTsKLQkJCXNvdXJjZUZvbGRlciA9IHdzLmdldFJvb3QoKS5nZXRGb2xkZXIoY29uZmlnRm9sZGVycGF0aCk7Ci0KLQkJCWlmICghc291cmNlRm9sZGVyLmdldEZpbGUoSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJKS5leGlzdHMoKSkgewotCQkJCVN0cmluZyB2ZXIgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSKTsKLQkJCQlpbnQgblZlciA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KHZlcik7Ci0JCQkJCi0JCQkJSUZpbGUgYUZpbGUgPSBzb3VyY2VGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkpKTsKLQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbShhRmlsZSk7Ci0JCQkJU3RyaW5nIHRlbXBsYXRlID0gblZlciA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV8wX0lECi0JCQkJCQk/IENPTk5FQ1RPUl9YTUxfVEVNUExBVEVfMTAKLQkJCQkJCTogQ09OTkVDVE9SX1hNTF9URU1QTEFURV8xNTsKLQkJCQlJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKGluICE9IG51bGwgJiBvdXQgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJQXJjaGl2ZVV0aWwuY29weShpbiwgb3V0KTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoaW9lKTsKLQkJCQkJfSBmaW5hbGx5ewotCQkJCQkJdHJ5ewotCQkJCQkJCWlmKG51bGwgIT0gb3V0KXsKLQkJCQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJCQkJfSBpZihudWxsICE9IGluKXsKLQkJCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Y2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihpb2UpOwotCQkJCQkJfSAKLQkJCQkJfQotCQkJCQkKLQkJCQkJQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGVkaXQgPSBuZXcgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KHByb2plY3QsIGZhbHNlLCB0cnVlKTsKLQkJCQkJdHJ5ewotCQkJCQkJaWYoIGVkaXQgIT0gbnVsbCApewotCQkJCQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBlZGl0LmdldENvbm5lY3RvcigpOwotCQkJCQkJCWNvbm5lY3Rvci5zZXREaXNwbGF5TmFtZShwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJCQkJZWRpdC5zYXZlSWZOZWNlc3NhcnkobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQl9Ci0JCQkJCX1maW5hbGx5ewotCQkJCQkJaWYoIGVkaXQgIT0gbnVsbCApewotCQkJCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy93aXRob3V0IGEgdGVtcGxhdGUKLQkJCQkJQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmNyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yKHByb2plY3QsIG5WZXIpOwotCQkJCX0gLy8gaWYJCQkJCi0JCQl9Ci0JCQkKLQkJCS8vIGFkZCBzb3VyY2UgZm9sZGVyIG1hcHMKLQkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGNwID0ganByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZSA9IGNwW2ldOwotCQkJCWlmIChjcGUuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQkJcm9vdC5jcmVhdGVMaW5rKGNwZS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKSwgMCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlJVmlydHVhbEZpbGUgdmYgPSBjLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7Ci0JCQlJRmlsZSBtYW5pZmVzdG1mID0gdmYuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJCWlmIChtYW5pZmVzdG1mID09IG51bGwgfHwgIW1hbmlmZXN0bWYuZXhpc3RzKCkpIHsKLQkJCQl0cnkgewotCQkJCQljcmVhdGVNYW5pZmVzdChwcm9qZWN0LCBjLmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCksIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBTZXR1cCB0aGUgY2xhc3NwYXRoLgotCQkJQ2xhc3NwYXRoSGVscGVyLnJlbW92ZUNsYXNzcGF0aEVudHJpZXMocHJvamVjdCwgZnYpOwotCi0JCQlpZiAoIUNsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKHByb2plY3QsIGZ2KSkgewotCQkJCS8vIFRPRE86IFN1cHBvcnQgdGhlIG5vIHJ1bnRpbWUgY2FzZS4KLQkJCQkvLyBDbGFzc3BhdGhIZWxwZXIuYWRkQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgZnYsIDxzb21ldGhpbmc+ICk7Ci0JCQl9Ci0KLQkJCWlmKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlscy5nZXREZWZhdWx0VXNlRUFSTGlicmFyaWVzKCkpewotCQkJCWZpbmFsIElQYXRoIGVhckxpYkNvbnRhaW5lciA9IG5ldyBQYXRoKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIuQ09OVEFJTkVSX0lEKTsKLQkJCQlhZGRUb0NsYXNzcGF0aChqcHJvaiwgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoZWFyTGliQ29udGFpbmVyKSk7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJKChJRGF0YU1vZGVsT3BlcmF0aW9uKSBtb2RlbC5nZXRQcm9wZXJ0eShGYWNldERhdGFNb2RlbFByb3ZpZGVyLk5PVElGSUNBVElPTl9PUEVSQVRJT04pKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJfQotCi0JCWZpbmFsbHkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxNDFkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2Evb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Byb2plY3QvZmFjZXQvQ29ubmVjdG9yRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFRmFjZXRJbnN0YWxsRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZSBleHRlbmRzIEoyRUVGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1JfWE1MX1RFTVBMQVRFXzEwCQk9ICJyYXJ0cDEwLnhtbCI7CQkJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX1hNTF9URU1QTEFURV8xNQkJPSAicmFydHAxNS54bWwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCUlEYXRhTW9kZWwgbW9kZWwgPSAoSURhdGFNb2RlbCkgY29uZmlnOwotCi0JCQkvLyBBc3NvY2lhdGUgd2l0aCBhbiBFQVIsIGlmIG5lY2Vzc2FyeS4KLQotCQkJZmluYWwgU3RyaW5nIGVhclByb2plY3ROYW1lID0gKFN0cmluZykgbW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUpOwotCQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUikpIHsKLQkJCQlpZiAoZWFyUHJvamVjdE5hbWUgIT0gbnVsbCAmJiAhZWFyUHJvamVjdE5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCQkJU3RyaW5nIHZlciA9IGZ2LmdldFZlcnNpb25TdHJpbmcoKTsKLQkJCQkJU3RyaW5nIGoyZWVWZXJzaW9uVGV4dCA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nCi0JCQkJCShKMkVFVmVyc2lvblV0aWwuY29udmVydENvbm5lY3RvclZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyKSk7Ci0JCQkJCQotCQkJCQlmaW5hbCBTdHJpbmcgbW9kdWxlVVJJID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9VUkkpOwotCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjCi0gICAgICAgICAgICAgICAgICAgICAgICA9IChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSkgbW9kZWwuZ2V0UHJvcGVydHkoIEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkgKTsKLQkJCQkJCi0JCQkJCWluc3RhbGxBbmRBZGRNb2R1bGV0b0VBUiggajJlZVZlcnNpb25UZXh0LAotCQkJCQkJCQllYXJQcm9qZWN0TmFtZSwKLQkJCQkJCQkJZnBqd2MuZ2V0UHJpbWFyeVJ1bnRpbWUoKSwKLQkJCQkJCQkJcHJvamVjdCwKLQkJCQkJCQkJbW9kdWxlVVJJLAotCQkJCQkJCQltb25pdG9yICk7Ci0KLQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9Ci0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9Db25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NWFiMTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0Nvbm5lY3RvckZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5KYXZhRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVByZWZlcmVuY2VzLktleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0gICAgICAgIENvbGxlY3Rpb248SVByb2plY3RGYWNldD4gcmVxdWlyZWRGYWNldHMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0RmFjZXQ+KCk7Ci0gICAgICAgIHJlcXVpcmVkRmFjZXRzLmFkZChKYXZhRmFjZXRVdGlscy5KQVZBX0ZBQ0VUKTsKLSAgICAgICAgcmVxdWlyZWRGYWNldHMuYWRkKElKMkVFRmFjZXRDb25zdGFudHMuSkNBX0ZBQ0VUKTsKLSAgICAgICAgc2V0UHJvcGVydHkoUkVRVUlSRURfRkFDRVRTX0NPTExFQ1RJT04sIHJlcXVpcmVkRmFjZXRzKTsKLQkJCi0JCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgZ2V0UHJvcGVydHkoRkFDRVRfRE1fTUFQKTsKLQkJSURhdGFNb2RlbCBqYXZhRmFjZXQgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoSmF2YUZhY2V0VXRpbHMuSkFWQV9GQUNFVC5nZXRJZCgpKTsKLQkJSURhdGFNb2RlbCBqY2FGYWNldCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChJSjJFRUZhY2V0Q29uc3RhbnRzLkpDQV9GQUNFVC5nZXRJZCgpKTsKLQkJU3RyaW5nIGpjYVJvb3QgPSBqY2FGYWNldC5nZXRTdHJpbmdQcm9wZXJ0eShJQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSKTsKLQkJamF2YUZhY2V0LnNldFByb3BlcnR5KElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSX05BTUUsIGpjYVJvb3QpOwotCQlqYXZhRmFjZXQuc2V0UHJvcGVydHkoSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FLCAKLQkJCQlKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoS2V5cy5KQ0FfT1VUUFVUX0ZPTERFUikgKTsKLQkJCi0JCWpjYUZhY2V0LmFkZExpc3RlbmVyKG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlpZiAoaXNQcm9wZXJ0eVNldChFQVJfUFJPSkVDVF9OQU1FKSkKLQkJCQkJCXNldFByb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJCQllbHNlCi0JCQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShFQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCQl9ZWxzZSBpZiAoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQlzZXRQcm9wZXJ0eShBRERfVE9fRUFSLCBldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwkKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlpZiggcHJvcGVydHlOYW1lLmVxdWFscyggTU9EVUxFX1VSSSApKXsKLQkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgZ2V0UHJvcGVydHkoRkFDRVRfRE1fTUFQKTsKLQkJCUlEYXRhTW9kZWwgcmFyRmFjZXQgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoIElKMkVFRmFjZXRDb25zdGFudHMuSkNBICk7CQotCQkJcmFyRmFjZXQuc2V0UHJvcGVydHkoIElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5NT0RVTEVfVVJJLCBwcm9wZXJ0eVZhbHVlICk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9JQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0lDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMDE0MDcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L0lDb25uZWN0b3JGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcwotIGV4dGVuZHMgSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzewotCi0JLyoqCi0JICogVGhpcyBmaWVsZCBzaG91bGQgbm90IGJlIHVzZWQuICBJdCBpcyBub3QgcGFydCBvZiB0aGUgQVBJIGFuZCBtYXkgYmUgbW9kaWZpZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzIF9wcm92aWRlcl9jbGFzcyA9IENvbm5lY3RvckZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuY2xhc3M7IAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L3JhcnRwMTAueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L3JhcnRwMTAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDViYzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9yYXJ0cDEwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgY29ubmVjdG9yIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIENvbm5lY3RvciAxLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvY29ubmVjdG9yXzFfMC5kdGQiPgotPGNvbm5lY3Rvcj4KLQk8ZGlzcGxheS1uYW1lPjwvZGlzcGxheS1uYW1lPgotCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotIAk8dmVuZG9yLW5hbWU+PC92ZW5kb3ItbmFtZT4KLSAgCTxzcGVjLXZlcnNpb24+PC9zcGVjLXZlcnNpb24+Ci0gIAk8ZWlzLXR5cGU+PC9laXMtdHlwZT4KLSAgCTx2ZXJzaW9uPjwvdmVyc2lvbj4KLSAgCTxsaWNlbnNlPgotICAJCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAgIAotICAgIAk8bGljZW5zZS1yZXF1aXJlZD5mYWxzZTwvbGljZW5zZS1yZXF1aXJlZD4gICAKLSAgICA8L2xpY2Vuc2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCTxyZXNvdXJjZWFkYXB0ZXI+Ci0gIAkJPG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz48L21hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz4KLSAgCQk8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPjwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotICAgIAk8Y29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz48L2Nvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Ci0gICAgCTxjb25uZWN0aW9uLWludGVyZmFjZT48L2Nvbm5lY3Rpb24taW50ZXJmYWNlPgotICAgIAk8Y29ubmVjdGlvbi1pbXBsLWNsYXNzPjwvY29ubmVjdGlvbi1pbXBsLWNsYXNzPgotICAgIAk8dHJhbnNhY3Rpb24tc3VwcG9ydD48L3RyYW5zYWN0aW9uLXN1cHBvcnQ+Ci0gIAkJPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLSAgICAgIAkJPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPjwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAJCTxjb25maWctcHJvcGVydHktdHlwZT48L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgCQk8Y29uZmlnLXByb3BlcnR5LXZhbHVlPjwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgIAkgPC9jb25maWctcHJvcGVydHk+Ci0gICAgCTxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAJIAk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLSAgICAgIAkgCTxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT48L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAJIAk8Y3JlZGVudGlhbC1pbnRlcmZhY2U+PC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAJPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgCTxyZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+ZmFsc2U8L3JlYXV0aGVudGljYXRpb24tc3VwcG9ydD4KLSAgICAJPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLSAgICAJCTxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAJCTwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgIAk8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gIAk8L3Jlc291cmNlYWRhcHRlcj4KLTwvY29ubmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L3JhcnRwMTUueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9wcm9qZWN0L2ZhY2V0L3JhcnRwMTUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjk1NjFkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYS9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvcHJvamVjdC9mYWNldC9yYXJ0cDE1LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29ubmVjdG9yIGlkPSJDb25uZWN0b3JfSUQiIHZlcnNpb249IjEuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2Nvbm5lY3Rvcl8xXzUueHNkIj4gCi0JPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+Ci0JPGRpc3BsYXktbmFtZT48L2Rpc3BsYXktbmFtZT4KLSAJPHZlbmRvci1uYW1lPjwvdmVuZG9yLW5hbWU+Ci0gIAk8ZWlzLXR5cGU+PC9laXMtdHlwZT4KLSAgCTxyZXNvdXJjZWFkYXB0ZXItdmVyc2lvbj48L3Jlc291cmNlYWRhcHRlci12ZXJzaW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgCTxyZXNvdXJjZWFkYXB0ZXI+Ci0gIAk8L3Jlc291cmNlYWRhcHRlcj4KLTwvY29ubmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGZmM2Y1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL2FyY2hpdmUvb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5BcHBDbGllbnRBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5KMkVFQXJ0aWZhY3RFeHBvcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uIGV4dGVuZHMgSjJFRUFydGlmYWN0RXhwb3J0T3BlcmF0aW9uIHsKLQotCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnRPcGVyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleHBvcnQoKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIEVYUE9SVF9XT1JLKTsKLQkJdHJ5IHsKLQkJCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGNhZiA9ICgoQ29tbW9uYXJjaGl2ZVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vbmFyY2hpdmVQYWNrYWdlLmVOU19VUkkpKS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCQkJQ29ubmVjdG9yQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCBscyA9IG5ldyBDb25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKGdldENvbXBvbmVudCgpKTsKLQkJCWxzLnNldEV4cG9ydFNvdXJjZShpc0V4cG9ydFNvdXJjZSgpKTsKLQkJCXNldE1vZHVsZUZpbGUoY2FmLm9wZW5SQVJGaWxlKGxzLCBnZXREZXN0aW5hdGlvblBhdGgoKS50b09TU3RyaW5nKCkpKTsKLQkJCWxzLnNldFByb2dyZXNzTW9uaXRvcihzdWJNb25pdG9yKTsKLQkJCWdldE1vZHVsZUZpbGUoKS5zYXZlQXNOb1Jlb3BlbihnZXREZXN0aW5hdGlvblBhdGgoKS50b09TU3RyaW5nKCkpOwotCQl9IGNhdGNoIChTYXZlRmFpbHVyZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQXBwQ2xpZW50QXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlci5BUkNISVZFX09QRVJBVElPTl9PcGVuaW5nQXJjaGl2ZSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWJNb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYXJjaGl2ZVN0cmluZygpIHsKLQkJLy9UT0RPIGZpbGwgaW4gc3RyaW5nCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL2FyY2hpdmUvb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9hcmNoaXZlL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjIyMzdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL2FyY2hpdmUvb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLmFyY2hpdmUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5Db21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLm1vZHVsZWNvcmUudXRpbC5Db25uZWN0b3JBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb250YWluZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGV4dGVuZHMgQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCB7Ci0KLQlwcml2YXRlIGludCBkb3RKYXZhTGVuZ3RoID0gQXJjaGl2ZVV0aWwuRE9UX0pBVkEubGVuZ3RoKCk7Ci0JcHJpdmF0ZSBMaXN0IGFscmVhZHlJbmRleGVkID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTWFwIGNsYXNzZXNNYXA7Ci0JcHJpdmF0ZSBJRmlsZSBrbm93bkREOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBrbm93bkxpYkV4dGVuc2lvbnMgPSB7Ii5qYXIiLCAvLyROT04tTkxTLTEkCi0JCQkJIi56aXAiLCAvLyROT04tTkxTLTEkCi0JCQkJIi5zbyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiLm8iLCAvLyROT04tTkxTLTEkCi0JCQkJIi5zbCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiLmRsbCIsIC8vJE5PTi1OTFMtMSQKLQl9OwotCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewotCQl0aGlzKHZDb21wb25lbnQsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgQ29ubmVjdG9yQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50LCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB7Ci0JCXN1cGVyKHZDb21wb25lbnQsIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsJCQotCQlrbm93bkREID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkpLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmlsZXMoKSB7Ci0JCWFkZE5lc3RlZEpBUnNGcm9tU291cmNlUm9vdHMoKTsKLQkJYWdncmVnYXRlU291cmNlRmlsZXMoKTsKLQkJcmV0dXJuIGZpbGVzSG9sZGVyLmdldEZpbGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5lc3RlZEpBUnNGcm9tU291cmNlUm9vdHMoKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gc291cmNlUm9vdHMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRTb3VyY2VDb250YWluZXJzKHZDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VSb290cy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBhRmlsZTsKLQkJCXRyeSB7Ci0JCQkJYUZpbGUgPSBnZXROZXN0ZWRKYXIoc291cmNlUm9vdHNbaV0pOwotCQkJCWlmIChudWxsICE9IGFGaWxlKSB7Ci0JCQkJCWZpbGVzSG9sZGVyLmFkZEZpbGUoYUZpbGUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQotCXByaXZhdGUgRmlsZSBnZXROZXN0ZWRKYXIoSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlUm9vdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIG91dHB1dFBhdGggPSBzb3VyY2VSb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCkuZ2V0T3V0cHV0TG9jYXRpb24oKTsKLQkJaWYgKG91dHB1dFBhdGggPT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHZDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJdHJ5IHsKLQkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJCW91dHB1dFBhdGggPSBqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCWlmIChvdXRwdXRQYXRoID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCUlGb2xkZXIgamF2YU91dHB1dEZvbGRlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0Rm9sZGVyKG91dHB1dFBhdGgpOwotCQlpbmRleENsYXNzZXNGb3JPdXRwdXRGb2xkZXIoamF2YU91dHB1dEZvbGRlcik7Ci0JCUlDb250YWluZXIgc291cmNlQ29udGFpbmVyID0gKElDb250YWluZXIpIHNvdXJjZVJvb3QuZ2V0UmVzb3VyY2UoKTsKLQotCQlpbnQgc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50ID0gc291cmNlQ29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKTsKLQkJYm9vbGVhbiBpc01vZHVsZVJvb3QgPSBrbm93bkRELmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpLnN0YXJ0c1dpdGgoc291cmNlQ29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJU2V0IGlGaWxlc1NldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWJvb2xlYW4gZm91bmRKYXZhID0gZ2F0aGVyRmlsZXNGb3JKQVIoaUZpbGVzU2V0LCBzb3VyY2VDb250YWluZXIsIGlzTW9kdWxlUm9vdCwgZmFsc2UsIHNvdXJjZUNvbnRhaW5lclNlZ21lbnRDb3VudCk7Ci0JCWlmICghaXNNb2R1bGVSb290IHx8IGZvdW5kSmF2YSkgewotCQkJTGlzdCBpRmlsZXNMaXN0ID0gQ29sbGVjdGlvbnMubGlzdChDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihpRmlsZXNTZXQpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaUZpbGVzTGlzdC5zaXplKCk7IGkrKykgewotCQkJCWZpbGVzSG9sZGVyLnJlbW92ZUlGaWxlKChJRmlsZSkgaUZpbGVzTGlzdC5nZXQoaSkpOwotCQkJfQotCQkJRmlsZSBuZXN0ZWRBcmNoaXZlID0gY3JlYXRlTmVzdGVkQXJjaGl2ZShpRmlsZXNMaXN0LCBzb3VyY2VDb250YWluZXIsIGphdmFPdXRwdXRGb2xkZXIpOwotCQkJcmV0dXJuIG5lc3RlZEFyY2hpdmU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdhdGhlckZpbGVzRm9ySkFSKENvbGxlY3Rpb24gaUZpbGVzLCBJQ29udGFpbmVyIGN1cnJlbnQsIGJvb2xlYW4gaXNNb2R1bGVSb290LCBib29sZWFuIGZvdW5kSmF2YSwgaW50IHNvdXJjZUNvbnRhaW5lclNlZ21lbnRDb3VudCkgewotCQlJUmVzb3VyY2VbXSBtZW1iZXJzOwotCQl0cnkgewotCQkJbWVtYmVycyA9IGN1cnJlbnQubWVtYmVycygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNvcmUpIHsKLQkJCXRocm93IG5ldyBBcmNoaXZlUnVudGltZUV4Y2VwdGlvbihjb3JlKTsKLQkJfQotCQkKLQkJSUNvbnRhaW5lciBkZEZvbGRlciA9IHZDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcihKMkVFQ29uc3RhbnRzLk1FVEFfSU5GKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlSZXNvdXJjZSByZXMgPSBtZW1iZXJzW2ldOwotCQkJaWYgKHJlcy5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkJCWlmICghZGRGb2xkZXIuZXF1YWxzKHJlcykpIHsvL2lmIGl0J3Mgbm90IHRoZSBkZCBmb2xkZXIKLQkJCQkJZm91bmRKYXZhID0gZ2F0aGVyRmlsZXNGb3JKQVIoaUZpbGVzLCAoSUZvbGRlcikgcmVzLCBpc01vZHVsZVJvb3QsIGZvdW5kSmF2YSwgc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50KSB8fCBmb3VuZEphdmE7Ci0JCQkJfQotCQkJfSBlbHNlIHsvLyBpdCBtdXN0IGJlIGEgZmlsZQotCQkJCUlGaWxlIHNyY0ZpbGUgPSAoSUZpbGUpIHJlczsKLQkJCQlpZiAoYmVsb25nc0luTmVzdGVkSkFSKHNyY0ZpbGUsIGlzTW9kdWxlUm9vdCkpIHsKLQkJCQkJaWYgKGlzSmF2YShzcmNGaWxlKSkgewotCQkJCQkJaWYgKGV4cG9ydFNvdXJjZSkgewotCQkJCQkJCWlGaWxlcy5hZGQoc3JjRmlsZSk7IC8vZG9uJ3QgbmVlZCB0byBjaGVjayBkdXBsaWNhdGVzIGhlcmUKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBzcmNGaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKHNvdXJjZUNvbnRhaW5lclNlZ21lbnRDb3VudCkudG9TdHJpbmcoKTsKLQkJCQkJCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmxlbmd0aCgpIC0gZG90SmF2YUxlbmd0aCk7Ci0JCQkJCQlMaXN0IGNsYXNzZXMgPSByZXRyaWV2ZUNsYXNzZXMoY2xhc3NOYW1lKTsKLQkJCQkJCWlmIChudWxsICE9IGNsYXNzZXMpIHsKLQkJCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGNsYXNzZXMuaXRlcmF0b3IoKTsKLQkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCUlGaWxlIGNsYXp6ID0gKElGaWxlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmKCFpRmlsZXMuY29udGFpbnMoY2xhenopKXsKLQkJCQkJCQkJCS8vLmNsYXNzIG5lZWQgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKLQkJCQkJCQkJaUZpbGVzLmFkZChjbGF6eik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYoIWlGaWxlcy5jb250YWlucyhzcmNGaWxlKSl7Ci0JCQkJCQkJLy9pZiBpdCdzIG5vdCBzcmMsIHRoZW4gaXQgY291bGQgYmUgLmNsYXNzIGFuZCBuZWVkIHRvIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCQkJCQlpRmlsZXMuYWRkKHNyY0ZpbGUpOwotCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGlzTW9kdWxlUm9vdCkKLQkJCQkJCWZvdW5kSmF2YSA9IGZvdW5kSmF2YSB8fCBpc0phdmEoc3JjRmlsZSkgfHwgaXNDbGFzcyhzcmNGaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZvdW5kSmF2YTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgY3JlYXRlTmVzdGVkQXJjaGl2ZShMaXN0IGZpbGVzLCBJQ29udGFpbmVyIHNvdXJjZUNvbnRhaW5lciwgSUZvbGRlciBqYXZhT3V0cHV0Rm9sZGVyKSB7Ci0JCUNvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwgbG9hZGVyID0gbmV3IENvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwoZmlsZXMsIHNvdXJjZUNvbnRhaW5lciwgamF2YU91dHB1dEZvbGRlcik7Ci0JCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSAoKEFyY2hpdmUpIGdldENvbnRhaW5lcigpKS5nZXRPcHRpb25zKCkuY2xvbmVXaXRoKGxvYWRlcik7Ci0JCVN0cmluZyB1cmkgPSBjb21wdXRlVW5pcXVlQXJjaGl2ZVVSSShzb3VyY2VDb250YWluZXIpOwotCQl0cnkgewotCQkJcmV0dXJuIGdldEFyY2hpdmVGYWN0b3J5KCkucHJpbU9wZW5BcmNoaXZlKG9wdGlvbnMsIHVyaSk7Ci0JCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZVVuaXF1ZUFyY2hpdmVVUkkoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWludCBpbmNyZW1lbnQgPSAwOwotCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbnVsbDsKLQkJZG8gewotCQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKG5hbWUubGVuZ3RoKCkgKyA1KTsKLQkJCXNiLmFwcGVuZCgnXycpOwotCQkJc2IuYXBwZW5kKG5hbWUpOwotCQkJaWYgKGluY3JlbWVudCA+IDApCi0JCQkJc2IuYXBwZW5kKGluY3JlbWVudCk7Ci0JCQlzYi5hcHBlbmQoIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5jcmVtZW50Kys7Ci0JCX0gd2hpbGUgKGZpbGVzSG9sZGVyLmNvbnRhaW5zKHNiLnRvU3RyaW5nKCkpKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJlbG9uZ3NJbk5lc3RlZEpBUihJRmlsZSBpRmlsZSwgYm9vbGVhbiBpc01vZHVsZVJvb3QpIHsKLQkJaWYgKGlzTW9kdWxlUm9vdCAmJiBpc0RlcGxveW1lbnREZXNjcmlwdG9yKGlGaWxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga25vd25MaWJFeHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaGFzRXh0ZW5zaW9uKGlGaWxlLCBrbm93bkxpYkV4dGVuc2lvbnNbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpIHsKLQkJaWYoYXJ0aWZhY3RFZGl0ID09IG51bGwpewotCQkJYXJ0aWZhY3RFZGl0ID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQodkNvbXBvbmVudCk7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlKElWaXJ0dWFsQ29udGFpbmVyIHZDb250YWluZXIpIHsKLQkJYm9vbGVhbiBpc0RERm9sZGVyID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0Rm9sZGVyKEoyRUVDb25zdGFudHMuTUVUQV9JTkYpLmVxdWFscyh2Q29udGFpbmVyKTsKLQkJcmV0dXJuIGlzRERGb2xkZXIgfHwgIWluSmF2YVNyYyh2Q29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiAhaGFzRXh0ZW5zaW9uKHVyaSwgQXJjaGl2ZVV0aWwuRE9UX0NMQVNTKSAmJiAhaGFzRXh0ZW5zaW9uKHVyaSwgQXJjaGl2ZVV0aWwuRE9UX0pBVkEpOwotCX0KLQotCS8qKgotCSAqIEZpbmQgYWxsIHRoZSAuY2xhc3MgZmlsZXMgYW5kIGluZGV4IHRoZW0gc28gaW5uZXIgY2xhc3NlcyBjYW4gYmUgbG9jYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5kZXhDbGFzc2VzRm9yT3V0cHV0Rm9sZGVyKElGb2xkZXIgamF2YU91dHB1dEZvbGRlcikgewotCQlpZiAobnVsbCA9PSBqYXZhT3V0cHV0Rm9sZGVyIHx8IGFscmVhZHlJbmRleGVkLmNvbnRhaW5zKGphdmFPdXRwdXRGb2xkZXIpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYWxyZWFkeUluZGV4ZWQuYWRkKGphdmFPdXRwdXRGb2xkZXIpOwotCQlpbnQgc2VnbWVudENvdW50ID0gamF2YU91dHB1dEZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCk7Ci0JCWluZGV4Q2xhc3NlcyhqYXZhT3V0cHV0Rm9sZGVyLCBzZWdtZW50Q291bnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbmRleENsYXNzZXMoSVJlc291cmNlIHJlc291cmNlLCBpbnQgamF2YU91dHB1dFNlZ21lbnRDb3VudCkgewotCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewotCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJaW5kZXhDbGFzcygoSUZpbGUpIHJlc291cmNlLCBqYXZhT3V0cHV0U2VnbWVudENvdW50KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJdHJ5IHsKLQkJCQkJSVJlc291cmNlW10gbWVtYmVycyA9ICgoSUZvbGRlcikgcmVzb3VyY2UpLm1lbWJlcnMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpbmRleENsYXNzZXMobWVtYmVyc1tpXSwgamF2YU91dHB1dFNlZ21lbnRDb3VudCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbmRleENsYXNzKElGaWxlIGlGaWxlLCBpbnQgamF2YU91dHB1dFNlZ21lbnRDb3VudCkgewotCQlpZiAoIWlzQ2xhc3MoaUZpbGUpKQotCQkJcmV0dXJuOwotCQlpZiAoY2xhc3Nlc01hcCA9PSBudWxsKQotCQkJY2xhc3Nlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZyBuYW1lID0gaUZpbGUuZ2V0TmFtZSgpOwotCQlJUGF0aCByZWxQYXRoID0gaUZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoamF2YU91dHB1dFNlZ21lbnRDb3VudCk7Ci0JCVN0cmluZyBrZXkgPSByZWxQYXRoLnRvU3RyaW5nKCk7Ci0JCWlmIChuYW1lLmluZGV4T2YoJyQnKSAhPSAtMSkgewotCQkJa2V5ID0ga2V5LnN1YnN0cmluZygwLCBrZXkuaW5kZXhPZignJCcpKTsKLQkJfSBlbHNlIHsKLQkJCWtleSA9IGtleS5zdWJzdHJpbmcoMCwga2V5LmluZGV4T2YoJy4nKSk7Ci0JCX0KLQkJTGlzdCBpbm5lcnMgPSAoTGlzdCkgY2xhc3Nlc01hcC5nZXQoa2V5KTsKLQkJaWYgKGlubmVycyA9PSBudWxsKSB7Ci0JCQlpbm5lcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJY2xhc3Nlc01hcC5wdXQoa2V5LCBpbm5lcnMpOwotCQl9Ci0JCWlubmVycy5hZGQoaUZpbGUpOwotCX0KLQotCXB1YmxpYyBMaXN0IHJldHJpZXZlQ2xhc3NlcyhTdHJpbmcga2V5KSB7Ci0JCWlmIChjbGFzc2VzTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChMaXN0KSBjbGFzc2VzTWFwLmdldChrZXkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phdmEoSUZpbGUgaUZpbGUpIHsKLQkJcmV0dXJuIGhhc0V4dGVuc2lvbihpRmlsZSwgQXJjaGl2ZVV0aWwuRE9UX0pBVkEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NsYXNzKElGaWxlIGlGaWxlKSB7Ci0JCXJldHVybiBoYXNFeHRlbnNpb24oaUZpbGUsIEFyY2hpdmVVdGlsLkRPVF9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNFeHRlbnNpb24oSUZpbGUgaUZpbGUsIFN0cmluZyBleHQpIHsKLQkJU3RyaW5nIG5hbWUgPSBpRmlsZS5nZXROYW1lKCk7Ci0JCXJldHVybiBoYXNFeHRlbnNpb24obmFtZSwgZXh0KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc0V4dGVuc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGV4dCkgewotCQlpbnQgb2Zmc2V0ID0gZXh0Lmxlbmd0aCgpOwotCQlyZXR1cm4gbmFtZS5yZWdpb25NYXRjaGVzKHRydWUsIG5hbWUubGVuZ3RoKCkgLSBvZmZzZXQsIGV4dCwgMCwgb2Zmc2V0KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEZXBsb3ltZW50RGVzY3JpcHRvcihJRmlsZSBpRmlsZSkgewotCQlyZXR1cm4ga25vd25ERC5lcXVhbHMoaUZpbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL2FyY2hpdmUvb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnROZXN0ZWRKQVJMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9hcmNoaXZlL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50TmVzdGVkSkFSTG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQ0NTBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL2FyY2hpdmUvb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnROZXN0ZWRKQVJMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5hcmNoaXZlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uQXJjaGl2ZVJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuTG9hZFN0cmF0ZWd5SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yQ29tcG9uZW50TmVzdGVkSkFSTG9hZFN0cmF0ZWd5SW1wbCBleHRlbmRzIExvYWRTdHJhdGVneUltcGwgewotCi0JcHJpdmF0ZSBMaXN0IGZpbGVzOwotCXByaXZhdGUgaW50IHNvdXJjZVNlZ21lbnRDb3VudDsKLQlwcml2YXRlIGludCBvdXRwdXRTZWdtZW50Q291bnQ7Ci0JcHJpdmF0ZSBNYXAgdXJpc1RvSUZpbGVzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwuCi0JICovCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkxvYWRTdHJhdGVneUltcGwoTGlzdCBmaWxlcywgSUNvbnRhaW5lciBzb3VyY2VDb250YWluZXIsIElGb2xkZXIgamF2YU91dHB1dEZvbGRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmZpbGVzID0gZmlsZXM7Ci0JCXNvdXJjZVNlZ21lbnRDb3VudCA9IHNvdXJjZUNvbnRhaW5lci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCk7Ci0JCW91dHB1dFNlZ21lbnRDb3VudCA9IGphdmFPdXRwdXRGb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnNlZ21lbnRDb3VudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwjcHJpbUNvbnRhaW5zKFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltQ29udGFpbnMoU3RyaW5nIHVyaSkgewotCQkvLyBTaG91bGQgb25seSBiZSB1c2VkIGJ5IGRpc2NyaW1pbmF0b3JzLCBhbmQgd2UgZG9uJ3QgZGlzY3JpbWluYXRlIHRoZXNlIGFyY2hpdmVzCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5pbXBsLkxvYWRTdHJhdGVneUltcGwjZ2V0RmlsZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpbGVzKCkgewotCQl1cmlzVG9JRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IHNpemUgPSBmaWxlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRmlsZSBpRmlsZSA9IChJRmlsZSkgZmlsZXMuZ2V0KGkpOwotCQkJSVBhdGggcmVsUGF0aDsKLQkJCWlmKENvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuaXNDbGFzcyhpRmlsZSkpewotCQkJCXJlbFBhdGggPSBnZXRSZWxhdGl2ZVBhdGgoaUZpbGUsIG91dHB1dFNlZ21lbnRDb3VudCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlbFBhdGggPSBnZXRSZWxhdGl2ZVBhdGgoaUZpbGUsIHNvdXJjZVNlZ21lbnRDb3VudCk7Ci0JCQl9Ci0JCQlhZGRGaWxlKGlGaWxlLCByZWxQYXRoLCByZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmlsZShJRmlsZSBpRmlsZSwgSVBhdGggcmVsUGF0aCwgTGlzdCByZXN1bHQpIHsKLQkJRmlsZSBjRmlsZSA9IGNyZWF0ZUZpbGUoaUZpbGUsIHJlbFBhdGgpOwotCQlyZXN1bHQuYWRkKGNGaWxlKTsKLQkJdXJpc1RvSUZpbGVzLnB1dChjRmlsZS5nZXRVUkkoKSwgaUZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBsb25nIGdldExhc3RNb2RpZmllZChJUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCXJldHVybiBhUmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgY3JlYXRlRmlsZShJRmlsZSBpRmlsZSwgSVBhdGggcmVsUGF0aCkgewotCQlGaWxlIGNGaWxlID0gY3JlYXRlRmlsZShyZWxQYXRoLnRvU3RyaW5nKCkpOwotCQljRmlsZS5zZXRMYXN0TW9kaWZpZWQoZ2V0TGFzdE1vZGlmaWVkKGlGaWxlKSk7Ci0JCXJldHVybiBjRmlsZTsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldFJlbGF0aXZlUGF0aChJRmlsZSBmaWxlLCBpbnQgcGFyZW50U2VnbWVudENvdW50KSB7Ci0JCXJldHVybiBmaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKHBhcmVudFNlZ21lbnRDb3VudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLkxvYWRTdHJhdGVneSNnZXRJbnB1dFN0cmVhbShTdHJpbmcpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKG51bGwgPT0gdXJpc1RvSUZpbGVzKSB7Ci0JCQlnZXRGaWxlcygpOwotCQl9Ci0JCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHVyaXNUb0lGaWxlcy5nZXQodXJpKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZmlsZS5nZXRDb250ZW50cygpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjb3JlKSB7Ci0JCQkJdGhyb3cgbmV3IEFyY2hpdmVSdW50aW1lRXhjZXB0aW9uKHVyaSwgY29yZSk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbih1cmkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0FjdGl2YXRpb25TcGVjSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQWN0aXZhdGlvblNwZWNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU4ZDQwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQWN0aXZhdGlvblNwZWNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFjdGl2YXRpb25TcGVjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLkFjdGl2YXRpb25TcGVjfW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZhdGlvblNwZWNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQWN0aXZhdGlvblNwZWNDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWN0aXZhdGlvbiBTcGVjIENsYXNzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFjdGl2YXRpb25TcGVjQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0FjdGl2YXRpb25TcGVjX2FjdGl2YXRpb25TcGVjQ2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZhdGlvblNwZWNfYWN0aXZhdGlvblNwZWNDbGFzc19mZWF0dXJlIiwgIl9VSV9BY3RpdmF0aW9uU3BlY190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2YXRpb25TcGVjX0FjdGl2YXRpb25TcGVjQ2xhc3MoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2YXRpb25TcGVjX1JlcXVpcmVkQ29uZmlnUHJvcGVydGllcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFjdGl2YXRpb25TcGVjLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQWN0aXZhdGlvblNwZWMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQWN0aXZhdGlvblNwZWMpIG9iamVjdCkuZ2V0QWN0aXZhdGlvblNwZWNDbGFzcygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9BY3RpdmF0aW9uU3BlY190eXBlIDogCi0JCQkJCUpDQVJlc291cmNlSGFuZGxlci5fVUlfQWN0aXZhdGlvblNwZWNfdHlwZSArICIgIiArIGxhYmVsOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3RpdmF0aW9uU3BlYy5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BQ1RJVkFUSU9OX1NQRUNfX0FDVElWQVRJT05fU1BFQ19DTEFTUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQUNUSVZBVElPTl9TUEVDX19SRVFVSVJFRF9DT05GSUdfUFJPUEVSVElFUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3RpdmF0aW9uU3BlY19SZXF1aXJlZENvbmZpZ1Byb3BlcnRpZXMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJLy9yZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBKY2FQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0FkbWluT2JqZWN0SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQWRtaW5PYmplY3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiMGNhZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQWRtaW5PYmplY3RJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLkFkbWluT2JqZWN0fW9iamVjdC4gPCEtLQotICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBZG1pbk9iamVjdEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRtaW5PYmplY3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQWRtaW5PYmplY3RJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFkbWluT2JqZWN0Q2xhc3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkbWluIE9iamVjdCBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWRtaW5PYmplY3RJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0FkbWluT2JqZWN0X2FkbWluT2JqZWN0SW50ZXJmYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FkbWluT2JqZWN0X2FkbWluT2JqZWN0SW50ZXJmYWNlX2ZlYXR1cmUiLCAiX1VJX0FkbWluT2JqZWN0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWRtaW5PYmplY3RfQWRtaW5PYmplY3RJbnRlcmZhY2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkbWluIE9iamVjdCBDbGFzcyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZG1pbk9iamVjdENsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9BZG1pbk9iamVjdF9hZG1pbk9iamVjdENsYXNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FkbWluT2JqZWN0X2FkbWluT2JqZWN0Q2xhc3NfZmVhdHVyZSIsICJfVUlfQWRtaW5PYmplY3RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBZG1pbk9iamVjdF9BZG1pbk9iamVjdENsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBZG1pbk9iamVjdF9Db25maWdQcm9wZXJ0aWVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQWRtaW5PYmplY3QuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9BZG1pbk9iamVjdCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChBZG1pbk9iamVjdCkgb2JqZWN0KS5nZXRBZG1pbk9iamVjdEludGVyZmFjZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9BZG1pbk9iamVjdF90eXBlIDogCi0JCQkJCUpDQVJlc291cmNlSGFuZGxlci5fVUlfQWRtaW5PYmplY3RfdHlwZSArICIgIiArIGxhYmVsOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBZG1pbk9iamVjdC5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0FETUlOX09CSkVDVF9JTlRFUkZBQ0UgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkFETUlOX09CSkVDVF9fQURNSU5fT0JKRUNUX0NMQVNTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5BRE1JTl9PQkpFQ1RfX0NPTkZJR19QUk9QRVJUSUVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFkbWluT2JqZWN0X0NvbmZpZ1Byb3BlcnRpZXMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uZmlnUHJvcGVydHkoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJLy9yZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBKY2FQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4NjMxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciB0aGUgQXV0aGVudGljYXRpb25NZWNoYW5pc20gZm9yIGNvbm5lY3RvciBwcm9lamN0cy4KLSAqLwotcHVibGljIGNsYXNzIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSXRlbVByb3ZpZGVyIGV4dGVuZHMgSmNhSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSAtIEFkYXB0ZXIgZmFjdG9yeSB0byBjcmVhdGUuCi0JICovCi0JcHVibGljIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ly8gQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENyZWRlbnRpYWxJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEN1c3RvbUF1dGhNZWNoVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fYXV0aGVudGljYXRpb25NZWNoYW5pc21fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fYXV0aGVudGljYXRpb25NZWNoYW5pc21fZmVhdHVyZSIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXV0aGVudGljYXRpb24gTWVjaGFuaXNtIFR5cGUgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9hdXRoZW50aWNhdGlvbk1lY2hhbmlzbVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlX2ZlYXR1cmUiLCAiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDcmVkZW50aWFsIEludGVyZmFjZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDcmVkZW50aWFsSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9jcmVkZW50aWFsSW50ZXJmYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX2NyZWRlbnRpYWxJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDdXN0b20gQXV0aCBNZWNoIFR5cGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ3VzdG9tQXV0aE1lY2hUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9jdXN0b21BdXRoTWVjaFR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXV0aGVudGljYXRpb25NZWNoYW5pc21fY3VzdG9tQXV0aE1lY2hUeXBlX2ZlYXR1cmUiLCAiX1VJX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQ3VzdG9tQXV0aE1lY2hUeXBlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCS8qCi0JICogcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7IGlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JICogc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCSAqIAotCSAqIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIGZfYXV0aGVudGljYXRpb25NZWNoYW5pc20gPSAoKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKW9iamVjdCk7Ci0JICogSmNhUGFja2FnZSBwa2cgPSBKY2FQYWNrYWdlLmVJTlNUQU5DRTs7IC8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkRlc2NyaXB0aW9uIiwgIlRoZQotCSAqIGRlc2NyaXB0aW9uIHByb3BlcnR5IG9mIHRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20iLAotCSAqIHBrZy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbigpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgYXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlCi0JICogZmVhdHVyZS4gLy8gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiQXV0aGVudGljYXRpb24KLQkgKiBNZWNoYW5pc20gVHlwZSIsICJUaGUgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIHR5cGUgcHJvcGVydHkgb2YgdGhlIGF1dGhlbnRpY2F0aW9uCi0JICogbWVjaGFuaXNtIiwgcGtnLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgY3JlZGVudGlhbEludGVyZmFjZSBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkNyZWRlbnRpYWwgSW50ZXJmYWNlIiwKLQkgKiAiVGhlIGNyZWRlbnRpYWwgaW50ZXJmYWNlIHByb3BlcnR5IG9mIHRoZSBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20iLAotCSAqIHBrZy5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7Ci0JICogCi0JICogfS8vIGlmIHJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsgfS8vIGdldFByb3BlcnR5RGVzY3JpcHRvcnMKLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgQXV0aGVudGljYXRpb25NZWNoYW5pc20uCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0vLyBnZXRQYXJlbnQKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbS5naWYuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvYXV0aF9tZWNoYW5pc21fb2JqIik7IC8vJE5PTi1OTFMtMSQKLQl9Ly8gZ2V0SW1hZ2UKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHRlZCBjbGFzcy4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtID0gKChBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSkgb2JqZWN0KTsKLQkJcmV0dXJuICJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSAiICsgYXV0aGVudGljYXRpb25NZWNoYW5pc20uZ2V0RGVzY3JpcHRpb24oKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRUZXh0Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQXV0aGVudGljYXRpb25NZWNoYW5pc20uY2xhc3MpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX19BVVRIRU5USUNBVElPTl9NRUNIQU5JU00gOgotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQVVUSEVOVElDQVRJT05fTUVDSEFOSVNNX1RZUEUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1JFREVOVElBTF9JTlRFUkZBQ0UgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkFVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTV9fQ1VTVE9NX0FVVEhfTUVDSF9UWVBFIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5BVVRIRU5USUNBVElPTl9NRUNIQU5JU01fX0RFU0NSSVBUSU9OUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gTm90aWZpZXIKLQkgKiAgICAgICAgICAgIG5vdGlmaWVyIC0gTm90aWZpZXMgb2YgY2hhbmdlLgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGV2ZW50VHlwZSAtIFRoZSBldmVudCB0eXBlLgotCSAqIEBwYXJhbSBFT2JqZWN0Ci0JICogICAgICAgICAgICBmZWF0dXJlIC0gVGhlIHJlZmVyZW5jZSBvYmplY3QuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2xkVmFsdWUgLSBUaGUgb2xkIG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgbmV3VmFsdWUgLSBUaGUgbmV3IG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgaW5kZXggLSBUaGUgY3VycmVudCBvZiB0aGUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIEVPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgewotCQlKY2FQYWNrYWdlIHBrZyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCQlOb3RpZmljYXRpb24gbXNnID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpIG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUuZUNvbnRhaW5tZW50RmVhdHVyZSgpLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLQkJaWYgKGZlYXR1cmUgPT0gcGtnLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtX0Rlc2NyaXB0aW9uKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQ3JlZGVudGlhbEludGVyZmFjZSgpKSB7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChtc2cpOwotCQkJcmV0dXJuOwotCQl9Ly8gaWYKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0vLyBub3RpZnlDaGFuZ2VkCi0KLX0vLyBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0NvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdjYWQwOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSBDb25maWcgcHJvcGVydHkgb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBBZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYWRhcHRlckZhY3RvcnkgLSBBZGFwdCBmYWN0b3J5Ci0JICovCi0JcHVibGljIENvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ly8gQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXIKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29uZmlnUHJvcGVydHlfZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uZmlnUHJvcGVydHlfZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfQ29uZmlnUHJvcGVydHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25maWdQcm9wZXJ0eV9uYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbmZpZ1Byb3BlcnR5X25hbWVfZmVhdHVyZSIsICJfVUlfQ29uZmlnUHJvcGVydHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eV9OYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0NvbmZpZ1Byb3BlcnR5X3R5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uZmlnUHJvcGVydHlfdHlwZV9mZWF0dXJlIiwgIl9VSV9Db25maWdQcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhbHVlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25maWdQcm9wZXJ0eV92YWx1ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25maWdQcm9wZXJ0eV92YWx1ZV9mZWF0dXJlIiwgIl9VSV9Db25maWdQcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X1ZhbHVlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHRlZCBjbGFzcy4KLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeyBpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCSAqIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkgKiAKLQkgKiBDb25maWdQcm9wZXJ0eSBmX2NvbmZpZ1Byb3BlcnR5ID0gKChDb25maWdQcm9wZXJ0eSlvYmplY3QpOyBKY2FQYWNrYWdlIHBrZyA9Ci0JICogSmNhUGFja2FnZS5lSU5TVEFOQ0U7OyAvLyBUaGlzIGlzIGZvciB0aGUgZGVzY3JpcHRpb24gZmVhdHVyZS4gLy8gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JICogKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJEZXNjcmlwdGlvbiIsICJUaGUKLQkgKiBkZXNjcmlwdGlvbiBwcm9wZXJ0eSBvZiB0aGUgY29uZmlnIHByb3BlcnR5IiwgcGtnLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBuYW1lIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiTmFtZSIsICJUaGUgbmFtZQotCSAqIHByb3BlcnR5IG9mIHRoZSBjb25maWcgcHJvcGVydHkiLCBwa2cuZ2V0Q29uZmlnUHJvcGVydHlfTmFtZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgdHlwZSBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlR5cGUiLCAiVGhlIHR5cGUKLQkgKiBwcm9wZXJ0eSBvZiB0aGUgY29uZmlnIHByb3BlcnR5IiwgcGtnLmdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHZhbHVlIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiVmFsdWUiLCAiVGhlIHZhbHVlCi0JICogcHJvcGVydHkgb2YgdGhlIGNvbmZpZyBwcm9wZXJ0eSIsIHBrZy5nZXRDb25maWdQcm9wZXJ0eV9WYWx1ZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOwotCSAqIAotCSAqIH0vLyBpZiByZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7IH0vLyBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzCi0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIENvbmZpZ1Byb3BlcnR5LgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKiBAcmV0dXJuIG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfS8vIGdldFBhcmVudAotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbmZpZ1Byb3BlcnR5LmdpZi4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvY29uZmlnX3Byb3Bfb2JqIik7IC8vJE5PTi1OTFMtMSQKLQl9Ly8gZ2V0SW1hZ2UKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0ZXh0IGJhc2Ugb24gdGhlIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlDb25maWdQcm9wZXJ0eSBjb25maWdQcm9wZXJ0eSA9ICgoQ29uZmlnUHJvcGVydHkpIG9iamVjdCk7Ci0JCWlmIChjb25maWdQcm9wZXJ0eS5nZXROYW1lKCkgPT0gbnVsbCkKLQkJCXJldHVybiBKQ0FSZXNvdXJjZUhhbmRsZXIuQ29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXJfVUlfMDsgCi0JCXJldHVybiAiQ29uZmlnUHJvcGVydHk6ICIgKyBjb25maWdQcm9wZXJ0eS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ly8gZ2V0VGV4dAotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbmZpZ1Byb3BlcnR5LmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fREVTQ1JJUFRJT04gOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTkZJR19QUk9QRVJUWV9fTkFNRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09ORklHX1BST1BFUlRZX19UWVBFIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX1ZBTFVFIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05GSUdfUFJPUEVSVFlfX0RFU0NSSVBUSU9OUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eV9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9ucygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gTm90aWZpZXIKLQkgKiAgICAgICAgICAgIG5vdGlmaWVyIC0gTm90aWZpZXMgb2YgY2hhbmdlLgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGV2ZW50VHlwZSAtIFRoZSBldmVudCB0eXBlLgotCSAqIEBwYXJhbSBFT2JqZWN0Ci0JICogICAgICAgICAgICBmZWF0dXJlIC0gVGhlIHJlZmVyZW5jZSBvYmplY3QuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2xkVmFsdWUgLSBUaGUgb2xkIG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgbmV3VmFsdWUgLSBUaGUgbmV3IG9iamVjdCByZWZlcmVuY2UuCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgaW5kZXggLSBUaGUgY3VycmVudCBvZiB0aGUgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIEVPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCkgewotCQlKY2FQYWNrYWdlIHBrZyA9IEpjYVBhY2thZ2UuZUlOU1RBTkNFOwotCQlOb3RpZmljYXRpb24gbXNnID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpIG5vdGlmaWVyLCBldmVudFR5cGUsIGZlYXR1cmUuZUNvbnRhaW5tZW50RmVhdHVyZSgpLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsKLQkJaWYgKGZlYXR1cmUgPT0gcGtnLmdldENvbmZpZ1Byb3BlcnR5X0Rlc2NyaXB0aW9uKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0Q29uZmlnUHJvcGVydHlfTmFtZSgpIHx8IGZlYXR1cmUgPT0gcGtnLmdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRDb25maWdQcm9wZXJ0eV9WYWx1ZSgpKSB7Ci0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0vLyBpZgotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfS8vIG5vdGlmeUNoYW5nZWQKLQotfS8vIENvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQ29ubmVjdGlvbkRlZmluaXRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25uZWN0aW9uRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjAzMWQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25uZWN0aW9uRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb259b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpb25EZWZpbml0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25uZWN0aW9uSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25uZWN0aW9uSW1wbENsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNYW5hZ2VkIENvbm5lY3Rpb24gRmFjdG9yeSBDbGFzcyBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NfZmVhdHVyZSIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZSBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uRmFjdG9yeUludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBGYWN0b3J5IEltcGwgQ2xhc3MgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX2Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX2Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzX2ZlYXR1cmUiLCAiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvbkRlZmluaXRpb25fQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbm5lY3Rpb24gSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3Rpb25JbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX2Nvbm5lY3Rpb25JbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fY29ubmVjdGlvbkludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rpb25EZWZpbml0aW9uX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbm5lY3Rpb24gSW1wbCBDbGFzcyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0aW9uSW1wbENsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0aW9uRGVmaW5pdGlvbl9jb25uZWN0aW9uSW1wbENsYXNzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX2Nvbm5lY3Rpb25JbXBsQ2xhc3NfZmVhdHVyZSIsICJfVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25uZWN0aW9uSW1wbENsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25maWdQcm9wZXJ0aWVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29ubmVjdGlvbkRlZmluaXRpb24uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Db25uZWN0aW9uRGVmaW5pdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29ubmVjdGlvbkRlZmluaXRpb24pIG9iamVjdCkuZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IEpDQVJlc291cmNlSGFuZGxlci5fVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fdHlwZSA6IAotCQkJCQlKQ0FSZXNvdXJjZUhhbmRsZXIuX1VJX0Nvbm5lY3Rpb25EZWZpbml0aW9uX3R5cGUgKyAiICIgKyBsYWJlbDsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29ubmVjdGlvbkRlZmluaXRpb24uY2xhc3MpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05ORUNUSU9OX0ZBQ1RPUllfSU5URVJGQUNFIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fRkFDVE9SWV9JTVBMX0NMQVNTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU5URVJGQUNFIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUSU9OX0RFRklOSVRJT05fX0NPTk5FQ1RJT05fSU1QTF9DTEFTUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVElPTl9ERUZJTklUSU9OX19DT05GSUdfUFJPUEVSVElFUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0aW9uRGVmaW5pdGlvbl9Db25maWdQcm9wZXJ0aWVzKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbmZpZ1Byb3BlcnR5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCS8vcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gSmNhUGx1Z2luLmdldFBsdWdpbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9Db25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4MGY3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvQ29ubmVjdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIENvbmVuY3RvciBwcm9qZWN0cwotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSAtIEFuIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ly8gQ29ubmVjdG9ySXRlbVByb3ZpZGVyCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFZlbmRvck5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNwZWNWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFaXNUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWZW5kb3IgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWZW5kb3JOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0b3JfdmVuZG9yTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25uZWN0b3JfdmVuZG9yTmFtZV9mZWF0dXJlIiwgIl9VSV9Db25uZWN0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfVmVuZG9yTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3BlYyBWZXJzaW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Db25uZWN0b3Jfc3BlY1ZlcnNpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdG9yX3NwZWNWZXJzaW9uX2ZlYXR1cmUiLCAiX1VJX0Nvbm5lY3Rvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9TcGVjVmVyc2lvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRWlzIFR5cGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRWlzVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29ubmVjdG9yX2Vpc1R5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdG9yX2Vpc1R5cGVfZmVhdHVyZSIsICJfVUlfQ29ubmVjdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX0Vpc1R5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZlcnNpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmVyc2lvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29ubmVjdG9yX3ZlcnNpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29ubmVjdG9yX3ZlcnNpb25fZmVhdHVyZSIsICJfVUlfQ29ubmVjdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1ZlcnNpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGN1cnJlbnQgcHJvcGVydHkKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCSAqIAotCSAqIGlmKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsgc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCSAqIAotCSAqIENvbm5lY3RvciBmX2Nvbm5lY3RvciA9ICgoQ29ubmVjdG9yKW9iamVjdCk7IEpjYVBhY2thZ2UgcGtnID0gSmNhUGFja2FnZS5lSU5TVEFOQ0U7OyAvLyBUaGlzCi0JICogaXMgZm9yIHRoZSBkaXNwbGF5TmFtZSBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJEaXNwbGF5IE5hbWUiLCAiVGhlCi0JICogZGlzcGxheSBuYW1lIHByb3BlcnR5IG9mIHRoZSBjb25uZWN0b3IiLCBwa2cuZ2V0Q29ubmVjdG9yX0Rpc3BsYXlOYW1lKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkRlc2NyaXB0aW9uIiwgIlRoZQotCSAqIGRlc2NyaXB0aW9uIHByb3BlcnR5IG9mIHRoZSBjb25uZWN0b3IiLCBwa2cuZ2V0Q29ubmVjdG9yX0Rlc2NyaXB0aW9uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBzbWFsbEljb24gZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJTbWFsbCBJY29uIiwgIlRoZQotCSAqIHNtYWxsIGljb24gcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfU21hbGxJY29uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBsYXJnZUljb24gZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJMYXJnZSBJY29uIiwgIlRoZQotCSAqIGxhcmdlIGljb24gcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfTGFyZ2VJY29uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSB2ZW5kb3JOYW1lIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiVmVuZG9yIE5hbWUiLCAiVGhlCi0JICogdmVuZG9yIG5hbWUgcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfVmVuZG9yTmFtZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgc3BlY1ZlcnNpb24gZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJTcGVjIFZlcnNpb24iLCAiVGhlCi0JICogc3BlYyB2ZXJzaW9uIHByb3BlcnR5IG9mIHRoZSBjb25uZWN0b3IiLCBwa2cuZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBlaXNUeXBlIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiRWlzIFR5cGUiLCAiVGhlIGVpcwotCSAqIHR5cGUgcHJvcGVydHkgb2YgdGhlIGNvbm5lY3RvciIsIHBrZy5nZXRDb25uZWN0b3JfRWlzVHlwZSgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgdmVyc2lvbiBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlZlcnNpb24iLCAiVGhlIHZlcnNpb24KLQkgKiBwcm9wZXJ0eSBvZiB0aGUgY29ubmVjdG9yIiwgcGtnLmdldENvbm5lY3Rvcl9WZXJzaW9uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBsaWNlbnNlIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiTGljZW5zZSIsICJUaGUgbGljZW5zZQotCSAqIG9mIHRoZSBjb25uZWN0b3IiLCBwa2cuZ2V0Q29ubmVjdG9yX0xpY2Vuc2UoKSwgZmFsc2UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIHJlc291cmNlQWRhcHRlcgotCSAqIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlJlc291cmNlIEFkYXB0ZXIiLAotCSAqICJUaGUgcmVzb3VyY2UgYWRhcHRlciBvZiB0aGUgY29ubmVjdG9yIiwgcGtnLmdldENvbm5lY3Rvcl9SZXNvdXJjZUFkYXB0ZXIoKSwgZmFsc2UpKTsgfQotCSAqIHJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsgfS8vIGdldFByb3BlcnR5RGVzY3JpcHRvcnMKLQkgKi8KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiByZWZlcmVuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIE9iamVjdCB0byBnZXQgY2hpbGRyZW4gcmVmZXJlbmNlcyBvZi4KLQkgKiBAcmV0dXJuIENvbGVsY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfTGljZW5zZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1Jlc291cmNlQWRhcHRlcigpKTsKLQkJfS8vIGlmCi0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfS8vIGdldENoaWxkcmVuUmVmZXJlbmNlcwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgQ29ubmVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIE9iamVjdCB0byByZXR1cm4gdGhlIHBhcmVudCBvZi4KLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfS8vIGdldFBhcmVudAotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbm5lY3Rvci5naWYuCi0JICogCi0JICogQHBhcmFtIE9iamVjdCAtCi0JICogICAgICAgICAgICBUaGUgb2JqZWN0IHRvIGdldCB0aGUgaW1hZ2UgZm9yLgotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmdWxsL29iajE2L2Nvbm5lY3Rpb25fb2JqIik7IC8vJE5PTi1OTFMtMSQKLQl9Ly8gZ2V0SW1hZ2UKLQotCS8qKgotCSAqIEdldCB0aGUgZGlzcGxheSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBuYW1lIGZvci4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbm5lY3RvciBjb25uZWN0b3IgPSAoKENvbm5lY3Rvcikgb2JqZWN0KTsKLQkJcmV0dXJuICJDb25uZWN0b3IgIiArIGNvbm5lY3Rvci5nZXREaXNwbGF5TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JfS8vIGdldFRleHQKLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb25uZWN0b3IuY2xhc3MpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19WRU5ET1JfTkFNRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19TUEVDX1ZFUlNJT04gOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fRUlTX1RZUEUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkNPTk5FQ1RPUl9fVkVSU0lPTiA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuQ09OTkVDVE9SX19MSUNFTlNFIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5DT05ORUNUT1JfX1JFU09VUkNFX0FEQVBURVIgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX0xpY2Vuc2UoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGljZW5zZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1Jlc291cmNlQWRhcHRlcigpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotfS8vIENvbmVuY3Rvckl0ZW1Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9JbmJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMTMxMGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL0luYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpjYVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5JbmJvdW5kUmVzb3VyY2VBZGFwdGVyfW9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbmJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXJfTWVzc2FnZUFkYXB0ZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSW5ib3VuZFJlc291cmNlQWRhcHRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEpDQVJlc291cmNlSGFuZGxlci5fVUlfSW5ib3VuZFJlc291cmNlQWRhcHRlcl90eXBlOyAKLQkJLy9yZXR1cm4gZ2V0U3RyaW5nKCJfVUlfSW5ib3VuZFJlc291cmNlQWRhcHRlcl90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSW5ib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5JTkJPVU5EX1JFU09VUkNFX0FEQVBURVJfX01FU1NBR0VfQURBUFRFUiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyX01lc3NhZ2VBZGFwdGVyKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKY2FQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JCS8vcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FFZGl0UGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvSmNhRWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTg3Y2JhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FFZGl0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuSmNhRmFjdG9yeUltcGw7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBjZW50cmFsIHNpbmdsZXRvbiBmb3IgdGhlIGpjYSBwbHVnaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBKY2FFZGl0UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvKioKLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBKY2FFZGl0UGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIGpjYSBwYWNrYWdlLgotCSAqLwotCXByb3RlY3RlZCBKY2FQYWNrYWdlIGpjYVBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKY2FFZGl0UGx1Z2luKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoZGVzY3JpcHRvcik7Ci0KLQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KLQkJLy8KLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG9uZSBqY2EgcGFja2FnZS4KLQkgKi8KLQlwdWJsaWMgSmNhUGFja2FnZSBnZXRKY2FQYWNrYWdlKCkgewotCQlyZXR1cm4gamNhUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG9uZSBqY2EgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgSmNhRmFjdG9yeSBnZXRKY2FGYWN0b3J5KCkgewotCQlyZXR1cm4gKEpjYUZhY3RvcnkpIGpjYVBhY2thZ2UuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIERvIGluaXRpYWxpemF0aW9uIHN0dWZmIGhlcmUuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnR1cCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnR1cCgpOwotCQlqY2FQYWNrYWdlID0gSmNhRmFjdG9yeUltcGwuZ2V0UGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmNhRWRpdFBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChnZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpLCAiaWNvbnMvIiArIGtleSArICIuZ2lmIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZhaWxlZCB0byBsb2FkIGltYWdlIGZvciAnIiArIGtleSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0b3IoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhrZXkpOwotCX0KLQotCS8qKgotCSAqIEdldCBhIHRyYW5zbGF0ZWQgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSwgd2l0aCBhbiBvYmplY3Qgc3Vic3RpdHV0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMX0pOwotCX0KLQotCS8qKgotCSAqIEdldCBhIHRyYW5zbGF0ZWQgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSwgd2l0aCB0d28gb2JqZWN0IHN1YnN0aXR1dGlvbnMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxLCBPYmplY3QgczIpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W117czEsIHMyfSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLCB3aXRoIHRocmVlIG9iamVjdCBzdWJzdGl0dXRpb25zLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSwgT2JqZWN0IHMyLCBPYmplY3QgczMpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W117czEsIHMyLCBzM30pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FJdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvSmNhSXRlbVByb3ZpZGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTQwNjdmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FJdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgZXh0ZW5kZWQgaXRlbSBwcm92aWRlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgotICogPHVsPgotICogPGxpPntAbGluayBDcmVhdGVDaGlsZENvbW1hbmR9Ci0gKiA8L3VsPgotICogPHA+Ci0gKiBUaGUgY29tbWFuZHMgYXJlIGltcGxlbWVudGVkIHVuaWZvcm1seSBvbiBhbGwgb3VyIGl0ZW0gYWRhcHRlcnMgdXNpbmcgdGhpcyBjb21tb24gYmFzZSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIHsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIHBhY2thZ2UgZm9yIHRoZSBqY2EgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKY2FQYWNrYWdlIGpjYVBhY2thZ2UgPSAoSmNhUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoSmNhUGFja2FnZS5lTlNfVVJJKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgZm9yIHRoZSBqY2EgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKY2FGYWN0b3J5IGpjYUZhY3RvcnkgPSBqY2FQYWNrYWdlLmdldEpjYUZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGFuIGFkYXB0ZXIgZmFjdG9yeSBhbmQgYSBkb21haW4gbm90aWZpZXIuCi0JICovCi0JcHJvdGVjdGVkIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0vLyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyCi0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgdGhlIHN1cHBvcnRlZCBjb21tYW5kcy4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHRlZCBjbGFzcy4KLQkgKiBAcGFyYW0gRWRpdGluZ0RvbWFpbiAtCi0JICogICAgICAgICAgICBUaGUgY3VycmVudCBlZGl0aW5nIGRvbWFpbi4KLQkgKiBAcGFyYW0gY29tbWFuZENsYXNzIC0KLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGNvbW1hbmQgY2xhc3MuCi0JICogQHBhcmFtIGNvbW1hbmRQYXJhbWV0ZXIgLQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29tbWFuZFBhcmFtZXRlci4KLQkgKiBAcmV0dXJuIENvbW1hbmQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCBvYmplY3QsIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgQ2xhc3MgY29tbWFuZENsYXNzLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQob2JqZWN0LCBlZGl0aW5nRG9tYWluLCBjb21tYW5kQ2xhc3MsIGNvbW1hbmRQYXJhbWV0ZXIpOwotCX0vLyBjcmVhdGVDb21tYW5kCi0KLX0vLyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvSmNhSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTg0NTE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9KY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC51dGlsLkpjYUFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydAotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyfXMuIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GCi0gKiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gVGhlIGFkYXB0ZXJzCi0gKiBhbHNvIHN1cHBvcnQgcHJvcGVydHkgc2hlZXRzLCBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXN9LiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUKLSAqIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgotICovCi1wdWJsaWMgY2xhc3MgSmNhSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBKY2FBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciB7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgSUNoYW5nZU5vdGlmaWVyLgotCSAqLwotCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSBpc0ZhY3RvcnlGb3JUeXBlCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfS8vIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwgQ29ubmVjdG9yIGluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29ubmVjdG9ySXRlbVByb3ZpZGVyIGNvbm5lY3Rvckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIENvbm5lY3Rvci4KLQkgKiAKLQkgKiBAcmV0dXJuIEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25uZWN0b3JBZGFwdGVyKCkgewotCQlpZiAoY29ubmVjdG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbm5lY3Rvckl0ZW1Qcm92aWRlciA9IG5ldyBDb25uZWN0b3JJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0vLyBpZgotCi0JCXJldHVybiBjb25uZWN0b3JJdGVtUHJvdmlkZXI7Ci0JfS8vIGNyZWF0ZUNvbm5lY3RvckFkYXB0ZXIKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCBMaWNlbnNlIGluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGljZW5zZUl0ZW1Qcm92aWRlciBsaWNlbnNlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEgTGljZW5zZS4KLQkgKiAKLQkgKiBAcmV0dXJuIEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMaWNlbnNlQWRhcHRlcigpIHsKLQkJaWYgKGxpY2Vuc2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbGljZW5zZUl0ZW1Qcm92aWRlciA9IG5ldyBMaWNlbnNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ly8gaWYKLQotCQlyZXR1cm4gbGljZW5zZUl0ZW1Qcm92aWRlcjsKLQl9Ly8gY3JlYXRlTGljZW5zZUFkYXB0ZXIKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcn1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbmJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyIGluYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbmJvdW5kUmVzb3VyY2VBZGFwdGVyQWRhcHRlcigpIHsKLQkJaWYgKGluYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJaW5ib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciA9IG5ldyBJbmJvdW5kUmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGluYm91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5PdXRib3VuZFJlc291cmNlQWRhcHRlcn1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciBvdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlckFkYXB0ZXIoKSB7Ci0JCWlmIChvdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlvdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciA9IG5ldyBPdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBvdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5NZXNzYWdlQWRhcHRlcn0KLQkgKiBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUFkYXB0ZXJJdGVtUHJvdmlkZXIgbWVzc2FnZUFkYXB0ZXJJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLk1lc3NhZ2VBZGFwdGVyfS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZUFkYXB0ZXJBZGFwdGVyKCkgewotCQlpZiAobWVzc2FnZUFkYXB0ZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWVzc2FnZUFkYXB0ZXJJdGVtUHJvdmlkZXIgPSBuZXcgTWVzc2FnZUFkYXB0ZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWVzc2FnZUFkYXB0ZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5Db25uZWN0aW9uRGVmaW5pdGlvbn1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0aW9uRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciBjb25uZWN0aW9uRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb259LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25uZWN0aW9uRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChjb25uZWN0aW9uRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb25uZWN0aW9uRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBDb25uZWN0aW9uRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb25uZWN0aW9uRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5BZG1pbk9iamVjdH0KLQkgKiBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWRtaW5PYmplY3RJdGVtUHJvdmlkZXIgYWRtaW5PYmplY3RJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLkFkbWluT2JqZWN0fS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRtaW5PYmplY3RBZGFwdGVyKCkgewotCQlpZiAoYWRtaW5PYmplY3RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJYWRtaW5PYmplY3RJdGVtUHJvdmlkZXIgPSBuZXcgQWRtaW5PYmplY3RJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gYWRtaW5PYmplY3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuTWVzc2FnZUxpc3RlbmVyfQotCSAqIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXIgbWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5NZXNzYWdlTGlzdGVuZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlTGlzdGVuZXJBZGFwdGVyKCkgewotCQlpZiAobWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlciA9IG5ldyBNZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLkFjdGl2YXRpb25TcGVjfQotCSAqIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlciBhY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQWN0aXZhdGlvblNwZWN9LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3RpdmF0aW9uU3BlY0FkYXB0ZXIoKSB7Ci0JCWlmIChhY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlciA9IG5ldyBBY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhY3RpdmF0aW9uU3BlY0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSXRlbVByb3ZpZGVyIHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlQWRhcHRlcigpIHsKLQkJaWYgKHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSXRlbVByb3ZpZGVyID0gbmV3IFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCBSZXNvdXJjZUFkYXB0ZXIgaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIgcmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEgUmVzb3VyY2VBZGFwdGVyLgotCSAqIAotCSAqIEByZXR1cm4gQWRhcHRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc291cmNlQWRhcHRlckFkYXB0ZXIoKSB7Ci0JCWlmIChyZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VBZGFwdGVySXRlbVByb3ZpZGVyID0gbmV3IFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfS8vIGlmCi0KLQkJcmV0dXJuIHJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcjsKLQl9Ly8gY3JlYXRlUmVzb3VyY2VBZGFwdGVyQWRhcHRlcgotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIFNlY3VyaXR5UGVybWlzc2lvbiBpbnN0YW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIFNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlciBzZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSBTZWN1cml0eVBlcm1pc3Npb24uCi0JICogCi0JICogQHJldHVybiBBZGFwdGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uQWRhcHRlcigpIHsKLQkJaWYgKHNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXIgPSBuZXcgU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ly8gaWYKLQotCQlyZXR1cm4gc2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyOwotCX0vLyBjcmVhdGVTZWN1cml0eVBlcm1pc3Npb25BZGFwdGVyCi0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwgQXV0aGVudGljYXRpb25NZWNoYW5pc20gaW5zdGFuY2VzCi0JICovCi0JcHJvdGVjdGVkIEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSXRlbVByb3ZpZGVyIGF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEgQXV0aGVudGljYXRpb25NZWNoYW5pc20uCi0JICogCi0JICogQHJldHVybiBBZGFwdGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21BZGFwdGVyKCkgewotCQlpZiAoYXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJYXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIgPSBuZXcgQXV0aGVudGljYXRpb25NZWNoYW5pc21JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0vLyBpZgotCi0JCXJldHVybiBhdXRoZW50aWNhdGlvbk1lY2hhbmlzbUl0ZW1Qcm92aWRlcjsKLQl9Ly8gY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc21BZGFwdGVyCi0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwgQ29uZmlnUHJvcGVydHkgaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBDb25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlciBjb25maWdQcm9wZXJ0eUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuQ29uZmlnUHJvcGVydHl9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbmZpZ1Byb3BlcnR5QWRhcHRlcigpIHsKLQkJaWYgKGNvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyID0gbmV3IENvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ly8gaWYKLQotCQlyZXR1cm4gY29uZmlnUHJvcGVydHlJdGVtUHJvdmlkZXI7Ci0JfS8vIGNyZWF0ZUNvbmZpZ1Byb3BlcnR5QWRhcHRlcgotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0vLyBnZXRSb290QWRhcHRlckZhY3RvcnkKLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0vLyBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGl0IGlzIGEgZmFjdG9yeSB0eXBlCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgdHlwZSAtIFRoZSBnaXZlbiB0eXBlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSB8fCBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKTsKLQl9Ly8gaXNGYWN0b3J5Rm9yVHlwZQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCi0JICogCi0JICogQHBhcmFtIE5vdGlmaWVyCi0JICogICAgICAgICAgICBub3RpZmllciAtIFRoZSBnaXZlbiBub3RpZmVyLgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIHR5cGUgLSBUaGUgZ2l2ZW4gdHlwZQotCSAqIEByZXR1cm4gQWRhcHRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOwotCX0vLyBhZGFwdAotCi0JLyoqCi0JICogRG9lcyBhZGFwdGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgZ2l2ZW4gb2JqZWN0LgotCSAqIEBwYXJhbSBPamVjdAotCSAqICAgICAgICAgICAgdHlwZSAtIFRoZSBnaXZlbiB0eXBlLgotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQkvLyBUaGlzIGlzIGEga2x1ZGdlIHRvIGRlYWwgd2l0aCBlbnVtZXJhdG9ycywgd2hpY2ggY3Jhc2ggdGhlIGRvU3dpdGNoLgotCQkvLwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCAmJiAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0vLyBpZgotCi0JCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzKSB0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfS8vIGlmCi0JCX0vLyBpZgotCi0JCXJldHVybiBudWxsOwotCX0vLyBhZGFwdAotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0vLyByZW1vdmVMaXN0ZW5lcgotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8gY2hhbmdlIE5vdGlmaWVyIGFuZCB0byBwYXJlbnQgQWRhcHRlckZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGdpdmVuIG9iamVjdC4KLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBldmVudFR5cGUgLSBUaGUgZ2l2ZW4gdHlwZSBvZiBldmVudC4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBmZWF0dXJlIC0gVGhlIGdpdmVuIGZlYXR1cmUuCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2xkVmFsdWUgLSBUaGUgb2xkIHZhbHVlIG9mIHRoZSBldmVudC4KLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBucmVWYWx1ZSAtIFRoZSBuZXcgdmFsdWUgb2YgdGhlIGV2ZW50LgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGluZGV4IC0gVGhlIGN1cnJlbnQgaW5kZXgKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG1zZyk7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCX0vLyBpZgotCX0vLyBmaXJlTm90aWZ5Q2hhbmdlZAotCi19Ly8gSmNhSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9MaWNlbnNlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvTGljZW5zZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGUwZmFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9MaWNlbnNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIExpY2Vuc2Ugb2JqZWN0LgotICovCi1wdWJsaWMgY2xhc3MgTGljZW5zZUl0ZW1Qcm92aWRlciBleHRlbmRzIEpjYUl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIEFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhZGFwdGVyRmFjdG9yeSAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGljZW5zZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfS8vIExpY2Vuc2VJdGVtUHJvdmlkZXIKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlcXVpcmVkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTGljZW5zZV9kZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9MaWNlbnNlX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0xpY2Vuc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXF1aXJlZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXF1aXJlZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfTGljZW5zZV9yZXF1aXJlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9MaWNlbnNlX3JlcXVpcmVkX2ZlYXR1cmUiLCAiX1VJX0xpY2Vuc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaWNlbnNlX1JlcXVpcmVkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCS8qCi0JICogcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7IGlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JICogc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCSAqIAotCSAqIExpY2Vuc2UgZl9saWNlbnNlID0gKChMaWNlbnNlKW9iamVjdCk7IEpjYVBhY2thZ2UgcGtnID0gSmNhUGFja2FnZS5lSU5TVEFOQ0U7OyAvLyBUaGlzIGlzIGZvcgotCSAqIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJEZXNjcmlwdGlvbiIsICJUaGUKLQkgKiBkZXNjcmlwdGlvbiBwcm9wZXJ0eSBvZiB0aGUgbGljZW5zZSIsIHBrZy5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSByZXF1aXJlZCBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlJlcXVpcmVkIiwgIlRoZQotCSAqIHJlcXVpcmVkIHByb3BlcnR5IG9mIHRoZSBsaWNlbnNlIiwgcGtnLmdldExpY2Vuc2VfUmVxdWlyZWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UpKTsKLQkgKiAKLQkgKiB9Ly8gaWYKLQkgKiAKLQkgKiByZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7IH0vLyBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzCi0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIExpY2Vuc2UuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ly8gZ2V0UGFyZW50Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTGljZW5zZS5naWYuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvbGljZW5zZV9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRJbWFnZQotCi0JLyoqCi0JICogR2V0IHRoZSBkaXNwbGF5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIG9iamVjdCB0byBnZXQgdGhlIG5hbWUgZm9yLgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJTGljZW5zZSBsaWNlbnNlID0gKChMaWNlbnNlKSBvYmplY3QpOwotCQlpZiAobGljZW5zZS5nZXREZXNjcmlwdGlvbigpID09IG51bGwpCi0JCQlyZXR1cm4gSkNBUmVzb3VyY2VIYW5kbGVyLkxpY2Vuc2VJdGVtUHJvdmlkZXJfVUlfMDsgCi0JCXJldHVybiBKQ0FSZXNvdXJjZUhhbmRsZXIuTGljZW5zZUl0ZW1Qcm92aWRlcl9VSV8wICsgIjoiICsgbGljZW5zZS5nZXREZXNjcmlwdGlvbigpOyAgLy8kTk9OLU5MUy0xJAotCX0vLyBnZXRUZXh0Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTGljZW5zZS5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5MSUNFTlNFX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuTElDRU5TRV9fUkVRVUlSRUQgOgotCQkJY2FzZSBKY2FQYWNrYWdlLkxJQ0VOU0VfX0RFU0NSSVBUSU9OUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGljZW5zZV9EZXNjcmlwdGlvbnMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIE5vdGlmaWVyCi0JICogICAgICAgICAgICBub3RpZmllciAtIE5vdGlmaWVzIG9mIGNoYW5nZS4KLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBldmVudFR5cGUgLSBUaGUgZXZlbnQgdHlwZS4KLQkgKiBAcGFyYW0gRU9iamVjdAotCSAqICAgICAgICAgICAgZmVhdHVyZSAtIFRoZSByZWZlcmVuY2Ugb2JqZWN0LgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9sZFZhbHVlIC0gVGhlIG9sZCBvYmplY3QgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG5ld1ZhbHVlIC0gVGhlIG5ldyBvYmplY3QgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGluZGV4IC0gVGhlIGN1cnJlbnQgb2YgdGhlIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBFT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJSmNhUGFja2FnZSBwa2cgPSBKY2FQYWNrYWdlLmVJTlNUQU5DRTsKLQkJTm90aWZpY2F0aW9uIG1zZyA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KSBub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLmVDb250YWlubWVudEZlYXR1cmUoKSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7Ci0JCWlmIChmZWF0dXJlID09IHBrZy5nZXRMaWNlbnNlX0Rlc2NyaXB0aW9uKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0TGljZW5zZV9SZXF1aXJlZCgpKSB7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChtc2cpOwotCQkJcmV0dXJuOwotCQl9Ly8gaWYKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0vLyBub3RpZnlDaGFuZ2VkCi0KLX0vLyBMaWNlbnNlSXRlbVByb3ZpZGVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvTWVzc2FnZUFkYXB0ZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9NZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTEzNDRhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9NZXNzYWdlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpjYVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5NZXNzYWdlQWRhcHRlcn1vYmplY3QuIDwhLS0KLSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZUFkYXB0ZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lc3NhZ2VBZGFwdGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VBZGFwdGVyX01lc3NhZ2VMaXN0ZW5lcnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXNzYWdlQWRhcHRlci5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L01lc3NhZ2VBZGFwdGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9NZXNzYWdlQWRhcHRlcl90eXBlOyAKLQkJLy9yZXR1cm4gZ2V0U3RyaW5nKCJfVUlfTWVzc2FnZUFkYXB0ZXJfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1lc3NhZ2VBZGFwdGVyLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfQURBUFRFUl9fTUVTU0FHRV9MSVNURU5FUlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZUFkYXB0ZXJfTWVzc2FnZUxpc3RlbmVycygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlTGlzdGVuZXIoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJLy9yZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBKY2FQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL01lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL01lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmJjMjk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9NZXNzYWdlTGlzdGVuZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpDQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwucGx1Z2luLkpjYVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmpjYS5NZXNzYWdlTGlzdGVuZXJ9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VMaXN0ZW5lckl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUxpc3RlbmVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE1lc3NhZ2VMaXN0ZW5lclR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1lc3NhZ2UgTGlzdGVuZXIgVHlwZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXNzYWdlTGlzdGVuZXJUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9NZXNzYWdlTGlzdGVuZXJfbWVzc2FnZUxpc3RlbmVyVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXNzYWdlTGlzdGVuZXJfbWVzc2FnZUxpc3RlbmVyVHlwZV9mZWF0dXJlIiwgIl9VSV9NZXNzYWdlTGlzdGVuZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlTGlzdGVuZXJfTWVzc2FnZUxpc3RlbmVyVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZUxpc3RlbmVyX0FjdGl2YXRpb25TcGVjKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWVzc2FnZUxpc3RlbmVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWVzc2FnZUxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1lc3NhZ2VMaXN0ZW5lcikgb2JqZWN0KS5nZXRNZXNzYWdlTGlzdGVuZXJUeXBlKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBKQ0FSZXNvdXJjZUhhbmRsZXIuX1VJX01lc3NhZ2VMaXN0ZW5lcl90eXBlIDogCi0JCQkJCUpDQVJlc291cmNlSGFuZGxlci5fVUlfTWVzc2FnZUxpc3RlbmVyX3R5cGUgKyAiICIgKyBsYWJlbDsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWVzc2FnZUxpc3RlbmVyLmNsYXNzKSkgewotCQkJY2FzZSBKY2FQYWNrYWdlLk1FU1NBR0VfTElTVEVORVJfX01FU1NBR0VfTElTVEVORVJfVFlQRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuTUVTU0FHRV9MSVNURU5FUl9fQUNUSVZBVElPTl9TUEVDIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VMaXN0ZW5lcl9BY3RpdmF0aW9uU3BlYygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3RpdmF0aW9uU3BlYygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQkvL3JldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9PdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY5MzI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9PdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJ9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRib3VuZFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRyYW5zYWN0aW9uU3VwcG9ydFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0IGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlYXV0aGVudGljYXRpb25TdXBwb3J0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl9yZWF1dGhlbnRpY2F0aW9uU3VwcG9ydF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl9yZWF1dGhlbnRpY2F0aW9uU3VwcG9ydF9mZWF0dXJlIiwgIl9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUcmFuc2FjdGlvbiBTdXBwb3J0IGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRyYW5zYWN0aW9uU3VwcG9ydFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfdHJhbnNhY3Rpb25TdXBwb3J0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyX3RyYW5zYWN0aW9uU3VwcG9ydF9mZWF0dXJlIiwgIl9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkRlZmluaXRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9PdXRib3VuZFJlc291cmNlQWRhcHRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy8JCU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyIG91dGJvdW5kUmVzb3VyY2VBZGFwdGVyID0gKE91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKSBvYmplY3Q7Ci0KLQkJcmV0dXJuIEpDQVJlc291cmNlSGFuZGxlci5fVUlfT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfdHlwZTsgCi0JCS8vcmV0dXJuIGdldFN0cmluZygiX1VJX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSAvKisgIiAiICsKLQkJLy8gb3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIuaXNSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpKi87IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChPdXRib3VuZFJlc291cmNlQWRhcHRlci5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSX19SRUFVVEhFTlRJQ0FUSU9OX1NVUFBPUlQgOgotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQgOgotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fREVGSU5JVElPTlMgOgotCQkJY2FzZSBKY2FQYWNrYWdlLk9VVEJPVU5EX1JFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkRlZmluaXRpb25zKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc20oKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEpjYVBsdWdpbi5nZXRQbHVnaW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9qY2FlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9wcm92aWRlcnMvUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJjZTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5wcm92aWRlcnM7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5qY2EuUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGV9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9uYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX25hbWVfZmVhdHVyZSIsICJfVUlfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9OYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9EZXNjcmlwdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IEpDQVJlc291cmNlSGFuZGxlci5fVUlfUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfdHlwZSA6IAotCQkJCQlKQ0FSZXNvdXJjZUhhbmRsZXIuX1VJX1JlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlX3R5cGUgKyAiICIgKyBsYWJlbDsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUuY2xhc3MpKSB7Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVRVUlSRURfQ09ORklHX1BST1BFUlRZX1RZUEVfX05BTUUgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFUVVJUkVEX0NPTkZJR19QUk9QRVJUWV9UWVBFX19ERVNDUklQVElPTlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGVfRGVzY3JpcHRpb25zKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV9EZXNjcmlwdGlvbnMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJLy9yZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBKY2FQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1Jlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1Jlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTkxNWE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9SZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KQ0FSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLnBsdWdpbi5KY2FQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIFJlc291cmNlQWRhcHRlciBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBBZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYWRhcHRlckZhY3RvcnkgLSBUaGUgYWRhcHQgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0vLyBSZXNvdXJjZUFkYXB0ZXJJdGVtUHJvdmlkZXIKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29ubmVjdGlvbkludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29ubmVjdGlvbkltcGxDbGFzc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVHJhbnNhY3Rpb25TdXBwb3J0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZWF1dGhlbnRpY2F0aW9uU3VwcG9ydFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVzb3VyY2VBZGFwdGVyQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1hbmFnZWQgQ29ubmVjdGlvbiBGYWN0b3J5IENsYXNzIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUFkYXB0ZXJfbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX21hbmFnZWRDb25uZWN0aW9uRmFjdG9yeUNsYXNzX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBGYWN0b3J5IEludGVyZmFjZSBmZWF0dXJlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVzb3VyY2VBZGFwdGVyX2Nvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Jlc291cmNlQWRhcHRlcl9jb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbm5lY3Rpb24gRmFjdG9yeSBJbXBsIENsYXNzIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX2Nvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uRmFjdG9yeUltcGxDbGFzcygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29ubmVjdGlvbiBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29ubmVjdGlvbkludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUmVzb3VyY2VBZGFwdGVyX2Nvbm5lY3Rpb25JbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX2Nvbm5lY3Rpb25JbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0Nvbm5lY3Rpb25JbnRlcmZhY2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbm5lY3Rpb24gSW1wbCBDbGFzcyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb25uZWN0aW9uSW1wbENsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkltcGxDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfY29ubmVjdGlvbkltcGxDbGFzc19mZWF0dXJlIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkltcGxDbGFzcygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVHJhbnNhY3Rpb24gU3VwcG9ydCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUcmFuc2FjdGlvblN1cHBvcnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlQWRhcHRlcl90cmFuc2FjdGlvblN1cHBvcnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3RyYW5zYWN0aW9uU3VwcG9ydF9mZWF0dXJlIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWF1dGhlbnRpY2F0aW9uIFN1cHBvcnQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVhdXRoZW50aWNhdGlvblN1cHBvcnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1Jlc291cmNlQWRhcHRlcl9yZWF1dGhlbnRpY2F0aW9uU3VwcG9ydF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZXNvdXJjZUFkYXB0ZXJfcmVhdXRoZW50aWNhdGlvblN1cHBvcnRfZmVhdHVyZSIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX1JlYXV0aGVudGljYXRpb25TdXBwb3J0KCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXNvdXJjZSBBZGFwdGVyIENsYXNzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlQWRhcHRlckNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9SZXNvdXJjZUFkYXB0ZXJfcmVzb3VyY2VBZGFwdGVyQ2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVzb3VyY2VBZGFwdGVyX3Jlc291cmNlQWRhcHRlckNsYXNzX2ZlYXR1cmUiLCAiX1VJX1Jlc291cmNlQWRhcHRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9SZXNvdXJjZUFkYXB0ZXJDbGFzcygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHRlZCBjbGFzcy4KLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgeyBpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCSAqIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkgKiAKLQkgKiBSZXNvdXJjZUFkYXB0ZXIgZl9yZXNvdXJjZUFkYXB0ZXIgPSAoKFJlc291cmNlQWRhcHRlcilvYmplY3QpOyBKY2FQYWNrYWdlIHBrZyA9Ci0JICogSmNhUGFja2FnZS5lSU5TVEFOQ0U7OyAvLyBUaGlzIGlzIGZvciB0aGUgbWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJNYW5hZ2VkIENvbm5lY3Rpb24KLQkgKiBGYWN0b3J5IENsYXNzIiwgIlRoZSBtYW5hZ2VkIGNvbm5lY3Rpb24gZmFjdG9yeSBjbGFzcyBwcm9wZXJ0eSBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciIsCi0JICogcGtnLmdldFJlc291cmNlQWRhcHRlcl9NYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgY29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UKLQkgKiBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJDb25uZWN0aW9uIEZhY3RvcnkKLQkgKiBJbnRlcmZhY2UiLCAiVGhlIGNvbm5lY3Rpb24gZmFjdG9yeSBpbnRlcmZhY2UgcHJvcGVydHkgb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIiLAotCSAqIHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIGNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzCi0JICogZmVhdHVyZS4gLy8gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiQ29ubmVjdGlvbiBGYWN0b3J5Ci0JICogSW1wbCBDbGFzcyIsICJUaGUgY29ubmVjdGlvbiBmYWN0b3J5IGltcGwgY2xhc3MgcHJvcGVydHkgb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIiLAotCSAqIHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLlRFWFRfVkFMVUVfSU1BR0UpKTsgLy8gVGhpcyBpcyBmb3IgdGhlIGNvbm5lY3Rpb25JbnRlcmZhY2UgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJDb25uZWN0aW9uIEludGVyZmFjZSIsCi0JICogIlRoZSBjb25uZWN0aW9uIGludGVyZmFjZSBwcm9wZXJ0eSBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciIsCi0JICogcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW50ZXJmYWNlKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSBjb25uZWN0aW9uSW1wbENsYXNzIGZlYXR1cmUuIC8vCi0JICogaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCSAqICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAiQ29ubmVjdGlvbiBJbXBsCi0JICogQ2xhc3MiLCAiVGhlIGNvbm5lY3Rpb24gaW1wbCBjbGFzcyBwcm9wZXJ0eSBvZiB0aGUgcmVzb3VyY2UgYWRhcHRlciIsCi0JICogcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW1wbENsYXNzKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSB0cmFuc2FjdGlvblN1cHBvcnQgZmVhdHVyZS4gLy8KLQkgKiBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JICogKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksICJUcmFuc2FjdGlvbiBTdXBwb3J0IiwKLQkgKiAiVGhlIHRyYW5zYWN0aW9uIHN1cHBvcnQgcHJvcGVydHkgb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIiLAotCSAqIHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfVHJhbnNhY3Rpb25TdXBwb3J0KCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IC8vIFRoaXMgaXMgZm9yIHRoZSByZWF1dGhlbnRpY2F0aW9uU3VwcG9ydAotCSAqIGZlYXR1cmUuIC8vIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlJlYXV0aGVudGljYXRpb24KLQkgKiBTdXBwb3J0IiwgIlRoZSByZWF1dGhlbnRpY2F0aW9uIHN1cHBvcnQgcHJvcGVydHkgb2YgdGhlIHJlc291cmNlIGFkYXB0ZXIiLAotCSAqIHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UpKTsKLQkgKiAKLQkgKiB9Ly8gaWYgcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOyB9Ly8gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycwotCSAqLwotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQgQWRkQ29tbWFuZCBhbmQgUmVtb3ZlQ29tbWFuZCBzdXBwb3J0IGluIGNyZWF0ZUNvbW1hbmQuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqIEByZXR1cm4gQ29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQlpbnQgdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUmVzb3VyY2VBZGFwdGVyKQotCQkJCXZlcnNpb24gPSAoKENvbm5lY3RvcikgKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKSkuZ2V0VmVyc2lvbklEKCk7Ci0KLQkJCXN3aXRjaCAodmVyc2lvbikgewotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRCA6Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkpOwotCQkJCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9TZWN1cml0eVBlcm1pc3Npb25zKCkpOwotCQkJCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9BdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKSk7Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0NvbmZpZ1Byb3BlcnRpZXMoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNV9JRCA6Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkpOwotCQkJCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9JbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkpOwotCQkJCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlQWRhcHRlcl9BZG1pbk9iamVjdHMoKSk7Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbnMoKSk7Ci0JCQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpKTsKLQkJCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29uZmlnUHJvcGVydGllcygpKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJfS8vIGlmCi0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfS8vIGdldENoaWxkcmVuUmVmZXJlbmNlcwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgUmVzb3VyY2VBZGFwdGVyLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7Ci0JfS8vIGdldFBhcmVudAotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJlc291cmNlQWRhcHRlci5naWYuCi0JICogCi0JICogQHBhcmFtIE9iamVjdAotCSAqICAgICAgICAgICAgb2JqZWN0IC0gVGhlIGFkYXB0IGNsYXNzLgotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmdWxsL29iajE2L3Jlc291cmNlX2FkYXB0ZXJfb2JqIik7IC8vJE5PTi1OTFMtMSQKLQl9Ly8gZ2V0SW1hZ2UKLQotCS8qKgotCSAqIEdldCB0aGUgZGlzcGxheSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBuYW1lIGZvci4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vCQlSZXNvdXJjZUFkYXB0ZXIgcmVzb3VyY2VBZGFwdGVyID0gKChSZXNvdXJjZUFkYXB0ZXIpIG9iamVjdCk7Ci0JCS8vcmV0dXJuICJSZXNvdXJjZUFkYXB0ZXI6ICIgKyByZXNvdXJjZUFkYXB0ZXIuZ2V0TWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gSkNBUmVzb3VyY2VIYW5kbGVyLl9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZTsgCi0KLQl9Ly8gZ2V0VGV4dAotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlQWRhcHRlci5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19NQU5BR0VEX0NPTk5FQ1RJT05fRkFDVE9SWV9DTEFTUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lOVEVSRkFDRSA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fQ09OTkVDVElPTl9GQUNUT1JZX0lNUExfQ0xBU1MgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTk5FQ1RJT05fSU5URVJGQUNFIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19DT05ORUNUSU9OX0lNUExfQ0xBU1MgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1RSQU5TQUNUSU9OX1NVUFBPUlQgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX1JFQVVUSEVOVElDQVRJT05fU1VQUE9SVCA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fUkVTT1VSQ0VfQURBUFRFUl9DTEFTUyA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuUkVTT1VSQ0VfQURBUFRFUl9fU0VDVVJJVFlfUEVSTUlTU0lPTlMgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FVVEhFTlRJQ0FUSU9OX01FQ0hBTklTTVMgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0NPTkZJR19QUk9QRVJUSUVTIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19PVVRCT1VORF9SRVNPVVJDRV9BREFQVEVSIDoKLQkJCWNhc2UgSmNhUGFja2FnZS5SRVNPVVJDRV9BREFQVEVSX19JTkJPVU5EX1JFU09VUkNFX0FEQVBURVIgOgotCQkJY2FzZSBKY2FQYWNrYWdlLlJFU09VUkNFX0FEQVBURVJfX0FETUlOX09CSkVDVFMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX1NlY3VyaXR5UGVybWlzc2lvbnMoKSwgSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQXV0aGVudGljYXRpb25NZWNoYW5pc21zKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29uZmlnUHJvcGVydGllcygpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25maWdQcm9wZXJ0eSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVzb3VyY2VBZGFwdGVyX091dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfSW5ib3VuZFJlc291cmNlQWRhcHRlcigpLCBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZUFkYXB0ZXJfQWRtaW5PYmplY3RzKCksIEpjYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFkbWluT2JqZWN0KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBKY2FQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIE5vdGlmaWVyCi0JICogICAgICAgICAgICBub3RpZmllciAtIE5vdGlmaWVzIG9mIGNoYW5nZS4KLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBldmVudFR5cGUgLSBUaGUgZXZlbnQgdHlwZS4KLQkgKiBAcGFyYW0gRU9iamVjdAotCSAqICAgICAgICAgICAgZmVhdHVyZSAtIFRoZSByZWZlcmVuY2Ugb2JqZWN0LgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9sZFZhbHVlIC0gVGhlIG9sZCBvYmplY3QgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG5ld1ZhbHVlIC0gVGhlIG5ldyBvYmplY3QgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGluZGV4IC0gVGhlIGN1cnJlbnQgb2YgdGhlIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBFT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJSmNhUGFja2FnZSBwa2cgPSBKY2FQYWNrYWdlLmVJTlNUQU5DRTsKLQkJTm90aWZpY2F0aW9uIG1zZyA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KSBub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLmVDb250YWlubWVudEZlYXR1cmUoKSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7Ci0JCWlmIChmZWF0dXJlID09IHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfTWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3MoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2UoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSB8fCBmZWF0dXJlID09IHBrZy5nZXRSZXNvdXJjZUFkYXB0ZXJfQ29ubmVjdGlvbkludGVyZmFjZSgpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25uZWN0aW9uSW1wbENsYXNzKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX1RyYW5zYWN0aW9uU3VwcG9ydCgpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9SZWF1dGhlbnRpY2F0aW9uU3VwcG9ydCgpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9TZWN1cml0eVBlcm1pc3Npb25zKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0UmVzb3VyY2VBZGFwdGVyX0F1dGhlbnRpY2F0aW9uTWVjaGFuaXNtcygpIHx8IGZlYXR1cmUgPT0gcGtnLmdldFJlc291cmNlQWRhcHRlcl9Db25maWdQcm9wZXJ0aWVzKCkpIHsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0vLyBpZgotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfS8vIG5vdGlmeUNoYW5nZWQKLQotfS8vIFJlc291cmNlQWRhcHRlckl0ZW1Qcm92aWRlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1NlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvamNhZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2EvcHJvdmlkZXJzL1NlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWIyODY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL2pjYWVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL3Byb3ZpZGVycy9TZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EucHJvdmlkZXJzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSkNBUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIFNlY3VyaXR5UGVybWlzc2lvbiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBKY2FJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIAotCSAqIEBwYXJhbSBBZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYWRhcHRlckZhY3RvcnkgLSBUaGUgYWRhcHQgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ly8gU2VjdXJpdHlQZXJtaXNzaW9uSXRlbVByb3ZpZGVyCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZERlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTcGVjaWZpY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VjdXJpdHlQZXJtaXNzaW9uX2Rlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlY3VyaXR5UGVybWlzc2lvbl9kZXNjcmlwdGlvbl9mZWF0dXJlIiwgIl9VSV9TZWN1cml0eVBlcm1pc3Npb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN1cml0eVBlcm1pc3Npb25fRGVzY3JpcHRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNwZWNpZmljYXRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWNhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VjdXJpdHlQZXJtaXNzaW9uX3NwZWNpZmljYXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdXJpdHlQZXJtaXNzaW9uX3NwZWNpZmljYXRpb25fZmVhdHVyZSIsICJfVUlfU2VjdXJpdHlQZXJtaXNzaW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlQZXJtaXNzaW9uX1NwZWNpZmljYXRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCS8qCi0JICogcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7IGlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JICogc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCSAqIAotCSAqIFNlY3VyaXR5UGVybWlzc2lvbiBmX3NlY3VyaXR5UGVybWlzc2lvbiA9ICgoU2VjdXJpdHlQZXJtaXNzaW9uKW9iamVjdCk7IEpjYVBhY2thZ2UgcGtnID0KLQkgKiBKY2FQYWNrYWdlLmVJTlNUQU5DRTs7IC8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLiAvLyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkgKiAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkRlc2NyaXB0aW9uIiwgIlRoZQotCSAqIGRlc2NyaXB0aW9uIHByb3BlcnR5IG9mIHRoZSBzZWN1cml0eSBwZXJtaXNzaW9uIiwgcGtnLmdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbigpLAotCSAqIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOyAvLyBUaGlzIGlzIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBmZWF0dXJlLiAvLwotCSAqIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkgKiAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIlNwZWNpZmljYXRpb24iLCAiVGhlCi0JICogc3BlY2lmaWNhdGlvbiBwcm9wZXJ0eSBvZiB0aGUgc2VjdXJpdHkgcGVybWlzc2lvbiIsCi0JICogcGtnLmdldFNlY3VyaXR5UGVybWlzc2lvbl9TcGVjaWZpY2F0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOwotCSAqIAotCSAqIH0vLyBpZiByZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7IH0vLyBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzCi0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIFNlY3VyaXR5UGVybWlzc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqZWN0Ci0JICogICAgICAgICAgICBvYmplY3QgLSBUaGUgYWRhcHQgY2xhc3MuCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0vLyBnZXRQYXJlbnQKLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZWN1cml0eVBlcm1pc3Npb24uZ2lmLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBhZGFwdCBjbGFzcy4KLQkgKiBAcmV0dXJuIG9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9zZWN1cml0eV9wZXJtaXNzaW9uX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfS8vIGdldEltYWdlCi0KLQotCS8qKgotCSAqIEdldCB0aGUgZGlzcGxheSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iamVjdCAtIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBuYW1lIGZvci4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVNlY3VyaXR5UGVybWlzc2lvbiBzZWN1cml0eVBlcm1pc3Npb24gPSAoKFNlY3VyaXR5UGVybWlzc2lvbikgb2JqZWN0KTsKLQkJaWYgKHNlY3VyaXR5UGVybWlzc2lvbi5nZXREZXNjcmlwdGlvbigpID09IG51bGwpCi0JCQlyZXR1cm4gSkNBUmVzb3VyY2VIYW5kbGVyLlNlY3VyaXR5UGVybWlzc2lvbkl0ZW1Qcm92aWRlcl9VSV8wOyAKLQkJcmV0dXJuIEpDQVJlc291cmNlSGFuZGxlci5TZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXJfVUlfMCArICI6ICIgKyBzZWN1cml0eVBlcm1pc3Npb24uZ2V0RGVzY3JpcHRpb24oKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ly8gZ2V0VGV4dAotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlY3VyaXR5UGVybWlzc2lvbi5jbGFzcykpIHsKLQkJCWNhc2UgSmNhUGFja2FnZS5TRUNVUklUWV9QRVJNSVNTSU9OX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fU1BFQ0lGSUNBVElPTiA6Ci0JCQljYXNlIEpjYVBhY2thZ2UuU0VDVVJJVFlfUEVSTUlTU0lPTl9fREVTQ1JJUFRJT05TIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3VyaXR5UGVybWlzc2lvbl9EZXNjcmlwdGlvbnMoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24uCi0JICogCi0JICogQHBhcmFtIE5vdGlmaWVyCi0JICogICAgICAgICAgICBub3RpZmllciAtIE5vdGlmaWVzIG9mIGNoYW5nZS4KLQkgKiBAcGFyYW0gaW50Ci0JICogICAgICAgICAgICBldmVudFR5cGUgLSBUaGUgZXZlbnQgdHlwZS4KLQkgKiBAcGFyYW0gRU9iamVjdAotCSAqICAgICAgICAgICAgZmVhdHVyZSAtIFRoZSByZWZlcmVuY2Ugb2JqZWN0LgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9sZFZhbHVlIC0gVGhlIG9sZCBvYmplY3QgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG5ld1ZhbHVlIC0gVGhlIG5ldyBvYmplY3QgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGluZGV4IC0gVGhlIGN1cnJlbnQgb2YgdGhlIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBFT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJSmNhUGFja2FnZSBwa2cgPSBKY2FQYWNrYWdlLmVJTlNUQU5DRTsKLQkJTm90aWZpY2F0aW9uIG1zZyA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KSBub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLmVDb250YWlubWVudEZlYXR1cmUoKSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBpbmRleCk7Ci0JCWlmIChmZWF0dXJlID09IHBrZy5nZXRTZWN1cml0eVBlcm1pc3Npb25fRGVzY3JpcHRpb24oKSB8fCBmZWF0dXJlID09IHBrZy5nZXRTZWN1cml0eVBlcm1pc3Npb25fU3BlY2lmaWNhdGlvbigpKSB7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChtc2cpOwotCQkJcmV0dXJuOwotCQl9Ly8gaWYKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0vLyBub3RpZnlDaGFuZ2VkCi0KLX0vLyBTZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZjhkNTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWNvbm5lY3Rvcl92YWxpZGF0b3JfVUlfPUNvbm5lY3RvciBWYWxpZGF0b3IKLUNPTk5fRkFDRVRfTEFCRUw9SjJDIE1vZHVsZQotQ09OTl9GQUNFVF9ERVNDUklQVElPTj1FbmFibGVzIHRoZSBwcm9qZWN0IHRvIGJlIGRlcGxveWVkIGFzIGEgSjJDIG1vZHVsZS4KLUNPTk5fRkFDRVRfVEVNUExBVEU9SjJDIFByb2plY3QKLXBsdWdpbk5hbWU9SkNBIFBsdWctaW4KLXBsdWdpblZlbmRvcj1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Zjc0YWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkpjYU1vZHVsZUV4dGVuc2lvbiIKLSAgICAgICAgIG5hbWU9IkpjYU1vZHVsZUV4dGVuc2lvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJNb2R1bGVFeHRlbnNpb24iPgotICAgICAgPGVhck1vZHVsZUV4dGVuc2lvbgotICAgICAgICAgICAgZXh0ZW5zaW9uQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5pbnRlcm5hbC5wbHVnaW4uSmNhTW9kdWxlRXh0ZW5zaW9uSW1wbCI+Ci0gICAgICA8L2Vhck1vZHVsZUV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDxhZGFwdGVyRmFjdG9yeQotICAgICAgICAgICAgZnVuY3Rpb25Hcm91cElEPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLnByb3ZpZGVycy5KY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9ImpjYS54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb3ZpZGVycy5KY2FJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iQ29ubmVjdG9yVmFsaWRhdG9yIgotICAgICAgICAgbmFtZT0iJWNvbm5lY3Rvcl92YWxpZGF0b3JfVUlfIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0gICAgICA8dmFsaWRhdG9yPgotICAgICAgICAgPGZhY2V0Ci0gICAgICAgICAgICAgICBmYWNldElkPSJqc3QuY29ubmVjdG9yIj4KLSAgICAgICAgIDwvZmFjZXQ+Ci0gICAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29ubmVjdG9yREQiPgotICAgICAgICAgPC9jb250ZW50VHlwZUJpbmRpbmc+Ci0gICAgICAgICA8ZmlsdGVyCi0gICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0gICAgICAgICAgICAgICBuYW1lRmlsdGVyPSJNQU5JRkVTVC5NRiI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgPGhlbHBlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS52YWxpZGF0aW9uLkNvbm5lY3RvckhlbHBlciI+Ci0gICAgICAgICA8L2hlbHBlcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2EudmFsaWRhdGlvbi5VSUNvbm5lY3RvclZhbGlkYXRvciI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgICAgIDxydW5TdHJhdGVneSAKLSAgICAgICAgIAlwcm9qZWN0PSJ0cnVlIj4KLSAgICAgICAgIDwvcnVuU3RyYXRlZ3k+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsIj4KLSAgICAgIDxlZGl0TW9kZWwKLSAgICAgICAgICAgIGVkaXRNb2RlbElEPSJqc3QuY29ubmVjdG9yIgotICAgICAgICAgICAgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5BcnRpZmFjdEVkaXRNb2RlbEZhY3RvcnkiPgotICAgICAgICAgPGVkaXRNb2RlbFJlc291cmNlCi0gICAgICAgICAgICAgICBhdXRvbG9hZD0iZmFsc2UiCi0gICAgICAgICAgICAgICBVUkk9Ik1FVEEtSU5GL3JhLnhtbCIvPgotICAgICAgPC9lZGl0TW9kZWw+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuYXJ0aWZhY3RlZGl0Ij4KLSAgICAgIDxhcnRpZmFjdGVkaXQKLSAgICAgICAgICAgIHR5cGVJRD0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsLkNvbm5lY3RvckFydGlmYWN0RWRpdCI+Ci0gICAgICA8L2FydGlmYWN0ZWRpdD4KLSAgIDwvZXh0ZW5zaW9uPiAKLSAgIAotICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDwhLS0gQnVpbGRlciBQcm92aWRlciByZWdpc3RyYXRpb25zLS0+Ci0gICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5EYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbiI+Ci0gICAgIAk8UHJvdmlkZXJEZWZpbmVzVHlwZQotICAgICAgCQlwcm92aWRlclR5cGU9ImpzdC5jb25uZWN0b3IuYnVpbGRlciIKLSAgICAgIAkJcHJvdmlkZXJJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuSmF2YUNvbXBvbmVudEJ1aWxkZXJEYXRhTW9kZWxQcm92aWRlciIvPgotCTwvZXh0ZW5zaW9uPgotCQotCQotICA8IS0tIFByb2plY3QgRmFjZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0KLSAgICA8cHJvamVjdC1mYWNldCBpZD0ianN0LmNvbm5lY3RvciI+Ci0gICAgICA8bGFiZWw+JUNPTk5fRkFDRVRfTEFCRUw8L2xhYmVsPgotICAgICAgPGRlc2NyaXB0aW9uPiVDT05OX0ZBQ0VUX0RFU0NSSVBUSU9OPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxpY29uPmljb25zL2Z1bGwvb2JqMTYvQ29ubmVjdG9yLmdpZjwvaWNvbj4KLSAgICA8L3Byb2plY3QtZmFjZXQ+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3QuY29ubmVjdG9yIiB2ZXJzaW9uPSIxLjAiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxhbmQ+Ci0gICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJqc3QuamF2YSIgdmVyc2lvbj0iWzEuMyIvPgotICAgICAgICAgIDxjb25mbGljdHMgZ3JvdXA9Im1vZHVsZXMiLz4KLSAgICAgICAgPC9hbmQ+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJtb2R1bGVzIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3QuY29ubmVjdG9yIiB2ZXJzaW9uPSIxLjUiPgotICAgICAgPGNvbnN0cmFpbnQ+Ci0gICAgICAgIDxhbmQ+Ci0gICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJqc3QuamF2YSIgdmVyc2lvbj0iWzEuMyIvPgotICAgICAgICAgIDxjb25mbGljdHMgZ3JvdXA9Im1vZHVsZXMiLz4KLSAgICAgICAgPC9hbmQ+Ci0gICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJtb2R1bGVzIi8+Ci0gICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0KLSAgICA8YWN0aW9uIGZhY2V0PSJqc3QuY29ubmVjdG9yIiB2ZXJzaW9uPSIxLjAsMS41IiB0eXBlPSJJTlNUQUxMIiBpZD0ianN0LmNvbm5lY3Rvci5pbnN0YWxsIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQuQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICAgIDxjb25maWctZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQuQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIiLz4KLSAgICA8L2FjdGlvbj4KLSAgICAKLSAgICA8ZXZlbnQtaGFuZGxlciBmYWNldD0ianN0LmNvbm5lY3RvciIgdmVyc2lvbj0iMS4wLDEuNSIgdHlwZT0iUE9TVF9JTlNUQUxMIj4KLSAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQuQ29ubmVjdG9yRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlIi8+Ci0gICAgPC9ldmVudC1oYW5kbGVyPgotICAgIAotICAgIDxldmVudC1oYW5kbGVyIGZhY2V0PSJqc3QuY29ubmVjdG9yIiB2ZXJzaW9uPSIxLjAsMS41IiB0eXBlPSJSVU5USU1FX0NIQU5HRUQiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkoyRUVGYWNldFJ1bnRpbWVDaGFuZ2VkRGVsZWdhdGUiLz4KLSAgICA8L2V2ZW50LWhhbmRsZXI+Ci0gICAgCi0gICAgPHRlbXBsYXRlIGlkPSJ0ZW1wbGF0ZS5qc3QuY29ubmVjdG9yIj4KLSAgICAgIDxsYWJlbD4lQ09OTl9GQUNFVF9URU1QTEFURTwvbGFiZWw+Ci0gICAgICA8Zml4ZWQgZmFjZXQ9ImpzdC5qYXZhIi8+Ci0gICAgICA8Zml4ZWQgZmFjZXQ9ImpzdC5jb25uZWN0b3IiLz4KLSAgICA8L3RlbXBsYXRlPgotCi0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRU1vZGVsUHJvdmlkZXIiPgotICAgICAgICA8cHJvdmlkZXI+Ci0gICAgICAgIAk8bW9kZWxQcm92aWRlciBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5tb2R1bGVjb3JlLnV0aWwuQ29ubmVjdG9yQXJ0aWZhY3RFZGl0Ii8+CQotICAgICAgCQk8ZmFjZXQgaWQ9ImpzdC5jb25uZWN0b3IiIHZlcnNpb25zPSIxLjAsMS41Ii8+Ci0gICAgICAJPC9wcm92aWRlcj4KLSAgPC9leHRlbnNpb24+CQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wcmVwYXJlZm9ycGlpLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3ByZXBhcmVmb3JwaWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjJlYTNkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAuamNhIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotCQk8Y29weSB0b2RpciA9ICIke291dHB1dERpcn0vcHJvcGVydHlfZmlsZXMiID4KLQkJCSA8ZmlsZXNldCBkaXI9IiR7cGx1Z2luZGlyfS9wcm9wZXJ0eV9maWxlcyI+Ci0gICAgICAgICAgIAkgIDxpbmNsdWRlIG5hbWU9IioqLyoucHJvcGVydGllcyIvPgotICAJCQkgPC9maWxlc2V0PgotICAJCTwvY29weT4KLSAgCQkKLSAgCQk8Y29weSBmaWxlPSIke3BsdWdpbmRpcn0vcGx1Z2luLnByb3BlcnRpZXMiIHRvZGlyPSIke291dHB1dERpcn0iLz4KLSAgCQkKLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3Byb3BlcnR5X2ZpbGVzL3Jhci5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcHJvcGVydHlfZmlsZXMvcmFyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMDE2ODIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcHJvcGVydHlfZmlsZXMvcmFyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUxpY2Vuc2VJdGVtUHJvdmlkZXJfVUlfMD1MaWNlbnNlCi1TZWN1cml0eVBlcm1pc3Npb25JdGVtUHJvdmlkZXJfVUlfMD1TZWN1cml0eVBlcm1pc3Npb24KLUNvbmZpZ1Byb3BlcnR5SXRlbVByb3ZpZGVyX1VJXzA9Q29uZmlnUHJvcGVydHkKLV9VSV9SZXNvdXJjZUFkYXB0ZXJfdHlwZT1SZXNvdXJjZUFkYXB0ZXIKLV9VSV9PdXRib3VuZFJlc291cmNlQWRhcHRlcl90eXBlPU91dGJvdW5kUmVzb3VyY2VBZGFwdGVyCi1fVUlfQ29ubmVjdGlvbkRlZmluaXRpb25fdHlwZT1Db25uZWN0aW9uRGVmaW5pdGlvbgotX1VJX0luYm91bmRSZXNvdXJjZUFkYXB0ZXJfdHlwZT1JbmJvdW5kUmVzb3VyY2VBZGFwdGVyCi1fVUlfTWVzc2FnZUFkYXB0ZXJfdHlwZT1NZXNzYWdlQWRhcHRlcgotX1VJX01lc3NhZ2VMaXN0ZW5lcl90eXBlPU1lc3NhZ2VMaXN0ZW5lcgotX1VJX0FjdGl2YXRpb25TcGVjX3R5cGU9QWN0aXZhdGlvblNwZWMKLV9VSV9SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZV90eXBlPVJlcXVpcmVkQ29uZmlnUHJvcGVydHkKLV9VSV9BZG1pbk9iamVjdF90eXBlPUFkbWluT2JqZWN0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wcm9wZXJ0eV9maWxlcy9yYXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9wcm9wZXJ0eV9maWxlcy9yYXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzg3N2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcHJvcGVydHlfZmlsZXMvcmFydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1DT05ORUNUT1JfSU5WQUxJRF9ET0NfVFlQRV9FUlJPUl89SVdBRTAwNTRFIERvY3VtZW50IHR5cGUgdmVyc2lvbiAiezB9IiBmb3IgcmFyLnhtbCBpbiBwcm9qZWN0ICJ7MX0iIG5lZWRzIHRvIGJlIHZlcnNpb24gInsyfSIuCi1FUlJPUl9JTlZBTElEX0NPTk5FQ1RPUl9GSUxFPSJJbnZhbGlkIFJBUiBGaWxlIi4KLUVSUk9SX0NPTk5FQ1RPUl9WQUxJREFUSU9OX0ZBSUxFRD0iUkFSIFZhbGlkYXRpb24gZmFpbGVkIi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY4NDA1OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5hcmNoaXZlLm9wZXJhdGlvbnMuQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIgewotCi0gICAgcHVibGljIENvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uKG1vZGVsKTsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkpDQTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFdyb25nQ29tcG9uZW50VHlwZVN0cmluZyhTdHJpbmcgcHJvamVjdE5hbWUpIHsKLSAgICAgICAgcmV0dXJuIEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5OT1RfQV9SQVIsIG5ldyBPYmplY3RbXXtwcm9qZWN0TmFtZX0pOyAgICAgICAKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZUV4dGVuc2lvbigpIHsKLSAgICAgICAgcmV0dXJuICIucmFyIjsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAvKioKLSAgICAgKiBFeHBvcnRzIHRoZSBzcGVjaWZpZWQgQ29ubmVjdG9yIE1vZHVsZSBwcm9qZWN0IHRvIHRoZSBzcGVjaWZpZWQgQ29ubmVjdG9yIFJBUiBmaWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb25uZWN0b3JQcm9qZWN0TmFtZQotICAgICAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENvbm5lY3RvciBNb2R1bGUgcHJvamVjdCB0byBleHBvcnQuCi0gICAgICogQHBhcmFtIHJhckZpbGVOYW1lCi0gICAgICogICAgICAgICAgICBUaGUgZnVsbHkgcXVhbGlmaWVkIENvbm5lY3RvciBSQVIgZmlsZSBsb2NhdGlvbiB0byBleHBvcnQgdGhlIHNwZWNpZmllZCBDb25uZWN0b3IKLSAgICAgKiAgICAgICAgICAgIE1vZHVsZSBwcm9qZWN0LgotICAgICAqIEBwYXJhbSBvdmVyd3JpdGVFeGlzdGluZwotICAgICAqICAgICAgICAgICAgSWYgdGhpcyBpcyA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIGFuIGV4aXN0aW5nIGZpbGUgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieQotICAgICAqICAgICAgICAgICAgPGNvZGU+ZWFyRmlsZU5hbWU8L2NvZGU+IHdpbGwgYmUgb3ZlcndyaXR0ZW4uCi0gICAgICogQHBhcmFtIGV4cG9ydFNvdXJjZQotICAgICAqICAgICAgICAgICAgSWYgdGhpcyBpcyA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIGFsbCBzb3VyY2UgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBDb25uZWN0b3IKLSAgICAgKiAgICAgICAgICAgIE1vZHVsZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgQ29ubmVjdG9yIFJBUiBmaWxlLgotICAgICAqIEBwbGFubmVkZm9yIFdUUCAxLjAKLSAgICAgKi8KLS8vICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleHBvcnRQcm9qZWN0KFN0cmluZyBjb25uZWN0b3JQcm9qZWN0TmFtZSwgU3RyaW5nIHJhckZpbGVOYW1lLCBib29sZWFuIG92ZXJ3cml0ZUV4aXN0aW5nLCBib29sZWFuIGV4cG9ydFNvdXJjZSkgewotLy8gICAgICAgIENvbm5lY3Rvck1vZHVsZUV4cG9ydERhdGFNb2RlbCBkYXRhTW9kZWwgPSBuZXcgQ29ubmVjdG9yTW9kdWxlRXhwb3J0RGF0YU1vZGVsKCk7Ci0vLyAgICAgICAgZGF0YU1vZGVsLnNldFByb3BlcnR5KFBST0pFQ1RfTkFNRSwgY29ubmVjdG9yUHJvamVjdE5hbWUpOwotLy8gICAgICAgIGRhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoT1ZFUldSSVRFX0VYSVNUSU5HLCBvdmVyd3JpdGVFeGlzdGluZyk7Ci0vLyAgICAgICAgZGF0YU1vZGVsLnNldFByb3BlcnR5KEFSQ0hJVkVfREVTVElOQVRJT04sIHJhckZpbGVOYW1lKTsKLS8vICAgICAgICBkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEVYUE9SVF9TT1VSQ0VfRklMRVMsIGV4cG9ydFNvdXJjZSk7Ci0vLyAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5ydW4obnVsbCk7Ci0vLyAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLS8vICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0vLyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMjJkZWMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5KMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldC5Db25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZhY2V0RGF0YU1vZGVsTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi0vKioKLSAqIFRoaXMgZGF0YU1vZGVsIGlzIHVzZWQgZm9yIHRvIGltcG9ydCBDb25uZWN0b3IgTW9kdWxlcyAoZnJvbSBSQVIgZmlsZXMpIGludG8gdGhlIHdvcmtzcGFjZS4KLSAqIAotICogVGhpcyBjbGFzcyAoYW5kIGFsbCBpdHMgZmllbGRzIGFuZCBtZXRob2RzKSBpcyBsaWtlbHkgdG8gY2hhbmdlIGR1cmluZyB0aGUgV1RQIDEuMCBtaWxlc3RvbmVzIGFzCi0gKiB0aGUgbmV3IHByb2plY3Qgc3RydWN0dXJlcyBhcmUgYWRvcHRlZC4gVXNlIGF0IHlvdXIgb3duIHJpc2suCi0gKiAKLSAqIEBwbGFubmVkZm9yIFdUUCAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJLy9zZXRJbnRQcm9wZXJ0eShJQ29ubmVjdG9yQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9WRVJTSU9OLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gWE1MUmVzb3VyY2UuUkFSX1RZUEU7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmUgb3BlbkFyY2hpdmUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhcmNoaXZlID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnkuZUlOU1RBTkNFLm9wZW5SQVJGaWxlKGdldEFyY2hpdmVPcHRpb25zKCksIHVyaSk7Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGNyZWF0ZUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDb25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwkJCi0JfQotCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRPcGVyYXRpb24obW9kZWwpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWJvb2xlYW4gc2V0ID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQVJDSElWRV9XUkFQUEVSKSkgewotCQkJSURhdGFNb2RlbCBtb2R1bGVETSA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTik7Ci0JCQlpZiAoZ2V0QXJjaGl2ZVdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBtb2R1bGVETS5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0JCQkJSURhdGFNb2RlbCBqY2FGYWNldERhdGFNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbCggSjJFRVByb2plY3RVdGlsaXRpZXMuSkNBICk7Ci0KLQkJCQlpbnQgdmVyc2lvbiA9IGdldE1vZHVsZVNwZWNWZXJzaW9uKCk7Ci0JCQkJU3RyaW5nIHZlcnNpb25UZXh0ID0gSjJFRVZlcnNpb25VdGlsLmdldEpDQVRleHRWZXJzaW9uKCB2ZXJzaW9uICk7Ci0JCQkJamNhRmFjZXREYXRhTW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgdmVyc2lvblRleHQpOwotCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFBST0pFQ1RfTkFNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2V0OwotCX0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRJbXBvcnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxNWQzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudEltcG9ydE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkNvbm5lY3RvckNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuQ29ubmVjdG9yQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuSjJFRUFydGlmYWN0SW1wb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckNvbXBvbmVudEltcG9ydE9wZXJhdGlvbiBleHRlbmRzIEoyRUVBcnRpZmFjdEltcG9ydE9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0VYVEVOU0lPTiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIENvbm5lY3RvckNvbXBvbmVudEltcG9ydE9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJc3VwZXIuZG9FeGVjdXRlKG1vbml0b3IpOwotCQlhZGRBc3NvY2lhdGVBcmNoaXZlc1RvQ2xhc3NQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhbGwgamFyIHdpdGhpbiB0aGUgZmlsZSB0byB0aGUgY2xhc3NwYXRoLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFzc29jaWF0ZUFyY2hpdmVzVG9DbGFzc1BhdGgoKSB7Ci0JCUxpc3QgPElDbGFzc3BhdGhFbnRyeT4gZXh0cmFFbnRyaWVzID0gbmV3IEFycmF5TGlzdCA8SUNsYXNzcGF0aEVudHJ5PiAoKTsKLQkJCi0JCUxpc3QgPElBcmNoaXZlUmVzb3VyY2U+IGFyY2hpdmVSZXNvdXJjZXMgPSAoKElBcmNoaXZlKWFyY2hpdmVXcmFwcGVyLmdldFVuZGVyTHlpbmdBcmNoaXZlKCkpLmdldEFyY2hpdmVSZXNvdXJjZXMoKTsKLQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWZvcihJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSA6IGFyY2hpdmVSZXNvdXJjZXMpewotCQkJaWYoYXJjaGl2ZVJlc291cmNlLmdldFBhdGgoKS5sYXN0U2VnbWVudCgpLmVuZHNXaXRoKEpBUl9FWFRFTlNJT04pKXsKLQkJCQl2RmlsZSA9IHZpcnR1YWxDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUoYXJjaGl2ZVJlc291cmNlLmdldFBhdGgoKSk7Ci0JCQkJaWYgKHZGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWZpbGUgPSB2RmlsZS5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQkJCQlleHRyYUVudHJpZXMuYWRkKEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShmaWxlLmdldEZ1bGxQYXRoKCksIGZpbGUuZ2V0RnVsbFBhdGgoKSwgbnVsbCwgdHJ1ZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0cnkgewotCQkJYWRkVG9DbGFzc3BhdGgoZ2V0RGF0YU1vZGVsKCksIGV4dHJhRW50cmllcyk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZFRvQ2xhc3NwYXRoKElEYXRhTW9kZWwgaW1wb3J0TW9kZWwsIExpc3QgZXh0cmFFbnRyaWVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKGV4dHJhRW50cmllcy5zaXplKCkgPiAwKSB7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoKChJVmlydHVhbENvbXBvbmVudCkgaW1wb3J0TW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVCkpLmdldFByb2plY3QoKSk7Ci0JCQlhZGRUb0NsYXNzcGF0aChleHRyYUVudHJpZXMsIGphdmFQcm9qZWN0KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkVG9DbGFzc3BhdGgoTGlzdCBleHRyYUVudHJpZXMsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmIChleHRyYUVudHJpZXMuc2l6ZSgpID4gMCkgewotCQkJSUNsYXNzcGF0aEVudHJ5W10gamF2YUNsYXNzcGF0aCA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJTGlzdCBub25EdXBsaWNhdGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRyYUVudHJpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJQ2xhc3NwYXRoRW50cnkgZXh0cmFFbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIGV4dHJhRW50cmllcy5nZXQoaSk7Ci0JCQkJYm9vbGVhbiBpbmNsdWRlID0gdHJ1ZTsKLQkJCQlmb3IgKGludCBqID0gMDsgaW5jbHVkZSAmJiBqIDwgamF2YUNsYXNzcGF0aC5sZW5ndGg7IGorKykgewotCQkJCQlpZiAoZXh0cmFFbnRyeS5lcXVhbHMoamF2YUNsYXNzcGF0aFtqXSkpIHsKLQkJCQkJCWluY2x1ZGUgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoaW5jbHVkZSkgewotCQkJCQlub25EdXBsaWNhdGVMaXN0LmFkZChleHRyYUVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobm9uRHVwbGljYXRlTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3SmF2YUNsYXNzcGF0aCA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbamF2YUNsYXNzcGF0aC5sZW5ndGggKyBub25EdXBsaWNhdGVMaXN0LnNpemUoKV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShqYXZhQ2xhc3NwYXRoLCAwLCBuZXdKYXZhQ2xhc3NwYXRoLCAwLCBqYXZhQ2xhc3NwYXRoLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBub25EdXBsaWNhdGVMaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCW5ld0phdmFDbGFzc3BhdGhbamF2YUNsYXNzcGF0aC5sZW5ndGggKyBqXSA9IChJQ2xhc3NwYXRoRW50cnkpIG5vbkR1cGxpY2F0ZUxpc3QuZ2V0KGopOwotCQkJCX0KLQkJCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3SmF2YUNsYXNzcGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVTYXZlU3RyYXRlZ3koSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCUNvbm5lY3RvckNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgc2F2ZVN0cmF0ID0gbmV3IENvbm5lY3RvckNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwoY29tcG9uZW50KTsKLQkJcmV0dXJuIHNhdmVTdHJhdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlciBnZXRBcmNoaXZlU2F2ZUFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCl7Ci0JCXJldHVybiBuZXcgQ29ubmVjdG9yQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyKHZpcnR1YWxDb21wb25lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvSUNvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvamNhL29wZXJhdGlvbnMvSUNvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1YTU0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0lDb25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLS8qKgotICogPHA+Ci0gKiBJQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsIHByb3ZpZGVzIHByb3BlcnRpZXMgdG8gdGhlIElEYXRhTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSAKLSAqIENvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLlwKLSAqIE5PVEU6IFRoZSBhc3NvY2lhdGVkIFByb3ZpZGVyIGFuZCBPcGVyYXRpb25zIHdpbGwgYmUgY3JlYXRlZCBkdXJpbmcgTTUKLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXMKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3RvckNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMgewotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0lDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2pjYS9vcGVyYXRpb25zL0lDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNzI4NDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9qY2Evb3BlcmF0aW9ucy9JQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci0vKioKLSAqIDxwPgotICogSUNvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMgcHJvdmlkZXMgcHJvcGVydGllcyB0byB0aGUgSURhdGFNb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhlIAotICogQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuCi0gKiBOT1RFOiBUaGUgYXNzb2NpYXRlZCBQcm92aWRlciBhbmQgT3BlcmF0aW9ucyB3aWxsIGJlIGNyZWF0ZWQgZHVyaW5nIE01Ci0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvaW50ZXJuYWwvbW9kdWxlL3V0aWwvQ29ubmVjdG9yRWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9tb2R1bGUvdXRpbC9Db25uZWN0b3JFZGl0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkOWVkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9pbnRlcm5hbC9tb2R1bGUvdXRpbC9Db25uZWN0b3JFZGl0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwubW9kdWxlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLm1vZHVsZWNvcmUudXRpbC5Db25uZWN0b3JBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JFZGl0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5I2dldEFkYXB0ZXIoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgPT0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LkFEQVBURVJfVFlQRSB8fCBhZGFwdGVyVHlwZSA9PSBBcnRpZmFjdEVkaXQuQURBUFRFUl9UWVBFKSB7Ci0JCQlBcnRpZmFjdEVkaXRNb2RlbCBlZGl0TW9kZWwgPSAoQXJ0aWZhY3RFZGl0TW9kZWwpIGFkYXB0YWJsZU9iamVjdDsKLQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QoZWRpdE1vZGVsLmdldFByb2plY3QoKSkpCi0JCQkJcmV0dXJuIG5ldyBDb25uZWN0b3JBcnRpZmFjdEVkaXQoKEFydGlmYWN0RWRpdE1vZGVsKSBhZGFwdGFibGVPYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyTGlzdCgpCi0JICovCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXXtBcnRpZmFjdEVkaXQuY2xhc3MsIENvbm5lY3RvckVkaXRBZGFwdGVyRmFjdG9yeS5jbGFzc307Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL21vZHVsZWNvcmUvdXRpbC9Db25uZWN0b3JBcnRpZmFjdEVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL21vZHVsZWNvcmUvdXRpbC9Db25uZWN0b3JBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmODQ0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS9yYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS9tb2R1bGVjb3JlL3V0aWwvQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5tb2R1bGVjb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkVudGVycHJpc2VBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZS5KYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLmFyY2hpdmUub3BlcmF0aW9ucy5Db25uZWN0b3JDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkJpbmFyeUNvbXBvbmVudEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklBcnRpZmFjdEVkaXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogUHJvdmlkZXMgYWNjZXNzIHRvIEoyRUUgQ29ubmVjdG9yIG1vZGVscyB1c2luZyB0aGUgQXJ0aWZhY3RFZGl0IHBhdHRlcm4uCi0gKiA8cD4KLSAqIENsaWVudHMgc2hvdWxkIHVzZSBnZXRDb25uZWN0b3JBcnRpZmFjdEZvclJlYWQvV3JpdGUoKSB0byBhY3F1aXJlIGFuIGluc3RhbmNlIG9mIHRoZSBjb3JyZWN0Ci0gKiBhcnRpZmFjdCBlZGl0IGNsYXNzLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGV4dGVuZHMgRW50ZXJwcmlzZUFydGlmYWN0RWRpdCBpbXBsZW1lbnRzIElBcnRpZmFjdEVkaXRGYWN0b3J5IHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0NPTlRFTlRfVFlQRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb25uZWN0b3JERCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBJZGVudGlmaWVyIHVzZWQgdG8gbGluayBDb25uZWN0b3JBcnRpZmFjdEVkaXQgdG8gYSBDb25uZWN0b3JFZGl0QWRhcHRlckZhY3RvcnkKLQkgKiB7QHNlZSBDb25uZWN0b3JFZGl0QWRhcHRlckZhY3Rvcnl9IHN0b3JlZCBpbiBhbiBBZGFwdGVyTWFuZ2VyIChAc2VlIEFkYXB0ZXJNYW5hZ2VyKQotCSAqIDwvcD4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmNsYXNzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbm5lY3RvckFydGlmYWN0RWRpdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJc3VwZXIoYU1vZHVsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJpbmFyeUNvbXBvbmVudEhlbHBlciBpbml0QmluYXJ5Q29tcG9uZW50SGVscGVyKElWaXJ0dWFsQ29tcG9uZW50IGJpbmFyeU1vZHVsZSkgewotCQlyZXR1cm4gbmV3IEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcihiaW5hcnlNb2R1bGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhSGFuZGxlCi0JICogQHBhcmFtIHRvQWNjZXNzQXNSZWFkT25seQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICovCi0JcHVibGljIENvbm5lY3RvckFydGlmYWN0RWRpdChJUHJvamVjdCBhUHJvamVjdCwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlcihhUHJvamVjdCwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KElQcm9qZWN0IGFQcm9qZWN0LCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSwgYm9vbGVhbiBmb3JDcmVhdGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlzdXBlcihhUHJvamVjdCwgdG9BY2Nlc3NBc1JlYWRPbmx5LCBmb3JDcmVhdGUsIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkpDQSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0uCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhbkFydGlmYWN0RWRpdE1vZGVsCi0JICovCi0KLQlwdWJsaWMgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KEFydGlmYWN0RWRpdE1vZGVsIGFuQXJ0aWZhY3RFZGl0TW9kZWwpIHsKLQkJc3VwZXIoYW5BcnRpZmFjdEVkaXRNb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFOYXR1cmUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgTW9kdWxlQ29yZU5hdHVyZX1mb3IgYW4gYWNjZXNzaWJsZSBwcm9qZWN0Ci0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fXBvaW50aW5nIHRvIGEgbW9kdWxlIGZyb20gdGhlIGdpdmVuCi0JICogICAgICAgICAgICB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfQotCSAqLwotCi0JcHJvdGVjdGVkIENvbm5lY3RvckFydGlmYWN0RWRpdChNb2R1bGVDb3JlTmF0dXJlIGFOYXR1cmUsIElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB7Ci0JCXN1cGVyKGFOYXR1cmUsIGFNb2R1bGUsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBDb25uZWN0b3JSZXNvdXJjZSBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkpCi0JICovCi0KLQlwdWJsaWMgQ29ubmVjdG9yUmVzb3VyY2UgZ2V0Q29ubmVjdG9yWG1pUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoQ29ubmVjdG9yUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgZnJvbSB0aGUgQXJ0aWZhY3RFZGl0TW9kZWwgdXNpbmcgZGVmaW5lZCBVUkkuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2UKLQkgKi8KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgewotCQlpZiAoaXNCaW5hcnkoKSkgewotCQkJcmV0dXJuIGdldEJpbmFyeUNvbXBvbmVudEhlbHBlcigpLmdldFJlc291cmNlKEoyRUVDb25zdGFudHMuUkFSX0REX1VSSV9PQkopOwotCQl9Ci0JCXJldHVybiBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFJlc291cmNlKEoyRUVDb25zdGFudHMuUkFSX0REX1VSSV9PQkopOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIE9idGFpbnMgdGhlIENvbm5lY3RvciAoQHNlZSBDb25uZWN0b3IpIHJvb3Qgb2JqZWN0IGZyb20gdGhlIENvbm5lY3RvclJlc291cmNlLiBJZiB0aGUgcm9vdAotCSAqIG9iamVjdCBkb2VzIG5vdCBleGlzdCwgdGhlbiBvbmUgaXMgY3JlYXRlZCAoQGxpbmsKLQkgKiBhZGRDb25uZWN0b3JJZk5lY2Vzc2FyeShnZXRDb25uZWN0b3JYbWlSZXNvdXJjZSgpKSkuIFRoZSByb290IG9iamVjdCBjb250YWlucyBhbGwgb3RoZXIKLQkgKiByZXNvdXJjZSBkZWZpbmVkIG9iamVjdHMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gRU9iamVjdAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpIHsKLQkJTGlzdCBjb250ZW50cyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRDb250ZW50cygpOwotCQlpZiAoY29udGVudHMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCQlpZiAoaXNCaW5hcnkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJYWRkQ29ubmVjdG9ySWZOZWNlc3NhcnkoZ2V0Q29ubmVjdG9yWG1pUmVzb3VyY2UoKSk7Ci0JCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBvYmplY3QgKENvbm5lY3RvcikgYW5kIHBvcHVsYXRlcyB3aXRoIGRhdGEuIEFkZHMgdGhlCi0JICogcm9vdCBvYmplY3QgdG8gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciByZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwgcG9pbnRpbmcgdG8gYSB7QHNlZSBYTUxSZXNvdXJjZX0gTm90ZTogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IHVzZWQKLQkgKiAgICAgICAgICAgIGZvciBKVU5JVCAtIG1vdmU/Ci0JICogICAgICAgICAgICA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29ubmVjdG9ySWZOZWNlc3NhcnkoWE1MUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChpc0JpbmFyeSgpKSB7Ci0JCQl0aHJvd0F0dGVtcHRlZEJpbmFyeUVkaXRNb2RlbEFjY2VzcygpOwotCQl9Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCAmJiBhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCUNvbm5lY3RvciBjb25uZWN0b3IgPSBKY2FGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25uZWN0b3IoKTsKLQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChjb25uZWN0b3IpOwotCQkJVVJJIG1vZHVsZVVSSSA9IGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0TW9kdWxlVVJJKCk7Ci0JCQl0cnkgewotCQkJCWNvbm5lY3Rvci5zZXREaXNwbGF5TmFtZShTdHJ1Y3R1cmVFZGl0LmdldERlcGxveWVkTmFtZShtb2R1bGVVUkkpKTsKLQkJCX0gY2F0Y2ggKFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24gZSkgewotCQkJCS8vIElnbm9yZQotCQkJfQotCQkJYVJlc291cmNlLnNldElEKGNvbm5lY3RvciwgSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfSUQpOwotCQkJLy8gVE9ETyBhZGQgbW9yZSBtYW5kYXRvcnkgZWxlbWVudHMKLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBub3QgYmUgdXNlZCBmb3IgZWRpdGluZy4gSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20KLQkgKiB0aGlzIG1ldGhvZCB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuCi0JICogICAgICAgICAgICBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQKLQkgKiAgICAgICAgIG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXQgZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yUmVhZChJUHJvamVjdCBhUHJvamVjdCkgewotCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChpc1ZhbGlkQ29ubmVjdG9yTW9kdWxlKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGFQcm9qZWN0KSkpCi0JCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IENvbm5lY3RvckFydGlmYWN0RWRpdChhUHJvamVjdCwgdHJ1ZSwgZmFsc2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QKLQkgKiBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXQgZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVByb2plY3QgYVByb2plY3QpIHsKLQkJQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoaXNWYWxpZENvbm5lY3Rvck1vZHVsZShDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChhUHJvamVjdCkpKQotCQkJCWFydGlmYWN0RWRpdCA9IG5ldyBDb25uZWN0b3JBcnRpZmFjdEVkaXQoYVByb2plY3QsIGZhbHNlLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBDb25uZWN0b3JBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzCi0JICogbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIENvbm5lY3RvckFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbQotCSAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBDb25uZWN0b3JBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlIHVuZGVybHlpbmcKLQkgKiAgICAgICAgIGNvbnRlbnQgbW9kZWwKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBjb3VsZCBub3QgcmVzb2x2ZSB1cmkuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXQgZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yUmVhZChJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB7Ci0JCWlmIChhTW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGFNb2R1bGUuaXNCaW5hcnkoKSkgewotCQkJcmV0dXJuIG5ldyBDb25uZWN0b3JBcnRpZmFjdEVkaXQoYU1vZHVsZSk7Ci0JCX0KLQkJcmV0dXJuIGdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQoYU1vZHVsZS5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IHRoYXQgYXJlIHJldHVybmVkIHRocm91Z2ggdGhpcwotCSAqIG1ldGhvZCBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubyBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBDb25uZWN0b3JBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbgotCSAqICAgICAgICAgICAgYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIENvbm5lY3RvckFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQgcGVyc2lzdCBjaGFuZ2VzCi0JICogICAgICAgICB0byB0aGUgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXQgZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQlpZiAoYU1vZHVsZSA9PSBudWxsIHx8IGFNb2R1bGUuaXNCaW5hcnkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoYU1vZHVsZS5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb2R1bGUKLQkgKiAgICAgICAgICAgIEEge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKFdvcmtiZW5jaENvbXBvbmVudCl9YW5kIHRoZSBtb2R1bGVUeXBlSWQgaXMKLQkgKiAgICAgICAgIGEgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ29ubmVjdG9yTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1ZhbGlkRWRpdGFibGVNb2R1bGUoYU1vZHVsZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8qIGFuZCBtYXRjaCB0aGUgSlNUX0Nvbm5lY3Rvcl9NT0RVTEUgdHlwZSAqLwotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KGFNb2R1bGUuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgSjJFRSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gQ29ubmVjdG9yUmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhIEoyRUUgU3BlYyB2ZXJzaW9uCi0JICovCi0KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uKCkgewotCQlyZXR1cm4gZ2V0Q29ubmVjdG9yWG1pUmVzb3VyY2UoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBDb25uZWN0b3IgZnJvbSAoQGxpbmsgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkpCi0JICovCi0JcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoKSB7Ci0JCXJldHVybiAoQ29ubmVjdG9yKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoKSB7Ci0JCWlmIChpc0JpbmFyeSgpKSB7Ci0JCQl0aHJvd0F0dGVtcHRlZEJpbmFyeUVkaXRNb2RlbEFjY2VzcygpOwotCQl9Ci0JCXJldHVybiBjcmVhdGVNb2RlbFJvb3QoZ2V0SjJFRVZlcnNpb24oKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuRW50ZXJwcmlzZUFydGlmYWN0RWRpdCNjcmVhdGVNb2RlbFJvb3QoamF2YS5sYW5nLkludGVnZXIpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7Ci0JCWlmIChpc0JpbmFyeSgpKSB7Ci0JCQl0aHJvd0F0dGVtcHRlZEJpbmFyeUVkaXRNb2RlbEFjY2VzcygpOwotCQl9Ci0JCUNvbm5lY3RvclJlc291cmNlIHJlcyA9IChDb25uZWN0b3JSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlyZXMuc2V0TW9kdWxlVmVyc2lvbklEKHZlcnNpb24pOwotCQlhZGRDb25uZWN0b3JJZk5lY2Vzc2FyeShyZXMpOwotCQlyZXR1cm4gKChDb25uZWN0b3JSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKS5nZXRSb290T2JqZWN0KCk7Ci0JfQotCi0JcHVibGljIEFydGlmYWN0RWRpdCBjcmVhdGVBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIGdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQoYUNvbXBvbmVudCk7Ci0JfQotCi0JcHVibGljIEFydGlmYWN0RWRpdCBjcmVhdGVBcnRpZmFjdEVkaXRGb3JXcml0ZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBnZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JXcml0ZShhQ29tcG9uZW50KTsKLQl9Ci0KLQlwdWJsaWMgQXJjaGl2ZSBhc0FyY2hpdmUoYm9vbGVhbiBpbmNsdWRlU291cmNlLCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlpZiAoaXNCaW5hcnkoKSkgewotCQkJSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyIGhlbHBlciA9IChKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIpZ2V0QmluYXJ5Q29tcG9uZW50SGVscGVyKCk7Ci0JCQlyZXR1cm4gaGVscGVyLmFjY2Vzc0xlZ2FjeUFyY2hpdmUoKTsKLQkJfSBlbHNlIHsKLQkJCUNvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwgbG9hZGVyID0gbmV3IENvbm5lY3RvckNvbXBvbmVudExvYWRTdHJhdGVneUltcGwoZ2V0Q29tcG9uZW50KCksIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKLQkJCWxvYWRlci5zZXRFeHBvcnRTb3VyY2UoaW5jbHVkZVNvdXJjZSk7Ci0JCQlTdHJpbmcgdXJpID0gTW9kdWxlVVJJVXRpbC5nZXRIYW5kbGVTdHJpbmcoZ2V0Q29tcG9uZW50KCkpOwotCQkJcmV0dXJuIENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuUkFSRmlsZShsb2FkZXIsIHVyaSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlRGVwbG95bWVudERlc2NyaXB0b3IoSVByb2plY3QgcHJvamVjdCwgaW50IHZlcnNpb24pIHsKLQkJQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGpjYUVkaXQgPSBuZXcgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KHByb2plY3QsIGZhbHNlLCB0cnVlKTsKLQkJdHJ5IHsKLQkJCWpjYUVkaXQuY3JlYXRlTW9kZWxSb290KHZlcnNpb24pOwotCQkJamNhRWRpdC5zYXZlKG51bGwpOwotCQl9IGZpbmFsbHkgewotCQkJamNhRWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiAoSU1vZGVsUHJvdmlkZXIpZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlyZXR1cm4gKElNb2RlbFByb3ZpZGVyKWdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQl9Ci0JcHVibGljIHZvaWQgbW9kaWZ5KFJ1bm5hYmxlIHJ1bm5hYmxlLCBJUGF0aCBtb2RlbFBhdGgpIHsKLQkJc2V0V3JpdGFibGVFZGl0KGdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvcldyaXRlKGdldFByb2plY3QoKSkpOwotCQl0cnl7Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJCWlmKCBnZXRXcml0YWJsZUVkaXQoKSAhPSBudWxsICl7Ci0JCQkJLy8gQWx3YXlzIHNhdmUgcmVnYXJkbGVzcyBvZiByZXNvdXJjZSBwYXRoIHBhc3NlZCAtIEFydGlmYWN0ZWRpdHMgc2F2ZSByZXNvdXJjZXMgYXMgYSB1bml0Ci0JCQkJZ2V0V3JpdGFibGVFZGl0KCkuc2F2ZUlmTmVjZXNzYXJ5KCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpICk7Ci0JCQl9Ci0JCQkKLQkJfSBmaW5hbGx5IHsgLy9Qcm9wZXJseSBkaXNwb3NlIHRoZSB3cml0ZSBhcnRpZmFjdCBlZGl0Ci0JCQlnZXRXcml0YWJsZUVkaXQoKS5kaXNwb3NlKCk7Ci0JCQlzZXRXcml0YWJsZUVkaXQobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZURlc2NyaWJlcigpIHsKLQkJcmV0dXJuIENPTk5FQ1RPUl9DT05URU5UX1RZUEU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvbW9kdWxlY29yZS91dGlsL3BhY2thZ2UueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EvcmFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvbW9kdWxlY29yZS91dGlsL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDI4YmI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhL3JhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL21vZHVsZWNvcmUvdXRpbC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08aHRtbD4KLSAgICA8aGVhZD4KLSAgICAgICAgPG1ldGEKLSAgICAgICAgICAgIG5hbWU9InJvb3QiCi0gICAgICAgICAgICBjb250ZW50PSIuLi8uLi8uLi8uLi8uLi8uLi8uLi8iIC8+Ci0gICAgICAgIDx0aXRsZT5XZWJBcnRpZmFjdEVkaXQgYXBpIG92ZXJ2aWV3PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0KLSAgICA8Ym9keT4gIAotCQk8YWJzdHJhY3Q+Ci0gICAgICAgIFRoaXMgcGFja2FnZSBpbmNsdWRlcyB0aGUgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGFwaS4gVGhpcyBhcGkgaXMgdXNlZCB0byB3b3JrIHdpdGggdGhlIGVtZiBtb2RlbAotICAgICAgICBvZiBhIGZsZXhpYmxlIGNvbm5lY3RvciBtb2R1bGUuIEl0IGNvbnRhaW5zIGFwaSB0byByZWFkIGFuZCBzZXJpYWxpemUgb3V0IHRoZSBlbWYgbW9kZWwgZm9yIGNvbm5lY3RvciBtb2R1bGVzLgotCQk8L2Fic3RyYWN0PgotCi0JPGEgaHJlZj0iI3RvcCI+dG9wPC9hPgotICAgIDwvYm9keT4KLTwvaHRtbD4gICAgCi0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLmNkdHByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY2R0cHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzODhiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY2R0cHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlLWNkdCB2ZXJzaW9uPSIyLjAiPz4NCi0NCi08Y2R0cHJvamVjdD4NCi08ZGF0YT4NCi08aXRlbSBpZD0iY2R0X2luZGV4ZXIiPg0KLTxpbmRleEVuYWJsZWQgaW5kZXhWYWx1ZT0idHJ1ZSIvPg0KLTwvaXRlbT4NCi08L2RhdGE+DQotPC9jZHRwcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjU0MjhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImoyZWUtbmF2aWdhdG9yLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjQ2Y2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qMmVlLW5hdmlnYXRvci5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTZkMTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPmNvbS5pYm0uZXRvb2xzLmN0Yy5qYXZhcHJvamVjdG5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGFlM2YxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNUaHUgTWF5IDEwIDE4OjM1OjE1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFmZDRjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQbHVnaW4ubmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjA0LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbi5KMkVFTmF2aWdhdG9yUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlUGx1Z2luLnByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZTsgZXhjZXB0aW9ucz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q1NmU1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgICouamFyLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zb3VyY2UuLiA9IGoyZWUtbmF2aWdhdG9yLwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvSjJFRVBlcnNwZWN0aXZlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL0oyRUVQZXJzcGVjdGl2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NTY1NjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvSjJFRVBlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9hcHBjbGllbnRncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzY4NDI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9jb25uZWN0b3Jncm91cF9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvY29ubmVjdG9yZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzYWYzYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9jb25uZWN0b3Jncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Vhcmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZWIzZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9lamJncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGFkYjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mb2xkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkxYjI2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9leHBvcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2FwcGNsaWVudF9leHBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjgzMzAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfZXhwb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvYXBwY2xpZW50X2ltcG9ydF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTY2N2Y0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9hcHBjbGllbnRfaW1wb3J0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2Vhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X2Vhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzBiMTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfZWpiamFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyY2Q0MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydF9lamJqYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnRfcmFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmYjNkNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0X3Jhci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZDg1OWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lYXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9lYXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTkyMDFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWFyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWpiamFyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnRfZWpiamFyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0NGI0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X2VqYmphci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0X3Jhci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZjI1YTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydF9yYXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJjMDY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdhcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdhcHBjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNlODZhMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3YXBwY2xpZW50X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Nvbm5lY3Rpb25wcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJlYzZiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3Y29ubmVjdGlvbnByal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2Vhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQwOWI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlamJwcmpfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdlamJwcmpfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkYTIyYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3ZWpicHJqX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YWM2YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9jdmlldzE2L2oyZWVfdmlldy5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhY2Q0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2N2aWV3MTYvajJlZV92aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9sb2FkaW5nMS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2V0b29sMTYvbG9hZGluZzEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWUxMThhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9sb2FkaW5nMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2V0b29sMTYvbG9hZGluZzIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2xvYWRpbmcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3ZjEzZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2V0b29sMTYvbG9hZGluZzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2xvYWRpbmczLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9sb2FkaW5nMy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTg3YzIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2xvYWRpbmczLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9sb2FkaW5nNC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL2V0b29sMTYvbG9hZGluZzQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzZjZmE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9sb2FkaW5nNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL29iajE2L3dlYmFwcF9kZXBsb3kuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vYmoxNi93ZWJhcHBfZGVwbG95LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1MzFlMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL29iajE2L3dlYmFwcF9kZXBsb3kuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9jbGllbnRfYXBwX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2NsaWVudF9hcHBfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmMWNhNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2NsaWVudF9hcHBfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY29ubmVjdG9yX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2Nvbm5lY3Rvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2U3N2JjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvY29ubmVjdG9yX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL292cjE2L2VqYl9tb2R1bGVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZWpiX21vZHVsZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjUwZDZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZWpiX21vZHVsZV9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9lbnRlcnByaXNlX2FwcF9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi9lbnRlcnByaXNlX2FwcF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzE5YzQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZW50ZXJwcmlzZV9hcHBfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvb3ZyMTYvd2ViX21vZHVsZV9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZTk2MTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC9vdnIxNi93ZWJfbW9kdWxlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9hcHBjbGllbnRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmQ3ZmE3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vY29ubmVjdG9yX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9jb25uZWN0b3Jfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMxZjhkMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9jb25uZWN0b3Jfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZWFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNWU3NjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZWFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9lamJwcm9qZWN0X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9lamJwcm9qZWN0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMmFhMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZWpicHJvamVjdF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2FwcGNsaWVudF93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2FwcGNsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTE1Mzk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9hcHBjbGllbnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9lYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyN2ZhNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWpiamFyX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfZWpiamFyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2E3OWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X2VqYmphcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3Jhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vZXhwb3J0X3Jhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ3ZjFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF9yYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF93YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cG9ydF93YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1MTI0Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9leHBvcnRfd2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfYXBwY2xpZW50X3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfYXBwY2xpZW50X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MWEzMWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2FwcGNsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2Vhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X2Vhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzc1NGRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lYXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lamJqYXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF9lamJqYXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyMzUxOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfZWpiamFyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfcmFyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9mdWxsL3dpemJhbi9pbXBvcnRfcmFyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOWRmZjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3Jhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3dhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vaW1wb3J0X3dhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTQyNzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2ltcG9ydF93YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vd2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjRlMmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvZnVsbC93aXpiYW4vd2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9qY3Vfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2pjdV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmE3M2FjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL2pjdV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvc2VydmxldC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9zZXJ2bGV0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxYmVjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9zZXJ2bGV0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3Nlc3Npb25CZWFuX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9zZXNzaW9uQmVhbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDdiOGE4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3Nlc3Npb25CZWFuX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9zcnZjZV9lbGVtX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy9zcnZjZV9lbGVtX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZGNiM2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvc3J2Y2VfZWxlbV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd2ViZ3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3dlYmdyb3VwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NGQzNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvaWNvbnMvd2ViZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3dlYnNlcnZpY2VkZXNjLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3dlYnNlcnZpY2VkZXNjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiODQ0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy93ZWJzZXJ2aWNlZGVzYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9pY29ucy93c2RsLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3dzZGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmI4NDRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2ljb25zL3dzZGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbmF2aWdhdG9yL3VpL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9uYXZpZ2F0b3IvdWkvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5NWI0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9uYXZpZ2F0b3IvdWkvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm5hdmlnYXRvci51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5uYXZpZ2F0b3IudWkubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9hZGluZ0RETm9kZV9Mb2FkaW5nXzBfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFyUGxhY2VIb2xkZXJKb2JfUmVtb3ZpbmdfcGxhY2VfaG9sZGVyXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X1RoZV9kcmFnZ2VkX3Byb2plY3RfY2Fubm90X2JlX2FkZGVkXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRNb2R1bGVUb0VhckRyb3BBc3Npc3RhbnRfQWRkaW5nX21vZHVsZV90b19lYV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkVXRpbGl0eUphclRvRWFyRHJvcEFzc2lzdGFudF9BZGRfVXRpbGl0eV9KYXJfdG9fMF87IAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydEoyRUVNb2R1bGVEcm9wQXNzaXN0YW50X0ltcG9ydGluZ19KYXZhX0VudGVycHJpc2VfRWRpdGlvbl9hcnRpZmFjdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0SjJFRU1vZHVsZURyb3BBc3Npc3RhbnRfQ291bGRfbm90X3JlY29nbml6ZV9leHRlbnNpb25fMF87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9UaGVfcHJvamVjdF8wX2Nhbm5vdF9iZV9hY2Nlc3NlXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X0NvdWxkX25vdF9hZGRfbW9kdWxlX3RvX0VudGVycHJpc2VfOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbmF2aWdhdG9yL3VpL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9uYXZpZ2F0b3IvdWkvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3ODg5MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9uYXZpZ2F0b3IvdWkvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSNTdHJpbmcgZXh0ZXJuYWxpemF0aW9uLCBrZXk9dmFsdWUKLSNTYXQgQXByIDE1IDE2OjEyOjEwIEVEVCAyMDA2Ci1BZGRNb2R1bGVUb0VhckRyb3BBc3Npc3RhbnRfQWRkaW5nX21vZHVsZV90b19lYV89QWRkaW5nIG1vZHVsZSB0byB7MH0KLUNsZWFyUGxhY2VIb2xkZXJKb2JfUmVtb3ZpbmdfcGxhY2VfaG9sZGVyXz1SZW1vdmluZyBwbGFjZSBob2xkZXIgLi4uCi1JbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudF9Db3VsZF9ub3RfcmVjb2duaXplX2V4dGVuc2lvbl8wXz1Db3VsZCBub3QgcmVjb2duaXplIGV4dGVuc2lvbiAiezB9IiBhcyBhIEphdmEgRW50ZXJwcmlzZSBFZGl0aW9uIGFydGlmYWN0LgotQWRkVXRpbGl0eUphclRvRWFyRHJvcEFzc2lzdGFudF9BZGRfVXRpbGl0eV9KYXJfdG9fMF89QWRkIFV0aWxpdHkgSmFyIHRvIHswfQotSW1wb3J0SjJFRU1vZHVsZURyb3BBc3Npc3RhbnRfSW1wb3J0aW5nX0phdmFfRW50ZXJwcmlzZV9FZGl0aW9uX2FydGlmYWN0cz1JbXBvcnRpbmcgSmF2YSBFbnRlcnByaXNlIEVkaXRpb24gYXJ0aWZhY3RzIC4uLgotQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9UaGVfcHJvamVjdF8wX2Nhbm5vdF9iZV9hY2Nlc3NlXz1UaGUgcHJvamVjdCAiezB9IiBjYW5ub3QgYmUgYWNjZXNzZWQKLUFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfVGhlX2RyYWdnZWRfcHJvamVjdF9jYW5ub3RfYmVfYWRkZWRfPVRoZSBkcmFnZ2VkIHByb2plY3QgY2Fubm90IGJlIGFkZGVkIHRvIHRoZSAqLmVhciBiZWNhdXNlIGl0IGlzIGNsb3NlZC4KLUFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfQ291bGRfbm90X2FkZF9tb2R1bGVfdG9fRW50ZXJwcmlzZV89Q291bGQgbm90IGFkZCBtb2R1bGUgdG8gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbi4KLUxvYWRpbmdERE5vZGVfTG9hZGluZ18wXz1Mb2FkaW5nIGRlc2NyaXB0b3IgZm9yIHswfS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9BcHBsaWNhdGlvblZpZXdlclNvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0FwcGxpY2F0aW9uVmlld2VyU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODFjZDEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0FwcGxpY2F0aW9uVmlld2VyU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFQmluYXJ5TW9kdWxlc0l0ZW1Qcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uVmlld2VyU29ydGVyIGV4dGVuZHMgSjJFRVZpZXdlclNvcnRlciB7Ci0KLQlwdWJsaWMgQXBwbGljYXRpb25WaWV3ZXJTb3J0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpZihlMSBpbnN0YW5jZW9mIEoyRUVCaW5hcnlNb2R1bGVzSXRlbVByb3ZpZGVyKXsKLQkJCXJldHVybiAxOwotCQl9IGVsc2UgaWYoZTIgaW5zdGFuY2VvZiBKMkVFQmluYXJ5TW9kdWxlc0l0ZW1Qcm92aWRlcil7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9DbGVhclBsYWNlSG9sZGVySm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvQ2xlYXJQbGFjZUhvbGRlckpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjI5YjJiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9DbGVhclBsYWNlSG9sZGVySm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm5hdmlnYXRvci51aS5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLQotcHVibGljIGNsYXNzIENsZWFyUGxhY2VIb2xkZXJKb2IgZXh0ZW5kcyBVSUpvYiB7Ci0KLQlwcml2YXRlIEFic3RyYWN0VHJlZVZpZXdlciB2aWV3ZXI7Ci0JcHJpdmF0ZSBMb2FkaW5nREROb2RlIHBsYWNlSG9sZGVyOwotCXByaXZhdGUgT2JqZWN0W10gY2hpbGRyZW47Ci0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JcHVibGljIENsZWFyUGxhY2VIb2xkZXJKb2IoQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlciwgTG9hZGluZ0RETm9kZSBwbGFjZUhvbGRlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJc3VwZXIoTWVzc2FnZXMuQ2xlYXJQbGFjZUhvbGRlckpvYl9SZW1vdmluZ19wbGFjZV9ob2xkZXJfKTsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCXRoaXMucGxhY2VIb2xkZXIgPSBwbGFjZUhvbGRlcjsgCi0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0JCXNldFJ1bGUobmV3IE5vbkNvbmZsaWN0aW5nUnVsZSgpKTsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQl0cnkgewotCQkJaWYoICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSApewotCQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQl2aWV3ZXIucmVtb3ZlKHBsYWNlSG9sZGVyKTsKLQkJCQl2aWV3ZXIuYWRkKHBhcmVudCwgY2hpbGRyZW4pOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYoICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSApewotCQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0UmVkcmF3KHRydWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VBUkNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VBUkNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDVjZGM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FQVJDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuTW9kdWxlbWFwUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgdGhlIEVBUiBuYXZpZ2F0b3IgY29udGVudCB0byB0aGUgcHJvamVjdCBleHBsb3JlcgotICovCi1wdWJsaWMgY2xhc3MgRUFSQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgSjJFRUNvbnRlbnRQcm92aWRlciB7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFQVJDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIGFWaWV3ZXJJZAotCSAqLwotCXB1YmxpYyBFQVJDb250ZW50UHJvdmlkZXIoU3RyaW5nIGFWaWV3ZXJJZCkgewotCQlzdXBlcihhVmlld2VySWQpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGZpbHRlciBvdXQgYW55IG5vbiBBcHBsaWNhdGlvbiBERCBvYmplY3RzIHNvIGFzIG5vdCB0byBkdXBsaWNhdGUgbWV0YSBub2RlcyBpbgotCSAqIHRoZSBiaW5hcnkgbW9kdWxlcyBjYXNlLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgYVBhcmVudEVsZW1lbnQpIHsKLQkJaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpYVBhcmVudEVsZW1lbnQ7Ci0JCQlTdHJpbmcgZW1mUGFja2FnZSA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKS5nZXROc1VSSSgpOwotCQkJaWYgKCFlbWZQYWNrYWdlLmVxdWFscyhBcHBsaWNhdGlvblBhY2thZ2UuZU5TX1VSSSkmJgotCQkJCQkhZW1mUGFja2FnZS5lcXVhbHMoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSYmIWVtZlBhY2thZ2UuZXF1YWxzKE1vZHVsZW1hcFBhY2thZ2UuZU5TX1VSSSkpCi0JCQkJcmV0dXJuIG5ldyBPYmplY3RbXXt9OwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihhUGFyZW50RWxlbWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRk1vZGVsTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRk1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJjMzFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FTUZNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRU1GTW9kZWxNYW5hZ2VyIHsKLQlwcml2YXRlIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBFTUZSb290T2JqZWN0UHJvdmlkZXIgcHJvdmlkZXI7Ci0JcHVibGljIGFic3RyYWN0IE9iamVjdFtdIGdldE1vZGVscygpOwotCXB1YmxpYyBmaW5hbCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JcHVibGljIGZpbmFsIEVNRlJvb3RPYmplY3RQcm92aWRlciBnZXRFTUZSb290T2JqZWN0UHJvdmlkZXIoKXsKLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQlwdWJsaWMgRU1GTW9kZWxNYW5hZ2VyKElQcm9qZWN0IGFQcm9qZWN0LCBFTUZSb290T2JqZWN0UHJvdmlkZXIgYVByb3ZpZGVyKSB7Ci0JCXByb2plY3QgPSBhUHJvamVjdDsKLQkJcHJvdmlkZXIgPSBhUHJvdmlkZXI7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhZmZlY3RlZFByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSVByb2plY3QgYWZmZWN0ZWRQcm9qZWN0KSB7Ci0JCXByb3ZpZGVyLm5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNwb3NlKCk7Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRk1vZGVsTWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiZGExNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRU1GTW9kZWxNYW5hZ2VyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUZNb2RlbE1hbmFnZXJGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIEVNRk1vZGVsTWFuYWdlciBjcmVhdGVFTUZNb2RlbE1hbmFnZXIoSVByb2plY3QgcHJvamVjdCwgRU1GUm9vdE9iamVjdFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWJvb2xlYW4gZmxleGlibGUgPSAgKE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KSAhPSBudWxsKTsKLQkJRU1GTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCWlmIChmbGV4aWJsZSkKLQkJCW1vZGVsTWFuYWdlciA9IG5ldyBGbGV4aWJsZUVNRk1vZGVsTWFuYWdlcihwcm9qZWN0LHByb3ZpZGVyKTsKLQkJZWxzZQotCQkJbW9kZWxNYW5hZ2VyID0gbmV3IE5vbkZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyKHByb2plY3QscHJvdmlkZXIpOwotCQlyZXR1cm4gbW9kZWxNYW5hZ2VyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FTUZSb290T2JqZWN0TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRlJvb3RPYmplY3RNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MzM0NTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRlJvb3RPYmplY3RNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEVNRlJvb3RPYmplY3RNYW5hZ2VyIGltcGxlbWVudHMgRWRpdE1vZGVsTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCi0KLQotCXByaXZhdGUgZmluYWwgTWFwIHByb2plY3RFZGl0TW9kZWxzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIGZpbmFsIE1hcCBwcm9qZWN0Um9vdE9iamVjdHMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgewotCQl2b2lkIG9uUmVmcmVzaChPYmplY3QgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBFTUZSb290T2JqZWN0TWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwcm9qZWN0RWRpdE1vZGVscyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IG51bGw7Ci0JCU9iamVjdFtdIGtleXMgPSBwcm9qZWN0RWRpdE1vZGVscy5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgcHJvamVjdEVkaXRNb2RlbHMucmVtb3ZlKGtleXNbaV0pOwotCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJZWRpdE1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCWVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSb290T2JqZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCU9iamVjdCByb290T2JqZWN0ID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChwcm9qZWN0Um9vdE9iamVjdHMpIHsKLQkJCXJvb3RPYmplY3QgPSBwcm9qZWN0Um9vdE9iamVjdHMuZ2V0KHByb2plY3QpOwotCi0JCQlpZiAocm9vdE9iamVjdCA9PSBudWxsIHx8ICgoRU9iamVjdCkgcm9vdE9iamVjdCkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSBnZXRFZGl0TW9kZWxGb3JQcm9qZWN0KHByb2plY3QpOwotCQkJCWlmIChlZGl0TW9kZWwgIT0gbnVsbCkgewotCQkJCQlyb290T2JqZWN0ID0gZWRpdE1vZGVsLmdldFByaW1hcnlSb290T2JqZWN0KCk7Ci0JCQkJCXByb2plY3RSb290T2JqZWN0cy5wdXQocHJvamVjdCwgcm9vdE9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByb290T2JqZWN0OwotCX0KLQotCi0JcHJvdGVjdGVkIEVkaXRNb2RlbCBnZXRFZGl0TW9kZWxGb3JQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlFZGl0TW9kZWwgZWRpdE1vZGVsID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChwcm9qZWN0RWRpdE1vZGVscykgewotCQkJZWRpdE1vZGVsID0gKEVkaXRNb2RlbCkgcHJvamVjdEVkaXRNb2RlbHMuZ2V0KHByb2plY3QpOwotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYgKGVkaXRNb2RlbCA9PSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJYXJ0aWZhY3RFZGl0ID0gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQkJCQkJaWYgKGFydGlmYWN0RWRpdCAhPSBudWxsKSB7Ci0JCQkJCQllZGl0TW9kZWwgPSAoRWRpdE1vZGVsKSBhcnRpZmFjdEVkaXQuZ2V0QWRhcHRlcihFZGl0TW9kZWwuY2xhc3MpOwotCQkJCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkJZWRpdE1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCQkJCQkJCWFkZE1hcHBpbmcocHJvamVjdCwgZWRpdE1vZGVsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGFydGlmYWN0RWRpdCE9bnVsbCkKLQkJCQkJYXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdE1vZGVsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE1hcHBpbmcoSVByb2plY3QgcHJvamVjdCwgRWRpdE1vZGVsIGVkaXRNb2RlbCkgewotCQlwcm9qZWN0RWRpdE1vZGVscy5wdXQocHJvamVjdCwgZWRpdE1vZGVsKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyI2VkaXRNb2RlbENoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCUlQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCA9IGFuRXZlbnQuZ2V0RWRpdE1vZGVsKCkuZ2V0UHJvamVjdCgpOwotCQlzd2l0Y2ggKGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCkpIHsKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0UgOgotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5SRU1PVkVEX1JFU09VUkNFIDogewotCQkJCU9iamVjdCBvbGRSb290T2JqZWN0ID0gcHJvamVjdFJvb3RPYmplY3RzLnJlbW92ZShhZmZlY3RlZFByb2plY3QpOwotCQkJCWlmIChvbGRSb290T2JqZWN0ICE9IG51bGwpCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5TQVZFIDogewotCQkJCU9iamVjdCBvbGRSb290T2JqZWN0ID0gcHJvamVjdFJvb3RPYmplY3RzLmdldChhZmZlY3RlZFByb2plY3QpOwotCQkJCWlmIChvbGRSb290T2JqZWN0ID09IG51bGwpCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSA6Ci0JCQkJZGlzcG9zZUNhY2hlKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUxpc3RlbmVycyhJUHJvamVjdCBhUHJvamVjdCkgewotCQlmb3IgKGludCB4ID0gMDsgeCA8IGxpc3RlbmVycy5zaXplKCk7ICsreCkgewotCQkJSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgcmVmcmVzaEhhbmRsZXIgPSAoSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIpIGxpc3RlbmVycy5nZXQoeCk7Ci0JCQlyZWZyZXNoSGFuZGxlci5vblJlZnJlc2goYVByb2plY3QpOwotCQl9Ci0KLQl9Ci0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQotCQlpZiAoZGVsdGEgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlkZWx0YS5hY2NlcHQoRU1GUm9vdE9iamVjdE1hbmFnZXIudGhpcyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gc3d0ZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihzd3RlKTsKLQkJCX0gY2F0Y2ggKFNXVEVycm9yIHN3dGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Ioc3d0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJCWJvb2xlYW4gcHJvamVjdE9wZW5TdGF0ZUNoYW5nZWQgPSAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSAhPSAwKTsKLQkJCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHx8IHByb2plY3RPcGVuU3RhdGVDaGFuZ2VkKQotCQkJCQkJZGlzcG9zZUNhY2hlKChJUHJvamVjdCkgcmVzb3VyY2UpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUNhY2hlKElQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCkgewotCQlzeW5jaHJvbml6ZWQgKHByb2plY3RFZGl0TW9kZWxzKSB7Ci0JCQlwcm9qZWN0Um9vdE9iamVjdHMucmVtb3ZlKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUkVNT1ZJTkcgZWRpdCBtb2RlbDogIiArIGFmZmVjdGVkUHJvamVjdC5nZXROYW1lKCkpOwotCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIHByb2plY3RFZGl0TW9kZWxzLnJlbW92ZShhZmZlY3RlZFByb2plY3QpOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJFTU9WRUQgZWRpdCBtb2RlbCAiICsgYWZmZWN0ZWRQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCQllZGl0TW9kZWwucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlJFTEVBU0VEIGVkaXQgbW9kZWwgIiArIGFmZmVjdGVkUHJvamVjdC5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVmcmVzaEhhbmRsZXJMaXN0ZW5lcihJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChnZXRMaXN0ZW5lcnMoKSkgewotCQkJaWYgKGFMaXN0ZW5lciAhPSBudWxsICYmICFnZXRMaXN0ZW5lcnMoKS5jb250YWlucyhhTGlzdGVuZXIpKQotCQkJCWdldExpc3RlbmVycygpLmFkZChhTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVmcmVzaEhhbmRsZXJMaXN0ZW5lcihJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciBhTGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKLQkJCWxpc3RlbmVycy5yZW1vdmUoYUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDQvMTEvMjAwMSA0OjQyOjU4IFBNKQotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgamF2YS51dGlsLkxpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbGlzdGVuZXJzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRlJvb3RPYmplY3RQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0VNRlJvb3RPYmplY3RQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzk3M2M1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9FTUZSb290T2JqZWN0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAxNywgMjAwNQotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1RFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRU1GUm9vdE9iamVjdFByb3ZpZGVyIGltcGxlbWVudHMgIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3J7Ci0JcHJpdmF0ZSBmaW5hbCBIYXNoTWFwIGVtZk1vZGVsQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgZmluYWwgTGlzdCBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHVibGljIGludGVyZmFjZSBJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciB7Ci0JCXZvaWQgb25SZWZyZXNoKE9iamVjdCBlbGVtZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBFTUZSb290T2JqZWN0UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0TW9kZWxzKElQcm9qZWN0IHByb2plY3QpewotCQl0cnkgewotCQkJRU1GTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCQlzeW5jaHJvbml6ZWQgKGVtZk1vZGVsQ2FjaGUpIHsKLQkJCQltb2RlbE1hbmFnZXIgPSAoRU1GTW9kZWxNYW5hZ2VyKSBlbWZNb2RlbENhY2hlLmdldChwcm9qZWN0KTsKLQkJCQlpZiAobW9kZWxNYW5hZ2VyID09IG51bGwpIHsKLQkJCQkJbW9kZWxNYW5hZ2VyPSBFTUZNb2RlbE1hbmFnZXJGYWN0b3J5LmNyZWF0ZUVNRk1vZGVsTWFuYWdlcihwcm9qZWN0LHRoaXMpIDsKLQkJCQkJZW1mTW9kZWxDYWNoZS5wdXQocHJvamVjdCxtb2RlbE1hbmFnZXIpOwotCQkJCX0KLQkJCX0KLQkJcmV0dXJuIG1vZGVsTWFuYWdlci5nZXRNb2RlbHMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNMb2FkZWRNb2RlbHMoSVByb2plY3QgcHJvamVjdCkgewotCQlzeW5jaHJvbml6ZWQgKGVtZk1vZGVsQ2FjaGUpIHsKLQkJCXJldHVybiBlbWZNb2RlbENhY2hlLmdldChwcm9qZWN0KSAhPSBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0KLQkJaWYgKGRlbHRhICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsdGEuYWNjZXB0KEVNRlJvb3RPYmplY3RQcm92aWRlci50aGlzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0gY2F0Y2ggKFNXVEV4Y2VwdGlvbiBzd3RlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHN3dGUpOwotCQkJfSBjYXRjaCAoU1dURXJyb3Igc3d0ZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihzd3RlKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQlib29sZWFuIHByb2plY3RPcGVuU3RhdGVDaGFuZ2VkID0gKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCk7Ci0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCB8fCBwcm9qZWN0T3BlblN0YXRlQ2hhbmdlZCkgewotCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCQlkaXNwb3NlKHByb2plY3QpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwb3NlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKHByb2plY3QgPT0gbnVsbCkgcmV0dXJuOwotCQlFTUZNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gKEVNRk1vZGVsTWFuYWdlcikgZW1mTW9kZWxDYWNoZS5yZW1vdmUocHJvamVjdCk7Ci0JCWlmIChtb2RlbE1hbmFnZXIgIT0gbnVsbCkgewotCQkJbW9kZWxNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJCW1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCX0KLQl9Ci0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCUVNRk1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBudWxsOwotCQlPYmplY3RbXSBrZXlzID0gZW1mTW9kZWxDYWNoZS5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJbW9kZWxNYW5hZ2VyID0gKEVNRk1vZGVsTWFuYWdlcikgZW1mTW9kZWxDYWNoZS5yZW1vdmUoa2V5c1tpXSk7Ci0JCQlpZiAobW9kZWxNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltb2RlbE1hbmFnZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgbGlzdGVuZXJzLnNpemUoKTsgKyt4KSB7Ci0JCQlJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciByZWZyZXNoSGFuZGxlciA9IChJUmVmcmVzaEhhbmRsZXJMaXN0ZW5lcikgbGlzdGVuZXJzLmdldCh4KTsKLQkJCXJlZnJlc2hIYW5kbGVyLm9uUmVmcmVzaChhUHJvamVjdCk7Ci0JCX0KLQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRSZWZyZXNoSGFuZGxlckxpc3RlbmVyKElSZWZyZXNoSGFuZGxlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGdldExpc3RlbmVycygpKSB7Ci0JCQlpZiAoYUxpc3RlbmVyICE9IG51bGwgJiYgIWdldExpc3RlbmVycygpLmNvbnRhaW5zKGFMaXN0ZW5lcikpCi0JCQkJZ2V0TGlzdGVuZXJzKCkuYWRkKGFMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWZyZXNoSGFuZGxlckxpc3RlbmVyKElSZWZyZXNoSGFuZGxlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVycykgewotCQkJbGlzdGVuZXJzLnJlbW92ZShhTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoNC8xMS8yMDAxIDQ6NDI6NTggUE0pCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuTGlzdCBnZXRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvRmxleGlibGVFTUZNb2RlbE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9GbGV4aWJsZUVNRk1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjZjNjYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9GbGV4aWJsZUVNRk1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRmxleGlibGVFTUZNb2RlbE1hbmFnZXIgZXh0ZW5kcyBFTUZNb2RlbE1hbmFnZXIgaW1wbGVtZW50cyBFZGl0TW9kZWxMaXN0ZW5lcnsKLQotCXByaXZhdGUgTGlzdCByb290T2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1QgPSBuZXcgT2JqZWN0WzBdOwotCXByaXZhdGUgZmluYWwgTGlzdCBhcnRpZmFjdEVkaXRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgZmluYWwgTWFwIGFydGlmYWN0RWRpdFRvUm9vdE9iamVjdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFQcm9qZWN0Ci0JICogQHBhcmFtIHByb3ZpZGVyCi0JICovCi0JcHVibGljIEZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyKElQcm9qZWN0IGFQcm9qZWN0LCBFTUZSb290T2JqZWN0UHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIoYVByb2plY3QscHJvdmlkZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FTUZNb2RlbE1hbmFnZXIjZ2V0TW9kZWxzKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0TW9kZWxzKCkgewotCQl0cnkgewotCQkKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCQlpZiAoIHByb2plY3Q9PSBudWxsIHx8ICFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQotCQkJCXJldHVybiBFTVBUWV9PQkpFQ1Q7Ci0JCQkKLQkJCXN5bmNocm9uaXplZCAocm9vdE9iamVjdHMpIHsKLQkJCQlpZiAoIWlzVmFsaWQocm9vdE9iamVjdHMpKSB7Ci0JCQkJCXJvb3RPYmplY3RzID0gZ2V0Um9vdE9iamVjdHMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJaWYgKHJvb3RPYmplY3RzICE9IG51bGwpIHsKLQkJCSByZXR1cm4gcm9vdE9iamVjdHMudG9BcnJheSgpIDsKLQkJfQotCQlyZXR1cm4gRU1QVFlfT0JKRUNUOwotCQkJCQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChMaXN0IHJvb3RPYmplY3RzKSB7Ci0JCWlmIChyb290T2JqZWN0cyA9PSBudWxsIHx8IHJvb3RPYmplY3RzLnNpemUoKT09MCkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IHg9MDsgeDwgcm9vdE9iamVjdHMuc2l6ZSgpOyArK3gpIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSByb290T2JqZWN0cy5nZXQoeCk7Ci0JCQlpZiAoZU9iamVjdCAhPSBudWxsICYmIGVPYmplY3QuZVJlc291cmNlKCkgPT0gbnVsbCkgCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0Um9vdE9iamVjdHMoKSB7Ci0JICAJICBMaXN0IGFydGlmYWN0cyA9IGdldEFydGlmYWN0RWRpdHMoKTsKLQkgIAkgIExpc3QgZmxleGlibGVPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCSAgCSAgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JICAJICBFT2JqZWN0IGNvbnRlbnRNb2RlbFJvb3QgPSBudWxsOwotCSAgCSAgZm9yIChpbnQgeD0wOyB4PCBhcnRpZmFjdHMuc2l6ZSgpOyArK3gpIHsKLQkgIAkgIAkgYXJ0aWZhY3RFZGl0ID0gKEFydGlmYWN0RWRpdClhcnRpZmFjdHMuZ2V0KHgpOwotCSAgCSAgICAgY29udGVudE1vZGVsUm9vdCA9IGFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCk7Ci0JCQkgaWYgKGNvbnRlbnRNb2RlbFJvb3QgIT0gbnVsbCkgewotCQkgIAkgICAgIGZsZXhpYmxlT2JqZWN0cy5hZGQoY29udGVudE1vZGVsUm9vdCk7Ci0JCSAgCSAgICAgaWYgKCFyb290T2JqZWN0cy5jb250YWlucyhjb250ZW50TW9kZWxSb290KSkKLQkJICAJICAgIAkgcm9vdE9iamVjdHMuYWRkKGNvbnRlbnRNb2RlbFJvb3QpOwotCQkgIAkgICAgIGFydGlmYWN0RWRpdFRvUm9vdE9iamVjdC5wdXQoYXJ0aWZhY3RFZGl0LGNvbnRlbnRNb2RlbFJvb3QpOwotCQkJIH0KLQkgIAkgIH0KLQkgIAkgIHJldHVybiBmbGV4aWJsZU9iamVjdHM7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IGdldEFydGlmYWN0RWRpdHMoKSB7Ci0JCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXN5bmNocm9uaXplZCAoYXJ0aWZhY3RFZGl0cykgewotCQkJaWYgKGFydGlmYWN0RWRpdHMuc2l6ZSgpID09MCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCQkJdHJ5ewotCQkJCQlhcnRpZmFjdEVkaXQgPSBBcnRpZmFjdEVkaXQuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCQkJaWYoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJCWFydGlmYWN0RWRpdHMuYWRkKGFydGlmYWN0RWRpdCk7Ci0JCQkJCQlhcnRpZmFjdEVkaXQuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdHM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVNRk1vZGVsTWFuYWdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoYXJ0aWZhY3RFZGl0cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCB4PTA7IHg8IGFydGlmYWN0RWRpdHMuc2l6ZSgpOyArK3gpIHsKLQkJCQlBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKEFydGlmYWN0RWRpdClhcnRpZmFjdEVkaXRzLmdldCh4KTsKLQkJCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQkJYXJ0aWZhY3RFZGl0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCQlhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQotCQlyb290T2JqZWN0cy5jbGVhcigpOwotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lciNlZGl0TW9kZWxDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVkaXRNb2RlbENoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQlJUHJvamVjdCBhZmZlY3RlZFByb2plY3QgPSBhbkV2ZW50LmdldEVkaXRNb2RlbCgpLmdldFByb2plY3QoKTsKLQkJCi0JCXN3aXRjaCAoYW5FdmVudC5nZXRFdmVudENvZGUoKSkgewotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5VTkxPQURFRF9SRVNPVVJDRSA6Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlJFTU9WRURfUkVTT1VSQ0UgOiB7Ci0JCQkJT2JqZWN0IG9sZFJvb3RPYmplY3QgPSByZW1vdmVSb290T2JqZWN0KGFuRXZlbnQuZ2V0RWRpdE1vZGVsKCksYWZmZWN0ZWRQcm9qZWN0KTsKLQkJCQlnZXRSb290T2JqZWN0cygpOwotCQkJCWlmIChvbGRSb290T2JqZWN0ICE9IG51bGwpCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuU0FWRSA6IHsKLQkJCQlPYmplY3Qgb2xkUm9vdE9iamVjdCA9IGdldFJvb3RPYmplY3QoYW5FdmVudC5nZXRFZGl0TW9kZWwoKSxhZmZlY3RlZFByb2plY3QpOwotCQkJCWlmIChvbGRSb290T2JqZWN0ID09IG51bGwpCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSA6Ci0JCQkJCWRpc3Bvc2UoYW5FdmVudC5nZXRFZGl0TW9kZWwoKSxhZmZlY3RlZFByb2plY3QpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJCi0JfQotCi0JCi0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogQHBhcmFtIGFmZmVjdGVkUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRSb290T2JqZWN0KEVkaXRNb2RlbCBlZGl0TW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IGdldEFydGlmYWN0RWRpdChlZGl0TW9kZWwscHJvamVjdCk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFydGlmYWN0RWRpdFRvUm9vdE9iamVjdC5nZXQoYXJ0aWZhY3RFZGl0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdE1vZGVsCi0JICogQHBhcmFtIGFmZmVjdGVkUHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCByZW1vdmVSb290T2JqZWN0KEVkaXRNb2RlbCBlZGl0TW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IGdldEFydGlmYWN0RWRpdChlZGl0TW9kZWwscHJvamVjdCk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJcm9vdE9iamVjdHMucmVtb3ZlKGFydGlmYWN0RWRpdFRvUm9vdE9iamVjdC5nZXQoYXJ0aWZhY3RFZGl0KSk7Ci0JCQlhcnRpZmFjdEVkaXRUb1Jvb3RPYmplY3QucmVtb3ZlKGFydGlmYWN0RWRpdCk7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWZmZWN0ZWRQcm9qZWN0Ci0JICogQHBhcmFtIGVkaXRNb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNwb3NlKCBFZGl0TW9kZWwgZWRpdE1vZGVsLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBnZXRBcnRpZmFjdEVkaXQoZWRpdE1vZGVsLHByb2plY3QpOwotCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCWFydGlmYWN0RWRpdC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCWFydGlmYWN0RWRpdHMucmVtb3ZlKGFydGlmYWN0RWRpdCk7Ci0JCQlhcnRpZmFjdEVkaXRUb1Jvb3RPYmplY3QucmVtb3ZlKGFydGlmYWN0RWRpdCk7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdChFZGl0TW9kZWwgZWRpdE1vZGVsLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChhcnRpZmFjdEVkaXRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IHg9MDsgeDxhcnRpZmFjdEVkaXRzLnNpemUoKTsgKyt4KSB7Ci0JCQkJQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChBcnRpZmFjdEVkaXQpYXJ0aWZhY3RFZGl0cy5nZXQoeCk7Ci0JCQkJaWYgKGFydGlmYWN0RWRpdC5oYXNFZGl0TW9kZWwoZWRpdE1vZGVsKSkgCi0JCQkJCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCSAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9JSjJFRU5hdmlnYXRvckNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0lKMkVFTmF2aWdhdG9yQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZDBiMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0lKMkVFTmF2aWdhdG9yQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSnVsIDcsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUoyRUVOYXZpZ2F0b3JDb25zdGFudHMgewotCi0JU3RyaW5nIFZJRVdFUl9JRCA9ICJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIjsvLyROT04tTkxTLTEkIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0lKMkVFV2l6YXJkQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSUoyRUVXaXphcmRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5NDNjMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSUoyRUVXaXphcmRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkTmV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkOwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIENyZWF0aW9uIElEcyBhcmUgdXNlZCBmb3IgYWN0aXZpdHkgZmlsdGVyaW5nIGFuZCBhcyBzdWNoIGFyZSBkZWNsYXJlZCBvbiB0aGUgaW5kaXZpZHVhbAotICogd2l6YXJkcy4gQWxsIG90aGVyIElEcyBtdXN0IGJlIG1haW50YWluZWQgdG8gc3RheSBpbiBzeW5jIHdpdGggdGhlIHZhbHVlcyBmb3VuZCBpbiB0aGUgcGx1Z2luLnhtbAotICogZmlsZXMgb2YgdGhlIHJlc3BlY3RpdmUgbW9kdWxlIFVJIHBsdWdpbnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUoyRUVXaXphcmRDb25zdGFudHMgewotCi0vLwlTdHJpbmcgTkVXX0VBUl9QUk9KRUNUX1dJWkFSRF9JRCA9IEVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLldJWkFSRF9JRDsKLQotLy8JU3RyaW5nIE5FV19BUFBDTElFTlRfUFJPSkVDVF9XSVpBUkRfSUQgPSBBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZC5XSVpBUkRfSUQ7Ci0vLwotLy8JU3RyaW5nIE5FV19KQ0FfUFJPSkVDVF9XSVpBUkRfSUQgPSBDb25uZWN0b3JDb21wb25lbnRDcmVhdGlvbldpemFyZC5XSVpBUkRfSUQ7Ci0vLwotLy8JU3RyaW5nIE5FV19FSkJfUFJPSkVDVF9XSVpBUkRfSUQgPSBFSkJDb21wb25lbnRDcmVhdGlvbldpemFyZC5XSVpBUkRfSUQ7Ci0vLwotLy8JU3RyaW5nIE5FV19XRUJfUFJPSkVDVF9XSVpBUkRfSUQgPSBXZWJDb21wb25lbnRDcmVhdGlvbldpemFyZC5XSVpBUkRfSUQ7Ci0KLQlTdHJpbmcgTkVXX0VOVEVSUFJJU0VfQkVBTl9XSVpBUkRfSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnVpLnV0aWwuY3JlYXRlRUpCV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIElNUE9SVF9FQVJfV0laQVJEX0lEID0gRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBJTVBPUlRfQVBQQ0xJRU5UX1dJWkFSRF9JRCA9IEFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQlTdHJpbmcgSU1QT1JUX0NPTk5FQ1RPUl9XSVpBUkRfSUQgPSBDb25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JU3RyaW5nIElNUE9SVF9FTlRFUlBSSVNFX0JFQU5fV0laQVJEX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkLkVKQkNvbXBvbmVudEltcG9ydFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBJTVBPUlRfV0VCX01PRFVMRV9XSVpBUkRfSUQgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkNvbXBvbmVudEltcG9ydFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgRVhQT1JUX1dFQl9NT0RVTEVfV0laQVJEX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5XZWJDb21wb25lbnRFeHBvcnRXaXphcmQiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgSU1QT1JUX1VUSUxJVFlfSkFSX1dJWkFSRF9JRCA9IEoyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkTmV3LmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBFWFBPUlRfRUFSX1dJWkFSRF9JRCA9IEVBUkNvbXBvbmVudEV4cG9ydFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQlTdHJpbmcgRVhQT1JUX0FQUENMSUVOVF9XSVpBUkRfSUQgPSBBcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JU3RyaW5nIEVYUE9SVF9DT05ORUNUT1JfV0laQVJEX0lEID0gQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCVN0cmluZyBFWFBPUlRfRU5URVJQUklTRV9CRUFOX1dJWkFSRF9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZEVKQkNvbXBvbmVudEV4cG9ydFdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVBY3Rpb25Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVBY3Rpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWFhMGFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFQWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuT3BlbkoyRUVSZXNvdXJjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbk1lbnVDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBKMkVFQWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25BY3Rpb25Qcm92aWRlciAgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSVJFU09VUkNFX0NMQVNTID0gSVJlc291cmNlLmNsYXNzOwotCQotCXByaXZhdGUgT3BlbkoyRUVSZXNvdXJjZUFjdGlvbiBvcGVuQWN0aW9uOyAKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSjJFRUFjdGlvblByb3ZpZGVyKCkgewotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmFjdGlvbnMuSUNvbW1vbkFjdGlvblByb3ZpZGVyI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuZXh0ZW5zaW9ucy5OYXZpZ2F0b3JDb250ZW50U2VydmljZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlIGFDb25maWcpIHsgCi0JCW9wZW5BY3Rpb24gPSBuZXcgT3BlbkoyRUVSZXNvdXJjZUFjdGlvbigpOyAKLQkJCi0vLwkJcmVuYW1lQWN0aW9uID0gbmV3IEoyRUVSZW5hbWVBY3Rpb24oYUNvbmZpZy5nZXRWaWV3U2l0ZSgpLCBhQ29uZmlnLmdldFZpZXdTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuYWN0aW9ucy5JQ29tbW9uQWN0aW9uUHJvdmlkZXIjc2V0QWN0aW9uQ29udGV4dChvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dChBY3Rpb25Db250ZXh0IGFDb250ZXh0KSB7Ci0JCQotCQlpZiAoYUNvbnRleHQgIT0gbnVsbCAmJiBhQ29udGV4dC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFDb250ZXh0LmdldFNlbGVjdGlvbigpOwotCi0JCQlvcGVuQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLS8vCQkJcmVuYW1lQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc2VsZWN0aW9uKTsKLQotCQkJT2JqZWN0W10gYXJyYXkgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJaWYgKGlzVXRpbGl0eUphcnMoYXJyYXkpKSB7Ci0JCQkJSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIgdXRpbGl0eUphckl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJTGlzdCBuZXdTZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJCQl1dGlsaXR5SmFySXRlbVByb3ZpZGVyID0gKEoyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyKSBhcnJheVtpXTsKLQkJCQkJbmV3U2VsZWN0aW9uLmFkZEFsbCh1dGlsaXR5SmFySXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKG51bGwpKTsKLQkJCQl9Ci0JCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3U2VsZWN0aW9uKTsKLQkJCX0KLQkJCS8vZ2VuZXJpY0RlbGV0ZS5zZWxlY3Rpb25DaGFuZ2VkKGdlbmVyaWNEZWxldGUsIHNlbGVjdGlvbik7Ci0JCX0KLQkJc3VwZXIuc2V0Q29udGV4dChhQ29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5hY3Rpb25zLklDb21tb25BY3Rpb25Qcm92aWRlciNmaWxsQWN0aW9uQmFycyhvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyB0aGVBY3Rpb25CYXJzKSB7Ci0vLwkJaWYgKGdlbmVyaWNEZWxldGUuaXNFbmFibGVkKCkpCi0vLwkJCXRoZUFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLCBnZW5lcmljRGVsZXRlKTsKLQkJaWYob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkgCi0JCQl0aGVBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSUNvbW1vbkFjdGlvbkNvbnN0YW50cy5PUEVOLCBvcGVuQWN0aW9uKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuYWN0aW9ucy5JQ29tbW9uQWN0aW9uUHJvdmlkZXIjZmlsbENvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBhTWVudSkgewotCQlpZiAoZ2V0Q29udGV4dCgpPT1udWxsIHx8IGdldENvbnRleHQoKS5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpOwotCQlpZighYWRhcHRzVG9SZXNvdXJjZShzZWxlY3Rpb24udG9BcnJheSgpKSkgewotCQkJb3BlbkFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JCQlpZiAob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkKLQkJCQlhTWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBvcGVuQWN0aW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGFwdHNUb1Jlc291cmNlKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZihvYmplY3RzW2ldIGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKG9iamVjdHNbaV0gaW5zdGFuY2VvZiBJQWRhcHRhYmxlICYmICgoKElBZGFwdGFibGUpb2JqZWN0c1tpXSkuZ2V0QWRhcHRlcihJUkVTT1VSQ0VfQ0xBU1MpICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNVdGlsaXR5SmFycyhPYmplY3RbXSBpdGVtcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpdGVtc1tpXSA9PSBudWxsIHx8IGl0ZW1zW2ldLmdldENsYXNzKCkgIT0gSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIuY2xhc3MpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9IAotCSAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFQ29tcGFyYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDJhYjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAyMiwgMjAwNQotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXI7Ci0KLQotcHVibGljIGNsYXNzIEoyRUVDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQlwcml2YXRlIEoyRUVWaWV3ZXJTb3J0ZXIgajJlZVZpZXdTb3J0ZXIgPSBuZXcgSjJFRVZpZXdlclNvcnRlcigpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNjb21wYXJlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCUoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciBwcm92aWRlckhlbHBlckxlZnRBcmcgPSBudWxsOwotCQlKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIgcHJvdmlkZXJIZWxwZXJSaWdodEFyZyA9IG51bGw7Ci0KLQkJaWYgKG8xIGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJcHJvdmlkZXJIZWxwZXJMZWZ0QXJnID0gKEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgbzE7Ci0JCWlmIChvMiBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikKLQkJCXByb3ZpZGVySGVscGVyUmlnaHRBcmcgPSAoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBvMjsKLQotCi0JCS8qIGlmIGJvdGggYXJndW1lbnRzIGFyZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXJzICovCi0JCWlmIChwcm92aWRlckhlbHBlckxlZnRBcmcgIT0gbnVsbCAmJiBwcm92aWRlckhlbHBlclJpZ2h0QXJnICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvdmlkZXJIZWxwZXJMZWZ0QXJnLmdldFRleHQoKS5jb21wYXJlVG8ocHJvdmlkZXJIZWxwZXJSaWdodEFyZy5nZXRUZXh0KCkpOwotCQkvKiBpZiBleGFjdGx5IG9uZSBvZiB0aGUgYXJndW1lbnRzIGFyZSBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXJzICovCi0JCWVsc2UgaWYgKHByb3ZpZGVySGVscGVyTGVmdEFyZyAhPSBudWxsICYmIG8yIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pCi0JCQlyZXR1cm4gMTsKLQkJZWxzZSBpZiAocHJvdmlkZXJIZWxwZXJSaWdodEFyZyAhPSBudWxsICYmIG8xIGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiBqMmVlVmlld1NvcnRlci5jb21wYXJlKG51bGwsIG8xLCBvMik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLnV0aWwuQ29tcGFyYXRvciNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgSjJFRUNvbXBhcmF0b3I7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjlmYzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5NZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuRU1GUm9vdE9iamVjdFByb3ZpZGVyLklSZWZyZXNoSGFuZGxlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5wbHVnaW4uSjJFRU5hdmlnYXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRHluYW1pY0FkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSVBST0pFQ1RfQ0xBU1MgPSBJUHJvamVjdC5jbGFzczsKLQotCXByaXZhdGUgZmluYWwgRU1GUm9vdE9iamVjdFByb3ZpZGVyIHJvb3RPYmplY3RQcm92aWRlcjsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZGVsZWdhdGVDb250ZW50UHJvdmlkZXI7Ci0JcHJpdmF0ZSBNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZSBkZWxlZ2F0ZU1ldGhvZHNQcm92aWRlcjsKLQotCXByaXZhdGUgU3RyaW5nIHZpZXdlcklkID0gbnVsbDsKLQlwcml2YXRlIEFic3RyYWN0VHJlZVZpZXdlciB2aWV3ZXI7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEoyRUVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJvb3RPYmplY3RQcm92aWRlciA9IG5ldyBFTUZSb290T2JqZWN0UHJvdmlkZXIoKTsKLQkJcm9vdE9iamVjdFByb3ZpZGVyLmFkZFJlZnJlc2hIYW5kbGVyTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKMkVFQ29udGVudFByb3ZpZGVyKFN0cmluZyBhVmlld2VySWQpIHsKLQkJcm9vdE9iamVjdFByb3ZpZGVyID0gbmV3IEVNRlJvb3RPYmplY3RQcm92aWRlcigpOwotCQl1cGRhdGVDb250ZW50UHJvdmlkZXJzKGFWaWV3ZXJJZCk7Ci0JCXJvb3RPYmplY3RQcm92aWRlci5hZGRSZWZyZXNoSGFuZGxlckxpc3RlbmVyKHRoaXMpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBhbklucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oYW5JbnB1dEVsZW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGFQYXJlbnRFbGVtZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlICYmICEoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSAmJiAhKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyKQotCQkJCSYmICEoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpKSB7Ci0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoYVBhcmVudEVsZW1lbnQpOwotCi0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJLy8gVmVyaWZ5IGlmIHRoZSBtb2RlbCAqaXMgYmVpbmcqCi0JCQkJLy8gbG9hZGVkIGFuZCBqdXN0IHJldHVybiB0aGUgcGxhY2UgaG9sZGVyCi0JCQkJaWYgKExvYWRpbmdERE5vZGUuaXNCZWluZ0xvYWRlZChwcm9qZWN0KSkgewotCQkJCQljaGlsZHJlbi5hZGQoTG9hZGluZ0RETm9kZS5jcmVhdGVQbGFjZUhvbGRlcihwcm9qZWN0KSk7Ci0KLQkJCQkJLy8gVmVyaWZ5IGlmIHRoZSBtb2RlbCBoYXMgYmVlbiBsb2FkZWQsIGp1c3QgcmV0dXJuIGl0Ci0JCQkJfSBlbHNlIGlmIChyb290T2JqZWN0UHJvdmlkZXIuaGFzTG9hZGVkTW9kZWxzKHByb2plY3QpKSB7Ci0JCQkJCS8qIG1vZGVsIGFscmVhZHkgbG9hZGVkLCBqdXN0IHJldHVybiB0aGUgbW9kZWwgKi8KLQkJCQkJY2hpbGRyZW4uYWRkQWxsKEFycmF5cy5hc0xpc3Qocm9vdE9iamVjdFByb3ZpZGVyLmdldE1vZGVscyhwcm9qZWN0KSkpOwotCi0JCQkJCS8vIE90aGVyd2lzZSByZXR1cm4gYSBwbGFjZSBob2xkZXIgbm9kZSBhbmQgc3RhcnQgbG9hZGluZwotCQkJCQkvLyBqb2IKLQkJCQl9IGVsc2UgewotCQkJCQlMb2FkaW5nREROb2RlIHBsYWNlSG9sZGVyID0gTG9hZGluZ0RETm9kZS5jcmVhdGVQbGFjZUhvbGRlcihwcm9qZWN0KTsKLQkJCQkJLyoKLQkJCQkJICogd2UgbmVlZCB0byBsb2FkIHRoZSBtb2RlbDsgcG9zc2libGUgbG9uZyBydW5uaW5nCi0JCQkJCSAqIG9wZXJhdGlvbgotCQkJCQkgKi8KLQkJCQkJaWYgKExvYWRpbmdERE5vZGUuY2FuQmVnaW5Mb2FkaW5nKHByb2plY3QpKQotCQkJCQkJbmV3IExvYWRpbmdEREpvYih2aWV3ZXIsIHBsYWNlSG9sZGVyLCAoSUFkYXB0YWJsZSkgYVBhcmVudEVsZW1lbnQsIHJvb3RPYmplY3RQcm92aWRlcikuc2NoZWR1bGUoKTsKLQkJCQkJY2hpbGRyZW4uYWRkKHBsYWNlSG9sZGVyKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfSBlbHNlIGlmIChNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5wcm92aWRlc0NvbnRlbnRGb3IoYVBhcmVudEVsZW1lbnQpKQotCQkJcmV0dXJuIGRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyLmdldENoaWxkcmVuKGFQYXJlbnRFbGVtZW50KTsKLQkJZWxzZSAvKiBpZiAoaXNFTUZFZGl0T2JqZWN0KGFQYXJlbnRFbGVtZW50KSkgKi97Ci0JCQlPYmplY3RbXSBzaWJsaW5ncyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNpYmxpbmdzID0gZGVsZWdhdGVDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oYVBhcmVudEVsZW1lbnQpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKMkVFTmF2aWdhdG9yUGx1Z2luLmxvZ0Vycm9yKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsJCQl9Ci0JCQlpZiAoc2libGluZ3MgIT0gbnVsbCkKLQkJCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChzaWJsaW5ncykpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUucHJvdmlkZXNDb250ZW50Rm9yKG9iamVjdCkpCi0JCQlyZXR1cm4gZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYocGFyZW50IGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCXBhcmVudCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgb2JqZWN0KTsKLQkJfSBlbHNlIGlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXIpCi0JCQkJcGFyZW50ID0gKChCZWFuQ2xhc3NQcm92aWRlckhlbHBlcikgb2JqZWN0KS5nZXRFamIoKTsKLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlwYXJlbnQgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoKEVPYmplY3QpIG9iamVjdCk7CQotCQkJfQotCQl9IAotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXJvb3RPYmplY3RQcm92aWRlci5yZW1vdmVSZWZyZXNoSGFuZGxlckxpc3RlbmVyKHRoaXMpOwotCQlkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCXJvb3RPYmplY3RQcm92aWRlci5kaXNwb3NlKCk7Ci0JCWRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyLmRpc3Bvc2UoKTsKLQotCX0KLQotCS8qCi0JICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihlbGVtZW50KSkKLQkJCXJldHVybiBkZWxlZ2F0ZU1ldGhvZHNQcm92aWRlci5oYXNDaGlsZHJlbihlbGVtZW50KTsKLQkJLyogZWxzZSBpZiAoaXNFTUZFZGl0T2JqZWN0KGVsZW1lbnQpKSAqLwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5oYXNDaGlsZHJlbihlbGVtZW50KTsgCi0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBhVmlld2VyLCBPYmplY3QgYW5PbGRJbnB1dCwgT2JqZWN0IGFOZXdJbnB1dCkgewotCQlTdHJpbmcgbmV3Vmlld2VySWQgPSBudWxsOwotCQl2aWV3ZXIgPSAoQWJzdHJhY3RUcmVlVmlld2VyKSBhVmlld2VyOwotCQlpZiAoYVZpZXdlciBpbnN0YW5jZW9mIENvbW1vblZpZXdlcikKLQkJCW5ld1ZpZXdlcklkID0gKChDb21tb25WaWV3ZXIpIGFWaWV3ZXIpLmdldE5hdmlnYXRvckNvbnRlbnRTZXJ2aWNlKCkuZ2V0Vmlld2VySWQoKTsKLQotCQlpZiAobmV3Vmlld2VySWQgIT0gbnVsbCAmJiAodmlld2VySWQgPT0gbnVsbCB8fCAhdmlld2VySWQuZXF1YWxzKG5ld1ZpZXdlcklkKSkpCi0JCQl1cGRhdGVDb250ZW50UHJvdmlkZXJzKG5ld1ZpZXdlcklkKTsKLQotCQlkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlci5pbnB1dENoYW5nZWQoYVZpZXdlciwgYW5PbGRJbnB1dCwgYU5ld0lucHV0KTsKLQkJZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIuaW5wdXRDaGFuZ2VkKGFWaWV3ZXIsIGFuT2xkSW5wdXQsIGFOZXdJbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZpZXdlcklkMgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDb250ZW50UHJvdmlkZXJzKFN0cmluZyBhVmlld2VySWQpIHsKLQotCQkvKiBEaXNwb3NlIG9mIHRoZSBleGlzdGluZyBjb250ZW50IHByb3ZpZGVycyAqLwotCQlpZiAoZGVsZWdhdGVDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRlbGVnYXRlTWV0aG9kc1Byb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxlZ2F0ZU1ldGhvZHNQcm92aWRlci5kaXNwb3NlKCk7Ci0KLQkJLyogQ3JlYXRlIG5ldyBjb250ZW50IHByb3ZpZGVycyB1c2luZyB0aGUgbmV3IHZpZXdlciBpZCAqLwotCQlEeW5hbWljQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgRHluYW1pY0FkYXB0ZXJGYWN0b3J5KGFWaWV3ZXJJZCk7Ci0JCWRlbGVnYXRlQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJZGVsZWdhdGVNZXRob2RzUHJvdmlkZXIgPSBuZXcgTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUoYWRhcHRlckZhY3RvcnkpOwotCi0JCS8qIFJlbWVtYmVyIHRoZSB2aWV3ZXIgaWQgKi8KLQkJdmlld2VySWQgPSBhVmlld2VySWQ7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FTUZSb290T2JqZWN0TWFuYWdlci5JUmVmcmVzaEhhbmRsZXJMaXN0ZW5lciNvblJlZnJlc2goamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvblJlZnJlc2goZmluYWwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZVZpZXdlcikgewotCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpIHsKLQkJCQkoKEFic3RyYWN0VHJlZVZpZXdlcikgdmlld2VyKS5yZWZyZXNoKGVsZW1lbnQsIHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBDcmVhdGUgYW5kIHNjaGVkdWxlIGEgVUkgSm9iIHRvIHVwZGF0ZSB0aGUgTmF2aWdhdG9yIENvbnRlbnQgVmlld2VyICovCi0JCQkJSm9iIGpvYiA9IG5ldyBVSUpvYigiVXBkYXRlIHRoZSBOYXZpZ2F0b3IgQ29udGVudCBWaWV3ZXIgSm9iIikgeyAvLyROT04tTkxTLTEkCi0JCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkoKEFic3RyYWN0VHJlZVZpZXdlcikgdmlld2VyKS5yZWZyZXNoKGVsZW1lbnQsIHRydWUpOwotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUlTY2hlZHVsaW5nUnVsZSBydWxlID0gbmV3IElTY2hlZHVsaW5nUnVsZSgpIHsKLQkJCQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJCQkJCXJldHVybiBydWxlID09IHRoaXM7CQotCQkJCQl9Ci0JCQkJCXB1YmxpYyBib29sZWFuIGlzQ29uZmxpY3RpbmcoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJCQkJCXJldHVybiBydWxlID09IHRoaXM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmIChydWxlICE9IG51bGwpIHsKLQkJCQkJam9iLnNldFJ1bGUocnVsZSk7Ci0JCQkJfQotCQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUVNRkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUVNRkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MTI4MGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVFTUZBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyNSwgMjAwNAotICogIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgSjJFRUVNRkFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSVBST0pFQ1RfQ0xBU1MgPSBJUHJvamVjdC5jbGFzczsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElSRVNPVVJDRV9DTEFTUyA9IElSZXNvdXJjZS5jbGFzczsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzIElGSUxFX0NMQVNTID0gSUZpbGUuY2xhc3M7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzcyBFT0JKRUNUX0NMQVNTID0gRU9iamVjdC5jbGFzczsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgSjJFRUVNRkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeSNnZXRBZGFwdGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCWlmIChhZGFwdGVyVHlwZSA9PSBJRklMRV9DTEFTUyB8fCBhZGFwdGVyVHlwZSA9PSBJUkVTT1VSQ0VfQ0xBU1MpCi0JCQkJcmV0dXJuIFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKEVPYmplY3QpIGFkYXB0YWJsZU9iamVjdCk7Ci0JCQkvL2Vsc2UgaWYgKGFkYXB0ZXJUeXBlID09IElQUk9KRUNUX0NMQVNTKQotCQkJLy8JcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgYWRhcHRhYmxlT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3RvcnkjZ2V0QWRhcHRlckxpc3QoKQotCSAqLwotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IENsYXNzW117SVJFU09VUkNFX0NMQVNTLCBJRklMRV9DTEFTU307Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDNlMDI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWwuQ29tbW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50RXh0ZW5zaW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRHluYW1pY0FkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyBleHBlcmltZW50YWwgdW50aWwgZnVsbHkgZG9jdW1lbnRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIEoyRUVMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNvbW1vbkxhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgZGVsZWdhdGVMYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBKMkVFTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEoyRUVMYWJlbFByb3ZpZGVyKFN0cmluZyBhVmlld2VySWQpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZShhVmlld2VySWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoU3RyaW5nIGFWaWV3ZXJJZCkgewotCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgPSBuZXcgSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihuZXcgRHluYW1pY0FkYXB0ZXJGYWN0b3J5KGFWaWV3ZXJJZCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuZXh0ZW5zaW9ucy5JQ29tbW9uTGFiZWxQcm92aWRlciNnZXREZXNjcmlwdGlvbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IGFuRWxlbWVudCkgewotCQlpZiAoYW5FbGVtZW50ICE9IG51bGwgJiYgYW5FbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGFuRWxlbWVudDsKLQkJCWlmIChDb21tb25VdGlsLmlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KGVPYmosIHRydWUgLyogaW5jbHVkZSBlYXJzICovKSkgewotCQkJCUlQcm9qZWN0IHBhcmVudCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChlT2JqKTsKLQkJCQlpZihlT2JqLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhdGggPSBuZXcgUGF0aChlT2JqLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvU3RyaW5nKCkpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBwYXRoOwotCQkJCQlpbnQgc3RhcnRJbmRleCA9IHBhdGguaW5kZXhPZihwYXJlbnQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQkJcmV0dXJuIC0xID09IHN0YXJ0SW5kZXggPyBwYXRoIDogcGF0aC5zdWJzdHJpbmcoc3RhcnRJbmRleCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGdldFRleHQoZU9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGRlbGVnYXRlTGFiZWxQcm92aWRlci5lcXVhbHMob2JqKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQoKSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlTGFiZWxQcm92aWRlci5maXJlTGFiZWxQcm92aWRlckNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlKG9iamVjdCwgY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGNvbHVtbkluZGV4Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGRlbGVnYXRlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0KG9iamVjdCwgY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikKLQkJCXJldHVybiAoKEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlKQotCQkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImphcl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTG9hZGluZ0RETm9kZSkKLQkJCXJldHVybiAoKExvYWRpbmdERE5vZGUpZWxlbWVudCkuZ2V0SW1hZ2UoKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCB8fCBlbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldHVybiBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQotCQkJcmV0dXJuICgoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsZSkKLQkJCXJldHVybiAoKEZpbGUpZWxlbWVudCkuZ2V0TmFtZSgpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJcmV0dXJuICgoSVByb2plY3QpZWxlbWVudCkuZ2V0TmFtZSgpOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTG9hZGluZ0RETm9kZSkKLQkJCXJldHVybiAoKExvYWRpbmdERE5vZGUpZWxlbWVudCkuZ2V0VGV4dCgpOwotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGRlbGVnYXRlTGFiZWxQcm92aWRlci5oYXNoQ29kZSgpOwotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgaWQpIHsKLQkJaWYgKGRlbGVnYXRlTGFiZWxQcm92aWRlciAhPSBudWxsKQotCQkJcmV0dXJuIGRlbGVnYXRlTGFiZWxQcm92aWRlci5pc0xhYmVsUHJvcGVydHkob2JqZWN0LCBpZCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm90aWZpY2F0aW9uCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlTGFiZWxQcm92aWRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChkZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGVnYXRlTGFiZWxQcm92aWRlci5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZGVsZWdhdGVMYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlyZXR1cm4gZGVsZWdhdGVMYWJlbFByb3ZpZGVyLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlIGFTaXRlKSB7Ci0JCWluaXRpYWxpemUoSUoyRUVOYXZpZ2F0b3JDb25zdGFudHMuVklFV0VSX0lEKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVOYXZpZ2F0aW9uTGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVOYXZpZ2F0aW9uTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODIwZDkzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFTmF2aWdhdGlvbkxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVOYXZpZ2F0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIEoyRUVBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgewotCi0JcHVibGljIEoyRUVOYXZpZ2F0aW9uTGFiZWxQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVQcm9qZWN0RGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRVByb2plY3REZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5NjYzMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvSjJFRVByb2plY3REZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5wbHVnaW4uSjJFRU5hdmlnYXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLQotLyoqCi0gKiBKMkVFUHJvamVjdERlY29yYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSjJFRVByb2plY3REZWNvcmF0b3IgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIEVBUjsKLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgQVBQQ0xJRU5UOwotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBEWU5BTUlDV0VCOwotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBFSkI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIENPTk5FQ1RPUjsKLSAgICAgIAotICAgIC8qIFRoZSBjb25zdGFudHMgYXJlIGR1cGxpY2F0ZWQgaGVyZSB0byBhdm9pZCBwbHVnaW4gbG9hZGluZy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0ZBQ0VUID0gImpzdC5lYXIiOyAvLyROT04tTkxTLTEkIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfRkFDRVQgPSAianN0LmFwcGNsaWVudCI7IC8vJE5PTi1OTFMtMSQgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9GQUNFVCA9ICJqc3Qud2ViIjsgLy8kTk9OLU5MUy0xJCAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0ZBQ0VUID0gImpzdC5lamIiOyAvLyROT04tTkxTLTEkIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVElMSVRZX0ZBQ0VUID0gImpzdC51dGlsaXR5IjsgLy8kTk9OLU5MUy0xJCAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVE9SX0ZBQ0VUID0gImpzdC5jb25uZWN0b3IiOyAvLyROT04tTkxTLTEkIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUNfV0VCX0ZBQ0VUID0gIndzdC53ZWIiOyAvLyROT04tTkxTLTEkIAotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0RJUiA9ICJpY29ucy9mdWxsL292cjE2IjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIAotICAgIHB1YmxpYyBKMkVFUHJvamVjdERlY29yYXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGVjb3JhdGUoT2JqZWN0IGVsZW1lbnQsIElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKLSAgICAJCi0gICAgCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLSAgICAJCWVsZW1lbnQgPSAoKElKYXZhUHJvamVjdCllbGVtZW50KS5nZXRQcm9qZWN0KCk7Ci0gICAgCX0KLSAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgeyAgCi0gICAgCQotICAgICAgICAJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKLSAgICAgICAgCUltYWdlRGVzY3JpcHRvciBvdmVybGF5ID0gbnVsbDsKLQkJCWlmIChoYXNGYWNldChwcm9qZWN0LCBFQVJfRkFDRVQpKQotCQkJCW92ZXJsYXk9Z2V0RUFSKCk7Ci0JCQllbHNlIGlmIChoYXNGYWNldChwcm9qZWN0LCBBUFBDTElFTlRfRkFDRVQpKQotCQkJCW92ZXJsYXk9Z2V0QVBQQ0xJRU5UKCk7Ci0JCQllbHNlIGlmIChoYXNGYWNldChwcm9qZWN0LCBXRUJfRkFDRVQpKQotCQkJCW92ZXJsYXk9Z2V0RFlOQU1JQ1dFQigpOwotCQkJZWxzZSBpZiAoaGFzRmFjZXQocHJvamVjdCwgRUpCX0ZBQ0VUKSkKLQkJCQlvdmVybGF5PWdldEVKQigpOwotCQkJZWxzZSBpZiAoaGFzRmFjZXQocHJvamVjdCwgQ09OTkVDVE9SX0ZBQ0VUKSkKLQkJCQlvdmVybGF5PWdldENPTk5FQ1RPUigpOwotCQkJZWxzZSBpZiAoaGFzRmFjZXQocHJvamVjdCwgU1RBVElDX1dFQl9GQUNFVCkpCi0JCQkJb3ZlcmxheT1nZXREWU5BTUlDV0VCKCk7Ci0JCQllbHNlIGlmIChoYXNGYWNldChwcm9qZWN0LCBVVElMSVRZX0ZBQ0VUKSkKLQkJCQlvdmVybGF5PW51bGw7Ci0JCQkKLQkJCWlmIChvdmVybGF5ICE9IG51bGwpCi0JCQkJZGVjb3JhdGlvbi5hZGRPdmVybGF5KG92ZXJsYXkpOyAKLSAgICAgICAgfQotCX0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNGYWNldChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZmFjZXQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQocHJvamVjdCwgZmFjZXQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsgCi0JCQlKMkVFTmF2aWdhdG9yUGx1Z2luLmxvZ0Vycm9yKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLSAgICAKLSAgICAvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCWlmIChrZXkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGdpZiA9ICIvIiArIGtleSArICIuZ2lmIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoSUNPTl9ESVIpLmFwcGVuZChnaWYpOwotCQkJVVJMIGdpZkltYWdlVVJMID0gRmlsZUxvY2F0b3IuZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoSjJFRU5hdmlnYXRvclBsdWdpbi5QTFVHSU5fSUQpLCBwYXRoLCBudWxsKTsKLQkJCWlmIChnaWZJbWFnZVVSTCAhPSBudWxsKQotCQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGdpZkltYWdlVVJMKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRFQVIoKSB7Ci0gICAgCWlmIChFQVIgPT0gbnVsbCkgewotICAgIAkJRUFSID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJlbnRlcnByaXNlX2FwcF9vdnIiKTsgLy8kTk9OLU5MUy0xJAotICAgIAl9Ci0gICAgCXJldHVybiBFQVI7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRBUFBDTElFTlQoKSB7Ci0gICAgCWlmIChBUFBDTElFTlQgPT0gbnVsbCkgewotICAgIAkJQVBQQ0xJRU5UID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJjbGllbnRfYXBwX292ciIpOyAvLyROT04tTkxTLTEkCi0gICAgCX0KLSAgICAJcmV0dXJuIEFQUENMSUVOVDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldERZTkFNSUNXRUIoKSB7Ci0gICAgCWlmIChEWU5BTUlDV0VCID09IG51bGwpIHsKLSAgICAJCURZTkFNSUNXRUIgPSBnZXRJbWFnZURlc2NyaXB0b3IoIndlYl9tb2R1bGVfb3ZyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJfQotICAgIAlyZXR1cm4gRFlOQU1JQ1dFQjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEVKQigpIHsKLSAgICAJaWYgKEVKQiA9PSBudWxsKSB7Ci0gICAgCQlFSkIgPSBnZXRJbWFnZURlc2NyaXB0b3IoImVqYl9tb2R1bGVfb3ZyIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJfQotICAgIAlyZXR1cm4gRUpCOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0Q09OTkVDVE9SKCkgewotICAgIAlpZiAoQ09OTkVDVE9SID09IG51bGwpIHsKLSAgICAJCUNPTk5FQ1RPUiA9IGdldEltYWdlRGVzY3JpcHRvcigiY29ubmVjdG9yX292ciIpOyAvLyROT04tTkxTLTEkCi0gICAgCX0KLSAgICAJcmV0dXJuIENPTk5FQ1RPUjsKLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVWaWV3ZXJTb3J0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9KMkVFVmlld2VyU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MzFiZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0oyRUVWaWV3ZXJTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC51dGlsLkNvbW1vblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotCi0KLXB1YmxpYyBjbGFzcyBKMkVFVmlld2VyU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFVmlld2VyU29ydGVyLgotCSAqLwotCXB1YmxpYyBKMkVFVmlld2VyU29ydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXU1QgPSAib3JnLmVjbGlwc2Uud3N0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1QgPSAib3JnLmVjbGlwc2UuanN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHNlZSBWaWV3ZXJTb3J0ZXIjY29tcGFyZShWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkvLyBDaGVjayB0byBzZWUgaWYgZWFjaCBvYmplY3QgaXMgYSBiYXNlIFdTVCBvciBKU1QgY29yZSBjb250cmlidXRpb24KLQkJYm9vbGVhbiBlMV9pc0NvcmUgPSBpc0NvcmUoZTEpOwotCQlib29sZWFuIGUyX2lzQ29yZSA9IGlzQ29yZShlMik7Ci0JCS8vIElmIGJvdGggZWxlbWVudHMgYXJlIGZyb20gdGhlIHNhbWUgY2F0ZWdvcnksIGRvIGRlZmF1bHQgY29tcGFyaXNvbgotCQlpZiAoZTFfaXNDb3JlID09IGUyX2lzQ29yZSkKLQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLQkJLy8gSWYgZTEgaXMgY29yZSwgYnV0IG5vdCBlMiwgZTEgaXMgbGVzcyB0aGFuIGUyCi0JCWVsc2UgaWYgKGUxX2lzQ29yZSkKLQkJCXJldHVybiAtMTsKLQkJLy8gSWYgZTEgaXMgbm90IGNvcmUsIGJ1dCBlMiBpcywgZTEgaXMgZ3JlYXRlciB0aGFuIGUyCi0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQkKLQkvKioKLQkgKiBBbnkgY29udHJpYnV0aW9uIGZyb20gdGhlIGJhc2UgSlNUIG9yIFdTVCBwYWNrYWdlcyBpcyBjb25zaWRlcmVkIGNvcmUsIGV2ZXJ5dGhpbmcgZWxzZSBpcwotCSAqIGFuIGV4dGVuc2lvbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuIGlzIENvbnRyaWJ1dGlvbiBDb3JlPwotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NvcmUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJQ2xhc3MgY2xhenogPSBlbGVtZW50LmdldENsYXNzKCk7Ci0JCQlpZiAoY2xhenogIT0gbnVsbCkgewotCQkJCVBhY2thZ2UgcGFjayA9IGNsYXp6LmdldFBhY2thZ2UoKTsKLQkJCQlpZiAocGFjayAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2suZ2V0TmFtZSgpOwotCQkJCQlyZXR1cm4gcGFja2FnZU5hbWUhPW51bGwgJiYgKHBhY2thZ2VOYW1lLnN0YXJ0c1dpdGgoV1NUKSB8fCBwYWNrYWdlTmFtZS5zdGFydHNXaXRoKEpTVCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRlcnByaXNlQmVhbihPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIEVudGVycHJpc2VCZWFuOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KE9iamVjdCBvKSB7Ci0JCXJldHVybiBDb21tb25VdGlsLmlzRGVwbG95bWVudERlc2NyaXB0b3JSb290KG8pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNvcnQoT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJcmV0dXJuIChpc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChlMSkgJiYgaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoZTIpKSB8fCAoaXNFbnRlcnByaXNlQmVhbihlMSkgJiYgaXNFbnRlcnByaXNlQmVhbihlMikpIHx8ICgoZTEgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKGUyIGluc3RhbmNlb2YgSUZpbGUpKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0xvYWRpbmdEREpvYi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0xvYWRpbmdEREpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzU2ODU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9Mb2FkaW5nRERKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlcjsKLQotcHVibGljIGNsYXNzIExvYWRpbmdEREpvYiBleHRlbmRzIEpvYiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJUFJPSkVDVF9DTEFTUyA9IElQcm9qZWN0LmNsYXNzOwotCi0JcHJpdmF0ZSBFTUZSb290T2JqZWN0UHJvdmlkZXIgcm9vdE9iamVjdFByb3ZpZGVyOwotCXByaXZhdGUgTG9hZGluZ0RETm9kZSBwbGFjZUhvbGRlcjsKLQlwcml2YXRlIEFic3RyYWN0VHJlZVZpZXdlciB2aWV3ZXI7Ci0JcHJpdmF0ZSBJQWRhcHRhYmxlIHBhcmVudDsKLQotCXB1YmxpYyBMb2FkaW5nRERKb2IoQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlciwgTG9hZGluZ0RETm9kZSBwbGFjZUhvbGRlciwgSUFkYXB0YWJsZSBwYXJlbnQsIEVNRlJvb3RPYmplY3RQcm92aWRlciByb290T2JqZWN0UHJvdmlkZXIpIHsKLQkJc3VwZXIocGxhY2VIb2xkZXIuZ2V0VGV4dCgpKTsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCXRoaXMucGxhY2VIb2xkZXIgPSBwbGFjZUhvbGRlcjsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMucm9vdE9iamVjdFByb3ZpZGVyID0gcm9vdE9iamVjdFByb3ZpZGVyOwotCQlzZXRSdWxlKG5ldyBOb25Db25mbGljdGluZ1J1bGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeyAKLQotCQlMb2FkaW5nRERVSUpvYiB1cGRhdGVVSUpvYiA9IG5ldyBMb2FkaW5nRERVSUpvYih2aWV3ZXIsIHBsYWNlSG9sZGVyKTsKLQkJdXBkYXRlVUlKb2Iuc2NoZWR1bGUoKTsKLQotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAgKElQcm9qZWN0KSAgcGFyZW50LmdldEFkYXB0ZXIoSVBST0pFQ1RfQ0xBU1MpOwotCQkJT2JqZWN0W10gcm9vdE9iamVjdHMgPSAocm9vdE9iamVjdFByb3ZpZGVyICE9IG51bGwpID8gcm9vdE9iamVjdFByb3ZpZGVyLmdldE1vZGVscyhwcm9qZWN0KSA6IG51bGw7Ci0JCQlpZiAocm9vdE9iamVjdHMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IHg9MDsgeDwgcm9vdE9iamVjdHMubGVuZ3RoIDsgKyt4KSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChyb290T2JqZWN0c1t4XSk7Ci0JCQkJfQotCQkJCQotCQkJfQkJCi0JCX0gZmluYWxseSB7IAotCQkJLyogZGlzcG9zZSBvZiB0aGUgcGxhY2UgaG9sZGVyLCBjYXVzZXMgdGhlIHRlcm1pbmF0aW9uIG9mIHRoZSBhbmltYXRpb24gam9iICovCi0JCQlwbGFjZUhvbGRlci5kaXNwb3NlKCk7IAotCQkJbmV3IENsZWFyUGxhY2VIb2xkZXJKb2Iodmlld2VyLCBwbGFjZUhvbGRlciwgcGFyZW50LCBjaGlsZHJlbi50b0FycmF5KCkpLnNjaGVkdWxlKCk7Ci0JCX0KLQkJCi0JCSAKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTG9hZGluZ0RETm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0xvYWRpbmdERE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTliZWU4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTG9hZGluZ0RETm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubmF2aWdhdG9yLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5wbHVnaW4uSjJFRU5hdmlnYXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIExvYWRpbmdERE5vZGUgewotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGxvYWRpbmdPbmU7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGxvYWRpbmdUd287Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGxvYWRpbmdUaHJlZTsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgbG9hZGluZ0ZvdXI7Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQgbG9hZGluZ0ZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgcGxhY2VIb2xkZXJzID0gbmV3IEhhc2hNYXAoKTsKLQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlsb2FkaW5nT25lID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL2V0b29sMTYvbG9hZGluZzEuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxvYWRpbmdUd28gPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvZXRvb2wxNi9sb2FkaW5nMi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJbG9hZGluZ1RocmVlID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL2V0b29sMTYvbG9hZGluZzMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxvYWRpbmdGb3VyID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL2V0b29sMTYvbG9hZGluZzQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJSjJFRU5hdmlnYXRvclBsdWdpbi5sb2dFcnJvcigwLCBtc2csIGUpOwotCQkJbG9hZGluZ09uZSA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQlsb2FkaW5nVHdvID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCWxvYWRpbmdUaHJlZSA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQlsb2FkaW5nRm91ciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQl9Ci0gCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsgCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDE7Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDI7Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDM7Ci0JcHJpdmF0ZSBpbnQgY291bnQgPSAwOwotCi0JcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2VkID0gZmFsc2U7Ci0JcHJpdmF0ZSBJUHJvamVjdCBtb2RlbFByb2plY3Q7Ci0JCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBwbGFjZSBob2xkZXIgbm9kZSB0byBzaXQgaW4gdGhlIHRyZWUgdW50aWwgZGF0YSBpcyBhdmFpbGFibGUuCi0JICogVGhpcyBwbGFjZSBob2xkZXIgbm9kZSB3aWxsIGJlIGFuaW1hdGVkIGZvciB0aGUgdXNlcidzIGVuam95bWVudC4gCi0JICogIAotCSAqIEBwYXJhbSBtb2RlbEZpbGUgVGhlIG1vZGVsRmlsZSB0byBiZSBsb2FkZWQKLQkgKiBAcmV0dXJuIEEgbmV3IHVuaXF1ZSBwbGFjZSBob2xkZXIgZm9yIHRoaXMgZmlsZSBmb3IgYSBnaXZlbiBsb2FkIGN5Y2xlCi0JICovCi0JcHVibGljIHN0YXRpYyBMb2FkaW5nREROb2RlIGNyZWF0ZVBsYWNlSG9sZGVyKElQcm9qZWN0IG1vZGVsRmlsZSkgewotCQlMb2FkaW5nREROb2RlIG5vZGUgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKExvYWRpbmdERE5vZGUuY2xhc3MpIHsKLQkJCWlmKHBsYWNlSG9sZGVycy5jb250YWluc0tleShtb2RlbEZpbGUpKQotCQkJCW5vZGUgPSAoTG9hZGluZ0RETm9kZSkgcGxhY2VIb2xkZXJzLmdldChtb2RlbEZpbGUpOwotCQkJZWxzZSAJCQkKLQkJCQlwbGFjZUhvbGRlcnMucHV0KG1vZGVsRmlsZSwgbm9kZSA9IG5ldyBMb2FkaW5nREROb2RlKG1vZGVsRmlsZSkpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQkKLQlwdWJsaWMgTG9hZGluZ0RETm9kZShJUHJvamVjdCBtb2RlbCkgewotCQl0ZXh0ID0gTkxTLmJpbmQoTWVzc2FnZXMuTG9hZGluZ0RETm9kZV9Mb2FkaW5nXzBfLCBtb2RlbC5nZXROYW1lKCkpOwotCQl0ZXh0MSA9IHRleHQgICsgIi4iOyAvLyROT04tTkxTLTEkCi0JCXRleHQyID0gdGV4dCAgKyAiLi4iOyAvLyROT04tTkxTLTEkCi0JCXRleHQzID0gdGV4dCAgKyAiLi4uIjsgLy8kTk9OLU5MUy0xJAotCQltb2RlbFByb2plY3QgPSBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0KLQkJc3dpdGNoICggY291bnQgJSA0KSB7Ci0JCQljYXNlIDAgOgotCQkJCXJldHVybiB0ZXh0OwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdGV4dDE7Ci0JCQljYXNlIDIgOgotCQkJCXJldHVybiB0ZXh0MjsKLQkJCWNhc2UgMyA6Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gdGV4dDM7Ci0JCX0gCi0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlzd2l0Y2ggKCBjb3VudCA9ICgrK2NvdW50ICUgNCkpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKGxvYWRpbmdPbmUpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UobG9hZGluZ1R3byk7Ci0JCQljYXNlIDIgOgotCQkJCXJldHVybiBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShsb2FkaW5nVGhyZWUpOwotCQkJY2FzZSAzIDoKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShsb2FkaW5nRm91cik7Ci0JCX0KLQl9IAotCQotCQotCQotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiBkaXNwb3NlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3luY2hyb25pemVkIChMb2FkaW5nREROb2RlLmNsYXNzKSB7Ci0JCQlkaXNwb3NlZCA9IHRydWU7Ci0JCQlwbGFjZUhvbGRlcnMucmVtb3ZlKG1vZGVsUHJvamVjdCk7CQotCQkJbG9hZGluZ0ZpbGVzLnJlbW92ZShtb2RlbFByb2plY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRW1wbG95IGEgVGVzdCBhbmQgU2V0IChUU1QpIHByaW1pdGl2ZSB0byBlbnN1cmUgCi0JICogdGhhdCBvbmx5IGpvYiBpcyBzcGF3bmVkIHRvIGxvYWQgdGhlIG1vZGVsIGZpbGUKLQkgKiAgIAotCSAqIAotCSAqIEByZXR1cm4gVHJ1ZSBvbmx5IGlmIG5vIG90aGVyIGpvYnMgYXJlIHRyeWluZyB0byBsb2FkIHRoaXMgbW9kZWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkJlZ2luTG9hZGluZyhJUHJvamVjdCBtb2RlbFByb2plY3QpIHsKLQkJc3luY2hyb25pemVkIChMb2FkaW5nREROb2RlLmNsYXNzKSB7ICAKLQkJCWlmKGxvYWRpbmdGaWxlcy5jb250YWlucyhtb2RlbFByb2plY3QpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWxvYWRpbmdGaWxlcy5hZGQobW9kZWxQcm9qZWN0KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhIGpvYiBoYXMgcmVxdWVzdGVkIHBlcm1pc3Npb24gdG8gbG9hZCB0aGUgbW9kZWwgZmlsZSAgIAotCSAqIEBwYXJhbSBtb2RlbEZpbGUgVGhlIG1vZGVsIGZpbGUgdGhhdCBzaG91bGQgYmUgbG9hZGVkCi0JICogQHJldHVybiBUcnVlIG9ubHkgaWYgYSBqb2IgaXMgdHJ5aW5nIHRvIGxvYWQgdGhlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0JlaW5nTG9hZGVkKElQcm9qZWN0IG1vZGVsUHJvamVjdCkgewotCQlzeW5jaHJvbml6ZWQgKExvYWRpbmdERE5vZGUuY2xhc3MpIHsgIAotCQkJcmV0dXJuIGxvYWRpbmdGaWxlcy5jb250YWlucyhtb2RlbFByb2plY3QpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL0xvYWRpbmdERFVJSm9iLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTG9hZGluZ0REVUlKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkYTRjZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTG9hZGluZ0REVUlKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotCi1wdWJsaWMgY2xhc3MgTG9hZGluZ0REVUlKb2IgZXh0ZW5kcyBVSUpvYiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFTEFZID0gMjAwOwotCSAgCi0JcHJpdmF0ZSBMb2FkaW5nREROb2RlIHBsYWNlSG9sZGVyOwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXI7IAotCSAKLQlwdWJsaWMgTG9hZGluZ0REVUlKb2IoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIsIExvYWRpbmdERE5vZGUgcGxhY2VIb2xkZXIpIHsKLQkJc3VwZXIocGxhY2VIb2xkZXIuZ2V0VGV4dCgpKTsgCi0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCQl0aGlzLnBsYWNlSG9sZGVyID0gcGxhY2VIb2xkZXI7Ci0JCXNldFN5c3RlbSh0cnVlKTsKLQkJc2V0UnVsZShuZXcgTm9uQ29uZmxpY3RpbmdSdWxlKCkpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7ICAKLQotCQlpZighcGxhY2VIb2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQl2aWV3ZXIucmVmcmVzaChwbGFjZUhvbGRlciwgdHJ1ZSk7CQkJCi0JCQlzY2hlZHVsZShERUxBWSk7CQkKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTm9uQ29uZmxpY3RpbmdSdWxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTm9uQ29uZmxpY3RpbmdSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMjk5MGMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL05vbkNvbmZsaWN0aW5nUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotCi1wdWJsaWMgY2xhc3MgTm9uQ29uZmxpY3RpbmdSdWxlIGltcGxlbWVudHMgSVNjaGVkdWxpbmdSdWxlIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE5vbkNvbmZsaWN0aW5nUnVsZSBJTlNUQU5DRSA9IG5ldyBOb25Db25mbGljdGluZ1J1bGUoKTsKLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7IAotCQlyZXR1cm4gcnVsZSA9PSB0aGlzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29uZmxpY3RpbmcoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsgCi0JCXJldHVybiBydWxlID09IHRoaXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvTm9uRmxleGlibGVFTUZNb2RlbE1hbmFnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9Ob25GbGV4aWJsZUVNRk1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjEyOTljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9Ob25GbGV4aWJsZUVNRk1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIE5vbkZsZXhpYmxlRU1GTW9kZWxNYW5hZ2VyIGV4dGVuZHMgRU1GTW9kZWxNYW5hZ2VyIGltcGxlbWVudHMgRWRpdE1vZGVsTGlzdGVuZXJ7Ci0KLQlwcml2YXRlIEVkaXRNb2RlbCBlZGl0TW9kZWw7Ci0JcHJpdmF0ZSBPYmplY3Qgcm9vdE9iamVjdDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1QgPSBuZXcgT2JqZWN0WzBdOwotCS8qKgotCSAqIEBwYXJhbSBhUHJvamVjdAotCSAqIEBwYXJhbSBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBOb25GbGV4aWJsZUVNRk1vZGVsTWFuYWdlcihJUHJvamVjdCBhUHJvamVjdCwgRU1GUm9vdE9iamVjdFByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFQcm9qZWN0LCBwcm92aWRlcik7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FTUZNb2RlbE1hbmFnZXIjZ2V0TW9kZWxzKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0TW9kZWxzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCB8fCAhZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIEVNUFRZX09CSkVDVDsKLQkJCi0JCS8vc3luY2hyb25pemVkIChyb290T2JqZWN0KSB7Ci0JCQlpZiAocm9vdE9iamVjdCA9PSBudWxsIHx8ICgoRU9iamVjdCkgcm9vdE9iamVjdCkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCUVkaXRNb2RlbCBlZGl0TW9kZWwgPSBnZXRFZGl0TW9kZWwoKTsKLQkJCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCQkJcm9vdE9iamVjdCA9IGVkaXRNb2RlbC5nZXRQcmltYXJ5Um9vdE9iamVjdCgpOwotCQkJCX0KLQkJCX0KLQkJLy99Ci0JCWlmIChyb290T2JqZWN0PT1udWxsKSAKLQkJCXJldHVybiBFTVBUWV9PQkpFQ1Q7Ci0JCWVsc2UgewotCQkJT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbMV07Ci0JCQlvYmplY3RzWzBdID0gcm9vdE9iamVjdDsKLQkJCXJldHVybiBvYmplY3RzOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkVNRk1vZGVsTWFuYWdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZWRpdE1vZGVsICE9IG51bGwpIHsKLQkJCWVkaXRNb2RlbC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCWVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCQkJZWRpdE1vZGVsID0gbnVsbDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyI2VkaXRNb2RlbENoYW5nZWQob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCUlQcm9qZWN0IGFmZmVjdGVkUHJvamVjdCA9IGFuRXZlbnQuZ2V0RWRpdE1vZGVsKCkuZ2V0UHJvamVjdCgpOwotCQlzd2l0Y2ggKGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCkpIHsKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0UgOgotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5SRU1PVkVEX1JFU09VUkNFIDogCi0JCQkJaWYgKHJvb3RPYmplY3QgIT0gbnVsbCl7Ci0JCQkJCW5vdGlmeUxpc3RlbmVycyhhZmZlY3RlZFByb2plY3QpOwotCQkJICAgICB9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlNBVkUgOiB7Ci0JCQkJaWYgKHJvb3RPYmplY3QgPT0gbnVsbCkKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKGFmZmVjdGVkUHJvamVjdCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSA6Ci0JCQkJCWRpc3Bvc2UoKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JCQotCX0KLQkKLQkKLQotCXByb3RlY3RlZCBFZGl0TW9kZWwgZ2V0RWRpdE1vZGVsKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQkvL1RPRE8gZml4IHVwCi0JCS8vc3luY2hyb25pemVkIChlZGl0TW9kZWwpIHsKLS8vCQkJaWYgKGVkaXRNb2RlbCA9PSBudWxsICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLS8vCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJnZXRFZGl0TW9kZWxGb3JQcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7Ci0vLwkJCQlKMkVFTmF0dXJlIG5hdHVyZSA9IEoyRUVOYXR1cmUuZ2V0UmVnaXN0ZXJlZFJ1bnRpbWUocHJvamVjdCk7Ci0vLwkJCQlpZiAobmF0dXJlICE9IG51bGwpIHsKLS8vCQkJCQllZGl0TW9kZWwgPSBuYXR1cmUuZ2V0SjJFRUVkaXRNb2RlbEZvclJlYWQodGhpcyk7Ci0vLwkJCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0vLwkJCQkJCWVkaXRNb2RlbC5hZGRMaXN0ZW5lcih0aGlzKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJLy99Ci0JCXJldHVybiBlZGl0TW9kZWw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VDYWNoZShJUHJvamVjdCBhZmZlY3RlZFByb2plY3QpIHsKLQkJLy9zeW5jaHJvbml6ZWQgKGVkaXRNb2RlbCkgewotCQkJaWYgKGVkaXRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJZWRpdE1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCWVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCQkJCWVkaXRNb2RlbCA9IG51bGw7Ci0JCQl9Ci0JCS8vfQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0FkZEV4dGVybmFsVXRpbGl0eUphckRyb3BBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkRXh0ZXJuYWxVdGlsaXR5SmFyRHJvcEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZjYWFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkRXh0ZXJuYWxVdGlsaXR5SmFyRHJvcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25Ecm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLlJlc291cmNlRHJvcEFkYXB0ZXJBc3Npc3RhbnQ7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRFeHRlcm5hbFV0aWxpdHlKYXJEcm9wQWN0aW9uIGV4dGVuZHMgUmVzb3VyY2VEcm9wQWRhcHRlckFzc2lzdGFudCB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5uYXZpZ2F0b3IuZG5kLlJlc291cmNlRHJvcEFjdGlvbiN2YWxpZGF0ZURyb3Aob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLmRuZC5Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGludCwgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGEpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEcm9wKENvbW1vbkRyb3BBZGFwdGVyIGRyb3BBZGFwdGVyLCBPYmplY3QgdGFyZ2V0LCBpbnQgb3BlcmF0aW9uLCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKSB7Ci0JCS8vVE9ETyByZWRvIHdpdGggY29tcG9uZW50cwotLy8JCWlmIChGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotLy8JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0LCBJUHJvamVjdC5jbGFzcyk7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQpKSB7Ci0vLwkJCQkJU3RyaW5nW10gc291cmNlTmFtZXMgPSAoU3RyaW5nW10pIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLm5hdGl2ZVRvSmF2YSh0cmFuc2ZlclR5cGUpOwotLy8JCQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotLy8JCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCi0vLwkJCQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotLy8JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlTmFtZXMubGVuZ3RoOyBpKyspCi0vLwkJCQkJCWlmICghKHJlc3VsdCA9IHNvdXJjZU5hbWVzWzBdLmVuZHNXaXRoKCIuamFyIikpKWJyZWFrOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJcmV0dXJuIHJlc3VsdDsKLS8vCQkJCX0KLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLS8vCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0FkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGExNzE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5uYXZpZ2F0b3IudWkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5wbHVnaW4uSjJFRU5hdmlnYXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkVhclV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkVBUkZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25Ecm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uRHJvcEFkYXB0ZXJBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QbHVnaW5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdDsKLQotcHVibGljIGNsYXNzIEFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQgZXh0ZW5kcyBDb21tb25Ecm9wQWRhcHRlckFzc2lzdGFudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJUFJPSkVDVF9DTEFTUyA9IElQcm9qZWN0LmNsYXNzOwotCi0JcHVibGljIEFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkVHlwZShUcmFuc2ZlckRhdGEgYVRyYW5zZmVyVHlwZSkgewkKLQkJcmV0dXJuIExvY2FsU2VsZWN0aW9uVHJhbnNmZXIuZ2V0VHJhbnNmZXIoKS5pc1N1cHBvcnRlZFR5cGUoYVRyYW5zZmVyVHlwZSk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgaGFuZGxlRHJvcChDb21tb25Ecm9wQWRhcHRlciBhRHJvcEFkYXB0ZXIsIERyb3BUYXJnZXRFdmVudCBhRHJvcFRhcmdldEV2ZW50LCBmaW5hbCBPYmplY3QgYVRhcmdldCkgewotCi0JCWlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuaXNTdXBwb3J0ZWRUeXBlKGFEcm9wQWRhcHRlci5nZXRDdXJyZW50VHJhbnNmZXIoKSkpIHsKLQotCQkJZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotCQkJCi0JCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gZ2V0UHJvamVjdChhVGFyZ2V0KTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclByb2plY3QpOwotCi0JCQlKb2IgYWRkUHJvamVjdFRvRWFySm9iID0gbmV3IEpvYihnZXRKb2JUaXRsZShlYXJDb21wb25lbnQpKSB7Ci0JCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCQkJCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQcm9qZWN0IGVhclByb2plY3QgPSBnZXRQcm9qZWN0KGFUYXJnZXQpOwotCi0JCQkJCQlMaXN0IHByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJIAotCQkJCQkJZm9yIChJdGVyYXRvciBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBzZWxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IHNvdXJjZU9iamVjdCA9IHNlbGVjdGlvbkl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCQkJCUlQcm9qZWN0IHByb2plY3RUb0FkZCA9IGdldFByb2plY3Qoc291cmNlT2JqZWN0KTsKLQkJCQkJCQlpZiAocHJvamVjdFRvQWRkICE9IG51bGwpIAotCQkJCQkJCQlwcm9qZWN0cy5hZGQocHJvamVjdFRvQWRkKTsgCi0JCQkJCQl9Ci0KLQkJCQkJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gZ2V0QWRkTW9kdWxlRGF0YU1vZGVsKGVhclByb2plY3QsIHByb2plY3RzKTsKLQkJCQkJCUlVbmRvYWJsZU9wZXJhdGlvbiBkcm9wT3BlcmF0aW9uID0gZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLQkJCQkJCXN0YXR1cyA9IGRyb3BPcGVyYXRpb24uZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQotCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJCQkJc3RhdHVzID0gSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBtc2csIGUpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCQkJfTsKLQkJCXNlcnZpY2Uuc2hvd0luRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgYWRkUHJvamVjdFRvRWFySm9iKTsKLQkJCWFkZFByb2plY3RUb0VhckpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQkJYWRkUHJvamVjdFRvRWFySm9iLnNjaGVkdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVEcm9wKE9iamVjdCB0YXJnZXQsIGludCBvcGVyYXRpb24sIFRyYW5zZmVyRGF0YSB0cmFuc2ZlclR5cGUpIHsKLQotCQlpZiAoTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmlzU3VwcG9ydGVkVHlwZSh0cmFuc2ZlclR5cGUpIHx8IFBsdWdpblRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpICYmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpIHsKLQkJCQkKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJSVByb2plY3QgZWFyUHJvamVjdCA9IGdldFByb2plY3QodGFyZ2V0KTsKLQkJCQlpbnQgZWFyVmVyc2lvbiA9IGdldEVhclZlcnNpb24oZWFyUHJvamVjdCk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJSVByb2plY3QgcHJvamVjdFRvQWRkID0gZ2V0UHJvamVjdChuZXh0KTsKLQkJCQkJaWYoIChzdGF0dXMgPSB2YWxpZGF0ZVByb2plY3RNYXlCZUFkZGVkKGVhclByb2plY3QsIHByb2plY3RUb0FkZCwgZWFyVmVyc2lvbikpLmlzT0soKSkgCi0JCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlUHJvamVjdE1heUJlQWRkZWQoSVByb2plY3QgZWFyUHJvamVjdCwgSVByb2plY3QgcHJvamVjdFRvQWRkLCBpbnQgZWFyVmVyc2lvbikgewotCQkKLQkJaWYgKGVhclByb2plY3QgPT0gbnVsbCB8fCBwcm9qZWN0VG9BZGQgPT0gbnVsbCB8fCBlYXJWZXJzaW9uIDwgMCkKLQkJCXJldHVybiBKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIE1lc3NhZ2VzLkFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfQ291bGRfbm90X2FkZF9tb2R1bGVfdG9fRW50ZXJwcmlzZV8sIG51bGwpOwotCQllbHNlIGlmICghZWFyUHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJcmV0dXJuIEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgTkxTLmJpbmQoTWVzc2FnZXMuQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9UaGVfcHJvamVjdF8wX2Nhbm5vdF9iZV9hY2Nlc3NlXywgZWFyUHJvamVjdC5nZXROYW1lKCkpLCBudWxsKTsKLQkJfSBlbHNlIGlmICghcHJvamVjdFRvQWRkLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlyZXR1cm4gSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBNZXNzYWdlcy5BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X1RoZV9kcmFnZ2VkX3Byb2plY3RfY2Fubm90X2JlX2FkZGVkXywgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWFyVmVyc2lvbiA+IDE0KXsKLQkJCXJldHVybiBKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIE1lc3NhZ2VzLkFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfQ291bGRfbm90X2FkZF9tb2R1bGVfdG9fRW50ZXJwcmlzZV8sIG51bGwpOwotCQl9Ci0KLQkJSVN0YXR1cyBpc1ZhbGlkID0gdmFsaWRhdGVQcm9qZWN0VG9BZGQocHJvamVjdFRvQWRkLCBlYXJWZXJzaW9uKTsKLQkJaWYgKCFpc1ZhbGlkLmlzT0soKSkgewotCQkJcmV0dXJuIGlzVmFsaWQ7Ci0JCX0KLQkJLy8gVE9ETyBDaGVjayBpZiB0aGUgcHJvamVjdCBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZSAqLmVhcgotCQkvLyBpZiAoZWRpdE1vZGVsLmhhc01hcHBpbmdUb1Byb2plY3QocHJvamVjdFRvQWRkKSkgewotCQkvLyByZXR1cm4gZmFsc2U7Ci0JCS8vIH0gCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0JCi0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiAtMSBvbiBlcnJvciAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgaW50IGdldEVhclZlcnNpb24oSVByb2plY3QgZWFyUHJvamVjdCkgewotCQlpbnQgZWFyVmVyc2lvbiA9IC0xOwotCQkKLQkgICAgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0OwotCQl0cnkgewotCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoZWFyUHJvamVjdCk7Ci0JCQkgSVByb2plY3RGYWNldFZlcnNpb24gdmVyc2lvbiA9IGZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3RGYWNldFZlcnNpb24oRWFyVXRpbGl0aWVzLkVOVEVSUFJJU0VfQVBQTElDQVRJT05fRkFDRVQpOwotCQkJIGVhclZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludCh2ZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy9ub3RoaW5nIHRvIGRvIHZlcnNpb24gY2Fubm90IGJlIGRldGVybWluZWQgc2luY2UgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZmFjZXRlZCBwcm9qZWN0LiAKLQkJCUoyRUVOYXZpZ2F0b3JQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCXJldHVybiBlYXJWZXJzaW9uOwotCX0KLQkJCi0JLyoqCi0JICogQHBhcmFtIGZhY2V0ZWRQcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc0VhckZhY2V0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7IAotCQl9Ci0JCXJldHVybiBmYWNldGVkUHJvamVjdCAhPSBudWxsICYmIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChFQVJGYWNldFV0aWxzLkVBUl9GQUNFVCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBjYWxjdWxhdGVWYWxpZFByb2plY3ROYW1lKGZpbmFsIFN0cmluZyBvcmlnaW5hbE5hbWUpIHsgCi0KLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCVN0cmluZyB2YWxpZE5hbWUgPSBvcmlnaW5hbE5hbWU7Ci0JCWludCBjb3VudCA9IDE7Ci0JCXdoaWxlIChyb290LmdldFByb2plY3QodmFsaWROYW1lKS5leGlzdHMoKSkgewotCQkJdmFsaWROYW1lID0gb3JpZ2luYWxOYW1lICsgY291bnQrKzsKLQkJfQotCQlyZXR1cm4gdmFsaWROYW1lOwkJCQkJCi0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldEFkZE1vZHVsZURhdGFNb2RlbChJUHJvamVjdCBlYXJQcm9qZWN0LCBMaXN0IHByb2plY3RzKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YW1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQotCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJQcm9qZWN0KTsKLQkJTWFwIGNvbXBvbmVudFRvVVJJTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmlydHVhbENvbXBvbmVudCBtb2R1bGVDb21wb25lbnQgPSBudWxsOwotCQlmb3IoSXRlcmF0b3IgaXRyID0gcHJvamVjdHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKSB7Ci0JCQltb2R1bGVDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCgoSVByb2plY3QpaXRyLm5leHQoKSk7IAotCQkJY29tcG9uZW50cy5hZGQobW9kdWxlQ29tcG9uZW50KTsKLQkJCWNvbXBvbmVudFRvVVJJTWFwLnB1dChtb2R1bGVDb21wb25lbnQsIGdldERlZmF1bHRVUkkobW9kdWxlQ29tcG9uZW50KSk7IAotCQl9CQkKLQkJZGF0YW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBlYXJDb21wb25lbnQpOwotCQlkYXRhbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgY29tcG9uZW50cyk7CQkKLQkJZGF0YW1vZGVsLnNldFByb3BlcnR5KElBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCwgY29tcG9uZW50VG9VUklNYXApOwotCQlyZXR1cm4gZGF0YW1vZGVsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Sm9iVGl0bGUoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50KSB7IAotCQlyZXR1cm4gTkxTLmJpbmQoTWVzc2FnZXMuQWRkTW9kdWxlVG9FYXJEcm9wQXNzaXN0YW50X0FkZGluZ19tb2R1bGVfdG9fZWFfLCBlYXJDb21wb25lbnQuZ2V0TmFtZSgpKTsKLQl9ICAKLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVByb2plY3RUb0FkZChJUHJvamVjdCBwcm9qZWN0VG9BZGQsIGludCBlYXJWZXJzaW9uKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBwcm9qZWN0IHRvIGFkZCBpcyBub3QgYW4gRUFSIGl0c2VsZgotCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3RUb0FkZCk7ICAKLQkJCWlmKCBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoRUFSRmFjZXRVdGlscy5FQVJfRkFDRVQpICkgCi0JCQkJc3RhdHVzID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQllbHNlIAotCQkJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkKLQkJCS8vIGNoZWNrIGlmIHRoZSBwcm9qZWN0IHRvIGFkZCBpcyB3aXRoIEphdmEgRUUgdmVyc2lvbiBlcXVhbCBvciBsZXNzZXIgdGhhbiB0aGF0IG9mIHRoZSBFQVIKLQkJCVN0cmluZyB2ZXJTdHIgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFZlcnNpb24ocHJvamVjdFRvQWRkKTsKLQkJCWlmICh2ZXJTdHIgIT0gbnVsbCkgewotCQkJCWludCB2ZXJzaW9uOwotCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0VG9BZGQpKQotCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRBcHBDbGllbnRWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHZlclN0cik7Ci0JCQkJZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3RUb0FkZCkpCi0JCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydEVKQlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyU3RyKTsKLQkJCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3RUb0FkZCkpCi0JCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFdlYlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyU3RyKTsKLQkJCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdFRvQWRkKSkKLQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0Q29ubmVjdG9yVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJTdHIpOwotCQkJCWVsc2UgCi0JCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludCh2ZXJTdHIpOwotCQkJCQotCQkJCWlmICh2ZXJzaW9uID4gZWFyVmVyc2lvbikgCi0JCQkJCXN0YXR1cyA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCWVsc2UgCi0JCQkJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBlLmdldE1lc3NhZ2UoKSA6IGUudG9TdHJpbmcoKTsKLQkJCXN0YXR1cyA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgbXNnLCBlKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCQkgCi0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJUHJvamVjdCBnZXRQcm9qZWN0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkKLQkJCXByb2plY3QgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgZWxlbWVudCkuZ2V0QWRhcHRlcihJUFJPSkVDVF9DTEFTUyk7Ci0JCWVsc2UKLQkJCXByb2plY3QgPSAoSVByb2plY3QpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihlbGVtZW50LCBJUFJPSkVDVF9DTEFTUyk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCgoRU9iamVjdCkgZWxlbWVudCk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBKMkVFSXRlbVByb3ZpZGVyKSB7Ci0JCQkJSUZpbGUgYXNzb2NpYXRlZEZpbGUgPSAoKEoyRUVJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0QXNzb2NpYXRlZEZpbGUoKTsKLQkJCQlpZihhc3NvY2lhdGVkRmlsZSAhPSBudWxsKQotCQkJCQlwcm9qZWN0ID0gYXNzb2NpYXRlZEZpbGUuZ2V0UHJvamVjdCgpOwkJCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0VVJJKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJU3RyaW5nIG5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOwotCi0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQluYW1lICs9IElNb2R1bGVFeHRlbnNpb25zLkRPVF9XQVI7Ci0JCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQluYW1lICs9IElNb2R1bGVFeHRlbnNpb25zLkRPVF9FQVI7Ci0JCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQluYW1lICs9IElNb2R1bGVFeHRlbnNpb25zLkRPVF9SQVI7Ci0JCX0gZWxzZSB7Ci0JCQluYW1lICs9IElNb2R1bGVFeHRlbnNpb25zLkRPVF9KQVI7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0lNb2R1bGVFeHRlbnNpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0lNb2R1bGVFeHRlbnNpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MTlhNDIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9JTW9kdWxlRXh0ZW5zaW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZDsKLQotcHVibGljIGludGVyZmFjZSBJTW9kdWxlRXh0ZW5zaW9ucyB7Ci0KLQlTdHJpbmcgRE9UX1dBUiA9ICIud2FyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBET1RfSkFSID0iLmphciI7IC8vJE5PTi1OTFMtMSQgCi0JU3RyaW5nIERPVF9SQVIgPSAiLnJhciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRE9UX0VBUiA9ICIuZWFyIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9JbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9JbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDQ5ZTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvSW1wb3J0SjJFRU1vZHVsZURyb3BBc3Npc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLmNyZWF0aW9uLkFwcENsaWVudENvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm9qZWN0Lm9wZXJhdGlvbnMuRUpCQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuamNhLm9wZXJhdGlvbnMuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubmF2aWdhdG9yLnVpLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbi5KMkVFTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgSW1wb3J0SjJFRU1vZHVsZURyb3BBc3Npc3RhbnQgZXh0ZW5kcyBBZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50IHsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZFR5cGUoVHJhbnNmZXJEYXRhIGFUcmFuc2ZlclR5cGUpIHsgCi0JCXJldHVybiBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoYVRyYW5zZmVyVHlwZSk7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGhhbmRsZURyb3AoQ29tbW9uRHJvcEFkYXB0ZXIgYURyb3BBZGFwdGVyLCBmaW5hbCBEcm9wVGFyZ2V0RXZlbnQgYURyb3BUYXJnZXRFdmVudCwgZmluYWwgT2JqZWN0IGFUYXJnZXQpIHsJCQotCQkKLQkJaWYoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGFEcm9wQWRhcHRlci5nZXRDdXJyZW50VHJhbnNmZXIoKSkpIHsKLQkJCQotCQkJZmluYWwgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkKLQkJCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7CSAKLQkJCUpvYiBpbXBvcnRBcnRpZmFjdHNKb2IgPSBuZXcgSm9iKE1lc3NhZ2VzLkltcG9ydEoyRUVNb2R1bGVEcm9wQXNzaXN0YW50X0ltcG9ydGluZ19KYXZhX0VudGVycHJpc2VfRWRpdGlvbl9hcnRpZmFjdHMpIHsKLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CQkJCQkKLQkJCQkJCi0JCQkJCUlQcm9qZWN0IHRhcmdldEVBUlByb2plY3QgPSBnZXRQcm9qZWN0KGFUYXJnZXQpOwotCQkJCQlpZih0YXJnZXRFQVJQcm9qZWN0ICE9IG51bGwpIHsgCi0JCQkJCQkvKiBJZiB0aGlzIGlzbid0IGFuIGVhciBwcm9qZWN0LCB3ZSBjYW4ndCBhZGQgdGhlIG5ld2x5IGNyZWF0ZWQgbW9kdWxlcyB0byBpdC4gKi8KLQkJCQkJCWlmKCFoYXNFYXJGYWNldCh0YXJnZXRFQVJQcm9qZWN0KSkKLQkJCQkJCQl0YXJnZXRFQVJQcm9qZWN0ID0gbnVsbDsKLQkJCQkJfSAvKiBvdGhlcndpc2Ugd2UgYXNzdW1lIHRoZSBJV29ya3NwYWNlUm9vdCBhbmQganVzdCBkb24ndCBhZGQgdGhlIG5ldyBtb2R1bGVzIGFuIGFuIGV4aXN0aW5nIGVhciAqLwotCi0JCQkJCVN0cmluZ1tdIG5hbWVzID0gKFN0cmluZ1tdKSBhRHJvcFRhcmdldEV2ZW50LmRhdGE7Ci0JCQkJCQotCQkJCQltb25pdG9yLmJlZ2luVGFzayhNZXNzYWdlcy5JbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudF9JbXBvcnRpbmdfSmF2YV9FbnRlcnByaXNlX0VkaXRpb25fYXJ0aWZhY3RzLCBuYW1lcy5sZW5ndGgpOwotCQkJCQlmaW5hbCBNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoSjJFRU5hdmlnYXRvclBsdWdpbi5QTFVHSU5fSUQsIDAsIE1lc3NhZ2VzLkltcG9ydEoyRUVNb2R1bGVEcm9wQXNzaXN0YW50X0ltcG9ydGluZ19KYXZhX0VudGVycHJpc2VfRWRpdGlvbl9hcnRpZmFjdHMsIG51bGwpOwotCQkJCQkKLQkJCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Ym1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwKTsKLQkJCQkJSURhdGFNb2RlbCBpbXBvcnREYXRhTW9kZWwgPSBudWxsOwotCQkJCQlib29sZWFuIHBlcmZvcm1TaW1wbGVKYXJDb3B5ID0gZmFsc2U7Ci0JCQkJCUxpc3Qgc2ltcGxlSmFyc1RvQ29weUxpc3QgPSBudWxsOwotCQkJCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQkJTGlzdCBjcmVhdGVkQ29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yKGludCBpPTA7IGk8bmFtZXMubGVuZ3RoICYmICFtb25pdG9yLmlzQ2FuY2VsZWQoKTsgaSsrKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWltcG9ydERhdGFNb2RlbCA9IG51bGw7Ci0JCQkJCQkJcGVyZm9ybVNpbXBsZUphckNvcHkgPSBmYWxzZTsKLQkJCQkJCQlpbnQgc2VwYXJhdG9ySW5kZXggPSBuYW1lc1tpXS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOwotCQkJCQkJCWludCBkb3RJbmRleCA9IG5hbWVzW2ldLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQkJCQkJaWYoc2VwYXJhdG9ySW5kZXggPiAwICYmIHNlcGFyYXRvckluZGV4KzEgPCBkb3RJbmRleCkgewotCQkJCQkJCQlTdHJpbmcgZmlsZW5hbWUgPSBuYW1lc1tpXS5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXgrMSwgZG90SW5kZXgpOwotCQkJCQkJCQlpZihyb290LmdldFByb2plY3QoZmlsZW5hbWUpLmV4aXN0cygpKSB7Ci0JCQkJCQkJCQlmaWxlbmFtZSA9IGNhbGN1bGF0ZVZhbGlkUHJvamVjdE5hbWUoZmlsZW5hbWUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCVN0cmluZyBleHRlbnNpb24gPSBuYW1lc1tpXS5zdWJzdHJpbmcoZG90SW5kZXgpOwotCQkJCQkJCQlpZihJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfV0FSLmVxdWFscyhleHRlbnNpb24pKSB7Ci0JCQkJCQkJCQlpbXBvcnREYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJCQkJCX0gZWxzZSBpZihJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfUkFSLmVxdWFscyhleHRlbnNpb24pKSB7Ci0JCQkJCQkJCQlpbXBvcnREYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJCQkJCX0gZWxzZSBpZihJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfRUFSLmVxdWFscyhleHRlbnNpb24pKSB7Ci0JCQkJCQkJCQlpbXBvcnREYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJCQkJCX0gZWxzZSBpZihJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfSkFSLmVxdWFscyhleHRlbnNpb24pKSB7ICAJCQkJCQkJCQkKLQkJCQkJCQkJCUFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0Uub3BlbkFyY2hpdmUobmFtZXNbaV0pOwotCQkJCQkJCQkJCWlmKGFyY2hpdmUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkKLQkJCQkJCQkJCQkJaW1wb3J0RGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFwcENsaWVudENvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCQkJCQkJCWVsc2UgaWYoYXJjaGl2ZS5pc0VKQkphckZpbGUoKSkKLQkJCQkJCQkJCQkJaW1wb3J0RGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVKQkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQlwZXJmb3JtU2ltcGxlSmFyQ29weSA9IHRydWU7IC8vaGFuZGxlIFV0aWxpdHkgamFycyBhcyByZWd1bGFyIGphcnMuCi0JCQkJCQkJCQkJCWlmKHNpbXBsZUphcnNUb0NvcHlMaXN0ID09IG51bGwpewotCQkJCQkJCQkJCQkJc2ltcGxlSmFyc1RvQ29weUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCQkJCQlzaW1wbGVKYXJzVG9Db3B5TGlzdC5hZGQobmFtZXNbaV0pOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCQotCQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCQlpZihhcmNoaXZlICE9IG51bGwpCi0JCQkJCQkJCQkJCWFyY2hpdmUuY2xvc2UoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSAKLQkJCQkJCQkJCi0JCQkJCQkJCWlmKGltcG9ydERhdGFNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpbXBvcnREYXRhTW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgbmFtZXNbaV0pOwotCQkJCQkJCQkJaW1wb3J0RGF0YU1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIGZpbGVuYW1lKTsKLQkJCQkJCQkJCWltcG9ydERhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShzdWJtb25pdG9yLCBudWxsKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJY3JlYXRlZENvbXBvbmVudHMuYWRkKChJVmlydHVhbENvbXBvbmVudCkgaW1wb3J0RGF0YU1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQpKTsKLQkJCQkJCQkJCQotCQkJCQkJCQl9IGVsc2UgaWYoIXBlcmZvcm1TaW1wbGVKYXJDb3B5KXsKLQkJCQkJCQkJCXN0YXR1cy5hZGQoSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBOTFMuYmluZChNZXNzYWdlcy5JbXBvcnRKMkVFTW9kdWxlRHJvcEFzc2lzdGFudF9Db3VsZF9ub3RfcmVjb2duaXplX2V4dGVuc2lvbl8wXywgZXh0ZW5zaW9uKSwgbnVsbCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCX0gCi0JCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQkJc3RhdHVzLmFkZChKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIG1zZywgZSkpOwotCQkJCQkJfSAJCQkJCQkKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYodGFyZ2V0RUFSUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlMaXN0IGNyZWF0ZWRNb2R1bGVQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvcihpbnQgaT0wOyBpPGNyZWF0ZWRDb21wb25lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBjcmVhdGVkQ29tcG9uZW50cy5nZXQoaSk7CQkJCQkJCQotCQkJCQkJCS8qIElmIHRoaXMgaXNuJ3QgYW4gZWFyIHByb2plY3QsIHdlIGNhbid0IGFkZCB0aGUgbmV3bHkgY3JlYXRlZCBtb2R1bGVzIHRvIGl0LiAqLwotCQkJCQkJCWlmKCFoYXNFYXJGYWNldChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJCQljcmVhdGVkTW9kdWxlUHJvamVjdHMuYWRkKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gZ2V0QWRkTW9kdWxlRGF0YU1vZGVsKHRhcmdldEVBUlByb2plY3QsIGNyZWF0ZWRNb2R1bGVQcm9qZWN0cyk7Ci0JCQkJCQlJVW5kb2FibGVPcGVyYXRpb24gZHJvcE9wZXJhdGlvbiA9IGRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0JCQkJCQlJU3RhdHVzIGFkZFByb2plY3RzU3RhdHVzID0gbnVsbDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJYWRkUHJvamVjdHNTdGF0dXMgPSBkcm9wT3BlcmF0aW9uLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQkJCQkJaWYoYWRkUHJvamVjdHNTdGF0dXMgIT0gbnVsbCkKLQkJCQkJCQkJc3RhdHVzLmFkZChhZGRQcm9qZWN0c1N0YXR1cyk7Ci0JCQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgeyAKLQkJCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJCQkJCXN0YXR1cy5hZGQoSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBtc2csIG51bGwpKTsKLQkJCQkJCX0KLQkJCQkJCS8vY29weSB0aGUgc2ltcGxlSmFyc092ZXIKLQkJCQkJCWlmKHNpbXBsZUphcnNUb0NvcHlMaXN0ICE9IG51bGwgKXsKLQkJCQkJCQl0cnl7Ci0JCQkJCQkJCWZpbmFsIFN0cmluZyBbXSBqYXJzVG9Db3B5QXJyYXkgPSBuZXcgU3RyaW5nW3NpbXBsZUphcnNUb0NvcHlMaXN0LnNpemUoKV07Ci0JCQkJCQkJCXNpbXBsZUphcnNUb0NvcHlMaXN0LnRvQXJyYXkoamFyc1RvQ29weUFycmF5KTsKLQkJCQkJCQkJCi0JCQkJCQkJCUNvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IENvcHlGaWxlc0FuZEZvbGRlcnNPcGVyYXRpb24oc2hlbGwpOwotCQkJCQkJCQlvcGVyYXRpb24uY29weUZpbGVzSW5DdXJyZW50VGhyZWFkKGphcnNUb0NvcHlBcnJheSwgdGFyZ2V0RUFSUHJvamVjdCwgbW9uaXRvcik7Ci0JCQkJCQkJfWNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJCQkJCQlzdGF0dXMuYWRkKEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgbXNnLCBlKSk7Ci0JCQkJCQkJfSAJCi0JCQkJCQl9CQotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCX0KLQotCQkJfTsKLQkJCQotCQkJc2VydmljZS5zaG93SW5EaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBpbXBvcnRBcnRpZmFjdHNKb2IpOwotCQkJaW1wb3J0QXJ0aWZhY3RzSm9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCQlpbXBvcnRBcnRpZmFjdHNKb2Iuc2NoZWR1bGUoKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQl9Ci0JCi0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZURyb3AoT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQlpZihGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQlpZih0YXJnZXQgaW5zdGFuY2VvZiBJV29ya3NwYWNlUm9vdCkJCQotCQkJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCQllbHNlIGlmKCAocHJvamVjdCA9IGdldFByb2plY3QodGFyZ2V0KSkgIT0gbnVsbCAmJiBoYXNFYXJGYWNldChwcm9qZWN0KSkKLQkJCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0oyRUVJbXBvcnREcm9wQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL0oyRUVJbXBvcnREcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZDJjZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL2RuZC9KMkVFSW1wb3J0RHJvcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNiwgMjAwNAotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5JbXBvcnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRmlsZVRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25Ecm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklEcm9wQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BZGFwdGFiaWxpdHlVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFSW1wb3J0RHJvcEFjdGlvbiBpbXBsZW1lbnRzIElEcm9wQWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgQXJjaGl2ZU9wdGlvbnMgcmVhZE9ubHlBcmNoaXZlT3B0aW9uczsKLQotCXB1YmxpYyBKMkVFSW1wb3J0RHJvcEFjdGlvbigpIHsKLQkJcmVhZE9ubHlBcmNoaXZlT3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlyZWFkT25seUFyY2hpdmVPcHRpb25zLnNldElzUmVhZE9ubHkodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZpbGVFeGlzdHNPbkRpc2soU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsICYmIGZpbGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGZpbGVOYW1lKTsKLQkJCXJldHVybiBmaWxlLmV4aXN0cygpICYmICFmaWxlLmlzRGlyZWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHJvcChDb21tb25Ecm9wQWRhcHRlciBkcm9wQWRhcHRlciwgT2JqZWN0IHRhcmdldCwgaW50IG9wZXJhdGlvbiwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyVHlwZSkgewotCQlpZiAoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkpIHsKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzID0gKFN0cmluZ1tdKSBGaWxlVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5uYXRpdmVUb0phdmEodHJhbnNmZXJUeXBlKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsIHx8IHNvdXJjZU5hbWVzLmxlbmd0aCAhPSAxKSB7IC8vb25seSBoYW5kbGUgb25lIGZpbGUgZm9yIG5vdwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCVN0cmluZyBmaWxlTmFtZSA9IHNvdXJjZU5hbWVzWzBdOwotCQkJaWYgKCEoZmlsZU5hbWUuZW5kc1dpdGgoIi5lYXIiKSB8fCBmaWxlTmFtZS5lbmRzV2l0aCgiLmphciIpIHx8IGZpbGVOYW1lLmVuZHNXaXRoKCIud2FyIikgfHwgZmlsZU5hbWUuZW5kc1dpdGgoIi5yYXIiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICghZmlsZUV4aXN0c09uRGlzayhmaWxlTmFtZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpbnQgYXJjaGl2ZVR5cGUgPSBJbXBvcnRVdGlsLlVOS05PV047Ci0JCQlBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwotCQkJdHJ5IHsKLS8vCQkJCWFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGZpbGVOYW1lKTsKLS8vCQkJCWFyY2hpdmVUeXBlID0gSW1wb3J0VXRpbC5nZXRBcmNoaXZlVHlwZShhcmNoaXZlKTsKLS8vCQkJCVN0cmluZ1tdIHBvc3NpYmxlTmF0dXJlcyA9IG51bGw7Ci0vLwkJCQlzd2l0Y2ggKGFyY2hpdmVUeXBlKSB7Ci0vLwkJCQkJY2FzZSBJbXBvcnRVdGlsLkVBUkZJTEUgOgotLy8JCQkJCQlwb3NzaWJsZU5hdHVyZXMgPSBuZXcgU3RyaW5nW117SUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUR9OwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQljYXNlIEltcG9ydFV0aWwuRUpCSkFSRklMRSA6Ci0vLwkJCQkJCXBvc3NpYmxlTmF0dXJlcyA9IG5ldyBTdHJpbmdbXXtJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCwgSUVKQk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUR9OwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQljYXNlIEltcG9ydFV0aWwuQ0xJRU5USkFSRklMRSA6Ci0vLwkJCQkJCXBvc3NpYmxlTmF0dXJlcyA9IG5ldyBTdHJpbmdbXXtJRUFSTmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRCwgSUFwcGxpY2F0aW9uQ2xpZW50TmF0dXJlQ29uc3RhbnRzLk5BVFVSRV9JRH07Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCWNhc2UgSW1wb3J0VXRpbC5XQVJGSUxFIDoKLS8vCQkJCQkJcG9zc2libGVOYXR1cmVzID0gbmV3IFN0cmluZ1tde0lFQVJOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lELCBJV2ViTmF0dXJlQ29uc3RhbnRzLkoyRUVfTkFUVVJFX0lEfTsKLS8vCQkJCQkJYnJlYWs7Ci0vLwkJCQkJY2FzZSBJbXBvcnRVdGlsLlJBUkZJTEUgOgotLy8JCQkJCQlwb3NzaWJsZU5hdHVyZXMgPSBuZXcgU3RyaW5nW117SUVBUk5hdHVyZUNvbnN0YW50cy5OQVRVUkVfSUQsIElDb25uZWN0b3JOYXR1cmVDb25zdGFudHMuTkFUVVJFX0lEfTsKLS8vCQkJCQkJYnJlYWs7Ci0vLwkJCQkJZGVmYXVsdCA6Ci0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCX0KLS8vCi0vLwkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0LCBJUHJvamVjdC5jbGFzcyk7Ci0JCQkJLy9UT0RPIGZpeCB1cCB0byB1c2UgY29tcG9uZW50cyBhbmQgYXJ0aWZhY3QgZWRpdHMKLS8vCQkJCWlmIChudWxsICE9IHByb2plY3QpIHsKLS8vCQkJCQl0cnkgewotLy8JCQkJCQlib29sZWFuIGZvdW5kTmF0dXJlID0gZmFsc2U7Ci0vLwkJCQkJCWZvciAoaW50IGkgPSAwOyAhZm91bmROYXR1cmUgJiYgaSA8IHBvc3NpYmxlTmF0dXJlcy5sZW5ndGg7IGkrKykgewotLy8JCQkJCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKHBvc3NpYmxlTmF0dXJlc1tpXSkpIHsKLS8vCQkJCQkJCQlmb3VuZE5hdHVyZSA9IHRydWU7Ci0vLwkJCQkJCQkJSjJFRU5hdHVyZSBuYXR1cmUgPSAoSjJFRU5hdHVyZSkgcHJvamVjdC5nZXROYXR1cmUocG9zc2libGVOYXR1cmVzW2ldKTsKLS8vCQkJCQkJCQlpbnQgcHJvamVjdEoyRUVWZXJzaW9uID0gbmF0dXJlLmdldEoyRUVWZXJzaW9uKCk7Ci0vLwkJCQkJCQkJaW50IGFyY2hpdmVNb2R1bGVWZXJzaW9uID0gQXJjaGl2ZVV0aWwuZ2V0RmFzdFNwZWNWZXJzaW9uKChNb2R1bGVGaWxlKSBhcmNoaXZlKTsKLS8vCQkJCQkJCQlib29sZWFuIGZhaWwgPSBmYWxzZTsKLS8vCQkJCQkJCQlzd2l0Y2ggKGFyY2hpdmVUeXBlKSB7Ci0vLwkJCQkJCQkJCWNhc2UgSW1wb3J0VXRpbC5FQVJGSUxFIDoKLS8vCQkJCQkJCQkJY2FzZSBJbXBvcnRVdGlsLkNMSUVOVEpBUkZJTEUgOgotLy8JCQkJCQkJCQkJaWYgKHByb2plY3RKMkVFVmVyc2lvbiA8IGFyY2hpdmVNb2R1bGVWZXJzaW9uKSB7Ci0vLwkJCQkJCQkJCQkJZmFpbCA9IHRydWU7Ci0vLwkJCQkJCQkJCQl9Ci0vLwkJCQkJCQkJCQlicmVhazsKLS8vCQkJCQkJCQkJY2FzZSBJbXBvcnRVdGlsLkVKQkpBUkZJTEUgOgotLy8JCQkJCQkJCQkJaWYgKHByb2plY3RKMkVFVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCAmJiBhcmNoaXZlTW9kdWxlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8xXzFfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0gZWxzZSBpZiAocHJvamVjdEoyRUVWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEICYmIGFyY2hpdmVNb2R1bGVWZXJzaW9uID4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMF9JRCkgewotLy8JCQkJCQkJCQkJCWZhaWwgPSB0cnVlOwotLy8JCQkJCQkJCQkJfQotLy8JCQkJCQkJCQkJYnJlYWs7Ci0vLwkJCQkJCQkJCWNhc2UgSW1wb3J0VXRpbC5XQVJGSUxFIDoKLS8vCQkJCQkJCQkJCWlmIChwcm9qZWN0SjJFRVZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgJiYgYXJjaGl2ZU1vZHVsZVZlcnNpb24gPiBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEKSB7Ci0vLwkJCQkJCQkJCQkJZmFpbCA9IHRydWU7Ci0vLwkJCQkJCQkJCQl9IGVsc2UgaWYgKHByb2plY3RKMkVFVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCAmJiBhcmNoaXZlTW9kdWxlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0KLS8vCQkJCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJCQljYXNlIEltcG9ydFV0aWwuUkFSRklMRSA6Ci0vLwkJCQkJCQkJCQlpZiAocHJvamVjdEoyRUVWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSB7Ci0vLwkJCQkJCQkJCQkJZmFpbCA9IHRydWU7Ci0vLwkJCQkJCQkJCQl9IGVsc2UgaWYgKHByb2plY3RKMkVFVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCAmJiBhcmNoaXZlTW9kdWxlVmVyc2lvbiA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQpIHsKLS8vCQkJCQkJCQkJCQlmYWlsID0gdHJ1ZTsKLS8vCQkJCQkJCQkJCX0KLS8vCQkJCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCQlpZiAoZmFpbCkgewotLy8JCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJCXJldHVybiB0cnVlOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJCWlmICghZm91bmROYXR1cmUpIHsKLS8vCQkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCQkJfQotLy8JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQkJfQotLy8JCQkJfQotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKG51bGwgIT0gYXJjaGl2ZSAmJiBhcmNoaXZlLmlzT3BlbigpKSB7Ci0JCQkJCWFyY2hpdmUuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLk5hdmlnYXRvckRyb3BBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MubmF2aWdhdG9yLmRuZC5Db21tb25OYXZpZ2F0b3JEcm9wQWRhcHRlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKE9iamVjdCBzb3VyY2UsIE9iamVjdCB0YXJnZXQpIHsKLQkJLy9UT0RPIGZpeCB1cCBkcmFnIGFuZCBkcm9wIHRyYW5zZmVyCi0JCVRyYW5zZmVyRGF0YSBjdXJyZW50VHJhbnNmZXIgPSBudWxsOyAvL2Ryb3BBZGFwdGVyLmdldEN1cnJlbnRUcmFuc2ZlcigpOwotCQlpZiAoRmlsZVRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGN1cnJlbnRUcmFuc2ZlcikpIHsKLQkJCWZpbmFsIFN0cmluZ1tdIGZpbGVOYW1lcyA9IChTdHJpbmdbXSkgc291cmNlOwotCQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gZmlsZU5hbWVzWzBdOwotCQkJRGF0YU1vZGVsV2l6YXJkIHdpemFyZCA9IG51bGw7Ci0JCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IG51bGw7Ci0KLQkJCWludCBhcmNoaXZlVHlwZSA9IEltcG9ydFV0aWwuVU5LTk9XTjsKLQkJCUFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGZpbGVOYW1lKTsKLQkJCQlhcmNoaXZlVHlwZSA9IEltcG9ydFV0aWwuZ2V0QXJjaGl2ZVR5cGUoYXJjaGl2ZSk7Ci0JCQkJc3dpdGNoIChhcmNoaXZlVHlwZSkgewotCQkJCQljYXNlIEltcG9ydFV0aWwuRUFSRklMRSA6Ci0JCQkJCQlkYXRhTW9kZWwgPSBudWxsOy8vbmV3IEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW1wb3J0VXRpbC5FSkJKQVJGSUxFIDoKLQkJCQkJCWRhdGFNb2RlbCA9IG51bGw7Ly9uZXcgRUpCTW9kdWxlSW1wb3J0RGF0YU1vZGVsKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJbXBvcnRVdGlsLkNMSUVOVEpBUkZJTEUgOgotCQkJCQkJZGF0YU1vZGVsID0gbnVsbDsvL25ldyBBcHBDbGllbnRNb2R1bGVJbXBvcnREYXRhTW9kZWwoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIEltcG9ydFV0aWwuV0FSRklMRSA6Ci0JCQkJCQlkYXRhTW9kZWwgPSBudWxsOy8vbmV3IFdlYk1vZHVsZUltcG9ydERhdGFNb2RlbCgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSW1wb3J0VXRpbC5SQVJGSUxFIDoKLQkJCQkJCWRhdGFNb2RlbCA9IG51bGw7Ly9uZXcgQ29ubmVjdG9yTW9kdWxlSW1wb3J0RGF0YU1vZGVsKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKG51bGwgIT0gYXJjaGl2ZSAmJiBhcmNoaXZlLmlzT3BlbigpKSB7Ci0JCQkJCWFyY2hpdmUuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCBmaWxlTmFtZSk7Ci0KLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcih0YXJnZXQsIElQcm9qZWN0LmNsYXNzKTsKLQkJCWlmIChudWxsICE9IHByb2plY3QpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoYXJjaGl2ZVR5cGUgPT0gSW1wb3J0VXRpbC5FQVJGSUxFICkgewotCQkJCQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX0NPTVBPTkVOVF9OQU1FLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJCQlkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlzd2l0Y2ggKGFyY2hpdmVUeXBlKSB7Ci0JCQkJY2FzZSBJbXBvcnRVdGlsLkVBUkZJTEUgOgotCQkJCQl3aXphcmQgPSBudWxsOy8vbmV3IEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydFdpemFyZCgoRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsKSBkYXRhTW9kZWwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEltcG9ydFV0aWwuRUpCSkFSRklMRSA6Ci0JCQkJCXdpemFyZCA9IG51bGw7Ly9uZXcgRUpCTW9kdWxlSW1wb3J0V2l6YXJkKChFSkJNb2R1bGVJbXBvcnREYXRhTW9kZWwpIGRhdGFNb2RlbCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSW1wb3J0VXRpbC5DTElFTlRKQVJGSUxFIDoKLQkJCQkJd2l6YXJkID0gbnVsbDsvL25ldyBBcHBDbGllbnRNb2R1bGVJbXBvcnRXaXphcmQoKEFwcENsaWVudE1vZHVsZUltcG9ydERhdGFNb2RlbCkgZGF0YU1vZGVsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJbXBvcnRVdGlsLldBUkZJTEUgOgotCQkJCQl3aXphcmQgPSBudWxsOy8vbmV3IFdlYk1vZHVsZUltcG9ydFdpemFyZCgoV2ViTW9kdWxlSW1wb3J0RGF0YU1vZGVsKSBkYXRhTW9kZWwpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEltcG9ydFV0aWwuUkFSRklMRSA6Ci0JCQkJCXdpemFyZCA9IG51bGw7Ly9uZXcgQ29ubmVjdG9yTW9kdWxlSW1wb3J0V2l6YXJkKChDb25uZWN0b3JNb2R1bGVJbXBvcnREYXRhTW9kZWwpIGRhdGFNb2RlbCk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAobnVsbCAhPSB3aXphcmQpIHsKLQkJCQkvL1RPRE8gZml4IHVwIHdpemFyZCBmb3IgZHJhZyBhbmQgZHJvcAotLy8JCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLS8vCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvTW9kdWxlSWRlbnRpZmllclNlcmlhbGl6ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpL2oyZWUtbmF2aWdhdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL25hdmlnYXRvci9pbnRlcm5hbC9kbmQvTW9kdWxlSWRlbnRpZmllclNlcmlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczYzI4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvZG5kL01vZHVsZUlkZW50aWZpZXJTZXJpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5BZGFwdGFiaWxpdHlVdGlsaXR5OwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIG1kZWxkZXIKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZUlkZW50aWZpZXJTZXJpYWxpemVyIHsKLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLklTZXJpYWxpemVyI3RvQnl0ZUFycmF5KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheShPYmplY3QgZGF0YSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIoZGF0YSwgSVByb2plY3QuY2xhc3MpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKQotCQkJcmV0dXJuIHByb2plY3QuZ2V0TmFtZSgpLmdldEJ5dGVzKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5uYXZpZ2F0b3IuZG5kLklTZXJpYWxpemVyI2Zyb21CeXRlQXJyYXkoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZnJvbUJ5dGVBcnJheShieXRlW10gZGF0YSkgewotCQlTdHJpbmcgbmFtZSA9IG5ldyBTdHJpbmcoZGF0YSk7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvajJlZS1uYXZpZ2F0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvbmF2aWdhdG9yL2ludGVybmFsL3BsdWdpbi9KMkVFTmF2aWdhdG9yUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvcGx1Z2luL0oyRUVOYXZpZ2F0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmNzFkOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9qMmVlLW5hdmlnYXRvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9uYXZpZ2F0b3IvaW50ZXJuYWwvcGx1Z2luL0oyRUVOYXZpZ2F0b3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwucGx1Z2luOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgSjJFRU5hdmlnYXRvclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBKMkVFTmF2aWdhdG9yUGx1Z2luIHBsdWdpbjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OUyA9ICJpY29ucy8iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGltYWdlczsKLQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBKMkVFTmF2aWdhdG9yUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEoyRUVOYXZpZ2F0b3JQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJaW1hZ2VzID0gbmV3IEltYWdlUmVnaXN0cnkoRGlzcGxheS5nZXREZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gaW1hZ2VzLmdldERlc2NyaXB0b3IocmVsYXRpdmVQYXRoKTsKLQkJaWYoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlkZXNjcmlwdG9yID0gaW1hZ2VzLmdldERlc2NyaXB0b3IocmVsYXRpdmVQYXRoKTsKLQkJCQlpZihkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQkJVVJMIGltYWdlVXJsID0gRmlsZUxvY2F0b3IuZmluZChnZXRCdW5kbGUoKSwgbmV3IFBhdGgoSUNPTlMrcmVsYXRpdmVQYXRoKSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCQkJZGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVXJsKTsKLQkJCQl9IAotCQkJfQotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yOyAKLQl9Ci0JCi0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7IAotCi0JCUltYWdlIGltYWdlID0gaW1hZ2VzLmdldChkZXNjcmlwdG9yLnRvU3RyaW5nKCkpOwkJCi0JCWlmKGltYWdlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWltYWdlID0gaW1hZ2VzLmdldChkZXNjcmlwdG9yLnRvU3RyaW5nKCkpOwotCQkJCWlmKGltYWdlID09IG51bGwpIHsgCi0JCQkJCWltYWdlcy5wdXQoZGVzY3JpcHRvci50b1N0cmluZygpLCAoaW1hZ2UgPSBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKHRydWUpKSk7Ci0JCQkJfSAKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7IAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCWltYWdlcy5kaXNwb3NlKCk7Ci0JfQotCQotCi0JLyoqCi0JICogUmVjb3JkIGFuIGVycm9yIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBhbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBhbkV4Y2VwdGlvbikgewotCQlnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotCQkJCWNyZWF0ZUVycm9yU3RhdHVzKGFDb2RlLCBhTWVzc2FnZSwgYW5FeGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBtZXNzYWdlIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBhQ29kZQotCSAqIEBwYXJhbSBhTWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBzZXZlcml0eSwgaW50IGFDb2RlLCBTdHJpbmcgYU1lc3NhZ2UsCi0JCQlUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWxvZyhjcmVhdGVTdGF0dXMoc2V2ZXJpdHksIGFDb2RlLCBhTWVzc2FnZSwgZXhjZXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogUmVjb3JkIGEgc3RhdHVzIGFnYWluc3QgdGhpcyBwbHVnaW4ncyBsb2cuIAotCSAqIAotCSAqIEBwYXJhbSBhU3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIGFTdGF0dXMpIHsKLQkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhhU3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGx1Z2luLgotCSAqICAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHJldHVybiBBIHN0YXR1cyBjb25maWd1cmVkIHdpdGggdGhpcyBwbHVnaW4ncyBpZCBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIGludCBhQ29kZSwKLQkJCVN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwKLQkJCQlhTWVzc2FnZSAhPSBudWxsID8gYU1lc3NhZ2UgOiAiTm8gbWVzc2FnZS4iLCBleGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gQSBzdGF0dXMgY29uZmlndXJlZCB3aXRoIHRoaXMgcGx1Z2luJ3MgaWQgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyNWNhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotUGx1Z2luLm5hbWU9SjJFRSBFeHRlbnNpb25zIHRvIENvbW1vbiBOYXZpZ2F0b3IKLVBsdWdpbi5wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLVBsdWdpbi5kZXNjcmlwdGlvbj1Db250YWlucyBKMkVFIEV4dGVuc2lvbnMgYnVpbHQgb24gdGhlIENvbW1vbiBOYXZpZ2F0b3IgRnJhbWV3b3JrCi1qMmVlPUoyRUUKLWoyZWUudmlld191aV89UHJvamVjdCBFeHBsb3JlciAKLWoyZWUuY2F0ZWdvcnlfdWlfPUoyRUUKLUVudGVycHJpc2VfQXBwbGljYXRpb25zPUVudGVycHJpc2UgQXBwbGljYXRpb25zCi1BcHBsaWNhdGlvbl9DbGllbnRfUHJvamVjdHM9QXBwbGljYXRpb24gQ2xpZW50IFByb2plY3RzCi1Db25uZWN0b3JfUHJvamVjdHM9Q29ubmVjdG9yIFByb2plY3RzCi1FSkJfUHJvamVjdHM9RUpCIFByb2plY3RzCi1XZWJfUHJvamVjdHM9RHluYW1pYyBXZWIgUHJvamVjdHMKLU90aGVyX1Byb2plY3RzPU90aGVyIFByb2plY3RzCi1KMkVFX0FkZF9Nb2R1bGU9SjJFRSBBZGQgTW9kdWxlCi1BZGRzX0oyRUVfbW9kdWxlc190b19FQVJfcHJvamVjdHM9QWRkcyBKMkVFIG1vZHVsZXMgdG8gRUFSIHByb2plY3RzCi1KMkVFX0FkZF9VdGlsaXR5X0phcj1KMkVFIEFkZCBVdGlsaXR5IEphcgotQWRkc19VdGlsaXR5X0phcnNfdG9fRUFSX3Byb2plY3RzPUFkZHMgVXRpbGl0eSBKYXJzIHRvIEVBUiBwcm9qZWN0cwotSjJFRV9VdGlsaXR5X0phcl9JbXBvcnQ9SjJFRSBVdGlsaXR5IEphciBJbXBvcnQKLUltcG9ydF9hX2phcl9maWxlX1VJXz1JbXBvcnQgYSBqYXIgZmlsZSBpbnRvIGFuIEVBUiBwcm9qZWN0IGFzIGEgSjJFRSBVdGlsaXR5IEphcgotSjJFRV9JbXBvcnQ9SjJFRSBJbXBvcnQKLUoyRUVfSU1QT1JUX01FU1NBR0U9SW1wb3J0cyBKMkVFIGFydGlmYWN0czogRUFScywgRUpCIEphcnMsIEFwcGxpY2F0aW9uIENsaWVudCBKYXJzLCBSQVJzIGFuZCBXQVJzCi1qMmVlUHJvamVjdERlY29yYXRvcj1KMkVFIFByb2plY3QgRGVjb3JhdG9yCi1qMmVlUHJvamVjdERlY29yYXRvci5kZXNjcmlwdGlvbj1BZGRzIGEgdmVyc2lvbiBkZWNvcmF0b3IgdG8gSjJFRSBwcm9qZWN0cy4KLWV4dGVuc2lvbi5qMmVlLm5hbWU9SjJFRSBEZXBsb3ltZW50IERlc2NyaXB0b3JzCi1leHRlbnNpb24uYXBwbGljYXRpb24ubmFtZT1KMkVFIEFwcGxpY2F0aW9uIERlcGxveW1lbnQgRGVzY3JpcHRvcnMKLWV4dGVuc2lvbi5hcHBjbGllbnQubmFtZT1KMkVFIEFwcGxpY2F0aW9uIENsaWVudCBEZXBsb3ltZW50IERlc2NyaXB0b3JzCi1leHRlbnNpb24uY29ubmVjdG9yLm5hbWU9SjJFRSBDb25uZWN0b3IgRGVwbG95bWVudCBEZXNjcmlwdG9ycwotZXh0ZW5zaW9uLmVqYi5uYW1lPUoyRUUgRUpCIERlcGxveW1lbnQgRGVzY3JpcHRvcnMKLWV4dGVuc2lvbi53ZWIubmFtZT1KMkVFIFdlYiBEZXBsb3ltZW50IERlc2NyaXB0b3JzCi1maWx0ZXIuamV0ZW1pdHRlcnMubmFtZT0uSkVURW1pdHRlcnMKLWZpbHRlci5qZXRlbWl0dGVycy5kZXNjcmlwdGlvbj1IaWRlIC5KRVRFbWl0dGVycyBwcm9qZWN0Ci1QUk9CTEVNX01BUktFUl9MQUJFTF9SRVNPVVJDRV9ERUNPUkFUT1I9UHJvYmxlbSBNYXJrZXIgUmVzb3VyY2UgRGVjb3JhdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhMmY2Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgCQkgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiPgotICAgICAgPHZpZXdlckNvbnRlbnRCaW5kaW5nCi0gICAgICAgICB2aWV3ZXJJZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciI+Ci0gICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49Im9yZy5lY2xpcHNlLmpzdC5uYXZpZ2F0b3IuajJlZS51aS4qIi8+Ci0gICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5maWx0ZXJzLioiLz4KLSAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L3ZpZXdlckNvbnRlbnRCaW5kaW5nPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0JPG5hdmlnYXRvckNvbnRlbnQgbmFtZT0iJWV4dGVuc2lvbi5hcHBsaWNhdGlvbi5uYW1lIgotCQlwcmlvcml0eT0iaGlnaGVzdCIgaWNvbj0iaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZiIKLQkJYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIgotCQljb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FQVJDb250ZW50UHJvdmlkZXIiCi0JCWxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFTGFiZWxQcm92aWRlciIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5uYXZpZ2F0b3IuajJlZS51aS5FQVJERENvbnRlbnQiPgotCQk8dHJpZ2dlclBvaW50cz4KLQkJCTxvcj4KLQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0iamF2YS5pby5GaWxlIiAvPgotCQkJCTxhbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQkJPG9yPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJjb21tb24ueG1pIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJhcHBsaWNhdGlvbi54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9Im1vZHVsZW1hcC54bWkiIC8+Ci0JCQkJCTwvb3I+Ci0JCQkJPC9hbmQ+Ci0JCQkJPGFuZD4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqc3QuZWFyOjEuNF0iIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPgotCQkJPC9vcj4KLQkJPC90cmlnZ2VyUG9pbnRzPgotCQk8IS0tICBUaGUgcG9zc2libGVDaGlsZHJlbiBpcyBtb3JlIHZlcmJvc2UgdG8gYWxsb3cgdGhlIGRyb3AgaGFuZGxlcnMgdG8gYmUgaW52b2tlZCBmb3IgCi0JCQljaGlsZHJlbiBub3QgcHJvdmlkZWQgYnkgdGhpcyBleHRlbnNpb24KLQkJLS0+Ci0JCTxwb3NzaWJsZUNoaWxkcmVuPgotCQkJPG9yPgotCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLmlvLkZpbGUiIC8+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJPG9yPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVqYiIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QudXRpbGl0eSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5hcHBjbGllbnQiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmNvbm5lY3RvciIgLz4KLQkJCQkJPC9vcj4KLQkJCQk8L2FkYXB0PgotCQkJCTxhbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQkJPG9yPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJjb21tb24ueG1pIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJhcHBsaWNhdGlvbi54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImNsaWVudC54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9Im1vZHVsZW1hcC54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImVqYi54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImpjYS54bWkiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9IndlYmFwcGxpY2F0aW9uLnhtaSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0ianNwLnhtaSIgLz4KLQkJCQkJPC9vcj4KLQkJCQk8L2FuZD4KLQkJCTwvb3I+Ci0JCTwvcG9zc2libGVDaGlsZHJlbj4KLQkJPGNvbW1vblNvcnRlcgotCQkgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5BcHBsaWNhdGlvblZpZXdlclNvcnRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuQXBwbGljYXRpb25WaWV3ZXJTb3J0ZXIiIC8+Ci0JCTwhLS0gIEhhbmRsZSBvcGVuIHJlcXVlc3RzIC0tPgotCQk8YWN0aW9uUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUFjdGlvblByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5FQVJBY3Rpb25Qcm92aWRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCQl2YWx1ZT0iY29tbW9uLnhtaSIgLz4KLQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCQl2YWx1ZT0iYXBwbGljYXRpb24ueG1pIiAvPgotCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJCXZhbHVlPSJtb2R1bGVtYXAueG1pIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUl0ZW1Qcm92aWRlciIgLz4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2FjdGlvblByb3ZpZGVyPgotCQk8ZHJvcEFzc2lzdGFudAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQuQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuQWRkTW9kdWxlc1RvRUFSIj4KLQkJCTxwb3NzaWJsZURyb3BUYXJnZXRzPgotCQkJCTxvcj4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQk8L2FkYXB0PgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJPC9vcj4KLQkJCTwvcG9zc2libGVEcm9wVGFyZ2V0cz4KLQkJPC9kcm9wQXNzaXN0YW50PgotCQk8ZHJvcEFzc2lzdGFudAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5kbmQuSW1wb3J0SjJFRU1vZHVsZURyb3BBc3Npc3RhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLkltcG9ydEoyRUVNb2R1bGUiPgotCQkJPHBvc3NpYmxlRHJvcFRhcmdldHM+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9vcj4KLQkJCTwvcG9zc2libGVEcm9wVGFyZ2V0cz4KLQkJPC9kcm9wQXNzaXN0YW50PgotCi0JCTwhLS0gRUFSIE5ldyAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkubmV3UHJvamVjdHMiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuRWFyUHJvamVjdFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVqYiIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuY29ubmVjdG9yIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC51dGlsaXR5IiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCSAgPGluc3RhbmNlb2YgdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JCQkJCSAgPGNvdW50IHZhbHVlPSIwIiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJPCEtLSBFQVIgSW1wb3J0IC0tPgotCQk8Y29tbW9uV2l6YXJkIHR5cGU9ImltcG9ydCIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCTwhLS0gVXRpbGl0eSBKYXIgSW1wb3J0IC0tPgotCQk8Y29tbW9uV2l6YXJkIHR5cGU9ImltcG9ydCIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXciPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGUiIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJICA8aW5zdGFuY2VvZiB2YWx1ZT0iamF2YS51dGlsLkNvbGxlY3Rpb24iLz4KLQkJCQkJICA8Y291bnQgdmFsdWU9IjAiIC8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCi0JCTwhLS0gRUFSIGV4cG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJleHBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkVBUkNvbXBvbmVudEV4cG9ydFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQkKLQkJPGNvbW1vbldpemFyZAotCQkJbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLm5ld1Byb2plY3RzIiAKLQkJCXR5cGU9Im5ldyIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuU2ltcGxlV2ViUHJvamVjdFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCSAgICA8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+IAotCQk8Y29tbW9uV2l6YXJkCi0JCQltZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkubmV3UHJvamVjdHMiIAotCQkJdHlwZT0ibmV3IgotCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpwdC51aS53aXphcmQubmV3SnBhUHJvamVjdCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCSAgICA8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+CQkJCQkJCQkJCQkKLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4gCi0JPC9uYXZpZ2F0b3JDb250ZW50PgotCQotCTxuYXZpZ2F0b3JDb250ZW50IG5hbWU9IiVleHRlbnNpb24uYXBwY2xpZW50Lm5hbWUiIHByaW9yaXR5PSJoaWdoZXN0IgotCQlpY29uPSJpY29ucy9hcHBjbGllbnRncm91cF9vYmouZ2lmIiBhY3RpdmVCeURlZmF1bHQ9InRydWUiCi0JCWNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVDb250ZW50UHJvdmlkZXIiCi0JCWxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFTGFiZWxQcm92aWRlciIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5uYXZpZ2F0b3IuajJlZS51aS5BcHBDbGllbnRDb250ZW50Ij4KLQkJPHRyaWdnZXJQb2ludHM+Ci0JCQk8b3I+Ci0JCQkJPGFuZD4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCQk8b3I+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9ImNsaWVudC54bWkiIC8+Ci0JCQkJCTwvb3I+Ci0JCQkJPC9hbmQ+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCXZhbHVlPSJqc3QuYXBwY2xpZW50OjEuNF0iIC8+Ci0JCQkJPC9hZGFwdD4KLQkJCTwvb3I+Ci0JCTwvdHJpZ2dlclBvaW50cz4KLQkJPHBvc3NpYmxlQ2hpbGRyZW4+Ci0JCQk8YW5kPgotCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQk8b3I+Ci0JCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJdmFsdWU9ImNsaWVudC54bWkiIC8+Ci0JCQkJPC9vcj4KLQkJCTwvYW5kPgotCQk8L3Bvc3NpYmxlQ2hpbGRyZW4+Ci0JCTxjb21tb25Tb3J0ZXIKLQkJICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRVZpZXdlclNvcnRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRVZpZXdlclNvcnRlciIgLz4KLQkJPCEtLSAgSGFuZGxlIG9wZW4gcmVxdWVzdHMgLS0+Ci0JCTxhY3Rpb25Qcm92aWRlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFQWN0aW9uUHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLkFwcENsaWVudEFjdGlvblByb3ZpZGVyIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFuZD4KLQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCQkJPG9yPgotCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJCXZhbHVlPSJjbGllbnQueG1pIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9hY3Rpb25Qcm92aWRlcj4KLQkJCi0JCTwhLS0gQXBwQ2xpZW50IE5ldyAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkubmV3UHJvamVjdHMiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuYXBwY2xpZW50LkFwcENsaWVudFByb2plY3RXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5hcHBjbGllbnQiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCSAgPGluc3RhbmNlb2YgdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JCQkJCSAgPGNvdW50IHZhbHVlPSIwIiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJPCEtLSBBcHAgQ2xpZW50IEltcG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJpbXBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCSAgPGluc3RhbmNlb2YgdmFsdWU9ImphdmEudXRpbC5Db2xsZWN0aW9uIi8+Ci0JCQkJCSAgPGNvdW50IHZhbHVlPSIwIiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJPCEtLSBBcHAgQ2xpZW50IGV4cG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJleHBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkFwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5hcHBjbGllbnQiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudCIgLz4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQk8L25hdmlnYXRvckNvbnRlbnQ+Ci0JCQotCTxuYXZpZ2F0b3JDb250ZW50IG5hbWU9IiVleHRlbnNpb24ud2ViLm5hbWUiIHByaW9yaXR5PSJoaWdoZXN0IgotCQlpY29uPSJpY29ucy93ZWJncm91cF9vYmouZ2lmIiBhY3RpdmVCeURlZmF1bHQ9InRydWUiCi0JCWNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVDb250ZW50UHJvdmlkZXIiCi0JCWxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFTGFiZWxQcm92aWRlciIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5uYXZpZ2F0b3IuajJlZS51aS5XZWJERENvbnRlbnQiPgotCQk8dHJpZ2dlclBvaW50cz4KLQkJCTxvcj4KLQkJCQk8YW5kPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JCQkJCTxvcj4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0id2ViYXBwbGljYXRpb24ueG1pIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJqc3AueG1pIiAvPgotCQkJCQk8L29yPgotCQkJCTwvYW5kPgotCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQl2YWx1ZT0ianN0LndlYjoyLjRdIiAvPgotCQkJCTwvYWRhcHQ+Ci0JCQk8L29yPgotCQk8L3RyaWdnZXJQb2ludHM+Ci0JCTxwb3NzaWJsZUNoaWxkcmVuPgotCQkgIDxvcj4KLQkJCTxhbmQ+Ci0JCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ii8+Ci0JCQkJPG9yPgotCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCXZhbHVlPSJ3ZWJhcHBsaWNhdGlvbi54bWkiIC8+Ci0JCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJdmFsdWU9ImpzcC54bWkiIC8+Ci0JCQkJPC9vcj4KLQkJCTwvYW5kPgotCQkgIDwvb3I+Ci0JCTwvcG9zc2libGVDaGlsZHJlbj4KLQkJPGNvbW1vblNvcnRlcgotCQkgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFVmlld2VyU29ydGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFVmlld2VyU29ydGVyIiAvPgotCQk8IS0tICBIYW5kbGUgb3BlbiByZXF1ZXN0cyAtLT4KLQkJPGFjdGlvblByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVBY3Rpb25Qcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuV2ViQWN0aW9uUHJvdmlkZXIiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPGFuZD4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCQk8b3I+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQkJdmFsdWU9IndlYmFwcGxpY2F0aW9uLnhtaSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQl2YWx1ZT0ianNwLnhtaSIgLz4KLQkJCQkJPC9vcj4KLQkJCQk8L2FuZD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9hY3Rpb25Qcm92aWRlcj4KLQkJPGFjdGlvblByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLk5ld0FjdGlvblByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5XZWJOZXdBY3Rpb25Qcm92aWRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViR3JvdXBJdGVtUHJvdmlkZXIiLz4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9hY3Rpb25Qcm92aWRlcj4KLQotCQk8IS0tIFdlYiBOZXcgLS0+Ci0JCTxjb21tb25XaXphcmQKLSAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLm5ld1Byb2plY3RzIgotICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0LldlYlByb2plY3RXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5lYXIiIC8+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LndlYiIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuTW9kdWxlc0l0ZW1Qcm92aWRlciIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJICA8aW5zdGFuY2VvZiB2YWx1ZT0iamF2YS51dGlsLkNvbGxlY3Rpb24iLz4KLQkJCQkJICA8Y291bnQgdmFsdWU9IjAiIC8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQkKLQkJPCEtLSBXZWIgSW1wb3J0IC0tPgotCQk8Y29tbW9uV2l6YXJkIHR5cGU9ImltcG9ydCIKLQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCTwhLS0gV2ViIEV4cG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJleHBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkNvbXBvbmVudEV4cG9ydFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QiIC8+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbC5XZWJHcm91cEl0ZW1Qcm92aWRlciIgLz4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQotCQk8IS0tIFRoZSBjb250cmlidXRpb24gb2YgdGhlIE5ldyAqLmpzcCB3aXphcmQgdG8gRmlsZXMsIEZvbGRlcnMsIGFuZCBQcm9qZWN0cyAKLQkJCWlzIGhhbmRsZWQgaW4gb3JnLmVjbGlwc2UuanN0LmpzcC51aS4gVGhpcyBjb250cmlidXRpb24gYWRkcyB0aGUgCi0JCQl3aXphcmQgdG8gdGhlIG1vZGVsIGVsZW1lbnRzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBKMkVFIENvbnRlbnQgUHJvdmlkZXIgLS0+Ci0JCTxjb21tb25XaXphcmQKLSAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwud2l6YXJkLk5ld0pTUFdpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViR3JvdXBJdGVtUHJvdmlkZXIiIC8+Ci0KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAiIC8+Ci0KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQotCQk8IS0tIFRoZSBjb250cmlidXRpb24gb2YgdGhlIE5ldyAqLmh0bWwgd2l6YXJkIHRvIEZpbGVzLCBGb2xkZXJzLCBhbmQgUHJvamVjdHMgCi0JCQlpcyBoYW5kbGVkIGluIG9yZy5lY2xpcHNlLmpzdC5odG1sLnVpLiBUaGlzIGNvbnRyaWJ1dGlvbiBhZGRzIHRoZSAKLQkJCXdpemFyZCB0byB0aGUgbW9kZWwgZWxlbWVudHMgY29udHJpYnV0ZWQgYnkgdGhlIEoyRUUgQ29udGVudCBQcm92aWRlciAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkLk5ld0hUTUxXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLldlYkdyb3VwSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCIgLz4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQkJCi0JCTwhLS0gTmV3IFNlcnZsZXQgLS0+Ci0JCTxjb21tb25XaXphcmQKLSAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkud2ViY2xhc3MiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRTZXJ2bGV0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ii8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSUNvbXByZXNzZWROb2RlIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldCIvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLldlYlNlcnZsZXRNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIiLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZyIvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQkKLQkJPCEtLSBOZXcgRmlsdGVyIC0tPgotCQk8Y29tbW9uV2l6YXJkCi0gICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLndlYmNsYXNzIgotICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQWRkRmlsdGVyV2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQkJCQkJPG9yPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC53ZWIiLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ii8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSUNvbXByZXNzZWROb2RlIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViRmlsdGVyTWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyIi8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZyIvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQkKLQkJPCEtLSBOZXcgTGlzdGVuZXIgLS0+Ci0JCTxjb21tb25XaXphcmQKLSAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkud2ViY2xhc3MiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRMaXN0ZW5lcldpemFyZCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8b3I+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3Qud2ViIi8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCQk8b3I+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3QiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCIvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLklDb21wcmVzc2VkTm9kZSIvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCIvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsLldlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXIiLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXIiLz4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLQk8L25hdmlnYXRvckNvbnRlbnQ+Ci0JPG5hdmlnYXRvckNvbnRlbnQgbmFtZT0iJWV4dGVuc2lvbi5lamIubmFtZSIgcHJpb3JpdHk9ImhpZ2hlc3QiCi0JCWljb249Imljb25zL2VqYmdyb3VwX29iai5naWYiIGFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSIKLQkJY29udGVudFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUNvbnRlbnRQcm92aWRlciIKLQkJbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVMYWJlbFByb3ZpZGVyIgotCQlpZD0ib3JnLmVjbGlwc2UuanN0Lm5hdmlnYXRvci5qMmVlLnVpLkVKQkREQ29udGVudCI+Ci0JCTx0cmlnZ2VyUG9pbnRzPgotCQkJPG9yPgotCQkJCTxhbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVtZlBhY2thZ2UiCi0JCQkJCQl2YWx1ZT0iZWpiLnhtaSIgLz4KLQkJCQk8L2FuZD4KLQkJCQk8YW5kPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPiAKLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuZWpiOjIuMV0iIC8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9hbmQ+Ci0JCQk8L29yPgotCQk8L3RyaWdnZXJQb2ludHM+Ci0JCTxwb3NzaWJsZUNoaWxkcmVuPgotCQkJPG9yPgotCQkJCTxhbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCIgLz4KLQkJCQkJPG9yPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJCXZhbHVlPSJlamIueG1pIiAvPgotCQkJCQk8L29yPgotCQkJCTwvYW5kPgotCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXIuSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyIi8+Ci0gICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5Hcm91cGVkRUpCSXRlbVByb3ZpZGVyIi8+Ci0JCQk8L29yPgotICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5Mb2FkaW5nREROb2RlIi8+Ci0JCTwvcG9zc2libGVDaGlsZHJlbj4KLQkJPGNvbW1vblNvcnRlcgotCQkgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFVmlld2VyU29ydGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFVmlld2VyU29ydGVyIiAvPgotCQk8IS0tICBIYW5kbGUgb3BlbiByZXF1ZXN0cyAtLT4KLQkJPGFjdGlvblByb3ZpZGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVBY3Rpb25Qcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuRUpCQWN0aW9uUHJvdmlkZXIiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YW5kPgotCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJCQkJdmFsdWU9ImVqYi54bWkiIC8+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciIvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvYWN0aW9uUHJvdmlkZXI+Ci0JCTwhLS0gIEJ5IGRlZmF1bHQsIGFueXRoaW5nIHRoYXQgY2FuIGFkYXB0IHRvIGFuIElSZXNvdXJjZSBnZXRzICBOZXcgQWN0aW9uIFByb3ZpZGVyIChmcm9tIHRoZSBSZXNvdXJjZXMgZXh0ZW5zaW9uKSwKLQkJCXNvIHdlIGp1c3QgbmVlZCB0byBhZGQgb25lIGZvciB0aGUgRUpCIEl0ZW0gUHJvdmlkZXJzICh0aGUgZ3JvdXBpbmdzIGluIHRoZSB0cmVlKSAKLQkJLS0+Ci0JCTxhY3Rpb25Qcm92aWRlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucy5OZXdBY3Rpb25Qcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuRWpiTmV3QWN0aW9uUHJvdmlkZXIiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPGluc3RhbmNlb2YKLQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5Hcm91cGVkRUpCSXRlbVByb3ZpZGVyIiAvPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2FjdGlvblByb3ZpZGVyPgotCi0JCTwhLS0gRUpCIE5ldyAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkubmV3UHJvamVjdHMiCi0gICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkucHJvamVjdC5mYWNldC5FamJQcm9qZWN0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWpiIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCTwhLS0gRUpCIEltcG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJpbXBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aS5pbnRlcm5hbC53aXphcmQuRUpCQ29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWpiIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCTwhLS0gRUpCIEV4cG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJleHBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aS5pbnRlcm5hbC53aXphcmQuRUpCQ29tcG9uZW50RXhwb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVqYiIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5Hcm91cGVkRUpCSXRlbVByb3ZpZGVyIiAvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCi0JCTwhLS0gQWRkIEVudGVycHJpc2UgQmVhbiAtLT4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aSIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmFubm90YXRpb24udWkuaW50ZXJuYWwud2l6YXJkcy5BZGRFamJXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YWRhcHQKLQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuZWpiLnhkb2NsZXQiIC8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyIiAvPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqc3QuZWpiLnhkb2NsZXQiIC8+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGFuZD4KLQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb3ZpZGVyLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVqYi54ZG9jbGV0IiAvPgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2NvbW1vbldpemFyZD4KLSAgCQk8Y29tbW9uV2l6YXJkCi0gICAgICAgIAkJbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkiCi0gICAgICAgIAkJdHlwZT0ibmV3IgotICAgICAgICAJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5BZGRTZXNzaW9uQmVhbldpemFyZCI+Ci0gICAgIAkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVqYjozLjAiLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ii8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FuZD4KLQkJCQkJPGFuZD4KLQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIiIC8+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9ImpzdC5lamI6My4wIiAvPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm92aWRlci5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lamIueGRvY2xldCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLSAgCQk8L2NvbW1vbldpemFyZD4KLSAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkiCi0gICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5BZGRNZXNzYWdlRHJpdmVuQmVhbldpemFyZCI+Ci0gICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgPG9yPgotICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmVqYjozLjAiPgotICAgICAgICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCI+Ci0gICAgICAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ij4KLSAgICAgICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCI+Ci0gICAgICAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyIj4KLSAgICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWpiOjMuMCI+Ci0gICAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb3ZpZGVyLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmVqYi54ZG9jbGV0Ij4KLSAgICAgICAgICAgICAgICA8L3Rlc3Q+Ci0gICAgICAgICAgICAgPC9hbmQ+Ci0gICAgICAgICAgPC9vcj4KLSAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgPC9jb21tb25XaXphcmQ+Ci0JPC9uYXZpZ2F0b3JDb250ZW50PgotCTxuYXZpZ2F0b3JDb250ZW50IG5hbWU9IiVleHRlbnNpb24uY29ubmVjdG9yLm5hbWUiCi0JCXByaW9yaXR5PSJoaWdoZXN0IiBpY29uPSJpY29ucy9jb25uZWN0b3Jncm91cF9vYmouZ2lmIgotCQlhY3RpdmVCeURlZmF1bHQ9InRydWUiCi0JCWNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVDb250ZW50UHJvdmlkZXIiCi0JCWxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFTGFiZWxQcm92aWRlciIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5uYXZpZ2F0b3IuajJlZS51aS5Db25uZWN0b3JERENvbnRlbnQiPgotCQk8dHJpZ2dlclBvaW50cz4KLQkJCTxvcj4KLQkJCQk8YW5kPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJdmFsdWU9ImpjYS54bWkiIC8+Ci0JCQkJPC9hbmQ+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCXZhbHVlPSJqc3QuY29ubmVjdG9yIiAvPgotCQkJCTwvYWRhcHQ+Ci0JCQk8L29yPgotCQk8L3RyaWdnZXJQb2ludHM+Ci0JCTxwb3NzaWJsZUNoaWxkcmVuPgotCQkJPGFuZD4KLQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZW1mUGFja2FnZSIKLQkJCQkJdmFsdWU9ImpjYS54bWkiIC8+Ci0JCQk8L2FuZD4KLQkJPC9wb3NzaWJsZUNoaWxkcmVuPgotCQk8Y29tbW9uU29ydGVyCi0JCSAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVWaWV3ZXJTb3J0ZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVWaWV3ZXJTb3J0ZXIiIC8+Ci0JCTwhLS0gIEhhbmRsZSBvcGVuIHJlcXVlc3RzIC0tPgotCQk8YWN0aW9uUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRUFjdGlvblByb3ZpZGVyIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS5Db25uZWN0b3JBY3Rpb25Qcm92aWRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8YW5kPgotCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QiIC8+Ci0JCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5lbWZQYWNrYWdlIgotCQkJCQkJdmFsdWU9ImpjYS54bWkiIC8+Ci0JCQkJPC9hbmQ+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvYWN0aW9uUHJvdmlkZXI+Ci0KLQkJPCEtLSBDb25uZWN0b3IgTmV3IC0tPgotCQk8Y29tbW9uV2l6YXJkCi0gICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5uZXdQcm9qZWN0cyIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JQcm9qZWN0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmVhciIgLz4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuY29ubmVjdG9yIiAvPgotCQkJCQkJCTwvb3I+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5Nb2R1bGVzSXRlbVByb3ZpZGVyIiAvPgotCQkJCQk8YW5kPgotCQkJCQkgIDxpbnN0YW5jZW9mIHZhbHVlPSJqYXZhLnV0aWwuQ29sbGVjdGlvbiIvPgotCQkJCQkgIDxjb3VudCB2YWx1ZT0iMCIgLz4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9vcj4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9jb21tb25XaXphcmQ+Ci0JCTwhLS0gQ29ubmVjdG9yIGltcG9ydCAtLT4KLQkJPGNvbW1vbldpemFyZCB0eXBlPSJpbXBvcnQiCi0JCQl3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnVpLmludGVybmFsLndpemFyZC5Db25uZWN0b3JDb21wb25lbnRJbXBvcnRXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IiAvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0Ci0JCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJCTxvcj4KLQkJCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQkJdmFsdWU9ImpzdC5jb25uZWN0b3IiIC8+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIiAvPgotCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZXNJdGVtUHJvdmlkZXIiIC8+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLmludGVybmFsLmltcGwuUmVzb3VyY2VBZGFwdGVySW1wbCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJICA8aW5zdGFuY2VvZiB2YWx1ZT0iamF2YS51dGlsLkNvbGxlY3Rpb24iLz4KLQkJCQkJICA8Y291bnQgdmFsdWU9IjAiIC8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCQk8IS0tIENvbm5lY3RvciBFeHBvcnQgLS0+Ci0JCTxjb21tb25XaXphcmQgdHlwZT0iZXhwb3J0IgotCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50RXhwb3J0V2l6YXJkIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdCIgLz4KLQkJCQkJPGFuZD4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCQl2YWx1ZT0ianN0LmNvbm5lY3RvciIgLz4KLQkJCQkJCQk8L29yPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvciIgLz4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZUFkYXB0ZXJJbXBsIiAvPgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCTwvbmF2aWdhdG9yQ29udGVudD4KLSA8Y29tbW9uRmlsdGVyCi0gICAgICAgYWN0aXZlQnlEZWZhdWx0PSJ0cnVlIgotICAgICAgIGRlc2NyaXB0aW9uPSIlZmlsdGVyLmpldGVtaXR0ZXJzLmRlc2NyaXB0aW9uIgotICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkuZmlsdGVycy5qZXRlbWl0dGVycyIKLSAgICAgICBuYW1lPSIlZmlsdGVyLmpldGVtaXR0ZXJzLm5hbWUiPgotICAgIDxmaWx0ZXJFeHByZXNzaW9uPgotICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm5hbWUiCi0gICAgICAgICAgICAgICAgdmFsdWU9Ii5KRVRFbWl0dGVycyIvPgotICAgICAgIDwvYWRhcHQ+Ci0gICAgPC9maWx0ZXJFeHByZXNzaW9uPgotIDwvY29tbW9uRmlsdGVyPgkJCQotIAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgPGV4dGVuc2lvbiAKLSAgCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLSAgICA8ZmFjdG9yeQotICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KMkVFRU9iamVjdCIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVFTUZBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiLz4KLSAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4KLSAgICA8L2ZhY3Rvcnk+Ci0gICAgPGZhY3RvcnkKLSAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSjJFRUVBdHRyaWJ1dGUiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFRU1GQWRhcHRlckZhY3RvcnkiPgotICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIi8+Ci0gICAgICAgPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIi8+Ci0gICAgPC9mYWN0b3J5PgotICA8L2V4dGVuc2lvbj4KLSAgICAgCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgIExhYmVsIERlY29yYXRvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+Ci0gICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBsb2NhdGlvbj0iVE9QX0xFRlQiCi0gICAgICAgICAgICBsaWdodHdlaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIGxhYmVsPSIlajJlZVByb2plY3REZWNvcmF0b3IiCi0gICAgICAgICAgICBzdGF0ZT0idHJ1ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRVByb2plY3REZWNvcmF0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVQcm9qZWN0RGVjb3JhdG9yIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICA8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLSAgICAgICAgICAgIDxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QiLz4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVqMmVlUHJvamVjdERlY29yYXRvci5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5kZWNvcmF0b3JzIj4KLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGxhYmVsPSIlUFJPQkxFTV9NQVJLRVJfTEFCRUxfUkVTT1VSQ0VfREVDT1JBVE9SIgotICAgICAgICAgICAgc3RhdGU9InRydWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamR0LnVpLlByb2JsZW1zTGFiZWxEZWNvcmF0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpLmphdmEucmVzb3VyY2UuZGVjb3JhdG9yIj4KLSAgICAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgICAgIDxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiLz4gCi0gICAgICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L2RlY29yYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPiAgCi0gICAgICAKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IudWkvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wcmVwYXJlZm9ycGlpLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3MzIwNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci51aS9wcmVwYXJlZm9ycGlpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IlByZXBhcmVGb3JQSUkiIGRlZmF1bHQ9Im1haW4iIGJhc2VkaXI9Ii4iPgotCQkKLQk8IS0tIFNldHVwIHRlbXAgdmFyaWFibGVzIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJubHNEaXIiIHZhbHVlPSJkOi9OTFMvQ29yb25hLzA1MjYiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9ImNvbS5pYm0ud3RwLmoyZWUudWkubmF2aWdhdG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW5kaXIiIHZhbHVlPSJkOi93b3Jrc3BhY2VDb3JvbmEvJHtwbHVnaW59Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXREaXIiIHZhbHVlPSIke25sc0Rpcn0vJHtwbHVnaW59Ii8+Ci0JCQotCQotCTwvdGFyZ2V0PgotCi0JPCEtLSBDcmVhdGUgdGhlIGRlc3RpbmF0aW9uIGRpciAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5sc0RpciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxta2RpciBkaXI9IiR7bmxzRGlyfSIvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJwbHVnaW5kaXIiIGRlcGVuZHM9Im5sc0RpciI+Ci0JCTxkZWxldGUgZGlyPSIke291dHB1dERpcn0iLz4KLQkJPG1rZGlyIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIE1vdmUgdGhlIGZpbGVzIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9ucyBpbiB0aGUgd29ya3NwYWNlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InBsdWdpbmRpciI+Ci0JCi0JCTxtZXNzYWdlSWRHZW4gZm9sZGVyUGF0aCA9ICIke3BsdWdpbmRpcn0iIGNvbXBvbmVudElkID0gIkUiIC8+Ci0JCQotICAJCTxjb3B5IGZpbGU9IiR7cGx1Z2luZGlyfS9wbHVnaW4ucHJvcGVydGllcyIgdG9kaXI9IiR7b3V0cHV0RGlyfSIvPgotICAJCQotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCBlMmE4YmNiLi4wMzdhNGU1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMSw2MiArMSw5NSBAQAotI1RodSBNYXkgMTAgMTg6MzU6NDUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCisjTW9uIEp1biAwOCAxNTozNTo0NSBFRFQgMjAwOQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1lcnJvcgorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZVVuY2hlY2tlZEV4Y2VwdGlvbnM9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitpbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA1NGRhMmQ5Li5iZjg1ZWY0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTIsNyArMiw3IEBACiBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjE1LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDEuMS40MDYucXVhbGlmaWVyCiBCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KQEAgLTE0LDcgKzE0LDYgQEAKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tYW5kO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyLmFjdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvdmlkZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5saXN0ZW5lcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wZXJzcGVjdGl2ZTt4LWludGVybmFsOj10cnVlLApAQCAtMjcsMTEgKzI2LDEyIEBACiAgb3JnLmVjbGlwc2UuanN0LmoyZWUudWkuYXJjaGl2ZSwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5hcmNoaXZlLmludGVybmFsLAogIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5hcHBjbGllbnQKKyBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LmFwcGNsaWVudCwKKyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcwogUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy51aTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAogIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCiAgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKQEAgLTM5LDE2ICszOSwxNiBAQAogIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKICBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCisgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAogIG9yZy5lY2xpcHNlLmplbTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCiAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKICBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCiAgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCkBAIC01OCw3ICs1OCw3IEBACiAgb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCiAgb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCkBAIC02OCw5ICs2OCwxMyBAQAogIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKICBvcmcuZWNsaXBzZS53c3Qud2ViLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKICBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDQuMC4wKSIsCisgY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IjMuOC4xIiwKICBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuamVlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIgorIG9yZy5lY2xpcHNlLmpzdC5qZWU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAorIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4xLDIuMC4wKSIsCisgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMTAwLDIuMC4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsCisgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aTtidW5kbGUtdmVyc2lvbj0iMS4wLjAiCiBFY2xpcHNlLUxhenlTdGFydDogdHJ1ZQogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2J1aWxkLnByb3BlcnRpZXMKaW5kZXggNTVhYzgyOC4uYzAzMWQyYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvYnVpbGQucHJvcGVydGllcwpAQCAtMTYsNyArMTYsNSBAQAogICAgICAgICAgICAgICAgYWJvdXQuaHRtbAogamFycy5jb21waWxlLm9yZGVyID0gLgogc291cmNlLi4gPSBqMmVlX3VpLyxcCi0gICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KKyAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCiBvdXRwdXQuLiA9IGJpbi8KLXNyYy5pbmNsdWRlcyA9IHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvaWNvbnMvcHJqX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Byal9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZWE1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2ljb25zL3Byal9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2pkdC9pbnRlcm5hbC9pbnRlZ3JhdGlvbi91aS9XVFBVSVdvcmtpbmdDb3B5TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL3VpL1dUUFVJV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEKaW5kZXggNjg2YjE0ZS4uMWI5MDlhMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL3VpL1dUUFVJV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9jb21tb24vamR0L2ludGVybmFsL2ludGVncmF0aW9uL3VpL1dUUFVJV29ya2luZ0NvcHlNYW5hZ2VyLmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmludGVncmF0aW9uLldUUFdvcmtpbmdDb3B5TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7CkBAIC00Nyw3ICs0OCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5TYXZlRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwogCiAvKioKICAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzI1LzIwMDEgNzowNTozNiBQTSkKQEAgLTE2NCw2ICsxNjQsNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRBZmZlY3RlZEZpbGVzKCkgewogCQlTZXQgYVNldCA9IG5ldyBIYXNoU2V0KCk7CiAJCUl0ZXJhdG9yIGl0ID0gZ2V0RWRpdG9ySW5wdXRzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKQEAgLTE5NywxMCArMTk4LDExIEBACiAJfQogCiAJcHJvdGVjdGVkIElFZGl0b3JJbnB1dCBnZXRFZGl0b3JJbnB1dChJSmF2YUVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCXN3aXRjaCAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpKSB7CisJCUlKYXZhRWxlbWVudCBsb2NhbEVsZW1lbnQgPSBlbGVtZW50OworCQl3aGlsZSAobG9jYWxFbGVtZW50ICE9IG51bGwpIHsKKwkJCXN3aXRjaCAobG9jYWxFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkpIHsKIAkJCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIDogewotCQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gKElDb21waWxhdGlvblVuaXQpIGVsZW1lbnQ7CisJCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSAoSUNvbXBpbGF0aW9uVW5pdCkgbG9jYWxFbGVtZW50OwogCQkJCQlpZiAoY3UuaXNXb3JraW5nQ29weSgpKQogCQkJCQkJY3UgPSBjdS5nZXRQcmltYXJ5KCk7CiAJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGN1LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwpAQCAtMjA5LDkgKzIxMSw5IEBACiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCQljYXNlIElKYXZhRWxlbWVudC5DTEFTU19GSUxFIDoKLQkJCQkJcmV0dXJuIG5ldyBJbnRlcm5hbENsYXNzRmlsZUVkaXRvcklucHV0KChJQ2xhc3NGaWxlKSBlbGVtZW50KTsKKwkJCQkJcmV0dXJuIG5ldyBJbnRlcm5hbENsYXNzRmlsZUVkaXRvcklucHV0KChJQ2xhc3NGaWxlKSBsb2NhbEVsZW1lbnQpOwogCQkJfQotCQkJZWxlbWVudCA9IGVsZW1lbnQuZ2V0UGFyZW50KCk7CisJCQlsb2NhbEVsZW1lbnQgPSBsb2NhbEVsZW1lbnQuZ2V0UGFyZW50KCk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtMjM3LDYgKzIzOSw3IEBACiAJICogICAgICAgICBub3QgZW5jb2RlIGFuIGVkaXRvciBpbnB1dCwgb3IgaWYgdGhlcmUgaXMgbm8gcmVtZW1iZXJlZCB3b3JraW5nIGNvcHkgZm9yIHRoaXMKIAkgKiAgICAgICAgIGNvbXBpbGF0aW9uIHVuaXQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCBnZXRFeGlzdGluZ1dvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJaWYgKGN1ID09IG51bGwgfHwgY3UuaXNXb3JraW5nQ29weSgpKSB7CiAJCQlyZXR1cm4gY3U7CkBAIC0yNTYsNiArMjU5LDcgQEAKIAkgKiBAcmV0dXJuIHRoZSB3b3JraW5nIGNvcHkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vCiAJICogICAgICAgICByZW1lbWJlcmVkIHdvcmtpbmcgY29weSBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQgZ2V0V29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSwgYm9vbGVhbiBmb3JOZXdDVSkgdGhyb3dzIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uIHsKIAkJaWYgKGZvck5ld0NVKQogCQkJcmV0dXJuIHN1cGVyLmdldFdvcmtpbmdDb3B5KGN1LCBmb3JOZXdDVSk7CkBAIC0yODEsNiArMjg1LDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHByaW1EaXNwb3NlKCkgewogCQlzdXBlci5wcmltRGlzcG9zZSgpOwogCQlkaXNjYXJkRXhpc3RpbmdDb21waWxhdGlvblVuaXRzKCk7CkBAIC0yODgsNiArMjkzLDcgQEAKIAkJamF2YVdvcmtpbmdDb3B5TWFuYWdlciA9IG51bGw7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcHJpbVJldmVydCgpIHsKIAkJc3VwZXIucHJpbVJldmVydCgpOwogCQlyZXZlcnRXb3JraW5nQ29waWVzKCk7CkBAIC0zMDksNiArMzE1LDcgQEAKIAkgKiAgICAgICAgIG5vdCBlbmNvZGUgYW4gZWRpdG9yIGlucHV0LCBvciBpZiB0aGVyZSBpcyBubyByZW1lbWJlcmVkIHdvcmtpbmcgY29weSBmb3IgdGhpcwogCSAqICAgICAgICAgY29tcGlsYXRpb24gdW5pdAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0IHByaW1HZXRXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCWlmIChjdSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gY3U7CkBAIC0zMzAsNiArMzM3LDcgQEAKIAkvKioKIAkgKiBUaGlzIHdpbGwgc2F2ZSBhbGwgb2YgdGhlIHJlZmVyZW5jZWQgQ29tcGlsYXRpb25Vbml0cyB0byBiZSBzYXZlZC4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBwcmltU2F2ZUNvbXBpbGF0aW9uVW5pdHMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCQlzdXBlci5wcmltU2F2ZUNvbXBpbGF0aW9uVW5pdHMobnVsbCk7CiAJCXNhdmVFeGlzdGluZ0NvbXBpbGF0aW9uVW5pdHMobW9uaXRvcik7CkBAIC0zNjQsNyArMzcyLDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJV1RQQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCXRocm93IG5ldyBTYXZlRmFpbGVkRXhjZXB0aW9uKGUpOwogCQl9IGZpbmFsbHkgewogCQkJaWYgKGNhblNhdmUpCkBAIC00NTYsNiArNDY0LDcgQEAKIAl9CiAKIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGFkZERlbGV0ZWRDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewogCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBwcmltR2V0RWRpdG9ySW5wdXQoY3UpOwogCQlpZiAoaW5wdXQgIT0gbnVsbCkKQEAgLTQ2Nyw2ICs0NzYsNyBAQAogCS8qKgogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS53b3JrYmVuY2guSUoyRUVXb3JraW5nQ29weU1hbmFnZXIjaGFzV29ya2luZ0NvcGllcygpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzV29ya2luZ0NvcGllcygpIHsKIAkJcmV0dXJuIHN1cGVyLmhhc1dvcmtpbmdDb3BpZXMoKSB8fCAoZWRpdG9ySW5wdXRzICE9IG51bGwgJiYgIWVkaXRvcklucHV0cy5pc0VtcHR5KCkpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9BZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0FkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlLmphdmEKaW5kZXggOTk0ZTczMy4uNDJiOTJjMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0FkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0FkZE1vZHVsZXN0b0VBUlByb3BlcnRpZXNQYWdlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtOSw2ICs5LDcgQEAKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqCSAgIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBbMTQyNTAwXSBXVFAgcHJvcGVydGllcyBwYWdlcyBmb250cyBkb24ndCBmb2xsb3cgRWNsaXBzZSBwcmVmZXJlbmNlcwogICogICAgIFN0ZWZhbiBEaW1vdiwgc3RlZmFuLmRpbW92QHNhcC5jb20gLSBidWdzIDIwNzgyNiwgMjIyNjUxCisgKiAgICAgTWlsZW4gTWFub3YsIG1pbGVuLm1hbm92QHNhcC5jb20gLSBidWdzIDI0ODYyMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwogCkBAIC00MCwyMSArNDEsMjEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLkoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuQ2hhbmdlTGliRGlyRGlhbG9nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSUoyRUVNb2R1bGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5Eb3VibGVDaGVja2JveFRhYmxlSXRlbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5Eb3VibGVDaGVja2JveFRhYmxlVmlld2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklFQVJNb2RlbFByb3ZpZGVyOwpAQCAtMTAyLDcgKzEwMyw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7CiAKLQorLyoqCisgKiBAZGVwcmVjYXRlZCB3dHAgMy4yCisgKi8KIHB1YmxpYyBjbGFzcyBBZGRNb2R1bGVzdG9FQVJQcm9wZXJ0aWVzUGFnZSBpbXBsZW1lbnRzIElKMkVFRGVwZW5kZW5jaWVzQ29udHJvbCwgTGlzdGVuZXIgewogCQogCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgUEFUSF9TRVBBUkFUT1IgPSBBdmFpbGFibGVKMkVFQ29tcG9uZW50c0ZvckVBUkNvbnRlbnRQcm92aWRlci5QQVRIX1NFUEFSQVRPUjsJCkBAIC0xMzEsNyArMTM0LDcgQEAKIAlwcm90ZWN0ZWQgU2V0IGxpYnNUb1VuY2hlY2s7CiAJcHJvdGVjdGVkIExpc3RlbmVyIHRhYmxlTGlzdGVuZXI7CiAJcHJvdGVjdGVkIExpc3RlbmVyIGxhYmVsTGlzdGVuZXI7Ci0KKwkKIAkvL1tCdWcgMjM4MjY0XSB0aGUgY2FjaGVkIGxpc3Qgb2YgamFycyBzZWxlY3RlZCB1c2luZyAnYWRkIGphcicgb3IgJ2FkZCBleHRlcm5hbCBqYXJzJwogCXByb3RlY3RlZCBMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBhZGRlZEpBUkNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOwogCkBAIC0xNDgsNiArMTUxLDcgQEAKIAkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKIAkJCWlmKGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwpewogCQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0VmVyc2lvbiA9IGZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3RGYWNldFZlcnNpb24oRWFyVXRpbGl0aWVzLkVOVEVSUFJJU0VfQVBQTElDQVRJT05fRkFDRVQpOworCQkJCS8vRUU2VE9ETwogCQkJCWlmKGZhY2V0VmVyc2lvbi5lcXVhbHMoRWFyVXRpbGl0aWVzLkVOVEVSUFJJU0VfQVBQTElDQVRJT05fNTApKXsKIAkJCQkJaGFzRUU1RmFjZXQgPSB0cnVlOwogCQkJCX0KQEAgLTE1NSw3ICsxNTksNyBAQAogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQotCQkKKwkJLy9FRTZUT0RPCiAJCWlmKGhhc0VFNUZhY2V0KXsKIAkJCVN0cmluZyBlYXJERFZlcnNpb24gPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVERFByb2plY3RWZXJzaW9uKHByb2plY3QpOwogCQkJaWYgKGVhckREVmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVCkpIHsKQEAgLTE2Myw3ICsxNjcsNyBAQAogCQkJCUFwcGxpY2F0aW9uIGFwcCA9IChBcHBsaWNhdGlvbilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpLmdldE1vZGVsT2JqZWN0KCk7CiAJCQkJaWYgKGFwcCAhPSBudWxsKQogCQkJCQlvbGRMaWJEaXIgPSBhcHAuZ2V0TGlicmFyeURpcmVjdG9yeSgpOwotCQkJCWlmIChvbGRMaWJEaXIgPT0gbnVsbCkgb2xkTGliRGlyID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5FQVJfREVGQVVMVF9MSUJfRElSKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOworCQkJCWlmIChvbGRMaWJEaXIgPT0gbnVsbCkgb2xkTGliRGlyID0gSjJFRUNvbnN0YW50cy5FQVJfREVGQVVMVF9MSUJfRElSOwogCQkJCWxpYkRpciA9IG9sZExpYkRpcjsKIAkJCX0KIAkJfQpAQCAtMjQyLDEzICsyNDYsMTMgQEAKIAkJVGFibGUgdGFibGUgPSBudWxsOwogCQlpZiAoYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlciAhPSBudWxsKSB7CiAJCSAgICAgdGFibGUgPSBhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCk7Ci0JCSAgICAgaWYgKHRhYmxlID09IG51bGwpCi0JCSAgICAJIHJldHVybjsKIAkJfQotCQl0YWJsZS5yZW1vdmVMaXN0ZW5lcihTV1QuRGlzcG9zZSwgdGFibGVMaXN0ZW5lcik7Ci0JCXRhYmxlLnJlbW92ZUxpc3RlbmVyKFNXVC5LZXlEb3duLCB0YWJsZUxpc3RlbmVyKTsKLQkJdGFibGUucmVtb3ZlTGlzdGVuZXIoU1dULk1vdXNlTW92ZSwgdGFibGVMaXN0ZW5lcik7Ci0JCXRhYmxlLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb3VzZUhvdmVyLCB0YWJsZUxpc3RlbmVyKTsJCQorCQlpZih0YWJsZSAhPSBudWxsKXsKKwkJCXRhYmxlLnJlbW92ZUxpc3RlbmVyKFNXVC5EaXNwb3NlLCB0YWJsZUxpc3RlbmVyKTsKKwkJCXRhYmxlLnJlbW92ZUxpc3RlbmVyKFNXVC5LZXlEb3duLCB0YWJsZUxpc3RlbmVyKTsKKwkJCXRhYmxlLnJlbW92ZUxpc3RlbmVyKFNXVC5Nb3VzZU1vdmUsIHRhYmxlTGlzdGVuZXIpOworCQkJdGFibGUucmVtb3ZlTGlzdGVuZXIoU1dULk1vdXNlSG92ZXIsIHRhYmxlTGlzdGVuZXIpOworCQl9CiAJfQogCiAJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKQEAgLTI3NCwxMyArMjc4LDEyIEBACiAJcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpYkRpcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAkJaWYgKGxpYkRpci5lcXVhbHMob2xkTGliRGlyKSkgcmV0dXJuOwogCQlmaW5hbCBJRUFSTW9kZWxQcm92aWRlciBlYXJNb2RlbCA9IChJRUFSTW9kZWxQcm92aWRlcilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotCQlBcHBsaWNhdGlvbiBhcHAgPSAoQXBwbGljYXRpb24pIGVhck1vZGVsLmdldE1vZGVsT2JqZWN0KCk7CisJCWZpbmFsIEFwcGxpY2F0aW9uIGFwcCA9IChBcHBsaWNhdGlvbilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpLmdldE1vZGVsT2JqZWN0KCk7CiAJCW9sZExpYkRpciA9IGFwcC5nZXRMaWJyYXJ5RGlyZWN0b3J5KCk7Ci0JCWlmIChvbGRMaWJEaXIgPT0gbnVsbCkgb2xkTGliRGlyID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5FQVJfREVGQVVMVF9MSUJfRElSKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOworCQlpZiAob2xkTGliRGlyID09IG51bGwpIG9sZExpYkRpciA9IEoyRUVDb25zdGFudHMuRUFSX0RFRkFVTFRfTElCX0RJUjsKIAkJZWFyTW9kZWwubW9kaWZ5KG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCUFwcGxpY2F0aW9uIGFwcDIgPSAoQXBwbGljYXRpb24pZWFyTW9kZWwuZ2V0TW9kZWxPYmplY3QoKTsJCQkKLQkJCWFwcDIuc2V0TGlicmFyeURpcmVjdG9yeShsaWJEaXIpOworCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCQorCQkJYXBwLnNldExpYnJhcnlEaXJlY3RvcnkobGliRGlyKTsKIAkJfX0sIG51bGwpOwogCX0KIAkKQEAgLTMwMSw3ICszMDQsNiBAQAogCQkKIAkJZG0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIGVhckNvbXBvbmVudCk7CQkJCQkKIAkJZG0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgY29tcG9uZW50TGlzdCk7Ci0JCWRtLnNldFByb3BlcnR5KElBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuSjJFRV9MSUJfRUxFTUVOVFNfTElTVCwgajJlZUxpYkVsZW1lbnRMaXN0KTsKIAkJCiAJCS8vW0J1ZyAyMzgyNjRdIHRoZSB1cmkgbWFwIG5lZWRzIHRvIGJlIG1hbnVhbGx5IHNldCBjb3JyZWN0bHkKIAkJTWFwIHVyaU1hcCA9IG5ldyBIYXNoTWFwKCk7CkBAIC0zNjUsNyArMzY3LDYgQEAKIAl9CiAJCiAJcHJpdmF0ZSBJU3RhdHVzIGFkZE1vZHVsZXNUb0VBUihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVN0YXR1cyBzdGF0ID0gT0tfU1RBVFVTOwogCQl0cnkgewogCQkJaWYoIGVhckNvbXBvbmVudCAhPSBudWxsICl7CiAJCQkJZmluYWwgTGlzdCBsaXN0ID0gbmV3SjJFRU1vZHVsZXNUb0FkZChmYWxzZSk7CkBAIC0zODIsOSArMzgzLDggQEAKIAkJCQkJCQkJZXhlY0FkZE9wMShtb25pdG9yLCBqYXZhUHJvamVjdHNMaXN0LCBqMmVlQ29tcG9uZW50TGlzdCwgSjJFRUNvbnN0YW50cy5FQVJfUk9PVF9ESVIpOwkJCQkJCQkJCiAJCQkJCQkJfSAKIAkJCQkJCQlpZiAoc2hvdWxkQm5kUnVuKSB7Ci0JCQkJCQkJCVN0cmluZyBsaWJEaXJQYXRoID0gbmV3IFBhdGgobGliRGlyKS5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpOwotCQkJCQkJCQlleGVjQWRkT3AobW9uaXRvciwgYm5kTGlzdCwgbGliRGlyUGF0aCk7Ci0JCQkJCQkJCWV4ZWNBZGRPcDEobW9uaXRvciwgamF2YUxpYlByb2plY3RzTGlzdCwgajJlZUxpYkVsZW1lbnRMaXN0LCBsaWJEaXJQYXRoKTsJCQkJCQkJCQkJCQkJCQkJCisJCQkJCQkJCWV4ZWNBZGRPcChtb25pdG9yLCBibmRMaXN0LCBsaWJEaXIpOworCQkJCQkJCQlleGVjQWRkT3AxKG1vbml0b3IsIGphdmFMaWJQcm9qZWN0c0xpc3QsIGoyZWVMaWJFbGVtZW50TGlzdCwgbGliRGlyKTsJCQkJCQkJCQkJCQkJCQkJCiAJCQkJCQkJfSAKIAkJCQkJCX0KIAkJCQkJfTsKQEAgLTQyOCw4ICs0MjgsNyBAQAogCQkJCUxpc3RbXSBsaXN0ID0gZ2V0Q29tcG9uZW50c1RvUmVtb3ZlVXBkYXRlKCFsaWJEaXIuZXF1YWxzKG9sZExpYkRpcikpOyAKIAkJCQlyZW1Db21wcyhsaXN0WzBdLCBKMkVFQ29uc3RhbnRzLkVBUl9ST09UX0RJUik7CiAJCQkJCi0JCQkJU3RyaW5nIG9sZExpYkRpclBhdGggPSBuZXcgUGF0aChvbGRMaWJEaXIpLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJcmVtQ29tcHMobGlzdFsxXSwgb2xkTGliRGlyUGF0aCk7CisJCQkJcmVtQ29tcHMobGlzdFsxXSwgb2xkTGliRGlyKTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gc3RhdDsKQEAgLTQ1NSw3ICs0NTQsNyBAQAogCXByb3RlY3RlZCBMaXN0IGdldENvbXBvbmVudHNUb1JlbW92ZSgpewogCQkvL2oyZWVDb21wb25lbnRMaXN0ID0gZ2V0Q2hlY2tlZEoyRUVFbGVtZW50c0FzTGlzdCgpOwogCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmKCBlYXJDb21wb25lbnQgIT0gbnVsbCAmJiBsaXN0ICE9IG51bGwgKXsKKwkJaWYoIGVhckNvbXBvbmVudCAhPSBudWxsKXsKIAkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gb2xkcmVmcyA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7CiAJCQlmb3IgKGludCBqID0gMDsgaiA8IG9sZHJlZnMubGVuZ3RoOyBqKyspIHsKIAkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBvbGRyZWZzW2pdOwpAQCAtNDc2LDcgKzQ3NSw3IEBACiAJCUxpc3RbXSBsaXN0ID0gbmV3IEFycmF5TGlzdFsyXTsKIAkJbGlzdFswXSA9IG5ldyBBcnJheUxpc3QoKTsKIAkJbGlzdFsxXSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYoIGVhckNvbXBvbmVudCAhPSBudWxsICYmIGxpc3QgIT0gbnVsbCApeworCQlpZiggZWFyQ29tcG9uZW50ICE9IG51bGwpewogCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBvbGRyZWZzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKIAkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkcmVmcy5sZW5ndGg7IGorKykgewogCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG9sZHJlZnNbal07CkBAIC00OTAsNyArNDg5LDcgQEAKIAkJCQkJbGlzdFswXS5hZGQoaGFuZGxlKTsKIAkJCQl9CiAJCQkJaWYoKCFqMmVlTGliRWxlbWVudExpc3QuY29udGFpbnMoaGFuZGxlKSB8fCBkaXJVcGRhdGVkKSAmJgotCQkJCQkJcmVmLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlKCkuZXF1YWxzKG5ldyBQYXRoKG9sZExpYkRpcikubWFrZVJlbGF0aXZlKCkpKSB7CQorCQkJCQkJcmVmLmdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMob2xkTGliRGlyKSkgewkKIAkJCQkJbGlzdFsxXS5hZGQoaGFuZGxlKTsKIAkJCQl9CiAJCQl9CkBAIC01MjUsMTcgKzUyNCwzMSBAQAogCQl9IAogCX0KIAorCS8qKiAKKwkgKiBbQnVnIDI3OTM4Nl0gR3JheWVkIGl0ZW1zIG11c3Qgbm90IGJlIGRlc2VsZWN0ZWQuIAorCSAqLwogCXByaXZhdGUgdm9pZCBoYW5kbGVEZXNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCWF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCWlmIChpc1ZlcnNpb241KSB7Ci0JCQkoKERvdWJsZUNoZWNrYm94VGFibGVWaWV3ZXIpYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlcikuc2V0QWxsU2Vjb25kQ2hlY2tlZChmYWxzZSk7Ci0JCQlsaWJzVG9VbmNoZWNrLmNsZWFyKCk7Ci0JCX0KLQkJajJlZUNvbXBvbmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWphdmFQcm9qZWN0c0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChpc1ZlcnNpb241KSB7Ci0JCQlqMmVlTGliRWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlqYXZhTGliUHJvamVjdHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwkJCQorCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOworCQlmb3IgKFRhYmxlSXRlbSBpdGVtIDogaXRlbXMpIHsKKwkJCWlmIChpdGVtLmdldENoZWNrZWQoKSAmJiAhaXRlbS5nZXRHcmF5ZWQoKSkgeworCQkJCS8vIHVuY2hlY2sgdGhpcyBpdGVtIGlmIGFscmVhZHkgY2hlY2tlZCBhbmQgbm90IGdyYXllZAorCQkJCWl0ZW0uc2V0Q2hlY2tlZChmYWxzZSk7CisJCQkJaWYgKGlzVmVyc2lvbjUpIHsKKwkJCQkJKChEb3VibGVDaGVja2JveFRhYmxlSXRlbSkgaXRlbSkuc2V0U2Vjb25kQ2hlY2tlZChmYWxzZSk7CisJCQkJfQorCQkJCQorCQkJCS8vIHJlbW92ZSBmcm9tIHRoZSBjYWNoZSBsaXN0cworCQkJCU9iamVjdCBjb21wID0gaXRlbS5nZXREYXRhKCk7CisJCQkJaWYgKGNvbXAgIT0gbnVsbCkgeworCQkJCQlqMmVlQ29tcG9uZW50TGlzdC5yZW1vdmUoY29tcCk7CisJCQkJCWphdmFQcm9qZWN0c0xpc3QucmVtb3ZlKGNvbXApOworCQkJCQlpZiAoaXNWZXJzaW9uNSkgeworCQkJCQkJbGlic1RvVW5jaGVjay5yZW1vdmUoY29tcCk7CisJCQkJCQlqMmVlTGliRWxlbWVudExpc3QucmVtb3ZlKGNvbXApOworCQkJCQkJamF2YUxpYlByb2plY3RzTGlzdC5yZW1vdmUoY29tcCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CiAJCX0KIAl9CiAJCkBAIC01NTksNyArNTcyLDcgQEAKIAkJfQogCQkKIAkJLy9vbmx5IGFkZCB0aGUgYXJjaGl2ZSBhcyBhIHBvdGVudGlhbHkgbmV3IHJlZmVyZW5jZSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0Ci0JCWlmKCFyZWZBbHJlYWR5RXhpc3RzKSB7CisJCWlmKCFyZWZBbHJlYWR5RXhpc3RzICYmICFqMmVlQ29tcG9uZW50TGlzdC5jb250YWlucyhhcmNoaXZlKSAmJiAhYWRkZWRKQVJDb21wb25lbnRzLmNvbnRhaW5zKGFyY2hpdmUpKSB7CiAJCQl0aGlzLmoyZWVDb21wb25lbnRMaXN0LmFkZChhcmNoaXZlKTsKIAkJCXRoaXMuYWRkZWRKQVJDb21wb25lbnRzLmFkZChhcmNoaXZlKTsKIAkJfSBlbHNlIHsKQEAgLTYyMCwxMyArNjMzLDE2IEBACiAJCUFwcGxpY2F0aW9uIGFwcCA9IChBcHBsaWNhdGlvbilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpLmdldE1vZGVsT2JqZWN0KCk7CiAJCWlmIChsaWJEaXIgPT0gbnVsbCkgewogCQkJbGliRGlyID0gYXBwLmdldExpYnJhcnlEaXJlY3RvcnkoKTsKLQkJCWlmIChsaWJEaXIgPT0gbnVsbCkgbGliRGlyID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5FQVJfREVGQVVMVF9MSUJfRElSKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOworCQkJaWYgKGxpYkRpciA9PSBudWxsKSBsaWJEaXIgPSBKMkVFQ29uc3RhbnRzLkVBUl9ERUZBVUxUX0xJQl9ESVI7CiAJCX0KIAkJCiAJCUNoYW5nZUxpYkRpckRpYWxvZyBkbGcgPSBuZXcgQ2hhbmdlTGliRGlyRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKICAgICAgICAgICAgICAgICAuZ2V0U2hlbGwoKSwgbGliRGlyLCB3YXJuQmxhbmspOwogCQlpZiAoZGxnLm9wZW4oKSA9PSBEaWFsb2cuQ0FOQ0VMKSByZXR1cm47CiAJCWxpYkRpciA9IGRsZy5nZXRWYWx1ZSgpLnRyaW0oKTsKKwkJaWYgKGxpYkRpci5sZW5ndGgoKSA+IDApIHsKKwkJCWlmICghbGliRGlyLnN0YXJ0c1dpdGgoSjJFRUNvbnN0YW50cy5FQVJfUk9PVF9ESVIpKSBsaWJEaXIgPSBJUGF0aC5TRVBBUkFUT1IgKyBsaWJEaXI7CisJCX0KIAkJc2V0TGliRGlySW5Db250ZW50UHJvdmlkZXIoKTsKIAkJcmVmcmVzaCgpOwogCX0KQEAgLTY1OSwxMCArNjc1LDEwIEBACiAJcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHVzaEJ1dHRvbnMoKSB7CiAJCXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oU0VMRUNUX0FMTF9CVVRUT04pOwogCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oREVfU0VMRUNUX0FMTF9CVVRUT04pOwotCQlwcm9qZWN0SmFyQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5QUk9KRUNUX0pBUikpOy8vJE5PTi1OTFMtMSQKLQkJZXh0ZXJuYWxKYXJCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVYVEVSTkFMX0pBUikpOy8vJE5PTi1OTFMtMSQKLQkJYWRkVmFyaWFibGVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFERFZBUklBQkxFKSk7Ly8kTk9OLU5MUy0xJAotCQlpZiAoaXNWZXJzaW9uNSkgY2hhbmdlTGliUGF0aEJ1dHRvbiA9IGNyZWF0ZVB1c2hCdXR0b24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQ0hBTkdFX0xJQl9ESVIpKTsvLyROT04tTkxTLTEkCisJCXByb2plY3RKYXJCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLlBST0pFQ1RfSkFSKSk7CisJCWV4dGVybmFsSmFyQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FWFRFUk5BTF9KQVIpKTsKKwkJYWRkVmFyaWFibGVCdXR0b24gPSBjcmVhdGVQdXNoQnV0dG9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFERFZBUklBQkxFKSk7CisJCWlmIChpc1ZlcnNpb241KSBjaGFuZ2VMaWJQYXRoQnV0dG9uID0gY3JlYXRlUHVzaEJ1dHRvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5DSEFOR0VfTElCX0RJUikpOwogCX0KIAogCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihTdHJpbmcgbGFiZWwpIHsKQEAgLTcwMSw5ICs3MTcsMTggQEAKIAogCQlpZiAoZWFyQ29tcG9uZW50ICE9IG51bGwpIHsKIAkJCWludCBqMmVlVmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KGVhckNvbXBvbmVudCk7Ci0JCQlBdmFpbGFibGVKMkVFQ29tcG9uZW50c0ZvckVBUkNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBBdmFpbGFibGVKMkVFQ29tcG9uZW50c0ZvckVBUkNvbnRlbnRQcm92aWRlcihlYXJDb21wb25lbnQsIGoyZWVWZXJzaW9uKTsKKwkJCUlMYWJlbERlY29yYXRvciBkZWNvcmF0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpOworCQkJQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIoZWFyQ29tcG9uZW50LCBqMmVlVmVyc2lvbiwgZGVjb3JhdG9yKTsKKwkJCWRlY29yYXRvci5hZGRMaXN0ZW5lcihuZXcgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcigpeworCQkJCisJCQkJcHVibGljIHZvaWQgbGFiZWxQcm92aWRlckNoYW5nZWQoTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgeworCQkJCQlyZWZyZXNoKCk7CisJCQkJfQorCQkJfSk7CiAJCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7CiAJCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLnNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOworCQkJCisJCQkKIAkJCXNldExpYkRpckluQ29udGVudFByb3ZpZGVyKCk7CiAJCQlhZGRUYWJsZUxpc3RlbmVycygpOwogCQl9CkBAIC03MzgsNyArNzYzLDcgQEAKIAkJCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKIAkJCQkJY2FzZSBTV1QuTW91c2VEb3duOgogCQkJCQkJRXZlbnQgZSA9IG5ldyBFdmVudCAoKTsKLQkJCQkJCWUuaXRlbSA9IChUYWJsZUl0ZW0pIGxhYmVsLmdldERhdGEgKCJfVEFCTEVJVEVNIik7CisJCQkJCQllLml0ZW0gPSAoVGFibGVJdGVtKSBsYWJlbC5nZXREYXRhICgiX1RBQkxFSVRFTSIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQl0YWJsZS5zZXRTZWxlY3Rpb24gKG5ldyBUYWJsZUl0ZW0gW10geyhUYWJsZUl0ZW0pIGUuaXRlbX0pOwogCQkJCQkJdGFibGUubm90aWZ5TGlzdGVuZXJzIChTV1QuU2VsZWN0aW9uLCBlKTsKIAkJCQkJCXNoZWxsLmRpc3Bvc2UgKCk7CkBAIC03ODIsNyArODA3LDcgQEAKIAkJCQkJCQlsYWJlbCA9IG5ldyBMYWJlbCAodGlwLCBTV1QuV1JBUCk7CiAJCQkJCQkJbGFiZWwuc2V0Rm9yZWdyb3VuZCAoRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtQ29sb3IgKFNXVC5DT0xPUl9JTkZPX0ZPUkVHUk9VTkQpKTsKIAkJCQkJCQlsYWJlbC5zZXRCYWNrZ3JvdW5kIChEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvciAoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkpOwotCQkJCQkJCWxhYmVsLnNldERhdGEgKCJfVEFCTEVJVEVNIiwgaXRlbSk7CisJCQkJCQkJbGFiZWwuc2V0RGF0YSAoIl9UQUJMRUlURU0iLCBpdGVtKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCWxhYmVsLnNldFRleHQgKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkhPVkVSX0hFTFBfRk9SX0RJU0FCTEVEX0xJQlMpKTsKIAkJCQkJCQlsYWJlbC5hZGRMaXN0ZW5lciAoU1dULk1vdXNlRXhpdCwgbGFiZWxMaXN0ZW5lcik7CiAJCQkJCQkJbGFiZWwuYWRkTGlzdGVuZXIgKFNXVC5Nb3VzZURvd24sIGxhYmVsTGlzdGVuZXIpOwpAQCAtODA1LDcgKzgzMCw2IEBACiAJCQkJT2JqZWN0IGVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7CiAJCQkJaWYgKHZyLmdldEdyYXllZChlbGVtZW50KSkgCiAJCQkJCXZyLnNldENoZWNrZWQoZWxlbWVudCwgIXZyLmdldENoZWNrZWQoZWxlbWVudCkpOwotCQkJCU9iamVjdCBvID0gZXZlbnQuZ2V0U291cmNlKCk7CiAJCQkJaWYgKCEoZXZlbnQgaW5zdGFuY2VvZiBTZWNvbmRDaGVja0JveFN0YXRlQ2hhbmdlZEV2ZW50KSAmJiAoaXNWZXJzaW9uNSkpIHsKIAkJCQkJT2JqZWN0W10gaXRlbXMgPSAoKERvdWJsZUNoZWNrYm94VGFibGVWaWV3ZXIpdnIpLmdldFVuY2hlY2tlZEl0ZW1zKCk7CQkJCQkKIAkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewpAQCAtMTAwOCwxMSArMTAzMiwxMCBAQAogCX0KIAkKIAlwcml2YXRlIGJvb2xlYW4gaXNQaHlzaWNhbGx5QWRkZWQoVmlydHVhbEFyY2hpdmVDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCUlQYXRoIHAgPSBudWxsOwogCQl0cnkgewogCQkJaWYoY29tcG9uZW50LmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpID09IG51bGwgfHwgIWNvbXBvbmVudC5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKS5zZWdtZW50KDApLmVxdWFscyhlYXJDb21wb25lbnQuZ2V0TmFtZSgpKSkKIAkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlwID0gY29tcG9uZW50LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKKwkJCWNvbXBvbmVudC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKIAkJCXJldHVybiBmYWxzZTsKQEAgLTEwMjgsMTQgKzEwNTEsMTYgQEAKIAkKIAkKIAlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCisJCWlmKGF2YWlsYWJsZUNvbXBvbmVudHNWaWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCkgPT0gbnVsbCl7CisJCQlyZXR1cm47CisJCX0KIAkJSVdvcmtzcGFjZVJvb3QgaW5wdXQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwogCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLnNldElucHV0KGlucHV0KTsKIAkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwogCQlpbnQgbnVtbGluZXMgPSBNYXRoLm1pbigxMCwgYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpKTsKIAkJZGF0YS5oZWlnaHRIaW50ID0gYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1IZWlnaHQoKSAqIG51bWxpbmVzOwogCQlhdmFpbGFibGVDb21wb25lbnRzVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQorCQkKIAkJLy9bQnVnIDIzODI2NF0gZm9yIGFsbCB0aGUgamFycyBpbiB0aGUgY2FjaGUgdGVtcGFyYWx5IGxpc3QgdGhlbSBpbiB0aGUgZ3JpZAogCQkvLyB1bnRpbCB0aGUgdXNlciBhcHBseXMgdGhlIGNoYW5nZXMKIAkJZm9yKElWaXJ0dWFsQ29tcG9uZW50IGphckNvbXBvbmVudCA6IHRoaXMuYWRkZWRKQVJDb21wb25lbnRzKSB7CkBAIC0xMTI3LDEwICsxMTUyLDkgQEAKIAkJSVByb2plY3QgbGliUHJvaiA9IChsaWIgaW5zdGFuY2VvZiBJUHJvamVjdCkgPyAoSVByb2plY3QpbGliIDogKChJVmlydHVhbENvbXBvbmVudClsaWIpLmdldFByb2plY3QoKTsgCiAJCUlQcm9qZWN0IGVhclByb2plY3QgPSBlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpOwkKIAkJdHJ5IHsJCQkKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNtcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclByb2plY3QpOwogCQkJSVByb2plY3RbXSBlYXJSZWZQcm9qZWN0cyA9IGVhclByb2plY3QuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGVhclJlZlByb2plY3RzLmxlbmd0aDsgaSsrKSB7CQotCQkJCWlmICghSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGVhclJlZlByb2plY3RzW2ldKSAmJgorCQkJCWlmICghSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoZWFyUmVmUHJvamVjdHNbaV0pICYmCiAJCQkJCQkhZWFyUmVmUHJvamVjdHNbaV0uZXF1YWxzKGxpYlByb2opKSB7CiAJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNtcDEgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJSZWZQcm9qZWN0c1tpXSk7CiAJCQkJCWlmIChjbXAxICE9IG51bGwpIHsKQEAgLTExNzgsMTggKzEyMDIsMTQgQEAKIAkJSVBhdGggY29tcG9uZW50UGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKGFyY2hpdmUuZ2V0TmFtZSgpKTsKIAkJU3RyaW5nIHVyaU1hcE5hbWUgPSBjb21wb25lbnRQYXRoLmxhc3RTZWdtZW50KCkucmVwbGFjZSgnICcsICdfJyk7CiAJCQotCQlJUGF0aCByZXNvbHZlZFBhdGggPSBKYXZhQ29yZS5nZXRSZXNvbHZlZFZhcmlhYmxlUGF0aChuZXcgUGF0aCh1cmlNYXBOYW1lKSk7Ci0JCWlmKHJlc29sdmVkUGF0aCAhPSBudWxsKQotCQkJdXJpTWFwTmFtZSA9IHJlc29sdmVkUGF0aC5sYXN0U2VnbWVudCgpLnJlcGxhY2UoJyAnLCAnXycpOwogCQkKIAkJLy9jaGVjayB0byBiZSBzdXJlIHRoaXMgdXJpIG1hcHBpbmcgaXMgbm90IGFscmVhZHkgaW4gdXNlIGJ5IGFub3RoZXIgcmVmZXJlbmNlCiAJCWJvb2xlYW4gZHVwZUFyY2hpdmVOYW1lOwotCQlTdHJpbmcgcmVmZWRDb21wTmFtZTsKIAkJaW50IGxhc3REb3RJbmRleDsKIAkJU3RyaW5nIGluY3JlbWVudDsKIAkJSVZpcnR1YWxSZWZlcmVuY2UgW10gZXhpc3RpbmdSZWZzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKIAkJZm9yKGludCBpPTA7aTxleGlzdGluZ1JlZnMubGVuZ3RoO2krKyl7Ci0JCQlyZWZlZENvbXBOYW1lID0gZXhpc3RpbmdSZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXROYW1lKCk7CisJCQlleGlzdGluZ1JlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldE5hbWUoKTsKIAkJCQogCQkJLy9pZiB1cmkgbWFwcGluZyBuYW1lcyBvZiB0aGUgcmVmZWQgY29tcG9uZW50IGFuZCB0aGUgZ2l2ZW4gYXJjaGl2ZSBhcmUgdGhlIHNhbWUKIAkJCS8vICBmaW5kIGEgbmV3IHVyaSBtYXAgbmFtZSBmb3IgdGhlIGdpdmVuIGFyY2hpdmUKQEAgLTEyMzYsNDUgKzEyNTYsMjAgQEAKIAkJCWlmKHZpcnRDb21wLmlzQmluYXJ5KCkpewogCQkJCWxpbmtlZFRvRUFSID0gKChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpdmlydENvbXApLmlzTGlua2VkVG9FQVIoKTsKIAkJCQkoKEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCl2aXJ0Q29tcCkuc2V0TGlua2VkVG9FQVIoZmFsc2UpOwotCQkJCWJvb2xlYW4gaXNMaWJFbGVtZW50ID0gZmFsc2U7Ci0JCQkJZm9yKE9iamVjdCBjdXJFbGVtZW50IDogajJlZUxpYkVsZW1lbnRMaXN0KXsKLQkJCQkJaWYodmlydENvbXAgPT0gY3VyRWxlbWVudCkKLQkJCQkJCWlzTGliRWxlbWVudCA9IHRydWU7Ci0JCQkJfQotCQkJCS8vW0J1ZyAyOTkwNTldIG9wZW4gYW5kIGNhY2hlIGFyY2hpdmUgdXNpbmcgdGhlIERJU0NSSU1JTkFURV9NQUlOX0NMQVNTCi0JCQkJLy9vcHRpb24gYmVmb3JlIGF0dGVtcHRpbmcgdGhlIEphdmFFRVF1aWNrUGVlawotCQkJCWlmKGlzVmVyc2lvbjUgJiYgaXNMaWJFbGVtZW50KXsKLQkJCQkJSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLm9wZW5BcmNoaXZlQXNVdGlsaXR5KHZpcnRDb21wKTsKLQkJCQl9IGVsc2UgaWYgKCFpc1ZlcnNpb241KXsKLQkJCQkJLy8gaWYgcHJldmlvdXMgdG8gdmVyc2lvbiA1LCBkbyBub3QgZGlzY3JpbWluYXRlIG1haW4gY2xhc3MKLQkJCQkJSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLm9wZW5BcmNoaXZlKHZpcnRDb21wLCBmYWxzZSk7Ci0JCQkJfWVsc2UJCQkJCi0JCQkJewotCQkJCQlKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIub3BlbkFyY2hpdmUodmlydENvbXAsIHRydWUpOwotCQkJCX0KIAkJCX0KLQotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IG51bGw7Ci0JCQlpbnQgZXh0SW5kZXggPSB2aXJ0Q29tcFVSSU1hcE5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQkJCWlmKGV4dEluZGV4ID4gMCAmJiB2aXJ0Q29tcFVSSU1hcE5hbWUubGVuZ3RoKCkgPiBleHRJbmRleCkgewotCQkJCWV4dGVuc2lvbiA9IHZpcnRDb21wVVJJTWFwTmFtZS5zdWJzdHJpbmcoZXh0SW5kZXgpLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0KLQkJCWlmKGV4dGVuc2lvbiA9PSBudWxsIHx8ICFleHRlbnNpb24uZXF1YWxzKCIuemlwIikpIHsKLQkJCQlpZihKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYkNvbXBvbmVudCh2aXJ0Q29tcCkpIHsKLQkJCQkJaWYoZXh0ZW5zaW9uID09IG51bGwgfHwgIWV4dGVuc2lvbi5lcXVhbHMoSUoyRUVNb2R1bGVDb25zdGFudHMuV0FSX0VYVCkpIHsKLQkJCQkJCS8vd2ViIG1vZHVsZSBVUklzIG5lZWQgdG8gZW5kIGluIFdBUgotCQkJCQkJdmlydENvbXBVUklNYXBOYW1lICs9IElKMkVFTW9kdWxlQ29uc3RhbnRzLldBUl9FWFQ7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0pDQUNvbXBvbmVudCh2aXJ0Q29tcCkpIHsKLQkJCQkJaWYoZXh0ZW5zaW9uID09IG51bGwgfHwgIWV4dGVuc2lvbi5lcXVhbHMoSUoyRUVNb2R1bGVDb25zdGFudHMuUkFSX0VYVCkpIHsKLQkJCQkJCS8vY29ubmVjdG9yIG1vZHVsZSBVUklzIG5lZWQgdG8gZW5kIGluIFJBUgotCQkJCQkJdmlydENvbXBVUklNYXBOYW1lICs9IElKMkVFTW9kdWxlQ29uc3RhbnRzLlJBUl9FWFQ7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYoZXh0ZW5zaW9uID09IG51bGwgfHwgIWV4dGVuc2lvbi5lcXVhbHMoSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVCkpIHsKLQkJCQkJLy9hbGwgb3RoZXIgbW9kdWxlcyAoRUpCLCBBcHBDbGllbnQsIFV0aWxpdHkpIG5lZWQgdG8gZW5kIGluIEpBUgotCQkJCQl2aXJ0Q29tcFVSSU1hcE5hbWUgKz0gSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVDsKKwkJCWlmKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViQ29tcG9uZW50KHZpcnRDb21wKSkgeworCQkJCWlmKCF2aXJ0Q29tcFVSSU1hcE5hbWUuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuV0FSX0VYVCkpIHsKKwkJCQkJLy93ZWIgbW9kdWxlIFVSSXMgbmVlZCB0byBlbmQgaW4gV0FSCisJCQkJCXZpcnRDb21wVVJJTWFwTmFtZSArPSBJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUOwogCQkJCX0KKwkJCX0gZWxzZSBpZihKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBQ29tcG9uZW50KHZpcnRDb21wKSkgeworCQkJCWlmKCF2aXJ0Q29tcFVSSU1hcE5hbWUuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuUkFSX0VYVCkpIHsKKwkJCQkJLy9jb25uZWN0b3IgbW9kdWxlIFVSSXMgbmVlZCB0byBlbmQgaW4gUkFSCisJCQkJCXZpcnRDb21wVVJJTWFwTmFtZSArPSBJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhUOworCQkJCX0KKwkJCX0gZWxzZSBpZighdmlydENvbXBVUklNYXBOYW1lLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQpKSB7CisJCQkJLy9hbGwgb3RoZXIgbW9kdWxlcyAoRUpCLCBBcHBDbGllbnQsIFV0aWxpdHkpIG5lZWQgdG8gZW5kIGluIEpBUgorCQkJCXZpcnRDb21wVVJJTWFwTmFtZSArPSBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUOwogCQkJfQogCQl9IGZpbmFsbHkgewogCQkJaWYodmlydENvbXAuaXNCaW5hcnkoKSl7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9BdmFpbGFibGVKMkVFQ29tcG9uZW50c0ZvckVBUkNvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDJjOTc4YTQuLmYxZjY0OGQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9BdmFpbGFibGVKMkVFQ29tcG9uZW50c0ZvckVBUkNvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9BdmFpbGFibGVKMkVFQ29tcG9uZW50c0ZvckVBUkNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAgKiAgICAgU3RlZmFuIERpbW92LCBzdGVmYW4uZGltb3ZAc2FwLmNvbSAtIGJ1ZyAyMDc4MjYKKyAqICAgICBNaWxlbiBNYW5vdiwgbWlsZW4ubWFub3ZAc2FwLmNvbSAtIGJ1Z3MgMjQ4NjIzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWw7CiAKQEAgLTE3LDE1ICsxOCwxNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzUGF0aFNlbGVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWw7CkBAIC0zOSwxMyArNDIsMTUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwogCi1wdWJsaWMgY2xhc3MgQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgSVRhYmxlTGFiZWxQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCisJaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciwgSVRhYmxlTGFiZWxQcm92aWRlciB7CiAJCiAJZmluYWwgc3RhdGljIFN0cmluZyBQQVRIX1NFUEFSQVRPUiA9IFN0cmluZy52YWx1ZU9mKElQYXRoLlNFUEFSQVRPUik7CiAJCkBAIC01NCwxMiArNTksMjAgQEAKIAlwcml2YXRlIGJvb2xlYW4gaXNFRTUgPSBmYWxzZTsKIAlwcml2YXRlIFN0cmluZyBsaWJEaXIgPSBudWxsOwogCQorCXByaXZhdGUgSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCk7CisJCisJcHJpdmF0ZSBJTGFiZWxQcm92aWRlciB3b3JrYmVuY2hMYWJlbFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKIAkKIAlwdWJsaWMgQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXIoSVZpcnR1YWxDb21wb25lbnQgYUVhckNvbXBvbmVudCwgaW50IGoyZWVWZXJzaW9uKSB7CiAJCXN1cGVyKCk7CiAJCXRoaXMuajJlZVZlcnNpb24gPSBqMmVlVmVyc2lvbjsKIAkJZWFyQ29tcG9uZW50ID0gYUVhckNvbXBvbmVudDsKIAl9CisJCisJcHVibGljIEF2YWlsYWJsZUoyRUVDb21wb25lbnRzRm9yRUFSQ29udGVudFByb3ZpZGVyKElWaXJ0dWFsQ29tcG9uZW50IGFFYXJDb21wb25lbnQsIGludCBqMmVlVmVyc2lvbiwgSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcikgeworCQl0aGlzKGFFYXJDb21wb25lbnQsIGoyZWVWZXJzaW9uKTsKKwkJdGhpcy5kZWNvcmF0b3IgPSBkZWNvcmF0b3I7CisJfQogCiAJLyoKIAkgKiAobm9uLUphdmFkb2MpCkBAIC04MywyMiArOTYsMjMgQEAKIAkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKIAkJCWlmKE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpewogCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0KSB8fAotCQkJCQkJSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3QpIHx8Ci0JCQkJCQlKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpIHx8Ci0JCQkJCQlKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdCkgfHwKLQkJCQkJCUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QocHJvamVjdCkgKXsKKwkJCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0KSB8fAorCQkJCQkJSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QocHJvamVjdCkgfHwKKwkJCQkJCUphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSB8fAorCQkJCQkJSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdCkgfHwKKwkJCQkJCUphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdChwcm9qZWN0KSApewogCQkJCQlpbnQgY29tcEoyRUVWZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQoY29tcG9uZW50KTsKIAkJCQkJaWYoIGNvbXBKMkVFVmVyc2lvbiA8PSBqMmVlVmVyc2lvbil7CiAJCQkJCQl2YWxpZENvbXBMaXN0LmFkZChjb21wb25lbnQpOwogCQkJCQl9IGVsc2UgaWYoaXNFRTUpewogCQkJCQkJdmFsaWRDb21wTGlzdC5hZGQoY29tcG9uZW50KTsKIAkJCQkJfQotCQkJCX1lbHNlIGlmKG51bGwgIT0gZWFyQ29tcG9uZW50ICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSl7CisJCQkJfWVsc2UgaWYobnVsbCAhPSBlYXJDb21wb25lbnQgJiYgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QocHJvamVjdCkpewogCQkJCQkvL2ZpbmQgdGhlIEFyY2hpdmVDb21wb25lbnQKIAkJCQkJaWYgKGNvbXBvbmVudC5lcXVhbHMoIGVhckNvbXBvbmVudCApKSB7CiAJCQkJCQlpZiAoaXNFRTUpIHsKIAkJCQkJCQlTdHJpbmcgZWFyRERWZXJzaW9uID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFRERQcm9qZWN0VmVyc2lvbihwcm9qZWN0KTsKKwkJCQkJCQkvL0VFNlRPRE8KIAkJCQkJCQlib29sZWFuIGlzRERWZXJzaW9uNSA9IGVhckREVmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVCkgPyB0cnVlIDogZmFsc2U7CiAJCQkJCQkJaWYgKGlzRERWZXJzaW9uNSkgewogCQkJCQkJCQlBcHBsaWNhdGlvbiBhcHAgPSAoQXBwbGljYXRpb24pTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihwcm9qZWN0KS5nZXRNb2RlbE9iamVjdCgpOwpAQCAtMTQwLDIwICsxNTQsMTcgQEAKIAl9CiAJCiAJcHJpdmF0ZSBib29sZWFuIHNob3VsZFNob3coSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCWlmICghKGNvbXBvbmVudCBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSkgCisJCWlmICghY29tcG9uZW50LmlzQmluYXJ5KCkpIAogCQkJcmV0dXJuIHRydWU7CiAJCQotCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBjb21wID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KWNvbXBvbmVudDsKLQkJaWYoY29tcC5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKSA9PSBudWxsIHx8ICFjb21wLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpLnNlZ21lbnQoMCkuZXF1YWxzKGVhckNvbXBvbmVudC5nZXROYW1lKCkpKQorCQlJRmlsZSB3b3Jrc3BhY2VGaWxlID0gKElGaWxlKWNvbXBvbmVudC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKKwkJaWYoIHdvcmtzcGFjZUZpbGUgPT0gbnVsbCApIAorCQkJcmV0dXJuIHRydWU7CisJCWlmKCB3b3Jrc3BhY2VGaWxlLmdldEZ1bGxQYXRoKCkuc2VnbWVudCgwKS5lcXVhbHMoZWFyQ29tcG9uZW50LmdldE5hbWUoKSkpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJCi0JCUlQYXRoIHAgPSBudWxsOwotCQl0cnkgewotCQkJcCA9IGNvbXAuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKChwID09IG51bGwpICYmIChwLnNlZ21lbnRDb3VudCgpID09IDApKQorCQlJUGF0aCBwID0gd29ya3NwYWNlRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CisJCWlmICgocCA9PSBudWxsKSB8fCAocC5zZWdtZW50Q291bnQoKSA9PSAwKSkKIAkJCXJldHVybiB0cnVlOwkKIAkJSUNvbnRhaW5lciBmICA9IGVhckNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwogCQlTdHJpbmcgcm9vdEZvbGRlck5hbWUgPSBmLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50KDApOwpAQCAtMTc0LDEyICsxODUsMTMgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAkKLQlwcml2YXRlIFN0cmluZyBzdHJpcFNlcGFyYXRvcnMoU3RyaW5nIGRpcikgewotCQlpZiAoZGlyLnN0YXJ0c1dpdGgoUEFUSF9TRVBBUkFUT1IpKSAKLQkJCWRpciA9IGRpci5zdWJzdHJpbmcoMSk7Ci0JCWlmIChkaXIuZW5kc1dpdGgoUEFUSF9TRVBBUkFUT1IpKSAgCi0JCQlkaXIgPSBkaXIuc3Vic3RyaW5nKDAsIGRpci5sZW5ndGgoKSAtIDEpOwotCQlyZXR1cm4gZGlyOworCXByaXZhdGUgU3RyaW5nIHN0cmlwU2VwYXJhdG9ycyhmaW5hbCBTdHJpbmcgZGlyKSB7CisJCVN0cmluZyByZXR1cm5EaXIgPSBkaXI7CisJCWlmIChyZXR1cm5EaXIuc3RhcnRzV2l0aChQQVRIX1NFUEFSQVRPUikpIAorCQkJcmV0dXJuRGlyID0gcmV0dXJuRGlyLnN1YnN0cmluZygxKTsKKwkJaWYgKHJldHVybkRpci5lbmRzV2l0aChQQVRIX1NFUEFSQVRPUikpICAKKwkJCXJldHVybkRpciA9IHJldHVybkRpci5zdWJzdHJpbmcoMCwgcmV0dXJuRGlyLmxlbmd0aCgpIC0gMSk7CisJCXJldHVybiByZXR1cm5EaXI7CiAJfQkKIAogCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmNpZXMoZmluYWwgTGlzdCBjb21wb25lbnRMaXN0LCBmaW5hbCBNYXAgcGF0aFRvQ29tcCwgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCkgewpAQCAtMTg3LDcgKzE5OSw2IEBACiAJCQlKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCBqMmVlQ29tcCA9IChKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgcmVmZXJlbmNlZENvbXBvbmVudDsKIAkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gY3BSZWZzID0gajJlZUNvbXAuZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKTsKIAkJCWZvciAoaW50IGo9MDsgaiA8IGNwUmVmcy5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyB1bnJlc29sdmVkVVJJID0gbnVsbDsKIAkJCQkvLyBvbmx5IC4uLyBtYXBwaW5ncyBzdXBwb3J0ZWQgYXQgdGhpcyBsZXZlbAogCQkJCWlmICghY3BSZWZzW2pdLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUl9QQVRIKSkgewogCQkJCQljb250aW51ZTsKQEAgLTE5OSwxNyArMjEwLDE1IEBACiAJCQkJaWYgKGNvbXAgIT0gbnVsbCkgewogCQkJCQkvLyByZXBsYWNlIHdpdGggYSB0ZW1wIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IHdob3NlIElQcm9qZWN0IGlzIHNldCB0byBhIG5ldyBwc2V1ZG8gbmFtZSB0aGF0IGlzCiAJCQkJCS8vIHRoZSBjb25jYXRlbmF0aW9uIG9mIGFsbCBwcm9qZWN0IGNvbnRyaWJ1dGlvbnMgZm9yIHRoYXQgYXJjaGl2ZQotCQkJCQlpZiAoY29tcCBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7Ci0JCQkJCQlmaW5hbCBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBvbGRDb21wID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBjb21wOworCQkJCQlpZiAoY29tcC5pc0JpbmFyeSgpKSB7CiAJCQkJCQljb21wb25lbnRMaXN0LnJlbW92ZShjb21wKTsKLQkJCQkJCWZpbmFsIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IG5ld0NvbXBvbmVudCA9IENsYXNzUGF0aFNlbGVjdGlvbi51cGRhdGVEaXNwbGF5VmlydHVhbEFyY2hpdmVDb21wb25lbnQob2xkQ29tcCwgY3BSZWZzW2pdKTsKKwkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IG5ld0NvbXBvbmVudCA9IENsYXNzUGF0aFNlbGVjdGlvbi51cGRhdGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudERpc3BsYXkoY29tcCwgY3BSZWZzW2pdKTsKIAkJCQkJCXBhdGhUb0NvbXAucHV0KHBhdGgsIG5ld0NvbXBvbmVudCk7CiAJCQkJCQljb21wb25lbnRMaXN0LmFkZChuZXdDb21wb25lbnQpOwogCQkJCQl9CiAJCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBhdGhUb0NvbXAucHV0KHBhdGgsIGNwUmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwogCQkJCX0KKwkJCQlwYXRoVG9Db21wLnB1dChwYXRoLCBjcFJlZnNbal0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKIAkJCQljb21wb25lbnRMaXN0LmFkZChjcFJlZnNbal0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKIAkJCX0KIAkJfQpAQCAtMjIxLDkgKzIzMCwzMiBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKIAkgKi8KIAlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQlpZiAoY29sdW1uSW5kZXggPCAyKXsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxDb21wb25lbnQpIHsKKwkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KWVsZW1lbnQ7CisJCQkJcmV0dXJuIGdldERlY29yYXRlZEltYWdlKGNvbXApOworCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpeworCQkJCXJldHVybiB3b3JrYmVuY2hMYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOworCQkJfQorCQl9CiAJCXJldHVybiBudWxsOwogCX0KIAorCXByaXZhdGUgSW1hZ2UgZ2V0RGVjb3JhdGVkSW1hZ2UoSVZpcnR1YWxDb21wb25lbnQgY29tcCkgeworCQlyZXR1cm4gZ2V0RGVjb3JhdGVkSW1hZ2UoY29tcC5nZXRQcm9qZWN0KCkpOworCX0KKwkKKwlwcml2YXRlIEltYWdlIGdldERlY29yYXRlZEltYWdlKElQcm9qZWN0IHByb2plY3QpIHsKKwkJSW1hZ2UgaW1hZ2UgPSB3b3JrYmVuY2hMYWJlbFByb3ZpZGVyLmdldEltYWdlKHByb2plY3QpOworCQlpZiAoZGVjb3JhdG9yICE9IG51bGwpIHsKKwkJCUltYWdlIGRlY29yYXRlZCA9IGRlY29yYXRvci5kZWNvcmF0ZUltYWdlKGltYWdlLCBwcm9qZWN0KTsKKwkJCWlmIChkZWNvcmF0ZWQgIT0gbnVsbCkgeworCQkJCXJldHVybiBkZWNvcmF0ZWQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIGltYWdlOworCX0KKwogCS8qCiAJICogKG5vbi1KYXZhZG9jKQogCSAqIApAQCAtMjQxLDIwICsyNzMsNyBAQAogCQkJCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIElFQVJNb2RlbFByb3ZpZGVyKQogCQkJCXsKIAkJCQkJbmFtZSA9ICgoSUVBUk1vZGVsUHJvdmlkZXIpcHJvdmlkZXIpLmdldE1vZHVsZVVSSShjb21wKTsKLQkJCQkJLy9uYW1lIHdpbGwgYmUgbnVsbCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGFkZGVkIHRvIHRoZSBFQVIKLQkJCQkJLy9ib3RoIGNvbXBvbmVudCBwcm9qZWN0cyB3aWxsIGJlIGVxdWFsIHdoZW4gYWRkaW5nIGphcnMsIGV4dGVybmFsIGphcnMsIG9yIHZhcmlhYmxlcy4KLQkJCQkJaWYobmFtZSA9PSBudWxsICYmIGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCkuZXF1YWxzKGNvbXAuZ2V0UHJvamVjdCgpKSl7Ci0JCQkJCQluYW1lID0gY29tcC5nZXROYW1lKCk7Ci0JCQkJCQlpZihuYW1lICE9IG51bGwpeyAKLQkJCQkJCQkvL3N0cmlwIG9mZiBldmVyeXRoaW5nIGJ1dCBsYXN0IHNlZ21lbnQgdG8gYXZvaWQgY29uZnVzaW9uIHNvIGluc3RlYWQgb2YgCi0JCQkJCQkJLy9kaXNwbGF5aW5nICdsaWIvYzpcdGVtcFxmb28uamFyJyB0byB0aGUgdXNlciwgdGhlIHVzZXIgd2lsbCBzZWUgJ2Zvby5qYXInCi0JCQkJCQkJLy93aGljaCBpcyBleGFjdGx5IHdoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgdGhlIHNlY29uZCB0aW1lIHRoZSB1c2VyIG9wZW5zIHRoZSBwYWdlCi0JCQkJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG5hbWUpOwotCQkJCQkJCW5hbWUgPSBwYXRoLmxhc3RTZWdtZW50KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KIAkJCQl9Ci0JCQkJCiAJCQkJaWYoIG5hbWUgPT0gbnVsbCB8fCBuYW1lID09ICIiICl7IC8vJE5PTi1OTFMtMSQKIAkJCQkJbmFtZSA9IGNvbXAuZ2V0TmFtZSgpOwogCQkJCX0KQEAgLTI2Nyw1MyArMjg2LDIwIEBACiAJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KXsKIAkJCWlmIChjb2x1bW5JbmRleCAhPSAyKSB7CiAJCQkJcmV0dXJuICgoSVByb2plY3QpZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKIAkJCX0KKwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAogCQl9CQkKIAkJcmV0dXJuIG51bGw7CiAJfQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQorCQogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewogCX0KKworCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgeworCQkKKwl9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvQ2xhc3NwYXRoVGFibGVNYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvQ2xhc3NwYXRoVGFibGVNYW5hZ2VyLmphdmEKaW5kZXggOWVkYzAxMS4uYTE4YjBkMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0NsYXNzcGF0aFRhYmxlTWFuYWdlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9DbGFzc3BhdGhUYWJsZU1hbmFnZXIuamF2YQpAQCAtMTEsOSArMTEsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogQ3JlYXRlZCBvbiBKYW4gMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwogCkBAIC0zNSwxMCArMzIsMTUgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzcGF0aEVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNsYXNzcGF0aE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5DbGFzc3BhdGhNb2RlbEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5saXN0ZW5lcnMuSVZhbGlkYXRlRWRpdExpc3RlbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5BdmFpbGFibGVKYXJzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5FYXJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwpAQCAtNTEsMTUgKzUzLDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNsYXNzcGF0aE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5EZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKIAogLyoqCiAgKiBAYXV0aG9yIGppYWxpbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKICAqLwogcHVibGljIGNsYXNzIENsYXNzcGF0aFRhYmxlTWFuYWdlciBpbXBsZW1lbnRzIExpc3RlbmVyLCBJQ29tbW9uTWFuaWZlc3RVSUNvbnN0YW50cyB7CiAKQEAgLTQ1MywxMyArNDQ5LDEzIEBACiAJfQogCiAJcHJpdmF0ZSBib29sZWFuIGlzTGlicmFyeShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRDb21wb25lbnQoY29tcG9uZW50KSkgcmV0dXJuIGZhbHNlOwotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpICYmIGNvbXBvbmVudC5pc0JpbmFyeSgpKSByZXR1cm4gdHJ1ZTsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCQ29tcG9uZW50KGNvbXBvbmVudCkpIHJldHVybiBmYWxzZTsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYkNvbXBvbmVudChjb21wb25lbnQpKSByZXR1cm4gZmFsc2U7Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQUNvbXBvbmVudChjb21wb25lbnQpKSByZXR1cm4gZmFsc2U7Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc1N0YXRpY1dlYlByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHJldHVybiBmYWxzZTsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzUHJvamVjdE9mVHlwZShjb21wb25lbnQuZ2V0UHJvamVjdCgpLCBJSjJFRUZhY2V0Q29uc3RhbnRzLkpBVkEpKSByZXR1cm4gdHJ1ZTsKKwkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudENvbXBvbmVudChjb21wb25lbnQpKSByZXR1cm4gZmFsc2U7CisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSAmJiBjb21wb25lbnQuaXNCaW5hcnkoKSkgcmV0dXJuIHRydWU7CisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCQ29tcG9uZW50KGNvbXBvbmVudCkpIHJldHVybiBmYWxzZTsKKwkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViQ29tcG9uZW50KGNvbXBvbmVudCkpIHJldHVybiBmYWxzZTsKKwkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FDb21wb25lbnQoY29tcG9uZW50KSkgcmV0dXJuIGZhbHNlOworCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1N0YXRpY1dlYlByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHJldHVybiBmYWxzZTsKKwkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNQcm9qZWN0T2ZUeXBlKGNvbXBvbmVudC5nZXRQcm9qZWN0KCksIElKMkVFRmFjZXRDb25zdGFudHMuSkFWQSkpIHJldHVybiB0cnVlOwogCQlyZXR1cm4gdHJ1ZTsKIAl9CQkJCiAJCkBAIC00ODIsNyArNDc4LDcgQEAKIAkJCQkJCQlnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS4KIAkJCQkJCQkJZ2V0U2hlbGwoKSwgCiAJCQkJCSAgRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZy5ETEdfVFlQRV8xKTsKLQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBkbGcuQlROX0lEX0NBTkNFTCkgeworCQkJCWlmIChkbGcub3BlbigpID09IERlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cuQlROX0lEX0NBTkNFTCkgewogCQkJCQl2LnNldENoZWNrZWQoZWwsIGZhbHNlKTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KQEAgLTQ5Miw3ICs0ODgsNyBAQAogCQl9IGVsc2UgaWYgKCFldmVudC5nZXRDaGVja2VkKCkpIHsKIAkJCWNvbXBzVG9VbmNoZWNrLnJlbW92ZShjb21wKTsKIAkJfQotCQlpZiAoIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzU3RhbmRhbG9uZVByb2plY3QobW9kZWwuZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpKSAmJiAoaXNSZWFkT25seSgpIHx8ICF2YWxpZGF0YXRlRWRpdCgpIHx8IChpc015Q2xpZW50SkFSKGV2ZW50KSAmJiAhZXZlbnQuZ2V0Q2hlY2tlZCgpKSkpIHsKKwkJaWYgKCFFYXJVdGlsaXRpZXMuaXNTdGFuZGFsb25lUHJvamVjdChtb2RlbC5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpICYmIChpc1JlYWRPbmx5KCkgfHwgIXZhbGlkYXRhdGVFZGl0KCkgfHwgKGlzTXlDbGllbnRKQVIoZXZlbnQpICYmICFldmVudC5nZXRDaGVja2VkKCkpKSkgewogCQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRDaGVja2VkKGV2ZW50LmdldEVsZW1lbnQoKSwgIWV2ZW50LmdldENoZWNrZWQoKSk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTUwMiw3ICs0OTgsNyBAQAogCiAJCiAJcHJpdmF0ZSBib29sZWFuIGlzQ29uZmxpY3QoSVZpcnR1YWxDb21wb25lbnQgbGliKSB7Ci0JCUlQcm9qZWN0W10gZWFycyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMobGliLmdldFByb2plY3QoKSk7CisJCUlQcm9qZWN0W10gZWFycyA9IEVhclV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKGxpYi5nZXRQcm9qZWN0KCkpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGVhcnMubGVuZ3RoOyBpKyspIHsKIAkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pFRVByb2plY3QoZWFyc1tpXSkpIHsKIAkJCQlJVmlydHVhbENvbXBvbmVudCBjbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJzW2ldKTsKQEAgLTUxMCw3ICs1MDYsNyBAQAogCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgewkKIAkJCQkJaWYgKG1vZGVsLmdldFByb2plY3QoKS5lcXVhbHMocmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpKSkgewogCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gY21wLmdldFJlZmVyZW5jZShsaWIuZ2V0TmFtZSgpKTsKLQkJCQkJCWlmICghcmVmLmdldFJ1bnRpbWVQYXRoKCkuaXNSb290KCkpIHJldHVybiB0cnVlOworCQkJCQkJaWYgKHJlZiAhPSBudWxsICYmICFyZWYuZ2V0UnVudGltZVBhdGgoKS5pc1Jvb3QoKSkgcmV0dXJuIHRydWU7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBAIC01NDUsNyArNTQxLDcgQEAKIAl9CiAKIAlwcm90ZWN0ZWQgQ2xhc3NQYXRoU2VsZWN0aW9uIGdldENsYXNzcGF0aFNlbGVjdGlvbigpIHsKLQkJaWYgKG1vZGVsID09IG51bGwgfHwgbW9kZWwuZ2V0U2VsZWN0ZWRFQVJDb21wb25lbnQoKSA9PSBudWxsICYmICEoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNTdGFuZGFsb25lUHJvamVjdChtb2RlbC5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpKSkKKwkJaWYgKG1vZGVsID09IG51bGwgfHwgbW9kZWwuZ2V0U2VsZWN0ZWRFQVJDb21wb25lbnQoKSA9PSBudWxsICYmICEoRWFyVXRpbGl0aWVzLmlzU3RhbmRhbG9uZVByb2plY3QobW9kZWwuZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpKSkpCiAJCQlyZXR1cm4gbnVsbDsKIAkJcmV0dXJuIG1vZGVsLmdldENsYXNzUGF0aFNlbGVjdGlvbigpOwogCX0KQEAgLTU2Niw3ICs1NjIsNyBAQAogCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7CiAJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBtb2RlbC5nZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCk7CiAJCS8vIGlmIG5vdCBhIHdlYiBwcm9qZWN0IGFuZCBpdCBpcyBlaXRoZXIgcmVmZXJlbmNlZCBieSBhbiBFQVIgb3IgYSBkeW5hbWljIHdlYiBwcm9qZWN0LgotCQlpZiAoIWlzV0xQRW50cnkoKSAmJiAoIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzU3RhbmRhbG9uZVByb2plY3QocHJvamVjdCkgfHwgCisJCWlmICghaXNXTFBFbnRyeSgpICYmICghRWFyVXRpbGl0aWVzLmlzU3RhbmRhbG9uZVByb2plY3QocHJvamVjdCkgfHwgCiAJCQkJICAgICAgICAgICAgICAgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nV2ViUHJvamVjdHMocHJvamVjdCkubGVuZ3RoID4gMCkpKSB7CiAJCQlhdmFpbGFibGVKQVJzVmlld2VyLnNldElucHV0KGdldENsYXNzcGF0aFNlbGVjdGlvbigpKTsKIAkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JQ2xhc3NwYXRoVGFibGVPd25lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lDbGFzc3BhdGhUYWJsZU93bmVyLmphdmEKaW5kZXggOTRmNjRiMy4uYzJhZjFkMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lDbGFzc3BhdGhUYWJsZU93bmVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lDbGFzc3BhdGhUYWJsZU93bmVyLmphdmEKQEAgLTEwLDkgKzEwLDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKIApAQCAtMjMsOSArMjAsNiBAQAogCiAvKioKICAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwdWJsaWMgaW50ZXJmYWNlIElDbGFzc3BhdGhUYWJsZU93bmVyIHsKIAlCdXR0b24gcHJpbUNyZWF0ZVB1c2hCdXR0b24oU3RyaW5nIGxhYmVsLCBDb21wb3NpdGUgYnV0dG9uQ29sdW1uKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JQ29tbW9uTWFuaWZlc3RVSUNvbnN0YW50cy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lDb21tb25NYW5pZmVzdFVJQ29uc3RhbnRzLmphdmEKaW5kZXggYTZjNDU0Mi4uYTYxNjE5YiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lDb21tb25NYW5pZmVzdFVJQ29uc3RhbnRzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lDb21tb25NYW5pZmVzdFVJQ29uc3RhbnRzLmphdmEKQEAgLTEwLDkgKzEwLDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKIApAQCAtMjAsOSArMTcsNiBAQAogCiAvKioKICAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwdWJsaWMgaW50ZXJmYWNlIElDb21tb25NYW5pZmVzdFVJQ29uc3RhbnRzIHsKIAlTdHJpbmcgVVBfQlVUVE9OID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5VcF8xOyAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JSjJFRURlcGVuZGVuY2llc0NvbnRyb2wuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9JSjJFRURlcGVuZGVuY2llc0NvbnRyb2wuamF2YQppbmRleCA2MDA1MTMxLi5mODhlNmNlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSUoyRUVEZXBlbmRlbmNpZXNDb250cm9sLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0lKMkVFRGVwZW5kZW5jaWVzQ29udHJvbC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAvKioKICAqIEludGVyZmFjZSBmb3IgY2xhc3NlcyB0aGF0IGltcGxlbWVudCBhIHBvcnRpb24gdGhlICJKMkVFIE1vZHVsZSBEZXBlbmRlbmNpZXMiCiAgKiBwcm9wZXJ0eSBwYWdlIGxvZ2ljLgorICogQGRlcHJlY2F0ZWQgd3RwIDMuMgogICovCiBwdWJsaWMgaW50ZXJmYWNlIElKMkVFRGVwZW5kZW5jaWVzQ29udHJvbCBleHRlbmRzIElDb21tb25NYW5pZmVzdFVJQ29uc3RhbnRzIHsKIAkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRUNvbXBvbmVudFByb2plY3RNaWdyYXRvci5qYXZhCmluZGV4IGZkZjVjYjMuLjBiNzJlMDEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0oyRUVDb21wb25lbnRQcm9qZWN0TWlncmF0b3IuamF2YQpAQCAtNzMsMTIgKzczLDE5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47CiAKKy8qKgorICogVGhpcyBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIFdUUCAzLjEuMiBhbmQgd2lsbCBiZSBkZWxldGVkIHBvc3QgV1RQIDMuMi4KKyAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjkyOTM0CisgKiBAZGVwcmVjYXRlZCAKKyAqIEBhdXRob3IganNob2xsCisgKi8KIHB1YmxpYyBjbGFzcyBKMkVFQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yIGltcGxlbWVudHMgSUNvbXBvbmVudFByb2plY3RNaWdyYXRvciB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0xJQl9DT05UQUlORVIgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmNvbnRhaW5lciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9MSUJfUEFUSCA9ICIvV0VCLUlORi9saWIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTERfREVQTE9ZQUJMRVNfUEFUSCA9ICIuZGVwbG95YWJsZXMiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTElCX0NPTlRBSU5FUiA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTElCX1BBVEggPSAiL1dFQi1JTkYvbGliIjsgIC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xEX0RFUExPWUFCTEVTX1BBVEggPSAiLmRlcGxveWFibGVzIjsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKIAkKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKMkVFX0NPTlRFTlRfRVhURU5TSU9OX0lEUyA9IG5ldyBTdHJpbmdbXSB7CkBAIC05Miw3ICs5OSw2IEBACiAJCiAJcHVibGljIEoyRUVDb21wb25lbnRQcm9qZWN0TWlncmF0b3IoKSB7CiAJCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgogCX0KIAogCXB1YmxpYyB2b2lkIG1pZ3JhdGVQcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KSB7CkBAIC0xNzEsMTEgKzE3NywxMCBAQAogCQkJCQkJCWNyZWF0ZVByb2oobmV3UHJvaiwoIWNvbXAuZ2V0Q29tcG9uZW50VHlwZSgpLmdldENvbXBvbmVudFR5cGVJZCgpLmVxdWFscyhKMkVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OKSkpOwogCQkJCQkJCVd0cFV0aWxzLmFkZE5hdHVyZXMobmV3UHJvaik7CiAJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJCQlKMkVFVUlQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQkJaWYgKGNvbXAhPW51bGwgJiYgY29tcC5nZXRDb21wb25lbnRUeXBlKCkhPW51bGwpCisJCQkJCWlmIChjb21wLmdldENvbXBvbmVudFR5cGUoKSE9bnVsbCkKIAkJCQkJCWFkZEZhY2V0c1RvUHJvamVjdChuZXdQcm9qLGNvbXAuZ2V0Q29tcG9uZW50VHlwZSgpLmdldENvbXBvbmVudFR5cGVJZCgpLGNvbXAuZ2V0Q29tcG9uZW50VHlwZSgpLmdldFZlcnNpb24oKSxmYWxzZSk7CiAJCQkJCXJlbW92ZWRDb21wcy5hZGQoY29tcCk7CiAJCQkJCUlGb2xkZXIgY29tcEZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKGNvbXAuZ2V0TmFtZSgpKTsKQEAgLTE4Myw4ICsxODgsNyBAQAogCQkJCQkJdHJ5IHsKIAkJCQkJCQljb21wRm9sZGVyLmRlbGV0ZSh0cnVlLG51bGwpOwogCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCQkJfQogCQkJCX0KIAkJCQlzZS5nZXRDb21wb25lbnRNb2RlbFJvb3QoKS5nZXRDb21wb25lbnRzKCkucmVtb3ZlQWxsKHJlbW92ZWRDb21wcyk7CkBAIC0yMjUsMjEgKzIyOSwxOCBAQAogCQl0cnkgewogCQkJYVByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSxudWxsKTsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7CisJCQlKMkVFVUlQbHVnaW4ubG9nRXJyb3IoZTEpOwogCQl9CiAJCS8vSUphdmFQcm9qZWN0IGphdmFQID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChhUHJvamVjdCk7CiAJCUxpc3Qgb2xkQnVpbGRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW9sZEJ1aWxkZXJzLmFkZCgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkNvbXBvbmVudFN0cnVjdHVyYWxCdWlsZGVyIik7Ci0JCW9sZEJ1aWxkZXJzLmFkZCgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkNvbXBvbmVudFN0cnVjdHVyYWxCdWlsZGVyRGVwZW5kZW5jeVJlc29sdmVyIik7Ci0JCW9sZEJ1aWxkZXJzLmFkZCgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkRlcGVuZGVuY3lHcmFwaEJ1aWxkZXIiKTsKKwkJb2xkQnVpbGRlcnMuYWRkKCJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQ29tcG9uZW50U3RydWN0dXJhbEJ1aWxkZXIiKTsgLy8kTk9OLU5MUy0xJAorCQlvbGRCdWlsZGVycy5hZGQoIm9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Db21wb25lbnRTdHJ1Y3R1cmFsQnVpbGRlckRlcGVuZGVuY3lSZXNvbHZlciIpOyAvLyROT04tTkxTLTEkCisJCW9sZEJ1aWxkZXJzLmFkZCgib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLkRlcGVuZGVuY3lHcmFwaEJ1aWxkZXIiKTsgLy8kTk9OLU5MUy0xJAogCQl0cnkgewogCQkJSjJFRVByb2plY3RVdGlsaXRpZXMucmVtb3ZlQnVpbGRlcnMoYVByb2plY3Qsb2xkQnVpbGRlcnMpOwogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlKMkVFVUlQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0KLQkJCiAJfQogCiAJCXB1YmxpYyBTdHJpbmcgZ2V0RmFjZXRGcm9tUHJvamVjdChJUHJvamVjdCBhUHJvamVjdCkgewpAQCAtMjUwLDE2ICsyNTEsMTYgQEAKIAkJcHJvdGVjdGVkIElEYXRhTW9kZWwgc2V0dXBKYXZhSW5zdGFsbEFjdGlvbihJUHJvamVjdCBhUHJvamVjdCwgYm9vbGVhbiBleGlzdGluZyxTdHJpbmcgc3JjRm9sZGVyKSB7CiAJCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKIAkJCWRtLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBhUHJvamVjdC5nZXROYW1lKCkpOwotCQkJU3RyaW5nIGpWZXJzaW9uID0gIjEuNCI7CisJCQlTdHJpbmcgalZlcnNpb24gPSAiMS40IjsgLy8kTk9OLU5MUy0xJAogCQkJSVNjb3BlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2plY3RTY29wZSggcHJvamVjdCApOwogCQkgICAgSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcyAKIAkJICAgICAgICAgICAgPSBjb250ZXh0LmdldE5vZGUoIEphdmFDb3JlLlBMVUdJTl9JRCApOwogCQkJaWYgKEphdmFDb3JlLlZFUlNJT05fMV81LmVxdWFscyhwcmVmcy5nZXQoSmF2YUNvcmUuQ09NUElMRVJfQ09NUExJQU5DRSxKYXZhQ29yZS5WRVJTSU9OXzFfNCkpKSB7Ci0JCQkJalZlcnNpb24gPSAiNS4wIjsKKwkJCQlqVmVyc2lvbiA9ICI1LjAiOyAvLyROT04tTkxTLTEkCiAJCQl9Ci0JCQlkbS5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCBqVmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKKwkJCWRtLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIGpWZXJzaW9uKTsKIAkJCWlmICghZXhpc3RpbmcpCi0JCQkJZG0uc2V0U3RyaW5nUHJvcGVydHkoSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVJfTkFNRSwgc3JjRm9sZGVyKTsgLy8kTk9OLU5MUy0xJAorCQkJCWRtLnNldFN0cmluZ1Byb3BlcnR5KElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSX05BTUUsIHNyY0ZvbGRlcik7CiAJCQlyZXR1cm4gZG07CiAJCX0KIAkJCkBAIC0zNjgsOSArMzY5LDggQEAKIAkJCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0Q2F1c2UoKTsKIAkJCQlpZiAocmVhbEV4Y2VwdGlvbiAhPSBudWxsICYmIHJlYWxFeGNlcHRpb24gaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7CiAJCQkJCUlTdGF0dXMgc3QgPSAoKENvcmVFeGNlcHRpb24pcmVhbEV4Y2VwdGlvbikuZ2V0U3RhdHVzKCk7Ci0JCQkJCWlmIChzdCAhPSBudWxsKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0KTsKLQkJCQkJcmVhbEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBzdCAhPSBudWxsID8gc3QudG9TdHJpbmcoKSA6ICIiOyAvLyROT04tTkxTLTEkCisJCQkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihtZXNzYWdlLCByZWFsRXhjZXB0aW9uKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTM3OCw3ICszNzgsNyBAQAogCQlwcml2YXRlIElEYXRhTW9kZWwgc2V0dXBTdGF0aWNXZWJJbnN0YWxsQWN0aW9uKElQcm9qZWN0IHByb2plY3QyKSB7CiAJCQlJRGF0YU1vZGVsIHdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsKIAkJCXdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgcHJvamVjdDIuZ2V0TmFtZSgpKTsKLQkJCXdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCAiMS4wIik7CisJCQl3ZWJGYWNldEluc3RhbGxEYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgIjEuMCIpOyAvLyROT04tTkxTLTEkCiAJCQkKIAkJCXJldHVybiB3ZWJGYWNldEluc3RhbGxEYXRhTW9kZWw7CiAJCX0KQEAgLTM4OCw3ICszODgsNyBAQAogCQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwogCQkJZG0uc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIGFQcm9qZWN0LmdldE5hbWUoKSk7CiAJCQlGYWNldERhdGFNb2RlbE1hcCBmYWNldERNcyA9IChGYWNldERhdGFNb2RlbE1hcCkgZG0uZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotCQkJZmFjZXRETXMuYWRkKHNldHVwSmF2YUluc3RhbGxBY3Rpb24oYVByb2plY3QsZXhpc3RpbmcsInNyYyIpKTsKKwkJCWZhY2V0RE1zLmFkZChzZXR1cEphdmFJbnN0YWxsQWN0aW9uKGFQcm9qZWN0LGV4aXN0aW5nLCJzcmMiKSk7IC8vJE5PTi1OTFMtMSQKIAkJCUlEYXRhTW9kZWwgbmV3TW9kZWwgPSBzZXR1cFV0aWxJbnN0YWxsQWN0aW9uKGFQcm9qZWN0LHNwZWNWZXJzaW9uKTsKIAkJCWZhY2V0RE1zLmFkZChuZXdNb2RlbCk7CiAJCQl0cnkgewpAQCAtNDAxLDkgKzQwMSw4IEBACiAJCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldENhdXNlKCk7CiAJCQkJaWYgKHJlYWxFeGNlcHRpb24gIT0gbnVsbCAmJiByZWFsRXhjZXB0aW9uIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewogCQkJCQlJU3RhdHVzIHN0ID0gKChDb3JlRXhjZXB0aW9uKXJlYWxFeGNlcHRpb24pLmdldFN0YXR1cygpOwotCQkJCQlpZiAoc3QgIT0gbnVsbCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdCk7Ci0JCQkJCXJlYWxFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCVN0cmluZyBtZXNzYWdlID0gc3QgIT0gbnVsbCA/IHN0LnRvU3RyaW5nKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAorCQkJCQlKMkVFVUlQbHVnaW4ubG9nRXJyb3IobWVzc2FnZSwgcmVhbEV4Y2VwdGlvbik7CiAJCQkJfQogCQkJfQogCQkJCkBAIC00MjcsOSArNDI2LDggQEAKIAkJCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0Q2F1c2UoKTsKIAkJCQlpZiAocmVhbEV4Y2VwdGlvbiAhPSBudWxsICYmIHJlYWxFeGNlcHRpb24gaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7CiAJCQkJCUlTdGF0dXMgc3QgPSAoKENvcmVFeGNlcHRpb24pcmVhbEV4Y2VwdGlvbikuZ2V0U3RhdHVzKCk7Ci0JCQkJCWlmIChzdCAhPSBudWxsKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0KTsKLQkJCQkJcmVhbEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBzdCAhPSBudWxsID8gc3QudG9TdHJpbmcoKSA6ICIiOyAvLyROT04tTkxTLTEkCisJCQkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihtZXNzYWdlLCByZWFsRXhjZXB0aW9uKTsKIAkJCQl9CiAJCQl9CiAJCQkKQEAgLTQ1MSw5ICs0NDksOCBAQAogCQkJCVRocm93YWJsZSByZWFsRXhjZXB0aW9uID0gZS5nZXRDYXVzZSgpOwogCQkJCWlmIChyZWFsRXhjZXB0aW9uICE9IG51bGwgJiYgcmVhbEV4Y2VwdGlvbiBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKIAkJCQkJSVN0YXR1cyBzdCA9ICgoQ29yZUV4Y2VwdGlvbilyZWFsRXhjZXB0aW9uKS5nZXRTdGF0dXMoKTsKLQkJCQkJaWYgKHN0ICE9IG51bGwpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3QpOwotCQkJCQlyZWFsRXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQlTdHJpbmcgbWVzc2FnZSA9IHN0ICE9IG51bGwgPyBzdC50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKG1lc3NhZ2UsIHJlYWxFeGNlcHRpb24pOwogCQkJCX0KIAkJCX0KIAkJCQpAQCAtNDc3LDkgKzQ3NCw4IEBACiAJCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldENhdXNlKCk7CiAJCQkJaWYgKHJlYWxFeGNlcHRpb24gIT0gbnVsbCAmJiByZWFsRXhjZXB0aW9uIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewogCQkJCQlJU3RhdHVzIHN0ID0gKChDb3JlRXhjZXB0aW9uKXJlYWxFeGNlcHRpb24pLmdldFN0YXR1cygpOwotCQkJCQlpZiAoc3QgIT0gbnVsbCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdCk7Ci0JCQkJCXJlYWxFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCVN0cmluZyBtZXNzYWdlID0gc3QgIT0gbnVsbCA/IHN0LnRvU3RyaW5nKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAorCQkJCQlKMkVFVUlQbHVnaW4ubG9nRXJyb3IobWVzc2FnZSwgcmVhbEV4Y2VwdGlvbik7CiAJCQkJfQogCQkJfQogCQkJCkBAIC01MDQsOSArNTAwLDggQEAKIAkJCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0Q2F1c2UoKTsKIAkJCQlpZiAocmVhbEV4Y2VwdGlvbiAhPSBudWxsICYmIHJlYWxFeGNlcHRpb24gaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7CiAJCQkJCUlTdGF0dXMgc3QgPSAoKENvcmVFeGNlcHRpb24pcmVhbEV4Y2VwdGlvbikuZ2V0U3RhdHVzKCk7Ci0JCQkJCWlmIChzdCAhPSBudWxsKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0KTsKLQkJCQkJcmVhbEV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBzdCAhPSBudWxsID8gc3QudG9TdHJpbmcoKSA6ICIiOyAvLyROT04tTkxTLTEkCisJCQkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihtZXNzYWdlLCByZWFsRXhjZXB0aW9uKTsKIAkJCQl9CiAJCQl9CiAJCQkKQEAgLTUzMiwxNiArNTI3LDE0IEBACiAJCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldENhdXNlKCk7CiAJCQkJaWYgKHJlYWxFeGNlcHRpb24gIT0gbnVsbCAmJiByZWFsRXhjZXB0aW9uIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewogCQkJCQlJU3RhdHVzIHN0ID0gKChDb3JlRXhjZXB0aW9uKXJlYWxFeGNlcHRpb24pLmdldFN0YXR1cygpOwotCQkJCQlpZiAoc3QgIT0gbnVsbCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdCk7Ci0JCQkJCXJlYWxFeGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCVN0cmluZyBtZXNzYWdlID0gc3QgIT0gbnVsbCA/IHN0LnRvU3RyaW5nKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAorCQkJCQlKMkVFVUlQbHVnaW4ubG9nRXJyb3IobWVzc2FnZSwgcmVhbEV4Y2VwdGlvbik7CiAJCQkJfQogCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJaWYgKGV4ICE9IG51bGwgJiYgZXggaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7CisJCQkJaWYgKGV4IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewogCQkJCQlJU3RhdHVzIHN0ID0gKChDb3JlRXhjZXB0aW9uKWV4KS5nZXRTdGF0dXMoKTsKLQkJCQkJaWYgKHN0ICE9IG51bGwpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3QpOwotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBzdCAhPSBudWxsID8gc3QudG9TdHJpbmcoKSA6ICIiOyAvLyROT04tTkxTLTEkCisJCQkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihtZXNzYWdlLCBleCk7CiAJCQkJfQogCQkJfQogCQkJCkBAIC01NzMsOCArNTY2LDcgQEAKIAkJCQkJanByb2ouc2F2ZShudWxsLCB0cnVlKTsKIAkJCQl9CiAJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJCQogCQkKQEAgLTYwMywxNCArNTk1LDEzIEBACiAJCQkJanByb2ouc2V0UmF3Q2xhc3NwYXRoKHVwZGF0ZWQsIG51bGwpOwogCQkJCWpwcm9qLnNhdmUobnVsbCwgdHJ1ZSk7CiAJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJCQogCQl9CiAKIAkJcHJvdGVjdGVkIElSdW50aW1lIGdldFJ1bnRpbWVCeUlEKFN0cmluZyBpZCkgewotCQkJSVJ1bnRpbWVbXSB0YXJnZXRzID0gU2VydmVyVXRpbC5nZXRSdW50aW1lcygiIiwgIiIpOworCQkJSVJ1bnRpbWVbXSB0YXJnZXRzID0gU2VydmVyVXRpbC5nZXRSdW50aW1lcygiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkrKykgewogCQkJCUlSdW50aW1lIHRhcmdldCA9IHRhcmdldHNbaV07CiAJCQkJaWYgKGlkLmVxdWFscyh0YXJnZXQuZ2V0SWQoKSkpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRURlcGVuZGVuY2llc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFRGVwZW5kZW5jaWVzUGFnZS5qYXZhCmluZGV4IDMxZDBjNzkuLmQ5NWM2ZDEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFRGVwZW5kZW5jaWVzUGFnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFRGVwZW5kZW5jaWVzUGFnZS5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5FYXJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKQEAgLTM1LDYgKzM2LDcgQEAKICAqIFByaW1hcnkgcHJvamVjdCBwcm9wZXJ0eSBwYWdlIGZvciBKMkVFIGRlcGVuZGVuY2llczsgY29udGVudCBpcyBkeW5hbWljYWxseSAKICAqIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgcHJvamVjdCBmYWNldHMgYW5kIHdpbGwgYmUgY29tcHJpc2VkIGJ5IGEKICAqIHNldCBvZiBJSjJFRURlcGVuZGVuY2llc0NvbnRyb2wgaW1wbGVtZW50YXRpb25zLgorICogCiAgKi8KIHB1YmxpYyBjbGFzcyBKMkVFRGVwZW5kZW5jaWVzUGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7CiAJCkBAIC01MCw2ICs1Miw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewogCQkKIAkJLy8gTmVlZCB0byBmaW5kIG91dCB3aGF0IHR5cGUgb2YgcHJvamVjdCB3ZSBhcmUgaGFuZGxpbmcKQEAgLTEwMiwzOSArMTA1LDM4IEBACiAJfQogCQogCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVdlYkNvbnRlbnQoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBib29sZWFuIHN0YW5kYWxvbmUgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5pc1N0YW5kYWxvbmVQcm9qZWN0KHByb2plY3QpOworCQlmaW5hbCBib29sZWFuIHN0YW5kYWxvbmUgPSBFYXJVdGlsaXRpZXMuaXNTdGFuZGFsb25lUHJvamVjdChwcm9qZWN0KTsKIAkJCiAJCWlmIChzdGFuZGFsb25lKSB7CiAJCQkvLyBvbmx5IG5lZWQgdG8gY3JlYXRlIHRoZSBXZWIgTGlicmFyaWVzIHBhZ2UKIAkJCWNvbnRyb2xzID0gbmV3IElKMkVFRGVwZW5kZW5jaWVzQ29udHJvbFsxXTsKIAkJCWNvbnRyb2xzWzBdID0gbmV3IFdlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZShwcm9qZWN0LCB0aGlzKTsKIAkJCXJldHVybiBjb250cm9sc1swXS5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQl9IGVsc2UgewotCQkJLy8gQ3JlYXRlIGEgdGFiYmVkIGZvbGRlciB3aXRoIGJvdGggIkoyRUUgTW9kdWxlcyIgYW5kICJXZWIgTGlicmFyaWVzIgotCQkJZmluYWwgVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBUYWJGb2xkZXIocGFyZW50LCBTV1QuTEVGVCk7Ci0JCQlmb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQlmb2xkZXIuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQkJLy8gQ3JlYXRlIHRoZSB0d28gdGFicyAKLQkJCWNvbnRyb2xzID0gbmV3IElKMkVFRGVwZW5kZW5jaWVzQ29udHJvbFsyXTsKLQkJCi0JCQljb250cm9sc1swXSA9IG5ldyBKQVJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UocHJvamVjdCwgdGhpcyk7Ci0JCQlUYWJJdGVtIHRhYiA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQkJdGFiLnNldENvbnRyb2woY29udHJvbHNbMF0uY3JlYXRlQ29udGVudHMoZm9sZGVyKSk7Ci0JCQl0YWIuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLkoyRUVfTW9kdWxlcyk7Ci0JCQljb250cm9sc1sxXSA9IG5ldyBXZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UocHJvamVjdCwgdGhpcyk7CQkKLQkJCXRhYiA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQkJdGFiLnNldENvbnRyb2woY29udHJvbHNbMV0uY3JlYXRlQ29udGVudHMoZm9sZGVyKSk7Ci0JCQl0YWIuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLldlYl9MaWJyYXJpZXMpOwotCQkKLQkJCWZvbGRlci5zZXRTZWxlY3Rpb24oMCk7Ci0JCQlyZXR1cm4gZm9sZGVyOwogCQl9CisJCS8vIENyZWF0ZSBhIHRhYmJlZCBmb2xkZXIgd2l0aCBib3RoICJKMkVFIE1vZHVsZXMiIGFuZCAiV2ViIExpYnJhcmllcyIKKwkJZmluYWwgVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBUYWJGb2xkZXIocGFyZW50LCBTV1QuTEVGVCk7CisJCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJZm9sZGVyLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CisKKwkJLy8gQ3JlYXRlIHRoZSB0d28gdGFicyAKKwkJY29udHJvbHMgPSBuZXcgSUoyRUVEZXBlbmRlbmNpZXNDb250cm9sWzJdOworCQorCQljb250cm9sc1swXSA9IG5ldyBKQVJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UocHJvamVjdCwgdGhpcyk7CisJCVRhYkl0ZW0gdGFiID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7CisJCXRhYi5zZXRDb250cm9sKGNvbnRyb2xzWzBdLmNyZWF0ZUNvbnRlbnRzKGZvbGRlcikpOworCQl0YWIuc2V0VGV4dChNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLkoyRUVfTW9kdWxlcyk7CisJCWNvbnRyb2xzWzFdID0gbmV3IFdlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZShwcm9qZWN0LCB0aGlzKTsJCQorCQl0YWIgPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKKwkJdGFiLnNldENvbnRyb2woY29udHJvbHNbMV0uY3JlYXRlQ29udGVudHMoZm9sZGVyKSk7CisJCXRhYi5zZXRUZXh0KE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuV2ViX0xpYnJhcmllcyk7CisJCisJCWZvbGRlci5zZXRTZWxlY3Rpb24oMCk7CisJCXJldHVybiBmb2xkZXI7CiAJfQogCQogCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZU5vbkVBUkNvbnRlbnQoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewogCQljb250cm9scyA9IG5ldyBJSjJFRURlcGVuZGVuY2llc0NvbnRyb2xbMV07Ci0JCWZpbmFsIGJvb2xlYW4gc3RhbmRhbG9uZSA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzU3RhbmRhbG9uZVByb2plY3QocHJvamVjdCk7CisJCWZpbmFsIGJvb2xlYW4gc3RhbmRhbG9uZSA9IEVhclV0aWxpdGllcy5pc1N0YW5kYWxvbmVQcm9qZWN0KHByb2plY3QpOwogCQlpZiAoc3RhbmRhbG9uZSkgewogCQkJLy8gaWYgbm90IHJlZmVyZW5jZWQgYnkgYW4gRUFSLCBjaGVjayBpZiByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyB3ZWIgcHJvamVjdAogCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nV2ViUHJvamVjdHMocHJvamVjdCkubGVuZ3RoID4gMCkgewpAQCAtMTU4LDYgKzE2MCw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKIAkJCWlmIChjb250cm9sc1tpXSAhPSBudWxsKSB7CkBAIC0xNzIsNiArMTc1LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7CiAJCQlpZiAoY29udHJvbHNbaV0gIT0gbnVsbCkgewpAQCAtMTgzLDYgKzE4Nyw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybUNhbmNlbCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gcGVyZm9ybUNhbmNlbCgpIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250cm9scy5sZW5ndGg7IGkrKykgewogCQkJaWYgKGNvbnRyb2xzW2ldICE9IG51bGwpIHsKQEAgLTE5Nyw2ICsyMDIsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2Ujc2V0VmlzaWJsZShib29sZWFuKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7CiAJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbHMubGVuZ3RoOyBpKyspIHsKQEAgLTIwOSw2ICsyMTUsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjZGlzcG9zZSgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKIAkJc3VwZXIuZGlzcG9zZSgpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLmphdmEKaW5kZXggOWMwOGNmZC4uZDQyYzY2ZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL0pBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KQVJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UuamF2YQpAQCAtNzUsMTAgKzc1LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5saXN0ZW5lcnMuSVZhbGlkYXRlRWRpdExpc3RlbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmxpc3RlbmVycy5WYWxpZGF0ZUVkaXRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSUoyRUVNb2R1bGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklFQVJNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRWFyVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87CkBAIC05OCw3ICsxMDAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmJ1aWxkZXIuRGVwZW5kZW5jeUdyYXBoTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuYnVpbGRlci5JRGVwZW5kZW5jeUdyYXBoOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5SZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwpAQCAtMTE1LDkgKzExNyw3IEBACiAKIC8qKgogICogQGF1dGhvciBqaWFsaW4KLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcworICogQGRlcHJlY2F0ZWQgd3RwIDMuMgogICovCiBwdWJsaWMgY2xhc3MgSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIGltcGxlbWVudHMgSUoyRUVEZXBlbmRlbmNpZXNDb250cm9sLCBJQ2xhc3NwYXRoVGFibGVPd25lciwgTGlzdGVuZXIsIENsYXNzcGF0aE1vZGVsTGlzdGVuZXIsIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIHsKIApAQCAtMzMwLDEwICszMzAsMTAgQEAKIAl9CiAKIAlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkQ29tcG9uZW50KCkgewotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKSB7CisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSkgewogCQkJcHJvcFBhZ2Uuc2V0RXJyb3JNZXNzYWdlKE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuRUFSX01vZHVsZV9EZXBfRXJyb3IpOwogCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzU3RhbmRhbG9uZVByb2plY3QobW9kZWwuZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpKSkgeworCQl9IGVsc2UgaWYgKEVhclV0aWxpdGllcy5pc1N0YW5kYWxvbmVQcm9qZWN0KG1vZGVsLmdldENvbXBvbmVudCgpLmdldFByb2plY3QoKSkpIHsKIAkJCXByb3BQYWdlLnNldEVycm9yTWVzc2FnZShDbGFzc3BhdGhNb2RlbC5OT19FQVJfTUVTU0FHRSk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KQEAgLTU0MSw3ICs1NDEsNyBAQAogCXB1YmxpYyB2b2lkIHJlZnJlc2hUZXh0KCkgewogCQlDbGFzc1BhdGhTZWxlY3Rpb24gc2VsID0gbW9kZWwuZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCk7CiAJCWlmIChzZWwgIT0gbnVsbCAmJiBjbGFzc1BhdGhUZXh0ICE9IG51bGwpCi0JCQljbGFzc1BhdGhUZXh0LnNldFRleHQoc2VsID09IG51bGwgPyAiIiA6IHNlbC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJY2xhc3NQYXRoVGV4dC5zZXRUZXh0KHNlbC50b1N0cmluZygpKTsKIAl9CiAKIAkvKioKQEAgLTYxMyw3ICs2MTMsNyBAQAogCQkJCXdoaWxlICh3bHBJdGVyYXRvci5oYXNOZXh0KCkpIHsKIAkJCQkJQ2xhc3NwYXRoRWxlbWVudCB3bHBFbGVtZW50ID0gKENsYXNzcGF0aEVsZW1lbnQpIHdscEl0ZXJhdG9yLm5leHQoKTsKIAkJCQkJU3RyaW5nIHRleHQgPSBlbGVtZW50LmdldFRleHQoKTsKLQkJCQkJaW50IGluZGV4ID0gdGV4dC5pbmRleE9mKCIuamFyIik7CisJCQkJCWludCBpbmRleCA9IHRleHQuaW5kZXhPZihJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUKTsKIAkJCQkJaWYgKGluZGV4ICE9IC0xKSB7CiAJCQkJCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgaW5kZXgpOwogCQkJCQkJaWYgKHRleHQuZXF1YWxzKHdscEVsZW1lbnQuZ2V0VGV4dCgpKSkgewpAQCAtNjUxLDcgKzY1MSw3IEBACiAJCQkJd2hpbGUgKGoyZWVJdGVyYXRvci5oYXNOZXh0KCkpIHsKIAkJCQkJQ2xhc3NwYXRoRWxlbWVudCBqMmVlRWxlbWVudCA9IChDbGFzc3BhdGhFbGVtZW50KSBqMmVlSXRlcmF0b3IubmV4dCgpOwogCQkJCQlTdHJpbmcgdGV4dCA9IGoyZWVFbGVtZW50LmdldFRleHQoKTsKLQkJCQkJaW50IGluZGV4ID0gdGV4dC5pbmRleE9mKCIuamFyIik7CisJCQkJCWludCBpbmRleCA9IHRleHQuaW5kZXhPZihJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUKTsKIAkJCQkJaWYoIGluZGV4ICE9IC0xICl7CiAJCQkJCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgaW5kZXgpOwogCQkJCQkJaWYgKGVsZW1lbnQuZ2V0VGV4dCgpLmVxdWFscyh0ZXh0KSkgewpAQCAtOTI4LDkgKzkyOCw4IEBACiAJCQlhbGxDb21wc1RvVW5jaGVjay5hZGQoY29tcCk7CiAJCQlpZiAoY29tcCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgYWxsQ29tcE5hbWVzVG9VbmNoZWNrLmFkZChjb21wLmdldE5hbWUoKSk7CiAJCX0KLSAJCUlQcm9qZWN0W10gZWFycyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMocHJvamVjdCk7CisgCQlJUHJvamVjdFtdIGVhcnMgPSBFYXJVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhwcm9qZWN0KTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRUFSTW9kZWxQcm92aWRlciBlYXJNb2RlbCA9IChJRUFSTW9kZWxQcm92aWRlcilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKGVhcnNbaV0pOwogCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkVFUHJvamVjdChlYXJzW2ldKSkgewkKIAkJCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJzW2ldKTsKIAkJCQlMaXN0IGxpc3RUb1VuY2hlY2sgPSBjcmVhdGVMaXN0VG9VbmNoZWNrKGVhckNvbXBvbmVudCwgYWxsQ29tcHNUb1VuY2hlY2ssIGFsbENvbXBOYW1lc1RvVW5jaGVjayk7CkBAIC05NDUsOCArOTQ0LDYgQEAKIAkJSVN0YXR1cyBzdGF0ID0gSURhdGFNb2RlbFByb3ZpZGVyLk9LX1NUQVRVUzsKIAkJU3RyaW5nIGxpYkRpciA9ICgoQXBwbGljYXRpb24pTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpKS5nZXRNb2RlbE9iamVjdCgpKS5nZXRMaWJyYXJ5RGlyZWN0b3J5KCk7CiAJCWxpYkRpciA9IChsaWJEaXIgPT0gbnVsbCkgPyBKMkVFQ29uc3RhbnRzLkVBUl9ERUZBVUxUX0xJQl9ESVIgOiBsaWJEaXI7Ci0JCWlmKGxpYkRpciAhPSBudWxsKQotCQkJbGliRGlyID0gbmV3IFBhdGgobGliRGlyKS5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpOwogCQlNYXAgZGVwZW5kZW50Q29tcHMgPSBnZXRFQVJNb2R1bGVEZXBlbmRlbmNpZXMoZWFyQ29tcG9uZW50LCBjb21wc1RvVW5jaGVja0xpc3QpOwogCQl0cnkgewogCQkJSURhdGFNb2RlbE9wZXJhdGlvbiBvcCA9IHJlbW92ZUNvbXBvbmVudEZyb21FQVJPcGVyYXRpb24oZWFyQ29tcG9uZW50LCBjb21wc1RvVW5jaGVja0xpc3QsIGxpYkRpcik7CkBAIC05NjEsNyArOTU4LDYgQEAKIAkKIAkKIAlwcml2YXRlIElTdGF0dXMgYWRkTW9kdWxlc1RvRUFSKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBmaW5hbCBMaXN0IGNvbXBzVG9VbmNoZWNrTGlzdCkgewotCQlJU3RhdHVzIHN0YXQgPSBJRGF0YU1vZGVsUHJvdmlkZXIuT0tfU1RBVFVTOwogCQl0cnkgewogCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpewogCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uewpAQCAtMTAyMywxNiArMTAxOSwxNyBAQAogCQkJCiAJCQlmaW5hbCBMaXN0IGNvbXBzRm9yUHJvamVjdCA9IG5ldyBBcnJheUxpc3QoKTsKIAkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpIGNvbXBvbmVudHMuZ2V0KGkpOwotCQkJZmluYWwgSVByb2plY3RbXSBkZXBlbmRlbnRQcm9qZWN0cyA9IERlcGVuZGVuY3lHcmFwaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXREZXBlbmRlbmN5R3JhcGgoKS5nZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoY29tcC5nZXRQcm9qZWN0KCkpOworCQkJU2V0PElQcm9qZWN0PiByZWZlcmVuY2luZ0NvbXBvbmVudHMgPSBJRGVwZW5kZW5jeUdyYXBoLklOU1RBTkNFLmdldFJlZmVyZW5jaW5nQ29tcG9uZW50cyhwcm9qZWN0KTsKKwkJCUlQcm9qZWN0IFtdIGRlcGVuZGVudFByb2plY3RzID0gcmVmZXJlbmNpbmdDb21wb25lbnRzLnRvQXJyYXkobmV3IElQcm9qZWN0W3JlZmVyZW5jaW5nQ29tcG9uZW50cy5zaXplKCldKTsKIAkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVwZW5kZW50UHJvamVjdHMubGVuZ3RoOyBqKyspIHsKIAkJCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gZGVwZW5kZW50UHJvamVjdHNbal07CiAJCQkJLy8gaWYgdGhpcyBpcyBhbiBFQVIsIGNhbiBza2lwCi0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSkgeworCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSkgewogCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgZGVwZW5kZW50Q29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwogCQkJCS8vIGVuc3VyZSB0aGF0IHRoZSBwcm9qZWN0J3Mgc2hhcmUgYW4gRUFSCi0JCQkJZmluYWwgSVByb2plY3RbXSByZWZFQVJzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhwcm9qZWN0KTsKKwkJCQlmaW5hbCBJUHJvamVjdFtdIHJlZkVBUnMgPSBFYXJVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhwcm9qZWN0KTsKIAkJCQlib29sZWFuIHNhbWVFQVIgPSBmYWxzZTsKIAkJCQlmb3IgKGludCBrID0gMDsgayA8IHJlZkVBUnMubGVuZ3RoOyBrKyspIHsKIAkJCQkJaWYgKHJlZkVBUnNba10uZXF1YWxzKGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7CkBAIC0xMDQ0LDcgKzEwNDEsNyBAQAogCQkJCQljb250aW51ZTsKIAkJCQl9CiAJCQkJLy8gaWYgdGhlIGRlcGVuZGVuY3kgaXMgYSB3ZWIgbGliIGRlcGVuZGVuY3ksIGNhbiBza2lwCi0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKKwkJCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7CiAJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IGRlcGVuZGVudENvbXAuZ2V0UmVmZXJlbmNlKGNvbXAuZ2V0TmFtZSgpKTsKIAkJCQkJaWYgKHJlZiAhPSBudWxsICYmIHJlZi5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhuZXcgUGF0aCgiL1dFQi1JTkYvbGliIikpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCWNvbnRpbnVlOwpAQCAtMTA5MSw3ICsxMDg4LDcgQEAKIAkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuc2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1BTklGRVNUX0ZJTEUsIG1hbmlmZXN0bWYpOwogCQlTdHJpbmdbXSBjcCA9IG1mLmdldENsYXNzUGF0aFRva2VuaXplZCgpOwogCQlMaXN0IGNwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nIGNwVG9SZW1vdmUgPSB0YXJnZXRQcm9qTmFtZSArICIuamFyIjsvLyROT04tTkxTLTEkCisJCVN0cmluZyBjcFRvUmVtb3ZlID0gdGFyZ2V0UHJvak5hbWUgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7CiAJCQlpZiAoIWNwW2ldLmVxdWFscyhjcFRvUmVtb3ZlKSkgewogCQkJCWNwTGlzdC5hZGQoY3BbaV0pOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL01hbmlmZXN0RXJyb3JQcm9tcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL01hbmlmZXN0RXJyb3JQcm9tcHRlci5qYXZhCmluZGV4IGU3MGM3ZTcuLmNlMzA5YjQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9NYW5pZmVzdEVycm9yUHJvbXB0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvTWFuaWZlc3RFcnJvclByb21wdGVyLmphdmEKQEAgLTEwLDkgKzEwLDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKIApAQCAtMjEsOSArMTgsNiBAQAogCiAvKioKICAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwdWJsaWMgY2xhc3MgTWFuaWZlc3RFcnJvclByb21wdGVyIGltcGxlbWVudHMgSUNvbW1vbk1hbmlmZXN0VUlDb25zdGFudHMgewogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvU2Vjb25kQ2hlY2tCb3hTdGF0ZUNoYW5nZWRFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1NlY29uZENoZWNrQm94U3RhdGVDaGFuZ2VkRXZlbnQuamF2YQppbmRleCBkZjBkZjdlLi5lZWIxZjVlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvU2Vjb25kQ2hlY2tCb3hTdGF0ZUNoYW5nZWRFdmVudC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9TZWNvbmRDaGVja0JveFN0YXRlQ2hhbmdlZEV2ZW50LmphdmEKQEAgLTE2LDYgKzE2LDEwIEBACiAKIHB1YmxpYyBjbGFzcyBTZWNvbmRDaGVja0JveFN0YXRlQ2hhbmdlZEV2ZW50IGV4dGVuZHMgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCB7CiAJCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDQ5NzE4NjYwNzQxMzg1NjM2N0w7CiAJcHJpdmF0ZSBEb3VibGVDaGVja2JveFRhYmxlSXRlbSBpdGVtID0gbnVsbDsKIAkKIAlwdWJsaWMgU2Vjb25kQ2hlY2tCb3hTdGF0ZUNoYW5nZWRFdmVudChJQ2hlY2thYmxlIHNvdXJjZSwgCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9VcGRhdGVNYW5pZmVzdE9wZXJhdGlvbi5qYXZhCmluZGV4IGNkZjFjMTkuLmYwNjM3YjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9VcGRhdGVNYW5pZmVzdE9wZXJhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9VcGRhdGVNYW5pZmVzdE9wZXJhdGlvbi5qYXZhCkBAIC0xMCwxMyArMTAsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIENyZWF0ZWQgb24gSmFuIDE3LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbDsKIAoraW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CisKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdEltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKQEAgLTI1LDEwICsyNSw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmVuYWJsZW1lbnQubm9udWkuV0ZUV3JhcHBlZEV4Y2VwdGlvbjsKIAogLyoqCisgKiBAZGVwcmVjYXRlZCBhcyBvZiB3dHAgMy4yCiAgKiBAYXV0aG9yIGppYWxpbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKICAqLwogcHVibGljIGNsYXNzIFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyB7CiAJcHJvdGVjdGVkIFN0cmluZyBwcm9qZWN0TmFtZTsKQEAgLTM2LDYgKzM0LDcgQEAKIAlwcm90ZWN0ZWQgYm9vbGVhbiByZXBsYWNlOwogLyoqCiAgKiBVcGRhdGVNYW5pZmVzdE9wZXJhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgorICogQGRlcHJlY2F0ZWQgYXMgb2Ygd3RwIDMuMgogICovCiBwdWJsaWMgVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24oU3RyaW5nIGFQcm9qZWN0TmFtZSwgU3RyaW5nIGFTcGFjZURlbGltaXRlZFBhdGgsIGJvb2xlYW4gcmVwbGFjZUluc3RlYWRPZk1lcmdlKSB7CiAJc3VwZXIoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XZWJMaWJEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UuamF2YQppbmRleCBkZjViNmMzLi5iZDZkYmU1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZS5qYXZhCkBAIC0zMSwxNSArMzEsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzcGF0aEVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNsYXNzcGF0aE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5DbGFzc3BhdGhNb2RlbExpc3RlbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwpAQCAtNTMsMTYgKzUyLDIxIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKIAotcHVibGljIGNsYXNzIFdlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSBleHRlbmRzIEpBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSBpbXBsZW1lbnRzIElDbGFzc3BhdGhUYWJsZU93bmVyLCBMaXN0ZW5lciwgQ2xhc3NwYXRoTW9kZWxMaXN0ZW5lciB7CisvKioKKyAqIEBkZXByZWNhdGVkIHd0cCAzLjIKKyAqLworcHVibGljIGNsYXNzIFdlYkxpYkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSBleHRlbmRzIEpBUkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZSB7CiAKIAlwdWJsaWMgV2ViTGliRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIEoyRUVEZXBlbmRlbmNpZXNQYWdlIHBhZ2UpIHsKIAkJc3VwZXIocHJvamVjdCwgcGFnZSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIENsYXNzcGF0aE1vZGVsIGNyZWF0ZUNsYXNzcGF0aE1vZGVsKCkgewogCQlyZXR1cm4gbmV3IENsYXNzcGF0aE1vZGVsKG51bGwsIHRydWUpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAkJaW5pdGlhbGl6ZSgpOwogCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQmFzaWNDb21wb3NpdGUocGFyZW50KTsKQEAgLTgwLDYgKzg0LDcgQEAKIAkJcmV0dXJuIGNvbXBvc2l0ZTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQcm9qZWN0TGFiZWxzR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewogCiAJCUNvbXBvc2l0ZSBsYWJlbHNHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CkBAIC05OCw2ICsxMDMsNyBAQAogCQljb21wb25lbnROYW1lVGV4dC5zZXRUZXh0KHByb2plY3QuZ2V0TmFtZSgpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMaXN0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewogCQlDb21wb3NpdGUgbGlzdEdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKIAkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwpAQCAtMTE2LDYgKzEyMiw3IEBACiAJCWNyZWF0ZVRhYmxlQ29tcG9zaXRlKGxpc3RHcm91cCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewogCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKIAkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKQEAgLTEyNSw3ICsxMzIsNyBAQAogCX0KIAogCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRXZWJNb2R1bGUoKSB7Ci0JCWlmICghSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgeworCQlpZiAoIUphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewogCQkJcHJvcFBhZ2Uuc2V0RXJyb3JNZXNzYWdlKE1hbmlmZXN0VUlSZXNvdXJjZUhhbmRsZXIuV2ViX0xpYl9FcnJvcik7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KQEAgLTE2Niw2ICsxNzMsNyBAQAogCQlzZXRFbmFibGVtZW50KCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewogCQlpZiAobW9kZWwuZ2V0Q29tcG9uZW50KCkgPT0gbnVsbCB8fCAhaXNWYWxpZFdlYk1vZHVsZSgpKSB7CiAJCQlyZXR1cm4gdHJ1ZTsKQEAgLTIwMyw4ICsyMTEsNyBAQAogCQkJCWlmIChlbGVtZW50UHJvamVjdCAhPSBudWxsICYmICFlbGVtZW50UHJvamVjdC5oYXNOYXR1cmUoSU1vZHVsZUNvbnN0YW50cy5NT0RVTEVfTkFUVVJFX0lEKSkKIAkJCQkJcHJvamVjdHNMaXN0LmFkZChlbGVtZW50UHJvamVjdCk7CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3IoZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gKElQcm9qZWN0W10pcHJvamVjdHNMaXN0LnRvQXJyYXkobmV3IElQcm9qZWN0W3Byb2plY3RzTGlzdC5zaXplKCldKTsKQEAgLTIxNSwxNiArMjIyLDE1IEBACiAJCQlpZiAoY29tcG9zZWQgIT0gbnVsbCkKIAkJCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHByb3BQYWdlLmdldFNoZWxsKCkpLnJ1bih0cnVlLCB0cnVlLCBjb21wb3NlZCk7CiAJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwogCQkJaWYgKGV4LmdldENhdXNlKCkgIT0gbnVsbCkgewotCQkJCWV4LmdldENhdXNlKCkucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKGV4LmdldENhdXNlKCkpOwogCQkJfQogCQkJU3RyaW5nIHRpdGxlID0gTWFuaWZlc3RVSVJlc291cmNlSGFuZGxlci5Bbl9pbnRlcm5hbF9lcnJvcl9vY2N1cnJlZF9FUlJPUl87CiAJCQlTdHJpbmcgbXNnID0gdGl0bGU7CiAJCQlpZiAoZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCAmJiBleC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkKIAkJCQltc2cgPSBleC5nZXRUYXJnZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCk7CiAJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihwcm9wUGFnZS5nZXRTaGVsbCgpLCB0aXRsZSwgbXNnKTsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOworCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKGV4KTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogCQkJLy8gY2FuY2VsbGVkCkBAIC0yMzcsNyArMjQzLDcgQEAKIAogCXsKIAkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEpOworCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCiAJCX0KIAkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IHByb2plY3Q7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YVByb2plY3RzLmxlbmd0aDsgaSsrKSB7CkBAIC0yNjksNyArMjc1LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCUoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZ0Vycm9yKGV4KTsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGV4KTsKIAkJCX0gZmluYWxseSB7CiAJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewogCQkJCQltb25pdG9yLmRvbmUoKTsKQEAgLTI5MSw3ICsyOTcsNyBAQAogCX0KIAkKIAlwdWJsaWMgdm9pZCBoYW5kbGVTZWxlY3RFeHRlcm5hbEphckJ1dHRvbigpIHsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKKwkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewogCQkJSVBhdGhbXSBzZWxlY3RlZCA9IEJ1aWxkUGF0aERpYWxvZ0FjY2Vzcy5jaG9vc2VFeHRlcm5hbEpBUkVudHJpZXMocHJvcFBhZ2UuZ2V0U2hlbGwoKSk7CiAJCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgewogCQkJCVN0cmluZyB0eXBlID0gVmlydHVhbEFyY2hpdmVDb21wb25lbnQuTElCQVJDSElWRVRZUEUgKyBJUGF0aC5TRVBBUkFUT1I7CkBAIC0zMDQsNyArMzEwLDcgQEAKIAl9CiAKIAlwdWJsaWMgdm9pZCBoYW5kbGVTZWxlY3RWYXJpYWJsZUJ1dHRvbigpIHsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKKwkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewogCQkJSVBhdGggZXhpc3RpbmdQYXRoW10gPSBuZXcgUGF0aFswXTsKIAkJCUlQYXRoW10gc2VsZWN0ZWQgPSBCdWlsZFBhdGhEaWFsb2dBY2Nlc3MuY2hvb3NlVmFyaWFibGVFbnRyaWVzKHByb3BQYWdlLmdldFNoZWxsKCksIGV4aXN0aW5nUGF0aCk7CiAKQEAgLTM0OSw3ICszNTUsNyBAQAogLy8JfQogCiAJcHVibGljIHZvaWQgaGFuZGxlU2VsZWN0UHJvamVjdEphckJ1dHRvbigpIHsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKKwkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewogCQkJSVBhdGhbXSBzZWxlY3RlZCA9IEJ1aWxkUGF0aERpYWxvZ0FjY2Vzcy5jaG9vc2VKQVJFbnRyaWVzKHByb3BQYWdlLmdldFNoZWxsKCksIHByb2plY3QuZ2V0TG9jYXRpb24oKSwgbmV3IElQYXRoWzBdKTsKIAkJCWlmIChzZWxlY3RlZCAhPSBudWxsKSB7CiAJCQkJU3RyaW5nIHR5cGUgPSBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5MSUJBUkNISVZFVFlQRSArIElQYXRoLlNFUEFSQVRPUjsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XZWJSZWZEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9XZWJSZWZEZXBlbmRlbmN5UHJvcGVydGllc1BhZ2UuamF2YQppbmRleCAzODI3ZTFhLi4wOTE4N2IyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV2ViUmVmRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dlYlJlZkRlcGVuZGVuY3lQcm9wZXJ0aWVzUGFnZS5qYXZhCkBAIC0xNSwxMiArMTUsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwogCiAvKioKICAqIFN1cHBvcnRzIFVJIG1hbmlwdWxhdGlvbiBvZiB0aGUgcHVibGlzaGVkL2V4cG9ydGVkIGNsYXNzcGF0aCBlbnRyaWVzIGZvciBwcm9qZWN0cyByZWZlcmVuY2VkIGJ5IGR5bmFtaWMgd2ViIHByb2plY3RzLgorICogQGRlcHJlY2F0ZWQgd3RwIDMuMgogICovCiBwdWJsaWMgY2xhc3MgV2ViUmVmRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIGV4dGVuZHMgSkFSRGVwZW5kZW5jeVByb3BlcnRpZXNQYWdlIHsKIApAQCAtNjMsNyArNjUsNyBAQAogCQl0cnkgewogCQkJaXNKYXZhUHJvamVjdCA9IHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHt9Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpIHx8ICFpc0phdmFQcm9qZWN0KSB7CisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkgfHwgIWlzSmF2YVByb2plY3QpIHsKIAkJCXByb3BQYWdlLnNldEVycm9yTWVzc2FnZShNYW5pZmVzdFVJUmVzb3VyY2VIYW5kbGVyLkR5bmFtaWNfV2ViX0Vycm9yKTsgCiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdXZWJQcm9qZWN0cyhwcm9qZWN0KS5sZW5ndGggPT0gMCkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL1dvcmtzcGFjZU1vZGlmeUNvbXBvc2VkT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YQppbmRleCAwYjUxZWRjLi45M2ZjNGIwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvV29ya3NwYWNlTW9kaWZ5Q29tcG9zZWRPcGVyYXRpb24uamF2YQpAQCAtMTAsOSArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogQ3JlYXRlZCBvbiBKYW4gMTcsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdEFjdGlvbldpdGhEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RBY3Rpb25XaXRoRGVsZWdhdGUuamF2YQppbmRleCAxZGJjZTNkLi5iNTVhZWFiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdEFjdGlvbldpdGhEZWxlZ2F0ZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0QWN0aW9uV2l0aERlbGVnYXRlLmphdmEKQEAgLTQ0LDYgKzQ0LDcgQEAKIAkvKioKIAkgKiBJbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZGVmaW5lZCBvbiA8Y29kZT5JQWN0aW9uPC9jb2RlPi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBydW4oKSB7CiAJCWRlbGVnYXRlLnJ1bih0aGlzKTsKIAl9CkBAIC02Miw2ICs2Myw3IEBACiAJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYWN0aW9uIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGlzIHNlbGVjdGlvbiwgYW5kCiAJICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewogCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKHRoaXMsIHNlbGVjdGlvbik7CiAJCXJldHVybiB0aGlzLmlzRW5hYmxlZCgpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RPcGVuQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5BY3Rpb24uamF2YQppbmRleCBmYmQ2MDJlLi43ZDExYWM2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5BY3Rpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5BY3Rpb24uamF2YQpAQCAtNTcsNiArNTcsNyBAQAogCSAqIEBwYXJhbSBzZWwKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgc3RydWN0dXJlZCBzZWxlY3Rpb24KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gcykgewogCQlzcmNPYmplY3QgPSBudWxsOwogCQlpZiAoIXN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzKSkKQEAgLTEwMyw3ICsxMDQsNiBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKIAkgKi8KIAlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlydW4oKTsKIAogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0T3BlbldpemFyZEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uLmphdmEKaW5kZXggZDY1Mjk4Mi4uMDcxYjU5MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RPcGVuV2l6YXJkQWN0aW9uLmphdmEKQEAgLTExMSw2ICsxMTEsNyBAQAogCS8qKgogCSAqIFRoZSB1c2VyIGhhcyBpbnZva2VkIHRoaXMgYWN0aW9uLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJV2l6YXJkIHdpemFyZCA9IGNyZWF0ZVdpemFyZCgpOwogCQlpZiAod2l6YXJkIGluc3RhbmNlb2YgSVdvcmtiZW5jaFdpemFyZCkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24uamF2YQppbmRleCA1YzcwOTM2Li5jY2M0MmFlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24uamF2YQpAQCAtMTMsNiArMTMsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VBY3Rpb24uamF2YQppbmRleCA3Y2M3MTMxLi40YTFlZDdmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9CYXNlQWN0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvQmFzZUFjdGlvbi5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CkBAIC00Nyw2ICs0Niw3IEBACiAJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJU2hlbGwgc2hlbGwgPSBnZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwogCQlpZiAobnVsbCA9PSBzZWxlY3Rpb24pIHsKQEAgLTU5LDcgKzU5LDcgQEAKIAkJCXByaW1SdW4oc2hlbGwpOwogCQkJdGhpcy5zZWxlY3Rpb24gPSBudWxsOwogCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHQpOworCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKHQpOwogCQkJU3RyaW5nIEVSUk9SX09DQ1VSUkVEX1RJVExFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVSUk9SX09DQ1VSUkVEX1RJVExFIik7IC8vJE5PTi1OTFMtMSQKIAkJCVN0cmluZyBFUlJPUl9PQ0NVUlJFRF9NRVNTQUdFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVSUk9SX09DQ1VSUkVEX01FU1NBR0UiKTsgLy8kTk9OLU5MUy0xJAogCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBFUlJPUl9PQ0NVUlJFRF9USVRMRSwgRVJST1JfT0NDVVJSRURfTUVTU0FHRSwgdCwgMCwgZmFsc2UpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvRm9yY2VDbGFzc3BhdGhVcGRhdGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0ZvcmNlQ2xhc3NwYXRoVXBkYXRlQWN0aW9uLmphdmEKaW5kZXggMDEyMmJhNS4uMzQwNzU2YyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvRm9yY2VDbGFzc3BhdGhVcGRhdGVBY3Rpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9Gb3JjZUNsYXNzcGF0aFVwZGF0ZUFjdGlvbi5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiAKIAlwcml2YXRlIExpc3QgcHJvamVjdHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5mb3JjZVVwZGF0ZShwcm9qZWN0c0xpc3QpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0lKMkVFVUlDb250ZXh0SWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9JSjJFRVVJQ29udGV4dElkcy5qYXZhCmluZGV4IGUyNWZjMGMuLjcxZGEzNjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0lKMkVFVUlDb250ZXh0SWRzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSUoyRUVVSUNvbnRleHRJZHMuamF2YQpAQCAtNTgsNSArNTgsNiBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVBVEVfTU9EVUxFX0RJQUxPR18xID0gSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCArICIubmF2bTIwMTAiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FX0VBUl9ESUFMT0dfMSA9IEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQgKyAiLm5hdm0zMDAwIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTkFNRV9NT0RVTEVfRElBTE9HXzEgPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5uYXZtMzAxMCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lNRU5UX0FTU0VNQkxZX1BSRUZFUkVOQ0VfUEFHRV9BRERfUkVGRVJFTkNFRF9QUk9KRUNUX0NMQVNTUEFUSF9FTlRSSUVTPSBKMkVFVUlQbHVnaW4uUExVR0lOX0lEICsgIi5ERVBMT1lNRU5UX0FTU0VNQkxZX1BSRUZFUkVOQ0VfUEFHRV9BRERfUkVGRVJFTkNFRF9QUk9KRUNUX0NMQVNTUEFUSF9FTlRSSUVTIjsgLy8kTk9OLU5MUy0xJAogCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9JbXBvcnRDbGFzc2VzQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9JbXBvcnRDbGFzc2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZmY0ODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSW1wb3J0Q2xhc3Nlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAzMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQ2xhc3Nlc0ltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0Q2xhc3Nlc0FjdGlvbiBleHRlbmRzIFdUUEJhc2VBY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTEFCRUwgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiSW1wb3J0X0NsYXNzZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEltcG9ydENsYXNzZXNBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRleHQoTEFCRUwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuY29tbW9uLmFjdGlvbnMuQmFzZUFjdGlvbiNwcmltUnVuKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChnZXRTZWxlY3Rpb24oKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCUNsYXNzZXNJbXBvcnRXaXphcmQgd2l6YXJkID0gbmV3IENsYXNzZXNJbXBvcnRXaXphcmQocHJvamVjdCk7Ci0KLQotCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKTsKLQkJd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKSk7Ci0KLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDU1MCwgNTUwKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZWxldGVBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZWxldGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4MzM4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFRGVsZXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwudXRpbC5Db21tb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5jb21wb25lbnRjb3JlLnV0aWwuRUpCQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlbGV0ZS5EZWxldGVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuRGVsZXRlRUFSRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuRGVsZXRlTW9kdWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuSjJFRURlbGV0ZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkoyRUVEZWxldGVVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uQ29tbW9uRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuRGVsZXRlUmVzb3VyY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEoyRUVEZWxldGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBpbXBsZW1lbnRzIEoyRUVEZWxldGVVSUNvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7Ci0JLy9Vc2VkIGZvciBFQVIgZGVsZXRlCi0JcHJvdGVjdGVkIFNldCByZWZlcmVuY2VkUHJvamVjdHM7Ci0JcHJvdGVjdGVkIExpc3QgcHJvamVjdHM7Ci0JcHJvdGVjdGVkIERlbGV0ZU9wdGlvbnMgb3B0aW9uczsKLQkvLyBhZGRlZCBmb3IgSVJlZmFjdG9yaW5nQWN0aW9uIGJlaGF2aW9yCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0KLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIERlbGV0ZU1vZHVsZUFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBKMkVFRGVsZXRlQWN0aW9uKElXb3JrYmVuY2hTaXRlIHNpdGUsIFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihzaXRlKTsKLQkJc2V0VGV4dChERUxFVEUpOwotCQlzaGVsbCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgSjJFRURlbGV0ZUFjdGlvbihJV29ya2JlbmNoU2l0ZSBzaXRlLCBJU2VsZWN0aW9uUHJvdmlkZXIgbmV3UHJvdmlkZXIpIHsKLQkJc3VwZXIoc2l0ZSk7Ci0JCXNldFRleHQoREVMRVRFKTsKLQkJc2hlbGwgPSBKMkVFVUlQbHVnaW4uZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJcHJvdmlkZXIgPSBuZXdQcm92aWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKLQkJcmVmZXJlbmNlZFByb2plY3RzID0gbnVsbDsKLQkJcHJvamVjdHMgPSBudWxsOwotCQlvcHRpb25zID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRFbmFibGVTdGF0ZUJhc2VkT25TZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaXNTZWxlY3Rpb25BcHBsaWNhYmxlKCkgJiYgaXNTZWxlY3Rpb25Tb21lSjJFRSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5TZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiN1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl1cGRhdGUoc2VsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGlvbkFwcGxpY2FibGUoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJSXRlcmF0b3IgaXQgPSBzZWwuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIWlzSjJFRU1vZHVsZShvKSAmJiAhaXNBcHBsaWNhdGlvbihvKSAmJiAhaXNQcm9qZWN0T3JKYXZhUHJvamVjdChvKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3Rpb25Tb21lSjJFRSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlJdGVyYXRvciBpdCA9IHNlbC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmIChpc0oyRUVNb2R1bGUobykgfHwgaXNBcHBsaWNhdGlvbihvKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGlvbkFsbEREUm9vdHMoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJSXRlcmF0b3IgaXQgPSBzZWwuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIWlzSjJFRU1vZHVsZShvKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3Rpb25BbGxBcHBsaWNhdGlvbnMoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJSXRlcmF0b3IgaXQgPSBzZWwuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIWlzQXBwbGljYXRpb24obykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSjJFRU1vZHVsZShPYmplY3QgbykgewotCQkvL1RPRE8gc3dpdGNoIHRvIHZpcnR1YWwgY29tcAotLy8JCWlmIChvIGluc3RhbmNlb2YgV29ya2JlbmNoQ29tcG9uZW50KSB7Ci0vLwkJCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSAoV29ya2JlbmNoQ29tcG9uZW50KSBvOwotLy8JCQlTdHJpbmcgbW9kdWxlVHlwZSA9IG1vZHVsZS5nZXRDb21wb25lbnRUeXBlKCkuZ2V0Q29tcG9uZW50VHlwZUlkKCk7Ci0vLwkJCS8vVE9ETyBuZWVkIHRvIGFkZCBjb25uZWN0b3IsIGFwcCBjbGllbnQsIGVhciwgZWpiIGNsaWVudAotLy8JCQlyZXR1cm4gbW9kdWxlVHlwZS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSkgfHwgbW9kdWxlVHlwZS5lcXVhbHMoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRSk7Ci0vLwkJfQotCQlyZXR1cm4gQ29tbW9uVXRpbC5pc0RlcGxveW1lbnREZXNjcmlwdG9yUm9vdChvLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBcHBsaWNhdGlvbihPYmplY3QgbykgewotCQlyZXR1cm4gKG8gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbikgfHwgaXNKMkVFQXBwbGljYXRpb25Qcm9qZWN0KG8pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUHJvamVjdE9ySmF2YVByb2plY3QoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChvIGluc3RhbmNlb2YgSVByb2plY3QpIHx8IChvIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9qZWN0cygpIHsKLQkJaWYgKHByb2plY3RzID09IG51bGwpIHsKLQkJCXByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWwuaXRlcmF0b3IoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkJT2JqZWN0IG8gPSBudWxsOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCW8gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpCi0JCQkJCW8gPSAoKElKYXZhUHJvamVjdCkgbykuZ2V0UHJvamVjdCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJcHJvamVjdHMuYWRkKG8pOwotCQkJCQlhZGRFSkJDbGllbnRQcm9qZWN0SWZOZWNlc3NhcnkoKElQcm9qZWN0KSBvLCBwcm9qZWN0cyk7Ci0JCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBvOwotCQkJCQlwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KG9iaik7Ci0JCQkJCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUHJvamVjdF9zaG91bGRfbm90X2JlX251bGxfMV9FWENfIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCXByb2plY3RzLmFkZChwcm9qZWN0KTsKLQkJCQkJYWRkRUpCQ2xpZW50UHJvamVjdElmTmVjZXNzYXJ5KHByb2plY3QsIHByb2plY3RzKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTm9uLXByb2plY3RfaW5fc2VsZWN0aW9uXzJfRVhDXyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gbG9jYWxQcm9qZWN0cwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRFSkJDbGllbnRQcm9qZWN0SWZOZWNlc3NhcnkoSVByb2plY3QgcHJvamVjdCwgTGlzdCBsb2NhbFByb2plY3RzKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJRUpCQXJ0aWZhY3RFZGl0IGVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wKTsKLQkJaWYgKGVkaXQgIT0gbnVsbCAmJiBlZGl0Lmhhc0VKQkNsaWVudEpBUlByb2plY3QoKSkKLQkJCWxvY2FsUHJvamVjdHMuYWRkKGVkaXQuZ2V0RUpCQ2xpZW50SmFyTW9kdWxlKCkuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJSjJFRURlbGV0ZURpYWxvZyBkbGcgPSBudWxsOwotCQkJaWYgKGlzU2VsZWN0aW9uQWxsQXBwbGljYXRpb25zKCkpCi0JCQkJZGxnID0gbmV3IERlbGV0ZUVBUkRpYWxvZyhzaGVsbCwgZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkpOwotCQkJZWxzZSBpZiAoaXNTZWxlY3Rpb25BbGxERFJvb3RzKCkpCi0JCQkJZGxnID0gbmV3IERlbGV0ZU1vZHVsZURpYWxvZyhzaGVsbCk7Ci0JCQllbHNlIHsKLQkJCQlpZiAoY29uZmlybVN0YW5kYXJkRGVsZXRlKCkpCi0JCQkJCXJ1blJlc291cmNlRGVsZXRlQWN0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlkbGcub3BlbigpOwotCQkJaWYgKGRsZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCQlyZXR1cm47Ci0JCQlvcHRpb25zID0gZGxnLmdldERlbGV0ZU9wdGlvbnMoKTsKLQkJCWlmIChvcHRpb25zICE9IG51bGwpCi0JCQkJb3B0aW9ucy5zZXRTZWxlY3RlZFByb2plY3RzKGdldFByb2plY3RzKCkpOwotCQkJZWxzZQotCQkJCXJldHVybjsKLQkJCWlmICghKGVuc3VyZUVkaXRvcnNTYXZlZCgpICYmIHZhbGlkYXRlU3RhdGUoKSkpCi0JCQkJcmV0dXJuOwotCQkJZGVsZXRlUHJvamVjdHNJZk5lY2Vzc2FyeSgpOwotCQkJZGVsZXRlTWV0YWRhdGFJZk5lY2Vzc2FyeSgpOwotCQkJcHJlc2VudFN0YXR1c0lmTmVjY2Vzc2FyeSgpOwotCQl9IGZpbmFsbHkgewotCQkJcmVzZXQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBlbnN1cmVFZGl0b3JzU2F2ZWQoKSB7Ci0JCXJldHVybiBDb21tb25FZGl0b3JVdGlsaXR5LnByb21wdFRvU2F2ZUFsbERpcnR5RWRpdG9ycygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm1TdGFuZGFyZERlbGV0ZSgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oc2hlbGwsIERFTEVURV9QUk9KRUNUUywgQ1VTVE9NX0RFTEVURV9NSVhfTUFUQ0gpOwotCX0KLQotCXByb3RlY3RlZCBTZXQgZ2V0UmVmZXJlbmNlZFByb2plY3RzKCkgewotCQlpZiAocmVmZXJlbmNlZFByb2plY3RzID09IG51bGwpCi0JCQljb21wdXRlUmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCXJldHVybiByZWZlcmVuY2VkUHJvamVjdHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlZmVyZW5jZWRQcm9qZWN0cygpIHsKLQkJLy9UT0RPIGZpeCB1cCB0byB1c2UgY29tcG9uZW50cwotLy8JCWdldFByb2plY3RzKCk7Ci0vLwkJcmVmZXJlbmNlZFByb2plY3RzID0gbmV3IEhhc2hTZXQoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHByb2plY3RzLmdldChpKTsKLS8vCQkJRUFSTmF0dXJlUnVudGltZSBydW50aW1lID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3QpOwotLy8JCQlpZiAocnVudGltZSA9PSBudWxsKQotLy8JCQkJY29udGludWU7Ci0vLwkJCUVBUkVkaXRNb2RlbCBlZGl0TW9kZWwgPSBydW50aW1lLmdldEVhckVkaXRNb2RlbEZvclJlYWQodGhpcyk7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlyZWZlcmVuY2VkUHJvamVjdHMuYWRkQWxsKGVkaXRNb2RlbC5nZXRNb2R1bGVNYXBwZWRQcm9qZWN0cygpKTsKLS8vCQkJfSBmaW5hbGx5IHsKLS8vCQkJCWVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotLy8JcHJvdGVjdGVkIERlbGV0ZU1vZHVsZU9wZXJhdGlvbiBnZXREZWxldGVNb2R1bGVPcGVyYXRpb24oKSB7Ci0vLwkJaWYgKGRlbGV0ZU1vZHVsZU9wZXJhdGlvbiA9PSBudWxsKQotLy8JCQlkZWxldGVNb2R1bGVPcGVyYXRpb24gPSBuZXcgRGVsZXRlTW9kdWxlT3BlcmF0aW9uKG9wdGlvbnMpOwotLy8JCXJldHVybiBkZWxldGVNb2R1bGVPcGVyYXRpb247Ci0vLwl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVNZXRhZGF0YUlmTmVjZXNzYXJ5KCkgewotCQlpZiAoIXNob3VsZERlbGV0ZU1ldGFEYXRhKCkpCi0JCQlyZXR1cm47Ci0KLS8vCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBXVFBVSVBsdWdpbi5nZXRSdW5uYWJsZVdpdGhQcm9ncmVzcyhnZXREZWxldGVNb2R1bGVPcGVyYXRpb24oKSk7Ci0vLwkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIG1vbml0b3JEaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKTsKLS8vCi0vLwkJdHJ5IHsKLS8vCQkJbW9uaXRvckRpYWxvZy5ydW4oZmFsc2UsIGZhbHNlLCBydW5uYWJsZSk7Ci0vLwkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vSWdub3JlCi0vLwkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZU1ldGFEYXRhKCkgewotCQlpZiAoZGVsZXRlUHJvamVjdHNGYWlsZWRPckNhbmNlbGxlZCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gcHJpbVNob3VsZERlbGV0ZU1ldGFEYXRhKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpbVNob3VsZERlbGV0ZU1ldGFEYXRhKCkgewotCQlyZXR1cm4gb3B0aW9ucyAhPSBudWxsICYmIChvcHRpb25zLnNob3VsZERlbGV0ZU1vZHVsZXMoKSB8fCBvcHRpb25zLnNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWxldGVQcm9qZWN0c0ZhaWxlZE9yQ2FuY2VsbGVkKCkgewotCQlpZiAob3B0aW9ucyA9PSBudWxsIHx8ICFvcHRpb25zLnNob3VsZERlbGV0ZVByb2plY3RzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBkZWxldGVkUHJvamVjdHNFeGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRlbGV0ZWRQcm9qZWN0c0V4aXN0KCkgewotCQlMaXN0IGRlbGV0ZWRQcm9qZWN0cyA9IG9wdGlvbnMuZ2V0QWxsUHJvamVjdHNUb0RlbGV0ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbGV0ZWRQcm9qZWN0cy5zaXplKCk7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZGVsZXRlZFByb2plY3RzLmdldChpKTsKLQkJCWlmIChwcm9qZWN0LmV4aXN0cygpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVQcm9qZWN0c0lmTmVjZXNzYXJ5KCkgewotCQlpZiAob3B0aW9ucy5zaG91bGREZWxldGVQcm9qZWN0cygpKQotCQkJcnVuUmVzb3VyY2VEZWxldGVBY3Rpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBydW5SZXNvdXJjZURlbGV0ZUFjdGlvbigpIHsKLQkJRGVsZXRlUmVzb3VyY2VBY3Rpb24gYWN0aW9uID0gbmV3IERlbGV0ZVJlc291cmNlQWN0aW9uKHNoZWxsKTsKLQkJTGlzdCBsb2NhbFByb2plY3RzID0gbnVsbDsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkKLQkJCWxvY2FsUHJvamVjdHMgPSBnZXRQcm9qZWN0cygpOwotCQllbHNlCi0JCQlsb2NhbFByb2plY3RzID0gb3B0aW9ucy5nZXRBbGxQcm9qZWN0c1RvRGVsZXRlKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbG9jYWxQcm9qZWN0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUHJvamVjdCBwID0gKElQcm9qZWN0KSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXAuZXhpc3RzKCkpCi0JCQkJaXQucmVtb3ZlKCk7Ci0JCX0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obG9jYWxQcm9qZWN0cyk7Ci0JCWFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKHNlbCk7Ci0JCWFjdGlvbi5ydW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBKMkVFUGx1Z2luLm5ld0Vycm9yU3RhdHVzKElTdGF0dXMuRVJST1IsIERFTEVURV9FUlJPUiwgZSk7Ci0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgREVMRVRFX0VSUk9SLCBERUxFVEVfTk9UX0NPTVBMRVRFRCwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGFjdGlvbidzIGVuYWJsZSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9mIHRoZSB1c2VkIHNlbGVjdGlvbgotCSAqIHByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBwcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCXNlbGVjdGlvbkNoYW5nZWQoKElTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCi0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0oyRUVBcHBsaWNhdGlvblByb2plY3QoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgbzsKLQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QocHJvamVjdCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVuYWJsZWRGcm9tU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJc2V0RW5hYmxlZChnZXRFbmFibGVTdGF0ZUJhc2VkT25TZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uI3NlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCXNldEVuYWJsZWRGcm9tU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQkJZWxzZQotCQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU3RhdGUoKSB7Ci0JCS8vIFRPRE8gRml4IHZhbGlkYXRlU3RhdGUKLQkJLy8JCWlmICghcHJpbVNob3VsZERlbGV0ZU1ldGFEYXRhKCkpCi0JCS8vCQkJcmV0dXJuIHRydWU7Ci0JCS8vCQkKLQkJLy8JCUlWYWxpZGF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBWYWxpZGF0ZUVkaXRMaXN0ZW5lcihudWxsLAotCQkvLyBnZXREZWxldGVNb2R1bGVPcGVyYXRpb24oKS5nZXREZWxldGVFZGl0TW9kZWwoKSk7Ci0JCS8vCQlsaXN0ZW5lci5zZXRTaGVsbChzaGVsbCk7Ci0JCS8vCQlyZXR1cm4gbGlzdGVuZXIudmFsaWRhdGVTdGF0ZSgpLmlzT0soKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlc2VudFN0YXR1c0lmTmVjY2Vzc2FyeSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotLy8JCWlmIChkZWxldGVNb2R1bGVPcGVyYXRpb24gIT0gbnVsbCkKLS8vCQkJc3RhdHVzID0gZGVsZXRlTW9kdWxlT3BlcmF0aW9uLmdldFN0YXR1cygpOwotCi0JCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuOwotCi0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgbnVsbCwgbnVsbCwgc3RhdHVzLCBJU3RhdHVzLkVSUk9SKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFRGVsZXRlTW9kdWxlQWN0aW9uUG9wdWxhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFRGVsZXRlTW9kdWxlQWN0aW9uUG9wdWxhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDAwZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRURlbGV0ZU1vZHVsZUFjdGlvblBvcHVsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFRGVsZXRlTW9kdWxlQWN0aW9uUG9wdWxhdG9yIHsvL2ltcGxlbWVudHMgV1RQT3BlcmF0aW9uRGF0YU1vZGVsVUlDcmVhdG9yIHsKLQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb24uZXh0ZW5zaW9uLnVpLldUUE9wZXJhdGlvbkRhdGFNb2RlbFVJQ3JlYXRvciNjcmVhdGVEYXRhTW9kZWwoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZSkKLQkgKi8KLQlwdWJsaWMgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoU3RyaW5nIGV4dGVuZGVkT3BlcmF0aW9uSWQsIFN0cmluZyBvcGVyYXRpb25DbGFzcywgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBJV29ya2JlbmNoU2l0ZSBzaXRlKSB7Ci0JCS8vVE9ETyBmaXggdXAKLS8vCQlKMkVFRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBKMkVFRGVsZXRlQWN0aW9uKHNpdGUsIChJU2VsZWN0aW9uUHJvdmlkZXIpIG51bGwpOwotLy8JCVdUUE9wZXJhdGlvbkRhdGFNb2RlbCBkYXRhTW9kZWwgPSBJQWN0aW9uV1RQT3BlcmF0aW9uRGF0YU1vZGVsLmNyZWF0ZURhdGFNb2RlbChkZWxldGVBY3Rpb24sIHNlbGVjdGlvbiwgc2l0ZS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLCBzaXRlLmdldFNoZWxsKCkpOwotLy8JCXJldHVybiBkYXRhTW9kZWw7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZXBsb3lBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVEZXBsb3lBY3Rpb24uamF2YQppbmRleCA0N2I2NTkzLi4yNDViMDVlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFRGVwbG95QWN0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRURlcGxveUFjdGlvbi5qYXZhCkBAIC0zMyw4ICszMywxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95LkRlcGxveWVyUmVnaXN0cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95LkoyRUVEZXBsb3lPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5NZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLlJ1bnRpbWVTZWxlY3Rpb25EaWFsb2c7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwpAQCAtNTQsMTEgKzU2LDEzIEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC51aS5hY3Rpb25zLkJhc2VBY3Rpb24jcHJpbVJ1bihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKSB7CiAKIAkJaWYgKGNoZWNrRW5hYmxlZChzaGVsbCkpIHsKIAkJCWZpbmFsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGRlcGxveVNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCUpvYiBkZXBsb3lKb2IgPSBuZXcgSm9iKCJEZXBsb3kiKSB7CisJCQlKb2IgZGVwbG95Sm9iID0gbmV3IEpvYihNZXNzYWdlcy5KMkVFRGVwbG95QWN0aW9uX0RlcGxveV8pIHsKKwkJCQlAT3ZlcnJpZGUKIAkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCQkJCUlTdGF0dXMgcmVzdWx0ID0gbnVsbDsKIAkJCQkJSjJFRURlcGxveU9wZXJhdGlvbiBvcCA9IG5ldyBKMkVFRGVwbG95T3BlcmF0aW9uKGRlcGxveVNlbGVjdGlvbi50b0FycmF5KCkpOwpAQCAtOTEsNyArOTUsNiBAQAogCSAqLwogCXB1YmxpYyBKMkVFRGVwbG95QWN0aW9uKCkgewogCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKIAl9CiAKIAkvKgpAQCAtMTAwLDYgKzEwMyw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKIAkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKIAkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChhY3Rpb24sIGFTZWxlY3Rpb24pOwogCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKQEAgLTExNiwxNSArMTIwLDE1IEBACiAJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBjb21wb25lbnRzLmdldChpKTsKIAkJCQlJUHJvamVjdCBwcm9qID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKIAkJCQlpZiAocHJvaiA9PSBudWxsKSB7Ci0JCQkJCWRpc3BsYXlNZXNzYWdlRGlhbG9nKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfUFJPSkVDVF9OT1RfRk9VTkQiKSAsIHNoZWxsKTsKKwkJCQkJZGlzcGxheU1lc3NhZ2VEaWFsb2coSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9QUk9KRUNUX05PVF9GT1VORCIpICwgc2hlbGwpOyAvLyROT04tTkxTLTEkCiAJCQkJCXJldHVybiBmYWxzZTsKIAkJCQl9CiAJCQkJCiAJCQkJSVJ1bnRpbWUgcnVudGltZSA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFNlcnZlclJ1bnRpbWUocHJvaik7CiAJCQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfUlVOVElNRV9OT1RfRk9VTkQiKSwgbmV3IFN0cmluZyBbXXtwcm9qLmdldE5hbWUoKX0pOworCQkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfUlVOVElNRV9OT1RfRk9VTkQiKSwgbmV3IE9iamVjdCBbXXtwcm9qLmdldE5hbWUoKX0pOyAvLyROT04tTkxTLTEkCiAJCQkJCVJ1bnRpbWVTZWxlY3Rpb25EaWFsb2cgc2VsZWN0aW9uRGlhbG9nID0gbmV3IFJ1bnRpbWVTZWxlY3Rpb25EaWFsb2coc2hlbGwsIAotCQkJCQkJCUoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfRElBTE9HX1RJVExFIiksIAorCQkJCQkJCUoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfRElBTE9HX1RJVExFIiksICAvLyROT04tTkxTLTEkCiAgCQkJCQkJCQludWxsIC8qIGRlZmF1bHQgaW1hZ2UgKi8sIAogIAkJCQkJCQkJbWVzc2FnZSwgCiAgCQkJCQkJCQlNZXNzYWdlRGlhbG9nLkVSUk9SLCAKQEAgLTEzNiw3ICsxNDAsNyBAQAogCQkJCX0KIAkJCQlMaXN0IHZpc2l0b3JzID0gcmVnLmdldERlcGxveU1vZHVsZUV4dGVuc2lvbnMocHJvaiwgcnVudGltZSk7CiAJCQkJaWYgKHZpc2l0b3JzLmlzRW1wdHkoKSkgewotCQkJCQlkaXNwbGF5TWVzc2FnZURpYWxvZyhNZXNzYWdlRm9ybWF0LmZvcm1hdChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZX1BST0pFQ1RfTk9UX1NVUFBPUlRFRCIpLCBuZXcgU3RyaW5nIFtde3Byb2ouZ2V0TmFtZSgpfSksIHNoZWxsKTsKKwkJCQkJZGlzcGxheU1lc3NhZ2VEaWFsb2coTWVzc2FnZUZvcm1hdC5mb3JtYXQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9QUk9KRUNUX05PVF9TVVBQT1JURUQiKSwgbmV3IE9iamVjdCBbXXtwcm9qLmdldE5hbWUoKX0pLCBzaGVsbCk7IC8vJE5PTi1OTFMtMSQKIAkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCX0KIAkJCQkKQEAgLTE0NCwxNCArMTQ4LDEzIEBACiAJCQkKIAkJCXJldHVybiB0cnVlOwogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGVwbG95IEFjdGlvbiByZWNvdmVyaW5nIGZyb20gcHJvYmxlbSB2ZXJpZnlpbmcgZW5hYmxlbWVudC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCQlyZXR1cm4gZmFsc2U7CiAJfQogCQogCXByaXZhdGUgdm9pZCBkaXNwbGF5TWVzc2FnZURpYWxvZyhTdHJpbmcgbWVzc2FnZSwgU2hlbGwgc2hlbGwpIHsKLQkJIFN0cmluZyB0aXRsZSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfRElBTE9HX1RJVExFIik7CisJCSBTdHJpbmcgdGl0bGUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZX0RJQUxPR19USVRMRSIpOyAvLyROT04tTkxTLTEkCiAJCSBNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLCAKIAkJCQkgCQkJCQkJCQl0aXRsZSwgCiAJCQkJIAkJCQkJCQkJbnVsbCAvKiBkZWZhdWx0IGltYWdlICovLCAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVNb2R1bGVSZW5hbWVDaGFuZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVNb2R1bGVSZW5hbWVDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRmMjI3Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFTW9kdWxlUmVuYW1lQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5KMkVFUmVuYW1lVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLQotLyoqCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVNb2R1bGVSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCi0vLwlwcml2YXRlIFN0cmluZyBuZXdOYW1lOwotCXByaXZhdGUgSVByb2plY3QgdGFyZ2V0OwotLy8JcHJpdmF0ZSBib29sZWFuIHJlbmFtZURlcGVuZGVuY2llczsKLQotCXB1YmxpYyBKMkVFTW9kdWxlUmVuYW1lQ2hhbmdlKElQcm9qZWN0IHRhcmdldCwgU3RyaW5nIG5ld05hbWUsIGJvb2xlYW4gcmVuYW1lRGVwZW5kZW5jaWVzKSB7Ci0JCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotLy8JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0vLwkJdGhpcy5yZW5hbWVEZXBlbmRlbmNpZXMgPSByZW5hbWVEZXBlbmRlbmNpZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSjJFRVJlbmFtZVVJQ29uc3RhbnRzLlJFTkFNRV9NT0RVTEVTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlI2luaXRpYWxpemVWYWxpZGF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZSNpc1ZhbGlkKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCkKLQkJCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGUoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGUobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKMkVFVUlQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjcGVyZm9ybShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCXRyeSB7Ci0KLS8vCQkJUmVuYW1lTW9kdWxlT3BlcmF0aW9uIHJlbmFtZU9wID0gbmV3IFJlbmFtZU1vZHVsZU9wZXJhdGlvbihnZXRSZW5hbWVPcHRpb25zKCkpOwotLy8JCQlyZW5hbWVPcC5ydW4ocG0pOwotCi0JCQkvL1N0cmluZyBjb250ZXh0Um9vdCA9IGdldFNlcnZlckNvbnRleHRSb290KCk7Ci0JCQkvLyBUT0RPIGZpeCB1cCByZW5hbWUgYW5kIGNvbnRleHQgcm9vdCBvcGVyYXRpb25zCi0JCQkvL2lmICh3ZWJOYXR1cmUgIT0gbnVsbCkgewotCQkJCS8vbmV3IFVwZGF0ZVdlYkNvbnRleHRSb290TWV0YWRhdGFPcGVyYXRpb24obmV3VGFyZ2V0LCB3ZWJOYXR1cmUuZ2V0Q29udGV4dFJvb3QoKSkucnVuKHBtKTsKLS8vCQkJaWYoY29udGV4dFJvb3QuZXF1YWxzKCIiKSA9PSBmYWxzZSl7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCW5ldyBVcGRhdGVXZWJDb250ZXh0Um9vdE1ldGFkYXRhT3BlcmF0aW9uKHRhcmdldCwgY29udGV4dFJvb3QpLnJ1bihwbSk7Ci0vLwkJCX0gZWxzZSBpZiAoSjJFRU5hdHVyZS5nZXRSZWdpc3RlcmVkUnVudGltZSh0YXJnZXQpID09IG51bGwpCi0vLwkJCQluZXcgUmVuYW1lVXRpbGl0eUphck1ldGFkYXRhT3BlcmF0aW9uKHRhcmdldCwgbmV3VGFyZ2V0KS5ydW4ocG0pOwotLy8JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotLy8JCQkvL0lnbm9yZQotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLS8vCQkJLy9JZ25vcmUKLS8vCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcnZlckNvbnRleHRSb290KCkgewotCQlXZWJBcnRpZmFjdEVkaXQgd2ViRWRpdCA9IG51bGw7Ci0JCXRyeXsKLQkJCXdlYkVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZCh0YXJnZXQpOwotICAgICAgIAkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLSAgICAgICAJCQlyZXR1cm4gd2ViRWRpdC5nZXRTZXJ2ZXJDb250ZXh0Um9vdCgpOwkJCQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCApCi0JCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCX0JCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQkvKipAZGVwcmVjYXRlZCAKLQkgKiBJZiB0aGlzIG1ldGhvZCBpcyBub3QgdXNlZCBpdCBzaG91bGQgYmUgcmVtb3ZlZCBhdCBhIGxhdGVyIHRpbWUsIG1hcmtpbmcgYXMgZGVwcmVjYXRlZAotCSAqIFdhcm5pbmcgY2xlYW51cCAxMi8wNy8yMDA1Ci0JICovCi0vLwlwcml2YXRlIFJlbmFtZU9wdGlvbnMgZ2V0UmVuYW1lT3B0aW9ucygpIHsKLS8vCQlSZW5hbWVPcHRpb25zIG9wdGlvbnMgPSBuZXcgUmVuYW1lT3B0aW9ucygpOwotLy8JCW9wdGlvbnMuc2V0TmV3TmFtZSh0aGlzLm5ld05hbWUpOwotLy8JCW9wdGlvbnMuc2V0U2VsZWN0ZWRQcm9qZWN0cyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHRoaXMudGFyZ2V0KSk7Ci0vLwkJLy8gVE9ETyBjaGVjayBtb2R1bGUgdHlwZSBmb3IgRUFSIHR5cGUKLS8vCQkvL29wdGlvbnMuc2V0SXNFQVJSZW5hbWUoRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHRoaXMudGFyZ2V0KSAhPSBudWxsKTsKLS8vCQlvcHRpb25zLnNldFJlbmFtZU1vZHVsZURlcGVuZGVuY2llcyh0aGlzLnJlbmFtZURlcGVuZGVuY2llcyk7Ci0vLwkJb3B0aW9ucy5zZXRSZW5hbWVNb2R1bGVzKHRydWUpOwotLy8JCW9wdGlvbnMuc2V0UmVuYW1lUHJvamVjdHMoZmFsc2UpOwotLy8JCXJldHVybiBvcHRpb25zOwotLy8JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2UjZ2V0TW9kaWZpZWRFbGVtZW50KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVuYW1lQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVuYW1lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTAxOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRVJlbmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLlNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnV0aWwuQ29tbW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkoyRUVSZW5hbWVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5KMkVFUmVuYW1lVUlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5SZW5hbWVNb2R1bGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkNvbW1vbkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVuYW1lLlJlbmFtZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlJlbmFtZVJlc291cmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgSjJFRVJlbmFtZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGltcGxlbWVudHMgSjJFRVJlbmFtZVVJQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBTaGVsbCBzaGVsbDsKLQkvL1VzZWQgZm9yIEVBUiByZW5hbWUKLQlwcm90ZWN0ZWQgU2V0IHJlZmVyZW5jZWRQcm9qZWN0czsKLQlwcm90ZWN0ZWQgTGlzdCBtb2R1bGVzOwotCXByb3RlY3RlZCBSZW5hbWVPcHRpb25zIG9wdGlvbnM7Ci0JLy8gYWRkZWQgZm9yIElSZWZhY3RvcmluZ0FjdGlvbiBiZWhhdmlvcgotCXByb3RlY3RlZCBJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotLy8JcHJvdGVjdGVkIFJlbmFtZU1vZHVsZU9wZXJhdGlvbiByZW5hbWVNb2R1bGVPcGVyYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFJlbmFtZU1vZHVsZUFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBKMkVFUmVuYW1lQWN0aW9uKElXb3JrYmVuY2hTaXRlIHNpdGUsIFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihzaXRlKTsKLQkJc2V0VGV4dChSRU5BTUUpOwotCQlzaGVsbCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgSjJFRVJlbmFtZUFjdGlvbihJV29ya2JlbmNoU2l0ZSBzaXRlLCBJU2VsZWN0aW9uUHJvdmlkZXIgbmV3UHJvdmlkZXIpIHsKLQkJc3VwZXIoc2l0ZSk7Ci0JCXNldFRleHQoUkVOQU1FKTsKLQkJc2hlbGwgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCXByb3ZpZGVyID0gbmV3UHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7Ci0vLwkJaWYgKHJlbmFtZU1vZHVsZU9wZXJhdGlvbiAhPSBudWxsKSB7Ci0vLwkJCXJlbmFtZU1vZHVsZU9wZXJhdGlvbi5yZWxlYXNlKCk7Ci0vLwkJCXJlbmFtZU1vZHVsZU9wZXJhdGlvbiA9IG51bGw7Ci0vLwkJfQotCQlyZWZlcmVuY2VkUHJvamVjdHMgPSBudWxsOwotCQltb2R1bGVzID0gbnVsbDsKLQkJb3B0aW9ucyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLlNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uI3VwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyLnVwZGF0ZShzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb24jc2VsZWN0aW9uQ2hhbmdlZChJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJc2V0RW5hYmxlZEZyb21TZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCQllbHNlCi0JCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlZEZyb21TZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uLnRvTGlzdCgpLnNpemUoKSAhPSAxKSB7Ci0JCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNldEVuYWJsZWQoZ2V0RW5hYmxlU3RhdGVCYXNlZE9uU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RW5hYmxlU3RhdGVCYXNlZE9uU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGlzU2VsZWN0aW9uQWxsRERSb290cygpIHx8IGlzU2VsZWN0aW9uQWxsQXBwbGljYXRpb25zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3Rpb25BbGxERFJvb3RzKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0U2VsZWN0aW9uKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gc2VsLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJLy9UT0RPIGNoZWNrIGZvciBqMmVlIHdvcmtiZW5jaCBtb2R1bGUgc2VsZWN0aW9uCi0JCQlpZiAoIUNvbW1vblV0aWwuaXNEZXBsb3ltZW50RGVzY3JpcHRvclJvb3QobywgZmFsc2UpIC8qJiYgIWlzSjJFRVByb2plY3QobykqLykKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTZWxlY3Rpb25BbGxBcHBsaWNhdGlvbnMoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJSXRlcmF0b3IgaXQgPSBzZWwuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIShvIGluc3RhbmNlb2YgQXBwbGljYXRpb24pICYmICFpc0oyRUVBcHBsaWNhdGlvblByb2plY3QobykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kdWxlcygpIHsKLQkJaWYgKG1vZHVsZXMgPT0gbnVsbCkgewotCQkJbW9kdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VsLml0ZXJhdG9yKCk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gbnVsbDsKLQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlvID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgV29ya2JlbmNoQ29tcG9uZW50KSB7Ci0JCQkJCW1vZHVsZXMuYWRkKG8pOwotCQkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgbzsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChvYmopOwotCQkJCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQocHJvamVjdCk7Ci0JCQkJCQlVUkkgdXJpID0gb2JqLmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZXMgPSBtb2R1bGVDb3JlLmZpbmRSZXNvdXJjZXNCeVNvdXJjZVBhdGgodXJpKTsKLQkJCQkJCWZvciAoaW50IGk9MDsgaTxyZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQltb2R1bGUgPSByZXNvdXJjZXNbaV0uZ2V0Q29tcG9uZW50KCk7Ci0JCQkJCQkJaWYgKG1vZHVsZSAhPW51bGwpCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJaWYgKG1vZHVsZSA9PSBudWxsKQotCQkJCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJQcm9qZWN0X3Nob3VsZF9ub3RfYmVfbnVsbF8xX0VSUk9SXyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbW9kdWxlcy5hZGQobW9kdWxlKTsKLQkJCQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvL0lnbm9yZQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKG1vZHVsZUNvcmUgIT1udWxsKQotCQkJCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5vbi1wcm9qZWN0X2luX3NlbGVjdGlvbl8yX0VSUk9SXyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kdWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJTGlzdCBsb2NhbE1vZHVsZXMgPSBnZXRNb2R1bGVzKCk7Ci0JCQlpZiAobG9jYWxNb2R1bGVzLnNpemUoKSAhPSAxKQotCQkJCXJldHVybjsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSAoV29ya2JlbmNoQ29tcG9uZW50KSBsb2NhbE1vZHVsZXMuZ2V0KDApOwotCQkJSjJFRVJlbmFtZURpYWxvZyBkbGcgPSBudWxsOwotCi0JCQkvLyBpZiBhbGwgd2UgYXJlIGRvaW5nIGlzIHJlbmFtaW5nIGFuIEVBUiwgbGV0IHRoZSBiYXNlIHBsYXRmb3JtIGRvIGl0Ci0JCQlpZiAoaXNTZWxlY3Rpb25BbGxBcHBsaWNhdGlvbnMoKSkgewotCQkJCVJlbmFtZVJlc291cmNlQWN0aW9uIGFjdGlvbiA9IG5ldyBSZW5hbWVSZXNvdXJjZUFjdGlvbihzaGVsbCk7Ci0JCQkJYWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obW9kdWxlKSk7Ci0JCQkJYWN0aW9uLnJ1bigpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgY29udGV4dFJvb3QgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCS8vVE9ETyBhZGQgY29udGV4dCByb290IHRvIHRoZSBtb2R1bGUgbW9kZWwKLQkJCQkvL2NvbnRleHRSb290ID0gbW9kdWxlLmdldFNlcnZlckNvbnRleHRSb290KCk7Ci0JCQkJZGxnID0gbmV3IFJlbmFtZU1vZHVsZURpYWxvZyhzaGVsbCwgbW9kdWxlLmdldE5hbWUoKSwgY29udGV4dFJvb3QpOwotCQkJCWRsZy5vcGVuKCk7Ci0JCQkJaWYgKGRsZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCQkJcmV0dXJuOwotCi0JCQkJb3B0aW9ucyA9IGRsZy5nZXRSZW5hbWVPcHRpb25zKCk7Ci0JCQkJaWYgKG9wdGlvbnMgIT0gbnVsbCkKLQkJCQkJb3B0aW9ucy5zZXRTZWxlY3RlZFByb2plY3RzKGxvY2FsTW9kdWxlcyk7Ci0KLQkJCQlpZiAoIShlbnN1cmVFZGl0b3JzU2F2ZWQoKSAmJiB2YWxpZGF0ZVN0YXRlKCkpKQotCQkJCQlyZXR1cm47Ci0JCQkJcmVuYW1lUHJvamVjdHNJZk5lY2Vzc2FyeSgpOwotCQkJCXJlbmFtZU1ldGFkYXRhSWZOZWNlc3NhcnkoKTsKLQkJCQlwcmVzZW50U3RhdHVzSWZOZWNjZXNzYXJ5KCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlyZXNldCgpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGJvb2xlYW4gZW5zdXJlRWRpdG9yc1NhdmVkKCkgewotCQlyZXR1cm4gQ29tbW9uRWRpdG9yVXRpbGl0eS5wcm9tcHRUb1NhdmVBbGxEaXJ0eUVkaXRvcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2V0IGdldFJlZmVyZW5jZWRQcm9qZWN0cygpIHsKLQkJaWYgKHJlZmVyZW5jZWRQcm9qZWN0cyA9PSBudWxsKQotCQkJY29tcHV0ZVJlZmVyZW5jZWRQcm9qZWN0cygpOwotCQlyZXR1cm4gcmVmZXJlbmNlZFByb2plY3RzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbXB1dGVSZWZlcmVuY2VkUHJvamVjdHMoKSB7Ci0JCWdldE1vZHVsZXMoKTsKLQkJcmVmZXJlbmNlZFByb2plY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkvL1dvcmtiZW5jaENvbXBvbmVudCBtb2R1bGUgPSAoV29ya2JlbmNoQ29tcG9uZW50KSBtb2R1bGVzLmdldChpKTsKLQkJCS8vVE9ETyBmaXggdXAgY29kZSBoZXJlIGZvciBtb2R1bGVzIGluc3RlYWQgb2YgcHJvamVjdHMKLS8vCQkJRUFSTmF0dXJlUnVudGltZSBydW50aW1lID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKHByb2plY3QpOwotLy8JCQlpZiAocnVudGltZSA9PSBudWxsKQotLy8JCQkJY29udGludWU7Ci0vLwkJCUVBUkVkaXRNb2RlbCBlZGl0TW9kZWwgPSBydW50aW1lLmdldEVhckVkaXRNb2RlbEZvclJlYWQodGhpcyk7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlyZWZlcmVuY2VkUHJvamVjdHMuYWRkQWxsKGVkaXRNb2RlbC5nZXRNb2R1bGVNYXBwZWRQcm9qZWN0cygpKTsKLS8vCQkJfSBmaW5hbGx5IHsKLS8vCQkJCWVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotLy8JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW5hbWVNZXRhZGF0YUlmTmVjZXNzYXJ5KCkgewotCQlpZiAoIXNob3VsZFJlbmFtZU1ldGFEYXRhKCkpCi0JCQlyZXR1cm47Ci0vLwkJUmVuYW1lTW9kdWxlT3BlcmF0aW9uIG9wID0gZ2V0UmVuYW1lTW9kdWxlT3BlcmF0aW9uKCk7Ci0vLwkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gV1RQVUlQbHVnaW4uZ2V0UnVubmFibGVXaXRoUHJvZ3Jlc3Mob3ApOwotLy8JCVByb2dyZXNzTW9uaXRvckRpYWxvZyBtb25pdG9yRGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCk7Ci0vLwotLy8JCXRyeSB7Ci0vLwkJCW1vbml0b3JEaWFsb2cucnVuKGZhbHNlLCBmYWxzZSwgcnVubmFibGUpOwotLy8JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotLy8JCQloYW5kbGVFeGNlcHRpb24oZSk7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotLy8JCQkvL0lnbm9yZQotLy8JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRSZW5hbWVNZXRhRGF0YSgpIHsKLQkJaWYgKHJlbmFtZVByb2plY3RzRmFpbGVkT3JDYW5jZWxsZWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gcHJpbVNob3VsZFJlbmFtZU1ldGFEYXRhKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVuYW1lUHJvamVjdHNGYWlsZWRPckNhbmNlbGxlZCgpIHsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCB8fCAhb3B0aW9ucy5zaG91bGRSZW5hbWVQcm9qZWN0cygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gcmVuYW1lZFByb2plY3RzRXhpc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW5hbWVkUHJvamVjdHNFeGlzdCgpIHsKLQkJTGlzdCByZW5hbWVkUHJvamVjdHMgPSBvcHRpb25zLmdldEFsbFByb2plY3RzVG9SZW5hbWUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW5hbWVkUHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlbmFtZWRQcm9qZWN0cy5nZXQoaSk7Ci0JCQlpZiAocHJvamVjdC5leGlzdHMoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVuYW1lUHJvamVjdHNJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCB8fCAhb3B0aW9ucy5zaG91bGRSZW5hbWVQcm9qZWN0cygpKQotCQkJcmV0dXJuOwotCQlKMkVFUmVuYW1lUmVzb3VyY2VBY3Rpb24gYWN0aW9uID0gbmV3IEoyRUVSZW5hbWVSZXNvdXJjZUFjdGlvbihzaGVsbCk7Ci0JCWFjdGlvbi5zZXROZXdOYW1lKG9wdGlvbnMuZ2V0TmV3TmFtZSgpKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ob3B0aW9ucy5nZXRBbGxQcm9qZWN0c1RvUmVuYW1lKCkpOwotCQlhY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWwpOwotCQlhY3Rpb24ucnVuKCk7Ci0KLQkJLy8gb25seSB3ZWIgcHJvamVjdHMgc2hvdWxkIGhhdmUgYSBjb250ZXh0IHJvb3QKLQkJU3RyaW5nIG5ld0NvbnRleHRSb290ID0gb3B0aW9ucy5nZXROZXdDb250ZXh0Um9vdCgpOwotCQlpZiAobmV3Q29udGV4dFJvb3QgIT0gbnVsbCAmJiBvcHRpb25zLnNob3VsZFJlbmFtZVByb2plY3RzKCkpIHsKLQkJCS8vV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IChXb3JrYmVuY2hDb21wb25lbnQpIGdldE1vZHVsZXMoKS5nZXQoMCk7Ci0JCQl0cnkgewotCQkJCS8vIFRPRE8gYWRkIHNlcnZlciBjb250ZXh0IHJvb3QgdG8gdGhlIG1vZHVsZSBtb2RlbAotCQkJCS8vbW9kdWxlLnNldFNlcnZlckNvbnRleHRSb290KG5ld0NvbnRleHRSb290KTsJCSAgICAgICAgICAgICAgIAkJCi0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBKMkVFUGx1Z2luLm5ld0Vycm9yU3RhdHVzKElTdGF0dXMuRVJST1IsIFJFTkFNRV9FUlJPUiwgZSk7Ci0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgUkVOQU1FX0VSUk9SLCBSRU5BTUVfTk9UX0NPTVBMRVRFRCwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGFjdGlvbidzIGVuYWJsZSBzdGF0ZSBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uIG9mIHRoZSB1c2VkIHNlbGVjdGlvbgotCSAqIHByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBwcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCXN1cGVyLnVwZGF0ZShzZWxlY3Rpb24pOwotCQl9IGVsc2UgewotCQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBnZXRTZWxlY3Rpb24oKTsKLQotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCXVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKMkVFQXBwbGljYXRpb25Qcm9qZWN0KE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG87Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVN0YXRlKCkgewotCQlpZiAoIXByaW1TaG91bGRSZW5hbWVNZXRhRGF0YSgpKQotCQkJcmV0dXJuIHRydWU7Ci0KLS8vCQlJVmFsaWRhdGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVmFsaWRhdGVFZGl0TGlzdGVuZXIobnVsbCwgZ2V0UmVuYW1lTW9kdWxlT3BlcmF0aW9uKCkuZ2V0UmVuYW1lRWRpdE1vZGVsKCkpOwotLy8JCWxpc3RlbmVyLnNldFNoZWxsKHNoZWxsKTsKLS8vCQlyZXR1cm4gbGlzdGVuZXIudmFsaWRhdGVTdGF0ZSgpLmlzT0soKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByaW1TaG91bGRSZW5hbWVNZXRhRGF0YSgpIHsKLQkJcmV0dXJuIG9wdGlvbnMgIT0gbnVsbCAmJiAob3B0aW9ucy5zaG91bGRSZW5hbWVNb2R1bGVzKCkgfHwgb3B0aW9ucy5zaG91bGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMoKSk7Ci0JfQotCi0vLwlwcm90ZWN0ZWQgUmVuYW1lTW9kdWxlT3BlcmF0aW9uIGdldFJlbmFtZU1vZHVsZU9wZXJhdGlvbigpIHsKLS8vCQlpZiAocmVuYW1lTW9kdWxlT3BlcmF0aW9uID09IG51bGwpIHsKLS8vCQkJcmVuYW1lTW9kdWxlT3BlcmF0aW9uID0gbmV3IFJlbmFtZU1vZHVsZU9wZXJhdGlvbihvcHRpb25zKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHJlbmFtZU1vZHVsZU9wZXJhdGlvbjsKLS8vCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXNlbnRTdGF0dXNJZk5lY2Nlc3NhcnkoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQotLy8JCWlmIChyZW5hbWVNb2R1bGVPcGVyYXRpb24gIT0gbnVsbCkgewotLy8JCQlzdGF0dXMgPSByZW5hbWVNb2R1bGVPcGVyYXRpb24uZ2V0U3RhdHVzKCk7Ci0vLwkJfQotCi0JCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuOwotCi0JCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgbnVsbCwgbnVsbCwgc3RhdHVzLCBJU3RhdHVzLkVSUk9SKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVuYW1lUGFydGljaXBhbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTJiN2M2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuSjJFRVJlbmFtZVVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkFkYXB0YWJpbGl0eVV0aWxpdHk7Ci0KLQotLyoqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFUmVuYW1lUGFydGljaXBhbnQgZXh0ZW5kcyBSZW5hbWVQYXJ0aWNpcGFudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJUFJPSkVDVF9DTEFTUyA9IElQcm9qZWN0LmNsYXNzOwotCi0JcHVibGljIEoyRUVSZW5hbWVQYXJ0aWNpcGFudCgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIEFkYXB0YWJpbGl0eVV0aWxpdHkuZ2V0QWRhcHRlcihlbGVtZW50LCBJUFJPSkVDVF9DTEFTUyk7Ci0JCWlmIChwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJT2JqZWN0W10gdGFyZ2V0RWxlbWVudHMgPSBnZXRQcm9jZXNzb3IoKS5nZXRFbGVtZW50cygpOwotCQlpZiAodGFyZ2V0RWxlbWVudHMgPT0gbnVsbCB8fCB0YXJnZXRFbGVtZW50cy5sZW5ndGggIT0gMSkKLQkJCXJldHVybiBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBBZGFwdGFiaWxpdHlVdGlsaXR5LmdldEFkYXB0ZXIodGFyZ2V0RWxlbWVudHNbMF0sIElQUk9KRUNUX0NMQVNTKTsKLQkJCi0JCWlmIChwcm9qZWN0ICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IEoyRUVNb2R1bGVSZW5hbWVDaGFuZ2UocHJvamVjdCwgZ2V0QXJndW1lbnRzKCkuZ2V0TmV3TmFtZSgpLCBnZXRBcmd1bWVudHMoKS5nZXRVcGRhdGVSZWZlcmVuY2VzKCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEoyRUVSZW5hbWVVSUNvbnN0YW50cy5SRU5BTUU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjaGVja0NvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsCi0JICogICAgICBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFJlZmFjdG9yaW5nU3RhdHVzLmNyZWF0ZShTdGF0dXMuT0tfU1RBVFVTKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVuYW1lUmVzb3VyY2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTI3ZTFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL0oyRUVSZW5hbWVSZXNvdXJjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZW5hbWVSZXNvdXJjZUFjdGlvbjsKLQotcHVibGljIGNsYXNzIEoyRUVSZW5hbWVSZXNvdXJjZUFjdGlvbiBleHRlbmRzIFJlbmFtZVJlc291cmNlQWN0aW9uIHsKLQlTdHJpbmcgbmV3TmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbi4gVXNpbmcgdGhpcyBjb25zdHJ1Y3RvciBkaXJlY3RseSB3aWxsIHJlbmFtZSB1c2luZyBhIGRpYWxvZyAoaWYKLQkgKiBuZWNlc3NhcnkpIHJhdGhlciB0aGFuIHRoZSBpbmxpbmUgZWRpdG9yIG9mIGEgUmVzb3VyY2VOYXZpZ2F0b3IuIE5vdGUgdGhhdCBhIHJlbmFtZSBoYXBwZW5zCi0JICogb24gb25lIGFuZCBvbmx5IG9uZSByZXNvdXJjZSBhdCBhIHRpbWUuCi0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICogICAgICAgICAgICB0aGUgc2hlbGwgZm9yIGFueSBkaWFsb2dzCi0JICovCi0JcHVibGljIEoyRUVSZW5hbWVSZXNvdXJjZUFjdGlvbihTaGVsbCBzaGVsbCkgewotCQlzdXBlcihzaGVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXcgbmFtZSB0byBiZSBnaXZlbiB0byB0aGUgdGFyZ2V0IHJlc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcXVlcnlOZXdSZXNvdXJjZU5hbWUoZmluYWwgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCVN0cmluZyByZXRWYWwgPSBudWxsOwotCi0JCWlmIChuZXdOYW1lID09IG51bGwgfHwgbmV3TmFtZS5sZW5ndGgoKSA8IDEpIHsKLQkJCXJldFZhbCA9IHN1cGVyLnF1ZXJ5TmV3UmVzb3VyY2VOYW1lKHJlc291cmNlKTsKLQkJfSBlbHNlIHsKLQkJCXJldFZhbCA9IG5ld05hbWU7Ci0JCX0KLQotCQlyZXR1cm4gcmV0VmFsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5ld05hbWUuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROZXdOYW1lKCkgewotCQlyZXR1cm4gbmV3TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuZXdOYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICogICAgICAgICAgICBUaGUgbmV3TmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXdOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvSjJFRVJlc291cmNlT3Blbkxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVzb3VyY2VPcGVuTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwNjU3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9KMkVFUmVzb3VyY2VPcGVuTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklPcGVuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5PcGVuRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVSZXNvdXJjZU9wZW5MaXN0ZW5lciBpbXBsZW1lbnRzIElPcGVuTGlzdGVuZXJ7Ci0KLQkgcHJpdmF0ZSBPcGVuSjJFRVJlc291cmNlQWN0aW9uIGFjdGlvbjsKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklPcGVuTGlzdGVuZXIjb3BlbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLk9wZW5FdmVudCkKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBvcGVuKE9wZW5FdmVudCBhbkV2ZW50KSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gYW5FdmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCSAgIAotCQkgICAgaWYgKGdldEFjdGlvbigpLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKSkKLQkJICAgIAlhY3Rpb24ucnVuKCk7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT3BlbkoyRUVSZXNvdXJjZUFjdGlvbiBnZXRBY3Rpb24oKSB7Ci0JCWlmIChhY3Rpb24gPT0gbnVsbCkgCi0JCQlhY3Rpb24gPSBuZXcgT3BlbkoyRUVSZXNvdXJjZUFjdGlvbigpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3QXBwQ2xpZW50Q29tcG9uZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdBcHBDbGllbnRDb21wb25lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhMmY3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdBcHBDbGllbnRDb21wb25lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuYXBwY2xpZW50LkFwcENsaWVudFByb2plY3RXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotCi1wdWJsaWMgY2xhc3MgTmV3QXBwQ2xpZW50Q29tcG9uZW50QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uIHsKLQotCS8vIFRPRE8gTURFIDAyLTI4IEZpbmQgY29ycmVjdCBsYWJlbAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5ld0FwcGxDbGllbnRNb2R1bGVBY3Rpb25fVUlfMCIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAibmV3X2FwcGNsaWVudHByb2plY3Rfd2l6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE5ld0FwcENsaWVudENvbXBvbmVudEFjdGlvbigpIHsKLQkJc2V0VGV4dChMQUJFTCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JcHVibGljIE5ld0FwcENsaWVudENvbXBvbmVudEFjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCwgU3RyaW5nIGxhYmVsLCBDbGFzc1tdIGFjY2VwdGVkVHlwZXMpIHsKLQkJc3VwZXIod29ya2JlbmNoLCBsYWJlbCwgYWNjZXB0ZWRUeXBlcywgZmFsc2UpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCXByb3RlY3RlZCBXaXphcmQgY3JlYXRlV2l6YXJkKCkgewotCQlyZXR1cm4gbmV3IEFwcENsaWVudFByb2plY3RXaXphcmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBY2NlcHRFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRydWU7IC8qIE5ld0dyb3VwLmlzT25CdWlsZFBhdGgob2JqKSAmJiAhTmV3R3JvdXAuaXNJbkFyY2hpdmUob2JqKTsgKi8KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWxvZ1RleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL05ld0VBUkNvbXBvbmVudEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3RUFSQ29tcG9uZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOTZjYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3RUFSQ29tcG9uZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuRWFyUHJvamVjdFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0KLXB1YmxpYyBjbGFzcyBOZXdFQVJDb21wb25lbnRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5XaXphcmRXb3JrYmVuY2hBY3Rpb24gewotCS8vIFRPRE8gTURFIDAyLTI4IEZpbmQgY29ycmVjdCBsYWJlbAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIk5ld0VBUk1vZHVsZUFjdGlvbl9VSV8wIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTiA9ICJuZXdlYXJfd2l6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE5ld0VBUkNvbXBvbmVudEFjdGlvbigpIHsKLQkJc2V0VGV4dChMQUJFTCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCi0JcHVibGljIE5ld0VBUkNvbXBvbmVudEFjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCwgU3RyaW5nIGxhYmVsLCBDbGFzc1tdIGFjY2VwdGVkVHlwZXMpIHsKLQkJc3VwZXIod29ya2JlbmNoLCBsYWJlbCwgYWNjZXB0ZWRUeXBlcywgZmFsc2UpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwotCX0KLQotCXByb3RlY3RlZCBXaXphcmQgY3JlYXRlV2l6YXJkKCkgewotCQlyZXR1cm4gbmV3IEVhclByb2plY3RXaXphcmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBY2NlcHRFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRydWU7IC8qIE5ld0dyb3VwLmlzT25CdWlsZFBhdGgob2JqKSAmJiAhTmV3R3JvdXAuaXNJbkFyY2hpdmUob2JqKTsgKi8KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWxvZ1RleHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL05ld0phdmFFRUFydGlmYWN0RHJvcERvd25BY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL05ld0phdmFFRUFydGlmYWN0RHJvcERvd25BY3Rpb24uamF2YQppbmRleCBmOTJiZTVjLi42NmE5ZDk0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdKYXZhRUVBcnRpZmFjdERyb3BEb3duQWN0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3SmF2YUVFQXJ0aWZhY3REcm9wRG93bkFjdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBTQVAgQUcgYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNywyMDA5IFNBUCBBRyBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsMTAgKzEwLDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZTI7Ci0KLQogLyoqCiAgKiBBIHdpemFyZCBpcyBhZGRlZCB0byB0aGUgIk5ldyBKYXZhIEVFIEFydGlmYWN0IiBkcm9wIGRvd24gaWYgaXQgaGFzIGEgcGFyYW1ldGVyICdqYXZhZWVhcnRpZmFjdCc6CiAgKiAgICAgPHdpemFyZApAQCAtMjksNyArMjUsNyBAQAogICogICAgICAgICA8L2Rlc2NyaXB0aW9uPgogICogICAgICA8L3dpemFyZD4KICAqLwotcHVibGljIGNsYXNzIE5ld0phdmFFRUFydGlmYWN0RHJvcERvd25BY3Rpb24gZXh0ZW5kcyBOZXdKYXZhRUVEcm9wRG93bkFjdGlvbiBpbXBsZW1lbnRzIElNZW51Q3JlYXRvciwgSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyIHsKK3B1YmxpYyBjbGFzcyBOZXdKYXZhRUVBcnRpZmFjdERyb3BEb3duQWN0aW9uIGV4dGVuZHMgTmV3SmF2YUVFRHJvcERvd25BY3Rpb24gewogCQogCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSkFWQUVFQVJUSUZBQ1QgPSAiamF2YWVlYXJ0aWZhY3QiOy8vJE5PTi1OTFMtMSQKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3SmF2YUVFRHJvcERvd25BY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL05ld0phdmFFRURyb3BEb3duQWN0aW9uLmphdmEKaW5kZXggNjdkOWYzZS4uZWRiMTNhOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvTmV3SmF2YUVFRHJvcERvd25BY3Rpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdKYXZhRUVEcm9wRG93bkFjdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBTQVAgQUcgYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNywyMDA5IFNBUCBBRyBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTgsMTIgKzE4LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnV0aWwuQ29yZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnV0aWwuUGl4ZWxDb252ZXJ0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LlBpeGVsQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247CkBAIC02OSw2ICs2OSw3IEBACiAJCS8qIChub24tSmF2YWRvYykKIAkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCiAJCSAqLworCQlAT3ZlcnJpZGUKIAkJcHVibGljIHZvaWQgcnVuKCkgewogCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwogCQkJdHJ5IHsKQEAgLTIyOCw2ICsyMjksNyBAQAogCQlyZXR1cm4gZk1lbnU7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJ1bigpIHsKIAkJZ2V0RGVmYXVsdEFjdGlvbigpLnJ1bigpOwogCX0KQEAgLTI1Miw3ICsyNTQsNyBAQAogCQkJfQogCQl9CiAJCQotCQlOZXdKYXZhRUVXaXphcmRBY3Rpb25bXSBhY3Rpb25zID0gKE5ld0phdmFFRVdpemFyZEFjdGlvbltdKSBjb250YWluZXJzLnRvQXJyYXkobmV3IE5ld0phdmFFRVdpemFyZEFjdGlvbltjb250YWluZXJzLnNpemUoKV0pOworCQlOZXdKYXZhRUVXaXphcmRBY3Rpb25bXSBhY3Rpb25zID0gY29udGFpbmVycy50b0FycmF5KG5ldyBOZXdKYXZhRUVXaXphcmRBY3Rpb25bY29udGFpbmVycy5zaXplKCldKTsKIAkJQXJyYXlzLnNvcnQoYWN0aW9ucyk7CiAJCXJldHVybiBhY3Rpb25zOyAKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9OZXdKYXZhRUVQcm9qZWN0RHJvcERvd25BY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL05ld0phdmFFRVByb2plY3REcm9wRG93bkFjdGlvbi5qYXZhCmluZGV4IDQ5MGNkYWYuLjc4NTUzMDYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL05ld0phdmFFRVByb2plY3REcm9wRG93bkFjdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL05ld0phdmFFRVByb2plY3REcm9wRG93bkFjdGlvbi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBTQVAgQUcgYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNywyMDA5IFNBUCBBRyBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTAsMTAgKzEwLDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZTI7Ci0KLQogLyoqCiAgKiBBIHdpemFyZCBpcyBhZGRlZCB0byB0aGUgIk5ldyBKYXZhIEVFIFByb2plY3QiIGRyb3AgZG93biBpZiBpdCBoYXMgYSBwYXJhbWV0ZXIgJ2phdmFlZXByb2plY3QnOgogICogICAgIDx3aXphcmQKQEAgLTI5LDcgKzI1LDcgQEAKICAqICAgICAgICAgPC9kZXNjcmlwdGlvbj4KICAqICAgICAgPC93aXphcmQ+CiAgKi8KLXB1YmxpYyBjbGFzcyBOZXdKYXZhRUVQcm9qZWN0RHJvcERvd25BY3Rpb24gZXh0ZW5kcyBOZXdKYXZhRUVEcm9wRG93bkFjdGlvbiBpbXBsZW1lbnRzIElNZW51Q3JlYXRvciwgSVdvcmtiZW5jaFdpbmRvd1B1bGxkb3duRGVsZWdhdGUyIHsKK3B1YmxpYyBjbGFzcyBOZXdKYXZhRUVQcm9qZWN0RHJvcERvd25BY3Rpb24gZXh0ZW5kcyBOZXdKYXZhRUVEcm9wRG93bkFjdGlvbiB7CiAJCiAJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9KQVZBRUVQUk9KRUNUID0gImphdmFlZXByb2plY3QiOy8vJE5PTi1OTFMtMSQKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvT3BlbkoyRUVSZXNvdXJjZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvT3BlbkoyRUVSZXNvdXJjZUFjdGlvbi5qYXZhCmluZGV4IGZmZjRhYmUuLmUxZDEwYjEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL09wZW5KMkVFUmVzb3VyY2VBY3Rpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSjJFRVJlc291cmNlQWN0aW9uLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7CkBAIC02Nyw3ICs2OCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTZXRTZWxlY3Rpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKQEAgLTg4LDcgKzg4LDcgQEAKIAkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwogCSAqLwogCXB1YmxpYyBPcGVuSjJFRVJlc291cmNlQWN0aW9uKCkgewotCQlzdXBlcigiT3BlbiIpOyAvLyROT04tTkxTLTEkCisJCXN1cGVyKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk9QRU5fSjJFRV9SRVNPVVJDRV9BQ1RJT05fMCkpOwogCX0KIAogCS8qKgpAQCAtMTIyLDEyICsxMjIsMTIgQEAKIAkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG51bGw7CiAJCQkKIAkJCS8vW0J1ZyAyMzc3OTRdIGlmIGNvbXBvbmVudCBjIGlzIGEgSkVFIDUgYXJjaGl2ZSB0aGVuIGVkaXRvcklucHV0IG5lZWRzIHRvIGJlIGEgQmluYXJ5RWRpdG9ySW5wdXQKLQkJCWlmIChjIGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKKwkJCWlmIChjLmlzQmluYXJ5KCkpIHsKIAkJCQlKYXZhRUVRdWlja1BlZWsgcXAgPSBKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIuZ2V0SmF2YUVFUXVpY2tQZWVrKGMpOwogCQkJCS8vW0J1ZyAyMzk0NDBdIGJlY2F1c2UgQ29ubmVjdG9ycyBhcmUgb3BlbmVkIHdpdGggdGhlIGJhc2ljIFhNTCBlZGl0b3IgYW5kIG5vdCBhIHNwZWNpYWxpemVkIGVkaXRvciB0aGV5IG5lZWQgYmluYXJ5IGVkaXRvciBpbnB1dAotCQkJCWlmKCBxcC5nZXRKYXZhRUVWZXJzaW9uKCkgPT0gSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQgfHwgcXAuZ2V0VHlwZSgpID09IEphdmFFRVF1aWNrUGVlay5DT05ORUNUT1JfVFlQRSkgeworCQkJCWlmKCBxcC5nZXRKYXZhRUVWZXJzaW9uKCkgPT0gSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQgfHwgIHFwLmdldEphdmFFRVZlcnNpb24oKSA9PSBKYXZhRUVRdWlja1BlZWsuSkVFXzZfMF9JRCAgfHwgcXAuZ2V0VHlwZSgpID09IEphdmFFRVF1aWNrUGVlay5DT05ORUNUT1JfVFlQRSkgewogCQkJCQlTdHJpbmcgcGF0aCA9ICgoRU9iamVjdClzcmNPYmplY3QpLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCQkJCWVkaXRvcklucHV0ID0gQmluYXJ5RWRpdG9yVXRpbGl0aWVzLmdldEJpbmFyeUVkaXRvcklucHV0KChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCljLCBwYXRoKTsKKwkJCQkJZWRpdG9ySW5wdXQgPSBCaW5hcnlFZGl0b3JVdGlsaXRpZXMuZ2V0QmluYXJ5RWRpdG9ySW5wdXQoYywgcGF0aCk7CiAJCQkJfQogCQkJfSAKIAkJCQpAQCAtMTQwLDcgKzE0MCw3IEBACiAJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkKIAkJCQkoKElTZXRTZWxlY3Rpb25UYXJnZXQpIGVkaXRvcikuc2VsZWN0UmV2ZWFsKGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJQcm9ibGVtc19PcGVuaW5nX0VkaXRvcl9FUlJPUl8iKSwgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkID0gIlByb2JsZW1zIE9wZW5pbmcgRWRpdG9yIgorCQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUHJvYmxlbXNfT3BlbmluZ19FZGl0b3JfRVJST1JfIiksIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9ibGVtcyBPcGVuaW5nIEVkaXRvciIKIAkJfQogCX0KIAkKQEAgLTE1NSwxNyArMTU1LDIwIEBACiAJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IG51bGw7CiAJCXRyeSB7CiAJCQlwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQllZGl0b3IgPSBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dCgoSUZpbGUpIHIpLCBjdXJyZW50RGVzY3JpcHRvci5nZXRJZCgpKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJU2V0U2VsZWN0aW9uVGFyZ2V0KQotCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldCkgZWRpdG9yKS5zZWxlY3RSZXZlYWwoZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpKTsKKwkJCWlmKCBjdXJyZW50RGVzY3JpcHRvciAhPSBudWxsICl7CisJCQkJZWRpdG9yID0gcGFnZS5vcGVuRWRpdG9yKG5ldyBGaWxlRWRpdG9ySW5wdXQoKElGaWxlKSByKSwgY3VycmVudERlc2NyaXB0b3IuZ2V0SWQoKSk7CisJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpCisJCQkJCSgoSVNldFNlbGVjdGlvblRhcmdldCkgZWRpdG9yKS5zZWxlY3RSZXZlYWwoZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpKTsKKwkJCX0KIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2JsZW1zX09wZW5pbmdfRWRpdG9yX0VSUk9SXyIpLCBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvYmxlbXMgT3BlbmluZyBFZGl0b3IiCisJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJQcm9ibGVtc19PcGVuaW5nX0VkaXRvcl9FUlJPUl8iKSwgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkID0gIlByb2JsZW1zIE9wZW5pbmcgRWRpdG9yIgogCQl9CiAJfQogCQogCS8qKgogCSAqIFRoZSB1c2VyIGhhcyBpbnZva2VkIHRoaXMgYWN0aW9uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcnVuKCkgewogCQlpZiAoIWlzRW5hYmxlZCgpKQogCQkJcmV0dXJuOwpAQCAtMTg3LDM3ICsxOTAsMzAgQEAKIAkJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuIGJlYW4gPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbilzcmNPYmplY3Q7CiAJCQkJbmFtZSA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKIAkJCX0KLQotCQkJSVJlc291cmNlIHJlc291cmNlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoRU9iamVjdClzcmNPYmplY3QpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJCWlmKGphdmFQcm9qZWN0LmV4aXN0cygpKXsKLQkJCQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvL2lmIG5hbWUgaXMgbnVsbCB0aGVuIGNhbid0IGdldCB0eXBlCi0JCQkJCQlpZihuYW1lICE9IG51bGwpIHsKLQkJCQkJCQl0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoIG5hbWUgKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy9pZiB0eXBlIGlzIG51bGwgdGhlbiBjYW4ndCBvcGVuIGl0cyBlZGl0b3IsIHNvIG9wZW4gZWRpdG9yIGZvciB0aGUgcmVzb3VyY2UKLQkJCQkJCWlmKHR5cGUgIT0gbnVsbCkgewotCQkJCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCQkJCUVkaXRvclV0aWxpdHkub3BlbkluRWRpdG9yKGN1KTsKLQkJCQkJCX0gZWxzZXsKLQkJCQkJCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IocmVzb3VyY2UpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKC0xLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcigtMSwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCi0JCQkJfQotCQkJfQorCQkJb3BlblJlc291cmNlSW5FZGl0b3IobmFtZSwgKEVPYmplY3Qpc3JjT2JqZWN0KTsKIAkJCXJldHVybjsKIAkJfQogCQkKKwkJaWYoc3JjT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCApeworCQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJbmFtZSA9ICgob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldClzcmNPYmplY3QpLmdldFNlcnZsZXRDbGFzcygpOworCQkJb3BlblJlc291cmNlSW5FZGl0b3IobmFtZSwgKEVPYmplY3Qpc3JjT2JqZWN0KTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiggc3JjT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyICl7CisJCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCisJCQluYW1lID0gKChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIpc3JjT2JqZWN0KS5nZXRGaWx0ZXJDbGFzcygpOworCQkJb3BlblJlc291cmNlSW5FZGl0b3IobmFtZSwgKEVPYmplY3Qpc3JjT2JqZWN0KTsKKwkJCXJldHVybjsKKwkJfQorCQkJCQkKKwkJaWYoIHNyY09iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lciApeworCQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJbmFtZSA9ICgob3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyKXNyY09iamVjdCkuZ2V0TGlzdGVuZXJDbGFzcygpOworCQkJb3BlblJlc291cmNlSW5FZGl0b3IobmFtZSwgKEVPYmplY3Qpc3JjT2JqZWN0KTsKKwkJCXJldHVybjsKKwkJfQkJCisJCQogCQlpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewogCQkJRU9iamVjdCBybyA9IChFT2JqZWN0KSBzcmNPYmplY3Q7CiAJCQlJUHJvamVjdCBwID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHJvKTsKQEAgLTI2Myw2ICsyNTksNyBAQAogCSAqIAogCSAqIEBwYXJhbSBzZWwgdGhlIG5ldyBzdHJ1Y3R1cmVkIHNlbGVjdGlvbgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7CiAJCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHMpKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMjc3LDcgKzI3NCwxNCBAQAogCQkJY3VycmVudERlc2NyaXB0b3IgPSBnZXRCYXNlSmF2YUVkaXRvckRlc2NyaXB0b3IoKTsJCiAJCX0gZWxzZSBpZihpc0VKQjNCZWFuT2JqZWN0KG9iaikpIHsKIAkJCS8vWzI0MTY4NV0gaWYgaXQgaXMgYSBFSkIgMyBiZWFuIHRoZSBjbGFzcyBpcyBzcGVjaWFsbHkgb3BlbmVkIGJ5IHRoZSBydW4oKSBtZXRob2QKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlzcmNPYmplY3QgPSBvYmo7CisJCQlyZXR1cm4gdHJ1ZTsJCQkKKwkJfSBlbHNlIGlmKG9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQgfHwKKwkJCQlvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIgfHwKKwkJCQlvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTGlzdGVuZXIgKXsKKwkJCXNyY09iamVjdCA9IG9iajsKKwkJCXJldHVybiB0cnVlOworCQl9ZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewogCQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpOwogCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKEVPYmplY3Qpb2JqKTsKIAkJCWlmKGZpbGUgIT0gbnVsbCkgewpAQCAtNDExLDQgKzQxNSw0NiBAQAogCQkKIAkJcmV0dXJuIGlzQmVhbjsKIAl9CisJCisJcHJvdGVjdGVkIHZvaWQgb3BlblJlc291cmNlSW5FZGl0b3IoU3RyaW5nIG5hbWUsIEVPYmplY3Qgb2JqZWN0KXsKKwkJSVJlc291cmNlIHJlc291cmNlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShvYmplY3QpOworCQlpZiggcmVzb3VyY2UgPT0gbnVsbCApCisJCQlyZXR1cm47CisJCQorCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOworCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CisJCWlmKGphdmFQcm9qZWN0LmV4aXN0cygpKXsKKwkJCUlUeXBlIHR5cGUgPSBudWxsOworCQkJdHJ5IHsKKwkJCQkvL2lmIG5hbWUgaXMgbnVsbCB0aGVuIGNhbid0IGdldCB0eXBlCisJCQkJaWYobmFtZSAhPSBudWxsKSB7CisJCQkJCXR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZSggbmFtZSApOworCQkJCX0KKwkJCQkKKwkJCQkvL2lmIHR5cGUgaXMgbnVsbCB0aGVuIGNhbid0IG9wZW4gaXRzIGVkaXRvciwgc28gb3BlbiBlZGl0b3IgZm9yIHRoZSByZXNvdXJjZQorCQkJCWlmKHR5cGUgIT0gbnVsbCkgeworCQkJCQlpZiggIXR5cGUuaXNCaW5hcnkoKSApeworCQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCk7CQkJCQkJCisJCQkJCQlFZGl0b3JVdGlsaXR5Lm9wZW5JbkVkaXRvcihjdSk7CisJCQkJCX1lbHNleworCQkJCQkJSUNsYXNzRmlsZSBjbGFzc0ZpbGUgPSB0eXBlLmdldENsYXNzRmlsZSgpOworCQkJCQkJRWRpdG9yVXRpbGl0eS5vcGVuSW5FZGl0b3IoY2xhc3NGaWxlKTsKKwkJCQkJfQorCQkJCQkKKwkJCQl9IGVsc2V7CisJCQkJCWlmKHJlc291cmNlLmV4aXN0cygpICYmIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSApeworCQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSlyZXNvdXJjZTsKKwkJCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKKwkJCQkJCWN1cnJlbnREZXNjcmlwdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpLmdldERlZmF1bHRFZGl0b3IoZmlsZS5nZXROYW1lKCksIGNvbnRlbnRUeXBlKTsKKwkJCQkJfQkJCQkJCQorCQkJCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IocmVzb3VyY2UpOworCQkJCX0KKwkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKC0xLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7CisJCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKC0xLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl9CisKKwkJfQkJCisJfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvV1RQQmFzZUFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FjdGlvbnMvV1RQQmFzZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDMzNDEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hY3Rpb25zL1dUUEJhc2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1bCA3LCAyMDA0Ci0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFdUUEJhc2VBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJQWN0aW9uRGVsZWdhdGUyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVJST1JfT0NDVVJSRURfVElUTEUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRVJST1JfT0NDVVJSRURfVElUTEUiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBFUlJPUl9PQ0NVUlJFRF9NRVNTQUdFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkVSUk9SX09DQ1VSUkVEX01FU1NBR0UiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFdpbmRvdyBnZXRXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0UGx1Z2luV29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVNoZWxsIHNoZWxsID0gZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJaWYgKG51bGwgPT0gc2VsZWN0aW9uKSB7Ci0JCQlJU2VsZWN0aW9uIGF1dG9zZWxlY3Rpb24gPSBnZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoYXV0b3NlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJCXRoaXMuc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBhdXRvc2VsZWN0aW9uOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXByaW1SdW4oc2hlbGwpOwotCQkJdGhpcy5zZWxlY3Rpb24gPSBudWxsOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBFUlJPUl9PQ0NVUlJFRF9USVRMRSwgRVJST1JfT0NDVVJSRURfTUVTU0FHRSwgdCwgMCwgZmFsc2UpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL2Rpc3Bvc2UKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTIjaW5pdChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vaW5pdAotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJc2V0U2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgYVNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJ1bigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC91aS9DbGFzc3BhdGhEZXBlbmRlbmN5QXR0cmlidXRlQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC91aS9DbGFzc3BhdGhEZXBlbmRlbmN5QXR0cmlidXRlQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDNkYWYyZTMuLmYxODNiMzMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvdWkvQ2xhc3NwYXRoRGVwZW5kZW5jeUF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL3VpL0NsYXNzcGF0aERlcGVuZGVuY3lBdHRyaWJ1dGVDb25maWd1cmF0aW9uLmphdmEKQEAgLTEyLDE2ICsxMiwxMiBAQAogCiBpbXBvcnQgamF2YS5uZXQuVVJMOwogCi0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLklDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzOwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwogCkBAIC0zMiw2ICsyOCw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbiNjYW5FZGl0KG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGNhbkVkaXQoQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzIGF0dHJpYnV0ZSkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMzksNiArMzYsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24jY2FuUmVtb3ZlKG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGNhblJlbW92ZShDbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MgYXR0cmlidXRlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTQ2LDYgKzQ0LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uI2dldEltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uLkNsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihDbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MgYXR0cmlidXRlKSB7CiAJCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKIAkJCWZpbmFsIFVSTCBnaWZJbWFnZVVSTCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoIkNQRGVwIik7IC8vJE5PTi1OTFMtMSQKQEAgLTU5LDYgKzU4LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uI2dldE5hbWVMYWJlbChvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uLkNsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldE5hbWVMYWJlbChDbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MgYXR0cmlidXRlKSB7CiAJCXJldHVybiBSZXNvdXJjZXMubmFtZUxhYmVsOwogCX0KQEAgLTY2LDYgKzY2LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uI2dldFZhbHVlTGFiZWwob3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbi5DbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRWYWx1ZUxhYmVsKENsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcyBhdHRyaWJ1dGUpIHsKIAkJZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSBhdHRyaWJ1dGUuZ2V0Q2xhc3NwYXRoQXR0cmlidXRlKCk7CiAJCWlmIChhdHRyaWIgIT0gbnVsbCkgewpAQCAtODMsMTUgKzg0LDE2IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbiNwZXJmb3JtRWRpdChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCwgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbi5DbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElDbGFzc3BhdGhBdHRyaWJ1dGUgcGVyZm9ybUVkaXQoU2hlbGwgc2hlbGwsCiAJCQlDbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MgYXR0cmlidXRlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIG51bGw7CiAJfQogCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbiNwZXJmb3JtUmVtb3ZlKG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBJQ2xhc3NwYXRoQXR0cmlidXRlIHBlcmZvcm1SZW1vdmUoQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzIGF0dHJpYnV0ZSkgewogCQlyZXR1cm4gSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSwgbnVsbCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC91aS9DbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yTWFya2VyUmVzb2x1dGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvdWkvQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvck1hcmtlclJlc29sdXRpb25zLmphdmEKaW5kZXggM2VmODMxMy4uMjRiZjk5NyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC91aS9DbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yTWFya2VyUmVzb2x1dGlvbnMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL3VpL0NsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JNYXJrZXJSZXNvbHV0aW9ucy5qYXZhCkBAIC03OSwxMCArNzksOSBAQAogCQkJCS8vIHF1aWNrIGZpeCBhZGRzIHRoZSBkZXBlbmRlbmN5LCBhbmQgb25lIHRvIHJlbW92ZSBpdAogCQkJCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7IG5ldyBVcGRhdGVDbGFzc3BhdGhEZXBlbmRlbmN5QXR0cmlidXRlUmVzb2x1dGlvbihjcEVudHJ5UGF0aCwgdHJ1ZSksCiAJCQkJCQluZXcgQWRkQ2xhc3NwYXRoTm9uRGVwZW5kZW5jeUF0dHJpYnV0ZVJlc29sdXRpb24oY3BFbnRyeVBhdGgpfTsJCi0JCQl9IGVsc2UgewotCQkJCS8vIHF1aWNrIGZpeCByZW1vdmVzIHRoZSBkZXBlbmRlbmN5Ci0JCQkJcmV0dXJuIG5ldyBJTWFya2VyUmVzb2x1dGlvbltdIHsgbmV3IEFkZENsYXNzcGF0aE5vbkRlcGVuZGVuY3lBdHRyaWJ1dGVSZXNvbHV0aW9uKGNwRW50cnlQYXRoKSB9OwogCQkJfQorCQkJLy8gcXVpY2sgZml4IHJlbW92ZXMgdGhlIGRlcGVuZGVuY3kKKwkJCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7IG5ldyBBZGRDbGFzc3BhdGhOb25EZXBlbmRlbmN5QXR0cmlidXRlUmVzb2x1dGlvbihjcEVudHJ5UGF0aCkgfTsKIAkJfSBlbHNlIGlmIChDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yLlByb2plY3RDbGFzc3BhdGhFbnRyeS5lcXVhbHMobWVzc2FnZUlkKSkgewogCQkJLy8gcXVpY2sgZml4IHJlbW92ZXMgdGhlIGRlcGVuZGVuY3kKIAkJCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7IG5ldyBVcGRhdGVDbGFzc3BhdGhEZXBlbmRlbmN5QXR0cmlidXRlUmVzb2x1dGlvbihjcEVudHJ5UGF0aCwgZmFsc2UpIH07CQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC91aS9DbGFzc3BhdGhOb25EZXBlbmRlbmN5QXR0cmlidXRlQ29uZmlndXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC91aS9DbGFzc3BhdGhOb25EZXBlbmRlbmN5QXR0cmlidXRlQ29uZmlndXJhdGlvbi5qYXZhCmluZGV4IDQ2M2ZlY2EuLmNhZDA0NjUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvdWkvQ2xhc3NwYXRoTm9uRGVwZW5kZW5jeUF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL3VpL0NsYXNzcGF0aE5vbkRlcGVuZGVuY3lBdHRyaWJ1dGVDb25maWd1cmF0aW9uLmphdmEKQEAgLTEyLDE2ICsxMiwxMiBAQAogCiBpbXBvcnQgamF2YS5uZXQuVVJMOwogCi0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb247Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLklDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzOwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwogCkBAIC0zMiw2ICsyOCw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbiNjYW5FZGl0KG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGNhbkVkaXQoQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzIGF0dHJpYnV0ZSkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMzksNiArMzYsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24jY2FuUmVtb3ZlKG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLkNsYXNzcGF0aEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24uQ2xhc3NwYXRoQXR0cmlidXRlQWNjZXNzKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGNhblJlbW92ZShDbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MgYXR0cmlidXRlKSB7CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTQ2LDYgKzQ0LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uI2dldEltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uLkNsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihDbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MgYXR0cmlidXRlKSB7CiAJCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKIAkJCWZpbmFsIFVSTCBnaWZJbWFnZVVSTCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoIkNQRGVwIik7IC8vJE5PTi1OTFMtMSQKQEAgLTU5LDYgKzU4LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uI2dldE5hbWVMYWJlbChvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uLkNsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldE5hbWVMYWJlbChDbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MgYXR0cmlidXRlKSB7CiAJCXJldHVybiBSZXNvdXJjZXMubmFtZUxhYmVsOwogCX0KQEAgLTY2LDYgKzY2LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uI2dldFZhbHVlTGFiZWwob3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbi5DbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRWYWx1ZUxhYmVsKENsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcyBhdHRyaWJ1dGUpIHsKIAkJcmV0dXJuIFJlc291cmNlcy51bnNwZWNpZmllZDsKIAl9CkBAIC03MywxNSArNzQsMTYgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uI3BlcmZvcm1FZGl0KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsLCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uLkNsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSUNsYXNzcGF0aEF0dHJpYnV0ZSBwZXJmb3JtRWRpdChTaGVsbCBzaGVsbCwKIAkJCUNsYXNzcGF0aEF0dHJpYnV0ZUFjY2VzcyBhdHRyaWJ1dGUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5DbGFzc3BhdGhBdHRyaWJ1dGVDb25maWd1cmF0aW9uI3BlcmZvcm1SZW1vdmUob3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuQ2xhc3NwYXRoQXR0cmlidXRlQ29uZmlndXJhdGlvbi5DbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElDbGFzc3BhdGhBdHRyaWJ1dGUgcGVyZm9ybVJlbW92ZShDbGFzc3BhdGhBdHRyaWJ1dGVBY2Nlc3MgYXR0cmlidXRlKSB7CiAJCXJldHVybiBKYXZhQ29yZS5uZXdDbGFzc3BhdGhBdHRyaWJ1dGUoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05fREVQRU5ERU5DWSwgbnVsbCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsaWVudC9hY3Rpb25zL0V4cG9ydEFwcGxpY2F0aW9uQ2xpZW50QWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvRXhwb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24uamF2YQppbmRleCAyOTZmZDU1Li41MTliNjBiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvRXhwb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvRXhwb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24uamF2YQpAQCAtMzgsNiArMzgsNyBAQAogCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSUNPTikpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHByaW1SdW4oU2hlbGwgc2hlbGwpIHsKIAkJQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQoKTsKIAkJSjJFRVVJUGx1Z2luIHBsdWdpbiA9IEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xpZW50L2FjdGlvbnMvSW1wb3J0QXBwbGljYXRpb25DbGllbnRBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGllbnQvYWN0aW9ucy9JbXBvcnRBcHBsaWNhdGlvbkNsaWVudEFjdGlvbi5qYXZhCmluZGV4IGVlYzYxNTUuLjM5MzE0NmYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGllbnQvYWN0aW9ucy9JbXBvcnRBcHBsaWNhdGlvbkNsaWVudEFjdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGllbnQvYWN0aW9ucy9JbXBvcnRBcHBsaWNhdGlvbkNsaWVudEFjdGlvbi5qYXZhCkBAIC00MCw2ICs0MCw3IEBACiAJCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCkgewogCiAJCUFwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZCB3aXphcmQgPSBuZXcgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdE92ZXJyaWRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvQWJzdHJhY3RPdmVycmlkZUNvbW1hbmQuamF2YQppbmRleCA0MjU2NGY2Li5hY2I1MGQ5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9BYnN0cmFjdE92ZXJyaWRlQ29tbWFuZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0Fic3RyYWN0T3ZlcnJpZGVDb21tYW5kLmphdmEKQEAgLTM4LDE0ICszOCwxNyBAQAogCQlzZXRPdmVycmlkYWJsZShjb21tYW5kKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewogCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpICYmIG92ZXJyaWRhYmxlLmRvQ2FuRXhlY3V0ZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7CiAJCXJldHVybiBvdmVycmlkYWJsZS5kb0NhblVuZG8oKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7CiAJCXJldHVybiBvdmVycmlkYWJsZS5kb0dldEFmZmVjdGVkT2JqZWN0cygpOwogCX0KQEAgLTcyLDYgKzc1LDcgQEAKIAkJcmV0dXJuIG92ZXJyaWRhYmxlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKIAkJcmV0dXJuIGdldEoyZWVDbGlwYm9hcmQoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ2xpcGJvYXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ2xpcGJvYXJkLmphdmEKaW5kZXggNGU0YWIyNS4uMzEzOTM0ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNsaXBib2FyZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDbGlwYm9hcmQuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogCQlzdXBlcihkZWZhdWx0Q2xpcGJvYXJkKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjKSB7CiAJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuYWRkQWxsKGMpOwogCQlpZiAocmVzdWx0ICYmIChjIGluc3RhbmNlb2YgSjJFRUNsaXBib2FyZCkpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29tcG91bmRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29tcG91bmRDb21tYW5kLmphdmEKaW5kZXggYmYxMDNhYi4uN2ZhNzkxMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvbXBvdW5kQ29tbWFuZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb21wb3VuZENvbW1hbmQuamF2YQpAQCAtMTY3LDYgKzE2Nyw3IEBACiAJCXN1cGVyKGNvbW1hbmRMaXN0KTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRNZXJnZWRBZmZlY3RlZE9iamVjdHNDb2xsZWN0aW9uKCkgewogCQlKMkVFQ2xpcGJvYXJkIHJlc3VsdCA9IG5ldyBKMkVFQ2xpcGJvYXJkKG5ldyBBcnJheUxpc3QoKSk7CiAKQEAgLTE3OCw2ICsxNzksNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldE1lcmdlZFJlc3VsdENvbGxlY3Rpb24oKSB7CiAJCUoyRUVDbGlwYm9hcmQgcmVzdWx0ID0gbmV3IEoyRUVDbGlwYm9hcmQobmV3IEFycmF5TGlzdCgpKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29weUNvbW1hbmQuamF2YQppbmRleCA1MWRjMGJkLi4yYThmNGZhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29weUNvbW1hbmQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29weUNvbW1hbmQuamF2YQpAQCAtNTcsMTQgKzU3LDE3IEBACiAJCQlyZXN1bHQuYWRkRXh0ZW5zaW9uKGNvcHksIGNvcHlVdGlsLmdldENvcHkoZXh0ZW5zaW9uVG9Db3B5KSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29weUZyb21DbGlwYm9hcmRDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29weUZyb21DbGlwYm9hcmRDb21tYW5kLmphdmEKaW5kZXggNTU4MWRlYy4uMmMxYTFkZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlGcm9tQ2xpcGJvYXJkQ29tbWFuZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb3B5RnJvbUNsaXBib2FyZENvbW1hbmQuamF2YQpAQCAtNjgsMTQgKzY4LDE3IEBACiAJCWNvcHlVdGlsID0gbnVsbDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTkwLDYgKzkzLDcgQEAKIAkJZXhlY3V0ZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHVuZG8oKSB7CiAJCXJlc3VsdCA9IG51bGw7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZC5qYXZhCmluZGV4IGViNDJiODMuLjVkMmI3ZmMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVDb3B5VG9DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFQ29weVRvQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kLmphdmEKQEAgLTQ2LDYgKzQ2LDcgQEAKIAkJcmV0dXJuIGNtZC51bndyYXAoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewogCQlwcmVwYXJlU291cmNlT2JqZWN0cygpOwogCQlpZiAoIW9ubHlSZWZPYmplY3RzKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kLmphdmEKaW5kZXggZDUxYTZkNS4uOTNjZDVhOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRVBhc3RlRnJvbUNsaXBib2FyZE92ZXJyaWRlQ29tbWFuZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVQYXN0ZUZyb21DbGlwYm9hcmRPdmVycmlkZUNvbW1hbmQuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogCQlzdXBlcihwLmdldERvbWFpbigpLCBwLmdldE93bmVyKCksIHAuZ2V0RmVhdHVyZSgpLCBwLmdldEluZGV4KCksIGZhbHNlKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoKSB7CiAJCXN1cGVyLmRvRXhlY3V0ZSgpOwogCQlleGVjdXRlQWRkQmluZGluZ3MoKTsKQEAgLTQ0LDE0ICs0NSwxNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZG9HZXRBZmZlY3RlZE9iamVjdHMoKSB7CiAJCXJldHVybiBjb3B5Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBkb0dldFJlc3VsdCgpIHsKIAkJcmV0dXJuIGNvcHlDb21tYW5kLmdldFJlc3VsdCgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGRvUmVkbygpIHsKIAkJc3VwZXIuZG9SZWRvKCk7CiAJCWlmIChhZGRCaW5kaW5nc0NvbW1hbmQgIT0gbnVsbCkKQEAgLTYwLDYgKzY0LDcgQEAKIAkJCWFkZEV4dGVuc2lvbnNDb21tYW5kLnJlZG8oKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBkb1VuZG8oKSB7CiAJCXN1cGVyLmRvVW5kbygpOwogCQlpZiAoYWRkQmluZGluZ3NDb21tYW5kICE9IG51bGwpCkBAIC04Niw2ICs5MSw3IEBACiAJCXJldHVybiAoSjJFRUNsaXBib2FyZCkgZG9tYWluLmdldENsaXBib2FyZCgpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7CiAJCWlmIChnZXRKMkVFQ2xpcGJvYXJkKCkgPT0gbnVsbCkKIAkJCXJldHVybiBmYWxzZTsKQEAgLTk1LDYgKzEwMSw3IEBACiAJCWNvbW1hbmQuYXBwZW5kKGNvcHlDb21tYW5kKTsKIAogCQljb21tYW5kLmFwcGVuZChuZXcgQ29tbWFuZFdyYXBwZXIoKSB7CisJCQlAT3ZlcnJpZGUKIAkJCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoKSB7CiAJCQkJQ29tbWFuZCBhZGRDb21tYW5kID0gQWRkQ29tbWFuZC5jcmVhdGUoZ2V0RG9tYWluKCksIGdldE93bmVyKCksIGdldEZlYXR1cmUoKSwgY29weUNvbW1hbmQuZ2V0UmVzdWx0KCksIGdldEluZGV4KCkpOwogCQkJCXJldHVybiBhZGRDb21tYW5kOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRVJlbW92ZU92ZXJyaWRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1hbmQvSjJFRVJlbW92ZU92ZXJyaWRlQ29tbWFuZC5qYXZhCmluZGV4IGFiNjEwMzkuLmZhZDc0ZTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tYW5kL0oyRUVSZW1vdmVPdmVycmlkZUNvbW1hbmQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbWFuZC9KMkVFUmVtb3ZlT3ZlcnJpZGVDb21tYW5kLmphdmEKQEAgLTEyMiw2ICsxMjIsNyBAQAogCQlyZXR1cm4gKFJlbW92ZUNvbW1hbmQpIGdldE92ZXJyaWRhYmxlKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKIAkJc2V0SjJlZUNsaXBib2FyZChuZXcgSjJFRUNsaXBib2FyZChnZXRSZW1vdmVDb21tYW5kKCkuZ2V0Q29sbGVjdGlvbigpKSk7CiAJCXJldHVybiB0cnVlOwpAQCAtMTU3LDYgKzE1OCw3IEBACiAJCWV4dGVuc2lvbnNSZW1vdmVDb21tYW5kID0gbmV3RXh0ZW5zaW9uc1JlbW92ZUNvbW1hbmQ7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgdW5kbygpIHsKIAkJZ2V0UmVtb3ZlQ29tbWFuZCgpLmRvVW5kbygpOwogCQl1bmRvTmVzdGVkKGJpbmRpbmdzUmVtb3ZlQ29tbWFuZCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggZWE3YWRjNy4uYzQ1OTM0NSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMTAsOSArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogQ3JlYXRlZCBvbiBKYW4gMTgsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzOwogCkBAIC0zMSw2ICsyOCw3IEBACiAJCXJldHVybiBuZXcgQ2xhc3NbXSB7SUxhdW5jaGFibGUuY2xhc3MgfTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopIHsKIAkJcmV0dXJuIEVudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVBZGFwdGVyVXRpbC5nZXRNb2R1bGVPYmplY3Qob2JqKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZU1vZHVsZUFydGlmYWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZU1vZHVsZUFydGlmYWN0LmphdmEKaW5kZXggYjNjYjM5ZS4uMGRjMDQzNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VNb2R1bGVBcnRpZmFjdC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlTW9kdWxlQXJ0aWZhY3QuamF2YQpAQCAtMTAsOSArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogQ3JlYXRlZCBvbiBGZWIgMjEsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzOwogCkBAIC0yMyw4ICsyMCw2IEBACiAvKioKICAqIEBhdXRob3IgYmxhbmNldHQKICAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAgKi8KIHB1YmxpYyBjbGFzcyBFbnRlcnByaXNlTW9kdWxlQXJ0aWZhY3QgaW1wbGVtZW50cyBJTW9kdWxlQXJ0aWZhY3QgewogCkBAIC0zMiw3ICsyNyw2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0I2dldE1vZHVsZSgpCiAJICovCiAJcHVibGljIElNb2R1bGUgZ2V0TW9kdWxlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAJCXJldHVybiBudWxsOwogCX0KIAkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KMkVFRGVwbG95YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvSjJFRURlcGxveWFibGVBZGFwdGVyRmFjdG9yeS5qYXZhCmluZGV4IDIxMjc3NDUuLjc4ZDdjOTggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KMkVFRGVwbG95YWJsZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0oyRUVEZXBsb3lhYmxlQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMTAsOSArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogQ3JlYXRlZCBvbiBGZWIgMjEsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9DaGFuZ2VMaWJEaXJEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0NoYW5nZUxpYkRpckRpYWxvZy5qYXZhCmluZGV4IDcxM2UzNjkuLmQ5YWMwZGQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0NoYW5nZUxpYkRpckRpYWxvZy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0NoYW5nZUxpYkRpckRpYWxvZy5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwogCitARGVwcmVjYXRlZAogcHVibGljIGNsYXNzIENoYW5nZUxpYkRpckRpYWxvZyBleHRlbmRzIElucHV0RGlhbG9nIHsKIAlwcml2YXRlIGJvb2xlYW4gd2FybkJsYW5rOwogCQpAQCAtMjcsNyArMjgsOCBAQAogICAgIAl0aGlzLndhcm5CbGFuayA9IHdhcm5CbGFuazsKICAgICB9CiAgICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewogICAgICAgICBpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewogICAgICAgICAJU3RyaW5nIHJlcyA9IGdldFRleHQoKS5nZXRUZXh0KCkudHJpbSgpOyAKICAgICAgICAgCWlmIChyZXMubGVuZ3RoKCkgPT0gMCkgewpAQCAtMzYsMjcgKzM4LDIxIEBACiAgICAgCQkJCQlKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5CTEFOS19MSUJfRElSKSwgCiAgICAgCQkJCQlKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5CTEFOS19MSUJfRElSX0NPTkZJUk0pKSkgcmV0dXJuOwogICAgICAgICAJfSBlbHNlIHsKLSAgICAJCQlpZiAocmVzLnN0YXJ0c1dpdGgoIiIgKyBJUGF0aC5TRVBBUkFUT1IpKSB7IC8vJE5PTi1OTFMtMSQKKyAgICAJCQlyZXMgPSByZXMuc3Vic3RyaW5nKDEpOwkKKyAgICAJCQlTdHJpbmdbXSBzZWdtZW50cyA9IHJlcy5zcGxpdCgiIiArIElQYXRoLlNFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQKKyAgICAJCQlQYXRoIHAgPSBuZXcgUGF0aCgiIik7IC8vJE5PTi1OTFMtMSQKKyAgICAJCQlib29sZWFuIHZhbGlkID0gdHJ1ZTsKKyAgICAJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgCQkJCXZhbGlkID0gcC5pc1ZhbGlkU2VnbWVudChzZWdtZW50c1tpXSk7CisgICAgCQkJCWlmICghdmFsaWQpCisgICAgCQkJCQlicmVhazsKKyAgICAJCQl9CisgICAgCQkJaWYgKCF2YWxpZCkgewogICAgIAkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihudWxsLCAKICAgICAJCQkJCQlKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5JTlZBTElEX1BBVEgpLCAKLSAgICAJCQkJCQlKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5JTlZBTElEX1BBVEhfU1RBUlRTX1dJVEhfU0xBU0hfTVNHKSk7CQorICAgIAkJCQkJCUoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLklOVkFMSURfUEFUSF9NU0cpKTsJCiAgICAgCQkJCXJldHVybjsKLSAgICAJCQl9IGVsc2UgewotCSAgICAJCQlTdHJpbmdbXSBzZWdtZW50cyA9IHJlcy5zcGxpdCgiIiArIElQYXRoLlNFUEFSQVRPUik7IC8vJE5PTi1OTFMtMSQKLQkgICAgCQkJUGF0aCBwID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCi0JICAgIAkJCWJvb2xlYW4gdmFsaWQgPSB0cnVlOwotCSAgICAJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JICAgIAkJCQl2YWxpZCA9IHAuaXNWYWxpZFNlZ21lbnQoc2VnbWVudHNbaV0pOwotCSAgICAJCQkJaWYgKCF2YWxpZCkKLQkgICAgCQkJCQlicmVhazsKLQkgICAgCQkJfQotCSAgICAJCQlpZiAoIXZhbGlkKSB7Ci0JICAgIAkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihudWxsLCAKLQkgICAgCQkJCQkJSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSU5WQUxJRF9QQVRIKSwgCi0JICAgIAkJCQkJCUoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLklOVkFMSURfUEFUSF9NU0cpKTsJCi0JICAgIAkJCQlyZXR1cm47Ci0JICAgIAkJCX0KLSAgICAJCQl9CisgICAgCQkJfQkgICAgICAgIAkJCiAgICAgICAgIAl9CiAgICAgICAgIH0gCiAgICAgICAgIHN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlRUFSQ29tcG9zaXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVFQVJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEwMjUxNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVFQVJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlbGV0ZS5EZWxldGVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLQotcHVibGljIGNsYXNzIERlbGV0ZUVBUkNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIEoyRUVEZWxldGVVSUNvbnN0YW50cywgTGlzdGVuZXIsIElDaGVja1N0YXRlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIERlbGV0ZUVBUkRpYWxvZyBkaWFsb2c7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVBcHBQcm9qZWN0c0J0bjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZVJlZlByb2plY3RzQnRuOwotCXByb3RlY3RlZCBDb21wb3NpdGUgcmFkaW9Db21wb3NpdGU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZXRhaWxzQnRuOwotCXByb3RlY3RlZCBEZWxldGVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlIG1vZHVsZVJlZnNDb21wb3NpdGU7Ci0JcHJvdGVjdGVkIENoZWNrYm94VGFibGVWaWV3ZXIgcHJvamVjdHNMaXN0OwotCXByb3RlY3RlZCBib29sZWFuIGxpc3RDcmVhdGVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIE1hcCByZWZlcmVuY2VkUHJvamVjdHM7Ci0JcHJvdGVjdGVkIFdvcmtiZW5jaExhYmVsUHJvdmlkZXIgd29ya2JlbmNoTGFiZWxQcm92aWRlciA9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVsZXRlRUFSQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgRGVsZXRlRUFSQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIERlbGV0ZUVBUkRpYWxvZyBkaWFsb2csIGludCBzdHlsZSwgU2V0IHJlZmVyZW5jZWRQcm9qZWN0cykgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJdGhpcy5kaWFsb2cgPSBkaWFsb2c7Ci0JCWluaXRSZWZlcmVuY2VkUHJvamVjdHMocmVmZXJlbmNlZFByb2plY3RzKTsKLQkJYWRkQ2hpbGRyZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHJlZmVyZW5jZWQgcHJvamVjdHMgd2hpY2ggdGhlIHVzZXIgaGFzIGNob3NlbiB0byBhbHNvIGRlbGV0ZQotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRTZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cygpIHsKLQkJaWYgKGRlbGV0ZUFwcFByb2plY3RzQnRuLmdldFNlbGVjdGlvbigpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWphdmEudXRpbC5MaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZFByb2plY3RzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZWxlbWVudCA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJYm9vbGVhbiBpc1NlbGVjdGVkID0gKChCb29sZWFuKSBlbGVtZW50LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJaWYgKGlzU2VsZWN0ZWQpCi0JCQkJcmVzdWx0LmFkZChlbGVtZW50LmdldEtleSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSjJFRURlbGV0ZURpYWxvZyNjcmVhdGVEZWxldGVPcHRpb25zKCkKLQkgKi8KLQlwdWJsaWMgRGVsZXRlT3B0aW9ucyBjcmVhdGVEZWxldGVPcHRpb25zKCkgewotCQlEZWxldGVPcHRpb25zIG9wdHMgPSBuZXcgRGVsZXRlT3B0aW9ucygpOwotCQlvcHRzLnNldElzRUFSRGVsZXRlKHRydWUpOwotCQlvcHRzLnNldERlbGV0ZVByb2plY3RzKHRydWUpOwotCQlvcHRzLnNldERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcyhtb2R1bGVSZWZzQ29tcG9zaXRlLnNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpKTsKLQkJb3B0cy5zZXREZWxldGVNb2R1bGVzKG1vZHVsZVJlZnNDb21wb3NpdGUuc2hvdWxkRGVsZXRlTW9kdWxlcygpKTsKLQkJb3B0cy5zZXRTZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cyhnZXRTZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cygpKTsKLQkJcmV0dXJuIG9wdHM7Ci0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRSZWZlcmVuY2VkUHJvamVjdHMoU2V0IHByb2plY3RzKSB7Ci0JCXJlZmVyZW5jZWRQcm9qZWN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb2plY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlyZWZlcmVuY2VkUHJvamVjdHMucHV0KHByb2plY3QsIEJvb2xlYW4uVFJVRSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJc2V0TGF5b3V0KCk7Ci0JCWFkZFJhZGlvQ29tcG9zaXRlKCk7Ci0JCW1vZHVsZVJlZnNDb21wb3NpdGUgPSBuZXcgRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSwgdHJ1ZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJbW9kdWxlUmVmc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkvL3NldHVwIGRlZmF1bHRzCi0JCWRlbGV0ZUFwcFByb2plY3RzQnRuLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG5TZWxlY3RlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldExheW91dCgpIHsKLQkJR3JpZExheW91dCBsYXkgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXkubnVtQ29sdW1ucyA9IDE7Ci0JCXNldExheW91dChsYXkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmFkaW9Db21wb3NpdGUoKSB7Ci0JCXJhZGlvQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0aGlzLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5Lm51bUNvbHVtbnMgPSAyOwotCQlyYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlyYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWRlbGV0ZUFwcFByb2plY3RzQnRuLnNldFRleHQoREVMRVRFX0VBUl9QUk9KRUNUUyk7Ci0JCWRlbGV0ZUFwcFByb2plY3RzQnRuLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0bi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWRlbGV0ZVJlZlByb2plY3RzQnRuID0gbmV3IEJ1dHRvbihyYWRpb0NvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJZGVsZXRlUmVmUHJvamVjdHNCdG4uc2V0VGV4dChERUxFVEVfUkVGRVJFTkNFRF9QUk9KRUNUUyk7Ci0JCWRlbGV0ZVJlZlByb2plY3RzQnRuLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlkZWxldGVSZWZQcm9qZWN0c0J0bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJZGV0YWlsc0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJZGV0YWlsc0J0bi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLQkJZGV0YWlsc0J0bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpOwotCQlkZXRhaWxzQnRuLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlkZXRhaWxzQnRuLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBkZWxldGVBcHBQcm9qZWN0c0J0bikKLQkJCWRlbGV0ZUFwcFByb2plY3RzQnRuU2VsZWN0ZWQoKTsKLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGRlbGV0ZVJlZlByb2plY3RzQnRuKQotCQkJZGVsZXRlUmVmUHJvamVjdHNCdG5TZWxlY3RlZCgpOwotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gZGV0YWlsc0J0bikKLQkJCWRldGFpbHNCdG5TZWxlY3RlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUFwcFByb2plY3RzQnRuU2VsZWN0ZWQoKSB7Ci0JCWlmIChkZWxldGVBcHBQcm9qZWN0c0J0bi5nZXRTZWxlY3Rpb24oKSkgewotCQkJaWYgKGxpc3RDcmVhdGVkKQotCQkJCXRvZ2dsZURldGFpbHNBcmVhKCk7Ci0JCQlkZXRhaWxzQnRuLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJbW9kdWxlUmVmc0NvbXBvc2l0ZS5zZXRCdXR0b25zRW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVSZWZQcm9qZWN0c0J0blNlbGVjdGVkKCkgewotCQlpZiAoZGVsZXRlUmVmUHJvamVjdHNCdG4uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWRldGFpbHNCdG4uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCW1vZHVsZVJlZnNDb21wb3NpdGUuc2V0QnV0dG9uc0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIgcHJlc3NpbmcgdGhlIGRldGFpbHMKLQkgKiBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlRGV0YWlsc0FyZWEoKSB7Ci0JCVBvaW50IHdpbmRvd1NpemUgPSBnZXRTaGVsbCgpLmdldFNpemUoKTsKLQkJUG9pbnQgb2xkU2l6ZSA9IGRpYWxvZy5nZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJaWYgKGxpc3RDcmVhdGVkKSB7Ci0JCQlwcm9qZWN0c0xpc3QuZ2V0Q29udHJvbCgpLmRpc3Bvc2UoKTsKLQkJCWxpc3RDcmVhdGVkID0gZmFsc2U7Ci0JCQlkZXRhaWxzQnRuLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotCQl9IGVsc2UgewotCQkJY3JlYXRlRHJvcERvd25MaXN0KCk7Ci0JCQlkZXRhaWxzQnRuLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5ISURFX0RFVEFJTFNfTEFCRUwpOwotCQl9Ci0KLQkJUG9pbnQgbmV3U2l6ZSA9IGRpYWxvZy5nZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJZ2V0U2hlbGwoKS5zZXRTaXplKG5ldyBQb2ludCh3aW5kb3dTaXplLngsIHdpbmRvd1NpemUueSArIChuZXdTaXplLnkgLSBvbGRTaXplLnkpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRHJvcERvd25MaXN0KCkgewotCQkvLyBjcmVhdGUgdGhlIGxpc3QKLQkJcHJvamVjdHNMaXN0ID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QocmFkaW9Db21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlwcm9qZWN0c0xpc3Quc2V0TGFiZWxQcm92aWRlcihjcmVhdGVMYWJlbFByb3ZpZGVyKCkpOwotCQlwcm9qZWN0c0xpc3Quc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Lyp2aWV3ZXJzb3J0ZXIqL30pOwotCQlwcm9qZWN0c0xpc3QuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkvLyBmaWxsIHRoZSBsaXN0Ci0JCXBvcHVsYXRlTGlzdCgpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBwcm9qZWN0c0xpc3QuZ2V0VGFibGUoKS5nZXRJdGVtSGVpZ2h0KCkgKiByZWZlcmVuY2VkUHJvamVjdHMuc2l6ZSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXByb2plY3RzTGlzdC5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbGlzdENyZWF0ZWQgPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlzdCgpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZFByb2plY3RzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCXByb2plY3RzTGlzdC5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJYm9vbGVhbiBjaGVja2VkID0gKChCb29sZWFuKSBlbnRyeS5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsKLQkJCXByb2plY3RzTGlzdC5zZXRDaGVja2VkKGVudHJ5LmdldEtleSgpLCBjaGVja2VkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRldGFpbHNCdG5TZWxlY3RlZCgpIHsKLQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElDaGVja1N0YXRlTGlzdGVuZXIjY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXJlZmVyZW5jZWRQcm9qZWN0cy5wdXQoZXZlbnQuZ2V0RWxlbWVudCgpLCBuZXcgQm9vbGVhbihldmVudC5nZXRDaGVja2VkKCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRhYmxlTGFiZWxQcm92aWRlciBjcmVhdGVMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCS8vZGlzcG9zZQotCQkJfQotCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCXJldHVybiB3b3JrYmVuY2hMYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KE9iamVjdCwgaW50KQotCQkJICovCi0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCXJldHVybiB3b3JrYmVuY2hMYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVFQVJEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZUVBUkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGY0MWY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZUVBUkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlRUFSRGlhbG9nIGV4dGVuZHMgSjJFRURlbGV0ZURpYWxvZyB7Ci0JcHJvdGVjdGVkIERlbGV0ZUVBUkNvbXBvc2l0ZSBkZWxldGVDb21wb3NpdGU7Ci0JcHJvdGVjdGVkIFNldCByZWZlcmVuY2VkUHJvamVjdHM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVsZXRlRUFSRGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqLwotCXB1YmxpYyBEZWxldGVFQVJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFNldCByZWZlcmVuY2VkUHJvamVjdHMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIERFTEVURV9FQVJfT1BUSU9OUyk7Ci0JCXRoaXMucmVmZXJlbmNlZFByb2plY3RzID0gcmVmZXJlbmNlZFByb2plY3RzOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2cjY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSjJFRVVJQ29udGV4dElkcy5ERUxFQVRFX0VBUl9ESUFMT0dfMSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVsZXRlQ29tcG9zaXRlID0gbmV3IERlbGV0ZUVBUkNvbXBvc2l0ZShwYXJlbnQsIHRoaXMsIFNXVC5OT05FLCByZWZlcmVuY2VkUHJvamVjdHMpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlkZWxldGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGRlbGV0ZUNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVEZWxldGVEaWFsb2cjY3JlYXRlRGVsZXRlT3B0aW9ucygpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlRGVsZXRlT3B0aW9ucygpIHsKLQkJZGVsZXRlT3B0aW9ucyA9IGRlbGV0ZUNvbXBvc2l0ZS5jcmVhdGVEZWxldGVPcHRpb25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2dldENvbnRlbnRzKCkKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250ZW50cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZWxldGVNb2R1bGVDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWRhNDBhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBEZWxldGVNb2R1bGVDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBKMkVFRGVsZXRlVUlDb25zdGFudHMsIExpc3RlbmVyIHsKLQotCS8vCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlUHJvamVjdHNDaGVja0JveDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZUFwcFByb2plY3RzQnRuOwotCXByb3RlY3RlZCBCdXR0b24gZGVsZXRlUmVmUHJvamVjdHNCdG47Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZSBtb2R1bGVSZWZzQ29tcG9zaXRlOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVsZXRlTW9kdWxlQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgRGVsZXRlTW9kdWxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJYWRkQ2hpbGRyZW4oKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkcmVuKCkgewotCQlhZGREZWxldGVQcm9qZWN0c0dyb3VwKCk7Ci0JCWFkZERlbGV0ZU1vZHVsZVJlZnNDb21wb3NpdGUoKTsKLQkJLy9zZXQgZGVmYXVsdCB2YWx1ZXMKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG4uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRlUHJvamVjdHNHcm91cCgpIHsKLQkJR3JpZExheW91dCBsYXkgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXkubnVtQ29sdW1ucyA9IDE7Ci0JCXNldExheW91dChsYXkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmFkaW9Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJbGF5ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5Lm51bUNvbHVtbnMgPSAyOwotCQlyYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlyYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWRlbGV0ZUFwcFByb2plY3RzQnRuLnNldFRleHQoREVMRVRFX1BST0pFQ1RTX09OTFkpOwotCQlkZWxldGVBcHBQcm9qZWN0c0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGVsZXRlQXBwUHJvamVjdHNCdG4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlkZWxldGVSZWZQcm9qZWN0c0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWRlbGV0ZVJlZlByb2plY3RzQnRuLnNldFRleHQoREVMRVRFX1BST0pFQ1RfUkVGRVJFTkNFUyk7Ci0JCWRlbGV0ZVJlZlByb2plY3RzQnRuLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlkZWxldGVSZWZQcm9qZWN0c0J0bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWxldGVNb2R1bGVSZWZzQ29tcG9zaXRlKCkgewotCQltb2R1bGVSZWZzQ29tcG9zaXRlID0gbmV3IERlbGV0ZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUodGhpcywgU1dULk5PTkUsIGZhbHNlKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXBhcmF0b3IoKSB7Ci0JCUxhYmVsIHNlcCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXNlcC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZERlbGV0ZVByb2plY3RzKCkgewotCQkvLwkJcmV0dXJuIGRlbGV0ZVByb2plY3RzQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCS8vIHRoZSBwcm9qZWN0IHNob3VsZCBiZSBkZWxldGVkLCBzaW5jZSBkZWxldGUgd2FzIHRoZSBzZWxlY3RlZCBhY3Rpb24KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoKSB7Ci0JCXJldHVybiBtb2R1bGVSZWZzQ29tcG9zaXRlLnNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZERlbGV0ZU1vZHVsZXMoKSB7Ci0JCXJldHVybiBtb2R1bGVSZWZzQ29tcG9zaXRlLnNob3VsZERlbGV0ZU1vZHVsZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gZGVsZXRlQXBwUHJvamVjdHNCdG4pCi0JCQlkZWxldGVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBkZWxldGVSZWZQcm9qZWN0c0J0bikKLQkJCWRlbGV0ZVJlZlByb2plY3RzQnRuU2VsZWN0ZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCkgewotCQlpZiAoZGVsZXRlQXBwUHJvamVjdHNCdG4uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCW1vZHVsZVJlZnNDb21wb3NpdGUuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlUmVmUHJvamVjdHNCdG5TZWxlY3RlZCgpIHsKLQkJaWYgKGRlbGV0ZVJlZlByb2plY3RzQnRuLmdldFNlbGVjdGlvbigpKSB7Ci0JCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldEJ1dHRvbnNFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlTW9kdWxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYjgwZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlTW9kdWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlbGV0ZS5EZWxldGVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVNb2R1bGVEaWFsb2cgZXh0ZW5kcyBKMkVFRGVsZXRlRGlhbG9nIGltcGxlbWVudHMgSjJFRURlbGV0ZVVJQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBEZWxldGVNb2R1bGVDb21wb3NpdGUgZGVsZXRlQ29tcG9zaXRlOwotCi0JcHVibGljIERlbGV0ZU1vZHVsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgREVMRVRFX01PRFVMRV9PUFRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElKMkVFVUlDb250ZXh0SWRzLkRFTEVBVEVfTU9EVUxFX0RJQUxPR18xKTsgLy8kTk9OLU5MUy0xJAotCQlkZWxldGVDb21wb3NpdGUgPSBuZXcgRGVsZXRlTW9kdWxlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlkZWxldGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGRlbGV0ZUNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVEZWxldGVPcHRpb25zKCkgewotCQlkZWxldGVPcHRpb25zID0gbmV3IERlbGV0ZU9wdGlvbnMoKTsKLQkJZGVsZXRlT3B0aW9ucy5zZXREZWxldGVQcm9qZWN0cyhkZWxldGVDb21wb3NpdGUuc2hvdWxkRGVsZXRlUHJvamVjdHMoKSk7Ci0JCWRlbGV0ZU9wdGlvbnMuc2V0RGVsZXRlTW9kdWxlcyhkZWxldGVDb21wb3NpdGUuc2hvdWxkRGVsZXRlTW9kdWxlcygpKTsKLQkJZGVsZXRlT3B0aW9ucy5zZXREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoZGVsZXRlQ29tcG9zaXRlLnNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpKTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTMxODlkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlbGV0ZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIEoyRUVEZWxldGVVSUNvbnN0YW50cywgTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVNb2R1bGVzQ2hlY2tib3g7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VBUkRlbGV0ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBEZWxldGVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgRGVsZXRlTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGJvb2xlYW4gaXNFQVJEZWxldGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXRoaXMuaXNFQVJEZWxldGUgPSBpc0VBUkRlbGV0ZTsKLQkJYWRkQ2hpbGRyZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJR3JpZExheW91dCBsYXkgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXkubnVtQ29sdW1ucyA9IDE7Ci0JCXNldExheW91dChsYXkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJYWRkRGVsZXRlTW9kdWxlc0NoZWNrYm94KCk7Ci0JCWFkZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3goKSB7Ci0JCWRlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94ID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0spOwotCQlkZWxldGVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5zZXRUZXh0KERFTEVURV9NT0RVTEVfREVQRU5ERU5DSUVTKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERlbGV0ZU1vZHVsZXNDaGVja2JveCgpIHsKLQkJZGVsZXRlTW9kdWxlc0NoZWNrYm94ID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0spOwotCQlTdHJpbmcgbGFiZWwgPSBpc0VBUkRlbGV0ZSA/IERFTEVURV9NT0RVTEVTX09USEVSIDogREVMRVRFX01PRFVMRVM7Ci0JCWRlbGV0ZU1vZHVsZXNDaGVja2JveC5zZXRUZXh0KGxhYmVsKTsKLQkJZGVsZXRlTW9kdWxlc0NoZWNrYm94LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpIHsKLQkJcmV0dXJuIGRlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZERlbGV0ZU1vZHVsZXMoKSB7Ci0JCXJldHVybiBkZWxldGVNb2R1bGVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnV0dG9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWRlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LnNldFNlbGVjdGlvbihlbmFibGVkKTsKLQkJZGVsZXRlTW9kdWxlc0NoZWNrYm94LnNldFNlbGVjdGlvbihlbmFibGVkKTsKLQkJZGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZGVsZXRlTW9kdWxlc0NoZWNrYm94LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IGRlbGV0ZU1vZHVsZXNDaGVja2JveCAmJiBkZWxldGVNb2R1bGVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgJiYgIWRlbGV0ZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LmdldFNlbGVjdGlvbigpKQotCQkJZGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0RlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cuamF2YQppbmRleCA5ODVjMmFlLi44N2Q1NWQ1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9EZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZy5qYXZhCkBAIC0xNSw3ICsxNSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CiAKIHB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgewogCQpAQCAtNDYsNiArNDYsNyBAQAogCQkJCWZhbHNlKTsKIAl9CiAJCQorCUBPdmVycmlkZQogCXB1YmxpYyBpbnQgb3BlbigpIHsKIAkJaWYgKGdldFByZWZTdG9yZSgpLmdldEJvb2xlYW4oRE9OVF9TSE9XX0FHQUlOKSkKIAkJCXJldHVybiBCVE5fSURfT0s7CkBAIC01MywxMSArNTQsMTMgQEAKIAkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7CiAJCWdldFByZWZTdG9yZSgpLnNldFZhbHVlKERPTlRfU0hPV19BR0FJTiwgZ2V0VG9nZ2xlU3RhdGUoKSk7CiAJCXJldHVybiBzdXBlci5jbG9zZSgpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmU3RvcmUoKSB7CiAJCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0ZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEKaW5kZXggNTQ0MmYyYy4uNDhkODBkNCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvRmlsdGVyZWRGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEKQEAgLTUyLDkgKzUyLDEwIEBACiAJCXNldFRpdGxlKHRpdGxlKTsKIAkJaWYgKHRpdGxlID09IG51bGwpCiAJCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRmlsZV9TZWxlY3Rpb25fVUlfIikpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQltZXNzYWdlID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlNlbGVjdF9hX2ZpbGVfX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JCXNldE1lc3NhZ2UobWVzc2FnZSk7CisJCVN0cmluZyBsb2NhbE1lc3NhZ2UgPSBtZXNzYWdlOworCQlpZiAobG9jYWxNZXNzYWdlID09IG51bGwpCisJCQlsb2NhbE1lc3NhZ2UgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiU2VsZWN0X2FfZmlsZV9fVUlfIik7IC8vJE5PTi1OTFMtMSQKKwkJc2V0TWVzc2FnZShsb2NhbE1lc3NhZ2UpOwogCQlzZXRBbGxvd011bHRpcGxlKHRydWUpOwogCQlzZXRFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwogCQlhZGRGaWx0ZXIobmV3IFR5cGVkRmlsZVZpZXdlckZpbHRlcihleHRlbnNpb25zKSk7CkBAIC02OSw3ICs3MCw3IEBACiAJfQogCiAJcHVibGljIHZvaWQgc2V0SGVscChTdHJpbmcgaGVscENvZGUpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLmdldFBhcmVudFNoZWxsKCksIGhlbHBDb2RlKTsgLy8kTk9OLU5MUy0xJAorCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMuZ2V0UGFyZW50U2hlbGwoKSwgaGVscENvZGUpOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlbGV0ZURpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlbGV0ZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk3ZjIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZWxldGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZWxldGUuRGVsZXRlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRURlbGV0ZURpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgaW1wbGVtZW50cyBKMkVFRGVsZXRlVUlDb25zdGFudHMgewotCi0JcHJvdGVjdGVkIERlbGV0ZU9wdGlvbnMgZGVsZXRlT3B0aW9uczsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFRGVsZXRlRGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZUltYWdlCi0JICogQHBhcmFtIGRpYWxvZ01lc3NhZ2UKLQkgKiBAcGFyYW0gZGlhbG9nSW1hZ2VUeXBlCi0JICogQHBhcmFtIGRpYWxvZ0J1dHRvbkxhYmVscwotCSAqIEBwYXJhbSBkZWZhdWx0SW5kZXgKLQkgKi8KLQlwdWJsaWMgSjJFRURlbGV0ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgbnVsbCwgREVMRVRFX0RJQUxPR19NRVNTQUdFLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tde0lEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfSwgMCk7Ci0JfQotCi0JcHVibGljIERlbGV0ZU9wdGlvbnMgZ2V0RGVsZXRlT3B0aW9ucygpIHsKLQkJcmV0dXJuIGRlbGV0ZU9wdGlvbnM7Ci0JfQotCi0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBjcmVhdGVEZWxldGVPcHRpb25zKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gMCkKLQkJCWNyZWF0ZURlbGV0ZU9wdGlvbnMoKTsKLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlbGV0ZVVJQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVsZXRlVUlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlNzQ0Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVsZXRlVUlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLQotcHVibGljIGludGVyZmFjZSBKMkVFRGVsZXRlVUlDb25zdGFudHMgewotCVN0cmluZyBERUxFVEUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGVsZXRlXzEiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfUFJPSkVDVFMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGVsZXRlX3NlbGVjdGVkX3Byb2plY3QocylfMiIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9NT0RVTEVTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbW92ZV9tb2R1bGUocylfZnJvbV9hbGxfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbnNfMyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9NT0RVTEVTX09USEVSID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbW92ZV9tb2R1bGUocylfZnJvbV9hbGxfb3RoZXJfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbnNfNCIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9NT0RVTEVfREVQRU5ERU5DSUVTID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbW92ZV9tb2R1bGVfZGVwZW5kZW5jaWVzX3JlZmVyZW5jaW5nX3NlbGVjdGVkX3Byb2plY3QocylfNSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9NT0RVTEVfT1BUSU9OUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEZWxldGVfTW9kdWxlX09wdGlvbnNfNiIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9FQVJfT1BUSU9OUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEZWxldGVfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbl9PcHRpb25zXzciKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfTk9UX0NPTVBMRVRFRCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEZWxldGVfY291bGRfbm90X2JlX2NvbXBsZXRlZF84Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX0VSUk9SID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRlbGV0ZV9lcnJvcl85Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX0RJQUxPR19NRVNTQUdFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIldoYXRfd291bGRfeW91X2xpa2VfdG9fZGVsZXRlX18xMCIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERFTEVURV9FQVJfUFJPSkVDVFMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGVsZXRlX3NlbGVjdGVkX0VudGVycHJpc2VfQXBwbGljYXRpb25fcHJvamVjdChzKV9vbmx5XzExIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX1JFRkVSRU5DRURfUFJPSkVDVFMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQWxzb19kZWxldGVfbW9kdWxlX2FuZF91dGlsaXR5X0phdmFfcHJvamVjdHNfMTIiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBERUxFVEVfUFJPSkVDVFNfT05MWSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEZWxldGVfc2VsZWN0ZWRfcHJvamVjdChzKV9vbmx5XzEzIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVMRVRFX1BST0pFQ1RfUkVGRVJFTkNFUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJBbHNvX2RlbGV0ZV9yZWZlcmVuY2VzX3RvX3NlbGVjdGVkX3Byb2plY3QocylfMTQiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDVVNUT01fREVMRVRFX01JWF9NQVRDSCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJDVVNUT01fREVMRVRFX01JWF9NQVRDSF9VSV8iKTsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZXBsb3lTdGF0dXNEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVEZXBsb3lTdGF0dXNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyOWJhOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVwbG95U3RhdHVzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAxMSwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQGF1dGhvciBzYWdhcndhbAotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVEZXBsb3lTdGF0dXNEaWFsb2cgZXh0ZW5kcyBQcm9ncmVzc01vbml0b3JEaWFsb2cgaW1wbGVtZW50cyBKMkVFRGVwbG95VUlDb25zdGFudHMgewotCi0JLyoqCi0JICogUmVzZXJ2ZSByb29tIGZvciB0aGlzIG1hbnkgbGlzdCBpdGVtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElTVF9JVEVNX0NPVU5UID0gNzsKLQlwcml2YXRlIGludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JcHVibGljIENvbG9yIERFU0NfQ09MT1IgPSBuZXcgQ29sb3IobnVsbCwgMjU1LCAyNTUsIDI1NSk7Ci0JLyoqCi0JICogVGhlIERldGFpbHMgYnV0dG9uLgotCSAqLwotCXByaXZhdGUgQnV0dG9uIGRldGFpbHNCdXR0b247Ci0KLQkvKioKLQkgKiBUaGUgU1dUIGxpc3QgY29udHJvbCB0aGF0IGRpc3BsYXlzIHRoZSBlcnJvciBkZXRhaWxzLgotCSAqLwotCXByaXZhdGUgVGV4dCB0ZXh0OwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVycm9yIGRldGFpbHMgdmlld2VyIGlzIGN1cnJlbnRseSBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB0ZXh0Q3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogTGlzdCBvZiB0aGUgbWFpbiBlcnJvciBvYmplY3QncyBkZXRhaWxlZCBlcnJvcnMgKGVsZW1lbnQgdHlwZToKLQkgKiA8Y29kZT5KMkVFTWlncmF0aW9uU3RhdHVzPC9jb2RlPikuCi0JICovCi0JcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCBzdGF0dXNMaXN0OwotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyBKMkVFRGVwbG95U3RhdHVzRGlhbG9nKFNoZWxsIHBhcmVudCwgTGlzdCBzdGF0dXMpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuQk9SREVSIHwgU1dULlRJVExFIHwgU1dULkFQUExJQ0FUSU9OX01PREFMIHwgU1dULlJFU0laRSk7IC8vIG5vCi0JCXN0YXR1c0xpc3QgPSBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGp1c3QgYWZ0ZXIgdGhlIG9wZXJhdGlvbiBpcyBydW4uIERlZmF1bHQgYmVoYXZpb3VyIGlzIHRvIGRlY3JlbWVudCB0aGUgbmVzdGluZyBkZXB0aCwKLQkgKiBhbmQgY2xvc2UgdGhlIGRpYWxvZy4KLQkgKiAKLQkgKiBAcGxhbm5lZGZvciAzLjAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZFJ1bigpIHsKLQkJZGVjcmVtZW50TmVzdGluZ0RlcHRoKCk7Ci0JCWNsZWFyQ3Vyc29ycygpOwotCQljYW5jZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJZGV0YWlsc0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQljb21wdXRlU2V2ZXJpdHkoKTsKLQkJc2V0RGVwbG95bWVudFN0YXR1cygpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RGVwbG95bWVudFN0YXR1cygpIHsKLQkJc2V0TWVzc2FnZU9yRGVmYXVsdCgpOwotCQlpbWFnZUxhYmVsLnNldEltYWdlKGdldEltYWdlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1lc3NhZ2VPckRlZmF1bHQoKSB7Ci0JCXN3aXRjaCAoZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBJU3RhdHVzLkVSUk9SIDoKLQkJCQltZXNzYWdlID0gREVQTE9ZX0VSUk9SU19SRVBPUlQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJbWVzc2FnZSA9IERFUExPWV9XQVJOSU5HU19SRVBPUlQ7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQltZXNzYWdlID0gREVQTE9ZX1NVQ0NFU1NfUkVQT1JUOwotCQkJCWJyZWFrOwotCQl9Ci0JCXNldE1lc3NhZ2UobWVzc2FnZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYW5jZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDYW5jZWxCdXR0b24ocGFyZW50KTsKLQkJY2FuY2VsLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNhbmNlbCBidXR0b24KLQkJY3JlYXRlQ2FuY2VsQnV0dG9uKHBhcmVudCk7Ci0JCWRldGFpbHNCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsIElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLCBmYWxzZSk7Ci0JCWRldGFpbHNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuIEhhbmRsZXMgdGhlIHByZXNzaW5nIG9mIHRoZSBPayBvciBEZXRhaWxzIGJ1dHRvbiBpbgotCSAqIHRoaXMgZGlhbG9nLiBJZiB0aGUgT2sgYnV0dG9uIHdhcyBwcmVzc2VkIHRoZW4gY2xvc2UgdGhpcyBkaWFsb2cuIElmIHRoZSBEZXRhaWxzIGJ1dHRvbiB3YXMKLQkgKiBwcmVzc2VkIHRoZW4gdG9nZ2xlIHRoZSBkaXNwbGF5aW5nIG9mIHRoZSBlcnJvciBkZXRhaWxzIGFyZWEuIE5vdGUgdGhhdCB0aGUgRGV0YWlscyBidXR0b24KLQkgKiB3aWxsIG9ubHkgYmUgdmlzaWJsZSBpZiB0aGUgZXJyb3IgYmVpbmcgZGlzcGxheWVkIHNwZWNpZmllcyBjaGlsZCBkZXRhaWxzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKSB7Ci0JCWlmIChpZCA9PSBJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQpIHsgLy8gd2FzIHRoZSBkZXRhaWxzIGJ1dHRvbiBwcmVzc2VkPwotCQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQkJfSBlbHNlIHsKLQkJCWxvZ1N0YXR1cygpOwotCQkJc3VwZXIuYnV0dG9uUHJlc3NlZChpZCk7Ci0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkljb25BbmRNZXNzYWdlRGlhbG9nI2dldEltYWdlKCkKLQkgKi8KLQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgewotCQlzd2l0Y2ggKGdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgSVN0YXR1cy5FUlJPUiA6Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0RXJyb3JJbWFnZSgpOwotCQkJY2FzZSBJU3RhdHVzLldBUk5JTkcgOgotCQkJCXJldHVybiB0aGlzLmdldFdhcm5pbmdJbWFnZSgpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0SW5mb0ltYWdlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVEcm9wRG93blRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgdGhlIGxpc3QKLQkJdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5NVUxUSSk7Ci0JCS8vIGZpbGwgdGhlIGxpc3QKLQkJcG9wdWxhdGVUZXh0KHRleHQpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5oZWlnaHRIaW50ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiBMSVNUX0lURU1fQ09VTlQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGV4dENyZWF0ZWQgPSB0cnVlOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9nU3RhdHVzKCkgewotCQlJdGVyYXRvciBhZW51bSA9IHN0YXR1c0xpc3QuaXRlcmF0b3IoKTsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQobWVzc2FnZSk7Ci0JCXdoaWxlIChhZW51bS5oYXNOZXh0KCkpIHsKLQkJCUlTdGF0dXMgY2hpbGRTdGF0dXMgPSAoSVN0YXR1cykgYWVudW0ubmV4dCgpOwotCQkJcG9wdWxhdGVUZXh0KHNiLCBjaGlsZFN0YXR1cywgMCk7Ci0JCX0KLQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0luZm8oc2IudG9TdHJpbmcoKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGxpc3QgdXNpbmcgdGhpcyBlcnJvciBkaWFsb2cncyBzdGF0dXMgb2JqZWN0LiBUaGlzIHdhbGtzIHRoZSBjaGlsZCBzdGF0aSBvZiB0aGUKLQkgKiBzdGF0dXMgb2JqZWN0IGFuZCBkaXNwbGF5cyB0aGVtIGluIGEgbGlzdC4gVGhlIGZvcm1hdCBmb3IgZWFjaCBlbnRyeSBpcyBzdGF0dXNfcGF0aCA6Ci0JICogc3RhdHVzX21lc3NhZ2UgSWYgdGhlIHN0YXR1cydzIHBhdGggd2FzIG51bGwgdGhlbiBpdCAoYW5kIHRoZSBjb2xvbikgYXJlIG9taXR0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGV4dChUZXh0IHNvbWVUZXh0KSB7Ci0JCUl0ZXJhdG9yIGFlbnVtID0gc3RhdHVzTGlzdC5pdGVyYXRvcigpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXdoaWxlIChhZW51bS5oYXNOZXh0KCkpIHsKLQkJCUlTdGF0dXMgY2hpbGRTdGF0dXMgPSAoSVN0YXR1cykgYWVudW0ubmV4dCgpOwotCQkJLy9zYi5hcHBlbmQoIkRlcGxveW1lbnQgcmVzdWx0cyBmb3IgIiArIGNoaWxkU3RhdHVzLik7Ci0JCQlwb3B1bGF0ZVRleHQoc2IsIGNoaWxkU3RhdHVzLCAwKTsKLQkJfQotCQlzb21lVGV4dC5zZXRUZXh0KHNiLnRvU3RyaW5nKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGV4dChTdHJpbmdCdWZmZXIgc2IsIElTdGF0dXMgc3RhdHVzLCBpbnQgbmVzdGluZykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG5lc3Rpbmc7IGkrKykgewotCQkJc2IuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2IuYXBwZW5kKGdldE1lc3NhZ2VGb3JEaXNwbGF5KHN0YXR1cykpOwotCQlzYi5hcHBlbmQoJ1xuJyk7Ci0JCUlTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlwb3B1bGF0ZVRleHQoc2IsIGNoaWxkcmVuW2ldLCBuZXN0aW5nICsgMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSB1bmZvbGRpbmcgb2YgdGhlIGRldGFpbHMgYXJlYS4gVGhpcyBpcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIgcHJlc3NpbmcgdGhlIGRldGFpbHMKLQkgKiBidXR0b24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkgewotCQlQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCVBvaW50IG9sZFNpemUgPSBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJaWYgKHRleHRDcmVhdGVkKSB7Ci0JCQl0ZXh0LmRpc3Bvc2UoKTsKLQkJCXRleHRDcmVhdGVkID0gZmFsc2U7Ci0JCQlkZXRhaWxzQnV0dG9uLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotCQl9IGVsc2UgewotCQkJdGV4dCA9IGNyZWF0ZURyb3BEb3duVGV4dCgoQ29tcG9zaXRlKSBnZXRDb250ZW50cygpKTsKLQkJCWRldGFpbHNCdXR0b24uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLkhJREVfREVUQUlMU19MQUJFTCk7Ci0JCQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCXRleHQuc2V0QmFja2dyb3VuZChERVNDX0NPTE9SKTsKLQkJfQotCi0JCVBvaW50IG5ld1NpemUgPSBnZXRDb250ZW50cygpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJZ2V0U2hlbGwoKS5zZXRTaXplKG5ldyBQb2ludCh3aW5kb3dTaXplLngsIHdpbmRvd1NpemUueSArIChuZXdTaXplLnkgLSBvbGRTaXplLnkpKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlRm9yRGlzcGxheShJU3RhdHVzIHN0YXR1cykgewotCQlTdHJpbmcgbWVzc2FnZVN0cmluZyA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCXJldHVybiBtZXNzYWdlU3RyaW5nOwotCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZXZlcml0eVRleHQoSVN0YXR1cyBzdGF0dXMpIHsKLQkJc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBJU3RhdHVzLkVSUk9SIDoKLQkJCQlyZXR1cm4gRVJST1JfVEVYVDsKLQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLQkJCQlyZXR1cm4gV0FSTklOR19URVhUOwotCQkJY2FzZSBJU3RhdHVzLklORk8gOgotCQkJCXJldHVybiBJTkZPX1RFWFQ7Ci0JCQljYXNlIElTdGF0dXMuT0sgOgotCQkJCXJldHVybiBPS19URVhUOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldikgewotCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCXJldHVybjsKLQkJaWYgKHNldiA9PSBJU3RhdHVzLkVSUk9SKQotCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQllbHNlIGlmIChzZXYgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVNldmVyaXR5KCkgewotCQlJdGVyYXRvciBhZW51bSA9IHN0YXR1c0xpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFlbnVtLmhhc05leHQoKSkgewotCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IChJU3RhdHVzKSBhZW51bS5uZXh0KCk7Ci0JCQlzZXRTZXZlcml0eShjaGlsZFN0YXR1cy5nZXRTZXZlcml0eSgpKTsKLQkJCWlmIChnZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJcmV0dXJuIGdldFNldmVyaXR5KCk7Ci0JCQljb21wdXRlU2V2ZXJpdHkoY2hpbGRTdGF0dXMpOwotCQkJaWYgKGdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikKLQkJCQlnZXRTZXZlcml0eSgpOwotCQl9Ci0JCXJldHVybiBnZXRTZXZlcml0eSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wdXRlU2V2ZXJpdHkoSVN0YXR1cyBzdGF0dXMpIHsKLQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWNvbXB1dGVTZXZlcml0eShjaGlsZHJlbltpXSk7Ci0JCQlpZiAoZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgaW4gV2luZG93LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChERVBMT1lfRElBTE9HX1RJVExFKTsKLQkJLy9zaGVsbC5zZXRTaXplKDYwMCwyMDApOyBkb24ndCBzZXQgdGhlIHNpemUgdGhpcyBicmVha3MgdGhlIGRpYWxvZyBmb3IgbGludXguCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY29udHJvbCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJc2V0TWVzc2FnZShERVBMT1lNRU5UX0lOX1BST0dSRVNTKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlIGxhYmVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlU3RyaW5nKSB7Ci0JCS8vbXVzdCBub3Qgc2V0IG51bGwgdGV4dCBpbiBhIGxhYmVsCi0JCW1lc3NhZ2UgPSBtZXNzYWdlU3RyaW5nID09IG51bGwgPyAiIiA6IG1lc3NhZ2VTdHJpbmc7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1lc3NhZ2VMYWJlbCA9PSBudWxsIHx8IG1lc3NhZ2VMYWJlbC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvSjJFRURlcGxveVVJQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVwbG95VUlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlMzU4OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFRGVwbG95VUlDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLQotcHVibGljIGludGVyZmFjZSBKMkVFRGVwbG95VUlDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1RFWFQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZX0VSUk9SX1RFWFQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5JTkdfVEVYVCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfV0FSTklOR19URVhUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX1RFWFQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZX0lORk9fVEVYVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0tfVEVYVCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfT0tfVEVYVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQTE9ZTUVOVF9JTl9QUk9HUkVTUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lNRU5UX0lOX1BST0dSRVNTIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lfU1VDQ0VTU19SRVBPUlQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiREVQTE9ZX1NVQ0NFU1NfUkVQT1JUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lfV0FSTklOR1NfUkVQT1JUID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9XQVJOSU5HU19SRVBPUlQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUExPWV9FUlJPUlNfUkVQT1JUID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9FUlJPUlNfUkVQT1JUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBMT1lfRElBTE9HX1RJVExFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRFUExPWV9ESUFMT0dfVElUTEUiKTsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVSZW5hbWVEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVSZW5hbWVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjYmYxMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFUmVuYW1lRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3M7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVuYW1lLlJlbmFtZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVSZW5hbWVEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIGltcGxlbWVudHMgSjJFRVJlbmFtZVVJQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBSZW5hbWVPcHRpb25zIHJlbmFtZU9wdGlvbnM7Ci0JcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50TmFtZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRVJlbmFtZURpYWxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGVJbWFnZQotCSAqIEBwYXJhbSBkaWFsb2dNZXNzYWdlCi0JICogQHBhcmFtIGRpYWxvZ0ltYWdlVHlwZQotCSAqIEBwYXJhbSBkaWFsb2dCdXR0b25MYWJlbHMKLQkgKiBAcGFyYW0gZGVmYXVsdEluZGV4Ci0JICovCi0JcHVibGljIEoyRUVSZW5hbWVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBudWxsLCBSRU5BTUVfRElBTE9HX01FU1NBR0UsIFFVRVNUSU9OLCBuZXcgU3RyaW5nW117SURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9LCAwKTsKLQkJY3VycmVudE5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBSZW5hbWVPcHRpb25zIGdldFJlbmFtZU9wdGlvbnMoKSB7Ci0JCXJldHVybiByZW5hbWVPcHRpb25zOwotCX0KLQotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlUmVuYW1lT3B0aW9ucygpOwotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IDApCi0JCQljcmVhdGVSZW5hbWVPcHRpb25zKCk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9KMkVFUmVuYW1lVUlDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVSZW5hbWVVSUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWE1NzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0oyRUVSZW5hbWVVSUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEoyRUVSZW5hbWVVSUNvbnN0YW50cyB7Ci0JU3RyaW5nIFJFTkFNRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW5hbWVfMSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9QUk9KRUNUUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW5hbWVfc2VsZWN0ZWRfcHJvamVjdF8yIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVOQU1FX01PRFVMRVMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX21vZHVsZV9pbl9hbGxfRW50ZXJwcmlzZV9BcHBsaWNhdGlvbnNfMyIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9NT0RVTEVTX09USEVSID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlJlbmFtZV9tb2R1bGVfaW5fYWxsX290aGVyX0VudGVycHJpc2VfQXBwbGljYXRpb25zXzQiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfTU9EVUxFX0RFUEVOREVOQ0lFUyA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW5hbWVfbW9kdWxlX2RlcGVuZGVuY2llc19yZWZlcmVuY2luZ19zZWxlY3RlZF9wcm9qZWN0XzUiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfTU9EVUxFX09QVElPTlMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX01vZHVsZV9PcHRpb25zXzYiKTsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBSRU5BTUVfRUFSX09QVElPTlMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX0VudGVycHJpc2VfQXBwbGljYXRpb25fT3B0aW9uc183Iik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVOQU1FX05PVF9DT01QTEVURUQgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX2NvdWxkX25vdF9iZV9jb21wbGV0ZWRfOCIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9FUlJPUiA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW5hbWVfZXJyb3JfOSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9ESUFMT0dfTUVTU0FHRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJXaGF0X3dvdWxkX3lvdV9saWtlX3RvX3JlbmFtZV90aGlzX3RvX18xMCIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9DT05URVhUX1JPT1QgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ29udGV4dF9Sb290X18xMSIpOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFTkFNRV9FQVJfUFJPSkVDVFMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUmVuYW1lX3NlbGVjdGVkX0VudGVycHJpc2VfQXBwbGljYXRpb25fcHJvamVjdF9vbmx5XzEyIik7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVOQU1FX1JFRkVSRU5DRURfUFJPSkVDVFMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQWxzb19yZW5hbWVfbW9kdWxlX2FuZF91dGlsaXR5X0phdmFfcHJvamVjdHNfMTMiKTsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0xpc3RNZXNzYWdlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9MaXN0TWVzc2FnZURpYWxvZy5qYXZhCmluZGV4IDg4MDhiMWQuLjI1MjgyYTggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL0xpc3RNZXNzYWdlRGlhbG9nLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvTGlzdE1lc3NhZ2VEaWFsb2cuamF2YQpAQCAtODcsNiArODcsNyBAQAogCSAqICAgICAgICAgICAgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBjdXN0b20gYXJlYQogCSAqIEByZXR1cm4gdGhlIGN1c3RvbSBhcmVhIGNvbnRyb2wsIG9yIDxjb2RlPm51bGw8L2NvZGU+CiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CiAKIAkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCAwKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMWNjYjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJ1bnRpbWVTZWxlY3Rpb25EaWFsb2dfQ29uZmlndXJlX1RhcmdldF9SdW50aW1lXzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFRGVwbG95QWN0aW9uX0RlcGxveV87CisKKwlzdGF0aWMgeworCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVFQVJDb21wb3NpdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZUVBUkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRlM2I4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZUVBUkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVuYW1lLlJlbmFtZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoTGFiZWxQcm92aWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgUmVuYW1lRUFSQ29tcG9zaXRlIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgSjJFRVJlbmFtZVVJQ29uc3RhbnRzLCBMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHJlbmFtZUFwcFByb2plY3RzQnRuOwotCXByb3RlY3RlZCBCdXR0b24gcmVuYW1lUmVmUHJvamVjdHNCdG47Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRldGFpbHNCdG47Ci0JcHJvdGVjdGVkIFJlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUgbW9kdWxlUmVmc0NvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgQ2hlY2tib3hUYWJsZVZpZXdlciBwcm9qZWN0c0xpc3Q7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbGlzdENyZWF0ZWQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTWFwIHJlZmVyZW5jZWRQcm9qZWN0czsKLQlwcm90ZWN0ZWQgV29ya2JlbmNoTGFiZWxQcm92aWRlciB3b3JrYmVuY2hMYWJlbFByb3ZpZGVyID0gbmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZW5hbWVFQVJDb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBSZW5hbWVFQVJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTZXQgcmVmZXJlbmNlZFByb2plY3RzKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCQlpbml0UmVmZXJlbmNlZFByb2plY3RzKHJlZmVyZW5jZWRQcm9qZWN0cyk7Ci0JCWFkZENoaWxkcmVuKCk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIHRoZSByZWZlcmVuY2VkIHByb2plY3RzIHdoaWNoIHRoZSB1c2VyIGhhcyBjaG9zZW4gdG8gYWxzbyByZW5hbWUKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoKSB7Ci0JCWlmIChyZW5hbWVBcHBQcm9qZWN0c0J0bi5nZXRTZWxlY3Rpb24oKSkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlqYXZhLnV0aWwuTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZWRQcm9qZWN0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVsZW1lbnQgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCWJvb2xlYW4gaXNTZWxlY3RlZCA9ICgoQm9vbGVhbikgZWxlbWVudC5nZXRWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKTsKLQkJCWlmIChpc1NlbGVjdGVkKQotCQkJCXJlc3VsdC5hZGQoZWxlbWVudC5nZXRLZXkoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEoyRUVSZW5hbWVEaWFsb2cjY3JlYXRlUmVuYW1lT3B0aW9ucygpCi0JICovCi0JcHVibGljIFJlbmFtZU9wdGlvbnMgY3JlYXRlUmVuYW1lT3B0aW9ucygpIHsKLQkJUmVuYW1lT3B0aW9ucyBvcHRzID0gbmV3IFJlbmFtZU9wdGlvbnMoKTsKLQkJb3B0cy5zZXRJc0VBUlJlbmFtZSh0cnVlKTsKLQkJb3B0cy5zZXRSZW5hbWVQcm9qZWN0cyh0cnVlKTsKLQkJb3B0cy5zZXRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMobW9kdWxlUmVmc0NvbXBvc2l0ZS5zaG91bGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMoKSk7Ci0JCW9wdHMuc2V0UmVuYW1lTW9kdWxlcyhtb2R1bGVSZWZzQ29tcG9zaXRlLnNob3VsZFJlbmFtZU1vZHVsZXMoKSk7Ci0JCW9wdHMuc2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoZ2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoKSk7Ci0JCXJldHVybiBvcHRzOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0UmVmZXJlbmNlZFByb2plY3RzKFNldCBwcm9qZWN0cykgewotCQlyZWZlcmVuY2VkUHJvamVjdHMgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9qZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGl0ZXIubmV4dCgpOwotCQkJcmVmZXJlbmNlZFByb2plY3RzLnB1dChwcm9qZWN0LCBCb29sZWFuLlRSVUUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW4oKSB7Ci0JCXNldExheW91dCgpOwotCQlhZGRSYWRpb0NvbXBvc2l0ZSgpOwotCQltb2R1bGVSZWZzQ29tcG9zaXRlID0gbmV3IFJlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUodGhpcywgU1dULk5PTkUsIHRydWUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCW1vZHVsZVJlZnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYXlvdXQoKSB7Ci0JCUdyaWRMYXlvdXQgbGF5ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5Lm51bUNvbHVtbnMgPSAxOwotCQlzZXRMYXlvdXQobGF5KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJhZGlvQ29tcG9zaXRlKCkgewotCQlyYWRpb0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheSA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheS5udW1Db2x1bW5zID0gMjsKLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0KGxheSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmVuYW1lQXBwUHJvamVjdHNCdG4gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQlyZW5hbWVBcHBQcm9qZWN0c0J0bi5zZXRUZXh0KFJFTkFNRV9FQVJfUFJPSkVDVFMpOwotCQlyZW5hbWVBcHBQcm9qZWN0c0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJcmVuYW1lQXBwUHJvamVjdHNCdG4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZW5hbWVSZWZQcm9qZWN0c0J0biA9IG5ldyBCdXR0b24ocmFkaW9Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCXJlbmFtZVJlZlByb2plY3RzQnRuLnNldFRleHQoUkVOQU1FX1JFRkVSRU5DRURfUFJPSkVDVFMpOwotCQlyZW5hbWVSZWZQcm9qZWN0c0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJcmVuYW1lUmVmUHJvamVjdHNCdG4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWRldGFpbHNCdG4gPSBuZXcgQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWRldGFpbHNCdG4uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCk7Ci0JCWRldGFpbHNCdG4uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJZGV0YWlsc0J0bi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJZGV0YWlsc0J0bi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIExpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gcmVuYW1lQXBwUHJvamVjdHNCdG4pCi0JCQlyZW5hbWVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCk7Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSByZW5hbWVSZWZQcm9qZWN0c0J0bikKLQkJCXJlbmFtZVJlZlByb2plY3RzQnRuU2VsZWN0ZWQoKTsKLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGRldGFpbHNCdG4pCi0JCQlkZXRhaWxzQnRuU2VsZWN0ZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW5hbWVBcHBQcm9qZWN0c0J0blNlbGVjdGVkKCkgewotCQlpZiAocmVuYW1lQXBwUHJvamVjdHNCdG4uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWlmIChsaXN0Q3JlYXRlZCkKLQkJCQl0b2dnbGVEZXRhaWxzQXJlYSgpOwotCQkJZGV0YWlsc0J0bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1vZHVsZVJlZnNDb21wb3NpdGUuc2V0QnV0dG9uc0VuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVuYW1lUmVmUHJvamVjdHNCdG5TZWxlY3RlZCgpIHsKLQkJaWYgKHJlbmFtZVJlZlByb2plY3RzQnRuLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlkZXRhaWxzQnRuLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQltb2R1bGVSZWZzQ29tcG9zaXRlLnNldEJ1dHRvbnNFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgdW5mb2xkaW5nIG9mIHRoZSBkZXRhaWxzIGFyZWEuIFRoaXMgaXMgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyIHByZXNzaW5nIHRoZSBkZXRhaWxzCi0JICogYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZURldGFpbHNBcmVhKCkgewotCQlQb2ludCB3aW5kb3dTaXplID0gZ2V0U2hlbGwoKS5nZXRTaXplKCk7Ci0JCVBvaW50IG9sZFNpemUgPSBnZXRQYXJlbnQoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWlmIChsaXN0Q3JlYXRlZCkgewotCQkJcHJvamVjdHNMaXN0LmdldENvbnRyb2woKS5kaXNwb3NlKCk7Ci0JCQlsaXN0Q3JlYXRlZCA9IGZhbHNlOwotCQkJZGV0YWlsc0J0bi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMKTsKLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZURyb3BEb3duTGlzdCgpOwotCQkJZGV0YWlsc0J0bi5zZXRUZXh0KElEaWFsb2dDb25zdGFudHMuSElERV9ERVRBSUxTX0xBQkVMKTsKLQkJfQotCi0JCVBvaW50IG5ld1NpemUgPSBnZXRQYXJlbnQoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWdldFNoZWxsKCkuc2V0U2l6ZShuZXcgUG9pbnQod2luZG93U2l6ZS54LCB3aW5kb3dTaXplLnkgKyAobmV3U2l6ZS55IC0gb2xkU2l6ZS55KSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURyb3BEb3duTGlzdCgpIHsKLQkJLy8gY3JlYXRlIHRoZSBsaXN0Ci0JCXByb2plY3RzTGlzdCA9IENoZWNrYm94VGFibGVWaWV3ZXIubmV3Q2hlY2tMaXN0KHJhZGlvQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJcHJvamVjdHNMaXN0LnNldExhYmVsUHJvdmlkZXIoY3JlYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJcHJvamVjdHNMaXN0LnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgey8qdmlld2Vyc29ydGVyKi99KTsKLQkJcHJvamVjdHNMaXN0LmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJLy8gZmlsbCB0aGUgbGlzdAotCQlwb3B1bGF0ZUxpc3QoKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IHByb2plY3RzTGlzdC5nZXRUYWJsZSgpLmdldEl0ZW1IZWlnaHQoKSAqIHJlZmVyZW5jZWRQcm9qZWN0cy5zaXplKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJcHJvamVjdHNMaXN0LmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlsaXN0Q3JlYXRlZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaXN0KCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VkUHJvamVjdHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJcHJvamVjdHNMaXN0LmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQlib29sZWFuIGNoZWNrZWQgPSAoKEJvb2xlYW4pIGVudHJ5LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJcHJvamVjdHNMaXN0LnNldENoZWNrZWQoZW50cnkuZ2V0S2V5KCksIGNoZWNrZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGV0YWlsc0J0blNlbGVjdGVkKCkgewotCQl0b2dnbGVEZXRhaWxzQXJlYSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJcmVmZXJlbmNlZFByb2plY3RzLnB1dChldmVudC5nZXRFbGVtZW50KCksIG5ldyBCb29sZWFuKGV2ZW50LmdldENoZWNrZWQoKSkpOwotCX0KLQotCXByb3RlY3RlZCBJVGFibGVMYWJlbFByb3ZpZGVyIGNyZWF0ZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy9kaXNwb3NlCi0JCQl9Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJcmV0dXJuIHdvcmtiZW5jaExhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQHNlZSBJVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoT2JqZWN0LCBpbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJcmV0dXJuIHdvcmtiZW5jaExhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZUVBUkRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lRUFSRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MGUwNTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lRUFSRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBSZW5hbWVFQVJEaWFsb2cgZXh0ZW5kcyBKMkVFUmVuYW1lRGlhbG9nIHsKLQlwcm90ZWN0ZWQgUmVuYW1lRUFSQ29tcG9zaXRlIHJlbmFtZUNvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgU2V0IHJlZmVyZW5jZWRQcm9qZWN0czsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZW5hbWVFQVJEaWFsb2cuCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICovCi0JcHVibGljIFJlbmFtZUVBUkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU2V0IHJlZmVyZW5jZWRQcm9qZWN0cywgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIFJFTkFNRV9FQVJfT1BUSU9OUywgbmFtZSk7Ci0JCXRoaXMucmVmZXJlbmNlZFByb2plY3RzID0gcmVmZXJlbmNlZFByb2plY3RzOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2cjY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ3VzdG9tQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSjJFRVVJQ29udGV4dElkcy5SRU5BTUVfRUFSX0RJQUxPR18xKTsgLy8kTk9OLU5MUy0xJAotCQlyZW5hbWVDb21wb3NpdGUgPSBuZXcgUmVuYW1lRUFSQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUsIHJlZmVyZW5jZWRQcm9qZWN0cyk7Ci0JCS8vCQlyZW5hbWVDb21wb3NpdGUuc2V0TmV3TmFtZShjdXJyZW50TmFtZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXJlbmFtZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gcmVuYW1lQ29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSjJFRVJlbmFtZURpYWxvZyNjcmVhdGVSZW5hbWVPcHRpb25zKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVSZW5hbWVPcHRpb25zKCkgewotCQlyZW5hbWVPcHRpb25zID0gcmVuYW1lQ29tcG9zaXRlLmNyZWF0ZVJlbmFtZU9wdGlvbnMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZU1vZHVsZUNvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MjNmY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFJlbmFtZU1vZHVsZUNvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIEoyRUVSZW5hbWVVSUNvbnN0YW50cywgTGlzdGVuZXIgewotCi0JLy8gcHJvdGVjdGVkIEJ1dHRvbiByZW5hbWVQcm9qZWN0c0NoZWNrQm94OwotCXByb3RlY3RlZCBSZW5hbWVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlIG1vZHVsZVJlZnNDb21wb3NpdGU7Ci0JcHJvdGVjdGVkIFRleHQgbmV3TmFtZVRleHQgPSBudWxsOwotCXByb3RlY3RlZCBUZXh0IG5ld0NvbnRleHRSb290VGV4dCA9IG51bGw7Ci0JcHJvdGVjdGVkIExhYmVsIG5ld0NvbnRleHRSb290TGFiZWwgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgb2xkTmFtZSA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBPS0J1dHRvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIExhYmVsIHN0YXR1c01lc3NhZ2VMYWJlbCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVuYW1lTW9kdWxlQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgUmVuYW1lTW9kdWxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJYWRkQ2hpbGRyZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJYWRkUmVuYW1lUHJvamVjdHNHcm91cCgpOwotCQlhZGRTZXBhcmF0b3IoKTsKLQkJYWRkUmVuYW1lTW9kdWxlUmVmc0NvbXBvc2l0ZSgpOwotCQkvL0FkZCBpbiBhIGxhYmVsIGZvciBzdGF0dXMgbWVzc2FnZXMgaWYgcmVxdWlyZWQKLQkJc3RhdHVzTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN0YXR1c01lc3NhZ2VMYWJlbC5zZXRGb250KHRoaXMuZ2V0Rm9udCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZW5hbWVQcm9qZWN0c0dyb3VwKCkgewotCQlHcmlkTGF5b3V0IGxheSA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheS5udW1Db2x1bW5zID0gMjsKLQkJc2V0TGF5b3V0KGxheSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQluZXdOYW1lVGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQluZXdOYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW5ld0NvbnRleHRSb290TGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULk5PTkUpOwotCQluZXdDb250ZXh0Um9vdExhYmVsLnNldFRleHQoUkVOQU1FX0NPTlRFWFRfUk9PVCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbmV3Q29udGV4dFJvb3RMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW5ld0NvbnRleHRSb290VGV4dCA9IG5ldyBUZXh0KHRoaXMsIFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCW5ld0NvbnRleHRSb290VGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8qCi0JCSAqIHJlbmFtZVByb2plY3RzQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5DSEVDSyk7Ci0JCSAqIHJlbmFtZVByb2plY3RzQ2hlY2tCb3guc2V0VGV4dChSRU5BTUVfUFJPSkVDVFMpOwotCQkgKiByZW5hbWVQcm9qZWN0c0NoZWNrQm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJICogcmVuYW1lUHJvamVjdHNDaGVja0JveC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsgZGF0YSA9IG5ldwotCQkgKiBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOyBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJICogcmVuYW1lUHJvamVjdHNDaGVja0JveC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkgKi8KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZW5hbWVNb2R1bGVSZWZzQ29tcG9zaXRlKCkgewotCQltb2R1bGVSZWZzQ29tcG9zaXRlID0gbmV3IFJlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUodGhpcywgU1dULk5PTkUsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXBhcmF0b3IoKSB7Ci0JCUxhYmVsIHNlcCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzZXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZW5hbWVQcm9qZWN0cygpIHsKLQkJLy8gIHJldHVybiByZW5hbWVQcm9qZWN0c0NoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCQkvLyBhbHdheXMgcmVuYW1lIHRoZSBwcm9qZWN0Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFJlbmFtZU1vZHVsZURlcGVuZGVuY2llcygpIHsKLQkJcmV0dXJuIG1vZHVsZVJlZnNDb21wb3NpdGUuc2hvdWxkUmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVuYW1lTW9kdWxlcygpIHsKLQkJcmV0dXJuIG1vZHVsZVJlZnNDb21wb3NpdGUuc2hvdWxkUmVuYW1lTW9kdWxlcygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGlzdGVuZXIjaGFuZGxlRXZlbnQoRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBuZXdOYW1lVGV4dCAmJiBPS0J1dHRvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IG5ld05hbWVUZXh0LmdldFRleHQoKTsKLQkJCWlmIChuZXdOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQlPS0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQcm9qZWN0IG5ld1Byb2plY3QgPSByb290LmdldFByb2plY3QobmV3TmFtZSk7Ci0JCQlpZiAobmV3UHJvamVjdC5leGlzdHMoKSkgewotCQkJCXN0YXR1c01lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKEpGYWNlQ29sb3JzLmdldEVycm9yVGV4dChzdGF0dXNNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpKSk7Ci0JCQkJU3RyaW5nW10gbmFtZXMgPSB7bmV3TmFtZX07Ci0JCQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldFRleHQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIlByb2plY3RfYWxyZWFkeV9leGlzdHMuIiksIG5hbWVzKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlPS0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RhdHVzTWVzc2FnZUxhYmVsLnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJCQlPS0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdOYW1lKCkKLQotCXsKLQkJcmV0dXJuIG5ld05hbWVUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCW9sZE5hbWUgPSBuZXdOYW1lOwotCQluZXdOYW1lVGV4dC5zZXRUZXh0KG5ld05hbWUpOwotCQluZXdOYW1lVGV4dC5zZWxlY3RBbGwoKTsKLQkJbmV3TmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXdDb250ZXh0Um9vdCgpIHsKLQkJcmV0dXJuIG5ld0NvbnRleHRSb290VGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3Q29udGV4dFJvb3QoU3RyaW5nIG5ld0NvbnRleHRSb290KSB7Ci0JCWlmIChuZXdDb250ZXh0Um9vdCAhPSBudWxsICYmIG5ld0NvbnRleHRSb290Lmxlbmd0aCgpID4gMSkgewotCQkJbmV3Q29udGV4dFJvb3RUZXh0LnNldFRleHQobmV3Q29udGV4dFJvb3QpOwotCQl9IGVsc2UgewotCQkJbmV3Q29udGV4dFJvb3RMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCW5ld0NvbnRleHRSb290VGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIE9LQnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSBPS0J1dHRvbgotCSAqICAgICAgICAgICAgVGhlIE9LQnV0dG9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9LQnV0dG9uKEJ1dHRvbiBvS0J1dHRvbikgewotCQlPS0J1dHRvbiA9IG9LQnV0dG9uOwotCQlPS0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVNb2R1bGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlYTgxNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SZW5hbWVNb2R1bGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVuYW1lLlJlbmFtZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBSZW5hbWVNb2R1bGVEaWFsb2cgZXh0ZW5kcyBKMkVFUmVuYW1lRGlhbG9nIGltcGxlbWVudHMgSjJFRVJlbmFtZVVJQ29uc3RhbnRzIHsKLQotCXByb3RlY3RlZCBSZW5hbWVNb2R1bGVDb21wb3NpdGUgcmVuYW1lQ29tcG9zaXRlOwotCXByb3RlY3RlZCBTdHJpbmcgY29udGV4dFJvb3QgPSBudWxsOwotCi0JcHVibGljIFJlbmFtZU1vZHVsZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIG5hbWUsIFN0cmluZyBvbGRDb250ZXh0Um9vdCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgUkVOQU1FX01PRFVMRV9PUFRJT05TLCBuYW1lKTsKLQkJY29udGV4dFJvb3QgPSBvbGRDb250ZXh0Um9vdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElKMkVFVUlDb250ZXh0SWRzLlJFTkFNRV9NT0RVTEVfRElBTE9HXzEpOyAvLyROT04tTkxTLTEkCi0JCXJlbmFtZUNvbXBvc2l0ZSA9IG5ldyBSZW5hbWVNb2R1bGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXJlbmFtZUNvbXBvc2l0ZS5zZXROZXdOYW1lKGN1cnJlbnROYW1lKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJcmVuYW1lQ29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJlbmFtZUNvbXBvc2l0ZS5zZXROZXdDb250ZXh0Um9vdChjb250ZXh0Um9vdCk7Ci0JCXJldHVybiByZW5hbWVDb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlUmVuYW1lT3B0aW9ucygpIHsKLQkJcmVuYW1lT3B0aW9ucyA9IG5ldyBSZW5hbWVPcHRpb25zKCk7Ci0JCXJlbmFtZU9wdGlvbnMuc2V0UmVuYW1lUHJvamVjdHMocmVuYW1lQ29tcG9zaXRlLnNob3VsZFJlbmFtZVByb2plY3RzKCkpOwotCQlyZW5hbWVPcHRpb25zLnNldFJlbmFtZU1vZHVsZXMocmVuYW1lQ29tcG9zaXRlLnNob3VsZFJlbmFtZU1vZHVsZXMoKSk7Ci0JCXJlbmFtZU9wdGlvbnMuc2V0UmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzKHJlbmFtZUNvbXBvc2l0ZS5zaG91bGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMoKSk7Ci0JCXJlbmFtZU9wdGlvbnMuc2V0TmV3TmFtZShyZW5hbWVDb21wb3NpdGUuZ2V0TmV3TmFtZSgpKTsKLQkJcmVuYW1lT3B0aW9ucy5zZXROZXdDb250ZXh0Um9vdChyZW5hbWVDb21wb3NpdGUuZ2V0TmV3Q29udGV4dFJvb3QoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBPS0J1dHRvbiA9IG51bGw7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQkJT0tCdXR0b24gPSBnZXRCdXR0b24oMCk7Ci0JCXJlbmFtZUNvbXBvc2l0ZS5zZXRPS0J1dHRvbihPS0J1dHRvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUmVuYW1lTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE0YWFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1JlbmFtZU1vZHVsZVJlZmVyZW5jZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9nczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgUmVuYW1lTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSBpbXBsZW1lbnRzIEoyRUVSZW5hbWVVSUNvbnN0YW50cywgTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiByZW5hbWVNb2R1bGVzQ2hlY2tib3g7Ci0JcHJvdGVjdGVkIEJ1dHRvbiByZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VBUlJlbmFtZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBSZW5hbWVNb2R1bGVSZWZlcmVuY2VzQ29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKi8KLQlwdWJsaWMgUmVuYW1lTW9kdWxlUmVmZXJlbmNlc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGJvb2xlYW4gaXNFQVJSZW5hbWUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXRoaXMuaXNFQVJSZW5hbWUgPSBpc0VBUlJlbmFtZTsKLQkJYWRkQ2hpbGRyZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJR3JpZExheW91dCBsYXkgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXkubnVtQ29sdW1ucyA9IDE7Ci0JCXNldExheW91dChsYXkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWFkZFJlbmFtZU1vZHVsZXNDaGVja2JveCgpOwotCQlhZGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94KCkgewotCQlyZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveCA9IG5ldyBCdXR0b24odGhpcywgU1dULkNIRUNLKTsKLQkJcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQlyZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXNDaGVja2JveC5zZXRUZXh0KFJFTkFNRV9NT0RVTEVfREVQRU5ERU5DSUVTKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFJlbmFtZU1vZHVsZXNDaGVja2JveCgpIHsKLQkJcmVuYW1lTW9kdWxlc0NoZWNrYm94ID0gbmV3IEJ1dHRvbih0aGlzLCBTV1QuQ0hFQ0spOwotCQlyZW5hbWVNb2R1bGVzQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQlTdHJpbmcgbGFiZWwgPSBpc0VBUlJlbmFtZSA/IFJFTkFNRV9NT0RVTEVTX09USEVSIDogUkVOQU1FX01PRFVMRVM7Ci0JCXJlbmFtZU1vZHVsZXNDaGVja2JveC5zZXRUZXh0KGxhYmVsKTsKLQkJcmVuYW1lTW9kdWxlc0NoZWNrYm94LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFJlbmFtZU1vZHVsZURlcGVuZGVuY2llcygpIHsKLQkJcmV0dXJuIHJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFJlbmFtZU1vZHVsZXMoKSB7Ci0JCXJldHVybiByZW5hbWVNb2R1bGVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnV0dG9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LnNldFNlbGVjdGlvbihlbmFibGVkKTsKLQkJcmVuYW1lTW9kdWxlc0NoZWNrYm94LnNldFNlbGVjdGlvbihlbmFibGVkKTsKLQkJcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJcmVuYW1lTW9kdWxlc0NoZWNrYm94LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IHJlbmFtZU1vZHVsZXNDaGVja2JveCAmJiByZW5hbWVNb2R1bGVzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgJiYgIXJlbmFtZU1vZHVsZURlcGVuZGVuY2llc0NoZWNrYm94LmdldFNlbGVjdGlvbigpKQotCQkJcmVuYW1lTW9kdWxlRGVwZW5kZW5jaWVzQ2hlY2tib3guc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1J1bnRpbWVTZWxlY3Rpb25EaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1J1bnRpbWVTZWxlY3Rpb25EaWFsb2cuamF2YQppbmRleCBhNDliOTIyLi4xNmYwNmYxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9SdW50aW1lU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvUnVudGltZVNlbGVjdGlvbkRpYWxvZy5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CkBAIC0zMiw2ICszMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLklIeXBlcmxpbmtMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5NZXNzYWdlczsKIAogCiAvKioKQEAgLTU3LDkgKzU5LDEwIEBACiAJCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSwgZGlhbG9nVGl0bGVJbWFnZSwgZGlhbG9nTWVzc2FnZSwKIAkJCQlkaWFsb2dJbWFnZVR5cGUsIGRpYWxvZ0J1dHRvbkxhYmVscywgZGVmYXVsdEluZGV4KTsKIAkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQkJdGhpcy5jb25maWd1cmVkTWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfUlVOVElNRV9DT05GSUdVUkVEIiksIG5ldyBTdHJpbmcgW117cHJvamVjdC5nZXROYW1lKCl9KTsKKwkJdGhpcy5jb25maWd1cmVkTWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJERVBMT1lfUlVOVElNRV9DT05GSUdVUkVEIiksIG5ldyBPYmplY3QgW117cHJvamVjdC5nZXROYW1lKCl9KTsgLy8kTk9OLU5MUy0xJAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAogCQkvL0NvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgMCk7CkBAIC03Niw3ICs3OSw3IEBACiAJCWxpbmsuc2V0VW5kZXJsaW5lZCh0cnVlKTsKIAkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IocGFyZW50LmdldERpc3BsYXkoKSxuZXcgUkdCKDAsMCwyNTUpICk7CiAJCWxpbmsuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCWxpbmsuc2V0VGV4dCgiQ29uZmlndXJlIFRhcmdldCBSdW50aW1lLi4uIik7CisJCWxpbmsuc2V0VGV4dChNZXNzYWdlcy5SdW50aW1lU2VsZWN0aW9uRGlhbG9nX0NvbmZpZ3VyZV9UYXJnZXRfUnVudGltZV8pOwogCQlsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBJSHlwZXJsaW5rTGlzdGVuZXIoKSB7CiAJCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX05PX0xJTksgPSAiUHJvcGVydHlBbmRQcmVmZXJlbmNlUGFnZS5ub2xpbmsiOyAvLyROT04tTkxTLTEkCiAKQEAgLTk4LDcgKzEwMSw3IEBACiAJCQl9CiAKIAkJCXByaXZhdGUgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSUQoKSB7Ci0JCQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW50ZXJuYWwuUnVudGltZXNQcm9wZXJ0eVBhZ2UiOworCQkJCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLlJ1bnRpbWVzUHJvcGVydHlQYWdlIjsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9KTsKIAkJCkBAIC0xMjAsNyArMTIzLDcgQEAKIAkJCUlSdW50aW1lIHJ1bnRpbWUgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRTZXJ2ZXJSdW50aW1lKHByb2plY3QpOwogCQkJcmV0dXJuIHJ1bnRpbWU7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9Ud29BcnJheVF1aWNrU29ydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9Ud29BcnJheVF1aWNrU29ydGVyLmphdmEKaW5kZXggNjJkNjkwNy4uODU1ZjVmYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHdvQXJyYXlRdWlja1NvcnRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kaWFsb2dzL1R3b0FycmF5UXVpY2tTb3J0ZXIuamF2YQpAQCAtODgsMzAgKzg4LDMyIEBACiAJfQogCiAJcHJpdmF0ZSB2b2lkIGludGVybmFsU29ydChPYmplY3RbXSBrZXlzLCBPYmplY3RbXSB2YWx1ZXMsIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKLQkJaW50IG9yaWdpbmFsX2xlZnQgPSBsZWZ0OwotCQlpbnQgb3JpZ2luYWxfcmlnaHQgPSByaWdodDsKKwkJaW50IGxvY2FsTGVmdCA9IGxlZnQ7CisJCWludCBsb2NhbFJpZ2h0ID0gcmlnaHQ7CisJCWludCBvcmlnaW5hbF9sZWZ0ID0gbG9jYWxMZWZ0OworCQlpbnQgb3JpZ2luYWxfcmlnaHQgPSBsb2NhbFJpZ2h0OwogCi0JCU9iamVjdCBtaWQgPSBrZXlzWyhsZWZ0ICsgcmlnaHQpIC8gMl07CisJCU9iamVjdCBtaWQgPSBrZXlzWyhsb2NhbExlZnQgKyBsb2NhbFJpZ2h0KSAvIDJdOwogCQlkbyB7Ci0JCQl3aGlsZSAoZkNvbXBhcmF0b3IuY29tcGFyZShrZXlzW2xlZnRdLCBtaWQpIDwgMCkKLQkJCQlsZWZ0Kys7CisJCQl3aGlsZSAoZkNvbXBhcmF0b3IuY29tcGFyZShrZXlzW2xvY2FsTGVmdF0sIG1pZCkgPCAwKQorCQkJCWxvY2FsTGVmdCsrOwogCi0JCQl3aGlsZSAoZkNvbXBhcmF0b3IuY29tcGFyZShtaWQsIGtleXNbcmlnaHRdKSA8IDApCi0JCQkJcmlnaHQtLTsKKwkJCXdoaWxlIChmQ29tcGFyYXRvci5jb21wYXJlKG1pZCwga2V5c1tsb2NhbFJpZ2h0XSkgPCAwKQorCQkJCWxvY2FsUmlnaHQtLTsKIAotCQkJaWYgKGxlZnQgPD0gcmlnaHQpIHsKLQkJCQlzd2FwKGtleXMsIGxlZnQsIHJpZ2h0KTsKLQkJCQlzd2FwKHZhbHVlcywgbGVmdCwgcmlnaHQpOwotCQkJCWxlZnQrKzsKLQkJCQlyaWdodC0tOworCQkJaWYgKGxvY2FsTGVmdCA8PSBsb2NhbFJpZ2h0KSB7CisJCQkJc3dhcChrZXlzLCBsb2NhbExlZnQsIGxvY2FsUmlnaHQpOworCQkJCXN3YXAodmFsdWVzLCBsb2NhbExlZnQsIGxvY2FsUmlnaHQpOworCQkJCWxvY2FsTGVmdCsrOworCQkJCWxvY2FsUmlnaHQtLTsKIAkJCX0KLQkJfSB3aGlsZSAobGVmdCA8PSByaWdodCk7CisJCX0gd2hpbGUgKGxvY2FsTGVmdCA8PSBsb2NhbFJpZ2h0KTsKIAotCQlpZiAob3JpZ2luYWxfbGVmdCA8IHJpZ2h0KQotCQkJaW50ZXJuYWxTb3J0KGtleXMsIHZhbHVlcywgb3JpZ2luYWxfbGVmdCwgcmlnaHQpOworCQlpZiAob3JpZ2luYWxfbGVmdCA8IGxvY2FsUmlnaHQpCisJCQlpbnRlcm5hbFNvcnQoa2V5cywgdmFsdWVzLCBvcmlnaW5hbF9sZWZ0LCBsb2NhbFJpZ2h0KTsKIAotCQlpZiAobGVmdCA8IG9yaWdpbmFsX3JpZ2h0KQotCQkJaW50ZXJuYWxTb3J0KGtleXMsIHZhbHVlcywgbGVmdCwgb3JpZ2luYWxfcmlnaHQpOworCQlpZiAobG9jYWxMZWZ0IDwgb3JpZ2luYWxfcmlnaHQpCisJCQlpbnRlcm5hbFNvcnQoa2V5cywgdmFsdWVzLCBsb2NhbExlZnQsIG9yaWdpbmFsX3JpZ2h0KTsKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvVHlwZWRGaWxlVmlld2VyRmlsdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9UeXBlZEZpbGVWaWV3ZXJGaWx0ZXIuamF2YQppbmRleCA3YjQyNTM0Li4yNjQ0OWU5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9UeXBlZEZpbGVWaWV3ZXJGaWx0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9UeXBlZEZpbGVWaWV3ZXJGaWx0ZXIuamF2YQpAQCAtNjYsNiArNjYsNyBAQAogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewogCQlyZXR1cm4gaXNWYWxpZChlbGVtZW50KTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGlhbG9ncy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTI4YTliCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RpYWxvZ3MvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDIgQEAKK0oyRUVEZXBsb3lBY3Rpb25fRGVwbG95Xz1EZXBsb3kKK1J1bnRpbWVTZWxlY3Rpb25EaWFsb2dfQ29uZmlndXJlX1RhcmdldF9SdW50aW1lXz1Db25maWd1cmUgVGFyZ2V0IFJ1bnRpbWUuLi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9BcmNoaXZlRUFSVUlSZXNvdXJjZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9BcmNoaXZlRUFSVUlSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4MmVlMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvQXJjaGl2ZUVBUlVJUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhci5hY3Rpb25zOwotCi0KLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUVBUlVJUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZnUmVzb3VyY2VCdW5kbGU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXNvdXJjZSBidW5kbGUgdXNlZCBieSBhbGwgY2xhc3NlcyBpbiB0aGlzIFByb2plY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiYXJjaGl2ZWVhcnVpIik7Ly8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJLy8gZG9lcyBub3RoaW5nIC0gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBhbmQKLQkJCS8vIGdldFN0cmluZyhTdHJpbmcsIFN0cmluZykgd2lsbCByZXR1cm4gdGhlIGtleQotCQkJLy8gaXQgd2FzIGNhbGxlZCB3aXRoCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGZnUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJZmdSZXNvdXJjZUJ1bmRsZSA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0JCX0KLQotCQlpZiAoZmdSZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBmZ1Jlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gIiEiICsga2V5ICsgIiEiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIhIiArIGtleSArICIhIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL0VBUkltcG9ydExpc3RDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjMjQ3MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyLmFjdGlvbnM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5UYWJsZU9iamVjdHM7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDUvNy8yMDAxIDExOjM5OjExIEFNKQotICogCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JLyoqCi0JICogRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBFQVJJbXBvcnRMaXN0Q29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHZpZXdlciB3aGVuIGl0IGlzIGRpc3Bvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vZGlzcG9zZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlciB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEgbGlzdCwgZXRjLiBUaGUgcmVzdWx0IGlzIG5vdAotCSAqIG1vZGlmaWVkIGJ5IHRoZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIGlucHV0RWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGlucHV0IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlT2JqZWN0cykKLQkJCXJldHVybiAoKFRhYmxlT2JqZWN0cykgaW5wdXRFbGVtZW50KS5nZXRUYWJsZU9iamVjdHMoKS50b0FycmF5KCk7Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOyAvL3Nob3VsZCB0aHJvdyBleGNlcHRpb24gaW5zdGVhZAotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgY29udGVudCBwcm92aWRlciB0aGF0IHRoZSBnaXZlbiB2aWV3ZXIncyBpbnB1dCBoYXMgYmVlbiBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudAotCSAqIGVsZW1lbnQuCi0JICogPHA+Ci0JICogQSB0eXBpY2FsIHVzZSBmb3IgdGhpcyBtZXRob2QgaXMgcmVnaXN0ZXJpbmcgdGhlIGNvbnRlbnQgcHJvdmlkZXIgYXMgYSBsaXN0ZW5lciB0byBjaGFuZ2VzIG9uCi0JICogdGhlIG5ldyBpbnB1dCAodXNpbmcgbW9kZWwtc3BlY2lmaWMgbWVhbnMpLCBhbmQgZGVyZWdpc3RlcmluZyB0aGUgdmlld2VyIGZyb20gdGhlIG9sZCBpbnB1dC4KLQkgKiBJbiByZXNwb25zZSB0byB0aGVzZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucywgdGhlIGNvbnRlbnQgcHJvdmlkZXIgcHJvcGFnYXRlcyB0aGUgY2hhbmdlcyB0byB0aGUKLQkgKiB2aWV3ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gb2xkSW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBvbGQgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlciBkaWQgbm90IHByZXZpb3VzbHkKLQkgKiAgICAgICAgICAgIGhhdmUgYW4gaW5wdXQKLQkgKiBAcGFyYW0gbmV3SW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgaW5wdXQgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHZpZXdlciBkb2VzIG5vdCBoYXZlIGFuIGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL0V4cG9ydEVBUkFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL0V4cG9ydEVBUkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA3OGFlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9FeHBvcnRFQVJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkJhc2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRFQVJBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkuZ2V0UmVzb3VyY2VTdHJpbmcoIiVlYXIuZXhwb3J0LmFjdGlvbi5kZXNjcmlwdGlvbl91aV8iKTsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAiZXhwb3J0X2Vhcl93aXoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRXhwb3J0RUFSQWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRUZXh0KExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKSB7Ci0JCUVBUkNvbXBvbmVudEV4cG9ydFdpemFyZCB3aXphcmQgPSBuZXcgRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkKCk7Ci0JCUoyRUVVSVBsdWdpbiBwbHVnaW4gPSBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCi0JCXdpemFyZC5pbml0KHBsdWdpbi5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uKTsKLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9JbXBvcnRFQVJBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXIvYWN0aW9ucy9JbXBvcnRFQVJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1YzNlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvSW1wb3J0RUFSQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI3LCAyMDAzCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXIuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydEVBUkFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMID0gQXJjaGl2ZUVBUlVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW1wb3J0X0VBUiIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAiaW1wb3J0X2Vhcl93aXoiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSW1wb3J0RUFSQWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRUZXh0KExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUnVuKFNoZWxsIHNoZWxsKSB7Ci0KLQkJRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkIHdpemFyZCA9IG5ldyBFQVJDb21wb25lbnRJbXBvcnRXaXphcmQoKTsKLQotCQlKMkVFVUlQbHVnaW4gcGx1Z2luID0gSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKTsKLQotCQl3aXphcmQuaW5pdChwbHVnaW4uZ2V0V29ya2JlbmNoKCksIFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFkpOwotCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvTW9kdWxlc1Byb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyL2FjdGlvbnMvTW9kdWxlc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTRlN2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2Vhci9hY3Rpb25zL01vZHVsZXNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhci5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkNsYXNzUGF0aFNlbGVjdGlvbjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOC8yMi8yMDAxIDI6Mjc6MjQgUE0pCi0gKiAKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZXNQcm92aWRlciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCS8qKgotCSAqIE1vZHVsZXNQcm92aWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBNb2R1bGVzUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoaXMgbGFiZWwgcHJvdmlkZXIuIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkKLQkgKiByZWdpc3RlcmVkLgotCSAqIDxwPgotCSAqIExhYmVsIHByb3ZpZGVyIGxpc3RlbmVycyBhcmUgaW5mb3JtZWQgYWJvdXQgc3RhdGUgY2hhbmdlcyB0aGF0IGFmZmVjdCB0aGUgcmVuZGVyaW5nIG9mIHRoZQotCSAqIHZpZXdlciB0aGF0IHVzZXMgdGhpcyBsYWJlbCBwcm92aWRlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxhYmVsIHByb3ZpZGVyIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgY29udGVudCBwcm92aWRlci4gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHZpZXdlciB3aGVuIGl0IGlzIGRpc3Bvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vZGlzcG9zZQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVsZW1lbnRzIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXdlciB3aGVuIGl0cyBpbnB1dCBpcyBzZXQgdG8gdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEgbGlzdCwgZXRjLiBUaGUgcmVzdWx0IGlzIG5vdAotCSAqIG1vZGlmaWVkIGJ5IHRoZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIGlucHV0RWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGlucHV0IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBlbGVtZW50cyB0byBkaXNwbGF5IGluIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLk9iamVjdFtdIGdldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiAoKGphdmEudXRpbC5MaXN0KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LiBUaGUgaW1hZ2UgaXMgb3duZWQgYnkgdGhlIGxhYmVsCi0JICogcHJvdmlkZXIgYW5kIG11c3Qgbm90IGJlIGRpc3Bvc2VkIGRpcmVjdGx5LiBJbnN0ZWFkLCBkaXNwb3NlIHRoZSBsYWJlbCBwcm92aWRlciB3aGVuIG5vCi0JICogbG9uZ2VyIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIHByb3ZpZGUgdGhlIGxhYmVsIGltYWdlCi0JICogQHJldHVybiB0aGUgaW1hZ2UgdXNlZCB0byBsYWJlbCB0aGUgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlc2UgaXMgbm8gaW1hZ2UgZm9yCi0JICogICAgICAgICB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IGZvciB3aGljaCB0byBwcm92aWRlIHRoZSBsYWJlbCB0ZXh0Ci0JICogQHJldHVybiB0aGUgdGV4dCBzdHJpbmcgdXNlZCB0byBsYWJlbCB0aGUgZWxlbWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlc2UgaXMgbm8gdGV4dAotCSAqICAgICAgICAgbGFiZWwgZm9yIHRoZSBnaXZlbiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuICgoQ2xhc3NQYXRoU2VsZWN0aW9uKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBjb250ZW50IHByb3ZpZGVyIHRoYXQgdGhlIGdpdmVuIHZpZXdlcidzIGlucHV0IGhhcyBiZWVuIHN3aXRjaGVkIHRvIGEgZGlmZmVyZW50Ci0JICogZWxlbWVudC4KLQkgKiA8cD4KLQkgKiBBIHR5cGljYWwgdXNlIGZvciB0aGlzIG1ldGhvZCBpcyByZWdpc3RlcmluZyB0aGUgY29udGVudCBwcm92aWRlciBhcyBhIGxpc3RlbmVyIHRvIGNoYW5nZXMgb24KLQkgKiB0aGUgbmV3IGlucHV0ICh1c2luZyBtb2RlbC1zcGVjaWZpYyBtZWFucyksIGFuZCBkZXJlZ2lzdGVyaW5nIHRoZSB2aWV3ZXIgZnJvbSB0aGUgb2xkIGlucHV0LgotCSAqIEluIHJlc3BvbnNlIHRvIHRoZXNlIGNoYW5nZSBub3RpZmljYXRpb25zLCB0aGUgY29udGVudCBwcm92aWRlciBwcm9wYWdhdGVzIHRoZSBjaGFuZ2VzIHRvIHRoZQotCSAqIHZpZXdlci4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBvbGRJbnB1dAotCSAqICAgICAgICAgICAgdGhlIG9sZCBpbnB1dCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmlld2VyIGRpZCBub3QgcHJldmlvdXNseQotCSAqICAgICAgICAgICAgaGF2ZSBhbiBpbnB1dAotCSAqIEBwYXJhbSBuZXdJbnB1dAotCSAqICAgICAgICAgICAgdGhlIG5ldyBpbnB1dCBlbGVtZW50LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdmlld2VyIGRvZXMgbm90IGhhdmUgYW4gaW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxhYmVsIHdvdWxkIGJlIGFmZmVjdGVkIGJ5IGEgY2hhbmdlIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4KLQkgKiBlbGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIG9wdGltaXplIGEgbm9uLXN0cnVjdHVyYWwgdmlld2VyIHVwZGF0ZS4gSWYgdGhlIHByb3BlcnR5Ci0JICogbWVudGlvbmVkIGluIHRoZSB1cGRhdGUgZG9lcyBub3QgYWZmZWN0IHRoZSBsYWJlbCwgdGhlbiB0aGUgdmlld2VyIG5lZWQgbm90IHVwZGF0ZSB0aGUgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdAotCSAqICAgICAgICAgd291bGQgYmUgdW5hZmZlY3RlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdG8gdGhpcyBsYWJlbCBwcm92aWRlci4gSGFzIG5vIGFmZmVjdCBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90Ci0JICogcmVnaXN0ZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGFiZWwgcHJvdmlkZXIgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9BYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggMWVjY2Y0NS4uMzY3NjMxNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9BYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0Fic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5qYXZhCkBAIC03OSw2ICs3OSw3IEBACiAJLyoKIAkgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKIAkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIuRUpCTWV0aG9kSXRlbSkKIAkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50cygoQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyLkVKQk1ldGhvZEl0ZW0pIHBhcmVudEVsZW1lbnQpOwpAQCAtMTMxLDYgKzEzMiw3IEBACiAJLyoKIAkgKiBAc2VlIElUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewogCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlci5FSkJNZXRob2RJdGVtKQogCQkJcmV0dXJuIHRydWU7CkBAIC0yMzYsNiArMjM4LDcgQEAKIAkgKiBAc2VlIElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIjbm90aWZ5Q2hhbmdlZChuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClPYmplY3QsCiAJICogICAgICBpbnQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgaW50KSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmllcikgewogCQlpZiAobm90aWZpZXIuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFU09MVkUpCiAJCQlyZXR1cm47CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0JlYW5DbGFzc1Byb3ZpZGVySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0JlYW5DbGFzc1Byb3ZpZGVySGVscGVyLmphdmEKaW5kZXggMzhhNDJlYi4uNGFkY2U3ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9CZWFuQ2xhc3NQcm92aWRlckhlbHBlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvQmVhbkNsYXNzUHJvdmlkZXJIZWxwZXIuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogCQlzdXBlcihhbkVKQik7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEltYWdlIGdldEltYWdlKCkgewogCQlpZiAoaW1hZ2UgPT0gbnVsbCkKIAkJCWltYWdlID0gY3JlYXRlSW1hZ2UoKTsKQEAgLTQzLDE0ICs0NCwxNyBAQAogCSAqIAogCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7CiAJCXJldHVybiBnZXRFamIoKS5nZXRFamJDbGFzcygpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3ZlcmxheUtleSgpIHsKIAkJcmV0dXJuICJlamJfbW9kdWxlX292ciI7Ly8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKSB7CiAJCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRUpCX0NsYXNzX1VJXyIsIG5ldyBPYmplY3RbXXtjbGFzc05hbWV9KTsgLy8kTk9OLU5MUy0xJCA9ICJFSkIgQ2xhc3MiCiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9FeGNsdWRlTGlzdENvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9FeGNsdWRlTGlzdENvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IDEyYzkxY2EuLmY0ZDVlNGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvRXhjbHVkZUxpc3RDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0V4Y2x1ZGVMaXN0Q29udGVudFByb3ZpZGVyLmphdmEKQEAgLTYwLDE4ICs2MCwxOCBAQAogCS8qCiAJICogQHNlZSBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIjZ2V0TWV0aG9kRWxlbWVudHMoRU9iamVjdCwgRW50ZXJwcmlzZUJlYW4pCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIExpc3QgZ2V0TWV0aG9kRWxlbWVudHMoRU9iamVjdCBhUmVmT2JqZWN0LCBFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlpZiAoIShhUmVmT2JqZWN0IGluc3RhbmNlb2YgRXhjbHVkZUxpc3QpKQorCQlpZiAoYVJlZk9iamVjdCA9PSBudWxsIHx8ICEoYVJlZk9iamVjdCBpbnN0YW5jZW9mIEV4Y2x1ZGVMaXN0KSkKIAkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwogCQlFeGNsdWRlTGlzdCBwYXJlbnRMaXN0ID0gKEV4Y2x1ZGVMaXN0KSBhUmVmT2JqZWN0OwotCQlpZiAocGFyZW50TGlzdCA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CiAJCXJldHVybiBwYXJlbnRMaXN0LmdldE1ldGhvZEVsZW1lbnRzKGFuRUpCKTsKIAl9CiAKIAkvKgogCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CiAJCXN1cGVyLmdldEVsZW1lbnRzKGlucHV0RWxlbWVudCk7CiAJCUV4Y2x1ZGVMaXN0IGxpc3QgPSBudWxsOwpAQCAtOTMsNiArOTMsNyBAQAogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLnVpLnByb3ZpZGVycy5BYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewogCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEV4Y2x1ZGVMaXN0KQogCQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFucygoRXhjbHVkZUxpc3QpIHBhcmVudEVsZW1lbnQpOwpAQCAtMTAyLDEyICsxMDMsMTQgQEAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi51aS5wcm92aWRlcnMuQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewogCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4Y2x1ZGVMaXN0KQogCQkJcmV0dXJuICEoKEV4Y2x1ZGVMaXN0KSBlbGVtZW50KS5nZXRNZXRob2RFbGVtZW50cygpLmlzRW1wdHkoKTsKIAkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKGVsZW1lbnQpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWVyKSB7CiAJCWlmICgobm90aWZpZXIuZ2V0RmVhdHVyZSgpID09IEVYQ0xVREVfTUVfU0YgJiYgbm90aWZpZXIuZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIEV4Y2x1ZGVMaXN0KSB8fCBub3RpZmllci5nZXRGZWF0dXJlKCkgPT0gRUNPUkVfQkVBTl9OQU1FKSB7CiAJCQlpZiAobm90aWZpZXIuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFU09MVkUpCkBAIC0xMjYsNiArMTI5LDcgQEAKIAkvKgogCSAqIEBzZWUgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkgewogCQlyZXR1cm4gRVhDTFVERV9NRV9TRjsKIAl9CkBAIC0xMzMsNiArMTM3LDcgQEAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi51aS5wcm92aWRlcnMuQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzQ29udGFpbmVyUmVmZXJlbmNlKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1ldGhvZEVsZW1lbnRzQ29udGFpbmVyUmVmZXJlbmNlKCkgewogCQlyZXR1cm4gQURfRUxfU0Y7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkRUpCSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRFSkJJdGVtUHJvdmlkZXIuamF2YQppbmRleCA2NjQ1YzZmLi42NTI5NTQ1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRFSkJJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRFSkJJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjksNiArMjksNyBAQAogCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGV4dCwgaW1hZ2UsIHBhcmVudCwgY2hpbGRyZW4pOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSUZpbGUgZ2V0QXNzb2NpYXRlZEZpbGUoKSB7CiAKIAkJdHJ5IHsKQEAgLTQyLDUgKzQzLDYgQEAKIAkJcmV0dXJuIG51bGw7CQkKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCk7CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDVlZmU1Y2IuLjY3NTc0NzAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlci5qYXZhCkBAIC02OCw2ICs2OCw3IEBACiAJCXRoaXMuc2hvd0Fzc2VtYmx5RGVzY3JpcHRvciA9IHNob3dBc3NlbWJseURlc2NyaXB0b3I7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlMaXN0IHJlc3VsdCA9IGluaXRDaGlsZHJlbihvYmplY3QpOwogCQlpZiAoc2hvd0Fzc2VtYmx5RGVzY3JpcHRvcikgewpAQCAtMTc1LDYgKzE3Niw3IEBACiAJCXJldHVybiAoR3JvdXBlZE1lc3NhZ2VJdGVtUHJvdmlkZXIpIG1lc3NhZ2VUYWJsZS5nZXQob2JqZWN0KTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKFN0cmluZyB0eXBlKSB7CiAJCWlmICh0eXBlLmVxdWFscyhTRVNTSU9OKSkKIAkJCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZXNzaW9uQmVhbl9vYmoiKTsgLy8kTk9OLU5MUy0xJApAQCAtMTk4LDYgKzIwMCw3IEBACiAJCX0KIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJaWYgKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZJTkdfQURBUFRFUiAmJiBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSA9PSB0aGlzICYmICFpc0Rpc3Bvc2luZykgewogCQkJcmVtb3ZlVGFyZ2V0KG5vdGlmaWNhdGlvbik7CkBAIC0zNDYsNiArMzQ5LDcgQEAKIAkJbWVzc2FnZVRhYmxlLnJlbW92ZShlamJKYXIpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQpAQCAtMzY1LDYgKzM2OSw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CiAJCXRyeSB7CiAJCQlpc0Rpc3Bvc2luZyA9IHRydWU7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRFbnRpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVudGl0eUl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDBkYmI0MGIuLjgwZWY2NTUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVudGl0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZEVudGl0eUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiAJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSwgcGFyZW50LCBjaGlsZHJlbik7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIEVOVElUWTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRNZXNzYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRNZXNzYWdlSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggNmM5NzdiMi4uY2E0OTczMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkTWVzc2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZE1lc3NhZ2VJdGVtUHJvdmlkZXIuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGV4dCwgaW1hZ2UsIHBhcmVudCwgY2hpbGRyZW4pOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBNRVNTQUdFX0JFQU5TOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZFNlc3Npb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvR3JvdXBlZFNlc3Npb25JdGVtUHJvdmlkZXIuamF2YQppbmRleCAxNWMyODE3Li41ZmM3M2E0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0dyb3VwZWRTZXNzaW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Hcm91cGVkU2Vzc2lvbkl0ZW1Qcm92aWRlci5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiAJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0ZXh0LCBpbWFnZSwgcGFyZW50LCBjaGlsZHJlbik7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFNFU1NJT05fQkVBTlM7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Ib21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKaW5kZXggNmMzN2FiZS4uMjM0OGVmYSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Ib21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0hvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiAJCXN1cGVyKGFuRUpCKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7CiAJCWlmIChpbWFnZSA9PSBudWxsKQogCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZSgpOwpAQCAtNDYsMTQgKzQ3LDE3IEBACiAJICogCiAJICogQHJldHVybiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKIAkJcmV0dXJuIGdldEVqYigpLmdldEhvbWVJbnRlcmZhY2UoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJsYXlLZXkoKSB7CiAJCXJldHVybiAiaG9tZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmoiOy8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFR5cGVTdHJpbmcoU3RyaW5nIGNsYXNzTmFtZSkgewogCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkhvbWVfSW50ZXJmYWNlX1VJXyIsIG5ldyBPYmplY3RbXXtjbGFzc05hbWV9KTsgLy8kTk9OLU5MUy0xJCA9ICJIb21lIEludGVyZmFjZSIKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVDb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVDb250YWluZXJNYW5hZ2VkRW50aXR5SXRlbVByb3ZpZGVyLmphdmEKaW5kZXggZWM1ZjEzYy4uMmEwOWY2NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFQ29udGFpbmVyTWFuYWdlZEVudGl0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXIuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKIAkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUVqYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVFamJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmluZGV4IGY4ODhkODYuLmRkZDE3YmYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUVqYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFRWpiSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCiAJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5fS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5QWRhcHRlcigpIHsKIAkJaWYgKGNvbnRhaW5lck1hbmFnZWRFbnRpdHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJY29udGFpbmVyTWFuYWdlZEVudGl0eUl0ZW1Qcm92aWRlciA9IG5ldyBKMkVFQ29udGFpbmVyTWFuYWdlZEVudGl0eUl0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTQxLDYgKzQyLDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLkVKQkphcn0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCSmFyQWRhcHRlcigpIHsKIAkJaWYgKGVKQkphckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQllSkJKYXJJdGVtUHJvdmlkZXIgPSBuZXcgR3JvdXBlZEVKQkphckl0ZW1Qcm92aWRlcih0aGlzLCB0cnVlKTsKQEAgLTUyLDYgKzU0LDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLkVudGl0eX0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlRW50aXR5QWRhcHRlcigpIHsKIAkJaWYgKGVudGl0eUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQllbnRpdHlJdGVtUHJvdmlkZXIgPSBuZXcgSjJFRUVudGl0eUl0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTYzLDYgKzY2LDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLlNlc3Npb259LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlc3Npb25BZGFwdGVyKCkgewogCQlpZiAoc2Vzc2lvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQlzZXNzaW9uSXRlbVByb3ZpZGVyID0gbmV3IEoyRUVTZXNzaW9uSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtNzEsNiArNzUsNyBAQAogCQlyZXR1cm4gc2Vzc2lvbkl0ZW1Qcm92aWRlcjsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXNzYWdlRHJpdmVuQWRhcHRlcigpIHsKIAkJaWYgKG1lc3NhZ2VEcml2ZW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJbWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlciA9IG5ldyBKMkVFTWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlcih0aGlzKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRUVudGl0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFRW50aXR5SXRlbVByb3ZpZGVyLmphdmEKaW5kZXggMDM3ZDRkNi4uZTQxZWVlNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFRW50aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFRW50aXR5SXRlbVByb3ZpZGVyLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIAkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW5TdXBlcihvYmplY3QpKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRU1lc3NhZ2VEcml2ZW5JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRU1lc3NhZ2VEcml2ZW5JdGVtUHJvdmlkZXIuamF2YQppbmRleCBhMDE1NTg2Li5mNTYyNDhhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVNZXNzYWdlRHJpdmVuSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9KMkVFTWVzc2FnZURyaXZlbkl0ZW1Qcm92aWRlci5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiAJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwogCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuU3VwZXIob2JqZWN0KSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVTZXNzaW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVTZXNzaW9uSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggZDY0ZDI3NS4uZWMzNzIwNjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvSjJFRVNlc3Npb25JdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0oyRUVTZXNzaW9uSXRlbVByb3ZpZGVyLmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKIAkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW5TdXBlcihvYmplY3QpKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTG9jYWxIb21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTG9jYWxIb21lSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YQppbmRleCBjZmVhNTFhLi4yMjg5MWFkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0xvY2FsSG9tZUludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9Mb2NhbEhvbWVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCkBAIC0zMSwxMCArMzEsMTIgQEAKIAkvKioKIAkgKiBAc2VlIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciNnZXRKYXZhQ2xhc3MoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBKYXZhQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgewogCQlyZXR1cm4gZ2V0RWpiKCkuZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEltYWdlIGdldEltYWdlKCkgewogCQlpZiAoaW1hZ2UgPT0gbnVsbCkKIAkJCWltYWdlID0gY3JlYXRlSW1hZ2UoKTsKQEAgLTQ0LDYgKzQ2LDcgQEAKIAkvKioKIAkgKiBAc2VlIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciNnZXRPdmVybGF5S2V5KCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJsYXlLZXkoKSB7CiAJCXJldHVybiAibG9jYWxfaG9tZV9pbnRlcmZhY2Vfb3ZlcmxheV9vYmoiOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtNTEsNiArNTQsNyBAQAogCS8qKgogCSAqIEBzZWUgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyI2dldFR5cGVTdHJpbmcoU3RyaW5nKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKSB7CiAJCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTG9jYWxfSG9tZV9JbnRlcmZhY2VfVUlfIiwgbmV3IE9iamVjdFtde2NsYXNzTmFtZX0pOyAvLyROT04tTkxTLTEkID0gIkxvY2FsIEhvbWUgSW50ZXJmYWNlIjsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL0xvY2FsSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTG9jYWxJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCmluZGV4IDlhOWFmMmQuLjI0OWFhNTkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTG9jYWxJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTG9jYWxJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiAJCXN1cGVyKGFuRUpCKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7CiAJCWlmIChpbWFnZSA9PSBudWxsKQogCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZSgpOwpAQCAtMzcsNiArMzgsNyBAQAogCS8qKgogCSAqIEBzZWUgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyI2dldEphdmFDbGFzcygpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7CiAJCXJldHVybiBnZXRFamIoKS5nZXRMb2NhbEludGVyZmFjZSgpOwogCX0KQEAgLTQ0LDYgKzQ2LDcgQEAKIAkvKioKIAkgKiBAc2VlIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlciNnZXRPdmVybGF5S2V5KCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJsYXlLZXkoKSB7CiAJCXJldHVybiAibG9jYWxfaW50ZXJmYWNlX292ZXJsYXlfb2JqIjsvLyROT04tTkxTLTEkCiAJfQpAQCAtNTEsNiArNTQsNyBAQAogCS8qKgogCSAqIEBzZWUgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyI2dldFR5cGVTdHJpbmcoU3RyaW5nKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKSB7CiAJCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiTG9jYWxfSW50ZXJmYWNlX1VJXyIsIG5ldyBPYmplY3RbXXtjbGFzc05hbWV9KTsgLy8kTk9OLU5MUy0xJCA9ICJMb2NhbCBJbnRlcmZhY2UiCiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9NZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9NZXRob2RQZXJtaXNzaW9uc0NvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IGUyMTA5ZTkuLjJiZWRhNzcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTWV0aG9kUGVybWlzc2lvbnNDb250ZW50UHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL01ldGhvZFBlcm1pc3Npb25zQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTU0LDYgKzU0LDcgQEAKIAkvKgogCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewogCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb24pCiAJCQlyZXR1cm4gZ2V0RW50ZXJwcmlzZUJlYW5zKChNZXRob2RQZXJtaXNzaW9uKSBwYXJlbnRFbGVtZW50KTsKQEAgLTY4LDE4ICs2OSwxOCBAQAogCS8qCiAJICogQHNlZSBBYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIjZ2V0TWV0aG9kRWxlbWVudHMoRU9iamVjdCwgRW50ZXJwcmlzZUJlYW4pCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIExpc3QgZ2V0TWV0aG9kRWxlbWVudHMoRU9iamVjdCBhUmVmT2JqZWN0LCBFbnRlcnByaXNlQmVhbiBhbkVKQikgewotCQlpZiAoIShhUmVmT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbikpCisJCWlmIChhUmVmT2JqZWN0ID09IG51bGwgfHwgIShhUmVmT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbikpCiAJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKIAkJTWV0aG9kUGVybWlzc2lvbiBwYXJlbnRNUCA9IChNZXRob2RQZXJtaXNzaW9uKSBhUmVmT2JqZWN0OwotCQlpZiAocGFyZW50TVAgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwogCQlyZXR1cm4gcGFyZW50TVAuZ2V0TWV0aG9kRWxlbWVudHMoYW5FSkIpOwogCX0KIAogCS8qCiAJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKIAkJc3VwZXIuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KTsKIAkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEVKQkphcikgewpAQCAtOTUsNiArOTYsNyBAQAogCS8qCiAJICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKIAkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQZXJtaXNzaW9uKQogCQkJcmV0dXJuICEoKE1ldGhvZFBlcm1pc3Npb24pIGVsZW1lbnQpLmdldE1ldGhvZEVsZW1lbnRzKCkuaXNFbXB0eSgpOwpAQCAtMTA0LDYgKzEwNiw3IEBACiAJLyoKIAkgKiBAc2VlIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNZXRob2RFbGVtZW50c1JlZmVyZW5jZSgpIHsKIAkJcmV0dXJuIFBFUk1JU1NJT05fTUVTX1NGOwogCX0KQEAgLTExMSw2ICsxMTQsNyBAQAogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLnVpLnByb3ZpZGVycy5BYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIjZ2V0TWV0aG9kRWxlbWVudHNDb250YWluZXJSZWZlcmVuY2UoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TWV0aG9kRWxlbWVudHNDb250YWluZXJSZWZlcmVuY2UoKSB7CiAJCXJldHVybiBBRF9NUF9TRjsKIAl9CkBAIC0xMTgsNiArMTIyLDcgQEAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIjbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24pCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCWlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IFBFUk1JU1NJT05fTUVTX1NGIHx8IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gQURfTVBfU0YpCiAJCQlyZWZyZXNoVHJlZVZpZXdlcigpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9NZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9NZXRob2RUcmFuc2FjdGlvbkNvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IGZlMGUxYjcuLjBlZjJmMjYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvTWV0aG9kVHJhbnNhY3Rpb25Db250ZW50UHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL01ldGhvZFRyYW5zYWN0aW9uQ29udGVudFByb3ZpZGVyLmphdmEKQEAgLTUxLDYgKzUxLDcgQEAKIAkvKgogCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewogCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFRyYW5zYWN0aW9uKQogCQkJcmV0dXJuIGdldEVudGVycHJpc2VCZWFucygoTWV0aG9kVHJhbnNhY3Rpb24pIHBhcmVudEVsZW1lbnQpOwpAQCAtNjUsMTggKzY2LDE4IEBACiAJLyoKIAkgKiBAc2VlIEFic3RyYWN0TWV0aG9kc0NvbnRlbnRQcm92aWRlciNnZXRNZXRob2RFbGVtZW50cyhFT2JqZWN0LCBFbnRlcnByaXNlQmVhbikKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgTGlzdCBnZXRNZXRob2RFbGVtZW50cyhFT2JqZWN0IGFSZWZPYmplY3QsIEVudGVycHJpc2VCZWFuIGFuRUpCKSB7Ci0JCWlmICghKGFSZWZPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RUcmFuc2FjdGlvbikpCisJCWlmIChhUmVmT2JqZWN0ID09IG51bGwgfHwgIShhUmVmT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kVHJhbnNhY3Rpb24pKQogCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CiAJCU1ldGhvZFRyYW5zYWN0aW9uIHBhcmVudE1UID0gKE1ldGhvZFRyYW5zYWN0aW9uKSBhUmVmT2JqZWN0OwotCQlpZiAocGFyZW50TVQgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwogCQlyZXR1cm4gcGFyZW50TVQuZ2V0TWV0aG9kRWxlbWVudHMoYW5FSkIpOwogCX0KIAogCS8qCiAJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKIAkJc3VwZXIuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KTsKIAkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEVKQkphcikgewpAQCAtOTIsNiArOTMsNyBAQAogCS8qCiAJICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKIAkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RUcmFuc2FjdGlvbikKIAkJCXJldHVybiAhKChNZXRob2RUcmFuc2FjdGlvbikgZWxlbWVudCkuZ2V0TWV0aG9kRWxlbWVudHMoKS5pc0VtcHR5KCk7CkBAIC0xMDEsNiArMTAzLDcgQEAKIAkvKgogCSAqIEBzZWUgQWJzdHJhY3RNZXRob2RzQ29udGVudFByb3ZpZGVyI2dldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1ldGhvZEVsZW1lbnRzUmVmZXJlbmNlKCkgewogCQlyZXR1cm4gVFJBTlNBQ1RJT05fTUVTX1NGOwogCX0KQEAgLTEwOCw2ICsxMTEsNyBAQAogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLnVpLnByb3ZpZGVycy5BYnN0cmFjdE1ldGhvZHNDb250ZW50UHJvdmlkZXIjZ2V0TWV0aG9kRWxlbWVudHNDb250YWluZXJSZWZlcmVuY2UoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TWV0aG9kRWxlbWVudHNDb250YWluZXJSZWZlcmVuY2UoKSB7CiAJCXJldHVybiBBRF9NVF9TRjsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL1ByaW1hcnlLZXlDbGFzc1Byb3ZpZGVySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL1ByaW1hcnlLZXlDbGFzc1Byb3ZpZGVySGVscGVyLmphdmEKaW5kZXggYTI4OTNiNS4uNDM3Zjc5NyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9QcmltYXJ5S2V5Q2xhc3NQcm92aWRlckhlbHBlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvUHJpbWFyeUtleUNsYXNzUHJvdmlkZXJIZWxwZXIuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogCQlzdXBlcihhbkVKQik7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEltYWdlIGdldEltYWdlKCkgewogCQlpZiAoaW1hZ2UgPT0gbnVsbCkKIAkJCWltYWdlID0gY3JlYXRlSW1hZ2UoKTsKQEAgLTQ3LDE0ICs0OCwxNyBAQAogCSAqIAogCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuSmF2YUNsYXNzCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEphdmFDbGFzcyBnZXRKYXZhQ2xhc3MoKSB7CiAJCXJldHVybiAoKEVudGl0eSkgZ2V0RWpiKCkpLmdldFByaW1hcnlLZXkoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJsYXlLZXkoKSB7CiAJCXJldHVybiAia2V5X2ludGVyZl9vdiI7Ly8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZyhTdHJpbmcgY2xhc3NOYW1lKSB7CiAJCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiUHJpbWFyeV9LZXlfQ2xhc3NfVUlfIiwgbmV3IE9iamVjdFtde2NsYXNzTmFtZX0pOyAvLyROT04tTkxTLTEkID0gIlByaW1hcnkgS2V5IENsYXNzIgogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvUmVtb3RlSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvUmVtb3RlSW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YQppbmRleCAzZmNiNzkwLi5hNjc3ZDU3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL1JlbW90ZUludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9SZW1vdGVJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiAJCXN1cGVyKGFuRUpCKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7CiAJCWlmIChpbWFnZSA9PSBudWxsKQogCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZSgpOwpAQCAtNDYsMTQgKzQ3LDE3IEBACiAJICogCiAJICogQHJldHVybiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKIAkJcmV0dXJuIGdldEVqYigpLmdldFJlbW90ZUludGVyZmFjZSgpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3ZlcmxheUtleSgpIHsKIAkJcmV0dXJuICJyZW1vdGVfaW50ZXJmYWNlX292ZXJsYXlfb2JqIjsvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKIAkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJSZW1vdGVfSW50ZXJmYWNlX1VJXyIsIG5ldyBPYmplY3RbXXtjbGFzc05hbWV9KTsgLy8kTk9OLU5MUy0xJCA9ICJSZW1vdGUgSW50ZXJmYWNlIgogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lamIvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvdmlkZXJIZWxwZXIuamF2YQppbmRleCA1YWQyYjBjLi41MzUyOGIyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWpiL3Byb3ZpZGVyL1NlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3ZpZGVySGVscGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VqYi9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VQcm92aWRlckhlbHBlci5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiAJCXN1cGVyKGFuRUpCKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7CiAJCWlmIChpbWFnZSA9PSBudWxsKQogCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZSgpOwpAQCAtNTAsMTUgKzUxLDE4IEBACiAJICogCiAJICogQHJldHVybiBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5KYXZhQ2xhc3MKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSmF2YUNsYXNzIGdldEphdmFDbGFzcygpIHsKIAkJcmV0dXJuICgoU2Vzc2lvbikgZ2V0RWpiKCkpLmdldFNlcnZpY2VFbmRwb2ludCgpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3ZlcmxheUtleSgpIHsKIAkJLy9UT0RPOiBERkggd2UgbmVlZCBhbiBpY29uCiAJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUeXBlU3RyaW5nKFN0cmluZyBjbGFzc05hbWUpIHsKIAkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJTZXJ2aWNlX0VuZHBvaW50X0ludGVyZmFjZV9VSV8iLCBuZXcgT2JqZWN0W117Y2xhc3NOYW1lfSk7IC8vJE5PTi1OTFMtMSQgPSAiSG9tZSBJbnRlcmZhY2UiCiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2xpc3RlbmVycy9WYWxpZGF0ZUVkaXRMaXN0ZW5lci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2xpc3RlbmVycy9WYWxpZGF0ZUVkaXRMaXN0ZW5lci5qYXZhCmluZGV4IGQ4YzhhOTYuLmJlNmIxZGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9saXN0ZW5lcnMvVmFsaWRhdGVFZGl0TGlzdGVuZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbGlzdGVuZXJzL1ZhbGlkYXRlRWRpdExpc3RlbmVyLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5MaXN0TWVzc2FnZURpYWxvZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKQEAgLTcwLDcgKzcxLDcgQEAKIAkJCX0pOwogCQkJCiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9CiAJfQogCS8qKgpAQCAtMTgzLDYgKzE4NCw3IEBACiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNoZWxsTGlzdGVuZXIjc2hlbGxBY3RpdmF0ZWQoU2hlbGxFdmVudCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzaGVsbEFjdGl2YXRlZChTaGVsbEV2ZW50IGV2ZW50KSB7CiAJCWhhbmRsZUFjdGl2YXRpb24oKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGVyc3BlY3RpdmUvSjJFRVBlcnNwZWN0aXZlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGVyc3BlY3RpdmUvSjJFRVBlcnNwZWN0aXZlLmphdmEKaW5kZXggMzRmZWU2Ni4uNGY2MDczOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BlcnNwZWN0aXZlL0oyRUVQZXJzcGVjdGl2ZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9KMkVFUGVyc3BlY3RpdmUuamF2YQpAQCAtMTAsOSArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogQ3JlYXRlZCBvbiBEZWMgNywgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGVyc3BlY3RpdmU7CiAKQEAgLTI1LDEyICsyMiw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MuSVZpZXdEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LklQcm9kdWN0Q29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlByb2R1Y3RNYW5hZ2VyOwogCi0vKioKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCiBwdWJsaWMgY2xhc3MgSjJFRVBlcnNwZWN0aXZlIGltcGxlbWVudHMgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeSB7CiAKIAlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBJRF9TRVJWRVJTX1ZJRVcgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJzVmlldyI7IC8vJE5PTi1OTFMtMSQKQEAgLTQwLDEzICszNCwyNiBAQAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9TRUFSQ0hfVklFVyA9ICJvcmcuZWNsaXBzZS5zZWFyY2gudWkudmlld3MuU2VhcmNoVmlldyI7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfREFUQV9WSUVXID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuRGF0YVNvdXJjZUV4cGxvcmVyTmF2aWdhdG9yIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0NPTlNPTEVfVklFVz0gIm9yZy5lY2xpcHNlLnVpLmNvbnNvbGUuQ29uc29sZVZpZXciOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTUFSS0VSU19WSUVXPSAib3JnLmVjbGlwc2UudWkudmlld3MuQWxsTWFya2Vyc1ZpZXciOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfVEFTS0xJU1RfVklFVz0gIm9yZy5lY2xpcHNlLm15bHluLnRhc2tzLnVpLnZpZXdzLnRhc2tzIjsgLy8kTk9OLU5MUy0xJAogCiAJcHVibGljIEoyRUVQZXJzcGVjdGl2ZSgpIHsKIAkJc3VwZXIoKTsKIAkJLy9JZiBwcmVmZXJlbmNlIGV4aXN0cyBmb3IgYWx0ZXJuYXRlIHZpZXcsIHJlcGxhY2UuCi0JCVN0cmluZyB2aWV3ZXJJRCA9IEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldFN0cmluZyhKMkVFUHJlZmVyZW5jZXMuS2V5cy5JRF9QRVJTUEVDVElWRV9ISUVSQVJDSFlfVklFVyk7Ci0JCWlmICh2aWV3ZXJJRCAhPSBudWxsKQotCQkJSURfSjJFRV9ISUVSQVJDSFlfVklFVyA9IHZpZXdlcklEOworCQlTdHJpbmcgdmlld2VySUQgPSBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5JRF9QRVJTUEVDVElWRV9ISUVSQVJDSFlfVklFVyk7CisJCWlmICh2aWV3ZXJJRCAhPSBudWxsKSB7CisJCQkvLyB2ZXJpZnkgdGhhdCB0aGUgdmlldyBhY3R1YWxseSBleGlzdHMKKwkJCWlmIChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFZpZXdSZWdpc3RyeSgpLmZpbmQodmlld2VySUQpICE9IG51bGwpeworCQkJCUlEX0oyRUVfSElFUkFSQ0hZX1ZJRVcgPSB2aWV3ZXJJRDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZpZXdlcklEID0gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEoyRUVQcmVmZXJlbmNlcy5LZXlzLklEX1BFUlNQRUNUSVZFX0hJRVJBUkNIWV9WSUVXKTsKKwkJCWlmICh2aWV3ZXJJRCAhPSBudWxsKXsKKwkJCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRWaWV3UmVnaXN0cnkoKS5maW5kKHZpZXdlcklEKSAhPSBudWxsKXsKKwkJCQkJSURfSjJFRV9ISUVSQVJDSFlfVklFVyA9IHZpZXdlcklEOworCQkJCX0KKwkJCX0KKwkJfQogCX0KIAogCS8qCkBAIC03NSwxMSArODIsMTEgQEAKIAkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSURfREFUQV9WSUVXKTsKIAkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfQk9PS01BUktTKTsKIAkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0JCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7CiAJCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElQYWdlTGF5b3V0LklEX1BST1BfU0hFRVQpOwogCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJUGFnZUxheW91dC5JRF9SRVNfTkFWKTsKLQkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSVBhZ2VMYXlvdXQuSURfVEFTS19MSVNUKTsKIAkJbGF5b3V0LmFkZFNob3dWaWV3U2hvcnRjdXQoSURfV1NUX1NOSVBQRVRTX1ZJRVcpOworCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJRF9NQVJLRVJTX1ZJRVcpOworCQlsYXlvdXQuYWRkU2hvd1ZpZXdTaG9ydGN1dChJRF9UQVNLTElTVF9WSUVXKTsKIAkJCiAJCS8vIHZpZXdzIC0gc2VhcmNoCiAJCWxheW91dC5hZGRTaG93Vmlld1Nob3J0Y3V0KElEX1NFQVJDSF9WSUVXKTsKQEAgLTEwMiwxMyArMTA5LDE0IEBACiAKIAkJLy8gQm90dG9tIHJpZ2h0LgogCQlJRm9sZGVyTGF5b3V0IGJvdHRvbVJpZ2h0ID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigiYm90dG9tUmlnaHQiLCBJUGFnZUxheW91dC5CT1RUT00sIDAuN2YsIGVkaXRvckFyZWEpOy8vJE5PTi1OTFMtMSQKLQkJYm90dG9tUmlnaHQuYWRkVmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOwotCQlib3R0b21SaWdodC5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1RBU0tfTElTVCk7CisJCWJvdHRvbVJpZ2h0LmFkZFZpZXcoSURfTUFSS0VSU19WSUVXKTsKIAkJYm90dG9tUmlnaHQuYWRkVmlldyhJUGFnZUxheW91dC5JRF9QUk9QX1NIRUVUKTsKIAkJYm90dG9tUmlnaHQuYWRkVmlldyhJRF9TRVJWRVJTX1ZJRVcpOwogCQlhZGREQlZpZXdJZlByZXNlbnQobGF5b3V0LGJvdHRvbVJpZ2h0KTsKIAkJYm90dG9tUmlnaHQuYWRkVmlldyhJRF9XU1RfU05JUFBFVFNfVklFVyk7CiAJCQorCQlib3R0b21SaWdodC5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOworCQlib3R0b21SaWdodC5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9UQVNLX0xJU1QpOwogCQlib3R0b21SaWdodC5hZGRQbGFjZWhvbGRlcihJRF9DT05TT0xFX1ZJRVcpOwogCQlib3R0b21SaWdodC5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwogCQlib3R0b21SaWdodC5hZGRQbGFjZWhvbGRlcihJUHJvZ3Jlc3NDb25zdGFudHMuUFJPR1JFU1NfVklFV19JRCk7CkBAIC0xMTcsMTMgKzEyNSwxOSBAQAogCQkvLyBUb3AgcmlnaHQuCiAJCUlGb2xkZXJMYXlvdXQgdG9wUmlnaHQgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKCJ0b3BSaWdodCIsIElQYWdlTGF5b3V0LlJJR0hULCAwLjdmLCBlZGl0b3JBcmVhKTsvLyROT04tTkxTLTEkCiAJCXRvcFJpZ2h0LmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7CisJCWFkZFRMVmlld0lmUHJlc2VudChsYXlvdXQsIHRvcFJpZ2h0KTsKKwkJCiAJfQogCXByaXZhdGUgdm9pZCBhZGREQlZpZXdJZlByZXNlbnQoSVBhZ2VMYXlvdXQgcGFnZSxJRm9sZGVyTGF5b3V0IGJvdHRvbVJpZ2h0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJSVZpZXdEZXNjcmlwdG9yIGRiVmlldyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0Vmlld1JlZ2lzdHJ5KCkuZmluZChJRF9EQVRBX1ZJRVcpOwogCQlpZiAoZGJWaWV3ICE9IG51bGwpCiAJCQlib3R0b21SaWdodC5hZGRWaWV3KElEX0RBVEFfVklFVyk7CiAJfQorCXByaXZhdGUgdm9pZCBhZGRUTFZpZXdJZlByZXNlbnQoSVBhZ2VMYXlvdXQgcGFnZSxJRm9sZGVyTGF5b3V0IHRvcFJpZ2h0KSB7CisJCUlWaWV3RGVzY3JpcHRvciB0bFZpZXcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFZpZXdSZWdpc3RyeSgpLmZpbmQoSURfVEFTS0xJU1RfVklFVyk7CisJCWlmICh0bFZpZXcgIT0gbnVsbCkKKwkJCXRvcFJpZ2h0LmFkZFZpZXcoSURfVEFTS0xJU1RfVklFVyk7CisJCX0KIH0KIAogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0JpbmFyeUVkaXRvclV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9CaW5hcnlFZGl0b3JVdGlsaXRpZXMuamF2YQppbmRleCAxNDNhOTlhLi5jYzllY2E0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0JpbmFyeUVkaXRvclV0aWxpdGllcy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vQmluYXJ5RWRpdG9yVXRpbGl0aWVzLmphdmEKQEAgLTExLDYgKzExLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW47CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CkBAIC0zNyw2ICszOCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIAogcHVibGljIGNsYXNzIEJpbmFyeUVkaXRvclV0aWxpdGllcyB7CiAKQEAgLTU3LDcgKzU5LDcgQEAKIAkJCXRyeSB7CiAJCQkJaWYgKEphdmFNb2RlbE1hbmFnZXIuWklQX0FDQ0VTU19WRVJCT1NFKSB7CiAJCQkJCS8vJEFOQUxZU0lTLUlHTk9SRQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSArICIpIFtKYXJFbnRyeUZpbGUuZ2V0Q29udGVudHMoKV0gQ3JlYXRpbmcgWmlwRmlsZSBvbiAiICsgdGhpcy56aXBOYW1lKTsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIoIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiKSBbSmFyRW50cnlGaWxlLmdldENvbnRlbnRzKCldIENyZWF0aW5nIFppcEZpbGUgb24gIiArIHRoaXMuemlwTmFtZSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKIAkJCQl9CiAJCQkJWmlwRmlsZSB6aXBGaWxlID0gQXJjaGl2ZVV0aWwubmV3WmlwRmlsZSh0aGlzLnppcE5hbWUpOwogCQkJCVppcEVudHJ5IHppcEVudHJ5ID0gemlwRmlsZS5nZXRFbnRyeSh0aGlzLmVudHJ5TmFtZSk7CkBAIC05Nyw2ICs5OSw3IEBACiAJCS8qKgogCQkgKiBAc2VlIElTdG9yYWdlI2lzUmVhZE9ubHkoKQogCQkgKi8KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCQlyZXR1cm4gIkphckVudHJ5RmlsZVsiICsgdGhpcy56aXBOYW1lICsgIjo6IiArIHRoaXMuZW50cnlOYW1lICsgIl0iOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0xJAogCQl9CkBAIC0xMTAsOCArMTEzLDE0IEBACiAJCQlmSmFyRW50cnlGaWxlID0gamFyRW50cnlGaWxlOwogCQl9CiAKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKSArIGZKYXJFbnRyeUZpbGUuaGFzaENvZGUoKTsKKwkJfQorCQkKIAkJLyoKIAkJICovCisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCQkJaWYgKHRoaXMgPT0gb2JqKQogCQkJCXJldHVybiB0cnVlOwpAQCAtMTM2LDIwICsxNDUsNiBAQAogCQl9CiAKIAkJLyoKLQkJICogQHNlZSBJRWRpdG9ySW5wdXQjZ2V0RnVsbFBhdGgoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRGdWxsUGF0aCgpIHsKLQkJCXJldHVybiBmSmFyRW50cnlGaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUVkaXRvcklucHV0I2dldENvbnRlbnRUeXBlKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCQlyZXR1cm4gZkphckVudHJ5RmlsZS5nZXRGdWxsUGF0aCgpLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJfQotCi0JCS8qCiAJCSAqIEBzZWUgSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKIAkJICovCiAJCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7CkBAIC0xODksMjQgKzE4NCwyNCBAQAogCQl9CiAJfQogCisJLyoqCisJICogCisJICogQHBhcmFtIGNvbXBvbmVudAorCSAqIEBwYXJhbSBhcmNoaXZlUmVsYXRpdmVQYXRoCisJICogQHJldHVybgorCSAqIEBkZXByZWNhdGVkCisJICovCiAJcHVibGljIHN0YXRpYyBJRWRpdG9ySW5wdXQgZ2V0QmluYXJ5RWRpdG9ySW5wdXQoCiAJCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBhcmNoaXZlUmVsYXRpdmVQYXRoKSB7Ci0JCQotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBudWxsOwotCQlJUGF0aCBhcmNoaXZlUGF0aCA9IGNvbXBvbmVudC5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJCi0JCS8vW0J1ZyAyMzg2MTZdIGlmIHRoZXJlIGlzIG5vIHdvcmtzcGFjZSByZWxhdGl2ZSBwYXRoIHRoZW4gdGhlIGFyY2hpdmUgaXMgb3V0c2lkZQotCQkvLwl0aGUgd29ya3NwYWNlIHNvIGdldCB0aGUgT1MgcGF0aCBkaXJlY3RseSBmcm9tIHRoZSBmaWxlCi0JCWlmKGFyY2hpdmVQYXRoICE9IG51bGwpIHsKLQkJCWlucHV0ID0gZ2V0QmluYXJ5RWRpdG9ySW5wdXQoYXJjaGl2ZVBhdGgsIGFyY2hpdmVSZWxhdGl2ZVBhdGgpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIGFyY2hpdmVPU1BhdGggPSBjb21wb25lbnQuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCkuZ2V0UGF0aCgpOwotCQkJaW5wdXQgPSBnZXRCaW5hcnlFZGl0b3JJbnB1dChhcmNoaXZlT1NQYXRoLCBhcmNoaXZlUmVsYXRpdmVQYXRoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGlucHV0OworCQlyZXR1cm4gZ2V0QmluYXJ5RWRpdG9ySW5wdXQoKElWaXJ0dWFsQ29tcG9uZW50KWNvbXBvbmVudCwgYXJjaGl2ZVJlbGF0aXZlUGF0aCk7CiAJfQogCisJcHVibGljIHN0YXRpYyBJRWRpdG9ySW5wdXQgZ2V0QmluYXJ5RWRpdG9ySW5wdXQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgYXJjaGl2ZVJlbGF0aXZlUGF0aCkgeworCQlGaWxlIGYgPSAoRmlsZSljb21wb25lbnQuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKKwkJcmV0dXJuIGdldEJpbmFyeUVkaXRvcklucHV0KGYuZ2V0QWJzb2x1dGVQYXRoKCksIGFyY2hpdmVSZWxhdGl2ZVBhdGgpOworCX0KKworCQogCXB1YmxpYyBzdGF0aWMgSUVkaXRvcklucHV0IGdldEJpbmFyeUVkaXRvcklucHV0KElQYXRoIGFyY2hpdmVQYXRoLAogCQkJU3RyaW5nIGFyY2hpdmVSZWxhdGl2ZVBhdGgpIHsKIAkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0NvbW1vbkVkaXRvclV0aWxpdHkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vQ29tbW9uRWRpdG9yVXRpbGl0eS5qYXZhCmluZGV4IDZiYWQ2NGYuLjA3MzkzOTMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vQ29tbW9uRWRpdG9yVXRpbGl0eS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vQ29tbW9uRWRpdG9yVXRpbGl0eS5qYXZhCkBAIC0yNSw3ICsyNSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLkVkaXRvck1hbmFnZXI7CiAKIAogCkBAIC05MywxMyArOTIsMzAgQEAKIAl9CiAKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcHJvbXB0VG9TYXZlQWxsRGlydHlFZGl0b3JzKCkgewotCQlyZXR1cm4gcHJvbXB0VG9TYXZlRGlydHlFZGl0b3JzKEFycmF5cy5hc0xpc3QoZ2V0RGlydHlFZGl0b3JzKCkpKTsKKwkJYm9vbGVhbiByZXRWYWwgPSB0cnVlOworCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IEoyRUVVSVBsdWdpbi5nZXRQbHVnaW5Xb3JrYmVuY2goKTsKKwkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOworCQlmb3IgKGludCBpID0gMDsgcmV0VmFsICYmIGkgPCB3aW5kb3dzLmxlbmd0aDsgaSsrKSB7CisJCQlJV29ya2JlbmNoUGFnZVtdIHBhZ2VzID0gd2luZG93c1tpXS5nZXRQYWdlcygpOworCQkJZm9yIChpbnQgeCA9IDA7IHJldFZhbCAmJiB4IDwgcGFnZXMubGVuZ3RoOyB4KyspIHsKKwkJCQlyZXRWYWwgPSBwYWdlc1t4XS5zYXZlQWxsRWRpdG9ycyh0cnVlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmV0VmFsOwogCX0KIAorCS8qKgorCSAqIAorCSAqIFRoaXMgbWV0aG9kIHVzZWQgdG8gc2F2ZSBvbmx5IHRoZSBlZGl0b3JzIHNwZWNpZmllZC4gIEl0IG5vdyBzYXZlcyBhbGwgZGlydHkgZWRpdG9ycworCSAqIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBFY2xpcHNlIHBsYXRmb3JtCisJICogQHBhcmFtIGRpcnR5RWRpdG9ycworCSAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBzdWNjZWVkcywgZmFsc2UgaWYgdGhlIHVzZXIgY2FuY2VscworCSAqIEBkZXByZWNhdGVkIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBFY2xpcHNlIHBsYXRmb3JtCisJICovCiAJcHVibGljIHN0YXRpYyBib29sZWFuIHByb21wdFRvU2F2ZURpcnR5RWRpdG9ycyhMaXN0IGRpcnR5RWRpdG9ycykgewogCQlpZiAoZGlydHlFZGl0b3JzLmlzRW1wdHkoKSkKIAkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gRWRpdG9yTWFuYWdlci5zYXZlQWxsKGRpcnR5RWRpdG9ycywgdHJ1ZSwgdHJ1ZSxmYWxzZSwgSjJFRVVJUGx1Z2luLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKKwkJcmV0dXJuIHByb21wdFRvU2F2ZUFsbERpcnR5RWRpdG9ycygpOwogCX0KIAkKIAkvKioKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vRXJyb3JEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vRXJyb3JEaWFsb2cuamF2YQppbmRleCA2MGYxMWVlLi5lNmE0YzZjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0Vycm9yRGlhbG9nLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9FcnJvckRpYWxvZy5qYXZhCkBAIC02Miw2ICs2Miw3IEBACiAKIAkvL1dvcmthcm91bmQuIFNXVCBkb2VzIG5vdCBzZWVtIHRvIHNldCByaWd0aCB0aGUgZGVmYXVsdCBidXR0b24gaWYKIAkvL3RoZXJlIGlzIG5vdCBjb250cm9sIHdpdGggZm9jdXMuIEJ1ZzogMTQ2NjgKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgaW50IG9wZW4oKSB7CiAJCWNyZWF0ZSgpOwogCQlCdXR0b24gYiA9IGdldEJ1dHRvbihkZWZhdWx0QnV0dG9uSW5kZXgpOwpAQCAtODAsNiArODEsNyBAQAogCS8qCiAJICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gRGlhbG9nLgogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7CiAJCWlmIChidXR0b25JZCA9PSBkZXRhaWxCdXR0b25JRCkgewogCQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKQEAgLTE1OCw2ICsxNjAsNyBAQAogCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewogCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCiAJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9GYWNldGVkUHJvamVjdEFjdGlvbkZpbHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9GYWNldGVkUHJvamVjdEFjdGlvbkZpbHRlci5qYXZhCmluZGV4IDg0NGY0ZGUuLmRiOTUzYmQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vRmFjZXRlZFByb2plY3RBY3Rpb25GaWx0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0ZhY2V0ZWRQcm9qZWN0QWN0aW9uRmlsdGVyLmphdmEKQEAgLTc4LDI5ICs3OCwyMiBAQAogCSAgICAgICAgICAgIHsKIAkgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAJICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGVsc2UKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gZnByb2ouZ2V0SW5zdGFsbGVkVmVyc2lvbiggZiApOwotCSAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgdHJ5Ci0JICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgIGlmKCBmLmdldFZlcnNpb25zKCB2ZXhwcnN0ciApLmNvbnRhaW5zKCBmdiApICkKLQkgICAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLQkgICAgICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAJLy9FSkJVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nCi0JICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBmcHJvai5nZXRJbnN0YWxsZWRWZXJzaW9uKCBmICk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggZi5nZXRWZXJzaW9ucyggdmV4cHJzdHIgKS5jb250YWlucyggZnYgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAJLy9FSkJVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nCisgICAgICAgICAgICAgICAgfQogCSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAkgICAgICAgIH0KLQkgICAgICAgIGVsc2UKLQkgICAgICAgIHsKLQkgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9GYWNldGVkUHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0ZhY2V0ZWRQcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YQppbmRleCA0ZWUzNmQwLi42YmFiNTQ0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0ZhY2V0ZWRQcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0ZhY2V0ZWRQcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMjUsMTAgKzI1LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWNldGVkUHJvamVjdEFjdGlvbkZpbHRlcigpOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlNZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlNZXNzYWdlcy5qYXZhCmluZGV4IDgwZTg3MzQuLmVmMDQwYzggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJTWVzc2FnZXMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSU1lc3NhZ2VzLmphdmEKQEAgLTEzOSw2ICsxMzksNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9DT01QT05FTlRfU0VDT05EX1BHX1RJVExFID0gIkVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnNlY29uZFBhZ2UudGl0bGUiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0NPTVBPTkVOVF9TRUNPTkRfUEdfREVTQyA9ICJFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC5zZWNvbmRQYWdlLmRlc2MiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9NT0RVTEVfREVQRU5ERU5DSUVTX0xBQkVMID0gIkoyRUVNb2R1bGVEZXBlbmRlbmNpZXMubGFiZWwiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9NT0RVTEVfREVQRU5ERU5DSUVTX0xBQkVMX0FDQ0VTU0lCSUxJVFkgPSAiSjJFRU1vZHVsZURlcGVuZGVuY2llcy5sYWJlbF9hY2Nlc3NpYmlsaXR5IjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9DT01QT05FTlRfV0laX1RJVExFID0gIkFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLnRpdGxlIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9DT01QT05FTlRfTUFJTl9QR19USVRMRSA9ICJBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZC5tYWluUGFnZS50aXRsZSI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBDTElFTlRfQ09NUE9ORU5UX01BSU5fUEdfREVTQyA9ICJBcHBDbGllbnRDb21wb25lbnRDcmVhdGlvbldpemFyZC5tYWluUGFnZS5kZXNjIjsgLy8kTk9OLU5MUy0xJApAQCAtMTU0LDYgKzE1NSw5IEBACiAJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT0xERVJfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiRk9MREVSX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBCUk9XU0VfQlVUVE9OX0xBQkVMID0gZ2V0UmVzb3VyY2VTdHJpbmcoIkJST1dTRV9CVVRUT05fTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJST1dTRV9CVVRUT05fTEFCRUxfTyA9IGdldFJlc291cmNlU3RyaW5nKCJCUk9XU0VfQlVUVE9OX0xBQkVMX08iKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJST1dTRV9CVVRUT05fTEFCRUxfVyA9IGdldFJlc291cmNlU3RyaW5nKCJCUk9XU0VfQlVUVE9OX0xBQkVMX1ciKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEJST1dTRV9CVVRUT05fTEFCRUxfRSA9IGdldFJlc291cmNlU3RyaW5nKCJCUk9XU0VfQlVUVE9OX0xBQkVMX0UiKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfUEFDS0FHRV9MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJKQVZBX1BBQ0tBR0VfTEFCRUwiKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX05BTUVfTEFCRUwgPSBnZXRSZXNvdXJjZVN0cmluZygiQ0xBU1NfTkFNRV9MQUJFTCIpOyAvLyROT04tTkxTLTEkCiAJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VQRVJDTEFTU19MQUJFTCA9IGdldFJlc291cmNlU3RyaW5nKCJTVVBFUkNMQVNTX0xBQkVMIik7IC8vJE5PTi1OTFMtMSQKQEAgLTIwMSw3ICsyMDUsNiBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMQU5LX0xJQl9ESVJfV0FSTl9RVUVTVElPTiA9ICJCTEFOS19MSUJfRElSX1dBUk5fUVVFU1RJT04iOy8vJE5PTi1OTFMtMSQJCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9QQVRIID0gIklOVkFMSURfUEFUSCI7Ly8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfUEFUSF9NU0cgPSAiSU5WQUxJRF9QQVRIX01TRyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkFMSURfUEFUSF9TVEFSVFNfV0lUSF9TTEFTSF9NU0cgPSAiSU5WQUxJRF9QQVRIX1NUQVJUU19XSVRIX1NMQVNIX01TRyI7Ly8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUEVOREVOQ1lfQ09ORkxJQ1RfVElUTEUgPSAiREVQRU5ERU5DWV9DT05GTElDVF9USVRMRSI7Ly8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUEVOREVOQ1lfQ09ORkxJQ1RfTVNHXzEgPSAiREVQRU5ERU5DWV9DT05GTElDVF9NU0dfMSI7Ly8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUEVOREVOQ1lfQ09ORkxJQ1RfTVNHXzIgPSAiREVQRU5ERU5DWV9DT05GTElDVF9NU0dfMiI7Ly8kTk9OLU5MUy0xJAkKQEAgLTIxMCwxMCArMjEzLDEyIEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQUE9SVE1VTFRJUExFTU9EVUxFUz0iU1VQUE9SVE1VTFRJUExFTU9EVUxFUyI7Ly8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRUZPTERFUj0iU09VUkNFRk9MREVSIjsvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9GT0xERVIgPSAiMTAyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVEZPTERFUiA9ICJPVVRQVVRGT0xERVIiOyAvLyROT04tTkxTLTEkCiAJCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9WRVJfSEVMUF9GT1JfRElTQUJMRURfTElCUyA9ICJIT1ZFUl9IRUxQX0ZPUl9ESVNBQkxFRF9MSUJTIjsgLy8kTk9OLU5MUy0xJAotCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9FRV9QUkVGRVJFTkNFX1BBR0VfTkFNRSA9ICJKQVZBX0VFX1BSRUZFUkVOQ0VfUEFHRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRUVfUFJFRkVSRU5DRV9QQUdFX0pFVF9URU1QTEFURSA9ICJKQVZBX0VFX1BSRUZFUkVOQ0VfUEFHRV9KRVRfVEVNUExBVEUiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9FRV9QUkVGRVJFTkNFX1BBR0VfRFlOX1RSQU5TTEFUSU9OX0JUTl9OQU1FID0gIkpBVkFfRUVfUFJFRkVSRU5DRV9QQUdFX0RZTl9UUkFOU0xBVElPTl9CVE5fTkFNRSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0oyRUVfUkVTT1VSQ0VfQUNUSU9OXzAgPSAiT3BlbkoyRUVSZXNvdXJjZUFjdGlvbi4wIjsgLy8kTk9OLU5MUy0xJAogCS8qKgogCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUsIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KIAkgKi8KQEAgLTIzNCw2ICsyMzksNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLk1lc3NhZ2VzI2luaXRpYWxpemVCdW5kbGUoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCdW5kbGUoKSB7CiAJCXRyeSB7CiAJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiajJlZV91aSIpOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVUlQbHVnaW4uamF2YQppbmRleCBkNjM5NGQ4Li5iNjdkYmY0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVVSVBsdWdpbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVVJUGx1Z2luLmphdmEKQEAgLTEyLDMwICsxMiwyOCBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QuUGxhdGZvcm1VUkxDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSW1wb3J0VXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwogaW1wb3J0IGphdmEubGFuZy5UaHJvd2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiAKIAogLyoqCkBAIC03Nyw4ICs3NSw4IEBACiAJCQl0cnkgewogCQkJCVN0cmluZyBpbnN0YWxsTG9jYXRpb24gPSAoKFBsYXRmb3JtVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKCkpLmdldFVSTEFzTG9jYWwoKS5nZXRGaWxlKCk7CiAJCQkJbG9jYXRpb24gPSBuZXcgUGF0aChpbnN0YWxsTG9jYXRpb24pOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nV2FybmluZyhKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW5zdGFsbF9Mb2NhdGlvbl9FcnJvcl8iLCBuZXcgT2JqZWN0W117dXJsfSkgKyBlKTsgLy8kTk9OLU5MUy0xJAorCQkJfWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJbG9nV2FybmluZyhKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSW5zdGFsbF9Mb2NhdGlvbl9FcnJvcl8iLCBuZXcgT2JqZWN0W117dXJsfSkgKyBlKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CiAJCXJldHVybiBsb2NhdGlvbjsKQEAgLTg4LDEyNiArODYsNiBAQAogCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBcmNoaXZlRGVmYXVsdFByb2plY3ROYW1lKEFyY2hpdmUgYW5BcmNoaXZlKSB7Ci0JCWlmIChhbkFyY2hpdmUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgdHlwZSA9IGdldEFyY2hpdmVUeXBlKGFuQXJjaGl2ZSk7Ci0JCXJldHVybiBnZXRUeXBlRGVmYXVsdFByb2plY3ROYW1lKGFuQXJjaGl2ZS5nZXRVUkkoKSwgdHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXJjaGl2ZURlZmF1bHRVdGlsUHJvamVjdE5hbWUoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJaWYgKGFuQXJjaGl2ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCB0eXBlID0gZ2V0QXJjaGl2ZVR5cGUoYW5BcmNoaXZlKTsKLQkJcmV0dXJuIGdldFR5cGVEZWZhdWx0VXRpbFByb2plY3ROYW1lKGFuQXJjaGl2ZS5nZXROYW1lKCksIHR5cGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFyY2hpdmVEZWZhdWx0UHJvamVjdE5hbWUoQXJjaGl2ZSBhbkFyY2hpdmUsIEhhc2hTZXQgbW9kdWxlTmFtZXMpIHsKLQkJaWYgKGFuQXJjaGl2ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCB0eXBlID0gZ2V0QXJjaGl2ZVR5cGUoYW5BcmNoaXZlKTsKLQkJcmV0dXJuIGdldFR5cGVEZWZhdWx0UHJvamVjdE5hbWUoYW5BcmNoaXZlLmdldFVSSSgpLCB0eXBlLCBtb2R1bGVOYW1lcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QXJjaGl2ZVR5cGUoQXJjaGl2ZSBhbkFyY2hpdmUpIHsKLQkJaW50IHR5cGUgPSBJbXBvcnRVdGlsLlVOS05PV047Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCWlmIChhbkFyY2hpdmUuaXNFSkJKYXJGaWxlKCkpCi0JCQkJCXR5cGUgPSBJbXBvcnRVdGlsLkVKQkpBUkZJTEU7Ci0JCQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzV0FSRmlsZSgpKQotCQkJCQl0eXBlID0gSW1wb3J0VXRpbC5XQVJGSUxFOwotCQkJCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc0FwcGxpY2F0aW9uQ2xpZW50RmlsZSgpKQotCQkJCQl0eXBlID0gSW1wb3J0VXRpbC5DTElFTlRKQVJGSUxFOwotCQkJCWVsc2UgaWYgKGFuQXJjaGl2ZS5pc1JBUkZpbGUoKSkKLQkJCQkJdHlwZSA9IEltcG9ydFV0aWwuUkFSRklMRTsKLQkJCQllbHNlIGlmIChhbkFyY2hpdmUuaXNFQVJGaWxlKCkpCi0JCQkJCXR5cGUgPSBJbXBvcnRVdGlsLkVBUkZJTEU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYW5BcmNoaXZlICE9IG51bGwpCi0JCQkJYW5BcmNoaXZlLmNsb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZURlZmF1bHRQcm9qZWN0TmFtZShTdHJpbmcgdGV4dCwgaW50IHR5cGUpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHRleHQpOwotCQl0ZXh0ID0gcGF0aC5tYWtlUmVsYXRpdmUoKS5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKLQotCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHRleHQpOwotCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpCi0JCQlleGlzdHMgPSB0cnVlOwotCQlpZiAoZXhpc3RzICYmIHRleHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKEltcG9ydFV0aWwuU1VGRklYRVNbdHlwZV0udG9Mb3dlckNhc2UoKSkgPT0gLTEpCi0JCQl0ZXh0ID0gdGV4dCArIEltcG9ydFV0aWwuU1VGRklYRVNbdHlwZV07Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGogPSAxOyBqIDwgMTA7IGorKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJU3RyaW5nIGl0ZXJhdGVkUHJvamVjdE5hbWUgPSB0ZXh0ICsgKChqID09IDEpID8gIiIgOiBJbnRlZ2VyLnRvU3RyaW5nKGopKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7ICFmb3VuZCAmJiAoaSA8IHByb2plY3RzLmxlbmd0aCk7IGkrKykgewotCQkJCWlmICgocHJvamVjdHNbaV0pLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGl0ZXJhdGVkUHJvamVjdE5hbWUpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKQotCQkJCXJldHVybiBpdGVyYXRlZFByb2plY3ROYW1lOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUeXBlRGVmYXVsdFByb2plY3ROYW1lKFN0cmluZyB0ZXh0LCBpbnQgdHlwZSwgSGFzaFNldCBtb2R1bGVOYW1lcykgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodGV4dCk7Ci0JCXRleHQgPSBwYXRoLm1ha2VSZWxhdGl2ZSgpLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCi0JCWJvb2xlYW4gaXNWYWxpZE5hbWUgPSBtb2R1bGVOYW1lcy5hZGQodGV4dCk7Ci0JCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QodGV4dCk7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkKLQkJCWV4aXN0cyA9IHRydWU7Ci0JCWlmICghaXNWYWxpZE5hbWUgfHwgKGV4aXN0cyAmJiB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihJbXBvcnRVdGlsLlNVRkZJWEVTW3R5cGVdLnRvTG93ZXJDYXNlKCkpID09IC0xKSkKLQkJCXRleHQgPSB0ZXh0ICsgSW1wb3J0VXRpbC5TVUZGSVhFU1t0eXBlXTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaiA9IDE7IGogPCAxMDsgaisrKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlTdHJpbmcgaXRlcmF0ZWRQcm9qZWN0TmFtZSA9IHRleHQgKyAoKGogPT0gMSkgPyAiIiA6IEludGVnZXIudG9TdHJpbmcoaikpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgIWZvdW5kICYmIChpIDwgcHJvamVjdHMubGVuZ3RoKTsgaSsrKSB7Ci0JCQkJaWYgKChwcm9qZWN0c1tpXSkuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoaXRlcmF0ZWRQcm9qZWN0TmFtZSkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpCi0JCQkJcmV0dXJuIGl0ZXJhdGVkUHJvamVjdE5hbWU7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLy8gdGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBhcmUgdXNlZCBieSB3ZWIgZWRpdG9yCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZURlZmF1bHRVdGlsUHJvamVjdE5hbWUoU3RyaW5nIHRleHQsIGludCB0eXBlKSB7Ci0JCXRleHQgPSB0ZXh0LnN1YnN0cmluZyh0ZXh0Lmxhc3RJbmRleE9mKGphdmEuaW8uRmlsZS5zZXBhcmF0b3IpICsgMSk7Ci0JCWludCBpID0gdGV4dC5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaSA+IDApCi0JCQl0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgaSk7Ci0JCWlmICh0ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihJbXBvcnRVdGlsLlNVRkZJWEVTW3R5cGVdLnRvTG93ZXJDYXNlKCkpID09IC0xKQotCQkJdGV4dCA9IHRleHQgKyBJbXBvcnRVdGlsLlNVRkZJWEVTW3R5cGVdOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJU3RyaW5nIGl0ZXJhdGVkUHJvamVjdE5hbWUgPSB0ZXh0ICsgKChqID09IDApID8gIiIgOiBJbnRlZ2VyLnRvU3RyaW5nKGopKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpID0gMDsgIWZvdW5kICYmIChpIDwgcHJvamVjdHMubGVuZ3RoKTsgaSsrKSB7Ci0JCQkJaWYgKChwcm9qZWN0c1tpXSkuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoaXRlcmF0ZWRQcm9qZWN0TmFtZSkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpCi0JCQkJcmV0dXJuIGl0ZXJhdGVkUHJvamVjdE5hbWU7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCiAJLyoqCiAJICogR2V0IGEgLmdpZiBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KIAkgKi8KQEAgLTM1OCw1ICsyMzYsMTggQEAKIAkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGV4Y2VwdGlvbi5nZXRTdGF0dXMoKSApOwogCX0KIAorCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbikpOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBMVUdJTl9JRCxJU3RhdHVzLkVSUk9SLG5ldyBJU3RhdHVzW117ZXhjZXB0aW9uLmdldFN0YXR1cygpfSxtZXNzYWdlLGV4Y2VwdGlvbik7CisJCVBsYXRmb3JtLmdldExvZyhQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKSkubG9nKCBzdGF0dXMgKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbWVzc2FnZSkgeworCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyhjcmVhdGVTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBtZXNzYWdlKSk7CisJfQorCiAKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVZpZXdlclNvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVmlld2VyU29ydGVyLmphdmEKaW5kZXggMjdkY2Y4MC4uNmM4MDk1YiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVmlld2VyU29ydGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFVmlld2VyU29ydGVyLmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIAkvKioKIAkgKiBAc2VlIFZpZXdlclNvcnRlciNjb21wYXJlKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7CiAJCWlmIChzaG91bGRTb3J0KGUxLCBlMikpCiAJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEKaW5kZXggZjcxZmMzMC4uNjA5YmVlNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb3ZpZGVyLkdyb3VwZWRFSkJKYXJJdGVtUHJvdmlkZXI7CkBAIC0zOSw2ICs0MCw3IEBACiAJCW1ldGhvZHNQcm92aWRlckRlbGVnYXRlID0gbmV3IE1ldGhvZHNQcm92aWRlckRlbGVnYXRlKGFkYXB0ZXJGYWN0b3J5KTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAKIAkJaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihvYmplY3QpKQpAQCAtNzEsNiArNzMsNyBAQAogCS8qCiAJICogQHNlZSBJVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7CiAKIAkJaWYgKE1ldGhvZHNQcm92aWRlckRlbGVnYXRlLnByb3ZpZGVzQ29udGVudEZvcihwYXJlbnRFbGVtZW50KSkKQEAgLTg0LDYgKzg3LDcgQEAKIAkvKgogCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7CiAJCXJldHVybiBnZXRSb290cyhpbnB1dEVsZW1lbnQpOwogCQkvLwkJZWxzZSBpZiAoTWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUucHJvdmlkZXNDb250ZW50Rm9yKGlucHV0RWxlbWVudCkpCkBAIC0xMDIsNiArMTA2LDcgQEAKIAkvKgogCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7CiAJCWlmIChNZXRob2RzUHJvdmlkZXJEZWxlZ2F0ZS5wcm92aWRlc0NvbnRlbnRGb3IoZWxlbWVudCkpCiAJCQlyZXR1cm4gbWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUuaGFzQ2hpbGRyZW4oZWxlbWVudCk7CkBAIC0xMTQsNiArMTE5LDcgQEAKIAkvKioKIAkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKIAkJc3VwZXIuZGlzcG9zZSgpOwogCQlpZiAobWV0aG9kc1Byb3ZpZGVyRGVsZWdhdGUgIT0gbnVsbCkKQEAgLTEyMyw2ICsxMjksNyBAQAogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYVZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKIAkJc3VwZXIuaW5wdXRDaGFuZ2VkKGFWaWV3ZXIsIG9sZElucHV0LCBuZXdJbnB1dCk7CiAJCW1ldGhvZHNQcm92aWRlckRlbGVnYXRlLmlucHV0Q2hhbmdlZChhVmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyLmphdmEKaW5kZXggMDI2NzU4Yi4uZTUwZDA2ZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlci5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiAJCXdiTGFiZWxQcm92aWRlciA9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikKIAkJCXJldHVybiAoKEoyRUVKYXZhQ2xhc3NQcm92aWRlckhlbHBlcikgb2JqZWN0KS5nZXRJbWFnZSgpOwpAQCAtNjYsNiArNjcsNyBAQAogCQlyZXR1cm4gd2JMYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iamVjdCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAogCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKQpAQCAtOTMsNiArOTUsNyBAQAogCSAqIEBzZWUgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciNub3RpZnlDaGFuZ2VkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KU9iamVjdCwKIAkgKiAgICAgIGludCwoRVN0cnVjdHVyYWxGZWF0dXJlKSBPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBpbnQpKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7CiAJCWlmIChmZWF0dXJlID09IFJPTEVfTkFNRV9TRiB8fCBmZWF0dXJlID09IFJPTEVTX1NGKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IGQzN2UyMDguLjlkMjcwNWEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyLmphdmEKQEAgLTUwLDYgKzUwLDcgQEAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJTGlzdCBsb2NhbENoaWxkcmVuID0gKExpc3QpIGNoaWxkcmVuLmdldChvYmplY3QpOwogCQlpZiAobG9jYWxDaGlsZHJlbiA9PSBudWxsKQpAQCAtOTUsNiArOTYsNyBAQAogCSAqICAgICAgaW50LChFU3RydWN0dXJhbEZlYXR1cmUpIEVPYmplY3QsIE9iamVjdCwgT2JqZWN0LCBpbnQpKQogCSAqIEBkZXByZWNhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBcHBsaWNhdGlvbi5jbGFzcykpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19NT0RVTEVTIDoKQEAgLTEzNiw2ICsxMzgsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewogCQlzdXBlci5kaXNwb3NlKCk7CiAJCUxpc3QgYWRhcHRlcnMgPSBnZXRSZXNvdXJjZUFkYXB0ZXJzKCk7CkBAIC0xNTQsNiArMTU3LDcgQEAKIAkJCXRoaXMuYXBwID0gYXBwOwogCQl9CiAKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCiAJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCAwNDM0YjMwLi4xZGY0YmFmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogCS8qKgogCSAqIEBzZWUgQXBwbGljYXRpb25BZGFwdGVyRmFjdG9yeSNjcmVhdGVBcHBsaWNhdGlvbkFkYXB0ZXIoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uQWRhcHRlcigpIHsKIAkJcmV0dXJuIG5ldyBKMkVFQXBwbGljYXRpb25JdGVtUHJvdmlkZXIodGhpcyk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVCaW5hcnlNb2R1bGVzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUJpbmFyeU1vZHVsZXNJdGVtUHJvdmlkZXIuamF2YQppbmRleCBiZjE0YjJkLi44NmFlMmEyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUJpbmFyeU1vZHVsZXNJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUJpbmFyeU1vZHVsZXNJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjMsMTAgKzIzLDEyIEBACiAJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjaGlsZHJlbik7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKIAkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLkJJTkFSWTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVFZGl0aW5nRG9tYWluLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUVkaXRpbmdEb21haW4uamF2YQppbmRleCBhYjA3YmQxLi5hMGRhMmY5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUVkaXRpbmdEb21haW4uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUVkaXRpbmdEb21haW4uamF2YQpAQCAtODYsNiArODYsNyBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29tbWFuZCBjcmVhdGVPdmVycmlkZUNvbW1hbmQoT3ZlcnJpZGVhYmxlQ29tbWFuZCBjb21tYW5kKSB7CiAJCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQWRkQ29tbWFuZCkgewogCQkJQWRkQ29tbWFuZCBhZGRDb21tYW5kID0gKEFkZENvbW1hbmQpIGNvbW1hbmQ7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRU1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRU1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNjIwYjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVNb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgSjJFRU1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEoyRUVNb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgSjJFRU1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTW9kdWxlbWFwQWRhcHRlckZhY3RvcnkjY3JlYXRlRUFSUHJvamVjdE1hcEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVBUlByb2plY3RNYXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEoyRUVVdGlsaXR5SmF2YVByb2plY3RzSXRlbVByb3ZpZGVyKHRoaXMsIGZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVUlFZGl0aW5nRG9tYWluLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVVJRWRpdGluZ0RvbWFpbi5qYXZhCmluZGV4IDRjZTYzMDkuLmZkOTIyNTEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVUlFZGl0aW5nRG9tYWluLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVVSUVkaXRpbmdEb21haW4uamF2YQpAQCAtMzUsNiArMzUsNyBAQAogCQl0dXJuVHJhY2VPbklmRGVidWdnaW5nKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ29weVRvQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKENvcHlUb0NsaXBib2FyZENvbW1hbmQgY29weVRvQ2xpcGJvYXJkQ29tbWFuZCkgewogCiAJCWlmIChjb3B5VG9DbGlwYm9hcmRDb21tYW5kIGluc3RhbmNlb2YgSjJFRUNvcHlUb0NsaXBib2FyZE92ZXJyaWRlQ29tbWFuZCkKQEAgLTQyLDYgKzQzLDcgQEAKIAkJcmV0dXJuIG5ldyBKMkVFQ29weVRvQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKGNvcHlUb0NsaXBib2FyZENvbW1hbmQpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVBhc3RlRnJvbUNsaXBib2FyZE92ZXJyaWRlQ29tbWFuZChQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIHBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIHsKIAkJaWYgKHBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgaW5zdGFuY2VvZiBKMkVFUGFzdGVGcm9tQ2xpcGJvYXJkT3ZlcnJpZGVDb21tYW5kKQogCQkJcmV0dXJuIG51bGw7CkBAIC01MCw2ICs1Miw3IEBACiAJCXJldHVybiBuZXcgSjJFRVBhc3RlRnJvbUNsaXBib2FyZE92ZXJyaWRlQ29tbWFuZChwYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVSZW1vdmVPdmVycmlkZUNvbW1hbmQoUmVtb3ZlQ29tbWFuZCByZW1vdmVDb21tYW5kKSB7CiAJCXJldHVybiBuZXcgSjJFRVJlbW92ZU92ZXJyaWRlQ29tbWFuZChyZW1vdmVDb21tYW5kKTsKIAl9CkBAIC01OCw2ICs2MSw3IEBACiAJCXJldHVybiAoSjJFRUNsaXBib2FyZCkgZ2V0Q2xpcGJvYXJkKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlPYmplY3QgcGFyZW50ID0gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7CiAJCWlmIChwYXJlbnQgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyLmphdmEKaW5kZXggNWU4ZTg3OS4uNTgzNDUyZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVVdGlsaXR5SmFySXRlbVByb3ZpZGVyLmphdmEKQEAgLTMwLDEwICszMCwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJBcnRpZmFjdEVkaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKQEAgLTYzLDExICs2NCwxMyBAQAogCQlVdGlsaXR5SmFyUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5JTlNUQU5DRS5hZGRVdGlsaXR5SmFySXRlbVByb3ZpZGVyKFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChhcHBsaWNhdGlvbiksIHRoaXMpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKIAkJcmV0dXJuICFjaGlsZHJlbi5pc0VtcHR5KCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oZmluYWwgT2JqZWN0IG9iamVjdCkgewogCQlpZiAoIWNoaWxkcmVuTG9hZGVkKSB7CiAJCQl0cnkgewpAQCAtODksNiArOTIsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2Rpc3Bvc2UoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CiAJCXN1cGVyLmRpc3Bvc2UoKTsKIAkJVXRpbGl0eUphclJlc291cmNlQ2hhbmdlTGlzdGVuZXIuSU5TVEFOQ0UucmVtb3ZlVXRpbGl0eUphckl0ZW1Qcm92aWRlcihQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoYXBwbGljYXRpb24pLCB0aGlzKTsKQEAgLTEwOSwyOCArMTEzLDI0IEBACiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7CiAJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZSA9IG1vZHVsZXNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwogCQkJCQlpZiAobW9kdWxlLmlzQmluYXJ5KCkpIHsKLQkJCQkJCVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IHZpcnR1YWxBcmNoaXZlQ29tcG9uZW50ID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBtb2R1bGU7Ci0JCQkJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSB2aXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCQkJCWlmIChkaXNrRmlsZS5leGlzdHMoKSkKLQkJCQkJCQljaGlsZHJlbi5hZGQoZGlza0ZpbGUpOworCQkJCQkJSUZpbGUgdXRpbGl0eUphciA9IChJRmlsZSltb2R1bGUuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7CisJCQkJCQlpZiAodXRpbGl0eUphciAhPSBudWxsKQorCQkJCQkJCWNoaWxkcmVuLmFkZCh1dGlsaXR5SmFyKTsKIAkJCQkJCWVsc2UgewotCQkJCQkJCS8vIHdlIHdpbGwgYXNzdW1lIHRoZSBjb21wb25lbnQgbmFtZSBpcyBpbiBzeW5jaCB3aXRoIHRoZSBtb2R1bGUgdXJpCi0JCQkJCQkJSUZpbGUgdXRpbGl0eUphciA9IHZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LmdldFVuZGVybHlpbmdXb3JrYmVuY2hGaWxlKCk7Ci0JCQkJCQkJaWYgKHV0aWxpdHlKYXIgIT0gbnVsbCkKLQkJCQkJCQkJY2hpbGRyZW4uYWRkKHV0aWxpdHlKYXIpOworCQkJCQkJCWphdmEuaW8uRmlsZSBkaXNrRmlsZSA9IChqYXZhLmlvLkZpbGUpbW9kdWxlLmdldEFkYXB0ZXIoamF2YS5pby5GaWxlLmNsYXNzKTsKKwkJCQkJCQlpZiAoZGlza0ZpbGUuZXhpc3RzKCkpCisJCQkJCQkJCWNoaWxkcmVuLmFkZChkaXNrRmlsZSk7CiAJCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0KLQkJCQkJfQorCQkJCQl9IAogCQkJCQlpZiAobW9kdWxlLmdldFByb2plY3QoKSA9PSBudWxsIHx8ICFtb2R1bGUuZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKQogCQkJCQkJY29udGludWU7CiAJCQkJCS8vIHJldHVybiBvbmx5IGphcnMgZm9yIHV0aWxpdHkgY29tcG9uZW50cwotCQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdChtb2R1bGUuZ2V0UHJvamVjdCgpKSkgeworCQkJCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KG1vZHVsZS5nZXRQcm9qZWN0KCkpKSB7CiAJCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGFwcGxpY2F0aW9uKTsKIAkJCQkJCWlmIChwcm9qZWN0ID09IG51bGwpCiAJCQkJCQkJY29udGludWU7CiAJCQkJCQkvLyB3ZSB3aWxsIGFzc3VtZSB0aGUgY29tcG9uZW50IG5hbWUgaXMgaW4gc3luY2ggd2l0aCB0aGUgbW9kdWxlIHVyaQotCQkJCQkJSUZpbGUgdXRpbGl0eUphciA9IHByb2plY3QuZ2V0RmlsZShtb2R1bGUuZ2V0TmFtZSgpICsgIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJSUZpbGUgdXRpbGl0eUphciA9IHByb2plY3QuZ2V0RmlsZShtb2R1bGUuZ2V0TmFtZSgpICsgSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVCk7CiAJCQkJCQlpZiAodXRpbGl0eUphciAhPSBudWxsKSB7CiAJCQkJCQkJaWYgKHV0aWxpdHlKYXIuZXhpc3RzKCkpCiAJCQkJCQkJCWNoaWxkcmVuLmFkZCh1dGlsaXR5SmFyKTsKQEAgLTE2NCw3ICsxNjQsNyBAQAogCS8vIH0KIAogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phckZpbGUoSVJlc291cmNlIG1lbWJlcikgewotCQlyZXR1cm4gbWVtYmVyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiBtZW1iZXIuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAorCQlyZXR1cm4gbWVtYmVyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSAmJiBtZW1iZXIuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVCk7CiAJfQogCiAJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29tcG9uZW50RmlsZShJUmVzb3VyY2UgbWVtYmVyKSB7CkBAIC0xNzUsNiArMTc1LDcgQEAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xODIsNiArMTgzLDcgQEAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFVUSUxJVFlfSkFSUzsKIAl9CkBAIC0yNTUsNyArMjU3LDcgQEAKIAkJCXRyeSB7CiAJCQkJZXZlbnQuZ2V0RGVsdGEoKS5hY2NlcHQodGhpcyk7CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfQogCkBAIC0yODksNiArMjkxLDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJRmlsZSBnZXRBc3NvY2lhdGVkRmlsZSgpIHsKIAogCQl0cnkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVVdGlsaXR5SmF2YVByb2plY3RzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVV0aWxpdHlKYXZhUHJvamVjdHNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyZmU2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRVV0aWxpdHlKYXZhUHJvamVjdHNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEoyRUVVdGlsaXR5SmF2YVByb2plY3RzSXRlbVByb3ZpZGVyIGV4dGVuZHMgRUFSUHJvamVjdE1hcEl0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVVElMSVRZX0pBVkFfUFJPSkVDVFMgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiVXRpbGl0eV9KYXZhX1Byb2plY3RzX1VJXyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVXRpbGl0eUpBUnNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEoyRUVVdGlsaXR5SmF2YVByb2plY3RzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVXRpbGl0eUpBUnNJdGVtUHJvdmlkZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGluY2x1ZGVNb2R1bGVzCi0JICovCi0JcHVibGljIEoyRUVVdGlsaXR5SmF2YVByb2plY3RzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBib29sZWFuIGluY2x1ZGVNb2R1bGVzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBpbmNsdWRlTW9kdWxlcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBVVElMSVRZX0pBVkFfUFJPSkVDVFM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTW9kdWxlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZXNJdGVtUHJvdmlkZXIuamF2YQppbmRleCAwMzhjZjMwLi5lYzhmMjBhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTW9kdWxlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9Nb2R1bGVzSXRlbVByb3ZpZGVyLmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwpAQCAtMjAxLDYgKzIwMiw3IEBACiAJLyoqCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKE9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZvbGRlciIpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMjA5LDYgKzIxMSw3IEBACiAJCXJldHVybiAoQXBwbGljYXRpb24pIGdldFBhcmVudCgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJRmlsZSBnZXRBc3NvY2lhdGVkRmlsZSgpIHsKIAogCQl0cnkgewpAQCAtMjI2LDEwICsyMjksMTIgQEAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gTU9EVUxFUzsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCWdldENoaWxkcmVuKG9iamVjdCk7CiAJCXJldHVybiAhbG9jYWxDaGlsZHJlbi5pc0VtcHR5KCk7CkBAIC0yMzcsNiArMjQyLDcgQEAKIAogCXByaXZhdGUgTGlzdCBsb2NhbENoaWxkcmVuID0gbnVsbDsKIAorCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIGluaXRDaGlsZHJlbihvYmplY3QpOwogCX0KQEAgLTI1MiwyMSArMjU4LDI0IEBACiAJCQlNb2R1bGUgbW9kdWxlID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7CiAJCQlTdHJpbmcgbW9kdWxlVVJJID0gbW9kdWxlLmdldFVyaSgpOwogCQkJYm9vbGVhbiBmb3VuZEJpbmFyeSA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aCAmJiAhZm91bmRCaW5hcnk7IGorKykgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IHJlZnNbal0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWlmIChjb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJCQlpZiAocmVmc1tqXS5nZXRBcmNoaXZlTmFtZSgpLmVxdWFscyhtb2R1bGVVUkkpKSB7Ci0JCQkJCQlmb3VuZEJpbmFyeSA9IHRydWU7Ci0JCQkJCQlKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyID0gbnVsbDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaGVscGVyID0gbmV3IEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcihjb21wb25lbnQpOwotCQkJCQkJCU9iamVjdCBiaW5hcnlNb2R1bGUgPSBoZWxwZXIuZ2V0UHJpbWFyeVJvb3RPYmplY3QoKTsKLQkJCQkJCQlpZiAoYmluYXJ5TW9kdWxlICE9IG51bGwpIHsKLQkJCQkJCQkJYmluYXJ5TW9kdWxlcy5hZGQoYmluYXJ5TW9kdWxlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCWlmKGhlbHBlciAhPSBudWxsKXsKLQkJCQkJCQkJaGVscGVyLmRpc3Bvc2UoKTsKKwkJCWlmKG1vZHVsZVVSSSAhPSBudWxsKSB7CisJCQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBuZXcgUGF0aChtb2R1bGVVUkkpLmxhc3RTZWdtZW50KCk7CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aCAmJiAhZm91bmRCaW5hcnk7IGorKykgeworCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSByZWZzW2pdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKKwkJCQkJaWYgKGNvbXBvbmVudC5pc0JpbmFyeSgpKSB7CisJCQkJCQlpZiAocmVmc1tqXS5nZXRBcmNoaXZlTmFtZSgpLmVxdWFscyhtb2R1bGVOYW1lKSkgeworCQkJCQkJCWZvdW5kQmluYXJ5ID0gdHJ1ZTsKKwkJCQkJCQlKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyID0gbnVsbDsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQloZWxwZXIgPSBuZXcgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyKGNvbXBvbmVudCk7CisJCQkJCQkJCU9iamVjdCBiaW5hcnlNb2R1bGUgPSBoZWxwZXIuZ2V0UHJpbWFyeVJvb3RPYmplY3QoKTsKKwkJCQkJCQkJaWYgKGJpbmFyeU1vZHVsZSAhPSBudWxsKSB7CisJCQkJCQkJCQliaW5hcnlNb2R1bGVzLmFkZChiaW5hcnlNb2R1bGUpOworCQkJCQkJCQl9CisJCQkJCQkJfSBmaW5hbGx5IHsKKwkJCQkJCQkJaWYoaGVscGVyICE9IG51bGwpeworCQkJCQkJCQkJaGVscGVyLmRpc3Bvc2UoKTsKKwkJCQkJCQkJfQogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL1V0aWxpdHlNb2R1bGVQcm9qZWN0SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvVXRpbGl0eU1vZHVsZVByb2plY3RJdGVtUHJvdmlkZXIuamF2YQppbmRleCBkM2M2NTBlLi5jN2VlZDQ0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvVXRpbGl0eU1vZHVsZVByb2plY3RJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvVXRpbGl0eU1vZHVsZVByb2plY3RJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjUsMTIgKzI1LDEyIEBACiAJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKIAkJc2V0UGFyZW50KHBhcmVudCk7CiAJCXV0aWxQcm9qZWN0ID0gcHJvamVjdDsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCiAJfQogCQogCS8qKgogCSAqIEBzZWUgSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJpY29ucy9mdWxsL29iajE2L3ByanV0aWxqYXJfb2JqIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0zOCw2ICszOCw3IEBACiAJLyoqCiAJICogQHNlZSBJdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCQogCQlyZXR1cm4gdXRpbFByb2plY3QuZ2V0TmFtZSgpOwpAQCAtNDUsNyArNDYsNiBAQAogCiAJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0FkZEphdmFCdWlsZFBhdGhFbnRyaWVzV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9BZGRKYXZhQnVpbGRQYXRoRW50cmllc1dpemFyZEZyYWdtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkMWQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9BZGRKYXZhQnVpbGRQYXRoRW50cmllc1dpemFyZEZyYWdtZW50LmphdmEKQEAgLTAsMCArMSw0NDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5jaGVja0ZvckNvbXBvbmVudERlcGVuZGVuY3lBdHRyaWJ1dGU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXREZWZhdWx0UnVudGltZVBhdGg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5pc0NsYXNzRm9sZGVyRW50cnk7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5tb2RpZnlEZXBlbmRlbmN5UGF0aDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbkltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSVNoYXJlZEltYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkuSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZS5DbGFzc3BhdGhFbnRyeVByb3h5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC50YXNrd2l6YXJkLklXaXphcmRIYW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnRhc2t3aXphcmQuV2l6YXJkRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5JUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzOworCitAU3VwcHJlc3NXYXJuaW5ncyggInJlc3RyaWN0aW9uIiApCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBZGRKYXZhQnVpbGRQYXRoRW50cmllc1dpemFyZEZyYWdtZW50IAorCisgICAgZXh0ZW5kcyBXaXphcmRGcmFnbWVudCAKKyAgICAKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1NFTEVDVElPTiA9ICJzZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCisgICAgCisgICAgcHJpdmF0ZSBJV2l6YXJkSGFuZGxlIHdpemFyZDsKKyAgICBwcml2YXRlIFRyZWVWaWV3ZXIgdmlld2VyOworICAgIHByaXZhdGUgSUphdmFQcm9qZWN0IGpwcm9qOworICAgIAorICAgIHB1YmxpYyBBZGRKYXZhQnVpbGRQYXRoRW50cmllc1dpemFyZEZyYWdtZW50KCkgCisgICAgeworICAgICAgICBzZXRDb21wbGV0ZSggZmFsc2UgKTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tcG9zaXRlKCkgCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZSggZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElXaXphcmRIYW5kbGUgaGFuZGxlICkgCisgICAgeworICAgICAgICB0aGlzLndpemFyZCA9IGhhbmRsZTsKKyAgICAgICAgCisgICAgICAgIGhhbmRsZS5zZXRUaXRsZSggUmVzb3VyY2VzLnRpdGxlICk7CisgICAgICAgIGhhbmRsZS5zZXREZXNjcmlwdGlvbiggUmVzb3VyY2VzLmRlc2NyaXB0aW9uICk7CisgICAgICAgIGhhbmRsZS5zZXRJbWFnZURlc2NyaXB0b3IoIEphdmFQbHVnaW5JbWFnZXMuREVTQ19XSVpCQU5fQUREX0xJQlJBUlkgKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7CisgICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoIG5ldyBHcmlkTGF5b3V0KCkgKTsKKyAgICAgICAgCisgICAgICAgIHRoaXMudmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoIGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiApOworCisgICAgICAgIGZpbmFsIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCBHcmlkRGF0YS5GSUxMX0JPVEggKTsKKyAgICAgICAgZ2Qud2lkdGhIaW50ID0gMzkwOworICAgICAgICBnZC5oZWlnaHRIaW50ID0gMTg1OworICAgICAgICAKKyAgICAgICAgdGhpcy52aWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoIGdkICk7CisgICAgICAgIAorICAgICAgICB0aGlzLnZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoIG5ldyBCdWlsZFBhdGhFbnRyaWVzQ29udGVudFByb3ZpZGVyKCkgKTsKKyAgICAgICAgdGhpcy52aWV3ZXIuc2V0TGFiZWxQcm92aWRlciggbmV3IEJ1aWxkUGF0aEVudHJpZXNMYWJlbFByb3ZpZGVyKCkgKTsKKyAgICAgICAgCisgICAgICAgIHRoaXMudmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgorICAgICAgICAoCisgICAgICAgICAgICBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoIGZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgCisgICAgICAgIHRoaXMudmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIKKyAgICAgICAgKAorICAgICAgICAgICAgbmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZG91YmxlQ2xpY2soIGZpbmFsIERvdWJsZUNsaWNrRXZlbnQgZXZlbnQgKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZURvdWJsZUNsaWNrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICAKKyAgICAgICAgZmluYWwgSVByb2plY3QgcHJvaiA9IChJUHJvamVjdCkgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KCBJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLlBST0pFQ1QgKTsKKyAgICAgICAgdGhpcy5qcHJvaiA9IEphdmFDb3JlLmNyZWF0ZSggcHJvaiApOworICAgICAgICAKKyAgICAgICAgdGhpcy52aWV3ZXIuc2V0SW5wdXQoIG5ldyBPYmplY3QoKSApOworCisgICAgICAgIHJldHVybiBjb21wb3NpdGU7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKCkgCisgICAgeworICAgICAgICBmaW5hbCBMaXN0PElDbGFzc3BhdGhFbnRyeT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOworICAgICAgICBmaW5hbCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMudmlld2VyLmdldFNlbGVjdGlvbigpOworICAgICAgICBmaW5hbCBJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQodGhpcy5qcHJvai5nZXRQcm9qZWN0KCkpOworICAgICAgICBmaW5hbCBib29sZWFuIGlzV2ViQXBwID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KCB0aGlzLmpwcm9qLmdldFByb2plY3QoKSApOworICAgICAgICAKKyAgICAgICAgZm9yKCBJdGVyYXRvcjw/PiBpdHIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gaXRyLm5leHQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIG9iaiBpbnN0YW5jZW9mIElDbGFzc3BhdGhFbnRyeSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZU9yaWdpbmFsID0gKElDbGFzc3BhdGhFbnRyeSkgb2JqOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIElQYXRoIHJ1bnRpbWVQYXRoID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZih2aXJ0dWFsQ29tcG9uZW50ID09IG51bGwpeworICAgICAgICAgICAgICAgIAlydW50aW1lUGF0aCA9IGdldERlZmF1bHRSdW50aW1lUGF0aCggaXNXZWJBcHAsIGlzQ2xhc3NGb2xkZXJFbnRyeSggY3BlT3JpZ2luYWwgKSApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgCXJ1bnRpbWVQYXRoID0gZ2V0RGVmYXVsdFJ1bnRpbWVQYXRoKHZpcnR1YWxDb21wb25lbnQsIGNwZU9yaWdpbmFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZVRhZ2dlZCA9IG1vZGlmeURlcGVuZGVuY3lQYXRoKCBjcGVPcmlnaW5hbCwgcnVudGltZVBhdGggKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBsaXN0LmFkZCggY3BlVGFnZ2VkICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdC5jbGVhcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBnZXRUYXNrTW9kZWwoKS5wdXRPYmplY3QoIFBST1BfU0VMRUNUSU9OLCBsaXN0ICk7CisgICAgICAgIAorICAgICAgICBzZXRDb21wbGV0ZSggISBsaXN0LmlzRW1wdHkoKSApOworICAgICAgICB0aGlzLndpemFyZC51cGRhdGUoKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKCkKKyAgICB7CisgICAgICAgIGFkdmFuY2VUb05leHRQYWdlT3JGaW5pc2goKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuanByb2o7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoRW50cnlUZXh0KCBmaW5hbCBJSmF2YVByb2plY3QganByb2osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BlICkKKyAgICB7CisgICAgICAgIGZpbmFsIGludCB0eXBlID0gY3BlLmdldEVudHJ5S2luZCgpOworICAgICAgICAKKyAgICAgICAgaWYoIHR5cGUgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lciggY3BlLmdldFBhdGgoKSwganByb2ogKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCB0eXBlID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIElQYXRoIHBhdGggPSBjcGUuZ2V0UGF0aCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCBwYXRoLmxhc3RTZWdtZW50KCkgKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoICIgLSAiICk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIHBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKCAxICkudG9PU1N0cmluZygpICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIGNwZS5nZXRQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0Q2xhc3NwYXRoRW50cnlJbWFnZSggZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZSApCisgICAgeworICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IGNwZS5nZXRFbnRyeUtpbmQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGltZ0lkOworICAgICAgICAKKyAgICAgICAgaWYoIHR5cGUgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgKQorICAgICAgICB7CisgICAgICAgICAgICBpbWdJZCA9IElTaGFyZWRJbWFnZXMuSU1HX09CSlNfTElCUkFSWTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCB0eXBlID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGltZ0lkID0gSVNoYXJlZEltYWdlcy5JTUdfT0JKU19KQVI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFICkKKyAgICAgICAgeworICAgICAgICAgICAgaW1nSWQgPSBJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0NMQVNTUEFUSF9WQVJfRU5UUlk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbWdJZCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiAoIGltZ0lkID09IG51bGwgPyBudWxsIDogSmF2YVVJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKCBpbWdJZCApICk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBCdWlsZFBhdGhFbnRyaWVzQ29udGVudFByb3ZpZGVyCisgICAgCisgICAgICAgIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIKKyAgICAgICAgCisgICAgeworICAgICAgICBwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoIGZpbmFsIE9iamVjdCBpbnB1dCApIAorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PElDbGFzc3BhdGhFbnRyeT4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhFbnRyeT4oKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8Pz4gZmlsdGVyZWRDb250YWluZXJJZHMgPSBDbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9ucy5nZXQoKS5nZXRGaWx0ZXJlZENsYXNzcGF0aENvbnRhaW5lcklEcygpOworICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIElDbGFzc3BhdGhFbnRyeSBjcGUgOiBnZXRKYXZhUHJvamVjdCgpLmdldFJhd0NsYXNzcGF0aCgpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gY3BlLmdldEVudHJ5S2luZCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gY3BlLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZWxldmFudCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYoIHR5cGUgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcGF0aC5zZWdtZW50Q291bnQoKSA+IDAgJiYgISBmaWx0ZXJlZENvbnRhaW5lcklkcy5jb250YWlucyggcGF0aC5zZWdtZW50KCAwICkgKSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZXZhbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZIHx8IHR5cGUgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRSAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFudCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmKCByZWxldmFudCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjaGVja0ZvckNvbXBvbmVudERlcGVuZGVuY3lBdHRyaWJ1dGUoIGNwZSwgRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGUuQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05ERVBFTkRFTkNZICkgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZXZhbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYoIHJlbGV2YW50ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIE9iamVjdCBkaXJlY3RpdmUgOiAoTGlzdDw/PikgZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KCBJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkFMTF9ESVJFQ1RJVkVTICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBkaXJlY3RpdmUgaW5zdGFuY2VvZiBDbGFzc3BhdGhFbnRyeVByb3h5ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzcGF0aEVudHJ5UHJveHkgcHJveHkgPSAoQ2xhc3NwYXRoRW50cnlQcm94eSkgZGlyZWN0aXZlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHR5cGUgPT0gcHJveHkuZW50cnkuZ2V0RW50cnlLaW5kKCkgJiYgcGF0aC5lcXVhbHMoIHByb3h5LmVudHJ5LmdldFBhdGgoKSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmb3VuZCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZXZhbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYoIHJlbGV2YW50ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKCBjcGUgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzLnRvQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCBmaW5hbCBPYmplY3QgZWxlbWVudCApIAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKCBlbGVtZW50IGluc3RhbmNlb2YgSUNsYXNzcGF0aEVudHJ5ICkgJiYgCisgICAgICAgICAgICAgICAgICAgKCAoIChJQ2xhc3NwYXRoRW50cnkpIGVsZW1lbnQgKS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiApOworICAgICAgICB9CisgICAgCisgICAgICAgIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbiggZmluYWwgT2JqZWN0IHBhcmVudCApIAorICAgICAgICB7CisgICAgICAgICAgICBpZiggcGFyZW50IGluc3RhbmNlb2YgSUNsYXNzcGF0aEVudHJ5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BlID0gKElDbGFzc3BhdGhFbnRyeSkgcGFyZW50OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKCBjcGUuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxDaGlsZENsYXNzcGF0aEVudHJ5PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Q2hpbGRDbGFzc3BhdGhFbnRyeT4oKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lciggY3BlLmdldFBhdGgoKSwgZ2V0SmF2YVByb2plY3QoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggY29udGFpbmVyICE9IG51bGwgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggSUNsYXNzcGF0aEVudHJ5IGNoaWxkIDogY29udGFpbmVyLmdldENsYXNzcGF0aEVudHJpZXMoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQoIG5ldyBDaGlsZENsYXNzcGF0aEVudHJ5KCBjcGUsIGNoaWxkICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbIDAgXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCBmaW5hbCBPYmplY3QgZWxlbWVudCApIAorICAgICAgICB7CisgICAgICAgICAgICBpZiggZWxlbWVudCBpbnN0YW5jZW9mIENoaWxkQ2xhc3NwYXRoRW50cnkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoIChDaGlsZENsYXNzcGF0aEVudHJ5KSBlbGVtZW50ICkucGFyZW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZCggZmluYWwgVmlld2VyIHZpZXdlciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9sZElucHV0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgbmV3SW5wdXQgKSAKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIAorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBCdWlsZFBhdGhFbnRyaWVzTGFiZWxQcm92aWRlcgorICAgIAorICAgICAgICBleHRlbmRzIExhYmVsUHJvdmlkZXIKKyAgICAgICAgCisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCBmaW5hbCBPYmplY3QgZWxlbWVudCApIAorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BlOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggZWxlbWVudCBpbnN0YW5jZW9mIElDbGFzc3BhdGhFbnRyeSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3BlID0gKElDbGFzc3BhdGhFbnRyeSkgZWxlbWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjcGUgPSAoIChDaGlsZENsYXNzcGF0aEVudHJ5KSBlbGVtZW50ICkuZW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJldHVybiBnZXRDbGFzc3BhdGhFbnRyeVRleHQoIGdldEphdmFQcm9qZWN0KCksIGNwZSApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSggZmluYWwgT2JqZWN0IGVsZW1lbnQgKSAKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGNwZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRW50cnkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNwZSA9IChJQ2xhc3NwYXRoRW50cnkpIGVsZW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3BlID0gKCAoQ2hpbGRDbGFzc3BhdGhFbnRyeSkgZWxlbWVudCApLmVudHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3NwYXRoRW50cnlJbWFnZSggZ2V0SmF2YVByb2plY3QoKSwgY3BlICk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ2hpbGRDbGFzc3BhdGhFbnRyeQorICAgIHsKKyAgICAgICAgcHVibGljIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBwYXJlbnQ7CisgICAgICAgIHB1YmxpYyBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnk7CisgICAgICAgIAorICAgICAgICBwdWJsaWMgQ2hpbGRDbGFzc3BhdGhFbnRyeSggZmluYWwgSUNsYXNzcGF0aEVudHJ5IHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICAgICAgdGhpcy5lbnRyeSA9IGVudHJ5OworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzIGV4dGVuZHMgTkxTCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0aXRsZTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgIAorICAgICAgICBzdGF0aWMKKyAgICAgICAgeworICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBBZGRKYXZhQnVpbGRQYXRoRW50cmllc1dpemFyZEZyYWdtZW50LmNsYXNzLmdldE5hbWUoKSwgUmVzb3VyY2VzLmNsYXNzICk7CisgICAgICAgIH0KKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvQWRkSmF2YUJ1aWxkUGF0aEVudHJpZXNXaXphcmRGcmFnbWVudC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0FkZEphdmFCdWlsZFBhdGhFbnRyaWVzV2l6YXJkRnJhZ21lbnQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjVlNjU5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0FkZEphdmFCdWlsZFBhdGhFbnRyaWVzV2l6YXJkRnJhZ21lbnQucHJvcGVydGllcwpAQCAtMCwwICsxLDIgQEAKK3RpdGxlID0gSmF2YSBCdWlsZCBQYXRoIEVudHJpZXMKK2Rlc2NyaXB0aW9uID0gU2VsZWN0IGJ1aWxkIHBhdGggZW50cmllcyB0byBpbmNsdWRlIGluIHRoZSBkZXBsb3ltZW50IGFzc2VtYmx5LgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0RvdWJsZUNoZWNrYm94VGFibGVJdGVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvRG91YmxlQ2hlY2tib3hUYWJsZUl0ZW0uamF2YQppbmRleCA3ZmZiNWE5Li5hNGI2ZTQ2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvRG91YmxlQ2hlY2tib3hUYWJsZUl0ZW0uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvRG91YmxlQ2hlY2tib3hUYWJsZUl0ZW0uamF2YQpAQCAtOTAsNiArOTAsNyBAQAogCQlyZXR1cm4gc2Vjb25kQ2hlY2tCb3g7IAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewogCQlkaXNwb3NlU2Vjb25kQ2hlY2tib3goKTsKIAkJc3VwZXIuZGlzcG9zZSgpOwpAQCAtMTA4LDYgKzEwOSw3IEBACiAJCXRoaXMudGJsTHN0bnIgPSB0YmxMc3RucjsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY2hlY2tTdWJjbGFzcyAoKSB7fQogCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvRG91YmxlQ2hlY2tib3hUYWJsZVZpZXdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0RvdWJsZUNoZWNrYm94VGFibGVWaWV3ZXIuamF2YQppbmRleCBmODM3YjkyLi4zMTUxMGY0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvRG91YmxlQ2hlY2tib3hUYWJsZVZpZXdlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9Eb3VibGVDaGVja2JveFRhYmxlVmlld2VyLmphdmEKQEAgLTM1LDEyICszNSwxNCBAQAogICAgICAgICBtU2Vjb25kQ2hlY2tib3hDb2x1bW5JbmRleCA9IHNlY29uZENoZWNrQm94Q29sdW1uSW5kZXg7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKElDaGVja1N0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBhZGRDaGVja1N0YXRlTGlzdGVuZXIoSUNoZWNrU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgIAlzdXBlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobGlzdGVuZXIpOwogICAgIAlsc3RuciA9IGxpc3RlbmVyOwogICAgIH0KIAkKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDaGVja1N0YXRlTGlzdGVuZXIoSUNoZWNrU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIEBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlbW92ZUNoZWNrU3RhdGVMaXN0ZW5lcihJQ2hlY2tTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgCXN1cGVyLnJlbW92ZUNoZWNrU3RhdGVMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgCWxzdG5yID0gbnVsbDsKICAgICAJZ2V0VGFibGUoKS5nZXRJdGVtcygpOwpAQCAtNTAsNiArNTIsNyBAQAogICAgIAl9CiAgICAgfQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBWaWV3ZXJSb3cgaW50ZXJuYWxDcmVhdGVOZXdSb3dQYXJ0KGludCBzdHlsZSwgaW50IHJvd0luZGV4KSB7CiAJCURvdWJsZUNoZWNrYm94VGFibGVJdGVtIGl0ZW07CiAJCWlmIChyb3dJbmRleCA+PSAwKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvSUphdmFFRURlcGxveW1lbnRBc3NlbWJseVNlY3Rpb25CdWlsZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvSUphdmFFRURlcGxveW1lbnRBc3NlbWJseVNlY3Rpb25CdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3NGMyOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9JSmF2YUVFRGVwbG95bWVudEFzc2VtYmx5U2VjdGlvbkJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlLkFkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlLkNvbXBvbmVudFJlc291cmNlUHJveHk7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUphdmFFRURlcGxveW1lbnRBc3NlbWJseVNlY3Rpb25CdWlsZGVyIHsKKworCS8qKgorCSAqIEJ1aWxkcyB0aGUgc2VjdGlvbgorCSAqIEBwYXJhbSBwYXJlbnQgLSBUaGUgY29tcG9zaXRlIHRvIHdoaWNoIHRoaXMgc2VjdGlvbiB3aWxsIGJlIGFkZGVkCisJICovCisJcHVibGljIHZvaWQgYnVpbGRTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQpOworCisJcHVibGljIHZvaWQgbG9hZENvbnRlbnRzKCk7CisKKwlwdWJsaWMgYm9vbGVhbiBzYXZlQ29udGVudHMoKTsKKwkKKwlwdWJsaWMgdm9pZCBkaXJlY3RpdmVBZGRlZChPYmplY3QgZWxlbWVudCk7CisJCisJcHVibGljIHZvaWQgZGlyZWN0aXZlUmVtb3ZlZChPYmplY3QgZWxlbWVudCk7CisJCisJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoSVN0YXR1cyBjdXJyZW50U3RhdHVzKTsKKworCXB1YmxpYyB2b2lkIGNvbXBvbmVudFJlc291cmNlTW9kaWZpZWQoQ29tcG9uZW50UmVzb3VyY2VQcm94eSBvcmlnaW5hbFJlc291cmNlLCBDb21wb25lbnRSZXNvdXJjZVByb3h5IG1vZGlmaWVkUmVzb3VyY2UpOworCQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0oyRUVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvSjJFRURlcGVuZGVuY3lQYWdlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODYwZjVkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0oyRUVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBSZWQgSGF0IGFuZCBPdGhlcnMKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCisgKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIG1pc2MuIFVJIGNsZWFudXAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuSmF2YU1vZHVsZUNvbXBvbmVudFV0aWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi51aS5pbnRlcm5hbC5hc3NlbWJseS53aXphcmQuTWFuaWZlc3RNb2R1bGVEZXBlbmRlbmN5Q29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuSURlcGVuZGVuY3lQYWdlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5JTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlLk1vZHVsZUFzc2VtYmx5Um9vdFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgSjJFRURlcGVuZGVuY3lQYWdlUHJvdmlkZXIgaW1wbGVtZW50cyBJRGVwZW5kZW5jeVBhZ2VQcm92aWRlciB7CisKKwlwcml2YXRlIElNb2R1bGVEZXBlbmRlbmNpZXNDb250cm9sW10gY29udHJvbHM7CisJCisJcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlKElGYWNldGVkUHJvamVjdCBwcm9qZWN0KSB7CisJCXJldHVybiBpc0phdmFFRU5vdEVhcldlYihwcm9qZWN0KTsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0phdmFFRU5vdEVhcldlYihJRmFjZXRlZFByb2plY3QgZnApIHsKKwkJcmV0dXJuIGZwLmhhc1Byb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRSkpIHx8CisJCQkJZnAuaGFzUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9BUFBDTElFTlRfTU9EVUxFKSkgfHwKKwkJCQkJCWZwLmhhc1Byb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfQ09OTkVDVE9SX01PRFVMRSkpIHx8CisJCQkJCQlmcC5oYXNQcm9qZWN0RmFjZXQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuSlNUX1VUSUxJVFlfTU9EVUxFKSkgfHwKKwkJCQkJCWZwLmhhc1Byb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCRlJBR01FTlRfTU9EVUxFKSk7CisJfQorCisJcHVibGljIElNb2R1bGVEZXBlbmRlbmNpZXNDb250cm9sW10gY3JlYXRlUGFnZXMoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QsCisJCQlNb2R1bGVBc3NlbWJseVJvb3RQYWdlIHBhcmVudCkgeworCQkKKwkJaWYoIGlzU3RhbmRhbG9uZShwcm9qZWN0LmdldFByb2plY3QoKSkpIAorCQkJcmV0dXJuIG5ldyBJTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbFtdIHsKKwkJCQluZXcgSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZShwcm9qZWN0LmdldFByb2plY3QoKSwgcGFyZW50KX07CisJCQorCQlyZXR1cm4gbmV3IElNb2R1bGVEZXBlbmRlbmNpZXNDb250cm9sW10geyAKKwkJCQluZXcgSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZShwcm9qZWN0LmdldFByb2plY3QoKSwgcGFyZW50KSwKKwkJCQluZXcgTWFuaWZlc3RNb2R1bGVEZXBlbmRlbmN5Q29udHJvbChwcm9qZWN0LmdldFByb2plY3QoKSwgcGFyZW50KX07CisJCQorCX0KKwkKKwkvKgorCSAqIFRoaXMgbm93IGFsbG93cyBleHRlbmRlcnMgdG8gc2F5IHdoZXRoZXIgdGhpcyBwcm9qZWN0IGlzIHN0YW5kYWxvbmUgb3Igbm90CisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNTdGFuZGFsb25lKElQcm9qZWN0IHByb2plY3QpIHsKKwkJcmV0dXJuIEphdmFNb2R1bGVDb21wb25lbnRVdGlsaXR5LmZpbmRQYXJlbnRQcm9qZWN0cyhwcm9qZWN0KS5sZW5ndGggPT0gMDsKKwl9CisKKwlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZVJvb3RDb250cm9sKElGYWNldGVkUHJvamVjdCBwcm9qZWN0LElNb2R1bGVEZXBlbmRlbmNpZXNDb250cm9sW10gcGFnZXMsCisJCQlDb21wb3NpdGUgcGFyZW50KSB7CisJCQorCQlpZiggaXNTdGFuZGFsb25lKHByb2plY3QuZ2V0UHJvamVjdCgpKSkKKwkJCXJldHVybiBwYWdlc1swXS5jcmVhdGVDb250ZW50cyhwYXJlbnQpOworCQkKKwkJZmluYWwgVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBUYWJGb2xkZXIocGFyZW50LCBTV1QuTEVGVCk7CisJCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKKwkJZm9sZGVyLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CisKKwkJLy8gQ3JlYXRlIHRoZSB0d28gdGFicyAKKwkJY29udHJvbHMgPSBuZXcgSU1vZHVsZURlcGVuZGVuY2llc0NvbnRyb2xbMl07CisJCWNvbnRyb2xzWzBdID0gcGFnZXNbMF07CisJCWNvbnRyb2xzWzFdID0gcGFnZXNbMV07CisJCQorCQlUYWJJdGVtIHRhYiA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOworCQl0YWIuc2V0Q29udHJvbChjcmVhdGUoY29udHJvbHNbMF0sZm9sZGVyKSk7CisJCXRhYi5zZXRUZXh0KE1lc3NhZ2VzLkoyRUVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyXzQpOworCQl0YWIgPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKKwkJdGFiLnNldENvbnRyb2woY3JlYXRlKGNvbnRyb2xzWzFdLGZvbGRlcikpOworCQl0YWIuc2V0VGV4dChNZXNzYWdlcy5KMkVFRGVwZW5kZW5jeVBhZ2VQcm92aWRlcl81KTsgCisJCisJCWZvbGRlci5zZXRTZWxlY3Rpb24oMCk7CisJCXJldHVybiBmb2xkZXI7CisJfQorCQorCXByaXZhdGUgc3RhdGljIENvbnRyb2wgY3JlYXRlKCBmaW5hbCBJTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbCBjb250cm9sLAorCQkJICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb21wb3NpdGUgcGFyZW50ICkKKwl7CisJCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXQoIG5ldyBHcmlkTGF5b3V0KCkgKTsKKwkJZmluYWwgQ29tcG9zaXRlIGlubmVyID0gY29udHJvbC5jcmVhdGVDb250ZW50cyggY29tcG9zaXRlICk7CisJCWlubmVyLnNldExheW91dERhdGEoIG5ldyBHcmlkRGF0YSggR3JpZERhdGEuRklMTF9CT1RIICkgKTsKKwkJCisJCXJldHVybiBjb21wb3NpdGU7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzV2ViKElGYWNldGVkUHJvamVjdCBwcm9qZWN0KSB7CisJCXJldHVybiBwcm9qZWN0Lmhhc1Byb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSkpOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRpdGxlKElQcm9qZWN0IHByb2plY3QpIHsKKwkJCisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChwcm9qZWN0KSkKKwkJCXJldHVybiBNZXNzYWdlcy5KMkVFRGVwZW5kZW5jeVBhZ2VQcm92aWRlcl8xOworCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0KSkKKwkJCXJldHVybiBNZXNzYWdlcy5KMkVFRGVwZW5kZW5jeVBhZ2VQcm92aWRlcl8yOworCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdCkpCisJCQlyZXR1cm4gTWVzc2FnZXMuSjJFRURlcGVuZGVuY3lQYWdlUHJvdmlkZXJfMzsKKwkJcmV0dXJuIE1lc3NhZ2VzLkoyRUVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyXzQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0oyRUVNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGE4YTZiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0oyRUVNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2UuamF2YQpAQCAtMCwwICsxLDQ3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIFJlZCBIYXQgYW5kIE90aGVycworICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKKyAqICAgIENodWNrIEJyaWRnaGFtIC0gYWRkaXRpb25hbCBzdXBwb3J0CisgKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIG1pc2MuIFVJIGNsZWFudXAKKyAqICAgIFJvYmVydG8gU2FuY2hleiAtIEFkZCBBZHZhbmNlZCBzZWN0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlLklKYXZhUHJvamVjdExpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuamF2YWxpdGUuSmF2YUNvcmVMaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLkphdmFFRU1vZHVsZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5JTW9kdWxlSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5UYXNrTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZC5UYXNrV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5JUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5Qcm9qZWN0Q29udmVydGVyT3BlcmF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5Nb2R1bGVBc3NlbWJseVJvb3RQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKKworcHVibGljIGNsYXNzIEoyRUVNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2UgZXh0ZW5kcworCQlBZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZSB7CisJCisJcHJpdmF0ZSBJSmF2YUVFRGVwbG95bWVudEFzc2VtYmx5U2VjdGlvbkJ1aWxkZXIgYWR2YW5jZWRIZWxwZXI7CisKKwlwdWJsaWMgSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZShJUHJvamVjdCBwcm9qZWN0LAorCQkJTW9kdWxlQXNzZW1ibHlSb290UGFnZSBwYWdlKSB7CisJCXN1cGVyKHByb2plY3QsIHBhZ2UpOworCQlhZHZhbmNlZEhlbHBlciA9IGdldEFkdmFuY2VkU2VjdGlvbkJ1aWxkZXIoKTsKKwl9CisJCisJcHVibGljIGNsYXNzIENsYXNzcGF0aEVudHJ5UHJveHkgeworCQlwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IGVudHJ5OworCQlwdWJsaWMgQ2xhc3NwYXRoRW50cnlQcm94eShJQ2xhc3NwYXRoRW50cnkgZW50cnkpeworCQkJdGhpcy5lbnRyeSA9IGVudHJ5OworCQl9CisJfQorCQorCXByb3RlY3RlZCBMaXN0IDxJQ2xhc3NwYXRoRW50cnk+IG9yaWdpbmFsQ2xhc3NwYXRoRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOyAKKwlwcm90ZWN0ZWQgTGlzdCA8Q2xhc3NwYXRoRW50cnlQcm94eT4gY3VycmVudENsYXNzcGF0aEVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PENsYXNzcGF0aEVudHJ5UHJveHk+KCk7IAorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7CisJCXN1cGVyLmluaXRpYWxpemUoKTsKKwkJcmVzZXRDbGFzc3BhdGhFbnRyaWVzKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCUdyaWREYXRhIGdEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdEYXRhKTsKKwkJZmlsbFRhYmxlQ29tcG9zaXRlKGNvbXBvc2l0ZSk7CQkKKwkJYWRkQWR2YW5jZWRDb21wb3NpdGUoY29tcG9zaXRlKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgcmVzZXRDbGFzc3BhdGhFbnRyaWVzKCkgeworCQlvcmlnaW5hbENsYXNzcGF0aEVudHJpZXMuY2xlYXIoKTsKKwkJY3VycmVudENsYXNzcGF0aEVudHJpZXMuY2xlYXIoKTsKKwkJb3JpZ2luYWxDbGFzc3BhdGhFbnRyaWVzLmFkZEFsbChyZWFkUmF3RW50cmllcygpKTsKKwkJZm9yKElDbGFzc3BhdGhFbnRyeSBlbnRyeTpvcmlnaW5hbENsYXNzcGF0aEVudHJpZXMpeworCQkJY3VycmVudENsYXNzcGF0aEVudHJpZXMuYWRkKG5ldyBDbGFzc3BhdGhFbnRyeVByb3h5KGVudHJ5KSk7CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7CisJCXJlc2V0Q2xhc3NwYXRoRW50cmllcygpOworCQlpZiAoYWR2YW5jZWRIZWxwZXIgIT0gbnVsbCkKKwkJCWFkdmFuY2VkSGVscGVyLmxvYWRDb250ZW50cygpOworCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKKwl9CisJCisJcHJvdGVjdGVkIExpc3QgPElDbGFzc3BhdGhFbnRyeT4gcmVhZFJhd0VudHJpZXMoKXsKKwkJcmV0dXJuIHJlYWRSYXdFbnRyaWVzKHJvb3RDb21wb25lbnQpOworCX0KKwkJCisJcHVibGljIHN0YXRpYyBMaXN0IDxJQ2xhc3NwYXRoRW50cnk+IHJlYWRSYXdFbnRyaWVzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCl7CisJCUxpc3QgPElDbGFzc3BhdGhFbnRyeT4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOworCQlpZiAoIWNvbXBvbmVudC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpeworCQkJcmV0dXJuIGVudHJpZXM7CisJCX0KKwkJSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUgPSBKYXZhQ29yZUxpdGUuY3JlYXRlKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOworCQl0cnkgeworCQkJTWFwPElDbGFzc3BhdGhFbnRyeSwgSUNsYXNzcGF0aEF0dHJpYnV0ZT4gcmF3Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UmF3Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGphdmFQcm9qZWN0TGl0ZSwgRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGUuQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZKTsKKwkJCWVudHJpZXMuYWRkQWxsKHJhd0NvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcy5rZXlTZXQoKSk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9CisJCXJldHVybiBlbnRyaWVzOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBwb3N0SGFuZGxlQ2hhbmdlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlbW92ZWQoQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiByZW1vdmVkKSB7CisJCXN1cGVyLmhhbmRsZVJlbW92ZWQocmVtb3ZlZCk7CisJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGVFQVIocm9vdENvbXBvbmVudC5nZXRQcm9qZWN0KCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IHNlbGVjdGVkSXRlbSkgeworCQlpZihzZWxlY3RlZEl0ZW0gaW5zdGFuY2VvZiBDbGFzc3BhdGhFbnRyeVByb3h5KXsKKwkJCUNsYXNzcGF0aEVudHJ5UHJveHkgZW50cnkgPSAoQ2xhc3NwYXRoRW50cnlQcm94eSlzZWxlY3RlZEl0ZW07CisJCQljdXJyZW50Q2xhc3NwYXRoRW50cmllcy5yZW1vdmUoZW50cnkpOworCQl9IGVsc2UgeworCQkJc3VwZXIucmVtb3ZlKHNlbGVjdGVkSXRlbSk7CisJCX0KKwkJaWYgKGFkdmFuY2VkSGVscGVyICE9IG51bGwpCisJCQlhZHZhbmNlZEhlbHBlci5kaXJlY3RpdmVSZW1vdmVkKHNlbGVjdGVkSXRlbSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlQXNzZW1ibHlSb290UGFnZURlc2NyaXB0aW9uKCkgeworCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QocHJvamVjdCkpCisJCQlyZXR1cm4gTWVzc2FnZXMuSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV8zOworCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0KSkKKwkJCXJldHVybiBNZXNzYWdlcy5KMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlXzQ7CisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChwcm9qZWN0KSkKKwkJCXJldHVybiBNZXNzYWdlcy5KMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlXzU7CisJCXJldHVybiBzdXBlci5nZXRNb2R1bGVBc3NlbWJseVJvb3RQYWdlRGVzY3JpcHRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSU1vZHVsZUhhbmRsZXIgZ2V0TW9kdWxlSGFuZGxlcigpIHsKKwkJaWYobW9kdWxlSGFuZGxlciA9PSBudWxsKQorCQkJbW9kdWxlSGFuZGxlciA9IG5ldyBKYXZhRUVNb2R1bGVIYW5kbGVyKCk7CisJCXJldHVybiBtb2R1bGVIYW5kbGVyOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21SZWZlcmVuY2VXaXphcmRQcm9wZXJ0aWVzKFRhc2tNb2RlbCBtb2RlbCkgeworCQltb2RlbC5wdXRPYmplY3QoSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5QUk9KRUNUX0NPTlZFUlRFUl9PUEVSQVRJT05fUFJPVklERVIsIGdldENvbnZlcnRlclByb3ZpZGVyKCkpOworCX0KKwkKKwlwdWJsaWMgUHJvamVjdENvbnZlcnRlck9wZXJhdGlvblByb3ZpZGVyIGdldENvbnZlcnRlclByb3ZpZGVyKCkgeworCQlyZXR1cm4gbmV3IFByb2plY3RDb252ZXJ0ZXJPcGVyYXRpb25Qcm92aWRlcigpIHsKKwkJCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldENvbnZlcnNpb25PcGVyYXRpb24oSVByb2plY3QgcHJvamVjdCkgeworCQkJCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5jcmVhdGVGbGV4SmF2YVByb2plY3RGb3JQcm9qZWN0T3BlcmF0aW9uKHByb2plY3QpOworCQkJfQorCQl9OworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlciBjcmVhdGVQcm92aWRlcigpIHsKKwkJSmF2YUVFQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBKYXZhRUVDb21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyKHRoaXMpOworCQlwcm92aWRlci5zZXRDbGFzc3BhdGhFbnRyaWVzKGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzKTsKKwkJcmV0dXJuIHByb3ZpZGVyOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW1vdmUoT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7CisJCXJldHVybiBzdXBlci5jYW5SZW1vdmUoc2VsZWN0ZWRPYmplY3QpICYmICEoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBKYXZhRUVDb21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyLkNvbnN1bWVkQ2xhc3NwYXRoRW50cnlQcm94eSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBSdW50aW1lUGF0aENlbGxNb2RpZmllciBnZXRSdW50aW1lUGF0aENlbGxNb2RpZmllcigpIHsKKwkJcmV0dXJuIG5ldyBBZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZS5SdW50aW1lUGF0aENlbGxNb2RpZmllcigpeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeworCQkJCWlmKCBwcm9wZXJ0eS5lcXVhbHMoREVQTE9ZX1BBVEhfUFJPUEVSVFkpICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBDbGFzc3BhdGhFbnRyeVByb3h5KSB7CisJCQkJCXJldHVybiB0cnVlOyAKKwkJCQl9CisJCQkJcmV0dXJuIHN1cGVyLmNhbk1vZGlmeShlbGVtZW50LCBwcm9wZXJ0eSk7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7CisJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzcGF0aEVudHJ5UHJveHkpeworCQkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSAoKENsYXNzcGF0aEVudHJ5UHJveHkpZWxlbWVudCkuZW50cnk7CisJCQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UnVudGltZVBhdGgoZW50cnkpOworCQkJCQlpZihydW50aW1lUGF0aC5pc1Jvb3QoKSkKKwkJCQkJCXJldHVybiBydW50aW1lUGF0aC50b1N0cmluZygpOworCQkJCQlyZXR1cm4gcnVudGltZVBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKKwkJCQl9CisJCQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlKGVsZW1lbnQsIHByb3BlcnR5KTsKKwkJCX0KKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7CisJCQkJQ29tcG9uZW50UmVzb3VyY2VQcm94eSBvcmlnaW5hbFJlc291cmNlID0gbnVsbDsKKwkJCQlDb21wb25lbnRSZXNvdXJjZVByb3h5IG1vZGlmaWVkUmVzb3VyY2UgPSBudWxsOworCQkJCWlmIChwcm9wZXJ0eS5lcXVhbHMoREVQTE9ZX1BBVEhfUFJPUEVSVFkpKSB7CQkJCQkKKwkJCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgZWxlbWVudDsKKwkJCQkJaWYoIGl0ZW0uZ2V0RGF0YSgpIGluc3RhbmNlb2YgQ29tcG9uZW50UmVzb3VyY2VQcm94eSkgeworCQkJCQkJbW9kaWZpZWRSZXNvdXJjZSA9IChDb21wb25lbnRSZXNvdXJjZVByb3h5KWl0ZW0uZ2V0RGF0YSgpOworCQkJCQkJb3JpZ2luYWxSZXNvdXJjZSA9IG5ldyBDb21wb25lbnRSZXNvdXJjZVByb3h5KG1vZGlmaWVkUmVzb3VyY2Uuc291cmNlLCBtb2RpZmllZFJlc291cmNlLnJ1bnRpbWVQYXRoKTsJCQkJCQkKKwkJCQkJfQorCQkJCQlpZihpdGVtLmdldERhdGEoKSBpbnN0YW5jZW9mIENsYXNzcGF0aEVudHJ5UHJveHkpeworCQkJCQkJVHJlZUl0ZW1bXSBjb21wb25lbnRzID0gYXZhaWxhYmxlQ29tcG9uZW50c1ZpZXdlci5nZXRUcmVlKCkuZ2V0SXRlbXMoKTsKKwkJCQkJCWludCB0YWJsZUluZGV4ID0gLTE7CisJCQkJCQlmb3IoaW50IGk9MDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCQlpZihjb21wb25lbnRzW2ldID09IGl0ZW0pIHsKKwkJCQkJCQkJdGFibGVJbmRleCA9IGk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCUNsYXNzcGF0aEVudHJ5UHJveHkgcHJveHkgPSAoQ2xhc3NwYXRoRW50cnlQcm94eSlpdGVtLmdldERhdGEoKTsKKwkJCQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoKChTdHJpbmcpdmFsdWUpLnRyaW0oKSkubWFrZVJlbGF0aXZlKCk7CisJCQkJCQlpZihydW50aW1lUGF0aC5pc0VtcHR5KCkpCisJCQkJCQkJcnVudGltZVBhdGggPSBydW50aW1lUGF0aC5tYWtlQWJzb2x1dGUoKTsKKwkJCQkJCWlmKHRhYmxlSW5kZXggPj0gMCkKKwkJCQkJCQljb21wb25lbnRzW3RhYmxlSW5kZXhdLnNldFRleHQoQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuREVQTE9ZX0NPTFVNTiwgcnVudGltZVBhdGgudG9TdHJpbmcoKSk7CisJCQkJCQlpZighQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuaXNNYXBwZWRJbnRvQ29udGFpbmVyKHJ1bnRpbWVQYXRoLnRvU3RyaW5nKCkpKQorCQkJCQkJCXJ1bnRpbWVQYXRoID0gcnVudGltZVBhdGgubWFrZUFic29sdXRlKCk7CisJCQkJCQlJQ2xhc3NwYXRoRW50cnkgbmV3RW50cnkgPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5tb2RpZnlEZXBlbmRlbmN5UGF0aChwcm94eS5lbnRyeSwgcnVudGltZVBhdGgpOworCQkJCQkJcHJveHkuZW50cnkgPSBuZXdFbnRyeTsKKwkJCQkJCXJlc291cmNlTWFwcGluZ3NDaGFuZ2VkID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlzdXBlci5tb2RpZnkoZWxlbWVudCwgcHJvcGVydHksIHZhbHVlKTsKKwkJCQlpZiAob3JpZ2luYWxSZXNvdXJjZSAhPSBudWxsICYmIGFkdmFuY2VkSGVscGVyICE9IG51bGwpCisJCQkJCWFkdmFuY2VkSGVscGVyLmNvbXBvbmVudFJlc291cmNlTW9kaWZpZWQob3JpZ2luYWxSZXNvdXJjZSwgbW9kaWZpZWRSZXNvdXJjZSk7CisJCQl9CisJCX07CisJfQorCQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIHNhdmVSZWZlcmVuY2VDaGFuZ2VzKCkgeworCQlib29sZWFuIHN1YlJlc3VsdCA9IHN1cGVyLnNhdmVSZWZlcmVuY2VDaGFuZ2VzKCk7CisJCWlmKCFzdWJSZXN1bHQpeworCQkJcmV0dXJuIHN1YlJlc3VsdDsKKwkJfQorCQlNYXAgPElQYXRoLCBJQ2xhc3NwYXRoRW50cnk+IG1vZGlmaWVkID0gbmV3IEhhc2hNYXAgPElQYXRoLCBJQ2xhc3NwYXRoRW50cnk+KCk7CisJCQorCQlNYXAgPElQYXRoLCBJQ2xhc3NwYXRoRW50cnk+IG9yaWdpbmFsTWFwID0gbmV3IEhhc2hNYXAgPElQYXRoLCBJQ2xhc3NwYXRoRW50cnk+KCk7CisJCWZvcihJQ2xhc3NwYXRoRW50cnkgb3JpZ2luYWxFbnRyeSA6IG9yaWdpbmFsQ2xhc3NwYXRoRW50cmllcyl7CisJCQlvcmlnaW5hbE1hcC5wdXQob3JpZ2luYWxFbnRyeS5nZXRQYXRoKCksIG9yaWdpbmFsRW50cnkpOworCQl9CisKKwkJZm9yKENsYXNzcGF0aEVudHJ5UHJveHkgcHJveHk6IGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzKXsKKwkJCUlDbGFzc3BhdGhFbnRyeSBjdXJyZW50RW50cnkgPSBwcm94eS5lbnRyeTsKKwkJCUlQYXRoIHBhdGggPSBjdXJyZW50RW50cnkuZ2V0UGF0aCgpOworCQkJSUNsYXNzcGF0aEVudHJ5IG9yaWdpbmFsRW50cnkgPSBvcmlnaW5hbE1hcC5yZW1vdmUocGF0aCk7CisJCQlpZihjdXJyZW50RW50cnkuZXF1YWxzKG9yaWdpbmFsRW50cnkpKXsKKwkJCQkvL25vIGNoYW5nZQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbW9kaWZpZWQucHV0KHBhdGgsIGN1cnJlbnRFbnRyeSk7CisJCX0KKwkJCisJCU1hcCA8SVBhdGgsIElDbGFzc3BhdGhFbnRyeT4gcmVtb3ZlZCA9IG9yaWdpbmFsTWFwOworCQkKKwkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHJvb3RDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKKwkJdHJ5IHsKKwkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeSBbXSByYXdDbGFzc3BhdGggPSBqYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKKwkJCUxpc3QgPElDbGFzc3BhdGhFbnRyeT4gbmV3Q2xhc3NwYXRoID0gbmV3IEFycmF5TGlzdCA8SUNsYXNzcGF0aEVudHJ5PigpOworCQkJZm9yKElDbGFzc3BhdGhFbnRyeSBlbnRyeTpyYXdDbGFzc3BhdGgpeworCQkJCUlQYXRoIHBhdGggPSBlbnRyeS5nZXRQYXRoKCk7CisJCQkJaWYocmVtb3ZlZC5jb250YWluc0tleShwYXRoKSl7CisJCQkJCS8vdXNlciByZW1vdmVkIGVudHJ5CisJCQkJCUlDbGFzc3BhdGhFbnRyeSBuZXdFbnRyeSA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLm1vZGlmeURlcGVuZGVuY3lQYXRoKGVudHJ5LCBudWxsKTsKKwkJCQkJbmV3Q2xhc3NwYXRoLmFkZChuZXdFbnRyeSk7CisJCQkJfSBlbHNlIGlmKG1vZGlmaWVkLmNvbnRhaW5zS2V5KHBhdGgpKXsKKwkJCQkJLy91c2VyIGNoYW5nZWQgcGF0aCB2YWx1ZQorCQkJCQlJQ2xhc3NwYXRoRW50cnkgbmV3RW50cnkgPSBtb2RpZmllZC5nZXQocGF0aCk7CisJCQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UnVudGltZVBhdGgobmV3RW50cnkpOworCQkJCQlpZihydW50aW1lUGF0aC50b1N0cmluZygpLmxlbmd0aCgpID09IDApeworCQkJCQkJLy9wcmV2ZW50IHRoZSB1c2VyIGZyb20gc3BlY2lmeWluZyBubyBwYXRoCisJCQkJCQluZXdFbnRyeSA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLm1vZGlmeURlcGVuZGVuY3lQYXRoKG5ld0VudHJ5LCBuZXcgUGF0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCW5ld0NsYXNzcGF0aC5hZGQobmV3RW50cnkpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vbm8gY2hhbmdlCisJCQkJCW5ld0NsYXNzcGF0aC5hZGQoZW50cnkpOworCQkJCX0KKwkJCX0KKwkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aCggbmV3Q2xhc3NwYXRoLnRvQXJyYXkoIG5ldyBJQ2xhc3NwYXRoRW50cnlbIG5ld0NsYXNzcGF0aC5zaXplKCkgXSApLCBudWxsICk7CisJCQkKKwkJCW9yaWdpbmFsQ2xhc3NwYXRoRW50cmllcy5jbGVhcigpOworCQkJY3VycmVudENsYXNzcGF0aEVudHJpZXMuY2xlYXIoKTsKKwkJCXJlc2V0Q2xhc3NwYXRoRW50cmllcygpOworCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworICAgICAgICAJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFkZERpcmVjdGl2ZSggZmluYWwgVGFza1dpemFyZCB3aXphcmQgKSAKKwl7CisJCWZpbmFsIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBjbGFzc3BhdGhFbnRyaWVzIAorCQkJPSAoTGlzdDxJQ2xhc3NwYXRoRW50cnk+KSB3aXphcmQuZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KCBBZGRKYXZhQnVpbGRQYXRoRW50cmllc1dpemFyZEZyYWdtZW50LlBST1BfU0VMRUNUSU9OICk7CisJCQorCQlpZiggY2xhc3NwYXRoRW50cmllcyAhPSBudWxsICYmICEgY2xhc3NwYXRoRW50cmllcy5pc0VtcHR5KCkgKQorCQl7CisJCQlmb3IoIElDbGFzc3BhdGhFbnRyeSBjcGUgOiBjbGFzc3BhdGhFbnRyaWVzICkKKwkJCXsKKwkJCQl0aGlzLmN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzLmFkZCggbmV3IENsYXNzcGF0aEVudHJ5UHJveHkoIGNwZSApICk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdXBlci5oYW5kbGVBZGREaXJlY3RpdmUod2l6YXJkKTsKKwkJfQorCQlpZiAoYWR2YW5jZWRIZWxwZXIgIT0gbnVsbCkKKwkJCWFkdmFuY2VkSGVscGVyLmRpcmVjdGl2ZUFkZGVkKHdpemFyZC5nZXRUYXNrTW9kZWwoKSk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHZlcmlmeSgpIHsKKwkJcHJvcFBhZ2UucmVmcmVzaFByb2JsZW1zVmlldygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKCkgeworCQlBcnJheUxpc3Q8Q29tcG9uZW50UmVzb3VyY2VQcm94eT4gYWxsTWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0PENvbXBvbmVudFJlc291cmNlUHJveHk+KCk7CisJCWFsbE1hcHBpbmdzLmFkZEFsbChyZXNvdXJjZU1hcHBpbmdzKTsKKwkJYWxsTWFwcGluZ3MuYWRkQWxsKGhpZGRlbk1hcHBpbmdzKTsKKwkJSVN0YXR1cyBzdGF0dXMgPSBKMkVFTW9kdWxlRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXJIZWxwZXIudmVyaWZ5KHJvb3RDb21wb25lbnQsIHJ1bnRpbWUsIGN1cnJlbnRSZWZlcmVuY2VzLCBhbGxNYXBwaW5ncyxyZXNvdXJjZU1hcHBpbmdzQ2hhbmdlZCwgY3VycmVudENsYXNzcGF0aEVudHJpZXMpOworCQlpZiAoYWR2YW5jZWRIZWxwZXIgIT0gbnVsbCkKKwkJCXN0YXR1cyA9IGFkdmFuY2VkSGVscGVyLnZhbGlkYXRlKHN0YXR1cyk7IAorCQlyZXR1cm4gc3RhdHVzOyAKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkQWR2YW5jZWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQlpZiAoYWR2YW5jZWRIZWxwZXIgIT0gbnVsbCkgeworCQkJYWR2YW5jZWRIZWxwZXIuYnVpbGRTZWN0aW9uKHBhcmVudCk7CisJCQlhZHZhbmNlZEhlbHBlci5sb2FkQ29udGVudHMoKTsKKwkJfQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7CisJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7CisJCWlmIChhZHZhbmNlZEhlbHBlciAhPSBudWxsKQorCQkJcmVzdWx0ID0gcmVzdWx0ICYgYWR2YW5jZWRIZWxwZXIuc2F2ZUNvbnRlbnRzKCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCXByb3RlY3RlZCBJSmF2YUVFRGVwbG95bWVudEFzc2VtYmx5U2VjdGlvbkJ1aWxkZXIgZ2V0QWR2YW5jZWRTZWN0aW9uQnVpbGRlcigpeworCQlpZiAoYWR2YW5jZWRIZWxwZXIgPT0gbnVsbCl7CisJCQlhZHZhbmNlZEhlbHBlciA9IG5ldyBKYXZhRUVEZXBsb3ltZW50QXNzZW1ibHlBZHZhbmNlZFNlY3Rpb25CdWlsZGVyKHJvb3RDb21wb25lbnQsIHRoaXMpOworCQl9CisJCXJldHVybiBhZHZhbmNlZEhlbHBlcjsJCQorCX0KKworLy8JCisvLwlAT3ZlcnJpZGUKKy8vCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0QWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvdmlkZXIoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7CisvLwkJcmV0dXJuIG5ldyBBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCk7CisvLwl9CisvLwkKKy8vCXByb3RlY3RlZCB2b2lkIGFkZFRvTWFuaWZlc3QoQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjb21wb25lbnRzKSB7CisvLwkJU3RyaW5nQnVmZmVyIG5ld0NvbXBzID0gZ2V0Q29tcHNGb3JNYW5pZmVzdChjb21wb25lbnRzKTsKKy8vCQlpZihuZXdDb21wcy50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgeworLy8JCQlVcGRhdGVNYW5pZmVzdE9wZXJhdGlvbiBvcCA9IGNyZWF0ZU1hbmlmZXN0T3BlcmF0aW9uKG5ld0NvbXBzLnRvU3RyaW5nKCkpOworLy8JCQl0cnkgeworLy8JCQkJb3AucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworLy8JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKy8vCQkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihlKTsKKy8vCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworLy8JCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKGUpOworLy8JCQl9CQorLy8JCX0KKy8vCX0KKy8vCisvLwlwcm90ZWN0ZWQgdm9pZCBhZGRPbmVDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJUGF0aCBwYXRoLCBTdHJpbmcgYXJjaGl2ZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKy8vCQkvL0ZpbmQgdGhlIEVhcidzIHRoYXQgY29udGFpbiB0aGlzIGNvbXBvbmVudAorLy8JCUlQcm9qZWN0W10gZWFyUHJvamVjdHMgPSBFYXJVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhyb290Q29tcG9uZW50LmdldFByb2plY3QoKSk7CisvLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJQcm9qZWN0cy5sZW5ndGg7IGkrKykgeworLy8JCQlJUHJvamVjdCBwcm9qZWN0ID0gZWFyUHJvamVjdHNbaV07CisvLwkJCQorLy8JCQlJRGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm92aWRlcihjb21wb25lbnQpOworLy8JCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwocHJvdmlkZXIpOworLy8JCQkKKy8vCQkJZG0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpKTsKKy8vCQkJZG0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgQXJyYXlzLmFzTGlzdChjb21wb25lbnQpKTsKKy8vCQkJCisvLwkJCS8vW0J1ZyAyMzgyNjRdIHRoZSB1cmkgbWFwIG5lZWRzIHRvIGJlIG1hbnVhbGx5IHNldCBjb3JyZWN0bHkKKy8vCQkJTWFwPElWaXJ0dWFsQ29tcG9uZW50LCBTdHJpbmc+IHVyaU1hcCA9IG5ldyBIYXNoTWFwPElWaXJ0dWFsQ29tcG9uZW50LCBTdHJpbmc+KCk7CisvLwkJCXVyaU1hcC5wdXQoY29tcG9uZW50LCBhcmNoaXZlTmFtZSk7CisvLwkJCWRtLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQLCB1cmlNYXApOworLy8JICAgICAgICBkbS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgsIHBhdGgpOworLy8JCisvLwkJCUlTdGF0dXMgc3RhdCA9IGRtLnZhbGlkYXRlUHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCk7CisvLwkJCWlmIChzdGF0ICE9IE9LX1NUQVRVUykKKy8vCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXQpOworLy8JCQl0cnkgeworLy8JCQkJZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7CisvLwkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisvLwkJCQlNb2R1bGVDb3JlVUlQbHVnaW4ubG9nRXJyb3IoZSk7CisvLwkJCX0JCisvLwkJfQorLy8JfQorLy8JCisvLworLy8JcHJvdGVjdGVkIFN0cmluZ0J1ZmZlciBnZXRDb21wc0Zvck1hbmlmZXN0KEFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4gY29tcG9uZW50cykgeworLy8JCVN0cmluZ0J1ZmZlciBuZXdDb21wcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKy8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29tcG9uZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisvLwkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpIGl0ZXJhdG9yLm5leHQoKTsKKy8vCQkJU3RyaW5nIGFyY2hpdmVOYW1lID0gbmV3IFBhdGgoZGVyaXZlZFJlZnNPYmplY3RUb1J1bnRpbWVQYXRoLmdldChjb21wKSkubGFzdFNlZ21lbnQoKTsKKy8vCQkJbmV3Q29tcHMuYXBwZW5kKGFyY2hpdmVOYW1lKTsKKy8vCQkJbmV3Q29tcHMuYXBwZW5kKCcgJyk7CisvLwkJfQorLy8JCXJldHVybiBuZXdDb21wczsKKy8vCX0KKy8vCQorLy8JcHJvdGVjdGVkIFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uIGNyZWF0ZU1hbmlmZXN0T3BlcmF0aW9uKFN0cmluZyBuZXdDb21wcykgeworLy8JCXJldHVybiBuZXcgVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24ocHJvamVjdC5nZXROYW1lKCksIG5ld0NvbXBzLCBmYWxzZSk7CisvLwl9CisvLworLy8JcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21NYW5pZmVzdChBcnJheUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IHJlbW92ZWQpIHsKKy8vCQlTdHJpbmcgc291cmNlUHJvak5hbWUgPSBwcm9qZWN0LmdldE5hbWUoKTsKKy8vCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworLy8JCUlGaWxlIG1hbmlmZXN0bWYgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRNYW5pZmVzdEZpbGUocHJvamVjdCk7CisvLwkJQXJjaGl2ZU1hbmlmZXN0IG1mID0gSjJFRVByb2plY3RVdGlsaXRpZXMucmVhZE1hbmlmZXN0KHByb2plY3QpOworLy8JCWlmIChtZiA9PSBudWxsKQorLy8JCQlyZXR1cm47CisvLwkJSURhdGFNb2RlbCB1cGRhdGVNYW5pZmVzdERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyKCkpOworLy8JCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHNvdXJjZVByb2pOYW1lKTsKKy8vCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1FUkdFLCBmYWxzZSk7CisvLwkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuc2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1BTklGRVNUX0ZJTEUsIG1hbmlmZXN0bWYpOworLy8JCVN0cmluZ1tdIGNwID0gbWYuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7CisvLwkJTGlzdCBjcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisvLwkJCisvLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgeworLy8JCQlib29sZWFuIGZvdW5kTWF0Y2ggPSBmYWxzZTsKKy8vCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlbW92ZWQuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworLy8JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChJVmlydHVhbENvbXBvbmVudCkgaXRlcmF0b3IubmV4dCgpOworLy8JCQkJU3RyaW5nIGNwVG9SZW1vdmUgPSBuZXcgUGF0aChkZXJpdmVkUmVmc09sZENvbXBvbmVudFRvUnVudGltZVBhdGguZ2V0KGNvbXApKS5sYXN0U2VnbWVudCgpOworLy8JCQkJaWYgKGNwW2ldLmVxdWFscyhjcFRvUmVtb3ZlKSkKKy8vCQkJCQlmb3VuZE1hdGNoID0gdHJ1ZTsKKy8vCQkJfQorLy8JCQlpZiAoIWZvdW5kTWF0Y2gpCisvLwkJCQljcExpc3QuYWRkKGNwW2ldKTsKKy8vCQl9CisvLwkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuc2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLkpBUl9MSVNULCBjcExpc3QpOworLy8JCXRyeSB7CisvLwkJCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwgKTsKKy8vCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgeworLy8JCQlKMkVFVUlQbHVnaW4ubG9nRXJyb3IoZSk7CisvLwkJfQorLy8JfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvSjJFRU1vZHVsZURlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyRGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0oyRUVNb2R1bGVEZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllckRhdGEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjliYjdhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0oyRUVNb2R1bGVEZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllckRhdGEuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5KMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlLkNsYXNzcGF0aEVudHJ5UHJveHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UudmVyaWZpZXIuRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXJEYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuQ29tcG9uZW50UmVzb3VyY2VQcm94eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBKMkVFTW9kdWxlRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXJEYXRhIGV4dGVuZHMgRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXJEYXRheworCQorCXB1YmxpYyBKMkVFTW9kdWxlRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXJEYXRhKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgSVJ1bnRpbWUgcnVudGltZSwgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiBjdXJyZW50UmVmZXJlbmNlcywKKwkJCUFycmF5TGlzdDxDb21wb25lbnRSZXNvdXJjZVByb3h5PiByZXNvdXJjZU1hcHBpbmdzLCBib29sZWFuIHJlc291cmNlTWFwcGluZ3NDaGFuZ2VkLCBMaXN0PENsYXNzcGF0aEVudHJ5UHJveHk+IGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzMikgeworCQlzdXBlcihjb21wb25lbnQsIHJ1bnRpbWUsIGN1cnJlbnRSZWZlcmVuY2VzLHJlc291cmNlTWFwcGluZ3MsIHJlc291cmNlTWFwcGluZ3NDaGFuZ2VkKTsKKwkJdGhpcy5jdXJyZW50Q2xhc3NwYXRoRW50cmllcyA9IGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzMjsKKwl9CisJcHJpdmF0ZSBMaXN0PENsYXNzcGF0aEVudHJ5UHJveHk+IGN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzOworCisJcHVibGljIExpc3Q8Q2xhc3NwYXRoRW50cnlQcm94eT4gZ2V0Q3VycmVudENsYXNzcGF0aEVudHJpZXMoKSB7CisJCXJldHVybiBjdXJyZW50Q2xhc3NwYXRoRW50cmllczsKKwl9CisJcHVibGljIHZvaWQgc2V0Q3VycmVudENsYXNzcGF0aEVudHJpZXMoTGlzdDxDbGFzc3BhdGhFbnRyeVByb3h5PiBjdXJyZW50Q2xhc3NwYXRoRW50cmllcykgeworCQl0aGlzLmN1cnJlbnRDbGFzc3BhdGhFbnRyaWVzID0gY3VycmVudENsYXNzcGF0aEVudHJpZXM7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0oyRUVNb2R1bGVEZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0oyRUVNb2R1bGVEZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllckhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjE0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvSjJFRU1vZHVsZURlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVySGVscGVyLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5KMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlLkNsYXNzcGF0aEVudHJ5UHJveHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTW9kdWxlQ29yZVVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UudmVyaWZpZXIuRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXJIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS52ZXJpZmllci5JRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS52ZXJpZmllci5WZXJpZmllclJlZ2lzdHJ5UmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuQ29tcG9uZW50UmVzb3VyY2VQcm94eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBKMkVFTW9kdWxlRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXJIZWxwZXIgeworCQorCQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIHdpbGwgdXNlIHRoZSBmYWNldCBmcmFtZXdvcmsgdG8gZmluZCBhbGwgcmVnaXN0ZXJlZCB2ZXJpZmllcnMgYmFzZWQgb24gaW5zdGFsbGVkIGZhY2V0cyBhbmQgcnVudGltZXMuCisJICogQWxsIHRoZSB2ZXJpZmllcnMgd2lsbCBoYXZlIGFuIG9wcG9ydHVuaXR5IHRvIHZlcmlmeSBhbmQgcmV0dXJuIHN0YXR1cyBvbiB0aGUgcHJvcG9zZWQgY29tcG9uZW50IG1hcHBpbmdzCisJICogQHBhcmFtIGNvbXBvbmVudAorCSAqIEBwYXJhbSBydW50aW1lCisJICogQHBhcmFtIHJlc291cmNlTWFwcGluZ3NDaGFuZ2VkIAorCSAqIEBwYXJhbSByZXNvdXJjZU1hcHBpbmdzIAorCSAqIEBwYXJhbSBjdXJyZW50UmVmZXJlbmNlcyAKKwkgKiBAcGFyYW0gY3VycmVudENsYXNzcGF0aEVudHJpZXMKKwkgKiBAcmV0dXJuIElTdGF0dXMKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmVyaWZ5KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCxJUnVudGltZSBydW50aW1lLCBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IGN1cnJlbnRSZWZlcmVuY2VzLCBBcnJheUxpc3Q8Q29tcG9uZW50UmVzb3VyY2VQcm94eT4gcmVzb3VyY2VNYXBwaW5ncywgYm9vbGVhbiByZXNvdXJjZU1hcHBpbmdzQ2hhbmdlZCwgTGlzdDxDbGFzc3BhdGhFbnRyeVByb3h5PiBjdXJyZW50Q2xhc3NwYXRoRW50cmllcykgeworCQlJUHJvamVjdCBwcm9qZWN0ID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKKwkJCisJCUxpc3QgdmVyaWZpZXJzID0gRGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXJIZWxwZXIuY29sbGVjdEFsbFZlcmlmaWVycyhwcm9qZWN0LHJ1bnRpbWUpOworCQlpZiAodmVyaWZpZXJzLmlzRW1wdHkoKSkgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCU11bHRpU3RhdHVzIG1hc3RlclN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhNb2R1bGVDb3JlVUlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCBNZXNzYWdlcy5EZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllckhlbHBlcl8wLG51bGwpOyAKKwkJCisJCWZvciAoaW50IGkgPSAwOyBpIDwgdmVyaWZpZXJzLnNpemUoKTsgaSsrKSB7CisJCQlpZiAoISh2ZXJpZmllcnMuZ2V0KGkpIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSkKKwkJCQljb250aW51ZTsKKwkJCUlEZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllciB2ZXJpZmllciA9IG51bGw7CisJCQl0cnkgeworCQkJCXZlcmlmaWVyID0gKElEZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllcikgKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIHZlcmlmaWVycy5nZXQoaSkpLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oVmVyaWZpZXJSZWdpc3RyeVJlYWRlci5WRVJJRklFUl9DTEFTUyk7CisJCQkJSjJFRU1vZHVsZURlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyRGF0YSBkYXRhID0gbmV3IEoyRUVNb2R1bGVEZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllckRhdGEoY29tcG9uZW50LCBydW50aW1lLGN1cnJlbnRSZWZlcmVuY2VzLHJlc291cmNlTWFwcGluZ3MscmVzb3VyY2VNYXBwaW5nc0NoYW5nZWQsY3VycmVudENsYXNzcGF0aEVudHJpZXMgKTsKKwkJCQlJU3RhdHVzIHZlcmlmeVN0YXR1cyA9IHZlcmlmaWVyLnZlcmlmeShkYXRhKTsKKwkJCQlpZih2ZXJpZnlTdGF0dXMgIT0gbnVsbCAmJiB2ZXJpZnlTdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7CisJCQkJCW1hc3RlclN0YXR1cy5hZGRBbGwodmVyaWZ5U3RhdHVzKTsKKwkJCQl9IGVsc2UgeworCQkJCQltYXN0ZXJTdGF0dXMuYWRkKHZlcmlmeVN0YXR1cyk7CisJCQkJfQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQlNb2R1bGVDb3JlVUlQbHVnaW4ubG9nKGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJCisJCX0KKwkJcmV0dXJuIG1hc3RlclN0YXR1czsKKwl9CQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0oyRUVQcm9wZXJ0aWVzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0oyRUVQcm9wZXJ0aWVzUGFnZS5qYXZhCmluZGV4IGZmZjExNjAuLjRjNWMyZjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9KMkVFUHJvcGVydGllc1BhZ2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvSjJFRVByb3BlcnRpZXNQYWdlLmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAkJQ29tcG9zaXRlIGMgPSBwYXJlbnQ7CiAJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7CkBAIC0xNjksNiArMTcwLDcgQEAKIAkJcmVmcmVzaCgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKIAkJcmV0dXJuIGRvUmVmYWN0b3IoKSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9KYXZhRUVDb21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvSmF2YUVFQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNTBiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvSmF2YUVFQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5EZXBlbmRlbmN5QXR0cmlidXRlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5KMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlLkNsYXNzcGF0aEVudHJ5UHJveHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuTW9kdWxlQ29yZVVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlLkFkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlOworCisvKioKKyAqIFNhbWUgYXMge0BsaW5rIENvbXBvbmVudERlcGVuZGVuY3lDb250ZW50UHJvdmlkZXJ9IGV4Y2VwdCB0aGlzIHB1bGxzIGluCisgKiByZWZlcmVuY2VzIHRhZ2dlZCBpbiB0aGUgY2xhc3NwYXRoIHRvIGJlIHB1bGxlZCB1cCBieSBtb2R1bGVzIHdpdGggLi4vCisgKiAKKyAqIEBhdXRob3IganNob2xsCisgKiAKKyAqLworcHVibGljIGNsYXNzIEphdmFFRUNvbXBvbmVudERlcGVuZGVuY3lDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBDb21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyIHsKKworCXB1YmxpYyBKYXZhRUVDb21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyKEFkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlIGFkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlKSB7CisJCXN1cGVyKGFkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlKTsKKwl9CisKKwlwdWJsaWMgY2xhc3MgQ29uc3VtZWRDbGFzc3BhdGhFbnRyeVByb3h5IHsKKwkJcHVibGljIElDbGFzc3BhdGhFbnRyeSBlbnRyeTsKKwkJcHVibGljIENvbnN1bWVkQ2xhc3NwYXRoRW50cnlQcm94eShJQ2xhc3NwYXRoRW50cnkgZW50cnkpeworCQkJdGhpcy5lbnRyeSA9IGVudHJ5OworCQl9CisJfQorCQorCXByb3RlY3RlZCBMaXN0PENsYXNzcGF0aEVudHJ5UHJveHk+IGNsYXNzcGF0aEVudHJpZXMgPSBudWxsOworCisJcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoRW50cmllcyhMaXN0PENsYXNzcGF0aEVudHJ5UHJveHk+IGNsYXNzcGF0aEVudHJpZXMpIHsKKwkJdGhpcy5jbGFzc3BhdGhFbnRyaWVzID0gY2xhc3NwYXRoRW50cmllczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgeworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorCQlPYmplY3RbXSBzdXBlckVsZW1lbnRzID0gc3VwZXIuZ2V0RWxlbWVudHMoaW5wdXRFbGVtZW50KTsKKwkJTGlzdDxPYmplY3Q+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisJCWZvciAoT2JqZWN0IG9iaiA6IHN1cGVyRWxlbWVudHMpIHsKKwkJCWVsZW1lbnRzLmFkZChvYmopOworCQl9CisJCWVsZW1lbnRzLmFkZEFsbChjbGFzc3BhdGhFbnRyaWVzKTsKKwkJcmV0dXJuIGVsZW1lbnRzLnRvQXJyYXkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgeworCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENsYXNzcGF0aEVudHJ5UHJveHkgfHwgZWxlbWVudCBpbnN0YW5jZW9mIENvbnN1bWVkQ2xhc3NwYXRoRW50cnlQcm94eSkgeworCQkJSUNsYXNzcGF0aEVudHJ5IGNsYXNzcGF0aEVudHJ5ID0gKChlbGVtZW50IGluc3RhbmNlb2YgQ29uc3VtZWRDbGFzc3BhdGhFbnRyeVByb3h5KSA/ICgoQ29uc3VtZWRDbGFzc3BhdGhFbnRyeVByb3h5KWVsZW1lbnQpLmVudHJ5IDogKChDbGFzc3BhdGhFbnRyeVByb3h5KSBlbGVtZW50KS5lbnRyeSk7CisJCQlpZiAoY29sdW1uSW5kZXggPT0gQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuU09VUkNFX0NPTFVNTikgeworCQkJCWZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZShnZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpOworCQkJCXJldHVybiBBZGRKYXZhQnVpbGRQYXRoRW50cmllc1dpemFyZEZyYWdtZW50LmdldENsYXNzcGF0aEVudHJ5VGV4dChqcHJvaiwgY2xhc3NwYXRoRW50cnkpOworCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSBBZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZS5ERVBMT1lfQ09MVU1OKSB7CisJCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5jaGVja0ZvckNvbXBvbmVudERlcGVuZGVuY3lBdHRyaWJ1dGUoY2xhc3NwYXRoRW50cnksIERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSk7CisJCQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7CisJCQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoYXR0cmlidXRlLmdldFZhbHVlKCkpOworCQkJCQlpZihydW50aW1lUGF0aC5pc1Jvb3QoKSkKKwkJCQkJCXJldHVybiBydW50aW1lUGF0aC50b1N0cmluZygpOworCQkJCQlyZXR1cm4gcnVudGltZVBhdGgubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKKwkJCQl9CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldENvbHVtblRleHQoZWxlbWVudCwgY29sdW1uSW5kZXgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CisJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3NwYXRoRW50cnlQcm94eSB8fCBlbGVtZW50IGluc3RhbmNlb2YgQ29uc3VtZWRDbGFzc3BhdGhFbnRyeVByb3h5KSB7CisJCQlpZiAoY29sdW1uSW5kZXggPT0gQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UuU09VUkNFX0NPTFVNTikgeworCQkJCWZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZShnZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpOworCQkJCUlDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSA9ICgoZWxlbWVudCBpbnN0YW5jZW9mIENvbnN1bWVkQ2xhc3NwYXRoRW50cnlQcm94eSkgPyAoKENvbnN1bWVkQ2xhc3NwYXRoRW50cnlQcm94eSllbGVtZW50KS5lbnRyeSA6ICgoQ2xhc3NwYXRoRW50cnlQcm94eSkgZWxlbWVudCkuZW50cnkpOworCQkJCXJldHVybiBBZGRKYXZhQnVpbGRQYXRoRW50cmllc1dpemFyZEZyYWdtZW50LmdldENsYXNzcGF0aEVudHJ5SW1hZ2UoanByb2osIGNsYXNzcGF0aEVudHJ5KTsKKwkJCX0gZWxzZSBpZihjb2x1bW5JbmRleCA9PSBBZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZS5ERVBMT1lfQ09MVU1OKSB7CisJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIENvbnN1bWVkQ2xhc3NwYXRoRW50cnlQcm94eSl7CisJCQkJCUlDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSA9ICgoQ29uc3VtZWRDbGFzc3BhdGhFbnRyeVByb3h5KWVsZW1lbnQpLmVudHJ5OworCQkJCQlpZihjbGFzc3BhdGhFbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkpeworCQkJCQkJZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qID0gSmF2YUNvcmUuY3JlYXRlKGdldENvbXBvbmVudCgpLmdldFByb2plY3QoKSk7CisJCQkJCQlyZXR1cm4gQWRkSmF2YUJ1aWxkUGF0aEVudHJpZXNXaXphcmRGcmFnbWVudC5nZXRDbGFzc3BhdGhFbnRyeUltYWdlKGpwcm9qLCBjbGFzc3BhdGhFbnRyeSk7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIE1vZHVsZUNvcmVVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKCJmb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAorCQkJfSAKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0Q29sdW1uSW1hZ2UoZWxlbWVudCwgY29sdW1uSW5kZXgpOworCX0KKworCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7CisJCU9iamVjdCBbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKGVsZW1lbnQpOworCQlyZXR1cm4gY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7CisJCWlmKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJVmlydHVhbFJlZmVyZW5jZSl7CisJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSAoSVZpcnR1YWxSZWZlcmVuY2UpcGFyZW50RWxlbWVudDsKKwkJCUlQYXRoIHJlZlJ1bnRpbWVQYXRoID0gcmVmLmdldFJ1bnRpbWVQYXRoKCk7CisJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKKwkJCWlmKCFjb21wLmlzQmluYXJ5KCkpeworCQkJCUxpc3QgPElDbGFzc3BhdGhFbnRyeT4gb3JpZ2luYWxDbGFzc3BhdGhFbnRyaWVzID0gSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZS5yZWFkUmF3RW50cmllcyhjb21wKTsKKwkJCQlMaXN0IDxDb25zdW1lZENsYXNzcGF0aEVudHJ5UHJveHk+IHJlbGF0aXZlQ2xhc3NwYXRoRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8Q29uc3VtZWRDbGFzc3BhdGhFbnRyeVByb3h5PigpOworCQkJCWZvcihJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkgOiBvcmlnaW5hbENsYXNzcGF0aEVudHJpZXMpeworCQkJCQlJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYnV0ZSA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmNoZWNrRm9yQ29tcG9uZW50RGVwZW5kZW5jeUF0dHJpYnV0ZShjbGFzc3BhdGhFbnRyeSwgRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGUuQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZKTsKKwkJCQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7CisJCQkJCQlTdHJpbmcgcmF3VmFsdWUgPSBhdHRyaWJ1dGUuZ2V0VmFsdWUoKTsKKwkJCQkJCWlmKHJhd1ZhbHVlLnN0YXJ0c1dpdGgoIi4uLyIpKXsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgocmF3VmFsdWUpOworCQkJCQkJCUlQYXRoIHBhdGggPSByZWZSdW50aW1lUGF0aC5hcHBlbmQoYmFzZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7CisJCQkJCQkJaWYoY2xhc3NwYXRoRW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKXsKKwkJCQkJCQkJcGF0aCA9IHBhdGguYXBwZW5kKGNsYXNzcGF0aEVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpKTsKKwkJCQkJCQl9CisJCQkJCQkJSUNsYXNzcGF0aEVudHJ5IHJlbGF0aXZlRW50cnkgPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5tb2RpZnlEZXBlbmRlbmN5UGF0aChjbGFzc3BhdGhFbnRyeSwgcGF0aCk7CisJCQkJCQkJcmVsYXRpdmVDbGFzc3BhdGhFbnRyaWVzLmFkZChuZXcgQ29uc3VtZWRDbGFzc3BhdGhFbnRyeVByb3h5KHJlbGF0aXZlRW50cnkpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gcmVsYXRpdmVDbGFzc3BhdGhFbnRyaWVzLnRvQXJyYXkoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL0phdmFFRURlcGxveW1lbnRBc3NlbWJseUFkdmFuY2VkU2VjdGlvbkJ1aWxkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9KYXZhRUVEZXBsb3ltZW50QXNzZW1ibHlBZHZhbmNlZFNlY3Rpb25CdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwMjZlNwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9KYXZhRUVEZXBsb3ltZW50QXNzZW1ibHlBZHZhbmNlZFNlY3Rpb25CdWlsZGVyLmphdmEKQEAgLTAsMCArMSw0NDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuVGFza01vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLlJlc291cmNlTWFwcGluZ0ZpbHRlckV4dGVuc2lvblJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5BZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZS5Db21wb25lbnRSZXNvdXJjZVByb3h5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuSVJlZmVyZW5jZVdpemFyZENvbnN0YW50czsKKworLyoqCisgKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIGJ1aWxkIGFuZCBoYW5kbGUgdGhlIGxvZ2ljIG9mIHRoZSAiQWR2YW5jZWQiIHNlY3Rpb24gCisgKiBvZiB0aGUgRGVwbG95bWVudCBBc3NlbWJseSBwYWdlIHRoYXQgaXMgY29tbW9uIHRvIGFsbCB0aGUgSmF2YSBFRSBtb2R1bGVzIChFQVIKKyAqIHByb2plY3QsIFdlYiBwcm9qZWN0LCBldGMuKQorICogIAorICovCisKK3B1YmxpYyBjbGFzcyBKYXZhRUVEZXBsb3ltZW50QXNzZW1ibHlBZHZhbmNlZFNlY3Rpb25CdWlsZGVyIGltcGxlbWVudHMgSUphdmFFRURlcGxveW1lbnRBc3NlbWJseVNlY3Rpb25CdWlsZGVyLCBTZWxlY3Rpb25MaXN0ZW5lciB7CisJCisJcHJpdmF0ZSBMYWJlbCBkZWZhdWxEREZvbGRlckxhYmVsOworCXByaXZhdGUgQ29tYm8gcm9vdFNvdXJjZU1hcHBpbmdzOworCQkKKwlwcml2YXRlIElWaXJ0dWFsQ29tcG9uZW50IHJvb3RDb21wb25lbnQ7CisJcHJpdmF0ZSBBZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZSBwYWdlOworCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRTZWxlY3RlZERERm9sZGVyID0gbnVsbDsKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiByZXNvdXJjZU1hcHBpbmdzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCWJvb2xlYW4gc2hvdWxkRGlzcGxheVNlY3Rpb247CisJCisJU3RyaW5nIGZvbGRlclRvTG9vazsKKwlTdHJpbmcgZmlsZVRvTG9vazsKKwlTdHJpbmcgcHJvamVjdFR5cGU7CisJCisJCisJcHVibGljIEphdmFFRURlcGxveW1lbnRBc3NlbWJseUFkdmFuY2VkU2VjdGlvbkJ1aWxkZXIoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBBZGRNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0aWVzUGFnZSBwYWdlKXsKKwkJcm9vdENvbXBvbmVudCA9IGNvbXBvbmVudDsKKwkJdGhpcy5wYWdlID0gcGFnZTsKKwkJc2hvdWxkRGlzcGxheVNlY3Rpb24gPSAhSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KHJvb3RDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKKwkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IHJvb3RDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOworCQlJUGF0aCBkZWZhdWx0RERGb2xkZXIgPSBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5nZXREZWZhdWx0RGVwbG95bWVudERlc2NyaXB0b3JGb2xkZXIocm9vdEZvbGRlcik7CisJCXNob3VsZERpc3BsYXlTZWN0aW9uICY9IChkZWZhdWx0RERGb2xkZXIgPT0gbnVsbCk7CisJCXByb2plY3RUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFR5cGUoY29tcG9uZW50LmdldFByb2plY3QoKSk7CisJCWlmIChwcm9qZWN0VHlwZS5lcXVhbHMoSUoyRUVGYWNldENvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlQpKQl7CisJCQlmb2xkZXJUb0xvb2sgPSBKMkVFQ29uc3RhbnRzLk1FVEFfSU5GOworCQkJZmlsZVRvTG9vayA9IEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9VUkk7CisJCX0KKwkJZWxzZSBpZiAocHJvamVjdFR5cGUuZXF1YWxzKElKMkVFRmFjZXRDb25zdGFudHMuSkNBKSkgeworCQkJZm9sZGVyVG9Mb29rID0gSjJFRUNvbnN0YW50cy5NRVRBX0lORjsKKwkJCWZpbGVUb0xvb2sgPSBKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkk7CisJCX0KKwkJZWxzZSBpZgkocHJvamVjdFR5cGUuZXF1YWxzKElKMkVFRmFjZXRDb25zdGFudHMuRUpCKSl7CisJCQlmb2xkZXJUb0xvb2sgPSBKMkVFQ29uc3RhbnRzLk1FVEFfSU5GOworCQkJZmlsZVRvTG9vayA9IEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSTsKKwkJfQorCQllbHNlIGlmIChwcm9qZWN0VHlwZS5lcXVhbHMoSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQikpIHsKKwkJCWZvbGRlclRvTG9vayA9IEoyRUVDb25zdGFudHMuV0VCX0lORjsKKwkJCWZpbGVUb0xvb2sgPSBKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkk7CisJCX0KKwkJZWxzZSBpZiAocHJvamVjdFR5cGUuZXF1YWxzKElKMkVFRmFjZXRDb25zdGFudHMuRU5URVJQUklTRV9BUFBMSUNBVElPTikpIHsKKwkJCWZvbGRlclRvTG9vayA9IEoyRUVDb25zdGFudHMuTUVUQV9JTkY7CisJCQlmaWxlVG9Mb29rID0gSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkk7CisJCX0JCisJCWVsc2UgaWYgKHByb2plY3RUeXBlLmVxdWFscyhJSjJFRUZhY2V0Q29uc3RhbnRzLldFQkZSQUdNRU5UKSkgeworCQkJZm9sZGVyVG9Mb29rID0gSjJFRUNvbnN0YW50cy5NRVRBX0lORjsKKwkJCWZpbGVUb0xvb2sgPSBKMkVFQ29uc3RhbnRzLldFQkZSQUdNRU5UX0REX1VSSTsKKwkJfQorCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5JSmF2YUVFRGVwbG95bWVudEFzc2VtYmx5U2VjdGlvbkJ1aWxkZXIjYnVpbGRTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlwdWJsaWMgdm9pZCBidWlsZFNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCl7CisJCWlmIChzaG91bGREaXNwbGF5U2VjdGlvbigpKSB7IAorCQkJQ29tcG9zaXRlIGFkdmFuY2VkU2VjdGlvbkNvbXBvc2l0ZSA9IGNyZWF0ZUFkdmFuY2VkU2VjdGlvbihwYXJlbnQpOwkJCisJCQlhZGREZWZhdWx0RGVwbG95bWVudERlc2NyaXB0b3JGb2xkZXJGaWVsZHMoYWR2YW5jZWRTZWN0aW9uQ29tcG9zaXRlKTsKKwkJfQorCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5JSmF2YUVFRGVwbG95bWVudEFzc2VtYmx5U2VjdGlvbkJ1aWxkZXIjbG9hZENvbnRlbnRzKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBsb2FkQ29udGVudHMoKXsKKwkJaWYgKHNob3VsZERpc3BsYXlTZWN0aW9uKCkpeworCQkJbG9hZERlZmF1bHREZXBsb3ltZW50RGVzY3JpcHRvckZvbGRlckNvbnRlbnRzKCk7CisJCX0KKwl9CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkuSUphdmFFRURlcGxveW1lbnRBc3NlbWJseVNlY3Rpb25CdWlsZGVyI3NhdmVDb250ZW50cygpCisJICovCisJcHVibGljIGJvb2xlYW4gc2F2ZUNvbnRlbnRzKCl7CQkKKwkJYm9vbGVhbiBzdWNjZXNzID0gdHJ1ZTsKKwkJaWYgKHNob3VsZERpc3BsYXlTZWN0aW9uKCkpeworCQkJc3VjY2VzcyA9IHNhdmVEZWZhdWx0RGVwbG95bWVudERlc2NyaXB0b3JGb2xkZXJDb250ZW50cygpOworCQkJbG9hZENvbnRlbnRzKCk7CisJCX0KKwkJcmV0dXJuIHN1Y2Nlc3M7CisJfQorCQorCQorCXByaXZhdGUgdm9pZCBsb2FkRGVmYXVsdERlcGxveW1lbnREZXNjcmlwdG9yRm9sZGVyQ29udGVudHMoKXsKKwkJcmVzb3VyY2VNYXBwaW5nc0xpc3QuY2xlYXIoKTsKKwkJLy8gRmlyc3QsIHJldHJpZXZlIGFsbCB0aGUgbWFwcGluZ3MgdG8gcm9vdC4gQXNzdW1lIHRoZXJlIGFyZSBubyBkdXBsaWNhdGVkIG1hcHBpbmdzLgorCQlJUGF0aFtdIGFsbFJvb3RNYXBwaW5ncyA9IGZpbmRBbGxSb290TWFwcGluZ3MoKTsJCQorCQkvLyBOb3csIHNlZSBpZiBhbnkgb2YgdGhhdCBpcyB0YWdnZWQgYXMgZGVmYXVsdCByb290IG1hcHBpbmcKKwkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IHJvb3RDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOworCQlJUGF0aCBkZWZhdWx0RERGb2xkZXIgPSBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5nZXREZWZhdWx0RGVwbG95bWVudERlc2NyaXB0b3JGb2xkZXIocm9vdEZvbGRlcik7CisJCQorCQljdXJyZW50U2VsZWN0ZWREREZvbGRlciA9IGRlZmF1bHREREZvbGRlciA9PSBudWxsP251bGw6ZGVmYXVsdERERm9sZGVyLnRvU3RyaW5nKCk7CisJCQkJCisJCWZvciAoSVBhdGggbWFwcGluZzphbGxSb290TWFwcGluZ3MpeworCQkJcmVzb3VyY2VNYXBwaW5nc0xpc3QuYWRkKG1hcHBpbmcudG9TdHJpbmcoKSk7CisJCX0KKwkJCisJCXVwZGF0ZVNvdXJjZU1hcHBpbmdzQ29tYm8oY3VycmVudFNlbGVjdGVkRERGb2xkZXIsIHJlc291cmNlTWFwcGluZ3NMaXN0KTsKKwl9CisJCisJCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZmlsdGVyTWFwcGluZ3MoTGlzdCA8U3RyaW5nPiBtYXBwaW5ncyl7CisJCVNldDxTdHJpbmc+IG1hcHBpbmdXaXRoREQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisJCVNldDxTdHJpbmc+IG1hcHBpbmdXaXRoRm9sZGVyID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCQkKKwkJSVByb2plY3QgcHJvamVjdCA9IHRoaXMucm9vdENvbXBvbmVudC5nZXRQcm9qZWN0KCk7CisJCWZvciAoU3RyaW5nIG1hcHBpbmcgOm1hcHBpbmdzKXsKKwkJCWlmIChmaWxlVG9Mb29rICE9IG51bGwgJiYgIWZpbGVUb0xvb2suZXF1YWxzKCIiKSl7IC8vJE5PTi1OTFMtMSQKKwkJCQlJRmlsZSBkZEZpbGUgPSBwcm9qZWN0LmdldEZpbGUobmV3IFBhdGgobWFwcGluZykuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKSArIGZpbGVUb0xvb2spOworCQkJCWlmIChkZEZpbGUgIT0gbnVsbCAmJiBkZEZpbGUuZXhpc3RzKCkpeworCQkJCQltYXBwaW5nV2l0aERELmFkZChtYXBwaW5nKTsJCQkJCisJCQkJfQorCQkJfQorCQkJaWYgKGZvbGRlclRvTG9vayAhPSBudWxsICYmICFmb2xkZXJUb0xvb2suZXF1YWxzKCIiKSl7IC8vJE5PTi1OTFMtMSQKKwkJCQlJRm9sZGVyIGRkRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIobmV3IFBhdGgobWFwcGluZykuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKSArIGZvbGRlclRvTG9vayk7CisJCQkJaWYgKGRkRm9sZGVyICE9IG51bGwgJiYgZGRGb2xkZXIuZXhpc3RzKCkpeworCQkJCQltYXBwaW5nV2l0aEZvbGRlci5hZGQobWFwcGluZyk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmICghbWFwcGluZ1dpdGhERC5pc0VtcHR5KCkpeworCQkJLy8gcmV0dXJuIG9ubHkgdGhlIG1hcHBpbmdzIHRoYXQgY29udGFpbiBhIEREIGZpbGUuCisJCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxTdHJpbmc+KG1hcHBpbmdXaXRoREQpOworCQl9CisJCXJldHVybiAgbmV3IEFycmF5TGlzdDxTdHJpbmc+KG1hcHBpbmdXaXRoRm9sZGVyKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVNvdXJjZU1hcHBpbmdzQ29tYm8oU3RyaW5nIHNlbGVjdGVkRERGb2xkZXIsIExpc3Q8U3RyaW5nPiByZXNvdXJjZU1hcHBpbmdzKSB7CisJCQorCQlMaXN0PFN0cmluZz4gZmlsdGVyZWRNYXBwaW5ncyA9IGZpbHRlck1hcHBpbmdzKHJlc291cmNlTWFwcGluZ3MpOworCQkKKwkJQXJyYXlMaXN0PFN0cmluZz4gdG1wTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihmaWx0ZXJlZE1hcHBpbmdzKTsKKwkJaWYgKHNlbGVjdGVkRERGb2xkZXIgPT0gbnVsbCl7CisJCQl0bXBMaXN0LmFkZCgwLCBNZXNzYWdlcy5KMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlX0FEVkFOQ0VEX05PREVGQVVMVERERk9MREVSKTsKKwkJfQorCQlyb290U291cmNlTWFwcGluZ3Muc2V0SXRlbXModG1wTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbXXt9KSk7CisJCWlmIChzZWxlY3RlZERERm9sZGVyID09IG51bGwpeworCQkJLy9ObyB0YWdnZWQgc291cmNlIGZvbGRlciwgc28gc2VsZWN0ICJOb25lIgorCQkJcm9vdFNvdXJjZU1hcHBpbmdzLnNlbGVjdCh0bXBMaXN0LmluZGV4T2YoTWVzc2FnZXMuSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV9BRFZBTkNFRF9OT0RFRkFVTFREREZPTERFUikpOworCQl9CisJCWVsc2UgeworCQkJcm9vdFNvdXJjZU1hcHBpbmdzLnNlbGVjdCh0bXBMaXN0LmluZGV4T2Yoc2VsZWN0ZWREREZvbGRlci50b1N0cmluZygpKSk7CisJCX0JCQkJCQorCX0KKworCXByaXZhdGUgYm9vbGVhbiBzYXZlRGVmYXVsdERlcGxveW1lbnREZXNjcmlwdG9yRm9sZGVyQ29udGVudHMoKXsJCQorCQlpZiAoY3VycmVudFNlbGVjdGVkRERGb2xkZXIgIT0gbnVsbCl7CisJCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gcm9vdENvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7CisJCQlKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5zZXREZWZhdWx0RGVwbG95bWVudERlc2NyaXB0b3JGb2xkZXIocm9vdEZvbGRlciwgbmV3IFBhdGgoY3VycmVudFNlbGVjdGVkRERGb2xkZXIpLCBudWxsKTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHJpdmF0ZSBJUGF0aFtdIGZpbmRBbGxSb290TWFwcGluZ3MoKXsKKwkJCisJCVN0cnVjdHVyZUVkaXQgc3RydWN0dXJlRWRpdCA9IG51bGw7CisJCXRyeSB7CisJCQlzdHJ1Y3R1cmVFZGl0ID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChyb290Q29tcG9uZW50LmdldFByb2plY3QoKSk7CisJCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gc3RydWN0dXJlRWRpdC5nZXRDb21wb25lbnQoKTsKKwkJCU9iamVjdFtdIGFyciA9IGNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKS50b0FycmF5KCk7CisJCQlTZXQgPElQYXRoPiByZXN1bHQgPSBuZXcgTGlua2VkSGFzaFNldDxJUGF0aD4oKTsKKwkJCWZvciggaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrICl7CisJCQkJQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2UgPSAoQ29tcG9uZW50UmVzb3VyY2UpYXJyW2ldOworCQkJCWlmIChyZXNvdXJjZS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhJVmlydHVhbENvbXBvbmVudC5ST09UKSAmJiAhUmVzb3VyY2VNYXBwaW5nRmlsdGVyRXh0ZW5zaW9uUmVnaXN0cnkuc2hvdWxkRmlsdGVyKHJlc291cmNlLmdldFNvdXJjZVBhdGgoKSkpeworCQkJCQlyZXN1bHQuYWRkKCgoQ29tcG9uZW50UmVzb3VyY2UpYXJyW2ldKS5nZXRTb3VyY2VQYXRoKCkpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgSVBhdGhbXXt9KTsKKwkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9IGZpbmFsbHkgeworCQkJaWYoc3RydWN0dXJlRWRpdCAhPSBudWxsKQorCQkJCXN0cnVjdHVyZUVkaXQuZGlzcG9zZSgpOworCQl9CisJCXJldHVybiBuZXcgSVBhdGhbXXt9OworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREaXNwbGF5U2VjdGlvbigpeworCQlyZXR1cm4gc2hvdWxkRGlzcGxheVNlY3Rpb247CisJfQorCQkKKwkvKgorCSAqIENyZWF0ZXMgdGhlIEFkdmFuY2VkIHNlY3Rpb24uIFJldHVybnMgdGhlIGNvbXBvc2l0ZSB0byB3aGljaCBhbGwgdGhlIG90aGVyIAorCSAqIHdpZGdldHMgc2hvdWxkIGJlIGFkZGVkLgorCSAqLworCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUFkdmFuY2VkU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KXsJCQorCQkKKwkJLy8gQnVpbGQgdGhlIGV4cGFuZGFibGUgY29tcG9zaXRlCisJCUV4cGFuZGFibGVDb21wb3NpdGUgZXhjb21wb3NpdGUgPSBuZXcgRXhwYW5kYWJsZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FLCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUKKwkJfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkNMSUVOVF9JTkRFTlQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLkNPTVBBQ1QpOworCQlleGNvbXBvc2l0ZS5zZXRUZXh0KE1lc3NhZ2VzLkoyRUVNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfQURWQU5DRUQpOworCQlleGNvbXBvc2l0ZS5zZXRFeHBhbmRlZChmYWxzZSk7CisJCWV4Y29tcG9zaXRlLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0Qm9sZChKRmFjZVJlc291cmNlcy5ESUFMT0dfRk9OVCkpOworCQlleGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSwgMSwgMSkpOworCQlleGNvbXBvc2l0ZS5hZGRFeHBhbnNpb25MaXN0ZW5lcihuZXcgRXhwYW5zaW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgZXhwYW5zaW9uU3RhdGVDaGFuZ2VkKEV4cGFuc2lvbkV2ZW50IGUpIHsKKwkJCQlleHBhbmRlZFN0YXRlQ2hhbmdlZCgoRXhwYW5kYWJsZUNvbXBvc2l0ZSkgZS5nZXRTb3VyY2UoKSk7CisJCQl9CisJCX0pOworCisJCS8vIEJ1aWxkIHRoZSBjb21wb3NpdGUgaGFzIHRoZSBjb250ZW50cyBvZiB0aGUgZXhwYW5kYWJsZSB3aWRnZXQKKwkJQ29tcG9zaXRlIGlubmVyQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShleGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlleGNvbXBvc2l0ZS5zZXRDbGllbnQoaW5uZXJDb21wb3NpdGUpOworCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOworCQlnbC5tYXJnaW5IZWlnaHQgPSAwOworCQlnbC5tYXJnaW5XaWR0aCA9IDA7CisJCWlubmVyQ29tcG9zaXRlLnNldExheW91dChnbCk7IAorCQlyZXR1cm4gaW5uZXJDb21wb3NpdGU7CQkKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGFkZERlZmF1bHREZXBsb3ltZW50RGVzY3JpcHRvckZvbGRlckZpZWxkcyhDb21wb3NpdGUgcGFyZW50KSB7CisJCWRlZmF1bERERm9sZGVyTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7CisJCWRlZmF1bERERm9sZGVyTGFiZWwuc2V0VGV4dChNZXNzYWdlcy5KMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlX0FEVkFOQ0VEX0RERk9MREVSKTsKKwkJcm9vdFNvdXJjZU1hcHBpbmdzID0gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7CisJCXJvb3RTb3VyY2VNYXBwaW5ncy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKKwkJcm9vdFNvdXJjZU1hcHBpbmdzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOworCX0KKwkKKwkKKwlwcml2YXRlIGZpbmFsIHZvaWQgZXhwYW5kZWRTdGF0ZUNoYW5nZWQoRXhwYW5kYWJsZUNvbXBvc2l0ZSBleHBhbmRhYmxlKSB7CisJCS8vIEdldCB0aGUgc2Nyb2xsZWQgY29tcG9zaXRlIG9mIHRoZSBkZXBsb3ltZW50IGFzc2VtYmx5IHBhZ2UsIGFuZCB0aGUgY2hpbGQKKwkJLy8gY29tcG9zaXRlIG9mIHRoaXMgc2Nyb2xsZWQgY29tcG9zaXRlIHRoYXQgY29udGFpbnMgdGhlIGV4cGFuZGFibGUgY29tcG9zaXRlIAorCQlDb21wb3NpdGVbXSBjb21wb3NpdGVzID0gZ2V0Q29tcG9zaXRlc1RvUmVzaXplKGV4cGFuZGFibGUpOworCQlTY3JvbGxlZENvbXBvc2l0ZSBwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZSA9IChTY3JvbGxlZENvbXBvc2l0ZSljb21wb3NpdGVzWzBdOworCQlDb21wb3NpdGUgY2hpbGRDb21wb3NpdGUgPSBjb21wb3NpdGVzWzFdOworCQlpZiAocGFyZW50U2Nyb2xsZWRDb21wb3NpdGUgIT0gbnVsbCAmJiBjaGlsZENvbXBvc2l0ZSAhPSBudWxsKSB7CisJCQlwYXJlbnRTY3JvbGxlZENvbXBvc2l0ZS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7CisJCQkvLyBSZXNpemUgdGhlIHNjcm9sbGVkIGNvbXBvc2l0ZSBzbyB0aGUgc2Nyb2xsIGJhcnMgYXJlIHNob3duIGlmIG5lY2Vzc2FyeQorCQkJcGFyZW50U2Nyb2xsZWRDb21wb3NpdGUuc2V0TWluU2l6ZShjaGlsZENvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpKTsKKwkJCQorCQl9CisJfQorCQorCS8qCisJICogUmV0dXJucyBhbiBhcnJheSBvZiBjb21wb3NpdGVzIHVzZWQgdG8gcmVzaXplIHRoZSBkZXBsb3ltZW50IGFzc2VtYmx5IHBhZ2UKKwkgKiB3aGVuIHRoZSBhZHZhbmNlZCBzZWN0aW9uIGlzIGV4cGFuZGVkLgorCSAqIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBzY3JvbGxlZCBjb21wb3NpdGUgKGluc3RhbmNlIG9mIFNjcm9sbGVkQ29tcG9zaXRlKSBvZiB0aGUgCisJICogZGVwbG95bWVudCBhc3NlbWJseSBwYWdlCisJICogVGhlIHNlY29uZCBlbGVtZW50IGlzIHRoZSBjb21wb3NpdGUgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIGRlcGxveW1lbnQgYXNzZW1ibHkgcGFnZQorCSAqLworCXByaXZhdGUgQ29tcG9zaXRlW10gZ2V0Q29tcG9zaXRlc1RvUmVzaXplKENvbnRyb2wgY29udHJvbCkgeworCQlDb250cm9sIHBhcmVudCA9IGNvbnRyb2wuZ2V0UGFyZW50KCk7CisJCUNvbnRyb2wgcHJldmlvdXNQYXJlbnQgPSBudWxsOworCQlDb21wb3NpdGVbXSByZXN1bHQgPSBuZXcgQ29tcG9zaXRlWzJdOworCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkgJiYgcGFyZW50ICE9IG51bGwpIHsKKwkJCXByZXZpb3VzUGFyZW50ID0gcGFyZW50OworCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworCQl9CisJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkgeworCQkJcmVzdWx0WzBdID0gKFNjcm9sbGVkQ29tcG9zaXRlKXBhcmVudDsKKwkJfQorCQlpZiAocHJldmlvdXNQYXJlbnQgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKKwkJCXJlc3VsdFsxXSA9IChDb21wb3NpdGUpcHJldmlvdXNQYXJlbnQ7CisJCX0KKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBkaXJlY3RpdmVBZGRlZChPYmplY3QgZWxlbWVudCkgeworCQlpZiAoc2hvdWxkRGlzcGxheVNlY3Rpb24oKSl7CisJCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgVGFza01vZGVsKSkKKwkJCQlyZXR1cm47CisJCQlUYXNrTW9kZWwgbW9kZWwgPSAoVGFza01vZGVsKWVsZW1lbnQ7CisJCQlmaW5hbCBPYmplY3QgZm9sZGVyTWFwcGluZyA9IG1vZGVsLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkZPTERFUl9NQVBQSU5HKTsJCQorCQkJaWYoIGZvbGRlck1hcHBpbmcgIT0gbnVsbCAmJiBmb2xkZXJNYXBwaW5nIGluc3RhbmNlb2YgQ29tcG9uZW50UmVzb3VyY2VQcm94eSl7CisJCQkJQ29tcG9uZW50UmVzb3VyY2VQcm94eSBwcm94eSA9IChDb21wb25lbnRSZXNvdXJjZVByb3h5KWZvbGRlck1hcHBpbmc7CisJCQkJLy9pZiAoKHByb3h5LnJ1bnRpbWVQYXRoLmVxdWFscyhJVmlydHVhbENvbXBvbmVudC5ST09UKSAmJiAhcmVzb3VyY2VNYXBwaW5nc0xpc3QuY29udGFpbnMocHJveHkuc291cmNlLnRvU3RyaW5nKCkpKSl7CisJCQkJaWYgKChwcm94eS5ydW50aW1lUGF0aC5lcXVhbHMoSVZpcnR1YWxDb21wb25lbnQuUk9PVCkpKXsKKwkJCQkJcmVzb3VyY2VNYXBwaW5nc0xpc3QuYWRkKHByb3h5LnNvdXJjZS50b1N0cmluZygpKTsKKwkJCQkJdXBkYXRlU291cmNlTWFwcGluZ3NDb21ibyhjdXJyZW50U2VsZWN0ZWREREZvbGRlciwgcmVzb3VyY2VNYXBwaW5nc0xpc3QpOworCQkJCX0KKwkJCX0KKwkJfQkJCisJfQorCisJcHVibGljIHZvaWQgZGlyZWN0aXZlUmVtb3ZlZChPYmplY3QgZWxlbWVudCkgeworCQlpZiAoc2hvdWxkRGlzcGxheVNlY3Rpb24oKSl7CisJCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIENvbXBvbmVudFJlc291cmNlUHJveHkpeworCQkJCUNvbXBvbmVudFJlc291cmNlUHJveHkgcHJveHkgPSAoQ29tcG9uZW50UmVzb3VyY2VQcm94eSllbGVtZW50OworCQkJCWlmIChwcm94eS5ydW50aW1lUGF0aC5lcXVhbHMoSVZpcnR1YWxDb21wb25lbnQuUk9PVCkpeworCQkJCQlTdHJpbmcgcHJveHlTb3VyY2UgPSBwcm94eS5zb3VyY2UudG9TdHJpbmcoKTsKKwkJCQkJaWYgKHJlc291cmNlTWFwcGluZ3NMaXN0LmNvbnRhaW5zKHByb3h5U291cmNlKSl7CisJCQkJCQlyZXNvdXJjZU1hcHBpbmdzTGlzdC5yZW1vdmUocHJveHlTb3VyY2UpOworCQkJCQkJaWYgKHByb3h5U291cmNlLmVxdWFscyhjdXJyZW50U2VsZWN0ZWREREZvbGRlcikpeworCQkJCQkJCWN1cnJlbnRTZWxlY3RlZERERm9sZGVyID0gbnVsbDsKKwkJCQkJCX0KKwkJCQkJCXVwZGF0ZVNvdXJjZU1hcHBpbmdzQ29tYm8oY3VycmVudFNlbGVjdGVkRERGb2xkZXIsIHJlc291cmNlTWFwcGluZ3NMaXN0KTsKKwkJCQkJfQkJCQkJCisJCQkJfQkJCQorCQkJfQorCQl9CisJfQorCisJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CisJCS8vIEludGVudGlvbmFsbHkgbGVmdCBibGFuaworCQkKKwl9CisKKwlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgeworCQlpZiAoZXZlbnQuZ2V0U291cmNlKCkgPT0gcm9vdFNvdXJjZU1hcHBpbmdzKXsKKwkJCVN0cmluZyB0bXAgPSByb290U291cmNlTWFwcGluZ3MuZ2V0VGV4dCgpOworCQkJaWYgKHRtcCAhPSBudWxsKXsKKwkJCQlpZiAodG1wLmVxdWFscyhNZXNzYWdlcy5KMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlX0FEVkFOQ0VEX05PREVGQVVMVERERk9MREVSKSAmJiBjdXJyZW50U2VsZWN0ZWREREZvbGRlciA9PSBudWxsKXsKKwkJCQkJLy8gRG8gbm90aGluZywgYmVjYXVzZSB0aGUgdmFsdWUgZGlkIG5vdCBjaGFuZ2UuCisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJaWYgKHRtcC5lcXVhbHMoTWVzc2FnZXMuSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV9BRFZBTkNFRF9OT0RFRkFVTFREREZPTERFUikpeworCQkJCQkvLyBUaGlzIG1lYW5zIHRoZSB1c2VyIHNlbGVjdGVkIE5vbmUsIGJ1dCB0aGVyZSB3YXMgYWxyZWFkeSBhIHZhbHVlIHNlbGVjdGVkICh0aGlzIHNob3VsZCBub3QgaGFwcGVuKQorCQkJCQlKMkVFVUlQbHVnaW4ubG9nV2FybmluZygiVW5leHBlY3RlZCBjb25kaXRpb24gd2hlbiB2YWxpZGF0aW5nIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCS8vIFdlIG5vdyB0aGUgdXNlciBzZWxlY3RlZCBzb21ldGhpbmcgZGlmZmVyZW50IGZyb20gTm9uZSwgc28gcmVtb3ZlIHRoaXMgaXRlbSBzbyBpdCBjYW5ub3QgYmUgc2VsZWN0ZWQgYWdhaW4KKwkJCQlpZiAocm9vdFNvdXJjZU1hcHBpbmdzLmluZGV4T2YoTWVzc2FnZXMuSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV9BRFZBTkNFRF9OT0RFRkFVTFREREZPTERFUikgIT0gLTEpCisJCQkJCXJvb3RTb3VyY2VNYXBwaW5ncy5yZW1vdmUoTWVzc2FnZXMuSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV9BRFZBTkNFRF9OT0RFRkFVTFREREZPTERFUik7CisJCQkJLy8gT25seSByZWZyZXNoIGlmIGNoYW5naW5nIGZyb20gTm9uZSB0byBhIGZvbGRlcgorCQkJCWJvb2xlYW4gc2hvdWxkUmVmcmVzaCA9IChjdXJyZW50U2VsZWN0ZWREREZvbGRlciA9PSBudWxsKTsKKwkJCQlpZiAoIXRtcC5lcXVhbHMoY3VycmVudFNlbGVjdGVkRERGb2xkZXIpKXsgIAorCQkJCQljdXJyZW50U2VsZWN0ZWREREZvbGRlciA9IHRtcDsKKwkJCQkJaWYgKHNob3VsZFJlZnJlc2gpCisJCQkJCQlwYWdlLnJlZnJlc2goKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJCQkKKwl9CisKKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJU3RhdHVzIGN1cnJlbnRTdGF0dXMpIHsJCisJCUlTdGF0dXMgc3RhdHVzID0gY3VycmVudFN0YXR1cyE9bnVsbD9jdXJyZW50U3RhdHVzOlN0YXR1cy5PS19TVEFUVVM7CisJCWlmIChzaG91bGREaXNwbGF5U2VjdGlvbigpKXsKKwkJCWlmIChjdXJyZW50U2VsZWN0ZWREREZvbGRlciA9PSBudWxsICYmIHJlc291cmNlTWFwcGluZ3NMaXN0LnNpemUoKT4xKXsKKwkJCQkvLyBPbmx5IHNob3cgdGhlIHdhcm5pbmcgaWYgbm9uZSBvZiB0aGUgcm9vdCBtYXBwaW5ncyBpcyBzZWxlY3RlZCBhbmQgdGhlcmUgYXJlIG1vcmUgdGhhbiAxIHJvb3QgbWFwcGluZwkJCQkKKwkJCQlpbnQgc2V2ZXJpdHkgPSBTdGF0dXMuV0FSTklORzsKKwkJCQlzdGF0dXMgPSBhcHBlbmRTdGF0dXNNZXNzYWdlKHN0YXR1cywgTWVzc2FnZXMuSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV9BRFZBTkNFRF9OT0RFRkFVTFREREZPTERFUldBUk5JTkcsIHNldmVyaXR5KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKwlwcml2YXRlIElTdGF0dXMgYXBwZW5kU3RhdHVzTWVzc2FnZShJU3RhdHVzIGV4aXN0aW5nU3RhdHVzLCBTdHJpbmcgbWVzc2FnZSwgaW50IHNldmVyaXR5KSB7CisgICAgICAgIE11bHRpU3RhdHVzIG11bHRpU3RhdHVzOworICAgICAgICBJU3RhdHVzIG5ld1N0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpOworCQlpbnQgbmV3U2V2ZXJpdHkgPSBzZXZlcml0eTsKKwkJaWYoZXhpc3RpbmdTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA+IHNldmVyaXR5KQorCQkJbmV3U2V2ZXJpdHkgPSBleGlzdGluZ1N0YXR1cy5nZXRTZXZlcml0eSgpOworICAgICAgICBpZihleGlzdGluZ1N0YXR1cyBpbnN0YW5jZW9mIE11bHRpU3RhdHVzKXsKKyAgICAgICAgICAgIG11bHRpU3RhdHVzID0gKE11bHRpU3RhdHVzKWV4aXN0aW5nU3RhdHVzOworICAgICAgICAgICAgbXVsdGlTdGF0dXMubWVyZ2UobmV3U3RhdHVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgCWlmKCFleGlzdGluZ1N0YXR1cy5pc011bHRpU3RhdHVzKCkgJiYgZXhpc3RpbmdTdGF0dXMuaXNPSygpKSB7CisgICAgICAgIAkJcmV0dXJuIG5ld1N0YXR1czsKKyAgICAgICAgCX0KKyAgICAgICAgICAgIElTdGF0dXMgW10gY2hpbGRyZW4gPSBuZXcgSVN0YXR1cyBbXSB7ZXhpc3RpbmdTdGF0dXMsIG5ld1N0YXR1c307CisgICAgICAgICAgICBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhKMkVFVUlQbHVnaW4uUExVR0lOX0lELCBuZXdTZXZlcml0eSwgY2hpbGRyZW4sIG51bGwsIG51bGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtdWx0aVN0YXR1czsKKyAgICB9CisKKwlwdWJsaWMgdm9pZCBjb21wb25lbnRSZXNvdXJjZU1vZGlmaWVkKENvbXBvbmVudFJlc291cmNlUHJveHkgb3JpZ2luYWxSZXNvdXJjZSwgQ29tcG9uZW50UmVzb3VyY2VQcm94eSBtb2RpZmllZFJlc291cmNlKSB7CisJCWlmIChzaG91bGREaXNwbGF5U2VjdGlvbigpKXsKKwkJCS8vIFdlIGFyZSBpbnRlcmVzdGVkIG9ubHkgaW4gdHdvIGNhc2VzOgorCQkJLy8gMS4gV2hlbiB0aGUgZGVwbG95IHBhdGggY2hhbmdlcyBmcm9tIC8gdG8gYW55IG90aGVyIHRoaW5nLi4uCisJCQlpZiAob3JpZ2luYWxSZXNvdXJjZS5ydW50aW1lUGF0aC5pc1Jvb3QoKSAmJiAhbW9kaWZpZWRSZXNvdXJjZS5ydW50aW1lUGF0aC5pc1Jvb3QoKSl7CisJCQkJcmVzb3VyY2VNYXBwaW5nc0xpc3QucmVtb3ZlKG9yaWdpbmFsUmVzb3VyY2Uuc291cmNlLnRvU3RyaW5nKCkpOworCQkJCWlmIChvcmlnaW5hbFJlc291cmNlLnNvdXJjZS50b1N0cmluZygpLmVxdWFscyhjdXJyZW50U2VsZWN0ZWREREZvbGRlcikpeworCQkJCQljdXJyZW50U2VsZWN0ZWREREZvbGRlciA9IG51bGw7IAorCQkJCX0KKwkJCQl1cGRhdGVTb3VyY2VNYXBwaW5nc0NvbWJvKGN1cnJlbnRTZWxlY3RlZERERm9sZGVyLCByZXNvdXJjZU1hcHBpbmdzTGlzdCk7CisJCQkJcGFnZS5yZWZyZXNoKCk7CisJCQl9CisJCQkvLyAyLiBXaGVuIHRoZSBkZXBsb3kgcGF0aCBjaGFuZ2VzIGZyb20gYW55IHRoaW5nIHRvIC8KKwkJCWVsc2UgaWYgKCFvcmlnaW5hbFJlc291cmNlLnJ1bnRpbWVQYXRoLmlzUm9vdCgpICYmIG1vZGlmaWVkUmVzb3VyY2UucnVudGltZVBhdGguaXNSb290KCkpeworCQkJCXJlc291cmNlTWFwcGluZ3NMaXN0LmFkZChvcmlnaW5hbFJlc291cmNlLnNvdXJjZS50b1N0cmluZygpKTsKKwkJCQl1cGRhdGVTb3VyY2VNYXBwaW5nc0NvbWJvKGN1cnJlbnRTZWxlY3RlZERERm9sZGVyLCByZXNvdXJjZU1hcHBpbmdzTGlzdCk7CisJCQkJcGFnZS5yZWZyZXNoKCk7CQkKKwkJCX0KKwkJfQkKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9NZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMWI0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDMyIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRURlcGVuZGVuY3lQYWdlUHJvdmlkZXJfMDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFRGVwZW5kZW5jeVBhZ2VQcm92aWRlcl8xOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyXzI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRURlcGVuZGVuY3lQYWdlUHJvdmlkZXJfMzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFRGVwZW5kZW5jeVBhZ2VQcm92aWRlcl80OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyXzU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV8wOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlXzI7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV8zOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfNDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlXzU7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV82OworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfQURWQU5DRUQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV9BRFZBTkNFRF9EREZPTERFUjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlX0FEVkFOQ0VEX05PREVGQVVMVERERk9MREVSOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfQURWQU5DRURfTk9ERUZBVUxURERGT0xERVJXQVJOSU5HOworCisJc3RhdGljIHsKKwkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOworCX0KKworCXByaXZhdGUgTWVzc2FnZXMoKSB7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL1d0cE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbFBhbmVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGFhZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL1d0cE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbFBhbmVsLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5saWJwcm92Lm9zZ2kuT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5XdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKKworLyoqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KKyAqLworCitwdWJsaWMgY2xhc3MgV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwKKworICAgIGV4dGVuZHMgT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwKKyAgICAKK3sKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVGb290ZXIoIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgKQorICAgIHsKKyAgICAgICAgZmluYWwgV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNmZworICAgICAgICAgICAgPSAoV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSBnZXRPcGVyYXRpb25Db25maWcoKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIEJ1dHRvbiBjb3B5T25QdWJsaXNoQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKCBjb21wb3NpdGUsIFNXVC5DSEVDSyApOworICAgICAgICBjb3B5T25QdWJsaXNoQ2hlY2tCb3guc2V0VGV4dCggUmVzb3VyY2VzLmNvcHlMaWJyYXJpZXMgKTsKKyAgICAgICAgY29weU9uUHVibGlzaENoZWNrQm94LnNldFNlbGVjdGlvbiggY2ZnLmlzSW5jbHVkZVdpdGhBcHBsaWNhdGlvbkVuYWJsZWQoKSApOworICAgICAgICAKKyAgICAgICAgY29weU9uUHVibGlzaENoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyCisgICAgICAgICgKKyAgICAgICAgICAgIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZCggZmluYWwgU2VsZWN0aW9uRXZlbnQgZXZlbnQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2ZnLnNldEluY2x1ZGVXaXRoQXBwbGljYXRpb25FbmFibGVkKCBjb3B5T25QdWJsaXNoQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZCggZmluYWwgU3RyaW5nIHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2xkVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBuZXdWYWx1ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29weU9uUHVibGlzaENoZWNrQm94LnNldFNlbGVjdGlvbiggY2ZnLmlzSW5jbHVkZVdpdGhBcHBsaWNhdGlvbkVuYWJsZWQoKSApOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICAKKyAgICAgICAgY2ZnLmFkZExpc3RlbmVyKCBsaXN0ZW5lciwgV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLlBST1BfSU5DTFVERV9XSVRIX0FQUExJQ0FUSU9OX0VOQUJMRUQgKTsKKyAgICAgICAgCisgICAgICAgIGNvcHlPblB1Ymxpc2hDaGVja0JveC5hZGREaXNwb3NlTGlzdGVuZXIKKyAgICAgICAgKAorICAgICAgICAgICAgbmV3IERpc3Bvc2VMaXN0ZW5lcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoIGZpbmFsIERpc3Bvc2VFdmVudCBldmVudCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjZmcucmVtb3ZlTGlzdGVuZXIoIGxpc3RlbmVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIGNvcHlPblB1Ymxpc2hDaGVja0JveDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKKyAgICAKKyAgICAgICAgZXh0ZW5kcyBOTFMKKyAgICAgICAgCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5TGlicmFyaWVzOworCisgICAgICAgIHN0YXRpYworICAgICAgICB7CisgICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFd0cE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbFBhbmVsLmNsYXNzLmdldE5hbWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL1d0cE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbFBhbmVsLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzExZGFmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL1d0cE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbFBhbmVsLnByb3BlcnRpZXMKQEAgLTAsMCArMSBAQAorY29weUxpYnJhcmllcyA9ICZJbmNsdWRlIGxpYnJhcmllcyB3aXRoIHRoaXMgYXBwbGljYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9XdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbFBhbmVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NTdlMTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbC5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkubGlicHJvdi51c2VyLlVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5XdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgorICovCisKK3B1YmxpYyBjbGFzcyBXdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbFBhbmVsCisKKyAgICBleHRlbmRzIFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwKKyAgICAKK3sKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sTmV4dFRvTWFuYWdlSHlwZXJsaW5rKCBmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlICkKKyAgICB7CisgICAgICAgIGZpbmFsIFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNmZworICAgICAgICAgICAgPSAoV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIGdldE9wZXJhdGlvbkNvbmZpZygpOworICAgICAgICAKKyAgICAgICAgZmluYWwgQnV0dG9uIGNvcHlPblB1Ymxpc2hDaGVja0JveCA9IG5ldyBCdXR0b24oIGNvbXBvc2l0ZSwgU1dULkNIRUNLICk7CisgICAgICAgIGNvcHlPblB1Ymxpc2hDaGVja0JveC5zZXRUZXh0KCBSZXNvdXJjZXMuY29weUxpYnJhcmllcyApOworICAgICAgICBjb3B5T25QdWJsaXNoQ2hlY2tCb3guc2V0U2VsZWN0aW9uKCBjZmcuaXNJbmNsdWRlV2l0aEFwcGxpY2F0aW9uRW5hYmxlZCgpICk7CisgICAgICAgIAorICAgICAgICBjb3B5T25QdWJsaXNoQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIKKyAgICAgICAgKAorICAgICAgICAgICAgbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKCBmaW5hbCBTZWxlY3Rpb25FdmVudCBldmVudCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjZmcuc2V0SW5jbHVkZVdpdGhBcHBsaWNhdGlvbkVuYWJsZWQoIGNvcHlPblB1Ymxpc2hDaGVja0JveC5nZXRTZWxlY3Rpb24oKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKCBmaW5hbCBTdHJpbmcgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvbGRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG5ld1ZhbHVlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3B5T25QdWJsaXNoQ2hlY2tCb3guc2V0U2VsZWN0aW9uKCBjZmcuaXNJbmNsdWRlV2l0aEFwcGxpY2F0aW9uRW5hYmxlZCgpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIAorICAgICAgICBjZmcuYWRkTGlzdGVuZXIoIGxpc3RlbmVyLCBXdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5QUk9QX0lOQ0xVREVfV0lUSF9BUFBMSUNBVElPTl9FTkFCTEVEICk7CisgICAgICAgIAorICAgICAgICBjb3B5T25QdWJsaXNoQ2hlY2tCb3guYWRkRGlzcG9zZUxpc3RlbmVyCisgICAgICAgICgKKyAgICAgICAgICAgIG5ldyBEaXNwb3NlTGlzdGVuZXIoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKCBmaW5hbCBEaXNwb3NlRXZlbnQgZXZlbnQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2ZnLnJlbW92ZUxpc3RlbmVyKCBsaXN0ZW5lciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBjb3B5T25QdWJsaXNoQ2hlY2tCb3g7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCisgICAgCisgICAgICAgIGV4dGVuZHMgTkxTCisgICAgICAgIAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUxpYnJhcmllczsKKworICAgICAgICBzdGF0aWMKKyAgICAgICAgeworICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBXdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbFBhbmVsLmNsYXNzLmdldE5hbWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5jbGFzcyApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL1d0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9XdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbFBhbmVsLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxMWRhZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9XdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbFBhbmVsLnByb3BlcnRpZXMKQEAgLTAsMCArMSBAQAorY29weUxpYnJhcmllcyA9ICZJbmNsdWRlIGxpYnJhcmllcyB3aXRoIHRoaXMgYXBwbGljYXRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL21lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdjNzdmZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTggQEAKK0oyRUVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyXzA9V2ViIERlcGxveW1lbnQgQXNzZW1ibHkKK0oyRUVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyXzE9RUpCIERlcGxveW1lbnQgQXNzZW1ibHkKK0oyRUVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyXzI9QXBwbGljYXRpb24gQ2xpZW50IERlcGxveW1lbnQgQXNzZW1ibHkKK0oyRUVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyXzM9Q29ubmVjdG9yIERlcGxveW1lbnQgQXNzZW1ibHkKK0oyRUVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyXzQ9RGVwbG8meW1lbnQgQXNzZW1ibHkKK0oyRUVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyXzU9Jk1hbmlmZXN0IEVudHJpZXMKK0oyRUVNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfMD1BZGQgRUpCIE1vZHVsZSBGb2xkZXIuLi4KK0oyRUVNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfMT1BZGQgQXBwIENsaWVudCBNb2R1bGUgRm9sZGVyLi4uCitKMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlXzI9QWRkIENvbm5lY3RvciBNb2R1bGUgRm9sZGVyLi4uCitKMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlXzM9QXNzZW1ibGUgcGFja2FnaW5nIHN0cnVjdHVyZSBmb3IgdGhpcyBFSkIgcHJvamVjdAorSjJFRU1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV80PUFzc2VtYmxlIHBhY2thZ2luZyBzdHJ1Y3R1cmUgZm9yIHRoaXMgQXBwbGljYXRpb24gQ2xpZW50IHByb2plY3QKK0oyRUVNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfNT1Bc3NlbWJsZSBwYWNrYWdpbmcgc3RydWN0dXJlIGZvciB0aGlzIENvbm5lY3RvciBwcm9qZWN0CitKMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlXzY9RGVyaXZlZCBSZWZlcmVuY2VzCitKMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlX0FEVkFOQ0VEPUFkdmFuY2VkCitKMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlX0FEVkFOQ0VEX0RERk9MREVSPUZvbGRlciBmb3IgZGVwbG8meW1lbnQgZGVzY3JpcHRvcjoKK0oyRUVNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfQURWQU5DRURfTk9ERUZBVUxURERGT0xERVI9KE5vbmUpCitKMkVFTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlX0FEVkFOQ0VEX05PREVGQVVMVERERk9MREVSV0FSTklORz1BIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb2xkZXIgc2hvdWxkIGJlIHNlbGVjdGVkLiBTZWUgdGhlIEFkdmFuY2VkIHNlY3Rpb24uCisKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9DbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0NsYXNzcGF0aERlcGVuZGVuY3lDb21wb25lbnRMYWJlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2M2Q5OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9DbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuRHVtbXlDbGFzc3BhdGhEZXBlbmRlbmN5Q29udGFpbmVyVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXZhaWxhYmxlSmFyc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSVZpcnR1YWxDb21wb25lbnRMYWJlbFByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cworCQlJVmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIgeworCisJcHVibGljIENsYXNzcGF0aERlcGVuZGVuY3lDb21wb25lbnRMYWJlbFByb3ZpZGVyKCkgeworCQkvLyBEbyBub3RoaW5nCisJfQorCisJcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQlpZiggY29tcG9uZW50IGluc3RhbmNlb2YgRHVtbXlDbGFzc3BhdGhEZXBlbmRlbmN5Q29udGFpbmVyVmlydHVhbENvbXBvbmVudCkKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2VUZXh0KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQlyZXR1cm4gTWVzc2FnZXMuQ2hpbGRDbGFzc3BhdGhEZXBlbmRlbmN5RGVzY3JpcHRpb247CisJfQorCisJcHVibGljIEltYWdlIGdldFNvdXJjZUltYWdlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQlyZXR1cm4gQXZhaWxhYmxlSmFyc1Byb3ZpZGVyLmdldENsYXNzcGF0aERlcGVuZGVuY3lJbWFnZSgpOworCX0KKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkvLyAgRG8gbm90aGluZworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9DdXN0b21FQVJQcm9qZWN0UmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9DdXN0b21FQVJQcm9qZWN0UmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2VjMmIwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0N1c3RvbUVBUlByb2plY3RSZWZlcmVuY2VXaXphcmRGcmFnbWVudC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgQWlkeWwgS2FyZWggLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5Qcm9qZWN0UmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5JUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzOworCitwdWJsaWMgY2xhc3MgQ3VzdG9tRUFSUHJvamVjdFJlZmVyZW5jZVdpemFyZEZyYWdtZW50IGV4dGVuZHMgUHJvamVjdFJlZmVyZW5jZVdpemFyZEZyYWdtZW50IHsKKwkKKwlwdWJsaWMgQ3VzdG9tRUFSUHJvamVjdFJlZmVyZW5jZVdpemFyZEZyYWdtZW50KCkgeworCQlzdXBlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHBlcmZvcm1GaW5pc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXN1cGVyLnBlcmZvcm1GaW5pc2gobW9uaXRvcik7CisJCVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gKFZpcnR1YWxSZWZlcmVuY2UgW10pIGdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkZJTkFMX1JFRkVSRU5DRSk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgeworCQkJSVByb2plY3QgcHJvaiA9IHJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKTsKKwkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2opIHx8IAorCQkJCQlKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChwcm9qKSB8fCAKKwkJCQkJSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2opIHx8IAorCQkJCQlKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChwcm9qKSkgeworCQkJCXJlZnNbaV0uc2V0UnVudGltZVBhdGgobmV3IFBhdGgoIi8iKS5tYWtlQWJzb2x1dGUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCX0JCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvRWFyTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvRWFyTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4NTYzZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9FYXJNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2UuamF2YQpAQCAtMCwwICsxLDQ1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIFJlZCBIYXQsIElCTQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKKyAqICAgIENodWNrIEJyaWRnaGFtIC0gYWRkaXRpb25hbCBzdXBwb3J0CisgKiAgICBSb2JlcnRvIFNhbmNoZXogLSBBZGQgQWR2YW5jZWQgc2VjdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkNvbnRyb2xEZWNvcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQWRkUmVmZXJlbmNlVG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlJlbW92ZVJlZmVyZW5jZUZyb21FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZS5KYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZS5KYXZhRUVNb2R1bGVIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkuSUphdmFFRURlcGxveW1lbnRBc3NlbWJseVNlY3Rpb25CdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLkoyRUVNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2UuQ2xhc3NwYXRoRW50cnlQcm94eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5KYXZhRUVDb21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLkphdmFFRURlcGxveW1lbnRBc3NlbWJseUFkdmFuY2VkU2VjdGlvbkJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSUVBUk1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5FYXJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0LkVhckNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldC5JQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5JTW9kdWxlSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5UYXNrTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5Db21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuRGVwZW5kZW5jeVBhZ2VFeHRlbnNpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuRGVwZW5kZW5jeVBhZ2VFeHRlbnNpb25NYW5hZ2VyLlJlZmVyZW5jZUV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkuaW50ZXJuYWwudGFza3dpemFyZC5UYXNrV2l6YXJkOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5JUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuSVJlZmVyZW5jZVdpemFyZENvbnN0YW50cy5Qcm9qZWN0Q29udmVydGVyT3BlcmF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5Nb2R1bGVBc3NlbWJseVJvb3RQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgRWFyTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlIGV4dGVuZHMKKwkJQWRkTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydGllc1BhZ2UgeworCXByaXZhdGUgU3RyaW5nIGxpYkRpciA9IG51bGw7CisJcHJpdmF0ZSBUZXh0IGxpYkRpclRleHQ7CisJcHJpdmF0ZSBDb250cm9sRGVjb3JhdGlvbiBsaWJEaXJUZXh0RXJyb3JEZWNvcmF0aW9uID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZWFyRGVmYXVsdExpckRpciA9IG5ldyBQYXRoKEoyRUVDb25zdGFudHMuRUFSX0RFRkFVTFRfTElCX0RJUikubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKKwlib29sZWFuIHByZXZpb3VzTGliRGlySXNWYWxpZCA9IHRydWU7CisJcHJpdmF0ZSBJSmF2YUVFRGVwbG95bWVudEFzc2VtYmx5U2VjdGlvbkJ1aWxkZXIgYWR2YW5jZWRIZWxwZXI7CisJCisJcHVibGljIEVhck1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZShJUHJvamVjdCBwcm9qZWN0LAorCQkJTW9kdWxlQXNzZW1ibHlSb290UGFnZSBwYWdlKSB7CisJCXN1cGVyKHByb2plY3QsIHBhZ2UpOworCQlhZHZhbmNlZEhlbHBlciA9IGdldEFkdmFuY2VkU2VjdGlvbkJ1aWxkZXIoKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKKwkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ0RhdGEpOworCQlmaWxsVGFibGVDb21wb3NpdGUoY29tcG9zaXRlKTsKKwkJaWYoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0pFRUNvbXBvbmVudChyb290Q29tcG9uZW50LCBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLkREX1ZFUlNJT04pICYmIEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNKRUVDb21wb25lbnQocm9vdENvbXBvbmVudCwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5GQUNFVF9WRVJTSU9OKSkKKwkJCWFkZExpYkRpckNvbXBvc2l0ZShjb21wb3NpdGUpOworCQlhZGRBZHZhbmNlZENvbXBvc2l0ZShjb21wb3NpdGUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGxvYWRMaWJEaXJTdHJpbmcoKSB7CisJCXJldHVybiBFYXJVdGlsaXRpZXMuZ2V0RUFSTGliRGlyKHJvb3RDb21wb25lbnQpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRMaWJEaXJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQlsaWJEaXIgPSBsb2FkTGliRGlyU3RyaW5nKCk7CisJCWlmKGxpYkRpciAhPSBudWxsKSB7CisJCQlDb21wb3NpdGUgYyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CisJCQlHcmlkRGF0YSBtYWluRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworCQkJYy5zZXRMYXlvdXREYXRhKG1haW5EYXRhKTsKKwkJCQorCQkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KDIsZmFsc2UpOworCQkJZ2wubWFyZ2luV2lkdGggPSAwOworCQkJZ2wubWFyZ2luSGVpZ2h0ID0gMDsKKwkJCWMuc2V0TGF5b3V0KGdsKTsKKwkJCUxhYmVsIGwgPSBuZXcgTGFiZWwoYywgU1dULk5PTkUpOworCQkJbC5zZXRUZXh0KE1lc3NhZ2VzLkVhck1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV9MSUJESVIpOworCQkJbGliRGlyVGV4dCA9IG5ldyBUZXh0KGMsIFNXVC5CT1JERVIpOworCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKKwkJCWdkLmhvcml6b250YWxJbmRlbnQgPSBGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0TWF4aW11bURlY29yYXRpb25XaWR0aCgpOworCQkJbGliRGlyVGV4dC5zZXRUZXh0KGxpYkRpcik7CisJCQlsaWJEaXJUZXh0LnNldExheW91dERhdGEoZ2QpOwkJCQorCQkJbGliRGlyVGV4dEVycm9yRGVjb3JhdGlvbiA9IG5ldyBDb250cm9sRGVjb3JhdGlvbihsaWJEaXJUZXh0LCBTV1QuVE9QIHwgU1dULkxFQUQpOworCQkJbGliRGlyVGV4dEVycm9yRGVjb3JhdGlvbi5oaWRlKCk7CisJCQlsaWJEaXJUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKKwkJCQkJbGliRGlyVGV4dE1vZGlmaWVkKCk7CisJCQkJfSB9KTsKKwkJCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsgLy9QbGFjZSBob2xkZXIgdG8gZmlsbCB0aGUgc2Vjb25kIGNvbHVtbiAKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBsaWJEaXJUZXh0TW9kaWZpZWQoKSB7CisJCWJvb2xlYW4gcmVmcmVzaCA9IG11c3RSZWZyZXNoTGliRGlyVmFsaWRhdGlvbk1lc3NhZ2VzKGxpYkRpciwgbGliRGlyVGV4dC5nZXRUZXh0KCkpOworCQlsaWJEaXIgPSBsaWJEaXJUZXh0LmdldFRleHQoKTsKKwkJaWYocmVmcmVzaCkKKwkJCXByb3BQYWdlLnJlZnJlc2hQcm9ibGVtc1ZpZXcoKTsKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gbXVzdFJlZnJlc2hMaWJEaXJWYWxpZGF0aW9uTWVzc2FnZXMoU3RyaW5nIG9sZExpYkRpciwgU3RyaW5nIG5ld0xpYkRpcikgeworCQlib29sZWFuIG5ld0lzVmFsaWQgPSBpc1ZhbGlkTGliRGlyKG5ld0xpYkRpcik7CisJCWJvb2xlYW4gbmV3SXNFbXB0eSA9IChuZXdMaWJEaXIgIT0gbnVsbCAmJiBuZXdMaWJEaXIudHJpbSgpLmxlbmd0aCgpID09IDApOworCQkgLy8gQm90aCBhcmUgdmFsaWQ7IG5vIG5lZWQgdG8gcmVmcmVzaAorCQlpZihwcmV2aW91c0xpYkRpcklzVmFsaWQgJiYgbmV3SXNWYWxpZCAmJiAhbmV3SXNFbXB0eSkKKwkJCXJldHVybiBmYWxzZTsKKwkJYm9vbGVhbiBvbGRJc1ZhbGlkID0gaXNWYWxpZExpYkRpcihvbGRMaWJEaXIpOworCQlib29sZWFuIG9sZElzRW1wdHkgPSAob2xkTGliRGlyICE9IG51bGwgJiYgb2xkTGliRGlyLnRyaW0oKS5sZW5ndGgoKSA9PSAwKTsKKwkJLy8gQm90aCBhcmUgaW52YWxpZCBhbmQgbm8gY2hhbmdlIGluIHJlYXNvbiBmb3IgYmVpbmcgaW52YWxpZDsgbm8gbmVlZCB0byByZWZyZXNoCisJCWlmKCFwcmV2aW91c0xpYkRpcklzVmFsaWQgJiYgb2xkSXNWYWxpZCA9PSBuZXdJc1ZhbGlkICYmIG9sZElzRW1wdHkgPT0gbmV3SXNFbXB0eSkKKwkJCXJldHVybiBmYWxzZTsJCQorCQlyZXR1cm4gdHJ1ZTsJCQkJCisJfQorCQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlbGliRGlyVGV4dCgpIHsKKwkJaWYobGliRGlyVGV4dEVycm9yRGVjb3JhdGlvbiAhPSBudWxsKSB7CisJCQlpZighaXNWYWxpZExpYkRpcihsaWJEaXIpKSB7CisJCQkJbGliRGlyVGV4dEVycm9yRGVjb3JhdGlvbi5zZXRJbWFnZShGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19FUlJPUikuZ2V0SW1hZ2UoKSk7CisJCQkJbGliRGlyVGV4dEVycm9yRGVjb3JhdGlvbi5zZXREZXNjcmlwdGlvblRleHQoTWVzc2FnZXMuRWFyTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlX0VSUk9SX0lOVkFMSURfTElCRElSKTsKKwkJCQlsaWJEaXJUZXh0RXJyb3JEZWNvcmF0aW9uLnNob3coKTsKKwkJCQlwcmV2aW91c0xpYkRpcklzVmFsaWQgPSBmYWxzZTsKKwkJCX1lbHNlIGlmKGxpYkRpciAhPSBudWxsICYmIGxpYkRpci50cmltKCkubGVuZ3RoKCkgPT0gMCl7CisJCQkJbGliRGlyVGV4dEVycm9yRGVjb3JhdGlvbi5zZXRJbWFnZShGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19XQVJOSU5HKS5nZXRJbWFnZSgpKTsKKwkJCQlsaWJEaXJUZXh0RXJyb3JEZWNvcmF0aW9uLnNldERlc2NyaXB0aW9uVGV4dChNZXNzYWdlcy5FYXJNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfV0FSTklOR19FTVBUWV9MSUJfRElSKTsKKwkJCQlsaWJEaXJUZXh0RXJyb3JEZWNvcmF0aW9uLnNob3coKTsKKwkJCQlwcmV2aW91c0xpYkRpcklzVmFsaWQgPSBmYWxzZTsKKwkJCX0gZWxzZSBpZighcHJldmlvdXNMaWJEaXJJc1ZhbGlkKXsKKwkJCQlwcmV2aW91c0xpYkRpcklzVmFsaWQgPSB0cnVlOworCQkJCWxpYkRpclRleHRFcnJvckRlY29yYXRpb24uc2V0SW1hZ2UobnVsbCk7CisJCQkJbGliRGlyVGV4dEVycm9yRGVjb3JhdGlvbi5zZXREZXNjcmlwdGlvblRleHQobnVsbCk7CisJCQkJbGliRGlyVGV4dEVycm9yRGVjb3JhdGlvbi5oaWRlKCk7CisJCQl9CisJCX0KKwl9CisJCisJcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRMaWJEaXIoU3RyaW5nIGxpYnJhcnlEaXJlY3RvcnkpIHsKKwkJaWYobGlicmFyeURpcmVjdG9yeSAhPSBudWxsICYmIGxpYnJhcnlEaXJlY3RvcnkudHJpbSgpLmxlbmd0aCgpID4gMCAmJiBuZXcgUGF0aChsaWJyYXJ5RGlyZWN0b3J5LnRyaW0oKSkuaXNBYnNvbHV0ZSgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHJvdGVjdGVkIElEYXRhTW9kZWxPcGVyYXRpb24gZ2VuZXJhdGVFQVJERE9wZXJhdGlvbigpIHsKKwkJSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlcigpKTsKKwkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuR0VORVJBVEVfREQsIHJvb3RDb21wb25lbnQpOworCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfUFJPSkVDVCwgcHJvamVjdCk7CisJCXJldHVybiBtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHBvc3RIYW5kbGVDaGFuZ2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVtb3ZlZChBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHJlbW92ZWQpIHsKKwkJc3VwZXIuaGFuZGxlUmVtb3ZlZChyZW1vdmVkKTsKKwkJYm9vbGVhbiBiaW5hcmllc1JlbW92ZWQgPSBmYWxzZTsKKwkJZm9yKElWaXJ0dWFsUmVmZXJlbmNlIHJlZiA6IHJlbW92ZWQpeworCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CisJCQlpZihjb21wLmlzQmluYXJ5KCkpeworCQkJCWJpbmFyaWVzUmVtb3ZlZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYoYmluYXJpZXNSZW1vdmVkKXsKKwkJCUphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci5jbGVhckRpc2Nvbm5lY3RlZEFyY2hpdmVzSW5FQVIocm9vdENvbXBvbmVudCk7CisJCX0KKwkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5xdWV1ZVVwZGF0ZUVBUihyb290Q29tcG9uZW50LmdldFByb2plY3QoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXRBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm92aWRlcihJVmlydHVhbFJlZmVyZW5jZSBjb21wb25lbnQpIHsKKwkJcmV0dXJuIG5ldyBBZGRSZWZlcmVuY2VUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVBc3NlbWJseVJvb3RQYWdlRGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBNZXNzYWdlcy5FYXJNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfMzsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldFJlbW92ZVJlZmVyZW5jZURhdGFNb2RlbFByb3ZpZGVyKElWaXJ0dWFsUmVmZXJlbmNlIGNvbXBvbmVudCkgeworCQlyZXR1cm4gbmV3IFJlbW92ZVJlZmVyZW5jZUZyb21FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcigpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBmaWx0ZXJSZWZlcmVuY2VUeXBlcyggZmluYWwgTGlzdDxSZWZlcmVuY2VFeHRlbnNpb24+IGV4dGVuc2lvbnMgKSAKKwl7CisJCS8vIFJlcGxhY2UgdGhlIGRlZmF1bHQgb25lIHdpdGggb3VyIG93biBjdXN0b20gb25lLCBpbiBjbGFzcyBDdXN0b21FQVJQcm9qZWN0UmVmZXJlbmNlV2l6YXJkRnJhZ21lbnQKKwkJCisJCWZvciggaW50IGkgPSAwLCBuID0gZXh0ZW5zaW9ucy5zaXplKCk7IGkgPCBuOyBpKysgKSAKKwkJeworCQkJZmluYWwgUmVmZXJlbmNlRXh0ZW5zaW9uIGV4dCA9IGV4dGVuc2lvbnMuZ2V0KCBpICk7CisJCQkKKwkJCWlmKCBleHQuZ2V0SWQoKS5lcXVhbHMoICJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkubmV3UHJvamVjdFJlZmVyZW5jZSIgKSApICAvLyROT04tTkxTLTEkCisJCQl7CisJCQkJZXh0ZW5zaW9ucy5zZXQoIGksIERlcGVuZGVuY3lQYWdlRXh0ZW5zaW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZmluZFJlZmVyZW5jZUV4dGVuc2lvbiggIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnByZWZlcmVuY2VzLkN1c3RvbUVBUlByb2plY3RSZWZlcmVuY2VXaXphcmRGcmFnbWVudCIgKSApOyAvLyROT04tTkxTLTEkCisJCQl9CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlREQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCWlmKCByb290Q29tcG9uZW50ICE9IG51bGwgKXsKKwkJCUlEYXRhTW9kZWxPcGVyYXRpb24gb3AgPSBnZW5lcmF0ZUVBUkRET3BlcmF0aW9uKCk7CisJCQl0cnkgeworCQkJCW9wLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7CisJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgeworCQkJCUoyRUVVSVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCX0KKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7CisJCXN1cGVyLmhhbmRsZUV2ZW50KGV2ZW50KTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7CisJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7CisJCWlmKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNKRUVDb21wb25lbnQocm9vdENvbXBvbmVudCwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5ERF9WRVJTSU9OKSAmJiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkVFQ29tcG9uZW50KHJvb3RDb21wb25lbnQsIEphdmFFRVByb2plY3RVdGlsaXRpZXMuRkFDRVRfVkVSU0lPTikgJiYgbGliRGlyICE9IG51bGwpCisJCQl1cGRhdGVMaWJEaXIoKTsKKwkJaWYgKGFkdmFuY2VkSGVscGVyICE9IG51bGwpCisJCQlyZXN1bHQgPSByZXN1bHQgJiBhZHZhbmNlZEhlbHBlci5zYXZlQ29udGVudHMoKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpYkRpcigpIHsKKwkJaWYgKCFsaWJEaXIuZXF1YWxzKGVhckRlZmF1bHRMaXJEaXIpKSB7CisJCQlJVmlydHVhbEZpbGUgdkZpbGUgPSByb290Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKSk7CisJCQlpZiAoIXZGaWxlLmV4aXN0cygpKSB7CisJCQkJaWYgKCFNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihudWxsLCAKKwkJCQkJCUoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk5PX0REX01TR19USVRMRSksIAorCQkJCQkJSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuR0VOX0REX1FVRVNUSU9OKSkpIAorCQkJCQlyZXR1cm47CisJCQkJY3JlYXRlREQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCQl9CisJCX0KKwkJCisJCWZpbmFsIElFQVJNb2RlbFByb3ZpZGVyIGVhck1vZGVsID0gKElFQVJNb2RlbFByb3ZpZGVyKU1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCk7CisJCUFwcGxpY2F0aW9uIGFwcCA9IChBcHBsaWNhdGlvbillYXJNb2RlbC5nZXRNb2RlbE9iamVjdCgpOworCQlTdHJpbmcgb2xkTGliRGlyID0gYXBwLmdldExpYnJhcnlEaXJlY3RvcnkoKTsKKwkJaWYgKGxpYkRpci5lcXVhbHMoZWFyRGVmYXVsdExpckRpcikpIHsKKwkJCWlmKG9sZExpYkRpciAhPSBudWxsKSB7CisJCQkJZWFyTW9kZWwubW9kaWZ5KG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCisJCQkJCUFwcGxpY2F0aW9uIGFwcDIgPSAoQXBwbGljYXRpb24pZWFyTW9kZWwuZ2V0TW9kZWxPYmplY3QoKTsKKwkJCQkJYXBwMi5zZXRMaWJyYXJ5RGlyZWN0b3J5KG51bGwpOworCQkJCX19LCBudWxsKTsKKwkJCX0KKwkJfSBlbHNlIGlmICgob2xkTGliRGlyICE9IG51bGwgJiYgIW9sZExpYkRpci5lcXVhbHMobGliRGlyKSkgfHwgb2xkTGliRGlyID09IG51bGwpIHsKKwkJCWVhck1vZGVsLm1vZGlmeShuZXcgUnVubmFibGUoKSB7CisJCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCisJCQkJQXBwbGljYXRpb24gYXBwMiA9IChBcHBsaWNhdGlvbillYXJNb2RlbC5nZXRNb2RlbE9iamVjdCgpOworCQkJCWFwcDIuc2V0TGlicmFyeURpcmVjdG9yeShsaWJEaXIpOworCQkJfX0sIG51bGwpOworCQl9CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbVJlZmVyZW5jZVdpemFyZFByb3BlcnRpZXMoVGFza01vZGVsIG1vZGVsKSB7CisJCW1vZGVsLnB1dE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkRFRkFVTFRfTElCUkFSWV9MT0NBVElPTiwgbGliRGlyKTsKKwkJbW9kZWwucHV0T2JqZWN0KElSZWZlcmVuY2VXaXphcmRDb25zdGFudHMuUFJPSkVDVF9DT05WRVJURVJfT1BFUkFUSU9OX1BST1ZJREVSLCBnZXRDb252ZXJ0ZXJQcm92aWRlcigpKTsKKwl9CisJCisJcHVibGljIFByb2plY3RDb252ZXJ0ZXJPcGVyYXRpb25Qcm92aWRlciBnZXRDb252ZXJ0ZXJQcm92aWRlcigpIHsKKwkJcmV0dXJuIG5ldyBQcm9qZWN0Q29udmVydGVyT3BlcmF0aW9uUHJvdmlkZXIoKSB7CisJCQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXRDb252ZXJzaW9uT3BlcmF0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKKwkJCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuY3JlYXRlRmxleEphdmFQcm9qZWN0Rm9yUHJvamVjdE9wZXJhdGlvbihwcm9qZWN0KTsKKwkJCX0KKwkJfTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElNb2R1bGVIYW5kbGVyIGdldE1vZHVsZUhhbmRsZXIoKSB7CisJCWlmKG1vZHVsZUhhbmRsZXIgPT0gbnVsbCkKKwkJCW1vZHVsZUhhbmRsZXIgPSBuZXcgSmF2YUVFTW9kdWxlSGFuZGxlcigpOworCQlyZXR1cm4gbW9kdWxlSGFuZGxlcjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlciBjcmVhdGVQcm92aWRlcigpIHsKKwkJSmF2YUVFQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBKYXZhRUVDb21wb25lbnREZXBlbmRlbmN5Q29udGVudFByb3ZpZGVyKHRoaXMpOworCQlwcm92aWRlci5zZXRDbGFzc3BhdGhFbnRyaWVzKG5ldyBBcnJheUxpc3Q8Q2xhc3NwYXRoRW50cnlQcm94eT4oKSk7CisJCXJldHVybiBwcm92aWRlcjsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVtb3ZlKE9iamVjdCBzZWxlY3RlZE9iamVjdCkgeworCQlyZXR1cm4gc3VwZXIuY2FuUmVtb3ZlKHNlbGVjdGVkT2JqZWN0KSAmJiAhKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSmF2YUVFQ29tcG9uZW50RGVwZW5kZW5jeUNvbnRlbnRQcm92aWRlci5Db25zdW1lZENsYXNzcGF0aEVudHJ5UHJveHkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IHNlbGVjdGVkSXRlbSkgeworCQlzdXBlci5yZW1vdmUoc2VsZWN0ZWRJdGVtKTsKKwkJYWR2YW5jZWRIZWxwZXIuZGlyZWN0aXZlUmVtb3ZlZChzZWxlY3RlZEl0ZW0pOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKKwkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZSgpOworCQl2YWxpZGF0ZWxpYkRpclRleHQoKTsKKwkJaWYobGliRGlyVGV4dEVycm9yRGVjb3JhdGlvbiAhPSBudWxsICYmIGxpYkRpclRleHRFcnJvckRlY29yYXRpb24uZ2V0SW1hZ2UoKSAhPSBudWxsKSB7CisJCQlpbnQgc2V2ZXJpdHkgPSBTdGF0dXMuRVJST1I7CisJCQlpZihsaWJEaXJUZXh0RXJyb3JEZWNvcmF0aW9uLmdldEltYWdlKCkuZXF1YWxzKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRGaWVsZERlY29yYXRpb24oRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuREVDX1dBUk5JTkcpLmdldEltYWdlKCkpKQorCQkJCXNldmVyaXR5ID0gU3RhdHVzLldBUk5JTkc7CQorCQkJc3RhdHVzID0gYXBwZW5kU3RhdHVzTWVzc2FnZShzdGF0dXMsIGxpYkRpclRleHRFcnJvckRlY29yYXRpb24uZ2V0RGVzY3JpcHRpb25UZXh0KCksIHNldmVyaXR5KTsKKwkJfQorCQlzdGF0dXMgPSBhZHZhbmNlZEhlbHBlci52YWxpZGF0ZShzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7CisJCWxpYkRpciA9IGxvYWRMaWJEaXJTdHJpbmcoKTsKKwkJaWYobGliRGlyICE9IG51bGwpCisJCQlsaWJEaXJUZXh0LnNldFRleHQobGliRGlyKTsKKwkJaWYgKGFkdmFuY2VkSGVscGVyICE9IG51bGwpCisJCQlhZHZhbmNlZEhlbHBlci5sb2FkQ29udGVudHMoKTsKKwkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7CisJfQorCQorCXByaXZhdGUgSVN0YXR1cyBhcHBlbmRTdGF0dXNNZXNzYWdlKElTdGF0dXMgZXhpc3RpbmdTdGF0dXMsIFN0cmluZyBtZXNzYWdlLCBpbnQgc2V2ZXJpdHkpIHsKKyAgICAgICAgTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXM7CisgICAgICAgIElTdGF0dXMgbmV3U3RhdHVzID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgSjJFRVVJUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7CisJCWludCBuZXdTZXZlcml0eSA9IHNldmVyaXR5OworCQlpZihleGlzdGluZ1N0YXR1cy5nZXRTZXZlcml0eSgpID4gc2V2ZXJpdHkpCisJCQluZXdTZXZlcml0eSA9IGV4aXN0aW5nU3RhdHVzLmdldFNldmVyaXR5KCk7CisgICAgICAgIGlmKGV4aXN0aW5nU3RhdHVzIGluc3RhbmNlb2YgTXVsdGlTdGF0dXMpeworICAgICAgICAgICAgbXVsdGlTdGF0dXMgPSAoTXVsdGlTdGF0dXMpZXhpc3RpbmdTdGF0dXM7CisgICAgICAgICAgICBtdWx0aVN0YXR1cy5tZXJnZShuZXdTdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAJaWYoIWV4aXN0aW5nU3RhdHVzLmlzTXVsdGlTdGF0dXMoKSAmJiBleGlzdGluZ1N0YXR1cy5pc09LKCkpIHsKKyAgICAgICAgCQlyZXR1cm4gbmV3U3RhdHVzOworICAgICAgICAJfQorICAgICAgICAgICAgSVN0YXR1cyBbXSBjaGlsZHJlbiA9IG5ldyBJU3RhdHVzIFtdIHtleGlzdGluZ1N0YXR1cywgbmV3U3RhdHVzfTsKKyAgICAgICAgICAgIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEoyRUVVSVBsdWdpbi5QTFVHSU5fSUQsIG5ld1NldmVyaXR5LCBjaGlsZHJlbiwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG11bHRpU3RhdHVzOworICAgIH0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBZGREaXJlY3RpdmUoIGZpbmFsIFRhc2tXaXphcmQgd2l6YXJkICkKKwl7CisJCWZpbmFsIE9iamVjdCBmb2xkZXJNYXBwaW5nID0gd2l6YXJkLmdldFRhc2tNb2RlbCgpLmdldE9iamVjdChJUmVmZXJlbmNlV2l6YXJkQ29uc3RhbnRzLkZPTERFUl9NQVBQSU5HKTsKKwkJCisJCWlmKCBmb2xkZXJNYXBwaW5nICE9IG51bGwgJiYgZm9sZGVyTWFwcGluZyBpbnN0YW5jZW9mIENvbXBvbmVudFJlc291cmNlUHJveHkgfHwgbGliRGlyID09IG51bGwpIAorCQl7CisJCQlzdXBlci5oYW5kbGVBZGREaXJlY3RpdmUod2l6YXJkKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCU9iamVjdCByZWZlcmVuY2UgPSB3aXphcmQuZ2V0VGFza01vZGVsKCkuZ2V0T2JqZWN0KElSZWZlcmVuY2VXaXphcmRDb25zdGFudHMuRklOQUxfUkVGRVJFTkNFKTsKKwkJCQorCQkJaWYoIHJlZmVyZW5jZSAhPSBudWxsICkgCisJCQl7CisJCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VBcnJheSA9IHJlZmVyZW5jZSBpbnN0YW5jZW9mIElWaXJ0dWFsUmVmZXJlbmNlID8gCisJCQkJCQluZXcgSVZpcnR1YWxSZWZlcmVuY2VbXSB7IChJVmlydHVhbFJlZmVyZW5jZSlyZWZlcmVuY2UgfSA6IAorCQkJCQkJCShJVmlydHVhbFJlZmVyZW5jZVtdKXJlZmVyZW5jZTsKKwkJCQlmb3IoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlQXJyYXkubGVuZ3RoOyBpKyspIHsKKwkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gcmVmZXJlbmNlQXJyYXlbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOworCQkJCQlpZihjb21wb25lbnQgaW5zdGFuY2VvZglWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgeworCQkJCQkJSmF2YUVFUXVpY2tQZWVrIHFwID0gSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLmdldEphdmFFRVF1aWNrUGVlayhjb21wb25lbnQpOworCQkJCQkJc3dpdGNoIChxcC5nZXRUeXBlKCkpIHsKKwkJCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkVKQl9UWVBFOgorCQkJCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuV0VCX1RZUEU6CisJCQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9DTElFTlRfVFlQRToKKwkJCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkNPTk5FQ1RPUl9UWVBFOgorCQkJCQkJCXJlZmVyZW5jZUFycmF5W2ldLnNldFJ1bnRpbWVQYXRoKG5ldyBQYXRoKCIvIikpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9CisJCQkJCX0KKwkJCQkJY3VycmVudFJlZmVyZW5jZXMuYWRkKHJlZmVyZW5jZUFycmF5W2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJYWR2YW5jZWRIZWxwZXIuZGlyZWN0aXZlQWRkZWQod2l6YXJkLmdldFRhc2tNb2RlbCgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgYWRkQWR2YW5jZWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgeworCQlpZiAoYWR2YW5jZWRIZWxwZXIgIT0gbnVsbCkgeworCQkJYWR2YW5jZWRIZWxwZXIuYnVpbGRTZWN0aW9uKHBhcmVudCk7CisJCQlhZHZhbmNlZEhlbHBlci5sb2FkQ29udGVudHMoKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgSUphdmFFRURlcGxveW1lbnRBc3NlbWJseVNlY3Rpb25CdWlsZGVyIGdldEFkdmFuY2VkU2VjdGlvbkJ1aWxkZXIoKXsKKwkJaWYgKGFkdmFuY2VkSGVscGVyID09IG51bGwpeworCQkJYWR2YW5jZWRIZWxwZXIgPSBuZXcgSmF2YUVFRGVwbG95bWVudEFzc2VtYmx5QWR2YW5jZWRTZWN0aW9uQnVpbGRlcihyb290Q29tcG9uZW50LCB0aGlzKTsKKwkJfQorCQlyZXR1cm4gYWR2YW5jZWRIZWxwZXI7CQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFJ1bnRpbWVQYXRoQ2VsbE1vZGlmaWVyIGdldFJ1bnRpbWVQYXRoQ2VsbE1vZGlmaWVyKCkgeworCQlyZXR1cm4gbmV3IEFkZE1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnRpZXNQYWdlLlJ1bnRpbWVQYXRoQ2VsbE1vZGlmaWVyKCl7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKKwkJCQlDb21wb25lbnRSZXNvdXJjZVByb3h5IG9yaWdpbmFsUmVzb3VyY2UgPSBudWxsOworCQkJCUNvbXBvbmVudFJlc291cmNlUHJveHkgbW9kaWZpZWRSZXNvdXJjZSA9IG51bGw7CisJCQkJaWYgKHByb3BlcnR5LmVxdWFscyhERVBMT1lfUEFUSF9QUk9QRVJUWSkpIHsJCQkJCQorCQkJCQlUcmVlSXRlbSBpdGVtID0gKFRyZWVJdGVtKSBlbGVtZW50OworCQkJCQlpZiggaXRlbS5nZXREYXRhKCkgaW5zdGFuY2VvZiBDb21wb25lbnRSZXNvdXJjZVByb3h5KSB7CisJCQkJCQltb2RpZmllZFJlc291cmNlID0gKENvbXBvbmVudFJlc291cmNlUHJveHkpaXRlbS5nZXREYXRhKCk7CisJCQkJCQlvcmlnaW5hbFJlc291cmNlID0gbmV3IENvbXBvbmVudFJlc291cmNlUHJveHkobW9kaWZpZWRSZXNvdXJjZS5zb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2UucnVudGltZVBhdGgpOwkJCQkJCQorCQkJCQl9CisJCQkJfQorCQkJCXN1cGVyLm1vZGlmeShlbGVtZW50LCBwcm9wZXJ0eSwgdmFsdWUpOworCQkJCWlmIChvcmlnaW5hbFJlc291cmNlICE9IG51bGwgJiYgYWR2YW5jZWRIZWxwZXIgIT0gbnVsbCkKKwkJCQkJYWR2YW5jZWRIZWxwZXIuY29tcG9uZW50UmVzb3VyY2VNb2RpZmllZChvcmlnaW5hbFJlc291cmNlLCBtb2RpZmllZFJlc291cmNlKTsKKwkJCX0JCisJCX07CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0Vhck1vZHVsZURlcGVuZGVuY3lQYWdlUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9FYXJNb2R1bGVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMyNzI0YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9FYXJNb2R1bGVEZXBlbmRlbmN5UGFnZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQsIElCTQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBSb2IgU3RyeWtlciAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKKyAqICAgIENodWNrIEJyaWRnaGFtIC0gQWRkaXRpb25hbCBzdXBwb3J0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5wcm9wZXJ0eXBhZ2UuSURlcGVuZGVuY3lQYWdlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnVpLnByb3BlcnR5cGFnZS5JTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUudWkucHJvcGVydHlwYWdlLk1vZHVsZUFzc2VtYmx5Um9vdFBhZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgRWFyTW9kdWxlRGVwZW5kZW5jeVBhZ2VQcm92aWRlciBpbXBsZW1lbnRzIElEZXBlbmRlbmN5UGFnZVByb3ZpZGVyIHsKKworCXB1YmxpYyBib29sZWFuIGNhbkhhbmRsZShJRmFjZXRlZFByb2plY3QgcHJvamVjdCkgeworCQlib29sZWFuIGlzRUFSID0gcHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9NT0RVTEUpKTsKKwkJcmV0dXJuIGlzRUFSOworCX0KKworCXB1YmxpYyBJTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbFtdIGNyZWF0ZVBhZ2VzKElGYWNldGVkUHJvamVjdCBwcm9qZWN0LAorCQkJTW9kdWxlQXNzZW1ibHlSb290UGFnZSBwYXJlbnQpIHsKKwkJcmV0dXJuIG5ldyBJTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbFtdIHsKKwkJCQluZXcgRWFyTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlKHByb2plY3QuZ2V0UHJvamVjdCgpLCBwYXJlbnQpCisJCX07CisJfQorCisJcHVibGljIENvbXBvc2l0ZSBjcmVhdGVSb290Q29udHJvbChJRmFjZXRlZFByb2plY3QgcHJvamVjdCxJTW9kdWxlRGVwZW5kZW5jaWVzQ29udHJvbFtdIHBhZ2VzLAorCQkJQ29tcG9zaXRlIHBhcmVudCkgeworCQlpZiggcGFnZXMubGVuZ3RoID09IDEgJiYgcGFnZXNbMF0gIT0gbnVsbCkKKwkJCXJldHVybiBwYWdlc1swXS5jcmVhdGVDb250ZW50cyhwYXJlbnQpOworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIFN0cmluZyBnZXRQYWdlVGl0bGUoSVByb2plY3QgcHJvamVjdCkgeworCQlyZXR1cm4gTWVzc2FnZXMuRWFyTW9kdWxlRGVwZW5kZW5jeVBhZ2VQcm92aWRlcl8wOworCX0KKworCisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9JSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbmRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0lKYXZhRUVQcmVmZXJlbmNlUGFnZUV4dGVuZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1YTU0YgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9JSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbmRlci5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKKworcHVibGljIGFic3RyYWN0IGludGVyZmFjZSBJSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbmRlciB7CisKKwlDb21wb3NpdGUgIGV4dGVuZFBhZ2UoQ29tcG9zaXRlIHBhcmVudCk7CisJdm9pZCBwZXJmb3JtRGVmYXVsdHMoKTsKKwlib29sZWFuIHBlcmZvcm1PaygpOworCXZvaWQgZGlzcG9zZSgpOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0phdmFFRVByZWZlcmVuY2VQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvSmF2YUVFUHJlZmVyZW5jZVBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTRmNWIyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL0phdmFFRVByZWZlcmVuY2VQYWdlLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKKworCitwdWJsaWMgY2xhc3MgSmF2YUVFUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCisJCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7CisKKwlwcml2YXRlIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzOworCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBKMkVFUGx1Z2luLkRZTkFNSUNfVFJBTlNMQVRJT05fT0ZfSkVUX1RFTVBMQVRFU19QUkVGX0tFWTsKKwlwcml2YXRlIEJ1dHRvbiBzaG93UmVmZXJlbmNlczsKKwlwcml2YXRlIGJvb2xlYW4gZHluYW1pY1RyYW5zbGF0aW9uOworCXByaXZhdGUgQXJyYXlMaXN0PElKYXZhRUVQcmVmZXJlbmNlUGFnZUV4dGVuZGVyPiBleHRlbmRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisKKwlwdWJsaWMgSmF2YUVFUHJlZmVyZW5jZVBhZ2UoKSB7CisJCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkpBVkFfRUVfUFJFRkVSRU5DRV9QQUdFX05BTUUpKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7CisJCXByZWZlcmVuY2VzLnNldFRvRGVmYXVsdChuYW1lKTsKKwkJSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CisJCWR5bmFtaWNUcmFuc2xhdGlvbiA9IHByZWZlcmVuY2VzLmdldEJvb2xlYW4obmFtZSk7CisJCXNob3dSZWZlcmVuY2VzLnNldFNlbGVjdGlvbihkeW5hbWljVHJhbnNsYXRpb24pOworCQlmb3IoSUphdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5kZXIgZXh0ZW5kZXIgOiBleHRlbmRlcnMgKXsKKwkJCSBleHRlbmRlci5wZXJmb3JtRGVmYXVsdHMoKTsKKwkJfQorCisJCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIHJlc3VsdD0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWxheW91dC5tYXJnaW5IZWlnaHQ9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7CisJCWxheW91dC5tYXJnaW5XaWR0aD0gMDsKKwkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZz0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDEwKTsKKwkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7CisJCXJlc3VsdC5zZXRMYXlvdXQobGF5b3V0KTsKKwkJR3JvdXAgYnV0dG9uQ29tcG9zaXRlPSBuZXcgR3JvdXAocmVzdWx0LCBTV1QuTk9ORSk7CisJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CQkKKwkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOworICAgICAgICBidXR0b25Db21wb3NpdGUuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5KQVZBX0VFX1BSRUZFUkVOQ0VfUEFHRV9KRVRfVEVNUExBVEUpKTsKKworCQlzaG93UmVmZXJlbmNlcyA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOworCQlzaG93UmVmZXJlbmNlcy5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkpBVkFfRUVfUFJFRkVSRU5DRV9QQUdFX0RZTl9UUkFOU0xBVElPTl9CVE5fTkFNRSkpOyAKKwkJc2hvd1JlZmVyZW5jZXMuc2V0U2VsZWN0aW9uKGR5bmFtaWNUcmFuc2xhdGlvbik7CisJCXNob3dSZWZlcmVuY2VzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CisJCQkJZHluYW1pY1RyYW5zbGF0aW9uID0gc2hvd1JlZmVyZW5jZXMuZ2V0U2VsZWN0aW9uKCk7CisJCQl9CisJCX0pOworCQlpbnZva2VFeHRlbnNpb25zKHJlc3VsdCk7CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7CisJCXByZWZlcmVuY2VzID0gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJZHluYW1pY1RyYW5zbGF0aW9uID0gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihuYW1lKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7CisJCXByZWZlcmVuY2VzLnNldFZhbHVlKG5hbWUsIHNob3dSZWZlcmVuY2VzLmdldFNlbGVjdGlvbigpKTsKKwkJSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7CisJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CisJCWZvcihJSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbmRlciBleHRlbmRlciA6IGV4dGVuZGVycyApeworCQkJcmVzdWx0ID0gZXh0ZW5kZXIucGVyZm9ybU9rKCk7CisJCX0KKwkJcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCQorCXByb3RlY3RlZCB2b2lkIGludm9rZUV4dGVuc2lvbnMoQ29tcG9zaXRlIHBhcmVudCl7CisJCUxpc3Q8SmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbnNpb24+IGxpc3QgPSBKYXZhRUVQcmVmZXJlbmNlUGFnZUV4dGVuc2lvblJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEphdmFFRVBhZ2VFeHRlbmRlcnMoKTsKKwkJZm9yKEphdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5zaW9uIHBhZ2VFeHRlbnNpb24gOiBsaXN0ICl7CisJCQlJSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbmRlciBleHRlbmRlciA9IHBhZ2VFeHRlbnNpb24uZ2V0SW5zdGFuY2UoKTsKKwkJCWV4dGVuZGVycy5hZGQoZXh0ZW5kZXIpOworCQkJZXh0ZW5kZXIuZXh0ZW5kUGFnZShwYXJlbnQpOworCQl9CisJfQorCQorCSBAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCl7CisJCQlmb3IoSUphdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5kZXIgZXh0ZW5kZXIgOiBleHRlbmRlcnMgKXsKKwkJCQlleHRlbmRlci5kaXNwb3NlKCk7CisJCQl9CisJIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9KYXZhRUVQcmVmZXJlbmNlUGFnZUV4dGVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGUzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbnNpb24uamF2YQpAQCAtMCwwICsxLDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkFzc2VydDsKKworCisKKworCitwdWJsaWMgY2xhc3MgSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbnNpb24geworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBRUVfUEFHRV9FWFRFTlNJT04gPSAiamF2YWVlcGFnZWV4dGVuZGVyIjsgLy8kTk9OLU5MUy0xJAorCQorCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKKwlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OworCXByaXZhdGUgSUphdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5kZXIgaW5zdGFuY2U7CisJcHJpdmF0ZSBib29sZWFuIGVycm9yQ29uZGl0aW9uID0gZmFsc2U7CisJCisJcHVibGljIEphdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5zaW9uKCl7CisJCXN1cGVyKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBpbml0KCkgeworCQlpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7CisJfQorCisJLyoqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBpZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElkKCkgeworCQlyZXR1cm4gaWQ7CisJfQorCisJLyoqCisJICogQHBhcmFtIGlkCisJICogICAgICAgICAgICBUaGUgaWQgdG8gc2V0LgorCSAqLworCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworCQl0aGlzLmlkID0gaWQ7CisJfQorCQorCXB1YmxpYyBKYXZhRUVQcmVmZXJlbmNlUGFnZUV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgeworCQlBc3NlcnQuaXNMZWdhbChKQVZBRUVfUEFHRV9FWFRFTlNJT04uZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSwgIkV4dGVuc2lvbnMgbXVzdCBiZSBvZiB0aGUgdHlwZSBcIiIgKyBKQVZBRUVfUEFHRV9FWFRFTlNJT04gKyAiXCIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OworCQlpbml0KCk7CisJfQorCisJcHVibGljIElKYXZhRUVQcmVmZXJlbmNlUGFnZUV4dGVuZGVyIGdldEluc3RhbmNlKCkgeworCQl0cnkgeworCQkJaWYgKGluc3RhbmNlID09IG51bGwgJiYgIWVycm9yQ29uZGl0aW9uKQorCQkJCWluc3RhbmNlID0gKElKYXZhRUVQcmVmZXJlbmNlUGFnZUV4dGVuZGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzTmFtZSIpOyAvLyROT04tTkxTLTEkCisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisJCQllcnJvckNvbmRpdGlvbiA9IHRydWU7CisJCX0KKwkJcmV0dXJuIGluc3RhbmNlOworCX0JCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbnNpb25SZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9KYXZhRUVQcmVmZXJlbmNlUGFnZUV4dGVuc2lvblJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYWZiMzEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbnNpb25SZWFkZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOworCisKKworcHVibGljIGNsYXNzIEphdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5zaW9uUmVhZGVyIGV4dGVuZHMgUmVnaXN0cnlSZWFkZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbnNpb25SZWFkZXIgaW5zdGFuY2UgPSBudWxsOworCXByaXZhdGUgTGlzdDxKYXZhRUVQcmVmZXJlbmNlUGFnZUV4dGVuc2lvbj4gcGFnZUV4dGVuZGVycyA9IG51bGw7CisJCisJcHVibGljIEphdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5zaW9uUmVhZGVyKCl7CisJCXN1cGVyKCJvcmcuZWNsaXBzZS5qc3QuajJlZS51aSIsICJKYXZhRUVQcmVmZXJlbmNlUGFnZUV4dGVuZGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKKwl9CisJCisKKwlwdWJsaWMgc3RhdGljIEphdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5zaW9uUmVhZGVyIGdldEluc3RhbmNlKCkgeworCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgeworCQkJaW5zdGFuY2UgPSBuZXcgSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbnNpb25SZWFkZXIoKTsKKwkJCWluc3RhbmNlLnJlYWRSZWdpc3RyeSgpOworCQl9CisJCXJldHVybiBpbnN0YW5jZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKEphdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5zaW9uLkpBVkFFRV9QQUdFX0VYVEVOU0lPTi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7CisJCQlhZGRFeHRlbnNpb24oZWxlbWVudCk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgbmV3RXh0ZW5zaW9uKSB7CisJCWdldEphdmFFRVBhZ2VFeHRlbmRlcnMoKS5hZGQobmV3IEphdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5zaW9uKG5ld0V4dGVuc2lvbikpOworCX0KKwkKKwlwdWJsaWMgTGlzdDxKYXZhRUVQcmVmZXJlbmNlUGFnZUV4dGVuc2lvbj4gZ2V0SmF2YUVFUGFnZUV4dGVuZGVycygpIHsKKwkJaWYgKHBhZ2VFeHRlbmRlcnMgPT0gbnVsbCkKKwkJCXBhZ2VFeHRlbmRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCXJldHVybiBwYWdlRXh0ZW5kZXJzOworCX0JCisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL01lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExODQzOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFYXJNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfMDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFYXJNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfMTsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFYXJNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfMjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFYXJNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfMzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFYXJNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfTElCRElSOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVhck1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV9FUlJPUl9JTlZBTElEX0xJQkRJUjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBFYXJNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfV0FSTklOR19FTVBUWV9MSUJfRElSOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVhck1vZHVsZURlcGVuZGVuY3lQYWdlUHJvdmlkZXJfMDsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWJEZXBlbmRlbmN5UHJvcGVydHlQYWdlXzA7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViRGVwZW5kZW5jeVByb3BlcnR5UGFnZV8xOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoaWxkQ2xhc3NwYXRoRGVwZW5kZW5jeURlc2NyaXB0aW9uOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzcGF0aERlcGVuZGVuY3lGcmFnbWVudFRpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzcGF0aERlcGVuZGVuY3lGcmFnbWVudERlc2NyaXB0aW9uOworCQorCXN0YXRpYyB7CisJCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKKwl9CisKKwlwcml2YXRlIE1lc3NhZ2VzKCkgeworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL21lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgzOWZiNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTMgQEAKK0Vhck1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV8wPUFkZCBFYXIgTW9kdWxlIEZvbGRlci4uLgorRWFyTW9kdWxlRGVwZW5kZW5jaWVzUHJvcGVydHlQYWdlXzE9QWRkIEVhciBNb2R1bGUgUmVmZXJlbmNlLi4uCitFYXJNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfMj1FZGl0IEVhciBNb2R1bGUgUmVmZXJlbmNlLi4uCitFYXJNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfMz1EZWZpbmUgcGFja2FnaW5nIHN0cnVjdHVyZSBmb3IgdGhpcyBKYXZhIEVFIEFwcGxpY2F0aW9uIHByb2plY3QuCitFYXJNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfTElCRElSPUVBUiAmbGlicmFyeSBkaXJlY3Rvcnk6CitFYXJNb2R1bGVEZXBlbmRlbmNpZXNQcm9wZXJ0eVBhZ2VfRVJST1JfSU5WQUxJRF9MSUJESVI9TGlicmFyeSBkaXJlY3RvcnkgdmFsdWUgY2Fubm90IGJlZ2luIHdpdGggYSBzbGFzaCBjaGFyYWN0ZXIuIFNwZWNpZnkgYXMgcmVsYXRpdmUgcGF0aCB0byB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC4KK0Vhck1vZHVsZURlcGVuZGVuY2llc1Byb3BlcnR5UGFnZV9XQVJOSU5HX0VNUFRZX0xJQl9ESVI9QW4gZW1wdHkgbGlicmFyeSBkaXJlY3RvcnkgZmllbGQgaW5kaWNhdGVzIHRoYXQgbm8gbGlicmFyeSBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIGNsYXNzIHBhdGhzISBTZXQgdGhlIHZhbHVlIHRvICdsaWInIHRvIHVzZSB0aGUgZGVmYXVsdCBsaWJyYXJ5IGRpcmVjdG9yeS4KK0Vhck1vZHVsZURlcGVuZGVuY3lQYWdlUHJvdmlkZXJfMD1FYXIgTW9kdWxlIEFzc2VtYmx5CitXZWJEZXBlbmRlbmN5UHJvcGVydHlQYWdlXzA9QWRkIFdlYiBMaWJyYXJ5IFJlZmVyZW5jZS4uLgorV2ViRGVwZW5kZW5jeVByb3BlcnR5UGFnZV8xPURlZmluZSBwYWNrYWdpbmcgc3RydWN0dXJlIGZvciB0aGlzIEphdmEgRUUgV2ViIEFwcGxpY2F0aW9uIHByb2plY3QuCitDaGlsZENsYXNzcGF0aERlcGVuZGVuY3lEZXNjcmlwdGlvbj1QdWxsIGluIGNsYXNzcGF0aCBlbGVtZW50cyBmcm9tIHJlZmVyZW5jZWQgcHJvamVjdHMuCitDbGFzc3BhdGhEZXBlbmRlbmN5RnJhZ21lbnRUaXRsZT1NYW5hZ2UgcmVmZXJlbmNlZCBjbGFzc3BhdGggZW50cmllcworQ2xhc3NwYXRoRGVwZW5kZW5jeUZyYWdtZW50RGVzY3JpcHRpb249SGVyZSB5b3UgY2FuIGFkanVzdCB3aGljaCByZWZlcmVuY2VkIHByb2plY3RzJyBjbGFzc3BhdGggZW50cmllcyBzaG91bGQgYmUgcHVsbGVkIGludG8gdGhpcyBjb21wb25lbnQuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3JlZmFjdG9yaW5nL1JlbmFtZUNvbnRleHRSb290Q2hhbmdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvUmVuYW1lQ29udGV4dFJvb3RDaGFuZ2UuamF2YQppbmRleCBkNDIyMjllLi5mN2QxNDQwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvUmVuYW1lQ29udGV4dFJvb3RDaGFuZ2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvcmVmYWN0b3JpbmcvUmVuYW1lQ29udGV4dFJvb3RDaGFuZ2UuamF2YQpAQCAtMjIsOCArMjIsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogCitpbXBvcnQgY29tLmlibS5pY3UudGV4dC5VVEYxNjsKIGltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIAogcHVibGljIGNsYXNzIFJlbmFtZUNvbnRleHRSb290Q2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKQEAgLTMxLDcgKzMxLDYgQEAKIAlwcml2YXRlIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7CiAJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmV3Q29udGV4dFJvb3Q7CiAJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgb2xkQ29udGV4dFJvb3Q7Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIG1vZGVsOwogCiAJcHVibGljIFJlbmFtZUNvbnRleHRSb290Q2hhbmdlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBuZXdDb250ZXh0Um9vdCwgU3RyaW5nIG9sZENvbnRleHRSb290KSB7CiAJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7CkBAIC02NiwyNiArNjUsMzQgQEAKIAkJCQkJCQlQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Db250ZXh0X1Jvb3RfY2Fubm90X2JlX2VtcHR5XzIsCiAJCQkJCQkJbmV3IE9iamVjdFswXSkpOwogCi0JCX0KLQotCQlpZiAoIShuYW1lLmluZGV4T2YoJyAnKSA+IC0xKSkgeworCQl9IGVsc2UgaWYgKCEobmFtZS5pbmRleE9mKCcgJykgPiAtMSkpIHsKIAkJCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lLCAiLiIpOyAvLyROT04tTkxTLTEkCiAJCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKIAkJCQlTdHJpbmcgdG9rZW4gPSBzdG9rLm5leHRUb2tlbigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoKCk7IGkrKykgeworCQkJCWludCBjcDsKKwkJICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRva2VuLmxlbmd0aCgpOyBpICs9IFVURjE2LmdldENoYXJDb3VudChjcCkpIHsKKwkJICAgICAgICAgICAgY3AgPSBVVEYxNi5jaGFyQXQodG9rZW4sIGkpOwogCQkJCQlpZiAoISh0b2tlbi5jaGFyQXQoaSkgPT0gJ18nKSAmJiAhKHRva2VuLmNoYXJBdChpKSA9PSAnLScpCiAJCQkJCQkJJiYgISh0b2tlbi5jaGFyQXQoaSkgPT0gJy8nKQogCQkJCQkJCSYmIENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQodG9rZW4uY2hhckF0KGkpKSA9PSBmYWxzZSkgewogCQkJCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UodG9rZW4uY2hhckF0KGkpKSA9PSBmYWxzZSkgeworCQkJCQkJCVN0cmluZyBpbnZhbGlkQ2hhclN0cmluZyA9IG51bGw7CisJCQkJCQkJaWYgKFVURjE2LmdldENoYXJDb3VudChjcCk+MSkKKwkJCQkJCQl7CisJCQkJCQkJCWludmFsaWRDaGFyU3RyaW5nID0gVVRGMTYudmFsdWVPZihjcCk7IAorCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlpbnZhbGlkQ2hhclN0cmluZyA9IChuZXcgQ2hhcmFjdGVyKHRva2VuLmNoYXJBdChpKSkpLnRvU3RyaW5nKCk7CisJCQkJCQkJfQorCQkJCQkJCU9iamVjdFtdIGludmFsaWRDaGFyID0gbmV3IE9iamVjdFtde2ludmFsaWRDaGFyU3RyaW5nfTsKIAkJCQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKAogCQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKIAkJCQkJCQkJCUoyRUVVSVBsdWdpbi5QTFVHSU5fSUQsCiAJCQkJCQkJCQlQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlcgogCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKAogCQkJCQkJCQkJCQkJCVByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlRoZV9jaGFyYWN0ZXJfaXNfaW52YWxpZF9pbl9hX2NvbnRleHRfcm9vdCwKLQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCQkJCQkobmV3IENoYXJhY3Rlcih0b2tlbi5jaGFyQXQoaSkpKS50b1N0cmluZygpCi0JCQkJCQkJCQkJCQkJfSkpOworCQkJCQkJCQkJCQkJCWludmFsaWRDaGFyKSk7CiAKIAkJCQkJCX0KIAkJCQkJfQpAQCAtMTA5LDggKzExNiw3IEBACiAJCUlTdGF0dXMgcGhhc2UxID0gdmFsaWRhdGVDb250ZXh0Um9vdChuZXdDb250ZXh0Um9vdCk7CiAJCWlmIChwaGFzZTEuaXNPSygpKQogCQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCQllbHNlCi0JCQlyZXR1cm4gUmVmYWN0b3JpbmdTdGF0dXMuY3JlYXRlKHBoYXNlMSk7CisJCXJldHVybiBSZWZhY3RvcmluZ1N0YXR1cy5jcmVhdGUocGhhc2UxKTsKIAl9CiAKIAlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS91dGlsL0Fubm90YXRpb25JY29uRGVjb3JhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdWkvdXRpbC9Bbm5vdGF0aW9uSWNvbkRlY29yYXRvci5qYXZhCmluZGV4IDU3MjJkYjAuLjQ3Yjc5OTYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC91aS91dGlsL0Fubm90YXRpb25JY29uRGVjb3JhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3VpL3V0aWwvQW5ub3RhdGlvbkljb25EZWNvcmF0b3IuamF2YQpAQCAtMTAsOSArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogQ3JlYXRlZCBvbiBBdWcgMTgsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnV0aWw7CiAKQEAgLTIyLDYgKzE5LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyLkFubm90YXRpb25zQ29udHJvbGxlcjsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9KMkVFV2ViQXBwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvSjJFRVdlYkFwcEl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDJmYzNkYmIuLmQwMzliYmQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9KMkVFV2ViQXBwSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL0oyRUVXZWJBcHBJdGVtUHJvdmlkZXIuamF2YQpAQCAtMTcsMTcgKzE3LDIwIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbldyYXBwZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucHJvdmlkZXJzLldlYkFwcEl0ZW1Qcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OwpAQCAtNTksMTYgKzYyLDEyIEBACiAJICogTGlzdGVuIGFuZCBmaXJlIHVwZGF0ZXMgZm9yIDEuMyB3ZWIgc2VydmljZSBjbGllbnRzCiAJICovCiAJcHJpdmF0ZSBjbGFzcyBKMkVFV2ViU2VydmljZUNsaWVudERETWFuYWdlciBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgRWRpdE1vZGVsTGlzdGVuZXIgewotCQlwcml2YXRlIFdlYWtSZWZlcmVuY2Ugd2Vha1dlYkFwcDsKIAkJV2ViU2VydmljZXNDbGllbnQgY2xpZW50OwogCiAJCXB1YmxpYyBKMkVFV2ViU2VydmljZUNsaWVudERETWFuYWdlcihXZWFrUmVmZXJlbmNlIHdlYWtXZWJBcHApIHsKLQkJCXRoaXMud2Vha1dlYkFwcCA9IHdlYWtXZWJBcHA7CiAJCQlpbml0KCk7CiAJCX0KIAotCQkKLQogCQlwdWJsaWMgdm9pZCBpbml0KCkgewogCQkJLy8gVE9ETyBmaXggdXAgbm90aWZpY2F0aW9uCiAJCQkvLyBlZGl0TW9kZWwgPSB3ZWJTZXJ2aWNlTWdyLmdldFdTRWRpdE1vZGVsKFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh3ZWJBcHApKTsKQEAgLTk4LDYgKzk3LDcgQEAKIAkJICogCiAJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKIAkJICovCisJCUBPdmVycmlkZQogCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERCB8fCBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZIHx8IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFIHx8IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkpIHsKIAkJCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXZWJTZXJ2aWNlc0NsaWVudC5jbGFzcykgPT0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX1NFUlZJQ0VfUkVGUykgewpAQCAtMTM5LDcgKzEzOSw3IEBACiAJLyoqCiAJICogSW5pdGlhbGl6ZSB0aGUgbGlzdCBvZiBjaGlsZHJlbgogCSAqLwotCXByaXZhdGUgdm9pZCBpbml0Q2hpbGRyZW4oKSB7CisJcHJpdmF0ZSB2b2lkIGluaXRDaGlsZHJlbihXZWJBcHAgd2ViQXBwKSB7CiAJCWlmIChpc0luaXRpYWxpemluZykKIAkJCXJldHVybjsKIAkJCkBAIC0yMDIsMTEgKzIwMiwxNSBAQAogICAgICAgICAgICAgCiAJCQljaGlsZHJlbi5hZGQod2ViU2VydmxldEdyb3VwID0gbmV3IFdlYlNlcnZsZXRHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwogCQkJY2hpbGRyZW4uYWRkKHdlYlNlcnZsZXRNYXBwaW5nR3JvdXAgPSBuZXcgV2ViU2VydmxldE1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotCQkJY2hpbGRyZW4uYWRkKHdlYkZpbHRlcnNHcm91cCA9IG5ldyBXZWJGaWx0ZXJzR3JvdXBJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHdlYWtXZWJBcHApKTsKLQkJCWNoaWxkcmVuLmFkZCh3ZWJGaWx0ZXJNYXBwaW5nR3JvdXAgPSBuZXcgV2ViRmlsdGVyTWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWFrV2ViQXBwKSk7CiAJCQljaGlsZHJlbi5hZGQod2ViUmVmc0dyb3VwID0gbmV3IFdlYlJlZmVyZW5jZXNHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwogCQkJY2hpbGRyZW4uYWRkKHdlYlNlY3VyaXR5R3JvdXAgPSBuZXcgV2ViU2VjdXJpdHlHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotCQkJY2hpbGRyZW4uYWRkKHdlYkxpc3RlbmVyR3JvdXAgPSBuZXcgV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOworCQkJCisJCQkvLyBzaG93IHRoZSBiZWxvdyBub2RlcyBvbmx5IGlmIFdlYiAyLjMgYW5kIGdyZWF0ZXIKKwkJCWlmIChKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludCh3ZWJBcHAuZ2V0VmVyc2lvbigpKSA+IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlNFUlZMRVRfMl8yKSB7CisJCQkJY2hpbGRyZW4uYWRkKHdlYkZpbHRlcnNHcm91cCA9IG5ldyBXZWJGaWx0ZXJzR3JvdXBJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHdlYWtXZWJBcHApKTsKKwkJCQljaGlsZHJlbi5hZGQod2ViRmlsdGVyTWFwcGluZ0dyb3VwID0gbmV3IFdlYkZpbHRlck1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOworCQkJCWNoaWxkcmVuLmFkZCh3ZWJMaXN0ZW5lckdyb3VwID0gbmV3IFdlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIHdlYWtXZWJBcHApKTsKKwkJCX0KIAkJfSBmaW5hbGx5IHsKIAkJCWlzSW5pdGlhbGl6aW5nID0gZmFsc2U7CiAJCX0KQEAgLTIxNCwxMyArMjE4LDE0IEBACiAKIAlwcm90ZWN0ZWQgV2Vha1JlZmVyZW5jZSB3ZWFrV2ViQXBwID0gbnVsbDsKIAorCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsJCQogCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV2ViQXBwKSB7CiAJCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgb2JqZWN0OwogCQkJLy8gSWYgdW5pbml0aWFsaXplZCBvciB3ZWIgYXBwIG5lZWRzIHRvIHJlLWluaXRpYWxpemUsIGluaXQgdGhlIGNoaWxkcmVuCiAJCQlpZih3ZWFrV2ViQXBwID09IG51bGwgfHwgY2hpbGRyZW4uaXNFbXB0eSgpIHx8IHdlYkFwcCAhPSB3ZWFrV2ViQXBwLmdldCgpKSB7CiAJCQkJd2Vha1dlYkFwcCA9IG5ldyBXZWFrUmVmZXJlbmNlKHdlYkFwcCk7Ci0JCQkJaW5pdENoaWxkcmVuKCk7CisJCQkJaW5pdENoaWxkcmVuKHdlYkFwcCk7CiAJCQl9CiAvLwkJCWlmIChpc0luaXRpYWxpemluZykgcmV0dXJuIGNoaWxkcmVuOwogLy8JCQlpc0luaXRpYWxpemluZyA9IHRydWU7CkBAIC0yMzIsMzcgKzIzNywxMiBAQAogCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKIAl9CiAKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ29udGV4dFBhcmFtcyhXZWJBcHAgd2ViQXBwKSB7Ci0gICAgICAgIEVMaXN0IGNvbnRleHRQYXJhbXMgPSB3ZWJBcHAuZ2V0Q29udGV4dFBhcmFtcygpOwotICAgICAgICBpZiAoY29udGV4dFBhcmFtcyA9PSBudWxsIHx8IGNvbnRleHRQYXJhbXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAod2ViQ29udGV4dFBhcmFtR3JvdXAgIT0gbnVsbCkgeyAKLSAgICAgICAgICAgICAgICBjaGlsZHJlbi5yZW1vdmUod2ViQ29udGV4dFBhcmFtR3JvdXApOwotICAgICAgICAgICAgICAgIHdlYkNvbnRleHRQYXJhbUdyb3VwLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICB3ZWJDb250ZXh0UGFyYW1Hcm91cCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAod2ViQ29udGV4dFBhcmFtR3JvdXAgPT0gbnVsbCkgeyAKLSAgICAgICAgICAgIGNoaWxkcmVuLmFkZCh3ZWJDb250ZXh0UGFyYW1Hcm91cCA9IG5ldyBXZWJDb250ZXh0UGFyYW1Hcm91cEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgd2Vha1dlYkFwcCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVdlbGNvbWVQYWdlcyhXZWJBcHAgd2ViQXBwKSB7Ci0gICAgICAgIFdlbGNvbWVGaWxlTGlzdCBmaWxlTGlzdCA9IHdlYkFwcC5nZXRGaWxlTGlzdCgpOwotICAgICAgICBpZiAoZmlsZUxpc3QgPT0gbnVsbCB8fCBmaWxlTGlzdC5nZXRGaWxlKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAod2ViV2VsY29tZUZpbGVHcm91cCAhPSBudWxsKSB7IAotICAgICAgICAgICAgICAgIGNoaWxkcmVuLnJlbW92ZSh3ZWJXZWxjb21lRmlsZUdyb3VwKTsKLSAgICAgICAgICAgICAgICB3ZWJXZWxjb21lRmlsZUdyb3VwLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICB3ZWJXZWxjb21lRmlsZUdyb3VwID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh3ZWJXZWxjb21lRmlsZUdyb3VwID09IG51bGwpIHsgCi0gICAgICAgICAgICBjaGlsZHJlbi5hZGQod2ViV2VsY29tZUZpbGVHcm91cCA9IG5ldyBXZWJXZWxjb21lRmlsZUdyb3VwSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCB3ZWFrV2ViQXBwKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQkvKgorICAgLyoKIAkgKiAobm9uLUphdmFkb2MpCiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CkBAIC0yNzIsNiArMjUyLDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCS8vIFdlIG9ubHkgY2FyZSBhYm91dCBhZGRzIGFuZCByZW1vdmVzIGZvciB0aGUgZGlmZmVyZW50IGl0ZW0gcHJvdmlkZXIKIAkJLy8gZ3JvdXBzCkBAIC0zMjksNiArMzEwLDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlI2Rpc3Bvc2UoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CiAJCWlmIChjbGllbnRNZ3IgIT0gbnVsbCkKIAkJCWNsaWVudE1nci5kaXNwb3NlKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvSjJFRVdlYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvSjJFRVdlYkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggMWI2N2NlNS4uNjg4MmY0MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL0oyRUVXZWJJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9KMkVFV2ViSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtNDEsNiArNDEsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24udXRpbC5XZWJhcHBsaWNhdGlvbkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdlYkFwcEFkYXB0ZXIoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYkFwcEFkYXB0ZXIoKSB7CiAJCWlmICh3ZWJBcHBJdGVtUHJvdmlkZXIgPT0gbnVsbCkKIAkJCXdlYkFwcEl0ZW1Qcm92aWRlciA9IG5ldyBKMkVFV2ViQXBwSXRlbVByb3ZpZGVyKHRoaXMpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkNvbnRleHRQYXJhbUdyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViQ29udGV4dFBhcmFtR3JvdXBJdGVtUHJvdmlkZXIuamF2YQppbmRleCA5YjFhNGE2Li42NWQ3ODFlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViQ29udGV4dFBhcmFtR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViQ29udGV4dFBhcmFtR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCWlmICh3ZWFrV2ViQXBwIT1udWxsKSB7CkBAIC00NiwxOCArNDcsMjEgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiaW5pdGlhbGl6X3BhcmFtZXRlcl9jb250ZXh0Iik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldFRleHQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ29udGV4dF9QYXJhbWV0ZXJzXzIiKTsgLy8kTk9OLU5MUy0xJCAKIAl9CiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gIWdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpOwogCX0KQEAgLTY1LDYgKzY5LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViRXJyb3JQYWdlR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJFcnJvclBhZ2VHcm91cEl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDhiNzZiOWUuLjI4MDZmNTIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJFcnJvclBhZ2VHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJFcnJvclBhZ2VHcm91cEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKIAkJaWYgKHdlYWtXZWJBcHAhPW51bGwpIHsKQEAgLTQ2LDE4ICs0NywyMSBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRJbWFnZSgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJlcnJvcl9wYWdlIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldFRleHQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRXJyb3JfUGFnZXNfMSIpOyAvLyROT04tTkxTLTEkIAogCX0KIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7CiAJfQpAQCAtNjUsNiArNjksNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiB3ZWFrV2ViQXBwLmdldCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJGaWx0ZXJNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJGaWx0ZXJNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIuamF2YQppbmRleCBiZWFlNWQ5Li43ZDliZmNmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViRmlsdGVyTWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkZpbHRlck1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0xMCw5ICsxMCw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBDcmVhdGVkIG9uIEp1biAxMSwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7CiAKQEAgLTI4LDkgKzI1LDYgQEAKIAogLyoqCiAgKiBAYXV0aG9yIGppYWxpbgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAgKi8KIHB1YmxpYyBjbGFzcyBXZWJGaWx0ZXJNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJHcm91cEl0ZW1Qcm92aWRlciB7CiAKQEAgLTQ0LDYgKzM4LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCU9iamVjdCB3ZWJBcHAgPSB3ZWFrV2ViQXBwLmdldCgpOwogCQlpZihudWxsICE9IHdlYkFwcCl7CkBAIC01NSwxOCArNTAsMjEgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiZmlsdGVyX21hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0VGV4dCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGaWx0ZXJfTWFwcGluZ3NfMSIpOyAvLyROT04tTkxTLTEkIAogCX0KIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7CiAJfQpAQCAtNzQsNiArNzIsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiB3ZWFrV2ViQXBwLmdldCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJGaWx0ZXJzR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJGaWx0ZXJzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQppbmRleCBkMzgwOWIxLi43MTkxZDA2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkZpbHRlcnNHcm91cEl0ZW1Qcm92aWRlci5qYXZhCkBAIC00NSw2ICs0NSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIEZpbHRlci5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJmaWx0ZXIiKTsgLy8kTk9OLU5MUy0xJAogCX0KQEAgLTUyLDYgKzUzLDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwogCSAgICBPYmplY3Qgd2ViQXBwID0gd2Vha1dlYkFwcC5nZXQoKTsKQEAgLTY0LDYgKzY2LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKIAl9CkBAIC03MSw2ICs3NCw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZpbHRlcnNfMSIpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtNzgsNiArODIsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuICFnZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJHcm91cEl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDFhMjk1NjguLjkwODRhOWQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJHcm91cEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0xMCw5ICsxMCw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBDcmVhdGVkIG9uIEF1ZyAxMSwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7CiAKQEAgLTMzLDkgKzMwLDYgQEAKIAogLyoqCiAgKiBAYXV0aG9yIGpsYW51dGkKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2ViR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBKMkVFSXRlbVByb3ZpZGVyIHsKIApAQCAtNzgsMTMgKzcyLDE0IEBACiAJCXJldHVybiB0aGVDaGlsZHJlbjsKICAgICB9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAJCXN1cGVyLmRpc3Bvc2UoKTsKIAkJd2Vha1dlYkFwcCA9IG51bGw7CiAJfQogCQogCisJQE92ZXJyaWRlCiAJcHVibGljIElGaWxlIGdldEFzc29jaWF0ZWRGaWxlKCkgewogCiAJCXRyeSB7IApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJMaXN0ZW5lckdyb3VwSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggZDU4ZTgxZi4uNDk2MDhlNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViTGlzdGVuZXJHcm91cEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0xMCw5ICsxMCw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBDcmVhdGVkIG9uIEp1biAxMSwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWw7CiAKQEAgLTI5LDkgKzI2LDYgQEAKIAogLyoqCiAgKiBAYXV0aG9yIGppYWxpbgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAgKi8KIHB1YmxpYyBjbGFzcyBXZWJMaXN0ZW5lckdyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViR3JvdXBJdGVtUHJvdmlkZXIgewogCkBAIC00NSw2ICszOSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIEZpbHRlci5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgibGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAogCX0KQEAgLTUyLDYgKzQ3LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwogCSAgICBPYmplY3Qgd2ViQXBwID0gd2Vha1dlYkFwcC5nZXQoKTsKQEAgLTY0LDYgKzYwLDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKIAl9CkBAIC03MSw2ICs2OCw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkxJU1RFTkVSIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC03OCw2ICs3Niw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gIWdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJSZWZlcmVuY2VzR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJSZWZlcmVuY2VzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQppbmRleCBhNWZjYmJjLi40YTdjYTMxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViUmVmZXJlbmNlc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlJlZmVyZW5jZXNHcm91cEl0ZW1Qcm92aWRlci5qYXZhCkBAIC00OSw2ICs0OSw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKIAl9CkBAIC01OCw2ICs1OSw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwogCQlPYmplY3Qgb2JqID0gd2Vha1dlYkFwcC5nZXQoKTsKQEAgLTk0LDYgKzk2LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuICFnZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKTsKIAl9CkBAIC0xMDMsNiArMTA2LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRJbWFnZSgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgicmVzb3VyY2VSZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xMTIsNiArMTE2LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRUZXh0KCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlJlZmVyZW5jZXNfMSIpOyAvLyROT04tTkxTLTEkIAogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJTZWN1cml0eUdyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VjdXJpdHlHcm91cEl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDlkYTBhYWQuLmFlOTk5ODcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJTZWN1cml0eUdyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlNlY3VyaXR5R3JvdXBJdGVtUHJvdmlkZXIuamF2YQpAQCAtNDcsNiArNDcsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIHdlYWtXZWJBcHAuZ2V0KCk7CiAJfQpAQCAtNTYsNiArNTcsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gIWdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpOwogCX0KQEAgLTY1LDYgKzY3LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRUZXh0KCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlY3VyaXR5XzEiKTsgLy8kTk9OLU5MUy0xJCAKIAl9CkBAIC03NCw2ICs3Nyw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwogCQlPYmplY3Qgb2JqID0gd2Vha1dlYkFwcC5nZXQoKTsKQEAgLTkyLDYgKzk2LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRJbWFnZSgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZWN1cml0eV9yb2xlIik7Ly8kTk9OLU5MUy0xJAogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJTZXJ2bGV0R3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJTZXJ2bGV0R3JvdXBJdGVtUHJvdmlkZXIuamF2YQppbmRleCA0NzE4NjZlLi4xNmQwYmI1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlNlcnZsZXRHcm91cEl0ZW1Qcm92aWRlci5qYXZhCkBAIC00Miw2ICs0Miw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKIAkJaWYgKHdlYWtXZWJBcHAhPW51bGwpIHsKQEAgLTU2LDE4ICs1NywyMSBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRJbWFnZSgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzZXJ2bGV0Iik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyI2dldFRleHQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VydmxldHNfMSIpOyAvLyROT04tTkxTLTEkIAogCX0KIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7CiAJfQpAQCAtNzUsNiArNzksNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiB3ZWFrV2ViQXBwLmdldCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJTZXJ2bGV0TWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViU2VydmxldE1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDUzNmIwYWMuLmEzNTYwOTkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJTZXJ2bGV0TWFwcGluZ0dyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYlNlcnZsZXRNYXBwaW5nR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpAQCAtMTAsOSArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogQ3JlYXRlZCBvbiBKdW4gMTEsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndhci51aS51dGlsOwogCkBAIC0yOCw5ICsyNSw2IEBACiAKIC8qKgogICogQGF1dGhvciBqaWFsaW4KLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwdWJsaWMgY2xhc3MgV2ViU2VydmxldE1hcHBpbmdHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYkdyb3VwSXRlbVByb3ZpZGVyIHsKIApAQCAtNDYsNiArNDAsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlPYmplY3Qgd2ViQXBwID0gd2Vha1dlYkFwcC5nZXQoKTsKIAkJaWYgKG51bGwgIT0gd2ViQXBwKSB7CkBAIC01OSw2ICs1NCw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2VydmxldF9tYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC02OCw2ICs2NCw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0VGV4dCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZXJ2bGV0X01hcHBpbmdzXzIiKTsgLy8kTk9OLU5MUy0xJCAKIAl9CkBAIC03Nyw2ICs3NCw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAhZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCk7CiAJfQpAQCAtODYsNiArODQsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIHdlYWtXZWJBcHAuZ2V0KCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYldlbGNvbWVGaWxlR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93YXIvdWkvdXRpbC9XZWJXZWxjb21lRmlsZUdyb3VwSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggMjA0Y2NhMy4uMWJkNTlmMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dhci91aS91dGlsL1dlYldlbGNvbWVGaWxlR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2FyL3VpL3V0aWwvV2ViV2VsY29tZUZpbGVHcm91cEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKIAkJaWYgKHdlYWtXZWJBcHAhPW51bGwpIHsKQEAgLTUwLDE4ICs1MSwyMSBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlciNnZXRJbWFnZSgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJ3ZWxjb21lX2xpc3QiKTsgLy8kTk9OLU5MUy0xJAogCX0KIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXIjZ2V0VGV4dCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJXZWxjb21lX1BhZ2VzXzEiKTsgLy8kTk9OLU5MUy0xJCAKIAl9CiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gIWdldENoaWxkcmVuKG9iamVjdCkuaXNFbXB0eSgpOwogCX0KQEAgLTY5LDYgKzczLDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gd2Vha1dlYkFwcC5nZXQoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YQppbmRleCA5ZmU4M2UyLi44NTEzMWY3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEKQEAgLTQ3LDcgKzQ3LDggQEAKIAlwdWJsaWMgQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKIAkJc3VwZXIobW9kZWwpOwogCX0KLSAgICBwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKICAgICAgICAgcmV0dXJuIG5ldyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpOwogICAgIH0KIApAQCAtNTksNiArNjAsNyBAQAogCSAqIDwvdWw+CiAJICogPC9wPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7CiAJCWFkZFBhZ2UobmV3IEFwcENsaWVudEV4cG9ydFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcsIGdldFNlbGVjdGlvbigpKSk7CiAJfQpAQCAtNzAsNiArNzIsNyBAQAogCSAqIFNldHMgdXAgdGhlIGRlZmF1bHQgd2l6YXJkIHBhZ2UgaW1hZ2UuCiAJICogPC9wPgogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGRvSW5pdCgpIHsKIAkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuQVBQX0NMSUVOVF9FWFBPUlRfV0laQVJEX0JBTk5FUikpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKaW5kZXggZTBjMTJjOS4uNDNiZTE5ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKQEAgLTM2LDEwICszNiwxMiBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbGVJbXBvcnRMYWJlbCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlSW1wb3J0TGFiZWwoKSB7CiAJCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfQ0xJRU5UX0lNUE9SVF9GSUxFX0xBQkVMKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lc1N0b3JlSUQoKSB7CiAJCXJldHVybiAiQVBQX0NMSUVOVCI7IC8vJE5PTi1OTFMtMSQ7CiAJfQpAQCAtNDksNiArNTEsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbHRlckV4cHJlc3Npb24oKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewogCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIqLmphciJ9OyAvLyROT04tTkxTLTEkCiAJfQpAQCAtNTgsNiArNjEsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldFByb2plY3RJbXBvcnRMYWJlbCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKSB7CiAJCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfQ0xJRU5UX0lNUE9SVF9QUk9KRUNUX0xBQkVMKTsKIAl9CkBAIC03MCwxMSArNzQsMTMgQEAKIAkvLyByZXR1cm4gKEFwcENsaWVudE1vZHVsZUltcG9ydERhdGFNb2RlbCkgbW9kZWw7CiAJLy8JfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7CiAJCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5JTVBPUlRfQVBQQ0xJRU5UX1dJWkFSRF9QMSk7CiAJCXJldHVybiBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZUZhY2V0SUQoKXsKIAkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkFQUExJQ0FUSU9OX0NMSUVOVDsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YQppbmRleCA4ZWY1MmNlLi44NmM4Njg1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudENvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKQEAgLTU1LDYgKzU1LDcgQEAKIAkgKiBBZGRzIGFuIHtAbGluayBBcHBDbGllbnRJbXBvcnRQYWdlfWFzIHRoZSBtYWluIHdpemFyZCBwYWdlICh7QGxpbmsgI01BSU5fUEd9KS4KIAkgKiA8L3A+CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKIAkJYWRkUGFnZShuZXcgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0UGFnZShnZXREYXRhTW9kZWwoKSwgTUFJTl9QRykpOwogCX0KQEAgLTY2LDE5ICs2NywyMyBAQAogCSAqIFNldHMgdXAgdGhlIGRpYWxvZyB3aW5kb3cgdGl0bGUgYW5kIGRlZmF1bHQgd2l6YXJkIHBhZ2UgaW1hZ2UuCiAJICogPC9wPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCB2b2lkIGRvSW5pdCgpIHsKIAkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSU1QT1JUX1dJWl9USVRMRSkpOwogCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5BUFBfQ0xJRU5UX0lNUE9SVF9XSVpBUkRfQkFOTkVSKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZHVsZVZhbGlkYXRvclN0cmluZ3MoKSB7CiAJCXJldHVybiBuZXcgU3RyaW5nW117Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb24uVUlBcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvciJ9OyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7CiAJCXJldHVybiBuZXcgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpIHsKIAkJcmV0dXJuIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX0FQUENMSUVOVCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BcHBDbGllbnRFeHBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudEV4cG9ydFBhZ2UuamF2YQppbmRleCBiZmM2YTBlLi40MmRmYTY4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudEV4cG9ydFBhZ2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0FwcENsaWVudEV4cG9ydFBhZ2UuamF2YQpAQCAtNDgsOCArNDgsOSBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldFByb2plY3RJbXBvcnRMYWJlbCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb25lbnRMYWJlbCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9DTElFTlRfSU1QT1JUX1BST0pFQ1RfTEFCRUwpOworCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQX0NMSUVOVF9QUk9KX0xCTCk7CiAJfQogCiAJLyoKQEAgLTU3LDYgKzU4LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRGaWx0ZXJFeHByZXNzaW9uKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyRXhwcmVzc2lvbigpIHsKIAkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiKi5qYXIifTsgLy8kTk9OLU5MUy0xJAogCX0KQEAgLTY2LDE1ICs2OCwxOCBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVFeHBvcnRQYWdlI2lzTWV0YVR5cGVTdXBwb3J0ZWQoamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgYm9vbGVhbiBpc01ldGFUeXBlU3VwcG9ydGVkKE9iamVjdCBvKSB7CiAJCXJldHVybiBvIGluc3RhbmNlb2YgQXBwbGljYXRpb25DbGllbnQ7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRJbmZvcG9wSUQoKSB7CiAJCXJldHVybiBJSjJFRVVJQ29udGV4dElkcy5FWFBPUlRfQVBQQ0xJRU5UX1dJWkFSRF9QMTsKIAl9CiAJCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wbmVudElEKCkgeworICAgIEBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG9uZW50SUQoKSB7CiAgICAgICAgIHJldHVybiAiSlNUX0FQUENMSUVOVCI7IC8vJE5PTi1OTFMtMSQKICAgICB9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlSmFyc1Byb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZUphcnNQcm92aWRlci5qYXZhCmluZGV4IDNiYWQ3YjAuLjllZmU3MDAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlSmFyc1Byb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVKYXJzUHJvdmlkZXIuamF2YQpAQCAtMTE1LDE5ICsxMTUsMTkgQEAKIAkJcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlOy8vJE5PTi1OTFMtMSQKIAl9CiAKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGdldEVqYkltYWdlKCkgeworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RWpiSW1hZ2UoKSB7CiAJCWlmIChlamJJbWFnZSA9PSBudWxsKQogCQkJZWpiSW1hZ2UgPSBnZXRJbWFnZURlc2NyaXB0b3IoIkVKQkphciIpLmNyZWF0ZUltYWdlKCk7Ly8kTk9OLU5MUy0xJAogCQlyZXR1cm4gZWpiSW1hZ2U7CiAJfQogCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBnZXRFamJDbGllbnRJbWFnZSgpIHsKKwlwdWJsaWMgc3RhdGljIEltYWdlIGdldEVqYkNsaWVudEltYWdlKCkgewogCQlpZiAoZWpiQ2xpZW50SW1hZ2UgPT0gbnVsbCkKIAkJCWVqYkNsaWVudEltYWdlID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJlamJjbGllbnRqYXJfb2JqIikuY3JlYXRlSW1hZ2UoKTsvLyROT04tTkxTLTEkCiAJCXJldHVybiBlamJDbGllbnRJbWFnZTsKIAl9CiAJCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBnZXRDbGFzc3BhdGhEZXBlbmRlbmN5SW1hZ2UoKSB7CisJcHVibGljIHN0YXRpYyBJbWFnZSBnZXRDbGFzc3BhdGhEZXBlbmRlbmN5SW1hZ2UoKSB7CiAJCWlmIChjbGFzc3BhdGhJbWFnZSA9PSBudWxsKQogCQkJY2xhc3NwYXRoSW1hZ2UgPSBnZXRJbWFnZURlc2NyaXB0b3IoIkNQRGVwIikuY3JlYXRlSW1hZ2UoKTsvLyROT04tTkxTLTEkCiAJCXJldHVybiBjbGFzc3BhdGhJbWFnZTsKQEAgLTE4Miw3ICsxODIsNyBAQAogCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwogCX0KIAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZ2V0SW52YWxpZEltYWdlKCkgeworCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW52YWxpZEltYWdlKCkgewogCQlpZiAoaW52YWxpZEltYWdlID09IG51bGwpIHsKIAkJCUltYWdlRGVzY3JpcHRvciBiYXNlID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKCJqYXJfbm9uZXhpc3Rfb2JqIik7Ly8kTk9OLU5MUy0xJAogCQkJSW1hZ2VEZXNjcmlwdG9yIG92ZXJsYXkgPSBnZXRJbWFnZURlc2NyaXB0b3IoIndhcm5pbmdfY28iKTsvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZVV0aWxKYXJzQW5kV2ViTGliUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlVXRpbEphcnNBbmRXZWJMaWJQcm92aWRlci5qYXZhCmluZGV4IGUwMWE3ZDcuLmE0MjExOGUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlVXRpbEphcnNBbmRXZWJMaWJQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlVXRpbEphcnNBbmRXZWJMaWJQcm92aWRlci5qYXZhCkBAIC0xNSw3ICsxNSw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNTEsNyArNTAsNiBAQAogCQlpZihpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBBcmNoaXZlV3JhcHBlcil7CiAJCQlBcmNoaXZlV3JhcHBlciB3cmFwcGVyID0gKEFyY2hpdmVXcmFwcGVyKWlucHV0RWxlbWVudDsKIAkJCUxpc3QgPEFyY2hpdmVXcmFwcGVyPiB1dGlsaXRpZXMgPSB3cmFwcGVyLmdldEVBUlV0aWxpdGllc0FuZFdlYkxpYnMoKTsKLQkJCUxpc3QgZmlsdGVyZWRQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJCWlmICh1dGlsaXRpZXMuc2l6ZSgpID4gMCl7CiAJCQkJZmlsdGVyRUpCQ2xpZW50SmFycyh1dGlsaXRpZXMsIHdyYXBwZXIpOwogCQkJCU9iamVjdCBbXSBhcnJheSA9IHV0aWxpdGllcy50b0FycmF5KCk7CkBAIC02Miw4ICs2MCw2IEBACiAJCQkJfSk7CiAJCQkJcmV0dXJuIGFycmF5OwogCQkJfQotCQkJZWxzZQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwogCQl9CiAJCXJldHVybiBuZXcgT2JqZWN0WzBdOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlVXRpbGl0eUphcnNQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVVdGlsaXR5SmFyc1Byb3ZpZGVyLmphdmEKaW5kZXggNDYyOWNjNy4uOGRiYjg3ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVVdGlsaXR5SmFyc1Byb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9BdmFpbGFibGVVdGlsaXR5SmFyc1Byb3ZpZGVyLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CiAKQEAgLTgyLDcgKzgzLDcgQEAKIAkJCQkJcmV0dXJuIG5ldyBGaWxlWzBdOwogCiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdmFpbGFibGVGaWxlcy5sZW5ndGg7IGkrKykKLQkJCQkJaWYgKGF2YWlsYWJsZUZpbGVzW2ldICE9IG51bGwgJiYgYXZhaWxhYmxlRmlsZXNbaV0uZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpY29sbGVjdGVkSmFycy5hZGQoYXZhaWxhYmxlRmlsZXNbaV0pOyAvLyROT04tTkxTLTEkCisJCQkJCWlmIChhdmFpbGFibGVGaWxlc1tpXSAhPSBudWxsICYmIGF2YWlsYWJsZUZpbGVzW2ldLmdldE5hbWUoKS5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUKSljb2xsZWN0ZWRKYXJzLmFkZChhdmFpbGFibGVGaWxlc1tpXSk7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIGNvbGxlY3RlZEphcnMudG9BcnJheSgpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9DbGFzc2VzSW1wb3J0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0NsYXNzZXNJbXBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwN2YyMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0NsYXNzZXNJbXBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS51dGlsLkNvcmVVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmJ1aWxkcGF0aHMuQ1BMaXN0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3Nlc0ltcG9ydFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQgewotCi0JcHVibGljIFdpemFyZENsYXNzZXNJbXBvcnRNYWluUGFnZSBtYWluUGFnZSA9IG51bGw7Ci0KLQlwdWJsaWMgV2l6YXJkQ2xhc3Nlc0ltcG9ydFBhZ2UxIHBhZ2UxID0gbnVsbDsKLQotCXByaXZhdGUgSVdvcmtiZW5jaCB3b3JrYmVuY2g7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCXByaXZhdGUgSVBhdGggaW1wb3J0ZWRDbGFzc2VzUGF0aDsKLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gbnVsbDsKLQotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGZpbGVOYW1lcyA9IG51bGw7Ci0KLQlwdWJsaWMgQ2xhc3Nlc0ltcG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3Nlc0ltcG9ydFdpemFyZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0KLQl9Ci0KLQlwdWJsaWMgQ2xhc3Nlc0ltcG9ydFdpemFyZChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZmlsZU5hbWUsIExpc3Qgb3RoZXJGaWxlTmFtZXMpIHsKLQkJdGhpcyhwcm9qZWN0KTsKLQkJdGhpcy5maWxlTmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMuZmlsZU5hbWVzLmFkZChmaWxlTmFtZSk7Ci0JCWludCBpID0gZmlsZU5hbWUubGFzdEluZGV4T2YoamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIpOwotCQlTdHJpbmcgcGFyZW50RGlyID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGkpOwotCQlpZiAob3RoZXJGaWxlTmFtZXMgIT0gbnVsbCkKLQkJCWZvciAoaW50IGogPSBvdGhlckZpbGVOYW1lcy5zaXplKCkgLSAxOyBqID49IDA7IGotLSkgewotCQkJCWlmIChvdGhlckZpbGVOYW1lcy5nZXQoaikgIT0gbnVsbCkgewotCQkJCQlpbnQgayA9ICgoU3RyaW5nKSBvdGhlckZpbGVOYW1lcy5nZXQoaikpLmxhc3RJbmRleE9mKGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJCQkJaWYgKGsgPT0gaSAmJiBwYXJlbnREaXIuZXF1YWxzKCgoU3RyaW5nKSBvdGhlckZpbGVOYW1lcy5nZXQoaikpLnN1YnN0cmluZygwLCBrKSkpIHsKLQkJCQkJCWZpbGVOYW1lcy5hZGQob3RoZXJGaWxlTmFtZXMucmVtb3ZlKGopKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvbGRlclBhdGgoSVBhdGggcGF0aCkgewotCQlpbXBvcnRlZENsYXNzZXNQYXRoID0gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXJldHVybiBwYWdlMS5maW5pc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVJbXBvcnRlZENsYXNzZXNGb2xkZXIoSVByb2plY3QgYVByb2plY3QpIHsKLQkJLy9DcmVhdGUgaW1wb3J0ZWRfY2xhc3NlcyBmb2xkZXIgc2VsZWN0ZWQgcHJvamVjdAotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGFQcm9qZWN0OwotCQlJRm9sZGVyIGZvbGRlciA9IGNvbnRhaW5lci5nZXRGb2xkZXIobmV3IFBhdGgoImltcG9ydGVkX2NsYXNzZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJamF2YVByb2plY3QgPSBnZXRJSmF2YVByb2plY3QoYVByb2plY3QpOwotCi0JCUlQYXRoIGltcG9ydGVkRm9sZGVyc0NsYXNzID0gZm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0KLQkJQ1BMaXN0RWxlbWVudCBlbnRyeSA9IG5ld0NQTGlicmFyeUVsZW1lbnQoZm9sZGVyKTsKLQkJSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5ID0gZW50cnkuZ2V0Q2xhc3NwYXRoRW50cnkoKTsKLQotCQlJUmVzb3VyY2UgcmVzID0gZW50cnkuZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKChyZXMgaW5zdGFuY2VvZiBJRm9sZGVyKSAmJiAhcmVzLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUNvcmVVdGlsaXR5LmNyZWF0ZUZvbGRlcigoSUZvbGRlcikgcmVzLCB0cnVlLCB0cnVlLCBudWxsKTsKLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2NsYXNzcGF0aEVudHJpZXMubGVuZ3RoICsgMV07Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhc3NwYXRoRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCW5ld0NsYXNzcGF0aFtpXSA9IGNsYXNzcGF0aEVudHJpZXNbaV07Ci0JCQl9Ci0JCQluZXdDbGFzc3BhdGhbY2xhc3NwYXRoRW50cmllcy5sZW5ndGhdID0gbmV3RW50cnk7Ci0KLQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdDbGFzc3BhdGgsIG51bGwpOwotCi0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0KLQkJc2V0Rm9sZGVyUGF0aChpbXBvcnRlZEZvbGRlcnNDbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0SUphdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3RIYW5kbGUpIHsKLQkJSUphdmFNb2RlbCBqYXZhTW9kZWwgPSBKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCXJldHVybiBqYXZhTW9kZWwuZ2V0SmF2YVByb2plY3QocHJvamVjdEhhbmRsZS5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgQ1BMaXN0RWxlbWVudCBuZXdDUExpYnJhcnlFbGVtZW50KElSZXNvdXJjZSByZXMpIHsKLQotCQlyZXR1cm4gbmV3IENQTGlzdEVsZW1lbnQoamF2YVByb2plY3QsIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSwgcmVzLmdldEZ1bGxQYXRoKCksIHJlcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkltcG9ydF9DbGFzc19GaWxlc19VSSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiaW1wb3J0X2NsYXNzX2ZpbGVfd2l6X2JhbiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXdvcmtiZW5jaCA9IGFXb3JrYmVuY2g7Ci0JCXNlbGVjdGlvbiA9IGFTZWxlY3Rpb247Ci0JCWlmICghYVNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgYVNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgYVNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQlpZiAocHJvamVjdCAhPSBudWxsKQotCQkJY3JlYXRlSW1wb3J0ZWRDbGFzc2VzRm9sZGVyKHByb2plY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQl0cnkgewotCQkJc3VwZXIuYWRkUGFnZXMoKTsKLQkJCW1haW5QYWdlID0gbmV3IFdpemFyZENsYXNzZXNJbXBvcnRNYWluUGFnZSgiaWQiLCBmaWxlTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQltYWluUGFnZS5zZXRXaXphcmQodGhpcyk7Ci0JCQlpZiAoZmlsZU5hbWVzID09IG51bGwgfHwgZmlsZU5hbWVzLnNpemUoKSA9PSAwKQotCQkJCWFkZFBhZ2UobWFpblBhZ2UpOwotCQkJcGFnZTEgPSBuZXcgV2l6YXJkQ2xhc3Nlc0ltcG9ydFBhZ2UxKHdvcmtiZW5jaCwgc2VsZWN0aW9uLCBpbXBvcnRlZENsYXNzZXNQYXRoLCBmaWxlTmFtZXMpOwotCQkJcGFnZTEuc2V0V2l6YXJkKHRoaXMpOwotCQkJYWRkUGFnZShwYWdlMSk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0RlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCmluZGV4IDFhMzFkOGEuLmFhNzcxMjYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5qYXZhCkBAIC0xMCw5ICsxMCw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBDcmVhdGVkIG9uIE1hciAyMywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwogCkBAIC03MCwxMCArNjcsMTIgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7CiAJCWFkZFBhZ2UobmV3IE5ld0oyRUVDb21wb25lbnRTZWxlY3Rpb25QYWdlKGdldERhdGFNb2RlbCgpLCBTRUxFQ1RJT05fUEcpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7CiAJCWlmICghc3VwZXIuY2FuRmluaXNoKCkpIHsKIAkJCXJldHVybiBmYWxzZTsKQEAgLTgxLDcgKzgwLDggQEAKIAkJcmV0dXJuIGdldERhdGFNb2RlbCgpLmdldEJvb2xlYW5Qcm9wZXJ0eShJRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRU5BQkxFRCk7CiAJfQogCi0gICAgcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7CisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7CiAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRFeHBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEV4cG9ydFBhZ2UuamF2YQppbmRleCBlNmUyZTdmLi4wYTg4M2YwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEV4cG9ydFBhZ2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEV4cG9ydFBhZ2UuamF2YQpAQCAtNDksNiArNDksNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldFByb2plY3RJbXBvcnRMYWJlbCgpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb25lbnRMYWJlbCgpIHsKIAkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9QUk9KRUNUX0ZPUl9NT0RVTEVfQ1JFQVRJT04pOwogCX0KQEAgLTU5LDYgKzYwLDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRGaWx0ZXJFeHByZXNzaW9uKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyRXhwcmVzc2lvbigpIHsKIAkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiKi5lYXIifTsgLy8kTk9OLU5MUy0xJAogCX0KQEAgLTY2LDYgKzY4LDcgQEAKIAkvKioKIAkgKiBAcmV0dXJuCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2hvd1Byb2plY3RGaWxlc0NoZWNrYm94KCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CkBAIC03NSwxOSArNzgsMjMgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFRXhwb3J0UGFnZSNpc01ldGFUeXBlU3VwcG9ydGVkKGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gaXNNZXRhVHlwZVN1cHBvcnRlZChPYmplY3QgbykgewogCQlyZXR1cm4gbyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKIAkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVJDSElWRV9ERVNUSU5BVElPTiwgSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJXUklURV9FWElTVElOR307CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRJbmZvcG9wSUQoKSB7CiAJCXJldHVybiBJSjJFRVVJQ29udGV4dElkcy5FWFBPUlRfRUFSX1dJWkFSRF9QMTsKIAl9CiAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbXBuZW50SUQoKSB7CisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb25lbnRJRCgpIHsKICAgICAgICAgcmV0dXJuICJKU1RfRUFSIjsgIC8vJE5PTi1OTFMtMSQKICAgICB9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YQppbmRleCBhOWIyNjExLi4yMGEwYjc4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50RXhwb3J0V2l6YXJkLmphdmEKQEAgLTQ4LDcgKzQ4LDggQEAKIAkJc3VwZXIobW9kZWwpOwogCX0KIAotICAgIHByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgeworICAgIEBPdmVycmlkZQorCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewogICAgICAgICByZXR1cm4gbmV3IEVBUkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyKCk7CiAgICAgfQogCkBAIC02MCw2ICs2MSw3IEBACiAJICogPC91bD4KIAkgKiA8L3A+CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZG9BZGRQYWdlcygpIHsKIAkJYWRkUGFnZShuZXcgRUFSQ29tcG9uZW50RXhwb3J0UGFnZShnZXREYXRhTW9kZWwoKSwgTUFJTl9QRywgZ2V0U2VsZWN0aW9uKCkpKTsKIAl9CkBAIC03MSw2ICs3Myw3IEBACiAJICogU2V0cyB1cCB0aGUgZGVmYXVsdCB3aXphcmQgcGFnZSBpbWFnZS4KIAkgKiA8L3A+CiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgZG9Jbml0KCkgewogCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5FQVJfRVhQT1JUX1dJWkFSRF9CQU5ORVIpKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEltcG9ydE9wdGlvbnNQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEltcG9ydE9wdGlvbnNQYWdlLmphdmEKaW5kZXggNTczMTFkMi4uMjI2MjQxNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRPcHRpb25zUGFnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50SW1wb3J0T3B0aW9uc1BhZ2UuamF2YQpAQCAtODIsNiArODIsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7CiAJCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5JTVBPUlRfRUFSX1dJWkFSRF9QMik7CkBAIC0xODYsOSArMTg3LDEwIEBACiAJCXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKIAkJc2VsZWN0QWxsQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9TRUxFQ1RfQUxMX1VUSUxfQlVUVE9OKSk7CiAJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlnZC53aWR0aEhpbnQgPSAxNDA7CisJCWdkLndpZHRoSGludCA9IDE2MDsKIAkJc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwogCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKIAkJCQloYW5kbGVTZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7CiAJCQl9CkBAIC0xOTcsOSArMTk5LDEwIEBACiAJCWRlc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwogCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfREVTRUxFQ1RfQUxMX1VUSUxfQlVUVE9OKSk7CiAJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlnZC53aWR0aEhpbnQgPSAxNDA7CisJCWdkLndpZHRoSGludCA9IDE2MDsKIAkJZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7CiAJCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CiAJCQkJaGFuZGxlRGVzZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7CiAJCQl9CkBAIC0yNTMsNiArMjU2LDcgQEAKIAkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwogCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7CiAJCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewogCQkJCWhhbmRsZUJyb3dzZUJ1dHRvblByZXNzZWQoKTsKIAkJCX0KQEAgLTI4Miw2ICsyODYsNyBAQAogCQlyZXR1cm4gYVdyYXBwZXIgIT0gbW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUik7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7CiAJCXN1cGVyLmVudGVyKCk7CiAJCXJlZnJlc2hFQVJGaWxlSWZOZWNlc3NhcnkoKTsKQEAgLTMwMyw2ICszMDgsNyBAQAogCQlyZXR1cm4gYVN0cmluZyA9PSBudWxsIHx8IGFTdHJpbmcubGVuZ3RoKCkgPT0gMDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7CiAJCXJldHVybiBuZXcgU3RyaW5nW117fTsKIAl9CkBAIC0zMTEsNiArMzE3LDcgQEAKIAkJLy8gVGhpcyBwYWdlIGRvZXNuJ3QgaW1wbGVtZW50Li4uCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7CiAJCS8vIFRoaXMgcGFnZSBkb2Vzbid0IGltcGxlbWVudC4uLgogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50SW1wb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKaW5kZXggYTEzZDFiMS4uOWFkNDY2MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKQEAgLTU3LDYgKzU3LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7CiAJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwogCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuSU1QT1JUX0VBUl9XSVpBUkRfUDEpOwpAQCAtNzAsNiArNzEsNyBAQAogCQlyZXR1cm4gY29tcG9zaXRlOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdEltcG9ydExhYmVsKCkgewogCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0lNUE9SVF9QUk9KRUNUX0xBQkVMKTsKIAl9CkBAIC03OSw2ICs4MSw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsZUltcG9ydExhYmVsKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVJbXBvcnRMYWJlbCgpIHsKIAkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkVBUl9JTVBPUlRfRklMRV9MQUJFTCk7CiAJfQpAQCAtODgsNiArOTEsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbHRlckV4cHJlc3Npb24oKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewogCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIqLmVhciJ9OyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMTA3LDYgKzExMSw3IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKQogCSAqLwogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKIAkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLAogCQkJCQlJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwKQEAgLTEyMSw2ICsxMjYsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbGVOYW1lc1N0b3JlSUQoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZU5hbWVzU3RvcmVJRCgpIHsKIAkJcmV0dXJuICJFQVIiOy8vJE5PTi1OTFMtMSQKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YQppbmRleCBlZTVjODk2Li42M2ZkOTBhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKQEAgLTEwLDEyICsxMCwxMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QucHJvamVjdC5mYWNldC5JUHJvZHVjdENvbnN0YW50czsKQEAgLTI3LDcgKzI1LDcgQEAKICAqIEVudGVycHJpc2UgQXBwbGljYXRpb24gQXJjaGl2ZSAqLmVhciBmaWxlLgogICogPC9wPgogICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRUFSQ29tcG9uZW50SW1wb3J0V2l6YXJkIGV4dGVuZHMgSjJFRUFydGlmYWN0SW1wb3J0V2l6YXJkIGltcGxlbWVudHMgSUV4ZWN1dGFibGVFeHRlbnNpb24sIElJbXBvcnRXaXphcmQgeworcHVibGljIGZpbmFsIGNsYXNzIEVBUkNvbXBvbmVudEltcG9ydFdpemFyZCBleHRlbmRzIEoyRUVBcnRpZmFjdEltcG9ydFdpemFyZHsKIAogCS8qKgogCSAqIDxwPgpAQCAtNzksNiArNzcsNyBAQAogCSAqIAogCSAqIDwvcD4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewogCQlhZGRQYWdlKG5ldyBFQVJDb21wb25lbnRJbXBvcnRQYWdlKGdldERhdGFNb2RlbCgpLCBNQUlOX1BHKSk7CiAJCWFkZFBhZ2UobmV3IEVBUkNvbXBvbmVudEltcG9ydE9wdGlvbnNQYWdlKGdldERhdGFNb2RlbCgpLCBPUFRJT05TX1BHKSk7CkBAIC05NCwxNiArOTMsMTkgQEAKIAkgKiBTZXRzIHVwIHRoZSBkaWFsb2cgd2luZG93IHRpdGxlIGFuZCBkZWZhdWx0IHdpemFyZCBwYWdlIGltYWdlLgogCSAqIDwvcD4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBkb0luaXQoKSB7CiAJCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLklNUE9SVF9XSVpfVElUTEUpKTsKIAkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuRUFSX0lNUE9SVF9XSVpBUkRfQkFOTkVSKSk7CiAJCQogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewogCQlyZXR1cm4gbmV3IEVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCk7CiAJfQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgewogICAgICAgICByZXR1cm4gUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfRUFSKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudFByb2plY3RzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9FQVJDb21wb25lbnRQcm9qZWN0c1BhZ2UuamF2YQppbmRleCA4ODBhMGJkLi5hZWFjYjdkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkNvbXBvbmVudFByb2plY3RzUGFnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSQ29tcG9uZW50UHJvamVjdHNQYWdlLmphdmEKQEAgLTc1LDYgKzc1LDcgQEAKIAkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLkVBUl9JTVBPUlRfV0laQVJEX0JBTk5FUikpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewogCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKIAkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLklNUE9SVF9FQVJfV0laQVJEX1AzKTsKQEAgLTExMCw2ICsxMTEsNyBAQAogCQlnZC53aWR0aEhpbnQgPSAxNDA7CiAJCXNlbGVjdE5vdEluV29ya3NwYWNlLnNldExheW91dERhdGEoZ2QpOwogCQlzZWxlY3ROb3RJbldvcmtzcGFjZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewogCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BTExfUFJPSkVDVF9NT0RFTFNfTElTVCk7CiAJCQkJTGlzdCBzZWxlY3RlZExpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuU0VMRUNURURfTU9ERUxTX0xJU1QpOwpAQCAtMTM3LDYgKzEzOSw3IEBACiAJCWdkLndpZHRoSGludCA9IDE0MDsKIAkJc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwogCQlzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKIAkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQUxMX1BST0pFQ1RfTU9ERUxTX0xJU1QpOwogCQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKQEAgLTE1Myw2ICsxNTYsNyBAQAogCQlnZC53aWR0aEhpbnQgPSAxNDA7CiAJCWRlc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwogCQlkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewogCQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKIAkJCQltb2RlbC5zZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5TRUxFQ1RFRF9NT0RFTFNfTElTVCwgbmV3TGlzdCk7CkBAIC0xNjAsNiArMTY0LDcgQEAKIAkJfSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7CiAJCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuU0VMRUNURURfTU9ERUxTX0xJU1QpKSB7CiAJCQlpZihlYXJGaWxlTGlzdFZpZXdlciAhPSBudWxsKXsKQEAgLTE5Miw2ICsxOTcsNyBAQAogCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwud2l6YXJkLkoyRUVXaXphcmRQYWdlI2VudGVyKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKIAkJc3VwZXIuZW50ZXIoKTsKIAkJc2V0RmlsZUxpc3RWaWV3ZXJJbnB1dCgpOwpAQCAtMjIxLDEwICsyMjcsNiBAQAogCQllYXJGaWxlTGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHByb3ZpZGVyKTsKIAkJZWFyRmlsZUxpc3RWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewogCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlEYXRhTW9kZWwgbWF0Y2hpbmdNb2RlbCA9IG51bGw7Ly8gZ2V0RUFSSW1wb3J0RGF0YU1vZGVsKCkuZ2V0TWF0Y2hpbmdFSkJKYXJPckNsaWVudChhTW9kZWwpOwotCQkJCWlmIChudWxsICE9IG1hdGNoaW5nTW9kZWwpIHsKLQkJCQkJZWFyRmlsZUxpc3RWaWV3ZXIuc2V0Q2hlY2tlZChtYXRjaGluZ01vZGVsLCBldmVudC5nZXRDaGVja2VkKCkpOwotCQkJCX0KIAkJCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKIAkJCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoZWFyRmlsZUxpc3RWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpKTsKIAkJCQltb2RlbC5zZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5TRUxFQ1RFRF9NT0RFTFNfTElTVCwgcmVzdWx0KTsKQEAgLTI4NiwxMCArMjg4LDEyIEBACiAJCS8vIFRoaXMgcGFnZSBkb2Vzbid0IGltcGxlbWVudC4uLgogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewogCQkvLyBUaGlzIHBhZ2UgZG9lc24ndCBpbXBsZW1lbnQuLi4KIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7CiAJCXJldHVybiBuZXcgU3RyaW5nW117SUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuU0VMRUNURURfTU9ERUxTX0xJU1QsIEVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLk5FU1RFRF9QUk9KRUNUU19WQUxJREFUSU9OfTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0VBUkltcG9ydExpc3RDb250ZW50UHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhCmluZGV4IGFlNjVmNWMuLjkwMjMyNTEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvRUFSSW1wb3J0TGlzdENvbnRlbnRQcm92aWRlci5qYXZhCkBAIC0xMDEsNiArMTAxLDcgQEAKIAkJLy8gZG8gbm90aGluZwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CiAJCS8vIGRpc3Bvc2UKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0ltcG9ydFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSW1wb3J0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE3MTJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSW1wb3J0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luOwotCi0KLQotLyoqCi0gKiBAYXV0aG9yIFNhY2hpbgotICogCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBlZGl0IHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSAidHlwZWNvbW1lbnQiOgotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+VGVtcGxhdGVzLiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFV0aWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUFSRklMRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUpCSkFSRklMRSA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSRklMRSA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5USkFSRklMRSA9IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFSRklMRSA9IDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1QT1JUQ0xBU1NUWVBFID0gNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKMkVFMTQgPSAyNTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSjJFRTEzID0gMTI4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEoyRUUxMiA9IDY0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEoyRUVTcGVjID0gSjJFRTEyICsgSjJFRTEzICsgSjJFRTE0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUiA9ICJFQVIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCID0gIkVKQiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVIgPSAiV0VCIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUiA9ICJDTElFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFSID0gIlJBUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVRkZJWEVTID0geyIiLCBFQVIsIEVKQiwgV0FSLCBKQVIsIFJBUiwgIiJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldEZpbGVUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCWFuQXJjaGl2ZSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoZmlsZU5hbWUpOwotCQkJCWludCBhcmNoaXZlVHlwZSA9IGdldEFyY2hpdmVUeXBlKGFuQXJjaGl2ZSk7Ci0JCQkJaWYgKGFyY2hpdmVUeXBlID09IFVOS05PV04gJiYgaXNJbXBvcnRDbGFzc1R5cGUoZmlsZU5hbWUpKQotCQkJCQlyZXR1cm4gSU1QT1JUQ0xBU1NUWVBFOwotCQkJCXJldHVybiBhcmNoaXZlVHlwZTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGlzSW1wb3J0Q2xhc3NUeXBlKGZpbGVOYW1lKSkKLQkJCQkJcmV0dXJuIElNUE9SVENMQVNTVFlQRTsKLQkJCQlyZXR1cm4gVU5LTk9XTjsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChhbkFyY2hpdmUgIT0gbnVsbCAmJiBhbkFyY2hpdmUuaXNPcGVuKCkpCi0JCQkJYW5BcmNoaXZlLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvL1RPRE86IHVzZSBuZXcgZ2V0SjJFRVZlcmlvbnMgc3dpdGNoIHN0YXRlbWVudHMKLQlwdWJsaWMgc3RhdGljIGludCBnZXRWZXJzaW9uZWRGaWxlVHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBudWxsOwotCQl0cnkgewotCQkJaW50IGFyY2hpdmVUeXBlID0gVU5LTk9XTjsKLQkJCXRyeSB7Ci0JCQkJYW5BcmNoaXZlID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShmaWxlTmFtZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGFuQXJjaGl2ZS5pc0VKQkphckZpbGUoKSkgewotCQkJCQkJYXJjaGl2ZVR5cGUgPSBFSkJKQVJGSUxFOwotCQkJCQkJRUpCSmFyIGVqYkphciA9ICgoRUpCSmFyRmlsZSkgYW5BcmNoaXZlKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQkJCQkJaWYgKGVqYkphci5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lEKQotCQkJCQkJCWFyY2hpdmVUeXBlIHw9IEoyRUUxMjsKLQkJCQkJCWVsc2UgaWYgKGVqYkphci5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKQotCQkJCQkJCWFyY2hpdmVUeXBlIHw9IEoyRUUxMzsKLQkJCQkJCWVsc2UgaWYgKGVqYkphci5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lEKQotCQkJCQkJCWFyY2hpdmVUeXBlIHw9IEoyRUUxNDsKLQkJCQkJfSBlbHNlIGlmIChhbkFyY2hpdmUuaXNXQVJGaWxlKCkpIHsKLQkJCQkJCWFyY2hpdmVUeXBlID0gV0FSRklMRTsKLQkJCQkJCVdlYkFwcCB3YXIgPSAoKFdBUkZpbGUpIGFuQXJjaGl2ZSkuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCQkJCWlmICh3YXIuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfMl9JRCkKLQkJCQkJCQlhcmNoaXZlVHlwZSB8PSBKMkVFMTI7Ci0JCQkJCQllbHNlIGlmICh3YXIuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRCkKLQkJCQkJCQlhcmNoaXZlVHlwZSB8PSBKMkVFMTM7Ci0JCQkJCQllbHNlIGlmICh3YXIuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRCkKLQkJCQkJCQlhcmNoaXZlVHlwZSB8PSBKMkVFMTQ7Ci0JCQkJCX0gZWxzZSBpZiAoYW5BcmNoaXZlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpIHsKLQkJCQkJCWFyY2hpdmVUeXBlID0gQ0xJRU5USkFSRklMRTsKLQkJCQkJCUFwcGxpY2F0aW9uQ2xpZW50IGFwcENsaWVudCA9ICgoQXBwbGljYXRpb25DbGllbnRGaWxlKSBhbkFyY2hpdmUpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJCQlpZiAoYXBwQ2xpZW50LmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKQotCQkJCQkJCWFyY2hpdmVUeXBlIHw9IEoyRUUxMjsKLQkJCQkJCWVsc2UgaWYgKGFwcENsaWVudC5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkKLQkJCQkJCQlhcmNoaXZlVHlwZSB8PSBKMkVFMTM7Ci0JCQkJCQllbHNlIGlmIChhcHBDbGllbnQuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpCi0JCQkJCQkJYXJjaGl2ZVR5cGUgfD0gSjJFRTE0OwotCQkJCQl9IGVsc2UgaWYgKGFuQXJjaGl2ZS5pc1JBUkZpbGUoKSkgewotCQkJCQkJYXJjaGl2ZVR5cGUgPSBSQVJGSUxFIHwgSjJFRTEzOwotCQkJCQl9IGVsc2UgaWYgKGFuQXJjaGl2ZS5pc0VBUkZpbGUoKSkgewotCQkJCQkJYXJjaGl2ZVR5cGUgPSBFQVJGSUxFOwotCQkJCQkJQXBwbGljYXRpb24gYXBwID0gKChFQVJGaWxlKSBhbkFyY2hpdmUpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJCQlpZiAoYXBwLmdldFZlcnNpb25JRCgpID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKQotCQkJCQkJCWFyY2hpdmVUeXBlIHw9IEoyRUUxMjsKLQkJCQkJCWVsc2UgaWYgKGFwcC5nZXRWZXJzaW9uSUQoKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkKLQkJCQkJCQlhcmNoaXZlVHlwZSB8PSBKMkVFMTM7Ci0JCQkJCQllbHNlIGlmIChhcHAuZ2V0VmVyc2lvbklEKCkgPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpCi0JCQkJCQkJYXJjaGl2ZVR5cGUgfD0gSjJFRTE0OwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJCWlmIChhcmNoaXZlVHlwZSA9PSBVTktOT1dOICYmIGlzSW1wb3J0Q2xhc3NUeXBlKGZpbGVOYW1lKSkKLQkJCQlhcmNoaXZlVHlwZSA9IElNUE9SVENMQVNTVFlQRTsKLQkJCXJldHVybiBhcmNoaXZlVHlwZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChhbkFyY2hpdmUgIT0gbnVsbCAmJiBhbkFyY2hpdmUuaXNPcGVuKCkpCi0JCQkJYW5BcmNoaXZlLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRBcmNoaXZlVHlwZShBcmNoaXZlIGFuQXJjaGl2ZSkgewotCQlpbnQgdHlwZSA9IFVOS05PV047Ci0JCXRyeSB7Ci0JCQlpZiAoYW5BcmNoaXZlLmlzRUpCSmFyRmlsZSgpKQotCQkJCXR5cGUgPSBFSkJKQVJGSUxFOwotCQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzV0FSRmlsZSgpKQotCQkJCXR5cGUgPSBXQVJGSUxFOwotCQkJZWxzZSBpZiAoYW5BcmNoaXZlLmlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkpCi0JCQkJdHlwZSA9IENMSUVOVEpBUkZJTEU7Ci0JCQllbHNlIGlmIChhbkFyY2hpdmUuaXNSQVJGaWxlKCkpCi0JCQkJdHlwZSA9IFJBUkZJTEU7Ci0JCQllbHNlIGlmIChhbkFyY2hpdmUuaXNFQVJGaWxlKCkpCi0JCQkJdHlwZSA9IEVBUkZJTEU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZQotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ltcG9ydENsYXNzVHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbihmaWxlKTsKLQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKLQkJCWlmIChmaWxlRXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoImphciIpIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZpbGVFeHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgiemlwIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZmlsZUV4dGVuc2lvbi5lcXVhbHNJZ25vcmVDYXNlKCJjbGFzcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7IC8vZGlzYWJsZS9lbmFibGUgZHJhZy9kcm9wIGRpcmVjdG9yaWVzCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVuc2lvbihGaWxlIGYpIHsKLQkJU3RyaW5nIGV4dCA9IG51bGw7Ci0JCVN0cmluZyBzID0gZi5nZXROYW1lKCk7Ci0JCWludCBpID0gcy5sYXN0SW5kZXhPZignLicpOwotCi0JCWlmIChpID4gMCAmJiBpIDwgcy5sZW5ndGgoKSAtIDEpIHsKLQkJCWV4dCA9IHMuc3Vic3RyaW5nKGkgKyAxKS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCXJldHVybiBleHQ7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kTWF0Y2hpbmdQcm9qZWN0TmFtZShTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJaWYgKHByb2plY3ROYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBKMkVFUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSByb290LmdldFByb2plY3RzKCk7Ci0JCQlTdHJpbmcgbG93ZXJDYXNlTmFtZSA9IHByb2plY3ROYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkvLyBpdGVyYXRlIHRocm91Z2ggYWxsIHByb2plY3RzIGEgY29tcGFyZSBsb3dlcmNhc2UgbmFtZXMKLQkJCWlmIChwcm9qZWN0TmFtZSA9PSBudWxsIHx8IHByb2plY3ROYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCQlpZiAocHJvamVjdHMubGVuZ3RoID09IDEpCi0JCQkJCXJldHVybiBwcm9qZWN0c1swXS5nZXROYW1lKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHByb2plY3RzW2ldLmV4aXN0cygpKSB7Ci0JCQkJCWlmIChXVFBQbHVnaW4uaXNQbGF0Zm9ybUNhc2VTZW5zaXRpdmUoKSkgewotCQkJCQkJaWYgKHByb2plY3RzW2ldLmdldE5hbWUoKS5lcXVhbHMocHJvamVjdE5hbWUpKQotCQkJCQkJCXJldHVybiBwcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAocHJvamVjdHNbaV0uZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGxvd2VyQ2FzZU5hbWUpKQotCQkJCQkJCXJldHVybiBwcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2plY3ROYW1lOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUFydGlmYWN0RXhwb3J0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVBcnRpZmFjdEV4cG9ydFdpemFyZC5qYXZhCmluZGV4IGYxMTkwZWEuLjhjYTA2MjMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUFydGlmYWN0RXhwb3J0V2l6YXJkLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQXJ0aWZhY3RFeHBvcnRXaXphcmQuamF2YQpAQCAtMTM5LDEyICsxMzksMTQgQEAKIAkgKiAKIAkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbW9uLndpemFyZC5kYXRhbW9kZWwuV1RQV2l6YXJkI2Rpc3Bvc2UoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCB2b2lkIGRpc3Bvc2UoKSB7CiAJCXN1cGVyLmRpc3Bvc2UoKTsKIAkJZG9EaXNwb3NlKCk7CiAJCXRoaXMuY3VycmVudFNlbGVjdGlvbiA9IG51bGw7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gcHJlUGVyZm9ybUZpbmlzaCgpIHsKIAkJaWYgKCFDb21tb25FZGl0b3JVdGlsaXR5LnByb21wdFRvU2F2ZUFsbERpcnR5RWRpdG9ycygpKSB7CiAJCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVBcnRpZmFjdEltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQXJ0aWZhY3RJbXBvcnRXaXphcmQuamF2YQppbmRleCA2ODEyMDc4Li4zOWExZTYyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVBcnRpZmFjdEltcG9ydFdpemFyZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUFydGlmYWN0SW1wb3J0V2l6YXJkLmphdmEKQEAgLTEwOSw2ICsxMDksNyBAQAogCSAqIAogCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuajJlZS5jb21tb24ud2l6YXJkLmRhdGFtb2RlbC5XVFBXaXphcmQjZGlzcG9zZSgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGZpbmFsIHZvaWQgZGlzcG9zZSgpIHsKIAkJc3VwZXIuZGlzcG9zZSgpOwogCQlkb0Rpc3Bvc2UoKTsKQEAgLTE1NSw2ICsxNTYsNyBAQAogCSAqIAogCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIGFsbCBlZGl0b3JzIGFyZSBzYXZlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHByZVBlcmZvcm1GaW5pc2goKSB7CiAJCWlmICghQ29tbW9uRWRpdG9yVXRpbGl0eS5wcm9tcHRUb1NhdmVBbGxEaXJ0eUVkaXRvcnMoKSkgewogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTc1LDEwICsxNzcsMTIgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkI3Bvc3RQZXJmb3JtRmluaXNoKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgZmluYWwgdm9pZCBwb3N0UGVyZm9ybUZpbmlzaCgpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKIAkJc3VwZXIucG9zdFBlcmZvcm1GaW5pc2goKTsKIAkJaWYgKGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpICE9IG51bGwgJiYgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkubGVuZ3RoKCkgPiAwKSB7CiAJCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IG5ldyBEZWxlZ2F0ZUNvbmZpZ3VyYXRpb25FbGVtZW50KGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7CisJCQkJQE92ZXJyaWRlCiAJCQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIGFOYW1lKSB7CiAJCQkJCWlmIChhTmFtZS5lcXVhbHMoImZpbmFsUGVyc3BlY3RpdmUiKSkgeyAvLyROT04tTkxTLTEkCiAJCQkJCQlyZXR1cm4gZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVDb21wb25lbnRGYWNldENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQ29tcG9uZW50RmFjZXRDcmVhdGlvbldpemFyZFBhZ2UuamF2YQppbmRleCBhZDMzYmQ5Li5kZGVhMjkzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVDb21wb25lbnRGYWNldENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsMzQgKzIwLDUwIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldC5FYXJTZWxlY3Rpb25QYW5lbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZTsKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVDb21wb25lbnRGYWNldENyZWF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIERhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlIGltcGxlbWVudHMgSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUNvbXBvbmVudEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlIGV4dGVuZHMgRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2UgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JFX0xBQkVMID0gIkxBU1RFQVJOQU1FXyI7IC8vJE5PTi1OTFMtMSQKICAgICAKIAlwcm90ZWN0ZWQgRWFyU2VsZWN0aW9uUGFuZWwgZWFyUGFuZWw7CisJCisJcHJpdmF0ZSBib29sZWFuIHNob3VsZEFkZEVBUkNvbXBvc2l0ZSA9IHRydWU7CiAgIAorCQorCiAJcHVibGljIEoyRUVDb21wb25lbnRGYWNldENyZWF0aW9uV2l6YXJkUGFnZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7CiAJCXN1cGVyKGRhdGFNb2RlbCwgcGFnZU5hbWUpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBmaW5hbCBDb21wb3NpdGUgdG9wID0gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoIHBhcmVudCApOwotCQljcmVhdGVFYXJDb21wb3NpdGUodG9wKTsKLQkJcmV0dXJuIHRvcDsKKyAgICAgICAgZmluYWwgQ29tcG9zaXRlIHRvcCA9IHN1cGVyLmNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7CisJCWlmKGlzU2hvdWxkQWRkRUFSQ29tcG9zaXRlKCkpeworICAgICAgICBjcmVhdGVFYXJDb21wb3NpdGUodG9wKTsKKyAgICAgICAgY3JlYXRlV29ya2luZ1NldEdyb3VwUGFuZWwodG9wLCBuZXcgU3RyaW5nW10geyBSRVNPVVJDRV9XT1JLSU5HX1NFVCwgSkFWQV9XT1JLSU5HX1NFVCB9KTsKKwkJfQorICAgICAgICByZXR1cm4gdG9wOwogCX0KIAogCXByaXZhdGUgdm9pZCBjcmVhdGVFYXJDb21wb3NpdGUoQ29tcG9zaXRlIHRvcCkgCkBAIC02NCwxNyArODAsMjAgQEAKIAogCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TW9kdWxlRmFjZXRJRCgpOwogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVUeXBlSUQoKSB7CiAJCXJldHVybiBnZXRNb2R1bGVGYWNldElEKCk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CiAJCXN1cGVyLmRpc3Bvc2UoKTsKIAkJaWYgKGVhclBhbmVsICE9IG51bGwpCiAJCQllYXJQYW5lbC5kaXNwb3NlKCk7CiAJfQogCQotICAgIHB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgeworICAgIEBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewogICAgIAlzdXBlci5zdG9yZURlZmF1bHRTZXR0aW5ncygpOwogICAgICAgICBJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwogICAgICAgICBpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewpAQCAtODgsMjQgKzEwNywxMzggQEAKICAgICAgICAgfQogICAgIH0KICAgICAKLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlRGVmYXVsdFNldHRpbmdzKCkgeworICAgIEBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7CisgICAgCS8vZ2V0IHRoZSB2YWx1ZXMgZnJvbSB0aGUgc2VsZWN0ZWQgRUFSIHRvIHJlc3RvcmUuCisgICAgCUlQcm9qZWN0IHNlbGVjdGVkRUFSUHJvamVjdCA9IGdldFNlbGVjdGVkRUFSKCk7CisgICAgCWlmIChzZWxlY3RlZEVBUlByb2plY3QgIT0gbnVsbCl7CisgICAgCQlyZXN0b3JlRUFSTmFtZShzZWxlY3RlZEVBUlByb2plY3QpOworICAgIAkJcmVzdG9yZUVBUlJ1bnRpbWUoc2VsZWN0ZWRFQVJQcm9qZWN0KTsKKyAgICAJfSBlbHNleworICAgIAkJcmVzdG9yZVN0b3JlZExhYmVsRUFSTmFtZSgpOworICAgIAl9CiAgICAgCXN1cGVyLnJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKTsKLSAgICAgICAgSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLSAgICAgICAgaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBsYXN0RUFSTmFtZSA9IHNldHRpbmdzLmdldChTVE9SRV9MQUJFTCk7Ci0gICAgICAgICAgICBpZiAobGFzdEVBUk5hbWUgIT0gbnVsbCl7Ci0gICAgICAgICAgICAJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKW1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLSAgICAgICAgICAgIAlTdHJpbmcgZmFjZXRJRCA9IGdldE1vZHVsZUZhY2V0SUQoKTsKLSAgICAgICAgICAgIAlJRGF0YU1vZGVsIGoyZWVNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChmYWNldElEKTsKLSAgICAgICAgICAgICAgICBqMmVlTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkxBU1RfRUFSX05BTUUsIGxhc3RFQVJOYW1lKTsKLSAgICAgICAgICAgIH0KLQkJfQogCX0KICAgICAKKyAgICAvKiBSZXN0b3JlIHRoZSBFQVIgTmFtZSBmcm9tIHRoZSB1c2VyIHNlbGVjdGVkIEVBUiBpZiB0aGVyZSBpcyBhbnkKKwkgKiBAcGFyYW0gZWFyTmFtZQorCSAqLworICAgIHByaXZhdGUgdm9pZCByZXN0b3JlRUFSTmFtZShJUHJvamVjdCBlYXJQcm9qZWN0KXsKKyAgICAJU3RyaW5nIGVhck5hbWUgPSBlYXJQcm9qZWN0LmdldE5hbWUoKTsKKyAgICAJaWYgKGVhck5hbWUgIT0gbnVsbCl7CisgICAgCQlzZXRFYXJOYW1lKGVhck5hbWUsIGZhbHNlKTsKKyAgICAJfQorICAgIH0KKyAgICAKKyAgICAvKiBSZXN0b3JlIHRoZSBFQVIgTmFtZSBmcm9tIHRoZSBsYXN0IGNyZWF0ZWQgRUFSIFByb2plY3QKKwkgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVzdG9yZVN0b3JlZExhYmVsRUFSTmFtZSgpeworICAgIAlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOworICAgIAlTdHJpbmcgZWFyTmFtZSA9IHNldHRpbmdzLmdldChTVE9SRV9MQUJFTCk7CisgICAgICAgIGlmIChlYXJOYW1lICE9IG51bGwpeworICAgICAgICAJc2V0RWFyTmFtZShlYXJOYW1lLCB0cnVlKTsgLy9sYXN0IGVhciBjcmVhdGVkLCBvbGQgYmVoYXZpb3IKKyAgICAgICAgfQorICAgIH0KKworCS8qIFNldHMgdGhlIEVBUiBOYW1lIHRvIHRoZSB0aGUgSjJlZSBtb2RlbCBhbmQgbW9kZWwKKwkgKiBAcGFyYW0gU3RyaW5nIEVBUiBQcm9qZWN0IE5hbWUKKwkgKiBAcGFyYW0gYm9vbGVhbiBzcGVjaWZ5aW5nIGlmIG9ubHkgdGhlIExBU1RfRUFSX05BTUUgcHJvcGVydHkgc2hvdWxkIGJlIHVwZGF0ZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIHNldEVhck5hbWUoU3RyaW5nIGVhck5hbWUsIGJvb2xlYW4gbGFzdEVBUk9ubHkpIHsKKwkJaWYgKGVhck5hbWUgIT0gbnVsbCl7CisJCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOworCQkJU3RyaW5nIGZhY2V0SUQgPSBnZXRNb2R1bGVGYWNldElEKCk7CisJCQlJRGF0YU1vZGVsIGoyZWVNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChmYWNldElEKTsKKwkJICAgIGoyZWVNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuTEFTVF9FQVJfTkFNRSwgZWFyTmFtZSk7CisJCSAgICBpZiAoIWxhc3RFQVJPbmx5KQorCQkgICAgCWoyZWVNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSwgZWFyTmFtZSk7CisKKwkJfQorCX0KKworCS8qIFNldHMgdGhlIFJ1bnRpbWUgdG8gdGhlIEoyRUUgbW9kZWwgYW5kIGNvbW1vbiBtb2RlbAorCSAqIEBwYXJhbSBJUHJvamVjdAorCSAqLworCXB1YmxpYyB2b2lkIHJlc3RvcmVFQVJSdW50aW1lKElQcm9qZWN0IHByb2opIHsKKwkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCltb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7CisJCQlTdHJpbmcgZmFjZXRJRCA9IGdldE1vZHVsZUZhY2V0SUQoKTsKKwkJCUlEYXRhTW9kZWwgajJlZU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKGZhY2V0SUQpOworCQkgICAgSVJ1bnRpbWUgY3VycmVudFJ1bnRpbWUgPSBnZXRUYXJnZXRSdW50aW1lKHByb2opOworCQkgICAgaWYgKGN1cnJlbnRSdW50aW1lICE9IG51bGwpeworCQkgICAgCWoyZWVNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRV9UQVJHRVRfSUQsIGN1cnJlbnRSdW50aW1lKTsKKwkJICAgIAltb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUsIGN1cnJlbnRSdW50aW1lKTsKKwkJICAgIH0KKwkJICAgIAorCX0KKyAgICAKKwkvKiBHZXRzIHRoZSBSdW50aW1lIGZyb20gdGhlIHVzZXIgc2VsZWN0ZWQgRUFSIGlmIHRoZXJlIGlzIGFueQorCSAqIEBwYXJhbSBJUnVudGltZQorCSAqLworCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWUgZ2V0VGFyZ2V0UnVudGltZShJUHJvamVjdCBwcm9qZWN0KSB7CisJCUlGYWNldGVkUHJvamVjdCBmUHJvamVjdCA9IG51bGw7CisJCXRyeSB7CisJCQlmUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgeworCQkJSjJFRVVJUGx1Z2luLmxvZ0Vycm9yKGV4KTsKKwkJfQorCQlpZihmUHJvamVjdCAhPSBudWxsKQorCQkJcmV0dXJuIGZQcm9qZWN0LmdldFJ1bnRpbWUoKSA7CisJCXJldHVybiBudWxsOworCX0KKwkKKyAgICAvKgorCSAqIEdldHMgdGhlIEVBUiBOYW1lIHNlbGVjdGVkIG9uIHRoZSB2aWV3IChBY3RpdmVQYXJ0KS4KKwkgKiBAcmV0dXJuIElQcm9qZWN0IG9yIG51bGwgaWYgdGhlcmUgaXMgbm90aGluZyBzZWxlY3RlZC4KKwkgKi8KKyAgICBwcml2YXRlIElQcm9qZWN0IGdldFNlbGVjdGVkRUFSKCl7CisgICAgCUlQcm9qZWN0IHJldFZhbCA9IG51bGw7CisgICAgCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uRnJvbVdvcmtiZW5jaFdpbmRvdygpOworICAgIAlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKKyAgICAJCUlQcm9qZWN0IHNlbFByb2plY3QgPSBnZXRFQVJQcm9qZWN0RnJvbVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uKTsKKyAgICAJCWlmIChzZWxQcm9qZWN0ICE9IG51bGwpeworICAgIAkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChzZWxQcm9qZWN0KSkgeworICAgIAkJCQlyZXRWYWwgPSBzZWxQcm9qZWN0OworICAgIAkJCX0KKyAgICAJCX0KKyAgICAJfQorCQlyZXR1cm4gcmV0VmFsOworCX0KKyAgICAKKyAgICAvKgorCSAqIEdldHMgdGhlIFNlbGVjdGlvbiBmcm9tIFdvcmtiZW5jaCBXaW5kb3cuCisJICogQHJldHVybiBJU2VsZWN0aW9uCisJICovCisJcHJpdmF0ZSBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbkZyb21Xb3JrYmVuY2hXaW5kb3coKSB7CisJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKKyAgICAJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uU2VydmljZSgpLmdldFNlbGVjdGlvbigpOworCQlyZXR1cm4gc2VsZWN0aW9uOworCX0KKyAgICAKKyAgICAKKwkvKgorCSAqIEV4dHJhY3QgdGhlIGZpcnN0IGVsZW1lbnQgc2VsZWN0ZWQgYW5kIGNoZWNrcyBmb3IgYW4gRUFSIFByb2plY3QKKwkgKiBAcGFyYW0gSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uCisJICogQHJldHVybiBJUHJvamVjdCBFQVIgb3IgbnVsbCBpZiB0aGVyZSBpcyBOb3Qgc2VsZWN0ZWQgRUFSIHByb2plY3QuCisJICovCisJcHJpdmF0ZSBJUHJvamVjdCBnZXRFQVJQcm9qZWN0RnJvbVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKKwkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKXsKKwkJCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSl7CisJCQkJT2JqZWN0IGZpcnN0U2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOworCQkJCWlmIChmaXJzdFNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CisJCQkJCXJldHVybiAoSVByb2plY3QpZmlyc3RTZWxlY3RlZEVsZW1lbnQ7CisJCQkJCQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisgICAgCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKICAgICAgICAgcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKICAgICB9CiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewogCQlTdHJpbmdbXSBzdXBlclByb3BlcnRpZXMgPSBzdXBlci5nZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpOwogCQlMaXN0IGxpc3QgPSBBcnJheXMuYXNMaXN0KHN1cGVyUHJvcGVydGllcyk7CkBAIC0xMTMsNiArMjQ2LDE1IEBACiAJCWFycmF5TGlzdC5hZGRBbGwoIGxpc3QgKTsKIAkJYXJyYXlMaXN0LmFkZCggSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSApOwogCQlhcnJheUxpc3QuYWRkKCBJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSICk7CisJCWFycmF5TGlzdC5hZGQoIElKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpOwogCQlyZXR1cm4gKFN0cmluZ1tdKWFycmF5TGlzdC50b0FycmF5KCBuZXcgU3RyaW5nWzBdICk7Ci0JfQkKKwl9CisJCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG91bGRBZGRFQVJDb21wb3NpdGUoKSB7CisJCXJldHVybiBzaG91bGRBZGRFQVJDb21wb3NpdGU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U2hvdWxkQWRkRUFSQ29tcG9zaXRlKGJvb2xlYW4gc2hvdWxkQWRkRUFSQ29tcG9zaXRlKSB7CisJCXRoaXMuc2hvdWxkQWRkRUFSQ29tcG9zaXRlID0gc2hvdWxkQWRkRUFSQ29tcG9zaXRlOworCX0KIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKaW5kZXggYWNkMTk1OS4uZjY4NTMzMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkLmphdmEKQEAgLTEwLDkgKzEwLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogCiAvKioKQEAgLTM1LDcgKzMzLDcgQEAKICAqIDxsaT57QGxpbmsgI2RvRGlzcG9zZSgpKCl9CiAgKiA8L3VsPgogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZCBleHRlbmRzIEoyRUVBcnRpZmFjdEltcG9ydFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQsIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFQ29tcG9uZW50SW1wb3J0V2l6YXJkIGV4dGVuZHMgSjJFRUFydGlmYWN0SW1wb3J0V2l6YXJkIHsKIAogCS8qKgogCSAqIDxwPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFQ29tcG9uZW50TGFiZWxQcm92aWRlci5qYXZhCmluZGV4IDFiYjE3MmUuLjk5ZTFjZDggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUNvbXBvbmVudExhYmVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVDb21wb25lbnRMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw4NSArNyw1NiBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqICAgICBNaWxlbiBNYW5vdiwgbWlsZW4ubWFub3ZAc2FwLmNvbSAtIGJ1Z3MgMjQ4NjIzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyMSwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiAKK3B1YmxpYyBjbGFzcyBKMkVFQ29tcG9uZW50TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewogCi0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKMkVFQ29tcG9uZW50TGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIHsKLQorCUlUYWJsZUxhYmVsUHJvdmlkZXIgdGFibGVMYWJsZVByb3ZpZGVyOworCQorCXByaXZhdGUgSjJFRUNvbXBvbmVudExhYmVsUHJvdmlkZXIgaW5zdGFuY2U7CisJCisJcHVibGljIEoyRUVDb21wb25lbnRMYWJlbFByb3ZpZGVyKElUYWJsZUxhYmVsUHJvdmlkZXIgdGFibGVMYWJsZVByb3ZpZGVyKXsKKwkJdGhpcy50YWJsZUxhYmxlUHJvdmlkZXIgPSB0YWJsZUxhYmxlUHJvdmlkZXI7CisJCWluc3RhbmNlID0gdGhpczsKKwkJdGFibGVMYWJsZVByb3ZpZGVyLmFkZExpc3RlbmVyKG5ldyBJTGFiZWxQcm92aWRlckxpc3RlbmVyKCl7CisJCQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBuZXdFdmVudCA9IG5ldyBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50KGluc3RhbmNlKTsKKwkJCQlmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQobmV3RXZlbnQpOworCQkJfQorCQl9KTsKKwl9CiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOworCQlyZXR1cm4gdGFibGVMYWJsZVByb3ZpZGVyLmdldENvbHVtbkltYWdlKGVsZW1lbnQsIDEpOwogCX0KIAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSVZpcnR1YWxDb21wb25lbnQpewotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChJVmlydHVhbENvbXBvbmVudCllbGVtZW50OwotCQkJcmV0dXJuIGNvbXAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJSVByb2plY3QgaGFuZGxlID0gKElQcm9qZWN0KWVsZW1lbnQ7Ci0JCQlyZXR1cm4gaGFuZGxlLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKKwkJcmV0dXJuIHRhYmxlTGFibGVQcm92aWRlci5nZXRDb2x1bW5UZXh0KGVsZW1lbnQsIDEpOworLy8JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJVmlydHVhbENvbXBvbmVudCl7CisvLwkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpZWxlbWVudDsKKy8vCQkJcmV0dXJuIGNvbXAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKKy8vCQl9CisvLwkJCisvLwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgeworLy8JCQlJUHJvamVjdCBoYW5kbGUgPSAoSVByb2plY3QpZWxlbWVudDsKKy8vCQkJcmV0dXJuIGhhbmRsZS5nZXROYW1lKCk7CisvLwkJfQorLy8JCXJldHVybiBudWxsOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFRXhwb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFRXhwb3J0UGFnZS5qYXZhCmluZGV4IDlmNjIyZDguLjAxZGYzY2QgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUV4cG9ydFBhZ2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVFeHBvcnRQYWdlLmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudERhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkVhclV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5hcmNoaXZlLklBcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudWkuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlRXhwb3J0UGFydGljaXBhbnRQYW5lbHNFeHRlbnNpb25Qb2ludDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJCQl9CiAJCQlpZighcHJvamVjdE5hbWVTZXQgJiYgdmFsaWRQcm9qZWN0TmFtZXMubGVuZ3RoID4gMCl7CiAJCQkJLy9pZiBleHBvcnQgZGlhbG9nIGlzIGludm9rZWQgYnkgc2VsZWN0aW5nIGEgbm9uIEVBUiBwcm9qZWN0LCBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgRUFSCi0JCQkJSVByb2plY3RbXSBlYXJQcm9qZWN0cyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMocHJvamVjdCk7CisJCQkJSVByb2plY3RbXSBlYXJQcm9qZWN0cyA9IEVhclV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHByb2plY3QpOwogCQkJCWlmKCBlYXJQcm9qZWN0cy5sZW5ndGggPiAwICl7CiAJCQkJCW1vZGVsLnNldFByb3BlcnR5KElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIGVhclByb2plY3RzWzBdLmdldE5hbWUoKSk7CQkJCQkJCiAJCQkJfWVsc2UKQEAgLTExNCw2ICsxMTQsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTEyMyw2ICsxMjQsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAogCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKQEAgLTE0OSw2ICsxNTEsOCBAQAogCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKIAkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7CiAJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOworICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKIAkJY3JlYXRlRXhwb3J0Q29tcG9uZW50R3JvdXAoY29tcG9zaXRlKTsKIAkJY3JlYXRlRGVzdGluYXRpb25Hcm91cChjb21wb3NpdGUpOwogCkBAIC0xOTQsMTAgKzE5OCwxMiBAQAogCiAgICAgICAgIC8vIGRlc3RpbmF0aW9uIGJyb3dzZSBidXR0b24KICAgICAgICAgZGVzdGluYXRpb25Ccm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotICAgICAgICBkZXN0aW5hdGlvbkJyb3dzZUJ1dHRvbi5zZXRUZXh0KGRlZkJyb3dzZUJ1dHRvbkxhYmVsKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBkZXN0aW5hdGlvbkJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKChuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSkpOworICAgICAgICBkZXN0aW5hdGlvbkJyb3dzZUJ1dHRvbi5zZXRUZXh0KGRlZkJyb3dzZUJ1dHRvbkxhYmVsKTsKKyAgICAgICAgLy8gYnVnIDI5MDcwOQorLy8gICAgICAgIGRlc3RpbmF0aW9uQnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKSk7CiAgICAgICAgIGRlc3RpbmF0aW9uQnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CiAgICAgICAgICAgICAgICAgaGFuZGxlRGVzdGluYXRpb25Ccm93c2VCdXR0b25QcmVzc2VkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwpAQCAtMjEzLDcgKzIxOSw3IEBACiAgICAgCWdyb3VwLnNldFRleHQoIExBQkVMX1JVTlRJTUUgKTsKIAogICAgIAl0aGlzLm9wdGltaXplRm9yUnVudGltZUNoZWNrYm94ID0gbmV3IEJ1dHRvbiggZ3JvdXAsIFNXVC5DSEVDSyApOwotICAgIAl0aGlzLm9wdGltaXplRm9yUnVudGltZUNoZWNrYm94LnNldFRleHQoICJPcHRpbWl6ZSBmb3IgYSBzcGVjaWZpYyBzZXJ2ZXIgcnVudGltZSIgKTsKKyAgICAJdGhpcy5vcHRpbWl6ZUZvclJ1bnRpbWVDaGVja2JveC5zZXRUZXh0KCBKMkVFV2l6YXJkTkxTLkoyRUVFeHBvcnRQYWdlX09wdGltaXplX2Zvcl9hX3NwZWNpZmljX3NlcnZlcl9ydW50XyApOwogICAgIAl0aGlzLnN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goIHRoaXMub3B0aW1pemVGb3JSdW50aW1lQ2hlY2tib3gsIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PUFRJTUlaRV9GT1JfU1BFQ0lGSUNfUlVOVElNRSwgbnVsbCApOwogICAgIAkKICAgICAJZmluYWwgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKQEAgLTM0NCwxNCArMzUwLDE0IEBACiAJcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3ZlcndyaXRlRXhpc3RpbmdGaWxlc0NoZWNrYm94KENvbXBvc2l0ZSBvcHRpb25zR3JvdXApIHsKIAkJLy9PdmVyd3JpdGUgY2hlY2tib3gKIAkJb3ZlcndyaXRlRXhpc3RpbmdGaWxlc0NoZWNrYm94ID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLQkJb3ZlcndyaXRlRXhpc3RpbmdGaWxlc0NoZWNrYm94LnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSjJFRV9FWFBPUlRfT1ZFUldSSVRFX0NIRUNLQk9YKSk7IC8vJE5PTi1OTFMtMSQgPSAiT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIHdpdGhvdXQgd2FybmluZyIKKwkJb3ZlcndyaXRlRXhpc3RpbmdGaWxlc0NoZWNrYm94LnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSjJFRV9FWFBPUlRfT1ZFUldSSVRFX0NIRUNLQk9YKSk7IAogCQlvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3guc2V0RW5hYmxlZCh0cnVlKTsKIAkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChvdmVyd3JpdGVFeGlzdGluZ0ZpbGVzQ2hlY2tib3gsIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfRVhJU1RJTkcsIG51bGwpOwogCX0KIAogCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvdXJjZUZpbGVzQ2hlY2tib3goQ29tcG9zaXRlIG9wdGlvbnNHcm91cCkgewogCQlzb3VyY2VGaWxlc0NoZWNrYm94ID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5MRUZUKTsKLQkJc291cmNlRmlsZXNDaGVja2JveC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkoyRUVfRVhQT1JUX1NPVVJDRV9DSEVDS0JPWCkpOyAvLyROT04tTkxTLTEkCisJCXNvdXJjZUZpbGVzQ2hlY2tib3guc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5KMkVFX0VYUE9SVF9TT1VSQ0VfQ0hFQ0tCT1gpKTsKIAkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChzb3VyY2VGaWxlc0NoZWNrYm94LCBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRVhQT1JUX1NPVVJDRV9GSUxFUywgbnVsbCk7CiAJfQogCkBAIC00NDMsNiArNDQ5LDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewogCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwogCQlpZiAoc2V0dGluZ3MgIT0gbnVsbCkgewpAQCAtNDc1LDkgKzQ4MiwxNyBAQAogCSAqIEByZXR1cm4KIAkgKi8KIAlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lc1N0b3JlSUQoKSB7CisJCXJldHVybiBnZXRDb21wb25lbnRJRCgpOworCX0KKwkKKwlARGVwcmVjYXRlZAorCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG5lbnRJRCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb25lbnRJRCgpIHsKIAkJcmV0dXJuIGdldENvbXBuZW50SUQoKTsKIAl9Ci0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb21wbmVudElEKCk7CiAKICAgICAvKioKIAkgKiBAcmV0dXJuCkBAIC00OTEsNiArNTA2LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNlbnRlcigpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7CiAJCXN1cGVyLmVudGVyKCk7CiAJCXJlc3RvcmVXaWRnZXRWYWx1ZXMoKTsKQEAgLTUyOCw2ICs1NDQsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0RGlhbG9nU2V0dGluZ3MoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7CiAJCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFSW1wb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFSW1wb3J0UGFnZS5qYXZhCmluZGV4IGQ0MTM2OGUuLmYyMTA0OWQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRUltcG9ydFBhZ2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVJbXBvcnRQYWdlLmphdmEKQEAgLTU5LDYgKzU5LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CkBAIC02OCw2ICs2OSw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewogCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKIAkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7CkBAIC0xMjQsNiArMTI2LDcgQEAKIAkJbmV3U2VydmVyVGFyZ2V0QnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTkVXX1RIUkVFX0RPVFNfRSkpOwogCQluZXdTZXJ2ZXJUYXJnZXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7CiAJCW5ld1NlcnZlclRhcmdldEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewogCQkJCS8vRmxleGlibGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlLmxhdW5jaE5ld1J1bnRpbWVXaXphcmQoZ2V0U2hlbGwoKSwgbW9kZWwpOwogCQkJCWxhdW5jaE5ld1J1bnRpbWVXaXphcmQoZ2V0U2hlbGwoKSwgbW9kZWwpOwpAQCAtMTMzLDYgKzEzNiw3IEBACiAJCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oc2VydmVyVGFyZ2V0Q29tYm8sIElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSwgZGVwcyk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dTZXR0aW5ncygpIHsKIAkJcmV0dXJuIEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKIAl9CkBAIC0xNTUsOCArMTU5LDkgQEAKIAkJLy8gc2V0dXAgYnJvd3NlIGJ1dHRvbgogCQlCdXR0b24gYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKIAkJYnJvd3NlQnV0dG9uLnNldFRleHQoZGVmQnJvd3NlQnV0dG9uTGFiZWwpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YSgobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpKTsKKwkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCkpKTsKIAkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CiAJCQkJaGFuZGxlRmlsZUJyb3dzZUJ1dHRvblByZXNzZWQoKTsKIAkJCX0KQEAgLTIwMCw2ICsyMDUsNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7CiAJCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7CiAJCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7CkBAIC0yMjksNiArMjM1LDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7CiAJCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7CiAJCURhdGFNb2RlbEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlLnJlc3RvcmVSdW50aW1lU2V0dGluZ3Moc2V0dGluZ3MsIG1vZGVsKTsKQEAgLTI1Myw2ICsyNjAsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2VudGVyKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKIAkJc3VwZXIuZW50ZXIoKTsKIAl9CkBAIC0yNjAsNyArMjY4LDcgQEAKIAlwcml2YXRlIGJvb2xlYW4gbGF1bmNoTmV3UnVudGltZVdpemFyZChTaGVsbCBzaGVsbCwgSURhdGFNb2RlbCBtb2RlbCkgewogCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBwcmVBZGRpdGlvbkRlc2NyaXB0b3JzID0gbW9kZWwuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSk7CiAJCWJvb2xlYW4gaXNPSyA9IFNlcnZlclVJVXRpbC5zaG93TmV3UnVudGltZVdpemFyZChzaGVsbCwgIiIsICIiKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJaWYgKGlzT0sgJiYgbW9kZWwgIT0gbnVsbCkgeworCQlpZiAoaXNPSykgewogCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gcG9zdEFkZGl0aW9uRGVzY3JpcHRvcnMgPSBtb2RlbC5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FKTsKIAkJCU9iamVjdFtdIHByZUFkZGl0aW9uID0gbmV3IE9iamVjdFtwcmVBZGRpdGlvbkRlc2NyaXB0b3JzLmxlbmd0aF07CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHByZUFkZGl0aW9uLmxlbmd0aDsgaSsrKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVFeHBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVFeHBvcnRQYWdlLmphdmEKaW5kZXggZmE5NWVlNy4uMTA2NDgwMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFTW9kdWxlRXhwb3J0UGFnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZUV4cG9ydFBhZ2UuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHNlbGVjdGlvbik7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewogCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIElKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX0RFU1RJTkFUSU9OLCBJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1ZFUldSSVRFX0VYSVNUSU5HfTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVGYWNldEluc3RhbGxQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVGYWNldEluc3RhbGxQYWdlLmphdmEKaW5kZXggZjIxZGI4Zi4uZGM3MTRhZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFTW9kdWxlRmFjZXRJbnN0YWxsUGFnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2UuamF2YQpAQCAtMzMsOCArMzMsMTIgQEAKIAkJc3VwZXIocGFnZU5hbWUpOwogCX0KIAorCS8qKgorCSAqIEBkZXByZWNhdGVkIFRoaXMgbWVtYmVyIHNob3VsZCBub3QgYmUgdXNlZCBhbnkgbW9yZS4gVGhlIEVBUiBQYW5lbCBpcyBtb3ZlZCB0byB0aGUgZmlyc3Qgd2l6YXJkIHBhZ2UuIAorCSAqLwogCXByb3RlY3RlZCBFYXJTZWxlY3Rpb25QYW5lbCBlYXJQYW5lbDsKIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CiAJCWlmIChudWxsICE9IGVhclBhbmVsKSB7CiAJCQllYXJQYW5lbC5kaXNwb3NlKCk7CkBAIC00Myw2ICs0Nyw5IEBACiAJCXN1cGVyLmRpc3Bvc2UoKTsKIAl9CiAKKwkvKioKKwkgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBhbnkgbW9yZS4gVGhlIEVBUiBQYW5lbCBpcyBtb3ZlZCB0byB0aGUgZmlyc3Qgd2l6YXJkIHBhZ2UuIAorCSAqLwogCXByb3RlY3RlZCB2b2lkIHNldHVwRWFyQ29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7CiAJCUNvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKIAkJYy5zZXRMYXlvdXREYXRhKGdkaGZpbGwoKSk7CkBAIC01MywxMCArNjAsMTcgQEAKIAkJdGhpcy5lYXJQYW5lbCA9IG5ldyBFYXJTZWxlY3Rpb25QYW5lbChtb2RlbCwgYyk7CiAJfQogCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYXRlRGVzY3JpcHRvckNvbnRyb2woIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgKQotCXsKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmF0ZURlc2NyaXB0b3JDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJY3JlYXRlR2VuZXJhdGVEZXNjcmlwdG9yQ29udHJvbChwYXJlbnQsIG51bGwpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmF0ZURlc2NyaXB0b3JDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZEZpbGVOYW1lKQl7CiAgICAgICAgIHRoaXMuYWRkREQgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAgICAgdGhpcy5hZGRERC5zZXRUZXh0KFJlc291cmNlcy5nZW5lcmF0ZURlcGxveW1lbnREZXNjcmlwdG9yKTsKKyAgICAgICAgaWYgKGRkRmlsZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAJdGhpcy5hZGRERC5zZXRUZXh0KFJlc291cmNlcy5nZW5lcmF0ZURlcGxveW1lbnREZXNjcmlwdG9yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgCXRoaXMuYWRkREQuc2V0VGV4dChOTFMuYmluZChSZXNvdXJjZXMuZ2VuZXJhdGVEZXBsb3ltZW50RGVzY3JpcHRvcldpdGhGaWxlTmFtZSwgZGRGaWxlTmFtZSkpOworICAgICAgICB9CiAgICAgICAgIC8vc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChhZGRERCwgR0VORVJBVEVfREQsIG51bGwpOyBidWcgMjE1Mjg0IC0gc2VlIGVudGVyKCkKICAgICAgICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKICAgICAgICAgZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwpAQCAtMTAwLDE0ICsxMTQsMTUgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc291cmNlcyBleHRlbmRzIE5MUyB7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlRGVwbG95bWVudERlc2NyaXB0b3I7Ci0KKyAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVEZXBsb3ltZW50RGVzY3JpcHRvcldpdGhGaWxlTmFtZTsKIAogICAgICAgICBzdGF0aWMgewogICAgICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKEoyRUVNb2R1bGVGYWNldEluc3RhbGxQYWdlLmNsYXNzLmdldE5hbWUoKSwgUmVzb3VyY2VzLmNsYXNzKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCB2b2lkIGVudGVyKCkgeworICAgIEBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGVudGVyKCkgewogICAgIAlpZiAoaXNGaXJzdFRpbWVUb1BhZ2UoKSAmJiBhZGRERCAhPSBudWxsKQogICAgIAl7CiAgICAgCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGFkZERELCBHRU5FUkFURV9ERCwgbnVsbCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMKaW5kZXggYTMwYjhlOC4uMzIxZDFkYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFTW9kdWxlRmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcwpAQCAtMSArMSwyIEBACi1nZW5lcmF0ZURlcGxveW1lbnREZXNjcmlwdG9yID0gR2VuZXJhdGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCitnZW5lcmF0ZURlcGxveW1lbnREZXNjcmlwdG9yID0gJkdlbmVyYXRlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorZ2VuZXJhdGVEZXBsb3ltZW50RGVzY3JpcHRvcldpdGhGaWxlTmFtZSA9ICZHZW5lcmF0ZSB7MH0gZGVwbG95bWVudCBkZXNjcmlwdG9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVJbXBvcnRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVNb2R1bGVJbXBvcnRQYWdlLmphdmEKaW5kZXggODdmNDQzMC4uZGY4NTIxMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFTW9kdWxlSW1wb3J0UGFnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRU1vZHVsZUltcG9ydFBhZ2UuamF2YQpAQCAtNDcsNiArNDcsNyBAQAogCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewogCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKIAkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIGdldEluZm9wb3BJRCgpKTsKQEAgLTg0LDYgKzg1LDcgQEAKIAl9CiAKIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKIAkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLAogCQkJCQlJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwKQEAgLTkzLDYgKzk1LDcgQEAKIAkJCQkJSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuRkFDRVRfUlVOVElNRX07CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKIAkJc3VwZXIuZGlzcG9zZSgpOwogCQlpZiAoZWFyUGFuZWwgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlTmV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0UGFnZU5ldy5qYXZhCmluZGV4IDUwOTA0NjQuLjMyNTMxMTAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlTmV3LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VOZXcuamF2YQpAQCAtODgsNiArODgsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAogCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKQEAgLTEzMCw2ICsxMzEsNyBAQAogCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YSgobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSkpOwogCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CiAKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewogCQkJCWhhbmRsZUJyb3dzZUJ1dHRvblByZXNzZWQoKTsKIAkJCX0KQEAgLTE1OCw3ICsxNjAsNyBAQAogCQlsaW5rZWRQYXRoQ2hlY2tib3guc2V0VGV4dCgiICIpOyAvLyROT04tTkxTLTEkCiAJCWZpbmFsIFRleHQgbGlua2VkUGF0aFRleHQgPSBuZXcgVGV4dChjaGVja2JveEdyb3VwLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7CiAJCWxpbmtlZFBhdGhUZXh0LnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV81IikpOyAvLyROT04tTkxTLTEkCi0JCWxpbmtlZFBhdGhUZXh0LnNldEVuYWJsZWQoZ2V0RGF0YU1vZGVsKCkuaXNQcm9wZXJ0eUVuYWJsZWQoSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX0xJTktFRF9QQVRIX1ZBUklBQkxFKSk7CisJCWxpbmtlZFBhdGhUZXh0LnNldEVuYWJsZWQodHJ1ZSk7CiAJCQogCQlnZXREYXRhTW9kZWwoKS5hZGRMaXN0ZW5lcihuZXcgSURhdGFNb2RlbExpc3RlbmVyKCkgewogCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7CkBAIC0yNzUsNyArMjc3LDcgQEAKIAkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7CiAKIAkJc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX1NFTEVDVF9BTExfVVRJTF9CVVRUT04pKTsgLy8kTk9OLU5MUy0xJCA9ICJTZWxlY3QgQWxsIgorCQlzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX1NFTEVDVF9BTExfVVRJTF9CVVRUT04pKTsKIAkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKIAkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwogCQlnZC5oZWlnaHRIaW50ID0gMjI7CkBAIC0yODMsMTMgKzI4NSwxNCBAQAogCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7CiAJCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CiAJCQkJaGFuZGxlU2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpOwogCQkJfQogCQl9KTsKIAogCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX0RFU0VMRUNUX0FMTF9VVElMX0JVVFRPTikpOyAvLyROT04tTkxTLTEkID0gIkRlc2VsZWN0IEFsbCIKKwkJZGVzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5FQVJfSU1QT1JUX0RFU0VMRUNUX0FMTF9VVElMX0JVVFRPTikpOwogCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwogCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7CiAJCWdkLmhlaWdodEhpbnQgPSAyMjsKQEAgLTI5Nyw2ICszMDAsNyBAQAogCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKIAkJZGVzZWxlY3RBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CiAKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewogCQkJCWhhbmRsZURlc2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpOwogCQkJfQpAQCAtMzQwLDEwICszNDQsMTIgQEAKIAkJZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7CiAJCXJldHVybiBuZXcgU3RyaW5nW117SUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuVVRJTElUWV9KQVJfTElTVCwgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1ZFUldSSVRFX0lGX05FQ0VTU0FSWSwgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuTElOS0VEX1BBVEhfVkFSSUFCTEV9OwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVXaWRnZXRWYWx1ZXMoKSB7CiAKIAkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKQEAgLTM1OSw2ICszNjUsNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7CiAJCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7CiAJCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7CkBAIC0zOTAsNiArMzk3LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRGaWxlTmFtZXNTdG9yZUlEKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lc1N0b3JlSUQoKSB7CiAJCXJldHVybiAiVVRJTCI7Ly8kTk9OLU5MUy0xJAogCX0KQEAgLTM5OSwxMSArNDA3LDEzIEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUltcG9ydFBhZ2UjZ2V0RmlsZUltcG9ydExhYmVsKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVJbXBvcnRMYWJlbCgpIHsKIAkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfNyIpOyAvLyROT04tTkxTLTEkCiAJfQogCQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7CiAJfQogIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VOZXcuamF2YQppbmRleCA1OWQxMDQ1Li5iN2Y0M2Q0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VOZXcuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VOZXcuamF2YQpAQCAtMTEsOSArMTEsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogQ3JlYXRlZCBvbiBNYXkgMTMsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwogCkBAIC0zNiw2ICszMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRWFyVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CkBAIC01NCwxMyArNTIsMTAgQEAKIAogLyoqCiAgKiBAYXV0aG9yIG1kZWxkZXIKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCiAgKi8KIHB1YmxpYyBjbGFzcyBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlTmV3IGV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7CiAKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZCcm93c2VCdXR0b25MYWJlbCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkJST1dTRV9MQUJFTCk7IC8vJE5PTi1OTFMtMSQKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBkZWZCcm93c2VCdXR0b25MYWJlbCA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkJST1dTRV9MQUJFTCk7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1RFWFRfRklFTERfV0lEVEggPSAzMDU7CiAKQEAgLTEyNyw2ICsxMjIsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7CiAJCXJldHVybiBuZXcgU3RyaW5nW117SUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSwgSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9ST09UfTsKIAl9CkBAIC0xMzYsNiArMTMyLDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7CiAJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwogCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKQEAgLTI2MCw2ICsyNTcsNyBAQAogCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7CiAJCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CiAJCQkJaGFuZGxlUm9vdFByb2plY3RCcm93c2VCdXR0b25QcmVzc2VkKCk7CiAJCQl9CkBAIC0zMjQsNyArMzIyLDcgQEAKIAkJaW50IHNlbGVjdGVkUmVzb3VyY2VDb3VudCA9IHNlbGVjdGlvbnMuc2l6ZSgpOwogCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZUNvdW50ID09IDEpIHsKIAkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIHNlbGVjdGlvbnMuZ2V0KDApOwotCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QgKSB7CisJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCAmJiBFYXJVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KChJUHJvamVjdClyZXNvdXJjZSkpIHsKIAkJCQlyZXNvdXJjZU5hbWVDb21iby5zZXRUZXh0KHJlc291cmNlLmdldE5hbWUoKS50b1N0cmluZygpKTsKIAkJCX0KIAkJfQpAQCAtMzY4LDYgKzM2Niw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7CiAJCXJldHVybiBtb2RlbC52YWxpZGF0ZVByb3BlcnR5KElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUpLmlzT0soKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkTmV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkTmV3LmphdmEKaW5kZXggZDE2YTU3YS4uMDA0N2VmYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFVXRpbGl0eUphckltcG9ydFdpemFyZE5ldy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXcuamF2YQpAQCAtMTIsNyArMTIsNiBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5KMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUltcG9ydFdpemFyZDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuSVByb2R1Y3RDb25zdGFudHM7CkBAIC0yNiw3ICsyNSw3IEBACiAgKiB0aGUgRUFSIG1vZHVsZS4KICAqIDwvcD4KICAqLwotcHVibGljIGZpbmFsIGNsYXNzIEoyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkTmV3IGV4dGVuZHMgSjJFRUFydGlmYWN0SW1wb3J0V2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7CitwdWJsaWMgZmluYWwgY2xhc3MgSjJFRVV0aWxpdHlKYXJJbXBvcnRXaXphcmROZXcgZXh0ZW5kcyBKMkVFQXJ0aWZhY3RJbXBvcnRXaXphcmR7CiAKIAkvKioKIAkgKiA8cD4KQEAgLTc5LDE1ICs3OCwxOCBAQAogCSAqIDwvdWw+CiAJICogPC9wPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7CiAJCXRoaXMuYWRkUGFnZShuZXcgSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZU5ldyhnZXREYXRhTW9kZWwoKSwgSU1QT1JUX1RZUEUsIGdldFNlbGVjdGlvbigpKSk7CiAJCXRoaXMuYWRkUGFnZShuZXcgSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlTmV3KGdldERhdGFNb2RlbCgpLCBTRUxFQ1RfSkFSUykpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewogCQlyZXR1cm4gbmV3IEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCk7CiAJfQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgewogICAgICAgICByZXR1cm4gUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfVVRJTElUWSk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFV2l6YXJkTkxTLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL0oyRUVXaXphcmROTFMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGFmMDE1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9KMkVFV2l6YXJkTkxTLmphdmEKQEAgLTAsMCArMSwxNCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgSjJFRVdpemFyZE5MUyBleHRlbmRzIE5MUyB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBTdHJpbmcgSjJFRUV4cG9ydFBhZ2VfT3B0aW1pemVfZm9yX2Ffc3BlY2lmaWNfc2VydmVyX3J1bnRfOworCisJc3RhdGljIHsKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSjJFRVdpemFyZE5MUy5jbGFzcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL01pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL01pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODc4YzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9NaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsZVN5c3RlbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuQWRhcHRhYmxlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JSW1wb3J0U3RydWN0dXJlUHJvdmlkZXI7Ci0KLS8qKgotICogVGhlIDxjb2RlPk1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiBpcyBhIDxjb2RlPkZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiB0aGF0IGtub3dzIGlmCi0gKiBpdCBoYXMgYmVlbiBwb3B1bGF0ZWQgb3Igbm90LgotICovCi1jbGFzcyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBleHRlbmRzIEZpbGVTeXN0ZW1FbGVtZW50IHsKLQlwcml2YXRlIGJvb2xlYW4gcG9wdWxhdGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgcGFja2FnZUJhc2VEaXJOYW1lID0gbnVsbDsKLQotCi0JLyoqCi0JICogQ3JlYXRlIGEgPGNvZGU+TWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQ8L2NvZGU+IHdpdGggdGhlIHN1cHBsaWVkIG5hbWUgYW5kIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZWxlbWVudCB0aGlzIHJlcHJlc2VudHMKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgY29udGFpbmluZyBwYXJlbnQKLQkgKiBAcGFyYW0gaXNEaXJlY3RvcnkKLQkgKiAgICAgICAgICAgIGluZGljYXRlZCBpZiB0aGlzIGNvdWxkIGhhdmUgY2hpbGRyZW4gb3Igbm90Ci0JICovCi0JTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQoU3RyaW5nIG5hbWUsIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsZVN5c3RlbUVsZW1lbnQgcGFyZW50LCBib29sZWFuIGlzRGlyZWN0b3J5KSB7Ci0JCXN1cGVyKG5hbWUsIHBhcmVudCwgaXNEaXJlY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2VCYXNlRGlyTmFtZShTdHJpbmcgcykgewotCQlwYWNrYWdlQmFzZURpck5hbWUgPSBzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENoaWxkKEZpbGVTeXN0ZW1FbGVtZW50IGNoaWxkKSB7Ci0JCWlmIChjaGlsZC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlzdXBlci5hZGRDaGlsZChjaGlsZCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY2hpbGQuZ2V0RmlsZU5hbWVFeHRlbnNpb24oKS5lcXVhbHMoImNsYXNzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN1cGVyLmFkZENoaWxkKGNoaWxkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBmaWxlcyB0aGF0IGFyZSBpbW1lZGlhdGUgY2hpbGRyZW4uIFVzZSB0aGUgc3VwcGxpZWQgcHJvdmlkZXIgaWYgaXQKLQkgKiBuZWVkcyB0byBiZSBwb3B1bGF0ZWQuIG9mIHRoaXMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBBZGFwdGFibGVMaXN0IGdldEZpbGVzKElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlcikgewotCQlpZiAoIXBvcHVsYXRlZCkKLQkJCXBvcHVsYXRlKHByb3ZpZGVyKTsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0RmlsZXMoKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBmb2xkZXJzIHRoYXQgYXJlIGltbWVkaWF0ZSBjaGlsZHJlbi4gVXNlIHRoZSBzdXBwbGllZCBwcm92aWRlciBpZiBpdAotCSAqIG5lZWRzIHRvIGJlIHBvcHVsYXRlZC4gb2YgdGhpcyBmb2xkZXIuCi0JICovCi0JcHVibGljIEFkYXB0YWJsZUxpc3QgZ2V0Rm9sZGVycyhJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJaWYgKCFwb3B1bGF0ZWQpCi0JCQlwb3B1bGF0ZShwcm92aWRlcik7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEZvbGRlcnMoKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIG9yIG5vdCBwb3B1bGF0aW9uIGhhcyBoYXBwZW5lZCBmb3IgdGhlIHJlY2VpdmVyLgotCSAqLwotCWJvb2xlYW4gaXNQb3B1bGF0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLnBvcHVsYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBvciBub3QgcG9wdWxhdGlvbiBoYXMgbm90IGhhcHBlbmVkIGZvciB0aGUgcmVjZWl2ZXIuCi0JICovCi0JYm9vbGVhbiBub3RQb3B1bGF0ZWQoKSB7Ci0JCXJldHVybiAhdGhpcy5wb3B1bGF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGUgdGhlIGZpbGVzIGFuZCBmb2xkZXJzIG9mIHRoZSByZWNlaXZlciB1c2luZyB0aGUgc3VwcGxpZWMgc3RydWN0dXJlIHByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBwcm92aWRlcgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlKElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlcikgewotCi0JCU9iamVjdCBmaWxlU3lzdGVtT2JqZWN0ID0gZ2V0RmlsZVN5c3RlbU9iamVjdCgpOwotCi0JCUxpc3QgY2hpbGRyZW4gPSBwcm92aWRlci5nZXRDaGlsZHJlbihmaWxlU3lzdGVtT2JqZWN0KTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCUl0ZXJhdG9yIGNoaWxkcmVuRW51bSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjaGlsZHJlbkVudW0uaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBjaGlsZHJlbkVudW0ubmV4dCgpOwotCi0JCQlTdHJpbmcgZWxlbWVudExhYmVsID0gcHJvdmlkZXIuZ2V0TGFiZWwoY2hpbGQpOwotCQkJaWYgKGVsZW1lbnRMYWJlbC5lcXVhbHMocGFja2FnZUJhc2VEaXJOYW1lKSB8fCBwYWNrYWdlQmFzZURpck5hbWUgPT0gbnVsbCkgewotCQkJCS8vQ3JlYXRlIG9uZSBsZXZlbCBiZWxvdwotCi0JCQkJTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgcmVzdWx0ID0gbmV3IE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KGVsZW1lbnRMYWJlbCwgdGhpcywgcHJvdmlkZXIuaXNGb2xkZXIoY2hpbGQpKTsKLQkJCQlyZXN1bHQuc2V0RmlsZVN5c3RlbU9iamVjdChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQkJc2V0UG9wdWxhdGVkKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgd2hldGhlciBvciBub3QgcG9wdWxhdGlvbiBoYXMgaGFwcGVuZWQgZm9yIHRoZSByZWNlaXZlciB0byB0cnVlLgotCSAqLwotCXZvaWQgc2V0UG9wdWxhdGVkKCkgewotCQl0aGlzLnBvcHVsYXRlZCA9IHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SjJFRUNvbXBvbmVudFNlbGVjdGlvblBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SjJFRUNvbXBvbmVudFNlbGVjdGlvblBhZ2UuamF2YQppbmRleCA3Y2M4Y2RhLi5hY2NlYmYxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld0oyRUVDb21wb25lbnRTZWxlY3Rpb25QYWdlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdKMkVFQ29tcG9uZW50U2VsZWN0aW9uUGFnZS5qYXZhCkBAIC0xMSw5ICsxMSw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBDcmVhdGVkIG9uIE1hciAyMywgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwogCkBAIC05Miw3ICs4OSw4IEBACiAgICAgICogCiAgICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7CisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewogICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgQ1JFQVRFX0FQUENMSUVOVCwgQVBQQ0xJRU5UX0NPTVBPTkVOVF9OQU1FLCBDUkVBVEVfQ09OTkVDVE9SLCBDT05ORUNUT1JfQ09NUE9ORU5UX05BTUUsIENSRUFURV9FSkIsIEVKQl9DT01QT05FTlRfTkFNRSwgQ1JFQVRFX1dFQiwgV0VCX0NPTVBPTkVOVF9OQU1FLCBNT0RVTEVfTkFNRV9DT0xMSVNJT05TX1ZBTElEQVRJT04sIEVOQUJMRUQgfTsKICAgICB9CiAKQEAgLTEwMSw3ICs5OSw4IEBACiAgICAgICogCiAgICAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVXaXphcmRQYWdlI2NyZWF0ZVRvcExldmVsQ29tcG9zaXRlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKICAgICAgICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7CiAgICAgICAgIEdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKICAgICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwpAQCAtMjUxLDcgKzI1MCw4IEBACiAgICAgICogCiAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKKyAgICBAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKICAgICAgICAgaWYgKGV2dC53aWRnZXQgPT0gZGVmYXVsdE1vZHVsZXNCdXR0b24pCiAgICAgICAgICAgICBoYW5kbGVEZWZhdWx0TW9kdWxlc0J1dHRvblByZXNzZWQoKTsKICAgICAgICAgZWxzZSBpZiAoIWRlZmF1bHRNb2R1bGVzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7CkBAIC0zNTMsNyArMzUzLDggQEAKICAgICAgICAgICAgICAgICAgKiAKICAgICAgICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuR2VuZXJpY1dpemFyZE5vZGUjY3JlYXRlV2l6YXJkKCkKICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgSVdpemFyZCBjcmVhdGVXaXphcmQoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIElXaXphcmQgY3JlYXRlV2l6YXJkKCkgewogICAgICAgICAgICAgICAgIAlyZXR1cm4gY3JlYXRlQ2hpbGRXaXphcmQoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuYXBwY2xpZW50LkFwcENsaWVudFByb2plY3RXaXphcmQiLCBORVNURURfTU9ERUxfQ0xJRU5UKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CkBAIC0zNzIsNyArMzczLDggQEAKICAgICAgICAgICAgICAgICAgKiAKICAgICAgICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuR2VuZXJpY1dpemFyZE5vZGUjY3JlYXRlV2l6YXJkKCkKICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgSVdpemFyZCBjcmVhdGVXaXphcmQoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIElXaXphcmQgY3JlYXRlV2l6YXJkKCkgewogICAgICAgICAgICAgICAgIAlyZXR1cm4gY3JlYXRlQ2hpbGRXaXphcmQoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yUHJvamVjdFdpemFyZCIsIE5FU1RFRF9NT0RFTF9KQ0EpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKQEAgLTM5MSw3ICszOTMsOCBAQAogICAgICAgICAgICAgICAgICAqIAogICAgICAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLndpemFyZC5HZW5lcmljV2l6YXJkTm9kZSNjcmVhdGVXaXphcmQoKQogICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBJV2l6YXJkIGNyZWF0ZVdpemFyZCgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgSVdpemFyZCBjcmVhdGVXaXphcmQoKSB7CiAgICAgICAgICAgICAgICAgCXJldHVybiBjcmVhdGVDaGlsZFdpemFyZCgib3JnLmVjbGlwc2UuanN0LmVqYi51aS5wcm9qZWN0LmZhY2V0LkVqYlByb2plY3RXaXphcmQiLCBORVNURURfTU9ERUxfRUpCKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CkBAIC00MTAsNyArNDEzLDggQEAKICAgICAgICAgICAgICAgICAgKiAKICAgICAgICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuR2VuZXJpY1dpemFyZE5vZGUjY3JlYXRlV2l6YXJkKCkKICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgSVdpemFyZCBjcmVhdGVXaXphcmQoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisJCQkJcHJvdGVjdGVkIElXaXphcmQgY3JlYXRlV2l6YXJkKCkgewogICAgICAgICAgICAgICAgIAlyZXR1cm4gY3JlYXRlQ2hpbGRXaXphcmQoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQuV2ViUHJvamVjdFdpemFyZCIsIE5FU1RFRF9NT0RFTF9XRUIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKQEAgLTQ1Nyw3ICs0NjEsOCBAQAogICAgICAqIAogICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjY2FuRmxpcFRvTmV4dFBhZ2UoKQogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgeworICAgIEBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewogICAgICAgICBpZiAoIWRlZmF1bHRNb2R1bGVzQnV0dG9uLmdldFNlbGVjdGlvbigpKQogICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkTm9kZSAhPSBudWxsOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC00NjgsNyArNDczLDggQEAKICAgICAgKiA8Y29kZT5JV2l6YXJkUGFnZTwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGN1cnJlbnRseQogICAgICAqIHNlbGVjdGVkIHdpemFyZCBpZiB0aGVyZSBpcyBvbmUuCiAgICAgICovCi0gICAgcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgeworICAgIEBPdmVycmlkZQorCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKICAgICAgICAgaWYgKHNlbGVjdGVkTm9kZSA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIElQbHVnaW5Db250cmlidXRpb24gcGx1Z2luQ29udHJpYnV0aW9uID0gbmV3IElQbHVnaW5Db250cmlidXRpb24oKSB7CkBAIC01MTIsNyArNTE4LDggQEAKICAgICAgKiAKICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuSjJFRVdpemFyZFBhZ2UjdmFsaWRhdGVQYWdlKCkKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBhZ2UoKSB7CisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKCkgewogICAgICAgICBpZiAoIWRlZmF1bHRNb2R1bGVzQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7CiAgICAgICAgICAgICBzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwogICAgICAgICAgICAgc2V0RXJyb3JNZXNzYWdlKG51bGwpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdKYXZhQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9OZXdKYXZhQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhCmluZGV4IDM1ZWY1M2MuLmM2NGRkZDQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SmF2YUNsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld0phdmFDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEKQEAgLTg4LDYgKzg4LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7CiAJCXJldHVybiBuZXcgU3RyaW5nW117SU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuTU9ESUZJRVJfQUJTVFJBQ1QsIElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRElGSUVSX0ZJTkFMfTsKIAl9CkBAIC05Nyw2ICs5OCw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udXRpbC51aS53aXphcmQuV1RQV2l6YXJkUGFnZSNjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7CiAJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwogCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CkBAIC0yMzcsNiArMjM5LDcgQEAKIAkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChjb25zdHJ1Y3RvckJ1dHRvbiwgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ09OU1RSVUNUT1IsIG51bGwpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBlbnRlcigpIHsKIAkJc3VwZXIuZW50ZXIoKTsKIAkJLy9zZXQgdGhlIGludGVmYWNlcyBvbiBldmVyeSBwYWdlIGVudGVyIChub3Qgb25seSBvbiB2aWV3ZXIgY3JlYXRpb24pCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL05ld0phdmFDbGFzc1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SmF2YUNsYXNzV2l6YXJkUGFnZS5qYXZhCmluZGV4IGUxOTBhYzcuLjIzNjVjOTIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SmF2YUNsYXNzV2l6YXJkUGFnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvTmV3SmF2YUNsYXNzV2l6YXJkUGFnZS5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwpAQCAtNDYsNiArNDcsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKQEAgLTUzLDYgKzU2LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLlR5cGVTZWFyY2hFbmdpbmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CkBAIC0xMTcsNiArMTIxLDcgQEAKIAkvKioKIAkgKiAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7CiAJCXJldHVybiBuZXcgU3RyaW5nW117SUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCAKIAkJCQlJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgCkBAIC0xMjksNiArMTM0LDcgQEAKIAkvKioKIAkgKiAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7CiAJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKQEAgLTE0Nyw3ICsxNTMsMTUgQEAKIAkJYWRkQ2xhc3NuYW1lR3JvdXAoY29tcG9zaXRlKTsKIAkJYWRkU3VwZXJjbGFzc0dyb3VwKGNvbXBvc2l0ZSk7CiAKLQkJY2xhc3NUZXh0LnNldEZvY3VzKCk7CisJCS8vIHNldCB0aGUgY3Vyc29yIGZvY3VzCisJCS8vICAgLSB0byB0aGUgIkphdmEgcGFja2FnZSIgaWYgaXQgaXMgZW1wdHkKKwkJLy8gICAtIHRvIHRoZSAiQ2xhc3MgbmFtZSIgLSBvdGhlcndpc2UKKwkJaWYgKHBhY2thZ2VUZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworCQkJcGFja2FnZVRleHQuc2V0Rm9jdXMoKTsKKwkJfSBlbHNlIHsKKwkJCWNsYXNzVGV4dC5zZXRGb2N1cygpOworCQl9CisJCQogCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgZ2V0SW5mb3BvcElEKCkpOwogCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7CiAJCXJldHVybiBjb21wb3NpdGU7CkBAIC0xNTksNyArMTczLDcgQEAKIAlwcml2YXRlIHZvaWQgYWRkUHJvamVjdE5hbWVHcm91cChDb21wb3NpdGUgcGFyZW50KSB7CiAJCS8vIHNldCB1cCBwcm9qZWN0IG5hbWUgbGFiZWwKIAkJcHJvamVjdE5hbWVMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLk1PRFVMRVNfREVQRU5ERU5DWV9QQUdFX1RBQkxFX1BST0pFQ1QpKTsgLy8kTk9OLU5MUy0xJAorCQlwcm9qZWN0TmFtZUxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuTU9EVUxFU19ERVBFTkRFTkNZX1BBR0VfVEFCTEVfUFJPSkVDVCkpOyAKIAkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwogCQlwcm9qZWN0TmFtZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7CiAJCS8vIHNldCB1cCBwcm9qZWN0IG5hbWUgZW50cnkgZmllbGQKQEAgLTE2OSw2ICsxODMsNyBAQAogCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKIAkJcHJvamVjdE5hbWVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwogCQlwcm9qZWN0TmFtZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CiAJCQkJc3VwZXIud2lkZ2V0U2VsZWN0ZWQoZSk7CiAJCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZUNvbWJvLmdldFRleHQoKSk7CkBAIC0yMTYsNyArMjMxLDcgQEAKIAkJdHJ5IHsKIAkJCXJlc3VsdCA9IHByb2plY3QuaXNBY2Nlc3NpYmxlKCkgJiYgCiAJCQkJcHJvamVjdC5oYXNOYXR1cmUoSU1vZHVsZUNvbnN0YW50cy5NT0RVTEVfTkFUVVJFX0lEKSAmJiAKLQkJCSAJSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RUeXBlKHByb2plY3QpLmVxdWFscyhwcm9qZWN0VHlwZSk7CisJCQkgCUphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RUeXBlKHByb2plY3QpLmVxdWFscyhwcm9qZWN0VHlwZSk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKIAkJCXJlc3VsdCA9IGZhbHNlOwogCQl9CkBAIC0yNDcsNyArMjYyLDcgQEAKIAkJCQlpZiAocHJvamVjdE5hbWVGcm9tTW9kZWwhPW51bGwgJiYgcHJvamVjdE5hbWVGcm9tTW9kZWwubGVuZ3RoKCk+MCkKIAkJCQkJc2VsZWN0ZWRQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lRnJvbU1vZGVsKTsKIAkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9OworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkge30KIAkJdHJ5IHsKIAkJCWlmIChzZWxlY3RlZFByb2plY3QgPT0gbnVsbCkKIAkJCQlzZWxlY3RlZFByb2plY3QgPSBnZXRTZWxlY3RlZFByb2plY3QoKTsKQEAgLTI5OCw3ICszMTMsNyBAQAogCQl9CiAJCQogCQlmb2xkZXJCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlmb2xkZXJCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5CUk9XU0VfQlVUVE9OX0xBQkVMKTsKKwkJZm9sZGVyQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuQlJPV1NFX0JVVFRPTl9MQUJFTF9PKTsKIAkJZm9sZGVyQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwogCQlmb2xkZXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewogCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewpAQCAtMzM1LDcgKzM1MCw3IEBACiAJCX0KIAogCQlwYWNrYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJcGFja2FnZUJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkJST1dTRV9CVVRUT05fTEFCRUwpOworCQlwYWNrYWdlQnV0dG9uLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuQlJPV1NFX0JVVFRPTl9MQUJFTF9XKTsKIAkJcGFja2FnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKIAkJcGFja2FnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CiAJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CkBAIC00MDQsNyArNDE5LDcgQEAKIAkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHN1cGVyVGV4dCwgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU1VQRVJDTEFTUywgbnVsbCk7CiAKIAkJc3VwZXJCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlzdXBlckJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkJST1dTRV9CVVRUT05fTEFCRUwpOworCQlzdXBlckJ1dHRvbi5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLkJST1dTRV9CVVRUT05fTEFCRUxfRSk7CiAJCXN1cGVyQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwogCQlzdXBlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7CiAJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CkBAIC01MzUsNiArNTUwLDcgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgVmlld2VyRmlsdGVyIGdldENvbnRhaW5lckRpYWxvZ1ZpZXdlckZpbHRlcigpIHsKIAkJcmV0dXJuIG5ldyBWaWV3ZXJGaWx0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewogCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpIHsKIAkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKQEAgLTU2OCwxMyArNTg0LDIzIEBACiAJCQlyZXR1cm4gbnVsbDsKIAkJaWYgKCEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKSAKIAkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJaWYgKHN0dWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHN0dWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7CiAJCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZ2V0SW5pdGlhbEphdmFFbGVtZW50KHNlbGVjdGlvbik7CiAJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5nZXRKYXZhUHJvamVjdCgpICE9IG51bGwpCiAJCQlyZXR1cm4gZWxlbWVudC5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJcmV0dXJuIGdldEV4dGVuZGVkU2VsZWN0ZWRQcm9qZWN0KHN0dWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7CisJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0dWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOworCQlpZiAoc3R1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgRU9iamVjdCkKKwkJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc3R1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKKwkJSVByb2plY3QgcHJvamVjdCA9IGdldEV4dGVuZGVkU2VsZWN0ZWRQcm9qZWN0KHN0dWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7CisJCWlmKHByb2plY3QgIT0gbnVsbCkgeworCQkJcmV0dXJuIHByb2plY3Q7CisJCX0KKwkJaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgVHJlZVNlbGVjdGlvbiAmJiAoKChUcmVlU2VsZWN0aW9uKXNlbGVjdGlvbikuZ2V0UGF0aHMoKS5sZW5ndGggPiAwKSl7CisJCQlUcmVlUGF0aCBwYXRoID0gKCgoVHJlZVNlbGVjdGlvbilzZWxlY3Rpb24pLmdldFBhdGhzKClbMF0pOworCQkJaWYocGF0aC5nZXRTZWdtZW50Q291bnQoKSA+IDAgJiYgcGF0aC5nZXRTZWdtZW50KDApIGluc3RhbmNlb2YgSVByb2plY3QpIHsKKwkJCQlyZXR1cm4gKElQcm9qZWN0KSBwYXRoLmdldFNlZ21lbnQoMCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CiAJfQogCQogCXByb3RlY3RlZCBJUHJvamVjdCBnZXRFeHRlbmRlZFNlbGVjdGVkUHJvamVjdChPYmplY3Qgc2VsZWN0aW9uKSB7CkBAIC02MzcsMjAgKzY2MywxNiBAQAogCQlJSmF2YUVsZW1lbnQgamVsZW0gPSBudWxsOwogCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKIAkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCQlJQWRhcHRhYmxlIGFkYXB0YWJsZSA9IChJQWRhcHRhYmxlKSBzZWxlY3RlZEVsZW1lbnQ7Ci0KLQkJCQlqZWxlbSA9IChJSmF2YUVsZW1lbnQpIGFkYXB0YWJsZS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcyk7Ci0JCQkJaWYgKGplbGVtID09IG51bGwpIHsKLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgYWRhcHRhYmxlLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5ST09UKSB7Ci0JCQkJCQl3aGlsZSAoamVsZW0gPT0gbnVsbCAmJiByZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCQlyZXNvdXJjZSA9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQkJCQkJCWplbGVtID0gKElKYXZhRWxlbWVudCkgcmVzb3VyY2UuZ2V0QWRhcHRlcihJSmF2YUVsZW1lbnQuY2xhc3MpOwotCQkJCQkJfQotCQkJCQkJaWYgKGplbGVtID09IG51bGwpIHsKLQkJCQkJCQlqZWxlbSA9IEphdmFDb3JlLmNyZWF0ZShyZXNvdXJjZSk7IC8vIGphdmEgcHJvamVjdAotCQkJCQkJfQorCQkJamVsZW0gPSBnZXRKYXZhRWxlbWVudChzZWxlY3RlZEVsZW1lbnQpOworCQkJaWYgKGplbGVtID09IG51bGwpIHsKKwkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShzZWxlY3RlZEVsZW1lbnQpOworCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUk9PVCkgeworCQkJCQl3aGlsZSAoamVsZW0gPT0gbnVsbCAmJiByZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpIHsKKwkJCQkJCXJlc291cmNlID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7CisJCQkJCQlqZWxlbSA9IChJSmF2YUVsZW1lbnQpIHJlc291cmNlLmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKTsKKwkJCQkJfQorCQkJCQlpZiAoamVsZW0gPT0gbnVsbCkgeworCQkJCQkJamVsZW0gPSBKYXZhQ29yZS5jcmVhdGUocmVzb3VyY2UpOyAvLyBqYXZhIHByb2plY3QKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTY5Nyw0ICs3MTksMzAgQEAKIAl7CiAJCS8vIG5vdGhpbmcgdG8gZG8gaW4gbW9zdCBjYXNlcwogCX0KKwkKKwlwcm90ZWN0ZWQgSUphdmFFbGVtZW50IGdldEphdmFFbGVtZW50KE9iamVjdCBvYmopIHsKKwkJaWYgKG9iaiA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCQorCQlpZiAob2JqIGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSAKKwkJCXJldHVybiAoSUphdmFFbGVtZW50KSBvYmo7CisJCQorCQlpZiAob2JqIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgCisJCQlyZXR1cm4gKElKYXZhRWxlbWVudCkgKChJQWRhcHRhYmxlKSBvYmopLmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKTsKKwkJCQorCQlyZXR1cm4gKElKYXZhRWxlbWVudCkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKG9iaiwgSUphdmFFbGVtZW50LmNsYXNzKTsKKwl9CisJCisJcHJvdGVjdGVkIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3Qgb2JqKSB7CisJCWlmIChvYmogPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQkKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgCisJCQlyZXR1cm4gKElSZXNvdXJjZSkgb2JqOworCQkKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIElBZGFwdGFibGUpIAorCQkJcmV0dXJuIChJUmVzb3VyY2UpICgoSUFkYXB0YWJsZSkgb2JqKS5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7CisJCQkKKwkJcmV0dXJuIChJUmVzb3VyY2UpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihvYmosIElSZXNvdXJjZS5jbGFzcyk7CisJfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9QYWNrYWdlTmFtZVJlc29sdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1BhY2thZ2VOYW1lUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlYzE3OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1BhY2thZ2VOYW1lUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci0KLS8qKgotICogQGF1dGhvciBTYWNoaW4KLSAqIAotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZWRpdCB0aGUgdGVtcGxhdGUgdmFyaWFibGUgInR5cGVjb21tZW50IjoKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPlRlbXBsYXRlcy4gVG8gZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiB0eXBlIGNvbW1lbnRzIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlTmFtZVJlc29sdmVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgewotCi0JcHVibGljIFBhY2thZ2VOYW1lUmVzb2x2ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoZmluYWwgU3RyaW5nIGNsYXNzRmlsZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShjbGFzc0ZpbGUpOwotCQlieXRlW10gY2xhc3NidWYgPSBuZXcgYnl0ZVsoaW50KSBmaWxlLmxlbmd0aCgpXTsKLQkJdHJ5IHsKLQkJCUZpbGVJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQlpbnN0cmVhbS5yZWFkKGNsYXNzYnVmKTsKLQkJCWluc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlib29sZWFuIGJhZGNsYXNzbmFtZSA9IHRydWU7Ci0JCVN0cmluZyBjbGFzc25hbWUgPSBjbGFzc0ZpbGUucmVwbGFjZShqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKTsKLQkJaW50IGVuZGk7Ci0JCWlmIChjbGFzc25hbWUuZW5kc1dpdGgoIi5jbGFzcyIpKSAvLyROT04tTkxTLTEkCi0JCQllbmRpID0gY2xhc3NuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWVsc2UKLQkJCWVuZGkgPSBjbGFzc25hbWUubGVuZ3RoKCk7Ci0JCWludCBpID0gY2xhc3NuYW1lLmluZGV4T2YoJy4nKTsKLQkJd2hpbGUgKGkgPCBlbmRpICYmIGJhZGNsYXNzbmFtZSA9PSB0cnVlKSB7Ci0JCQliYWRjbGFzc25hbWUgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJZGVmaW5lQ2xhc3MoY2xhc3NuYW1lLnN1YnN0cmluZyhpICsgMSwgZW5kaSksIGNsYXNzYnVmLCAwLCBjbGFzc2J1Zi5sZW5ndGgpOwotCQkJfSBjYXRjaCAoamF2YS5sYW5nLk5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJaWYgKG1zZyA9PSBudWxsIHx8IG1zZy5pbmRleE9mKCcgJykgPiAwKSB7Ci0JCQkJCWJhZGNsYXNzbmFtZSA9IHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQliYWRjbGFzc25hbWUgPSB0cnVlOwotCQkJfQotCQkJaWYgKGJhZGNsYXNzbmFtZSkgewotCQkJCWkgPSBjbGFzc25hbWUuaW5kZXhPZignLicsIGkgKyAxKTsKLQkJCQlpZiAoaSA9PSAtMSkKLQkJCQkJaSA9IGVuZGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhZGNsYXNzbmFtZSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY2xhc3NuYW1lLnN1YnN0cmluZyhpICsgMSwgZW5kaSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9TdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbi5qYXZhCmluZGV4IDZlOTg4MjYuLmExMjRjOTAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1N0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uLmphdmEKQEAgLTk5LDkgKzk5LDggQEAKIAkJCVN0cmluZ1tdIGFycmF5ID0gKFN0cmluZ1tdKSBlbGVtZW50OwogCQkJaWYgKGFycmF5Lmxlbmd0aCA+IDApIHsKIAkJCQlyZXR1cm4gYXJyYXlbMF07Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwogCQkJfQorCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7CiAJCX0KIAl9CiAKQEAgLTEyMSw2ICsxMjAsNyBAQAogCQkvKioKIAkJICogQ01QRmllbGREaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KIAkJICovCisJCUBPdmVycmlkZQogCQlwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAogCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKQEAgLTE1Myw2ICsxNTMsNyBAQAogCQkJcmV0dXJuIGNvbXBvc2l0ZTsKIAkJfQogCQkKKwkJQE92ZXJyaWRlCiAJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKIAkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwogCQkJCkBAIC0xNjUsNiArMTY2LDcgQEAKIAkJCXJldHVybiBjb21wb3NpdGU7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewogCQkJc3RyaW5nQXJyYXkgPSBjYWxsYmFjay5yZXRyaWV2ZVJlc3VsdFN0cmluZ3ModGV4dHMpOwogCQkJc3VwZXIub2tQcmVzc2VkKCk7CkBAIC0xOTUsNiArMTk3LDcgQEAKIAkJLyoqCiAJCSAqIENNUEZpZWxkRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCiAJCSAqLworCQlAT3ZlcnJpZGUKIAkJcHVibGljIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CiAKIAkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CkBAIC0zODksNyArMzkyLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7CiAgICAgICAgICAgICB0aGlzLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKwkJCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewogICAgICAgICAgICAgICAgICAgICBUYWJsZSB0YWJsZSA9IHZpZXdlci5nZXRUYWJsZSgpOwogICAgICAgICAgICAgICAgICAgICBUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7CiAgICAgICAgICAgICAgICAgICAgIFBvaW50IGJ1dHRvbkFyZWEgPSBidXR0b25Db21wby5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwpAQCAtNDIyLDEzICs0MjYsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBwcml2YXRlIGludCBzZXRDb2x1bW50V2lkdGgoaW50IHdpZHRoLCBUYWJsZUNvbHVtbltdIGNvbHVtbnMsIGludCBjb25zdW1lV2lkdGgsIGludCBpKSB7CisgICAgICAgICAgICAgICAgCWludCBsb2NhbENvbnN1bWVXaWR0aCA9IGNvbnN1bWVXaWR0aDsgCiAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgY29sdW1ucy5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW2ldLnNldFdpZHRoKHdpZHRoIC8gY29sdW1ucy5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZVdpZHRoICs9IGNvbHVtbnNbaV0uZ2V0V2lkdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsQ29uc3VtZVdpZHRoICs9IGNvbHVtbnNbaV0uZ2V0V2lkdGgoKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbaV0uc2V0V2lkdGgod2lkdGggLSBjb25zdW1lV2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tpXS5zZXRXaWR0aCh3aWR0aCAtIGxvY2FsQ29uc3VtZVdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3VtZVdpZHRoOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxDb25zdW1lV2lkdGg7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvV2l6YXJkQ2xhc3Nlc0ltcG9ydE1haW5QYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2l6YXJkL1dpemFyZENsYXNzZXNJbXBvcnRNYWluUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzVmMDEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvV2l6YXJkQ2xhc3Nlc0ltcG9ydE1haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIE1heSAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFNhY2hpbgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZQotICogR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2l6YXJkQ2xhc3Nlc0ltcG9ydE1haW5QYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0JQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBCdXR0b24gaW1wb3J0RnJvbURpcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGltcG9ydEZyb21aaXA7Ci0KLQlwcml2YXRlIExpc3QgZHJhZ0FuZERyb3BGaWxlTmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIFdpemFyZENsYXNzZXNJbXBvcnRNYWluUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGF0YVRyYW5zZmVyLmZpbGVTeXN0ZW1UaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRmlsZUltcG9ydC5pbXBvcnRGaWxlU3lzdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiaW1wb3J0X2NsYXNzX2ZpbGVfd2l6X2JhbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBXaXphcmRDbGFzc2VzSW1wb3J0TWFpblBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBMaXN0IGZpbGVOYW1lcykgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEYXRhVHJhbnNmZXIuZmlsZVN5c3RlbVRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJGaWxlSW1wb3J0LmltcG9ydEZpbGVTeXN0ZW0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJpbXBvcnRfY2xhc3NfZmlsZV93aXpfYmFuIikpOyAvLyROT04tTkxTLTEkCi0JCWRyYWdBbmREcm9wRmlsZU5hbWVzID0gZmlsZU5hbWVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsIElKMkVFVUlDb250ZXh0SWRzLklNUE9SVF9DTEFTU19XSVpBUkRfUDEpOwotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQkJQ29tcG9zaXRlIGFDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlhQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWFDb21wb3NpdGUuc2V0U2l6ZShhQ29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkpOwotCQlhQ29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCWNyZWF0ZUltcG9ydFR5cGVHcm91cChhQ29tcG9zaXRlKTsKLQkJc2V0Q29udHJvbChhQ29tcG9zaXRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVJbXBvcnRUeXBlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgaW1wb3J0VHlwZUdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbXBvcnRUeXBlR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWltcG9ydFR5cGVHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJLy9pbXBvcnRUeXBlR3JvdXAuc2V0VGV4dChXb3JrYmVuY2hNZXNzYWdlcy5nZXRTdHJpbmcoIldpemFyZEV4cG9ydFBhZ2Uub3B0aW9ucyIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCi0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVdpemFyZCB3aXogPSBnZXRXaXphcmQoKTsKLQkJCQlpZiAoKChDbGFzc2VzSW1wb3J0V2l6YXJkKSB3aXopLnBhZ2UxICE9IG51bGwpIHsKLQkJCQkJKChDbGFzc2VzSW1wb3J0V2l6YXJkKSB3aXopLnBhZ2UxLmJsYW5rUGFnZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJaW1wb3J0RnJvbURpciA9IG5ldyBCdXR0b24oaW1wb3J0VHlwZUdyb3VwLCBTV1QuUkFESU8pOwotCQlpbXBvcnRGcm9tRGlyLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkNsYXNzZXNJbXBvcnQuZnJvbURpciIpKTsgLy8kTk9OLU5MUy0xJAotCQlpbXBvcnRGcm9tRGlyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQlpbXBvcnRGcm9tWmlwID0gbmV3IEJ1dHRvbihpbXBvcnRUeXBlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCWltcG9ydEZyb21aaXAuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiQ2xhc3Nlc0ltcG9ydC5mcm9tWmlwIikpOyAvLyROT04tTkxTLTEkCi0JCWltcG9ydEZyb21aaXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCUlXaXphcmQgd2l6ID0gZ2V0V2l6YXJkKCk7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0JCWlmICgoKENsYXNzZXNJbXBvcnRXaXphcmQpIHdpeikuZmlsZU5hbWVzICE9IG51bGwpCi0JCQlmaWxlTmFtZSA9ICgoQ2xhc3Nlc0ltcG9ydFdpemFyZCkgd2l6KS5maWxlTmFtZXMuZ2V0KDApLnRvU3RyaW5nKCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsICYmIChmaWxlTmFtZS5lbmRzV2l0aCgiLnppcCIpIHx8IGZpbGVOYW1lLmVuZHNXaXRoKCIuamFyIikpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaW1wb3J0RnJvbURpci5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJaW1wb3J0RnJvbVppcC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbXBvcnRGcm9tRGlyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWltcG9ydEZyb21aaXAuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzU2V0SW1wb3J0RnJvbURpcigpIHsKLQkJaWYgKGltcG9ydEZyb21EaXIgIT0gbnVsbCkKLQkJCXJldHVybiBpbXBvcnRGcm9tRGlyLmdldFNlbGVjdGlvbigpOwotCi0JCVN0cmluZyBmaWxlTmFtZSA9IGRyYWdBbmREcm9wRmlsZU5hbWVzLmdldCgwKS50b1N0cmluZygpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCAmJiAoZmlsZU5hbWUuZW5kc1dpdGgoIi56aXAiKSB8fCBmaWxlTmFtZS5lbmRzV2l0aCgiLmphciIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9XaXphcmRDbGFzc2VzSW1wb3J0UGFnZTEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvV2l6YXJkQ2xhc3Nlc0ltcG9ydFBhZ2UxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NjVkYjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9XaXphcmRDbGFzc2VzSW1wb3J0UGFnZTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuSUoyRUVVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5GaWxlU3lzdGVtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZFJlc291cmNlSW1wb3J0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuZGlhbG9ncy5JRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLklJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5JbXBvcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyOwotCi0KLS8qKgotICogUGFnZSAxIG9mIHRoZSBiYXNlIHJlc291cmNlIGltcG9ydC1mcm9tLWZpbGUtc3lzdGVtIFdpemFyZAotICovCi0vKiBwYWNrYWdlICovCi1jbGFzcyBXaXphcmRDbGFzc2VzSW1wb3J0UGFnZTEgZXh0ZW5kcyBXaXphcmRSZXNvdXJjZUltcG9ydFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQkvLyB3aWRnZXRzCi0JcHJvdGVjdGVkIENvbWJvIHNvdXJjZU5hbWVGaWVsZDsKLQlwcm90ZWN0ZWQgQnV0dG9uIG92ZXJ3cml0ZUV4aXN0aW5nUmVzb3VyY2VzQ2hlY2tib3g7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVDb250YWluZXJTdHJ1Y3R1cmVCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVPbmx5U2VsZWN0ZWRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzb3VyY2VCcm93c2VCdXR0b247Ci0JLy9wcm90ZWN0ZWQgQnV0dG9uIHNlbGVjdFR5cGVzQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gc2VsZWN0QWxsQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0JLy9BIGJvb2xlYW4gdG8gaW5kaWNhdGUgaWYgdGhlIHVzZXIgaGFzIHR5cGVkIGFueXRoaW5nCi0JcHJpdmF0ZSBib29sZWFuIGVudHJ5Q2hhbmdlZCA9IGZhbHNlOwotCi0JLy8gZGlhbG9nIHN0b3JlIGlkIGNvbnN0YW50cwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVE9SRV9TT1VSQ0VfTkFNRVNfSUQgPSAiV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlSW1wb3J0UGFnZTEuU1RPUkVfU09VUkNFX05BTUVTX0lEIjsgLy8kTk9OLU5MUy0xJAotCS8vJE5PTi1OTFMtMSQKLQkvL3ByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVE9SRV9PVkVSV1JJVEVfRVhJU1RJTkdfUkVTT1VSQ0VTX0lEID0KLQkvLyAiV2l6YXJkRmlsZVN5c3RlbVJlc291cmNlSW1wb3J0UGFnZTEuU1RPUkVfT1ZFUldSSVRFX0VYSVNUSU5HX1JFU09VUkNFU19JRCI7IC8vJE5PTi1OTFMtMSQKLQkvLyROT04tTkxTLTEkCi0JLy9wcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RPUkVfQ1JFQVRFX0NPTlRBSU5FUl9TVFJVQ1RVUkVfSUQgPQotCS8vICJXaXphcmRGaWxlU3lzdGVtUmVzb3VyY2VJbXBvcnRQYWdlMS5TVE9SRV9DUkVBVEVfQ09OVEFJTkVSX1NUUlVDVFVSRV9JRCI7IC8vJE5PTi1OTFMtMSQKLQkvLyROT04tTkxTLTEkCi0KLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfVFlQRVNfVElUTEUgPSAiRGF0YVRyYW5zZmVyLnNlbGVjdFR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQUxMX1RJVExFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRhdGFUcmFuc2Zlci5zZWxlY3RBbGwiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNFTEVDVF9BTExfVElUTEUgPSBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGF0YVRyYW5zZmVyLmRlc2VsZWN0QWxsIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1NPVVJDRV9NRVNTQUdFID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVJbXBvcnQuc2VsZWN0U291cmNlIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRU1QVFlfTUVTU0FHRSA9IEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJGaWxlSW1wb3J0LnNvdXJjZUVtcHR5Iik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVBhdGggaW1wb3J0ZWRDbGFzc2VzUGF0aDsKLQkvL3Byb3RlY3RlZCBCdXR0b24gaW1wb3J0RnJvbURpcjsKLQkvL3Byb3RlY3RlZCBCdXR0b24gaW1wb3J0RnJvbVppcDsKLQotCi0JcHJpdmF0ZSBaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXJDYWNoZTsKLQlaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgY3VycmVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfSU1QT1JUX01BU0sgPSAiKi5qYXI7Ki56aXAiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIExpc3QgZHJhZ0FuZERyb3BGaWxlTmFtZXMgPSBudWxsOwotCi0JYm9vbGVhbiBjcmVhdGVGdWxsU3RydWN0dXJlID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgcGFja2FnZUJhc2VEaXJOYW1lID0gbnVsbDsKLQotCS8vcHJpdmF0ZSBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCB0ZXN0ID0gbnVsbDsKLQotCS8vcHJpdmF0ZSBDb21wb3NpdGUgZHVtbXlQYXJlbnQgPSBudWxsOwotCi0JLy9wcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0laSU5HX1NFTEVDVElPTl9XSURHRVRfV0lEVEggPSA0MDA7Ci0JLy9wcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0laSU5HX1NFTEVDVElPTl9XSURHRVRfSEVJR0hUID0gMTUwOwotCi0JcHJpdmF0ZSBTdHJpbmcgcGFja2FnZURpclN0cnVjID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwotCSAqLwotCXByb3RlY3RlZCBXaXphcmRDbGFzc2VzSW1wb3J0UGFnZTEoU3RyaW5nIG5hbWUsIElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKG5hbWUsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCi0JICogCi0JICogQHBhcmFtIGFXb3JrYmVuY2gKLQkgKiAgICAgICAgICAgIElXb3JrYmVuY2gKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogICAgICAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBXaXphcmRDbGFzc2VzSW1wb3J0UGFnZTEoSVdvcmtiZW5jaCBhV29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24sIElQYXRoIGltcG9ydGVkQ2xhc3Nlc1BhdGgsIExpc3QgZmlsZU5hbWVzKSB7Ci0JCXRoaXMoImZpbGVTeXN0ZW1JbXBvcnRQYWdlMSIsIGFXb3JrYmVuY2gsIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkRhdGFUcmFuc2Zlci5maWxlU3lzdGVtVGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVJbXBvcnQuaW1wb3J0RmlsZVN5c3RlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImltcG9ydF9jbGFzc19maWxlX3dpel9iYW4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5pbXBvcnRlZENsYXNzZXNQYXRoID0gaW1wb3J0ZWRDbGFzc2VzUGF0aDsKLQkJaWYgKGZpbGVOYW1lcyAhPSBudWxsICYmIGZpbGVOYW1lcy5zaXplKCkgIT0gMCkgewotCQkJZHJhZ0FuZERyb3BGaWxlTmFtZXMgPSBmaWxlTmFtZXM7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBibGFua1BhZ2UoKSB7Ci0JCWlmICh0aGlzLnNlbGVjdGlvbkdyb3VwICE9IG51bGwpCi0JCQl0aGlzLnNlbGVjdGlvbkdyb3VwLnNldFJvb3QobnVsbCk7Ci0JCWlmIChzb3VyY2VOYW1lRmllbGQgIT0gbnVsbCkKLQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBidXR0b24gd2l0aCB0aGUgZ2l2ZW4gaWQuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPkRpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kIGNyZWF0ZXMgYSBzdGFuZGFyZCBwdXNoCi0JICogYnV0dG9uLCByZWdpc3RlcnMgZm9yIHNlbGVjdGlvbiBldmVudHMgaW5jbHVkaW5nIGJ1dHRvbiBwcmVzc2VzIGFuZCByZWdpc3RlcnMgZGVmYXVsdCBidXR0b25zCi0JICogd2l0aCBpdHMgc2hlbGwuIFRoZSBidXR0b24gaWQgaXMgc3RvcmVkIGFzIHRoZSBidXR0b25zIGNsaWVudCBkYXRhLiBOb3RlIHRoYXQgdGhlIHBhcmVudCdzCi0JICogbGF5b3V0IGlzIGFzc3VtZWQgdG8gYmUgYSBHcmlkTGF5b3V0IGFuZCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhpcyBsYXlvdXQgaXMgaW5jcmVtZW50ZWQuCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGJ1dHRvbiAoc2VlIDxjb2RlPklEaWFsb2dDb25zdGFudHMuKl9JRDwvY29kZT4gY29uc3RhbnRzIGZvcgotCSAqICAgICAgICAgICAgc3RhbmRhcmQgZGlhbG9nIGJ1dHRvbiBpZHMpCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICB0aGUgbGFiZWwgZnJvbSB0aGUgYnV0dG9uCi0JICogQHBhcmFtIGRlZmF1bHRCdXR0b24KLQkgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBidXR0b24gaXMgdG8gYmUgdGhlIGRlZmF1bHQgYnV0dG9uLCBhbmQKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBpbnQgaWQsIFN0cmluZyBsYWJlbCwgYm9vbGVhbiBkZWZhdWx0QnV0dG9uKSB7Ci0JCS8vIGluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGJ1dHRvbiBiYXIKLQkJKChHcmlkTGF5b3V0KSBwYXJlbnQuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMrKzsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQotCQlHcmlkRGF0YSBidXR0b25EYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkRhdGEpOwotCi0JCWJ1dHRvbi5zZXREYXRhKG5ldyBJbnRlZ2VyKGlkKSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQotCQlpZiAoZGVmYXVsdEJ1dHRvbikgewotCQkJU2hlbGwgc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLQkJCWlmIChzaGVsbCAhPSBudWxsKSB7Ci0JCQkJc2hlbGwuc2V0RGVmYXVsdEJ1dHRvbihidXR0b24pOwotCQkJfQotCQkJYnV0dG9uLnNldEZvY3VzKCk7Ci0JCX0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBidXR0b25zIGZvciBzZWxlY3Rpbmcgc3BlY2lmaWMgdHlwZXMgb3Igc2VsZWN0aW5nIGFsbCBvciBub25lIG9mIHRoZSBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjcmVhdGVCdXR0b25zR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyB0b3AgbGV2ZWwgZ3JvdXAKLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJLy8gdHlwZXMgZWRpdCBidXR0b24KLQkJLy8JCXNlbGVjdFR5cGVzQnV0dG9uID0gY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgSURpYWxvZ0NvbnN0YW50cy5TRUxFQ1RfVFlQRVNfSUQsCi0JCS8vIFNFTEVDVF9UWVBFU19USVRMRSwgZmFsc2UpOwotCi0JCVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkvLwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vCQkJCWhhbmRsZVR5cGVzRWRpdEJ1dHRvblByZXNzZWQoKTsKLQkJCS8vCQkJfQotCQl9OwotCQkvLwkJc2VsZWN0VHlwZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIElEaWFsb2dDb25zdGFudHMuU0VMRUNUX0FMTF9JRCwgU0VMRUNUX0FMTF9USVRMRSwgZmFsc2UpOwotCi0JCWxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0QWxsU2VsZWN0aW9ucyh0cnVlKTsKLQkJCX0KLQkJfTsKLQkJc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihidXR0b25Db21wb3NpdGUsIElEaWFsb2dDb25zdGFudHMuREVTRUxFQ1RfQUxMX0lELCBERVNFTEVDVF9BTExfVElUTEUsIGZhbHNlKTsKLQotCQlsaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldEFsbFNlbGVjdGlvbnMoZmFsc2UpOwotCQkJfQotCQl9OwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQl9Ci0KLQkvKioKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhbG9nUGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy9zdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSjJFRVVJQ29udGV4dElkcy5JTVBPUlRfQ0xBU1NfV0laQVJEX1AyKTsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCWNvbXBvc2l0ZS5zZXRTaXplKGNvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJLy9kdW1teVBhcmVudCA9IGNvbXBvc2l0ZTsKLQotCQljcmVhdGVTb3VyY2VHcm91cChjb21wb3NpdGUpOwotCi0JCS8vY3JlYXRlU3BhY2VyKGNvbXBvc2l0ZSk7Ci0KLQkJLy9jcmVhdGVQbGFpbkxhYmVsKGNvbXBvc2l0ZSwKLQkJLy8gV29ya2JlbmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJXaXphcmRJbXBvcnRQYWdlLmRlc3RpbmF0aW9uTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy9jcmVhdGVEZXN0aW5hdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJY3JlYXRlT3B0aW9uc0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJcmVzdG9yZVdpZGdldFZhbHVlcygpOwotCQl1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotCQlzZXRQYWdlQ29tcGxldGUoZGV0ZXJtaW5lUGFnZUNvbXBsZXRpb24oKSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCXZhbGlkYXRlU291cmNlR3JvdXAoKTsKLQkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAoZ2V0Q29udHJvbCgpLAotCQkvLyBJRGF0YVRyYW5zZmVySGVscENvbnRleHRJZHMuRklMRV9TWVNURU1fSU1QT1JUX1dJWkFSRF9QQUdFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPcHRpb25zR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgb3B0aW9uc0dyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlvcHRpb25zR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCW9wdGlvbnNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQotCQljcmVhdGVPcHRpb25zR3JvdXBCdXR0b25zKG9wdGlvbnNHcm91cCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGltcG9ydCBvcHRpb25zIHNwZWNpZmljYXRpb24gd2lkZ2V0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVPcHRpb25zR3JvdXBCdXR0b25zKENvbXBvc2l0ZSBvcHRpb25zR3JvdXApIHsKLQotCQkvLyBvdmVyd3JpdGUuLi4gY2hlY2tib3gKLQkJb3ZlcndyaXRlRXhpc3RpbmdSZXNvdXJjZXNDaGVja2JveCA9IG5ldyBCdXR0b24ob3B0aW9uc0dyb3VwLCBTV1QuQ0hFQ0spOwotCQlvdmVyd3JpdGVFeGlzdGluZ1Jlc291cmNlc0NoZWNrYm94LnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoIkZpbGVJbXBvcnQub3ZlcndyaXRlRXhpc3RpbmciKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NldEltcG9ydEZyb21EaXIoKSB7Ci0JCUNsYXNzZXNJbXBvcnRXaXphcmQgY2l3ID0gKENsYXNzZXNJbXBvcnRXaXphcmQpIGdldFdpemFyZCgpOwotCQlyZXR1cm4gY2l3Lm1haW5QYWdlLmlzU2V0SW1wb3J0RnJvbURpcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NGaWxlRGlyZWN0b3J5KFN0cmluZyBzKSB7Ci0JCWludCBpbmRleCA9IHMubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJcmV0dXJuIHMuc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBncm91cCBmb3IgY3JlYXRpbmcgdGhlIHJvb3QgZGlyZWN0b3J5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUm9vdERpcmVjdG9yeUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHNvdXJjZUNvbnRhaW5lckdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXNvdXJjZUNvbnRhaW5lckdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlzb3VyY2VDb250YWluZXJHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQotCQluZXcgTGFiZWwoc291cmNlQ29udGFpbmVyR3JvdXAsIFNXVC5OT05FKS5zZXRUZXh0KGdldFNvdXJjZUxhYmVsKCkpOwotCi0JCS8vIHNvdXJjZSBuYW1lIGVudHJ5IGZpZWxkCi0JCXNvdXJjZU5hbWVGaWVsZCA9IG5ldyBDb21ibyhzb3VyY2VDb250YWluZXJHcm91cCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBTSVpJTkdfVEVYVF9GSUVMRF9XSURUSDsKLQkJc291cmNlTmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJc2V0U291cmNlTmFtZUZpZWxkRm9yRHJhZ0FuZERyb3AoKTsKLQotCQlzb3VyY2VOYW1lRmllbGQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJc291cmNlTmFtZUZpZWxkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXVwZGF0ZUZyb21Tb3VyY2VGaWVsZCgpOwotCi0JCQl9Ci0JCX0pOwotCi0JCXNvdXJjZU5hbWVGaWVsZC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQkvKgotCQkJICogQHNlZSBLZXlMaXN0ZW5lci5rZXlQcmVzc2VkCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJCS8vSWYgdGhlcmUgaGFzIGJlZW4gYSBrZXkgcHJlc3NlZCB0aGVuIG1hcmsgYXMgZGlydHkKLQkJCQllbnRyeUNoYW5nZWQgPSB0cnVlOwotCi0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBAc2VlIEtleUxpc3RlbmVyLmtleVJlbGVhc2VkCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkvL2RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0KLQkJc291cmNlTmFtZUZpZWxkLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzTGlzdGVuZXIoKSB7Ci0JCQkvKgotCQkJICogQHNlZSBGb2N1c0xpc3RlbmVyLmZvY3VzR2FpbmVkKEZvY3VzRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCS8vRG8gbm90aGluZyB3aGVuIGdldHRpbmcgZm9jdXMKLQkJCQlpZiAoZHJhZ0FuZERyb3BGaWxlTmFtZXMgIT0gbnVsbCkgewotCQkJCQlzb3VyY2VOYW1lRmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCi0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBAc2VlIEZvY3VzTGlzdGVuZXIuZm9jdXNMb3N0KEZvY3VzRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQkvL0NsZWFyIHRoZSBmbGFnIHRvIHByZXZlbnQgY29uc3RhbnQgdXBkYXRlCi0JCQkJaWYgKGVudHJ5Q2hhbmdlZCkgewotCi0JCQkJCWVudHJ5Q2hhbmdlZCA9IGZhbHNlOwotCQkJCQl1cGRhdGVGcm9tU291cmNlRmllbGQoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gc291cmNlIGJyb3dzZSBidXR0b24KLQkJc291cmNlQnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihzb3VyY2VDb250YWluZXJHcm91cCwgU1dULlBVU0gpOwotCQlzb3VyY2VCcm93c2VCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZygiRGF0YVRyYW5zZmVyLmJyb3dzZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzb3VyY2VCcm93c2VCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCXNvdXJjZUJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQotCQlpZiAoZHJhZ0FuZERyb3BGaWxlTmFtZXMgIT0gbnVsbCkgewotCQkJc291cmNlQnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U291cmNlTmFtZUZpZWxkRm9yRHJhZ0FuZERyb3AoKSB7Ci0JCWlmIChkcmFnQW5kRHJvcEZpbGVOYW1lcyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSAoU3RyaW5nKSAoZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KDApKTsKLQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRUZXh0KGZpbGVOYW1lKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJCWlmIChmLmlzRmlsZSgpKSB7Ci0JCQkJaWYgKEltcG9ydFV0aWwuZ2V0RXh0ZW5zaW9uKGYpLmVxdWFscygiemlwIikgfHwgSW1wb3J0VXRpbC5nZXRFeHRlbnNpb24oZikuZXF1YWxzKCJqYXIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLy9pbXBvcnRGcm9tWmlwLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkJLy9pbXBvcnRGcm9tRGlyLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJfSBlbHNlIGlmIChJbXBvcnRVdGlsLmdldEV4dGVuc2lvbihmKS5lcXVhbHMoImNsYXNzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlzb3VyY2VOYW1lRmllbGQuc2V0VGV4dChnZXRDbGFzc0ZpbGVEaXJlY3RvcnkoZmlsZU5hbWUpKTsKLQotCQkJCQkvL2dldCBjb20uaWJtLmFiYy5DbGFzc05hbWUKLQkJCQkJUGFja2FnZU5hbWVSZXNvbHZlciBuYW1lUmVzb2x2ZXIgPSBuZXcgUGFja2FnZU5hbWVSZXNvbHZlcigpOwotCQkJCQlTdHJpbmcgcXVhbGlmaWVkQ2xhc3NOYW1lID0gbmFtZVJlc29sdmVyLmdldENsYXNzTmFtZShmaWxlTmFtZSk7Ci0JCQkJCWlmIChxdWFsaWZpZWRDbGFzc05hbWUgIT0gbnVsbCkgewotCi0JCQkJCQkvL2dldCBjb20KLQkJCQkJCWludCBpbmRleCA9IHF1YWxpZmllZENsYXNzTmFtZS5pbmRleE9mKCcuJyk7Ci0JCQkJCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCQkJCQlTdHJpbmcgdGV4dFRvU2V0ID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIDEgKyBmaWxlTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpKTsKLQkJCQkJCQlzb3VyY2VOYW1lRmllbGQuc2V0VGV4dCh0ZXh0VG9TZXQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBiYXNlRGlyID0gcXVhbGlmaWVkQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLQkJCQkJCS8vZ2V0IGNvbS5pYm0uYWJjCi0JCQkJCQlpbmRleCA9IHF1YWxpZmllZENsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcXVhbGlmaWVkQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCQkvL2dldCBjb20vaWJtL2FiYwotCQkJCQkJcGFja2FnZURpclN0cnVjID0gcGFja2FnZU5hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLQkJCQkJCS8vZ2V0IEM6XGNvbQotCQkJCQkJaW5kZXggPSBmaWxlTmFtZS5pbmRleE9mKGJhc2VEaXIpOwotCQkJCQkJLy9pZiBwYWNrYWdlRGlyU3R1YyBleGlzdHMgdGhlbiBzZXQgdGhlIHNvdXJjZURpciB0byBjb20sIGVsc2UKLQkJCQkJCS8vc2V0IHRoZSBkaXJlY3RvcnkgdG8gdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGNsYXNzCi0JCQkJCQlpZiAoZmlsZU5hbWUuaW5kZXhPZihwYWNrYWdlRGlyU3RydWMpICE9IC0xKSB7Ci0JCQkJCQkJaW50IGJhc2VEaXJMZW5ndGggPSBiYXNlRGlyLmxlbmd0aCgpOwotCQkJCQkJCVN0cmluZyB0ZXh0VG9TZXQgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXggKyBiYXNlRGlyTGVuZ3RoKTsKLQkJCQkJCQlpbmRleCA9IHBhY2thZ2VOYW1lLmluZGV4T2YoJy4nKTsKLQkJCQkJCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJCQkJCXBhY2thZ2VCYXNlRGlyTmFtZSA9IHBhY2thZ2VOYW1lOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcGFja2FnZUJhc2VEaXJOYW1lID0gcGFja2FnZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQkJCQkJCWYgPSBuZXcgRmlsZSh0ZXh0VG9TZXQpOwotCQkJCQkJCWlmIChmLmdldFBhcmVudCgpICE9IG51bGwpCi0JCQkJCQkJCWYgPSBuZXcgRmlsZShmLmdldFBhcmVudCgpKTsKLQkJCQkJCQl0ZXh0VG9TZXQgPSBmLmdldEFic29sdXRlUGF0aCgpOyAvL3dhbnQgdG8gc2V0IHRoZSByb290IGRpcmVjdG9yeSB0bwotCQkJCQkJCS8vIGNvbSdzIHBhcmVudAotCQkJCQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRUZXh0KHRleHRUb1NldCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcmVjZWl2ZXIgZnJvbSB0aGUgc291cmNlIG5hbWUgZmllbGQuCi0JICovCi0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRnJvbVNvdXJjZUZpZWxkKCkgewotCi0JCXNldFNvdXJjZU5hbWUoc291cmNlTmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JCS8vVXBkYXRlIGVuYWJsZW1lbnRzIHdoZW4gdGhpcyBpcyBzZWxlY3RlZAotCQl1cGRhdGVXaWRnZXRFbmFibGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSA8Y29kZT5GaWxlU3lzdGVtRWxlbWVudDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBmaWxlIHN5c3RlbSBvYmplY3QKLQkgKiBtZXJpdHMgb25lLiBUaGUgY3JpdGVyaWEgZm9yIHRoaXMgYXJlOiBBbHNvIGNyZWF0ZSB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHJvdGVjdGVkIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGNyZWF0ZVJvb3RFbGVtZW50KE9iamVjdCBmaWxlU3lzdGVtT2JqZWN0LCBJSW1wb3J0U3RydWN0dXJlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJYm9vbGVhbiBpc0NvbnRhaW5lciA9IHByb3ZpZGVyLmlzRm9sZGVyKGZpbGVTeXN0ZW1PYmplY3QpOwotCQlTdHJpbmcgZWxlbWVudExhYmVsID0gcHJvdmlkZXIuZ2V0TGFiZWwoZmlsZVN5c3RlbU9iamVjdCk7Ci0KLQkJLy8gVXNlIGFuIGVtcHR5IGxhYmVsIHNvIHRoYXQgZGlzcGxheSBvZiB0aGUgZWxlbWVudCdzIGZ1bGwgbmFtZQotCQkvLyBkb2Vzbid0IGluY2x1ZGUgYSBjb25mdXNpbmcgbGFiZWwKLQkJTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZHVtbXlQYXJlbnQgPSBuZXcgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQoIiIsIG51bGwsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWR1bW15UGFyZW50LnNldFBvcHVsYXRlZCgpOwotCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCByZXN1bHQgPSBuZXcgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQoZWxlbWVudExhYmVsLCBkdW1teVBhcmVudCwgaXNDb250YWluZXIpOwotCi0JCXJlc3VsdC5zZXRQYWNrYWdlQmFzZURpck5hbWUocGFja2FnZUJhc2VEaXJOYW1lKTsKLQkJcmVzdWx0LnNldEZpbGVTeXN0ZW1PYmplY3QoZmlsZVN5c3RlbU9iamVjdCk7Ci0KLQkJLy9HZXQgdGhlIGZpbGVzIGZvciB0aGUgZWxlbWVudCBzbyBhcyB0byBidWlsZCB0aGUgZmlyc3QgbGV2ZWwKLQkJcmVzdWx0LmdldEZpbGVzKHByb3ZpZGVyKTsKLQotCQlyZXR1cm4gZHVtbXlQYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBpbXBvcnQgc291cmNlIHNwZWNpZmljYXRpb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNvdXJjZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy9jcmVhdGVJbXBvcnRUeXBlR3JvdXAocGFyZW50KTsKLQkJY3JlYXRlUm9vdERpcmVjdG9yeUdyb3VwKHBhcmVudCk7Ci0JCWNyZWF0ZUZpbGVTZWxlY3Rpb25Hcm91cChwYXJlbnQpOwotCi0JCWNyZWF0ZUJ1dHRvbnNHcm91cChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBidXR0b24gZ3JvdXAuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlQnV0dG9uR3JvdXAoYm9vbGVhbiBlbmFibGUpIHsKLQkJLy8JCXNlbGVjdFR5cGVzQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc291cmNlIGN1cnJlbnRseSBleGlzdHMgYW5kIGlzIHZhbGlkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW5zdXJlU291cmNlSXNWYWxpZCgpIHsKLQkJaWYgKGlzU2V0SW1wb3J0RnJvbURpcigpKSB7Ci0JCQlpZiAoZ2V0U291cmNlRGlyZWN0b3J5KCkgIT0gbnVsbCAmJiBuZXcgRmlsZShnZXRTb3VyY2VEaXJlY3RvcnlOYW1lKCkpLmlzRGlyZWN0b3J5KCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlkaXNwbGF5RXJyb3JEaWFsb2coZ2V0U3RyaW5nKCJGaWxlSW1wb3J0LmludmFsaWRTb3VyY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRGb2N1cygpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVppcEZpbGUgc3BlY2lmaWVkRmlsZSA9IGdldFNwZWNpZmllZFNvdXJjZUZpbGUoKTsKLQotCQlpZiAoc3BlY2lmaWVkRmlsZSA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5RXJyb3JEaWFsb2coZ2V0U3RyaW5nKCJGaWxlSW1wb3J0LmludmFsaWRTb3VyY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRGb2N1cygpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBjbG9zZVppcEZpbGUoc3BlY2lmaWVkRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgcGFzc2VkIGltcG9ydCBvcGVyYXRpb24uIEFuc3dlciBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVJbXBvcnRPcGVyYXRpb24oSW1wb3J0T3BlcmF0aW9uIG9wKSB7Ci0JCWluaXRpYWxpemVPcGVyYXRpb24ob3ApOwotCQlpZiAoY3JlYXRlRnVsbFN0cnVjdHVyZSkgewotCQkJb3Auc2V0Q3JlYXRlQ29udGFpbmVyU3RydWN0dXJlKHRydWUpOwotCQl9IGVsc2UgewotCQkJb3Auc2V0Q3JlYXRlQ29udGFpbmVyU3RydWN0dXJlKGZhbHNlKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJZGlzcGxheUVycm9yRGlhbG9nKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBvcC5nZXRTdGF0dXMoKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwgZ2V0U3RyaW5nKCJGaWxlSW1wb3J0LmltcG9ydFByb2JsZW1zIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW51bGwsIC8vIG5vIHNwZWNpYWwgbWVzc2FnZQotCQkJCQkJc3RhdHVzKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIG5lZWQgdGhlIGZvbGxvd2luZyBwcml2YXRlIHN0dWZmIGp1c3QgYmVjYXVzZSB0aGUgRGF0YVRyYW5zZmVyTWVzc2FnZXMgY2xhc3MgaXMgbm90IHB1YmxpYyEKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9CVU5ETEUgPSAib3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIubWVzc2FnZXMiOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkvL3ByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShSRVNPVVJDRV9CVU5ETEUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgRmluaXNoIGJ1dHRvbiB3YXMgcHJlc3NlZC4gVHJ5IHRvIGRvIHRoZSByZXF1aXJlZCB3b3JrIG5vdyBhbmQgYW5zd2VyIGEgYm9vbGVhbgotCSAqIGluZGljYXRpbmcgc3VjY2Vzcy4gSWYgZmFsc2UgaXMgcmV0dXJuZWQgdGhlbiB0aGUgd2l6YXJkIHdpbGwgbm90IGNsb3NlLgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpbmlzaCgpIHsKLQkJaWYgKCFlbnN1cmVTb3VyY2VJc1ZhbGlkKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJY2xlYXJQcm92aWRlckNhY2hlKCk7Ci0KLQkJc2F2ZVdpZGdldFZhbHVlcygpOwotCi0JCUl0ZXJhdG9yIHJlc291cmNlc0VudW0gPSBnZXRTZWxlY3RlZFJlc291cmNlcygpLml0ZXJhdG9yKCk7Ci0JCUxpc3QgZmlsZVN5c3RlbU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChyZXNvdXJjZXNFbnVtLmhhc05leHQoKSkgewotCQkJZmlsZVN5c3RlbU9iamVjdHMuYWRkKCgoRmlsZVN5c3RlbUVsZW1lbnQpIHJlc291cmNlc0VudW0ubmV4dCgpKS5nZXRGaWxlU3lzdGVtT2JqZWN0KCkpOwotCQl9Ci0KLQkJaWYgKGZpbGVTeXN0ZW1PYmplY3RzLnNpemUoKSA+IDApIHsKLQkJCWlmIChnZXRTb3VyY2VEaXJlY3RvcnkoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGltcG9ydFJlc291cmNlcyhmaWxlU3lzdGVtT2JqZWN0cyk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW1wb3J0UmVzb3VyY2VzRnJvbVppcChmaWxlU3lzdGVtT2JqZWN0cyk7Ci0JCX0KLQotCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLCBnZXRTdHJpbmcoIkRhdGFUcmFuc2Zlci5pbmZvcm1hdGlvbiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiRmlsZUltcG9ydC5ub25lU2VsZWN0ZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbnRlbnQgcHJvdmlkZXIgZm9yIDxjb2RlPkZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiBzIHRoYXQgcmV0dXJucyBvbmx5IGZpbGVzIGFzCi0JICogY2hpbGRyZW4uCi0JICovCi0KLQlwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0RmlsZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFdvcmtiZW5jaENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgbykgewotCQkJCWlmIChvIGluc3RhbmNlb2YgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIHsKLQkJCQkJTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZWxlbWVudCA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgbzsKLQkJCQkJaWYgKGN1cnJlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gZWxlbWVudC5nZXRGaWxlcyhjdXJyZW50UHJvdmlkZXIpLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBlbGVtZW50LmdldEZpbGVzKEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSkuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlPYmplY3RbXSBzdXBlck9iamVjdHMgPSBzdXBlci5nZXRFbGVtZW50cyhlbGVtZW50KTsKLQkJCQlpZiAoZHJhZ0FuZERyb3BGaWxlTmFtZXMgIT0gbnVsbCAmJiBnZXRTb3VyY2VEaXJlY3RvcnkoKSAhPSBudWxsKSB7Ci0JCQkJCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGFuRWxlbWVudCA9IG51bGw7Ci0JCQkJCWludCBuZXdPYmplY3RzSW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQkJYW5FbGVtZW50ID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSBzdXBlck9iamVjdHNbaV07Ci0KLQkJCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBhbkVsZW1lbnQuZ2V0RmlsZVN5c3RlbU9iamVjdCgpOwotCi0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGRyYWdBbmREcm9wRmlsZU5hbWVzLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJaWYgKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKGRyYWdBbmREcm9wRmlsZU5hbWVzLmdldChrKSkpIHsKLQkJCQkJCQkJbmV3T2JqZWN0c0luZGV4Kys7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChuZXdPYmplY3RzSW5kZXggPiAwKSB7Ci0JCQkJCQlPYmplY3RbXSBuZXdPYmplY3RzID0gbmV3IE9iamVjdFtuZXdPYmplY3RzSW5kZXhdOwotCQkJCQkJbmV3T2JqZWN0c0luZGV4ID0gMDsKLQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlck9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlhbkVsZW1lbnQgPSAoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIHN1cGVyT2JqZWN0c1tpXTsKLQotCQkJCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBhbkVsZW1lbnQuZ2V0RmlsZVN5c3RlbU9iamVjdCgpOwotCi0JCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBkcmFnQW5kRHJvcEZpbGVOYW1lcy5zaXplKCk7IGsrKykgewotCQkJCQkJCQlpZiAoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5lcXVhbHMoZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KGspKSkgewotCi0JCQkJCQkJCQluZXdPYmplY3RzW25ld09iamVjdHNJbmRleCsrXSA9IGFuRWxlbWVudDsKLQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbmV3T2JqZWN0czsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXJPYmplY3RzOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgcm9vdCBGaWxlU3lzdGVtRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50bHktc3BlY2lmaWVkCi0JICogc291cmNlLiBJZiB0aGlzIEZpbGVTeXN0ZW1FbGVtZW50IGlzIG5vdCBjdXJyZW50bHkgZGVmaW5lZCB0aGVuIGNyZWF0ZSBhbmQgcmV0dXJuIGl0LgotCSAqLwotCXByb3RlY3RlZCBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBnZXRGaWxlU3lzdGVtVHJlZSgpIHsKLQkJaWYgKGlzU2V0SW1wb3J0RnJvbURpcigpKSB7Ci0JCQlGaWxlIHNvdXJjZURpcmVjdG9yeSA9IGdldFNvdXJjZURpcmVjdG9yeSgpOwotCQkJaWYgKHNvdXJjZURpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHNlbGVjdEZpbGVzKHNvdXJjZURpcmVjdG9yeSwgRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLklOU1RBTkNFKTsKLQkJCX0KLQkJCWlmIChzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotCQkJCWRpc3BsYXlFcnJvckRpYWxvZyhnZXRTdHJpbmcoIkZpbGVJbXBvcnQuaW52YWxpZFNvdXJjZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNvdXJjZU5hbWVGaWVsZC5zZXRGb2N1cygpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJWmlwRmlsZSBzb3VyY2VGaWxlID0gZ2V0U3BlY2lmaWVkU291cmNlRmlsZSgpOwotCQlpZiAoc291cmNlRmlsZSA9PSBudWxsKSB7Ci0JCQkvL0NsZWFyIG91dCB0aGUgcHJvdmlkZXIgYXMgd2VsbAotCQkJdGhpcy5jdXJyZW50UHJvdmlkZXIgPSBudWxsOwotCQkJaWYgKHNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGlzcGxheUVycm9yRGlhbG9nKGdldFN0cmluZygiRmlsZUltcG9ydC5pbnZhbGlkU291cmNlIikpOyAvLyROT04tTkxTLTEkCi0JCQkJc291cmNlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlciBwcm92aWRlciA9IGdldFN0cnVjdHVyZVByb3ZpZGVyKHNvdXJjZUZpbGUpOwotCQl0aGlzLmN1cnJlbnRQcm92aWRlciA9IHByb3ZpZGVyOwotCQlyZXR1cm4gc2VsZWN0RmlsZXMocHJvdmlkZXIuZ2V0Um9vdCgpLCBwcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbnRlbnQgcHJvdmlkZXIgZm9yIDxjb2RlPkZpbGVTeXN0ZW1FbGVtZW50PC9jb2RlPiBzIHRoYXQgcmV0dXJucyBvbmx5IGZvbGRlcnMKLQkgKiBhcyBjaGlsZHJlbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSVRyZWVDb250ZW50UHJvdmlkZXIgZ2V0Rm9sZGVyUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgewotCQkJCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBlbGVtZW50ID0gKE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50KSBvOwotCQkJCQlpZiAoY3VycmVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBlbGVtZW50LmdldEZvbGRlcnMoY3VycmVudFByb3ZpZGVyKS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZWxlbWVudC5nZXRGb2xkZXJzKEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRSkuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgbykgewotCQkJCWlmIChvIGluc3RhbmNlb2YgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIHsKLQkJCQkJTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgZWxlbWVudCA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgbzsKLQkJCQkJaWYgKGVsZW1lbnQuaXNQb3B1bGF0ZWQoKSkKLQkJCQkJCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotCQkJCQkvL0lmIHdlIGhhdmUgbm90IHBvcHVsYXRlZCB0aGVuIHdhaXQgdW50aWwgYXNrZWQKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnRseS1uYW1lZCBzb3VyY2UgZGlyZWN0b3J5IGlmZiBpdCBleGlzdHMgYXMgYQotCSAqIHZhbGlkIGRpcmVjdG9yeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXByb3RlY3RlZCBGaWxlIGdldFNvdXJjZURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZURpcmVjdG9yeSh0aGlzLnNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBGaWxlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnRseS1uYW1lZCBzb3VyY2UgZGlyZWN0b3J5IGlmZiBpdCBleGlzdHMgYXMgYQotCSAqIHZhbGlkIGRpcmVjdG9yeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIFN0cmluZyBub3QgeWV0IGZvcm1hdHRlZCBmb3IgamF2YS5pby5GaWxlIGNvbXBhdGFiaWxpdHkKLQkgKi8KLQlwcml2YXRlIEZpbGUgZ2V0U291cmNlRGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7Ci0JCWlmIChpc1NldEltcG9ydEZyb21EaXIoKSkgewotCQkJRmlsZSBzb3VyY2VEaXJlY3RvcnkgPSBuZXcgRmlsZShnZXRTb3VyY2VEaXJlY3RvcnlOYW1lKHBhdGgpKTsKLQkJCWlmICghc291cmNlRGlyZWN0b3J5LmV4aXN0cygpIHx8ICFzb3VyY2VEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlyZXR1cm4gc291cmNlRGlyZWN0b3J5OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgZGlyZWN0b3J5IG5hbWUgc3BlY2lmaWVkIGFzIGJlaW5nIHRoZSBpbXBvcnQgc291cmNlLiBOb3RlIHRoYXQgaWYgaXQgZW5kcyB3aXRoIGEKLQkgKiBzZXBhcmF0b3IgdGhlbiB0aGUgc2VwYXJhdG9yIGlzIGZpcnN0IHJlbW92ZWQgc28gdGhhdCBqYXZhIHRyZWF0cyBpdCBhcyBhIHByb3BlciBkaXJlY3RvcnkKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTb3VyY2VEaXJlY3RvcnlOYW1lKCkgewotCQlyZXR1cm4gZ2V0U291cmNlRGlyZWN0b3J5TmFtZSh0aGlzLnNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIEFuc3dlciB0aGUgZGlyZWN0b3J5IG5hbWUgc3BlY2lmaWVkIGFzIGJlaW5nIHRoZSBpbXBvcnQgc291cmNlLiBOb3RlIHRoYXQgaWYgaXQgZW5kcyB3aXRoIGEKLQkgKiBzZXBhcmF0b3IgdGhlbiB0aGUgc2VwYXJhdG9yIGlzIGZpcnN0IHJlbW92ZWQgc28gdGhhdCBqYXZhIHRyZWF0cyBpdCBhcyBhIHByb3BlciBkaXJlY3RvcnkKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTb3VyY2VEaXJlY3RvcnlOYW1lKFN0cmluZyBzb3VyY2VOYW1lKSB7Ci0JCUlQYXRoIHJlc3VsdCA9IG5ldyBQYXRoKHNvdXJjZU5hbWUudHJpbSgpKTsKLQotCQlpZiAocmVzdWx0LmdldERldmljZSgpICE9IG51bGwgJiYgcmVzdWx0LnNlZ21lbnRDb3VudCgpID09IDApIC8vIHNvbWV0aGluZyBsaWtlICJjOiIKLQkJCXJlc3VsdCA9IHJlc3VsdC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQllbHNlCi0JCQlyZXN1bHQgPSByZXN1bHQucmVtb3ZlVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQotCQlyZXR1cm4gcmVzdWx0LnRvT1NTdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgdGhlIHN0cmluZyB0byBkaXNwbGF5IGFzIHRoZSBsYWJlbCBmb3IgdGhlIHNvdXJjZSBzcGVjaWZpY2F0aW9uIGZpZWxkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VMYWJlbCgpIHsKLQkJcmV0dXJuIEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKCJEYXRhVHJhbnNmZXIuZGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgYWxsIGV2ZW50cyBhbmQgZW5hYmxlbWVudHMgZm9yIHdpZGdldHMgaW4gdGhpcyBkaWFsb2cKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIEV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBzb3VyY2VCcm93c2VCdXR0b24pIHsKLQkJCWlmIChpc1NldEltcG9ydEZyb21EaXIoKSkgewotCQkJCWhhbmRsZVNvdXJjZUJyb3dzZUJ1dHRvblByZXNzZWQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaGFuZGxlU291cmNlQnJvd3NlQnV0dG9uUHJlc3NlZEZvclppcCgpOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIuaGFuZGxlRXZlbnQoZXZlbnQpOwotCi0JfQotCi0JLyoqCi0JICogT3BlbiBhbiBhcHByb3ByaWF0ZSBzb3VyY2UgYnJvd3NlciBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzcGVjaWZ5IGEgc291cmNlIHRvIGltcG9ydCBmcm9tCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU291cmNlQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsKLQkJU3RyaW5nIGN1cnJlbnRTb3VyY2UgPSB0aGlzLnNvdXJjZU5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNvdXJjZU5hbWVGaWVsZC5nZXRTaGVsbCgpLCBTV1QuU0FWRSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKFNFTEVDVF9TT1VSQ0VfTUVTU0FHRSk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGdldFNvdXJjZURpcmVjdG9yeU5hbWUoY3VycmVudFNvdXJjZSkpOwotCi0JCVN0cmluZyBzZWxlY3RlZERpcmVjdG9yeSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChzZWxlY3RlZERpcmVjdG9yeSAhPSBudWxsKSB7Ci0JCQkvL0p1c3QgcXVpdCBpZiB0aGUgZGlyZWN0b3J5IGlzIG5vdCB2YWxpZAotCQkJaWYgKChnZXRTb3VyY2VEaXJlY3Rvcnkoc2VsZWN0ZWREaXJlY3RvcnkpID09IG51bGwpIHx8IHNlbGVjdGVkRGlyZWN0b3J5LmVxdWFscyhjdXJyZW50U291cmNlKSkKLQkJCQlyZXR1cm47Ci0JCQkvL0lmIGl0IGlzIHZhbGlkIHRoZW4gcHJvY2VlZCB0byBwb3B1bGF0ZQotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJc2V0U291cmNlTmFtZShzZWxlY3RlZERpcmVjdG9yeSk7Ci0JCQlzZWxlY3Rpb25Hcm91cC5zZXRGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3BlbiBhIHJlZ2lzdGVyZWQgdHlwZSBzZWxlY3Rpb24gZGlhbG9nIGFuZCBub3RlIHRoZSBzZWxlY3Rpb25zIGluIHRoZSByZWNlaXZlcnMKLQkgKiB0eXBlcy10by1leHBvcnQgZmllbGQuLCBBZGRlZCBoZXJlIHNvIHRoYXQgaW5uZXIgY2xhc3NlcyBjYW4gaGF2ZSBhY2Nlc3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVUeXBlc0VkaXRCdXR0b25QcmVzc2VkKCkgewotCi0JCXN1cGVyLmhhbmRsZVR5cGVzRWRpdEJ1dHRvblByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBvcnQgdGhlIHJlc291cmNlcyB3aXRoIGV4dGVuc2lvbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0UmVzb3VyY2VzKExpc3QgZmlsZVN5c3RlbU9iamVjdHMpIHsKLQkJSXRlcmF0b3IgaSA9IGZpbGVTeXN0ZW1PYmplY3RzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJRmlsZSBmID0gKEZpbGUpIGkubmV4dCgpOwotCQkJTGlzdCBzaW5nbGVJdGVtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXNpbmdsZUl0ZW1MaXN0LmFkZChmKTsKLQkJCVN0cmluZyB0ZXh0VG9TZXQgPSBnZXRQYWNrYWdlTmFtZShmKTsKLQkJCWlmICh0ZXh0VG9TZXQgIT0gbnVsbCkgewotCQkJCUZpbGUgbmV3U291cmNlID0gbmV3IEZpbGUodGV4dFRvU2V0KTsKLQkJCQlleGVjdXRlSW1wb3J0T3BlcmF0aW9uKG5ldyBJbXBvcnRPcGVyYXRpb24oZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSwgbmV3U291cmNlLCBGaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXIuSU5TVEFOQ0UsIHRoaXMsIHNpbmdsZUl0ZW1MaXN0KSk7Ci0JCQl9IGVsc2UgewotCQkJCWV4ZWN1dGVJbXBvcnRPcGVyYXRpb24obmV3IEltcG9ydE9wZXJhdGlvbihnZXRDb250YWluZXJGdWxsUGF0aCgpLCBnZXRTb3VyY2VEaXJlY3RvcnkoKSwgRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLklOU1RBTkNFLCB0aGlzLCBzaW5nbGVJdGVtTGlzdCkpOwotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKEZpbGUgZikgewotCQlpZiAoSW1wb3J0VXRpbC5nZXRFeHRlbnNpb24oZikuZXF1YWxzKCJjbGFzcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkvL2dldCBjb20uaWJtLmFiYy5DbGFzc05hbWUKLQkJCVBhY2thZ2VOYW1lUmVzb2x2ZXIgbmFtZVJlc29sdmVyID0gbmV3IFBhY2thZ2VOYW1lUmVzb2x2ZXIoKTsKLQkJCVN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUgPSBuYW1lUmVzb2x2ZXIuZ2V0Q2xhc3NOYW1lKGZpbGVOYW1lKTsKLQkJCWlmIChxdWFsaWZpZWRDbGFzc05hbWUgIT0gbnVsbCkgewotCi0JCQkJLy9nZXQgY29tCi0JCQkJaW50IGluZGV4ID0gcXVhbGlmaWVkQ2xhc3NOYW1lLmluZGV4T2YoJy4nKTsKLQkJCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCQkJcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZygwLCAxICsgZmlsZU5hbWUubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCQkJfQotCQkJCVN0cmluZyBiYXNlRGlyID0gcXVhbGlmaWVkQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLQkJCQkvL2dldCBjb20uaWJtLmFiYwotCQkJCWluZGV4ID0gcXVhbGlmaWVkQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcXVhbGlmaWVkQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLQkJCQkvL2dldCBjb20vaWJtL2FiYwotCQkJCXBhY2thZ2VEaXJTdHJ1YyA9IHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0JCQkJLy9nZXQgQzpcY29tCi0JCQkJaW5kZXggPSBmaWxlTmFtZS5pbmRleE9mKGJhc2VEaXIpOwotCQkJCS8vaWYgcGFja2FnZURpclN0dWMgZXhpc3RzIHRoZW4gc2V0IHRoZSBzb3VyY2VEaXIgdG8gY29tLCBlbHNlCi0JCQkJLy9zZXQgdGhlIGRpcmVjdG9yeSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgY2xhc3MKLQkJCQlpZiAoZmlsZU5hbWUuaW5kZXhPZihwYWNrYWdlRGlyU3RydWMpICE9IC0xKSB7Ci0JCQkJCWludCBiYXNlRGlyTGVuZ3RoID0gYmFzZURpci5sZW5ndGgoKTsKLQkJCQkJU3RyaW5nIHRleHRUb1NldCA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCArIGJhc2VEaXJMZW5ndGgpOwotCQkJCQlpbmRleCA9IHBhY2thZ2VOYW1lLmluZGV4T2YoJy4nKTsKLQkJCQkJaWYgKGluZGV4ID09IC0xKQotCQkJCQkJcGFja2FnZUJhc2VEaXJOYW1lID0gcGFja2FnZU5hbWU7Ci0JCQkJCWVsc2UKLQkJCQkJCXBhY2thZ2VCYXNlRGlyTmFtZSA9IHBhY2thZ2VOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLQkJCQkJZiA9IG5ldyBGaWxlKHRleHRUb1NldCk7Ci0JCQkJCWlmIChmLmdldFBhcmVudCgpICE9IG51bGwpCi0JCQkJCQlmID0gbmV3IEZpbGUoZi5nZXRQYXJlbnQoKSk7Ci0JCQkJCXRleHRUb1NldCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7IC8vd2FudCB0byBzZXQgdGhlIHJvb3QgZGlyZWN0b3J5IHRvIGNvbSdzCi0JCQkJCS8vIHBhcmVudAotCQkJCQkvL3NvdXJjZU5hbWVGaWVsZC5zZXRUZXh0KHRleHRUb1NldCk7Ci0JCQkJCXJldHVybiB0ZXh0VG9TZXQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9wZXJhdGlvbihJbXBvcnRPcGVyYXRpb24gb3ApIHsKLQotCQkvKgotCQkgKiBvcC5zZXRDcmVhdGVDb250YWluZXJTdHJ1Y3R1cmUoIGNyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCSAqLwotCQlvcC5zZXRPdmVyd3JpdGVSZXNvdXJjZXMob3ZlcndyaXRlRXhpc3RpbmdSZXNvdXJjZXNDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBleHRlbnNpb24gcHJvdmlkZWQgaXMgYW4gZXh0ZW5zaW9uIHRoYXQgaGFzIGJlZW4gc3BlY2lmaWVkIGZvciBleHBvcnQgYnkKLQkgKiB0aGUgdXNlci4KLQkgKiAKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uCi0JICogICAgICAgICAgICB0aGUgcmVzb3VyY2UgbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlc291cmNlIG5hbWUgaXMgc3VpdGFibGUgZm9yIGV4cG9ydCBiYXNlZCB1cG9uIGl0cwotCSAqICAgICAgICAgZXh0ZW5zaW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHBvcnRhYmxlRXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb24pIHsKLQkJaWYgKHNlbGVjdGVkVHlwZXMgPT0gbnVsbCkgLy8gaWUuLSBhbGwgZXh0ZW5zaW9ucyBhcmUgYWNjZXB0YWJsZQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJSXRlcmF0b3IgYWVudW0gPSBzZWxlY3RlZFR5cGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhZW51bS5oYXNOZXh0KCkpIHsKLQkJCWlmIChleHRlbnNpb24uZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKSBhZW51bS5uZXh0KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlcG9wdWxhdGUgdGhlIHZpZXcgYmFzZWQgb24gdGhlIGN1cnJlbnRseSBlbnRlcmVkIGRpcmVjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldFNlbGVjdGlvbigpIHsKLQotCQlNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBjdXJyZW50Um9vdCA9IGdldEZpbGVTeXN0ZW1UcmVlKCk7Ci0JCXRoaXMuc2VsZWN0aW9uR3JvdXAuc2V0Um9vdChjdXJyZW50Um9vdCk7Ci0JCWlmIChkcmFnQW5kRHJvcEZpbGVOYW1lcyAhPSBudWxsKSB7Ci0KLQkJCWlmIChkcmFnQW5kRHJvcEZpbGVOYW1lcy5nZXQoMCkudG9TdHJpbmcoKS5lbmRzV2l0aCgiLnppcCIpID09IGZhbHNlICYmIGRyYWdBbmREcm9wRmlsZU5hbWVzLmdldCgwKS50b1N0cmluZygpLmVuZHNXaXRoKCIuamFyIikgPT0gZmFsc2UpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJdGhpcy5zZWxlY3Rpb25Hcm91cC5leHBhbmRBbGwoKTsKLQkJCX0KLQotCQkJTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgdGVtcCA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgY3VycmVudFJvb3QuZ2V0Rm9sZGVycygpLmdldENoaWxkcmVuKClbMF07Ci0KLQkJCUxpc3QgZGlyTGlzdCA9IHBhdGhUb0FycmF5KCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlyTGlzdC5zaXplKCk7IGkrKykgewotCQkJCVN0cmluZyBzID0gKFN0cmluZykgZGlyTGlzdC5nZXQoaSk7Ci0JCQkJT2JqZWN0W10gZm9sZGVycyA9IHRlbXAuZ2V0Rm9sZGVycygpLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBmb2xkZXJzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCWlmICgoKEZpbGUpICgoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIGZvbGRlcnNba10pLmdldEZpbGVTeXN0ZW1PYmplY3QoKSkuZ2V0TmFtZSgpLmVxdWFscyhzKSkgewotCQkJCQkJdGVtcCA9IChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkgdGVtcC5nZXRGb2xkZXJzKCkuZ2V0Q2hpbGRyZW4oKVtrXTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0KLQkJCWlmIChkcmFnQW5kRHJvcEZpbGVOYW1lcy5nZXQoMCkudG9TdHJpbmcoKS5lbmRzV2l0aCgiLnppcCIpID09IGZhbHNlICYmIGRyYWdBbmREcm9wRmlsZU5hbWVzLmdldCgwKS50b1N0cmluZygpLmVuZHNXaXRoKCIuamFyIikgPT0gZmFsc2UpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJdGhpcy5zZWxlY3Rpb25Hcm91cC5pbml0aWFsQ2hlY2tUcmVlSXRlbSh0ZW1wKTsKLQkJCX0KLQotCQkJLy9JZiBjYW4gZmlndXJlIG91dCBob3cgdG8gcHJlLWhpZ2hsaWdodCBkaXIsIHRoZW4gdXNlIGZvbGxvd2luZyBjb2RlCi0JCQkvL3RvIGNoZWNrIGRyYWdnZWQgZmlsZXMgb25seS4gQWxzbyBuZWVkIHRvIHNob3cgYWxsIGZpbGVzIGluIHRyZWUuCi0JCQkvKgotCQkJICogU3RyaW5nIGZpbGVOYW1lID0gbnVsbDsgTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQgbmFtZSA9IG51bGw7IGludCBudW1GaWxlcyA9Ci0JCQkgKiB0ZW1wLmdldEZpbGVzKCkuZ2V0Q2hpbGRyZW4oKS5sZW5ndGg7IE9iamVjdFtdIGZpbGVzID0gdGVtcC5nZXRGaWxlcygpLmdldENoaWxkcmVuKCk7Ci0JCQkgKiBmb3IoaW50IGkgPSAwOyBpIDwgZHJhZ0FuZERyb3BGaWxlTmFtZXMuc2l6ZSgpOyBpKyspIHsgZmlsZU5hbWUgPSAobmV3Ci0JCQkgKiBGaWxlKChTdHJpbmcpZHJhZ0FuZERyb3BGaWxlTmFtZXMuZ2V0KGkpKSkuZ2V0TmFtZSgpOyBmb3IoaW50IGsgPSAwOyBrIDwgbnVtRmlsZXM7Ci0JCQkgKiBrKyspIHsgaWYoZmlsZU5hbWUuZXF1YWxzKCgoRmlsZSkgKChNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCkKLQkJCSAqIGZpbGVzWzBdKS5nZXRGaWxlU3lzdGVtT2JqZWN0KCkpLmdldE5hbWUoKSkpIHsKLQkJCSAqIHRoaXMuc2VsZWN0aW9uR3JvdXAuaW5pdGlhbENoZWNrVHJlZUl0ZW0odGVtcCk7IGJyZWFrOyB9IH0gfQotCQkJICovCi0KLQkJCS8vdGhpcy5zZWxlY3Rpb25Hcm91cC5zZXRBbGxTZWxlY3Rpb25zKHRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHBhdGhUb0FycmF5KCkgewotCQlTdHJpbmcgcyA9IChTdHJpbmcpIGRyYWdBbmREcm9wRmlsZU5hbWVzLmdldCgwKTsKLQotCQlQYWNrYWdlTmFtZVJlc29sdmVyIG5hbWVSZXNvbHZlciA9IG5ldyBQYWNrYWdlTmFtZVJlc29sdmVyKCk7Ci0JCVN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUgPSBuYW1lUmVzb2x2ZXIuZ2V0Q2xhc3NOYW1lKHMpOwotCi0JCWludCBzbGFzaENvdW50cyA9IDA7Ci0JCWlmIChxdWFsaWZpZWRDbGFzc05hbWUgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gcXVhbGlmaWVkQ2xhc3NOYW1lLmluZGV4T2YoJy4nKTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJfQotCQkJU3RyaW5nIGJhc2VEaXIgPSBxdWFsaWZpZWRDbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCWZvciAoaW50IGkgPSBzLmluZGV4T2YoYmFzZURpcik7IGkgPCBzLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcik7IGkrKykgewotCQkJCWlmIChzLmNoYXJBdChpKSA9PSBGaWxlLnNlcGFyYXRvckNoYXIpCi0JCQkJCXNsYXNoQ291bnRzKys7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IGRpck5hbWVzQXJyYXkgPSBuZXcgQXJyYXlMaXN0KHNsYXNoQ291bnRzKTsKLQkJaWYgKHMuZW5kc1dpdGgoIi56aXAiKSB8fCBzLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gZGlyTmFtZXNBcnJheTsKLQkJfQotCQlpbnQgc3RhcnRJbmRleCA9IDA7Ci0JCWludCBlbmRJbmRleDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gc2xhc2hDb3VudHM7IGkrKykgewotCQkJZW5kSW5kZXggPSBxdWFsaWZpZWRDbGFzc05hbWUuaW5kZXhPZignLicsIHN0YXJ0SW5kZXgpOwotCQkJZGlyTmFtZXNBcnJheS5hZGQocXVhbGlmaWVkQ2xhc3NOYW1lLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCkpOwotCQkJc3RhcnRJbmRleCA9IGVuZEluZGV4ICsgMTsKLQkJfQotCQlyZXR1cm4gZGlyTmFtZXNBcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhlIGRpYWxvZyBzdG9yZSB0byByZXN0b3JlIHdpZGdldCB2YWx1ZXMgdG8gdGhlIHZhbHVlcyB0aGF0IHRoZXkgaGVsZCBsYXN0IHRpbWUgdGhpcwotCSAqIHdpemFyZCB3YXMgdXNlZCB0byBjb21wbGV0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVdpZGdldFZhbHVlcygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJaWYgKHNldHRpbmdzICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzID0gc2V0dGluZ3MuZ2V0QXJyYXkoU1RPUkVfU09VUkNFX05BTUVTX0lEKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gaWUuLSBubyB2YWx1ZXMgc3RvcmVkLCBzbyBzdG9wCi0KLQkJCS8vIHNldCBmaWxlbmFtZXMgaGlzdG9yeQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VOYW1lcy5sZW5ndGg7IGkrKykKLQkJCQlzb3VyY2VOYW1lRmllbGQuYWRkKHNvdXJjZU5hbWVzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmNlIEZpbmlzaCB3YXMgcHJlc3NlZCwgd3JpdGUgd2lkZ2V0IHZhbHVlcyB0byB0aGUgZGlhbG9nIHN0b3JlIHNvIHRoYXQgdGhleSB3aWxsIHBlcnNpc3QKLQkgKiBpbnRvIHRoZSBuZXh0IGludm9jYXRpb24gb2YgdGhpcyB3aXphcmQgcGFnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVXaWRnZXRWYWx1ZXMoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQkvLyB1cGRhdGUgc291cmNlIG5hbWVzIGhpc3RvcnkKLQkJCVN0cmluZ1tdIHNvdXJjZU5hbWVzID0gc2V0dGluZ3MuZ2V0QXJyYXkoU1RPUkVfU09VUkNFX05BTUVTX0lEKTsKLQkJCWlmIChzb3VyY2VOYW1lcyA9PSBudWxsKQotCQkJCXNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1swXTsKLQotCQkJc291cmNlTmFtZXMgPSBhZGRUb0hpc3Rvcnkoc291cmNlTmFtZXMsIGdldFNvdXJjZURpcmVjdG9yeU5hbWUoKSk7Ci0JCQlzZXR0aW5ncy5wdXQoU1RPUkVfU09VUkNFX05BTUVTX0lELCBzb3VyY2VOYW1lcyk7Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIEludm9rZXMgYSBmaWxlIHNlbGVjdGlvbiBvcGVyYXRpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxlIHN5c3RlbSBhbmQgc3RydWN0dXJlIHByb3ZpZGVyLiBJZgotCSAqIHRoZSB1c2VyIHNwZWNpZmllcyBmaWxlcyB0byBiZSBpbXBvcnRlZCB0aGVuIHRoaXMgc2VsZWN0aW9uIGlzIGNhY2hlZCBmb3IgbGF0ZXIgcmV0cmlldmFsIGFuZAotCSAqIGlzIHJldHVybmVkLgotCSAqLwotCXByb3RlY3RlZCBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudCBzZWxlY3RGaWxlcyhmaW5hbCBPYmplY3Qgcm9vdEZpbGVTeXN0ZW1PYmplY3QsIGZpbmFsIElJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlcikgewotCi0JCWZpbmFsIE1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50W10gcmVzdWx0cyA9IG5ldyBNaW5pbWl6ZWRGaWxlU3lzdGVtRWxlbWVudFsxXTsKLQotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vQ3JlYXRlIHRoZSByb290IGVsZW1lbnQgZnJvbSB0aGUgc3VwcGxpZWQgZmlsZSBzeXN0ZW0gb2JqZWN0Ci0JCQkJcmVzdWx0c1swXSA9IGNyZWF0ZVJvb3RFbGVtZW50KHJvb3RGaWxlU3lzdGVtT2JqZWN0LCBzdHJ1Y3R1cmVQcm92aWRlcik7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiByZXN1bHRzWzBdOwotCX0KLQotCS8qKgotCSAqIFNldCBhbGwgb2YgdGhlIHNlbGVjdGlvbnMgaW4gdGhlIHNlbGVjdGlvbiBncm91cCB0byB2YWx1ZS4gSW1wbGVtZW50ZWQgaGVyZSB0byBwcm92aWRlIGFjY2VzcwotCSAqIGZvciBpbm5lciBjbGFzc2VzLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEFsbFNlbGVjdGlvbnMoYm9vbGVhbiB2YWx1ZSkgewotCQlzdXBlci5zZXRBbGxTZWxlY3Rpb25zKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzb3VyY2UgbmFtZSBvZiB0aGUgaW1wb3J0IHRvIGJlIHRoZSBzdXBwbGllZCBwYXRoLiBBZGRzIHRoZSBuYW1lIG9mIHRoZSBwYXRoIHRvIHRoZQotCSAqIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIHNvdXJjZSBjb21ibyBhbmQgc2VsZWN0cyBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdG8gYmUgYWRkZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTb3VyY2VOYW1lKFN0cmluZyBwYXRoKSB7Ci0KLQkJaWYgKHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0KLQkJCVN0cmluZ1tdIGN1cnJlbnRJdGVtcyA9IHRoaXMuc291cmNlTmFtZUZpZWxkLmdldEl0ZW1zKCk7Ci0JCQlpbnQgc2VsZWN0aW9uSW5kZXggPSAtMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGN1cnJlbnRJdGVtc1tpXS5lcXVhbHMocGF0aCkpCi0JCQkJCXNlbGVjdGlvbkluZGV4ID0gaTsKLQkJCX0KLQkJCWlmIChzZWxlY3Rpb25JbmRleCA8IDApIHsKLQkJCQlpbnQgb2xkTGVuZ3RoID0gY3VycmVudEl0ZW1zLmxlbmd0aDsKLQkJCQlTdHJpbmdbXSBuZXdJdGVtcyA9IG5ldyBTdHJpbmdbb2xkTGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShjdXJyZW50SXRlbXMsIDAsIG5ld0l0ZW1zLCAwLCBvbGRMZW5ndGgpOwotCQkJCW5ld0l0ZW1zW29sZExlbmd0aF0gPSBwYXRoOwotCQkJCXRoaXMuc291cmNlTmFtZUZpZWxkLnNldEl0ZW1zKG5ld0l0ZW1zKTsKLQkJCQlzZWxlY3Rpb25JbmRleCA9IG9sZExlbmd0aDsKLQkJCX0KLQkJCXRoaXMuc291cmNlTmFtZUZpZWxkLnNlbGVjdChzZWxlY3Rpb25JbmRleCk7Ci0KLQkJCXJlc2V0U2VsZWN0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHRyZWUgdG8gb25seSBzZWxlY3QgdGhvc2UgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgc2VsZWN0ZWQgdHlwZXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFNlbGVjdGlvbnNCYXNlZE9uU2VsZWN0ZWRUeXBlcygpIHsKLQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSk7Ci0JCWZpbmFsIE1hcCBzZWxlY3Rpb25NYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJZmluYWwgSUVsZW1lbnRGaWx0ZXIgZmlsdGVyID0gbmV3IElFbGVtZW50RmlsdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBmaWx0ZXJFbGVtZW50cyhDb2xsZWN0aW9uIGZpbGVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJaWYgKGZpbGVzID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCUl0ZXJhdG9yIGZpbGVzTGlzdCA9IGZpbGVzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGZpbGVzTGlzdC5oYXNOZXh0KCkpIHsKLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkJCWNoZWNrRmlsZShmaWxlc0xpc3QubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZpbHRlckVsZW1lbnRzKE9iamVjdFtdIGZpbGVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJaWYgKGZpbGVzID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkJCWNoZWNrRmlsZShmaWxlc1tpXSk7Ci0JCQkJfQotCQkJfQotCi0JCQlwcml2YXRlIHZvaWQgY2hlY2tGaWxlKE9iamVjdCBmaWxlRWxlbWVudCkgewotCQkJCU1pbmltaXplZEZpbGVTeXN0ZW1FbGVtZW50IGZpbGUgPSAoTWluaW1pemVkRmlsZVN5c3RlbUVsZW1lbnQpIGZpbGVFbGVtZW50OwotCQkJCWlmIChpc0V4cG9ydGFibGVFeHRlbnNpb24oZmlsZS5nZXRGaWxlTmFtZUV4dGVuc2lvbigpKSkgewotCQkJCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlGaWxlU3lzdGVtRWxlbWVudCBwYXJlbnQgPSBmaWxlLmdldFBhcmVudCgpOwotCQkJCQlpZiAoc2VsZWN0aW9uTWFwLmNvbnRhaW5zS2V5KHBhcmVudCkpCi0JCQkJCQllbGVtZW50cyA9IChMaXN0KSBzZWxlY3Rpb25NYXAuZ2V0KHBhcmVudCk7Ci0JCQkJCWVsZW1lbnRzLmFkZChmaWxlKTsKLQkJCQkJc2VsZWN0aW9uTWFwLnB1dChwYXJlbnQsIGVsZW1lbnRzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiSW1wb3J0UGFnZS5maWx0ZXJTZWxlY3Rpb25zIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCQkJCWdldFNlbGVjdGVkUmVzb3VyY2VzKGZpbHRlciwgbW9uaXRvcik7Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWRpYWxvZy5ydW4odHJ1ZSwgdHJ1ZSwgcnVubmFibGUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJLy9Db3VsZG4ndCBzdGFydC4gRG8gbm90aGluZy4KLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvL0dvdCBpbnRlcnJ1cHRlZC4gRG8gbm90aGluZy4KLQkJCXJldHVybjsKLQkJfQotCQkvLyBtYWtlIHN1cmUgdGhhdCBhbGwgcGFpbnQgb3BlcmF0aW9ucyBjYXVzZWQgYnkgY2xvc2luZyB0aGUgcHJvZ3Jlc3MKLQkJLy8gZGlhbG9nIGdldCBmbHVzaGVkLCBvdGhlcndpc2UgZXh0cmEgcGl4ZWxzIHdpbGwgcmVtYWluIG9uIHRoZSBzY3JlZW4gdW50aWwKLQkJLy8gdXBkYXRlU2VsZWN0aW9ucyBpcyBjb21wbGV0ZWQKLQkJZ2V0U2hlbGwoKS51cGRhdGUoKTsKLQkJLy8gVGhlIHVwZGF0ZVNlbGVjdGlvbnMgbWV0aG9kIGFjY2Vzc2VzIFNXVCB3aWRnZXRzIHNvIGNhbm5vdCBiZSBleGVjdXRlZAotCQkvLyBhcyBwYXJ0IG9mIHRoZSBhYm92ZSBwcm9ncmVzcyBkaWFsb2cgb3BlcmF0aW9uIHNpbmNlIHRoZSBvcGVyYXRpb24gZm9ya3MKLQkJLy8gYSBuZXcgcHJvY2Vzcy4KLQkJaWYgKHNlbGVjdGlvbk1hcCAhPSBudWxsKSB7Ci0JCQl1cGRhdGVTZWxlY3Rpb25zKHNlbGVjdGlvbk1hcCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIElEaWFsb2dQYWdlLiBTZXQgdGhlIHNlbGVjdGlvbiB1cCB3aGVuIGl0IGJlY29tZXMgdmlzaWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlyZXNldFNlbGVjdGlvbigpOwotCQlpZiAodmlzaWJsZSkKLQkJCXRoaXMuc291cmNlTmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBzZWxlY3Rpb25zIHdpdGggdGhvc2UgaW4gbWFwIC4gSW1wbGVtZW50ZWQgaGVyZSB0byBnaXZlIGlubmVyIGNsYXNzIHZpc2liaWxpdHkKLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogICAgICAgICAgICBNYXAgLSBrZXkgdHJlZSBlbGVtZW50cywgdmFsdWVzIExpc3RzIG9mIGxpc3QgZWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb25zKE1hcCBtYXApIHsKLQkJc3VwZXIudXBkYXRlU2VsZWN0aW9ucyhtYXApOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHdpZGdldHMgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgYnkgYSBjaGFuZ2UgaW4gdGhlIGRpYWxvZy4gUHJvdmlkZWQgaGVyZSB0byBnaXZlCi0JICogYWNjZXNzIHRvIGlubmVyIGNsYXNzZXMuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBFdmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCkgewotCi0JCXN1cGVyLnVwZGF0ZVdpZGdldEVuYWJsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgc2VsZidzIHNvdXJjZSBzcGVjaWZpY2F0aW9uIHdpZGdldHMgY3VycmVudGx5IGFsbCBjb250YWluCi0JICogdmFsaWQgdmFsdWVzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU291cmNlR3JvdXAoKSB7Ci0JCWlmIChnZXRTb3VyY2VEaXJlY3RvcnkoKSAhPSBudWxsKSB7Ci0JCQlGaWxlIHNvdXJjZURpcmVjdG9yeSA9IGdldFNvdXJjZURpcmVjdG9yeSgpOwotCQkJaWYgKHNvdXJjZURpcmVjdG9yeSA9PSBudWxsKSB7Ci0JCQkJc2V0TWVzc2FnZShTT1VSQ0VfRU1QVFlfTUVTU0FHRSk7Ci0JCQkJZW5hYmxlQnV0dG9uR3JvdXAoZmFsc2UpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKHNvdXJjZUNvbmZsaWN0c1dpdGhEZXN0aW5hdGlvbihuZXcgUGF0aChzb3VyY2VEaXJlY3RvcnkuZ2V0UGF0aCgpKSkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoZ2V0U291cmNlQ29uZmxpY3RNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZW5hYmxlQnV0dG9uR3JvdXAoZmFsc2UpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJZW5hYmxlQnV0dG9uR3JvdXAodHJ1ZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvL0lmIHRoZXJlIGlzIG5vdGhpbmcgYmVpbmcgcHJvdmlkZWQgdG8gdGhlIGlucHV0IHRoZW4gdGhlcmUgaXMgYSBwcm9ibGVtCi0JCWlmICh0aGlzLmN1cnJlbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXRNZXNzYWdlKFNPVVJDRV9FTVBUWV9NRVNTQUdFKTsKLQkJCWVuYWJsZUJ1dHRvbkdyb3VwKGZhbHNlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbmFibGVCdXR0b25Hcm91cCh0cnVlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBzb3VyY2UgbG9jYXRpb24gY29uZmxpY3RzIHdpdGggdGhlIGRlc3RpbmF0aW9uIHJlc291cmNlLiBUaGlzIHdpbGwgb2NjdXIKLQkgKiBpZiB0aGUgc291cmNlIGlzIGFscmVhZHkgdW5kZXIgdGhlIGRlc3RpbmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB0byBjaGVjawotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgYSBjb25mbGljdCwgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNvdXJjZUNvbmZsaWN0c1dpdGhEZXN0aW5hdGlvbihJUGF0aCBzb3VyY2VQYXRoKSB7Ci0KLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBnZXRTcGVjaWZpZWRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0U3BlY2lmaWVkQ29udGFpbmVyKCkuZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKHNvdXJjZVBhdGgpOwotCX0KLQotCXByb3RlY3RlZCBJUGF0aCBnZXRSZXNvdXJjZVBhdGgoKSB7Ci0JCXJldHVybiBpbXBvcnRlZENsYXNzZXNQYXRoOwotCX0KLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JLy9tYWtlc3VyZSB0byBjYWxsIG1haW5wYWdlLmNhbmNlbCgpCi0JcHVibGljIGJvb2xlYW4gY2FuY2VsKCkgewotCQljbGVhclByb3ZpZGVyQ2FjaGUoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBjYWNoZWQgc3RydWN0dXJlIHByb3ZpZGVyIGFmdGVyIGZpcnN0IGZpbmFsaXppbmcgaXQgcHJvcGVybHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJQcm92aWRlckNhY2hlKCkgewotCQlpZiAocHJvdmlkZXJDYWNoZSAhPSBudWxsKSB7Ci0JCQljbG9zZVppcEZpbGUocHJvdmlkZXJDYWNoZS5nZXRaaXBGaWxlKCkpOwotCQkJcHJvdmlkZXJDYWNoZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBdHRlbXB0cyB0byBjbG9zZSB0aGUgcGFzc2VkIHppcCBmaWxlLCBhbmQgYW5zd2VycyBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNsb3NlWmlwRmlsZShaaXBGaWxlIGZpbGUpIHsKLQkJdHJ5IHsKLQkJCWZpbGUuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy9kaXNwbGF5RXJyb3JEaWFsb2coRGF0YVRyYW5zZmVyTWVzc2FnZXMuZm9ybWF0KCJaaXBJbXBvcnQuY291bGROb3RDbG9zZSIsIG5ldwotCQkJLy8gT2JqZWN0W10geyBmaWxlLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQW5zd2VyIGEgaGFuZGxlIHRvIHRoZSB6aXAgZmlsZSBjdXJyZW50bHkgc3BlY2lmaWVkIGFzIGJlaW5nIHRoZSBzb3VyY2UuIFJldHVybiBudWxsIGlmIHRoaXMKLQkgKiBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBvZiB2YWxpZCBmb3JtYXQuCi0JICovCi0KLQlwcm90ZWN0ZWQgWmlwRmlsZSBnZXRTcGVjaWZpZWRTb3VyY2VGaWxlKCkgewotCQlyZXR1cm4gZ2V0U3BlY2lmaWVkU291cmNlRmlsZShzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXIgYSBoYW5kbGUgdG8gdGhlIHppcCBmaWxlIGN1cnJlbnRseSBzcGVjaWZpZWQgYXMgYmVpbmcgdGhlIHNvdXJjZS4gUmV0dXJuIG51bGwgaWYgdGhpcwotCSAqIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IG9mIHZhbGlkIGZvcm1hdC4KLQkgKi8KLQotCXByaXZhdGUgWmlwRmlsZSBnZXRTcGVjaWZpZWRTb3VyY2VGaWxlKFN0cmluZyBmaWxlTmFtZSkgewotCQlpZiAoZmlsZU5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gQXJjaGl2ZVV0aWwubmV3WmlwRmlsZShmaWxlTmFtZSk7Ci0JCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2Rpc3BsYXlFcnJvckRpYWxvZyhEYXRhVHJhbnNmZXJNZXNzYWdlcy5nZXRTdHJpbmcoIlppcEltcG9ydC5iYWRGb3JtYXQiKSk7Ci0JCQkvLyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vZGlzcGxheUVycm9yRGlhbG9nKERhdGFUcmFuc2Zlck1lc3NhZ2VzLmdldFN0cmluZygiWmlwSW1wb3J0LmNvdWxkTm90UmVhZCIpKTsKLQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXNvdXJjZU5hbWVGaWVsZC5zZXRGb2N1cygpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RydWN0dXJlIHByb3ZpZGVyIGZvciB0aGUgc3BlY2lmaWVkIHppcCBmaWxlLgotCSAqLwotCXByb3RlY3RlZCBaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoWmlwRmlsZSB0YXJnZXRaaXApIHsKLQkJaWYgKHByb3ZpZGVyQ2FjaGUgPT0gbnVsbCkKLQkJCXByb3ZpZGVyQ2FjaGUgPSBuZXcgWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyKHRhcmdldFppcCk7Ci0JCWVsc2UgaWYgKCFwcm92aWRlckNhY2hlLmdldFppcEZpbGUoKS5nZXROYW1lKCkuZXF1YWxzKHRhcmdldFppcC5nZXROYW1lKCkpKSB7Ci0JCQljbGVhclByb3ZpZGVyQ2FjaGUoKTsgLy8gaWUuLSBuZXcgdmFsdWUsIHNvIGZpbmFsaXplJnJlbW92ZSBvbGQgdmFsdWUKLQkJCXByb3ZpZGVyQ2FjaGUgPSBuZXcgWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyKHRhcmdldFppcCk7Ci0JCX0gZWxzZSBpZiAoIXByb3ZpZGVyQ2FjaGUuZ2V0WmlwRmlsZSgpLmVxdWFscyh0YXJnZXRaaXApKQotCQkJY2xvc2VaaXBGaWxlKHRhcmdldFppcCk7IC8vIGllLi0gZHVwbGljYXRlIGhhbmRsZSB0byBzYW1lIC56aXAKLQotCQlyZXR1cm4gcHJvdmlkZXJDYWNoZTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGEgRmlsZURpYWxvZyBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzcGVjaWZ5IHRoZSBzb3VyY2UgZmlsZSB0byBpbXBvcnQgZnJvbQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVNvdXJjZUJyb3dzZUJ1dHRvblByZXNzZWRGb3JaaXAoKSB7Ci0JCVN0cmluZyBzZWxlY3RlZEZpbGUgPSBxdWVyeVppcEZpbGVUb0ltcG9ydCgpOwotCQlpZiAoc2VsZWN0ZWRGaWxlICE9IG51bGwpIHsKLQkJCWlmICghc2VsZWN0ZWRGaWxlLmVxdWFscyhzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpKSkgewotCQkJCS8vQmUgc3VyZSBpdCBpcyB2YWxpZCBiZWZvcmUgd2UgZ28gc2V0dGluZyBhbnkgbmFtZXMKLQkJCQlaaXBGaWxlIHNvdXJjZUZpbGUgPSBnZXRTcGVjaWZpZWRTb3VyY2VGaWxlKHNlbGVjdGVkRmlsZSk7Ci0JCQkJaWYgKHNvdXJjZUZpbGUgIT0gbnVsbCkgewotCQkJCQljbG9zZVppcEZpbGUoc291cmNlRmlsZSk7Ci0JCQkJCXNldFNvdXJjZU5hbWUoc2VsZWN0ZWRGaWxlKTsKLQkJCQkJc2VsZWN0aW9uR3JvdXAuc2V0Rm9jdXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbXBvcnQgdGhlIHJlc291cmNlcyB3aXRoIGV4dGVuc2lvbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0UmVzb3VyY2VzRnJvbVppcChMaXN0IGZpbGVTeXN0ZW1PYmplY3RzKSB7Ci0KLQkJWmlwRmlsZSB6aXBGaWxlID0gZ2V0U3BlY2lmaWVkU291cmNlRmlsZSgpOwotCQlaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIgPSBnZXRTdHJ1Y3R1cmVQcm92aWRlcih6aXBGaWxlKTsKLQotCQlib29sZWFuIHJlc3VsdCA9IGV4ZWN1dGVJbXBvcnRPcGVyYXRpb24obmV3IEltcG9ydE9wZXJhdGlvbihnZXRDb250YWluZXJGdWxsUGF0aCgpLCBzdHJ1Y3R1cmVQcm92aWRlci5nZXRSb290KCksIHN0cnVjdHVyZVByb3ZpZGVyLCB0aGlzLCBmaWxlU3lzdGVtT2JqZWN0cykpOwotCi0JCWNsb3NlWmlwRmlsZSh6aXBGaWxlKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgZmlsZSBzZWxlY3Rpb24gZGlhbG9nIGFuZCByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc2VsZWN0ZWQgZmlsZSwgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGlhbG9nIHdhcyBjYW5jZWxlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5WmlwRmlsZVRvSW1wb3J0KCkgewotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNvdXJjZU5hbWVGaWVsZC5nZXRTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXXtGSUxFX0lNUE9SVF9NQVNLfSk7Ci0KLQkJU3RyaW5nIGN1cnJlbnRTb3VyY2VTdHJpbmcgPSBzb3VyY2VOYW1lRmllbGQuZ2V0VGV4dCgpOwotCQlpbnQgbGFzdFNlcGFyYXRvckluZGV4ID0gY3VycmVudFNvdXJjZVN0cmluZy5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7Ci0JCWlmIChsYXN0U2VwYXJhdG9ySW5kZXggIT0gLTEpCi0JCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChjdXJyZW50U291cmNlU3RyaW5nLnN1YnN0cmluZygwLCBsYXN0U2VwYXJhdG9ySW5kZXgpKTsKLQotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93aXphcmQvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWQ1YThiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dpemFyZC9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEgQEAKK0oyRUVFeHBvcnRQYWdlX09wdGltaXplX2Zvcl9hX3NwZWNpZmljX3NlcnZlcl9ydW50Xz1PcHRpbWkmemUgZm9yIGEgc3BlY2lmaWMgc2VydmVyIHJ1bnRpbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbFBhZ2UuamF2YQppbmRleCBkMjZlZGUyLi4zMjZkZDc2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJGYWNldEluc3RhbGxQYWdlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRJbnN0YWxsUGFnZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTgsNiArOCw3IEBACiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogICogICAgRGF2aWQgU2NobmVpZGVyLCBkYXZpZC5zY2huZWlkZXJAdW5pc3lzLmNvbSAtIFsxNDI1MDBdIFdUUCBwcm9wZXJ0aWVzIHBhZ2VzIGZvbnRzIGRvbid0IGZvbGxvdyBFY2xpcHNlIHByZWZlcmVuY2VzCisgKiAgICBNaWxlbiBNYW5vdiwgbWlsZW4ubWFub3ZAc2FwLmNvbSAtIGJ1Z3MgMjQ4NjIzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQ7CkBAIC0yMywyNCArMjQsMzMgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5HcmlkRGF0YUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWFyY3JlYXRpb24uSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuQXZhaWxhYmxlSjJFRUNvbXBvbmVudHNGb3JFQVJDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLklKMkVFVUlDb250ZXh0SWRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLklEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5JRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkRlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVDb21wb25lbnRMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFTW9kdWxlRmFjZXRJbnN0YWxsUGFnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKQEAgLTQ5LDYgKzU5LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwpAQCAtNTYsMTMgKzY3LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhTW9kZWxGYWNldEluc3RhbGxQYWdlOwogCiAvKioKICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvc3RhQGJlYS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgogICovCiAKLXB1YmxpYyBjbGFzcyBFYXJGYWNldEluc3RhbGxQYWdlIGV4dGVuZHMgRGF0YU1vZGVsRmFjZXRJbnN0YWxsUGFnZSBpbXBsZW1lbnRzIElFYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKK3B1YmxpYyBjbGFzcyBFYXJGYWNldEluc3RhbGxQYWdlIGV4dGVuZHMgSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2UgaW1wbGVtZW50cyBJRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7CiAJCiAJcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsQnV0dG9uOwogCXByaXZhdGUgQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uOwpAQCAtODMsMzIgKzkzLDI3IEBACiAJCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5FQVJfV0laX0JBTk5FUikpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKIAkJcmV0dXJuIG5ldyBTdHJpbmdbXXtDT05URU5UX0RJUiwgSjJFRV9QUk9KRUNUU19MSVNUfTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIG1vZHVsZXNHcm91cCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbW9kdWxlc0dyb3VwLnNldExheW91dChsYXlvdXQpOwogCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuTkVXX0VBUl9BRERfTU9EVUxFU19QQUdFKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbW9kdWxlc0dyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljcmVhdGVNb2R1bGVQcm9qZWN0T3B0aW9ucyhtb2R1bGVzR3JvdXApOwotCQljcmVhdGVCdXR0b25zR3JvdXAobW9kdWxlc0dyb3VwKTsKIAkJCi0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKG1vZHVsZXNHcm91cCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJdGhpcy5jb250ZW50RGlyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXRoaXMuY29udGVudERpckxhYmVsLnNldFRleHQoUmVzb3VyY2VzLmNvbnRlbnREaXJMYWJlbCk7Ci0JCXRoaXMuY29udGVudERpckxhYmVsLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQotCQl0aGlzLmNvbnRlbnREaXIgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl0aGlzLmNvbnRlbnREaXIuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoY29udGVudERpciwgQ09OVEVOVF9ESVIsIG51bGwpOworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKKwkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKKwkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKKwkJCisJCWNyZWF0ZU1vZHVsZVByb2plY3RPcHRpb25zKGNvbXBvc2l0ZSk7CisJCWNyZWF0ZUNvbnRlbnREaXJHcm91cChjb21wb3NpdGUpOworCQkKKwkJY3JlYXRlR2VuZXJhdGVEZXNjcmlwdG9yQ29udHJvbChjb21wb3NpdGUsIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfU0hPUlRfTkFNRSk7CisJCXJlZ2lzdGVyRmFjZXRWZXJzaW9uQ2hhbmdlTGlzdGVuZXIoKTsKKwkJCiAJICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIG1vZHVsZXNHcm91cDsKKwkJcmV0dXJuIGNvbXBvc2l0ZTsKIAl9CiAKIAlwcm90ZWN0ZWQgaW50IGdldEoyRUVWZXJzaW9uKCkgewpAQCAtMTE3LDIyICsxMjIsMzggQEAKIAl9CiAJCiAJLyoqCi0JICogQHBhcmFtIG1vZHVsZXNHcm91cAorCSAqIEBwYXJhbSBwYXJlbnQKIAkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlTW9kdWxlUHJvamVjdE9wdGlvbnMoQ29tcG9zaXRlIG1vZHVsZXNHcm91cCkgewotCQltb2R1bGVQcm9qZWN0c0xhYmVsID0gbmV3IExhYmVsKG1vZHVsZXNHcm91cCwgU1dULk5PTkUpOwotCQltb2R1bGVQcm9qZWN0c0xhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSjJFRV9NT0RVTEVfREVQRU5ERU5DSUVTX0xBQkVMKSk7Ci0JCW1vZHVsZVByb2plY3RzTGFiZWwuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOworCXByaXZhdGUgdm9pZCBjcmVhdGVNb2R1bGVQcm9qZWN0T3B0aW9ucyhDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOworCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7CisJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKIAkJCi0JCW1vZHVsZVByb2plY3RzVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QobW9kdWxlc0dyb3VwLCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKKwkJbW9kdWxlUHJvamVjdHNMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKKwkJbW9kdWxlUHJvamVjdHNMYWJlbC5zZXRUZXh0KEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkoyRUVfTU9EVUxFX0RFUEVOREVOQ0lFU19MQUJFTCkpOworCQlHcmlkRGF0YSBnZCA9IGdkaGZpbGwoKTsKKwkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOworCQltb2R1bGVQcm9qZWN0c0xhYmVsLnNldExheW91dERhdGEoZ2QpOworCQkKKwkJbW9kdWxlUHJvamVjdHNWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwogCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwogCQlnRGF0YS53aWR0aEhpbnQgPSAyMDA7CiAJCWdEYXRhLmhlaWdodEhpbnQgPSA4MDsKIAkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ0RhdGEpOwogCQlpbnQgajJlZVZlcnNpb24gPSBnZXRKMkVFVmVyc2lvbigpOwotCQlBdmFpbGFibGVKMkVFQ29tcG9uZW50c0ZvckVBUkNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBBdmFpbGFibGVKMkVFQ29tcG9uZW50c0ZvckVBUkNvbnRlbnRQcm92aWRlcihudWxsLCBqMmVlVmVyc2lvbik7CisJCUlMYWJlbERlY29yYXRvciBkZWNvcmF0b3IgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpOworCQlBdmFpbGFibGVKMkVFQ29tcG9uZW50c0ZvckVBUkNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBBdmFpbGFibGVKMkVFQ29tcG9uZW50c0ZvckVBUkNvbnRlbnRQcm92aWRlcihudWxsLCBqMmVlVmVyc2lvbiwgZGVjb3JhdG9yKTsKIAkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSjJFRUNvbXBvbmVudExhYmVsUHJvdmlkZXIoKSk7CisJCWZpbmFsIEoyRUVDb21wb25lbnRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgSjJFRUNvbXBvbmVudExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOworCQlkZWNvcmF0b3IuYWRkTGlzdGVuZXIobmV3IElMYWJlbFByb3ZpZGVyTGlzdGVuZXIoKXsKKwkJCisJCQlwdWJsaWMgdm9pZCBsYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CisJCQkJaWYoIW1vZHVsZVByb2plY3RzVmlld2VyLmdldFRhYmxlKCkuaXNEaXNwb3NlZCgpKXsKKwkJCQkJbW9kdWxlUHJvamVjdHNWaWV3ZXIucmVmcmVzaCh0cnVlKTsKKwkJCQl9CisJCQl9CisJCX0pOworCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwogCQlzZXRDaGVja2VkSXRlbXNGcm9tTW9kZWwoKTsKIAkJCiAJCW1vZHVsZVByb2plY3RzVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKQEAgLTE0OCw2ICsxNjksMTQgQEAKIAkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKIAkJbW9kdWxlUHJvamVjdHNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwogCQltb2R1bGVQcm9qZWN0c1ZpZXdlci5zZXRTb3J0ZXIobnVsbCk7CisJCXRoaXMubW9kdWxlUHJvamVjdHNWaWV3ZXIuZ2V0VGFibGUoKS5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKAorICAgICAgICAJCW5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsJCQkKKyAgICAgICAgCQkJQE92ZXJyaWRlCisgICAgICAgIAkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKKyAgICAgICAgCQkJCWUucmVzdWx0ID0gSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuSjJFRV9NT0RVTEVfREVQRU5ERU5DSUVTX0xBQkVMX0FDQ0VTU0lCSUxJVFkpOworICAgICAgICAJCX19KTsKKwkJCisJCWNyZWF0ZUJ1dHRvbnNHcm91cChjb21wb3NpdGUpOwogCX0KIAogCS8qKgpAQCAtMjE0LDM1ICsyNDMsNDggQEAKIAl9CiAJCiAJCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0dyb3VwKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSBwYXJlbnQpIHsKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewogCQlDb21wb3NpdGUgYnV0dG9uR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gNDsKLQkJYnV0dG9uR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOworCQlidXR0b25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7CisJCWJ1dHRvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOworCQkKIAkJc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwogCQlzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfUFJPSkVDVF9NT0RVTEVTX1BHX1NFTEVDVCkpOwogCQlzZWxlY3RBbGxCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLndpZHRoSGludCA9IFNXVC5ERUZBVUxUOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7CisJCUdyaWREYXRhRmFjdG9yeS5kZWZhdWx0c0Zvciggc2VsZWN0QWxsQnV0dG9uICkuYXBwbHlUbyggc2VsZWN0QWxsQnV0dG9uICk7CisJCQogCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uR3JvdXAsIFNXVC5QVVNIKTsKIAkJZGVzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfUFJPSkVDVF9NT0RVTEVTX1BHX0RFU0VMRUNUKSk7CiAJCWRlc2VsZWN0QWxsQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC53aWR0aEhpbnQgPSBTV1QuREVGQVVMVDsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7CisJCUdyaWREYXRhRmFjdG9yeS5kZWZhdWx0c0ZvciggZGVzZWxlY3RBbGxCdXR0b24gKS5hcHBseVRvKCBkZXNlbGVjdEFsbEJ1dHRvbiApOworCQkKKwkJbmV3IExhYmVsKGJ1dHRvbkdyb3VwLCBTV1QuTk9ORSk7IC8vIHBhZAorCQkKIAkJbmV3TW9kdWxlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwogCQluZXdNb2R1bGVCdXR0b24uc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfUFJPSkVDVF9NT0RVTEVTX1BHX05FVykpOwogCQluZXdNb2R1bGVCdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdkLm1pbmltdW1XaWR0aCA9IFNXVC5ERUZBVUxUOwotCQluZXdNb2R1bGVCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7CisJCUdyaWREYXRhRmFjdG9yeS5kZWZhdWx0c0ZvciggbmV3TW9kdWxlQnV0dG9uICkuYXBwbHlUbyggbmV3TW9kdWxlQnV0dG9uICk7CisJfQorCQorCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50RGlyR3JvdXAoQ29tcG9zaXRlIG1vZHVsZXNHcm91cCkgeworCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShtb2R1bGVzR3JvdXAsIFNXVC5OT05FKTsKKwkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOworCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOworCisJCXRoaXMuY29udGVudERpckxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQl0aGlzLmNvbnRlbnREaXJMYWJlbC5zZXRUZXh0KFJlc291cmNlcy5jb250ZW50RGlyTGFiZWwpOworCQl0aGlzLmNvbnRlbnREaXJMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKKworCQl0aGlzLmNvbnRlbnREaXIgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOworCQl0aGlzLmNvbnRlbnREaXIuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOworCQkKKwkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGNvbnRlbnREaXIsIENPTlRFTlRfRElSLCBudWxsKTsKIAl9CiAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KEV2ZW50KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewogCQlpZiAoZXZ0LndpZGdldCA9PSBzZWxlY3RBbGxCdXR0b24pCiAJCQloYW5kbGVTZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7CkBAIC0yNTQsNiArMjk2LDE0IEBACiAJCQlzdXBlci5oYW5kbGVFdmVudChldnQpOwogCX0KIAorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZhY2V0VmVyc2lvbkNoYW5nZWRFdmVudCgpCisJeworCSAgICBTdHJpbmcgZnYgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9WRVJTSU9OX1NUUik7CisJICAgIGJvb2xlYW4gaXNFQVI1ME9yR3JlYXRlciA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KGZ2KSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzVfMDsKKwkgICAgdGhpcy5hZGRERC5zZXRWaXNpYmxlKGlzRUFSNTBPckdyZWF0ZXIpOworCX0KKwkKIAkvKioKIAkgKiAgCiAJICovCkBAIC0zNTYsNiArNDA2LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS53aXphcmQuSjJFRVdpemFyZFBhZ2UjZW50ZXIoKQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGVudGVyKCkgewogCQlJV29ya3NwYWNlUm9vdCBpbnB1dCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CiAJCW1vZHVsZVByb2plY3RzVmlld2VyLnNldElucHV0KGlucHV0KTsKQEAgLTM2NiwxMiArNDE3LDggQEAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKIAogCWV4dGVuZHMgTkxTCi0KIAl7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VUaXRsZTsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgcGFnZURlc2NyaXB0aW9uOwogCQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZW50RGlyTGFiZWw7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRlbnREaXJMYWJlbEludmFsaWQ7CiAKIAkJc3RhdGljIHsKIAkJCWluaXRpYWxpemVNZXNzYWdlcyhFYXJGYWNldEluc3RhbGxQYWdlLmNsYXNzLmdldE5hbWUoKSwgUmVzb3VyY2VzLmNsYXNzKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcwppbmRleCA0Y2QxZmNlLi4yYjRiNzdjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzCkBAIC04LDcgKzgsNCBAQAogIyBDb250cmlidXRvcnM6CiAjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBhZ2VUaXRsZSA9IEVBUiBNb2R1bGUKLXBhZ2VEZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSBFQVIgbW9kdWxlIHNldHRpbmdzLgotY29udGVudERpckxhYmVsID0gQ29udGVudCBEaXJlY3Rvcnk6Ci1jb250ZW50RGlyTGFiZWxJbnZhbGlkID0gQ29udGVudCBEaXJlY3RvcnkgKGludmFsaWQpOgorY29udGVudERpckxhYmVsID0gJkNvbnRlbnQgZGlyZWN0b3J5OgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyUHJvamVjdEZpcnN0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyUHJvamVjdEZpcnN0UGFnZS5qYXZhCmluZGV4IGRiOWYxMTIuLjFjOGJhNjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclByb2plY3RGaXJzdFBhZ2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJQcm9qZWN0Rmlyc3RQYWdlLmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZTsKQEAgLTI5LDExICszMCwyMCBAQAogCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuTkVXX0VBUl9XSVpBUkRfUDEpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7CiAJCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7CiAJfQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlVHlwZUlEKCkgewogCQlyZXR1cm4gSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRTsKIAl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKKyAgICAgICAgZmluYWwgQ29tcG9zaXRlIHRvcCA9IHN1cGVyLmNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7CisgICAgICAgIGNyZWF0ZVdvcmtpbmdTZXRHcm91cFBhbmVsKHRvcCwgbmV3IFN0cmluZ1tdIHsgUkVTT1VSQ0VfV09SS0lOR19TRVQgfSk7CisJCXJldHVybiB0b3A7CisJfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyUHJvamVjdFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyUHJvamVjdFdpemFyZC5qYXZhCmluZGV4IDFkNDRlOWEuLmFlMzkxZDEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclByb2plY3RXaXphcmQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJQcm9qZWN0V2l6YXJkLmphdmEKQEAgLTM5LDYgKzM5LDcgQEAKIAkJc2V0V2luZG93VGl0bGUoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuRUFSX0NPTVBPTkVOVF9XSVpfVElUTEUpKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElEYXRhTW9kZWwgY3JlYXRlRGF0YU1vZGVsKCkgewogCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVBUkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CiAJfQpAQCAtNDcsMjEgKzQ4LDI1IEBACiAJCW1vZGVsLnNldFByb3BlcnR5KEZBQ0VUX1JVTlRJTUUsIHJ1bnRpbWUpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlmaW5hbCBCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3QuajJlZS51aSIpOwotCQlmaW5hbCBVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KCJpY29ucy9lYXItd2l6LWJhbm5lci5naWYiKTsKKwkJZmluYWwgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LmoyZWUudWkiKTsgLy8kTk9OLU5MUy0xJAorCQlmaW5hbCBVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KCJpY29ucy9lYXItd2l6LWJhbm5lci5naWYiKTsgLy8kTk9OLU5MUy0xJAogCiAJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBJRmFjZXRlZFByb2plY3RUZW1wbGF0ZSBnZXRUZW1wbGF0ZSgpIHsKLQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFRlbXBsYXRlKCJ0ZW1wbGF0ZS5qc3QuZWFyIik7CisJCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSgidGVtcGxhdGUuanN0LmVhciIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElXaXphcmRQYWdlIGNyZWF0ZUZpcnN0UGFnZSgpIHsKIAkJcmV0dXJuIG5ldyBFYXJQcm9qZWN0Rmlyc3RQYWdlKG1vZGVsLCAiZmlyc3QucGFnZSIpOyAvLyROT04tTkxTLTEkIAogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpIHsKICAgICAgICAgcmV0dXJuIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX0VBUik7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyU2VsZWN0aW9uUGFuZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclNlbGVjdGlvblBhbmVsLmphdmEKaW5kZXggZjFhZTk3Ni4uMWVjZTdiMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyU2VsZWN0aW9uUGFuZWwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJTZWxlY3Rpb25QYW5lbC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTEzLDggKzEzLDkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudWkucHJvamVjdC5mYWNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5HcmlkRGF0YUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LklXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKQEAgLTU5LDcgKzYwLDcgQEAKICAgICAgICAgCiAgICAgICAgIHRoaXMuYWRkVG9FYXIgPSBuZXcgQnV0dG9uKCBncm91cCwgU1dULkNIRUNLICk7CiAgICAgICAgIHRoaXMuYWRkVG9FYXIuc2V0VGV4dCggUmVzb3VyY2VzLmFkZFRvRWFyTGFiZWwgKTsKLSAgICAgICAgdGhpcy5hZGRUb0Vhci5zZXRMYXlvdXREYXRhKCBnZGhzcGFuKCBuZXcgR3JpZERhdGEoKSwgMyApICk7CisgICAgICAgIEdyaWREYXRhRmFjdG9yeS5kZWZhdWx0c0Zvcih0aGlzLmFkZFRvRWFyKS5zcGFuKDMsIDEpLmFwcGx5VG8odGhpcy5hZGRUb0Vhcik7CiAgICAgICAgIHN5bmNoaGVscGVyLnN5bmNoQ2hlY2tib3goYWRkVG9FYXIsIEFERF9UT19FQVIsIG51bGwpOwogCiAgICAgICAgIGxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTlVMTCk7CkBAIC02OSwxMCArNzAsMTIgQEAKICAgICAgICAgCiAgICAgICAgIHRoaXMubmV3QnV0dG9uID0gbmV3IEJ1dHRvbiggZ3JvdXAsIFNXVC5QVVNIICk7CiAgICAgICAgIHRoaXMubmV3QnV0dG9uLnNldFRleHQoIFJlc291cmNlcy5uZXdCdXR0b25MYWJlbCApOworICAgICAgICBHcmlkRGF0YUZhY3RvcnkuZGVmYXVsdHNGb3IodGhpcy5uZXdCdXR0b24pLmFwcGx5VG8odGhpcy5uZXdCdXR0b24pOwogICAgICAgICAKICAgICAgICAgdGhpcy5uZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKICAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGV2ZW50ICkKKyAgICAgICAgICAgIEBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoIGZpbmFsIFNlbGVjdGlvbkV2ZW50IGV2ZW50ICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBoYW5kbGVBZGRCdXR0b24oKTsKICAgICAgICAgICAgIH0KQEAgLTkwLDEwICs5Myw5IEBACiAgICAgICAgICAgICA9IG5ldyBXaXphcmREaWFsb2coIG5ld0J1dHRvbi5nZXRTaGVsbCgpLCB3aXphcmQgKTsKICAgICAgICAgCiAgICAgICAgIElSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpbW9kZWwuZ2V0UHJvcGVydHkoRkFDRVRfUlVOVElNRSk7Ci0gICAgICAgIFN0cmluZyBlYXJOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoIEoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5FQVJfUFJPSkVDVF9OQU1FICk7CiAgICAgCXdpemFyZC5zZXRSdW50aW1lSW5EYXRhTW9kZWwocnVudGltZSk7Ci0gICAgCXdpemFyZC5zZXRFQVJOYW1lKCBlYXJOYW1lICk7Ci0gICAgICAgIGlmKCBkaWFsb2cub3BlbigpICE9IFNXVC5DQU5DRUwgKQorCisgICAgCWlmKCBkaWFsb2cub3BlbigpICE9IFdpbmRvdy5DQU5DRUwgKQogICAgICAgICB7CiAgICAgICAgICAgICBtb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShFQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVhcnByb2ogPSB3aXphcmQuZ2V0UHJvamVjdE5hbWUoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclNlbGVjdGlvblBhbmVsLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9FYXJTZWxlY3Rpb25QYW5lbC5wcm9wZXJ0aWVzCmluZGV4IDA5ZDg4NWYuLmY3YWIxOTMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L0VhclNlbGVjdGlvblBhbmVsLnByb3BlcnRpZXMKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvRWFyU2VsZWN0aW9uUGFuZWwucHJvcGVydGllcwpAQCAtNyw5ICs3LDkgQEAKICMKICMgQ29udHJpYnV0b3JzOgogIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jCSAgU0FQIEFHIC0gYWRkaW5nIGtleWJvYXJkIHNob3J0Y3V0cworIyAgICAgU0FQIEFHIC0gYWRkaW5nIGtleWJvYXJkIHNob3J0Y3V0cwkKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWFkZFRvRWFyTGFiZWwgPSBBZGQgJnByb2plY3QgdG8gYW4gRUFSCi1uZXdCdXR0b25MYWJlbCA9ICZOZXcuLi4KLWVhclByb2plY3RMYWJlbD1FQVIgUCZyb2plY3QgTmFtZToKLWVhck1lbWJlclNoaXA9RUFSIE1lbWJlcnNoaXAKK2FkZFRvRWFyTGFiZWwgPSAmQWRkIHByb2plY3QgdG8gYW4gRUFSCituZXdCdXR0b25MYWJlbCA9IE5ldyAmUHJvamVjdC4uLgorZWFyUHJvamVjdExhYmVsPSZFQVIgcHJvamVjdCBuYW1lOgorZWFyTWVtYmVyU2hpcD1FQVIgbWVtYmVyc2hpcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvUnVudGltZU1pc21hdGNoTWFya2VyUmVzb2x1dGlvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1J1bnRpbWVNaXNtYXRjaE1hcmtlclJlc29sdXRpb25zLmphdmEKaW5kZXggY2YzZDI2Mi4uYmNjNzc3ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvUnVudGltZU1pc21hdGNoTWFya2VyUmVzb2x1dGlvbnMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9SdW50aW1lTWlzbWF0Y2hNYXJrZXJSZXNvbHV0aW9ucy5qYXZhCkBAIC0xMDUsMTAgKzEwNSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lKCBuYW1lICk7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb2x1dGlvbgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldEluc3RhbGxQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZmE2YjguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcywgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29zdGFAYmVhLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVdGlsaXR5RmFjZXRJbnN0YWxsUGFnZSBleHRlbmRzIEoyRUVNb2R1bGVGYWNldEluc3RhbGxQYWdlIHsKLQlwdWJsaWMgVXRpbGl0eUZhY2V0SW5zdGFsbFBhZ2UoKSB7Ci0JCXN1cGVyKCJ1dGlsaXR5LmZhY2V0Lmluc3RhbGwucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKFJlc291cmNlcy5wYWdlVGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihSZXNvdXJjZXMucGFnZURlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlVGl0bGU7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VEZXNjcmlwdGlvbjsKLQotCQlzdGF0aWMgewotCQkJaW5pdGlhbGl6ZU1lc3NhZ2VzKFV0aWxpdHlGYWNldEluc3RhbGxQYWdlLmNsYXNzLmdldE5hbWUoKSwgUmVzb3VyY2VzLmNsYXNzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtFQVJfUFJPSkVDVF9OQU1FfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJc2V0SW5mb3BvcElEKElKMkVFVUlDb250ZXh0SWRzLk5FV19VVElMSVRZX1dJWkFSRF9QMyk7Ci0JCS8vc2V0dXBFYXJDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RGaXJzdFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlQcm9qZWN0Rmlyc3RQYWdlLmphdmEKaW5kZXggNTJkMGJmZi4uMjliYmViNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RGaXJzdFBhZ2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9VdGlsaXR5UHJvamVjdEZpcnN0UGFnZS5qYXZhCkBAIC0zMCwxMCArMzAsMTEgQEAKIAkJcHVibGljIHN0YXRpYyBTdHJpbmcgcGFnZURlc2NyaXB0aW9uOwogCiAJCXN0YXRpYyB7Ci0JCQlpbml0aWFsaXplTWVzc2FnZXMoVXRpbGl0eUZhY2V0SW5zdGFsbFBhZ2UuY2xhc3MuZ2V0TmFtZSgpLCBSZXNvdXJjZXMuY2xhc3MpOworCQkJaW5pdGlhbGl6ZU1lc3NhZ2VzKFV0aWxpdHlQcm9qZWN0Rmlyc3RQYWdlLmNsYXNzLmdldE5hbWUoKSwgUmVzb3VyY2VzLmNsYXNzKTsKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlRmFjZXRJRCgpIHsKIAkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLlVUSUxJVFk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlQcm9qZWN0Rmlyc3RQYWdlLnByb3BlcnRpZXMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHBsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldEluc3RhbGxQYWdlLnByb3BlcnRpZXMKcmVuYW1lIHRvIHBsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlQcm9qZWN0Rmlyc3RQYWdlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlQcm9qZWN0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9VdGlsaXR5UHJvamVjdFdpemFyZC5qYXZhCmluZGV4IDVhYjQyY2QuLmY4MDE0NDUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlQcm9qZWN0V2l6YXJkLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RXaXphcmQuamF2YQpAQCAtNDMsMjQgKzQzLDI5IEBACiAJCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkpBVkFVVElMX0NPTVBPTkVOVF9XSVpfVElUTEUpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVEYXRhTW9kZWwoKSB7CiAJCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCWZpbmFsIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpIik7Ci0JCWZpbmFsIFVSTCB1cmwgPSBidW5kbGUuZ2V0RW50cnkoImljb25zL3V0aWwtd2l6LWJhbm5lci5naWYiKTsKKwkJZmluYWwgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LmoyZWUudWkiKTsgLy8kTk9OLU5MUy0xJAorCQlmaW5hbCBVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KCJpY29ucy91dGlsLXdpei1iYW5uZXIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKIAkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoInRlbXBsYXRlLmpzdC51dGlsaXR5Iik7CisJCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSgidGVtcGxhdGUuanN0LnV0aWxpdHkiKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBJV2l6YXJkUGFnZSBjcmVhdGVGaXJzdFBhZ2UoKSB7CiAJCXJldHVybiBuZXcgVXRpbGl0eVByb2plY3RGaXJzdFBhZ2UobW9kZWwsICJmaXJzdC5wYWdlIik7IC8vJE5PTi1OTFMtMSQgCiAJfQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgewogICAgICAgICByZXR1cm4gUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfVVRJTElUWSk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvYXBwY2xpZW50L0FwcENsaWVudEZhY2V0SW5zdGFsbFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L2FwcGNsaWVudC9BcHBDbGllbnRGYWNldEluc3RhbGxQYWdlLmphdmEKaW5kZXggYWQ1OTgxYi4uOWVjZWJiYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvYXBwY2xpZW50L0FwcENsaWVudEZhY2V0SW5zdGFsbFBhZ2UuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9hcHBjbGllbnQvQXBwQ2xpZW50RmFjZXRJbnN0YWxsUGFnZS5qYXZhCkBAIC0xMiw3ICsxMiwxMCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LmFwcGNsaWVudDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKQEAgLTIwLDE3ICsyMywxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247CiAKIHB1YmxpYyBjbGFzcyBBcHBDbGllbnRGYWNldEluc3RhbGxQYWdlIGV4dGVuZHMgSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2UgaW1wbGVtZW50cyBJQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7CiAKLQlwcml2YXRlIExhYmVsIGNvbmZpZ0ZvbGRlckxhYmVsOwotCXByaXZhdGUgVGV4dCBjb25maWdGb2xkZXI7CiAJcHJpdmF0ZSBCdXR0b24gY3JlYXRlTWFpbkNsYXNzOwotCXByaXZhdGUgVGV4dCBvdXRwdXRGb2xkZXI7Ci0JcHJpdmF0ZSBMYWJlbCBvdXRwdXRGb2xkZXJMYWJlbDsKIAkKIAlwdWJsaWMgQXBwQ2xpZW50RmFjZXRJbnN0YWxsUGFnZSgpIHsKIAkJc3VwZXIoImFwcGNsaWVudC5mYWNldC5pbnN0YWxsLnBhZ2UiKTsgLy8kTk9OLU5MUy0xJApAQCAtMzgsNDggKzM1LDM0IEBACiAJCXNldERlc2NyaXB0aW9uKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLkFQUF9DTElFTlRfU0VUVElOR1MpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117RUFSX1BST0pFQ1RfTkFNRSwgQ09ORklHX0ZPTERFUiwgQ1JFQVRFX0RFRkFVTFRfTUFJTl9DTEFTUywgT1VUUFVUX0ZPTERFUn07CisJCXJldHVybiBuZXcgU3RyaW5nW117RUFSX1BST0pFQ1RfTkFNRSwgQ09ORklHX0ZPTERFUiwgQ1JFQVRFX0RFRkFVTFRfTUFJTl9DTEFTU307CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7CiAJCXNldEluZm9wb3BJRChJSjJFRVVJQ29udGV4dElkcy5ORVdfQVBQQ0xJRU5UX1dJWkFSRF9QMyk7CiAJCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwogCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7CiAKLQkJY29uZmlnRm9sZGVyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbmZpZ0ZvbGRlckxhYmVsLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuU09VUkNFRk9MREVSKSk7Ci0JCWNvbmZpZ0ZvbGRlckxhYmVsLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQotCQljb25maWdGb2xkZXIgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQljb25maWdGb2xkZXIuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCQljb25maWdGb2xkZXIuc2V0RGF0YSgibGFiZWwiLCBjb25maWdGb2xkZXJMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGNvbmZpZ0ZvbGRlciwgQ09ORklHX0ZPTERFUiwgbnVsbCk7Ci0JCQotCQlvdXRwdXRGb2xkZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJb3V0cHV0Rm9sZGVyTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5PVVRQVVRGT0xERVIpKTsKLQkJb3V0cHV0Rm9sZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCQkKLQkJb3V0cHV0Rm9sZGVyID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJb3V0cHV0Rm9sZGVyLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQkJb3V0cHV0Rm9sZGVyLnNldERhdGEoImxhYmVsIiwgdGhpcy5vdXRwdXRGb2xkZXJMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KG91dHB1dEZvbGRlciwgT1VUUFVUX0ZPTERFUiwgbnVsbCk7Ci0JCQogCQljcmVhdGVNYWluQ2xhc3MgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKIAkJY3JlYXRlTWFpbkNsYXNzLnNldFRleHQoSjJFRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VTdHJpbmcoSjJFRVVJTWVzc2FnZXMuQVBQX0NMSUVOVF9DUkVBVEVfTUFJTikpOwogCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGNyZWF0ZU1haW5DbGFzcywgQ1JFQVRFX0RFRkFVTFRfTUFJTl9DTEFTUywgbnVsbCk7CiAJCQotICAgICAgICBjcmVhdGVHZW5lcmF0ZURlc2NyaXB0b3JDb250cm9sKCBjb21wb3NpdGUgKTsKKyAgICAgICAgY3JlYXRlR2VuZXJhdGVEZXNjcmlwdG9yQ29udHJvbChjb21wb3NpdGUsIEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9TSE9SVF9OQU1FKTsKICAgICAgICAgcmVnaXN0ZXJGYWNldFZlcnNpb25DaGFuZ2VMaXN0ZW5lcigpOwogICAgICAgICAKIAkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwogCQlyZXR1cm4gY29tcG9zaXRlOwogCX0KIAkKLSAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGYWNldFZlcnNpb25DaGFuZ2VkRXZlbnQoKQorICAgIEBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGhhbmRsZUZhY2V0VmVyc2lvbkNoYW5nZWRFdmVudCgpCiAgICAgewogICAgICAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IChJUHJvamVjdEZhY2V0VmVyc2lvbikgdGhpcy5tb2RlbC5nZXRQcm9wZXJ0eSggRkFDRVRfVkVSU0lPTiApOwotICAgICAgICB0aGlzLmFkZERELnNldFZpc2libGUoIGZ2ID09IEFQUExJQ0FUSU9OX0NMSUVOVF81MCApOworICAgICAgICBib29sZWFuIGlzSkVFNU9yR3JlYXRlciA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KGZ2LmdldFZlcnNpb25TdHJpbmcoKSkgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKKyAgICAgICAgdGhpcy5hZGRERC5zZXRWaXNpYmxlKGlzSkVFNU9yR3JlYXRlcik7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9hcHBjbGllbnQvQXBwQ2xpZW50UHJvamVjdEZpcnN0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvYXBwY2xpZW50L0FwcENsaWVudFByb2plY3RGaXJzdFBhZ2UuamF2YQppbmRleCA1Mzc1YmQ5Li5iOWQwZmU0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9hcHBjbGllbnQvQXBwQ2xpZW50UHJvamVjdEZpcnN0UGFnZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L2FwcGNsaWVudC9BcHBDbGllbnRQcm9qZWN0Rmlyc3RQYWdlLmphdmEKQEAgLTEwLDEzICsxMCwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuYXBwY2xpZW50OwogCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0VXRpbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5JSjJFRVVJQ29udGV4dElkczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJTWVzc2FnZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUNvbXBvbmVudEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKIAogcHVibGljIGNsYXNzIEFwcENsaWVudFByb2plY3RGaXJzdFBhZ2UgZXh0ZW5kcyBKMkVFQ29tcG9uZW50RmFjZXRDcmVhdGlvbldpemFyZFBhZ2UgewogCkBAIC0yOCw4ICszNyw0MSBAQAogCQlzZXRJbmZvcG9wSUQoSUoyRUVVSUNvbnRleHRJZHMuTkVXX0FQUENMSUVOVF9XSVpBUkRfUDEpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlRmFjZXRJRCgpIHsKIAkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkFQUExJQ0FUSU9OX0NMSUVOVDsKIAl9CiAKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBnZXRGYWNldENvbmZpZ3VyYXRpb24oIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIHByaW1hcnlGYWNldFZlcnNpb24gKQorCXsKKwkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSltb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpOworCSAgICBmaW5hbCBTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+IGZhY2V0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiggMiApOworCSAgICAKKwkgICAgaWYocnVudGltZSAhPSBudWxsKSB7CisJICAgIAlmYWNldHMuYWRkQWxsKHN1cGVyLmdldEZhY2V0Q29uZmlndXJhdGlvbihwcmltYXJ5RmFjZXRWZXJzaW9uKSk7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCSAgICBmYWNldHMuYWRkKCBwcmltYXJ5RmFjZXRWZXJzaW9uICk7CisJCSAgICAKKwkJICAgIGlmKCBwcmltYXJ5RmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UXzYwKQorCQkgICAgeworCQkgICAgICAgIGZhY2V0cy5hZGQoIEphdmFGYWNldFV0aWxzLkpBVkFfNjAgKTsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYocHJpbWFyeUZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF81MCkKKwkJICAgIHsKKwkJICAgICAgICBmYWNldHMuYWRkKCBKYXZhRmFjZXRVdGlscy5KQVZBXzUwICk7CisJCSAgICB9CisJCSAgICBlbHNlIGlmKCBwcmltYXJ5RmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UXzE0KQorCQkgICAgeworCQkgICAgICAgIGZhY2V0cy5hZGQoIEphdmFGYWNldFV0aWxzLkpBVkFfMTQgKTsKKwkJICAgIH0KKwkJICAgIGVsc2UgaWYoIHByaW1hcnlGYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfMTMgfHwKKwkJICAgICAgICAgICAgIHByaW1hcnlGYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfMTIgKQorCQkgICAgeworCQkgICAgICAgIGZhY2V0cy5hZGQoIEphdmFGYWNldFV0aWxzLkpBVkFfMTMgKTsKKwkJICAgIH0KKwkgICAgfQorCSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KCBmYWNldHMgKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9hcHBjbGllbnQvQXBwQ2xpZW50UHJvamVjdFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9qMmVlX3VpL29yZy9lY2xpcHNlL2pzdC9qMmVlL3VpL3Byb2plY3QvZmFjZXQvYXBwY2xpZW50L0FwcENsaWVudFByb2plY3RXaXphcmQuamF2YQppbmRleCBjZDJmYTc0Li4zYmQwN2EwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL2oyZWVfdWkvb3JnL2VjbGlwc2UvanN0L2oyZWUvdWkvcHJvamVjdC9mYWNldC9hcHBjbGllbnQvQXBwQ2xpZW50UHJvamVjdFdpemFyZC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvajJlZV91aS9vcmcvZWNsaXBzZS9qc3QvajJlZS91aS9wcm9qZWN0L2ZhY2V0L2FwcGNsaWVudC9BcHBDbGllbnRQcm9qZWN0V2l6YXJkLmphdmEKQEAgLTM5LDI0ICszOSwyOSBAQAogCQlzZXRXaW5kb3dUaXRsZShKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5BUFBfQ0xJRU5UX1BST0pFQ1RfV0laX1RJVExFKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElEYXRhTW9kZWwgY3JlYXRlRGF0YU1vZGVsKCkgewogCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFwcENsaWVudEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpIHsKIAkJZmluYWwgQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShKMkVFVUlQbHVnaW4uUExVR0lOX0lEKTsKIAkJZmluYWwgVVJMIHVybCA9IGJ1bmRsZS5nZXRFbnRyeSgiaWNvbnMvZnVsbC93aXpiYW4vYXBwY2xpZW50X3dpei5naWYiKTsgLy8kTk9OLU5MUy0xJAogCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoKSB7CiAJCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSgidGVtcGxhdGUuanN0LmFwcGNsaWVudCIpOyAvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElXaXphcmRQYWdlIGNyZWF0ZUZpcnN0UGFnZSgpIHsKIAkJcmV0dXJuIG5ldyBBcHBDbGllbnRQcm9qZWN0Rmlyc3RQYWdlKG1vZGVsLCAiZmlyc3QucGFnZSIpOyAvLyROT04tTkxTLTEkCiAJfQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmluYWxQZXJzcGVjdGl2ZUlEKCkgewogICAgICAgICByZXR1cm4gUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfQVBQQ0xJRU5UKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wbHVnaW4ucHJvcGVydGllcwppbmRleCA4ODM4ODI4Li45ODI0ZWE3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTIxLDcgKzIxLDcgQEAKIGNyZWF0ZS5lbnRlcnByaXNlLmFwcGxpY2F0aW9uX3VpXz1DcmVhdGUgYW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbgogY3JlYXRlLmNsaWVudC5tb2R1bGVfdWlfPUNyZWF0ZSBhbiBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdAogZWpiLmV4cG9ydC5hY3Rpb24uZGVzY3JpcHRpb25fdWlfPUV4cG9ydCBFSkIgSkFSIEZpbGUuLi4KLXV0aWxpdHlfamFyX2ltcG9ydF93aXphcmQ9SjJFRSBVdGlsaXR5IEphcgordXRpbGl0eV9qYXJfaW1wb3J0X3dpemFyZD1KYXZhIEVFIFV0aWxpdHkgSmFyCiBlYXJfY29tcG9uZW50X3VpXz1FbnRlcnByaXNlIEFwcGxpY2F0aW9uIFByb2plY3QKIG5ldy5lYXIuY29tcG9uZW50LmRlc2NyaXB0aW9uX3VpXz1DcmVhdGUgYSBKYXZhIEVFIEVBUiBwcm9qZWN0CiBhcHBjbGllbnRfY29tcG9uZW50X3VpXz1BcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdApAQCAtMzYsNSArMzYsOCBAQAogZWFyTGlicmFyaWVzQ29udGFpbmVyTmFtZT1FQVIgTGlicmFyaWVzCiAKIEJ1bmRsZS1OYW1lLjAgPSBXVFAgSjJFRSBVSSBQbHVnLWluCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZworQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KIGphdmFlZS51aS5wb3B1cE1lbnU9SmF2YSBFRSBUb29scworCitQcm9qZWN0PVByb2plY3QKK0FkZEphdmFCdWlsZFBhdGhFbnRyaWVzV2l6YXJkRnJhZ21lbnQtTmFtZSA9IEphdmEgQnVpbGQgUGF0aCBFbnRyaWVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wbHVnaW4ueG1sCmluZGV4IGYzMzM4ODYuLjQzNGE5MGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcGx1Z2luLnhtbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3BsdWdpbi54bWwKQEAgLTcsNiArNywxMCBAQAogICAgICBuYW1lPSJBcmNoaXZlIEV4cG9ydCBQYXJ0aWNpcGFudCBQYW5lbHMgRXh0ZW5zaW9uIFBvaW50IiAKICAgICAgc2NoZW1hPSJzY2hlbWEvYXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50UGFuZWxzLmV4c2QiLz4KIAorCTxleHRlbnNpb24tcG9pbnQgaWQ9IkphdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5kZXIiIAorCSBuYW1lPSJKYXZhRUVQcmVmZXJlbmNlUGFnZSIKKwkgc2NoZW1hPSJzY2hlbWEvSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbmRlci5leHNkIi8+CisJIAkgCiA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KIDwhLS0gUHJvamVjdCBXaXphcmQgQ29udHJpYnV0aW9ucyAgIC0tPgogPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CkBAIC0zMDYsMTQgKzMxMCw2IEBACiAgICAgICAgICAJICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiPgogICAgICAgICAgPC92aWV3PgogICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgICAgIDxhZGFwdGVyRmFjdG9yeQotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5KMkVFTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJtb2R1bGVtYXAueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVNb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICAgPHZpZXcgCi0gICAgICAgICAJICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiPgotICAgICAgICAgPC92aWV3PgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KICAgIDwvZXh0ZW5zaW9uPgogICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+CiAgICAgICA8b2JqZWN0Q29udHJpYnV0aW9uIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIgYWRhcHRhYmxlPSJ0cnVlIiBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudWkucG9wdXBNZW51Ij4KQEAgLTM1MSw2ICszNDcsMTMgQEAKICAgICAgICAgIDwvYWN0aW9uPgogICAgICAgICAgPGVuYWJsZW1lbnQ+CiAJCSAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KKwkJICAgICAgIDxhbmQ+CisKKwkJICAgICAgICAgICA8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmFjdGlvbnMuc2hvdyIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkZvcmNlQ2xhc3NwYXRoVXBkYXRlQWN0aW9uIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJICAJCTxvcj4KIAkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgogCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCkBAIC0zNzEsNiArMzc0LDcgQEAKIAkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgogCQkJCQkJCXZhbHVlPSJqc3QuY29ubmVjdG9yIiAvPgogCQkJCTwvb3I+CisJCQkJPC9hbmQ+CiAJCQk8L2FkYXB0PgogCQk8L2VuYWJsZW1lbnQ+CiAgICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KQEAgLTQ4OSw0NSArNDkzLDEyIEBACiAgICA8L2V4dGVuc2lvbj4gLS0+CiA8IS0tIE5hdmlnYXRvciBPYmplY3QgQ29udHJpYnV0aW9ucyAtLT4KIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgorICAKICAKICAgICAgCiA8IS0tID09PT09PT09PT09IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVEZXBlbmRlbmN5UGFnZSA9PT09PT09PT09PT0gLS0+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICAJCW5hbWU9IiVKMkVFRGVwZW5kZW5jaWVzUGFnZS5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVEZXBlbmRlbmNpZXNQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVEZXBlbmRlbmNpZXNQYWdlIj4KLSAgICAgICAgICAgPGVuYWJsZWRXaGVuPgotCQkJPGFuZD4KLQkJCQk8YWRhcHQKLQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQk8b3I+IAotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWIiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVqYiIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QudXRpbGl0eSIgLz4KLQkJCQkJCTx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3QuZWFyIiAvPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5hcHBjbGllbnQiIC8+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmNvbm5lY3RvciIgLz4KLQkJCQkJPC9vcj4KLQkJCQk8L2FkYXB0PgotCQkJPC9hbmQ+IAotICAgICAgICAgPC9lbmFibGVkV2hlbj4gICAgICAgICAgCi0gICAgICA8L3BhZ2U+Ci0gICAgICAKKworICAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KICAgICAgIDxwYWdlCiAgICAgICAJCWFkYXB0YWJsZT0idHJ1ZSIKICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKQEAgLTc0OCwxMSArNzE5LDYgQEAKICAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+CiAgIDwvZXh0ZW5zaW9uPgogICAgICAgCi0gICAgPGV4dGVuc2lvbgotICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQ29tcG9uZW50UHJvamVjdE1pZ3JhdG9yIj4KLSAgICAgICA8bWlncmF0b3JFeHRlbnNpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb21wb25lbnRQcm9qZWN0TWlncmF0b3IiLz4KLSAgICA8L2V4dGVuc2lvbj4KLSAgIAogICAgPGV4dGVuc2lvbiAKICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlDb250ZXh0U2Vuc2l0aXZlQ2xhc3MiPgogICAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwpAQCAtNzkxLDQgKzc1NywxMDAgQEAKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGUuY29udGFpbmVyIj4KICAgICA8L2NsYXNzcGF0aENvbnRhaW5lclBhZ2U+CiAgIDwvZXh0ZW5zaW9uPgorCisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisgICAgIDxwYWdlCisgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5KYXZhRUVQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByZWZlcmVuY2VQYWdlcy5KYXZhRUUiCisgICAgICAgICAgIG5hbWU9IiVqMmVlIj4KKyAgICAgPC9wYWdlPgorICA8L2V4dGVuc2lvbj4KKworICA8ZXh0ZW5zaW9uCisgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS5tb2R1bGVEZXBlbmRlbmN5UHJvcGVydHlQYWdlIj4KKyAgICAgPGRlcGVuZGVuY3lQYWdlCisgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnByZWZlcmVuY2VzLkVhck1vZHVsZURlcGVuZGVuY3lQYWdlUHJvdmlkZXIiCisgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnByZWZlcmVuY2VzLkVhck1vZHVsZURlcGVuZGVuY3lQYWdlUHJvdmlkZXIiPgorICAgICA8L2RlcGVuZGVuY3lQYWdlPgorICA8L2V4dGVuc2lvbj4KKworCisgIDwhLS0gCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqIFdUUCBVc2VyIExpYnJhcnkgUHJvdmlkZXIgKgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC0tPgorICAgICAgICAgCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5saWJyYXJ5UHJvdmlkZXJBY3Rpb25QYW5lbHMiPgorICAgIDxwYW5lbCAKKyAgICAgIHByb3ZpZGVyPSJ3dHAtdXNlci1saWJyYXJ5LXByb3ZpZGVyIgorICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLld0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWwiLz4KKyAgPC9leHRlbnNpb24+CisKKyAgPCEtLSAKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiBXVFAgT1NHaSBCdW5kbGVzIExpYnJhcnkgUHJvdmlkZXIgKgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLS0+CisgICAgICAgICAKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmxpYnJhcnlQcm92aWRlckFjdGlvblBhbmVscyI+CisgICAgPHBhbmVsIAorICAgICAgcHJvdmlkZXI9Ind0cC1vc2dpLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIKKyAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5XdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxQYW5lbCIvPgorICA8L2V4dGVuc2lvbj4KKyAgCisgIAorICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkubW9kdWxlRGVwZW5kZW5jeVByb3BlcnR5UGFnZSI+CisgICAgIDxkZXBlbmRlbmN5UGFnZQorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkuSjJFRURlcGVuZGVuY3lQYWdlUHJvdmlkZXIiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5KMkVFRGVwZW5kZW5jeVBhZ2VQcm92aWRlciI+CisgICAgIDwvZGVwZW5kZW5jeVBhZ2U+CisgIDwvZXh0ZW5zaW9uPgorICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkudmlydHVhbENvbXBvbmVudExhYmVsUHJvdmlkZXIiPgorICAgICA8cHJvdmlkZXIKKyAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnVpLnByZWZlcmVuY2VzLkNsYXNzcGF0aERlcGVuZGVuY3lDb21wb25lbnRMYWJlbFByb3ZpZGVyIgorICAgICAgICAgICB3ZWlnaHQ9IjUiPgorICAgICA8L3Byb3ZpZGVyPgorICA8L2V4dGVuc2lvbj4KKyAgCisgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS5yZWZlcmVuY2VXaXphcmRGcmFnbWVudCI+CisgICAgIDxyZWZlcmVuY2VGcmFnbWVudAorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuQ3VzdG9tRUFSUHJvamVjdFJlZmVyZW5jZVdpemFyZEZyYWdtZW50IgorICAgICAgICAgICBoaWRkZW49InRydWUiCisgICAgICAgICAgIGljb249Imljb25zL3Byal9vYmouZ2lmIgorICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuQ3VzdG9tRUFSUHJvamVjdFJlZmVyZW5jZVdpemFyZEZyYWdtZW50IgorICAgICAgICAgICBuYW1lPSIlUHJvamVjdCI+CisgICAgIDwvcmVmZXJlbmNlRnJhZ21lbnQ+CisgIDwvZXh0ZW5zaW9uPgorICAKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnVpLnJlZmVyZW5jZVdpemFyZEZyYWdtZW50Ij4KKyAgICA8cmVmZXJlbmNlRnJhZ21lbnQKKyAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS5BZGRKYXZhQnVpbGRQYXRoRW50cmllc1dpemFyZEZyYWdtZW50IgorICAgICAgaWNvbj0iaWNvbnMvdXRpbC13aXotaWNvbi5naWYiCisgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkuQWRkSmF2YUJ1aWxkUGF0aEVudHJpZXNXaXphcmRGcmFnbWVudCIKKyAgICAgIG5hbWU9IiVBZGRKYXZhQnVpbGRQYXRoRW50cmllc1dpemFyZEZyYWdtZW50LU5hbWUiPgorICAgICAgPGVuYWJsZW1lbnQ+CisgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIHZhbHVlPSJqYXZhIiBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KKyAgICAgIDwvZW5hYmxlbWVudD4KKyAgICA8L3JlZmVyZW5jZUZyYWdtZW50PgorICA8L2V4dGVuc2lvbj4KKyAgCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS51aS5kZXBsb3ltZW50QXNzZW1ibHlWZXJpZmllciI+CisgICAgICAgPHZlcmlmaWVyCisgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UudmVyaWZpZXIuRGVmYXVsdERlcGxveW1lbnRBc3NlbWJseVZlcmlmaWVyIj4KKwkgICAgICAgIDxydW50aW1lIHJ1bnRpbWVfc2VydmVyX2lkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUudWkuZGVwbG95bWVudEFzc2VtYmx5VmVyaWZpZXIuYW55cnVudGltZSIvPgorICAgICAgICAgCTxjb21wb25lbnQgY29tcG9uZW50X3R5cGU9ImpzdC5lYXIiLz4KKyAgICAgICAgCTxjb21wb25lbnQgY29tcG9uZW50X3R5cGU9ImpzdC5lamIiLz4KKyAgICAgICAgCTxjb21wb25lbnQgY29tcG9uZW50X3R5cGU9ImpzdC53ZWIiLz4KKyAgICAgICAgCTxjb21wb25lbnQgY29tcG9uZW50X3R5cGU9ImpzdC53ZWJmcmFnbWVudCIvPgorICAgICAgICAJPGNvbXBvbmVudCBjb21wb25lbnRfdHlwZT0ianN0LmNvbm5lY3RvciIvPgorICAgICAgICAJPGNvbXBvbmVudCBjb21wb25lbnRfdHlwZT0ianN0LmFwcGNsaWVudCIvPgorICAgICAgICAJPGNvbXBvbmVudCBjb21wb25lbnRfdHlwZT0ianN0LnV0aWxpdHkiLz4KKyAgICAgICA8L3ZlcmlmaWVyPgorICAgIDwvZXh0ZW5zaW9uPgorICAKIDwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9qMmVlX3VpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2oyZWVfdWkucHJvcGVydGllcwppbmRleCBjOWIxYTc2Li43ZTE2MzMzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2oyZWVfdWkucHJvcGVydGllcworKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL2oyZWVfdWkucHJvcGVydGllcwpAQCAtOSw3ICs5LDcgQEAKICMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAxPVByb2plY3QgbG9jYXRpb246Ci0yPVRhcmdldCBydW50aW1lOgorMj0mVGFyZ2V0IHJ1bnRpbWU6CiAzPUoyRUUgdmVyc2lvbjoKIDQ9RmFpbGVkIHRvIGZpbmQgdGhlIGltYWdlICJ7MH0iLgogNT1OZXcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBQcm9qZWN0CkBAIC0yMCw3ICsyMCw3IEBACiAxMD0mU2VsZWN0IEFsbAogMTE9JkRlc2VsZWN0IEFsbAogMTI9TmV3ICZNb2R1bGUuLi4KLTEzPUVBUiBwcm9qZWN0OgorMTM9RUFSICZwcm9qZWN0OgogMTQ9TiZldy4uLgogMTRhPU5lJncuLi4KIDE1PUFkZCBtb2R1bGUgdG8gYW4gRUFSIGFwcGxpY2F0aW9uLgpAQCAtMjgsMTAgKzI4LDEwIEBACiAxNz1DcmVhdGUgYSBuZXcgbW9kdWxlIHByb2plY3QgZm9yIHRoZSBzZWxlY3RlZCBtb2R1bGUgdHlwZQogMTg9TmV3IE1vZHVsZSBQcm9qZWN0CiAxOT1DcmVhdGUgZGVmYXVsdCBtb2R1bGUgcHJvamVjdHMuCi0yMD1BcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdDoKLTIxPUVKQiBwcm9qZWN0OgorMjA9QXBwbGljYXRpb24gQ2xpZW50ICZwcm9qZWN0OgorMjE9RUpCIHBybyZqZWN0OgogMjI9V2ViIHByb2plY3Q6Ci0yMz1Db25uZWN0b3IgcHJvamVjdDoKKzIzPUNvbm5lY3RvciAmcHJvamVjdDoKIDI0PU5ldyBBcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdAogMjU9QXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZQogMjY9Q3JlYXRlIGFuIEFwcGxpY2F0aW9uIENsaWVudCBwcm9qZWN0IGFuZCBhZGQgaXQgdG8gYSBuZXcgb3IgZXhpc3RpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0CkBAIC00MCwzOSArNDAsMzkgQEAKIDI5PUF2YWlsYWJsZSBkZXBlbmRlbnQgSkFSczoKIDMwPU1hbmlmZXN0IENsYXNzLVBhdGg6CiAzMT1KQVIvTW9kdWxlCi0zMj1Qcm9qZWN0OgorMzI9JlByb2plY3Q6CiAzMz1OZXcKIDM0PUltcG9ydCBhbiBBcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdCBmcm9tIHRoZSBmaWxlIFN5c3RlbQogMzU9QXBwbGljYXRpb24gQ2xpZW50IEltcG9ydAotMzY9QXBwbGljYXRpb24gQ2xpZW50IGZpbGU6Ci0zNz1BcHBsaWNhdGlvbiBDbGllbnQgcHJvamVjdDoKKzM2PUFwcGxpY2F0aW9uIENsaWVudCBmaSZsZToKKzM3PUFwcGxpY2F0aW9uIENsaWVudCBwcm8mamVjdDoKIDM4PUltcG9ydAogMzk9SW1wb3J0IGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBiYXNlZCBvbiBzZWxlY3RlZCByZXNvdXJjZXMuCiA0MD1FbnRlcnByaXNlIEFwcGxpY2F0aW9uIEltcG9ydAotNDE9RUFSIGZpbGU6Cis0MT1FQVIgZmkmbGU6CiA0Mj1PdmVyd3JpdGUgZXhpc3RpbmcgcmVzb3VyY2VzIHdpdGhvdXQgd2FybmluZy4KIDQzPVByb2plY3QgaW1wb3J0CiA0ND1PcHRpbWl6ZWQ6IG1ha2UgYmluYXJ5IHByb2plY3RzIGZvciBFSkIsIGNsaWVudCwgYW5kIHV0aWxpdHkgSkFScwogNDU9RXhwYW5kZWQ6IGV4dHJhY3QgcHJvamVjdCBjb250ZW50cyBmb3IgZGV2ZWxvcG1lbnQKIDQ2PUltcG9ydCBmb3IgcGFydGlhbCBFQVIgZGV2ZWxvcG1lbnQKLTQ3PVNlbGVjdCBBbGwKLTQ4PURlc2VsZWN0IEFsbAorNDc9JlNlbGVjdCBBbGwKKzQ4PSZEZXNlbGVjdCBBbGwKIDQ5PVV0aWxpdHkgSkFScyBhbmQgd2ViIGxpYnJhcmllcwogNTA9U2VsZWN0IHRoZSB1dGlsaXR5IEpBUnMgZnJvbSB0aGUgbGlzdCB0byBiZSBpbXBvcnRlZCBhcyB1dGlsaXR5IHByb2plY3RzLiBVbnNlbGVjdGVkIEpBUnMgd2lsbCBiZSBpbXBvcnRlZCBhcyBcbnV0aWxpdHkgSkFScyBpbiB0aGUgRUFSLgotNTE9RW50ZXIgdGhlIG5ldyBwcm9qZWN0IG5hbWUgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoZSBpbXBvcnRlZCBtb2R1bGUgZmlsZSBieSBzZWxlY3RpbmcgdGhlIHNlY29uZCBjb2x1bW4gb2YgdGhlIHRhYmxlIGZvciBlZGl0LgorNTE9RW50ZXIgdGhlIG5ldyBwcm9qZWN0IG5hbWUgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRoZSBpbXBvcnRlZCBtb2R1bGUgZmlsZSBieSBzZWxlY3RpbmcgdGhlIHNlY29uZCBjb2x1bW4gb2YgdGhlIHRhYmxlIGZvciBlZGl0LiBVbnNlbGVjdGVkIG1vZHVsZXMgd2lsbCBiZSBpbXBvcnRlZCBhcyBKQVJzIGluIHRoZSBFQVIuCiA1Mj1FQVIgTW9kdWxlIGFuZCBVdGlsaXR5IEpBUiBQcm9qZWN0cwogNTM9UHJvamVjdCBsb2NhdGlvbnMKIDU0PVRoaXMgaXMgdGhlIHBhcmVudCBkaXJlY3RvcnkgZm9yIGFsbCByZWZlcmVuY2VkIHByb2plY3RzLiBBIHN1YmRpcmVjdG9yeSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggcHJvamVjdC4KLTU1PU1vZHVsZSBSb290IExvY2F0aW9uOgorNTU9Jk1vZHVsZSByb290IGxvY2F0aW9uOgogCiA1Nz1TZWxlY3QgdGhlIGxvY2F0aW9uIGRpcmVjdG9yeQogNTg9TW9kdWxlcyBpbiBFQVIKIDU5PU5ldyBQcm9qZWN0IE5hbWUKIDYwPWZpbGVuYW1lcwogNjE9cHJvamVjdG5hbWVzCi02Mj1EZXN0aW5hdGlvbjoKLTYzPU92ZXJ3cml0ZSBleGlzdGluZyBmaWxlCi02ND1FeHBvcnQgc291cmNlIGZpbGVzCis2Mj0mRGVzdGluYXRpb246Cis2Mz1PdmVyJndyaXRlIGV4aXN0aW5nIGZpbGUKKzY0PUV4cG9ydCAmc291cmNlIGZpbGVzCiA2NT1BcHBsaWNhdGlvbiBDbGllbnQgRXhwb3J0CiA2Nj1FeHBvcnQgQXBwbGljYXRpb24gQ2xpZW50IHByb2plY3QgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgogNjc9RXhwb3J0CkBAIC04Myw3ICs4Myw3IEBACiA3Mj1JbmNsdWRlCiA3ND1BbGxvdyBuZXN0ZWQgcHJvamVjdHMgb3ZlcndyaXRlcyAobW9kdWxlIGFuZCB1dGlsaXR5IHByb2plY3RzKQogNzU9RGVsZXRlIHByb2plY3Qgb24gb3ZlcndyaXRlCi03Nj1FQVIgcHJvamVjdDoKKzc2PUVBUiBwcm8mamVjdDoKIAogI21pZ3JhdGlvbiBzdHJpbmdzCiA3Nz1FcnJvcgpAQCAtOTMsMjIgKzkzLDIyIEBACiA4MT1JbmZvcm1hdGlvbgogODI9VGhlIGNob3NlbiBvcGVyYXRpb24gaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuCiAKLTkwPUNyZWF0ZSBhbiBFSkIgQ2xpZW50IEpBUiBtb2R1bGUgdG8gaG9sZCB0aGUgY2xpZW50IGludGVyZmFjZXMgYW5kIGNsYXNzZXMuCis5MD0mQ3JlYXRlIGFuIEVKQiBDbGllbnQgSkFSIG1vZHVsZSB0byBob2xkIHRoZSBjbGllbnQgaW50ZXJmYWNlcyBhbmQgY2xhc3NlcwogOTE9R2VuZXJhdGUgYW4gYW5ub3RhdGVkIGJlYW4gY2xhc3MKIDkyPUFkZCBzdXBwb3J0IGZvciBhbm5vdGF0ZWQgSmF2YSBjbGFzc2VzCi05Mz1CJnJvd3NlLi4uCis5Mz1CciZvd3NlLi4uCiA5ND1OYSZtZToKLTk1PUNyZWF0ZSBhIGRlZmF1bHQgTWFpbiBjbGFzcworOTU9JkNyZWF0ZSBhIGRlZmF1bHQgTWFpbiBjbGFzcwogOTY9Q3JlYXRlIGEgZGVmYXVsdCBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuCi05OD1HZW5lcmF0ZSBhIFhEb2NsZXQgYW5ub3RhdGVkIGNsYXNzCis5OD0mR2VuZXJhdGUgYSBYRG9jbGV0IGFubm90YXRlZCBjbGFzcwogCi05Nz1TZWxlY3QgdGhlIHV0aWxpdHkgSkFScyBmcm9tIHRoZSBsaXN0IHRvIGJlIGltcG9ydGVkIGFzIHV0aWxpdHkgcHJvamVjdHMgb3IgamFycy4KKzk3PVNlbGVjdCB0aGUgdXRpbGl0eSBKQVJzIGZyb20gdGhlICZsaXN0IHRvIGJlIGltcG9ydGVkIGFzIHV0aWxpdHkgcHJvamVjdHMgb3IgamFyczoKIDk5PVByb2plY3QgTmFtZToKIDEwMD1Nb2R1bGUgVmVyc2lvbjoKIDEwMT1Db25maWd1cmUgQXBwbGljYXRpb24gQ2xpZW50IG1vZHVsZSBzZXR0aW5ncy4KIDEwMj1Db250ZW50IEZvbGRlcjoKLTEwMz1UYXJnZXQgUnVudGltZQotRW50aXR5X1VJXz1FbnRpdHkgQmVhbnMoMS54LTIueCkKKzEwMz0mVGFyZ2V0IHJ1bnRpbWUKK0VudGl0eV9VSV89RW50aXR5IEJlYW5zICgxLngtMi54KQogTWVzc2FnZV9Ecml2ZW5fQmVhbnNfVUlfPU1lc3NhZ2UtRHJpdmVuIEJlYW5zCiBTZXNzaW9uX0JlYW5zX1VJXz1TZXNzaW9uIEJlYW5zCiBFSkJfQ2xhc3NfVUlfPUVKQiBDbGFzczogezB9CkBAIC0xNTMsMTAgKzE1MywxMCBAQAogREVQTE9ZX1JVTlRJTUVfQ09ORklHVVJFRD1UYXJnZXQgcnVudGltZSBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseSBmb3IgcHJvamVjdCB7MH0uCiBERVBMT1lfUFJPSkVDVF9OT1RfU1VQUE9SVEVEPVByb2plY3QgezB9IGNhbm5vdCBiZSBkZXBsb3llZCB3aXRoIGNvbmZpZ3VyZWQgcnVudGltZSBvciBpbnN0YWxsZWQgZmFjZXRzLgogCi1OZXdNb2R1bGVTZWxlY3Rpb25QYWdlLmFwcENsaWVudD1BcHBsaWNhdGlvbiBDbGllbnQKLU5ld01vZHVsZVNlbGVjdGlvblBhZ2UuZWpiPUVudGVycHJpc2UgSmF2YSBCZWFuCi1OZXdNb2R1bGVTZWxlY3Rpb25QYWdlLndlYj1XZWIKLU5ld01vZHVsZVNlbGVjdGlvblBhZ2UuamNhPUNvbm5lY3RvcgorTmV3TW9kdWxlU2VsZWN0aW9uUGFnZS5hcHBDbGllbnQ9JkFwcGxpY2F0aW9uIENsaWVudAorTmV3TW9kdWxlU2VsZWN0aW9uUGFnZS5lamI9JkVudGVycHJpc2UgSmF2YSBCZWFuCitOZXdNb2R1bGVTZWxlY3Rpb25QYWdlLndlYj0mV2ViCitOZXdNb2R1bGVTZWxlY3Rpb25QYWdlLmpjYT0mQ29ubmVjdG9yCiAKIE5ld0FwcGxDbGllbnRNb2R1bGVBY3Rpb25fVUlfMD1BcHBsaWNhdGlvbiBDbGllbnQgTW9kdWxlCiBOZXdDb250ZXh0Um9vdD1OZXcgY29udGV4dCByb290OgpAQCAtMTY1LDExICsxNjUsMTEgQEAKIEoyRUVQcm9qZWN0Q3JlYXRpb25QYWdlX1VJXzE9U2hvdyAmQWR2YW5jZWQgPj4KIEoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV8wPVV0aWxpdHkgSmFyIEltcG9ydAogSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzE9SW1wb3J0IGRlcGVuZGVudCBVdGlsaXR5IEphcnMgZm9yIEphdmEgRUUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMKLUoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV8yPUF2YWlsYWJsZSBVdGlsaXR5IEphcnMgRGlyZWN0b3J5Ci1KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfMz1FeHRlcm5hbCBKYXIgRGlyZWN0b3J5OgotSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzQ9TGlua2VkIFBhdGggVmFyaWFibGUKLUoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV81PU1ha2UgdGhlc2UgaW1wb3J0ZWQgZmlsZXMgdGVhbS1zaGFyZWFibGUgYnkgY3JlYXRpbmcgb3IgcmUtdXNpbmcgYSBMaW5rZWQgUGF0aCBWYXJpYWJsZSAoTFBWKS4gU2VsZWN0IGFuIGV4aXN0aW5nIExQViBvciB0eXBlIGEgbmV3IG5hbWUgdG8gY3JlYXRlIG9uZSB0byB0aGUgZGlyZWN0b3J5IGFib3ZlLiBPdGhlciB0ZWFtbWF0ZXMgc2hvdWxkIGRlZmluZSB0aGlzIHZhbHVlIHRocm91Z2ggV2luZG93ID4gUHJlZmVyZW5jZXMgfCBXb3JrYmVuY2ggPiBMaW5rZWQgUmVzb3VyY2VzLiBUaGlzIG9wdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgbGlua2VkIGltcG9ydHMuCi1KMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfNj1PdmVyd3JpdGUgRXhpc3RpbmcgUmVzb3VyY2VzIChwcm9qZWN0cyBhbmQgYXJjaGl2ZXMpCitKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfMj1BdmFpbGFibGUgdXRpbGl0eSBKQVJzIGRpcmVjdG9yeQorSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzM9JkV4dGVybmFsIEpBUiBkaXJlY3Rvcnk6CitKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfND1MaW5rZWQgcGF0aCB2YXJpYWJsZQorSjJFRVV0aWxpdHlKYXJJbXBvcnRQYWdlX1VJXzU9TWFrZSB0aGVzZSBpbXBvcnRlZCBmaWxlcyB0ZWFtLXNoYXJlYWJsZSBieSBjcmVhdGluZyBvciByZS11c2luZyBhIGxpbmtlZCBwYXRoIHZhcmlhYmxlIChMUFYpLiBTZWxlY3QgYW4gZXhpc3RpbmcgTFBWIG9yIHR5cGUgYSBuZXcgbmFtZSB0byBjcmVhdGUgb25lIHRvIHRoZSBkaXJlY3RvcnkgYWJvdmUuIE90aGVyIHRlYW1tYXRlcyBzaG91bGQgZGVmaW5lIHRoaXMgdmFsdWUgdGhyb3VnaCBXaW5kb3cgPiBQcmVmZXJlbmNlcyB8IFdvcmtiZW5jaCA+IExpbmtlZCBSZXNvdXJjZXMuIFRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBsaW5rZWQgaW1wb3J0cy4KK0oyRUVVdGlsaXR5SmFySW1wb3J0UGFnZV9VSV82PU92ZXImd3JpdGUgZXhpc3RpbmcgcmVzb3VyY2VzIChwcm9qZWN0cyBhbmQgYXJjaGl2ZXMpCiBKMkVFVXRpbGl0eUphckltcG9ydFBhZ2VfVUlfNz1TZWxlY3QgVXRpbGl0eSBKYXI6CiBKMkVFVXRpbGl0eUphckltcG9ydFBhZ2UuMD1Vc2UgRXhpc3RpbmcgTGlua2VkIFBhdGggVmFyaWFibGUKIEoyRUVVdGlsaXR5SmFySW1wb3J0UGFnZS4xPUxpbmtlZCBQYXRoIFZhcmlhYmxlOiAKQEAgLTE4MSwxNSArMTgxLDE1IEBACiBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzA9VXRpbGl0eSBKYXIgSW1wb3J0CiBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzE9SW1wb3J0IGRlcGVuZGVudCBVdGlsaXR5IEphcnMgZm9yIEphdmEgRUUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbnMKIEoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMj1TZWxlY3QgaW1wb3J0IHR5cGUKLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMz1DcmVhdGUgSmF2YSBQcm9qZWN0cyBmcm9tIFV0aWxpdHkgSmFycwotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV80PUNyZWF0ZSBsaW5rZWQgSmF2YSBQcm9qZWN0cyBmcm9tIFV0aWxpdHkgSmFycwotSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV81PUNvcHkgVXRpbGl0eSBKYXJzIGludG8gYW4gZXhpc3RpbmcgRUFSIGZyb20gYW4gZXh0ZXJuYWwgbG9jYXRpb24KLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfNj1DcmVhdGUgTGlua2VkIFV0aWxpdHkgSmFycyBpbiBhbiBleGlzdGluZyBFQVIgZnJvbSBhbiBleHRlcm5hbCBsb2NhdGlvbgorSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8zPUNyZWF0ZSAmSmF2YSBwcm9qZWN0cyBmcm9tIHV0aWxpdHkgSkFScworSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV80PUNyZWF0ZSAmbGlua2VkIEphdmEgcHJvamVjdHMgZnJvbSB1dGlsaXR5IEpBUnMKK0oyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfNT1Db3AmeSB1dGlsaXR5IEpBUnMgaW50byBhbiBleGlzdGluZyBFQVIgZnJvbSBhbiBleHRlcm5hbCBsb2NhdGlvbgorSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV82PSZDcmVhdGUgbGlua2VkIHV0aWxpdHkgSkFScyBpbiBhbiBleGlzdGluZyBFQVIgZnJvbSBhbiBleHRlcm5hbCBsb2NhdGlvbgogSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV83PVByb2plY3QgaW1wb3J0IG9wdGlvbnMKLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfOD1TZWxlY3QgRUFSIFByb2plY3QKLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfOT1FQVIgUHJvamVjdDoKK0oyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfOD1TZWxlY3QgRUFSIHByb2plY3QKK0oyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfOT1FQVIgJnByb2plY3Q6CiBKMkVFVXRpbGl0eUphckltcG9ydFR5cGVQYWdlX1VJXzEwPUNyZWF0ZSBCaW5hcnkgUHJvamVjdHMKLUoyRUVVdGlsaXR5SmFySW1wb3J0VHlwZVBhZ2VfVUlfMTE9T3ZlcnJpZGUgUHJvamVjdCBSb290IChTcGVjaWZ5IGxvY2F0aW9uIGJlbG93KQorSjJFRVV0aWxpdHlKYXJJbXBvcnRUeXBlUGFnZV9VSV8xMT1PdmVycmlkZSBwcm9qZWN0ICZyb290IChzcGVjaWZ5IGxvY2F0aW9uIGJlbG93KQogCiBEZXBsb3ltZW50X0Rlc2NyaXB0b3JfVUlfPURlcGxveW1lbnQgRGVzY3JpcHRvcgogCkBAIC0yMTAsNyArMjEwLDYgQEAKIFJlbmFtZUNvbnRleHRSb290RnJvbVh0b1k9UmVuYW1lIGNvbnRleHQgcm9vdCBmcm9tICJ7MH0iIHRvICJ7MX0iCiBBbHNvX3JlbmFtZV9tb2R1bGVfYW5kX3V0aWxpdHlfSmF2YV9wcm9qZWN0c18xMz1BbHNvIHJlbmFtZSBtb2R1bGUgYW5kIHV0aWxpdHkgSmF2YSBwcm9qZWN0cwogUHJvamVjdF9hbHJlYWR5X2V4aXN0cy49UHJvamVjdCB7MH0gYWxyZWFkeSBleGlzdHMuCi1Qcm9qZWN0X3Nob3VsZF9ub3RfYmVfbnVsbF8xX0VYQ189SVdBRTAwMjFFIFByb2plY3Qgc2hvdWxkIG5vdCBiZSBudWxsCiBOb24tcHJvamVjdF9pbl9zZWxlY3Rpb25fMl9FUlJPUl89SVdBRTAwMjRFIE5vbi1wcm9qZWN0IGluIHNlbGVjdGlvbgogCiAKQEAgLTIzMCw4ICsyMjksNiBAQAogRmlsZUltcG9ydC5vdmVyd3JpdGVFeGlzdGluZz1PdmVyd3JpdGUgZXhpc3RpbmcgcmVzb3VyY2VzIHdpdGhvdXQgd2FybmluZwogRGF0YVRyYW5zZmVyLnNlbGVjdEFsbD1TZWxlY3QgQWxsCiBEYXRhVHJhbnNmZXIuZGVzZWxlY3RBbGw9RGVzZWxlY3QgQWxsCi1JbXBvcnRfQ2xhc3NfRmlsZXNfVUk9SW1wb3J0Ci1GaWxlSW1wb3J0LnNlbGVjdFNvdXJjZT1TZWxlY3QgYSBkaXJlY3RvcnkgdG8gaW1wb3J0IGZyb20uCiBJbmNvbnNpc3RlbnRfRmlsZXNfMz1JbmNvbnNpc3RlbnQgRmlsZXMKIFRoZV9mb2xsb3dpbmdfd29ya3NwYWNlX2ZpbGVzX2FyZV9pbmNvbnNpc3RlbnRfd2l0aF90aGVfZWRpdG9yXzQ9VGhlIGZvbGxvd2luZyB3b3Jrc3BhY2UgZmlsZXMgYXJlIGluY29uc2lzdGVudCB3aXRoIHRoZSBlZGl0b3I6IFxuCiBVcGRhdGVfdGhlX2VkaXRvcl93aXRoX3RoZV93b3Jrc3BhY2VfY29udGVudHNfXzU9VXBkYXRlIHRoZSBlZGl0b3Igd2l0aCB0aGUgd29ya3NwYWNlIGNvbnRlbnRzPwpAQCAtMjcxLDcgKzI2OCw3IEBACiBDT05ORUNUT1JfMTBfREVTQ1JJUFRJT049Q29ubmVjdG9yIEFyY2hpdGVjdHVyZSAxLjAgbW9kdWxlcyBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBKYXZhIEVFIDEuMyBFbnRlcnByaXNlIEFwcGxpY2F0aW9ucy4KIENPTk5FQ1RPUl8xNV9ERVNDUklQVElPTj1Db25uZWN0b3IgQXJjaGl0ZWN0dXJlIDEuNSBtb2R1bGVzIG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEphdmEgRUUgMS40IEVudGVycHJpc2UgQXBwbGljYXRpb25zLgogREVTQ1JJUFRJT049RGVzY3JpcHRpb246Ci1XRUJfQ09OVEVYVF9ST09UPUNvbnRleHQgUm9vdDoKK1dFQl9DT05URVhUX1JPT1Q9Q29udGV4dCByb290OgogV0VCX0NPTlRFTlRfRk9MREVSX05BTUU9V2ViIGNvbnRlbnQgZm9sZGVyIG5hbWU6CiBGaWxlSW1wb3J0LmludmFsaWRTb3VyY2UgPSBTb3VyY2UgZGlyZWN0b3J5IGlzIG5vdCB2YWxpZCBvciBoYXMgbm90IGJlZW4gc3BlY2lmaWVkLgogRmlsZUltcG9ydC5pbXBvcnRQcm9ibGVtcyA9IEltcG9ydCBQcm9ibGVtcwpAQCAtMjg4LDI0ICsyODUsMjggQEAKIEVBUkNvbXBvbmVudENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLmRlc2M9Q3JlYXRlIGEgRUFSIGFwcGxpY2F0aW9uLgogRUFSQ29tcG9uZW50Q3JlYXRpb25XaXphcmQuc2Vjb25kUGFnZS50aXRsZT1FbnRlcnByaXNlIEFwcGxpY2F0aW9uCiBFQVJDb21wb25lbnRDcmVhdGlvbldpemFyZC5zZWNvbmRQYWdlLmRlc2M9Q29uZmlndXJlIGVudGVycHJpc2UgYXBwbGljYXRpb24gc2V0dGluZ3MuCi1KMkVFTW9kdWxlRGVwZW5kZW5jaWVzLmxhYmVsPUphdmEgRUUgTW9kdWxlIERlcGVuZGVuY2llczoKK0oyRUVNb2R1bGVEZXBlbmRlbmNpZXMubGFiZWw9JkphdmEgRUUgbW9kdWxlIGRlcGVuZGVuY2llczoKK0oyRUVNb2R1bGVEZXBlbmRlbmNpZXMubGFiZWxfYWNjZXNzaWJpbGl0eT1KYXZhIEVFIG1vZHVsZSBkZXBlbmRlbmNpZXMKIEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLnRpdGxlPU5ldyBBcHBsaWNhdGlvbiBDbGllbnQgUHJvamVjdAogQXBwQ2xpZW50Q29tcG9uZW50Q3JlYXRpb25XaXphcmQubWFpblBhZ2UudGl0bGU9QXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QKIEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uV2l6YXJkLm1haW5QYWdlLmRlc2M9Q3JlYXRlIGEgQXBwbGljYXRpb24gQ2xpZW50LgogRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC50aXRsZT1DcmVhdGUgZGVmYXVsdCBKYXZhIEVFIG1vZHVsZXMuCiBEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UudGl0bGU9TmV3IEphdmEgRUUgTW9kdWxlCiBEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UuZGVzYz1DcmVhdGUgYSBuZXcgSmF2YSBFRSBtb2R1bGUgZm9yIHRoZSBzZWxlY3RlZCBtb2R1bGUgdHlwZQotRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLmxhYmVsLmVqYj1FSkIgbW9kdWxlCi1EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UubGFiZWwud2ViPVdlYiBtb2R1bGUKLURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25XaXphcmQucGFnZS5sYWJlbC5qY2E9Q29ubmVjdG9yIG1vZHVsZQotRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbldpemFyZC5wYWdlLmxhYmVsLmFwcGNsaWVudD1BcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlCi1EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UuYnV0dG9uLnNlbGVjdD1DcmVhdGUgZGVmYXVsdCBtb2R1bGVzCitEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UubGFiZWwuZWpiPSZFSkIgbW9kdWxlCitEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UubGFiZWwud2ViPSZXZWIgbW9kdWxlCitEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UubGFiZWwuamNhPSZDb25uZWN0b3IgbW9kdWxlCitEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UubGFiZWwuYXBwY2xpZW50PSZBcHBsaWNhdGlvbiBjbGllbnQgbW9kdWxlCitEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uV2l6YXJkLnBhZ2UuYnV0dG9uLnNlbGVjdD1DcmVhdGUgJmRlZmF1bHQgbW9kdWxlcwogCi1GT0xERVJfTEFCRUw9U291cmNlIGZvbGRlcjoKK0ZPTERFUl9MQUJFTD1Tb3VyY2UgZm9sJmRlcjoKIEJST1dTRV9CVVRUT05fTEFCRUw9QnJvd3NlLi4uCi1KQVZBX1BBQ0tBR0VfTEFCRUw9SmF2YSBwYWNrYWdlOgotQ0xBU1NfTkFNRV9MQUJFTD1DbGFzcyBuYW1lOgotU1VQRVJDTEFTU19MQUJFTD1TdXBlcmNsYXNzOgorQlJPV1NFX0JVVFRPTl9MQUJFTF9PPUJyJm93c2UuLi4KK0JST1dTRV9CVVRUT05fTEFCRUxfVz1Ccm8md3NlLi4uCitCUk9XU0VfQlVUVE9OX0xBQkVMX0U9QnJvd3MmZS4uLgorSkFWQV9QQUNLQUdFX0xBQkVMPUphdmEgcGFjJmthZ2U6CitDTEFTU19OQU1FX0xBQkVMPUNsYXNzIG5hJm1lOgorU1VQRVJDTEFTU19MQUJFTD0mU3VwZXJjbGFzczoKIENPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1RJVExFPUNvbnRhaW5lciBTZWxlY3Rpb24KIENPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX0RFU0M9Q2hvb3NlIGEgQ29udGFpbmVyOgogQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVkFMSURBVE9SX01FU0c9Q2hvb3NlIGEgdmFsaWQgamF2YSBzb3VyY2UgZm9sZGVyIGZvciB0aGUgc2VsZWN0ZWQgbW9kdWxlLgpAQCAtMzE1LDI1ICszMTYsMjkgQEAKIFNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1TdXBlcmNsYXNzIFNlbGVjdGlvbgogU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX0RFU0M9Q2hvb3NlIGEgc3VwZXJjbGFzczoKIEpBVkFfQ0xBU1NfTU9ESUZJRVJTX0xBQkVMPU1vZGlmaWVyczoKLUpBVkFfQ0xBU1NfUFVCTElDX0NIRUNLQk9YX0xBQkVMPVB1YmxpYwotSkFWQV9DTEFTU19BQlNUUkFDVF9DSEVDS0JPWF9MQUJFTD1BYnN0cmFjdAotSkFWQV9DTEFTU19GSU5BTF9DSEVDS0JPWF9MQUJFTD1GaW5hbAotSkFWQV9DTEFTU19JTlRFUkZBQ0VTX0xBQkVMPUludGVyZmFjZXM6CitKQVZBX0NMQVNTX1BVQkxJQ19DSEVDS0JPWF9MQUJFTD0mcHVibGljCitKQVZBX0NMQVNTX0FCU1RSQUNUX0NIRUNLQk9YX0xBQkVMPWFicyZ0cmFjdAorSkFWQV9DTEFTU19GSU5BTF9DSEVDS0JPWF9MQUJFTD1maW5hJmwKK0pBVkFfQ0xBU1NfSU5URVJGQUNFU19MQUJFTD0mSW50ZXJmYWNlczoKIEpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMPVdoaWNoIG1ldGhvZCBzdHVicyB3b3VsZCB5b3UgbGlrZSB0byBjcmVhdGU/Ci1KQVZBX0NMQVNTX01BSU5fQ0hFQ0tCT1hfTEFCRUw9cHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLUpBVkFfQ0xBU1NfQ09OU1RSVUNUT1JfQ0hFQ0tCT1hfTEFCRUw9Q29uc3RydWN0b3JzIGZyb20gc3VwZXJjbGFzcwotSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMPUluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzCi1BRERfQlVUVE9OX0xBQkVMPUFkZC4uLgotUkVNT1ZFX0JVVFRPTj1SZW1vdmUKK0pBVkFfQ0xBU1NfTUFJTl9DSEVDS0JPWF9MQUJFTD1wdWJsaWMgc3RhdGljIHZvaWQgJm1haW4oU3RyaW5nW10gYXJncykKK0pBVkFfQ0xBU1NfQ09OU1RSVUNUT1JfQ0hFQ0tCT1hfTEFCRUw9JkNvbnN0cnVjdG9ycyBmcm9tIHN1cGVyY2xhc3MKK0pBVkFfQ0xBU1NfSU5IRVJJVF9DSEVDS0JPWF9MQUJFTD1JbiZoZXJpdGVkIGFic3RyYWN0IG1ldGhvZHMKK0FERF9CVVRUT05fTEFCRUw9JkFkZC4uLgorUkVNT1ZFX0JVVFRPTj0mUmVtb3ZlCiBZRVNfQlVUVE9OPVllcwogTk9fQlVUVE9OPU5vCiBPS19CVVRUT049T0sKK09wZW5KMkVFUmVzb3VyY2VBY3Rpb24uMD1PcGVuCiBDQU5DRUxfQlVUVE9OPUNhbmNlbAogQklOQVJZPUJpbmFyeQogSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfVElUTEU9SW50ZXJmYWNlIFNlbGVjdGlvbgogSkFWQVVUSUxJVFlfTUFJTl9QR19USVRMRT1KYXZhIENvbXBvbmVudAogSkFWQVVUSUxJVFlfTUFJTl9QR19ERVNDPUNyZWF0ZSBhIEphdmEgQ29tcG9uZW50CiBKQVZBVVRJTF9DT01QT05FTlRfV0laX1RJVExFPU5ldyBKYXZhIFV0aWxpdHkgTW9kdWxlCitKQVZBX0VFX1BSRUZFUkVOQ0VfUEFHRV9OQU1FPUdlbmVyYWwgc2V0dGluZ3MgZm9yIEphdmEgRUUgZGV2ZWxvcG1lbnQ6CitKQVZBX0VFX1BSRUZFUkVOQ0VfUEFHRV9KRVRfVEVNUExBVEU9SkVUIHRlbXBsYXRlcworSkFWQV9FRV9QUkVGRVJFTkNFX1BBR0VfRFlOX1RSQU5TTEFUSU9OX0JUTl9OQU1FPVVzZSBkeW5hbWljIHRyYW5zbGF0aW9uIG9mIEpFVCB0ZW1wbGF0ZXMKIEFWQUlMQUJMRV9KMkVFX0NPTVBPTkVOVFM9IEF2YWlsYWJsZSBKYXZhIEVFIG1vZHVsZXMKIEVYVEVSTkFMX0pBUj1BZGQgRXh0ZXJuYWwgSkFScy4uLgogUFJPSkVDVF9KQVI9QWRkIEpBUnMuLi4KQEAgLTM0OCw3ICszNTMsNiBAQAogQkxBTktfTElCX0RJUl9XQVJOX1FVRVNUSU9OPVRoZSBzcGVjaWZpZWQgbGlicmFyeSBkaXJlY3RvcnkgaXMgYmxhbmsuIEluIHJlc3VsdCwgYWxsIHRoZSBsaWJyYXJpZXMgd2lsbCBiZSBwYWNrZWQgaW4gdGhlIHJvb3QgZGlyZWN0b3J5LiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdGhpcz8gKElmIHlvdSB3YW50IHRvIGxlYXZlIHRoZSBidW5kbGVkIGxpYnJhcmllcyBkaXJlY3RvcnkgYmxhbmssIGNsaWNrICdZZXMnLiBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgaXQsIGNsaWNrICdObycpCiBJTlZBTElEX1BBVEg9SW52YWxpZCBQYXRoCiBJTlZBTElEX1BBVEhfTVNHPVRoZSBlbnRlcmVkIHBhdGggaXMgaW52YWxpZCBmb3IgYSBsaWJyYXJ5IGRpcmVjdG9yeS4gUGxlYXNlIGVudGVyIGEgdmFsaWQgcGF0aCwgZGlmZmVyZW50IGZyb20gcm9vdCEKLUlOVkFMSURfUEFUSF9TVEFSVFNfV0lUSF9TTEFTSF9NU0c9TGlicmFyeSBkaXJlY3RvcnkgdmFsdWUgY2Fubm90IGJlZ2luIHdpdGggYSBzbGFzaCAoJy8nKSBjaGFyYWN0ZXIuCiBERVBFTkRFTkNZX0NPTkZMSUNUX1RJVExFPURlcGVuZGVuY2llcyBDb25mbGljdAogREVQRU5ERU5DWV9DT05GTElDVF9NU0dfMT1UaGlzIEpBUiBpcyBhIGJ1bmRsZWQgbGlicmFyeSBvZiBhbiBFQVIgcHJvamVjdCBhbmQgaXMgc3VwcG9zZWQgdG8gYmUgcGFja2VkIGluIHRoZSBFQVIncyBsaWJyYXJ5IGRpcmVjdG9yeS4gSXQgY29uZmxpY3RzIHdpdGggdGhlIG1hbmlmZXN0IGNsYXNzIHBhdGggZGVwZW5kZW5jeSB5b3UgYXJlIHRyeWluZyB0byBjcmVhdGUuIElmIHlvdSBjcmVhdGUgdGhpcyBkZXBlbmRlbmN5LCB0aGUgSkFSIHdpbGwgYmUgcGFja2VkIGluIHRoZSByb290IChub3QgbGlicmFyeSkgZGlyZWN0b3J5IG9mIHRoZSBFQVIuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBwcm9jZWVkPwogREVQRU5ERU5DWV9DT05GTElDVF9NU0dfMj1UaGlzIEpBUiBpcyBhbHNvIGEgbWFuaWZlc3QgY2xhc3MgcGF0aCBkZXBlbmRlbmN5IG9mIGEgbW9kdWxlIGluIHRoaXMgRUFSLiBJdCBjb25mbGljdHMgd2l0aCBwYWNraW5nIHRoZSBKQVIgaW4gdGhlIGxpYnJhcnkgZGlyZWN0b3J5LiBJZiB5b3Ugd2FudCB0aGlzIEpBUiBwYWNrZWQgaW4gdGhlIGxpYnJhcnkgZGlyZWN0b3J5LCB0aGVuIGl0IHdpbGwgYmUgcmVtb3ZlZCBhcyBhIG1hbmlmZXN0IGNsYXNzIHBhdGggZGVwZW5kZW5jeSBmcm9tIGFsbCBtb2R1bGVzIGluIHRoaXMgRUFSLiBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcHJvY2VlZD8gIApAQCAtMzU2LDQgKzM2MCwzIEBACiBTVVBQT1JUTVVMVElQTEVNT0RVTEVTPVN1cHBvcnQgTXVsdGlwbGUgTW9kdWxlcyBwZXIgcHJvamVjdAogU09VUkNFRk9MREVSPVNvdXJjZSBGb2xkZXI6CiBIT1ZFUl9IRUxQX0ZPUl9ESVNBQkxFRF9MSUJTPVRoaXMgbGlicmFyeSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcHJvamVjdCBieSB1c2luZyB0aGUgcHJvamVjdCB0cmVlIG9yXG50aGUgZmlsZSBzeXN0ZW0uIElmIHlvdSB3YW50IHRvIG1vdmUvcmVtb3ZlIGl0LCB1c2UgdGhlIHNhbWUgYXBwcm9hY2guCi1PVVRQVVRGT0xERVI9T3V0cHV0IEZvbGRlcjoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL21hbmlmZXN0X3VpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLnVpL3Byb3BlcnR5X2ZpbGVzL21hbmlmZXN0X3VpLnByb3BlcnRpZXMKaW5kZXggMjczNWNiMy4uODA2ZDVmOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9wcm9wZXJ0eV9maWxlcy9tYW5pZmVzdF91aS5wcm9wZXJ0aWVzCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvcHJvcGVydHlfZmlsZXMvbWFuaWZlc3RfdWkucHJvcGVydGllcwpAQCAtNDEsNyArNDEsNiBAQAogV2ViX0xpYl9FcnJvcj1XZWIgbGlicmFyeSBzZXR0aW5ncyBhcmUgb25seSB2YWxpZCBmb3IgV2ViIG1vZHVsZXMuCiBSRURJUkVDVF9URVhUX0VESVRPUl9VSV89UkVESVJFQ1RfVEVYVF9FRElUT1JfVUlfCiBFcnJvcl9DaGVja2luZ19Qcm9qZWN0X0ZhY2V0cz1FcnJvciBjaGVja2luZyBwcm9qZWN0IGZhY2V0cy4KLUVycm9yX0NoZWNraW5nX1Byb2plY3RfRmFjZXRzPUVycm9yIGNoZWNraW5nIHByb2plY3QgZmFjZXRzLgogV0VCX0xJQl9MSVNUX0RFU0NSSVBUSU9OPVNlbGVjdCB0aGUgdXRpbGl0eSBwcm9qZWN0LCBKQVIgb3IgY2xhc3NwYXRoIGVudHJ5IHRvIGFkZCBhcyBhIFdlYiBMaWJyYXJ5IGRlcGVuZGVuY3kKIER5bmFtaWNfV2ViX0Vycm9yPVRoaXMgcHJvcGVydHkgcGFnZSBpcyBub3QgdmFsaWQgZm9yIGR5bmFtaWMgd2ViIHByb2plY3RzLgogTm9fV2ViX1JlZmVyZW5jZV9FcnJvcj1TZWxlY3RlZCBwcm9qZWN0IG11c3QgYmUgcmVmZXJlbmNlZCBieSBhdCBsZWFzdCBvbmUgZHluYW1pYyB3ZWIgcHJvamVjdC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvc2NoZW1hL0phdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5kZXIuZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUudWkvc2NoZW1hL0phdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5kZXIuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWIzNDg3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS51aS9zY2hlbWEvSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbmRlci5leHNkCkBAIC0wLDAgKzEsODMgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpIiBpZD0iSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbmRlciIgbmFtZT0iSmF2YUVFUHJlZmVyZW5jZVBhZ2VFeHRlbmRlciIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBEZWZpbmVzIGV4dGVuc2lvbiBwb2ludCBmb3IgZXh0ZW5kaW5nIEphdmEgRUUgcHJlZmVyZW5jZSBwYWdlLgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KKyAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iamF2YWVlcGFnZWV4dGVuZGVyIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSBleHRlbnNpb24gcG9pbnQKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPgorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgorICAgICAgICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8ZWxlbWVudCBuYW1lPSJqYXZhZWVwYWdlZXh0ZW5kZXIiPgorICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc05hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzTmFtZSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBpbnRlcmZhY2UgSUphdmFFRVByZWZlcmVuY2VQYWdlRXh0ZW5kZXIKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworCisKKworCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgCisgIENvbnRyaWJ1dG9yczoKKyAgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL29yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLkpFVEJ1aWxkZXIubGF1bmNoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL29yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLkpFVEJ1aWxkZXIubGF1bmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMTFhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uSkVUQnVpbGRlci5sYXVuY2gKQEAgLTAsMCArMSw3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgorPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfQlVJTERFUl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfRElTQUJMRURfQlVJTERFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLkpFVEJ1aWxkZXIiLz4KKzxtYXBBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfVE9PTF9BUkdVTUVOVFMiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1RSSUdHRVJTX0NPTkZJR1VSRUQiIHZhbHVlPSJ0cnVlIi8+Cis8L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8ucHJvamVjdCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5wcm9qZWN0CmluZGV4IGE3Y2YzNzUuLjkzZWVjMzMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5wcm9qZWN0CisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5wcm9qZWN0CkBAIC02LDggKzYsMTMgQEAKIAk8L3Byb2plY3RzPgogCTxidWlsZFNwZWM+CiAJCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5KRVRCdWlsZGVyPC9uYW1lPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xCdWlsZGVyPC9uYW1lPgorCQkJPHRyaWdnZXJzPmZ1bGwsaW5jcmVtZW50YWwsPC90cmlnZ2Vycz4KIAkJCTxhcmd1bWVudHM+CisJCQkJPGRpY3Rpb25hcnk+CisJCQkJCTxrZXk+TGF1bmNoQ29uZmlnSGFuZGxlPC9rZXk+CisJCQkJCTx2YWx1ZT4mbHQ7cHJvamVjdCZndDsvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL29yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLkpFVEJ1aWxkZXIubGF1bmNoPC92YWx1ZT4KKwkJCQk8L2RpY3Rpb25hcnk+CiAJCQk8L2FyZ3VtZW50cz4KIAkJPC9idWlsZENvbW1hbmQ+CiAJCTxidWlsZENvbW1hbmQ+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggNTc5YTgxNy4uODMzN2M5ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtMSw1ICsxLDI0IEBACi0jTW9uIEZlYiAxOCAxNTo1NzowOSBFU1QgMjAwOAorI01vbiBGZWIgMjIgMTE6NTA6MzEgRUVUIDIwMTAKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitpbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCitvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVjcmVhdGVNb2RpZmllZENsYXNzRmlsZUluT3V0cHV0Rm9sZGVyPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50U3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuZmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRTdWZmaXhlcz0KIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKQEAgLTcsNTYgKzI2LDc0IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVhZENvZGU9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSGFzaENvZGVNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uRm9ySW50ZXJmYWNlTWV0aG9kSW1wbGVtZW50YXRpb249ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU3luY2hyb25pemVkT25Jbmhlcml0ZWRNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVVbmNoZWNrZWRFeGNlcHRpb25zPWRpc2FibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZE9iamVjdEFsbG9jYXRpb249aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkYmVhNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKQEAgLTAsMCArMSw2IEBACisjTW9uIEZlYiAyMiAxMTo1MDozMSBFRVQgMjAxMAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK29yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCitvcmcuZWNsaXBzZS5qZHQudWkuZ2V0dGVyc2V0dGVyLnVzZS5pcz10cnVlCitvcmcuZWNsaXBzZS5qZHQudWkua2V5d29yZHRoaXM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC51aS5vdmVycmlkZWFubm90YXRpb249dHJ1ZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAyM2YzMWExLi5hMDc1MGUwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMiw3ICsyLDcgQEAKIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKIEJ1bmRsZS1OYW1lOiBXZWIgUGx1Zy1pbgogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjA3LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDEuMS40MDUucXVhbGlmaWVyCiBCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbgogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpAQCAtMjAsMTkgKzIwLDE4IEBACiAgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLAogIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LAogIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi52YWxpZGF0aW9uCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwNiwxLjIuMCkiLAogIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKKyBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKICBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCiAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLApAQCAtNDAsMTEgKzM5LDExIEBACiAgb3JnLmVjbGlwc2Uud3N0LndlYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCiAgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKICBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjcsMi4wLjApIiwKICBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCiAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDQuMC4wKSIsCisgY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IjMuOC4xIiwKICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAogIG9yZy5lY2xpcHNlLmpzdC5qZWU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCiAgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2Z0cGV4cG9ydF93aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vZnRwZXhwb3J0X3dpei5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlODdhMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2Z0cGV4cG9ydF93aXoucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2Z0cGltcG9ydF93aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vZnRwaW1wb3J0X3dpei5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxMzIwNgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2Z0cGltcG9ydF93aXoucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2Z0cHB1Yl93aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vZnRwcHViX3dpei5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4MDM3NQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2Z0cHB1Yl93aXoucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2h0dHBpbXBvcnRfd2l6LnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL2h0dHBpbXBvcnRfd2l6LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQ4M2VjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vaHR0cGltcG9ydF93aXoucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL25ld2pwcmpfd2l6XzMyLnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL25ld2pwcmpfd2l6XzMyLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmNiZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vbmV3anByal93aXpfMzIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dlYmV4X3dpei5wbmcgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9uZXd3ZWJleF93aXoucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOWEzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9pY29ucy9mdWxsL3dpemJhbi9uZXd3ZWJleF93aXoucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LnBuZyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL25ld3dwcmpfd2l6LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWRkMDkwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vbmV3d3Byal93aXoucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL3dhcmV4cG9ydF93aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vd2FyZXhwb3J0X3dpei5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0ZGJiMAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL3dhcmV4cG9ydF93aXoucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL3dhcmltcG9ydF93aXoucG5nIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvaWNvbnMvZnVsbC93aXpiYW4vd2FyaW1wb3J0X3dpei5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjZjQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL2ljb25zL2Z1bGwvd2l6YmFuL3dhcmltcG9ydF93aXoucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3BsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcGx1Z2luLnByb3BlcnRpZXMKaW5kZXggZDJmOGYxZi4uY2UxNDQ0ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcGx1Z2luLnByb3BlcnRpZXMKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTgsNyArOCwxMSBAQAogIyBDb250cmlidXRvcnM6CiAjIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotd2FyX3ZhbGlkYXRvcl9VSV89V2FyIFZhbGlkYXRvcgord2FyX3ZhbGlkYXRvcl9VSV89V2ViICgyLjItMi40KSBWYWxpZGF0b3IKIFdFQl9GQUNFVF9MQUJFTD1EeW5hbWljIFdlYiBNb2R1bGUKIFdFQl9GQUNFVF9ERVNDUklQVElPTj1BZGRzIHN1cHBvcnQgZm9yIHRoZSBKYXZhIFNlcnZsZXQgQVBJLCBmb3IgZ2VuZXJhdGlvbiBvZiBkeW5hbWljIFdlYiBwYWdlIGNvbnRlbnQuCiBXRUJfRkFDRVRfVEVNUExBVEVfTEFCRUw9RHluYW1pYyBXZWIgUHJvamVjdAorV0VCRlJBR01FTlRfRkFDRVRfVEVNUExBVEVfTEFCRUw9V2ViIEZyYWdtZW50IFByb2plY3QKK1dFQkZSQUdNRU5UX0ZBQ0VUX0xBQkVMPVdlYiBGcmFnbWVudCBNb2R1bGUKK1dFQkZSQUdNRU5UX0ZBQ0VUX0RFU0NSSVBUSU9OPUFkZHMgc3VwcG9ydCBmb3IgdGhlIFdlYiBGcmFnbWVudHMsIHdoaWNoIGFyZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggRHluYW1pYyBXZWIgUHJvamVjdHMgZm9yIGdlbmVyYXRpb24gb2YgZHluYW1pYyBXZWIgcGFnZSBjb250ZW50LgorCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcGx1Z2luLnhtbAppbmRleCA2ZGIzMjkxLi5mOTQwODQxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9wbHVnaW4ueG1sCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3BsdWdpbi54bWwKQEAgLTM1MSw2ICszNTEsMTQgQEAKICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5OZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlciIKICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5OZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlciIvPgogCTwvZXh0ZW5zaW9uPgorCisJPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5EYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbiI+CisgICAgIAk8UHJvdmlkZXJEZWZpbmVzVHlwZQorICAgICAgCQlwcm92aWRlclR5cGU9ImpzdC53ZWJmcmFnbWVudC5idWlsZGVyIgorICAgICAgCQlwcm92aWRlcklEPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5KYXZhQ29tcG9uZW50QnVpbGRlckRhdGFNb2RlbFByb3ZpZGVyIi8+CisJPC9leHRlbnNpb24+CisKICA8ZXh0ZW5zaW9uCiAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5EYXRhTW9kZWxQcm92aWRlckV4dGVuc2lvbiI+CiAgICAgPERhdGFNb2RlbFByb3ZpZGVyCkBAIC0zNzksNyArMzg3LDcgQEAKICAgICA8cHJvamVjdC1mYWNldCBpZD0ianN0LndlYiI+CiAgICAgICA8bGFiZWw+JVdFQl9GQUNFVF9MQUJFTDwvbGFiZWw+CiAgICAgICA8ZGVzY3JpcHRpb24+JVdFQl9GQUNFVF9ERVNDUklQVElPTjwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZGVmYXVsdC12ZXJzaW9uIHZlcnNpb249IjIuNCIvPgorICAgICAgPGRlZmF1bHQtdmVyc2lvbiB2ZXJzaW9uPSIzLjAiLz4KICAgICA8L3Byb2plY3QtZmFjZXQ+CiAKICAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIyLjIiPgpAQCAtNDIxLDE3ICs0MjksMjcgQEAKICAgICAgIDwvY29uc3RyYWludD4KICAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4KICAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KKyAgICAKKyAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSIzLjAiPgorICAgICAgPGNvbnN0cmFpbnQ+CisgICAgICAgIDxhbmQ+CisgICAgICAgICAgPHJlcXVpcmVzIGZhY2V0PSJqc3QuamF2YSIgdmVyc2lvbj0iWzYuMCIvPgorICAgICAgICAgIDxjb25mbGljdHMgZ3JvdXA9Im1vZHVsZXMiLz4KKyAgICAgICAgPC9hbmQ+CisgICAgICA8L2NvbnN0cmFpbnQ+CisgICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJtb2R1bGVzIi8+CisgICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+CiAKLSAgICA8YWN0aW9uIGZhY2V0PSJqc3Qud2ViIiB2ZXJzaW9uPSJbMi4yLTIuNV0iIHR5cGU9IklOU1RBTEwiIGlkPSJqc3Qud2ViLmluc3RhbGwiPgorICAgIDxhY3Rpb24gZmFjZXQ9ImpzdC53ZWIiIHZlcnNpb249IlsyLjItMy4wXSIgdHlwZT0iSU5TVEFMTCIgaWQ9ImpzdC53ZWIuaW5zdGFsbCI+CiAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LldlYkZhY2V0SW5zdGFsbERlbGVnYXRlIi8+CiAgICAgICA8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LldlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIi8+CiAgICAgPC9hY3Rpb24+CiAKLSAgICA8ZXZlbnQtaGFuZGxlciBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iWzIuMi0yLjVdIiB0eXBlPSJSVU5USU1FX0NIQU5HRUQiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkoyRUVGYWNldFJ1bnRpbWVDaGFuZ2VkRGVsZWdhdGUiLz4KKyAgICA8ZXZlbnQtaGFuZGxlciBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iWzIuMi0zLjBdIiB0eXBlPSJSVU5USU1FX0NIQU5HRUQiPgorICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlIi8+CiAgICAgPC9ldmVudC1oYW5kbGVyPgogICAgIAotICAgIDxldmVudC1oYW5kbGVyIHR5cGU9IlBPU1RfSU5TVEFMTCIgZmFjZXQ9ImpzdC53ZWIiIHZlcnNpb249IlsyLjItMi41XSI+CisgICAgPGV2ZW50LWhhbmRsZXIgdHlwZT0iUE9TVF9JTlNUQUxMIiBmYWNldD0ianN0LndlYiIgdmVyc2lvbj0iWzIuMi0zLjBdIj4KICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuV2ViRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlIi8+CiAgICAgPC9ldmVudC1oYW5kbGVyPgogICAgIApAQCAtNDQxLDYgKzQ1OSw0MiBAQAogICAgICAgPGZpeGVkIGZhY2V0PSJqc3Qud2ViIi8+CiAgICAgPC90ZW1wbGF0ZT4KIAorCTxwcm9qZWN0LWZhY2V0IGlkPSJqc3Qud2ViZnJhZ21lbnQiPgorICAgICAgPGxhYmVsPiVXRUJGUkFHTUVOVF9GQUNFVF9MQUJFTDwvbGFiZWw+CisgICAgICA8ZGVzY3JpcHRpb24+JVdFQkZSQUdNRU5UX0ZBQ0VUX0RFU0NSSVBUSU9OPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxkZWZhdWx0LXZlcnNpb24gdmVyc2lvbj0iMy4wIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaGlkZS52ZXJzaW9uIiB2YWx1ZT0idHJ1ZSIvPgorICAgIDwvcHJvamVjdC1mYWNldD4KKyAgICAKKyAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3Qud2ViZnJhZ21lbnQiIHZlcnNpb249IjMuMCI+CisgICAgICA8Y29uc3RyYWludD4KKyAgICAgICAgPGFuZD4KKyAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSJbNi4wIi8+CisgICAgICAgICAgPGNvbmZsaWN0cyBncm91cD0ibW9kdWxlcyIvPgorICAgICAgICA8L2FuZD4KKyAgICAgIDwvY29uc3RyYWludD4KKyAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4KKyAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KKworICAgIDxhY3Rpb24gZmFjZXQ9ImpzdC53ZWJmcmFnbWVudCIgdmVyc2lvbj0iMy4wIiB0eXBlPSJJTlNUQUxMIiBpZD0ianN0LndlYmZyYWdtZW50Lmluc3RhbGwiPgorICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldC5XZWJGcmFnbWVudEZhY2V0SW5zdGFsbERlbGVnYXRlIi8+CisgICAgICA8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LldlYkZyYWdtZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIiLz4KKyAgICA8L2FjdGlvbj4KKworICAgIDxldmVudC1oYW5kbGVyIGZhY2V0PSJqc3Qud2ViZnJhZ21lbnQiIHZlcnNpb249IjMuMCIgdHlwZT0iUlVOVElNRV9DSEFOR0VEIj4KKyAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRUZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZSIvPgorICAgIDwvZXZlbnQtaGFuZGxlcj4KKyAgICAKKwk8ZXZlbnQtaGFuZGxlciB0eXBlPSJQT1NUX0lOU1RBTEwiIGZhY2V0PSJqc3Qud2ViZnJhZ21lbnQiIHZlcnNpb249IjMuMCI+CisJCSAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LldlYkZyYWdtZW50RmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlIi8+CisJICAgPC9ldmVudC1oYW5kbGVyPiAgCisgICAgICAgICAgCisgICAgPHRlbXBsYXRlIGlkPSJ0ZW1wbGF0ZS5qc3Qud2ViZnJhZ21lbnQiPgorICAgICAgPGxhYmVsPiVXRUJGUkFHTUVOVF9GQUNFVF9URU1QTEFURV9MQUJFTDwvbGFiZWw+CisgICAgICA8Zml4ZWQgZmFjZXQ9ImpzdC5qYXZhIi8+CisgICAgICA8Zml4ZWQgZmFjZXQ9ImpzdC53ZWJmcmFnbWVudCIvPgorICAgIDwvdGVtcGxhdGU+CisKICAgPC9leHRlbnNpb24+CiAKICAgIDxleHRlbnNpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3Byb3BlcnR5X2ZpbGVzL3dhcnZhbGlkYXRpb24ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3Byb3BlcnR5X2ZpbGVzL3dhcnZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4OGE3ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9wcm9wZXJ0eV9maWxlcy93YXJ2YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jVGhpcyBwcm9wZXJ0aWVzIGZpbGUgaG9sZCBhbGwgdGhlIGV4dGVybmFsaXNlZCBzdHJpbmdzIGZvciBlVG9vbHMgV0FSIFZhbGlkYXRpb24gcHJvamVjdAotIyBWYWxpZGF0aW9uIHByb2plY3QKLSMKLSMgTWVzc2FnZXMgc2hvdWxkIGJlIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IGF0OgotIyAgICAgaHR0cDovL2hhbnkuYXVzdGluLmlibS5jb20vbWVzc2FnZXMvaW5kZXguaHRtbAotIwotIyBCcmllZmx5OgotIyAgICAgTUVTU0FHRV9JRD08Q29tcG9uZW50UHJlZml4PjxNZXNzYWdlTnVtYmVyPjxUeXBlQ29kZT46IDxNZXNzYWdlVGV4dD4KLSMKLSMgVGhlIHByZWZpeCBmb3IgdGhpcyBjb21wb25lbnQgaXM6Ci0jICAgICBDSEtKIChJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24pCi0jCi0jIE5vdGUgdGhlICI6ICIgdGhhdCBhcHBlYXJzIGJldHdlZW4gdGhlIHR5cGUgY29kZSBhbmQgdGhlIG1lc3NhZ2UgdGV4dC4KLSMKLSMgOkJlZ2luOiBXZWJTcGhlcmUgUXVhbGl0eSBWYWxpZGF0aW9uIEluZm9ybWF0aW9uIDpCZWdpbjoKLSNDT01QT05FTlRQUkVGSVggQ0hLSgotI0NPTVBPTkVOVE5BTUVGT1IgQ0hLSiBJQk0gV2ViU3BoZXJlIFZhbGlkYXRpb24KLSNDTVZDUEFUSE5BTUUgbmNmL3NyYy9qYXZhL2NvbS9pYm0vd2Vic3BoZXJlL3ZhbGlkYXRpb24vd2FydmFsaWRhdGlvbi5wcm9wZXJ0aWVzCi0jIDpFbmQ6IFdlYlNwaGVyZSBRdWFsaXR5IFZhbGlkYXRpb24gSW5mb3JtYXRpb24gOkVuZDoKLSMKLQotIyAyLUp1bHktMjAwMToKLSMgIFRoaXMgZmlsZSBoYXMgYmVlbiB0ZXN0ZWQgdXNpbmcgdGhlIFByb2Nlc3NNc2dGaWxlIHRvb2wsIHdyaXR0ZW4gYnkKLSMgIEhhbnkgU2FsZW0gYW5kIG93bmVkIGJ5IERlbm5pcyBIZWJlcnQuICBBbnkgZnV0dXJlIGNoYW5nZXMgc2hvdWxkCi0jICBhbHNvIGJlIHZlcmlmaWVkIHVzaW5nIHRoaXMgdG9vbC4gIFBsZWFzZSBjb250YWN0IERlbm5pcwotIyAgKGhlYmVydEB1cy5pYm0uY29tIG9yIFQvTCA1NDMtMjUyMCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0jCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX1dBUl9WQUxJREFUSU9OX0ZBSUxFRD1DSEtKMzAwMEU6IFdBUiBWYWxpZGF0aW9uIEZhaWxlZDogezB9Ci0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRVJST1JfRUFSX0RVUExJQ0FURV9ST0xFUz1DSEtKMTAwMkU6IER1cGxpY2F0ZSBzZWN1cml0eSByb2xlIG5hbWVkIHswfS4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTUlTU0lOR19KU1A9Q0hLSjMwMDFFOiBUaGUgSlNQIGZpbGUsIHswfSwgZm9yIHRoZSBzZXJ2bGV0IFwiezF9XCIgaXMgbWlzc2luZy4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9TTUFMTF9JQ09OPUNIS0ozMDAyRTogVGhlIDxzbWFsbC1pY29uPiBmaWxlLCB7MH0sIGlzIG1pc3NpbmcuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fTEFSR0VfSUNPTj1DSEtKMzAwM0U6IFRoZSA8bGFyZ2UtaWNvbj4gZmlsZSwgezB9LCBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9TRVJWTEVUX01BUFBJTkc9Q0hLSjMwMDRXOiBUaGUgc2VydmxldCBtYXBwaW5nIFwiezB9XCIgcmVmZXJzIHRvIGEgc2VydmxldCB0aGF0IGlzIG5vdCBkZWZpbmVkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX05PX1dFTENPTUVfRklMRT1DSEtKMzAwNUU6IEVtcHR5IHdlbGNvbWUgZmlsZSBsaXN0IGVudHJ5LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfV0VMQ09NRV9GSUxFPUNIS0ozMDA2RTogV2VsY29tZSBmaWxlIHswfSBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX01JU1NJTkdfVExEPUNIS0ozMDA3RTogVGhlIFRhZyBMaWJyYXJ5IERlc2NyaXB0b3IgRmlsZSwgezB9LCBpcyBtaXNzaW5nLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9JTlZBTElEX1dBUl9GSUxFPUNIS0ozMDA4RTogTWlzc2luZyBvciBpbnZhbGlkIFdBUiBmaWxlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0JST0tFTl9GSUxURVJfTUFQUElORz1DSEtKMzAwOUU6IFRoZSBmaWx0ZXIgbWFwcGluZyBcInswfVwiIHJlZmVycyB0byBhIGZpbHRlciB0aGF0IGlzIG5vdCBkZWZpbmVkLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfV0VMQ09NRV9GSUxFPUNIS0ozMDEwVzogV2VsY29tZSBGaWxlcyBjYW5ub3QgYmVnaW4gb3IgZW5kIHdpdGggYSAvLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1XQVJfRERfUEFSU0VfTElORUNPTD1DSEtKMTAwOUU6IFBhcnNpbmcgRXJyb3I6IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV0FSX0REX1BBUlNFX0xJTkU9Q0hLSjEwMTBFOiBEZXBsb3ltZW50IERlc2NyaXB0b3IgUGFyc2luZyBlcnJvci4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotV0FSX0REX1BBUlNFX05PSU5GTz1DSEtKMTAxMUU6IERlcGxveW1lbnQgRGVzY3JpcHRvciBQYXJzaW5nIGVycm9yLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1XQVJfRERfQ0FOTk9UX09QRU5fREQ9Q0hLSjEwMTJFOiBDYW5ub3Qgb3BlbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBWYWxpZGF0aW9uIGNhbm5vdCBjb21wbGV0ZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1VSTD1DSEtKMzAxM0U6IFRoZSBVUkwgTWFwcGluZyBcInswfVwiIGlzIGludmFsaWQuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9TRUNfUk9MRT1DSEtKMzAxNEU6IEludmFsaWQgU2VjdXJpdHkgcm9sZS1saW5rOiB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9IVFRQX0NNRD1DSEtKMzAxNUU6IEludmFsaWQgSFRUUCBtZXRob2Q6IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1RSQU5TUE9SVD1DSEtKMzAxNkU6IEludmFsaWQgVHJhbnNwb3J0IEd1cmFyYW50ZWUuICBWYWxpZCB2YWx1ZXMgYXJlIFwiTk9ORVwiLCBcIklOVEVHUkFMXCIsIG9yIFwiQ09ORklERU5USUFMXCIuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9KU1BGSUxFX1JFRj1DSEtKMzAxOEU6IFRoZSBqc3AtZmlsZSBcInswfVwiIHJlZmVyZW5jZWQgYnkgc2VydmxldCB7MX0gbXVzdCBiZSBhIGZ1bGwgYWJzb2x1dGUgcGF0aC4KLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FUlJPUl9FQVJfSU5WQUxJRF9DT05URVhUX1JPT1Q9Q0hLSjMwMTdFOiBXZWIgUHJvamVjdDogezB9IGlzIG1hcHBlZCB0byBhbiBpbnZhbGlkIENvbnRleHQgcm9vdDogezF9IGluIEVBUiBQcm9qZWN0OiB7Mn0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FUlJPUl9QQUdFPUlXQUUwMDAxRSBDSEtKMzAxOUU6IFRoZSBMb2NhdGlvbiBvZiB0aGUgRXJyb3IgUGFnZSBNdXN0IEJlZ2luIHdpdGggYSAvLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfU0VDX1JPTEVfTkFNRT1DSEtKMzAyMEU6IEludmFsaWQgU2VjdXJpdHkgcm9sZS1uYW1lOiB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9BVVRIX01FVEhPRD1DSEtKMzAyMUU6IEludmFsaWQgYXV0aCBtZXRob2QuICBWYWxpZCB2YWx1ZXMgYXJlOiBcIkJBU0lDXCIsIFwiRElHRVNUXCIsIFwiRk9STVwiLCBvciBcIkNMSUVOVC1DRVJUXCIuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSUdOT1JFX0ZPUk1fTE9HSU49Q0hLSjMwMjJFOiAgQXV0aGVudGljYXRpb24gbWV0aG9kIGlzIHswfS4gIFRoZSBmb3JtLWxvZ2luLWNvbmZpZyB2YWx1ZXMgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB1c2luZyBGT1JNIGF1dGhlbnRpY2F0aW9uIG1ldGhvZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9SRVNfQVVUSF9SRVFVSVJFRF8yMj1DSEtKMzAyM0U6ICBSZXNvdXJjZSByZWYgezB9IG11c3QgY29udGFpbiByZXMtYXV0aCBvZiAiU0VSVkxFVCIgb3IgIkNPTlRBSU5FUiIuCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX1JFUVVJUkVEXzIzPUNIS0ozMDI0RTogIFJlc291cmNlIHJlZiB7MH0gbXVzdCBjb250YWluIHJlcy1hdXRoIG9mICJBcHBsaWNhdGlvbiIgb3IgIkNvbnRhaW5lciIuCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX1JFU19BVVRIX0lOVkFMSURfMjI9Q0hLSjMwMjVFOiAgXCJBcHBsaWNhdGlvblwiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvci5yZXMtYXV0aCBpbiBhIDIuMiBsZXZlbCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBVc2UgXCJTRVJWTEVUXCIgaW5zdGVhZC4KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fUkVTX0FVVEhfSU5WQUxJRF8yMz1DSEtKMzAyNkU6ICBcIlNFUlZMRVRcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IucmVzLWF1dGggaW4gYSAyLjIgbGV2ZWwgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgVXNlIFwiQXBwbGljYXRpb25cIiBpbnN0ZWFkLgotCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVhDRVBUSU9OX1RZUEU9Q0hLSjMwMjdFOiAgSW52YWxpZCBFeGNlcHRpb24gVHlwZSB7MH0uICBUaGUgZXhjZXB0aW9uIHR5cGUgbXVzdCBjb250YWluIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBKYXZhIGV4Y2VwdGlvbiB0eXBlLgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfTUFQUElORz1DSEtKNDAxMFc6IER1cGxpY2F0ZSBVUkwgbWFwcGluZyB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fRFVQTElDQVRFX1NFUlZMRVQ9Q0hLSjQwMTFXOiBEdXBsaWNhdGUgU2VydmxldCBFbnRyeSB7MH0uCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fU0VTU0lPTl9USU1FT1VUPUNIS0o0MDEyVzogU2Vzc2lvbiBUaW1lb3V0IGlzIG5vdCB2YWxpZC4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRU5UUlk9Q0hLSjQwMTNXOiBEdXBsaWNhdGUgRW50cnkgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0VNUFRZX0VOVFJZPUNIS0o0MDE0VzogRW1wdHkgRW50cnkgezB9LgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0RVUExJQ0FURV9GSUxURVI9Q0hLSjQwMTVXOiBEdXBsaWNhdGUgRmlsdGVyIEVudHJ5IHswfS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9EVVBMSUNBVEVfRUpCX1JFRj1DSEtKNDAxNlc6IER1cGxpY2F0ZSBlamItcmVmIGVsZW1lbnQgbmFtZWQgezB9LgotI0VYUExBTkFUSU9OIE5vbmUuCi0jVVNFUkFDVElPTiBOb25lLgotCi0jIFRoaXMgd2FzIG1pc3NpbmcuICBJdCdzIGRlZmluZWQgaW4gY29uc3RhbnRzLi4uCi1FUlJPUl9FQVJfVU5DT05UQUlORURfTU9EVUxFX0ZJTEVfRVhDRVBUSU9OPUNIS0o0MDE3VzogRVJST1IgRUFSIFVOQ09OVEFJTkVEIE1PRFVMRSBGSUxFIEVYQ0VQVElPTgotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0lOVkFMSURfRVJST1JfQ09ERT1JV0FFMDAzNkUgQ0hLSjQwMThXOiBVbmtub3duIEVycm9yIENvZGU6IHswfS4gIGVycm9yLWNvZGUgbXVzdCBjb250YWluIGEgdmFsaWQgSFRUUCBzdGF0dXMgY29kZS4KLSNFWFBMQU5BVElPTiBOb25lLgotI1VTRVJBQ1RJT04gTm9uZS4KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9JTlZBTElEX1JFU19TSEFSSU5HX1NDT1BFPUNIS0o0MDE5VzogSW52YWxpZCByZXMtc2hhcmluZy1zY29wZTsgdmFsaWQgdmFsdWVzIGFyZSBcIlNoYXJlYWJsZVwiIG9yIFwiVW5zaGFyZWFibGVcIi4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FTlZfRU5UUlk9Q0hLSjQwMjBXOiBJbnZhbGlkIEVudmlyb25tZW50IEVudHJ5IFR5cGUuIFZhbGlkIHZhbHVlcyBhcmUgXCJqYXZhLmxhbmcuVFlQRVwiLCB3aGVyZSBUWVBFIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBCb29sZWFuLCBCeXRlLCBDaGFyYWN0ZXIsIFN0cmluZywgU2hvcnQsIEludGVnZXIsIExvbmcsIEZsb2F0LCBvciBEb3VibGUuIgotI1VTRVJBQ1RJT04gTm9uZS4KLQotTUVTU0FHRV9XQVJfVkFMSURBVElPTl9NSVNTSU5HX1dMUF9QUk9KRUNUPUNIS0o0MDIxVzogTWlzc2luZyBXZWIgTGlicmFyeSBQcm9qZWN0ICh7MH0pLiAgQ2hlY2sgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyBwcm9qZWN0IHRvIGZpeCB0aGlzIHByb2JsZW0uCi1NRVNTQUdFX1dBUl9WQUxJREFUSU9OX0NPTkZMSUNUSU5HX1dMUF9QUk9KRUNUPUNIS0o0MDIyVzogVGhlIFdlYiBMaWJyYXJ5IFByb2plY3QgSkFSICh7MH0pIGNvbmZsaWN0cyB3aXRoIGFuIGFjdHVhbCBKQVIgaW4gdGhlIFdFQi1JTkYvbGliIGRpcmVjdG9yeS4KLU1TR19TRVJWRVJfVEFSR0VUX01JU01BVENIPUNIS0o0MDIzVzogVGhlIHRhcmdldCBzZXJ2ZXIgb2YgdGhlIFdlYiBMaWJyYXJ5IFByb2plY3QgKHsxfSkgZG9lcyBub3QgbWF0Y2ggdGhhdCBvZiB0aGlzIFdlYiBQcm9qZWN0ICh7MH0pLiAgUnVuIHZhbGlkYXRpb24gb24gdGhlIFdlYiBQcm9qZWN0IGlmIHlvdSB0aGluayB0aGF0IGlzIG5vdCB0aGUgY2FzZS4KLU1FU1NBR0VfVVJMX1BBVFRFUk5fRU5EX1dJVEhfQ0FSUkFJR0VfUkVUVVJOPVRoZSBVUkwgcGF0dGVybiBzdHJpbmcgInswfSIgZW5kcyB3aXRoIGEgaW52YWxpZCBjYXJyYWlnZSByZXR1cm4gZm9yIHNlcnZsZXQgezF9Ci0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLU1FU1NBR0VfV0FSX1ZBTElEQVRJT05fSU5WQUxJRF9FSkJfUkVGX1RZUEU9Q0hLSjQwMjNXOiBlamItcmVmLXR5cGUgbXVzdCBiZSAnRW50aXR5JyBvciAnU2Vzc2lvbicuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLUVSUk9SX0RVUExJQ0FURV9XRUJfSU5GX0xJQl9PVEhFUl9QUk9KRUNUPVdlYiBsaWJyYXJ5IHByb2plY3QgYXJjaGl2ZSB7MH0gZnJvbSBwcm9qZWN0IHsxfSBjb25mbGljdHMgd2l0aCBhbm90aGVyIGFyY2hpdmUgYWxzbyBtYXBwZWQgdG8gdGhlIFdFQi1JTkYvbGliIGZvbGRlci4KLUVSUk9SX0RVUExJQ0FURV9XRUJfSU5GX0xJQj1XZWIgbGlicmFyeSBwcm9qZWN0IGFyY2hpdmUgezB9IGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgYXJjaGl2ZSBhbHNvIG1hcHBlZCB0byB0aGUgV0VCLUlORi9saWIgZm9sZGVyLgotRVJST1JfRFVQTElDQVRFX0NMQVNTUEFUSF9DT01QT05FTlRfVVJJPVdlYiBsaWJyYXJ5IFVSSSB7MH0gZm9yIGNsYXNzcGF0aCBkZXBlbmRlbmN5IGZyb20gcHJvamVjdCB7MX0gbWFwcyB0byBhIGRpZmZlcmVudCBmaWxlIHN5c3RlbSBwYXRoIGFzIGFub3RoZXIgY2xhc3NwYXRoIGRlcGVuZGVuY3kgd2l0aCB0aGUgc2FtZSBVUkkuCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVSUk9SX0VBUl9NSVNTSU5HX0VKQl9ST0xFPUNIS0oyODI3VzogJydzZWN1cml0eS1yb2xlLXJlZicnIGVsZW1lbnQgezB9IGRlZmluZXMgdGhlICcncm9sZS1saW5rJycgZWxlbWVudCBidXQgbm8gJydzZWN1cml0eS1yb2xlJycgZWxlbWVudHMgaW4gdGhlIGFwcGxpY2F0aW9uIGRlc2NyaXB0b3IuCi0jRVhQTEFOQVRJT04gTm9uZS4KLSNVU0VSQUNUSU9OIE5vbmUuCi0KLW9mX1R5cGVfU2VjdXJpdHlfUm9sZV9OYW1lXzY9b2YgVHlwZSBTZWN1cml0eSBSb2xlIE5hbWUKLVdlYl9BcmNoaXZlX1ZhbGlkYXRvcl84PVdlYiBBcmNoaXZlIFZhbGlkYXRvcgotb2ZfVHlwZV9Sb2xlX05hbWVfMTk9b2YgVHlwZSBSb2xlIE5hbWUKLW9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMjU9b2YgVHlwZSBQYXJhbWV0ZXIgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfMjY9b2YgVHlwZSBQYXJhbWV0ZXIgVmFsdWUKLW9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMzI9b2YgVHlwZSBQYXJhbWV0ZXIgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfMzM9b2YgVHlwZSBQYXJhbWV0ZXIgVmFsdWUKLW9mX1R5cGVfUGFyYW1ldGVyX05hbWVfMzk9b2YgVHlwZSBQYXJhbWV0ZXIgTmFtZQotb2ZfVHlwZV9QYXJhbWV0ZXJfVmFsdWVfNDA9b2YgVHlwZSBQYXJhbWV0ZXIgVmFsdWUKLW9mX1R5cGVfZWpiX3JlZl9uYW1lXzQ0PW9mIFR5cGUgZWpiLXJlZi1uYW1lCi1vZl9UeXBlX0Vycm9yX0xvY2F0aW9uXzQ3PW9mIFR5cGUgRXJyb3IgTG9jYXRpb24KLW9mX1R5cGVfRXJyb3JfTG9jYXRpb25fNDk9b2YgVHlwZSBFcnJvciBMb2NhdGlvbgotb2ZfVHlwZV9NaW1lX0V4dGVuc2lvbl81ND1vZiBUeXBlIE1pbWUgRXh0ZW5zaW9uCi1vZl9UeXBlX01pbWVfVHlwZV81NT1vZiBUeXBlIE1pbWUgVHlwZQotb2ZfVHlwZV9NaW1lX0V4dGVuc2lvbl9fXzU2PW9mIFR5cGUgTWltZSBFeHRlbnNpb246Ci1vZl9UeXBlX1dlYl9SZXNvdXJjZV9Db2xsZWN0aW9uXzY0PW9mIFR5cGUgV2ViIFJlc291cmNlIENvbGxlY3Rpb24KLW9mX1R5cGVfRmlsdGVyX05hbWVfNjY9b2YgVHlwZSBGaWx0ZXIgTmFtZQotSW52YWxpZF9VUkxfNzA9SW52YWxpZCBVUkwKLUludmFsaWRfVVJMXzc1PUludmFsaWQgVVJMCi1vZl9UeXBlX1NlcnZsZXRfTmFtZV83Nz1vZiBUeXBlIFNlcnZsZXQgTmFtZQotb2ZfVHlwZV9UYWdsaWJfODA9b2YgVHlwZSBUYWdsaWIKLW9mX1R5cGVfVGFnTGliX19fODE9b2YgVHlwZSBUYWdMaWI6Ci1vZl9UeXBlX1dlYl9SZXNvdXJjZV9OYW1lXzg0PW9mIFR5cGUgV2ViIFJlc291cmNlIE5hbWUKLW9mX1R5cGVfV2VsY29tZV9GaWxlX05hbWVfXzg3PW9mIFR5cGUgV2VsY29tZSBGaWxlIE5hbWUKLW9mX1R5cGVfRW52X0VudHJ5X05hbWVfX184OD1vZiBUeXBlIEVudmlyb25tZW50IEVudHJ5IE5hbWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3Byb3BlcnR5X2ZpbGVzL3dlYi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2ViLnByb3BlcnRpZXMKaW5kZXggMjNlMjUwYS4uM2JhMDE1ZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2ViLnByb3BlcnRpZXMKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2ViLnByb3BlcnRpZXMKQEAgLTg2LDcgKzg2LDYgQEAKIEVSUl9UQUdMSUJSRUZfVVJMX0VYSVNUPVRoZSB0YWcgbGliIHJlZiBVUkwgYWxyZWFkeSBleGlzdHMuCiBFUlJfTUVTU0FHRV9ERVNUSU5BVElPTl9OQU1FX0VNUFRZPVRoZSBtZXNzYWdlIGRlc3RpbmF0aW9uIG5hbWUgY2Fubm90IGJlIGVtcHR5LgogRVJSX01FU1NBR0VfREVTVElOQVRJT05fTkFNRV9FWElTVD1UaGUgbWVzc2FnZSBkZXN0aW5hdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzLgotRVJSX0VYQ0VQVElPTl9ST0xFX05BTUVfRU1QVFk9VGhlIHNlY3VyaXR5IHJvbGUgbmFtZXMgY2Fubm90IGJlIGVtcHR5LgogRVJSX0VYQ0VQVElPTl9NRVRIT0RfRUxFTUVOVF9FTVBUWT1UaGUgbWV0aG9kIGVsZW1lbnRzIGNhbm5vdCBiZSBlbXB0eS4KIEVSUl9FWENFUFRJT05fTUVUSE9EX1RSQU5TQUNUSU9OX0FUVFJJQlVURVNfRU1QVFk9VGhlIG1ldGhvZCB0cmFuc2FjdGlvbiBhdHRyaWJ1dGVzIGNhbiBub3QgYmUgZW1wdHkuCiBFUlJfU0VSVkxFVF9MSVNUX0VNUFRZPVRoZSBsaXN0IG9mIHNlcnZsZXRzIHRvIGJlIHJlbW92ZWQgY2Fubm90IGJlIGVtcHR5LgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2ViZWRpdC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvcHJvcGVydHlfZmlsZXMvd2ViZWRpdC5wcm9wZXJ0aWVzCmluZGV4IDU0NzZmMjAuLjAzZDU3NjcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3Byb3BlcnR5X2ZpbGVzL3dlYmVkaXQucHJvcGVydGllcworKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi9wcm9wZXJ0eV9maWxlcy93ZWJlZGl0LnByb3BlcnRpZXMKQEAgLTE2LDcgKzE2LDcgQEAKIERJU1BBVENIRVJfST1JCiBESVNQQVRDSEVSX0U9RQogTElTVEVORVI9TGlzdGVuZXIKLVNlbGVjdF9EaXNwYXRjaGVyc19VSV89U2VsZWN0IERpc3BhdGNoZXJzCitTZWxlY3RfRGlzcGF0Y2hlcnNfVUlfPVNlbGVjdCBkaXNwYXRjaGVycwogQ29udGFpbmVyX1NlbGVjdGlvbl9VSV89Rm9sZGVyIFNlbGVjdGlvbgogQ2hvb3NlX2FfQ29udGFpbmVyX19VSV89Q2hvb3NlIGEgRm9sZGVyOgogQ29udGFpbmVyX19VSV89Rm9sZGVyOgpAQCAtMzAyLDkgKzMwMiwxMCBAQAogPHNlcnZsZXQ+X1VJXz08c2VydmxldD4KIFVybFBhdHRlcm5fVUlfPVVybFBhdHRlcm4KIFRoZV91cmxQYXR0ZXJuX3Byb3BlcnR5X1VJXz1UaGUgdXJsUGF0dGVybiBwcm9wZXJ0eQotU2VydmxldF9VSV89U2VydmxldAorU2VydmxldF9VSV89JlNlcnZsZXQKK0pTUF9VSV89JkpTUAogVGhlX3NlcnZsZXRfcHJvcGVydHlfVUlfPVRoZSBzZXJ2bGV0IHByb3BlcnR5Ci1VUkxfcGF0dGVybl9VSV89VVJMIFBhdHRlcm4KK1VSTF9wYXR0ZXJuX1VJXz0mVVJMIHBhdHRlcm4KID9fVUlfPT8KIFNlc3Npb25UaW1lb3V0X1VJXz1TZXNzaW9uVGltZW91dAogVGhlX3Nlc3Npb25UaW1lb3V0X3Byb3BlcnRfVUlfPVRoZSBzZXNzaW9uVGltZW91dCBwcm9wZXJ0eQpAQCAtNjk5LDEyICs3MDAsMTIgQEAKIFRoZV9Mb2NhbFRyYW5zYWN0aW9uX3Byb3BlcnR5XzQ9VGhlIExvY2FsVHJhbnNhY3Rpb24gcHJvcGVydHkKIFRoZV9NYXJrdXBMYW5ndWFnZV9wcm9wZXJ0eV82PVRoZSBNYXJrdXBMYW5ndWFnZSBwcm9wZXJ0eQogRGVmaW5lX0F1dGhvcml6YXRpb25fQ29uc3RyYWludF8xPURlZmluZSBBdXRob3JpemF0aW9uIENvbnN0cmFpbnQKLUNob29zZV9hX3NlcnZsZXRfXzE9Q2hvb3NlIGEgc2VydmxldDoKK0Nob29zZV9hX3NlcnZsZXRfXzE9JkNob29zZSBhIHNlcnZsZXQ6CiBDaG9vc2VfYV9zZXJ2bGV0X18yPUNob29zZSBhIFNlcnZsZXQ6Ci1NYXRjaGluZ19zZXJ2bGV0c19fMj1NYXRjaGluZyBzZXJ2bGV0czoKLUNob29zZV9hX2ZpbHRlcl9fMT1DaG9vc2UgYSBmaWx0ZXI6Ci1NYXRjaGluZ19maWx0ZXJzX18yPU1hdGNoaW5nIGZpbHRlcnM6Ci1RdWFsaWZpZXJfXzM9UXVhbGlmaWVyOgorTWF0Y2hpbmdfc2VydmxldHNfXzI9Jk1hdGNoaW5nIHNlcnZsZXRzOgorQ2hvb3NlX2FfZmlsdGVyX18xPSZDaG9vc2UgYSBmaWx0ZXI6CitNYXRjaGluZ19maWx0ZXJzX18yPSZNYXRjaGluZyBmaWx0ZXJzOgorUXVhbGlmaWVyX18zPSZRdWFsaWZpZXI6CiBBZGRfb3JfUmVtb3ZlX0VKQl9Mb2NhbF9SZWZlcmVuY2VfMT1BZGQgb3IgUmVtb3ZlIEVKQiBMb2NhbCBSZWZlcmVuY2UKIEFkZF9vcl9SZW1vdmVfTWFya3VwX0xhbmd1YWdlXzI9QWRkIG9yIFJlbW92ZSBNYXJrdXAgTGFuZ3VhZ2UKIENsb3NlX2VkaXRvcl8zPUNsb3NlIGVkaXRvcgpAQCAtNzE3LDggKzcxOCw2IEBACiBSZXNvdXJjZV8zPVJlc291cmNlCiBSZXNvdXJjZV9FbnZpcm9ubWVudF8xXzQ9UmVzb3VyY2VfRW52aXJvbm1lbnRfMQogSlNQX3RhZ19saWJyYXJpZXNfNV81PUpTUF90YWdfbGlicmFyaWVzXzUKLUNob29zZV9hX2ZpbHRlcl9fMT1DaG9vc2UgYSBmaWx0ZXI6Ci1NYXRjaGluZ19maWx0ZXJzX18yPU1hdGNoaW5nIGZpbHRlcnM6CiBDaG9vc2VfYV9saXN0ZW5lcl9fMT1DaG9vc2UgYSBsaXN0ZW5lcjoKIE1hdGNoaW5nX2xpc3RlbmVyX18yPU1hdGNoaW5nIGxpc3RlbmVyOgogUHJvYmxlbXNfb3BlbmluZ19lZGl0b3JfMj1Qcm9ibGVtcyBvcGVuaW5nIGVkaXRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL19jbGFzcy50ZW1wbGF0ZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9fY2xhc3MudGVtcGxhdGUKaW5kZXggNDI0ODgxMC4uMTdmYzU4YSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL19jbGFzcy50ZW1wbGF0ZQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvX2NsYXNzLnRlbXBsYXRlCkBAIC0yOSw3ICsyOSw3IEBACiAJfQogCQogIAlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLSAgIAkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOworICAgCQlTdHJpbmcgSU5URVJGQUNFID0gaW50ZXJmYWNlcy5nZXQoaSk7CiAgICAJCWlmIChpID4gMCkgewogJT4sIAogPCUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9maWx0ZXJfY2xhc3NIZWFkZXIudGVtcGxhdGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvZmlsdGVyX2NsYXNzSGVhZGVyLnRlbXBsYXRlCmluZGV4IDQ0MzQ2MWIuLmYwMDZhNWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9maWx0ZXJfY2xhc3NIZWFkZXIudGVtcGxhdGUKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL2ZpbHRlcl9jbGFzc0hlYWRlci50ZW1wbGF0ZQpAQCAtNTksNCArNTksMTkxIEBACiAJCX0gCiAJfQogJT4KLSAqLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAqLworICA8JSAKKwlpZiAoIjMuMCIuZXF1YWxzKG1vZGVsLmdldEphdmFFRVZlcnNpb24oKSkpIHsgCislPgorQFdlYkZpbHRlcgorPCUKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMgPSBtb2RlbC5nZXRDbGFzc0Fubm90YXRpb25QYXJhbXMoKTsKKwkJaWYgKHBhcmFtcy5zaXplKCkgPT0gMSAmJiBwYXJhbXMuY29udGFpbnNLZXkoQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuQVRUX1VSTF9QQVRURVJOUykpIHsKKwkJCUxpc3Q8U3RyaW5nPiBtYXBwaW5ncyA9IChMaXN0PFN0cmluZz4pIHBhcmFtcy5nZXQoQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuQVRUX1VSTF9QQVRURVJOUyk7CisJCQlpZiAobWFwcGluZ3Muc2l6ZSgpID09IDEpIHsKKwkJCQlTdHJpbmcgdmFsdWUgPSBtYXBwaW5ncy5nZXQoMCk7CislPigiPCU9IHZhbHVlICU+IikKKzwlCisJCQl9IGVsc2UgeworJT4oeyAKKzwlCisJCQkJYm9vbGVhbiBuZWVkQ29tbWEgPSBmYWxzZTsKKwkJCQlmb3IgKFN0cmluZyBtYXBwaW5nIDogbWFwcGluZ3MpIHsKKwkJCQkJaWYgKG5lZWRDb21tYSkgeworJT4sIAorPCUKKwkJCQkJfQorJT4iPCU9IG1hcHBpbmcgJT4iCis8JQorCQkJCQluZWVkQ29tbWEgPSB0cnVlOworCQkJCX0KKyU+IH0pCis8JQorCQkJfQorCQl9IGVsc2UgaWYgKCFwYXJhbXMuaXNFbXB0eSgpKSB7IAorJT4oCis8JQorCQkJU2V0PFN0cmluZz4ga2V5cyA9IHBhcmFtcy5rZXlTZXQoKTsKKwkJCWJvb2xlYW4gbmVlZE5ld0xpbmUgPSBrZXlzLmNvbnRhaW5zKENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuQVRUX0lOSVRfUEFSQU1TKSB8fCAKKwkJCQkJKGtleXMuY29udGFpbnMoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5BVFRfVVJMX1BBVFRFUk5TKSAmJiAKKwkJCQkJCQkoKExpc3Q8U3RyaW5nPikgcGFyYW1zLmdldChDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLkFUVF9VUkxfUEFUVEVSTlMpKS5zaXplKCkgPiAxKSB8fCAKKwkJCQkJKGtleXMuY29udGFpbnMoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5BVFRfU0VSVkxFVF9OQU1FUykgJiYgCisJCQkJCQkJKChMaXN0PFN0cmluZz4pIHBhcmFtcy5nZXQoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5BVFRfU0VSVkxFVF9OQU1FUykpLnNpemUoKSA+IDEpOworCQkJYm9vbGVhbiBuZWVkQ29tbWEgPSBmYWxzZTsKKwkJCWZvciAoU3RyaW5nIGtleSA6IGtleXMpIHsKKwkJCQlpZiAobmVlZENvbW1hKSB7CislPiwgCis8JQorCQkJCX0KKwkJCQkKKwkJCQlpZiAobmVlZE5ld0xpbmUpIHsKKyU+CisJCQorPCUKKwkJCQl9IAorCQkJCisJCQkJaWYgKGtleS5lcXVhbHMoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5BVFRfRklMVEVSX05BTUUpIHx8IGtleS5lcXVhbHMoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5BVFRfREVTQ1JJUFRJT04pKSB7IAorCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwYXJhbXMuZ2V0KGtleSk7CislPjwlPSBrZXkgJT4gPSAiPCU9IHZhbHVlICU+IgorPCUKKwkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5BVFRfVVJMX1BBVFRFUk5TKSkgeworJT48JT0ga2V5ICU+ID0geyAKKzwlCisJCQkJCUxpc3Q8U3RyaW5nPiBtYXBwaW5ncyA9IChMaXN0PFN0cmluZz4pIHBhcmFtcy5nZXQoa2V5KTsKKwkJCQkJYm9vbGVhbiBuZWVkQ29tbWEyID0gZmFsc2U7CisJCQkJCWJvb2xlYW4gbmVlZE5ld0xpbmUyID0gbWFwcGluZ3Muc2l6ZSgpID4gMTsKKwkJCQkJZm9yIChTdHJpbmcgbWFwcGluZyA6IG1hcHBpbmdzKSB7CisJCQkJCQlpZiAobmVlZENvbW1hMikgeworJT4sIAorPCUKKwkJCQkJCX0KKwkJCQkKKwkJCQkJCWlmIChuZWVkTmV3TGluZTIpIHsKKyU+CisJCQkJCis8JQorCQkJCQkJfSAKKyU+IjwlPSBtYXBwaW5nICU+IgorPCUJCQkJCisJCQkJCQluZWVkQ29tbWEyID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQorCQkJCQlpZiAobmVlZE5ld0xpbmUyKSB7CislPgorCQkKKzwlCisJCQkJCX0gZWxzZSB7CislPiAKKzwlCisJCQkJCX0KKyU+fQorPCUKKwkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5BVFRfU0VSVkxFVF9OQU1FUykpIHsKKyU+PCU9IGtleSAlPiA9IHsgCis8JQorCQkJCQlMaXN0PFN0cmluZz4gc2VydmxldE5hbWVzID0gKExpc3Q8U3RyaW5nPikgcGFyYW1zLmdldChrZXkpOworCQkJCQlib29sZWFuIG5lZWRDb21tYTIgPSBmYWxzZTsKKwkJCQkJYm9vbGVhbiBuZWVkTmV3TGluZTIgPSBzZXJ2bGV0TmFtZXMuc2l6ZSgpID4gMTsKKwkJCQkJZm9yIChTdHJpbmcgc2VydmxldE5hbWUgOiBzZXJ2bGV0TmFtZXMpIHsKKwkJCQkJCWlmIChuZWVkQ29tbWEyKSB7CislPiwgCis8JQorCQkJCQkJfQorCQkJCQorCQkJCQkJaWYgKG5lZWROZXdMaW5lMikgeworJT4KKwkJCQkKKzwlCisJCQkJCQl9IAorJT4iPCU9IHNlcnZsZXROYW1lICU+IgorPCUJCQkJCisJCQkJCQluZWVkQ29tbWEyID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQorCQkJCQlpZiAobmVlZE5ld0xpbmUyKSB7CislPgorCQkKKzwlCisJCQkJCX0gZWxzZSB7CislPiAKKzwlCisJCQkJCX0KKyU+fQorPCUKKwkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5BVFRfSU5JVF9QQVJBTVMpKSB7CislPjwlPSBrZXkgJT4gPSB7IAorPCUKKwkJCQkJTGlzdDxTdHJpbmdbXT4gaW5pdFBhcmFtcyA9IChMaXN0PFN0cmluZ1tdPikgcGFyYW1zLmdldChrZXkpOworCQkJCQlib29sZWFuIG5lZWRDb21tYTIgPSBmYWxzZTsKKwkJCQkJZm9yIChTdHJpbmdbXSBpbml0UGFyYW0gOiBpbml0UGFyYW1zKSB7CisJCQkJCQlpZiAobmVlZENvbW1hMikgeworJT4sIAorPCUKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJU3RyaW5nIG5hbWUgPSBpbml0UGFyYW1bQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5OQU1FXTsKKwkJCQkJCVN0cmluZyB2YWx1ZSA9IGluaXRQYXJhbVtDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLlZBTFVFXTsKKwkJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGluaXRQYXJhbVtDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLkRFU0NSSVBUSU9OXTsKKyU+CisJCQkJQFdlYkluaXRQYXJhbShuYW1lID0gIjwlPSBuYW1lICU+IiwgdmFsdWUgPSAiPCU9IHZhbHVlICU+IgorPCUJCQkJCisJCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCAmJiBkZXNjcmlwdGlvbi5sZW5ndGgoKSA+IDApIHsKKyU+LCBkZXNjcmlwdGlvbiA9ICI8JT0gZGVzY3JpcHRpb24gJT4iCis8JQorCQkJCQkJfQorJT4pCis8JQorCQkJCQkJbmVlZENvbW1hMiA9IHRydWU7CisJCQkJCX0KKyU+CisJCX0KKzwlCisJCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuQVRUX0RJU1BBVENIRVJfVFlQRVMpKSB7CisJCQkJTGlzdDxTdHJpbmc+IGRpc3BhdGNoZXJUeXBlcyA9IChMaXN0PFN0cmluZz4pIHBhcmFtcy5nZXQoa2V5KTsKKwkJCQkJYm9vbGVhbiBuZWVkQ29tbWEyID0gZmFsc2U7CisJCQkJCWJvb2xlYW4gbmVlZE5ld0xpbmUyID0gZGlzcGF0Y2hlclR5cGVzLnNpemUoKSA+IDE7CisJCQkJCWlmIChkaXNwYXRjaGVyVHlwZXMuc2l6ZSgpPjApeworCQkJCQklPjwlPSBrZXkgJT4gPSB7PCUgCisJCQkJCX0KKwkJCQkJZm9yIChTdHJpbmcgZGlzcFR5cGUgOiBkaXNwYXRjaGVyVHlwZXMpIHsKKwkJCQkJCWlmIChuZWVkQ29tbWEyKSB7CislPiwgCis8JQorCQkJCQkJfQorCQkJCQorCQkJCQkJaWYgKG5lZWROZXdMaW5lMikgeworJT4KKwkJCQkKKzwlCisJCQkJCQl9IAorJT48JT0gZGlzcFR5cGUgJT4KKzwlCQkJCQorCQkJCQkJbmVlZENvbW1hMiA9IHRydWU7CisJCQkJCX0KKwkJCQkKKwkJCQkJaWYgKG5lZWROZXdMaW5lMikgeworJT4KKwkJCis8JQorCQkJCQl9IGVsc2UgeworJT4gCis8JQorCQkJCQl9CisJCQkJCSU+fQorCQkJCQk8JQorCQkJCX0KKwkJCQluZWVkQ29tbWEgPSB0cnVlOworICAJCQl9CislPikKKzwlCisJCX0KKwl9CislPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9saXN0ZW5lcl9jbGFzc0hlYWRlci50ZW1wbGF0ZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3RlbXBsYXRlcy9saXN0ZW5lcl9jbGFzc0hlYWRlci50ZW1wbGF0ZQppbmRleCAzMGMyOGUwLi43M2ZmNDIyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvbGlzdGVuZXJfY2xhc3NIZWFkZXIudGVtcGxhdGUKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL2xpc3RlbmVyX2NsYXNzSGVhZGVyLnRlbXBsYXRlCkBAIC04LDQgKzgsMTEgQEAKIDwlIAogCX0KICU+Ci0gKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgKi8KKyAgPCUgCisJaWYgKCIzLjAiLmVxdWFscyhtb2RlbC5nZXRKYXZhRUVWZXJzaW9uKCkpKSB7IAorJT4KK0BXZWJMaXN0ZW5lcgorPCUKK30KKyU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvdGVtcGxhdGVzL3NlcnZsZXRfY2xhc3NIZWFkZXIudGVtcGxhdGUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvc2VydmxldF9jbGFzc0hlYWRlci50ZW1wbGF0ZQppbmRleCA0ZmQwNzA3Li45MzZlYWI0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvc2VydmxldF9jbGFzc0hlYWRlci50ZW1wbGF0ZQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi90ZW1wbGF0ZXMvc2VydmxldF9jbGFzc0hlYWRlci50ZW1wbGF0ZQpAQCAtNDUsNCArNDUsMTI1IEBACiAJCX0gCiAJfSAKICU+Ci0gKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgKi8KKzwlIAorCWlmICgiMy4wIi5lcXVhbHMobW9kZWwuZ2V0SmF2YUVFVmVyc2lvbigpKSkgeyAKKyU+CitAV2ViU2VydmxldAorPCUKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMgPSBtb2RlbC5nZXRDbGFzc0Fubm90YXRpb25QYXJhbXMoKTsKKwkJaWYgKHBhcmFtcy5zaXplKCkgPT0gMSAmJiBwYXJhbXMuY29udGFpbnNLZXkoQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuQVRUX1VSTF9QQVRURVJOUykpIHsKKwkJCUxpc3Q8U3RyaW5nW10+IG1hcHBpbmdzID0gKExpc3Q8U3RyaW5nW10+KSBwYXJhbXMuZ2V0KENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLkFUVF9VUkxfUEFUVEVSTlMpOworCQkJaWYgKG1hcHBpbmdzLnNpemUoKSA9PSAxKSB7CisJCQkJU3RyaW5nIHZhbHVlID0gbWFwcGluZ3MuZ2V0KDApWzBdOworJT4oIjwlPSB2YWx1ZSAlPiIpCis8JQorCQkJfSBlbHNlIHsKKyU+KHsgCis8JQorCQkJCWJvb2xlYW4gbmVlZENvbW1hID0gZmFsc2U7CisJCQkJZm9yIChTdHJpbmdbXSBtYXBwaW5nIDogbWFwcGluZ3MpIHsKKwkJCQkJaWYgKG5lZWRDb21tYSkgeworJT4sIAorPCUKKwkJCQkJfQorJT4iPCU9IG1hcHBpbmdbMF0gJT4iCis8JQorCQkJCQluZWVkQ29tbWEgPSB0cnVlOworCQkJCX0KKyU+IH0pCis8JQorCQkJfQorCQl9IGVsc2UgaWYgKCFwYXJhbXMuaXNFbXB0eSgpKSB7IAorJT4oCis8JQorCQkJU2V0PFN0cmluZz4ga2V5cyA9IHBhcmFtcy5rZXlTZXQoKTsKKwkJCWJvb2xlYW4gbmVlZE5ld0xpbmUgPSBrZXlzLmNvbnRhaW5zKENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLkFUVF9JTklUX1BBUkFNUykgfHwgCisJCQkJCShrZXlzLmNvbnRhaW5zKENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLkFUVF9VUkxfUEFUVEVSTlMpICYmIAorCQkJCQkJCSgoTGlzdDxTdHJpbmdbXT4pIHBhcmFtcy5nZXQoQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuQVRUX1VSTF9QQVRURVJOUykpLnNpemUoKSA+IDEpOworCQkJYm9vbGVhbiBuZWVkQ29tbWEgPSBmYWxzZTsKKwkJCWZvciAoU3RyaW5nIGtleSA6IGtleXMpIHsKKwkJCQlpZiAobmVlZENvbW1hKSB7CislPiwgCis8JQorCQkJCX0KKwkJCQkKKwkJCQlpZiAobmVlZE5ld0xpbmUpIHsKKyU+CisJCQorPCUKKwkJCQl9IAorCQkJCisJCQkJaWYgKGtleS5lcXVhbHMoQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuQVRUX05BTUUpIHx8IGtleS5lcXVhbHMoQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuQVRUX0RFU0NSSVBUSU9OKSkgeyAKKwkJCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgcGFyYW1zLmdldChrZXkpOworJT48JT0ga2V5ICU+ID0gIjwlPSB2YWx1ZSAlPiIKKzwlCisJCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLkFUVF9VUkxfUEFUVEVSTlMpKSB7CislPjwlPSBrZXkgJT4gPSB7IAorPCUKKwkJCQkJTGlzdDxTdHJpbmdbXT4gbWFwcGluZ3MgPSAoTGlzdDxTdHJpbmdbXT4pIHBhcmFtcy5nZXQoa2V5KTsKKwkJCQkJYm9vbGVhbiBuZWVkQ29tbWEyID0gZmFsc2U7CisJCQkJCWJvb2xlYW4gbmVlZE5ld0xpbmUyID0gbWFwcGluZ3Muc2l6ZSgpID4gMTsKKwkJCQkJZm9yIChTdHJpbmdbXSBtYXBwaW5nIDogbWFwcGluZ3MpIHsKKwkJCQkJCWlmIChuZWVkQ29tbWEyKSB7CislPiwgCis8JQorCQkJCQkJfQorCQkJCQorCQkJCQkJaWYgKG5lZWROZXdMaW5lMikgeworJT4KKwkJCQkKKzwlCisJCQkJCQl9IAorJT4iPCU9IG1hcHBpbmdbMF0gJT4iCis8JQkJCQkKKwkJCQkJCW5lZWRDb21tYTIgPSB0cnVlOworCQkJCQl9CisJCQkJCisJCQkJCWlmIChuZWVkTmV3TGluZTIpIHsKKyU+CisJCQorPCUKKwkJCQkJfSBlbHNlIHsKKyU+IAorPCUKKwkJCQkJfQorJT59Cis8JQorCQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhDcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbC5BVFRfSU5JVF9QQVJBTVMpKSB7CislPjwlPSBrZXkgJT4gPSB7IAorPCUKKwkJCQkJTGlzdDxTdHJpbmdbXT4gaW5pdFBhcmFtcyA9IChMaXN0PFN0cmluZ1tdPikgcGFyYW1zLmdldChrZXkpOworCQkJCQlib29sZWFuIG5lZWRDb21tYTIgPSBmYWxzZTsKKwkJCQkJZm9yIChTdHJpbmdbXSBpbml0UGFyYW0gOiBpbml0UGFyYW1zKSB7CisJCQkJCQlpZiAobmVlZENvbW1hMikgeworJT4sIAorPCUKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJU3RyaW5nIG5hbWUgPSBpbml0UGFyYW1bQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuTkFNRV07CisJCQkJCQlTdHJpbmcgdmFsdWUgPSBpbml0UGFyYW1bQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuVkFMVUVdOworCQkJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gaW5pdFBhcmFtW0NyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLkRFU0NSSVBUSU9OXTsKKyU+CisJCQkJQFdlYkluaXRQYXJhbShuYW1lID0gIjwlPSBuYW1lICU+IiwgdmFsdWUgPSAiPCU9IHZhbHVlICU+IgorPCUJCQkJCisJCQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCAmJiBkZXNjcmlwdGlvbi5sZW5ndGgoKSA+IDApIHsKKyU+LCBkZXNjcmlwdGlvbiA9ICI8JT0gZGVzY3JpcHRpb24gJT4iCis8JQorCQkJCQkJfQorJT4pCis8JQorCQkJCQkJbmVlZENvbW1hMiA9IHRydWU7CisJCQkJCX0KKyU+CisJCX0KKzwlCisJCQkJfQorCQkJCisJCQkJbmVlZENvbW1hID0gdHJ1ZTsKKyAgCQkJfQorJT4pCis8JQorCQl9CisJfQorJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93YXItdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvdmFsaWRhdGlvbi9VSVdhclZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2FyLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3ZhbGlkYXRpb24vVUlXYXJWYWxpZGF0b3IuamF2YQppbmRleCAxNWIyYjdjLi5kNjZkYjlmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93YXItdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvdmFsaWRhdGlvbi9VSVdhclZhbGlkYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dhci12YWxpZGF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi92YWxpZGF0aW9uL1VJV2FyVmFsaWRhdG9yLmphdmEKQEAgLTEyLDcgKzEyLDYgQEAKIAogCiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTI5LDggKzI4LDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uV2FyVmFsaWRhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LldlYlV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKQEAgLTg5LDYgKzg5LDcgQEAKIAkvKioKIAkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgxMC8yLzIwMDEgNjo0OToyNiBQTSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKIAkJLy8gRmlyc3QgcmVtb3ZlIGFsbCBwcmV2aW91cyBtc2cuIGZvciB0aGlzIHByb2plY3QKIAkJLy8JX3JlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMsbnVsbCk7CkBAIC05OSwxMyArMTAwLDE0IEBACiAJLyoqCiAJICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMTAvMi8yMDAxIDY6NDk6MjYgUE0pCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKQogCQkJdGhyb3dzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CiAJCQogCQlzZXRXYXJIZWxwZXIoKFVJV2FySGVscGVyKSBpbkhlbHBlcik7CiAJCUlQcm9qZWN0IHByb2ogPSAoKElXb3JrYmVuY2hDb250ZXh0KSB3YXJIZWxwZXIpLmdldFByb2plY3QoKTsKIAkJSVZpcnR1YWxDb21wb25lbnQgd2JNb2R1bGUgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qKTsKLSAgICAgICAgaWYoIHdiTW9kdWxlICE9IG51bGwgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qKSkgeyAgICAgICAgICAgCQorICAgICAgICBpZiggd2JNb2R1bGUgIT0gbnVsbCAmJiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvaikpIHsgICAgICAgICAgIAkKICAgICAgICAgCUlWaXJ0dWFsRmlsZSB3ZWJGaWxlID0gd2JNb2R1bGUuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJKTsKIAkJCWlmKCB3ZWJGaWxlLmV4aXN0cygpKSB7CiAJCQkJc3RhdHVzID0gc3VwZXIudmFsaWRhdGVJbkpvYihpbkhlbHBlciwgaW5SZXBvcnRlcik7CkBAIC0xNDUsMTkgKzE0NywxNCBAQAogCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IHdlYkxpYnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwogCQkJU3RyaW5nIG5hbWUgPSBudWxsOwogCQkJaWYgKGNvbXAuaXNCaW5hcnkoKSkgewotCQkJCVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGFyY2hpdmVDb21wID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBjb21wOwotCQkJCWphdmEuaW8uRmlsZSBkaXNrRmlsZSA9IGFyY2hpdmVDb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQkJCWlmICghZGlza0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJSUZpbGUgd2JGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCQkJZGlza0ZpbGUgPSBuZXcgRmlsZSh3YkZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQkJCX0KKwkJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSAoamF2YS5pby5GaWxlKWNvbXAuZ2V0QWRhcHRlcihqYXZhLmlvLkZpbGUuY2xhc3MpOwogCQkJCWNoZWNrTGliTmFtZShkaXNrRmlsZS5nZXROYW1lKCksIG51bGwsIHdlYkxpYk1hcHBpbmdzLCB0cnVlKTsKIAkJCX0gZWxzZSB7CiAJCQkJU3RyaW5nIGFyY2hpdmVOYW1lID0gd2ViTGlic1tpXS5nZXRBcmNoaXZlTmFtZSgpOwogCQkJCWlmIChhcmNoaXZlTmFtZSAhPSBudWxsICYmIGFyY2hpdmVOYW1lLmxlbmd0aCgpID4gMCkgewogCQkJCQluYW1lID0gYXJjaGl2ZU5hbWU7CiAJCQkJfSBlbHNlIHsKLQkJCQkJbmFtZSA9IGNvbXAuZ2V0TmFtZSgpICsgIi5qYXIiOyAvLyROT04tTkxTLTEkCisJCQkJCW5hbWUgPSBjb21wLmdldE5hbWUoKSArIElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQ7CiAJCQkJfQogCQkJCWNoZWNrTGliTmFtZShuYW1lLCBjb21wLmdldFByb2plY3QoKSwgd2ViTGliTWFwcGluZ3MsIHRydWUpOwogCQkJCWlmIChjb21wIGluc3RhbmNlb2YgSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIHsKQEAgLTI3MCw2ICsyNjcsNyBAQAogCQl9CiAJfSovCQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgewogCQkKIAkJSVByb2plY3QgcHJvamVjdCA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2FyLXZhbGlkYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3ZhbGlkYXRpb24vV2FySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93YXItdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvdmFsaWRhdGlvbi9XYXJIZWxwZXIuamF2YQppbmRleCA3ZjFkMzgwLi5lM2U4ZmJjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93YXItdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvdmFsaWRhdGlvbi9XYXJIZWxwZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93YXItdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvdmFsaWRhdGlvbi9XYXJIZWxwZXIuamF2YQpAQCAtMTgsMTEgKzE4LDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbi5KMkVFVmFsaWRhdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLldBUk1lc3NhZ2VDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKQEAgLTU1LDYgKzU1LDcgQEAKIAkgKiB3aWxsIGV4cGVjdCB0aGUgY29taW5nIG9iamVjdCB0byBiZSBhIEVPYmplY3QgZm9yIHRoZSBub2RlIHdobyBnZW5lcmF0ZWQgdGhpcyBtZXNzYWdlLiBOb3RlOgogCSAqIFRoaXMgbWV0aG9kcyBtYXkgbmVlZCB0byBiZSBpbXBsZW1lbnRlZCBoaWdoZXIgdXAgaW4gdGhlIGNsYXNzIHN0YWNrLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBpbnQgZ2V0TGluZU5vKE9iamVjdCBvYmplY3QpIHsKIAogCkBAIC02OSw2ICs3MCw3IEBACiAJICogR2l2ZW4gYSByZXNvdXJjZSwgcmV0dXJuIGl0cyBub24tZWNsaXBzZS1zcGVjaWZpYyBsb2NhdGlvbi4gSWYgdGhpcyByZXNvdXJjZSwgb3IgdHlwZSBvZgogCSAqIHJlc291cmNlLCBpc24ndCBoYW5kbGVkIGJ5IHRoaXMgaGVscGVyLCByZXR1cm4gbnVsbC4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKIAkJaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkpIHsKIAkJCXJldHVybiBudWxsOwpAQCAtODksNiArOTEsNyBAQAogCSAqIEBwYXJhbSBvYmplY3QKIAkgKiAgICAgICAgICAgIE9iamVjdAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqZWN0KSB7CiAJCQogCQlpZiggb2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgV0FSRmlsZSApewpAQCAtMTA4LDI1ICsxMTEsMjMgQEAKIAl9CiAKIAkKLQkvL3B1YmxpYyBFT2JqZWN0IGxvYWRXYXJGaWxlKENvbXBvbmVudEhhbmRsZSBoYW5kbGUpIHsKIAlwdWJsaWMgRU9iamVjdCBsb2FkV2FyRmlsZSgpIHsKIAkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpOwogCQkJZWRpdCA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXApOwogCQkJCi0JCQl0cnkgewotCQkJCXdhckZpbGUgPSAoV0FSRmlsZSkoKFdlYkFydGlmYWN0RWRpdCkgZWRpdCkuYXNBcmNoaXZlKGZhbHNlLCB0cnVlLCB0cnVlKTsKLQkJCQlyZXR1cm4gd2FyRmlsZTsKLQkJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlMSk7CisJCQlpZiAoZWRpdCAhPSBudWxsKQorCQkJeworCQkJCXRyeSB7CisJCQkJCXdhckZpbGUgPSAoV0FSRmlsZSkoKFdlYkFydGlmYWN0RWRpdCkgZWRpdCkuYXNBcmNoaXZlKGZhbHNlLCB0cnVlLCB0cnVlKTsKKwkJCQkJcmV0dXJuIHdhckZpbGU7CisJCQkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZTEpIHsKKwkJCQkJV2ViUGx1Z2luLmxvZ0Vycm9yKGUxKTsKKwkJCQl9CiAJCQl9Ci0vLwkJCWZpbmFsbHkgewotLy8JCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotLy8JCQkJCWVkaXQuZGlzcG9zZSgpOwotLy8JCQkJfQotLy8JCQl9CiAJCXJldHVybiBudWxsOwogCX0JCiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgY2xlYW51cChXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgewogCQlpZiAoZWRpdCAhPSBudWxsKSB7CiAJCQllZGl0LmRpc3Bvc2UoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvZGVwbG95YWJsZXMvTW9kdWxlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9kZXBsb3lhYmxlcy9Nb2R1bGVBZGFwdGVyLmphdmEKaW5kZXggMjdhYjJlZS4uNGRjMTRlMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9kZXBsb3lhYmxlcy9Nb2R1bGVBZGFwdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9kZXBsb3lhYmxlcy9Nb2R1bGVBZGFwdGVyLmphdmEKQEAgLTEwLDkgKzEwLDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIENyZWF0ZWQgb24gRmViIDgsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5kZXBsb3lhYmxlczsKIApAQCAtMjEsOSArMTgsNiBAQAogCiAvKioKICAqIEBhdXRob3IgYmxhbmNldHQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAgKi8KIHB1YmxpYyBjbGFzcyBNb2R1bGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewogICAgIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwuamF2YQppbmRleCBiOGIzMTVkLi4xNjQ2YmMxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwuamF2YQpAQCAtMTAsNyArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5kZXBsb3lhYmxlczsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCkBAIC0zMCw5ICsyOSwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5qZmFjZXMuZXh0ZW5zaW9uLkZpbGVVUkw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmpmYWNlcy5leHRlbnNpb24uRmlsZVVSTEV4dGVuc2lvblJlYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKQEAgLTgwLDEwICs4MSwxMCBAQAogCQkJCQlJUmVzb3VyY2UgZWNsaXBlU2VydlJlc29ydWNlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShzZXJ2UmVzb3VyY2UpOwogCQkJCQlyZXNvdXJjZXMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhlY2xpcGVTZXJ2UmVzb3J1Y2UpOwogCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCVdlYlBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQl9CiAJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJCQlpZiAocmVzb3VyY2VzWzBdICE9IG51bGwpCisJCQkJaWYgKHJlc291cmNlcyAhPSBudWxsICYmIHJlc291cmNlc1swXSAhPSBudWxsKQogCQkJCQljb21wb25lbnQgPSByZXNvdXJjZXNbMF0uZ2V0Q29tcG9uZW50KCk7CiAJCQkJU3RyaW5nIG1hcHBpbmcgPSBudWxsOwogCQkJCWphdmEudXRpbC5MaXN0IG1hcHBpbmdzID0gKChTZXJ2bGV0KSBvYmopLmdldE1hcHBpbmdzKCk7CkBAIC05NSw4ICs5NiwxMyBAQAogCQkJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIG5ldyBQYXRoKG1hcHBpbmcpKTsKIAkJCQl9CiAJCQkJV2ViVHlwZSB3ZWJUeXBlID0gKChTZXJ2bGV0KSBvYmopLmdldFdlYlR5cGUoKTsKLQkJCQlpZiAod2ViVHlwZS5pc0pzcFR5cGUoKSkgewotCQkJCQlyZXNvdXJjZSA9ICgoSVByb2plY3QpIHJlc291cmNlKS5nZXRGaWxlKCgoSlNQVHlwZSkgd2ViVHlwZSkuZ2V0SnNwRmlsZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCWlmICh3ZWJUeXBlID09IG51bGwpIHsKKwkJCQkJcmV0dXJuIG51bGw7CisJCQkJfSBlbHNlIGlmICh3ZWJUeXBlLmlzSnNwVHlwZSgpKSB7CisJCQkJCWlmIChjb21wb25lbnQgIT0gbnVsbCkgeworCQkJCQkJSVBhdGgganNwRmlsZVBhdGggPSBuZXcgUGF0aCgoKEpTUFR5cGUpIHdlYlR5cGUpLmdldEpzcEZpbGUoKSk7CisJCQkJCQlyZXNvdXJjZSA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpLmdldEZpbGUoanNwRmlsZVBhdGgpOworCQkJCQl9CiAJCQkJfSBlbHNlIGlmICh3ZWJUeXBlLmlzU2VydmxldFR5cGUoKSkgewogCQkJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIG5ldyBQYXRoKCJzZXJ2bGV0LyIgKyAoKFNlcnZsZXRUeXBlKSB3ZWJUeXBlKS5nZXRDbGFzc05hbWUoKSkpOyAvLyROT04tTkxTLTEkCiAJCQkJfQpAQCAtMTMzLDcgKzEzOSw3IEBACiAJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIG5ldyBQYXRoKCJzZXJ2bGV0LyIgKyBjbGFzc05hbWUpKTsgLy8kTk9OLU5MUy0xJAogCiAJCX0KLQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7CisJCWlmIChjbGFzc05hbWUgPT0gbnVsbCAmJiBjb21wb25lbnQgIT0gbnVsbCkgewogCQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwogCQkJdHJ5IHsKIAkJCQl3ZWJFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKQEAgLTE0Myw4ICsxNDksOSBAQAogCQkJCQlXZWJUeXBlIHR5cGUgPSBzZXJ2bGV0LmdldFdlYlR5cGUoKTsKIAkJCQkJaWYgKHR5cGUuaXNKc3BUeXBlKCkpIHsKIAkJCQkJCUpTUFR5cGUganNwID0gKEpTUFR5cGUpdHlwZTsKLQkJCQkJCVN0cmluZyBqc3BQYXRoID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKLQkJCQkJCWlmIChqc3AuZ2V0SnNwRmlsZSgpLmVxdWFscyhqc3BQYXRoKSkgeworCQkJCQkJSVBhdGggcm9vdFBhdGggPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKKwkJCQkJCUlQYXRoIGpzcFBhdGggPSByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhyb290UGF0aC5zZWdtZW50Q291bnQoKSk7CisJCQkJCQlpZiAoanNwLmdldEpzcEZpbGUoKS5lcXVhbHMoanNwUGF0aC5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpKSkgewogCQkJCQkJCUxpc3QgbWFwcGluZ3MgPSBzZXJ2bGV0LmdldE1hcHBpbmdzKCk7CiAJCQkJCQkJU3RyaW5nIG1hcHBpbmcgPSBudWxsOwogCQkJCQkJCWlmIChtYXBwaW5ncyAhPSBudWxsICYmICFtYXBwaW5ncy5pc0VtcHR5KCkpIHsKQEAgLTE3NywyNSArMTg0LDMyIEBACiAJfQogCiAJcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0LCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSU1vZHVsZSBkZXBsb3lhYmxlID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQikpLml0ZXJhdG9yKCk7IC8vJE5PTi1OTFMtMSQKIAkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBudWxsOwogCQlpZiAoY29tcG9uZW50ICE9IG51bGwpCiAJCQljb21wb25lbnROYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldE1vZHVsZVByb2plY3QocHJvamVjdCwgaXRlcmF0b3IpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCWRlcGxveWFibGUgPSAoSU1vZHVsZSkgbmV4dDsKLQkJCQlpZiAoZGVwbG95YWJsZS5nZXROYW1lKCkuZXF1YWxzKGNvbXBvbmVudE5hbWUpKSB7Ci0JCQkJCXJldHVybiBkZXBsb3lhYmxlOwotCQkJCX0KKwkJCisJCS8vIGNoZWNrIGZvciBqc3Qud2ViIG1vZHVsZXMgZmlyc3QKKwkJSU1vZHVsZVtdIG1vZHVsZXMgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZXMoSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQik7CisJCWZvciAoSU1vZHVsZSBtb2R1bGUgOiBtb2R1bGVzKSB7CisJCQlpZiAoKHByb2plY3QgPT0gbnVsbCB8fCBwcm9qZWN0LmVxdWFscyhtb2R1bGUuZ2V0UHJvamVjdCgpKSkKKwkJCQkJJiYgKGNvbXBvbmVudE5hbWUgPT0gbnVsbCB8fCBjb21wb25lbnROYW1lLmVxdWFscyhtb2R1bGUuZ2V0TmFtZSgpKSkpCisJCQkJcmV0dXJuIG1vZHVsZTsKKwkJfQorCQkKKwkJLy8gb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBvdGhlciB0eXBlcyBvZiB3ZWIgbW9kdWxlcyBvbiB0aGUgcHJvamVjdAorCQlpZiAocHJvamVjdCAhPSBudWxsKSB7CisJCQltb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKHByb2plY3QpOworCQkJZm9yIChJTW9kdWxlIG1vZHVsZSA6IG1vZHVsZXMpIHsKKwkJCQlpZiAoY29tcG9uZW50TmFtZSA9PSBudWxsIHx8IGNvbXBvbmVudE5hbWUuZXF1YWxzKG1vZHVsZS5nZXROYW1lKCkpKQorCQkJCQlyZXR1cm4gbW9kdWxlOwogCQkJfQogCQl9CiAJCXJldHVybiBudWxsOwogCX0KIAorCS8qKgorCSAqICBAZGVwcmVjYXRlZCAtIHNlZSBnZXRNb2R1bGUoKSBmb3IgYmV0dGVyIGxvZ2ljIGZvciBmaW5kaW5nIGEgcHJvamVjdCdzIElNb2R1bGUKKwkgKi8KIAlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBJdGVyYXRvciBpdGVyYXRvcikgewogCQlJTW9kdWxlIGRlcGxveWFibGUgPSBudWxsOwogCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CkBAIC0yOTMsNyArMzA3LDcgQEAKIAogCQkJaW50IHNpemUgPSBzdXBlckNsYXNzZXMubGVuZ3RoOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoc3VwZXJDbGFzc05hbWUuZXF1YWxzKHN1cGVyQ2xhc3Nlc1tpXS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpIC8vJE5PTi1OTFMtMSQKKwkJCQlpZiAoc3VwZXJDbGFzc05hbWUuZXF1YWxzKHN1cGVyQ2xhc3Nlc1tpXS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpIAogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KIAkJCXJldHVybiBmYWxzZTsKQEAgLTM0Nyw3ICszNjEsNyBAQAogCX0KIAogCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNJbnRlcmVzdGVkQ29tcG9uZW50cyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpOworCQlyZXR1cm4gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9kZXBsb3lhYmxlcy9XZWJNb2R1bGVBcnRpZmFjdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9kZXBsb3lhYmxlcy9XZWJNb2R1bGVBcnRpZmFjdC5qYXZhCmluZGV4IDlmMjEzYTkuLjgwZDkzODEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvZGVwbG95YWJsZXMvV2ViTW9kdWxlQXJ0aWZhY3QuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2RlcGxveWFibGVzL1dlYk1vZHVsZUFydGlmYWN0LmphdmEKQEAgLTEwLDkgKzEwLDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIENyZWF0ZWQgb24gRmViIDIxLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuZGVwbG95YWJsZXM7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2pmYWNlcy9leHRlbnNpb24vRmlsZVVSTC5qYXZhCmluZGV4IDc3N2U5MjUuLjMyNWRjYjcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9qZmFjZXMvZXh0ZW5zaW9uL0ZpbGVVUkwuamF2YQpAQCAtMTAsOSArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogQ3JlYXRlZCBvbiBKdW4gMTMsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5qZmFjZXMuZXh0ZW5zaW9uOwogCkBAIC0yMiwxMCArMTksMTIgQEAKIAogLyoqCiAgKiBAYXV0aG9yIHZpamF5YgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLQotICogQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgRmlsZVVSTCB7CisJCisJLyoqCisJICogQHJldHVybiBUaGUgZXhpc3RpbmdVUkwgaWYgbm8gc3VpdGFibGUgZXh0ZW5kZXIgaXMgZm91bmQsIGVsc2UgdGhlIAorCSAqIHBhdGggY29ycmVzcG9uZGluZyB0byB0aGUgcGFzc2VkIGluIHJlc291cmNlLiAKKwkgKi8KIAlwdWJsaWMgSVBhdGggZ2V0RmlsZVVSTChJUmVzb3VyY2UgcmVzb3VyY2UsIElQYXRoIGV4aXN0aW5nVVJMKTsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2pmYWNlcy9leHRlbnNpb24vRmlsZVVSTEV4dGVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9qZmFjZXMvZXh0ZW5zaW9uL0ZpbGVVUkxFeHRlbnNpb24uamF2YQppbmRleCA1M2UyMDc1Li4wNTU3NWFmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2pmYWNlcy9leHRlbnNpb24vRmlsZVVSTEV4dGVuc2lvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMRXh0ZW5zaW9uLmphdmEKQEAgLTEwLDIwICsxMCwxNCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogQ3JlYXRlZCBvbiBKdW4gMTMsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5qZmFjZXMuZXh0ZW5zaW9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwogCiAvKioKICAqIEBhdXRob3IgdmlqYXliCi0gKiAKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtCi0gKiBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKICAqLwogcHVibGljIGNsYXNzIEZpbGVVUkxFeHRlbnNpb24gewogCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKQEAgLTQ4LDcgKzQyLDcgQEAKIAkJCWlmICh0aGlzLmluc3RhbmNlID09IG51bGwgJiYgIXRoaXMuZXJyb3JDb25kaXRpb24pCiAJCQkJdGhpcy5pbnN0YW5jZSA9IChGaWxlVVJMKSB0aGlzLmVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigicnVuIik7IC8vJE5PTi1OTFMtMSQKIAkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCVdlYlBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCXRoaXMuZXJyb3JDb25kaXRpb24gPSB0cnVlOwogCQl9CiAJCXJldHVybiB0aGlzLmluc3RhbmNlOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9qZmFjZXMvZXh0ZW5zaW9uL0ZpbGVVUkxFeHRlbnNpb25SZWFkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvamZhY2VzL2V4dGVuc2lvbi9GaWxlVVJMRXh0ZW5zaW9uUmVhZGVyLmphdmEKaW5kZXggYzE4OGNjMy4uYWMyOWIzYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9qZmFjZXMvZXh0ZW5zaW9uL0ZpbGVVUkxFeHRlbnNpb25SZWFkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2pmYWNlcy9leHRlbnNpb24vRmlsZVVSTEV4dGVuc2lvblJlYWRlci5qYXZhCkBAIC0xNyw4ICsxNywxMCBAQAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlJlZ2lzdHJ5UmVhZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUudXRpbC5SZWdpc3RyeVJlYWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKIAogLyoqCkBAIC0yNyw2ICsyOSw3IEBACiAgKiBUaGlzIGNsYXNzIGxvYWRzIGFsbCB0aGUgZXh0ZW5zaW9ucyB0aGF0IGRlZmluZSB0aGUgY29ycmVjdCBVUkwgc3RyaW5nIGZvciB0aGUgSmF2YSBTZXJ2ZXIgRmFjZXMKICAqIGZpbGUKICAqICAKKyAqICAKICAqLwogcHVibGljIGNsYXNzIEZpbGVVUkxFeHRlbnNpb25SZWFkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7CiAJc3RhdGljIEZpbGVVUkxFeHRlbnNpb25SZWFkZXIgaW5zdGFuY2UgPSBudWxsOwpAQCAtNDcsNiArNTAsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKIAkJaWYgKEZpbGVVUkxFeHRlbnNpb24uRklMRV9VUkxfRVhURU5TSU9OLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKIAkJCWFkZEV4dGVuc2lvbihlbGVtZW50KTsKQEAgLTgzLDEzICs4Nyw0MSBAQAogCSAqLwogCXB1YmxpYyBGaWxlVVJMIGdldEZpbGVzVVJMKCkgewogCQlGaWxlVVJMRXh0ZW5zaW9uIGZpbGVVUkxFeHQ7CisJCUFycmF5TGlzdDxGaWxlVVJMPiBmaWxlVXJsTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmlsZVVSTD4oKTsKKwkJRmlsZVVSTCBjdXJyZW50VVJMID0gbnVsbDsKIAkJZm9yIChJdGVyYXRvciBmaWxlVVJMRXh0SXRyID0gZ2V0RmlsZVVSTEV4dGVuc2lvbnMoKS5pdGVyYXRvcigpOyBmaWxlVVJMRXh0SXRyLmhhc05leHQoKTspIHsKIAkJCWZpbGVVUkxFeHQgPSAoRmlsZVVSTEV4dGVuc2lvbikgZmlsZVVSTEV4dEl0ci5uZXh0KCk7Ci0JCQlyZXR1cm4gZmlsZVVSTEV4dC5nZXRJbnN0YW5jZSgpOworCQkJY3VycmVudFVSTCA9IGZpbGVVUkxFeHQuZ2V0SW5zdGFuY2UoKTsKKwkJCWlmIChjdXJyZW50VVJMICE9IG51bGwpCisJCQkJZmlsZVVybExpc3QuYWRkKGN1cnJlbnRVUkwpOwogCQl9Ci0JCXJldHVybiBudWxsOworCQlpZiAoZmlsZVVybExpc3Quc2l6ZSgpID09IDEpCisJCQlyZXR1cm4gZmlsZVVybExpc3QuZ2V0KDApOworCQlyZXR1cm4gbmV3IEZpbGVVUkxXcmFwcGVyKGZpbGVVcmxMaXN0KTsKIAl9CiAKKwkKKwkKKwlwcml2YXRlIGNsYXNzIEZpbGVVUkxXcmFwcGVyIGltcGxlbWVudHMgRmlsZVVSTCB7CisJCUFycmF5TGlzdDxGaWxlVVJMPiBteVVybExpc3QgPSBuZXcgQXJyYXlMaXN0PEZpbGVVUkw+KCk7CisJCXB1YmxpYyBGaWxlVVJMV3JhcHBlcihBcnJheUxpc3Q8RmlsZVVSTD4gbmV3VXJsTGlzdCkKKwkJeworCQkJbXlVcmxMaXN0ID0gbmV3VXJsTGlzdDsKKwkJfQorCQlwdWJsaWMgSVBhdGggZ2V0RmlsZVVSTChJUmVzb3VyY2UgcmVzb3VyY2UsIElQYXRoIGV4aXN0aW5nVVJMKSB7CisJCQlJUGF0aCByZXRWYWwgPSBleGlzdGluZ1VSTDsKKwkJCWZvciAoRmlsZVVSTCBmaWxlVXJsOiBteVVybExpc3QpeworCQkJCXJldFZhbCA9IGZpbGVVcmwuZ2V0RmlsZVVSTChyZXNvdXJjZSwgZXhpc3RpbmdVUkwpOworCQkJCWlmIChyZXRWYWwgIT0gZXhpc3RpbmdVUkwgJiYgcmV0VmFsICE9IG51bGwpCisJCQkJeworCQkJCQlyZXR1cm4gcmV0VmFsOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiByZXRWYWw7CisJCX0KKwl9CisJCisJCiAJLyoqCiAJICogR2V0cyB0aGUgaW5zdGFuY2UuCiAJICogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQWRkRmlsdGVyT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQWRkRmlsdGVyT3BlcmF0aW9uLmphdmEKaW5kZXggMzAwYTM0NS4uMzMxZGFlNCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZEZpbHRlck9wZXJhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BZGRGaWx0ZXJPcGVyYXRpb24uamF2YQpAQCAtMTgsNiArMTgsOSBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5OZXdKYXZhRUVBcnRpZmFjdENsYXNzT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkRpc3BhdGNoZXJUeXBlOwpAQCAtMTQ0LDcgKzE0Nyw3IEBACiAJCSAgICBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShERVNDUklQVElPTik7CiAKIAkJLy8gQ3JlYXRlIHRoZSBmaWx0ZXIgaW5zdGFuY2UgYW5kIHNldCB1cCB0aGUgcGFyYW1ldGVycyBmcm9tIGRhdGEgbW9kZWwKLQkJT2JqZWN0IG1vZGVsT2JqZWN0ID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKKwkJT2JqZWN0IG1vZGVsT2JqZWN0ID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoV0VCX0FQUF9YTUxfUEFUSCk7CiAJCWlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCkgewogCQkJRmlsdGVyIGZpbHRlciA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsdGVyKCk7CiAJCQlmaWx0ZXIuc2V0TmFtZShkaXNwbGF5TmFtZSk7CkBAIC0xNTYsMTcgKzE1OSwxNSBAQAogCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIG1vZGVsT2JqZWN0OwogCQkJd2ViQXBwLmdldEZpbHRlcnMoKS5hZGQoZmlsdGVyKTsKIAkJCXJldHVybiBmaWx0ZXI7Ci0JCX0gZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIHsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCB3ZWJBcHAgPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSBtb2RlbE9iamVjdDsKKwkJfSBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24pIHsKKwkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24gd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLklXZWJDb21tb24pIG1vZGVsT2JqZWN0OwogCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyIGZpbHRlciA9IFdlYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbHRlcigpOwogCQkJRGlzcGxheU5hbWUgZGlzcGxheU5hbWVPYmogPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNwbGF5TmFtZSgpOwogICAgICAgICAgICAgZGlzcGxheU5hbWVPYmouc2V0VmFsdWUoZGlzcGxheU5hbWUpOwogICAgICAgICAgICAgZmlsdGVyLmdldERpc3BsYXlOYW1lcygpLmFkZChkaXNwbGF5TmFtZU9iaik7CiAJCQlmaWx0ZXIuc2V0RmlsdGVyTmFtZShkaXNwbGF5TmFtZSk7CiAJCQlmaWx0ZXIuc2V0RmlsdGVyQ2xhc3MocXVhbGlmaWVkQ2xhc3NOYW1lKTsKLQkJCWlmICh3ZWJBcHAgIT0gbnVsbCkgewotCQkJCXdlYkFwcC5nZXRGaWx0ZXJzKCkuYWRkKGZpbHRlcik7Ci0JCQl9CisJCQl3ZWJBcHAuZ2V0RmlsdGVycygpLmFkZChmaWx0ZXIpOwogCQkJLy8gU2hvdWxkIGJlIHJldHVybiBGaWx0ZXIncyBpbnN0YW5jZQogCQkJcmV0dXJuIGZpbHRlcjsKIAkJfQpAQCAtMTk5LDEyICsyMDAsMTcgQEAKIAkJCQlmb3IgKGludCBpUCA9IDA7IGlQIDwgaW5pdFBhcmFtTGlzdC5zaXplKCk7IGlQKyspIHsKIAkJCQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSAoU3RyaW5nW10pIGluaXRQYXJhbUxpc3QuZ2V0KGlQKTsKIAkJCQkJLy8gQ3JlYXRlIDEuNCBjb21tb24gcGFyYW0gdmFsdWUKLQkJCQkJSW5pdFBhcmFtIHBhcmFtID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbml0UGFyYW0oKTsKLQkJCQkJcGFyYW0uc2V0UGFyYW1OYW1lKHN0cmluZ0FycmF5WzBdKTsKLQkJCQkJcGFyYW0uc2V0UGFyYW1WYWx1ZShzdHJpbmdBcnJheVsxXSk7CisJCQkJCVBhcmFtVmFsdWUgcGFyYW0gPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbVZhbHVlKCk7CisJCQkJCXBhcmFtLnNldE5hbWUoc3RyaW5nQXJyYXlbMF0pOworCQkJCQlwYXJhbS5zZXRWYWx1ZShzdHJpbmdBcnJheVsxXSk7CisJCQkJCS8vIENyZWF0ZSAxLjQgY29tbW9uIGRlc2NyaXB0b24gdmFsdWUKKwkJCQkJRGVzY3JpcHRpb24gZGVzY3JpcHRpb25PYmogPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpOworCQkJCQlkZXNjcmlwdGlvbk9iai5zZXRWYWx1ZShzdHJpbmdBcnJheVsyXSk7CisJCQkJCS8vIFNldCB0aGUgZGVzY3JpcHRpb24gb24gdGhlIHBhcmFtCisJCQkJCXBhcmFtLmdldERlc2NyaXB0aW9ucygpLmFkZChkZXNjcmlwdGlvbk9iaik7CiAJCQkJCXBhcmFtLnNldERlc2NyaXB0aW9uKHN0cmluZ0FycmF5WzJdKTsKIAkJCQkJLy8gU2V0IHRoZSBwYXJhbSB0byB0aGUgZmlsdGVyIG1vZGVsIGxpc3Qgb2YgaW5pdCBwYXJhbXMKLQkJCQkJZmlsdGVyLmdldEluaXRQYXJhbXMoKS5hZGQocGFyYW0pOworCQkJCQlmaWx0ZXIuZ2V0SW5pdFBhcmFtVmFsdWVzKCkuYWRkKHBhcmFtKTsKIAkJCQl9CiAJCQl9CiAJCQkvLyBJZiBKMkVFIDEuMiBvciAxLjMsIHVzZSB0aGUgZmlsdGVyIHNwZWNpZmljIGluaXQgcGFyYW0gaW5zdGFuY2VzCkBAIC0yMjMsNyArMjI5LDcgQEAKIAkJCQkJZmlsdGVyLmdldEluaXRQYXJhbXMoKS5hZGQoaXApOwogCQkJCX0KIAkJCX0KLQkJfSBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgeworCQl9IGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbikgewogCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyIGZpbHRlciA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIpIGZpbHRlck9iajsKIAogCQkJZm9yIChpbnQgaVAgPSAwOyBpUCA8IGluaXRQYXJhbUxpc3Quc2l6ZSgpOyBpUCsrKSB7CkBAIC0yNjIsNyArMjY4LDcgQEAKIAlwcml2YXRlIHZvaWQgc2V0VXBNYXBwaW5ncyhMaXN0IGZpbHRlck1hcHBpbmdzTGlzdCwgT2JqZWN0IGZpbHRlck9iaikgewogCQkvLyBHZXQgdGhlIHdlYiBhcHAgbW9kZWxsZWQgb2JqZWN0IGZyb20gdGhlIGRhdGEgbW9kZWwKIAkJLy8gV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIGFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCk7Ci0JCU9iamVjdCBtb2RlbE9iamVjdCA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7CisJCU9iamVjdCBtb2RlbE9iamVjdCA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KFdFQl9BUFBfWE1MX1BBVEgpOwogCiAJCS8vIENyZWF0ZSB0aGUgZmlsdGVyIG1hcHBpbmdzIGlmIGFueQogCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKQEAgLTMwMSw4ICszMDcsOCBAQAogCQkJICAgICAgICAvLyBBZGQgdGhlIGZpbHRlciBtYXBwaW5nIHRvIHRoZSB3ZWIgYXBwbGljYXRpb24gbW9kZWxsZWQgbGlzdAogCQkJICAgICAgICB3ZWJBcHAuZ2V0RmlsdGVyTWFwcGluZ3MoKS5hZGQobWFwcGluZyk7CiAJCQkgICAgfQotCQl9IGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0JCSAgICBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxPYmplY3Q7CisJCX0gZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uKSB7CisJCSAgICBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uIHdlYkFwcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uKSBtb2RlbE9iamVjdDsKIAkJICAgIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlciBmaWx0ZXIgPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyKSBmaWx0ZXJPYmo7CiAKIAkJICAgIC8vIENyZWF0ZSB0aGUgZmlsdGVyIG1hcHBpbmcgaW5zdGFuY2UgZnJvbSB0aGUgd2ViIGZhY3RvcnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BZGRMaXN0ZW5lck9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZExpc3RlbmVyT3BlcmF0aW9uLmphdmEKaW5kZXggMmNiODFjNC4uOThhZmFkZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZExpc3RlbmVyT3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZExpc3RlbmVyT3BlcmF0aW9uLmphdmEKQEAgLTc2LDYgKzc2LDcgQEAKIAkgKiBAcGFyYW0gYU1vZGVsCiAJICogQHBhcmFtIHF1YWxpZmllZENsYXNzTmFtZQogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlTWV0YURhdGEoSURhdGFNb2RlbCBhTW9kZWwsIFN0cmluZyBxdWFsaWZpZWRDbGFzc05hbWUpIHsKIAkJLy8gU2V0IHVwIHRoZSBsaXN0ZW5lciBtb2RlbGVkIG9iamVjdAogCQljcmVhdGVMaXN0ZW5lcihxdWFsaWZpZWRDbGFzc05hbWUpOwpAQCAtOTQsNyArOTUsNyBAQAogCSAqIEByZXR1cm4gTGlzdGVuZXIgaW5zdGFuY2UKIAkgKi8KIAlwcml2YXRlIE9iamVjdCBjcmVhdGVMaXN0ZW5lcihTdHJpbmcgcXVhbGlmaWVkQ2xhc3NOYW1lKSB7Ci0JCU9iamVjdCBtb2RlbE9iamVjdCA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7CisJCU9iamVjdCBtb2RlbE9iamVjdCA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KFdFQl9BUFBfWE1MX1BBVEgpOwogCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAgKXsKIAkJCS8vIENyZWF0ZSB0aGUgbGlzdGVuZXIgaW5zdGFuY2UgYW5kIHNldCB1cCB0aGUgcGFyYW1ldGVycyBmcm9tIGRhdGEgbW9kZWwKIAkJCUxpc3RlbmVyIGxpc3RlbmVyID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGlzdGVuZXIoKTsKQEAgLTEwNCwxMyArMTA1LDEzIEBACiAJCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgbW9kZWxPYmplY3Q7CiAJCQl3ZWJBcHAuZ2V0TGlzdGVuZXJzKCkuYWRkKGxpc3RlbmVyKTsKIAkJCXJldHVybiBsaXN0ZW5lcjsKLQkJfSBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCApeworCQl9IGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbiApewogCQkJLy8gQ3JlYXRlIHRoZSBsaXN0ZW5lciBpbnN0YW5jZSBhbmQgc2V0IHVwIHRoZSBwYXJhbWV0ZXJzIGZyb20gZGF0YSBtb2RlbAogCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyIGxpc3RlbmVyID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGlzdGVuZXIoKTsKIAkJCWxpc3RlbmVyLnNldExpc3RlbmVyQ2xhc3MocXVhbGlmaWVkQ2xhc3NOYW1lKTsKIAogCQkJLy8gQWRkIHRoZSBsaXN0ZW5lciB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIG1vZGVsCi0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxPYmplY3Q7CisJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uIHdlYkFwcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5JV2ViQ29tbW9uKSBtb2RlbE9iamVjdDsKIAkJCXdlYkFwcC5nZXRMaXN0ZW5lcnMoKS5hZGQobGlzdGVuZXIpOwkKIAkJCXJldHVybiBsaXN0ZW5lcjsKIAkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZFNlcnZsZXRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BZGRTZXJ2bGV0T3BlcmF0aW9uLmphdmEKaW5kZXggZWE1YzZjOGEuLmQ0MWIxNDAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BZGRTZXJ2bGV0T3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0FkZFNlcnZsZXRPcGVyYXRpb24uamF2YQpAQCAtMzQsNiArMzQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EaXNwbGF5TmFtZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuSVdlYkNvbW1vbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwpAQCAtNzYsNiArNzcsOCBAQAogCSAqIEBwYXJhbSBkYXRhTW9kZWwgCiAJICogQHJldHVybiBBZGRTZXJ2bGV0T3BlcmF0aW9uCiAJICovCisJCisJCiAJcHVibGljIEFkZFNlcnZsZXRPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKIAkJc3VwZXIoZGF0YU1vZGVsKTsKIAl9CkBAIC0xNDAsNyArMTQzLDcgQEAKIAkJU3RyaW5nIGRlc2NyaXB0aW9uID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoREVTQ1JJUFRJT04pOwogCQkKIAkJLy8gQ3JlYXRlIHRoZSBzZXJ2bGV0IGluc3RhbmNlIGFuZCBzZXQgdXAgdGhlIHBhcmFtZXRlcnMgZnJvbSBkYXRhIG1vZGVsCi0JCU9iamVjdCBtb2RlbE9iamVjdCA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7CisJCU9iamVjdCBtb2RlbE9iamVjdCA9IHByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KFdFQl9BUFBfWE1MX1BBVEgpOwogCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKIAkJCiAJCQlTZXJ2bGV0IHNlcnZsZXQgPSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZsZXQoKTsKQEAgLTE2NSw3ICsxNjgsNyBAQAogCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIG1vZGVsT2JqZWN0OwogCQkJd2ViQXBwLmdldFNlcnZsZXRzKCkuYWRkKHNlcnZsZXQpOwogCQkJcmV0dXJuIHNlcnZsZXQ7Ci0JCX0gZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIHsKKwkJfSBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIElXZWJDb21tb24pIHsKIAkJCQogCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCBzZXJ2bGV0ID0gV2ViRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldCgpOwogCkBAIC0xOTAsNyArMTkzLDcgQEAKIAkJCS8vIEFkZCB0aGUgc2VydmxldCB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIG1vZGVsCiAJCQkKIAkJCS8vV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIGFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCk7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxPYmplY3Q7CisJCQlJV2ViQ29tbW9uIHdlYkFwcCA9IChJV2ViQ29tbW9uKSBtb2RlbE9iamVjdDsKIAkJCXdlYkFwcC5nZXRTZXJ2bGV0cygpLmFkZChzZXJ2bGV0KTsJCiAJCQlyZXR1cm4gc2VydmxldDsKIAkJfQpAQCAtMjUwLDcgKzI1Myw2IEBACiAJCQkJfQogCQkJfQogCQl9IGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxPYmplY3Q7CiAJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0IHNlcnZsZXQgPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCkgc2VydmxldE9iajsKIAogCQkJZm9yIChpbnQgaVAgPSAwOyBpUCA8IGluaXRQYXJhbUxpc3Quc2l6ZSgpOyBpUCsrKSB7CkBAIC0yODQsOCArMjg2LDcgQEAKIAlwcml2YXRlIHZvaWQgc2V0VXBVUkxNYXBwaW5ncyhMaXN0IHVybE1hcHBpbmdMaXN0LCBPYmplY3Qgc2VydmxldE9iaikgewogCQkvLyBHZXQgdGhlIHdlYiBhcHAgbW9kZWxsZWQgb2JqZWN0IGZyb20gdGhlIGRhdGEgbW9kZWwKIAkJLy9XZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKTsKLQkJT2JqZWN0IG1vZGVsT2JqZWN0ID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQorCQlPYmplY3QgbW9kZWxPYmplY3QgPSBwcm92aWRlci5nZXRNb2RlbE9iamVjdChXRUJfQVBQX1hNTF9QQVRIKTsKIAkJLy8gQ3JlYXRlIHRoZSBzZXJ2bGV0IG1hcHBpbmdzIGlmIGFueQogCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsJCiAJCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkgbW9kZWxPYmplY3Q7CkBAIC0zMDIsOCArMzAzLDggQEAKIAkJCQkvLyBBZGQgdGhlIHNlcnZsZXQgbWFwcGluZyB0byB0aGUgd2ViIGFwcGxpY2F0aW9uIG1vZGVsbGVkIGxpc3QKIAkJCQl3ZWJBcHAuZ2V0U2VydmxldE1hcHBpbmdzKCkuYWRkKG1hcHBpbmcpOwogCQkJfQotCQl9IGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSB7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgbW9kZWxPYmplY3Q7CisJCX0gZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBJV2ViQ29tbW9uKSB7CisJCQlJV2ViQ29tbW9uIHdlYkFwcCA9IChJV2ViQ29tbW9uKSBtb2RlbE9iamVjdDsKIAkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQgc2VydmxldCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0KSBzZXJ2bGV0T2JqOwogCQkJCiAJCQkvLyBDcmVhdGUgdGhlIHNlcnZsZXQgbWFwcGluZ3MgaWYgYW55CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQWRkV2ViQ2xhc3NPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BZGRXZWJDbGFzc09wZXJhdGlvbi5qYXZhCmluZGV4IDYyNzBmMjMuLmVlY2M2YzMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BZGRXZWJDbGFzc09wZXJhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9BZGRXZWJDbGFzc09wZXJhdGlvbi5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFTkVSQVRFX0REOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVTRV9FWElTVElOR19DTEFTUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5SRUdJU1RFUl9JTl9XRUJfWE1MOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKIApAQCAtMjIsNiArMjMsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuQWRkSmF2YUVFQXJ0aWZhY3RPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0LklDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldC5JV2ViQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllczsKQEAgLTI5LDcgKzMyLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRXZWJDbGFzc09wZXJhdGlvbiBleHRlbmRzIEFkZEphdmFFRUFydGlmYWN0T3BlcmF0aW9uIHsKLQkKKwlwcm90ZWN0ZWQgUGF0aCBXRUJfQVBQX1hNTF9QQVRIID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJKTsKIAlwdWJsaWMgQWRkV2ViQ2xhc3NPcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKIAkJc3VwZXIoZGF0YU1vZGVsKTsKIAl9CkBAIC02Nyw3ICs3MCw3IEBACiAJCQlxdWFsaWZpZWRDbGFzc05hbWUgPSBjcmVhdGVDbGFzcygpOwogCiAJCS8vIElmIHRoZSBmaWx0ZXIgaXMgbm90IGFubm90YXRlZCwgZ2VuZXJhdGUgdGhlIGZpbHRlciBtZXRhZGF0YSBmb3IgdGhlIERECi0JCWlmICghbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9BTk5PVEFUSU9OUykpCisJCWlmICh1c2VFeGlzdGluZyB8fCAoIW1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfQU5OT1RBVElPTlMpICYmIG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShSRUdJU1RFUl9JTl9XRUJfWE1MKSkpCiAJCXsKIAkJCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoR0VORVJBVEVfREQpKQogCQkJewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9DcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLmphdmEKaW5kZXggMTAyM2ZjMy4uNDExNjE1MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5qYXZhCkBAIC0xMSw3ICsxMSw2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwogCiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkFCU1RSQUNUX01FVEhPRFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuREVTVFJPWTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19GSUxURVI7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRklMVEVSX01BUFBJTkdTOwpAQCAtMjMsMjMgKzIyLDMyIEBACiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfREVTVFJPWTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLk1FVEhPRF9ET19GSUxURVI7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfSU5JVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9BTk5PVEFUSU9OX0lOSVRfUEFSQU07CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfRklMVEVSX0NIQUlOOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0ZJTFRFUl9DT05GSUc7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfSU9fRVhDRVBUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfRVhDRVBUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX1JFU1BPTlNFOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1dFQl9GSUxURVI7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfQU5OT1RBVElPTl9ESVNQQVRDSEVSX1RZUEU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5NZXRob2Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRGlzcGF0Y2hlclR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogCiBwdWJsaWMgY2xhc3MgQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbCBleHRlbmRzIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbCB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfRklMVEVSX05BTUUgPSAiZmlsdGVyTmFtZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfU0VSVkxFVF9OQU1FUyA9ICJzZXJ2bGV0TmFtZXMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0RJU1BBVENIRVJfVFlQRVM9ICJkaXNwYXRjaGVyVHlwZXMiOyAvLyROT04tTkxTLTEkCiAJCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRSA9IDA7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUUgPSAxOwpAQCAtNDksNiArNTcsNyBAQAogCQlzdXBlcihkYXRhTW9kZWwpOwogICAgIH0KICAgICAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEltcG9ydHMoKSB7CiAJCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gc3VwZXIuZ2V0SW1wb3J0cygpOwogCQkKQEAgLTY0LDEyICs3MywyMSBAQAogCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX0lPX0VYQ0VQVElPTik7CiAJCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfU0VSVkxFVF9FWENFUFRJT04pOwogCQl9CisJCWlmIChTRVJWTEVUXzMuZXF1YWxzKGdldEphdmFFRVZlcnNpb24oKSkpeworCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX1dFQl9GSUxURVIpOworCQkJaWYgKGdldEluaXRQYXJhbXMoKSE9IG51bGwgJiYgZ2V0SW5pdFBhcmFtcygpLnNpemUoKT4wKXsKKwkJCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfQU5OT1RBVElPTl9JTklUX1BBUkFNKTsKKwkJCX0KKwkJCWlmIChoYXNEaXNwYXRjaGVycygpKXsKKwkJCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfQU5OT1RBVElPTl9ESVNQQVRDSEVSX1RZUEUpOworCQkJfQorCQl9CiAJCQogCQlyZXR1cm4gY29sbGVjdGlvbjsKIAl9CiAKIAlwdWJsaWMgU3RyaW5nIGdldEZpbHRlck5hbWUoKSB7Ci0JCXJldHVybiBnZXRQcm9wZXJ0eShDTEFTU19OQU1FKS50cmltKCk7CisJCXJldHVybiBzdXBlci5nZXREaXNwbGF5TmFtZSgpOwogCX0KIAogCXB1YmxpYyBib29sZWFuIHNob3VsZEdlbkluaXQoKSB7CkBAIC0xMTQsMTYgKzEzMiwxNiBAQAogCQkKIAkJaW50IGRpc3BhdGNoZXJzID0gbWFwcGluZy5nZXREaXNwYXRjaGVycygpOwogCQlpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLlJFUVVFU1QpID4gMCkgewotICAgICAgICAgICAgbGlzdC5hZGQoRGlzcGF0Y2hlclR5cGUuUkVRVUVTVF9MSVRFUkFMLmdldExpdGVyYWwoKSk7CisJCQlsaXN0LmFkZChEaXNwYXRjaGVyVHlwZS5SRVFVRVNUX0xJVEVSQUwuZ2V0TGl0ZXJhbCgpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLkZPUldBUkQpID4gMCkgewotICAgICAgICAgICAgbGlzdC5hZGQoRGlzcGF0Y2hlclR5cGUuRk9SV0FSRF9MSVRFUkFMLmdldExpdGVyYWwoKSk7CisgICAgICAgIAlsaXN0LmFkZChEaXNwYXRjaGVyVHlwZS5GT1JXQVJEX0xJVEVSQUwuZ2V0TGl0ZXJhbCgpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLklOQ0xVREUpID4gMCkgewotICAgICAgICAgICAgbGlzdC5hZGQoRGlzcGF0Y2hlclR5cGUuSU5DTFVERV9MSVRFUkFMLmdldExpdGVyYWwoKSk7CisgICAgICAgIAlsaXN0LmFkZChEaXNwYXRjaGVyVHlwZS5JTkNMVURFX0xJVEVSQUwuZ2V0TGl0ZXJhbCgpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLkVSUk9SKSA+IDApIHsKLSAgICAgICAgICAgIGxpc3QuYWRkKERpc3BhdGNoZXJUeXBlLkVSUk9SX0xJVEVSQUwuZ2V0TGl0ZXJhbCgpKTsKKyAgICAgICAgCWxpc3QuYWRkKERpc3BhdGNoZXJUeXBlLkVSUk9SX0xJVEVSQUwuZ2V0TGl0ZXJhbCgpKTsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKQEAgLTEzMSwxMiArMTQ5LDMyIEBACiAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKICAgICAgICAgCWJ1aWxkZXIuYXBwZW5kKGl0ZXJhdG9yLm5leHQoKSk7CiAgICAgICAgIAlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgIAkJYnVpbGRlci5hcHBlbmQoIiwiKTsKKyAgICAgICAgCQlidWlsZGVyLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIAl9CiAgICAgICAgIH0KIAkJCiAJCXJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CiAJfQorCQorCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RGlzcGF0Y2hlckxpc3RXZWIzKElGaWx0ZXJNYXBwaW5nSXRlbSBtYXBwaW5nKSB7CisJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCQorCQlpbnQgZGlzcGF0Y2hlcnMgPSBtYXBwaW5nLmdldERpc3BhdGNoZXJzKCk7CisJCWlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uUkVRVUVTVCkgPiAwKSB7CisgICAgICAgICAgICBsaXN0LmFkZCgiRGlzcGF0Y2hlclR5cGUuUkVRVUVTVCIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KKyAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElGaWx0ZXJNYXBwaW5nSXRlbS5GT1JXQVJEKSA+IDApIHsKKyAgICAgICAgICAgIGxpc3QuYWRkKCJEaXNwYXRjaGVyVHlwZS5GT1JXQVJEIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLklOQ0xVREUpID4gMCkgeworICAgICAgICAgICAgbGlzdC5hZGQoIkRpc3BhdGNoZXJUeXBlLklOQ0xVREUiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICB9CisgICAgICAgIGlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uRVJST1IpID4gMCkgeworICAgICAgICAgICAgbGlzdC5hZGQoIkRpc3BhdGNoZXJUeXBlLkVSUk9SIik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQorICAgICAgICAKKwkJcmV0dXJuIGxpc3Q7CisJfQogCiAJcHJvdGVjdGVkIGJvb2xlYW4gaW1wbGVtZW50SW1wbGVtZW50ZWRNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpIHsKIAkJaWYgKGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoQUJTVFJBQ1RfTUVUSE9EUykpIHsKQEAgLTE2Niw1ICsyMDQsNjYgQEAKIAkJCiAJCXJldHVybiB1bmltcGxlbWVudGVkTWV0aG9kczsKIAl9CisJCisJcHVibGljIGJvb2xlYW4gaGFzRGlzcGF0Y2hlcnMoKXsKKwkJTGlzdDxJRmlsdGVyTWFwcGluZ0l0ZW0+IGZpbHRlck1hcHBpbmdzID0gZ2V0RmlsdGVyTWFwcGluZ3MoKTsKKwkJZm9yIChJRmlsdGVyTWFwcGluZ0l0ZW0gZmlsdGVyTWFwcGluZyA6IGZpbHRlck1hcHBpbmdzKSB7CisJCQlpZiAoZmlsdGVyTWFwcGluZy5nZXREaXNwYXRjaGVyc0FzU3RyaW5nKCkubGVuZ3RoKCk+MCl7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRDbGFzc0Fubm90YXRpb25QYXJhbXMoKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gcmVzdWx0ID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4oKTsKKwkJCisJCVN0cmluZyBkaXNwTmFtZSA9IGdldEZpbHRlck5hbWUoKS50cmltKCk7CisJCWlmICghZGlzcE5hbWUuZXF1YWxzKGdldENsYXNzTmFtZSgpKSAmJiAoZGlzcE5hbWUubGVuZ3RoKCkgPiAwKSkKKwkJCXJlc3VsdC5wdXQoQVRUX0ZJTFRFUl9OQU1FLCBkaXNwTmFtZSk7CisJCQorCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBnZXREZXNjcmlwdGlvbigpLnRyaW0oKTsKKwkJaWYgKGRlc2NyaXB0aW9uLmxlbmd0aCgpID4gMCkKKwkJCXJlc3VsdC5wdXQoQVRUX0RFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbik7CisJCQorCQlMaXN0PElGaWx0ZXJNYXBwaW5nSXRlbT4gZmlsdGVyTWFwcGluZ3MgPSBnZXRGaWx0ZXJNYXBwaW5ncygpOworCQlMaXN0PFN0cmluZz4gdXJsTWFwcGluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJTGlzdDxTdHJpbmc+IHNlcnZsZXROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlMaXN0PFN0cmluZz4gZGlzcGF0Y2hlclR5cGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWZvciAoSUZpbHRlck1hcHBpbmdJdGVtIGZpbHRlck1hcHBpbmcgOiBmaWx0ZXJNYXBwaW5ncykgeworCQkJTGlzdDxTdHJpbmc+IGRpc3BhdGNoZXJMaXN0ID0gZ2V0RGlzcGF0Y2hlckxpc3RXZWIzKGZpbHRlck1hcHBpbmcpOworCQkJaWYgKGRpc3BhdGNoZXJMaXN0ICE9IG51bGwgJiYgZGlzcGF0Y2hlckxpc3Quc2l6ZSgpPjApeworCQkJCWZvciAoU3RyaW5nIGRpc3AgOiBkaXNwYXRjaGVyTGlzdCkgeworCQkJCQlpZiAoIWRpc3BhdGNoZXJUeXBlcy5jb250YWlucyhkaXNwKSl7CisJCQkJCQlkaXNwYXRjaGVyVHlwZXMuYWRkKGRpc3ApOwkKKwkJCQkJfQorCQkJCX0KKwkJCQkKKwkJCX0KKwkJCWlmIChmaWx0ZXJNYXBwaW5nLmlzVXJsUGF0dGVyblR5cGUoKSkgeworCQkJCXVybE1hcHBpbmdzLmFkZChmaWx0ZXJNYXBwaW5nLmdldE5hbWUoKSk7CisJCQl9IGVsc2UgaWYgKGZpbHRlck1hcHBpbmcuaXNTZXJ2bGV0TmFtZVR5cGUoKSkgeworCQkJCXNlcnZsZXROYW1lcy5hZGQoZmlsdGVyTWFwcGluZy5nZXROYW1lKCkpOworCQkJfQorCQl9CisJCWlmICh1cmxNYXBwaW5ncy5zaXplKCkgPiAwKSB7CisJCQlyZXN1bHQucHV0KEFUVF9VUkxfUEFUVEVSTlMsIHVybE1hcHBpbmdzKTsKKwkJfQorCQlpZiAoZGlzcGF0Y2hlclR5cGVzLnNpemUoKSA+IDApIHsKKwkJCXJlc3VsdC5wdXQoQVRUX0RJU1BBVENIRVJfVFlQRVMsIGRpc3BhdGNoZXJUeXBlcyk7CisJCX0KKwkJaWYgKHNlcnZsZXROYW1lcy5zaXplKCkgPiAwKSB7CisJCQlyZXN1bHQucHV0KEFUVF9TRVJWTEVUX05BTUVTLCBzZXJ2bGV0TmFtZXMpOworCQl9CisJCQorCQkKKwkJTGlzdDxTdHJpbmdbXT4gaW5pdFBhcmFtcyA9IGdldEluaXRQYXJhbXMoKTsKKwkJaWYgKGluaXRQYXJhbXMgIT0gbnVsbCAmJiBpbml0UGFyYW1zLnNpemUoKSA+IDApIHsKKwkJCXJlc3VsdC5wdXQoQVRUX0lOSVRfUEFSQU1TLCBpbml0UGFyYW1zKTsKKwkJfQogCisJCXJldHVybiByZXN1bHQ7CisJfQorCQogfQorCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ3JlYXRlTGlzdGVuZXJUZW1wbGF0ZU1vZGVsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ3JlYXRlTGlzdGVuZXJUZW1wbGF0ZU1vZGVsLmphdmEKaW5kZXggZGQzZGQ0YS4uMGJhZDkzMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9DcmVhdGVMaXN0ZW5lclRlbXBsYXRlTW9kZWwuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9BVFRSSUJVVEVfTElTVEVORVI7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0VWRU5UOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9MSVNURU5FUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9XRUJfTElTVEVORVI7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTMyLDYgKzMzLDcgQEAKIAogcHVibGljIGNsYXNzIENyZWF0ZUxpc3RlbmVyVGVtcGxhdGVNb2RlbCBleHRlbmRzIENyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbCB7CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbXBvcnRzKCkgewogCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IHN1cGVyLmdldEltcG9ydHMoKTsKIAkJCkBAIC03NSw2ICs3NywxMCBAQAogCQkJY29sbGVjdGlvbi5hZGQoUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9BVFRSSUJVVEVfRVZFTlQpOwogCQl9CiAJCQorCQlpZiAoU0VSVkxFVF8zLmVxdWFscyhnZXRKYXZhRUVWZXJzaW9uKCkpKXsKKwkJCWNvbGxlY3Rpb24uYWRkKFFVQUxJRklFRF9XRUJfTElTVEVORVIpOworCQl9CisJCQogCQlyZXR1cm4gY29sbGVjdGlvbjsKIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9DcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLmphdmEKaW5kZXggMWMwZDQ5NS4uNGY2YTU5ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLmphdmEKQEAgLTUzLDYgKzUzLDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLk1FVEhPRF9JTklUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuTUVUSE9EX1NFUlZJQ0U7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5NRVRIT0RfVE9fU1RSSU5HOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0FOTk9UQVRJT05fSU5JVF9QQVJBTTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFUlZMRVRfUkVRVUVTVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFUlZMRVRfUkVTUE9OU0U7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfSU9fRVhDRVBUSU9OOwpAQCAtNjAsMTIgKzYxLDE1IEBACiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9FWENFUFRJT047CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVTUE9OU0U7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfV0VCX1NFUlZMRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5TRVJWSUNFX1NJR05BVFVSRTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlNFUlZMRVRfSU5JVF9TSUdOQVRVUkU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuTWV0aG9kOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKQEAgLTgzLDYgKzg3LDcgQEAKIAkJc3VwZXIoZGF0YU1vZGVsKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbXBvcnRzKCkgewogCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IHN1cGVyLmdldEltcG9ydHMoKTsKIAkJCkBAIC0xMTcsNiArMTIyLDE2IEBACiAJCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfSU9fRVhDRVBUSU9OKTsKIAkJfQogCQkKKwkJaWYgKFNFUlZMRVRfMy5lcXVhbHMoZ2V0SmF2YUVFVmVyc2lvbigpKSl7CisJCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfV0VCX1NFUlZMRVQpOworCQkJaWYgKGdldEluaXRQYXJhbXMoKSE9IG51bGwgJiYgZ2V0SW5pdFBhcmFtcygpLnNpemUoKT4wKXsKKwkJCQljb2xsZWN0aW9uLmFkZChRVUFMSUZJRURfQU5OT1RBVElPTl9JTklUX1BBUkFNKTsKKwkJCX0KKwkJCQorCQkJCisKKwkJfQorCQkKIAkJcmV0dXJuIGNvbGxlY3Rpb247CiAJfQogCkBAIC0yODYsNSArMzAxLDI5IEBACiAJCQogCQlyZXR1cm4gdW5pbXBsZW1lbnRlZE1ldGhvZHM7CiAJfQorCQorCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldENsYXNzQW5ub3RhdGlvblBhcmFtcygpIHsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworCQkKKwkJU3RyaW5nIGRpc3BOYW1lID0gZ2V0U2VydmxldE5hbWUoKS50cmltKCk7CisJCWlmICghZGlzcE5hbWUuZXF1YWxzKGdldENsYXNzTmFtZSgpKSAmJiAoZGlzcE5hbWUubGVuZ3RoKCkgPiAwKSkKKwkJCXJlc3VsdC5wdXQoQVRUX05BTUUsIGRpc3BOYW1lKTsKKwkJCisJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uKCkudHJpbSgpOworCQlpZiAoZGVzY3JpcHRpb24ubGVuZ3RoKCkgPiAwKQorCQkJcmVzdWx0LnB1dChBVFRfREVTQ1JJUFRJT04sIGRlc2NyaXB0aW9uKTsKKwkJCisJCUxpc3Q8U3RyaW5nW10+IHNlcnZsZXRNYXBwaW5ncyA9IGdldFNlcnZsZXRNYXBwaW5ncygpOworCQlpZiAoc2VydmxldE1hcHBpbmdzICE9IG51bGwgJiYgc2VydmxldE1hcHBpbmdzLnNpemUoKSA+IDApIHsKKwkJCXJlc3VsdC5wdXQoQVRUX1VSTF9QQVRURVJOUywgc2VydmxldE1hcHBpbmdzKTsKKwkJfQorCQkKKwkJTGlzdDxTdHJpbmdbXT4gaW5pdFBhcmFtcyA9IGdldEluaXRQYXJhbXMoKTsKKwkJaWYgKGluaXRQYXJhbXMgIT0gbnVsbCAmJiBpbml0UGFyYW1zLnNpemUoKSA+IDApIHsKKwkJCXJlc3VsdC5wdXQoQVRUX0lOSVRfUEFSQU1TLCBpbml0UGFyYW1zKTsKKwkJfQogCisJCXJldHVybiByZXN1bHQ7CisJfQorCQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbC5qYXZhCmluZGV4IGFhYTA4YzMuLjgwOTY2MmEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9DcmVhdGVXZWJDbGFzc1RlbXBsYXRlTW9kZWwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsLmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JQW5ub3RhdGlvbnNEYXRhTW9kZWwuVVNFX0FOTk9UQVRJT05TOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFU0NSSVBUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRJU1BMQVlfTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX0VFX1ZFUlNJT047CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5DcmVhdGVKYXZhRUVBcnRpZmFjdFRlbXBsYXRlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwpAQCAtMjEsNiArMjIsMTEgQEAKIHB1YmxpYyBjbGFzcyBDcmVhdGVXZWJDbGFzc1RlbXBsYXRlTW9kZWwgZXh0ZW5kcwogCQlDcmVhdGVKYXZhRUVBcnRpZmFjdFRlbXBsYXRlTW9kZWwgewogCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9VUkxfUEFUVEVSTlMgPSAidXJsUGF0dGVybnMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lOSVRfUEFSQU1TID0gImluaXRQYXJhbXMiOyAvLyROT04tTkxTLTEkCisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkxFVF8zID0gIjMuMCI7IC8vJE5PTi1OTFMtMSQKKwkKIAlwdWJsaWMgQ3JlYXRlV2ViQ2xhc3NUZW1wbGF0ZU1vZGVsKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7CiAJCXN1cGVyKGRhdGFNb2RlbCk7CiAJfQpAQCAtMzYsNSArNDIsOSBAQAogCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkKCkgewogCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfQU5OT1RBVElPTlMpOwogCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldEphdmFFRVZlcnNpb24oKSB7CisJCXJldHVybiBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSkFWQV9FRV9WRVJTSU9OKTsKKwl9CiAKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9GaWx0ZXJNYXBwaW5nSXRlbS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0ZpbHRlck1hcHBpbmdJdGVtLmphdmEKaW5kZXggMDUzMWEwNS4uNTkzOTRmMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0ZpbHRlck1hcHBpbmdJdGVtLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0ZpbHRlck1hcHBpbmdJdGVtLmphdmEKQEAgLTQ1LDE4ICs0NSwxOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGF0Y2hlcnNBc1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIFJFUVVFU1QpID4gMCkgewotICAgICAgICAgICAgcmVzdWx0ICs9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJESVNQQVRDSEVSX1IiKSArICIgIjsgCisgICAgICAgICAgICByZXN1bHQgKz0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRJU1BBVENIRVJfUiIpICsgIiAiOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgICAgIH0KICAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIEZPUldBUkQpID4gMCkgewotICAgICAgICAgICAgcmVzdWx0ICs9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJESVNQQVRDSEVSX0YiKSArICIgIjsgCisgICAgICAgICAgICByZXN1bHQgKz0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRJU1BBVENIRVJfRiIpICsgIiAiOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgICAgIH0KICAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElOQ0xVREUpID4gMCkgewotICAgICAgICAgICAgcmVzdWx0ICs9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJESVNQQVRDSEVSX0kiKSArICIgIjsgCisgICAgICAgICAgICByZXN1bHQgKz0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRJU1BBVENIRVJfSSIpICsgIiAiOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAgICAgICAgIH0KICAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIEVSUk9SKSA+IDApIHsKLSAgICAgICAgICAgIHJlc3VsdCArPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRElTUEFUQ0hFUl9FIikgKyAiICI7IAorICAgICAgICAgICAgcmVzdWx0ICs9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJESVNQQVRDSEVSX0UiKSArICIgIjsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQudHJpbSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9GaWx0ZXJUZW1wbGF0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0ZpbHRlclRlbXBsYXRlLmphdmEKaW5kZXggNmVlNTNhYi4uY2NjZTFhMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0ZpbHRlclRlbXBsYXRlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0ZpbHRlclRlbXBsYXRlLmphdmEKQEAgLTE0LDY1ICsxNCwxMTAgQEAKICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAKLSAgcHVibGljIGZpbmFsIFN0cmluZyBOTCA9IG5sID09IG51bGwgPyAoU3lzdGVtLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSkgOiBubDsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEgPSAicGFja2FnZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMiA9ICI7IjsKKyAgcHVibGljIGZpbmFsIFN0cmluZyBOTCA9IG5sID09IG51bGwgPyAoU3lzdGVtLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSkgOiBubDsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMSA9ICJwYWNrYWdlICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIgPSAiOyI7IC8vJE5PTi1OTFMtMSQKICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMgPSBOTDsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQgPSBOTCArICJpbXBvcnQgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUgPSAiOyI7CisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80ID0gTkwgKyAiaW1wb3J0ICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUgPSAiOyI7IC8vJE5PTi1OTFMtMSQKICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYgPSBOTDsKICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzcgPSBOTDsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzggPSAiLyoqIiArIE5MICsgIiAqIFNlcnZsZXQgRmlsdGVyIGltcGxlbWVudGF0aW9uIGNsYXNzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85ID0gTkwgKyAiICoiICsgTkwgKyAiICogQHdlYi5maWx0ZXIiICsgTkwgKyAiICogICBuYW1lPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEwID0gIlwiIiArIE5MICsgIiAqICAgZGlzcGxheS1uYW1lPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzExID0gIlwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEyID0gTkwgKyAiICogICBkZXNjcmlwdGlvbj1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMyA9ICJcIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNCA9IE5MICsgIiAqIiArIE5MICsgIiAqIEB3ZWIuZmlsdGVyLW1hcHBpbmciOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTUgPSBOTCArICIgKiAgIHVybC1wYXR0ZXJuPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE2ID0gIlwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE3ID0gTkwgKyAiICogICBzZXJ2bGV0LW5hbWU9XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTggPSAiXCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTkgPSBOTCArICIgKiAgIGRpc3BhdGNoZXI9XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjAgPSAiXCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjEgPSBOTCArICIgKiIgKyBOTCArICIgKiBAd2ViLmZpbHRlci1pbml0LXBhcmFtIiArIE5MICsgIiAqICAgIG5hbWU9XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjIgPSAiXCIiICsgTkwgKyAiICogICAgdmFsdWU9XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjMgPSAiXCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjQgPSBOTCArICIgKiAgICBkZXNjcmlwdGlvbj1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNSA9ICJcIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNiA9IE5MICsgIiAqLyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNyA9IE5MICsgInB1YmxpYyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjggPSAiYWJzdHJhY3QgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI5ID0gImZpbmFsICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMCA9ICJjbGFzcyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzEgPSAiIGV4dGVuZHMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMyID0gIiBpbXBsZW1lbnRzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMyA9ICIsICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNCA9ICIgeyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNSA9IE5MICsgTkwgKyAiICAgIC8qKiIgKyBOTCArICIgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gIiArIE5MICsgIiAgICAgKi8iICsgTkwgKyAiICAgIHB1YmxpYyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzYgPSAiKCkgeyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YiIgKyBOTCArICIgICAgfSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNyA9IE5MICsgIiAgICAgICAiICsgTkwgKyAiICAgIC8qKiIgKyBOTCArICIgICAgICogQHNlZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzggPSAiIyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOSA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQwID0gIikiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MSA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQyID0gIikgeyIgKyBOTCArICIgICAgICAgIHN1cGVyKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MyA9ICIpOyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YiIgKyBOTCArICIgICAgfSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NCA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiICAgICAqIEBzZWUgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ1ID0gIiMiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDYgPSAiKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NyA9ICIpIiArIE5MICsgIiAgICAgKi8iICsgTkwgKyAiICAgIHB1YmxpYyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDggPSAiICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80OSA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUwID0gIikgeyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTEgPSBOTCArICJcdFx0XHRyZXR1cm4gIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUyID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTMgPSBOTCArICIgICAgfSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NCA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIEZpbHRlciNkZXN0cm95KCkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwdWJsaWMgdm9pZCBkZXN0cm95KCkgeyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTUgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBGaWx0ZXIjZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSwgRmlsdGVyQ2hhaW4pIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBGaWx0ZXJDaGFpbiBjaGFpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHRcdC8vIHBsYWNlIHlvdXIgY29kZSBoZXJlIiArIE5MICsgIiIgKyBOTCArICJcdFx0Ly8gcGFzcyB0aGUgcmVxdWVzdCBhbG9uZyB0aGUgZmlsdGVyIGNoYWluIiArIE5MICsgIlx0XHRjaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7IiArIE5MICsgIlx0fSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NiA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIEZpbHRlciNpbml0KEZpbHRlckNvbmZpZykiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NyA9IE5MICsgTkwgKyAifSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81OCA9IE5MOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOCA9ICIvKioiICsgTkwgKyAiICogU2VydmxldCBGaWx0ZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85ID0gTkwgKyAiICoiICsgTkwgKyAiICogQHdlYi5maWx0ZXIiICsgTkwgKyAiICogICBuYW1lPVwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEwID0gIlwiIiArIE5MICsgIiAqICAgZGlzcGxheS1uYW1lPVwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEyID0gTkwgKyAiICogICBkZXNjcmlwdGlvbj1cIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEzID0gIlwiIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTQgPSBOTCArICIgKiIgKyBOTCArICIgKiBAd2ViLmZpbHRlci1tYXBwaW5nIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNSA9IE5MICsgIiAqICAgdXJsLXBhdHRlcm49XCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNiA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE3ID0gTkwgKyAiICogICBzZXJ2bGV0LW5hbWU9XCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOCA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE5ID0gTkwgKyAiICogICBkaXNwYXRjaGVyPVwiIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjAgPSAiXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMSA9IE5MICsgIiAqIiArIE5MICsgIiAqIEB3ZWIuZmlsdGVyLWluaXQtcGFyYW0iICsgTkwgKyAiICogICAgbmFtZT1cIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMiA9ICJcIiIgKyBOTCArICIgKiAgICB2YWx1ZT1cIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjMgPSAiXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNCA9IE5MICsgIiAqICAgIGRlc2NyaXB0aW9uPVwiIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjUgPSAiXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNiA9IE5MICsgIiAqLyI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI3ID0gTkwgKyAiQFdlYkZpbHRlciI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI4ID0gIihcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI5ID0gIlwiKSI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMwID0gIih7ICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMxID0gIiwgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzIgPSAiXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMyA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM0ID0gIiB9KSI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM1ID0gIigiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNiA9ICIsICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM3ID0gTkwgKyAiXHRcdCI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM4ID0gIiA9IFwiIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzkgPSAiXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MCA9ICIgPSB7ICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQxID0gIiwgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDIgPSBOTCArICJcdFx0XHRcdCI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQzID0gIlwiIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDQgPSAiXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NSA9IE5MICsgIlx0XHQiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NiA9ICIgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDcgPSAifSI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ4ID0gIiA9IHsgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDkgPSAiLCAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81MCA9IE5MICsgIlx0XHRcdFx0IjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTEgPSAiXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81MiA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUzID0gTkwgKyAiXHRcdCI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU0ID0gIiAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NSA9ICJ9IjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTYgPSAiID0geyAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NyA9ICIsICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU4ID0gTkwgKyAiXHRcdFx0XHRAV2ViSW5pdFBhcmFtKG5hbWUgPSBcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU5ID0gIlwiLCB2YWx1ZSA9IFwiIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNjAgPSAiXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MSA9ICIsIGRlc2NyaXB0aW9uID0gXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MiA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYzID0gIikiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82NCA9IE5MICsgIlx0XHR9IjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNjUgPSAiID0geyI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzY2ID0gIiwgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNjcgPSBOTCArICJcdFx0XHRcdCI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzY4ID0gTkwgKyAiXHRcdCI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzY5ID0gIiAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83MCA9ICJ9IiArIE5MICsgIlx0XHRcdFx0XHQiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzcxID0gIikiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83MiA9IE5MICsgInB1YmxpYyAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83MyA9ICJhYnN0cmFjdCAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83NCA9ICJmaW5hbCAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83NSA9ICJjbGFzcyAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83NiA9ICIgZXh0ZW5kcyAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83NyA9ICIgaW1wbGVtZW50cyAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83OCA9ICIsICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzc5ID0gIiB7IjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfODAgPSBOTCArIE5MICsgIiAgICAvKioiICsgTkwgKyAiICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuICIgKyBOTCArICIgICAgICovIiArIE5MICsgIiAgICBwdWJsaWMgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfODEgPSAiKCkgeyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YiIgKyBOTCArICIgICAgfSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF84MiA9IE5MICsgIiAgICAgICAiICsgTkwgKyAiICAgIC8qKiIgKyBOTCArICIgICAgICogQHNlZSAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfODMgPSAiIyI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzg0ID0gIigiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF84NSA9ICIpIiArIE5MICsgIiAgICAgKi8iICsgTkwgKyAiICAgIHB1YmxpYyAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfODYgPSAiKCI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzg3ID0gIikgeyIgKyBOTCArICIgICAgICAgIHN1cGVyKCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfODggPSAiKTsiICsgTkwgKyAiICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIiICsgTkwgKyAiICAgIH0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfODkgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIiAgICAgKiBAc2VlICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOTAgPSAiIyI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzkxID0gIigiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85MiA9ICIpIiArIE5MICsgIiAgICAgKi8iICsgTkwgKyAiICAgIHB1YmxpYyAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOTMgPSAiICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzk0ID0gIigiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85NSA9ICIpIHsiICsgTkwgKyAiICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85NiA9IE5MICsgIlx0XHRcdHJldHVybiAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85NyA9ICI7IjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOTggPSBOTCArICIgICAgfSI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzk5ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgRmlsdGVyI2Rlc3Ryb3koKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMDAgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBGaWx0ZXIjZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSwgRmlsdGVyQ2hhaW4pIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBGaWx0ZXJDaGFpbiBjaGFpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHRcdC8vIHBsYWNlIHlvdXIgY29kZSBoZXJlIiArIE5MICsgIiIgKyBOTCArICJcdFx0Ly8gcGFzcyB0aGUgcmVxdWVzdCBhbG9uZyB0aGUgZmlsdGVyIGNoYWluIiArIE5MICsgIlx0XHRjaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7IiArIE5MICsgIlx0fSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkIC8vJE5PTi1OTFMtMTAkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMDEgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBGaWx0ZXIjaW5pdChGaWx0ZXJDb25maWcpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZkNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTAyID0gTkwgKyBOTCArICJ9IjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTAzID0gTkw7CiAKICAgcHVibGljIFN0cmluZyBnZW5lcmF0ZShPYmplY3QgYXJndW1lbnQpCiAgIHsKQEAgLTE3NiwzMiArMjIxLDI2OSBAQAogCX0KIAogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNik7CisgICAgIAorCWlmICgiMy4wIi5lcXVhbHMobW9kZWwuZ2V0SmF2YUVFVmVyc2lvbigpKSkgeyAgLy8kTk9OLU5MUy0xJAorCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI3KTsKKyAgICAKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMgPSBtb2RlbC5nZXRDbGFzc0Fubm90YXRpb25QYXJhbXMoKTsKKwkJaWYgKHBhcmFtcy5zaXplKCkgPT0gMSAmJiBwYXJhbXMuY29udGFpbnNLZXkoQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuQVRUX1VSTF9QQVRURVJOUykpIHsKKwkJCUxpc3Q8U3RyaW5nPiBtYXBwaW5ncyA9IChMaXN0PFN0cmluZz4pIHBhcmFtcy5nZXQoQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuQVRUX1VSTF9QQVRURVJOUyk7CisJCQlpZiAobWFwcGluZ3Muc2l6ZSgpID09IDEpIHsKKwkJCQlTdHJpbmcgdmFsdWUgPSBtYXBwaW5ncy5nZXQoMCk7CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjgpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIHZhbHVlICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI5KTsKKyAgICAKKwkJCX0gZWxzZSB7CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzApOworICAgIAorCQkJCWJvb2xlYW4gbmVlZENvbW1hID0gZmFsc2U7CisJCQkJZm9yIChTdHJpbmcgbWFwcGluZyA6IG1hcHBpbmdzKSB7CisJCQkJCWlmIChuZWVkQ29tbWEpIHsKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMSk7CisgICAgCisJCQkJCX0KKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMik7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWFwcGluZyApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMyk7CisgICAgCisJCQkJCW5lZWRDb21tYSA9IHRydWU7CisJCQkJfQorCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM0KTsKKyAgICAKKwkJCX0KKwkJfSBlbHNlIGlmICghcGFyYW1zLmlzRW1wdHkoKSkgeyAKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNSk7CisgICAgCisJCQlTZXQ8U3RyaW5nPiBrZXlzID0gcGFyYW1zLmtleVNldCgpOworCQkJYm9vbGVhbiBuZWVkTmV3TGluZSA9IGtleXMuY29udGFpbnMoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5BVFRfSU5JVF9QQVJBTVMpIHx8IAorCQkJCQkoa2V5cy5jb250YWlucyhDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLkFUVF9VUkxfUEFUVEVSTlMpICYmIAorCQkJCQkJCSgoTGlzdDxTdHJpbmc+KSBwYXJhbXMuZ2V0KENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuQVRUX1VSTF9QQVRURVJOUykpLnNpemUoKSA+IDEpIHx8IAorCQkJCQkoa2V5cy5jb250YWlucyhDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLkFUVF9TRVJWTEVUX05BTUVTKSAmJiAKKwkJCQkJCQkoKExpc3Q8U3RyaW5nPikgcGFyYW1zLmdldChDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLkFUVF9TRVJWTEVUX05BTUVTKSkuc2l6ZSgpID4gMSk7CisJCQlib29sZWFuIG5lZWRDb21tYSA9IGZhbHNlOworCQkJZm9yIChTdHJpbmcga2V5IDoga2V5cykgeworCQkJCWlmIChuZWVkQ29tbWEpIHsKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNik7CisgICAgCisJCQkJfQorCQkJCQorCQkJCWlmIChuZWVkTmV3TGluZSkgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM3KTsKKyAgICAKKwkJCQl9IAorCQkJCisJCQkJaWYgKGtleS5lcXVhbHMoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5BVFRfRklMVEVSX05BTUUpIHx8IGtleS5lcXVhbHMoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5BVFRfREVTQ1JJUFRJT04pKSB7IAorCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwYXJhbXMuZ2V0KGtleSk7CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBrZXkgKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzgpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIHZhbHVlICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM5KTsKKyAgICAKKwkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5BVFRfVVJMX1BBVFRFUk5TKSkgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgga2V5ICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQwKTsKKyAgICAKKwkJCQkJTGlzdDxTdHJpbmc+IG1hcHBpbmdzID0gKExpc3Q8U3RyaW5nPikgcGFyYW1zLmdldChrZXkpOworCQkJCQlib29sZWFuIG5lZWRDb21tYTIgPSBmYWxzZTsKKwkJCQkJYm9vbGVhbiBuZWVkTmV3TGluZTIgPSBtYXBwaW5ncy5zaXplKCkgPiAxOworCQkJCQlmb3IgKFN0cmluZyBtYXBwaW5nIDogbWFwcGluZ3MpIHsKKwkJCQkJCWlmIChuZWVkQ29tbWEyKSB7CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDEpOworICAgIAorCQkJCQkJfQorCQkJCQorCQkJCQkJaWYgKG5lZWROZXdMaW5lMikgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQyKTsKKyAgICAKKwkJCQkJCX0gCisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDMpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1hcHBpbmcgKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDQpOworICAgIAkJCQkKKwkJCQkJCW5lZWRDb21tYTIgPSB0cnVlOworCQkJCQl9CisJCQkJCisJCQkJCWlmIChuZWVkTmV3TGluZTIpIHsKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80NSk7CisgICAgCisJCQkJCX0gZWxzZSB7CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDYpOworICAgIAorCQkJCQl9CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDcpOworICAgIAorCQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLkFUVF9TRVJWTEVUX05BTUVTKSkgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgga2V5ICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ4KTsKKyAgICAKKwkJCQkJTGlzdDxTdHJpbmc+IHNlcnZsZXROYW1lcyA9IChMaXN0PFN0cmluZz4pIHBhcmFtcy5nZXQoa2V5KTsKKwkJCQkJYm9vbGVhbiBuZWVkQ29tbWEyID0gZmFsc2U7CisJCQkJCWJvb2xlYW4gbmVlZE5ld0xpbmUyID0gc2VydmxldE5hbWVzLnNpemUoKSA+IDE7CisJCQkJCWZvciAoU3RyaW5nIHNlcnZsZXROYW1lIDogc2VydmxldE5hbWVzKSB7CisJCQkJCQlpZiAobmVlZENvbW1hMikgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ5KTsKKyAgICAKKwkJCQkJCX0KKwkJCQkKKwkJCQkJCWlmIChuZWVkTmV3TGluZTIpIHsKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81MCk7CisgICAgCisJCQkJCQl9IAorCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUxKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBzZXJ2bGV0TmFtZSApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Mik7CisgICAgCQkJCQorCQkJCQkJbmVlZENvbW1hMiA9IHRydWU7CisJCQkJCX0KKwkJCQkKKwkJCQkJaWYgKG5lZWROZXdMaW5lMikgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUzKTsKKyAgICAKKwkJCQkJfSBlbHNlIHsKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81NCk7CisgICAgCisJCQkJCX0KKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81NSk7CisgICAgCisJCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuQVRUX0lOSVRfUEFSQU1TKSkgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgga2V5ICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU2KTsKKyAgICAKKwkJCQkJTGlzdDxTdHJpbmdbXT4gaW5pdFBhcmFtcyA9IChMaXN0PFN0cmluZ1tdPikgcGFyYW1zLmdldChrZXkpOworCQkJCQlib29sZWFuIG5lZWRDb21tYTIgPSBmYWxzZTsKKwkJCQkJZm9yIChTdHJpbmdbXSBpbml0UGFyYW0gOiBpbml0UGFyYW1zKSB7CisJCQkJCQlpZiAobmVlZENvbW1hMikgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU3KTsKKyAgICAKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJU3RyaW5nIG5hbWUgPSBpbml0UGFyYW1bQ3JlYXRlRmlsdGVyVGVtcGxhdGVNb2RlbC5OQU1FXTsKKwkJCQkJCVN0cmluZyB2YWx1ZSA9IGluaXRQYXJhbVtDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLlZBTFVFXTsKKwkJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGluaXRQYXJhbVtDcmVhdGVGaWx0ZXJUZW1wbGF0ZU1vZGVsLkRFU0NSSVBUSU9OXTsKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81OCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbmFtZSApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81OSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggdmFsdWUgKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNjApOworICAgIAkJCQkKKwkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmIGRlc2NyaXB0aW9uLmxlbmd0aCgpID4gMCkgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYxKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBkZXNjcmlwdGlvbiApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82Mik7CisgICAgCisJCQkJCQl9CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNjMpOworICAgIAorCQkJCQkJbmVlZENvbW1hMiA9IHRydWU7CisJCQkJCX0KKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82NCk7CisgICAgCisJCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwuQVRUX0RJU1BBVENIRVJfVFlQRVMpKSB7CisJCQkJTGlzdDxTdHJpbmc+IGRpc3BhdGNoZXJUeXBlcyA9IChMaXN0PFN0cmluZz4pIHBhcmFtcy5nZXQoa2V5KTsKKwkJCQkJYm9vbGVhbiBuZWVkQ29tbWEyID0gZmFsc2U7CisJCQkJCWJvb2xlYW4gbmVlZE5ld0xpbmUyID0gZGlzcGF0Y2hlclR5cGVzLnNpemUoKSA+IDE7CisJCQkJCWlmIChkaXNwYXRjaGVyVHlwZXMuc2l6ZSgpPjApeworCQkJCQkKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBrZXkgKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNjUpOworICAgICAKKwkJCQkJfQorCQkJCQlmb3IgKFN0cmluZyBkaXNwVHlwZSA6IGRpc3BhdGNoZXJUeXBlcykgeworCQkJCQkJaWYgKG5lZWRDb21tYTIpIHsKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82Nik7CisgICAgCisJCQkJCQl9CisJCQkJCisJCQkJCQlpZiAobmVlZE5ld0xpbmUyKSB7CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNjcpOworICAgIAorCQkJCQkJfSAKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGRpc3BUeXBlICk7CisgICAgCQkJCQorCQkJCQkJbmVlZENvbW1hMiA9IHRydWU7CisJCQkJCX0KKwkJCQkKKwkJCQkJaWYgKG5lZWROZXdMaW5lMikgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzY4KTsKKyAgICAKKwkJCQkJfSBlbHNlIHsKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82OSk7CisgICAgCisJCQkJCX0KKwkJCQkJCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzcwKTsKKyAgICAKKwkJCQl9CisJCQkJbmVlZENvbW1hID0gdHJ1ZTsKKyAgCQkJfQorCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzcxKTsKKyAgICAKKwkJfQorCX0KKwogICAgIAogCWlmIChtb2RlbC5pc1B1YmxpYygpKSB7IAogCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI3KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNzIpOwogICAgICAKIAl9IAogCiAJaWYgKG1vZGVsLmlzQWJzdHJhY3QoKSkgeyAKIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yOCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzczKTsKICAgICAKIAl9CiAKIAlpZiAobW9kZWwuaXNGaW5hbCgpKSB7CiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF83NCk7CiAgICAgCiAJfQogCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMwKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNzUpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldENsYXNzTmFtZSgpICk7CiAgICAgCiAJU3RyaW5nIHN1cGVyQ2xhc3MgPSBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpOwogIAlpZiAoc3VwZXJDbGFzcyAhPSBudWxsICYmIHN1cGVyQ2xhc3MubGVuZ3RoKCkgPiAwKSB7CiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzEpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF83Nik7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggc3VwZXJDbGFzcyApOwogICAgIAogCX0KQEAgLTIwOSwxNSArNDkxLDE1IEBACiAJTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBtb2RlbC5nZXRJbnRlcmZhY2VzKCk7IAogIAlpZiAoIGludGVyZmFjZXMuc2l6ZSgpID4gMCkgeyAKIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMik7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzc3KTsKICAgICAKIAl9CiAJCiAgCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5zaXplKCk7IGkrKykgewotICAgCQlTdHJpbmcgSU5URVJGQUNFID0gKFN0cmluZykgaW50ZXJmYWNlcy5nZXQoaSk7CisgICAJCVN0cmluZyBJTlRFUkZBQ0UgPSBpbnRlcmZhY2VzLmdldChpKTsKICAgIAkJaWYgKGkgPiAwKSB7CiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzMpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF83OCk7CiAgICAgCiAJCX0KIApAQCAtMjI1LDEzICs1MDcsMTMgQEAKICAgICAKIAl9CiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzQpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF83OSk7CiAgICAgIAogCWlmICghbW9kZWwuaGFzRW1wdHlTdXBlcmNsYXNzQ29uc3RydWN0b3IoKSkgeyAKIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzgwKTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNik7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzgxKTsKICAgICAgCiAJfSAKIApAQCAtMjQwLDE5ICs1MjIsMTkgQEAKIAkJZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA6IGNvbnN0cnVjdG9ycykgewogCQkJaWYgKGNvbnN0cnVjdG9yLmlzUHVibGljKCkgfHwgY29uc3RydWN0b3IuaXNQcm90ZWN0ZWQoKSkgeyAKIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNyk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzgyKTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM4KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfODMpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84NCk7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9ySmF2YWRvYygpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQwKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfODUpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldENsYXNzTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQxKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfODYpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDIpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84Nyk7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9yQ2FsbCgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQzKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfODgpOwogICAgIAogCQkJfSAKIAkJfSAKQEAgLTI2Miw0NSArNTQ0LDQ1IEBACiAJaWYgKG1vZGVsLnNob3VsZEltcGxlbWVudEFic3RyYWN0TWV0aG9kcygpKSB7CiAJCWZvciAoTWV0aG9kIG1ldGhvZCA6IG1vZGVsLmdldFVuaW1wbGVtZW50ZWRNZXRob2RzKCkpIHsgCiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDQpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84OSk7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80NSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzkwKTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ2KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOTEpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1ldGhvZC5nZXRQYXJhbXNGb3JKYXZhZG9jKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDcpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF85Mik7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFJldHVyblR5cGUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80OCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzkzKTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ5KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOTQpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1ldGhvZC5nZXRQYXJhbXNGb3JEZWNsYXJhdGlvbigpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUwKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOTUpOwogICAgICAKIAkJCVN0cmluZyBkZWZhdWx0UmV0dXJuVmFsdWUgPSBtZXRob2QuZ2V0RGVmYXVsdFJldHVyblZhbHVlKCk7CiAJCQlpZiAoZGVmYXVsdFJldHVyblZhbHVlICE9IG51bGwpIHsgCiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTEpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF85Nik7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggZGVmYXVsdFJldHVyblZhbHVlICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUyKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOTcpOwogICAgIAogCQkJfSAKIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Myk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzk4KTsKICAgICAgCiAJCX0KIAl9IAogCiAgICAgIGlmIChtb2RlbC5zaG91bGRHZW5EZXN0cm95KCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU0KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOTkpOwogICAgICB9IAogICAgICBpZiAobW9kZWwuc2hvdWxkR2VuRG9GaWx0ZXIoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTUpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMDApOwogICAgICB9IAogICAgICBpZiAobW9kZWwuc2hvdWxkR2VuSW5pdCgpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Nik7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEwMSk7CiAgICAgIH0gCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU3KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTgpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMDIpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMDMpOwogICAgIHJldHVybiBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKaW5kZXggYzQwZDQ4Ni4uNTY1MGQ0MSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0lOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCkBAIC0zMSw0ICszMSwxNSBAQAogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9FWElTVElOR19DTEFTUyA9ICJOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWwuVVNFX0VYSVNUSU5HX0NMQVNTIjsgLy8kTk9OLU5MUy0xJAogCQorCS8qKgorCSAqIE9wdGlvbmFsLCBib29sZWFuIHByb3BlcnR5IHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCB0byBnZW5lcmF0ZSBhcnRpZmFjdHMgaW4gd2ViLnhtbAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0lTVEVSX0lOX1dFQl9YTUwgPSAiTmV3U2VydmxldENsYXNzRGF0YU1vZGVsLlJFR0lTVEVSX0lOX1dFQl9YTUwiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogT3B0aW9uYWwsIGJvb2xlYW4gcHJvcGVydHkgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHRvIGdlbmVyYXRlIGFydGlmYWN0cyBpbiB3ZWIueG1sCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9FRV9WRVJTSU9OID0gIk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbC5KQVZBX0VFX1ZFUlNJT04iOyAvLyROT04tTkxTLTEkCisJCisJCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTGlzdGVuZXJUZW1wbGF0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0xpc3RlbmVyVGVtcGxhdGUuamF2YQppbmRleCBkY2E0MjlmLi4wYWQyY2NjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTGlzdGVuZXJUZW1wbGF0ZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9MaXN0ZW5lclRlbXBsYXRlLmphdmEKQEAgLTE0LDQ3ICsxNCw0OCBAQAogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIE5MID0gbmwgPT0gbnVsbCA/IChTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKSA6IG5sOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMSA9ICJwYWNrYWdlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yID0gIjsiOworICBwdWJsaWMgZmluYWwgU3RyaW5nIE5MID0gbmwgPT0gbnVsbCA/IChTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKSA6IG5sOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xID0gInBhY2thZ2UgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMiA9ICI7IjsgLy8kTk9OLU5MUy0xJAogICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMyA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNCA9IE5MICsgImltcG9ydCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNSA9ICI7IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQgPSBOTCArICJpbXBvcnQgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNSA9ICI7IjsgLy8kTk9OLU5MUy0xJAogICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNiA9IE5MOwogICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNyA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOCA9ICIvKioiICsgTkwgKyAiICogQXBwbGljYXRpb24gTGlmZWN5Y2xlIExpc3RlbmVyIGltcGxlbWVudGF0aW9uIGNsYXNzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85ID0gTkwgKyAiICoiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTAgPSBOTCArICIgKiBAd2ViLmxpc3RlbmVyIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzExID0gTkwgKyAiICovIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEyID0gTkwgKyAicHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMyA9ICJhYnN0cmFjdCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTQgPSAiZmluYWwgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE1ID0gImNsYXNzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNiA9ICIgZXh0ZW5kcyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTcgPSAiIGltcGxlbWVudHMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE4ID0gIiwgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE5ID0gIiB7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIwID0gTkwgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMSA9ICIoKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIyID0gTkwgKyAiICAgICAgICIgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBAc2VlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMyA9ICIjIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI0ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjUgPSAiKSIgKyBOTCArICIgICAgICovIiArIE5MICsgIiAgICBwdWJsaWMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI2ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjcgPSAiKSB7IiArIE5MICsgIiAgICAgICAgc3VwZXIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI4ID0gIik7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI5ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICIgICAgICogQHNlZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzAgPSAiIyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMSA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMyID0gIikiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMyA9ICIgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM0ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzUgPSAiKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNiA9IE5MICsgIlx0XHRcdHJldHVybiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzcgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOCA9IE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM5ID0gTkwgKyAiXHQiICsgTkwgKyAifSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MCA9IE5MOworICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOCA9ICIvKioiICsgTkwgKyAiICogQXBwbGljYXRpb24gTGlmZWN5Y2xlIExpc3RlbmVyIGltcGxlbWVudGF0aW9uIGNsYXNzICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOSA9IE5MICsgIiAqIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTAgPSBOTCArICIgKiBAd2ViLmxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTEgPSBOTCArICIgKi8iOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMiA9IE5MICsgIkBXZWJMaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEzID0gTkwgKyAicHVibGljICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE0ID0gImFic3RyYWN0ICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE1ID0gImZpbmFsICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE2ID0gImNsYXNzICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE3ID0gIiBleHRlbmRzICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE4ID0gIiBpbXBsZW1lbnRzICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE5ID0gIiwgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjAgPSAiIHsiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMSA9IE5MICsgTkwgKyAiICAgIC8qKiIgKyBOTCArICIgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gIiArIE5MICsgIiAgICAgKi8iICsgTkwgKyAiICAgIHB1YmxpYyAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMiA9ICIoKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIzID0gTkwgKyAiICAgICAgICIgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBAc2VlICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNCA9ICIjIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjUgPSAiKCI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI2ID0gIikiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNyA9ICIoIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjggPSAiKSB7IiArIE5MICsgIiAgICAgICAgc3VwZXIoIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yOSA9ICIpOyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YiIgKyBOTCArICIgICAgfSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMCA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiICAgICAqIEBzZWUgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMSA9ICIjIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzIgPSAiKCI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMzID0gIikiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNCA9ICIgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzUgPSAiKCI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM2ID0gIikgeyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM3ID0gTkwgKyAiXHRcdFx0cmV0dXJuICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM4ID0gIjsiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOSA9IE5MICsgIiAgICB9IjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDAgPSBOTCArICJcdCIgKyBOTCArICJ9IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MSA9IE5MOwogCiAgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGUoT2JqZWN0IGFyZ3VtZW50KQogICB7CkBAIC05NiwzMiArOTcsMzkgQEAKIAl9CiAKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTEpOworICAgICAKKwlpZiAoIjMuMCIuZXF1YWxzKG1vZGVsLmdldEphdmFFRVZlcnNpb24oKSkpIHsgIC8vJE5PTi1OTFMtMSQKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMik7CisgICAgCit9CisKICAgICAKIAlpZiAobW9kZWwuaXNQdWJsaWMoKSkgeyAKIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMik7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEzKTsKICAgICAgCiAJfSAKIAogCWlmIChtb2RlbC5pc0Fic3RyYWN0KCkpIHsgCiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTMpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNCk7CiAgICAgCiAJfQogCiAJaWYgKG1vZGVsLmlzRmluYWwoKSkgewogCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE0KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTUpOwogICAgIAogCX0KIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xNSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE2KTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOwogICAgIAogCVN0cmluZyBzdXBlckNsYXNzID0gbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKTsKICAJaWYgKHN1cGVyQ2xhc3MgIT0gbnVsbCAmJiBzdXBlckNsYXNzLmxlbmd0aCgpID4gMCkgewogCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE2KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTcpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIHN1cGVyQ2xhc3MgKTsKICAgICAKIAl9CkBAIC0xMjksMTUgKzEzNywxNSBAQAogCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gbW9kZWwuZ2V0SW50ZXJmYWNlcygpOyAKICAJaWYgKCBpbnRlcmZhY2VzLnNpemUoKSA+IDApIHsgCiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTcpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xOCk7CiAgICAgCiAJfQogCQogIAlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLSAgIAkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOworICAgCQlTdHJpbmcgSU5URVJGQUNFID0gaW50ZXJmYWNlcy5nZXQoaSk7CiAgICAJCWlmIChpID4gMCkgewogCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE4KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTkpOwogICAgIAogCQl9CiAKQEAgLTE0NSwxMyArMTUzLDEzIEBACiAgICAgCiAJfQogCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE5KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjApOwogICAgICAKIAlpZiAoIW1vZGVsLmhhc0VtcHR5U3VwZXJjbGFzc0NvbnN0cnVjdG9yKCkpIHsgCiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldENsYXNzTmFtZSgpICk7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIxKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMik7CiAgICAgIAogCX0gCiAKQEAgLTE2MCwxOSArMTY4LDE5IEBACiAJCWZvciAoQ29uc3RydWN0b3IgY29uc3RydWN0b3IgOiBjb25zdHJ1Y3RvcnMpIHsKIAkJCWlmIChjb25zdHJ1Y3Rvci5pc1B1YmxpYygpIHx8IGNvbnN0cnVjdG9yLmlzUHJvdGVjdGVkKCkpIHsgCiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCkgKTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjMpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCkgKTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjQpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckphdmFkb2MoKSApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCkgKTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldENsYXNzTmFtZSgpICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9ySmF2YWRvYygpICk7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI2KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBjb25zdHJ1Y3Rvci5nZXRQYXJhbXNGb3JEZWNsYXJhdGlvbigpICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbW9kZWwuZ2V0Q2xhc3NOYW1lKCkgKTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckNhbGwoKSApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkgKTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjgpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckNhbGwoKSApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yOSk7CiAgICAgCiAJCQl9IAogCQl9IApAQCAtMTgyLDM2ICsxOTAsMzYgQEAKIAlpZiAobW9kZWwuc2hvdWxkSW1wbGVtZW50QWJzdHJhY3RNZXRob2RzKCkpIHsKIAkJZm9yIChNZXRob2QgbWV0aG9kIDogbW9kZWwuZ2V0VW5pbXBsZW1lbnRlZE1ldGhvZHMoKSkgeyAKIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yOSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSApOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldE5hbWUoKSApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1ldGhvZC5nZXRDb250YWluaW5nSmF2YUNsYXNzKCkgKTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1ldGhvZC5nZXRQYXJhbXNGb3JKYXZhZG9jKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzMpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1ldGhvZC5nZXROYW1lKCkgKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzIpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1ldGhvZC5nZXRQYXJhbXNGb3JKYXZhZG9jKCkgKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzMpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgKTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzQpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1ldGhvZC5nZXRQYXJhbXNGb3JEZWNsYXJhdGlvbigpICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldE5hbWUoKSApOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkgKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzYpOwogICAgICAKIAkJCVN0cmluZyBkZWZhdWx0UmV0dXJuVmFsdWUgPSBtZXRob2QuZ2V0RGVmYXVsdFJldHVyblZhbHVlKCk7CiAJCQlpZiAoZGVmYXVsdFJldHVyblZhbHVlICE9IG51bGwpIHsgCiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzYpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGRlZmF1bHRSZXR1cm5WYWx1ZSApOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNyk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggZGVmYXVsdFJldHVyblZhbHVlICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM4KTsKICAgICAKIAkJCX0gCiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzgpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zOSk7CiAgICAgIAogCQl9CiAJfSAKIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zOSk7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQwKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDEpOwogICAgIHJldHVybiBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9OZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggNjUyMTc0Ny4uYzkyOGVmOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3RmlsdGVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0xMSw2ICsxMSw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwogCiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkFCU1RSQUNUX01FVEhPRFM7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOVEVSRkFDRVM7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNVUEVSQ0xBU1M7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuREVTVFJPWTsKQEAgLTE1NCw3ICsxNTUsNyBAQAogCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJLy8gSWYgb3VyIGRlZmF1bHQgaXMgdGhlIHN1cGVyY2xhc3MsIHdlIGtub3cgaXQgaXMgb2sKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU1VQRVJDTEFTUykgJiYgIiIuZXF1YWxzKGdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSkpKQorCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTVVBFUkNMQVNTKSAmJiAiIi5lcXVhbHMoZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKSkpIC8vJE5PTi1OTFMtMSQKIAkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwogCQkvLyBWYWxpZGF0ZSBpbml0IHBhcmFtcwogCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTklUX1BBUkFNKSkKQEAgLTIzNCw3ICsyMzUsNyBAQAogCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogCQkJSUZpbHRlck1hcHBpbmdJdGVtIGl0ZW0gPSBpbnB1dC5nZXQoaSk7CiAJICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBuOyBqKyspIHsKLQkgICAgICAgICAgICBJRmlsdGVyTWFwcGluZ0l0ZW0gaXRlbTIgPSAoSUZpbHRlck1hcHBpbmdJdGVtKSBpbnB1dC5nZXQoaik7CisJICAgICAgICAgICAgSUZpbHRlck1hcHBpbmdJdGVtIGl0ZW0yID0gaW5wdXQuZ2V0KGopOwogICAgICAgICAgICAgICAgIGlmIChpdGVtLmdldE5hbWUoKS5lcXVhbHMoaXRlbTIuZ2V0TmFtZSgpKSAmJiAKICAgICAgICAgICAgICAgICAJCWl0ZW0uZ2V0TWFwcGluZ1R5cGUoKSA9PSBpdGVtMi5nZXRNYXBwaW5nVHlwZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGR1cCA9IHRydWU7CkBAIC0yNTksNyArMjYwLDcgQEAKIAkgKi8KIAlwcml2YXRlIFN0cmluZyB2YWxpZGF0ZVZhbHVlKExpc3QgcHJvcCkgewogCQlpZiAocHJvcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7CisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKIAkJfQogCQlpbnQgc2l6ZSA9IHByb3Auc2l6ZSgpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewpAQCAtMjY4LDcgKzI2OSw3IEBACiAJCQkJCSFVcmxQYXR0ZXJuLmlzVmFsaWQoZmlsdGVyTWFwcGluZ1ZhbHVlLmdldE5hbWUoKSkpCiAJCQkJcmV0dXJuIGZpbHRlck1hcHBpbmdWYWx1ZS5nZXROYW1lKCk7CiAJCX0KLQkJcmV0dXJuICIiOworCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIAkvKioKQEAgLTM1OCw0ICszNTksMTMgQEAKIAkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5PS19TVEFUVVM7CiAJfQogCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKKwkJaWYgKERJU1BMQVlfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBDTEFTU19OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGSUxURVJfTUFQUElOR1MsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOworCQl9IAorCQkKKwkJcmV0dXJuIHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7CisJfQorCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggOGVjZTJjOS4uZTUwOWZkMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9OZXdMaXN0ZW5lckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMTAsNiArMTAsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zOwogCisKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fQUNUSVZBVElPTl9MSVNURU5FUjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9IVFRQX1NFU1NJT05fQVRUUklCVVRFX0xJU1RFTkVSOwpAQCAtMTksNiArMjAsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfQ09OVEVYVF9MSVNURU5FUjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfQVRUUklCVVRFX0xJU1RFTkVSOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9MSVNURU5FUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5VU0VfRVhJU1RJTkdfQ0xBU1M7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIApAQCAtMTAyLDEwICsxMDQsMTEgQEAKIAkgKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElOVEVSRkFDRVMpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVMaXN0ZW5lcnMoKTsKLQkJfQotCQkKKwkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSU5URVJGQUNFUykpeworCQkJaWYgKCFnZXRCb29sZWFuUHJvcGVydHkoVVNFX0VYSVNUSU5HX0NMQVNTKSkgeworCQkJCXJldHVybiB2YWxpZGF0ZUxpc3RlbmVycygpOworCQkJfQorCQl9CQkJCQkKIAkJLy8gT3RoZXJ3aXNlIGRlZmVyIHRvIHN1cGVyIHRvIHZhbGlkYXRlIHRoZSBwcm9wZXJ0eQogCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKIAl9CkBAIC0xMzAsMTAgKzEzMyw5IEBACiAJCQogCQlpZiAoYXRMZWFzdE9uZVNlbGVjdGVkKSB7CiAJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBtc2cgPSBXZWJNZXNzYWdlcy5FUlJfTk9fTElTVEVORVJfU0VMRUNURUQ7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7CiAJCX0KKwkJU3RyaW5nIG1zZyA9IFdlYk1lc3NhZ2VzLkVSUl9OT19MSVNURU5FUl9TRUxFQ1RFRDsKKwkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwogCX0KIAogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCA3MjBjNzA0Li45NzkyNzIzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtNDQsNiArNDQsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuSjJFRUZpbGVVdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi52YWxpZGF0aW9uLlVybFBhdHRlcm47CkBAIC0yMjMsNyArMjI0LDcgQEAKIAkJCXJldHVybiBCb29sZWFuLlRSVUU7CiAJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRElTUExBWV9OQU1FKSkgewogCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KENMQVNTX05BTUUpOwotCQkJaWYgKGNsYXNzTmFtZS5lbmRzV2l0aCgiLmpzcCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChjbGFzc05hbWUuZW5kc1dpdGgoSjJFRUZpbGVVdGlsLkRPVF9KU1ApKSB7IAogCQkJCWludCBpbmRleCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLyIpOyAvLyROT04tTkxTLTEkCiAJCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZyhpbmRleCsxLGNsYXNzTmFtZS5sZW5ndGgoKS00KTsKIAkJCX0gZWxzZSB7CkBAIC00NDYsNyArNDQ3LDcgQEAKIAkgKi8KIAlwcml2YXRlIFN0cmluZyB2YWxpZGF0ZVZhbHVlKExpc3QgcHJvcCkgewogCQlpZiAocHJvcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7CisJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKIAkJfQogCQlpbnQgc2l6ZSA9IHByb3Auc2l6ZSgpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewpAQCAtNDU0LDcgKzQ1NSw3IEBACiAJCQlpZiAoIVVybFBhdHRlcm4uaXNWYWxpZCh1cmxNYXBwaW5nVmFsdWUpKQogCQkJCXJldHVybiB1cmxNYXBwaW5nVmFsdWU7CiAJCX0KLQkJcmV0dXJuICIiOworCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKIAl9CiAJCiAJLyoqCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1dlYkNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCA0NzQ3NDBmLi41NGU4NGMwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9OZXdXZWJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTE5LDYgKzE5LDggQEAKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU1VQRVJDTEFTUzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ERVNDUklQVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ESVNQTEFZX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9FRV9WRVJTSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlJFR0lTVEVSX0lOX1dFQl9YTUw7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuVVNFX0VYSVNUSU5HX0NMQVNTOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMjYsNiArMjgsOCBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKQEAgLTM0LDkgKzM4LDEzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5OZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldC5XZWJGYWNldFV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkZhY2V0ZWRQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKIAogLyoqCiAgKiBUaGUgTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm92aWRlciBpcyBhIHN1YmNsYXNzIG9mCkBAIC04NCw4ICs5Miw4IEBACiAJICovCiAJcHJvdGVjdGVkIExpc3QgaW50ZXJmYWNlTGlzdDsKIAkKLQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWVDYWNoZTsKLQlwcml2YXRlIFN0cmluZyBleGlzdGluZ0NsYXNzTmFtZUNhY2hlOworCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZUNhY2hlID0gIiI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIFN0cmluZyBleGlzdGluZ0NsYXNzTmFtZUNhY2hlID0gIiI7IC8vJE5PTi1OTFMtMSQKIAogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXNlQW5ub3RhdGlvbnMgPSBmYWxzZTsKIAkKQEAgLTEyOCwxMSArMTM2LDEyIEBACiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewogCQkvLyBBZGQgd2ViIGFydGlmYWN0IHNwZWNpZmljIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzIGRhdGEgbW9kZWwKIAkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCQorCQlwcm9wZXJ0eU5hbWVzLmFkZChSRUdJU1RFUl9JTl9XRUJfWE1MKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoRElTUExBWV9OQU1FKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoREVTQ1JJUFRJT04pOwogCQlwcm9wZXJ0eU5hbWVzLmFkZChVU0VfRVhJU1RJTkdfQ0xBU1MpOwogCQlwcm9wZXJ0eU5hbWVzLmFkZChVU0VfQU5OT1RBVElPTlMpOworCQlwcm9wZXJ0eU5hbWVzLmFkZChKQVZBX0VFX1ZFUlNJT04pOwogCQkKIAkJcmV0dXJuIHByb3BlcnR5TmFtZXM7CiAJfQpAQCAtMTYxLDExICsxNzAsNDEgQEAKIAkJCXJldHVybiBCb29sZWFuLkZBTFNFOwogCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTlNUUlVDVE9SKSkKIAkJCXJldHVybiBoYXNTdXBlckNsYXNzKCk7Ci0JCQorCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFJFR0lTVEVSX0lOX1dFQl9YTUwpKXsKKwkJCXJldHVybiAhaXNKYXZhRUU2UHJvamVjdCgpOworCQl9IGVsc2UgaWYgKEpBVkFfRUVfVkVSU0lPTi5lcXVhbHMocHJvcGVydHlOYW1lKSl7CisJCQlyZXR1cm4gZ2V0SmF2YUVFVmVyc2lvbigpOworCQl9CiAJCS8vIE90aGVyd2lzZSBjaGVjayBzdXBlciBmb3IgZGVmYXVsdCB2YWx1ZSBmb3IgcHJvcGVydHkKIAkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwogCX0KIAorCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCisJcHVibGljIGJvb2xlYW4gaXNKYXZhRUU2UHJvamVjdCgpIHsKKwkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChnZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpKTsKKwkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKXsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIChGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQocHJvamVjdCwgV2ViRmFjZXRVdGlscy5XRUJfRkFDRVQuZ2V0SWQoKSwgV2ViRmFjZXRVdGlscy5XRUJfMzAuZ2V0VmVyc2lvblN0cmluZygpKQorCQkJCQkJfHwgRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuaGFzUHJvamVjdEZhY2V0KHByb2plY3QsIFdlYkZhY2V0VXRpbHMuV0VCRlJBR01FTlRfRkFDRVQuZ2V0SWQoKSwgV2ViRmFjZXRVdGlscy5XRUJGUkFHTUVOVF8zMC5nZXRWZXJzaW9uU3RyaW5nKCkpKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUVFVmVyc2lvbigpIHsKKwkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChnZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpKTsKKwkJU3RyaW5nIGlkID0gbnVsbDsKKwkJaWYoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKXsKKwkJCWlkID0gV2ViRmFjZXRVdGlscy5XRUJfRkFDRVQuZ2V0SWQoKTsKKwkJfWVsc2UgeworCQkJaWQgPSBXZWJGYWNldFV0aWxzLldFQkZSQUdNRU5UX0ZBQ0VULmdldElkKCk7CisJCX0KKwkJcmV0dXJuIEZhY2V0ZWRQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3RGYWNldFZlcnNpb24ocHJvamVjdCwgaWQpLmdldFZlcnNpb25TdHJpbmcoKTsKKwl9CisKIAkvKioKIAkgKiBTdWJjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIG93biBzcGVjaWZpYyBiZWhhdmlvciB3aGVuCiAJICogYSBjZXJ0YWluIHByb3BlcnR5IGluIHRoZSBkYXRhIG1vZGVsIGhpZXJhcmNoeSBpcyBzZXQuIHRoaXMgbWV0aG9kIGRvZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9OZXdXZWJDbGFzc09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1dlYkNsYXNzT3BlcmF0aW9uLmphdmEKaW5kZXggMTBhZjg4MS4uMGNiMjhmNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1dlYkNsYXNzT3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL05ld1dlYkNsYXNzT3BlcmF0aW9uLmphdmEKQEAgLTExOSw2ICsxMTksNyBAQAogCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgogCSAqIEB0aHJvd3MgV0ZUV3JhcHBlZEV4Y2VwdGlvbgogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlVXNpbmdUZW1wbGF0ZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUGFja2FnZUZyYWdtZW50IGZyYWdtZW50KSB0aHJvd3MgV0ZUV3JhcHBlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CiAJCS8vIENyZWF0ZSB0aGUgd2ViIGFydGlmYWN0IHRlbXBsYXRlIG1vZGVsCiAJCUNyZWF0ZVdlYkNsYXNzVGVtcGxhdGVNb2RlbCB0ZW1wTW9kZWwgPSBjcmVhdGVUZW1wbGF0ZU1vZGVsKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvU2VydmxldFRlbXBsYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvU2VydmxldFRlbXBsYXRlLmphdmEKaW5kZXggZmY4MWUwZi4uMzQxMTAxMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1NlcnZsZXRUZW1wbGF0ZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9TZXJ2bGV0VGVtcGxhdGUuamF2YQpAQCAtMTQsNzEgKzE0LDEwMiBAQAogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAotICBwdWJsaWMgZmluYWwgU3RyaW5nIE5MID0gbmwgPT0gbnVsbCA/IChTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKSA6IG5sOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMSA9ICJwYWNrYWdlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yID0gIjsiOworICBwdWJsaWMgZmluYWwgU3RyaW5nIE5MID0gbmwgPT0gbnVsbCA/IChTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKSA6IG5sOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xID0gInBhY2thZ2UgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMiA9ICI7IjsgLy8kTk9OLU5MUy0xJAogICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMyA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNCA9IE5MICsgImltcG9ydCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNSA9ICI7IjsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQgPSBOTCArICJpbXBvcnQgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNSA9ICI7IjsgLy8kTk9OLU5MUy0xJAogICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNiA9IE5MOwogICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNyA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOCA9ICIvKioiICsgTkwgKyAiICogU2VydmxldCBpbXBsZW1lbnRhdGlvbiBjbGFzcyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOSA9IE5MICsgIiAqIiArIE5MICsgIiAqIEB3ZWIuc2VydmxldCIgKyBOTCArICIgKiAgIG5hbWU9XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTAgPSAiXCIiICsgTkwgKyAiICogICBkaXNwbGF5LW5hbWU9XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTEgPSAiXCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTIgPSBOTCArICIgKiAgIGRlc2NyaXB0aW9uPVwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEzID0gIlwiIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE0ID0gTkwgKyAiICoiICsgTkwgKyAiICogQHdlYi5zZXJ2bGV0LW1hcHBpbmciICsgTkwgKyAiICogICB1cmwtcGF0dGVybj1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNSA9ICJcIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNiA9IE5MICsgIiAqIiArIE5MICsgIiAqIEB3ZWIuc2VydmxldC1pbml0LXBhcmFtIiArIE5MICsgIiAqICAgIG5hbWU9XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTcgPSAiXCIiICsgTkwgKyAiICogICAgdmFsdWU9XCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTggPSAiXCIiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTkgPSBOTCArICIgKiAgICBkZXNjcmlwdGlvbj1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMCA9ICJcIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMSA9IE5MICsgIiAqLyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMiA9IE5MICsgInB1YmxpYyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjMgPSAiYWJzdHJhY3QgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI0ID0gImZpbmFsICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNSA9ICJjbGFzcyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjYgPSAiIGV4dGVuZHMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI3ID0gIiBpbXBsZW1lbnRzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yOCA9ICIsICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yOSA9ICIgeyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMCA9IE5MICsgIlx0cHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMxID0gTkwgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMiA9ICIoKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMzID0gTkwgKyAiICAgICAgICIgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBAc2VlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNCA9ICIjIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM1ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzYgPSAiKSIgKyBOTCArICIgICAgICovIiArIE5MICsgIiAgICBwdWJsaWMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM3ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzggPSAiKSB7IiArIE5MICsgIiAgICAgICAgc3VwZXIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM5ID0gIik7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQwID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICIgICAgICogQHNlZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDEgPSAiIyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MiA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQzID0gIikiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NCA9ICIgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ1ID0gIigiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDYgPSAiKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NyA9IE5MICsgIlx0XHRcdHJldHVybiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDggPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80OSA9IE5MICsgIiAgICB9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUwID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgU2VydmxldCNpbml0KFNlcnZsZXRDb25maWcpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTEgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBTZXJ2bGV0I2Rlc3Ryb3koKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81MiA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIFNlcnZsZXQjZ2V0U2VydmxldENvbmZpZygpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHVibGljIFNlcnZsZXRDb25maWcgZ2V0U2VydmxldENvbmZpZygpIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHRcdHJldHVybiBudWxsOyIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTMgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBTZXJ2bGV0I2dldFNlcnZsZXRJbmZvKCkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRJbmZvKCkgeyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdFx0cmV0dXJuIG51bGw7ICIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTQgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBTZXJ2bGV0I3NlcnZpY2UoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTUgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHByb3RlY3RlZCB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NiA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIEh0dHBTZXJ2bGV0I2RvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTcgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTggPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNkb1B1dChIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHJvdGVjdGVkIHZvaWQgZG9QdXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81OSA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIEh0dHBTZXJ2bGV0I2RvRGVsZXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwcm90ZWN0ZWQgdm9pZCBkb0RlbGV0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYwID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgSHR0cFNlcnZsZXQjZG9IZWFkKEh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwcm90ZWN0ZWQgdm9pZCBkb0hlYWQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MSA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIEh0dHBTZXJ2bGV0I2RvT3B0aW9ucyhIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHJvdGVjdGVkIHZvaWQgZG9PcHRpb25zKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNjIgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNkb1RyYWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwcm90ZWN0ZWQgdm9pZCBkb1RyYWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNjMgPSBOTCArIE5MICsgIn0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNjQgPSBOTDsKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzggPSAiLyoqIiArIE5MICsgIiAqIFNlcnZsZXQgaW1wbGVtZW50YXRpb24gY2xhc3MgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85ID0gTkwgKyAiICoiICsgTkwgKyAiICogQHdlYi5zZXJ2bGV0IiArIE5MICsgIiAqICAgbmFtZT1cIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMCA9ICJcIiIgKyBOTCArICIgKiAgIGRpc3BsYXktbmFtZT1cIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTEgPSAiXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMiA9IE5MICsgIiAqICAgZGVzY3JpcHRpb249XCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMyA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE0ID0gTkwgKyAiICoiICsgTkwgKyAiICogQHdlYi5zZXJ2bGV0LW1hcHBpbmciICsgTkwgKyAiICogICB1cmwtcGF0dGVybj1cIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNSA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE2ID0gTkwgKyAiICoiICsgTkwgKyAiICogQHdlYi5zZXJ2bGV0LWluaXQtcGFyYW0iICsgTkwgKyAiICogICAgbmFtZT1cIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNyA9ICJcIiIgKyBOTCArICIgKiAgICB2YWx1ZT1cIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTggPSAiXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOSA9IE5MICsgIiAqICAgIGRlc2NyaXB0aW9uPVwiIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjAgPSAiXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMSA9IE5MICsgIiAqLyI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIyID0gTkwgKyAiQFdlYlNlcnZsZXQiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMyA9ICIoXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNCA9ICJcIikiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNSA9ICIoeyAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNiA9ICIsICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI3ID0gIlwiIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjggPSAiXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yOSA9ICIgfSkiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMCA9ICIoIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzEgPSAiLCAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMiA9IE5MICsgIlx0XHQiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMyA9ICIgPSBcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM0ID0gIlwiIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzUgPSAiID0geyAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNiA9ICIsICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM3ID0gTkwgKyAiXHRcdFx0XHQiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOCA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM5ID0gIlwiIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDAgPSBOTCArICJcdFx0IjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDEgPSAiICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQyID0gIn0iOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MyA9ICIgPSB7ICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ0ID0gIiwgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDUgPSBOTCArICJcdFx0XHRcdEBXZWJJbml0UGFyYW0obmFtZSA9IFwiIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDYgPSAiXCIsIHZhbHVlID0gXCIiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NyA9ICJcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ4ID0gIiwgZGVzY3JpcHRpb24gPSBcIiI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ5ID0gIlwiIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTAgPSAiKSI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUxID0gTkwgKyAiXHRcdH0iOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81MiA9ICIpIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTMgPSBOTCArICJwdWJsaWMgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTQgPSAiYWJzdHJhY3QgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTUgPSAiZmluYWwgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTYgPSAiY2xhc3MgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTcgPSAiIGV4dGVuZHMgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTggPSAiIGltcGxlbWVudHMgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTkgPSAiLCAiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MCA9ICIgeyI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYxID0gTkwgKyAiXHRwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MiA9IE5MICsgTkwgKyAiICAgIC8qKiIgKyBOTCArICIgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gIiArIE5MICsgIiAgICAgKi8iICsgTkwgKyAiICAgIHB1YmxpYyAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MyA9ICIoKSB7IiArIE5MICsgIiAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViIiArIE5MICsgIiAgICB9IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzY0ID0gTkwgKyAiICAgICAgICIgKyBOTCArICIgICAgLyoqIiArIE5MICsgIiAgICAgKiBAc2VlICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82NSA9ICIjIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNjYgPSAiKCI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzY3ID0gIikiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82OCA9ICIoIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNjkgPSAiKSB7IiArIE5MICsgIiAgICAgICAgc3VwZXIoIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83MCA9ICIpOyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YiIgKyBOTCArICIgICAgfSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83MSA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiICAgICAqIEBzZWUgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83MiA9ICIjIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNzMgPSAiKCI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzc0ID0gIikiICsgTkwgKyAiICAgICAqLyIgKyBOTCArICIgICAgcHVibGljICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83NSA9ICIgIjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNzYgPSAiKCI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzc3ID0gIikgeyIgKyBOTCArICIgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzc4ID0gTkwgKyAiXHRcdFx0cmV0dXJuICI7IC8vJE5PTi1OTFMtMSQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzc5ID0gIjsiOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF84MCA9IE5MICsgIiAgICB9IjsgLy8kTk9OLU5MUy0xJAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfODEgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBTZXJ2bGV0I2luaXQoU2VydmxldENvbmZpZykiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF84MiA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIFNlcnZsZXQjZGVzdHJveSgpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHVibGljIHZvaWQgZGVzdHJveSgpIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzgzID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgU2VydmxldCNnZXRTZXJ2bGV0Q29uZmlnKCkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwdWJsaWMgU2VydmxldENvbmZpZyBnZXRTZXJ2bGV0Q29uZmlnKCkgeyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdFx0cmV0dXJuIG51bGw7IiArIE5MICsgIlx0fSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzg0ID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgU2VydmxldCNnZXRTZXJ2bGV0SW5mbygpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHVibGljIFN0cmluZyBnZXRTZXJ2bGV0SW5mbygpIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHRcdHJldHVybiBudWxsOyAiICsgTkwgKyAiXHR9IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfODUgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBTZXJ2bGV0I3NlcnZpY2UoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfODYgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHByb3RlY3RlZCB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF84NyA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIEh0dHBTZXJ2bGV0I2RvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSIgKyBOTCArICJcdCAqLyIgKyBOTCArICJcdHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfODggPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfODkgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNkb1B1dChIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHJvdGVjdGVkIHZvaWQgZG9QdXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85MCA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIEh0dHBTZXJ2bGV0I2RvRGVsZXRlKEh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwcm90ZWN0ZWQgdm9pZCBkb0RlbGV0ZShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsiICsgTkwgKyAiXHRcdC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIiICsgTkwgKyAiXHR9IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKKyAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzkxID0gTkwgKyBOTCArICJcdC8qKiIgKyBOTCArICJcdCAqIEBzZWUgSHR0cFNlcnZsZXQjZG9IZWFkKEh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwcm90ZWN0ZWQgdm9pZCBkb0hlYWQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7IiArIE5MICsgIlx0XHQvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIiArIE5MICsgIlx0fSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85MiA9IE5MICsgTkwgKyAiXHQvKioiICsgTkwgKyAiXHQgKiBAc2VlIEh0dHBTZXJ2bGV0I2RvT3B0aW9ucyhIdHRwU2VydmxldFJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UpIiArIE5MICsgIlx0ICovIiArIE5MICsgIlx0cHJvdGVjdGVkIHZvaWQgZG9PcHRpb25zKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOTMgPSBOTCArIE5MICsgIlx0LyoqIiArIE5MICsgIlx0ICogQHNlZSBIdHRwU2VydmxldCNkb1RyYWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSkiICsgTkwgKyAiXHQgKi8iICsgTkwgKyAiXHRwcm90ZWN0ZWQgdm9pZCBkb1RyYWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geyIgKyBOTCArICJcdFx0Ly8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YiIgKyBOTCArICJcdH0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAorICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOTQgPSBOTCArIE5MICsgIn0iOyAvLyROT04tTkxTLTEkCisgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85NSA9IE5MOwogCiAgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGUoT2JqZWN0IGFyZ3VtZW50KQogICB7CkBAIC0xNjMsMzIgKzE5NCwxODggQEAKIAl9IAogCiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIxKTsKKyAgICAgCisJaWYgKCIzLjAiLmVxdWFscyhtb2RlbC5nZXRKYXZhRUVWZXJzaW9uKCkpKSB7ICAvLyROT04tTkxTLTEkCisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjIpOworICAgIAorCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcyA9IG1vZGVsLmdldENsYXNzQW5ub3RhdGlvblBhcmFtcygpOworCQlpZiAocGFyYW1zLnNpemUoKSA9PSAxICYmIHBhcmFtcy5jb250YWluc0tleShDcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbC5BVFRfVVJMX1BBVFRFUk5TKSkgeworCQkJTGlzdDxTdHJpbmdbXT4gbWFwcGluZ3MgPSAoTGlzdDxTdHJpbmdbXT4pIHBhcmFtcy5nZXQoQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuQVRUX1VSTF9QQVRURVJOUyk7CisJCQlpZiAobWFwcGluZ3Muc2l6ZSgpID09IDEpIHsKKwkJCQlTdHJpbmcgdmFsdWUgPSBtYXBwaW5ncy5nZXQoMClbMF07CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjMpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIHZhbHVlICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI0KTsKKyAgICAKKwkJCX0gZWxzZSB7CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjUpOworICAgIAorCQkJCWJvb2xlYW4gbmVlZENvbW1hID0gZmFsc2U7CisJCQkJZm9yIChTdHJpbmdbXSBtYXBwaW5nIDogbWFwcGluZ3MpIHsKKwkJCQkJaWYgKG5lZWRDb21tYSkgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI2KTsKKyAgICAKKwkJCQkJfQorCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI3KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtYXBwaW5nWzBdICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI4KTsKKyAgICAKKwkJCQkJbmVlZENvbW1hID0gdHJ1ZTsKKwkJCQl9CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjkpOworICAgIAorCQkJfQorCQl9IGVsc2UgaWYgKCFwYXJhbXMuaXNFbXB0eSgpKSB7IAorCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMwKTsKKyAgICAKKwkJCVNldDxTdHJpbmc+IGtleXMgPSBwYXJhbXMua2V5U2V0KCk7CisJCQlib29sZWFuIG5lZWROZXdMaW5lID0ga2V5cy5jb250YWlucyhDcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbC5BVFRfSU5JVF9QQVJBTVMpIHx8IAorCQkJCQkoa2V5cy5jb250YWlucyhDcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbC5BVFRfVVJMX1BBVFRFUk5TKSAmJiAKKwkJCQkJCQkoKExpc3Q8U3RyaW5nW10+KSBwYXJhbXMuZ2V0KENyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLkFUVF9VUkxfUEFUVEVSTlMpKS5zaXplKCkgPiAxKTsKKwkJCWJvb2xlYW4gbmVlZENvbW1hID0gZmFsc2U7CisJCQlmb3IgKFN0cmluZyBrZXkgOiBrZXlzKSB7CisJCQkJaWYgKG5lZWRDb21tYSkgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMxKTsKKyAgICAKKwkJCQl9CisJCQkJCisJCQkJaWYgKG5lZWROZXdMaW5lKSB7CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzIpOworICAgIAorCQkJCX0gCisJCQkKKwkJCQlpZiAoa2V5LmVxdWFscyhDcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbC5BVFRfTkFNRSkgfHwga2V5LmVxdWFscyhDcmVhdGVTZXJ2bGV0VGVtcGxhdGVNb2RlbC5BVFRfREVTQ1JJUFRJT04pKSB7IAorCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwYXJhbXMuZ2V0KGtleSk7CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBrZXkgKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzMpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIHZhbHVlICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM0KTsKKyAgICAKKwkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuQVRUX1VSTF9QQVRURVJOUykpIHsKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGtleSApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNSk7CisgICAgCisJCQkJCUxpc3Q8U3RyaW5nW10+IG1hcHBpbmdzID0gKExpc3Q8U3RyaW5nW10+KSBwYXJhbXMuZ2V0KGtleSk7CisJCQkJCWJvb2xlYW4gbmVlZENvbW1hMiA9IGZhbHNlOworCQkJCQlib29sZWFuIG5lZWROZXdMaW5lMiA9IG1hcHBpbmdzLnNpemUoKSA+IDE7CisJCQkJCWZvciAoU3RyaW5nW10gbWFwcGluZyA6IG1hcHBpbmdzKSB7CisJCQkJCQlpZiAobmVlZENvbW1hMikgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM2KTsKKyAgICAKKwkJCQkJCX0KKwkJCQkKKwkJCQkJCWlmIChuZWVkTmV3TGluZTIpIHsKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNyk7CisgICAgCisJCQkJCQl9IAorCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM4KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtYXBwaW5nWzBdICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM5KTsKKyAgICAJCQkJCisJCQkJCQluZWVkQ29tbWEyID0gdHJ1ZTsKKwkJCQkJfQorCQkJCQorCQkJCQlpZiAobmVlZE5ld0xpbmUyKSB7CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDApOworICAgIAorCQkJCQl9IGVsc2UgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQxKTsKKyAgICAKKwkJCQkJfQorCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQyKTsKKyAgICAKKwkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuQVRUX0lOSVRfUEFSQU1TKSkgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgga2V5ICk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQzKTsKKyAgICAKKwkJCQkJTGlzdDxTdHJpbmdbXT4gaW5pdFBhcmFtcyA9IChMaXN0PFN0cmluZ1tdPikgcGFyYW1zLmdldChrZXkpOworCQkJCQlib29sZWFuIG5lZWRDb21tYTIgPSBmYWxzZTsKKwkJCQkJZm9yIChTdHJpbmdbXSBpbml0UGFyYW0gOiBpbml0UGFyYW1zKSB7CisJCQkJCQlpZiAobmVlZENvbW1hMikgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ0KTsKKyAgICAKKwkJCQkJCX0KKwkJCQkJCQorCQkJCQkJU3RyaW5nIG5hbWUgPSBpbml0UGFyYW1bQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuTkFNRV07CisJCQkJCQlTdHJpbmcgdmFsdWUgPSBpbml0UGFyYW1bQ3JlYXRlU2VydmxldFRlbXBsYXRlTW9kZWwuVkFMVUVdOworCQkJCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gaW5pdFBhcmFtW0NyZWF0ZVNlcnZsZXRUZW1wbGF0ZU1vZGVsLkRFU0NSSVBUSU9OXTsKKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80NSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbmFtZSApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Nik7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggdmFsdWUgKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDcpOworICAgIAkJCQkKKwkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmIGRlc2NyaXB0aW9uLmxlbmd0aCgpID4gMCkgeworCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ4KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBkZXNjcmlwdGlvbiApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80OSk7CisgICAgCisJCQkJCQl9CisKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTApOworICAgIAorCQkJCQkJbmVlZENvbW1hMiA9IHRydWU7CisJCQkJCX0KKworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81MSk7CisgICAgCisJCQkJfQorCQkJCisJCQkJbmVlZENvbW1hID0gdHJ1ZTsKKyAgCQkJfQorCisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUyKTsKKyAgICAKKwkJfQorCX0KKwogICAgIAogCWlmIChtb2RlbC5pc1B1YmxpYygpKSB7IAogCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIyKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTMpOwogICAgICAKIAl9IAogCiAJaWYgKG1vZGVsLmlzQWJzdHJhY3QoKSkgeyAKIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMyk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU0KTsKICAgICAKIAl9CiAKIAlpZiAobW9kZWwuaXNGaW5hbCgpKSB7CiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjQpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81NSk7CiAgICAgCiAJfQogCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI1KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTYpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldENsYXNzTmFtZSgpICk7CiAgICAgCiAJU3RyaW5nIHN1cGVyQ2xhc3MgPSBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpOwogIAlpZiAoc3VwZXJDbGFzcyAhPSBudWxsICYmIHN1cGVyQ2xhc3MubGVuZ3RoKCkgPiAwKSB7CiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjYpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Nyk7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggc3VwZXJDbGFzcyApOwogICAgIAogCX0KQEAgLTE5NiwxNSArMzgzLDE1IEBACiAJTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBtb2RlbC5nZXRJbnRlcmZhY2VzKCk7IAogIAlpZiAoIGludGVyZmFjZXMuc2l6ZSgpID4gMCkgeyAKIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNyk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU4KTsKICAgICAKIAl9CiAJCiAgCWZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5zaXplKCk7IGkrKykgewotICAgCQlTdHJpbmcgSU5URVJGQUNFID0gKFN0cmluZykgaW50ZXJmYWNlcy5nZXQoaSk7CisgICAJCVN0cmluZyBJTlRFUkZBQ0UgPSBpbnRlcmZhY2VzLmdldChpKTsKICAgIAkJaWYgKGkgPiAwKSB7CiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjgpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81OSk7CiAgICAgCiAJCX0KIApAQCAtMjEyLDIwICszOTksMjAgQEAKICAgICAKIAl9CiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82MCk7CiAgICAgIAogCWlmIChtb2RlbC5pc0dlbmVyaWNTZXJ2bGV0U3VwZXJjbGFzcygpKSB7IAogCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMwKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNjEpOwogICAgICAKIAl9IAogCiAgICAgIAogCWlmICghbW9kZWwuaGFzRW1wdHlTdXBlcmNsYXNzQ29uc3RydWN0b3IoKSkgeyAKIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYyKTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRDbGFzc05hbWUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMik7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYzKTsKICAgICAgCiAJfSAKIApAQCAtMjM0LDE5ICs0MjEsMTkgQEAKIAkJZm9yIChDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA6IGNvbnN0cnVjdG9ycykgewogCQkJaWYgKGNvbnN0cnVjdG9yLmlzUHVibGljKCkgfHwgY29uc3RydWN0b3IuaXNQcm90ZWN0ZWQoKSkgeyAKIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMyk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzY0KTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM0KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNjUpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzUpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82Nik7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9ySmF2YWRvYygpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM2KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNjcpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1vZGVsLmdldENsYXNzTmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM3KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNjgpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIGNvbnN0cnVjdG9yLmdldFBhcmFtc0ZvckRlY2xhcmF0aW9uKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzgpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82OSk7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggY29uc3RydWN0b3IuZ2V0UGFyYW1zRm9yQ2FsbCgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM5KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNzApOwogICAgIAogCQkJfSAKIAkJfSAKQEAgLTI1Niw3NSArNDQzLDc1IEBACiAJaWYgKG1vZGVsLnNob3VsZEltcGxlbWVudEFic3RyYWN0TWV0aG9kcygpKSB7CiAJCWZvciAoTWV0aG9kIG1ldGhvZCA6IG1vZGVsLmdldFVuaW1wbGVtZW50ZWRNZXRob2RzKCkpIHsgCiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF83MSk7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldENvbnRhaW5pbmdKYXZhQ2xhc3MoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80MSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzcyKTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQyKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNzMpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1ldGhvZC5nZXRQYXJhbXNGb3JKYXZhZG9jKCkgKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDMpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF83NCk7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggbWV0aG9kLmdldFJldHVyblR5cGUoKSApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80NCk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzc1KTsKICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKCBtZXRob2QuZ2V0TmFtZSgpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ1KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNzYpOwogICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoIG1ldGhvZC5nZXRQYXJhbXNGb3JEZWNsYXJhdGlvbigpICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ2KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNzcpOwogICAgICAKIAkJCVN0cmluZyBkZWZhdWx0UmV0dXJuVmFsdWUgPSBtZXRob2QuZ2V0RGVmYXVsdFJldHVyblZhbHVlKCk7CiAJCQlpZiAoZGVmYXVsdFJldHVyblZhbHVlICE9IG51bGwpIHsgCiAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDcpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF83OCk7CiAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCggZGVmYXVsdFJldHVyblZhbHVlICk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ4KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNzkpOwogICAgIAogCQkJfSAKIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80OSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzgwKTsKICAgICAgCiAJCX0KIAl9IAogCiAgICAgIGlmIChtb2RlbC5zaG91bGRHZW5Jbml0KCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUwKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfODEpOwogICAgICB9IAogICAgICBpZiAobW9kZWwuc2hvdWxkR2VuRGVzdHJveSgpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81MSk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzgyKTsKICAgICAgfSAKICAgICAgaWYgKG1vZGVsLnNob3VsZEdlbkdldFNlcnZsZXRDb25maWcoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTIpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84Myk7CiAgICAgIH0gCiAgICAgIGlmIChtb2RlbC5zaG91bGRHZW5HZXRTZXJ2bGV0SW5mbygpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Myk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzg0KTsKICAgICAgfSAKICAgICAgaWYgKG1vZGVsLnNob3VsZEdlblNlcnZpY2UoKSAmJiAhbW9kZWwuaXNIdHRwU2VydmxldFN1cGVyY2xhc3MoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTQpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84NSk7CiAgICAgIH0gCiAgICAgIGlmIChtb2RlbC5zaG91bGRHZW5TZXJ2aWNlKCkgJiYgbW9kZWwuaXNIdHRwU2VydmxldFN1cGVyY2xhc3MoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTUpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84Nik7CiAgICAgIH0gCiAgICAgIGlmIChtb2RlbC5zaG91bGRHZW5Eb0dldCgpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Nik7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzg3KTsKICAgICAgfSAKICAgICAgaWYgKG1vZGVsLnNob3VsZEdlbkRvUG9zdCgpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81Nyk7CisgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzg4KTsKICAgICAgfSAKICAgICAgaWYgKG1vZGVsLnNob3VsZEdlbkRvUHV0KCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU4KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfODkpOwogICAgICB9IAogICAgICBpZiAobW9kZWwuc2hvdWxkR2VuRG9EZWxldGUoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTkpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF85MCk7CiAgICAgIH0gCiAgICAgIGlmIChtb2RlbC5zaG91bGRHZW5Eb0hlYWQoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNjApOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF85MSk7CiAgICAgIH0gCiAgICAgIGlmIChtb2RlbC5zaG91bGRHZW5Eb09wdGlvbnMoKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNjEpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF85Mik7CiAgICAgIH0gCiAgICAgIGlmIChtb2RlbC5zaG91bGRHZW5Eb1RyYWNlKCkpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYyKTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOTMpOwogICAgICB9IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82Myk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzY0KTsKKyAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOTQpOworICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF85NSk7CiAgICAgcmV0dXJuIHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwogICB9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3BsdWdpbi9XZWJNb2R1bGVFeHRlbnNpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3BsdWdpbi9XZWJNb2R1bGVFeHRlbnNpb25JbXBsLmphdmEKaW5kZXggNTJkM2Y5MS4uZmZjNDFjZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wbHVnaW4vV2ViTW9kdWxlRXh0ZW5zaW9uSW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcGx1Z2luL1dlYk1vZHVsZUV4dGVuc2lvbkltcGwuamF2YQpAQCAtMjgsNyArMjgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRUphdmFQcm9qZWN0SW5mbzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogCkBAIC00OSw3ICs0OCw2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uV2ViTW9kdWxlRXh0ZW5zaW9uI2NyZWF0ZVByb2plY3RJbmZvKCkKIAkgKi8KIAlwdWJsaWMgSjJFRUphdmFQcm9qZWN0SW5mbyBjcmVhdGVQcm9qZWN0SW5mbygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKQEAgLTc5LDIxICs3Nyw3IEBACiAJICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCkKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXRDb250ZXh0Um9vdEZvck1vZHVsZU1hcHBpbmcoV2ViTW9kdWxlIHdlYk1vZHVsZSwgSVByb2plY3QgbmVzdGVkUHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlXZWJBcnRpZmFjdEVkaXQgd2ViRWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPIG1pZ3JhdGUgdG8gZmxleCBwcm9qZWN0Ci0JCQkvLyB3ZWJFZGl0ID0gKFdlYkFydGlmYWN0RWRpdCkgU3RydWN0dXJlRWRpdC5nZXRGaXJzdEFydGlmYWN0RWRpdEZvclJlYWQoIG5lc3RlZFByb2plY3QKLQkJCS8vICk7Ci0JCQlpZiAod2ViRWRpdCAhPSBudWxsKSB7Ci0JCQkJd2ViRWRpdC5zZXRTZXJ2ZXJDb250ZXh0Um9vdCh3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod2ViRWRpdCAhPSBudWxsKQotCQkJCXdlYkVkaXQuZGlzcG9zZSgpOwotCQl9Ci0JCS8vIGlmICh3bnIgIT0gbnVsbCkgewotCQkvLyB3bnIuc2V0Q29udGV4dFJvb3Qod2ViTW9kdWxlLmdldENvbnRleHRSb290KCkpOwotCQkvLyB9CisJCS8vIFRPRE8gbWlncmF0ZSB0byBmbGV4IHByb2plY3QKIAl9CiAKIAkvKgpAQCAtMTI1LDI2ICsxMDksOCBAQAogCSAqLwogCiAJcHVibGljIFN0cmluZyBnZXRDb250ZW50Rm9sZGVyKElQcm9qZWN0IHByb2plY3QsIElGaWxlIHdlYlNldHRpbmdzRmlsZSkgewotCQlTdHJpbmcgY29udGVudEZvbGRlciA9IG51bGw7Ci0KLQkJLy8gV2ViU2V0dGluZ3Mgd2ViU2V0dGluZ3MgPSBuZXcgV2ViU2V0dGluZ3MocHJvamVjdCwgd2ViU2V0dGluZ3NGaWxlKTsKLQkJLy8gaWYgKHdlYlNldHRpbmdzICE9IG51bGwpIHsKLQkJLy8gY29udGVudEZvbGRlciA9IHdlYlNldHRpbmdzLmdldFdlYkNvbnRlbnROYW1lKCk7Ci0JCS8vIH0KKwkJcmV0dXJuIG51bGw7CiAJCS8vIFRvIGRvOiBOZWVkcyB3b3JrIGhlcmUsIG5vIGNvbnRlbnQgZm9sZGVyIGV4aXN0cyBub3cKLQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJLy8gVE9ETyBtaWdyYXRlIHRvIGZsZXggcHJvamVjdAotCQkJLy8gd2ViRWRpdCA9IChXZWJBcnRpZmFjdEVkaXQpIFN0cnVjdHVyZUVkaXQuZ2V0Rmlyc3RBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkgewotCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod2ViRWRpdCAhPSBudWxsKQotCQkJCXdlYkVkaXQuZGlzcG9zZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnRGb2xkZXI7CiAJfQogCiAJLyoKQEAgLTE2MSwxNyArMTI3LDcgQEAKIAl9CiAKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlcnZlckNvbnRleHRSb290KElQcm9qZWN0IHByb2plY3QpIHsKLQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJLy8gVE9ETyBtaWdyYXRlIHRvIGZsZXggcHJvamVjdAotCQkJLy8gd2ViRWRpdCA9IChXZWJBcnRpZmFjdEVkaXQpIFN0cnVjdHVyZUVkaXQuZ2V0Rmlyc3RBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwotCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkgewotCQkJCXJldHVybiB3ZWJFZGl0LmdldFNlcnZlckNvbnRleHRSb290KCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod2ViRWRpdCAhPSBudWxsKQotCQkJCXdlYkVkaXQuZGlzcG9zZSgpOwotCQl9CisJCS8vIFRPRE8gbWlncmF0ZSB0byBmbGV4IHByb2plY3QKIAkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3BsdWdpbi9XZWJQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcGx1Z2luL1dlYlBsdWdpbi5qYXZhCmluZGV4IDM3Yzk3NTkuLjU3NjE3OTAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcGx1Z2luL1dlYlBsdWdpbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcGx1Z2luL1dlYlBsdWdpbi5qYXZhCkBAIC0xOSwxMiArMTksMTIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CkBAIC0zNyw2ICszNyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwogaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworaW1wb3J0IGphdmEubGFuZy5UaHJvd2FibGU7CiAKIAogLyoqCkBAIC0yNDgsMTAgKzI0OSwxMiBAQAogCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIHN1YnN0aXR1dGlvbnMpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3VwZXIuc3RvcChjb250ZXh0KTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewogCQlzdXBlci5zdGFydChjb250ZXh0KTsKIAkJLy9XZWJBcHBSZXNvdXJjZUZhY3RvcnkucmVnaXN0ZXIoV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UpOwpAQCAtMjY1LDE2ICsyNjgsMTQgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW4jZ2V0UGx1Z2luSUQoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7CiAJCXJldHVybiBQTFVHSU5fSUQ7CiAJfQogCQogCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coIGZpbmFsIEV4Y2VwdGlvbiBlICkKIAl7Ci0JCWZpbmFsIElMb2cgbG9nID0gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKTsKLQkJZmluYWwgU3RyaW5nIG1zZyA9ICJFbmNvdW50ZXJlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4iOwotCQkKLQkJbG9nLmxvZyggbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIGUgKSApOworCQlsb2dFcnJvcihlKTsKIAl9CiAJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgYm9vbGVhbiB0cmFuc2xhdGUpIHsKIAkJLy8gVE9ETyBGb3Igbm93Li4uICB0cmFuc2xhdGUgbm90IHN1cHBvcnRlZApAQCAtMjg2LDQgKzI4NywyNCBAQAogCQlyZXR1cm4gZ2V0U3RyaW5nKGtleSxzdWJzdGl0dXRpb25zKTsKIAl9CiAKKwlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgbWVzc2FnZSwgbnVsbCk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGV4Y2VwdGlvbi5nZXRTdGF0dXMoKSApOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSkgeworCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpKTsKKwl9CisKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvSVNlcnZsZXRDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvSVNlcnZsZXRDb25zdGFudHMuamF2YQppbmRleCBjZTc2NDIzLi4wN2RkNTk0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL0lTZXJ2bGV0Q29uc3RhbnRzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9JU2VydmxldENvbnN0YW50cy5qYXZhCkBAIC0xOCw2ICsxOCwxMyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9HRU5FUklDX1NFUlZMRVQgPSAiamF2YXguc2VydmxldC5HZW5lcmljU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfSFRUUF9TRVJWTEVUID0gImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKIAkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfV0VCX1NFUlZMRVQgPSAiamF2YXguc2VydmxldC5hbm5vdGF0aW9uLldlYlNlcnZsZXQiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX1dFQl9MSVNURU5FUiA9ICJqYXZheC5zZXJ2bGV0LmFubm90YXRpb24uV2ViTGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX1dFQl9GSUxURVIgPSAiamF2YXguc2VydmxldC5hbm5vdGF0aW9uLldlYkZpbHRlciI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfQU5OT1RBVElPTl9JTklUX1BBUkFNID0gImphdmF4LnNlcnZsZXQuYW5ub3RhdGlvbi5XZWJJbml0UGFyYW0iOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0FOTk9UQVRJT05fRElTUEFUQ0hFUl9UWVBFID0gImphdmF4LnNlcnZsZXQuRGlzcGF0Y2hlclR5cGUiOyAvLyROT04tTkxTLTEkCisJCisJCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX1NFUlZMRVRfRVhDRVBUSU9OID0gImphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbiI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfU0VSVkxFVF9DT05GSUcgPSAiamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnIjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1QgPSAiamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdCI7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvdmFsaWRhdGlvbi9VcmxQYXR0ZXJuLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWIvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3ZhbGlkYXRpb24vVXJsUGF0dGVybi5qYXZhCmluZGV4IGU4Zjc4OWMuLmY3MTkyZjYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYi9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvdmFsaWRhdGlvbi9VcmxQYXR0ZXJuLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi92YWxpZGF0aW9uL1VybFBhdHRlcm4uamF2YQpAQCAtMzUsMjEgKzM1LDE5IEBACiAJCQlyZXR1cm4gZmFsc2U7CiAKIAkJLy8gUGF0aCBNYXBwaW5ncyBtdXN0IG5vdCBjb250YWluICIqLiIgY2hhcmFjdGVyIHNlcXVlbmNlcwotCQlpZiAodXJsUGF0dGVybi5zdGFydHNXaXRoKCIvIikpIHsKLQkJCWlmICh1cmxQYXR0ZXJuLmluZGV4T2YoIiouIikgPT0gLTEpIHsKKwkJaWYgKHVybFBhdHRlcm4uc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWlmICh1cmxQYXR0ZXJuLmluZGV4T2YoIiouIikgPT0gLTEpIHsgLy8kTk9OLU5MUy0xJAogCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CisJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAogCQkvLyBFeHRlbnNpb24gTWFwcGluZ3MgbXVzdCBub3QgY29udGFpbiAnLycgY2hhcmFjdGVycwotCQlpZiAodXJsUGF0dGVybi5zdGFydHNXaXRoKCIqLiIpKSB7CisJCWlmICh1cmxQYXR0ZXJuLnN0YXJ0c1dpdGgoIiouIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJaWYgKHVybFBhdHRlcm4uaW5kZXhPZignLycpID09IC0xKSB7CiAJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKIAkJCX0KKwkJCXJldHVybiBmYWxzZTsKIAkJfQogCiAJCS8vIFRoZSBVUkwgUGF0dGVybiBpcyBuZWl0aGVyIGEgUGF0aCBNYXBwaW5nLCBub3IgRXh0ZW5zaW9uIE1hcHBpbmcKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9BdXRoQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0F1dGhDb25zdHJhaW50SXRlbVByb3ZpZGVyLmphdmEKaW5kZXggODI1NTNlOS4uMzcxN2QyZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0F1dGhDb25zdHJhaW50SXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0F1dGhDb25zdHJhaW50SXRlbVByb3ZpZGVyLmphdmEKQEAgLTI3LDcgKzI3LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7CkBAIC00Miw3ICs0MSw3IEBACiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50fQogICogb2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgQXV0aENvbnN0cmFpbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgQXV0aENvbnN0cmFpbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KIAkgKi8KQEAgLTUzLDYgKzUyLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgYXV0aG9yaXR5X2NvbnN0cmFpbnQuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiYXV0aG9yaXR5X2NvbnN0cmFpbnQiKTsvLyROT04tTkxTLTEkCiAJfQpAQCAtNjAsNiArNjAsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgc2VjQ29uc3RyYWludCBvZiB0aGUgQXV0aENvbnN0cmFpbnQuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gKChBdXRoQ29uc3RyYWludCkgb2JqZWN0KS5nZXRTZWNDb25zdHJhaW50KCk7CiAJfQpAQCAtNjcsNiArNjgsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtMTI0LDYgKzEyNiw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7CkBAIC0xMzIsNiArMTM1LDcgQEAKIAkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAoKEF1dGhDb25zdHJhaW50KSBvYmplY3QpLmdldERlc2NyaXB0aW9uKCk7CiAJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7CkBAIC0xNTIsNiArMTU2LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBdXRoQ29uc3RyYWludC5jbGFzcykpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkFVVEhfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04gOgpAQCAtMTcxLDYgKzE3Niw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEF1dGhDb25zdHJhaW50X0Rlc2NyaXB0aW9ucygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKSk7CkBAIC0xODMsNiArMTg5LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CkBAIC0xOTMsNiArMjAwLDcgQEAKIAkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAogCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMjA0LDYgKzIxMiw3IEBACiAJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLkNsYXNzLAogCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewogCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSBjb21tYW5kUGFyYW1ldGVyLmdldEVSZWZlcmVuY2UoKTsKIAkJaWYgKHNmID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Db250ZXh0UGFyYW1JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Db250ZXh0UGFyYW1JdGVtUHJvdmlkZXIuamF2YQppbmRleCBlMTEwZWY4Li41ODQxNTE2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvQ29udGV4dFBhcmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0NvbnRleHRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwpAQCAtMzMsNyArMzIsNyBAQAogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Db250ZXh0UGFyYW19CiAgKiBvYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0UGFyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgQ29udGV4dFBhcmFtSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTQ1LDYgKzQ0LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgaW5pdGlhbGl6X3BhcmFtZXRlcl9jb250ZXh0LmdpZi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImluaXRpYWxpel9wYXJhbWV0ZXJfY29udGV4dCIpOy8vJE5PTi1OTFMtMSQKIAl9CkBAIC01Miw2ICs1Miw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSB3ZWJBcHAgb2YgdGhlIENvbnRleHRQYXJhbS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKENvbnRleHRQYXJhbSkgb2JqZWN0KS5nZXRXZWJBcHAoKTsKIAl9CkBAIC01OSw2ICs2MCw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC0xMzQsNiArMTM2LDcgQEAKIAl9CiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMTJjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXsoKENvbnRleHRQYXJhbSkgb2JqZWN0KS5nZXRQYXJhbU5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDb250ZXh0UGFyYW0gezB9IgogCX0KQEAgLTE0NCw2ICsxNDcsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbnRleHRQYXJhbS5jbGFzcykpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkNPTlRFWFRfUEFSQU1fX1BBUkFNX05BTUUgOgpAQCAtMTYzLDYgKzE2Nyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTE3Myw2ICsxNzgsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KQEAgLTE4Myw2ICsxODksNyBAQAogCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0CiAJICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggZGYyZWJiZi4uZTg2YTk0ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0Vycm9yQ29kZUVycm9yUGFnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9FcnJvckNvZGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIuamF2YQpAQCAtMTcsMTEgKzE3LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKQEAgLTMzLDcgKzI4LDcgQEAKICAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlfQogICogb2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgRXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgRXJyb3JQYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIEVycm9yQ29kZUVycm9yUGFnZUl0ZW1Qcm92aWRlciBleHRlbmRzIEVycm9yUGFnZUl0ZW1Qcm92aWRlciB7CiAKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCkBAIC00NSw2ICs0MCw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIGVycm9yY29kZV9lcnJvcnBhZ2UuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiZXJyb3Jjb2RlX2Vycm9ycGFnZSIpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtNTIsNiArNDgsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtODEsOSArNzgsOSBAQAogCX0KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy9yZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjE0Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFcnJvckNvZGVFcnJvclBhZ2UpIG9iamVjdCkuZ2V0RXJyb3JDb2RlKCl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuICgoRXJyb3JDb2RlRXJyb3JQYWdlKSBvYmplY3QpLmdldEVycm9yQ29kZSgpICsgIiAtPiAiICsgKChFcnJvckNvZGVFcnJvclBhZ2UpIG9iamVjdCkuZ2V0TG9jYXRpb24oKTsgCisJCXJldHVybiAoKEVycm9yQ29kZUVycm9yUGFnZSkgb2JqZWN0KS5nZXRFcnJvckNvZGUoKSArICIgLT4gIiArICgoRXJyb3JDb2RlRXJyb3JQYWdlKSBvYmplY3QpLmdldExvY2F0aW9uKCk7ICAvLyROT04tTkxTLTEkCiAJfQogCiAJLyoqCkBAIC05Miw2ICs4OSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRXJyb3JDb2RlRXJyb3JQYWdlLmNsYXNzKSkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRVJST1JfQ09ERV9FUlJPUl9QQUdFX19FUlJPUl9DT0RFIDogewpAQCAtMTA5LDYgKzEwNyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTExOSw2ICsxMTgsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9FcnJvclBhZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9FcnJvclBhZ2VJdGVtUHJvdmlkZXIuamF2YQppbmRleCAxOTBmYTVmLi5mMjBiZDc4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRXJyb3JQYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0Vycm9yUGFnZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwpAQCAtMzIsNyArMzEsNyBAQAogLyoqCiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZX1vYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBFcnJvclBhZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgRXJyb3JQYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTQ0LDYgKzQzLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgZXJyb3JfcGFnZS5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJlcnJvcl9wYWdlIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC01MSw2ICs1MSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSB3ZWJBcHAgb2YgdGhlIEVycm9yUGFnZS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKEVycm9yUGFnZSkgb2JqZWN0KS5nZXRXZWJBcHAoKTsKIAl9CkBAIC01OCw2ICs1OSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC04Niw2ICs4OCw3IEBACiAJfQogCiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjEzY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChFcnJvclBhZ2UpIG9iamVjdCkuZ2V0TG9jYXRpb24oKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJFcnJvclBhZ2UgezB9IgogCX0KQEAgLTk2LDYgKzk5LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFcnJvclBhZ2UuY2xhc3MpKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5FUlJPUl9QQUdFX19MT0NBVElPTiA6IHsKQEAgLTExMyw2ICsxMTcsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIAl9CkBAIC0xMjMsNiArMTI4LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CkBAIC0xMzMsNiArMTM5LDcgQEAKIAkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAogCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9FeGNlcHRpb25UeXBlRXJyb3JQYWdlSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggMzg2MTAwNS4uNjg3ZTFlNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0V4Y2VwdGlvblR5cGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRXhjZXB0aW9uVHlwZUVycm9yUGFnZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0xNywxMSArMTcsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwpAQCAtMzMsNyArMjgsNyBAQAogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCiAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZX1vYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25UeXBlRXJyb3JQYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgRXJyb3JQYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIEV4Y2VwdGlvblR5cGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBFcnJvclBhZ2VJdGVtUHJvdmlkZXIgewogCiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgpAQCAtNDUsNiArNDAsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBleGNlcHRpb25fdHlwZV9lcnJvcnBhZ2UuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiZXhjZXB0aW9uX3R5cGVfZXJyb3JwYWdlIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC01Miw2ICs0OCw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC04MSwxMyArNzgsMTMgQEAKIAl9CiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIxNWNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoRXhjZXB0aW9uVHlwZUVycm9yUGFnZSkgb2JqZWN0KS5nZXRFeGNlcHRpb25UeXBlTmFtZSgpfSkpOyAvLyROT04tTkxTLTEkID0gIkV4Y2VwdGlvblR5cGVFcnJvclBhZ2UgezB9IgogCSAgICBTdHJpbmcgdHlwZU5hbWUgPSAoKEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UpIG9iamVjdCkuZ2V0RXhjZXB0aW9uVHlwZU5hbWUoKTsKIAkgICAgaWYgKHR5cGVOYW1lICE9IG51bGwpIHsKIAkgICAgICAgIHR5cGVOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKHR5cGVOYW1lLmxhc3RJbmRleE9mKCcuJykrMSk7CiAJICAgIH0KLQkgICAgcmV0dXJuIHR5cGVOYW1lICsgIiAtPiAiICsgKChFeGNlcHRpb25UeXBlRXJyb3JQYWdlKSBvYmplY3QpLmdldExvY2F0aW9uKCk7IAorCSAgICByZXR1cm4gdHlwZU5hbWUgKyAiIC0+ICIgKyAoKEV4Y2VwdGlvblR5cGVFcnJvclBhZ2UpIG9iamVjdCkuZ2V0TG9jYXRpb24oKTsgIC8vJE5PTi1OTFMtMSQKIAl9CiAKIAkvKioKQEAgLTk2LDYgKzkzLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKIAl9CkBAIC0xMDcsNiArMTA1LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAJfQpAQCAtMTE3LDYgKzExNiw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0ZpbHRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0ZpbHRlckl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDg5YzQ5NGQuLmJlNmZjZDYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9GaWx0ZXJJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRmlsdGVySXRlbVByb3ZpZGVyLmphdmEKQEAgLTIwLDEyICsyMCwxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7CkBAIC0zOCw3ICszNiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKIAotcHVibGljIGNsYXNzIEZpbHRlckl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIEZpbHRlckl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTYzLDYgKzYxLDcgQEAKIAkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kIHtAbGluayBBZGRDb21tYW5kfWFuZAogCSAqIHtAbGluayBSZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewogCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKIAkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CkBAIC03OSw2ICs3OCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewogCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCiAJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KQEAgLTExNCw2ICsxMTQsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBGaWx0ZXIuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiZmlsdGVyIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xMjEsNiArMTIyLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgRmlsdGVyLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwKCk7CiAJfQpAQCAtMTI4LDYgKzEzMCw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC0xMzYsNyArMTM5LDcgQEAKIAkJCS8vIFRoaXMgaXMgZm9yIHRoZSBmaWx0ZXJOYW1lIGZlYXR1cmUuCiAKIAkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZpbHRlckl0ZW1Qcm92aWRlcl9VSV8wIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCVdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfZmlsdGVyTmFtZV9wcm9wZXJ0eV8zIiksIHdhcC5nZXRGaWx0ZXJfTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9maWx0ZXJOYW1lX3Byb3BlcnR5XzMiKSwgd2FwLmdldEZpbHRlcl9OYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAogCiAJCX0KIAkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwpAQCAtMTcyLDYgKzE3NSw3IEBACiAJICogZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgogCSAqIGludGVyZmFjZQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKIAkJT2JqZWN0IHJldCA9IG51bGw7CiAJCWlmIChnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgaW5zdGFuY2VvZiBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgewpAQCAtMTgxLDYgKzE4NSw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJRmlsdGVyIGZpbHRlciA9IChGaWx0ZXIpIG9iamVjdDsKIAkJU3RyaW5nIG5hbWUgPSBmaWx0ZXIuZ2V0TmFtZSgpOwpAQCAtMTk1LDYgKzIwMCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRmlsdGVyLmNsYXNzKSkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuRklMVEVSX19OQU1FIDoKQEAgLTIxNCw2ICsyMjAsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIApAQCAtMjI4LDYgKzIzNSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpAQCAtMjM3LDYgKzI0NSw3IEBACiAJICogYnkgZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgogCSAqIGludGVyZmFjZQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7CiAJCWJvb2xlYW4gcmV0ID0gZmFsc2U7CiAJCWlmIChnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgaW5zdGFuY2VvZiBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgewpAQCAtMjUyLDYgKzI2MSw3IEBACiAJICogZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgogCSAqIGludGVyZmFjZQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKIAogCQlpZiAoZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIGluc3RhbmNlb2YgV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9GaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmluZGV4IGZkMzIzMzkuLjgyZmRjNGYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9GaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0ZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjAsNyArMjAsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKQEAgLTM1LDcgKzM0LDcgQEAKICAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZ30KICAqIG9iamVjdC4KICAqLwotcHVibGljIGNsYXNzIEZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CiAKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCkBAIC00Nyw2ICs0Niw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIGZpbHRlcl9tYXBwaW5nLmdpZi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZpbHRlcl9tYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC01NCw2ICs1NCw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSB3ZWJBcHAgb2YgdGhlIEZpbHRlck1hcHBpbmcuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHAoKTsKIAl9CkBAIC02MSw2ICs2Miw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC0xMjksNiArMTMxLDcgQEAKIAl9CiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCUZpbHRlck1hcHBpbmcgZmlsdGVyTWFwcGluZyA9IChGaWx0ZXJNYXBwaW5nKSBvYmplY3Q7CiAJCUZpbHRlciBmaWx0ZXIgPSBmaWx0ZXJNYXBwaW5nLmdldEZpbHRlcigpOwpAQCAtMTQ5LDYgKzE1Miw3IEBACiAJICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCiAJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRmlsdGVyTWFwcGluZy5jbGFzcykpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZJTFRFUl9NQVBQSU5HX19VUkxfUEFUVEVSTiA6CkBAIC0xNjksNiArMTczLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAJfQpAQCAtMTc5LDYgKzE4NCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpAQCAtMTg5LDYgKzE5NSw3IEBACiAJICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKIAkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Gb3JtTG9naW5Db25maWdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Gb3JtTG9naW5Db25maWdJdGVtUHJvdmlkZXIuamF2YQppbmRleCBmOWZlODY3Li5jYWU0MDY1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvRm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0Zvcm1Mb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwpAQCAtMzMsNyArMzIsNyBAQAogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWd9CiAgKiBvYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBGb3JtTG9naW5Db25maWdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgRm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTQ1LDYgKzQ0LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgZm9ybV9sb2dpbl9jb25maWcuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiZm9ybV9sb2dpbl9jb25maWciKTsvLyROT04tTkxTLTEkCiAJfQpAQCAtNjQsNiArNjQsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgbG9naW5Db25maWcgb2YgdGhlIEZvcm1Mb2dpbkNvbmZpZy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKEZvcm1Mb2dpbkNvbmZpZykgb2JqZWN0KS5nZXRMb2dpbkNvbmZpZygpOwogCX0KQEAgLTcxLDYgKzcyLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKQEAgLTEyNCw2ICsxMjYsNyBAQAogCX0KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIxNmNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoRm9ybUxvZ2luQ29uZmlnKSBvYmplY3QpLmdldEZvcm1Mb2dpblBhZ2UoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJGb3JtTG9naW5Db25maWcgezB9IgogCX0KQEAgLTEzNCw2ICsxMzcsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEZvcm1Mb2dpbkNvbmZpZy5jbGFzcykpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLkZPUk1fTE9HSU5fQ09ORklHX19GT1JNX0xPR0lOX1BBR0UgOgpAQCAtMTUyLDYgKzE1Niw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTE2Miw2ICsxNjcsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KQEAgLTE3Miw2ICsxNzgsNyBAQAogCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0CiAJICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9IVFRQTWV0aG9kVHlwZUl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDE4MjhlNzAuLjYzNGUwZTMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9IVFRQTWV0aG9kVHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9IVFRQTWV0aG9kVHlwZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwpAQCAtMzQsNyArMzMsNyBAQAogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZX0KICAqIG9iamVjdC4KICAqLwotcHVibGljIGNsYXNzIEhUVFBNZXRob2RUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIEhUVFBNZXRob2RUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTQ2LDYgKzQ1LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgaHR0cF90eXBlLmdpZi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImh0dHBfdHlwZSIpOy8vJE5PTi1OTFMtMSQKIAl9CkBAIC01Myw2ICs1Myw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSByZXNDb2xsZWN0aW9uIG9mIHRoZSBIVFRQTWV0aG9kVHlwZS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKEhUVFBNZXRob2RUeXBlKSBvYmplY3QpLmdldEh0dHBNZXRob2QoKTsKIAl9CkBAIC02MCw2ICs2MSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC05NSw2ICs5Nyw3IEBACiAJfQogCiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjE3Y29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChIVFRQTWV0aG9kVHlwZSkgb2JqZWN0KS5nZXRIdHRwTWV0aG9kKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiSFRUUE1ldGhvZFR5cGUgezB9IgogCX0KQEAgLTEwNSw2ICsxMDgsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEhUVFBNZXRob2RUeXBlLmNsYXNzKSkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuSFRUUF9NRVRIT0RfVFlQRV9fSFRUUF9NRVRIT0QgOiB7CkBAIC0xMjIsNiArMTI2LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAJfQpAQCAtMTMyLDYgKzEzNyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpAQCAtMTQyLDYgKzE0OCw3IEBACiAJICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKIAkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Jbml0UGFyYW1JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Jbml0UGFyYW1JdGVtUHJvdmlkZXIuamF2YQppbmRleCAwYTBhNmQ1Li5kMmQxMDViIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0luaXRQYXJhbUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwpAQCAtMzIsNyArMzEsNyBAQAogLyoqCiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbX1vYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBJbml0UGFyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgSW5pdFBhcmFtSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTQ0LDYgKzQzLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgaW5pdGlhbGl6X3BhcmFtZXRlci5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJpbml0aWFsaXpfcGFyYW1ldGVyIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC01MSw2ICs1MSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBzZXJ2bGV0IG9mIHRoZSBJbml0UGFyYW0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gKChJbml0UGFyYW0pIG9iamVjdCkuZUNvbnRhaW5lcigpOwogCX0KQEAgLTU4LDYgKzU5LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKQEAgLTEzMCw2ICsxMzIsNyBAQAogCSAqIGRlbGVnYXRpbmcgdG8gdGhlIGRlc2NyaXB0b3IsIHdoaWNoIGlzIGFzc3VtZWQgdG8gc3VwcG9ydCB0aGUgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKIAkgKiBpbnRlcmZhY2UKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7CiAJCU9iamVjdCByZXQgPSBudWxsOwogCQlpZiAoZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIGluc3RhbmNlb2YgV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIHsKQEAgLTEzOSw2ICsxNDIsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMThjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXsoKEluaXRQYXJhbSkgb2JqZWN0KS5nZXRQYXJhbU5hbWUoKSwgKChJbml0UGFyYW0pIG9iamVjdCkuZ2V0UGFyYW1WYWx1ZSgpfSkpOyAvLyROT04tTkxTLTEkID0gInswfSA9IHsxfSIKIAl9CkBAIC0xNDksNiArMTUzLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJbml0UGFyYW0uY2xhc3MpKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9OQU1FIDoKQEAgLTE2OCw2ICsxNzMsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIAl9CkBAIC0xNzgsNiArMTg0LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CkBAIC0xODgsNiArMTk1LDcgQEAKIAkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAogCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMTk3LDYgKzIwNSw3IEBACiAJICogYnkgZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgogCSAqIGludGVyZmFjZQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7CiAJCWJvb2xlYW4gcmV0ID0gZmFsc2U7CiAJCWlmIChnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgaW5zdGFuY2VvZiBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgewpAQCAtMjEyLDYgKzIyMSw3IEBACiAJICogZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgogCSAqIGludGVyZmFjZQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKIAogCQlpZiAoZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIGluc3RhbmNlb2YgV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9JdGVtSG9sZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSXRlbUhvbGRlci5qYXZhCmluZGV4IDE5YTRiNDkuLmFjM2ExNGQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9JdGVtSG9sZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0l0ZW1Ib2xkZXIuamF2YQpAQCAtNDQsNiArNDQsNyBAQAogCQlzZXRXZWJBcnRpZmFjdEVkaXQod2ViQXJ0aWZhY3RFZGl0KTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewogCQlXZWJBcHAgdGVzdEVsZW1lbnQ7CiAJCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUENvbmZpZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUENvbmZpZ0l0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDFhNTlmYTguLmIxNGRhY2IgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9KU1BDb25maWdJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSlNQQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CkBAIC0zNyw3ICszNiw3IEBACiAgKiAKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIEpTUENvbmZpZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CitwdWJsaWMgY2xhc3MgSlNQQ29uZmlnSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCiAJICogZW5kLXVzZXItZG9jIC0tPgpAQCAtNTQsNiArNTMsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKQEAgLTcwLDYgKzcwLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKQEAgLTg0LDYgKzg1LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7CiAJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKIAkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgpAQCAtOTcsNiArOTksNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSlNQQ29uZmlnIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xMDcsNiArMTEwLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfSlNQQ29uZmlnX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAogCX0KQEAgLTExNyw2ICsxMjEsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEpTUENvbmZpZy5jbGFzcykpIHsKIAkJCWNhc2UgSnNwUGFja2FnZS5KU1BfQ09ORklHX19UQUdfTElCUyA6CkBAIC0xMzUsNiArMTQwLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAKQEAgLTE0OCw2ICsxNTQsNyBAQAogCSAqIGVuZC11c2VyLWRvYyAtLT4KIAkgKiAgCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSlNQUHJvcGVydHlHcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUFByb3BlcnR5R3JvdXBJdGVtUHJvdmlkZXIuamF2YQppbmRleCBkMDUxOTRkLi5iZDBhMmRmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSlNQUHJvcGVydHlHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9KU1BQcm9wZXJ0eUdyb3VwSXRlbVByb3ZpZGVyLmphdmEKQEAgLTE4LDExICsxOCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwpAQCAtMzUsNyArMzAsNyBAQAogICogCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBKU1BQcm9wZXJ0eUdyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CitwdWJsaWMgY2xhc3MgSlNQUHJvcGVydHlHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIHsKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KIAkgKiBlbmQtdXNlci1kb2MgLS0+CkBAIC01Miw2ICs0Nyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtMTU3LDYgKzE1Myw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9KU1BQcm9wZXJ0eUdyb3VwIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xNjcsNiArMTY0LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJU3RyaW5nIGxhYmVsID0gKChKU1BQcm9wZXJ0eUdyb3VwKSBvYmplY3QpLmdldERpc3BsYXlOYW1lKCk7CiAJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9KU1BQcm9wZXJ0eUdyb3VwX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKQEAgLTE3OSw2ICsxNzcsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEpTUFByb3BlcnR5R3JvdXAuY2xhc3MpKSB7CiAJCQljYXNlIEpzcFBhY2thZ2UuSlNQX1BST1BFUlRZX0dST1VQX19VUkxfUEFUVEVSTiA6CkBAIC0yMDIsNiArMjAxLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAJfQpAQCAtMjExLDYgKzIxMSw3IEBACiAJICogZW5kLXVzZXItZG9jIC0tPgogCSAqICAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJLy8JCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuUkVTT1VSQ0VfTE9DQVRPUjsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9KU1BUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSlNQVHlwZUl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDlmN2FjNWIuLjBlMjgwMjEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9KU1BUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pTUFR5cGVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMTcsMTEgKzE3LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKQEAgLTMyLDcgKzI3LDcgQEAKIC8qKgogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5KU1BUeXBlfW9iamVjdC4KICAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJUeXBlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIEpTUFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJUeXBlSXRlbVByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTQ0LDYgKzM5LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMganNwX3R5cGUuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgianNwX3R5cGUiKTsvLyROT04tTkxTLTEkCiAJfQpAQCAtNTEsNiArNDcsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtODAsNiArNzcsNyBAQAogCX0KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCI0MGNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoSlNQVHlwZSkgb2JqZWN0KS5nZXRKc3BGaWxlKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiSlNQVHlwZSB7MH0iCiAJfQpAQCAtOTAsNiArODgsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEpTUFR5cGUuY2xhc3MpKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5KU1BfVFlQRV9fSlNQX0ZJTEUgOiB7CkBAIC0xMDcsNiArMTA2LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAJfQpAQCAtMTE3LDYgKzExNyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0pzcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSnNwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCA5NjgyZDcyLi4zYzY2ZGY3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSnNwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvSnNwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtOTAsNiArOTAsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVKU1BDb25maWdBZGFwdGVyKCkgewogCQlpZiAoanNwQ29uZmlnSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCWpzcENvbmZpZ0l0ZW1Qcm92aWRlciA9IG5ldyBKU1BDb25maWdJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0xMTIsNiArMTEzLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlSlNQUHJvcGVydHlHcm91cEFkYXB0ZXIoKSB7CiAJCWlmIChqc3BQcm9wZXJ0eUdyb3VwSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCWpzcFByb3BlcnR5R3JvdXBJdGVtUHJvdmlkZXIgPSBuZXcgSlNQUHJvcGVydHlHcm91cEl0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTEzNCw2ICsxMzYsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYWdMaWJSZWZUeXBlQWRhcHRlcigpIHsKIAkJaWYgKHRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJdGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlciA9IG5ldyBUYWdMaWJSZWZUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtMTY3LDYgKzE3MCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKIAkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7CiAJfQpAQCAtMTc3LDYgKzE4MSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewogCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOwogCX0KQEAgLTE4Niw2ICsxOTEsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7CiAJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7CiAJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Mb2NhbEVuY29kaW5nTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDJmMjM0NDguLmQ3N2ZkZmYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Mb2NhbEVuY29kaW5nTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Mb2NhbEVuY29kaW5nTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7CkBAIC0zOCw3ICszNyw3IEBACiAgKiAKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIExvY2FsRW5jb2RpbmdNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKK3B1YmxpYyBjbGFzcyBMb2NhbEVuY29kaW5nTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQogCSAqIGVuZC11c2VyLWRvYyAtLT4KQEAgLTU1LDYgKzU0LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC05Myw2ICs5Myw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIExvY2FsRW5jb2RpbmdNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCS8vCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTG9jYWxFbmNvZGluZ01hcHBpbmciKTsKIAkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImxvY2FsX2VuY29kaW5nX21hcHBpbmciKTsvLyROT04tTkxTLTEkCkBAIC0xMDIsNiArMTAzLDcgQEAKIAkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwogCSAqIC0tPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCVN0cmluZyBsZW0gPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygibG9jYWxfZW5jb2RpbmdfbWFwcGluZ19VSV8iKTsgLy8kTk9OLU5MUy0xJAogCQlTdHJpbmcgbGFiZWwgPSAoKExvY2FsRW5jb2RpbmdNYXBwaW5nKSBvYmplY3QpLmdldExvY2FsZSgpOwpAQCAtMTE0LDYgKzExNiw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTG9jYWxFbmNvZGluZ01hcHBpbmcuY2xhc3MpKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0NBTF9FTkNPRElOR19NQVBQSU5HX19MT0NBTEUgOgpAQCAtMTMyLDYgKzEzNSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTE0Miw2ICsxNDYsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXIuamF2YQppbmRleCA5ODZkYzQxLi4xOGE5ZjkzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwpAQCAtMzcsNyArMzYsNyBAQAogICogCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworcHVibGljIGNsYXNzIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQogCSAqIGVuZC11c2VyLWRvYyAtLT4KQEAgLTU0LDYgKzUzLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC03MCw2ICs3MCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7CkBAIC04Miw2ICs4Myw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIExvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQkvLwkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCIpOwogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgibG9jYWxfZW5jb2RpbmdfbWFwcGluZ19saXN0Iik7Ly8kTk9OLU5MUy0xJApAQCAtOTEsNiArOTMsNyBAQAogCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCiAJICogLS0+CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJMb2NhbF9lbmNvZGluZ19tYXBwaW5nX2xpc3RfVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiV2VsY29tZSBGaWxlIExpc3QiCiAJfQpAQCAtMTAxLDYgKzEwNCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0LmNsYXNzKSkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTE9DQUxfRU5DT0RJTkdfTUFQUElOR19MSVNUX19MT0NBTF9FTkNPRElOR19NQVBQSU5HUyA6IHsKQEAgLTExOCw2ICsxMjIsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIApAQCAtMTMwLDYgKzEzNSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL0xvZ2luQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTG9naW5Db25maWdJdGVtUHJvdmlkZXIuamF2YQppbmRleCAxOWJmOTNhLi4wNjRjZDQ0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTG9naW5Db25maWdJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTG9naW5Db25maWdJdGVtUHJvdmlkZXIuamF2YQpAQCAtMTgsMTEgKzE4LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKQEAgLTM1LDcgKzM2LDcgQEAKIC8qKgogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZ31vYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBMb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKK3B1YmxpYyBjbGFzcyBMb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CiAKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCkBAIC00Nyw2ICs0OCw3IEBACiAJLyoqCiAJICogVGhpcyBjcmVhdGVzIGEgbmV3IGNoaWxkIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBjcmVhdGVDaGlsZChPYmplY3Qgb2JqZWN0KSB7CiAJCS8vIFRPRE86IGNyZWF0ZSBzb21lIGNoaWxkIG9iamVjdC4KIAkJcmV0dXJuIG51bGw7CkBAIC01Niw2ICs1OCw3IEBACiAJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZCB7QGxpbmsgQWRkQ29tbWFuZH1hbmQKIAkgKiB7QGxpbmsgUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKIAkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7CiAJCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwpAQCAtNzYsNiArNzksNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ3JlYXRlXyNDSElMRF9DTEFTU19OQU1FI19VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgI0NISUxEX0NMQVNTX05BTUUjIgogCX0KQEAgLTg0LDYgKzg4LDcgQEAKIAkgKiBUaGlzIHJldHVybnMgdGhlIGhlbHAgdGV4dCBmb3IKIAkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjFjb25jYXQiLCAobmV3IE9iamVjdFtde3JlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7Ly8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgYSBjaGlsZCBvZiB0eXBlICNDSElMRF9DTEFTU19OQU1FIyBmb3IgdGhlIHNlbGVjdGVkIHswfS4iIApAQCAtOTIsNiArOTcsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBmb3JtX2xvZ2luX2NvbmZpZy5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJmb3JtX2xvZ2luX2NvbmZpZyIpOy8vJE5PTi1OTFMtMSQKIAl9CkBAIC05OSw2ICsxMDUsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgd2ViQXBwIG9mIHRoZSBMb2dpbkNvbmZpZy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKExvZ2luQ29uZmlnKSBvYmplY3QpLmdldFdlYkFwcCgpOwogCX0KQEAgLTEwNiw2ICsxMTMsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtMTc2LDYgKzE4NCw3IEBACiAJCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9naW5Db25maWdfQXV0aG9yaXphdGlvbk1ldGhvZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjIxY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChMb2dpbkNvbmZpZykgb2JqZWN0KS5nZXRSZWFsbU5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJMb2dpbkNvbmZpZyB7MH0iCiAJfQpAQCAtMTg2LDYgKzE5NSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTG9naW5Db25maWcuY2xhc3MpKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5MT0dJTl9DT05GSUdfX0FVVEhfTUVUSE9EIDoKQEAgLTIwNiw2ICsyMTYsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIApAQCAtMjE4LDYgKzIyOSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL01pbWVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTWltZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQppbmRleCA2YzA4NmQyLi5lMjE2ZTRmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTWltZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvTWltZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKQEAgLTMzLDcgKzMyLDcgQEAKIC8qKgogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5NaW1lTWFwcGluZ31vYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBNaW1lTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKK3B1YmxpYyBjbGFzcyBNaW1lTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CiAKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCkBAIC00NSw2ICs0NCw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIG1pbWVfbWFwcGluZy5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJtaW1lX21hcHBpbmciKTsvLyROT04tTkxTLTEkCiAJfQpAQCAtNTIsNiArNTIsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgd2ViQXBwIG9mIHRoZSBNaW1lTWFwcGluZy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKE1pbWVNYXBwaW5nKSBvYmplY3QpLmdldFdlYkFwcCgpOwogCX0KQEAgLTU5LDYgKzYwLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKQEAgLTExNiw2ICsxMTgsNyBAQAogCX0KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyMmNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoTWltZU1hcHBpbmcpIG9iamVjdCkuZ2V0RXh0ZW5zaW9uKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiTWltZU1hcHBpbmcgezB9IgogCX0KQEAgLTEyNiw2ICsxMjksNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1pbWVNYXBwaW5nLmNsYXNzKSkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuTUlNRV9NQVBQSU5HX19FWFRFTlNJT04gOgpAQCAtMTQ0LDYgKzE0OCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTE1NCw2ICsxNTksNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KQEAgLTE2NCw2ICsxNzAsNyBAQAogCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0CiAJICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvUm9sZU5hbWVUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvUm9sZU5hbWVUeXBlSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggYzkxZjAyMi4uMzI1MjhiZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1JvbGVOYW1lVHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Sb2xlTmFtZVR5cGVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKQEAgLTM0LDcgKzMzLDcgQEAKICAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uUm9sZU5hbWVUeXBlfQogICogb2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgUm9sZU5hbWVUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIFJvbGVOYW1lVHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CiAKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCkBAIC00Niw2ICs0NSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHNlY3VyaXR5X3JvbGVfbmFtZXR5cGUuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2VjdXJpdHlfcm9sZV9uYW1ldHlwZSIpOy8vJE5PTi1OTFMtMSQKIAl9CkBAIC01Myw2ICs1Myw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC04Miw2ICs4Myw3IEBACiAJfQogCiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjIzY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChSb2xlTmFtZVR5cGUpIG9iamVjdCkuZ2V0Um9sZU5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJSb2xlTmFtZVR5cGUgezB9IgogCX0KQEAgLTkyLDYgKzk0LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlTmFtZVR5cGUuY2xhc3MpKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5ST0xFX05BTUVfVFlQRV9fUk9MRV9OQU1FIDogewpAQCAtMTA5LDYgKzExMiw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTExOSw2ICsxMjMsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KQEAgLTEyOSw2ICsxMzQsNyBAQAogCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0CiAJICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvU2VjdXJpdHlDb25zdHJhaW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvU2VjdXJpdHlDb25zdHJhaW50SXRlbVByb3ZpZGVyLmphdmEKaW5kZXggMzAxMzRiZC4uMDhhMmU0ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZWN1cml0eUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YQpAQCAtMTksMTEgKzE5LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwpAQCAtNDAsNyArNDEsNyBAQAogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnR9CiAgKiBvYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgU2VjdXJpdHlDb25zdHJhaW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTUyLDYgKzUzLDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgY2hpbGQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGNyZWF0ZUNoaWxkKE9iamVjdCBvYmplY3QpIHsKIAkJLy8gVE9ETzogY2hlY2sgdGhhdCB0aGlzIGlzIHdoYXQgeW91IHdhbnQuCiAJCVdlYlJlc291cmNlQ29sbGVjdGlvbiBjaGlsZCA9IFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uKCk7CkBAIC02NSw2ICs2Nyw3IEBACiAJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZCB7QGxpbmsgQWRkQ29tbWFuZH1hbmQKIAkgKiB7QGxpbmsgUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKIAkJV2ViYXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7CiAJCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwpAQCAtNzksNiArODIsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKIAkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgogCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCkBAIC05MCw2ICs5NCw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBpbWFnZSBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCUVPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKIAkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UocmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKSArICJDcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJApAQCAtOTgsNiArMTAzLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNyZWF0ZV9XZWJSZXNvdXJjZUNvbGxlY3RpX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIkNyZWF0ZSBXZWJSZXNvdXJjZUNvbGxlY3Rpb24iCiAJfQpAQCAtMTA2LDYgKzExMiw3IEBACiAJICogVGhpcyByZXR1cm5zIHRoZSBoZWxwIHRleHQgZm9yCiAJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUb29sVGlwVGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCUVPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIyNGNvbmNhdCIsIChuZXcgT2JqZWN0W117cmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgYSBjaGlsZCBvZiB0eXBlIFdlYlJlc291cmNlQ29sbGVjdGlvbiBmb3IgdGhlIHNlbGVjdGVkIHswfS4iCkBAIC0xMTQsNiArMTIxLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgc2VjdXJpdHlfY29uc3RyYWludC5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzZWN1cml0eV9jb25zdHJhaW50Iik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xMjEsNiArMTI5LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgU2VjdXJpdHlDb25zdHJhaW50LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuICgoU2VjdXJpdHlDb25zdHJhaW50KSBvYmplY3QpLmdldFdlYkFwcCgpOwogCX0KQEAgLTEyOCw2ICsxMzcsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtMTc3LDYgKzE4Nyw3IEBACiAJCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdXJpdHlDb25zdHJhaW50X0Rpc3BsYXlOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCVN0cmluZyBkaXNwbGF5TmFtZSA9ICgoU2VjdXJpdHlDb25zdHJhaW50KSBvYmplY3QpLmdldERpc3BsYXlOYW1lKCk7CiAJCWlmIChkaXNwbGF5TmFtZSA9PSBudWxsKSB7CkBAIC0xOTUsNiArMjA2LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZWN1cml0eUNvbnN0cmFpbnQuY2xhc3MpKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5TRUNVUklUWV9DT05TVFJBSU5UX19ESVNQTEFZX05BTUUgOgpAQCAtMjE2LDYgKzIyOCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCkBAIC0yMzYsNiArMjQ5LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvU2VydmxldEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRJdGVtUHJvdmlkZXIuamF2YQppbmRleCA1ZTg0ODY2Li44MmE3NmI1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvU2VydmxldEl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXJ2bGV0SXRlbVByb3ZpZGVyLmphdmEKQEAgLTE5LDEyICsxOSwxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7CkBAIC0zOCw3ICszNiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKIAotcHVibGljIGNsYXNzIFNlcnZsZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0SXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgewogCiAKIAkvKioKQEAgLTY0LDYgKzYyLDcgQEAKIAkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kIHtAbGluayBBZGRDb21tYW5kfWFuZAogCSAqIHtAbGluayBSZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewogCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UgcGtnID0gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRTsKIAkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CkBAIC04NSw2ICs4NCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewogCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCiAJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KQEAgLTEyMCw2ICsxMjAsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBTZXJ2bGV0LmdpZi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJV2ViVHlwZSB3dCA9ICgoU2VydmxldCkgb2JqZWN0KS5nZXRXZWJUeXBlKCk7CiAJCWlmICh3dCAhPSBudWxsICYmIHd0LmlzSnNwVHlwZSgpKQpAQCAtMTMxLDYgKzEzMiw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSB3ZWJBcHAgb2YgdGhlIFNlcnZsZXQuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gKChTZXJ2bGV0KSBvYmplY3QpLmdldFdlYkFwcCgpOwogCX0KQEAgLTEzOCw2ICsxNDAsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtMTkzLDYgKzE5Niw3IEBACiAJICogZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgogCSAqIGludGVyZmFjZQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKIAkJT2JqZWN0IHJldCA9IG51bGw7CiAJCWlmIChnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgaW5zdGFuY2VvZiBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgewpAQCAtMjAyLDYgKzIwNiw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJU2VydmxldCBzZXJ2bGV0ID0gKFNlcnZsZXQpIG9iamVjdDsKIAkJU3RyaW5nIG5hbWUgPSBzZXJ2bGV0LmdldFNlcnZsZXROYW1lKCk7CkBAIC0yMTYsNiArMjIxLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZXJ2bGV0LmNsYXNzKSkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9fU0VSVkxFVF9OQU1FIDoKQEAgLTIzOSw2ICsyNDUsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIApAQCAtMjYxLDYgKzI2OCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpAQCAtMjcwLDYgKzI3OCw3IEBACiAJICogYnkgZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgogCSAqIGludGVyZmFjZQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7CiAJCWJvb2xlYW4gcmV0ID0gZmFsc2U7CiAJCWlmIChnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eSkgaW5zdGFuY2VvZiBXZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvcikgewpAQCAtMjg2LDYgKzI5NSw3IEBACiAJICogZGVsZWdhdGluZyB0byB0aGUgZGVzY3JpcHRvciwgd2hpY2ggaXMgYXNzdW1lZCB0byBzdXBwb3J0IHRoZSBJSXRlbVByb3BlcnR5RGVzY3JpcHRvcgogCSAqIGludGVyZmFjZQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKIAogCQlpZiAoZ2V0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgcHJvcGVydHkpIGluc3RhbmNlb2YgV2ViVG9vbGluZ0l0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggNjAyYTJkYS4uMWM5NDYzYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1NlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CkBAIC0zNCw3ICszMyw3IEBACiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nfQogICogb2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgU2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgU2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewogCiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgpAQCAtNDYsNiArNDUsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBzZXJ2bGV0X21hcHBpbmcuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2VydmxldF9tYXBwaW5nIik7Ly8kTk9OLU5MUy0xJAogCX0KQEAgLTUzLDYgKzUzLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgU2VydmxldE1hcHBpbmcuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gKChTZXJ2bGV0TWFwcGluZykgb2JqZWN0KS5nZXRXZWJBcHAoKTsKIAl9CkBAIC02MCw2ICs2MSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC0xMjAsNiArMTIyLDcgQEAKIAl9CiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCVN0cmluZyB1cmxTdHIgPSAoKFNlcnZsZXRNYXBwaW5nKSBvYmplY3QpLmdldFVybFBhdHRlcm4oKTsKIAkJU2VydmxldCBzZXJ2bGV0ID0gKChTZXJ2bGV0TWFwcGluZykgb2JqZWN0KS5nZXRTZXJ2bGV0KCk7CkBAIC0xMzEsNiArMTM0LDcgQEAKIAkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KIAkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZXJ2bGV0TWFwcGluZy5jbGFzcykpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLlNFUlZMRVRfTUFQUElOR19fVVJMX1BBVFRFUk4gOgpAQCAtMTUwLDYgKzE1NCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTE2MCw2ICsxNjUsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KQEAgLTE3MCw2ICsxNzYsNyBAQAogCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0CiAJICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvU2VydmxldFR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDIwMzlhODkuLjY4ODg3M2QgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0xNywxMSArMTcsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwpAQCAtMzIsNyArMjcsNyBAQAogLyoqCiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlfW9iamVjdC4KICAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViVHlwZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0VHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYlR5cGVJdGVtUHJvdmlkZXIgewogCiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgpAQCAtNDQsNiArMzksNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBzZXJ2bGV0X3R5cGUuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2VydmxldF90eXBlIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC01MSw2ICs0Nyw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC04MCw2ICs3Nyw3IEBACiAJfQogCiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjQxY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChTZXJ2bGV0VHlwZSkgb2JqZWN0KS5nZXRDbGFzc05hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJTZXJ2bGV0VHlwZSB7MH0iCiAJfQpAQCAtOTAsNiArODgsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZsZXRUeXBlLmNsYXNzKSkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VSVkxFVF9UWVBFX19DTEFTU19OQU1FIDogewpAQCAtMTA3LDYgKzEwNiw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTExNyw2ICsxMTcsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXNzaW9uQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvU2Vzc2lvbkNvbmZpZ0l0ZW1Qcm92aWRlci5qYXZhCmluZGV4IGU0YzhiNDQuLjhjNTEyMGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9TZXNzaW9uQ29uZmlnSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1Nlc3Npb25Db25maWdJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjAsNyArMjAsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKQEAgLTMzLDcgKzMyLDcgQEAKICAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZ30KICAqIG9iamVjdC4KICAqLwotcHVibGljIGNsYXNzIFNlc3Npb25Db25maWdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgU2Vzc2lvbkNvbmZpZ0l0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CiAKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCkBAIC00NSw2ICs0NCw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHNlc3Npb25fY29uZmlnLmdpZi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNlc3Npb25fY29uZmlnIik7Ly8kTk9OLU5MUy0xJAogCX0KQEAgLTUyLDYgKzUyLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgU2Vzc2lvbkNvbmZpZy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKFNlc3Npb25Db25maWcpIG9iamVjdCkuZ2V0V2ViQXBwKCk7CiAJfQpAQCAtNTksNiArNjAsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtOTQsNiArOTYsNyBAQAogCX0KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzMWNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtde25ldyBJbnRlZ2VyKCgoU2Vzc2lvbkNvbmZpZykgb2JqZWN0KS5nZXRTZXNzaW9uVGltZW91dCgpKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJTZXNzaW9uQ29uZmlnIHswfSIKIAl9CkBAIC0xMDQsNiArMTA3LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZXNzaW9uQ29uZmlnLmNsYXNzKSkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuU0VTU0lPTl9DT05GSUdfX1NFU1NJT05fVElNRU9VVCA6IHsKQEAgLTEyMSw2ICsxMjUsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIAl9CkBAIC0xMzEsNiArMTM2LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CkBAIC0xNDEsNiArMTQ3LDcgQEAKIAkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAogCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1RhZ0xpYlJlZkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1RhZ0xpYlJlZkl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IGZmMzM3ZmUuLjExZjMyOGYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9UYWdMaWJSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvVGFnTGliUmVmSXRlbVByb3ZpZGVyLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CkBAIC0zMiw3ICszMSw3IEBACiAvKioKICAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVGFnTGliUmVmfW9iamVjdC4KICAqLwotcHVibGljIGNsYXNzIFRhZ0xpYlJlZkl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKK3B1YmxpYyBjbGFzcyBUYWdMaWJSZWZJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewogCiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgpAQCAtNDQsNiArNDMsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBqc3BfbGlicmFyeV9yZWZlcmVuY2UuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgianNwX2xpYnJhcnlfcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAogCX0KQEAgLTUxLDYgKzUxLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHdlYkFwcCBvZiB0aGUgVGFnTGliUmVmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuICgoVGFnTGliUmVmKSBvYmplY3QpLmdldFdlYkFwcCgpOwogCX0KQEAgLTU4LDYgKzU5LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKQEAgLTExNSw2ICsxMTcsNyBAQAogCX0KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzMmNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdeygoVGFnTGliUmVmKSBvYmplY3QpLmdldFRhZ2xpYlVSSSgpfSkpOyAvLyROT04tTkxTLTEkID0gIlRhZ0xpYlJlZiB7MH0iCiAJfQpAQCAtMTI1LDYgKzEyOCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVGFnTGliUmVmLmNsYXNzKSkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVEFHX0xJQl9SRUZfX1RBR0xJQl9VUkkgOgpAQCAtMTQzLDYgKzE0Nyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTE1Myw2ICsxNTgsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KQEAgLTE2Myw2ICsxNjksNyBAQAogCSAqIHRvIHJldHVybiB0aGUgZW1wdHkgZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0CiAJICogYmUgYW55IGNoaWxkcmVuLCBzbyB0aGlzIGlzIGZhc3Rlci4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvVGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1RhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIuamF2YQppbmRleCA5NDMwY2ZjLi45Y2JkN2JlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvVGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9UYWdMaWJSZWZUeXBlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKQEAgLTM2LDcgKzM1LDcgQEAKICAqIAogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgVGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CitwdWJsaWMgY2xhc3MgVGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQogCSAqIGVuZC11c2VyLWRvYyAtLT4KQEAgLTUzLDYgKzUyLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC05Myw2ICs5Myw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UYWdMaWJSZWZUeXBlIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xMDMsNiArMTA0LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJU3RyaW5nIGxhYmVsID0gKChUYWdMaWJSZWZUeXBlKSBvYmplY3QpLmdldFRhZ2xpYlVSSSgpOwogCQlTdHJpbmcgdGxydCA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfVGFnTGliUmVmVHlwZV90eXBlIik7IC8vJE5PTi1OTFMtMSQKQEAgLTExNSw2ICsxMTcsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRhZ0xpYlJlZlR5cGUuY2xhc3MpKSB7CiAJCQljYXNlIEpzcFBhY2thZ2UuVEFHX0xJQl9SRUZfVFlQRV9fVEFHTElCX1VSSSA6CkBAIC0xMzMsNiArMTM2LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAJfQpAQCAtMTQyLDYgKzE0Niw3IEBACiAJICogZW5kLXVzZXItZG9jIC0tPgogCSAqICAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9VUkxQYXR0ZXJuVHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1VSTFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggMjUzMzljMy4uZWNmYjk1NSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1VSTFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1VSTFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CkBAIC0zMyw3ICszMiw3IEBACiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlVSTFBhdHRlcm5UeXBlfQogICogb2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgVVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgVVJMUGF0dGVyblR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewogCiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgpAQCAtNDUsNiArNDQsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB1cmxfdHlwZS5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJ1cmxfdHlwZSIpOy8vJE5PTi1OTFMtMSQKIAl9CkBAIC01Miw2ICs1Miw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSByZXNDb2xsZWN0aW9uIG9mIHRoZSBVUkxQYXR0ZXJuVHlwZS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKFVSTFBhdHRlcm5UeXBlKSBvYmplY3QpLmdldFJlc0NvbGxlY3Rpb24oKTsKIAl9CkBAIC01OSw2ICs2MCw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC05NCw2ICs5Niw3IEBACiAJfQogCiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjMzY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117KChVUkxQYXR0ZXJuVHlwZSkgb2JqZWN0KS5nZXRVcmxQYXR0ZXJuKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiVVJMUGF0dGVyblR5cGUgezB9IgogCX0KQEAgLTEwNCw2ICsxMDcsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFVSTFBhdHRlcm5UeXBlLmNsYXNzKSkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuVVJMX1BBVFRFUk5fVFlQRV9fVVJMX1BBVFRFUk4gOiB7CkBAIC0xMjEsNiArMTI1LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAJfQpAQCAtMTMxLDYgKzEzNiw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpAQCAtMTQxLDYgKzE0Nyw3IEBACiAJICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKIAkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Vc2VyRGF0YUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9Vc2VyRGF0YUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YQppbmRleCAwMmMwNGIxLi41ZWQwNWI3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvVXNlckRhdGFDb25zdHJhaW50SXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1VzZXJEYXRhQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwpAQCAtMzQsNyArMzMsNyBAQAogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnR9CiAgKiBvYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBVc2VyRGF0YUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgVXNlckRhdGFDb25zdHJhaW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTQ2LDYgKzQ1LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdXNlcl9kYXRhX2NvbnN0cmFpbnQuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgidXNlcl9kYXRhX2NvbnN0cmFpbnQiKTsgLy8kTk9OLU5MUy0xJAogCX0KQEAgLTUzLDYgKzUzLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHNlY0NvbnN0cmFpbnQgb2YgdGhlIFVzZXJEYXRhQ29uc3RyYWludC4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKFVzZXJEYXRhQ29uc3RyYWludCkgb2JqZWN0KS5nZXRTZWNDb25zdHJhaW50KCk7CiAJfQpAQCAtNjAsNiArNjEsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtMTIwLDYgKzEyMiw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7CkBAIC0xMjksNiArMTMyLDcgQEAKIAl9CiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiMzRjb25jYXRfVUlfIiwgKG5ldyBPYmplY3RbXXsoKFVzZXJEYXRhQ29uc3RyYWludCkgb2JqZWN0KS5nZXRUcmFuc3BvcnRHdWFyYW50ZWUoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiVXNlckRhdGFDb25zdHJhaW50IHswfSIKIAl9CkBAIC0xMzksNiArMTQzLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChVc2VyRGF0YUNvbnN0cmFpbnQuY2xhc3MpKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5VU0VSX0RBVEFfQ09OU1RSQUlOVF9fREVTQ1JJUFRJT04gOgpAQCAtMTU4LDYgKzE2Myw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCkBAIC0xNzIsNiArMTc4LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CkBAIC0xODIsNiArMTg5LDcgQEAKIAkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAogCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYkFwcEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYkFwcEl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IGQ1NjU0OGEuLjMzNjFkYWEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJBcHBJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViQXBwSXRlbVByb3ZpZGVyLmphdmEKQEAgLTE4LDEyICsxOCw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwpAQCAtNDMsNyArNDAsNyBAQAogLyoqCiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYkFwcH1vYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBXZWJBcHBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBKTkRJRW52UmVmc0dyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIFdlYkFwcEl0ZW1Qcm92aWRlciBleHRlbmRzIEpORElFbnZSZWZzR3JvdXBJdGVtUHJvdmlkZXIgewogCiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgpAQCAtNjksNiArNjYsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApIG9iamVjdDsKIAkJQ29sbGVjdGlvbiBteUNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKQEAgLTg1LDYgKzgzLDcgQEAKIAkgKi8KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKQEAgLTExNSw2ICsxMTQsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKIAkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgogCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCkBAIC0xNDcsNiArMTQ3LDcgQEAKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzNWNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtde3JlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIGEgY2hpbGQgb2YgdHlwZSBDb250ZXh0UGFyYW0gZm9yIHRoZSBzZWxlY3RlZCB7MH0uIgogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlTdHJpbmcga2V5ID0gbnVsbDsKIAkJaWYgKCgoV2ViQXBwKSBvYmplY3QpLmVSZXNvdXJjZSgpID09IG51bGwpCkBAIC0xNzEsNiArMTcyLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKQEAgLTIzMSw2ICsyMzMsNyBAQAogCQkJCQlXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9WZXJzaW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBvYmplY3Q7CiAJCVN0cmluZyBuYW1lID0gd2ViQXBwLmdldERpc3BsYXlOYW1lKCk7CkBAIC0yNDUsNiArMjQ4LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXZWJBcHAuY2xhc3MpKSB7CiAJCQljYXNlIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5XRUJfQVBQX19ESVNUUklCVVRBQkxFIDoKQEAgLTI4MSw2ICsyODUsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIApAQCAtMzMxLDYgKzMzNiw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKIAkJYm9vbGVhbiBxdWFsaWZ5ID0gZmVhdHVyZSA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKTkRJRW52UmVmc0dyb3VwX0VqYlJlZnMoKSB8fCBmZWF0dXJlID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEpORElFbnZSZWZzR3JvdXBfRWpiTG9jYWxSZWZzKCk7CiAJCXJldHVybiBnZXRTdHJpbmcocXVhbGlmeSA/ICJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiIDogIl9VSV9DcmVhdGVDaGlsZF90ZXh0IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC0zNDMsNiArMzQ5LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViUmVzb3VyY2VDb2xsZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViUmVzb3VyY2VDb2xsZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggNGIyOTRhNi4uZjcyYmQyYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYlJlc291cmNlQ29sbGVjdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJSZXNvdXJjZUNvbGxlY3Rpb25JdGVtUHJvdmlkZXIuamF2YQpAQCAtMjksNyArMjksNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKQEAgLTQ1LDcgKzQ0LDcgQEAKICAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQogICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbn1vYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBXZWJSZXNvdXJjZUNvbGxlY3Rpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgV2ViUmVzb3VyY2VDb2xsZWN0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTU3LDYgKzU2LDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgY2hpbGQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGNyZWF0ZUNoaWxkKE9iamVjdCBvYmplY3QpIHsKIAkJLy8gVE9ETzogY2hlY2sgdGhhdCB0aGlzIGlzIHdoYXQgeW91IHdhbnQuCiAJCVVSTFBhdHRlcm5UeXBlIGNoaWxkID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVUkxQYXR0ZXJuVHlwZSgpOwpAQCAtNzAsNiArNzAsNyBAQAogCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQge0BsaW5rIEFkZENvbW1hbmR9YW5kCiAJICoge0BsaW5rIFJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7CiAJCVdlYmFwcGxpY2F0aW9uUGFja2FnZSBwa2cgPSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFOwogCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKQEAgLTgzLDYgKzg0LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7CiAJCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKIAkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgpAQCAtOTQsNiArOTYsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgaW1hZ2UgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlFT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7CiAJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKHJlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiQ3JlYXRlVVJMUGF0dGVyblR5cGUiKTsvLyROT04tTkxTLTEkCkBAIC0xMDIsNiArMTA1LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNyZWF0ZV9VUkxQYXR0ZXJuVHlwZV9VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgVVJMUGF0dGVyblR5cGUiCiAJfQpAQCAtMTEwLDYgKzExNCw3IEBACiAJICogVGhpcyByZXR1cm5zIHRoZSBoZWxwIHRleHQgZm9yCiAJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUb29sVGlwVGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCUVPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKIAkJcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzN2NvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtde3JlZk9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCl9KSk7IC8vJE5PTi1OTFMtMSQgPSAiQ3JlYXRlIGEgY2hpbGQgb2YgdHlwZSBVUkxQYXR0ZXJuVHlwZSBmb3IgdGhlIHNlbGVjdGVkIHswfS4iCkBAIC0xMTgsNiArMTIzLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgd2ViX3Jlc291cmNlX2NvbGxlY3Rpb24uZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgid2ViX3Jlc291cmNlX2NvbGxlY3Rpb24iKTsvLyROT04tTkxTLTEkCiAJfQpAQCAtMTI1LDYgKzEzMSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBzZWNDb25zdHJhaW50IG9mIHRoZSBXZWJSZXNvdXJjZUNvbGxlY3Rpb24uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gKChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pIG9iamVjdCkuZ2V0U2VjQ29uc3RyYWludCgpOwogCX0KQEAgLTEzMiw2ICsxMzksNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtMjA4LDYgKzIxNiw3IEBACiAJCQkJCVdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViUmVzb3VyY2VDb2xsZWN0aW9uX0h0dHBNZXRob2QoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJLy8JcmV0dXJuIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCIzOGNvbmNhdF9VSV8iLCAobmV3IE9iamVjdFtdIHsKIAkJLy8gKChXZWJSZXNvdXJjZUNvbGxlY3Rpb24pb2JqZWN0KS5nZXRXZWJSZXNvdXJjZU5hbWUoKSB9KSk7IC8vJE5PTi1OTFMtMSQgPQpAQCAtMjIxLDYgKzIzMCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV2ViUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzKSkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VCX1JFU09VUkNFX0NPTExFQ1RJT05fX1dFQl9SRVNPVVJDRV9OQU1FIDoKQEAgLTI0NCw2ICsyNTQsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIApAQCAtMjYyLDYgKzI3Myw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpAQCAtMjczLDYgKzI4NSw3IEBACiAJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLkNsYXNzLAogCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewogCQlFU3RydWN0dXJhbEZlYXR1cmUgc2YgPSBjb21tYW5kUGFyYW1ldGVyLmdldEVSZWZlcmVuY2UoKTsKIAkJaWYgKHNmID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJUb29saW5nSXRlbVByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKaW5kZXggMTFhMzY0MC4uOTY2MmEyMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYlRvb2xpbmdJdGVtUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKQEAgLTc4LDYgKzc4LDcgQEAKIAkgKiBUaGlzIGRvZXMgdGhlIGRlbGVnYXRlZCBqb2Igb2Ygc2V0dGluZyB0aGUgcHJvcGVydHkgdG8gdGhlIGdpdmVuIHZhbHVlLiBJdCBpcyBpbXBsZW1lbnRlZCBpbgogCSAqIGEgZ2VuZXJpYyB3YXkgdXNpbmcgdGhlIHN0cnVjdHVyYWwgZmVhdHVyZS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBvYmplY3QsIE9iamVjdCB2YWx1ZSkgewogCQlFT2JqZWN0IHJlZk9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7CiAJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IGdldEVkaXRpbmdEb21haW4ob2JqZWN0KTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViVHlwZUl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IGY5YzdjZDIuLjJkNjdlYzEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYlR5cGVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMTksNyArMTksNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47CkBAIC0yOCw3ICsyNyw3IEBACiAvKioKICAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2ViVHlwZX1vYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBXZWJUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIFdlYlR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewogCiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgpAQCAtNDAsNiArMzksNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB3ZWJfdHlwZS5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJ3ZWJfdHlwZSIpOy8vJE5PTi1OTFMtMSQKIAl9CkBAIC00Nyw2ICs0Nyw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC01Nyw2ICs1OCw3IEBACiAJCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlYlR5cGVfVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiV2ViVHlwZSIKIAl9CkBAIC02Nyw2ICs2OSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CiAJfQpAQCAtNzgsNiArODEsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIAl9CkBAIC04OCw2ICs5Miw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpAQCAtOTgsNiArMTAzLDcgQEAKIAkgKiB0byByZXR1cm4gdGhlIGVtcHR5IGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndAogCSAqIGJlIGFueSBjaGlsZHJlbiwgc28gdGhpcyBpcyBmYXN0ZXIuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggM2NlYmUwYi4uNTgzZDNmYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0yMTcsMTAgKzIxNywxMiBAQAogCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IGFkYXB0ZXJLZXkpIHsKIAkJcmV0dXJuIHN1cGVyLmFkYXB0KHRhcmdldCwgdGhpcyk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewogCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewogCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwpAQCAtMjMyLDYgKzIzNCw3IEBACiAJCXJldHVybiBudWxsOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IGFkYXB0ZXJUeXBlKSB7CiAJCUFkYXB0ZXIgYWRhcHRlciA9IHN1cGVyLmFkYXB0TmV3KHRhcmdldCwgYWRhcHRlclR5cGUpOwogCQlkaXNwb3NhYmxlLmFkZChhZGFwdGVyKTsKQEAgLTI1MCw2ICsyNTMsNyBAQAogCS8qKgogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5BdXRoQ29uc3RyYWludH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQXV0aENvbnN0cmFpbnRBZGFwdGVyKCkgewogCQlpZiAoYXV0aENvbnN0cmFpbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJYXV0aENvbnN0cmFpbnRJdGVtUHJvdmlkZXIgPSBuZXcgQXV0aENvbnN0cmFpbnRJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0yNjEsNiArMjY1LDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZXh0UGFyYW1BZGFwdGVyKCkgewogCQlpZiAoY29udGV4dFBhcmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCWNvbnRleHRQYXJhbUl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZXh0UGFyYW1JdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0yNzIsNiArMjc3LDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRXJyb3JDb2RlRXJyb3JQYWdlfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVFcnJvckNvZGVFcnJvclBhZ2VBZGFwdGVyKCkgewogCQlpZiAoZXJyb3JDb2RlRXJyb3JQYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCWVycm9yQ29kZUVycm9yUGFnZUl0ZW1Qcm92aWRlciA9IG5ldyBFcnJvckNvZGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0yODMsNiArMjg5LDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRXJyb3JQYWdlfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVFcnJvclBhZ2VBZGFwdGVyKCkgewogCQlpZiAoZXJyb3JQYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCWVycm9yUGFnZUl0ZW1Qcm92aWRlciA9IG5ldyBFcnJvclBhZ2VJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0yOTQsNiArMzAxLDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZX0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZUFkYXB0ZXIoKSB7CiAJCWlmIChleGNlcHRpb25UeXBlRXJyb3JQYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCWV4Y2VwdGlvblR5cGVFcnJvclBhZ2VJdGVtUHJvdmlkZXIgPSBuZXcgRXhjZXB0aW9uVHlwZUVycm9yUGFnZUl0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTMwNSw2ICszMTMsNyBAQAogCS8qKgogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5GaWx0ZXJ9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZpbHRlckFkYXB0ZXIoKSB7CiAJCWlmIChmaWx0ZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJZmlsdGVySXRlbVByb3ZpZGVyID0gbmV3IEZpbHRlckl0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTMyOCw2ICszMzcsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RBZGFwdGVyKCkgewogCQlpZiAobG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCWxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdEl0ZW1Qcm92aWRlciA9IG5ldyBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3RJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0zNTEsNiArMzYxLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdBZGFwdGVyKCkgewogCQlpZiAobG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJbG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgTG9jYWxFbmNvZGluZ01hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0zNjIsNiArMzczLDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZ30uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlRmlsdGVyTWFwcGluZ0FkYXB0ZXIoKSB7CiAJCWlmIChmaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCWZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTM3Myw2ICszODUsNyBAQAogCS8qKgogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWd9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZvcm1Mb2dpbkNvbmZpZ0FkYXB0ZXIoKSB7CiAJCWlmIChmb3JtTG9naW5Db25maWdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJZm9ybUxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyID0gbmV3IEZvcm1Mb2dpbkNvbmZpZ0l0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTM4NCw2ICszOTcsNyBAQAogCS8qKgogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5IVFRQTWV0aG9kVHlwZX0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlSFRUUE1ldGhvZFR5cGVBZGFwdGVyKCkgewogCQlpZiAoaFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJaFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgSFRUUE1ldGhvZFR5cGVJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0zOTUsNiArNDA5LDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCkgewogCQlpZiAoaW5pdFBhcmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCWluaXRQYXJhbUl0ZW1Qcm92aWRlciA9IG5ldyBJbml0UGFyYW1JdGVtUHJvdmlkZXIodGhpcyk7CkBAIC00MDYsNiArNDIxLDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTGlzdGVuZXJ9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpc3RlbmVyQWRhcHRlcigpIHsKIAkJaWYgKGxpc3RlbmVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCWxpc3RlbmVySXRlbVByb3ZpZGVyID0gbmV3IExpc3RlbmVySXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtNDE3LDYgKzQzMyw3IEBACiAJLyoqCiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLkpTUFR5cGV9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUpTUFR5cGVBZGFwdGVyKCkgewogCQlpZiAoalNQVHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQlqU1BUeXBlSXRlbVByb3ZpZGVyID0gbmV3IEpTUFR5cGVJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC00MzcsNiArNDU0LDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uTG9naW5Db25maWd9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxvZ2luQ29uZmlnQWRhcHRlcigpIHsKIAkJaWYgKGxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCWxvZ2luQ29uZmlnSXRlbVByb3ZpZGVyID0gbmV3IExvZ2luQ29uZmlnSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtNDQ4LDYgKzQ2Niw3IEBACiAJLyoqCiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLk1pbWVNYXBwaW5nfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaW1lTWFwcGluZ0FkYXB0ZXIoKSB7CiAJCWlmIChtaW1lTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQltaW1lTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBNaW1lTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTQ1OSw2ICs0NzgsNyBAQAogCS8qKgogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5Sb2xlTmFtZVR5cGV9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVOYW1lVHlwZUFkYXB0ZXIoKSB7CiAJCWlmIChyb2xlTmFtZVR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJcm9sZU5hbWVUeXBlSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVOYW1lVHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTQ3MCw2ICs0OTAsNyBAQAogCS8qKgogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnR9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3VyaXR5Q29uc3RyYWludEFkYXB0ZXIoKSB7CiAJCWlmIChzZWN1cml0eUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJc2VjdXJpdHlDb25zdHJhaW50SXRlbVByb3ZpZGVyID0gbmV3IFNlY3VyaXR5Q29uc3RyYWludEl0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTQ4MSw2ICs1MDIsNyBAQAogCS8qKgogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0fS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0QWRhcHRlcigpIHsKIAkJaWYgKHNlcnZsZXRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJc2VydmxldEl0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2bGV0SXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtNDkyLDYgKzUxNCw3IEBACiAJLyoqCiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRNYXBwaW5nfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2bGV0TWFwcGluZ0FkYXB0ZXIoKSB7CiAJCWlmIChzZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQlzZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2bGV0TWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTUwMyw2ICs1MjYsNyBAQAogCS8qKgogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0VHlwZX0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmxldFR5cGVBZGFwdGVyKCkgewogCQlpZiAoc2VydmxldFR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJc2VydmxldFR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgU2VydmxldFR5cGVJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC01MjMsNiArNTQ3LDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZ30uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2Vzc2lvbkNvbmZpZ0FkYXB0ZXIoKSB7CiAJCWlmIChzZXNzaW9uQ29uZmlnSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCXNlc3Npb25Db25maWdJdGVtUHJvdmlkZXIgPSBuZXcgU2Vzc2lvbkNvbmZpZ0l0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTUzNCw2ICs1NTksNyBAQAogCS8qKgogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWZ9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZkFkYXB0ZXIoKSB7CiAJCWlmICh0YWdMaWJSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJdGFnTGliUmVmSXRlbVByb3ZpZGVyID0gbmV3IFRhZ0xpYlJlZkl0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTU0NSw2ICs1NzEsNyBAQAogCS8qKgogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWZ9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhZ0xpYlJlZlR5cGVBZGFwdGVyKCkgewogCQlpZiAodGFnTGliUmVmVHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQl0YWdMaWJSZWZUeXBlSXRlbVByb3ZpZGVyID0gbmV3IFRhZ0xpYlJlZlR5cGVJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC01NTYsNiArNTgzLDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uVVJMUGF0dGVyblR5cGV9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVVSTFBhdHRlcm5UeXBlQWRhcHRlcigpIHsKIAkJaWYgKHVSTFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCXVSTFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyID0gbmV3IFVSTFBhdHRlcm5UeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtNTc2LDYgKzYwNCw3IEBACiAJLyoqCiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLlVzZXJEYXRhQ29uc3RyYWludH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlVXNlckRhdGFDb25zdHJhaW50QWRhcHRlcigpIHsKIAkJaWYgKHVzZXJEYXRhQ29uc3RyYWludEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQl1c2VyRGF0YUNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgPSBuZXcgVXNlckRhdGFDb25zdHJhaW50SXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtNTg3LDYgKzYxNiw3IEBACiAJLyoqCiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYkFwcH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViQXBwQWRhcHRlcigpIHsKIAkJaWYgKHdlYkFwcEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQl3ZWJBcHBJdGVtUHJvdmlkZXIgPSBuZXcgV2ViQXBwSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtNTk4LDYgKzYyOCw3IEBACiAJLyoqCiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbn0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uQWRhcHRlcigpIHsKIAkJaWYgKHdlYlJlc291cmNlQ29sbGVjdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQl3ZWJSZXNvdXJjZUNvbGxlY3Rpb25JdGVtUHJvdmlkZXIgPSBuZXcgV2ViUmVzb3VyY2VDb2xsZWN0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtNjA5LDYgKzY0MCw3IEBACiAJLyoqCiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlYlR5cGV9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlR5cGVBZGFwdGVyKCkgewogCQlpZiAod2ViVHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQl3ZWJUeXBlSXRlbVByb3ZpZGVyID0gbmV3IFdlYlR5cGVJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC02MjAsNiArNjUyLDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uV2VsY29tZUZpbGV9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlbGNvbWVGaWxlQWRhcHRlcigpIHsKIAkJaWYgKHdlbGNvbWVGaWxlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCXdlbGNvbWVGaWxlSXRlbVByb3ZpZGVyID0gbmV3IFdlbGNvbWVGaWxlSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtNjMxLDYgKzY2NCw3IEBACiAJLyoqCiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlV2VsY29tZUZpbGVMaXN0QWRhcHRlcigpIHsKIAkJaWYgKHdlbGNvbWVGaWxlTGlzdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQl3ZWxjb21lRmlsZUxpc3RJdGVtUHJvdmlkZXIgPSBuZXcgV2VsY29tZUZpbGVMaXN0SXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtNjUwLDYgKzY4NCw3IEBACiAJCXJldHVybiAocGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewogCQlyZXR1cm4gc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSB8fCBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2VsY29tZUZpbGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWxjb21lRmlsZUl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDdlYTMxYzcuLmJkMWZlZmQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWxjb21lRmlsZUl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWxjb21lRmlsZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwpAQCAtMzIsNyArMzEsNyBAQAogLyoqCiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlfW9iamVjdC4KICAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVGaWxlSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIFdlbGNvbWVGaWxlSXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViYXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTQ0LDYgKzQzLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgd2VsY29tZV9maWxlLmdpZi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoIndlbGNvbWVfZmlsZSIpOy8vJE5PTi1OTFMtMSQKIAl9CkBAIC01MSw2ICs1MSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBmaWxlTGlzdCBvZiB0aGUgV2VsY29tZUZpbGUuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gKChXZWxjb21lRmlsZSkgb2JqZWN0KS5nZXRGaWxlTGlzdCgpOwogCX0KQEAgLTU4LDYgKzU5LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKQEAgLTg3LDYgKzg5LDcgQEAKIAl9CiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCVdlbGNvbWVGaWxlIHdlbGNvbWVGaWxlID0gKFdlbGNvbWVGaWxlKSBvYmplY3Q7CiAJCVN0cmluZyBuYW1lID0gd2VsY29tZUZpbGUuZ2V0V2VsY29tZUZpbGUoKTsKQEAgLTEwMSw2ICsxMDQsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdlbGNvbWVGaWxlLmNsYXNzKSkgewogCQkJY2FzZSBXZWJhcHBsaWNhdGlvblBhY2thZ2UuV0VMQ09NRV9GSUxFX19XRUxDT01FX0ZJTEUgOiB7CkBAIC0xMTgsNiArMTIyLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAJfQpAQCAtMTI4LDYgKzEzMyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpAQCAtMTM4LDYgKzE0NCw3IEBACiAJICogdG8gcmV0dXJuIHRoZSBlbXB0eSBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QKIAkgKiBiZSBhbnkgY2hpbGRyZW4sIHNvIHRoaXMgaXMgZmFzdGVyLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWxjb21lRmlsZUxpc3RJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3Byb3ZpZGVycy9XZWxjb21lRmlsZUxpc3RJdGVtUHJvdmlkZXIuamF2YQppbmRleCA2ODkzZDA5Li4xNDg2ZmEwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJlZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9wcm92aWRlcnMvV2VsY29tZUZpbGVMaXN0SXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2ViZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvcHJvdmlkZXJzL1dlbGNvbWVGaWxlTGlzdEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0xOCwxMCArMTgsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47CkBAIC0zNSw3ICszNiw3IEBACiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdH0KICAqIG9iamVjdC4KICAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVGaWxlTGlzdEl0ZW1Qcm92aWRlciBleHRlbmRzIFdlYmFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKK3B1YmxpYyBjbGFzcyBXZWxjb21lRmlsZUxpc3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXZWJhcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewogCiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgpAQCAtNTAsNiArNTEsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKQEAgLTYxLDYgKzYzLDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYSBuZXcgY2hpbGQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJhcHBsaWNhdGlvbi5jb21tYW5kQ3JlYXRlQ2hpbGRDb21tYW5kfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGNyZWF0ZUNoaWxkKE9iamVjdCBvYmplY3QpIHsKIAkJLy8gVE9ETzogY2hlY2sgdGhhdCB0aGlzIGlzIHdoYXQgeW91IHdhbnQuCiAJCVdlbGNvbWVGaWxlIGNoaWxkID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWxjb21lRmlsZSgpOwpAQCAtNzQsNiArNzcsNyBAQAogCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQge0BsaW5rIEFkZENvbW1hbmR9YW5kCiAJICoge0BsaW5rIFJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWxjb21lRmlsZUxpc3RfRmlsZSgpKTsKIAl9CkBAIC04MSw2ICs4NSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBpbWFnZSBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYmFwcGxpY2F0aW9uLmNvbW1hbmRDcmVhdGVDaGlsZENvbW1hbmR9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCUVPYmplY3QgcmVmT2JqZWN0ID0gKEVPYmplY3QpIG9iamVjdDsKIAkJcmV0dXJuIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UocmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKSArICJDcmVhdGVXZWxjb21lRmlsZSIpOy8vJE5PTi1OTFMtMSQKQEAgLTg5LDYgKzk0LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkNyZWF0ZV9XZWxjb21lRmlsZV9VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgV2VsY29tZUZpbGUiCiAJfQpAQCAtOTcsNiArMTAzLDcgQEAKIAkgKiBUaGlzIHJldHVybnMgdGhlIGhlbHAgdGV4dCBmb3IKIAkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2ViYXBwbGljYXRpb24uY29tbWFuZENyZWF0ZUNoaWxkQ29tbWFuZH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRvb2xUaXBUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJRU9iamVjdCByZWZPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIjQyY29uY2F0X1VJXyIsIChuZXcgT2JqZWN0W117cmVmT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJCA9ICJDcmVhdGUgYSBjaGlsZCBvZiB0eXBlIFdlbGNvbWVGaWxlIGZvciB0aGUgc2VsZWN0ZWQgezB9LiIKQEAgLTEwNSw2ICsxMTIsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB3ZWxjb21lX2xpc3QuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgid2VsY29tZV9saXN0Iik7Ly8kTk9OLU5MUy0xJAogCX0KQEAgLTExMiwxMCArMTIwLDEyIEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSB3ZWJBcHAgb2YgdGhlIFdlbGNvbWVGaWxlTGlzdC4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKFdlbGNvbWVGaWxlTGlzdCkgb2JqZWN0KS5nZXRXZWJBcHAoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIldlbGNvbWVfRmlsZV9MaXN0X1VJXyIpOyAvLyROT04tTkxTLTEkID0gIldlbGNvbWUgRmlsZSBMaXN0IgogCX0KQEAgLTEyNiw2ICsxMzYsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdlbGNvbWVGaWxlTGlzdC5jbGFzcykpIHsKIAkJCWNhc2UgV2ViYXBwbGljYXRpb25QYWNrYWdlLldFTENPTUVfRklMRV9MSVNUX19GSUxFIDogewpAQCAtMTQzLDYgKzE1NCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCkBAIC0xNTUsNiArMTY3LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCmluZGV4IGE3NDliNjguLjg1MjI4YzIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0xMyw3ICsxMyw5IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5KYXZhRUVDb21wb25lbnRFeHBvcnRPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklXZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKQEAgLTI0LDE2ICsyNiwxOSBAQAogCQlzdXBlcigpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgV2ViQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uKG1vZGVsKTsKKwkJcmV0dXJuIG5ldyBKYXZhRUVDb21wb25lbnRFeHBvcnRPcGVyYXRpb24obW9kZWwpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKIAkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CiAJCXByb3BlcnR5TmFtZXMuYWRkKEVYQ0xVREVfQ09NUElMRV9KU1ApOwogCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCWlmIChFWENMVURFX0NPTVBJTEVfSlNQLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CiAJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKQEAgLTQxLDE2ICs0NiwxOSBAQAogCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0VHlwZSgpIHsKIAkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0V3JvbmdDb21wb25lbnRUeXBlU3RyaW5nKFN0cmluZyBwcm9qZWN0TmFtZSkgewogCQlyZXR1cm4gRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLk5PVF9BX1dBUiwgbmV3IE9iamVjdFtde3Byb2plY3ROYW1lfSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiLndhciI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIElKMkVFTW9kdWxlQ29uc3RhbnRzLldBUl9FWFQ7CiAJfQogCS8qKgogCSAqIEV4cG9ydHMgdGhlIHNwZWNpZmllZCBXZWIgTW9kdWxlIHByb2plY3QgdG8gdGhlIHNwZWNpZmllZCBXQVIgZmlsZS4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YQppbmRleCAxMzYxNjdhLi5jYzc3ZTg0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbi5qYXZhCkBAIC0xMCwyMyArMTAsMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zOwogCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuSmF2YUVFQXJjaGl2ZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuQXBwQ2xpZW50QXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuSjJFRUFydGlmYWN0RXhwb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKIAorLyoqCisgKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkphdmFFRUNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbiBpbnN0ZWFkCisgKi8KIHB1YmxpYyBjbGFzcyBXZWJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24gZXh0ZW5kcyBKMkVFQXJ0aWZhY3RFeHBvcnRPcGVyYXRpb24gewogCiAJcHVibGljIFdlYkNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbigpIHsKQEAgLTM3LDM4ICsyNiw0IEBACiAJCXN1cGVyKG1vZGVsKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBleHBvcnQoKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIEVYUE9SVF9XT1JLKTsKLQkJSUFyY2hpdmUgYXJjaGl2ZUZyb21Db21wb25lbnQgPSBudWxsOwotCQl0cnkgewotCQkJYXJjaGl2ZUZyb21Db21wb25lbnQgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLm9wZW5BcmNoaXZlKGdldENvbXBvbmVudCgpKTsKLQkJCUphdmFFRVF1aWNrUGVlayBxdWlja1BlZWsgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmdldEphdmFFRVF1aWNrUGVlayhhcmNoaXZlRnJvbUNvbXBvbmVudCk7Ci0JCQlpZiAocXVpY2tQZWVrLmdldEphdmFFRVZlcnNpb24oKSA9PSBKMkVFQ29uc3RhbnRzLkpFRV81XzBfSUQpIHsKLQkJCQlzYXZlQXJjaGl2ZShhcmNoaXZlRnJvbUNvbXBvbmVudCwgZ2V0RGVzdGluYXRpb25QYXRoKCkudG9PU1N0cmluZygpLCBzdWJNb25pdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQ29tbW9uYXJjaGl2ZUZhY3RvcnkgY2FmID0gKChDb21tb25hcmNoaXZlUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZU5TX1VSSSkpLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0JCQkJV2ViQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCBscyA9IG5ldyBXZWJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKGdldENvbXBvbmVudCgpKTsKLQkJCQlscy5zZXRFeHBvcnRTb3VyY2UoaXNFeHBvcnRTb3VyY2UoKSk7Ci0JCQkJbHMuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJc2V0TW9kdWxlRmlsZShjYWYub3BlbldBUkZpbGUobHMsIGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSkpOwotCQkJCWdldE1vZHVsZUZpbGUoKS5nZXRPcHRpb25zKCkuc2V0SXNSZWFkT25seSh0cnVlKTsKLQkJCQlscy5zZXRQcm9ncmVzc01vbml0b3Ioc3ViTW9uaXRvcik7Ci0JCQkJZ2V0TW9kdWxlRmlsZSgpLnNhdmVBc05vUmVvcGVuKGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFNhdmVGYWlsdXJlRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBleDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihBcHBDbGllbnRBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLkFSQ0hJVkVfT1BFUkFUSU9OX09wZW5pbmdBcmNoaXZlLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChhcmNoaXZlRnJvbUNvbXBvbmVudCAhPSBudWxsKQotCQkJCUphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuY2xvc2VBcmNoaXZlKGFyY2hpdmVGcm9tQ29tcG9uZW50KTsKLQotCQkJc3ViTW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGFyY2hpdmVTdHJpbmcoKSB7Ci0JCXJldHVybiAiV2FyIEZpbGUiOwotCX0KLQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCBhYmQyNmQzLi5mMTlkNDFiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMTYsMTEgKzE2LDEwIEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5KMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5KMkVFVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRVV0aWxpdHlKYXJJbXBvcnRPcGVyYXRpb25OZXc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7CkBAIC0zMyw2ICszMiw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuZGF0YW1vZGVsLnByb3BlcnRpZXMuSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuV2ViRnJhZ21lbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7CkBAIC01Myw2ICs1Myw3IEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKIAorCUBPdmVycmlkZQogCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKIAkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CiAJCXByb3BlcnR5TmFtZXMuYWRkKFdFQl9MSUJfTU9ERUxTKTsKQEAgLTYxLDYgKzYyLDcgQEAKIAkJcmV0dXJuIHByb3BlcnR5TmFtZXM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhXRUJfTElCX01PREVMUykgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhXRUJfTElCX0FSQ0hJVkVTX1NFTEVDVEVEKSkgewogCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CkBAIC02OCwxNCArNzAsMTYgQEAKIAkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBpbnQgZ2V0VHlwZSgpIHsKIAkJcmV0dXJuIFhNTFJlc291cmNlLldFQl9BUFBfVFlQRTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgaGFuZGxlVW5rbm93blR5cGUoSmF2YUVFUXVpY2tQZWVrIGpxcCkgewogCQlqcXAuc2V0VHlwZShKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRSk7Ci0JCWpxcC5zZXRWZXJzaW9uKEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzVfSUQpOwotCQlqcXAuc2V0SmF2YUVFVmVyc2lvbihKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEKTsKKwkJanFwLnNldFZlcnNpb24oSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzNfMF9JRCk7CisJCWpxcC5zZXRKYXZhRUVWZXJzaW9uKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQpOwogCX0KIAogCkBAIC04NywyMCArOTEsMTIgQEAKIAkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIlRlbXAgU3RyaW5nIGZvciBub25lIFdBUkZpbGUiKSk7IC8vJE5PTi1OTFMtMSQpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7CiAJCXN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7CiAJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEFSQ0hJVkVfV1JBUFBFUikpIHsKLQkJCQotCQkJSURhdGFNb2RlbCBtb2R1bGVETSA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTik7CiAJCQlpZiAoZ2V0QXJjaGl2ZVdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBtb2R1bGVETS5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0JCQkJSURhdGFNb2RlbCB3ZWJGYWNldERhdGFNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbCggSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUIgKTsKLQkJCQkKLQkJCQlpbnQgdmVyc2lvbiA9IGdldE1vZHVsZVNwZWNWZXJzaW9uKCk7Ci0JCQkJU3RyaW5nIHZlcnNpb25UZXh0ID0gSjJFRVZlcnNpb25VdGlsLmdldFNlcnZsZXRUZXh0VmVyc2lvbiggdmVyc2lvbiApOwotCQkJCXdlYkZhY2V0RGF0YU1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIHZlcnNpb25UZXh0KTsKLQkJCQl1cGRhdGVKYXZhRmFjZXRWZXJzaW9uKCk7CisJCQkJcmVmcmVzaEludGVycHJldGVkU3BlY1ZlcnNpb24oKTsKIAkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7CiAJCQl9CQkJCiAJCQkKQEAgLTEwOCw5ICsxMDQsMzIgQEAKIAkJCWlmIChudWxsICE9IGFyY2hpdmVXcmFwcGVyKSB7CiAJCQkJTGlzdCA8QXJjaGl2ZVdyYXBwZXI+IGxpYnMgPSBhcmNoaXZlV3JhcHBlci5nZXRXZWJMaWJzKCk7CiAJCQkJTGlzdCBuZXN0ZWRNb2RlbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlEYXRhTW9kZWwgbG9jYWxNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKMkVFVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCQlsb2NhbE1vZGVsLnNldFByb3BlcnR5KEFSQ0hJVkVfV1JBUFBFUiwgbGlicy5nZXQoaSkpOworCQkJCWZvciAoQXJjaGl2ZVdyYXBwZXIgbGliV3JhcHBlciA6IGxpYnMpIHsKKwkJCQkJSURhdGFNb2RlbCBsb2NhbE1vZGVsID0gbnVsbDsKKwkJCQkJSmF2YUVFUXVpY2tQZWVrIGpxcCA9IGxpYldyYXBwZXIuZ2V0SmF2YUVFUXVpY2tQZWVrKCk7CisJCQkJCWlmKGpxcC5nZXRUeXBlKCkgPT0gSmF2YUVFUXVpY2tQZWVrLldFQkZSQUdNRU5UX1RZUEUpeworCQkJCQkJbG9jYWxNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKMkVFQXJ0aWZhY3RJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpeworCisJCQkJCQkJQE92ZXJyaWRlCisJCQkJCQkJcHJvdGVjdGVkIElEYXRhTW9kZWwgY3JlYXRlSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsKCkgeworCQkJCQkJCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFdlYkZyYWdtZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJQE92ZXJyaWRlCisJCQkJCQkJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKKwkJCQkJCQkJcmV0dXJuIG5ldyBKMkVFVXRpbGl0eUphckltcG9ydE9wZXJhdGlvbk5ldyhtb2RlbCk7CisJCQkJCQkJfQorCisJCQkJCQkJQE92ZXJyaWRlCisJCQkJCQkJcHJvdGVjdGVkIGludCBnZXRUeXBlKCkgeworCQkJCQkJCQlyZXR1cm4gMDsKKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQl9KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxvY2FsTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSjJFRVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKKwkJCQkJfQorCQkJCQlsb2NhbE1vZGVsLnNldFByb3BlcnR5KEFSQ0hJVkVfV1JBUFBFUiwgbGliV3JhcHBlcik7CiAJCQkJCWxvY2FsTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FLCBnZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpKTsKIAkJCQkJSURhdGFNb2RlbCBmYWNldERhdGFNb2RlbCA9IGxvY2FsTW9kZWwuZ2V0TmVzdGVkTW9kZWwoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTik7CiAJCQkJCWZhY2V0RGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCBmYWxzZSk7CkBAIC0xMzAsNiArMTQ5LDE4IEBACiAJfQogCQogCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hJbnRlcnByZXRlZFNwZWNWZXJzaW9uKCkgeworCQlJRGF0YU1vZGVsIG1vZHVsZURNID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKTsKKwkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBtb2R1bGVETS5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7CisJCUlEYXRhTW9kZWwgd2ViRmFjZXREYXRhTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCICk7CisJCWludCB2ZXJzaW9uID0gZ2V0SW50ZXJwcmV0ZWRTcGVjVmVyc2lvbihnZXRBcmNoaXZlV3JhcHBlcigpKS5nZXRWZXJzaW9uKCk7CisJCVN0cmluZyB2ZXJzaW9uVGV4dCA9IEoyRUVWZXJzaW9uVXRpbC5nZXRTZXJ2bGV0VGV4dFZlcnNpb24oIHZlcnNpb24gKTsKKwkJd2ViRmFjZXREYXRhTW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgdmVyc2lvblRleHQpOworCQl1cGRhdGVXb3JraW5nQ29weUZhY2V0VmVyc2lvbihtb2R1bGVETSwgd2ViRmFjZXREYXRhTW9kZWwpOworCQl1cGRhdGVKYXZhRmFjZXRWZXJzaW9uKCk7CisJfQorCQorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYoRkFDRVRfUlVOVElNRS5lcXVhbHMocHJvcGVydHlOYW1lKSl7CiAJCQlzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwpAQCAtMTU0LDE5ICsxODUsMTcgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAJCi0JcHJvdGVjdGVkIEFyY2hpdmUgb3BlbkFyY2hpdmUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJQXJjaGl2ZSBhcmNoaXZlID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnkuZUlOU1RBTkNFLm9wZW5XQVJGaWxlKGdldEFyY2hpdmVPcHRpb25zKCksIHVyaSk7Ci0JCXJldHVybiBhcmNoaXZlOwotCX0KLQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBJRGF0YU1vZGVsIGNyZWF0ZUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpIHsKIAkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7CiAJCXJldHVybiBuZXcgV2ViQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uKG1vZGVsKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBpbml0KCkgewogCQlzdXBlci5pbml0KCk7CiAJCUlEYXRhTW9kZWwgY29tcG9uZW50Q3JlYXRpb25ETSA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTik7CkBAIC0xNzUsNiArMjA0LDcgQEAKIAkJd2ViRmFjZXQuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5HRU5FUkFURV9ERCwgZmFsc2UpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKIAkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKIAkJaWYgKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpICYmIGV2ZW50LmdldERhdGFNb2RlbCgpID09IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTikpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRJbXBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRJbXBvcnRPcGVyYXRpb24uamF2YQppbmRleCBiYmQ0NWFiLi40OWRmMDY3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudEltcG9ydE9wZXJhdGlvbi5qYXZhCkBAIC0yMSwxMyArMjEsMTIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVXcmFwcGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuV2ViQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5KMkVFQXJ0aWZhY3RJbXBvcnRPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7CkBAIC00OCw2ICs0Nyw3IEBACiAJcHJvdGVjdGVkIGZpbmFsIGludCBMSU5LX0NPTVBPTkVOVFNfV09SSyA9IDEwOwogCXByb3RlY3RlZCBmaW5hbCBpbnQgTElCX0ZPTERFUl9XT1JLID0gMjsKIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgaW50IGNvbXB1dGVUb3RhbFdvcmsoKSB7CiAJCWludCBiYXNlV29yayA9IHN1cGVyLmNvbXB1dGVUb3RhbFdvcmsoKSArIExJQl9GT0xERVJfV09SSzsKIAkJTGlzdCBzZWxlY3RlZExpYnMgPSAoTGlzdCkgbW9kZWwuZ2V0UHJvcGVydHkoSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCk7CkBAIC02NSw2ICs2NSw3IEBACiAJCXJldHVybiBiYXNlV29yazsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCXN1cGVyLmRvRXhlY3V0ZShtb25pdG9yKTsKIAkJSVZpcnR1YWxGb2xkZXIgbGliRm9sZGVyID0gdmlydHVhbENvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0Rm9sZGVyKFdlYkFydGlmYWN0RWRpdC5XRUJMSUIpOwpAQCAtNzIsNyArNzMsNyBAQAogCQkJdHJ5IHsKIAkJCQlsaWJGb2xkZXIuY3JlYXRlKElSZXNvdXJjZS5GT1JDRSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBMSUJfRk9MREVSX1dPUkspKTsKIAkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQlXZWJQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQltb25pdG9yLndvcmtlZChMSUJfRk9MREVSX1dPUkspOwpAQCAtODAsOSArODEsOSBAQAogCQl0cnkgewogCQkJaW1wb3J0V2ViTGlicmFyeVByb2plY3RzKG1vbml0b3IpOwogCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCVdlYlBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJV2ViUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9CiAJfQogCkBAIC05OSw3ICsxMDAsNyBAQAogCQlMaXN0IHRhcmdldENvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCU1hcCBjb21wVG9VUklNYXAgPSBuZXcgSGFzaE1hcCgpOwogCQlmb3IgKGludCBpID0gMDsgbnVsbCAhPSBsaWJQcm9qZWN0cyAmJiBpIDwgbGliUHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCWltcG9ydE1vZGVsID0gKElEYXRhTW9kZWwpIGxpYlByb2plY3RzLmdldChpKTsKKwkJCWltcG9ydE1vZGVsID0gbGliUHJvamVjdHMuZ2V0KGkpOwogCQkJbGliQXJjaGl2ZSA9IChBcmNoaXZlV3JhcHBlcikgaW1wb3J0TW9kZWwuZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUik7CiAJCQlpZiAoc2VsZWN0ZWRMaWJzVW5kZXJseWluZ0FyY2hpdmVzLmNvbnRhaW5zKGxpYkFyY2hpdmUuZ2V0VW5kZXJMeWluZ0FyY2hpdmUoKSkpIHsKIAkJCQlpbXBvcnRNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIFBST0pFQ1RfQ1JFQVRJT05fV09SSyArIGxpYkFyY2hpdmUuZ2V0U2l6ZSgpKSAsIGluZm8pOwpAQCAtMTIzLDEwICsxMjQsNyBAQAogCQl9CiAJfQogCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVTYXZlU3RyYXRlZ3koSVZpcnR1YWxDb21wb25lbnQgYVZpcnR1YWxDb21wb25lbnQpIHsKLQkJcmV0dXJuIG5ldyBXZWJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKGFWaXJ0dWFsQ29tcG9uZW50KTsKLQl9Ci0KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIGdldEFyY2hpdmVTYXZlQWRhcHRlcigKIAkJCUlWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQpIHsKIAkJcmV0dXJuIG5ldyBXZWJDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIodmlydHVhbENvbXBvbmVudCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YQppbmRleCAxYWM0N2ViLi5hMGFkZmRhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKQEAgLTEzLDE5ICsxMywxOSBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSUoyRUVNb2R1bGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuV2ViVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7CiAKQEAgLTM5LDYgKzM5LDcgQEAKIAkJc3VwZXIodkNvbXBvbmVudCwgaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldEZpbGVzKCkgewogCQlzdXBlci5nZXRGaWxlcygpOwogCQlhZGRMb29zZUxpYkpBUnNUb0ZpbGVzKCk7CkBAIC01OCwxMiArNTksNyBAQAogCQkJSVZpcnR1YWxSZWZlcmVuY2UgaUxpYk1vZHVsZSA9IGxpYk1vZHVsZXNbaV07CiAJCQlJVmlydHVhbENvbXBvbmVudCBsb29zZUNvbXBvbmVudCA9IGlMaWJNb2R1bGUuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwogCQkJaWYgKGxvb3NlQ29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBhcmNoaXZlQ29tcCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgbG9vc2VDb21wb25lbnQ7Ci0JCQkJamF2YS5pby5GaWxlIGRpc2tGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7Ci0JCQkJaWYgKCFkaXNrRmlsZS5leGlzdHMoKSkgewotCQkJCQlJRmlsZSB3YkZpbGUgPSBhcmNoaXZlQ29tcC5nZXRVbmRlcmx5aW5nV29ya2JlbmNoRmlsZSgpOwotCQkJCQlkaXNrRmlsZSA9IG5ldyBGaWxlKHdiRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJfQorCQkJCWphdmEuaW8uRmlsZSBkaXNrRmlsZSA9IChqYXZhLmlvLkZpbGUpbG9vc2VDb21wb25lbnQuZ2V0QWRhcHRlcihqYXZhLmlvLkZpbGUuY2xhc3MpOwogCQkJCVN0cmluZyB1cmkgPSBpTGliTW9kdWxlLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKSArICIvIiArIGRpc2tGaWxlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAogCQkJCWFkZEV4dGVybmFsRmlsZSh1cmksIGRpc2tGaWxlKTsJCQkJCiAJCQl9IGVsc2UgewpAQCAtNzIsNyArNjgsNyBAQAogCQkJCWlmIChhcmNoaXZlTmFtZSAhPSBudWxsICYmIGFyY2hpdmVOYW1lLmxlbmd0aCgpID4gMCkgewogCQkJCQluYW1lID0gYXJjaGl2ZU5hbWU7CiAJCQkJfSBlbHNlIHsKLQkJCQkJbmFtZSA9IGxvb3NlQ29tcG9uZW50LmdldE5hbWUoKSArICIuamFyIjsgLy8kTk9OLU5MUy0xJAorCQkJCQluYW1lID0gbG9vc2VDb21wb25lbnQuZ2V0TmFtZSgpICsgSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVDsKIAkJCQl9CiAJCQkJU3RyaW5nIHByZWZpeCA9IGlMaWJNb2R1bGUuZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwogCQkJCWlmIChwcmVmaXgubGVuZ3RoKCkgPiAwICYmIHByZWZpeC5jaGFyQXQocHJlZml4Lmxlbmd0aCgpIC0gMSkhPSAnLycpIHsKQEAgLTg4LDEyICs4NCwxMyBAQAogCQkJCQkJY29udGludWU7CiAJCQkJCWZpbGVzSG9sZGVyLmFkZEZpbGUodXRpbEpBUik7CiAJCQkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gb2UpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuVU5BQkxFX1RPX0xPQURfTU9EVUxFX0VSUk9SXywgbmV3IE9iamVjdFtde3VyaSwgZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgb2UuZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKX0pOyAvLyROT04tTkxTLTEkCi0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nVHJhY2UobWVzc2FnZSk7CisJCQkJCVN0cmluZyBtZXNzYWdlID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlVOQUJMRV9UT19MT0FEX01PRFVMRV9FUlJPUl8sIG5ldyBPYmplY3RbXXt1cmksIGdldENvbXBvbmVudCgpLmdldFByb2plY3QoKS5nZXROYW1lKCksIG9lLmdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCl9KTsgCisJCQkJCVdlYlBsdWdpbi5sb2dFcnJvcihtZXNzYWdlKTsKIAkJCQl9CiAJCQl9CiAJCX0KIAl9CisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHN5bmNocm9uaXplZCBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpIHsKIAkJaWYoYXJ0aWZhY3RFZGl0ID09IG51bGwpewogCQkJYXJ0aWZhY3RFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQodkNvbXBvbmVudCk7CkBAIC0xMTAsMTUgKzEwNywxMCBAQAogCQkJCWZpbmFsIElQYXRoIHJ1bnRpbWVQYXRoID0gcmVmLmdldFJ1bnRpbWVQYXRoKCk7CiAJCQkJCiAJCQkJLy8gb25seSBwcm9jZXNzIC4uLyBtYXBwaW5ncwotCQkJCWlmIChyZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpIGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQKKwkJCQlpZiAocmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5pc0JpbmFyeSgpCiAJCQkJCQkmJiBydW50aW1lUGF0aC5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSX1BBVEgpKSB7Ci0JCQkJCWZpbmFsIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGNvbXAgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCUZpbGUgY3BFbnRyeUZpbGUgPSBjb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQkJCQlpZiAoIWNwRW50cnlGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlmaW5hbCBJRmlsZSB3YkZpbGUgPSBjb21wLmdldFVuZGVybHlpbmdXb3JrYmVuY2hGaWxlKCk7Ci0JCQkJCQljcEVudHJ5RmlsZSA9IG5ldyBGaWxlKHdiRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQkJYWRkRXh0ZXJuYWxGaWxlKCJXRUItSU5GL2xpYi8iICsgcmVmLmdldEFyY2hpdmVOYW1lKCksIGNwRW50cnlGaWxlKTsKKwkJCQkJRmlsZSBjcEVudHJ5RmlsZSA9IChqYXZhLmlvLkZpbGUpcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRBZGFwdGVyKGphdmEuaW8uRmlsZS5jbGFzcyk7CisJCQkJCWFkZEV4dGVybmFsRmlsZSgiV0VCLUlORi9saWIvIiArIHJlZi5nZXRBcmNoaXZlTmFtZSgpLCBjcEVudHJ5RmlsZSk7IC8vJE5PTi1OTFMtMSQKIAkJCQl9CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IDNhNzJhMTguLmZjMTQ0ZDAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQpAQCAtMjYsNiArMjYsMTIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwogCisvKioKKyAqIEBkZXByZWNhdGVkIHRoaXMgd2lsbCBiZSBkZWxldGVkIHBvc3QgV1RQIDMuMi4gIFRoaXMgY29kZSBpcyBubyBsb25nZXIKKyAqIGNhbGxlZCBiZWNhdXNlIHRoZSBJQXJjaGl2ZSBBUEkgaXMgdXNlZCB0byBoYW5kbGUgaW1wb3J0cy4KKyAqIAorICogQGF1dGhvciBqc2hvbGwKKyAqLwogcHVibGljIGNsYXNzIFdlYkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgZXh0ZW5kcyBKMkVFQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCB7CiAKIAlwdWJsaWMgV2ViQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbChJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50KSB7CkBAIC00MywxOSArNDksMjMgQEAKIAkJcmV0dXJuICFzaG91bGRMaW5rQXNDb21wb25lbnRSZWYoYXJjaGl2ZSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQWRkSW1wb3J0ZWRDbGFzc2VzVG9DbGFzc3BhdGgoKSB7CiAJCXJldHVybiBmYWxzZTsgLy8gbmV2ZXIgYWRkIHRvIGNsYXNzcGF0aCBiZWNhdXNlIHRoZSB3ZWIgYXBwIGNvbnRhaW5lciB3aWxsIHBpY2sgdGhpcyB1cC4KIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgU3RyaW5nIGdldEltcG9ydGVkQ2xhc3Nlc1VSSShGaWxlIGFGaWxlKSB7CiAJCVN0cmluZyB1cmkgPSBhRmlsZS5nZXRVUkkoKTsKIAkJcmV0dXJuIFdUUHJvamVjdFN0cmF0ZWd5VXRpbHMubWFrZVJlbGF0aXZlKHVyaSwgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBJUGF0aCBnZXRJbXBvcnRlZENsYXNzZXNSdW50aW1lUGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBQYXRoKCIvIiArIEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJKTsKKwkJcmV0dXJuIG5ldyBQYXRoKCIvIiArIEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBJUGF0aCBnZXRPdXRwdXRQYXRoRm9yRmlsZShGaWxlIGFGaWxlKSB7CiAJCWlmIChudWxsICE9IG5vblN0YW5kYXJkU291cmNlRmlsZXMgJiYgbm9uU3RhbmRhcmRTb3VyY2VGaWxlcy5jb250YWluc0tleShhRmlsZSkpIHsKIAkJCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSB2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKQEAgLTcyLDYgKzgyLDcgQEAKIAkgKi8KIAlwcm90ZWN0ZWQgTWFwIG5vblN0YW5kYXJkU291cmNlRmlsZXM7CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NsYXNzV2l0aG91dFNvdXJjZShGaWxlIGFGaWxlKSB7CiAJCVN0cmluZyBqYXZhVXJpID0gQXJjaGl2ZVV0aWwuY2xhc3NVcmlUb0phdmFVcmkoYUZpbGUuZ2V0VVJJKCkpOwogCQlpZiAoamF2YVVyaSA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2FyY2hpdmUvb3BlcmF0aW9ucy9XZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggYWM1YmYxMC4uNzQxYTdmOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvYXJjaGl2ZS9vcGVyYXRpb25zL1dlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9hcmNoaXZlL29wZXJhdGlvbnMvV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiAJCXN1cGVyKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgaW5pdCgpIHsKIAkJc3VwZXIuaW5pdCgpOwogICAgICAgICAKQEAgLTQ0LDcgKzQ1LDcgQEAKICAgICAgICAgRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBnZXRQcm9wZXJ0eShGQUNFVF9ETV9NQVApOwogICAgICAgICBJRGF0YU1vZGVsIGphdmFGYWNldCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbCggSmF2YUZhY2V0VXRpbHMuSkFWQV9GQUNFVC5nZXRJZCgpICk7CiAJCUlEYXRhTW9kZWwgd2ViRmFjZXQgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoIElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfRkFDRVQuZ2V0SWQoKSApOwotCQlTdHJpbmcgd2ViUm9vdCA9IHdlYkZhY2V0LmdldFN0cmluZ1Byb3BlcnR5KElXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTkZJR19GT0xERVIpOworCQkvL1N0cmluZyB3ZWJSb290ID0gd2ViRmFjZXQuZ2V0U3RyaW5nUHJvcGVydHkoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUik7CiAJCVN0cmluZyB3ZWJTcmMgPSB3ZWJGYWNldC5nZXRTdHJpbmdQcm9wZXJ0eShJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSKTsKIAkJamF2YUZhY2V0LnNldFByb3BlcnR5KElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSX05BTUUsIHdlYlNyYyk7CiAJCWphdmFGYWNldC5zZXRQcm9wZXJ0eShJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuREVGQVVMVF9PVVRQVVRfRk9MREVSX05BTUUsCkBAIC02NCw2ICs2NSw3IEBACiAJCX0pOwkKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewogCQlpZiggcHJvcGVydHlOYW1lLmVxdWFscyggTU9EVUxFX1VSSSApKXsKIAkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgZ2V0UHJvcGVydHkoRkFDRVRfRE1fTUFQKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2NsYXNzcGF0aC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2NsYXNzcGF0aC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXIuamF2YQppbmRleCA5ZTNiYmRmLi5lNDk5Y2ZkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9jbGFzc3BhdGgvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvY2xhc3NwYXRoL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lci5qYXZhCkBAIC0xMSwyMCArMTEsMzAgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY2xhc3NwYXRoOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS5DbGFzc3BhdGhDb250YWluZXJWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmNsYXNzcGF0aC5GbGV4aWJsZVByb2plY3RDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLklEZXBlbmRlbmN5R3JhcGg7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKQEAgLTM4LDIwICs0OCw0MSBAQAogICAgIGV4dGVuZHMgRmxleGlibGVQcm9qZWN0Q29udGFpbmVyCiAgICAgCiB7CisJcHJpdmF0ZSBXZWJBcHBMaWJyYXJpZXNTdG9yZS5SZXN0b3JlU3RhdGUgcmVzdG9yZVN0YXRlOworCQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoW10gcGF0aHMgCi0gICAgICAgID0gbmV3IElQYXRoW10geyBuZXcgUGF0aCggIldFQi1JTkYvbGliIiApLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXRoKCAiV0VCLUlORi9jbGFzc2VzIiApIH07CisgICAgICAgID0gbmV3IElQYXRoW10geyBuZXcgUGF0aCggIldFQi1JTkYvbGliIiApLCAgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhdGgoICJXRUItSU5GL2NsYXNzZXMiICkgfTsgLy8kTk9OLU5MUy0xJAogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdGhUeXBlW10gdHlwZXMgCiAgICAgICAgID0gbmV3IFBhdGhUeXBlW10geyBQYXRoVHlwZS5MSUJfRElSRUNUT1JZLCBQYXRoVHlwZS5DTEFTU0VTX0RJUkVDVE9SWSB9OwogICAgIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRBSU5FUl9JRCAKLSAgICAgICAgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmNvbnRhaW5lciI7CisgICAgICAgID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5jb250YWluZXIiOyAvLyROT04tTkxTLTEkCiAgICAgCiAgICAgcHVibGljIFdlYkFwcExpYnJhcmllc0NvbnRhaW5lciggZmluYWwgSVBhdGggcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QganByb2plY3QgKQogICAgIHsKICAgICAgICAgIHN1cGVyKCBwYXRoLCBqcHJvamVjdCwgZ2V0UHJvamVjdCggcGF0aCwganByb2plY3QpLCBwYXRocywgdHlwZXMgKTsKKyAgICAgICAgIGJvb2xlYW4gbmVlZFRvVmVyaWZ5ID0gZmFsc2U7CisJCSBpZihudWxsICE9IHJlc3RvcmVTdGF0ZSl7CisJCQkgc3luY2hyb25pemVkIChyZXN0b3JlU3RhdGUpIHsKKwkJCQkgbmVlZFRvVmVyaWZ5ID0gcmVzdG9yZVN0YXRlLm5lZWRUb1ZlcmlmeTsKKwkJCQkgcmVzdG9yZVN0YXRlLm5lZWRUb1ZlcmlmeSA9IGZhbHNlOworCQkJIH0KKwkJIH0KKyAgICAgICAgIGlmKG5lZWRUb1ZlcmlmeSl7CisgICAgICAgIAkgSm9iIHZlcmlmeUpvYiA9IG5ldyBKb2IoUmVzb3VyY2VzLnZlcmlmeSl7CisgCQkJCUBPdmVycmlkZQorIAkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisgCQkJICAgICAgICBXZWJBcHBMaWJyYXJpZXNDb250YWluZXIudGhpcy5yZWZyZXNoKGZhbHNlKTsKKyAJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworIAkJCQl9CisgCQkJfTsKKyAJCQl2ZXJpZnlKb2Iuc2V0U3lzdGVtKHRydWUpOworIAkJCXZlcmlmeUpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOworIAkJCXZlcmlmeUpvYi5zY2hlZHVsZSgpOworICAgICAgICAgfQogICAgIH0KICAgICAKICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKQEAgLTYwLDEwICs5MSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBOTFMuYmluZCggUmVzb3VyY2VzLmxhYmVsV2l0aFByb2plY3QsIHRoaXMucHJvamVjdC5nZXROYW1lKCkgKTsKICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZXMubGFiZWw7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc291cmNlcy5sYWJlbDsKICAgICB9CiAgICAgCiAgICAgcHVibGljIHZvaWQgaW5zdGFsbCgpCkBAIC04MSwxOSArMTA5LDExMSBAQAogICAgICAgICB9CiAgICAgfQogICAgIAotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2goKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzT3V0T2ZEYXRlKCkgeworICAgIAlpZihJRGVwZW5kZW5jeUdyYXBoLklOU1RBTkNFLmlzU3RhbGUoKSl7CisgICAgCQkvL2F2b2lkIGRlYWRsb2NrIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzQwNTAKKyAgICAJCS8vaWYgdGhlIGRhdGEgaXMgc3RhbGUsIHJldHVybiB0cnVlIGFuZCBhdHRlbXB0IHRvIHVwZGF0ZSBhZ2FpbiBpbiB0aGUgbmVhciBmdXR1cmUKKyAgICAJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGUob3duZXIuZ2V0UHJvamVjdCgpKTsKKyAgICAJCXJldHVybiB0cnVlOworICAgIAl9CisgICAgCQorICAgIAlmaW5hbCBMaXN0IGN1cnJlbnRFbnRyaWVzID0gY29tcHV0ZUNsYXNzcGF0aEVudHJpZXMoZmFsc2UpOworICAgIAlib29sZWFuIG91dE9mRGF0ZSAgPSAhIHRoaXMuZW50cmllcy5lcXVhbHMoIGN1cnJlbnRFbnRyaWVzICk7CisgICAgCWlmKG91dE9mRGF0ZSl7CisgICAgCQlXZWJBcHBMaWJyYXJpZXNTdG9yZS5mbHVzaChwcm9qZWN0LmdldE5hbWUoKSk7CisgICAgCX0KKyAgICAJcmV0dXJuIG91dE9mRGF0ZTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVmcmVzaChib29sZWFuIGZvcmNlVXBkYXRlKXsKKyAgICAJaWYoSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS5pc1N0YWxlKCkpeworCQkJLy9hdm9pZCBkZWFkbG9jayBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0MDUwCisJCQkvL2lmIHRoZSBkYXRhIGlzIHN0YWxlIGFib3J0IGFuZCBhdHRlbXB0IHRvIHVwZGF0ZSBhZ2FpbiBpbiB0aGUgbmVhciBmdXR1cmUKKwkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGUob3duZXIuZ2V0UHJvamVjdCgpKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKyAgICAJaWYoZm9yY2VVcGRhdGUgfHwgaXNPdXRPZkRhdGUoKSl7CisgICAgCQlyZWZyZXNoKCk7CisgICAgCX0KKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVmcmVzaCgpCiAgICAgeworICAgIAlpZihJRGVwZW5kZW5jeUdyYXBoLklOU1RBTkNFLmlzU3RhbGUoKSl7CisJCQkvL2F2b2lkIGRlYWRsb2NrIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzU2NDUKKwkJCS8vaWYgdGhlIGRhdGEgaXMgc3RhbGUgYWJvcnQgYW5kIGF0dGVtcHQgdG8gdXBkYXRlIGFnYWluIGluIHRoZSBuZWFyIGZ1dHVyZQorCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5xdWV1ZVVwZGF0ZShvd25lci5nZXRQcm9qZWN0KCkpOworCQkJcmV0dXJuOworCQl9CisgICAgCQogICAgICAgICAoIG5ldyBXZWJBcHBMaWJyYXJpZXNDb250YWluZXIoIHRoaXMucGF0aCwgdGhpcy5vd25lciApICkuaW5zdGFsbCgpOwogICAgIH0KICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlZmVyZW5jZU9wdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKICAgICBzdGF0aWMgewotICAgIAlyZWZlcmVuY2VPcHRpb25zLnB1dCgiR0VUX0pBVkFfUkVGUyIsIEJvb2xlYW4uRkFMU0UpOworICAgIAlyZWZlcmVuY2VPcHRpb25zLnB1dCgiR0VUX0pBVkFfUkVGUyIsIEJvb2xlYW4uRkFMU0UpOyAvLyROT04tTkxTLTEkCiAgICAgfQogICAgIAorICAgIHByb3RlY3RlZCBMaXN0IDxJVmlydHVhbFJlZmVyZW5jZT5jb25zdW1lZFJlZmVyZW5jZXM7CisgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIElWaXJ0dWFsUmVmZXJlbmNlW10gY29tcHV0ZVJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQgdmMpIHsKLSAgICAJcmV0dXJuICgoVmlydHVhbENvbXBvbmVudCl2YykuZ2V0UmVmZXJlbmNlcyhyZWZlcmVuY2VPcHRpb25zKTsKKyAgICAJSVZpcnR1YWxSZWZlcmVuY2UgW10gYmFzZVJlZnMgPSAoKFZpcnR1YWxDb21wb25lbnQpdmMpLmdldFJlZmVyZW5jZXMocmVmZXJlbmNlT3B0aW9ucyk7CisgICAgCUxpc3QgPElWaXJ0dWFsUmVmZXJlbmNlPiByZWZzID0gbmV3IEFycmF5TGlzdCA8SVZpcnR1YWxSZWZlcmVuY2U+KCk7CisgICAgCWZvcihJVmlydHVhbFJlZmVyZW5jZSByZWY6IGJhc2VSZWZzKXsKKyAgICAJCWlmKHJlZi5nZXREZXBlbmRlbmN5VHlwZSgpID09IElWaXJ0dWFsUmVmZXJlbmNlLkRFUEVOREVOQ1lfVFlQRV9VU0VTKXsKKyAgICAJCQlyZWZzLmFkZChyZWYpOworICAgIAkJfSBlbHNlIHsKKyAgICAJCQlpZiAocmVmLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKHBhdGhzWzBdLm1ha2VBYnNvbHV0ZSgpKSl7CisgICAgCQkJCWlmKGNvbnN1bWVkUmVmZXJlbmNlcyA9PSBudWxsKXsKKyAgICAJCQkJCWNvbnN1bWVkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7CisgICAgCQkJCX0KKyAgICAJCQkJY29uc3VtZWRSZWZlcmVuY2VzLmFkZChyZWYpOworICAgIAkJCX0KKyAgICAJCX0KKyAgICAJfQorICAgIAlyZXR1cm4gcmVmcy50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtyZWZzLnNpemUoKV0pOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGlzdCBjb21wdXRlQ2xhc3NwYXRoRW50cmllcygpIHsKKyAgICAJcmV0dXJuIGNvbXB1dGVDbGFzc3BhdGhFbnRyaWVzKHRydWUpOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgTGlzdCBjb21wdXRlQ2xhc3NwYXRoRW50cmllcyhib29sZWFuIHVzZVJlc3RvcmVTdGF0ZSkgeworICAgIAlpZih1c2VSZXN0b3JlU3RhdGUpeworCSAgICAJcmVzdG9yZVN0YXRlID0gV2ViQXBwTGlicmFyaWVzU3RvcmUuZ2V0UmVzdG9yZVN0YXRlKHByb2plY3QuZ2V0TmFtZSgpKTsKKwkgICAgCWlmKHJlc3RvcmVTdGF0ZSAhPSBudWxsKXsKKwkgICAgCQlyZXR1cm4gcmVzdG9yZVN0YXRlLnBhdGhzOworCSAgICAJfQorICAgIAl9CisgICAgCQorICAgIAlMaXN0IDxJUGF0aD5lbnRyaWVzID0gc3VwZXIuY29tcHV0ZUNsYXNzcGF0aEVudHJpZXMoKTsKKyAgICAJaWYoY29uc3VtZWRSZWZlcmVuY2VzICE9IG51bGwpeworCSAgICAJZm9yKElWaXJ0dWFsUmVmZXJlbmNlIHJlZjpjb25zdW1lZFJlZmVyZW5jZXMpeworCSAgICAJCWlmKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBDbGFzc3BhdGhDb250YWluZXJWaXJ0dWFsQ29tcG9uZW50KXsKKwkgICAgCQkJQ2xhc3NwYXRoQ29udGFpbmVyVmlydHVhbENvbXBvbmVudCBjcHZjID0gKENsYXNzcGF0aENvbnRhaW5lclZpcnR1YWxDb21wb25lbnQpcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKKwkgICAgCQkJaWYoY3B2YyAhPSBudWxsKXsKKwkgICAgCQkJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gY3B2Yy5nZXRDbGFzc3BhdGhDb250YWluZXIoKTsKKwkgICAgCQkJCWlmKGNvbnRhaW5lciAhPSBudWxsKXsKKwkJCSAgICAJCQlJQ2xhc3NwYXRoRW50cnkgW10gbmV3RW50cmllcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7CisJCQkgICAgCQkJZm9yKElDbGFzc3BhdGhFbnRyeSBlbnRyeTpuZXdFbnRyaWVzKXsKKwkJCSAgICAJCQkJSVBhdGggZW50cnlQYXRoID0gZW50cnkuZ2V0UGF0aCgpOworCQkJICAgIAkJCQlpZighZW50cmllcy5jb250YWlucyhlbnRyeVBhdGgpKXsKKwkJCSAgICAJCQkJCWVudHJpZXMuYWRkKGVudHJ5UGF0aCk7CisJCQkgICAgCQkJCX0KKwkJCSAgICAJCQl9CisJICAgIAkJCQl9CisJICAgIAkJCX0KKwkgICAgCQl9CisJICAgIAl9CisgICAgCX0KKyAgICAJV2ViQXBwTGlicmFyaWVzU3RvcmUuc2F2ZVN0YXRlKHByb2plY3QuZ2V0TmFtZSgpLCBlbnRyaWVzKTsKKyAgICAJcmV0dXJuIGVudHJpZXM7CiAgICAgfQogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0IGdldFByb2plY3QoIGZpbmFsIElQYXRoIHBhdGgsCkBAIC0xMDMsMTEgKzIyMyw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBqcHJvamVjdC5nZXRQcm9qZWN0KCk7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHBhdGguc2VnbWVudCggMSApOwotICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCggbmFtZSApOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gcGF0aC5zZWdtZW50KCAxICk7CisgICAgICAgIHJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoIG5hbWUgKTsKICAgICB9CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCkBAIC0xMTcsNiArMjM0LDcgQEAKICAgICB7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxhYmVsOwogICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBsYWJlbFdpdGhQcm9qZWN0OworICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJpZnk7CiAgICAgICAgIAogICAgICAgICBzdGF0aWMKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvY2xhc3NwYXRoL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lci5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvY2xhc3NwYXRoL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lci5wcm9wZXJ0aWVzCmluZGV4IGNiZGNjMTguLjU3NjhhMGUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2NsYXNzcGF0aC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXIucHJvcGVydGllcworKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9jbGFzc3BhdGgvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyLnByb3BlcnRpZXMKQEAgLTksNCArOSw1IEBACiAjICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGxhYmVsID0gV2ViIEFwcCBMaWJyYXJpZXMKLWxhYmVsV2l0aFByb2plY3QgPSBXZWIgQXBwIExpYnJhcmllcyBbezB9XQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2xhYmVsV2l0aFByb2plY3QgPSBXZWIgQXBwIExpYnJhcmllcyBbezB9XQordmVyaWZ5ID0gVmVyaWZ5IFdlYiBBcHAgTGlicmFyaWVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvY2xhc3NwYXRoL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lckluaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9jbGFzc3BhdGgvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQppbmRleCBlZDAyYTdkLi43YjBmMDRhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9jbGFzc3BhdGgvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9jbGFzc3BhdGgvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQpAQCAtMjUsNyArMjUsOCBAQAogICAgIGV4dGVuZHMgRmxleGlibGVQcm9qZWN0Q29udGFpbmVySW5pdGlhbGl6ZXIKIAogewotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoIGZpbmFsIElQYXRoIHBhdGgsIAorICAgIEBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoIGZpbmFsIElQYXRoIHBhdGgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiApCiAKIAkgICAgdGhyb3dzIENvcmVFeGNlcHRpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2NsYXNzcGF0aC9XZWJBcHBMaWJyYXJpZXNTdG9yZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvY2xhc3NwYXRoL1dlYkFwcExpYnJhcmllc1N0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2ZjkxOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL2NsYXNzcGF0aC9XZWJBcHBMaWJyYXJpZXNTdG9yZS5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5jbGFzc3BhdGg7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKKworcHVibGljIGNsYXNzIFdlYkFwcExpYnJhcmllc1N0b3JlIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTElCUkFSSUVTX0NBQ0hFID0gIndlYkxpYnJhcmllc0NhY2hlLmluZGV4IjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFJlc3RvcmVTdGF0ZT4gcmVzdG9yZVN0YXRlTWFwOworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFJlc3RvcmVTdGF0ZT4gc2F2ZVN0YXRlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBSZXN0b3JlU3RhdGU+KCk7CisKKwlzdGF0aWMgY2xhc3MgUmVzdG9yZVN0YXRlIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTU2NTg1NjI2OTc3NjcyNDUyMkw7CisJCXRyYW5zaWVudCBib29sZWFuIG5lZWRUb1ZlcmlmeTsKKwkJTGlzdDxTdHJpbmc+IHBhdGhTdHJpbmdzOworCQl0cmFuc2llbnQgTGlzdDxJUGF0aD4gcGF0aHM7CisKKwkJcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXBhdGhTdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHBhdGhzLnNpemUoKSk7CisJCQlmb3IgKElQYXRoIHAgOiBwYXRocykgeworCQkJCXBhdGhTdHJpbmdzLmFkZChwLnRvU3RyaW5nKCkpOworCQkJfQorCQkJb3V0LmRlZmF1bHRXcml0ZU9iamVjdCgpOworCQl9CisKKwkJcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKwkJCWluLmRlZmF1bHRSZWFkT2JqZWN0KCk7CisJCQluZWVkVG9WZXJpZnkgPSB0cnVlOworCQkJcGF0aHMgPSBuZXcgQXJyYXlMaXN0PElQYXRoPihwYXRoU3RyaW5ncy5zaXplKCkpOworCQkJZm9yIChTdHJpbmcgcyA6IHBhdGhTdHJpbmdzKSB7CisJCQkJcGF0aHMuYWRkKG5ldyBQYXRoKHMpKTsKKwkJCX0KKwkJfQorCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKwkJCWlmICh0aGlzID09IG8pIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAobyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgUmVzdG9yZVN0YXRlKSB7CisJCQkJUmVzdG9yZVN0YXRlIG90aGVyID0gKFJlc3RvcmVTdGF0ZSkgbzsKKwkJCQlpZiAocGF0aHMgPT0gbnVsbCkgeworCQkJCQlyZXR1cm4gb3RoZXIucGF0aHMgPT0gbnVsbDsKKwkJCQl9CisJCQkJcmV0dXJuIHBhdGhzLmVxdWFscyhvdGhlci5wYXRocyk7CisJCQl9CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJCWlmIChwYXRocyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIDExOworCQkJfQorCQkJcmV0dXJuIHBhdGhzLmhhc2hDb2RlKCk7CisJCX0KKwl9CisKKwlzdGF0aWMgeworCQlJUGF0aCBzdGF0ZUxvY2F0aW9uID0gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7CisJCWphdmEuaW8uRmlsZSBmaWxlID0gc3RhdGVMb2NhdGlvbi5hcHBlbmQoV0VCX0xJQlJBUklFU19DQUNIRSkudG9GaWxlKCk7CisJCXRyeXsKKwkJCWlmIChmaWxlLmV4aXN0cygpKSB7CisJCQkJRmlsZUlucHV0U3RyZWFtIGZJbiA9IG51bGw7CisJCQkJYm9vbGVhbiBkZWxldGVDYWNoZSA9IHRydWU7CisJCQkJdHJ5IHsKKwkJCQkJZkluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKwkJCQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBiSW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmSW4pOworCQkJCQlPYmplY3RJbnB1dFN0cmVhbSBvSW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYkluKTsKKwkJCQkJcmVzdG9yZVN0YXRlTWFwID0gKEhhc2hNYXA8U3RyaW5nLCBSZXN0b3JlU3RhdGU+KSBvSW4ucmVhZE9iamVjdCgpOworCQkJCQlvSW4uY2xvc2UoKTsKKwkJCQkJCisJCQkJCS8vaXQgaXMgdW5mb3J0dW5hdGUgdGhpcyBpcyBuZWNlc3NhcnksIGJ1dCB3aXRob3V0IGl0ZXJhdGluZyBvdmVyIHRoZSBtYXAKKwkJCQkJLy9hbmQgZXhwbGljaXRseSB0ZXN0aW5nIGVhY2ggdmFsdWUsIGNsYXNzIGNhc3QgZXhjZXB0aW9ucyBtYXkgb2NjdXIgbGF0ZXIKKwkJCQkJLy9iZXN0IHRvIGNoZWNrIHRoZW0gYWxsIG5vdyBhbmQgcmVjb3ZlcgorCQkJCQlJdGVyYXRvcjxFbnRyeTxTdHJpbmcsIFJlc3RvcmVTdGF0ZT4+IGl0ZXJhdG9yID0gcmVzdG9yZVN0YXRlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKwkJCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKKwkJCQkJCUVudHJ5PFN0cmluZywgUmVzdG9yZVN0YXRlPiBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOworCQkJCQkJU3RyaW5nIHMgPSBuZXh0LmdldEtleSgpOworCQkJCQkJUmVzdG9yZVN0YXRlIHJzID0gbmV4dC5nZXRWYWx1ZSgpOworCQkJCQkJaWYocyA9PSBudWxsIHx8IHJzID09IG51bGwpeworCQkJCQkJCS8vbWF5IHRocm93IENsYXNzQ2FzdEV4Y2VwdGlvbgorCQkJCQkJfQorCQkJCQl9CisJCQkJCWRlbGV0ZUNhY2hlID0gZmFsc2U7CisJCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCQkJV2ViUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJV2ViUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJCQlXZWJQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKwkJCQkJV2ViUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCX0gZmluYWxseSB7CisJCQkJCWlmIChmSW4gIT0gbnVsbCkgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQlmSW4uY2xvc2UoKTsKKwkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlXZWJQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJaWYgKGRlbGV0ZUNhY2hlKSB7CisJCQkJCQlyZXN0b3JlU3RhdGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlc3RvcmVTdGF0ZT4oKTsKKwkJCQkJCWZpbGUuZGVsZXRlKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKXsKKwkJCXRyeXsKKwkJCQlXZWJQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQkJZmlsZS5kZWxldGUoKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMil7CisJCQkJLy9lYXQgaXQKKwkJCX0KKwkJCXJlc3RvcmVTdGF0ZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVzdG9yZVN0YXRlPigpOworCQl9IGZpbmFsbHkgeworCQkJaWYocmVzdG9yZVN0YXRlTWFwID09IG51bGwpIHsKKwkJCQlyZXN0b3JlU3RhdGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlc3RvcmVTdGF0ZT4oKTsKKwkJCX0KKwkJfQorCQkKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJlc3RvcmVTdGF0ZSBnZXRSZXN0b3JlU3RhdGUoU3RyaW5nIHByb2plY3ROYW1lKSB7CisJCVJlc3RvcmVTdGF0ZSByZXN0b3JlU3RhdGUgPSBudWxsOworCQlzeW5jaHJvbml6ZWQgKHJlc3RvcmVTdGF0ZU1hcCkgeworCQkJcmVzdG9yZVN0YXRlID0gcmVzdG9yZVN0YXRlTWFwLmdldChwcm9qZWN0TmFtZSk7CisJCX0KKwkJaWYgKHJlc3RvcmVTdGF0ZSAhPSBudWxsKSB7CisJCQlzeW5jaHJvbml6ZWQgKHNhdmVTdGF0ZU1hcCkgeworCQkJCXNhdmVTdGF0ZU1hcC5wdXQocHJvamVjdE5hbWUsIHJlc3RvcmVTdGF0ZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJlc3RvcmVTdGF0ZTsKKwl9CisKKwlzdGF0aWMgdm9pZCBmbHVzaChTdHJpbmcgcHJvamVjdE5hbWUpIHsKKwkJc3luY2hyb25pemVkIChyZXN0b3JlU3RhdGVNYXApIHsKKwkJCXJlc3RvcmVTdGF0ZU1hcC5yZW1vdmUocHJvamVjdE5hbWUpOworCQl9CisJCXN5bmNocm9uaXplZCAoc2F2ZVN0YXRlTWFwKSB7CisJCQlzYXZlU3RhdGVNYXAucmVtb3ZlKHByb2plY3ROYW1lKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBQZXJzaXN0Sm9iIGV4dGVuZHMgSm9iIHsKKworCQlwdWJsaWMgUGVyc2lzdEpvYigpIHsKKwkJCXN1cGVyKCJQZXJzaXN0IFdlYiBBcHAgTGlicmFyaWVzIFN0YXRlIik7IC8vJE5PTi1OTFMtMSQKKwkJCXNldFN5c3RlbSh0cnVlKTsKKwkJCXNldFJ1bGUobnVsbCk7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7CisJCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCQkJCXBlcnNpc3QoKTsKKwkJCQl9CisKKwkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQkJCQlXZWJQbHVnaW4ubG9nRXJyb3IoZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9KTsKKwkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgaW50IHBlcnNpc3REZWxheSA9IDYwMDAwOyAvLyAxIG1pbnV0ZQorCXByaXZhdGUgc3RhdGljIFBlcnNpc3RKb2IgcGVyc2lzdEpvYiA9IG5ldyBQZXJzaXN0Sm9iKCk7CisKKwlzdGF0aWMgdm9pZCBzYXZlU3RhdGUoU3RyaW5nIHByb2plY3ROYW1lLCBMaXN0PElQYXRoPiBwYXRocykgeworCQlSZXN0b3JlU3RhdGUgdG9TYXZlID0gbmV3IFJlc3RvcmVTdGF0ZSgpOworCQl0b1NhdmUucGF0aHMgPSBwYXRoczsKKworCQlib29sZWFuIHNjaGVkdWxlSm9iID0gZmFsc2U7CisKKwkJc3luY2hyb25pemVkIChzYXZlU3RhdGVNYXApIHsKKwkJCVJlc3RvcmVTdGF0ZSBwcmV2aW91cyA9IHNhdmVTdGF0ZU1hcC5nZXQocHJvamVjdE5hbWUpOworCQkJaWYgKG51bGwgPT0gcHJldmlvdXMgfHwgIXByZXZpb3VzLmVxdWFscyh0b1NhdmUpKSB7CisJCQkJc2F2ZVN0YXRlTWFwLnB1dChwcm9qZWN0TmFtZSwgdG9TYXZlKTsKKwkJCQlzY2hlZHVsZUpvYiA9IHRydWU7CisJCQl9CisJCX0KKwkJaWYgKHNjaGVkdWxlSm9iKSB7CisJCQlzeW5jaHJvbml6ZWQgKHJlc3RvcmVTdGF0ZU1hcCkgeworCQkJCS8vIGlmIGl0IGNoYW5nZWQsIGRvIG5vdCBsb2FkIGl0IGZyb20gdGhlIGNhY2hlIGFnYWluCisJCQkJcmVzdG9yZVN0YXRlTWFwLnJlbW92ZShwcm9qZWN0TmFtZSk7CisJCQl9CisJCQlwZXJzaXN0Sm9iLnNjaGVkdWxlKHBlcnNpc3REZWxheSk7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHBlcnNpc3QoKSB7CisJCXN5bmNocm9uaXplZCAoc2F2ZVN0YXRlTWFwKSB7CisJCQlJUGF0aCBzdGF0ZUxvY2F0aW9uID0gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdGF0ZUxvY2F0aW9uKCk7CisJCQlqYXZhLmlvLkZpbGUgZmlsZSA9IHN0YXRlTG9jYXRpb24uYXBwZW5kKFdFQl9MSUJSQVJJRVNfQ0FDSEUpLnRvRmlsZSgpOworCQkJRmlsZU91dHB1dFN0cmVhbSBmT3V0ID0gbnVsbDsKKwkJCXRyeSB7CisJCQkJZk91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworCQkJCUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJPdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZk91dCk7CisJCQkJT2JqZWN0T3V0cHV0U3RyZWFtIG9PdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJPdXQpOworCQkJCW9PdXQud3JpdGVPYmplY3Qoc2F2ZVN0YXRlTWFwKTsKKwkJCQlvT3V0LmNsb3NlKCk7CisJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJCVdlYlBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQlXZWJQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQl9IGZpbmFsbHkgeworCQkJCWlmIChmT3V0ICE9IG51bGwpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCWZPdXQuY2xvc2UoKTsKKwkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkJV2ViUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9Db252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCA2ZGUyYmJiLi43MzYwZTNhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL0NvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTI0LDExICsyNCwxMyBAQAogCQlzdXBlcigpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7CiAJCXJldHVybiBuZXcgQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY09wZXJhdGlvbihtb2RlbCk7CiAJfQogCiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7CiAJCVNldCBwcm9wZXJ0eU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1JlbGF0aW9uRGF0YS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9SZWxhdGlvbkRhdGEuamF2YQppbmRleCBmZWM1MzBjLi5iNDBmN2JiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1JlbGF0aW9uRGF0YS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvUmVsYXRpb25EYXRhLmphdmEKQEAgLTMzLDYgKzMzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwogCiAKIC8qKgpAQCAtNTUsNiArNTYsNyBAQAogCQkgKiAKIAkJICogQHJldHVybiBDcmVhdGVkIGNsb25lIG9iamVjdAogCQkgKi8KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAJCQlyZXR1cm4gbmV3IExpbmsodXJsLCBvY2N1cnJlbmNlcyk7CiAJCX0KQEAgLTgyLDYgKzg0LDcgQEAKIAkJCXJldHVybiBvY2N1cnJlbmNlczsKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJcmV0dXJuIHVybDsKIAkJfQpAQCAtMjI4LDI4ICsyMzEsMjggQEAKIAogCiAJcHVibGljIHZvaWQgZHVtcCgpIHsKLQkJaWYgKGZhbHNlKSB7Ci0JCQlpZiAoaW5MaW5rc1RhYmxlICE9IG51bGwpIHsKLQkJCQlmb3IgKEVudW1lcmF0aW9uIGFlbnVtID0gaW5MaW5rc1RhYmxlLmtleXMoKTsgYWVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBTdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGFlbnVtLm5leHRFbGVtZW50KCk7Ci0JCQkJCVN0LmFwcGVuZCgiXG5LZXk9IiArIGtleSArICJcbiIpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCVZlY3RvciBpbl9saW5rcyA9IChWZWN0b3IpIGluTGlua3NUYWJsZS5nZXQoa2V5KTsKLQkJCQkJaW50IG5iX29mX2xpbmtzID0gaW5fbGlua3Muc2l6ZSgpOwotCi0JCQkJCS8vIFJlcGxhY2UgdGhlIHN0cmluZyBieSBpbmRleAotCQkJCQkvLyBBZGQgYSAnKydzZXBhcmF0b3Igb25seSBmb3IgbW9yZSB0aGFuIG9uZSBsaW5rcyB0byBzYXZlIHNwYWNlCi0JCQkJCS8vCi0KLQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5iX29mX2xpbmtzOyBpKyspIHsKLQkJCQkJCUxpbmsgbG5rID0gKExpbmspIGluX2xpbmtzLmVsZW1lbnRBdChpKTsKLQkJCQkJCVN0LmFwcGVuZCgiXHRWYWx1ZT0iICsgbG5rLmdldFVSTCgpICsgIlsiICsgbG5rLmdldE9jY3VycmVuY2VzKCkgKyAiXSIpOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nSW5mbyhTdC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKy8vCQlpZiAoZmFsc2UpIHsKKy8vCQkJaWYgKGluTGlua3NUYWJsZSAhPSBudWxsKSB7CisvLwkJCQlmb3IgKEVudW1lcmF0aW9uIGFlbnVtID0gaW5MaW5rc1RhYmxlLmtleXMoKTsgYWVudW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7CisvLwkJCQkJU3RyaW5nQnVmZmVyIFN0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworLy8JCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBhZW51bS5uZXh0RWxlbWVudCgpOworLy8JCQkJCVN0LmFwcGVuZCgiXG5LZXk9IiArIGtleSArICJcbiIpOy8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCisvLwkJCQkJVmVjdG9yIGluX2xpbmtzID0gKFZlY3RvcikgaW5MaW5rc1RhYmxlLmdldChrZXkpOworLy8JCQkJCWludCBuYl9vZl9saW5rcyA9IGluX2xpbmtzLnNpemUoKTsKKy8vCisvLwkJCQkJLy8gUmVwbGFjZSB0aGUgc3RyaW5nIGJ5IGluZGV4CisvLwkJCQkJLy8gQWRkIGEgJysnc2VwYXJhdG9yIG9ubHkgZm9yIG1vcmUgdGhhbiBvbmUgbGlua3MgdG8gc2F2ZSBzcGFjZQorLy8JCQkJCS8vCisvLworLy8KKy8vCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5iX29mX2xpbmtzOyBpKyspIHsKKy8vCQkJCQkJTGluayBsbmsgPSAoTGluaykgaW5fbGlua3MuZWxlbWVudEF0KGkpOworLy8JCQkJCQlTdC5hcHBlbmQoIlx0VmFsdWU9IiArIGxuay5nZXRVUkwoKSArICJbIiArIGxuay5nZXRPY2N1cnJlbmNlcygpICsgIl0iKTsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKKy8vCQkJCQl9CisvLwkJCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dJbmZvKFN0LnRvU3RyaW5nKCkpOworLy8JCQkJfQorLy8JCQl9CisvLwkJfQogCX0KIAogCXB1YmxpYyB2b2lkIGR1bXAoYm9vbGVhbiBkdW1wKSB7CkBAIC0yNzEsNyArMjc0LDcgQEAKIAkJCQkJCUxpbmsgbG5rID0gKExpbmspIGluX2xpbmtzLmVsZW1lbnRBdChpKTsKIAkJCQkJCVN0LmFwcGVuZCgiXHRWYWx1ZT0iICsgbG5rLmdldFVSTCgpICsgIlsiICsgbG5rLmdldE9jY3VycmVuY2VzKCkgKyAiXSIpOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAogCQkJCQl9Ci0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoU3QudG9TdHJpbmcoKSk7CisJCQkJCVdlYlBsdWdpbi5sb2dFcnJvcihTdC50b1N0cmluZygpKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTc5NCwxNCArNzk3LDEyIEBACiAJCQkJCQkJbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwogCQkJCQkJfQogCQkJCQkJLy8gYWRkIGxpbmsgc3RyaW5nICgvTXlQcm9qL2ZpbGUuaHRtbCkKLQkJCQkJCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJCQkJCWtleXMuYWRkRWxlbWVudChidWZmZXIpOwotCQkJCQkJfQorCQkJCQkJa2V5cy5hZGRFbGVtZW50KGJ1ZmZlcik7CiAJCQkJCQkvLyBhZGQgcmVmZXJlbmNlcyBsaW5lICgrMi8zLi4uKQogCQkJCQkJaWYgKGxpbmUgIT0gbnVsbCkgewogCQkJCQkJCWluZGljZXMuYWRkRWxlbWVudChsaW5lKTsKIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlN5bnRheF9FcnJvcl9pbl90aGVfbGlua3NfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJTeW50YXggRXJyb3IgaW4gdGhlIGxpbmtzIHN0YXRlIGZpbGUiCisJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlN5bnRheF9FcnJvcl9pbl90aGVfbGlua3NfVUlfKTsgLy8gPSAiU3ludGF4IEVycm9yIGluIHRoZSBsaW5rcyBzdGF0ZSBmaWxlIgogCQkJCQkJCXJldHVybiBmYWxzZTsKIAkJCQkJCX0KIAkJCQkJfQpAQCAtODM3LDE1ICs4MzgsMTUgQEAKIAkJCQkJLy8JCQogCQkJCQkvLwkJCQl9CiAJCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZlKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZmUpOworCQkJCQlXZWJQbHVnaW4ubG9nRXJyb3IoZmUpOwogCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGllKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoaWUpOworCQkJCQlXZWJQbHVnaW4ubG9nRXJyb3IoaWUpOwogCQkJCX0gZmluYWxseSB7CiAJCQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewogCQkJCQkJdHJ5IHsKIAkJCQkJCQlyZWFkZXIuY2xvc2UoKTsKIAkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGllMikgewotCQkJCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoaWUyKTsKKwkJCQkJCQlXZWJQbHVnaW4ubG9nRXJyb3IoaWUyKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KQEAgLTk3Nyw3ICs5NzgsNyBAQAogCQkJCW91dC5mbHVzaCgpOwogCQkJCW91dC5jbG9zZSgpOwogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuRXJyb3Jfd2hpbGVfc2F2aW5nX2xpbmtzX3NfRVhDXyk7IC8vJE5PTi1OTFMtMSQgPSAiRXJyb3Igd2hpbGUgc2F2aW5nIGxpbmtzIHN0YXRlIGZpbGUiCisJCQkJV2ViUGx1Z2luLmxvZ0Vycm9yKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkVycm9yX3doaWxlX3NhdmluZ19saW5rc19zX0VYQ18pOyAvLyA9ICJFcnJvciB3aGlsZSBzYXZpbmcgbGlua3Mgc3RhdGUgZmlsZSIKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvV2ViUHJvcGVydGllc1V0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvV2ViUHJvcGVydGllc1V0aWwuamF2YQppbmRleCBhY2Y0M2U5Li5lMzg1M2Q1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi9vcGVyYXRpb25zL1dlYlByb3BlcnRpZXNVdGlsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJQcm9wZXJ0aWVzVXRpbC5qYXZhCkBAIC0zMiwxNSArMzIsMTYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wbHVnaW4uV2ViUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKIAoraW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuVVRGMTY7CiBpbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiAKIHB1YmxpYyBjbGFzcyBXZWJQcm9wZXJ0aWVzVXRpbCB7CkBAIC03OSw3ICs4MCw3IEBACiAJCQlpZiAoZ2V0TW9kdWxlU2VydmVyUm9vdChwcm9qZWN0KS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuZXF1YWxzKG5ld1BhdGgpKQogCQkJCXJldHVybiBmYWxzZTsKIAkJCWlmIChwcm9qZWN0LmV4aXN0cyhuZXdQYXRoKSkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2UuanN0LmoyZWUiLCBJU3RhdHVzLk9LLCBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuQ291bGRfbm90X3JlbmFtZV9fX19fMiwgbmV3IE9iamVjdFtde3dlYkNvbnRlbnROYW1lfSksIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCisJCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJvcmcuZWNsaXBzZS5qc3QuajJlZSIsIElTdGF0dXMuT0ssIFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Db3VsZF9ub3RfcmVuYW1lX19fX18yLCBuZXcgT2JqZWN0W117d2ViQ29udGVudE5hbWV9KSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgCiAJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKIAkJCX0KIApAQCAtMTkyLDEyICsxOTMsMTIgQEAKIAkgKiBDcmVhdGlvbiBkYXRlOiAoNC8xNy8wMSAxMTo0ODoxMiBBTSkKIAkgKi8KIAlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc3luY2goSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KKwkJSVByb2dyZXNzTW9uaXRvciBsb2NhbE1vbml0b3IgPSBtb25pdG9yOwogCQl0cnkgewotCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOworCQkJaWYgKGxvY2FsTW9uaXRvciA9PSBudWxsKSB7CisJCQkJbG9jYWxNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKIAkJCX0KLQkJCW1vbml0b3IuYmVnaW5UYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlN5Y2hyb25pemVfQ2xhc3NfUGF0aF9VSV8sIDQpOyAvLyROT04tTkxTLTEkCisJCQlsb2NhbE1vbml0b3IuYmVnaW5UYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlN5Y2hyb25pemVfQ2xhc3NfUGF0aF9VSV8sIDQpOyAKIAkJCS8vJE5PTi1OTFMtMSQgPSAiU3ljaHJvbml6ZSBDbGFzcyBQYXRoIgogCiAJCQlJQ29udGFpbmVyIGxpYl9mb2xkZXIgPSBnZXRXZWJMaWJGb2xkZXIocHJvamVjdCk7CkBAIC0yMTQsMjIgKzIxNSwyMiBAQAogCQkJLy8gQ3JlYXRlIGEgbWFwIG9mIHRoZSBsaWIgcHJvamVjdHMgaW4gdGhlIGN1cnJlbnQgcHJvamVjdAogCQkJSGFzaHRhYmxlIGxpYl9qYXJzID0gbmV3IEhhc2h0YWJsZSgpOwogCQkJSVJlc291cmNlW10gY2hpbGRyZW4gPSBsaWJfZm9sZGVyLm1lbWJlcnMoKTsKLQkJCW1vbml0b3Iuc3ViVGFzayhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5DYXRhbG9nX0xpYl9EaXJlY3RvcnlfX1VJXyk7IC8vJE5PTi1OTFMtMSQKKwkJCWxvY2FsTW9uaXRvci5zdWJUYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkNhdGFsb2dfTGliX0RpcmVjdG9yeV9fVUlfKTsgCiAJCQkvLyROT04tTkxTLTEkID0gIkNhdGFsb2cgTGliIERpcmVjdG9yeToiCiAJCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7CiAJCQkJSVJlc291cmNlIGNoaWxkID0gY2hpbGRyZW5bal07CiAJCQkJLy8gbW9uaXRvci5zZXRUYXNrTmFtZShSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDYXRhbG9nX0xpYl9EaXJlY3RvcnlfX1VJXyIpICsKIAkJCQkvLyBjaGlsZCk7IC8vJE5PTi1OTFMtMSQgPSAiQ2F0YWxvZyBMaWIgRGlyZWN0b3J5OiIKIAkJCQkvLyBNYWtlIHN1cmUgaXQgaXMgYSB6aXAgb3IgYSBqYXIgZmlsZQotCQkJCWlmIChjaGlsZC5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgKGNoaWxkLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamFyIikgLy8kTk9OLU5MUy0xJAorCQkJCWlmIChjaGlsZC5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgKGNoaWxkLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQpCiAJCQkJCQkJfHwgY2hpbGQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi56aXAiKSkpIHsgLy8kTk9OLU5MUy0xJAogCQkJCQlsaWJfamFycy5wdXQoY2hpbGQuZ2V0RnVsbFBhdGgoKSwgY2hpbGQpOwogCQkJCX0KIAogCQkJfQogCi0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCW1vbml0b3Iuc3ViVGFzayhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5VcGRhdGVfQ2xhc3NQYXRoX19VSV8pOyAvLyROT04tTkxTLTEkCisJCQlsb2NhbE1vbml0b3Iud29ya2VkKDEpOworCQkJbG9jYWxNb25pdG9yLnN1YlRhc2soUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuVXBkYXRlX0NsYXNzUGF0aF9fVUlfKTsgCiAJCQkvLyROT04tTkxTLTEkID0gIlVwZGF0ZSBDbGFzc1BhdGg6IgogCQkJLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgY2xhc3NwYXRoIGRpcnMgbG9va2luZyBmb3Igb25lcyB0aGF0IG1heSBoYXZlCiAJCQkvLyBiZWVuIGRlbGV0ZWQKQEAgLTI1NCwxMyArMjU1LDEzIEBACiAJCQkJCQluZWVkc1RvQmVNb2RpZmllZCA9IHRydWU7CiAJCQkJCX0KIAkJCQl9IGVsc2UgewotCQkJCQltb25pdG9yLnN1YlRhc2soUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuQ2F0YWxvZ19MaWJfRGlyZWN0b3J5X19VSV8gKyBjcFtqXS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkCisJCQkJCWxvY2FsTW9uaXRvci5zdWJUYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkNhdGFsb2dfTGliX0RpcmVjdG9yeV9fVUlfICsgY3Bbal0uZ2V0UGF0aCgpKTsgCiAJCQkJCS8vJE5PTi1OTFMtMSQgPSAiQ2F0YWxvZyBMaWIgRGlyZWN0b3J5OiIKIAkJCQkJbmV3Q2xhc3NQYXRoVmVjdG9yLmFkZChjcFtqXSk7CiAJCQkJfQogCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQltb25pdG9yLnN1YlRhc2soUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuVXBkYXRlX0NsYXNzUGF0aF9fVUlfKTsgLy8kTk9OLU5MUy0xJAorCQkJbG9jYWxNb25pdG9yLndvcmtlZCgxKTsKKwkJCWxvY2FsTW9uaXRvci5zdWJUYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlVwZGF0ZV9DbGFzc1BhdGhfX1VJXyk7IAogCQkJLy8kTk9OLU5MUy0xJCA9ICJVcGRhdGUgQ2xhc3NQYXRoOiIKIAogCQkJLy8gQWRkIGFueSBlbnRyaWVzIG5vdCBhbHJlYWR5IGZvdW5kCkBAIC0yNzUsOCArMjc2LDggQEAKIAkJCQluZWVkc1RvQmVNb2RpZmllZCA9IHRydWU7CiAJCQl9CiAKLQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJbW9uaXRvci5zdWJUYXNrKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlNldF9DbGFzc1BhdGhfX1VJXyk7IC8vJE5PTi1OTFMtMSQKKwkJCWxvY2FsTW9uaXRvci53b3JrZWQoMSk7CisJCQlsb2NhbE1vbml0b3Iuc3ViVGFzayhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5TZXRfQ2xhc3NQYXRoX19VSV8pOyAKIAkJCS8vJE5PTi1OTFMtMSQgPSAiU2V0IENsYXNzUGF0aDoiCiAKIAkJCS8vIFRhbnNmZXIgdGhlIHZlY3RvciB0byBhbiBhcnJheQpAQCAtMjkwLDM1ICsyOTEsMjMgQEAKIAkJCWlmIChuZWVkc1RvQmVNb2RpZmllZCkgewogCiAJCQkJdHJ5IHsKLQkJCQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzUGF0aEFycmF5LCBtb25pdG9yKTsKKwkJCQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld0NsYXNzUGF0aEFycmF5LCBsb2NhbE1vbml0b3IpOwogCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7CisJCQkJCVdlYlBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQl9CiAJCQl9CiAKIAkJfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGV4KTsKKwkJCVdlYlBsdWdpbi5sb2dFcnJvcihleCk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZXgpOworCQkJV2ViUGx1Z2luLmxvZ0Vycm9yKGV4KTsKIAkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOworCQkJbG9jYWxNb25pdG9yLmRvbmUoKTsKIAkJfQogCX0KIAogCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVDb250ZXh0Um9vdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29udGV4dFJvb3QpIHsKLQkJaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgcHJvamVjdC5pc09wZW4oKSkgewotCQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBUT0RPIG1pZ3JhdGUgdG8gZmxleCBwcm9qZWN0cwotCQkJCS8vIHdlYkVkaXQgPSAoV2ViQXJ0aWZhY3RFZGl0KSBTdHJ1Y3R1cmVFZGl0LmdldEZpcnN0QXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQkJCQlpZiAod2ViRWRpdCAhPSBudWxsKQotCQkJCQl3ZWJFZGl0LnNldFNlcnZlckNvbnRleHRSb290KGNvbnRleHRSb290KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLQkJCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0KLQkJfQorCQkKIAl9CiAKIApAQCAtMzQyLDEwICszMzEsMTAgQEAKIAkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7CiAKIAkJU3RyaW5nIG5hbWUgPSBjb250ZXh0Um9vdDsKLQkJaWYgKG5hbWUuZXF1YWxzKCIiKSB8fCBuYW1lID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJAorCQlpZiAobmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCS8vIHRoaXMgd2FzIGFkZGVkIGJlY2F1c2UgdGhlIGVycm9yIG1lc3NhZ2Ugc2hvdWxkbnQgYmUgc2hvd24gaW5pdGlhbGx5LiBJdCBzaG91bGQgYmUKIAkJCS8vIHNob3duIG9ubHkgaWYgY29udGV4dCByb290IGZpZWxkIGlzIGVkaXRlZCB0bwotCQkJZXJyb3JNZXNzYWdlID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuQ29udGV4dF9Sb290X2Nhbm5vdF9iZV9lbXB0eV8yOyAvLyROT04tTkxTLTEkCisJCQllcnJvck1lc3NhZ2UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Db250ZXh0X1Jvb3RfY2Fubm90X2JlX2VtcHR5XzI7IAogCQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKIAkJfQogCkBAIC0zNTksNyArMzQ4LDkgQEAKIAkJCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lLCAiLiIpOyAvLyROT04tTkxTLTEkCiAJCQlvdXRlciA6IHdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewogCQkJCVN0cmluZyB0b2tlbiA9IHN0b2submV4dFRva2VuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbi5sZW5ndGgoKTsgaSsrKSB7CisJCQkJaW50IGNwOworCQkgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoKCk7IGkgKz0gVVRGMTYuZ2V0Q2hhckNvdW50KGNwKSkgeworCQkgICAgICAgICAgICBjcCA9IFVURjE2LmNoYXJBdCh0b2tlbiwgaSk7CiAJCQkJCWlmICghKHRva2VuLmNoYXJBdChpKSA9PSAnXycpICYmICEodG9rZW4uY2hhckF0KGkpID09ICctJykgJiYgISh0b2tlbi5jaGFyQXQoaSkgPT0gJy8nKSAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KHRva2VuLmNoYXJBdChpKSkgPT0gZmFsc2UpIHsKIAkJCQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRva2VuLmNoYXJBdChpKSkpIHsKIAkJCQkJCQkvLyBSZW1vdmVkIGJlY2F1c2UgY29udGV4dCByb290cyBjYW4gY29udGFpbiB3aGl0ZSBzcGFjZQpAQCAtMzY3LDcgKzM1OCwxNyBAQAogCQkJCQkJCS8vIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9Db250ZXh0X3Jvb3RfY2Fubm90X2NvbnRhX1VJXyIpOy8vJE5PTi1OTFMtMSQKIAkJCQkJCQkvLyA9ICIgQ29udGV4dCByb290IGNhbm5vdCBjb250YWluIHdoaXRlc3BhY2VzLiIKIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZXJyb3JNZXNzYWdlID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlRoZV9jaGFyYWN0ZXJfaXNfaW52YWxpZF9pbl9hX2NvbnRleHRfcm9vdCwgbmV3IE9iamVjdFtdeyhuZXcgQ2hhcmFjdGVyKHRva2VuLmNoYXJBdChpKSkpLnRvU3RyaW5nKCl9KTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCVN0cmluZyBpbnZhbGlkQ2hhclN0cmluZyA9IG51bGw7CisJCQkJCQkJaWYgKFVURjE2LmdldENoYXJDb3VudChjcCk+MSkKKwkJCQkJCQl7CisJCQkJCQkJCWludmFsaWRDaGFyU3RyaW5nID0gVVRGMTYudmFsdWVPZihjcCk7IAorCQkJCQkJCX0KKwkJCQkJCQllbHNlCisJCQkJCQkJeworCQkJCQkJCQlpbnZhbGlkQ2hhclN0cmluZyA9IChuZXcgQ2hhcmFjdGVyKHRva2VuLmNoYXJBdChpKSkpLnRvU3RyaW5nKCk7CisJCQkJCQkJfQorCQkJCQkJCU9iamVjdFtdIGludmFsaWRDaGFyID0gbmV3IE9iamVjdFtde2ludmFsaWRDaGFyU3RyaW5nfTsKKwkJCQkJCQllcnJvck1lc3NhZ2UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuVGhlX2NoYXJhY3Rlcl9pc19pbnZhbGlkX2luX2FfY29udGV4dF9yb290LCBpbnZhbGlkQ2hhcik7IAogCQkJCQkJCWJyZWFrIG91dGVyOwogCQkJCQkJfQogCQkJCQl9CkBAIC0zNzUsNyArMzc2LDcgQEAKIAkJCX0KIAkJfSAvLyBlbi8gZW5kIG9mIGlmKG5hbWUudHJpbQogCQllbHNlCi0JCQllcnJvck1lc3NhZ2UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5OYW1lc19jYW5ub3RfYmVnaW5fb3JfZW5kX3dpdGhfd2hpdGVzcGFjZV81OyAvLyROT04tTkxTLTEkCisJCQllcnJvck1lc3NhZ2UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5OYW1lc19jYW5ub3RfYmVnaW5fb3JfZW5kX3dpdGhfd2hpdGVzcGFjZV81OyAKIAogCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwogCX0KQEAgLTM5NSwxMCArMzk2LDEwIEBACiAKIAlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0ZUZvbGRlck5hbWUoU3RyaW5nIGZvbGRlck5hbWUpIHsKIAkJaWYgKGZvbGRlck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Gb2xkZXJfbmFtZV9jYW5ub3RfYmVfZW1wdHlfMjsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkZvbGRlcl9uYW1lX2Nhbm5vdF9iZV9lbXB0eV8yOyAKIAogCQlpZiAoY29udGFpbnMoZm9sZGVyTmFtZSwgQkFEX0NIQVJTKSkKLQkJCXJldHVybiBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuRm9sZGVyX25hbWVfaXNfbm90X3ZhbGlkLCBuZXcgT2JqZWN0W117Zm9sZGVyTmFtZX0pOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkZvbGRlcl9uYW1lX2lzX25vdF92YWxpZCwgbmV3IE9iamVjdFtde2ZvbGRlck5hbWV9KTsgCiAKIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtNDExLDcgKzQxMiw3IEBACiAJCQlyZXR1cm4gbXNnOwogCiAJCWlmIChqYXZhU291cmNlTmFtZSAhPSBudWxsICYmIHdlYkNvbnRlbnROYW1lLmVxdWFscyhqYXZhU291cmNlTmFtZSkpCi0JCQlyZXR1cm4gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuRm9sZGVyX25hbWVzX2Nhbm5vdF9iZV9lcXVhbF80OyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuRm9sZGVyX25hbWVzX2Nhbm5vdF9iZV9lcXVhbF80OyAKIAogCQkvLyBJZiBnaXZlbiBhIGphdmEgcHJvamVjdCwgY2hlY2sgdG8gbWFrZSBzdXJlIGN1cnJlbnQgcGFja2FnZSBmcmFnbWVudAogCQkvLyByb290IGZvbGRlcnMgZG8gbm90IG92ZXJsYXAgd2l0aCBuZXcgd2ViIGNvbnRlbnQgbmFtZQpAQCAtNDI5LDkgKzQzMCw5IEBACiAJCQkJCQkJCVN0cmluZyByb290Rm9sZGVyID0gcGF0aC5zZWdtZW50KDEpOwogCQkJCQkJCQlpZiAod2ViQ29udGVudE5hbWUuZXF1YWxzKHJvb3RGb2xkZXIpKSB7CiAJCQkJCQkJCQlpZiAocm9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpCi0JCQkJCQkJCQkJcmV0dXJuIFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkZvbGRlcl9uYW1lX2Nhbm5vdF9iZV90aGVfc2FtZV9hc19KYXZhX3NvdXJjZV9mb2xkZXJfNTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCXJldHVybiBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Gb2xkZXJfbmFtZV9jYW5ub3RfYmVfdGhlX3NhbWVfYXNfSmF2YV9zb3VyY2VfZm9sZGVyXzU7IAogCi0JCQkJCQkJCQlyZXR1cm4gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuRm9sZGVyX25hbWVfY2Fubm90X2JlX3RoZV9zYW1lX2FzX0phdmFfY2xhc3NfZm9sZGVyXzY7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCXJldHVybiBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Gb2xkZXJfbmFtZV9jYW5ub3RfYmVfdGhlX3NhbWVfYXNfSmF2YV9jbGFzc19mb2xkZXJfNjsgCiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9CkBAIC01MzQsNyArNTM1LDcgQEAKIAl9CiAKIAlwdWJsaWMgc3RhdGljIElWaXJ0dWFsRm9sZGVyIGdldFdlYkxpYkZvbGRlcihJVmlydHVhbENvbXBvbmVudCB3ZWJDb21wb25lbnQpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCX0lORiArICIvIiArICJsaWIiKTsKKwkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCX0lORiArICIvIiArICJsaWIiKTsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCiAJCUlWaXJ0dWFsRm9sZGVyIGxpYkZvbGRlciA9IHdlYkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0Rm9sZGVyKHBhdGgpOwogCQlyZXR1cm4gbGliRm9sZGVyOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL29wZXJhdGlvbnMvV2ViVG9vbGluZ0V4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJUb29saW5nRXhjZXB0aW9uLmphdmEKaW5kZXggYTYwYmY4NS4uYTA3M2U2NSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJUb29saW5nRXhjZXB0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvb3BlcmF0aW9ucy9XZWJUb29saW5nRXhjZXB0aW9uLmphdmEKQEAgLTI0LDEwICsyNCwxNCBAQAogICogVGhlIFdlYlRvb2xpbmdFeGNlcHRpb24gY2xhc3MgaXMgdGhlIGdlbmVyaWMgY2xhc3MgZm9yIGV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSB3ZWIgdG9vbGluZy4KICAqLwogcHVibGljIGNsYXNzIFdlYlRvb2xpbmdFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBWF9FUlJPUl9NRVNTQUdFID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuT3BlcmF0aW9uX2ZhaWxlZF9kdWVfdG9fU0FfRVJST1JfOyAvLyROT04tTkxTLTEkID0gIk9wZXJhdGlvbiBmYWlsZWQgZHVlIHRvIFNBWCBlcnJvcjogIgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElPX0VSUk9SX01FU1NBR0UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5PcGVyYXRpb25fZmFpbGVkX2R1ZV90b19JT19FUlJPUl87IC8vJE5PTi1OTFMtMSQgPSAiT3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gSU8gZXJyb3I6ICIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JFX0VSUk9SX01FU1NBR0UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5PcGVyYXRpb25fZmFpbGVkX2R1ZV90b19Db19FUlJPUl87IC8vJE5PTi1OTFMtMSQgPSAiT3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gQ29yZSBlcnJvcjogIgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTU9ERUxfRVJST1JfTUVTU0FHRSA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLk9wZXJhdGlvbl9mYWlsZWRfZHVlX3RvX0phX0VSUk9SXzsgLy8kTk9OLU5MUy0xJCA9ICJPcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBKYXZhIE1vZGVsIGVycm9yOiAiCisJLyoqCisJICogCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTcyMTc2NTY3Mzc5OTA1NTEyMkw7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FYX0VSUk9SX01FU1NBR0UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5PcGVyYXRpb25fZmFpbGVkX2R1ZV90b19TQV9FUlJPUl87IC8vID0gIk9wZXJhdGlvbiBmYWlsZWQgZHVlIHRvIFNBWCBlcnJvcjogIgorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElPX0VSUk9SX01FU1NBR0UgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5PcGVyYXRpb25fZmFpbGVkX2R1ZV90b19JT19FUlJPUl87IC8vID0gIk9wZXJhdGlvbiBmYWlsZWQgZHVlIHRvIElPIGVycm9yOiAiCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRV9FUlJPUl9NRVNTQUdFID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuT3BlcmF0aW9uX2ZhaWxlZF9kdWVfdG9fQ29fRVJST1JfOyAvLyA9ICJPcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBDb3JlIGVycm9yOiAiCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9NT0RFTF9FUlJPUl9NRVNTQUdFID0gUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuT3BlcmF0aW9uX2ZhaWxlZF9kdWVfdG9fSmFfRVJST1JfOyAvLyA9ICJPcGVyYXRpb24gZmFpbGVkIGR1ZSB0byBKYXZhIE1vZGVsIGVycm9yOiAiCiAKIAkvKioKIAkgKiBDcmVhdGUgYSBuZXcgV2ViVG9vbGluZ0V4Y2VwdGlvbiB3aXRoIG5vIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi91dGlsL1dlYkFydGlmYWN0RWRpdFV0aWxpdGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvdXRpbC9XZWJBcnRpZmFjdEVkaXRVdGlsaXRpZXMuamF2YQppbmRleCBiZTAyMmY4Li5lZWJhN2FiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi91dGlsL1dlYkFydGlmYWN0RWRpdFV0aWxpdGllcy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3V0aWwvV2ViQXJ0aWZhY3RFZGl0VXRpbGl0aWVzLmphdmEKQEAgLTEyLDcgKzEyLDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKQEAgLTI2LDcgKzI2LDcgQEAKIAkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7CiAJCQlXZWJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7CiAJCQl0cnkgewotCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7CisJCQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewogCQkJCQllZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKIAkJCQkJV2ViQXBwIHdlYmFwcCA9IGVkaXQuZ2V0V2ViQXBwKCk7CiAJCQkJCWlmICh3ZWJhcHAuZ2V0U2VydmxldE5hbWVkKHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKSkgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3V0aWwvV2ViRWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYi91dGlsL1dlYkVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhCmluZGV4IGQ5NTRhOWMuLjFlZmZkYWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2ViL3V0aWwvV2ViRWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWIvdXRpbC9XZWJFZGl0QWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMTEsNyArMTEsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudXRpbDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7CkBAIC0zMyw3ICszMyw3IEBACiAJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7CiAJCWlmIChhZGFwdGVyVHlwZSA9PSBXZWJBcnRpZmFjdEVkaXQuQURBUFRFUl9UWVBFIHx8IGFkYXB0ZXJUeXBlID09IEFydGlmYWN0RWRpdC5BREFQVEVSX1RZUEUpIHsKIAkJCUFydGlmYWN0RWRpdE1vZGVsIGVkaXRNb2RlbCA9IChBcnRpZmFjdEVkaXRNb2RlbCkgYWRhcHRhYmxlT2JqZWN0OwotCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoZWRpdE1vZGVsLmdldFByb2plY3QoKSkpCisJCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGVkaXRNb2RlbC5nZXRQcm9qZWN0KCkpKQogCQkJCXJldHVybiBuZXcgV2ViQXJ0aWZhY3RFZGl0KChBcnRpZmFjdEVkaXRNb2RlbCkgYWRhcHRhYmxlT2JqZWN0KTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL2NvbXBvbmVudGNvcmUvdXRpbC9XZWJBcnRpZmFjdEVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL2NvbXBvbmVudGNvcmUvdXRpbC9XZWJBcnRpZmFjdEVkaXQuamF2YQppbmRleCBiMGVhYTVlLi5hOTk1ZWQ5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9jb21wb25lbnRjb3JlL3V0aWwvV2ViQXJ0aWZhY3RFZGl0LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvY29tcG9uZW50Y29yZS91dGlsL1dlYkFydGlmYWN0RWRpdC5qYXZhCkBAIC0zMyw3ICszMyw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZS5KYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkNvbXBvbmVudExvYWRTdHJhdGVneUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuV2ViVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHBSZXNvdXJjZTsKQEAgLTY5LDcgKzcxLDcgQEAKICAqLwogcHVibGljIGNsYXNzIFdlYkFydGlmYWN0RWRpdCBleHRlbmRzIEVudGVycHJpc2VBcnRpZmFjdEVkaXQgaW1wbGVtZW50cyBJQXJ0aWZhY3RFZGl0RmFjdG9yeSB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0NPTlRFTlRfVFlQRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJERCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9DT05URU5UX1RZUEUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViREQiOyAvLyROT04tTkxTLTEkCiAJLyoqCiAJICogPHA+CiAJICogSWRlbnRpZmllciB1c2VkIHRvIGxpbmsgV2ViQXJ0aWZhY3RFZGl0IHRvIGEgV2ViRWRpdEFkYXB0ZXJGYWN0b3J5IHtAc2VlCkBAIC05NCw2ICs5Niw3IEBACiAJCXN1cGVyKGFNb2R1bGUpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBCaW5hcnlDb21wb25lbnRIZWxwZXIgaW5pdEJpbmFyeUNvbXBvbmVudEhlbHBlcihJVmlydHVhbENvbXBvbmVudCBiaW5hcnlNb2R1bGUpIHsKIAkJcmV0dXJuIG5ldyBKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIoYmluYXJ5TW9kdWxlKTsKIAl9CkBAIC0yNjYsNyArMjY5LDcgQEAKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdlYk1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7CiAJCWlmICghaXNWYWxpZEVkaXRhYmxlTW9kdWxlKGFNb2R1bGUpKQogCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChhTW9kdWxlLmdldFByb2plY3QoKSk7CisJCXJldHVybiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoYU1vZHVsZS5nZXRQcm9qZWN0KCkpOwogCX0KIAogCS8qKgpAQCAtMzEwLDYgKzMxMyw3IEBACiAJICogQHJldHVybiBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgSjJFRSBTcGVjIHZlcnNpb24KIAkgKiAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uKCkgewogCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKIAkJcmV0dXJuICgoV2ViQXBwUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkuZ2V0SjJFRVZlcnNpb25JRCgpOwpAQCAtMzI1LDYgKzMyOSw3IEBACiAJICogQHJldHVybiBFT2JqZWN0CiAJICogCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkgewogCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKIAkJTGlzdCBjb250ZW50cyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRDb250ZW50cygpOwpAQCAtMzQ1LDYgKzM1MCw3IEBACiAJICogQHJldHVybiBSZXNvdXJjZQogCSAqIAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgewogCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKIAkJaWYgKGlzQmluYXJ5KCkpIHsKQEAgLTQ1MCw3ICs0NTYsNyBAQAogCQkJfSBjYXRjaCAoamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBleCkgewogCiAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJV2ViUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJfQogCQl9CiAJfQpAQCAtNDgyLDYgKzQ4OCw3IEBACiAJICogCiAJICogQHJldHVybiB0aGUgZU9iamVjdCBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgcm9vdAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdCgpIHsKIAkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7CiAJCWlmIChpc0JpbmFyeSgpKSB7CkBAIC01MDAsNiArNTA3LDcgQEAKIAkgKiAKIAkgKiBAcmV0dXJuIHRoZSBlT2JqZWN0IGluc3RhbmNlIG9mIHRoZSBtb2RlbCByb290CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7CiAJCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwogCQlpZiAoaXNCaW5hcnkoKSkgewpAQCAtNTYwLDcgKzU2OCw3IEBACiAJICogQHJldHVybiBjb250ZXh0Um9vdCBTdHJpbmcKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldFNlcnZlckNvbnRleHRSb290KElQcm9qZWN0IGVhclByb2plY3QpIHsKLQkJaWYgKGVhclByb2plY3QgPT0gbnVsbCB8fCAhSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGVhclByb2plY3QpKQorCQlpZiAoZWFyUHJvamVjdCA9PSBudWxsIHx8ICFKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChlYXJQcm9qZWN0KSkKIAkJCXJldHVybiBnZXRTZXJ2ZXJDb250ZXh0Um9vdCgpOwogCQlFQVJBcnRpZmFjdEVkaXQgZWFyRWRpdCA9IG51bGw7CiAJCVN0cmluZyBjb250ZXh0Um9vdCA9IG51bGw7CkBAIC01ODMsNyArNTkxLDcgQEAKIAkgKiBAcGFyYW0gYUNvbnRleHRSb290CiAJICovCiAJcHVibGljIHZvaWQgc2V0U2VydmVyQ29udGV4dFJvb3QoSVByb2plY3QgZWFyUHJvamVjdCwgU3RyaW5nIGFDb250ZXh0Um9vdCkgewotCQlpZiAoZWFyUHJvamVjdCA9PSBudWxsIHx8ICFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoZWFyUHJvamVjdCkpCisJCWlmIChlYXJQcm9qZWN0ID09IG51bGwgfHwgIUphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGVhclByb2plY3QpKQogCQkJc2V0U2VydmVyQ29udGV4dFJvb3QoYUNvbnRleHRSb290KTsKIAkJRUFSQXJ0aWZhY3RFZGl0IGVhckVkaXQgPSBudWxsOwogCQl0cnkgewpAQCAtNjI5LDYgKzYzNyw3IEBACiAJCXJldHVybiBnZXRXZWJBcnRpZmFjdEVkaXRGb3JXcml0ZShhQ29tcG9uZW50KTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQXJjaGl2ZSBhc0FyY2hpdmUoYm9vbGVhbiBpbmNsdWRlU291cmNlLCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewogCQlyZXR1cm4gYXNBcmNoaXZlKGluY2x1ZGVTb3VyY2UsIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzLCBmYWxzZSk7CiAJfQpAQCAtNjM3LDE2ICs2NDYsMTUgQEAKIAkJaWYgKGlzQmluYXJ5KCkpIHsKIAkJCUphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSAoSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyKWdldEJpbmFyeUNvbXBvbmVudEhlbHBlcigpOwogCQkJcmV0dXJuIGhlbHBlci5hY2Nlc3NMZWdhY3lBcmNoaXZlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlXZWJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGxvYWRlciA9IG5ldyBXZWJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKGdldENvbXBvbmVudCgpLCBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyk7Ci0JCQlsb2FkZXIuc2V0RXhwb3J0U291cmNlKGluY2x1ZGVTb3VyY2UpOwotCQkJbG9hZGVyLnNldFJlYWRPbmx5KHJlYWRPbmx5KTsKLQkJCVN0cmluZyB1cmkgPSBNb2R1bGVVUklVdGlsLmdldEhhbmRsZVN0cmluZyhnZXRDb21wb25lbnQoKSk7Ci0JCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQlvcHRpb25zLnNldExvYWRTdHJhdGVneShsb2FkZXIpOwotCQkJb3B0aW9ucy5zZXRJc1JlYWRPbmx5KHJlYWRPbmx5KTsKLQkJCXJldHVybiBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0Uub3BlbldBUkZpbGUob3B0aW9ucywgdXJpKTsKIAkJfQorCQlXZWJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGxvYWRlciA9IG5ldyBXZWJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKGdldENvbXBvbmVudCgpLCBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyk7CisJCWxvYWRlci5zZXRFeHBvcnRTb3VyY2UoaW5jbHVkZVNvdXJjZSk7CisJCWxvYWRlci5zZXRSZWFkT25seShyZWFkT25seSk7CisJCVN0cmluZyB1cmkgPSBNb2R1bGVVUklVdGlsLmdldEhhbmRsZVN0cmluZyhnZXRDb21wb25lbnQoKSk7CisJCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKKwkJb3B0aW9ucy5zZXRMb2FkU3RyYXRlZ3kobG9hZGVyKTsKKwkJb3B0aW9ucy5zZXRJc1JlYWRPbmx5KHJlYWRPbmx5KTsKKwkJcmV0dXJuIENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuV0FSRmlsZShvcHRpb25zLCB1cmkpOwogCX0KIAogCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVEZXBsb3ltZW50RGVzY3JpcHRvcihJUHJvamVjdCBwcm9qZWN0LCBpbnQgdmVyc2lvbikgewpAQCAtNjYxLDE0ICs2NjksMTcgQEAKIAkJCXdlYkVkaXQuZGlzcG9zZSgpOwogCQl9CiAJfQorCUBPdmVycmlkZQogCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKElNb2RlbFByb3ZpZGVyKWdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7CisJCXJldHVybiBnZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiAoSU1vZGVsUHJvdmlkZXIpZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOworCQlyZXR1cm4gZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG1vZGlmeShSdW5uYWJsZSBydW5uYWJsZSwgSVBhdGggbW9kZWxQYXRoKSB7CiAJCXNldFdyaXRhYmxlRWRpdChnZXRXZWJBcnRpZmFjdEVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpKTsKIAkJdHJ5ewpAQCAtNjc5LDE1ICs2OTAsMTggQEAKIAkJCX0KIAkJCQogCQl9ZmluYWxseXsKLQkJCWdldFdyaXRhYmxlRWRpdCgpLmRpc3Bvc2UoKTsKKwkJCWlmIChnZXRXcml0YWJsZUVkaXQoKSAhPSBudWxsKQorCQkJCWdldFdyaXRhYmxlRWRpdCgpLmRpc3Bvc2UoKTsKIAkJCXNldFdyaXRhYmxlRWRpdChudWxsKTsKIAkJfQogCX0KIAogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSB7CiAJCXJldHVybiBXRUJfQ09OVEVOVF9UWVBFOwogCX0KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgVVJJIGdldFJvb3RVUkkoKSB7CiAJCXJldHVybiBKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUklfT0JKOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQppbmRleCAyMWM0NGU2Li5lYjMwYWFmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L0lXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9JV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCkBAIC0yMyw1ICsyMyw4IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9ST09UID0gIklXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFWFRfUk9PVCI7IC8vJE5PTi1OTFMtMSQKIAkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfRk9MREVSID0gIklXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVIiOyAvLyROT04tTkxTLTEkCisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTF9XRUJfTElCUkFSWSA9ICJJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5JTlNUQUxMX1dFQl9MSUJSQVJZIjsgLy8kTk9OLU5MUy0xJAorCiAKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvSVdlYkZyYWdtZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9JV2ViRnJhZ21lbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwZWI4OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvSVdlYkZyYWdtZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworCitwdWJsaWMgaW50ZXJmYWNlIElXZWJGcmFnbWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgeworCS8qKgorCSAqIFRoaXMgZmllbGQgc2hvdWxkIG5vdCBiZSB1c2VkLiAgSXQgaXMgbm90IHBhcnQgb2YgdGhlIEFQSSBhbmQgbWF5IGJlIG1vZGlmaWVkIGluIHRoZSBmdXR1cmUuCisJICovCisJcHVibGljIHN0YXRpYyBDbGFzcyBfcHJvdmlkZXJfY2xhc3MgPSBXZWJGcmFnbWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmNsYXNzOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVIgPSAiSVdlYkZyYWdtZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05URU5UX0RJUiI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVE9fV0FSID0gIklXZWJGcmFnbWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX1dBUiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfUFJPSkVDVF9OQU1FID0gIklXZWJGcmFnbWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuV0FSX1BST0pFQ1RfTkFNRSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX1dBUl9OQU1FID0gIklXZWJGcmFnbWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuTEFTVF9XQVJfTkFNRSI7CS8vJE5PTi1OTFMtMSQKKwkKKwl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L0lXZWJGcmFnbWVudFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvSVdlYkZyYWdtZW50UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzJkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L0lXZWJGcmFnbWVudFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldDsKKworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVdlYkZyYWdtZW50UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyAgCisgICBleHRlbmRzIElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXN7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVE9fV0FSID0gIklXZWJGcmFnbWVudFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX1dBUiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfUFJPSkVDVF9OQU1FID0gIklXZWJGcmFnbWVudFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuV0FSX1BST0pFQ1RfTkFNRSI7IC8vJE5PTi1OTFMtMSQKKwkKKwkKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCBhMzAyNjg2Li5iNjk2YzdiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0xMCw0MSArMTAsNzcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldDsKIAoraW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXRJbnN0YWxsQ29uZmlnLkNoYW5nZUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVByZWZlcmVuY2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuUHJvZHVjdE1hbmFnZXI7CiAKK2ltcG9ydCBjb20uaWJtLmljdS50ZXh0LlVURjE2OwogaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwogCiBwdWJsaWMgY2xhc3MgV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7CiAKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVKYXZhRmFjZXRTb3VyY2VGb2xkZXJzQ2hhbmdlZCggZmluYWwgQ2hhbmdlRXZlbnQgZXZlbnQgKQorICAgIHsKKyAgICAgICAgZmluYWwgTGlzdDxJUGF0aD4gc291cmNlRm9sZGVycyA9IGV2ZW50LmdldEphdmFGYWNldEluc3RhbGxDb25maWcoKS5nZXRTb3VyY2VGb2xkZXJzKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzb3VyY2VGb2xkZXIgPSAoIHNvdXJjZUZvbGRlcnMuaXNFbXB0eSgpID8gbnVsbCA6IHNvdXJjZUZvbGRlcnMuZ2V0KCAwICkudG9Qb3J0YWJsZVN0cmluZygpICk7CisgICAgICAgIGdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KCBTT1VSQ0VfRk9MREVSLCBzb3VyY2VGb2xkZXIgKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKIAlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7CiAJCVNldCBuYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKIAkJbmFtZXMuYWRkKENPTlRFWFRfUk9PVCk7CiAJCW5hbWVzLmFkZChTT1VSQ0VfRk9MREVSKTsKKwkJbmFtZXMuYWRkKElOU1RBTExfV0VCX0xJQlJBUlkpOwogCQlyZXR1cm4gbmFtZXM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05GSUdfRk9MREVSKSkgeworCQkJaWYgKG1vZGVsLmlzUHJvcGVydHlTZXQoRkFDRVRfUFJPSkVDVF9OQU1FKSkKKwkJCXsKKwkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUpOworCQkJCUlQcm9qZWN0IHByb2plY3QgPSAocHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwKSA/IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkgOiBudWxsOworCQkJCQorCQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkgeworCQkJCQlpZiAoTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKKwkJCQkJeworCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIHRydWUpOworCQkJCQkJSVZpcnR1YWxGb2xkZXIgZWpicm9vdCA9IGMuZ2V0Um9vdEZvbGRlcigpOworCQkJCQkJSVBhdGggY29uZmlnRm9sZGVyUGF0aCA9IEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50LmdldERlZmF1bHREZXBsb3ltZW50RGVzY3JpcHRvckZvbGRlcihlamJyb290KTsKKwkJCQkJCWlmIChjb25maWdGb2xkZXJQYXRoICE9IG51bGwgJiYgcHJvamVjdC5nZXRGb2xkZXIoY29uZmlnRm9sZGVyUGF0aCkuZXhpc3RzKCkpCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuIGNvbmZpZ0ZvbGRlclBhdGgudG9TdHJpbmcoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KIAkJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSjJFRVByZWZlcmVuY2VzLktleXMuV0VCX0NPTlRFTlRfRk9MREVSKTsKIAkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNPVVJDRV9GT0xERVIpKSB7CiAJCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkRZTl9XRUJfU1JDX0ZPTERFUik7CkBAIC01Niw5MCArOTIsNzUgQEAKIAkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSkucmVwbGFjZSgnICcsICdfJyk7CiAJCQlyZXR1cm4gcHJvamVjdE5hbWUgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUOwogCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoR0VORVJBVEVfREQpKSB7Ci0JCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pZ2V0UHJvcGVydHkoRkFDRVRfVkVSU0lPTik7Ci0JCQlpZihmYWNldFZlcnNpb24gPT0gV2ViRmFjZXRVdGlscy5XRUJfMjUpeworCQkJU3RyaW5nIGZhY2V0VmVyc2lvbiA9IGdldFN0cmluZ1Byb3BlcnR5KEZBQ0VUX1ZFUlNJT05fU1RSKTsKKwkJCWlmKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl81X1RFWFQuZXF1YWxzKGZhY2V0VmVyc2lvbikpIHsKIAkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oSjJFRVByZWZlcmVuY2VzLktleXMuRFlOQU1JQ19XRUJfR0VORVJBVEVfREQpKTsKIAkJCX0KKwkJCWVsc2UgaWYoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzBfVEVYVC5lcXVhbHMoZmFjZXRWZXJzaW9uKSkgeworCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihKMkVFUHJlZmVyZW5jZXMuS2V5cy5FRTZfRFlOQU1JQ19XRUJfR0VORVJBVEVfREQpKTsKKwkJCX0KKwkJCQogCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT1VUUFVUX0ZPTERFUikpIHsKLQkJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSjJFRVByZWZlcmVuY2VzLktleXMuRFlOX1dFQl9PVVRQVVRfRk9MREVSKTsJCisJCX1lbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElOU1RBTExfV0VCX0xJQlJBUlkpKXsKKwkJCXJldHVybiBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHMuZ2V0RGVmYXVsdFVzZVdlYkFwcExpYnJhcmllcygpOwogCQl9CiAJCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewogCQlpZiAoQUREX1RPX0VBUi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewogCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoQ09OVEVYVF9ST09ULCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwogCQl9IGVsc2UgaWYgKEZBQ0VUX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewogCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoQ09OVEVYVF9ST09ULCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOworCQkJaWYgKCFtb2RlbC5pc1Byb3BlcnR5U2V0KENPTkZJR19GT0xERVIpKSB7CisJCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoQ09ORklHX0ZPTERFUiwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7CisJCQl9CiAJCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05GSUdfRk9MREVSKSkgewogCQkJcmV0dXJuIHRydWU7CiAJCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTT1VSQ0VfRk9MREVSKSkgCiAJCXsKLQkJICAgIGZpbmFsIEphdmFGYWNldEluc3RhbGxDb25maWcgamF2YU1vZGVsID0gZmluZEphdmFGYWNldEluc3RhbGxDb25maWcoKTsKLQkJICAgIAotCQkgICAgaWYoIGphdmFNb2RlbCAhPSBudWxsICkKKwkJICAgIGlmKCB0aGlzLmphdmFGYWNldEluc3RhbGxDb25maWcgIT0gbnVsbCApCiAJCSAgICB7Ci0JCSAgICAgICAgZmluYWwgSVBhdGggc291cmNlRm9sZGVyCi0JCSAgICAgICAgICAgID0gcHJvcGVydHlWYWx1ZSA9PSBudWxsID8gbnVsbCA6IG5ldyBQYXRoKCAoU3RyaW5nKSBwcm9wZXJ0eVZhbHVlICk7Ci0JCSAgICAgICAgCi0JCSAgICAgICAgamF2YU1vZGVsLnNldFNvdXJjZUZvbGRlciggc291cmNlRm9sZGVyICk7CisJCSAgICAgICAgaWYoIHByb3BlcnR5VmFsdWUgPT0gbnVsbCApCisJCSAgICAgICAgeworCQkgICAgICAgICAgICB0aGlzLmphdmFGYWNldEluc3RhbGxDb25maWcuc2V0U291cmNlRm9sZGVyKCBudWxsICk7CisJCSAgICAgICAgfQorCQkgICAgICAgIGVsc2UKKwkJICAgICAgICB7CisJCSAgICAgICAgICAgIGZpbmFsIElQYXRoIHNvdXJjZUZvbGRlciA9IG5ldyBQYXRoKCAoU3RyaW5nKSBwcm9wZXJ0eVZhbHVlICk7CisJCSAgICAgICAgICAgIAorCQkgICAgICAgICAgICBpZiggISB0aGlzLmphdmFGYWNldEluc3RhbGxDb25maWcuZ2V0U291cmNlRm9sZGVycygpLmNvbnRhaW5zKCBzb3VyY2VGb2xkZXIgKSApCisJCSAgICAgICAgICAgIHsKKwkJICAgICAgICAgICAgICAgIHRoaXMuamF2YUZhY2V0SW5zdGFsbENvbmZpZy5zZXRTb3VyY2VGb2xkZXIoIHNvdXJjZUZvbGRlciApOworCQkgICAgICAgICAgICB9CisJCSAgICAgICAgfQogCQkJfQogCQl9CisJCQogCQlyZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKIAl9Ci0JCi0JcHJpdmF0ZSBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnIGZpbmRKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKCkKLQl7Ci0gICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjIAotICAgICAgICAgICAgPSAoSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkpIHRoaXMubW9kZWwuZ2V0UHJvcGVydHkoIEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkgKTsKLSAgICAgICAgCi0gICAgICAgIGlmKCBmcGp3YyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbiBqYXZhSW5zdGFsbEFjdGlvbgotICAgICAgICAgICAgICAgID0gZnBqd2MuZ2V0UHJvamVjdEZhY2V0QWN0aW9uKCBKYXZhRmFjZXRVdGlscy5KQVZBX0ZBQ0VUICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBjb25maWcgPSBqYXZhSW5zdGFsbEFjdGlvbi5nZXRDb25maWcoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIGNvbmZpZyBpbnN0YW5jZW9mIEphdmFGYWNldEluc3RhbGxDb25maWcgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoSmF2YUZhY2V0SW5zdGFsbENvbmZpZykgY29uZmlnOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoSmF2YUZhY2V0SW5zdGFsbENvbmZpZykgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKCBjb25maWcsIEphdmFGYWNldEluc3RhbGxDb25maWcuY2xhc3MgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0JfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlyZXR1cm4gc3VwZXIuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgaW50IGNvbnZlcnRGYWNldFZlcnNpb25Ub0oyRUVWZXJzaW9uKElQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24pIHsKIAkJcmV0dXJuIEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0V2ViVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIG5hbWUpIHsKIAkJaWYgKG5hbWUuZXF1YWxzKENPTlRFWFRfUk9PVCkpIHsKIAkJCXJldHVybiB2YWxpZGF0ZUNvbnRleHRSb290KGdldFN0cmluZ1Byb3BlcnR5KENPTlRFWFRfUk9PVCkpOwogCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFNPVVJDRV9GT0xERVIpKSB7CiAJCQlJU3RhdHVzIHN0YXR1cyA9ICB2YWxpZGF0ZUZvbGRlck5hbWUoZ2V0U3RyaW5nUHJvcGVydHkoU09VUkNFX0ZPTERFUikpOwogCQkJaWYoIHN0YXR1cy5pc09LKCkgKXsKLQkJCQlzdGF0dXMgPSB2YWxpZGF0ZUZvbGRlckZvckNoYXJhY3RlcnMoZ2V0U3RyaW5nUHJvcGVydHkoU09VUkNFX0ZPTERFUikpOwotCQkJfQkJCQotCQkJaWYoIHN0YXR1cy5pc09LKCkgKXsKLQkJCQlzdGF0dXMgPSB2YWxpZGF0ZVNvdXJjZUFuZENvbnRlbnRGb2xkZXJVbmlxdWVuZXNzKCk7CisJCQkJcmV0dXJuIHZhbGlkYXRlU291cmNlQW5kQ29udGVudEZvbGRlclVuaXF1ZW5lc3MoKTsKIAkJCX0KLQkJCWlmKHN0YXR1cy5pc09LKCkpewotCQkJCVN0cmluZyBvdXRmb2xkZXJOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoT1VUUFVUX0ZPTERFUik7Ci0JCQkJU3RyaW5nIHNyY2ZvbGRlck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShTT1VSQ0VfRk9MREVSKTsKLQkJCQlzdGF0dXMgPSB2YWxpZGF0ZVNvdXJjZUFuZE91dHB1dEZvbGRlckNhc2Uoc3JjZm9sZGVyTmFtZSwgb3V0Zm9sZGVyTmFtZSk7Ci0JCQl9CQkJCQogCQkJcmV0dXJuIHN0YXR1czsJCQkKLQkJCQogCQl9ZWxzZSBpZiAobmFtZS5lcXVhbHMoIENPTkZJR19GT0xERVIgKSkgewogCQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZSggQ09ORklHX0ZPTERFUiApOwogCQkJaWYoIHN0YXR1cy5pc09LKCkgKXsKQEAgLTE0Nyw0NSArMTY4LDUxIEBACiAJCQl9CiAJCQlpZiggc3RhdHVzLmlzT0soKSApewogCQkJCVN0cmluZyBjb25maWdGb2xkZXIgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDT05GSUdfRk9MREVSKTsKLQkJCQlTdHJpbmcgb3V0Rm9sZGVyID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoT1VUUFVUX0ZPTERFUik7Ci0JCQkJc3RhdHVzID0gdmFsaWRhdGVXZWJDb25maWdBbmRPdXRwdXRGb2xkZXIoY29uZmlnRm9sZGVyLCBvdXRGb2xkZXIpOworCQkJCVN0cmluZyBvdXRGb2xkZXIgPSBudWxsOworCQkJICAgIGlmKCBqYXZhRmFjZXRJbnN0YWxsQ29uZmlnICE9IG51bGwgKXsKKwkJCSAgICAJb3V0Rm9sZGVyID0gamF2YUZhY2V0SW5zdGFsbENvbmZpZy5nZXREZWZhdWx0T3V0cHV0Rm9sZGVyKCkudG9TdHJpbmcoKTsKKwkJCQl9CQkJCQorCQkJICAgIGlmKCBvdXRGb2xkZXIgIT0gbnVsbCApCisJCQkgICAgCXN0YXR1cyA9IHZhbGlkYXRlV2ViQ29uZmlnQW5kT3V0cHV0Rm9sZGVyKGNvbmZpZ0ZvbGRlciwgb3V0Rm9sZGVyKTsKIAkJCX0KIAkJCXJldHVybiBzdGF0dXM7Ci0JCX1lbHNlIGlmIChuYW1lLmVxdWFscyhPVVRQVVRfRk9MREVSKSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZShPVVRQVVRfRk9MREVSKTsKLQkJCWlmKHN0YXR1cy5pc09LKCkpewotCQkJCVN0cmluZyBjb25maWdGb2xkZXIgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDT05GSUdfRk9MREVSKTsKLQkJCQlTdHJpbmcgb3V0Rm9sZGVyID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoT1VUUFVUX0ZPTERFUik7Ci0JCQkJc3RhdHVzID0gdmFsaWRhdGVXZWJDb25maWdBbmRPdXRwdXRGb2xkZXIoY29uZmlnRm9sZGVyLCBvdXRGb2xkZXIpOwotCQkJfQotCQkJaWYoc3RhdHVzLmlzT0soKSl7Ci0JCQkJU3RyaW5nIG91dGZvbGRlck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShPVVRQVVRfRk9MREVSKTsKLQkJCQlTdHJpbmcgc3JjZm9sZGVyTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFNPVVJDRV9GT0xERVIpOwotCQkJCXN0YXR1cyA9IHZhbGlkYXRlU291cmNlQW5kT3V0cHV0Rm9sZGVyQ2FzZShzcmNmb2xkZXJOYW1lLCBvdXRmb2xkZXJOYW1lKTsKLQkJCX0JCQkJCi0JCQlyZXR1cm4gc3RhdHVzOwogCQl9CiAJCS8vIHRoZSBzdXBlcmNsYXNzIHZhbGlkYXRlcyB0aGUgY29udGVudCBkaXJlY3Rvcnkgd2hpY2ggaXMgYWN0dWFsbHkgYSAiQ09ORklHX0ZPTERFUiIKIAkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKG5hbWUpOwogCX0KIAogCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlQ29udGV4dFJvb3QoU3RyaW5nIGNvbnRleHRSb290KSB7Ci0JCWlmIChjb250ZXh0Um9vdCA9PSBudWxsKSB7CisJCWlmIChjb250ZXh0Um9vdCA9PSBudWxsIHx8IGNvbnRleHRSb290Lmxlbmd0aCgpID09IDApIHsKIAkJCXJldHVybiBKMkVFUGx1Z2luLm5ld0Vycm9yU3RhdHVzKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5Db250ZXh0X1Jvb3RfY2Fubm90X2JlX2VtcHR5XzIsIG5ldyBPYmplY3RbXXtjb250ZXh0Um9vdH0pLCBudWxsKTsKIAkJfSBlbHNlIGlmIChjb250ZXh0Um9vdC50cmltKCkuZXF1YWxzKGNvbnRleHRSb290KSkgewogCQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbnRleHRSb290LCAiLiIpOyAvLyROT04tTkxTLTEkCiAJCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKIAkJCQlTdHJpbmcgdG9rZW4gPSBzdG9rLm5leHRUb2tlbigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoKCk7IGkrKykgewotCQkJCQlpZiAoISh0b2tlbi5jaGFyQXQoaSkgPT0gJ18nKSAmJiAhKHRva2VuLmNoYXJBdChpKSA9PSAnLScpICYmICEodG9rZW4uY2hhckF0KGkpID09ICcvJykgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCh0b2tlbi5jaGFyQXQoaSkpID09IGZhbHNlKSB7Ci0JCQkJCQlPYmplY3RbXSBpbnZhbGlkQ2hhciA9IG5ldyBPYmplY3RbXXsobmV3IENoYXJhY3Rlcih0b2tlbi5jaGFyQXQoaSkpKS50b1N0cmluZygpfTsKLQkJCQkJCVN0cmluZyBlcnJvclN0YXR1cyA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5UaGVfY2hhcmFjdGVyX2lzX2ludmFsaWRfaW5fYV9jb250ZXh0X3Jvb3QsIGludmFsaWRDaGFyKTsgLy8kTk9OLU5MUy0xJAorCQkJCWludCBjcDsKKwkJICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRva2VuLmxlbmd0aCgpOyBpICs9IFVURjE2LmdldENoYXJDb3VudChjcCkpIHsKKwkJICAgICAgICAgICAgY3AgPSBVVEYxNi5jaGFyQXQodG9rZW4sIGkpOworCQkJCQlpZih0b2tlbi5jaGFyQXQoaSkgPT0gJyAnKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gSjJFRVBsdWdpbi5uZXdFcnJvclN0YXR1cyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuTmFtZXNfY2Fubm90X2NvbnRhaW5fd2hpdGVzcGFjZV8sIG5ldyBPYmplY3RbXXtjb250ZXh0Um9vdH0pLCBudWxsKTsgCisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoISh0b2tlbi5jaGFyQXQoaSkgPT0gJ18nKSAmJiAhKHRva2VuLmNoYXJBdChpKSA9PSAnLScpICYmICEodG9rZW4uY2hhckF0KGkpID09ICcvJykgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCh0b2tlbi5jaGFyQXQoaSkpID09IGZhbHNlKSB7CisJCQkJCQlTdHJpbmcgaW52YWxpZENoYXJTdHJpbmcgPSBudWxsOworCQkJCQkJaWYgKFVURjE2LmdldENoYXJDb3VudChjcCk+MSkKKwkJCQkJCXsKKwkJCQkJCQlpbnZhbGlkQ2hhclN0cmluZyA9IFVURjE2LnZhbHVlT2YoY3ApOyAKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlpbnZhbGlkQ2hhclN0cmluZyA9IChuZXcgQ2hhcmFjdGVyKHRva2VuLmNoYXJBdChpKSkpLnRvU3RyaW5nKCk7CisJCQkJCQl9CisJCQkJCQlPYmplY3RbXSBpbnZhbGlkQ2hhciA9IG5ldyBPYmplY3RbXXtpbnZhbGlkQ2hhclN0cmluZ307CisJCQkJCQlTdHJpbmcgZXJyb3JTdGF0dXMgPSBQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuVGhlX2NoYXJhY3Rlcl9pc19pbnZhbGlkX2luX2FfY29udGV4dF9yb290LCBpbnZhbGlkQ2hhcik7CiAJCQkJCQlyZXR1cm4gSjJFRVBsdWdpbi5uZXdFcnJvclN0YXR1cyhlcnJvclN0YXR1cywgbnVsbCk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0gZWxzZQotCQkJcmV0dXJuIEoyRUVQbHVnaW4ubmV3RXJyb3JTdGF0dXMoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLk5hbWVzX2Nhbm5vdF9iZWdpbl9vcl9lbmRfd2l0aF93aGl0ZXNwYWNlXzUsIG5ldyBPYmplY3RbXXtjb250ZXh0Um9vdH0pLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIEoyRUVQbHVnaW4ubmV3RXJyb3JTdGF0dXMoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLk5hbWVzX2Nhbm5vdF9jb250YWluX3doaXRlc3BhY2VfLCBuZXcgT2JqZWN0W117Y29udGV4dFJvb3R9KSwgbnVsbCk7IAogCQlyZXR1cm4gT0tfU1RBVFVTOwogCX0KIAkKQEAgLTIwMyw3ICsyMzAsNyBAQAogCQogCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVdlYkNvbmZpZ0FuZE91dHB1dEZvbGRlcihTdHJpbmcgcmF3Q29uZmlnRm9sZGVyLCBTdHJpbmcgb3V0Rm9sZGVyKXsgCiAJCWlmKCBQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkpewotCQkJU3RyaW5nIGV4cGVjdGVkT3V0Rm9sZGVyID0gcmF3Q29uZmlnRm9sZGVyKyIvIitKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUzsKKwkJCVN0cmluZyBleHBlY3RlZE91dEZvbGRlciA9IHJhd0NvbmZpZ0ZvbGRlcisiLyIrSjJFRUNvbnN0YW50cy5XRUJfSU5GX0NMQVNTRVM7IC8vJE5PTi1OTFMtMSQKIAkJCWlmKCAhb3V0Rm9sZGVyLmVxdWFscyhleHBlY3RlZE91dEZvbGRlcikgKXsKIAkJCQlTdHJpbmcgbWVzc2FnZSA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyggUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuRFlOQU1JQ19XRUJfUEVSRk9STUFOQ0VfVkFMSURBVElPTiwKIAkJCQkJCW5ldyBPYmplY3RbXXtleHBlY3RlZE91dEZvbGRlcn0pOwpAQCAtMjExLDUgKzIzOCw1IEBACiAJCQl9CiAJCX0KIAkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9CisJfQkKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQppbmRleCBiNzJmMzk0Li4wYTU3YjY1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycwogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNyw2ICs3LDcgQEAKICAqCiAgKiBDb250cmlidXRvcnM6CiAgKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogICAgUm9iZXJ0byBTYW5jaGV6IChJQk0pIC0gU2V0IGRlZmF1bHQgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZvbGRlcgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldDsKQEAgLTE0LDcgKzE1LDYgQEAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIApAQCAtMzIsMTUgKzMyLDE0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuV3RwVXRpbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuQ2xhc3NwYXRoSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLkoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlsczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuY2xhc3NwYXRoLldlYkFwcExpYnJhcmllc0NvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIucGx1Z2luLldlYlBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKQEAgLTU3LDExICs1NiwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuUHJvZHVjdE1hbmFnZXI7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBXZWJGYWNldEluc3RhbGxEZWxlZ2F0ZSBleHRlbmRzIEoyRUVGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7CiAKQEAgLTEwMiwxNCArMTAxLDIyIEBACiAKIAkJCVN0cmluZyBjb250ZXh0Um9vdCA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFWFRfUk9PVCk7CiAJCQlzZXRDb250ZXh0Um9vdFByb3BlcnR5SWZOZWVkZWQoYywgY29udGV4dFJvb3QpOwotCQkJLy9zZXRPdXRwdXRGb2xkZXIobW9kZWwsIGMpOwotCQkJc2V0SmF2YU91dHB1dFByb3BlcnR5SWZOZWVkZWQobW9kZWwsIGMpOworCQkJc2V0T3V0cHV0Rm9sZGVyKG1vZGVsLCBjKTsKIAogCQkJZmluYWwgSVZpcnR1YWxGb2xkZXIgd2Vicm9vdCA9IGMuZ2V0Um9vdEZvbGRlcigpOwotCQkJaWYgKHdlYnJvb3QuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLmVxdWFscyhuZXcgUGF0aCgiLyIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXdlYnJvb3QuY3JlYXRlTGluayhuZXcgUGF0aCgiLyIgKyBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUikpLCAwLCBudWxsKTsgLy8kTk9OLU5MUy0xJAorCQkJaWYgKHdlYnJvb3QuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLmVxdWFscyhuZXcgUGF0aCgiLyIpKSl7IC8vJE5PTi1OTFMtMSQKKwkJCQlQYXRoIGNvbmZpZ0ZvbGRlclBhdGggPSBuZXcgUGF0aChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUikpOworCQkJCXdlYnJvb3QuY3JlYXRlTGluayhjb25maWdGb2xkZXJQYXRoLCAwLCBudWxsKTsgCisJCQkJSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQuc2V0RGVmYXVsdERlcGxveW1lbnREZXNjcmlwdG9yRm9sZGVyKHdlYnJvb3QsIGNvbmZpZ0ZvbGRlclBhdGgsIG51bGwpOyAKKwkJCX0KIAotCQkJaWYoIGZ2ID09IFdlYkZhY2V0VXRpbHMuV0VCXzI1ICkKKwkJCWlmKCBmdiA9PSBXZWJGYWNldFV0aWxzLldFQl8zMCApCisJCQl7CisJCQkJIGlmKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuR0VORVJBVEVfREQpKXsKKwkJICAgICAgICAgICAgICAgIGNyZWF0ZVdlYjMwRGVwbG95bWVudERlc2NyaXB0b3IocHJvamVjdCwgZnYsIHdlYmluZkZvbGRlciwgbW9uaXRvcik7CisJCSAgICAgICAgICAgIH0KKwkJCX0KKwkJCWVsc2UgaWYoIGZ2ID09IFdlYkZhY2V0VXRpbHMuV0VCXzI1ICkKIAkJCXsKIAkJICAgICAgICAgaWYobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5HRU5FUkFURV9ERCkpewogCQkgICAgICAgICAgICAgICAgY3JlYXRlV2ViMjVEZXBsb3ltZW50RGVzY3JpcHRvcihwcm9qZWN0LCBmdiwgd2ViaW5mRm9sZGVyLCBtb25pdG9yKTsKQEAgLTEzMSw4ICsxMzgsMjAgQEAKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKIAkJCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnkgY3BlID0gY3BbaV07CiAJCQkJaWYgKGNwZS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCQlpZiggY3BlLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLnNlZ21lbnRDb3VudCgpID4gMCApCi0JCQkJCQlqc3JjLmNyZWF0ZUxpbmsoY3BlLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLCAwLCBudWxsKTsKKwkJCQkJaWYoIGNwZS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKS5zZWdtZW50Q291bnQoKSA+IDAgKXsKKwkJCQkJCXRyeXsKKwkJCQkJCQlJRm9sZGVyIHNyY0ZvbGRlciA9IHdzLmdldFJvb3QoKS5nZXRGb2xkZXIoY3BlLmdldFBhdGgoKSk7CisJCQkJCQkJCisJCQkJCQkJSVZpcnR1YWxSZXNvdXJjZVtdIHZpcnR1YWxSZXNvdXJjZSA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKHNyY0ZvbGRlcik7CisJCQkJCQkJLy9jcmVhdGUgbGluayBmb3Igc291cmNlIGZvbGRlciBvbmx5IHdoZW4gaXQgaXMgbm90IG1hcHBlZAorCQkJCQkJCWlmKCB2aXJ0dWFsUmVzb3VyY2UubGVuZ3RoID09IDAgKXsKKwkJCQkJCQkJanNyYy5jcmVhdGVMaW5rKGNwZS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKSwgMCwgbnVsbCk7CQkJCQkJCQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKXsKKwkJCQkJCQlXZWJQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQkJCQl9CisJCQkJCX0KIAkJCQl9CiAJCQl9CiAJCQkKQEAgLTE0Miw5ICsxNjEsOSBAQAogCQkJCXRyeSB7CiAJCQkJCWNyZWF0ZU1hbmlmZXN0KHByb2plY3QsIGMuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKSwgbW9uaXRvcik7CiAJCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJV2ViUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCQlXZWJQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJfQogCQkJfQogCkBAIC0xNTksMTMgKzE3OCwxMiBAQAogCiAJCQkvLyBBZGQgdGhlIHdlYiBsaWJyYXJpZXMgY29udGFpbmVyLgogCi0JCQkJCQkKLQkJCWlmKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlscy5nZXREZWZhdWx0VXNlV2ViQXBwTGlicmFyaWVzKCkpeworCQkJaWYoIG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5JTlNUQUxMX1dFQl9MSUJSQVJZKSl7CQkJCiAJCQkJZmluYWwgSVBhdGggd2ViTGliQ29udGFpbmVyID0gbmV3IFBhdGgoV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyLkNPTlRBSU5FUl9JRCk7CiAJCQkJYWRkVG9DbGFzc3BhdGgoanByb2osIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KHdlYkxpYkNvbnRhaW5lcikpOwogCQkJfQogCi0JCQlpZihKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHMuZ2V0RGVmYXVsdFVzZUVBUkxpYnJhcmllcygpKXsKKwkJCWlmKCBtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLklOU1RBTExfRUFSX0xJQlJBUlkpKXsKIAkJCQlmaW5hbCBJUGF0aCBlYXJMaWJDb250YWluZXIgPSBuZXcgUGF0aChKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyLkNPTlRBSU5FUl9JRCk7CiAJCQkJYWRkVG9DbGFzc3BhdGgoanByb2osIEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KGVhckxpYkNvbnRhaW5lcikpOwogCQkJfQpAQCAtMTczLDcgKzE5MSw3IEBACiAJCQl0cnkgewogCQkJCSgoSURhdGFNb2RlbE9wZXJhdGlvbikgbW9kZWwuZ2V0UHJvcGVydHkoRmFjZXREYXRhTW9kZWxQcm92aWRlci5OT1RJRklDQVRJT05fT1BFUkFUSU9OKSkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKIAkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCVdlYlBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAogCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewpAQCAtMTg2LDYgKzIwNCw3IEBACiAJCX0KIAl9CiAKKwogCXByaXZhdGUgdm9pZCBzZXRDb250ZXh0Um9vdFByb3BlcnR5SWZOZWVkZWQoZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYywgU3RyaW5nIGNvbnRleHRSb290KSB7CiAJCVN0cmluZyBleGlzdGluZyA9IGMuZ2V0TWV0YVByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSgiY29udGV4dC1yb290Iik7IC8vJE5PTi1OTFMtMSQKIAkJaWYgKGV4aXN0aW5nID09IG51bGwpCkBAIC0yMDIsNiArMjIxLDIzIEBACiAJCXJldHVybiBwanBhdGguYXBwZW5kKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSKSk7CiAJfQogCQorCXByaXZhdGUgdm9pZCBjcmVhdGVXZWIzMERlcGxveW1lbnREZXNjcmlwdG9yKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZvbGRlciB3ZWJpbmZGb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgICAgIC8vIENyZWF0ZSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yICh3ZWIueG1sKSBpZiBvbmUgZG9lc24ndCBleGlzdAorICAgICAgIElGaWxlIHdlYnhtbEZpbGUgPSB3ZWJpbmZGb2xkZXIuZ2V0RmlsZSgid2ViLnhtbCIpOyAvLyROT04tTkxTLTEkCisgICAgICAgaWYgKCF3ZWJ4bWxGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBtaW5pbWFsIHdlYi54bWwgZmlsZSwgc28gdGhlIG1vZGVsIGNhbiBiZSBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdlYlhtbENvbnRlbnRzID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPHdlYi1hcHAgaWQ9XCJXZWJBcHBfSURcIiB2ZXJzaW9uPVwiMy4wXCIgeG1sbnM9XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWVcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhzaTpzY2hlbWFMb2NhdGlvbj1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkXCI+XG48L3dlYi1hcHA+IjsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgd2VieG1sRmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHdlYlhtbENvbnRlbnRzLmdldEJ5dGVzKCJVVEYtOCIpKSwgdHJ1ZSwgbW9uaXRvcik7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgcG9wdWxhdGVEZWZhdWx0Q29udGVudChwcm9qZWN0LCBmdik7CisgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAJICAgV2ViUGx1Z2luLmxvZ0Vycm9yKGUpOworICAgICAgICAgICB9CisgICAgICAgfQorICAgfQorCQogICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXZWIyNURlcGxveW1lbnREZXNjcmlwdG9yKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZvbGRlciB3ZWJpbmZGb2xkZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewogICAgICAgIC8vIENyZWF0ZSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yICh3ZWIueG1sKSBpZiBvbmUgZG9lc24ndCBleGlzdApAQCAtMjEyLDM5ICsyNDgsNDUgQEAKICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3ZWJYbWxDb250ZW50cyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjx3ZWItYXBwIGlkPVwiV2ViQXBwX0lEXCIgdmVyc2lvbj1cIjIuNVwiIHhtbG5zPVwiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiB4c2k6c2NoZW1hTG9jYXRpb249XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZFwiPlxuPC93ZWItYXBwPiI7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICAgIHdlYnhtbEZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh3ZWJYbWxDb250ZW50cy5nZXRCeXRlcygiVVRGLTgiKSksIHRydWUsIG1vbml0b3IpOyAvLyROT04tTkxTLTEkCiAgICAgICAgICAgIAotICAgICAgICAgICAgICAgZmluYWwgSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QsIGZ2KTsKLSAgICAgICAgICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCl7Ci0gICAKLSAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIFdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBkaXNwbGF5LW5hbWUgdGFnCi0gICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lIGRpc3BsYXlOYW1lID0gKERpc3BsYXlOYW1lKSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNwbGF5TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZS5zZXRWYWx1ZShwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcC5nZXREaXNwbGF5TmFtZXMoKS5hZGQoZGlzcGxheU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gd2VsY29tZSBmaWxlIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHdlbGNvbWVGaWxlcyA9IEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGV4Lmh0bWwiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGV4Lmh0bSIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXguanNwIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0Lmh0bWwiLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQuaHRtIiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0LmpzcCIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSB3ZWxjb21lLWZpbGUtbGlzdCB0YWcKLSAgICAgICAgICAgICAgICAgICAgICAgV2VsY29tZUZpbGVMaXN0IHdlbGNvbWVGaWxlTGlzdCA9IChXZWxjb21lRmlsZUxpc3QpIFdlYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlbGNvbWVGaWxlTGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICB3ZWxjb21lRmlsZUxpc3QuZ2V0V2VsY29tZUZpbGVzKCkuYWRkQWxsKHdlbGNvbWVGaWxlcyk7IAotICAgICAgICAgICAgICAgICAgICAgICB3ZWJBcHAuZ2V0V2VsY29tZUZpbGVMaXN0cygpLmFkZCh3ZWxjb21lRmlsZUxpc3QpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICBwcm92aWRlci5tb2RpZnkocnVubmFibGUsIG51bGwpOworICAgICAgICAgICAgICAgcG9wdWxhdGVEZWZhdWx0Q29udGVudChwcm9qZWN0LCBmdik7CiAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworICAgICAgICAJICAgV2ViUGx1Z2luLmxvZ0Vycm9yKGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQorCisKKwlwcml2YXRlIHZvaWQgcG9wdWxhdGVEZWZhdWx0Q29udGVudChmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAorCQkJZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYpIHsKKwkJZmluYWwgSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QsIGZ2KTsKKwkJICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKXsKKyAgIAorCQkgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworCQkgICAgICAgICAgIFdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOworCQkgICAgICAgICAgIAorCQkgICAgICAgICAgIC8vIEFkZCB0aGUgZGlzcGxheS1uYW1lIHRhZworCQkgICAgICAgICAgIERpc3BsYXlOYW1lIGRpc3BsYXlOYW1lID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzcGxheU5hbWUoKTsKKwkJICAgICAgICAgICBkaXNwbGF5TmFtZS5zZXRWYWx1ZShwcm9qZWN0LmdldE5hbWUoKSk7CisJCSAgICAgICAgICAgd2ViQXBwLmdldERpc3BsYXlOYW1lcygpLmFkZChkaXNwbGF5TmFtZSk7CisJCSAgICAgICAgICAgCisJCSAgICAgICAgICAgLy8gd2VsY29tZSBmaWxlIGxpc3QKKwkJICAgICAgICAgICBMaXN0PFN0cmluZz4gd2VsY29tZUZpbGVzID0gQXJyYXlzLmFzTGlzdCgKKwkJICAgICAgICAgICAgICAgICAgICJpbmRleC5odG1sIiwgLy8kTk9OLU5MUy0xJAorCQkgICAgICAgICAgICAgICAgICAgImluZGV4Lmh0bSIsIC8vJE5PTi1OTFMtMSQKKwkJICAgICAgICAgICAgICAgICAgICJpbmRleC5qc3AiLCAvLyROT04tTkxTLTEkCisJCSAgICAgICAgICAgICAgICAgICAiZGVmYXVsdC5odG1sIiwgLy8kTk9OLU5MUy0xJAorCQkgICAgICAgICAgICAgICAgICAgImRlZmF1bHQuaHRtIiwgLy8kTk9OLU5MUy0xJAorCQkgICAgICAgICAgICAgICAgICAgImRlZmF1bHQuanNwIiAvLyROT04tTkxTLTEkCisJCSAgICAgICAgICAgKTsKKwkJICAgICAgICAgICAKKwkJICAgICAgICAgICAvLyBBZGQgdGhlIHdlbGNvbWUtZmlsZS1saXN0IHRhZworCQkgICAgICAgICAgIFdlbGNvbWVGaWxlTGlzdCB3ZWxjb21lRmlsZUxpc3QgPSBXZWJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWxjb21lRmlsZUxpc3QoKTsKKwkJICAgICAgICAgICB3ZWxjb21lRmlsZUxpc3QuZ2V0V2VsY29tZUZpbGVzKCkuYWRkQWxsKHdlbGNvbWVGaWxlcyk7IAorCQkgICAgICAgICAgIHdlYkFwcC5nZXRXZWxjb21lRmlsZUxpc3RzKCkuYWRkKHdlbGNvbWVGaWxlTGlzdCk7CisJCSAgICAgICB9CisJCSAgIH07CisJCSAgIHByb3ZpZGVyLm1vZGlmeShydW5uYWJsZSwgbnVsbCk7CisJfQogCQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBta2RpcnMoZmluYWwgSUZvbGRlciBmb2xkZXIpCkBAIC0yNzAsNTEgKzMxMiw0IEBACiAJCSAgICB9CiAJCX0KIAl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEphdmFPdXRwdXRQcm9wZXJ0eUlmTmVlZGVkKElEYXRhTW9kZWwgbW9kZWwsIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGMpIHsKLQkJLy8gTWFrZSBzdXJlIG91dHB1dCBmb2xkZXIgaXMgc2V0IHByb3Blcmx5IGZvciB3ZWIgcHJvamVjdHMsIGFuZCB0aGUgcHJvZHVjdCBzZXR0aW5nIGZvciBzaW5nbGUgcm9vdCBzdHJ1Y3R1cmUgaXMgbWFpbnRhaW5lZC4KLQkJLy8gV2UgbWF5IG5lZWQgdG8gY2hhbmdlIHRoZSBleGlzdGluZyBzZXR1cAotCi0JCWlmIChQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkpIHsKLQkJCVN0cmluZyBvdXRwdXRGb2xkZXIgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuT1VUUFVUX0ZPTERFUik7Ci0JCQlJSmF2YVByb2plY3QganByb2ogPSBKYXZhQ29yZS5jcmVhdGUoYy5nZXRQcm9qZWN0KCkpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gY3VycmVudCA9IG51bGw7Ci0JCQlib29sZWFuIHdlYmluZiA9IGZhbHNlOwotCQkJSVBhdGggcGpwYXRoID0gYy5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKLQkJCXRyeSB7Ci0JCQkJY3VycmVudCA9IGpwcm9qLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCUxpc3QgdXBkYXRlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSVBhdGggc291cmNlUGF0aCA9IG51bGw7Ci0JCQkJYm9vbGVhbiBjaGFuZ2VOZWVkZWQgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnQubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gY3VycmVudFtpXTsKLQkJCQkJaWYgKChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgJiYgKGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkgIT0gbnVsbCAmJiBlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpLnRvU3RyaW5nKCkuaW5kZXhPZihvdXRwdXRGb2xkZXIpID09IC0xKSkgewotCQkJCQkJLy9vdXRwdXQgZGlmZmVyZW50IHRoYW4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkJCQkJCXNvdXJjZVBhdGggPSBlbnRyeS5nZXRQYXRoKCk7Ci0JCQkJCQl1cGRhdGVkTGlzdC5hZGQoSmF2YUNvcmUubmV3U291cmNlRW50cnkoc291cmNlUGF0aCkpOwotCQkJCQkJY2hhbmdlTmVlZGVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQl1cGRhdGVkTGlzdC5hZGQoZW50cnkpOwotCQkJCX0KLQkJCQlJUGF0aCBjdXJyZW50RGVmYXVsdE91dHB1dCA9IG51bGw7Ci0JCQkJY3VycmVudERlZmF1bHRPdXRwdXQgPSBqcHJvai5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJCWlmIChjdXJyZW50RGVmYXVsdE91dHB1dC50b1N0cmluZygpLmluZGV4T2Yob3V0cHV0Rm9sZGVyKSA9PSAtMSkKLQkJCQkJY2hhbmdlTmVlZGVkID0gdHJ1ZTsKLQkJCQlpZiAoY2hhbmdlTmVlZGVkKSB7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeVtdIHVwZGF0ZWQgPSAoSUNsYXNzcGF0aEVudHJ5W10pdXBkYXRlZExpc3QudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W3VwZGF0ZWRMaXN0LnNpemUoKV0pOwotCQkJCQlJUGF0aCBvdXRkaXIgPSBwanBhdGguYXBwZW5kKG91dHB1dEZvbGRlcik7IAotCQkJCQlqcHJvai5zZXRSYXdDbGFzc3BhdGgodXBkYXRlZCxvdXRkaXIgLG51bGwpOwotCQkJCQlqcHJvai5zYXZlKG51bGwsIHRydWUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCS8vIE5vdyBqdXN0IHNldCB0aGUgcHJvcGVydHkKLQkJU3RyaW5nIGV4aXN0aW5nID0gYy5nZXRNZXRhUHJvcGVydGllcygpLmdldFByb3BlcnR5KCJqYXZhLW91dHB1dC1wYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGV4aXN0aW5nID09IG51bGwpCi0JCQlzZXRPdXRwdXRGb2xkZXIobW9kZWwsIGMpOwotCX0KLQkKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGVGb3JXZWJGcmFnbWVudFByb2plY3RzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbERlbGVnYXRlRm9yV2ViRnJhZ21lbnRQcm9qZWN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5M2JiOTIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbERlbGVnYXRlRm9yV2ViRnJhZ21lbnRQcm9qZWN0cy5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5KYXZhRmFjZXRVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXRJbnN0YWxsQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQWRkV2ViRnJhZ21lbnRDb21wb25lbnRUb1dlYkFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JQWRkV2ViRnJhZ21lbnRDb21wb25lbnRUb1dlYkFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVByZWZlcmVuY2VzLktleXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5mYWNldC5SdW50aW1lUHJlc2V0TWFwcGluZ1JlZ2lzdHJ5OworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGVGb3JXZWJGcmFnbWVudFByb2plY3RzIHsKKworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRUb0NsYXNzcGF0aChmaW5hbCBJSmF2YVByb2plY3QganByb2osIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBleGlzdGluZ0VudHJpZXMgPSBqcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKKwkJZm9yKElDbGFzc3BhdGhFbnRyeSBleGlzdGluZ0VudHJ5IDogZXhpc3RpbmdFbnRyaWVzKXsKKwkJCWlmKGV4aXN0aW5nRW50cnkuZXF1YWxzKGVudHJ5KSl7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIHVwZGF0ZWQgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2V4aXN0aW5nRW50cmllcy5sZW5ndGggKyAxXTsKKwkJU3lzdGVtLmFycmF5Y29weShleGlzdGluZ0VudHJpZXMsIDAsIHVwZGF0ZWQsIDAsIGV4aXN0aW5nRW50cmllcy5sZW5ndGgpOworCQl1cGRhdGVkW2V4aXN0aW5nRW50cmllcy5sZW5ndGhdID0gZW50cnk7CisJCWpwcm9qLnNldFJhd0NsYXNzcGF0aCh1cGRhdGVkLCBudWxsKTsKKwl9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsV0FSRmFjZXQoIGZpbmFsIFN0cmluZyBqMmVlVmVyc2lvblRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdhclByb2plY3ROYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkKKyAgICB7CisJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qod2FyUHJvamVjdE5hbWUpOyAKKwkJaWYoIHByb2plY3QuZXhpc3RzKCkpCisJCQlyZXR1cm47CisJCQorCQlJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyA9IG51bGw7CisJCXRyeQorCQl7CQorCQkJZnBqd2MgPSBGYWNldGVkUHJvamVjdEZyYW1ld29yay5jcmVhdGVOZXdQcm9qZWN0KCk7CQkKKwkJCisJCQorCQkJZnBqd2Muc2V0UHJvamVjdE5hbWUoIHdhclByb2plY3ROYW1lICk7CisJCQkKKwkJCWlmKCBydW50aW1lICE9IG51bGwgKQorCQkJeworCQkJICAgIGZwandjLnNldFRhcmdldGVkUnVudGltZXMoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggcnVudGltZSApICk7CisJCQl9CisJCQlBcnJheUxpc3QgPElQcm9qZWN0RmFjZXQ+IHJlcXVpcmVkRmFjZXRzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdEZhY2V0PigpOworCSAgICAgICAgcmVxdWlyZWRGYWNldHMuYWRkKEphdmFGYWNldFV0aWxzLkpBVkFfRkFDRVQpOworCSAgICAgICAgcmVxdWlyZWRGYWNldHMuYWRkKElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfRkFDRVQpOworCSAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxJUHJvamVjdEZhY2V0PiBmaXhlZEZhY2V0cyA9IHJlcXVpcmVkRmFjZXRzOworCSAgICAgICAgZnBqd2Muc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCBuZXcgSGFzaFNldDxJUHJvamVjdEZhY2V0PiggZml4ZWRGYWNldHMgKSApOworCQkJLy9mcGp3Yy5zZXRGaXhlZFByb2plY3RGYWNldHMoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggSmF2YUZhY2V0VXRpbHMuSkFWQV9GQUNFVCkgKTsKKwkJCWZwandjLnNldFNlbGVjdGVkUHJlc2V0KCBGYWNldGVkUHJvamVjdEZyYW1ld29yay5ERUZBVUxUX0NPTkZJR1VSQVRJT05fUFJFU0VUX0lEICk7CisJCQkKKwkJCWlmKCBqMmVlVmVyc2lvblRleHQgIT0gbnVsbCApCisJCQl7CisJCQkgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZGVmYXVsdFdhckZhY2V0VmVyc2lvbgorCQkJICAgICAgICA9IGZwandjLmdldFByb2plY3RGYWNldFZlcnNpb24oIElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfRkFDRVQgKTsKKwkJCSAgICAKKwkJCSAgICBpZiggISBkZWZhdWx0V2FyRmFjZXRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKS5lcXVhbHMoIGoyZWVWZXJzaW9uVGV4dCApICkKKwkJCSAgICB7CisJCQkgICAgICAgIFN0cmluZyBwcmVzZXRJZCA9IG51bGw7CisJCQkgICAgICAgIAorCQkJICAgICAgICBpZiggcnVudGltZSAhPSBudWxsICkKKwkJCSAgICAgICAgeworCSAgICAJCSAgICAgICAgZm9yKCBJUnVudGltZUNvbXBvbmVudCByYyA6IHJ1bnRpbWUuZ2V0UnVudGltZUNvbXBvbmVudHMoKSApCisJICAgIAkJICAgICAgICB7CisJICAgIAkJICAgICAgICAgICAgcHJlc2V0SWQgPSBSdW50aW1lUHJlc2V0TWFwcGluZ1JlZ2lzdHJ5LklOU1RBTkNFLmdldFByZXNldElECisJICAgIAkJICAgICAgICAgICAgKCAKKwkgICAgCQkgICAgICAgICAgICAgICAgcmMuZ2V0UnVudGltZUNvbXBvbmVudFR5cGUoKS5nZXRJZCgpLAorCSAgICAJCSAgICAgICAgICAgICAgICByYy5nZXRSdW50aW1lQ29tcG9uZW50VmVyc2lvbigpLmdldFZlcnNpb25TdHJpbmcoKSwgCisJICAgIAkJICAgICAgICAgICAgICAgIElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfRkFDRVQuZ2V0SWQoKSwgCisJICAgIAkJICAgICAgICAgICAgICAgIGoyZWVWZXJzaW9uVGV4dCAKKwkgICAgCQkgICAgICAgICAgICApOworCSAgICAJCSAgICAgICAgICAgIAorCSAgICAJCSAgICAgICAgICAgIGlmKCBwcmVzZXRJZCAhPSBudWxsICkKKwkgICAgCQkgICAgICAgICAgICB7CisJICAgIAkJICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICAJCSAgICAgICAgICAgIH0KKwkgICAgCQkgICAgICAgIH0KKwkJCSAgICAgICAgfQorCQkJICAgICAgICAKKwkgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gd2FyRmFjZXRWZXJzaW9uCisJICAgICAgICAgICAgICAgICAgICA9IElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfRkFDRVQuZ2V0VmVyc2lvbiggajJlZVZlcnNpb25UZXh0ICk7CisKKyAgICAgICAgICAgIAorCSAgICAgICAgICAgICAgICAKKwkgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBuZXh0IGNhbGwgaXMgbmVjZXNzYXJ5IGV2ZW4gaWYgYSBwcmVzZXQgaXMgZ29pbmcgdG8gYmUgc2VsZWN0ZWQgCisJICAgICAgICAgICAgICAgIC8vIGxhdGVyIHNpbmNlIGl0IGFsbG93cyB0aGUgZHluYW1pYyBwcmVzZXQgdG8gYWRqdXN0IGZvciB0aGUgd2FyIGZhY2V0IHZlcnNpb24uCisJICAgICAgICAgICAgCUFycmF5TGlzdCA8SVByb2plY3RGYWNldFZlcnNpb24+IHJlcXVpcmVkRmFjZXRWZXJzaW9ucyA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3RGYWNldFZlcnNpb24+KCk7CisJICAgICAgICAgICAgCXJlcXVpcmVkRmFjZXRWZXJzaW9ucy5hZGQoSmF2YUZhY2V0VXRpbHMuSkFWQV9GQUNFVC5nZXRWZXJzaW9uKCIxLjUiKSk7IC8vJE5PTi1OTFMtMSQKKwkgICAgICAgICAgICAJcmVxdWlyZWRGYWNldFZlcnNpb25zLmFkZCh3YXJGYWNldFZlcnNpb24pOworCSAgICAJICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBmaXhlZEZhY2V0VmVyc2lvbnMgPSByZXF1aXJlZEZhY2V0VmVyc2lvbnM7CisJICAgIAkgICAgICAgIGZwandjLnNldFByb2plY3RGYWNldHMoIG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiggZml4ZWRGYWNldFZlcnNpb25zICkgKTsKKwkgICAgCSAgICAgICAgCisJICAgICAgICAgICAgICAgIC8vZnBqd2Muc2V0UHJvamVjdEZhY2V0cyggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCB3YXJGYWNldFZlcnNpb24gKSApOworCSAgICAgICAgICAgICAgICAKKwkJCSAgICAgICAgaWYoIHByZXNldElkICE9IG51bGwgKQorCQkJICAgICAgICB7CisJCQkgICAgICAgICAgICBmcGp3Yy5zZXRTZWxlY3RlZFByZXNldCggcHJlc2V0SWQgKTsKKwkJCSAgICAgICAgfQorCQkJICAgIH0KKworCQkJICAgIFNldDxJRmFjZXRlZFByb2plY3QuQWN0aW9uPiBhY3Rpb25zID0gZnBqd2MuZ2V0UHJvamVjdEZhY2V0QWN0aW9ucygpOworCQkJICAgIGZvcihJRmFjZXRlZFByb2plY3QuQWN0aW9uIGFjdGlvbjogYWN0aW9ucyl7CisJCQkgICAgCU9iamVjdCBhY3Rpb25Db25maWcgPSBhY3Rpb24uZ2V0Q29uZmlnKCk7CisJCQkgICAgCWlmKCBhY3Rpb25Db25maWcgaW5zdGFuY2VvZiBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKXsKKwkJCSAgICAJCUphdmFGYWNldEluc3RhbGxDb25maWcgYyA9IChKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKSBhY3Rpb25Db25maWc7CisJCQkgICAgCQljLnNldERlZmF1bHRPdXRwdXRGb2xkZXIobmV3IFBhdGgoSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEtleXMuRFlOX1dFQl9PVVRQVVRfRk9MREVSKSkpOworCQkJICAgIAl9CisJCQkgICAgfQorCQkJfQorCQkJdHJ5CisJCQl7CisJCQkgICAgZnBqd2MuY29tbWl0Q2hhbmdlcyggbnVsbCApOworCQkJfQorCQkJY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCisJCQl7CisJCQkgICAgSjJFRVBsdWdpbi5sb2dFcnJvciggZSApOworCQkJfQorCQl9ZmluYWxseSB7CisJCQlpZihmcGp3YyAhPSBudWxsKXsKKwkJCQlmcGp3Yy5kaXNwb3NlKCk7CisJCQl9CisJCX0KKwl9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRUb1dhcihJVmlydHVhbENvbXBvbmVudCB3YXJDb21wLCBJVmlydHVhbENvbXBvbmVudCBqMmVlQ29tcCwgU3RyaW5nIG1vZHVsZVVSSSApeworCQlmaW5hbCBJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBZGRXZWJGcmFnbWVudENvbXBvbmVudFRvV2ViQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKKwkJTWFwIG1hcCA9IChNYXApZGF0YU1vZGVsLmdldFByb3BlcnR5KElBZGRXZWJGcmFnbWVudENvbXBvbmVudFRvV2ViQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX1RPX1VSSV9NQVApOworCQltYXAucHV0KGoyZWVDb21wLCBtb2R1bGVVUkkpOworCQkKKwkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCB3YXJDb21wKTsKKwkJCQorCQlMaXN0IG1vZExpc3QgPSAoTGlzdCkgZGF0YU1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOworCQltb2RMaXN0LmFkZChqMmVlQ29tcCk7CisJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBtb2RMaXN0KTsKKwkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSCwgIi9XRUItSU5GL2xpYiIpOyAvLyROT04tTkxTLTEkCisJCXRyeSB7CisJCQlkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7CisJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCB2b2lkIGluc3RhbGxBbmRBZGRNb2R1bGV0b1dBUiggU3RyaW5nIGoyZWVWZXJzaW9uVGV4dCwKKyAgICAJCQlTdHJpbmcJCQkJd2FyUHJvamVjdE5hbWUsCisgICAgCQkJSVJ1bnRpbWUJCQlydW50aW1lLAorICAgIAkJCUlQcm9qZWN0CQkJbW9kdWxlUHJvamVjdCwKKyAgICAJCQlTdHJpbmcJCQkJbW9kdWxlVVJJLAorICAgIAkJCUlQcm9ncmVzc01vbml0b3IJbW9uaXRvciApeworICAgIAkKKwkJaW5zdGFsbFdBUkZhY2V0KGoyZWVWZXJzaW9uVGV4dCwKKwkJCQkJd2FyUHJvamVjdE5hbWUsCisJCQkJCXJ1bnRpbWUsCisJCQkJCW1vbml0b3IpOworCQkKKwkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KCBtb2R1bGVQcm9qZWN0ICk7CisJCWZpbmFsIElQcm9qZWN0IHdhclByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoIHdhclByb2plY3ROYW1lICk7CisJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHdhckNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCggd2FyUHJvamVjdCApOworCQkKKwkJaWYoIFVJQ29udGV4dERldGVybWluYXRpb24uZ2V0Q3VycmVudENvbnRleHQoKSA9PSBVSUNvbnRleHREZXRlcm1pbmF0aW9uLkhFQURMRVNTX0NPTlRFWFQgKXsKKwkJCWJvb2xlYW4gaXNWYWxpZGF0aW5nID0gUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKS5pc1ZhbGlkYXRpbmcoKTsKKwkJCXRyeXsKKwkJCQlpZiggaXNWYWxpZGF0aW5nICl7CisJCQkJCVJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisJCQkJfQorCQkJCWFkZFRvV2FyKCB3YXJDb21wLCBjLCBtb2R1bGVVUkkgKTsKKwkJCX1maW5hbGx5eworCQkJCVJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkuc2V0VmFsaWRhdGluZyhpc1ZhbGlkYXRpbmcpOworCQkJfQorCQl9CisJCWVsc2V7CisJCQlhZGRUb1dhciggd2FyQ29tcCwgYywgbW9kdWxlVVJJICk7CisJCX0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldFJ1bnRpbWVDaGFuZ2VkRGVsZWdhdGUuamF2YQppbmRleCA4YzY3OTY2Li5iMDNlZTUxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlLmphdmEKQEAgLTM3LDcgKzM3LDcgQEAKICAgICB7CiAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQogICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDEgKTsKKyAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCAiIiwgMSApOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIHRyeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldFV0aWxzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0VXRpbHMuamF2YQppbmRleCBjYmYyNDkxLi5jNTM4NDBkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0VXRpbHMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0VXRpbHMuamF2YQpAQCAtMTgsMTAgKzE4LDEzIEBACiBwdWJsaWMgY2xhc3MgV2ViRmFjZXRVdGlscyB7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgV0VCX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBXRUJGUkFHTUVOVF9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJSjJFRUZhY2V0Q29uc3RhbnRzLldFQkZSQUdNRU5UKTsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIFdFQl8yMiA9IFdFQl9GQUNFVC5nZXRWZXJzaW9uKCIyLjIiKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gV0VCXzIzID0gV0VCX0ZBQ0VULmdldFZlcnNpb24oIjIuMyIpOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBXRUJfMjQgPSBXRUJfRkFDRVQuZ2V0VmVyc2lvbigiMi40Iik7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIFdFQl8yNSA9IFdFQl9GQUNFVC5nZXRWZXJzaW9uKCIyLjUiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gV0VCXzMwID0gV0VCX0ZBQ0VULmdldFZlcnNpb24oIjMuMCIpOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBXRUJGUkFHTUVOVF8zMCA9IFdFQkZSQUdNRU5UX0ZBQ0VULmdldFZlcnNpb24oIjMuMCIpOyAvLyROT04tTkxTLTEkCiAJCiAJcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IFdFQl9YRE9DTEVUX0ZBQ0VUID0gZ2V0V2ViRG9jbGV0RmFjZXQoKTsKIAkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQppbmRleCBmNzgwMDQ0Li4yNzhiODkyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0VmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhCkBAIC0zOSw3ICszOSw3IEBACiAgICAgewogICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKICAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soICIiLCAxICk7CisgICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDEgKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICB0cnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRnJhZ21lbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGcmFnbWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllMGRhZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRnJhZ21lbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnV0aWxzLk1lc3NhZ2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRmFjZXREYXRhTW9kZWxNYXA7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBXZWJGcmFnbWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSVdlYkZyYWdtZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7CisKKwlwdWJsaWMgV2ViRnJhZ21lbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKKwkJU2V0PFN0cmluZz4gbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CisJCW5hbWVzLmFkZChDT05URU5UX0RJUik7CisJCW5hbWVzLmFkZChBRERfVE9fV0FSKTsKKwkJbmFtZXMuYWRkKFdBUl9QUk9KRUNUX05BTUUpOworCQluYW1lcy5hZGQoTEFTVF9XQVJfTkFNRSk7CisJCXJldHVybiBuYW1lczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTlRFTlRfRElSKSkgeworCQkJcmV0dXJuICIiOyAgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRfSUQpKSB7CisJCQlyZXR1cm4gV0VCRlJBR01FTlQ7IAorCQl9ZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhBRERfVE9fRUFSKSkgeworCQkJcmV0dXJuIGZhbHNlOyAKKwkJfWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQUREX1RPX1dBUikpIHsKKwkJCXJldHVybiB0cnVlOyAKKwkJfWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTU9EVUxFX1VSSSkpIHsKKwkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSkucmVwbGFjZSgnICcsICdfJyk7CisJCQlyZXR1cm4gcHJvamVjdE5hbWUgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUOworCQl9ZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhBRERfVE9fV0FSKSkgeworCQkJcmV0dXJuIG5ldyBCb29sZWFuKCBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkFERF9UT19FQVJfQllfREVGQVVMVCkgJiYgaXNXQVJTdXBwb3J0ZWRCeVJ1bnRpbWUoKSk7CisJCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhXQVJfUFJPSkVDVF9OQU1FKSkgeworCQkJaWYgKG1vZGVsLmlzUHJvcGVydHlTZXQoTEFTVF9XQVJfTkFNRSkpIHsKKwkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGdldFN0cmluZ1Byb3BlcnR5KExBU1RfV0FSX05BTUUpKTsKKwkJCQlpZiAocHJvamVjdC5leGlzdHMoKSAmJiBwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKQorCQkJCQlyZXR1cm4gcHJvamVjdC5nZXROYW1lKCk7CisJCQl9CisJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcyA9IGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhXQVJfUFJPSkVDVF9OQU1FKTsKKwkJCWlmIChkZXNjcy5sZW5ndGggPiAwKSB7CisJCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGRlc2MgPSBkZXNjc1swXTsKKwkJCQlTdHJpbmcgZUFSTmFtZSA9IGRlc2MuZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpOworCQkJCWlmIChlQVJOYW1lICE9IG51bGwgJiYgIWVBUk5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCXJldHVybiBlQVJOYW1lOworCQkJCX0KKwkJCQlyZXR1cm4gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKSArICJXQVIiOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlyZXR1cm4gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKSArICJXQVIiOyAvLyROT04tTkxTLTEkCisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOworCX0KKwkKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgbmFtZSkgeworCQkKKwkJaWYgKG5hbWUuZXF1YWxzKENPTlRFTlRfRElSKSkgeworCQkJU3RyaW5nIGZvbGRlck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDT05URU5UX0RJUik7CisJCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlRm9sZGVyTmFtZShmb2xkZXJOYW1lKTsKKwkJCWlmIChzdGF0dXMuaXNPSygpKQorCQkJeworCQkJCWlmIChmb2xkZXJOYW1lLmluZGV4T2YoJyMnKSAhPSAtMSkgeyAKKwkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5yZXNvdXJjZXNfaW52YWxpZENoYXJJbk5hbWUsICIjIiwgZm9sZGVyTmFtZSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJc3RhdHVzID0gbmV3IFJlc291cmNlU3RhdHVzKElSZXNvdXJjZVN0YXR1cy5JTlZBTElEX1ZBTFVFLCBudWxsLCBtZXNzYWdlKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJCQorCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUobmFtZSk7CisJfQorCQorCQorCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVGb2xkZXJOYW1lKFN0cmluZyBmb2xkZXJOYW1lKSB7CisJCS8vIHRoZSBkaXJlY3RvcnkgaXMgbm90IHJlcXVpcmVkLCBidXQgaWYgdGhlIG5hbWUgaXMgZW50ZXJlZCBlbnN1cmUgdGhhdCBpdCAKKwkJLy8gY29udGFpbnMgb25seSB2YWxpZCBjaGFyYWN0ZXJzLgorCQlpZiAoZm9sZGVyTmFtZSA9PSBudWxsIHx8IGZvbGRlck5hbWUubGVuZ3RoKCkgPT0gMCkgeworCQkJcmV0dXJuIE9LX1NUQVRVUzsKKwkJfQorCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKKwkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGZvbGRlck5hbWUpOworCQlmb3IgKGludCBpID0gMCwgbWF4ID0gcGF0aC5zZWdtZW50Q291bnQoKTsgaSA8IG1heDsgaSsrKSB7CisJCQlJU3RhdHVzIHN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZU5hbWUocGF0aC5zZWdtZW50KGkpLCBJUmVzb3VyY2UuRk9MREVSKTsKKwkJCWlmICghIHN0YXR1cy5pc09LKCkpCisJCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCisJCS8vIGFsbCBvZiB0aGUgcG90ZW50aWFsIHNlZ21lbnRzIG9mIHRoZSBmb2xkZXIgaGF2ZSBiZWVuIHZlcmlmaWVkCisJCXJldHVybiBPS19TVEFUVVM7CisJfQorCQorCQlwcml2YXRlIGJvb2xlYW4gaXNXQVJTdXBwb3J0ZWRCeVJ1bnRpbWUoKSB7CisJCWJvb2xlYW4gcmV0ID0gdHJ1ZTsKKwkJSVJ1bnRpbWUgcnQgPSAoSVJ1bnRpbWUpIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSk7CisJCWlmIChydCAhPSBudWxsKQorCQkJcmV0ID0gcnQuc3VwcG9ydHMoSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQl9GQUNFVCk7CisJCXJldHVybiByZXQ7CisJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQkJaWYgKFdBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKwkJCQlpbnQgajJlZVZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludCgoKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBnZXRQcm9wZXJ0eShGQUNFVF9WRVJTSU9OKSkuZ2V0VmVyc2lvblN0cmluZygpKTsKKwkJCQlyZXR1cm4gZ2V0V2ViQXBwUHJvcGVydHlEZXNjcmlwdG9ycyhqMmVlVmVyc2lvbik7CisJCQl9CisJCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7CisJCX0KKworCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7CisJCQlpZiAoRkFDRVRfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisJCQkJCWlmIChnZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX1dBUikpIHsKKwkJCQkJaWYgKCFtb2RlbC5pc1Byb3BlcnR5U2V0KFdBUl9QUk9KRUNUX05BTUUpKSB7CisJCQkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShXQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoRkFDRVRfVkVSU0lPTi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFdBUl9QUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7CisJCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09ORklHX0ZPTERFUikpIHsKKwkJCQlJRGF0YU1vZGVsIG1hc3Rlck1vZGVsID0gKElEYXRhTW9kZWwpIG1vZGVsLmdldFByb3BlcnR5KE1BU1RFUl9QUk9KRUNUX0RNKTsKKwkJCQlpZiAobWFzdGVyTW9kZWwgIT0gbnVsbCkgeworCQkJCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIG1hc3Rlck1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKKwkJCQkJSURhdGFNb2RlbCBqYXZhTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoSkFWQSk7CisJCQkJCWlmIChqYXZhTW9kZWwgIT0gbnVsbCkgeworCQkJCQkJamF2YU1vZGVsLnNldFByb3BlcnR5KElKYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSX05BTUUsIHByb3BlcnR5VmFsdWUpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmICgoV0FSX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBBRERfVE9fV0FSLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IExBU1RfV0FSX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpICYmIGdldEJvb2xlYW5Qcm9wZXJ0eShBRERfVE9fV0FSKSkgeworCQkJCS8vVmFsaWRhdGVFQVIgcmVhbGx5IGRvZXMgZ2VuZXJhbCBjaGVja3MgZm9yIHByb2plY3QgbmFtZS4gU28gaXRzIGFwcGxpY2FibGUgaGVyZSB0b28uCisJCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUVBUihtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShXQVJfUFJPSkVDVF9OQU1FKSk7CisJCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKKwkJCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChnZXRTdHJpbmdQcm9wZXJ0eShXQVJfUFJPSkVDVF9OQU1FKSk7CisJCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkgJiYgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCUlGYWNldGVkUHJvamVjdCBmYWNldFByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworCQkJCQkJCXNldFByb3BlcnR5KEZBQ0VUX1JVTlRJTUUsIGZhY2V0UHJvai5nZXRSdW50aW1lKCkpOworCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShGQUNFVF9SVU5USU1FLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOworCQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSkpIHsKKwkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShBRERfVE9fV0FSLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOworCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFdBUl9QUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7CisJCQl9IAorCQkJCisJCQlpZiAoQUREX1RPX1dBUi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworCQkJCUlTdGF0dXMgc3RhdCA9IG1vZGVsLnZhbGlkYXRlUHJvcGVydHkocHJvcGVydHlOYW1lKTsKKwkJCQlpZiAoc3RhdCAhPSBPS19TVEFUVVMpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFdBUl9QUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7CisJCQl9CisJICAgICAgIAorCisJCQlyZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKKwkJfQorCQkKKwlwcml2YXRlIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFdlYkFwcFByb3BlcnR5RGVzY3JpcHRvcnMoaW50IHdlYkFwcFZlcnNpb24pIHsKKwkJQXJyYXlMaXN0IHdlYkFwcERlc2NyaXB0b3JMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCisJCUlQcm9qZWN0W10gcHJvanMgPSBQcm9qZWN0VXRpbGl0aWVzLmdldEFsbFByb2plY3RzKCk7CisKKwkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHByb2pzLmxlbmd0aDsgaW5kZXgrKykgeworCQkJSVByb2plY3QgZmxleFByb2plY3QgPSBwcm9qc1tpbmRleF07CisJCQlpZiAoZmxleFByb2plY3QgIT0gbnVsbCkgeworCQkJCWlmIChNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KGZsZXhQcm9qZWN0KSkgeworCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZmxleFByb2plY3QpOworCQkJCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGNvbXAuZ2V0UHJvamVjdCgpKSkgeworCQkJCQkJU3RyaW5nIHNWZXIgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFZlcnNpb24oY29tcC5nZXRQcm9qZWN0KCkpOworCQkJCQkJaW50IHZlciA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KHNWZXIpOworCQkJCQkJaWYgKHdlYkFwcFZlcnNpb24gPD0gdmVyKSB7CisJCQkJCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKGNvbXAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7CisJCQkJCQkJd2ViQXBwRGVzY3JpcHRvckxpc3QuYWRkKGRlc2MpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclt3ZWJBcHBEZXNjcmlwdG9yTGlzdC5zaXplKCldOworCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7CisJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZGVzYyA9IChEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IpIHdlYkFwcERlc2NyaXB0b3JMaXN0LmdldChpKTsKKwkJCWRlc2NyaXB0b3JzW2ldID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihkZXNjLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSwgZGVzYy5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkpOworCQl9CisJCXJldHVybiBkZXNjcmlwdG9yczsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlpZiAoQUREX1RPX1dBUi5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworCQkJcmV0dXJuIGlzV0FSU3VwcG9ydGVkQnlSdW50aW1lKCk7CisJCX0KKwkJaWYgKFdBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKwkJCXJldHVybiBpc1dBUlN1cHBvcnRlZEJ5UnVudGltZSgpICYmIGdldEJvb2xlYW5Qcm9wZXJ0eShBRERfVE9fV0FSKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKTsKKwl9CisJCQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGcmFnbWVudEZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZyYWdtZW50RmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODBmMDJmCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGcmFnbWVudEZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlhNTFdyaXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5XdHBVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5DbGFzc3BhdGhIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuTWFuaWZlc3RGaWxlQ3JlYXRpb25BY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5GYWNldERhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKKworcHVibGljIGNsYXNzIFdlYkZyYWdtZW50RmFjZXRJbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgeworCisJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChtb25pdG9yICE9IG51bGwpCisJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKKwkJdHJ5IHsKKwkJCUlEYXRhTW9kZWwgbW9kZWwgPSAoSURhdGFNb2RlbCkgY29uZmlnOworCQkJV3RwVXRpbHMuYWRkTmF0dXJlcyhwcm9qZWN0KTsKKwkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0LCBmYWxzZSk7CisJCQljLmNyZWF0ZSgwLCBudWxsKTsKKwkJCWZpbmFsIElWaXJ0dWFsRm9sZGVyIGpzcmMgPSBjLmdldFJvb3RGb2xkZXIoKTsKKwkJCWZpbmFsIElKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKKwkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGNwID0ganByb2ouZ2V0UmF3Q2xhc3NwYXRoKCk7CisJCQlJUGF0aCBmaXJzdFBhdGggPSBudWxsOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgeworCQkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeSBjcGUgPSBjcFtpXTsKKworCQkJCWlmIChjcGUuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKKwkJCQkJSVBhdGggcGF0aCA9IGNwZS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKKwkJCQkJaWYgKHBhdGguaXNFbXB0eSgpKSB7CisJCQkJCQlwYXRoID0gbmV3IFBhdGgoIi8iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJCWpzcmMuY3JlYXRlTGluayhwYXRoLCAwLCBudWxsKTsKKwkJCQkJaWYgKGZpcnN0UGF0aCA9PSBudWxsKXsKKwkJCQkJCWZpcnN0UGF0aCA9IHBhdGg7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5zZXREZWZhdWx0RGVwbG95bWVudERlc2NyaXB0b3JGb2xkZXIoanNyYywgZmlyc3RQYXRoLCBudWxsKTsKKwkJCWZpbmFsIElWaXJ0dWFsRm9sZGVyIHJvb3QgPSBjLmdldFJvb3RGb2xkZXIoKTsKKwkJCUlDb250YWluZXIgY29udGFpbmVyID0gbnVsbDsKKwkJCWlmIChyb290LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5zZWdtZW50Q291bnQoKSA9PSAwKSB7CisJCQkJY29udGFpbmVyID0gcHJvamVjdDsKKwkJCX0gZWxzZSB7CisJCQkJY29udGFpbmVyID0gcm9vdC5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7CisJCQl9CisJCQl0cnkgeworCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgeworCQkJCQljcmVhdGVXZWJGcmFnbWVudEZpbGUocHJvamVjdCwgZnYsIGNvbnRhaW5lciwgbW9uaXRvcik7CisJCQkJCWNyZWF0ZU1hbmlmZXN0IChwcm9qZWN0LCBjb250YWluZXIsIG1vbml0b3IpOworCQkJCX0KKwkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCX0KKwkJCUNsYXNzcGF0aEhlbHBlci5yZW1vdmVDbGFzc3BhdGhFbnRyaWVzKHByb2plY3QsIGZ2KTsKKwkJCWlmICghQ2xhc3NwYXRoSGVscGVyLmFkZENsYXNzcGF0aEVudHJpZXMocHJvamVjdCwgZnYpKSB7CisJCQkJLy8gVE9ETzogU3VwcG9ydCB0aGUgbm8gcnVudGltZSBjYXNlLgorCQkJCS8vIENsYXNzcGF0aEhlbHBlci5hZGRDbGFzc3BhdGhFbnRyaWVzKCBwcm9qZWN0LCBmdiwgPHNvbWV0aGluZz4gKTsKKwkJCX0KKwkJCXRyeSB7CisJCQkJKChJRGF0YU1vZGVsT3BlcmF0aW9uKSBtb2RlbC5nZXRQcm9wZXJ0eShGYWNldERhdGFNb2RlbFByb3ZpZGVyLk5PVElGSUNBVElPTl9PUEVSQVRJT04pKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOworCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCQlXZWJQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQl9CisJCX0gZmluYWxseSB7CisJCQlpZiAobW9uaXRvciAhPSBudWxsKQorCQkJCW1vbml0b3IuZG9uZSgpOworCQl9CisJfQorCQorCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVdlYkZyYWdtZW50RmlsZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgSUNvbnRhaW5lciBhRm9sZGVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgCQorICAgICAgICBJRmlsZSBmaWxlID0gYUZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCRlJBR01FTlRfRERfVVJJKSk7CisgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSByZXR1cm47CisgICAgICAgIHRyeSB7CisgICAgICAgIAljcmVhdGVXZWJGcmFnbWVudEZpbGUoZmlsZSwgcHJvamVjdCk7CisgICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlV2ViRnJhZ21lbnRGaWxlKElGaWxlIGZpbGUsIElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbShmaWxlKTsKKwkJCVN0cmluZyBwcm9qZWN0TmFtZXdpdGhvdXRTcGVjaWFsQ2hhcnMgPSBnZXROYW1lV2l0aG91dFNwZWNpYWxDaGFyYWN0ZXJzKHByb2plY3QuZ2V0TmFtZSgpKTsKKwkJCWZpbmFsIFN0cmluZyB3ZWJGcmFnWG1sQ29udGVudHMgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48d2ViLWZyYWdtZW50IGlkPVwiV2ViRnJhZ21lbnRfSURcIiB2ZXJzaW9uPVwiMy4wXCIgeG1sbnM9XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWVcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhzaTpzY2hlbWFMb2NhdGlvbj1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZyYWdtZW50XzNfMC54c2RcIj5cbjxkaXNwbGF5LW5hbWU+IiArIFhNTFdyaXRlci5nZXRFc2NhcGVkKHByb2plY3QuZ2V0TmFtZSgpKSsgIjwvZGlzcGxheS1uYW1lPiBcbiA8bmFtZT4iKyBYTUxXcml0ZXIuZ2V0RXNjYXBlZChwcm9qZWN0TmFtZXdpdGhvdXRTcGVjaWFsQ2hhcnMpICsgICI8L25hbWU+IFxuIDwvd2ViLWZyYWdtZW50PiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQlvdXQud3JpdGUod2ViRnJhZ1htbENvbnRlbnRzLmdldEJ5dGVzKCJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJb3V0LmNsb3NlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJdGhyb3cgaW9lOworCQl9CisJfQorCQorCQorCQorICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZU1hbmlmZXN0KElQcm9qZWN0IHByb2plY3QsIElDb250YWluZXIgYUZvbGRlciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIAkKKyAgICAgICAgSUZpbGUgZmlsZSA9IGFGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpOworICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgcmV0dXJuOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWFuaWZlc3RGaWxlQ3JlYXRpb25BY3Rpb24uY3JlYXRlTWFuaWZlc3RGaWxlKGZpbGUsIHByb2plY3QpOworICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5hbWVXaXRob3V0U3BlY2lhbENoYXJhY3RlcnMoU3RyaW5nIHByb2plY3ROYW1lKXsKKyAgICAJU3RyaW5nIHJlc3VsdCA9IHByb2plY3ROYW1lOworICAgIAlQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoIigkfF98XFxwe0x9KShcXHB7TH18XFxwe05kfXxffCQpKiIpOyAvLyROT04tTkxTLTEkCisgICAgCSBmb3IoaW50IGN1ckxlbmd0aCA9IDE7IGN1ckxlbmd0aCA8PSByZXN1bHQubGVuZ3RoKCk7IGN1ckxlbmd0aCsrKXsKKyAgICAJCSBpZihwLm1hdGNoZXIocmVzdWx0LnN1YnN0cmluZygwLGN1ckxlbmd0aCkpLm1hdGNoZXMoKT09IGZhbHNlKXsKKyAgICAJCQkgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UocmVzdWx0LmNoYXJBdChjdXJMZW5ndGgtMSA8IDAgPyBjdXJMZW5ndGggOiBjdXJMZW5ndGgtMSksICdfJyk7CisgICAgCQkgfQorICAgCSB9CisgICAgCSByZXR1cm4gcmVzdWx0OyAgICAJCisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRnJhZ21lbnRGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRnJhZ21lbnRGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjcyZmZkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGcmFnbWVudEZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKKworcHVibGljIGZpbmFsIGNsYXNzIFdlYkZyYWdtZW50RmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlIGV4dGVuZHMgV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGVGb3JXZWJGcmFnbWVudFByb2plY3RzIGltcGxlbWVudHMgSURlbGVnYXRlIHsKKworCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIGZpbmFsIE9iamVjdCBjZmcsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CisJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQl0cnkgeworCQkJZmluYWwgSURhdGFNb2RlbCBtb2RlbCA9IChJRGF0YU1vZGVsKSBjZmc7CisJCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElXZWJGcmFnbWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX1dBUikpIHsKKwkJCQlmaW5hbCBTdHJpbmcgd2FyUHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJV2ViRnJhZ21lbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLldBUl9QUk9KRUNUX05BTUUpOworCQkJCWlmICh3YXJQcm9qZWN0TmFtZSAhPSBudWxsICYmIHdhclByb2plY3ROYW1lICE9ICIiKSAvLyROT04tTkxTLTEkCisJCQkJeworCQkJCQlmaW5hbCBTdHJpbmcgbW9kdWxlVVJJID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9VUkkpOworCQkJCQkKKwkJCQkJaW5zdGFsbEFuZEFkZE1vZHVsZXRvV0FSKCBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMF9URVhULAorCQkJCQkJCQl3YXJQcm9qZWN0TmFtZSwKKwkJCQkJCQkJKElSdW50aW1lKSBtb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSksCisJCQkJCQkJCXByb2plY3QsCisJCQkJCQkJCW1vZHVsZVVSSSwKKwkJCQkJCQkJbW9uaXRvciApOwkJCQkJCisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCQltb25pdG9yLmRvbmUoKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViL3dlYnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViL3Byb2plY3QvZmFjZXQvV2ViRnJhZ21lbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZyYWdtZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTAwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZyYWdtZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5JSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldFV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXJOZXc7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOworCitwdWJsaWMgY2xhc3MgV2ViRnJhZ21lbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJV2ViRnJhZ21lbnRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzeworCisJcHVibGljIFdlYkZyYWdtZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKKwkJc3VwZXIoKTsKKwl9CisJCisJcHVibGljIElQcm9qZWN0RmFjZXQgV0VCRlJBR01FTlRfRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCRlJBR01FTlRfTU9EVUxFKTsKKworCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXQoKSB7CisJCXN1cGVyLmluaXQoKTsKKyAgICAgICAgQ29sbGVjdGlvbjxJUHJvamVjdEZhY2V0PiByZXF1aXJlZEZhY2V0cyA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3RGYWNldD4oKTsKKyAgICAgICAgcmVxdWlyZWRGYWNldHMuYWRkKEphdmFGYWNldFV0aWxzLkpBVkFfRkFDRVQpOworICAgICAgICByZXF1aXJlZEZhY2V0cy5hZGQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuSlNUX1dFQkZSQUdNRU5UX01PRFVMRSkpOworICAgICAgICBzZXRQcm9wZXJ0eShSRVFVSVJFRF9GQUNFVFNfQ09MTEVDVElPTiwgcmVxdWlyZWRGYWNldHMpOworCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIGdldFByb3BlcnR5KEZBQ0VUX0RNX01BUCk7CisJCUlEYXRhTW9kZWwgamF2YUZhY2V0ID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKEphdmFGYWNldFV0aWxzLkpBVkFfRkFDRVQuZ2V0SWQoKSk7CisJCWphdmFGYWNldC5zZXRQcm9wZXJ0eShJSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuREVGQVVMVF9PVVRQVVRfRk9MREVSX05BTUUsICJiaW4iKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJSURhdGFNb2RlbCB3ZWJGcmFnbWVudEZhY2V0ID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKFdFQkZSQUdNRU5UX0ZBQ0VULmdldElkKCkpOworCQl3ZWJGcmFnbWVudEZhY2V0LmFkZExpc3RlbmVyKG5ldyBJRGF0YU1vZGVsTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKKwkJCQlpZiAoSVdlYkZyYWdtZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5XQVJfUFJPSkVDVF9OQU1FLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKKwkJCQkJaWYgKGlzUHJvcGVydHlTZXQoV0FSX1BST0pFQ1RfTkFNRSkpCisJCQkJCQlzZXRQcm9wZXJ0eShXQVJfUFJPSkVDVF9OQU1FLCBldmVudC5nZXRQcm9wZXJ0eSgpKTsKKwkJCQkJZWxzZQorCQkJCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoV0FSX1BST0pFQ1RfTkFNRSwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7CisJCQkJfWVsc2UgaWYgKElXZWJGcmFnbWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX1dBUi5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpKSB7CisJCQkJCXNldFByb3BlcnR5KEFERF9UT19XQVIsIGV2ZW50LmdldFByb3BlcnR5KCkpOworCQkJCX0KKwkJCX0KKwkJfSk7CQorCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmICggV0FSX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSApIHsKKwkJCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KEFERF9UT19XQVIpKSB7CisJCQkJCQorCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlV2ViUHJvakZvcldlYkZyYWdtZW50KG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFdBUl9QUk9KRUNUX05BTUUpKTsKKwkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKQorCQkJCQkJcmV0dXJuIHN0YXR1czsKKwkJCQkJCisJCQkJCWlmIChnZXRTdHJpbmdQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSkuZXF1YWxzKGdldFN0cmluZ1Byb3BlcnR5KFdBUl9QUk9KRUNUX05BTUUpKSkgeworCQkJCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5TQU1FX01PRFVMRV9BTkRfRUFSX05BTUUsIG5ldyBPYmplY3RbXXtnZXRTdHJpbmdQcm9wZXJ0eShXQVJfUFJPSkVDVF9OQU1FKX0pOworCQkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOworCQkJCQl9CisJCQkJfQorCQl9CisJCXJldHVybiBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOworCX0KKwkKKwkKKwlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVdlYlByb2pGb3JXZWJGcmFnbWVudChTdHJpbmcgd2ViQXBwTmFtZSkgeworCQlpZiAod2ViQXBwTmFtZS5pbmRleE9mKCIjIikgIT0gLTEgfHwgd2ViQXBwTmFtZS5pbmRleE9mKCIvIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLkVSUl9JTlZBTElEX0NIQVJTKTsKKwkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKKwkJfSBlbHNlIGlmICh3ZWJBcHBOYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5FUlJfRU1QVFlfTU9EVUxFX05BTUUpOworCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOworCQl9CisJCQorCQlJU3RhdHVzIHN0YXR1cyA9IFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3LnZhbGlkYXRlUHJvamVjdE5hbWUod2ViQXBwTmFtZSk7CisJCS8vY2hlY2sgZm9yIHRoZSBkZWxldGVkIGNhc2UsIHRoZSBwcm9qZWN0IGlzIGRlbGV0ZWQgZnJvbSB0aGUgd29ya3NwYWNlIGJ1dCBzdGlsbCBleGlzdHMgaW4gdGhlCisJCS8vZmlsZSBzeXN0ZW0uCisJCWlmKCBzdGF0dXMuaXNPSygpKXsKKwkJCUlQcm9qZWN0IHdlYlByb2ogPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZ2V0U3RyaW5nUHJvcGVydHkoV0FSX1BST0pFQ1RfTkFNRSkpOworCQkJaWYoICF3ZWJQcm9qLmV4aXN0cygpICl7CisJCQkJSVBhdGggcGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKKwkJCQlwYXRoID0gcGF0aC5hcHBlbmQod2ViQXBwTmFtZSk7CisJCQkJc3RhdHVzID0gUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXJOZXcudmFsaWRhdGVFeGlzdGluZyh3ZWJBcHBOYW1lLCBwYXRoLnRvT1NTdHJpbmcoKSk7CisJCQl9IGVsc2V7CisJCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKHdlYlByb2osIElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUIpOworCQkJCWlmKGZhY2V0VmVyc2lvbiAhPSBudWxsKXsKKwkJCQkJaWYoZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfMjIgfHwKKwkJCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfMjMgfHwKKwkJCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfMjQgfHwKKwkJCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfMjUpeworCQkJCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFJlc291cmNlcy5XRUJfRlJBR01FTlRfV0VCX0lOQ09NUEFUSUJJTElUWTsKKwkJCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gc3RhdHVzOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisJCWlmIChBRERfVE9fV0FSLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfWVsc2UgaWYgKFdBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKwkJCUlEYXRhTW9kZWwgbmVzdGVkSjJFRUZhY2V0RGF0YU1vZGVsID0gZ2V0SjJFRUZhY2V0TW9kZWwoKTsKKwkJCWlmIChuZXN0ZWRKMkVFRmFjZXREYXRhTW9kZWwhPW51bGwpCisJCQkJcmV0dXJuIG5lc3RlZEoyRUVGYWNldERhdGFNb2RlbC5nZXRQcm9wZXJ0eShJV2ViRnJhZ21lbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLldBUl9QUk9KRUNUX05BTUUpOworCQl9CisJCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgeworCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CisJCW5hbWVzLmFkZChXQVJfUFJPSkVDVF9OQU1FKTsKKwkJbmFtZXMuYWRkKEFERF9UT19XQVIpOworCQkKKwkJcmV0dXJuIG5hbWVzOworCX0KKwkKKwkgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzCisJICAgIAorICAgICBleHRlbmRzIE5MUworICAgICAKKyB7CisgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQl9GUkFHTUVOVF9XRUJfSU5DT01QQVRJQklMSVRZOworICAgICBzdGF0aWMKKyAgICAgeworICAgICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2VzKCBXZWJGcmFnbWVudEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7CisgICAgIH0KKyB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi93ZWJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYi9wcm9qZWN0L2ZhY2V0L1dlYkZyYWdtZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGcmFnbWVudEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTk0MWZkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIvd2VicHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWIvcHJvamVjdC9mYWNldC9XZWJGcmFnbWVudEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDExIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitXRUJfRlJBR01FTlRfV0VCX0lOQ09NUEFUSUJJTElUWT1XZWIgRnJhZ21lbnRzIHJlcXVpcmUgYSBXZWIgTW9kdWxlIHdpdGggdmVyc2lvbiAzLjAgb3IgaGlnaGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMyMjNiZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id2Vic2VydmljZS8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0ZDI4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi13ZWJzZXJ2aWNlLmphcgotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmNmYjQzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3M2MxZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1dlZCBNYXkgMzAgMjA6MzQ6MTYgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWI0NjllLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjAyLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblZlbmRvcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21wb25lbnRjb3JlLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbnN0YW50czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud3NkZC5wcm92aWRlcjt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uud3N0LndzLnBhcnNlcjtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNC4wLDEuNS4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2Fib3V0Lmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwZDVlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zb3VyY2UuLiA9IHdlYnNlcnZpY2UvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODBjYjEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UiIGZyYWdtZW50PSJmYWxzZSIvPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmc19zZXJ2aWNlUmVmc19TZXJ2aWNlUmVmLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmc19zZXJ2aWNlUmVmc19TZXJ2aWNlUmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwZDhiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnNfc2VydmljZVJlZnNfU2VydmljZVJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25zX0Rlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjA3NGZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uc19EZXNjcmlwdGlvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzA1MzU3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kZXNjcmlwdGlvbnNfRGVzY3JpcHRpb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9kaXNwbGF5TmFtZXNfRGlzcGxheU5hbWUuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZGY4ZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaXB0aW9uR3JvdXBfZGlzcGxheU5hbWVzX0Rpc3BsYXlOYW1lVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZGQyNTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2Rpc3BsYXlOYW1lc19EaXNwbGF5TmFtZVR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2ljb25zX0ljb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpcHRpb25Hcm91cF9pY29uc19JY29uVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzAwZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmlwdGlvbkdyb3VwX2ljb25zX0ljb25UeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9pbml0UGFyYW1zX0luaXRQYXJhbS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfaW5pdFBhcmFtc19Jbml0UGFyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjllNGJhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9pbml0UGFyYW1zX0luaXRQYXJhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfaW5pdFBhcmFtc19QYXJhbVZhbHVlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9pbml0UGFyYW1zX1BhcmFtVmFsdWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJmMmI2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9pbml0UGFyYW1zX1BhcmFtVmFsdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBIZWFkZXJzX1FOYW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwSGVhZGVyc19RTmFtZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmOTNlMDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBIZWFkZXJzX1FOYW1lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwSGVhZGVyc19TT0FQSGVhZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlSGFuZGxlcl9zb2FwSGVhZGVyc19TT0FQSGVhZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBjYTk1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcEhlYWRlcnNfU09BUEhlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcEhlYWRlcnNfV1NETFBvcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBIZWFkZXJzX1dTRExQb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiOWFhNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcEhlYWRlcnNfV1NETFBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVIYW5kbGVyX3NvYXBSb2xlc19TT0FQUm9sZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcFJvbGVzX1NPQVBSb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1YjBiMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUhhbmRsZXJfc29hcFJvbGVzX1NPQVBSb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9kZXNjcmlwdGlvblR5cGVfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9kZXNjcmlwdGlvblR5cGVfRGVzY3JpcHRpb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyMDJjNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfZGVzY3JpcHRpb25UeXBlX0Rlc2NyaXB0aW9uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfZGlzcGxheU5hbWVUeXBlX0Rpc3BsYXlOYW1lVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfZGlzcGxheU5hbWVUeXBlX0Rpc3BsYXlOYW1lVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2Q0NGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2Rpc3BsYXlOYW1lVHlwZV9EaXNwbGF5TmFtZVR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2hhbmRsZXJzX0hhbmRsZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X2hhbmRsZXJzX0hhbmRsZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWVlMzY3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9oYW5kbGVyc19IYW5kbGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9pY29uVHlwZV9JY29uVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfaWNvblR5cGVfSWNvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTBiN2ZmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF9pY29uVHlwZV9JY29uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfc2VydmljZUltcGxCZWFuX1NlcnZpY2VJbXBsQmVhbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvcnRDb21wb25lbnRfc2VydmljZUltcGxCZWFuX1NlcnZpY2VJbXBsQmVhbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2N2VlOTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X3NlcnZpY2VJbXBsQmVhbl9TZXJ2aWNlSW1wbEJlYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X3dzZGxQb3J0X1dTRExQb3J0LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9ydENvbXBvbmVudF93c2RsUG9ydF9XU0RMUG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0M2Y2ZGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQb3J0Q29tcG9uZW50X3dzZGxQb3J0X1dTRExQb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX0JlYW5MaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX0JlYW5MaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiYmM1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19CZWFuTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9iZWFuTGlua19FSkJMaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX0VKQkxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2U0NzA1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX0VKQkxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fYmVhbkxpbmtfU2VydmxldExpbmsuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fYmVhbkxpbmtfU2VydmxldExpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M2ZmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2JlYW5MaW5rX1NlcnZsZXRMaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZUltcGxCZWFuX2VFSkJMaW5rX0VKQkxpbmsuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fZUVKQkxpbmtfRUpCTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZTQ3MDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fZUVKQkxpbmtfRUpCTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9lU2VydmxldExpbmtfU2VydmxldExpbmsuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlSW1wbEJlYW5fZVNlcnZsZXRMaW5rX1NlcnZsZXRMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNmZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VJbXBsQmVhbl9lU2VydmxldExpbmtfU2VydmxldExpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX2hhbmRsZXJzX0hhbmRsZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX2hhbmRsZXJzX0hhbmRsZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjY4MGNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9oYW5kbGVyc19IYW5kbGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9wb3J0Q29tcG9uZW50UmVmc19Qb3J0Q29tcG9uZW50UmVmLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9wb3J0Q29tcG9uZW50UmVmc19Qb3J0Q29tcG9uZW50UmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzMTgwYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfcG9ydENvbXBvbmVudFJlZnNfUG9ydENvbXBvbmVudFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlcnZpY2VSZWZfc2VydmljZVFuYW1lX1FOYW1lLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfUU5hbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzA3YjM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfUU5hbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX3NlcnZpY2VRbmFtZV9TT0FQSGVhZGVyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfU09BUEhlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjk5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX3NlcnZpY2VRbmFtZV9TT0FQSGVhZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VydmljZVJlZl9zZXJ2aWNlUW5hbWVfV1NETFBvcnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX3NlcnZpY2VRbmFtZV9XU0RMUG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZWI0MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZXJ2aWNlUmVmX3NlcnZpY2VRbmFtZV9XU0RMUG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9kZXNjcmlwdGlvblR5cGVfRGVzY3JpcHRpb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX2Rlc2NyaXB0aW9uVHlwZV9EZXNjcmlwdGlvblR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc3MjQ1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX2Rlc2NyaXB0aW9uVHlwZV9EZXNjcmlwdGlvblR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGlzcGxheU5hbWVUeXBlX0Rpc3BsYXlOYW1lVHlwZS5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9kaXNwbGF5TmFtZVR5cGVfRGlzcGxheU5hbWVUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwN2E4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9kaXNwbGF5TmFtZVR5cGVfRGlzcGxheU5hbWVUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX2ljb25UeXBlX0ljb25UeXBlLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX2ljb25UeXBlX0ljb25UeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkZDc1ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9pY29uVHlwZV9JY29uVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbl9wb3J0Q29tcG9uZW50c19Qb3J0Q29tcG9uZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX3BvcnRDb21wb25lbnRzX1BvcnRDb21wb25lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGJjMzRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uX3BvcnRDb21wb25lbnRzX1BvcnRDb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlc0NsaWVudF9jb21wb25lbnRTY29wZWRSZWZzX0NvbXBvbmVudFNjb3BlZFJlZnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXZWJTZXJ2aWNlc0NsaWVudF9jb21wb25lbnRTY29wZWRSZWZzX0NvbXBvbmVudFNjb3BlZFJlZnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTRkNzQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNDbGllbnRfY29tcG9uZW50U2NvcGVkUmVmc19Db21wb25lbnRTY29wZWRSZWZzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNDbGllbnRfc2VydmljZVJlZnNfU2VydmljZVJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50X3NlcnZpY2VSZWZzX1NlcnZpY2VSZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmY2ODhlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNDbGllbnRfc2VydmljZVJlZnNfU2VydmljZVJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdlYlNlcnZpY2VzX3dlYlNlcnZpY2VEZXNjcmlwdGlvbnNfV2ViU2VydmljZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNfd2ViU2VydmljZURlc2NyaXB0aW9uc19XZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTJhZDljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV2ViU2VydmljZXNfd2ViU2VydmljZURlc2NyaXB0aW9uc19XZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvQmVhbkxpbmsuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvQmVhbkxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTI0ZjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0JlYW5MaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0NvbXBvbmVudFNjb3BlZFJlZnMuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvQ29tcG9uZW50U2NvcGVkUmVmcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNmUzYjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvQ29tcG9uZW50U2NvcGVkUmVmcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9FSkJMaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0VKQkxpbmsuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzg1NGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L0VKQkxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvSGFuZGxlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9IYW5kbGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0NTUxYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9IYW5kbGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1BvcnRDb21wb25lbnQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvUG9ydENvbXBvbmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjY2MGVjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1BvcnRDb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvUG9ydENvbXBvbmVudFJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9Qb3J0Q29tcG9uZW50UmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhlM2NmMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9Qb3J0Q29tcG9uZW50UmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NPQVBIZWFkZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU09BUEhlYWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjk5MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU09BUEhlYWRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2aWNlSW1wbEJlYW4uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmljZUltcGxCZWFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4NzQ3NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2aWNlSW1wbEJlYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvU2VydmljZVJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2aWNlUmVmLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhYzRmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2aWNlUmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NlcnZsZXRMaW5rLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1NlcnZsZXRMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkMzgxZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9TZXJ2bGV0TGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XU0RMUG9ydC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XU0RMUG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDE1OTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV1NETFBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV2ViU2VydmljZURlc2NyaXB0aW9uLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dlYlNlcnZpY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTM0NWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV2ViU2VydmljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dlYlNlcnZpY2VzLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L1dlYlNlcnZpY2VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3ZGM3ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XZWJTZXJ2aWNlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XZWJTZXJ2aWNlc0NsaWVudC5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9XZWJTZXJ2aWNlc0NsaWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YWQ1ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvV2ViU2VydmljZXNDbGllbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9pbml0aWFsaXpfcGFyYW1ldGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyYTU3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9pbml0aWFsaXpfcGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3NlcnZsZXQuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc2VydmxldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMWJlY2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc2VydmxldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9zZXNzaW9uQmVhbl9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc2Vzc2lvbkJlYW5fb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3YjhhOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvZnVsbC9vYmoxNi9zZXNzaW9uQmVhbl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc3J2Y2VfZWxlbV9vYmouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvc3J2Y2VfZWxlbV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmRjYjNmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3NydmNlX2VsZW1fb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9mdWxsL29iajE2L3dzZGwuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvd3NkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL2Z1bGwvb2JqMTYvd3NkbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvY29tcG9uZW50c2NvcGVkcmVmLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9jb21wb25lbnRzY29wZWRyZWYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBiMDIwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9jb21wb25lbnRzY29wZWRyZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L2hhbmRsZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L2hhbmRsZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzgzMzljLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9oYW5kbGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9wb3J0Y29tcG9uZW50LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi9wb3J0Y29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzMGUyZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvcG9ydGNvbXBvbmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvc2VydmljZXJlZi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvb2JqMTYvc2VydmljZXJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MGM1YzkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L3NlcnZpY2VyZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L3dlYnNlcnZpY2VkZXNjLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy9vYmoxNi93ZWJzZXJ2aWNlZGVzYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL29iajE2L3dlYnNlcnZpY2VkZXNjLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pY29ucy93c2NlZGl0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL3dzY2VkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmM0MjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL3dzY2VkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvd3NlZGl0b3IuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ljb25zL3dzZWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjllYzM2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaWNvbnMvd3NlZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ltYWdlcy9mb3JtX2Jhbm5lci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaW1hZ2VzL2Zvcm1fYmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViYzBiMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvaW1hZ2VzL2Zvcm1fYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9pbWFnZXMvaG9tZV9uYXYuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ltYWdlcy9ob21lX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMGM2NjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL2ltYWdlcy9ob21lX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2M0NGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFByb3BlcnRpZXMgZm9yIGNvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2UuYXRrLnVpCi0jCi0jIEVudHJpZXMgYXJlIG9mIHRoZSBmb3JtIENPTlNUQU5UPXN0cmluZwotIwotIyBGaWxlIHBsdWdpbnMvY29tLmlibS5ldG9vbHMud2Vic2VydmljZS5hdGsudWkvcGx1Z2luLnByb3BlcnRpZXMsIHdzYS5ldG9vbHMud3MucHJvcGVydGllcywgbHVuYXIsIDIwMDMwOTIyYSAyNgotIyBWZXJzaW9uIDEuMjYgMDMvMDkvMDkgMTY6NDE6NDkKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi0KLXBsdWdpbk5hbWU9V2ViIFNlcnZpY2UgUGx1Zy1pbgotcGx1Z2luVmVuZG9yPUVjbGlwc2Uub3JnCi0KLQotIwotIyBFZGl0IG1vZGVscwotIwotV1NERF9FRElUX01PREVMX05BTUU9V2ViIFNlcnZpY2VzIEVkaXQgTW9kZWwKLUVESVRPUl9FRElUTU9ERUxTX1dFQl9TRVJWSUNFUz1XZWIgU2VydmljZXMgRWRpdG9yIEVkaXQgTW9kZWwKLVdTQ0REX0VESVRfTU9ERUxfTkFNRT1XZWIgU2VydmljZXMgQ2xpZW50IEVkaXQgTW9kZWwKLUVESVRPUl9FRElUTU9ERUxTX1dFQl9TRVJWSUNFU19DTElFTlQ9V2ViIFNlcnZpY2VzIENsaWVudCBFZGl0b3IgRWRpdCBNb2RlbAotCi0jCi0jQ29tbW9uIEVkaXRvciBNZXNzYWdlcwotIwotVElUTEVfU0FWRV9FUlJPUj1TYXZlIEVycm9yCi1NU0dfU0FWRV9FUlJPUj1BbiBlcnJvciBvY2N1cnJlZCB3aGVuIGF0dGVtcHRpbmcgdG8gc2F2ZSBlZGl0b3IgY29udGVudHMuCi0KLSMKLSMgTWVzc2FnZXMgaW4gV2ViU2VydmljZXNFZGl0b3IKLSMKLQotIwotIyBNZXNzYWdlcyBpbiBXZWJTZXJ2aWNlc0NsaWVudEVkaXRvcgotIwotCi0KLQotIwotIyBNZXNzYWdlcyBpbiBXZWJTZXJ2aWNlc1BhZ2UKLSMKLQotCi0jCi0jIE1lc3NhZ2VzIGluIFBvcnRDb21wb25lbnRQYWdlCi0jCi0KLQotIwotIyBNZXNzYWdlcyBpbiBIYW5kbGVyUGFnZQotIwotCi0KLSMKLSMgTWVzc2FnZXMgaW4gV2ViU2VydmljZXNDbGllbnRQYWdlCi0jCi0KLQotIwotIyBNZXNzYWdlcyBpbiBTZXJ2aWNlUmVmUGFnZQotIwotCi0KLSMKLSMgTGFiZWxzCi0jCi1MQUJFTF9VTlFVQUxJRklFRF9DT01QT05FTlQ9PHVucXVhbGlmaWVkPgotTEFCRUxfU0VSVkxFVF9MSU5LPVNlcnZsZXQgbGluawotCi0KLQotIwotIyBMYWJlbHMgZm9yIHRhYmxlIGxheW91dAotIwotTEFCRUxfVEFCTEVfTkFNRT1OYW1lCi1MQUJFTF9UQUJMRV9WQUxVRT1WYWx1ZQotTEFCRUxfVEFCTEVfU09BUF9ST0xFPVNPQVAgcm9sZQotTEFCRUxfVEFCTEVfUE9SVF9OQU1FPVBvcnQgbmFtZQotTEFCRUxfVEFCTEVfUE9SVF9DT01QT05FTlRfTElOSz1Qb3J0IGNvbXBvbmVudCBsaW5rCi1MQUJFTF9UQUJMRV9ERVNDUklQVElPTj1EZXNjcmlwdGlvbgotCi0jCi0jIFBhZ2UgYW5kIFNlY3Rpb24gdGl0bGVzL2Rlc2NyaXB0aW9ucwotIwotCi0KLQotCi0jCi0jIERpYWxvZyBsYWJlbHMKLSMKLQotCi0jCi0jIFRvb2x0aXBzCi0jCi0KLQotIwotIyBMYWJlbHMgZm9yIHByb3ZpZGVycwotIwotX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlPVdlYiBzZXJ2aWNlIGRlc2NyaXB0aW9uCi1fVUlfUG9ydENvbXBvbmVudF90eXBlPVBvcnQgY29tcG9uZW50Ci1fVUlfSGFuZGxlcl90eXBlPUhhbmRsZXIKLV9VSV9Qb3J0Q29tcG9uZW50UmVmX3R5cGU9UG9ydCBjb21wb25lbnQgcmVmZXJlbmNlCi1fVUlfU2VydmljZVJlZl90eXBlPVNlcnZpY2UgcmVmZXJlbmNlCi1fVUlfV2ViU2VydmljZXNDbGllbnRfdHlwZT1XZWIgc2VydmljZXMgY2xpZW50Ci1fVUlfQ29tcG9uZW50U2NvcGVkUmVmc190eXBlPUNvbXBvbmVudCBzY29wZWQgcmVmZXJlbmNlCi1fVUlfV1NETFBvcnRfdHlwZT1XU0RMIHBvcnQKLV9VSV9XZWJTZXJ2aWNlc190eXBlPVdlYiBzZXJ2aWNlcwotX1VJX1NlcnZsZXRMaW5rX3R5cGU9U2VydmxldCBsaW5rCi1fVUlfU2VydmljZUltcGxCZWFuX3R5cGU9U2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuCi1fVUlfRUpCTGlua190eXBlPUVKQiBsaW5rCi1fVUlfQmVhbkxpbmtfdHlwZT1CZWFuIGxpbmsKLV9VSV9TT0FQUm9sZV90eXBlPVNPQVAgcm9sZQotX1VJX1NPQVBIZWFkZXJfdHlwZT1TT0FQIGhlYWRlcgotX1VJX1BvcnROYW1lX3R5cGU9UG9ydCBuYW1lCi1fVUlfSW5pdFBhcmFtX3R5cGU9SW5pdGlhbCBwYXJhbWV0ZXIKLV9VSV9TZXJ2aWNlUmVmX2pheHJwY01hcHBpbmdGaWxlX2ZlYXR1cmU9SmF4cnBjIE1hcHBpbmcgRmlsZQotX1VJX1NlcnZpY2VSZWZfamF4cnBjTWFwcGluZ0ZpbGVfZmVhdHVyZV9kZXNjPVRoZSBqYXhycGMgbWFwcGluZyBmaWxlLgotX1VJX1NlcnZpY2VSZWZfc2VydmljZUludGVyZmFjZV9mZWF0dXJlPVNlcnZpY2UgSW50ZXJmYWNlCi1fVUlfU2VydmljZVJlZl9zZXJ2aWNlSW50ZXJmYWNlX2ZlYXR1cmVfZGVzYz1UaGUgc2VydmljZSBpbnRlcmZhY2UuCi1fVUlfU2VydmljZVJlZl9zZXJ2aWNlUmVmTmFtZV9mZWF0dXJlPU5hbWUKLV9VSV9TZXJ2aWNlUmVmX3NlcnZpY2VSZWZOYW1lX2ZlYXR1cmVfZGVzYz1UaGUgc2VydmljZSByZWZlcmVuY2UgbmFtZS4KLV9VSV9TZXJ2aWNlUmVmX3dzZGxGaWxlX2ZlYXR1cmU9V3NkbCBGaWxlCi1fVUlfU2VydmljZVJlZl93c2RsRmlsZV9mZWF0dXJlX2Rlc2M9VGhlIC53c2RsIGZpbGUuCi1fVUlfUG9ydENvbXBvbmVudFJlZl9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZT1TZXJ2aWNlIEVuZHBvaW50IEludGVyZmFjZQotX1VJX1BvcnRDb21wb25lbnRSZWZfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ZlYXR1cmVfZGVzYz1UaGUgc2VydmljZSBlbmRwb2ludCBpbnRlcmZhY2UuCi1fVUlfUG9ydENvbXBvbmVudFJlZl9wb3J0Q29tcG9uZW50TGlua19mZWF0dXJlPUxpbmsKLV9VSV9Qb3J0Q29tcG9uZW50UmVmX3BvcnRDb21wb25lbnRMaW5rX2ZlYXR1cmVfZGVzYz1UaGUgcG9ydCBjb21wb25lbnQgbGluay4KLV9VSV9IYW5kbGVyX3NvYXBSb2xlc19mZWF0dXJlPVNvYXAgUm9sZXMKLV9VSV9IYW5kbGVyX3NvYXBSb2xlc19mZWF0dXJlX2Rlc2M9VGhlIGhhbmRsZXIgc29hcCByb2xlcy4KLV9VSV9IYW5kbGVyX3BvcnROYW1lc19mZWF0dXJlPVBvcnQgTmFtZXMKLV9VSV9IYW5kbGVyX3BvcnROYW1lc19mZWF0dXJlX2Rlc2M9VGhlIGhhbmRsZXIgcG9ydCBuYW1lcy4KLV9VSV9IYW5kbGVyX2hhbmRsZXJOYW1lX2ZlYXR1cmU9SGFuZGxlciBOYW1lCi1fVUlfSGFuZGxlcl9oYW5kbGVyTmFtZV9mZWF0dXJlX2Rlc2M9VGhlIGhhbmRsZXIgbmFtZS4KLV9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlPUhhbmRsZXIgQ2xhc3MKLV9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlX2Rlc2M9VGhlIGhhbmRsZXIgY2xhc3MuCi1fVUlfSW5pdFBhcmFtX3BhcmFtTmFtZV9mZWF0dXJlPU5hbWUKLV9VSV9Jbml0UGFyYW1fcGFyYW1OYW1lX2ZlYXR1cmVfZGVzYz1UaGUgaW5pdGlhbCBwYXJhbWV0ZXIgbmFtZS4KLV9VSV9Jbml0UGFyYW1fZGVzY3JpcHRpb25fZmVhdHVyZT1EZXNjcmlwdGlvbgotX1VJX0luaXRQYXJhbV9kZXNjcmlwdGlvbl9mZWF0dXJlX2Rlc2M9VGhlIGluaXRpYWwgcGFyYW1ldGVyIGRlc2NyaXB0aW9uLgotX1VJX0luaXRQYXJhbV9wYXJhbVZhbHVlX2ZlYXR1cmU9VmFsdWUKLV9VSV9Jbml0UGFyYW1fcGFyYW1WYWx1ZV9mZWF0dXJlX2Rlc2M9VGhlIGluaXRpYWwgcGFyYW1ldGVyIHZhbHVlLgotX1VJX0pheFJQQ01pc3NpbmdNb2RlbD1NYXBwaW5nIGZpbGUgbmFtZSB1bmtub3duLgotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmNkMGI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi08IS0tICBEeWFubWljIENvbnRlbnQgUHJvdmlkZXIgZXh0ZW5zaW9ucyAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9IndlYnNlcnZpY2VfY2xpZW50LnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiPgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDxhZGFwdGVyRmFjdG9yeQotICAgICAgICAgICAgZnVuY3Rpb25Hcm91cElEPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlci5Xc2NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0id3Njb21tb24ueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8L2FkYXB0ZXJGYWN0b3J5PgotICAgICAgPGFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICBmdW5jdGlvbkdyb3VwSUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeSIKLSAgICAgICAgICAgIHBhY2thZ2VVUkk9ImNsaWVudC54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlci5XZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Rm9yQ2xpZW50Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRFZGl0b3JJdGVtUHJvdmlkZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0id2Vic2VydmljZV9jbGllbnQueG1pIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2Uud3NjbGllbnQucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeUZvcldTQ2xpZW50Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV2Vic2VydmljZV9jbGllbnRFZGl0b3JJdGVtUHJvdmlkZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0iZWpiLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY2xpZW50LnByb3ZpZGVyLldlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnlGb3JFSkIiPgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgICAgIDxhZGFwdGVyRmFjdG9yeQotICAgICAgICAgICAgZnVuY3Rpb25Hcm91cElEPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlci5XZWJzZXJ2aWNlX2NsaWVudEVkaXRvckl0ZW1Qcm92aWRlckZhY3RvcnkiCi0gICAgICAgICAgICBwYWNrYWdlVVJJPSJ3ZWJhcHBsaWNhdGlvbi54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS53c2NsaWVudC5wcm92aWRlci5XZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Rm9yV0VCIj4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIuV3NkZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0id3NkZC54bWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlci5Xc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiPgotICAgICAgPC9hZGFwdGVyRmFjdG9yeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbEV4dGVuc2lvbiI+Ci0gICAgICA8ZWRpdE1vZGVsRXh0ZW5zaW9uCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0ianN0LndlYiIKLSAgICAgICAgICAgIGlkPSJ3ZWJzZXJ2aWNlcy53ZWIuZWRpdE1vZGVsZXh0ZW5zaW9uIj4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgVVJJPSJXRUItSU5GL3dlYnNlcnZpY2VzY2xpZW50LnhtbCI+Ci0gICAgICAgICA8L2VkaXRNb2RlbFJlc291cmNlPgotICAgICAgICAgPGVkaXRNb2RlbFJlc291cmNlCi0gICAgICAgICAgICAgICBVUkk9IldFQi1JTkYvd2Vic2VydmljZXMueG1sIj4KLSAgICAgICAgIDwvZWRpdE1vZGVsUmVzb3VyY2U+Ci0gICAgICA8L2VkaXRNb2RlbEV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uLmVkaXRNb2RlbEV4dGVuc2lvbiI+Ci0gICAgICA8ZWRpdE1vZGVsRXh0ZW5zaW9uCi0gICAgICAgICAgICBlZGl0TW9kZWxJRD0ianN0LmVqYiIKLSAgICAgICAgICAgIGlkPSJ3ZWJzZXJ2aWNlcy5lamIuZWRpdE1vZGVsZXh0ZW5zaW9uIj4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgVVJJPSJNRVRBLUlORi93ZWJzZXJ2aWNlc2NsaWVudC54bWwiPgotICAgICAgICAgPC9lZGl0TW9kZWxSZXNvdXJjZT4KLSAgICAgICAgIDxlZGl0TW9kZWxSZXNvdXJjZQotICAgICAgICAgICAgICAgVVJJPSJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiPgotICAgICAgICAgPC9lZGl0TW9kZWxSZXNvdXJjZT4KLSAgICAgIDwvZWRpdE1vZGVsRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uZWRpdE1vZGVsRXh0ZW5zaW9uIj4KLSAgICAgIDxlZGl0TW9kZWxFeHRlbnNpb24KLSAgICAgICAgICAgIGVkaXRNb2RlbElEPSJqc3QuYXBwY2xpZW50IgotICAgICAgICAgICAgaWQ9IndlYnNlcnZpY2VzLmFwcGNsaWVudC5lZGl0TW9kZWxleHRlbnNpb24iPgotICAgICAgICAgPGVkaXRNb2RlbFJlc291cmNlCi0gICAgICAgICAgICAgICBVUkk9Ik1FVEEtSU5GL3dlYnNlcnZpY2VzY2xpZW50LnhtbCI+Ci0gICAgICAgICA8L2VkaXRNb2RlbFJlc291cmNlPgotICAgICAgICAgPGVkaXRNb2RlbFJlc291cmNlCi0gICAgICAgICAgICAgICBVUkk9Ik1FVEEtSU5GL3dlYnNlcnZpY2VzLnhtbCI+Ci0gICAgICAgICA8L2VkaXRNb2RlbFJlc291cmNlPgotICAgICAgPC9lZGl0TW9kZWxFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IldTRExTZXJ2aWNlSGVscGVyIgotICAgICAgICAgbmFtZT0iV1NETFNlcnZpY2VIZWxwZXIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuV1NETFNlcnZpY2VIZWxwZXIiPgotICAgICAgPHdzZGxIZWxwZXIKLSAgICAgICAgICAgIGhlbHBlckNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlci5XU0RMU2VydmljZUhlbHBlckltcGwiPgotICAgICAgPC93c2RsSGVscGVyPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLnJlc291cmNlRmFjdG9yaWVzIj4KLSAgICAgIDxyZXNvdXJjZUZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzZGQuV3NkZFJlc291cmNlRmFjdG9yeSIKLSAgICAgICAgICAgIHNob3J0U2VnbWVudD0id2Vic2VydmljZXMueG1sIi8+Ci0gICAgICA8cmVzb3VyY2VGYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5pbnRlcm5hbC53c2RkLldzZGRSZXNvdXJjZUZhY3RvcnkiCi0gICAgICAgICAgICBzaG9ydFNlZ21lbnQ9IndlYnNlcnZpY2VzLXRlbXAueG1sIi8+Ci0gICAgICA8cmVzb3VyY2VGYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5pbnRlcm5hbC5pbXBsLldlYlNlcnZpY2VzQ2xpZW50UmVzb3VyY2VGYWN0b3J5IgotICAgICAgICAgICAgc2hvcnRTZWdtZW50PSJ3ZWJzZXJ2aWNlc2NsaWVudC54bWwiLz4gCi0gICA8L2V4dGVuc2lvbj4KLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUucmVzb3VyY2VGYWN0b3JpZXMiPgotICAgICAgPHJlc291cmNlRmFjdG9yeQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuaW50ZXJuYWwud3NkZC5Xc2RkUmVzb3VyY2VGYWN0b3J5IgotICAgICAgICAgICAgc2hvcnRTZWdtZW50PSJ3ZWJzZXJ2aWNlcy54bWwiLz4KLSAgICAgIDxyZXNvdXJjZUZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLndzZGQuV3NkZFJlc291cmNlRmFjdG9yeSIKLSAgICAgICAgICAgIHNob3J0U2VnbWVudD0id2Vic2VydmljZXMtdGVtcC54bWwiLz4KLSAgICAgIDxyZXNvdXJjZUZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LmludGVybmFsLmltcGwuV2ViU2VydmljZXNDbGllbnRSZXNvdXJjZUZhY3RvcnkiCi0gICAgICAgICAgICBzaG9ydFNlZ21lbnQ9IndlYnNlcnZpY2VzY2xpZW50LnhtbCIvPiAKLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcHJlcGFyZWZvcnBpaS54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcHJlcGFyZWZvcnBpaS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OGYyNzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3ByZXBhcmVmb3JwaWkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPHByb2plY3QgbmFtZT0iUHJlcGFyZUZvclBJSSIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+Ci0JCQotCTwhLS0gU2V0dXAgdGVtcCB2YXJpYWJsZXMgLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9Im5sc0RpciIgdmFsdWU9ImQ6L05MUy9Db3JvbmEvMDUyNiIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0iY29tLmlibS53dHAud2Vic2VydmljZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luZGlyIiB2YWx1ZT0iZDovd29ya3NwYWNlQ29yb25hLyR7cGx1Z2lufSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0cHV0RGlyIiB2YWx1ZT0iJHtubHNEaXJ9LyR7cGx1Z2lufSIvPgotCQkKLQkKLQk8L3RhcmdldD4KLQotCTwhLS0gQ3JlYXRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgLS0+Ci0JPHRhcmdldCBuYW1lPSJubHNEaXIiIGRlcGVuZHM9ImluaXQiPgotCQk8bWtkaXIgZGlyPSIke25sc0Rpcn0iLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIENyZWF0ZSB0aGUgZGVzdGluYXRpb24gZGlyIC0tPgotCTx0YXJnZXQgbmFtZT0icGx1Z2luZGlyIiBkZXBlbmRzPSJubHNEaXIiPgotCQk8ZGVsZXRlIGRpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0JCTxta2RpciBkaXI9IiR7b3V0cHV0RGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBNb3ZlIHRoZSBmaWxlcyB0byB0aGUgY29ycmVjdCBsb2NhdGlvbnMgaW4gdGhlIHdvcmtzcGFjZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwbHVnaW5kaXIiPgotCQotCQk8bWVzc2FnZUlkR2VuIGZvbGRlclBhdGggPSAiJHtwbHVnaW5kaXJ9IiBjb21wb25lbnRJZCA9ICJFIiAvPgotCQkKLQkJPGNvcHkgdG9kaXIgPSAiJHtvdXRwdXREaXJ9L3Byb3BlcnR5X2ZpbGVzIiA+Ci0JCQkgPGZpbGVzZXQgZGlyPSIke3BsdWdpbmRpcn0vcHJvcGVydHlfZmlsZXMiPgotICAgICAgICAgICAJICA8aW5jbHVkZSBuYW1lPSIqKi8qLnByb3BlcnRpZXMiLz4KLSAgCQkJIDwvZmlsZXNldD4KLSAgCQk8L2NvcHk+Ci0gIAkJCi0gIAkJPGNvcHkgZmlsZT0iJHtwbHVnaW5kaXJ9L3BsdWdpbi5wcm9wZXJ0aWVzIiB0b2Rpcj0iJHtvdXRwdXREaXJ9Ii8+Ci0gIAkJCi0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcHJvcGVydHlfZmlsZXMvd2Vic2VydmljZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3Byb3BlcnR5X2ZpbGVzL3dlYnNlcnZpY2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE3YjBhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UvcHJvcGVydHlfZmlsZXMvd2Vic2VydmljZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRVJSX0hBTkRMRVJfRElTUExBWV9OQU1FX0VNUFRZPVRoZSBoYW5kbGVyIG5hbWUgY2Fubm90IGJlIGVtcHR5LgotRVJSX0hBTkRMRVJfRElTUExBWV9OQU1FX0VYSVNUPVRoZSBoYW5kbGVyIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1FUlJfSEFORExFUl9QQVJBTV9OQU1FX0VNUFRZPVRoZSBoYW5kbGVyIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBuYW1lIGNhbm5vdCBiZSBlbXB0eS4KLUVSUl9IQU5ETEVSX05BTUVTUEFDRV9VUkxfRU1QVFk9VGhlIGhhbmRsZXIgbmFtZSBzcGFjZSBVUkwgY2Fubm90IGJlIGVtcHR5LlNlcnZpY2VSZWZJdGVtUHJvdmlkZXIuMD1TZXJ2aWNlUmVmCi1FUlJfSEFORExFUl9QQVJBTV9OQU1FX0VYSVNUUz1UaGUgcGFyYW1ldGVyIG5hbWUgYWxyZWFkeSBleGlzdC4KLUVSUl9IQU5ETEVSX05BTUVTUEFDRV9VUkxfRVhJU1RTPVRoZSBoYW5kbGVyIG5hbWUgc3BhY2UgVVJMIGFscmVhZHkgZXhpc2l0LCBwbGVhc2UgY2hhbmdlIG5hbWUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJDQ29tYm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyQ0NvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZjQzYjUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJDQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyQ0NvbWJvIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JcHJpdmF0ZSBFT2JqZWN0IGVPYmplY3RfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmVfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGRpc3BsYXlGZWF0dXJlXzsKLQlwcml2YXRlIENDb21ibyBjb21ib187Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdERpc3BsYXlTdHJpbmdfOwotCi0JcHVibGljIEFkYXB0ZXJDQ29tYm8oRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBkaXNwbGF5RmVhdHVyZSwgQ0NvbWJvIGNvbWJvLCBTdHJpbmcgZGVmYXVsdERpc3BsYXlTdHJpbmcpIHsKLQkJc3VwZXIoKTsKLQkJZU9iamVjdF8gPSBudWxsOwotCQlmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JCWRpc3BsYXlGZWF0dXJlXyA9IGRpc3BsYXlGZWF0dXJlOwotCQljb21ib18gPSBjb21ibzsKLQkJY29tYm9fLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlkZWZhdWx0RGlzcGxheVN0cmluZ18gPSAoZGVmYXVsdERpc3BsYXlTdHJpbmcgIT0gbnVsbCkgPyBkZWZhdWx0RGlzcGxheVN0cmluZyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEFkYXB0ZXJDQ29tYm8oRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBkaXNwbGF5RmVhdHVyZSwgQ0NvbWJvIGNvbWJvKSB7Ci0JCXRoaXMoZmVhdHVyZSwgZGlzcGxheUZlYXR1cmUsIGNvbWJvLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckNDb21ibyhFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFU3RydWN0dXJhbEZlYXR1cmUgZGlzcGxheUZlYXR1cmUsIENDb21ibyBjb21ibykgewotCQl0aGlzKGVPYmplY3QsIGZlYXR1cmUsIGRpc3BsYXlGZWF0dXJlLCBjb21ibywgbnVsbCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJDQ29tYm8oRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGRpc3BsYXlGZWF0dXJlLCBDQ29tYm8gY29tYm8sIFN0cmluZyBkZWZhdWx0RGlzcGxheVN0cmluZykgewotCQl0aGlzKGZlYXR1cmUsIGRpc3BsYXlGZWF0dXJlLCBjb21ibywgZGVmYXVsdERpc3BsYXlTdHJpbmcpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJT2JqZWN0IG5vdGlmaWVyID0gbXNnLmdldE5vdGlmaWVyKCk7Ci0JCWlmIChub3RpZmllciA9PSBlT2JqZWN0XykgewotCQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLkFERCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5SRU1PVkUgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uQUREX01BTlkgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkpCi0JCQkJcG9wdWxhdGVDb21ibygpOwotCQl9IGVsc2UgaWYgKG1zZy5nZXRGZWF0dXJlKCkgPT0gZGlzcGxheUZlYXR1cmVfKQotCQkJcG9wdWxhdGVDb21ibygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbWJvKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbWJvXy5pc0Rpc3Bvc2VkKCkpCi0JCQkJCXJldHVybjsKLQkJCQlpbnQgc2VsZWN0aW9uSW5kZXggPSBjb21ib18uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlTdHJpbmcgdGV4dCA9IGNvbWJvXy5nZXRUZXh0KCk7Ci0JCQkJY29tYm9fLnJlbW92ZUFsbCgpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJCQlFTGlzdCBlTGlzdCA9IChFTGlzdCkgb2JqZWN0OwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCQkJCWNvbWJvXy5hZGQodG9EaXNwbGF5U3RyaW5nKCgoRU9iamVjdCkgaXQubmV4dCgpKS5lR2V0KGRpc3BsYXlGZWF0dXJlXykpKTsKLQkJCQl9IGVsc2UKLQkJCQkJY29tYm9fLmFkZCh0b0Rpc3BsYXlTdHJpbmcoKChFT2JqZWN0KSBvYmplY3QpLmVHZXQoZGlzcGxheUZlYXR1cmVfKSkpOwotCQkJCWludCBuZXdJbmRleCA9IGNvbWJvXy5pbmRleE9mKHRleHQpOwotCQkJCWlmIChzZWxlY3Rpb25JbmRleCAhPSAtMSAmJiBuZXdJbmRleCAhPSAtMSkKLQkJCQkJY29tYm9fLnNlbGVjdChuZXdJbmRleCk7Ci0JCQkJZWxzZQotCQkJCQljb21ib18uc2VsZWN0KDApOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcyA9IG9iamVjdC50b1N0cmluZygpOwotCQkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID4gMCkKLQkJCQlyZXR1cm4gczsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdERpc3BsYXlTdHJpbmdfOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQljb21ib18ucmVtb3ZlQWxsKCk7Ci0JCX0KLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9ICgoRUxpc3QpIG9iamVjdCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJCQkJKChFT2JqZWN0KSBpdGVtKS5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJCSgoRU9iamVjdCkgb2JqZWN0KS5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQlwb3B1bGF0ZUNvbWJvKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJaWYgKGNvbWJvXyAhPSBudWxsICYmICFjb21ib18uaXNEaXNwb3NlZCgpKQotCQkJY29tYm9fLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZjAzZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZEFkZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRSZW1vdmVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotcHVibGljIGNsYXNzIEFkYXB0ZXJFbGVtZW50IGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0OwotCXByaXZhdGUgRU9iamVjdCBwYXJlbnRfOwotCXByaXZhdGUgRUNsYXNzIGNoaWxkRUNsYXNzXzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmVfOwotCXByaXZhdGUgYm9vbGVhbiBjaGlsZE5pbGxhYmxlXzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzXzsKLQlwcml2YXRlIGJvb2xlYW5bXSBmZWF0dXJlc05pbGxhYmxlXzsKLQlwcml2YXRlIFRleHRbXSBmZWF0dXJlc1RleHRzXzsKLQlwcml2YXRlIEFkYXB0ZXJUZXh0W10gZmVhdHVyZXNBZGFwdGVyc187Ci0KLQlwdWJsaWMgQWRhcHRlckVsZW1lbnQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFQ2xhc3MgY2hpbGRFQ2xhc3MsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUsIGJvb2xlYW4gY2hpbGROaWxsYWJsZSwgRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXMsIGJvb2xlYW5bXSBmZWF0dXJlc05pbGxhYmxlLCBUZXh0W10gZmVhdHVyZXNUZXh0cykgewotCQlzdXBlcigpOwotCQlhcnRpZmFjdEVkaXQgPSBhbkFydGlmYWN0RWRpdDsKLQkJcGFyZW50XyA9IG51bGw7Ci0JCWNoaWxkRUNsYXNzXyA9IGNoaWxkRUNsYXNzOwotCQljaGlsZEZlYXR1cmVfID0gY2hpbGRGZWF0dXJlOwotCQljaGlsZE5pbGxhYmxlXyA9IGNoaWxkTmlsbGFibGU7Ci0JCWZlYXR1cmVzXyA9IGZlYXR1cmVzOwotCQlmZWF0dXJlc05pbGxhYmxlXyA9IGZlYXR1cmVzTmlsbGFibGU7Ci0JCWZlYXR1cmVzVGV4dHNfID0gZmVhdHVyZXNUZXh0czsKLQkJYWRkTW9kaWZ5TGlzdGVuZXIoKTsKLQkJZmVhdHVyZXNBZGFwdGVyc18gPSBuZXcgQWRhcHRlclRleHRbZmVhdHVyZXNfLmxlbmd0aF07Ci0JCW5ld0FkYXB0ZXJzKG51bGwpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRWxlbWVudChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIEVPYmplY3QgcGFyZW50LCBFQ2xhc3MgY2hpbGRFQ2xhc3MsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUsIGJvb2xlYW4gY2hpbGROaWxsYWJsZSwgRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXMsIGJvb2xlYW5bXSBmZWF0dXJlc05pbGxhYmxlLCBUZXh0W10gZmVhdHVyZXNUZXh0cykgewotCQl0aGlzKGFuQXJ0aWZhY3RFZGl0LCBjaGlsZEVDbGFzcywgY2hpbGRGZWF0dXJlLCBjaGlsZE5pbGxhYmxlLCBmZWF0dXJlcywgZmVhdHVyZXNOaWxsYWJsZSwgZmVhdHVyZXNUZXh0cyk7Ci0JCWFkYXB0KHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5ld0FkYXB0ZXJzKEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdCA9PSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc0FkYXB0ZXJzXy5sZW5ndGg7IGkrKykKLQkJCQlmZWF0dXJlc0FkYXB0ZXJzX1tpXSA9IG5ldyBBZGFwdGVyVGV4dChhcnRpZmFjdEVkaXQsIGZlYXR1cmVzX1tpXSwgZmVhdHVyZXNUZXh0c19baV0sIGZlYXR1cmVzTmlsbGFibGVfW2ldKTsKLQkJZWxzZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc0FkYXB0ZXJzXy5sZW5ndGg7IGkrKykKLQkJCQlmZWF0dXJlc0FkYXB0ZXJzX1tpXSA9IG5ldyBBZGFwdGVyVGV4dChhcnRpZmFjdEVkaXQsIGVPYmplY3QsIGZlYXR1cmVzX1tpXSwgZmVhdHVyZXNUZXh0c19baV0sIGZlYXR1cmVzTmlsbGFibGVfW2ldKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNUZXh0c18ubGVuZ3RoOyBpKyspCi0JCQlmZWF0dXJlc1RleHRzX1tpXS5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IGNoaWxkRmVhdHVyZV8pIHsKLQkJCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJaWYgKGNoaWxkID09IG51bGwgJiYgIWNoaWxkTmlsbGFibGVfKQotCQkJCWNoaWxkID0gc2V0Q2hpbGQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQkJZmVhdHVyZXNBZGFwdGVyc19baV0uYWRhcHQoY2hpbGQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWJvb2xlYW4gaXNUZXh0c051bGwgPSBpc1RleHRzTnVsbCgpOwotCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJYm9vbGVhbiBjaGlsZENhbkJlUmVtb3ZlZCA9IHRydWU7Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBhbGxmZWF0dXJlcyA9IGNoaWxkRUNsYXNzXy5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChhbGxmZWF0dXJlcy5oYXNOZXh0KCkpIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgdGhpc0ZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBhbGxmZWF0dXJlcy5uZXh0KCk7Ci0JCQkJaWYgKCFhZGFwdGluZ0ZlYXR1cmUodGhpc0ZlYXR1cmUpICYmIGNoaWxkLmVJc1NldCh0aGlzRmVhdHVyZSkpIHsKLQkJCQkJY2hpbGRDYW5CZVJlbW92ZWQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChpc1RleHRzTnVsbCAmJiBjaGlsZCAhPSBudWxsICYmIGNoaWxkTmlsbGFibGVfICYmIGNoaWxkQ2FuQmVSZW1vdmVkKSB7Ci0JCQlkaXNwb3NlQWRhcHRlcnMoKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJQ29tbWFuZFJlbW92ZUVsZW1lbnQgY29tbWFuZCA9IG5ldyBDb21tYW5kUmVtb3ZlRWxlbWVudChudWxsLCBudWxsLCBwYXJlbnRfLCBjaGlsZEZlYXR1cmVfKTsKLQkJCWFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJbmV3QWRhcHRlcnMobnVsbCk7Ci0JCX0gZWxzZSBpZiAoIWlzVGV4dHNOdWxsICYmIGNoaWxkID09IG51bGwpIHsKLQkJCWRpc3Bvc2VBZGFwdGVycygpOwotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQljaGlsZCA9IGNyZWF0ZUNoaWxkKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzXy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyB0ZXh0ID0gZmVhdHVyZXNUZXh0c19baV0uZ2V0VGV4dCgpOwotCQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJCWNoaWxkLmVTZXQoZmVhdHVyZXNfW2ldLCB0ZXh0KTsKLQkJCX0KLQkJCUNvbW1hbmRBZGRFbGVtZW50IGNvbW1hbmQgPSBuZXcgQ29tbWFuZEFkZEVsZW1lbnQobnVsbCwgbnVsbCwgcGFyZW50XywgY2hpbGRGZWF0dXJlXywgY2hpbGQpOwotCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCWFydGlmYWN0RWRpdC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQluZXdBZGFwdGVycyhjaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNUZXh0c051bGwoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNUZXh0c18ubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB0ZXh0ID0gZmVhdHVyZXNUZXh0c19baV0uZ2V0VGV4dCgpOwotCQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChwYXJlbnRfICE9IG51bGwpCi0JCQlwYXJlbnRfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJcGFyZW50XyA9IGVPYmplY3Q7Ci0JCUVPYmplY3QgY2hpbGQgPSBudWxsOwotCQlpZiAocGFyZW50XyAhPSBudWxsKSB7Ci0JCQlwYXJlbnRfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCWNoaWxkID0gKEVPYmplY3QpIHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsICYmICFjaGlsZE5pbGxhYmxlXykKLQkJCQljaGlsZCA9IHNldENoaWxkKCk7Ci0JCX0KLQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc0FkYXB0ZXJzXy5sZW5ndGg7IGkrKykKLQkJCWZlYXR1cmVzQWRhcHRlcnNfW2ldLmFkYXB0KGNoaWxkKTsKLQkJYWRkTW9kaWZ5TGlzdGVuZXIoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3Qgc2V0Q2hpbGQoKSB7Ci0JCUVPYmplY3QgY2hpbGQgPSBjcmVhdGVDaGlsZCgpOwotCQlwYXJlbnRfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJcGFyZW50Xy5lU2V0KGNoaWxkRmVhdHVyZV8sIGNoaWxkKTsKLQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlQ2hpbGQoKSB7Ci0JCUVGYWN0b3J5IGNoaWxkRmFjdG9yeSA9IGNoaWxkRUNsYXNzXy5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQkJRU9iamVjdCBjaGlsZCA9IGNoaWxkRmFjdG9yeS5jcmVhdGUoY2hpbGRFQ2xhc3NfKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc18ubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghZmVhdHVyZXNOaWxsYWJsZV9baV0pCi0JCQkJY2hpbGQuZVNldChmZWF0dXJlc19baV0sICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocGFyZW50XyAhPSBudWxsKQotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWRpc3Bvc2VBZGFwdGVycygpOwotCQlyZW1vdmVNb2RpZnlMaXN0ZW5lcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwb3NlQWRhcHRlcnMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQlmZWF0dXJlc0FkYXB0ZXJzX1tpXS5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzVGV4dHNfLmxlbmd0aDsgaSsrKQotCQkJaWYgKGZlYXR1cmVzVGV4dHNfW2ldICE9IG51bGwgJiYgIWZlYXR1cmVzVGV4dHNfW2ldLmlzRGlzcG9zZWQoKSkKLQkJCQlmZWF0dXJlc1RleHRzX1tpXS5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWRhcHRpbmdGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlc18gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzXy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZlYXR1cmUgPT0gZmVhdHVyZXNfW2ldKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJFeHBpcmVzQ0NvbWJvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckV4cGlyZXNDQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5ZTgyMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckV4cGlyZXNDQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5VGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlckV4cGlyZXNDQ29tYm8gZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQlwcml2YXRlIEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXRfOwotCXByaXZhdGUgRU9iamVjdCBlT2JqZWN0XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcml2YXRlIENDb21ibyB5ZWFyXzsKLQlwcml2YXRlIENDb21ibyBtb250aF87Ci0JcHJpdmF0ZSBDQ29tYm8gZGF5XzsKLQlwcml2YXRlIENDb21ibyBob3VyXzsKLQlwcml2YXRlIENDb21ibyBtaW51dGVfOwotCXByaXZhdGUgQ0NvbWJvIHNlY29uZF87Ci0JcHJpdmF0ZSBDQ29tYm8gbXNlY29uZF87Ci0JcHJpdmF0ZSBib29sZWFuIG5pbGxhYmxlXzsKLQotCXB1YmxpYyBBZGFwdGVyRXhwaXJlc0NDb21ibyhBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ0NvbWJvIHllYXIsIENDb21ibyBtb250aCwgQ0NvbWJvIGRheSwgQ0NvbWJvIGhvdXIsIENDb21ibyBtaW51dGUsIENDb21ibyBzZWNvbmQsIENDb21ibyBtc2Vjb25kLCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWFydGlmYWN0RWRpdF8gPSBhcnRpZmFjdEVkaXQ7Ci0JCWVPYmplY3RfID0gbnVsbDsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCQl5ZWFyXyA9IHllYXI7Ci0JCW1vbnRoXyA9IG1vbnRoOwotCQlkYXlfID0gZGF5OwotCQlob3VyXyA9IGhvdXI7Ci0JCW1pbnV0ZV8gPSBtaW51dGU7Ci0JCXNlY29uZF8gPSBzZWNvbmQ7Ci0JCW1zZWNvbmRfID0gbXNlY29uZDsKLQkJbmlsbGFibGVfID0gbmlsbGFibGU7Ci0JCXllYXJfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQltb250aF8uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCWRheV8uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCWhvdXJfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQltaW51dGVfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlzZWNvbmRfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQltc2Vjb25kXy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckV4cGlyZXNDQ29tYm8oQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCwgRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ0NvbWJvIHllYXIsIENDb21ibyBtb250aCwgQ0NvbWJvIGRheSwgQ0NvbWJvIGhvdXIsIENDb21ibyBtaW51dGUsIENDb21ibyBzZWNvbmQsIENDb21ibyBtc2Vjb25kLCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXRoaXMoYXJ0aWZhY3RFZGl0LCBmZWF0dXJlLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbXNlY29uZCwgbmlsbGFibGUpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBzeW5jVGV4dEFuZE1vZGVsKCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlXykKLQkJCXNldFRleHQobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoc3luY1RleHRBbmRNb2RlbCgpKSB7Ci0JCQlDb21tYW5kTW9kaWZ5VGV4dCBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlUZXh0KG51bGwsIG51bGwsIGVPYmplY3RfLCBmZWF0dXJlXywgZXhwaXJlcygpLCBuaWxsYWJsZV8pOwotCQkJYXJ0aWZhY3RFZGl0Xy5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXRfLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGV4cGlyZXMoKSB7Ci0JCXJldHVybiAiUCIgKyAvLyROT04tTkxTLTEkCi0JCQkJCXllYXJfLmdldFRleHQoKSArICJZIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJbW9udGhfLmdldFRleHQoKSArICJNIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJZGF5Xy5nZXRUZXh0KCkgKyAiRFQiICsgLy8kTk9OLU5MUy0xJAotCQkJCQlob3VyXy5nZXRUZXh0KCkgKyAiSCIgKyAvLyROT04tTkxTLTEkCi0JCQkJCW1pbnV0ZV8uZ2V0VGV4dCgpICsgIk0iICsgLy8kTk9OLU5MUy0xJAotCQkJCQlzZWNvbmRfLmdldFRleHQoKSArICIuIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJbXNlY29uZF8uZ2V0VGV4dCgpICsgIlMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQlzZXRUZXh0KChTdHJpbmcpIGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJaWYgKHllYXJfICE9IG51bGwgJiYgIXllYXJfLmlzRGlzcG9zZWQoKSkKLQkJCXllYXJfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlpZiAobW9udGhfICE9IG51bGwgJiYgIW1vbnRoXy5pc0Rpc3Bvc2VkKCkpCi0JCQltb250aF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChkYXlfICE9IG51bGwgJiYgIWRheV8uaXNEaXNwb3NlZCgpKQotCQkJZGF5Xy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKGhvdXJfICE9IG51bGwgJiYgIWhvdXJfLmlzRGlzcG9zZWQoKSkKLQkJCWhvdXJfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCQlpZiAobWludXRlXyAhPSBudWxsICYmICFtaW51dGVfLmlzRGlzcG9zZWQoKSkKLQkJCW1pbnV0ZV8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCWlmIChzZWNvbmRfICE9IG51bGwgJiYgIXNlY29uZF8uaXNEaXNwb3NlZCgpKQotCQkJc2Vjb25kXy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKG1zZWNvbmRfICE9IG51bGwgJiYgIW1zZWNvbmRfLmlzRGlzcG9zZWQoKSkKLQkJCW1zZWNvbmRfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN5bmNUZXh0QW5kTW9kZWwoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZWxWYWx1ZSA9IChTdHJpbmcpIGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pOwotCQkJU3RyaW5nIHZhbHVlID0gZXhwaXJlcygpOwotCQkJaWYgKG1vZGVsVmFsdWUgPT0gbnVsbCB8fCBtb2RlbFZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJcmV0dXJuICEodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA8PSAwKTsKLQkJCXJldHVybiAhKG1vZGVsVmFsdWUuZXF1YWxzKHZhbHVlKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0KFN0cmluZyBtb2RlbFZhbHVlKSB7Ci0JCWlmIChtb2RlbFZhbHVlICE9IG51bGwpIHsKLQkJCWludCB5ID0gbW9kZWxWYWx1ZS5pbmRleE9mKCJZIik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBtbyA9IG1vZGVsVmFsdWUuaW5kZXhPZigiTSIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgZCA9IG1vZGVsVmFsdWUuaW5kZXhPZigiRCIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgaCA9IG1vZGVsVmFsdWUuaW5kZXhPZigiSCIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgbWkgPSBtb2RlbFZhbHVlLmxhc3RJbmRleE9mKCJNIik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBzID0gbW9kZWxWYWx1ZS5pbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBtcyA9IG1vZGVsVmFsdWUuaW5kZXhPZigiUyIpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICgheWVhcl8uaXNEaXNwb3NlZCgpICYmIHkgPiAwKQotCQkJCXllYXJfLnNldFRleHQobW9kZWxWYWx1ZS5zdWJzdHJpbmcoMSwgeSkpOwotCQkJaWYgKCFtb250aF8uaXNEaXNwb3NlZCgpICYmIG1vID4gMCkKLQkJCQltb250aF8uc2V0VGV4dChtb2RlbFZhbHVlLnN1YnN0cmluZyh5ICsgMSwgbW8pKTsKLQkJCWlmICghZGF5Xy5pc0Rpc3Bvc2VkKCkgJiYgZCA+IDApCi0JCQkJZGF5Xy5zZXRUZXh0KG1vZGVsVmFsdWUuc3Vic3RyaW5nKG1vICsgMSwgZCkpOwotCQkJaWYgKCFob3VyXy5pc0Rpc3Bvc2VkKCkgJiYgaCA+IDApCi0JCQkJaG91cl8uc2V0VGV4dChtb2RlbFZhbHVlLnN1YnN0cmluZyhkICsgMiwgaCkpOwotCQkJaWYgKCFtaW51dGVfLmlzRGlzcG9zZWQoKSAmJiBtaSA+IDApCi0JCQkJbWludXRlXy5zZXRUZXh0KG1vZGVsVmFsdWUuc3Vic3RyaW5nKGggKyAxLCBtaSkpOwotCQkJaWYgKCFzZWNvbmRfLmlzRGlzcG9zZWQoKSAmJiBzID4gMCkKLQkJCQlzZWNvbmRfLnNldFRleHQobW9kZWxWYWx1ZS5zdWJzdHJpbmcobWkgKyAxLCBzKSk7Ci0JCQlpZiAoIW1zZWNvbmRfLmlzRGlzcG9zZWQoKSAmJiBtcyA+IDApCi0JCQkJbXNlY29uZF8uc2V0VGV4dChtb2RlbFZhbHVlLnN1YnN0cmluZyhzICsgMSwgbXMpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVySGFuZGxlckNsYXNzVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJIYW5kbGVyQ2xhc3NUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYWI1YmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJIYW5kbGVyQ2xhc3NUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi0vKgotICogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZE1vZGlmeUhhbmRsZXJDbGFzc1RleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci0KLQotcHVibGljIGNsYXNzIEFkYXB0ZXJIYW5kbGVyQ2xhc3NUZXh0IGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQ7Ci0JcHJvdGVjdGVkIEhhbmRsZXIgZU9iamVjdF87Ci0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcm90ZWN0ZWQgVGV4dCB0ZXh0XzsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBuaWxsYWJsZV87Ci0KLQlwdWJsaWMgQWRhcHRlckhhbmRsZXJDbGFzc1RleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBUZXh0IHRleHQpIHsKLQkJc3VwZXIoKTsKLQkJYXJ0aWZhY3RFZGl0ID0gYW5BcnRpZmFjdEVkaXQ7Ci0JCWVPYmplY3RfID0gbnVsbDsKLQkJZmVhdHVyZV8gPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCk7Ci0JCXRleHRfID0gdGV4dDsKLQkJbmlsbGFibGVfID0gZmFsc2U7Ci0JCXRleHRfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVySGFuZGxlckNsYXNzVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIEhhbmRsZXIgZU9iamVjdCwgVGV4dCB0ZXh0KSB7Ci0JCXRoaXMoYW5BcnRpZmFjdEVkaXQsIHRleHQpOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaW50IHR5cGUgPSBtc2cuZ2V0RXZlbnRUeXBlKCk7Ci0JCWlmICgodHlwZSA9PSBOb3RpZmljYXRpb24uU0VUIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlVOU0VUKSAmJiBzeW5jVGV4dEFuZE1vZGVsKCkgJiYgbXNnLmdldEZlYXR1cmUoKSA9PSBmZWF0dXJlXykgewotCQkJU3RyaW5nIG5ld0NsYXNzTmFtZSA9IGVPYmplY3RfLmdldEhhbmRsZXJDbGFzcygpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCQlzZXRUZXh0KG5ld0NsYXNzTmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKHN5bmNUZXh0QW5kTW9kZWwoKSkgewotCQkJQ29tbWFuZE1vZGlmeUhhbmRsZXJDbGFzc1RleHQgY29tbWFuZCA9IG5ldyBDb21tYW5kTW9kaWZ5SGFuZGxlckNsYXNzVGV4dChudWxsLCBudWxsLCBlT2JqZWN0XywgdGV4dF8uZ2V0VGV4dCgpKTsKLQkJCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJCWFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJYXJ0aWZhY3RFZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChIYW5kbGVyIGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWVPYmplY3RfID0gZU9iamVjdDsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCVN0cmluZyBuZXdDbGFzc05hbWUgPSBlT2JqZWN0Xy5nZXRIYW5kbGVyQ2xhc3MoKS5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQkJc2V0VGV4dChuZXdDbGFzc05hbWUpOwotCQl9IGVsc2UKLQkJCXNldFRleHQobnVsbCk7Ci0JfQotCi0JLyoKLQkgKiBwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7IGZlYXR1cmVfID0gZmVhdHVyZTsKLQkgKiBhZGFwdChlT2JqZWN0KTsgfQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlpZiAodGV4dF8gIT0gbnVsbCAmJiAhdGV4dF8uaXNEaXNwb3NlZCgpKQotCQkJdGV4dF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3luY1RleHRBbmRNb2RlbCgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCVN0cmluZyBtb2RlbFZhbHVlID0gZU9iamVjdF8uZ2V0SGFuZGxlckNsYXNzKCkuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJCVN0cmluZyB0ZXh0VmFsdWUgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0JCQlpZiAobW9kZWxWYWx1ZSA9PSBudWxsIHx8IG1vZGVsVmFsdWUubGVuZ3RoKCkgPD0gMCkKLQkJCQlyZXR1cm4gISh0ZXh0VmFsdWUgPT0gbnVsbCB8fCB0ZXh0VmFsdWUubGVuZ3RoKCkgPD0gMCk7Ci0JCQlyZXR1cm4gIShtb2RlbFZhbHVlLmVxdWFscyh0ZXh0VmFsdWUpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKCF0ZXh0Xy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCVN0cmluZyBjdXJyVGV4dCA9IHRleHRfLmdldFRleHQoKTsKLQkJCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA8PSAwKSB7Ci0JCQkJaWYgKGN1cnJUZXh0ICE9IG51bGwgJiYgY3VyclRleHQubGVuZ3RoKCkgPiAwKQotCQkJCQl0ZXh0Xy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmICghdGV4dC5lcXVhbHMoY3VyclRleHQpKQotCQkJCXRleHRfLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGoyZWVFZGl0TW9kZWwuCi0JICovCi0JcHVibGljIEFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXQoKSB7Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRNb2RlbAotCSAqICAgICAgICAgICAgVGhlIGoyZWVFZGl0TW9kZWwgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0RWRpdChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQpIHsKLQkJYXJ0aWZhY3RFZGl0ID0gYW5BcnRpZmFjdEVkaXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckxheWVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlckxheWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOWQwZDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJMYXllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyTGF5ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBFQ2xhc3MgY2hpbGRFQ2xhc3NfOwotCXByaXZhdGUgRU9iamVjdCBjaGlsZF87Ci0KLQlwdWJsaWMgQWRhcHRlckxheWVyKEVPYmplY3QgcGFyZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRUNsYXNzIGNoaWxkRUNsYXNzKSB7Ci0JCXN1cGVyKCk7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJY2hpbGRFQ2xhc3NfID0gY2hpbGRFQ2xhc3M7Ci0JCWFkYXB0KHBhcmVudF8pOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gTm90aWZpY2F0aW9uLlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BREQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKQotCQkJYWRhcHRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGNoaWxkXyAhPSBudWxsKQotCQkJY2hpbGRfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJcGFyZW50XyA9IGVPYmplY3Q7Ci0JCWFkYXB0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkXyAhPSBudWxsKQotCQkJY2hpbGRfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoY2hpbGRfICE9IG51bGwpCi0JCQljaGlsZF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldENoaWxkKCkgewotCQlyZXR1cm4gY2hpbGRfOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGFwdENoaWxkKCkgewotCQlpZiAocGFyZW50XyAhPSBudWxsKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gcGFyZW50Xy5lR2V0KGZlYXR1cmVfKTsKLQkJCWlmIChvYmplY3QgPT0gbnVsbCkKLQkJCQljaGlsZF8gPSBjaGlsZEVDbGFzc18uZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKGNoaWxkRUNsYXNzXyk7Ci0JCQllbHNlCi0JCQkJY2hpbGRfID0gKEVPYmplY3QpIG9iamVjdDsKLQkJfSBlbHNlCi0JCQljaGlsZF8gPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGFwdFBhcmVudCgpIHsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCAmJiBjaGlsZF8gIT0gbnVsbCkgewotCQkJRUxpc3QgY2hpbGRGZWF0dXJlcyA9IGNoaWxkRUNsYXNzXy5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGRGZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0Lm5leHQoKTsKLQkJCQlib29sZWFuIGlzRmVhdHVyZVNldDsKLQkJCQlPYmplY3QgZ3JhbmRjaGlsZCA9IGNoaWxkXy5lR2V0KGNoaWxkRmVhdHVyZSk7Ci0JCQkJaWYgKGdyYW5kY2hpbGQgIT0gbnVsbCAmJiBncmFuZGNoaWxkIGluc3RhbmNlb2YgRUxpc3QpCi0JCQkJCWlzRmVhdHVyZVNldCA9ICEoKEVMaXN0KSBncmFuZGNoaWxkKS5pc0VtcHR5KCk7Ci0JCQkJZWxzZQotCQkJCQlpc0ZlYXR1cmVTZXQgPSBjaGlsZF8uZUlzU2V0KGNoaWxkRmVhdHVyZSk7Ci0JCQkJaWYgKGlzRmVhdHVyZVNldCkgewotCQkJCQlwYXJlbnRfLmVTZXQoZmVhdHVyZV8sIGNoaWxkXyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlwYXJlbnRfLmVVbnNldChmZWF0dXJlXyk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJQQ1JlZlRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyUENSZWZUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMWQwNGQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJQQ1JlZlRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDIxLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRNb2RpZnlTRUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRNb2RpZnlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi0vKioKLSAqIEBhdXRob3IgcnNpbmhhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0ZXJQQ1JlZlRleHQgZXh0ZW5kcyBBZGFwdGVyVGV4dCB7Ci0JcHVibGljIEFkYXB0ZXJQQ1JlZlRleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgVGV4dCB0ZXh0LCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXN1cGVyKGFuQXJ0aWZhY3RFZGl0LCBmZWF0dXJlLCB0ZXh0LCBuaWxsYWJsZSk7Ci0JfQotCi0KLQlwdWJsaWMgQWRhcHRlclBDUmVmVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFRleHQgdGV4dCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihhbkFydGlmYWN0RWRpdCwgZU9iamVjdCwgZmVhdHVyZSwgdGV4dCwgbmlsbGFibGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJaWYgKCh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQpICYmIHN5bmNUZXh0QW5kTW9kZWwoKSAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IGZlYXR1cmVfKSB7Ci0JCQlPYmplY3Qgb2JqID0gZU9iamVjdF8uZUdldChmZWF0dXJlXyk7Ci0JCQlTdHJpbmcgb2JqU3RyaW5nVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCW9ialN0cmluZ1ZhbHVlID0gKFN0cmluZykgb2JqOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBKYXZhQ2xhc3MpIHsKLQkJCQlKYXZhQ2xhc3MgamF2YUNsYXNzID0gKEphdmFDbGFzcykgb2JqOwotCQkJCW9ialN0cmluZ1ZhbHVlID0gamF2YUNsYXNzLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCQl9Ci0JCQlzZXRUZXh0KG9ialN0cmluZ1ZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlpZiAoc3luY1RleHRBbmRNb2RlbCgpKSB7Ci0JCQkvL0hhbmRsZSBQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSBmZWF0dXJlIGluIGEgc3BlY2lhbCB3YXkuCi0JCQlTdHJpbmcgU0VJRmVhdHVyZU5hbWUgPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkuZ2V0TmFtZSgpOwotCQkJaWYgKChlT2JqZWN0XyBpbnN0YW5jZW9mIFBvcnRDb21wb25lbnRSZWYpICYmIChmZWF0dXJlXy5nZXROYW1lKCkuZXF1YWxzKFNFSUZlYXR1cmVOYW1lKSkpIHsKLQkJCQlDb21tYW5kTW9kaWZ5U0VJIGNvbW1hbmQgPSBuZXcgQ29tbWFuZE1vZGlmeVNFSShudWxsLCBudWxsLCAoUG9ydENvbXBvbmVudFJlZikgZU9iamVjdF8sIHRleHRfLmdldFRleHQoKSwgbmlsbGFibGVfKTsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCWFydGlmYWN0RWRpdC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQkJfSBlbHNlIHsKLQkJCQlDb21tYW5kTW9kaWZ5VGV4dCBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlUZXh0KG51bGwsIG51bGwsIGVPYmplY3RfLCBmZWF0dXJlXywgdGV4dF8uZ2V0VGV4dCgpLCBuaWxsYWJsZV8pOwotCQkJCWFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJYXJ0aWZhY3RFZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWVPYmplY3RfID0gZU9iamVjdDsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJCU9iamVjdCBvYmogPSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKTsKLQkJCVN0cmluZyBvYmpTdHJpbmdWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJb2JqU3RyaW5nVmFsdWUgPSAoU3RyaW5nKSBvYmo7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEphdmFDbGFzcykgewotCQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPSAoSmF2YUNsYXNzKSBvYmo7Ci0JCQkJb2JqU3RyaW5nVmFsdWUgPSBqYXZhQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJCX0KLQkJCXNldFRleHQob2JqU3RyaW5nVmFsdWUpOwotCQl9IGVsc2UKLQkJCXNldFRleHQobnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3luY1RleHRBbmRNb2RlbCgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCVN0cmluZyBtb2RlbFZhbHVlOwotCQkJLy9IYW5kbGUgUG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UgZmVhdHVyZSBpbiBhIHNwZWNpYWwgd2F5LgotCQkJU3RyaW5nIFNFSUZlYXR1cmVOYW1lID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50UmVmX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLmdldE5hbWUoKTsKLQkJCWlmICgoZU9iamVjdF8gaW5zdGFuY2VvZiBQb3J0Q29tcG9uZW50UmVmKSAmJiAoZmVhdHVyZV8uZ2V0TmFtZSgpLmVxdWFscyhTRUlGZWF0dXJlTmFtZSkpKSB7Ci0JCQkJbW9kZWxWYWx1ZSA9ICgoUG9ydENvbXBvbmVudFJlZikgZU9iamVjdF8pLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZGVsVmFsdWUgPSAoU3RyaW5nKSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKTsKLQkJCX0KLQkJCVN0cmluZyB0ZXh0VmFsdWUgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0JCQlpZiAobW9kZWxWYWx1ZSA9PSBudWxsIHx8IG1vZGVsVmFsdWUubGVuZ3RoKCkgPD0gMCkKLQkJCQlyZXR1cm4gISh0ZXh0VmFsdWUgPT0gbnVsbCB8fCB0ZXh0VmFsdWUubGVuZ3RoKCkgPD0gMCk7Ci0JCQlyZXR1cm4gIShtb2RlbFZhbHVlLmVxdWFscyh0ZXh0VmFsdWUpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclFOYW1lRWxlbWVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJRTmFtZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwMzBlMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclFOYW1lRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kLkNvbW1hbmRBZGRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kUmVtb3ZlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLnV0aWwuUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi0vKioKLSAqIEdlbmVyaWMgZVNldCdzIHdpbGwgbm90IHdvcmsgd2hlbiBzZXR0aW5nIG5hbWVzcGFjZVVSSXMgb24gUU5hbWUncyBzbyBBZGFwdGVyRWxlbWVudCBjYW5ub3QgYmUKLSAqIHVzZWQgd2hlbiB0aGUgY2hpbGQgaXMgYSBRTmFtZS4gVGhpcyBjbGFzcyBpcyB2ZXJ5IHNpbWlsYXIgQWRhcHRlckVsZW1lbnQgYnV0IGhhcyBzcGVjaWFsCi0gKiBiZWhhdmlvdXIgZm9yIGhhbmRsaW5nIFFOYW1lJ3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGFwdGVyUU5hbWVFbGVtZW50IGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQ7Ci0JcHJpdmF0ZSBFT2JqZWN0IHBhcmVudF87Ci0JcHJpdmF0ZSBFQ2xhc3MgY2hpbGRFQ2xhc3NfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZV87Ci0JcHJpdmF0ZSBib29sZWFuIGNoaWxkTmlsbGFibGVfOwotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXNfOwotCXByaXZhdGUgYm9vbGVhbltdIGZlYXR1cmVzTmlsbGFibGVfOwotCXByaXZhdGUgVGV4dFtdIGZlYXR1cmVzVGV4dHNfOwotCXByaXZhdGUgQWRhcHRlclRleHRbXSBmZWF0dXJlc0FkYXB0ZXJzXzsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQWRhcHRlclFOYW1lRWxlbWVudChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIEVDbGFzcyBjaGlsZEVDbGFzcywgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSwgYm9vbGVhbiBjaGlsZE5pbGxhYmxlLCBUZXh0IG5zVVJJVGV4dCwgVGV4dCBsb2NhbFBhcnRUZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWFydGlmYWN0RWRpdCA9IGFuQXJ0aWZhY3RFZGl0OwotCQlwYXJlbnRfID0gbnVsbDsKLQkJY2hpbGRFQ2xhc3NfID0gY2hpbGRFQ2xhc3M7Ci0JCWNoaWxkRmVhdHVyZV8gPSBjaGlsZEZlYXR1cmU7Ci0JCWNoaWxkTmlsbGFibGVfID0gY2hpbGROaWxsYWJsZTsKLQkJQ29tbW9uUGFja2FnZSBjb21tb25QS0cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJLy8gU2V0IHVwIFFOYW1lIGZlYXR1cmVzCi0JCWZlYXR1cmVzXyA9IG5ldyBFU3RydWN0dXJhbEZlYXR1cmVbMl07Ci0JCWZlYXR1cmVzX1swXSA9IGNvbW1vblBLRy5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKTsKLQkJZmVhdHVyZXNfWzFdID0gY29tbW9uUEtHLmdldFFOYW1lX0xvY2FsUGFydCgpOwotCQlmZWF0dXJlc05pbGxhYmxlXyA9IG5ldyBib29sZWFuWzJdOwotCQlmZWF0dXJlc05pbGxhYmxlX1swXSA9IGZhbHNlOwotCQlmZWF0dXJlc05pbGxhYmxlX1sxXSA9IGZhbHNlOwotCQlmZWF0dXJlc1RleHRzXyA9IG5ldyBUZXh0WzJdOwotCQlmZWF0dXJlc1RleHRzX1swXSA9IG5zVVJJVGV4dDsKLQkJZmVhdHVyZXNUZXh0c19bMV0gPSBsb2NhbFBhcnRUZXh0OwotCQlhZGRNb2RpZnlMaXN0ZW5lcigpOwotCQlmZWF0dXJlc0FkYXB0ZXJzXyA9IG5ldyBBZGFwdGVyVGV4dFtmZWF0dXJlc18ubGVuZ3RoXTsKLQkJbmV3QWRhcHRlcnMobnVsbCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIEFkYXB0ZXJRTmFtZUVsZW1lbnQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBFT2JqZWN0IHBhcmVudCwgRUNsYXNzIGNoaWxkRUNsYXNzLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBib29sZWFuIGNoaWxkTmlsbGFibGUsIFRleHQgbnNVUklUZXh0LCBUZXh0IGxvY2FsUGFydFRleHQpIHsKLQkJdGhpcyhhbkFydGlmYWN0RWRpdCwgY2hpbGRFQ2xhc3MsIGNoaWxkRmVhdHVyZSwgY2hpbGROaWxsYWJsZSwgbnNVUklUZXh0LCBsb2NhbFBhcnRUZXh0KTsKLQkJYWRhcHQocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbmV3QWRhcHRlcnMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0ID09IG51bGwpIHsKLQkJCWZlYXR1cmVzQWRhcHRlcnNfWzBdID0gbmV3IEFkYXB0ZXJRTmFtZVRleHQoYXJ0aWZhY3RFZGl0LCBmZWF0dXJlc19bMF0sIGZlYXR1cmVzVGV4dHNfWzBdLCBmZWF0dXJlc05pbGxhYmxlX1swXSk7Ci0JCQlmZWF0dXJlc0FkYXB0ZXJzX1sxXSA9IG5ldyBBZGFwdGVyVGV4dChhcnRpZmFjdEVkaXQsIGZlYXR1cmVzX1sxXSwgZmVhdHVyZXNUZXh0c19bMV0sIGZlYXR1cmVzTmlsbGFibGVfWzFdKTsKLQkJfSBlbHNlIHsKLQkJCWZlYXR1cmVzQWRhcHRlcnNfWzBdID0gbmV3IEFkYXB0ZXJRTmFtZVRleHQoYXJ0aWZhY3RFZGl0LCBlT2JqZWN0LCBmZWF0dXJlc19bMF0sIGZlYXR1cmVzVGV4dHNfWzBdLCBmZWF0dXJlc05pbGxhYmxlX1swXSk7Ci0JCQlmZWF0dXJlc0FkYXB0ZXJzX1sxXSA9IG5ldyBBZGFwdGVyVGV4dChhcnRpZmFjdEVkaXQsIGVPYmplY3QsIGZlYXR1cmVzX1sxXSwgZmVhdHVyZXNUZXh0c19bMV0sIGZlYXR1cmVzTmlsbGFibGVfWzFdKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1RleHRzXy5sZW5ndGg7IGkrKykKLQkJCWZlYXR1cmVzVGV4dHNfW2ldLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJaWYgKCh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQpICYmIG1zZy5nZXRGZWF0dXJlKCkgPT0gY2hpbGRGZWF0dXJlXykgewotCQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQlpZiAoY2hpbGQgPT0gbnVsbCAmJiAhY2hpbGROaWxsYWJsZV8pCi0JCQkJY2hpbGQgPSBzZXRDaGlsZCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc0FkYXB0ZXJzXy5sZW5ndGg7IGkrKykKLQkJCQlmZWF0dXJlc0FkYXB0ZXJzX1tpXS5hZGFwdChjaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJYm9vbGVhbiBpc1RleHRzTnVsbCA9IGlzVGV4dHNOdWxsKCk7Ci0JCUVPYmplY3QgY2hpbGQgPSAoRU9iamVjdCkgcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQlib29sZWFuIGNoaWxkQ2FuQmVSZW1vdmVkID0gdHJ1ZTsKLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGFsbGZlYXR1cmVzID0gY2hpbGRFQ2xhc3NfLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGFsbGZlYXR1cmVzLmhhc05leHQoKSkgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSB0aGlzRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbGZlYXR1cmVzLm5leHQoKTsKLQkJCQlpZiAoIWFkYXB0aW5nRmVhdHVyZSh0aGlzRmVhdHVyZSkgJiYgY2hpbGQuZUlzU2V0KHRoaXNGZWF0dXJlKSkgewotCQkJCQljaGlsZENhbkJlUmVtb3ZlZCA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzVGV4dHNOdWxsICYmIGNoaWxkICE9IG51bGwgJiYgY2hpbGROaWxsYWJsZV8gJiYgY2hpbGRDYW5CZVJlbW92ZWQpIHsKLQkJCWRpc3Bvc2VBZGFwdGVycygpOwotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQlDb21tYW5kUmVtb3ZlRWxlbWVudCBjb21tYW5kID0gbmV3IENvbW1hbmRSZW1vdmVFbGVtZW50KG51bGwsIG51bGwsIHBhcmVudF8sIGNoaWxkRmVhdHVyZV8pOwotCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCWFydGlmYWN0RWRpdC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQluZXdBZGFwdGVycyhudWxsKTsKLQkJfSBlbHNlIGlmICghaXNUZXh0c051bGwgJiYgY2hpbGQgPT0gbnVsbCkgewotCQkJZGlzcG9zZUFkYXB0ZXJzKCk7Ci0JCQlwYXJlbnRfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCWNoaWxkID0gY3JlYXRlQ2hpbGQoKTsKLQkJCXNldEZlYXR1cmVzT25DaGlsZChjaGlsZCk7Ci0JCQkvKgotCQkJICogcmVwbGFjZWQgYnkgc2V0RmVhdHVyZXNPbkNoaWxkIGZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNfLmxlbmd0aDsgaSsrKSB7IFN0cmluZwotCQkJICogdGV4dCA9IGZlYXR1cmVzVGV4dHNfW2ldLmdldFRleHQoKTsgaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkKLQkJCSAqIGNoaWxkLmVTZXQoZmVhdHVyZXNfW2ldLCB0ZXh0KTsgfQotCQkJICovCi0JCQlDb21tYW5kQWRkRWxlbWVudCBjb21tYW5kID0gbmV3IENvbW1hbmRBZGRFbGVtZW50KG51bGwsIG51bGwsIHBhcmVudF8sIGNoaWxkRmVhdHVyZV8sIGNoaWxkKTsKLQkJCWFydGlmYWN0RWRpdC5nZXRDb250ZW50TW9kZWxSb290KCkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJbmV3QWRhcHRlcnMoY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVGV4dHNOdWxsKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzVGV4dHNfLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGZlYXR1cmVzVGV4dHNfW2ldLmdldFRleHQoKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAocGFyZW50XyAhPSBudWxsKQotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXBhcmVudF8gPSBlT2JqZWN0OwotCQlFT2JqZWN0IGNoaWxkID0gbnVsbDsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkgewotCQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQljaGlsZCA9IChFT2JqZWN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQlpZiAoY2hpbGQgPT0gbnVsbCAmJiAhY2hpbGROaWxsYWJsZV8pCi0JCQkJY2hpbGQgPSBzZXRDaGlsZCgpOwotCQl9Ci0JCXJlbW92ZU1vZGlmeUxpc3RlbmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNBZGFwdGVyc18ubGVuZ3RoOyBpKyspCi0JCQlmZWF0dXJlc0FkYXB0ZXJzX1tpXS5hZGFwdChjaGlsZCk7Ci0JCWFkZE1vZGlmeUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IHNldENoaWxkKCkgewotCQlFT2JqZWN0IGNoaWxkID0gY3JlYXRlQ2hpbGQoKTsKLQkJcGFyZW50Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCXBhcmVudF8uZVNldChjaGlsZEZlYXR1cmVfLCBjaGlsZCk7Ci0JCXBhcmVudF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUNoaWxkKCkgewotCQlFRmFjdG9yeSBjaGlsZEZhY3RvcnkgPSBjaGlsZEVDbGFzc18uZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JCUVPYmplY3QgY2hpbGQgPSBjaGlsZEZhY3RvcnkuY3JlYXRlKGNoaWxkRUNsYXNzXyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNfLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWZlYXR1cmVzTmlsbGFibGVfW2ldKQotCQkJCWNoaWxkLmVTZXQoZmVhdHVyZXNfW2ldLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHBhcmVudF8gIT0gbnVsbCkKLQkJCXBhcmVudF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlkaXNwb3NlQWRhcHRlcnMoKTsKLQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcG9zZUFkYXB0ZXJzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzQWRhcHRlcnNfLmxlbmd0aDsgaSsrKQotCQkJZmVhdHVyZXNBZGFwdGVyc19baV0uZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcigpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1RleHRzXy5sZW5ndGg7IGkrKykKLQkJCWlmIChmZWF0dXJlc1RleHRzX1tpXSAhPSBudWxsICYmICFmZWF0dXJlc1RleHRzX1tpXS5pc0Rpc3Bvc2VkKCkpCi0JCQkJZmVhdHVyZXNUZXh0c19baV0ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFkYXB0aW5nRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZXNfID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc18ubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmZWF0dXJlID09IGZlYXR1cmVzX1tpXSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZlYXR1cmVzT25DaGlsZChFT2JqZWN0IGNoaWxkKSB7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIFFOYW1lKSAvL1RoaXMgd2lsbCBhbHdheXMgYmUgdHJ1ZS4KLQkJewotCQkJUU5hbWUgcW5hbWUgPSAoUU5hbWUpIGNoaWxkOwotCQkJU3RyaW5nIG5hbWVzcGFjZVVSSVZhbHVlID0gZmVhdHVyZXNUZXh0c19bMF0uZ2V0VGV4dCgpOwotCQkJU3RyaW5nIGxvY2FsUGFydFZhbHVlID0gZmVhdHVyZXNUZXh0c19bMV0uZ2V0VGV4dCgpOwotCQkJaWYgKG5hbWVzcGFjZVVSSVZhbHVlID09IG51bGwgfHwgbmFtZXNwYWNlVVJJVmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCS8vSnVzdCBzZXQgdGhlIGxvY2FsIHBhcnQKLQkJCQlpZiAobG9jYWxQYXJ0VmFsdWUgIT0gbnVsbCAmJiBsb2NhbFBhcnRWYWx1ZS5sZW5ndGgoKSA+IDApCi0JCQkJCXFuYW1lLnNldExvY2FsUGFydChsb2NhbFBhcnRWYWx1ZSk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGxvY2FsUGFydFZhbHVlID09IG51bGwpCi0JCQkJCWxvY2FsUGFydFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCS8vU2V0IG5hbWVzcGFjZSBhbmQgbG9jYWwgcGFydCB1c2luZyBRTmFtZUhlbHBlcgotCQkJCVFOYW1lSGVscGVyLnNldFFOYW1lVmFsdWUocW5hbWUsIG5hbWVzcGFjZVVSSVZhbHVlLCBsb2NhbFBhcnRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyUU5hbWVUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclFOYW1lVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDk2OGYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyUU5hbWVUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZE1vZGlmeU5TVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5VGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi0KLQotLyoqCi0gKiBTaW5jZSBnZW5lcmljIGVTZXQncyB3aWxsIG5vdCB3b3JrIGZvciBzZXR0aW5nIFFOYW1lIG5hbWVzcGFjZVVSSSdzLCB0aGlzIHN1YmNsYXNzJ3MgcHVycG9zZSBpcwotICogdG8gb3ZlcnJpZGUgdGhlIGJlaGF2aW91ciB3aGVuIG5lY2Vzc2FyeS4KLSAqLwotcHVibGljIGNsYXNzIEFkYXB0ZXJRTmFtZVRleHQgZXh0ZW5kcyBBZGFwdGVyVGV4dCB7Ci0KLQlwdWJsaWMgQWRhcHRlclFOYW1lVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBUZXh0IHRleHQsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIoYW5BcnRpZmFjdEVkaXQsIGZlYXR1cmUsIHRleHQsIG5pbGxhYmxlKTsKLQl9Ci0KLQotCXB1YmxpYyBBZGFwdGVyUU5hbWVUZXh0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgVGV4dCB0ZXh0LCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXN1cGVyKGFuQXJ0aWZhY3RFZGl0LCBlT2JqZWN0LCBmZWF0dXJlLCB0ZXh0LCBuaWxsYWJsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChzeW5jVGV4dEFuZE1vZGVsKCkpIHsKLQkJCS8vSGFuZGxlIFFOYW1lX05hbWVzcGFjZVVSSSBmZWF0dXJlIGluIGEgc3BlY2lhbCB3YXkuCi0JCQlTdHJpbmcgbmFtZXNwYWNlRmVhdHVyZU5hbWUgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRRTmFtZV9OYW1lc3BhY2VVUkkoKS5nZXROYW1lKCk7Ci0JCQlpZiAoKGVPYmplY3RfIGluc3RhbmNlb2YgUU5hbWUpICYmIChmZWF0dXJlXy5nZXROYW1lKCkuZXF1YWxzKG5hbWVzcGFjZUZlYXR1cmVOYW1lKSkpIHsKLQkJCQlDb21tYW5kTW9kaWZ5TlNVUkkgY29tbWFuZCA9IG5ldyBDb21tYW5kTW9kaWZ5TlNVUkkobnVsbCwgbnVsbCwgKFFOYW1lKSBlT2JqZWN0XywgdGV4dF8uZ2V0VGV4dCgpLCBuaWxsYWJsZV8pOwotCQkJCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCQl9IAotCQkJfSBlbHNlIHsKLQkJCQlDb21tYW5kTW9kaWZ5VGV4dCBjb21tYW5kID0gbmV3IENvbW1hbmRNb2RpZnlUZXh0KG51bGwsIG51bGwsIGVPYmplY3RfLCBmZWF0dXJlXywgdGV4dF8uZ2V0VGV4dCgpLCBuaWxsYWJsZV8pOwotCQkJCWlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkgewotCQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJCQl9IAotCQkJfQotCi0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyU2VydmljZUludGVyZmFjZVRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyU2VydmljZUludGVyZmFjZVRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxMTg0Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclNlcnZpY2VJbnRlcmZhY2VUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi0vKgotICogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQuQ29tbWFuZE1vZGlmeVNlcnZpY2VJbnRlcmZhY2VUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotCi0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyU2VydmljZUludGVyZmFjZVRleHQgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQlwcm90ZWN0ZWQgQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdDsKLQlwcm90ZWN0ZWQgU2VydmljZVJlZiBlT2JqZWN0XzsKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmVfOwotCXByb3RlY3RlZCBUZXh0IHRleHRfOwotCXByb3RlY3RlZCBib29sZWFuIG5pbGxhYmxlXzsKLQotCXB1YmxpYyBBZGFwdGVyU2VydmljZUludGVyZmFjZVRleHQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0LCBUZXh0IHRleHQpIHsKLQkJc3VwZXIoKTsKLQkJYXJ0aWZhY3RFZGl0ID0gYW5BcnRpZmFjdEVkaXQ7Ci0JCWVPYmplY3RfID0gbnVsbDsKLQkJZmVhdHVyZV8gPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZUludGVyZmFjZSgpOwotCQl0ZXh0XyA9IHRleHQ7Ci0JCW5pbGxhYmxlXyA9IGZhbHNlOwotCQl0ZXh0Xy5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlclNlcnZpY2VJbnRlcmZhY2VUZXh0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgU2VydmljZVJlZiBlT2JqZWN0LCBUZXh0IHRleHQpIHsKLQkJdGhpcyhhbkFydGlmYWN0RWRpdCwgdGV4dCk7Ci0JCWFkYXB0KGVPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJaWYgKCh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQpICYmIHN5bmNUZXh0QW5kTW9kZWwoKSAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IGZlYXR1cmVfKSB7Ci0JCQlTdHJpbmcgbmV3Q2xhc3NOYW1lID0gZU9iamVjdF8uZ2V0U2VydmljZUludGVyZmFjZSgpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCQlzZXRUZXh0KG5ld0NsYXNzTmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJaWYgKHN5bmNUZXh0QW5kTW9kZWwoKSkgewotCQkJQ29tbWFuZE1vZGlmeVNlcnZpY2VJbnRlcmZhY2VUZXh0IGNvbW1hbmQgPSBuZXcgQ29tbWFuZE1vZGlmeVNlcnZpY2VJbnRlcmZhY2VUZXh0KG51bGwsIG51bGwsIGVPYmplY3RfLCB0ZXh0Xy5nZXRUZXh0KCkpOwotCQkJYXJ0aWZhY3RFZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCWFydGlmYWN0RWRpdC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoU2VydmljZVJlZiBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQlpZiAoZU9iamVjdF8uZ2V0U2VydmljZUludGVyZmFjZSgpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmV3Q2xhc3NOYW1lID0gZU9iamVjdF8uZ2V0U2VydmljZUludGVyZmFjZSgpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCQkJc2V0VGV4dChuZXdDbGFzc05hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXRUZXh0KG51bGwpOwotCQkJfQotCQl9IGVsc2UKLQkJCXNldFRleHQobnVsbCk7Ci0JfQotCi0JLyoKLQkgKiBwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7IGZlYXR1cmVfID0gZmVhdHVyZTsKLQkgKiBhZGFwdChlT2JqZWN0KTsgfQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQlpZiAodGV4dF8gIT0gbnVsbCAmJiAhdGV4dF8uaXNEaXNwb3NlZCgpKQotCQkJdGV4dF8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3luY1RleHRBbmRNb2RlbCgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCVN0cmluZyBtb2RlbFZhbHVlID0gbnVsbDsKLQkJCWlmIChlT2JqZWN0Xy5nZXRTZXJ2aWNlSW50ZXJmYWNlKCkgIT0gbnVsbCkKLQkJCQltb2RlbFZhbHVlID0gZU9iamVjdF8uZ2V0U2VydmljZUludGVyZmFjZSgpLmdldFF1YWxpZmllZE5hbWVGb3JSZWZsZWN0aW9uKCk7Ci0JCQlTdHJpbmcgdGV4dFZhbHVlID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKG1vZGVsVmFsdWUgPT0gbnVsbCB8fCBtb2RlbFZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJcmV0dXJuICEodGV4dFZhbHVlID09IG51bGwgfHwgdGV4dFZhbHVlLmxlbmd0aCgpIDw9IDApOwotCQkJcmV0dXJuICEobW9kZWxWYWx1ZS5lcXVhbHModGV4dFZhbHVlKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICghdGV4dF8uaXNEaXNwb3NlZCgpKSB7Ci0JCQlTdHJpbmcgY3VyclRleHQgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCWlmIChjdXJyVGV4dCAhPSBudWxsICYmIGN1cnJUZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQkJdGV4dF8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoIXRleHQuZXF1YWxzKGN1cnJUZXh0KSkKLQkJCQl0ZXh0Xy5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJUZXh0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkZDRkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5VGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotCi0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyVGV4dCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByb3RlY3RlZCBFT2JqZWN0IGVPYmplY3RfOwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJvdGVjdGVkIFRleHQgdGV4dF87Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbmlsbGFibGVfOwotCXByb3RlY3RlZCBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0OwotCi0JcHVibGljIEFkYXB0ZXJUZXh0KEFydGlmYWN0RWRpdCBhbkFydGlmYWN0RWRpdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFRleHQgdGV4dCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcigpOwotCQlhcnRpZmFjdEVkaXQgPSBhbkFydGlmYWN0RWRpdDsKLQkJZU9iamVjdF8gPSBudWxsOwotCQlmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JCXRleHRfID0gdGV4dDsKLQkJbmlsbGFibGVfID0gbmlsbGFibGU7Ci0JCXRleHRfLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyVGV4dChBcnRpZmFjdEVkaXQgYW5BcnRpZmFjdEVkaXQsIEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFRleHQgdGV4dCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQl0aGlzKGFuQXJ0aWZhY3RFZGl0LCBmZWF0dXJlLCB0ZXh0LCBuaWxsYWJsZSk7Ci0JCWFkYXB0KGVPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJaWYgKCh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQpICYmIHN5bmNUZXh0QW5kTW9kZWwoKSAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IGZlYXR1cmVfKQotCQkJc2V0VGV4dChtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChzeW5jVGV4dEFuZE1vZGVsKCkpIHsKLQkJCUNvbW1hbmRNb2RpZnlUZXh0IGNvbW1hbmQgPSBuZXcgQ29tbWFuZE1vZGlmeVRleHQobnVsbCwgbnVsbCwgZU9iamVjdF8sIGZlYXR1cmVfLCB0ZXh0Xy5nZXRUZXh0KCksIG5pbGxhYmxlXyk7Ci0JCQlpZiAoYXJ0aWZhY3RFZGl0ICE9IG51bGwpIHsKLQkJCQlhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCWFydGlmYWN0RWRpdC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNvbW1hbmQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRhcHQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKQotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQlzZXRUZXh0KChTdHJpbmcpIGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pKTsKLQkJfSBlbHNlCi0JCQlzZXRUZXh0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCQlhZGFwdChlT2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJaWYgKHRleHRfICE9IG51bGwgJiYgIXRleHRfLmlzRGlzcG9zZWQoKSkKLQkJCXRleHRfLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN5bmNUZXh0QW5kTW9kZWwoKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbW9kZWxWYWx1ZSA9IChTdHJpbmcpIGVPYmplY3RfLmVHZXQoZmVhdHVyZV8pOwotCQkJU3RyaW5nIHRleHRWYWx1ZSA9IHRleHRfLmdldFRleHQoKTsKLQkJCWlmIChtb2RlbFZhbHVlID09IG51bGwgfHwgbW9kZWxWYWx1ZS5sZW5ndGgoKSA8PSAwKQotCQkJCXJldHVybiAhKHRleHRWYWx1ZSA9PSBudWxsIHx8IHRleHRWYWx1ZS5sZW5ndGgoKSA8PSAwKTsKLQkJCXJldHVybiAhKG1vZGVsVmFsdWUuZXF1YWxzKHRleHRWYWx1ZSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICghdGV4dF8uaXNEaXNwb3NlZCgpKSB7Ci0JCQlTdHJpbmcgY3VyclRleHQgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCWlmIChjdXJyVGV4dCAhPSBudWxsICYmIGN1cnJUZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQkJdGV4dF8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoIXRleHQuZXF1YWxzKGN1cnJUZXh0KSkKLQkJCQl0ZXh0Xy5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBqMmVlRWRpdE1vZGVsLgotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0KCkgewotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlZGl0TW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBqMmVlRWRpdE1vZGVsIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0IGFuQXJ0aWZhY3RFZGl0KSB7Ci0JCWFydGlmYWN0RWRpdCA9IGFuQXJ0aWZhY3RFZGl0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJUZXh0Q0NvbWJvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclRleHRDQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4MjJmZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclRleHRDQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZC5Db21tYW5kTW9kaWZ5VGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLQotCi1wdWJsaWMgY2xhc3MgQWRhcHRlclRleHRDQ29tYm8gZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQlwcml2YXRlIEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXRfOwotCXByaXZhdGUgRU9iamVjdCBlT2JqZWN0XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcml2YXRlIENDb21ibyB0ZXh0XzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCi0JcHVibGljIEFkYXB0ZXJUZXh0Q0NvbWJvKEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDQ29tYm8gdGV4dCwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcigpOwotCQlhcnRpZmFjdEVkaXRfID0gYXJ0aWZhY3RFZGl0OwotCQllT2JqZWN0XyA9IG51bGw7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJdGV4dF8gPSB0ZXh0OwotCQluaWxsYWJsZV8gPSBuaWxsYWJsZTsKLQkJdGV4dF8uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJUZXh0Q0NvbWJvKEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQsIEVPYmplY3QgZU9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENDb21ibyB0ZXh0LCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXRoaXMoYXJ0aWZhY3RFZGl0LCBmZWF0dXJlLCB0ZXh0LCBuaWxsYWJsZSk7Ci0JCWFkYXB0KGVPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJaWYgKCh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uVU5TRVQpICYmIHN5bmNUZXh0QW5kTW9kZWwoKSAmJiBtc2cuZ2V0RmVhdHVyZSgpID09IGZlYXR1cmVfKQotCQkJc2V0VGV4dChtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCWlmIChzeW5jVGV4dEFuZE1vZGVsKCkpIHsKLQkJCUNvbW1hbmRNb2RpZnlUZXh0IGNvbW1hbmQgPSBuZXcgQ29tbWFuZE1vZGlmeVRleHQobnVsbCwgbnVsbCwgZU9iamVjdF8sIGZlYXR1cmVfLCB0ZXh0Xy5nZXRUZXh0KCksIG5pbGxhYmxlXyk7Ci0JCQlhcnRpZmFjdEVkaXRfLmdldENvbnRlbnRNb2RlbFJvb3QoKS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCWFydGlmYWN0RWRpdF8uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkuYWRkKHRoaXMpOwotCQkJc2V0VGV4dCgoU3RyaW5nKSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKSk7Ci0JCX0gZWxzZQotCQkJc2V0VGV4dChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGFwdChFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQkJYWRhcHQoZU9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpCi0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCWlmICh0ZXh0XyAhPSBudWxsICYmICF0ZXh0Xy5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0Xy5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3luY1RleHRBbmRNb2RlbCgpIHsKLQkJaWYgKGVPYmplY3RfICE9IG51bGwpIHsKLQkJCVN0cmluZyBtb2RlbFZhbHVlID0gKFN0cmluZykgZU9iamVjdF8uZUdldChmZWF0dXJlXyk7Ci0JCQlTdHJpbmcgdGV4dFZhbHVlID0gdGV4dF8uZ2V0VGV4dCgpOwotCQkJaWYgKG1vZGVsVmFsdWUgPT0gbnVsbCB8fCBtb2RlbFZhbHVlLmxlbmd0aCgpIDw9IDApCi0JCQkJcmV0dXJuICEodGV4dFZhbHVlID09IG51bGwgfHwgdGV4dFZhbHVlLmxlbmd0aCgpIDw9IDApOwotCQkJcmV0dXJuICEobW9kZWxWYWx1ZS5lcXVhbHModGV4dFZhbHVlKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICghdGV4dF8uaXNEaXNwb3NlZCgpKSB7Ci0JCQlTdHJpbmcgY3VyclRleHQgPSB0ZXh0Xy5nZXRUZXh0KCk7Ci0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPD0gMCkgewotCQkJCWlmIChjdXJyVGV4dCAhPSBudWxsICYmIGN1cnJUZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQkJdGV4dF8uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoIXRleHQuZXF1YWxzKGN1cnJUZXh0KSkKLQkJCQl0ZXh0Xy5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJWaWV3ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvYWRhcHRlci9BZGFwdGVyVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNjI5YTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgQWRhcHRlclZpZXdlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQlwcml2YXRlIEVPYmplY3QgZU9iamVjdF87Ci0JcHJpdmF0ZSBWaWV3ZXIgdmlld2VyXzsKLQlwcml2YXRlIEFycmF5TGlzdCBmZWF0dXJlc187Ci0KLQlwdWJsaWMgQWRhcHRlclZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCWVPYmplY3RfID0gbnVsbDsKLQkJdmlld2VyXyA9IHZpZXdlcjsKLQkJZmVhdHVyZXNfID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyVmlld2VyKEVPYmplY3QgZU9iamVjdCwgVmlld2VyIHZpZXdlcikgewotCQl0aGlzKHZpZXdlcik7Ci0JCWFkYXB0KGVPYmplY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gTm90aWZpY2F0aW9uLlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5BREQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKSB7Ci0JCQlPYmplY3Qgbm90aWZpZXIgPSBtc2cuZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChub3RpZmllciA9PSBlT2JqZWN0XykgewotCQkJCWlmICh0eXBlID09IE5vdGlmaWNhdGlvbi5TRVQgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uQUREIHx8IHR5cGUgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZKQotCQkJCQlpbnRlcm5hbEFkYXB0RmVhdHVyZSgoRVN0cnVjdHVyYWxGZWF0dXJlKSBtc2cuZ2V0RmVhdHVyZSgpKTsKLQkJCQllbHNlIGlmICh0eXBlID09IE5vdGlmaWNhdGlvbi5VTlNFVCB8fCB0eXBlID09IE5vdGlmaWNhdGlvbi5SRU1PVkUgfHwgdHlwZSA9PSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlkpIHsKLQkJCQkJT2JqZWN0IG9iamVjdCA9IG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkJCSgoRU9iamVjdCkgb2JqZWN0KS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQkJCQlFTGlzdCBlTGlzdCA9IChFTGlzdCkgb2JqZWN0OwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJCU9iamVjdCBpdGVtID0gZUxpc3QuZ2V0KGkpOwotCQkJCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkJCQkJKChFT2JqZWN0KSBpdGVtKS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl2aWV3ZXJfLnJlZnJlc2goKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0KEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJZU9iamVjdF8uZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJdW5hZGFwdEFsbENhY2hlZEZlYXR1cmUoKTsKLQkJfQotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQllT2JqZWN0Xy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCQlyZWFkYXB0QWxsQ2FjaGVkRmVhdHVyZSgpOwotCQl9Ci0JCXZpZXdlcl8ucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkYXB0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoIWZlYXR1cmVzXy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJZmVhdHVyZXNfLmFkZChmZWF0dXJlKTsKLQkJCWludGVybmFsQWRhcHRGZWF0dXJlKGZlYXR1cmUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsQWRhcHRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmIChlT2JqZWN0XyAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZmVhdHVyZU9iamVjdCA9IGVPYmplY3RfLmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAoZmVhdHVyZU9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFTGlzdCBlQWRhcHRlcnMgPSAoKEVPYmplY3QpIGZlYXR1cmVPYmplY3QpLmVBZGFwdGVycygpOwotCQkJCWlmICghZUFkYXB0ZXJzLmNvbnRhaW5zKHRoaXMpKQotCQkJCQllQWRhcHRlcnMuYWRkKHRoaXMpOwotCQkJfSBlbHNlIGlmIChmZWF0dXJlT2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpIHsKLQkJCQlFTGlzdCBlTGlzdCA9IChFTGlzdCkgZmVhdHVyZU9iamVjdDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBlTGlzdC5nZXQoaSk7Ci0JCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQlFTGlzdCBlQWRhcHRlcnMgPSAoKEVPYmplY3QpIG9iamVjdCkuZUFkYXB0ZXJzKCk7Ci0JCQkJCQlpZiAoIWVBZGFwdGVycy5jb250YWlucyh0aGlzKSkKLQkJCQkJCQllQWRhcHRlcnMuYWRkKHRoaXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRhcHRBbGxDYWNoZWRGZWF0dXJlKCkgewotCQlFU3RydWN0dXJhbEZlYXR1cmVbXSBmZWF0dXJlcyA9IG5ldyBFU3RydWN0dXJhbEZlYXR1cmVbZmVhdHVyZXNfLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspCi0JCQlmZWF0dXJlc1tpXSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzXy5nZXQoaSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspCi0JCQlpbnRlcm5hbEFkYXB0RmVhdHVyZShmZWF0dXJlc1tpXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5hZGFwdEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJZmVhdHVyZXNfLnJlbW92ZShmZWF0dXJlKTsKLQkJaW50ZXJuYWxVbmFkYXB0RmVhdHVyZShmZWF0dXJlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxVbmFkYXB0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkgewotCQkJT2JqZWN0IGZlYXR1cmVPYmplY3QgPSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKGZlYXR1cmVPYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KQotCQkJCSgoRU9iamVjdCkgZmVhdHVyZU9iamVjdCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHRoaXMpOwotCQkJZWxzZSBpZiAoZmVhdHVyZU9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQkJRUxpc3QgZUxpc3QgPSAoRUxpc3QpIGZlYXR1cmVPYmplY3Q7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlTGlzdC5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gZUxpc3QuZ2V0KGkpOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkJCSgoRU9iamVjdCkgb2JqZWN0KS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuYWRhcHRBbGxDYWNoZWRGZWF0dXJlKCkgewotCQlFU3RydWN0dXJhbEZlYXR1cmVbXSBmZWF0dXJlcyA9IG5ldyBFU3RydWN0dXJhbEZlYXR1cmVbZmVhdHVyZXNfLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspCi0JCQlmZWF0dXJlc1tpXSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzXy5nZXQoaSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspCi0JCQlpbnRlcm5hbFVuYWRhcHRGZWF0dXJlKGZlYXR1cmVzW2ldKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZU9iamVjdF8gIT0gbnVsbCkKLQkJCWVPYmplY3RfLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJdW5hZGFwdEFsbENhY2hlZEZlYXR1cmUoKTsKLQkJZmVhdHVyZXNfID0gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9hZGFwdGVyL0FkYXB0ZXJWaWV3ZXJJdGVtLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclZpZXdlckl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiYTMwOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2FkYXB0ZXIvQWRhcHRlclZpZXdlckl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJWaWV3ZXJJdGVtIHsKLQlwcml2YXRlIEVMaXN0IGVPYmplY3RzXzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQotCXB1YmxpYyBBZGFwdGVyVmlld2VySXRlbShFTGlzdCBlT2JqZWN0cywgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJZU9iamVjdHNfID0gZU9iamVjdHM7Ci0JCWZlYXR1cmVfID0gZmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlclZpZXdlckl0ZW0oRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQllT2JqZWN0c18gPSBuZXcgQmFzaWNFTGlzdCgpOwotCQllT2JqZWN0c18uYWRkKGVPYmplY3QpOwotCQlmZWF0dXJlXyA9IGZlYXR1cmU7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldEVPYmplY3RMaXN0KCkgewotCQlyZXR1cm4gZU9iamVjdHNfOwotCX0KLQotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZV87Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkQ2xpZW50SGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRDbGllbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYTk2M2IuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRDbGllbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tYW5kQWRkQ2xpZW50SGFuZGxlciBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVmIHBhcmVudF87Ci0JcHJpdmF0ZSBIYW5kbGVyIG5ld0NoaWxkXzsKLQotCS8vcHJpdmF0ZSBib29sZWFuIG9sZENoaWxkU2V0XzsKLQotCXB1YmxpYyBDb21tYW5kQWRkQ2xpZW50SGFuZGxlcihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2VydmljZVJlZiBwYXJlbnQsIEhhbmRsZXIgbmV3Q2hpbGQpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJbmV3Q2hpbGRfID0gbmV3Q2hpbGQ7Ci0JfQotCi0JcHVibGljIENvbW1hbmRBZGRDbGllbnRIYW5kbGVyKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTZXJ2aWNlUmVmIHBhcmVudCwgU3RyaW5nIGhhbmRsZXJOYW1lLCBKYXZhQ2xhc3MgaGFuZGxlckNsYXNzKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCW5ld0NoaWxkXyA9IGNyZWF0ZU5ld0hhbmRsZXIoaGFuZGxlck5hbWUsIGhhbmRsZXJDbGFzcyk7Ci0JfQotCi0JcHVibGljIENvbW1hbmRBZGRDbGllbnRIYW5kbGVyKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTZXJ2aWNlUmVmIHBhcmVudCwgU3RyaW5nIGhhbmRsZXJOYW1lLCBTdHJpbmcgaGFuZGxlckNsYXNzTmFtZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQlKYXZhQ2xhc3MgaGFuZGxlckNsYXNzID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKGhhbmRsZXJDbGFzc05hbWUpOwotCQluZXdDaGlsZF8gPSBjcmVhdGVOZXdIYW5kbGVyKGhhbmRsZXJOYW1lLCBoYW5kbGVyQ2xhc3MpOwotCX0KLQotCXByaXZhdGUgSGFuZGxlciBjcmVhdGVOZXdIYW5kbGVyKFN0cmluZyBoYW5kbGVyTmFtZSwgSmF2YUNsYXNzIGhhbmRsZXJDbGFzcykgewotCQlXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkgZmFjdG9yeSA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2Vic2VydmljZV9jbGllbnRGYWN0b3J5KCk7Ci0JCUhhbmRsZXIgbmV3Q2hpbGQgPSBmYWN0b3J5LmNyZWF0ZUhhbmRsZXIoKTsKLQkJbmV3Q2hpbGQuc2V0SGFuZGxlck5hbWUoaGFuZGxlck5hbWUpOwotCQluZXdDaGlsZC5zZXRIYW5kbGVyQ2xhc3MoaGFuZGxlckNsYXNzKTsKLQkJcmV0dXJuIG5ld0NoaWxkOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXBhcmVudF8uZ2V0SGFuZGxlcnMoKS5hZGQobmV3Q2hpbGRfKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJcGFyZW50Xy5nZXRIYW5kbGVycygpLnJlbW92ZShuZXdDaGlsZF8pOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGRlZE9iamVjdCgpIHsKLQkJcmV0dXJuIG5ld0NoaWxkXzsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGE3ZmZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotcHVibGljIGNsYXNzIENvbW1hbmRBZGRFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIEVPYmplY3QgcGFyZW50XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmVfOwotCXByaXZhdGUgT2JqZWN0IG5ld0NoaWxkXzsKLQlwcml2YXRlIE9iamVjdCBvbGRDaGlsZF87Ci0JcHJpdmF0ZSBib29sZWFuIG9sZENoaWxkU2V0XzsKLQotCXB1YmxpYyBDb21tYW5kQWRkRWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUsIE9iamVjdCBuZXdDaGlsZCkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQljaGlsZEZlYXR1cmVfID0gY2hpbGRGZWF0dXJlOwotCQluZXdDaGlsZF8gPSBuZXdDaGlsZDsKLQkJb2xkQ2hpbGRfID0gbnVsbDsKLQkJb2xkQ2hpbGRTZXRfID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZEFkZEVsZW1lbnQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3QgcGFyZW50LCBFQ2xhc3MgY2hpbGRFQ2xhc3MsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGNoaWxkUHJvcGVydGllcywgT2JqZWN0W10gcHJvcGVydHlWYWx1ZXMpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJY2hpbGRGZWF0dXJlXyA9IGNoaWxkRmVhdHVyZTsKLQkJbmV3Q2hpbGRfID0gY3JlYXRlTmV3Q2hpbGQoY2hpbGRFQ2xhc3MsIChjaGlsZFByb3BlcnRpZXMgIT0gbnVsbCkgPyBjaGlsZFByb3BlcnRpZXMgOiBuZXcgRVN0cnVjdHVyYWxGZWF0dXJlWzBdLCAocHJvcGVydHlWYWx1ZXMgIT0gbnVsbCkgPyBwcm9wZXJ0eVZhbHVlcyA6IG5ldyBPYmplY3RbMF0pOwotCQlvbGRDaGlsZF8gPSBudWxsOwotCQlvbGRDaGlsZFNldF8gPSB0cnVlOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGNyZWF0ZU5ld0NoaWxkKEVDbGFzcyBjaGlsZEVDbGFzcywgRVN0cnVjdHVyYWxGZWF0dXJlW10gY2hpbGRQcm9wZXJ0aWVzLCBPYmplY3RbXSBwcm9wZXJ0eVZhbHVlcykgewotCQlFRmFjdG9yeSBlRmFjdG9yeSA9IGNoaWxkRUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCQlFT2JqZWN0IG5ld0NoaWxkID0gZUZhY3RvcnkuY3JlYXRlKGNoaWxkRUNsYXNzKTsKLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkUHJvcGVydGllcy5sZW5ndGg7IGkrKykKLQkJCQluZXdDaGlsZC5lU2V0KGNoaWxkUHJvcGVydGllc1tpXSwgcHJvcGVydHlWYWx1ZXNbaV0pOwotCQlyZXR1cm4gbmV3Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkpIHsKLQkJCWlmIChuZXdDaGlsZF8gIT0gbnVsbCkKLQkJCQkoKEVMaXN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXykpLmFkZChuZXdDaGlsZF8pOwotCQl9IGVsc2UgewotCQkJb2xkQ2hpbGRfID0gcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJb2xkQ2hpbGRTZXRfID0gcGFyZW50Xy5lSXNTZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQlwYXJlbnRfLmVTZXQoY2hpbGRGZWF0dXJlXywgbmV3Q2hpbGRfKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoY2hpbGRGZWF0dXJlXy5pc01hbnkoKSkgewotCQkJaWYgKG5ld0NoaWxkXyAhPSBudWxsKQotCQkJCSgoRUxpc3QpIHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKSkucmVtb3ZlKG5ld0NoaWxkXyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAob2xkQ2hpbGRTZXRfKQotCQkJCXBhcmVudF8uZVNldChjaGlsZEZlYXR1cmVfLCBvbGRDaGlsZF8pOwotCQkJZWxzZQotCQkJCXBhcmVudF8uZVVuc2V0KGNoaWxkRmVhdHVyZV8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkZGVkT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3Q2hpbGRfOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kQWRkUG9ydENvbXBvbmVudFJlZi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRQb3J0Q29tcG9uZW50UmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2MwZmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRQb3J0Q29tcG9uZW50UmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tYW5kQWRkUG9ydENvbXBvbmVudFJlZiBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVmIHBhcmVudF87Ci0JcHJpdmF0ZSBQb3J0Q29tcG9uZW50UmVmIG5ld0NoaWxkXzsKLQotCS8vcHJpdmF0ZSBib29sZWFuIG9sZENoaWxkU2V0XzsKLQotCXB1YmxpYyBDb21tYW5kQWRkUG9ydENvbXBvbmVudFJlZihTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgU2VydmljZVJlZiBwYXJlbnQsIFBvcnRDb21wb25lbnRSZWYgbmV3Q2hpbGQpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJbmV3Q2hpbGRfID0gbmV3Q2hpbGQ7Ci0JfQotCi0JcHVibGljIENvbW1hbmRBZGRQb3J0Q29tcG9uZW50UmVmKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTZXJ2aWNlUmVmIHBhcmVudCwgU3RyaW5nIHBvcnRDb21wb25lbnRMaW5rLCBKYXZhQ2xhc3Mgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXBhcmVudF8gPSBwYXJlbnQ7Ci0JCW5ld0NoaWxkXyA9IGNyZWF0ZU5ld1BvcnRDb21wb25lbnRSZWYocG9ydENvbXBvbmVudExpbmssIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0JfQotCi0JcHVibGljIENvbW1hbmRBZGRQb3J0Q29tcG9uZW50UmVmKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTZXJ2aWNlUmVmIHBhcmVudCwgU3RyaW5nIHBvcnRDb21wb25lbnRMaW5rLCBTdHJpbmcgc2VpTmFtZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQlKYXZhQ2xhc3Mgc2VpQ2xhc3MgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoc2VpTmFtZSk7Ci0JCW5ld0NoaWxkXyA9IGNyZWF0ZU5ld1BvcnRDb21wb25lbnRSZWYocG9ydENvbXBvbmVudExpbmssIHNlaUNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFBvcnRDb21wb25lbnRSZWYgY3JlYXRlTmV3UG9ydENvbXBvbmVudFJlZihTdHJpbmcgcG9ydENvbXBvbmVudExpbmssIEphdmFDbGFzcyBzZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UpIHsKLQkJV2Vic2VydmljZV9jbGllbnRGYWN0b3J5IGZhY3RvcnkgPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSgpOwotCQlQb3J0Q29tcG9uZW50UmVmIG5ld0NoaWxkID0gZmFjdG9yeS5jcmVhdGVQb3J0Q29tcG9uZW50UmVmKCk7Ci0JCW5ld0NoaWxkLnNldFBvcnRDb21wb25lbnRMaW5rKHBvcnRDb21wb25lbnRMaW5rKTsKLQkJbmV3Q2hpbGQuc2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZSk7Ci0JCXJldHVybiBuZXdDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIGluIHtAbGluayAjY2FuRXhlY3V0ZX10byBnaXZlIHRoZSBjb21tYW5kIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWR5IGl0c2VsZgotCSAqIGZvciBleGVjdXRpb24uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdG9yZWQgaW4ge0BsaW5rICNjYW5FeGVjdXRlfS4gSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbml0aWFsaXplIGFuZCB0byB5aWVsZCBhIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGFsbCBzdWJzZXF1ZW50IGNhbGxzCi0JICogdG8gY2FuRXhlY3V0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgZXhlY3V0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uIFRoZQotCSAqIHtAbGluayBVbmV4ZWN1dGFibGVDb21tYW5kI0lOU1RBTkNFfS48Y29kZT5jYW5FeGVjdXRlKCk8L2NvZGU+IGFsd2F5cyByZXR1cm5zCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGlzIDxiPm11c3QgPC9iPiBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHdoZW4gPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIG9yIHdoZW4KLQkgKiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlwYXJlbnRfLmdldFBvcnRDb21wb25lbnRSZWZzKCkuYWRkKG5ld0NoaWxkXyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXBhcmVudF8uZ2V0UG9ydENvbXBvbmVudFJlZnMoKS5yZW1vdmUobmV3Q2hpbGRfKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT5yZWRvPC9jb2RlPiB0aGUgZWZmZWN0IGFmdGVyIHVuZG9pbmcgdGhlCi0JICogZWZmZWN0LiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcgPGNvZGU+cmVkbzwvY29kZT4gYmVmb3JlIDxjb2RlPnVuZG88L2NvZGU+IGlzCi0JICogY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmIHlvdSBpbXBsZW1lbnQgPGNvZGU+cmVkbzwvY29kZT4gdG8gY2FsbAotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHRoZW4gYW55IGRlcml2ZWQgY2xhc3Mgd2lsbCBiZSByZXN0cmljdGVkIGJ5IHRoYXQgZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4gVGhlCi0JICogcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4sIG9yIGFmdGVyIGFuCi0JICogPGNvZGU+dW5kbzwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqIGJ5IHRoZSBjb21tYW5kLiBUeXBpY2FsbHkgc2hvdWxkIGNvdWxkIGJlIHVzZWQgYXMgdGhlIHNlbGVjdGlvbiB0aGF0IHNob3VsZCBiZSBoaWdobGlnaHRlZCB0bwotCSAqIGJlc3QgaWxsdXN0cmF0ZSB0aGUgZWZmZWN0IG9mIHRoZSBjb21tYW5kLiBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiw8Y29kZT5yZWRvPC9jb2RlPiwgb3IgPGNvZGU+dW5kbzwvY29kZT4gaXMgdW5kZWZpbmVkLiBUaGUKLQkgKiByZXN1bHQgbWF5IGJlIGRpZmZlcmVudCBhZnRlciBhbiA8Y29kZT51bmRvPC9jb2RlPiB0aGFuIGl0IGlzIGFmdGVyIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+Ci0JICogb3IgPGNvZGU+cmVkbzwvY29kZT4sIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBiZSB0aGUgc2FtZSAoZXF1aXZhbGVudCkgYWZ0ZXIgZWl0aGVyIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogICAgICAgICBieSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG5ldmVyIGJlIHVzZWQgYWdhaW4uIENhbGxpbmcgYW55IG90aGVyIG1ldGhvZCBhZnRlcgotCSAqIHRoaXMgb25lIGhhcyB1bmRlZmluZWQgcmVzdWx0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLiBUaGUKLQkgKiByZXN1bHRpbmcgY29tbWFuZCBtYXkganVzdCBiZSB0aGlzLCBpZiB0aGlzIGNvbW1hbmQgaXMgY2FwYWJhYmxlIG9mIGNvbXBvc2l0aW9uLiBPdGhlcndpc2UsCi0JICogaXQgd2lsbCBiZSBhIG5ldyBjb21tYW5kIGNyZWF0ZWQgdG8gY29tcG9zZSB0aGUgdHdvLgotCSAqIDxwPgotCSAqIEluc3RlYWQgb2YgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIG9mIHVzYWdlCi0JICogCi0JICogPHByZT4KLQkgKiBDb21tYW5kIHJlc3VsdCA9IHg7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJcmVzdWx0ID0gcmVzdWx0LmNoYWluKHkpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZH1hbmQgdXNpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCN1bndyYXAoKX10byBvcHRpbWl6ZSB0aGUgcmVzdWx0OgotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tcG91bmRDb21tYW5kIHN1YmNvbW1hbmRzID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCSAqIHN1YmNvbW1hbmRzLmFwcGVuZCh4KTsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlzdWJjb21tYW5kcy5hcHBlbmQoeSk7Ci0JICogQ29tbWFuZCByZXN1bHQgPSBzdWJjb21tYW5kcy51bndyYXAoKTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBUaGlzIGdpdmVzIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBob3cgdGhlIGNvbXBvdW5kIGNvbW1hbmQgY29tcG9zZXMgaXQncyByZXN1bHQgYW5kIGFmZmVjdGVkCi0JICogb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gY2hhaW4uCi0JICogQHJldHVybiBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjaGFpbihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIHN1cGVyLmNoYWluKGNvbW1hbmQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRkZWRPYmplY3QoKSB7Ci0JCXJldHVybiBuZXdDaGlsZF87Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRBZGRTZXJ2aWNlUmVmLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZFNlcnZpY2VSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5MjAwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZEFkZFNlcnZpY2VSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tYW5kQWRkU2VydmljZVJlZiBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCB7Ci0JcHJpdmF0ZSBXZWJTZXJ2aWNlc0NsaWVudCBwYXJlbnRfOwotCXByaXZhdGUgU2VydmljZVJlZiBuZXdDaGlsZF87Ci0KLQkvL3ByaXZhdGUgYm9vbGVhbiBvbGRDaGlsZFNldF87Ci0KLQlwdWJsaWMgQ29tbWFuZEFkZFNlcnZpY2VSZWYoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIFdlYlNlcnZpY2VzQ2xpZW50IHBhcmVudCwgU2VydmljZVJlZiBuZXdDaGlsZCkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQluZXdDaGlsZF8gPSBuZXdDaGlsZDsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZEFkZFNlcnZpY2VSZWYoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIFdlYlNlcnZpY2VzQ2xpZW50IHBhcmVudCwgU3RyaW5nIHNlcnZpY2VSZWZOYW1lLCBKYXZhQ2xhc3Mgc2VydmljZUludGVyZmFjZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQluZXdDaGlsZF8gPSBjcmVhdGVOZXdTZXJ2aWNlUmVmKHNlcnZpY2VSZWZOYW1lLCBzZXJ2aWNlSW50ZXJmYWNlKTsKLQl9Ci0KLQlwcml2YXRlIFNlcnZpY2VSZWYgY3JlYXRlTmV3U2VydmljZVJlZihTdHJpbmcgc2VydmljZVJlZk5hbWUsIEphdmFDbGFzcyBzZXJ2aWNlSW50ZXJmYWNlKSB7Ci0JCVdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeSBmYWN0b3J5ID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkoKTsKLQkJU2VydmljZVJlZiBuZXdDaGlsZCA9IGZhY3RvcnkuY3JlYXRlU2VydmljZVJlZigpOwotCQluZXdDaGlsZC5zZXRTZXJ2aWNlUmVmTmFtZShzZXJ2aWNlUmVmTmFtZSk7Ci0JCW5ld0NoaWxkLnNldFNlcnZpY2VJbnRlcmZhY2Uoc2VydmljZUludGVyZmFjZSk7Ci0JCXJldHVybiBuZXdDaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIGluIHtAbGluayAjY2FuRXhlY3V0ZX10byBnaXZlIHRoZSBjb21tYW5kIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWR5IGl0c2VsZgotCSAqIGZvciBleGVjdXRpb24uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdG9yZWQgaW4ge0BsaW5rICNjYW5FeGVjdXRlfS4gSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbml0aWFsaXplIGFuZCB0byB5aWVsZCBhIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGFsbCBzdWJzZXF1ZW50IGNhbGxzCi0JICogdG8gY2FuRXhlY3V0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgZXhlY3V0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uIFRoZQotCSAqIHtAbGluayBVbmV4ZWN1dGFibGVDb21tYW5kI0lOU1RBTkNFfS48Y29kZT5jYW5FeGVjdXRlKCk8L2NvZGU+IGFsd2F5cyByZXR1cm5zCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGlzIDxiPm11c3QgPC9iPiBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHdoZW4gPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIG9yIHdoZW4KLQkgKiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlwYXJlbnRfLmdldFNlcnZpY2VSZWZzKCkuYWRkKG5ld0NoaWxkXyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXBhcmVudF8uZ2V0U2VydmljZVJlZnMoKS5yZW1vdmUobmV3Q2hpbGRfKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT5yZWRvPC9jb2RlPiB0aGUgZWZmZWN0IGFmdGVyIHVuZG9pbmcgdGhlCi0JICogZWZmZWN0LiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcgPGNvZGU+cmVkbzwvY29kZT4gYmVmb3JlIDxjb2RlPnVuZG88L2NvZGU+IGlzCi0JICogY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmIHlvdSBpbXBsZW1lbnQgPGNvZGU+cmVkbzwvY29kZT4gdG8gY2FsbAotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHRoZW4gYW55IGRlcml2ZWQgY2xhc3Mgd2lsbCBiZSByZXN0cmljdGVkIGJ5IHRoYXQgZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4gVGhlCi0JICogcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4sIG9yIGFmdGVyIGFuCi0JICogPGNvZGU+dW5kbzwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqIGJ5IHRoZSBjb21tYW5kLiBUeXBpY2FsbHkgc2hvdWxkIGNvdWxkIGJlIHVzZWQgYXMgdGhlIHNlbGVjdGlvbiB0aGF0IHNob3VsZCBiZSBoaWdobGlnaHRlZCB0bwotCSAqIGJlc3QgaWxsdXN0cmF0ZSB0aGUgZWZmZWN0IG9mIHRoZSBjb21tYW5kLiBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiw8Y29kZT5yZWRvPC9jb2RlPiwgb3IgPGNvZGU+dW5kbzwvY29kZT4gaXMgdW5kZWZpbmVkLiBUaGUKLQkgKiByZXN1bHQgbWF5IGJlIGRpZmZlcmVudCBhZnRlciBhbiA8Y29kZT51bmRvPC9jb2RlPiB0aGFuIGl0IGlzIGFmdGVyIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+Ci0JICogb3IgPGNvZGU+cmVkbzwvY29kZT4sIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBiZSB0aGUgc2FtZSAoZXF1aXZhbGVudCkgYWZ0ZXIgZWl0aGVyIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogICAgICAgICBieSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG5ldmVyIGJlIHVzZWQgYWdhaW4uIENhbGxpbmcgYW55IG90aGVyIG1ldGhvZCBhZnRlcgotCSAqIHRoaXMgb25lIGhhcyB1bmRlZmluZWQgcmVzdWx0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLiBUaGUKLQkgKiByZXN1bHRpbmcgY29tbWFuZCBtYXkganVzdCBiZSB0aGlzLCBpZiB0aGlzIGNvbW1hbmQgaXMgY2FwYWJhYmxlIG9mIGNvbXBvc2l0aW9uLiBPdGhlcndpc2UsCi0JICogaXQgd2lsbCBiZSBhIG5ldyBjb21tYW5kIGNyZWF0ZWQgdG8gY29tcG9zZSB0aGUgdHdvLgotCSAqIDxwPgotCSAqIEluc3RlYWQgb2YgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIG9mIHVzYWdlCi0JICogCi0JICogPHByZT4KLQkgKiBDb21tYW5kIHJlc3VsdCA9IHg7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJcmVzdWx0ID0gcmVzdWx0LmNoYWluKHkpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZH1hbmQgdXNpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCN1bndyYXAoKX10byBvcHRpbWl6ZSB0aGUgcmVzdWx0OgotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tcG91bmRDb21tYW5kIHN1YmNvbW1hbmRzID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCSAqIHN1YmNvbW1hbmRzLmFwcGVuZCh4KTsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlzdWJjb21tYW5kcy5hcHBlbmQoeSk7Ci0JICogQ29tbWFuZCByZXN1bHQgPSBzdWJjb21tYW5kcy51bndyYXAoKTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBUaGlzIGdpdmVzIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBob3cgdGhlIGNvbXBvdW5kIGNvbW1hbmQgY29tcG9zZXMgaXQncyByZXN1bHQgYW5kIGFmZmVjdGVkCi0JICogb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gY2hhaW4uCi0JICogQHJldHVybiBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjaGFpbihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIHN1cGVyLmNoYWluKGNvbW1hbmQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRkZWRPYmplY3QoKSB7Ci0JCXJldHVybiBuZXdDaGlsZF87Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YyNjI1NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotcHVibGljIGNsYXNzIENvbW1hbmRNb2RpZnlFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIEVPYmplY3QgcGFyZW50XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHByb3BlcnRpZXNfOwotCXByaXZhdGUgT2JqZWN0W10gcHJvcGVydHlWYWx1ZXNfOwotCXByaXZhdGUgT2JqZWN0W10gb2xkUHJvcGVydHlWYWx1ZXNfOwotCi0JcHVibGljIENvbW1hbmRNb2RpZnlFbGVtZW50KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFT2JqZWN0IHBhcmVudCwgRVN0cnVjdHVyYWxGZWF0dXJlW10gcHJvcGVydGllcywgT2JqZWN0W10gcHJvcGVydHlWYWx1ZXMpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJcGFyZW50XyA9IHBhcmVudDsKLQkJcHJvcGVydGllc18gPSBwcm9wZXJ0aWVzOwotCQlwcm9wZXJ0eVZhbHVlc18gPSBwcm9wZXJ0eVZhbHVlczsKLQotCX0KLQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkUHJvcGVydHlWYWx1ZXNfID0gbmV3IE9iamVjdFtwcm9wZXJ0aWVzXy5sZW5ndGhdOwotCi0JCWlmIChwYXJlbnRfICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllc18ubGVuZ3RoOyBpKyspIHsKLQkJCQlvbGRQcm9wZXJ0eVZhbHVlc19baV0gPSBwYXJlbnRfLmVHZXQocHJvcGVydGllc19baV0pOwotCQkJCXBhcmVudF8uZVNldChwcm9wZXJ0aWVzX1tpXSwgcHJvcGVydHlWYWx1ZXNfW2ldKTsKLQkJCX0KLQkJfQotCi0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCQlpZiAocGFyZW50XyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFByb3BlcnR5VmFsdWVzXy5sZW5ndGg7IGkrKykgewotCQkJCXBhcmVudF8uZVNldChwcm9wZXJ0aWVzX1tpXSwgb2xkUHJvcGVydHlWYWx1ZXNfW2ldKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5SGFuZGxlckNsYXNzVGV4dC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlIYW5kbGVyQ2xhc3NUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MTQzNmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlIYW5kbGVyQ2xhc3NUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZE1vZGlmeUhhbmRsZXJDbGFzc1RleHQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgSGFuZGxlciBlT2JqZWN0XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcml2YXRlIFN0cmluZyBuZXdWYWx1ZV87Ci0JcHJpdmF0ZSBKYXZhQ2xhc3Mgb2xkVmFsdWVfOwotCXByaXZhdGUgYm9vbGVhbiBuaWxsYWJsZV87Ci0JcHJpdmF0ZSBib29sZWFuIG9sZElzU2V0XzsKLQotCXB1YmxpYyBDb21tYW5kTW9kaWZ5SGFuZGxlckNsYXNzVGV4dChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgSGFuZGxlciBlT2JqZWN0LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlmZWF0dXJlXyA9IFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9IYW5kbGVyQ2xhc3MoKTsKLQkJaWYgKG5ld1ZhbHVlID09IG51bGwpCi0JCQluZXdWYWx1ZV8gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQluZXdWYWx1ZV8gPSBuZXdWYWx1ZTsKLQkJbmlsbGFibGVfID0gZmFsc2U7Ci0JCW9sZFZhbHVlXyA9IG51bGw7Ci0JCW9sZElzU2V0XyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkSXNTZXRfID0gZU9iamVjdF8uZUlzU2V0KGZlYXR1cmVfKTsKLQkJb2xkVmFsdWVfID0gZU9iamVjdF8uZ2V0SGFuZGxlckNsYXNzKCk7Ci0JCWVPYmplY3RfLnNldEhhbmRsZXJDbGFzcyhKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYobmV3VmFsdWVfKSk7Ci0JCWlmIChuaWxsYWJsZV8gJiYgbmV3VmFsdWVfID09IG51bGwpCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAob2xkSXNTZXRfKQotCQkJZU9iamVjdF8uc2V0SGFuZGxlckNsYXNzKG9sZFZhbHVlXyk7Ci0JCWVsc2UKLQkJCWVPYmplY3RfLmVVbnNldChmZWF0dXJlXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeU5TVVJJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeU5TVVJJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTM3ZWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb2RpZnlOU1VSSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLnV0aWwuUU5hbWVIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21tYW5kTW9kaWZ5TlNVUkkgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgUU5hbWUgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3VmFsdWVfOwotCXByaXZhdGUgT2JqZWN0IG9sZFZhbHVlXzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRJc1NldF87Ci0KLQlwdWJsaWMgQ29tbWFuZE1vZGlmeU5TVVJJKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBRTmFtZSBlT2JqZWN0LCBTdHJpbmcgbmV3VmFsdWUsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJZU9iamVjdF8gPSBlT2JqZWN0OwotCQlmZWF0dXJlXyA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFFOYW1lX05hbWVzcGFjZVVSSSgpOwotCQlpZiAobmlsbGFibGUgJiYgKG5ld1ZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUubGVuZ3RoKCkgPD0gMCkpCi0JCQluZXdWYWx1ZV8gPSBudWxsOwotCQllbHNlIGlmICghbmlsbGFibGUgJiYgbmV3VmFsdWUgPT0gbnVsbCkKLQkJCW5ld1ZhbHVlXyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCW5ld1ZhbHVlXyA9IG5ld1ZhbHVlOwotCQluaWxsYWJsZV8gPSBuaWxsYWJsZTsKLQkJb2xkVmFsdWVfID0gbnVsbDsKLQkJb2xkSXNTZXRfID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIGluIHtAbGluayAjY2FuRXhlY3V0ZX10byBnaXZlIHRoZSBjb21tYW5kIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWR5IGl0c2VsZgotCSAqIGZvciBleGVjdXRpb24uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdG9yZWQgaW4ge0BsaW5rICNjYW5FeGVjdXRlfS4gSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbml0aWFsaXplIGFuZCB0byB5aWVsZCBhIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGFsbCBzdWJzZXF1ZW50IGNhbGxzCi0JICogdG8gY2FuRXhlY3V0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgZXhlY3V0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uIFRoZQotCSAqIHtAbGluayBVbmV4ZWN1dGFibGVDb21tYW5kI0lOU1RBTkNFfS48Y29kZT5jYW5FeGVjdXRlKCk8L2NvZGU+IGFsd2F5cyByZXR1cm5zCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGlzIDxiPm11c3QgPC9iPiBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHdoZW4gPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIG9yIHdoZW4KLQkgKiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRJc1NldF8gPSBlT2JqZWN0Xy5lSXNTZXQoZmVhdHVyZV8pOwotCQlvbGRWYWx1ZV8gPSBlT2JqZWN0Xy5nZXROYW1lc3BhY2VVUkkoKTsKLQkJUU5hbWVIZWxwZXIuc2V0UU5hbWVOYW1lc3BhY2VVUkkoZU9iamVjdF8sIG5ld1ZhbHVlXyk7Ci0JCWlmIChuaWxsYWJsZV8gJiYgbmV3VmFsdWVfID09IG51bGwpCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAob2xkSXNTZXRfKQotCQkJZU9iamVjdF8uZVNldChmZWF0dXJlXywgb2xkVmFsdWVfKTsKLQkJZWxzZQotCQkJZU9iamVjdF8uZVVuc2V0KGZlYXR1cmVfKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT5yZWRvPC9jb2RlPiB0aGUgZWZmZWN0IGFmdGVyIHVuZG9pbmcgdGhlCi0JICogZWZmZWN0LiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcgPGNvZGU+cmVkbzwvY29kZT4gYmVmb3JlIDxjb2RlPnVuZG88L2NvZGU+IGlzCi0JICogY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmIHlvdSBpbXBsZW1lbnQgPGNvZGU+cmVkbzwvY29kZT4gdG8gY2FsbAotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHRoZW4gYW55IGRlcml2ZWQgY2xhc3Mgd2lsbCBiZSByZXN0cmljdGVkIGJ5IHRoYXQgZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4gVGhlCi0JICogcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4sIG9yIGFmdGVyIGFuCi0JICogPGNvZGU+dW5kbzwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqIGJ5IHRoZSBjb21tYW5kLiBUeXBpY2FsbHkgc2hvdWxkIGNvdWxkIGJlIHVzZWQgYXMgdGhlIHNlbGVjdGlvbiB0aGF0IHNob3VsZCBiZSBoaWdobGlnaHRlZCB0bwotCSAqIGJlc3QgaWxsdXN0cmF0ZSB0aGUgZWZmZWN0IG9mIHRoZSBjb21tYW5kLiBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiw8Y29kZT5yZWRvPC9jb2RlPiwgb3IgPGNvZGU+dW5kbzwvY29kZT4gaXMgdW5kZWZpbmVkLiBUaGUKLQkgKiByZXN1bHQgbWF5IGJlIGRpZmZlcmVudCBhZnRlciBhbiA8Y29kZT51bmRvPC9jb2RlPiB0aGFuIGl0IGlzIGFmdGVyIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+Ci0JICogb3IgPGNvZGU+cmVkbzwvY29kZT4sIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBiZSB0aGUgc2FtZSAoZXF1aXZhbGVudCkgYWZ0ZXIgZWl0aGVyIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogICAgICAgICBieSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG5ldmVyIGJlIHVzZWQgYWdhaW4uIENhbGxpbmcgYW55IG90aGVyIG1ldGhvZCBhZnRlcgotCSAqIHRoaXMgb25lIGhhcyB1bmRlZmluZWQgcmVzdWx0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLiBUaGUKLQkgKiByZXN1bHRpbmcgY29tbWFuZCBtYXkganVzdCBiZSB0aGlzLCBpZiB0aGlzIGNvbW1hbmQgaXMgY2FwYWJhYmxlIG9mIGNvbXBvc2l0aW9uLiBPdGhlcndpc2UsCi0JICogaXQgd2lsbCBiZSBhIG5ldyBjb21tYW5kIGNyZWF0ZWQgdG8gY29tcG9zZSB0aGUgdHdvLgotCSAqIDxwPgotCSAqIEluc3RlYWQgb2YgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIG9mIHVzYWdlCi0JICogCi0JICogPHByZT4KLQkgKiBDb21tYW5kIHJlc3VsdCA9IHg7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJcmVzdWx0ID0gcmVzdWx0LmNoYWluKHkpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZH1hbmQgdXNpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCN1bndyYXAoKX10byBvcHRpbWl6ZSB0aGUgcmVzdWx0OgotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tcG91bmRDb21tYW5kIHN1YmNvbW1hbmRzID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCSAqIHN1YmNvbW1hbmRzLmFwcGVuZCh4KTsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlzdWJjb21tYW5kcy5hcHBlbmQoeSk7Ci0JICogQ29tbWFuZCByZXN1bHQgPSBzdWJjb21tYW5kcy51bndyYXAoKTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBUaGlzIGdpdmVzIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBob3cgdGhlIGNvbXBvdW5kIGNvbW1hbmQgY29tcG9zZXMgaXQncyByZXN1bHQgYW5kIGFmZmVjdGVkCi0JICogb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gY2hhaW4uCi0JICogQHJldHVybiBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjaGFpbihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIHN1cGVyLmNoYWluKGNvbW1hbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5U0VJLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVNFSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDMwZTBmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5U0VJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRNb2RpZnlTRUkgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgUG9ydENvbXBvbmVudFJlZiBlT2JqZWN0XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcml2YXRlIFN0cmluZyBuZXdWYWx1ZV87Ci0JcHJpdmF0ZSBPYmplY3Qgb2xkVmFsdWVfOwotCXByaXZhdGUgYm9vbGVhbiBuaWxsYWJsZV87Ci0JcHJpdmF0ZSBib29sZWFuIG9sZElzU2V0XzsKLQotCi0JcHVibGljIENvbW1hbmRNb2RpZnlTRUkoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIFBvcnRDb21wb25lbnRSZWYgZU9iamVjdCwgU3RyaW5nIG5ld1ZhbHVlLCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCWVPYmplY3RfID0gZU9iamVjdDsKLQkJZmVhdHVyZV8gPSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRSZWZfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCk7Ci0JCWlmIChuaWxsYWJsZSAmJiAobmV3VmFsdWUgPT0gbnVsbCB8fCBuZXdWYWx1ZS5sZW5ndGgoKSA8PSAwKSkKLQkJCW5ld1ZhbHVlXyA9IG51bGw7Ci0JCWVsc2UgaWYgKCFuaWxsYWJsZSAmJiBuZXdWYWx1ZSA9PSBudWxsKQotCQkJbmV3VmFsdWVfID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJbmV3VmFsdWVfID0gbmV3VmFsdWU7Ci0JCW5pbGxhYmxlXyA9IG5pbGxhYmxlOwotCQlvbGRWYWx1ZV8gPSBudWxsOwotCQlvbGRJc1NldF8gPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCBtb3N0IG9uY2UgaW4ge0BsaW5rICNjYW5FeGVjdXRlfXRvIGdpdmUgdGhlIGNvbW1hbmQgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhZHkgaXRzZWxmCi0JICogZm9yIGV4ZWN1dGlvbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIHN0b3JlZCBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9LiBJbiBvdGhlciB3b3JkcywgeW91IGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGluaXRpYWxpemUgYW5kIHRvIHlpZWxkIGEgY2FjaGVkIHZhbHVlIGZvciB0aGUgYWxsIHN1YnNlcXVlbnQgY2FsbHMKLQkgKiB0byBjYW5FeGVjdXRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tbWFuZCBpcyBleGVjdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4gVGhlCi0JICoge0BsaW5rIFVuZXhlY3V0YWJsZUNvbW1hbmQjSU5TVEFOQ0V9Ljxjb2RlPmNhbkV4ZWN1dGUoKTwvY29kZT4gYWx3YXlzIHJldHVybnMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uIFRoaXMgPGI+bXVzdCA8L2I+IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCBmb3IgdGhlIGVmZmVjdC4gVGhlIGVmZmVjdCBvZiBjYWxsaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd2hlbiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3Igd2hlbgotCSAqIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IGhhc24ndCBiZWVuIGNhbGxlZCwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZElzU2V0XyA9IGVPYmplY3RfLmVJc1NldChmZWF0dXJlXyk7Ci0JCW9sZFZhbHVlXyA9IGVPYmplY3RfLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpOwotCQlKYXZhQ2xhc3MgbmV3SmF2YUNsYXNzXyA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZihuZXdWYWx1ZV8pOwotCQllT2JqZWN0Xy5zZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UobmV3SmF2YUNsYXNzXyk7Ci0JCWlmIChuaWxsYWJsZV8gJiYgbmV3VmFsdWVfID09IG51bGwpCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAob2xkSXNTZXRfKQotCQkJZU9iamVjdF8uZVNldChmZWF0dXJlXywgb2xkVmFsdWVfKTsKLQkJZWxzZQotCQkJZU9iamVjdF8uZVVuc2V0KGZlYXR1cmVfKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT5yZWRvPC9jb2RlPiB0aGUgZWZmZWN0IGFmdGVyIHVuZG9pbmcgdGhlCi0JICogZWZmZWN0LiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcgPGNvZGU+cmVkbzwvY29kZT4gYmVmb3JlIDxjb2RlPnVuZG88L2NvZGU+IGlzCi0JICogY2FsbGVkIGlzIHVuZGVmaW5lZC4gTm90ZSB0aGF0IGlmIHlvdSBpbXBsZW1lbnQgPGNvZGU+cmVkbzwvY29kZT4gdG8gY2FsbAotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHRoZW4gYW55IGRlcml2ZWQgY2xhc3Mgd2lsbCBiZSByZXN0cmljdGVkIGJ5IHRoYXQgZGVjaXNpb24gYWxzby4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4gVGhlCi0JICogcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4sIG9yIGFmdGVyIGFuCi0JICogPGNvZGU+dW5kbzwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqIGJ5IHRoZSBjb21tYW5kLiBUeXBpY2FsbHkgc2hvdWxkIGNvdWxkIGJlIHVzZWQgYXMgdGhlIHNlbGVjdGlvbiB0aGF0IHNob3VsZCBiZSBoaWdobGlnaHRlZCB0bwotCSAqIGJlc3QgaWxsdXN0cmF0ZSB0aGUgZWZmZWN0IG9mIHRoZSBjb21tYW5kLiBUaGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBiZWZvcmUgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiw8Y29kZT5yZWRvPC9jb2RlPiwgb3IgPGNvZGU+dW5kbzwvY29kZT4gaXMgdW5kZWZpbmVkLiBUaGUKLQkgKiByZXN1bHQgbWF5IGJlIGRpZmZlcmVudCBhZnRlciBhbiA8Y29kZT51bmRvPC9jb2RlPiB0aGFuIGl0IGlzIGFmdGVyIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+Ci0JICogb3IgPGNvZGU+cmVkbzwvY29kZT4sIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBiZSB0aGUgc2FtZSAoZXF1aXZhbGVudCkgYWZ0ZXIgZWl0aGVyIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogICAgICAgICBieSB0aGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG5ldmVyIGJlIHVzZWQgYWdhaW4uIENhbGxpbmcgYW55IG90aGVyIG1ldGhvZCBhZnRlcgotCSAqIHRoaXMgb25lIGhhcyB1bmRlZmluZWQgcmVzdWx0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvL0RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLiBUaGUKLQkgKiByZXN1bHRpbmcgY29tbWFuZCBtYXkganVzdCBiZSB0aGlzLCBpZiB0aGlzIGNvbW1hbmQgaXMgY2FwYWJhYmxlIG9mIGNvbXBvc2l0aW9uLiBPdGhlcndpc2UsCi0JICogaXQgd2lsbCBiZSBhIG5ldyBjb21tYW5kIGNyZWF0ZWQgdG8gY29tcG9zZSB0aGUgdHdvLgotCSAqIDxwPgotCSAqIEluc3RlYWQgb2YgdGhlIGZvbGxvd2luZyBwYXR0ZXJuIG9mIHVzYWdlCi0JICogCi0JICogPHByZT4KLQkgKiBDb21tYW5kIHJlc3VsdCA9IHg7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJcmVzdWx0ID0gcmVzdWx0LmNoYWluKHkpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIHlvdSBzaG91bGQgY29uc2lkZXIgdXNpbmcgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZH1hbmQgdXNpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCN1bndyYXAoKX10byBvcHRpbWl6ZSB0aGUgcmVzdWx0OgotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tcG91bmRDb21tYW5kIHN1YmNvbW1hbmRzID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCSAqIHN1YmNvbW1hbmRzLmFwcGVuZCh4KTsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlzdWJjb21tYW5kcy5hcHBlbmQoeSk7Ci0JICogQ29tbWFuZCByZXN1bHQgPSBzdWJjb21tYW5kcy51bndyYXAoKTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBUaGlzIGdpdmVzIHlvdSBtb3JlIGNvbnRyb2wgb3ZlciBob3cgdGhlIGNvbXBvdW5kIGNvbW1hbmQgY29tcG9zZXMgaXQncyByZXN1bHQgYW5kIGFmZmVjdGVkCi0JICogb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgdGhlIGNvbW1hbmQgdG8gY2hhaW4uCi0JICogQHJldHVybiBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjaGFpbihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIHN1cGVyLmNoYWluKGNvbW1hbmQpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5U2VydmljZUludGVyZmFjZVRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5U2VydmljZUludGVyZmFjZVRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4OGQzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVNlcnZpY2VJbnRlcmZhY2VUZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZE1vZGlmeVNlcnZpY2VJbnRlcmZhY2VUZXh0IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIFNlcnZpY2VSZWYgZU9iamVjdF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZV87Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3VmFsdWVfOwotCXByaXZhdGUgSmF2YUNsYXNzIG9sZFZhbHVlXzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRJc1NldF87Ci0KLQlwdWJsaWMgQ29tbWFuZE1vZGlmeVNlcnZpY2VJbnRlcmZhY2VUZXh0KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTZXJ2aWNlUmVmIGVPYmplY3QsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQllT2JqZWN0XyA9IGVPYmplY3Q7Ci0JCWZlYXR1cmVfID0gV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VJbnRlcmZhY2UoKTsKLQkJaWYgKG5ld1ZhbHVlID09IG51bGwpCi0JCQluZXdWYWx1ZV8gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQluZXdWYWx1ZV8gPSBuZXdWYWx1ZTsKLQkJbmlsbGFibGVfID0gZmFsc2U7Ci0JCW9sZFZhbHVlXyA9IG51bGw7Ci0JCW9sZElzU2V0XyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkSXNTZXRfID0gZU9iamVjdF8uZUlzU2V0KGZlYXR1cmVfKTsKLQkJb2xkVmFsdWVfID0gZU9iamVjdF8uZ2V0U2VydmljZUludGVyZmFjZSgpOwotCQllT2JqZWN0Xy5zZXRTZXJ2aWNlSW50ZXJmYWNlKEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZihuZXdWYWx1ZV8pKTsKLQkJaWYgKG5pbGxhYmxlXyAmJiBuZXdWYWx1ZV8gPT0gbnVsbCkKLQkJCWVPYmplY3RfLmVVbnNldChmZWF0dXJlXyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChvbGRJc1NldF8pCi0JCQllT2JqZWN0Xy5zZXRTZXJ2aWNlSW50ZXJmYWNlKG9sZFZhbHVlXyk7Ci0JCWVsc2UKLQkJCWVPYmplY3RfLmVVbnNldChmZWF0dXJlXyk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZE1vZGlmeVRleHQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5VGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTZlYjAwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW9kaWZ5VGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZE1vZGlmeVRleHQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCXByaXZhdGUgRU9iamVjdCBlT2JqZWN0XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlXzsKLQlwcml2YXRlIFN0cmluZyBuZXdWYWx1ZV87Ci0JcHJpdmF0ZSBPYmplY3Qgb2xkVmFsdWVfOwotCXByaXZhdGUgYm9vbGVhbiBuaWxsYWJsZV87Ci0JcHJpdmF0ZSBib29sZWFuIG9sZElzU2V0XzsKLQotCXB1YmxpYyBDb21tYW5kTW9kaWZ5VGV4dChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIG5ld1ZhbHVlLCBib29sZWFuIG5pbGxhYmxlKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCWVPYmplY3RfID0gZU9iamVjdDsKLQkJZmVhdHVyZV8gPSBmZWF0dXJlOwotCQlpZiAobmlsbGFibGUgJiYgKG5ld1ZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUubGVuZ3RoKCkgPD0gMCkpCi0JCQluZXdWYWx1ZV8gPSBudWxsOwotCQllbHNlIGlmICghbmlsbGFibGUgJiYgbmV3VmFsdWUgPT0gbnVsbCkKLQkJCW5ld1ZhbHVlXyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCW5ld1ZhbHVlXyA9IG5ld1ZhbHVlOwotCQluaWxsYWJsZV8gPSBuaWxsYWJsZTsKLQkJb2xkVmFsdWVfID0gbnVsbDsKLQkJb2xkSXNTZXRfID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgbW9zdCBvbmNlIGluIHtAbGluayAjY2FuRXhlY3V0ZX10byBnaXZlIHRoZSBjb21tYW5kIGFuIG9wcG9ydHVuaXR5IHRvIHJlYWR5IGl0c2VsZgotCSAqIGZvciBleGVjdXRpb24uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdG9yZWQgaW4ge0BsaW5rICNjYW5FeGVjdXRlfS4gSW4gb3RoZXIgd29yZHMsIHlvdSBjYW4KLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbml0aWFsaXplIGFuZCB0byB5aWVsZCBhIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGFsbCBzdWJzZXF1ZW50IGNhbGxzCi0JICogdG8gY2FuRXhlY3V0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgZXhlY3V0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbWFtYWQgaXMgdmFsaWQgdG8gPGNvZGU+ZXhlY3V0ZTwvY29kZT4uIFRoZQotCSAqIHtAbGluayBVbmV4ZWN1dGFibGVDb21tYW5kI0lOU1RBTkNFfS48Y29kZT5jYW5FeGVjdXRlKCk8L2NvZGU+IGFsd2F5cyByZXR1cm5zCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGlzIDxiPm11c3QgPC9iPiBiZSBjYWxsZWQgYmVmb3JlIGNhbGxpbmcgPGNvZGU+ZXhlY3V0ZTwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgZm9yIHRoZSBlZmZlY3QuIFRoZSBlZmZlY3Qgb2YgY2FsbGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IHdoZW4gPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIG9yIHdoZW4KLQkgKiA8Y29kZT5jYW5FeGVjdXRlPC9jb2RlPiBoYXNuJ3QgYmVlbiBjYWxsZWQsIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlvbGRJc1NldF8gPSBlT2JqZWN0Xy5lSXNTZXQoZmVhdHVyZV8pOwotCQlvbGRWYWx1ZV8gPSBlT2JqZWN0Xy5lR2V0KGZlYXR1cmVfKTsKLQkJZU9iamVjdF8uZVNldChmZWF0dXJlXywgbmV3VmFsdWVfKTsKLQkJaWYgKG5pbGxhYmxlXyAmJiBuZXdWYWx1ZV8gPT0gbnVsbCkKLQkJCWVPYmplY3RfLmVVbnNldChmZWF0dXJlXyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBiZWNhdXNlIG1vc3QgY29tbWFuZCBzaG91bGQgYmUgdW5kb2FibGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgY29tbWFuZCBhY3Rpdml0eSByZXF1aXJlZCB0byA8Y29kZT51bmRvPC9jb2RlPiB0aGUgZWZmZWN0cyBvZiBhIHByZWNlZGluZwotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IChvciA8Y29kZT5yZWRvPC9jb2RlPikuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZwotCSAqIDxjb2RlPnVuZG88L2NvZGU+IGJlZm9yZSA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiBoYXZlIGJlZW4gY2FsbGVkLCBvcgotCSAqIHdoZW4gY2FuVW5kbyByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChvbGRJc1NldF8pCi0JCQllT2JqZWN0Xy5lU2V0KGZlYXR1cmVfLCBvbGRWYWx1ZV8pOwotCQllbHNlCi0JCQllT2JqZWN0Xy5lVW5zZXQoZmVhdHVyZV8pOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb3ZlU2VydmljZVJlZnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kTW92ZVNlcnZpY2VSZWZzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ODkzZmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21tYW5kL0NvbW1hbmRNb3ZlU2VydmljZVJlZnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotCi0KLXB1YmxpYyBjbGFzcyBDb21tYW5kTW92ZVNlcnZpY2VSZWZzIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIEVPYmplY3Qgc291cmNlXzsKLQlwcml2YXRlIEVPYmplY3QgdGFyZ2V0XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmVfOwotCXByaXZhdGUgT2JqZWN0W10gY2hpbGRyZW5fOwotCXByaXZhdGUgYm9vbGVhbiBpc0NvcHlfOwotCXByaXZhdGUgT2JqZWN0W10gY2xvbmVkQ2hpbGRyZW5fOwotCXByaXZhdGUgRUxpc3Qgc2VydmljZVJlZnM7Ci0KLQlwdWJsaWMgQ29tbWFuZE1vdmVTZXJ2aWNlUmVmcyhTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBzb3VyY2UsIEVPYmplY3QgdGFyZ2V0LCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBPYmplY3RbXSBjaGlsZHJlbiwgYm9vbGVhbiBpc0NvcHksIEVMaXN0IHNlcnZpY2VSZWZzKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCXNvdXJjZV8gPSBzb3VyY2U7Ci0JCXRhcmdldF8gPSB0YXJnZXQ7Ci0JCWNoaWxkRmVhdHVyZV8gPSBjaGlsZEZlYXR1cmU7Ci0JCWNoaWxkcmVuXyA9IGNoaWxkcmVuOwotCQlpc0NvcHlfID0gaXNDb3B5OwotCQljbG9uZWRDaGlsZHJlbl8gPSBudWxsOwotCQl0aGlzLnNlcnZpY2VSZWZzID0gc2VydmljZVJlZnM7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgY2xvbmVPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpIHsKLQkJCUVMaXN0IGNsb25lID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSAoKEVMaXN0KSBvYmplY3QpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQljbG9uZS5hZGQoY2xvbmVPYmplY3QoaXQubmV4dCgpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3Qgc291cmNlID0gKEVPYmplY3QpIG9iamVjdDsKLQkJCUVDbGFzcyBlQ2xhc3MgPSAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCk7Ci0JCQlFUGFja2FnZSBlUGFja2FnZSA9IGVDbGFzcy5nZXRFUGFja2FnZSgpOwotCQkJRUZhY3RvcnkgZUZhY3RvcnkgPSBlUGFja2FnZS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JCQlFT2JqZWN0IGNsb25lID0gZUZhY3RvcnkuY3JlYXRlKGVDbGFzcyk7Ci0JCQlFTGlzdCBmZWF0dXJlcyA9IGVDbGFzcy5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXQubmV4dCgpOwotCQkJCWlmIChzb3VyY2UuZUlzU2V0KGZlYXR1cmUpKSB7Ci0JCQkJCU9iamVjdCBjbG9uZWRGZWF0dXJlID0gY2xvbmVPYmplY3Qoc291cmNlLmVHZXQoZmVhdHVyZSkpOwotCQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkKLQkJCQkJCSgoTGlzdCkgY2xvbmUuZUdldChmZWF0dXJlKSkuYWRkQWxsKChMaXN0KSBjbG9uZWRGZWF0dXJlKTsKLQkJCQkJZWxzZQotCQkJCQkJY2xvbmUuZVNldChmZWF0dXJlLCBjbG9uZWRGZWF0dXJlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY2xvbmUuZVVuc2V0KGZlYXR1cmUpOwotCQkJfQotCQkJcmV0dXJuIGNsb25lOwotCQl9Ci0JCWlmIChvYmplY3QgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKG9iamVjdC50b1N0cmluZygpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkpCi0JCQlleGVjdXRlTWFueSgpOwotCQllbHNlCi0JCQlleGVjdXRlU2luZ2xlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVTaW5nbGUoKSB7Ci0JCU9iamVjdCBjaGlsZCA9IHNvdXJjZV8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJaWYgKGlzQ29weV8pCi0JCQl0YXJnZXRfLmVTZXQoY2hpbGRGZWF0dXJlXywgY2xvbmVPYmplY3QoY2hpbGQpKTsKLQkJZWxzZSB7Ci0JCQlzb3VyY2VfLmVVbnNldChjaGlsZEZlYXR1cmVfKTsKLQkJCXRhcmdldF8uZVNldChjaGlsZEZlYXR1cmVfLCBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU1hbnkoKSB7Ci0JCUVMaXN0IHNvdXJjZUxpc3Q7Ci0JCWlmIChzb3VyY2VfIGluc3RhbmNlb2YgV2ViU2VydmljZXNDbGllbnQpCi0JCQlzb3VyY2VMaXN0ID0gc2VydmljZVJlZnM7Ci0JCWVsc2UKLQkJCXNvdXJjZUxpc3QgPSAoRUxpc3QpIHNvdXJjZV8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJRUxpc3QgdGFyZ2V0TGlzdDsKLQkJaWYgKHRhcmdldF8gaW5zdGFuY2VvZiBXZWJTZXJ2aWNlc0NsaWVudCkKLQkJCXRhcmdldExpc3QgPSBzZXJ2aWNlUmVmczsKLQkJZWxzZQotCQkJdGFyZ2V0TGlzdCA9IChFTGlzdCkgdGFyZ2V0Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQlpZiAoaXNDb3B5XykKLQkJCWNsb25lZENoaWxkcmVuXyA9IG5ldyBPYmplY3RbY2hpbGRyZW5fLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW5fLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgaW5kZXggPSBzb3VyY2VMaXN0LmluZGV4T2YoY2hpbGRyZW5fW2ldKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCWlmIChpc0NvcHlfKSB7Ci0JCQkJCWNsb25lZENoaWxkcmVuX1tpXSA9IGNsb25lT2JqZWN0KGNoaWxkcmVuX1tpXSk7Ci0JCQkJCXRhcmdldExpc3QuYWRkKGNsb25lZENoaWxkcmVuX1tpXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc291cmNlTGlzdC5yZW1vdmUoaW5kZXgpOwotCQkJCQl0YXJnZXRMaXN0LmFkZChjaGlsZHJlbl9baV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoY2hpbGRGZWF0dXJlXy5pc01hbnkoKSkKLQkJCXVuZG9TaW5nbGUoKTsKLQkJZWxzZQotCQkJdW5kb01hbnkoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5kb1NpbmdsZSgpIHsKLQkJT2JqZWN0IGNoaWxkID0gdGFyZ2V0Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQl0YXJnZXRfLmVVbnNldChjaGlsZEZlYXR1cmVfKTsKLQkJaWYgKCFpc0NvcHlfKQotCQkJc291cmNlXy5lU2V0KGNoaWxkRmVhdHVyZV8sIGNoaWxkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5kb01hbnkoKSB7Ci0JCUVMaXN0IHNvdXJjZUxpc3Q7Ci0JCWlmIChzb3VyY2VfIGluc3RhbmNlb2YgV2ViU2VydmljZXNDbGllbnQpCi0JCQlzb3VyY2VMaXN0ID0gc2VydmljZVJlZnM7Ci0JCWVsc2UKLQkJCXNvdXJjZUxpc3QgPSAoRUxpc3QpIHNvdXJjZV8uZUdldChjaGlsZEZlYXR1cmVfKTsKLQkJRUxpc3QgdGFyZ2V0TGlzdDsKLQkJaWYgKHRhcmdldF8gaW5zdGFuY2VvZiBXZWJTZXJ2aWNlc0NsaWVudCkKLQkJCXRhcmdldExpc3QgPSBzZXJ2aWNlUmVmczsKLQkJZWxzZQotCQkJdGFyZ2V0TGlzdCA9IChFTGlzdCkgdGFyZ2V0Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQlpZiAoaXNDb3B5XykgewotCQkJaWYgKGNsb25lZENoaWxkcmVuXyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbG9uZWRDaGlsZHJlbl8ubGVuZ3RoOyBpKyspIHsKLQkJCQkJdGFyZ2V0TGlzdC5yZW1vdmUoY2xvbmVkQ2hpbGRyZW5fW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuXy5sZW5ndGg7IGkrKykgewotCQkJCWludCBpbmRleCA9IHRhcmdldExpc3QuaW5kZXhPZihjaGlsZHJlbl9baV0pOwotCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQl0YXJnZXRMaXN0LnJlbW92ZShpbmRleCk7Ci0JCQkJCXNvdXJjZUxpc3QuYWRkKGNoaWxkcmVuX1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZFJlbW92ZUVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kUmVtb3ZlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjA2MTY1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kUmVtb3ZlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotcHVibGljIGNsYXNzIENvbW1hbmRSZW1vdmVFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIEVPYmplY3QgcGFyZW50XzsKLQlwcml2YXRlIE9iamVjdCBjaGlsZF87Ci0JcHJpdmF0ZSBPYmplY3Qgb2xkQ2hpbGRfOwotCXByaXZhdGUgYm9vbGVhbiBvbGRDaGlsZFNldF87Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlXzsKLQlwcml2YXRlIGJvb2xlYW4gbmlsbGFibGVfOwotCi0JcHVibGljIENvbW1hbmRSZW1vdmVFbGVtZW50KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFT2JqZWN0IHBhcmVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSkgewotCQl0aGlzKGxhYmVsLCBkZXNjcmlwdGlvbiwgcGFyZW50LCBjaGlsZEZlYXR1cmUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kUmVtb3ZlRWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUsIGJvb2xlYW4gbmlsbGFibGUpIHsKLQkJdGhpcyhsYWJlbCwgZGVzY3JpcHRpb24sIHBhcmVudCwgbnVsbCwgY2hpbGRGZWF0dXJlLCBuaWxsYWJsZSk7Ci0JfQotCi0JcHVibGljIENvbW1hbmRSZW1vdmVFbGVtZW50KFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBFT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkLCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlKSB7Ci0JCXRoaXMobGFiZWwsIGRlc2NyaXB0aW9uLCBwYXJlbnQsIGNoaWxkLCBjaGlsZEZlYXR1cmUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBDb21tYW5kUmVtb3ZlRWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCwgRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSwgYm9vbGVhbiBuaWxsYWJsZSkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQljaGlsZF8gPSBjaGlsZDsKLQkJb2xkQ2hpbGRfID0gbnVsbDsKLQkJb2xkQ2hpbGRTZXRfID0gdHJ1ZTsKLQkJY2hpbGRGZWF0dXJlXyA9IGNoaWxkRmVhdHVyZTsKLQkJbmlsbGFibGVfID0gbmlsbGFibGU7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkpIHsKLQkJCWlmIChjaGlsZF8gIT0gbnVsbCkKLQkJCQkoKEVMaXN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXykpLnJlbW92ZShjaGlsZF8pOwotCQl9IGVsc2UgewotCQkJb2xkQ2hpbGRfID0gcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJb2xkQ2hpbGRTZXRfID0gcGFyZW50Xy5lSXNTZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQlpZiAobmlsbGFibGVfKQotCQkJCXBhcmVudF8uZVVuc2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJZWxzZQotCQkJCXBhcmVudF8uZVNldChjaGlsZEZlYXR1cmVfLCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gYmVjYXVzZSBtb3N0IGNvbW1hbmQgc2hvdWxkIGJlIHVuZG9hYmxlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+dW5kbzwvY29kZT4gdGhlIGVmZmVjdHMgb2YgYSBwcmVjZWRpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiAob3IgPGNvZGU+cmVkbzwvY29kZT4pLiBUaGUgZWZmZWN0LCBpZiBhbnksIG9mIGNhbGxpbmcKLQkgKiA8Y29kZT51bmRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+ZXhlY3V0ZTwvY29kZT4gb3IgPGNvZGU+cmVkbzwvY29kZT4gaGF2ZSBiZWVuIGNhbGxlZCwgb3IKLQkgKiB3aGVuIGNhblVuZG8gcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4sIGlzIHVuZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoY2hpbGRGZWF0dXJlXy5pc01hbnkoKSkgewotCQkJaWYgKGNoaWxkXyAhPSBudWxsKQotCQkJCSgoRUxpc3QpIHBhcmVudF8uZUdldChjaGlsZEZlYXR1cmVfKSkuYWRkKGNoaWxkXyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAob2xkQ2hpbGRTZXRfKQotCQkJCXBhcmVudF8uZVNldChjaGlsZEZlYXR1cmVfLCBvbGRDaGlsZF8pOwotCQkJZWxzZQotCQkJCXBhcmVudF8uZVVuc2V0KGNoaWxkRmVhdHVyZV8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGNvbW1hbmQgYWN0aXZpdHkgcmVxdWlyZWQgdG8gPGNvZGU+cmVkbzwvY29kZT4gdGhlIGVmZmVjdCBhZnRlciB1bmRvaW5nIHRoZQotCSAqIGVmZmVjdC4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nIDxjb2RlPnJlZG88L2NvZGU+IGJlZm9yZSA8Y29kZT51bmRvPC9jb2RlPiBpcwotCSAqIGNhbGxlZCBpcyB1bmRlZmluZWQuIE5vdGUgdGhhdCBpZiB5b3UgaW1wbGVtZW50IDxjb2RlPnJlZG88L2NvZGU+IHRvIGNhbGwKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB0aGVuIGFueSBkZXJpdmVkIGNsYXNzIHdpbGwgYmUgcmVzdHJpY3RlZCBieSB0aGF0IGRlY2lzaW9uIGFsc28uCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuIFRoZQotCSAqIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LCBvciBhZnRlciBhbgotCSAqIDxjb2RlPnVuZG88L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyBpdCdzIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiBieSB0aGUgY29tbWFuZC4gVHlwaWNhbGx5IHNob3VsZCBjb3VsZCBiZSB1c2VkIGFzIHRoZSBzZWxlY3Rpb24gdGhhdCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQgdG8KLQkgKiBiZXN0IGlsbHVzdHJhdGUgdGhlIGVmZmVjdCBvZiB0aGUgY29tbWFuZC4gVGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoaXMgYmVmb3JlIGFuCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4sPGNvZGU+cmVkbzwvY29kZT4sIG9yIDxjb2RlPnVuZG88L2NvZGU+IGlzIHVuZGVmaW5lZC4gVGhlCi0JICogcmVzdWx0IG1heSBiZSBkaWZmZXJlbnQgYWZ0ZXIgYW4gPGNvZGU+dW5kbzwvY29kZT4gdGhhbiBpdCBpcyBhZnRlciBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPgotCSAqIG9yIDxjb2RlPnJlZG88L2NvZGU+LCBidXQgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgKGVxdWl2YWxlbnQpIGFmdGVyIGVpdGhlciBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgdGhpbmdzIHdoaWNoIHRoaXMgY29tbWFuZCB3aXNoZXMgdG8gcHJlc2VudCBhcyB0aGUgb2JqZWN0cyBhZmZlY3RlZAotCSAqICAgICAgICAgYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBuZXZlciBiZSB1c2VkIGFnYWluLiBDYWxsaW5nIGFueSBvdGhlciBtZXRob2QgYWZ0ZXIKLQkgKiB0aGlzIG9uZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy9EbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbW1hbmQgdGhhdCByZXByZXNlbnRzIHRoZSBjb21wb3NpdGlvbiBvZiB0aGlzIGNvbW1hbmQgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC4gVGhlCi0JICogcmVzdWx0aW5nIGNvbW1hbmQgbWF5IGp1c3QgYmUgdGhpcywgaWYgdGhpcyBjb21tYW5kIGlzIGNhcGFiYWJsZSBvZiBjb21wb3NpdGlvbi4gT3RoZXJ3aXNlLAotCSAqIGl0IHdpbGwgYmUgYSBuZXcgY29tbWFuZCBjcmVhdGVkIHRvIGNvbXBvc2UgdGhlIHR3by4KLQkgKiA8cD4KLQkgKiBJbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgcGF0dGVybiBvZiB1c2FnZQotCSAqIAotCSAqIDxwcmU+Ci0JICogQ29tbWFuZCByZXN1bHQgPSB4OwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXJlc3VsdCA9IHJlc3VsdC5jaGFpbih5KTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiB5b3Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmR9YW5kIHVzaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQjdW53cmFwKCl9dG8gb3B0aW1pemUgdGhlIHJlc3VsdDoKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbXBvdW5kQ29tbWFuZCBzdWJjb21tYW5kcyA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkgKiBzdWJjb21tYW5kcy5hcHBlbmQoeCk7Ci0JICogaWYgKGNvbmRpdGlvbikKLQkgKiAJc3ViY29tbWFuZHMuYXBwZW5kKHkpOwotCSAqIENvbW1hbmQgcmVzdWx0ID0gc3ViY29tbWFuZHMudW53cmFwKCk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogVGhpcyBnaXZlcyB5b3UgbW9yZSBjb250cm9sIG92ZXIgaG93IHRoZSBjb21wb3VuZCBjb21tYW5kIGNvbXBvc2VzIGl0J3MgcmVzdWx0IGFuZCBhZmZlY3RlZAotCSAqIG9iamVjdHMuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tYW5kIHRvIGNoYWluLgotCSAqIEByZXR1cm4gYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuCi0JICovCi0JcHVibGljIENvbW1hbmQgY2hhaW4oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBzdXBlci5jaGFpbihjb21tYW5kKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbW1hbmQvQ29tbWFuZFNldEVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kU2V0RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmNlYzBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tbWFuZC9Db21tYW5kU2V0RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotcHVibGljIGNsYXNzIENvbW1hbmRTZXRFbGVtZW50IGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIEVPYmplY3QgcGFyZW50XzsKLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmVfOwotCXByaXZhdGUgT2JqZWN0IG5ld0NoaWxkXzsKLQlwcml2YXRlIE9iamVjdCBvbGRDaGlsZF87Ci0JcHJpdmF0ZSBib29sZWFuIG9sZENoaWxkU2V0XzsKLQotCXB1YmxpYyBDb21tYW5kU2V0RWxlbWVudChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgRU9iamVjdCBwYXJlbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUsIE9iamVjdCBuZXdDaGlsZCkgewotCQl0aGlzKGxhYmVsLCBkZXNjcmlwdGlvbiwgcGFyZW50LCBjaGlsZEZlYXR1cmUsIG5ld0NoaWxkLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZFNldEVsZW1lbnQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIEVPYmplY3QgcGFyZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgY2hpbGRGZWF0dXJlLCBPYmplY3QgbmV3Q2hpbGQsIE9iamVjdCBvbGRDaGlsZCkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCQlwYXJlbnRfID0gcGFyZW50OwotCQljaGlsZEZlYXR1cmVfID0gY2hpbGRGZWF0dXJlOwotCQluZXdDaGlsZF8gPSBuZXdDaGlsZDsKLQkJb2xkQ2hpbGRfID0gb2xkQ2hpbGQ7Ci0JCW9sZENoaWxkU2V0XyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IG1vc3Qgb25jZSBpbiB7QGxpbmsgI2NhbkV4ZWN1dGV9dG8gZ2l2ZSB0aGUgY29tbWFuZCBhbiBvcHBvcnR1bml0eSB0byByZWFkeSBpdHNlbGYKLQkgKiBmb3IgZXhlY3V0aW9uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RvcmVkIGluIHtAbGluayAjY2FuRXhlY3V0ZX0uIEluIG90aGVyIHdvcmRzLCB5b3UgY2FuCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW5pdGlhbGl6ZSBhbmQgdG8geWllbGQgYSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBhbGwgc3Vic2VxdWVudCBjYWxscwotCSAqIHRvIGNhbkV4ZWN1dGUuCi0JICogCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSBjb21tYW5kIGlzIGV4ZWN1dGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb21hbWFkIGlzIHZhbGlkIHRvIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LiBUaGUKLQkgKiB7QGxpbmsgVW5leGVjdXRhYmxlQ29tbWFuZCNJTlNUQU5DRX0uPGNvZGU+Y2FuRXhlY3V0ZSgpPC9jb2RlPiBhbHdheXMgcmV0dXJucwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhpcyA8Yj5tdXN0IDwvYj4gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgY29tYW1hZCBpcyB2YWxpZCB0byA8Y29kZT5leGVjdXRlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIGZvciB0aGUgZWZmZWN0LiBUaGUgZWZmZWN0IG9mIGNhbGxpbmcKLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiB3aGVuIDxjb2RlPmNhbkV4ZWN1dGU8L2NvZGU+IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvciB3aGVuCi0JICogPGNvZGU+Y2FuRXhlY3V0ZTwvY29kZT4gaGFzbid0IGJlZW4gY2FsbGVkLCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkgJiYgIShuZXdDaGlsZF8gaW5zdGFuY2VvZiBFTGlzdCkpIHsKLQkJCWlmIChvbGRDaGlsZF8gIT0gbnVsbCAmJiBuZXdDaGlsZF8gIT0gbnVsbCkgewotCQkJCUVMaXN0IGVMaXN0ID0gKEVMaXN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQkJaW50IGluZGV4ID0gZUxpc3QuaW5kZXhPZihvbGRDaGlsZF8pOwotCQkJCWlmIChpbmRleCAhPSAtMSkKLQkJCQkJZUxpc3Quc2V0KGluZGV4LCBuZXdDaGlsZF8pOwotCQkJfQotCQl9IGVsc2UgewotCQkJb2xkQ2hpbGRfID0gcGFyZW50Xy5lR2V0KGNoaWxkRmVhdHVyZV8pOwotCQkJb2xkQ2hpbGRTZXRfID0gcGFyZW50Xy5lSXNTZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQlpZiAobmV3Q2hpbGRfICE9IG51bGwpCi0JCQkJcGFyZW50Xy5lU2V0KGNoaWxkRmVhdHVyZV8sIG5ld0NoaWxkXyk7Ci0JCQllbHNlCi0JCQkJcGFyZW50Xy5lVW5zZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGJlY2F1c2UgbW9zdCBjb21tYW5kIHNob3VsZCBiZSB1bmRvYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnVuZG88L2NvZGU+IHRoZSBlZmZlY3RzIG9mIGEgcHJlY2VkaW5nCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gKG9yIDxjb2RlPnJlZG88L2NvZGU+KS4gVGhlIGVmZmVjdCwgaWYgYW55LCBvZiBjYWxsaW5nCi0JICogPGNvZGU+dW5kbzwvY29kZT4gYmVmb3JlIDxjb2RlPmV4ZWN1dGU8L2NvZGU+IG9yIDxjb2RlPnJlZG88L2NvZGU+IGhhdmUgYmVlbiBjYWxsZWQsIG9yCi0JICogd2hlbiBjYW5VbmRvIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpcyB1bmRlZmluZWQuCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGNoaWxkRmVhdHVyZV8uaXNNYW55KCkgJiYgIShuZXdDaGlsZF8gaW5zdGFuY2VvZiBFTGlzdCkpIHsKLQkJCWlmIChvbGRDaGlsZF8gIT0gbnVsbCAmJiBuZXdDaGlsZF8gIT0gbnVsbCkgewotCQkJCUVMaXN0IGVMaXN0ID0gKEVMaXN0KSBwYXJlbnRfLmVHZXQoY2hpbGRGZWF0dXJlXyk7Ci0JCQkJaW50IGluZGV4ID0gZUxpc3QuaW5kZXhPZihuZXdDaGlsZF8pOwotCQkJCWlmIChpbmRleCAhPSAtMSkKLQkJCQkJZUxpc3Quc2V0KGluZGV4LCBvbGRDaGlsZF8pOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKG9sZENoaWxkU2V0XykKLQkJCQlwYXJlbnRfLmVTZXQoY2hpbGRGZWF0dXJlXywgb2xkQ2hpbGRfKTsKLQkJCWVsc2UKLQkJCQlwYXJlbnRfLmVVbnNldChjaGlsZEZlYXR1cmVfKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBjb21tYW5kIGFjdGl2aXR5IHJlcXVpcmVkIHRvIDxjb2RlPnJlZG88L2NvZGU+IHRoZSBlZmZlY3QgYWZ0ZXIgdW5kb2luZyB0aGUKLQkgKiBlZmZlY3QuIFRoZSBlZmZlY3QsIGlmIGFueSwgb2YgY2FsbGluZyA8Y29kZT5yZWRvPC9jb2RlPiBiZWZvcmUgPGNvZGU+dW5kbzwvY29kZT4gaXMKLQkgKiBjYWxsZWQgaXMgdW5kZWZpbmVkLiBOb3RlIHRoYXQgaWYgeW91IGltcGxlbWVudCA8Y29kZT5yZWRvPC9jb2RlPiB0byBjYWxsCi0JICogPGNvZGU+ZXhlY3V0ZTwvY29kZT4gdGhlbiBhbnkgZGVyaXZlZCBjbGFzcyB3aWxsIGJlIHJlc3RyaWN0ZWQgYnkgdGhhdCBkZWNpc2lvbiBhbHNvLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIGl0J3MgcmVzdWx0LiBUaGUKLQkgKiByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgb3IgYWZ0ZXIgYW4KLQkgKiA8Y29kZT51bmRvPC9jb2RlPiwgaXMgdW5kZWZpbmVkLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgaXQncyByZXN1bHQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZiB0aGluZ3Mgd2hpY2ggdGhpcyBjb21tYW5kIHdpc2hlcyB0byBwcmVzZW50IGFzIHRoZSBvYmplY3RzIGFmZmVjdGVkCi0JICogYnkgdGhlIGNvbW1hbmQuIFR5cGljYWxseSBzaG91bGQgY291bGQgYmUgdXNlZCBhcyB0aGUgc2VsZWN0aW9uIHRoYXQgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHRvCi0JICogYmVzdCBpbGx1c3RyYXRlIHRoZSBlZmZlY3Qgb2YgdGhlIGNvbW1hbmQuIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIGJlZm9yZSBhbgotCSAqIDxjb2RlPmV4ZWN1dGU8L2NvZGU+LDxjb2RlPnJlZG88L2NvZGU+LCBvciA8Y29kZT51bmRvPC9jb2RlPiBpcyB1bmRlZmluZWQuIFRoZQotCSAqIHJlc3VsdCBtYXkgYmUgZGlmZmVyZW50IGFmdGVyIGFuIDxjb2RlPnVuZG88L2NvZGU+IHRoYW4gaXQgaXMgYWZ0ZXIgYW4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4KLQkgKiBvciA8Y29kZT5yZWRvPC9jb2RlPiwgYnV0IHRoZSByZXN1bHQgc2hvdWxkIGJlIHRoZSBzYW1lIChlcXVpdmFsZW50KSBhZnRlciBlaXRoZXIgYW4KLQkgKiA8Y29kZT5leGVjdXRlPC9jb2RlPiBvciA8Y29kZT5yZWRvPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHRoaW5ncyB3aGljaCB0aGlzIGNvbW1hbmQgd2lzaGVzIHRvIHByZXNlbnQgYXMgdGhlIG9iamVjdHMgYWZmZWN0ZWQKLQkgKiAgICAgICAgIGJ5IHRoZSBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgbmV2ZXIgYmUgdXNlZCBhZ2Fpbi4gQ2FsbGluZyBhbnkgb3RoZXIgbWV0aG9kIGFmdGVyCi0JICogdGhpcyBvbmUgaGFzIHVuZGVmaW5lZCByZXN1bHRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vRG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21tYW5kIHRoYXQgcmVwcmVzZW50cyB0aGUgY29tcG9zaXRpb24gb2YgdGhpcyBjb21tYW5kIHdpdGggdGhlIGdpdmVuIGNvbW1hbmQuIFRoZQotCSAqIHJlc3VsdGluZyBjb21tYW5kIG1heSBqdXN0IGJlIHRoaXMsIGlmIHRoaXMgY29tbWFuZCBpcyBjYXBhYmFibGUgb2YgY29tcG9zaXRpb24uIE90aGVyd2lzZSwKLQkgKiBpdCB3aWxsIGJlIGEgbmV3IGNvbW1hbmQgY3JlYXRlZCB0byBjb21wb3NlIHRoZSB0d28uCi0JICogPHA+Ci0JICogSW5zdGVhZCBvZiB0aGUgZm9sbG93aW5nIHBhdHRlcm4gb2YgdXNhZ2UKLQkgKiAKLQkgKiA8cHJlPgotCSAqIENvbW1hbmQgcmVzdWx0ID0geDsKLQkgKiBpZiAoY29uZGl0aW9uKQotCSAqIAlyZXN1bHQgPSByZXN1bHQuY2hhaW4oeSk7Ci0JICogPC9wcmU+Ci0JICogCi0JICogeW91IHNob3VsZCBjb25zaWRlciB1c2luZyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kfWFuZCB1c2luZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3Vud3JhcCgpfXRvIG9wdGltaXplIHRoZSByZXN1bHQ6Ci0JICogCi0JICogPHByZT4KLQkgKiBDb21wb3VuZENvbW1hbmQgc3ViY29tbWFuZHMgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JICogc3ViY29tbWFuZHMuYXBwZW5kKHgpOwotCSAqIGlmIChjb25kaXRpb24pCi0JICogCXN1YmNvbW1hbmRzLmFwcGVuZCh5KTsKLQkgKiBDb21tYW5kIHJlc3VsdCA9IHN1YmNvbW1hbmRzLnVud3JhcCgpOwotCSAqIDwvcHJlPgotCSAqIAotCSAqIFRoaXMgZ2l2ZXMgeW91IG1vcmUgY29udHJvbCBvdmVyIGhvdyB0aGUgY29tcG91bmQgY29tbWFuZCBjb21wb3NlcyBpdCdzIHJlc3VsdCBhbmQgYWZmZWN0ZWQKLQkgKiBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBjaGFpbi4KLQkgKiBAcmV0dXJuIGEgY29tbWFuZCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBvc2l0aW9uIG9mIHRoaXMgY29tbWFuZCB3aXRoIHRoZSBnaXZlbiBjb21tYW5kLgotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNoYWluKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gc3VwZXIuY2hhaW4oY29tbWFuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21wb25lbnRjb3JlL3V0aWwvSmF4UlBDTWFwQXJ0aWZhY3RFZGl0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9KYXhSUENNYXBBcnRpZmFjdEVkaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwNWZjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbXBvbmVudGNvcmUvdXRpbC9KYXhSUENNYXBBcnRpZmFjdEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21wb25lbnRjb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkVudGVycHJpc2VBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLS8qKgotICogPHA+Ci0gKiBXU0REQXJ0aWZhY3RFZGl0IG9idGFpbnMgYSBXUyBEZXBsb3ltZW50IERlc2NyaXB0b3IgbWV0YW1vZGVsIHNwZWNpZmVjIGRhdGEgZnJvbSBhCi0gKiB7QHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2V9Jm5ic3A7IHdoaWNoIHN0b3JlcyB0aGUgbWV0YW1vZGVsLiBUaGUKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZX0mbmJzcDtpcyByZXRyaWV2ZWQgZnJvbSB0aGUKLSAqIHtAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5BcnRpZmFjdEVkaXRNb2RlbH0mbmJzcDt1c2luZyBhIGNvbnN0YW50IHtAc2VlCi0gKiBKMkVFQ29uc3RhbnRzI0VKQkpBUl9ERF9VUklfT0JKfS4gVGhlIGRlZmluZWQgbWV0aG9kcyBleHRyYWN0IGRhdGEgb3IgbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YKLSAqIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlLgotICogPC9wPgotICogCi0gKi8gCi1wdWJsaWMgY2xhc3MgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0IGV4dGVuZHMgRW50ZXJwcmlzZUFydGlmYWN0RWRpdCB7Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogSWRlbnRpZmllciB1c2VkIHRvIGxpbmsgV1NEREFydGlmYWN0RWRpdCB0byBhIFdzZGRBZGFwdGVyRmFjdG9yeSB7QHNlZQotCSAqIFdzZGRBZGFwdGVyRmFjdG9yeX0gc3RvcmVkIGluIGFuIEFkYXB0ZXJNYW5nZXIgKEBzZWUgQWRhcHRlck1hbmFnZXIpCi0JICogPC9wPgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBBREFQVEVSX1RZUEUgPSBKYXhSUENNYXBBcnRpZmFjdEVkaXQuY2xhc3M7Ci0JCi0KLQkvKioKLQkgKiBAcGFyYW0gYUhhbmRsZQotCSAqIEBwYXJhbSB0b0FjY2Vzc0FzUmVhZE9ubHkKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBKYXhSUENNYXBBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIoYVByb2plY3QsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQkKLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5BcnRpZmFjdEVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBKYXhSUENNYXBBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0TW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfQotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfWZvciBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cG9pbnRpbmcgdG8gYSBtb2R1bGUgZnJvbSB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgICAgIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Ci0JICovIAotCXByb3RlY3RlZCBKYXhSUENNYXBBcnRpZmFjdEVkaXQoTW9kdWxlQ29yZU5hdHVyZSBhTmF0dXJlLCBJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlLCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgewotCQlzdXBlcihhTmF0dXJlLCBhTW9kdWxlLCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFdzZGRSZXNvdXJjZSBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkpCi0JICogIAotCSAqLwotCi0JcHVibGljIEpheHJwY21hcFJlc291cmNlIGdldEpheFJQQ01hcFhtaVJlc291cmNlKFN0cmluZyBtYXBwaW5nRmlsZVBhdGhVUkkpIHsKLQkJCi0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShtYXBwaW5nRmlsZVBhdGhVUkkpOwotCQlSZXNvdXJjZVNldCByZXNTZXQgPSBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFJlc291cmNlU2V0KCk7Ci0JCVdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gKFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KSByZXNTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQodXJpLmxhc3RTZWdtZW50KCksIG5ldyBKYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkpOwotCi0JCUpheHJwY21hcFJlc291cmNlIGpheHJwY21hcFJlcyA9IChKYXhycGNtYXBSZXNvdXJjZSkgcmVzU2V0LmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCQkJCi0JCXJldHVybiBqYXhycGNtYXBSZXM7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyBKMkVFIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBFSkJSZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgSjJFRSBTcGVjIHZlcnNpb24KLQkgKiAgCi0JICovCi0KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uKFN0cmluZyBtYXBwaW5nRmlsZVBhdGhVUkkpIHsKLQkJcmV0dXJuIGdldEpheFJQQ01hcFhtaVJlc291cmNlKG1hcHBpbmdGaWxlUGF0aFVSSSkuZ2V0SjJFRVZlcnNpb25JRCgpOwotCX0KLQkKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgZnJvbSB0aGUgQXJ0aWZhY3RFZGl0TW9kZWwgdXNpbmcgZGVmaW5lZCBVUkkuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2UKLQkgKiAgCi0JICovCi0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZShTdHJpbmcgbWFwcGluZ0ZpbGVQYXRoVVJJKSB7Ci0JCXJldHVybiBnZXRKYXhSUENNYXBYbWlSZXNvdXJjZShtYXBwaW5nRmlsZVBhdGhVUkkpOwotCX0KLQkKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFdlYlNlcnZpY2VzIGZyb20gKEBsaW5rIGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpKQotCSAqICAKLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExNYXBwaW5nIGdldEphdmFXU0RMTWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXZhV1NETE1hcHBpbmcpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpOwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBPYnRhaW5zIHRoZSBXZWJTZXJ2aWNlcyAoQHNlZSBXZWJTZXJ2aWNlcykgcm9vdCBvYmplY3QgZnJvbSB0aGUgV3NkZFJlc291cmNlLiBJZiB0aGUgcm9vdCBvYmplY3QgZG9lcwotCSAqIG5vdCBleGlzdCwgdGhlbiBvbmUgaXMgY3JlYXRlZCAoQGxpbmsgYWRkRUpCSmFySWZOZWNlc3NhcnkoZ2V0RUpCSmFyWG1pUmVzb3VyY2UoKSkpLgotCSAqIFRoZSByb290IG9iamVjdCBjb250YWlucyBhbGwgb3RoZXIgcmVzb3VyY2UgZGVmaW5lZCBvYmplY3RzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIEVPYmplY3QKLQkgKiAgCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KFN0cmluZyBtYXBwaW5nRmlsZVBhdGhVUkkpIHsKLQkJTGlzdCBjb250ZW50cyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UobWFwcGluZ0ZpbGVQYXRoVVJJKS5nZXRDb250ZW50cygpOwotCQlpZiAoY29udGVudHMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCQlhZGRKYXZhV1NETE1hcHBpbmdJZk5lY2Vzc2FyeShnZXRKYXhSUENNYXBYbWlSZXNvdXJjZShtYXBwaW5nRmlsZVBhdGhVUkkpKTsKLQkJcmV0dXJuIChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYSBkZXBsb3ltZW50IGRlc2NyaXB0b3Igcm9vdCBvYmplY3QgKFdlYlNlcnZpY2VzKSBhbmQgcG9wdWxhdGVzIHdpdGggZGF0YS4gQWRkcyB0aGUgcm9vdAotCSAqIG9iamVjdCB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJlc291cmNlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCBwb2ludGluZyB0byBhIHtAc2VlIFhNTFJlc291cmNlfQotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIHR5cGljYWxseSB1c2VkIGZvciBKVU5JVCAtIG1vdmU/Ci0JICogPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFXU0RMTWFwcGluZ0lmTmVjZXNzYXJ5KEpheHJwY21hcFJlc291cmNlIGFSZXNvdXJjZSkgewotCQlpZiAoYVJlc291cmNlICE9IG51bGwpIHsKLQkJICAgIGlmKGFSZXNvdXJjZS5nZXRDb250ZW50cygpID09IG51bGwgfHwgYVJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJSmF2YVdTRExNYXBwaW5nIG1hcCA9IEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFXU0RMTWFwcGluZygpOwotCQkJCWFSZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChtYXApOwotCQkgICAgfQotCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRNb2R1bGVVUkkoKTsKLQkJCXRyeSB7Ci0JCQkJYVJlc291cmNlLnNhdmVJZk5lY2Vzc2FyeSgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbQotCSAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhlIGZvbGxvd2luZyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQgcmVzb2x2ZXMgdG8gYW4KLQkgKiAgICAgICAgICAgIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlIHVuZGVybHlpbmcgY29udGVudAotCSAqICAgICAgICAgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpheFJQQ01hcEFydGlmYWN0RWRpdCBnZXRKYXhSUENNYXBBcnRpZmFjdEVkaXRGb3JSZWFkKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCUpheFJQQ01hcEFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IEpheFJQQ01hcEFydGlmYWN0RWRpdChhUHJvamVjdCwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQKLQkgKiB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuCi0JICogICAgICAgICAgICBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZCBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpheFJQQ01hcEFydGlmYWN0RWRpdCBnZXRKYXhSUENNYXBBcnRpZmFjdEVkaXRGb3JXcml0ZShJUHJvamVjdCBhUHJvamVjdCkgewotCQlKYXhSUENNYXBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFydGlmYWN0RWRpdCA9IG5ldyBKYXhSUENNYXBBcnRpZmFjdEVkaXQoYVByb2plY3QsIGZhbHNlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlIGdpdmVuCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIFdTRERBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIFdTRERBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgbm90Ci0JICogYmUgdXNlZCBmb3IgZWRpdGluZy4gSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKLQkgKiB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD5Ob3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLjwvcD4KLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUKLQkgKiAgICAgICAgICAgIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZyBjb250ZW50Ci0JICogICAgICAgICBtb2RlbAotCSAqIEB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGNvdWxkIG5vdCByZXNvbHZlIHVyaS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpheFJQQ01hcEFydGlmYWN0RWRpdCBnZXRKYXhSUENNYXBBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBhTW9kdWxlLmdldFByb2plY3QoKTsKLQkJCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQkJcmV0dXJuIG5ldyBKYXhSUENNYXBBcnRpZmFjdEVkaXQobmF0dXJlLCBhTW9kdWxlLCB0cnVlKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZSBnaXZlbgotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBFSkJBcnRpZmFjdEVkaXQgdGhhdCBhcmUgcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZAotCSAqIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIFdTRERBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0Ci0JICogd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Tm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZC48L3A+Ci0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdCByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlCi0JICogICAgICAgICAgICBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIFdTRERBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kIHBlcnNpc3QgY2hhbmdlcyB0byB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0IGdldEpheFJQQ01hcEFydGlmYWN0RWRpdEZvcldyaXRlKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJCi0JCQkJSVByb2plY3QgcHJvamVjdCA9IGFNb2R1bGUuZ2V0UHJvamVjdCgpOwotCQkJCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQkJCXJldHVybiBuZXcgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0KG5hdHVyZSwgYU1vZHVsZSwgZmFsc2UpOwotCQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kIHRoZSBtb2R1bGVUeXBlSWQgaXMgYQotCSAqICAgICAgICAgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRUpCTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEge0BzZWUgSVZpcnR1YWxDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZCB0aGUgbW9kdWxlVHlwZUlkIGlzIGEKLQkgKiAgICAgICAgIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdlYk1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kIHRoZSBtb2R1bGVUeXBlSWQgaXMgYQotCSAqICAgICAgICAgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQXBwQ2xpZW50TW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuRW50ZXJwcmlzZUFydGlmYWN0RWRpdCNjcmVhdGVNb2RlbFJvb3QoKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdChTdHJpbmcgbWFwcGluZ0ZpbGVQYXRoVVJJKSB7Ci0JICAgIHJldHVybiBjcmVhdGVNb2RlbFJvb3QoZ2V0SjJFRVZlcnNpb24oKSxtYXBwaW5nRmlsZVBhdGhVUkkpOwotCX0KLQkJCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdChpbnQpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uLFN0cmluZyBtYXBwaW5nRmlsZVBhdGhVUkkpIHsKLQkgICAgSmF4cnBjbWFwUmVzb3VyY2UgcmVzID0gZ2V0SmF4UlBDTWFwWG1pUmVzb3VyY2UobWFwcGluZ0ZpbGVQYXRoVVJJKTsKLQkgICAgcmVzLnNldE1vZHVsZVZlcnNpb25JRCh2ZXJzaW9uKTsKLQkgICAgYWRkSmF2YVdTRExNYXBwaW5nSWZOZWNlc3NhcnkocmVzKTsKLQkJcmV0dXJuIGdldEphdmFXU0RMTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdCgpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIl9VSV9KYXhSUENNaXNzaW5nTW9kZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoaW50IHZlcnNpb24pIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIl9VSV9KYXhSUENNaXNzaW5nTW9kZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIl9VSV9KYXhSUENNaXNzaW5nTW9kZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uKCkgewotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiX1VJX0pheFJQQ01pc3NpbmdNb2RlbCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIFsxODI0MTddIFRoaXMgQXJ0aWZhY3RFZGl0IHdvcmtzIGZvciBhbGwgcHJvamVjdCB2ZXJzaW9ucywgc28ganVzdCByZXR1cm4gdHJ1ZS4KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZFByb2plY3RWZXJzaW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21wb25lbnRjb3JlL3V0aWwvV1NDRERBcnRpZmFjdEVkaXQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTQ0REQXJ0aWZhY3RFZGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzY2OWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21wb25lbnRjb3JlL3V0aWwvV1NDRERBcnRpZmFjdEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21wb25lbnRjb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkVudGVycHJpc2VBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi0vKioKLSAqIDxwPgotICogV1NEREFydGlmYWN0RWRpdCBvYnRhaW5zIGEgV1MgRGVwbG95bWVudCBEZXNjcmlwdG9yIG1ldGFtb2RlbCBzcGVjaWZlYyBkYXRhCi0gKiBmcm9tIGEge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlfSZuYnNwOyB3aGljaCBzdG9yZXMgdGhlCi0gKiBtZXRhbW9kZWwuIFRoZSB7QHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2V9Jm5ic3A7aXMgcmV0cmlldmVkCi0gKiBmcm9tIHRoZSB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQXJ0aWZhY3RFZGl0TW9kZWx9Jm5ic3A7dXNpbmcKLSAqIGEgY29uc3RhbnQge0BzZWUgSjJFRUNvbnN0YW50cyNFSkJKQVJfRERfVVJJX09CSn0uIFRoZSBkZWZpbmVkIG1ldGhvZHMKLSAqIGV4dHJhY3QgZGF0YSBvciBtYW5pcHVsYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdTQ0REQXJ0aWZhY3RFZGl0IGV4dGVuZHMgRW50ZXJwcmlzZUFydGlmYWN0RWRpdCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBJZGVudGlmaWVyIHVzZWQgdG8gbGluayBXU0REQXJ0aWZhY3RFZGl0IHRvIGEgV3NkZEFkYXB0ZXJGYWN0b3J5IHtAc2VlCi0JICogV3NkZEFkYXB0ZXJGYWN0b3J5fSBzdG9yZWQgaW4gYW4gQWRhcHRlck1hbmdlciAoQHNlZSBBZGFwdGVyTWFuYWdlcikKLQkgKiA8L3A+Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzIEFEQVBURVJfVFlQRSA9IFdTQ0REQXJ0aWZhY3RFZGl0LmNsYXNzOwotCi0JLyoqCi0JICogQHBhcmFtIGFIYW5kbGUKLQkgKiBAcGFyYW0gdG9BY2Nlc3NBc1JlYWRPbmx5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgV1NDRERBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIoYVByb2plY3QsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZmFjYWRlIGZvciB0aGUgZ2l2ZW4ge0BzZWUgQXJ0aWZhY3RFZGl0TW9kZWx9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYW5BcnRpZmFjdEVkaXRNb2RlbAotCSAqLwotCXB1YmxpYyBXU0NEREFydGlmYWN0RWRpdChBcnRpZmFjdEVkaXRNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfWZvciBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cG9pbnRpbmcgdG8gYSBtb2R1bGUgZnJvbQotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Ci0JICovCi0JcHVibGljIFdTQ0REQXJ0aWZhY3RFZGl0KE1vZHVsZUNvcmVOYXR1cmUgYU5hdHVyZSwgSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSwgYm9vbGVhbiB0b0FjY2Vzc0FzUmVhZE9ubHkpIHsKLQkJc3VwZXIoYU5hdHVyZSwgYU1vZHVsZSwgdG9BY2Nlc3NBc1JlYWRPbmx5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFdzZGRSZXNvdXJjZSBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkpCi0JICovCi0KLQlwdWJsaWMgV2ViU2VydmljZXNSZXNvdXJjZSBnZXRXc2NkZFhtaVJlc291cmNlKCkgewotCQlyZXR1cm4gKFdlYlNlcnZpY2VzUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgSjJFRSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gRUpCUmVzb3VyY2UuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhIEoyRUUgU3BlYyB2ZXJzaW9uCi0JICovCi0KLQlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uKCkgewotCQlyZXR1cm4gZ2V0V3NjZGRYbWlSZXNvdXJjZSgpLmdldEoyRUVWZXJzaW9uSUQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXRyaWV2ZXMgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgZnJvbSB0aGUgQXJ0aWZhY3RFZGl0TW9kZWwgdXNpbmcKLQkgKiBkZWZpbmVkIFVSSS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBSZXNvdXJjZQotCSAqLwotCi0JcHVibGljIFJlc291cmNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSB7Ci0JCWlmIChnZXRBcnRpZmFjdEVkaXRNb2RlbCgpIT1udWxsKQotCQkJcmV0dXJuIGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoZ2V0V2ViU2VydmljZXNDbGllbnRYbWxSZXNvdXJjZVVSSSgpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRXZWJTZXJ2aWNlc0NsaWVudFhtbFJlc291cmNlVVJJKCkgewotCQlVUkkgcmVzb3VyY2VVUkkgPSBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfV0VCX0lORl9ERF9VUklfT0JKOwotCQlpZiAoaXNWYWxpZEFwcENsaWVudE1vZHVsZShDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRQcm9qZWN0KCkpKSkKLQkJCXJlc291cmNlVVJJID0gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfQ0xJRU5UX01FVEFfSU5GX0REX1VSSV9PQko7Ci0JCWVsc2UgaWYgKGlzVmFsaWRFSkJNb2R1bGUoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKSkpCi0JCQlyZXNvdXJjZVVSSSA9IEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX0NMSUVOVF9NRVRBX0lORl9ERF9VUklfT0JKOwotCQlyZXR1cm4gcmVzb3VyY2VVUkk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBXZWJTZXJ2aWNlcyBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSkKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZXNDbGllbnQgZ2V0V2ViU2VydmljZXNDbGllbnQoKSB7Ci0JCXJldHVybiAoV2ViU2VydmljZXNDbGllbnQpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIE9idGFpbnMgdGhlIFdlYlNlcnZpY2VzIChAc2VlIFdlYlNlcnZpY2VzKSByb290IG9iamVjdCBmcm9tIHRoZQotCSAqIFdzZGRSZXNvdXJjZS4gSWYgdGhlIHJvb3Qgb2JqZWN0IGRvZXMgbm90IGV4aXN0LCB0aGVuIG9uZSBpcyBjcmVhdGVkCi0JICogKEBsaW5rIGFkZEVKQkphcklmTmVjZXNzYXJ5KGdldEVKQkphclhtaVJlc291cmNlKCkpKS4gVGhlIHJvb3Qgb2JqZWN0Ci0JICogY29udGFpbnMgYWxsIG90aGVyIHJlc291cmNlIGRlZmluZWQgb2JqZWN0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBFT2JqZWN0Ci0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkgewotCQlMaXN0IGNvbnRlbnRzID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldENvbnRlbnRzKCk7Ci0JCWlmIChjb250ZW50cy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JCWFkZFdlYlNlcnZpY2VzQ2xpZW50SWZOZWNlc3NhcnkoZ2V0V3NjZGRYbWlSZXNvdXJjZSgpKTsKLQkJcmV0dXJuIChFT2JqZWN0KSBjb250ZW50cy5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciByb290IG9iamVjdCAoV2ViU2VydmljZXMpIGFuZCBwb3B1bGF0ZXMKLQkgKiB3aXRoIGRhdGEuIEFkZHMgdGhlIHJvb3Qgb2JqZWN0IHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcmVzb3VyY2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIG5vbi1udWxsIHBvaW50aW5nIHRvIGEge0BzZWUgWE1MUmVzb3VyY2V9IE5vdGU6IFRoaXMgbWV0aG9kCi0JICogICAgICAgICAgICBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgSlVOSVQgLSBtb3ZlPwotCSAqICAgICAgICAgICAgPC9wPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdlYlNlcnZpY2VzQ2xpZW50SWZOZWNlc3NhcnkoV2ViU2VydmljZXNSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlpZiAoYVJlc291cmNlLmdldENvbnRlbnRzKCkgPT0gbnVsbCB8fCBhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlXZWJTZXJ2aWNlc0NsaWVudCB3c19jbGllbnQgPSBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0JCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHdzX2NsaWVudCk7Ci0JCQl9Ci0JCQlhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQlnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldE1vZHVsZVVSSSgpOwotCQkJdHJ5IHsKLQkJCQlhUmVzb3VyY2Uuc2F2ZUlmTmVjZXNzYXJ5KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKLQkgKiB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoZSBmb2xsb3dpbmcgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSB2YWxpZCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7d2l0aCBhIGhhbmRsZSB0aGF0Ci0JICogICAgICAgICAgICByZXNvbHZlcyB0byBhbiBhY2Nlc3NpYmxlIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZQotCSAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBXU0NEREFydGlmYWN0RWRpdCBnZXRXU0NEREFydGlmYWN0RWRpdEZvclJlYWQoSVByb2plY3QgYVByb2plY3QpIHsKLQkJV1NDRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFydGlmYWN0RWRpdCA9IG5ldyBXU0NEREFydGlmYWN0RWRpdChhUHJvamVjdCwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlCi0JICogZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZQotCSAqIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8KLQkgKiBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQgd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdAotCSAqICAgICAgICAgICAgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQKLQkgKiAgICAgICAgIHBlcnNpc3QgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBXU0NEREFydGlmYWN0RWRpdCBnZXRXU0NEREFydGlmYWN0RWRpdEZvcldyaXRlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdEVkaXQgPSBuZXcgV1NDRERBcnRpZmFjdEVkaXQoYVByb2plY3QsIGZhbHNlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJYXJ0aWZhY3RFZGl0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUKLQkgKiBnaXZlbiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgV1NEREFydGlmYWN0RWRpdCB0aGF0IGFyZQotCSAqIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8KLQkgKiBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBXU0REQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgbm90IGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogSW52b2NhdGlvbnMgb2YgYW55IHNhdmUqKCkgQVBJIG9uIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QKLQkgKiB3aWxsIHRocm93IGV4Y2VwdGlvbnMuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMKLQkgKiBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IG9ubHkgYmUgdXNlZCB0byByZWFkIHRoZQotCSAqICAgICAgICAgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICogQHRocm93cyBVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgY291bGQgbm90IHJlc29sdmUgdXJpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NDRERBcnRpZmFjdEVkaXQgZ2V0V1NDRERBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gYU1vZHVsZS5nZXRQcm9qZWN0KCk7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQlpZiAoYU1vZHVsZSAhPSBudWxsICYmIGlzVmFsaWRXU0NERE1vZHVsZShhTW9kdWxlKSkKLQkJCXJldHVybiBuZXcgV1NDRERBcnRpZmFjdEVkaXQobmF0dXJlLCBhTW9kdWxlLCB0cnVlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBFSkJBcnRpZmFjdEVkaXQgdGhhdCBhcmUKLQkgKiByZXR1cm5lZCB0aHJvdWdoIHRoaXMgbWV0aG9kIG11c3QgYmUge0BzZWUgI2Rpc3Bvc2UoKX1lZCBvZiB3aGVuIG5vCi0JICogbG9uZ2VyIGluIHVzZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogVXNlIHRvIGFjcXVpcmUgYW4gV1NEREFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIGJlIHVzZWQgZm9yIGVkaXRpbmcuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIDxiPlRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbC4gPC9iPgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMKLQkgKiBtZXRob2QuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBhTW9kdWxlCi0JICogICAgICAgICAgICBBIHZhbGlkIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt3aXRoIGEgaGFuZGxlIHRoYXQKLQkgKiAgICAgICAgICAgIHJlc29sdmVzIHRvIGFuIGFjY2Vzc2libGUgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IGFuZAotCSAqICAgICAgICAgcGVyc2lzdCBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdTQ0REQXJ0aWZhY3RFZGl0IGdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gYU1vZHVsZS5nZXRQcm9qZWN0KCk7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQlpZiAoYU1vZHVsZSAhPSBudWxsICYmIGlzVmFsaWRXU0NERE1vZHVsZShhTW9kdWxlKSkKLQkJCXJldHVybiBuZXcgV1NDRERBcnRpZmFjdEVkaXQobmF0dXJlLCBhTW9kdWxlLCBmYWxzZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEge0BzZWUgSVZpcnR1YWxDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkRWRpdGFibGVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZAotCSAqICAgICAgICAgdGhlIG1vZHVsZVR5cGVJZCBpcyBhIEpTVCBtb2R1bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEVKQk1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXJldHVybiBhQ29tcG9uZW50ICE9bnVsbCAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QoYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb21wb25lbnQKLQkgKiAgICAgICAgICAgIEEge0BzZWUgSVZpcnR1YWxDb21wb25lbnR9Ci0JICogQHJldHVybiBUcnVlIGlmIHRoZSBzdXBwbGllZCBtb2R1bGUKLQkgKiAgICAgICAgIHtAc2VlIEFydGlmYWN0RWRpdCNpc1ZhbGlkV1NERE1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kIHRoZQotCSAqICAgICAgICAgbW9kdWxlVHlwZUlkIGlzIGEgSlNUIG1vZHVsZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkV1NDRERNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gKGlzVmFsaWRBcHBDbGllbnRNb2R1bGUoYUNvbXBvbmVudCkgfHwgaXNWYWxpZFdlYk1vZHVsZShhQ29tcG9uZW50KSB8fCBpc1ZhbGlkRUpCTW9kdWxlKGFDb21wb25lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQKLQkgKiAgICAgICAgIHRoZSBtb2R1bGVUeXBlSWQgaXMgYSBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXZWJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gYUNvbXBvbmVudCAhPW51bGwgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kCi0JICogICAgICAgICB0aGUgbW9kdWxlVHlwZUlkIGlzIGEgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQXBwQ2xpZW50TW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIGFDb21wb25lbnQgIT1udWxsICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdCgpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkgewotCQlyZXR1cm4gY3JlYXRlTW9kZWxSb290KGdldEoyRUVWZXJzaW9uKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkVudGVycHJpc2VBcnRpZmFjdEVkaXQjY3JlYXRlTW9kZWxSb290KGludCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoaW50IHZlcnNpb24pIHsKLQkJV2ViU2VydmljZXNSZXNvdXJjZSByZXMgPSBnZXRXc2NkZFhtaVJlc291cmNlKCk7Ci0JCXJlcy5zZXRNb2R1bGVWZXJzaW9uSUQodmVyc2lvbik7Ci0JCWFkZFdlYlNlcnZpY2VzQ2xpZW50SWZOZWNlc3NhcnkocmVzKTsKLQkJcmV0dXJuIGdldFdlYlNlcnZpY2VzQ2xpZW50KCk7Ci0JfQotCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKElNb2RlbFByb3ZpZGVyKWdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlyZXR1cm4gKElNb2RlbFByb3ZpZGVyKWdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCX0KLQlwdWJsaWMgdm9pZCBtb2RpZnkoUnVubmFibGUgcnVubmFibGUsIElQYXRoIG1vZGVsUGF0aCkgewotCQlzZXRXcml0YWJsZUVkaXQoZ2V0V1NDRERBcnRpZmFjdEVkaXRGb3JXcml0ZShnZXRQcm9qZWN0KCkpKTsKLQkJdHJ5ewotCQkJcnVubmFibGUucnVuKCk7Ci0JCQlpZiggZ2V0V3JpdGFibGVFZGl0KCkgIT0gbnVsbCApewotCQkJCS8vIEFsd2F5cyBzYXZlIHJlZ2FyZGxlc3Mgb2YgcmVzb3VyY2UgcGF0aCBwYXNzZWQgLSBBcnRpZmFjdGVkaXRzIHNhdmUgcmVzb3VyY2VzIGFzIGEgdW5pdAotCQkJCWdldFdyaXRhYmxlRWRpdCgpLnNhdmVJZk5lY2Vzc2FyeSggbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSApOwotCQkJfQotCQkJCi0JCX0gZmluYWxseSB7IC8vUHJvcGVybHkgZGlzcG9zZSB0aGUgd3JpdGUgYXJ0aWZhY3QgZWRpdAotCQkJZ2V0V3JpdGFibGVFZGl0KCkuZGlzcG9zZSgpOwotCQkJc2V0V3JpdGFibGVFZGl0KG51bGwpOwotCQl9Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkUHJvamVjdFZlcnNpb24oSVByb2plY3QgcHJvamVjdDIpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21wb25lbnRjb3JlL3V0aWwvV1NEREFydGlmYWN0RWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb21wb25lbnRjb3JlL3V0aWwvV1NEREFydGlmYWN0RWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmM1ZDViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29tcG9uZW50Y29yZS91dGlsL1dTRERBcnRpZmFjdEVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21wb25lbnRjb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlRXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLlVucmVzb2x2ZWFibGVVUklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi0vKioKLSAqIDxwPgotICogV1NEREFydGlmYWN0RWRpdCBvYnRhaW5zIGEgV1MgRGVwbG95bWVudCBEZXNjcmlwdG9yIG1ldGFtb2RlbCBzcGVjaWZlYyBkYXRhCi0gKiBmcm9tIGEge0BzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlfSZuYnNwOyB3aGljaCBzdG9yZXMgdGhlCi0gKiBtZXRhbW9kZWwuIFRoZSB7QHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2V9Jm5ic3A7aXMgcmV0cmlldmVkCi0gKiBmcm9tIHRoZSB7QHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuQXJ0aWZhY3RFZGl0TW9kZWx9Jm5ic3A7dXNpbmcKLSAqIGEgY29uc3RhbnQge0BzZWUgSjJFRUNvbnN0YW50cyNFSkJKQVJfRERfVVJJX09CSn0uIFRoZSBkZWZpbmVkIG1ldGhvZHMKLSAqIGV4dHJhY3QgZGF0YSBvciBtYW5pcHVsYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgdW5kZXJseWluZyByZXNvdXJjZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFdTRERBcnRpZmFjdEVkaXQgZXh0ZW5kcyBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IHsKLQotCS8qKgotCSAqIDxwPgotCSAqIElkZW50aWZpZXIgdXNlZCB0byBsaW5rIFdTRERBcnRpZmFjdEVkaXQgdG8gYSBXc2RkQWRhcHRlckZhY3Rvcnkge0BzZWUKLQkgKiBXc2RkQWRhcHRlckZhY3Rvcnl9IHN0b3JlZCBpbiBhbiBBZGFwdGVyTWFuZ2VyIChAc2VlIEFkYXB0ZXJNYW5hZ2VyKQotCSAqIDwvcD4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3MgQURBUFRFUl9UWVBFID0gV1NEREFydGlmYWN0RWRpdC5jbGFzczsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTSUxfRklMRV9FWFQgPSAid3NpbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRklMRV9FWFQgPSAid3NkbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBwYXJhbSBhSGFuZGxlCi0JICogQHBhcmFtIHRvQWNjZXNzQXNSZWFkT25seQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICovCi0JcHVibGljIFdTRERBcnRpZmFjdEVkaXQoSVByb2plY3QgYVByb2plY3QsIGJvb2xlYW4gdG9BY2Nlc3NBc1JlYWRPbmx5KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIoYVByb2plY3QsIHRvQWNjZXNzQXNSZWFkT25seSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZhY2FkZSBmb3IgdGhlIGdpdmVuIHtAc2VlIEFydGlmYWN0RWRpdE1vZGVsfS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFuQXJ0aWZhY3RFZGl0TW9kZWwKLQkgKi8KLQlwdWJsaWMgV1NEREFydGlmYWN0RWRpdChBcnRpZmFjdEVkaXRNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmYWNhZGUgZm9yIHRoZSBnaXZlbiB7QHNlZSBBcnRpZmFjdEVkaXRNb2RlbH0KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gYU5hdHVyZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBNb2R1bGVDb3JlTmF0dXJlfWZvciBhbiBhY2Nlc3NpYmxlIHByb2plY3QKLQkgKiBAcGFyYW0gYU1vZHVsZQotCSAqICAgICAgICAgICAgQSBub24tbnVsbCB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9cG9pbnRpbmcgdG8gYSBtb2R1bGUgZnJvbQotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHtAc2VlIE1vZHVsZUNvcmVOYXR1cmV9Ci0JICovCi0JcHVibGljIFdTRERBcnRpZmFjdEVkaXQoTW9kdWxlQ29yZU5hdHVyZSBhTmF0dXJlLCBJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlLCBib29sZWFuIHRvQWNjZXNzQXNSZWFkT25seSkgewotCQlzdXBlcihhTmF0dXJlLCBhTW9kdWxlLCB0b0FjY2Vzc0FzUmVhZE9ubHkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gV3NkZFJlc291cmNlIGZyb20gKEBsaW5rIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSkKLQkgKi8KLQotCXB1YmxpYyBXc2RkUmVzb3VyY2UgZ2V0V3NkZFhtaVJlc291cmNlKCkgewotCQlyZXR1cm4gKFdzZGRSZXNvdXJjZSkgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHJpZXZlcyBKMkVFIHZlcnNpb24gaW5mb3JtYXRpb24gZnJvbSBFSkJSZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGEgSjJFRSBTcGVjIHZlcnNpb24KLQkgKi8KLQotCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb24oKSB7Ci0JCXJldHVybiBnZXRXc2RkWG1pUmVzb3VyY2UoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0cmlldmVzIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIGZyb20gdGhlIEFydGlmYWN0RWRpdE1vZGVsIHVzaW5nCi0JICogZGVmaW5lZCBVUkkuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gUmVzb3VyY2UKLQkgKi8KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgewotCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZShnZXRXZWJTZXJ2aWNlc1htbFJlc291cmNlVVJJKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlRGVwbG95bWVudERlc2NyaXB0b3IoSVByb2plY3QgcHJvamVjdCwgaW50IHZlcnNpb24pIHsKLQkJRW50ZXJwcmlzZUFydGlmYWN0RWRpdCB3c0RERWRpdCA9IG5ldyBXU0REQXJ0aWZhY3RFZGl0KHByb2plY3QsIGZhbHNlKTsKLQkJdHJ5IHsKLQkJCXdzRERFZGl0LmNyZWF0ZU1vZGVsUm9vdCh2ZXJzaW9uKTsKLQkJCXdzRERFZGl0LnNhdmUobnVsbCk7Ci0JCX0gZmluYWxseSB7ICAvLyBNYWtlIHN1cmUgbmV3IHJlc291cmNlIGlzIHJlbW92ZWQgIC0gdGhlIHVyaSB1c2VkIGZvciBjcmVhdGlvbiBzaG91bGRuJ3QgYmUgY2FjaGVkCi0JCQlSZXNvdXJjZSBuZXdSZXMgPSB3c0RERWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCQlXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQocHJvamVjdCkuZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKG5ld1Jlcyk7Ci0JCQluZXdSZXMudW5sb2FkKCk7Ci0JCQl3c0RERWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVVJJIGdldFdlYlNlcnZpY2VzWG1sUmVzb3VyY2VVUkkoKSB7Ci0KLQkJVVJJIHJlc291cmNlVVJJID0gSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfV0VCX0lORl9ERF9VUklfT0JKOwotCQlpZiAoaXNWYWxpZEFwcENsaWVudE1vZHVsZShnZXRDb21wb25lbnQoKSkpCi0JCQlyZXNvdXJjZVVSSSA9IEoyRUVDb25zdGFudHMuV0VCX1NFUlZJQ0VTX01FVEFfSU5GX0REX1VSSV9PQko7Ci0JCWVsc2UgaWYgKGlzVmFsaWRFSkJNb2R1bGUoZ2V0Q29tcG9uZW50KCkpKQotCQkJcmVzb3VyY2VVUkkgPSBKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19NRVRBX0lORl9ERF9VUklfT0JKOwotCQlyZXR1cm4gcmVzb3VyY2VVUkk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBXZWJTZXJ2aWNlcyBmcm9tIChAbGluayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSkKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZXMgZ2V0V2ViU2VydmljZXMoKSB7Ci0JCWlmICghZ2V0UHJvamVjdCgpLmlzQWNjZXNzaWJsZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChnZXRXc2RkWG1pUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFdlYlNlcnZpY2VzKSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBPYnRhaW5zIHRoZSBXZWJTZXJ2aWNlcyAoQHNlZSBXZWJTZXJ2aWNlcykgcm9vdCBvYmplY3QgZnJvbSB0aGUKLQkgKiBXc2RkUmVzb3VyY2UuIElmIHRoZSByb290IG9iamVjdCBkb2VzIG5vdCBleGlzdCwgdGhlbiBvbmUgaXMgY3JlYXRlZAotCSAqIChAbGluayBhZGRFSkJKYXJJZk5lY2Vzc2FyeShnZXRFSkJKYXJYbWlSZXNvdXJjZSgpKSkuIFRoZSByb290IG9iamVjdAotCSAqIGNvbnRhaW5zIGFsbCBvdGhlciByZXNvdXJjZSBkZWZpbmVkIG9iamVjdHMuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gRU9iamVjdAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpIHsKLQkJTGlzdCBjb250ZW50cyA9IGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRDb250ZW50cygpOwotCQlpZiAoY29udGVudHMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoRU9iamVjdCkgY29udGVudHMuZ2V0KDApOwotCQlhZGRXZWJTZXJ2aWNlc0lmTmVjZXNzYXJ5KGdldFdzZGRYbWlSZXNvdXJjZSgpKTsKLQkJaWYgKGNvbnRlbnRzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEVPYmplY3QpIGNvbnRlbnRzLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBDcmVhdGVzIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yIHJvb3Qgb2JqZWN0IChXZWJTZXJ2aWNlcykgYW5kIHBvcHVsYXRlcwotCSAqIHdpdGggZGF0YS4gQWRkcyB0aGUgcm9vdCBvYmplY3QgdG8gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciByZXNvdXJjZS4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgbm9uLW51bGwgcG9pbnRpbmcgdG8gYSB7QHNlZSBYTUxSZXNvdXJjZX0gTm90ZTogVGhpcyBtZXRob2QKLQkgKiAgICAgICAgICAgIGlzIHR5cGljYWxseSB1c2VkIGZvciBKVU5JVCAtIG1vdmU/Ci0JICogICAgICAgICAgICA8L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV2ViU2VydmljZXNJZk5lY2Vzc2FyeShXc2RkUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJaWYgKGFSZXNvdXJjZS5nZXRDb250ZW50cygpID09IG51bGwgfHwgYVJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJV2ViU2VydmljZXMgd3MgPSBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2ViU2VydmljZXMoKTsKLQkJCQlhUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQod3MpOwotCQkJfQotCQkJYVJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRNb2R1bGVVUkkoKTsKLQkJCXRyeSB7Ci0JCQkJYVJlc291cmNlLnNhdmVJZk5lY2Vzc2FyeSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIFJldHVybnMgYW4gaW5zdGFuY2UgZmFjYWRlIHRvIG1hbmFnZSB0aGUgdW5kZXJseWluZyBlZGl0IG1vZGVsIGZvciB0aGUKLQkgKiBnaXZlbiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9LiBJbnN0YW5jZXMgb2YgQXJ0aWZhY3RFZGl0IHRoYXQgYXJlCi0JICogcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZCBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubwotCSAqIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIEFydGlmYWN0RWRpdCBmYWNhZGUgZm9yIGEgc3BlY2lmaWMKLQkgKiB7QHNlZSBXb3JrYmVuY2hDb21wb25lbnR9Jm5ic3A7dGhhdCB3aWxsIG5vdCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIEludm9jYXRpb25zIG9mIGFueSBzYXZlKigpIEFQSSBvbiBhbiBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kCi0JICogd2lsbCB0aHJvdyBleGNlcHRpb25zLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdAotCSAqICAgICAgICAgICAgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBvbmx5IGJlIHVzZWQgdG8gcmVhZCB0aGUKLQkgKiAgICAgICAgIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NEREFydGlmYWN0RWRpdCBnZXRXU0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChJUHJvamVjdCBhUHJvamVjdCkgewotCQlXU0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChhUHJvamVjdCk7Ci0JCWlmIChjb21wICE9IG51bGwgJiYgaXNWYWxpZFdTRERNb2R1bGUoY29tcCkpIHsKLQkJCXRyeSB7Ci0JCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IFdTRERBcnRpZmFjdEVkaXQoYVByb2plY3QsIHRydWUpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJCWFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFydGlmYWN0RWRpdDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlCi0JICogZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEFydGlmYWN0RWRpdCB0aGF0IGFyZQotCSAqIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8KLQkgKiBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQgd2lsbCBiZSB1c2VkIGZvciBlZGl0aW5nLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiA8Yj5UaGUgZm9sbG93aW5nIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuIDwvYj4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdAotCSAqICAgICAgICAgICAgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIEFydGlmYWN0RWRpdCB0aGF0IG1heSBiZSB1c2VkIHRvIG1vZGlmeSBhbmQKLQkgKiAgICAgICAgIHBlcnNpc3QgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBjb250ZW50IG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBXU0REQXJ0aWZhY3RFZGl0IGdldFdTRERBcnRpZmFjdEVkaXRGb3JXcml0ZShJUHJvamVjdCBhUHJvamVjdCkgewotCQlXU0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChhUHJvamVjdCk7Ci0JCWlmIChjb21wICE9IG51bGwgJiYgaXNWYWxpZFdTRERNb2R1bGUoY29tcCkpIHsKLQkJCXRyeSB7Ci0JCQkJYXJ0aWZhY3RFZGl0ID0gbmV3IFdTRERBcnRpZmFjdEVkaXQoYVByb2plY3QsIGZhbHNlKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKLQkJCQlhcnRpZmFjdEVkaXQgPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBhcnRpZmFjdEVkaXQ7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogUmV0dXJucyBhbiBpbnN0YW5jZSBmYWNhZGUgdG8gbWFuYWdlIHRoZSB1bmRlcmx5aW5nIGVkaXQgbW9kZWwgZm9yIHRoZQotCSAqIGdpdmVuIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0uIEluc3RhbmNlcyBvZiBXU0REQXJ0aWZhY3RFZGl0IHRoYXQgYXJlCi0JICogcmV0dXJuZWQgdGhyb3VnaCB0aGlzIG1ldGhvZCBtdXN0IGJlIHtAc2VlICNkaXNwb3NlKCl9ZWQgb2Ygd2hlbiBubwotCSAqIGxvbmdlciBpbiB1c2UuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIFVzZSB0byBhY3F1aXJlIGFuIFdTRERBcnRpZmFjdEVkaXQgZmFjYWRlIGZvciBhIHNwZWNpZmljCi0JICoge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3RoYXQgd2lsbCBub3QgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiBJbnZvY2F0aW9ucyBvZiBhbnkgc2F2ZSooKSBBUEkgb24gYW4gaW5zdGFuY2UgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZAotCSAqIHdpbGwgdGhyb3cgZXhjZXB0aW9ucy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcwotCSAqIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdAotCSAqICAgICAgICAgICAgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIFdTRERBcnRpZmFjdEVkaXQgdGhhdCBtYXkgb25seSBiZSB1c2VkIHRvIHJlYWQgdGhlCi0JICogICAgICAgICB1bmRlcmx5aW5nIGNvbnRlbnQgbW9kZWwKLQkgKiBAdGhyb3dzIFVucmVzb2x2ZWFibGVVUklFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBjb3VsZCBub3QgcmVzb2x2ZSB1cmkuCi0JICovCi0JcHVibGljIHN0YXRpYyBXU0REQXJ0aWZhY3RFZGl0IGdldFdTRERBcnRpZmFjdEVkaXRGb3JSZWFkKElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGFNb2R1bGUuZ2V0UHJvamVjdCgpOwotCQlNb2R1bGVDb3JlTmF0dXJlIG5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KTsKLQkJaWYgKGFNb2R1bGUgIT0gbnVsbCAmJiBpc1ZhbGlkV1NERE1vZHVsZShhTW9kdWxlKSkKLQkJCXJldHVybiBuZXcgV1NEREFydGlmYWN0RWRpdChuYXR1cmUsIGFNb2R1bGUsIHRydWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIGZhY2FkZSB0byBtYW5hZ2UgdGhlIHVuZGVybHlpbmcgZWRpdCBtb2RlbCBmb3IgdGhlCi0JICogZ2l2ZW4ge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fS4gSW5zdGFuY2VzIG9mIEVKQkFydGlmYWN0RWRpdCB0aGF0IGFyZQotCSAqIHJldHVybmVkIHRocm91Z2ggdGhpcyBtZXRob2QgbXVzdCBiZSB7QHNlZSAjZGlzcG9zZSgpfWVkIG9mIHdoZW4gbm8KLQkgKiBsb25nZXIgaW4gdXNlLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBVc2UgdG8gYWNxdWlyZSBhbiBXU0REQXJ0aWZhY3RFZGl0IGZhY2FkZSBmb3IgYSBzcGVjaWZpYwotCSAqIHtAc2VlIFdvcmtiZW5jaENvbXBvbmVudH0mbmJzcDt0aGF0IHdpbGwgYmUgdXNlZCBmb3IgZWRpdGluZy4KLQkgKiA8L3A+Ci0JICogPHA+Ci0JICogPGI+VGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsLiA8L2I+Ci0JICogPC9wPgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcwotCSAqIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGFNb2R1bGUKLQkgKiAgICAgICAgICAgIEEgdmFsaWQge0BzZWUgV29ya2JlbmNoQ29tcG9uZW50fSZuYnNwO3dpdGggYSBoYW5kbGUgdGhhdAotCSAqICAgICAgICAgICAgcmVzb2x2ZXMgdG8gYW4gYWNjZXNzaWJsZSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UKLQkgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIFdTRERBcnRpZmFjdEVkaXQgdGhhdCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgYW5kCi0JICogICAgICAgICBwZXJzaXN0IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgY29udGVudCBtb2RlbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV1NEREFydGlmYWN0RWRpdCBnZXRXU0REQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoSVZpcnR1YWxDb21wb25lbnQgYU1vZHVsZSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gYU1vZHVsZS5nZXRQcm9qZWN0KCk7Ci0JCU1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlID0gTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpOwotCQlpZiAoYU1vZHVsZSAhPSBudWxsICYmIGlzVmFsaWRXU0RETW9kdWxlKGFNb2R1bGUpKQotCQkJcmV0dXJuIG5ldyBXU0REQXJ0aWZhY3RFZGl0KG5hdHVyZSwgYU1vZHVsZSwgZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQKLQkgKiAgICAgICAgIHRoZSBtb2R1bGVUeXBlSWQgaXMgYSBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRFSkJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZFdTRERNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQpfWFuZCB0aGUKLQkgKiAgICAgICAgIG1vZHVsZVR5cGVJZCBpcyBhIEpTVCBtb2R1bGUKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdTRERNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gKGlzVmFsaWRBcHBDbGllbnRNb2R1bGUoYUNvbXBvbmVudCkgfHwgaXNWYWxpZFdlYk1vZHVsZShhQ29tcG9uZW50KSB8fCBpc1ZhbGlkRUpCTW9kdWxlKGFDb21wb25lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICogICAgICAgICAgICBBIHtAc2VlIElWaXJ0dWFsQ29tcG9uZW50fQotCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgbW9kdWxlCi0JICogICAgICAgICB7QHNlZSBBcnRpZmFjdEVkaXQjaXNWYWxpZEVkaXRhYmxlTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50KX1hbmQKLQkgKiAgICAgICAgIHRoZSBtb2R1bGVUeXBlSWQgaXMgYSBKU1QgbW9kdWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRXZWJNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChhQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbXBvbmVudAotCSAqICAgICAgICAgICAgQSB7QHNlZSBJVmlydHVhbENvbXBvbmVudH0KLQkgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHN1cHBsaWVkIG1vZHVsZQotCSAqICAgICAgICAge0BzZWUgQXJ0aWZhY3RFZGl0I2lzVmFsaWRFZGl0YWJsZU1vZHVsZShJVmlydHVhbENvbXBvbmVudCl9YW5kCi0JICogICAgICAgICB0aGUgbW9kdWxlVHlwZUlkIGlzIGEgSlNUIG1vZHVsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQXBwQ2xpZW50TW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdCgpCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkgewotCQlyZXR1cm4gY3JlYXRlTW9kZWxSb290KGdldEoyRUVWZXJzaW9uKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkVudGVycHJpc2VBcnRpZmFjdEVkaXQjY3JlYXRlTW9kZWxSb290KGludCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoaW50IHZlcnNpb24pIHsKLQkJV3NkZFJlc291cmNlIHJlcyA9IChXc2RkUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJcmVzLnNldE1vZHVsZVZlcnNpb25JRCh2ZXJzaW9uKTsKLQkJYWRkV2ViU2VydmljZXNJZk5lY2Vzc2FyeShyZXMpOwotCQlyZXR1cm4gZ2V0V2ViU2VydmljZXMoKTsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRDb250ZW50TW9kZWxSb290KCkgewotCQlyZXR1cm4gZ2V0V2ViU2VydmljZXMoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXU0lMUmVzb3VyY2VzKCkgewotCQlmaW5hbCBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQotCQl0cnkgewotCQkJZ2V0UHJvamVjdCgpLmFjY2VwdChuZXcgSVJlc291cmNlUHJveHlWaXNpdG9yKCkgewotCQkJCQotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWlmKHByb3h5LmdldE5hbWUoKS5lbmRzV2l0aChXU0lMX0ZJTEVfRVhUKSkgewotCQkJCQkJSVJlc291cmNlIGZpbGUgPSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJCUlWaXJ0dWFsUmVzb3VyY2VbXSB2UmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZmlsZSk7Ci0JCQkJCQlpZiAodlJlc291cmNlcy5sZW5ndGggPiAwICYmICFyZXN1bHQuY29udGFpbnMoZmlsZSkpCi0JCQkJCQkJcmVzdWx0LmFkZChmaWxlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQl9LCBJUmVzb3VyY2UuTk9ORSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJV2ViU2VydmljZVBsdWdpbi5sb2dFcnJvcigwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0gCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0V1NETFJlc291cmNlcygpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlcyhXU0RMX0ZJTEVfRVhUKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0UmVzb3VyY2VzKFN0cmluZyBleHQpIHsKLQkJTGlzdCByZXNvdXJjZXMgPSBnZXRBcnRpZmFjdEVkaXRNb2RlbCgpLmdldFJlc291cmNlcygpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCWlmIChyZXMgIT0gbnVsbCAmJiByZXMuZ2V0VVJJKCkuZmlsZUV4dGVuc2lvbigpICE9IG51bGwgJiYgcmVzLmdldFVSSSgpLmZpbGVFeHRlbnNpb24oKS5lcXVhbHMoZXh0KSkKLQkJCQlyZXN1bHQuYWRkKHJlcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIFdTRExSZXNvdXJjZSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSByZXR1cm4gbnVsbAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBnZXRXc2RsUmVzb3VyY2UoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmVxdWFscygiIikpcmV0dXJuIG51bGw7IC8vJE5PTi1OTFMtMSQKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlcyA9IGdldEFydGlmYWN0RWRpdE1vZGVsKCkuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShwYXRoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUKLQkJfQotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5pc0xvYWRlZCgpICYmIHNlcnZpY2VIZWxwZXIgIT0gbnVsbCAmJiBzZXJ2aWNlSGVscGVyLmlzV1NETFJlc291cmNlKHJlcykpCi0JCQlyZXR1cm4gcmVzOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiAoSU1vZGVsUHJvdmlkZXIpZ2V0V1NEREFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0JfQotCi0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIChJTW9kZWxQcm92aWRlcilnZXRXU0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCX0KLQotCS8vIFsxODI0MTddIFRoaXMgQXJ0aWZhY3RFZGl0IHdvcmtzIGZvciBhbGwgcHJvamVjdCB2ZXJzaW9ucywgc28ganVzdCByZXR1cm4gdHJ1ZS4KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZFByb2plY3RWZXJzaW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyB2b2lkIG1vZGlmeShSdW5uYWJsZSBydW5uYWJsZSwgSVBhdGggbW9kZWxQYXRoKSB7Ci0JCXNldFdyaXRhYmxlRWRpdChnZXRXU0REQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKSk7Ci0JCXRyeXsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJaWYoIGdldFdyaXRhYmxlRWRpdCgpICE9IG51bGwgKXsKLQkJCQkvLyBBbHdheXMgc2F2ZSByZWdhcmRsZXNzIG9mIHJlc291cmNlIHBhdGggcGFzc2VkIC0gQXJ0aWZhY3RlZGl0cyBzYXZlIHJlc291cmNlcyBhcyBhIHVuaXQKLQkJCQlnZXRXcml0YWJsZUVkaXQoKS5zYXZlSWZOZWNlc3NhcnkoIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgKTsKLQkJCX0KLQkJCQotCQl9IGZpbmFsbHkgeyAvL1Byb3Blcmx5IGRpc3Bvc2UgdGhlIHdyaXRlIGFydGlmYWN0IGVkaXQKLQkJCWdldFdyaXRhYmxlRWRpdCgpLmRpc3Bvc2UoKTsKLQkJCXNldFdyaXRhYmxlRWRpdChudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29uc3RhbnRzL0FUS1VJQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbnN0YW50cy9BVEtVSUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTAxNTc4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvY29uc3RhbnRzL0FUS1VJQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmludGVybmFsLnV0aWwuUU5hbWVIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJQ29uc3RhbnRzIHsKLQkvLyBpbml0LXBhcmFtCi0JcHVibGljIFN0cmluZyBkZWZhdWx0SW5pdFBhcmFtTmFtZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVEFCTEVfTkFNRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdEluaXRQYXJhbVZhbHVlKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9UQUJMRV9WQUxVRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9UQUJMRV9ERVNDUklQVElPTiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIFFOYW1lCi0JcHJpdmF0ZSBTdHJpbmcgREVGQVVMVF9QUkVGSVggPSAicGZ4IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIERFRkFVTFRfTkFNRVNQQUNFVVJJID0gIk5hbWVzcGFjZVVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBERUZBVUxUX0xPQ0FMUEFSVCA9ICJMb2NhbFBhcnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRQcmVmaXgoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKERFRkFVTFRfUFJFRklYKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHROYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKERFRkFVTFRfTkFNRVNQQUNFVVJJKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRMb2NhbFBhcnQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKERFRkFVTFRfTE9DQUxQQVJUKTsKLQl9Ci0KLQkvLyBzb2FwIHJvbGUKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTT0FQUm9sZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVEFCTEVfU09BUF9ST0xFIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gcG9ydCBuYW1lCi0JcHVibGljIFN0cmluZyBkZWZhdWx0UG9ydE5hbWUoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJUxBQkVMX1RBQkxFX1BPUlRfTkFNRSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vcG9ydCBjb21wb25lbnQKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKCJqYXZhLnJtaS5SZW1vdGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gcG9ydCBjb21wb25lbnQgcmVmCi0JcHVibGljIEphdmFDbGFzcyBkZWZhdWx0Q2xpZW50U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLnJtaS5SZW1vdGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFBvcnRDb21wb25lbnRMaW5rKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVMQUJFTF9UQUJMRV9QT1JUX0NPTVBPTkVOVF9MSU5LIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gc2VydmljZS1yZWYKLQlwdWJsaWMgU2VydmljZVJlZiBkZWZhdWx0U2VydmljZVJlZigpIHsKLQkJU2VydmljZVJlZiBzZXJ2aWNlUmVmID0gV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlUmVmKCk7Ci0JCXNlcnZpY2VSZWYuc2V0U2VydmljZVJlZk5hbWUoZGVmYXVsdFNlcnZpY2VSZWZOYW1lKCkpOwotCQlzZXJ2aWNlUmVmLnNldFNlcnZpY2VJbnRlcmZhY2UoZGVmYXVsdFNlcnZpY2VJbnRlcmZhY2UoKSk7Ci0JCXJldHVybiBzZXJ2aWNlUmVmOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFNlcnZpY2VSZWZOYW1lKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJzZXJ2aWNlLyIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVfVUlfU2VydmljZVJlZl90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBKYXZhQ2xhc3MgZGVmYXVsdFNlcnZpY2VJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmF4LnhtbC5ycGMuU2VydmljZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gcG9ydCBjb21wb25lbnQgbmFtZQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFBvcnRDb21wb25lbnROYW1lKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyhXZWJTZXJ2aWNlUGx1Z2luLmdldE1lc3NhZ2UoIiVfVUlfUG9ydENvbXBvbmVudF90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gc2VydmljZSBpbXBsIGJlYW4KLQlwdWJsaWMgU2VydmljZUltcGxCZWFuIGRlZmF1bHRTZXJ2aWNlSW1wbEJlYW4oKSB7Ci0JCVNlcnZpY2VJbXBsQmVhbiBzZXJ2aWNlSW1wbEJlYW4gPSBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUltcGxCZWFuKCk7Ci0JCXNlcnZpY2VJbXBsQmVhbi5zZXRFU2VydmxldExpbmsoZGVmYXVsdFNlcnZsZXRMaW5rKCkpOwotCQlyZXR1cm4gc2VydmljZUltcGxCZWFuOwotCX0KLQotCS8vIHNlcnZsZXQgbGluawotCXB1YmxpYyBTZXJ2bGV0TGluayBkZWZhdWx0U2VydmxldExpbmsoKSB7Ci0JCVNlcnZsZXRMaW5rIHNlcnZsZXRMaW5rID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZsZXRMaW5rKCk7Ci0JCXNlcnZsZXRMaW5rLnNldFNlcnZsZXRMaW5rKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJUxBQkVMX1NFUlZMRVRfTElOSyIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc2VydmxldExpbms7Ci0JfQotCi0JLy8gV1NETCBwb3J0Ci0JcHVibGljIFdTRExQb3J0IGRlZmF1bHRXU0RMUG9ydChpbnQgdmVyc2lvbklEKSB7Ci0JCVdTRExQb3J0IHdzZGxwb3J0ID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExQb3J0KCk7Ci0JCVFOYW1lSGVscGVyLnNldFFOYW1lVmFsdWUod3NkbHBvcnQsIGRlZmF1bHROYW1lc3BhY2VVUkkoKSwgZGVmYXVsdExvY2FsUGFydCgpLCBkZWZhdWx0UHJlZml4KCksIHZlcnNpb25JRCk7Ci0JCXJldHVybiB3c2RscG9ydDsKLQl9Ci0KLQkvLyBwb3J0IGNvbXBvbmVudAotCXB1YmxpYyBQb3J0Q29tcG9uZW50IGRlZmF1bHRQb3J0Q29tcG9uZW50KGludCB2ZXJzaW9uSUQpIHsKLQkJUG9ydENvbXBvbmVudCBwb3J0Q29tcG9uZW50ID0gV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcnRDb21wb25lbnQoKTsKLQkJcG9ydENvbXBvbmVudC5zZXRQb3J0Q29tcG9uZW50TmFtZShkZWZhdWx0UG9ydENvbXBvbmVudE5hbWUoKSk7Ci0JCXBvcnRDb21wb25lbnQuc2V0V3NkbFBvcnQoZGVmYXVsdFdTRExQb3J0KHZlcnNpb25JRCkpOwotCQlwb3J0Q29tcG9uZW50LnNldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZShkZWZhdWx0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlKCkpOwotCQlwb3J0Q29tcG9uZW50LnNldFNlcnZpY2VJbXBsQmVhbihkZWZhdWx0U2VydmljZUltcGxCZWFuKCkpOwotCQlyZXR1cm4gcG9ydENvbXBvbmVudDsKLQl9Ci0KLQkvLyBKQVggUlBDIG1hcHBpbmcKLQlwdWJsaWMgU3RyaW5nIGRlZmF1bHRKYXhScGNNYXBwaW5nRmlsZSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoImpheHJwY21hcHBpbmcueG1sIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBjb21wb25lbnQgc2NvcGVkIHJlZmVyZW5jZQotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdENvbXBvbmVudE5hbWUoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKFdlYlNlcnZpY2VQbHVnaW4uZ2V0TWVzc2FnZSgiJV9VSV9Qb3J0Q29tcG9uZW50UmVmX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbnN0YW50cy9JbmZvcG9wQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2NvbnN0YW50cy9JbmZvcG9wQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MjA3YzMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9jb25zdGFudHMvSW5mb3BvcENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBJbmZvcG9wQ29uc3RhbnRzIHsKLQotCS8qKiAqKioqKioqKioqKioqKioqKioqKioqKioqSW5mb3BvcHMgZm9yIHBhZ2VzKioqKioqKioqKioqKioqKioqKioqKioqICovCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wV2ViU2VydmljZXNQYWdlKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiLkVKU1JQMDAwMSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BQb3J0Q29tcG9uZW50UGFnZSgpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIi5FSlNSUDAwMDIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wV1NIYW5kbGVyUGFnZSgpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIi5FSlNSUDAwMDMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmljZVJlZlBhZ2UoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICIuRUpTUlAwMDA0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNSSGFuZGxlclBhZ2UoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICIuRUpTUlAwMDA1IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0KLQkvKiogKioqKioqKioqKioqKioqKioqKioqKioqKkluZm9wb3BzIGZvciBzZWN0aW9ucyoqKioqKioqKioqKioqKioqKioqKioqICovCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wRGVzY3JpcHRpb24oKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDEgZm9yIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAwMSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BEaXNwbGF5TmFtZSgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAwMiBmb3IgdGhlIGRpc3BsYXkgbmFtZSB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAwMiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTbWFsbEljb24oKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDMgZm9yIHRoZSBzbWFsbCBpY29uIGRpc3BsYXkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDAzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcExhcmdlSWNvbigpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAwNCBmb3IgdGhlIGxhcmdlIGljb24gZGlzcGxheSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAwNSBmb3IgdGhlIFdlYiBzZXJ2aWNlIGRlc2NyaXB0aW9uIG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wV1NETEZpbGUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDYgZm9yIHRoZSBXU0RMIGZpbGUgbG9jYXRpb24gdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDYiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wSkFYUlBDTWFwcGluZ0ZpbGUoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDcgZm9yIHRoZSBKQVgtUlBDIG1hcHBpbmcgZmlsZSBsb2NhdGlvbiB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAwNyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BQb3J0Q29tcG9uZW50TmFtZSgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAwOCBmb3IgdGhlIHBvcnQgY29tcG9uZW50IG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMDgiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wV1NETFBvcnROYW1lc3BhY2VVUkkoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMDkgZm9yIHRoZSBXU0RMIHBvcnQgbmFtZXNwYWNlIFVSSSB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAwOSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BXU0RMUG9ydExvY2FscGFydCgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAxMCBmb3IgdGhlIFdTREwgcG9ydCBsb2NhbCBwYXJ0IHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDEwIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAxMSBmb3IgdGhlIGZ1bGx5IHF1YWxpZmllZCBzZXJ2aWNlIGVuZHBvaW50IGludGVyZmFjZSBjbGFzcyBuYW1lIHRleHQKLQkJICogZmllbGQKLQkJICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxMSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZXJ2aWNlSW1wbEJlYW4oKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMTIgZm9yIHRoZSBmdWxseSBxdWFsaWZpZWQgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBiZWFuIGNsYXNzIG5hbWUgdGV4dAotCQkgKiBmaWVsZAotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDEyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcEVKQkxpbmsoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTMgZm9yIHRoZSB1c2UgRUpCIGxpbmsgcmFkaW8gYnV0dG9uICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxMyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZXJ2bGV0TGluaygpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAxNCBmb3IgdGhlIHVzZSBzZXJ2bGV0IGxpbmsgcmFkaW8gYnV0dG9uICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxNCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BIYW5kbGVyTmFtZSgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAxNSBmb3IgdGhlIGhhbmRsZXIgbmFtZSB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxNSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BIYW5kbGVyQ2xhc3MoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMTYgZm9yIHRoZSBmdWxseSBxdWFsaWZpZWQgaGFuZGxlciBjbGFzcyBuYW1lIHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDE2IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlcnZpY2VSZWZOYW1lKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDE3IGZvciB0aGUgc2VydmljZSByZWZlcmVuY2UgbmFtZSB0ZXh0IGZpZWxkICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAxNyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZXJ2aWNlSW50ZXJmYWNlTmFtZSgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAxOCBmb3IgdGhlIHNlcnZpY2UgaW50ZXJmYWNlIG5hbWUgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTgiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmljZVFOYW1lTmFtZXNwYWNlVVJJKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDE5IGZvciB0aGUgc2VydmljZSBxbmFtZSBuYW1zcGFjZSBVUkkgdGV4dCBmaWVsZCAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMTkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VydmljZVFOYW1lTG9jYWxwYXJ0KCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDIwIGZvciB0aGUgc2VydmljZSBxbmFtZSBsb2NhbCBwYXJ0IHRleHQgZmllbGQgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDIwIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcENvbWJvV2ViU2VydmljZURlc2NyaXB0aW9uKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDIxIGZvciB0aGUgV2ViIHNlcnZpY2UgZGVzY3JpcHRpb24gZHJvcC1kb3duIChsaXN0IG9mIFdlYiBzZXJ2aWNlCi0JCSAqIGRlc2NyaXB0aW9ucykKLQkJICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyMSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BDb21ib1BvcnRDb21wb25lbnQoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMjIgZm9yIHRoZSBwb3J0IGNvbXBvbmVudCBkcm9wLWRvd24gKGxpc3Qgb2YgcG9ydCBjb21wb25lbnRzKSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wQ29tYm9Db21wb25lbnRTY29wZWRSZWYoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMjMgZm9yIHRoZSBjb21wb25lbnQgc2NvcGVkIHJlZmVyZW5jZSBkcm9wLWRvd24gKGxpc3Qgb2YgY29tcG9uZW50Ci0JCSAqIHNjb3BlZCByZWZlcmVuY2UpCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wQ29tYm9TZXJ2aWNlUmVmKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDI0IGZvciB0aGUgc2VydmljZSByZWZlcmVuY2UgZHJvcC1kb3duIChsaXN0IG9mIHNlcnZpY2UgcmVmZXJlbmNlcykgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDI0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlY3Rpb25XZWJTZXJ2aWNlRGVzY3JpcHRpb24oKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMjUgZm9yIHRoZSBXZWIgc2VydmljZSBkZXNjcmlwdGlvbiBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlcy54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyNSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uUG9ydENvbXBvbmVudCgpIHsKLQkJLyogQ09OVEVYVF9JRCBFSlNSMDAyNiBmb3IgdGhlIHBvcnQgY29tcG9uZW50IHNlY3Rpb24gaW4gdGhlIHdlYnNlcnZpY2VzLnhtbCBlZGl0b3IgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDI2IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlY3Rpb25IYW5kbGVyV1MoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMjcgZm9yIHRoZSBoYW5kbGVyIHNlY3Rpb24gaW4gdGhlIHdlYnNlcnZpY2VzLnhtbCBlZGl0b3IgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDI3IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlY3Rpb25Db21wb25lbnRTY29wZWRSZWYoKSB7Ci0JCS8qCi0JCSAqIENPTlRFWFRfSUQgRUpTUjAwMjggZm9yIHRoZSBjb21wb25lbnQgc2NvcGVkIHJlZmVyZW5jZSBzZWN0aW9uIGluIHRoZQotCQkgKiB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMjgiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvblNlcnZpY2VSZWYoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMjkgZm9yIHRoZSBzZXJ2aWNlIHJlZmVyZW5jZSBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgZWRpdG9yICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAyOSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uUG9ydENvbXBvbmVudFJlZigpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAzMCBmb3IgdGhlIHBvcnQgY29tcG9uZW50IHJlZmVyZW5jZSBzZWN0aW9uIGluIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwKLQkJICogZWRpdG9yCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMzAiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcG9wU2VjdGlvbkhhbmRsZXJXU0MoKSB7Ci0JCS8qIENPTlRFWFRfSUQgRUpTUjAwMzEgZm9yIHRoZSBoYW5kbGVyIHNlY3Rpb24gaW4gdGhlIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBlZGl0b3IgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDMxIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlY3Rpb25Jbml0UGFyYW1zKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDMyIGZvciB0aGUgaW5pdGlhbCBwYXJhbWV0ZXIgc2VjdGlvbiBpbiBib3RoIHdlYnNlcnZpY2VzLnhtbCBhbmQKLQkJICogd2Vic2VydmljZXNjbGllbnQueG1sIGVkaXRvcgotCQkgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDMyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFNlY3Rpb25TT0FQSGVhZGVycygpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAzMyBmb3IgdGhlIFNPQVAgaGVhZGVyIHNlY3Rpb24gaW4gYm90aCB3ZWJzZXJ2aWNlcy54bWwgYW5kCi0JCSAqIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBlZGl0b3IKLQkJICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzMyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uU09BUFJvbGVzKCkgewotCQkvKgotCQkgKiBDT05URVhUX0lEIEVKU1IwMDM0IGZvciB0aGUgU09BUCByb2xlIHNlY3Rpb24gaW4gYm90aCB3ZWJzZXJ2aWNlcy54bWwgYW5kCi0JCSAqIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBlZGl0b3IKLQkJICovCi0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLlBMVUdJTl9JRCArICJFSlNSMDAzNCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9wb3BTZWN0aW9uUG9ydE5hbWVzKCkgewotCQkvKiBDT05URVhUX0lEIEVKU1IwMDM1IGZvciB0aGUgcG9ydCBuYW1lIHNlY3Rpb24gaW4gdGhlIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBlZGl0b3IgKi8KLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uUExVR0lOX0lEICsgIkVKU1IwMDM1IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3BvcFJlc291cmNlVHJlZSgpIHsKLQkJLyoKLQkJICogQ09OVEVYVF9JRCBFSlNSMDAzNiBmb3IgdGhlIHBvcHVwIGRpYWxvZyB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBzZWxlY3QgYSByZXNvdXJjZSBpbiB0aGUKLQkJICogd29ya2JlbmNoCi0JCSAqLwotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5QTFVHSU5fSUQgKyAiRUpTUjAwMzYiOyAvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dTRExIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dTRExIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1YjE3Yy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XU0RMSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmhlbHBlcjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlRXh0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgbWV0aG9kcyB0byBoZWxwIG5hdmlnYXRlIFdTREwgZmlsZXMgcHJvdmlkZWQgaW4gdmFyaW91cyBKU1ItMTA5IGRlc2NyaXB0b3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMSGVscGVyIHsKLQotCXByaXZhdGUgSVByb2plY3QgcHJvajsKLQotCXB1YmxpYyBXU0RMSGVscGVyKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXRoaXMucHJvaiA9IGFQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGxpc3Qgb2Ygd3NkbDpwb3J0QG5hbWUncyBjb250YWluZWQgaW4gdGhlIFdTREwgZmlsZSByZWZlcnJlZCB0byBieQotCSAqIHRoZSBzcGVjaWZpZWQgPHNlcnZpY2UtcmVmPgotCSAqIAotCSAqIEBwYXJhbSBzZXJ2aWNlUmVmTmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIDxzZXJ2aWNlLXJlZj4KLQkgKiBAcGFyYW0gY29tcFNjb3BlZFJlZk5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSA8Y29tcG9uZW50LXNjb3BlZC1yZWZzPgotCSAqIEBwYXJhbSB3c2MKLQkgKiAgICAgICAgICAgIFRoZSByb290IG9iamVjdCBvZiB0aGUgd2Vic2VydmljZXNjbGllbnQueG1sIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gZXhjbHVkZQotCSAqICAgICAgICAgICAgcG9ydCBuYW1lcyB0byBleGNsdWRlIGluIHRoZSByZXR1cm5lZCBhcnJheQotCSAqIEByZXR1cm4gU3RyaW5nW10gQW4gYXJyYXkgb2Ygd3NkbDpwb3J0QG5hbWVzJ3MuIG51bGwgaXMgcmV0dXJuZWQgaWYgdGhlcmUgYXJlIGFueSBwcm9ibGVtcwotCSAqICAgICAgICAgd2l0aCBuYXZpZ2F0aW5nIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgb3IgdGhlIFdTREwuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFBvcnROYW1lcyhTdHJpbmcgc2VydmljZVJlZk5hbWUsIFN0cmluZyBjb21wU2NvcGVkUmVmTmFtZSwgV2ViU2VydmljZXNDbGllbnQgd3NjLCBTdHJpbmdbXSBleGNsdWRlKSB7Ci0JCVNlcnZpY2VSZWYgc3IgPSBnZXRTZXJ2aWNlUmVmKHNlcnZpY2VSZWZOYW1lLCBjb21wU2NvcGVkUmVmTmFtZSwgd3NjKTsKLQkJaWYgKHNyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgd3NkbFVSTCA9IGdldFdTRExGaWxlVVJMKHNyKTsKLQkJaWYgKHdzZGxVUkwubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBzZXJ2aWNlTG9jYWxOYW1lID0gZ2V0U2VydmljZVFuYW1lKHNyKTsKLQkJU3RyaW5nW10gcG9ydE5hbWVzID0gZ2V0UG9ydE5hbWVzKHdzZGxVUkwsIHNlcnZpY2VMb2NhbE5hbWUpOwotCQlwb3J0TmFtZXMgPSB0cmltKHBvcnROYW1lcywgZXhjbHVkZSk7Ci0JCXJldHVybiBwb3J0TmFtZXM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHdzZGw6c2VydmljZSBpbiBXU0RMIGZpbGUgcmVmZXJyZWQgdG8gYnkgdGhlCi0JICogc3BlY2lmaWVkIDxzZXJ2aWNlLXJlZj4KLQkgKiAKLQkgKiBAcGFyYW0gc2VydmljZVJlZk5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSA8c2VydmljZS1yZWY+Ci0JICogQHBhcmFtIGNvbXBTY29wZWRSZWZOYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgPGNvbXBvbmVudC1zY29wZWQtcmVmcz4KLQkgKiBAcGFyYW0gd3NjCi0JICogICAgICAgICAgICBUaGUgcm9vdCBvYmplY3Qgb2YgdGhlIHdlYnNlcnZpY2VzY2xpZW50LnhtbCBkZXNjcmlwdG9yCi0JICogQHBhcmFtIGV4Y2x1ZGUKLQkgKiAgICAgICAgICAgIHBvcnQgbmFtZXMgdG8gZXhjbHVkZSBpbiB0aGUgcmV0dXJuZWQgYXJyYXkKLQkgKiBAcmV0dXJuIFN0cmluZyBUaGUgbmFtZXNwYWNlIG9mIHRoZSB3c2RsOnNlcnZpY2UuIG51bGwgaXMgcmV0dXJuZWQgaWYgdGhlcmUgYXJlIGFueSBwcm9ibGVtcwotCSAqICAgICAgICAgd2l0aCBuYXZpZ2F0aW5nIHRoZSB3ZWJzZXJ2aWNlc2NsaWVudC54bWwgb3IgdGhlIFdTREwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZXNwYWNlKFN0cmluZyBzZXJ2aWNlUmVmTmFtZSwgU3RyaW5nIGNvbXBTY29wZWRSZWZOYW1lLCBXZWJTZXJ2aWNlc0NsaWVudCB3c2MpIHsKLQkJU2VydmljZVJlZiBzciA9IGdldFNlcnZpY2VSZWYoc2VydmljZVJlZk5hbWUsIGNvbXBTY29wZWRSZWZOYW1lLCB3c2MpOwotCQlpZiAoc3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB3c2RsVVJMID0gZ2V0V1NETEZpbGVVUkwoc3IpOwotCQlpZiAod3NkbFVSTC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHNlcnZpY2VMb2NhbE5hbWUgPSBnZXRTZXJ2aWNlUW5hbWUoc3IpOwotCQlTdHJpbmcgbmFtZXNwYWNlID0gZ2V0UG9ydE5hbWVzcGFjZSh3c2RsVVJMLCBzZXJ2aWNlTG9jYWxOYW1lKTsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBsaXN0IG9mIHdzZGw6cG9ydEBuYW1lJ3MgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgd3NkbDpzZXJ2aWNlIGluCi0JICogdGhlIHNwZWNpZmllZCBXU0RMIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHdzZGxVUkwKLQkgKiAgICAgICAgICAgIFRoZSBVUkwgb2YgdGhlIFdTREwgZmlsZS4KLQkgKiBAcGFyYW0gc2VydmljZUxvY2FsTmFtZQotCSAqICAgICAgICAgICAgVGhlIGxvY2FsIG5hbWUgb2YgdGhlIHdzZGw6c2VydmljZSB0byBsb29rIGluLgotCSAqIEByZXR1cm4gU3RyaW5nW10gQW4gYXJyYXkgb2Ygd3NkbDpwb3J0QG5hbWUncy4gTnVsbCBpcyByZXR1cm5lZCBhIHdzZGw6c2VydmljZSB3aXRoIHRoZQotCSAqICAgICAgICAgc3BlY2lmaWVkIGxvY2FsIG5hbWUgY291bGQgbm90IGJlIGZvdW5kLgotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZ2V0UG9ydE5hbWVzKFN0cmluZyB3c2RsVVJMLCBTdHJpbmcgc2VydmljZUxvY2FsTmFtZSkgewotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJT2JqZWN0IHRhcmdldFNlcnZpY2UgPSBnZXRUYXJnZXRTZXJ2aWNlKHdzZGxVUkwsIHNlcnZpY2VMb2NhbE5hbWUpOwotCi0JCWlmICh0YXJnZXRTZXJ2aWNlID09IG51bGwpIHsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJnZXRQb3J0TmFtZXMgLi4uIHRhcmdldFNlcnZpY2UgbnVsbC4iKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwIHBvcnRzID0gc2VydmljZUhlbHBlci5nZXRTZXJ2aWNlUG9ydHModGFyZ2V0U2VydmljZSk7Ci0JCWludCBudW1iZXJPZlBvcnRzID0gcG9ydHMuc2l6ZSgpOwotCQlTdHJpbmdbXSBwb3J0TmFtZXMgPSBuZXcgU3RyaW5nW251bWJlck9mUG9ydHNdOwotCQlJdGVyYXRvciBrID0gcG9ydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJZm9yIChpbnQgbSA9IDA7IG0gPCBudW1iZXJPZlBvcnRzOyBtKyspIHsKLQkJCU9iamVjdCBwb3J0ID0gay5uZXh0KCk7Ci0JCQlwb3J0TmFtZXNbbV0gPSBzZXJ2aWNlSGVscGVyLmdldFBvcnROYW1lKHBvcnQpOwotCQl9Ci0KLQkJcmV0dXJuIHBvcnROYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIHNwZWNpZmllZCB3c2RsOnNlcnZpY2UgaW4gdGhlIHNwZWNpZmllZCBXU0RMIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHdzZGxVUkwKLQkgKiAgICAgICAgICAgIFRoZSBVUkwgb2YgdGhlIFdTREwgZmlsZS4KLQkgKiBAcGFyYW0gc2VydmljZUxvY2FsTmFtZQotCSAqICAgICAgICAgICAgVGhlIGxvY2FsIG5hbWUgb2YgdGhlIHdzZGw6c2VydmljZSB0byBsb29rIGluLgotCSAqIEByZXR1cm4gU3RyaW5nW10gQW4gYXJyYXkgb2Ygd3NkbDpwb3J0QG5hbWUncy4gQW4gZW1wdHkgU3RyaW5nIGlzIHJldHVybmVkIGlmIGEgd3NkbDpzZXJ2aWNlCi0JICogICAgICAgICB3aXRoIHRoZSBzcGVjaWZpZWQgbG9jYWwgbmFtZSBjb3VsZCBub3QgYmUgZm91bmQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UG9ydE5hbWVzcGFjZShTdHJpbmcgd3NkbFVSTCwgU3RyaW5nIHNlcnZpY2VMb2NhbE5hbWUpIHsKLQkJT2JqZWN0IHRhcmdldFNlcnZpY2UgPSBnZXRUYXJnZXRTZXJ2aWNlKHdzZGxVUkwsIHNlcnZpY2VMb2NhbE5hbWUpOwotCi0JCWlmICh0YXJnZXRTZXJ2aWNlID09IG51bGwpIHsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJnZXRQb3J0TmFtZXNwYWNlIC4uLiB0YXJnZXRTZXJ2aWNlIG51bGwuIik7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpLmdldFNlcnZpY2VOYW1lc3BhY2VVUkkodGFyZ2V0U2VydmljZSk7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0VGFyZ2V0U2VydmljZShTdHJpbmcgd3NkbFVSTCwgU3RyaW5nIHNlcnZpY2VMb2NhbE5hbWUpIHsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCU9iamVjdCBkZWZpbml0aW9uID0gZ2V0V1NETERlZmluaXRpb24od3NkbFVSTCk7Ci0JCWlmIChkZWZpbml0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJT2JqZWN0IHRhcmdldFNlcnZpY2UgPSBudWxsOwotCQlNYXAgc2VydmljZXMgPSBzZXJ2aWNlSGVscGVyLmdldERlZmluaXRpb25TZXJ2aWNlcyhkZWZpbml0aW9uKTsKLQkJaWYgKCFzZXJ2aWNlcy5pc0VtcHR5KCkpIHsKLQkJCWlmICgoc2VydmljZUxvY2FsTmFtZSA9PSBudWxsIHx8IHNlcnZpY2VMb2NhbE5hbWUubGVuZ3RoKCkgPT0gMCkgJiYgc2VydmljZXMuc2l6ZSgpID4gMSkgLy9NdWx0aXBsZQotCQkJLy8gc2VydmljZXMKLQkJCS8vIHdpdGhvdXQKLQkJCS8vIG9uZQotCQkJLy8gZGVzaWduYXRlZAotCQkJLy8gaXMKLQkJCS8vIGFuCi0JCQkvLyBlcnJvcgotCQkJewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlpZiAoKHNlcnZpY2VMb2NhbE5hbWUgPT0gbnVsbCB8fCBzZXJ2aWNlTG9jYWxOYW1lLmxlbmd0aCgpID09IDApICYmIHNlcnZpY2VzLnNpemUoKSA9PSAxKSB7Ci0JCQkJLy9SZXR1cm4gdGhlIHBvcnQgbmFtZXMgaW4gdGhlIG9uZSBzZXJ2aWNlCi0JCQkJSXRlcmF0b3IgaSA9IHNlcnZpY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJdGFyZ2V0U2VydmljZSA9IGkubmV4dCgpOwotCQkJfSBlbHNlIC8vVGhlcmUgYXJlIG11bHRpcGxlIHNlcnZpY2VzIGJ1dCBvbmUgaXMgZGVzaWduYXRlZAotCQkJewotCQkJCUl0ZXJhdG9yIGogPSBzZXJ2aWNlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChqLmhhc05leHQoKSkgewotCQkJCQlPYmplY3Qgc2VydmljZSA9IGoubmV4dCgpOwotCQkJCQlTdHJpbmcgc2VydmljZU5hbWUgPSBzZXJ2aWNlSGVscGVyLmdldFNlcnZpY2VMb2NhbFBhcnQoc2VydmljZSk7Ci0JCQkJCWlmIChzZXJ2aWNlTmFtZS5lcXVhbHMoc2VydmljZUxvY2FsTmFtZSkpIHsKLQkJCQkJCXRhcmdldFNlcnZpY2UgPSBzZXJ2aWNlOwotCQkJCQkJYnJlYWs7IC8vRm91bmQgYSBtYXRjaC4gQnJlYWsgb3V0IG9mIGxvb3AuIFdlIG11c3QgYmUgYXNzdW1pbmcgdW5pcXVlIG5hbWVzCi0JCQkJCQkvLyBvbiBzZXJ2aWNlcy4KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0YXJnZXRTZXJ2aWNlOwotCi0JfQotCi0KLQlwcml2YXRlIE9iamVjdCBnZXRXU0RMRGVmaW5pdGlvbihTdHJpbmcgd3NkbFVSTCkgewotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJcmV0dXJuIHNlcnZpY2VIZWxwZXIuZ2V0V1NETERlZmluaXRpb24od3NkbFVSTCk7Ci0JCQotCQkvKnRyeSB7Ci0JCQlXU0RMUmVzb3VyY2VJbXBsIHJlcyA9IChXU0RMUmVzb3VyY2VJbXBsKSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh3c2RsVVJMKSwgdHJ1ZSk7Ci0JCQlpZiAocmVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gcmVzLmdldERlZmluaXRpb24oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIHdzZGxlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSovCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBVUkwgb2YgdGhlIDx3c2RsLWZpbGU+c3BlY2lmaWVkIGluIHRoZSBnaXZlbiA8c2VydmljZS1yZWY+LiBSZXR1cm5zIGEgYmxhbmsKLQkgKiBTdHJpbmcgaWYgPHdzZGwtZmlsZT5pcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBwcm92aWRlZCA8c2VydmljZS1yZWY+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0V1NETEZpbGVVUkwoU2VydmljZVJlZiBzcikgewotCQlTdHJpbmcgd3NkbEZpbGVSZWxQYXRoID0gc3IuZ2V0V3NkbEZpbGUoKTsKLQkJaWYgKHdzZGxGaWxlUmVsUGF0aCA9PSBudWxsIHx8IHdzZGxGaWxlUmVsUGF0aC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gR2V0IGEgaGFuZGxlIG9uIHRoZSBXU0RMIGZpbGUuCi0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2opOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCUlWaXJ0dWFsRm9sZGVyIG1vZHVsZVJvb3QgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcigiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlJRmlsZSB3c2RsRmlsZSA9IG1vZHVsZVJvb3QuZ2V0RmlsZSh3c2RsRmlsZVJlbFBhdGgpLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQlpZiAoIXdzZGxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvL0dldCB0aGUgZmlsZVVSTCBmcm9tIHdzZGxGaWxlCi0JCQlTdHJpbmcgd3NkbFVSTDsKLQkJCXRyeSB7Ci0JCQkJd3NkbFVSTCA9IHdzZGxGaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkudG9VUkwoKS50b1N0cmluZygpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11cmxlKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmICh3c2RsVVJMID09IG51bGwgfHwgd3NkbFVSTC5sZW5ndGgoKSA9PSAwKQotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHdzZGxVUkw7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWwgcGFydCBvZiB0aGUgPHNlcnZpY2UtcW5hbWU+c3BlY2lmaWVkIGluIHRoZSBnaXZlbiA8c2VydmljZS1yZWY+LiBSZXR1cm5zIGEKLQkgKiBibGFuayBTdHJpbmcgaWYgPHNlcnZpY2UtcW5hbWU+aXMgbm90IHNwZWNpZmllZCBpbiB0aGUgcHJvdmlkZWQgPHNlcnZpY2UtcmVmPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNlcnZpY2VRbmFtZShTZXJ2aWNlUmVmIHNyKSB7Ci0JCVFOYW1lIHNlcnZpY2VRbmFtZSA9IHNyLmdldFNlcnZpY2VRbmFtZSgpOwotCQlpZiAoc2VydmljZVFuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgc2VydmljZUxvY2FsTmFtZSA9IHNlcnZpY2VRbmFtZS5nZXRMb2NhbFBhcnQoKTsKLQkJaWYgKHNlcnZpY2VMb2NhbE5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBzZXJ2aWNlTG9jYWxOYW1lOwotCX0KLQotCS8qIElmIGNvbXBTY29wZWRSZWZOYW1lIGlzIGVtcHR5IG9yIG51bGwsIHdlIG1heSBoYXZlIHRvIGNoZWNrIGFsbCBvZiB0aGVtLiAqLwotCXB1YmxpYyBTZXJ2aWNlUmVmIGdldFNlcnZpY2VSZWYoU3RyaW5nIG5hbWUsIFN0cmluZyBjb21wU2NvcGVkUmVmTmFtZSwgV2ViU2VydmljZXNDbGllbnQgd3NjKSB7Ci0JCUl0ZXJhdG9yIHNlcnZpY2VSZWZzOwotCQlpZiAoY29tcFNjb3BlZFJlZk5hbWUgIT0gbnVsbCAmJiBjb21wU2NvcGVkUmVmTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCUNvbXBvbmVudFNjb3BlZFJlZnMgY3NyID0gZ2V0Q29tcFNjb3BlZFJlZihjb21wU2NvcGVkUmVmTmFtZSwgd3NjKTsKLQkJCXNlcnZpY2VSZWZzID0gY3NyLmdldFNlcnZpY2VSZWZzKCkuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCXNlcnZpY2VSZWZzID0gd3NjLmdldFNlcnZpY2VSZWZzKCkuaXRlcmF0b3IoKTsKLQkJCS8vSWYgdGhlcmUgYXJlIG5vIHNlcnZpY2UgcmVmcyAuLi4gY2hlY2sgYWxsIGNvbXBvbmVudC1zY29wZWQtcmVmcyBmb3IgdGhlIHNlcnZpY2UtcmVmCi0JCQlpZiAoIXNlcnZpY2VSZWZzLmhhc05leHQoKSkgewotCQkJCUl0ZXJhdG9yIGNzUmVmcyA9IHdzYy5nZXRDb21wb25lbnRTY29wZWRSZWZzKCkuaXRlcmF0b3IoKTsKLQotCQkJCXdoaWxlIChjc1JlZnMuaGFzTmV4dCgpKSB7Ci0JCQkJCUNvbXBvbmVudFNjb3BlZFJlZnMgY3NyID0gKENvbXBvbmVudFNjb3BlZFJlZnMpIGNzUmVmcy5uZXh0KCk7Ci0JCQkJCUl0ZXJhdG9yIHNycyA9IGNzci5nZXRTZXJ2aWNlUmVmcygpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChzcnMuaGFzTmV4dCgpKSB7Ci0JCQkJCQlTZXJ2aWNlUmVmIHNyID0gKFNlcnZpY2VSZWYpIHNycy5uZXh0KCk7Ci0JCQkJCQlTdHJpbmcgdGhpc05hbWUgPSBzci5nZXRTZXJ2aWNlUmVmTmFtZSgpOwotCQkJCQkJaWYgKHRoaXNOYW1lLmVxdWFscyhuYW1lKSkgewotCQkJCQkJCXJldHVybiBzcjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCXJldHVybiBudWxsOyAvL0NvdWxkIG5vdCBmaW5kIGl0IGluIGFueSBvZiB0aGUgY29tcG9uZW50LXNjb3BlZC1yZWZzCi0JCQl9Ci0KLQkJfQotCi0JCXdoaWxlIChzZXJ2aWNlUmVmcy5oYXNOZXh0KCkpIHsKLQkJCVNlcnZpY2VSZWYgc2VydmljZVJlZiA9IChTZXJ2aWNlUmVmKSBzZXJ2aWNlUmVmcy5uZXh0KCk7Ci0JCQlTdHJpbmcgc2VydmljZVJlZk5hbWUgPSBzZXJ2aWNlUmVmLmdldFNlcnZpY2VSZWZOYW1lKCk7Ci0JCQlpZiAoc2VydmljZVJlZk5hbWUuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBzZXJ2aWNlUmVmOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHJpdmF0ZSBDb21wb25lbnRTY29wZWRSZWZzIGdldENvbXBTY29wZWRSZWYoU3RyaW5nIG5hbWUsIFdlYlNlcnZpY2VzQ2xpZW50IHdzYykgewotCQlJdGVyYXRvciBjb21wU2NvcGVkUmVmcyA9IHdzYy5nZXRDb21wb25lbnRTY29wZWRSZWZzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNvbXBTY29wZWRSZWZzLmhhc05leHQoKSkgewotCQkJQ29tcG9uZW50U2NvcGVkUmVmcyBjb21wU2NvcGVkUmVmID0gKENvbXBvbmVudFNjb3BlZFJlZnMpIGNvbXBTY29wZWRSZWZzLm5leHQoKTsKLQkJCVN0cmluZyBjb21wU2NvcGVkUmVmTmFtZSA9IGNvbXBTY29wZWRSZWYuZ2V0Q29tcG9uZW50TmFtZSgpOwotCQkJaWYgKGNvbXBTY29wZWRSZWZOYW1lLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gY29tcFNjb3BlZFJlZjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmdbXSB0cmltKFN0cmluZ1tdIHZhbHVlcywgU3RyaW5nW10gZXhjbHVkZSkgewotCQlpZiAodmFsdWVzID09IG51bGwgfHwgdmFsdWVzLmxlbmd0aCA9PSAwIHx8IGV4Y2x1ZGUgPT0gbnVsbCB8fCBleGNsdWRlLmxlbmd0aCA9PSAwKSAvL25vCi0JCQkvLyBjaGFuZ2UKLQkJCS8vIHJlcXVpcmVkLgotCQkJLy8gcmV0dXJuCi0JCQkvLyBhcwotCQkJLy8gaXMuCi0JCQlyZXR1cm4gdmFsdWVzOwotCi0JCVN0cmluZ1tdIGZpbmFsVmFsdWVzOwotCQlBcnJheUxpc3QgZmluYWxMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFjb250YWlucyhleGNsdWRlLCB2YWx1ZXNbaV0pKSB7Ci0JCQkJZmluYWxMaXN0LmFkZCh2YWx1ZXNbaV0pOwotCQkJfQotCQl9Ci0KLQkJaW50IGZpbmFsU2l6ZSA9IGZpbmFsTGlzdC5zaXplKCk7Ci0JCWZpbmFsVmFsdWVzID0gbmV3IFN0cmluZ1tmaW5hbFNpemVdOwotCQlPYmplY3RbXSBmaW5hbEFycmF5ID0gZmluYWxMaXN0LnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBmaW5hbFNpemU7IGorKykgewotCQkJZmluYWxWYWx1ZXNbal0gPSAoU3RyaW5nKSAoZmluYWxBcnJheVtqXSk7Ci0JCX0KLQotCQlyZXR1cm4gZmluYWxWYWx1ZXM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGFycmF5IG9mIFN0cmluZydzIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgU3RyaW5nLiBGYWxzZSBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKFN0cmluZ1tdIHZhbHVlcywgU3RyaW5nIHMpIHsKLQkJaWYgKHZhbHVlcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodmFsdWVzW2ldLmVxdWFscyhzKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dTRExTZXJ2aWNlSGVscGVySW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV1NETFNlcnZpY2VIZWxwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDJkN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV1NETFNlcnZpY2VIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMjEsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucGFyc2VyLndzaWwuV2ViU2VydmljZXNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Qb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLlNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudXRpbC5XU0RMUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMU2VydmljZUhlbHBlckltcGwgaW1wbGVtZW50cyBXU0RMU2VydmljZUhlbHBlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgV1NETFNlcnZpY2VIZWxwZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0gCi0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFBvcnROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3J0TmFtZShPYmplY3QgcG9ydCkgewotCQlQb3J0IGFQb3J0ID0gKFBvcnQpcG9ydDsKLQkJcmV0dXJuIGFQb3J0LmdldE5hbWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRTZXJ2aWNlUG9ydHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTWFwIGdldFNlcnZpY2VQb3J0cyhPYmplY3QgYVNlcnZpY2UpIHsKLQkJU2VydmljZSBzZXJ2aWNlID0oU2VydmljZSlhU2VydmljZTsKLQkJcmV0dXJuIHNlcnZpY2UuZ2V0UG9ydHMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRTZXJ2aWNlTmFtZXNwYWNlVVJJKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZXNwYWNlVVJJKE9iamVjdCBhU2VydmljZSkgewotCQlTZXJ2aWNlIHNlcnZpY2UgPShTZXJ2aWNlKWFTZXJ2aWNlOwotCQlyZXR1cm4gc2VydmljZS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZVVSSSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFNlcnZpY2VEZWZpbml0aW9uTG9jYXRpb24ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTZXJ2aWNlRGVmaW5pdGlvbkxvY2F0aW9uKEVPYmplY3QgYVNlcnZpY2UpIHsKLQkJU2VydmljZSBzZXJ2aWNlID0oU2VydmljZSlhU2VydmljZTsKLQkJcmV0dXJuIHNlcnZpY2UuZ2V0RW5jbG9zaW5nRGVmaW5pdGlvbigpLmdldExvY2F0aW9uKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0UG9ydEJpbmRpbmdOYW1lc3BhY2VVUkkoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvcnRCaW5kaW5nTmFtZXNwYWNlVVJJKE9iamVjdCBhUG9ydCkgewotCQlQb3J0IHBvcnQgPSAoUG9ydClhUG9ydDsKLQkJcmV0dXJuIHBvcnQuZ2V0QmluZGluZygpLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZUxvY2FsUGFydChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmljZUxvY2FsUGFydChPYmplY3QgYVNlcnZpY2UpIHsKLQkJU2VydmljZSBzZXJ2aWNlID0oU2VydmljZSlhU2VydmljZTsKLQkJcmV0dXJuIHNlcnZpY2UuZ2V0UU5hbWUoKS5nZXRMb2NhbFBhcnQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRTZXJ2aWNlUU5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlcnZpY2VRTmFtZShPYmplY3QgYVNlcnZpY2UpIHsKLQkJU2VydmljZSBzZXJ2aWNlID0oU2VydmljZSlhU2VydmljZTsKLQkJcmV0dXJuIHNlcnZpY2UuZ2V0UU5hbWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXREZWZpbml0aW9uU2VydmljZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTWFwIGdldERlZmluaXRpb25TZXJ2aWNlcyhPYmplY3QgYURlZmluaXRpb24pIHsKLQkJRGVmaW5pdGlvbiBkZWZpbml0aW9uID0oRGVmaW5pdGlvbilhRGVmaW5pdGlvbjsKLQkJcmV0dXJuIGRlZmluaXRpb24uZ2V0U2VydmljZXMoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRXU0RMRGVmaW5pdGlvbihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0V1NETERlZmluaXRpb24oU3RyaW5nIHdzZGxVUkwpIHsKLQkJdHJ5IHsKLQkJCVdTRExSZXNvdXJjZUltcGwgcmVzID0gKFdTRExSZXNvdXJjZUltcGwpIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHdzZGxVUkwpLCB0cnVlKTsKLQkJCWlmIChyZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiByZXMuZ2V0RGVmaW5pdGlvbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gd3NkbGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0V1NETERlZmluaXRpb24ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0V1NETERlZmluaXRpb24oUmVzb3VyY2Ugd3NkbFJlc291cmNlKSB7Ci0JCXJldHVybiAoKFdTRExSZXNvdXJjZUltcGwpd3NkbFJlc291cmNlKS5nZXREZWZpbml0aW9uKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0V3NkbFNlcnZpY2VzRnJvbVdzaWxGaWxlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFdzZGxTZXJ2aWNlc0Zyb21Xc2lsRmlsZShJRmlsZSB3c2lsKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlXZWJTZXJ2aWNlRW50aXR5IGVudGl0eSA9IHBhcnNlV3NpbEZpbGUod3NpbCk7Ci0JCWlmIChlbnRpdHkgIT0gbnVsbCAmJiBlbnRpdHkuZ2V0VHlwZSgpID09IFdlYlNlcnZpY2VFbnRpdHkuVFlQRV9XU0lMKSB7Ci0JCQkvLyBnZXQgYWxsIHRoZSBXU0RMIHJlZmVyZW5jZXMgZnJvbSB0aGUgV1NJTCBlbnRpdHkKLQkJCUxpc3Qgd3NkbExpc3QgPSBlbnRpdHkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB3c2RsTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGl0ZW0gPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtIGluc3RhbmNlb2YgV2ViU2VydmljZUVudGl0eSkgewotCQkJCQlpZiAoKChXZWJTZXJ2aWNlRW50aXR5KSBpdGVtKS5nZXRNb2RlbCgpICE9IG51bGwgJiYgKChXZWJTZXJ2aWNlRW50aXR5KSBpdGVtKS5nZXRNb2RlbCgpIGluc3RhbmNlb2YgRGVmaW5pdGlvbikgewotCQkJCQkJRGVmaW5pdGlvbiBkZWYgPSAoRGVmaW5pdGlvbikgKChXZWJTZXJ2aWNlRW50aXR5KSBpdGVtKS5nZXRNb2RlbCgpOwotCQkJCQkJaWYgKGRlZiAhPSBudWxsICYmICFkZWYuZ2V0U2VydmljZXMoKS5pc0VtcHR5KCkpCi0JCQkJCQkJcmVzdWx0LmFkZEFsbChkZWYuZ2V0U2VydmljZXMoKS52YWx1ZXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIFdlYlNlcnZpY2VFbnRpdHkgcGFyc2VXc2lsRmlsZShJRmlsZSB3c2lsKSB7Ci0JV2ViU2VydmljZXNQYXJzZXIgcGFyc2VyID0gbnVsbDsKLQlTdHJpbmcgdXJsID0gbnVsbDsKLQkvLyB2ZXJpZnkgcHJvcGVyIGlucHV0Ci0JaWYgKHdzaWwgPT0gbnVsbCB8fCAhd3NpbC5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFdTSUxfRVhUKSkKLQkJcmV0dXJuIG51bGw7Ci0JLy8gUGFyc2Ugd3NpbCBmaWxlIHRvIGdldCB3c2RsIHNlcnZpY2VzCi0JdHJ5IHsKLQkJdXJsID0gd3NpbC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKLQkJcGFyc2VyID0gbmV3IFdlYlNlcnZpY2VzUGFyc2VyKHVybCk7Ci0JCXBhcnNlci5wYXJzZShXZWJTZXJ2aWNlc1BhcnNlci5QQVJTRV9XU0lMIHwgV2ViU2VydmljZXNQYXJzZXIuUEFSU0VfV1NETCk7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJLy9JZ25vcmUKLQl9Ci0JaWYgKHBhcnNlciA9PSBudWxsKQotCQlyZXR1cm4gbnVsbDsKLQlyZXR1cm4gcGFyc2VyLmdldFdlYlNlcnZpY2VFbnRpdHlCeVVSSSh1cmwpOwotfQotCi0JcHVibGljIGJvb2xlYW4gaXNTZXJ2aWNlKE9iamVjdCBhU2VydmljZSkgewotCQkKLQkJcmV0dXJuIGFTZXJ2aWNlIGluc3RhbmNlb2YgU2VydmljZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNXU0RMUmVzb3VyY2UoT2JqZWN0IGFSZXNvdXJjZSkgewotCQkKLQkJcmV0dXJuIGFSZXNvdXJjZSBpbnN0YW5jZW9mIFdTRExSZXNvdXJjZUltcGw7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzRGVmaW5pdGlvbihPYmplY3QgYURlZmluaXRpb24pIHsKLQkJCi0JCXJldHVybiBhRGVmaW5pdGlvbiBpbnN0YW5jZW9mIERlZmluaXRpb247Ci0JfQotCi0KLQlwdWJsaWMgTGlzdCBnZXQxM1NlcnZpY2VSZWZzKEVPYmplY3QgajJlZU9iamVjdCkgewotCQlpZiAoajJlZU9iamVjdCBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uQ2xpZW50KQotCQkJcmV0dXJuIFdlYlNlcnZpY2VzTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldDEzU2VydmljZVJlZnMoKEFwcGxpY2F0aW9uQ2xpZW50KWoyZWVPYmplY3QpOwotCQllbHNlIGlmIChqMmVlT2JqZWN0IGluc3RhbmNlb2YgRW50ZXJwcmlzZUJlYW4pCi0JCQlyZXR1cm4gV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0MTNTZXJ2aWNlUmVmcygoRW50ZXJwcmlzZUJlYW4pajJlZU9iamVjdCk7Ci0JCWVsc2UgaWYgKGoyZWVPYmplY3QgaW5zdGFuY2VvZiBXZWJBcHApCi0JCQlyZXR1cm4gV2ViU2VydmljZXNNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0MTNTZXJ2aWNlUmVmcygoV2ViQXBwKWoyZWVPYmplY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlRXZlbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dlYlNlcnZpY2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTUzMzM4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dlYlNlcnZpY2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyOwotCi1wdWJsaWMgY2xhc3MgV2ViU2VydmljZUV2ZW50IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFRlJFU0ggPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IDA7Ci0JCi0JcHJpdmF0ZSBpbnQgZXZlbnRUeXBlID0gMDsKLQkKLQlwdWJsaWMgV2ViU2VydmljZUV2ZW50KGludCBhbkV2ZW50VHlwZSkgewotCQlzdXBlcigpOwotCQlldmVudFR5cGUgPSBhbkV2ZW50VHlwZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRFdmVudFR5cGUoKSB7Ci0JCXJldHVybiBldmVudFR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlTWFuYWdlckxpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL2hlbHBlci9XZWJTZXJ2aWNlTWFuYWdlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZGNhZWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuaGVscGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIFdlYlNlcnZpY2VNYW5hZ2VyTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgd2ViU2VydmljZU1hbmFnZXJDaGFuZ2VkKFdlYlNlcnZpY2VFdmVudCBhbkV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvaGVscGVyL1dlYlNlcnZpY2VzTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZXNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZmViNWEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9oZWxwZXIvV2ViU2VydmljZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBGZWIgOSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLQotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5oZWxwZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21wb25lbnRjb3JlLnV0aWwuV1NDRERBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5jb21wb25lbnRjb3JlLnV0aWwuV1NEREFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUV4dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlNlcnZpY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXI7Ci0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzTWFuYWdlciBpbXBsZW1lbnRzIEVkaXRNb2RlbExpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQotCXByaXZhdGUgSGFzaE1hcCB3c0FydGlmYWN0RWRpdHMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgSGFzaE1hcCB3c0NsaWVudEFydGlmYWN0RWRpdHMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTGlzdCB3c0FydGlmYWN0RWRpdHNMaXN0OwotCXByaXZhdGUgTGlzdCB3c0NsaWVudEFydGlmYWN0RWRpdHNMaXN0OwotCXByaXZhdGUgc3RhdGljIFdlYlNlcnZpY2VzTWFuYWdlciBJTlNUQU5DRSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGxpc3RlbmVyczsKLQlwcml2YXRlIExpc3QgcmVtb3ZlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIGJvb2xlYW4gaXNOb3RpZnlpbmcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gd3NDbGllbnRFbGVtZW50c0NoYW5nZWQgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiB3c0VsZW1lbnRzQ2hhbmdlZCA9IHRydWU7Ci0JcHJpdmF0ZSBQcm9jZXNzUHJvamVjdHNXaXRoV1NETCBwcm9jZXNzTmV3UHJvamVjdHM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0VYVCA9ICJ3c2RsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTSUxfRVhUID0gIndzaWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBXZWJTZXJ2aWNlc01hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKQotCQkJSU5TVEFOQ0UgPSBuZXcgV2ViU2VydmljZXNNYW5hZ2VyKCk7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljICBib29sZWFuIGlzRmlsZUludGVyZXN0aW5nKElGaWxlIGFGaWxlKSB7Ci0JCWlmIChhRmlsZSAhPSBudWxsICYmIGFGaWxlLmdldEZpbGVFeHRlbnNpb24oKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZXh0ZW5zaW9uID0gYUZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJcmV0dXJuIGV4dGVuc2lvbi5lcXVhbHMoV1NETF9FWFQpIHx8IGV4dGVuc2lvbi5lcXVhbHMoV1NJTF9FWFQpIAotCQkJfHwgYUZpbGUuZ2V0TmFtZSgpLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfU0hPUlROQU1FKSAKLQkJCXx8IGFGaWxlLmdldE5hbWUoKS5lcXVhbHMoSjJFRUNvbnN0YW50cy5XRUJfU0VSVklDRVNfRERfVVJJKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIERlZmF1bHQgQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZXNNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlpbml0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCWNvbGxlY3RBcnRpZmFjdEVkaXRzKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEFydGlmYWN0RWRpdChJUHJvamVjdCBoYW5kbGUpIHsKLQkJc3luY2hyb25pemVkKHdzQXJ0aWZhY3RFZGl0cykgewotCQkJaWYgKCF3c0FydGlmYWN0RWRpdHMuY29udGFpbnNLZXkoaGFuZGxlKSkgewotCQkJCVdTRERBcnRpZmFjdEVkaXQgZWRpdCA9IFdTRERBcnRpZmFjdEVkaXQuZ2V0V1NEREFydGlmYWN0RWRpdEZvclJlYWQoaGFuZGxlKTsKLQkJCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJCVdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzID0gZWRpdC5nZXRXZWJTZXJ2aWNlcygpOwotCQkJCQkvLyBJZiB0aGUgcHJvamVjdCBoYXMgYSB3ZWJzZXJ2aWNlLnhtbCB3aXRoIGludGVybmFsIHNlcnZpY2VzIG9yIAotCQkJCQkvLyBpdCBoYXMgLndzaWwgZmlsZXMgd2l0aCBleHRlcm5hbCBzZXJ2aWNlcywgd2UgY2FjaGUgdGhlIGFydGlmYWN0IGVkaXQKLQkJCQkJaWYgKCh3ZWJTZXJ2aWNlcyAhPSBudWxsICYmICF3ZWJTZXJ2aWNlcy5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25zKCkuaXNFbXB0eSgpKSB8fCAhZWRpdC5nZXRXU0lMUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCQllZGl0LmFkZExpc3RlbmVyKHRoaXMpOwotCQkJCQkJd3NBcnRpZmFjdEVkaXRzLnB1dChoYW5kbGUsIGVkaXQpOwotCQkJCQkJd3NFbGVtZW50c0NoYW5nZWQgPSB0cnVlOwotCQkJCQkvLyBPdGhlcndpc2UsIGRpc3Bvc2UgdGhlIGFydGlmYWN0IGVkaXQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN5bmNocm9uaXplZCAod3NDbGllbnRBcnRpZmFjdEVkaXRzKSB7Ci0JCQlpZiAoIXdzQ2xpZW50QXJ0aWZhY3RFZGl0cy5jb250YWluc0tleShoYW5kbGUpKSB7Ci0JCQkJV1NDRERBcnRpZmFjdEVkaXQgZWRpdCA9IFdTQ0REQXJ0aWZhY3RFZGl0LmdldFdTQ0REQXJ0aWZhY3RFZGl0Rm9yUmVhZChoYW5kbGUpOwotCQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQkJV2ViU2VydmljZXNSZXNvdXJjZSByZXMgPSBlZGl0LmdldFdzY2RkWG1pUmVzb3VyY2UoKTsKLQkJCQkJYm9vbGVhbiBpc0ludGVyZXN0ZWQgPSBmYWxzZTsKLQkJCQkJLy8gRG9lcyB0aGUgcHJvamVjdCBoYXZlIDEuMyB3ZWIgc2VydmljZSBjbGllbnRzPwotCQkJCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmlzTG9hZGVkKCkgJiYgcmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCkgIT0gbnVsbCkKLQkJCQkJCWlzSW50ZXJlc3RlZCA9IHRydWU7Ci0JCQkJCQotCQkJCQkvLyBEb2VzIHRoZSBwcm9qZWN0IGhhdmUgMS40IHdlYiBzZXJ2aWNlIGNsaWVudHM/Ci0JCQkJCUxpc3Qgd3NDbGllbnRFZGl0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJd3NDbGllbnRFZGl0cy5hZGQoZWRpdCk7Ci0JCQkJCS8vaWYgKCFnZXRXb3Jrc3BhY2UxNFNlcnZpY2VSZWZzKHdzQ2xpZW50RWRpdHMpLmlzRW1wdHkoKSkKLQkJCQkJCWlzSW50ZXJlc3RlZCA9IHRydWU7Ci0JCQkJCQotCQkJCQkvLyBJZiBwcm9qZWN0IGhhcyAxLjMgb3IgMS40IHdlYiBzZXJ2aWNlIGNsaWVudHMsIGNhY2hlIHRoZSBhcnRpZmFjdCBlZGl0Ci0JCQkJCWlmIChpc0ludGVyZXN0ZWQpIHsKLQkJCQkJCWVkaXQuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQkJCQl3c0NsaWVudEFydGlmYWN0RWRpdHMucHV0KGhhbmRsZSwgZWRpdCk7Ci0JCQkJCQl3c0NsaWVudEVsZW1lbnRzQ2hhbmdlZCA9IHRydWU7Ci0JCQkJCS8vIE90aGVyd2lzZSwgZGlzcG9zZSB0aGUgYXJ0aWZhY3QgZWRpdAkKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVBcnRpZmFjdEVkaXQoSVByb2plY3QgaGFuZGxlKSB7Ci0JCXN5bmNocm9uaXplZCh3c0FydGlmYWN0RWRpdHMpIHsKLQkJCWlmICh3c0FydGlmYWN0RWRpdHMuY29udGFpbnNLZXkoaGFuZGxlKSkgewotCQkJCUFydGlmYWN0RWRpdCBlZGl0ID0gKEFydGlmYWN0RWRpdCkgd3NBcnRpZmFjdEVkaXRzLmdldChoYW5kbGUpOwotCQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQkJd3NBcnRpZmFjdEVkaXRzLnJlbW92ZShoYW5kbGUpOwotCQkJCQllZGl0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCQkJd3NFbGVtZW50c0NoYW5nZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzeW5jaHJvbml6ZWQgKHdzQ2xpZW50QXJ0aWZhY3RFZGl0cykgewotCQkJaWYgKHdzQ2xpZW50QXJ0aWZhY3RFZGl0cy5jb250YWluc0tleShoYW5kbGUpKSB7Ci0JCQkJQXJ0aWZhY3RFZGl0IGVkaXQgPSAoQXJ0aWZhY3RFZGl0KSB3c0NsaWVudEFydGlmYWN0RWRpdHMuZ2V0KGhhbmRsZSk7Ci0JCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCQl3c0NsaWVudEFydGlmYWN0RWRpdHMucmVtb3ZlKGhhbmRsZSk7Ci0JCQkJCWVkaXQucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJCQl3c0NsaWVudEVsZW1lbnRzQ2hhbmdlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RBcnRpZmFjdEVkaXRzKCkgewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCXRyeSB7Ci0JCQkJaWYgKCFNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpIHx8IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSB8fCBKMkVFUHJvamVjdFV0aWxpdGllcy5pc1N0YXRpY1dlYlByb2plY3QocHJvamVjdCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWFkZEFydGlmYWN0RWRpdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYXJ0aWZhY3QgZWRpdCBpdGVyYXRvciBmb3Igd2ViIHNlcnZpY2UgYXJ0aWZhY3QgZWRpdHMKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0V1NBcnRpZmFjdEVkaXRzKCkgewotCQlzeW5jaHJvbml6ZWQgKHdzQXJ0aWZhY3RFZGl0cykgewotCQkJaWYgKHdzRWxlbWVudHNDaGFuZ2VkKSB7Ci0JCQkJd3NBcnRpZmFjdEVkaXRzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl3c0FydGlmYWN0RWRpdHNMaXN0LmFkZEFsbCh3c0FydGlmYWN0RWRpdHMudmFsdWVzKCkpOwotCQkJCXdzRWxlbWVudHNDaGFuZ2VkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdzQXJ0aWZhY3RFZGl0c0xpc3Q7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZWRpdE1vZGVscy4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkgewotCQlzeW5jaHJvbml6ZWQgKHdzQ2xpZW50QXJ0aWZhY3RFZGl0cykgewotCQkJaWYgKHdzQ2xpZW50RWxlbWVudHNDaGFuZ2VkKSB7Ci0JCQkJd3NDbGllbnRBcnRpZmFjdEVkaXRzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl3c0NsaWVudEFydGlmYWN0RWRpdHNMaXN0LmFkZEFsbCh3c0NsaWVudEFydGlmYWN0RWRpdHMudmFsdWVzKCkpOwotCQkJCXdzQ2xpZW50RWxlbWVudHNDaGFuZ2VkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdzQ2xpZW50QXJ0aWZhY3RFZGl0c0xpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldExpc3RlbmVycygpIHsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQotCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gbGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIEFkZCBhTGlzdGVuZXIgdG8gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKFdlYlNlcnZpY2VNYW5hZ2VyTGlzdGVuZXIgYUxpc3RlbmVyKSB7Ci0JCWlmIChhTGlzdGVuZXIgIT0gbnVsbCAmJiAhZ2V0TGlzdGVuZXJzKCkuY29udGFpbnMoYUxpc3RlbmVyKSkKLQkJCWdldExpc3RlbmVycygpLmFkZChhTGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXIjZWRpdE1vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJaWYgKGFuRXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCk9PUVkaXRNb2RlbEV2ZW50LlVOTE9BREVEX1JFU09VUkNFKSB7Ci0JCQlMaXN0IHJlc291cmNlcyA9IGFuRXZlbnQuZ2V0Q2hhbmdlZFJlc291cmNlcygpOwotCQkJZm9yIChpbnQgaT0wOyBpPHJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCQlpZiAoaXNJbnRlcmVzdGVkSW5SZXNvdXJjZShyZXMpKQotCQkJCQlub3RpZnlMaXN0ZW5lcnMoYW5FdmVudC5nZXRFdmVudENvZGUoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoYW5FdmVudC5nZXRFdmVudENvZGUoKSA9PSBFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRSkgewotCQkJQXJ0aWZhY3RFZGl0TW9kZWwgZWRpdE1vZGVsID0gKEFydGlmYWN0RWRpdE1vZGVsKSBhbkV2ZW50LmdldEVkaXRNb2RlbCgpOwotCQkJaWYgKGVkaXRNb2RlbCA9PSBudWxsIHx8IGVkaXRNb2RlbC5nZXRQcm9qZWN0KCkgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlyZW1vdmVBcnRpZmFjdEVkaXQoZWRpdE1vZGVsLmdldFByb2plY3QoKSk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoYW5FdmVudC5nZXRFdmVudENvZGUoKSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YKLQkgKiAKLQkgKiBAYW5FdmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoaW50IGFuRXZlbnRUeXBlKSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQlpc05vdGlmeWluZyA9IHRydWU7Ci0JCX0KLQkJdHJ5IHsKLQkJCVdlYlNlcnZpY2VFdmVudCB3ZWJTZXJ2aWNlRXZlbnQgPSBudWxsOwotCQkJCi0JCQlzd2l0Y2ggKGFuRXZlbnRUeXBlKSB7Ci0JCQljYXNlIEVkaXRNb2RlbEV2ZW50LlVOTE9BREVEX1JFU09VUkNFOgotCQkJY2FzZSBFZGl0TW9kZWxFdmVudC5QUkVfRElTUE9TRToKLQkJCWNhc2UgRWRpdE1vZGVsRXZlbnQuUkVNT1ZFRF9SRVNPVVJDRToKLQkJCQl3ZWJTZXJ2aWNlRXZlbnQgPSBuZXcgV2ViU2VydmljZUV2ZW50KFdlYlNlcnZpY2VFdmVudC5SRU1PVkUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpZiAoIWdldEFsbFdvcmtzcGFjZVNlcnZpY2VSZWZzKCkuaXNFbXB0eSgpIHx8ICFnZXRBbGxXU0RMU2VydmljZXMoKS5pc0VtcHR5KCkpCi0JCQkJCXdlYlNlcnZpY2VFdmVudCA9IG5ldyBXZWJTZXJ2aWNlRXZlbnQoV2ViU2VydmljZUV2ZW50LlJFRlJFU0gpOwotCQkJfQotCQkJTGlzdCBsaXN0ID0gZ2V0TGlzdGVuZXJzKCk7Ci0JCQlpZiAod2ViU2VydmljZUV2ZW50IT1udWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCSgoV2ViU2VydmljZU1hbmFnZXJMaXN0ZW5lcikgbGlzdC5nZXQoaSkpLndlYlNlcnZpY2VNYW5hZ2VyQ2hhbmdlZCh3ZWJTZXJ2aWNlRXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlzTm90aWZ5aW5nID0gZmFsc2U7Ci0JCQkJaWYgKHJlbW92ZWRMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhcmVtb3ZlZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdmVkTGlzdGVuZXJzLnNpemUoKTsgaSsrKQotCQkJCQkJbGlzdGVuZXJzLnJlbW92ZShyZW1vdmVkTGlzdGVuZXJzLmdldChpKSk7Ci0JCQkJCXJlbW92ZWRMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYUxpc3RlbmVyIGZyb20gdGhlIGxpc3Qgb2YgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmVMaXN0ZW5lcihXZWJTZXJ2aWNlTWFuYWdlckxpc3RlbmVyIGFMaXN0ZW5lcikgewotCQlpZiAoYUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWlmIChpc05vdGlmeWluZykKLQkJCQlyZXR1cm4gcmVtb3ZlZExpc3RlbmVycy5hZGQoYUxpc3RlbmVyKTsKLQkJCXJldHVybiBnZXRMaXN0ZW5lcnMoKS5yZW1vdmUoYUxpc3RlbmVyKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbGVhc2VBcnRpZmFjdEVkaXRzKCkgewotCQlzeW5jaHJvbml6ZWQgKHdzQXJ0aWZhY3RFZGl0cykgewotCQkJSXRlcmF0b3IgaXRlciA9IHdzQXJ0aWZhY3RFZGl0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJV1NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NEREFydGlmYWN0RWRpdCkgaXRlci5uZXh0KCk7Ci0JCQkJYXJ0aWZhY3RFZGl0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQl3c0FydGlmYWN0RWRpdHMuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3luY2hyb25pemVkICh3c0NsaWVudEFydGlmYWN0RWRpdHMpIHsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSB3c0NsaWVudEFydGlmYWN0RWRpdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0NEREFydGlmYWN0RWRpdCkgaXRlci5uZXh0KCk7Ci0JCQkJYXJ0aWZhY3RFZGl0LnJlbW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQl3c0NsaWVudEFydGlmYWN0RWRpdHMuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlhY2NlcHREZWx0YShldmVudCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHREZWx0YShJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCS8vIHNlYXJjaCBmb3IgY2hhbmdlcyB0byBhbnkgcHJvamVjdHMgdXNpbmcgYSB2aXNpdG9yCi0JCWlmIChkZWx0YSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWRlbHRhLmFjY2VwdCh0aGlzKTsKLQkJCQkKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyBhIGxpc3Qgb2YgaW50ZXJuYWwgd2ViIHNlcnZpY2VzIGRlc2NyaXB0aW9ucyBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHVibGljIExpc3QgZ2V0SW50ZXJuYWxXZWJTZXJ2aWNlc0Rlc2NyaXB0aW9ucygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgd2ViU2VydmljZXMgPSBnZXRJbnRlcm5hbFdlYlNlcnZpY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd2ViU2VydmljZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVdlYlNlcnZpY2VzIHdlYlNlcnZpY2UgPSAoV2ViU2VydmljZXMpIHdlYlNlcnZpY2VzLmdldChpKTsKLQkJCWlmICh3ZWJTZXJ2aWNlICE9IG51bGwpCi0JCQkJcmVzdWx0LmFkZEFsbCh3ZWJTZXJ2aWNlLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGFsbCBpbnRlcm5hbCB3ZWIgc2VydmljZXMgaW5zdGFuY2VzIGluIHdvcmtzcGFjZQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEludGVybmFsV2ViU2VydmljZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyID0gZ2V0V1NBcnRpZmFjdEVkaXRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlXU0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0REQXJ0aWZhY3RFZGl0KSBpdGVyLm5leHQoKTsKLQkJCVdlYlNlcnZpY2VzIHdlYlNlcnZpY2VzID0gYXJ0aWZhY3RFZGl0LmdldFdlYlNlcnZpY2VzKCk7Ci0JCQlpZiAod2ViU2VydmljZXMgIT0gbnVsbCkKLQkJCQlyZXN1bHQuYWRkKHdlYlNlcnZpY2VzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgaW50ZXJuYWwgd3NkbCBzZXJ2aWNlcyBpbiB3c2RsJ3MgcG9pbnRlZCB0byBieSB3c2RkJ3MKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcm5hbFdTRExTZXJ2aWNlcygpIHsKLQkJcmV0dXJuIGdldFdTRExTZXJ2aWNlc0Zyb21XU0RMUmVzb3VyY2VzKGdldEludGVybmFsV1NETFJlc291cmNlcygpKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRJbnRlcm5hbFdTRExSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHdzZGRXZWJTZXJ2aWNlcyA9IGdldEludGVybmFsV2ViU2VydmljZXNEZXNjcmlwdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3c2RkV2ViU2VydmljZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3ZWJTZXJ2aWNlcyA9IChXZWJTZXJ2aWNlRGVzY3JpcHRpb24pIHdzZGRXZWJTZXJ2aWNlcy5nZXQoaSk7Ci0JCQlSZXNvdXJjZSB3c2RsID0gZ2V0V1NETFJlc291cmNlKHdlYlNlcnZpY2VzKTsKLQkJCWlmICh3c2RsICE9IG51bGwgJiYgIXJlc3VsdC5jb250YWlucyh3c2RsKSkKLQkJCQlyZXN1bHQuYWRkKHdzZGwpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JCXB1YmxpYyBMaXN0IGdldEV4dGVybmFsV1NETFJlc291cmNlcygpIHsKLQkJCS8vVE9ETyBmaXggdXAgZm9yIGJhc2lzIG9mZiAud3NpbAotCQkJTGlzdCByZXN1bHQgPSBnZXRXb3Jrc3BhY2VXU0RMUmVzb3VyY2VzKCk7Ci0JCQlyZXN1bHQucmVtb3ZlQWxsKGdldEludGVybmFsV1NETFJlc291cmNlcygpKTsKLQkJCUxpc3Qgc2VydmljZVJlZnMgPSBnZXRBbGxXb3Jrc3BhY2VTZXJ2aWNlUmVmcygpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlcnZpY2VSZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU2VydmljZVJlZiByZWYgPSAoU2VydmljZVJlZikgc2VydmljZVJlZnMuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCVJlc291cmNlIHJlcyA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHJlZi5nZXRXc2RsRmlsZSgpKSwgdHJ1ZSk7Ci0JCQkJCWlmIChyZXMgIT1udWxsICYmIHJlc3VsdC5jb250YWlucyhyZXMpKQotCQkJCQkJcmVzdWx0LnJlbW92ZShyZXMpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NlcnZpY2VJbnRlcm5hbChFT2JqZWN0IHNlcnZpY2UpIHsKLQkJcmV0dXJuIGdldEludGVybmFsV1NETFJlc291cmNlcygpLmNvbnRhaW5zKGdldFdTRExSZXNvdXJjZShzZXJ2aWNlKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFdTRExTZXJ2aWNlc0Zyb21XU0RMUmVzb3VyY2VzKExpc3Qgd3NkbFJlc291cmNlcykgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3c2RsUmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlSZXNvdXJjZSB3c2RsID0gKFJlc291cmNlKSB3c2RsUmVzb3VyY2VzLmdldChpKTsKLQkJCUxpc3Qgc2VydmljZXMgPSBnZXRXU0RMU2VydmljZXMod3NkbCk7Ci0JCQlpZiAod3NkbCAhPSBudWxsICYmIHNlcnZpY2VzICE9IG51bGwgJiYgIXNlcnZpY2VzLmlzRW1wdHkoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKHNlcnZpY2VzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEV4dGVybmFsV1NETFNlcnZpY2VzKCkgewotCQlMaXN0IHJlc3VsdCA9IGdldFdzZGxTZXJ2aWNlc0Zyb21Xb3Jrc3BhY2VXU0lMcygpOwotCQlyZXN1bHQucmVtb3ZlQWxsKGdldEludGVybmFsV1NETFNlcnZpY2VzKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdzZGxTZXJ2aWNlc0Zyb21Xb3Jrc3BhY2VXU0lMcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgd3NpbEZpbGVzID0gZ2V0V29ya3NwYWNlV1NJTEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd3NpbEZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmlsZSB3c2lsID0gKElGaWxlKSB3c2lsRmlsZXMuZ2V0KGkpOwotCQkJTGlzdCBzZXJ2aWNlcyA9IGdldFdzZGxTZXJ2aWNlc0Zyb21Xc2lsRmlsZSh3c2lsKTsKLQkJCWlmICghc2VydmljZXMuaXNFbXB0eSgpKQotCQkJCXJlc3VsdC5hZGRBbGwoc2VydmljZXMpOwotCQl9Ci0JcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXc2RsU2VydmljZXNGcm9tV3NpbEZpbGUoSUZpbGUgd3NpbCkgewotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJcmV0dXJuIHNlcnZpY2VIZWxwZXIuZ2V0V3NkbFNlcnZpY2VzRnJvbVdzaWxGaWxlKHdzaWwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIFdTREwgU2VydmljZXMsIGJvdGggaW50ZXJuYWwgYW5kIGV4dGVybmFsCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWxsV1NETFNlcnZpY2VzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChnZXRJbnRlcm5hbFdTRExTZXJ2aWNlcygpKTsKLQkJcmVzdWx0LmFkZEFsbChnZXRFeHRlcm5hbFdTRExTZXJ2aWNlcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJcmVsZWFzZUFydGlmYWN0RWRpdHMoKTsKLQkJSU5TVEFOQ0UgPSBudWxsOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXRXU0RMUmVzb3VyY2UoV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2UpIHsKLQkJaWYgKHdlYlNlcnZpY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgd3NkbEZpbGVOYW1lID0gd2ViU2VydmljZS5nZXRXc2RsRmlsZSgpOwotCQlSZXNvdXJjZSByZXMgPSBudWxsOwotCQlJVmlydHVhbFJlc291cmNlW10gcmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSh3ZWJTZXJ2aWNlKSk7Ci0JCWlmIChyZXNvdXJjZXMgPT0gbnVsbCB8fCByZXNvdXJjZXMubGVuZ3RoPT0wKSByZXR1cm4gcmVzOwotCQlXU0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IGdldEV4aXN0aW5nV1NEREFydGlmYWN0RWRpdChyZXNvdXJjZXNbMF0uZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKGFydGlmYWN0RWRpdCE9bnVsbCkgCi0JCQlyZXMgPSBhcnRpZmFjdEVkaXQuZ2V0V3NkbFJlc291cmNlKHdzZGxGaWxlTmFtZSk7Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCXByaXZhdGUgV1NEREFydGlmYWN0RWRpdCBnZXRFeGlzdGluZ1dTRERBcnRpZmFjdEVkaXQoSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0IHdzRWRpdHMgPSBnZXRXU0FydGlmYWN0RWRpdHMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHdzRWRpdHMuc2l6ZSgpOyBpKyspIHsKLQkJCVdTRERBcnRpZmFjdEVkaXQgZWRpdCA9IChXU0REQXJ0aWZhY3RFZGl0KSB3c0VkaXRzLmdldChpKTsKLQkJCWlmIChlZGl0ICE9bnVsbCAmJiBlZGl0LmdldFByb2plY3QoKSE9IG51bGwgJiYgZWRpdC5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKQotCQkJCXJldHVybiBlZGl0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFdTQ0REQXJ0aWZhY3RFZGl0IGdldEV4aXN0aW5nV1NDRERBcnRpZmFjdEVkaXQoSVByb2plY3QgcHJvamVjdCkgewotCQlMaXN0IHdzQ2xpZW50RWRpdHMgPSBnZXRXU0NsaWVudEFydGlmYWN0RWRpdHMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHdzQ2xpZW50RWRpdHMuc2l6ZSgpOyBpKyspIHsKLQkJCVdTQ0REQXJ0aWZhY3RFZGl0IGVkaXQgPSAoV1NDRERBcnRpZmFjdEVkaXQpIHdzQ2xpZW50RWRpdHMuZ2V0KGkpOwotCQkJaWYgKGVkaXQgIT1udWxsICYmIGVkaXQuZ2V0UHJvamVjdCgpIT0gbnVsbCAmJiBlZGl0LmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpCi0JCQkJcmV0dXJuIGVkaXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0V1NETFNlcnZpY2VzKFJlc291cmNlIHdzZGwpIHsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3QgZGVmID0gc2VydmljZUhlbHBlci5nZXRXU0RMRGVmaW5pdGlvbih3c2RsKTsKLQkJaWYgKGRlZiA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJcmVzdWx0ID0gbmV3IEFycmF5TGlzdChzZXJ2aWNlSGVscGVyLmdldERlZmluaXRpb25TZXJ2aWNlcyhkZWYpLnZhbHVlcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRXU0RMU2VydmljZUZvcldlYlNlcnZpY2UoV2ViU2VydmljZURlc2NyaXB0aW9uIHdlYlNlcnZpY2UpIHsKLQkJRU9iamVjdCBzZXJ2aWNlID0gbnVsbDsKLQkJV1NETFNlcnZpY2VIZWxwZXIgc2VydmljZUhlbHBlciA9IFdTRExTZXJ2aWNlRXh0TWFuYWdlci5nZXRTZXJ2aWNlSGVscGVyKCk7Ci0JCVJlc291cmNlIHdzZGwgPSBnZXRXU0RMUmVzb3VyY2Uod2ViU2VydmljZSk7Ci0JCWlmICh3c2RsID09IG51bGwpIHJldHVybiBzZXJ2aWNlOwotCQlPYmplY3QgZGVmaW5pdGlvbiA9IHNlcnZpY2VIZWxwZXIuZ2V0V1NETERlZmluaXRpb24od3NkbCk7Ci0JCWlmIChkZWZpbml0aW9uID09IG51bGwpIHJldHVybiBzZXJ2aWNlOwotCQlNYXAgc2VydmljZXMgPSBzZXJ2aWNlSGVscGVyLmdldERlZmluaXRpb25TZXJ2aWNlcyhkZWZpbml0aW9uKTsKLQkJaWYgKHNlcnZpY2VzLmlzRW1wdHkoKSkgcmV0dXJuIHNlcnZpY2U7Ci0JCVBvcnRDb21wb25lbnQgcG9ydENvbXAgPSBudWxsOwotCQlpZiAod2ViU2VydmljZS5nZXRQb3J0Q29tcG9uZW50cygpIT1udWxsICYmIHdlYlNlcnZpY2UuZ2V0UG9ydENvbXBvbmVudHMoKS5zaXplKCk+MCkgewotCQkJcG9ydENvbXAgPSAoUG9ydENvbXBvbmVudCkgd2ViU2VydmljZS5nZXRQb3J0Q29tcG9uZW50cygpLmdldCgwKTsKLQkJCXJldHVybiBnZXRTZXJ2aWNlKHBvcnRDb21wKTsKLQkJfQotCQlyZXR1cm4gc2VydmljZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0V1NETFJlc291cmNlKEVPYmplY3Qgd3NkbFNlcnZpY2UpIHsKLQkJcmV0dXJuIHdzZGxTZXJ2aWNlLmVSZXNvdXJjZSgpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldFNlcnZpY2UoUG9ydENvbXBvbmVudCBwb3J0KSB7Ci0JCUxpc3Qgc2VydmljZXMgPSBnZXRJbnRlcm5hbFdTRExTZXJ2aWNlcygpOwotCQlXU0RMU2VydmljZUhlbHBlciBzZXJ2aWNlSGVscGVyID0gV1NETFNlcnZpY2VFeHRNYW5hZ2VyLmdldFNlcnZpY2VIZWxwZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5zaXplKCk7IGkrKykgewotCQkJRU9iamVjdCBzZXJ2aWNlID0gKEVPYmplY3Qpc2VydmljZXMuZ2V0KGkpOwotCQkJaWYgKHNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZVBvcnRzKHNlcnZpY2UpLnNpemUoKSA9PSAxKSB7Ci0JCQkJT2JqZWN0IHdzZGxQb3J0ID0gc2VydmljZUhlbHBlci5nZXRTZXJ2aWNlUG9ydHMoc2VydmljZSkudmFsdWVzKCkudG9BcnJheSgpWzBdOwotCQkJCVN0cmluZyBxTmFtZSA9IHNlcnZpY2VIZWxwZXIuZ2V0UG9ydEJpbmRpbmdOYW1lc3BhY2VVUkkod3NkbFBvcnQpOwotCQkJCWlmIChwb3J0LmdldFdzZGxQb3J0KCkuZ2V0TmFtZXNwYWNlVVJJKCkuZXF1YWxzKHFOYW1lKSkKLQkJCQkJcmV0dXJuIHNlcnZpY2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFBvcnRDb21wb25lbnQgZ2V0UG9ydENvbXBvbmVudChTdHJpbmcgcU5hbWUpIHsKLQkJTGlzdCB3c0Rlc2NzID0gZ2V0SW50ZXJuYWxXZWJTZXJ2aWNlc0Rlc2NyaXB0aW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdzRGVzY3Muc2l6ZSgpOyBpKyspIHsKLQkJCVdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3c0Rlc2MgPSAoV2ViU2VydmljZURlc2NyaXB0aW9uKSB3c0Rlc2NzLmdldChpKTsKLQkJCUxpc3QgcG9ydHMgPSB3c0Rlc2MuZ2V0UG9ydENvbXBvbmVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcG9ydHMuc2l6ZSgpOyBqKyspIHsKLQkJCQlQb3J0Q29tcG9uZW50IHBvcnRDb21wID0gKFBvcnRDb21wb25lbnQpIHBvcnRzLmdldChqKTsKLQkJCQlpZiAocG9ydENvbXAuZ2V0V3NkbFBvcnQoKS5nZXROYW1lc3BhY2VVUkkoKS5lcXVhbHMocU5hbWUpKQotCQkJCQlyZXR1cm4gcG9ydENvbXA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFBvcnRDb21wb25lbnQgZ2V0UG9ydENvbXBvbmVudChTdHJpbmcgcU5hbWUsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdCB3c0Rlc2NzID0gZ2V0SW50ZXJuYWxXZWJTZXJ2aWNlc0Rlc2NyaXB0aW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdzRGVzY3Muc2l6ZSgpOyBpKyspIHsKLQkJCVdlYlNlcnZpY2VEZXNjcmlwdGlvbiB3c0Rlc2MgPSAoV2ViU2VydmljZURlc2NyaXB0aW9uKSB3c0Rlc2NzLmdldChpKTsKLQkJCUxpc3QgcG9ydHMgPSB3c0Rlc2MuZ2V0UG9ydENvbXBvbmVudHMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcG9ydHMuc2l6ZSgpOyBqKyspIHsKLQkJCQlQb3J0Q29tcG9uZW50IHBvcnRDb21wID0gKFBvcnRDb21wb25lbnQpIHBvcnRzLmdldChqKTsKLQkJCQlpZiAocHJvamVjdCA9PSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocG9ydENvbXApKQotCQkJCQlyZXR1cm4gcG9ydENvbXA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFBvcnRDb21wb25lbnQgZ2V0UG9ydENvbXBvbmVudChFT2JqZWN0IHdzZGxTZXJ2aWNlKSB7Ci0JCS8vIElmIHRoZXJlIGlzIG9ubHkgb25lIHBvcnQgaW4gdGhlIHdzZGwgc2VydmljZSwgZmluZCB0aGUgbWF0Y2hpbmcgcG9ydCBjb21wb25lbnQKLQkJLy8gb3RoZXJ3aXNlIGlmIG11bHRpcGxlIHBvcnRzIHJldHVybiBudWxsIGJlY2F1c2Ugd2UgbmVlZCBtb3JlIGluZm9ybWF0aW9uCi0JCVdTRExTZXJ2aWNlSGVscGVyIHNlcnZpY2VIZWxwZXIgPSBXU0RMU2VydmljZUV4dE1hbmFnZXIuZ2V0U2VydmljZUhlbHBlcigpOwotCQlpZiAod3NkbFNlcnZpY2UgPT0gbnVsbCB8fCBzZXJ2aWNlSGVscGVyLmdldFNlcnZpY2VQb3J0cyh3c2RsU2VydmljZSkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChzZXJ2aWNlSGVscGVyLmdldFNlcnZpY2VQb3J0cyh3c2RsU2VydmljZSkuc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0IHBvcnQgPSBzZXJ2aWNlSGVscGVyLmdldFNlcnZpY2VQb3J0cyh3c2RsU2VydmljZSkudmFsdWVzKCkudG9BcnJheSgpWzBdOwotCQkJU3RyaW5nIHFOYW1lID0gc2VydmljZUhlbHBlci5nZXRQb3J0QmluZGluZ05hbWVzcGFjZVVSSShwb3J0KTsKLQkJCXJldHVybiBnZXRQb3J0Q29tcG9uZW50KHFOYW1lLCBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qod3NkbFNlcnZpY2UpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU2VydmljZUltcGxCZWFuIGdldFNlcnZpY2VJbXBsQmVhbihFT2JqZWN0IHdzZGxTZXJ2aWNlKSB7Ci0JCVBvcnRDb21wb25lbnQgcG9ydCA9IGdldFBvcnRDb21wb25lbnQod3NkbFNlcnZpY2UpOwotCQlpZiAocG9ydCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwb3J0LmdldFNlcnZpY2VJbXBsQmVhbigpOwotCX0KLQotCXB1YmxpYyBXc2RkUmVzb3VyY2UgZ2V0V3NkZFJlc291cmNlKEVPYmplY3Qgd3NkbFNlcnZpY2UpIHsKLQkJUG9ydENvbXBvbmVudCBwb3J0ID0gZ2V0UG9ydENvbXBvbmVudCh3c2RsU2VydmljZSk7Ci0JCWlmIChwb3J0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChXc2RkUmVzb3VyY2UpIHBvcnQuZVJlc291cmNlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoRU9iamVjdCB3c2RsU2VydmljZSkgewotCQlQb3J0Q29tcG9uZW50IHBvcnQgPSBnZXRQb3J0Q29tcG9uZW50KHdzZGxTZXJ2aWNlKTsKLQkJaWYgKHBvcnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcG9ydC5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBbGxXb3Jrc3BhY2VTZXJ2aWNlUmVmcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0V29ya3NwYWNlMTNTZXJ2aWNlUmVmcygpKTsKLQkJcmVzdWx0LmFkZEFsbChnZXRXb3Jrc3BhY2UxNFNlcnZpY2VSZWZzKCkpOwotICAgIHJlc3VsdC5hZGRBbGwoZ2V0V29ya3NwYWNlSkVFNVNlcnZpY2VSZWZzKCkpOyAgLy8gTmV3LCBpbmNsdWRlIEpFRSA1IHNlcnZpY2VzIHRvbwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdvcmtzcGFjZTEzU2VydmljZVJlZnMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyID0gZ2V0V1NDbGllbnRBcnRpZmFjdEVkaXRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSAoV1NDRERBcnRpZmFjdEVkaXQpIGl0ZXIubmV4dCgpOwotCQkJV2ViU2VydmljZXNSZXNvdXJjZSByZXMgPSBhcnRpZmFjdEVkaXQuZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5pc0xvYWRlZCgpICYmIHJlcy5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpICE9IG51bGwpIHsKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KGFydGlmYWN0RWRpdC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCUxpc3Qgc2NvcGVkQmVhbnMgPSByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKS5nZXRDb21wb25lbnRTY29wZWRSZWZzKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY29wZWRCZWFucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlDb21wb25lbnRTY29wZWRSZWZzIHJlZkJlYW4gPSAoQ29tcG9uZW50U2NvcGVkUmVmcykgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJcmVzdWx0LmFkZEFsbChyZWZCZWFuLmdldFNlcnZpY2VSZWZzKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlCXJlc3VsdC5hZGRBbGwocmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCkuZ2V0U2VydmljZVJlZnMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXQxM1NlcnZpY2VSZWZzKElQcm9qZWN0IGhhbmRsZSkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJV1NDRERBcnRpZmFjdEVkaXQgd3NDbGllbnRBcnRpZmFjdEVkaXQgPSBnZXRFeGlzdGluZ1dTQ0REQXJ0aWZhY3RFZGl0KGhhbmRsZSk7Ci0JCWlmICh3c0NsaWVudEFydGlmYWN0RWRpdCAhPW51bGwpIHsKLQkJCVdlYlNlcnZpY2VzUmVzb3VyY2UgcmVzID0gd3NDbGllbnRBcnRpZmFjdEVkaXQuZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5pc0xvYWRlZCgpICYmIHJlcy5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpICE9IG51bGwpCi0JCQkJcmVzdWx0LmFkZEFsbChyZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKS5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdvcmtzcGFjZTE0U2VydmljZVJlZnMoKSB7Ci0JCXJldHVybiBnZXRXb3Jrc3BhY2UxNFNlcnZpY2VSZWZzKGdldFdTQ2xpZW50QXJ0aWZhY3RFZGl0cygpKTsKLQl9Ci0gIAotICBwdWJsaWMgTGlzdCBnZXRXb3Jrc3BhY2VKRUU1U2VydmljZVJlZnMoKSB7Ci0gICAgcmV0dXJuIGdldFdvcmtzcGFjZUpFRTVTZXJ2aWNlUmVmcyhnZXRXU0NsaWVudEFydGlmYWN0RWRpdHMoKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgTGlzdCBnZXRXb3Jrc3BhY2VKRUU1U2VydmljZVJlZnMoTGlzdCB3c0NsaWVudEFydGlmYWN0RWRpdHMpIHsKLSAgICByZXR1cm4gZ2V0V29ya3NwYWNlU2VydmljZVJlZnMod3NDbGllbnRBcnRpZmFjdEVkaXRzLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEKTsKLSAgfQotCi0gIHByaXZhdGUgTGlzdCBnZXRXb3Jrc3BhY2UxNFNlcnZpY2VSZWZzKExpc3Qgd3NDbGllbnRBcnRpZmFjdEVkaXRzKSB7Ci0gICAgIHJldHVybiBnZXRXb3Jrc3BhY2VTZXJ2aWNlUmVmcyh3c0NsaWVudEFydGlmYWN0RWRpdHMsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEluY2x1ZGUgSkVFIDUgYW5kL29yIEoyRUUgMS40IHNlcnZpY2UgcmVmcwotICAgKiBAcGFyYW0gd3NDbGllbnRBcnRpZmFjdEVkaXRzCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByaXZhdGUgTGlzdCBnZXRXb3Jrc3BhY2VTZXJ2aWNlUmVmcyhMaXN0IHdzQ2xpZW50QXJ0aWZhY3RFZGl0cywgaW50IHRhcmdldEpFRUxldmVsKSB7Ci0gICAgSXRlcmF0b3IgaXRlciA9IHdzQ2xpZW50QXJ0aWZhY3RFZGl0cy5pdGVyYXRvcigpOwotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgV1NDRERBcnRpZmFjdEVkaXQgd3NjQXJ0aWZhY3RFZGl0ID0gKFdTQ0REQXJ0aWZhY3RFZGl0KSBpdGVyLm5leHQoKTsKLSAgICAgIAotICAgICAgSVByb2plY3QgcHJvamVjdCA9IHdzY0FydGlmYWN0RWRpdC5nZXRQcm9qZWN0KCk7ICAKLSAgICAgIAotICAgICAgU3RyaW5nIHByb2plY3RUeXBlID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RUeXBlKHByb2plY3QpOwotICAgICAgU3RyaW5nIHByb2plY3RWZXJzaW9uID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RWZXJzaW9uKHByb2plY3QpOwotICAgICAgaW50ICAgIGoyZWVMZXZlbCA9ICAwOwotICAgICAgaWYoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRS5lcXVhbHMocHJvamVjdFR5cGUpKXsKLSAgICAgICAgajJlZUxldmVsID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRFSkJWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHByb2plY3RWZXJzaW9uKTsKLSAgICAgIH0gZWxzZSBpZihJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFLmVxdWFscyhwcm9qZWN0VHlwZSkpewotICAgICAgICBqMmVlTGV2ZWwgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFdlYlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQocHJvamVjdFZlcnNpb24pOwotICAgICAgfSBlbHNlIGlmKElNb2R1bGVDb25zdGFudHMuSlNUX0FQUENMSUVOVF9NT0RVTEUuZXF1YWxzKHByb2plY3RUeXBlKSl7Ci0gICAgICAgIGoyZWVMZXZlbCA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0QXBwQ2xpZW50VmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRChwcm9qZWN0VmVyc2lvbik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGNoZWNrIHRoYXQgcHJvamVjdCdzIGoyZWUgbGV2ZWwgaXMgMTQKLSAgICAgIGlmKGoyZWVMZXZlbCAhPSAgdGFyZ2V0SkVFTGV2ZWwpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgCi0gICAgICBBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gQXJ0aWZhY3RFZGl0LmdldEFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7Ci0gICAgICB0cnkgewotICAgICAgICBFT2JqZWN0IHJvb3RPYmplY3QgPSBudWxsOwotICAgICAgICBpZiAoYXJ0aWZhY3RFZGl0IT1udWxsKQotICAgICAgICAgIHJvb3RPYmplY3QgPSBhcnRpZmFjdEVkaXQuZ2V0Q29udGVudE1vZGVsUm9vdCgpOwotICAgICAgICAvLyBoYW5kbGUgRUpCIHByb2plY3QgY2FzZQotICAgICAgICBpZiAocm9vdE9iamVjdCBpbnN0YW5jZW9mIEVKQkphcikgewotICAgICAgICAgIExpc3QgY21wcyA9ICgoRUpCSmFyKSByb290T2JqZWN0KS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNtcHMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgIEVudGVycHJpc2VCZWFuIGJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGNtcHMuZ2V0KGopOwotICAgICAgICAgICAgaWYgKGJlYW4uZ2V0U2VydmljZVJlZnMoKSAhPSBudWxsICYmICFiZWFuLmdldFNlcnZpY2VSZWZzKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKGJlYW4uZ2V0U2VydmljZVJlZnMoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGhhbmRsZSBXZWIgUHJvamVjdAotICAgICAgICBlbHNlIGlmIChyb290T2JqZWN0IGluc3RhbmNlb2YgV2ViQXBwKSB7Ci0gICAgICAgICAgaWYgKCgoV2ViQXBwKSByb290T2JqZWN0KS5nZXRTZXJ2aWNlUmVmcygpICE9IG51bGwgJiYgISgoV2ViQXBwKSByb290T2JqZWN0KS5nZXRTZXJ2aWNlUmVmcygpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoKChXZWJBcHApIHJvb3RPYmplY3QpLmdldFNlcnZpY2VSZWZzKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGhhbmRsZSBBcHAgY2xpZW50cwotICAgICAgICBlbHNlIGlmIChyb290T2JqZWN0IGluc3RhbmNlb2YgQXBwbGljYXRpb25DbGllbnQpIHsKLSAgICAgICAgICBpZiAoKChBcHBsaWNhdGlvbkNsaWVudCkgcm9vdE9iamVjdCkuZ2V0U2VydmljZVJlZnMoKSAhPSBudWxsICYmICEoKEFwcGxpY2F0aW9uQ2xpZW50KSByb290T2JqZWN0KS5nZXRTZXJ2aWNlUmVmcygpLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoKChBcHBsaWNhdGlvbkNsaWVudCkgcm9vdE9iamVjdCkuZ2V0U2VydmljZVJlZnMoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIGlmIChhcnRpZmFjdEVkaXQgIT0gbnVsbCkKLSAgICAgICAgICBhcnRpZmFjdEVkaXQuZGlzcG9zZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0oyRUUxNChTZXJ2aWNlUmVmIHJlZikgewotCQlyZXR1cm4gIShyZWYuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgV2ViU2VydmljZXNDbGllbnQpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdvcmtzcGFjZVdTSUxGaWxlcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBnZXRXU0FydGlmYWN0RWRpdHMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVdTRERBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gKFdTRERBcnRpZmFjdEVkaXQpIGl0ZXIubmV4dCgpOwotCQkJTGlzdCBmaWxlcyA9IGFydGlmYWN0RWRpdC5nZXRXU0lMUmVzb3VyY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGZpbGVzLnNpemUoKTsgaisrKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgZmlsZXMuZ2V0KGopOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgV1NJTF9FWFQuZXF1YWxzKGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpKSkKLQkJCQkJcmVzdWx0LmFkZChmaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFdvcmtzcGFjZVdTRExSZXNvdXJjZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdGVyID0gZ2V0V1NBcnRpZmFjdEVkaXRzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlXU0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IChXU0REQXJ0aWZhY3RFZGl0KSBpdGVyLm5leHQoKTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBhcnRpZmFjdEVkaXQuZ2V0UHJvamVjdCgpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCUxpc3Qgd3NkbFJlc291cmNlcyA9IGFydGlmYWN0RWRpdC5nZXRXU0RMUmVzb3VyY2VzKCk7Ci0JCQkJaWYgKHdzZGxSZXNvdXJjZXMgIT0gbnVsbCAmJiAhd3NkbFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB3c2RsUmVzb3VyY2VzLnNpemUoKTsgaisrKSB7Ci0JCQkJCQlSZXNvdXJjZSB3c2RsID0gKFJlc291cmNlKSB3c2RsUmVzb3VyY2VzLmdldChqKTsKLQkJCQkJCWlmICghcmVzdWx0LmNvbnRhaW5zKHdzZGwpKQotCQkJCQkJCXJlc3VsdC5hZGQod3NkbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRXU0RMU2VydmljZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGludGVybmFsV3NkbHMgPSBnZXRJbnRlcm5hbFdTRExTZXJ2aWNlcygpOwotCQlpZiAoaW50ZXJuYWxXc2RscyAhPSBudWxsICYmICFpbnRlcm5hbFdzZGxzLmlzRW1wdHkoKSkKLQkJCXJlc3VsdC5hZGRBbGwoaW50ZXJuYWxXc2Rscyk7Ci0JCS8vVE9ETyBhZGQgZXh0ZXJuYWxzCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGJlYW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0MTNTZXJ2aWNlUmVmcyhFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCVdTQ0REQXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdCA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKGJlYW4pOwotCQlpZiAoZmlsZSE9bnVsbCkKLQkJCWFydGlmYWN0RWRpdCA9IGdldEV4aXN0aW5nV1NDRERBcnRpZmFjdEVkaXQoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQlpZiAoYXJ0aWZhY3RFZGl0ICE9bnVsbCkgewotCQkJV2ViU2VydmljZXNSZXNvdXJjZSByZXMgPSBhcnRpZmFjdEVkaXQuZ2V0V3NjZGRYbWlSZXNvdXJjZSgpOwotCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5nZXRXZWJTZXJ2aWNlc0NsaWVudCgpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZWpiTmFtZSA9IGJlYW4uZ2V0TmFtZSgpOwotCQkJCUxpc3Qgc2NvcGVzID0gcmVzLmdldFdlYlNlcnZpY2VzQ2xpZW50KCkuZ2V0Q29tcG9uZW50U2NvcGVkUmVmcygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNjb3Blcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJQ29tcG9uZW50U2NvcGVkUmVmcyBzY29wZSA9IChDb21wb25lbnRTY29wZWRSZWZzKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHNjb3BlLmdldENvbXBvbmVudE5hbWUoKS5lcXVhbHMoZWpiTmFtZSkpCi0JCQkJCQlyZXR1cm4gc2NvcGUuZ2V0U2VydmljZVJlZnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNsaWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXQxM1NlcnZpY2VSZWZzKEFwcGxpY2F0aW9uQ2xpZW50IGNsaWVudCkgewotCQlJUHJvamVjdCBoYW5kbGUgPSBnZXRDb21wb25lbnRQcm9qZWN0KFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoY2xpZW50KSk7Ci0JCWlmIChoYW5kbGUgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBnZXRFeGlzdGluZ1dTQ0REQXJ0aWZhY3RFZGl0KGhhbmRsZSk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgIT1udWxsKSB7Ci0JCQlXZWJTZXJ2aWNlc1Jlc291cmNlIHJlcyA9IGFydGlmYWN0RWRpdC5nZXRXc2NkZFhtaVJlc291cmNlKCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlXZWJTZXJ2aWNlc0NsaWVudCB3ZWJDbGllbnQgPSByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKTsKLQkJCQlpZiAod2ViQ2xpZW50ICE9IG51bGwpCi0JCQkJCXJldHVybiB3ZWJDbGllbnQuZ2V0U2VydmljZVJlZnMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gd2ViYXBwCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldDEzU2VydmljZVJlZnMoV2ViQXBwIHdlYmFwcCkgewotCQlJUHJvamVjdCBoYW5kbGUgPSBnZXRDb21wb25lbnRQcm9qZWN0KFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUod2ViYXBwKSk7Ci0JCWlmIChoYW5kbGUgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlXU0NEREFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBnZXRFeGlzdGluZ1dTQ0REQXJ0aWZhY3RFZGl0KGhhbmRsZSk7Ci0JCWlmIChhcnRpZmFjdEVkaXQgIT1udWxsKSB7Ci0JCQlXZWJTZXJ2aWNlc1Jlc291cmNlIHJlcyA9IGFydGlmYWN0RWRpdC5nZXRXc2NkZFhtaVJlc291cmNlKCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlXZWJTZXJ2aWNlc0NsaWVudCB3ZWJDbGllbnQgPSByZXMuZ2V0V2ViU2VydmljZXNDbGllbnQoKTsKLQkJCQlpZiAod2ViQ2xpZW50ICE9IG51bGwpCi0JCQkJCXJldHVybiB3ZWJDbGllbnQuZ2V0U2VydmljZVJlZnMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQlJUHJvamVjdCBwID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCS8vIEhhbmRsZSBwcm9qZWN0IGFkZHMgYW5kIHByb2plY3Qgb3BlbnMKLQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpPT1JUmVzb3VyY2VEZWx0YS5BRERFRCB8fCAoKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgIT0gMCkgJiYgcC5pc0FjY2Vzc2libGUoKSkpKSB7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocCk7Ci0JCQkJaWYgKGNvbXBvbmVudCE9bnVsbCAmJiAhSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHApICYmICFKMkVFUHJvamVjdFV0aWxpdGllcy5pc1N0YXRpY1dlYlByb2plY3QocCkpIHsKLQkJCQkJZ2V0UXVldWVkSm9iKCkuYWRkUHJvamVjdChwKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCS8vIEhhbmRsZSBwcm9qZWN0IGNsb3NlIGV2ZW50cyBhbmQgcmVtb3ZhbHMgCi0JCQllbHNlIGlmICgoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgICYmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pICE9IDApKQotCQkJCQl8fCAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpKXsKLQkJCQlyZW1vdmVBcnRpZmFjdEVkaXQocCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQllbHNlIGlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgaXNJbnRlcnJlc3RlZEluRmlsZSgoSUZpbGUpIHJlc291cmNlKSkgewotCQkJLy8gSGFuZGxlIFdTSUwgYW5kIFdTREwgRmlsZSBhZGRpdGlvbnMgYXMgd2VsbCBhcyB3ZWJzZXJ2aWNlLnhtbCBhbmQgd2Vic2VydmljZWNsaWVudC54bWwKLQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkFEREVEKSB8fCAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkpIHsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscyhXU0RMX0VYVCkpCi0JCQkJICAgIGFkZGVkV3NkbCgoSUZpbGUpIHJlc291cmNlKTsKLQkJCQllbHNlIGlmIChyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFdTSUxfRVhUKSkKLQkJCQkgICAgYWRkZWRXc2lsKChJRmlsZSlyZXNvdXJjZSk7Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19DTElFTlRfU0hPUlROQU1FKSB8fAotCQkJCQkJcmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhKMkVFQ29uc3RhbnRzLldFQl9TRVJWSUNFU19ERF9VUkkpKSB7Ci0JCQkJCWdldFF1ZXVlZEpvYigpLmFkZFByb2plY3QocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJCQl9CQotCQkJfSAKLQkJCS8vIEhhbmRsZSBXU0lMIG9yIFdTREwgZmlsZSByZW1vdmFscwotCQkJZWxzZSBpZiAoKGRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB8fCAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NKSAhPSAwKSkgewotCQkJCWlmIChyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFdTRExfRVhUKSB8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKFdTSUxfRVhUKSkKLQkJCQlub3RpZnlMaXN0ZW5lcnMoRWRpdE1vZGVsRXZlbnQuVU5MT0FERURfUkVTT1VSQ0UpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgUHJvY2Vzc1Byb2plY3RzV2l0aFdTREwgY3JlYXRlUHJvamVjdHNKb2IoKSB7Ci0JCVNldCBuZXdTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlQcm9jZXNzUHJvamVjdHNXaXRoV1NETCBqb2IgPSBuZXcgUHJvY2Vzc1Byb2plY3RzV2l0aFdTREwobmV3U2V0LCBFZGl0TW9kZWxFdmVudC5BRERFRF9SRVNPVVJDRSk7Ci0JCWpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQlqb2Iuc2V0U3lzdGVtKHRydWUpOwotCQlyZXR1cm4gam9iOwotCX0KLQotCXByaXZhdGUgUHJvY2Vzc1Byb2plY3RzV2l0aFdTREwgZ2V0UXVldWVkSm9iKCkgewotCQkKLQkJaWYgKHByb2Nlc3NOZXdQcm9qZWN0cyAhPSBudWxsICYmIChwcm9jZXNzTmV3UHJvamVjdHMuZ2V0U3RhdGUoKSA9PSBKb2IuV0FJVElORykpewotCQkJcmV0dXJuIHByb2Nlc3NOZXdQcm9qZWN0czsKLQkJfSBlbHNlIHsKLQkJCXByb2Nlc3NOZXdQcm9qZWN0cyA9IGNyZWF0ZVByb2plY3RzSm9iKCk7Ci0JCQlwcm9jZXNzTmV3UHJvamVjdHMuc2NoZWR1bGUoKTsKLQkJfQotCQlyZXR1cm4gcHJvY2Vzc05ld1Byb2plY3RzOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIFByb2Nlc3NQcm9qZWN0c1dpdGhXU0RMIGV4dGVuZHMgSm9iCi0JewotCQlwcml2YXRlIFNldCBjdXJyZW50UHJvamVjdHM7Ci0JCXByaXZhdGUgaW50IGV2ZW50VHlwZTsKLQkJCi0JCXB1YmxpYyBQcm9jZXNzUHJvamVjdHNXaXRoV1NETChTZXQgcCwgaW50IG5ld0V2ZW50VHlwZSkKLQkJewotCQkJc3VwZXIoIkxvYWRpbmcgYXJ0aWZhY3QgZWRpdCBmb3IgcHJvamVjdCIpOwotCQkJY3VycmVudFByb2plY3RzID0gcDsKLQkJCWV2ZW50VHlwZSA9IG5ld0V2ZW50VHlwZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkUHJvamVjdChJUHJvamVjdCBwKSB7Ci0JCQlzeW5jaHJvbml6ZWQoY3VycmVudFByb2plY3RzKSB7Ci0JCQkJY3VycmVudFByb2plY3RzLmFkZChwKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCS8vIE51bGwgb3V0IGpvYiBmb3IgcHJvY2Vzc2luZyBuZXcgcHJvamVjdHMKLQkJCXN5bmNocm9uaXplZCAocHJvY2Vzc05ld1Byb2plY3RzKSB7Ci0JCQkJaWYocHJvY2Vzc05ld1Byb2plY3RzID09IHRoaXMpewotCQkJCQlwcm9jZXNzTmV3UHJvamVjdHMgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjdXJyZW50UHJvamVjdHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gKElQcm9qZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJYWRkQXJ0aWZhY3RFZGl0KGN1cnJlbnRQcm9qZWN0KTsKLQkJCX0KLQkJCW5vdGlmeUxpc3RlbmVycyhldmVudFR5cGUpOwotCQkJCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZGVkV3NkbChJRmlsZSB3c2RsKSB7Ci0JCWlmICghd3NkbC5leGlzdHMoKSkKLQkJCXJldHVybjsKLQkJSVByb2plY3QgaGFuZGxlID0gZ2V0Q29tcG9uZW50UHJvamVjdCh3c2RsKTsKLQkJaWYgKGhhbmRsZSAhPSBudWxsKSB7Ci0JCQlhZGRBcnRpZmFjdEVkaXQoaGFuZGxlKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhFZGl0TW9kZWxFdmVudC5MT0FERURfUkVTT1VSQ0UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkZWRXc2lsKElGaWxlIHdzaWwpIHsKLQkJaWYgKCF3c2lsLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlJUHJvamVjdCBoYW5kbGUgPSBnZXRDb21wb25lbnRQcm9qZWN0KHdzaWwpOwotCQlpZiAoaGFuZGxlICE9IG51bGwpIHsKLQkJCWFkZEFydGlmYWN0RWRpdChoYW5kbGUpOwotCQkJbm90aWZ5TGlzdGVuZXJzKEVkaXRNb2RlbEV2ZW50LkxPQURFRF9SRVNPVVJDRSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRDb21wb25lbnRQcm9qZWN0KElGaWxlIHJlcykgewotCQlpZiAocmVzPT1udWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiByZXMuZ2V0UHJvamVjdCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW50ZXJyZXN0ZWRJbkZpbGUoSUZpbGUgYUZpbGUpIHsKLQkJcmV0dXJuIGlzRmlsZUludGVyZXN0aW5nKGFGaWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIG9ubHkgcmVzb3VyY2VzIHdlYnNlcnZpY2UgbWFuYWdlciBpcyBjb25jZXJuZWQgYWJvdXQgYXJlOgotCSAqIHdlYnNlcnZpY2UueG1sLCB3ZWJzZXJ2aWNlY2xpZW50LnhtbCwgYW5kIEoyRUUgMS40IHdlYi54bWwsIGVqYi1qYXIteG1sLCBhbmQgYXBwbGljYXRpb24tY2xpZW50LnhtbAotCSAqIEBwYXJhbSByZXMKLQkgKiBAcmV0dXJuIGJvb2xlYW4gaXNJbnRlcmVzdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW50ZXJlc3RlZEluUmVzb3VyY2UoUmVzb3VyY2UgcmVzKSB7Ci0JCWlmIChyZXMgaW5zdGFuY2VvZiBXc2RkUmVzb3VyY2UgfHwgcmVzIGluc3RhbmNlb2YgV2ViU2VydmljZXNSZXNvdXJjZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAocmVzIGluc3RhbmNlb2YgRUpCUmVzb3VyY2UgfHwgcmVzIGluc3RhbmNlb2YgV2ViQXBwUmVzb3VyY2UgfHwgcmVzIGluc3RhbmNlb2YgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSkgewotCQkJcmV0dXJuICgoWE1MUmVzb3VyY2UpcmVzKS5nZXRKMkVFVmVyc2lvbklEKCk+SjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFNlcnZpY2VSZWZzKEVKQkphciBqYXIpIHsKLQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYmVhbnMgPSBqYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJlYW5zLnNpemUoKTsgaSsrKSB7Ci0JCQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IChFbnRlcnByaXNlQmVhbikgYmVhbnMuZ2V0KGkpOwotCQkJCWxpc3QuYWRkQWxsKGdldFNlcnZpY2VSZWZzKGJlYW4pKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0U2VydmljZVJlZnMoRW50ZXJwcmlzZUJlYW4gYmVhbikgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChiZWFuLmdldEVqYkphcigpLmdldEoyRUVWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLQkJCWxpc3QuYWRkQWxsKGJlYW4uZ2V0U2VydmljZVJlZnMoKSk7Ci0JCWVsc2UKLQkJCWxpc3QuYWRkQWxsKGdldDEzU2VydmljZVJlZnMoYmVhbikpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRTZXJ2aWNlUmVmcyhXZWJBcHAgd2ViYXBwKSB7Ci0KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJaWYgKHdlYmFwcC5nZXRWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEKQotCQkJCWxpc3QuYWRkQWxsKHdlYmFwcC5nZXRTZXJ2aWNlUmVmcygpKTsKLQkJCWVsc2UKLQkJCQlsaXN0LmFkZEFsbChnZXQxM1NlcnZpY2VSZWZzKHdlYmFwcCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRTZXJ2aWNlUmVmcyhBcHBsaWNhdGlvbkNsaWVudCBjbGllbnQpIHsKLQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlpZiAoY2xpZW50LmdldEoyRUVWZXJzaW9uSUQoKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLQkJCQlsaXN0LmFkZEFsbChjbGllbnQuZ2V0U2VydmljZVJlZnMoKSk7Ci0JCQllbHNlCi0JCQkJbGlzdC5hZGRBbGwoZ2V0MTNTZXJ2aWNlUmVmcyhjbGllbnQpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wbHVnaW4vV2ViU2VydmljZVBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wbHVnaW4vV2ViU2VydmljZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Y0MzNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcGx1Z2luL1dlYlNlcnZpY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDI4LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VQbHVnaW4gZXh0ZW5kcyBXVFBQbHVnaW4gaW1wbGVtZW50cyBSZXNvdXJjZUxvY2F0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZVBsdWdpbiBzaW5nbGV0b247Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoc2luZ2xldG9uID09IG51bGwpCi0JCQlzaW5nbGV0b24gPSB0aGlzOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luI2dldFBsdWdpbklEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIHJlc291cmNlIGFzIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4gaW5zdGFsbAotCSAqIGxvY2F0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gQW4gaW1hZ2UgZGVzY3JpcHRvciwgcG9zc2libHkgbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCVVSTCBpbnN0YWxsVVJMID0gZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlVUkwgaW1hZ2VVUkwgPSBuZXcgVVJMKGluc3RhbGxVUkwsIG5hbWUpOwotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKGltYWdlVVJMKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luLiBFcXVpdmFsZW50IHRvIGNhbGxpbmcKLQkgKiAoQVRLVUlQbHVnaW4pUGxhdGZvcm0uZ2V0UGx1Z2luKCJjb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLmF0ay51aSIpOwotCSAqIAotCSAqIEByZXR1cm4gVGhlIEFUS1VJUGx1Z2luIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgcHVibGljIFdlYlNlcnZpY2VQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZSBzdHJpbmcgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhlIHBsdWdpbi5wcm9wZXJ0aWVzIGZpbGUgZm9yCi0JICogdGhlIGFwcHJvcHJpYXRlIGxvY2FsZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSBrZXkgc3RyaW5nIHByZWZpeGVkIGJ5IGEgIiUiIHN5bWJvbC4gVGhhdCBpcywgdGhlIHN0cmluZyBwYXNzZWQgaW4KLQkgKiAgICAgICAgICAgIG11c3QgYmUgb2YgdGhlIGZvcm0gIiVLRVkiIHdoZXJlIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGNvbnRhaW5zIGEgbGluZSBvZiB0aGUKLQkgKiAgICAgICAgICAgIGZvcm06ICJLRVkgPSB2YWx1ZSIuCi0JICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLCBrZXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugc3RyaW5nIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIGtleSBmcm9tIHRoZSBwbHVnaW4ucHJvcGVydGllcyBmaWxlIGZvcgotCSAqIHRoZSBhcHByb3ByaWF0ZSBsb2NhbGUuIFN1YnN0aXR1dGlvbiBzZXF1ZW5jZXMgaW4gdGhlIG1lc3NhZ2Ugc3RyaW5nIGFyZSByZXBsYWNlZCBieSB0aGUKLQkgKiBnaXZlbiBhcnJheSBvZiBzdWJzdGl0dXRpb24gb2JqZWN0cyAod2hpY2ggYXJlIG1vc3QgZnJlcXVlbnRseSBzdHJpbmdzKS4gU2VlCi0JICogamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiBzdWJzdGl0dXRpb24uCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2Uga2V5IHN0cmluZyBwcmVmaXhlZCBieSBhICIlIiBzeW1ib2wuIFRoYXQgaXMsIHRoZSBzdHJpbmcgcGFzc2VkIGluCi0JICogICAgICAgICAgICBtdXN0IGJlIG9mIHRoZSBmb3JtICIlS0VZIiB3aGVyZSB0aGUgcGx1Z2luLnByb3BlcnRpZXMgZmlsZSBjb250YWlucyBhIGxpbmUgb2YgdGhlCi0JICogICAgICAgICAgICBmb3JtOiAiS0VZID0gdmFsdWUiLgotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBUaGUgc3Vic3RpdHV0aW9uIHZhbHVlcyBmb3IgdGhlIG1lc3NhZ2UgYXMgcmVxdWlyZWQgYnkgdGhlIG1lc3NhZ2UgaW4KLQkgKiAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzIGFuZCBieSB0aGUgcnVsZXMgb2YgY2xhc3MgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuCi0JICogQHJldHVybiBUaGUgbG9jYWxlLXNwZWNpZmljIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRNZXNzYWdlKGtleSksIGFyZ3MpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIGZyb20gd2hpY2ggYWxsIHJlc291cmNlcyBhcmUgYmFzZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgVVJMIGZyb20gd2hpY2ggYWxsIHJlc291cmNlcyBhcmUgYmFzZWQuCi0JICovCi0JcHVibGljIFVSTCBnZXRCYXNlVVJMKCkgewotCQlTdHJpbmcgaW5zdGFsbFVSTCA9IGdldFBsdWdpbkluc3RhbGxMb2NhdGlvbigpOwotCQlpZiAoaW5zdGFsbFVSTCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoaW5zdGFsbFVSTCk7Ci0JCQkJc2IuYXBwZW5kKCJwbHVnaW4ucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBVUkwoc2IudG9TdHJpbmcoKSk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgdGhlIGltYWdlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBrZXkuIFRoZSBkZXNjcmlwdGlvbiB3aWxsIHR5cGljYWxseSBiZSBpbiB0aGUgZm9ybSBvZiBhIFVSTCB0byB0aGUgaW1hZ2UgZGF0YS4gQ3JlYXRpb24gb2YgYW4KLQkgKiBhY3R1YWwgaW1hZ2UgZGVwZW5kcyBvbiB0aGUgR1VJIGVudmlyb25tZW50OyB3aXRoaW4gRWNsaXBzZSwKLQkgKiBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnkgY2FuIGJlIHVzZWQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIGtleSBvZiB0aGUgaW1hZ2UgcmVzb3VyY2UuCi0JICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gb24gdGhlIGltYWdlIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKGtleSk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCXJldHVybiBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5TdGF0ZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbih0aGlzKS5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLnRvT1NTdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbkluc3RhbGxMb2NhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQbGF0Zm9ybS5yZXNvbHZlKGdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSkuZ2V0RmlsZSgpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUga2V5IG9mIHRoZSBzdHJpbmcgcmVzb3VyY2UuCi0JICogQHJldHVybiB0aGUgc3RyaW5nIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldE1lc3NhZ2Uoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LCBhbmQgcGVmb3JtcyBzdWJzdGl0dXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBrZXkgb2YgdGhlIHN0cmluZy4KLQkgKiBAcGFyYW0gc3Vic3RpdHV0aW9ucwotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2Ugc3Vic3RpdHV0aW9ucy4KLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LgotCSAqIEBzZWUgI2dldFN0cmluZyhTdHJpbmcpCi0JICogQHNlZSBNZXNzYWdlRm9ybWF0I2Zvcm1hdChTdHJpbmcsIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIHN1YnN0aXR1dGlvbnMpIHsKLQkJcmV0dXJuIGdldE1lc3NhZ2Uoa2V5LCBzdWJzdGl0dXRpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgb25jZSBieSB0aGUgcGxhdGZvcm0gd2hlbiB0aGlzIHBsdWdpbiBpcyBmaXJzdCBsb2FkZWQuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhpcyBwbHVnaW4gZmFpbHMgdG8gc3RhcnQuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIG9uY2UgYnkgdGhlIHBsYXRmb3JtIHdoZW4gdGhpcyBwbHVnaW4gaXMgdW5sb2FkZWQuCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgSWYgdGhpcyBwbHVnaW4gZmFpbHMgdG8gc2h1dGRvd24uCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBib29sZWFuIHRyYW5zbGF0ZSkgewotCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBPYmplY3RbXSBzdWJzdGl0dXRpb25zLCBib29sZWFuIHRyYW5zbGF0ZSkgewotCQkvLyBUT0RPIEZvciBub3cuLi4gIHRyYW5zbGF0ZSBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBnZXRTdHJpbmcoa2V5LHN1YnN0aXR1dGlvbnMpOwotCX0KLQkKLQotCS8qKgotCSAqIFJlY29yZCBhbiBlcnJvciBhZ2FpbnN0IHRoaXMgcGx1Z2luJ3MgbG9nLiAKLQkgKiAKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gYW5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoaW50IGFDb2RlLCBTdHJpbmcgYU1lc3NhZ2UsCi0JCQlUaHJvd2FibGUgYW5FeGNlcHRpb24pIHsKLQkJZ2V0SW5zdGFuY2UoKS5nZXRMb2coKS5sb2coCi0JCQkJY3JlYXRlRXJyb3JTdGF0dXMoYUNvZGUsIGFNZXNzYWdlLCBhbkV4Y2VwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIFJlY29yZCBhIG1lc3NhZ2UgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IHNldmVyaXR5LCBpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJbG9nKGNyZWF0ZVN0YXR1cyhzZXZlcml0eSwgYUNvZGUsIGFNZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZWNvcmQgYSBzdGF0dXMgYWdhaW5zdCB0aGlzIHBsdWdpbidzIGxvZy4gCi0JICogCi0JICogQHBhcmFtIGFTdGF0dXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgYVN0YXR1cykgewotCQlnZXRJbnN0YW5jZSgpLmdldExvZygpLmxvZyhhU3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGx1Z2luLgotCSAqICAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHJldHVybiBBIHN0YXR1cyBjb25maWd1cmVkIHdpdGggdGhpcyBwbHVnaW4ncyBpZCBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIGludCBhQ29kZSwKLQkJCVN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwKLQkJCQlhTWVzc2FnZSAhPSBudWxsID8gYU1lc3NhZ2UgOiAiTm8gbWVzc2FnZS4iLCBleGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFDb2RlCi0JICogQHBhcmFtIGFNZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gQSBzdGF0dXMgY29uZmlndXJlZCB3aXRoIHRoaXMgcGx1Z2luJ3MgaWQgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjcmVhdGVFcnJvclN0YXR1cyhpbnQgYUNvZGUsIFN0cmluZyBhTWVzc2FnZSwKLQkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDgzZjkwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCXByaXZhdGUgQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzXzsKLQotCXB1YmxpYyBBVEtVSUFkYXB0ZXJGYWN0b3J5KCkgewotCQlhZGFwdGVyRmFjdG9yaWVzXyA9IG5ldyBBZGFwdGVyRmFjdG9yeVs0XTsKLQkJYWRhcHRlckZhY3Rvcmllc19bMF0gPSBuZXcgV3NkZEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWFkYXB0ZXJGYWN0b3JpZXNfWzFdID0gbmV3IEFUS1VJV3NjZGRBZGFwdGVyRmFjdG9yeSgpOwotCQlhZGFwdGVyRmFjdG9yaWVzX1syXSA9IG5ldyBBVEtVSVdzY29tbW9uQWRhcHRlckZhY3RvcnkoKTsKLQkJYWRhcHRlckZhY3Rvcmllc19bM10gPSBuZXcgQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeSgpOwotCi0JfQotCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3QgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBOb3RpZmllcikgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzXy5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBvYmplY3QgPSBhZGFwdGVyRmFjdG9yaWVzX1tpXS5hZGFwdCh0YXJnZXQsIHR5cGUpOwotCQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvbHZlKHRhcmdldCwgdHlwZSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQlPYmplY3Qgb2JqZWN0ID0gYWRhcHQoKE9iamVjdCkgdGFyZ2V0LCB0eXBlKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXIpIHsKLQkJCXJldHVybiAoQWRhcHRlcikgb2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHtAbGluayAjYWRhcHQoT2JqZWN0LE9iamVjdCkgYWRhcHQoT2JqZWN0LCBPYmplY3QpfWZvciBvYmplY3RzIHRoYXQgYXJlbid0Ci0JICogbm90aWZpZXJzLgotCSAqIAotCSAqIEBwYXJhbSBhbgotCSAqICAgICAgICAgICAgYXJiaXRyYXJ5IG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGtleSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGFkYXB0ZXIgcmVxdWlyZWQuCi0JICogQHJldHVybiB0aGUgb2JqZWN0IGl0c2VsZi4KLQkgKiBAc2VlICNhZGFwdChPYmplY3QsT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVzb2x2ZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gcmVzb2x2ZUVMaXN0KChFTGlzdCkgb2JqZWN0LCB0eXBlKTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gcmVzb2x2ZUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0LCB0eXBlKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgcmVzb2x2ZUVMaXN0KEVMaXN0IGVMaXN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoZUxpc3Quc2l6ZSgpID4gMCkKLQkJCXJldHVybiBhZGFwdChlTGlzdC5nZXQoMCksIHR5cGUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCByZXNvbHZlQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0sIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiByZXNvbHZlRUxpc3QoYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKSwgdHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkoKFdzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3Rvcmllc19bMF0pLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJKChBVEtVSVdzY2RkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3JpZXNfWzFdKS5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCSgoQVRLVUlXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yaWVzX1syXSkuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQkoKEFUS1VJQ29tbW9uQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3JpZXNfWzNdKS5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUNvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYWQxYWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUNvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgQVRLVUlDb21tb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYXJhbVZhbHVlQWRhcHRlcigpIHsKLQkJaWYgKHBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlQYXJhbVZhbHVlSXRlbVByb3ZpZGVyKHRoaXMpOwotCi0JCXJldHVybiBwYXJhbVZhbHVlSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVFOYW1lQWRhcHRlcigpIHsKLQkJaWYgKHFOYW1lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXFOYW1lSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJUU5hbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcU5hbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0KLQkvKgotCSAqIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBIZWFkZXJBZGFwdGVyKCkgeyBpZiAoc29hcEhlYWRlckl0ZW1Qcm92aWRlciA9PSBudWxsKQotCSAqIHNvYXBIZWFkZXJJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlTT0FQSGVhZGVySXRlbVByb3ZpZGVyKHRoaXMpOyByZXR1cm4KLQkgKiBzb2FwSGVhZGVySXRlbVByb3ZpZGVyOyB9Ci0JICogCi0JICogcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUFJvbGVBZGFwdGVyKCkgeyBpZiAoc29hcFJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkgKiBzb2FwUm9sZUl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVNPQVBSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOyByZXR1cm4gc29hcFJvbGVJdGVtUHJvdmlkZXI7IH0KLQkgKiAKLQkgKiBwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0TmFtZUFkYXB0ZXIoKSB7IGlmIChwb3J0TmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKQotCSAqIHBvcnROYW1lSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIodGhpcyk7IHJldHVybiBwb3J0TmFtZUl0ZW1Qcm92aWRlcjsgfQotCSAqICAKLQkgKi8KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzZjM0OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkNvbXBvbmVudFNjb3BlZFJlZnM7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZygoKENvbXBvbmVudFNjb3BlZFJlZnMpIG9iamVjdCkuZ2V0Q29tcG9uZW50TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyZjMyYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5IYW5kbGVyOwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBIYW5kbGVySXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoKChIYW5kbGVyKSBvYmplY3QpLmdldEhhbmRsZXJOYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGphdmFDbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQlyZXR1cm4gKGNsYXNzTmFtZSAhPSBudWxsKSA/IGNsYXNzTmFtZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlJbml0UGFyYW1JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlJbml0UGFyYW1JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNiMGM1ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlJbml0UGFyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJbml0UGFyYW1JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJSW5pdFBhcmFtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJSW5pdFBhcmFtIGluaXRQYXJhbSA9IChJbml0UGFyYW0pIG9iamVjdDsKLQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJY2FzZSAwIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKGluaXRQYXJhbS5nZXRQYXJhbU5hbWUoKSk7Ci0JCQljYXNlIDEgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoaW5pdFBhcmFtLmdldFBhcmFtVmFsdWUoKSk7Ci0JCQljYXNlIDIgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcoaW5pdFBhcmFtLmdldERlc2NyaXB0aW9uKCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXNiLmFwcGVuZChpbml0UGFyYW0uZ2V0UGFyYW1OYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgiPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKGluaXRQYXJhbS5nZXRQYXJhbVZhbHVlKCkpOwotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlQYXJhbVZhbHVlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWM0NTBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlQYXJhbVZhbHVlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEFUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlciBleHRlbmRzIFBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVBhcmFtVmFsdWUgaW5pdFBhcmFtID0gKFBhcmFtVmFsdWUpIG9iamVjdDsKLQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJY2FzZSAwIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKGluaXRQYXJhbS5nZXROYW1lKCkpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKGluaXRQYXJhbS5nZXRWYWx1ZSgpKTsKLQkJCWNhc2UgMiA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhpbml0UGFyYW0uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJc2IuYXBwZW5kKGluaXRQYXJhbS5nZXROYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgiPSIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKGluaXRQYXJhbS5nZXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxZWYxYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZjsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgUG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJUG9ydENvbXBvbmVudFJlZiBwb3J0Q29tcFJlZiA9IChQb3J0Q29tcG9uZW50UmVmKSBvYmplY3Q7Ci0JCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhwb3J0Q29tcFJlZi5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSk7Ci0JCQljYXNlIDEgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcocG9ydENvbXBSZWYuZ2V0UG9ydENvbXBvbmVudExpbmsoKSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHBvcnRDb21wUmVmLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKEphdmFDbGFzcyBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGphdmFDbGFzcy5nZXRRdWFsaWZpZWROYW1lRm9yUmVmbGVjdGlvbigpOwotCQlyZXR1cm4gKGNsYXNzTmFtZSAhPSBudWxsKSA/IGNsYXNzTmFtZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVBvcnROYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNlYWIzMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUKLSAqIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWU7Ci0KLQotcHVibGljIGNsYXNzIEFUS1VJUG9ydE5hbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQb3J0TmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlQb3J0TmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVBvcnROYW1lIHBvcnROYW1lID0gKFBvcnROYW1lKSBvYmplY3Q7Ci0JCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcocG9ydE5hbWUuZ2V0UG9ydE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIElUYWJsZUxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uSW1hZ2UuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlRTmFtZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVFOYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MzgzOWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVFOYW1lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSVFOYW1lSXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVJdGVtTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEFUS1VJUU5hbWVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlRTmFtZSBxbmFtZSA9IChRTmFtZSkgb2JqZWN0OwotCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQljYXNlIDAgOgotCQkJCXJldHVybiB0b0Rpc3BsYXlTdHJpbmcocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHFuYW1lLmdldExvY2FsUGFydCgpKTsKLQkJCWRlZmF1bHQgOgotCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQlzYi5hcHBlbmQocW5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQkJCXNiLmFwcGVuZCgiIyIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKHFuYW1lLmdldExvY2FsUGFydCgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU09BUEhlYWRlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNPQVBIZWFkZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwOTc1Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU09BUEhlYWRlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyOwotCi0KLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlTT0FQSGVhZGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgU09BUEhlYWRlckl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlTT0FQSGVhZGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJU09BUEhlYWRlciBzb2FwSGVhZGVyID0gKFNPQVBIZWFkZXIpIG9iamVjdDsKLQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJY2FzZSAwIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHNvYXBIZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQkJY2FzZSAxIDoKLQkJCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKHNvYXBIZWFkZXIuZ2V0TG9jYWxQYXJ0KCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXNiLmFwcGVuZChzb2FwSGVhZGVyLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJCQlzYi5hcHBlbmQoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZChzb2FwSGVhZGVyLmdldExvY2FsUGFydCgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJU09BUFJvbGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTT0FQUm9sZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzIzZDI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTT0FQUm9sZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZTsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlTT0FQUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIFNPQVBSb2xlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSVNPQVBSb2xlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJU09BUFJvbGUgc29hcFJvbGUgPSAoU09BUFJvbGUpIG9iamVjdDsKLQkJcmV0dXJuIHRvRGlzcGxheVN0cmluZyhzb2FwUm9sZS5nZXRTb2FwUm9sZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNlcnZpY2VSZWZJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTRhN2MuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVNlcnZpY2VSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLkFkYXB0ZXJWaWV3ZXJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuU2VydmljZVJlZjsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgU2VydmljZVJlZkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwdWJsaWMgQVRLVUlTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBJVGFibGVMYWJlbFByb3ZpZGVyLmdldENvbHVtblRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdG9EaXNwbGF5U3RyaW5nKCgoU2VydmljZVJlZikgb2JqZWN0KS5nZXRTZXJ2aWNlUmVmTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgSVRhYmxlTGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhKYXZhQ2xhc3MgamF2YUNsYXNzKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBqYXZhQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZUZvclJlZmxlY3Rpb24oKTsKLQkJcmV0dXJuIChjbGFzc05hbWUgIT0gbnVsbCkgPyBjbGFzc05hbWUgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzFmMWFhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBBVEtVSVdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgV2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIgewotCXB1YmxpYyBBVEtVSVdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlmZWF0dXJlID0gV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5nZXRXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UoKS5nZXRXZWJTZXJ2aWNlc0NsaWVudF9Db21wb25lbnRTY29wZWRSZWZzKCk7Ci0JCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkuZ2V0TmFtZSgpKSkKLQkJCXJlc3VsdC5hZGQoU2VjdGlvbkNvbXBvbmVudFNjb3BlZFJlZkhlbHBlci5nZXRXc0NsaWVudCgpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV2ViU2VydmljZXNDbGllbnQuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRNZXNzYWdlKCIlTEFCRUxfVU5RVUFMSUZJRURfQ09NUE9ORU5UIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV3NjZGRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9BVEtVSVdzY2RkQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3ZDlmYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV3NjZGRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLQotCi1wdWJsaWMgY2xhc3MgQVRLVUlXc2NkZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIEFUS1VJV3NjZGRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWJTZXJ2aWNlc0NsaWVudEFkYXB0ZXIoKSB7Ci0JCWlmICh3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJd2ViU2VydmljZXNDbGllbnRJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIHdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvbmVudFNjb3BlZFJlZnNBZGFwdGVyKCkgewotCQlpZiAoY29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJY29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSUNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBjb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRDb21wb25lbnRSZWZBZGFwdGVyKCkgewotCQlpZiAocG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJcG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBwb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NsaWVudC51dGlsLldlYnNlcnZpY2VfY2xpZW50QWRhcHRlckZhY3RvcnkjY3JlYXRlU2VydmljZVJlZkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCkgewotCQlpZiAoc2VydmljZVJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJc2VydmljZVJlZkl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSVNlcnZpY2VSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NsaWVudC51dGlsLldlYnNlcnZpY2VfY2xpZW50QWRhcHRlckZhY3RvcnkjY3JlYXRlSGFuZGxlckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhhbmRsZXJBZGFwdGVyKCkgewotCQlpZiAoaGFuZGxlckl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJaGFuZGxlckl0ZW1Qcm92aWRlciA9IG5ldyBBVEtVSUhhbmRsZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBoYW5kbGVySXRlbVByb3ZpZGVyOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0FUS1VJV3Njb21tb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDZmOTQwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQVRLVUlXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgQVRLVUlXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIEFUS1VJV3Njb21tb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCkgewotCQlpZiAoaW5pdFBhcmFtSXRlbVByb3ZpZGVyID09IG51bGwpCi0JCQlpbml0UGFyYW1JdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlJbml0UGFyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBpbml0UGFyYW1JdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUEhlYWRlckFkYXB0ZXIoKSB7Ci0JCWlmIChzb2FwSGVhZGVySXRlbVByb3ZpZGVyID09IG51bGwpCi0JCQlzb2FwSGVhZGVySXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJU09BUEhlYWRlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIHNvYXBIZWFkZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUFJvbGVBZGFwdGVyKCkgewotCQlpZiAoc29hcFJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkKLQkJCXNvYXBSb2xlSXRlbVByb3ZpZGVyID0gbmV3IEFUS1VJU09BUFJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBzb2FwUm9sZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0TmFtZUFkYXB0ZXIoKSB7Ci0JCWlmIChwb3J0TmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKQotCQkJcG9ydE5hbWVJdGVtUHJvdmlkZXIgPSBuZXcgQVRLVUlQb3J0TmFtZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJcmV0dXJuIHBvcnROYW1lSXRlbVByb3ZpZGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Fic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQWJzdHJhY3RBVEtVSUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDYwY2Y0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQWJzdHJhY3RBVEtVSUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLQotCi0vLyBOb24tZ2VuZXJhdGVkIHByb3ZpZGVyIGNvZGUKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QVRLVUlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIHsKLQlwdWJsaWMgQWJzdHJhY3RBVEtVSUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGFkYXB0ZXIncyByZXNvdXJjZXMuCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvRGlzcGxheVN0cmluZyhTdHJpbmcgcykgewotCQlyZXR1cm4gKHMgIT0gbnVsbCkgPyBzIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0JlYW5MaW5rSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0JlYW5MaW5rSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzA0ODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9CZWFuTGlua0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkJlYW5MaW5rfW9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuTGlua0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmVhbkxpbmtJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBCZWFuTGluay5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0JlYW5MaW5rIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IHJldHVybiBnZXRTdHJpbmcoIl9VSV9CZWFuTGlua190eXBlIik7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCIlX1VJX0JlYW5MaW5rX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGUyMTM5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuQ29tcG9uZW50U2NvcGVkUmVmc30KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQ29tcG9uZW50TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29tcG9uZW50IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29tcG9uZW50U2NvcGVkUmVmc19jb21wb25lbnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbXBvbmVudFNjb3BlZFJlZnNfY29tcG9uZW50TmFtZV9mZWF0dXJlIiwgIl9VSV9Db21wb25lbnRTY29wZWRSZWZzX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRTY29wZWRSZWZzX0NvbXBvbmVudE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50U2NvcGVkUmVmc19TZXJ2aWNlUmVmcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbXBvbmVudFNjb3BlZFJlZnMuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi9Db21wb25lbnRTY29wZWRSZWZzLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPQotCSAqICgoQ29tcG9uZW50U2NvcGVkUmVmcylvYmplY3QpLmdldENvbXBvbmVudE5hbWUoKTsgcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JICogZ2V0U3RyaW5nKCJfVUlfQ29tcG9uZW50U2NvcGVkUmVmc190eXBlIikgOiBnZXRTdHJpbmcoIl9VSV9Db21wb25lbnRTY29wZWRSZWZzX3R5cGUiKSArICIgIiArCi0JICogbGFiZWw7IH0KLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb21wb25lbnRTY29wZWRSZWZzKSBvYmplY3QpLmdldENvbXBvbmVudE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9Db21wb25lbnRTY29wZWRSZWZzX3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29tcG9uZW50U2NvcGVkUmVmcy5jbGFzcykpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkNPTVBPTkVOVF9TQ09QRURfUkVGU19fQ09NUE9ORU5UX05BTUUgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuQ09NUE9ORU5UX1NDT1BFRF9SRUZTX19TRVJWSUNFX1JFRlMgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb25lbnRTY29wZWRSZWZzX1NlcnZpY2VSZWZzKCksIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZVJlZigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1NmY1Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl9pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX2lkX2ZlYXR1cmUiLCAiX1VJX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX0VsZW1lbnROYW1lcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db25zdHJ1Y3RvclBhcmFtZXRlck9yZGVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuQ09OU1RSVUNUT1JfUEFSQU1FVEVSX09SREVSX19FTEVNRU5UX05BTUVTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJfRWxlbWVudE5hbWVzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVsZW1lbnROYW1lKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9EZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzRlNmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9EZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5EZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZXNjcmlwdGlvblR5cGUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZXNjcmlwdGlvblR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVzY3JpcHRpb25UeXBlKSBvYmplY3QpLmdldExhbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Rlc2NyaXB0aW9uVHlwZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaXB0aW9uVHlwZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Rpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9EaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3NmFmOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0Rpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkRpc3BsYXlOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGV9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlciBleHRlbmRzIERpc3BsYXlOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERpc3BsYXlOYW1lVHlwZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0Rpc3BsYXlOYW1lVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEaXNwbGF5TmFtZVR5cGUpIG9iamVjdCkuZ2V0TGFuZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlzcGxheU5hbWVUeXBlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlzcGxheU5hbWVUeXBlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRUpCTGlua0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FSkJMaW5rSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZmI2ZjkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FSkJMaW5rSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkVKQkxpbmt9b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVKQkxpbmtJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCZWFuTGlua0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFSkJMaW5rSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEVqYkxpbmtQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX0VKQkxpbmtfaWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfRUpCTGlua19pZF9mZWF0dXJlIiwgIl9VSV9FSkJMaW5rX3R5cGUiKSwgV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEVKQkxpbmtfSWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVqYiBMaW5rIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVqYkxpbmtQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0VKQkxpbmtfZWpiTGlua19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FSkJMaW5rX2VqYkxpbmtfZmVhdHVyZSIsICJfVUlfRUpCTGlua190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJMaW5rX0VqYkxpbmsoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRUpCTGluay5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvc2Vzc2lvbkJlYW5fb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKEVKQkxpbmspb2JqZWN0KS5nZXRJZCgpOyByZXR1cm4gbGFiZWwgPT0KLQkgKiBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9FSkJMaW5rX3R5cGUiKSA6IGdldFN0cmluZygiX1VJX0VKQkxpbmtfdHlwZSIpICsgIiAiICsKLQkgKiBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRUpCTGluaykgb2JqZWN0KS5nZXRFamJMaW5rKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfRUpCTGlua190eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFSkJMaW5rLmNsYXNzKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5FSkJfTElOS19fRUpCX0xJTksgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0VsZW1lbnROYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0VsZW1lbnROYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjllMWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9FbGVtZW50TmFtZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5FbGVtZW50TmFtZX0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnROYW1lSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGVtZW50TmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVGV4dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0VsZW1lbnROYW1lX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsZW1lbnROYW1lX2lkX2ZlYXR1cmUiLCAiX1VJX0VsZW1lbnROYW1lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWxlbWVudE5hbWVfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRleHQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGV4dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfRWxlbWVudE5hbWVfdGV4dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FbGVtZW50TmFtZV90ZXh0X2ZlYXR1cmUiLCAiX1VJX0VsZW1lbnROYW1lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWxlbWVudE5hbWVfVGV4dCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFbGVtZW50TmFtZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0VsZW1lbnROYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEVsZW1lbnROYW1lKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9FbGVtZW50TmFtZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0VsZW1lbnROYW1lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRWxlbWVudE5hbWUuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRUxFTUVOVF9OQU1FX19URVhUIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0V4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmJiM2E4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvRXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5FeGNlcHRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkV4Y2VwdGlvbk1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEV4Y2VwdGlvblR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxNZXNzYWdlUGFydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FeGNlcHRpb25NYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfRXhjZXB0aW9uTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvbk1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEV4Y2VwdGlvbiBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4Y2VwdGlvblR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfZXhjZXB0aW9uVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FeGNlcHRpb25NYXBwaW5nX2V4Y2VwdGlvblR5cGVfZmVhdHVyZSIsICJfVUlfRXhjZXB0aW9uTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvbk1hcHBpbmdfRXhjZXB0aW9uVHlwZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBNZXNzYWdlIFBhcnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9FeGNlcHRpb25NYXBwaW5nX3dzZGxNZXNzYWdlUGFydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRXhjZXB0aW9uTWFwcGluZ193c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiLCAiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvbk1hcHBpbmdfV3NkbE1lc3NhZ2UoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4Y2VwdGlvbk1hcHBpbmdfQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEV4Y2VwdGlvbk1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9FeGNlcHRpb25NYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEV4Y2VwdGlvbk1hcHBpbmcpIG9iamVjdCkuZ2V0V3NkbE1lc3NhZ2VQYXJ0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRXhjZXB0aW9uTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0V4Y2VwdGlvbk1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFeGNlcHRpb25NYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkVYQ0VQVElPTl9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0VYQ0VQVElPTl9UWVBFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5FWENFUFRJT05fTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX1dTRExfTUVTU0FHRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuRVhDRVBUSU9OX01BUFBJTkdfX0NPTlNUUlVDVE9SX1BBUkFNRVRFUl9PUkRFUiA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX1dzZGxNZXNzYWdlKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExNZXNzYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGNlcHRpb25NYXBwaW5nX0NvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXIoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSGFuZGxlckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9IYW5kbGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YzU1YTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9IYW5kbGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuSGFuZGxlcn1vYmplY3QuIDwhLS0KLSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSGFuZGxlckl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEhhbmRsZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSGFuZGxlck5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNvYXBSb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUG9ydE5hbWVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRIYW5kbGVyQ2xhc3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhhbmRsZXIgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIYW5kbGVyTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfaGFuZGxlck5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9IYW5kbGVyX2hhbmRsZXJOYW1lX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9IYW5kbGVyTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU29hcCBSb2xlcyBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb2FwUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9IYW5kbGVyX3NvYXBSb2xlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfc29hcFJvbGVzX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwUm9sZXMoKSwgZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3J0IE5hbWVzIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBvcnROYW1lc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfcG9ydE5hbWVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl9wb3J0TmFtZXNfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1BvcnROYW1lcygpLCBmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhhbmRsZXIgQ2xhc3MgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGFuZGxlckNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl9oYW5kbGVyQ2xhc3NfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCksIGZhbHNlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcEhlYWRlcnMoKSk7Ci0vLwkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJOYW1lKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSGFuZGxlci5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL29iajE2L2hhbmRsZXIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoSGFuZGxlcilvYmplY3QpLmdldEhhbmRsZXJOYW1lKCk7Ci0JICogcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0hhbmRsZXJfdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChIYW5kbGVyKSBvYmplY3QpLmdldEhhbmRsZXJOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl90eXBlIikgOiBnZXRTdHJpbmcoIiVfVUlfSGFuZGxlcl90eXBlIikgKyAiOiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSGFuZGxlci5jbGFzcykpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX0hBTkRMRVJfTkFNRSA6Ci0JCQljYXNlIFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5IQU5ETEVSX19TT0FQX1JPTEVTIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLkhBTkRMRVJfX1BPUlRfTkFNRVMgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fSU5JVF9QQVJBTVMgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCksIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtVmFsdWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRTmFtZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU09BUEhlYWRlcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBIZWFkZXJzKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUG9ydCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Jbml0UGFyYW1JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSW5pdFBhcmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MDI0M2YuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Jbml0UGFyYW1JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW19Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0UGFyYW1JdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEFUS1VJSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRQYXJhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQkvL3BnbSBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUGFyYW1OYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYXJhbVZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfSW5pdFBhcmFtX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX0luaXRQYXJhbV9pZF9mZWF0dXJlIiwgIl9VSV9Jbml0UGFyYW1fdHlwZSIpLAotCSAqIFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQYXJhbSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0luaXRQYXJhbV9wYXJhbU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9Jbml0UGFyYW1fcGFyYW1OYW1lX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX1BhcmFtTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFyYW0gVmFsdWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1WYWx1ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX0luaXRQYXJhbV9wYXJhbVZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfSW5pdFBhcmFtX3BhcmFtVmFsdWVfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0UGFyYW1fUGFyYW1WYWx1ZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9Jbml0UGFyYW1fZGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9Jbml0UGFyYW1fZGVzY3JpcHRpb25fZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQgCi0JCQkJCVdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdFBhcmFtX0Rlc2NyaXB0aW9uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbV9EZXNjcmlwdGlvblR5cGVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSW5pdFBhcmFtLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvaW5pdGlhbGl6X3BhcmFtZXRlci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChJbml0UGFyYW0pb2JqZWN0KS5nZXRQYXJhbU5hbWUoKTsKLQkgKiByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSW5pdFBhcmFtX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfSW5pdFBhcmFtX3R5cGUiKSArICIgIiArIGxhYmVsOyB9IC8qCi0JICogCi0JICogLyoqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+IEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJSW5pdFBhcmFtIGluaXRQYXJhbSA9IChJbml0UGFyYW0pIG9iamVjdDsKLQkJU3RyaW5nIG5hbWUgPSBpbml0UGFyYW0uZ2V0UGFyYW1OYW1lKCk7Ci0JCVN0cmluZyB2YWx1ZSA9IGluaXRQYXJhbS5nZXRQYXJhbVZhbHVlKCk7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwIHx8IHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBnZXRTdHJpbmcoIiVfVUlfSW5pdFBhcmFtX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWxhYmVsLmFwcGVuZChuYW1lKTsKLQkJbGFiZWwuYXBwZW5kKCI9Iik7IC8vJE5PTi1OTFMtMSQKLQkJbGFiZWwuYXBwZW5kKHZhbHVlKTsKLQkJcmV0dXJuIGxhYmVsLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEluaXRQYXJhbS5jbGFzcykpIHsKLQkJCS8vcGdtIGNhc2UgV3Njb21tb25QYWNrYWdlLklOSVRfUEFSQU1fX0lEOgotCQkJY2FzZSBXc2NvbW1vblBhY2thZ2UuSU5JVF9QQVJBTV9fUEFSQU1fTkFNRSA6Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19QQVJBTV9WQUxVRSA6Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIFdzY29tbW9uUGFja2FnZS5JTklUX1BBUkFNX19ERVNDUklQVElPTl9UWVBFUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRQYXJhbV9EZXNjcmlwdGlvblR5cGVzKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsgcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsgfQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCUluaXRQYXJhbSBwYXJhbSA9IChJbml0UGFyYW0pIG9iamVjdDsKLQkJaWYgKHBhcmFtLmdldFBhcmFtTmFtZSgpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQocGFyYW0uZ2V0UGFyYW1OYW1lKCkpOwotCQlpZiAocGFyYW0uZ2V0UGFyYW1WYWx1ZSgpICE9IG51bGwpCi0JCQljaGlsZHJlbi5hZGQocGFyYW0uZ2V0UGFyYW1WYWx1ZSgpKTsKLQkJaWYgKHBhcmFtLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLQkJCWNoaWxkcmVuLmFkZChwYXJhbS5nZXREZXNjcmlwdGlvbigpKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9JbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0ludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxMmNhYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0ludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEludGVyZmFjZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9JbnRlcmZhY2VNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfSW50ZXJmYWNlTWFwcGluZ190eXBlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0phdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRhYzU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfSmF2YVdTRExNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0phdmFXU0RMTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9KYXZhV1NETE1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19QYWNrYWdlTWFwcGluZ3MoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19KYXZhWE1MVHlwZU1hcHBpbmdzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfRXhjZXB0aW9uTWFwcGluZ3MoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19JbnRlcmZhY2VNYXBwaW5ncygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEphdmFXU0RMTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0phdmFXU0RMTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChKYXZhV1NETE1hcHBpbmcpIG9iamVjdCkuZ2V0SWQoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0phdmFXU0RMTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX0phdmFXU0RMTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEphdmFXU0RMTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfV1NETF9NQVBQSU5HX19QQUNLQUdFX01BUFBJTkdTIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5KQVZBX1dTRExfTUFQUElOR19fSkFWQV9YTUxfVFlQRV9NQVBQSU5HUyA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0VYQ0VQVElPTl9NQVBQSU5HUyA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9XU0RMX01BUFBJTkdfX0lOVEVSRkFDRV9NQVBQSU5HUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfUGFja2FnZU1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhY2thZ2VNYXBwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSmF2YVhNTFR5cGVNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhWE1MVHlwZU1hcHBpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFXU0RMTWFwcGluZ19FeGNlcHRpb25NYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGNlcHRpb25NYXBwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSW50ZXJmYWNlTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW50ZXJmYWNlTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVdTRExNYXBwaW5nX0ludGVyZmFjZU1hcHBpbmdzKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhV1NETE1hcHBpbmdfSW50ZXJmYWNlTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL0phdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJlMTkxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFYTUxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhWE1MVHlwZU1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDbGFzc1R5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFFuYW1lU2NvcGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFub255bW91c1R5cGVRbmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDbGFzcyBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENsYXNzVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX2NsYXNzVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfY2xhc3NUeXBlX2ZlYXR1cmUiLCAiX1VJX0phdmFYTUxUeXBlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19DbGFzc1R5cGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFFuYW1lIFNjb3BlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFFuYW1lU2NvcGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19xbmFtZVNjb3BlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19xbmFtZVNjb3BlX2ZlYXR1cmUiLCAiX1VJX0phdmFYTUxUeXBlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFYTUxUeXBlTWFwcGluZ19RbmFtZVNjb3BlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBbm9ueW1vdXMgVHlwZSBRbmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm9ueW1vdXNUeXBlUW5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0phdmFYTUxUeXBlTWFwcGluZ19hbm9ueW1vdXNUeXBlUW5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX2Fub255bW91c1R5cGVRbmFtZV9mZWF0dXJlIiwgIl9VSV9KYXZhWE1MVHlwZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfQW5vbnltb3VzVHlwZVFuYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhWE1MVHlwZU1hcHBpbmdfUm9vdFR5cGVRbmFtZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBKYXZhWE1MVHlwZU1hcHBpbmcuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9KYXZhWE1MVHlwZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSmF2YVhNTFR5cGVNYXBwaW5nKSBvYmplY3QpLmdldEFub255bW91c1R5cGVRbmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfSmF2YVhNTFR5cGVNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSmF2YVhNTFR5cGVNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfVFlQRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19RTkFNRV9TQ09QRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19BTk9OWU1PVVNfVFlQRV9RTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuSkFWQV9YTUxfVFlQRV9NQVBQSU5HX19ST09UX1RZUEVfUU5BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLkpBVkFfWE1MX1RZUEVfTUFQUElOR19fVkFSSUFCTEVfTUFQUElOR1MgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1Jvb3RUeXBlUW5hbWUoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9vdFR5cGVRbmFtZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YVhNTFR5cGVNYXBwaW5nX1ZhcmlhYmxlTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVmFyaWFibGVNYXBwaW5nKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9KYXhycGNtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9KYXhycGNtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzNkNmVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvSmF4cnBjbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLmludGVybmFsLnV0aWwuSmF4cnBjbWFwQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuIFRoZQotICogYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0bwotICoge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF4cnBjbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBKYXhycGNtYXBBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDaGFuZ2VOb3RpZmllciBjaGFuZ2VOb3RpZmllciA9IG5ldyBDaGFuZ2VOb3RpZmllcigpOwotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiBhbGwgdGhlIHN1cHBvcnRlZCB0eXBlcyBjaGVja2VkIGJ5Ci0JICoge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSmF4cnBjbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlciBqYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVdTRExNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YVdTRExNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKGphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlqYXZhV1NETE1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgSmF2YVdTRExNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGphdmFXU0RMTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgcGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYWNrYWdlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChwYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBQYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwYWNrYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlciBqYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSmF2YVhNTFR5cGVNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSmF2YVhNTFR5cGVNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKGphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlqYXZhWE1MVHlwZU1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgSmF2YVhNTFR5cGVNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGphdmFYTUxUeXBlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyIGV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRXhjZXB0aW9uTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4Y2VwdGlvbk1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoZXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlleGNlcHRpb25NYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IEV4Y2VwdGlvbk1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZXhjZXB0aW9uTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUludGVyZmFjZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgc2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ30uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nfWluc3RhbmNlcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmd9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlciByb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb290VHlwZVFuYW1lQWRhcHRlcigpIHsKLQkJaWYgKHJvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBSb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIgdmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlZhcmlhYmxlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhcmlhYmxlTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmICh2YXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB2YXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExNZXNzYWdlSXRlbVByb3ZpZGVyIHdzZGxNZXNzYWdlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExNZXNzYWdlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETE1lc3NhZ2VBZGFwdGVyKCkgewotCQlpZiAod3NkbE1lc3NhZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd3NkbE1lc3NhZ2VJdGVtUHJvdmlkZXIgPSBuZXcgV1NETE1lc3NhZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbE1lc3NhZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLkNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJ9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlciBjb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuQ29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlcn0uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJBZGFwdGVyKCkgewotCQlpZiAoY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb25zdHJ1Y3RvclBhcmFtZXRlck9yZGVySXRlbVByb3ZpZGVyID0gbmV3IENvbnN0cnVjdG9yUGFyYW1ldGVyT3JkZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29uc3RydWN0b3JQYXJhbWV0ZXJPcmRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudE5hbWVJdGVtUHJvdmlkZXIgZWxlbWVudE5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuRWxlbWVudE5hbWV9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbGVtZW50TmFtZUFkYXB0ZXIoKSB7Ci0JCWlmIChlbGVtZW50TmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQllbGVtZW50TmFtZUl0ZW1Qcm92aWRlciA9IG5ldyBFbGVtZW50TmFtZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50TmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlciB3c2RsU2VydmljZU5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFNlcnZpY2VOYW1lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFNlcnZpY2VOYW1lQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsU2VydmljZU5hbWVJdGVtUHJvdmlkZXIgPSBuZXcgV1NETFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9ydE1hcHBpbmdJdGVtUHJvdmlkZXIgcG9ydE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuUG9ydE1hcHBpbmd9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQb3J0TWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChwb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwb3J0TWFwcGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExQb3J0VHlwZUl0ZW1Qcm92aWRlciB3c2RsUG9ydFR5cGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFBvcnRUeXBlQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxQb3J0VHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsUG9ydFR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxQb3J0VHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmd9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETEJpbmRpbmdJdGVtUHJvdmlkZXIgd3NkbEJpbmRpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETEJpbmRpbmd9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXU0RMQmluZGluZ0FkYXB0ZXIoKSB7Ci0JCWlmICh3c2RsQmluZGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsQmluZGluZ0l0ZW1Qcm92aWRlciA9IG5ldyBXU0RMQmluZGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3c2RsQmluZGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyIHNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9ufWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIgd3NkbE9wZXJhdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMT3BlcmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETE9wZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh3c2RsT3BlcmF0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdzZGxPcGVyYXRpb25JdGVtUHJvdmlkZXIgPSBuZXcgV1NETE9wZXJhdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3c2RsT3BlcmF0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlciBtZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAobWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmd9aW5zdGFuY2VzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlciB3c2RsUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZ30uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAod3NkbFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsUmV0dXJuVmFsdWVNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciB3c2RsTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VNYXBwaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETE1lc3NhZ2VNYXBwaW5nQWRhcHRlcigpIHsKLQkJaWYgKHdzZGxNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsTWVzc2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgV1NETE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdzZGxNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZX1pbnN0YW5jZXMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXU0RMTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyIHdzZGxNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdTRExNZXNzYWdlUGFydE5hbWVBZGFwdGVyKCkgewotCQlpZiAod3NkbE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3c2RsTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyID0gbmV3IFdTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZ31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyIGludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUludGVyZmFjZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAoaW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSkgfHwgc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHN1YnN0aXR1dGVzIHRoZSBmYWN0b3J5IGl0c2VsZiBhcyB0aGUga2V5IGZvciB0aGUgYWRhcHRlci4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3MpIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5yZW1vdmVMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayAjY2hhbmdlTm90aWZpZXJ9YW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0KLQkJaWYgKHBhcmVudEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3MjU4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL01ldGhvZFBhcmFtUGFydHNNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5NZXRob2RQYXJhbVBhcnRzTWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLk1ldGhvZFBhcmFtUGFydHNNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQYXJhbVBhcnRzTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBhcmFtUG9zaXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBhcmFtVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhcmFtIFBvc2l0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtUG9zaXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3BhcmFtUG9zaXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfcGFyYW1Qb3NpdGlvbl9mZWF0dXJlIiwgIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nX1BhcmFtUG9zaXRpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhcmFtIFR5cGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFyYW1UeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ19wYXJhbVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfcGFyYW1UeXBlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfUGFyYW1UeXBlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYXJhbVBhcnRzTWFwcGluZ19Xc2RsTWVzc2FnZU1hcHBpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RQYXJhbVBhcnRzTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZFBhcmFtUGFydHNNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZFBhcmFtUGFydHNNYXBwaW5nKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RQYXJhbVBhcnRzTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFBhcmFtUGFydHNNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuTUVUSE9EX1BBUkFNX1BBUlRTX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fUEFSQU1fUE9TSVRJT04gOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLk1FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HX19QQVJBTV9UWVBFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5NRVRIT0RfUEFSQU1fUEFSVFNfTUFQUElOR19fV1NETF9NRVNTQUdFX01BUFBJTkcgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdfV3NkbE1lc3NhZ2VNYXBwaW5nKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExNZXNzYWdlTWFwcGluZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzNGU5ZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuUGFja2FnZU1hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5QYWNrYWdlTWFwcGluZ31vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhY2thZ2VNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYWNrYWdlVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTmFtZXNwYWNlVVJJUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUGFja2FnZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUGFja2FnZU1hcHBpbmdfaWRfZmVhdHVyZSIsICJfVUlfUGFja2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFja2FnZSBUeXBlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhY2thZ2VUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9QYWNrYWdlTWFwcGluZ19wYWNrYWdlVHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QYWNrYWdlTWFwcGluZ19wYWNrYWdlVHlwZV9mZWF0dXJlIiwgIl9VSV9QYWNrYWdlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhY2thZ2VNYXBwaW5nX1BhY2thZ2VUeXBlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOYW1lc3BhY2UgVVJJIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVzcGFjZVVSSVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUGFja2FnZU1hcHBpbmdfbmFtZXNwYWNlVVJJX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BhY2thZ2VNYXBwaW5nX25hbWVzcGFjZVVSSV9mZWF0dXJlIiwgIl9VSV9QYWNrYWdlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFBhY2thZ2VNYXBwaW5nX05hbWVzcGFjZVVSSSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQYWNrYWdlTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BhY2thZ2VNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBhY2thZ2VNYXBwaW5nKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9QYWNrYWdlTWFwcGluZ190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1BhY2thZ2VNYXBwaW5nX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUGFja2FnZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUEFDS0FHRV9NQVBQSU5HX19QQUNLQUdFX1RZUEUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlBBQ0tBR0VfTUFQUElOR19fTkFNRVNQQUNFX1VSSSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0MWQyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5hZGFwdGVyLkFkYXB0ZXJWaWV3ZXJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50fQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQb3J0Q29tcG9uZW50TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTbWFsbEljb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZExhcmdlSWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX1BvcnRDb21wb25lbnRfaWRfZmVhdHVyZSIsICJfVUlfUG9ydENvbXBvbmVudF90eXBlIiksCi0JICogV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfSWQoKSwgdHJ1ZSwKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcnQgQ29tcG9uZW50IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUG9ydENvbXBvbmVudE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRfcG9ydENvbXBvbmVudE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydENvbXBvbmVudF9wb3J0Q29tcG9uZW50TmFtZV9mZWF0dXJlIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfUG9ydENvbXBvbmVudE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydENvbXBvbmVudF9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfUG9ydENvbXBvbmVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1NlcnZpY2VFbmRwb2ludEludGVyZmFjZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU21hbGwgSWNvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTbWFsbEljb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRfc21hbGxJY29uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRDb21wb25lbnRfc21hbGxJY29uX2ZlYXR1cmUiLCAiX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9TbWFsbEljb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExhcmdlIEljb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGFyZ2VJY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X2xhcmdlSWNvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3J0Q29tcG9uZW50X2xhcmdlSWNvbl9mZWF0dXJlIiwgIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfTGFyZ2VJY29uKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZXNjcmlwdGlvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF9kZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb3J0Q29tcG9uZW50X2Rlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX1BvcnRDb21wb25lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzcGxheSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X2Rpc3BsYXlOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRDb21wb25lbnRfZGlzcGxheU5hbWVfZmVhdHVyZSIsICJfVUlfUG9ydENvbXBvbmVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9Xc2RsUG9ydCgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfU2VydmljZUltcGxCZWFuKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9IYW5kbGVycygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfRGVzY3JpcHRpb25UeXBlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EaXNwbGF5TmFtZVR5cGUoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0ljb25UeXBlKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9ydENvbXBvbmVudC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeyByZXR1cm4KLQkgKiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qb3J0Q29tcG9uZW50Iik7IH0KLQkgKi8KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9Ci0JICogKChQb3J0Q29tcG9uZW50KW9iamVjdCkuZ2V0UG9ydENvbXBvbmVudE5hbWUoKTsgcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JICogZ2V0U3RyaW5nKCJfVUlfUG9ydENvbXBvbmVudF90eXBlIikgOiBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9ydENvbXBvbmVudC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvcG9ydGNvbXBvbmVudC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBvcnRDb21wb25lbnQpIG9iamVjdCkuZ2V0UG9ydENvbXBvbmVudE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9Qb3J0Q29tcG9uZW50X3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBvcnRDb21wb25lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19QT1JUX0NPTVBPTkVOVF9OQU1FIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NNQUxMX0lDT04gOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fTEFSR0VfSUNPTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX19ESVNQTEFZX05BTUUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fV1NETF9QT1JUIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX1NFUlZJQ0VfSU1QTF9CRUFOIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0hBTkRMRVJTIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuUE9SVF9DT01QT05FTlRfX0RFU0NSSVBUSU9OX1RZUEUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fRElTUExBWV9OQU1FX1RZUEUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5QT1JUX0NPTVBPTkVOVF9fSUNPTl9UWVBFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X1dzZGxQb3J0KCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUG9ydCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfU2VydmljZUltcGxCZWFuKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2aWNlSW1wbEJlYW4oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0hhbmRsZXJzKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVIYW5kbGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudF9EZXNjcmlwdGlvblR5cGUoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0Q29tcG9uZW50X0Rpc3BsYXlOYW1lVHlwZSgpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnRDb21wb25lbnRfSWNvblR5cGUoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWNvblR5cGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVufWJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgI2dldENoaWxkcmVuUmVmZXJlbmNlcyBnZXRDaGlsZHJlblJlZmVyZW5jZXN9YW5kIHVzaW5nIHRob3NlIHRvIGNvbGxlY3QgdGhlIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUVMaXN0KChFTGlzdCkgb2JqZWN0KTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oKEFkYXB0ZXJWaWV3ZXJJdGVtKSBvYmplY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21FTGlzdChFTGlzdCBlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuKGl0Lm5leHQoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwM2YyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LlBvcnRDb21wb25lbnRSZWZ9b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUG9ydENvbXBvbmVudExpbmtQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9ydCBDb21wb25lbnQgTGluayBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQb3J0Q29tcG9uZW50TGlua1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX1BvcnRDb21wb25lbnRSZWZfcG9ydENvbXBvbmVudExpbmtfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9Qb3J0Q29tcG9uZW50UmVmX3BvcnRDb21wb25lbnRMaW5rX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9Qb3J0Q29tcG9uZW50TGluaygpLCBmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcnZpY2UgRW5kcG9pbnQgSW50ZXJmYWNlIGZlYXR1cmUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX1BvcnRDb21wb25lbnRSZWZfc2VydmljZUVuZHBvaW50SW50ZXJmYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfUG9ydENvbXBvbmVudFJlZl9zZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VfZmVhdHVyZV9kZXNjIiksIC8vJE5PTi1OTFMtMSQgCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydENvbXBvbmVudFJlZl9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgZmFsc2UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQb3J0Q29tcG9uZW50UmVmLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvcG9ydGNvbXBvbmVudC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0KLQkgKiAoKFBvcnRDb21wb25lbnRSZWYpb2JqZWN0KS5nZXRQb3J0Q29tcG9uZW50TGluaygpOyByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PQotCSAqIDAgPyBnZXRTdHJpbmcoIl9VSV9Qb3J0Q29tcG9uZW50UmVmX3R5cGUiKSA6IGdldFN0cmluZygiX1VJX1BvcnRDb21wb25lbnRSZWZfdHlwZSIpICsgIiAiICsKLQkgKiBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUG9ydENvbXBvbmVudFJlZikgb2JqZWN0KS5nZXRQb3J0Q29tcG9uZW50TGluaygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX1BvcnRDb21wb25lbnRSZWZfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUG9ydENvbXBvbmVudFJlZi5jbGFzcykpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlBPUlRfQ09NUE9ORU5UX1JFRl9fUE9SVF9DT01QT05FTlRfTElOSyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1BvcnRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0N2Q4ZTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0TWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlBvcnRNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5Qb3J0TWFwcGluZ30KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvcnRNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3J0TWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUG9ydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEphdmFQb3J0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnRNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnRNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX1BvcnRNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydE1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBvcnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQb3J0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfUG9ydE1hcHBpbmdfcG9ydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydE1hcHBpbmdfcG9ydE5hbWVfZmVhdHVyZSIsICJfVUlfUG9ydE1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0TWFwcGluZ19Qb3J0TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSmF2YSBQb3J0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVBvcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Qb3J0TWFwcGluZ19qYXZhUG9ydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9ydE1hcHBpbmdfamF2YVBvcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1BvcnRNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UG9ydE1hcHBpbmdfSmF2YVBvcnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBvcnRNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUG9ydE1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUG9ydE1hcHBpbmcpIG9iamVjdCkuZ2V0UG9ydE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BvcnRNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUG9ydE1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQb3J0TWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5QT1JUX01BUFBJTkdfX1BPUlRfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuUE9SVF9NQVBQSU5HX19KQVZBX1BPUlRfTkFNRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0TmFtZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Qb3J0TmFtZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDA2MzNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUG9ydE5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25QYWNrYWdlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlBvcnROYW1lfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUG9ydE5hbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEFUS1VJSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvcnROYW1lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCS8vcGdtIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQb3J0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfUG9ydE5hbWVfaWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfUG9ydE5hbWVfaWRfZmVhdHVyZSIsICJfVUlfUG9ydE5hbWVfdHlwZSIpLCBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFBvcnROYW1lX0lkKCksCi0JICogdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQb3J0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUG9ydE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1BvcnROYW1lX3BvcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvcnROYW1lX3BvcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1BvcnROYW1lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRQb3J0TmFtZV9Qb3J0TmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQb3J0TmFtZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1BvcnROYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoUG9ydE5hbWUpb2JqZWN0KS5nZXRQb3J0TmFtZSgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qb3J0TmFtZV90eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX1BvcnROYW1lX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUG9ydE5hbWUpIG9iamVjdCkuZ2V0UG9ydE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9Qb3J0TmFtZV90eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBvcnROYW1lLmNsYXNzKSkgewotCQkJLy9wZ20gY2FzZSBXc2NvbW1vblBhY2thZ2UuUE9SVF9OQU1FX19JRDoKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlBPUlRfTkFNRV9fUE9SVF9OQU1FIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeyByZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOyB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1Jvb3RUeXBlUW5hbWVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWEwNmNiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWU7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlJvb3RUeXBlUW5hbWV9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb290VHlwZVFuYW1lSXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9vdFR5cGVRbmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvb3RUeXBlUW5hbWUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb290VHlwZVFuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvb3RUeXBlUW5hbWUpIG9iamVjdCkuZ2V0Q29tYmluZWRRTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUm9vdFR5cGVRbmFtZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Jvb3RUeXBlUW5hbWVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TT0FQSGVhZGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NPQVBIZWFkZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxMzAzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NPQVBIZWFkZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUU5hbWVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXJ9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTT0FQSGVhZGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU09BUEhlYWRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNPQVBIZWFkZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TT0FQSGVhZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgdG9EaXNwbGF5U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXJldHVybiAocyAhPSBudWxsKSA/IHMgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0KLQkgKiAoKFNPQVBIZWFkZXIpb2JqZWN0KS5nZXRDb21iaW5lZFFOYW1lKCk7IHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCSAqIGdldFN0cmluZygiX1VJX1NPQVBIZWFkZXJfdHlwZSIpIDogZ2V0U3RyaW5nKCJfVUlfU09BUEhlYWRlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVNPQVBIZWFkZXIgc29hcEhlYWRlciA9IChTT0FQSGVhZGVyKSBvYmplY3Q7Ci0JCVN0cmluZyBuc1VSSSA9IHNvYXBIZWFkZXIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCVN0cmluZyBsb2NhbHBhcnQgPSBzb2FwSGVhZGVyLmdldExvY2FsUGFydCgpOwotCQlpZiAobnNVUkkgPT0gbnVsbCB8fCBuc1VSSS5sZW5ndGgoKSA9PSAwIHx8IGxvY2FscGFydCA9PSBudWxsIHx8IGxvY2FscGFydC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGdldFN0cmluZygiJV9VSV9TT0FQSGVhZGVyX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgbGFiZWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWxhYmVsLmFwcGVuZChuc1VSSSk7Ci0JCWxhYmVsLmFwcGVuZCgiIyIpOyAvLyROT04tTkxTLTEkCi0JCWxhYmVsLmFwcGVuZChsb2NhbHBhcnQpOwotCQlyZXR1cm4gbGFiZWwudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU09BUFJvbGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU09BUFJvbGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxZDM2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NPQVBSb2xlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZX0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNPQVBSb2xlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RBVEtVSUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTT0FQUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQkvL3BnbSBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU29hcFJvbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX1NPQVBSb2xlX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX1NPQVBSb2xlX2lkX2ZlYXR1cmUiLCAiX1VJX1NPQVBSb2xlX3R5cGUiKSwgV3Njb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTT0FQUm9sZV9JZCgpLAotCSAqIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU29hcCBSb2xlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNvYXBSb2xlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TT0FQUm9sZV9zb2FwUm9sZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TT0FQUm9sZV9zb2FwUm9sZV9mZWF0dXJlIiwgIl9VSV9TT0FQUm9sZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U09BUFJvbGVfU29hcFJvbGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU09BUFJvbGUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TT0FQUm9sZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKFNPQVBSb2xlKW9iamVjdCkuZ2V0SWQoKTsgcmV0dXJuCi0JICogbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU09BUFJvbGVfdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9TT0FQUm9sZV90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU09BUFJvbGUpIG9iamVjdCkuZ2V0U29hcFJvbGUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiJV9VSV9TT0FQUm9sZV90eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNPQVBSb2xlLmNsYXNzKSkgewotCQkJLy9wZ20gY2FzZSBXc2NvbW1vblBhY2thZ2UuU09BUF9ST0xFX19JRDoKLQkJCWNhc2UgV3Njb21tb25QYWNrYWdlLlNPQVBfUk9MRV9fU09BUF9ST0xFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeyByZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOyB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlY3Rpb25Db21wb25lbnRTY29wZWRSZWZIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VjdGlvbkNvbXBvbmVudFNjb3BlZFJlZkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTQyYzk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VjdGlvbkNvbXBvbmVudFNjb3BlZFJlZkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjksIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzQ2xpZW50OwotCi0KLS8qKgotICogQGF1dGhvciBqbGFudXRpCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25Db21wb25lbnRTY29wZWRSZWZIZWxwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgV2ViU2VydmljZXNDbGllbnQgd3NDbGllbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V3NDbGllbnQoV2ViU2VydmljZXNDbGllbnQgY2xpZW50KSB7Ci0JCXdzQ2xpZW50ID0gY2xpZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV2ViU2VydmljZXNDbGllbnQgZ2V0V3NDbGllbnQoKSB7Ci0JCXJldHVybiB3c0NsaWVudDsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZmJiYWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmd9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJbnRlcmZhY2VNYXBwaW5nSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNlcnZpY2VFbmRwb2ludEludGVyZmFjZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmljZSBFbmRwb2ludCBJbnRlcmZhY2UgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmljZUVuZHBvaW50SW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3NlcnZpY2VFbmRwb2ludEludGVyZmFjZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3NlcnZpY2VFbmRwb2ludEludGVyZmFjZV9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2UoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbFBvcnRUeXBlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxCaW5kaW5nKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRSZWZlcmVuY2Uob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFX01BUFBJTkdfX1NFUlZJQ0VfRU5EUE9JTlRfSU5URVJGQUNFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19XU0RMX1BPUlRfVFlQRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9JTlRFUkZBQ0VfTUFQUElOR19fV1NETF9CSU5ESU5HIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX0lOVEVSRkFDRV9NQVBQSU5HX19TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRJbnRlcmZhY2VNYXBwaW5nX1dzZGxQb3J0VHlwZSgpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUG9ydFR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfV3NkbEJpbmRpbmcoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV1NETEJpbmRpbmcoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmdfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ3MoKSwgSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzI1MWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ31vYmplY3QuIDwhLS0KLSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSmF2YU1ldGhvZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxPcGVyYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdyYXBwZWRFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBKYXZhIE1ldGhvZCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFNZXRob2ROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX2phdmFNZXRob2ROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfamF2YU1ldGhvZE5hbWVfZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfSmF2YU1ldGhvZE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgT3BlcmF0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxPcGVyYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfd3NkbE9wZXJhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3dzZGxPcGVyYXRpb25fZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3NkbE9wZXJhdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3JhcHBlZCBFbGVtZW50IGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdyYXBwZWRFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3dyYXBwZWRFbGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfd3JhcHBlZEVsZW1lbnRfZmVhdHVyZSIsICJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfV3JhcHBlZEVsZW1lbnQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmdfTWV0aG9kUGFyYW1QYXJ0c01hcHBpbmdzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX1dzZGxSZXR1cm5WYWx1ZU1hcHBpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nKSBvYmplY3QpLmdldEphdmFNZXRob2ROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZpY2VFbmRwb2ludE1ldGhvZE1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX0pBVkFfTUVUSE9EX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX1dTRExfT1BFUkFUSU9OIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0VORFBPSU5UX01FVEhPRF9NQVBQSU5HX19XUkFQUEVEX0VMRU1FTlQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfRU5EUE9JTlRfTUVUSE9EX01BUFBJTkdfX01FVEhPRF9QQVJBTV9QQVJUU19NQVBQSU5HUyA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9FTkRQT0lOVF9NRVRIT0RfTUFQUElOR19fV1NETF9SRVRVUk5fVkFMVUVfTUFQUElORyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlRW5kcG9pbnRNZXRob2RNYXBwaW5nX01ldGhvZFBhcmFtUGFydHNNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQYXJhbVBhcnRzTWFwcGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUVuZHBvaW50TWV0aG9kTWFwcGluZ19Xc2RsUmV0dXJuVmFsdWVNYXBwaW5nKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExSZXR1cm5WYWx1ZU1hcHBpbmcoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3YTZkZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbn0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX1NlcnZpY2VJbXBsQmVhbl9pZF9mZWF0dXJlIiksIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsCi0JICogIl9VSV9TZXJ2aWNlSW1wbEJlYW5faWRfZmVhdHVyZSIsICJfVUlfU2VydmljZUltcGxCZWFuX3R5cGUiKSwKLQkgKiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0VFSkJMaW5rKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0VTZXJ2bGV0TGluaygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlcnZpY2VJbXBsQmVhbi5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9mdWxsL29iajE2L3NydmNlX2VsZW1fb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKFNlcnZpY2VJbXBsQmVhbilvYmplY3QpLmdldElkKCk7Ci0JICogcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlcnZpY2VJbXBsQmVhbl90eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX1NlcnZpY2VJbXBsQmVhbl90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVNlcnZpY2VJbXBsQmVhbiBzZXJ2aWNlSW1wbEJlYW4gPSAoU2VydmljZUltcGxCZWFuKSBvYmplY3Q7Ci0JCVN0cmluZyBlamJMaW5rID0gc2VydmljZUltcGxCZWFuLmdldEVFSkJMaW5rKCkuZ2V0RWpiTGluaygpOwotCQlpZiAoZWpiTGluayAhPSBudWxsICYmIGVqYkxpbmsubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIGVqYkxpbms7Ci0JCVN0cmluZyBiZWFuTGluayA9IHNlcnZpY2VJbXBsQmVhbi5nZXRCZWFuTGluaygpLnRvU3RyaW5nKCk7Ci0JCWlmIChiZWFuTGluayAhPSBudWxsICYmIGJlYW5MaW5rLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBiZWFuTGluazsKLQkJU3RyaW5nIHNlcnZsZXRMaW5rID0gc2VydmljZUltcGxCZWFuLmdldEVTZXJ2bGV0TGluaygpLmdldFNlcnZsZXRMaW5rKCk7Ci0JCWlmIChzZXJ2bGV0TGluayAhPSBudWxsICYmIHNlcnZsZXRMaW5rLmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBzZXJ2bGV0TGluazsKLQkJcmV0dXJuIGdldFN0cmluZygiJV9VSV9TZXJ2aWNlSW1wbEJlYW5fdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlcnZpY2VJbXBsQmVhbi5jbGFzcykpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0VFSkJfTElOSyA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZJQ0VfSU1QTF9CRUFOX19FU0VSVkxFVF9MSU5LIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuU0VSVklDRV9JTVBMX0JFQU5fX0JFQU5fTElOSyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0VFSkJMaW5rKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFSkJMaW5rKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0VTZXJ2bGV0TGluaygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldExpbmsoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJlYW5MaW5rKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZUltcGxCZWFuX0JlYW5MaW5rKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0TGluaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9CZWFuTGluaygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUpCTGluaygpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gcXVhbGlmeSA9IGZlYXR1cmUgPT0gV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbXBsQmVhbl9FU2VydmxldExpbmsoKSB8fCBmZWF0dXJlID09IFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fQmVhbkxpbmsoKSB8fCBmZWF0dXJlID09IFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW1wbEJlYW5fRUVKQkxpbmsoKTsKLQkJcmV0dXJuIGdldFN0cmluZyhxdWFsaWZ5ID8gIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIgOiAiX1VJX0NyZWF0ZUNoaWxkX3RleHQiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJbmV3IE9iamVjdFtde2dldFR5cGVUZXh0KGNoaWxkKSwgZ2V0RmVhdHVyZVRleHQoZmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVufWJ5IGNhbGxpbmcKLQkgKiB7QGxpbmsgI2dldENoaWxkcmVuUmVmZXJlbmNlcyBnZXRDaGlsZHJlblJlZmVyZW5jZXN9YW5kIHVzaW5nIHRob3NlIHRvIGNvbGxlY3QgdGhlIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVMaXN0KQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUVMaXN0KChFTGlzdCkgb2JqZWN0KTsKLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgQWRhcHRlclZpZXdlckl0ZW0pCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oKEFkYXB0ZXJWaWV3ZXJJdGVtKSBvYmplY3QpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21FTGlzdChFTGlzdCBlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JCQlyZXN1bHQuYWRkQWxsKHN1cGVyLmdldENoaWxkcmVuKGl0Lm5leHQoKSkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKEFkYXB0ZXJWaWV3ZXJJdGVtIGFkYXB0ZXJWaWV3ZXJJdGVtKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlT2JqZWN0TGlzdCA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVPYmplY3RMaXN0KCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJT2JqZWN0IG9iamVjdCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlyZXN1bHQuYWRkQWxsKChMaXN0KSBvYmplY3QpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0LmFkZChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWUzZDA0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLlNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VydmljZUludGVyZmFjZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNlcnZpY2VJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXJ2aWNlIEludGVyZmFjZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2aWNlSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19zZXJ2aWNlSW50ZXJmYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX3NlcnZpY2VJbnRlcmZhY2VfZmVhdHVyZSIsICJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19TZXJ2aWNlSW50ZXJmYWNlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZ19Xc2RsU2VydmljZU5hbWUoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvU2VydmljZUludGVyZmFjZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU2VydmljZUludGVyZmFjZU1hcHBpbmcpIG9iamVjdCkuZ2V0SWQoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VydmljZUludGVyZmFjZU1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZXJ2aWNlSW50ZXJmYWNlTWFwcGluZy5jbGFzcykpIHsKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19JRCA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuU0VSVklDRV9JTlRFUkZBQ0VfTUFQUElOR19fU0VSVklDRV9JTlRFUkZBQ0UgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlNFUlZJQ0VfSU5URVJGQUNFX01BUFBJTkdfX1dTRExfU0VSVklDRV9OQU1FIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5TRVJWSUNFX0lOVEVSRkFDRV9NQVBQSU5HX19QT1JUX01BUFBJTkdTIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1dzZGxTZXJ2aWNlTmFtZSgpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMU2VydmljZU5hbWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKEpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VJbnRlcmZhY2VNYXBwaW5nX1BvcnRNYXBwaW5ncygpLCBKYXhycGNtYXBGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb3J0TWFwcGluZygpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZVJlZkVkaXRvckl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlUmVmRWRpdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNGFkZDguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2aWNlUmVmRWRpdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI2LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZkVkaXRvckl0ZW1Qcm92aWRlciBleHRlbmRzIFNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgewotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBTZXJ2aWNlUmVmRWRpdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9IYW5kbGVycygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBhcmcwKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1NlcnZpY2VSZWZJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZVJlZkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGExNTcwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmljZVJlZkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2Vic2VydmljZV9jbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LlNlcnZpY2VSZWZ9b2JqZWN0LiA8IS0tCi0gKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VSZWZJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNlcnZpY2VJbnRlcmZhY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNlcnZpY2VSZWZOYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXc2RsRmlsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSmF4cnBjTWFwcGluZ0ZpbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNlcnZpY2UgUmVmIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VydmljZVJlZk5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9TZXJ2aWNlUmVmX3NlcnZpY2VSZWZOYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl9zZXJ2aWNlUmVmTmFtZV9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZVJlZk5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgRmlsZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXc2RsRmlsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCIlX1VJX1NlcnZpY2VSZWZfd3NkbEZpbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiJV9VSV9TZXJ2aWNlUmVmX3dzZGxGaWxlX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9Xc2RsRmlsZSgpLCBmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEpheHJwYyBNYXBwaW5nIEZpbGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF4cnBjTWFwcGluZ0ZpbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiJV9VSV9TZXJ2aWNlUmVmX2pheHJwY01hcHBpbmdGaWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl9qYXhycGNNYXBwaW5nRmlsZV9mZWF0dXJlX2Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfSmF4cnBjTWFwcGluZ0ZpbGUoKSwgZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZXJ2aWNlIEludGVyZmFjZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXJ2aWNlSW50ZXJmYWNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl9zZXJ2aWNlSW50ZXJmYWNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIiVfVUlfU2VydmljZVJlZl9zZXJ2aWNlSW50ZXJmYWNlX2ZlYXR1cmVfZGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlSW50ZXJmYWNlKCksIGZhbHNlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQkvL2NoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1BvcnRDb21wb25lbnRSZWZzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfSGFuZGxlcnMoKSk7Ci0JCQkvL2NoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2aWNlUmVmX1NlcnZpY2VRbmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFNlcnZpY2VSZWYuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9vYmoxNi9zZXJ2aWNlcmVmLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPQotCSAqICgoU2VydmljZVJlZilvYmplY3QpLmdldFNlcnZpY2VSZWZOYW1lKCk7IHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCSAqIGdldFN0cmluZygiX1VJX1NlcnZpY2VSZWZfdHlwZSIpIDogZ2V0U3RyaW5nKCJfVUlfU2VydmljZVJlZl90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU2VydmljZVJlZikgb2JqZWN0KS5nZXRTZXJ2aWNlUmVmTmFtZSgpOwotCQlyZXR1cm4gIlNlcnZpY2VSZWYgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmljZVJlZi5jbGFzcykpIHsKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1JFRl9OQU1FIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19XU0RMX0ZJTEUgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0pBWFJQQ19NQVBQSU5HX0ZJTEUgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX1BPUlRfQ09NUE9ORU5UX1JFRlMgOgotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuU0VSVklDRV9SRUZfX0hBTkRMRVJTIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLlNFUlZJQ0VfUkVGX19TRVJWSUNFX1FOQU1FIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9Qb3J0Q29tcG9uZW50UmVmcygpLCBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcnRDb21wb25lbnRSZWYoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9IYW5kbGVycygpLCBXZWJzZXJ2aWNlX2NsaWVudEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUhhbmRsZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUU5hbWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VydmljZVJlZl9TZXJ2aWNlUW5hbWUoKSwgV3Njb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTT0FQSGVhZGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFNlcnZpY2VSZWZfU2VydmljZVFuYW1lKCksIFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXU0RMUG9ydCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2bGV0TGlua0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9TZXJ2bGV0TGlua0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDk2Nzc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvU2VydmxldExpbmtJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rfQotICogb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldExpbmtJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCZWFuTGlua0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZXJ2bGV0TGlua0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRTZXJ2bGV0TGlua1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfU2VydmxldExpbmtfaWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfU2VydmxldExpbmtfaWRfZmVhdHVyZSIsICJfVUlfU2VydmxldExpbmtfdHlwZSIpLAotCSAqIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0TGlua19JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VydmxldCBMaW5rIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlcnZsZXRMaW5rUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9TZXJ2bGV0TGlua19zZXJ2bGV0TGlua19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9TZXJ2bGV0TGlua19zZXJ2bGV0TGlua19mZWF0dXJlIiwgIl9VSV9TZXJ2bGV0TGlua190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXJ2bGV0TGlua19TZXJ2bGV0TGluaygpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZXJ2bGV0TGluay5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvc2VydmxldC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsgU3RyaW5nIGxhYmVsID0gKChTZXJ2bGV0TGluaylvYmplY3QpLmdldElkKCk7IHJldHVybgotCSAqIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlcnZsZXRMaW5rX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfU2VydmxldExpbmtfdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFNlcnZsZXRMaW5rKSBvYmplY3QpLmdldFNlcnZsZXRMaW5rKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIiVfVUlfU2VydmxldExpbmtfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VydmxldExpbmsuY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLlNFUlZMRVRfTElOS19fU0VSVkxFVF9MSU5LIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2ViU2VydmljZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvVmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1ZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGU4MTViLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvVmFyaWFibGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuVmFyaWFibGVNYXBwaW5nfW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJsZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmxlTWFwcGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSmF2YVZhcmlhYmxlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkWG1sRWxlbWVudE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERhdGFNZW1iZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFhtbEF0dHJpYnV0ZU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFhtbFdpbGRjYXJkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEphdmEgVmFyaWFibGUgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhVmFyaWFibGVOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfamF2YVZhcmlhYmxlTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfamF2YVZhcmlhYmxlTmFtZV9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfSmF2YVZhcmlhYmxlTmFtZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWG1sIEVsZW1lbnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxFbGVtZW50TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX3htbEVsZW1lbnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ194bWxFbGVtZW50TmFtZV9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfWG1sRWxlbWVudE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERhdGEgTWVtYmVyIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERhdGFNZW1iZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1ZhcmlhYmxlTWFwcGluZ19kYXRhTWVtYmVyX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ19kYXRhTWVtYmVyX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFZhcmlhYmxlTWFwcGluZ19EYXRhTWVtYmVyKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBYbWwgQXR0cmlidXRlIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sQXR0cmlidXRlTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX3htbEF0dHJpYnV0ZU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVmFyaWFibGVNYXBwaW5nX3htbEF0dHJpYnV0ZU5hbWVfZmVhdHVyZSIsICJfVUlfVmFyaWFibGVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFyaWFibGVNYXBwaW5nX1htbEF0dHJpYnV0ZU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFhtbCBXaWxkY2FyZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxXaWxkY2FyZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfVmFyaWFibGVNYXBwaW5nX3htbFdpbGRjYXJkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ZhcmlhYmxlTWFwcGluZ194bWxXaWxkY2FyZF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJsZU1hcHBpbmdfWG1sV2lsZGNhcmQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5CT09MRUFOX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVmFyaWFibGVNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVmFyaWFibGVNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFZhcmlhYmxlTWFwcGluZykgb2JqZWN0KS5nZXRKYXZhVmFyaWFibGVOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9WYXJpYWJsZU1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChWYXJpYWJsZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX0pBVkFfVkFSSUFCTEVfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX0VMRU1FTlRfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fREFUQV9NRU1CRVIgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLlZBUklBQkxFX01BUFBJTkdfX1hNTF9BVFRSSUJVVEVfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuVkFSSUFCTEVfTUFQUElOR19fWE1MX1dJTERDQVJEIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExCaW5kaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExCaW5kaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOWYxOTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMQmluZGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLlFOYW1lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExCaW5kaW5nOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMQmluZGluZ30KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExCaW5kaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgUU5hbWVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETEJpbmRpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMQmluZGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExCaW5kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdTRExCaW5kaW5nKSBvYmplY3QpLmdldENvbWJpbmVkUU5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dTRExCaW5kaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETEJpbmRpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMTWVzc2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMTWVzc2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTU0MGI4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5RTmFtZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2V9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMTWVzc2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExNZXNzYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETE1lc3NhZ2UuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMTWVzc2FnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMTWVzc2FnZSkgb2JqZWN0KS5nZXRDb21iaW5lZFFOYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODRmOGRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmc7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZU1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExNZXNzYWdlTWFwcGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETE1lc3NhZ2VNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQYXJhbWV0ZXJNb2RlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTb2FwSGVhZGVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExNZXNzYWdlTWFwcGluZ19pZF9mZWF0dXJlIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgTWVzc2FnZSBQYXJ0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3dzZGxNZXNzYWdlUGFydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3dzZGxNZXNzYWdlUGFydE5hbWVfZmVhdHVyZSIsICJfVUlfV1NETE1lc3NhZ2VNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBhcmFtZXRlciBNb2RlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhcmFtZXRlck1vZGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlTWFwcGluZ19wYXJhbWV0ZXJNb2RlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExNZXNzYWdlTWFwcGluZ19wYXJhbWV0ZXJNb2RlX2ZlYXR1cmUiLCAiX1VJX1dTRExNZXNzYWdlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExNZXNzYWdlTWFwcGluZ19QYXJhbWV0ZXJNb2RlKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTb2FwIEhlYWRlciBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb2FwSGVhZGVyUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfc29hcEhlYWRlcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfc29hcEhlYWRlcl9mZWF0dXJlIiwgIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZU1hcHBpbmdfU29hcEhlYWRlcigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETE1lc3NhZ2VNYXBwaW5nLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV1NETE1lc3NhZ2VNYXBwaW5nIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdTRExNZXNzYWdlTWFwcGluZykgb2JqZWN0KS5nZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZU1hcHBpbmdfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXU0RMTWVzc2FnZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fV1NETF9NRVNTQUdFX1BBUlRfTkFNRSA6Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX01BUFBJTkdfX1BBUkFNRVRFUl9NT0RFIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX01FU1NBR0VfTUFQUElOR19fU09BUF9IRUFERVIgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9NQVBQSU5HX19XU0RMX01FU1NBR0UgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VNYXBwaW5nX1dzZGxNZXNzYWdlKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExNZXNzYWdlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMTWVzc2FnZVBhcnROYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YzUzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExNZXNzYWdlUGFydE5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMTWVzc2FnZVBhcnROYW1lOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE1lc3NhZ2VQYXJ0TmFtZX1vYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV1NETE1lc3NhZ2VQYXJ0TmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExNZXNzYWdlUGFydE5hbWVfaWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV9pZF9mZWF0dXJlIiwgIl9VSV9XU0RMTWVzc2FnZVBhcnROYW1lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETE1lc3NhZ2VQYXJ0TmFtZV9JZCgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV3NkbCBNZXNzYWdlIFBhcnQgTmFtZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZVBhcnROYW1lX3dzZGxNZXNzYWdlUGFydE5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV93c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiLCAiX1VJX1dTRExNZXNzYWdlUGFydE5hbWVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMTWVzc2FnZVBhcnROYW1lX1dzZGxNZXNzYWdlUGFydE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETE1lc3NhZ2VQYXJ0TmFtZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExNZXNzYWdlUGFydE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV1NETE1lc3NhZ2VQYXJ0TmFtZSkgb2JqZWN0KS5nZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMTWVzc2FnZVBhcnROYW1lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETE1lc3NhZ2VQYXJ0TmFtZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdTRExNZXNzYWdlUGFydE5hbWUuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9NRVNTQUdFX1BBUlRfTkFNRV9fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfTUVTU0FHRV9QQVJUX05BTUVfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETE9wZXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMT3BlcmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODgwZmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMT3BlcmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbjsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS5qYXhycGNtYXAuV1NETE9wZXJhdGlvbn0KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExPcGVyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFdzZGxPcGVyYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMT3BlcmF0aW9uX2lkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExPcGVyYXRpb25faWRfZmVhdHVyZSIsICJfVUlfV1NETE9wZXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExPcGVyYXRpb25fSWQoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgT3BlcmF0aW9uIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdzZGxPcGVyYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dTRExPcGVyYXRpb25fd3NkbE9wZXJhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMT3BlcmF0aW9uX3dzZGxPcGVyYXRpb25fZmVhdHVyZSIsICJfVUlfV1NETE9wZXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExPcGVyYXRpb25fV3NkbE9wZXJhdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMT3BlcmF0aW9uLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV1NETE9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMT3BlcmF0aW9uKSBvYmplY3QpLmdldElkKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMT3BlcmF0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETE9wZXJhdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdTRExPcGVyYXRpb24uY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9PUEVSQVRJT05fX0lEIDoKLQkJCWNhc2UgSmF4cnBjbWFwUGFja2FnZS5XU0RMX09QRVJBVElPTl9fV1NETF9PUEVSQVRJT04gOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFBvcnRJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFBvcnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlOTQzNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUU5hbWVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnQ7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydH1vYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV1NETFBvcnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBRTmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMUG9ydEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExQb3J0LmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi93c2RsLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKFdTRExQb3J0KW9iamVjdCkuZ2V0Q29tYmluZWRRTmFtZSgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMUG9ydF90eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX1dTRExQb3J0X3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJV1NETFBvcnQgd3NkbHBvcnQgPSAoV1NETFBvcnQpIG9iamVjdDsKLQkJU3RyaW5nIG5zVVJJID0gd3NkbHBvcnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCVN0cmluZyBsb2NhbHBhcnQgPSB3c2RscG9ydC5nZXRMb2NhbFBhcnQoKTsKLQkJaWYgKG5zVVJJID09IG51bGwgfHwgbnNVUkkubGVuZ3RoKCkgPT0gMCB8fCBsb2NhbHBhcnQgPT0gbnVsbCB8fCBsb2NhbHBhcnQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBnZXRTdHJpbmcoIiVfVUlfV1NETFBvcnRfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBsYWJlbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJbGFiZWwuYXBwZW5kKG5zVVJJKTsKLQkJbGFiZWwuYXBwZW5kKCIjIik7IC8vJE5PTi1OTFMtMSQKLQkJbGFiZWwuYXBwZW5kKGxvY2FscGFydCk7Ci0JCXJldHVybiBsYWJlbC50b1N0cmluZygpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExQb3J0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTcxN2I2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFBvcnRUeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwucHJvdmlkZXIuUU5hbWVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFBvcnRUeXBlOwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMUG9ydFR5cGV9Ci0gKiBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXU0RMUG9ydFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBRTmFtZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXU0RMUG9ydFR5cGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXU0RMUG9ydFR5cGUuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XU0RMUG9ydFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV1NETFBvcnRUeXBlKSBvYmplY3QpLmdldENvbWJpbmVkUU5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dTRExQb3J0VHlwZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1dTRExQb3J0VHlwZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzYyNjEzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFJldHVyblZhbHVlTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuV1NETFJldHVyblZhbHVlTWFwcGluZzsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UuamF4cnBjbWFwLldTRExSZXR1cm5WYWx1ZU1hcHBpbmd9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0gKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZE1ldGhvZFJldHVyblZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXc2RsTWVzc2FnZVBhcnROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ19pZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX2lkX2ZlYXR1cmUiLCAiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX0lkKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNZXRob2QgUmV0dXJuIFZhbHVlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGhvZFJldHVyblZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX21ldGhvZFJldHVyblZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfbWV0aG9kUmV0dXJuVmFsdWVfZmVhdHVyZSIsICJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCUpheHJwY21hcFBhY2thZ2UuZUlOU1RBTkNFLmdldFdTRExSZXR1cm5WYWx1ZU1hcHBpbmdfTWV0aG9kUmV0dXJuVmFsdWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdzZGwgTWVzc2FnZSBQYXJ0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbE1lc3NhZ2VQYXJ0TmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ193c2RsTWVzc2FnZVBhcnROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dTRExSZXR1cm5WYWx1ZU1hcHBpbmdfd3NkbE1lc3NhZ2VQYXJ0TmFtZV9mZWF0dXJlIiwgIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V1NETFJldHVyblZhbHVlTWFwcGluZ19Xc2RsTWVzc2FnZVBhcnROYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlblJlZmVyZW5jZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV1NETFJldHVyblZhbHVlTWFwcGluZy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExSZXR1cm5WYWx1ZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV1NETFJldHVyblZhbHVlTWFwcGluZykgb2JqZWN0KS5nZXRXc2RsTWVzc2FnZVBhcnROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XU0RMUmV0dXJuVmFsdWVNYXBwaW5nX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETFJldHVyblZhbHVlTWFwcGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdTRExSZXR1cm5WYWx1ZU1hcHBpbmcuY2xhc3MpKSB7Ci0JCQljYXNlIEpheHJwY21hcFBhY2thZ2UuV1NETF9SRVRVUk5fVkFMVUVfTUFQUElOR19fSUQgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX01FVEhPRF9SRVRVUk5fVkFMVUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRV9QQVJUX05BTUUgOgotCQkJY2FzZSBKYXhycGNtYXBQYWNrYWdlLldTRExfUkVUVVJOX1ZBTFVFX01BUFBJTkdfX1dTRExfTUVTU0FHRSA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRXU0RMUmV0dXJuVmFsdWVNYXBwaW5nX1dzZGxNZXNzYWdlKCksIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdTRExNZXNzYWdlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMU2VydmljZU5hbWVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV1NETFNlcnZpY2VOYW1lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZjUwMDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XU0RMU2VydmljZU5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5RTmFtZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWU7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLmpheHJwY21hcC5XU0RMU2VydmljZU5hbWV9b2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdTRExTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIFFOYW1lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdTRExTZXJ2aWNlTmFtZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdTRExTZXJ2aWNlTmFtZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dTRExTZXJ2aWNlTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXU0RMU2VydmljZU5hbWUpIG9iamVjdCkuZ2V0Q29tYmluZWRRTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV1NETFNlcnZpY2VOYW1lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfV1NETFNlcnZpY2VOYW1lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjU5ZTgyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UuYWRhcHRlci5BZGFwdGVyVmlld2VySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnBsdWdpbi5XZWJTZXJ2aWNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9ufW9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRKYXhycGNNYXBwaW5nRmlsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV3NkbEZpbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNtYWxsSWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTGFyZ2VJY29uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZXNjcmlwdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGlzcGxheU5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElkIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8qCi0JICogcGdtIHByb3RlY3RlZCB2b2lkIGFkZElkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsgaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkIChuZXcKLQkgKiBJdGVtUHJvcGVydHlEZXNjcmlwdG9yICgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCSAqIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9pZF9mZWF0dXJlIiksCi0JICogZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25faWRfZmVhdHVyZSIsCi0JICogIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpLCBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBKYXhycGMgTWFwcGluZyBGaWxlIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEpheHJwY01hcHBpbmdGaWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25famF4cnBjTWFwcGluZ0ZpbGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2pheHJwY01hcHBpbmdGaWxlX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fSmF4cnBjTWFwcGluZ0ZpbGUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdlYiBTZXJ2aWNlIERlc2NyaXB0aW9uIE5hbWUgZmVhdHVyZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV2ViU2VydmljZURlc2NyaXB0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3dlYlNlcnZpY2VEZXNjcmlwdGlvbk5hbWVfZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9XZWJTZXJ2aWNlRGVzY3JpcHRpb25OYW1lKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBXc2RsIEZpbGUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV3NkbEZpbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl93c2RsRmlsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fd3NkbEZpbGVfZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9Xc2RsRmlsZSgpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU21hbGwgSWNvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTbWFsbEljb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9zbWFsbEljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3NtYWxsSWNvbl9mZWF0dXJlIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX1NtYWxsSWNvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGFyZ2UgSWNvbiBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMYXJnZUljb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9sYXJnZUljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2xhcmdlSWNvbl9mZWF0dXJlIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0xhcmdlSWNvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVzY3JpcHRpb24gZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl9kZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9EZXNjcmlwdGlvbigpLCB0cnVlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzcGxheSBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpc3BsYXlOYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fZGlzcGxheU5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV2ViU2VydmljZURlc2NyaXB0aW9uX2Rpc3BsYXlOYW1lX2ZlYXR1cmUiLCAiX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCVdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGlzcGxheU5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb25UeXBlKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lVHlwZSgpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JY29uVHlwZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdlYlNlcnZpY2VEZXNjcmlwdGlvbi5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgeyByZXR1cm4KLQkgKiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9XZWJTZXJ2aWNlRGVzY3JpcHRpb24iKTsgfQotCSAqLwotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPQotCSAqICgoV2ViU2VydmljZURlc2NyaXB0aW9uKW9iamVjdCkuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpOyByZXR1cm4gbGFiZWwgPT0gbnVsbCB8fAotCSAqIGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpIDoKLQkgKiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlRGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXZWJTZXJ2aWNlRGVzY3JpcHRpb24uZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAgCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvd2Vic2VydmljZWRlc2MuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXZWJTZXJ2aWNlRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX1dlYlNlcnZpY2VEZXNjcmlwdGlvbl90eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXZWJTZXJ2aWNlRGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19KQVhSUENfTUFQUElOR19GSUxFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX05BTUUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fV1NETF9GSUxFIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX1NNQUxMX0lDT04gOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fTEFSR0VfSUNPTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ERVNDUklQVElPTiA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLldFQl9TRVJWSUNFX0RFU0NSSVBUSU9OX19ESVNQTEFZX05BTUUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fUE9SVF9DT01QT05FTlRTIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuV0VCX1NFUlZJQ0VfREVTQ1JJUFRJT05fX0RFU0NSSVBUSU9OX1RZUEUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fRElTUExBWV9OQU1FX1RZUEUgOgotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRV9ERVNDUklQVElPTl9fSUNPTl9UWVBFIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fUG9ydENvbXBvbmVudHMoKSwgV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvcnRDb21wb25lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlRGVzY3JpcHRpb25fRGVzY3JpcHRpb25UeXBlKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZURlc2NyaXB0aW9uX0Rpc3BsYXlOYW1lVHlwZSgpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VEZXNjcmlwdGlvbl9JY29uVHlwZSgpLCBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJY29uVHlwZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW59YnkgY2FsbGluZwotCSAqIHtAbGluayAjZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzIGdldENoaWxkcmVuUmVmZXJlbmNlc31hbmQgdXNpbmcgdGhvc2UgdG8gY29sbGVjdCB0aGUgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUxpc3QpCi0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoKEVMaXN0KSBvYmplY3QpOwotCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBZGFwdGVyVmlld2VySXRlbSkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbSgoQWRhcHRlclZpZXdlckl0ZW0pIG9iamVjdCk7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUVMaXN0KEVMaXN0IGVMaXN0KSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZUxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGRBbGwoc3VwZXIuZ2V0Q2hpbGRyZW4oaXQubmV4dCgpKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQWRhcHRlclZpZXdlckl0ZW0oQWRhcHRlclZpZXdlckl0ZW0gYWRhcHRlclZpZXdlckl0ZW0pIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVMaXN0IGVPYmplY3RMaXN0ID0gYWRhcHRlclZpZXdlckl0ZW0uZ2V0RU9iamVjdExpc3QoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIExpc3QpCi0JCQkJCXJlc3VsdC5hZGRBbGwoKExpc3QpIG9iamVjdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyM2I2MTAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYnNlcnZpY2VfY2xpZW50UGFja2FnZTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuV2ViU2VydmljZXNDbGllbnR9b2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzQ2xpZW50X0NvbXBvbmVudFNjb3BlZFJlZnMoKSk7Ci0JCQljaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdlYnNlcnZpY2VfY2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNDbGllbnRfU2VydmljZVJlZnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVSZWZlcmVuY2UgZ2V0Q2hpbGRSZWZlcmVuY2UoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZFJlZmVyZW5jZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXZWJTZXJ2aWNlc0NsaWVudC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dlYlNlcnZpY2VzQ2xpZW50Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvL3JldHVybiBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlc0NsaWVudF90eXBlIik7Ci0JCXJldHVybiBnZXRTdHJpbmcoIiVfVUlfV2ViU2VydmljZXNDbGllbnRfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdlYlNlcnZpY2VzQ2xpZW50LmNsYXNzKSkgewotCQkJY2FzZSBXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuV0VCX1NFUlZJQ0VTX0NMSUVOVF9fQ09NUE9ORU5UX1NDT1BFRF9SRUZTIDoKLQkJCWNhc2UgV2Vic2VydmljZV9jbGllbnRQYWNrYWdlLldFQl9TRVJWSUNFU19DTElFTlRfX1NFUlZJQ0VfUkVGUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzQ2xpZW50X0NvbXBvbmVudFNjb3BlZFJlZnMoKSwgV2Vic2VydmljZV9jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb25lbnRTY29wZWRSZWZzKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXZWJzZXJ2aWNlX2NsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzQ2xpZW50X1NlcnZpY2VSZWZzKCksIFdlYnNlcnZpY2VfY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZVJlZigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBXZWJTZXJ2aWNlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJTZXJ2aWNlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTMzMjNlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2ViU2VydmljZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLnByb3ZpZGVyLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucGx1Z2luLldlYlNlcnZpY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlc30KLSAqIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2ViU2VydmljZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSWQgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwZ20gcHJvdGVjdGVkIHZvaWQgYWRkSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgeyBpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQgKG5ldwotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JICogZ2V0U3RyaW5nKCJfVUlfV2ViU2VydmljZXNfaWRfZmVhdHVyZSIpLCBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLAotCSAqICJfVUlfV2ViU2VydmljZXNfaWRfZmVhdHVyZSIsICJfVUlfV2ViU2VydmljZXNfdHlwZSIpLAotCSAqIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJTZXJ2aWNlc19JZCgpLCB0cnVlLAotCSAqIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59YW5kCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfXN1cHBvcnQgaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYlNlcnZpY2VzX1dlYlNlcnZpY2VEZXNjcmlwdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuUmVmZXJlbmNlczsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXZWJTZXJ2aWNlcy5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1dlYlNlcnZpY2VzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7IFN0cmluZyBsYWJlbCA9ICgoV2ViU2VydmljZXMpb2JqZWN0KS5nZXREaXNwbGF5TmFtZSgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XZWJTZXJ2aWNlc190eXBlIikgOgotCSAqIGdldFN0cmluZygiX1VJX1dlYlNlcnZpY2VzX3R5cGUiKSArICIgIiArIGxhYmVsOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBub24tZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXZWJTZXJ2aWNlcykgb2JqZWN0KS5nZXREaXNwbGF5TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX1dlYlNlcnZpY2VzX3R5cGUiKSA6IGxhYmVsOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdlYlNlcnZpY2VzLmNsYXNzKSkgewotCQkJY2FzZSBXc2RkUGFja2FnZS5XRUJfU0VSVklDRVNfX1dFQl9TRVJWSUNFX0RFU0NSSVBUSU9OUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViU2VydmljZXNfV2ViU2VydmljZURlc2NyaXB0aW9ucygpLCBXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlX2NsaWVudEVkaXRvckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyNjcxZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50RWRpdG9ySXRlbVByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjYsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2Vic2VydmljZV9jbGllbnRFZGl0b3JJdGVtUHJvdmlkZXJGYWN0b3J5IGV4dGVuZHMgV2Vic2VydmljZV9jbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBXZWJzZXJ2aWNlX2NsaWVudEVkaXRvckl0ZW1Qcm92aWRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NsaWVudC51dGlsLldlYnNlcnZpY2VfY2xpZW50QWRhcHRlckZhY3RvcnkjY3JlYXRlU2VydmljZVJlZkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCkgewotCQlpZiAoc2VydmljZVJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZpY2VSZWZFZGl0b3JJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmljZVJlZkl0ZW1Qcm92aWRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlZDgwNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuaW50ZXJuYWwudXRpbC5XZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLiBUaGUKLSAqIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8KLSAqIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgotICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdlYnNlcnZpY2VfY2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXZWJzZXJ2aWNlX2NsaWVudEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyIHsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWJzZXJ2aWNlX2NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5TZXJ2aWNlUmVmfQotCSAqIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZXJ2aWNlUmVmSXRlbVByb3ZpZGVyIHNlcnZpY2VSZWZJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuU2VydmljZVJlZn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZpY2VSZWZBZGFwdGVyKCkgewotCQlpZiAoc2VydmljZVJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlUmVmSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZpY2VSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc2VydmljZVJlZkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZn1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyIHBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMud3NjbGllbnQuUG9ydENvbXBvbmVudFJlZn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnRDb21wb25lbnRSZWZBZGFwdGVyKCkgewotCQlpZiAocG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwb3J0Q29tcG9uZW50UmVmSXRlbVByb3ZpZGVyID0gbmV3IFBvcnRDb21wb25lbnRSZWZJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcG9ydENvbXBvbmVudFJlZkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIGNvbS5pYm0uZXRvb2xzLndzY2xpZW50LkhhbmRsZXJ9Ci0JICogaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhhbmRsZXJJdGVtUHJvdmlkZXIgaGFuZGxlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5IYW5kbGVyfS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSGFuZGxlckFkYXB0ZXIoKSB7Ci0JCWlmIChoYW5kbGVySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWhhbmRsZXJJdGVtUHJvdmlkZXIgPSBuZXcgSGFuZGxlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBoYW5kbGVySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudH1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlciB3ZWJTZXJ2aWNlc0NsaWVudEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5XZWJTZXJ2aWNlc0NsaWVudH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYlNlcnZpY2VzQ2xpZW50QWRhcHRlcigpIHsKLQkJaWYgKHdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyID0gbmV3IFdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdlYlNlcnZpY2VzQ2xpZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgY29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy53c2NsaWVudC5Db21wb25lbnRTY29wZWRSZWZzfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9uZW50U2NvcGVkUmVmc0FkYXB0ZXIoKSB7Ci0JCWlmIChjb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbXBvbmVudFNjb3BlZFJlZnNJdGVtUHJvdmlkZXIgPSBuZXcgQ29tcG9uZW50U2NvcGVkUmVmc0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb21wb25lbnRTY29wZWRSZWZzSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn1hbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YWFiMzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9XZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBXZWJzZXJ2aWNlLWoyZWUgZWRpdCBwbHVnaW4uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsKLQkvKioKLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdlYnNlcnZpY2VqMmVlRWRpdFBsdWdpbiBJTlNUQU5DRSA9IG5ldyBXZWJzZXJ2aWNlajJlZUVkaXRQbHVnaW4oKTsKLQotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltcGxlbWVudGF0aW9uIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW5zdGFuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2Vic2VydmljZWoyZWVFZGl0UGx1Z2luKCkgewotCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW117fSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBFY2xpcHNlIHBsdWdpbi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltcGxlbWVudGF0aW9uIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFY2xpcHNlIDxiPlBsdWdpbiA8L2I+LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7Ci0JCS8qKgotCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogCi0JCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JCSAqICAgICAgICAgICAgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwbHVnaW4uCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBJbXBsZW1lbnRhdGlvbihJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCQlzdXBlcihkZXNjcmlwdG9yKTsKLQotCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KLQkJCS8vCi0JCQlwbHVnaW4gPSB0aGlzOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS93ZWJzZXJ2aWNlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2UvcHJvdmlkZXIvV3Njb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Xc2NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODQ1NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Xc2NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLmludGVybmFsLnV0aWwuV3Njb21tb25BZGFwdGVyRmFjdG9yeTsKLQotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydCBWaWV3ZXJzLiBUaGUKLSAqIGFkYXB0ZXJzIGdlbmVyYXRlZCBieSB0aGlzIGZhY3RvcnkgY29udmVydCBFTUYgYWRhcHRlciBub3RpZmljYXRpb25zIGludG8gY2FsbHMgdG8KLSAqIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiBUaGUgYWRhcHRlcnMgYWxzbyBzdXBwb3J0IEVjbGlwc2UgcHJvcGVydHkgc2hlZXRzLgotICogTm90ZSB0aGF0IG1vc3Qgb2YgdGhlIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdzY29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXc2NvbW1vbkFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyIHsKLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGFkYXB0ZXIgZmFjdG9yeS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXc2NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEluaXRQYXJhbUl0ZW1Qcm92aWRlciBpbml0UGFyYW1JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW19LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbml0UGFyYW1BZGFwdGVyKCkgewotCQlpZiAoaW5pdFBhcmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWluaXRQYXJhbUl0ZW1Qcm92aWRlciA9IG5ldyBJbml0UGFyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaW5pdFBhcmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXJ9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU09BUEhlYWRlckl0ZW1Qcm92aWRlciBzb2FwSGVhZGVySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uU09BUEhlYWRlcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNPQVBIZWFkZXJBZGFwdGVyKCkgewotCQlpZiAoc29hcEhlYWRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzb2FwSGVhZGVySXRlbVByb3ZpZGVyID0gbmV3IFNPQVBIZWFkZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc29hcEhlYWRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTT0FQUm9sZUl0ZW1Qcm92aWRlciBzb2FwUm9sZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBSb2xlfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU09BUFJvbGVBZGFwdGVyKCkgewotCQlpZiAoc29hcFJvbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc29hcFJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgU09BUFJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gc29hcFJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9ydE5hbWVJdGVtUHJvdmlkZXIgcG9ydE5hbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvcnROYW1lQWRhcHRlcigpIHsKLQkJaWYgKHBvcnROYW1lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBvcnROYW1lSXRlbVByb3ZpZGVyID0gbmV3IFBvcnROYW1lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBvcnROYW1lSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkRlc2NyaXB0aW9uVHlwZX1pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIgZGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25UeXBlQWRhcHRlcigpIHsKLQkJaWYgKGRlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZXNjcmlwdGlvblR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgRGVzY3JpcHRpb25UeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uVHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGV9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyIGRpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzY29tbW9uLkRpc3BsYXlOYW1lVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc3BsYXlOYW1lVHlwZUFkYXB0ZXIoKSB7Ci0JCWlmIChkaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGlzcGxheU5hbWVUeXBlSXRlbVByb3ZpZGVyID0gbmV3IERpc3BsYXlOYW1lVHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaXNwbGF5TmFtZVR5cGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLnBhcmVudEFkYXB0ZXJGYWN0b3J5ID0gcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpIHx8IHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7Ci0JCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHx8ICgoKENsYXNzKSB0eXBlKS5pc0luc3RhbmNlKGFkYXB0ZXIpKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgbGlzdGVuZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfWFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZS9wcm92aWRlci9Xc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5MTkyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlL3Byb3ZpZGVyL1dzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud3NkZC5wcm92aWRlci5IYW5kbGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5pbnRlcm5hbC51dGlsLldzZGRBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGZhY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZXMgbmVlZGVkIHRvIHN1cHBvcnQgVmlld2Vycy4gVGhlCi0gKiBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GIGFkYXB0ZXIgbm90aWZpY2F0aW9ucyBpbnRvIGNhbGxzIHRvCi0gKiB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gVGhlIGFkYXB0ZXJzIGFsc28gc3VwcG9ydCBFY2xpcHNlIHByb3BlcnR5IHNoZWV0cy4KLSAqIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBhZGFwdGVycyBhcmUgc2hhcmVkIGFtb25nIG11bHRpcGxlIGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXc2RkSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBXc2RkQWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5LCBJQ2hhbmdlTm90aWZpZXIgewotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieQotCSAqIHtAbGluayAjaXNGYWN0b3J5Rm9yVHlwZSBpc0ZhY3RvcnlGb3JUeXBlfS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHN1cHBvcnRlZFR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdzZGRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1Qcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZXN9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViU2VydmljZXNJdGVtUHJvdmlkZXIgd2ViU2VydmljZXNJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViU2VydmljZXNBZGFwdGVyKCkgewotCQlpZiAod2ViU2VydmljZXNJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd2ViU2VydmljZXNJdGVtUHJvdmlkZXIgPSBuZXcgV2ViU2VydmljZXNJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd2ViU2VydmljZXNJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb259aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3ZWJTZXJ2aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgV2ViU2VydmljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdlYlNlcnZpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnR9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlciBwb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50fS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9ydENvbXBvbmVudEFkYXB0ZXIoKSB7Ci0JCWlmIChwb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBvcnRDb21wb25lbnRJdGVtUHJvdmlkZXIgPSBuZXcgUG9ydENvbXBvbmVudEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwb3J0Q29tcG9uZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuV1NETFBvcnR9aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV1NETFBvcnRJdGVtUHJvdmlkZXIgd3NkbFBvcnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLldTRExQb3J0fS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV1NETFBvcnRBZGFwdGVyKCkgewotCQlpZiAod3NkbFBvcnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd3NkbFBvcnRJdGVtUHJvdmlkZXIgPSBuZXcgV1NETFBvcnRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd3NkbFBvcnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW59aW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyIHNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuU2VydmljZUltcGxCZWFufS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VydmljZUltcGxCZWFuQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzZXJ2aWNlSW1wbEJlYW5JdGVtUHJvdmlkZXIgPSBuZXcgU2VydmljZUltcGxCZWFuSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZpY2VJbXBsQmVhbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyIHNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5TZXJ2bGV0TGlua30uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlcnZsZXRMaW5rQWRhcHRlcigpIHsKLQkJaWYgKHNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyID0gbmV3IFNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHNlcnZsZXRMaW5rSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuRUpCTGlua31pbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFSkJMaW5rSXRlbVByb3ZpZGVyIGVqYkxpbmtJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkVKQkxpbmt9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFSkJMaW5rQWRhcHRlcigpIHsKLQkJaWYgKGVqYkxpbmtJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZWpiTGlua0l0ZW1Qcm92aWRlciA9IG5ldyBFSkJMaW5rSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVqYkxpbmtJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhhbmRsZXJJdGVtUHJvdmlkZXIgaGFuZGxlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcn0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUhhbmRsZXJBZGFwdGVyKCkgewotCQlpZiAoaGFuZGxlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQloYW5kbGVySXRlbVByb3ZpZGVyID0gbmV3IEhhbmRsZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaGFuZGxlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud2Vic2VydmljZS53c2RkLkJlYW5MaW5rfWluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEJlYW5MaW5rSXRlbVByb3ZpZGVyIGJlYW5MaW5rSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5CZWFuTGlua30uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJlYW5MaW5rQWRhcHRlcigpIHsKLQkJaWYgKGJlYW5MaW5rSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWJlYW5MaW5rSXRlbVByb3ZpZGVyID0gbmV3IEJlYW5MaW5rSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGJlYW5MaW5rSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cGVyLmFkYXB0KG5vdGlmaWVyLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn1hbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlL3dlYnNlcnZpY2Uvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd3NkZC9wcm92aWRlci9IYW5kbGVySXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93c2RkL3Byb3ZpZGVyL0hhbmRsZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyNDJiNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uvd2Vic2VydmljZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93c2RkL3Byb3ZpZGVyL0hhbmRsZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53c2RkLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5wcm92aWRlci5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmFkYXB0ZXIuQWRhcHRlclZpZXdlckl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZS5wbHVnaW4uV2ViU2VydmljZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLS8qCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBiZSBtZXJnZWQgd2l0aCBIYW5kbGVySXRlbVByb3ZpZGVyIGluIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2UucHJvdmlkZXIKLSAqIHBhY2thZ2UgYW5kIGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgY2xhc3MgbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIEhhbmRsZXJJdGVtUHJvdmlkZXIgaW4gCi0gKiBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC53ZWJzZXJ2aWNlLnByb3ZpZGVyIHBhY2thZ2UuCi0gKi8KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyfW9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBIYW5kbGVySXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSGFuZGxlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRIYW5kbGVyTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSGFuZGxlckNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJZCBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwotCSAqIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQkvKgotCSAqIHBnbSBwcm90ZWN0ZWQgdm9pZCBhZGRJZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7IGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZCAobmV3Ci0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvciAoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkgKiBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX2lkX2ZlYXR1cmUiKSwgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwKLQkgKiAiX1VJX0hhbmRsZXJfaWRfZmVhdHVyZSIsICJfVUlfSGFuZGxlcl90eXBlIiksIFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0lkKCksIHRydWUsCi0JICogSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7IH0KLQkgKi8KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIYW5kbGVyIE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGFuZGxlck5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX0hhbmRsZXJfaGFuZGxlck5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfSGFuZGxlcl9oYW5kbGVyTmFtZV9mZWF0dXJlIiwgIl9VSV9IYW5kbGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlck5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhhbmRsZXIgQ2xhc3MgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGFuZGxlckNsYXNzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9IYW5kbGVyX2hhbmRsZXJDbGFzc19mZWF0dXJlIiwgIl9VSV9IYW5kbGVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfSGFuZGxlckNsYXNzKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfWFuZAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpKTsKLQkJCWNoaWxkcmVuUmVmZXJlbmNlcy5hZGQoV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldEhhbmRsZXJfU29hcFJvbGVzKCkpOwotCQkJLy9jaGlsZHJlblJlZmVyZW5jZXMuYWRkKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX0hhbmRsZXJDbGFzcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEhhbmRsZXIuZ2lmLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsgcmV0dXJuCi0JICogZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvSGFuZGxlciIpOyB9Ci0JICovCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgeyBTdHJpbmcgbGFiZWwgPSAoKEhhbmRsZXIpb2JqZWN0KS5nZXREaXNwbGF5TmFtZSgpOwotCSAqIHJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9IYW5kbGVyX3R5cGUiKSA6Ci0JICogZ2V0U3RyaW5nKCJfVUlfSGFuZGxlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgfQotCSAqLwotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBIYW5kbGVyLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQG5vbi1nZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJpY29ucy9vYmoxNi9oYW5kbGVyLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAbm9uLWdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSGFuZGxlcikgb2JqZWN0KS5nZXRIYW5kbGVyTmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCIlX1VJX0hhbmRsZXJfdHlwZSIpIDogbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbm90aWZpY2F0aW9uIGJ5IGNhbGxpbmcge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZCBmaXJlTm90aWZ5Q2hhbmdlZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoSGFuZGxlci5jbGFzcykpIHsKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9OQU1FIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fSEFORExFUl9DTEFTUyA6Ci0JCQljYXNlIFdzZGRQYWNrYWdlLkhBTkRMRVJfX0lOSVRfUEFSQU1TIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU09BUF9IRUFERVJTIDoKLQkJCWNhc2UgV3NkZFBhY2thZ2UuSEFORExFUl9fU09BUF9ST0xFUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cwotCSAqIGRlc2NyaWJpbmcgYWxsIG9mIHRoZSBjaGlsZHJlbiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Jbml0UGFyYW1zKCksIFdzY29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5pdFBhcmFtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SGFuZGxlcl9Tb2FwSGVhZGVycygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBIZWFkZXIoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFdzZGRQYWNrYWdlLmVJTlNUQU5DRS5nZXRIYW5kbGVyX1NvYXBSb2xlcygpLCBXc2NvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNPQVBSb2xlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFdlYlNlcnZpY2VQbHVnaW4uZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMKLQkgKiB7QGxpbmsgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbn1ieSBjYWxsaW5nCi0JICoge0BsaW5rICNnZXRDaGlsZHJlblJlZmVyZW5jZXMgZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzfWFuZCB1c2luZyB0aG9zZSB0byBjb2xsZWN0IHRoZSBjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkKLQkJCXJldHVybiBnZXRDaGlsZHJlbkZyb21FTGlzdCgoRUxpc3QpIG9iamVjdCk7Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFkYXB0ZXJWaWV3ZXJJdGVtKQotCQkJcmV0dXJuIGdldENoaWxkcmVuRnJvbUFkYXB0ZXJWaWV3ZXJJdGVtKChBZGFwdGVyVmlld2VySXRlbSkgb2JqZWN0KTsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tRUxpc3QoRUxpc3QgZUxpc3QpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KQotCQkJcmVzdWx0LmFkZEFsbChzdXBlci5nZXRDaGlsZHJlbihpdC5uZXh0KCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21BZGFwdGVyVmlld2VySXRlbShBZGFwdGVyVmlld2VySXRlbSBhZGFwdGVyVmlld2VySXRlbSkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRUxpc3QgZU9iamVjdExpc3QgPSBhZGFwdGVyVmlld2VySXRlbS5nZXRFT2JqZWN0TGlzdCgpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXJWaWV3ZXJJdGVtLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZU9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCU9iamVjdCBvYmplY3QgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdCkKLQkJCQkJcmVzdWx0LmFkZEFsbCgoTGlzdCkgb2JqZWN0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvLmNsYXNzcGF0aAppbmRleCA5YzllMjNmLi5kZjI4N2Q5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlLy5jbGFzc3BhdGgKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS8uY2xhc3NwYXRoCkBAIC0xLDYgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIDxjbGFzc3BhdGg+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iajJlZXBsdWdpbiIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Imx0a2Jhc2VkcmVmYWN0b3JpbmciLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb250ZW50dHlwZSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbiIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbmVkaXQiLz4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggNTc5YTgxNy4uNzQyYTcwMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTEsNjIgKzEsOTUgQEAKLSNNb24gRmViIDE4IDE1OjU3OjA5IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCisjV2VkIEp1biAyNCAyMDoxNDo0OCBFRFQgMjAwOQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uY29tcGFyaW5nSWRlbnRpY2FsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnRTdXBlcmludGVyZmFjZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1N5bmNocm9uaXplZE9uSW5oZXJpdGVkTWV0aG9kPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0hhc2hDb2RlTWV0aG9kPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWVycm9yCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlVW5jaGVja2VkRXhjZXB0aW9ucz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZworaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggYzQ3ODdmZC4uMGRmN2I3MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0yLDcgKzIsNyBAQAogQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIxNy5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiAxLjEuNDA2LnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpAQCAtMjYsMjAgKzI2LDE4IEBACiAgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aCwKKyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uZXhwb3J0bW9kZWwsCiAgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlbGV0ZTt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveTt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzO3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXA7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb247eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW47eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0O3gtaW50ZXJuYWw6PXRydWUsCiAgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5mYWNldCwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlbmFtZTt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnNlcnZlcnRhcmdldDt4LWludGVybmFsOj10cnVlLAogIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlczt4LWludGVybmFsOj10cnVlLApAQCAtNDksMzggKzQ3LDQzIEBACiAgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldCwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3RvciwKICBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5saXN0ZW5lcnMsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9ucworIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMsCisgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5sdGsuY29yZS5jaGFuZ2UsCisgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5sdGsuY29yZS5kZXNjcmlwdG9yLAorIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUubHRrLmNvcmUubmxzLAorIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUubHRrLmNvcmUucGFydGljaXBhbnQsCisgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5sdGsuY29yZS5yZWZhY3RvcmluZ2NoZWNrZXIKIFJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCisgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKICBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKICBvcmcuZWNsaXBzZS5qZW07YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKICBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbjtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKICBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjcsMi4wLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKICBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCiAgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb250cm9sbGVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndlYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiLAorIG9yZy5lY2xpcHNlLndzdC53ZWI7YnVuZGxlLXZlcnNpb249IlsxLjEuNDAxLDEuMi4wKSIsCisgY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IjMuOC4xIiwKICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVudmlyb25tZW50O2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAogIG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIKKyBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW07YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAorIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nO2J1bmRsZS12ZXJzaW9uPSIzLjQuMSIKIEVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvY29tcG9uZW50Y29yZS91dGlsL0FwcENsaWVudEFydGlmYWN0RWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9jb21wb25lbnRjb3JlL3V0aWwvQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmphdmEKaW5kZXggYWE5ZDJmMi4uYzg5OGE4OSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9jb21wb25lbnRjb3JlL3V0aWwvQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9jb21wb25lbnRjb3JlL3V0aWwvQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLkphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwpAQCAtNDgsNyArNDksNyBAQAogCiBwdWJsaWMgY2xhc3MgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGV4dGVuZHMgRW50ZXJwcmlzZUFydGlmYWN0RWRpdCBpbXBsZW1lbnRzIElBcnRpZmFjdEVkaXRGYWN0b3J5IHsKIAkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQQ0xJRU5UX0NPTlRFTlRfVFlQRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBjbGllbnRERCI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVF9DT05URU5UX1RZUEUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwY2xpZW50REQiOyAvLyROT04tTkxTLTEkCiAJLyoqCiAJICogPHA+CiAJICogSWRlbnRpZmllciB1c2VkIHRvIGxpbmsgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IHRvIGEgQXBwQ2xpZW50RWRpdEFkYXB0ZXJGYWN0b3J5IHtAc2VlCkBAIC02OSw2ICs3MCw3IEBACiAJCXN1cGVyKGFNb2R1bGUpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQmluYXJ5Q29tcG9uZW50SGVscGVyIGluaXRCaW5hcnlDb21wb25lbnRIZWxwZXIoSVZpcnR1YWxDb21wb25lbnQgYmluYXJ5TW9kdWxlKSB7CiAJCXJldHVybiBuZXcgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyKGJpbmFyeU1vZHVsZSk7CiAJfQpAQCAtMTEwLDYgKzExMiw3IEBACiAJICogIAogCSAqLwogCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSB7CiAJCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwogCQlpZihpc0JpbmFyeSgpKXsKQEAgLTEyOCw2ICsxMzEsNyBAQAogCSAqIEByZXR1cm4gRU9iamVjdAogCSAqICAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSB7CiAJCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwogCQlMaXN0IGNvbnRlbnRzID0gZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldENvbnRlbnRzKCk7CkBAIC0yMTUsNiArMjE5LDcgQEAKIAkgKiAgCiAJICovCiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgaW50IGdldEoyRUVWZXJzaW9uKCkgewogCQl2ZXJpZnlPcGVyYXRpb25TdXBwb3J0ZWQoKTsKIAkJcmV0dXJuIGdldEFwcGxpY2F0aW9uQ2xpZW50WG1pUmVzb3VyY2UoKS5nZXRKMkVFVmVyc2lvbklEKCk7CkBAIC0zNTEsOSArMzU2LDEwIEBACiAJcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRBcHBsaWNhdGlvbkNsaWVudE1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhTW9kdWxlKSB0aHJvd3MgVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiB7CiAJCWlmICghaXNWYWxpZEVkaXRhYmxlTW9kdWxlKGFNb2R1bGUpKQogCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoYU1vZHVsZS5nZXRQcm9qZWN0KCkpOworCQlyZXR1cm4gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChhTW9kdWxlLmdldFByb2plY3QoKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkgewogCQlpZihpc0JpbmFyeSgpKXsKIAkJCXRocm93QXR0ZW1wdGVkQmluYXJ5RWRpdE1vZGVsQWNjZXNzKCk7CkBAIC0zNjMsNyArMzY5LDggQEAKICAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuRW50ZXJwcmlzZUFydGlmYWN0RWRpdCNjcmVhdGVNb2RlbFJvb3QoamF2YS5sYW5nLkludGVnZXIpCiAgICAgICovCi0gICAgcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7CisgICAgQE92ZXJyaWRlCisJcHVibGljIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KGludCB2ZXJzaW9uKSB7CiAgICAgCWlmKGlzQmluYXJ5KCkpewogCQkJdGhyb3dBdHRlbXB0ZWRCaW5hcnlFZGl0TW9kZWxBY2Nlc3MoKTsKIAkJfQpAQCAtMzgzLDE2ICszOTAsMTYgQEAKIAkJcmV0dXJuIGdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvcldyaXRlKGFDb21wb25lbnQpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBBcmNoaXZlIGFzQXJjaGl2ZShib29sZWFuIGluY2x1ZGVTb3VyY2UsIGJvb2xlYW4gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbnsKIAkJaWYgKGlzQmluYXJ5KCkpIHsKIAkJCUphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSAoSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyKWdldEJpbmFyeUNvbXBvbmVudEhlbHBlcigpOwogCQkJcmV0dXJuIGhlbHBlci5hY2Nlc3NMZWdhY3lBcmNoaXZlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlBcHBDbGllbnRDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGxvYWRlciA9IG5ldyBBcHBDbGllbnRDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKGdldENvbXBvbmVudCgpKTsKLQkJCWxvYWRlci5zZXRFeHBvcnRTb3VyY2UoaW5jbHVkZVNvdXJjZSk7Ci0JCQlTdHJpbmcgdXJpID0gTW9kdWxlVVJJVXRpbC5nZXRIYW5kbGVTdHJpbmcoZ2V0Q29tcG9uZW50KCkpOwotCQkJcmV0dXJuIENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKGxvYWRlciwgdXJpKTsKIAkJfQorCQlBcHBDbGllbnRDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGxvYWRlciA9IG5ldyBBcHBDbGllbnRDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKGdldENvbXBvbmVudCgpKTsKKwkJbG9hZGVyLnNldEV4cG9ydFNvdXJjZShpbmNsdWRlU291cmNlKTsKKwkJU3RyaW5nIHVyaSA9IE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKGdldENvbXBvbmVudCgpKTsKKwkJcmV0dXJuIENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKGxvYWRlciwgdXJpKTsKIAl9CiAJCiAJcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZURlcGxveW1lbnREZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QsIGludCB2ZXJzaW9uKSB7CkBAIC00MDcsMTMgKzQxNCwxNiBAQAogCQkJYXBwQ2xpZW50RWRpdC5kaXNwb3NlKCk7CiAJCX0gCiAJfQorCUBPdmVycmlkZQogCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKElNb2RlbFByb3ZpZGVyKWdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQocHJvamVjdCk7CisJCXJldHVybiBnZXRBcHBDbGllbnRBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJTW9kZWxQcm92aWRlciBjcmVhdGUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiAoSU1vZGVsUHJvdmlkZXIpZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOworCQlyZXR1cm4gZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwogCX0KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBtb2RpZnkoUnVubmFibGUgcnVubmFibGUsIElQYXRoIG1vZGVsUGF0aCkgewogCQlzZXRXcml0YWJsZUVkaXQoZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKSk7CiAJCXRyeXsKQEAgLTQzMCwxMCArNDQwLDEyIEBACiAJfQogCiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZURlc2NyaWJlcigpIHsKIAkJCiAJCXJldHVybiBBUFBDTElFTlRfQ09OVEVOVF9UWVBFOwogCX0KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgVVJJIGdldFJvb3RVUkkoKSB7CiAJCXJldHVybiBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJX09CSjsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2NyZWF0aW9uL0FwcENsaWVudENvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2NyZWF0aW9uL0FwcENsaWVudENvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggOWQxZWJhMy4uZWE1MTJjYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9jcmVhdGlvbi9BcHBDbGllbnRDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvY3JlYXRpb24vQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMTEsOSArMTEsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklBcHBDbGllbnRDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5BcHBDbGllbnRDb21wb25lbnRJbXBvcnRPcGVyYXRpb247CkBAIC0zOCwyNSArMzUsMjUgQEAKIAkJc3VwZXIoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgaW50IGdldFR5cGUoKSB7CiAJCXJldHVybiBYTUxSZXNvdXJjZS5BUFBfQ0xJRU5UX1RZUEU7CiAJfQogCi0JcHJvdGVjdGVkIEFyY2hpdmUgb3BlbkFyY2hpdmUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKGdldEFyY2hpdmVPcHRpb25zKCksIHVyaSk7Ci0JfQotCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgaGFuZGxlVW5rbm93blR5cGUoSmF2YUVFUXVpY2tQZWVrIGpxcCkgewogCQlqcXAuc2V0VHlwZShKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfVFlQRSk7Ci0JCWpxcC5zZXRWZXJzaW9uKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQpOwotCQlqcXAuc2V0SmF2YUVFVmVyc2lvbihKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEKTsKKwkJanFwLnNldFZlcnNpb24oSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRCk7CisJCWpxcC5zZXRKYXZhRUVWZXJzaW9uKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQpOwogCX0KIAogCQorCUBPdmVycmlkZQogCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7CiAJCXJldHVybiBuZXcgQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0T3BlcmF0aW9uKG1vZGVsKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKSB7CiAJCUlEYXRhTW9kZWwgYXBwQ2xpZW50RGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFwcENsaWVudEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CiAJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcClhcHBDbGllbnREYXRhTW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwpAQCAtNjUsMjQgKzYyLDMxIEBACiAJCXJldHVybiBhcHBDbGllbnREYXRhTW9kZWw7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKIAkJYm9vbGVhbiBzZXQgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwogCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhBUkNISVZFX1dSQVBQRVIpKSB7Ci0JCQlJRGF0YU1vZGVsIG1vZHVsZURNID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKTsKIAkJCWlmIChnZXRBcmNoaXZlV3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIG1vZHVsZURNLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLQkJCQlJRGF0YU1vZGVsIGFwcENsaWVudEZhY2V0RGF0YU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKCBKMkVFUHJvamVjdFV0aWxpdGllcy5BUFBMSUNBVElPTl9DTElFTlQgKTsKLQotCQkJCWludCB2ZXJzaW9uID0gZ2V0TW9kdWxlU3BlY1ZlcnNpb24oKTsKLQkJCQlTdHJpbmcgdmVyc2lvblRleHQgPSBKMkVFVmVyc2lvblV0aWwuZ2V0SjJFRVRleHRWZXJzaW9uKCB2ZXJzaW9uICk7Ci0JCQkJYXBwQ2xpZW50RmFjZXREYXRhTW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgdmVyc2lvblRleHQpOwotCQkJCXVwZGF0ZUphdmFGYWNldFZlcnNpb24oKTsKKwkJCQlyZWZyZXNoSW50ZXJwcmV0ZWRTcGVjVmVyc2lvbigpOwogCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFBST0pFQ1RfTkFNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gc2V0OwogCX0KIAorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hJbnRlcnByZXRlZFNwZWNWZXJzaW9uKCkgeworCQlJRGF0YU1vZGVsIG1vZHVsZURNID0gbW9kZWwuZ2V0TmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OKTsKKwkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBtb2R1bGVETS5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7CisJCUlEYXRhTW9kZWwgYXBwQ2xpZW50RmFjZXREYXRhTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkFQUExJQ0FUSU9OX0NMSUVOVCApOworCQlpbnQgdmVyc2lvbiA9IGdldEludGVycHJldGVkU3BlY1ZlcnNpb24oZ2V0QXJjaGl2ZVdyYXBwZXIoKSkuZ2V0VmVyc2lvbigpOworCQlTdHJpbmcgdmVyc2lvblRleHQgPSBKMkVFVmVyc2lvblV0aWwuZ2V0SjJFRVRleHRWZXJzaW9uKCB2ZXJzaW9uICk7CisJCWFwcENsaWVudEZhY2V0RGF0YU1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIHZlcnNpb25UZXh0KTsKKwkJdXBkYXRlV29ya2luZ0NvcHlGYWNldFZlcnNpb24obW9kdWxlRE0sIGFwcENsaWVudEZhY2V0RGF0YU1vZGVsKTsKKwkJdXBkYXRlSmF2YUZhY2V0VmVyc2lvbigpOworCX0KKwkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBpbml0KCkgewogCQlzdXBlci5pbml0KCk7CiAJCUlEYXRhTW9kZWwgY29tcG9uZW50Q3JlYXRpb25ETSA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTik7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL2NyZWF0aW9uL0FwcENsaWVudEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvY3JlYXRpb24vQXBwQ2xpZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmluZGV4IDFiZjZhM2EuLjYyMjY1MmUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvY3JlYXRpb24vQXBwQ2xpZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb25jbGllbnQvaW50ZXJuYWwvY3JlYXRpb24vQXBwQ2xpZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0zMiw2ICszMiw3IEBACiAJCXN1cGVyKCk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGluaXQoKSB7CiAJCXN1cGVyLmluaXQoKTsKIApAQCAtNjIsNiArNjMsNyBAQAogCQl9KTsJCiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7CiAJCWlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBNT0RVTEVfVVJJICkpewogCQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBnZXRQcm9wZXJ0eShGQUNFVF9ETV9NQVApOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbmNsaWVudC9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvQXBwQ2xpZW50RWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9BcHBDbGllbnRFZGl0QWRhcHRlckZhY3RvcnkuamF2YQppbmRleCBmM2Y1MDk1Li5lZDcxYTAzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9BcHBDbGllbnRFZGl0QWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uY2xpZW50L2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9BcHBDbGllbnRFZGl0QWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMTIsNyArMTIsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5jb21wb25lbnRjb3JlLnV0aWwuQXBwQ2xpZW50QXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwogCkBAIC0yNSw3ICsyNSw3IEBACiAJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7CiAJCWlmIChhZGFwdGVyVHlwZSA9PSBBcHBDbGllbnRBcnRpZmFjdEVkaXQuQURBUFRFUl9UWVBFIHx8IGFkYXB0ZXJUeXBlID09IEFydGlmYWN0RWRpdC5BREFQVEVSX1RZUEUpIHsKIAkJCUFydGlmYWN0RWRpdE1vZGVsIGVkaXRNb2RlbCA9IChBcnRpZmFjdEVkaXRNb2RlbCkgYWRhcHRhYmxlT2JqZWN0OwotCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KGVkaXRNb2RlbC5nZXRQcm9qZWN0KCkpKQorCQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoZWRpdE1vZGVsLmdldFByb2plY3QoKSkpCiAJCQkJcmV0dXJuIG5ldyBBcHBDbGllbnRBcnRpZmFjdEVkaXQoKEFydGlmYWN0RWRpdE1vZGVsKSBhZGFwdGFibGVPYmplY3QpOwogCQl9CiAJCXJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCA3NDUyNzllLi45OTliNmI1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMTIsMTAgKzEyLDIxIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKIAogcHVibGljIGNsYXNzIEFwcENsaWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUFwcENsaWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewpAQCAtMjQsMzUgKzM1LDc5IEBACiAJCXN1cGVyKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewogCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CiAJCW5hbWVzLmFkZChDUkVBVEVfREVGQVVMVF9NQUlOX0NMQVNTKTsKIAkJcmV0dXJuIG5hbWVzOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRfSUQpKQogCQkJcmV0dXJuIEFQUExJQ0FUSU9OX0NMSUVOVDsKIAkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDUkVBVEVfREVGQVVMVF9NQUlOX0NMQVNTKSkKIAkJCXJldHVybiBCb29sZWFuLlRSVUU7CiAJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09ORklHX0ZPTERFUikpCisJCXsKKwkJCWlmIChtb2RlbC5pc1Byb3BlcnR5U2V0KEZBQ0VUX1BST0pFQ1RfTkFNRSkpCisJCQl7CisJCQkJU3RyaW5nIHByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKTsKKwkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKHByb2plY3ROYW1lLmxlbmd0aCgpID4gMCkgPyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpIDogbnVsbDsKKwkJCQkKKwkJCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuZXhpc3RzKCkpIHsKKwkJCQkJaWYgKE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkpCisJCQkJCXsKKwkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0LCB0cnVlKTsKKwkJCQkJCUlWaXJ0dWFsRm9sZGVyIGVqYnJvb3QgPSBjLmdldFJvb3RGb2xkZXIoKTsKKwkJCQkJCUlQYXRoIGNvbmZpZ0ZvbGRlclBhdGggPSBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5nZXREZWZhdWx0RGVwbG95bWVudERlc2NyaXB0b3JGb2xkZXIoZWpicm9vdCk7CisJCQkJCQlpZiAoY29uZmlnRm9sZGVyUGF0aCAhPSBudWxsICYmIHByb2plY3QuZ2V0Rm9sZGVyKGNvbmZpZ0ZvbGRlclBhdGgpLmV4aXN0cygpKQorCQkJCQkJeworCQkJCQkJCXJldHVybiBjb25maWdGb2xkZXJQYXRoLnRvU3RyaW5nKCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CiAJCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkFQUF9DTElFTlRfQ09OVEVOVF9GT0xERVIpOworCQl9CiAJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTU9EVUxFX1VSSSkpIHsKIAkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSkucmVwbGFjZSgnICcsJ18nKTsKIAkJCXJldHVybiBwcm9qZWN0TmFtZSArIElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQ7IAogCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFTkVSQVRFX0REKSkgewotCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKWdldFByb3BlcnR5KEZBQ0VUX1ZFUlNJT04pOwotCQkJaWYoZmFjZXRWZXJzaW9uID09IEFQUExJQ0FUSU9OX0NMSUVOVF81MCl7CisJCQlTdHJpbmcgZmFjZXRWZXJzaW9uID0gZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfVkVSU0lPTl9TVFIpOworCQkJaWYoSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQoZmFjZXRWZXJzaW9uKSA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEKXsKIAkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oSjJFRVByZWZlcmVuY2VzLktleXMuQVBQX0NMSUVOVF9HRU5FUkFURV9ERCkpOwogCQkJfQogCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT1VUUFVUX0ZPTERFUikpIHsKLQkJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSjJFRVByZWZlcmVuY2VzLktleXMuQVBQX0NMSUVOVF9PVVRQVVRfRk9MREVSKTsJCiAJCX0KIAkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBpbnQgY29udmVydEZhY2V0VmVyc2lvblRvSjJFRVZlcnNpb24oSVByb2plY3RGYWNldFZlcnNpb24gdmVyc2lvbikgewogCQlyZXR1cm4gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRBcHBDbGllbnRWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpKTsKIAl9CisJCisgICAgQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKKyAgICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09ORklHX0ZPTERFUikpIAorICAgICAgICB7CisgICAgICAgICAgICBpZiggdGhpcy5qYXZhRmFjZXRJbnN0YWxsQ29uZmlnICE9IG51bGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbmFsIElQYXRoIHNvdXJjZUZvbGRlcgorICAgICAgICAgICAgICAgICAgICA9IHByb3BlcnR5VmFsdWUgPT0gbnVsbCA/IG51bGwgOiBuZXcgUGF0aCggKFN0cmluZykgcHJvcGVydHlWYWx1ZSApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHRoaXMuamF2YUZhY2V0SW5zdGFsbENvbmZpZy5zZXRTb3VyY2VGb2xkZXIoIHNvdXJjZUZvbGRlciApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEZBQ0VUX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkKKyAgICAgICAgeworCQkJaWYgKCFtb2RlbC5pc1Byb3BlcnR5U2V0KENPTkZJR19GT0xERVIpKSB7CisJCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoQ09ORklHX0ZPTERFUiwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7CisJCQl9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9BcHBDbGllbnRGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudEZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKaW5kZXggZWI1YWU2Yi4uNDZhYjFiZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudEZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudEZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTQsNiArMTQsNyBAQAogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlhNTFdyaXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwpAQCAtMjcsMTQgKzI4LDE0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5XdHBVdGlsczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5DbGFzc3BhdGhIZWxwZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuY29tcG9uZW50Y29yZS51dGlsLkFwcENsaWVudEFydGlmYWN0RWRpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLkoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5GYWNldERhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwpAQCAtNTgsNyArNTksNyBAQAogCQkJV3RwVXRpbHMuYWRkTmF0dXJlcyhwcm9qZWN0KTsKIAogCQkJLy8gU2V0dXAgdGhlIGZsZXhpYmxlIHByb2plY3Qgc3RydWN0dXJlLgotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYyA9IGNyZWF0ZUZsZXhpYmxlUHJvamVjdChtb25pdG9yLCBwcm9qZWN0LCBtb2RlbCwganByb2osIGZ2KTsKKwkJCWNyZWF0ZUZsZXhpYmxlUHJvamVjdChtb25pdG9yLCBwcm9qZWN0LCBtb2RlbCwganByb2osIGZ2KTsKIAogCQkJLy8gU2V0dXAgdGhlIGNsYXNzcGF0aC4KIAkJCUNsYXNzcGF0aEhlbHBlci5yZW1vdmVDbGFzc3BhdGhFbnRyaWVzKHByb2plY3QsIGZ2KTsKQEAgLTcyLDcgKzczLDcgQEAKIC8vCQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfREVGQVVMVF9NQUlOX0NMQVNTKSkKIC8vCQkJCWFkZE1haW5DbGFzcyhtb25pdG9yLCBtb2RlbCwgcHJvamVjdCk7CiAKLQkJCWlmKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlscy5nZXREZWZhdWx0VXNlRUFSTGlicmFyaWVzKCkpeworCQkJaWYoIG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuSU5TVEFMTF9FQVJfTElCUkFSWSkpewogCQkJCWZpbmFsIElQYXRoIGVhckxpYkNvbnRhaW5lciA9IG5ldyBQYXRoKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIuQ09OVEFJTkVSX0lEKTsKIAkJCQlhZGRUb0NsYXNzcGF0aChqcHJvaiwgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoZWFyTGliQ29udGFpbmVyKSk7CiAJCQl9CkBAIC04MCwxMyArODEsMTMgQEAKIAkJCXRyeSB7CiAJCQkJKChJRGF0YU1vZGVsT3BlcmF0aW9uKSBtb2RlbC5nZXRQcm9wZXJ0eShGYWNldERhdGFNb2RlbFByb3ZpZGVyLk5PVElGSUNBVElPTl9PUEVSQVRJT04pKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwogCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAogCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKIAkJCQltb25pdG9yLndvcmtlZCgxKTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0gZmluYWxseSB7CiAJCQlpZiAobW9uaXRvciAhPSBudWxsKQogCQkJCW1vbml0b3IuZG9uZSgpOwpAQCAtMTA2LDE1ICsxMDcsMTcgQEAKIAkJSUZvbGRlciBzb3VyY2VGb2xkZXIgPSBudWxsOwogCQlTdHJpbmcgY29uZmlnRm9sZGVyID0gbnVsbDsKIAkJY29uZmlnRm9sZGVyID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTkZJR19GT0xERVIpOwotCQlyb290LmNyZWF0ZUxpbmsobmV3IFBhdGgoIi8iICsgY29uZmlnRm9sZGVyKSwgMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKKwkJUGF0aCBjb25maWdGb2xkZXJQYXRoID0gbmV3IFBhdGgoY29uZmlnRm9sZGVyKTsKKwkJcm9vdC5jcmVhdGVMaW5rKGNvbmZpZ0ZvbGRlclBhdGgsIDAsIG51bGwpOyAKKwkJSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQuc2V0RGVmYXVsdERlcGxveW1lbnREZXNjcmlwdG9yRm9sZGVyKHJvb3QsIGNvbmZpZ0ZvbGRlclBhdGgsIG51bGwpOwogCQlTdHJpbmcgY29uZmlnRm9sZGVyTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSKTsKIAkJSVBhdGggY29uZmlnRm9sZGVycGF0aCA9IHBqcGF0aC5hcHBlbmQoY29uZmlnRm9sZGVyTmFtZSk7CiAJCXNvdXJjZUZvbGRlciA9IHdzLmdldFJvb3QoKS5nZXRGb2xkZXIoY29uZmlnRm9sZGVycGF0aCk7CiAKLQkJaWYoIGZ2ID09IElKMkVFRmFjZXRDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UXzUwICkKKwkJaWYoIGZ2ID09IElKMkVFRmFjZXRDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UXzYwIHx8IGZ2ID09IElKMkVFRmFjZXRDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UXzUwKQogCQl7CiAJICAgICAgICBpZihtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFTkVSQVRFX0REKSl7Ci0JICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKHdlYi54bWwpIGlmIG9uZSBkb2Vzbid0IGV4aXN0CisJICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKGFwcGxpY2F0aW9uLWNsaWVudC54bWwpIGlmIG9uZSBkb2Vzbid0IGV4aXN0CiAJICAgICAgICAgICAgSUZpbGUgYXBwQ2xpZW50RmlsZSA9IHNvdXJjZUZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9VUkkpKTsKIAkgICAgICAgICAgICBpZiAoIWFwcENsaWVudEZpbGUuZXhpc3RzKCkpIHsKIAkgICAgICAgICAgICAgICAgdHJ5IHsKQEAgLTEyMiwxMSArMTI1LDE2IEBACiAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChhcHBDbGllbnRGaWxlLmdldFBhcmVudCgpLmdldFR5cGUoKSA9PSAgSVJlc291cmNlLkZPTERFUikpewogCSAgICAgICAgICAgICAgICAgICAgICAgICgoSUZvbGRlcilhcHBDbGllbnRGaWxlLmdldFBhcmVudCgpKS5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7CiAJICAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXBwQ2xpZW50WG1sQ29udGVudHMgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48YXBwbGljYXRpb24tY2xpZW50IHZlcnNpb249XCI1XCIgeG1sbnM9XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWVcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhzaTpzY2hlbWFMb2NhdGlvbj1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzUueHNkXCI+XG4gPGRpc3BsYXktbmFtZT4iICsgcHJvamVjdC5nZXROYW1lKCkgKyAgIjwvZGlzcGxheS1uYW1lPiBcbiA8L2FwcGxpY2F0aW9uLWNsaWVudD4iOyAvLyROT04tTkxTLTEkCisJICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXBwQ2xpZW50WG1sQ29udGVudHMgPSBudWxsOworCSAgICAgICAgICAgICAgICAgICAgaWYoIGZ2ID09IElKMkVFRmFjZXRDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UXzYwKSB7CisJICAgICAgICAgICAgICAgICAgICAJYXBwQ2xpZW50WG1sQ29udGVudHMgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48YXBwbGljYXRpb24tY2xpZW50IHZlcnNpb249XCI2XCIgeG1sbnM9XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWVcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhzaTpzY2hlbWFMb2NhdGlvbj1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb24tY2xpZW50XzYueHNkXCI+XG4gPGRpc3BsYXktbmFtZT4iICsgWE1MV3JpdGVyLmdldEVzY2FwZWQocHJvamVjdC5nZXROYW1lKCkpICsgICI8L2Rpc3BsYXktbmFtZT4gXG4gPC9hcHBsaWNhdGlvbi1jbGllbnQ+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJICAgICAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKwkJICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRYbWxDb250ZW50cyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxhcHBsaWNhdGlvbi1jbGllbnQgdmVyc2lvbj1cIjVcIiB4bWxucz1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZVwiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeHNpOnNjaGVtYUxvY2F0aW9uPVwiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbi1jbGllbnRfNS54c2RcIj5cbiA8ZGlzcGxheS1uYW1lPiIgKyBYTUxXcml0ZXIuZ2V0RXNjYXBlZChwcm9qZWN0LmdldE5hbWUoKSkgKyAgIjwvZGlzcGxheS1uYW1lPiBcbiA8L2FwcGxpY2F0aW9uLWNsaWVudD4iOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCisJCSAgICAgICAgICAgICAgICB9CiAJICAgICAgICAgICAgICAgICAgICBhcHBDbGllbnRGaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYXBwQ2xpZW50WG1sQ29udGVudHMuZ2V0Qnl0ZXMoIlVURi04IikpLCB0cnVlLCBtb25pdG9yKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgICAgICAgICAgICAKIAkgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJICAgICAgICAgICAgICAgIAlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAKIAkgICAgICAgICAgICB9CiAJICAgICAgICB9CkBAIC0xNTEsNDggKzE1OSw0IEBACiAJCXJldHVybiBjOwogCX0KIAotLy8JcHJpdmF0ZSB2b2lkIGFkZE1haW5DbGFzcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElEYXRhTW9kZWwgbW9kZWwsIElQcm9qZWN0IHByb2plY3QpIHsKLS8vCQl0cnkgewotLy8JCQlJRGF0YU1vZGVsIG1haW5DbGFzc0RhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKE5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLmNsYXNzKTsKLS8vCQkJbWFpbkNsYXNzRGF0YU1vZGVsLnNldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdC5nZXROYW1lKCkpOwotLy8JCQltYWluQ2xhc3NEYXRhTW9kZWwuc2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ0xBU1NfTkFNRSwgIk1haW4iKTsgLy8kTk9OLU5MUy0xJAotLy8JCQltYWluQ2xhc3NEYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLk1BSU5fTUVUSE9ELCB0cnVlKTsKLS8vCQkJU3RyaW5nIHByb2pSZWxhdGl2ZVNvdXJjZVBhdGggPSBJUGF0aC5TRVBBUkFUT1IgKyBwcm9qZWN0LmdldE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSKTsKLS8vCQkJbWFpbkNsYXNzRGF0YU1vZGVsLnNldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVIsIHByb2pSZWxhdGl2ZVNvdXJjZVBhdGgpOwotLy8JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpOwotLy8JCQltYWluQ2xhc3NEYXRhTW9kZWwuc2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1QsIGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF0pOwotLy8JCQltYWluQ2xhc3NEYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0vLwkJCWNyZWF0ZU1hbmlmZXN0RW50cnlGb3JNYWluQ2xhc3MobW9uaXRvciwgbW9kZWwsIHByb2plY3QpOwotLy8JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJfQotLy8JfQotCi0vLwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNYW5pZmVzdEVudHJ5Rm9yTWFpbkNsYXNzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSURhdGFNb2RlbCBtb2RlbCwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLS8vCQlJVmlydHVhbENvbXBvbmVudCBhcHBDbGllbnRDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLS8vCQlJVmlydHVhbEZpbGUgdmYgPSBhcHBDbGllbnRDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKTsKLS8vCQlJRmlsZSBtYW5pZmVzdG1mID0gdmYuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLS8vCQlpZiAobWFuaWZlc3RtZiA9PSBudWxsIHx8ICFtYW5pZmVzdG1mLmV4aXN0cygpKSB7Ci0vLwkJCXRyeSB7Ci0vLwkJCQljcmVhdGVNYW5pZmVzdChwcm9qZWN0LCBhcHBDbGllbnRDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKSwgbW9uaXRvcik7Ci0vLwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0vLwkJCX0KLS8vCQkJU3RyaW5nIG1hbmlmZXN0Rm9sZGVyID0gSVBhdGguU0VQQVJBVE9SICsgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTkZJR19GT0xERVIpICsgSVBhdGguU0VQQVJBVE9SICsgSjJFRUNvbnN0YW50cy5NRVRBX0lORjsKLS8vCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBwcm9qZWN0LmdldEZvbGRlcihtYW5pZmVzdEZvbGRlcik7Ci0vLwkJCW1hbmlmZXN0bWYgPSBjb250YWluZXIuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1NIT1JUX05BTUUpKTsKLS8vCQl9Ci0vLwkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfREVGQVVMVF9NQUlOX0NMQVNTKSkgewotLy8JCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlci5jbGFzcyk7Ci0vLwkJCWRtLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3QuZ2V0TmFtZSgpKTsKLS8vCQkJZG0uc2V0Qm9vbGVhblByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5NRVJHRSwgZmFsc2UpOwotLy8JCQlkbS5zZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUFOSUZFU1RfRklMRSwgbWFuaWZlc3RtZik7Ci0vLwkJCWRtLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5NQUlOX0NMQVNTLCAiTWFpbiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCXRyeSB7Ci0vLwkJCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLS8vCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJCS8vIElnbm9yZQotLy8JCQl9Ci0vLwkJfQotLy8JfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudEZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBjbGllbnRjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudEZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmluZGV4IDQxOTlkNmQuLjU5NDM2NWQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwY2xpZW50Y3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9BcHBDbGllbnRGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGNsaWVudGNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvQXBwQ2xpZW50RmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEKQEAgLTIxLDEyICsyMSwxMiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLk5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKQEAgLTgwLDcgKzgwLDcgQEAKIAkJCWlmIChtb25pdG9yICE9IG51bGwpCiAJCQkJbW9uaXRvci53b3JrZWQoMSk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9IGZpbmFsbHkgewogCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKIAkJCQltb25pdG9yLmRvbmUoKTsKQEAgLTEwMiw3ICsxMDIsOCBAQAogCQkJCWNyZWF0ZU1hbmlmZXN0RW50cnlGb3JNYWluQ2xhc3MobW9uaXRvciwgbW9kZWwsIHByb2plY3QpOwogCQkJfQogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisKIAkJfQogCX0KIAkKQEAgLTExNCw3ICsxMTUsNyBAQAogCQkJdHJ5IHsKIAkJCQljcmVhdGVNYW5pZmVzdChwcm9qZWN0LCBhcHBDbGllbnRDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKSwgbW9uaXRvcik7CiAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJfQogCQl9CiAJCWlmIChtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUFwcENsaWVudEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX0RFRkFVTFRfTUFJTl9DTEFTUykpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL2NvbW1vbi9DcmVhdGVDaGlsZENvbW1hbmQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL2NvbW1vbi9DcmVhdGVDaGlsZENvbW1hbmQuamF2YQppbmRleCBhMWY5NGZkLi5mZjU0NGNkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcHBsaWNhdGlvbi9jb21tb24vQ3JlYXRlQ2hpbGRDb21tYW5kLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vY29tbW9uL0NyZWF0ZUNoaWxkQ29tbWFuZC5qYXZhCkBAIC05NCw2ICs5NCw3IEBACiAJICogVGhpcyBjcmVhdGVzIHRoZSBhZGQgY29tbWFuZCB0aGF0IHdpbGwgaW1wbGVtZW50IHRoaXMgYWN0aW9uIGFuZCBzcGVjaWZpZXMgdGhlIGNvbGxlY3Rpb24gYnkKIAkgKiBkZWxlZ2F0aW5nIHRvIHtAbGluayBDcmVhdGVDaGlsZENvbW1hbmQuSGVscGVyI2dldENyZWF0ZUNoaWxkSW1hZ2V9LgogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoKSB7CiAJCWlmIChmZWF0dXJlID09IG51bGwpIHsKIAkJCXJldHVybiBBZGRDb21tYW5kLmNyZWF0ZShkb21haW4sIG93bmVyLCBudWxsLCBoZWxwZXIuY3JlYXRlQ2hpbGQob3duZXIpKTsKQEAgLTEwNCw2ICsxMDUsNyBAQAogCS8qKgogCSAqIFRoaXMgZGVsZWdhdGVzIHRvIHtAbGluayBDcmVhdGVDaGlsZENvbW1hbmQuSGVscGVyI2dldENyZWF0ZUNoaWxkVG9vbFRpcFRleHR9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CiAJCXJldHVybiBoZWxwZXIuZ2V0Q3JlYXRlQ2hpbGRUb29sVGlwVGV4dChvd25lcik7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQXBwbGljYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0FwcGxpY2F0aW9uSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggYjZmNTE1Yy4uOTY0YzAyZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQXBwbGljYXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcHBsaWNhdGlvbi9wcm92aWRlci9BcHBsaWNhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMiwxMSArMjIsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwpAQCAtNDIsNyArMzcsNyBAQAogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCiAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuYXBwbGljYXRpb24uQXBwbGljYXRpb259b2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIHsKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCiAJICovCkBAIC02Nyw2ICs2Miw3IEBACiAJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZCB7QGxpbmsgQWRkQ29tbWFuZH1hbmQKIAkgKiB7QGxpbmsgUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKIAkJQXBwbGljYXRpb25QYWNrYWdlIHBrZyA9IEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0U7CiAJCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwpAQCAtODAsNiArNzYsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKIAkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgogCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCkBAIC0xMTcsNiArMTE0LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgQXBwbGljYXRpb24uZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlTdHJpbmcga2V5ID0gbnVsbDsKIAkJaWYgKCgoQXBwbGljYXRpb24pIG9iamVjdCkuZVJlc291cmNlKCkgPT0gbnVsbCkKQEAgLTEzOSw2ICsxMzcsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBBcHBsaWNhdGlvbi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwogCX0KQEAgLTE1NSw2ICsxNTQsNyBAQAogCQkJCQlBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX1ZlcnNpb24oKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAogCQlTdHJpbmcgZGlzcGxheU5hbWUgPSAoKEFwcGxpY2F0aW9uKSBvYmplY3QpLmdldERpc3BsYXlOYW1lKCk7CkBAIC0xNjcsNiArMTY3LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBcHBsaWNhdGlvbi5jbGFzcykpIHsKIAkJCWNhc2UgQXBwbGljYXRpb25QYWNrYWdlLkFQUExJQ0FUSU9OX19WRVJTSU9OIDoKQEAgLTE4Niw2ICsxODcsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIApAQCAtMjA4LDYgKzIxMCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmluZGV4IGMxMDAwYzYuLjBjNzczYzYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0FwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcHBsaWNhdGlvbi9wcm92aWRlci9BcHBsaWNhdGlvbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTEwMiwxMCArMTAyLDEyIEBACiAJCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgYWRhcHRlcktleSkgewogCQlyZXR1cm4gc3VwZXIuYWRhcHQodGFyZ2V0LCB0aGlzKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7CiAJCWlmIChpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7CiAJCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7CkBAIC0xMTcsNiArMTE5LDcgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgYWRhcHRlclR5cGUpIHsKIAkJQWRhcHRlciBhZGFwdGVyID0gc3VwZXIuYWRhcHROZXcodGFyZ2V0LCBhZGFwdGVyVHlwZSk7CiAJCWRpc3Bvc2FibGUuYWRkKGFkYXB0ZXIpOwpAQCAtMTM2LDYgKzEzOSw3IEBACiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKIAkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuYXBwbGljYXRpb24uQXBwbGljYXRpb259LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2F0aW9uQWRhcHRlcigpIHsKIAkJaWYgKGFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCWFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyID0gbmV3IEFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtMTQ4LDYgKzE1Miw3IEBACiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKIAkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuYXBwbGljYXRpb24uRWpiTW9kdWxlfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVFamJNb2R1bGVBZGFwdGVyKCkgewogCQlpZiAoZWpiTW9kdWxlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCWVqYk1vZHVsZUl0ZW1Qcm92aWRlciA9IG5ldyBFamJNb2R1bGVJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0xNjAsNiArMTY1LDcgQEAKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQogCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5hcHBsaWNhdGlvbi5KYXZhQ2xpZW50TW9kdWxlfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVKYXZhQ2xpZW50TW9kdWxlQWRhcHRlcigpIHsKIAkJaWYgKGphdmFDbGllbnRNb2R1bGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJamF2YUNsaWVudE1vZHVsZUl0ZW1Qcm92aWRlciA9IG5ldyBKYXZhQ2xpZW50TW9kdWxlSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtMTczLDYgKzE3OSw3IEBACiAJICogCiAJICogQHJldHVybiBBZGFwdGVyCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29ubmVjdG9yTW9kdWxlQWRhcHRlcigpIHsKIAkJaWYgKGNvbm5lY3Rvck1vZHVsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQljb25uZWN0b3JNb2R1bGVJdGVtUHJvdmlkZXIgPSBuZXcgQ29ubmVjdG9yTW9kdWxlSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtMTg1LDYgKzE5Miw3IEBACiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKIAkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuYXBwbGljYXRpb24uTW9kdWxlfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2R1bGVBZGFwdGVyKCkgewogCQlpZiAobW9kdWxlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCW1vZHVsZUl0ZW1Qcm92aWRlciA9IG5ldyBNb2R1bGVJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0xOTcsNiArMjA1LDcgQEAKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQogCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5hcHBsaWNhdGlvbi5XZWJNb2R1bGV9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdlYk1vZHVsZUFkYXB0ZXIoKSB7CiAJCWlmICh3ZWJNb2R1bGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJd2ViTW9kdWxlSXRlbVByb3ZpZGVyID0gbmV3IFdlYk1vZHVsZUl0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTIzMSw2ICsyNDAsNyBAQAogCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CiAJCXJldHVybiBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpIHx8IHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0Nvbm5lY3Rvck1vZHVsZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQ29ubmVjdG9yTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggZWUwODg0OC4uZGJlMTJkOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQ29ubmVjdG9yTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvQ29ubmVjdG9yTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTE4LDExICsxOCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Db25uZWN0b3JNb2R1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiAKQEAgLTMwLDcgKzI1LDcgQEAKIC8qKgogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIENvbm5lY3RvciBtb2R1bGVzIGluIGVhcnMuCiAgKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JNb2R1bGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNb2R1bGVJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CitwdWJsaWMgY2xhc3MgQ29ubmVjdG9yTW9kdWxlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTW9kdWxlSXRlbVByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTQ5LDYgKzQ0LDcgQEAKIAkgKiAgICAgICAgICAgIG9iamVjdCAtIHJlc291cmNlCiAJICogQHJldHVybiBPYmplY3QKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvY29ubmVjdG9yX21vZHVsZSIpOyAvLyROT04tTkxTLTEkCiAJfS8vIGdldEltYWdlCkBAIC01OSw2ICs1NSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCVN0cmluZyBsYWJlbCA9ICgoQ29ubmVjdG9yTW9kdWxlKSBvYmplY3QpLmdldFVyaSgpOwogCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29ubmVjdG9yTW9kdWxlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKQEAgLTcxLDYgKzY4LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKIAl9CkBAIC04Miw2ICs4MCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTkyLDYgKzkxLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5SRVNPVVJDRV9MT0NBVE9SOwogCX0KQEAgLTEwMyw2ICsxMDMsNyBAQAogCSAqICAgICAgICAgICAgb2JqZWN0IC0gcmVzb3VyY2UKIAkgKiBAcmV0dXJuIE9iamVjdAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7CiAJfS8vIGdldFBhcmVudApAQCAtMTE0LDYgKzExNSw3IEBACiAJICogICAgICAgICAgICBvYmplY3QgLSByZXNvdXJjZQogCSAqIEByZXR1cm4gTGlzdAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcHBsaWNhdGlvbi9wcm92aWRlci9FamJNb2R1bGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0VqYk1vZHVsZUl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDFkY2MwMWUuLjE4YmJlYjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0VqYk1vZHVsZUl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0VqYk1vZHVsZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0xOCwxMSArMTgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uRWpiTW9kdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogCkBAIC0zMiw3ICsyNyw3IEBACiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKICAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5hcHBsaWNhdGlvbi5FamJNb2R1bGV9b2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgRWpiTW9kdWxlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTW9kdWxlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIEVqYk1vZHVsZUl0ZW1Qcm92aWRlciBleHRlbmRzIE1vZHVsZUl0ZW1Qcm92aWRlciB7CiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgogCSAqLwpAQCAtNDMsNiArMzgsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBFamJNb2R1bGUuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgibW9kdWxlX2VqYl9vYmoiKTsgLy8kTk9OLU5MUy0xJAogCX0KQEAgLTUzLDYgKzQ5LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJU3RyaW5nIGxhYmVsID0gKChFamJNb2R1bGUpIG9iamVjdCkuZ2V0VXJpKCk7CiAJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9FamJNb2R1bGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJApAQCAtNjUsNiArNjIsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwogCX0KQEAgLTc2LDYgKzc0LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAJfQpAQCAtODQsNiArODMsNyBAQAogCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCiAJICogZW5kLXVzZXItZG9jIC0tPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuUkVTT1VSQ0VfTE9DQVRPUjsKIAl9CkBAIC05MSw2ICs5MSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIEVqYk1vZHVsZS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwogCX0KQEAgLTk4LDYgKzk5LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0phdmFDbGllbnRNb2R1bGVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL0phdmFDbGllbnRNb2R1bGVJdGVtUHJvdmlkZXIuamF2YQppbmRleCA5ZTE0YTdmLi5jNTdlZDlhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcHBsaWNhdGlvbi9wcm92aWRlci9KYXZhQ2xpZW50TW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvSmF2YUNsaWVudE1vZHVsZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0xOCwxMSArMTgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uSmF2YUNsaWVudE1vZHVsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIApAQCAtMzIsNyArMjcsNyBAQAogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCiAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuYXBwbGljYXRpb24uSmF2YUNsaWVudE1vZHVsZX1vYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBKYXZhQ2xpZW50TW9kdWxlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTW9kdWxlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIEphdmFDbGllbnRNb2R1bGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNb2R1bGVJdGVtUHJvdmlkZXIgewogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KIAkgKi8KQEAgLTQzLDYgKzM4LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgSmF2YUNsaWVudE1vZHVsZS5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJtb2R1bGVfY2xpZW50YXBwX29iaiIpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtNTMsNiArNDksNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlTdHJpbmcgbGFiZWwgPSAoKEphdmFDbGllbnRNb2R1bGUpIG9iamVjdCkuZ2V0VXJpKCk7CiAJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9KYXZhQ2xpZW50TW9kdWxlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKQEAgLTY1LDYgKzYyLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKIAl9CkBAIC03Niw2ICs3NCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTg0LDYgKzgzLDcgQEAKIAkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQogCSAqIGVuZC11c2VyLWRvYyAtLT4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLlJFU09VUkNFX0xPQ0FUT1I7CiAJfQpAQCAtOTEsNiArOTEsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBKYXZhQ2xpZW50TW9kdWxlLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7CiAJfQpAQCAtOTgsNiArOTksNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcHBsaWNhdGlvbi9wcm92aWRlci9Nb2R1bGVJdGVtUHJvdmlkZXIuamF2YQppbmRleCBjMDBmNTkxLi43MDhjZWE4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcHBsaWNhdGlvbi9wcm92aWRlci9Nb2R1bGVJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcHBsaWNhdGlvbi9wcm92aWRlci9Nb2R1bGVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7CkBAIC0zNCw3ICszMyw3IEBACiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKICAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5hcHBsaWNhdGlvbi5Nb2R1bGV9b2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQXBwbGljYXRpb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIE1vZHVsZUl0ZW1Qcm92aWRlciBleHRlbmRzIEFwcGxpY2F0aW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgogCSAqLwpAQCAtNDUsNiArNDQsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBNb2R1bGUuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoIk1vZHVsZSIpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtNTIsNiArNTIsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBNb2R1bGUuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKIAl9CkBAIC01OSw2ICs2MCw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC0xMTIsNiArMTE0LDcgQEAKIAl9CiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBnZXRVUklJZlBvc3NpYmxlKChNb2R1bGUpIG9iamVjdCk7CiAJfQpAQCAtMTIyLDYgKzEyNSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTW9kdWxlLmNsYXNzKSkgewogCQkJY2FzZSBBcHBsaWNhdGlvblBhY2thZ2UuTU9EVUxFX19VUkkgOgpAQCAtMTQwLDYgKzE0NCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTE1MCw2ICsxNTUsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FwcGxpY2F0aW9uL3Byb3ZpZGVyL1dlYk1vZHVsZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvV2ViTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggN2IxODViNi4uMDRmN2QxMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvV2ViTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXBwbGljYXRpb24vcHJvdmlkZXIvV2ViTW9kdWxlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTE5LDExICsxOSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwpAQCAtMzQsNyArMjksNyBAQAogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCiAgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuYXBwbGljYXRpb24uV2ViTW9kdWxlfW9iamVjdC4KICAqLwotcHVibGljIGNsYXNzIFdlYk1vZHVsZUl0ZW1Qcm92aWRlciBleHRlbmRzIE1vZHVsZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKK3B1YmxpYyBjbGFzcyBXZWJNb2R1bGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNb2R1bGVJdGVtUHJvdmlkZXIgewogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KIAkgKi8KQEAgLTQ1LDYgKzQwLDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgV2ViTW9kdWxlLmdpZi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoIm1vZHVsZV93ZWJfb2JqIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC01NSw2ICs1MSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCVN0cmluZyBsYWJlbCA9ICgoV2ViTW9kdWxlKSBvYmplY3QpLmdldFVyaSgpOwogCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV2ViTW9kdWxlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKQEAgLTY3LDYgKzY0LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXZWJNb2R1bGUuY2xhc3MpKSB7CiAJCQljYXNlIEFwcGxpY2F0aW9uUGFja2FnZS5XRUJfTU9EVUxFX19DT05URVhUX1JPT1QgOiB7CkBAIC04NCw2ICs4Miw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTkyLDYgKzkxLDcgQEAKIAkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQogCSAqIGVuZC11c2VyLWRvYyAtLT4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLlJFU09VUkNFX0xPQ0FUT1I7CiAJfQpAQCAtOTksNiArOTksNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBXZWJNb2R1bGUuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKIAl9CkBAIC0xMDYsNiArMTA3LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0FwcGxpY2F0aW9uQ2xpZW50SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9BcHBsaWNhdGlvbkNsaWVudEl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDNmYjhiOWQuLjI4MDQxMDcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0FwcGxpY2F0aW9uQ2xpZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvQXBwbGljYXRpb25DbGllbnRJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjUsMTEgKzI1LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7CkBAIC00Nyw3ICs0Miw3IEBACiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKICAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5jbGllbnQuQXBwbGljYXRpb25DbGllbnR9b2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNsaWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIHsKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCiAJICovCkBAIC02OCw2ICs2Myw3IEBACiAJICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufWFuZCB7QGxpbmsgQWRkQ29tbWFuZH1hbmQKIAkgKiB7QGxpbmsgUmVtb3ZlQ29tbWFuZH1zdXBwb3J0IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKIAkJQ2xpZW50UGFja2FnZSBwa2cgPSBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRTsKIAkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CkBAIC04NSw2ICs4MSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewogCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCiAJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KQEAgLTEyMiw2ICsxMTksNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBBcHBsaWNhdGlvbkNsaWVudC5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCVN0cmluZyBrZXkgPSBudWxsOwogCQlpZiAoKChBcHBsaWNhdGlvbkNsaWVudCkgb2JqZWN0KS5lUmVzb3VyY2UoKSA9PSBudWxsKQpAQCAtMTQ0LDYgKzE0Miw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIEFwcGxpY2F0aW9uQ2xpZW50LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ29udGFpbmVyKCk7CiAJfQpAQCAtMTcyLDYgKzE3MSw3IEBACiAJCQkJCUNsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X0NhbGxiYWNrSGFuZGxlcigpLCB0cnVlKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAogCQkvKgpAQCAtMjAzLDYgKzIwMyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQXBwbGljYXRpb25DbGllbnQuY2xhc3MpKSB7CiAJCQljYXNlIENsaWVudFBhY2thZ2UuQVBQTElDQVRJT05fQ0xJRU5UX19WRVJTSU9OIDoKQEAgLTIyNyw2ICsyMjgsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIApAQCAtMjUzLDYgKzI1NSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpAQCAtMjYyLDYgKzI2NSw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlBcHBsaWNhdGlvbkNsaWVudCBjbGllbnQgPSAoQXBwbGljYXRpb25DbGllbnQpIG9iamVjdDsKIAkJQ29sbGVjdGlvbiBteUNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXIuamF2YQppbmRleCA0MjUzYTZiLi40ZjU0Y2U0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9DbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvQ2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlci5qYXZhCkBAIC00Niw2ICs0Niw3IEBACiAJLyoqCiAJICogVGhpcyBjcmVhdGVzIHRoZSBzdXBwb3J0ZWQgY29tbWFuZHMuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIENsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7CiAJCWlmIChjb21tYW5kQ2xhc3MgPT0gQ3JlYXRlQ2hpbGRDb21tYW5kLmNsYXNzKSB7CiAJCQlyZXR1cm4gbmV3IENyZWF0ZUNoaWxkQ29tbWFuZChlZGl0aW5nRG9tYWluLCAoRU9iamVjdCkgb2JqZWN0LCBudWxsLCB0aGlzKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9DbGllbnRJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmluZGV4IDVhNWIxNTkuLmU1MzA0ZjIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0NsaWVudEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvQ2xpZW50SXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtNzQsMTAgKzc0LDEyIEBACiAJCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgYWRhcHRlcktleSkgewogCQlyZXR1cm4gc3VwZXIuYWRhcHQodGFyZ2V0LCB0aGlzKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBvYmplY3QsIE9iamVjdCB0eXBlKSB7CiAJCS8vIFRoaXMgaXMgYSBrbHVkZ2UgdG8gZGVhbCB3aXRoIGVudW1lcmF0b3JzLCB3aGljaCBjcmFzaCB0aGUgZG9Td2l0Y2guCiAJCS8vCkBAIC05NSw2ICs5Nyw3IEBACiAJCXJldHVybiBudWxsOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGFkYXB0TmV3KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IGFkYXB0ZXJUeXBlKSB7CiAJCUFkYXB0ZXIgYWRhcHRlciA9IHN1cGVyLmFkYXB0TmV3KHRhcmdldCwgYWRhcHRlclR5cGUpOwogCQlkaXNwb3NhYmxlLmFkZChhZGFwdGVyKTsKQEAgLTExNCw2ICsxMTcsNyBAQAogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCiAJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudH0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYXRpb25DbGllbnRBZGFwdGVyKCkgewogCQlpZiAoYXBwbGljYXRpb25DbGllbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJYXBwbGljYXRpb25DbGllbnRJdGVtUHJvdmlkZXIgPSBuZXcgQXBwbGljYXRpb25DbGllbnRJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0xNDQsNiArMTQ4LDcgQEAKIAkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewogCQlyZXR1cm4gc3VwZXIuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSB8fCBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9FQVJQcm9qZWN0TWFwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9FQVJQcm9qZWN0TWFwSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGJiN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvRUFSUHJvamVjdE1hcEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFwcGxpY2F0aW9uLnByb3ZpZGVyLkFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5FQVJQcm9qZWN0TWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5Nb2R1bGVtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotCi0KLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuRUFSUHJvamVjdE1hcH0KLSAqIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIEVBUlByb2plY3RNYXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKiBBZGRlZCB0byBnZW5lcmF0ZWQgY29kZSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVNb2R1bGVzID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIEVBUlByb2plY3RNYXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBFQVJQcm9qZWN0TWFwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBib29sZWFuIGluY2x1ZGVNb2R1bGVzKSB7Ci0JCXRoaXMoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmluY2x1ZGVNb2R1bGVzID0gaW5jbHVkZU1vZHVsZXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQge0BsaW5rIEFkZENvbW1hbmR9YW5kCi0JICoge0BsaW5rIFJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7Ci0JCQlpZiAoaW5jbHVkZU1vZHVsZXMpCi0JCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQVJQcm9qZWN0TWFwX01hcHBpbmdzKCkpOwotCQkJY2hpbGRyZW5SZWZlcmVuY2VzLmFkZChNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQVJQcm9qZWN0TWFwX1V0aWxpdHlKQVJNYXBwaW5ncygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5SZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gVE9ETzogQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlCi0JCS8vIGZvcgotCQkvLyAgICAgICBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkUmVmZXJlbmNlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIEVBUlByb2plY3RNYXAuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRUFSUHJvamVjdE1hcC5naWYuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJFQVJQcm9qZWN0TWFwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFQVJQcm9qZWN0TWFwX1VJXyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEVBUlByb2plY3RNYXAuY2xhc3MpKSB7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuRUFSX1BST0pFQ1RfTUFQX19NQVBQSU5HUyA6Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuRUFSX1BST0pFQ1RfTUFQX19VVElMSVRZX0pBUl9NQVBQSU5HUyA6IHsKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqLwotCS8qCi0JICogcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgRU9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsCi0JICogT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpIHsgTW9kdWxlbWFwUGFja2FnZSBwa2cgPSBNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRTs7IGlmCi0JICogKCFpbmNsdWRlTW9kdWxlcyAmJiBmZWF0dXJlID09IHBrZy5nZXRFQVJQcm9qZWN0TWFwX01hcHBpbmdzKCkpIHJldHVybjsKLQkgKiAKLQkgKiBpZiAoZmVhdHVyZSA9PSBwa2cuZ2V0RUFSUHJvamVjdE1hcF9NYXBwaW5ncygpIHx8IGZlYXR1cmUgPT0KLQkgKiBwa2cuZ2V0RUFSUHJvamVjdE1hcF9VdGlsaXR5SkFSTWFwcGluZ3MoKSkgeyBmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLAotCSAqIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOyByZXR1cm47IH0gc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLAotCSAqIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOyB9Ci0JICovCi0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rY29tLmlibS5ldG9vbHMuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQlpZiAoaW5jbHVkZU1vZHVsZXMpCi0JCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihtb2R1bGVtYXBQYWNrYWdlLmdldEVBUlByb2plY3RNYXBfTWFwcGluZ3MoKSwgbW9kdWxlbWFwUGFja2FnZS5nZXRNb2R1bGVNYXBwaW5nKCkpKTsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIobW9kdWxlbWFwUGFja2FnZS5nZXRFQVJQcm9qZWN0TWFwX1V0aWxpdHlKQVJNYXBwaW5ncygpLCBtb2R1bGVtYXBQYWNrYWdlLmdldFV0aWxpdHlKQVJNYXBwaW5nKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5SRVNPVVJDRV9MT0NBVE9SOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0ZhY2V0ZWRQcm9qZWN0UHJvcGVydHlUZXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0ZhY2V0ZWRQcm9qZWN0UHJvcGVydHlUZXN0ZXIuamF2YQppbmRleCAwOTQ3NGQwLi40ODljOWU1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvRmFjZXRlZFByb2plY3RQcm9wZXJ0eVRlc3Rlci5qYXZhCkBAIC0xLDMgKzEsMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsMjAwOSBTQVAgQUcgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL0oyRUVJdGVtUHJvdmlkZXIuamF2YQppbmRleCBkN2I3MWYxLi4zODJiYmQ3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9KMkVFSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvSjJFRUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMDUsMTEgKzIwNSwxMyBAQAogCX0KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlpZiAobm90aWZpY2F0aW9uT24pCiAJCQlzdXBlci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGNoaWxkcmVuLmlzRW1wdHkoKSkgewogCQkJdHJ5IHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZU1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjNmY4NC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9Nb2R1bGVNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5wcm92aWRlci5BcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuTW9kdWxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuTW9kdWxlbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLQotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLk1vZHVsZU1hcHBpbmd9Ci0gKiBvYmplY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIE1vZHVsZU1hcHBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlNb2R1bGVtYXBQYWNrYWdlIHBrZyA9IE1vZHVsZW1hcFBhY2thZ2UuZUlOU1RBTkNFOwotCQkJOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgcHJvamVjdE5hbWUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvamVjdF9OYW1lXzEiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfcHJvamVjdF9uYW1lX3Byb3BlcnR5X29mX3RoZV9tb2R1bGVfbWFwcGluZ19VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGtnLmdldE1vZHVsZU1hcHBpbmdfUHJvamVjdE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5URVhUX1ZBTFVFX0lNQUdFKSk7Ci0KLQkJCS8vIFRoaXMgaXMgZm9yIHRoZSBtb2R1bGUgZmVhdHVyZS4KLQkJCS8vCi0JCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTW9kdWxlX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRoZV9tb2R1bGVfb2ZfdGhlX21vZHVsZV9tYXBwaW5nX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0TW9kdWxlTWFwcGluZ19Nb2R1bGUoKSwgZmFsc2UpKTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJvamVjdCBOYW1lIGZlYXR1cmUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByb2plY3ROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdHJpbmcoIl9VSV9Nb2R1bGVNYXBwaW5nX3Byb2plY3ROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01vZHVsZU1hcHBpbmdfcHJvamVjdE5hbWVfZmVhdHVyZSIsICJfVUlfTW9kdWxlTWFwcGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCU1vZHVsZW1hcFBhY2thZ2UuZUlOU1RBTkNFLmdldE1vZHVsZU1hcHBpbmdfUHJvamVjdE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZHVsZSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2R1bGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX01vZHVsZU1hcHBpbmdfbW9kdWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01vZHVsZU1hcHBpbmdfbW9kdWxlX2ZlYXR1cmUiLCAiX1VJX01vZHVsZU1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRNb2R1bGVNYXBwaW5nX01vZHVsZSgpLCB0cnVlKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgTW9kdWxlTWFwcGluZy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNb2R1bGVNYXBwaW5nLmdpZi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoIk1vZHVsZU1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCU1vZHVsZU1hcHBpbmcgbW9kdWxlTWFwcGluZyA9ICgoTW9kdWxlTWFwcGluZykgb2JqZWN0KTsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTW9kdWxlTWFwcGluZ19VSV8iKSArIG1vZHVsZU1hcHBpbmcuZ2V0UHJvamVjdE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNb2R1bGVNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLk1PRFVMRV9NQVBQSU5HX19QUk9KRUNUX05BTUUgOgotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLk1PRFVMRV9NQVBQSU5HX19NT0RVTEUgOiB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB0byB0aGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMKLQkgKiBkZXNjcmliaW5nIGFsbCBvZiB0aGUgY2hpbGRyZW4gdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuUkVTT1VSQ0VfTE9DQVRPUjsKLQl9Ci0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqLwotCS8qCi0JICogcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgRU9iamVjdCBmZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsCi0JICogT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpIHsgTW9kdWxlbWFwUGFja2FnZSBwa2cgPSBNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRTs7IGlmICgKLQkgKiBmZWF0dXJlID09IHBrZy5nZXRNb2R1bGVNYXBwaW5nX1Byb2plY3ROYW1lKCkgfHwgZmVhdHVyZSA9PSBwa2cuZ2V0TW9kdWxlTWFwcGluZ19Nb2R1bGUoKSApIHsKLQkgKiBmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsgcmV0dXJuOyB9Ci0JICogc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIGluZGV4KTsgfQotCSAqLwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTW9kdWxlbWFwRWRpdFBsdWdpbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTW9kdWxlbWFwRWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmY2YWRmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZW1hcEVkaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5wcm92aWRlci5BcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuTW9kdWxlbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuTW9kdWxlbWFwUGFja2FnZTsKLQotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgTGVhdmluZyB0aGlzIGluIGZvciBub3csIHRvIG1pbmltaXplIGJyZWFrYWdlIHRvIGFsbCB0aGUgcHJvdmlkZXJzOyBzaG91bGQgZGVsZXRlCi0gKiAgICAgICAgICAgICB3aGVuIHdlIHJlZ2VuIGFsbCBwcm92aWRlcnMgZm9yIG1vZjUKLSAqIAotICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBtb2R1bGVtYXAgcGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlbWFwRWRpdFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLyoqCi0JICogS2VlcCB0cmFjayBvZiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTW9kdWxlbWFwRWRpdFBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBtb2R1bGVtYXAgcGFja2FnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlbWFwUGFja2FnZSBtb2R1bGVtYXBQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlbWFwRWRpdFBsdWdpbihJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXN1cGVyKGRlc2NyaXB0b3IpOwotCi0JCS8vIFJlbWVtYmVyIHRoZSBzdGF0aWMgaW5zdGFuY2UuCi0JCS8vCi0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBvbmUgbW9kdWxlbWFwIHBhY2thZ2UuCi0JICovCi0JcHVibGljIE1vZHVsZW1hcFBhY2thZ2UgZ2V0TW9kdWxlbWFwUGFja2FnZSgpIHsKLQkJcmV0dXJuIG1vZHVsZW1hcFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBvbmUgbW9kdWxlbWFwIGZhY3RvcnkuCi0JICovCi0JcHVibGljIE1vZHVsZW1hcEZhY3RvcnkgZ2V0TW9kdWxlbWFwRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChNb2R1bGVtYXBGYWN0b3J5KSBtb2R1bGVtYXBQYWNrYWdlLmdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyBpbml0aWFsaXphdGlvbiBzdHVmZiBoZXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0dXAoKTsKLQkJbW9kdWxlbWFwUGFja2FnZSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5Nb2R1bGVtYXBGYWN0b3J5SW1wbC5nZXRQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2R1bGVtYXBFZGl0UGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKGdldERlc2NyaXB0b3IoKS5nZXRJbnN0YWxsVVJMKCksICJpY29ucy8iICsga2V5ICsgIi5naWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZhaWxlZF90b19sb2FkX2ltYWdlX2Zvcl9FUlJPUl8iKSArIGtleSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0b3IoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhrZXkpOwotCX0KLQotCS8qKgotCSAqIEdldCBhIHRyYW5zbGF0ZWQgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSwgd2l0aCBhbiBvYmplY3Qgc3Vic3RpdHV0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSkgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIG5ldyBPYmplY3RbXXtzMX0pOwotCX0KLQotCS8qKgotCSAqIEdldCBhIHRyYW5zbGF0ZWQgc3RyaW5nIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSwgd2l0aCB0d28gb2JqZWN0IHN1YnN0aXR1dGlvbnMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxLCBPYmplY3QgczIpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W117czEsIHMyfSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLCB3aXRoIHRocmVlIG9iamVjdCBzdWJzdGl0dXRpb25zLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdCBzMSwgT2JqZWN0IHMyLCBPYmplY3QgczMpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W117czEsIHMyLCBzM30pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9Nb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9Nb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YmM4YzQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcHBsaWNhdGlvbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvdmlkZXIvTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLk1vZHVsZW1hcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLk1vZHVsZW1hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLQotCi0vKioKLSAqIFRoaXMgZXh0ZW5kZWQgaXRlbSBwcm92aWRlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgotICogPHVsPgotICogPGxpPntAbGluayBDcmVhdGVDaGlsZENvbW1hbmR9Ci0gKiA8L3VsPgotICogPHA+Ci0gKiBUaGUgY29tbWFuZHMgYXJlIGltcGxlbWVudGVkIHVuaWZvcm1seSBvbiBhbGwgb3VyIGl0ZW0gYWRhcHRlcnMgdXNpbmcgdGhpcyBjb21tb24gYmFzZSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIHsKLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBwYWNrYWdlIGZvciB0aGUgbW9kdWxlbWFwIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTW9kdWxlbWFwUGFja2FnZSBtb2R1bGVtYXBQYWNrYWdlID0gKE1vZHVsZW1hcFBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1vZHVsZW1hcFBhY2thZ2UuZU5TX1VSSSk7Ci0JLyoqCi0JICogVGhpcyBpcyB0aGUgZmFjdG9yeSBmb3IgdGhlIG1vZHVsZW1hcCBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE1vZHVsZW1hcEZhY3RvcnkgbW9kdWxlbWFwRmFjdG9yeSA9IG1vZHVsZW1hcFBhY2thZ2UuZ2V0TW9kdWxlbWFwRmFjdG9yeSgpOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYW4gYWRhcHRlciBmYWN0b3J5IGFuZCBhIGRvbWFpbiBub3RpZmllci4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIHRoZSBzdXBwb3J0ZWQgY29tbWFuZHMuCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChPYmplY3Qgb2JqZWN0LCBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIENsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZWRpdGluZ0RvbWFpbiwgY29tbWFuZENsYXNzLCBjb21tYW5kUGFyYW1ldGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyA8Y29kZT5Db21tYW5kUGFyYW1ldGVyPC9jb2RlPiBzIGZvciBhIGdpdmVuCi0JICogcGFyZW50IGZlYXR1cmUgYW5kIGNoaWxkIHR5cGUgKE1PRiBtZXRhLW9iamVjdCkuCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRQYXJhbWV0ZXIgY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoRVJlZmVyZW5jZSBmZWF0dXJlLCBFT2JqZWN0IGNoaWxkVHlwZSkgewotCQlyZXR1cm4gbmV3IENvbW1hbmRQYXJhbWV0ZXIobnVsbCwgZmVhdHVyZSwgbW9kdWxlbWFwRmFjdG9yeS5jcmVhdGUoY2hpbGRUeXBlLmVDbGFzcygpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBkZWZhdWx0IG93bmVyIG9iamVjdCBmb3Ige0BsaW5rIENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZE93bmVyKE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgcmVzdWx0IGNvbGxlY3Rpb24gZm9yIHtAbGluayBDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENyZWF0ZUNoaWxkUmVzdWx0KE9iamVjdCBjaGlsZCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCXJlc3VsdC5hZGQoY2hpbGQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgZGVmYXVsdCBsYWJlbCBmb3Ige0BsaW5rIENyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBjaGlsZCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgZGVzY3JpcHRpb24gZm9yIHtAbGluayBDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGREZXNjcmlwdGlvbihPYmplY3QgcGFyZW50LCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX2Rlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgaGVscCB0ZXh0IGZvciB7QGxpbmsgQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVG9vbFRpcFRleHQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBjaGlsZCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90b29sdGlwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGRlZmF1bHQgaW1hZ2UgZm9yIHtAbGluayBDcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3QgcGFyZW50LCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IGNoaWxkKSB7Ci0JCU9iamVjdCBpbWFnZSA9IG51bGw7Ci0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVPYmplY3QgJiYgY2hpbGQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoRU9iamVjdCkgcGFyZW50KS5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiQ3JlYXRlIiArICgoRU9iamVjdCkgY2hpbGQpLmVDbGFzcygpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJaW1hZ2UgPSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKG5hbWUpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGxvb2tzIHVwIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZVRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgdHlwZUtleSA9IG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QgPyAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCkuZ2V0TmFtZSgpIDogIlVua25vd24iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJXyIgKyB0eXBlS2V5ICsgIl90eXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgbG9va3MgdXAgdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBmZWF0dXJlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmVhdHVyZVRleHQoT2JqZWN0IGZlYXR1cmUpIHsKLQkJU3RyaW5nIGZlYXR1cmVLZXkgPSBmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSA/ICgoRVJlZmVyZW5jZSkgZmVhdHVyZSkuZ2V0TmFtZSgpIDogIlVua25vd24iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJXyIgKyBmZWF0dXJlS2V5ICsgIl9mZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9Nb2R1bGVtYXBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQxNWFjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL01vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5Nb2R1bGVtYXBBZGFwdGVyRmFjdG9yeTsKLQotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgZmFjdG9yeSB0aGF0IGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBuZWVkZWQgdG8gc3VwcG9ydAotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyfXMuIFRoZSBhZGFwdGVycyBnZW5lcmF0ZWQgYnkgdGhpcyBmYWN0b3J5IGNvbnZlcnQgRU1GCi0gKiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4gVGhlIGFkYXB0ZXJzCi0gKiBhbHNvIHN1cHBvcnQgcHJvcGVydHkgc2hlZXRzLCBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXN9LiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUKLSAqIGFkYXB0ZXJzIGFyZSBzaGFyZWQgYW1vbmcgbXVsdGlwbGUgaW5zdGFuY2VzLgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBNb2R1bGVtYXBBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayAjY29tLmlibS5ldG9vbHMuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkKLQkgKiB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJSXRlbVByb3BlcnR5U291cmNlLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVGFibGVJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5Nb2R1bGVNYXBwaW5nfQotCSAqIGluc3RhbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlTWFwcGluZ0l0ZW1Qcm92aWRlciBtb2R1bGVNYXBwaW5nSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLk1vZHVsZU1hcHBpbmd9LgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1vZHVsZU1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAobW9kdWxlTWFwcGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltb2R1bGVNYXBwaW5nSXRlbVByb3ZpZGVyID0gbmV3IE1vZHVsZU1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kdWxlTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwLkVBUlByb2plY3RNYXB9Ci0JICogaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBFQVJQcm9qZWN0TWFwSXRlbVByb3ZpZGVyIGVhclByb2plY3RNYXBJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuRUFSUHJvamVjdE1hcH0uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRUFSUHJvamVjdE1hcEFkYXB0ZXIoKSB7Ci0JCWlmIChlYXJQcm9qZWN0TWFwSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVhclByb2plY3RNYXBJdGVtUHJvdmlkZXIgPSBuZXcgRUFSUHJvamVjdE1hcEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBlYXJQcm9qZWN0TWFwSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuVXRpbGl0eUpBUk1hcHBpbmd9Ci0JICogaW5zdGFuY2VzLgotCSAqLwotCXByb3RlY3RlZCBVdGlsaXR5SkFSTWFwcGluZ0l0ZW1Qcm92aWRlciB1dGlsaXR5SkFSTWFwcGluZ0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5VdGlsaXR5SkFSTWFwcGluZ30uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVXRpbGl0eUpBUk1hcHBpbmdBZGFwdGVyKCkgewotCQlpZiAodXRpbGl0eUpBUk1hcHBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdXRpbGl0eUpBUk1hcHBpbmdJdGVtUHJvdmlkZXIgPSBuZXcgVXRpbGl0eUpBUk1hcHBpbmdJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdXRpbGl0eUpBUk1hcHBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSByb290IGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSBnZXRSb290QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudEFkYXB0ZXJGYWN0b3J5KENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5wYXJlbnRBZGFwdGVyRmFjdG9yeSA9IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHN1cGVyLmlzRmFjdG9yeUZvclR5cGUodHlwZSkgfHwgc3VwcG9ydGVkVHlwZXMuY29udGFpbnModHlwZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWJzdGl0dXRlcyB0aGUgZmFjdG9yeSBpdHNlbGYgYXMgdGhlIGtleSBmb3IgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgbm90aWZpZXIsIE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBlci5hZGFwdChub3RpZmllciwgdGhpcyk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQkvLyBUaGlzIGlzIGEga2x1ZGdlIHRvIGRlYWwgd2l0aCBlbnVtZXJhdG9ycywgd2hpY2ggY3Jhc2ggdGhlIGRvU3dpdGNoLgotCQkvLwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCAmJiAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBzdXBlci5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKCEodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB8fCAoKChDbGFzcykgdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgYSBsaXN0ZW5lci4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfWFuZCB0byB7QGxpbmsgI3BhcmVudEFkYXB0ZXJGYWN0b3J5fS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn1hbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCi0JICovCi0JLyoKLQkgKiBwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChPYmplY3Qgb2JqZWN0LCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLAotCSAqIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7IGNoYW5nZU5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG9iamVjdCwgZXZlbnRUeXBlLCBmZWF0dXJlLAotCSAqIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOwotCSAqIAotCSAqIGlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG9iamVjdCwgZXZlbnRUeXBlLAotCSAqIGZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgaW5kZXgpOyB9IH0KLQkgKi8KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL1V0aWxpdHlKQVJNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FwcGxpY2F0aW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm92aWRlci9VdGlsaXR5SkFSTWFwcGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2YzYzEwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXBwbGljYXRpb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb3ZpZGVyL1V0aWxpdHlKQVJNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcHBsaWNhdGlvbi5wcm92aWRlci5BcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuTW9kdWxlbWFwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuVXRpbGl0eUpBUk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci0KLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5VdGlsaXR5SkFSTWFwcGluZ30KLSAqIG9iamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFV0aWxpdHlKQVJNYXBwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMgTW9kdWxlbWFwSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICovCi0JcHVibGljIFV0aWxpdHlKQVJNYXBwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJTW9kdWxlbWFwUGFja2FnZSBwa2cgPSBNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCTsKLQotCQkJLy8gVGhpcyBpcyBmb3IgdGhlIHByb2plY3ROYW1lIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlByb2plY3RfTmFtZV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfcHJvamVjdF9uYW1lX3Byb3BlcnR5X29mX3RoZV91dGlsaXR5X2phcl9tYXBwaW5nX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0VXRpbGl0eUpBUk1hcHBpbmdfUHJvamVjdE5hbWUoKSwgZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOwotCi0JCQkvLyBUaGlzIGlzIGZvciB0aGUgdXJpIGZlYXR1cmUuCi0JCQkvLwotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkKG5ldyBJdGVtUHJvcGVydHlEZXNjcmlwdG9yKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCBBcHBsaWNhdGlvblByb3ZpZGVyc1Jlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVyaV9VSV8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJQXBwbGljYXRpb25Qcm92aWRlcnNSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJUaGVfdXJpX3Byb3BlcnR5X29mX3RoZV91dGlsaXR5X2phcl9tYXBwaW5nX1VJXyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlwa2cuZ2V0VXRpbGl0eUpBUk1hcHBpbmdfVXJpKCksIHRydWUsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuVEVYVF9WQUxVRV9JTUFHRSkpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9qZWN0IE5hbWUgZmVhdHVyZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvamVjdE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1V0aWxpdHlKQVJNYXBwaW5nX3Byb2plY3ROYW1lX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1V0aWxpdHlKQVJNYXBwaW5nX3Byb2plY3ROYW1lX2ZlYXR1cmUiLCAiX1VJX1V0aWxpdHlKQVJNYXBwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJTW9kdWxlbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VXRpbGl0eUpBUk1hcHBpbmdfUHJvamVjdE5hbWUoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFVyaSBmZWF0dXJlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVcmlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIGdldFN0cmluZygiX1VJX1V0aWxpdHlKQVJNYXBwaW5nX3VyaV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9VdGlsaXR5SkFSTWFwcGluZ191cmlfZmVhdHVyZSIsICJfVUlfVXRpbGl0eUpBUk1hcHBpbmdfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRVdGlsaXR5SkFSTWFwcGluZ19VcmkoKSwgdHJ1ZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgVXRpbGl0eUpBUk1hcHBpbmcuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVXRpbGl0eUpBUk1hcHBpbmcuZ2lmLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi9wcmp1dGlsamFyX29iaiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8JLyoqCi0JLy8JICogQHBhcmFtIG9iamVjdAotCS8vCSAqIEByZXR1cm4KLQkvLwkgKi8KLQkvLwlwcml2YXRlIGJvb2xlYW4gaXNFSkJDbGllbnRKQVIoT2JqZWN0IG9iamVjdCkgewotCS8vCQlVdGlsaXR5SkFSTWFwcGluZyBtYXAgPSAoVXRpbGl0eUpBUk1hcHBpbmcpIG9iamVjdDsKLQkvLwkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChtYXApOwotCS8vCQlpZiAocHJvamVjdCA9PSBudWxsKQotCS8vCQkJcmV0dXJuIGZhbHNlOwotCS8vCi0JLy8JCUVBUk5hdHVyZVJ1bnRpbWUgcnVudGltZSA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwcm9qZWN0KTsKLQkvLwkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKLQkvLwkJCXJldHVybiBmYWxzZTsKLQkvLwotCS8vCQlFQVJFZGl0TW9kZWwgbW9kZWwgPSBudWxsOwotCS8vCQl0cnkgewotCS8vCQkJbW9kZWwgPSBydW50aW1lLmdldEVhckVkaXRNb2RlbEZvclJlYWQodGhpcyk7Ci0JLy8JCQlyZXR1cm4gbW9kZWwuaXNFamJDbGllbnRKYXJNYXBwaW5nKG1hcCk7Ci0JLy8JCX0gZmluYWxseSB7Ci0JLy8JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkvLwkJCQltb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotCS8vCQl9Ci0JLy8JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJVXRpbGl0eUpBUk1hcHBpbmcgbWFwID0gKChVdGlsaXR5SkFSTWFwcGluZykgb2JqZWN0KTsKLQkJcmV0dXJuIG1hcCA9PSBudWxsID8gIjw/Pz4iIDogbWFwLmdldFVyaSgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG5vdGlmaWNhdGlvbiBieSBjYWxsaW5nIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWQgZmlyZU5vdGlmeUNoYW5nZWR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFV0aWxpdHlKQVJNYXBwaW5nLmNsYXNzKSkgewotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLlVUSUxJVFlfSkFSX01BUFBJTkdfX1BST0pFQ1RfTkFNRSA6Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuVVRJTElUWV9KQVJfTUFQUElOR19fVVJJIDogewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgdG8gdGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zCi0JICogZGVzY3JpYmluZyBhbGwgb2YgdGhlIGNoaWxkcmVuIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUHJvdmlkZXJzUmVzb3VyY2VIYW5kbGVyLlJFU09VUkNFX0xPQ0FUT1I7Ci0JfQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBub3RpZmljYXRpb24gYnkgY2FsbGluZyB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKi8KLQkvKgotCSAqIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIEVPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLAotCSAqIE9iamVjdCBuZXdWYWx1ZSwgaW50IGluZGV4KSB7IE1vZHVsZW1hcFBhY2thZ2UgcGtnID0gTW9kdWxlbWFwUGFja2FnZS5lSU5TVEFOQ0U7OyBpZiAoCi0JICogZmVhdHVyZSA9PSBwa2cuZ2V0VXRpbGl0eUpBUk1hcHBpbmdfUHJvamVjdE5hbWUoKSB8fCBmZWF0dXJlID09Ci0JICogcGtnLmdldFV0aWxpdHlKQVJNYXBwaW5nX1VyaSgpICkgeyBmaXJlTm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwKLQkgKiBuZXdWYWx1ZSwgaW5kZXgpOyByZXR1cm47IH0gc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmllciwgZXZlbnRUeXBlLCBmZWF0dXJlLCBvbGRWYWx1ZSwKLQkgKiBuZXdWYWx1ZSwgaW5kZXgpOyB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzcxZjE1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkRvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNTsKLQotCi0KLS8qKgotICogPHA+Ci0gKiBJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIHRoZSAKLSAqIEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGFzIHdlbGwgYXMgYWxsIGV4dGVuZGluZyBpbnRlcmZhY2VzIGV4dGVuZGluZyAKLSAqIElKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIAotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLSAqIDwvcD4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXMKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLS8qKgotICogVGhpcyBoYXMgYmVlbiBzbGF0ZWQgZm9yIHJlbW92YWwgcG9zdCBXVFAgMS41LiBEbyBub3QgdXNlIHRoaXMgY2xhc3MvaW50ZXJmYWNlCi0gKiAKLSAqIEBkZXByZWNhdGVkCi0gKiAKLSAqIEBzZWUgSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElKYXZhQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLCBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTV7Ci0KLQkvKioKLQkgKiBSZXF1aXJlZCwgdHlwZSBCb29sZWFuLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5Cb29sZWFuLkZBTFNFPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVE9fRUFSID0gIklKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1VSSSA9ICJJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5NT0RVTEVfVVJJIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIHR5cGUgU3RyaW5nLCB0aGlzIHByb3BlcnR5IG5lZWRzIHRvIGJlIHNldCBpZiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IEFERF9UT19FQVIgIGlzIHNldCB0byA8Y29kZT5Cb29sZWFuLlRSVUU8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0NPTVBPTkVOVF9OQU1FID0gIklKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9DT01QT05FTlRfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiB0eXBlIFN0cmluZywgdGhpcyBwcm9wZXJ0eSBuZWVkcyB0byBiZSBzZXQgaWYgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBBRERfVE9fRUFSICBpcyBzZXQgdG8gPGNvZGU+Qm9vbGVhbi5UUlVFPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9DT01QT05FTlRfREVQTE9ZX05BTUUgPSAiSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX0NPTVBPTkVOVF9ERVBMT1lfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiB0eXBlIENvbXBvbmVudEhhbmRsZSwgdGhpcyBwcm9wZXJ0eSBuZWVkcyB0byBiZSBzZXQgaWYgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBBRERfVE9fRUFSICBpcyBzZXQgdG8gPGNvZGU+Qm9vbGVhbi5UUlVFPC9jb2RlPi4gIFJlcHJlc2VudHMKLSAgICAgKiBhIGhhbmRsZSB0byB0aGUgRUFSCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0NPTVBPTkVOVF9QUk9KRUNUID0gIklKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9DT01QT05FTlRfUFJPSkVDVCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLQkvKioKLQkgKiB0eXBlIEJvb2xlYW47IHRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPkJvb2xlYW4uVFJVRTwvY29kZT4sIHRoaXMgaXMgVUkgb25seSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX1NIT1dfRUFSX1NFQ1RJT04gPSAiSUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVUlfU0hPV19FQVJfU0VDVElPTiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCwgdHlwZSBTdHJpbmcKLSAgICAgKiBTdHJpbmcgaW5kaWNhdGVzIHRoZSBuYW1lIG9mIHRoZSB0aGUgZm9sZGVyIHdoZXJlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZXhpc3RzLgotICAgICAqIEVhY2ggSjJFRSBjb21wb25lbnIgcHJvdmlkZXIgd2lsbCBkZWZhdWx0IHRoZSBEZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9sZGVyLgotICAgICAqIAotCSAqLwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEREX0ZPTERFUiA9ICJJSjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5ERF9GT0xERVIiOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKioKLSAgICAgKiBSZXF1aXJlZCwgdHlwZSBJbnRlZ2VyLiBUaGUgdXNlciBkZWZpbmVkIHZlcnNpb24gb2YgdGhlIGNvbXBvbmVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfVkVSU0lPTiA9ICJJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9WRVJTSU9OIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogdHlwZSBJbnRlZ2VyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURfQ09NUE9ORU5UX1ZFUlNJT05TX0ZPUl9QUk9KRUNUX1JVTlRJTUUgPSAiSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5WQUxJRF9DT01QT05FTlRfVkVSU0lPTlNfRk9SX1BST0pFQ1RfUlVOVElNRSI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiB0eXBlIEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVTVEVEX0FERF9DT01QT05FTlRfVE9fRUFSX0RNID0gIklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX0FERF9DT01QT05FTlRfVE9fRUFSX0RNIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIHR5cGUgRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVNURURfRUFSX0NPTVBPTkVOVF9DUkVBVElPTl9ETSA9ICJJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLk5FU1RFRF9FQVJfQ09NUE9ORU5UX0NSRUFUSU9OX0RNIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIHR5cGUgVXBkYXRlTWFuaWZlc3REYXRhTW9kZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVNURURfVVBEQVRFX01BTklGRVNUX0RNID0gIklDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuTkVTVEVEX1VQREFURV9NQU5JRkVTVF9ETSI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiB0eXBlIENsYXNzUGF0aFNlbGVjdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSF9TRUxFQ1RJT04gPSAiSUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DTEFTU1BBVEhfU0VMRUNUSU9OIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKaW5kZXggZDg2NjNiZi4uMTA0MjNkYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpAQCAtNTcsNyArNTcsNyBAQAogICAgICAqIE9wdGlvbmFsLCB0eXBlIGJvb2xlYW4sIERlZmF1bHQgPGNvZGU+Qm9vbGVhbi5UUlVFPC9jb2RlPiBpbmRpY2F0aW5nIGEgQnVpbGQgcnVucyBiZWZvcmUgZXhwb3J0aW5nIHRodXMgb3V0cHV0IGZpbGVzIGFyZSBjcmVhdGVkCiAgICAgICogYW5kIGFyY2hpdmVkLiAgSG93ZXZlciwgaWYgPGNvZGU+Qm9vbGVhbi5GQUxTRTwvY29kZT4gdGhlIGNvbXBvbmVudCBpcyBhcmNoaXZlZCBhcyBpcy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5fQlVJTEQgPSAiSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTl9CVUlMRCI7IC8vJE5PTi1OTFMtMSR9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOX0JVSUxEID0gIklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5SVU5fQlVJTEQiOyAvLyROT04tTkxTLTEkCiAgICAgCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UID0gIklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQiOyAvLyROT04tTkxTLTEkCiAgICAgCkBAIC02NSwyMCArNjUsMjAgQEAKICAgICAgKiBAc2luY2UgMy4wCiAgICAgICovCiAgICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU1JWkVfRk9SX1NQRUNJRklDX1JVTlRJTUUgPSAiSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9QVElNSVpFX0ZPUl9TUEVDSUZJQ19SVU5USU1FIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJTUlaRV9GT1JfU1BFQ0lGSUNfUlVOVElNRSA9ICJJSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1BUSU1JWkVfRk9SX1NQRUNJRklDX1JVTlRJTUUiOyAvLyROT04tTkxTLTEkCiAgICAgCiAgICAgLyoqCiAgICAgICogQHNpbmNlIDMuMAogICAgICAqLwogICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTlRJTUUgPSAiSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUUiOyAvLyROT04tTkxTLTEKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FID0gIklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5SVU5USU1FIjsgLy8kTk9OLU5MUy0xJAogICAgIAogICAgIC8qKgogICAgICAqIEBzaW5jZSAzLjAKICAgICAgKi8KICAgICAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX1NQRUNJRklDX1BBUlRJQ0lQQU5UUyAKLSAgICAgICAgPSAiSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfU1BFQ0lGSUNfUEFSVElDSVBBTlRTIjsgLy8kTk9OLU5MUy0xCisgICAgICAgID0gIklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5SVU5USU1FX1NQRUNJRklDX1BBUlRJQ0lQQU5UUyI7IC8vJE5PTi1OTFMtMSQKICAgICAKICAgICAvKioKICAgICAgKiBAc2luY2UgMy4wCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKaW5kZXggNjQ1ZWVlYS4uNDc4YmZlOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpAQCAtMzksMTIgKzM5LDYgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX05BTUUgPSAiSUoyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCi0JICogT3B0aW9uYWwsIHR5cGUgQXJjaGl2ZSwgdXNlZCB3aGVuIGEgZmlsZSBpcyBhdmFpbGFibGUgYXMgYW4gb2JqZWN0IHJhdGhlciB0aGFuIGEgdXJsIChpLmUuCi0JICogdXNpbmcgdGhlIEZJTEVfTkFNRSBwcm9wZXJ0eSB3aWxsIG5vdCB3b3JrKS4KLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNBUkNISVZFX1dSQVBQRVJ9Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRSA9ICJJSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFIjsgLy8kTk9OLU5MUy0xJAotCS8qKgogCSAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZywgbmFtZSBvZiB0aGUgUHJvamVjdCB3aGljaCB0aGUgQXJjaGl2ZSB3aWxsIGJlIGltcG9ydGVkLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJApAQCAtNTksMTkgKzUzLDYgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFX1dSQVBQRVIgPSAiSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUiI7IC8vJE5PTi1OTFMtMSQKIAotCQotCS8qKgotCSAqIE9wdGlvbmFsLCB0eXBlIElPdmVyd3JpdGVIYW5kbGVyLiBEZWZpbmVzIGEgSU92ZXJ3cml0ZUhhbmRsZXIgZm9yIHRoZSBjb21wb25lbnQgaW4gdGhlCi0JICogd29ya3NwYWNlIGlmIGFuIGV4aXN0aW5nIGNvbXBvbmVudCBzaG91bGQgYmUgb3ZlcndyaXR0ZW4gKE9WRVJXUklURV9DT01QT05FTlQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9WRVJXUklURV9IQU5ETEVSID0gIklKMkVFQXJ0aWZhY3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9WRVJXUklURV9IQU5ETEVSIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT3B0aW9uYWwsIHR5cGUgU2F2ZUZpbHRlciwgZGVmYXVsdCBpcyBudWxsCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0ZJTFRFUiA9ICJJSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5TQVZFX0ZJTFRFUiI7IC8vJE5PTi1OTFMtMSQKLQogCS8qKgogCSAqIE9wdGlvbmFsLCB0eXBlIEJvb2xlYW4gLSBTaG91bGQgdGhlIGFyY2hpdmUgYmUgY2xvc2VkIG9uIGRpc3Bvc2U/CiAJICovCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKaW5kZXggMjVjMWNhOS4uMDczOTM0ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kYXRhbW9kZWwvcHJvcGVydGllcy9JSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpAQCAtMTAsOSArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzOwogCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkRvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNTsKLQotCiAvKioKICAqIDxwPgogICogSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHByb3ZpZGVzIHByb3BlcnRpZXMgdG8gdGhlIElEYXRhTW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoZSAKQEAgLTMzLDIwICszMCw0IEBACiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKICAgICAKLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHtAbGluayBJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyNFQVJfUFJPSkVDVF9OQU1FfSBvbiB0aGUgbmVzdGVkIHByb2plY3QgY3JlYXRpb24gbW9kZWwKLQkgKiAKLQkgKiBAc2VlIERvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9DT01QT05FTlRfTkFNRSA9ICJJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX0NPTVBPTkVOVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIElKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzI0FERF9UT19FQVJ9IG9uIHRoZSBuZXN0ZWQgcHJvamVjdCBjcmVhdGlvbiBtb2RlbAotICAgICAqIAotICAgICAqIEBzZWUgRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1RPX0VBUiA9ICJJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRFRF9JTVBPUlRfRkFDVE9SWSA9ICJJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRVhURU5ERURfSU1QT1JUX0ZBQ1RPUlkiOyAvLyROT04tTkxTLTEkCi0KLQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RhdGFtb2RlbC9wcm9wZXJ0aWVzL0lKYXZhQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwMzdmZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGF0YW1vZGVsL3Byb3BlcnRpZXMvSUphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5JSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5Eb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTU7Ci0KLS8qKgotICogPHA+Ci0gKiBJSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyBwcm92aWRlcyBwcm9wZXJ0aWVzIHRvIHRoZSAKLSAqIEphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGFzIHdlbGwgYXMgYWxsIGV4dGVuZGluZyBpbnRlcmZhY2VzIGV4dGVuZGluZyAKLSAqIElKYXZhQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHNwZWNpZmljYWxseSwgYnV0IG5vdCBsaW1pdGVkIHRvIGFsbCBKMkVFIGNvbXBvbmVudCByZWxhdGVkCi0gKiBjcmVhdGlvbi4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeQotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLS8qKgotICogVGhpcyBoYXMgYmVlbiBzbGF0ZWQgZm9yIHJlbW92YWwgcG9zdCBXVFAgMS41LiBEbyBub3QgdXNlIHRoaXMgY2xhc3MvaW50ZXJmYWNlCi0gKiAKLSAqIEBkZXByZWNhdGVkCi0gKiAKLSAqIEBzZWUgSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLCBEb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTUgewotCS8qKgotCSAqIE9wdGlvbmFsLCB0eXBlIFN0cmluZwotICAgICAqIFN0cmluZyBpbmRpY2F0aW5nIHRoZSBuYW1lIG9mIHRoZSB0aGUgcm9vdCBKYXZhIFNvdXJjZSBGb2xkZXIgaW4gdGhlIGNvbXBvbmVudCBiZWluZyBjcmVhdGVkLgotICAgICAqIFRoZSBEYXRhTW9kZWxQcm92aWRlciB3aWxsIGRlZmF1bHQgdGhlIEphdmEgU291cmNlIEZvbGRlciB0byB0aGUgQ29tcG9uZW50IGZvbGRlci4KLSAgICAgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBU09VUkNFX0ZPTERFUiA9ICJJSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBU09VUkNFX0ZPTERFUiI7Ci0gICAgLyoqCi0gICAgICogT3B0aW9uYWwsIHR5cGUgU3RyaW5nCi0gICAgICogU3RyaW5nIGluZGljYXRpbmcgdGhlIG5hbWUgb2YgdGhlIHRoZSByb290IGZvbGRlciBjb250YWluaW5nIHRoZSBNYW5pZmVzdC5NRiBpbiB0aGUgY29tcG9uZW50IGJlaW5nIGNyZWF0ZWQuCi0gICAgICogVGhlIERhdGFNb2RlbFByb3ZpZGVyIHdpbGwgZGVmYXVsdCB0aGUgTWFuaWZlc3QgZm9sZGVyIHRvIHRoZSBDb21wb25lbnQgZm9sZGVyL01FVEEtSU5GLgotICAgICAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTklGRVNUX0ZPTERFUiA9ICJJSmF2YUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5NQU5JRkVTVF9GT0xERVIiOwotCQotICAgIC8qKgotICAgICAqIFJlcXVpcmVkLCB0eXBlIFN0cmluZy4gVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHNlcnZlciB0YXJnZXQuCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOVElNRV9UQVJHRVRfSUQgPSBJSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfVEFSR0VUX0lEOwkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0FyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudHNFeHRlbnNpb25Qb2ludC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50c0V4dGVuc2lvblBvaW50LmphdmEKaW5kZXggNzA3NWExZS4uZGJjYjY1YiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50c0V4dGVuc2lvblBvaW50LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50c0V4dGVuc2lvblBvaW50LmphdmEKQEAgLTExLDggKzExLDE2IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudHNFeHRlbnNpb25Qb2ludC5QbHVnaW5VdGlsLio7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luLio7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50c0V4dGVuc2lvblBvaW50LlBsdWdpblV0aWwuZmluZEV4dGVuc2lvbnM7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50c0V4dGVuc2lvblBvaW50LlBsdWdpblV0aWwuZmluZE9wdGlvbmFsRWxlbWVudDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5BcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzRXh0ZW5zaW9uUG9pbnQuUGx1Z2luVXRpbC5maW5kUmVxdWlyZWRBdHRyaWJ1dGU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50c0V4dGVuc2lvblBvaW50LlBsdWdpblV0aWwuZmluZFJlcXVpcmVkRWxlbWVudDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5BcmNoaXZlRXhwb3J0UGFydGljaXBhbnRzRXh0ZW5zaW9uUG9pbnQuUGx1Z2luVXRpbC5nZXRUb3BMZXZlbEVsZW1lbnRzOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudHNFeHRlbnNpb25Qb2ludC5QbHVnaW5VdGlsLmluc3RhbnRpYXRlOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5QTFVHSU5fSUQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5sb2c7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luLmxvZ0Vycm9yOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTU0LDcgKzYyLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUEFSVElDSVBBTlQgPSAicGFydGljaXBhbnQiOyAvLyROT04tTkxTLTEkCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX1JVTlRJTUVfQ09NUE9ORU5UID0gInJ1bnRpbWUtY29tcG9uZW50IjsgLy8kTk9OLU5MUy0xJAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9GQUNUT1JZID0gImZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0VOQUJMRU1FTlQgPSAiZW5hYmxlbWVudCI7IAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9FTkFCTEVNRU5UID0gImVuYWJsZW1lbnQiOyAvLyROT04tTkxTLTEkCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKQEAgLTE4OCw3ICsxOTYsNyBAQAogICAgICAgICBmaW5hbCBQYXJ0aWNpcGFudEluZm8gaW5mbyA9IG5ldyBQYXJ0aWNpcGFudEluZm8oKTsKIAogICAgICAgICBpbmZvLnBsdWdpbklkID0gY29uZmlnLmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpOwotICAgICAgICBpbmZvLmlkID0gaW5mby5wbHVnaW5JZCArICIuIiArIGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggY29uZmlnLCBBVFRSX0lEICk7CisgICAgICAgIGluZm8uaWQgPSBpbmZvLnBsdWdpbklkICsgIi4iICsgZmluZFJlcXVpcmVkQXR0cmlidXRlKCBjb25maWcsIEFUVFJfSUQgKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAKICAgICAgICAgZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsRmFjdG9yeSA9IGZpbmRSZXF1aXJlZEVsZW1lbnQoIGNvbmZpZywgRUxfRkFDVE9SWSApOwogICAgICAgICBpbmZvLmNsYXNzTmFtZSA9IGZpbmRSZXF1aXJlZEF0dHJpYnV0ZSggZWxGYWN0b3J5LCBBVFRSX0NMQVNTICk7CkBAIC0zNDUsMTAgKzM1Myw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuWyAwIF07Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bIDAgXTsKICAgICAgICAgfQogICAgICAgICAKICAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFZhbHVlKCBmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWwsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9BcmNoaXZlTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0FyY2hpdmVNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NGI1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9BcmNoaXZlTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDE2IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgQXJjaGl2ZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyX0ltcG9ydGluZ18wXzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0b3JDb21wb25lbnROZXN0ZWRKQVJBcmNoaXZlTG9hZEFkYXB0ZXJfVW5hYmxlX3RvX2dldF9jb250ZW50c19mcm9tXzBfbWVzXzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsX09wZW5lcl9vZl9BcmNoaXZlX2RpZF9ub3RfY2xvc2VfaXRfOworCisJc3RhdGljIHsKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQXJjaGl2ZU1lc3NhZ2VzLmNsYXNzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0FyY2hpdmVXcmFwcGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9BcmNoaXZlV3JhcHBlci5qYXZhCmluZGV4IDMyZjZjZGIuLjIyYmZiOTMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0FyY2hpdmVXcmFwcGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQXJjaGl2ZVdyYXBwZXIuamF2YQpAQCAtMTcsMTkgKzE3LDEyIEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuRmlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkVBUkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb247CkBAIC00MCw1OCArMzMsMjQgQEAKIAogcHVibGljIGNsYXNzIEFyY2hpdmVXcmFwcGVyIHsKIAotCS8vVE9ETyByZW1vdmUgY29tbW9uQXJjaGl2ZTsgcG9zc2libHkgcmVtb3ZlIHRoaXMgZW50aXJlIGNsYXNzIGFuZAotCS8vY29kZSBkaXJlY3RseSB0byBJQXJjaGl2ZQotCXByaXZhdGUgQXJjaGl2ZSBjb21tb25BcmNoaXZlID0gbnVsbDsKIAlwcml2YXRlIElBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwogCXByaXZhdGUgSmF2YUVFUXVpY2tQZWVrIGpxcCA9IG51bGw7CiAKIAlwdWJsaWMgQXJjaGl2ZVdyYXBwZXIoSUFyY2hpdmUgYXJjaGl2ZSkgewogCQl0aGlzLmFyY2hpdmUgPSBhcmNoaXZlOworCQlpZihhcmNoaXZlID09IG51bGwpeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KIAkJSmF2YUVFQXJjaGl2ZVV0aWxpdGllcyBqZWEgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFOwogCQlqcXAgPSBqZWEuZ2V0SmF2YUVFUXVpY2tQZWVrKGFyY2hpdmUpOwogCX0KIAotCXB1YmxpYyBBcmNoaXZlV3JhcHBlcihBcmNoaXZlIG1GaWxlKSB7Ci0JCXRoaXMuY29tbW9uQXJjaGl2ZSA9IG1GaWxlOwotCQlpbnQgdHlwZSA9IEoyRUVDb25zdGFudHMuVU5LTk9XTjsKLQotCQlpZiAobUZpbGUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKSkgewotCQkJdHlwZSA9IEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEU7Ci0JCX0gZWxzZSBpZiAobUZpbGUuaXNFQVJGaWxlKCkpIHsKLQkJCXR5cGUgPSBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEU7Ci0JCX0gZWxzZSBpZiAobUZpbGUuaXNFSkJKYXJGaWxlKCkpIHsKLQkJCXR5cGUgPSBKMkVFQ29uc3RhbnRzLkVKQl9UWVBFOwotCQl9IGVsc2UgaWYgKG1GaWxlLmlzV0FSRmlsZSgpKSB7Ci0JCQl0eXBlID0gSjJFRUNvbnN0YW50cy5XRUJfVFlQRTsKLQkJfSBlbHNlIGlmIChtRmlsZS5pc1JBUkZpbGUoKSkgewotCQkJdHlwZSA9IEoyRUVDb25zdGFudHMuQ09OTkVDVE9SX1RZUEU7Ci0JCX0KLQkJaWYgKHR5cGUgIT0gSjJFRUNvbnN0YW50cy5VTktOT1dOKSB7Ci0JCQlpbnQgdmVyc2lvbiA9IEFyY2hpdmVVdGlsLmdldEZhc3RTcGVjVmVyc2lvbigoTW9kdWxlRmlsZSkgbUZpbGUpOwotCQkJanFwID0gbmV3IEphdmFFRVF1aWNrUGVlayh0eXBlLCB2ZXJzaW9uKTsKLQkJfSBlbHNlIHsKLQkJCWpxcCA9IG5ldyBKYXZhRUVRdWlja1BlZWsobnVsbCk7Ci0JCX0KLQl9Ci0KIAlwdWJsaWMgSmF2YUVFUXVpY2tQZWVrIGdldEphdmFFRVF1aWNrUGVlaygpIHsKIAkJcmV0dXJuIGpxcDsKIAl9CiAKLQlwdWJsaWMgQXJjaGl2ZSBnZXRDb21tb25BcmNoaXZlKCkgewotCQlyZXR1cm4gKEFyY2hpdmUpIGNvbW1vbkFyY2hpdmU7Ci0JfQotCiAJcHVibGljIE9iamVjdCBnZXRVbmRlckx5aW5nQXJjaGl2ZSgpIHsKLQkJaWYgKGFyY2hpdmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFyY2hpdmU7Ci0JCX0KLQkJaWYgKGNvbW1vbkFyY2hpdmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbW1vbkFyY2hpdmU7Ci0JCX0KLQkJZmFpbCgpOwotCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIGFyY2hpdmU7CiAJfQogCiAJcHJpdmF0ZSBBcmNoaXZlV3JhcHBlciBjYWNoZWRQYXJlbnQgPSBudWxsOwpAQCAtMTAwLDE2ICs1OSw4IEBACiAJCWlmIChudWxsICE9IGNhY2hlZFBhcmVudCkgewogCQkJcmV0dXJuIGNhY2hlZFBhcmVudDsKIAkJfQotCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQljYWNoZWRQYXJlbnQgPSBuZXcgQXJjaGl2ZVdyYXBwZXIoYXJjaGl2ZS5nZXRBcmNoaXZlKCkpOwotCQkJcmV0dXJuIGNhY2hlZFBhcmVudDsKLQkJfQotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQljYWNoZWRQYXJlbnQgPSBuZXcgQXJjaGl2ZVdyYXBwZXIoKEFyY2hpdmUpIGNvbW1vbkFyY2hpdmUuZUNvbnRhaW5lcigpKTsKLQkJCXJldHVybiBjYWNoZWRQYXJlbnQ7Ci0JCX0KLQkJZmFpbCgpOwotCQlyZXR1cm4gbnVsbDsKKwkJY2FjaGVkUGFyZW50ID0gbmV3IEFyY2hpdmVXcmFwcGVyKGFyY2hpdmUuZ2V0QXJjaGl2ZSgpKTsKKwkJcmV0dXJuIGNhY2hlZFBhcmVudDsKIAl9CiAKIAlwdWJsaWMgSUFyY2hpdmUgZ2V0SUFyY2hpdmUoKSB7CkBAIC0xMTgsMzkgKzY5LDI1IEBACiAKIAlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkJdHJ5IHsKLQkJCWlmIChjb21tb25BcmNoaXZlICE9IG51bGwgJiYgY29tbW9uQXJjaGl2ZS5pc09wZW4oKSkgewotCQkJCWNvbW1vbkFyY2hpdmUuY2xvc2UoKTsKLQkJCX0KLQkJCWlmIChhcmNoaXZlICE9IG51bGwgJiYgYXJjaGl2ZS5pc09wZW4oKSkgeworCQkJaWYgKGFyY2hpdmUuaXNPcGVuKCkpIHsKIAkJCQlKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmNsb3NlQXJjaGl2ZShhcmNoaXZlKTsKIAkJCX0KIAkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJdGhyb3cgZTsKIAkJfQogCX0KIAogCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoY29tbW9uQXJjaGl2ZS5nZXRVUkkoKSk7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYXJjaGl2ZS5nZXRQYXRoKCk7Ci0JCX0KLQkJZmFpbCgpOwotCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIGFyY2hpdmUuZ2V0UGF0aCgpOwogCX0KIAogCXByaXZhdGUgdm9pZCBmYWlsKCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXJjaGl2ZVdyYXBwZXIgaXMgaW5jb25zaXN0ZW50LiIpOworCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQXJjaGl2ZVdyYXBwZXIgaXMgaW5jb25zaXN0ZW50LiIpOyAvLyROT04tTkxTLTEkCiAJfQogCiAJcHVibGljIGludCBnZXRTaXplKCkgewotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKQotCQkJcmV0dXJuIGNvbW1vbkFyY2hpdmUuZ2V0RmlsZXMoKS5zaXplKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBhcmNoaXZlLmdldEFyY2hpdmVSZXNvdXJjZXMoKS5zaXplKCk7CisJCXJldHVybiBhcmNoaXZlLmdldEFyY2hpdmVSZXNvdXJjZXMoKS5zaXplKCk7CiAJfQogCiAJcHJpdmF0ZSBMaXN0PEFyY2hpdmVXcmFwcGVyPiBjYWNoZWRXZWJMaWJzOwpAQCAtMTY1LDM5ICsxMDIsMjcgQEAKIAogCQljYWNoZWRXZWJMaWJzID0gbmV3IEFycmF5TGlzdDxBcmNoaXZlV3JhcHBlcj4oKTsKIAotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlXQVJGaWxlIHdhciA9IChXQVJGaWxlKSBjb21tb25BcmNoaXZlOwotCQkJTGlzdCBsaWJzID0gd2FyLmdldExpYkFyY2hpdmVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpYnMuc2l6ZSgpOyBpKyspIHsKLQkJCQljYWNoZWRXZWJMaWJzLmFkZChuZXcgQXJjaGl2ZVdyYXBwZXIoKEFyY2hpdmUpIGxpYnMuZ2V0KGkpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkV2ViTGliczsKLQkJfQotCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlMaXN0PElBcmNoaXZlUmVzb3VyY2U+IHJlc291cmNlcyA9IGFyY2hpdmUuZ2V0QXJjaGl2ZVJlc291cmNlcygpOwotCQkJZm9yIChJQXJjaGl2ZVJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzKSB7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJQXJjaGl2ZVJlc291cmNlLkRJUkVDVE9SWV9UWVBFKSB7Ci0JCQkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCk7Ci0JCQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMikgewotCQkJCQkJaWYgKHBhdGguc2VnbWVudCgwKS5lcXVhbHMoIldFQi1JTkYiKSAmJiBwYXRoLnNlZ21lbnQoMSkuZXF1YWxzKCJsaWIiKSkgewotCQkJCQkJCVN0cmluZyBsYXN0U2VnbWVudCA9IHBhdGgubGFzdFNlZ21lbnQoKTsKLQkJCQkJCQlpZiAobGFzdFNlZ21lbnQuZW5kc1dpdGgoImphciIpIHx8IGxhc3RTZWdtZW50LmVuZHNXaXRoKCJ6aXAiKSkgewotCQkJCQkJCQlJQXJjaGl2ZSB3ZWJMaWI7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQl3ZWJMaWIgPSBhcmNoaXZlLmdldE5lc3RlZEFyY2hpdmUocmVzb3VyY2UpOwotCQkJCQkJCQkJY2FjaGVkV2ViTGlicy5hZGQobmV3IEFyY2hpdmVXcmFwcGVyKHdlYkxpYikpOwotCQkJCQkJCQl9IGNhdGNoIChBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQl9CisJCUxpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gcmVzb3VyY2VzID0gYXJjaGl2ZS5nZXRBcmNoaXZlUmVzb3VyY2VzKCk7CisJCWZvciAoSUFyY2hpdmVSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlcykgeworCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJQXJjaGl2ZVJlc291cmNlLkRJUkVDVE9SWV9UWVBFKSB7CisJCQkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldFBhdGgoKTsKKwkJCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDIpIHsKKwkJCQkJaWYgKHBhdGguc2VnbWVudCgwKS5lcXVhbHMoIldFQi1JTkYiKSAmJiBwYXRoLnNlZ21lbnQoMSkuZXF1YWxzKCJsaWIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCVN0cmluZyBsYXN0U2VnbWVudCA9IHBhdGgubGFzdFNlZ21lbnQoKTsKKwkJCQkJCWlmIChsYXN0U2VnbWVudC5lbmRzV2l0aCgiamFyIikgfHwgbGFzdFNlZ21lbnQuZW5kc1dpdGgoInppcCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCUlBcmNoaXZlIHdlYkxpYjsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQl3ZWJMaWIgPSBhcmNoaXZlLmdldE5lc3RlZEFyY2hpdmUocmVzb3VyY2UpOworCQkJCQkJCQljYWNoZWRXZWJMaWJzLmFkZChuZXcgQXJjaGl2ZVdyYXBwZXIod2ViTGliKSk7CisJCQkJCQkJfSBjYXRjaCAoQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQlyZXR1cm4gY2FjaGVkV2ViTGliczsKIAkJfQotCQlmYWlsKCk7Ci0JCXJldHVybiBudWxsOworCQlyZXR1cm4gY2FjaGVkV2ViTGliczsKIAl9CiAKIAlwcml2YXRlIExpc3QgPFN0cmluZz5jYWNoZWRERE1hcHBlZE1vZHVsZVVSSXMgPSBudWxsOwpAQCAtMjEyLDM5ICsxMzcsMzAgQEAKIAkJCiAJCWNhY2hlZERETWFwcGVkTW9kdWxlVVJJcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogCQkKLQkJaWYgKGNvbW1vbkFyY2hpdmUgIT0gbnVsbCkgewotCQkJRUFSRmlsZSBlYXIgPSAoRUFSRmlsZSkgY29tbW9uQXJjaGl2ZTsKLQkJCUxpc3QgZWFyTW9kcyA9IGVhci5nZXRNb2R1bGVGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJNb2RzLnNpemUoKTsgaSsrKSB7Ci0JCQkJY2FjaGVkRERNYXBwZWRNb2R1bGVVUklzLmFkZCgoKEFyY2hpdmUpIGVhck1vZHMuZ2V0KGkpKS5nZXRVUkkoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkRERNYXBwZWRNb2R1bGVVUklzOwotCQl9IGVsc2UgaWYoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlpZihhcmNoaXZlLmNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKSkpewotCQkJCWlmKGpxcC5nZXRKYXZhRUVWZXJzaW9uKCkgPT0gSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQpewotCQkJCQl0cnkgewotCQkJCQkJQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSAoQXBwbGljYXRpb24pIGFyY2hpdmUuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCQkJCUxpc3QgbW9kdWxlcyA9IGFwcGxpY2F0aW9uLmdldE1vZHVsZXMoKTsKLQkJCQkJCWZvcihpbnQgaT0wO2k8bW9kdWxlcy5zaXplKCk7aSsrKXsKLQkJCQkJCQlNb2R1bGUgbW9kdWxlID0gKE1vZHVsZSltb2R1bGVzLmdldChpKTsKLQkJCQkJCQlTdHJpbmcgdXJpID0gbW9kdWxlLmdldFVyaSgpOwotCQkJCQkJCWNhY2hlZERETWFwcGVkTW9kdWxlVVJJcy5hZGQodXJpKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCWlmKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpKSl7CisJCQlpZihqcXAuZ2V0SmF2YUVFVmVyc2lvbigpID09IEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lEIHx8IGpxcC5nZXRKYXZhRUVWZXJzaW9uKCkgPT0gSmF2YUVFUXVpY2tQZWVrLkpFRV82XzBfSUQpeworCQkJCXRyeSB7CisJCQkJCUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKEFwcGxpY2F0aW9uKSBhcmNoaXZlLmdldE1vZGVsT2JqZWN0KCk7CisJCQkJCUxpc3QgbW9kdWxlcyA9IGFwcGxpY2F0aW9uLmdldE1vZHVsZXMoKTsKKwkJCQkJZm9yKGludCBpPTA7aTxtb2R1bGVzLnNpemUoKTtpKyspeworCQkJCQkJTW9kdWxlIG1vZHVsZSA9IChNb2R1bGUpbW9kdWxlcy5nZXQoaSk7CisJCQkJCQlTdHJpbmcgdXJpID0gbW9kdWxlLmdldFVyaSgpOworCQkJCQkJY2FjaGVkRERNYXBwZWRNb2R1bGVVUklzLmFkZCh1cmkpOwogCQkJCQl9Ci0JCQkJfSBlbHNlIHsgCi0JCQkJCXRyeXsKLQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uKWFyY2hpdmUuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCQkJCUxpc3QgbW9kdWxlcyA9IGFwcGxpY2F0aW9uLmdldE1vZHVsZXMoKTsKLQkJCQkJCWZvcihpbnQgaT0wO2k8bW9kdWxlcy5zaXplKCk7aSsrKXsKLQkJCQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGUgbW9kdWxlID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZSltb2R1bGVzLmdldChpKTsKLQkJCQkJCQlTdHJpbmcgdXJpID0gbW9kdWxlLmdldFVyaSgpOwotCQkJCQkJCWNhY2hlZERETWFwcGVkTW9kdWxlVVJJcy5hZGQodXJpKTsKLQkJCQkJCX0KLQkJCQkJfWNhdGNoIChBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQl9IGNhdGNoIChBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIGUpIHsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCQl9CisJCQl9IGVsc2UgeyAKKwkJCQl0cnl7CisJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uKWFyY2hpdmUuZ2V0TW9kZWxPYmplY3QoKTsKKwkJCQkJTGlzdCBtb2R1bGVzID0gYXBwbGljYXRpb24uZ2V0TW9kdWxlcygpOworCQkJCQlmb3IoaW50IGk9MDtpPG1vZHVsZXMuc2l6ZSgpO2krKyl7CisJCQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGUgbW9kdWxlID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZSltb2R1bGVzLmdldChpKTsKKwkJCQkJCVN0cmluZyB1cmkgPSBtb2R1bGUuZ2V0VXJpKCk7CisJCQkJCQljYWNoZWRERE1hcHBlZE1vZHVsZVVSSXMuYWRkKHVyaSk7CiAJCQkJCX0KKwkJCQl9Y2F0Y2ggKEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gZSkgeworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMjYyLDc2ICsxNzgsNTUgQEAKIAkJCWZhaWwoKTsKIAkJfQogCQljYWNoZWRFQVJNb2R1bGVzID0gbmV3IEFycmF5TGlzdDxBcmNoaXZlV3JhcHBlcj4oKTsKLQotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlFQVJGaWxlIGVhciA9IChFQVJGaWxlKSBjb21tb25BcmNoaXZlOwotCQkJTGlzdCBlYXJNb2RzID0gZWFyLmdldE1vZHVsZUZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVhck1vZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQljYWNoZWRFQVJNb2R1bGVzLmFkZChuZXcgQXJjaGl2ZVdyYXBwZXIoKEFyY2hpdmUpIGVhck1vZHMuZ2V0KGkpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkRUFSTW9kdWxlczsKLQkJfQotCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlhcmNoaXZlLmdldEFyY2hpdmVSZXNvdXJjZXMoKTsgLy8gbmVlZCB0byBmb3JjZSB0aGUgZnVsbCBpbmRleCB0byBiZSBidWlsdCBub3cuCi0JCQlpZihqcXAuZ2V0SmF2YUVFVmVyc2lvbigpID09IEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lEKXsKLQkJCQlMaXN0PElBcmNoaXZlUmVzb3VyY2U+IHJlc291cmNlcyA9IGFyY2hpdmUuZ2V0QXJjaGl2ZVJlc291cmNlcygpOwotCQkJCWZvciAoSUFyY2hpdmVSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlcykgewotCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElBcmNoaXZlUmVzb3VyY2UuRElSRUNUT1JZX1RZUEUpIHsKLQkJCQkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCk7Ci0JCQkJCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKLQkJCQkJCQlTdHJpbmcgbGFzdFNlZ21lbnQgPSBwYXRoLmxhc3RTZWdtZW50KCk7Ci0JCQkJCQkJaWYgKGxhc3RTZWdtZW50LmVuZHNXaXRoKCJqYXIiKSB8fCBsYXN0U2VnbWVudC5lbmRzV2l0aCgiemlwIikgfHwgbGFzdFNlZ21lbnQuZW5kc1dpdGgoInJhciIpIHx8IGxhc3RTZWdtZW50LmVuZHNXaXRoKCJ3YXIiKSkgewotCQkJCQkJCQlJQXJjaGl2ZSBlYXJtb2R1bGU7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQllYXJtb2R1bGUgPSBhcmNoaXZlLmdldE5lc3RlZEFyY2hpdmUocmVzb3VyY2UpOwotCQkJCQkJCQkJY2FjaGVkRUFSTW9kdWxlcy5hZGQobmV3IEFyY2hpdmVXcmFwcGVyKGVhcm1vZHVsZSkpOwotCQkJCQkJCQl9IGNhdGNoIChBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0cnkgewotCQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiBhcHAgPSAob3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24pYXJjaGl2ZS5nZXRNb2RlbE9iamVjdCgpOwotCQkJCQlMaXN0IG1vZHVsZXMgPSBhcHAuZ2V0TW9kdWxlcygpOwotCQkJCQlmb3IoaW50IGk9MDtpPG1vZHVsZXMuc2l6ZSgpO2krKyl7Ci0JCQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGUgbW9kID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZSltb2R1bGVzLmdldChpKTsKLQkJCQkJCVN0cmluZyB1cmkgPSBtb2QuZ2V0VXJpKCk7Ci0JCQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodXJpKTsKLQkJCQkJCWlmKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UocGF0aCkpeworCQlpZihqcXAuZ2V0SmF2YUVFVmVyc2lvbigpID09IEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lEIHx8IGpxcC5nZXRKYXZhRUVWZXJzaW9uKCkgPT0gSmF2YUVFUXVpY2tQZWVrLkpFRV82XzBfSUQpeworCQkJTGlzdDxJQXJjaGl2ZVJlc291cmNlPiByZXNvdXJjZXMgPSBhcmNoaXZlLmdldEFyY2hpdmVSZXNvdXJjZXMoKTsKKwkJCWZvciAoSUFyY2hpdmVSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlcykgeworCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSUFyY2hpdmVSZXNvdXJjZS5ESVJFQ1RPUllfVFlQRSkgeworCQkJCQlJUGF0aCBwYXRoID0gcmVzb3VyY2UuZ2V0UGF0aCgpOworCQkJCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDApIHsKKwkJCQkJCVN0cmluZyBsYXN0U2VnbWVudCA9IHBhdGgubGFzdFNlZ21lbnQoKTsKKwkJCQkJCWlmIChsYXN0U2VnbWVudC5lbmRzV2l0aCgiamFyIikgfHwgbGFzdFNlZ21lbnQuZW5kc1dpdGgoInppcCIpIHx8IGxhc3RTZWdtZW50LmVuZHNXaXRoKCJyYXIiKSB8fCBsYXN0U2VnbWVudC5lbmRzV2l0aCgid2FyIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAorCQkJCQkJCUlBcmNoaXZlIGVhcm1vZHVsZTsKIAkJCQkJCQl0cnkgewotCQkJCQkJCQlJQXJjaGl2ZVJlc291cmNlIHJlc291cmNlID0gYXJjaGl2ZS5nZXRBcmNoaXZlUmVzb3VyY2UocGF0aCk7Ci0JCQkJCQkJCUlBcmNoaXZlIGVhcm1vZHVsZTsKIAkJCQkJCQkJZWFybW9kdWxlID0gYXJjaGl2ZS5nZXROZXN0ZWRBcmNoaXZlKHJlc291cmNlKTsKIAkJCQkJCQkJY2FjaGVkRUFSTW9kdWxlcy5hZGQobmV3IEFyY2hpdmVXcmFwcGVyKGVhcm1vZHVsZSkpOwogCQkJCQkJCX0gY2F0Y2ggKEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQl9IGNhdGNoIChBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIGUpIHsKLQkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJfQogCQkJfQotCQkJcmV0dXJuIGNhY2hlZEVBUk1vZHVsZXM7CisJCX0gZWxzZSB7CisJCQl0cnkgeworCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIGFwcCA9IChvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbilhcmNoaXZlLmdldE1vZGVsT2JqZWN0KCk7CisJCQkJTGlzdCBtb2R1bGVzID0gYXBwLmdldE1vZHVsZXMoKTsKKwkJCQlmb3IoaW50IGk9MDtpPG1vZHVsZXMuc2l6ZSgpO2krKyl7CisJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZSBtb2QgPSAob3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlKW1vZHVsZXMuZ2V0KGkpOworCQkJCQlTdHJpbmcgdXJpID0gbW9kLmdldFVyaSgpOworCQkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgodXJpKTsKKwkJCQkJaWYoYXJjaGl2ZS5jb250YWluc0FyY2hpdmVSZXNvdXJjZShwYXRoKSl7CisJCQkJCQl0cnkgeworCQkJCQkJCUlBcmNoaXZlUmVzb3VyY2UgcmVzb3VyY2UgPSBhcmNoaXZlLmdldEFyY2hpdmVSZXNvdXJjZShwYXRoKTsKKwkJCQkJCQlJQXJjaGl2ZSBlYXJtb2R1bGU7CisJCQkJCQkJZWFybW9kdWxlID0gYXJjaGl2ZS5nZXROZXN0ZWRBcmNoaXZlKHJlc291cmNlKTsKKwkJCQkJCQljYWNoZWRFQVJNb2R1bGVzLmFkZChuZXcgQXJjaGl2ZVdyYXBwZXIoZWFybW9kdWxlKSk7CisJCQkJCQl9IGNhdGNoIChBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgeworCQkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfSBjYXRjaCAoQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiBlKSB7CisJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQl9CiAJCX0KLQkJZmFpbCgpOwotCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIGNhY2hlZEVBUk1vZHVsZXM7CiAJfQogCiAJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29tbW9uQXJjaGl2ZS5nZXROYW1lKCk7Ci0JCX0KLQkJaWYgKGFyY2hpdmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFyY2hpdmUuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCk7Ci0JCX0KLQkJZmFpbCgpOwotCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIGFyY2hpdmUuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCk7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gaXNNb2R1bGUoKSB7CkBAIC0zNTEsNDggKzI0NiwyMyBAQAogCX0KIAogCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYXRpb25DbGllbnRGaWxlKCkgewotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKQotCQkJcmV0dXJuIGNvbW1vbkFyY2hpdmUuaXNBcHBsaWNhdGlvbkNsaWVudEZpbGUoKTsKLQkJaWYgKGFyY2hpdmUgIT0gbnVsbCkKLQkJCXJldHVybiAoSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5nZXRKYXZhRUVRdWlja1BlZWsoYXJjaGl2ZSkuZ2V0VHlwZSgpID09IEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEUpOwotCQlmYWlsKCk7Ci0JCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIChKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmdldEphdmFFRVF1aWNrUGVlayhhcmNoaXZlKS5nZXRUeXBlKCkgPT0gSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfVFlQRSk7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gaXNXQVJGaWxlKCkgewotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKQotCQkJcmV0dXJuIGNvbW1vbkFyY2hpdmUuaXNXQVJGaWxlKCk7Ci0JCWlmIChhcmNoaXZlICE9IG51bGwpCi0JCQlyZXR1cm4gKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0SmF2YUVFUXVpY2tQZWVrKGFyY2hpdmUpLmdldFR5cGUoKSA9PSBKMkVFQ29uc3RhbnRzLldFQl9UWVBFKTsKLQkJZmFpbCgpOwotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiAoSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5nZXRKYXZhRUVRdWlja1BlZWsoYXJjaGl2ZSkuZ2V0VHlwZSgpID09IEoyRUVDb25zdGFudHMuV0VCX1RZUEUpOwogCX0KIAogCXB1YmxpYyBib29sZWFuIGlzRUpCSmFyRmlsZSgpIHsKLQkJaWYgKGNvbW1vbkFyY2hpdmUgIT0gbnVsbCkKLQkJCXJldHVybiBjb21tb25BcmNoaXZlLmlzRUpCSmFyRmlsZSgpOwotCQlpZiAoYXJjaGl2ZSAhPSBudWxsKQotCQkJcmV0dXJuIChKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmdldEphdmFFRVF1aWNrUGVlayhhcmNoaXZlKS5nZXRUeXBlKCkgPT0gSjJFRUNvbnN0YW50cy5FSkJfVFlQRSk7Ci0JCWZhaWwoKTsKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0SmF2YUVFUXVpY2tQZWVrKGFyY2hpdmUpLmdldFR5cGUoKSA9PSBKMkVFQ29uc3RhbnRzLkVKQl9UWVBFKTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBpc0VhckZpbGUoKSB7Ci0JCWlmIChjb21tb25BcmNoaXZlICE9IG51bGwpCi0JCQlyZXR1cm4gY29tbW9uQXJjaGl2ZS5pc0VBUkZpbGUoKTsKLQkJaWYgKGFyY2hpdmUgIT0gbnVsbCkKLQkJCXJldHVybiAoSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5nZXRKYXZhRUVRdWlja1BlZWsoYXJjaGl2ZSkuZ2V0VHlwZSgpID09IEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fVFlQRSk7Ci0JCWZhaWwoKTsKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0SmF2YUVFUXVpY2tQZWVrKGFyY2hpdmUpLmdldFR5cGUoKSA9PSBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEUpOwogCX0KIAogCXB1YmxpYyBib29sZWFuIGlzUkFSRmlsZSgpIHsKLQkJaWYgKGNvbW1vbkFyY2hpdmUgIT0gbnVsbCkKLQkJCXJldHVybiBjb21tb25BcmNoaXZlLmlzUkFSRmlsZSgpOwotCQlpZiAoYXJjaGl2ZSAhPSBudWxsKQotCQkJcmV0dXJuIChKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmdldEphdmFFRVF1aWNrUGVlayhhcmNoaXZlKS5nZXRUeXBlKCkgPT0gSjJFRUNvbnN0YW50cy5DT05ORUNUT1JfVFlQRSk7Ci0JCWZhaWwoKTsKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0SmF2YUVFUXVpY2tQZWVrKGFyY2hpdmUpLmdldFR5cGUoKSA9PSBKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9UWVBFKTsKIAl9CiAKIAkvLyBUaGlzIGlzIGFuIGFycmF5IHNvIHdlIGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaW5pdGlhbGl6ZWQgYW5kIG51bGwgdnMgbm90IGluaXRpYWxpemVkCkBAIC00MDksNDggKzI3OSw0MCBAQAogCQl9CiAJCWNhY2hlZFdlYkNvbnRleHRSb290ID0gbmV3IFN0cmluZ1sxXTsKIAotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQljYWNoZWRXZWJDb250ZXh0Um9vdFswXSA9ICgoV2ViTW9kdWxlKSAoKEVBUkZpbGUpIGNvbW1vbkFyY2hpdmUuZ2V0Q29udGFpbmVyKCkpLmdldE1vZHVsZShjb21tb25BcmNoaXZlLmdldFVSSSgpLCBudWxsKSkuZ2V0Q29udGV4dFJvb3QoKTsKLQkJCXJldHVybiBjYWNoZWRXZWJDb250ZXh0Um9vdFswXTsKLQkJfQotCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlJQXJjaGl2ZSBlYXJBcmNoaXZlID0gYXJjaGl2ZS5nZXRBcmNoaXZlKCk7Ci0JCQlpZihlYXJBcmNoaXZlLmNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKSkpewotCQkJCUphdmFFRVF1aWNrUGVlayBlYXJKUVAgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmdldEphdmFFRVF1aWNrUGVlayhlYXJBcmNoaXZlKTsKLQkJCQlpZihlYXJKUVAuZ2V0SmF2YUVFVmVyc2lvbigpID09IEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lEKXsKLQkJCQkJdHJ5IHsKLQkJCQkJCUFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKEFwcGxpY2F0aW9uKSBlYXJBcmNoaXZlLmdldE1vZGVsT2JqZWN0KCk7Ci0JCQkJCQlTdHJpbmcgbW9kdWxlTmFtZSA9IGFyY2hpdmUuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJCQlNb2R1bGUgbW9kdWxlID0gKE1vZHVsZSkgYXBwbGljYXRpb24uZ2V0Rmlyc3RNb2R1bGUobW9kdWxlTmFtZSk7Ci0JCQkJCQlpZihtb2R1bGUgIT0gbnVsbCl7Ci0JCQkJCQkJY2FjaGVkV2ViQ29udGV4dFJvb3RbMF0gPSBtb2R1bGUuZ2V0V2ViKCkuZ2V0Q29udGV4dFJvb3QoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY2FjaGVkV2ViQ29udGV4dFJvb3RbMF0gPSBnZXREZWZhdWx0Q29udGV4dFJvb3QoKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCUlBcmNoaXZlIGVhckFyY2hpdmUgPSBhcmNoaXZlLmdldEFyY2hpdmUoKTsKKwkJaWYoZWFyQXJjaGl2ZS5jb250YWluc0FyY2hpdmVSZXNvdXJjZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSkpKXsKKwkJCUphdmFFRVF1aWNrUGVlayBlYXJKUVAgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmdldEphdmFFRVF1aWNrUGVlayhlYXJBcmNoaXZlKTsKKwkJCWlmKGVhckpRUC5nZXRKYXZhRUVWZXJzaW9uKCkgPT0gSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQgfHwgZWFySlFQLmdldEphdmFFRVZlcnNpb24oKSA9PSBKYXZhRUVRdWlja1BlZWsuSkVFXzZfMF9JRCl7CisJCQkJdHJ5IHsKKwkJCQkJQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSAoQXBwbGljYXRpb24pIGVhckFyY2hpdmUuZ2V0TW9kZWxPYmplY3QoKTsKKwkJCQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBhcmNoaXZlLmdldFBhdGgoKS50b1N0cmluZygpOworCQkJCQlNb2R1bGUgbW9kdWxlID0gYXBwbGljYXRpb24uZ2V0Rmlyc3RNb2R1bGUobW9kdWxlTmFtZSk7CisJCQkJCWlmKG1vZHVsZSAhPSBudWxsKXsKKwkJCQkJCWNhY2hlZFdlYkNvbnRleHRSb290WzBdID0gbW9kdWxlLmdldFdlYigpLmdldENvbnRleHRSb290KCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljYWNoZWRXZWJDb250ZXh0Um9vdFswXSA9IGdldERlZmF1bHRDb250ZXh0Um9vdCgpOwogCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJ5ewotCQkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSAob3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24pZWFyQXJjaGl2ZS5nZXRNb2RlbE9iamVjdCgpOwotCQkJCQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBhcmNoaXZlLmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlIG1vZHVsZSA9IChvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGUpYXBwbGljYXRpb24uZ2V0Rmlyc3RNb2R1bGUobW9kdWxlTmFtZSk7Ci0JCQkJCQlpZihtb2R1bGUgPT0gbnVsbCl7Ci0JCQkJCQkJY2FjaGVkV2ViQ29udGV4dFJvb3RbMF0gPSBudWxsOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljYWNoZWRXZWJDb250ZXh0Um9vdFswXSA9IG1vZHVsZS5nZXRDb250ZXh0Um9vdCgpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQorCQkJCX0gY2F0Y2ggKEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gZSkgeworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJY2FjaGVkV2ViQ29udGV4dFJvb3RbMF0gPSBnZXREZWZhdWx0Q29udGV4dFJvb3QoKTsKKwkJCQl0cnl7CisJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uKWVhckFyY2hpdmUuZ2V0TW9kZWxPYmplY3QoKTsKKwkJCQkJU3RyaW5nIG1vZHVsZU5hbWUgPSBhcmNoaXZlLmdldFBhdGgoKS50b1N0cmluZygpOworCQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGUgbW9kdWxlID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZSlhcHBsaWNhdGlvbi5nZXRGaXJzdE1vZHVsZShtb2R1bGVOYW1lKTsKKwkJCQkJaWYobW9kdWxlID09IG51bGwpeworCQkJCQkJY2FjaGVkV2ViQ29udGV4dFJvb3RbMF0gPSBudWxsOworCQkJCQl9IGVsc2UgeworCQkJCQkJY2FjaGVkV2ViQ29udGV4dFJvb3RbMF0gPSBtb2R1bGUuZ2V0Q29udGV4dFJvb3QoKTsKKwkJCQkJfQorCQkJCX0gY2F0Y2ggKEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gZSkgeworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCX0KIAkJCX0KLQkJCXJldHVybiBjYWNoZWRXZWJDb250ZXh0Um9vdFswXTsKKwkJfSBlbHNlIHsKKwkJCWNhY2hlZFdlYkNvbnRleHRSb290WzBdID0gZ2V0RGVmYXVsdENvbnRleHRSb290KCk7CiAJCX0KLQkJZmFpbCgpOwotCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIGNhY2hlZFdlYkNvbnRleHRSb290WzBdOwogCX0KIAogCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRDb250ZXh0Um9vdCgpIHsKQEAgLTQ3OSw2OCArMzQxLDQ4IEBACiAJCX0KIAogCQlBcmNoaXZlV3JhcHBlciBlamJDbGllbnRBcmNoaXZlV3JhcHBlciA9IG51bGw7Ci0JCXRyeXsKLQkJCWlmIChjb21tb25BcmNoaXZlICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlFSkJKYXIgamFyID0gKChFSkJKYXJGaWxlKSBlamJXcmFwcGVyLmdldFVuZGVyTHlpbmdBcmNoaXZlKCkpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJCWlmIChqYXIgIT0gbnVsbCkgewotCQkJCQkJaWYgKGphci5nZXRFamJDbGllbnRKYXIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIGNsaWVudE5hbWUgPSBqYXIuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCQkJCQkJZWpiQ2xpZW50QXJjaGl2ZVdyYXBwZXIgPSBuZXcgQXJjaGl2ZVdyYXBwZXIoKEFyY2hpdmUpICgoRUFSRmlsZSkgY29tbW9uQXJjaGl2ZSkuZ2V0RmlsZShjbGllbnROYW1lKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGVqYkNsaWVudEFyY2hpdmVXcmFwcGVyOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJdHJ5IHsKKwkJCUphdmFFRVF1aWNrUGVlayBqcXAgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmdldEphdmFFRVF1aWNrUGVlayhlamJXcmFwcGVyLmFyY2hpdmUpOworCQkJU3RyaW5nIGNsaWVudEphck5hbWUgPSBudWxsOworCQkJaWYoanFwLmdldFZlcnNpb24oKSA9PSBKYXZhRUVRdWlja1BlZWsuRUpCXzNfMF9JRCB8fCBqcXAuZ2V0VmVyc2lvbigpID09IEphdmFFRVF1aWNrUGVlay5FSkJfM18xX0lEKXsKKwkJCQlpZihlamJXcmFwcGVyLmFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJKSkpeworCQkJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIgZWRkID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcikgZWpiV3JhcHBlci5hcmNoaXZlLmdldE1vZGVsT2JqZWN0KCk7CisJCQkJCWNsaWVudEphck5hbWUgPSBlZGQuZ2V0RWpiQ2xpZW50SmFyKCk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlFSkJKYXIgamFyID0gKEVKQkphcillamJXcmFwcGVyLmFyY2hpdmUuZ2V0TW9kZWxPYmplY3QoKTsKKwkJCQlpZiAoamFyICE9IG51bGwpIHsKKwkJCQkJY2xpZW50SmFyTmFtZSA9IGphci5nZXRFamJDbGllbnRKYXIoKTsKIAkJCQl9CiAJCQl9Ci0JCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSmF2YUVFUXVpY2tQZWVrIGpxcCA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0SmF2YUVFUXVpY2tQZWVrKGVqYldyYXBwZXIuYXJjaGl2ZSk7Ci0JCQkJCVN0cmluZyBjbGllbnRKYXJOYW1lID0gbnVsbDsKLQkJCQkJaWYoanFwLmdldFZlcnNpb24oKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18wX0lEKXsKLQkJCQkJCWlmKGVqYldyYXBwZXIuYXJjaGl2ZS5jb250YWluc0FyY2hpdmVSZXNvdXJjZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkkpKSl7Ci0JCQkJCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyIGVkZCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIpIGVqYldyYXBwZXIuYXJjaGl2ZS5nZXRNb2RlbE9iamVjdCgpOwotCQkJCQkJCWNsaWVudEphck5hbWUgPSBlZGQuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlFSkJKYXIgamFyID0gKEVKQkphcillamJXcmFwcGVyLmFyY2hpdmUuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCQkJCWlmIChqYXIgIT0gbnVsbCkgewotCQkJCQkJCWNsaWVudEphck5hbWUgPSBqYXIuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChudWxsICE9IGNsaWVudEphck5hbWUpIHsKLQkJCQkJCUlQYXRoIGNsaWVudEphclBhdGggPSBuZXcgUGF0aChjbGllbnRKYXJOYW1lKTsKLQkJCQkJCWlmKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoY2xpZW50SmFyUGF0aCkpewotCQkJCQkJCUlBcmNoaXZlUmVzb3VyY2UgY2xpZW50SmFyID0gYXJjaGl2ZS5nZXRBcmNoaXZlUmVzb3VyY2UoY2xpZW50SmFyUGF0aCk7Ci0JCQkJCQkJaWYobnVsbCAhPSBjbGllbnRKYXIpewotCQkJCQkJCQlpZiAoY2xpZW50SmFyLmdldFR5cGUoKSA9PSBJQXJjaGl2ZVJlc291cmNlLkFSQ0hJVkVfVFlQRSkgewotCQkJCQkJCQkJZWpiQ2xpZW50QXJjaGl2ZVdyYXBwZXIgPSBuZXcgQXJjaGl2ZVdyYXBwZXIoKElBcmNoaXZlKSBjbGllbnRKYXIpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQllamJDbGllbnRBcmNoaXZlV3JhcHBlciA9IG5ldyBBcmNoaXZlV3JhcHBlcihhcmNoaXZlLmdldE5lc3RlZEFyY2hpdmUoY2xpZW50SmFyKSk7Ci0JCQkJCQkJCQl9IGNhdGNoIChBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KKwkJCQorCQkJaWYgKG51bGwgIT0gY2xpZW50SmFyTmFtZSkgeworCQkJCUlQYXRoIGNsaWVudEphclBhdGggPSBuZXcgUGF0aChjbGllbnRKYXJOYW1lKTsKKwkJCQlpZihhcmNoaXZlLmNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKGNsaWVudEphclBhdGgpKXsKKwkJCQkJSUFyY2hpdmVSZXNvdXJjZSBjbGllbnRKYXIgPSBhcmNoaXZlLmdldEFyY2hpdmVSZXNvdXJjZShjbGllbnRKYXJQYXRoKTsKKwkJCQkJaWYobnVsbCAhPSBjbGllbnRKYXIpeworCQkJCQkJaWYgKGNsaWVudEphci5nZXRUeXBlKCkgPT0gSUFyY2hpdmVSZXNvdXJjZS5BUkNISVZFX1RZUEUpIHsKKwkJCQkJCQllamJDbGllbnRBcmNoaXZlV3JhcHBlciA9IG5ldyBBcmNoaXZlV3JhcHBlcigoSUFyY2hpdmUpIGNsaWVudEphcik7CiAJCQkJCQl9IGVsc2UgewotCQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKEVBUkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuYmluZChFQVJBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLk1JU1NJTkdfQ0xJRU5UX0pBUiwgbmV3IE9iamVjdFtdIHtjbGllbnRKYXJOYW1lLCBlamJXcmFwcGVyLmdldE5hbWUoKSwgYXJjaGl2ZS5nZXRQYXRoKCl9KSk7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJZWpiQ2xpZW50QXJjaGl2ZVdyYXBwZXIgPSBuZXcgQXJjaGl2ZVdyYXBwZXIoYXJjaGl2ZS5nZXROZXN0ZWRBcmNoaXZlKGNsaWVudEphcikpOworCQkJCQkJCX0gY2F0Y2ggKEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9Ci0JCQkJCXJldHVybiBlamJDbGllbnRBcmNoaXZlV3JhcHBlcjsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBjYXRjaCAoQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQl9IGVsc2UgeworCQkJCQlKMkVFUGx1Z2luLmxvZ1dhcm5pbmcoRUFSQXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlci5iaW5kKEVBUkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuTUlTU0lOR19DTElFTlRfSkFSLCBuZXcgT2JqZWN0W10ge2NsaWVudEphck5hbWUsIGVqYldyYXBwZXIuZ2V0TmFtZSgpLCBhcmNoaXZlLmdldFBhdGgoKX0pKTsKIAkJCQl9CiAJCQl9CisJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9IGNhdGNoIChBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIGUpIHsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0gZmluYWxseSB7CiAJCQljYWNoZWRFSkJDbGllbnRBcmNoaXZlV3JhcHBlci5wdXQoZWpiV3JhcHBlciwgZWpiQ2xpZW50QXJjaGl2ZVdyYXBwZXIpOwogCQl9Ci0JCWZhaWwoKTsKLQkJcmV0dXJuIG51bGw7CisJCXJldHVybiBlamJDbGllbnRBcmNoaXZlV3JhcHBlcjsKIAl9CiAKIAlwcml2YXRlIExpc3Q8QXJjaGl2ZVdyYXBwZXI+IGNhY2hlZEVBUlV0aWxpdGllc0FuZFdlYkxpYnMgPSBudWxsOwpAQCAtNTU2LDQ5ICszOTgsMjYgQEAKIAkJfQogCiAJCWNhY2hlZEVBUlV0aWxpdGllc0FuZFdlYkxpYnMgPSBuZXcgQXJyYXlMaXN0PEFyY2hpdmVXcmFwcGVyPigpOwotCQlpZiAoY29tbW9uQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlMaXN0IGZpbGVzID0gY29tbW9uQXJjaGl2ZS5nZXRGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotCQkJCUZpbGVJbXBsIGZpbGUgPSAoRmlsZUltcGwpIGZpbGVzLmdldChpKTsKLQkJCQlpZiAoZmlsZS5pc0FyY2hpdmUoKSAmJiAhZmlsZS5pc01vZHVsZUZpbGUoKSAmJiBmaWxlLmdldFVSSSgpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQljYWNoZWRFQVJVdGlsaXRpZXNBbmRXZWJMaWJzLmFkZChuZXcgQXJjaGl2ZVdyYXBwZXIoKEFyY2hpdmUpIGZpbGUpKTsKLQkJCQl9Ci0JCQkJaWYgKGZpbGUuaXNXQVJGaWxlKCkpIHsKLQkJCQkJQXJjaGl2ZVdyYXBwZXIgd3JhcHBlciA9IG5ldyBBcmNoaXZlV3JhcHBlcigoQXJjaGl2ZSkgZmlsZSk7Ci0JCQkJCWNhY2hlZEVBUlV0aWxpdGllc0FuZFdlYkxpYnMuYWRkQWxsKHdyYXBwZXIuZ2V0V2ViTGlicygpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkRUFSVXRpbGl0aWVzQW5kV2ViTGliczsKLQkJfQotCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlMaXN0IGZpbGVzID0gYXJjaGl2ZS5nZXRBcmNoaXZlUmVzb3VyY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUFyY2hpdmVSZXNvdXJjZSBmaWxlID0gKElBcmNoaXZlUmVzb3VyY2UpIGZpbGVzLmdldChpKTsKLQkJCQlTdHJpbmcgbGFzdFNlZ21lbnQgPSBmaWxlLmdldFBhdGgoKS5sYXN0U2VnbWVudCgpOwotCQkJCWlmIChsYXN0U2VnbWVudC5lbmRzV2l0aCgiLmphciIpIHx8IGxhc3RTZWdtZW50LmVuZHNXaXRoKCIucmFyIikgfHwgbGFzdFNlZ21lbnQuZW5kc1dpdGgoIi53YXIiKSB8fCBsYXN0U2VnbWVudC5lbmRzV2l0aCgiemlwIikpIHsKLQkJCQkJSUFyY2hpdmUgbmVzdGVkQXJjaGl2ZTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKGZpbGUuZ2V0VHlwZSgpID09IElBcmNoaXZlLkFSQ0hJVkVfVFlQRSl7Ci0JCQkJCQkJbmVzdGVkQXJjaGl2ZSA9IChJQXJjaGl2ZSlmaWxlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQluZXN0ZWRBcmNoaXZlID0gYXJjaGl2ZS5nZXROZXN0ZWRBcmNoaXZlKGZpbGUpOwotCQkJCQkJfQotCQkJCQkJQXJjaGl2ZVdyYXBwZXIgbmVzdGVkV3JhcHBlciA9IG5ldyBBcmNoaXZlV3JhcHBlcihuZXN0ZWRBcmNoaXZlKTsKLQkJCQkJCWlmIChuZXN0ZWRXcmFwcGVyLmlzV0FSRmlsZSgpKSB7Ci0JCQkJCQkJY2FjaGVkRUFSVXRpbGl0aWVzQW5kV2ViTGlicy5hZGRBbGwobmVzdGVkV3JhcHBlci5nZXRXZWJMaWJzKCkpOwotCQkJCQkJfSBlbHNlIGlmICghbmVzdGVkV3JhcHBlci5pc01vZHVsZSgpKSB7Ci0JCQkJCQkJY2FjaGVkRUFSVXRpbGl0aWVzQW5kV2ViTGlicy5hZGQobmVzdGVkV3JhcHBlcik7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCUxpc3QgZmlsZXMgPSBhcmNoaXZlLmdldEFyY2hpdmVSZXNvdXJjZXMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgeworCQkJSUFyY2hpdmVSZXNvdXJjZSBmaWxlID0gKElBcmNoaXZlUmVzb3VyY2UpIGZpbGVzLmdldChpKTsKKwkJCVN0cmluZyBsYXN0U2VnbWVudCA9IGZpbGUuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCk7CisJCQlpZiAobGFzdFNlZ21lbnQuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVCkgfHwgbGFzdFNlZ21lbnQuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuUkFSX0VYVCkgfHwgbGFzdFNlZ21lbnQuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuV0FSX0VYVCkgfHwgbGFzdFNlZ21lbnQuZW5kc1dpdGgoInppcCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlJQXJjaGl2ZSBuZXN0ZWRBcmNoaXZlOworCQkJCXRyeSB7CisJCQkJCW5lc3RlZEFyY2hpdmUgPSBhcmNoaXZlLmdldE5lc3RlZEFyY2hpdmUoZmlsZSk7CisJCQkJCUFyY2hpdmVXcmFwcGVyIG5lc3RlZFdyYXBwZXIgPSBuZXcgQXJjaGl2ZVdyYXBwZXIobmVzdGVkQXJjaGl2ZSk7CisJCQkJCWlmIChuZXN0ZWRXcmFwcGVyLmlzV0FSRmlsZSgpKSB7CisJCQkJCQljYWNoZWRFQVJVdGlsaXRpZXNBbmRXZWJMaWJzLmFkZEFsbChuZXN0ZWRXcmFwcGVyLmdldFdlYkxpYnMoKSk7CisJCQkJCX0gZWxzZSBpZiAoIW5lc3RlZFdyYXBwZXIuaXNNb2R1bGUoKSkgeworCQkJCQkJY2FjaGVkRUFSVXRpbGl0aWVzQW5kV2ViTGlicy5hZGQobmVzdGVkV3JhcHBlcik7CiAJCQkJCX0KKwkJCQl9IGNhdGNoIChBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgeworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCX0KIAkJCX0KLQkJCXJldHVybiBjYWNoZWRFQVJVdGlsaXRpZXNBbmRXZWJMaWJzOwotCiAJCX0KLQkJZmFpbCgpOwotCQlyZXR1cm4gbnVsbDsKKwkJcmV0dXJuIGNhY2hlZEVBUlV0aWxpdGllc0FuZFdlYkxpYnM7CiAJfQogCQogCUBPdmVycmlkZQpAQCAtNjEzLDggKzQzMiw2IEBACiAJCQogCQlpZihhcmNoaXZlICE9IG51bGwpewogCQkJcmV0dXJuIGFyY2hpdmUuZXF1YWxzKG90aGVyLmFyY2hpdmUpOwotCQl9IGVsc2UgaWYoY29tbW9uQXJjaGl2ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29tbW9uQXJjaGl2ZS5lcXVhbHMob3RoZXIuY29tbW9uQXJjaGl2ZSk7CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTYyMyw4ICs0NDAsNiBAQAogCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJCWlmKGFyY2hpdmUgIT0gbnVsbCl7CiAJCQlyZXR1cm4gYXJjaGl2ZS5oYXNoQ29kZSgpOwotCQl9IGVsc2UgaWYoY29tbW9uQXJjaGl2ZSAhPSBudWxsKXsKLQkJCXJldHVybiBjb21tb25BcmNoaXZlLmhhc2hDb2RlKCk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQppbmRleCA5YmE2ZWYxLi45NDViZjJlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQpAQCAtMTIsNiArMTIsNyBAQAogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTM4LDEzICszOSwxNCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS5TaW5nbGVSb290VXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5FQVJBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5TWFuaWZlc3RVdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbjsKQEAgLTU3LDcgKzU5LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkRlcGVuZGVuY3lUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwpAQCAtODIsMjcgKzgzLDI5IEBACiAJcHJvdGVjdGVkIElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQ7CiAKIAlwcm90ZWN0ZWQgYm9vbGVhbiBleHBvcnRTb3VyY2UgPSB0cnVlOworCQorCXByb3RlY3RlZCBib29sZWFuIG9wdGltaXplTWVtYmVycyA9IGZhbHNlOwogCi0JcHJpdmF0ZSBMaXN0IHppcEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOworCXByaXZhdGUgTGlzdDxaaXBGaWxlPiB6aXBGaWxlcyA9IG5ldyBBcnJheUxpc3Q8WmlwRmlsZT4oKTsKIAotCXByaXZhdGUgTGlzdCBqYXZhQ2xhc3NwYXRoVVJJcyA9IG5ldyBBcnJheUxpc3QoKTsKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBqYXZhQ2xhc3NwYXRoVVJJcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogCiAJcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMgPSB0cnVlOwogCiAJcHJvdGVjdGVkIGNsYXNzIEZpbGVzSG9sZGVyIHsKIAotCQlwcml2YXRlIE1hcCBwYXRoc1RvQXJjaGl2ZVJlc291cmNlcyA9IG5ldyBIYXNoTWFwKCk7CisJCXByaXZhdGUgTWFwPElQYXRoLCBJQXJjaGl2ZVJlc291cmNlPiBwYXRoc1RvQXJjaGl2ZVJlc291cmNlcyA9IG5ldyBIYXNoTWFwPElQYXRoLCBJQXJjaGl2ZVJlc291cmNlPigpOwogCi0JCXByaXZhdGUgTWFwIHBhdGhzVG9Xb3JrYmVuY2hSZXNvdXJjZXMgPSBuZXcgSGFzaE1hcCgpOworCQlwcml2YXRlIE1hcDxJUGF0aCwgSVJlc291cmNlPiBwYXRoc1RvV29ya2JlbmNoUmVzb3VyY2VzID0gbmV3IEhhc2hNYXA8SVBhdGgsIElSZXNvdXJjZT4oKTsKIAotCQlwcml2YXRlIE1hcCB3b3JrYmVuY2hSZXNvdXJjZXNUb1BhdGhzID0gbmV3IEhhc2hNYXAoKTsKKwkJcHJpdmF0ZSBNYXA8SVJlc291cmNlLCBJUGF0aD4gd29ya2JlbmNoUmVzb3VyY2VzVG9QYXRocyA9IG5ldyBIYXNoTWFwPElSZXNvdXJjZSwgSVBhdGg+KCk7CiAKLQkJcHJpdmF0ZSBNYXAgcGF0aHNUb0Rpc2tGaWxlczsKKwkJcHJpdmF0ZSBNYXA8SVBhdGgsIGphdmEuaW8uRmlsZT4gcGF0aHNUb0Rpc2tGaWxlcyA9IG5ldyBIYXNoTWFwPElQYXRoLCBqYXZhLmlvLkZpbGU+KCk7CiAKIAkJcHJpdmF0ZSBNYXAgcGF0aHNUb1ppcEVudHJ5ID0gbmV3IEhhc2hNYXAoKTsKIAogCQlwdWJsaWMgdm9pZCByZW1vdmVJRmlsZShJRmlsZSBmaWxlKSB7Ci0JCQlJUGF0aCBwYXRoID0gKElQYXRoKSB3b3JrYmVuY2hSZXNvdXJjZXNUb1BhdGhzLmdldChmaWxlKTsKKwkJCUlQYXRoIHBhdGggPSB3b3JrYmVuY2hSZXNvdXJjZXNUb1BhdGhzLmdldChmaWxlKTsKIAkJCXJlbW92ZShwYXRoKTsKIAkJfQogCkBAIC0xMTIsOSArMTE1LDcgQEAKIAkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7CiAJCQkJd29ya2JlbmNoUmVzb3VyY2VzVG9QYXRocy5yZW1vdmUocmVzb3VyY2UpOwogCQkJfQotCQkJaWYgKHBhdGhzVG9EaXNrRmlsZXMgIT0gbnVsbCkgewotCQkJCXBhdGhzVG9EaXNrRmlsZXMucmVtb3ZlKHBhdGgpOwotCQkJfQorCQkJcGF0aHNUb0Rpc2tGaWxlcy5yZW1vdmUocGF0aCk7CiAJCX0KIAogCQlwdWJsaWMgdm9pZCBhZGRGaWxlKElBcmNoaXZlUmVzb3VyY2UgZmlsZSkgewpAQCAtMTI1LDkgKzEyNiw2IEBACiAJCXB1YmxpYyB2b2lkIGFkZEZpbGUoSUFyY2hpdmVSZXNvdXJjZSBmaWxlLCBqYXZhLmlvLkZpbGUgZXh0ZXJuYWxEaXNrRmlsZSkgewogCQkJSVBhdGggcGF0aCA9IGZpbGUuZ2V0UGF0aCgpOwogCQkJcGF0aHNUb0FyY2hpdmVSZXNvdXJjZXMucHV0KHBhdGgsIGZpbGUpOwotCQkJaWYgKG51bGwgPT0gcGF0aHNUb0Rpc2tGaWxlcykgewotCQkJCXBhdGhzVG9EaXNrRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJfQogCQkJcGF0aHNUb0Rpc2tGaWxlcy5wdXQocGF0aCwgZXh0ZXJuYWxEaXNrRmlsZSk7CiAJCX0KIApAQCAtMTQwLDEwICsxMzgsMTAgQEAKIAkJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElQYXRoIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKIAkJCWphdmEuaW8uRmlsZSBkaXNrRmlsZSA9IG51bGw7CiAKLQkJCWlmIChwYXRoc1RvRGlza0ZpbGVzICE9IG51bGwgJiYgcGF0aHNUb0Rpc2tGaWxlcy5jb250YWluc0tleShwYXRoKSkgewotCQkJCWRpc2tGaWxlID0gKGphdmEuaW8uRmlsZSkgcGF0aHNUb0Rpc2tGaWxlcy5nZXQocGF0aCk7Ci0JCQl9IGVsc2UgaWYgKHBhdGhzVG9Xb3JrYmVuY2hSZXNvdXJjZXMgIT0gbnVsbCAmJiBwYXRoc1RvV29ya2JlbmNoUmVzb3VyY2VzLmNvbnRhaW5zS2V5KHBhdGgpKSB7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgcGF0aHNUb1dvcmtiZW5jaFJlc291cmNlcy5nZXQocGF0aCk7CisJCQlpZiAocGF0aHNUb0Rpc2tGaWxlcy5jb250YWluc0tleShwYXRoKSkgeworCQkJCWRpc2tGaWxlID0gcGF0aHNUb0Rpc2tGaWxlcy5nZXQocGF0aCk7CisJCQl9IGVsc2UgaWYgKHBhdGhzVG9Xb3JrYmVuY2hSZXNvdXJjZXMuY29udGFpbnNLZXkocGF0aCkpIHsKKwkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwYXRoc1RvV29ya2JlbmNoUmVzb3VyY2VzLmdldChwYXRoKTsKIAkJCQlkaXNrRmlsZSA9IG5ldyBqYXZhLmlvLkZpbGUocmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwogCQkJfQogCQkJaWYgKGRpc2tGaWxlICE9IG51bGwpIHsKQEAgLTE2MCw5ICsxNTgsMTIgQEAKIAkJCQkJc291cmNlRmlsZVVyaSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKIAkJCQkJemlwRmlsZSA9IChaaXBGaWxlKSBmaWxlVVJJTWFwLmdldChzb3VyY2VGaWxlVXJpKTsKIAkJCQl9Ci0JCQkJWmlwRW50cnkgZW50cnkgPSB6aXBGaWxlLmdldEVudHJ5KHNvdXJjZUZpbGVVcmkpOwotCQkJCUlucHV0U3RyZWFtIGluID0gemlwRmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JCQkJcmV0dXJuIGluOworCQkJCWlmKHppcEZpbGUgIT0gbnVsbCl7CisJCQkJCVppcEVudHJ5IGVudHJ5ID0gemlwRmlsZS5nZXRFbnRyeShzb3VyY2VGaWxlVXJpKTsKKwkJCQkJSW5wdXRTdHJlYW0gaW4gPSB6aXBGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KTsKKwkJCQkJcmV0dXJuIGluOworCQkJCX0KKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKIAkJCX0gZWxzZSB7CiAJCQkJSUFyY2hpdmVSZXNvdXJjZSByZXMgPSBnZXRBcmNoaXZlUmVzb3VyY2UocGF0aCk7CiAJCQkJcmV0dXJuIENvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci50aGlzLmdldFN1cGVySW5wdXRTdHJlYW0ocmVzKTsKQEAgLTE3OCwyMiArMTc5LDIzIEBACiAJCX0KIAogCQlwdWJsaWMgSUFyY2hpdmVSZXNvdXJjZSBnZXRBcmNoaXZlUmVzb3VyY2UoSVBhdGggcGF0aCkgewotCQkJcmV0dXJuIChJQXJjaGl2ZVJlc291cmNlKSBwYXRoc1RvQXJjaGl2ZVJlc291cmNlcy5nZXQocGF0aCk7CisJCQlyZXR1cm4gcGF0aHNUb0FyY2hpdmVSZXNvdXJjZXMuZ2V0KHBhdGgpOwogCQl9CiAKIAkJcHVibGljIHZvaWQgYWRkRW50cnkoWmlwRW50cnkgZW50cnksIFppcEZpbGUgemlwRmlsZSwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJCWlmIChydW50aW1lUGF0aCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFydW50aW1lUGF0aC5lcXVhbHMoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlydW50aW1lUGF0aCA9IHJ1bnRpbWVQYXRoLmFwcGVuZChlbnRyeS5nZXROYW1lKCkpOworCQkJSVBhdGggaW5uZXJSdW50aW1lUGF0aCA9IHJ1bnRpbWVQYXRoOworCQkJaWYgKGlubmVyUnVudGltZVBhdGggIT0gbnVsbCkgeworCQkJCWlmICghaW5uZXJSdW50aW1lUGF0aC5lcXVhbHMoIi8iKSkgLy8kTk9OLU5MUy0xJAorCQkJCQlpbm5lclJ1bnRpbWVQYXRoID0gaW5uZXJSdW50aW1lUGF0aC5hcHBlbmQoZW50cnkuZ2V0TmFtZSgpKTsKIAkJCQllbHNlCi0JCQkJCXJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoZW50cnkuZ2V0TmFtZSgpKTsKKwkJCQkJaW5uZXJSdW50aW1lUGF0aCA9IG5ldyBQYXRoKGVudHJ5LmdldE5hbWUoKSk7CiAJCQl9IGVsc2UgewotCQkJCXJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoZW50cnkuZ2V0TmFtZSgpKTsKKwkJCQlpbm5lclJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoZW50cnkuZ2V0TmFtZSgpKTsKIAkJCX0KIAotCQkJSUFyY2hpdmVSZXNvdXJjZSBmaWxlID0gY3JlYXRlRmlsZShydW50aW1lUGF0aCk7CisJCQlJQXJjaGl2ZVJlc291cmNlIGZpbGUgPSBjcmVhdGVGaWxlKGlubmVyUnVudGltZVBhdGgpOwogCi0JCQlNYXAgZmlsZVVSSU1hcCA9IG5ldyBIYXNoTWFwKCk7CisJCQlNYXA8U3RyaW5nLCBaaXBGaWxlPiBmaWxlVVJJTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBaaXBGaWxlPigpOwogCQkJZmlsZVVSSU1hcC5wdXQoZW50cnkuZ2V0TmFtZSgpLCB6aXBGaWxlKTsKIAogCQkJcGF0aHNUb1ppcEVudHJ5LnB1dChmaWxlLmdldFBhdGgoKSwgZmlsZVVSSU1hcCk7CkBAIC0yMjYsMTEgKzIyOCwxMyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElBcmNoaXZlUmVzb3VyY2UgZ2V0QXJjaGl2ZVJlc291cmNlKElQYXRoIHJlc291cmNlUGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCWluaXRBcmNoaXZlUmVzb3VyY2UocmVzb3VyY2VQYXRoKTsKIAkJcmV0dXJuIGZpbGVzSG9sZGVyLmdldEFyY2hpdmVSZXNvdXJjZShyZXNvdXJjZVBhdGgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKElQYXRoIHBhdGgpIHsKIAkJaW5pdEFyY2hpdmVSZXNvdXJjZShwYXRoKTsKIAkJcmV0dXJuIGZpbGVzSG9sZGVyLmNvbnRhaW5zKHBhdGgpOwpAQCAtMjg0LDI2ICsyODgsNTQgQEAKIAkJCQl9CiAJCQkJaW5KYXZhU3JjID0gZmFsc2U7CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfQogCX0KIAkKIAlwcm90ZWN0ZWQgYm9vbGVhbiBhcmNoaXZlUmVzb3VyY2VzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBtZW1iZXJzT3B0aW1pemVkID0gZmFsc2U7CiAKIAlwcm90ZWN0ZWQgdm9pZCBpbml0QXJjaGl2ZVJlc291cmNlcygpIHsKIAkJaWYgKCFhcmNoaXZlUmVzb3VyY2VzSW5pdGlhbGl6ZWQpIHsKIAkJCWFyY2hpdmVSZXNvdXJjZXNJbml0aWFsaXplZCA9IHRydWU7Ci0JCQlhZ2dyZWdhdGVTb3VyY2VGaWxlcygpOwotCQkJYWdncmVnYXRlQ2xhc3NGaWxlcygpOworCQkJaWYgKHNob3VsZE9wdGltaXplKCkpIHsKKwkJCQlhdHRlbXB0T3B0aW1pemF0aW9uKCk7CisJCQl9CisJCQlpZiAoIW1lbWJlcnNPcHRpbWl6ZWQpIHsKKwkJCQlhZ2dyZWdhdGVTb3VyY2VGaWxlcygpOworCQkJCWFnZ3JlZ2F0ZUNsYXNzRmlsZXMoKTsKKwkJCX0KIAkJCWFkZFV0aWxpdGllcygpOwogCQl9CiAJfQogCisJcHJvdGVjdGVkIHZvaWQgYXR0ZW1wdE9wdGltaXphdGlvbigpIHsKKwkJU2luZ2xlUm9vdFV0aWwgdXRpbCA9IG5ldyBTaW5nbGVSb290VXRpbChnZXRDb21wb25lbnQoKSk7CisJCUlDb250YWluZXIgcm9vdENvbnRhaW5lciA9IHV0aWwuZ2V0U2luZ2xlUm9vdCgpOworCQlpZiAocm9vdENvbnRhaW5lciAhPSBudWxsKSB7CisJCQl0cnkgeworCQkJCW1lbWJlcnNPcHRpbWl6ZWQgPSB0cnVlOworCQkJCW9wdGltaXplTWVtYmVycyhQYXRoLkVNUFRZLCByb290Q29udGFpbmVyKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQl9CisJCX0KKwl9CisKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdDxJQXJjaGl2ZVJlc291cmNlPiBnZXRBcmNoaXZlUmVzb3VyY2VzKCkgewogCQlpbml0QXJjaGl2ZVJlc291cmNlcygpOwogCQlyZXR1cm4gZmlsZXNIb2xkZXIuZ2V0RmlsZXMoKTsKIAl9CisJCisJcHVibGljIElSZXNvdXJjZSBnZXRXb3JrYmVuY2hSZXNvdXJjZXMoSVBhdGggcGF0aCkgeworCQlyZXR1cm4gZmlsZXNIb2xkZXIucGF0aHNUb1dvcmtiZW5jaFJlc291cmNlcy5nZXQocGF0aCk7CisJfQorCQorCXB1YmxpYyBGaWxlIGdldEV4dGVybmFsRmlsZXMoSVBhdGggcGF0aCkgeworCQlyZXR1cm4gZmlsZXNIb2xkZXIucGF0aHNUb0Rpc2tGaWxlcy5nZXQocGF0aCk7CisJfQogCiAJLyoqCiAJICogQWRkcyBsaWJyYXJ5IGNwIGVudHJpZXMgdGhhdCBwb2ludCB0byBjbGFzcyBmb2xkZXJzIGFuZCBoYXZlIGJlZW4gdGFnZ2VkIHdpdGggdGhlIHB1Ymxpc2gvZXhwb3J0IGF0dHJpYnV0ZS4KQEAgLTMxOCwxOSArMzUwLDIwIEBACiAJCQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IGNwUmVmc1tqXTsKIAkJCQkJZmluYWwgSVBhdGggcnVudGltZVBhdGggPSByZWYuZ2V0UnVudGltZVBhdGgoKTsKIAkJCQkJLy8gb25seSBwcm9jZXNzIG1hcHBpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBydW50aW1lIHBhdGgKLQkJCQkJaWYgKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudAotCQkJCQkJCSYmIHJ1bnRpbWVQYXRoLmVxdWFscyh0YXJnZXRSdW50aW1lUGF0aCkpIHsKLQkJCQkJCWZpbmFsIENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSAoQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQpIHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJCQlpZiAoY29tcC5pc0NsYXNzRm9sZGVyKCkpIHsKLQkJCQkJCQlmaW5hbCBJQ29udGFpbmVyIGNsYXNzRm9sZGVyID0gY29tcC5nZXRDbGFzc0ZvbGRlcigpOwotCQkJCQkJCWlmIChjbGFzc0ZvbGRlciAhPSBudWxsICYmIGNsYXNzRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCQkJCWFnZ3JlZ2F0ZU91dHB1dEZpbGVzKG5ldyBJUmVzb3VyY2VbXXtjbGFzc0ZvbGRlcn0sIHJ1bnRpbWVQYXRoLm1ha2VSZWxhdGl2ZSgpLCBjbGFzc0ZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCkpOworCQkJCQlpZiAocmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50KSB7CisJCQkJCQlpZiAocnVudGltZVBhdGguZXF1YWxzKHRhcmdldFJ1bnRpbWVQYXRoKSB8fCBydW50aW1lUGF0aC5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuV0VCX0lORl9DTEFTU0VTX1BBVEgpKSB7CisJCQkJCQkJZmluYWwgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCkgcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKKwkJCQkJCQlpZiAoY29tcC5pc0NsYXNzRm9sZGVyKCkpIHsKKwkJCQkJCQkJZmluYWwgSUNvbnRhaW5lciBjbGFzc0ZvbGRlciA9IGNvbXAuZ2V0Q2xhc3NGb2xkZXIoKTsKKwkJCQkJCQkJaWYgKGNsYXNzRm9sZGVyICE9IG51bGwgJiYgY2xhc3NGb2xkZXIuZXhpc3RzKCkpIHsKKwkJCQkJCQkJCWFnZ3JlZ2F0ZU91dHB1dEZpbGVzKG5ldyBJUmVzb3VyY2VbXXtjbGFzc0ZvbGRlcn0sIHJ1bnRpbWVQYXRoLm1ha2VSZWxhdGl2ZSgpLCBjbGFzc0ZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCkpOworCQkJCQkJCQl9CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQl9CiAJCX0KIAl9CkBAIC0zNTcsNyArMzkwLDcgQEAKIAkJCUlWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwogCiAJCQlpZiAocmVmZXJlbmNlZENvbXBvbmVudC5pc0JpbmFyeSgpICYmIHJlZmVyZW5jZS5nZXREZXBlbmRlbmN5VHlwZSgpID09IERlcGVuZGVuY3lUeXBlLkNPTlNVTUVTKSB7Ci0JCQkJamF2YS5pby5GaWxlIGRpc2tGaWxlID0gKChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgcmVmZXJlbmNlZENvbXBvbmVudCkuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7CisJCQkJamF2YS5pby5GaWxlIGRpc2tGaWxlID0gKGphdmEuaW8uRmlsZSkgcmVmZXJlbmNlZENvbXBvbmVudC5nZXRBZGFwdGVyKGphdmEuaW8uRmlsZS5jbGFzcyk7CiAJCQkJWmlwRmlsZSB6aXBGaWxlOwogCQkJCUlQYXRoIHBhdGggPSByZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKTsKIAkJCQl0cnkgewpAQCAtMzY5LDkgKzQwMiw5IEBACiAJCQkJCQlmaWxlc0hvbGRlci5hZGRFbnRyeShlbnRyeSwgemlwRmlsZSwgcGF0aCk7CiAJCQkJCX0KIAkJCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0zOTEsNyArNDI0LDcgQEAKIAkJCWluSmF2YVNyYyA9IGZhbHNlOwogCQkJYWdncmVnYXRlRmlsZXMobWVtYmVycyk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCX0KIApAQCAtNDMwLDcgKzQ2Myw3IEBACiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJCX0KIAkJCQkJaWYgKG51bGwgPT0gcnVudGltZVBhdGgpIHsKIAkJCQkJCXJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCkBAIC00NDAsNyArNDczLDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfSBmaW5hbGx5IHsKIAkJCWlmIChzZSAhPSBudWxsKSB7CiAJCQkJc2UuZGlzcG9zZSgpOwpAQCAtNDc2LDcgKzUwOSw3IEBACiAJCQkJCQljb250aW51ZTsKIAkJCQkJY0ZpbGUgPSBjcmVhdGVEaXJlY3RvcnkocnVudGltZVBhdGgpOwogCQkJCQljRmlsZS5zZXRMYXN0TW9kaWZpZWQoZ2V0TGFzdE1vZGlmaWVkKHJlc291cmNlc1tpXSkpOwotCQkJCQlmaWxlc0hvbGRlci5hZGRGaWxlKGNGaWxlKTsKKwkJCQkJZmlsZXNIb2xkZXIuYWRkRmlsZShjRmlsZSwgcmVzb3VyY2VzW2ldKTsKIAkJCQkJZmlsZUFkZGVkID0gdHJ1ZTsKIAkJCQl9CiAJCQl9CkBAIC00OTAsNiArNTIzLDcgQEAKIAkgKi8KIAlwcml2YXRlIGJvb2xlYW4gaW5KYXZhU3JjID0gZmFsc2U7CiAKKwogCXByb3RlY3RlZCBib29sZWFuIGFnZ3JlZ2F0ZUZpbGVzKElWaXJ0dWFsUmVzb3VyY2VbXSB2aXJ0dWFsUmVzb3VyY2VzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCWJvb2xlYW4gZmlsZUFkZGVkID0gZmFsc2U7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlydHVhbFJlc291cmNlcy5sZW5ndGg7IGkrKykgewpAQCAtNTMxLDYgKzU2NSw3IEBACiAJCX0KIAkJcmV0dXJuIGZpbGVBZGRlZDsKIAl9CisKIAkKIAlwcm90ZWN0ZWQgSUFyY2hpdmVSZXNvdXJjZSBhZ2dyZWdhdGVSZXNvdXJjZShJVmlydHVhbFJlc291cmNlIHZpcnR1YWxSZXNvdXJjZSwgSVBhdGggcnVudGltZVBhdGgsIGJvb2xlYW4gaW5KYXZhU3JjLCBpbnQgYXJjaGl2ZVJlc291cmNlVHlwZSl7CiAJCWlmICghc2hvdWxkSW5jbHVkZShydW50aW1lUGF0aCkpewpAQCAtNTYyLDYgKzU5Nyw3IEBACiAJCXJldHVybiBjRmlsZTsKIAl9CiAKKwkKIAkvKioKIAkgKiBEZXRlcm1pbmVzIGlmIHRoZSBzcGVjaWZpZWQgSVZpcnR1YWxSZXNvdXJjZSBtYXBzIHRvIGEgSVJlc291cmNlIHRoYXQgaXMKIAkgKiBjb250YWluZWQgd2l0aGluIGEgSmF2YSBzcmMgcm9vdC4KQEAgLTYwMCw2ICs2MzYsMzYgQEAKIAlwcm90ZWN0ZWQgbG9uZyBnZXRMYXN0TW9kaWZpZWQoSVJlc291cmNlIGFSZXNvdXJjZSkgewogCQlyZXR1cm4gYVJlc291cmNlLmdldExvY2F0aW9uKCkudG9GaWxlKCkubGFzdE1vZGlmaWVkKCk7CiAJfQorCQorCXByb3RlY3RlZCB2b2lkIG9wdGltaXplTWVtYmVycyhJUGF0aCBwYXRoLCBJQ29udGFpbmVyIGNvbnRhaW5lcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJUmVzb3VyY2VbXSByZXNvdXJjZXM7CisJCXJlc291cmNlcyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7CisJCWlmIChyZXNvdXJjZXMgIT0gbnVsbCkgeworCQkJaW50IHNpemUgPSByZXNvdXJjZXMubGVuZ3RoOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07CisJCQkJSUFyY2hpdmVSZXNvdXJjZSBjRmlsZSA9IG51bGw7CisJCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKKwkJCQkJSVBhdGggZGVwbG95UGF0aCA9IHBhdGguYXBwZW5kKHJlc291cmNlLmdldE5hbWUoKSk7CisJCQkJCWlmIChmaWxlc0hvbGRlci5jb250YWlucyhkZXBsb3lQYXRoKSkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgeworCQkJCQkJSUNvbnRhaW5lciBjb250YWluZXIyID0gKElDb250YWluZXIpIHJlc291cmNlOworCQkJCQkJY0ZpbGUgPSBjcmVhdGVEaXJlY3RvcnkoZGVwbG95UGF0aCk7CisJCQkJCQlvcHRpbWl6ZU1lbWJlcnMoZGVwbG95UGF0aCwgY29udGFpbmVyMik7CisKKwkJCQkJfSBlbHNlIGlmICgocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKGlzRXhwb3J0U291cmNlKCkgfHwgIWlzU291cmNlKGRlcGxveVBhdGgpKSkgeworCQkJCQkJY0ZpbGUgPSBjcmVhdGVGaWxlKGRlcGxveVBhdGgpOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChjRmlsZSAhPSBudWxsKSB7CisJCQkJCWNGaWxlLnNldExhc3RNb2RpZmllZChnZXRMYXN0TW9kaWZpZWQocmVzb3VyY2UpKTsKKwkJCQkJZmlsZXNIb2xkZXIuYWRkRmlsZShjRmlsZSwgcmVzb3VyY2UpOworCQkJCX0KKwkJCX0KKwkJfQorCX0gCiAKIAlwdWJsaWMgdm9pZCBzZXRFeHBvcnRTb3VyY2UoYm9vbGVhbiBuZXdFeHBvcnRTb3VyY2UpIHsKIAkJZXhwb3J0U291cmNlID0gbmV3RXhwb3J0U291cmNlOwpAQCAtNjA5LDYgKzY3NSwyMyBAQAogCQlyZXR1cm4gZXhwb3J0U291cmNlOwogCX0KIAorCXB1YmxpYyB2b2lkIHNldE9wdGltaXplKGJvb2xlYW4gb3B0aW1pemUpIHsKKwkJb3B0aW1pemVNZW1iZXJzID0gb3B0aW1pemU7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHNob3VsZE9wdGltaXplKCkgeworCQlyZXR1cm4gb3B0aW1pemVNZW1iZXJzOworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBzaG91bGRVcGRhdGVNYW5pZmVzdChJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSkgeworCQlJUGF0aCBwYXRoID0gYXJjaGl2ZVJlc291cmNlLmdldFBhdGgoKTsKKwkJaWYgKGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzICYmIHBhdGguZXF1YWxzKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSkgJiYgIWphdmFDbGFzc3BhdGhVUklzLmlzRW1wdHkoKSAmJiBtYW5pZmVzdEZpbGUgIT0gbnVsbAorCQkJCSYmIG1hbmlmZXN0RmlsZS5nZXRVbmRlcmx5aW5nRmlsZSgpICE9IG51bGwgJiYgbWFuaWZlc3RGaWxlLmdldFVuZGVybHlpbmdGaWxlKCkuZXhpc3RzKCkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCiAJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZShJQ29udGFpbmVyIGFDb250YWluZXIpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQpAQCAtNjI5LDcgKzcxMiw3IEBACiAJCX0KIAkJcmV0dXJuIGlzRXhwb3J0U291cmNlKCkgfHwgIWlzU291cmNlKHBhdGgpOwogCX0KLQorCQogCS8vIFRPRE8gYWRkIGEgbWVjaGFuaXNtIGZvciBpZ25vcmluZyBzcGVjaWZpYyBmaWxlIHR5cGVzCiAJcHJvdGVjdGVkIGJvb2xlYW4gaXNTb3VyY2UoSVBhdGggcGF0aCkgewogCQlpZiAocGF0aCA9PSBudWxsKQpAQCAtNjQ0LDcgKzcyNyw3IEBACiAKIAlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZ2V0U3VwZXJJbnB1dFN0cmVhbShJQXJjaGl2ZVJlc291cmNlIGFyY2hpdmVSZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogCQlpZiAoYXJjaGl2ZVJlc291cmNlLmdldFR5cGUoKSA9PSBJQXJjaGl2ZS5BUkNISVZFX1RZUEUpIHsKLQkJCUlBcmNoaXZlTG9hZEFkYXB0ZXIgbmVzdGVkTG9hZEFkYXB0ZXIgPSAoSUFyY2hpdmVMb2FkQWRhcHRlcikoKElBcmNoaXZlKWFyY2hpdmVSZXNvdXJjZSkuZ2V0TG9hZEFkYXB0ZXIoKTsKKwkJCUlBcmNoaXZlTG9hZEFkYXB0ZXIgbmVzdGVkTG9hZEFkYXB0ZXIgPSAoKElBcmNoaXZlKWFyY2hpdmVSZXNvdXJjZSkuZ2V0TG9hZEFkYXB0ZXIoKTsKIAkJCWlmKG5lc3RlZExvYWRBZGFwdGVyIGluc3RhbmNlb2YgQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKXsKIAkJCQkoKENvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlciluZXN0ZWRMb2FkQWRhcHRlcikuc2V0RXhwb3J0U291cmNlKGlzRXhwb3J0U291cmNlKCkpOwogCQkJfQpAQCAtNjUzLDIxICs3MzYsMjAgQEAKIAkJcmV0dXJuIHN1cGVyLmdldElucHV0U3RyZWFtKGFyY2hpdmVSZXNvdXJjZSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElBcmNoaXZlUmVzb3VyY2UgYXJjaGl2ZVJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUlQYXRoIHBhdGggPSBhcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpOwogCQkvLyBJZiB0aGUgTUFOSUZFU1QuTUYgb2YgYSBtb2R1bGUgY29tcG9uZW50IGlzIGJlaW5nIHJlcXVlc3RlZCBhbmQgdGhhdAogCQkvLyBtb2R1bGUgY29tcG9uZW50IHJlZmVyZW5jZXMKIAkJLy8gSmF2YSBidWlsZCBwYXRoLWJhc2VkIGNvbXBvbmVudHMsIG5lZWQgdG8gZHluYW1pY2FsbHkgdXBkYXRlIHRoZQogCQkvLyBtYW5pZmVzdCBjbGFzc3BhdGggdG8gcmVmbGVjdCB0aGUgcmVzb2x2ZWQKIAkJLy8gY29udHJpYnV0aW9ucyBmcm9tIHRoZSBidWlsZCBwYXRoCi0JCWlmIChpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyAmJiBwYXRoLmVxdWFscyhKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkgJiYgIWphdmFDbGFzc3BhdGhVUklzLmlzRW1wdHkoKSAmJiBtYW5pZmVzdEZpbGUgIT0gbnVsbCAmJiBtYW5pZmVzdEZpbGUuZ2V0VW5kZXJseWluZ0ZpbGUoKSAhPSBudWxsCi0JCQkJJiYgbWFuaWZlc3RGaWxlLmdldFVuZGVybHlpbmdGaWxlKCkuZXhpc3RzKCkpIHsKKwkJaWYgKHNob3VsZFVwZGF0ZU1hbmlmZXN0KGFyY2hpdmVSZXNvdXJjZSkpIHsKIAkJCS8vIHVwZGF0ZSB0aGUgbWFuaWZlc3QgY2xhc3NwYXRoIGZvciB0aGUgY29tcG9uZW50CiAJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAkJCUNsYXNzcGF0aERlcGVuZGVuY3lNYW5pZmVzdFV0aWwudXBkYXRlTWFuaWZlc3RDbGFzc3BhdGgobWFuaWZlc3RGaWxlLmdldFVuZGVybHlpbmdGaWxlKCksIGphdmFDbGFzc3BhdGhVUklzLCBiYW9zKTsKIAkJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKIAkJfQotCisJCUlQYXRoIHBhdGggPSBhcmNoaXZlUmVzb3VyY2UuZ2V0UGF0aCgpOwogCQlpZiAoZmlsZXNIb2xkZXIuY29udGFpbnMocGF0aCkpIHsKIAkJCXJldHVybiBmaWxlc0hvbGRlci5nZXRJbnB1dFN0cmVhbShwYXRoKTsKIAkJfQpAQCAtNjkzLDM1ICs3NzUsNDEgQEAKIAkJaWYgKGVtZkhlbHBlciA9PSBudWxsKSB7CiAJCQllbWZIZWxwZXIgPSBuZXcgSmF2YUVFRU1GQXJjaGl2ZUFkYXB0ZXJIZWxwZXIoZ2V0QXJjaGl2ZSgpKTsKIAkJCWVtZkhlbHBlci5zZXRBcmNoaXZlVVJJQ29udmVydGVyKG5ldyBBcmNoaXZlVVJJQ29udmVydGVyKGVtZkhlbHBlci5nZXRBcmNoaXZlKCkpIHsKKwkJCQlAT3ZlcnJpZGUKIAkJCQlwcm90ZWN0ZWQgVVJJIGNvbnZlcnRQYXRoVG9VUkkoSVBhdGggbW9kZWxPYmplY3RQYXRoKSB7CiAJCQkJCS8vIFRPRE8gZmluZCBhIGJldHRlciB3YXkgdG8gZ2V0cGxhdGZvcm1VUkkKIAkJCQkJSVBhdGggcGF0aCA9IGdldENvbXBvbmVudCgpLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG1vZGVsT2JqZWN0UGF0aCkuZ2V0VW5kZXJseWluZ0ZpbGUoKS5nZXRGdWxsUGF0aCgpOwotCQkJCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSSgicGxhdGZvcm06L3Jlc291cmNlLyIgKyBwYXRoLnRvU3RyaW5nKCkpOworCQkJCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSSgicGxhdGZvcm06L3Jlc291cmNlLyIgKyBwYXRoLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCiAJCQkJfQogCQkJfSk7CiAJCX0KIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBjb250YWluc01vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgewogCQlpbml0RU1GSGVscGVyKCk7Ci0JCWlmIChJQXJjaGl2ZS5FTVBUWV9NT0RFTF9QQVRIID09IG1vZGVsT2JqZWN0UGF0aCkgewotCQkJbW9kZWxPYmplY3RQYXRoID0gZ2V0RGVmYXVsdE1vZGVsT2JqZWN0UGF0aCgpOworCQlJUGF0aCBpbm5lck1vZGVsT2JqZWN0UGF0aCA9IG1vZGVsT2JqZWN0UGF0aDsKKwkJaWYgKElBcmNoaXZlLkVNUFRZX01PREVMX1BBVEggPT0gaW5uZXJNb2RlbE9iamVjdFBhdGgpIHsKKwkJCWlubmVyTW9kZWxPYmplY3RQYXRoID0gZ2V0RGVmYXVsdE1vZGVsT2JqZWN0UGF0aCgpOwogCQl9Ci0JCXJldHVybiBlbWZIZWxwZXIuY29udGFpbnNNb2RlbE9iamVjdChtb2RlbE9iamVjdFBhdGgpOworCQlyZXR1cm4gZW1mSGVscGVyLmNvbnRhaW5zTW9kZWxPYmplY3QoaW5uZXJNb2RlbE9iamVjdFBhdGgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoSVBhdGggbW9kZWxPYmplY3RQYXRoKSB0aHJvd3MgQXJjaGl2ZU1vZGVsTG9hZEV4Y2VwdGlvbiB7CiAJCWluaXRFTUZIZWxwZXIoKTsKLQkJaWYgKElBcmNoaXZlLkVNUFRZX01PREVMX1BBVEggPT0gbW9kZWxPYmplY3RQYXRoKSB7Ci0JCQltb2RlbE9iamVjdFBhdGggPSBnZXREZWZhdWx0TW9kZWxPYmplY3RQYXRoKCk7CisJCUlQYXRoIGlubmVyTW9kZWxPYmplY3RQYXRoID0gbW9kZWxPYmplY3RQYXRoOworCQlpZiAoSUFyY2hpdmUuRU1QVFlfTU9ERUxfUEFUSCA9PSBpbm5lck1vZGVsT2JqZWN0UGF0aCkgeworCQkJaW5uZXJNb2RlbE9iamVjdFBhdGggPSBnZXREZWZhdWx0TW9kZWxPYmplY3RQYXRoKCk7CiAJCX0KLQkJcmV0dXJuIGVtZkhlbHBlci5nZXRNb2RlbE9iamVjdChtb2RlbE9iamVjdFBhdGgpOworCQlyZXR1cm4gZW1mSGVscGVyLmdldE1vZGVsT2JqZWN0KGlubmVyTW9kZWxPYmplY3RQYXRoKTsKIAl9CiAKIAlwcm90ZWN0ZWQgSVBhdGggZ2V0RGVmYXVsdE1vZGVsT2JqZWN0UGF0aCgpIHsKIAkJcmV0dXJuIG5ldyBQYXRoKCIvIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpbnQgcGFja2FnZUxlbmd0aCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLmxlbmd0aCgpICsgMTsKIAkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKS5zdWJzdHJpbmcocGFja2FnZUxlbmd0aCkpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YQppbmRleCA2MzBlNmQ2Li5kNzAxNmNiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcjsKQEAgLTQ3LDcgKzQ4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLkRvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIAogLy8gaGFyaTogbWFrZSBhYnN0cmFjdAogcHVibGljIGNsYXNzIENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlciBleHRlbmRzIEFic3RyYWN0QXJjaGl2ZVNhdmVBZGFwdGVyIHsKQEAgLTEwNiwxMiArMTA3LDEzIEBACiAJCXJldHVybiBudWxsOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IFNVUEVSX1RJQ0tTID0gMTAwMDsKIAkJZmluYWwgaW50IExPQ0FMX1RJQ0tTID0gMTA7CiAJCWZpbmFsIGludCBUT1RBTF9USUNLUyA9IFNVUEVSX1RJQ0tTICsgTE9DQUxfVElDS1M7CiAJCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiSW1wb3J0aW5nICIgKyB2Q29tcG9uZW50LmdldE5hbWUoKSwgVE9UQUxfVElDS1MpOworCQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoQXJjaGl2ZU1lc3NhZ2VzLkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcl9JbXBvcnRpbmdfMF8sIHZDb21wb25lbnQuZ2V0TmFtZSgpKSwgVE9UQUxfVElDS1MpOwogCQkJc3VwZXIuc2F2ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIFNVUEVSX1RJQ0tTKSk7CiAJCQlsaW5rQXJjaGl2ZUNvbXBvbmVudHMoKTsKIAkJCW1vbml0b3Iud29ya2VkKExPQ0FMX1RJQ0tTKTsKQEAgLTEyMCw2ICsxMjIsNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2F2ZShJQXJjaGl2ZVJlc291cmNlIGFGaWxlKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKIAogCQl0cnkgewpAQCAtMjA1LDcgKzIwOCw3IEBACiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBzYXZlQXNBcmNoaXZlQ29tcG9uZW50KElBcmNoaXZlIGFyY2hpdmUsIElQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGgsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgaUZpbGUgPSBzYXZlVG9PdXRwdXRQYXRoSUZpbGUocHJvamVjdFJlbGF0aXZlUGF0aCwgaW4pOworCQlJRmlsZSBpRmlsZSA9IHNhdmVUb091dHB1dFBhdGgocHJvamVjdFJlbGF0aXZlUGF0aCwgaW4pOwogCQkvLyBUT0RPIGludmVzdGlnYXRlIHJlbW92aW5nIHRoaXMgYmxvY2sgYW5kIHJlbGF0ZWQgdmFyaWFibGVzIGFuZAogCQkvLyBsaW5rQXJjaGl2ZUNvbXBvbmVudHMoKTsgc2VlIGJ1Z3ppbGxhIDE1OTE2MAogCQlpZiAoc2hvdWxkTGlua0FzQ29tcG9uZW50UmVmKGFyY2hpdmUpKSB7CkBAIC0yMzQsOCArMjM3LDcgQEAKIAkJCXRyeSB7CiAJCQkJY3JlYXRlUmVmZXJlbmNlc0RhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKIAkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfQogCX0KQEAgLTI0OCwxNSArMjUwLDcgQEAKIAkgKiBAcGFyYW0gaW4KIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVUb091dHB1dFBhdGgoSVBhdGggcHJvamVjdFJlbGF0aXZlUGF0aCwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBFeGNlcHRpb24gewotCQlzYXZlVG9PdXRwdXRQYXRoSUZpbGUocHJvamVjdFJlbGF0aXZlUGF0aCwgaW4pOwotCX0KLQotCS8qKgotCSAqIFRPRE8gcmVmYWN0b3IgY2hhbmdlIHRoZSBtZXRob2QgYWJvdmUgdG8gcmV0dXJuIElGaWxlCi0JICoge0BsaW5rIERvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNX0KLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbGUgc2F2ZVRvT3V0cHV0UGF0aElGaWxlKElQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGgsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgSUZpbGUgc2F2ZVRvT3V0cHV0UGF0aChJUGF0aCBwcm9qZWN0UmVsYXRpdmVQYXRoLCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlGaWxlIGlGaWxlID0gdkNvbXBvbmVudC5nZXRQcm9qZWN0KCkuZ2V0RmlsZShwcm9qZWN0UmVsYXRpdmVQYXRoKTsKIAkJc2F2ZVRvSUZpbGUoaUZpbGUsIGluKTsKIAkJcmV0dXJuIGlGaWxlOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvQ29ubmVjdG9yQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db25uZWN0b3JDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQppbmRleCBiMTI4ZTA4Li5mNzc1ZThmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db25uZWN0b3JDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db25uZWN0b3JDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQpAQCAtMzMsOCArMzMsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU9wdGlvbnM7CkBAIC01NCw3ICs1NSw3IEBACiAKIAlwcml2YXRlIElGaWxlIGtub3duREQ7CiAKLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGtub3duTGliRXh0ZW5zaW9ucyA9IHsgIi5qYXIiLCAvLyROT04tTkxTLTEkCisJcHVibGljIHN0YXRpYyBTdHJpbmdbXSBrbm93bkxpYkV4dGVuc2lvbnMgPSB7IElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQsCiAJCQkiLnppcCIsIC8vJE5PTi1OTFMtMSQKIAkJCSIuc28iLCAvLyROT04tTkxTLTEkCiAJCQkiLm8iLCAvLyROT04tTkxTLTEkCkBAIC03MSw5ICs3MiwxNSBAQAogCQlrbm93bkREID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkpLmdldFVuZGVybHlpbmdGaWxlKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0QXJjaGl2ZVJlc291cmNlcygpIHsKLQkJYWRkTmVzdGVkSkFSc0Zyb21Tb3VyY2VSb290cygpOwotCQlhZ2dyZWdhdGVTb3VyY2VGaWxlcygpOworCQlpZiAoc2hvdWxkT3B0aW1pemUoKSkgeworCQkJYXR0ZW1wdE9wdGltaXphdGlvbigpOworCQl9CisJCWlmICghbWVtYmVyc09wdGltaXplZCkgeworCQkJYWRkTmVzdGVkSkFSc0Zyb21Tb3VyY2VSb290cygpOworCQkJYWdncmVnYXRlU291cmNlRmlsZXMoKTsKKwkJfQogCQlyZXR1cm4gZmlsZXNIb2xkZXIuZ2V0RmlsZXMoKTsKIAl9CiAKQEAgLTg3LDkgKzk0LDkgQEAKIAkJCQkJZmlsZXNIb2xkZXIuYWRkRmlsZShhRmlsZSk7CiAJCQkJfQogCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0gY2F0Y2ggKEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQl9CiAJCX0KIAl9CkBAIC0xMDQsNyArMTExLDcgQEAKIAkJCQkJb3V0cHV0UGF0aCA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7CiAJCQkJfQogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQl9CiAJCQlpZiAob3V0cHV0UGF0aCA9PSBudWxsKSB7CiAJCQkJcmV0dXJuIG51bGw7CkBAIC0xMjIsNyArMTI5LDcgQEAKIAkJaWYgKCFpc01vZHVsZVJvb3QgfHwgZm91bmRKYXZhKSB7CiAJCQlMaXN0IDxJRmlsZT4gaUZpbGVzTGlzdCA9IENvbGxlY3Rpb25zLmxpc3QoQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oaUZpbGVzU2V0KSk7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGlGaWxlc0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlmaWxlc0hvbGRlci5yZW1vdmVJRmlsZSgoSUZpbGUpIGlGaWxlc0xpc3QuZ2V0KGkpKTsKKwkJCQlmaWxlc0hvbGRlci5yZW1vdmVJRmlsZShpRmlsZXNMaXN0LmdldChpKSk7CiAJCQl9CiAJCQlJQXJjaGl2ZVJlc291cmNlIG5lc3RlZEFyY2hpdmUgPSBjcmVhdGVOZXN0ZWRBcmNoaXZlKGlGaWxlc0xpc3QsIHNvdXJjZUNvbnRhaW5lciwgamF2YU91dHB1dEZvbGRlcik7CiAJCQlyZXR1cm4gbmVzdGVkQXJjaGl2ZTsKQEAgLTE0MSw0NiArMTQ4LDQ5IEBACiAJCQogCQlJQ29udGFpbmVyIGRkRm9sZGVyID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0Rm9sZGVyKEoyRUVDb25zdGFudHMuTUVUQV9JTkYpLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKIAotCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlSZXNvdXJjZSByZXMgPSBtZW1iZXJzW2ldOwotCQkJaWYgKHJlcy5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkJCWlmICghZGRGb2xkZXIuZXF1YWxzKHJlcykpIHsvL2lmIGl0J3Mgbm90IHRoZSBkZCBmb2xkZXIKLQkJCQkJZm91bmRKYXZhID0gZ2F0aGVyRmlsZXNGb3JKQVIoaUZpbGVzLCAoSUZvbGRlcikgcmVzLCBpc01vZHVsZVJvb3QsIGZvdW5kSmF2YSwgc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50KSB8fCBmb3VuZEphdmE7Ci0JCQkJfQotCQkJfSBlbHNlIHsvLyBpdCBtdXN0IGJlIGEgZmlsZQotCQkJCUlGaWxlIHNyY0ZpbGUgPSAoSUZpbGUpIHJlczsKLQkJCQlpZiAoYmVsb25nc0luTmVzdGVkSkFSKHNyY0ZpbGUsIGlzTW9kdWxlUm9vdCkpIHsKLQkJCQkJaWYgKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuaXNKYXZhKHNyY0ZpbGUpKSB7Ci0JCQkJCQlpZiAoZXhwb3J0U291cmNlKSB7Ci0JCQkJCQkJaUZpbGVzLmFkZChzcmNGaWxlKTsgLy8gZG9uJ3QgbmVlZCB0byBjaGVjawotCQkJCQkJCS8vIGR1cGxpY2F0ZXMgaGVyZQotCQkJCQkJfQotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHNyY0ZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoc291cmNlQ29udGFpbmVyU2VnbWVudENvdW50KS50b1N0cmluZygpOwotCQkJCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWUubGVuZ3RoKCkgLSBkb3RKYXZhTGVuZ3RoKTsKLQkJCQkJCUxpc3QgY2xhc3NlcyA9IHJldHJpZXZlQ2xhc3NlcyhjbGFzc05hbWUpOwotCQkJCQkJaWYgKG51bGwgIT0gY2xhc3NlcykgewotCQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY2xhc3Nlcy5pdGVyYXRvcigpOwotCQkJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJSUZpbGUgY2xhenogPSAoSUZpbGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKCFpRmlsZXMuY29udGFpbnMoY2xhenopKSB7Ci0JCQkJCQkJCQkvLyAuY2xhc3MgbmVlZCB0byBjaGVjayBmb3IgZHVwbGljYXRlcwotCQkJCQkJCQkJaUZpbGVzLmFkZChjbGF6eik7CisJCWJvb2xlYW4gbG9jYWxGb3VuZEphdmEgPSBmb3VuZEphdmE7CisJCWlmKG1lbWJlcnMgIT0gbnVsbCl7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IG1lbWJlcnMubGVuZ3RoOyBpKyspIHsKKwkJCQlJUmVzb3VyY2UgcmVzID0gbWVtYmVyc1tpXTsKKwkJCQlpZiAocmVzLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKSB7CisJCQkJCWlmICghZGRGb2xkZXIuZXF1YWxzKHJlcykpIHsvL2lmIGl0J3Mgbm90IHRoZSBkZCBmb2xkZXIKKwkJCQkJCWxvY2FsRm91bmRKYXZhID0gZ2F0aGVyRmlsZXNGb3JKQVIoaUZpbGVzLCAoSUZvbGRlcikgcmVzLCBpc01vZHVsZVJvb3QsIGxvY2FsRm91bmRKYXZhLCBzb3VyY2VDb250YWluZXJTZWdtZW50Q291bnQpIHx8IGxvY2FsRm91bmRKYXZhOworCQkJCQl9CisJCQkJfSBlbHNlIHsvLyBpdCBtdXN0IGJlIGEgZmlsZQorCQkJCQlJRmlsZSBzcmNGaWxlID0gKElGaWxlKSByZXM7CisJCQkJCWlmIChiZWxvbmdzSW5OZXN0ZWRKQVIoc3JjRmlsZSwgaXNNb2R1bGVSb290KSkgeworCQkJCQkJaWYgKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuaXNKYXZhKHNyY0ZpbGUpKSB7CisJCQkJCQkJaWYgKGV4cG9ydFNvdXJjZSkgeworCQkJCQkJCQlpRmlsZXMuYWRkKHNyY0ZpbGUpOyAvLyBkb24ndCBuZWVkIHRvIGNoZWNrCisJCQkJCQkJCS8vIGR1cGxpY2F0ZXMgaGVyZQorCQkJCQkJCX0KKwkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gc3JjRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhzb3VyY2VDb250YWluZXJTZWdtZW50Q291bnQpLnRvU3RyaW5nKCk7CisJCQkJCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWUubGVuZ3RoKCkgLSBkb3RKYXZhTGVuZ3RoKTsKKwkJCQkJCQlMaXN0IGNsYXNzZXMgPSByZXRyaWV2ZUNsYXNzZXMoY2xhc3NOYW1lKTsKKwkJCQkJCQlpZiAobnVsbCAhPSBjbGFzc2VzKSB7CisJCQkJCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gY2xhc3Nlcy5pdGVyYXRvcigpOworCQkJCQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQkJCQkJCQlJRmlsZSBjbGF6eiA9IChJRmlsZSkgaXRlcmF0b3IubmV4dCgpOworCQkJCQkJCQkJaWYgKCFpRmlsZXMuY29udGFpbnMoY2xhenopKSB7CisJCQkJCQkJCQkJLy8gLmNsYXNzIG5lZWQgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKKwkJCQkJCQkJCQlpRmlsZXMuYWRkKGNsYXp6KTsKKwkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKCFpRmlsZXMuY29udGFpbnMoc3JjRmlsZSkpIHsKKwkJCQkJCQkJLy8gaWYgaXQncyBub3Qgc3JjLCB0aGVuIGl0IGNvdWxkIGJlIC5jbGFzcyBhbmQgbmVlZAorCQkJCQkJCQkvLyB0byBjaGVjayBmb3IgZHVwbGljYXRlcworCQkJCQkJCQlpRmlsZXMuYWRkKHNyY0ZpbGUpOworCQkJCQkJCX0KIAkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICghaUZpbGVzLmNvbnRhaW5zKHNyY0ZpbGUpKSB7Ci0JCQkJCQkJLy8gaWYgaXQncyBub3Qgc3JjLCB0aGVuIGl0IGNvdWxkIGJlIC5jbGFzcyBhbmQgbmVlZAotCQkJCQkJCS8vIHRvIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCQkJCQkJaUZpbGVzLmFkZChzcmNGaWxlKTsKLQkJCQkJCX0KKwkJCQkJCWlmIChpc01vZHVsZVJvb3QpCisJCQkJCQkJbG9jYWxGb3VuZEphdmEgPSBsb2NhbEZvdW5kSmF2YSB8fCBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmlzSmF2YShzcmNGaWxlKSB8fCBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmlzQ2xhc3Moc3JjRmlsZSk7CiAJCQkJCX0KLQkJCQkJaWYgKGlzTW9kdWxlUm9vdCkKLQkJCQkJCWZvdW5kSmF2YSA9IGZvdW5kSmF2YSB8fCBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmlzSmF2YShzcmNGaWxlKSB8fCBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmlzQ2xhc3Moc3JjRmlsZSk7CiAJCQkJfQogCQkJfQogCQl9Ci0JCXJldHVybiBmb3VuZEphdmE7CisJCXJldHVybiBsb2NhbEZvdW5kSmF2YTsKIAl9CiAKIAlwcml2YXRlIElBcmNoaXZlIGNyZWF0ZU5lc3RlZEFyY2hpdmUoTGlzdCA8SUZpbGU+IGZpbGVzLCBJQ29udGFpbmVyIHNvdXJjZUNvbnRhaW5lciwgSUZvbGRlciBqYXZhT3V0cHV0Rm9sZGVyKSB0aHJvd3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKQEAgLTIwMyw3ICsyMTMsNyBAQAogCQkJc2IuYXBwZW5kKG5hbWUpOwogCQkJaWYgKGluY3JlbWVudCA+IDApCiAJCQkJc2IuYXBwZW5kKGluY3JlbWVudCk7Ci0JCQlzYi5hcHBlbmQoIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAorCQkJc2IuYXBwZW5kKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQpOwogCQkJaW5jcmVtZW50Kys7CiAJCX0gd2hpbGUgKGZpbGVzSG9sZGVyLmNvbnRhaW5zKG5ldyBQYXRoKHNiLnRvU3RyaW5nKCkpKSk7CiAJCXJldHVybiBzYi50b1N0cmluZygpOwpAQCAtMjIwLDYgKzIzMCw3IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEluY2x1ZGUoSVBhdGggcGF0aCkgewogCQlTdHJpbmcgbGFzdFNlZ21lbnQgPSBwYXRoLmxhc3RTZWdtZW50KCk7CiAJCXJldHVybiBudWxsICE9IGxhc3RTZWdtZW50ICYmICFKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmhhc0V4dGVuc2lvbihsYXN0U2VnbWVudCwgSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5ET1RfQ0xBU1MpICYmICFKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmhhc0V4dGVuc2lvbihsYXN0U2VnbWVudCwgSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5ET1RfSkFWQSk7CkBAIC0yNDksNyArMjYwLDcgQEAKIAkJCQkJaW5kZXhDbGFzc2VzKG1lbWJlcnNbaV0sIGphdmFPdXRwdXRTZWdtZW50Q291bnQpOwogCQkJCX0KIAkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KQEAgLTI5MSw2ICszMDIsNyBAQAogCQlyZXR1cm4gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZShJVmlydHVhbENvbnRhaW5lciB2Q29udGFpbmVyKSB7CiAJCWJvb2xlYW4gaXNEREZvbGRlciA9IHZDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcihKMkVFQ29uc3RhbnRzLk1FVEFfSU5GKS5lcXVhbHModkNvbnRhaW5lcik7CiAJCXJldHVybiBpc0RERm9sZGVyIHx8ICFpbkphdmFTcmModkNvbnRhaW5lcik7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9Db25uZWN0b3JDb21wb25lbnROZXN0ZWRKQVJBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0Nvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCmluZGV4IDA4MTIzMDQuLjAzNWE1YmEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0Nvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0Nvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFic3RyYWN0QXJjaGl2ZUxvYWRBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CiAKIHB1YmxpYyBjbGFzcyBDb25uZWN0b3JDb21wb25lbnROZXN0ZWRKQVJBcmNoaXZlTG9hZEFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdEFyY2hpdmVMb2FkQWRhcHRlciB7CiAKQEAgLTU2LDYgKzU3LDcgQEAKIAkJb3V0cHV0U2VnbWVudENvdW50ID0gamF2YU91dHB1dEZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJaW50IHBhY2thZ2VMZW5ndGggPSB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKS5sZW5ndGgoKSArIDE7CiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuc3Vic3RyaW5nKHBhY2thZ2VMZW5ndGgpKTsKQEAgLTY4LDYgKzcwLDcgQEAKIAogCXByaXZhdGUgTGlzdDxJQXJjaGl2ZVJlc291cmNlPiBmdWxsSW5kZXggPSBudWxsOwogCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0QXJjaGl2ZVJlc291cmNlcygpIHsKIAkJaWYgKCFpbmRleGVkKSB7CiAJCQlpbmRleGVkID0gdHJ1ZTsKQEAgLTExNCw2ICsxMTcsNyBAQAogCQlyZXR1cm4gZmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cyhwYXJlbnRTZWdtZW50Q291bnQpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKElQYXRoIHJlc291cmNlUGF0aCkgewogCQlpZiAoIWluZGV4ZWQpIHsKIAkJCWdldEFyY2hpdmVSZXNvdXJjZXMoKTsKQEAgLTEyMSw2ICsxMjUsNyBAQAogCQlyZXR1cm4gcGF0aHNUb0lBcmNoaXZlUmVzb3VyY2VzLmNvbnRhaW5zS2V5KHJlc291cmNlUGF0aCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElBcmNoaXZlUmVzb3VyY2UgZ2V0QXJjaGl2ZVJlc291cmNlKElQYXRoIHJlc291cmNlUGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCWlmICghaW5kZXhlZCkgewogCQkJZ2V0QXJjaGl2ZVJlc291cmNlcygpOwpAQCAtMTI4LDIyICsxMzMsMjUgQEAKIAkJcmV0dXJuIHBhdGhzVG9JQXJjaGl2ZVJlc291cmNlcy5nZXQocmVzb3VyY2VQYXRoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSUFyY2hpdmVSZXNvdXJjZSBhcmNoaXZlUmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKIAkJSUZpbGUgZmlsZSA9IHBhdGhzVG9JRmlsZXMuZ2V0KGFyY2hpdmVSZXNvdXJjZS5nZXRQYXRoKCkpOwogCQlpZiAoZmlsZSAhPSBudWxsKSB7CiAJCQl0cnkgewogCQkJCXJldHVybiBmaWxlLmdldENvbnRlbnRzKCk7CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNvcmUpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBnZXQgY29udGVudHMgZnJvbSAiICsgZmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkgKyAiIG1lc3NhZ2UgIiArIGNvcmUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTkxTLmJpbmQoQXJjaGl2ZU1lc3NhZ2VzLkNvbm5lY3RvckNvbXBvbmVudE5lc3RlZEpBUkFyY2hpdmVMb2FkQWRhcHRlcl9VbmFibGVfdG9fZ2V0X2NvbnRlbnRzX2Zyb21fMF9tZXNfLCBuZXcgT2JqZWN0W10geyBmaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSwgY29yZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgfSkpOwogCQkJfQogCQl9CiAJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oYXJjaGl2ZVJlc291cmNlLmdldFBhdGgoKS50b1N0cmluZygpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBjb250YWluc01vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpIHRocm93cyBBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG51bGw7IC8vIG5vIG1vZGVsIG9iamVjdHMgaGVyZQogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0VBUkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvRUFSQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEKaW5kZXggZGVkNDQxMy4uNjNiZWNkNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvRUFSQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvRUFSQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEKQEAgLTIxLDEzICsyMSwxMSBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLklDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLklDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKQEAgLTM1LDcgKzMzLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuQXJjaGl2ZVV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51dGlsLmludGVybmFsLkphdmFFRVF1aWNrUGVlazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKIApAQCAtNTIsNiArNDksNyBAQAogCQlzdXBlcih2Q29tcG9uZW50LCBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0QXJjaGl2ZVJlc291cmNlcygpIHsKIAkJYWdncmVnYXRlU291cmNlRmlsZXMoKTsKIAkJYWRkTW9kdWxlc0FuZFV0aWxpdGllcygpOwpAQCAtNjQsNiArNjIsNyBAQAogCQlyZXR1cm4gZmlsZXM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElBcmNoaXZlUmVzb3VyY2UgYXJjaGl2ZVJlc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCWlmIChiaW5hcnlSZXNvdXJjZXNUb0Rpc2tGaWxlcy5jb250YWluc0tleShhcmNoaXZlUmVzb3VyY2UpKSB7CiAJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSBiaW5hcnlSZXNvdXJjZXNUb0Rpc2tGaWxlcy5nZXQoYXJjaGl2ZVJlc291cmNlKTsKQEAgLTgwLDY3ICs3OSw3NCBAQAogCQkJaWYodkNvbXBvbmVudC5lcXVhbHMocmVmZXJlbmNlZENvbXBvbmVudCkpewogCQkJCWNvbnRpbnVlOwogCQkJfQorCQkJSUFyY2hpdmVSZXNvdXJjZSBuZXN0ZWRNb2R1bGVSZXNvdXJjZSA9IG51bGw7CisJCQlJQXJjaGl2ZSBuZXN0ZWRNb2R1bGVBcmNoaXZlID0gbnVsbDsKKwkJCUFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiBjYXVnaHRFeGNlcHRpb24gPSBudWxsOwogCQkJdHJ5IHsKLQkJCQlJQXJjaGl2ZSBuZXN0ZWRNb2R1bGVBcmNoaXZlID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5vcGVuQXJjaGl2ZShyZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCQlTdHJpbmcgc1BhdGggPSByZWZlcmVuY2UuZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJCQlTdHJpbmcgc3J0cCA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKHNydHAuc3RhcnRzV2l0aCgiIiArIElQYXRoLlNFUEFSQVRPUikpIHNydHAgPSBzcnRwLnN1YnN0cmluZygxKTsKLQkJCQlTdHJpbmcgc3B0ID0gc3J0cCArIElQYXRoLlNFUEFSQVRPUiArIHNQYXRoOwotCQkJCWlmIChzcHQuc3RhcnRzV2l0aCgiIiArIElQYXRoLlNFUEFSQVRPUikpIHNwdCA9IHNwdC5zdWJzdHJpbmcoMSk7Ci0JCQkJbmVzdGVkTW9kdWxlQXJjaGl2ZS5zZXRQYXRoKG5ldyBQYXRoKHNwdCkpOwotCQkJCW5lc3RlZE1vZHVsZUFyY2hpdmUuc2V0QXJjaGl2ZShhcmNoaXZlKTsKLQkJCQlmaWxlc0hvbGRlci5hZGRGaWxlKG5lc3RlZE1vZHVsZUFyY2hpdmUpOwotCi0JCQkJaWYgKHJlZmVyZW5jZWRDb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSBudWxsOwotCQkJCQlkaXNrRmlsZSA9ICgoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHJlZmVyZW5jZWRDb21wb25lbnQpLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQkJCQlpZiAoIWRpc2tGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlJRmlsZSB3YkZpbGUgPSAoKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRVbmRlcmx5aW5nV29ya2JlbmNoRmlsZSgpOwotCQkJCQkJZGlza0ZpbGUgPSBuZXcgRmlsZSh3YkZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJCWJpbmFyeVJlc291cmNlc1RvRGlza0ZpbGVzLnB1dChuZXN0ZWRNb2R1bGVBcmNoaXZlLCBkaXNrRmlsZSk7CisJCQkJbmVzdGVkTW9kdWxlUmVzb3VyY2UgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLm9wZW5BcmNoaXZlKHJlZmVyZW5jZWRDb21wb25lbnQpOworCQkJfSBjYXRjaCAoQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKKwkJCQljYXVnaHRFeGNlcHRpb24gPSBlOworCQkJfSAKKwkJCVN0cmluZyBzUGF0aCA9IG5ldyBQYXRoKHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpKS5sYXN0U2VnbWVudCgpOworCQkJU3RyaW5nIHNydHAgPSByZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpOworCQkJaWYgKHNydHAuc3RhcnRzV2l0aCgiIiArIElQYXRoLlNFUEFSQVRPUikpIHNydHAgPSBzcnRwLnN1YnN0cmluZygxKTsgLy8kTk9OLU5MUy0xJAorCQkJU3RyaW5nIHNwdCA9IHNydHAgKyBJUGF0aC5TRVBBUkFUT1IgKyBzUGF0aDsKKwkJCWlmIChzcHQuc3RhcnRzV2l0aCgiIiArIElQYXRoLlNFUEFSQVRPUikpIHNwdCA9IHNwdC5zdWJzdHJpbmcoMSk7IC8vJE5PTi1OTFMtMSQKKwkJCWlmKG5lc3RlZE1vZHVsZVJlc291cmNlID09IG51bGwpeworCQkJCWlmKHJlZmVyZW5jZWRDb21wb25lbnQuaXNCaW5hcnkoKSl7CisJCQkJCW5lc3RlZE1vZHVsZVJlc291cmNlID0gY3JlYXRlRmlsZShuZXcgUGF0aChzcHQpKTsKIAkJCQl9IGVsc2UgewotCQkJCQkvLyBCdWcgMjIwOTEyIC0gc2V0ICJleHBvcnQgc291cmNlIiBmbGFnIGJlZm9yZSBjYWxsaW5nIEphdmFFRVF1aWNrUGVlawotCQkJCQlpZiAobmVzdGVkTW9kdWxlQXJjaGl2ZS5nZXRUeXBlKCkgPT0gSUFyY2hpdmUuQVJDSElWRV9UWVBFKSB7Ci0JCQkJCQlJQXJjaGl2ZUxvYWRBZGFwdGVyIG5lc3RlZExvYWRBZGFwdGVyID0gKElBcmNoaXZlTG9hZEFkYXB0ZXIpKChJQXJjaGl2ZSluZXN0ZWRNb2R1bGVBcmNoaXZlKS5nZXRMb2FkQWRhcHRlcigpOwotCQkJCQkJaWYobmVzdGVkTG9hZEFkYXB0ZXIgaW5zdGFuY2VvZiBDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIpewotCQkJCQkJCSgoQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKW5lc3RlZExvYWRBZGFwdGVyKS5zZXRFeHBvcnRTb3VyY2UoaXNFeHBvcnRTb3VyY2UoKSk7Ci0JCQkJCQl9CisJCQkJCUFyY2hpdmVVdGlsLndhcm4oY2F1Z2h0RXhjZXB0aW9uKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbmVzdGVkTW9kdWxlQXJjaGl2ZSA9IChJQXJjaGl2ZSluZXN0ZWRNb2R1bGVSZXNvdXJjZTsKKwkJCQluZXN0ZWRNb2R1bGVSZXNvdXJjZS5zZXRQYXRoKG5ldyBQYXRoKHNwdCkpOworCQkJCW5lc3RlZE1vZHVsZVJlc291cmNlLnNldEFyY2hpdmUoYXJjaGl2ZSk7CisJCQkJZmlsZXNIb2xkZXIuYWRkRmlsZShuZXN0ZWRNb2R1bGVSZXNvdXJjZSk7CisJCQl9CisJCQkKKwkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCkpIHsKKwkJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSAoamF2YS5pby5GaWxlKXJlZmVyZW5jZWRDb21wb25lbnQuZ2V0QWRhcHRlcihqYXZhLmlvLkZpbGUuY2xhc3MpOworCQkJCWJpbmFyeVJlc291cmNlc1RvRGlza0ZpbGVzLnB1dChuZXN0ZWRNb2R1bGVSZXNvdXJjZSwgZGlza0ZpbGUpOworCQkJfSBlbHNlIGlmKG51bGwgIT0gbmVzdGVkTW9kdWxlQXJjaGl2ZSl7CisJCQkJLy8gQnVnIDIyMDkxMiAtIHNldCAiZXhwb3J0IHNvdXJjZSIgZmxhZyBiZWZvcmUgY2FsbGluZyBKYXZhRUVRdWlja1BlZWsKKwkJCQlpZiAobmVzdGVkTW9kdWxlUmVzb3VyY2UuZ2V0VHlwZSgpID09IElBcmNoaXZlLkFSQ0hJVkVfVFlQRSkgeworCQkJCQlJQXJjaGl2ZUxvYWRBZGFwdGVyIG5lc3RlZExvYWRBZGFwdGVyID0gbmVzdGVkTW9kdWxlQXJjaGl2ZS5nZXRMb2FkQWRhcHRlcigpOworCQkJCQlpZihuZXN0ZWRMb2FkQWRhcHRlciBpbnN0YW5jZW9mIENvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcil7CisJCQkJCQkoKENvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlciluZXN0ZWRMb2FkQWRhcHRlcikuc2V0RXhwb3J0U291cmNlKGlzRXhwb3J0U291cmNlKCkpOwogCQkJCQl9Ci0JCQkJCQotCQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5nZXRKYXZhRUVRdWlja1BlZWsobmVzdGVkTW9kdWxlQXJjaGl2ZSk7Ci0JCQkJCXN3aXRjaCAocXVpY2tQZWVrLmdldFR5cGUoKSkgeworCQkJCX0KKwkJCQlib29sZWFuIGFkZENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyA9IGZhbHNlOworCQkJCUphdmFFRVF1aWNrUGVlayBxdWlja1BlZWsgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmdldEphdmFFRVF1aWNrUGVlayhuZXN0ZWRNb2R1bGVBcmNoaXZlKTsKKwkJCQlzd2l0Y2ggKHF1aWNrUGVlay5nZXRUeXBlKCkpIHsKIAkJCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuQ09OTkVDVE9SX1RZUEU6CiAJCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkVKQl9UWVBFOgogCQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5XRUJfVFlQRToKLQkJCQkJCSgoQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKSBuZXN0ZWRNb2R1bGVBcmNoaXZlLmdldExvYWRBZGFwdGVyKCkpLnNldEluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKLQkJCQkJCWFkZENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyhyZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCQkJfQotCisJCQkJCQlhZGRDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmNpZXMgPSB0cnVlOworCQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5VTktOT1dOOgorCQkJCQkJaWYgKG5lc3RlZE1vZHVsZUFyY2hpdmUuZ2V0TG9hZEFkYXB0ZXIoKSBpbnN0YW5jZW9mIEphdmFDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIpIHsKKwkJCQkJCQlhZGRDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmNpZXMgPSB0cnVlOworCQkJCQkJfQogCQkJCX0KLQkJCX0gY2F0Y2ggKEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXJjaGl2ZVV0aWwud2FybihlKTsKKwkJCQlpZiAoYWRkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzKSB7CQorCQkJCQkoKENvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcikgbmVzdGVkTW9kdWxlQXJjaGl2ZS5nZXRMb2FkQWRhcHRlcigpKS5zZXRJbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyhpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyk7CisJCQkJCWFkZENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyhyZWZlcmVuY2VkQ29tcG9uZW50KTsKKwkJCQl9CiAJCQl9CiAJCX0KIAl9CiAKIAlwcml2YXRlIHZvaWQgYWRkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzKGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQpIHsKIAkJLy8gcmV0cmlldmUgYWxsIEphdmEgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMKLQkJaWYgKGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzICYmIHJlZmVyZW5jZWRDb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBjcFJlZnMgPSAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOworCQlpZiAoaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMgJiYgcmVmZXJlbmNlZENvbXBvbmVudCBpbnN0YW5jZW9mIElDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXIpIHsKKwkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gY3BSZWZzID0gKChJQ2xhc3NwYXRoRGVwZW5kZW5jeVByb3ZpZGVyKSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOwogCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjcFJlZnMubGVuZ3RoOyBqKyspIHsKIAkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBjcFJlZnNbal07CiAJCQkJLy8gb25seSAuLi8gcnVudGltZSBwYXRocyBjb250cmlidXRlIHRvIHRoZSBFQVIKIAkJCQlpZiAocmVmLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUl9QQVRIKSkgewotCQkJCQlpZiAocmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQkJCQlmaW5hbCBDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCBjb21wID0gKENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50KSByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCQkJRmlsZSBjcEVudHJ5RmlsZSA9IGNvbXAuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7Ci0JCQkJCQlpZiAoIWNwRW50cnlGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJZmluYWwgSUZpbGUgd2JGaWxlID0gY29tcC5nZXRVbmRlcmx5aW5nV29ya2JlbmNoRmlsZSgpOwotCQkJCQkJCWNwRW50cnlGaWxlID0gbmV3IEZpbGUod2JGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJCQkJCX0KLQkJCQkJCWFkZEV4dGVybmFsRmlsZShuZXcgUGF0aChyZWYuZ2V0QXJjaGl2ZU5hbWUoKSksIGNwRW50cnlGaWxlKTsKLQkJCQkJfQorCQkJCQlGaWxlIGNwRW50cnlGaWxlID0gKEZpbGUpcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOworCQkJCQlhZGRFeHRlcm5hbEZpbGUobmV3IFBhdGgocmVmLmdldEFyY2hpdmVOYW1lKCkpLCBjcEVudHJ5RmlsZSk7CiAJCQkJfQogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9FSkJDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0VKQkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCmluZGV4IDllZWYxNzguLjMwMzg4MGEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0VKQkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0VKQkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiAJCXN1cGVyKHZDb21wb25lbnQsIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgSVBhdGggZ2V0RGVmYXVsdE1vZGVsT2JqZWN0UGF0aCgpIHsKIAkJcmV0dXJuIG5ldyBQYXRoKEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSSk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSjJFRUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSjJFRUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCmluZGV4IGY3Y2Q1ZDMuLjgyNGI2NGUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0oyRUVDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KMkVFQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIAkJc3VwZXIoY29tcG9uZW50LCBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IDxJQXJjaGl2ZVJlc291cmNlPiBnZXRBcmNoaXZlUmVzb3VyY2VzKCkgewogCQlzdXBlci5nZXRBcmNoaXZlUmVzb3VyY2VzKCk7CiAJCWlmIChpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSjJFRUNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSjJFRUNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCmluZGV4IDk1YjEyYjUuLmE2M2IyMDEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0oyRUVDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KMkVFQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyLmphdmEKQEAgLTIyLDEwICsyMiwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIAogaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwpAQCAtNDIsNiArNDMsNyBAQAogCQlzdXBlcih2Q29tcG9uZW50KTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIGludCBTVVBFUl9USUNLUyA9IDEwMDA7CiAJCWZpbmFsIGludCBMT0NBTF9USUNLUyA9IDEwOwpAQCAtNDksMTQgKzUxLDE0IEBACiAJCWZpbmFsIGludCBUT1RBTF9USUNLUyA9IFNVUEVSX1RJQ0tTICsgTE9DQUxfVElDS1MgKyBSRUZSRVNIX1RJQ0tTOwogCiAJCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiSW1wb3J0aW5nICIgKyB2Q29tcG9uZW50LmdldE5hbWUoKSwgVE9UQUxfVElDS1MpOworCQkJbW9uaXRvci5iZWdpblRhc2soTkxTLmJpbmQoQXJjaGl2ZU1lc3NhZ2VzLkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcl9JbXBvcnRpbmdfMF8sIHZDb21wb25lbnQuZ2V0TmFtZSgpKSwgVE9UQUxfVElDS1MpOwogCQkJc3VwZXIuc2F2ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIFNVUEVSX1RJQ0tTKSk7CiAJCQlsaW5rSW1wb3J0ZWRDbGFzc2VzRm9sZGVySWZOZWNlc3NhcnkoKTsKIAkJCW1vbml0b3Iud29ya2VkKExPQ0FMX1RJQ0tTKTsKIAkJCXRyeSB7CiAJCQkJdkNvbXBvbmVudC5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBSRUZSRVNIX1RJQ0tTKSk7CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGV4KTsKIAkJCX0KIAkJfSBmaW5hbGx5IHsKIAkJCW1vbml0b3IuZG9uZSgpOwpAQCAtNzAsNiArNzIsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkU2F2ZShJQXJjaGl2ZVJlc291cmNlIGFGaWxlKSB7CiAJCWlmIChlbmRzV2l0aENsYXNzVHlwZShhRmlsZS5nZXRQYXRoKCkubGFzdFNlZ21lbnQoKSkpIHsKIAkJCWJvb2xlYW4gc2hvdWxkU2F2ZSA9IGlzQ2xhc3NXaXRob3V0U291cmNlKGFGaWxlKTsKQEAgLTg3LDggKzkwLDggQEAKIAkgKiB2RmlsZSA9IHJvb3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpOyBJRmlsZQogCSAqIGlGaWxlID0gdkZpbGUuZ2V0VW5kZXJseWluZ0ZpbGUoKTsgdmFsaWRhdGVFZGl0KGlGaWxlKTsgT3V0cHV0U3RyZWFtIG91dCA9CiAJICogbmV3IFdvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbShpRmlsZSk7IHRyeSB7IGFNYW5pZmVzdC53cml0ZShvdXQpOyB9Ci0JICogY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOyB9IGZpbmFsbHkgeyB0cnkgewotCSAqIG91dC5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsgfSB9IH0KKwkgKiBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyBKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOyB9IGZpbmFsbHkgeyB0cnkgeworCSAqIG91dC5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7IEoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7IH0gfSB9CiAJICovCiAJcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0ZWRDbGFzc2VzRm9sZGVyQ3JlYXRlZCA9IGZhbHNlOwogCkBAIC0xMDEsNyArMTA0LDcgQEAKIAkJdHJ5IHsKIAkJCWltcG9ydGVkQ2xhc3Nlc0ZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlMSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUxKTsKIAkJfQogCX0KIApAQCAtMTIwLDcgKzEyMyw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfQogCX0KQEAgLTEzMCw3ICsxMzMsNyBAQAogCX0KIAogCXByb3RlY3RlZCBJUGF0aCBnZXRJbXBvcnRlZENsYXNzZXNSdW50aW1lUGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBQYXRoKCIvIik7CisJCXJldHVybiBuZXcgUGF0aCgiLyIpOyAvLyROT04tTkxTLTEkCiAJfQogCQogCUBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSmF2YUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSmF2YUNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlci5qYXZhCmluZGV4IDRhZWIwM2QuLmRkMGFiMWIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0phdmFDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KYXZhQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIAkJc3VwZXIodkNvbXBvbmVudCwgaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCA8SUFyY2hpdmVSZXNvdXJjZT4gZ2V0QXJjaGl2ZVJlc291cmNlcygpIHsKIAkJc3VwZXIuZ2V0QXJjaGl2ZVJlc291cmNlcygpOwogCQlpZiAoaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0phdmFFRUFyY2hpdmVVdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0phdmFFRUFyY2hpdmVVdGlsaXRpZXMuamF2YQppbmRleCA2MDhiN2JiLi45Yjc5YzA1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CkBAIC0zNCwxNyArMzUsMTYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuSmF2YUVFQmluYXJ5Q29tcG9uZW50TG9hZEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5FYXJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5XZWJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUxvYWRBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlRmFjdG9yeUltcGw7CkBAIC01MywxMCArNTMsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuWmlwRmlsZUFyY2hpdmVMb2FkQWRhcHRlckltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51dGlsLmludGVybmFsLkphdmFFRVF1aWNrUGVlazsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKIAotcHVibGljIGNsYXNzIEphdmFFRUFyY2hpdmVVdGlsaXRpZXMgZXh0ZW5kcyBBcmNoaXZlRmFjdG9yeUltcGwgaW1wbGVtZW50cyBJQXJjaGl2ZUZhY3RvcnkgeworcHVibGljIGNsYXNzIEphdmFFRUFyY2hpdmVVdGlsaXRpZXMgZXh0ZW5kcyBBcmNoaXZlRmFjdG9yeUltcGwgewogCiAJLyoqCiAJICogRGVmYXVsdCB2YWx1ZSA9IEJvb2xlYW4uVFJVRSBWYWxpZCB2YWx1ZXMgPSBCb29sZWFuLlRSVUUgb3IgQm9vbGVhbi5GQUxTRQpAQCAtMTA0LDYgKzEwOCwxNCBAQAogCSAqIHN3YXBwZWQgb3V0IHdpdGggYW4ge0BsaW5rICNKYXZhRUVXcmFwcGluZ0xvYWRBZGFwdGVyfS4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUEVEX0xPQURfQURBUFRFUiA9ICJXUkFQUEVEX0xPQURfQURBUFRFUiI7IC8vJE5PTi1OTFMtMSQKKwkKKwkvKioKKwkgKiBEZWZhdWx0IHZhbHVlID0gbnVsbAorCSAqIAorCSAqIEFuIEFyY2hpdmVPcHRpb24gdXNlZCB0byBzcGVjaWZ5IHRoZSBJUnVudGltZSBvZiB0aGUgRUFSIHRoYXQgdGhlIGFyY2hpdmUKKwkgKiBpcyBsaW5rZWQgdG8uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX1JVTlRJTUUgPSAiUEFSRU5UX1JVTlRJTUUiOyAvLyROT04tTkxTLTEkCiAKIAlwcml2YXRlIEphdmFFRUFyY2hpdmVVdGlsaXRpZXMoKSB7CiAJfQpAQCAtMTM4LDIyICsxNTAsMjIgQEAKIAkJfQogCQlpbnQgdHlwZSA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV047CiAJCUlBcmNoaXZlTG9hZEFkYXB0ZXIgYXJjaGl2ZUxvYWRBZGFwdGVyID0gbnVsbDsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdCh2aXJ0dWFsQ29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKKwkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHZpcnR1YWxDb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewogCQkJYXJjaGl2ZUxvYWRBZGFwdGVyID0gbmV3IEVBUkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcih2aXJ0dWFsQ29tcG9uZW50KTsKIAkJCXR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9UWVBFOwotCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCQ29tcG9uZW50KHZpcnR1YWxDb21wb25lbnQpKSB7CisJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQkNvbXBvbmVudCh2aXJ0dWFsQ29tcG9uZW50KSkgewogCQkJYXJjaGl2ZUxvYWRBZGFwdGVyID0gbmV3IEVKQkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcih2aXJ0dWFsQ29tcG9uZW50KTsKIAkJCXR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfVFlQRTsKLQkJfSBlbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50Q29tcG9uZW50KHZpcnR1YWxDb21wb25lbnQpKSB7CisJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50Q29tcG9uZW50KHZpcnR1YWxDb21wb25lbnQpKSB7CiAJCQlhcmNoaXZlTG9hZEFkYXB0ZXIgPSBuZXcgQXBwQ2xpZW50Q29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKHZpcnR1YWxDb21wb25lbnQpOwogCQkJdHlwZSA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFOwotCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBQ29tcG9uZW50KHZpcnR1YWxDb21wb25lbnQpKSB7CisJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0pDQUNvbXBvbmVudCh2aXJ0dWFsQ29tcG9uZW50KSkgewogCQkJYXJjaGl2ZUxvYWRBZGFwdGVyID0gbmV3IENvbm5lY3RvckNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcih2aXJ0dWFsQ29tcG9uZW50KTsKIAkJCXR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5DT05ORUNUT1JfVFlQRTsKLQkJfSBlbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQodmlydHVhbENvbXBvbmVudCkpIHsKKwkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYkNvbXBvbmVudCh2aXJ0dWFsQ29tcG9uZW50KSkgewogCQkJYXJjaGl2ZUxvYWRBZGFwdGVyID0gbmV3IFdlYkNvbXBvbmVudEFyY2hpdmVMb2FkQWRhcHRlcih2aXJ0dWFsQ29tcG9uZW50KTsKIAkJCXR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRTsKLQkJfSBlbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KHZpcnR1YWxDb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgeworCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdCh2aXJ0dWFsQ29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKIAkJCWFyY2hpdmVMb2FkQWRhcHRlciA9IG5ldyBKYXZhQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKHZpcnR1YWxDb21wb25lbnQpOwogCQl9CiAKQEAgLTE3OCw2ICsxOTAsOCBAQAogCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwogCQkJCQl9IGVsc2UgaWYgKHZlcnNpb25TdHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQpKSB7CiAJCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKKwkJCQkJfSBlbHNlIGlmICh2ZXJzaW9uU3RyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzZfMF9URVhUKSkgeworCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5DT05ORUNUT1JfVFlQRToKQEAgLTE4NSw2ICsxOTksOCBAQAogCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ7CiAJCQkJCX0gZWxzZSBpZiAodmVyc2lvblN0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzVfVEVYVCkpIHsKIAkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOworCQkJCQl9IGVsc2UgaWYgKHZlcnNpb25TdHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV82X1RFWFQpKSB7CisJCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfNl9JRDsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl9UWVBFOgpAQCAtMTk2LDYgKzIxMiw4IEBACiAJCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKIAkJCQkJfSBlbHNlIGlmICh2ZXJzaW9uU3RyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMF9URVhUKSkgewogCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8zXzBfSUQ7CisJCQkJCX0gZWxzZSBpZiAodmVyc2lvblN0ci5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzFfVEVYVCkpIHsKKwkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18xX0lEOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCX1RZUEU6CkBAIC0yMDcsNiArMjI1LDggQEAKIAkJCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEOwogCQkJCQl9IGVsc2UgaWYgKHZlcnNpb25TdHIuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl81X1RFWFQpKSB7CiAJCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNV9JRDsKKwkJCQkJfSBlbHNlIGlmICh2ZXJzaW9uU3RyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMF9URVhUKSkgeworCQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8zXzBfSUQ7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtMjIwLDggKzI0MCw3IEBACiAJfQogCiAJcHVibGljIElBcmNoaXZlIG9wZW5CaW5hcnlBcmNoaXZlKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQsIGJvb2xlYW4gZGVzY3JpbWluYXRlTWFpbkNsYXNzKSB0aHJvd3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGFyY2hpdmVDb21wb25lbnQgPSAoSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB2aXJ0dWFsQ29tcG9uZW50OwotCQlKYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlciBsb2FkQWRhcHRlciA9IG5ldyBKYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlcihhcmNoaXZlQ29tcG9uZW50KTsKKwkJSmF2YUVFQmluYXJ5Q29tcG9uZW50TG9hZEFkYXB0ZXIgbG9hZEFkYXB0ZXIgPSBuZXcgSmF2YUVFQmluYXJ5Q29tcG9uZW50TG9hZEFkYXB0ZXIoKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB2aXJ0dWFsQ29tcG9uZW50KTsKIAkJQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKIAkJYXJjaGl2ZU9wdGlvbnMuc2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLkxPQURfQURBUFRFUiwgbG9hZEFkYXB0ZXIpOwogCQlhcmNoaXZlT3B0aW9ucy5zZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuQVJDSElWRV9QQVRILCBsb2FkQWRhcHRlci5nZXRBcmNoaXZlUGF0aCgpKTsKQEAgLTIzMCwxMyArMjQ5LDE1IEBACiAJCQlhcmNoaXZlT3B0aW9ucy5zZXRPcHRpb24oSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5ESVNDUklNSU5BVEVfSkFWQV9FRSwgQm9vbGVhbi5UUlVFKTsKIAkJfQogCQlJQXJjaGl2ZSBwYXJlbnRFQVJBcmNoaXZlID0gbnVsbDsKKwkJYm9vbGVhbiBmb3VuZFBhcmVudEFyY2hpdmUgPSBmYWxzZTsKIAkJdHJ5IHsKLQkJCWlmKGFyY2hpdmVDb21wb25lbnQuaXNMaW5rZWRUb0VBUigpKXsKKwkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLnVzZXNKYXZhRUVDb21wb25lbnQodmlydHVhbENvbXBvbmVudCkKKwkJCQkJJiYgKChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHZpcnR1YWxDb21wb25lbnQpLmlzTGlua2VkVG9FQVIoKSkgewogCQkJCXRyeSB7CiAJCQkJCUlQcm9qZWN0IGVhclByb2plY3QgPSB2aXJ0dWFsQ29tcG9uZW50LmdldFByb2plY3QoKTsKIAkJCQkJaWYoZWFyUHJvamVjdCAhPSBudWxsICYmIEVhclV0aWxpdGllcy5pc0VBUlByb2plY3QoZWFyUHJvamVjdCkpewogCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQodmlydHVhbENvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJU3RyaW5nIGVhckxpYkRpciA9IGdldEVBUkxpYkRpcihlYXJDb21wb25lbnQpOworCQkJCQkJU3RyaW5nIGVhckxpYkRpciA9IEVhclV0aWxpdGllcy5nZXRFQVJMaWJEaXIoZWFyQ29tcG9uZW50KTsKIAkJCQkJCWJvb2xlYW4gaW5MaWJEaXIgPSBpc0luTGliRGlyKGVhckNvbXBvbmVudCwgdmlydHVhbENvbXBvbmVudCwgZWFyTGliRGlyKTsKIAkJCQkJCWlmKGluTGliRGlyID09IHRydWUgJiYgZWFyTGliRGlyICE9IG51bGwpewogCQkJCQkJCWFyY2hpdmVPcHRpb25zLnNldE9wdGlvbihESVNDUklNSU5BVEVfSkFWQV9FRSwgZmFsc2UpOwpAQCAtMjQ0LDEyICsyNjUsMjYgQEAKIAkJCQkJCWlmKGVhckNvbXBvbmVudCAhPSBudWxsKSB7CiAJCQkJCQkJcGFyZW50RUFSQXJjaGl2ZSA9IG9wZW5BcmNoaXZlKGVhckNvbXBvbmVudCk7CiAJCQkJCQkJaWYocGFyZW50RUFSQXJjaGl2ZSAhPSBudWxsKSB7CisJCQkJCQkJCWZvdW5kUGFyZW50QXJjaGl2ZSA9IHRydWU7CiAJCQkJCQkJCWFyY2hpdmVPcHRpb25zLnNldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5QQVJFTlRfQVJDSElWRSwgcGFyZW50RUFSQXJjaGl2ZSk7CisJCQkJCQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShlYXJQcm9qZWN0KTsKKwkJCQkJCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwpIHsKKwkJCQkJCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBmYWNldGVkUHJvamVjdC5nZXRQcmltYXJ5UnVudGltZSgpOworCQkJCQkJCQkJYXJjaGl2ZU9wdGlvbnMuc2V0T3B0aW9uKFBBUkVOVF9SVU5USU1FLCBydW50aW1lKTsKKwkJCQkJCQkJfQogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0gY2F0Y2goQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKIAkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCX0KKwkJCX0KKwkJCWlmKCFmb3VuZFBhcmVudEFyY2hpdmUgJiYgSmF2YUVFUHJvamVjdFV0aWxpdGllcy51c2VzSmF2YUVFQ29tcG9uZW50KHZpcnR1YWxDb21wb25lbnQpKXsKKwkJCQlJUHJvamVjdCB3ZWJQcm9qZWN0ID0gdmlydHVhbENvbXBvbmVudC5nZXRQcm9qZWN0KCk7CisJCQkJaWYod2ViUHJvamVjdCAhPSBudWxsICYmIFdlYlV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHdlYlByb2plY3QpKXsKKwkJCQkJYXJjaGl2ZU9wdGlvbnMuc2V0T3B0aW9uKERJU0NSSU1JTkFURV9NQUlOX0NMQVNTLCBmYWxzZSk7CiAJCQkJfQogCQkJfQogCQkJcmV0dXJuIG9wZW5BcmNoaXZlKGFyY2hpdmVPcHRpb25zKTsKQEAgLTI3MywzMSArMzA4LDMwIEBACiAJcHVibGljIEphdmFFRVF1aWNrUGVlayBnZXRKYXZhRUVRdWlja1BlZWsoSUFyY2hpdmUgYXJjaGl2ZSkgewogCQlpZiAoYXJjaGl2ZVRvSmF2YUVFUXVpY2tQZWVrLmNvbnRhaW5zS2V5KGFyY2hpdmUpKSB7CiAJCQlyZXR1cm4gYXJjaGl2ZVRvSmF2YUVFUXVpY2tQZWVrLmdldChhcmNoaXZlKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ1tdIGRlcGxveW1lbnREZXNjcmlwdG9yc1RvQ2hlY2sgPSBuZXcgU3RyaW5nW10geyBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSwgSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSwgSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJLCBKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkksCi0JCQkJCUoyRUVDb25zdGFudHMuUkFSX0REX1VSSSB9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBsb3ltZW50RGVzY3JpcHRvcnNUb0NoZWNrLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgSVBhdGggZGVwbG95bWVudERlc2NyaXB0b3JQYXRoID0gbmV3IFBhdGgoZGVwbG95bWVudERlc2NyaXB0b3JzVG9DaGVja1tpXSk7Ci0JCQkJaWYgKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoZGVwbG95bWVudERlc2NyaXB0b3JQYXRoKSkgewotCQkJCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQkJCUlBcmNoaXZlUmVzb3VyY2UgZGQ7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlkZCA9IGFyY2hpdmUuZ2V0QXJjaGl2ZVJlc291cmNlKGRlcGxveW1lbnREZXNjcmlwdG9yUGF0aCk7Ci0JCQkJCQlpbiA9IGRkLmdldElucHV0U3RyZWFtKCk7Ci0JCQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhpbik7Ci0JCQkJCQlhcmNoaXZlVG9KYXZhRUVRdWlja1BlZWsucHV0KGFyY2hpdmUsIHF1aWNrUGVlayk7Ci0JCQkJCQlyZXR1cm4gcXVpY2tQZWVrOwotCQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJQXJjaGl2ZVV0aWwud2FybihlKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJQXJjaGl2ZVV0aWwud2FybihlKTsKLQkJCQkJfQorCQl9CisJCVN0cmluZ1tdIGRlcGxveW1lbnREZXNjcmlwdG9yc1RvQ2hlY2sgPSBuZXcgU3RyaW5nW10geyBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSwgSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSwgSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJLCBKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkksCisJCQkJSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJLCBKMkVFQ29uc3RhbnRzLldFQkZSQUdNRU5UX0REX1VSSSB9OworCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcGxveW1lbnREZXNjcmlwdG9yc1RvQ2hlY2subGVuZ3RoOyBpKyspIHsKKwkJCWZpbmFsIElQYXRoIGRlcGxveW1lbnREZXNjcmlwdG9yUGF0aCA9IG5ldyBQYXRoKGRlcGxveW1lbnREZXNjcmlwdG9yc1RvQ2hlY2tbaV0pOworCQkJaWYgKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoZGVwbG95bWVudERlc2NyaXB0b3JQYXRoKSkgeworCQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKKwkJCQlJQXJjaGl2ZVJlc291cmNlIGRkOworCQkJCXRyeSB7CisJCQkJCWRkID0gYXJjaGl2ZS5nZXRBcmNoaXZlUmVzb3VyY2UoZGVwbG95bWVudERlc2NyaXB0b3JQYXRoKTsKKwkJCQkJaW4gPSBkZC5nZXRJbnB1dFN0cmVhbSgpOworCQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhpbik7CisJCQkJCWFyY2hpdmVUb0phdmFFRVF1aWNrUGVlay5wdXQoYXJjaGl2ZSwgcXVpY2tQZWVrKTsKKwkJCQkJcmV0dXJuIHF1aWNrUGVlazsKKwkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJCQlBcmNoaXZlVXRpbC53YXJuKGUpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJQXJjaGl2ZVV0aWwud2FybihlKTsKIAkJCQl9CiAJCQl9Ci0JCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhudWxsKTsKLQkJCWFyY2hpdmVUb0phdmFFRVF1aWNrUGVlay5wdXQoYXJjaGl2ZSwgcXVpY2tQZWVrKTsKLQkJCXJldHVybiBxdWlja1BlZWs7CiAJCX0KKwkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsobnVsbCk7CisJCWFyY2hpdmVUb0phdmFFRVF1aWNrUGVlay5wdXQoYXJjaGl2ZSwgcXVpY2tQZWVrKTsKKwkJcmV0dXJuIHF1aWNrUGVlazsKIAl9CiAKIAkvKioKQEAgLTMyNSw2ICszNTksNyBAQAogCSAqIEFuIGFyY2hpdmUgd2hvc2UgbmFtZSBlbmRzIHdpdGggJy5qYXInIGlzIGNvbnNpZGVyZWQgYSBVdGlsaXR5IDwvbGk+CiAJICogPC9vbD4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSUFyY2hpdmUgb3BlbkFyY2hpdmUoQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnMpIHRocm93cyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gewogCQlJQXJjaGl2ZSBzaW1wbGVBcmNoaXZlID0gc3VwZXIub3BlbkFyY2hpdmUoYXJjaGl2ZU9wdGlvbnMpOwogCQlPYmplY3QgZGlzY3JpbWluYXRlSmF2YUVFID0gYXJjaGl2ZU9wdGlvbnMuZ2V0T3B0aW9uKERJU0NSSU1JTkFURV9KQVZBX0VFKTsKQEAgLTMzNSwxNyArMzcwLDExIEBACiAJCXJldHVybiByZWZpbmVGb3JKYXZhRUUoc2ltcGxlQXJjaGl2ZSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9FQVIgPSAiLmVhciI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9XQVIgPSAiLndhciI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVF9KQVIgPSAiLmphciI7Ly8kTk9OLU5MUy0xJAotCiAJcHJpdmF0ZSBJQXJjaGl2ZSByZWZpbmVGb3JKYXZhRUUoZmluYWwgSUFyY2hpdmUgc2ltcGxlQXJjaGl2ZSkgewogCQlib29sZWFuIGlzTmVzdGVkV2l0aGluRWFyNU9yQWJvdmUgPSBmYWxzZTsJCQogCQlTdHJpbmcgZWFyTGliRGlyZWN0b3J5ID0gbnVsbDsKIAkJU3RyaW5nIGRlZmF1bHRFQVJMaWJEaXIgPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkVBUl9ERUZBVUxUX0xJQl9ESVIpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0KKwkJCiAJCS8vQ2hlY2sgdG8gc2VlIGlmIHRoaXMgYXJjaGl2ZSBpcyBhY3R1YWxseSBiZWluZyBvcGVuZWQgYXMgYSBuZXN0ZWQgYXJjaGl2ZSBmcm9tIHdpdGhpbiBhbiBFQVIKIAkJLy9pZiBpdCBpcyB0aGVuIHRoZSBFQVIncyBERCBuZWVkcyB0byBiZSBjaGVja2VkIHRvIHNlZSBleGFjdGx5IHdoYXQgdHlwZSBvZiBhcmNoaXZlIHRoaXMgaXMuCiAJCWlmIChzaW1wbGVBcmNoaXZlLmdldEFyY2hpdmVPcHRpb25zKCkuaGFzT3B0aW9uKEFyY2hpdmVPcHRpb25zLlBBUkVOVF9BUkNISVZFKSkgewpAQCAtMzY1LDU2ICszOTQsNjEgQEAKIAkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCQlpbnQgZGVmaW5lZFR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOOwotCQkJCQkJaWYgKHFwLmdldFZlcnNpb24oKSA9PSBKYXZhRUVRdWlja1BlZWsuSkVFXzVfMF9JRCkgewotCQkJCQkJCWlzTmVzdGVkV2l0aGluRWFyNU9yQWJvdmUgPSB0cnVlOwotCQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24gYXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24pIGRkT2JqOwotCQkJCQkJCS8vIElmIGxpYiBkaXJlY3RvcnkgaXMgbm90IHNwZWNpZmllZCBpbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHVzZSB0aGUgZGVmYXVsdCAKLQkJCQkJCQllYXJMaWJEaXJlY3RvcnkgPSBhcHAuZ2V0TGlicmFyeURpcmVjdG9yeSgpID09IG51bGw/IGRlZmF1bHRFQVJMaWJEaXIgOiBhcHAuZ2V0TGlicmFyeURpcmVjdG9yeSgpOwotCQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uTW9kdWxlIG1vZHVsZSA9IGFwcC5nZXRGaXJzdE1vZHVsZShhcmNoaXZlUGF0aC50b1N0cmluZygpKTsKLQkJCQkJCQkvL2lmIHRoZSBhcmNoaXZlIGlzbid0IGZvdW5kLCBkbyBhIHNtYXJ0IHNlYXJjaCBmb3IgaXQKLQkJCQkJCQlpZihtb2R1bGUgPT0gbnVsbCl7Ci0JCQkJCQkJCUlQYXRoIG5vRGV2aWNlUGF0aCA9IGFyY2hpdmVQYXRoLnNldERldmljZShudWxsKTsKLQkJCQkJCQkJZm9yKGludCBpPTE7IGk8bm9EZXZpY2VQYXRoLnNlZ21lbnRDb3VudCgpICYmIG1vZHVsZSA9PSBudWxsOyBpKyspewotCQkJCQkJCQkJU3RyaW5nIHN0cmluZ1BhdGggPSBub0RldmljZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhpKS50b1N0cmluZygpOwotCQkJCQkJCQkJbW9kdWxlID0gYXBwLmdldEZpcnN0TW9kdWxlKHN0cmluZ1BhdGgpOworCQkJCQkJaWYoYXJjaGl2ZVBhdGggIT0gbnVsbCkgeworCQkJCQkJCWlmIChxcC5nZXRWZXJzaW9uKCkgPT0gSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQgfHwgcXAuZ2V0VmVyc2lvbigpID09IEphdmFFRVF1aWNrUGVlay5KRUVfNl8wX0lEKSB7CisJCQkJCQkJCWlzTmVzdGVkV2l0aGluRWFyNU9yQWJvdmUgPSB0cnVlOworCQkJCQkJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIGFwcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uKSBkZE9iajsKKwkJCQkJCQkJLy8gSWYgbGliIGRpcmVjdG9yeSBpcyBub3Qgc3BlY2lmaWVkIGluIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgdXNlIHRoZSBkZWZhdWx0IAorCQkJCQkJCQllYXJMaWJEaXJlY3RvcnkgPSBhcHAuZ2V0TGlicmFyeURpcmVjdG9yeSgpID09IG51bGw/IGRlZmF1bHRFQVJMaWJEaXIgOiBhcHAuZ2V0TGlicmFyeURpcmVjdG9yeSgpOworCQkJCQkJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLk1vZHVsZSBtb2R1bGUgPSBhcHAuZ2V0Rmlyc3RNb2R1bGUoYXJjaGl2ZVBhdGgudG9TdHJpbmcoKSk7CisJCQkJCQkJCS8vaWYgdGhlIGFyY2hpdmUgaXNuJ3QgZm91bmQsIGRvIGEgc21hcnQgc2VhcmNoIGZvciBpdAorCQkJCQkJCQlpZihtb2R1bGUgPT0gbnVsbCl7CisJCQkJCQkJCQlJUGF0aCBub0RldmljZVBhdGggPSBhcmNoaXZlUGF0aC5zZXREZXZpY2UobnVsbCk7CisJCQkJCQkJCQlmb3IoaW50IGk9MTsgaTxub0RldmljZVBhdGguc2VnbWVudENvdW50KCkgJiYgbW9kdWxlID09IG51bGw7IGkrKyl7CisJCQkJCQkJCQkJU3RyaW5nIHN0cmluZ1BhdGggPSBub0RldmljZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhpKS50b1N0cmluZygpOworCQkJCQkJCQkJCW1vZHVsZSA9IGFwcC5nZXRGaXJzdE1vZHVsZShzdHJpbmdQYXRoKTsKKwkJCQkJCQkJCX0KIAkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAobnVsbCAhPSBtb2R1bGUpIHsKLQkJCQkJCQkJaWYgKG1vZHVsZS5nZXRFamIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlkZWZpbmVkVHlwZSA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl9UWVBFOwotCQkJCQkJCQl9IGVsc2UgaWYgKG1vZHVsZS5nZXRDb25uZWN0b3IoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlkZWZpbmVkVHlwZSA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkNPTk5FQ1RPUl9UWVBFOwotCQkJCQkJCQl9IGVsc2UgaWYgKG1vZHVsZS5nZXRKYXZhKCkgIT0gbnVsbCkgewotCQkJCQkJCQkJZGVmaW5lZFR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfVFlQRTsKLQkJCQkJCQkJfSBlbHNlIGlmIChtb2R1bGUuZ2V0V2ViKCkgIT0gbnVsbCkgewotCQkJCQkJCQkJZGVmaW5lZFR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRTsKKwkJCQkJCQkJaWYgKG51bGwgIT0gbW9kdWxlKSB7CisJCQkJCQkJCQlpZiAobW9kdWxlLmdldEVqYigpICE9IG51bGwpIHsKKwkJCQkJCQkJCQlkZWZpbmVkVHlwZSA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl9UWVBFOworCQkJCQkJCQkJfSBlbHNlIGlmIChtb2R1bGUuZ2V0Q29ubmVjdG9yKCkgIT0gbnVsbCkgeworCQkJCQkJCQkJCWRlZmluZWRUeXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuQ09OTkVDVE9SX1RZUEU7CisJCQkJCQkJCQl9IGVsc2UgaWYgKG1vZHVsZS5nZXRKYXZhKCkgIT0gbnVsbCkgeworCQkJCQkJCQkJCWRlZmluZWRUeXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEU7CisJCQkJCQkJCQl9IGVsc2UgaWYgKG1vZHVsZS5nZXRXZWIoKSAhPSBudWxsKSB7CisJCQkJCQkJCQkJZGVmaW5lZFR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRTsKKwkJCQkJCQkJCX0KIAkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7IC8vSjJFRSAxLjQgb3IgYmVsb3csIHJlbHkgc29sZWx5IG9uIERECi0JCQkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24gYXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uKSBkZE9iajsKLQkJCQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGUgbW9kdWxlID0gYXBwLmdldEZpcnN0TW9kdWxlKGFyY2hpdmVQYXRoLnRvU3RyaW5nKCkpOwotCQkJCQkJCS8vaWYgdGhlIGFyY2hpdmUgaXNuJ3QgZm91bmQsIGRvIGEgc21hcnQgc2VhcmNoIGZvciBpdAotCQkJCQkJCWlmKG1vZHVsZSA9PSBudWxsKXsKLQkJCQkJCQkJSVBhdGggbm9EZXZpY2VQYXRoID0gYXJjaGl2ZVBhdGguc2V0RGV2aWNlKG51bGwpOwotCQkJCQkJCQlmb3IoaW50IGk9MTsgaTxub0RldmljZVBhdGguc2VnbWVudENvdW50KCkgJiYgbW9kdWxlID09IG51bGw7IGkrKyl7Ci0JCQkJCQkJCQlTdHJpbmcgc3RyaW5nUGF0aCA9IG5vRGV2aWNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGkpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCQltb2R1bGUgPSBhcHAuZ2V0Rmlyc3RNb2R1bGUoc3RyaW5nUGF0aCk7CisJCQkJCQkJfSBlbHNlIHsgLy9KMkVFIDEuNCBvciBiZWxvdywgcmVseSBzb2xlbHkgb24gREQKKwkJCQkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24gYXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uKSBkZE9iajsKKwkJCQkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlIG1vZHVsZSA9IGFwcC5nZXRGaXJzdE1vZHVsZShhcmNoaXZlUGF0aC50b1N0cmluZygpKTsKKwkJCQkJCQkJLy9pZiB0aGUgYXJjaGl2ZSBpc24ndCBmb3VuZCwgZG8gYSBzbWFydCBzZWFyY2ggZm9yIGl0CisJCQkJCQkJCWlmKG1vZHVsZSA9PSBudWxsKXsKKwkJCQkJCQkJCUlQYXRoIG5vRGV2aWNlUGF0aCA9IGFyY2hpdmVQYXRoLnNldERldmljZShudWxsKTsKKwkJCQkJCQkJCWZvcihpbnQgaT0xOyBpPG5vRGV2aWNlUGF0aC5zZWdtZW50Q291bnQoKSAmJiBtb2R1bGUgPT0gbnVsbDsgaSsrKXsKKwkJCQkJCQkJCQlTdHJpbmcgc3RyaW5nUGF0aCA9IG5vRGV2aWNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGkpLnRvU3RyaW5nKCk7CisJCQkJCQkJCQkJbW9kdWxlID0gYXBwLmdldEZpcnN0TW9kdWxlKHN0cmluZ1BhdGgpOworCQkJCQkJCQkJfQogCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChudWxsICE9IG1vZHVsZSkgewotCQkJCQkJCQlpZiAobW9kdWxlLmlzRWpiTW9kdWxlKCkpIHsKLQkJCQkJCQkJCWRlZmluZWRUeXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCX1RZUEU7Ci0JCQkJCQkJCX0gZWxzZSBpZiAobW9kdWxlLmlzQ29ubmVjdG9yTW9kdWxlKCkpIHsKLQkJCQkJCQkJCWRlZmluZWRUeXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuQ09OTkVDVE9SX1RZUEU7Ci0JCQkJCQkJCX0gZWxzZSBpZiAobW9kdWxlLmlzSmF2YU1vZHVsZSgpKSB7Ci0JCQkJCQkJCQlkZWZpbmVkVHlwZSA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFOwotCQkJCQkJCQl9IGVsc2UgaWYgKG1vZHVsZS5pc1dlYk1vZHVsZSgpKSB7Ci0JCQkJCQkJCQlkZWZpbmVkVHlwZSA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl9UWVBFOworCQkJCQkJCQlpZihtb2R1bGUgPT0gbnVsbCkgeworCQkJCQkJCQkJbW9kdWxlID0gZ2V0TW9kdWxlRnJvbVVSSShhcHAsIGFyY2hpdmVQYXRoLnRvU3RyaW5nKCkpOwogCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsgLy9KMkVFIDEuNCBvciBiZWxvdywgYW5kIG5vdCBpbiBERCwgdHJlYXQgYXMgdXRpbGl0eQotCQkJCQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhudWxsKTsKLQkJCQkJCQkJYXJjaGl2ZVRvSmF2YUVFUXVpY2tQZWVrLnB1dChzaW1wbGVBcmNoaXZlLCBxdWlja1BlZWspOwotCQkJCQkJCQlyZXR1cm4gc2ltcGxlQXJjaGl2ZTsKKwkJCQkJCQkJaWYgKG51bGwgIT0gbW9kdWxlKSB7CisJCQkJCQkJCQlpZiAobW9kdWxlLmlzRWpiTW9kdWxlKCkpIHsKKwkJCQkJCQkJCQlkZWZpbmVkVHlwZSA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl9UWVBFOworCQkJCQkJCQkJfSBlbHNlIGlmIChtb2R1bGUuaXNDb25uZWN0b3JNb2R1bGUoKSkgeworCQkJCQkJCQkJCWRlZmluZWRUeXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuQ09OTkVDVE9SX1RZUEU7CisJCQkJCQkJCQl9IGVsc2UgaWYgKG1vZHVsZS5pc0phdmFNb2R1bGUoKSkgeworCQkJCQkJCQkJCWRlZmluZWRUeXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEU7CisJCQkJCQkJCQl9IGVsc2UgaWYgKG1vZHVsZS5pc1dlYk1vZHVsZSgpKSB7CisJCQkJCQkJCQkJZGVmaW5lZFR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSBlbHNlIHsgLy9KMkVFIDEuNCBvciBiZWxvdywgYW5kIG5vdCBpbiBERCwgdHJlYXQgYXMgdXRpbGl0eQorCQkJCQkJCQkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsobnVsbCk7CisJCQkJCQkJCQlhcmNoaXZlVG9KYXZhRUVRdWlja1BlZWsucHV0KHNpbXBsZUFyY2hpdmUsIHF1aWNrUGVlayk7CisJCQkJCQkJCQlyZXR1cm4gc2ltcGxlQXJjaGl2ZTsKKwkJCQkJCQkJfQogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJCWlmIChkZWZpbmVkVHlwZSAhPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSB7CkBAIC00MzcsMjcgKzQ3MSw1NyBAQAogCQkJCQkJCWlmICh3cmFwcGVkRm9yREQgIT0gbnVsbCkgewogCQkJCQkJCQlyZXR1cm4gd3JhcHBlZEZvckREOwogCQkJCQkJCX0KLQkJCQkJCQkvLyBlbHNlIHRoZXJlIGlzIG5vIEREIGFuZCB3ZSBuZWVkIHRvIGRlY2lkZSBvbiBhCi0JCQkJCQkJLy8gdmVyc2lvbiAobGV0dGluZyBSQVJzIGZhbGwgdGhyb3VnaCkKKwkJCQkJCQkvLyBlbHNlIHRoZXJlIGlzIG5vIEREIGFuZCB3ZSBuZWVkIHRvIGRlY2lkZSBvbiBhIHZlcnNpb24KKwkJCQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbnVsbDsKKwkJCQkJCQlTdHJpbmcgZGRVUkkgPSBudWxsOworCQkJCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBudWxsOworCQkJCQkJCU9iamVjdCBvYmogPSBzaW1wbGVBcmNoaXZlLmdldEFyY2hpdmVPcHRpb25zKCkuZ2V0T3B0aW9uKFBBUkVOVF9SVU5USU1FKTsKKwkJCQkJCQlpZiAobnVsbCAhPSBvYmopIHsKKwkJCQkJCQkJcnVudGltZSA9IChJUnVudGltZSkgb2JqOworCQkJCQkJCX0KKwkJCQkJCQkKIAkJCQkJCQlzd2l0Y2ggKGRlZmluZWRUeXBlKSB7CiAJCQkJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfVFlQRTogewotCQkJCQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhKYXZhRUVRdWlja1BlZWsuRUpCX1RZUEUsIEphdmFFRVF1aWNrUGVlay5FSkJfM18wX0lELCBKYXZhRUVRdWlja1BlZWsuSkVFXzVfMF9JRCk7Ci0JCQkJCQkJCWFyY2hpdmVUb0phdmFFRVF1aWNrUGVlay5wdXQoc2ltcGxlQXJjaGl2ZSwgcXVpY2tQZWVrKTsKLQkJCQkJCQkJd3JhcEFyY2hpdmUoc2ltcGxlQXJjaGl2ZSwgbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJKSk7Ci0JCQkJCQkJCXJldHVybiBzaW1wbGVBcmNoaXZlOworCQkJCQkJCQlkZFVSSSA9IEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSTsKKwkJCQkJCQkJaWYgKHJ1bnRpbWUgPT0gbnVsbCB8fCBydW50aW1lLnN1cHBvcnRzKElKMkVFRmFjZXRDb25zdGFudHMuRUpCXzMxKSkgeworCQkJCQkJCQkJcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhKYXZhRUVRdWlja1BlZWsuRUpCX1RZUEUsIEphdmFFRVF1aWNrUGVlay5FSkJfM18xX0lELCBKYXZhRUVRdWlja1BlZWsuSkVFXzZfMF9JRCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZSB7CisJCQkJCQkJCQlxdWlja1BlZWsgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKEphdmFFRVF1aWNrUGVlay5FSkJfVFlQRSwgSmF2YUVFUXVpY2tQZWVrLkVKQl8zXzBfSUQsIEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lEKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKIAkJCQkJCQl9CiAJCQkJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfVFlQRTogewotCQkJCQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhKYXZhRUVRdWlja1BlZWsuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEUsIEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lELCBKYXZhRUVRdWlja1BlZWsuSkVFXzVfMF9JRCk7Ci0JCQkJCQkJCWFyY2hpdmVUb0phdmFFRVF1aWNrUGVlay5wdXQoc2ltcGxlQXJjaGl2ZSwgcXVpY2tQZWVrKTsKLQkJCQkJCQkJd3JhcEFyY2hpdmUoc2ltcGxlQXJjaGl2ZSwgbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpKTsKLQkJCQkJCQkJcmV0dXJuIHNpbXBsZUFyY2hpdmU7CisJCQkJCQkJCWRkVVJJID0gSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkk7CisJCQkJCQkJCWlmIChydW50aW1lID09IG51bGwgfHwgcnVudGltZS5zdXBwb3J0cyhJSjJFRUZhY2V0Q29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF82MCkpIHsKKwkJCQkJCQkJCXF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoSmF2YUVFUXVpY2tQZWVrLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFLCBKYXZhRUVRdWlja1BlZWsuSkVFXzZfMF9JRCwgSmF2YUVFUXVpY2tQZWVrLkpFRV82XzBfSUQpOworCQkJCQkJCQl9CisJCQkJCQkJCWVsc2UgeworCQkJCQkJCQkJcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhKYXZhRUVRdWlja1BlZWsuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEUsIEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lELCBKYXZhRUVRdWlja1BlZWsuSkVFXzVfMF9JRCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJYnJlYWs7CiAJCQkJCQkJfQogCQkJCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCX1RZUEU6IHsKLQkJCQkJCQkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoSmF2YUVFUXVpY2tQZWVrLldFQl9UWVBFLCBKYXZhRUVRdWlja1BlZWsuV0VCXzJfNV9JRCwgSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQpOwotCQkJCQkJCQlhcmNoaXZlVG9KYXZhRUVRdWlja1BlZWsucHV0KHNpbXBsZUFyY2hpdmUsIHF1aWNrUGVlayk7Ci0JCQkJCQkJCXdyYXBBcmNoaXZlKHNpbXBsZUFyY2hpdmUsIG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSkpOwotCQkJCQkJCQlyZXR1cm4gc2ltcGxlQXJjaGl2ZTsKKwkJCQkJCQkJZGRVUkkgPSBKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkk7CisJCQkJCQkJCWlmIChydW50aW1lID09IG51bGwgfHwgcnVudGltZS5zdXBwb3J0cyhJSjJFRUZhY2V0Q29uc3RhbnRzLkRZTkFNSUNfV0VCXzMwKSkgeworCQkJCQkJCQkJcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhKYXZhRUVRdWlja1BlZWsuV0VCX1RZUEUsIEphdmFFRVF1aWNrUGVlay5XRUJfM18wX0lELCBKYXZhRUVRdWlja1BlZWsuSkVFXzZfMF9JRCk7CisJCQkJCQkJCX0KKwkJCQkJCQkJZWxzZSB7CisJCQkJCQkJCQlxdWlja1BlZWsgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKEphdmFFRVF1aWNrUGVlay5XRUJfVFlQRSwgSmF2YUVFUXVpY2tQZWVrLldFQl8yXzVfSUQsIEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lEKTsKKwkJCQkJCQkJfQorCQkJCQkJCQlicmVhazsKIAkJCQkJCQl9CisJCQkJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5DT05ORUNUT1JfVFlQRTogeworCQkJCQkJCQlkZFVSSSA9IEoyRUVDb25zdGFudHMuUkFSX0REX1VSSTsKKwkJCQkJCQkJcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhKYXZhRUVRdWlja1BlZWsuQ09OTkVDVE9SX1RZUEUsIEphdmFFRVF1aWNrUGVlay5KQ0FfMV82X0lELCBKYXZhRUVRdWlja1BlZWsuSkVFXzZfMF9JRCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQkJCisJCQkJCQkJaWYgKHF1aWNrUGVlayAhPSBudWxsKSB7CisJCQkJCQkJCWFyY2hpdmVUb0phdmFFRVF1aWNrUGVlay5wdXQoc2ltcGxlQXJjaGl2ZSwgcXVpY2tQZWVrKTsKKwkJCQkJCQkJd3JhcEFyY2hpdmUoc2ltcGxlQXJjaGl2ZSwgbmV3IFBhdGgoZGRVUkkpKTsKKwkJCQkJCQkJcmV0dXJuIHNpbXBsZUFyY2hpdmU7CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9IGNhdGNoIChBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIGUpIHsKQEAgLTQ2OCwyMiArNTMyLDggQEAKIAkJCQkJLy9QYXJlbnQgRUFSIGRvZXMgbm90IGhhdmUgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBzbyBpdCBpcyBub3QgbGVnYWN5CiAJCQkJCWlzTmVzdGVkV2l0aGluRWFyNU9yQWJvdmUgPSB0cnVlOwogCQkJCQllYXJMaWJEaXJlY3RvcnkgPSBkZWZhdWx0RUFSTGliRGlyOwotCQkJCX0JCQotCQkJfQotCQl9Ci0JCQotCQkKLQkJU3RyaW5nW10gZGVwbG95bWVudERlc2NyaXB0b3JzVG9DaGVjayA9IG5ldyBTdHJpbmdbXSB7IEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJLCBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJLCBKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkksIEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSwKLQkJCQlKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkgfTsKLQkJaW50W10gdHlwZVRvVmVyaWZ5ID0gbmV3IGludFtdIHsgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRSwKLQkJCQlKMkVFQ29uc3RhbnRzLkNPTk5FQ1RPUl9UWVBFIH07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwbG95bWVudERlc2NyaXB0b3JzVG9DaGVjay5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgaW50IGN1cnJlbnRUeXBlID0gdHlwZVRvVmVyaWZ5W2ldOwotCQkJZmluYWwgSVBhdGggZGVwbG95bWVudERlc2NyaXB0b3JQYXRoID0gbmV3IFBhdGgoZGVwbG95bWVudERlc2NyaXB0b3JzVG9DaGVja1tpXSk7Ci0JCQlJQXJjaGl2ZSB3cmFwcGVkRm9yREQgPSB3cmFwRm9yREQoc2ltcGxlQXJjaGl2ZSwgY3VycmVudFR5cGUsIGRlcGxveW1lbnREZXNjcmlwdG9yUGF0aCk7Ci0JCQlpZih3cmFwcGVkRm9yREQgIT0gbnVsbCl7Ci0JCQkJcmV0dXJuIHdyYXBwZWRGb3JERDsKLQkJCX0KKwkJCQl9CisJCQl9CQkJCiAJCX0KIAkJSVBhdGggYXJjaGl2ZVBhdGggPSBzaW1wbGVBcmNoaXZlLmdldFBhdGgoKTsKIAkJaWYgKGFyY2hpdmVQYXRoID09IG51bGwpIHsKQEAgLTQ5MiwyMCArNTQyLDMwIEBACiAJCQkJYXJjaGl2ZVBhdGggPSAoSVBhdGgpIG9iajsKIAkJCX0KIAkJfQotCi0JCWlmIChhcmNoaXZlUGF0aCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbGFzdFNlZ21lbnQgPSBhcmNoaXZlUGF0aC5sYXN0U2VnbWVudCgpLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAobGFzdFNlZ21lbnQuZW5kc1dpdGgoRE9UX0VBUikpIHsKLQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhKYXZhRUVRdWlja1BlZWsuQVBQTElDQVRJT05fVFlQRSwgSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQsIEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lEKTsKKwkJU3RyaW5nIGxhc3RTZWdtZW50ID0gbnVsbCA9PSBhcmNoaXZlUGF0aCA/IG51bGwgOiBhcmNoaXZlUGF0aC5sYXN0U2VnbWVudCgpLnRvTG93ZXJDYXNlKCk7CisJCQorCQlJQXJjaGl2ZSB3cmFwcGVkQXJjaGl2ZSA9IGNoZWNrSmF2YUVFREQobGFzdFNlZ21lbnQsIHNpbXBsZUFyY2hpdmUpOworCQlpZih3cmFwcGVkQXJjaGl2ZSAhPSBudWxsKXsKKwkJCXJldHVybiB3cmFwcGVkQXJjaGl2ZTsKKwkJfQorCQkKKwkJaWYgKGxhc3RTZWdtZW50ICE9IG51bGwpIHsKKwkJCWlmIChsYXN0U2VnbWVudC5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5FQVJfRVhUKSkgeworCQkJCUphdmFFRVF1aWNrUGVlayBxdWlja1BlZWsgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9UWVBFLCBKYXZhRUVRdWlja1BlZWsuSkVFXzZfMF9JRCwgSmF2YUVFUXVpY2tQZWVrLkpFRV82XzBfSUQpOwogCQkJCWFyY2hpdmVUb0phdmFFRVF1aWNrUGVlay5wdXQoc2ltcGxlQXJjaGl2ZSwgcXVpY2tQZWVrKTsKIAkJCQl3cmFwQXJjaGl2ZShzaW1wbGVBcmNoaXZlLCBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSkpOwogCQkJCXJldHVybiBzaW1wbGVBcmNoaXZlOwotCQkJfSBlbHNlIGlmIChsYXN0U2VnbWVudC5lbmRzV2l0aChET1RfV0FSKSkgewotCQkJCUphdmFFRVF1aWNrUGVlayBxdWlja1BlZWsgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKEphdmFFRVF1aWNrUGVlay5XRUJfVFlQRSwgSmF2YUVFUXVpY2tQZWVrLldFQl8yXzVfSUQsIEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lEKTsKKwkJCX0gZWxzZSBpZiAobGFzdFNlZ21lbnQuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuUkFSX0VYVCkpeworCQkJCUphdmFFRVF1aWNrUGVlayBxdWlja1BlZWsgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKEphdmFFRVF1aWNrUGVlay5DT05ORUNUT1JfVFlQRSwgSmF2YUVFUXVpY2tQZWVrLkpDQV8xXzZfSUQsIEphdmFFRVF1aWNrUGVlay5KRUVfNl8wX0lEKTsKKwkJCQlhcmNoaXZlVG9KYXZhRUVRdWlja1BlZWsucHV0KHNpbXBsZUFyY2hpdmUsIHF1aWNrUGVlayk7CisJCQkJd3JhcEFyY2hpdmUoc2ltcGxlQXJjaGl2ZSwgbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5SQVJfRERfVVJJKSk7CisJCQkJcmV0dXJuIHNpbXBsZUFyY2hpdmU7CisJCQl9IGVsc2UgaWYgKGxhc3RTZWdtZW50LmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLldBUl9FWFQpKSB7CisJCQkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoSmF2YUVFUXVpY2tQZWVrLldFQl9UWVBFLCBKYXZhRUVRdWlja1BlZWsuV0VCXzNfMF9JRCwgSmF2YUVFUXVpY2tQZWVrLkpFRV82XzBfSUQpOwogCQkJCWFyY2hpdmVUb0phdmFFRVF1aWNrUGVlay5wdXQoc2ltcGxlQXJjaGl2ZSwgcXVpY2tQZWVrKTsKIAkJCQl3cmFwQXJjaGl2ZShzaW1wbGVBcmNoaXZlLCBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQkFQUF9ERF9VUkkpKTsKIAkJCQlyZXR1cm4gc2ltcGxlQXJjaGl2ZTsKLQkJCX0gZWxzZSBpZiAobGFzdFNlZ21lbnQuZW5kc1dpdGgoRE9UX0pBUikpIHsKKwkJCX0gZWxzZSBpZiAobGFzdFNlZ21lbnQuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVCkpIHsKIAkJCQlTdHJpbmcgbGliUGF0aCA9IG51bGwgPT0gYXJjaGl2ZVBhdGggPyBudWxsIDogYXJjaGl2ZVBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvUG9ydGFibGVTdHJpbmcoKTsKIAkJCQkvLyBEbyBub3QgbG9vayBmb3IgbWFpbiBjbGFzcyBpbiBtYW5pZmVzdC5tZiBpZiBqYXIgaXMgb24gbGliIGRpcmVjdG9yeSBvZiBFQVIgNSBvciBhYm92ZQogCQkJCWJvb2xlYW4gc2tpcERpc2NyaW1pbmF0ZU1haW5DbGFzcyA9IGlzTmVzdGVkV2l0aGluRWFyNU9yQWJvdmUgJiYgZWFyTGliRGlyZWN0b3J5IT0gbnVsbCAmJiBlYXJMaWJEaXJlY3RvcnkuZXF1YWxzKGxpYlBhdGgpOwpAQCAtNTE5LDkgKzU3OSw5IEBACiAJCQkJCQkJaW4gPSBtYW5pZmVzdFJlc291cmNlLmdldElucHV0U3RyZWFtKCk7CiAJCQkJCQkJTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoaW4pOwogCQkJCQkJCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCQkJCQkJU3RyaW5nIG1haW5DbGFzc05hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJNYWluLUNsYXNzIik7CisJCQkJCQkJU3RyaW5nIG1haW5DbGFzc05hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJNYWluLUNsYXNzIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCQlpZiAobWFpbkNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCUphdmFFRVF1aWNrUGVlayBxdWlja1BlZWsgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9DTElFTlRfVFlQRSwgSmF2YUVFUXVpY2tQZWVrLkpFRV81XzBfSUQsIEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lEKTsKKwkJCQkJCQkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoSmF2YUVFUXVpY2tQZWVrLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFLCBKYXZhRUVRdWlja1BlZWsuSkVFXzZfMF9JRCwgSmF2YUVFUXVpY2tQZWVrLkpFRV82XzBfSUQpOwogCQkJCQkJCQlhcmNoaXZlVG9KYXZhRUVRdWlja1BlZWsucHV0KHNpbXBsZUFyY2hpdmUsIHF1aWNrUGVlayk7CiAJCQkJCQkJCXdyYXBBcmNoaXZlKHNpbXBsZUFyY2hpdmUsIG5ldyBQYXRoKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKSk7CiAJCQkJCQkJCXJldHVybiBzaW1wbGVBcmNoaXZlOwpAQCAtNTQ0LDcgKzYwNCw3IEBACiAJCQkJT2JqZWN0IGRpc2NyaW1pbmF0ZUVKQjMwID0gc2ltcGxlQXJjaGl2ZS5nZXRBcmNoaXZlT3B0aW9ucygpLmdldE9wdGlvbihESVNDUklNSU5BVEVfRUpCX0FOTk9UQVRJT05TKTsKIAkJCQlpZiAobnVsbCA9PSBkaXNjcmltaW5hdGVFSkIzMCB8fCAoKEJvb2xlYW4pIGRpc2NyaW1pbmF0ZUVKQjMwKS5ib29sZWFuVmFsdWUoKSkgewogCQkJCQlpZiAoaXNFSkJBcmNoaXZlKHNpbXBsZUFyY2hpdmUpKSB7Ci0JCQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhKYXZhRUVRdWlja1BlZWsuRUpCX1RZUEUsIEphdmFFRVF1aWNrUGVlay5FSkJfM18wX0lELCBKYXZhRUVRdWlja1BlZWsuSkVFXzVfMF9JRCk7CisJCQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhKYXZhRUVRdWlja1BlZWsuRUpCX1RZUEUsIEphdmFFRVF1aWNrUGVlay5FSkJfM18xX0lELCBKYXZhRUVRdWlja1BlZWsuSkVFXzZfMF9JRCk7CiAJCQkJCQlhcmNoaXZlVG9KYXZhRUVRdWlja1BlZWsucHV0KHNpbXBsZUFyY2hpdmUsIHF1aWNrUGVlayk7CiAJCQkJCQl3cmFwQXJjaGl2ZShzaW1wbGVBcmNoaXZlLCBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkkpKTsKIAkJCQkJCXJldHVybiBzaW1wbGVBcmNoaXZlOwpAQCAtNTU2LDcgKzYxNiwxMDggQEAKIAogCQlyZXR1cm4gc2ltcGxlQXJjaGl2ZTsKIAl9CisJCisJcHJpdmF0ZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGUgZ2V0TW9kdWxlRnJvbVVSSShvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiBhcHAsIFN0cmluZyB1cmkpIHsKKwkJaWYodXJpID09IG51bGwpCisJCQlyZXR1cm4gbnVsbDsKKwkJU3RyaW5nIGFyY2hpdmVOYW1lID0gKG5ldyBQYXRoKHVyaSkpLmxhc3RTZWdtZW50KCk7CisJCUxpc3Q8b3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsPiBtb2R1bGVzID0gYXBwLmdldE1vZHVsZXMoKTsKKwkJZm9yIChvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwgY3VyTW9kdWxlIDogbW9kdWxlcyApeworCQkJaWYoY3VyTW9kdWxlICE9IG51bGwgJiYgY3VyTW9kdWxlLmdldFVyaSgpICE9IG51bGwpIHsKKwkJCQlpZihuZXcgUGF0aChjdXJNb2R1bGUuZ2V0VXJpKCkpLmxhc3RTZWdtZW50KCkuZXF1YWxzKGFyY2hpdmVOYW1lKSkgeworCQkJCQlyZXR1cm4gY3VyTW9kdWxlOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CiAKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBjaGVja3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgZGVwbG95bWVudCBkZXNjcmlwdG9ycyB0bworCSAqIGRldGVybWluZSB0aGUgY29ycmVjdCBKYXZhIEVFIHR5cGUuIFRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGZpbGUgbmFtZSBpcworCSAqIHBhc3NlZCBpbiBhcyBhIGhpbnQuCisJICogCisJICogQHBhcmFtIGxhc3RTZWdtZW50CisJICogQHBhcmFtIHNpbXBsZUFyY2hpdmUKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBJQXJjaGl2ZSBjaGVja0phdmFFRUREKGZpbmFsIFN0cmluZyBsYXN0U2VnbWVudCwgZmluYWwgSUFyY2hpdmUgc2ltcGxlQXJjaGl2ZSkgeworCQljbGFzcyBEZXBsb3ltZW50RGVzY3JpcHRvckNoZWNrIHsKKwkJCXByaXZhdGUgU3RyaW5nIGRkU3RyaW5nOworCQkJcHJpdmF0ZSBpbnQgdHlwZVRvVmVyaWZ5OworCQkJcHJpdmF0ZSBib29sZWFuIGNoZWNrZWQgPSBmYWxzZTsKKworCQkJcHVibGljIERlcGxveW1lbnREZXNjcmlwdG9yQ2hlY2soU3RyaW5nIGRkU3RyaW5nLCBpbnQgdHlwZVRvVmVyaWZ5KSB7CisJCQkJdGhpcy5kZFN0cmluZyA9IGRkU3RyaW5nOworCQkJCXRoaXMudHlwZVRvVmVyaWZ5ID0gdHlwZVRvVmVyaWZ5OworCQkJfQorCisJCQlwdWJsaWMgSUFyY2hpdmUgd3JhcEZvckREKElBcmNoaXZlIHNpbXBsZUFyY2hpdmUpIHsKKwkJCQlpZiAoY2hlY2tlZCkgeworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9CisJCQkJY2hlY2tlZCA9IHRydWU7CisJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGRkU3RyaW5nKTsKKwkJCQlyZXR1cm4gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy50aGlzLndyYXBGb3JERChzaW1wbGVBcmNoaXZlLCB0eXBlVG9WZXJpZnksIHBhdGgpOworCQkJfQorCQl9CisKKwkJaW50IEVBUl9JTkRFWCA9IDA7CisJCWludCBSQVJfSU5ERVggPSAxOworCQlpbnQgV0FSX0lOREVYID0gMjsKKwkJaW50IEVKQl9JTkRFWCA9IDM7CisJCWludCBBUFBfQ0xJRU5UX0lOREVYID0gNDsKKwkJaW50IFdFQl9GUkFHTUVOVF9JTkRFWCA9IDU7CisKKwkJRGVwbG95bWVudERlc2NyaXB0b3JDaGVja1tdIGRlcGxveW1lbnREZXNjcmlwdG9yc1RvQ2hlY2sgPSBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JDaGVja1s2XTsKKwkJZGVwbG95bWVudERlc2NyaXB0b3JzVG9DaGVja1tFQVJfSU5ERVhdID0gbmV3IERlcGxveW1lbnREZXNjcmlwdG9yQ2hlY2soSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkksIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEUpOworCQlkZXBsb3ltZW50RGVzY3JpcHRvcnNUb0NoZWNrW1JBUl9JTkRFWF0gPSBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JDaGVjayhKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkksIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkNPTk5FQ1RPUl9UWVBFKTsKKwkJZGVwbG95bWVudERlc2NyaXB0b3JzVG9DaGVja1tXQVJfSU5ERVhdID0gbmV3IERlcGxveW1lbnREZXNjcmlwdG9yQ2hlY2soSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRSk7CisJCWRlcGxveW1lbnREZXNjcmlwdG9yc1RvQ2hlY2tbRUpCX0lOREVYXSA9IG5ldyBEZXBsb3ltZW50RGVzY3JpcHRvckNoZWNrKEoyRUVDb25zdGFudHMuRUpCSkFSX0REX1VSSSwgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCX1RZUEUpOworCQlkZXBsb3ltZW50RGVzY3JpcHRvcnNUb0NoZWNrW0FQUF9DTElFTlRfSU5ERVhdID0gbmV3IERlcGxveW1lbnREZXNjcmlwdG9yQ2hlY2soSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSSwgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEUpOworCQlkZXBsb3ltZW50RGVzY3JpcHRvcnNUb0NoZWNrW1dFQl9GUkFHTUVOVF9JTkRFWF0gPSBuZXcgRGVwbG95bWVudERlc2NyaXB0b3JDaGVjayhKMkVFQ29uc3RhbnRzLldFQkZSQUdNRU5UX0REX1VSSSwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCRlJBR01FTlRfVFlQRSk7CisKKwkJaWYgKGxhc3RTZWdtZW50ICE9IG51bGwpIHsKKwkJCWlmIChsYXN0U2VnbWVudC5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5FQVJfRVhUKSkgeworCQkJCUlBcmNoaXZlIHdyYXBwZWRGb3JERCA9IGRlcGxveW1lbnREZXNjcmlwdG9yc1RvQ2hlY2tbRUFSX0lOREVYXS53cmFwRm9yREQoc2ltcGxlQXJjaGl2ZSk7CisJCQkJaWYgKHdyYXBwZWRGb3JERCAhPSBudWxsKSB7CisJCQkJCXJldHVybiB3cmFwcGVkRm9yREQ7CisJCQkJfQorCQkJfSBlbHNlIGlmIChsYXN0U2VnbWVudC5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhUKSkgeworCQkJCUlBcmNoaXZlIHdyYXBwZWRGb3JERCA9IGRlcGxveW1lbnREZXNjcmlwdG9yc1RvQ2hlY2tbUkFSX0lOREVYXS53cmFwRm9yREQoc2ltcGxlQXJjaGl2ZSk7CisJCQkJaWYgKHdyYXBwZWRGb3JERCAhPSBudWxsKSB7CisJCQkJCXJldHVybiB3cmFwcGVkRm9yREQ7CisJCQkJfQorCQkJfSBlbHNlIGlmIChsYXN0U2VnbWVudC5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUKSkgeworCQkJCUlBcmNoaXZlIHdyYXBwZWRGb3JERCA9IGRlcGxveW1lbnREZXNjcmlwdG9yc1RvQ2hlY2tbV0FSX0lOREVYXS53cmFwRm9yREQoc2ltcGxlQXJjaGl2ZSk7CisJCQkJaWYgKHdyYXBwZWRGb3JERCAhPSBudWxsKSB7CisJCQkJCXJldHVybiB3cmFwcGVkRm9yREQ7CisJCQkJfQorCQkJfSBlbHNlIGlmIChsYXN0U2VnbWVudC5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUKSkgeworCQkJCUlBcmNoaXZlIHdyYXBwZWRGb3JERCA9IGRlcGxveW1lbnREZXNjcmlwdG9yc1RvQ2hlY2tbRUpCX0lOREVYXS53cmFwRm9yREQoc2ltcGxlQXJjaGl2ZSk7CisJCQkJaWYgKHdyYXBwZWRGb3JERCAhPSBudWxsKSB7CisJCQkJCXJldHVybiB3cmFwcGVkRm9yREQ7CisJCQkJfQorCQkJCXdyYXBwZWRGb3JERCA9IGRlcGxveW1lbnREZXNjcmlwdG9yc1RvQ2hlY2tbQVBQX0NMSUVOVF9JTkRFWF0ud3JhcEZvckREKHNpbXBsZUFyY2hpdmUpOworCQkJCWlmICh3cmFwcGVkRm9yREQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gd3JhcHBlZEZvckREOworCQkJCX0KKwkJCQl3cmFwcGVkRm9yREQgPSBkZXBsb3ltZW50RGVzY3JpcHRvcnNUb0NoZWNrW1dFQl9GUkFHTUVOVF9JTkRFWF0ud3JhcEZvckREKHNpbXBsZUFyY2hpdmUpOworCQkJCWlmICh3cmFwcGVkRm9yREQgIT0gbnVsbCkgeworCQkJCQlyZXR1cm4gd3JhcHBlZEZvckREOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWZvciAoRGVwbG95bWVudERlc2NyaXB0b3JDaGVjayBkZFRvQ2hlY2sgOiBkZXBsb3ltZW50RGVzY3JpcHRvcnNUb0NoZWNrKSB7CisJCQlJQXJjaGl2ZSB3cmFwcGVkRm9yREQgPSBkZFRvQ2hlY2sud3JhcEZvckREKHNpbXBsZUFyY2hpdmUpOworCQkJaWYgKHdyYXBwZWRGb3JERCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHdyYXBwZWRGb3JERDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCiAJcHJpdmF0ZSBJQXJjaGl2ZSB3cmFwRm9yREQoZmluYWwgSUFyY2hpdmUgc2ltcGxlQXJjaGl2ZSwgZmluYWwgaW50IGN1cnJlbnRUeXBlLCBmaW5hbCBJUGF0aCBkZXBsb3ltZW50RGVzY3JpcHRvclBhdGgpIHsKIAkJaWYgKHNpbXBsZUFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoZGVwbG95bWVudERlc2NyaXB0b3JQYXRoKSkgewogCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwpAQCAtNjQ5LDEzICs4MTAsMTQgQEAKIAkJfQogCiAJCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zTW9kZWxPYmplY3QoSVBhdGggbW9kZWxPYmplY3RQYXRoKSB7Ci0JCQlpZiAoc2ltcGxlTG9hZEFkYXB0ZXIuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UobW9kZWxPYmplY3RQYXRoKSkgeworCQkJSVBhdGggbG9jYWxNb2RlbE9iamVjdFBhdGggPSBtb2RlbE9iamVjdFBhdGg7CisJCQlpZiAoc2ltcGxlTG9hZEFkYXB0ZXIuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UobG9jYWxNb2RlbE9iamVjdFBhdGgpKSB7CiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9Ci0JCQlpZiAoSUFyY2hpdmUuRU1QVFlfTU9ERUxfUEFUSCA9PSBtb2RlbE9iamVjdFBhdGgpIHsKLQkJCQltb2RlbE9iamVjdFBhdGggPSBkZXBsb3ltZW50RGVzY3JpcHRvclBhdGg7CisJCQlpZiAoSUFyY2hpdmUuRU1QVFlfTU9ERUxfUEFUSCA9PSBsb2NhbE1vZGVsT2JqZWN0UGF0aCkgeworCQkJCWxvY2FsTW9kZWxPYmplY3RQYXRoID0gZGVwbG95bWVudERlc2NyaXB0b3JQYXRoOwogCQkJfQotCQkJcmV0dXJuIGVtZkhlbHBlci5jb250YWluc01vZGVsT2JqZWN0KG1vZGVsT2JqZWN0UGF0aCk7CisJCQlyZXR1cm4gZW1mSGVscGVyLmNvbnRhaW5zTW9kZWxPYmplY3QobG9jYWxNb2RlbE9iamVjdFBhdGgpOwogCQl9CiAKIAkJcHVibGljIElBcmNoaXZlUmVzb3VyY2UgZ2V0QXJjaGl2ZVJlc291cmNlKElQYXRoIHJlc291cmNlUGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CkBAIC02NzEsMTMgKzgzMywxNSBAQAogCQl9CiAKIAkJcHVibGljIE9iamVjdCBnZXRNb2RlbE9iamVjdChJUGF0aCBtb2RlbE9iamVjdFBhdGgpIHRocm93cyBBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIHsKLQkJCWlmIChzaW1wbGVMb2FkQWRhcHRlci5jb250YWluc01vZGVsT2JqZWN0KG1vZGVsT2JqZWN0UGF0aCkpIHsKLQkJCQlyZXR1cm4gc2ltcGxlTG9hZEFkYXB0ZXIuZ2V0TW9kZWxPYmplY3QobW9kZWxPYmplY3RQYXRoKTsKKwkJCUlQYXRoIGxvY2FsTW9kZWxPYmplY3RQYXRoID0gbW9kZWxPYmplY3RQYXRoOworCQkJaWYgKElBcmNoaXZlLkVNUFRZX01PREVMX1BBVEggIT0gbG9jYWxNb2RlbE9iamVjdFBhdGggCisJCQkJCSYmIHNpbXBsZUxvYWRBZGFwdGVyLmNvbnRhaW5zTW9kZWxPYmplY3QobG9jYWxNb2RlbE9iamVjdFBhdGgpKSB7CisJCQkJcmV0dXJuIHNpbXBsZUxvYWRBZGFwdGVyLmdldE1vZGVsT2JqZWN0KGxvY2FsTW9kZWxPYmplY3RQYXRoKTsKIAkJCX0KLQkJCWlmIChJQXJjaGl2ZS5FTVBUWV9NT0RFTF9QQVRIID09IG1vZGVsT2JqZWN0UGF0aCkgewotCQkJCW1vZGVsT2JqZWN0UGF0aCA9IGRlcGxveW1lbnREZXNjcmlwdG9yUGF0aDsKKwkJCWlmIChJQXJjaGl2ZS5FTVBUWV9NT0RFTF9QQVRIID09IGxvY2FsTW9kZWxPYmplY3RQYXRoKSB7CisJCQkJbG9jYWxNb2RlbE9iamVjdFBhdGggPSBkZXBsb3ltZW50RGVzY3JpcHRvclBhdGg7CiAJCQl9Ci0JCQlyZXR1cm4gZW1mSGVscGVyLmdldE1vZGVsT2JqZWN0KG1vZGVsT2JqZWN0UGF0aCk7CisJCQlyZXR1cm4gZW1mSGVscGVyLmdldE1vZGVsT2JqZWN0KGxvY2FsTW9kZWxPYmplY3RQYXRoKTsKIAkJfQogCiAJCXB1YmxpYyBJQXJjaGl2ZSBnZXRBcmNoaXZlKCkgewpAQCAtNjkyLDExICs4NTYsMTIgQEAKIAkJCXJldHVybiBzaW1wbGVMb2FkQWRhcHRlcjsKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkJcmV0dXJuIHNpbXBsZUxvYWRBZGFwdGVyLnRvU3RyaW5nKCk7CiAJCX0KIAotCX07CisJfQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cmFwQXJjaGl2ZShmaW5hbCBJQXJjaGl2ZSBzaW1wbGVBcmNoaXZlLCBmaW5hbCBJUGF0aCBkZXBsb3ltZW50RGVzY3JpcHRvclBhdGgpIHsKIAkJSUFyY2hpdmVMb2FkQWRhcHRlciB3cmFwcGluZ0VNRkxvYWRBZGFwdGVyID0gbmV3IEphdmFFRVdyYXBwaW5nTG9hZEFkYXB0ZXIoc2ltcGxlQXJjaGl2ZSwgZGVwbG95bWVudERlc2NyaXB0b3JQYXRoKTsKQEAgLTcxMyw2ICs4NzgsOSBAQAogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIE1FU1NBR0VEUklWRU4gPSAiTGphdmF4L2VqYi9NZXNzYWdlRHJpdmVuOyIudG9DaGFyQXJyYXkoKTsvLyROT04tTkxTLTEkCiAKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gU0lOR0xFVE9OID0gIkxqYXZheC9lamIvU2luZ2xldG9uOyIudG9DaGFyQXJyYXkoKTsvLyROT04tTkxTLTEkCisKKwkKIAlwdWJsaWMgYm9vbGVhbiBpc0VKQkFyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSkgewogCQkvLyBmaXJzdCBjaGVjayBmb3IgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgogCQlpZiAoYXJjaGl2ZVRvSmF2YUVFUXVpY2tQZWVrLmNvbnRhaW5zS2V5KGFyY2hpdmUpKSB7CkBAIC03NDAsNyArOTA4LDcgQEAKIAkJCQkJCQkJCUlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uc0F0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucygpOwogCQkJCQkJCQkJZm9yIChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKIAkJCQkJCQkJCQljaGFyW10gdHlwZWROYW1lID0gYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpOwotCQkJCQkJCQkJCWlmIChBcnJheXMuZXF1YWxzKHR5cGVkTmFtZSwgU1RBVEVMRVNTKSB8fCBBcnJheXMuZXF1YWxzKHR5cGVkTmFtZSwgU1RBVEVGVUwpIHx8IEFycmF5cy5lcXVhbHModHlwZWROYW1lLCBNRVNTQUdFRFJJVkVOKSkgeworCQkJCQkJCQkJCWlmIChBcnJheXMuZXF1YWxzKHR5cGVkTmFtZSwgU1RBVEVMRVNTKSB8fCBBcnJheXMuZXF1YWxzKHR5cGVkTmFtZSwgU1RBVEVGVUwpIHx8IEFycmF5cy5lcXVhbHModHlwZWROYW1lLCBNRVNTQUdFRFJJVkVOKSB8fCBBcnJheXMuZXF1YWxzKHR5cGVkTmFtZSwgU0lOR0xFVE9OKSkgewogCQkJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQkJCQkJCQl9CiAJCQkJCQkJCQl9CkBAIC03OTMsNjEgKzk2MSwyMiBAQAogCQlyZXR1cm4gbWFuaWZlc3Q7CiAJfQogCQotCQlwcml2YXRlIFN0cmluZyBnZXRFQVJMaWJEaXIoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50KSB7CiAKLQkJCS8vIGNoZWNrIGlmIHRoZSBFQVIgY29tcG9uZW50J3MgdmVyc2lvbiBpcyA1IG9yIGdyZWF0ZXIKLQkJCUlQcm9qZWN0IGVhclByb2plY3QgPSBlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJaWYgKCFKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkVFQ29tcG9uZW50KGVhckNvbXBvbmVudCwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5ERF9WRVJTSU9OKQotCQkJCQl8fCAhSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0pFRUNvbXBvbmVudChlYXJDb21wb25lbnQsIEphdmFFRVByb2plY3RVdGlsaXRpZXMuRkFDRVRfVkVSU0lPTikpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJLy8gZGVmYXVsdCBsaWIgZGlyIGlmIHRoZXJlIGlzIG5vIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCQkJLy8gb3IgaWYgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBkb2VzIG5vdCBvdmVycmlkZQotCQkJU3RyaW5nIGxpYkRpciA9IG5ldyBQYXRoKEoyRUVDb25zdGFudHMuRUFSX0RFRkFVTFRfTElCX0RJUikubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKLQkJCQotCQkJLy8gcmV0cmlldmUgdGhlIG1vZGVsIHByb3ZpZGVyCi0JCQlJTW9kZWxQcm92aWRlciBtb2RlbFByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihlYXJQcm9qZWN0KTsKLQkJCWlmIChtb2RlbFByb3ZpZGVyID09IG51bGwpewotCQkJCXJldHVybiBsaWJEaXI7Ci0JCQl9Ci0JCQkKLQkJCS8vIHJldHJpZXZlIHRoZSBFQVIncyBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbW9kZWwgb2JqZWN0IAotCQkJT2JqZWN0IG8gPSBtb2RlbFByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KG5ldyBQYXRoKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKSk7Ci0JCQlBcHBsaWNhdGlvbiBhcHAgPSBudWxsOwotCQkJLy8gY2hlY2sgdG8gc2VlIHRoZSB0eXBlIC0gaWYgdGhpcyBpcyBpbiBhIHByb2plY3Qgd2l0aCBhIGoyZWUgMS40IG9yIG9sZGVyIGZhY2V0LCBsaWIgZGlyIGlzIHVuYXZhaWxhYmxlLgotCQkJaWYgKG8gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbil7Ci0JCQkJYXBwID0gKEFwcGxpY2F0aW9uKSBvOwotCQkJfQotCQkJaWYgKGFwcCA9PSBudWxsKXsKLQkJCQlyZXR1cm4gbGliRGlyOwotCQkJfQotCQkJCi0JCQkvLyByZXRyaWV2ZSB0aGUgbGlicmFyeSBkaXJlY3RvcnkgZnJvbSB0aGUgbW9kZWwKLQkJCVN0cmluZyBkZExpYkRpciA9IGFwcC5nZXRMaWJyYXJ5RGlyZWN0b3J5KCk7Ci0JCQlpZiAoZGRMaWJEaXIgIT0gbnVsbCkgewotCQkJCWxpYkRpciA9IGRkTGliRGlyOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gbGliRGlyOwotCQkKLQkJfQotCQkJCi0JCXByaXZhdGUgYm9vbGVhbiBpc0luTGliRGlyKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXAsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGxpYkRpcil7Ci0JCQlpZiAobGliRGlyICE9IG51bGwgJiYgbGliRGlyLmxlbmd0aCgpID4gMCkgewotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIGVhclJlZiA9IGVhckNvbXAuZ2V0UmVmZXJlbmNlKGNvbXBvbmVudC5nZXROYW1lKCkpOwotCQkJCUlQYXRoIGxpYkRpclBhdGggPSBuZXcgUGF0aChsaWJEaXIpLm1ha2VSZWxhdGl2ZSgpOwotCQkJCWlmKGVhclJlZiAhPSBudWxsKXsKLQkJCQkJaWYobGliRGlyUGF0aC5lcXVhbHMoZWFyUmVmLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlKCkpKXsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCUlQYXRoIGZ1bGxQYXRoID0gZWFyUmVmLmdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGVhclJlZi5nZXRBcmNoaXZlTmFtZSgpKTsKLQkJCQkJaWYoZnVsbFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLm1ha2VSZWxhdGl2ZSgpLmVxdWFscyhsaWJEaXJQYXRoKSl7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQorCXByaXZhdGUgYm9vbGVhbiBpc0luTGliRGlyKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXAsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGxpYkRpcil7CisJCWlmIChsaWJEaXIgIT0gbnVsbCAmJiBsaWJEaXIubGVuZ3RoKCkgPiAwKSB7CisJCQlJVmlydHVhbFJlZmVyZW5jZSBlYXJSZWYgPSBlYXJDb21wLmdldFJlZmVyZW5jZShjb21wb25lbnQuZ2V0TmFtZSgpKTsKKwkJCUlQYXRoIGxpYkRpclBhdGggPSBuZXcgUGF0aChsaWJEaXIpLm1ha2VSZWxhdGl2ZSgpOworCQkJaWYoZWFyUmVmICE9IG51bGwpeworCQkJCWlmKGxpYkRpclBhdGguZXF1YWxzKGVhclJlZi5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpKSl7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQlJUGF0aCBmdWxsUGF0aCA9IGVhclJlZi5nZXRSdW50aW1lUGF0aCgpLmFwcGVuZChlYXJSZWYuZ2V0QXJjaGl2ZU5hbWUoKSk7CisJCQkJaWYoZnVsbFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLm1ha2VSZWxhdGl2ZSgpLmVxdWFscyhsaWJEaXJQYXRoKSl7CisJCQkJCXJldHVybiB0cnVlOwogCQkJCX0KIAkJCX0KLQkJCXJldHVybiBmYWxzZTsKIAkJfQotCisJCXJldHVybiBmYWxzZTsKKwl9CisJCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KYXZhRUVFTUZBcmNoaXZlQWRhcHRlckhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSmF2YUVFRU1GQXJjaGl2ZUFkYXB0ZXJIZWxwZXIuamF2YQppbmRleCBhOGQxMjViLi5jNzE0OWNlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KYXZhRUVFTUZBcmNoaXZlQWRhcHRlckhlbHBlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0phdmFFRUVNRkFyY2hpdmVBZGFwdGVySGVscGVyLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAKIAkJcHVibGljIEphdmFFRUVNRkFyY2hpdmVBZGFwdGVySGVscGVyIGdldEhlbHBlcigpIHsKIAkJCXJldHVybiB0aGlzLmhlbHBlcjsKIAkJfQotCX07CisJfQogCiAJcHJvdGVjdGVkIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwogCkBAIC0xNTcsNyArMTU3LDcgQEAKIAogCXB1YmxpYyB2b2lkIGluaXRpYWxpemVSZXNvdXJjZVNldCgpIHsKIAkJUmVzb3VyY2VTZXQgcnMgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCkgewotCQkJZmluYWwgU3RyaW5nIEpBVkFfUFJPVE9DT0xfVVJJX1NDSEVNRSA9ICJqYXZhIjsKKwkJCWZpbmFsIFN0cmluZyBKQVZBX1BST1RPQ09MX1VSSV9TQ0hFTUUgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKIAkJCXByaXZhdGUgSUNvbnRlbnREZXNjcmlwdGlvbiBnZXRDb250ZW50RGVzY3JpcHRpb24oVVJJIHVyaSkgewogCQkJCUlBcmNoaXZlUmVzb3VyY2UgYXJjaGl2ZVJlc291cmNlID0gbnVsbDsKIAkJCQlJbnB1dFN0cmVhbSBpb1N0cmVhbSA9IG51bGw7CkBAIC0xODQsMTAgKzE4NCwxMiBAQAogCQkJCX0KIAkJCX0KIAorCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewogCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZSh1cmksIENvbnRlbnRIYW5kbGVyLlVOU1BFQ0lGSUVEX0NPTlRFTlRfVFlQRSk7CiAJCQl9CiAJCQkKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFN0cmluZyBjb250ZW50VHlwZSkgewogCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwogCQkJCWlmICghaXNKYXZhVVJJKHVyaSkpCkBAIC0yMzcsOSArMjM5LDggQEAKIAkJCQkJUmVzb3VyY2UgcmVzdWx0ID0gcmVzb3VyY2VGYWN0b3J5LmNyZWF0ZVJlc291cmNlKHVyaSk7CiAJCQkJCWdldFJlc291cmNlcygpLmFkZChyZXN1bHQpOwogCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwogCQkJCX0KKwkJCQlyZXR1cm4gbnVsbDsKIAkJCX0KIAogCQkJcHJpdmF0ZSBib29sZWFuIGlzSmF2YVVSSShVUkkgdXJpKSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KYXZhRUVFTUZaaXBGaWxlTG9hZEFkYXB0ZXJJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9KYXZhRUVFTUZaaXBGaWxlTG9hZEFkYXB0ZXJJbXBsLmphdmEKaW5kZXggMzZhYTUyMC4uZTM2NGI5NSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvSmF2YUVFRU1GWmlwRmlsZUxvYWRBZGFwdGVySW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL0phdmFFRUVNRlppcEZpbGVMb2FkQWRhcHRlckltcGwuamF2YQpAQCAtMzEsNiArMzEsNyBAQAogCQlzdXBlcih6aXBGaWxlKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUpIHsKIAkJc3VwZXIuc2V0QXJjaGl2ZShhcmNoaXZlKTsKIAkJZW1mSGVscGVyLnNldEFyY2hpdmUoYXJjaGl2ZSk7CkBAIC00MCwxMCArNDEsMTIgQEAKIAkJcmV0dXJuIGVtZkhlbHBlci5nZXRSZXNvdXJjZShyZXNvdXJjZVBhdGgpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBjb250YWluc01vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgewogCQlyZXR1cm4gZW1mSGVscGVyLmNvbnRhaW5zTW9kZWxPYmplY3QobW9kZWxPYmplY3RQYXRoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KElQYXRoIG1vZGVsT2JqZWN0UGF0aCkgdGhyb3dzIEFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb24gewogCQlyZXR1cm4gZW1mSGVscGVyLmdldE1vZGVsT2JqZWN0KG1vZGVsT2JqZWN0UGF0aCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvV2ViQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9XZWJDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQppbmRleCA0ZDM0MzEzLi5jMWMwNGI2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9XZWJDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9XZWJDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIuamF2YQpAQCAtMTIsMjEgKzEyLDI1IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuSUNsYXNzcGF0aERlcGVuZGVuY3lDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLklDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLklDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU9wdGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwogCkBAIC0zNCw2ICszOCw4IEBACiAKIAlwdWJsaWMgc3RhdGljIElQYXRoIFdFQkxJQiA9IG5ldyBQYXRoKCIvV0VCLUlORi9saWIiKTsgLy8kTk9OLU5MUy0xJAogCQorCXByaXZhdGUgTWFwPElQYXRoLCBJUmVzb3VyY2U+IHBhdGhzVG9Xb3JrYmVuY2hMaWJKYXJzID0gbmV3IEhhc2hNYXA8SVBhdGgsIElSZXNvdXJjZT4oKTsKKwkKIAlwdWJsaWMgV2ViQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKIAkJc3VwZXIodkNvbXBvbmVudCk7CiAJfQpAQCAtNDIsNiArNDgsNyBAQAogCQlzdXBlcih2Q29tcG9uZW50LCBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgPElBcmNoaXZlUmVzb3VyY2U+IGdldEFyY2hpdmVSZXNvdXJjZXMoKSB7CiAJCXN1cGVyLmdldEFyY2hpdmVSZXNvdXJjZXMoKTsKIAkJYWRkTG9vc2VMaWJKQVJzVG9GaWxlcygpOwpAQCAtNjUsNyArNzIsNyBAQAogCQkJCXJlc3VsdC5hZGQocmVmQ29tcG9uZW50c1tpXSk7CiAJCX0KIAotCQlyZXR1cm4gKElWaXJ0dWFsUmVmZXJlbmNlW10pIHJlc3VsdC50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtyZXN1bHQuc2l6ZSgpXSk7CisJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbcmVzdWx0LnNpemUoKV0pOwogCiAJfQogCkBAIC03NSwxMiArODIsNyBAQAogCQkJSVZpcnR1YWxSZWZlcmVuY2UgaUxpYk1vZHVsZSA9IGxpYk1vZHVsZXNbaV07CiAJCQlJVmlydHVhbENvbXBvbmVudCBsb29zZUNvbXBvbmVudCA9IGlMaWJNb2R1bGUuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwogCQkJaWYgKGxvb3NlQ29tcG9uZW50LmlzQmluYXJ5KCkpIHsKLQkJCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBhcmNoaXZlQ29tcCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgbG9vc2VDb21wb25lbnQ7Ci0JCQkJamF2YS5pby5GaWxlIGRpc2tGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7Ci0JCQkJaWYgKCFkaXNrRmlsZS5leGlzdHMoKSkgewotCQkJCQlJRmlsZSB3YkZpbGUgPSBhcmNoaXZlQ29tcC5nZXRVbmRlcmx5aW5nV29ya2JlbmNoRmlsZSgpOwotCQkJCQlkaXNrRmlsZSA9IG5ldyBGaWxlKHdiRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJfQorCQkJCWphdmEuaW8uRmlsZSBkaXNrRmlsZSA9IChqYXZhLmlvLkZpbGUpbG9vc2VDb21wb25lbnQuZ2V0QWRhcHRlcihqYXZhLmlvLkZpbGUuY2xhc3MpOwogCQkJCUlQYXRoIHVyaSA9IGlMaWJNb2R1bGUuZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKS5hcHBlbmQoIi8iICsgZGlza0ZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAogCQkJCWFkZEV4dGVybmFsRmlsZSh1cmksIGRpc2tGaWxlKTsJCQkJCiAJCQl9IGVsc2UgewpAQCAtODksNyArOTEsNyBAQAogCQkJCWlmIChhcmNoaXZlTmFtZSAhPSBudWxsICYmIGFyY2hpdmVOYW1lLmxlbmd0aCgpID4gMCkgewogCQkJCQluYW1lID0gYXJjaGl2ZU5hbWU7CiAJCQkJfSBlbHNlIHsKLQkJCQkJbmFtZSA9IGxvb3NlQ29tcG9uZW50LmdldE5hbWUoKSArICIuamFyIjsgLy8kTk9OLU5MUy0xJAorCQkJCQluYW1lID0gbG9vc2VDb21wb25lbnQuZ2V0TmFtZSgpICsgSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVDsKIAkJCQl9CiAJCQkJU3RyaW5nIHByZWZpeCA9IGlMaWJNb2R1bGUuZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOwogCQkJCWlmIChwcmVmaXgubGVuZ3RoKCkgPiAwICYmIHByZWZpeC5jaGFyQXQocHJlZml4Lmxlbmd0aCgpIC0gMSkhPSAnLycpIHsKQEAgLTEwOCw2ICsxMTAsOCBAQAogCQkJCQl3ZWJMaWJBcmNoaXZlID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5vcGVuQXJjaGl2ZSh3ZWJMaWJPcHRpb25zKTsKIAkJCQkJd2ViTGliQXJjaGl2ZS5zZXRQYXRoKG5ldyBQYXRoKHVyaSkpOwogCQkJCQl3ZWJMaWJBcmNoaXZlLnNldEFyY2hpdmUoYXJjaGl2ZSk7CisJCQkJCS8vc2F2ZSBqYXIgZmlsZSBzaW5jZSBpdCBpcyBsYXRlciByZW1vdmVkIGZyb20gZmlsZXNIb2xkZXIKKwkJCQkJYWRkRmlsZSh3ZWJMaWJBcmNoaXZlLmdldFBhdGgoKSk7CiAJCQkJCS8vdGhpcyBpcyBpbiBjYXNlIHRoZXJlIGlzIGEgamFyIGluIHRoZSBXRUItSU5GL2xpYiBmb2xkZXIgd2hpY2ggaXMgYWxzbwogCQkJCQkvL21hcHBlZCBhcyBhIHByb2plY3QuICBJZiBpdCBpcyBub3QgcmVtb3ZlZCBoZXJlLCB0aGVuIGV4cG9ydCB3aWxsIGluY2x1ZGUKIAkJCQkJLy90aGUgamFyIHZlcnNpb24gaW5zdGVhZCBvZiB0aGUgcHJvamVjdCB2ZXJzaW9uLgpAQCAtMTE1LDMwICsxMTksMzYgQEAKIAkJCQkJZmlsZXNIb2xkZXIuYWRkRmlsZSh3ZWJMaWJBcmNoaXZlKTsKIAkJCQl9IGNhdGNoIChBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewogCQkJCQlTdHJpbmcgbWVzc2FnZSA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5VTkFCTEVfVE9fTE9BRF9NT0RVTEVfRVJST1JfLCBuZXcgT2JqZWN0W117dXJpLCBnZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBlLmdldE1lc3NhZ2UoKX0pOwotCQkJCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ1RyYWNlKG1lc3NhZ2UpOworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKG1lc3NhZ2UpOwogCQkJCX0KIAkJCX0KIAkJfQogCX0KKworCXByaXZhdGUgdm9pZCBhZGRGaWxlKElQYXRoIGRlcGxveVBhdGgpIHsKKwkJSVJlc291cmNlIHdlYmxpYkphciA9IGdldFdvcmtiZW5jaFJlc291cmNlcyhkZXBsb3lQYXRoKTsKKwkJaWYgKHdlYmxpYkphciAhPSBudWxsKSB7CisJCQlwYXRoc1RvV29ya2JlbmNoTGliSmFycy5wdXQoZGVwbG95UGF0aCwgd2VibGliSmFyKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgSVJlc291cmNlIGdldFdvcmtiZW5jaExpYkphcnMoSVBhdGggZGVwbG95UGF0aCkgeworCQlyZXR1cm4gcGF0aHNUb1dvcmtiZW5jaExpYkphcnMuZ2V0KGRlcGxveVBhdGgpOworCX0KIAkKIAlwcml2YXRlIHZvaWQgYWRkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzKGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQpIHsKIAkJLy8gcmV0cmlldmUgYWxsIEphdmEgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMKLQkJaWYgKGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzICYmIHJlZmVyZW5jZWRDb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBjcFJlZnMgPSAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOworCQlpZiAoaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMgJiYgcmVmZXJlbmNlZENvbXBvbmVudCBpbnN0YW5jZW9mIElDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXIpIHsKKwkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gY3BSZWZzID0gKChJQ2xhc3NwYXRoRGVwZW5kZW5jeVByb3ZpZGVyKSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOwogCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjcFJlZnMubGVuZ3RoOyBqKyspIHsKIAkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBjcFJlZnNbal07CiAJCQkJZmluYWwgSVBhdGggcnVudGltZVBhdGggPSByZWYuZ2V0UnVudGltZVBhdGgoKTsKIAkJCQkKIAkJCQkvLyBvbmx5IHByb2Nlc3MgLi4vIG1hcHBpbmdzCi0JCQkJaWYgKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudAorCQkJCWlmIChyZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpIGluc3RhbmNlb2YgSUNsYXNzcGF0aERlcGVuZGVuY3lDb21wb25lbnQKIAkJCQkJCSYmIHJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCkpIHsKLQkJCQkJZmluYWwgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCkgcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJRmlsZSBjcEVudHJ5RmlsZSA9IGNvbXAuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7Ci0JCQkJCWlmICghY3BFbnRyeUZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCWZpbmFsIElGaWxlIHdiRmlsZSA9IGNvbXAuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCQkJCWNwRW50cnlGaWxlID0gbmV3IEZpbGUod2JGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJCQkJfQotCQkJCQlhZGRFeHRlcm5hbEZpbGUobmV3IFBhdGgoIldFQi1JTkYvbGliLyIgKyByZWYuZ2V0QXJjaGl2ZU5hbWUoKSksIGNwRW50cnlGaWxlKTsKKwkJCQkJRmlsZSBjcEVudHJ5RmlsZSA9IChqYXZhLmlvLkZpbGUpcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRBZGFwdGVyKGphdmEuaW8uRmlsZS5jbGFzcyk7CisJCQkJCWFkZEV4dGVybmFsRmlsZShuZXcgUGF0aCgiV0VCLUlORi9saWIvIiArIHJlZi5nZXRBcmNoaXZlTmFtZSgpKSwgY3BFbnRyeUZpbGUpOyAvLyROT04tTkxTLTEkCiAJCQkJfQogCQkJfQogCQl9CkBAIC0xNDgsNSArMTU4LDQgQEAKIAlwcm90ZWN0ZWQgSVBhdGggZ2V0RGVmYXVsdE1vZGVsT2JqZWN0UGF0aCgpIHsKIAkJcmV0dXJuIG5ldyBQYXRoKEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSk7CiAJfQotCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9XZWJDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL1dlYkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCmluZGV4IGRhMjQxNzkuLmY2Njc3ZTkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL1dlYkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL1dlYkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuSUFyY2hpdmVSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwpAQCAtMjgsMjQgKzI5LDI4IEBACiAKIHB1YmxpYyBjbGFzcyBXZWJDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIgZXh0ZW5kcyBKMkVFQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIHsKIAotCXByaXZhdGUgSVBhdGggSU1QT1JURURfQ0xBU1NFU19QQVRIID0gbmV3IFBhdGgoIi8iICsgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOworCXByaXZhdGUgSVBhdGggSU1QT1JURURfQ0xBU1NFU19QQVRIID0gbmV3IFBhdGgoIi8iICsgQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkpOyAvLyROT04tTkxTLTEkCiAJCiAJcHVibGljIFdlYkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcihJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50KSB7CiAJCXN1cGVyKHZDb21wb25lbnQpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFkZEltcG9ydGVkQ2xhc3Nlc1RvQ2xhc3NwYXRoKCkgewogCQlyZXR1cm4gZmFsc2U7IC8vIG5ldmVyIGFkZCB0byBjbGFzc3BhdGggYmVjYXVzZSB0aGUgd2ViIGFwcCBjb250YWluZXIgd2lsbCBwaWNrIHRoaXMgdXAuCiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElQYXRoIGdldEltcG9ydGVkQ2xhc3Nlc1VSSShJQXJjaGl2ZVJlc291cmNlIGFGaWxlKXsKIAkJcmV0dXJuIGFGaWxlLmdldFBhdGgoKS5tYWtlUmVsYXRpdmUoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKElNUE9SVEVEX0NMQVNTRVNfUEFUSC5zZWdtZW50Q291bnQoKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElQYXRoIGdldEltcG9ydGVkQ2xhc3Nlc1J1bnRpbWVQYXRoKCkgewogCQlyZXR1cm4gSU1QT1JURURfQ0xBU1NFU19QQVRIOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgSVBhdGggZ2V0UHJvamVjdFJlbGF0aXZlUGF0aChJQXJjaGl2ZVJlc291cmNlIGFGaWxlKSB7CiAJCWlmIChudWxsICE9IG5vblN0YW5kYXJkU291cmNlRmlsZXMgJiYgbm9uU3RhbmRhcmRTb3VyY2VGaWxlcy5jb250YWluc0tleShhRmlsZSkpIHsKIAkJCUlQYXRoIHBhdGggPSBub25TdGFuZGFyZFNvdXJjZUZpbGVzLmdldChhRmlsZSk7CkBAIC03Myw2ICs3OCw3IEBACiAJICovCiAJcHJvdGVjdGVkIE1hcDxJQXJjaGl2ZVJlc291cmNlLCBJUGF0aD4gbm9uU3RhbmRhcmRTb3VyY2VGaWxlczsKIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIGlzQ2xhc3NXaXRob3V0U291cmNlKElBcmNoaXZlUmVzb3VyY2UgYUZpbGUpIHsKIAkJU3RyaW5nIGphdmFVcmkgPSBBcmNoaXZlVXRpbC5jbGFzc1VyaVRvSmF2YVVyaShhRmlsZS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7CiAJCWlmIChqYXZhVXJpID09IG51bGwpCkBAIC04NSw3ICs5MSw3IEBACiAJCVN0cmluZyBqc3BVcmkgPSBqYXZhVXJpLnN1YnN0cmluZygwLCBqYXZhVXJpLmluZGV4T2YoQXJjaGl2ZVV0aWwuRE9UX0pBVkEpKTsKIAkJaW50IGxhc3RTbGFzaCA9IGpzcFVyaS5sYXN0SW5kZXhPZignLycpOwogCQlpbnQgX2luZGV4ID0gbGFzdFNsYXNoID09IC0xID8gQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkkubGVuZ3RoKCkgOiBsYXN0U2xhc2ggKyAxOwotCQlpZiAoanNwVXJpLmxlbmd0aCgpID49IF9pbmRleCAmJiBqc3BVcmkuY2hhckF0KF9pbmRleCkgPT0gJ18nKSB7CisJCWlmIChqc3BVcmkubGVuZ3RoKCkgPiBfaW5kZXggJiYganNwVXJpLmNoYXJBdChfaW5kZXgpID09ICdfJykgewogCQkJanNwVXJpID0ganNwVXJpLnN1YnN0cmluZyhBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9DTEFTU0VTX1VSSS5sZW5ndGgoKSwgX2luZGV4KSArIGpzcFVyaS5zdWJzdHJpbmcoX2luZGV4ICsgMSkgKyBBcmNoaXZlVXRpbC5ET1RfSlNQOwogCQkJSVBhdGgganNwUGF0aCA9IG5ldyBQYXRoKGpzcFVyaSk7CiAJCQlpZiAoYXJjaGl2ZS5jb250YWluc0FyY2hpdmVSZXNvdXJjZShqc3BQYXRoKSkgewpAQCAtOTcsOCArMTAzLDggQEAKIAkJLy9UaGUgZm9ybWF0IHdhcyB0byBpbmNsdWRlIHRoZSBzb3VyY2UgZmlsZXMgaW4gYSBkaXJlY3RvcnkgY2FsbGVkIHNvdXJjZSBpbiBXRUItSU5GCiAJCS8vRXhhbXBsZTogY2xhc3MgIGlzIGluIFdFQi1JTkYvY2xhc3Nlcy90ZXN0L0Zvby5jbGFzcwogCQkvLyAgICAgICAgIHNvdXJjZSBpcyBpbiBXRUItSU5GL3NvdXJjZS90ZXN0L0Zvby5qYXZhCi0JCWlmKGphdmFQYXRoLnNlZ21lbnRDb3VudCgpID4gMiAmJiBqYXZhUGF0aC5zZWdtZW50KDApLmVxdWFscygiV0VCLUlORiIpICYmIGphdmFQYXRoLnNlZ21lbnQoMSkuZXF1YWxzKCJjbGFzc2VzIikpewotCQkJU3RyaW5nIGFsdGVybmF0ZUphdmFVcmkgPSBqYXZhVXJpLnJlcGxhY2VGaXJzdCgiY2xhc3NlcyIsICJzb3VyY2UiKTsKKwkJaWYoamF2YVBhdGguc2VnbWVudENvdW50KCkgPiAyICYmIGphdmFQYXRoLnNlZ21lbnQoMCkuZXF1YWxzKCJXRUItSU5GIikgJiYgamF2YVBhdGguc2VnbWVudCgxKS5lcXVhbHMoImNsYXNzZXMiKSl7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJU3RyaW5nIGFsdGVybmF0ZUphdmFVcmkgPSBqYXZhVXJpLnJlcGxhY2VGaXJzdCgiY2xhc3NlcyIsICJzb3VyY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQlJUGF0aCBhbHRlcm5hdGVKYXZhUGF0aCA9IG5ldyBQYXRoKGFsdGVybmF0ZUphdmFVcmkpOwogCQkJaWYgKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoYWx0ZXJuYXRlSmF2YVBhdGgpKXsKIAkJCQlJQXJjaGl2ZVJlc291cmNlIHNvdXJjZUZpbGU7CkBAIC0xMTQsMTQgKzEyMCwxMCBAQAogCQkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCQl9CiAJCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCX0KLQkJCQkKIAkJCX0KLQkJCQogCQl9Ci0JCQogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAJCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UxOGNjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvbWVzc2FnZXMucHJvcGVydGllcwpAQCAtMCwwICsxLDMgQEAKK0NvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcl9JbXBvcnRpbmdfMF89SW1wb3J0aW5nIHswfQorQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbF9PcGVuZXJfb2ZfQXJjaGl2ZV9kaWRfbm90X2Nsb3NlX2l0Xz1PcGVuZXIgb2YgQXJjaGl2ZSBkaWQgbm90IGNsb3NlIGl0LiAgVGhpcyBjb3VsZCBsZWFkIHRvIGEgZmlsZSBsb2NrLgorQ29ubmVjdG9yQ29tcG9uZW50TmVzdGVkSkFSQXJjaGl2ZUxvYWRBZGFwdGVyX1VuYWJsZV90b19nZXRfY29udGVudHNfZnJvbV8wX21lc189VW5hYmxlIHRvIGdldCBjb250ZW50cyBmcm9tIHswfSBtZXNzYWdlIHsxfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9BcHBDbGllbnRDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEKaW5kZXggNTcxYzVmNy4uN2MxMDVjMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9BcHBDbGllbnRDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0FwcENsaWVudENvbXBvbmVudEV4cG9ydE9wZXJhdGlvbi5qYXZhCkBAIC0xMCw1NiArMTAsMTUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnM7CiAKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5KYXZhRUVBcmNoaXZlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKIAorLyoqCisgKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkphdmFFRUNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbiBpbnN0ZWFkCisgKi8KIHB1YmxpYyBjbGFzcyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnRPcGVyYXRpb24gZXh0ZW5kcyBKMkVFQXJ0aWZhY3RFeHBvcnRPcGVyYXRpb24gewogCiAJcHVibGljIEFwcENsaWVudENvbXBvbmVudEV4cG9ydE9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7CiAJCXN1cGVyKG1vZGVsKTsKIAl9CiAKLQlwdWJsaWMgdm9pZCBleHBvcnQoKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIEVYUE9SVF9XT1JLKTsKLQkJSUFyY2hpdmUgYXJjaGl2ZUZyb21Db21wb25lbnQgPSBudWxsOwotCQl0cnkgewotCQkJYXJjaGl2ZUZyb21Db21wb25lbnQgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLm9wZW5BcmNoaXZlKGdldENvbXBvbmVudCgpKTsKLQkJCUphdmFFRVF1aWNrUGVlayBxdWlja1BlZWsgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmdldEphdmFFRVF1aWNrUGVlayhhcmNoaXZlRnJvbUNvbXBvbmVudCk7Ci0JCQlpZiAocXVpY2tQZWVrLmdldEphdmFFRVZlcnNpb24oKSA9PSBKMkVFQ29uc3RhbnRzLkpFRV81XzBfSUQpIHsKLQkJCQlzYXZlQXJjaGl2ZShhcmNoaXZlRnJvbUNvbXBvbmVudCwgZ2V0RGVzdGluYXRpb25QYXRoKCkudG9PU1N0cmluZygpLCBzdWJNb25pdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQ29tbW9uYXJjaGl2ZUZhY3RvcnkgY2FmID0gKChDb21tb25hcmNoaXZlUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZU5TX1VSSSkpLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0JCQkJQXBwQ2xpZW50Q29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCBscyA9IG5ldyBBcHBDbGllbnRDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKGdldENvbXBvbmVudCgpKTsKLQkJCQlscy5zZXRFeHBvcnRTb3VyY2UoaXNFeHBvcnRTb3VyY2UoKSk7Ci0JCQkJc2V0TW9kdWxlRmlsZShjYWYub3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShscywgZ2V0RGVzdGluYXRpb25QYXRoKCkudG9PU1N0cmluZygpKSk7Ci0JCQkJbHMuc2V0UHJvZ3Jlc3NNb25pdG9yKHN1Yk1vbml0b3IpOwotCQkJCWdldE1vZHVsZUZpbGUoKS5zYXZlQXNOb1Jlb3BlbihnZXREZXN0aW5hdGlvblBhdGgoKS50b09TU3RyaW5nKCkpOwotCQkJfQotCQl9IGNhdGNoIChTYXZlRmFpbHVyZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2F2ZUZhaWx1cmVFeGNlcHRpb24oQXBwQ2xpZW50QXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlci5BUkNISVZFX09QRVJBVElPTl9PcGVuaW5nQXJjaGl2ZSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYXJjaGl2ZUZyb21Db21wb25lbnQgIT0gbnVsbCkKLQkJCQlKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmNsb3NlQXJjaGl2ZShhcmNoaXZlRnJvbUNvbXBvbmVudCk7Ci0JCQlzdWJNb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYXJjaGl2ZVN0cmluZygpIHsKLQkJcmV0dXJuIEFwcENsaWVudEFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuQXBwbGljYXRpb25fQ2xpZW50X0ZpbGVfVUlfOyAKLQl9Ci0KIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0FwcENsaWVudENvbXBvbmVudEltcG9ydE9wZXJhdGlvbi5qYXZhCmluZGV4IDQ3YzIyNmYuLjdmYjYwYjIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0T3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9BcHBDbGllbnRDb21wb25lbnRJbXBvcnRPcGVyYXRpb24uamF2YQpAQCAtMTAsNyArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFwcENsaWVudENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwpAQCAtMjIsMTEgKzIxLDcgQEAKIAkJc3VwZXIobW9kZWwpOwogCX0KIAotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlU2F2ZVN0cmF0ZWd5KElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQpIHsKLQkJQXBwQ2xpZW50Q29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCBzYXZlU3RyYXQgPSBuZXcgQXBwQ2xpZW50Q29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCh2aXJ0dWFsQ29tcG9uZW50KTsKLQkJcmV0dXJuIHNhdmVTdHJhdDsKLQl9Ci0JCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlciBnZXRBcmNoaXZlU2F2ZUFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCkgewogCQlyZXR1cm4gbmV3IEFwcENsaWVudENvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcih2aXJ0dWFsQ29tcG9uZW50KTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0FwcENsaWVudENvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQXBwQ2xpZW50Q29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IDFiM2M3OGIuLjFmOGM0NGQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQXBwQ2xpZW50Q29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQXBwQ2xpZW50Q29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiAJCXN1cGVyKHZDb21wb25lbnQpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKSB7CiAJCWlmKGFydGlmYWN0RWRpdCA9PSBudWxsKXsKIAkJCWFydGlmYWN0RWRpdCA9IEFwcENsaWVudEFydGlmYWN0RWRpdC5nZXRBcHBDbGllbnRBcnRpZmFjdEVkaXRGb3JSZWFkKHZDb21wb25lbnQpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9BcHBDbGllbnRDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0FwcENsaWVudENvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQppbmRleCA3Yzc2OWJkLi40ZDAyN2NiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0FwcENsaWVudENvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0FwcENsaWVudENvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQpAQCAtMTIsNiArMTIsMTIgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiAKKy8qKgorICogQGRlcHJlY2F0ZWQgdGhpcyB3aWxsIGJlIGRlbGV0ZWQgcG9zdCBXVFAgMy4yLiAgVGhpcyBjb2RlIGlzIG5vIGxvbmdlcgorICogY2FsbGVkIGJlY2F1c2UgdGhlIElBcmNoaXZlIEFQSSBpcyB1c2VkIHRvIGhhbmRsZSBpbXBvcnRzLgorICogCisgKiBAYXV0aG9yIGpzaG9sbAorICovCiBwdWJsaWMgY2xhc3MgQXBwQ2xpZW50Q29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCBleHRlbmRzIEoyRUVDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIHsKIAogCXB1YmxpYyBBcHBDbGllbnRDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0NvbXBvbmVudEV4cG9ydE9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZmNmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0NvbXBvbmVudEV4cG9ydE9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zOworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX0RFU1RJTkFUSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRVhQT1JUX1NPVVJDRV9GSUxFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLk9QVElNSVpFX0ZPUl9TUEVDSUZJQ19SVU5USU1FOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUlVOVElNRV9TUEVDSUZJQ19QQVJUSUNJUEFOVFM7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5SVU5fQlVJTEQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUnVsZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllcy5JQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50RGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkFyY2hpdmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXR0ZW5QYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24geworCisJcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOworCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50OworCXByaXZhdGUgSVBhdGggZGVzdGluYXRpb25QYXRoOworCXByaXZhdGUgYm9vbGVhbiBleHBvcnRTb3VyY2UgPSBmYWxzZTsKKwkKKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIERPVF9GSUxFX05BTUVTID0gbmV3IFN0cmluZ1tdIHsKKwkJIi5wcm9qZWN0IiwgCS8vJE5PTi1OTFMtMSQKKwkJIi5jbGFzc3BhdGgiLCAJLy8kTk9OLU5MUy0xJAorCQkiLmN2c2lnbm9yZSIsIAkvLyROT04tTkxTLTEkCisJfTsKKworCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gRE9UX1NPVVJDRV9GSUxFUyA9IG5ldyBTdHJpbmdbXSB7CisJCSIuamF2YSIsCQkvLyROT04tTkxTLTEkCisJCSIuc3FsaiIsCQkvLyROT04tTkxTLTEkCisJfTsKKworCisJcHVibGljIENvbXBvbmVudEV4cG9ydE9wZXJhdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKKwkJc3VwZXIobW9kZWwpOworCX0KKwkKKwlwcm90ZWN0ZWQgZmluYWwgaW50IFJFRlJFU0hfV09SSyA9IDEwMDsKKwlwcm90ZWN0ZWQgZmluYWwgaW50IEpBVkFfQlVJTERFUl9XT1JLID0gMTAwOworCXByb3RlY3RlZCBmaW5hbCBpbnQgRVhQT1JUX1dPUksgPSAxMDAwOworCXByb3RlY3RlZCBmaW5hbCBpbnQgQ0xPU0VfV09SSyA9IDEwOworCXByb3RlY3RlZCBmaW5hbCBpbnQgU0lOR0xFX1BBUlRJQ0lQQU5UX1dPUksgPSAyMDA7CisJCisJcHJvdGVjdGVkIGludCBjb21wdXRlVG90YWxXb3JrKCkgeworCQlpbnQgdG90YWxXb3JrID0gUkVGUkVTSF9XT1JLOworCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFJVTl9CVUlMRCkpIHsKKwkJCXRvdGFsV29yayArPSBKQVZBX0JVSUxERVJfV09SSzsKKwkJfQorCQl0b3RhbFdvcmsgKz0gRVhQT1JUX1dPUksgKyBDTE9TRV9XT1JLOworCQkKKwkJZmluYWwgSURhdGFNb2RlbCBkbSA9IGdldERhdGFNb2RlbCgpOworCQkKKwkJaWYgKGRtLmdldFByb3BlcnR5KE9QVElNSVpFX0ZPUl9TUEVDSUZJQ19SVU5USU1FKSA9PSBCb29sZWFuLlRSVUUpIHsKKyAgICAJCWZpbmFsIExpc3Q8SUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudERhdGE+IGV4dGVuc2lvbnMKKyAgICAJCSAgICA9IChMaXN0PElBcmNoaXZlRXhwb3J0UGFydGljaXBhbnREYXRhPikgZG0uZ2V0UHJvcGVydHkoUlVOVElNRV9TUEVDSUZJQ19QQVJUSUNJUEFOVFMpOworICAgIAkJICAgIAorICAgIAkJdG90YWxXb3JrICs9IGV4dGVuc2lvbnMuc2l6ZSgpICogU0lOR0xFX1BBUlRJQ0lQQU5UX1dPUks7CisJCX0gIAorCQlyZXR1cm4gdG90YWxXb3JrOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJc2V0Q29tcG9uZW50KChJVmlydHVhbENvbXBvbmVudCkgbW9kZWwuZ2V0UHJvcGVydHkoQ09NUE9ORU5UKSk7CisJCXNldERlc3RpbmF0aW9uUGF0aChuZXcgUGF0aChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShBUkNISVZFX0RFU1RJTkFUSU9OKSkpOworCQlzZXRFeHBvcnRTb3VyY2UobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KEVYUE9SVF9TT1VSQ0VfRklMRVMpKTsKKwkJCisJCXRyeSB7CisJCSAgICBtb25pdG9yLmJlZ2luVGFzayhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuRXhwb3J0aW5nX2FyY2hpdmUsIG5ldyBPYmplY3QgW10geyBnZXREZXN0aW5hdGlvblBhdGgoKS5sYXN0U2VnbWVudCgpIH0pLCBjb21wdXRlVG90YWxXb3JrKCkpOworICAgICAgICAgICAgc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOworICAgIAkJdHJ5IHsKKyAgICAJCQljb21wb25lbnQuZ2V0UHJvamVjdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgUkVGUkVTSF9XT1JLKSk7CisgICAgCQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShSVU5fQlVJTEQpKSB7CisgICAgCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7CisgICAgCQkJCWludCB3b3JrID0gKEpBVkFfQlVJTERFUl9XT1JLKSAvIChyZWZzLmxlbmd0aCArIDEpOworICAgIAkJCQlydW5OZWNlc3NhcnlCdWlsZGVycyhjb21wb25lbnQsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgd29yaykpOworICAgIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKKyAgICAJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHJlZkNvbXAgPSByZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKKyAgICAJCQkJCXJ1bk5lY2Vzc2FyeUJ1aWxkZXJzKHJlZkNvbXAsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgd29yaykpOworICAgIAkJCQl9CisgICAgCQkJfQorICAgIAkJCWV4cG9ydCgpOworICAgIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKEVKQkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuRXJyb3JfZXhwb3J0aW5nX19VSV8gKyBnZXREZXN0aW5hdGlvblBhdGgoKSwgZSk7CisgICAgCQl9CisgICAgCQkKKyAgICAgICAgICAgIGZpbmFsIElEYXRhTW9kZWwgZG0gPSBnZXREYXRhTW9kZWwoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGRtLmdldFByb3BlcnR5KE9QVElNSVpFX0ZPUl9TUEVDSUZJQ19SVU5USU1FKSA9PSBCb29sZWFuLlRSVUUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKElBcmNoaXZlRXhwb3J0UGFydGljaXBhbnREYXRhIGV4dERhdGEgOiAoTGlzdDxJQXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50RGF0YT4pIGRtLmdldFByb3BlcnR5KCBSVU5USU1FX1NQRUNJRklDX1BBUlRJQ0lQQU5UUykpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgSURhdGFNb2RlbE9wZXJhdGlvbiBvcCA9IGV4dERhdGEuZ2V0UGFydGljaXBhbnQoKS5jcmVhdGVPcGVyYXRpb24oIGV4dERhdGEuZ2V0RGF0YU1vZGVsKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG9wLmV4ZWN1dGUobnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKFNJTkdMRV9QQVJUSUNJUEFOVF9XT1JLKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisJCX0KKwkJZmluYWxseSB7CisJCSAgICBtb25pdG9yLmRvbmUoKTsKKwkJfQorCQlyZXR1cm4gT0tfU1RBVFVTOworCX0KKworCXB1YmxpYyB2b2lkIGV4cG9ydCgpIHRocm93cyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24geworCQlJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgRVhQT1JUX1dPUkspOworCQlmaW5hbCBpbnQgU0FWRV9USUNLUyA9IDE5ODsKKwkJZmluYWwgaW50IENMRUFOVVBfVElDS1MgPSAyOworCQlmaW5hbCBpbnQgVE9UQUxfVElDS1MgPSBTQVZFX1RJQ0tTICsgQ0xFQU5VUF9USUNLUzsKKwkJdHJ5IHsKKwkJCUZpbGUgd3JpdGVGaWxlID0gZ2V0RGVzdGluYXRpb25QYXRoKCkudG9GaWxlKCk7CisJCQlpZiAod3JpdGVGaWxlLmV4aXN0cygpKSB7CisJCQkJd3JpdGVGaWxlLmRlbGV0ZSgpOworCQkJfQorCQkJamF2YS5pby5GaWxlIGFGaWxlID0gZ2V0RGVzdGluYXRpb25QYXRoKCkudG9GaWxlKCk7CisJCQlBcmNoaXZlVXRpbC5jaGVja1dyaXRlYWJsZShhRmlsZSk7CisJCQlib29sZWFuIGZpbGVFeGlzdGVkID0gYUZpbGUuZXhpc3RzKCk7CisJCQlGbGF0Q29tcG9uZW50QXJjaGl2ZXIgYXJjaGl2ZXIgPSBudWxsOworCQkJdHJ5IHsKKwkJCQlqYXZhLmlvLkZpbGUgZGVzdGluYXRpb25GaWxlID0gZmlsZUV4aXN0ZWQgCisJCQkJPyBBcmNoaXZlVXRpbC5jcmVhdGVUZW1wRmlsZShnZXREZXN0aW5hdGlvblBhdGgoKS50b09TU3RyaW5nKCksIGFGaWxlLmdldENhbm9uaWNhbEZpbGUoKS5nZXRQYXJlbnRGaWxlKCkpIAorCQkJCQkJOiBhRmlsZTsKKwkJCQkKKwkJCQlqYXZhLmlvLk91dHB1dFN0cmVhbSBvdXQgPSBjcmVhdGVPdXRwdXRTdHJlYW0oZGVzdGluYXRpb25GaWxlKTsKKwkJCQlhcmNoaXZlciA9IGNyZWF0ZUZsYXRDb21wb25lbnRBcmNoaXZlcihvdXQpOworCQkJCXN1Yk1vbml0b3IuYmVnaW5UYXNrKE5MUy5iaW5kKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuQXJjaGl2ZUZhY3RvcnlJbXBsX1NhdmluZ19hcmNoaXZlX3RvXzBfLCBnZXREZXN0aW5hdGlvblBhdGgoKS50b09TU3RyaW5nKCkpLCBUT1RBTF9USUNLUyk7CisJCQkJYXJjaGl2ZXIuc2F2ZUFyY2hpdmUoKTsKKwkJCQlzdWJNb25pdG9yLndvcmtlZChTQVZFX1RJQ0tTKTsKKwkJCQlhcmNoaXZlci5jbG9zZSgpOworCQkJCisJCQkJaWYgKGZpbGVFeGlzdGVkKSB7CisJCQkJCUFyY2hpdmVVdGlsLmNsZWFudXBBZnRlclRlbXBTYXZlKGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSwgYUZpbGUsIGRlc3RpbmF0aW9uRmlsZSk7CisJCQkJfQorCQkJCXN1Yk1vbml0b3Iud29ya2VkKENMRUFOVVBfVElDS1MpOworCQkJfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbihlKTsKKwkJCX0gY2F0Y2ggKEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbiBmYWlsdXJlKSB7CisJCQkJdHJ5IHsKKwkJCQkJaWYgKGFyY2hpdmVyICE9IG51bGwpCisJCQkJCQlhcmNoaXZlci5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHdlVHJpZWQpIHsKKwkJCQkJLy8gSWdub3JlCisJCQkJfQorCQkJCWlmICghZmlsZUV4aXN0ZWQpCisJCQkJCWFGaWxlLmRlbGV0ZSgpOworCQkJCXRocm93IGZhaWx1cmU7CisJCQl9IAorCQl9IGZpbmFsbHkgeworCQkJc3ViTW9uaXRvci5kb25lKCk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgamF2YS5pby5PdXRwdXRTdHJlYW0gY3JlYXRlT3V0cHV0U3RyZWFtKGphdmEuaW8uRmlsZSBkZXN0aW5hdGlvbkZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKwkJaWYgKGRlc3RpbmF0aW9uRmlsZS5leGlzdHMoKSAmJiBkZXN0aW5hdGlvbkZpbGUuaXNEaXJlY3RvcnkoKSkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuQXJjaGl2ZUZhY3RvcnlJbXBsX1RoZV9zcGVjaWZpZWRfZmlsZV8wX2V4aXN0c19hbmRfLCBkZXN0aW5hdGlvbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKwkJfQorCQlqYXZhLmlvLkZpbGUgcGFyZW50ID0gZGVzdGluYXRpb25GaWxlLmdldFBhcmVudEZpbGUoKTsKKwkJaWYgKHBhcmVudCAhPSBudWxsKQorCQkJcGFyZW50Lm1rZGlycygpOworCQlqYXZhLmlvLk91dHB1dFN0cmVhbSBvdXQgPSBuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uRmlsZSk7CisJCXJldHVybiBvdXQ7CisJfQorCisJcHJvdGVjdGVkIEZsYXRDb21wb25lbnRBcmNoaXZlciBjcmVhdGVGbGF0Q29tcG9uZW50QXJjaGl2ZXIoT3V0cHV0U3RyZWFtIG91dCkgeworCQlyZXR1cm4gbmV3IEZsYXRDb21wb25lbnRBcmNoaXZlcihnZXRDb21wb25lbnQoKSwgb3V0LCBnZXRQYXJ0aWNpcGFudHMoKSk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG5ld1Byb2dyZXNzTW9uaXRvcikgeworCQlwcm9ncmVzc01vbml0b3IgPSBuZXdQcm9ncmVzc01vbml0b3I7CisJfQorCisJcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgeworCQlyZXR1cm4gcHJvZ3Jlc3NNb25pdG9yOworCX0KKworCXByaXZhdGUgdm9pZCBzZXRDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgbmV3Q29tcG9uZW50KSB7CisJCWNvbXBvbmVudCA9IG5ld0NvbXBvbmVudDsKKwl9CisKKwlwcm90ZWN0ZWQgSVZpcnR1YWxDb21wb25lbnQgZ2V0Q29tcG9uZW50KCkgeworCQlpZiAoY29tcG9uZW50ID09IG51bGwpCisJCQljb21wb25lbnQgPSAoSVZpcnR1YWxDb21wb25lbnQpIG1vZGVsLmdldFByb3BlcnR5KENPTVBPTkVOVCk7CisJCXJldHVybiBjb21wb25lbnQ7CisJfQorCisJcHJvdGVjdGVkIElQYXRoIGdldERlc3RpbmF0aW9uUGF0aCgpIHsKKwkJcmV0dXJuIGRlc3RpbmF0aW9uUGF0aDsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXREZXN0aW5hdGlvblBhdGgoSVBhdGggbmV3RGVzdGluYXRpb25QYXRoKSB7CisJCWRlc3RpbmF0aW9uUGF0aCA9IG5ld0Rlc3RpbmF0aW9uUGF0aDsKKwl9CisKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4cG9ydFNvdXJjZSgpIHsKKwkJcmV0dXJuIGV4cG9ydFNvdXJjZTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBzZXRFeHBvcnRTb3VyY2UoYm9vbGVhbiBuZXdFeHBvcnRTb3VyY2UpIHsKKwkJZXhwb3J0U291cmNlID0gbmV3RXhwb3J0U291cmNlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHJ1bk5lY2Vzc2FyeUJ1aWxkZXJzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQltb25pdG9yLmJlZ2luVGFzayhudWxsLCBKQVZBX0JVSUxERVJfV09SSyk7CisJCQlpZiAoIWNvbXBvbmVudC5pc0JpbmFyeSgpKSB7CisJCQkJSVByb2plY3QgcHJvamVjdCA9IGNvbXBvbmVudC5nZXRQcm9qZWN0KCk7CisJCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKKwkJCQlJQ29tbWFuZCBqYXZhQnVpbGRlciA9IGdldEphdmFDb21tYW5kKGRlc2NyaXB0aW9uKTsKKwkJCQlpZiAoamF2YUJ1aWxkZXIgIT0gbnVsbCkgeworCQkJCQlwcm9qZWN0LmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIEphdmFDb3JlLkJVSUxERVJfSUQsIGphdmFCdWlsZGVyLmdldEFyZ3VtZW50cygpLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIEpBVkFfQlVJTERFUl9XT1JLKSk7CisJCQkJfQorCQkJfQorCQl9IGZpbmFsbHkgeworCQkJbW9uaXRvci5kb25lKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBGaW5kIHRoZSBzcGVjaWZpYyBKYXZhIGNvbW1hbmQgYW1vbmdzdCB0aGUgYnVpbGQgc3BlYyBvZiBhIGdpdmVuIGRlc2NyaXB0aW9uCisJICovCisJcHJvdGVjdGVkIElDb21tYW5kIGdldEphdmFDb21tYW5kKElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUlDb21tYW5kW10gY29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5sZW5ndGg7ICsraSkgeworCQkJaWYgKGNvbW1hbmRzW2ldLmdldEJ1aWxkZXJOYW1lKCkuZXF1YWxzKEphdmFDb3JlLkJVSUxERVJfSUQpKSB7CisJCQkJcmV0dXJuIGNvbW1hbmRzW2ldOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoKSB7CisJCVNldCBwcm9qcyA9IGdhdGhlckRlcGVuZGVudFByb2plY3RzKGdldENvbXBvbmVudCgpLCBuZXcgSGFzaFNldCgpKTsKKwkJSVNjaGVkdWxpbmdSdWxlIGNvbWJpbmVkUnVsZSA9IG51bGw7CisJCUlSZXNvdXJjZVJ1bGVGYWN0b3J5IHJ1bGVGYWN0b3J5ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCk7CisJCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb2pzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworCQkJSVByb2plY3QgcHJvaiA9IChJUHJvamVjdCkgaXRlci5uZXh0KCk7CisJCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSA9IHJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUocHJvaik7CisJCQljb21iaW5lZFJ1bGUgPSBNdWx0aVJ1bGUuY29tYmluZShydWxlLCBjb21iaW5lZFJ1bGUpOworCQl9CisJCWNvbWJpbmVkUnVsZSA9IE11bHRpUnVsZS5jb21iaW5lKHJ1bGVGYWN0b3J5LmJ1aWxkUnVsZSgpLCBjb21iaW5lZFJ1bGUpOworCisJCXJldHVybiBjb21iaW5lZFJ1bGU7CisJfQorCQorCS8qKgorCSAqIFN1YmNsYXNzZXMgY2FuIHByb3ZpZGUgYSBsaXN0IG9mIHBhcnRpY2lwYW50cyB3aG8gbWF5CisJICogYmUgaW52b2x2ZWQgaW4gZm9ybWluZyB0aGUgZXhwb3J0IG1vZGVsCisJICogCisJICogQSBkZXBsb3lhYmxlIHdpdGggbm8gcGFydGljaXBhbnQgc2hvdWxkIHN0aWxsIHByb3Blcmx5CisJICogY29uc3VtZSBjb25zdW1lZCByZWZlcmVuY2VzIGFuZCB0cmF2ZXJzZSB0aGUgbW9kZWwgYXBwcm9wcmlhdGVseQorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdDxJRmxhdHRlblBhcnRpY2lwYW50PiBnZXRQYXJ0aWNpcGFudHMoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCX0KKwkKKwlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyZWRFeHRlbnNpb25zKCkgeworCQlBcnJheUxpc3Q8U3RyaW5nPiBleGNsdWRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCQlleGNsdWRlTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChET1RfRklMRV9OQU1FUykpOworCQlpZiAoIWlzRXhwb3J0U291cmNlKCkpIHsKKwkJCWV4Y2x1ZGVMaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KERPVF9TT1VSQ0VfRklMRVMpKTsKKwkJfQorCQlyZXR1cm4gZXhjbHVkZUxpc3QudG9BcnJheShuZXcgU3RyaW5nW2V4Y2x1ZGVMaXN0LnNpemUoKV0pOworCX0KKworCXByaXZhdGUgU2V0IGdhdGhlckRlcGVuZGVudFByb2plY3RzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXAsIFNldCBwcm9qcykgeworCQlpZiAoIXByb2pzLmNvbnRhaW5zKGNvbXAuZ2V0UHJvamVjdCgpKSkgeworCQkJcHJvanMuYWRkKGNvbXAuZ2V0UHJvamVjdCgpKTsKKwkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNvbXAuZ2V0UmVmZXJlbmNlcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7CisJCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmQ29tcCA9IHJlZnNbaV07CisJCQkJcHJvanMuYWRkQWxsKGdhdGhlckRlcGVuZGVudFByb2plY3RzKHJlZkNvbXAuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLCBwcm9qcykpOworCQkJfQorCQl9CisJCXJldHVybiBwcm9qczsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0NvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IDg0MGYyN2MuLjBkODI0NTIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCkBAIC00Myw3ICs0Myw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwpAQCAtNTQsOSArNTMsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVNZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lNYW5pZmVzdFV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwpAQCAtNjUsNyArNjYsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuRGVwZW5kZW5jeVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbnRhaW5lcjsKQEAgLTE1Nyw2ICsxNTcsOSBAQAogCQkJCQlzb3VyY2VGaWxlVXJpID0gKFN0cmluZykgaXQubmV4dCgpOwogCQkJCQl6aXBGaWxlID0gKFppcEZpbGUpIGZpbGVVUklNYXAuZ2V0KHNvdXJjZUZpbGVVcmkpOwogCQkJCX0KKwkJCQlpZih6aXBGaWxlID09IG51bGwpeworCQkJCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHVyaSk7CisJCQkJfQogCQkJCVppcEVudHJ5IGVudHJ5ID0gemlwRmlsZS5nZXRFbnRyeShzb3VyY2VGaWxlVXJpKTsKIAkJCQlJbnB1dFN0cmVhbSBpbiA9IHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwogCQkJCXJldHVybiBpbjsKQEAgLTIxNSwxOSArMjE4LDIzIEBACiAJCX0KIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTdHJpbmcgdXJpKSB7CiAJCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSB2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKIAkJcmV0dXJuIHJvb3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aCh1cmkpKS5leGlzdHMoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUmVzb3VyY2VTZXQoKSB7CiAJCXJlc291cmNlU2V0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlU2V0KHZDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgYm9vbGVhbiBwcmltQ29udGFpbnMoU3RyaW5nIHVyaSkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0RmlsZXMoKSB7CiAJCWFnZ3JlZ2F0ZVNvdXJjZUZpbGVzKCk7CiAJCWFnZ3JlZ2F0ZUNsYXNzRmlsZXMoKTsKQEAgLTI2MCw3ICsyNjcsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQl9CiAJCX0KIAl9CkBAIC0yODYsNyArMjkzLDcgQEAKIAkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbXBvbmVudHNbaV07CiAJCQlJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKIAkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCkgJiYgcmVmZXJlbmNlLmdldERlcGVuZGVuY3lUeXBlKCkgPT0gRGVwZW5kZW5jeVR5cGUuQ09OU1VNRVMpIHsKLQkJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSAoKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKKwkJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSAoamF2YS5pby5GaWxlKSByZWZlcmVuY2VkQ29tcG9uZW50LmdldEFkYXB0ZXIoamF2YS5pby5GaWxlLmNsYXNzKTsKIAkJCQlaaXBGaWxlIHppcEZpbGU7CiAJCQkJSVBhdGggcGF0aCA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpOwogCQkJCXRyeSB7CkBAIC0yOTgsOSArMzA1LDkgQEAKIAkJCQkJCWZpbGVzSG9sZGVyLmFkZEVudHJ5KGVudHJ5LCB6aXBGaWxlLCBwYXRoKTsKIAkJCQkJfQogCQkJCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTMyNCw3ICszMzEsNyBAQAogCQkJaW5KYXZhU3JjID0gZmFsc2U7CiAJCQlhZ2dyZWdhdGVGaWxlcyhtZW1iZXJzKTsgCiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCX0KIApAQCAtMzYxLDcgKzM2OCw3IEBACiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJCX0KIAkJCQkJaWYgKG51bGwgPT0gcnVudGltZVBhdGgpIHsKIAkJCQkJCXJ1bnRpbWVQYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCkBAIC0zNzAsNyArMzc3LDcgQEAKIAkJCQl9CiAJCQl9CQkJCQogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0gZmluYWxseSB7CiAJCQlpZiAoc2UgIT0gbnVsbCkgewogCQkJCXNlLmRpc3Bvc2UoKTsKQEAgLTU1MCw2ICs1NTcsNyBAQAogCQlmaWxlc0hvbGRlci5hZGRGaWxlKGFGaWxlLCBleHRlcm5hbERpc2tGaWxlKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKIAkJLy8gSWYgdGhlIE1BTklGRVNULk1GIG9mIGEgbW9kdWxlIGNvbXBvbmVudCBpcyBiZWluZyByZXF1ZXN0ZWQgYW5kIHRoYXQgbW9kdWxlIGNvbXBvbmVudCByZWZlcmVuY2VzCiAgICAgICAgIC8vIEphdmEgYnVpbGQgcGF0aC1iYXNlZCBjb21wb25lbnRzLCBuZWVkIHRvIGR5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgbWFuaWZlc3QgY2xhc3NwYXRoIHRvIHJlZmxlY3QgdGhlIHJlc29sdmVkCkBAIC01NzksNiArNTg3LDcgQEAKIAkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihlU3RyaW5nKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRMb2FkZWRNb2ZSZXNvdXJjZXMoKSB7CiAJCUNvbGxlY3Rpb24gcmVzb3VyY2VzID0gc3VwZXIuZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCk7CiAJCUNvbGxlY3Rpb24gcmVzb3VyY2VzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7CkBAIC01ODksMTAgKzU5OCw3IEBACiAJCQlpZiAocmVzLmdldFVSSSgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoSU1vZHVsZUNvbnN0YW50cy5DT01QT05FTlRfRklMRV9OQU1FKSAmJiByZXMuZ2V0VVJJKCkuc2VnbWVudHNMaXN0KCkuY29udGFpbnMoSU1vZHVsZUNvbnN0YW50cy5ET1RfU0VUVElOR1MpKQogCQkJCXJlc291cmNlc1RvUmVtb3ZlLmFkZChyZXMpOwogCQl9Ci0JCWlmIChudWxsICE9IHJlc291cmNlc1RvUmVtb3ZlKSB7Ci0JCQlyZXNvdXJjZXMucmVtb3ZlQWxsKHJlc291cmNlc1RvUmVtb3ZlKTsKLQkJfQotCisJCXJlc291cmNlcy5yZW1vdmVBbGwocmVzb3VyY2VzVG9SZW1vdmUpOwogCQlyZXR1cm4gcmVzb3VyY2VzOwogCX0KIApAQCAtNjAzLDEwICs2MDksMTIgQEAKIAkJcmV0dXJuIGFydGlmYWN0RWRpdDsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlIGdldE1vZlJlc291cmNlKFN0cmluZyB1cmkpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiB7CiAJCXJldHVybiBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSh1cmkpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzTG9hZGVyTmVlZGVkKCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtNjIzLDExICs2MzEsMTMgQEAKIAkKIAlwcm90ZWN0ZWQgZmluYWwgaW50IEZJTEVfU0FWRV9XT1JLID0gMTAwOwogCQorCUBPdmVycmlkZQogCXB1YmxpYyBGaWxlSXRlcmF0b3IgZ2V0RmlsZUl0ZXJhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBGaWxlSXRlcmF0b3JJbXBsKGdldENvbnRhaW5lcigpLmdldEZpbGVzKCkpewogCQkJcHJvdGVjdGVkIFN1YlByb2dyZXNzTW9uaXRvciBsYXN0U3ViTW9uID0gbnVsbDsKIAkJCWJvb2xlYW4gZmlyc3RWaXNpdCA9IHRydWU7CiAJCQkKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIEZpbGUgbmV4dCgpIHsKIAkJCQlpZihmaXJzdFZpc2l0KXsKIAkJCQkJZmlyc3RWaXNpdCA9IGZhbHNlOwpAQCAtNjU3LDEwICs2NjcsMTAgQEAKIAkJCiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlpZihUaHJlYWQuY3VycmVudFRocmVhZCgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJmaW5hbGl6ZXIiKSAhPSAtMSl7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIk9wZW5lciBvZiBBcmNoaXZlIGRpZG4ndCBjbG9zZSEgIit0aGlzKTsKLQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisJCWlmKFRocmVhZC5jdXJyZW50VGhyZWFkKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImZpbmFsaXplciIpICE9IC0xKXsgLy8kTk9OLU5MUy0xJAorCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihBcmNoaXZlTWVzc2FnZXMuQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbF9PcGVuZXJfb2ZfQXJjaGl2ZV9kaWRfbm90X2Nsb3NlX2l0XywgZXhjZXB0aW9uKTsKIAkJfQogCQkKIAkJdHJ5ewpAQCAtNjcwLDcgKzY4MCw3IEBACiAJCQkJdHJ5IHsKIAkJCQkJZmlsZS5jbG9zZSgpOwogCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCX0KIAkJCX0KIAkJfSBmaW5hbGx5ewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9Db21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0NvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQppbmRleCAxMTdjNGQ2Li5iNzA1ZDBhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0NvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0NvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlNhdmVTdHJhdGVneTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3lJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5DcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXI7CkBAIC00NSw4ICs0NiwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuRG9Ob3RVc2VNZVRoaXNXaWxsQmVEZWxldGVkUG9zdDE1OwogCisvKioKKyAqIEBkZXByZWNhdGVkIHRoaXMgd2lsbCBiZSBkZWxldGVkIHBvc3QgV1RQIDMuMi4gIFRoaXMgY29kZSBpcyBubyBsb25nZXIKKyAqIGNhbGxlZCBiZWNhdXNlIHRoZSBJQXJjaGl2ZSBBUEkgaXMgdXNlZCB0byBoYW5kbGUgaW1wb3J0cy4KKyAqIAorICogQGF1dGhvciBqc2hvbGwKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgZXh0ZW5kcyBTYXZlU3RyYXRlZ3lJbXBsIHsKIAogCXByb3RlY3RlZCBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKQEAgLTk0LDIwICsxMDAsMjQgQEAKIAkJcmV0dXJuIChvdmVyd3JpdGVIYW5kbGVyLmlzT3ZlcndyaXRlUmVzb3VyY2VzKCkgfHwgb3ZlcndyaXRlSGFuZGxlci5pc092ZXJ3cml0ZUFsbCgpIHx8IG92ZXJ3cml0ZUhhbmRsZXIuc2hvdWxkT3ZlcndyaXRlKHVyaSkpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlTmVzdGVkU2F2ZVN0cmF0ZWd5KEFyY2hpdmUgYW5BcmNoaXZlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbUZvclJlc291cmNlKFJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJLy8gdGhpcyBtZXRob2QgaGFzIG5vIHJlZmVyZW5jZXMgaW4gdGhlIGhpcmFyY2h5CiAJCXJldHVybiBudWxsOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHNhdmVGaWxlcygpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7CiAJCXN1cGVyLnNhdmVGaWxlcygpOwogCQlsaW5rQXJjaGl2ZUNvbXBvbmVudHMoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzYXZlKEZpbGUgYUZpbGUsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewogCQl0cnkgewogCQkJcHJvZ3Jlc3NNb25pdG9yLnN1YlRhc2soYUZpbGUuZ2V0VVJJKCkpOwpAQCAtMTk3LDcgKzIwNyw3IEBACiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCBzYXZlQXNBcmNoaXZlQ29tcG9uZW50KEFyY2hpdmUgYXJjaGl2ZSwgSVBhdGggcHJvamVjdFJlbGF0aXZlUGF0aCwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBpRmlsZSA9IHNhdmVUb091dHB1dFBhdGhJRmlsZShwcm9qZWN0UmVsYXRpdmVQYXRoLCBpbik7CisJCUlGaWxlIGlGaWxlID0gc2F2ZVRvT3V0cHV0UGF0aChwcm9qZWN0UmVsYXRpdmVQYXRoLCBpbik7CiAJCS8vVE9ETyBpbnZlc3RpZ2F0ZSByZW1vdmluZyB0aGlzIGJsb2NrIGFuZCByZWxhdGVkIHZhcmlhYmxlcyBhbmQgbGlua0FyY2hpdmVDb21wb25lbnRzKCk7IHNlZSBidWd6aWxsYSAxNTkxNjAKIAkJaWYgKHNob3VsZExpbmtBc0NvbXBvbmVudFJlZihhcmNoaXZlKSkgewogCQkJSVZpcnR1YWxDb21wb25lbnQgYXJjaGl2ZUNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudCh2Q29tcG9uZW50LmdldFByb2plY3QoKSwgVmlydHVhbEFyY2hpdmVDb21wb25lbnQuTElCQVJDSElWRVRZUEUgKyBpRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwpAQCAtMjI4LDM1ICsyMzgsMjQgQEAKIAkJCXRyeSB7CiAJCQkJY3JlYXRlUmVmZXJlbmNlc0RhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKIAkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfQogCX0KIAogCS8qKgotCSAqIFNhdmVzIHRvIHRoZSBzcGVjaWZpZWQgcHJvamVjdCByZWxhdGl2ZSBvdXRwdXQgcGF0aC4gV2FybmluZyB0aGlzIG1ldGhvZAotCSAqIHdpbGwgYmUgY2hhbmdlZCBwb3N0IDEuNSB0byByZXR1cm4gYW4gSUZpbGUKKwkgKiBTYXZlcyB0byB0aGUgc3BlY2lmaWVkIHByb2plY3QgcmVsYXRpdmUgb3V0cHV0IHBhdGguCiAJICogCiAJICogQHBhcmFtIHByb2plY3RSZWxhdGl2ZVBhdGgKIAkgKiBAcGFyYW0gaW4KIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVUb091dHB1dFBhdGgoSVBhdGggcHJvamVjdFJlbGF0aXZlUGF0aCwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBFeGNlcHRpb24gewotCQlzYXZlVG9PdXRwdXRQYXRoSUZpbGUocHJvamVjdFJlbGF0aXZlUGF0aCwgaW4pOwotCX0KLQotCS8qKgotCSAqIFRPRE8gcmVmYWN0b3IgY2hhbmdlIHRoZSBtZXRob2QgYWJvdmUgdG8gcmV0dXJuIElGaWxlCi0JICoge0BsaW5rIERvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNX0KLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbGUgc2F2ZVRvT3V0cHV0UGF0aElGaWxlKElQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGgsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgSUZpbGUgc2F2ZVRvT3V0cHV0UGF0aChJUGF0aCBwcm9qZWN0UmVsYXRpdmVQYXRoLCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUlGaWxlIGlGaWxlID0gdkNvbXBvbmVudC5nZXRQcm9qZWN0KCkuZ2V0RmlsZShwcm9qZWN0UmVsYXRpdmVQYXRoKTsKIAkJc2F2ZVRvSUZpbGUoaUZpbGUsIGluKTsKIAkJcmV0dXJuIGlGaWxlOwogCX0KIAotCiAJcHJvdGVjdGVkIHZvaWQgc2F2ZVRvSUZpbGUoSUZpbGUgaUZpbGUsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdmFsaWRhdGVFZGl0KGlGaWxlKTsKIAkJaWYgKGlGaWxlLmV4aXN0cygpKQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9Db25uZWN0b3JDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQppbmRleCBmMGM0ZTdhLi5kMTMxNmQwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0Nvbm5lY3RvckNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQpAQCAtMTIsNiArMTIsMTIgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiAKKy8qKgorICogQGRlcHJlY2F0ZWQgdGhpcyB3aWxsIGJlIGRlbGV0ZWQgcG9zdCBXVFAgMy4yLiAgVGhpcyBjb2RlIGlzIG5vIGxvbmdlcgorICogY2FsbGVkIGJlY2F1c2UgdGhlIElBcmNoaXZlIEFQSSBpcyB1c2VkIHRvIGhhbmRsZSBpbXBvcnRzLgorICogCisgKiBAYXV0aG9yIGpzaG9sbAorICovCiBwdWJsaWMgY2xhc3MgQ29ubmVjdG9yQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCBleHRlbmRzIEoyRUVDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIHsKIAogCXB1YmxpYyBDb25uZWN0b3JDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRGVwZW5kZW50SmFyRXhwb3J0TWVyZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0RlcGVuZGVudEphckV4cG9ydE1lcmdlci5qYXZhCmluZGV4IDZjNWU4ODguLjNiMDJjMWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRGVwZW5kZW50SmFyRXhwb3J0TWVyZ2VyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9EZXBlbmRlbnRKYXJFeHBvcnRNZXJnZXIuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuQXJjaGl2ZU1hbmlmZXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7CkBAIC0yMyw4ICsyNCwxNCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIAorLyoqCisgKiBAZGVwcmVjYXRlZCB0aGlzIHdpbGwgYmUgZGVsZXRlZCBwb3N0IFdUUCAzLjIuICBUaGlzIGNvZGUgaXMgbm8gbG9uZ2VyCisgKiBjYWxsZWQgYmVjYXVzZSB0aGUgSUFyY2hpdmUgQVBJIGlzIHVzZWQgdG8gaGFuZGxlIGltcG9ydHMuCisgKiAKKyAqIEBhdXRob3IganNob2xsCisgKi8KIHB1YmxpYyBjbGFzcyBEZXBlbmRlbnRKYXJFeHBvcnRNZXJnZXIgewogCXByb3RlY3RlZCBBcmNoaXZlIG91dGdvaW5nQXJjaGl2ZTsKIAlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKQEAgLTQxLDYgKzQ4LDcgQEAKIAkJaW5jbHVkZVNvdXJjZSA9IGluY2x1ZGVTb3VyY2VGaWxlczsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewogCQlyZWxlYXNlKCk7CiAJfQpAQCAtNjYsNyArNzQsNyBAQAogCQkJCQlkZXBlbmRlbnRKYXIgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLnByaW1PcGVuQXJjaGl2ZShmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKIAkJCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBleCkgewogCQkJCQkvLyBOZWVkIHRvIHdyaXRlIHRoaXMgdG8gdGhlIGxvZyBmaWxlCi0JCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGV4KTsKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCWRlcGVuZGVudEFyY2hpdmVzLmFkZChkZXBlbmRlbnRKYXIpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRUFSQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEKaW5kZXggNWEyNjM4Ni4uN2UzNjQ3ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VBUkNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbi5qYXZhCkBAIC0xMCw2OCArMTAsMjQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnM7CiAKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuSmF2YUVFQXJjaGl2ZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKIAorLyoqCisgKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkphdmFFRUNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbiBpbnN0ZWFkCisgKi8KIHB1YmxpYyBjbGFzcyBFQVJDb21wb25lbnRFeHBvcnRPcGVyYXRpb24gZXh0ZW5kcyBKMkVFQXJ0aWZhY3RFeHBvcnRPcGVyYXRpb24gewogCisJCiAJcHVibGljIEVBUkNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7CiAJCXN1cGVyKG1vZGVsKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBleHBvcnQoKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJSVByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIEVYUE9SVF9XT1JLKTsKLQkJSUFyY2hpdmUgYXJjaGl2ZUZyb21Db21wb25lbnQgPSBudWxsOwotCQl0cnkgewotCQkJLy9bQnVnIDI0NDA0OV0gbmVlZCB0byB1c2UgUHJvamVjdEZhY2V0IHZlcnNpb24gdG8gZGV0ZXJtaW5lIGhvdyB0byBleHBvcnQgdGhlIEVBUgotCQkJU3RyaW5nIHZlcnNpb25TdHIgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFZlcnNpb24oZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpKTsKLQkJCWlmICh2ZXJzaW9uU3RyLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzVfMF9URVhUKSkgewotCQkJCWFyY2hpdmVGcm9tQ29tcG9uZW50ID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5vcGVuQXJjaGl2ZShnZXRDb21wb25lbnQoKSk7Ci0JCQkJc2F2ZUFyY2hpdmUoYXJjaGl2ZUZyb21Db21wb25lbnQsIGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSwgc3ViTW9uaXRvcik7Ci0JCQl9IGVsc2UgewotCQkJCUVBUkFydGlmYWN0RWRpdCBhcnRpZmFjdEVkaXQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWFydGlmYWN0RWRpdCA9IChFQVJBcnRpZmFjdEVkaXQpIENvbXBvbmVudFV0aWxpdGllcy5nZXRBcnRpZmFjdEVkaXRGb3JSZWFkKGdldENvbXBvbmVudCgpKTsKLQkJCQkJRUFSRmlsZSBhcmNoaXZlID0gKEVBUkZpbGUpIGFydGlmYWN0RWRpdC5hc0FyY2hpdmUoaXNFeHBvcnRTb3VyY2UoKSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCVN0cmluZyBkZXN0aW5hdGlvbiA9IGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKTsKLQkJCQkJYXJjaGl2ZS5zZXRVUkkoZGVzdGluYXRpb24pOwotCQkJCQlzZXRNb2R1bGVGaWxlKGFyY2hpdmUpOwotCQkJCQlDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsIGxzID0gKENvbXBvbmVudExvYWRTdHJhdGVneUltcGwpIGFyY2hpdmUuZ2V0TG9hZFN0cmF0ZWd5KCk7Ci0JCQkJCWxzLnNldFByb2dyZXNzTW9uaXRvcihzdWJNb25pdG9yKTsKLQkJCQkJYXJjaGl2ZS5zYXZlQXNOb1Jlb3BlbihkZXN0aW5hdGlvbik7Ci0JCQkJfSBjYXRjaCAoU2F2ZUZhaWx1cmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJdGhyb3cgZXg7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IFNhdmVGYWlsdXJlRXhjZXB0aW9uKEFwcENsaWVudEFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuQVJDSElWRV9PUEVSQVRJT05fT3BlbmluZ0FyY2hpdmUsIGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChudWxsICE9IGFydGlmYWN0RWRpdCkgewotCQkJCQkJYXJ0aWZhY3RFZGl0LmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBTYXZlRmFpbHVyZUV4Y2VwdGlvbihBcHBDbGllbnRBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLkFSQ0hJVkVfT1BFUkFUSU9OX09wZW5pbmdBcmNoaXZlLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChhcmNoaXZlRnJvbUNvbXBvbmVudCAhPSBudWxsKQotCQkJCUphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0UuY2xvc2VBcmNoaXZlKGFyY2hpdmVGcm9tQ29tcG9uZW50KTsKLQkJCXN1Yk1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcnVuTmVjZXNzYXJ5QnVpbGRlcnMoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7CkBAIC04Niw4ICs0Miw0IEBACiAJCX0KIAl9CiAKLQlwcm90ZWN0ZWQgU3RyaW5nIGFyY2hpdmVTdHJpbmcoKSB7Ci0JCXJldHVybiAiRUFSIjsKLQl9Ci0KIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRUFSQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VBUkNvbXBvbmVudEltcG9ydE9wZXJhdGlvbi5qYXZhCmluZGV4IDgxZWQ2MTYuLmUzNDIyZmUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRUFSQ29tcG9uZW50SW1wb3J0T3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRJbXBvcnRPcGVyYXRpb24uamF2YQpAQCAtMTcsMjEgKzE3LDE3IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuRW50ZXJwcmlzZUFydGlmYWN0RWRpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5BcmNoaXZlV3JhcHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkVBUkNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7CkBAIC01MywxMCArNDksMTIgQEAKIAl9CiAKIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIGdldEFyY2hpdmVTYXZlQWRhcHRlcihJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50KXsKIAkJcmV0dXJuIG5ldyBFQVJDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIodmlydHVhbENvbXBvbmVudCk7CiAJfQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBpbnQgY29tcHV0ZVRvdGFsV29yaygpIHsKIAkJaW50IGJhc2VXb3JrID0gc3VwZXIuY29tcHV0ZVRvdGFsV29yaygpICsgV0VCX0xJQl9XT1JLICsgRElTUE9TRV9XT1JLOwogCQlMaXN0IG1vZGVsc1RvSW1wb3J0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkhBTkRMRURfUFJPSkVDVF9NT0RFTFNfTElTVCk7CkBAIC03Niw2ICs3NCw3IEBACiAJICogQHBhcmFtIG1vbml0b3IKIAkgKiAgICAgICAgICAgIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCXN1cGVyLmRvRXhlY3V0ZShtb25pdG9yKTsKIAkJRXhlY3V0aW9uRXhjZXB0aW9uIGZpcnN0TmVzdGVkRXhjZXB0aW9uID0gbnVsbDsKQEAgLTg2LDggKzg1LDggQEAKIAkJCWZvciAoaW50IGkgPSBtb2RlbHNUb0ltcG9ydC5zaXplKCkgLSAxOyBpID4gMDsgaS0tKSB7CiAJCQkJaW1wb3J0TW9kZWwgPSAoSURhdGFNb2RlbCkgbW9kZWxzVG9JbXBvcnQuZ2V0KGkpOwogCQkJCUFyY2hpdmVXcmFwcGVyIG5lc3RlZEFyY2hpdmUgPSAoQXJjaGl2ZVdyYXBwZXIpIGltcG9ydE1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUik7Ci0JCQkJaWYgKG5lc3RlZEFyY2hpdmUuZ2V0UGF0aCgpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChBcmNoaXZlQ29uc3RhbnRzLldFQkFQUF9MSUJfVVJJKSkgewotCQkJCQlBcmNoaXZlV3JhcHBlciBvd25pbmdXYXIgPSAoQXJjaGl2ZVdyYXBwZXIpIG5lc3RlZEFyY2hpdmUuZ2V0UGFyZW50KCk7CisJCQkJaWYgKG5lc3RlZEFyY2hpdmUuZ2V0UGF0aCgpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiV0VCLUlORi9saWIvIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlBcmNoaXZlV3JhcHBlciBvd25pbmdXYXIgPSBuZXN0ZWRBcmNoaXZlLmdldFBhcmVudCgpOwogCQkJCQltb2RlbHNUb0ltcG9ydC5yZW1vdmUoaW1wb3J0TW9kZWwpOwogCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1vZGVsc1RvSW1wb3J0LnNpemUoKTsgaisrKSB7CiAJCQkJCQlJRGF0YU1vZGVsIHdhck1vZGVsID0gKElEYXRhTW9kZWwpIG1vZGVsc1RvSW1wb3J0LmdldChqKTsKQEAgLTEyMiw2ICsxMjEsOSBAQAogCQkJTWFwIGNvbXBvbmVudFRvVVJJTWFwQXNNb2R1bGVzID0gbmV3IEhhc2hNYXAoKTsKIAkJCUxpc3QgY29tcG9uZW50VG9BZGRBc0NvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCQlNYXAgY29tcG9uZW50VG9VUklNYXBBc0NvbXBvbmVudHMgPSBuZXcgSGFzaE1hcCgpOworCQkJTWFwIG1vZHVsZURlcGxveVBhdGhNYXAgPSBuZXcgSGFzaE1hcCgpOworCQkJTWFwIGNvbXBvbmVudERlcGxveVBhdGhNYXAgPSBuZXcgSGFzaE1hcCgpOworCQkJCiAJCQkKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kZWxzVG9JbXBvcnQuc2l6ZSgpOyBpKyspIHsKIAkJCQlpbXBvcnRNb2RlbCA9IChJRGF0YU1vZGVsKSBtb2RlbHNUb0ltcG9ydC5nZXQoaSk7CkBAIC0xNDEsMTYgKzE0MywyMiBAQAogCQkJCQlpZiAoZmlyc3ROZXN0ZWRFeGNlcHRpb24gPT0gbnVsbCkgewogCQkJCQkJZmlyc3ROZXN0ZWRFeGNlcHRpb24gPSBlOwogCQkJCQl9Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQl9CiAJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBpbXBvcnRNb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ09NUE9ORU5UKTsKIAkJCQlTdHJpbmcgdXJpID0gbmVzdGVkQXJjaGl2ZS5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQlpZihkZFNwZWNpZmllZFVSSXMuY29udGFpbnModXJpKSl7CisJCQkJU3RyaW5nIGFic29sdXRlVXJpID0gbmVzdGVkQXJjaGl2ZS5nZXRQYXRoKCkubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKTsKKwkJCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSBuZXN0ZWRBcmNoaXZlLmdldFBhdGgoKS5sYXN0U2VnbWVudCgpLnRvU3RyaW5nKCk7CisJCQkJU3RyaW5nIGRlcGxveVBhdGggPSBuZXN0ZWRBcmNoaXZlLmdldFBhdGgoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKTsKKwkJCQkKKwkJCQlpZihkZFNwZWNpZmllZFVSSXMuY29udGFpbnModXJpKSB8fCBkZFNwZWNpZmllZFVSSXMuY29udGFpbnMoYWJzb2x1dGVVcmkpKXsKIAkJCQkJY29tcG9uZW50VG9BZGRBc01vZHVsZXMuYWRkKGNvbXBvbmVudCk7Ci0JCQkJCWNvbXBvbmVudFRvVVJJTWFwQXNNb2R1bGVzLnB1dChjb21wb25lbnQsIHVyaSk7CisJCQkJCWNvbXBvbmVudFRvVVJJTWFwQXNNb2R1bGVzLnB1dChjb21wb25lbnQsIGFyY2hpdmVOYW1lKTsKKwkJCQkJbW9kdWxlRGVwbG95UGF0aE1hcC5wdXQoY29tcG9uZW50LCBkZXBsb3lQYXRoKTsKIAkJCQl9IGVsc2UgewogCQkJCQljb21wb25lbnRUb0FkZEFzQ29tcG9uZW50cy5hZGQoY29tcG9uZW50KTsKLQkJCQkJY29tcG9uZW50VG9VUklNYXBBc0NvbXBvbmVudHMucHV0KGNvbXBvbmVudCwgdXJpKTsKKwkJCQkJY29tcG9uZW50VG9VUklNYXBBc0NvbXBvbmVudHMucHV0KGNvbXBvbmVudCwgYXJjaGl2ZU5hbWUpOworCQkJCQljb21wb25lbnREZXBsb3lQYXRoTWFwLnB1dChjb21wb25lbnQsIGRlcGxveVBhdGgpOwogCQkJCX0KIAkJCX0KIAkJCQpAQCAtMTYyLDYgKzE3MCw3IEBACiAJCQkJYWRkQ29tcG9uZW50c0RNLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCB2aXJ0dWFsQ29tcG9uZW50KTsKIAkJCQlhZGRDb21wb25lbnRzRE0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgY29tcG9uZW50VG9BZGRBc01vZHVsZXMpOwogCQkJCWFkZENvbXBvbmVudHNETS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCwgY29tcG9uZW50VG9VUklNYXBBc01vZHVsZXMpOworCQkJCWFkZENvbXBvbmVudHNETS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEhfTUFQLCBtb2R1bGVEZXBsb3lQYXRoTWFwKTsKIAkJCQlhZGRDb21wb25lbnRzRE0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCBMSU5LX0NPTVBPTkVOVFNfV09SSy8yKSwgaW5mbyk7CiAJCQl9CiAJCQlpZiAoY29tcG9uZW50VG9BZGRBc0NvbXBvbmVudHMuc2l6ZSgpID4gMCl7CkBAIC0xNzEsNiArMTgwLDcgQEAKIAkJCQlhZGRDb21wb25lbnRzRE0uc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQsIHZpcnR1YWxDb21wb25lbnQpOwogCQkJCWFkZENvbXBvbmVudHNETS5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBjb21wb25lbnRUb0FkZEFzQ29tcG9uZW50cyk7CiAJCQkJYWRkQ29tcG9uZW50c0RNLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19UT19VUklfTUFQLCBjb21wb25lbnRUb1VSSU1hcEFzQ29tcG9uZW50cyk7CisJCQkJYWRkQ29tcG9uZW50c0RNLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSF9NQVAsIGNvbXBvbmVudERlcGxveVBhdGhNYXApOwogCQkJCWFkZENvbXBvbmVudHNETS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIExJTktfQ09NUE9ORU5UU19XT1JLLzIpLCBpbmZvKTsKIAkJCX0KIAkJCkBAIC0yMDEsMTYgKzIxMSw1IEBACiAJCQltb2RlbC5zZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ0xPU0VfQVJDSElWRV9PTl9ESVNQT1NFLCBCb29sZWFuLlRSVUUpOwogCQl9CiAJfQotCi0JcHJvdGVjdGVkIFNhdmVTdHJhdGVneSBjcmVhdGVTYXZlU3RyYXRlZ3koSVByb2plY3QgcHJvamVjdCkgeyAvLyBOT09QCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTYXZlU3RyYXRlZ3kgY3JlYXRlU2F2ZVN0cmF0ZWd5KElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQpIHsKLQkJcmV0dXJuIG5ldyBFQVJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKHZpcnR1YWxDb21wb25lbnQpOwotCX0KLQotCXByb3RlY3RlZCBFQVJGaWxlIGdldEVhckZpbGUoKSB7Ci0JCXJldHVybiAoRUFSRmlsZSkgbW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRSk7Ci0JfQorCQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VBUkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YQppbmRleCBlOWNiNzQ1Li44MjZmZjIwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VBUkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VBUkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YQpAQCAtMjEsOCArMjEsOCBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQoraW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuSUNsYXNzcGF0aERlcGVuZGVuY3lQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5jb21wb25lbnRjb3JlLnV0aWwuQXBwQ2xpZW50QXJ0aWZhY3RFZGl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwpAQCAtMzAsMTYgKzMwLDE1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuRW50ZXJwcmlzZUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJBcnRpZmFjdEVkaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5FYXJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKQEAgLTU4LDExICs1NywxMyBAQAogCQlzdXBlcih2Q29tcG9uZW50LCBpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cyk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0RmlsZXMoKSB7CiAJCWFnZ3JlZ2F0ZVNvdXJjZUZpbGVzKCk7CiAJCWFkZE1vZHVsZXNBbmRVdGlsaXRpZXMoKTsKIAkJcmV0dXJuIGZpbGVzSG9sZGVyLmdldEZpbGVzKCk7CiAJfQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQXJ0aWZhY3RFZGl0IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKSB7CiAJCWlmKGFydGlmYWN0RWRpdCA9PSBudWxsKXsKIAkJCWFydGlmYWN0RWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKHZDb21wb25lbnQpOwpAQCAtNzAsNiArNzEsNyBAQAogCQlyZXR1cm4gYXJ0aWZhY3RFZGl0OwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCWlmIChiaW5hcnlDb21wb25lbnRVUklzVG9EaXNrRmlsZU1hcC5jb250YWluc0tleSh1cmkpKSB7CiAJCQlqYXZhLmlvLkZpbGUgZGlza0ZpbGUgPSAoamF2YS5pby5GaWxlKSBiaW5hcnlDb21wb25lbnRVUklzVG9EaXNrRmlsZU1hcC5nZXQodXJpKTsKQEAgLTgyLDcgKzg0LDcgQEAKIAkJRUFSQXJ0aWZhY3RFZGl0IGVhckFydGlmYWN0RWRpdCA9IG51bGw7CiAJCXRyeSB7CiAJCQllYXJBcnRpZmFjdEVkaXQgPSBFQVJBcnRpZmFjdEVkaXQuZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yUmVhZCh2Q29tcG9uZW50KTsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gY29tcG9uZW50cyA9IGVhckFydGlmYWN0RWRpdC5nZXRDb21wb25lbnRSZWZlcmVuY2VzKCk7CisJCQlJVmlydHVhbFJlZmVyZW5jZVtdIGNvbXBvbmVudHMgPSBFYXJVdGlsaXRpZXMuZ2V0Q29tcG9uZW50UmVmZXJlbmNlcyh2Q29tcG9uZW50KTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykgewogCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbXBvbmVudHNbaV07CiAJCQkJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CkBAIC05MiwzMSArOTQsMjYgQEAKIAkJCQlpZiAocmVmZXJlbmNlZENvbXBvbmVudC5pc0JpbmFyeSgpKSB7CiAJCQkJCUphdmFFRVF1aWNrUGVlayBxcCA9IEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci5nZXRKYXZhRUVRdWlja1BlZWsocmVmZXJlbmNlZENvbXBvbmVudCk7CiAJCQkJCWludCBqZWVWZXJzaW9uID0gcXAuZ2V0SmF2YUVFVmVyc2lvbigpOworCQkJCQkvL0VFNlRPRE8KIAkJCQkJaWYoamVlVmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEKXsKIAkJCQkJCWZvcmNlVXRpbGl0eSA9IHRydWU7CiAJCQkJCX0KLQkJCQkJZGlza0ZpbGUgPSAoKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCQkJaWYgKCFkaXNrRmlsZS5leGlzdHMoKSkgewotCQkJCQkJSUZpbGUgd2JGaWxlID0gKChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgcmVmZXJlbmNlZENvbXBvbmVudCkuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCQkJCWlmICh3YkZpbGUgIT0gbnVsbCAmJiB3YkZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQlkaXNrRmlsZSA9IG5ldyBGaWxlKHdiRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KKwkJCQkJZGlza0ZpbGUgPSAoamF2YS5pby5GaWxlKXJlZmVyZW5jZWRDb21wb25lbnQuZ2V0QWRhcHRlcihqYXZhLmlvLkZpbGUuY2xhc3MpOwogCQkJCX0KIAkJCQlib29sZWFuIGlzTW9kdWxlID0gZmFsc2U7CiAJCQkJaWYoIWZvcmNlVXRpbGl0eSl7CiAJCQkJCWJvb2xlYW4gYWRkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzID0gZmFsc2U7CiAJCQkJCUFydGlmYWN0RWRpdCBjb21wb25lbnRBcnRpZmFjdEVkaXQgPSBudWxsOwogCQkJCQl0cnkgewotCQkJCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRDb21wb25lbnQocmVmZXJlbmNlZENvbXBvbmVudCkpIHsKKwkJCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRDb21wb25lbnQocmVmZXJlbmNlZENvbXBvbmVudCkpIHsKIAkJCQkJCQljb21wb25lbnRBcnRpZmFjdEVkaXQgPSBBcHBDbGllbnRBcnRpZmFjdEVkaXQuZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yUmVhZChyZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCQkJCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJDb21wb25lbnQocmVmZXJlbmNlZENvbXBvbmVudCkpIHsKKwkJCQkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQkNvbXBvbmVudChyZWZlcmVuY2VkQ29tcG9uZW50KSkgewogCQkJCQkJCWFkZENsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY2llcyA9IHRydWU7CiAJCQkJCQkJY29tcG9uZW50QXJ0aWZhY3RFZGl0ID0gQXJ0aWZhY3RFZGl0UmVnaXN0cnlSZWFkZXIuaW5zdGFuY2UoKS5nZXRBcnRpZmFjdEVkaXQoSjJFRVByb2plY3RVdGlsaXRpZXMuRUpCKS5jcmVhdGVBcnRpZmFjdEVkaXRGb3JSZWFkKHJlZmVyZW5jZWRDb21wb25lbnQpOwotCQkJCQkJfSBlbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQocmVmZXJlbmNlZENvbXBvbmVudCkpIHsKKwkJCQkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQocmVmZXJlbmNlZENvbXBvbmVudCkpIHsKIAkJCQkJCQlhZGRDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmNpZXMgPSB0cnVlOwogCQkJCQkJCWNvbXBvbmVudEFydGlmYWN0RWRpdCA9IEFydGlmYWN0RWRpdFJlZ2lzdHJ5UmVhZGVyLmluc3RhbmNlKCkuZ2V0QXJ0aWZhY3RFZGl0KEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCKS5jcmVhdGVBcnRpZmFjdEVkaXRGb3JSZWFkKHJlZmVyZW5jZWRDb21wb25lbnQpOwotCQkJCQkJfSBlbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQUNvbXBvbmVudChyZWZlcmVuY2VkQ29tcG9uZW50KSkgeworCQkJCQkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBQ29tcG9uZW50KHJlZmVyZW5jZWRDb21wb25lbnQpKSB7CiAJCQkJCQkJYWRkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzID0gdHJ1ZTsKIAkJCQkJCQljb21wb25lbnRBcnRpZmFjdEVkaXQgPSBBcnRpZmFjdEVkaXRSZWdpc3RyeVJlYWRlci5pbnN0YW5jZSgpLmdldEFydGlmYWN0RWRpdChKMkVFUHJvamVjdFV0aWxpdGllcy5KQ0EpLmNyZWF0ZUFydGlmYWN0RWRpdEZvclJlYWQocmVmZXJlbmNlZENvbXBvbmVudCk7CiAJCQkJCQl9CkBAIC0xNTMsNyArMTUwLDcgQEAKIAkJCQkJaWYgKHJlZmVyZW5jZWRDb21wb25lbnQuaXNCaW5hcnkoKSkgewogCQkJCQkJU3RyaW5nIHVyaSA9IHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpOwogCQkJCQkJYWRkRXh0ZXJuYWxGaWxlKHVyaSwgZGlza0ZpbGUpOwotCQkJCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QocmVmZXJlbmNlZENvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7CisJCQkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewogCQkJCQkJdHJ5IHsKIAkJCQkJCQlpZiAoIXJlZmVyZW5jZWRDb21wb25lbnQuaXNCaW5hcnkoKSkgewogCQkJCQkJCQlTdHJpbmcgdXJpID0gZWFyQXJ0aWZhY3RFZGl0LmdldE1vZHVsZVVSSShyZWZlcmVuY2VkQ29tcG9uZW50KTsKQEAgLTE4MSwxOSArMTc4LDE0IEBACiAKIAlwcml2YXRlIHZvaWQgYWRkQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzKGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQpIHsKIAkJLy8gcmV0cmlldmUgYWxsIEphdmEgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMKLQkJaWYgKGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzICYmIHJlZmVyZW5jZWRDb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBjcFJlZnMgPSAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOworCQlpZiAoaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMgJiYgcmVmZXJlbmNlZENvbXBvbmVudCBpbnN0YW5jZW9mIElDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXIpIHsKKwkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gY3BSZWZzID0gKChJQ2xhc3NwYXRoRGVwZW5kZW5jeVByb3ZpZGVyKSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOwogCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjcFJlZnMubGVuZ3RoOyBqKyspIHsKIAkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBjcFJlZnNbal07CiAJCQkJLy8gb25seSAuLi8gcnVudGltZSBwYXRocyBjb250cmlidXRlIHRvIHRoZSBFQVIKIAkJCQlpZiAocmVmLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUl9QQVRIKSkgewotCQkJCQlpZiAocmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQkJCQlmaW5hbCBDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCBjb21wID0gKENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50KSByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCQkJRmlsZSBjcEVudHJ5RmlsZSA9IGNvbXAuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7Ci0JCQkJCQlpZiAoIWNwRW50cnlGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJZmluYWwgSUZpbGUgd2JGaWxlID0gY29tcC5nZXRVbmRlcmx5aW5nV29ya2JlbmNoRmlsZSgpOwotCQkJCQkJCWNwRW50cnlGaWxlID0gbmV3IEZpbGUod2JGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJCQkJCX0KKwkJCQkJaWYgKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudCkgeworCQkJCQkJRmlsZSBjcEVudHJ5RmlsZSA9IChqYXZhLmlvLkZpbGUpcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRBZGFwdGVyKGphdmEuaW8uRmlsZS5jbGFzcyk7CiAJCQkJCQlhZGRFeHRlcm5hbEZpbGUocmVmLmdldEFyY2hpdmVOYW1lKCksIGNwRW50cnlGaWxlKTsKIAkJCQkJfQogCQkJCX0KQEAgLTIwMSw2ICsxOTMsNyBAQAogCQl9CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGNsb3NlKCkgewogCQlzdXBlci5jbG9zZSgpOwogCQlJdGVyYXRvciBpdCA9IGFydGlmYWN0RWRpdHNUb0Rpc3Bvc2UuaXRlcmF0b3IoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRUFSQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEKaW5kZXggNzg2YTVmNy4uNTJiMTNiZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEKQEAgLTEyLDk4ICsxMiw2MCBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uU2F2ZUZhaWx1cmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogCisvKioKKyAqIEBkZXByZWNhdGVkIHRoaXMgd2lsbCBiZSBkZWxldGVkIHBvc3QgV1RQIDMuMi4gIFRoaXMgY29kZSBpcyBubyBsb25nZXIKKyAqIGNhbGxlZCBiZWNhdXNlIHRoZSBJQXJjaGl2ZSBBUEkgaXMgdXNlZCB0byBoYW5kbGUgaW1wb3J0cy4KKyAqIAorICogQGF1dGhvciBqc2hvbGwKKyAqLwogcHVibGljIGNsYXNzIEVBUkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgZXh0ZW5kcyBDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIHsKIAotLy8JcHJvdGVjdGVkIE1hcCBjcmVhdGVkQ29tcG9uZW50c01hcDsKLQogCXB1YmxpYyBFQVJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewogCQlzdXBlcihjb21wb25lbnQpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldERhdGFNb2RlbChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewogCQlzdXBlci5zZXREYXRhTW9kZWwoZGF0YU1vZGVsKTsKLQotCQlzZXRBcmNoaXZlKChBcmNoaXZlKSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRSkpOwotCQlvdmVyd3JpdGVIYW5kbGVyID0gKElPdmVyd3JpdGVIYW5kbGVyKSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkoSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuT1ZFUldSSVRFX0hBTkRMRVIpOwotCQlpZiAobnVsbCAhPSBvdmVyd3JpdGVIYW5kbGVyKSB7Ci0JCQlvdmVyd3JpdGVIYW5kbGVyLnNldEVhclNhdmVTdHJhdGVneSh0aGlzKTsKLQkJfQotLy8JCWJ1aWxkUHJvamVjdHNNYXAoKTsKIAl9CiAKLQotCi0vLwkvKioKLS8vCSAqIENyZWF0ZXMgYSBNYXAgbWFwcGluZyBhcmNoaXZlIHVyaXMgdG8gcHJvamVjdHMgZm9yIGFsbCBhcmNoaXZlcyBpbiB0aGUgZWFyIHRoYXQgaW1wb3J0ZWQgYXMKLS8vCSAqIHByb2plY3RzLgotLy8JICovCi0vLwlwcml2YXRlIHZvaWQgYnVpbGRQcm9qZWN0c01hcCgpIHsKLS8vCQljcmVhdGVkQ29tcG9uZW50c01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJTGlzdCBjcmVhdGVkUHJvamVjdHNMaXN0ID0gKExpc3QpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BTExfUFJPSkVDVF9NT0RFTFNfTElTVCk7Ci0vLwkJSURhdGFNb2RlbCBpbXBvcnRETSA9IG51bGw7Ci0vLwkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBudWxsOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgY3JlYXRlZFByb2plY3RzTGlzdC5zaXplKCk7IGkrKykgewotLy8JCQlpbXBvcnRETSA9IChJRGF0YU1vZGVsKSBjcmVhdGVkUHJvamVjdHNMaXN0LmdldChpKTsKLS8vCQkJYW5BcmNoaXZlID0gKEFyY2hpdmUpIGltcG9ydERNLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFKTsKLS8vCQkJY3JlYXRlZENvbXBvbmVudHNNYXAucHV0KGFuQXJjaGl2ZS5nZXRVUkkoKSwgaW1wb3J0RE0uZ2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVCkpOwotLy8JCX0KLS8vCX0KLQotLy8JcHJvdGVjdGVkIHZvaWQgYWRkRmlsZVRvQ2xhc3NwYXRoKElQcm9qZWN0IHAsIElGaWxlIGZpbGUsIExpc3QgY3ApIHsKLS8vCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0vLwkJCXJldHVybjsKLS8vCi0vLwkJLy8gQXNzdW1lIHRoZSBmaWxlIGFsc28gY29udGFpbnMgdGhlIHNvdXJjZQotLy8JCUlQYXRoIHBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0vLwkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIHBhdGgsIG51bGwsIHRydWUpOwotLy8JCWlmICghY3AuY29udGFpbnMoZW50cnkpKQotLy8JCQljcC5hZGQoZW50cnkpOwotLy8JfQotCi0vLwlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9qZWN0VG9DbGFzc3BhdGgoSVByb2plY3QgZGVwZW5kZW50LCBJUHJvamVjdCBwcmVyZXEsIExpc3QgY3ApIHsKLS8vCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBKYXZhQ29yZS5uZXdQcm9qZWN0RW50cnkocHJlcmVxLmdldEZ1bGxQYXRoKCksIHRydWUpOwotLy8JCWlmICghY3AuY29udGFpbnMoZW50cnkpKQotLy8JCQljcC5hZGQoZW50cnkpOwotLy8JfQotCiAJcHJvdGVjdGVkIEVBUkZpbGUgZ2V0RUFSRmlsZSgpIHsKIAkJcmV0dXJuIChFQVJGaWxlKSBnZXRBcmNoaXZlKCk7CiAJfQogCiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgamF2YS5pby5PdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtRm9yUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlIGFSZXNvdXJjZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIFNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKIAogCQlzYXZlRmlsZXMoKTsKIAkJc2F2ZU1hbmlmZXN0KCk7CiAJCXNhdmVNb2ZSZXNvdXJjZXMoKTsKIAkJcHJvZ3Jlc3NNb25pdG9yLnN1YlRhc2soRUFSQXJjaGl2ZU9wc1Jlc291cmNlSGFuZGxlci5VcGRhdGluZ19wcm9qZWN0X2NsYXNzcGF0aF9VSV8pOwotCQkvL3VwZGF0ZUNvbXBvbmVudENsYXNzcGF0aHMoKTsKLQogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNhdmUoQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7CiAJCXByb2dyZXNzTW9uaXRvci5zdWJUYXNrKGFuQXJjaGl2ZS5nZXRVUkkoKSk7CiAJCXNhdmVBcmNoaXZlQXNKQVJJbkVBUihhbkFyY2hpdmUpOwpAQCAtMTI2LDYgKzg4LDcgQEAKIAkJcHJvZ3Jlc3NNb25pdG9yID0gbmV3TW9uaXRvcjsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKEZpbGUgYUZpbGUpIHsKIAkJaWYgKGFGaWxlLmlzQXJjaGl2ZSgpKSB7CiAJCQlyZXR1cm4gZ2V0RmlsdGVyKCkuc2hvdWxkU2F2ZShhRmlsZS5nZXRVUkkoKSwgZ2V0QXJjaGl2ZSgpKTsKQEAgLTEzMywxOCArOTYsMTMgQEAKIAkJcmV0dXJuIHN1cGVyLnNob3VsZFNhdmUoYUZpbGUpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBib29sZWFuIHNob3VsZExpbmtBc0NvbXBvbmVudFJlZihBcmNoaXZlIGFyY2hpdmUpIHsKLQkJaWYgKG51bGwgIT0gZGF0YU1vZGVsKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgZGF0YU1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkhBTkRMRURfUFJPSkVDVF9NT0RFTFNfTElTVCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAoYXJjaGl2ZSA9PSAoKElEYXRhTW9kZWwpIGxpc3QuZ2V0KGkpKS5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9CisJCQogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKFN0cmluZyB1cmkpIHsKIAkJaWYgKG92ZXJ3cml0ZUhhbmRsZXIgIT0gbnVsbCkgewogCQkJaWYgKG92ZXJ3cml0ZUhhbmRsZXIuaXNPdmVyd3JpdGVOb25lKCkpCkBAIC0xNTQsNiArMTEyLDcgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc2F2ZShBcmNoaXZlTWFuaWZlc3QgYU1hbmlmZXN0KSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewogCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gdkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7CiAJCUlWaXJ0dWFsRmlsZSB2RmlsZSA9IHJvb3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpOwpAQCAtMTYzLDg2ICsxMjIsMTQgQEAKIAkJdHJ5IHsKIAkJCWFNYW5pZmVzdC53cml0ZShvdXQpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9IGZpbmFsbHkgewogCQkJdHJ5IHsKIAkJCQlvdXQuY2xvc2UoKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfQogCX0KLQkKLQotLy8JLyoKLS8vCSAqIFBhcnNlIHRoZSBtYW5pZmVzdCBvZiB0aGUgbW9kdWxlIGZpbGU7IGZvciBlYWNoIGNwIGVudHJ5IDEpIGNhbmFub25pY2FsaXplIHRvIGEgdXJpIHRoYXQKLS8vCSAqIGxvb2tzIGxpa2UgdGhlIGVudHJ5IGluIHRoZSBlYXIgMikgSWYgdGhlIGVhciBjb250YWlucyBhIGZpbGUgd2l0aCB0aGF0IHVyaSAodGhlIGVudHJ5IGlzCi0vLwkgKiB2YWxpZCkgYSkgSWYgdGhlIGZpbGUgaXMgYW5vdGhlciB3YXMgYmxvd24gb3V0IHRvIGEgcHJvamVjdCwgYWRkIGEgY3AgZW50cnkgZm9yIGEgcmVmZXJlbmNlZAotLy8JICogcHJvamVjdCBiKSBvdGhlcndpc2UsIGFkZCBhIGNwIGVudHJ5IHRoYXQgcG9pbnRzIHRvIHRoZSBmaWxlIGluIHRoZSBlYXIgcHJvamVjdCwgYW5kIGNwCi0vLwkgKiBlbnRyaWVzIGZvciBhbGwgcHJlcmVxcwotLy8JICovCi0vLwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9qZWN0Q2xhc3NwYXRoKEFyY2hpdmUgYW5BcmNoaXZlLCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLS8vCi0vLwkJU3RyaW5nIG1lc3NhZ2UgPSBFQVJBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLlVwZGF0aW5nX3Byb2plY3RfY2xhc3NwYXRoX1VJXyArIGNvbXBvbmVudC5nZXROYW1lKCk7Ci0vLwkJcHJvZ3Jlc3NNb25pdG9yLnN1YlRhc2sobWVzc2FnZSk7Ci0vLwkJTGlzdCBwcm9qZWN0Q3BFbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCVNldCB2aXNpdGVkID0gbmV3IEhhc2hTZXQoKTsKLS8vCQl0cmF2ZXJzZUNsYXNzcGF0aHMoY29tcG9uZW50LmdldFByb2plY3QoKSwgYW5BcmNoaXZlLCBwcm9qZWN0Q3BFbnRyaWVzLCB2aXNpdGVkKTsKLS8vCi0vLwkJdHJ5IHsKLS8vCQkJaWYgKCFwcm9qZWN0Q3BFbnRyaWVzLmlzRW1wdHkoKSkKLS8vCQkJCUplbVByb2plY3RVdGlsaXRpZXMuYXBwZW5kSmF2YUNsYXNzUGF0aChjb21wb25lbnQuZ2V0UHJvamVjdCgpLCBwcm9qZWN0Q3BFbnRyaWVzKTsKLS8vCQkJSmVtUHJvamVjdFV0aWxpdGllcy5mb3JjZUNsYXNzcGF0aFJlbG9hZChjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLS8vCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLS8vCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0vLwkJfQotLy8KLS8vCX0KLQotLy8JLyoKLS8vCSAqIElmIHlvdSBoYXZlIGEgZGVwZW5kZW5jeSB0byBhIEpBUiBpbiB0aGUgRUFSIHByb2plY3QsIGFuZCB0aGUgSkFSIGRlcGVuZHMgb24gYW5vdGhlciBKQVIgaW4KLS8vCSAqIHRoZSBFQVI7IHlvdSB3YW50IHRvIGNvbXBpbGUgY2xlYW5seSBhZnRlciBpbXBvcnQsIHNvIHlvdSBuZWVkIGJvdGggdGhvc2UgSkFScyBvbiB5b3VyIGJ1aWxkCi0vLwkgKiBwYXRoCi0vLwkgKi8KLS8vCXByb3RlY3RlZCB2b2lkIHRyYXZlcnNlQ2xhc3NwYXRocyhJUHJvamVjdCBwLCBBcmNoaXZlIGFuQXJjaGl2ZSwgTGlzdCBwcm9qZWN0Q3BFbnRyaWVzLCBTZXQgdmlzaXRlZEFyY2hpdmVzKSB7Ci0vLwkJdmlzaXRlZEFyY2hpdmVzLmFkZChhbkFyY2hpdmUpOwotLy8JCVN0cmluZ1tdIG1hbmlmZXN0Q3BFbnRyaWVzID0gYW5BcmNoaXZlLmdldE1hbmlmZXN0KCkuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7Ci0vLwkJRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRSk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYW5pZmVzdENwRW50cmllcy5sZW5ndGg7IGkrKykgewotLy8JCQlTdHJpbmcgdXJpID0gQXJjaGl2ZVV0aWwuZGVyaXZlRUFSUmVsYXRpdmVVUkkobWFuaWZlc3RDcEVudHJpZXNbaV0sIGFuQXJjaGl2ZSk7Ci0vLwkJCS8vIGVuc3VyZSB0aGUgZW50cnkgaXMgdmFsaWQgb3Igc2tpcCB0byB0aGUgbmV4dAotLy8JCQlpZiAodXJpID09IG51bGwpCi0vLwkJCQljb250aW51ZTsKLS8vCQkJRmlsZSBhRmlsZSA9IG51bGw7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlhRmlsZSA9IGVhckZpbGUuZ2V0RmlsZSh1cmkpOwotLy8JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gbm90VGhlcmUpIHsKLS8vCQkJfQotLy8JCQlpZiAoYUZpbGUgPT0gbnVsbCB8fCAhYUZpbGUuaXNBcmNoaXZlKCkgfHwgdmlzaXRlZEFyY2hpdmVzLmNvbnRhaW5zKGFGaWxlKSkKLS8vCQkJCWNvbnRpbnVlOwotLy8JCQlBcmNoaXZlIGRlcEFyY2hpdmUgPSAoQXJjaGl2ZSkgYUZpbGU7Ci0vLwkJCUlQcm9qZWN0IHByZXJlcSA9IG51bGw7Ci0vLwkJCUlWaXJ0dWFsQ29tcG9uZW50IGRlcENvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgY3JlYXRlZENvbXBvbmVudHNNYXAuZ2V0KHVyaSk7Ci0vLwkJCWlmIChkZXBDb21wb25lbnQgIT0gbnVsbCkKLS8vCQkJCXByZXJlcSA9IGRlcENvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0vLwotLy8JCQlpZiAocHJlcmVxICE9IG51bGwpIHsKLS8vCQkJCWFkZFByb2plY3RUb0NsYXNzcGF0aChwLCBwcmVyZXEsIHByb2plY3RDcEVudHJpZXMpOwotLy8JCQl9IGVsc2UgewotLy8JCQkJYWRkRmlsZVRvQ2xhc3NwYXRoKHAsIHZDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUodXJpKS5nZXRVbmRlcmx5aW5nRmlsZSgpLCBwcm9qZWN0Q3BFbnRyaWVzKTsKLS8vCQkJCXRyYXZlcnNlQ2xhc3NwYXRocyhwLCBkZXBBcmNoaXZlLCBwcm9qZWN0Q3BFbnRyaWVzLCB2aXNpdGVkQXJjaGl2ZXMpOwotLy8JCQl9Ci0vLwkJfQotLy8JfQotCi0vLwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb21wb25lbnRDbGFzc3BhdGhzKCkgewotLy8JCUxpc3QgamFyRmlsZXMgPSBnZXRFQVJGaWxlKCkuZ2V0QXJjaGl2ZUZpbGVzKCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJGaWxlcy5zaXplKCk7IGkrKykgewotLy8JCQlBcmNoaXZlIGFuQXJjaGl2ZSA9IChBcmNoaXZlKSBqYXJGaWxlcy5nZXQoaSk7Ci0vLwkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgY3JlYXRlZENvbXBvbmVudHNNYXAuZ2V0KGFuQXJjaGl2ZS5nZXRVUkkoKSk7Ci0vLwkJCWlmIChjb21wb25lbnQgIT0gbnVsbCkKLS8vCQkJCXVwZGF0ZVByb2plY3RDbGFzc3BhdGgoYW5BcmNoaXZlLCBjb21wb25lbnQpOwotLy8JCX0KLS8vCX0KIAogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9FSkJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VKQkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQppbmRleCAwYjFiM2ExLi43ZDQ5OTg3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VKQkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0VKQkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQpAQCAtMTIsNiArMTIsMTIgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiAKKy8qKgorICogQGRlcHJlY2F0ZWQgdGhpcyB3aWxsIGJlIGRlbGV0ZWQgcG9zdCBXVFAgMy4yLiAgVGhpcyBjb2RlIGlzIG5vIGxvbmdlcgorICogY2FsbGVkIGJlY2F1c2UgdGhlIElBcmNoaXZlIEFQSSBpcyB1c2VkIHRvIGhhbmRsZSBpbXBvcnRzLgorICogCisgKiBAYXV0aG9yIGpzaG9sbAorICovCiBwdWJsaWMgY2xhc3MgRUpCQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCBleHRlbmRzIEoyRUVDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIHsKIAogCXB1YmxpYyBFSkJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvRmxhdENvbXBvbmVudEFyY2hpdmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0ZsYXRDb21wb25lbnRBcmNoaXZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNGZmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0ZsYXRDb21wb25lbnRBcmNoaXZlci5qYXZhCkBAIC0wLDAgKzEsMzMxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuaW50ZXJuYWwuQXJjaGl2ZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuRmxhdEZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5GbGF0VmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JQ2hpbGRNb2R1bGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXRGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklGbGF0Rm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklGbGF0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXRWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklGbGF0dGVuUGFydGljaXBhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkZsYXRWaXJ0dWFsQ29tcG9uZW50LkZsYXRDb21wb25lbnRUYXNrTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OworCitwdWJsaWMgY2xhc3MgRmxhdENvbXBvbmVudEFyY2hpdmVyIHsKKwlwcml2YXRlIElGbGF0VmlydHVhbENvbXBvbmVudCBmbGF0Q29tcG9uZW50OworCXByaXZhdGUgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uU3RyZWFtOworCXByaXZhdGUgWmlwT3V0cHV0U3RyZWFtIHppcE91dHB1dFN0cmVhbTsKKwlwcml2YXRlIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudDsKKwlwcml2YXRlIExpc3Q8SUZsYXR0ZW5QYXJ0aWNpcGFudD4gcGFydGljaXBhbnRzOworCXByaXZhdGUgQ29tcG9uZW50RXhwb3J0Q2FsbGJhY2sgY2FsbGJhY2tIYW5kbGVyOworCXByaXZhdGUgTGlzdDxJUGF0aD4gemlwRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SVBhdGg+KCk7CisJcHJpdmF0ZSBMaXN0IDxJVmlydHVhbENvbXBvbmVudD4gY29tcG9uZW50c0FyY2hpdmVkID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4oKTsKKwkKKwlwdWJsaWMgaW50ZXJmYWNlIENvbXBvbmVudEV4cG9ydENhbGxiYWNrIHsKKwkJcHVibGljIGJvb2xlYW4gY2FuU2F2ZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpOworCQlwdWJsaWMgSUZsYXRWaXJ0dWFsQ29tcG9uZW50IHNhdmVDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBaaXBPdXRwdXRTdHJlYW0gemlwT3V0cHV0U3RyZWFtLCBMaXN0PElQYXRoPiB6aXBFbnRyaWVzKSB0aHJvd3MgQXJjaGl2ZUV4Y2VwdGlvbjsKKwkJcHVibGljIGJvb2xlYW4gY3JlYXRlTWFuaWZlc3QoKTsKKwl9CisKKwlwdWJsaWMgRmxhdENvbXBvbmVudEFyY2hpdmVyKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQsIE91dHB1dFN0cmVhbSBvdXQsIExpc3Q8SUZsYXR0ZW5QYXJ0aWNpcGFudD4gZlBhcnRpY2lwYW50cykgeworCQlwYXJ0aWNpcGFudHMgPSBmUGFydGljaXBhbnRzOworCQljb21wb25lbnQgPSBhQ29tcG9uZW50OworCQlkZXN0aW5hdGlvblN0cmVhbSA9IG91dDsKKwkJemlwT3V0cHV0U3RyZWFtID0gbmV3IFppcE91dHB1dFN0cmVhbShvdXQpOworCQlmbGF0Q29tcG9uZW50ID0gZ2V0RmxhdENvbXBvbmVudChhQ29tcG9uZW50KTsKKwl9CisJCisJcHVibGljIEZsYXRDb21wb25lbnRBcmNoaXZlcihJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50LCBPdXRwdXRTdHJlYW0gb3V0LCBMaXN0PElGbGF0dGVuUGFydGljaXBhbnQ+IGZQYXJ0aWNpcGFudHMsIENvbXBvbmVudEV4cG9ydENhbGxiYWNrIGNhbGxiYWNrKSB7CisJCXBhcnRpY2lwYW50cyA9IGZQYXJ0aWNpcGFudHM7CisJCWNvbXBvbmVudCA9IGFDb21wb25lbnQ7CisJCWRlc3RpbmF0aW9uU3RyZWFtID0gb3V0OworCQljYWxsYmFja0hhbmRsZXIgPSBjYWxsYmFjazsKKwkJemlwT3V0cHV0U3RyZWFtID0gbmV3IFppcE91dHB1dFN0cmVhbShvdXQpOworCQlmbGF0Q29tcG9uZW50ID0gZ2V0RmxhdENvbXBvbmVudChhQ29tcG9uZW50KTsKKwl9CisJCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlnZXREZXN0aW5hdGlvblN0cmVhbSgpLmNsb3NlKCk7CisJfQorCisJcHVibGljIHZvaWQgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkuZmluaXNoKCk7CisJCS8vSWYgdGhpcyBpcyBub3QgbmVzdGVkLCBjbG9zZSB0aGUgc3RyZWFtIHRvIGZyZWUgdXAgdGhlIHJlc291cmNlCisJCS8vb3RoZXJ3aXNlLCBkb24ndCBjbG9zZSBpdCBiZWNhdXNlIHRoZSBwYXJlbnQgbWF5IG5vdCBiZSBkb25lCisJCWlmICghKGdldERlc3RpbmF0aW9uU3RyZWFtKCkgaW5zdGFuY2VvZiBaaXBPdXRwdXRTdHJlYW0pKQorCQkJZ2V0RGVzdGluYXRpb25TdHJlYW0oKS5jbG9zZSgpOworCX0KKwkKKwkvKioKKwkgKiBGZXRjaGVzIHRoZSByZXNvdXJjZXMgZm9yIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIEZsYXRWaXJ0dWFsQ29tcG9uZW50CisJICogYW5kIHNhdmVzIHRoZW0gdG8gYW4gYXJjaGl2ZS4gIAorCSAqIAorCSAqIEB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2F2ZUFyY2hpdmUoKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKKwkJRXhjZXB0aW9uIGNhdWdodEV4Y2VwdGlvbiA9IG51bGw7CisJCWJvb2xlYW4gY3JlYXRlTWFuaWZlc3QgPSB0cnVlOworCQl0cnkgeworCQkJaWYgKGNhbGxiYWNrSGFuZGxlciAhPSBudWxsICYmIGNhbGxiYWNrSGFuZGxlci5jYW5TYXZlKGdldENvbXBvbmVudCgpKSkgeworCQkJCWZsYXRDb21wb25lbnQgPSBjYWxsYmFja0hhbmRsZXIuc2F2ZUNvbXBvbmVudChnZXRDb21wb25lbnQoKSwgZ2V0WmlwT3V0cHV0U3RyZWFtKCksIHppcEVudHJpZXMpOworCQkJCWNyZWF0ZU1hbmlmZXN0ID0gY2FsbGJhY2tIYW5kbGVyLmNyZWF0ZU1hbmlmZXN0KCk7CisJCQl9CisJCQlpZiAoZmxhdENvbXBvbmVudCAhPSBudWxsKSB7CisJCQkJSUZsYXRSZXNvdXJjZVtdIHJlc291cmNlcyA9IGZsYXRDb21wb25lbnQuZmV0Y2hSZXNvdXJjZXMoKTsKKwkJCQlzYXZlTWFuaWZlc3QoQXJyYXlzLmFzTGlzdChyZXNvdXJjZXMpLCBjcmVhdGVNYW5pZmVzdCk7CisJCQkJc2F2ZUNoaWxkTW9kdWxlcyhmbGF0Q29tcG9uZW50LmdldENoaWxkTW9kdWxlcygpKTsKKwkJCQlzYXZlRmxhdFJlc291cmNlcyhyZXNvdXJjZXMpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7CisJCQljYXVnaHRFeGNlcHRpb24gPSBlOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlmaW5pc2goKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uKGUpOworCQkJfSBmaW5hbGx5IHsKKwkJCQlpZiAoY2F1Z2h0RXhjZXB0aW9uICE9IG51bGwpeworCQkJCQl0aHJvdyBuZXcgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uKGNhdWdodEV4Y2VwdGlvbik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCS8qKgorCSAqIENyZWF0ZXMgYSBuZXN0ZWQgYXJjaGl2ZSBmb3IgdGhlIGNvbXBvbmVudCBpbnNpZGUgaXRzIHBhcmVudCBhcmNoaXZlCisJICogCisJICogQHBhcmFtIGNvbXBvbmVudAorCSAqIEBwYXJhbSBlbnRyeQorCSAqIEByZXR1cm4gRmxhdENvbXBvbmVudEFyY2hpdmVyCisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCBGbGF0Q29tcG9uZW50QXJjaGl2ZXIgc2F2ZU5lc3RlZEFyY2hpdmUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJUGF0aCBlbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJWmlwRW50cnkgbmVzdCA9IG5ldyBaaXBFbnRyeShlbnRyeS50b1N0cmluZygpKTsKKwkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkucHV0TmV4dEVudHJ5KG5lc3QpOworCQlyZXR1cm4gbmV3IEZsYXRDb21wb25lbnRBcmNoaXZlcihjb21wb25lbnQsIGdldFppcE91dHB1dFN0cmVhbSgpLCBnZXRQYXJ0aWNpcGFudHMoKSwgY2FsbGJhY2tIYW5kbGVyKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIHRoZSByZXNvdXJjZXMgcmV0dXJuZWQgZnJvbSB0aGUgRmxhdFZpcnR1YWxDb21wb25lbnQgaW50byB0aGUgYXJjaGl2ZQorCSAqIAorCSAqIEBwYXJhbSByZXNvdXJjZXMKKwkgKiBAdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNhdmVGbGF0UmVzb3VyY2VzKElGbGF0UmVzb3VyY2VbXSByZXNvdXJjZXMpIHRocm93cyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24geworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgeworCQkJSUZsYXRSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKKwkJCUlQYXRoIGVudHJ5UGF0aCA9IHJlc291cmNlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLmFwcGVuZChyZXNvdXJjZS5nZXROYW1lKCkpOworCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZsYXRGaWxlKSB7CisJCQkJaWYgKHNob3VsZEluY2x1ZGUoZW50cnlQYXRoLCB0cnVlKSkgeworCQkJCQlhZGRaaXBFbnRyeShyZXNvdXJjZSwgZW50cnlQYXRoKTsKKwkJCQkJemlwRW50cmllcy5hZGQoZW50cnlQYXRoKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZsYXRGb2xkZXIpIHsKKwkJCQlpZiAoc2hvdWxkSW5jbHVkZShlbnRyeVBhdGgsIGZhbHNlKSkgeworCQkJCQlhZGRaaXBFbnRyeShyZXNvdXJjZSwgZW50cnlQYXRoKTsKKwkJCQkJemlwRW50cmllcy5hZGQoZW50cnlQYXRoKTsKKwkJCQkJc2F2ZUZsYXRSZXNvdXJjZXMoKChJRmxhdEZvbGRlcilyZXNvdXJjZSkubWVtYmVycygpKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZW50cnlQYXRoCisJICogQHBhcmFtIGlzRmlsZQorCSAqIEByZXR1cm4gdHJ1ZSBvciBmYWxzZSAtIHNob3VsZCByZXNvdXJjZSBiZSBhZGRlZCB0byB0aGUgYXJjaGl2ZQorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEluY2x1ZGUoSVBhdGggZW50cnlQYXRoLCBib29sZWFuIGlzRmlsZSkgeworCQlpZiAoemlwRW50cmllcy5jb250YWlucyhlbnRyeVBhdGgpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJaWYgKGlzRmlsZSkgeworCQkJaWYgKGVudHJ5UGF0aC5lcXVhbHMobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKSkgeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChlbnRyeVBhdGguZXF1YWxzKG5ldyBQYXRoKElNb2R1bGVDb25zdGFudHMuRE9UX1NFVFRJTkdTKSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBuZXN0ZWQgamFycyBmcm9tIHByb2plY3QgcmVmZXJlbmNlcyBhbmQgc2F2ZXMgdGhlbSAKKwkgKiB0byB0aGUgYXJjaGl2ZS4KKwkgKiAKKwkgKiBAcGFyYW0gY2hpbGRNb2R1bGVzCisJICogQHRocm93cyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2F2ZUNoaWxkTW9kdWxlcyhJQ2hpbGRNb2R1bGVSZWZlcmVuY2VbXSBjaGlsZE1vZHVsZXMpIHRocm93cyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJY29tcG9uZW50c0FyY2hpdmVkLmFkZChjb21wb25lbnQpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTW9kdWxlcy5sZW5ndGg7IGkrKykgeworCQkJSUNoaWxkTW9kdWxlUmVmZXJlbmNlIGNoaWxkTW9kdWxlID0gY2hpbGRNb2R1bGVzW2ldOworCQkJSVBhdGggZW50cnlQYXRoID0gY2hpbGRNb2R1bGUuZ2V0UmVsYXRpdmVVUkkoKTsKKwkJCQorCQkJLy9rZWVwIHRyYWNrIG9mIHByb2plY3QgcmVmZXJlbmNlcyBhZGRlZC4gIHdlIG9ubHkgd2FudCB0byBpbmNsdWRlIHRoZSAKKwkJCS8vcHJvamVjdCB3aGVuIGJvdGggYSBiaW5hcnkgbW9kdWxlIGFuZCBpdHMgYmFja2luZyBwcm9qZWN0IGV4aXN0CisJCQl6aXBFbnRyaWVzLmFkZChlbnRyeVBhdGgpOworCQkJCisJCQkvL3ByZXZlbnQgYW4gaW5maW5pdGUgbG9vcCBkdWUgdG8gY3ljbGUgZGVwZW5kZW5jaWVzCisJCQlpZiAoY29tcG9uZW50c0FyY2hpdmVkLmNvbnRhaW5zKGNoaWxkTW9kdWxlLmdldENvbXBvbmVudCgpKSkKKwkJCQljb250aW51ZTsKKwkJCQorCQkJRmxhdENvbXBvbmVudEFyY2hpdmVyIHNhdmVyID0gc2F2ZU5lc3RlZEFyY2hpdmUoY2hpbGRNb2R1bGUuZ2V0Q29tcG9uZW50KCksIGVudHJ5UGF0aCk7CisJCQlzYXZlci5zZXRBcmNoaXZlZENvbXBvbmVudHMoY29tcG9uZW50c0FyY2hpdmVkKTsKKwkJCXNhdmVyLnNhdmVBcmNoaXZlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGRzIGFuIGVudHJ5IGFuZCBjb3BpZXMgdGhlIHJlc291cmNlIGludG8gdGhlIGFyY2hpdmUKKwkgKiAKKwkgKiBAcGFyYW0gZmxhdHJlc291cmNlCisJICogQHBhcmFtIGVudHJ5UGF0aAorCSAqIEB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uCisJICovCisJcHJvdGVjdGVkIHZvaWQgYWRkWmlwRW50cnkoSUZsYXRSZXNvdXJjZSBmLCBJUGF0aCBlbnRyeVBhdGgpIHRocm93cyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24geworCQl0cnkgeworCQkJSVBhdGggcGF0aCA9IGVudHJ5UGF0aDsKKwkJCWJvb2xlYW4gaXNGb2xkZXIgPSBmYWxzZTsKKwkJCWxvbmcgbGFzdE1vZGlmaWVkID0gMDsKKwkJCQorCQkJaWYgKGYgaW5zdGFuY2VvZiBJRmxhdEZvbGRlcikgeworCQkJCWlzRm9sZGVyID0gdHJ1ZTsKKwkJCQlGaWxlIGZvbGRlciA9IChGaWxlKSgoSUZsYXRGb2xkZXIpZikuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKKwkJCQlpZiAoZm9sZGVyICE9IG51bGwpIHsKKwkJCQkJbGFzdE1vZGlmaWVkID0gZm9sZGVyLmxhc3RNb2RpZmllZCgpOworCQkJCX0KKwkJCQlpZiAoIXBhdGguaGFzVHJhaWxpbmdTZXBhcmF0b3IoKSkKKwkJCQkJcGF0aCA9IHBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWxhc3RNb2RpZmllZCA9ICgoSUZsYXRGaWxlKSBmKS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOworCQkJfQorCQkJWmlwRW50cnkgZW50cnkgPSBuZXcgWmlwRW50cnkocGF0aC50b1N0cmluZygpKTsKKwkJCWlmIChsYXN0TW9kaWZpZWQgPiAwKQorCQkJCWVudHJ5LnNldFRpbWUobGFzdE1vZGlmaWVkKTsKKwkJCQorCQkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkucHV0TmV4dEVudHJ5KGVudHJ5KTsKKwkJCWlmICghaXNGb2xkZXIpIHsKKwkJCQlBcmNoaXZlVXRpbC5jb3B5KChJbnB1dFN0cmVhbSkgZi5nZXRBZGFwdGVyKElucHV0U3RyZWFtLmNsYXNzKSwgZ2V0WmlwT3V0cHV0U3RyZWFtKCkpOworCQkJfQorCQkJZ2V0WmlwT3V0cHV0U3RyZWFtKCkuY2xvc2VFbnRyeSgpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uKGUpOworCQl9CisJfQorCisJLyoqCisJICogVGhlIEZsYXRWaXJ0dWFsQ29tcG9uZW50IGlzIHdoYXQgZG9lcyB0aGUgYnVsayBvZiB0aGUgd29yaworCSAqIAorCSAqIEBwYXJhbSBjb21wb25lbnQKKwkgKiBAcmV0dXJuIElGbGF0VmlydHVhbENvbXBvbmVudAorCSAqLworCXByb3RlY3RlZCBJRmxhdFZpcnR1YWxDb21wb25lbnQgZ2V0RmxhdENvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKKwkJRmxhdENvbXBvbmVudFRhc2tNb2RlbCBvcHRpb25zID0gbmV3IEZsYXRDb21wb25lbnRUYXNrTW9kZWwoKTsKKwkJb3B0aW9ucy5wdXQoRmxhdFZpcnR1YWxDb21wb25lbnQuUEFSVElDSVBBTlRfTElTVCwgZ2V0UGFydGljaXBhbnRzKCkpOworCQlyZXR1cm4gbmV3IEZsYXRWaXJ0dWFsQ29tcG9uZW50KGNvbXBvbmVudCwgb3B0aW9ucyk7CisJfQorCQorCXByb3RlY3RlZCBMaXN0PElGbGF0dGVuUGFydGljaXBhbnQ+IGdldFBhcnRpY2lwYW50cygpIHsKKwkJcmV0dXJuIHBhcnRpY2lwYW50czsKKwl9CisKKwlwcm90ZWN0ZWQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW0gZ2V0WmlwT3V0cHV0U3RyZWFtKCkgeworCQlyZXR1cm4gemlwT3V0cHV0U3RyZWFtOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGFkZHMgdGhlIGV4aXN0aW5nIE1BTklGRVNULk1GIGFzIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgYXJjaGl2ZS4KKwkgKiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBzdXBwb3J0IGNsaWVudHMgd2hvIHVzZSBKYXJJbnB1dFN0cmVhbS5nZXRNYW5pZmVzdCgpLgorCSAqIElmIG5vIE1BTklGRVNULk1GIGlzIGZvdW5kLCBvbmUgaXMgY3JlYXRlZCBpZiBjcmVhdGVNYW5pZmVzdCBwYXJhbSBpcyB0cnVlCisJICogCisJICogQHBhcmFtIHJlc291cmNlcworCSAqIEBwYXJhbSBjcmVhdGVNYW5pZmVzdCAKKwkgKiBAdGhyb3dzIEFyY2hpdmVTYXZlRmFpbHVyZUV4Y2VwdGlvbgorCSAqLworCXByaXZhdGUgdm9pZCBzYXZlTWFuaWZlc3QoTGlzdDxJRmxhdFJlc291cmNlPiByZXNvdXJjZXMsIGJvb2xlYW4gY3JlYXRlTWFuaWZlc3QpIHRocm93cyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24geworCQlJRmxhdEZvbGRlciBtZXRhaW5mID0gKEZsYXRGb2xkZXIpVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5LmdldEV4aXN0aW5nTW9kdWxlUmVzb3VyY2UocmVzb3VyY2VzLCBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1FVEFfSU5GKSk7CisJCUlGbGF0RmlsZSBtYW5pZmVzdCA9IG51bGw7CisJCQorCQlpZiAobWV0YWluZiAhPSBudWxsKSB7CisJCQlJRmxhdFJlc291cmNlW10gY2hpbGRyZW4gPSBtZXRhaW5mLm1lbWJlcnMoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoY2hpbGRyZW5baV0uZ2V0TmFtZSgpLmVxdWFscyhKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1NIT1JUX05BTUUpKSB7CisJCQkJCW1hbmlmZXN0ID0gKElGbGF0RmlsZSkgY2hpbGRyZW5baV07CisJCQkJCUlQYXRoIGVudHJ5UGF0aCA9IG1hbmlmZXN0LmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLmFwcGVuZChtYW5pZmVzdC5nZXROYW1lKCkpOworCQkJCQlhZGRaaXBFbnRyeShtYW5pZmVzdCwgZW50cnlQYXRoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChjcmVhdGVNYW5pZmVzdCAmJiBtYW5pZmVzdCA9PSBudWxsKSB7CisJCQkvL21hbmlmZXN0IG5vdCBmb3VuZCBzbyBjcmVhdGUgb25lIGZvciB0aGUgYXJjaGl2ZQorCQkJY3JlYXRlTWFuaWZlc3QoKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVNYW5pZmVzdCgpIHRocm93cyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24geworCQlTdHJpbmcgbWFuaWZlc3RDb250ZW50cyA9ICJNYW5pZmVzdC1WZXJzaW9uOiAxLjBcclxuXHJcbiI7IC8vJE5PTi1OTFMtMSQKKwkJdHJ5IHsKKwkJCVppcEVudHJ5IGVudHJ5ID0gbmV3IFppcEVudHJ5KEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKTsKKwkJCWdldFppcE91dHB1dFN0cmVhbSgpLnB1dE5leHRFbnRyeShlbnRyeSk7CisJCQlBcmNoaXZlVXRpbC5jb3B5KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShtYW5pZmVzdENvbnRlbnRzLmdldEJ5dGVzKCkpLCBnZXRaaXBPdXRwdXRTdHJlYW0oKSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24oZSk7CisJCX0KKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlZENvbXBvbmVudHMoTGlzdDxJVmlydHVhbENvbXBvbmVudD4gY29tcG9uZW50TGlzdCkgeworCQljb21wb25lbnRzQXJjaGl2ZWQuYWRkQWxsKGNvbXBvbmVudExpc3QpOworCX0KKworCXB1YmxpYyBqYXZhLmlvLk91dHB1dFN0cmVhbSBnZXREZXN0aW5hdGlvblN0cmVhbSgpIHsKKwkJcmV0dXJuIGRlc3RpbmF0aW9uU3RyZWFtOworCX0KKworCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoKSB7CisJCXJldHVybiBjb21wb25lbnQ7CisJfQorCisJcHVibGljIElGbGF0VmlydHVhbENvbXBvbmVudCBnZXRGbGF0Q29tcG9uZW50KCkgeworCQlyZXR1cm4gZmxhdENvbXBvbmVudDsKKwl9CisKKwlwdWJsaWMgTGlzdDxJUGF0aD4gZ2V0WmlwRW50cmllcygpIHsKKwkJcmV0dXJuIHppcEVudHJpZXM7CisJfQorCisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0lPdmVyd3JpdGVIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0lPdmVyd3JpdGVIYW5kbGVyLmphdmEKaW5kZXggYjQ3YjI2ZS4uYjU1NWRkZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9JT3ZlcndyaXRlSGFuZGxlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSU92ZXJ3cml0ZUhhbmRsZXIuamF2YQpAQCAtMTgsOSArMTgsMTAgQEAKIAogCiAvKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg0LzE2LzIwMDEgMzoxMjo0MSBQTSkKKyAqIEBkZXByZWNhdGVkIHRoaXMgd2lsbCBiZSBkZWxldGVkIHBvc3QgV1RQIDMuMi4gIFRoaXMgY29kZSBpcyBubyBsb25nZXIKKyAqIGNhbGxlZCBiZWNhdXNlIHRoZSBJQXJjaGl2ZSBBUEkgaXMgdXNlZCB0byBoYW5kbGUgaW1wb3J0cy4KICAqIAotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgorICogQGF1dGhvciBqc2hvbGwKICAqLwogcHVibGljIGludGVyZmFjZSBJT3ZlcndyaXRlSGFuZGxlciB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk8gPSBFSkJBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLk5vX1VJOyAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSjJFRUFydGlmYWN0RXhwb3J0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVBcnRpZmFjdEV4cG9ydE9wZXJhdGlvbi5qYXZhCmluZGV4IDhjMGUzYWMuLjMyMzdhMzEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSjJFRUFydGlmYWN0RXhwb3J0T3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFQXJ0aWZhY3RFeHBvcnRPcGVyYXRpb24uamF2YQpAQCAtNDIsMTIgKzQyLDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLk11bHRpUnVsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5TYXZlRmFpbHVyZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3BlcnRpZXMuSUFyY2hpdmVFeHBvcnRQYXJ0aWNpcGFudERhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5Db21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5KYXZhRUVBcmNoaXZlVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5MaWJDb3B5QnVpbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LlByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUZhY3Rvcnk7CkBAIC01OCwxMiArNTgsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwogCisvKioKKyAqIEBkZXByZWNhdGVkIHVzZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuSmF2YUVFQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uIGluc3RlYWQKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEoyRUVBcnRpZmFjdEV4cG9ydE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKIAogCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjsKIAlwcml2YXRlIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudDsKIAlwcml2YXRlIElQYXRoIGRlc3RpbmF0aW9uUGF0aDsKLQlwcml2YXRlIE1vZHVsZUZpbGUgbW9kdWxlRmlsZTsKIAlwcml2YXRlIGJvb2xlYW4gZXhwb3J0U291cmNlID0gZmFsc2U7CiAKIAlwdWJsaWMgSjJFRUFydGlmYWN0RXhwb3J0T3BlcmF0aW9uKCkgewpAQCAtMTAxLDYgKzEwMyw3IEBACiAJCXJldHVybiB0b3RhbFdvcms7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogCQlzZXRDb21wb25lbnQoKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RlbC5nZXRQcm9wZXJ0eShDT01QT05FTlQpKTsKIAkJc2V0RGVzdGluYXRpb25QYXRoKG5ldyBQYXRoKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEFSQ0hJVkVfREVTVElOQVRJT04pKSk7CkBAIC0xMTksMTMgKzEyMiw4IEBACiAgICAgCQkJfQogICAgIAkJCWV4cG9ydCgpOwogICAgIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAJCQlpZihtb2R1bGVGaWxlICE9IG51bGwpewotICAgIAkJCQkvL1RoZSBtb2R1bGUgZmlsIHdpbGwgYmUgY2xvc2VkIGlmIHRoZSBleHBvcnQgc3VjY2VlZHMKLSAgICAJCQkJLy9OZWVkIHRvIGJlIGNhcmVmdWwgbm90IHRvIGNsb3NlIHRoZSBhcmNoaXZlIHR3aWNlIGJlY2F1c2Ugb2YgUmVmZXJlbmNlQ291bnRlZCBBcmNoaXZlcwotICAgIAkJCQltb2R1bGVGaWxlLmNsb3NlKCk7IAotICAgIAkJCQltb25pdG9yLndvcmtlZChDTE9TRV9XT1JLKTsKLSAgICAJCQl9Ci0gICAgCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihFSkJBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLkVycm9yX2V4cG9ydGluZ19fVUlfICsgYXJjaGl2ZVN0cmluZygpLCBlKTsKKyAgICAJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKEVKQkFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuRXJyb3JfZXhwb3J0aW5nX19VSV8gKyBnZXREZXN0aW5hdGlvblBhdGgoKSwgZSk7CisKICAgICAJCX0KICAgICAJCQogICAgICAgICAgICAgZmluYWwgSURhdGFNb2RlbCBkbSA9IGdldERhdGFNb2RlbCgpOwpAQCAtMTUxLDkgKzE0OSwyMSBAQAogCQlyZXR1cm4gT0tfU1RBVFVTOwogCX0KIAotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGV4cG9ydCgpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGFyY2hpdmVTdHJpbmcoKTsKKwlwdWJsaWMgdm9pZCBleHBvcnQoKSB0aHJvd3MgQXJjaGl2ZUV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQlJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHByb2dyZXNzTW9uaXRvciwgRVhQT1JUX1dPUkspOworCQlJQXJjaGl2ZSBhcmNoaXZlRnJvbUNvbXBvbmVudCA9IG51bGw7CisJCXRyeSB7CisJCQlhcmNoaXZlRnJvbUNvbXBvbmVudCA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0Uub3BlbkFyY2hpdmUoZ2V0Q29tcG9uZW50KCkpOworCQkJc2F2ZUFyY2hpdmUoYXJjaGl2ZUZyb21Db21wb25lbnQsIGdldERlc3RpbmF0aW9uUGF0aCgpLnRvT1NTdHJpbmcoKSwgc3ViTW9uaXRvcik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgQXJjaGl2ZUV4Y2VwdGlvbihBcHBDbGllbnRBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyLkFSQ0hJVkVfT1BFUkFUSU9OX09wZW5pbmdBcmNoaXZlLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChhcmNoaXZlRnJvbUNvbXBvbmVudCAhPSBudWxsKXsKKwkJCQlKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmNsb3NlQXJjaGl2ZShhcmNoaXZlRnJvbUNvbXBvbmVudCk7CisJCQl9CisJCQlzdWJNb25pdG9yLmRvbmUoKTsKKwkJfQorCX0KIAogCXByb3RlY3RlZCB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG5ld1Byb2dyZXNzTW9uaXRvcikgewogCQlwcm9ncmVzc01vbml0b3IgPSBuZXdQcm9ncmVzc01vbml0b3I7CkBAIC0xODksMTQgKzE5OSw2IEBACiAJCWV4cG9ydFNvdXJjZSA9IG5ld0V4cG9ydFNvdXJjZTsKIAl9CiAKLQlwcm90ZWN0ZWQgTW9kdWxlRmlsZSBnZXRNb2R1bGVGaWxlKCkgewotCQlyZXR1cm4gbW9kdWxlRmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2R1bGVGaWxlKE1vZHVsZUZpbGUgbmV3TW9kdWxlRmlsZSkgewotCQltb2R1bGVGaWxlID0gbmV3TW9kdWxlRmlsZTsKLQl9Ci0KIAlwcm90ZWN0ZWQgdm9pZCBydW5OZWNlc3NhcnlCdWlsZGVycyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQl0cnl7CiAJCQltb25pdG9yLmJlZ2luVGFzayhudWxsLCBKQVZBX0JVSUxERVJfV09SSyArIExJQl9CVUlMREVSX1dPUkspOwpAQCAtMjQ5LDYgKzI1MSw3IEBACiAKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVNjaGVkdWxpbmdSdWxlIGdldFNjaGVkdWxpbmdSdWxlKCkgewogCQlTZXQgcHJvanMgPSBnYXRoZXJEZXBlbmRlbnRQcm9qZWN0cyhnZXRDb21wb25lbnQoKSwgbmV3IEhhc2hTZXQoKSk7CiAJCUlTY2hlZHVsaW5nUnVsZSBjb21iaW5lZFJ1bGUgPSBudWxsOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFQXJ0aWZhY3RJbXBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSjJFRUFydGlmYWN0SW1wb3J0T3BlcmF0aW9uLmphdmEKaW5kZXggZjc4YWFlMC4uOWI4MzM3NyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFQXJ0aWZhY3RJbXBvcnRPcGVyYXRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVBcnRpZmFjdEltcG9ydE9wZXJhdGlvbi5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5TYXZlU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQXJjaGl2ZVdyYXBwZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5Db21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXI7CkBAIC0zOCwxMCArMzYsNiBAQAogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUFydGlmYWN0SW1wb3J0T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gewogCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjYXJjaGl2ZVdyYXBwZXJ9Ci0JICovCi0JcHJvdGVjdGVkIEFyY2hpdmUgbW9kdWxlRmlsZTsKIAlwcm90ZWN0ZWQgQXJjaGl2ZVdyYXBwZXIgYXJjaGl2ZVdyYXBwZXI7CiAJcHJvdGVjdGVkIElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQ7CiAJcHJvdGVjdGVkIElBZGFwdGFibGUgaW5mbzsKQEAgLTUzLDExICs0NywxMSBAQAogCQlzdXBlcihtb2RlbCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYW5JbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucGF1c2VVcGRhdGVzKCk7CiAJCQl0aGlzLmluZm8gPSBhbkluZm87Ci0JCQltb2R1bGVGaWxlID0gKEFyY2hpdmUpIG1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFKTsKIAkJCWFyY2hpdmVXcmFwcGVyID0gKEFyY2hpdmVXcmFwcGVyKW1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX1dSQVBQRVIpOwogCQkJbW9uaXRvci5iZWdpblRhc2soUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkltcG9ydGluZ19hcmNoaXZlLCBuZXcgT2JqZWN0IFtdIHsgYXJjaGl2ZVdyYXBwZXIuZ2V0UGF0aCgpIH0pLCBjb21wdXRlVG90YWxXb3JrKCkpOwogCQkJZG9FeGVjdXRlKG1vbml0b3IpOwpAQCAtMTA5LDE1ICsxMDMsNiBAQAogCQl9CiAJfQogCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgYXBwcm9wcmlhdGUgc2F2ZSBzdHJhdGVneS4gU3ViY2xhc2VzIHNob3VsZCBvdmVyd3JpdGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIHRoZQotCSAqIGFwcHJvcHJpYXRlIHNhdmUgc3RhcnRlZ3kgZm9yIHRoZSBraW5kIG9mIEoyRUUgbW9kdWxlIHByb2plY3QgdG8gaW1wb3J0IHRoZSBhcmNoaXZlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFNhdmVTdHJhdGVneSBjcmVhdGVTYXZlU3RyYXRlZ3koSVZpcnR1YWxDb21wb25lbnQgdmMpOwotCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5U3RyYXRlZ3koU2F2ZVN0cmF0ZWd5IHNhdmVTdHJhdCkgewotCX0KLQkKIAlwcm90ZWN0ZWQgQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyIGdldEFyY2hpdmVTYXZlQWRhcHRlcihJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50KXsKIAkJcmV0dXJuIG5ldyBDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIodmlydHVhbENvbXBvbmVudCk7CiAJfQpAQCAtMTMxLDIxICsxMTYsMTEgQEAKIAlwcm90ZWN0ZWQgdm9pZCBpbXBvcnRNb2R1bGVGaWxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCW1vbml0b3IuYmVnaW5UYXNrKG51bGwsIGFyY2hpdmVXcmFwcGVyLmdldFNpemUoKSk7Ci0JCQlpZihhcmNoaXZlV3JhcHBlci5nZXRJQXJjaGl2ZSgpICE9IG51bGwpewotCQkJCUlBcmNoaXZlIGFyY2hpdmUgPSBhcmNoaXZlV3JhcHBlci5nZXRJQXJjaGl2ZSgpOwotCQkJCUNvbXBvbmVudEFyY2hpdmVTYXZlQWRhcHRlciBhZGFwID0gZ2V0QXJjaGl2ZVNhdmVBZGFwdGVyKHZpcnR1YWxDb21wb25lbnQpOwotCQkJCUFyY2hpdmVPcHRpb25zIHNhdmVPcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQkJc2F2ZU9wdGlvbnMuc2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLlNBVkVfQURBUFRFUiwgYWRhcCk7Ci0JCQkJYXJjaGl2ZUZhY3Rvcnkuc2F2ZUFyY2hpdmUoYXJjaGl2ZSwgc2F2ZU9wdGlvbnMsbW9uaXRvcik7Ci0JCQl9ZWxzZXsKLQkJCQlDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIGFTdHJhdGVneSA9IChDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKSBjcmVhdGVTYXZlU3RyYXRlZ3kodmlydHVhbENvbXBvbmVudCk7Ci0JCQkJYVN0cmF0ZWd5LnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQkJCQlhU3RyYXRlZ3kuc2V0T3ZlcndyaXRlSGFuZGxlcigoSU92ZXJ3cml0ZUhhbmRsZXIpIG1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfSEFORExFUikpOwotCQkJCWFTdHJhdGVneS5zZXREYXRhTW9kZWwobW9kZWwpOwotCQkJCW1vZGlmeVN0cmF0ZWd5KGFTdHJhdGVneSk7Ci0JCQkJYXJjaGl2ZVdyYXBwZXIuZ2V0Q29tbW9uQXJjaGl2ZSgpLnNhdmUoYVN0cmF0ZWd5KTsKLQkJCX0KLQkJCQorCQkJSUFyY2hpdmUgYXJjaGl2ZSA9IGFyY2hpdmVXcmFwcGVyLmdldElBcmNoaXZlKCk7CisJCQlDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIgYWRhcCA9IGdldEFyY2hpdmVTYXZlQWRhcHRlcih2aXJ0dWFsQ29tcG9uZW50KTsKKwkJCUFyY2hpdmVPcHRpb25zIHNhdmVPcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7CisJCQlzYXZlT3B0aW9ucy5zZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuU0FWRV9BREFQVEVSLCBhZGFwKTsKKwkJCWFyY2hpdmVGYWN0b3J5LnNhdmVBcmNoaXZlKGFyY2hpdmUsIHNhdmVPcHRpb25zLG1vbml0b3IpOwogCQl9IGNhdGNoIChPdmVyd3JpdGVIYW5kbGVyRXhjZXB0aW9uIG9lKSB7CiAJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKaW5kZXggZTNlNjAzZS4uMTU0Yjc2MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSjJFRUNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogCQlzdXBlcihjb21wb25lbnQsIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0RmlsZXMoKSB7CiAJCXN1cGVyLmdldEZpbGVzKCk7CiAJCWlmIChpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IGVlZjdkNWYuLmU2N2ZiZGIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSjJFRUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEKQEAgLTI1LDE3ICsyNSwyMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7CiAKKy8qKgorICogQGRlcHJlY2F0ZWQgdGhpcyB3aWxsIGJlIGRlbGV0ZWQgcG9zdCBXVFAgMy4yLiAgVGhpcyBjb2RlIGlzIG5vIGxvbmdlcgorICogY2FsbGVkIGJlY2F1c2UgdGhlIElBcmNoaXZlIEFQSSBpcyB1c2VkIHRvIGhhbmRsZSBpbXBvcnRzLgorICogCisgKiBAYXV0aG9yIGpzaG9sbAorICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgZXh0ZW5kcyBDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIHsKIAogCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRE9UX0NMQVNTID0gIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKQEAgLTQ1LDEzICs1MSwxNCBAQAogCQlzdXBlcih2Q29tcG9uZW50KTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBzYXZlRmlsZXMoKSB0aHJvd3MgU2F2ZUZhaWx1cmVFeGNlcHRpb24gewogCQlzdXBlci5zYXZlRmlsZXMoKTsKIAkJbGlua0ltcG9ydGVkQ2xhc3Nlc0ZvbGRlcklmTmVjZXNzYXJ5KCk7CiAJCXRyeSB7CiAJCQl2Q29tcG9uZW50LmdldFByb2plY3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZXgpOwogCQl9CiAJfQogCkBAIC02MSw2ICs2OCw3IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRTYXZlKEZpbGUgYUZpbGUpIHsKIAkJaWYgKGVuZHNXaXRoQ2xhc3NUeXBlKGFGaWxlLmdldFVSSSgpKSl7CiAJCQlib29sZWFuIHNob3VsZFNhdmUgPSBpc0NsYXNzV2l0aG91dFNvdXJjZShhRmlsZSk7CkBAIC03Miw2ICs4MCw3IEBACiAJCXJldHVybiBzdXBlci5zaG91bGRTYXZlKGFGaWxlKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBzYXZlKEFyY2hpdmVNYW5pZmVzdCBhTWFuaWZlc3QpIHRocm93cyBTYXZlRmFpbHVyZUV4Y2VwdGlvbiB7CiAJCUlWaXJ0dWFsRm9sZGVyIHJvb3RGb2xkZXIgPSB2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKIAkJSVZpcnR1YWxGaWxlIHZGaWxlID0gcm9vdEZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7CkBAIC04MSwxMiArOTAsMTIgQEAKIAkJdHJ5IHsKIAkJCWFNYW5pZmVzdC53cml0ZShvdXQpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9IGZpbmFsbHkgewogCQkJdHJ5IHsKIAkJCQlvdXQuY2xvc2UoKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfQogCX0KQEAgLTEwMSw3ICsxMTAsNyBAQAogCQl0cnkgewogCQkJaW1wb3J0ZWRDbGFzc2VzRm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUxKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZTEpOwogCQl9CiAJfQogCQpAQCAtMTIwLDcgKzEyOSw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfQogCX0KQEAgLTEzMCw5ICsxMzksMTAgQEAKIAl9CiAKIAlwcm90ZWN0ZWQgSVBhdGggZ2V0SW1wb3J0ZWRDbGFzc2VzUnVudGltZVBhdGgoKSB7Ci0JCXJldHVybiBuZXcgUGF0aCgiLyIpOworCQlyZXR1cm4gbmV3IFBhdGgoIi8iKTsgLy8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBJUGF0aCBnZXRPdXRwdXRQYXRoRm9yRmlsZShGaWxlIGFGaWxlKSB7CiAJCWlmKGVuZHNXaXRoQ2xhc3NUeXBlKGFGaWxlLmdldFVSSSgpKSl7CiAJCQlyZXR1cm4gaW1wb3J0ZWRDbGFzc2VzRm9sZGVyLmdldEZpbGUoZ2V0SW1wb3J0ZWRDbGFzc2VzVVJJKGFGaWxlKSkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFSmF2YUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSjJFRUphdmFDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEKaW5kZXggMWM5MjliNS4uYTQ4NjcxMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KMkVFSmF2YUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0oyRUVKYXZhQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCkBAIC0xMiw2ICsxMiwxMiBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIAorLyoqCisgKiBAZGVwcmVjYXRlZCB0aGlzIHdpbGwgYmUgZGVsZXRlZCBwb3N0IFdUUCAzLjIuICBUaGlzIGNvZGUgaXMgbm8gbG9uZ2VyCisgKiBjYWxsZWQgYmVjYXVzZSB0aGUgSUFyY2hpdmUgQVBJIGlzIHVzZWQgdG8gaGFuZGxlIGltcG9ydHMuCisgKiAKKyAqIEBhdXRob3IganNob2xsCisgKi8KIHB1YmxpYyBjbGFzcyBKMkVFSmF2YUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgZXh0ZW5kcyBKMkVFQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCB7CiAKIAlwdWJsaWMgSjJFRUphdmFDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKElWaXJ0dWFsQ29tcG9uZW50IHZDb21wb25lbnQpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSmF2YUNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSmF2YUNvbXBvbmVudExvYWRTdHJhdGVneUltcGwuamF2YQppbmRleCA5MzhkYTAyLi44MjllN2ZhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0phdmFDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KYXZhQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbC5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiAJCXN1cGVyKHZDb21wb25lbnQsIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0RmlsZXMoKSB7CiAJCXN1cGVyLmdldEZpbGVzKCk7CiAJCWlmIChpbmNsdWRlQ2xhc3NwYXRoQ29tcG9uZW50cykgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KYXZhQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KYXZhQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbC5qYXZhCmluZGV4IDIyNjk3MTguLmE4ZDY3ODQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSmF2YUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2FyY2hpdmVvcHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvYXJjaGl2ZS9vcGVyYXRpb25zL0phdmFDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsLmphdmEKQEAgLTEyLDYgKzEyLDEyIEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogCisvKioKKyAqIEBkZXByZWNhdGVkIHRoaXMgd2lsbCBiZSBkZWxldGVkIHBvc3QgV1RQIDMuMi4gIFRoaXMgY29kZSBpcyBubyBsb25nZXIKKyAqIGNhbGxlZCBiZWNhdXNlIHRoZSBJQXJjaGl2ZSBBUEkgaXMgdXNlZCB0byBoYW5kbGUgaW1wb3J0cy4KKyAqIAorICogQGF1dGhvciBqc2hvbGwKKyAqLwogcHVibGljIGNsYXNzIEphdmFDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIGV4dGVuZHMgQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCB7CiAKIAlwdWJsaWMgSmF2YUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwoSVZpcnR1YWxDb21wb25lbnQgdkNvbXBvbmVudCkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9hcmNoaXZlb3BzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2FyY2hpdmUvb3BlcmF0aW9ucy9KYXZhRUVDb21wb25lbnRFeHBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSmF2YUVFQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4ZmVjZAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYXJjaGl2ZW9wcy9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9hcmNoaXZlL29wZXJhdGlvbnMvSmF2YUVFQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9uczsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuQWRkQ2xhc3NwYXRoRm9sZGVyc1BhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS5BZGRDbGFzc3BhdGhMaWJSZWZlcmVuY2VzUGFydGljaXBhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLkFkZE1hcHBlZE91dHB1dEZvbGRlcnNQYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuUmVwbGFjZU1hbmlmZXN0RXhwb3J0UGFydGljaXBhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmV4cG9ydG1vZGVsLkphdmFFRUNvbXBvbmVudEV4cG9ydENhbGxiYWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkFic3RyYWN0RmxhdHRlblBhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkZpbHRlclJlc291cmNlUGFydGljaXBhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXR0ZW5QYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5GbGF0VmlydHVhbENvbXBvbmVudC5GbGF0Q29tcG9uZW50VGFza01vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CisKK3B1YmxpYyBjbGFzcyBKYXZhRUVDb21wb25lbnRFeHBvcnRPcGVyYXRpb24gZXh0ZW5kcyBDb21wb25lbnRFeHBvcnRPcGVyYXRpb24geworCisJcHVibGljIEphdmFFRUNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbigpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwlwdWJsaWMgSmF2YUVFQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKKwkJc3VwZXIobW9kZWwpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgTGlzdDxJRmxhdHRlblBhcnRpY2lwYW50PiBnZXRQYXJ0aWNpcGFudHMoKSB7CQkKKwkJTGlzdDxJRmxhdHRlblBhcnRpY2lwYW50PiBwYXJ0aWNpcGFudHMgPSBuZXcgQXJyYXlMaXN0PElGbGF0dGVuUGFydGljaXBhbnQ+KCk7CisJCVN0cmluZ1tdIGZpbHRlcmVkRXh0ZW5zaW9ucyA9IGdldEZpbHRlcmVkRXh0ZW5zaW9ucygpOworCQkKKwkJcGFydGljaXBhbnRzLmFkZChjcmVhdGVIaWVyYXJjaHlQYXJ0aWNpcGFudCgpKTsKKwkJcGFydGljaXBhbnRzLmFkZChuZXcgQWRkTWFwcGVkT3V0cHV0Rm9sZGVyc1BhcnRpY2lwYW50KGZpbHRlcmVkRXh0ZW5zaW9ucykpOworCQlwYXJ0aWNpcGFudHMuYWRkKEZpbHRlclJlc291cmNlUGFydGljaXBhbnQuY3JlYXRlU3VmZml4RmlsdGVyUGFydGljaXBhbnQoZmlsdGVyZWRFeHRlbnNpb25zKSk7CisJCXBhcnRpY2lwYW50cy5hZGQobmV3IEFkZENsYXNzcGF0aExpYlJlZmVyZW5jZXNQYXJ0aWNpcGFudCgpKTsKKwkJcGFydGljaXBhbnRzLmFkZChuZXcgQWRkQ2xhc3NwYXRoRm9sZGVyc1BhcnRpY2lwYW50KCkpOwkKKwkJaWYgKENsYXNzcGF0aERlcGVuZGVuY3lFbmFibGVtZW50LmlzQWxsb3dDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5KCkpIHsKKwkJCXBhcnRpY2lwYW50cy5hZGQobmV3IFJlcGxhY2VNYW5pZmVzdEV4cG9ydFBhcnRpY2lwYW50KG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSkpOworCQl9CisJCQorCQlyZXR1cm4gcGFydGljaXBhbnRzOworCX0KKwkKKwlwcm90ZWN0ZWQgSUZsYXR0ZW5QYXJ0aWNpcGFudCBjcmVhdGVIaWVyYXJjaHlQYXJ0aWNpcGFudCgpIHsKKwkJcmV0dXJuIG5ldyBBYnN0cmFjdEZsYXR0ZW5QYXJ0aWNpcGFudCgpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaXNDaGlsZE1vZHVsZShJVmlydHVhbENvbXBvbmVudCByb290Q29tcG9uZW50LCBJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UsIEZsYXRDb21wb25lbnRUYXNrTW9kZWwgZGF0YU1vZGVsKSB7CisJCQkJaWYgKCFyZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmlzQmluYXJ5KCkpIHsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRmxhdENvbXBvbmVudEFyY2hpdmVyIGNyZWF0ZUZsYXRDb21wb25lbnRBcmNoaXZlcihPdXRwdXRTdHJlYW0gb3V0KSB7CisJCXJldHVybiBuZXcgRmxhdENvbXBvbmVudEFyY2hpdmVyKGdldENvbXBvbmVudCgpLCBvdXQsIGdldFBhcnRpY2lwYW50cygpLCBuZXcgSmF2YUVFQ29tcG9uZW50RXhwb3J0Q2FsbGJhY2soaXNFeHBvcnRTb3VyY2UoKSkpOworCX0KKwkKKwkKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvYnVpbGQucHJvcGVydGllcwppbmRleCAyMmIyOTE4Li5kZWZhNDBiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0yOSw3ICsyOSw4IEBACiAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLyxcCiAgICAgICAgICAgIHJlZmFjdG9yLyxcCiAgICAgICAgICAgIGNsYXNzcGF0aGRlcC8sXAotICAgICAgICAgICBjb250ZW50dHlwZS8KKyAgICAgICAgICAgY29udGVudHR5cGUvLFwKKyAgICAgICAgICAgbHRrYmFzZWRyZWZhY3RvcmluZy8KIGphcnMuY29tcGlsZS5vcmRlciA9IC4KIHNyYy5pbmNsdWRlcyA9IHJvc2UvLFwKICAgICAgICAgICAgICAgIHNjaGVtYS8sXApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0NmNhZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9uLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcDsKKworCisvKioKKyAqIAorICogVGhpcyBhYnN0cmFjdCBjbGFzcyBpcyB1c2VkIGJ5IGV4dGVuZGVycyBvZiB0aGUgQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbiBleHRlbnNpb24KKyAqCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9uIGltcGxlbWVudHMgSUNsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb24KK3sKKyAgLy8gTGVmdCBlbXB0eQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuamF2YQppbmRleCA4NzFlN2M4Li4yNTVhMTgwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwpAQCAtMjgsMjYgKzI3LDI1IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuSUNsYXNzcGF0aERlcGVuZGVuY3lDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuamF2YWxpdGUuSUphdmFQcm9qZWN0TGl0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5qYXZhbGl0ZS5KYXZhQ29yZUxpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yLkNsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JEYXRhOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRWFyVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LldlYlV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLk1vZHVsZVVSSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKQEAgLTk2LDIzICs5NCwxNiBAQAogCXB1YmxpYyBzdGF0aWMgTWFwIDxJQ2xhc3NwYXRoRW50cnksIElDbGFzc3BhdGhBdHRyaWJ1dGU+IGdldFJhd0NvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhmaW5hbCBJSmF2YVByb2plY3RMaXRlIGphdmFQcm9qZWN0TGl0ZSwgRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGUgYXR0cmlidXRlVHlwZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlyZXR1cm4gZ2V0UmF3Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGphdmFQcm9qZWN0TGl0ZSwgYXR0cmlidXRlVHlwZSwgZmFsc2UpOwogCX0KLQlwdWJsaWMgc3RhdGljIE1hcCA8SUNsYXNzcGF0aEVudHJ5LCBJQ2xhc3NwYXRoQXR0cmlidXRlPiBnZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoZmluYWwgSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUsIERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlIGF0dHJpYnV0ZVR5cGUsIGZpbmFsIGJvb2xlYW4gd2ViTGlic09ubHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGphdmFQcm9qZWN0TGl0ZSA9PSBudWxsIHx8ICghd2ViTGlic09ubHkgJiYgIUNsYXNzcGF0aERlcGVuZGVuY3lFbmFibGVtZW50LmlzQWxsb3dDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5KCkpKSB7CisJcHVibGljIHN0YXRpYyBNYXAgPElDbGFzc3BhdGhFbnRyeSwgSUNsYXNzcGF0aEF0dHJpYnV0ZT4gZ2V0UmF3Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGZpbmFsIElKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlLCBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZSBhdHRyaWJ1dGVUeXBlLCBmaW5hbCBib29sZWFuIGlzTGVnYWN5SjJFRSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoamF2YVByb2plY3RMaXRlID09IG51bGwpIHsKIAkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwogCQl9CiAJCWZpbmFsIE1hcDxJQ2xhc3NwYXRoRW50cnksIElDbGFzc3BhdGhBdHRyaWJ1dGU+IHJlZmVyZW5jZWRSYXdFbnRyaWVzID0gbmV3IEhhc2hNYXA8SUNsYXNzcGF0aEVudHJ5LCBJQ2xhc3NwYXRoQXR0cmlidXRlPigpOwogCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3RMaXRlLnJlYWRSYXdDbGFzc3BhdGgoKTsKICAgICAgICAgZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBlbnRyaWVzKSB7Ci0gICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYiA9IGNoZWNrRm9yQ29tcG9uZW50RGVwZW5kZW5jeUF0dHJpYnV0ZShlbnRyeSwgYXR0cmlidXRlVHlwZSwgd2ViTGlic09ubHkpOworICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSBjaGVja0ZvckNvbXBvbmVudERlcGVuZGVuY3lBdHRyaWJ1dGUoZW50cnksIGF0dHJpYnV0ZVR5cGUsIGlzTGVnYWN5SjJFRSk7CiAgICAgICAgICAgICBpZiAoYXR0cmliICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlpZih3ZWJMaWJzT25seSkgewotICAgICAgICAgICAgCQlpZihEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5DTEFTU1BBVEhfQ09NUE9ORU5UX05PTkRFUEVOREVOQ1kgPT0gYXR0cmlidXRlVHlwZSB8fCBXZWJVdGlsaXRpZXMuV0VCTElCLnRvU3RyaW5nKCkuZXF1YWxzKGF0dHJpYi5nZXRWYWx1ZSgpKSl7Ci0gICAgICAgICAgICAJCQlyZWZlcmVuY2VkUmF3RW50cmllcy5wdXQoZW50cnksIGF0dHJpYik7Ci0gICAgICAgICAgICAJCX0KLSAgICAgICAgICAgIAl9IGVsc2V7Ci0gICAgICAgICAgICAJCXJlZmVyZW5jZWRSYXdFbnRyaWVzLnB1dChlbnRyeSwgYXR0cmliKTsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAJCisgICAgICAgICAgICAJcmVmZXJlbmNlZFJhd0VudHJpZXMucHV0KGVudHJ5LCBhdHRyaWIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZWZlcmVuY2VkUmF3RW50cmllczsKQEAgLTE0MiwxMSArMTMzLDExIEBACiAJcHVibGljIHN0YXRpYyBMaXN0IDxJQ2xhc3NwYXRoRW50cnk+IGdldFBvdGVudGlhbENvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhmaW5hbCBJSmF2YVByb2plY3RMaXRlIGphdmFQcm9qZWN0TGl0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlyZXR1cm4gZ2V0UG90ZW50aWFsQ29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGphdmFQcm9qZWN0TGl0ZSwgZmFsc2UpOwogCX0JCQotCXB1YmxpYyBzdGF0aWMgTGlzdCA8SUNsYXNzcGF0aEVudHJ5PiBnZXRQb3RlbnRpYWxDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoZmluYWwgSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUsIGZpbmFsIGJvb2xlYW4gd2ViTGlic09ubHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIExpc3QgPElDbGFzc3BhdGhFbnRyeT4gZ2V0UG90ZW50aWFsQ29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGZpbmFsIElKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlLCBmaW5hbCBib29sZWFuIGlzTGVnYWN5SjJFRSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCiAJCWZpbmFsIExpc3QgPElDbGFzc3BhdGhFbnRyeT4gcG90ZW50aWFsUmF3RW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwogCi0JCWlmIChqYXZhUHJvamVjdExpdGUgPT0gbnVsbCB8fCAhamF2YVByb2plY3RMaXRlLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSB8fCAoIXdlYkxpYnNPbmx5ICYmICFDbGFzc3BhdGhEZXBlbmRlbmN5RW5hYmxlbWVudC5pc0FsbG93Q2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jeSgpKSkgeworCQlpZiAoamF2YVByb2plY3RMaXRlID09IG51bGwgfHwgIWphdmFQcm9qZWN0TGl0ZS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHsKIAkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKIAkJfQogCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gamF2YVByb2plY3RMaXRlLmdldFByb2plY3QoKTsKQEAgLTE1Niw3ICsxNDcsNyBAQAogCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3RMaXRlLnJlYWRSYXdDbGFzc3BhdGgoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSBjaGVja0ZvckNvbXBvbmVudERlcGVuZGVuY3lBdHRyaWJ1dGUoZW50cnksIERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkRFUEVOREVOQ1lfT1JfTk9OREVQRU5ERU5DWSwgd2ViTGlic09ubHkpOworICAgICAgICAgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSBjaGVja0ZvckNvbXBvbmVudERlcGVuZGVuY3lBdHRyaWJ1dGUoZW50cnksIERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkRFUEVOREVOQ1lfT1JfTk9OREVQRU5ERU5DWSwgaXNMZWdhY3lKMkVFKTsKICAgICAgICAgICAgIGlmIChhdHRyaWIgIT0gbnVsbCkgewogICAgICAgICAgICAgCWNvbnRpbnVlOyAvLyBhbHJlYWR5IGhhcyB0aGUgYXR0cmlidXRlCiAgICAgICAgICAgICB9CkBAIC0xNzcsOSArMTY4LDYgQEAKICAgICAgICAgCX0KICAgICAgICAgCWlmIChJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgPT0gZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKIAkJCQlmaW5hbCBib29sZWFuIGlzRmlsZSA9ICFDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5pc0NsYXNzRm9sZGVyRW50cnkoZW50cnkpOwotCQkJCWlmKHdlYkxpYnNPbmx5ICYmICFpc0ZpbGUpewotCQkJCQljb250aW51ZTsgLy9kaXJlY3RvcmllcyBkbyBub3QgZXZlciB3b3JrCi0JCQkJfQogCQkJCWlmIChpc0ZpbGUpIHsKIAkJCQkJYm9vbGVhbiBmb3VuZEVudHJ5ID0gZmFsc2U7CiAJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwpAQCAtMjEyLDEzICsyMDAsMTAgQEAKIAkJCQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSAoSVZpcnR1YWxSZWZlcmVuY2UpIG1hbmlmZXN0UmVmcy5nZXQoaik7CiAJCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgYyA9IHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CiAJCQkJCQkJaWYgKGMuaXNCaW5hcnkoKSkgewotCQkJCQkJCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBhcmNoaXZlQ29tcG9uZW50ID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBjOwotCQkJCQkJCQlJRmlsZSBmaWxlID0gYXJjaGl2ZUNvbXBvbmVudC5nZXRVbmRlcmx5aW5nV29ya2JlbmNoRmlsZSgpOwotCQkJCQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoZmlsZS5nZXRGdWxsUGF0aCgpLmVxdWFscyhlbnRyeS5nZXRQYXRoKCkpKSB7CisJCQkJCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpYy5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKKwkJCQkJCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmdldEZ1bGxQYXRoKCkuZXF1YWxzKGVudHJ5LmdldFBhdGgoKSkpIHsKIAkJCQkJCQkJCQlmb3VuZEVudHJ5ID0gdHJ1ZTsKIAkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCX0KIAkJCQkJCQkJfQogCQkJCQkJCX0KIAkJCQkJCX0KQEAgLTI4NSw4ICsyNzAsOCBAQAogCSAqIEByZXR1cm4gTWFwIGZyb20gSUNsYXNzcGF0aEVudHJ5IHRvIElDbGFzc3BhdGhBdHRyaWJ1dGUgZm9yIGNsYXNzcGF0aCBjb21wb25lbnQgZGVwZW5kZW5jaWVzLgogCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBUaHJvd24gaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgYWNjZXNzaW5nIHRoZSB1bnJlc29sdmVkIGNsYXNzcGF0aC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCA8SUNsYXNzcGF0aEVudHJ5LCBJQ2xhc3NwYXRoQXR0cmlidXRlPiBnZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoZmluYWwgSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUsIGZpbmFsIGJvb2xlYW4gaXNXZWJBcHApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhqYXZhUHJvamVjdExpdGUsIGlzV2ViQXBwLCB0cnVlKTsKKwlwdWJsaWMgc3RhdGljIE1hcCA8SUNsYXNzcGF0aEVudHJ5LCBJQ2xhc3NwYXRoQXR0cmlidXRlPiBnZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoZmluYWwgSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUsIGZpbmFsIGJvb2xlYW4gaXNMZWdhY3lKMkVFKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXJldHVybiBnZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3RMaXRlLCBpc0xlZ2FjeUoyRUUsIHRydWUpOwogCX0KIAogCS8qKgpAQCAtMjk3LDggKzI4Miw4IEBACiAJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCiAJICovCiAJQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIE1hcCA8SUNsYXNzcGF0aEVudHJ5LCBJQ2xhc3NwYXRoQXR0cmlidXRlPiBnZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBmaW5hbCBib29sZWFuIGlzV2ViQXBwKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoSmF2YUNvcmVMaXRlLmNyZWF0ZShqYXZhUHJvamVjdCksIGlzV2ViQXBwKTsKKwlwdWJsaWMgc3RhdGljIE1hcCA8SUNsYXNzcGF0aEVudHJ5LCBJQ2xhc3NwYXRoQXR0cmlidXRlPiBnZXRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBmaW5hbCBib29sZWFuIGlzTGVnYWN5SjJFRSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gZ2V0Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKEphdmFDb3JlTGl0ZS5jcmVhdGUoamF2YVByb2plY3QpLCBpc0xlZ2FjeUoyRUUpOwogCX0KIAogCS8qKgpAQCAtMzI1LDE4ICszMTAsMTMgQEAKIAkgKiBAcmV0dXJuIE1hcCBmcm9tIElDbGFzc3BhdGhFbnRyeSB0byBJQ2xhc3NwYXRoQXR0cmlidXRlIGZvciBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llcy4KIAkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gVGhyb3duIGlmIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIGFjY2Vzc2luZyB0aGUgdW5yZXNvbHZlZCBjbGFzc3BhdGguCiAJICovCi0JcHVibGljIHN0YXRpYyBNYXAgPElDbGFzc3BhdGhFbnRyeSwgSUNsYXNzcGF0aEF0dHJpYnV0ZT4gZ2V0Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGZpbmFsIElKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlLCBmaW5hbCBib29sZWFuIGlzV2ViQXBwLCBmaW5hbCBib29sZWFuIG9ubHlWYWxpZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZighaXNXZWJBcHAgJiYgIUNsYXNzcGF0aERlcGVuZGVuY3lFbmFibGVtZW50LmlzQWxsb3dDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5KCkpewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0JCX0KLQkJCi0JCWZpbmFsIGJvb2xlYW4gd2ViTGlic09ubHkgPSBpc1dlYkFwcCAmJiAhQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQuaXNBbGxvd0NsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3koKTsKLQkJCisJcHVibGljIHN0YXRpYyBNYXAgPElDbGFzc3BhdGhFbnRyeSwgSUNsYXNzcGF0aEF0dHJpYnV0ZT4gZ2V0Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGZpbmFsIElKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlLCBmaW5hbCBib29sZWFuIGlzTGVnYWN5SjJFRSwgZmluYWwgYm9vbGVhbiBvbmx5VmFsaWQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJZmluYWwgQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvckRhdGEgZGF0YSA9IG5ldyBDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yRGF0YShqYXZhUHJvamVjdExpdGUuZ2V0UHJvamVjdCgpKTsKLQkJCisJCWZpbmFsIGJvb2xlYW4gaXNXZWJBcHAgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoamF2YVByb2plY3RMaXRlLmdldFByb2plY3QoKSk7CiAJCS8vIGdldCB0aGUgcmF3IGVudHJpZXMKLQkJZmluYWwgTWFwPElDbGFzc3BhdGhFbnRyeSwgSUNsYXNzcGF0aEF0dHJpYnV0ZT4gcmVmZXJlbmNlZFJhd0VudHJpZXMgPSBnZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3RMaXRlLCBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1ksIHdlYkxpYnNPbmx5KTsKKwkJZmluYWwgTWFwPElDbGFzc3BhdGhFbnRyeSwgSUNsYXNzcGF0aEF0dHJpYnV0ZT4gcmVmZXJlbmNlZFJhd0VudHJpZXMgPSBnZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3RMaXRlLCBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1ksIGlzTGVnYWN5SjJFRSk7CiAJCWZpbmFsIE1hcDxJQ2xhc3NwYXRoRW50cnksIElDbGFzc3BhdGhBdHRyaWJ1dGU+IHZhbGlkUmF3RW50cmllcyA9IG5ldyBIYXNoTWFwPElDbGFzc3BhdGhFbnRyeSwgSUNsYXNzcGF0aEF0dHJpYnV0ZT4oKTsKKwkJZmluYWwgTWFwIDxJQ2xhc3NwYXRoRW50cnksIElDbGFzc3BhdGhBdHRyaWJ1dGU+IHZhbGlkUmF3Q2xhc3NQYXRoQ29udGFpbmVyRW50cmllcyA9IG5ldyBIYXNoTWFwIDxJQ2xhc3NwYXRoRW50cnksIElDbGFzc3BhdGhBdHRyaWJ1dGU+KCk7CiAKIAkJLy8gZmlsdGVyIG91dCBub24tdmFsaWQgcmVmZXJlbmNlZCByYXcgZW50cmllcwogCQlmaW5hbCBJdGVyYXRvcjxJQ2xhc3NwYXRoRW50cnk+IGkgPSByZWZlcmVuY2VkUmF3RW50cmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOwpAQCAtMzQ0LDEyICszMjQsMTkgQEAKIAkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGkubmV4dCgpOwogCQkJZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSByZWZlcmVuY2VkUmF3RW50cmllcy5nZXQoZW50cnkpOwogCQkJaWYgKGlzVmFsaWQoZW50cnksIGF0dHJpYiwgaXNXZWJBcHAsIGphdmFQcm9qZWN0TGl0ZS5nZXRQcm9qZWN0KCksIGRhdGEpKSB7Ci0JCQkJdmFsaWRSYXdFbnRyaWVzLnB1dChlbnRyeSwgYXR0cmliKTsKKwkJCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpCisJCQkJeworCQkJCQkvL1B1dCBpbiBhIHNlcGFyYXRlIG1hcCB0aGUgY2xhc3NwYXRoIGNvbnRhaW5lciBlbnRyaWVzLCBzaW5jZSB0aGV5IHdpbGwgYmUgaGFuZGxlZCBkaWZmZXJlbnRseQorCQkJCQl2YWxpZFJhd0NsYXNzUGF0aENvbnRhaW5lckVudHJpZXMucHV0KGVudHJ5LCBhdHRyaWIpOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJdmFsaWRSYXdFbnRyaWVzLnB1dChlbnRyeSwgYXR0cmliKTsKKwkJCQl9CiAJCQl9CiAJCX0KIAogCQkvLyBpZiB3ZSBoYXZlIG5vIHZhbGlkIHJhdyBlbnRyaWVzLCByZXR1cm4gZW1wdHkgbWFwCi0JCWlmICh2YWxpZFJhd0VudHJpZXMuaXNFbXB0eSgpKSB7CisJCWlmICh2YWxpZFJhd0VudHJpZXMuaXNFbXB0eSgpICYmIHZhbGlkUmF3Q2xhc3NQYXRoQ29udGFpbmVyRW50cmllcy5pc0VtcHR5KCkpIHsKICAgICAgICAgCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwogCQl9CiAKQEAgLTM3Miw3ICszNTksOSBAQAogCQkJcGF0aFRvUmVzb2x2ZWRFbnRyeS5wdXQoZW50cmllc1tqXS5nZXRQYXRoKCksIGVudHJpZXNbal0pOwogCQl9CiAKLQkJZmluYWwgTWFwIDxJQ2xhc3NwYXRoRW50cnksIElDbGFzc3BhdGhBdHRyaWJ1dGU+IHJlZmVyZW5jZWRFbnRyaWVzID0gbmV3IExpbmtlZEhhc2hNYXAgPElDbGFzc3BhdGhFbnRyeSwgSUNsYXNzcGF0aEF0dHJpYnV0ZT4oKTsKKwkJLy9HYXRoZXIgYWxsIHJlc29sdmVkIGVudHJpZXMgZnJvbSB0aGUgcGFja2FnZSByb290cyBhbmQgdGhlIGNsYXNzcGF0aCBjb250YWluZXJzCisJCWZpbmFsIE1hcCA8SUNsYXNzcGF0aEVudHJ5LCBJQ2xhc3NwYXRoQXR0cmlidXRlPiByZXNvbHZlZEVudHJpZXMgPSBuZXcgTGlua2VkSGFzaE1hcCA8SUNsYXNzcGF0aEVudHJ5LCBJQ2xhc3NwYXRoQXR0cmlidXRlPigpOworCiAJCQogCQkvLyBncmFiIGFsbCBJUGFja2FnZUZyYWdtZW50Um9vdHMKIAkJCkBAIC0zODEsNiArMzcwLDcgQEAKIAkJLy8gZW50cnkgaGFzIHRoZSBwdWJsaXNoL2V4cG9ydCBhdHRyaWJ1dGUpCiAJCS8vVE9ETyB0aGlzIGNhbGwgdG8gamF2YVByb2plY3QgbmVlZHMgdG8gYmUgcmVtb3ZlZC4gIE5lZWQgdG8gZmlndXJlIG91dCB3aGF0IGV4YWN0bHkgdGhpcyBpcyBhdHRlbXB0aW5nIHRvIGRvLgogCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKKwkJCiAJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IHJvb3RzKSB7CiAJCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnkgcmF3RW50cnkgPSByb290LmdldFJhd0NsYXNzcGF0aEVudHJ5KCk7CiAJCQkKQEAgLTM5Miw3ICszODIsMjggQEAKIAkJCQogCQkJZmluYWwgSVBhdGggcGtnRnJhZ1BhdGggPSByb290LmdldFBhdGgoKTsKIAkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeSByZXNvbHZlZEVudHJ5ID0gcGF0aFRvUmVzb2x2ZWRFbnRyeS5nZXQocGtnRnJhZ1BhdGgpOwotCQkJZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSByZXNvbHZlZEF0dHJpYiA9IGNoZWNrRm9yQ29tcG9uZW50RGVwZW5kZW5jeUF0dHJpYnV0ZShyZXNvbHZlZEVudHJ5LCBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5ERVBFTkRFTkNZX09SX05PTkRFUEVOREVOQ1ksIHdlYkxpYnNPbmx5KTsKKwkJCXJlc29sdmVkRW50cmllcy5wdXQocmVzb2x2ZWRFbnRyeSwgYXR0cmliKTsKKwkJfQorCQkKKwkJLy8gQWRkIGVudHJpZXMgY29taW5nIGZyb20gY2xhc3NwYXRoIGNvbnRhaW5lcnMgdG8gdGhlIGxpc3Qgb2YgcmVzb2x2ZWQgZW50cmllcworCQlmb3IgKE1hcC5FbnRyeSA8SUNsYXNzcGF0aEVudHJ5LCBJQ2xhc3NwYXRoQXR0cmlidXRlPiBlbnRyeSA6IHZhbGlkUmF3Q2xhc3NQYXRoQ29udGFpbmVyRW50cmllcy5lbnRyeVNldCgpKSB7CisJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNsYXNzcGF0aENvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihlbnRyeS5nZXRLZXkoKS5nZXRQYXRoKCksIGphdmFQcm9qZWN0KTsKKwkJCWlmKGNsYXNzcGF0aENvbnRhaW5lciAhPSBudWxsKQorCQkJeworCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aENvbnRhaW5lckVudHJpZXMgPSBjbGFzc3BhdGhDb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOworCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2xhc3NwYXRoQ29udGFpbmVyRW50cmllcy5sZW5ndGg7IGorKykgeworCQkJCQlyZXNvbHZlZEVudHJpZXMucHV0KGNsYXNzcGF0aENvbnRhaW5lckVudHJpZXNbal0sIGVudHJ5LmdldFZhbHVlKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vU2V0dXAgdGhlIGZpbmFsIHJlc3VsdAorCQlmaW5hbCBNYXAgPElDbGFzc3BhdGhFbnRyeSwgSUNsYXNzcGF0aEF0dHJpYnV0ZT4gcmVmZXJlbmNlZEVudHJpZXMgPSBuZXcgTGlua2VkSGFzaE1hcCA8SUNsYXNzcGF0aEVudHJ5LCBJQ2xhc3NwYXRoQXR0cmlidXRlPigpOworCQlmb3IgKE1hcC5FbnRyeSA8SUNsYXNzcGF0aEVudHJ5LCBJQ2xhc3NwYXRoQXR0cmlidXRlPiBtYXBFbnRyeSA6IHJlc29sdmVkRW50cmllcy5lbnRyeVNldCgpKSB7CisJCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnkgcmVzb2x2ZWRFbnRyeSA9IG1hcEVudHJ5LmdldEtleSgpOworCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSBtYXBFbnRyeS5nZXRWYWx1ZSgpOworCQkJCisJCQlmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIHJlc29sdmVkQXR0cmliID0gY2hlY2tGb3JDb21wb25lbnREZXBlbmRlbmN5QXR0cmlidXRlKHJlc29sdmVkRW50cnksIERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkRFUEVOREVOQ1lfT1JfTk9OREVQRU5ERU5DWSwgaXNMZWdhY3lKMkVFKTsKIAkJCS8vIGF0dHJpYnV0ZSBmb3IgdGhlIHJlc29sdmVkIGVudHJ5IG11c3QgZWl0aGVyIGJlIHVuc3BlY2lmaWVkIG9yIGl0IG11c3QgYmUgdGhlCiAJCQkvLyBkZXBlbmRlbmN5IGF0dHJpYnV0ZSBmb3IgaXQgdG8gYmUgaW5jbHVkZWQKIAkJCWlmIChyZXNvbHZlZEF0dHJpYiA9PSBudWxsIHx8IHJlc29sdmVkQXR0cmliLmdldE5hbWUoKS5lcXVhbHMoQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZKSkgewpAQCAtNDUwLDE2ICs0NjEsOCBAQAogCSAqIGEgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgd2l0aCB0eXBlIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkNMQVNTUEFUSEFSQ0hJVkVUWVBFIHRoYXQgcmVwcmVzZW50cyBhIHByb2plY3QgY3AgZW50cnkuCiAJICovCiAJcHVibGljIHN0YXRpYyBJUHJvamVjdCBpc0NsYXNzcGF0aFByb2plY3RSZWZlcmVuY2UoZmluYWwgSVZpcnR1YWxSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmIChyZWYgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgewotCQkJZmluYWwgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgY29tcCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCWlmIChjb21wLmdldEFyY2hpdmVUeXBlKCkuZXF1YWxzKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkNMQVNTUEFUSEFSQ0hJVkVUWVBFKSAmJgotCQkJCQljb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gY29tcC5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KKwkJaWYgKHJlZiAhPSBudWxsICYmIHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudCkKKwkJCXJldHVybiByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKTsKIAkJcmV0dXJuIG51bGw7CiAJfQogCQpAQCAtNDk0LDI5ICs0OTcsOCBAQAogCSAqIGEgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgd2l0aCB0eXBlIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkNMQVNTUEFUSEFSQ0hJVkVUWVBFLgogCSAqLwogCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q2xhc3NwYXRoVmlydHVhbFJlZmVyZW5jZUxvY2F0aW9uKGZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChyZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpIGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKLQkJCWZpbmFsIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGNvbXAgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQlpZiAoY29tcC5nZXRBcmNoaXZlVHlwZSgpLmVxdWFscyhWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5DTEFTU1BBVEhBUkNISVZFVFlQRSkpIHsKLQkJCQlqYXZhLmlvLkZpbGUgY3BFbnRyeUZpbGUgPSBjb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQkJCUlQYXRoIGNwRW50cnlQYXRoID0gbnVsbDsKLQkJCQlpZiAoY3BFbnRyeUZpbGUgIT0gbnVsbCAmJiBjcEVudHJ5RmlsZS5leGlzdHMoKSkgewotCQkJCQljcEVudHJ5UGF0aCA9IG5ldyBQYXRoKGNwRW50cnlGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJRmlsZSBpRmlsZSA9IGNvbXAuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCWNwRW50cnlQYXRoID0gaUZpbGUuZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgCUlDb250YWluZXIgY29udGFpbmVyID0gZ2V0Q2xhc3NGb2xkZXIoY29tcCk7Ci0gICAgICAgICAgICAgICAgICAgIAlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgCQlyZXR1cm4gY29udGFpbmVyLmdldExvY2F0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JCQkJcmV0dXJuIGNwRW50cnlQYXRoOwotCQkJfQorCQlpZiAocmVmICE9IG51bGwgJiYgcmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIElDbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50KSB7CisJCQlyZXR1cm4gKElQYXRoKXJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0QWRhcHRlcihJUGF0aC5jbGFzcyk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtNTk0LDYgKzU3Niw1OCBAQAogCQlyZXR1cm4gaXNDbGFzc0ZvbGRlciA/IFJVTlRJTUVfTUFQUElOR19JTlRPX0NPTVBPTkVOVF9QQVRIIDogUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSX1BBVEg7CiAJfQogCQorCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0RGVmYXVsdFJ1bnRpbWVQYXRoKGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSl7CisJCWJvb2xlYW4gaXNDbGFzc0ZvbGRlckVudHJ5ID0gaXNDbGFzc0ZvbGRlckVudHJ5KGVudHJ5KTsKKwkJaWYodmlydHVhbENvbXBvbmVudCA9PSBudWxsKXsKKwkJCS8vbnVsbCwgdXNlIGRlZmF1bHQKKwkJCXJldHVybiBnZXREZWZhdWx0UnVudGltZVBhdGgoZmFsc2UsIGlzQ2xhc3NGb2xkZXJFbnRyeSk7CisJCX0KKwkJYm9vbGVhbiBpc1dlYkFwcCA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViQ29tcG9uZW50KHZpcnR1YWxDb21wb25lbnQpOworCQlpZihpc1dlYkFwcCB8fCBpc0NsYXNzRm9sZGVyRW50cnkpeworCQkJcmV0dXJuIGdldERlZmF1bHRSdW50aW1lUGF0aChpc1dlYkFwcCwgaXNDbGFzc0ZvbGRlckVudHJ5KTsKKwkJfQorCisJCS8vbm90IGEgV0FSCisJCS8vaWYgcGFydCBvZiBFRTUgb3IgZ3JlYXR1cmUgZWFyLCBtYXAgaW50byB0aGUgRUFSJ3MgbGliIGZvbGRlcgorCQlJUHJvamVjdCBbXSBlYXJQcm9qZWN0cyA9IEVhclV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHZpcnR1YWxDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKKwkJaWYgKGVhclByb2plY3RzLmxlbmd0aCA+IDApIHsKKwkJCUlWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclByb2plY3RzWzBdKTsKKwkJCWlmIChlYXJDb21wb25lbnQgIT0gbnVsbCkgeworCQkJCXJldHVybiBjYWxjdWxhdGVEZWZhdWx0UnVudGltZVBhdGgoZWFyQ29tcG9uZW50LCB2aXJ0dWFsQ29tcG9uZW50KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZ2V0RGVmYXVsdFJ1bnRpbWVQYXRoKGZhbHNlLCBmYWxzZSk7CisJCQorCX0KKwkKKwlwdWJsaWMgc3RhdGljIElQYXRoIGNhbGN1bGF0ZURlZmF1bHRSdW50aW1lUGF0aChJVmlydHVhbENvbXBvbmVudCBwYXJlbnRDb21wb25lbnQsIElWaXJ0dWFsQ29tcG9uZW50IHRhcmdldENvbXBvbmVudCkgeworCQlJVmlydHVhbFJlZmVyZW5jZSB0YXJnZXRSZWYgPSBwYXJlbnRDb21wb25lbnQuZ2V0UmVmZXJlbmNlKHRhcmdldENvbXBvbmVudC5nZXROYW1lKCkpOworCQlTdHJpbmcgbGliRGlyID0gRWFyVXRpbGl0aWVzLmdldEVBUkxpYkRpcihwYXJlbnRDb21wb25lbnQpOworCQlpZiAobGliRGlyICE9IG51bGwgJiYgbGliRGlyLmxlbmd0aCgpID4gMCkgeworCQkJSVBhdGggbGliRGlyUGF0aCA9IG5ldyBQYXRoKGxpYkRpcik7CisKKwkJCS8vIElmIHByb2plY3QgaXMgYXQgcm9vdCBsZXZlbCwgZ28gdXAgYSBsZXZlbCBhbmQgYWRkIGxpYiBkaXIgcGF0aCBhYnNvbHV0ZSBwYXRoCisJCQlpZih0YXJnZXRSZWYgPT0gbnVsbCB8fCB0YXJnZXRSZWYuZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMoIi8iKSkgLy8kTk9OLU5MUy0xJAorCQkJCXJldHVybiBuZXcgUGF0aChSVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVIpLmFwcGVuZChsaWJEaXJQYXRoLm1ha2VBYnNvbHV0ZSgpKTsKKwkJCUlQYXRoIGNoaWxkUHJvamVjdFJ1bnRpbWVQYXRoID0gdGFyZ2V0UmVmLmdldFJ1bnRpbWVQYXRoKCk7CisKKwkJCVN0cmluZ1tdIGNoaWxkUHJvamVjdEZvbGRlcnMgPSBjaGlsZFByb2plY3RSdW50aW1lUGF0aC5zZWdtZW50cygpOworCQkJU3RyaW5nW10gbGliRm9sZGVycyA9IGxpYkRpclBhdGguc2VnbWVudHMoKTsKKwkJCWludCBjb21tb25Gb2xkZXJDb3VudCA9IDA7CisJCQlmb3IoaW50IGkgPSAwOyBpIDwgY2hpbGRQcm9qZWN0Rm9sZGVycy5sZW5ndGg7IGkrKykgeworCQkJCWlmKGkgPj0gbGliRm9sZGVycy5sZW5ndGggfHwgIWNoaWxkUHJvamVjdEZvbGRlcnNbaV0uZXF1YWxzKGxpYkZvbGRlcnNbaV0pKQorCQkJCQlicmVhazsKKwkJCQljb21tb25Gb2xkZXJDb3VudCsrOworCQkJfQorCQkJU3RyaW5nIHJlc3VsdFN0cmluZyA9IFJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUjsKKwkJCWZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZFByb2plY3RGb2xkZXJzLmxlbmd0aCAtIGNvbW1vbkZvbGRlckNvdW50OyBpKyspIHsKKwkJCQlyZXN1bHRTdHJpbmcgKz0gUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSOworCQkJfQorCQkJcmV0dXJuIG5ldyBQYXRoKHJlc3VsdFN0cmluZykuYXBwZW5kKGxpYkRpclBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhjb21tb25Gb2xkZXJDb3VudCkpOworCQl9CisJCXJldHVybiBnZXREZWZhdWx0UnVudGltZVBhdGgoZmFsc2UsIGZhbHNlKTsKKwl9CisJCiAJLyoqCiAJICogUmV0cmlldmVzIHRoZSBhcmNoaXZlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRoIGVudHJ5CiAJICogQHBhcmFtIGVudHJ5IFRoZSBlbnRyeS4KQEAgLTYzOSwxMCArNjczLDExIEBACiAJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoQXR0cmlidXRlIGNoZWNrRm9yQ29tcG9uZW50RGVwZW5kZW5jeUF0dHJpYnV0ZShmaW5hbCBJQ2xhc3NwYXRoRW50cnkgZW50cnksIGZpbmFsIERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlIGF0dHJpYnV0ZVR5cGUpIHsKIAkJcmV0dXJuIGNoZWNrRm9yQ29tcG9uZW50RGVwZW5kZW5jeUF0dHJpYnV0ZShlbnRyeSwgYXR0cmlidXRlVHlwZSwgZmFsc2UpOwogCX0KLQlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhBdHRyaWJ1dGUgY2hlY2tGb3JDb21wb25lbnREZXBlbmRlbmN5QXR0cmlidXRlKGZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgZmluYWwgRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGUgYXR0cmlidXRlVHlwZSwgZmluYWwgYm9vbGVhbiB3ZWJMaWJzT25seSkgewotCQlpZiAoZW50cnkgPT0gbnVsbCB8fCAoIXdlYkxpYnNPbmx5ICYmICFDbGFzc3BhdGhEZXBlbmRlbmN5RW5hYmxlbWVudC5pc0FsbG93Q2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jeSgpKSkgeworCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEF0dHJpYnV0ZSBjaGVja0ZvckNvbXBvbmVudERlcGVuZGVuY3lBdHRyaWJ1dGUoZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5LCBmaW5hbCBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZSBhdHRyaWJ1dGVUeXBlLCBmaW5hbCBib29sZWFuIGlzTGVnYWN5SjJFRSkgeworCQlpZiAoZW50cnkgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwotCQl9CisJCQorCQkKIAkgICAgZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMgPSBlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKTsKIAkgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7CiAJICAgIAlmaW5hbCBJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaV07CkBAIC02NjgsMTQgKzcwMyw3IEBACiAJICogQHJldHVybiBUcnVlIGlmIGEgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmN5LCBmYWxzZSBvdGhlcndpc2UuCiAJICovCiAJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jeShmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJaWYgKGNvbXBvbmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7Ci0JCQlmaW5hbCBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBhcmNoaXZlQ29tcCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgY29tcG9uZW50OwotCQkJcmV0dXJuIGFyY2hpdmVDb21wLmdldEFyY2hpdmVUeXBlKCkuZXF1YWxzKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkNMQVNTUEFUSEFSQ0hJVkVUWVBFKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiBjb21wb25lbnQgIT0gbnVsbCAmJiBjb21wb25lbnQgaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudDsKIAl9CiAJCiAJLyoqCkBAIC02ODgsNCArNzE2LDc1IEBACiAJCXJldHVybiBhcmNoaXZlVVJJLmxhc3RTZWdtZW50KCk7CiAJfQogCQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01hcHBlZEludG9Db250YWluZXIoU3RyaW5nIHBhdGgpIHsKKwkJaWYgKHBhdGguc3RhcnRzV2l0aChJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVIpKQorCQkJcmV0dXJuIHRydWU7CisJCQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEVudHJ5IG1vZGlmeURlcGVuZGVuY3lQYXRoKElDbGFzc3BhdGhFbnRyeSBlbnRyeSwgSVBhdGggZGVwZW5kZW5jeVBhdGgpeworCQlJQ2xhc3NwYXRoRW50cnkgbmV3RW50cnkgPSBudWxsOworCQlJQ2xhc3NwYXRoQXR0cmlidXRlIFtdIG5ld0F0dHJpYnV0ZXMgPSBtb2RpZnlEZXBlbmRlbmN5UGF0aChlbnRyeS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSwgZGVwZW5kZW5jeVBhdGgpOworCQkKKwkJc3dpdGNoKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7CisJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVI6CisJCQluZXdFbnRyeSA9IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KGVudHJ5LmdldFBhdGgoKSwgZW50cnkuZ2V0QWNjZXNzUnVsZXMoKSwgbmV3QXR0cmlidXRlcywgZW50cnkuaXNFeHBvcnRlZCgpKTsKKwkJCWJyZWFrOworCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWToKKwkJCW5ld0VudHJ5ID0gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGVudHJ5LmdldFBhdGgoKSwgZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSwgZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCksIGVudHJ5LmdldEFjY2Vzc1J1bGVzKCksIG5ld0F0dHJpYnV0ZXMsIGVudHJ5LmlzRXhwb3J0ZWQoKSk7CisJCQlicmVhazsKKwkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1ZBUklBQkxFOgorCQkJbmV3RW50cnkgPSBKYXZhQ29yZS5uZXdWYXJpYWJsZUVudHJ5KGVudHJ5LmdldFBhdGgoKSwgZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFBhdGgoKSwgZW50cnkuZ2V0U291cmNlQXR0YWNobWVudFJvb3RQYXRoKCksIGVudHJ5LmdldEFjY2Vzc1J1bGVzKCksIG5ld0F0dHJpYnV0ZXMsIGVudHJ5LmlzRXhwb3J0ZWQoKSk7CisJCQlicmVhazsJCQkJCQorCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVDoKKwkJCW5ld0VudHJ5ID0gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KGVudHJ5LmdldFBhdGgoKSwgZW50cnkuZ2V0QWNjZXNzUnVsZXMoKSwgZW50cnkuY29tYmluZUFjY2Vzc1J1bGVzKCksIG5ld0F0dHJpYnV0ZXMsIGVudHJ5LmlzRXhwb3J0ZWQoKSk7CisJCQlicmVhazsJCQkJCQkJCQkJCisJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0U6CisJCQluZXdFbnRyeSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KGVudHJ5LmdldFBhdGgoKSwgZW50cnkuZ2V0SW5jbHVzaW9uUGF0dGVybnMoKSwgZW50cnkuZ2V0RXhjbHVzaW9uUGF0dGVybnMoKSwgZW50cnkuZ2V0T3V0cHV0TG9jYXRpb24oKSwgbmV3QXR0cmlidXRlcyk7CisJCQlicmVhazsJCQkJCQkJCQkJCQkJCQkKKwkJfQorCQlyZXR1cm4gbmV3RW50cnk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0UnVudGltZVBhdGgoZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KXsKKwkJSUNsYXNzcGF0aEF0dHJpYnV0ZSBbXSBhdHRyaWJ1dGVzID0gZW50cnkuZ2V0RXh0cmFBdHRyaWJ1dGVzKCk7CisJCWZvcihJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHJpYnV0ZSA6IGF0dHJpYnV0ZXMpeworCQkJaWYoYXR0cmlidXRlLmdldE5hbWUoKS5lcXVhbHMoQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZKSl7CisJCQkJcmV0dXJuIG5ldyBQYXRoKGF0dHJpYnV0ZS5nZXRWYWx1ZSgpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIG1vZGlmeURlcGVuZGVuY3lQYXRoKGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGVbXSBjdXJyZW50QXR0cmlidXRlcywgSVBhdGggcnVudGltZVBhdGgpIHsKKwkJZmluYWwgTGlzdCA8SUNsYXNzcGF0aEF0dHJpYnV0ZT4gdXBkYXRlZEF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PElDbGFzc3BhdGhBdHRyaWJ1dGU+ICgpOworCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7CisJCWZvcihJQ2xhc3NwYXRoQXR0cmlidXRlIGN1cnJlbnRBdHRyaWJ1dGUgOiBjdXJyZW50QXR0cmlidXRlcyl7CisJCQlpZihjdXJyZW50QXR0cmlidXRlLmdldE5hbWUoKS5lcXVhbHMoQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZKSl7CisJCQkJbW9kaWZpZWQgPSB0cnVlOworCQkJCWlmKHJ1bnRpbWVQYXRoID09IG51bGwpeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJdHJ5IHsKKwkJCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZSBuZXdBdHRyaWJ1dGUgPSBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVVdGlsLmNyZWF0ZURlcGVuZGVuY3lBdHRyaWJ1dGUocnVudGltZVBhdGgpOworCQkJCQl1cGRhdGVkQXR0cmlidXRlcy5hZGQobmV3QXR0cmlidXRlKTsKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQl1cGRhdGVkQXR0cmlidXRlcy5hZGQoY3VycmVudEF0dHJpYnV0ZSk7CisJCQl9CisJCX0KKwkJaWYoIW1vZGlmaWVkKXsKKwkJCXRyeSB7CisJCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZSBuZXdBdHRyaWJ1dGUgPSBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVVdGlsLmNyZWF0ZURlcGVuZGVuY3lBdHRyaWJ1dGUocnVudGltZVBhdGgpOworCQkJCXVwZGF0ZWRBdHRyaWJ1dGVzLmFkZChuZXdBdHRyaWJ1dGUpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHVwZGF0ZWRBdHRyaWJ1dGVzLnRvQXJyYXkobmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbdXBkYXRlZEF0dHJpYnV0ZXMuc2l6ZSgpXSk7CisJfQorCQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xhc3NwYXRoZGVwL0lDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGFzc3BhdGhkZXAvSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuamF2YQppbmRleCBkZjBhOTM2Li5mYzI1NzU1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGFzc3BhdGhkZXAvSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGFzc3BhdGhkZXAvSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuamF2YQpAQCAtMjIsNyArMjIsNyBAQAogCS8qKgogCSAqIEVudW1lcmF0aW9uIHRoYXQgaXMgdXNlZCB0byBzZWxlY3QgY29tcG9uZW50IGRlcGVuZGVuY3kgYXR0cmlidXRlIHR5cGUuIAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZW51bSBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZSB7Q0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZLCBDTEFTU1BBVEhfQ09NUE9ORU5UX05PTkRFUEVOREVOQ1ksIERFUEVOREVOQ1lfT1JfTk9OREVQRU5ERU5DWX07IAorCXB1YmxpYyBzdGF0aWMgZW51bSBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZSB7Q0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZLCBDTEFTU1BBVEhfQ09NUE9ORU5UX05PTkRFUEVOREVOQ1ksIERFUEVOREVOQ1lfT1JfTk9OREVQRU5ERU5DWX0gCiAJCiAJLyoqCiAJICogTmFtZSBvZiB0aGUgY3VzdG9tIEphdmEgY2xhc3NwYXRoIGVudHJ5IGF0dHJpYnV0ZSB0aGF0IGlzIHVzZWQgdG8gZmxhZwpAQCAtMzksMjEgKzM5LDIxIEBACiAJICogZW50cmllcyB0aGF0IGFyZSBsaWJyYXJ5IGVudHJpZXMgYXJlIHN1cHBvcnRlZC4gQWxsIHJlc29sdmVkIGVudHJpZXMgYXJlIG1hcHBlZCB1bmxlc3MgdGhleSBoYXZlIHRoZSAKIAkgKiAib3JnLmVjbGlwc2UuanN0LmNvbXBvbmVudC5ub25kZXBlbmRlbmN5IiBhdHRyaWJ1dGUgKG9yIGFyZSBwcm9qZWN0IHdoaWNoIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBhbmQgYXJlIHRoZXJlZm9yZSBhbHdheXMgc2tpcHBlZCkuIAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSA9ICJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50LmRlcGVuZGVuY3kiOyAvLyROT04tTkxTLTEKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1kgPSAib3JnLmVjbGlwc2UuanN0LmNvbXBvbmVudC5kZXBlbmRlbmN5IjsgLy8kTk9OLU5MUy0xJAogCiAJLyoqCiAJICogTmFtZSBvZiB0aGUgY3VzdG9tIEphdmEgY2xhc3NwYXRoIGVudHJ5IGF0dHJpYnV0ZSB0aGF0IGlzIHVzZWQgdG8gZmxhZwogCSAqIHRoZSByZXNvbHZlZCBlbnRyaWVzIG9mIGNsYXNzcGF0aCBjb250YWluZXJzIHRoYXQgc2hvdWxkIG5vdCBiZSBleHBvc2VkCiAJICogdmlhIHRoZSB2aXJ0dWFsIGNvbXBvbmVudCBBUEkuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05fREVQRU5ERU5DWSA9ICJvcmcuZWNsaXBzZS5qc3QuY29tcG9uZW50Lm5vbmRlcGVuZGVuY3kiOyAvLyROT04tTkxTLTEKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU1BBVEhfQ09NUE9ORU5UX05PTl9ERVBFTkRFTkNZID0gIm9yZy5lY2xpcHNlLmpzdC5jb21wb25lbnQubm9uZGVwZW5kZW5jeSI7IC8vJE5PTi1OTFMtMSQKIAkKIAkvKioKIAkgKiBSdW50aW1lIHBhdGggdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZXNvbHZlZCBjb250cmlidXRpb25zIGZyb20gYSBjbGFzc3BhdGggZW50cnkgc2hvdWxkIGJlCiAJICogbWFwcGVkIGludG8gdGhlIGV4cG9ydGVkL2RlcGxveWVkIHN0cnVjdHVyZSBvZiB0aGUgcGFyZW50IG1vZHVsZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiB0aGF0IHRoZSB0YXJnZXQgbW9kdWxlCiAJICogaXMgbWFwcGVkICh3aWxsIGJlIGVpdGhlciB0aGUgRUFSIHJvb3Qgb3IgL1dFQi1JTkYvbGliKS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVIgPSAiLi4vIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVIgPSAiLi4vIjsgLy8kTk9OLU5MUy0xJAogCQogCS8qKgogCSAqIElQYXRoIHZhbHVlIG9mIFJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUi4KQEAgLTY0LDcgKzY0LDcgQEAKIAkgKiBSdW50aW1lIHBhdGggdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSByZXNvbHZlZCBjb250cmlidXRpb25zIGZyb20gYSBjbGFzc3BhdGggZW50cnkgc2hvdWxkIGJlCiAJICogbWFwcGVkIGludG8gdGhlIHJvb3Qgb2YgdGhlIGV4cG9ydGVkL2RlcGxveWVkIG1vZHVsZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX01BUFBJTkdfSU5UT19DT01QT05FTlQgPSIvIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5USU1FX01BUFBJTkdfSU5UT19DT01QT05FTlQgPSIvIjsgLy8kTk9OLU5MUy0xJAogCQogCS8qKgogCSAqIElQYXRoIHZhbHVlIG9mIFJVTlRJTUVfTUFQUElOR19JTlRPX0NPTVBPTkVOVC4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsYXNzcGF0aGRlcC9JQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xhc3NwYXRoZGVwL0lDbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4NTA2YQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsYXNzcGF0aGRlcC9JQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CisKKy8qKgorICogCisgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IGV4dGVuZGVycyBvZiB0aGUgQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbiBleHRlbnNpb24KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSUNsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb24gCit7CisgIC8qKgorICAgKiBBbiBleHRlbmRlciBjYW4gaW5kaWNhdGUgaWYgaXQgaGFuZGxlcyB0aGUgZXhwb3J0aW5nIGZvciBhIHBhcnRpY3VsYXIgZW50cnkgaW4gYSBwcm9qZWN0LgorICAgKiAKKyAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgY2xhc3NwYXRoIGVudHJ5CisgICAqIEBwYXJhbSBlbnRyeSB0aGUgY2xhc3NwYXRoIGVudHJ5CisgICAqIEByZXR1cm4gcmV0dXJucyB0cnVlIGlmIHRoaXMgcHJvamVjdCB3aWxsIGhhbmRsZSB0aGUgZXhwb3J0aW5nIG9mIHRoZSBjbGFzc3BhdGggZW50cnkuCisgICAqLworICBwdWJsaWMgYm9vbGVhbiBwcm9qZWN0SGFuZGxlc0V4cG9ydCggSVByb2plY3QgcHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5ICk7CisgIAorICAvKioKKyAgICogCisgICAqIEBwYXJhbSBwcm9qZWN0CisgICAqIEBwYXJhbSBlbnRyeQorICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgdGhlIGNsYXNzcGF0aCBhdHRyaWJ1dGUgIm9yZy5lY2xpcHNlLmpzdC5jb21wb25lbnQuZGVwZW5kZW5jeSIgc2hvdWxkCisgICAqIGNvbnRhaW4uCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aGRlcGVuZGVuY3lBdHRyaWJ1dGUoIElQcm9qZWN0IHByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSApOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xhc3NwYXRoZGVwL1VwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsYXNzcGF0aGRlcC9VcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVVdGlsLmphdmEKaW5kZXggMmNmYzg5NC4uZDFhZjE1MSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xhc3NwYXRoZGVwL1VwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZVV0aWwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGFzc3BhdGhkZXAvVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlVXRpbC5qYXZhCkBAIC00MSw3ICs0MSw3IEBACiAJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIFRocm93biBpZiBhIHByb2JsZW0gaXMgZW5jb3VudGVyZWQuCiAJICovCiAJcHVibGljIHN0YXRpYyBJQ2xhc3NwYXRoQXR0cmlidXRlIGNyZWF0ZURlcGVuZGVuY3lBdHRyaWJ1dGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVEZXBlbmRlbmN5QXR0cmlidXRlKCIiKTsKKwkJcmV0dXJuIGNyZWF0ZURlcGVuZGVuY3lBdHRyaWJ1dGUoIiIpOyAvLyROT04tTkxTLTEkCiAJfQogCQogCS8qKgpAQCAtNzksNyArNzksNyBAQAogCQlyZXR1cm4gY3JlYXRlRGVwZW5kZW5jeUF0dHJpYnV0ZShydW50aW1lUGF0aC50b1N0cmluZygpKTsKIAl9CiAJCi0JcHJpdmF0ZSBzdGF0aWMgSUNsYXNzcGF0aEF0dHJpYnV0ZSBjcmVhdGVEZXBlbmRlbmN5QXR0cmlidXRlKGZpbmFsIFN0cmluZyBydW50aW1lUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCXB1YmxpYyBzdGF0aWMgSUNsYXNzcGF0aEF0dHJpYnV0ZSBjcmVhdGVEZXBlbmRlbmN5QXR0cmlidXRlKGZpbmFsIFN0cmluZyBydW50aW1lUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlyZXR1cm4gSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSwgcnVudGltZVBhdGgpOwogCX0KIAkKQEAgLTkwLDcgKzkwLDcgQEAKIAkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gVGhyb3duIGlmIGEgcHJvYmxlbSBpcyBlbmNvdW50ZXJlZC4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIElDbGFzc3BhdGhBdHRyaWJ1dGUgY3JlYXRlTm9uRGVwZW5kZW5jeUF0dHJpYnV0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZShJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5DTEFTU1BBVEhfQ09NUE9ORU5UX05PTl9ERVBFTkRFTkNZLCAiIik7CisJCXJldHVybiBKYXZhQ29yZS5uZXdDbGFzc3BhdGhBdHRyaWJ1dGUoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05fREVQRU5ERU5DWSwgIiIpOyAvLyROT04tTkxTLTEkCiAJfQogCQogCS8qKgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lFbmFibGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQuamF2YQppbmRleCBmODI3ZWQ5Li45ODFhMDJhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQuamF2YQpAQCAtMTMsMTkgKzEzLDMxIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQcmVmZXJlbmNlczsKIAorLyoqCisgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlLiBUaGUgQUxMT1dfQ0xBU1NQQVRIX0RFUCBwcmVmZXJlbmNlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIGl0cyBhYmlsaXR5IHRvIGRpc2FibGUgZHluYW1pYyBtYW5pZmVzdCB1cGRhdGVzIHdpbGwgc29vbiBiZSByZW1vdmVkLgorICovCiBwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQgewogCiAJLyoqCiAJICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgZW5hYmxlbWVudCBvZiB0aGUgQ2xhc3NwYXRoIERlcGVuZGVuY3kKIAkgKiBmdW5jdGlvbmFsaXR5LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZSB3aGljaCBlbmFibGVzIHRoaXMgZnVuY3Rpb25hbGl0eS4KIAkgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gZmFsc2Ugd2lsbCBkaXNhYmxlIHRoZSBmdW5jdGlvbmFsaXR5LgorCSAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UuIFRoZSBBTExPV19DTEFTU1BBVEhfREVQIHByZWZlcmVuY2UgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgaXRzIGFiaWxpdHkgdG8gZGlzYWJsZSBkeW5hbWljIG1hbmlmZXN0IHVwZGF0ZXMgd2lsbCBzb29uIGJlIHJlbW92ZWQuCiAJICovCiAJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhbGxvd0NsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3kgPSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oSjJFRVByZWZlcmVuY2VzLktleXMuQUxMT1dfQ0xBU1NQQVRIX0RFUCk7CiAJCisJLyoqCisJICogQHBhcmFtIGFsbG93CisJICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZS4gVGhlIEFMTE9XX0NMQVNTUEFUSF9ERVAgcHJlZmVyZW5jZSBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCBpdHMgYWJpbGl0eSB0byBkaXNhYmxlIGR5bmFtaWMgbWFuaWZlc3QgdXBkYXRlcyB3aWxsIHNvb24gYmUgcmVtb3ZlZC4KKwkgKi8KIAlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWxsb3dDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5KGJvb2xlYW4gYWxsb3cpewogCQlhbGxvd0NsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3kgPSBhbGxvdzsKIAl9CiAJCisJLyoqCisJICogQHJldHVybgorCSAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UuIFRoZSBBTExPV19DTEFTU1BBVEhfREVQIHByZWZlcmVuY2UgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgaXRzIGFiaWxpdHkgdG8gZGlzYWJsZSBkeW5hbWljIG1hbmlmZXN0IHVwZGF0ZXMgd2lsbCBzb29uIGJlIHJlbW92ZWQuCisJICovCiAJcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWxsb3dDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5KCl7CiAJCXJldHVybiBhbGxvd0NsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3k7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb25NYW5hZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmUyZjIwCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb25NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbkNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb25UYWdOYW1lczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLklFdmFsdWF0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb247CisKK3B1YmxpYyBjbGFzcyBDbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9uTWFuYWdlciAKK3sKKyAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbk1hbmFnZXIgaW5zdGFuY2U7CisgIHByaXZhdGUgTGlzdDxFbGVtZW50RW50cnk+IGVudHJpZXM7CisgIAorICBwcml2YXRlIENsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb25NYW5hZ2VyKCkKKyAgewkgCisgICAgZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudEVudHJ5PigpOworICB9CisgIAorICBwdWJsaWMgc3RhdGljIENsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb25NYW5hZ2VyIGluc3RhbmNlKCkKKyAgeworICAgIGlmKCBpbnN0YW5jZSA9PSBudWxsICkKKyAgICB7CisgICAgICBpbnN0YW5jZSA9IG5ldyBDbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9uTWFuYWdlcigpOworICAgICAgaW5zdGFuY2UubG9hZCgpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gaW5zdGFuY2U7CisgIH0KKyAgIAorICAvKioKKyAgICogCisgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0CisgICAqIEBwYXJhbSBlbnRyeSB0aGUgZW50cnkKKyAgICogQHJldHVybiByZXR1cm5zIHRydWUgaWYgb25lIGV4dGVuZGVyIGluZGljYXRlcyB0aGF0IGl0IGNhbiBoYW5kbGUgdGhpcyBlbnRyeQorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gZG9lc1Byb2plY3RIYW5kbGVFeHBvcnQoIElQcm9qZWN0IHByb2plY3QsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSApCisgIHsKKwlib29sZWFuIHJlc3VsdCA9IGZhbHNlOworCQorCS8vIElmIG9uZSBleHRlbmRlciByZXR1cm5zIHRydWUgd2Ugd2lsbCByZXR1cm4gdHJ1ZSBmb3IgdGhpcyBjYWxsLgorCWZvciggRWxlbWVudEVudHJ5IGxpc3RFbnRyeSA6IGVudHJpZXMgKQorCXsKKwkgIGlmKCBsaXN0RW50cnkuaXNFbmFibGVkKCBwcm9qZWN0ICkgKQkKKwkgIHsKKwkgICAgSUNsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb24gZXh0ZW5zaW9uID0gbGlzdEVudHJ5LmdldEV4dGVuc2lvbkNsYXNzKCk7CisJICAgIAorCSAgICBpZiggZXh0ZW5zaW9uICE9IG51bGwgKQorCSAgICB7CisJICAgICAgaWYoIGV4dGVuc2lvbi5wcm9qZWN0SGFuZGxlc0V4cG9ydCggcHJvamVjdCwgZW50cnkgKSApCisJICAgICAgeworCSAgICAJLy8gV2UgZm91bmQgYW4gZXh0ZW5zaW9uIHRoYXQgc2F5cyB0aGF0IGl0IHdpbGwgaGFuZGxlIHRoZSBleHBvcnQgZm9yIHRoaXMgZW50cnkuCisJICAgICAgICByZXN1bHQgPSB0cnVlOworCSAgICAgICAgYnJlYWs7CisJICAgICAgfQorCSAgICB9CisJICB9CisJfQorCQorCXJldHVybiByZXN1bHQ7CisgIH0KKyAgCisgIC8qKgorICAgKiAKKyAgICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3QKKyAgICogQHBhcmFtIGVudHJ5IHRoZSBlbnRyeQorICAgKiBAcmV0dXJuIHJldHVybnMgdGhlIGRlcGVuZGVuY3kgdmFsdWUgZnJvbSBhbiBleHRlbmRlci4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGVwZW5kZW5jeVZhbHVlKCBJUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgZW50cnkgKQorICB7CisJU3RyaW5nIHJlc3VsdCA9IG51bGw7CisJCisJLy8gSWYgb25lIGV4dGVuZGVyIHJldHVybnMgdHJ1ZSB3ZSB3aWxsIHJldHVybiB0cnVlIGZvciB0aGlzIGNhbGwuCisJZm9yKCBFbGVtZW50RW50cnkgbGlzdEVudHJ5IDogZW50cmllcyApCisJeworCSAgaWYoIGxpc3RFbnRyeS5pc0VuYWJsZWQoIHByb2plY3QgKSApCQorCSAgeworCSAgICBJQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbiBleHRlbnNpb24gPSBsaXN0RW50cnkuZ2V0RXh0ZW5zaW9uQ2xhc3MoKTsKKwkgICAgCisJICAgIGlmKCBleHRlbnNpb24gIT0gbnVsbCApCisJICAgIHsKKwkgICAgICByZXN1bHQgPSBleHRlbnNpb24uZ2V0Q2xhc3NwYXRoZGVwZW5kZW5jeUF0dHJpYnV0ZSggcHJvamVjdCwgZW50cnkgKTsKKwkgICAgICAKKwkgICAgICBpZiggcmVzdWx0ICE9IG51bGwgKQorCSAgICAgIHsKKwkgICAgCS8vIFdlIGZvdW5kIGFuIGV4dGVuc2lvbiB0aGF0IGhhcyBhIHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZS4KKwkgICAgICAgIGJyZWFrOworCSAgICAgIH0KKwkgICAgfQorCSAgfQorCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvYWQoKQorICB7CisJSUV4dGVuc2lvblJlZ2lzdHJ5ICAgICAgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOworCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCAib3JnLmVjbGlwc2UuanN0LmoyZWUuQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbiIgKTsgLy8kTk9OLU5MUy0xJAorCQkKKwlmb3IoIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogZWxlbWVudHMgKSAKKwl7CisJICBpZiggZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKCAiY2xhc3NwYXRoZGVwZW5kZW5jeSIgKSkgICAvLyROT04tTkxTLTEkCisJICB7CisJICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkRWxlbWVudHMgPSBlbGVtZW50LmdldENoaWxkcmVuKCk7CisJICAgIEVsZW1lbnRFbnRyeSAgICAgICAgICAgIGVsZW1lbnRFbnRyeSAgPSBuZXcgRWxlbWVudEVudHJ5KCk7CisJICAgIAorICAgICAJZWxlbWVudEVudHJ5LmVsZW1lbnQgPSBlbGVtZW50OworICAgICAJCisJICAgIGZvciggSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkRWxlbWVudCA6IGNoaWxkRWxlbWVudHMgKQorCSAgICB7CisJICAgICAgU3RyaW5nIGVsZW1lbnROYW1lID0gY2hpbGRFbGVtZW50LmdldE5hbWUoKTsKKwkgICAgICAKKwkgICAgICBpZiggZWxlbWVudE5hbWUuZXF1YWxzKCBFeHByZXNzaW9uVGFnTmFtZXMuRU5BQkxFTUVOVCApICkgCisJICAgICAgeworCSAgICAgICAgdHJ5CisJICAgICAgICB7CisJICAgICAgICAgIGVsZW1lbnRFbnRyeS5lbmFibGVtZW50RXhwcmVzc2lvbiA9IEV4cHJlc3Npb25Db252ZXJ0ZXIuZ2V0RGVmYXVsdCgpLnBlcmZvcm0oIGNoaWxkRWxlbWVudCApOwkKKwkgICAgICAgIH0KKwkgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCisJICAgICAgICB7CisJICAgICAgICAgIC8vIERvIG5vdGhpbmcuICBFbGVtZW50IGVudHJ5IHdpbGwgZ2V0IGEgbnVsbCBlbnRlcmVkIGZvciB0aGUgZW5ibGVtZW50IGV4cHJlc3Npb24uIAkKKwkgICAgICAgIH0KKwkgICAgICB9CisJICAgIH0KKwkgICAgCisJICAgIGVudHJpZXMuYWRkKCBlbGVtZW50RW50cnkgKTsJCisJICB9CisJfSAKKyAgfQorICAKKyAgcHJpdmF0ZSBjbGFzcyBFbGVtZW50RW50cnkKKyAgeworCXB1YmxpYyBFeHByZXNzaW9uICAgICAgICAgICAgZW5hYmxlbWVudEV4cHJlc3Npb247CisJcHVibGljIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OworCQorCXByaXZhdGUgSUNsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb24gZXh0ZW5zaW9uOworICAgIAorICAgIHB1YmxpYyBJQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbiBnZXRFeHRlbnNpb25DbGFzcygpCisgICAgeworICAgICAgaWYoIGVsZW1lbnQgPT0gbnVsbCApIHJldHVybiBudWxsOworICAgICAgCisgICAgICBpZiggZXh0ZW5zaW9uID09IG51bGwgKQorICAgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgIGV4dGVuc2lvbiA9IChJQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbillbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oICJjbGFzcyIgKTsgICAvLyROT04tTkxTLTEkCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICB9CisgICAgICAKKyAgICAgIHJldHVybiBleHRlbnNpb247CisgICAgfSAgCisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCBJUHJvamVjdCBwcm9qZWN0ICkgCisgICAgeworICAJICBpZiggZW5hYmxlbWVudEV4cHJlc3Npb24gPT0gbnVsbCApIHJldHVybiB0cnVlOworICAJCisgIAkgIGJvb2xlYW4gICAgICAgICAgICByZXN1bHQgID0gZmFsc2U7CisgIAkgIElFdmFsdWF0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KCBudWxsLCBwcm9qZWN0ICk7CisgIAkKKyAgCSAgY29udGV4dC5zZXRBbGxvd1BsdWdpbkFjdGl2YXRpb24oIHRydWUgKTsKKyAgCSAgICAKKyAgCSAgdHJ5CisgIAkgIHsKKyAgCSAgICBFdmFsdWF0aW9uUmVzdWx0IGV4cFJlc3VsdCA9IGVuYWJsZW1lbnRFeHByZXNzaW9uLmV2YWx1YXRlKCBjb250ZXh0ICk7CisgIAkgICAgICAgIAorICAJICAgIC8vIElmIGFueSBleHByZXNzaW9uIHJldHVybnMgVFJVRSBvciBOT1RfTE9BREVEIHdlIHdpbGwgcmV0dXJuIHRydWUgYXMKKyAgCSAgICAvLyB0aGUgcmVzdWx0LgorICAJICAgIGlmKCBleHBSZXN1bHQgIT0gRXZhbHVhdGlvblJlc3VsdC5GQUxTRSApCisgIAkgICAgeworICAJICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgCSAgICB9CisgIAkgIH0KKyAgCSAgY2F0Y2goIENvcmVFeGNlcHRpb24gZXhjICkKKyAgCSAgeworICAJICAgIHJlc3VsdCA9IGZhbHNlOwkgIAorICAJICB9CisgICAgICAgCisgIAkgIHJldHVybiByZXN1bHQ7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9ucy5qYXZhCmluZGV4IGEzMDE5NTQuLmRjMmZjYTQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9ucy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9ucy5qYXZhCkBAIC02OSw3ICs2OSw3IEBACiAgICAgICAgIAlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvbnNbaV0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7CiAgICAgICAgIAlmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgIAkJaWYgKGVsZW1lbnRzW2pdLmdldE5hbWUoKS5lcXVhbHMoRklMVEVSRURfQ0xBU1NQQVRIX0NPTlRBSU5FUikpIHsKLSAgICAgICAgCQkJU3RyaW5nIGNwQ29udGFpbmVySUQgPSBlbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoQ0xBU1NQQVRIX0NPTlRBSU5FUl9JRCk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgCQkJU3RyaW5nIGNwQ29udGFpbmVySUQgPSBlbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoQ0xBU1NQQVRIX0NPTlRBSU5FUl9JRCk7IAogICAgICAgICAgICAgICAgICAgICBpZiAoY3BDb250YWluZXJJRCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIAlmaWx0ZXJlZENsYXNzcGF0aENvbnRhaW5lcklEcy5hZGQoY3BDb250YWluZXJJRCk7CiAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5TWFuaWZlc3RVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeU1hbmlmZXN0VXRpbC5qYXZhCmluZGV4IDA5MGIzOTkuLmIzODQ3MTMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5TWFuaWZlc3RVdGlsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lNYW5pZmVzdFV0aWwuamF2YQpAQCAtMTAsMTQxICsxMCwxMyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcDsKIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0SW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5NYW5pZmVzdFV0aWxpdGllczsKIAogLyoqCiAgKiBDb250YWlucyB1dGlsaXR5IGNvZGUgZm9yIHdvcmtpbmcgbWFuaXB1bGF0aW5nIHRoZSBtb2R1bGUgTUFOSUZFU1QuTUYKICAqIGNsYXNzcGF0aCB0byByZWZsZWN0IGNsYXNzcGF0aCBjb21wb25lbnQgZGVwZW5kZW5jaWVzLgorICogQGRlcHJlY2F0ZWQgdXNlIHN1cGVyY2xhc3MgaW5zdGVhZAogICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoRGVwZW5kZW5jeU1hbmlmZXN0VXRpbCB7CitwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoRGVwZW5kZW5jeU1hbmlmZXN0VXRpbCBleHRlbmRzIE1hbmlmZXN0VXRpbGl0aWVzIHsKIAotCXByaXZhdGUgc3RhdGljIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtYW5pZmVzdENsYXNzcGF0aHMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCi0JLyoqCi0JICogR2VuZXJhdGVzIG5ldyBNQU5JRkVTVC5NRiB3aXRoIGEgZHluYW1pY2FsbHkgdXBkYXRlZCBjbGFzc3BhdGggdGhhdCBpcyB3cml0dGVuIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBvdXRwdXQgc3RyZWFtLgotCSAqIEBwYXJhbSBtYW5pZmVzdEZpbGUgVGhlIGN1cnJlbnQgTUFOSUZFU1QuTUYgZmlsZS4KLQkgKiBAcGFyYW0gZHluYW1pY1VSSXMgSXMgTGlzdCBvZiBVUklzIHRvIGR5bmFtaWNhbGx5IGFkZCB0byB0aGUgbWFuaWZlc3QgY2xhc3NwYXRoLgotCSAqIEBwYXJhbSBvdXRwdXRTdHJlYW0gU3RyZWFtIHRvIHdoaWNoIHRoZSBtb2RpZmllZCBlbnRyeSBzaG91bGQgYmUgd3JpdHRlbi4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlTWFuaWZlc3RDbGFzc3BhdGgoZmluYWwgSUZpbGUgbWFuaWZlc3RGaWxlLCBmaW5hbCBMaXN0IGR5bmFtaWNVUklzLCBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXVwZGF0ZU1hbmlmZXN0Q2xhc3NwYXRoSW1wbChtYW5pZmVzdEZpbGUsIGR5bmFtaWNVUklzLCBudWxsLCBvdXRwdXRTdHJlYW0pOwotICAgIH0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZXMgbmV3IE1BTklGRVNULk1GIHdpdGggYSBkeW5hbWljYWxseSB1cGRhdGVkIGNsYXNzcGF0aCB0aGF0IGlzIHdyaXR0ZW4gdG8gdGhlIHNwZWNpZmllZAotCSAqIG91dHB1dCBzdHJlYW0uCi0JICogQHBhcmFtIG1hbmlmZXN0RmlsZSBUaGUgY3VycmVudCBNQU5JRkVTVC5NRiBmaWxlLgotCSAqIEBwYXJhbSBkeW5hbWljVVJJcyBJcyBMaXN0IG9mIFVSSXMgdG8gZHluYW1pY2FsbHkgYWRkIHRvIHRoZSBtYW5pZmVzdCBjbGFzc3BhdGguCi0JICogQHBhcmFtIG91dHB1dEZpbGUgRmlsZSB0byB3aGljaCB0aGUgbW9kaWZpZWQgZW50cnkgc2hvdWxkIGJlIHdyaXR0ZW4uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZU1hbmlmZXN0Q2xhc3NwYXRoKGZpbmFsIElGaWxlIG1hbmlmZXN0RmlsZSwgZmluYWwgTGlzdCBkeW5hbWljVVJJcywgZmluYWwgRmlsZSBvdXRwdXRGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXVwZGF0ZU1hbmlmZXN0Q2xhc3NwYXRoSW1wbChtYW5pZmVzdEZpbGUsIGR5bmFtaWNVUklzLCBvdXRwdXRGaWxlLCBudWxsKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgbmV3IE1BTklGRVNULk1GIHdpdGggYSBkeW5hbWljYWxseSB1cGRhdGVkIGNsYXNzcGF0aCB0aGF0IGlzIHdyaXR0ZW4gdG8gdGhlIHNwZWNpZmllZAotCSAqIGZpbGUgb3Igb3V0cHV0IHN0cmVhbSwgd2l0aCB0aGUgc3RyZWFtIHRha2luZyBwcmVjZWRlbmNlLgotCSAqIEBwYXJhbSBtYW5pZmVzdEZpbGUgVGhlIGN1cnJlbnQgTUFOSUZFU1QuTUYgZmlsZS4KLQkgKiBAcGFyYW0gZHluYW1pY1VSSXMgSXMgTGlzdCBvZiBVUklzIHRvIGR5bmFtaWNhbGx5IGFkZCB0byB0aGUgbWFuaWZlc3QgY2xhc3NwYXRoLgotCSAqIEBwYXJhbSBvdXRwdXRGaWxlIEZpbGUgdG8gd2hpY2ggdGhlIG1vZGlmaWVkIGVudHJ5IHNob3VsZCBiZSB3cml0dGVuLgotCSAqIEBwYXJhbSBPdXRwdXRTdHJlYW0gc3RyZWFtIFN0cmVhbSB0byB3aGljaCB0aGUgbW9kaWZpZWQgZW50cnkgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIG5vdCBudWxsLAotCSAqIHRoZSBzdHJlYW0gd2lsbCBiZSB3cml0dGVuIGFuZCB0aGUgb3V0cHV0RmlsZSBpZ25vcmVkLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlTWFuaWZlc3RDbGFzc3BhdGhJbXBsKGZpbmFsIElGaWxlIG1hbmlmZXN0RmlsZSwgZmluYWwgTGlzdCBkeW5hbWljVVJJcywgZmluYWwgRmlsZSBvdXRwdXRGaWxlLCBmaW5hbCBPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCQotCQlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gc3RyZWFtOyAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgCUFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdCA9IG51bGw7Ci0gICAgICAgIAl0cnkgewotICAgICAgICAJCWluID0gbWFuaWZlc3RGaWxlLmdldENvbnRlbnRzKCk7Ci0gICAgICAgIAkJbWFuaWZlc3QgPSBuZXcgQXJjaGl2ZU1hbmlmZXN0SW1wbChpbik7Ci0gICAgICAgIAl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0gICAgICAgIAkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0gICAgICAgIAl9IGZpbmFsbHkgewotICAgICAgICAJCWlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgIAkJCXRyeSB7Ci0gICAgICAgIAkJCQlpbi5jbG9zZSgpOwotICAgICAgICAJCQkJaW4gPSBudWxsOwotICAgICAgICAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIAkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIAlmaW5hbCBTdHJpbmdbXSBtYW5pZmVzdENsYXNzcGF0aCA9IG1hbmlmZXN0LmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotICAgICAgICAJZmluYWwgTGlzdCB1cGRhdGVkQ1AgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIAlmb3IgKGludCBpID0gMDsgaSA8IG1hbmlmZXN0Q2xhc3NwYXRoLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIAkJdXBkYXRlZENQLmFkZChtYW5pZmVzdENsYXNzcGF0aFtpXSk7Ci0gICAgICAgIAl9Ci0gICAgICAgIAkvLyB1cGRhdGUgbWFuaWZlc3QgY2xhc3NwYXRoIHRvIGluY2x1ZGUgZHluYW1pYyBlbnRyaWVzCi0gICAgICAgIAlmb3IgKGludCBqID0gMDsgaiA8IGR5bmFtaWNVUklzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgIAkJZmluYWwgU3RyaW5nIGNvbnRhaW5lclVSSSA9IChTdHJpbmcpIGR5bmFtaWNVUklzLmdldChqKTsKLSAgICAgICAgCQkvLyBuZWVkIHRvIGNoZWNrIGV4aXN0aW5nIGVudHJpZXMgdG8gZW5zdXJlIGl0IGRvZXNuJ3QgYXJlIGV4aXN0IG9uIHRoZSBjbGFzc3BhdGgKLSAgICAgICAgCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotICAgICAgICAJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFuaWZlc3RDbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCQkJaWYgKG1hbmlmZXN0Q2xhc3NwYXRoW2ldLmVxdWFscyhjb250YWluZXJVUkkpKSB7Ci0gICAgICAgIAkJCQlleGlzdHMgPSB0cnVlOwotICAgICAgICAJCQkJYnJlYWs7Ci0gICAgICAgIAkJCX0KLSAgICAgICAgCQl9Ci0gICAgICAgIAkJaWYgKCFleGlzdHMpIHsKLSAgICAgICAgCQkJdXBkYXRlZENQLmFkZChjb250YWluZXJVUkkpOwotICAgICAgICAJCX0KLSAgICAgICAgCX0KLSAgICAgICAgCWZpbmFsIFN0cmluZ0J1ZmZlciBjcEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICAJZm9yIChpbnQgaiA9IDA7IGogPCB1cGRhdGVkQ1Auc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgCQlpZiAoIWZpcnN0KSB7Ci0gICAgICAgIAkJCWNwQnVmZmVyLmFwcGVuZCgiICIpOwotICAgICAgICAJCX0gZWxzZSB7Ci0gICAgICAgIAkJCWZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIAkJfQotICAgICAgICAJCWNwQnVmZmVyLmFwcGVuZCgoU3RyaW5nKSB1cGRhdGVkQ1AuZ2V0KGopKTsKLSAgICAgICAgCX0KLSAgICAgICAgCVN0cmluZyBjcCA9IGNwQnVmZmVyLnRvU3RyaW5nKCk7Ci0gICAgICAgIAkvLyBJZiB3ZSBoYXZlIGFuIG91dHB1dCBzdHJlYW0sIGFsd2F5cyB3cml0ZSB0byB0aGUgc3RyZWFtIAotICAgICAgICAJaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJbWFuaWZlc3Quc2V0Q2xhc3NQYXRoKGNwKTsKLSAgICAgICAgICAgIAltYW5pZmVzdC53cml0ZShvdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgCW91dHB1dFN0cmVhbS5mbHVzaCgpOwotICAgICAgICAJfQotICAgICAgICAJLy8gRWxzZSwgd2l0aG91dCBhbiBvdXRwdXQgc3RyZWFtLCBjb25kaXRpb25hbGx5IHVwZGF0ZSB0aGUgc3BlY2lmaWVkIGZpbGUKLSAgICAgICAgCWVsc2UgewotICAgICAgICAgICAgCVN0cmluZyBtYW5pZmVzdFBhdGggPSBtYW5pZmVzdEZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotICAgICAgICAgICAgCVN0cmluZyBwcmlvckNsYXNzcGF0aCA9IG1hbmlmZXN0Q2xhc3NwYXRocy5nZXQobWFuaWZlc3RQYXRoKTsKLSAgICAgICAgICAgIAlpZiAocHJpb3JDbGFzc3BhdGggPT0gbnVsbCB8fCAhcHJpb3JDbGFzc3BhdGguZXF1YWxzKGNwKSB8fCAhb3V0cHV0RmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIAltYW5pZmVzdENsYXNzcGF0aHMucHV0KG1hbmlmZXN0UGF0aCwgY3ApOwotICAgICAgICAgICAgICAgIAltYW5pZmVzdC5zZXRDbGFzc1BhdGgoY3ApOwotICAgICAgICAgICAgICAgIAlvdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKTsKLSAgICAgICAgICAgICAgICAJbWFuaWZlc3Qud3JpdGUob3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICAJb3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAJfQotICAgICAgICAJfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAJaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgIAkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3IuamF2YQppbmRleCBkNjYwZWJlLi45OTFlYWVjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeVZhbGlkYXRvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9DbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwpAQCAtMzksNiArNDAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwpAQCAtODQsMjEgKzg2LDE2IEBACiAJCQkgICAgJiYgcHJvai5oYXNOYXR1cmUoSmF2YUNvcmVMaXRlLk5BVFVSRV9JRCkpIHsKIAkJCSAgICAKIAkJCQlmaW5hbCBib29sZWFuIGlzV2ViQXBwID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2opOwotCQkJICAgIGJvb2xlYW4gd2ViTGlic09ubHkgPSBmYWxzZTsKLQkJCSAgICBpZighQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQuaXNBbGxvd0NsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3koKSl7Ci0JCQkgICAgCWlmKCFpc1dlYkFwcCl7Ci0JCQkgICAgCQlyZXR1cm4gT0tfU1RBVFVTOwotCQkJICAgIAl9IGVsc2UgewotCQkJICAgIAkJd2ViTGlic09ubHkgPSB0cnVlOwotCQkJICAgIAl9Ci0JCQkJfQotCQkJICAgIAorCQkJICAgIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2opOworCQkJICAgIGZpbmFsIGJvb2xlYW4gaXNMZWdhY3lKMkVFID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0xlZ2FjeUoyRUVDb21wb25lbnQoY29tcG9uZW50KTsKKwkJCSAgCiAJCQkgICAgZmluYWwgSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGUgPSBKYXZhQ29yZUxpdGUuY3JlYXRlKHByb2opOwotCQkJICAgIGZpbmFsIE1hcCByZWZlcmVuY2VkUmF3RW50cmllcyA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldFJhd0NvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhqYXZhUHJvamVjdExpdGUsIERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSwgd2ViTGlic09ubHkpOyAJCQkJCi0JCQkJZmluYWwgTGlzdCBwb3RlbnRpYWxSYXdFbnRyaWVzID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UG90ZW50aWFsQ29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGphdmFQcm9qZWN0TGl0ZSwgd2ViTGlic09ubHkpOwotCQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2opOwkJCQkKKwkJCQlmaW5hbCBNYXAgcmVmZXJlbmNlZFJhd0VudHJpZXMgPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3RMaXRlLCBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1ksIGlzTGVnYWN5SjJFRSk7IAkJCQkKKwkJCQlmaW5hbCBMaXN0IHBvdGVudGlhbFJhd0VudHJpZXMgPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRQb3RlbnRpYWxDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3RMaXRlLCBpc0xlZ2FjeUoyRUUpOwkJCQkKIAkJCQlmaW5hbCBDbGFzc3BhdGhEZXBlbmRlbmN5VmFsaWRhdG9yRGF0YSBkYXRhID0gbmV3IENsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3JEYXRhKHByb2opOwogCQkJCQorCQkJCUNsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb25NYW5hZ2VyIGV4dGVuc2lvbk1hbmdlciA9IENsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb25NYW5hZ2VyLmluc3RhbmNlKCk7CisJCQkJCiAJCQkJLy8gdmFsaWRhdGUgdGhlIHJhdyByZWZlcmVuY2VkIGNvbnRhaW5lciBlbnRyaWVzCiAJCQkJSXRlcmF0b3IgaSA9ICByZWZlcmVuY2VkUmF3RW50cmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOwogCQkJCWJvb2xlYW4gaGFzUm9vdE1hcHBpbmcgPSBmYWxzZTsKQEAgLTExNywxOSArMTE0LDE5IEBACiAJCQkJCX0KIAkJCQkJcmVwb3J0TWVzc2FnZXMobXNncyk7CiAJCSAgICAJCS8vIGlmIG5vdCBhIHdlYiBhcHAsIHdhcm4gaWYgYXNzb2NpYXRlZCBjcCBlbnRyeSBpcyBub3QgZXhwb3J0ZWQKLQkJCQkJaWYgKCFpc1dlYkFwcCAmJiAhZW50cnkuaXNFeHBvcnRlZCgpKSB7CisJCQkJCWlmICghaXNXZWJBcHAgJiYgIWVudHJ5LmlzRXhwb3J0ZWQoKSAmJiAhZXh0ZW5zaW9uTWFuZ2VyLmRvZXNQcm9qZWN0SGFuZGxlRXhwb3J0KHByb2osIGVudHJ5KSkgewogCQkJCQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbmV3IE1lc3NhZ2UoImNsYXNzcGF0aGRlcGVuZGVuY3l2YWxpZGF0b3IiLCAvLyROT04tTkxTLTEkCiAJCQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwgTm9uV2ViTm9uRXhwb3J0ZWQsIG5ldyBTdHJpbmdbXXtjcEVudHJ5UGF0aH0sIHByb2opKTsKIAkJCQkJfQogCQkJCX0KIAkJCQogCQkJCWlmICghcmVmZXJlbmNlZFJhd0VudHJpZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2opKSB7IAotCQkJCQkJLy8gY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGFwcGxpY2F0aW9uIGNsaWVudCBwcm9qZWN0cwotCQkJCQkJZmluYWwgSU1lc3NhZ2UgbXNnID0gbmV3IE1lc3NhZ2UoImNsYXNzcGF0aGRlcGVuZGVuY3l2YWxpZGF0b3IiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEFwcENsaWVudFByb2plY3QsIG51bGwsIHByb2opOwotCQkJCQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbXNnKTsKLQkJCQkJfQorLy8JCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2opKSB7IAorLy8JCQkJCQkvLyBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llcyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgYXBwbGljYXRpb24gY2xpZW50IHByb2plY3RzCisvLwkJCQkJCWZpbmFsIElNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCJjbGFzc3BhdGhkZXBlbmRlbmN5dmFsaWRhdG9yIiwgLy8kTk9OLU5MUy0xJAorLy8JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksIEFwcENsaWVudFByb2plY3QsIG51bGwsIHByb2opOworLy8JCQkJCQlfcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtc2cpOworLy8JCQkJCX0KIAogCQkJCQkvLyBhcmUgdGhlcmUgYW55IHJvb3QgbWFwcGluZ3MKIAkJCQkJaWYgKGhhc1Jvb3RNYXBwaW5nICYmIGNvbXBvbmVudCAhPSBudWxsKSB7CkBAIC0yNjYsMTUgKzI2MywyNSBAQAogCQkKIAkJZmluYWwgaW50IGtpbmQgPSBlbnRyeS5nZXRFbnRyeUtpbmQoKTsKIAkJZmluYWwgYm9vbGVhbiBpc0ZpbGUgPSAhQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuaXNDbGFzc0ZvbGRlckVudHJ5KGVudHJ5KTsKKwkJCiAJCWlmIChraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgewotCQkJCiAJCQkvLyBQcm9qZWN0IGNwIGVudHJ5Ci0JCQlyZXN1bHRzLmFkZChuZXcgTWVzc2FnZSgiY2xhc3NwYXRoZGVwZW5kZW5jeXZhbGlkYXRvciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgUHJvamVjdENsYXNzcGF0aEVudHJ5LCBuZXcgU3RyaW5nW117ZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCl9LCBwcm9qZWN0KSk7Ci0KLQkJCXJldHVybiAoSU1lc3NhZ2VbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBJTWVzc2FnZVtyZXN1bHRzLnNpemUoKV0pOworCQkJLy8gQWxsb3cgZmFjZXRlZCBwcm9qZWN0cyBvbmx5LCBhbmQgbm90IHBsYWluIGphdmEgcHJvamVjdHMKKwkJCWJvb2xlYW4gaXNGYWNldGVkUHJvamVjdCA9IGZhbHNlOworCQkJSVByb2plY3QgcmVmZXJlbmNlZFByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOworCQkJdHJ5IHsKKwkJCQlpc0ZhY2V0ZWRQcm9qZWN0ID0gRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuaXNGYWNldGVkUHJvamVjdChyZWZlcmVuY2VkUHJvamVjdCk7CisJCQl9CisJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSl7CisJCQkJLy9JZ25vcmUuIFRocm93biB3aGVuIHByb2plY3QgbWV0YWRhdGEgY2Fubm90IGJlIHJlYWQuIEluIHRoYXQgY2FzZSB3ZSB3aWxsIHRyZWF0IHRoZSBwcm9qZWN0IGFzIG5vbiBmYWNldGVkIAorCQkJfQkJCQorCQkJaWYgKCFpc0ZhY2V0ZWRQcm9qZWN0KXsKKwkJCQlyZXN1bHRzLmFkZChuZXcgTWVzc2FnZSgiY2xhc3NwYXRoZGVwZW5kZW5jeXZhbGlkYXRvciIsIC8vJE5PTi1OTFMtMSQKKwkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksIFByb2plY3RDbGFzc3BhdGhFbnRyeSwgbmV3IFN0cmluZ1tde2VudHJ5LmdldFBhdGgoKS50b1N0cmluZygpfSwgcHJvamVjdCkpOworCQkJCQlyZXR1cm4gKElNZXNzYWdlW10pIHJlc3VsdHMudG9BcnJheShuZXcgSU1lc3NhZ2VbcmVzdWx0cy5zaXplKCldKTsKKwkJCX0KIAkJfSBlbHNlIGlmIChraW5kID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkKKwkJCQkJCiAJCQkvLyBTb3VyY2UgY3AgZW50cnkKIAkJCQogCQkJcmVzdWx0cy5hZGQobmV3IE1lc3NhZ2UoImNsYXNzcGF0aGRlcGVuZGVuY3l2YWxpZGF0b3IiLCAvLyROT04tTkxTLTEkCkBAIC0zMTksMjQgKzMyNiwyNCBAQAogCQkJfQogCQl9CiAgICAgCQotICAgIAlmaW5hbCBJUGF0aCBydW50aW1lUGF0aCA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldFJ1bnRpbWVQYXRoKGF0dHJpYiwgaXNXZWJBcHAsICFpc0ZpbGUpOwotICAgIAlpZiAoIWlzV2ViQXBwKSB7Ci0gICAgCQkvLyBvbmx5IGEgLi4vIG9yIC8gbWFwcGluZyBpcyBjdXJyZW50bHkgbGVnYWwgaW4gYSBub24td2ViIGNvbnRleHQKLSAgICAJCWlmICghKHJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCkgCi0gICAgCQkJCXx8IHJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT01QT05FTlRfUEFUSCkpKSB7IAotICAgIAkJCXJlc3VsdHMuYWRkKG5ldyBNZXNzYWdlKCJjbGFzc3BhdGhkZXBlbmRlbmN5dmFsaWRhdG9yIiwgLy8kTk9OLU5MUy0xJAotICAgIAkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgSW52YWxpZE5vbldlYlJ1bnRpbWVQYXRoLCBuZXcgU3RyaW5nW117ZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCksIHJ1bnRpbWVQYXRoLnRvU3RyaW5nKCl9LCBwcm9qZWN0KSk7Ci0gICAgCQl9Ci0gICAgCX0gZWxzZSB7Ci0gICAgCQlTdHJpbmcgcGF0aFN0ciA9IHJ1bnRpbWVQYXRoLnRvU3RyaW5nKCk7Ci0gICAgCQkvLyBjYW4gb25seSBiZSAuLi8sIC9XRUItSU5GL2xpYiBvciAvV0VCLUlORi9jbGFzc2VzCi0gICAgCQlpZiAoIXJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCkgCi0gICAgCQkJJiYgIXJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5XRUJfSU5GX0xJQl9QQVRIKQotICAgIAkJCSYmICFydW50aW1lUGF0aC5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuV0VCX0lORl9DTEFTU0VTX1BBVEgpKSB7IAotICAgIAkJCXJlc3VsdHMuYWRkKG5ldyBNZXNzYWdlKCJjbGFzc3BhdGhkZXBlbmRlbmN5dmFsaWRhdG9yIiwgLy8kTk9OLU5MUy0xJAotICAgIAkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgSW52YWxpZFdlYlJ1bnRpbWVQYXRoLCBuZXcgU3RyaW5nW117ZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCksIHBhdGhTdHJ9LCBwcm9qZWN0KSk7Ci0gICAgCQl9Ci0gICAgCX0KKy8vICAgIAlmaW5hbCBJUGF0aCBydW50aW1lUGF0aCA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldFJ1bnRpbWVQYXRoKGF0dHJpYiwgaXNXZWJBcHAsICFpc0ZpbGUpOworLy8gICAgCWlmICghaXNXZWJBcHApIHsKKy8vICAgIAkJLy8gb25seSBhIC4uLyBvciAvIG1hcHBpbmcgaXMgY3VycmVudGx5IGxlZ2FsIGluIGEgbm9uLXdlYiBjb250ZXh0CisvLyAgICAJCWlmICghKHJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCkgCisvLyAgICAJCQkJfHwgcnVudGltZVBhdGguZXF1YWxzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTVBPTkVOVF9QQVRIKSkpIHsgCisvLyAgICAJCQlyZXN1bHRzLmFkZChuZXcgTWVzc2FnZSgiY2xhc3NwYXRoZGVwZW5kZW5jeXZhbGlkYXRvciIsIC8vJE5PTi1OTFMtMSQKKy8vICAgIAkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgSW52YWxpZE5vbldlYlJ1bnRpbWVQYXRoLCBuZXcgU3RyaW5nW117ZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCksIHJ1bnRpbWVQYXRoLnRvU3RyaW5nKCl9LCBwcm9qZWN0KSk7CisvLyAgICAJCX0KKy8vICAgIAl9IGVsc2UgeworLy8gICAgCQlTdHJpbmcgcGF0aFN0ciA9IHJ1bnRpbWVQYXRoLnRvU3RyaW5nKCk7CisvLyAgICAJCS8vIGNhbiBvbmx5IGJlIC4uLywgL1dFQi1JTkYvbGliIG9yIC9XRUItSU5GL2NsYXNzZXMKKy8vICAgIAkJaWYgKCFydW50aW1lUGF0aC5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSX1BBVEgpIAorLy8gICAgCQkJJiYgIXJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5XRUJfSU5GX0xJQl9QQVRIKQorLy8gICAgCQkJJiYgIXJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5XRUJfSU5GX0NMQVNTRVNfUEFUSCkpIHsgCisvLyAgICAJCQlyZXN1bHRzLmFkZChuZXcgTWVzc2FnZSgiY2xhc3NwYXRoZGVwZW5kZW5jeXZhbGlkYXRvciIsIC8vJE5PTi1OTFMtMSQKKy8vICAgIAkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgSW52YWxpZFdlYlJ1bnRpbWVQYXRoLCBuZXcgU3RyaW5nW117ZW50cnkuZ2V0UGF0aCgpLnRvU3RyaW5nKCksIHBhdGhTdHJ9LCBwcm9qZWN0KSk7CisvLyAgICAJCX0KKy8vICAgIAl9CiAKIAkJcmV0dXJuIChJTWVzc2FnZVtdKSByZXN1bHRzLnRvQXJyYXkobmV3IElNZXNzYWdlW3Jlc3VsdHMuc2l6ZSgpXSk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0NsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQuamF2YQppbmRleCAwODJmYzM0Li45Yjg3NGFkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLklDbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7CiAKQEAgLTI2LDcgKzI3LDcgQEAKICAqIGhvd2V2ZXIsIGNsYXNzIGZvbGRlciBkZXBlbmRlbmNpZXMgYXJlIGFsc28gcG9zc2libGUgYW5kIHRob3NlIGFyZSByZXByZXNlbnRlZCBhcyBhIHJlZmVyZW5jZSB0byBhbiBWaXJ0dWFsQ29tcG9uZW50IHVzaW5nIHRoaXMKICAqIGNsYXNzIGFzIHdlbGwuCiAgKi8KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCBleHRlbmRzIEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCB7CitwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQgZXh0ZW5kcyBKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQgaW1wbGVtZW50cyBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudCB7CiAKIAlmaW5hbCBwcml2YXRlIGJvb2xlYW4gaXNDbGFzc0ZvbGRlcjsKIAkKQEAgLTYxLDYgKzYyLDcgQEAKIAkJcmV0dXJuIGFsbENvbnRhaW5lcnNbMF07CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoKSB7CiAJCWlmIChpc0NsYXNzRm9sZGVyKSB7CiAJCQlyZXR1cm4gTk9fUkVGRVJFTkNFUzsKQEAgLTY4LDEwICs3MCwxOCBAQAogCQlyZXR1cm4gc3VwZXIuZ2V0UmVmZXJlbmNlcygpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmdbXSBnZXRNYW5pZmVzdENsYXNzcGF0aCgpIHsKIAkJaWYgKGlzQ2xhc3NGb2xkZXIpIHsKIAkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwogCQl9CiAJCXJldHVybiBzdXBlci5nZXRNYW5pZmVzdENsYXNzcGF0aCgpOwogCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgY2xhenopIHsKKwkJaWYoIGlzQ2xhc3NGb2xkZXIgJiYgY2xhenouZXF1YWxzKElQYXRoLmNsYXNzKSkgCisJCQlyZXR1cm4gZ2V0Q2xhc3NGb2xkZXIoKS5nZXRMb2NhdGlvbigpOworCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihjbGF6eik7CisJfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL0R1cGxpY2F0ZUNsYXNzcGF0aENvbXBvbmVudFVSSVZhbGlkYXRvckVuYWJsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9EdXBsaWNhdGVDbGFzc3BhdGhDb21wb25lbnRVUklWYWxpZGF0b3JFbmFibGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyMGZhYwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9EdXBsaWNhdGVDbGFzc3BhdGhDb21wb25lbnRVUklWYWxpZGF0b3JFbmFibGVtZW50LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KYXZhRUVQcmVmZXJlbmNlc0luaXRpYWxpemVyOworCisKK3B1YmxpYyBjbGFzcyBEdXBsaWNhdGVDbGFzc3BhdGhDb21wb25lbnRVUklWYWxpZGF0b3JFbmFibGVtZW50IHsKKworCS8qKgorCSAqIFRoaXMgZmxhZyBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIGVuYWJsZW1lbnQgb2YgdGhlIGxlZ2FjeSBEdXBsaWNhdGUgQ2xhc3NwYXRoIENvbXBvbmVudCBVUkkgdmFsaWRhdGlvbi4KKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlIHdoaWNoIGVuYWJsZXMgdGhpcyB2YWxpZGF0aW9uLgorCSAqIFNldHRpbmcgdGhpcyB2YWx1ZSB0byBmYWxzZSB3aWxsIGRpc2FibGUgdGhpcyB2YWxpZGF0aW9uLgorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdmFsaWRhdGVEdXBsaWNhdGVDbGFzc3BhdGhDb21wb25lbnRVUkk7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNCZWVuU2V0ID0gZmFsc2U7CisJCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFZhbGlkYXRlRHVwbGljYXRlQ2xhc3NwYXRoQ29tcG9uZW50VVJJKGJvb2xlYW4gdmFsaWRhdGUpeworCQl2YWxpZGF0ZUR1cGxpY2F0ZUNsYXNzcGF0aENvbXBvbmVudFVSSSA9IHZhbGlkYXRlOworCQloYXNCZWVuU2V0ID0gdHJ1ZTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZFZhbGlkYXRlRHVwbGljYXRlQ2xhc3NwYXRoQ29tcG9uZW50VVJJKCl7CisJCWlmKCFoYXNCZWVuU2V0KSB7CisJCQlpZighQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQuaXNBbGxvd0NsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3koKSkgeworCQkJCXZhbGlkYXRlRHVwbGljYXRlQ2xhc3NwYXRoQ29tcG9uZW50VVJJID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCXZhbGlkYXRlRHVwbGljYXRlQ2xhc3NwYXRoQ29tcG9uZW50VVJJID0gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihKYXZhRUVQcmVmZXJlbmNlc0luaXRpYWxpemVyLktleXMuVkFMSURBVEVfRFVQTElDQVRFX0NMQVNTUEFUSF9DT01QT05FTlRfVVJJKTsKKwkJCX0KKwkJCWhhc0JlZW5TZXQgPSB0cnVlOworCQl9CisJCXJldHVybiB2YWxpZGF0ZUR1cGxpY2F0ZUNsYXNzcGF0aENvbXBvbmVudFVSSTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggNGIyYzY5Mi4uNzhiYzNjOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL1VwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9VcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMTUsNyArMTUsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFQ29tbW9uTWVzc2FnZXM7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwpAQCAtMjgsNiArMjcsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciNnZXRQcm9wZXJ0eU5hbWVzKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7CiAJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwogCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BTUUpOwpAQCAtNDEsNiArNDEsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVOVFJJRVNfV0lUSF9BVFRSSUJVVEUpKSB7CiAJCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwpAQCAtNTMsNiArNTQsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0T3BlcmF0aW9uKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewogCQlyZXR1cm4gbmV3IFVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZXNPcGVyYXRpb24obW9kZWwpOwogCX0KQEAgLTY0LDYgKzY2LDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoamF2YS5sYW5nLlN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHkpIHsKIAkJaWYgKHByb3BlcnR5LmVxdWFscyhQUk9KRUNUX05BTUUpKSB7CiAJCQlmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL1VwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZXNPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY2xhc3NwYXRoZGVwL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NsYXNzcGF0aGRlcC9VcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVzT3BlcmF0aW9uLmphdmEKaW5kZXggMDk0OWMxZi4uNGI5YWI4NyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jbGFzc3BhdGhkZXAvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY2xhc3NwYXRoZGVwL1VwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZXNPcGVyYXRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NsYXNzcGF0aGRlcC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jbGFzc3BhdGhkZXAvVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlc09wZXJhdGlvbi5qYXZhCkBAIC0yNywxMyArMjcsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuamF2YWxpdGUuSUphdmFQcm9qZWN0TGl0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5qYXZhbGl0ZS5KYXZhQ29yZUxpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5VcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVVdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CiAKQEAgLTQ3LDEwICs0OCwxMSBAQAogCQlzdXBlcihkYXRhTW9kZWwpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgSUFkYXB0YWJsZSBpbmZvKQogCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKSk7Ci0JCWZpbmFsIGJvb2xlYW4gd2ViTGlic09ubHkgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkgJiYgIUNsYXNzcGF0aERlcGVuZGVuY3lFbmFibGVtZW50LmlzQWxsb3dDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5KCk7CisJCWZpbmFsIGJvb2xlYW4gaXNMZWdhY3lKMkVFID0gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNMZWdhY3lKMkVFUHJvamVjdChwcm9qZWN0KTsKIAogCQl0cnkgewogCQkJaWYgKHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKQEAgLTc4LDcgKzgwLDcgQEAKIAkJCQkJCQl9CiAJCQkJCQkJZW50cmllc1RvQXR0cmliLnB1dChlbnRyeSwgYXR0cmliKTsKIAkJCQkJCX0KLQkJCQkJCXVwZGF0ZURlcGVuZGVuY3lBdHRyaWJ1dGVzKGphdmFQcm9qZWN0LCBlbnRyaWVzVG9BdHRyaWIsIG1vZGlmeUNvbXBvbmVudERlcCwgd2ViTGlic09ubHkpOyAKKwkJCQkJCXVwZGF0ZURlcGVuZGVuY3lBdHRyaWJ1dGVzKGphdmFQcm9qZWN0LCBlbnRyaWVzVG9BdHRyaWIsIG1vZGlmeUNvbXBvbmVudERlcCwgaXNMZWdhY3lKMkVFKTsgCiAJCQkJCX0gZWxzZSB7CiAJCQkJCQlyZW1vdmVEZXBlbmRlbmN5QXR0cmlidXRlcyhqYXZhUHJvamVjdCwgZW50cmllc1RvUmVtb3ZlLCBtb2RpZnlDb21wb25lbnREZXApOyAKIAkJCQkJfQpAQCAtODgsNyArOTAsNyBAQAogCQkJCX0KIAkJCX0KIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcihKMkVFUGx1Z2luLlBMVUdJTl9JRCkubG9nRXJyb3IoY2UpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihjZSk7CiAJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKMkVFUGx1Z2luLlBMVUdJTl9JRCwgMCwgY2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBjZSk7CiAJCX0KIAkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CkBAIC0xMjksMTIgKzEzMSwxMyBAQAogCX0KIAogCXByaXZhdGUgdm9pZCBhbHRlckRlcGVuZGVuY3lBdHRyaWJ1dGVzKGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgZmluYWwgTWFwIGVudHJpZXMsIGZpbmFsIGJvb2xlYW4gYWRkLCBmaW5hbCBib29sZWFuIG1vZGlmeUNvbXBvbmVudERlcCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBib29sZWFuIGlzV2ViQXBwID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWZpbmFsIGJvb2xlYW4gd2ViTGlic09ubHkgPSBpc1dlYkFwcCAmJiAhQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQuaXNBbGxvd0NsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3koKTsKKwkJZmluYWwgYm9vbGVhbiBpc0xlZ2FjeUoyRUUgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0xlZ2FjeUoyRUVQcm9qZWN0KGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7CiAJCWZpbmFsIElKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlID0gSmF2YUNvcmVMaXRlLmNyZWF0ZShqYXZhUHJvamVjdCk7CiAJCQogCQkvLyBpbml0aWFsaXplIHRvIHRoZSBzZXQgb2YgcmF3IGVudHJpZXMgd2l0aCB0aGUgYXR0cmliCi0JCWZpbmFsIE1hcCBlbnRyaWVzV2l0aEF0dHJpYiA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldFJhd0NvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhqYXZhUHJvamVjdExpdGUsIG1vZGlmeUNvbXBvbmVudERlcCA/IERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSA6IERlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkNMQVNTUEFUSF9DT01QT05FTlRfTk9OREVQRU5ERU5DWSwgd2ViTGlic09ubHkpOworCQlmaW5hbCBNYXAgZW50cmllc1dpdGhBdHRyaWIgPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3RMaXRlLCBtb2RpZnlDb21wb25lbnREZXAgPyBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1kgOiBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5DTEFTU1BBVEhfQ09NUE9ORU5UX05PTkRFUEVOREVOQ1ksIGlzTGVnYWN5SjJFRSk7CisJCQorCQlDbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9uTWFuYWdlciBleHRlbnNpb25NYW5hZ2VyID0gQ2xhc3NwYXRoRGVwZW5kZW5jeUV4dGVuc2lvbk1hbmFnZXIuaW5zdGFuY2UoKTsKIAkJCiAJCUl0ZXJhdG9yIGkgPSBlbnRyaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7CiAJCXdoaWxlIChpLmhhc05leHQoKSkgewpAQCAtMTQ0LDEzICsxNDcsMjkgQEAKIAkJCQkJSVBhdGggcnVudGltZVBhdGggPSAoSVBhdGgpIGVudHJpZXMuZ2V0KGVudHJ5KTsKIAkJCQkJaWYgKHJ1bnRpbWVQYXRoID09IG51bGwpIHsKIAkJCQkJCS8vIGNvbXB1dGUgdGhlIGRlZmF1bHQgcnVudGltZSBwYXRoCi0JCQkJCQlydW50aW1lUGF0aCA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldERlZmF1bHRSdW50aW1lUGF0aChpc1dlYkFwcCwgQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuaXNDbGFzc0ZvbGRlckVudHJ5KGVudHJ5KSk7CisJCQkJCQlJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKTsKKwkJCQkJCXJ1bnRpbWVQYXRoID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0RGVmYXVsdFJ1bnRpbWVQYXRoKHZpcnR1YWxDb21wb25lbnQsIGVudHJ5KTsKIAkJCQkJfQorCQkJCQkKIAkJCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSBudWxsOwotCQkJCQlpZiAobW9kaWZ5Q29tcG9uZW50RGVwKSB7Ci0JCQkJCQlhdHRyaWIgPSBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVVdGlsLmNyZWF0ZURlcGVuZGVuY3lBdHRyaWJ1dGUocnVudGltZVBhdGgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYXR0cmliID0gVXBkYXRlQ2xhc3NwYXRoQXR0cmlidXRlVXRpbC5jcmVhdGVOb25EZXBlbmRlbmN5QXR0cmlidXRlKCk7CisJCQkJCQorCQkJCQlpZiAobW9kaWZ5Q29tcG9uZW50RGVwKSAKKwkJCQkJeworCQkJCSAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiBhbiBleHRlbmRlciBoYXMgYSB2YWx1ZSBmb3IgdGhpcyBjbGFzc3BhdGggZW50cnkuCSAgCisJCQkJCSAgU3RyaW5nIGV4dGVuZGVyVmFsdWUgPSBleHRlbnNpb25NYW5hZ2VyLmdldERlcGVuZGVuY3lWYWx1ZSggamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLCBlbnRyeSApOworCQkJCQkgIAorCQkJCQkgIGlmKCBleHRlbmRlclZhbHVlID09IG51bGwgKQorCQkJCQkgIHsKKwkJCQkJICAgIGF0dHJpYiA9IFVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZVV0aWwuY3JlYXRlRGVwZW5kZW5jeUF0dHJpYnV0ZShydW50aW1lUGF0aCk7CisJCQkJCSAgfQorCQkJCQkgIGVsc2UKKwkJCQkJICB7CisJCQkJCSAgICBhdHRyaWIgPSBVcGRhdGVDbGFzc3BhdGhBdHRyaWJ1dGVVdGlsLmNyZWF0ZURlcGVuZGVuY3lBdHRyaWJ1dGUoIGV4dGVuZGVyVmFsdWUgKTsgIAorCQkJCQkgIH0KKwkJCQkJfSAKKwkJCQkJZWxzZSAKKwkJCQkJeworCQkJCQkgIGF0dHJpYiA9IFVwZGF0ZUNsYXNzcGF0aEF0dHJpYnV0ZVV0aWwuY3JlYXRlTm9uRGVwZW5kZW5jeUF0dHJpYnV0ZSgpOwogCQkJCQl9CiAgCQkJCQllbnRyaWVzV2l0aEF0dHJpYi5wdXQoZW50cnksIGF0dHJpYik7CiAJCQkJfQpAQCAtMTYxLDcgKzE4MCw3IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCXVwZGF0ZURlcGVuZGVuY3lBdHRyaWJ1dGVzKGphdmFQcm9qZWN0LCBlbnRyaWVzV2l0aEF0dHJpYiwgbW9kaWZ5Q29tcG9uZW50RGVwLCB3ZWJMaWJzT25seSk7CisJCXVwZGF0ZURlcGVuZGVuY3lBdHRyaWJ1dGVzKGphdmFQcm9qZWN0LCBlbnRyaWVzV2l0aEF0dHJpYiwgbW9kaWZ5Q29tcG9uZW50RGVwLCBpc0xlZ2FjeUoyRUUpOwogCX0KIAkKIAlwcml2YXRlIElDbGFzc3BhdGhFbnRyeSBnZXRNYXRjaGluZ0VudHJ5SWdub3JlQXR0cmlidXRlcyhmaW5hbCBNYXAgZW50cmllcywgZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7CkBAIC0xODcsNyArMjA2LDcgQEAKIAkgKiBAcGFyYW0gbW9kaWZ5Q29tcG9uZW50RGVwIFRydWUgaWYgbW9kaWZ5aW5nIHRoZSBkZXBlbmRlbmN5IGF0dHJpYnV0ZSwgZmFsc2UgaWYgbW9kaWZ5aW5nIHRoZSBub24tZGVwZW5kZW5jeSBhdHRyaWJ1dGUuCiAJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIFRocm93biBpZiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZC4KIAkgKi8JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURlcGVuZGVuY3lBdHRyaWJ1dGVzKGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgZmluYWwgTWFwIGVudHJpZXNXaXRoQXR0cmliLCBmaW5hbCBib29sZWFuIG1vZGlmeUNvbXBvbmVudERlcCwgZmluYWwgYm9vbGVhbiB3ZWJMaWJzT25seSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCB1cGRhdGVEZXBlbmRlbmN5QXR0cmlidXRlcyhmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3QsIGZpbmFsIE1hcCBlbnRyaWVzV2l0aEF0dHJpYiwgZmluYWwgYm9vbGVhbiBtb2RpZnlDb21wb25lbnREZXAsIGZpbmFsIGJvb2xlYW4gaXNMZWdhY3lKMkVFKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCWlmIChqYXZhUHJvamVjdCA9PSBudWxsIHx8ICFqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpIHsKIAkJCXJldHVybjsKIAkJfQpAQCAtMjAzLDcgKzIyMiw3IEBACiAJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnkgPSByYXdDbGFzc3BhdGhbaV07CiAJCQlmaW5hbCBpbnQga2luZCA9IGVudHJ5LmdldEVudHJ5S2luZCgpOwogCQkJYm9vbGVhbiBoYXNBdHRyaWJ1dGUgPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5jaGVja0ZvckNvbXBvbmVudERlcGVuZGVuY3lBdHRyaWJ1dGUoZW50cnksIAotCQkJCQltb2RpZnlDb21wb25lbnREZXAgPyBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1kgOiBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5DTEFTU1BBVEhfQ09NUE9ORU5UX05PTkRFUEVOREVOQ1ksIHdlYkxpYnNPbmx5KSAhPSBudWxsOworCQkJCQltb2RpZnlDb21wb25lbnREZXAgPyBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1kgOiBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5DTEFTU1BBVEhfQ09NUE9ORU5UX05PTkRFUEVOREVOQ1ksIGlzTGVnYWN5SjJFRSkgIT0gbnVsbDsKIAkJCWJvb2xlYW4gc2hvdWxkSGF2ZUF0dHJpYnV0ZSA9IGVudHJpZXNXaXRoQXR0cmliLmNvbnRhaW5zS2V5KGVudHJ5KTsKIAkJCWJvb2xlYW4gdXBkYXRlQXR0cmlidXRlcyA9IGZhbHNlOwogCQkJSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIHVwZGF0ZWRBdHRyaWJ1dGVzID0gbnVsbDsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9DTVBKYXZhQ2hhbmdlU3luY2hyb25pemF0aW9uQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NNUEphdmFDaGFuZ2VTeW5jaHJvbml6YXRpb25BZGFwdGVyLmphdmEKaW5kZXggMTk5Mjc2Mi4uOWRmMjUzNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NNUEphdmFDaGFuZ2VTeW5jaHJvbml6YXRpb25BZGFwdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NNUEphdmFDaGFuZ2VTeW5jaHJvbml6YXRpb25BZGFwdGVyLmphdmEKQEAgLTg2LDYgKzg2LDcgQEAKIAkgKiBAcGFyYW0gTm90aWZpY2F0aW9uCiAJICogICAgICAgICAgICBtc2cgLSBNZXNzYWdlIGluZGljYXRlcyB3aGF0IGhhcyBjaGFuZ2VkLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewogCQlpZiAoIWlzRW5hYmxlZChnZXRDTVAoKSkpIHsKIAkJCWVuYWJsZShnZXRDTVAoKSk7CkBAIC0yMzUsNyArMjM2LDcgQEAKIAkJCXJldHVybjsKIAkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgZ2V0VGFyZ2V0KCk7CiAJCUxpc3QgY21wQXR0cmlidXRlcyA9IGNtcC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotCQlpZiAoY21wQXR0cmlidXRlcyAhPSBudWxsIHx8ICFjbXBBdHRyaWJ1dGVzLmlzRW1wdHkoKSkgeworCQlpZiAoY21wQXR0cmlidXRlcyAhPSBudWxsICYmICFjbXBBdHRyaWJ1dGVzLmlzRW1wdHkoKSkgewogCQkJYm9vbGVhbiBtb2RGbGFnID0gZ2V0Q3VycmVudE1vZGlmaWNhdGlvbkZsYWcoKTsKIAkJCXRyeSB7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbXBBdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7CkBAIC0yNjgsNyArMjY5LDcgQEAKIAkJZmx1c2hQcmltYXJ5S2V5Q2xhc3MocHJpbWFyeUtleUNsYXNzKTsKIAogCQlMaXN0IGNtcEF0dHJpYnV0ZXMgPSBjbXAuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGNtcEF0dHJpYnV0ZXMgIT0gbnVsbCB8fCAhY21wQXR0cmlidXRlcy5pc0VtcHR5KCkpIHsKKwkJaWYgKGNtcEF0dHJpYnV0ZXMgIT0gbnVsbCkgewogCQkJZm91bmRLZXlzLmNsZWFyKCk7CiAJCQlMaXN0IGtleUF0dHJpYnV0ZXNMaXN0ID0gY21wLmdldEtleUF0dHJpYnV0ZXMoKTsKIAkJCWZvdW5kS2V5cy5hZGRBbGwoa2V5QXR0cmlidXRlc0xpc3QpOwpAQCAtMjk2LDIyICsyOTcsMTggQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKIAkJYm9vbGVhbiBpc0NoYW5nZWQgPSBnZXRUYXJnZXQoKSAhPSBuZXdUYXJnZXQ7CiAJCWlmIChuZXdUYXJnZXQgPT0gbnVsbCkgewogCQkJc3VwZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7CiAJCQljbXBSZXNvdXJjZSA9IG51bGw7CiAJCX0gZWxzZSBpZiAobmV3VGFyZ2V0IGluc3RhbmNlb2YgQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgewotCQkJLy9UT0RPIC0gdW5jb21tZW50IHdoZW4gY29tcGlsZSBlcnJvcnMgYXJlIGdvbmUKLQkJCWlmIChmYWxzZSkvKiAoRUpCQ29tbWFuZENvcGllci5pc0NvZGVnZW5Db3B5KG5ld1RhcmdldCkpICovCi0JCQkJbmV3VGFyZ2V0LmVBZGFwdGVycygpLnJlbW92ZSh0aGlzKTsKLQkJCWVsc2UgewotCQkJCVJlc291cmNlIHJlcyA9ICgoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgbmV3VGFyZ2V0KS5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCQlzdXBlci5zZXRUYXJnZXQobmV3VGFyZ2V0KTsKLQkJCQkJaWYgKGlzQ2hhbmdlZCkKLQkJCQkJCWluaXRpYWxpemVUYXJnZXQoKTsKLQkJCQl9CisJCQlSZXNvdXJjZSByZXMgPSAoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIG5ld1RhcmdldCkuZVJlc291cmNlKCk7CisJCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgeworCQkJCXN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOworCQkJCWlmIChpc0NoYW5nZWQpCisJCQkJCWluaXRpYWxpemVUYXJnZXQoKTsKIAkJCX0KIAkJfQogCX0KQEAgLTM2MiwxMiArMzU5LDE0IEBACiAJCQkJaWYgKG5hdHVyZXMuZ2V0KGkpIGluc3RhbmNlb2YgRU1GTmF0dXJlKQogCQkJCQluYXR1cmUgPSAoRU1GTmF0dXJlKSBuYXR1cmVzLmdldChpKTsKIAkJCX0KLQkJCUxpc3QgYWRhcHRlckZhY3RvcmllcyA9IG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpLmdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKLQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBFY29yZVV0aWwuZ2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcmllcywgUmVhZEFkYXB0b3IuVFlQRV9LRVkpOwotCQkJaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJSmF2YUpET01BZGFwdGVyRmFjdG9yeSBqYXZhRmFjdG9yeSA9IChKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5KSBmYWN0b3J5OwotCQkJCWphdmFGYWN0b3J5LmZsdXNoUmVmbGVjdGlvbk5vTm90aWZpY2F0aW9uKHByaW1hcnlLZXlDbGFzcy5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJCXJldHVybiB0cnVlOworCQkJaWYobmF0dXJlICE9bnVsbCApeworCQkJCUxpc3QgYWRhcHRlckZhY3RvcmllcyA9IG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpLmdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKKwkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gRWNvcmVVdGlsLmdldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3JpZXMsIFJlYWRBZGFwdG9yLlRZUEVfS0VZKTsKKwkJCQlpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIEphdmFKRE9NQWRhcHRlckZhY3RvcnkpIHsKKwkJCQkJSmF2YUpET01BZGFwdGVyRmFjdG9yeSBqYXZhRmFjdG9yeSA9IChKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5KSBmYWN0b3J5OworCQkJCQlqYXZhRmFjdG9yeS5mbHVzaFJlZmxlY3Rpb25Ob05vdGlmaWNhdGlvbihwcmltYXJ5S2V5Q2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKKwkJCQkJcmV0dXJuIHRydWU7CisJCQkJfQogCQkJfQogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJLy8gV2UgZG9uJ3QgcmVhbGx5IGNhcmUgd2hhdCB0aGUgZXhjZXB0aW9uIHdhcywgd2UnbGwganVzdCBiYWlsIG91dApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NsYXNzcGF0aExpYnJhcnlFeHBhbmRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NsYXNzcGF0aExpYnJhcnlFeHBhbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYzVlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vQ2xhc3NwYXRoTGlicmFyeUV4cGFuZGVyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkZsYXRWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklDaGlsZE1vZHVsZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdEZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXRGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5WaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOworCitwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoTGlicmFyeUV4cGFuZGVyIGV4dGVuZHMgRmxhdFZpcnR1YWxDb21wb25lbnQgeworCisJcHJpdmF0ZSBJVmlydHVhbFJlZmVyZW5jZSBjb25zdW1lZFJlZjsKKworCXB1YmxpYyBDbGFzc3BhdGhMaWJyYXJ5RXhwYW5kZXIoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7CisJCXN1cGVyKGNvbXBvbmVudCk7CisJfQorCQorCXB1YmxpYyBDbGFzc3BhdGhMaWJyYXJ5RXhwYW5kZXIoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJc3VwZXIoY29tcG9uZW50KTsKKwkJY29uc3VtZWRSZWYgPSByZWZlcmVuY2U7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGNhbk9wdGltaXplKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBvcHRpbWl6ZShMaXN0PElGbGF0UmVzb3VyY2U+IHJlc291cmNlcywgTGlzdDxJQ2hpbGRNb2R1bGVSZWZlcmVuY2U+IGNoaWxkcmVuKSB7CisJCWlmIChnZXRDb21wb25lbnQoKSAhPSBudWxsKSB7CisJCQlWaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkgdXRpbCA9IG5ldyBWaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkocmVzb3VyY2VzLCB0aGlzKTsKKwkJCXRyeSB7CisJCQkJLy9pZiBhIGNvbnN1bWFibGUgcmVmZXJlbmNlIGlzIHNwZWNpZmllZCB3ZSBzaG91bGQgY29uc3VtZSB0aGUgcmVmZXJlbmNlCisJCQkJaWYgKGNvbnN1bWVkUmVmICE9IG51bGwpIHsKKwkJCQkJY29uc3VtZUNvbXBvbmVudCh1dGlsLCBuZXcgUGF0aCgiIiksIGNvbnN1bWVkUmVmKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQkvL2Vsc2UgY29uc3VtZSBhbGwgb2YgdGhlIGNvbXBvbmVudCdzIGNvbnN1bWFibGUgcmVmZXJlbmNlCisJCQkJZWxzZSB7CisJCQkJCWFkZENvbnN1bWVkUmVmZXJlbmNlcyh1dGlsLCBnZXRDb21wb25lbnQoKSwgbmV3IFBhdGgoIiIpKTsgCS8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwdWJsaWMgTGlzdCA8SUZsYXRGaWxlPiBmZXRjaEZsYXRGaWxlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSUZsYXRSZXNvdXJjZSBbXSByZXNvdXJjZXMgPSBmZXRjaFJlc291cmNlcygpOworCQlMaXN0PElGbGF0RmlsZT4gZmxhdEZpbGVzID0gbmV3IEFycmF5TGlzdDxJRmxhdEZpbGU+KCk7CisJCXJldHVybiBmZXRjaEZsYXRGaWxlcyhyZXNvdXJjZXMsIGZsYXRGaWxlcyk7CisJfQorCQorCXByaXZhdGUgTGlzdCA8SUZsYXRGaWxlPiBmZXRjaEZsYXRGaWxlcyhJRmxhdFJlc291cmNlW10gcmVzb3VyY2VzLCBMaXN0PElGbGF0RmlsZT4gZmxhdEZpbGVzKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7CisJCQlJRmxhdFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOworCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZsYXRGaWxlKSB7CisJCQkJZmxhdEZpbGVzLmFkZCgoSUZsYXRGaWxlKXJlc291cmNlKTsKKwkJCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmxhdEZvbGRlcikgeworCQkJCWZldGNoRmxhdEZpbGVzKCgoSUZsYXRGb2xkZXIpcmVzb3VyY2UpLm1lbWJlcnMoKSwgZmxhdEZpbGVzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmxhdEZpbGVzOworCX0KKworCXB1YmxpYyBJRmxhdFJlc291cmNlIGZldGNoUmVzb3VyY2UoSVBhdGggcnVudGltZVBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSUZsYXRSZXNvdXJjZSBbXSByZXNvdXJjZXMgPSBmZXRjaFJlc291cmNlcygpOworCQlyZXR1cm4gZmV0Y2hSZXNvdXJjZShydW50aW1lUGF0aC5tYWtlUmVsYXRpdmUoKSwgcmVzb3VyY2VzKTsKKwl9CisKKwlwcml2YXRlIElGbGF0UmVzb3VyY2UgZmV0Y2hSZXNvdXJjZShJUGF0aCBydW50aW1lUGF0aCwgSUZsYXRSZXNvdXJjZVtdIHJlc291cmNlcykgeworCQlmb3IoSUZsYXRSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlcyl7CisJCQlJUGF0aCBmdWxsUmVzb3VyY2VQYXRoID0gcmVzb3VyY2UuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkuYXBwZW5kKHJlc291cmNlLmdldE5hbWUoKSk7CisJCQlpZihmdWxsUmVzb3VyY2VQYXRoLmVxdWFscyhydW50aW1lUGF0aCkpeworCQkJCXJldHVybiByZXNvdXJjZTsKKwkJCX0gCisJCQllbHNlIGlmKGZ1bGxSZXNvdXJjZVBhdGguaXNQcmVmaXhPZihydW50aW1lUGF0aCkpeworCQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgSUZsYXRGb2xkZXIpeworCQkJCQlJRmxhdEZvbGRlciBmb2xkZXIgPSAoSUZsYXRGb2xkZXIpcmVzb3VyY2U7CisJCQkJCXJldHVybiBmZXRjaFJlc291cmNlKHJ1bnRpbWVQYXRoLCBmb2xkZXIubWVtYmVycygpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9DbGFzc3BhdGhNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NsYXNzcGF0aE1vZGVsLmphdmEKaW5kZXggYjg1N2JmMS4uNjJmOTVhOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NsYXNzcGF0aE1vZGVsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0NsYXNzcGF0aE1vZGVsLmphdmEKQEAgLTMxLDcgKzMxLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQ2xhc3NQYXRoU2VsZWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQ2xhc3NwYXRoRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWw7CkBAIC00MCw2ICszOSw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRWFyVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuTW9kdWxlU3RydWN0dXJhbE1vZGVsOwpAQCAtMTAzLDcgKzEwNCw3IEBACiAKIAlwcm90ZWN0ZWQgSVZpcnR1YWxDb21wb25lbnRbXSByZWZyZXNoQXZhaWxhYmxlRUFScygpIHsKIAkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdFtdIGVhclByb2plY3RzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhnZXRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpOworCQkJSVByb2plY3RbXSBlYXJQcm9qZWN0cyA9IEVhclV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKGdldENvbXBvbmVudCgpLmdldFByb2plY3QoKSk7CiAJCQlhdmFpbGFibGVFQVJDb21wb25lbnRzID0gQ29tcG9uZW50VXRpbGl0aWVzLmdldENvbXBvbmVudHMoZWFyUHJvamVjdHMpOwogCQkJaWYgKGF2YWlsYWJsZUVBUkNvbXBvbmVudHMgIT0gbnVsbCAmJiBhdmFpbGFibGVFQVJDb21wb25lbnRzLmxlbmd0aCA+IDApIHsKIAkJCQlBcnJheXMuc29ydChhdmFpbGFibGVFQVJDb21wb25lbnRzLCBjb21wYXJhdG9yKTsKQEAgLTE0NywxMyArMTQ4LDE3IEBACiAJfQogCiAJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlbGVjdGlvbihBcmNoaXZlTWFuaWZlc3QgZXhpc3RpbmcpIHsKLQkJCWlmICghSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGdldFByb2plY3QoKSkpIHsKKwkJCWlmICghSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoZ2V0UHJvamVjdCgpKSkgewogCQkJCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewogCQkJCQlpZihleGlzdGluZyAhPSBudWxsKXsKIAkJCQkJCW1hbmlmZXN0ID0gZXhpc3Rpbmc7CiAJCQkJCX0KIAkJCQl9Ci0JCQkJY3JlYXRlQ2xhc3NQYXRoU2VsZWN0aW9uKCk7CisJCQkJaWYoIGV4aXN0aW5nID09IG51bGwgKQorCQkJCQljcmVhdGVDbGFzc1BhdGhTZWxlY3Rpb24oKTsKKwkJCQllbHNleworCQkJCQljcmVhdGVDbGFzc1BhdGhTZWxlY3Rpb24obWFuaWZlc3QpOworCQkJCX0KIAkJCX0KIAl9CiAKQEAgLTE2Niw2ICsxNzEsMTcgQEAKIAkJCWNsYXNzUGF0aFNlbGVjdGlvbiA9IG51bGw7CiAJCX0KIAl9CisJCisJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ2xhc3NQYXRoU2VsZWN0aW9uKEFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdCkgeworCQlpZiAoZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCAmJiBzZWxlY3RlZEVBUkNvbXBvbmVudCAhPSBudWxsICkgeworCQkJY2xhc3NQYXRoU2VsZWN0aW9uID0gbmV3IENsYXNzUGF0aFNlbGVjdGlvbihnZXRDb21wb25lbnQoKSwgc2VsZWN0ZWRFQVJDb21wb25lbnQsIG1hbmlmZXN0KTsKKwkJfSBlbHNlIGlmIChzZWxlY3RlZEVBUkNvbXBvbmVudCA9PSBudWxsKSB7CisJCQljbGFzc1BhdGhTZWxlY3Rpb24gPSBuZXcgQ2xhc3NQYXRoU2VsZWN0aW9uKGdldENvbXBvbmVudCgpLCBtYW5pZmVzdCk7CisJCX0gZWxzZSB7CisJCQljbGFzc1BhdGhTZWxlY3Rpb24gPSBudWxsOworCQl9CisJfQorCQogCiAJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKIAl9CkBAIC0yOTYsOSArMzEyLDE3IEBACiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0KKwkJY2xhc3NQYXRoU2VsZWN0aW9uID0gbnVsbDsKIAkJZ2V0Q2xhc3NQYXRoU2VsZWN0aW9uKCk7IC8vIEVuc3VyZSB0aGUgc2VsZWN0aW9uIGlzIGluaXRpYWxpemVkLgogCQlmaXJlTm90aWZpY2F0aW9uKG5ldyBDbGFzc3BhdGhNb2RlbEV2ZW50KENsYXNzcGF0aE1vZGVsRXZlbnQuTUFOSUZFU1RfQ0hBTkdFRCkpOwogCX0KKwkKKwlwdWJsaWMgdm9pZCBmb3JjZVVwZGF0ZUNsYXNzcGF0aChBcmNoaXZlTWFuaWZlc3QgbmV3TWFuaWZlc3QpIHsKKwkJcHJpbVNldE1hbmlmZXN0KG5ld01hbmlmZXN0KTsKKwkJY2xhc3NQYXRoU2VsZWN0aW9uID0gbnVsbDsKKwkJaW5pdGlhbGl6ZVNlbGVjdGlvbihuZXdNYW5pZmVzdCk7CisJCWZpcmVOb3RpZmljYXRpb24obmV3IENsYXNzcGF0aE1vZGVsRXZlbnQoQ2xhc3NwYXRoTW9kZWxFdmVudC5NQU5JRkVTVF9DSEFOR0VEKSk7CQkKKwl9CQogCiAJcHVibGljIHZvaWQgc2VsZWN0RUFSKGludCBpbmRleCkgewogCQlzZWxlY3RlZEVBUkNvbXBvbmVudCA9IGF2YWlsYWJsZUVBUkNvbXBvbmVudHNbaW5kZXhdOwpAQCAtNDAyLDcgKzQyNiw3IEBACiAJCQkJcmVzb3VyY2VzLmFkZEFsbChzdHJ1Y3R1cmFsTW9kZWwuZ2V0UmVzb3VyY2VzKCkpOwogCQkJCXJldHVybiByZXNvdXJjZXM7CiAJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CQogCQkJfQogCQkJZmluYWxseSB7CkBAIC00MTAsOSArNDM0LDggQEAKIAkJCQkJc0VkaXQuZGlzcG9zZSgpOwogCQkJCX0KIAkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwogCQl9CisJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwogCX0KIAogCXB1YmxpYyBib29sZWFuIHNlbGVjdERlcGVuZGVuY3lJZk5lY2Vzc2FyeShJUHJvamVjdCByZWZlcmVuY2VkUHJvamVjdCkgewpAQCAtNTg1LDcgKzYwOCw3IEBACiAJCQlMaXN0IGphdmFQcm9qZWN0cyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEFsbEphdmFOb25GbGV4UHJvamVjdHMoKTsKIAkJCXBvc3NpYmxlV2ViTGlicy5hZGRBbGwoamF2YVByb2plY3RzKTsKIAkJfSBjYXRjaChDb3JlRXhjZXB0aW9uIGUpewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCQlJUHJvamVjdFtdIHV0aWxpdHlQcm9qZWN0cyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEFsbFByb2plY3RzSW5Xb3Jrc3BhY2VPZlR5cGUoSjJFRVByb2plY3RVdGlsaXRpZXMuVVRJTElUWSk7CiAJCXBvc3NpYmxlV2ViTGlicy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh1dGlsaXR5UHJvamVjdHMpKTsKQEAgLTYyNSw3ICs2NDgsNyBAQAogCQkJCUNsYXNzcGF0aEVsZW1lbnQgZWxlbWVudCA9IGNsYXNzUGF0aFdMUFNlbGVjdGlvbi5jcmVhdGVBcmNoaXZlRWxlbWVudChVUkkuY3JlYXRlVVJJKE1vZHVsZVVSSVV0aWwuZ2V0SGFuZGxlU3RyaW5nKHJlZmVyZW5jZWRDb21wb25lbnQpKSwgcmVmZXJlbmNlZENvbXBvbmVudC5nZXROYW1lKCksIGFyY2hpdmVVUkkubGFzdFNlZ21lbnQoKSk7CiAJCQkJY2xhc3NQYXRoV0xQU2VsZWN0aW9uLmFkZENsYXNzcGF0aEVsZW1lbnQoZWxlbWVudCwgdW5yZXNvbHZlZFVSSSk7CiAJCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKEoyRUVQbHVnaW4uUExVR0lOX0lEKS5sb2dFcnJvcihlKTsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJfQogCQl9CiAJCQpAQCAtNjM4LDcgKzY2MSw3IEBACiAJCQl0cnkgewogCQkJCXVucmVzb2x2ZWRVUkkgPSBNb2R1bGVVUklVdGlsLmdldEFyY2hpdmVOYW1lKGFyY2hpdmVVUkkpOwogCQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcihKMkVFUGx1Z2luLlBMVUdJTl9JRCkubG9nRXJyb3IoZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJCWlmICh1bnJlc29sdmVkVVJJICE9IG51bGwpIHsKIAkJCQlmaW5hbCBDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSBjbGFzc1BhdGhXTFBTZWxlY3Rpb24uY3JlYXRlQ2xhc3NwYXRoQXJjaGl2ZUVsZW1lbnQoYy5nZXRQcm9qZWN0KCksIGFyY2hpdmVVUkksIHVucmVzb2x2ZWRVUkkpOwpAQCAtNjQ5LDcgKzY3Miw3IEBACiAJCXRyeSB7CiAJCQljbGFzc1BhdGhXTFBTZWxlY3Rpb24uY3JlYXRlQ2xhc3NwYXRoRW50cnlFbGVtZW50cyhjb21wb25lbnQsIFdFQkxJQiwgV0VCSU5GX0NMQVNTRVMpOwogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKEoyRUVQbHVnaW4uUExVR0lOX0lEKS5sb2dFcnJvcihjZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGNlKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0oyRUVEZXBlbmRlbmN5TGlzdGVuZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFRGVwZW5kZW5jeUxpc3RlbmVyLmphdmEKaW5kZXggMzgzMDA0ZS4uNGY0NmIzOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0oyRUVEZXBlbmRlbmN5TGlzdGVuZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRURlcGVuZGVuY3lMaXN0ZW5lci5qYXZhCkBAIC0xLDkgKzEsOSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb247CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwpAQCAtMTEsMjggKzExLDQzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklNb2R1bGVFeHRlbnNpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSUoyRUVNb2R1bGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkVhclV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuYnVpbGRlci5JRGVwZW5kZW5jeUdyYXBoOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldUUE1vZHVsZXNSZXNvdXJjZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwogCiBwdWJsaWMgY2xhc3MgSjJFRURlcGVuZGVuY3lMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewogCiAJcHVibGljIHN0YXRpYyBKMkVFRGVwZW5kZW5jeUxpc3RlbmVyIElOU1RBTkNFID0gbmV3IEoyRUVEZXBlbmRlbmN5TGlzdGVuZXIoKTsKLQorCQorCXByaXZhdGUgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7CisJCisJcHJpdmF0ZSBsb25nIG1vZFN0YW1wID0gMDsKKwkKIAlwcml2YXRlIEoyRUVEZXBlbmRlbmN5TGlzdGVuZXIoKSB7CiAJfQogCisJcHVibGljIGxvbmcgZ2V0TW9kU3RhbXAoKXsKKwkJc3luY2hyb25pemVkIChsb2NrKSB7CisJCQlyZXR1cm4gbW9kU3RhbXA7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGluY3JlbWVudE1vZFN0YW1wKCl7CisJCXN5bmNocm9uaXplZCAobG9jayl7CisJCQltb2RTdGFtcCsrOworCQl9CisJfQorCQogCXByaXZhdGUgTGlzdDxJUHJvamVjdD4gY2FjaGVkRUFSTW9kdWxlRGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdDxJUHJvamVjdD4oKTsKIAogCXByaXZhdGUgdm9pZCBjYWNoZU1vZHVsZURlcGVuZGVuY2llcyhJUHJvamVjdCBlYXJQcm9qZWN0KSB7CkBAIC00OCwxOCArNjMsMjIgQEAKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCB1cGRhdGVNb2R1bGVEZXBlbmRlbmNpZXMoKSB7CisJLyoqCisJICogcmV0dXJucyB3aGV0aGVyIHRoZSBtb2RTdGFtcCBoYXMgYmVlbiB1cGRhdGVkCisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVNb2R1bGVEZXBlbmRlbmNpZXMoKSB7CiAJCWlmICghY2FjaGVkRUFSTW9kdWxlRGVwZW5kZW5jaWVzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvcjxJUHJvamVjdD4gaXRlcmF0b3IgPSBjYWNoZWRFQVJNb2R1bGVEZXBlbmRlbmNpZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUlEZXBlbmRlbmN5R3JhcGguSU5TVEFOQ0UudXBkYXRlKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQl9CisJCQlpbmNyZW1lbnRNb2RTdGFtcCgpOwogCQkJY2FjaGVkRUFSTW9kdWxlRGVwZW5kZW5jaWVzLmNsZWFyKCk7CisJCQlyZXR1cm4gdHJ1ZTsKIAkJfQorCQlyZXR1cm4gZmFsc2U7CiAJfQogCisJcHJpdmF0ZSBsb25nIG1vZFN0YW1wQXRSZXNvdXJjZUNoYW5nZWQgPSAwOwogCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewogCQl0cnkgewotCQkJSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS5wcmVVcGRhdGUoKTsKIAkJCXN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7CiAJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRToKIAkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURToKQEAgLTY5LDE2ICs4OCwxOSBAQAogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0U6CisJCQkJbW9kU3RhbXBBdFJlc291cmNlQ2hhbmdlZCA9IGdldE1vZFN0YW1wKCk7CiAJCQkJZXZlbnQuZ2V0RGVsdGEoKS5hY2NlcHQodGhpcyk7CiAJCQl9CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCUlEZXBlbmRlbmN5R3JhcGguSU5TVEFOQ0UucG9zdFVwZGF0ZSgpOwogCQl9CiAJfQogCiAJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYobW9kU3RhbXBBdFJlc291cmNlQ2hhbmdlZCAhPSBnZXRNb2RTdGFtcCgpKXsKKwkJCS8vYWxyZWFkeSBpbmNyZW1lbnRlZCB0aGUgbW9kaWZpY2F0aW9uIHN0YW1wLCBubyBuZWVkIHRvIGNvbnRpbnVlCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KIAkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKIAkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKIAkJY2FzZSBJUmVzb3VyY2UuUk9PVDoKQEAgLTEwOCw3ICsxMzAsOSBAQAogCQkJCQkvLyB0aGlzIHdpbGwgYWxzbyBwaWNrdXAgYm90aCBjbG9zZSBhbmQgb3BlbiBldmVudHMKIAkJCQkJLy8gaWYgdGhlIEVBUiBwcm9qZWN0IGlzIGNsb3NlZCwgdGhlIGNhY2hlZCBkZXBlbmRlbnQKIAkJCQkJLy8gbW9kdWxlcyB3aWxsIGFscmVhZHkKLQkJCQkJdXBkYXRlTW9kdWxlRGVwZW5kZW5jaWVzKCk7CisJCQkJCWlmKHVwZGF0ZU1vZHVsZURlcGVuZGVuY2llcygpKXsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQogCQkJCX0KIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KQEAgLTEyMSwzNSArMTQ1LDUyIEBACiAJCQlpZiAobmFtZS5lcXVhbHMoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9TSE9SVF9OQU1FKSkgewogCQkJCUlGaWxlIG1hbmlmZXN0RmlsZSA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldE1hbmlmZXN0RmlsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGZhbHNlKTsKIAkJCQlpZiAobnVsbCA9PSBtYW5pZmVzdEZpbGUgfHwgcmVzb3VyY2UuZXF1YWxzKG1hbmlmZXN0RmlsZSkpIHsKLQkJCQkJSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS51cGRhdGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBJRGVwZW5kZW5jeUdyYXBoLk1PRElGSUVEKTsKKwkJCQkJaW5jcmVtZW50TW9kU3RhbXAoKTsKIAkJCQl9CiAJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKFdUUE1vZHVsZXNSZXNvdXJjZUZhY3RvcnkuV1RQX01PRFVMRVNfU0hPUlRfTkFNRSkpIHsKIAkJCQlpZiAoRWFyVXRpbGl0aWVzLmlzRUFSUHJvamVjdChyZXNvdXJjZS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCS8vIHVuZm9ydHVuYXRlbHksIGluIHRoaXMgY2FzZSwgdGhlIG9ubHkgZWFzeSB3YXkgdG8gdXBkYXRlCi0JCQkJCS8vIGlzIHRvIGZvcmNlIHRoZSB1cGRhdGUgb2YgYWxsIHByb2plY3RzCi0JCQkJCUlQcm9qZWN0W10gYWxsUHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCQkJCWZvciAoSVByb2plY3Qgc291cmNlUHJvamVjdCA6IGFsbFByb2plY3RzKSB7Ci0JCQkJCQlJRGVwZW5kZW5jeUdyYXBoLklOU1RBTkNFLnVwZGF0ZShzb3VyY2VQcm9qZWN0LCBJRGVwZW5kZW5jeUdyYXBoLk1PRElGSUVEKTsKLQkJCQkJfQorCQkJCQlpbmNyZW1lbnRNb2RTdGFtcCgpOwogCQkJCX0KLQkJCX0gZWxzZSBpZiAoZW5kc1dpdGhJZ25vcmVDYXNlKG5hbWUsIElNb2R1bGVFeHRlbnNpb25zLkRPVF9KQVIpIHx8IGVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfV0FSKSB8fCBlbmRzV2l0aElnbm9yZUNhc2UobmFtZSwgSU1vZHVsZUV4dGVuc2lvbnMuRE9UX1JBUikpIHsKKwkJCX0gZWxzZSBpZiAoZW5kc1dpdGhJZ25vcmVDYXNlKG5hbWUsIElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQpIHx8IGVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCBJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUKSB8fCBlbmRzV2l0aElnbm9yZUNhc2UobmFtZSwgSUoyRUVNb2R1bGVDb25zdGFudHMuUkFSX0VYVCkpIHsKIAkJCQlpZiAoRWFyVXRpbGl0aWVzLmlzRUFSUHJvamVjdChyZXNvdXJjZS5nZXRQcm9qZWN0KCkpKSB7CiAJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChyZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQkJCQlpZiAoaXNGb2xkZXIocmVzb3VyY2UuZ2V0UGFyZW50KCksIGNvbXAuZ2V0Um9vdEZvbGRlcigpKSkgewotCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gY29tcC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJCQlmb3IgKElWaXJ0dWFsUmVmZXJlbmNlIHJlZiA6IHJlZnMpIHsKLQkJCQkJCQlJRGVwZW5kZW5jeUdyYXBoLklOU1RBTkNFLnVwZGF0ZShyZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKSwgSURlcGVuZGVuY3lHcmFwaC5NT0RJRklFRCk7Ci0JCQkJCQl9Ci0JCQkJCQlJRGVwZW5kZW5jeUdyYXBoLklOU1RBTkNFLnVwZGF0ZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIElEZXBlbmRlbmN5R3JhcGguTU9ESUZJRUQpOworCQkJCQlpZiAoaXNJblRyZWUoKElGaWxlKXJlc291cmNlLCBjb21wLmdldFJvb3RGb2xkZXIoKSkpIHsKKwkJCQkJCWluY3JlbWVudE1vZFN0YW1wKCk7CiAJCQkJCX0KLQogCQkJCX0KIAkJCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBmYWxzZTsKIAkJfQorCQlyZXR1cm4gZmFsc2U7CiAJfQogCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5UcmVlKElGaWxlIGZpbGUsIElWaXJ0dWFsRm9sZGVyIGZvbGRlcikgeworCQkvLyBJZiB3ZSBhcmUgdGhlIGZvbGRlciwgcmV0dXJuIHRydWUKKwkJaWYoIGlzRm9sZGVyKGZpbGUuZ2V0UGFyZW50KCksIGZvbGRlcikpCisJCQkJcmV0dXJuIHRydWU7CisJCQorCQkvLyBpZiByZXNvdXJjZSBpcyBhbnkgbGV2ZWwgdW5kZXIgY3VycmVudCBWRidzIHVuZGVybHlpbmcgZm9sZGVycywgcmV0dXJuIHRydWUgCisJCUlDb250YWluZXJbXSB1bmRlcmx5aW5nID0gZm9sZGVyLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7CisJCWZvciggaW50IGkgPSAwOyBpIDwgdW5kZXJseWluZy5sZW5ndGg7IGkrKyApIHsKKwkJCWlmKCB1bmRlcmx5aW5nW2ldLmdldEZ1bGxQYXRoKCkuaXNQcmVmaXhPZihmaWxlLmdldEZ1bGxQYXRoKCkpKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCQorCQkvLyBjb250aW51ZSB0byBwZXJ1c2UgaW4gY2FzZSB0aGVyZSdzIHNvbWUgb2RkIG1hcHBpbmcsIHN1Y2ggYXMgCisJCS8vIC9FYXJDb250ZW41IC0+IC9teS9zZWNyZXQvbG9jYXRpb24vd2hlcmV2ZXIvaXQvZ29lcworCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCXRyeSB7CisJCQlJVmlydHVhbFJlc291cmNlW10gY2hpbGRyZW4gPSBmb2xkZXIubWVtYmVycygpOworCQkJZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aCAmJiAhZm91bmQ7IGkrKyApIHsKKwkJCQlpZiggY2hpbGRyZW5baV0uZ2V0VHlwZSgpID09IElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSKSB7CisJCQkJCWZvdW5kIHw9IGlzSW5UcmVlKGZpbGUsIChJVmlydHVhbEZvbGRlciljaGlsZHJlbltpXSk7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoKCBDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGNlKTsKKwkJfQorCQlyZXR1cm4gZm91bmQ7CisJfQorCQogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmRzV2l0aElnbm9yZUNhc2UoU3RyaW5nIHN0ciwgU3RyaW5nIHNmeCkgewogCQlyZXR1cm4gSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZW5kc1dpdGhJZ25vcmVDYXNlKHN0ciwgc2Z4KTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0oyRUVQcmVmZXJlbmNlUHJvcGVydHlUZXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFUHJlZmVyZW5jZVByb3BlcnR5VGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5NzkyMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFUHJlZmVyZW5jZVByb3BlcnR5VGVzdGVyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBKMkVFUHJlZmVyZW5jZVByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIKKworeworCS8qKgorCSAqIFRlc3QgdG8gc2VlIGlmIHRoZSBAcGFyYW0gdmFsdWUgcHJlZmVyZW5jZSBpcyBzZXQgdG8gdHJ1ZSBpbiBAbGluayBKMkVFUHJlZmVyZW5jZXMgCisJICovCisJcHVibGljIGJvb2xlYW4gdGVzdCggZmluYWwgT2JqZWN0IHJlY2VpdmVyLCAKKwkJCQkJCWZpbmFsIFN0cmluZyBwcm9wZXJ0eSwgCisJCQkJCQlmaW5hbCBPYmplY3RbXSBhcmdzLCAKKwkJCQkJCWZpbmFsIE9iamVjdCB2YWx1ZSApCisJeworCQlyZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4oSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKHZhbHVlLnRvU3RyaW5nKCkpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFVmVyc2lvblV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9KMkVFVmVyc2lvblV0aWwuamF2YQppbmRleCAzNmRkZTRjLi4xODVlMjJjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vSjJFRVZlcnNpb25VdGlsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL0oyRUVWZXJzaW9uVXRpbC5qYXZhCkBAIC0xMCwyMSArMTAsMTYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqIENyZWF0ZWQgb24gTWFyIDIxLCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb247CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogCiAvKioKICAqIEBhdXRob3IgbmFncmF3YWwKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCiAgKi8KIHB1YmxpYyBjbGFzcyBKMkVFVmVyc2lvblV0aWwgewogCkBAIC00MSw2ICszNiw5IEBACiAJCQogCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlNFUlZMRVRfMl81OgogCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl81X1RFWFQ7CisJCQorCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlNFUlZMRVRfM18wOgorCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wX1RFWFQ7CiAJCX0KIAkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCiAKQEAgLTYzLDYgKzYxLDkgQEAKIAkJCiAJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzNfMF9JRDoKIAkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMF9URVhUOworCQkKKwkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18xX0lEOgorCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18xX1RFWFQ7CiAJCX0KIAkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtNzUsNiArNzYsOSBAQAogCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ6CiAJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzVfVEVYVDsKIAorCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzZfSUQ6CisJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzZfVEVYVDsKKwogCQl9CiAJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAogCX0KQEAgLTkzLDYgKzk3LDkgQEAKIAkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOgogCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQ7CiAKKwkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNl8wX0lEOgorCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNl8wX1RFWFQ7CisKIAkJfQogCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAogCX0KQEAgLTEwNiw2ICsxMTMsOCBAQAogCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwogCQlpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVCkpCiAJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKKwkJaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNl8wX1RFWFQpKQorCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ7CiAJCS8vIGRlZmF1bHQKIAkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7CiAJfQpAQCAtMTE5LDYgKzEyOCw4IEBACiAJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7CiAJCWlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMF9URVhUKSkKIAkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOworCQlpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzFfVEVYVCkpCisJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKIAkJLy8gZGVmYXVsdAogCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKIAl9CkBAIC0xMzIsMTcgKzE0MywyNSBAQAogCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwogCQlpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzVfVEVYVCkpCiAJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKKwkJaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wX1RFWFQpKQorCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ7CiAJCS8vIGRlZmF1bHQKIAkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwogCX0KKwkKKwlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0V2ViRnJhZ21lbnRWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKFN0cmluZyB2ZXJzaW9uKSB7CisJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNl8wX0lEOworCX0KIAogCXB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRDb25uZWN0b3JWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKFN0cmluZyB2ZXJzaW9uKSB7CiAJCWlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMF9URVhUKSkKIAkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKIAkJaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV81X1RFWFQpKQogCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOworCQlpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzZfVEVYVCkpCisJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDsKIAkJLy8gZGVmYXVsdAotCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ7CisJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNl8wX0lEOwogCX0KIAogCXB1YmxpYyBzdGF0aWMgaW50IGNvbnZlcnRKMkVFVmVyc2lvbklEVG9FSkJWZXJzaW9uSUQoaW50IGoyZWVWZXJzaW9uSWQpIHsKQEAgLTE1NSw5ICsxNzQsMTEgQEAKIAkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzJfMV9JRDsKIAkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDoKIAkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzNfMF9JRDsKKwkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzZfMF9JRDoKKwkJCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzNfMV9JRDsKIAkJfQogCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfM18wX0lEOworCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzNfMV9JRDsKIAl9CiAKIAlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0SjJFRVZlcnNpb25JRFRvV2ViVmVyc2lvbklEKGludCBqMmVlVmVyc2lvbklkKSB7CkBAIC0xNzAsOSArMTkxLDExIEBACiAJCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQ7CiAJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ6CiAJCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzVfSUQ7CisJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQ6CisJCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8zXzBfSUQ7CiAJCX0KIAkJLy8gZGVmYXVsdAotCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNV9JRDsKKwkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8zXzBfSUQ7CiAJfQogCiAJcHVibGljIHN0YXRpYyBpbnQgY29udmVydEoyRUVWZXJzaW9uSURUb0Nvbm5lY3RvclZlcnNpb25JRChpbnQgajJlZVZlcnNpb25JZCkgewpAQCAtMTgwLDIzICsyMDMsMjYgQEAKIAkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ6CiAJCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzBfSUQ7CiAJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOgorCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOgogCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEOworCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNl8wX0lEOgorCQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV82X0lEOwogCQl9CiAJCS8vIGRlZmF1bHQKLQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQ7CisJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV82X0lEOwogCX0KIAkKIAlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXApIHsKIAkJU3RyaW5nIHZlcnNpb24gPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFZlcnNpb24oY29tcC5nZXRQcm9qZWN0KCkpOwotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpCisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKQogCQkJcmV0dXJuIGNvbnZlcnRXZWJWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHZlcnNpb24pOwotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KGNvbXAuZ2V0UHJvamVjdCgpKSkKKwkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KGNvbXAuZ2V0UHJvamVjdCgpKSkKIAkJCXJldHVybiBjb252ZXJ0RUpCVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJzaW9uKTsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpCisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpCiAJCQlyZXR1cm4gY29udmVydFZlcnNpb25TdHJpbmdUb0ludCh2ZXJzaW9uKTsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpCisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpCiAJCQlyZXR1cm4gY29udmVydENvbm5lY3RvclZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyc2lvbik7Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChjb21wLmdldFByb2plY3QoKSkpCisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KGNvbXAuZ2V0UHJvamVjdCgpKSkKIAkJCXJldHVybiBjb252ZXJ0QXBwQ2xpZW50VmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJzaW9uKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMjA0LDUxICsyMzAsNTYgQEAKIAlwdWJsaWMgc3RhdGljIGludCBjb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KFN0cmluZyB2ZXJzaW9uKSB7CiAJCWludCBuVmVyc2lvbiA9IDA7CiAJCQotCQlpZiggdmVyc2lvbi5lbmRzV2l0aCgiIikpeyAvLyROT04tTkxTLTEkCi0JCQluVmVyc2lvbiA9IDA7Ci0JCX0KLQkJCi0JCWlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMF9URVhUKSkKKwkJaWYgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8wX1RFWFQuZXF1YWxzKHZlcnNpb24pKQogCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMDsKIAkJCi0JCWVsc2UgaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8xX1RFWFQpKQorCQllbHNlIGlmIChKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMV9URVhULmVxdWFscyh2ZXJzaW9uKSkKIAkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzE7CiAJCQotCQllbHNlIGlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMl9URVhUKSkKKwkJZWxzZSBpZiAoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzJfVEVYVC5lcXVhbHModmVyc2lvbikpCiAJCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yOwogCQkKLQkJZWxzZSBpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzNfVEVYVCkpCisJCWVsc2UgaWYgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zX1RFWFQuZXF1YWxzKHZlcnNpb24pKQogCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMzsJCiAJCQotCQllbHNlIGlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNF9URVhUKSkKKwkJZWxzZSBpZiAoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzRfVEVYVC5lcXVhbHModmVyc2lvbikpCiAJCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80OwogCQkKLQkJZWxzZSBpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzVfVEVYVCkpCisJCWVsc2UgaWYgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV81X1RFWFQuZXF1YWxzKHZlcnNpb24pKQogCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNTsKIAkJCi0JCWVsc2UgaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8wX1RFWFQpKQorCQllbHNlIGlmIChKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNl9URVhULmVxdWFscyh2ZXJzaW9uKSkKKwkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzY7CisJCQorCQllbHNlIGlmIChKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMF9URVhULmVxdWFscyh2ZXJzaW9uKSkKIAkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzA7CiAJCQotCQllbHNlIGlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMV9URVhUKSkKKwkJZWxzZSBpZiAoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzFfVEVYVC5lcXVhbHModmVyc2lvbikpCiAJCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8xOwkKIAkJCi0JCWVsc2UgaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8yX1RFWFQpKQorCQllbHNlIGlmIChKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMl9URVhULmVxdWFscyh2ZXJzaW9uKSkKIAkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzI7CiAJCQotCQllbHNlIGlmICh2ZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfM19URVhUKSkKKwkJZWxzZSBpZiAoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzNfVEVYVC5lcXVhbHModmVyc2lvbikpCiAJCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8zOwogCQkKLQkJZWxzZSBpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzRfVEVYVCkpCisJCWVsc2UgaWYgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl80X1RFWFQuZXF1YWxzKHZlcnNpb24pKQogCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNDsKIAkJCi0JCWVsc2UgaWYgKHZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl81X1RFWFQpKQotCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNTsJCQotCQkKLQkJZWxzZSBpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVCkpCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wOwkJCisJCWVsc2UgaWYgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl81X1RFWFQuZXF1YWxzKHZlcnNpb24pKQorCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNTsJCiAKLQkJZWxzZSBpZiAodmVyc2lvbi5lcXVhbHMoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzBfVEVYVCkpCi0JCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wOwkJCisJCWVsc2UgaWYgKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wX1RFWFQuZXF1YWxzKHZlcnNpb24pKQorCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMDsJCQkKKworCQllbHNlIGlmIChKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMV9URVhULmVxdWFscyh2ZXJzaW9uKSkKKwkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzE7CQorCQkKKwkJZWxzZSBpZiAoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVC5lcXVhbHModmVyc2lvbikpCisJCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wOwkJCQorCQkKKwkJZWxzZSBpZiAoSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl82XzBfVEVYVC5lcXVhbHModmVyc2lvbikpCisJCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNl8wOwkKIAogCQlyZXR1cm4gblZlcnNpb247CiAJfQpAQCAtMjczLDYgKzMwNCw5IEBACiAJCWVsc2UgaWYgKHZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzUpCiAJCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV81X1RFWFQ7CiAJCQorCQllbHNlIGlmICh2ZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV82KQorCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNl9URVhUOworCQkKIAkJZWxzZSBpZiAodmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfMCkKIAkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8yXzBfVEVYVDsKIAkJCkBAIC0yOTIsMTAgKzMyNiwxNiBAQAogCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNV9URVhUOwkJCiAKIAkJZWxzZSBpZiAodmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMCkKLQkJCW5WZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8zXzBfVEVYVDsJCisJCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wX1RFWFQ7CQkKKworCQllbHNlIGlmICh2ZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18xKQorCQkJblZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMV9URVhUOwkKIAkJCiAJCWVsc2UgaWYgKHZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzApCiAJCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQ7CQkKKwkJCisJCWVsc2UgaWYgKHZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl82XzApCisJCQluVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNl8wX1RFWFQ7CQogCQogCQlyZXR1cm4gblZlcnNpb247CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL1VwZGF0ZVByb2plY3RDbGFzc3BhdGguamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9VcGRhdGVQcm9qZWN0Q2xhc3NwYXRoLmphdmEKaW5kZXggZDAwMDNhYy4uMzFkYTFjNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL1VwZGF0ZVByb2plY3RDbGFzc3BhdGguamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vVXBkYXRlUHJvamVjdENsYXNzcGF0aC5qYXZhCkBAIC0yMywxNCArMjMsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5DbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogCi0KLS8qKgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwogcHVibGljIGNsYXNzIFVwZGF0ZVByb2plY3RDbGFzc3BhdGggewogCQogIApAQCAtNTAsNyArNDQsNyBAQAogICAgICAgICBJUGF0aCBuZXdPdXRwdXRQYXRoID0gbnVsbDsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKIAkJCWNsYXNzcGF0aFtpXSA9IChJQ2xhc3NwYXRoRW50cnkpIGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgbmV3T3V0cHV0UGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKFBhdGguU0VQQVJBVE9SICtqUHJvamVjdC5nZXROYW1lKCkgKyAiL2Jpbi8iKTsKKyAgICAgICAgICAgIG5ld091dHB1dFBhdGggPSBQYXRoLmZyb21PU1N0cmluZyhQYXRoLlNFUEFSQVRPUiAralByb2plY3QuZ2V0TmFtZSgpICsgIi9iaW4vIik7IC8vJE5PTi1OTFMtMSQKICAgICAgICAgICAgICgoQ2xhc3NwYXRoRW50cnkpY2xhc3NwYXRoW2ldKS5zcGVjaWZpY091dHB1dExvY2F0aW9uID0gbmV3T3V0cHV0UGF0aDsKIAkJfQogCQlyZXR1cm4gY2xhc3NwYXRoOwkJCkBAIC04NCw3ICs3OCw3IEBACiAJCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoY2xhc3NwYXRoRW50cmllcywgbnVsbCk7CiAJCX0KIAkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9KMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIuamF2YQppbmRleCBiNGZlNTFkLi44MDNlODc0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIuamF2YQpAQCAtMTAsMTcgKzEwLDI2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aDsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBY2Nlc3NSdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKQEAgLTMwLDE5ICszOSwyMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGguQ2xhc3NwYXRoRGVjb3JhdGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuY2xhc3NwYXRoLkNsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5qYXZhbGl0ZS5JSmF2YVByb2plY3RMaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlLkphdmFDb3JlTGl0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNsYXNzcGF0aExpYnJhcnlFeHBhbmRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRUNvbW1vbk1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRWFyVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLklEZXBlbmRlbmN5R3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXRGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXRSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7CiAKQEAgLTYwLDQ3ICs3MSwxMTAgQEAKIAlwcml2YXRlIHN0YXRpYyBJUGF0aCBXRUJMSUIgPSBuZXcgUGF0aCgiL1dFQi1JTkYvbGliIik7IC8vJE5PTi1OTFMtMSQKIAkKIAlwcml2YXRlIHN0YXRpYyBDbGFzc3BhdGhEZWNvcmF0aW9uc01hbmFnZXIgZGVjb3JhdGlvbnNNYW5hZ2VyID0gbmV3IENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlcihKMkVFUGx1Z2luLlBMVUdJTl9JRCk7Ci0KIAlwdWJsaWMgc3RhdGljIENsYXNzcGF0aERlY29yYXRpb25zTWFuYWdlciBnZXREZWNvcmF0aW9uc01hbmFnZXIoKSB7CiAgICAgICAgIHJldHVybiBkZWNvcmF0aW9uc01hbmFnZXI7CiAgICAgfQogCQorCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gb25seU1hbmlmZXN0UmVmcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCXN0YXRpYyB7CisJCW9ubHlNYW5pZmVzdFJlZnMucHV0KElWaXJ0dWFsQ29tcG9uZW50LlJFUVVFU1RFRF9SRUZFUkVOQ0VfVFlQRSwgSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQuT05MWV9NQU5JRkVTVF9SRUZFUkVOQ0VTKTsKKwl9CisJCiAJcHJpdmF0ZSBJUGF0aCBjb250YWluZXJQYXRoOwogCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OworCXByaXZhdGUgSUphdmFQcm9qZWN0TGl0ZSBqYXZhUHJvamVjdExpdGU7CiAJcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gbmV3IElDbGFzc3BhdGhFbnRyeVswXTsKLQlwcml2YXRlIGJvb2xlYW4gZXhwb3J0RW50cmllcyA9IHRydWU7IC8vdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gYWx3YXlzIGV4cG9ydCB0aGVzZSBkZXBlbmRlbmNpZXMKLQlwcml2YXRlIHN0YXRpYyBNYXAga2V5cyA9IG5ldyBIYXNodGFibGUoKTsKKwlwcml2YXRlIHN0YXRpYyBNYXA8SW50ZWdlciwgSW50ZWdlcj4ga2V5cyA9IG5ldyBIYXNodGFibGU8SW50ZWdlciwgSW50ZWdlcj4oKTsKIAlwcml2YXRlIHN0YXRpYyBpbnQgTUFYX1JFVFJJRVMgPSAxMDsKLQlwcml2YXRlIHN0YXRpYyBNYXAgcmV0cmllcyA9IG5ldyBIYXNodGFibGUoKTsKKwlwcml2YXRlIHN0YXRpYyBNYXA8SW50ZWdlciwgSW50ZWdlcj5yZXRyaWVzID0gbmV3IEhhc2h0YWJsZTxJbnRlZ2VyLCBJbnRlZ2VyPigpOwogCQotCXByaXZhdGUgY2xhc3MgTGFzdFVwZGF0ZSB7CisJc3RhdGljIGNsYXNzIExhc3RVcGRhdGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGV7CisJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM2MjQ5ODgyMDc2MzE4MTI2NUw7CisJCXByaXZhdGUgYm9vbGVhbiBleHBvcnRFbnRyaWVzID0gdHJ1ZTsgLy90aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBhbHdheXMgZXhwb3J0IHRoZXNlIGRlcGVuZGVuY2llcwogCQlwcml2YXRlIGludCBiYXNlUmVmQ291bnQgPSAwOyAvLyBjb3VudCBvZiByZWZlcmVuY2VzIHJldHVybmVkIGRpcmVjdGx5IGZyb20gYSBjb21wb25lbnQKKwkJcHJpdmF0ZSBpbnQgYmFzZUxpYlJlZkNvdW50ID0gMDsgLy8gY291bnQgb2YgcmVmZXJlbmNlcyByZXNvbHZlZCBieSBFQVIgNSBsaWIgZGlyZWN0b3J5CiAJCXByaXZhdGUgaW50IHJlZkNvdW50ID0gMDsKIAkJcHJpdmF0ZSBib29sZWFuW10gaXNCaW5hcnkgPSBuZXcgYm9vbGVhbltyZWZDb3VudF07Ci0JCXByaXZhdGUgSVBhdGhbXSBwYXRocyA9IG5ldyBJUGF0aFtyZWZDb3VudF07CisJCXRyYW5zaWVudCBwcml2YXRlIElQYXRoW10gcGF0aHMgPSBuZXcgSVBhdGhbcmVmQ291bnRdOworCQl0cmFuc2llbnQgYm9vbGVhbiBuZWVkVG9WZXJpZnkgPSB0cnVlOworCQkvL29ubHkgdXNlZCBmb3Igc2VyaWFsaXphdGlvbgorCQlwcml2YXRlIFN0cmluZyBbXSBwYXRoU3RyaW5ncyA9IG51bGw7CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworCQkJaWYodGhpcyA9PSBvKXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSBpZihvID09IG51bGwpeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIExhc3RVcGRhdGUpeworCQkJCUxhc3RVcGRhdGUgb3RoZXIgPSAoTGFzdFVwZGF0ZSlvOworCQkJCWlmKHRoaXMuZXhwb3J0RW50cmllcyAhPSBvdGhlci5leHBvcnRFbnRyaWVzKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0gZWxzZSBpZih0aGlzLmJhc2VSZWZDb3VudCAhPSBvdGhlci5iYXNlUmVmQ291bnQpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfSBlbHNlIGlmKHRoaXMuYmFzZUxpYlJlZkNvdW50ICE9IG90aGVyLmJhc2VMaWJSZWZDb3VudCl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9IGVsc2UgaWYodGhpcy5yZWZDb3VudCAhPSBvdGhlci5yZWZDb3VudCl7CisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQl9IGVsc2UgaWYodGhpcy5pc0JpbmFyeS5sZW5ndGggIT0gb3RoZXIuaXNCaW5hcnkubGVuZ3RoKXsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0gZWxzZSBpZih0aGlzLnBhdGhzLmxlbmd0aCAhPSBvdGhlci5wYXRocy5sZW5ndGgpeworCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJfQorCQkJCWZvcihpbnQgaT0wOyBpPGlzQmluYXJ5Lmxlbmd0aDsgaSsrKXsKKwkJCQkJaWYodGhpcy5pc0JpbmFyeVtpXSAhPSBvdGhlci5pc0JpbmFyeVtpXSl7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0KKwkJCQl9CisJCQkJZm9yKGludCBpPTA7IGk8cGF0aHMubGVuZ3RoOyBpKyspeworCQkJCQlpZih0aGlzLnBhdGhzW2ldID09IG51bGwgJiYgb3RoZXIucGF0aHNbaV0gIT0gbnVsbCl7CisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCX0gZWxzZSBpZighdGhpcy5wYXRoc1tpXS5lcXVhbHMob3RoZXIucGF0aHNbaV0pKXsKKwkJCQkJCXJldHVybiBmYWxzZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQkJcmV0dXJuIDMgKiBiYXNlUmVmQ291bnQgKyA1ICogYmFzZUxpYlJlZkNvdW50ICsgNyAqIHJlZkNvdW50ICsgMTEgKiBpc0JpbmFyeS5sZW5ndGg7CisJCX0KIAkJCi0JCXByaXZhdGUgaW50IGJhc2VMaWJSZWZDb3VudCA9IDA7IC8vIGNvdW50IG9mIHJlZmVyZW5jZXMgcmVzb2x2ZWQgYnkgRUFSIDUgbGliIGRpcmVjdG9yeQorCQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJcGF0aFN0cmluZ3MgPSBuZXcgU3RyaW5nW3JlZkNvdW50XTsKKwkJCWZvcihpbnQgaT0wO2k8cGF0aHMubGVuZ3RoOyBpKyspeworCQkJCWlmKHBhdGhzW2ldICE9IG51bGwpeworCQkJCQlwYXRoU3RyaW5nc1tpXSA9IHBhdGhzW2ldLnRvU3RyaW5nKCk7CisJCQkJfQorCQkJfQorCQkJb3V0LmRlZmF1bHRXcml0ZU9iamVjdCgpOworCQl9CisJCQorCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb257CisJCQlpbi5kZWZhdWx0UmVhZE9iamVjdCgpOworCQkJbmVlZFRvVmVyaWZ5ID0gdHJ1ZTsKKwkJCXBhdGhzID0gbmV3IElQYXRoW3JlZkNvdW50XTsKKwkJCWZvcihpbnQgaT0wO2k8cGF0aFN0cmluZ3MubGVuZ3RoOyBpKyspeworCQkJCWlmKHBhdGhTdHJpbmdzW2ldICE9IG51bGwpeworCQkJCQlwYXRoc1tpXSA9IG5ldyBQYXRoKHBhdGhTdHJpbmdzW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KIAkJCiAJCXByaXZhdGUgYm9vbGVhbiBhcmVTYW1lKElWaXJ0dWFsQ29tcG9uZW50IGNvbXAsIGludCBpKXsKIAkJCWlmIChjb21wLmlzQmluYXJ5KCkgIT0gaXNCaW5hcnlbaV0pIHsKIAkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCUlQYXRoIHBhdGggPSBudWxsOwotCQkJCWlmIChjb21wLmlzQmluYXJ5KCkpIHsKLQkJCQkJVmlydHVhbEFyY2hpdmVDb21wb25lbnQgYXJjaGl2ZUNvbXAgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIGNvbXA7Ci0JCQkJCWphdmEuaW8uRmlsZSBkaXNrRmlsZSA9IGFyY2hpdmVDb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQkJCQlpZiAoZGlza0ZpbGUuZXhpc3RzKCkpCi0JCQkJCQlwYXRoID0gbmV3IFBhdGgoZGlza0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQllbHNlIHsKLQkJCQkJCUlGaWxlIGlGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCQkJCXBhdGggPSBpRmlsZS5nZXRGdWxsUGF0aCgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGF0aCA9IGNvbXAuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCk7Ci0JCQkJfQotCQkJCWlmICghcGF0aC5lcXVhbHMocGF0aHNbaV0pKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9CisJCQl9IAorCQkJSVBhdGggcGF0aCA9IG51bGw7CisJCQlpZiAoY29tcC5pc0JpbmFyeSgpKQorCQkJCXBhdGggPSAoSVBhdGgpY29tcC5nZXRBZGFwdGVyKElQYXRoLmNsYXNzKTsKKwkJCWVsc2UKKwkJCQlwYXRoID0gY29tcC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKKwkJCWlmICghcGF0aC5lcXVhbHMocGF0aHNbaV0pKSB7CisJCQkJcmV0dXJuIGZhbHNlOwogCQkJfQogCQkJcmV0dXJuIHRydWU7CiAJCX0KQEAgLTExMSwxNSArMTg1LDE2IEBACiAJcHVibGljIEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIoSVBhdGggcGF0aCwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7CiAJCXRoaXMuY29udGFpbmVyUGF0aCA9IHBhdGg7CiAJCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKKwkJdGhpcy5qYXZhUHJvamVjdExpdGUgPSBKYXZhQ29yZUxpdGUuY3JlYXRlKGphdmFQcm9qZWN0KTsKIAl9Ci0KKwkKIAlwcml2YXRlIGJvb2xlYW4gcmVxdWlyZXNVcGRhdGUoKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7CisJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGphdmFQcm9qZWN0TGl0ZS5nZXRQcm9qZWN0KCkpOwogCQlpZiAoY29tcG9uZW50ID09IG51bGwpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQkKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gY29tcG9uZW50IGluc3RhbmNlb2YgSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQgPyAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0UmVmZXJlbmNlcyhmYWxzZSwgdHJ1ZSk6IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7CisKKwkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZXMob25seU1hbmlmZXN0UmVmcyk7IAogCQkKIAkJLy8gYXZvaWQgdXBkYXRpbmcgdGhlIGNvbnRhaW5lciBpZiByZWZlcmVuY2VzIGhhdmVuJ3QgY2hhbmdlZAogCQlpZiAocmVmcy5sZW5ndGggPT0gbGFzdFVwZGF0ZS5iYXNlUmVmQ291bnQpIHsKQEAgLTEzMyw1NCArMjA4LDY5IEBACiAJCQlMaXN0IDxJVmlydHVhbFJlZmVyZW5jZT4gZWFyUmVmcyA9IGdldEJhc2VFQVJMaWJSZWZzKGNvbXBvbmVudCk7CiAJCQlpZihlYXJSZWZzLnNpemUoKSAhPSBsYXN0VXBkYXRlLmJhc2VMaWJSZWZDb3VudCl7CiAJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCUxpc3QgcmVmc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJU2V0IHJlZmVkQ29tcHMgPSBuZXcgSGFzaFNldCgpOwotCQkJCXJlZmVkQ29tcHMuYWRkKGNvbXBvbmVudCk7Ci0JCQkJZm9yKGludCBpID0gMDsgaTxyZWZzLmxlbmd0aDtpKyspewotCQkJCQlyZWZzTGlzdC5hZGQocmVmc1tpXSk7Ci0JCQkJCXJlZmVkQ29tcHMuYWRkKHJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKLQkJCQl9Ci0JCQkJaW50IGk9bGFzdFVwZGF0ZS5iYXNlUmVmQ291bnQ7Ci0JCQkJZm9yKElWaXJ0dWFsUmVmZXJlbmNlIGVhclJlZiA6IGVhclJlZnMpewotCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gZWFyUmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJLy8gY2hlY2sgaWYgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50IGlzIGFscmVhZHkgdmlzaXRlZCAtIGF2b2lkIGN5Y2xlcyBpbiB0aGUgYnVpbGQgcGF0aAotCQkJCQlpZiAoIXJlZmVkQ29tcHMuY29udGFpbnMoY29tcCkpIHsKLQkJCQkJCWlmKGkgPT0gbGFzdFVwZGF0ZS5yZWZDb3VudCl7Ci0JCQkJCQkJcmV0dXJuIHRydWU7IC8vIGZvdW5kIHNvbWV0aGluZyBuZXcgYW5kIG5lZWQgdXBkYXRlCi0JCQkJCQl9Ci0JCQkJCQkvLyB2aXNpdCB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnQKLQkJCQkJCXJlZnNMaXN0LmFkZChlYXJSZWYpOwotCQkJCQkJcmVmZWRDb21wcy5hZGQoY29tcCk7Ci0JCQkJCQlpZighbGFzdFVwZGF0ZS5hcmVTYW1lKGNvbXAsIGkpKXsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWkrKzsKKwkJCX0gCisJCQlMaXN0IDxJVmlydHVhbFJlZmVyZW5jZT4gcmVmc0xpc3QgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPigpOworCQkJU2V0IDxJVmlydHVhbENvbXBvbmVudD4gcmVmZWRDb21wcyA9IG5ldyBIYXNoU2V0PElWaXJ0dWFsQ29tcG9uZW50PigpOworCQkJcmVmZWRDb21wcy5hZGQoY29tcG9uZW50KTsKKwkJCWZvcihpbnQgaSA9IDA7IGk8cmVmcy5sZW5ndGg7aSsrKXsKKwkJCQlyZWZzTGlzdC5hZGQocmVmc1tpXSk7CisJCQkJcmVmZWRDb21wcy5hZGQocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOworCQkJfQorCQkJaW50IGk9bGFzdFVwZGF0ZS5iYXNlUmVmQ291bnQ7CisJCQlmb3IoSVZpcnR1YWxSZWZlcmVuY2UgZWFyUmVmIDogZWFyUmVmcyl7CisJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IGVhclJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CisJCQkJLy8gY2hlY2sgaWYgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50IGlzIGFscmVhZHkgdmlzaXRlZCAtIGF2b2lkIGN5Y2xlcyBpbiB0aGUgYnVpbGQgcGF0aAorCQkJCWlmICghcmVmZWRDb21wcy5jb250YWlucyhjb21wKSkgeworCQkJCQlpZihpID09IGxhc3RVcGRhdGUucmVmQ291bnQpeworCQkJCQkJcmV0dXJuIHRydWU7IC8vIGZvdW5kIHNvbWV0aGluZyBuZXcgYW5kIG5lZWQgdXBkYXRlCiAJCQkJCX0KKwkJCQkJLy8gdmlzaXQgdGhlIHJlZmVyZW5jZWQgY29tcG9uZW50CisJCQkJCXJlZnNMaXN0LmFkZChlYXJSZWYpOworCQkJCQlyZWZlZENvbXBzLmFkZChjb21wKTsKKwkJCQkJaWYoIWxhc3RVcGRhdGUuYXJlU2FtZShjb21wLCBpKSl7CisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQkJfQorCQkJCQlpKys7CiAJCQkJfQotCQkJCWlmKGkhPSBsYXN0VXBkYXRlLnJlZkNvdW50KXsKLQkJCQkJcmV0dXJuIHRydWU7IC8vIGRpZG4ndCBmaW5kIHRoZW0gYWxsCi0JCQkJfQorCQkJfQorCQkJaWYoaSE9IGxhc3RVcGRhdGUucmVmQ291bnQpeworCQkJCXJldHVybiB0cnVlOyAvLyBkaWRuJ3QgZmluZCB0aGVtIGFsbAogCQkJfQogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCXJldHVybiB0cnVlOwogCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGUoKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGphdmFQcm9qZWN0LmdldFByb2plY3QoKSk7CisJCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZShMYXN0VXBkYXRlIHJlc3RvcmVTdGF0ZSkgeworCQlpZihyZXN0b3JlU3RhdGUgIT0gbnVsbCl7IC8vIHBlcmZvcm1hbmNlOyByZXN0b3JlIHN0YXRlIGZyb20gbGFzdCBzZXNzaW9uCisJCQlsYXN0VXBkYXRlID0gcmVzdG9yZVN0YXRlOworCQkJTGlzdCA8SUNsYXNzcGF0aEVudHJ5PmVudHJpZXNMaXN0ID0gbmV3IEFycmF5TGlzdDxJQ2xhc3NwYXRoRW50cnk+KCk7CisJCQlmb3IoaW50IGk9MDsgaTxsYXN0VXBkYXRlLnBhdGhzLmxlbmd0aDsgaSsrKXsKKwkJCQlpZihsYXN0VXBkYXRlLnBhdGhzW2ldICE9IG51bGwpeworCQkJCQlJQ2xhc3NwYXRoRW50cnkgbmV3RW50cnkgPSBjcmVhdGVFbnRyeShyZXN0b3JlU3RhdGUsIGkpOworCQkJCQllbnRyaWVzTGlzdC5hZGQobmV3RW50cnkpOworCQkJCX0KKwkJCX0KKwkJCWVudHJpZXMgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2VudHJpZXNMaXN0LnNpemUoKV07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKKwkJCQllbnRyaWVzW2ldID0gZW50cmllc0xpc3QuZ2V0KGkpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCQorCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChqYXZhUHJvamVjdExpdGUuZ2V0UHJvamVjdCgpKTsKIAkJaWYgKGNvbXBvbmVudCA9PSBudWxsKSB7CiAJCQlyZXR1cm47CiAJCX0gCi0JCU9iamVjdCBrZXkgPSBudWxsOwotCQlpZighamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZpbGUoU3RydWN0dXJlRWRpdC5NT0RVTEVfTUVUQV9GSUxFX05BTUUpLmV4aXN0cygpKXsKLQkJCUludGVnZXIgaGFzaENvZGUgPSBuZXcgSW50ZWdlcihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuaGFzaENvZGUoKSk7CisJCUludGVnZXIga2V5ID0gbnVsbDsKKwkJaWYoIWphdmFQcm9qZWN0TGl0ZS5nZXRQcm9qZWN0KCkuZ2V0RmlsZShTdHJ1Y3R1cmVFZGl0Lk1PRFVMRV9NRVRBX0ZJTEVfTkFNRSkuZXhpc3RzKCkpeworCQkJSW50ZWdlciBoYXNoQ29kZSA9IG5ldyBJbnRlZ2VyKGphdmFQcm9qZWN0TGl0ZS5nZXRQcm9qZWN0KCkuaGFzaENvZGUoKSk7CiAJCQlrZXkgPSBrZXlzLmdldChoYXNoQ29kZSk7CiAJCQlpZihrZXkgPT0gbnVsbCl7CiAJCQkJa2V5cy5wdXQoaGFzaENvZGUsIGhhc2hDb2RlKTsKIAkJCQlrZXkgPSBoYXNoQ29kZTsKIAkJCX0KLQkJCUludGVnZXIgcmV0cnlDb3VudCA9IChJbnRlZ2VyKXJldHJpZXMuZ2V0KGtleSk7CisJCQlJbnRlZ2VyIHJldHJ5Q291bnQgPSByZXRyaWVzLmdldChrZXkpOwogCQkJaWYocmV0cnlDb3VudCA9PSBudWxsKXsKIAkJCQlyZXRyeUNvdW50ID0gbmV3IEludGVnZXIoMSk7CiAJCQl9IGVsc2UgaWYocmV0cnlDb3VudC5pbnRWYWx1ZSgpID4gTUFYX1JFVFJJRVMpewpAQCAtMTg5LDI5ICsyNzksMjMgQEAKIAkJCQlyZXRyeUNvdW50ID0gbmV3IEludGVnZXIocmV0cnlDb3VudC5pbnRWYWx1ZSgpICsgMSk7CiAJCQl9CiAJCQlyZXRyaWVzLnB1dChrZXksIHJldHJ5Q291bnQpOwotCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5xdWV1ZVVwZGF0ZShqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOworCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5xdWV1ZVVwZGF0ZShqYXZhUHJvamVjdExpdGUuZ2V0UHJvamVjdCgpKTsKIAkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCWlmKGtleSAhPSBudWxsKXsKLQkJCQlyZXRyaWVzLnJlbW92ZShrZXkpOwotCQkJCWtleXMucmVtb3ZlKGtleSk7CisJCX0KKwkJCisJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKG9ubHlNYW5pZmVzdFJlZnMpOyAKKwkJCisJCUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHJlZnNMaXN0ID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4oKTsKKwkJU2V0PElWaXJ0dWFsQ29tcG9uZW50PiByZWZlZENvbXBzID0gbmV3IEhhc2hTZXQ8SVZpcnR1YWxDb21wb25lbnQ+KCk7CisJCXJlZmVkQ29tcHMuYWRkKGNvbXBvbmVudCk7CisJCWZvcihJVmlydHVhbFJlZmVyZW5jZSByZWY6IHJlZnMpeworCQkJaWYocmVmLmdldERlcGVuZGVuY3lUeXBlKCkgPT0gSVZpcnR1YWxSZWZlcmVuY2UuREVQRU5ERU5DWV9UWVBFX1VTRVMpeworCQkJCXJlZnNMaXN0LmFkZChyZWYpOworCQkJCXJlZmVkQ29tcHMuYWRkKHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwogCQkJfQogCQl9CisJCWxhc3RVcGRhdGUuYmFzZVJlZkNvdW50ID0gcmVmc0xpc3Quc2l6ZSgpOwogCQkKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IG51bGw7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG51bGw7Ci0JCQotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBjb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCA/ICgoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpY29tcG9uZW50KS5nZXRSZWZlcmVuY2VzKGZhbHNlLCB0cnVlKTogY29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJbGFzdFVwZGF0ZS5iYXNlUmVmQ291bnQgPSByZWZzLmxlbmd0aDsKLQkJCi0JCUxpc3QgcmVmc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVNldCByZWZlZENvbXBzID0gbmV3IEhhc2hTZXQoKTsKLQkJcmVmZWRDb21wcy5hZGQoY29tcG9uZW50KTsKLQkJZm9yKGludCBpID0gMDsgaTxyZWZzLmxlbmd0aDtpKyspewotCQkJcmVmc0xpc3QuYWRkKHJlZnNbaV0pOwotCQkJcmVmZWRDb21wcy5hZGQocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQl9Ci0KIAkJTGlzdCA8SVZpcnR1YWxSZWZlcmVuY2U+IGVhckxpYlJlZmVyZW5jZXMgPSBnZXRCYXNlRUFSTGliUmVmcyhjb21wb25lbnQpOwogCQlsYXN0VXBkYXRlLmJhc2VMaWJSZWZDb3VudCA9IGVhckxpYlJlZmVyZW5jZXMuc2l6ZSgpOwogCQlmb3IoSVZpcnR1YWxSZWZlcmVuY2UgZWFyUmVmIDogZWFyTGliUmVmZXJlbmNlcyl7CkBAIC0yMjQsOCArMzA4LDkgQEAKIAkJCX0KIAkJfQogCQkKKwkJLy9pdGVyYXRlIHdpdGggaSBpbmRleCBiZWNhdXNlIHRoaXMgbGlzdCBtYXkgYmUgYXVnbWVudGVkIGR1cmluZyBpdGVyYXRpb24KIAkJZm9yKGludCBpPTA7IGk8IHJlZnNMaXN0LnNpemUoKTsgaSsrKXsKLQkJCWNvbXAgPSAoKElWaXJ0dWFsUmVmZXJlbmNlKXJlZnNMaXN0LmdldChpKSkuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOworCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IHJlZnNMaXN0LmdldChpKS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CiAJCQlpZihjb21wLmlzQmluYXJ5KCkpewogCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIFtdIGJpbmFyeVJlZnMgPSBjb21wLmdldFJlZmVyZW5jZXMoKTsKIAkJCQlmb3IoaW50IGogPSAwOyBqPGJpbmFyeVJlZnMubGVuZ3RoOyBqKyspewpAQCAtMjQ0LDc1ICszMjksODIgQEAKIAkJYm9vbGVhbiBpc1dlYiA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKIAkJYm9vbGVhbiBzaG91bGRBZGQgPSB0cnVlOwogCi0JCUxpc3QgZW50cmllc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCUxpc3QgPElDbGFzc3BhdGhFbnRyeT5lbnRyaWVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUNsYXNzcGF0aEVudHJ5PigpOwogCiAJCXRyeSB7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkKIAkJCWJvb2xlYW4gdXNlSkRUVG9Db250cm9sRXhwb3J0ID0gSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzLmdldERlZmF1bHRVc2VFQVJMaWJyYXJpZXNKRFRFeHBvcnQoKTsKIAkJCWlmKHVzZUpEVFRvQ29udHJvbEV4cG9ydCl7CiAJCQkJLy9pZiB0aGUgZGVmYXVsdCBpcyBub3QgZW5hYmxlZCwgdGhlbiBjaGVjayB3aGV0aGVyIHRoZSBjb250YWluZXIgaXMgYmVpbmcgZXhwb3J0ZWQKLQkJCQlJQ2xhc3NwYXRoRW50cnkgW10gcmF3RW50cmllcyA9IGphdmFQcm9qZWN0LnJlYWRSYXdDbGFzc3BhdGgoKTsKKwkJCQlJQ2xhc3NwYXRoRW50cnkgW10gcmF3RW50cmllcyA9IGphdmFQcm9qZWN0TGl0ZS5yZWFkUmF3Q2xhc3NwYXRoKCk7CiAJCQkJZm9yKGludCBpPTA7aTxyYXdFbnRyaWVzLmxlbmd0aDsgaSsrKXsKIAkJCQkJSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gcmF3RW50cmllc1tpXTsKIAkJCQkJaWYoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpewogCQkJCQkJaWYoZW50cnkuZ2V0UGF0aCgpLmVxdWFscyhDT05UQUlORVJfUEFUSCkpewotCQkJCQkJCWV4cG9ydEVudHJpZXMgPSBlbnRyeS5pc0V4cG9ydGVkKCk7CisJCQkJCQkJbGFzdFVwZGF0ZS5leHBvcnRFbnRyaWVzID0gZW50cnkuaXNFeHBvcnRlZCgpOwogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQogCQkJCisJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBudWxsOworCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IG51bGw7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnNMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVmID0gKElWaXJ0dWFsUmVmZXJlbmNlKXJlZnNMaXN0LmdldChpKTsKKwkJCQlyZWYgPSByZWZzTGlzdC5nZXQoaSk7CiAJCQkJY29tcCA9IHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CiAJCQkJbGFzdFVwZGF0ZS5pc0JpbmFyeVtpXSA9IGNvbXAuaXNCaW5hcnkoKTsKIAkJCQlzaG91bGRBZGQgPSAhKGlzV2ViICYmIHJlZi5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhXRUJMSUIpKTsgCiAJCQkJaWYgKCFzaG91bGRBZGQpIHsKIAkJCQkJY29udGludWU7CiAJCQkJfQotCQkJCWlmIChjb21wLmlzQmluYXJ5KCkpIHsKLQkJCQkJVmlydHVhbEFyY2hpdmVDb21wb25lbnQgYXJjaGl2ZUNvbXAgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIGNvbXA7Ci0JCQkJCWlmIChhcmNoaXZlQ29tcC5nZXRBcmNoaXZlVHlwZSgpLmVxdWFscyhWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5DTEFTU1BBVEhBUkNISVZFVFlQRSkpIHsKLQkJCQkJCS8vIGRvIG5vdCBwcm9jZXNzIGNvbXBvbmVudHMgZHluYW1pY2FsbHkgY29tcHV0ZWQgZnJvbSB0aGUgSmF2YSBjbGFzc3BhdGgKLQkJCQkJCWNvbnRpbnVlOworCQkJCWlmIChsYXN0VXBkYXRlLmlzQmluYXJ5W2ldKSB7CisJCQkJCWlmKCBjb21wIGluc3RhbmNlb2YgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgKSB7CisJCQkJCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBhcmNoaXZlQ29tcCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgY29tcDsKKwkJCQkJCWlmIChhcmNoaXZlQ29tcC5nZXRBcmNoaXZlVHlwZSgpLmVxdWFscyhWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5DTEFTU1BBVEhBUkNISVZFVFlQRSkpIHsKKwkJCQkJCQkvLyBkbyBub3QgcHJvY2VzcyBjb21wb25lbnRzIGR5bmFtaWNhbGx5IGNvbXB1dGVkIGZyb20gdGhlIEphdmEgY2xhc3NwYXRoCisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CiAJCQkJCX0KLQkJCQkJamF2YS5pby5GaWxlIGRpc2tGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7Ci0JCQkJCWlmIChkaXNrRmlsZS5leGlzdHMoKSkgewotCQkJCQkJbGFzdFVwZGF0ZS5wYXRoc1tpXSA9IG5ldyBQYXRoKGRpc2tGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUlGaWxlIGlGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCQkJCWxhc3RVcGRhdGUucGF0aHNbaV0gPSBpRmlsZS5nZXRGdWxsUGF0aCgpOwotCQkJCQl9Ci0JCQkJCUNsYXNzcGF0aERlY29yYXRpb25zIGRlYyA9IGRlY29yYXRpb25zTWFuYWdlci5nZXREZWNvcmF0aW9ucyggZ2V0UGF0aCgpLnRvU3RyaW5nKCksIGxhc3RVcGRhdGUucGF0aHNbaV0udG9TdHJpbmcoKSApOwotCQkJCQkKLQkJCQkJSVBhdGggc3JjcGF0aCA9IG51bGw7Ci0JCQkgICAgICAgIElQYXRoIHNyY3Jvb3RwYXRoID0gbnVsbDsKLQkJCSAgICAgICAgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJzID0ge307Ci0JCQkgICAgICAgIElBY2Nlc3NSdWxlW10gYWNjZXNzID0ge307Ci0JCQkJCQotCQkJICAgICAgICBpZiggZGVjICE9IG51bGwgKSB7Ci0JCQkgICAgICAgICAgICBzcmNwYXRoID0gZGVjLmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCk7Ci0JCQkgICAgICAgICAgICBzcmNyb290cGF0aCA9IGRlYy5nZXRTb3VyY2VBdHRhY2htZW50Um9vdFBhdGgoKTsKLQkJCSAgICAgICAgICAgIGF0dHJzID0gZGVjLmdldEV4dHJhQXR0cmlidXRlcygpOwotCQkJICAgICAgICB9Ci0JCQkgICAgICAgIElDbGFzc3BhdGhFbnRyeSBuZXdFbnRyeSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSggbGFzdFVwZGF0ZS5wYXRoc1tpXSwgc3JjcGF0aCwgc3Jjcm9vdHBhdGgsIGFjY2VzcywgYXR0cnMsIGV4cG9ydEVudHJpZXMgKTsgCi0JCQkgICAgICAgIGVudHJpZXNMaXN0LmFkZChuZXdFbnRyeSk7CisJCQkJCWxhc3RVcGRhdGUucGF0aHNbaV0gPSAoSVBhdGgpY29tcC5nZXRBZGFwdGVyKElQYXRoLmNsYXNzKTsKKwkJCQkJSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5ID0gY3JlYXRlRW50cnkobGFzdFVwZGF0ZSwgaSk7CisJCQkJCWVudHJpZXNMaXN0LmFkZChuZXdFbnRyeSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJSVByb2plY3QgcHJvamVjdCA9IGNvbXAuZ2V0UHJvamVjdCgpOwogCQkJCQlsYXN0VXBkYXRlLnBhdGhzW2ldID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCQkJCQllbnRyaWVzTGlzdC5hZGQoSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KGxhc3RVcGRhdGUucGF0aHNbaV0sIGV4cG9ydEVudHJpZXMpKTsKKwkJCQkJSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5ID0gY3JlYXRlRW50cnkobGFzdFVwZGF0ZSwgaSk7CisJCQkJCWVudHJpZXNMaXN0LmFkZChuZXdFbnRyeSk7CiAJCQkJfQogCQkJfQogCQl9IGZpbmFsbHkgewogCQkJZW50cmllcyA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbZW50cmllc0xpc3Quc2l6ZSgpXTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCWVudHJpZXNbaV0gPSAoSUNsYXNzcGF0aEVudHJ5KSBlbnRyaWVzTGlzdC5nZXQoaSk7CisJCQkJZW50cmllc1tpXSA9IGVudHJpZXNMaXN0LmdldChpKTsKIAkJCX0KKwkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJTdG9yZS5zYXZlU3RhdGUoamF2YVByb2plY3RMaXRlLmdldFByb2plY3QoKS5nZXROYW1lKCksIGxhc3RVcGRhdGUpOwogCQl9CiAJfQotCisJCisJcHJpdmF0ZSBJQ2xhc3NwYXRoRW50cnkgY3JlYXRlRW50cnkoTGFzdFVwZGF0ZSBsYXN0VXBkYXRlLCBpbnQgaW5kZXgpeworCQlpZihsYXN0VXBkYXRlLmlzQmluYXJ5W2luZGV4XSl7CisJCQlDbGFzc3BhdGhEZWNvcmF0aW9ucyBkZWMgPSBkZWNvcmF0aW9uc01hbmFnZXIuZ2V0RGVjb3JhdGlvbnMoIGdldFBhdGgoKS50b1N0cmluZygpLCBsYXN0VXBkYXRlLnBhdGhzW2luZGV4XS50b1N0cmluZygpICk7CisJCQkKKwkJCUlQYXRoIHNyY3BhdGggPSBudWxsOworCSAgICAgICAgSVBhdGggc3Jjcm9vdHBhdGggPSBudWxsOworCSAgICAgICAgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGF0dHJzID0ge307CisJICAgICAgICBJQWNjZXNzUnVsZVtdIGFjY2VzcyA9IHt9OworCQkJCisJICAgICAgICBpZiggZGVjICE9IG51bGwgKSB7CisJICAgICAgICAgICAgc3JjcGF0aCA9IGRlYy5nZXRTb3VyY2VBdHRhY2htZW50UGF0aCgpOworCSAgICAgICAgICAgIHNyY3Jvb3RwYXRoID0gZGVjLmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpOworCSAgICAgICAgICAgIGF0dHJzID0gZGVjLmdldEV4dHJhQXR0cmlidXRlcygpOworCSAgICAgICAgfQorCSAgICAgICAgSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5ID0gSmF2YUNvcmVMaXRlLm5ld0xpYnJhcnlFbnRyeSggbGFzdFVwZGF0ZS5wYXRoc1tpbmRleF0sIHNyY3BhdGgsIHNyY3Jvb3RwYXRoLCBhY2Nlc3MsIGF0dHJzLCBsYXN0VXBkYXRlLmV4cG9ydEVudHJpZXMgKTsgCisJICAgICAgICByZXR1cm4gbmV3RW50cnk7CisJCX0KKwkJSUNsYXNzcGF0aEVudHJ5IG5ld0VudHJ5ID0gSmF2YUNvcmVMaXRlLm5ld1Byb2plY3RFbnRyeShsYXN0VXBkYXRlLnBhdGhzW2luZGV4XSwgbGFzdFVwZGF0ZS5leHBvcnRFbnRyaWVzKTsKKwkJcmV0dXJuIG5ld0VudHJ5OworCX0KKwkKIAlwcml2YXRlIExpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IGdldEJhc2VFQVJMaWJSZWZzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewogCQlMaXN0IDxJVmlydHVhbFJlZmVyZW5jZT4gbGliUmVmcyA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7CiAJCS8vIGNoZWNrIGZvciB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgbGliIGRpcnMgb2YgdGhlIHJlZmVyZW5jaW5nIEVBUnMKQEAgLTMyMCw5ICs0MTIsOSBAQAogCQlmb3IgKElWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jaW5nQ29tcCA6IHJlZmVyZW5jaW5nTGlzdCkgewogCQkJLy8gY2hlY2sgaWYgdGhlIHJlZmVyZW5jaW5nIGNvbXBvbmVudCBpcyBhbiBFQVIKIAkJCWlmIChFYXJVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHJlZmVyZW5jaW5nQ29tcC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJRUFSVmlydHVhbENvbXBvbmVudCBlYXJDb21wID0gKEVBUlZpcnR1YWxDb21wb25lbnQpIHJlZmVyZW5jaW5nQ29tcDsKKwkJCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wID0gcmVmZXJlbmNpbmdDb21wOwogCQkJCS8vIHJldHJpZXZlIHRoZSBFQVIncyBsaWJyYXJ5IGRpcmVjdG9yeSAKLQkJCQlTdHJpbmcgbGliRGlyID0gZ2V0RUFSTGliRGlyKGVhckNvbXApOworCQkJCVN0cmluZyBsaWJEaXIgPSBFYXJVdGlsaXRpZXMuZ2V0RUFSTGliRGlyKGVhckNvbXApOwogCQkJCS8vIGlmIHRoZSBFQVIgdmVyc2lvbiBpcyBsb3dlciB0aGFuIDUsIHRoZW4gdGhlIGxpYnJhcnkgZGlyZWN0b3J5IHdpbGwgYmUgbnVsbAogCQkJCS8vIG9yIGlmIGl0IGlzIHRoZSBlbXB0eSBzdHJpbmcsIGRvIG5vdGhpbmcuCiAJCQkJaWYgKGxpYkRpciAhPSBudWxsICYmIGxpYkRpci50cmltKCkubGVuZ3RoKCkgIT0gMCkgewpAQCAtMzMwLDUwICs0MjIsMTE3IEBACiAJCQkJCS8vIGNoZWNrIGlmIHRoZSBjb21wb25lbnQgaXRzZWxmIGlzIG5vdCBpbiB0aGUgbGlicmFyeSBkaXJlY3Rvcnkgb2YgdGhpcyBFQVIgLSBhdm9pZCBjeWNsZXMgaW4gdGhlIGJ1aWxkIHBhdGNoCiAJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IGVhckNvbXAuZ2V0UmVmZXJlbmNlKGNvbXBvbmVudC5nZXROYW1lKCkpOwogCQkJCQlpZihyZWYgIT0gbnVsbCl7Ci0JCQkJCQlJUGF0aCByZWZQYXRoID0gcmVmLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlKCk7CisJCQkJCQlJUGF0aCByZWZQYXRoID0gcmVmLmdldFJ1bnRpbWVQYXRoKCk7CisJCQkJCQlTdHJpbmcgYXJjaGl2ZU5hbWUgPSByZWYuZ2V0QXJjaGl2ZU5hbWUoKTsKKwkJCQkJCWlmKGFyY2hpdmVOYW1lICE9IG51bGwpeworCQkJCQkJCS8vIHRoaXMgY2hlY2sgaXMgbmVlZGVkIHRvIGhhbmRsZSB0aGUgc2NlbmFyaW8gd2hlcmUgdGhlIHJlZi5nZXRSdW50aW1lUGF0aCgpIGlzICIvIgorCQkJCQkJCS8vIGFuZCB0aGUgYXJjaGl2ZSBuYW1lIGlzICIvbGliL2Zvby5qYXIiCisJCQkJCQkJcmVmUGF0aCA9IHJlZlBhdGguYXBwZW5kKGFyY2hpdmVOYW1lKTsKKwkJCQkJCQlpZihyZWZQYXRoLnNlZ21lbnRDb3VudCgpID4gMCl7CisJCQkJCQkJCXJlZlBhdGggPSByZWZQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCQlyZWZQYXRoID0gcmVmUGF0aC5tYWtlUmVsYXRpdmUoKTsKIAkJCQkJCWlmICghbGliRGlyUGF0aC5lcXVhbHMocmVmUGF0aCkpIHsKIAkJCQkJCQkvLyByZXRyaWV2ZSB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnRzIGZyb20gdGhlIEVBUgogCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gZWFyUmVmcyA9IGVhckNvbXAuZ2V0UmVmZXJlbmNlcygpOwogCQkJCQkJCWZvciAoSVZpcnR1YWxSZWZlcmVuY2UgZWFyUmVmIDogZWFyUmVmcykgewotCQkJCQkJCQkvLyBjaGVjayBpZiB0aGUgcmVmZXJlbmNlZCBjb21wb25lbnQgaXMgaW4gdGhlIGxpYnJhcnkgZGlyZWN0b3J5Ci0JCQkJCQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gZWFyUmVmLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlKCk7Ci0JCQkJCQkJCWJvb2xlYW4gaXNJbkxpYkRpciA9IGxpYkRpclBhdGguZXF1YWxzKHJ1bnRpbWVQYXRoKTsKLQkJCQkJCQkJaWYoIWlzSW5MaWJEaXIpewotCQkJCQkJCQkJSVBhdGggZnVsbFBhdGggPSBlYXJSZWYuZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQoZWFyUmVmLmdldEFyY2hpdmVOYW1lKCkpOwotCQkJCQkJCQkJaXNJbkxpYkRpciA9IGZ1bGxQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5tYWtlUmVsYXRpdmUoKS5lcXVhbHMobGliRGlyUGF0aCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGlzSW5MaWJEaXIpIHsKLQkJCQkJCQkJCWxpYlJlZnMuYWRkKGVhclJlZik7CisJCQkJCQkJCWlmKGVhclJlZi5nZXREZXBlbmRlbmN5VHlwZSgpID09IElWaXJ0dWFsUmVmZXJlbmNlLkRFUEVOREVOQ1lfVFlQRV9VU0VTKXsKKwkJCQkJCQkJCS8vIGNoZWNrIGlmIHRoZSByZWZlcmVuY2VkIGNvbXBvbmVudCBpcyBpbiB0aGUgbGlicmFyeSBkaXJlY3RvcnkKKwkJCQkJCQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gZWFyUmVmLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlKCk7CisJCQkJCQkJCQlib29sZWFuIGlzSW5MaWJEaXIgPSBsaWJEaXJQYXRoLmVxdWFscyhydW50aW1lUGF0aCk7CisJCQkJCQkJCQlpZighaXNJbkxpYkRpcil7CisJCQkJCQkJCQkJSVBhdGggZnVsbFBhdGggPSBlYXJSZWYuZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQoZWFyUmVmLmdldEFyY2hpdmVOYW1lKCkpOworCQkJCQkJCQkJCWlzSW5MaWJEaXIgPSBmdWxsUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkubWFrZVJlbGF0aXZlKCkuZXF1YWxzKGxpYkRpclBhdGgpOworCQkJCQkJCQkJfQorCQkJCQkJCQkJaWYgKGlzSW5MaWJEaXIpIHsKKwkJCQkJCQkJCQlsaWJSZWZzLmFkZChlYXJSZWYpOworCQkJCQkJCQkJfQogCQkJCQkJCQl9CiAJCQkJCQkJfQogCQkJCQkJfQorCQkJCQkJLy9hZGQgRUFSIGNsYXNzcGF0aCBjb250YWluZXIgcmVmcworCQkJCQkJdHJ5IHsKKwkJCQkJCQlDbGFzc3BhdGhMaWJyYXJ5RXhwYW5kZXIgY2xhc3NwYXRoTGliRXhwYW5kZXIgPSBuZXcgQ2xhc3NwYXRoTGlicmFyeUV4cGFuZGVyKGVhckNvbXApOworCQkJCQkJCUlGbGF0UmVzb3VyY2UgZmxhdExpYlJlc291cmNlID0gY2xhc3NwYXRoTGliRXhwYW5kZXIuZmV0Y2hSZXNvdXJjZShsaWJEaXJQYXRoKTsKKwkJCQkJCQlpZihmbGF0TGliUmVzb3VyY2UgaW5zdGFuY2VvZiBJRmxhdEZvbGRlcil7CisJCQkJCQkJCUlGbGF0Rm9sZGVyIGZsYXRMaWJGb2xkZXIgPSAoSUZsYXRGb2xkZXIpZmxhdExpYlJlc291cmNlOworCQkJCQkJCQlJRmxhdFJlc291cmNlIFtdIGZsYXRMaWJzID0gZmxhdExpYkZvbGRlci5tZW1iZXJzKCk7CisJCQkJCQkJCWZvcihJRmxhdFJlc291cmNlIGZsYXRSZXNvdXJjZSA6IGZsYXRMaWJzKXsKKwkJCQkJCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBmbGF0UmVzb3VyY2UuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKKwkJCQkJCQkJCWlmKGZpbGUgIT0gbnVsbCl7CisJCQkJCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgZHluYW1pY0NvbXBvbmVudCA9IG5ldyBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudChlYXJDb21wLmdldFByb2plY3QoKSwgVmlydHVhbEFyY2hpdmVDb21wb25lbnQuTElCQVJDSElWRVRZUEUgKyAiLyIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBuZXcgUGF0aChsaWJEaXIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIGR5bmFtaWNSZWYgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlZmVyZW5jZShlYXJDb21wLCBkeW5hbWljQ29tcG9uZW50KTsKKwkJCQkJCQkJCQkoKFZpcnR1YWxSZWZlcmVuY2UpZHluYW1pY1JlZikuc2V0RGVyaXZlZCh0cnVlKTsKKwkJCQkJCQkJCQlkeW5hbWljUmVmLnNldEFyY2hpdmVOYW1lKGZpbGUuZ2V0TmFtZSgpKTsKKwkJCQkJCQkJCQlsaWJSZWZzLmFkZChkeW5hbWljUmVmKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJfQkKKwkJCQkJCQl9CisJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9CiAJCXJldHVybiBsaWJSZWZzOwogCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgeworCQorCXB1YmxpYyBzdGF0aWMgSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lciBpbnN0YWxsKElQYXRoIGNvbnRhaW5lclBhdGgsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgTGFzdFVwZGF0ZSByZXN0b3JlU3RhdGUpIHsKIAkJdHJ5ewogCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5wYXVzZVVwZGF0ZXMoKTsKIAkJCWZpbmFsIElKYXZhUHJvamVjdFtdIHByb2plY3RzID0gbmV3IElKYXZhUHJvamVjdFtde2phdmFQcm9qZWN0fTsKIAkJCWZpbmFsIEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gbmV3IEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgamF2YVByb2plY3QpOwotCQkJY29udGFpbmVyLnVwZGF0ZSgpOworCQkJY29udGFpbmVyLnVwZGF0ZShyZXN0b3JlU3RhdGUpOwogCQkJZmluYWwgSUNsYXNzcGF0aENvbnRhaW5lcltdIGNvbnRzID0gbmV3IElDbGFzc3BhdGhDb250YWluZXJbXXtjb250YWluZXJ9OwogCQkJdHJ5IHsKIAkJCQlKYXZhQ29yZS5zZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwgcHJvamVjdHMsIGNvbnRzLCBudWxsKTsKIAkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CiAJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KKwkJCXJldHVybiBjb250YWluZXI7CiAJCX0gZmluYWxseSB7CiAJCQlKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5nZXRJbnN0YW5jZSgpLnJlc3VtZVVwZGF0ZXMoKTsKIAkJfQogCX0KIAorCXB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsKGZpbmFsIElQYXRoIGNvbnRhaW5lclBhdGgsIGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgeworCQlmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOworCQlMYXN0VXBkYXRlIHJlc3RvcmVTdGF0ZSA9IEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJTdG9yZS5nZXRSZXN0b3JlU3RhdGUocHJvamVjdE5hbWUpOworCQlib29sZWFuIG5lZWRUb1ZlcmlmeSA9IGZhbHNlOworCQlpZihudWxsICE9IHJlc3RvcmVTdGF0ZSl7CisJCQlzeW5jaHJvbml6ZWQgKHJlc3RvcmVTdGF0ZSkgeworCQkJCW5lZWRUb1ZlcmlmeSA9IHJlc3RvcmVTdGF0ZS5uZWVkVG9WZXJpZnk7CisJCQkJcmVzdG9yZVN0YXRlLm5lZWRUb1ZlcmlmeSA9IGZhbHNlOworCQkJfQorCQl9CisJCWZpbmFsIEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gaW5zdGFsbChjb250YWluZXJQYXRoLCBqYXZhUHJvamVjdCwgcmVzdG9yZVN0YXRlKTsKKwkJaWYobmVlZFRvVmVyaWZ5KXsKKwkJCUpvYiB2ZXJpZnlKb2IgPSBuZXcgSm9iKE1lc3NhZ2VzLkoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyX1ZlcmlmeV9FQVJfTGlicmFyaWVzKXsKKwkJCQlAT3ZlcnJpZGUKKwkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJCWNvbnRhaW5lci5yZWZyZXNoKCk7CisJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQkJCX0KKwkJCX07CisJCQl2ZXJpZnlKb2Iuc2V0U3lzdGVtKHRydWUpOworCQkJdmVyaWZ5Sm9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7CisJCQl2ZXJpZnlKb2Iuc2NoZWR1bGUoKTsKKwkJfQorCX0KKwkKIAlwdWJsaWMgdm9pZCByZWZyZXNoKGJvb2xlYW4gZm9yY2UpeworCQlpZiAoIWZvcmNlKSB7CisJCQlpZihJRGVwZW5kZW5jeUdyYXBoLklOU1RBTkNFLmlzU3RhbGUoKSl7CisJCQkJLy9hdm9pZCBkZWFkbG9jayBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MzM0MDUwCisJCQkJLy9pZiB0aGUgZGF0YSBpcyBzdGFsZSBhYm9ydCBhbmQgYXR0ZW1wdCB0byB1cGRhdGUgYWdhaW4gaW4gdGhlIG5lYXIgZnV0dXJlCisJCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5xdWV1ZVVwZGF0ZShqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQogCQlpZihmb3JjZSB8fCByZXF1aXJlc1VwZGF0ZSgpKXsKLQkJCWluc3RhbGwoY29udGFpbmVyUGF0aCwgamF2YVByb2plY3QpOworCQkJaW5zdGFsbChjb250YWluZXJQYXRoLCBqYXZhUHJvamVjdCwgbnVsbCk7CiAJCX0KIAl9CiAJCkBAIC0zODEsMTkgKzU0MCw3IEBACiAJCXJlZnJlc2goZmFsc2UpOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc1VwZGF0aW5nID0gZmFsc2U7Ci0JCiAJcHVibGljIElDbGFzc3BhdGhFbnRyeVtdIGdldENsYXNzcGF0aEVudHJpZXMoKSB7Ci0JCWlmKCFpc1VwZGF0aW5nKXsKLQkJCWlmKHRoaXMgIT0gSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzLmdldEluc3RhbGxlZEVBUkxpYnJhcmllc0NvbnRhaW5lcihqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpKXsKLQkJCQl0cnkgewotCQkJCQlpc1VwZGF0aW5nID0gdHJ1ZTsKLQkJCQkJdXBkYXRlKCk7Ci0JCQkJfSBmaW5hbGx5ewotCQkJCQlpc1VwZGF0aW5nID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9CiAJCXJldHVybiBlbnRyaWVzOwogCX0KIApAQCAtNDA4LDQ3ICs1NTUsNSBAQAogCXB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewogCQlyZXR1cm4gY29udGFpbmVyUGF0aDsKIAl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxpYnJhcnkgZGlyZWN0b3J5IGZyb20gYW4gRUFSIHZpcnR1YWwgY29tcG9uZW50Ci0JICogCi0JICogQHBhcmFtIGVhckNvbXBvbmVudAotCSAqICAgICAgICAgICAgdGhlIEVBUiB2aXJ0dWFsIGNvbXBvbmVudAotCSAqIAotCSAqIEByZXR1cm4gYSBydW50aW1lIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaWJyYXJ5IGRpcmVjdG9yeSBwYXRoIG9yIG51bGwgaWYKLQkgKiAgICAgICAgIHRoZSBFQVIncyB2ZXJzaW9uIGlzIGxvd2VyIHRoYW4gNQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEVBUkxpYkRpcihFQVJWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCkgewotCQkvLyBjaGVjayBpZiB0aGUgRUFSIGNvbXBvbmVudCdzIHZlcnNpb24gaXMgNSBvciBncmVhdGVyCi0JCUlQcm9qZWN0IGVhclByb2plY3QgPSBlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQlpZiAoIUphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNKRUVDb21wb25lbnQoZWFyQ29tcG9uZW50LCBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLkREX1ZFUlNJT04pCi0JCQkJfHwgIUphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNKRUVDb21wb25lbnQoZWFyQ29tcG9uZW50LCBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLkZBQ0VUX1ZFUlNJT04pKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJLy8gZGVmYXVsdCBsaWIgZGlyIGlmIHRoZXJlIGlzIG5vIGRlcGxveW1lbnQgZGVzY3JpcHRvcgotCQkvLyBvciBpZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGRvZXMgbm90IG92ZXJyaWRlCi0JCVN0cmluZyBsaWJEaXIgPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkVBUl9ERUZBVUxUX0xJQl9ESVIpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQotCQkvLyByZXRyaWV2ZSB0aGUgbW9kZWwgcHJvdmlkZXIKLQkJSU1vZGVsUHJvdmlkZXIgbW9kZWxQcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIoZWFyUHJvamVjdCk7Ci0JCWlmIChtb2RlbFByb3ZpZGVyID09IG51bGwpewotCQkJcmV0dXJuIGxpYkRpcjsKLQkJfQotCQkKLQkJLy8gcmV0cmlldmUgdGhlIEVBUidzIGRlcGxveW1lbnQgZGVzY3JpcHRvciBtb2RlbCBvYmplY3QKLQkJQXBwbGljYXRpb24gYXBwID0gKEFwcGxpY2F0aW9uKSBtb2RlbFByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KG5ldyBQYXRoKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKSk7Ci0JCWlmIChhcHAgPT0gbnVsbCl7Ci0JCQlyZXR1cm4gbGliRGlyOwotCQl9Ci0JCQotCQkvLyByZXRyaWV2ZSB0aGUgbGlicmFyeSBkaXJlY3RvcnkgZnJvbSB0aGUgbW9kZWwKLQkJU3RyaW5nIGRkTGliRGlyID0gYXBwLmdldExpYnJhcnlEaXJlY3RvcnkoKTsKLQkJaWYgKGRkTGliRGlyICE9IG51bGwpIHsKLQkJCWxpYkRpciA9IGRkTGliRGlyOwotCQl9Ci0JCQotCQlyZXR1cm4gbGliRGlyOwotCX0KIAkKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJTdG9yZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9KMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGYxMDgzCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9KMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyU3RvcmUuamF2YQpAQCAtMCwwICsxLDIwMiBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lci5MYXN0VXBkYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOworCitwdWJsaWMgY2xhc3MgSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclN0b3JlIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0xJQlJBUklFU19DQUNIRSA9ICJlYXJMaWJyYXJpZXNDYWNoZS5pbmRleCI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBMYXN0VXBkYXRlPiByZXN0b3JlU3RhdGVNYXA7CisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTGFzdFVwZGF0ZT4gc2F2ZVN0YXRlTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMYXN0VXBkYXRlPigpOworCisJc3RhdGljIHsKKwkJSVBhdGggc3RhdGVMb2NhdGlvbiA9IEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsKKwkJamF2YS5pby5GaWxlIGZpbGUgPSBzdGF0ZUxvY2F0aW9uLmFwcGVuZChFQVJfTElCUkFSSUVTX0NBQ0hFKS50b0ZpbGUoKTsKKwkJdHJ5IHsKKwkJCWlmIChmaWxlLmV4aXN0cygpKSB7CisJCQkJRmlsZUlucHV0U3RyZWFtIGZJbiA9IG51bGw7CisJCQkJYm9vbGVhbiBkZWxldGVDYWNoZSA9IHRydWU7CisJCQkJdHJ5IHsKKwkJCQkJZkluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKwkJCQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBiSW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmSW4pOworCQkJCQlPYmplY3RJbnB1dFN0cmVhbSBvSW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYkluKTsKKwkJCQkJcmVzdG9yZVN0YXRlTWFwID0gKEhhc2hNYXA8U3RyaW5nLCBMYXN0VXBkYXRlPikgb0luLnJlYWRPYmplY3QoKTsKKwkJCQkJb0luLmNsb3NlKCk7CisJCQkJCQorCQkJCQkvL2l0IGlzIHVuZm9ydHVuYXRlIHRoaXMgaXMgbmVjZXNzYXJ5LCBidXQgd2l0aG91dCBpdGVyYXRpbmcgb3ZlciB0aGUgbWFwCisJCQkJCS8vYW5kIGV4cGxpY2l0bHkgdGVzdGluZyBlYWNoIHZhbHVlLCBjbGFzcyBjYXN0IGV4Y2VwdGlvbnMgbWF5IG9jY3VyIGxhdGVyCisJCQkJCS8vYmVzdCB0byBjaGVjayB0aGVtIGFsbCBub3cgYW5kIHJlY292ZXIKKwkJCQkJSXRlcmF0b3I8RW50cnk8U3RyaW5nLCBMYXN0VXBkYXRlPj4gaXRlcmF0b3IgPSByZXN0b3JlU3RhdGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworCQkJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpeworCQkJCQkJRW50cnk8U3RyaW5nLCBMYXN0VXBkYXRlPiBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOworCQkJCQkJU3RyaW5nIHMgPSBuZXh0LmdldEtleSgpOworCQkJCQkJTGFzdFVwZGF0ZSBsdSA9IG5leHQuZ2V0VmFsdWUoKTsKKwkJCQkJCWlmKHMgPT0gbnVsbCB8fCBsdSA9PSBudWxsKXsKKwkJCQkJCQkvL21heSB0aHJvdyBDbGFzc0Nhc3RFeGNlcHRpb24KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlkZWxldGVDYWNoZSA9IGZhbHNlOworCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKXsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCQl9CisJCQkJZmluYWxseSB7CisJCQkJCWlmIChmSW4gIT0gbnVsbCkgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQlmSW4uY2xvc2UoKTsKKwkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmKGRlbGV0ZUNhY2hlKXsKKwkJCQkJCXJlc3RvcmVTdGF0ZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGFzdFVwZGF0ZT4oKTsKKwkJCQkJCWZpbGUuZGVsZXRlKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gY2F0Y2ggKFRocm93YWJsZSBlKXsKKwkJCXRyeXsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCWZpbGUuZGVsZXRlKCk7CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpeworCQkJCS8vZWF0IGl0CisJCQl9CisJCQlyZXN0b3JlU3RhdGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExhc3RVcGRhdGU+KCk7CisJCX0gZmluYWxseSB7CisJCQlpZiAocmVzdG9yZVN0YXRlTWFwID09IG51bGwpIHsKKwkJCQlyZXN0b3JlU3RhdGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExhc3RVcGRhdGU+KCk7CisJCQl9CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHBlcnNpc3QoKSB7CisJCXN5bmNocm9uaXplZCAoc2F2ZVN0YXRlTWFwKSB7CisJCQlJUGF0aCBzdGF0ZUxvY2F0aW9uID0gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpOworCQkJamF2YS5pby5GaWxlIGZpbGUgPSBzdGF0ZUxvY2F0aW9uLmFwcGVuZChFQVJfTElCUkFSSUVTX0NBQ0hFKS50b0ZpbGUoKTsKKwkJCUZpbGVPdXRwdXRTdHJlYW0gZk91dCA9IG51bGw7CisJCQl0cnkgeworCQkJCWZPdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKKwkJCQlCdWZmZXJlZE91dHB1dFN0cmVhbSBiT3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZPdXQpOworCQkJCU9iamVjdE91dHB1dFN0cmVhbSBvT3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiT3V0KTsKKwkJCQlvT3V0LndyaXRlT2JqZWN0KHNhdmVTdGF0ZU1hcCk7CisJCQkJb091dC5jbG9zZSgpOworCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQl9IGZpbmFsbHkgeworCQkJCWlmIChmT3V0ICE9IG51bGwpIHsKKwkJCQkJdHJ5IHsKKwkJCQkJCWZPdXQuY2xvc2UoKTsKKwkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXN0YXRpYyB2b2lkIGZsdXNoKFN0cmluZyBwcm9qZWN0TmFtZSkgeworCQlzeW5jaHJvbml6ZWQgKHJlc3RvcmVTdGF0ZU1hcCkgeworCQkJcmVzdG9yZVN0YXRlTWFwLnJlbW92ZShwcm9qZWN0TmFtZSk7CisJCX0KKwkJc3luY2hyb25pemVkIChzYXZlU3RhdGVNYXApIHsKKwkJCXNhdmVTdGF0ZU1hcC5yZW1vdmUocHJvamVjdE5hbWUpOworCQl9CisJfQorCisJc3RhdGljIHZvaWQgZmx1c2hBbGwoKSB7CisJCXN5bmNocm9uaXplZCAocmVzdG9yZVN0YXRlTWFwKSB7CisJCQlyZXN0b3JlU3RhdGVNYXAuY2xlYXIoKTsKKwkJfQorCQlzeW5jaHJvbml6ZWQgKHNhdmVTdGF0ZU1hcCkgeworCQkJc2F2ZVN0YXRlTWFwLmNsZWFyKCk7CisJCX0KKwkJSVBhdGggc3RhdGVMb2NhdGlvbiA9IEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsKKwkJamF2YS5pby5GaWxlIGZpbGUgPSBzdGF0ZUxvY2F0aW9uLmFwcGVuZChFQVJfTElCUkFSSUVTX0NBQ0hFKS50b0ZpbGUoKTsKKwkJZmlsZS5kZWxldGUoKTsKKwl9CisKKwlzdGF0aWMgTGFzdFVwZGF0ZSBnZXRSZXN0b3JlU3RhdGUoU3RyaW5nIHByb2plY3ROYW1lKSB7CisJCUxhc3RVcGRhdGUgbGFzdFVwZGF0ZSA9IG51bGw7CisJCXN5bmNocm9uaXplZCAocmVzdG9yZVN0YXRlTWFwKSB7CisJCQlsYXN0VXBkYXRlID0gcmVzdG9yZVN0YXRlTWFwLmdldChwcm9qZWN0TmFtZSk7CisJCX0KKwkJaWYgKGxhc3RVcGRhdGUgIT0gbnVsbCkgeworCQkJc3luY2hyb25pemVkIChzYXZlU3RhdGVNYXApIHsKKwkJCQlzYXZlU3RhdGVNYXAucHV0KHByb2plY3ROYW1lLCBsYXN0VXBkYXRlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbGFzdFVwZGF0ZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBjbGFzcyBQZXJzaXN0Sm9iIGV4dGVuZHMgSm9iIHsKKworCQlwdWJsaWMgUGVyc2lzdEpvYigpIHsKKwkJCXN1cGVyKCJQZXJzaXN0IEVBUiBMaWJyYXJpZXMgU3RhdGUiKTsgLy8kTk9OLU5MUy0xJAorCQkJc2V0U3lzdGVtKHRydWUpOworCQkJc2V0UnVsZShudWxsKTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQlTYWZlUnVubmVyLnJ1bihuZXcgSVNhZmVSdW5uYWJsZSgpIHsKKwkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJCQkJcGVyc2lzdCgpOworCQkJCX0KKworCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZXhjZXB0aW9uKTsKKwkJCQl9CisJCQl9KTsKKwkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgaW50IHBlcnNpc3REZWxheSA9IDYwMDAwOyAvLyAxIG1pbnV0ZQorCXByaXZhdGUgc3RhdGljIFBlcnNpc3RKb2IgcGVyc2lzdEpvYiA9IG5ldyBQZXJzaXN0Sm9iKCk7CisKKwlzdGF0aWMgdm9pZCBzYXZlU3RhdGUoU3RyaW5nIHByb2plY3ROYW1lLCBMYXN0VXBkYXRlIGxhc3RVcGRhdGUpIHsKKwkJYm9vbGVhbiBzY2hlZHVsZUpvYiA9IGZhbHNlOworCQlzeW5jaHJvbml6ZWQgKHNhdmVTdGF0ZU1hcCkgeworCQkJTGFzdFVwZGF0ZSBwcmV2aW91c1VwZGF0ZSA9IHNhdmVTdGF0ZU1hcC5nZXQocHJvamVjdE5hbWUpOworCQkJLy90aGlzIGNoZWNrIGlzIHRvIGF2b2lkIEkvTyBpZiBwb3NzaWJsZQorCQkJaWYobnVsbCA9PSBwcmV2aW91c1VwZGF0ZSB8fCAhcHJldmlvdXNVcGRhdGUuZXF1YWxzKGxhc3RVcGRhdGUpKXsKKwkJCQlzYXZlU3RhdGVNYXAucHV0KHByb2plY3ROYW1lLCBsYXN0VXBkYXRlKTsKKwkJCQlzY2hlZHVsZUpvYiA9IHRydWU7CisJCQl9CisJCX0KKwkJaWYoc2NoZWR1bGVKb2IpeworCQkJc3luY2hyb25pemVkIChyZXN0b3JlU3RhdGVNYXApIHsKKwkJCQkvL2lmIGl0IGNoYW5nZWQsIGRvIG5vdCBsb2FkIGl0IGZyb20gdGhlIGNhY2hlIGFnYWluCisJCQkJcmVzdG9yZVN0YXRlTWFwLnJlbW92ZShwcm9qZWN0TmFtZSk7CisJCQl9CisJCQlwZXJzaXN0Sm9iLnNjaGVkdWxlKHBlcnNpc3REZWxheSk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlscy5qYXZhCmluZGV4IDkzYzVkNzcuLjYyNzFiZmYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9KMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHMuamF2YQpAQCAtMzQsNyArMzQsNyBAQAogCQkJdHJ5IHsKIAkJCQljb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoY29udGFpbmVyUGF0aCwganByb2opOwogCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJfQogCQl9CiAJCXJldHVybiBjb250YWluZXI7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhJbml0aWFsaXplci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9KMkVFQ29tcG9uZW50Q2xhc3NwYXRoSW5pdGlhbGl6ZXIuamF2YQppbmRleCA0ZTEwNDJmLi5hM2YwZGQ3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhJbml0aWFsaXplci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvSjJFRUNvbXBvbmVudENsYXNzcGF0aEluaXRpYWxpemVyLmphdmEKQEAgLTQxLDYgKzQxLDcgQEAKIAkJcmV0dXJuIGxvb3NlQ29uZmlnQ2FjaGUuZ2V0KCk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoSVBhdGggY29udGFpbmVyUGF0aCwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlsb29zZUNvbmZpZ0NhY2hlLnNldChuZXcgSGFzaE1hcDxFQVJWaXJ0dWFsQ29tcG9uZW50LCBMaXN0PigxMCkpOwpAQCAtNTIsMTAgKzUzLDEyIEBACiAJCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gY2FuVXBkYXRlQ2xhc3NwYXRoQ29udGFpbmVyKGZpbmFsIElQYXRoIGNvbnRhaW5lclBhdGgsIGZpbmFsIElKYXZhUHJvamVjdCBwcm9qZWN0KSB7CiAJCXJldHVybiB0cnVlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHJlcXVlc3RDbGFzc3BhdGhDb250YWluZXJVcGRhdGUoZmluYWwgSVBhdGggY29udGFpbmVyUGF0aCwgZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBmaW5hbCBJQ2xhc3NwYXRoQ29udGFpbmVyIHNnKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBrZXkgPSBjb250YWluZXJQYXRoLnRvU3RyaW5nKCk7CiAJCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBzZy5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL0oyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmphdmEKaW5kZXggNDA0NGE2Zi4uOWZjZTE5YSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9KMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuamF2YQpAQCAtNDMsNyArNDMsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5jbGFzc3BhdGguRmxleGlibGVQcm9qZWN0Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSU1vZHVsZUV4dGVuc2lvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwpAQCAtNTMsMTIgKzUyLDE0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkVhclV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLklEZXBlbmRlbmN5R3JhcGg7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmJ1aWxkZXIuSURlcGVuZGVuY3lHcmFwaExpc3RlbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLklEZXBlbmRlbmN5R3JhcGhVcGRhdGVFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVSb290QWRhcHRlcjsKQEAgLTE2NCwxMCArMTY1LDEwIEBACiAJcHJpdmF0ZSBib29sZWFuIGZvcmNlVXBkYXRlT25OZXh0UnVuID0gZmFsc2U7CiAJCiAJcHVibGljIHZvaWQgcXVldWVVcGRhdGUoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKSB7CisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSkgewogCQkJcXVldWVVcGRhdGVFQVIocHJvamVjdCk7Ci0JCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvamVjdCkgfHwgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3QpIHx8IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkKLQkJCQl8fCBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdCkgfHwgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdChwcm9qZWN0KSkgeworCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvamVjdCkgfHwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QocHJvamVjdCkgfHwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpCisJCQkJfHwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocHJvamVjdCkgfHwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KHByb2plY3QpKSB7CiAJCQlxdWV1ZVVwZGF0ZU1vZHVsZShwcm9qZWN0KTsKIAkJfQogCX0KQEAgLTE5NywxMiArMTk4LDEzIEBACiAJfQogCQogCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RVTEVfVVBEQVRFX0RFTEFZID0gMzA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9EVUxFX1VQREFURV9KT0JfTkFNRSA9ICJFQVIgTGlicmFyaWVzIFVwZGF0ZSBKb2IiOyAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVVBEQVRFX0pPQl9OQU1FID0gTWVzc2FnZXMuSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXJfRUFSX0xpYnJhcmllc19VcGRhdGVfSm9fOyAKIAogCXByaXZhdGUgZmluYWwgTW9kdWxlVXBkYXRlSm9iIG1vZHVsZVVwZGF0ZUpvYiA9IG5ldyBNb2R1bGVVcGRhdGVKb2IoKTsKIAogCXB1YmxpYyBjbGFzcyBNb2R1bGVVcGRhdGVKb2IgZXh0ZW5kcyBKb2IgewogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewogCQkJaWYoZmFtaWx5ID09IE1PRFVMRV9VUERBVEVfSk9CX05BTUUpewogCQkJCXJldHVybiB0cnVlOwpAQCAtMjEyLDEyICsyMTQsMTMgQEAKIAkJCiAJCS8vIFdlIHVzZSB0aGUgbGlzdGVuZXIgbGlzdCBhcyBhIHRocmVhZCBzYWZlIHF1ZXVlLgogCQlwcml2YXRlIGNsYXNzIFF1ZXVlIGV4dGVuZHMgTGlzdGVuZXJMaXN0ICB7CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0W10gZ2V0TGlzdGVuZXJzKCkgewogCQkJCU9iamVjdFtdIGRhdGEgPSBzdXBlci5nZXRMaXN0ZW5lcnMoKTsKIAkJCQljbGVhcigpOwogCQkJCXJldHVybiBkYXRhOwogCQkJfQotCQl9OworCQl9CiAKIAkJcHJpdmF0ZSBRdWV1ZSBtb2R1bGVRdWV1ZSA9IG5ldyBRdWV1ZSgpOwogCkBAIC0yNTEsNyArMjU0LDEzIEBACiAJCQlmb3IgKGludCBwID0gMDsgcCA8IHByb2plY3RzLmxlbmd0aDsgcCsrKSB7CiAJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcHJvamVjdHNbcF07CiAJCQkJaWYgKCFpc0tub3duKHByb2plY3QpKSB7Ci0JCQkJCUlQcm9qZWN0W10gZWFyUHJvamVjdHMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHByb2plY3QpOworCQkJCQlpZihJRGVwZW5kZW5jeUdyYXBoLklOU1RBTkNFLmlzU3RhbGUoKSl7CisJCQkJCQkvL2F2b2lkIGRlYWRsb2NrIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zMzQwNTAKKwkJCQkJCS8vaWYgdGhlIGRhdGEgaXMgc3RhbGUgYWJvcnQgYW5kIGF0dGVtcHQgdG8gdXBkYXRlIGFnYWluIGluIHRoZSBuZWFyIGZ1dHVyZQorCQkJCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5xdWV1ZVVwZGF0ZShwcm9qZWN0KTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCUlQcm9qZWN0W10gZWFyUHJvamVjdHMgPSBFYXJVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhwcm9qZWN0KTsKIAkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlYXJQcm9qZWN0cy5sZW5ndGg7IGkrKykgewogCQkJCQkJcXVldWVFQVIoZWFyUHJvamVjdHNbaV0pOwogCQkJCQl9CkBAIC0yNjMsNyArMjcyLDcgQEAKIAkJCU9iamVjdFtdIGVhclByb2plY3RzID0gZWFyUXVldWUuZ2V0TGlzdGVuZXJzKCk7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGVhclByb2plY3RzLmxlbmd0aDsgaSsrKSB7CiAJCQkJSVByb2plY3QgZWFyUHJvamVjdCA9IChJUHJvamVjdCkgZWFyUHJvamVjdHNbaV07Ci0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChlYXJQcm9qZWN0KSkKKwkJCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoZWFyUHJvamVjdCkpCiAJCQkJewogCQkJCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJQcm9qZWN0KTsgCiAJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldENvbXBvbmVudFJlZmVyZW5jZXMoZWFyQ29tcG9uZW50KTsKQEAgLTI4NSwxMSArMjk0LDExIEBACiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7CiAJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcHJvamVjdHNbaV07CiAJCQkJLy8gdGhpcyBibG9jayBpcyBmb3IgV2ViIGFwcCBMaWJyYXJpZXMKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgeworCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKIAkJCQkJSUNsYXNzcGF0aENvbnRhaW5lciB3ZWJBcHBMaWJyYXJpZXNDb250YWluZXIgPSBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoQ29udGFpbmVyVXRpbHMuZ2V0SW5zdGFsbGVkV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyKHByb2plY3QpOwogCQkJCQkvLyBJZiB0aGUgY29udGFpbmVyIGlzIHByZXNlbnQsIHJlZnJlc2ggaXQKIAkJCQkJaWYgKHdlYkFwcExpYnJhcmllc0NvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQkoKEZsZXhpYmxlUHJvamVjdENvbnRhaW5lcikgd2ViQXBwTGlicmFyaWVzQ29udGFpbmVyKS5yZWZyZXNoKCk7CisJCQkJCQkoKEZsZXhpYmxlUHJvamVjdENvbnRhaW5lcikgd2ViQXBwTGlicmFyaWVzQ29udGFpbmVyKS5yZWZyZXNoKGZvcmNlVXBkYXRlT25OZXh0UnVuKTsKIAkJCQkJfQogCQkJCX0KIApAQCAtMzA0LDExICszMTMsMTIgQEAKIAkJCXVwZGF0ZURlcGVuZGVuY3lHcmFwaCA9IHRydWU7CiAJCX0KIAkJCisJCUBPdmVycmlkZQogCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAKIAkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewogCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQkJCQlKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQl9CiAKIAkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTMzMSw3ICszNDEsNyBAQAogCiAJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKIAkJfQotCX07CisJfQogCiAJcHVibGljIElDbGFzc3BhdGhDb250YWluZXIgZ2V0V2ViQXBwTGlicmFyaWVzQ29udGFpbmVyKElQcm9qZWN0IHdlYlByb2plY3QsIGJvb2xlYW4gY3JlYXRlKSB7CiAJCUlKYXZhUHJvamVjdCBqcHJvaiA9IEphdmFDb3JlLmNyZWF0ZSh3ZWJQcm9qZWN0KTsKQEAgLTM0MSw3ICszNTEsNyBAQAogCQl0cnkgewogCQkJCWNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihXRUJfQVBQX0xJQlNfUEFUSCwganByb2opOwogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0KIAl9CiAJCXJldHVybiBjb250YWluZXI7CkBAIC0zNzQsNiArMzg0LDkgQEAKIAkJCU1hcDxJUHJvamVjdCwgU2V0PElQcm9qZWN0Pj4gYWRkZWRSZWZlcmVuY2VzID0gZXZlbnQuZ2V0QWRkZWRSZWZlcmVuY2VzKCk7CiAJCQlmb3IoSVByb2plY3QgcmVmZXJlbmNlZFByb2plY3QgOiBhZGRlZFJlZmVyZW5jZXMua2V5U2V0KCkpewogCQkJCXF1ZXVlVXBkYXRlKHJlZmVyZW5jZWRQcm9qZWN0KTsKKwkJCQlmb3IoSVByb2plY3QgcmVmZXJlbmNpbmdQcm9qZWN0IDogYWRkZWRSZWZlcmVuY2VzLmdldChyZWZlcmVuY2VkUHJvamVjdCkpeworCQkJCQlxdWV1ZVVwZGF0ZShyZWZlcmVuY2luZ1Byb2plY3QpOworCQkJCX0KIAkJCX0KIAkJfQogCX0KQEAgLTM4OCwxMCArNDAxLDEwIEBACiAJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGV2ZW50LmdldFJlc291cmNlKCk7CiAJCQkJCWlmKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCl7CiAJCQkJCQlpZihNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KChJUHJvamVjdCkgcmVzb3VyY2UpKXsKLQkJCQkJCQlpZihKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoKElQcm9qZWN0KXJlc291cmNlKSl7CisJCQkJCQkJaWYoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoKElQcm9qZWN0KXJlc291cmNlKSl7CiAJCQkJCQkJCUlQcm9qZWN0IGVhclByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwogCQkJCQkJCQkKLQkJCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0Q29tcG9uZW50UmVmZXJlbmNlcyhDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJQcm9qZWN0KSk7CisJCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IEVhclV0aWxpdGllcy5nZXRDb21wb25lbnRSZWZlcmVuY2VzKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclByb2plY3QpKTsKIAkJCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IG51bGw7CiAJCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgewogCQkJCQkJCQkJY29tcCA9IHJlZnNbal0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwpAQCAtNDAxLDcgKzQxNCw3IEBACiAJCQkJCQkJCX0KIAkJCQkJCQkJCQogCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCUlQcm9qZWN0W10gZWFyUHJvamVjdHMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKChJUHJvamVjdClyZXNvdXJjZSk7CisJCQkJCQkJCUlQcm9qZWN0W10gZWFyUHJvamVjdHMgPSBFYXJVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cygoSVByb2plY3QpcmVzb3VyY2UpOwogCQkJCQkJCQlmb3IoaW50IGk9MDsgaTxlYXJQcm9qZWN0cy5sZW5ndGg7IGkrKyl7CiAJCQkJCQkJCQlxdWV1ZVVwZGF0ZUVBUihlYXJQcm9qZWN0c1tpXSk7CiAJCQkJCQkJCX0KQEAgLTQyMCw3ICs0MzMsNyBAQAogCQkJCQlicmVhazsKIAkJCX0KIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0gCiAJCWZpbmFsbHkgewogCQkJcmVzdW1lVXBkYXRlcyhzY2hlZHVsZUpvYik7CkBAIC00OTMsOSArNTA2LDggQEAKIAkJCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gY29tcC5nZXRSb290Rm9sZGVyKCk7CiAJCQkJaWYgKGNvbXAgaW5zdGFuY2VvZiBFQVJWaXJ0dWFsQ29tcG9uZW50KSB7CiAJCQkJCXJldHVybiBpc1Jvb3RBbmNlc3RlcihyZXNvdXJjZSwgcm9vdEZvbGRlcikgfHwgaXNFQVJMaWJyYXJ5RGlyZWN0b3J5KHJlc291cmNlLCBjb21wKTsKLQkJCQl9IGVsc2UgeyAvLyBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudAotCQkJCQlyZXR1cm4gaXNSb290QW5jZXN0ZXIocmVzb3VyY2UsIHJvb3RGb2xkZXIpIHx8IGlzRm9sZGVyKHJlc291cmNlLCByb290Rm9sZGVyLmdldEZvbGRlcihKMkVFQ29uc3RhbnRzLk1FVEFfSU5GKSk7Ci0JCQkJfQorCQkJCX0vL2Vsc2UgSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQKKwkJCQlyZXR1cm4gaXNSb290QW5jZXN0ZXIocmVzb3VyY2UsIHJvb3RGb2xkZXIpIHx8IGlzRm9sZGVyKHJlc291cmNlLCByb290Rm9sZGVyLmdldEZvbGRlcihKMkVFQ29uc3RhbnRzLk1FVEFfSU5GKSk7CiAJCQl9CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KQEAgLTUwOCw3ICs1MjAsNyBAQAogCQkJCWlmIChudWxsID09IG1hbmlmZXN0RmlsZSB8fCByZXNvdXJjZS5lcXVhbHMobWFuaWZlc3RGaWxlKSkgewogCQkJCQlxdWV1ZVVwZGF0ZU1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwogCQkJCX0KLQkJCX0gZWxzZSBpZiAoZW5kc1dpdGhJZ25vcmVDYXNlKG5hbWUsIElNb2R1bGVFeHRlbnNpb25zLkRPVF9KQVIpIHx8IGVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCAiLnppcCIpKSB7CisJCQl9IGVsc2UgaWYgKGVuZHNXaXRoSWdub3JlQ2FzZShuYW1lLCBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUKSB8fCBlbmRzV2l0aElnbm9yZUNhc2UobmFtZSwgIi56aXAiKSkgeyAvLyROT04tTkxTLTEkCiAJCQkJdHJ5IHsKIAkJCQkJaWYgKEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldChyZXNvdXJjZS5nZXRQcm9qZWN0KCksIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkVOVEVSUFJJU0VfQVBQTElDQVRJT04pKSB7CiAJCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKQEAgLTUxNywxMyArNTI5LDEzIEBACiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJfQogCQkJfQogCQl9Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gZmFsc2U7CisJCQkKIAkJfQorCQlyZXR1cm4gZmFsc2U7CiAJfQogCQogCXByaXZhdGUgYm9vbGVhbiBpc0VBUkxpYnJhcnlEaXJlY3RvcnkoSVJlc291cmNlIHJlc291cmNlLCBJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQpIHsKQEAgLTU1NSw3ICs1NjcsNyBAQAogCQl9CiAJCXJldHVybiBpc1Jvb3RBbmNlc3RlcihyZXNvdXJjZSwgbGliRm9sZGVyKTsKIAl9Ci0KKwkKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5kc1dpdGhJZ25vcmVDYXNlKFN0cmluZyBzdHIsIFN0cmluZyBzZngpIHsKIAkJcmV0dXJuIHN0ci5yZWdpb25NYXRjaGVzKHRydWUsIHN0ci5sZW5ndGgoKSAtIHNmeC5sZW5ndGgoKSwgc2Z4LCAwLCBzZngubGVuZ3RoKCkpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJhN2FiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9NZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMTUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyX0VBUl9MaWJyYXJpZXNfVXBkYXRlX0pvXzsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlcl9WZXJpZnlfRUFSX0xpYnJhcmllczsKKworCXN0YXRpYyB7CisJCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL1d0cE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OGEwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL1d0cE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGg7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92Lm9zZ2kuT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uOworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgorICovCisKK3B1YmxpYyBjbGFzcyBXdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb24KKworICAgIGV4dGVuZHMgT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uCisgICAgCit7Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL1d0cE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9XdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQ0ZTIyCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9XdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JTGlicmFyeVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeVByb3ZpZGVyRnJhbWV3b3JrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3Yub3NnaS5Pc2dpQnVuZGxlc0NvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92Lm9zZ2kuT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdEJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKKworLyoqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb25zdGFudGluLmtvbWlzc2FyY2hpa0BvcmFjbGUuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KKyAqLworCitwdWJsaWMgY2xhc3MgV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnCisKKyAgICBleHRlbmRzIE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZworICAgIAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FIAorICAgICAgICA9IFd0cE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5jbGFzcy5nZXROYW1lKCk7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JTkNMVURFX1dJVEhfQVBQTElDQVRJT05fRU5BQkxFRCAKKyAgICAgICAgPSBDTEFTU19OQU1FICsgIi5JTkNMVURFX1dJVEhfQVBQTElDQVRJT05fRU5BQkxFRCI7IC8vJE5PTi1OTFMtMSQKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgV0VCX0ZBQ0VUIAorICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQiApOworCisgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVXaXRoQXBwbGljYXRpb24gPSB0cnVlOworICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZVdpdGhBcHBsaWNhdGlvbkVuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW5jbHVkZVdpdGhBcHBsaWNhdGlvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZVdpdGhBcHBsaWNhdGlvbkVuYWJsZWQoIGZpbmFsIGJvb2xlYW4gaW5jbHVkZVdpdGhBcHBsaWNhdGlvbiApCisgICAgeworICAgICAgICBmaW5hbCBib29sZWFuIG9sZFZhbHVlID0gdGhpcy5pbmNsdWRlV2l0aEFwcGxpY2F0aW9uOworICAgICAgICB0aGlzLmluY2x1ZGVXaXRoQXBwbGljYXRpb24gPSBpbmNsdWRlV2l0aEFwcGxpY2F0aW9uOworICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIFBST1BfSU5DTFVERV9XSVRIX0FQUExJQ0FUSU9OX0VOQUJMRUQsIG9sZFZhbHVlLCB0aGlzLmluY2x1ZGVXaXRoQXBwbGljYXRpb24gKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5pdCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0QmFzZSBmcHJvaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElMaWJyYXJ5UHJvdmlkZXIgcHJvdmlkZXIgKQorICAgIHsKKyAgICAgICAgc3VwZXIuaW5pdCggZnByb2osIGZ2LCBwcm92aWRlciApOworICAgICAgICAKKyAgICAgICAgdGhpcy5pbmNsdWRlV2l0aEFwcGxpY2F0aW9uID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBmcHJvai5nZXRQcm9qZWN0KCk7CisgICAgICAgIAorICAgICAgICBpZiggcHJvamVjdCAhPSBudWxsICkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gZnYuZ2V0UHJvamVjdEZhY2V0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsIElMaWJyYXJ5UHJvdmlkZXIgY3VycmVudFByb3ZpZGVyIAorICAgICAgICAgICAgICAgID0gTGlicmFyeVByb3ZpZGVyRnJhbWV3b3JrLmdldEN1cnJlbnRQcm92aWRlciggcHJvamVjdCwgZiApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggY3VycmVudFByb3ZpZGVyID09IHByb3ZpZGVyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gT3NnaUJ1bmRsZXNDb250YWluZXIuQ09OVEFJTkVSX1BBVEguYXBwZW5kKCBmLmdldElkKCkgKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QganByb2ogPSBKYXZhQ29yZS5jcmVhdGUoIHByb2plY3QgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggSUNsYXNzcGF0aEVudHJ5IGNwZSA6IGpwcm9qLmdldFJhd0NsYXNzcGF0aCgpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBhdGguZXF1YWxzKCBjcGUuZ2V0UGF0aCgpICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jbHVkZVdpdGhBcHBsaWNhdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBJQ2xhc3NwYXRoQXR0cmlidXRlIGF0dHIgOiBjcGUuZ2V0RXh0cmFBdHRyaWJ1dGVzKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGF0dHIuZ2V0TmFtZSgpLmVxdWFscyggSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05fREVQRU5ERU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmNsdWRlV2l0aEFwcGxpY2F0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUNsYXNzcGF0aEF0dHJpYnV0ZVtdIGdldENsYXNzcGF0aEF0dHJpYnV0ZXMoKQorICAgIHsKKyAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0QmFzZSBmcHJvaiA9IGdldEZhY2V0ZWRQcm9qZWN0KCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNXZWJQcm9qZWN0ID0gZnByb2ouaGFzUHJvamVjdEZhY2V0KCBXRUJfRkFDRVQgKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cjsKKyAgICAgICAgCisgICAgICAgIGlmKCBpc0luY2x1ZGVXaXRoQXBwbGljYXRpb25FbmFibGVkKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBhdHRyID0gSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKCBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXREZWZhdWx0UnVudGltZVBhdGgoIGlzV2ViUHJvamVjdCApLnRvU3RyaW5nKCkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGF0dHIgPSBKYXZhQ29yZS5uZXdDbGFzc3BhdGhBdHRyaWJ1dGUoIElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLkNMQVNTUEFUSF9DT01QT05FTlRfTk9OX0RFUEVOREVOQ1ksICIiICk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG5ldyBJQ2xhc3NwYXRoQXR0cmlidXRlW117IGF0dHIgfTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL1d0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL1d0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiMWJlMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb24uamF2YQpAQCAtMCwwICsxLDY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgb25nb2luZyBtYWludGVuYW5jZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi51c2VyLlVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YudXNlci5Vc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLklDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RCYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7CisKKy8qKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86a29uc3RhbnRpbi5rb21pc3NhcmNoaWtAb3JhY2xlLmNvbSI+S29uc3RhbnRpbiBLb21pc3NhcmNoaWs8L2E+CisgKi8KKworcHVibGljIGNsYXNzIFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uCisKKyAgICBleHRlbmRzIFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uCisgICAgCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBXRUJfRkFDRVQgCisgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCBJSjJFRUZhY2V0Q29uc3RhbnRzLkRZTkFNSUNfV0VCICk7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIElDbGFzc3BhdGhFbnRyeSBjcmVhdGVDbGFzc3BhdGhFbnRyeSggZmluYWwgVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaWJyYXJ5TmFtZSApCisgICAgeworICAgICAgICBmaW5hbCBXdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjZmcKKyAgICAgICAgICAgID0gKFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSBjb25maWc7CisgICAgICAgIAorICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3RCYXNlIGZwcm9qID0gY2ZnLmdldEZhY2V0ZWRQcm9qZWN0KCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNXZWJQcm9qZWN0ID0gZnByb2ouaGFzUHJvamVjdEZhY2V0KCBXRUJfRkFDRVQgKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cjsKKyAgICAgICAgCisgICAgICAgIGlmKCBjZmcuaXNJbmNsdWRlV2l0aEFwcGxpY2F0aW9uRW5hYmxlZCgpICkKKyAgICAgICAgeworICAgICAgICAgICAgYXR0ciA9IEphdmFDb3JlLm5ld0NsYXNzcGF0aEF0dHJpYnV0ZSggSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0RGVmYXVsdFJ1bnRpbWVQYXRoKCBpc1dlYlByb2plY3QgKS50b1N0cmluZygpICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhdHRyID0gSmF2YUNvcmUubmV3Q2xhc3NwYXRoQXR0cmlidXRlKCBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5DTEFTU1BBVEhfQ09NUE9ORU5UX05PTl9ERVBFTkRFTkNZLCAiIiApOyAvLyROT04tTkxTLTEkCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIElDbGFzc3BhdGhFbnRyeSBjcGUgPSBzdXBlci5jcmVhdGVDbGFzc3BhdGhFbnRyeSggY29uZmlnLCBsaWJyYXJ5TmFtZSApOworICAgICAgICBjcGUgPSBKYXZhQ29yZS5uZXdDb250YWluZXJFbnRyeSggY3BlLmdldFBhdGgoKSwgbnVsbCwgbmV3IElDbGFzc3BhdGhBdHRyaWJ1dGVbXXsgYXR0ciB9LCBmYWxzZSApOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIGNwZTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL1d0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vY2xhc3NwYXRoL1d0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyODEwMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvV3RwVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICBLb25zdGFudGluIEtvbWlzc2FyY2hpayAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gYW5kIG9uZ29pbmcgbWFpbnRlbmFuY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkNsYXNzcGF0aFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JTGlicmFyeVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeVByb3ZpZGVyRnJhbWV3b3JrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YudXNlci5Vc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0QmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOworCisvKioKKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtvbnN0YW50aW4ua29taXNzYXJjaGlrQG9yYWNsZS5jb20iPktvbnN0YW50aW4gS29taXNzYXJjaGlrPC9hPgorICovCisKK3B1YmxpYyBjbGFzcyBXdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZworCisgICAgZXh0ZW5kcyBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZworICAgIAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19OQU1FIAorICAgICAgICA9IFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmNsYXNzLmdldE5hbWUoKTsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lOQ0xVREVfV0lUSF9BUFBMSUNBVElPTl9FTkFCTEVEIAorICAgICAgICA9IENMQVNTX05BTUUgKyAiLklOQ0xVREVfV0lUSF9BUFBMSUNBVElPTl9FTkFCTEVEIjsgLy8kTk9OLU5MUy0xJAorCisgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVXaXRoQXBwbGljYXRpb24gPSB0cnVlOworICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzSW5jbHVkZVdpdGhBcHBsaWNhdGlvbkVuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaW5jbHVkZVdpdGhBcHBsaWNhdGlvbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZVdpdGhBcHBsaWNhdGlvbkVuYWJsZWQoIGZpbmFsIGJvb2xlYW4gaW5jbHVkZVdpdGhBcHBsaWNhdGlvbiApCisgICAgeworICAgICAgICBmaW5hbCBib29sZWFuIG9sZFZhbHVlID0gdGhpcy5pbmNsdWRlV2l0aEFwcGxpY2F0aW9uOworICAgICAgICB0aGlzLmluY2x1ZGVXaXRoQXBwbGljYXRpb24gPSBpbmNsdWRlV2l0aEFwcGxpY2F0aW9uOworICAgICAgICBub3RpZnlMaXN0ZW5lcnMoIFBST1BfSU5DTFVERV9XSVRIX0FQUExJQ0FUSU9OX0VOQUJMRUQsIG9sZFZhbHVlLCB0aGlzLmluY2x1ZGVXaXRoQXBwbGljYXRpb24gKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5pdCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0QmFzZSBmcHJvaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElMaWJyYXJ5UHJvdmlkZXIgcHJvdmlkZXIgKQorICAgIHsKKyAgICAgICAgc3VwZXIuaW5pdCggZnByb2osIGZ2LCBwcm92aWRlciApOworICAgICAgICAKKyAgICAgICAgdGhpcy5pbmNsdWRlV2l0aEFwcGxpY2F0aW9uID0gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBmcHJvai5nZXRQcm9qZWN0KCk7CisgICAgICAgIAorICAgICAgICBpZiggcHJvamVjdCAhPSBudWxsICkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldCBmID0gZnYuZ2V0UHJvamVjdEZhY2V0KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsIElMaWJyYXJ5UHJvdmlkZXIgY3VycmVudFByb3ZpZGVyIAorICAgICAgICAgICAgICAgID0gTGlicmFyeVByb3ZpZGVyRnJhbWV3b3JrLmdldEN1cnJlbnRQcm92aWRlciggcHJvamVjdCwgZiApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggY3VycmVudFByb3ZpZGVyID09IHByb3ZpZGVyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PElDbGFzc3BhdGhFbnRyeT4gZW50cmllczsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVudHJpZXMgPSBDbGFzc3BhdGhVdGlsLmdldENsYXNzcGF0aEVudHJpZXMoIHByb2plY3QsIGYgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB0aGlzLmluY2x1ZGVXaXRoQXBwbGljYXRpb24gPSBnZXRJbmNsdWRlV2l0aEFwcGxpY2F0aW9uU2V0dGluZyggZW50cmllcyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZ2V0SW5jbHVkZVdpdGhBcHBsaWNhdGlvblNldHRpbmcoIGZpbmFsIExpc3Q8SUNsYXNzcGF0aEVudHJ5PiBlbnRyaWVzICkKKyAgICB7CisgICAgICAgIGZvciggSUNsYXNzcGF0aEVudHJ5IGNwZSA6IGVudHJpZXMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY3BlLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gY3BlLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggcGF0aC5zZWdtZW50Q291bnQoKSA+PSAyICYmIHBhdGguc2VnbWVudCggMCApLmVxdWFscyggSmF2YUNvcmUuVVNFUl9MSUJSQVJZX0NPTlRBSU5FUl9JRCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyIDogY3BlLmdldEV4dHJhQXR0cmlidXRlcygpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGF0dHIuZ2V0TmFtZSgpLmVxdWFscyggSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuQ0xBU1NQQVRIX0NPTVBPTkVOVF9OT05fREVQRU5ERU5DWSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICAKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9jbGFzc3BhdGgvbWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQ3OWFkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2NsYXNzcGF0aC9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMiBAQAorSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXJfRUFSX0xpYnJhcmllc19VcGRhdGVfSm9fPUVBUiBMaWJyYXJpZXMgVXBkYXRlIEpvYgorSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXJfVmVyaWZ5X0VBUl9MaWJyYXJpZXM9VmVyaWZ5IEVBUiBMaWJyYXJpZXMKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9leHBvcnRtb2RlbC9BZGRKYXZhRUVSZWZlcmVuY2VzUGFydGljaXBhbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9leHBvcnRtb2RlbC9BZGRKYXZhRUVSZWZlcmVuY2VzUGFydGljaXBhbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmJlNTdkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2V4cG9ydG1vZGVsL0FkZEphdmFFRVJlZmVyZW5jZXNQYXJ0aWNpcGFudC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uZXhwb3J0bW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5BYnN0cmFjdEZsYXR0ZW5QYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5GbGF0VmlydHVhbENvbXBvbmVudC5GbGF0Q29tcG9uZW50VGFza01vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKKworcHVibGljIGNsYXNzIEFkZEphdmFFRVJlZmVyZW5jZXNQYXJ0aWNpcGFudCBleHRlbmRzIEFic3RyYWN0RmxhdHRlblBhcnRpY2lwYW50IHsKKwkKKwlwdWJsaWMgc3RhdGljIElQYXRoIFdFQkxJQiA9IG5ldyBQYXRoKCIvV0VCLUlORi9saWIiKTsgLy8kTk9OLU5MUy0xJAorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIHNob3VsZElnbm9yZVJlZmVyZW5jZShJVmlydHVhbENvbXBvbmVudCByb290Q29tcG9uZW50LCBJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2VkLCBGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCkgeworCQlpZiAoIXJlZmVyZW5jZWQuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmlzQmluYXJ5KCkpIHsKKwkJCVN0cmluZyBwYXJlbnRUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFQ29tcG9uZW50VHlwZShyb290Q29tcG9uZW50KTsKKwkJCWlmIChJSjJFRUZhY2V0Q29uc3RhbnRzLkVOVEVSUFJJU0VfQVBQTElDQVRJT04uZXF1YWxzKHBhcmVudFR5cGUpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJZWxzZSBpZiAoSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQi5lcXVhbHMocGFyZW50VHlwZSkgJiYgcmVmZXJlbmNlZC5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhXRUJMSUIpKSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IHJvb3RDb21wb25lbnQsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSwgRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwpIHsKKwkJaWYgKCFyZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmlzQmluYXJ5KCkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vZXhwb3J0bW9kZWwvQ2xhc3NwYXRoRGVwZW5kZW5jaWVzQ29sbGVjdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vZXhwb3J0bW9kZWwvQ2xhc3NwYXRoRGVwZW5kZW5jaWVzQ29sbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU4NTAzNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9leHBvcnRtb2RlbC9DbGFzc3BhdGhEZXBlbmRlbmNpZXNDb2xsZWN0b3IuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5leHBvcnRtb2RlbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLkFkZENsYXNzcGF0aExpYlJlZmVyZW5jZXNQYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuSUNsYXNzcGF0aERlcGVuZGVuY3lDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLklDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLklDbGFzc3BhdGhEZXBlbmRlbmN5UmVjZWl2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuV2ViVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5BYnN0cmFjdEZsYXR0ZW5QYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5DaGlsZE1vZHVsZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5GbGF0VmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JQ2hpbGRNb2R1bGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXRGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklGbGF0Rm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklGbGF0UmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuVmlydHVhbENvbXBvbmVudEZsYXR0ZW5VdGlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKKworCitwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoRGVwZW5kZW5jaWVzQ29sbGVjdG9yIGV4dGVuZHMgRmxhdFZpcnR1YWxDb21wb25lbnQgeworCisJcHVibGljIENsYXNzcGF0aERlcGVuZGVuY2llc0NvbGxlY3RvcihJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKKwkJc3VwZXIoY29tcG9uZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gY2FuT3B0aW1pemUoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIG9wdGltaXplKExpc3Q8SUZsYXRSZXNvdXJjZT4gcmVzb3VyY2VzLCBMaXN0PElDaGlsZE1vZHVsZVJlZmVyZW5jZT4gY2hpbGRyZW4pIHsKKwkJaWYgKGdldENvbXBvbmVudCgpICE9IG51bGwpIHsKKwkJCUFic3RyYWN0RmxhdHRlblBhcnRpY2lwYW50IGNsYXNzcGF0aFJlZmVyZW5jZXMgPSBudWxsOworCQkJSVByb2plY3QgcHJvamVjdCA9IGdldENvbXBvbmVudCgpLmdldFByb2plY3QoKTsKKwkJCQorCQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKSB7CisJCQkJY2xhc3NwYXRoUmVmZXJlbmNlcyA9IG5ldyBBZGRDbGFzc3BhdGhMaWJSZWZlcmVuY2VzUGFydGljaXBhbnQoKTsKKwkJCX0KKwkJCWVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgeworCQkJCWNsYXNzcGF0aFJlZmVyZW5jZXMgPSBuZXcgV2ViTGliQ2xhc3NwYXRoUmVmZXJlbmNlc1BhcnRpY2lwYW50KCk7CisJCQl9CisJCQkKKwkJCWlmIChjbGFzc3BhdGhSZWZlcmVuY2VzICE9IG51bGwpIHsKKwkJCQljbGFzc3BhdGhSZWZlcmVuY2VzLmZpbmFsaXplKGdldENvbXBvbmVudCgpLCBudWxsLCByZXNvdXJjZXMpOworCQkJCS8vIFJldHJpZXZlIHRoZSBjaGlsZHJlbiBtb2R1bGVzIGNvbnRyaWJ1dGVkIGJ5IGNsYXNzcGF0aCByZWZlcmVuY2VzIGFuZCAKKwkJCQkvLyBhZGQgdGhlbSBhcyBjaGlsZHJlbiBvZiB0aGlzIEZsYXRWaXJ0dWFsQ29tcG9uZW50IAorCQkJCUxpc3QgPElWaXJ0dWFsUmVmZXJlbmNlPiByZWZUb01vZHVsZXMgPSBjbGFzc3BhdGhSZWZlcmVuY2VzLmdldENoaWxkTW9kdWxlcyhnZXRDb21wb25lbnQoKSwgbnVsbCk7CisJCQkJaWYgKHJlZlRvTW9kdWxlcyAhPSBudWxsKXsKKwkJCQkJZm9yIChJVmlydHVhbFJlZmVyZW5jZSByZWY6cmVmVG9Nb2R1bGVzKXsKKwkJCQkJCUNoaWxkTW9kdWxlUmVmZXJlbmNlIGNtID0gbmV3IENoaWxkTW9kdWxlUmVmZXJlbmNlKHJlZiwgbmV3IFBhdGgoIiIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJTGlzdDxJQ2hpbGRNb2R1bGVSZWZlcmVuY2U+IGR1cGxpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQkJCQlmb3IoIElDaGlsZE1vZHVsZVJlZmVyZW5jZSB0bXAgOiBjaGlsZHJlbiApIHsKKwkJCQkJCQlpZih0bXAuZ2V0UmVsYXRpdmVVUkkoKS5lcXVhbHMoY20uZ2V0UmVsYXRpdmVVUkkoKSkpCisJCQkJCQkJCWR1cGxpY2F0ZXMuYWRkKHRtcCk7CisJCQkJCQl9CisJCQkJCQljaGlsZHJlbi5yZW1vdmVBbGwoZHVwbGljYXRlcyk7CisJCQkJCQljaGlsZHJlbi5hZGQoY20pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXB1YmxpYyBMaXN0IDxJRmxhdEZpbGU+IGZldGNoRmxhdEZpbGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJRmxhdFJlc291cmNlIFtdIHJlc291cmNlcyA9IGZldGNoUmVzb3VyY2VzKCk7CisJCUxpc3Q8SUZsYXRGaWxlPiBmbGF0RmlsZXMgPSBuZXcgQXJyYXlMaXN0PElGbGF0RmlsZT4oKTsKKwkJcmV0dXJuIGZldGNoRmxhdEZpbGVzKHJlc291cmNlcywgZmxhdEZpbGVzKTsKKwl9CisJCisJLyoqCisJICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYW4gYXJyYXkgb2Yge0BsaW5rIElWaXJ0dWFsUmVmZXJlbmNlfSBmb3IgYWxsIG9mCisJICogdGhlIHV0aWxpdHkgbW9kdWxlcyBjb250cmlidXRlZCBieSBjbGFzc3BhdGggZGVwZW5kZW5jaWVzLiAKKwkgKiAKKwkgKiBAcmV0dXJuIC0gYW4gYXJyYXkgb2Yge0BsaW5rIElWaXJ0dWFsUmVmZXJlbmNlfSBvZiB1dGlsaXR5IG1vZHVsZXMKKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCisJICovCisJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0VXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisKKwkJTGlzdCA8SVZpcnR1YWxSZWZlcmVuY2U+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7CisJCWlmIChnZXRDb21wb25lbnQoKSAhPSBudWxsKSB7CQkJCisJCQlMaXN0PFN0cmluZz4gY29tcG9uZW50VHlwZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KElKMkVFRmFjZXRDb25zdGFudHMuVVRJTElUWSk7CisJCQlmb3IgKElDaGlsZE1vZHVsZVJlZmVyZW5jZSBtb2R1bGVSZWY6Z2V0Q2hpbGRNb2R1bGVzKCkpeworCQkJCWlmIChjb21wb25lbnRUeXBlcy5jb250YWlucyhKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVDb21wb25lbnRUeXBlKG1vZHVsZVJlZi5nZXRSZWZlcmVuY2UoKS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpKSkgeworCQkJCQlyZXN1bHQuYWRkKG1vZHVsZVJlZi5nZXRSZWZlcmVuY2UoKSk7CisJCQkJfQorCQkJfQkJCQorCisJCQlpZiAocmVzdWx0LnNpemUoKSA+IDApCisJCQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtyZXN1bHQuc2l6ZSgpXSk7CisJCX0KKwkJcmV0dXJuIG5ldyBJVmlydHVhbFJlZmVyZW5jZVswXTsKKwl9CisKKwlwcml2YXRlIExpc3QgPElGbGF0RmlsZT4gZmV0Y2hGbGF0RmlsZXMoSUZsYXRSZXNvdXJjZVtdIHJlc291cmNlcywgTGlzdDxJRmxhdEZpbGU+IGZsYXRGaWxlcykgeworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgeworCQkJSUZsYXRSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKKwkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGbGF0RmlsZSkgeworCQkJCWlmICgoKElGbGF0RmlsZSkgcmVzb3VyY2UpLmdldEFkYXB0ZXIoRmlsZS5jbGFzcykgIT0gbnVsbCkKKwkJCQkJZmxhdEZpbGVzLmFkZCgoSUZsYXRGaWxlKXJlc291cmNlKTsKKwkJCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmxhdEZvbGRlcikgeworCQkJCWZldGNoRmxhdEZpbGVzKCgoSUZsYXRGb2xkZXIpcmVzb3VyY2UpLm1lbWJlcnMoKSwgZmxhdEZpbGVzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmxhdEZpbGVzOworCX0KKwkKKwlwcml2YXRlIGNsYXNzIFdlYkxpYkNsYXNzcGF0aFJlZmVyZW5jZXNQYXJ0aWNpcGFudCBleHRlbmRzIEFic3RyYWN0RmxhdHRlblBhcnRpY2lwYW50IHsKKwkJcHJpdmF0ZSBMaXN0PElGbGF0UmVzb3VyY2U+IGxpc3Q7CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgZmluYWxpemUoSVZpcnR1YWxDb21wb25lbnQgd2ViQ29tcG9uZW50LCBGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCwgTGlzdDxJRmxhdFJlc291cmNlPiByZXNvdXJjZXMpIHsKKwkJCXRoaXMubGlzdCA9IHJlc291cmNlczsKKwkJCWFkZFJlZmVyZW5jZWRDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoKElDbGFzc3BhdGhEZXBlbmRlbmN5UmVjZWl2ZXIpd2ViQ29tcG9uZW50KTsKKwkJfQorCisJCXByaXZhdGUgdm9pZCBhZGRSZWZlcmVuY2VkQ29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGZpbmFsIElDbGFzc3BhdGhEZXBlbmRlbmN5UmVjZWl2ZXIgd2ViQ29tcG9uZW50KSB7CisJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSB3ZWJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7CisJCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gcmVmc1tpXTsKKwkJCQlmaW5hbCBJUGF0aCBydW50aW1lUGF0aCA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpOworCQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSByZWZlcmVuY2UuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOworCQkJCQorCQkJCWlmICghcnVudGltZVBhdGguZXF1YWxzKFdlYlV0aWxpdGllcy5XRUJMSUIpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkKKwkJCQkvLyBpZiB0aGUgcmVmZXJlbmNlIGNhbm5vdCBleHBvcnQgZGVwZW5kZW5jaWVzLCBza2lwCisJCQkJaWYoICEocmVmZXJlbmNlZENvbXBvbmVudCBpbnN0YW5jZW9mIElDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXIpICkKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAoIXJlZmVyZW5jZWRDb21wb25lbnQuaXNCaW5hcnkoKSAmJiByZWZlcmVuY2VkQ29tcG9uZW50IGluc3RhbmNlb2YgSUNsYXNzcGF0aERlcGVuZGVuY3lQcm92aWRlcikgeworCQkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIGNwUmVmcyA9ICgoSUNsYXNzcGF0aERlcGVuZGVuY3lQcm92aWRlcikgcmVmZXJlbmNlZENvbXBvbmVudCkuZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKTsKKwkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjcFJlZnMubGVuZ3RoOyBqKyspIHsKKwkJCQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIGNwUmVmID0gY3BSZWZzW2pdOworCQkJCQkJSVBhdGggY3BSZWZSdW50aW1lUGF0aCA9IGNwUmVmLmdldFJ1bnRpbWVQYXRoKCk7CisKKwkJCQkJCWlmIChjcFJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkgaW5zdGFuY2VvZiBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudCkgeworCQkJCQkJCUlDbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50IGNwQ29tcCA9IChJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudCkgY3BSZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOworCQkJCQkJCS8vIGRvbid0IHdhbnQgdG8gcHJvY2VzcyBjbGFzcyBmb2xkZXIgcmVmcyBoZXJlCisJCQkJCQkJaWYgKGNwQ29tcC5pc0NsYXNzRm9sZGVyKCkpCisJCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQkJaWYgKCFjcFJlZlJ1bnRpbWVQYXRoLnRvU3RyaW5nKCkuZXF1YWxzKElDbGFzc3BhdGhEZXBlbmRlbmN5UmVjZWl2ZXIuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSKSkKKwkJCQkJCQkJY29udGludWU7CisKKwkJCQkJCQljcFJlZlJ1bnRpbWVQYXRoID0gcnVudGltZVBhdGg7CisJCQkJCQkJbmV3IFZpcnR1YWxDb21wb25lbnRGbGF0dGVuVXRpbGl0eShsaXN0LCBudWxsKS5hZGRGaWxlKGNwQ29tcCwgY3BSZWZSdW50aW1lUGF0aCwgY3BDb21wKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2V4cG9ydG1vZGVsL0pFRUhlaXJhcmNoeUV4cG9ydFBhcnRpY2lwYW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vZXhwb3J0bW9kZWwvSkVFSGVpcmFyY2h5RXhwb3J0UGFydGljaXBhbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTliMDdkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2V4cG9ydG1vZGVsL0pFRUhlaXJhcmNoeUV4cG9ydFBhcnRpY2lwYW50LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBSZWQgSGF0IGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBSZWQgSGF0IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmV4cG9ydG1vZGVsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkFic3RyYWN0RmxhdHRlblBhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklGbGF0RmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5GbGF0VmlydHVhbENvbXBvbmVudC5GbGF0Q29tcG9uZW50VGFza01vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOworCitwdWJsaWMgY2xhc3MgSkVFSGVpcmFyY2h5RXhwb3J0UGFydGljaXBhbnQgZXh0ZW5kcyBBYnN0cmFjdEZsYXR0ZW5QYXJ0aWNpcGFudCB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkVFX1ZFUlNJT04gPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuZXhwb3J0LmVlVmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBbXSBDSElMRFJFTl9FWFRFTlNJT05TID0gbmV3IFN0cmluZyBbXSB7SUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVCwgIi56aXAiLCBJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhULCBJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUIH07ICAvLyROT04tTkxTLTEkCisJcHVibGljIEpFRUhlaXJhcmNoeUV4cG9ydFBhcnRpY2lwYW50KCkgeworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkTW9kdWxlKElWaXJ0dWFsQ29tcG9uZW50IHJvb3RDb21wb25lbnQsCisJCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UsIEZsYXRDb21wb25lbnRUYXNrTW9kZWwgZGF0YU1vZGVsKSB7CisJCVN0cmluZyBwYXJlbnRUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFQ29tcG9uZW50VHlwZShyb290Q29tcG9uZW50KTsKKwkJU3RyaW5nIGNoaWxkVHlwZSA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRUNvbXBvbmVudFR5cGUocmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSk7CisJCXJldHVybiBpc0FwcHJvdmVkTmVzdGluZyhwYXJlbnRUeXBlLCBjaGlsZFR5cGUsIHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuaXNCaW5hcnkoKSk7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIGlzUG9zc2libGVDaGlsZChTdHJpbmcgbmFtZSkgeworCQlmb3IoIGludCBpID0gMDsgaSA8IENISUxEUkVOX0VYVEVOU0lPTlMubGVuZ3RoOyBpKysgKSB7CisJCQlpZiggbmFtZS5lbmRzV2l0aChDSElMRFJFTl9FWFRFTlNJT05TW2ldKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgcm9vdENvbXBvbmVudCwgRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwsIElGbGF0RmlsZSBmaWxlKSB7CisJCWlmIChpc1Bvc3NpYmxlQ2hpbGQoZmlsZS5nZXROYW1lKCkpKSB7CisJCQlTdHJpbmcgcGF0aCA9IG51bGw7CisJCQlJRmlsZSBmID0gKElGaWxlKWZpbGUuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7CisJCQlpZiAoZiAhPSBudWxsICYmIGYuZXhpc3RzKCkpCisJCQkJcGF0aCA9IGYuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOworCQkJZWxzZSB7CisJCQkJRmlsZSBmMiA9IChGaWxlKWZpbGUuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKKwkJCQlpZiAoZjIgIT0gbnVsbCAmJiBmMi5leGlzdHMoKSkgeworCQkJCQlwYXRoID0gZjIuZ2V0QWJzb2x1dGVQYXRoKCk7CisJCQkJfQorCQkJfQorCQkJaWYgKHBhdGggIT0gbnVsbCkgewkKKwkJCQlTdHJpbmcgcGFyZW50VHlwZSA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRUNvbXBvbmVudFR5cGUocm9vdENvbXBvbmVudCk7CisJCQkJU3RyaW5nIHR5cGUgPSBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5MSUJBUkNISVZFVFlQRSArIElQYXRoLlNFUEFSQVRPUjsKKwkJCQlJVmlydHVhbENvbXBvbmVudCBkeW5hbWljQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KAorCQkJCQkJcm9vdENvbXBvbmVudC5nZXRQcm9qZWN0KCksIHR5cGUgKyBwYXRoLCBmaWxlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLm1ha2VBYnNvbHV0ZSgpKTsKKwkJCQlTdHJpbmcgY2hpbGRUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFQ29tcG9uZW50VHlwZShkeW5hbWljQ29tcG9uZW50KTsKKwkJCQlyZXR1cm4gaXNBcHByb3ZlZE5lc3RpbmcocGFyZW50VHlwZSwgY2hpbGRUeXBlLCB0cnVlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qCisJICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBvdGhlcndpc2UsIFdlYkRlcGxveVRlc3QgZmFpbHMKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcHJvdmVkTmVzdGluZyhTdHJpbmcgcGFyZW50VHlwZSwgU3RyaW5nIGNoaWxkVHlwZSwgYm9vbGVhbiBiaW5hcnkpIHsKKwkJaWYoIGNoaWxkVHlwZSA9PSBudWxsICkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYoIElKMkVFRmFjZXRDb25zdGFudHMuVVRJTElUWS5lcXVhbHMoY2hpbGRUeXBlKSAmJiBiaW5hcnkpCisJCQlyZXR1cm4gZmFsc2U7IC8vIGNoaWxkIHV0aWxpdHkgcHJvamVjdCAKKworLy8JCWlmKCBJSjJFRUZhY2V0Q29uc3RhbnRzLlVUSUxJVFkuZXF1YWxzKGNoaWxkVHlwZSkpCisvLwkJCXJldHVybiBmYWxzZTsKKy8vCQlpZiggcGFyZW50VHlwZS5lcXVhbHMoSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQikgJiYgY2hpbGRUeXBlLmVxdWFscyhJSjJFRUZhY2V0Q29uc3RhbnRzLkVKQikpCisvLwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2V4cG9ydG1vZGVsL0phdmFFRUNvbXBvbmVudEV4cG9ydENhbGxiYWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vZXhwb3J0bW9kZWwvSmF2YUVFQ29tcG9uZW50RXhwb3J0Q2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWRmMmJiCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2V4cG9ydG1vZGVsL0phdmFFRUNvbXBvbmVudEV4cG9ydENhbGxiYWNrLmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uZXhwb3J0bW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLkFkZENsYXNzcGF0aEZvbGRlcnNQYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuQWRkQ2xhc3NwYXRoTGliUmVmZXJlbmNlc1BhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5Db21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5KYXZhRUVBcmNoaXZlVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5BcHBDbGllbnRBcmNoaXZlT3BzUmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5GbGF0Q29tcG9uZW50QXJjaGl2ZXIuQ29tcG9uZW50RXhwb3J0Q2FsbGJhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5BcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUxvYWRBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5BYnN0cmFjdEZsYXR0ZW5QYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5GbGF0VmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JQ2hpbGRNb2R1bGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdFZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXR0ZW5QYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5WaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuRmxhdFZpcnR1YWxDb21wb25lbnQuRmxhdENvbXBvbmVudFRhc2tNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7CisKK3B1YmxpYyBjbGFzcyBKYXZhRUVDb21wb25lbnRFeHBvcnRDYWxsYmFjayBpbXBsZW1lbnRzIENvbXBvbmVudEV4cG9ydENhbGxiYWNrIHsKKworCXByaXZhdGUgYm9vbGVhbiBpc0V4cG9ydFNvdXJjZTsKKwlwcml2YXRlIExpc3Q8SVBhdGg+IHppcEVudHJpZXM7CisKKwlwdWJsaWMgSmF2YUVFQ29tcG9uZW50RXhwb3J0Q2FsbGJhY2soYm9vbGVhbiBleHBvcnRTb3VyY2UpIHsKKwkJaXNFeHBvcnRTb3VyY2UgPSBleHBvcnRTb3VyY2U7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNhblNhdmUoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7CisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBQ29tcG9uZW50KGNvbXBvbmVudCkpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwdWJsaWMgSUZsYXRWaXJ0dWFsQ29tcG9uZW50IHNhdmVDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBaaXBPdXRwdXRTdHJlYW0gemlwT3V0cHV0U3RyZWFtLCBMaXN0PElQYXRoPiBlbnRyaWVzKSB0aHJvd3MgQXJjaGl2ZUV4Y2VwdGlvbiB7CisJCUlBcmNoaXZlIGFyY2hpdmVUb1NhdmUgPSBudWxsOworCQl6aXBFbnRyaWVzID0gZW50cmllczsKKwkJdHJ5IHsKKwkJCWFyY2hpdmVUb1NhdmUgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLm9wZW5BcmNoaXZlKGNvbXBvbmVudCk7CisJCQlJQXJjaGl2ZUxvYWRBZGFwdGVyIGxvYWRBZGFwdGVyID0gYXJjaGl2ZVRvU2F2ZS5nZXRMb2FkQWRhcHRlcigpOworCQkJaWYgKGxvYWRBZGFwdGVyIGluc3RhbmNlb2YgQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyKSB7CisJCQkJQ29tcG9uZW50QXJjaGl2ZUxvYWRBZGFwdGVyIGNMb2FkQWRhcHRlciA9IChDb21wb25lbnRBcmNoaXZlTG9hZEFkYXB0ZXIpbG9hZEFkYXB0ZXI7CisJCQkJY0xvYWRBZGFwdGVyLnNldEV4cG9ydFNvdXJjZShpc0V4cG9ydFNvdXJjZSgpKTsKKwkJCX0KKwkJCUxpc3Q8SUFyY2hpdmVSZXNvdXJjZT4gZmlsZXMgPSBhcmNoaXZlVG9TYXZlLmdldEFyY2hpdmVSZXNvdXJjZXMoKTsKKwkJCXNhdmVNYW5pZmVzdChhcmNoaXZlVG9TYXZlLCB6aXBPdXRwdXRTdHJlYW0pOworCQkJZm9yIChJQXJjaGl2ZVJlc291cmNlIGZpbGUgOiBmaWxlcykgeworCQkJCWlmICghaXNNYW5pZmVzdChmaWxlLmdldFBhdGgoKSkpIHsKKwkJCQkJYWRkWmlwRW50cnkoemlwT3V0cHV0U3RyZWFtLCBmaWxlKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBBcmNoaXZlRXhjZXB0aW9uKEFwcENsaWVudEFyY2hpdmVPcHNSZXNvdXJjZUhhbmRsZXIuQVJDSElWRV9PUEVSQVRJT05fT3BlbmluZ0FyY2hpdmUsIGUpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKGFyY2hpdmVUb1NhdmUgIT0gbnVsbCl7CisJCQkJSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5jbG9zZUFyY2hpdmUoYXJjaGl2ZVRvU2F2ZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGdldEZsYXRDb21wb25lbnQoY29tcG9uZW50KTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNNYW5pZmVzdChJUGF0aCBwYXRoKSB7CisJCWlmIChwYXRoLmVxdWFscyhuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXByaXZhdGUgdm9pZCBzYXZlTWFuaWZlc3QoSUFyY2hpdmUgYXJjaGl2ZVRvU2F2ZSwgWmlwT3V0cHV0U3RyZWFtIHppcE91dHB1dFN0cmVhbSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKKwkJSUFyY2hpdmVSZXNvdXJjZSBtYW5pZmVzdCA9IG51bGw7CisJCQorCQlpZiAoYXJjaGl2ZVRvU2F2ZS5jb250YWluc0FyY2hpdmVSZXNvdXJjZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpKSB7CisJCQltYW5pZmVzdCA9IGFyY2hpdmVUb1NhdmUuZ2V0QXJjaGl2ZVJlc291cmNlKG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKSk7CisJCQlhZGRaaXBFbnRyeSh6aXBPdXRwdXRTdHJlYW0sIG1hbmlmZXN0KTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBhZGRaaXBFbnRyeShaaXBPdXRwdXRTdHJlYW0gemlwT3V0cHV0U3RyZWFtLCBJQXJjaGl2ZVJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQXJjaGl2ZVNhdmVGYWlsdXJlRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCUlQYXRoIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCk7CisJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElBcmNoaXZlUmVzb3VyY2UuRElSRUNUT1JZX1RZUEUgJiYgIXBhdGguaGFzVHJhaWxpbmdTZXBhcmF0b3IoKSl7CisJCQkJcGF0aCA9IHBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKKwkJCX0KKwkJCVppcEVudHJ5IGVudHJ5ID0gbmV3IFppcEVudHJ5KHBhdGgudG9TdHJpbmcoKSk7CisJCQlpZiAocmVzb3VyY2UuZ2V0TGFzdE1vZGlmaWVkKCkgPiAwKQorCQkJCWVudHJ5LnNldFRpbWUocmVzb3VyY2UuZ2V0TGFzdE1vZGlmaWVkKCkpOworCQkJemlwT3V0cHV0U3RyZWFtLnB1dE5leHRFbnRyeShlbnRyeSk7CisJCQl6aXBFbnRyaWVzLmFkZChwYXRoKTsKKwkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSUFyY2hpdmVSZXNvdXJjZS5ESVJFQ1RPUllfVFlQRSkgeworCQkJCUFyY2hpdmVVdGlsLmNvcHkocmVzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSwgemlwT3V0cHV0U3RyZWFtKTsKKwkJCX0KKwkJCXppcE91dHB1dFN0cmVhbS5jbG9zZUVudHJ5KCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBBcmNoaXZlU2F2ZUZhaWx1cmVFeGNlcHRpb24oZSk7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIElGbGF0VmlydHVhbENvbXBvbmVudCBnZXRGbGF0Q29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQlGbGF0Q29tcG9uZW50VGFza01vZGVsIG9wdGlvbnMgPSBuZXcgRmxhdENvbXBvbmVudFRhc2tNb2RlbCgpOworCQlvcHRpb25zLnB1dChGbGF0VmlydHVhbENvbXBvbmVudC5QQVJUSUNJUEFOVF9MSVNULCBnZXRQYXJ0aWNpcGFudHMoKSk7CisJCXJldHVybiBuZXcgQ29ubmVjdG9yRXhwb3J0Q29tcG9uZW50KGNvbXBvbmVudCwgb3B0aW9ucyk7CisJfQorCQorCXByb3RlY3RlZCBJRmxhdHRlblBhcnRpY2lwYW50W10gZ2V0UGFydGljaXBhbnRzKCkgeworCQlyZXR1cm4gbmV3IElGbGF0dGVuUGFydGljaXBhbnRbXXsKKwkJCWNyZWF0ZUhpZXJhcmNoeVBhcnRpY2lwYW50KCksCisJCQluZXcgQWRkQ2xhc3NwYXRoTGliUmVmZXJlbmNlc1BhcnRpY2lwYW50KCksCisJCQluZXcgQWRkQ2xhc3NwYXRoRm9sZGVyc1BhcnRpY2lwYW50KCkKKwkJfTsKKwl9CisJCisJcHJvdGVjdGVkIElGbGF0dGVuUGFydGljaXBhbnQgY3JlYXRlSGllcmFyY2h5UGFydGljaXBhbnQoKSB7CisJCXJldHVybiBuZXcgQWJzdHJhY3RGbGF0dGVuUGFydGljaXBhbnQoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgcm9vdENvbXBvbmVudCwgSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlLCBGbGF0Q29tcG9uZW50VGFza01vZGVsIGRhdGFNb2RlbCkgeworCQkJCWlmICghcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5pc0JpbmFyeSgpKSB7CisJCQkJCXJldHVybiB0cnVlOworCQkJCX0KKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX07CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzRXhwb3J0U291cmNlKCkgeworCQlyZXR1cm4gaXNFeHBvcnRTb3VyY2U7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNyZWF0ZU1hbmlmZXN0KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcHVibGljIGNsYXNzIENvbm5lY3RvckV4cG9ydENvbXBvbmVudCBleHRlbmRzIEZsYXRWaXJ0dWFsQ29tcG9uZW50IHsKKworCQlwdWJsaWMgQ29ubmVjdG9yRXhwb3J0Q29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgRmxhdENvbXBvbmVudFRhc2tNb2RlbCBkYXRhTW9kZWwpIHsKKwkJCXN1cGVyKGNvbXBvbmVudCwgZGF0YU1vZGVsKTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXByb3RlY3RlZCBib29sZWFuIGNhbk9wdGltaXplKCkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgb3B0aW1pemUoTGlzdDxJRmxhdFJlc291cmNlPiByZXNvdXJjZXMsIExpc3Q8SUNoaWxkTW9kdWxlUmVmZXJlbmNlPiBjaGlsZHJlbikgeworCQkJaWYgKGdldENvbXBvbmVudCgpICE9IG51bGwpIHsKKwkJCQlWaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkgdXRpbCA9IG5ldyBWaXJ0dWFsQ29tcG9uZW50RmxhdHRlblV0aWxpdHkocmVzb3VyY2VzLCB0aGlzKTsKKwkJCQl0cnkgeworCQkJCQlhZGRDb25zdW1lZFJlZmVyZW5jZXModXRpbCwgZ2V0Q29tcG9uZW50KCksIG5ldyBQYXRoKCIiKSk7IAkvLyROT04tTkxTLTEkCisJCQkJCWFkZFVzZWRSZWZlcmVuY2VzKHV0aWwsIGdldENvbXBvbmVudCgpLCBuZXcgUGF0aCgiIikpOyAJCS8vJE5PTi1OTFMtMSQKKwkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2V4cG9ydG1vZGVsL0phdmFFRVNpbmdsZVJvb3RDYWxsYmFjay5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL2V4cG9ydG1vZGVsL0phdmFFRVNpbmdsZVJvb3RDYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkY2JmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vZXhwb3J0bW9kZWwvSmF2YUVFU2luZ2xlUm9vdENhbGxiYWNrLmphdmEKQEAgLTAsMCArMSwyMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdCBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgUmVkIEhhdCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5leHBvcnRtb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLkFkZENsYXNzcGF0aEZvbGRlcnNQYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuQWRkQ2xhc3NwYXRoTGliUmVmZXJlbmNlc1BhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS5BZGRDbGFzc3BhdGhMaWJSZWZzUHJvdmlkZXJQYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuSVNpbmdsZVJvb3RTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLlJlcGxhY2VNYW5pZmVzdEV4cG9ydFBhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS5TaW5nbGVSb290VXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuU2luZ2xlUm9vdEV4cG9ydFBhcnRpY2lwYW50LlNpbmdsZVJvb3RQYXJ0aWNpcGFudENhbGxiYWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lFbmFibGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuRmlsdGVyUmVzb3VyY2VQYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdHRlblBhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CisKK3B1YmxpYyBjbGFzcyBKYXZhRUVTaW5nbGVSb290Q2FsbGJhY2sgaW1wbGVtZW50cyBTaW5nbGVSb290UGFydGljaXBhbnRDYWxsYmFjayB7CisJLy9XYXJuaW5ncworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOTkVDRVNTQVJZX1JFU09VUkNFX01BUCA9IDEwMDsKKwkKKwkvL0Vycm9ycworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVBUl9QUk9KRUNUX0ZPVU5EID0gMTAxMDA7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRMRUFTVF8xX1JFU09VUkNFX01BUF9NSVNTSU5HID0gMTAxMDE7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9PVVRQVVRfTk9UX1dFQklORl9DTEFTU0VTID0gMTAxMDI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVOVElNRV9QQVRIX05PVF9ST09UX09SX1dFQklORl9DTEFTU0VTID0gMTAxMDM7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05MWV8xX0NPTlRFTlRfUk9PVF9BTExPV0VEID0gMTAxMDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT05FX0NPTlRFTlRfUk9PVF9SRVFVSVJFRCA9IDEwMTA1OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUTEVBU1RfMV9KQVZBX1NPVVJDRV9SRVFVSVJFRCA9IDEwMTA2OworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMQVNTUEFUSF9ERVBFTkRFTkNJRVNfRk9VTkQgPSAxMDEwNzsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FOQ0VMID0gMHgwOworCXByaXZhdGUgU3RyaW5nW10gZmlsdGVyZWRTdWZmaXhlcyA9IG5ldyBTdHJpbmdbXXt9OyAKKwlwdWJsaWMgSmF2YUVFU2luZ2xlUm9vdENhbGxiYWNrKCkgeworCQkvLyBpbnRlbnRpb25hbGx5IGJsYW5rCisJfQorCQorCXB1YmxpYyBKYXZhRUVTaW5nbGVSb290Q2FsbGJhY2soU3RyaW5nW10gZmlsdGVyZWQpIHsKKwkJdGhpcy5maWx0ZXJlZFN1ZmZpeGVzID0gZmlsdGVyZWQ7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEZpbHRlcmVkU3VmZml4ZXMoU3RyaW5nW10gZmlsdGVyZWQpIHsKKwkJdGhpcy5maWx0ZXJlZFN1ZmZpeGVzID0gZmlsdGVyZWQ7CisJfQorCQorCXB1YmxpYyBib29sZWFuIGNhblZhbGlkYXRlKElWaXJ0dWFsQ29tcG9uZW50IHZjKSB7CisJCXJldHVybiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLnVzZXNKYXZhRUVDb21wb25lbnQodmMpOworCX0KKworCXB1YmxpYyB2b2lkIHZhbGlkYXRlKFNpbmdsZVJvb3RVdGlsIHV0aWwsIElWaXJ0dWFsQ29tcG9uZW50IHZjLCBJUHJvamVjdCBwcm9qZWN0LCBMaXN0IHJlc291cmNlTWFwcykgeworCQkvLyBBbHdheXMgcmV0dXJuIGZhbHNlIGZvciBFQVJzIHNvIHRoYXQgbWVtYmVycyBmb3IgRUFSIGFyZSBhbHdheXMgY2FsY3VsYXRlZCBhbmQgajJlZSBtb2R1bGVzIGFyZSBmaWx0ZXJlZCBvdXQKKwkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKSB7IAorCQkJdXRpbC5yZXBvcnRTdGF0dXMoRUFSX1BST0pFQ1RfRk9VTkQpOworCQkJdXRpbC5zZXRWYWxpZGF0ZUZsYWcoQ0FOQ0VMKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJaWYgKHJlc291cmNlTWFwcy5zaXplKCkgPT0gMSkgeworCQkJQ29tcG9uZW50UmVzb3VyY2UgbWFwcGluZyA9IChDb21wb25lbnRSZXNvdXJjZSlyZXNvdXJjZU1hcHMuZ2V0KDApOyAKKwkJCWlmICh1dGlsLmlzUm9vdE1hcHBpbmcobWFwcGluZykpIHsKKwkJCQlJUmVzb3VyY2Ugc291cmNlUmVzb3VyY2UgPSBwcm9qZWN0LmZpbmRNZW1iZXIobWFwcGluZy5nZXRTb3VyY2VQYXRoKCkpOworCQkJCWlmIChzb3VyY2VSZXNvdXJjZSAhPSBudWxsICYmIHNvdXJjZVJlc291cmNlLmV4aXN0cygpKSB7CisJCQkJCWlmIChzb3VyY2VSZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIgJiYgIXV0aWwuaXNTb3VyY2VDb250YWluZXIoKElDb250YWluZXIpIHNvdXJjZVJlc291cmNlKSkgeworCQkJCQkJdXRpbC5yZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuU0lOR0xFX1JPT1RfQ09OVEFJTkVSX0ZPVU5ELCAoSUNvbnRhaW5lcikgc291cmNlUmVzb3VyY2UpOworCQkJCQkJdXRpbC5zZXRWYWxpZGF0ZUZsYWcoQ0FOQ0VMKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJLy92YWxpZGF0ZSB3ZWIgcHJvamVjdHMgZm9yIHNpbmdsZSByb290CisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKKwkJCXZhbGlkYXRlV2ViUHJvamVjdCh1dGlsLCB2YywgcmVzb3VyY2VNYXBzKTsKKwkJCXV0aWwuc2V0VmFsaWRhdGVGbGFnKENBTkNFTCk7CisJCX0KKworCX0KKwkKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVXZWJQcm9qZWN0KFNpbmdsZVJvb3RVdGlsIHV0aWwsIElWaXJ0dWFsQ29tcG9uZW50IHZjLCBMaXN0IHJlc291cmNlTWFwcykgeworCQkvLyBFbnN1cmUgdGhlcmUgYXJlIG9ubHkgYmFzaWMgY29tcG9uZW50IHJlc291cmNlIG1hcHBpbmdzIC0tIG9uZSBmb3IgdGhlIGNvbnRlbnQgZm9sZGVyIAorCQkvLyBhbmQgYW55IGZvciBzcmMgZm9sZGVycyBtYXBwZWQgdG8gV0VCLUlORi9jbGFzc2VzCisJCWlmIChoYXNEZWZhdWx0V2ViUmVzb3VyY2VNYXBwaW5ncyh1dGlsLCByZXNvdXJjZU1hcHMpKSB7CisJCQlJQ29udGFpbmVyW10gamF2YU91dHB1dEZvbGRlcnMgPSB1dGlsLmdldEphdmFPdXRwdXRGb2xkZXJzKCk7CisJCQkvLyBWZXJpZnkgb25seSBvbmUgamF2YSBvdXRwdXQgZm9sZGVyCisJCQlpZiAoamF2YU91dHB1dEZvbGRlcnMubGVuZ3RoID09IDEpIHsKKwkJCQkvLyBWZXJpZnkgdGhlIGphdmEgb3V0cHV0IGZvbGRlciBpcyB0byA8Y29udGVudCByb290Pi9XRUItSU5GL2NsYXNzZXMKKwkJCQlJUGF0aCBqYXZhT3V0cHV0UGF0aCA9IHV0aWwuZ2V0SmF2YU91dHB1dEZvbGRlcnMoKVswXS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CisJCQkJSUNvbnRhaW5lciByb290Q29udGFpbmVyID0gdmMuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKKwkJCQlJUGF0aCBjb21wUm9vdFBhdGggPSByb290Q29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKKwkJCQlpZiAoY29tcFJvb3RQYXRoLmFwcGVuZChKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUykuZXF1YWxzKGphdmFPdXRwdXRQYXRoKSkgeworCQkJCQl1dGlsLnJlcG9ydFN0YXR1cyhJU2luZ2xlUm9vdFN0YXR1cy5TSU5HTEVfUk9PVF9DT05UQUlORVJfRk9VTkQsIHJvb3RDb250YWluZXIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJCXV0aWwucmVwb3J0U3RhdHVzKEpBVkFfT1VUUFVUX05PVF9XRUJJTkZfQ0xBU1NFUyk7CisJCQl9CisJCQllbHNlIHsKKwkJCQl1dGlsLnJlcG9ydFN0YXR1cyhJU2luZ2xlUm9vdFN0YXR1cy5KQVZBX09VVFBVVF9HUkVBVEVSX1RIQU5fMSk7CisJCQl9CisJCX0KKwl9CisJCisJLyoqCisJICogRW5zdXJlIHRoZSBkZWZhdWx0IHdlYiBzZXR1cCBpcyBjb3JyZWN0IHdpdGggb25lIHJlc291cmNlIG1hcCBhbmQgYW55IG51bWJlciBvZiBqYXZhIAorCSAqIHJlc291cmNlIG1hcHMgdG8gV0VCLUlORi9jbGFzc2VzCisJICogCisJICogQHBhcmFtIHJlc291cmNlTWFwcworCSAqIEByZXR1cm4gYm9vbGVhbgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBoYXNEZWZhdWx0V2ViUmVzb3VyY2VNYXBwaW5ncyhTaW5nbGVSb290VXRpbCB1dGlsLCBMaXN0IHJlc291cmNlTWFwcykgeworCQlpbnQgcm9vdFZhbGlkTWFwcyA9IDA7CisJCUlQYXRoIHBhdGhNYXBwZWRUb0NvbnRlbnRSb290ID0gbnVsbDsKKwkJTGlzdDxDb21wb25lbnRSZXNvdXJjZT4gdG1wUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxDb21wb25lbnRSZXNvdXJjZT4oKTsKKwkJCisJCUlQYXRoIHdlYkluZkNsYXNzZXMgPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUykubWFrZUFic29sdXRlKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VNYXBzLnNpemUoKTsgaSsrKSB7CisJCQlDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZU1hcCA9IChDb21wb25lbnRSZXNvdXJjZSkgcmVzb3VyY2VNYXBzLmdldChpKTsKKwkJCUlQYXRoIHNvdXJjZVBhdGggPSByZXNvdXJjZU1hcC5nZXRTb3VyY2VQYXRoKCk7CisJCQlJUGF0aCBydW50aW1lUGF0aCA9IHJlc291cmNlTWFwLmdldFJ1bnRpbWVQYXRoKCk7CisJCQlJUmVzb3VyY2Ugc291cmNlUmVzb3VyY2UgPSB1dGlsLmdldFByb2plY3QoKS5maW5kTWVtYmVyKHNvdXJjZVBhdGgpOworCQkJCisJCQkvLyBWZXJpZnkgaWYgdGhlIG1hcCBpcyBmb3IgdGhlIGNvbnRlbnQgcm9vdAorCQkJaWYgKHV0aWwuaXNSb290TWFwcGluZyhyZXNvdXJjZU1hcCkpIHsKKwkJCQlyb290VmFsaWRNYXBzKys7CisJCQkJaWYgKHBhdGhNYXBwZWRUb0NvbnRlbnRSb290ID09IG51bGwpICAvL3dlIGFyZSBpbnRlcmVzdGVkIG9ubHkgaWYgdGhlIGZpcnN0IHJlc291cmNlIG1hcHBlZCB0byByb290CisJCQkJCXBhdGhNYXBwZWRUb0NvbnRlbnRSb290ID0gc291cmNlUGF0aDsKKwkJCX0gCisJCQkvLyBWZXJpZnkgaWYgdGhlIG1hcCBpcyBmb3IgYSBqYXZhIHNyYyBmb2xkZXIgYW5kIGlzIG1hcHBlZCB0byAiV0VCLUlORi9jbGFzc2VzIgorCQkJZWxzZSBpZiAocnVudGltZVBhdGguZXF1YWxzKHdlYkluZkNsYXNzZXMpKSB7CisJCQkJaWYgKHNvdXJjZVJlc291cmNlICE9IG51bGwgJiYgc291cmNlUmVzb3VyY2UuZXhpc3RzKCkpIHsKKwkJCQkJaWYgKHNvdXJjZVJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lciAmJiAhdXRpbC5pc1NvdXJjZUNvbnRhaW5lcigoSUNvbnRhaW5lcikgc291cmNlUmVzb3VyY2UpKSB7CisJCQkJCQl1dGlsLnJlcG9ydFN0YXR1cyhJU2luZ2xlUm9vdFN0YXR1cy5TT1VSQ0VfTk9UX0pBVkFfQ09OVEFJTkVSLCBzb3VyY2VQYXRoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJdXRpbC5yZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuU09VUkNFX1BBVEhfTk9UX0ZPVU5ELCBzb3VyY2VQYXRoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQkvLyBEbyBub3QgcmVwb3J0IHN0YXR1cyB5ZXQuIEJlbG93IHdlIGRvIHNvbWUgZXh0cmEgdmFsaWRhdGlvbgorCQkJCXRtcFJlc291cmNlcy5hZGQocmVzb3VyY2VNYXApOworCQkJfQkJCQorCQkJaWYgKHV0aWwuZ2V0VmFsaWRhdGVGbGFnKCkgPT0gQ0FOQ0VMKSByZXR1cm4gZmFsc2U7CisJCX0KKwkJCisJCWlmIChwYXRoTWFwcGVkVG9Db250ZW50Um9vdCAhPSBudWxsKXsgIAorCQkJZm9yIChDb21wb25lbnRSZXNvdXJjZSByZXM6dG1wUmVzb3VyY2VzKXsKKwkJCQlJUGF0aCBjb21wbGV0ZVBhdGggPSBwYXRoTWFwcGVkVG9Db250ZW50Um9vdC5hcHBlbmQocmVzLmdldFJ1bnRpbWVQYXRoKCkpOworCQkJCWlmIChjb21wbGV0ZVBhdGguZXF1YWxzKHJlcy5nZXRTb3VyY2VQYXRoKCkpKXsKKwkJCQkJLy8gVGhpcyBtYXBwaW5nIGlzIHJlZHVuZGFudCwgYmVjYXVzZSB0aGVyZSBpcyBhbHJlYWR5IGEgbWFwcGluZyB0aGF0IGluY2x1ZGVzIHRoaXMgcmVzb3VyY2UJCQkKKwkJCQkJdXRpbC5yZXBvcnRTdGF0dXMoVU5ORUNFU1NBUllfUkVTT1VSQ0VfTUFQLCByZXMuZ2V0U291cmNlUGF0aCgpKTsKKwkJCQl9CisJCQkJZWxzZXsKKwkJCQkJLy8gTm90IHJvb3QsIG5vdCBXRUItSU5GL2NsYXNzZXMgYW5kIG5vdCByZWR1bmRhbnQsIHJlcG9ydCBzdGF0dXMKKwkJCQkJdXRpbC5yZXBvcnRTdGF0dXMoUlVOVElNRV9QQVRIX05PVF9ST09UX09SX1dFQklORl9DTEFTU0VTLCByZXMuZ2V0UnVudGltZVBhdGgoKSk7CisJCQkJfQorCQkJCWlmICh1dGlsLmdldFZhbGlkYXRlRmxhZygpID09IENBTkNFTCkgcmV0dXJuIGZhbHNlOworCQkJfQorCQkJdG1wUmVzb3VyY2VzID0gbnVsbDsKKwkJfQorCQkKKwkJLy8gTWFrZSBzdXJlIG9ubHkgb25lIG9mIHRoZSBtYXBzIGlzIHRoZSBjb250ZW50IHJvb3QsIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBpcyBmb3IgdGhlIGphdmEgZm9sZGVyCisJCWlmIChyb290VmFsaWRNYXBzICE9IDEpIHsKKwkJCWlmIChyb290VmFsaWRNYXBzIDwgMSkgeworCQkJCXV0aWwucmVwb3J0U3RhdHVzKE9ORV9DT05URU5UX1JPT1RfUkVRVUlSRUQpOworCQkJfQorCQkJZWxzZSBpZiAocm9vdFZhbGlkTWFwcyA+IDEpIHsKKwkJCQl1dGlsLnJlcG9ydFN0YXR1cyhPTkxZXzFfQ09OVEVOVF9ST09UX0FMTE9XRUQpOworCQkJfQorCQl9CisJCXJldHVybiB1dGlsLmdldFZhbGlkYXRlRmxhZygpID09IENBTkNFTCA/IGZhbHNlIDogdHJ1ZTsKKwl9CisKKwlwdWJsaWMgSUZsYXR0ZW5QYXJ0aWNpcGFudFtdIGdldERlbGVnYXRlUGFydGljaXBhbnRzKCkgeworCQlMaXN0PElGbGF0dGVuUGFydGljaXBhbnQ+IHBhcnRpY2lwYW50cyA9IG5ldyBBcnJheUxpc3Q8SUZsYXR0ZW5QYXJ0aWNpcGFudD4oKTsKKworCQlwYXJ0aWNpcGFudHMuYWRkKG5ldyBKRUVIZWlyYXJjaHlFeHBvcnRQYXJ0aWNpcGFudCgpKTsKKwkJcGFydGljaXBhbnRzLmFkZChGaWx0ZXJSZXNvdXJjZVBhcnRpY2lwYW50LmNyZWF0ZVN1ZmZpeEZpbHRlclBhcnRpY2lwYW50KGZpbHRlcmVkU3VmZml4ZXMpKTsKKwkJcGFydGljaXBhbnRzLmFkZChuZXcgQWRkQ2xhc3NwYXRoTGliUmVmZXJlbmNlc1BhcnRpY2lwYW50KCkpOworCQlwYXJ0aWNpcGFudHMuYWRkKG5ldyBBZGRDbGFzc3BhdGhMaWJSZWZzUHJvdmlkZXJQYXJ0aWNpcGFudCgpKTsKKwkJcGFydGljaXBhbnRzLmFkZChuZXcgQWRkQ2xhc3NwYXRoRm9sZGVyc1BhcnRpY2lwYW50KCkpOworCQlpZiAoQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQuaXNBbGxvd0NsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3koKSkgeworCQkJcGFydGljaXBhbnRzLmFkZChuZXcgUmVwbGFjZU1hbmlmZXN0RXhwb3J0UGFydGljaXBhbnQobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKSk7CisJCX0KKwkJCisJCXJldHVybiBwYXJ0aWNpcGFudHMudG9BcnJheShuZXcgSUZsYXR0ZW5QYXJ0aWNpcGFudFtwYXJ0aWNpcGFudHMuc2l6ZSgpXSk7CisJfQorCQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9CaW5hcnlDb25zdHJ1Y3Rvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvQmluYXJ5Q29uc3RydWN0b3IuamF2YQppbmRleCAyN2VkYzc4Li5jMGFkMWE3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9CaW5hcnlDb25zdHJ1Y3Rvci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0JpbmFyeUNvbnN0cnVjdG9yLmphdmEKQEAgLTExMSw3ICsxMTEsNyBAQAogCQkJCiAJCQlwYXJhbWV0ZXJOYW1lcyA9IG5ldyBTdHJpbmdbcGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlwYXJhbWV0ZXJOYW1lc1tpXSA9ICJhcmciICsgaTsKKwkJCQlwYXJhbWV0ZXJOYW1lc1tpXSA9ICJhcmciICsgaTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CiAgICAgICAgIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvQmluYXJ5TWV0aG9kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9CaW5hcnlNZXRob2QuamF2YQppbmRleCAwMjYxMzBiLi5iOWUxMGVhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9CaW5hcnlNZXRob2QuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9CaW5hcnlNZXRob2QuamF2YQpAQCAtNzQsMTMgKzc0LDEyIEBACiAJCQkJaWYgKFNpZ25hdHVyZS5TSUdfVk9JRC5lcXVhbHMoc2lnbmF0dXJlKSkgewogCQkJCQlyZXR1cm4gbnVsbDsKIAkJCQl9IGVsc2UgaWYgKFNpZ25hdHVyZS5TSUdfQk9PTEVBTi5lcXVhbHMoc2lnbmF0dXJlKSkgewotCQkJCQlyZXR1cm4gImZhbHNlIjsKKwkJCQkJcmV0dXJuICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKIAkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gIjAiOworCQkJCQlyZXR1cm4gIjAiOyAvLyROT04tTkxTLTEkCiAJCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gIm51bGwiOwogCQkJfQorCQkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAJCX0KQEAgLTE0MCw2ICsxMzksNyBAQAogCS8qKgogCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCU1ldGhvZCBvYmogPSAoTWV0aG9kKSBvOwogCQlyZXR1cm4gdGhpcy5nZXROYW1lKCkuZXF1YWxzKG9iai5nZXROYW1lKCkpICYmIApAQCAtMTQ5LDYgKzE0OSw3IEBACiAJLyoqCiAJICogQHNlZSBPYmplY3QjaGFzaENvZGUoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJCXJldHVybiBnZXROYW1lKCkuaGFzaENvZGUoKSAqIGdldFNpZ25hdHVyZSgpLmhhc2hDb2RlKCk7CiAJfQpAQCAtMTY1LDcgKzE2Niw3IEBACiAJCQkKIAkJCXBhcmFtZXRlck5hbWVzID0gbmV3IFN0cmluZ1twYXJhbWV0ZXJUeXBlcy5sZW5ndGhdOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCXBhcmFtZXRlck5hbWVzW2ldID0gImFyZyIgKyBpOworCQkJCXBhcmFtZXRlck5hbWVzW2ldID0gImFyZyIgKyBpOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX0KICAgICAgICAgCkBAIC0yMTUsNyArMjE2LDcgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIHR5cGUgc2lnbmF0dXJlIGtpbmQ6ICIgKyBraW5kKTsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgdHlwZSBzaWduYXR1cmUga2luZDogIiArIGtpbmQpOyAvLyROT04tTkxTLTEkCiAJCQogCQl9CiAJfQpAQCAtMjMwLDggKzIzMSw2IEBACiAJfQogCiAJcHJpdmF0ZSB2b2lkIGdldENhcHR1cmVUeXBlSW1wb3J0cyhTdHJpbmcgdHlwZSwgTGlzdDxTdHJpbmc+IHJlc3VsdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQogCX0KIAogCXByaXZhdGUgdm9pZCBnZXRDbGFzc1R5cGVJbXBvcnRzKFN0cmluZyB0eXBlLCBMaXN0PFN0cmluZz4gcmVzdWx0KSB7CkBAIC0yMzksMTMgKzIzOCw5IEBACiAJfQogCiAJcHJpdmF0ZSB2b2lkIGdldFR5cGVWYXJpYWxibGVJbXBvcnRzKFN0cmluZyB0eXBlLCBMaXN0PFN0cmluZz4gcmVzdWx0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCiAJfQogCiAJcHJpdmF0ZSB2b2lkIGdldFdpbGRjYXJkVHlwZUltcG9ydHMoU3RyaW5nIHR5cGUsIExpc3Q8U3RyaW5nPiByZXN1bHQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0NyZWF0ZUphdmFFRUFydGlmYWN0VGVtcGxhdGVNb2RlbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvQ3JlYXRlSmF2YUVFQXJ0aWZhY3RUZW1wbGF0ZU1vZGVsLmphdmEKaW5kZXggYTNiNDcyNy4uZTIyMjEyMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvQ3JlYXRlSmF2YUVFQXJ0aWZhY3RUZW1wbGF0ZU1vZGVsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvQ3JlYXRlSmF2YUVFQXJ0aWZhY3RUZW1wbGF0ZU1vZGVsLmphdmEKQEAgLTQ2LDcgKzQ2LDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogCi1wdWJsaWMgY2xhc3MgQ3JlYXRlSmF2YUVFQXJ0aWZhY3RUZW1wbGF0ZU1vZGVsIHsKK3B1YmxpYyBjbGFzcyBDcmVhdGVKYXZhRUVBcnRpZmFjdFRlbXBsYXRlTW9kZWwgeyAKKwkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKIAkKIAkvKioKIAkgKiBDb25zdGFudCByZXByZXNlbnRpbmcgbm8gY29tcGF0aWJpbGl0eSBmbGFnLgpAQCAtMTk0LDkgKzE5Nyw4IEBACiAJCVN0cmluZyBxdWFsaWZpZWQgPSBnZXRRdWFsaWZpZWRTdXBlcmNsYXNzTmFtZSgpOwogCQlpZiAoYXJlRmxhZ3NTZXQoRkxBR19RVUFMSUZJRURfU1VQRVJDTEFTU19OQU1FKSB8fCBlcXVhbFNpbXBsZU5hbWVzKGdldENsYXNzTmFtZSgpLCBxdWFsaWZpZWQpKSB7CiAJCQlyZXR1cm4gcXVhbGlmaWVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKHF1YWxpZmllZCk7CiAJCX0KKwkJcmV0dXJuIFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKHF1YWxpZmllZCk7CiAJfQogCQogCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkU3VwZXJjbGFzc05hbWUoKSB7CkBAIC0zMzQsMTYgKzMzNiwxNyBAQAogCQkgICAgICAgIGZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kIDogbWV0aG9kcykgewogCQkgICAgICAgIAl1bmltcGxlbWVudGVkTWV0aG9kcy5hZGQobmV3IFNvdXJjZU1ldGhvZChtZXRob2QpKTsKIAkJICAgICAgICB9CisJCSAgICAgICAgLy8gcHJvY2VzcyBzdXBlciBpbnRlcmZhY2VzCisJCQkgICAgTGlzdDxUeXBlPiBzdXBlckludGVyZmFjZXMgPSBkZWNsYXJhdGlvbkZyb21UeXBlLnN1cGVySW50ZXJmYWNlVHlwZXMoKTsKKwkJCSAgICBmb3IgKFR5cGUgc3VwZXJJbnRlcmZhY2UgOiBzdXBlckludGVyZmFjZXMpIHsKKwkJCSAgICAJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSBzdXBlckludGVyZmFjZS5yZXNvbHZlQmluZGluZygpOworCQkJICAgIAlJVHlwZSBzdXBlckludGVyZmFjZVR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShiaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKSk7CisJCQkJCWlmIChzdXBlckludGVyZmFjZVR5cGUgIT0gbnVsbCkgCisJCQkJCQlnZXRVbmltcGxlbWVudGVkTWV0aG9kMChzdXBlckludGVyZmFjZVR5cGUsIHVuaW1wbGVtZW50ZWRNZXRob2RzKTsKKwkJCSAgICB9CiAJCSAgICB9CiAJCSAgICAKLQkJICAgIC8vIHByb2Nlc3Mgc3VwZXIgaW50ZXJmYWNlcwotCQkgICAgTGlzdDxUeXBlPiBzdXBlckludGVyZmFjZXMgPSBkZWNsYXJhdGlvbkZyb21UeXBlLnN1cGVySW50ZXJmYWNlVHlwZXMoKTsKLQkJICAgIGZvciAoVHlwZSBzdXBlckludGVyZmFjZSA6IHN1cGVySW50ZXJmYWNlcykgewotCQkgICAgCUlUeXBlQmluZGluZyBiaW5kaW5nID0gc3VwZXJJbnRlcmZhY2UucmVzb2x2ZUJpbmRpbmcoKTsKLQkJICAgIAlJVHlwZSBzdXBlckludGVyZmFjZVR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZShiaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQkJaWYgKHN1cGVySW50ZXJmYWNlVHlwZSAhPSBudWxsKSAKLQkJCQkJZ2V0VW5pbXBsZW1lbnRlZE1ldGhvZDAoc3VwZXJJbnRlcmZhY2VUeXBlLCB1bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0JCSAgICB9CisJCSAgIAogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9JbXBvcnRzQ29sbGVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvSW1wb3J0c0NvbGxlY3Rpb24uamF2YQppbmRleCBkZTA0NTg0Li5hMWNlN2E3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9JbXBvcnRzQ29sbGVjdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0ltcG9ydHNDb2xsZWN0aW9uLmphdmEKQEAgLTg2LDE0ICs4NiwxNCBAQAogCQlyZXR1cm4gY29sbGVjdGlvbi50b0FycmF5KGEpOwogCX0KIAkKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbXBvcnRJbkphdmFMYW5nKFN0cmluZyBhcmcpIHsKLSAgICAJcmV0dXJuIGFyZy5zdGFydHNXaXRoKCJqYXZhLmxhbmcuIik7IAorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbXBvcnRJbkphdmFMYW5nKFN0cmluZyBxdWlsaWZpZWROYW1lKSB7CisgICAgCVN0cmluZyBxdWFsaWZpZXIgPSBTaWduYXR1cmUuZ2V0UXVhbGlmaWVyKHF1aWxpZmllZE5hbWUpOworICAgIAlyZXR1cm4gcXVhbGlmaWVyLmVxdWFscygiamF2YS5sYW5nIik7ICAvLyROT04tTkxTLTEkCiAgICAgfQogICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0ltcG9ydEluU2FtZVBhY2thZ2UoU3RyaW5nIGFyZykgewotICAgIAlTdHJpbmcgcXVhbGlmaWVyID0gU2lnbmF0dXJlLmdldFF1YWxpZmllcihhcmcpOwotICAgIAkKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNJbXBvcnRJblNhbWVQYWNrYWdlKFN0cmluZyBxdWlsaWZpZWROYW1lKSB7CisgICAgCVN0cmluZyBxdWFsaWZpZXIgPSBTaWduYXR1cmUuZ2V0UXVhbGlmaWVyKHF1aWxpZmllZE5hbWUpOwogICAgIAlyZXR1cm4gcXVhbGlmaWVyLmVxdWFscyhtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSk7CiAgICAgfQotCisgICAgCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9KQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0pBUkRlcGVuZGVuY3lEYXRhTW9kZWxQcm92aWRlci5qYXZhCmluZGV4IDgyYWY2OGEuLjlmNWYyMWIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0pBUkRlcGVuZGVuY3lEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0pBUkRlcGVuZGVuY3lEYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBKQVJEZXBlbmRlbmN5RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSkFSRGVwZW5kZW5jeURhdGFNb2RlbFByb3BlcnRpZXMgewogCisJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewogCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoRUFSX1BST0pFQ1RfTkFNRSk7CkBAIC00NCwxMiArNDUsMTQgQEAKIAkJcmV0dXJuIHByb3BlcnR5TmFtZXM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgaW5pdCgpIHsKIAkJc3VwZXIuaW5pdCgpOwogCQlJRGF0YU1vZGVsIHVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlci5jbGFzcyk7CiAJCW1vZGVsLmFkZE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9VUERBVEVfTUFJTkZFU1QsIHVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpBUl9NQU5JUFVMQVRJT05fVFlQRSkpIHsKIAkJCXJldHVybiBuZXcgSW50ZWdlcihKQVJfTUFOSVBVTEFUSU9OX0FERCk7CkBAIC03Niw2ICs3OSw3IEBACiAJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZ2V0U3RyaW5nUHJvcGVydHkoT1BQT1NJVEVfUFJPSkVDVF9OQU1FKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKIAkJcmV0dXJuIG5ldyBKQVJEZXBlbmRlbmN5T3BlcmF0aW9uKG1vZGVsKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9KQVJEZXBlbmRlbmN5T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9KQVJEZXBlbmRlbmN5T3BlcmF0aW9uLmphdmEKaW5kZXggMWYwYTc3Mi4uMGI2MjJjYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvSkFSRGVwZW5kZW5jeU9wZXJhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0pBUkRlcGVuZGVuY3lPcGVyYXRpb24uamF2YQpAQCAtMjgsNyArMjgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlcjsKQEAgLTQyLDcgKzQxLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5Eb05vdFVzZU1lVGhpc1dpbGxCZURlbGV0ZWRQb3N0MTU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbnMuSUhlYWRsZXNzUnVubmFibGVXaXRoUHJvZ3Jlc3M7CiAKIC8qKgogICoge0BsaW5rIERvTm90VXNlTWVUaGlzV2lsbEJlRGVsZXRlZFBvc3QxNX0KQEAgLTU1LDEzICs1MywxMyBAQAogCQlzdXBlcihkYXRhTW9kZWwpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAJCXJldHVybiBudWxsOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAJCkBAIC03MSwxMyArNjksMTIgQEAKIAkJdmFsaWRhdGVFZGl0KG1vZGVsKTsKIAkJbW9uaXRvci5iZWdpblRhc2soIiIsIDIpOyAvLyROT04tTkxTLTEkCiAJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24gbWZPcGVyYXRpb24gPSBjcmVhdGVNYW5pZmVzdE9wZXJhdGlvbihtb2RlbCk7Ci0JCUlIZWFkbGVzc1J1bm5hYmxlV2l0aFByb2dyZXNzIGJ1aWxkUGF0aE9wZXJhdGlvbiA9IGNyZWF0ZUJ1aWxkUGF0aE9wZXJhdGlvbihtb2RlbCk7CiAJCXRyeSB7CiAJCQltZk9wZXJhdGlvbi5leGVjdXRlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSksIG51bGwpOwogCQkJLy8gTm8gbG9uZ2VyIG1hbmlwdWxhdGluZyBidWlsZCBwYXRoLi4uIGNvbnRhaW5lcnMgd2lsbCBjYWxjdWxhdGUKIAkJCS8vYnVpbGRQYXRoT3BlcmF0aW9uLnJ1bihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0KIAl9CiAKQEAgLTEwNyw2ICsxMDQsNyBAQAogCX0KIAogCQorCUBPdmVycmlkZQogCXB1YmxpYyBmaW5hbCBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGFkYXB0YWJsZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCQogCQlJUHJvamVjdCBwcm9qID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEpBUkRlcGVuZGVuY3lEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkpOwpAQCAtMTYxLDE1ICsxNTksMTQgQEAKIAkJCQl0cnkgewogCQkJCQlzYXZlTW9kZWwoY2xwTW9kZWwsIG1vbml0b3IpOwogCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQl9CQkJCiAJCX0gZmluYWxseSB7Ci0JCQlpZiAoY2xwTW9kZWwgIT0gbnVsbCkKLQkJCQljbHBNb2RlbC5kaXNwb3NlKCk7CQkJCisJCQljbHBNb2RlbC5kaXNwb3NlKCk7CQkJCiAJCQlpZiAobW9uaXRvciAhPSBudWxsKQogCQkJCW1vbml0b3IuZG9uZSgpOwogCQl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9KYXZhTW9kZWxVdGlsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9KYXZhTW9kZWxVdGlsLmphdmEKaW5kZXggMWQxNDdkZi4uYTViODVjMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvSmF2YU1vZGVsVXRpbC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL0phdmFNb2RlbFV0aWwuamF2YQpAQCAtMjcwLDkgKzI3MCw4IEBACiAJCUlUeXBlIG91dGVyVHlwZT0gdHlwZS5nZXREZWNsYXJpbmdUeXBlKCk7CiAJCWlmIChvdXRlclR5cGUgIT0gbnVsbCkgewogCQkJcmV0dXJuIGdldEZ1bGx5UXVhbGlmaWVkTmFtZShvdXRlclR5cGUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKIAkJfQorCQlyZXR1cm4gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwogCX0KIAkKIAkKQEAgLTUyNyw5ICs1MjYsOCBAQAogCQkJCXJldHVybiBKYXZhTW9kZWxVdGlsLmNvbmNhdGVuYXRlTmFtZShyZXNvbHZlZE5hbWVzWzBdWzBdLCByZXNvbHZlZE5hbWVzWzBdWzFdKTsKIAkJCX0KIAkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIFNpZ25hdHVyZS50b1N0cmluZyhyZWZUeXBlU2lnLnN1YnN0cmluZyhhcnJheUNvdW50KSk7CiAJCX0KKwkJcmV0dXJuIFNpZ25hdHVyZS50b1N0cmluZyhyZWZUeXBlU2lnLnN1YnN0cmluZyhhcnJheUNvdW50KSk7CiAJfQogCQogCS8qKgpAQCAtODU4LDkgKzg1Niw4IEBACiAJCWludCBpID0gb2xkTmFtZS5sYXN0SW5kZXhPZignLicpOwogCQlpZiAoaSAhPSAtMSkgewogCQkJcmV0dXJuIG5ld01haW5OYW1lICsgb2xkTmFtZS5zdWJzdHJpbmcoaSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmV3TWFpbk5hbWU7CiAJCX0KKwkJcmV0dXJuIG5ld01haW5OYW1lOwogCX0JCiAJCiAJcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW1wbGljaXRJbXBvcnQoU3RyaW5nIHF1YWxpZmllciwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewpAQCAtODkxLDcgKzg4OCw2IEBACiAJCUlDb21waWxhdGlvblVuaXQgY3U9IG1lbWJlci5nZXRDb21waWxhdGlvblVuaXQoKTsKIAkJaWYgKGN1ICE9IG51bGwpCiAJCQlyZXR1cm4gY3U7Ci0JCWVsc2UKLQkJCXJldHVybiBtZW1iZXIuZ2V0Q2xhc3NGaWxlKCk7CisJCXJldHVybiBtZW1iZXIuZ2V0Q2xhc3NGaWxlKCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL05ld0phdmFDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggYjA0MjhkNy4uMzU2ZTBkMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9OZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0xMyw2ICsxMyw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkFCU1RSQUNUX01FVEhPRFM7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlNUUlVDVE9SOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5HRU5FUkFURV9ERDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0VfRlJBR01FTlRfUk9PVDsKQEAgLTI2LDcgKzI3LDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUVVBTElGSUVEX0NMQVNTX05BTUU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVI7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNVUEVSQ0xBU1M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFTkVSQVRFX0REOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CiBpbXBvcnQgamF2YS5uZXQuVVJJOwpAQCAtNDcsOSArNDcsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFQ29tbW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7CkBAIC0xMjAsMTEgKzEyMCwxMSBAQAogCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKIAkJCX0KIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCQkvLyBFbnN1cmUgdGhlIHNlbGVjdGVkIGZvbGRlciBpcyBhIHZhbGlkIGphdmEgc291cmNlIGZvbGRlciBmb3IgdGhlIGNvbXBvbmVudAogCQlJRm9sZGVyIHNvdXJjZWZvbGRlciA9IGdldEphdmFTb3VyY2VGb2xkZXIoKTsKLQkJaWYgKHNvdXJjZWZvbGRlciA9PSBudWxsIHx8IChzb3VyY2Vmb2xkZXIgIT0gbnVsbCAmJiAhc291cmNlZm9sZGVyLmdldEZ1bGxQYXRoKCkuZXF1YWxzKG5ldyBQYXRoKGZvbGRlckZ1bGxQYXRoKSkpKSB7CisJCWlmIChzb3VyY2Vmb2xkZXIgPT0gbnVsbCB8fCAoIXNvdXJjZWZvbGRlci5nZXRGdWxsUGF0aCgpLmVxdWFscyhuZXcgUGF0aChmb2xkZXJGdWxsUGF0aCkpKSkgewogCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfQ0xBU1NfRk9MREVSX05PVF9TT1VSQ0UsIG5ldyBTdHJpbmdbXXtmb2xkZXJGdWxsUGF0aH0pOwogCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhtc2cpOwogCQl9CkBAIC0xNjUsNiArMTY1LDcgQEAKIAkgKiAKIAkgKiBAcmV0dXJuIFdUUE9wZXJhdGlvbgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7CiAJCXJldHVybiBuZXcgTmV3SmF2YUNsYXNzT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKIAl9CkBAIC0xNzUsNiArMTc2LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI2dldFByb3BlcnR5TmFtZXMoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKIAkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CiAJCXByb3BlcnR5TmFtZXMuYWRkKFNPVVJDRV9GT0xERVIpOwpAQCAtMjA3LDYgKzIwOSw3IEBACiAJICogQHBhcmFtIHByb3BlcnR5TmFtZQogCSAqIEByZXR1cm4gZGVmYXVsdCBvYmplY3QgdmFsdWUgb2YgdGhlIHByb3BlcnR5CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQkvLyBHZXQgdGhlIGRlZmF1bHQgc291cmNlIGZvbGRlciBmb3IgdGhlIHByb2plY3QKIAkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU09VUkNFX0ZPTERFUikpIHsKQEAgLTI3NCw2ICsyNzcsNyBAQAogCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKIAkgKiBAcmV0dXJuIElTdGF0dXMgb2YgdGhlIHZhbGlkaXR5IG9mIHRoZSBzcGVjaWZpZWMgcHJvcGVydHkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCUlTdGF0dXMgcmVzdWx0ID0gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKIAkJaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQuaXNPSygpKQpAQCAtNDEwLDcgKzQxNCw3IEBACiAJCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKIAkJCQl9CiAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfQogCQkvLyBSZXR1cm4gc3RhdHVzIG9mIHNwZWNpZmllZCBzdXBlcmNsYXNzCkBAIC00NjIsNyArNDY2LDEzIEBACiAJfQogCQogCXByb3RlY3RlZCBJU3RhdHVzIGNhbkNyZWF0ZVR5cGVJbkNsYXNzcGF0aChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB0eXBlTmFtZSkgewotCQlJUGFja2FnZUZyYWdtZW50IHBhY2sgPSBnZXRKYXZhUGFja2FnZUZyYWdtZW50Um9vdCgpLmdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSk7CisJCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2tSb290ID0gZ2V0SmF2YVBhY2thZ2VGcmFnbWVudFJvb3QoKTsKKwkJSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gbnVsbDsKKwkJLy8gYnVnIDMwODAxMyAtIGdldEphdmFQYWNrYWdlRnJhZ21lbnRSb290KCkgY2FuIHJldHVybiBudWxsLSBuZWVkIHRvIGNoZWNrIGZvciB0aGF0CisJCWlmIChwYWNrUm9vdCAhPSBudWxsKQorCQl7CisJCQlwYWNrID0gcGFja1Jvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKTsKKwkJfQogCQlpZiAocGFjayAhPSBudWxsKSB7CiAJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFjay5nZXRDb21waWxhdGlvblVuaXQodHlwZU5hbWUgKyBKYXZhTW9kZWxVdGlsLkRFRkFVTFRfQ1VfU1VGRklYKTsKIAkJCVN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUgPSBKYXZhTW9kZWxVdGlsLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShjdS5nZXRUeXBlKHR5cGVOYW1lKSk7CkBAIC00ODYsNyArNDk2LDcgQEAKIAkJCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobWVzc2FnZSk7IAogCQkJCQl9CiAJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7CisJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJfQogCQkJfQogCQl9CkBAIC01NTMsNiArNTYzLDcgQEAKIAkgKiAKIAkgKiBAcmV0dXJuIGJvb2xlYW4gaWYgcHJvcGVydHkgc2V0IHN1Y2Nlc3NmdWxseQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7CiAJCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKIAkJaWYgKHJlc3VsdCkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvTmV3SmF2YUNsYXNzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9OZXdKYXZhQ2xhc3NPcGVyYXRpb24uamF2YQppbmRleCBjZDY3YmVhLi5mMzY0ZDAwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9OZXdKYXZhQ2xhc3NPcGVyYXRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9OZXdKYXZhQ2xhc3NPcGVyYXRpb24uamF2YQpAQCAtNTEsOCArNTEsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKQEAgLTE3MCw3ICsxNzAsNyBAQAogCQkJdHJ5IHsKIAkJCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJfQogCQl9CiAJCS8vIFJldHVybiB0aGUgc291cmNlIGZvbGRlcgpAQCAtMjAxLDcgKzIwMSw3IEBACiAJCQl0cnkgewogCQkJCXBhY2sgPSBwYWNrUm9vdC5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGFja05hbWUsIHRydWUsIG51bGwpOwogCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQl9CiAJCX0KIAkJLy8gUmV0dXJuIHRoZSBwYWNrYWdlCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAkJCX0KIAkJCS8vIGVkaXRNb2RlbC5nZXRXb3JraW5nQ29weShjdSwgdHJ1ZSk7IC8vVHJhY2sgQ1UuCiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGV4KTsKIAkJfQogCX0KIApAQCAtMzcwLDEyICszNzAsMTMgQEAKIAkgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBhY2NlcHQgbnVsbCBwYXJhbWV0ZXJzLiAgSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuCiAJICogQHNlZSBOZXdKYXZhQ2xhc3NPcGVyYXRpb24jZ2V0SmF2YUZpbGVDb250ZW50KElQYWNrYWdlRnJhZ21lbnQsIFN0cmluZykKIAkgKiAKLQkgKiBAcGFyYW0gc3VwZXJjbGFzc05hbWUKKwkgKiBAcGFyYW0gc3VwZXJDbGFzcwogCSAqIEBwYXJhbSBjbGFzc05hbWUKIAkgKiBAcGFyYW0gaW50ZXJmYWNlcwogCSAqIEByZXR1cm4gU3RyaW5nIGNsYXNzIGRlY2xhcmF0aW9uIHN0cmluZwogCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENsYXNzRGVjbGFyYXRpb24oU3RyaW5nIHN1cGVyY2xhc3NOYW1lLCBTdHJpbmcgY2xhc3NOYW1lLCBMaXN0IGludGVyZmFjZXMpIHsKKwlwcml2YXRlIFN0cmluZyBnZXRDbGFzc0RlY2xhcmF0aW9uKFN0cmluZyBzdXBlckNsYXNzLCBTdHJpbmcgY2xhc3NOYW1lLCBMaXN0IGludGVyZmFjZXMpIHsKKwkJU3RyaW5nIGlubmVyU3VwZXJDbGFzcyA9IHN1cGVyQ2xhc3M7CiAJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAkJLy8gQXBwZW5kIGFwcHJvcHJpYXRlIG1vZGlmaWVycwogCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KE1PRElGSUVSX1BVQkxJQykpCkBAIC0zODksMTEgKzM5MCwxMSBAQAogCQkvLyBBZGQgdGhlIGNsYXNzIG5hbWUKIAkJc2IuYXBwZW5kKGNsYXNzTmFtZSArIFNQQUNFKTsKIAkJLy8gSWYgdGhlcmUgaXMgYSBzdXBlcmNsYXNzLCBhZGQgdGhlIGV4dGVuZHMgYW5kIHN1cGVyIGNsYXNzIG5hbWUKLQkJaWYgKHN1cGVyY2xhc3NOYW1lICE9IG51bGwgJiYgc3VwZXJjbGFzc05hbWUubGVuZ3RoKCkgPiAwICYmICFzdXBlcmNsYXNzTmFtZS5lcXVhbHMoSkFWQV9MQU5HX09CSkVDVCkpIHsKLQkJCWludCBpbmRleCA9IHN1cGVyY2xhc3NOYW1lLmxhc3RJbmRleE9mKERPVCk7CisJCWlmIChpbm5lclN1cGVyQ2xhc3MgIT0gbnVsbCAmJiBpbm5lclN1cGVyQ2xhc3MubGVuZ3RoKCkgPiAwICYmICFpbm5lclN1cGVyQ2xhc3MuZXF1YWxzKEpBVkFfTEFOR19PQkpFQ1QpKSB7CisJCQlpbnQgaW5kZXggPSBpbm5lclN1cGVyQ2xhc3MubGFzdEluZGV4T2YoRE9UKTsKIAkJCWlmIChpbmRleCAhPSAtMSkKLQkJCQlzdXBlcmNsYXNzTmFtZSA9IHN1cGVyY2xhc3NOYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJc2IuYXBwZW5kKEVYVEVORFMgKyBzdXBlcmNsYXNzTmFtZSArIFNQQUNFKTsKKwkJCQlpbm5lclN1cGVyQ2xhc3MgPSBpbm5lclN1cGVyQ2xhc3Muc3Vic3RyaW5nKGluZGV4ICsgMSk7CisJCQlzYi5hcHBlbmQoRVhURU5EUyArIGlubmVyU3VwZXJDbGFzcyArIFNQQUNFKTsKIAkJfQogCQkvLyBJZiB0aGVyZSBhcmUgaW50ZXJmYWNlcywgYWRkIHRoZSBpbXBsZW1lbnRzIGFuZCB0aGVuIGludGVyYXRlIG92ZXIgdGhlIGludGVyZmFjZSBsaXN0CiAJCWlmIChpbnRlcmZhY2VzICE9IG51bGwgJiYgaW50ZXJmYWNlcy5zaXplKCkgPiAwKSB7CkBAIC00NTgsNyArNDU5LDcgQEAKIAkJCXRyeSB7CiAJCQkJc3VwZXJDbGFzc1R5cGUgPSBqYXZhUHJvai5maW5kVHlwZShzdXBlcmNsYXNzTmFtZSk7CiAJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfQogCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KENPTlNUUlVDVE9SKSkgewpAQCAtNDc0LDcgKzQ3NSw3IEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfQogCQkvLyBBZGQgdW5pbXBsZW1lbnRlZCBtZXRob2RzIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZXMgbGlzdApAQCAtNTEyLDcgKzUxMyw3IEBACiAJCQkJfSAKIAkJCX0KIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC01NDIsNyArNTQzLDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCQkvLyBSZXR1cm4gbWV0aG9kIHN0dWJzIHN0cmluZwogCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKQEAgLTU3OSw3ICs1ODAsNyBAQAogCQkJCX0KIAkJCX0KIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9CiAJCS8vIFJldHVybiBtZXRob2Qgc3R1YnMgc3RyaW5nCiAJCXJldHVybiBzYi50b1N0cmluZygpOwpAQCAtNzQ4LDcgKzc0OSw3IEBACiAJCQlzYi5hcHBlbmQobGluZVNlcGFyYXRvcik7CiAJCQlzYi5hcHBlbmQobGluZVNlcGFyYXRvcik7CiAJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKIAl9CkBAIC04NzYsNyArODc3LDYgQEAKIAlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKQogCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIGRvRXhlY3V0ZShtb25pdG9yLCBpbmZvKTsKIAl9CiAJCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9OZXdKYXZhRUVBcnRpZmFjdENsYXNzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9OZXdKYXZhRUVBcnRpZmFjdENsYXNzT3BlcmF0aW9uLmphdmEKaW5kZXggZTc4M2QxMy4uYzE2YzFhZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvTmV3SmF2YUVFQXJ0aWZhY3RDbGFzc09wZXJhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL05ld0phdmFFRUFydGlmYWN0Q2xhc3NPcGVyYXRpb24uamF2YQpAQCAtMTgwLDkgKzE4MCw4IEBACiAJCQogCQlpZiAoZHluYW1pY1RyYW5zbGF0aW9uKSB7CiAJCQlyZXR1cm4gZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZShwbHVnaW4sIHRlbXBsYXRlTW9kZWwsIHRlbXBsYXRlRmlsZSwgbW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZSh0ZW1wbGF0ZU1vZGVsLCB0ZW1wbGF0ZUltcGwpOwogCQl9CisJCXJldHVybiBnZW5lcmF0ZVRlbXBsYXRlU291cmNlKHRlbXBsYXRlTW9kZWwsIHRlbXBsYXRlSW1wbCk7CiAJfQogCQogCS8qKgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvU291cmNlTWV0aG9kLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9Tb3VyY2VNZXRob2QuamF2YQppbmRleCA4ZDA2MmVkLi5hZjBlMTZkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9Tb3VyY2VNZXRob2QuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9Tb3VyY2VNZXRob2QuamF2YQpAQCAtODQsMTMgKzg0LDEyIEBACiAJCQlpZiAoY29kZSA9PSBQcmltaXRpdmVUeXBlLlZPSUQpIHsKIAkJCQlyZXR1cm4gbnVsbDsKIAkJCX0gZWxzZSBpZiAoY29kZSA9PSBQcmltaXRpdmVUeXBlLkJPT0xFQU4pIHsKLQkJCQlyZXR1cm4gImZhbHNlIjsKKwkJCQlyZXR1cm4gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAogCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gIjAiOworCQkJCXJldHVybiAiMCI7IC8vJE5PTi1OTFMtMSQKIAkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiAibnVsbCI7CiAJCX0KKwkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAogCX0KIAkKIAkvKioKQEAgLTE0NCw2ICsxNDMsNyBAQAogCS8qKgogCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCU1ldGhvZCBvYmogPSAoTWV0aG9kKSBvOwogCQlyZXR1cm4gdGhpcy5nZXROYW1lKCkuZXF1YWxzKG9iai5nZXROYW1lKCkpICYmIApAQCAtMTUzLDYgKzE1Myw3IEBACiAJLyoqCiAJICogQHNlZSBPYmplY3QjaGFzaENvZGUoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJCXJldHVybiBnZXROYW1lKCkuaGFzaENvZGUoKSAqIGdldFNpZ25hdHVyZSgpLmhhc2hDb2RlKCk7CiAJfQpAQCAtMjI2LDcgKzIyNyw3IEBACiAJCiAJcHJpdmF0ZSB2b2lkIGdldFF1YWxpZmllZFR5cGVJbXBvcnRzKFR5cGUgdHlwZSwgTGlzdDxTdHJpbmc+IHJlc3VsdCkgewogCQlRdWFsaWZpZWRUeXBlIHF1YWxpZmllZFR5cGUgPSAoUXVhbGlmaWVkVHlwZSkgdHlwZTsKLQkJcmVzdWx0LmFkZChxdWFsaWZpZWRUeXBlLmdldFF1YWxpZmllcigpICsgIi4iICsgcXVhbGlmaWVkVHlwZS5nZXROYW1lKCkpOworCQlyZXN1bHQuYWRkKHF1YWxpZmllZFR5cGUuZ2V0UXVhbGlmaWVyKCkgKyAiLiIgKyBxdWFsaWZpZWRUeXBlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIAlwcml2YXRlIHZvaWQgZ2V0V2lsZGNhcmRUeXBlSW1wb3J0cyhUeXBlIHR5cGUsIExpc3Q8U3RyaW5nPiByZXN1bHQpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL1VwZGF0ZUphdmFCdWlsZFBhdGhPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbW1vbi9vcGVyYXRpb25zL1VwZGF0ZUphdmFCdWlsZFBhdGhPcGVyYXRpb24uamF2YQppbmRleCA5YmE2MmI5Li5hYTcyNjc0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21tb24vb3BlcmF0aW9ucy9VcGRhdGVKYXZhQnVpbGRQYXRoT3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tbW9uL29wZXJhdGlvbnMvVXBkYXRlSmF2YUJ1aWxkUGF0aE9wZXJhdGlvbi5qYXZhCkBAIC0xMDEsMTEgKzEwMSw4IEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgogCQkJCW5ld0VudHJ5ID0gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShlbnRyeS5nZXRQYXRoKCksIGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRQYXRoKCksIGVudHJ5LmdldFNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCgpKTsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwogCQl9Ci0JCWlmIChlbnRyeSAhPSBudWxsKQotCQkJY3Auc2V0KGluZGV4LCBuZXdFbnRyeSk7CisJCWNwLnNldChpbmRleCwgbmV3RW50cnkpOwogCX0KIAogCXByb3RlY3RlZCBJQ2xhc3NwYXRoRW50cnkgZW5zdXJlRWxlbWVudEluTGlzdChMaXN0IGNwLCBDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQsIElDbGFzc3BhdGhFbnRyeSBwcmVkZWNlc3NvcikgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZXMvRGVmYXVsdFdTRExTZXJ2aWNlSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlcy9EZWZhdWx0V1NETFNlcnZpY2VIZWxwZXIuamF2YQppbmRleCA2ZTQ0OWNhLi5jOTQxNzU2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlcy9EZWZhdWx0V1NETFNlcnZpY2VIZWxwZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlcy9EZWZhdWx0V1NETFNlcnZpY2VIZWxwZXIuamF2YQpAQCAtMTAsOSArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogQ3JlYXRlZCBvbiBGZWIgMjEsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzOwogCkBAIC0yNSw5ICsyMiw2IEBACiAKIC8qKgogICogQGF1dGhvciBjYnJpZGdoYQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKICAqLwogcHVibGljIGNsYXNzIERlZmF1bHRXU0RMU2VydmljZUhlbHBlciBpbXBsZW1lbnRzIFdTRExTZXJ2aWNlSGVscGVyIHsKIApAQCAtMzYsMTQgKzMwLDEyIEBACiAJICovCiAJcHVibGljIERlZmF1bHRXU0RMU2VydmljZUhlbHBlcigpIHsKIAkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCiAJfQogCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0UG9ydE5hbWUoamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldFBvcnROYW1lKE9iamVjdCBwb3J0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIG51bGw7CiAJfQogCkBAIC01MSw3ICs0Myw2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRTZXJ2aWNlUG9ydHMoamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KIAlwdWJsaWMgTWFwIGdldFNlcnZpY2VQb3J0cyhPYmplY3QgYVNlcnZpY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKQEAgLTU5LDcgKzUwLDYgQEAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzLldTRExTZXJ2aWNlSGVscGVyI2dldFNlcnZpY2VOYW1lc3BhY2VVUkkoamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lc3BhY2VVUkkoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIG51bGw7CiAJfQogCkBAIC02Nyw3ICs1Nyw2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRTZXJ2aWNlRGVmaW5pdGlvbkxvY2F0aW9uKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQogCSAqLwogCXB1YmxpYyBPYmplY3QgZ2V0U2VydmljZURlZmluaXRpb25Mb2NhdGlvbihFT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIG51bGw7CiAJfQogCkBAIC03NSw3ICs2NCw2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRQb3J0QmluZGluZ05hbWVzcGFjZVVSSShqYXZhLmxhbmcuT2JqZWN0KQogCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0UG9ydEJpbmRpbmdOYW1lc3BhY2VVUkkoT2JqZWN0IGFQb3J0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIG51bGw7CiAJfQogCkBAIC04Myw3ICs3MSw2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRTZXJ2aWNlTG9jYWxQYXJ0KGphdmEubGFuZy5PYmplY3QpCiAJICovCiAJcHVibGljIFN0cmluZyBnZXRTZXJ2aWNlTG9jYWxQYXJ0KE9iamVjdCBhU2VydmljZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAJCXJldHVybiBudWxsOwogCX0KIApAQCAtOTEsNyArNzgsNiBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2Vic2VydmljZXMuV1NETFNlcnZpY2VIZWxwZXIjZ2V0U2VydmljZVFOYW1lKGphdmEubGFuZy5PYmplY3QpCiAJICovCiAJcHVibGljIE9iamVjdCBnZXRTZXJ2aWNlUU5hbWUoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIG51bGw7CiAJfQogCkBAIC05OSw3ICs4NSw2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXREZWZpbml0aW9uU2VydmljZXMoamF2YS5sYW5nLk9iamVjdCkKIAkgKi8KIAlwdWJsaWMgTWFwIGdldERlZmluaXRpb25TZXJ2aWNlcyhPYmplY3QgYURlZmluaXRpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKQEAgLTEwNyw3ICs5Miw2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRXU0RMRGVmaW5pdGlvbihqYXZhLmxhbmcuU3RyaW5nKQogCSAqLwogCXB1YmxpYyBPYmplY3QgZ2V0V1NETERlZmluaXRpb24oU3RyaW5nIHdzZGxVUkwpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKQEAgLTExNSw3ICs5OSw2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRXU0RMRGVmaW5pdGlvbihvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCiAJICovCiAJcHVibGljIE9iamVjdCBnZXRXU0RMRGVmaW5pdGlvbihSZXNvdXJjZSB3c2RsUmVzb3VyY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKQEAgLTEyMywyNSArMTA2LDIwIEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlcy5XU0RMU2VydmljZUhlbHBlciNnZXRXc2RsU2VydmljZXNGcm9tV3NpbEZpbGUob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUpCiAJICovCiAJcHVibGljIExpc3QgZ2V0V3NkbFNlcnZpY2VzRnJvbVdzaWxGaWxlKElGaWxlIHdzaWwpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBpc1NlcnZpY2UoT2JqZWN0IGFTZXJ2aWNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlwdWJsaWMgYm9vbGVhbiBpc1dTRExSZXNvdXJjZShPYmplY3QgYVJlc291cmNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlwdWJsaWMgYm9vbGVhbiBpc0RlZmluaXRpb24oT2JqZWN0IGFEZWZpbml0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAogCXB1YmxpYyBMaXN0IGdldDEzU2VydmljZVJlZnMoRU9iamVjdCBqMmVlT2JqZWN0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKIAkJcmV0dXJuIG51bGw7CiAJfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZXMvV1NETFNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZXMvV1NETFNlcnZpY2VFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmluZGV4IGMwMDZjOTYuLmJkZTgxNTMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL1dTRExTZXJ2aWNlRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlcy9XU0RMU2VydmljZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKQEAgLTQ3LDYgKzQ3LDcgQEAKIAkgKiByZWFkRWxlbWVudCgpIC0gcGFyc2UgYW5kIGRlYWwgdy8gYW4gZXh0ZW5zaW9uIGxpa2U6IDxlYXJNb2R1bGVFeHRlbnNpb24gZXh0ZW5zaW9uQ2xhc3MgPQogCSAqICJjb20uaWJtLmV0b29scy53ZWIucGx1Z2luLldlYk1vZHVsZUV4dGVuc2lvbkltcGwiLz4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewogCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTEVNRU5UX1dTRExfSEVMUEVSKSkKIAkJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL1dTRExTZXJ2aWNlSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlcy9XU0RMU2VydmljZUhlbHBlci5qYXZhCmluZGV4IGJlOTUyMTcuLjY5NjBjMDkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL1dTRExTZXJ2aWNlSGVscGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZXMvV1NETFNlcnZpY2VIZWxwZXIuamF2YQpAQCAtMTAsOSArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICogQ3JlYXRlZCBvbiBGZWIgMjEsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYnNlcnZpY2VzOwogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlcy9XZWJTZXJ2aWNlc0NsaWVudERhdGFSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvd2Vic2VydmljZXMvV2ViU2VydmljZXNDbGllbnREYXRhUmVnaXN0cnkuamF2YQppbmRleCA2NzE2MGY2Li5jMjlhMzU1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC93ZWJzZXJ2aWNlcy9XZWJTZXJ2aWNlc0NsaWVudERhdGFSZWdpc3RyeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3dlYnNlcnZpY2VzL1dlYlNlcnZpY2VzQ2xpZW50RGF0YVJlZ2lzdHJ5LmphdmEKQEAgLTUxLDYgKzUxLDcgQEAKIAkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CiAJCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEdFTkVSQVRPUikpCiAJCQlyZXR1cm4gZmFsc2U7CkBAIC02OCw3ICs2OSw3IEBACiAJCQl9CiAJCQloZWxwZXIuc2V0UnVudGltZShydW50aW1lTGlzdCk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCQkvLyBBZGQgZGF0YSBoZWxwZXIgY2xhc3MgdG8gcmVnaXN0cnkgZXh0ZW5zaW9ucyBsaXN0CiAJCWlmIChoZWxwZXIgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvSU1vZGVsUHJvdmlkZXJFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvSU1vZGVsUHJvdmlkZXJFdmVudC5qYXZhCmluZGV4IDljZDFhYjcuLjg1YzgzYTggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL0lNb2RlbFByb3ZpZGVyRXZlbnQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9JTW9kZWxQcm92aWRlckV2ZW50LmphdmEKQEAgLTI2LDYgKzI2LDggQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLTk9XTl9SRVNPVVJDRVNfQUJPVVRfVE9fQ0hBTkdFID0gMHg4MDsKIAkvLyBJbmRpY2F0ZXMgdGhhdCB0aGUgbGlzdCBvZiBrbm93biByZXNvdXJjZXMgbWFuYWdlZCBieSB0aGUgZWRpdCBtb2RlbCBoYXMgY2hhbmdlZAogCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtOT1dOX1JFU09VUkNFU19DSEFOR0VEID0gMHgxMDA7CisJLy8gSW5kaWNhdGVzIHRoYXQgdGhlIGxpc3Qgb2Yga25vd24gcmVzb3VyY2VzIGluIHRoZSBtb2RlbHMgcHJvamVjdCBjb3VsZCBhZmZlY3QgY2xhc3NwYXRoCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVTT1VSQ0VfQUZGRUNUSU5HX0NMQVNTUEFUSF9DSEFOR0VEID0gMHgyMDA7CiAKIAlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRSZXNvdXJjZShPYmplY3QgYVJlc291cmNlKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvSjJFRU1vZGVsUHJvdmlkZXJSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvSjJFRU1vZGVsUHJvdmlkZXJSZWdpc3RyeS5qYXZhCmluZGV4IDJiOTIzMTEuLjAyYzA5OTIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL0oyRUVNb2RlbFByb3ZpZGVyUmVnaXN0cnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9KMkVFTW9kZWxQcm92aWRlclJlZ2lzdHJ5LmphdmEKQEAgLTEwLDYgKzEwLDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuUmVnaXN0cnlSZWFkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKQEAgLTQ1LDQ0ICs0Niw2MyBAQAogCX0KIAogCQorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBwcmlvcml0eSA9IG51bGw7Ci0JCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMRU1FTlRfcHJvdmlkZXJzKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJTW9kZWxQcm92aWRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG1wID0gZWxlbWVudC5nZXRDaGlsZHJlbihNT0RFTF9QUk9WSURFUik7Ci0JCXRyeSB7Ci0JCQlmYWN0b3J5ID0gKElNb2RlbFByb3ZpZGVyRmFjdG9yeSkgbXBbMF0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihQUk9WSURFUl9GQUNUT1JZX0NMQVNTKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsgIC8vT3B0aW9uYWxseSByZWFkIHByaW9yaXR5IGlmIHRvIG92ZXJyaWRlIHByb3ZpZGVycyBmb3IgdHlwZQotCQkJcHJpb3JpdHkgPSBtcFswXS5nZXRBdHRyaWJ1dGUoUFJPVklERVJfUFJJT1JJVFkpOwotCQl9Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGZhY2V0ID0gZWxlbWVudC5nZXRDaGlsZHJlbihQUk9WSURFUl9GQUNFVCk7Ci0JCQlTdHJpbmcgZmFjZXRJZCA9IGZhY2V0WzBdLmdldEF0dHJpYnV0ZShQUk9WSURFUl9GQUNFVF9JRCk7Ci0JCQlJUHJvamVjdEZhY2V0IHB2ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGZhY2V0SWQpOwotCQkJaWYgKHB2ID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVucmVjb2duaXplZCBmYWNldDogIiArIGZhY2V0SWQpOwotCQkJCXJldHVybiB0cnVlOyAgLy8gVW5yZWNvZ25pemVkIGZhY2V0Ci0JCQl9Ci0JCQlTdHJpbmcgZmFjZXRWZXJzaW9ucyA9IGZhY2V0WzBdLmdldEF0dHJpYnV0ZShQUk9WSURFUl9GQUNFVF9WRVJTSU9OKTsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZhY2V0VmVyc2lvbnMsIiwiKTsKLQkJCXdoaWxlICh0b2tlbnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgZmFjZXR2ZXJzaW9uID0gKFN0cmluZykgdG9rZW5zLm5leHRFbGVtZW50KCk7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBwdi5nZXRWZXJzaW9uKGZhY2V0dmVyc2lvbik7Ci0JCQkJaWYgKGZ2ICE9IG51bGwpCi0JCQkJCWFkZE1vZGVsUHJvdmlkZXIoZmFjdG9yeSwgZnYsIHByaW9yaXR5KTsKLQkJCX0KKwkJdHJ5eworCQkJU3RyaW5nIHByaW9yaXR5ID0gbnVsbDsKKwkJCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKEVMRU1FTlRfcHJvdmlkZXJzKSkKKwkJCQlyZXR1cm4gZmFsc2U7CiAJCQkKLQkJCQorCQkJSU1vZGVsUHJvdmlkZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOworCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gbXAgPSBlbGVtZW50LmdldENoaWxkcmVuKE1PREVMX1BST1ZJREVSKTsKKwkJCXRyeSB7CisJCQkJZmFjdG9yeSA9IChJTW9kZWxQcm92aWRlckZhY3RvcnkpIG1wWzBdLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oUFJPVklERVJfRkFDVE9SWV9DTEFTUyk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlsb2dFcnJvcihlbGVtZW50LCBlLmdldE1lc3NhZ2UoKSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCX0KKwkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsgIC8vT3B0aW9uYWxseSByZWFkIHByaW9yaXR5IGlmIHRvIG92ZXJyaWRlIHByb3ZpZGVycyBmb3IgdHlwZQorCQkJCXByaW9yaXR5ID0gbXBbMF0uZ2V0QXR0cmlidXRlKFBST1ZJREVSX1BSSU9SSVRZKTsKKwkJCX0KKwkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKKwkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBmYWNldCA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oUFJPVklERVJfRkFDRVQpOworCQkJCVN0cmluZyBmYWNldElkID0gZmFjZXRbMF0uZ2V0QXR0cmlidXRlKFBST1ZJREVSX0ZBQ0VUX0lEKTsKKwkJCQlJUHJvamVjdEZhY2V0IHB2ID0gbnVsbDsKKwkJCQl0cnl7CisJCQkJCXB2ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGZhY2V0SWQpOworCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKXsKKwkJCQkJbG9nRXJyb3IoZWxlbWVudCwgIlVucmVjb2duaXplZCBmYWNldDogIiArIGZhY2V0SWQpOyAvLyROT04tTkxTLTEkCisJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQkJfQorCQkJCWlmIChwdiA9PSBudWxsKSB7CisJCQkJCWxvZ0Vycm9yKGVsZW1lbnQsICJVbnJlY29nbml6ZWQgZmFjZXQ6ICIgKyBmYWNldElkKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIFVucmVjb2duaXplZCBmYWNldAorCQkJCX0KKwkJCQlTdHJpbmcgZmFjZXRWZXJzaW9ucyA9IGZhY2V0WzBdLmdldEF0dHJpYnV0ZShQUk9WSURFUl9GQUNFVF9WRVJTSU9OKTsKKwkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihmYWNldFZlcnNpb25zLCIsIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl3aGlsZSAodG9rZW5zLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQkJCVN0cmluZyBmYWNldHZlcnNpb24gPSAoU3RyaW5nKSB0b2tlbnMubmV4dEVsZW1lbnQoKTsKKwkJCQkJSVByb2plY3RGYWNldFZlcnNpb24gZnYgPSBwdi5nZXRWZXJzaW9uKGZhY2V0dmVyc2lvbik7CisJCQkJCWlmIChmdiAhPSBudWxsKQorCQkJCQkJYWRkTW9kZWxQcm92aWRlcihmYWN0b3J5LCBmdiwgcHJpb3JpdHkpOworCQkJCX0KKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nRXJyb3IoZWxlbWVudCwgZS5nZXRNZXNzYWdlKCkpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKKwkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOworCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWJ1Zi5hcHBlbmQoIlxuIiArIHRleHQpOyAvLyROT04tTkxTLTEkCisJCUoyRUVQbHVnaW4ubG9nRXJyb3IoYnVmLnRvU3RyaW5nKCkpOworCX0KIAogCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkTW9kZWxQcm92aWRlcihJTW9kZWxQcm92aWRlckZhY3RvcnkgcHJvdmlkZXIsIElQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBwcmlvcml0eSkgewogCQkvLyBDaGVjayBwcmlvcml0eSBvZiBleGlzdGluZyBwcm92aWRlciBmb3Igb3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL01vZGVsUHJvdmlkZXJFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvTW9kZWxQcm92aWRlckV2ZW50LmphdmEKaW5kZXggMzUwZjY4ZC4uNjM5MWJjOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvTW9kZWxQcm92aWRlckV2ZW50LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvTW9kZWxQcm92aWRlckV2ZW50LmphdmEKQEAgLTQwLDcgKzQwLDYgQEAKIAl9CiAKIAlwdWJsaWMgaW50IGdldEV2ZW50Q29kZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gZXZlbnQ7CiAJfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9Nb2RlbFByb3ZpZGVyTWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvbW9kZWwvTW9kZWxQcm92aWRlck1hbmFnZXIuamF2YQppbmRleCA1OGM4ODVhLi5iNmNjYWY2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9tb2RlbC9Nb2RlbFByb3ZpZGVyTWFuYWdlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL21vZGVsL01vZGVsUHJvdmlkZXJNYW5hZ2VyLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRUNvbW1vbk1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CkBAIC00Miw2ICs0MSw3IEBACiAJCXB1YmxpYyBNb2RlbFByb3ZpZGVyS2V5KCkgewogCQkJc3VwZXIoKTsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhT3RoZXIpewogCQkJaWYoIHRoaXMgPT0gYU90aGVyICkKIAkJCQlyZXR1cm4gdHJ1ZTsKQEAgLTUyLDYgKzUyLDcgQEAKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCQkKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJCQlyZXR1cm4gdmVyc2lvbi5oYXNoQ29kZSgpOwogCQl9CQkKQEAgLTYxLDYgKzYyLDcgQEAKIAkgKiBAc2VlIEFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChuZXcgRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdClOb3RpZmllciwKIAkgKiAgICAgIGludCwoRVN0cnVjdHVyYWxGZWF0dXJlKSBFT2JqZWN0LCBPYmplY3QsIE9iamVjdCwgaW50KSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKIAkJCWNhc2UgTm90aWZpY2F0aW9uLkFERCA6CkBAIC05OCw3ICsxMDAsNyBAQAogCQkJCUoyRUVDb21tb25NZXNzYWdlcy5FUlJfTk9fTU9ERUxfUFJPVklERVJfRk9SX1BST0pFQ1QsIG5ldyBPYmplY3RbXSB7cHJvamVjdCwgdmVyc30pOwogCQlUaHJvd2FibGUgZXJyb3IgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKIAkJCi0JCUoyRUVQbHVnaW4uSU5TVEFOQ0UuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXJyb3IpOworCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGVycm9yKTsKIAkJCQkKIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtMTIzLDcgKzEyNSw3IEBACiAJCQkJSjJFRUNvbW1vbk1lc3NhZ2VzLkVSUl9OT19NT0RFTF9QUk9WSURFUl9GT1JfUFJPSkVDVCwgbmV3IE9iamVjdFtdIHthTW9kdWxlLCB2ZXJzfSk7CiAJCVRocm93YWJsZSBlcnJvciA9IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOwogCQkKLQkJSjJFRVBsdWdpbi5JTlNUQU5DRS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlcnJvcik7CisJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZXJyb3IpOwogCQkKIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtMTY2LDcgKzE2OCw3IEBACiAJCQkJCQkoKElNb2RlbFByb3ZpZGVyTGlzdGVuZXIpbW9kKS5tb2RlbHNDaGFuZ2VkKGFuRXZlbnQpOwogCQkJCQl9CiAJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMTkzLDE2ICsxOTUsMjEgQEAKIAkJCQlub3RpZnlNb2RlbFByb3ZpZGVycyhldmVudCk7CiAJCQkKIAkJfQotCQkKIAogCS8qKgogCSAqIFVzZWQgdG8gcmVnaXN0ZXIgYW4gSU1vZGVsUHJvdmlkZXJGYWN0b3J5IGFnYWluc3QgYSBmYWNldCB2ZXJzaW9uCi0JICogQHBhcmFtIHByb3ZpZGVyRmFjdG9yeSAtIHtAbGluayBJTW9kZWxQcm92aWRlckZhY3Rvcnl9Ci0JICogQHBhcmFtIHYgLSB7QGxpbmsgSVByb2plY3RGYWNldFZlcnNpb259Ci0JICogQHBhcmFtIHByaW9yaXR5IC0ge0BsaW5rIFN0cmluZ30tIFVzZWQgdG8gYWxsb3cgbXVsdGlwbGUgaW5zdGFuY2VzLCB0aGUgaGlnaGVzdCBwcmlvcml0eSBpcyBjaG9zZW4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvdmlkZXJGYWN0b3J5CisJICogICAgICAgICAgICAtIHtAbGluayBJTW9kZWxQcm92aWRlckZhY3Rvcnl9CisJICogQHBhcmFtIHYKKwkgKiAgICAgICAgICAgIC0ge0BsaW5rIElQcm9qZWN0RmFjZXRWZXJzaW9ufQorCSAqIEBwYXJhbSBwcmlvcml0eQorCSAqICAgICAgICAgICAgLSB7QGxpbmsgU3RyaW5nfS0gVXNlZCB0byBhbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMsIHRoZQorCSAqICAgICAgICAgICAgaGlnaGVzdCBwcmlvcml0eSBpcyBjaG9zZW4uIFByaW9yaXR5ICcwJyBpcyBoaWdoZXIgdGhhdAorCSAqICAgICAgICAgICAgcHJpb3JpdHkgJzEnLiBJZiBwcmlvcml0aWVzIGFyZSBlcXVhbCB0aGUgbmV3IHByb3ZpZGVyRmFjdG9yeQorCSAqICAgICAgICAgICAgaXMgY2hvc2VuLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlclByb3ZpZGVyKElNb2RlbFByb3ZpZGVyRmFjdG9yeSBwcm92aWRlckZhY3RvcnksCi0JCQlJUHJvamVjdEZhY2V0VmVyc2lvbiB2LCBTdHJpbmcgcHJpb3JpdHkpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJQcm92aWRlcihJTW9kZWxQcm92aWRlckZhY3RvcnkgcHJvdmlkZXJGYWN0b3J5LCBJUHJvamVjdEZhY2V0VmVyc2lvbiB2LCBTdHJpbmcgcHJpb3JpdHkpIHsKIAogCQlpbnQgbmV3UHJpb3JpdHkgPSAocHJpb3JpdHkgIT0gbnVsbCkgPyBJbnRlZ2VyLnBhcnNlSW50KHByaW9yaXR5KSA6IERFRkFVTFRfUFJJT1JJVFk7CiAJCWludCBjdXJyZW50UHJpb3JpdHkgPSBnZXRQcm92aWRlclByaW9yaXR5KHYpOwpAQCAtMjIxLDYgKzIyOCwxMCBAQAogCQl9CiAJCXJldHVybiBudWxsOwogCX0KKwlwdWJsaWMgc3RhdGljIElNb2RlbFByb3ZpZGVyRmFjdG9yeSBnZXRQcm92aWRlcihJUHJvamVjdCBwKSB7CisJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0VmVyc2lvbiA9IGdldERlZmF1bHRGYWNldChwKTsKKwkJcmV0dXJuIGdldFByb3ZpZGVyKGZhY2V0VmVyc2lvbik7CisJfQogCXByaXZhdGUgc3RhdGljIGludCBnZXRQcm92aWRlclByaW9yaXR5KElQcm9qZWN0RmFjZXRWZXJzaW9uIHYpIHsKIAkJU2V0PE1vZGVsUHJvdmlkZXJLZXk+IGtleXMgPSBnZXRQcm92aWRlcnMoKS5rZXlTZXQoKTsKIAkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewpAQCAtMjc4LDE5ICsyODksMTkgQEAKIAogCXByaXZhdGUgc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGdldERlZmF1bHRGYWNldChJUHJvamVjdCBwcm9qKSB7CiAJCVN0cmluZyB0eXBlID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RUeXBlKHByb2opOwotCQlJUHJvamVjdEZhY2V0IGZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KHR5cGUpOwotCQlJRmFjZXRlZFByb2plY3QgZnAgPSBudWxsOwotCQl0cnkgewotCQkJZnAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvaik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlpZiAoZnAgIT0gbnVsbCAmJiBmYWNldCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZnAuZ2V0SW5zdGFsbGVkVmVyc2lvbihmYWNldCk7CisJCWlmKCBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQodHlwZSkpIHsKKwkJCUlQcm9qZWN0RmFjZXQgZmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQodHlwZSk7CisJCQlJRmFjZXRlZFByb2plY3QgZnAgPSBudWxsOworCQkJdHJ5IHsKKwkJCQlmcCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qKTsKKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQl9CisJCQlpZiAoZnAgIT0gbnVsbCAmJiBmYWNldCAhPSBudWxsKSB7CisJCQkJcmV0dXJuIGZwLmdldEluc3RhbGxlZFZlcnNpb24oZmFjZXQpOworCQkJfQogCQl9CiAJCXJldHVybiBudWxsOwotCQkJCiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0RGVmYXVsdEZhY2V0KElWaXJ0dWFsQ29tcG9uZW50IGFNb2R1bGUpIHsKQEAgLTMwNyw4ICszMTgsNyBAQAogCQkJCWZwID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKGFNb2R1bGUuZ2V0UHJvamVjdCgpKTsKIAkJCX0KIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCQlpZiAoZnAgIT0gbnVsbCAmJiBmYWNldCAhPSBudWxsKSB7CiAJCQlyZXR1cm4gZnAuZ2V0SW5zdGFsbGVkVmVyc2lvbihmYWNldCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0NvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggMjdhNmE1ZS4uNjM4MjA1NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9Db21tb25JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMTEzLDEwICsxMTMsMTIgQEAKIAkJc3VwcG9ydGVkVHlwZXMuYWRkKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciB0YXJnZXQsIE9iamVjdCBhZGFwdGVyS2V5KSB7CiAJCXJldHVybiBzdXBlci5hZGFwdCh0YXJnZXQsIHRoaXMpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKIAkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKIAkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKQEAgLTEyOCw2ICsxMzAsNyBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCBhZGFwdGVyVHlwZSkgewogCQlBZGFwdGVyIGFkYXB0ZXIgPSBzdXBlci5hZGFwdE5ldyh0YXJnZXQsIGFkYXB0ZXJUeXBlKTsKIAkJZGlzcG9zYWJsZS5hZGQoYWRhcHRlcik7CkBAIC0xNDYsNiArMTQ5LDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuY29tbW9uLkVqYlJlZn0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlRWpiUmVmQWRhcHRlcigpIHsKIAkJaWYgKGVqYlJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQllamJSZWZJdGVtUHJvdmlkZXIgPSBuZXcgRWpiUmVmSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtMTU5LDYgKzE2Myw3IEBACiAJLyoqCiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5Vc2VDYWxsZXJJZGVudGl0eX0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHlBZGFwdGVyKCkgewogCQlpZiAodXNlQ2FsbGVySWRlbnRpdHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJdXNlQ2FsbGVySWRlbnRpdHlJdGVtUHJvdmlkZXIgPSBuZXcgVXNlQ2FsbGVySWRlbnRpdHlJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0xODMsNiArMTg4LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRpb25BZGFwdGVyKCkgewogCQlpZiAoZGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJZGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0yMDYsNiArMjEyLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlUU5hbWVBZGFwdGVyKCkgewogCQlpZiAocU5hbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJcU5hbWVJdGVtUHJvdmlkZXIgPSBuZXcgUU5hbWVJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0yMjksNiArMjM2LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlTGlzdGVuZXJBZGFwdGVyKCkgewogCQlpZiAobGlzdGVuZXJJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJbGlzdGVuZXJJdGVtUHJvdmlkZXIgPSBuZXcgTGlzdGVuZXJJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0yNTMsNiArMjYxLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewogCQlpZiAoY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJY29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgPSBuZXcgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0yNjQsNiArMjczLDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuY29tbW9uLkVudkVudHJ5fS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVFbnZFbnRyeUFkYXB0ZXIoKSB7CiAJCWlmIChlbnZFbnRyeUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQllbnZFbnRyeUl0ZW1Qcm92aWRlciA9IG5ldyBFbnZFbnRyeUl0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTI3NSw2ICsyODUsNyBAQAogCS8qKgogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uUmVzb3VyY2VSZWZ9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc291cmNlUmVmQWRhcHRlcigpIHsKIAkJaWYgKHJlc291cmNlUmVmSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCXJlc291cmNlUmVmSXRlbVByb3ZpZGVyID0gbmV3IFJlc291cmNlUmVmSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtMjg2LDYgKzI5Nyw3IEBACiAJLyoqCiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5SZXNvdXJjZUVudlJlZn0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VFbnZSZWZBZGFwdGVyKCkgewogCQlpZiAocmVzb3VyY2VFbnZSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJcmVzb3VyY2VFbnZSZWZJdGVtUHJvdmlkZXIgPSBuZXcgUmVzb3VyY2VFbnZSZWZJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0zMTAsNiArMzIyLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlRUpCTG9jYWxSZWZBZGFwdGVyKCkgewogCQlpZiAoZWpiTG9jYWxSZWZJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJZWpiTG9jYWxSZWZJdGVtUHJvdmlkZXIgPSBuZXcgRUpCTG9jYWxSZWZJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0zMjEsNiArMzM0LDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuY29tbW9uLlNlY3VyaXR5Um9sZX0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlSb2xlQWRhcHRlcigpIHsKIAkJaWYgKHNlY3VyaXR5Um9sZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQlzZWN1cml0eVJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgU2VjdXJpdHlSb2xlSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtMzMyLDYgKzM0Niw3IEBACiAJLyoqCiAJICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5JZGVudGl0eX0uCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWRlbnRpdHlBZGFwdGVyKCkgewogCQlpZiAoaWRlbnRpdHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJaWRlbnRpdHlJdGVtUHJvdmlkZXIgPSBuZXcgSWRlbnRpdHlJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0zNTcsNiArMzcyLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlSWNvblR5cGVBZGFwdGVyKCkgewogCQlpZiAoaWNvblR5cGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJaWNvblR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgSWNvblR5cGVJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC0zODEsNiArMzk3LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzcGxheU5hbWVBZGFwdGVyKCkgewogCQlpZiAoZGlzcGxheU5hbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJZGlzcGxheU5hbWVJdGVtUHJvdmlkZXIgPSBuZXcgRGlzcGxheU5hbWVJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC00MDUsNiArNDIyLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmQWRhcHRlcigpIHsKIAkJaWYgKG1lc3NhZ2VEZXN0aW5hdGlvblJlZkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQltZXNzYWdlRGVzdGluYXRpb25SZWZJdGVtUHJvdmlkZXIgPSBuZXcgTWVzc2FnZURlc3RpbmF0aW9uUmVmSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtNDI5LDYgKzQ0Nyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbkFkYXB0ZXIoKSB7CiAJCWlmIChtZXNzYWdlRGVzdGluYXRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJbWVzc2FnZURlc3RpbmF0aW9uSXRlbVByb3ZpZGVyID0gbmV3IE1lc3NhZ2VEZXN0aW5hdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTQ1Myw2ICs0NzIsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYXJhbVZhbHVlQWRhcHRlcigpIHsKIAkJaWYgKHBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewogCQkJcGFyYW1WYWx1ZUl0ZW1Qcm92aWRlciA9IG5ldyBQYXJhbVZhbHVlSXRlbVByb3ZpZGVyKHRoaXMpOwpAQCAtNDc3LDYgKzQ5Nyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0aW9uR3JvdXBBZGFwdGVyKCkgewogCQlpZiAoZGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQlkZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyID0gbmV3IERlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC00ODgsNiArNTA5LDcgQEAKIAkvKioKIAkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHl9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlBZGFwdGVyKCkgewogCQlpZiAocnVuQXNTcGVjaWZpZWRJZGVudGl0eUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7CiAJCQlydW5Bc1NwZWNpZmllZElkZW50aXR5SXRlbVByb3ZpZGVyID0gbmV3IFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC00OTYsNiArNTE4LDcgQEAKIAkJcmV0dXJuIHJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlJdGVtUHJvdmlkZXI7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdXJpdHlJZGVudGl0eUFkYXB0ZXIoKSB7CiAJCWlmIChzZWN1cml0eUlkZW50aXR5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCXNlY3VyaXR5SWRlbnRpdHlJdGVtUHJvdmlkZXIgPSBuZXcgU2VjdXJpdHlJZGVudGl0eUl0ZW1Qcm92aWRlcih0aGlzKTsKQEAgLTUwNyw2ICs1MzAsNyBAQAogCS8qKgogCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uU2VjdXJpdHlSb2xlUmVmfS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQWRhcHRlciBjcmVhdGVTZWN1cml0eVJvbGVSZWZBZGFwdGVyKCkgewogCQlpZiAoc2VjdXJpdHlSb2xlUmVmSXRlbVByb3ZpZGVyID09IG51bGwpIHsKIAkJCXNlY3VyaXR5Um9sZVJlZkl0ZW1Qcm92aWRlciA9IG5ldyBTZWN1cml0eVJvbGVSZWZJdGVtUHJvdmlkZXIodGhpcyk7CkBAIC01MjYsNiArNTUwLDcgQEAKIAkJcmV0dXJuIChwYXJlbnRBZGFwdGVyRmFjdG9yeSA9PSBudWxsID8gdGhpcyA6IHBhcmVudEFkYXB0ZXJGYWN0b3J5LmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7CiAJCXJldHVybiBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpIHx8IHN1cHBvcnRlZFR5cGVzLmNvbnRhaW5zKHR5cGUpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIuamF2YQppbmRleCA5MTU4YTNhLi5hMDliMjIxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlci5qYXZhCkBAIC0xOCwxMSArMTgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKQEAgLTM3LDcgKzMyLDcgQEAKICAqIAogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlciB7CiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCiAJICogZW5kLXVzZXItZG9jIC0tPgpAQCAtNTQsNiArNDksNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKQEAgLTExNiw2ICsxMTIsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xMjYsNiArMTIzLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJU3RyaW5nIGxhYmVsID0gKChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCkgb2JqZWN0KS5nZXREaXNwbGF5TmFtZSgpOwogCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfdHlwZSIpIDogLy8kTk9OLU5MUy0xJApAQCAtMTM4LDYgKzEzNiw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuY2xhc3MpKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuQ09NUEFUSUJJTElUWV9ERVNDUklQVElPTl9HUk9VUF9fU01BTExfSUNPTiA6CkBAIC0xNTgsNiArMTU3LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAJfQpAQCAtMTY3LDYgKzE2Nyw3IEBACiAJICogZW5kLXVzZXItZG9jIC0tPgogCSAqICAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRGVzY3JpcHRpb25Hcm91cEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9EZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggYjRkMjkyZi4uYzlkNTdmYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9EZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9EZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7CkBAIC0zOCw3ICszNyw3IEBACiAgKiAKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworcHVibGljIGNsYXNzIERlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KIAkgKiBlbmQtdXNlci1kb2MgLS0+CkBAIC01NSw2ICs1NCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtNjksNiArNjksNyBAQAogCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tCiAJICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7CkBAIC04NCw2ICs4NSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBFUmVmZXJlbmNlIGdldENoaWxkUmVmZXJlbmNlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewogCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCiAJCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KQEAgLTk1LDYgKzk3LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgRGVzY3JpcHRpb25Hcm91cC5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVzY3JpcHRpb25Hcm91cCIpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMTA2LDYgKzEwOSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCkBAIC0xMjYsNiArMTMwLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIGdldFN0cmluZygiX1VJX0Rlc2NyaXB0aW9uR3JvdXBfdHlwZSIpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMTM2LDYgKzE0MSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVzY3JpcHRpb25Hcm91cC5jbGFzcykpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5ERVNDUklQVElPTl9HUk9VUF9fSUNPTlMgOgpAQCAtMTUzLDYgKzE1OSw3IEBACiAJICogZW5kLXVzZXItZG9jIC0tPgogCSAqICAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQppbmRleCBiN2YxMWUyLi44ODhiY2E3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9EZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7CkBAIC0zOCw3ICszNyw3IEBACiAgKiAKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKK3B1YmxpYyBjbGFzcyBEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQogCSAqIGVuZC11c2VyLWRvYyAtLT4KQEAgLTU1LDYgKzU0LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC05Myw2ICs5Myw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIERlc2NyaXB0aW9uLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCIpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMTAyLDYgKzEwMyw3IEBACiAJICogLS0+CiAJICogIAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCVN0cmluZyBsYWJlbCA9ICgoRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0VmFsdWUoKTsKIAkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJEZXNjcmlwdGlvbl9VSV8iKSA6IC8vJE5PTi1OTFMtMSQKQEAgLTExNCw2ICsxMTYsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERlc2NyaXB0aW9uLmNsYXNzKSkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkRFU0NSSVBUSU9OX19MQU5HIDoKQEAgLTEzMiw2ICsxMzUsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIAl9CkBAIC0xNDEsNiArMTQ1LDcgQEAKIAkgKiBlbmQtdXNlci1kb2MgLS0+CiAJICogIAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9EaXNwbGF5TmFtZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9EaXNwbGF5TmFtZUl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IGMxYmQxZTYuLjgxNTY3MDQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRGlzcGxheU5hbWVJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0Rpc3BsYXlOYW1lSXRlbVByb3ZpZGVyLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKQEAgLTM2LDcgKzM1LDcgQEAKICAqIAogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgRGlzcGxheU5hbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworcHVibGljIGNsYXNzIERpc3BsYXlOYW1lSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCiAJICogZW5kLXVzZXItZG9jIC0tPgpAQCAtNTMsNiArNTIsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKQEAgLTcwLDYgKzcwLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAJfQpAQCAtMTAyLDYgKzEwMyw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIERpc3BsYXlOYW1lLmdpZi4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EaXNwbGF5TmFtZSIpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMTEyLDYgKzExNCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCVN0cmluZyBsYWJlbCA9ICgoRGlzcGxheU5hbWUpIG9iamVjdCkuZ2V0TGFuZygpOwogCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlzcGxheU5hbWVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJApAQCAtMTI0LDYgKzEyNyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlzcGxheU5hbWUuY2xhc3MpKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuRElTUExBWV9OQU1FX19MQU5HIDoKQEAgLTE0MCw2ICsxNDQsNyBAQAogCSAqIGVuZC11c2VyLWRvYyAtLT4KIAkgKiAgCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0VKQkxvY2FsUmVmSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0VKQkxvY2FsUmVmSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggNjIwZDgyNC4uOThhYTFhZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9FSkJMb2NhbFJlZkl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRUpCTG9jYWxSZWZJdGVtUHJvdmlkZXIuamF2YQpAQCAtMTgsMTEgKzE4LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7CkBAIC0zNyw3ICszMiw3IEBACiAgKiAKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIEVKQkxvY2FsUmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgRWpiUmVmSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworcHVibGljIGNsYXNzIEVKQkxvY2FsUmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgRWpiUmVmSXRlbVByb3ZpZGVyIHsKIAogCiAJLyoqCkBAIC01Niw2ICs1MSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtNzMsNiArNjksNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIAl9CkBAIC0xMDEsNiArOTgsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBFSkJMb2NhbFJlZi5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImVqYl9sb2NhbF9yZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xMDksNiArMTA3LDcgQEAKIAkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwogCSAqIC0tPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCVN0cmluZyBsYWJlbCA9ICgoRUpCTG9jYWxSZWYpIG9iamVjdCkuZ2V0TmFtZSgpOwogCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9FSkJMb2NhbFJlZl90eXBlIikgOiBsYWJlbDsgLy8kTk9OLU5MUy0xJApAQCAtMTIxLDYgKzEyMCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRUpCTG9jYWxSZWYuY2xhc3MpKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuRUpCX0xPQ0FMX1JFRl9fTE9DQUxfSE9NRSA6CkBAIC0xMzcsNiArMTM3LDcgQEAKIAkgKiBlbmQtdXNlci1kb2MgLS0+CiAJICogIAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9FamJSZWZJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRWpiUmVmSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggMDUzNjVlNy4uNzM4MWEwOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9FamJSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0VqYlJlZkl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMiw3ICsyMiw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7CkBAIC0zOSw3ICszOCw3IEBACiAvKioKICAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuY29tbW9uLkVqYlJlZn1vYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBFamJSZWZJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIEVqYlJlZkl0ZW1Qcm92aWRlciBleHRlbmRzIENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewogCiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgpAQCAtNTEsNiArNTAsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBlamJfcmVmZXJlbmNlLmdpZi4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJU3RyaW5nIGtleSA9ICgoRWpiUmVmKSBvYmplY3QpLmlzTG9jYWwoKSA/ICJlamJfbG9jYWxfcmVmX29iaiIgOiAiZWpiX3JlZmVyZW5jZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShrZXkpOyAKQEAgLTU5LDYgKzU5LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgRWpiUmVmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIG9iamVjdCA9PSBudWxsID8gbnVsbCA6ICgoRWpiUmVmKSBvYmplY3QpLmVDb250YWluZXIoKTsKIAl9CkBAIC02Niw2ICs2Nyw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC0xNTAsNiArMTUyLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAKQEAgLTIzOCw2ICsyNDEsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwpAQCAtMjQ3LDYgKzI1MSw3IEBACiAJfQogCiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewogCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRUpCTG9jYWxSZWYpCiAJCQlyZXR1cm4gIkVqYkxvY2FsUmVmICIgKyAoKEVKQkxvY2FsUmVmKSBvYmplY3QpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJApAQCAtMjU5LDYgKzI2NCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRWpiUmVmLmNsYXNzKSkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLkVKQl9SRUZfX05BTUUgOgpAQCAtMjgwLDYgKzI4Niw3IEBACiAJICogZW5kLXVzZXItZG9jIC0tPgogCSAqICAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KQEAgLTI5MCw2ICsyOTcsNyBAQAogCSAqIGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndCBiZSBhbnkgY2hpbGRyZW4sIHNvCiAJICogdGhpcyBpcyBmYXN0ZXIuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9FbnZFbnRyeUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9FbnZFbnRyeUl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDQzMzFjNDMuLjQ2YTlkNzYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvRW52RW50cnlJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0VudkVudHJ5SXRlbVByb3ZpZGVyLmphdmEKQEAgLTIyLDcgKzIyLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKQEAgLTM4LDcgKzM3LDcgQEAKIC8qKgogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uRW52RW50cnl9b2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgRW52RW50cnlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIEVudkVudHJ5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CiAKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCkBAIC01MCw2ICs0OSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIGVudmlyb25tZW50X2VudGl0eS5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJlbnZpcm9ubWVudF9lbnRpdHkiKTsvLyROT04tTkxTLTEkCiAJfQpAQCAtNTcsNiArNTcsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBFbnZFbnRyeS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAKIAkJcmV0dXJuIG9iamVjdCA9PSBudWxsID8gbnVsbCA6ICgoRW52RW50cnkpIG9iamVjdCkuZUNvbnRhaW5lcigpOwpAQCAtNjUsNiArNjYsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtMTc1LDYgKzE3Nyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7CkBAIC0xODQsNiArMTg3LDcgQEAKIAl9CiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAiRW52RW50cnkgIiArICgoRW52RW50cnkpIG9iamVjdCkuZ2V0TmFtZSgpOy8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xOTQsNiArMTk4LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChFbnZFbnRyeS5jbGFzcykpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5FTlZfRU5UUllfX0RFU0NSSVBUSU9OIDoKQEAgLTIxNSw2ICsyMjAsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIApAQCAtMjI4LDYgKzIzNCw3IEBACiAJICogZW5kLXVzZXItZG9jIC0tPgogCSAqICAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KQEAgLTIzOCw2ICsyNDUsNyBAQAogCSAqIGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndCBiZSBhbnkgY2hpbGRyZW4sIHNvCiAJICogdGhpcyBpcyBmYXN0ZXIuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9JY29uVHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9JY29uVHlwZUl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDE4YThjZDIuLjk5ZjM5MjQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvSWNvblR5cGVJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0ljb25UeXBlSXRlbVByb3ZpZGVyLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKQEAgLTM3LDcgKzM2LDcgQEAKICAqIAogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgSWNvblR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworcHVibGljIGNsYXNzIEljb25UeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCiAJICogZW5kLXVzZXItZG9jIC0tPgpAQCAtNTQsNiArNTMsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKQEAgLTEwNyw2ICsxMDcsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0ljb25UeXBlIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xMTcsNiArMTE4LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJU3RyaW5nIGxhYmVsID0gKChJY29uVHlwZSkgb2JqZWN0KS5nZXRTbWFsbEljb24oKTsKIAkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0ljb25UeXBlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKQEAgLTEyOSw2ICsxMzEsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEljb25UeXBlLmNsYXNzKSkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLklDT05fVFlQRV9fU01BTExfSUNPTiA6CkBAIC0xNDgsNiArMTUxLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAJfQpAQCAtMTU3LDYgKzE2MSw3IEBACiAJICogZW5kLXVzZXItZG9jIC0tPgogCSAqICAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvSWRlbnRpdHlJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvSWRlbnRpdHlJdGVtUHJvdmlkZXIuamF2YQppbmRleCBhOWUxMzliLi5iNTg2NWU4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0lkZW50aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9JZGVudGl0eUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMyw3ICsyMyw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwpAQCAtMzgsNyArMzcsNyBAQAogLyoqCiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5JZGVudGl0eX1vYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBJZGVudGl0eUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CitwdWJsaWMgY2xhc3MgSWRlbnRpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCiAJICovCkBAIC00OSwxMiArNDgsMTIgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKIAogCQkJQ29tbW9uUGFja2FnZSBwa2cgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRTsKLQkJCTsKIAogCQkJLy8gVGhpcyBpcyBmb3IgdGhlIGRlc2NyaXB0aW9uIGZlYXR1cmUuCiAJCQkvLwpAQCAtMTA0LDYgKzEwMyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7CkBAIC0xMTYsNiArMTE2LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgSWRlbnRpdHkuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKIAl9CkBAIC0xMjMsMTAgKzEyNCwxMiBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBJZGVudGl0eS5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZWN1cml0eV9pZGVudGl0eV9vYmoiKTsvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJSWRlbnRpdHkgaWRlbnRpdHkgPSAoKElkZW50aXR5KSBvYmplY3QpOwogCQlyZXR1cm4gIklkZW50aXR5ICIgKyBpZGVudGl0eS5nZXRSb2xlTmFtZSgpOyAvLyROT04tTkxTLTEkCkBAIC0xMzgsNiArMTQxLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJZGVudGl0eS5jbGFzcykpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5JREVOVElUWV9fREVTQ1JJUFRJT04gOgpAQCAtMTU3LDYgKzE2MSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCkBAIC0xNzAsNiArMTc1LDcgQEAKIAkgKiBlbmQtdXNlci1kb2MgLS0+CiAJICogIAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9KTkRJRW52UmVmc0dyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0pORElFbnZSZWZzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQppbmRleCA5YWMyNDNkLi40MjRkN2RmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0pORElFbnZSZWZzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0pORElFbnZSZWZzR3JvdXBJdGVtUHJvdmlkZXIuamF2YQpAQCAtMTgsMTEgKzE4LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwOwpAQCAtMzcsNyArMzIsNyBAQAogICogCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBKTkRJRW52UmVmc0dyb3VwSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CitwdWJsaWMgY2xhc3MgSk5ESUVudlJlZnNHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIHsKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KIAkgKiBlbmQtdXNlci1kb2MgLS0+CkBAIC01NCw2ICs0OSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtNzAsNiArNjYsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwpAQCAtODksNiArODYsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDaGlsZFJlZmVyZW5jZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKIAkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgogCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCkBAIC0xMDIsNiArMTAwLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9KTkRJRW52UmVmc0dyb3VwIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xMTIsNiArMTExLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJU3RyaW5nIGxhYmVsID0gKChKTkRJRW52UmVmc0dyb3VwKSBvYmplY3QpLmdldERpc3BsYXlOYW1lKCk7CiAJCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9KTkRJRW52UmVmc0dyb3VwX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKQEAgLTEyNCw2ICsxMjQsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEpORElFbnZSZWZzR3JvdXAuY2xhc3MpKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuSk5ESV9FTlZfUkVGU19HUk9VUF9fRU5WSVJPTk1FTlRfUFJPUEVSVElFUyA6CkBAIC0xNDcsNiArMTQ4LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAKQEAgLTE3Myw2ICsxNzUsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7CiAJCWJvb2xlYW4gcXVhbGlmeSA9IGZlYXR1cmUgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Sk5ESUVudlJlZnNHcm91cF9FamJSZWZzKCkgfHwgZmVhdHVyZSA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKTkRJRW52UmVmc0dyb3VwX0VqYkxvY2FsUmVmcygpOwogCQlyZXR1cm4gZ2V0U3RyaW5nKHF1YWxpZnkgPyAiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiA6ICJfVUlfQ3JlYXRlQ2hpbGRfdGV4dCIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtMTg0LDYgKzE4Nyw3IEBACiAJICogZW5kLXVzZXItZG9jIC0tPgogCSAqICAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvTGlzdGVuZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvTGlzdGVuZXJJdGVtUHJvdmlkZXIuamF2YQppbmRleCA4NmMzZDAyLi4yMGIxY2JmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL0xpc3RlbmVySXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9MaXN0ZW5lckl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwpAQCAtMzAsNyArMjksNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKIAogCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIExpc3RlbmVySXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CiAKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCkBAIC00Miw2ICs0MSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIExpc3RlbmVyLmdpZgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgibGlzdGVuZXIiKTsvLyROT04tTkxTLTEkCiAJfQpAQCAtNDksNiArNDksNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgd2ViQXBwIG9mIHRoZSBMaXN0ZW5lci4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcCgpOwogCX0KQEAgLTU2LDYgKzU3LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKQEAgLTgyLDYgKzg0LDcgQEAKIAl9CiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCUxpc3RlbmVyIGxpc3RlbmVyID0gKExpc3RlbmVyKSBvYmplY3Q7CiAJCVN0cmluZyBuYW1lID0gbGlzdGVuZXIuZ2V0TGlzdGVuZXJDbGFzc05hbWUoKTsKQEAgLTk2LDcgKzk5LDEzIEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgeworCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTGlzdGVuZXIuY2xhc3MpKSB7CisJCQljYXNlIENvbW1vblBhY2thZ2UuTElTVEVORVJfX0xJU1RFTkVSX0NMQVNTOgorCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CisJCQkJcmV0dXJuOworCQl9CiAJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKIAl9CiAKQEAgLTEwNyw2ICsxMTYsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIAl9CkBAIC0xMTYsNiArMTI2LDcgQEAKIAkgKiBlbmQtdXNlci1kb2MgLS0+CiAJICogIAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9NZXNzYWdlRGVzdGluYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvTWVzc2FnZURlc3RpbmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggYzI1MzI2OC4uODc0MjA4MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9NZXNzYWdlRGVzdGluYXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL01lc3NhZ2VEZXN0aW5hdGlvbkl0ZW1Qcm92aWRlci5qYXZhCkBAIC0xOCwxMSArMTgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247CkBAIC0zNyw3ICszMiw3IEBACiAgKiAKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwSXRlbVByb3ZpZGVyIHsKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KIAkgKiBlbmQtdXNlci1kb2MgLS0+CkBAIC01NCw2ICs0OSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtODEsNiArNzcsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L21zZ2RyaXZlbmRlc3RpbmF0aW9uX29iaiIpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtODksNiArODYsNyBAQAogCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCiAJICogLS0+CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJU3RyaW5nIG1kID0gQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk1lc3NhZ2VEZXN0aW5hdGlvbl9VSV8iKTsgLy8kTk9OLU5MUy0xJAogCQlTdHJpbmcgbGFiZWwgPSAoKE1lc3NhZ2VEZXN0aW5hdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7CkBAIC0xMDEsNiArOTksNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1lc3NhZ2VEZXN0aW5hdGlvbi5jbGFzcykpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX19OQU1FIDogewpAQCAtMTE4LDYgKzExNyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCX0KQEAgLTEyNyw2ICsxMjcsNyBAQAogCSAqIGVuZC11c2VyLWRvYyAtLT4KIAkgKiAgCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL01lc3NhZ2VEZXN0aW5hdGlvblJlZkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9NZXNzYWdlRGVzdGluYXRpb25SZWZJdGVtUHJvdmlkZXIuamF2YQppbmRleCA3NjUxM2M1Li5kZmNiYjUwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL01lc3NhZ2VEZXN0aW5hdGlvblJlZkl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvTWVzc2FnZURlc3RpbmF0aW9uUmVmSXRlbVByb3ZpZGVyLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKQEAgLTQwLDcgKzM5LDcgQEAKICAqIAogICogQGdlbmVyYXRlZAogICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uUmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKK3B1YmxpYyBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25SZWZJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KIAkgKiBlbmQtdXNlci1kb2MgLS0+CkBAIC01Nyw2ICs1Niw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtMTEzLDYgKzExMyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7CkBAIC0xMjcsNiArMTI4LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgibWVzc2FnZV9iZWFuX29iaiIpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMTM3LDYgKzEzOSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCVN0cmluZyBsYWJlbCA9ICgoTWVzc2FnZURlc3RpbmF0aW9uUmVmKSBvYmplY3QpLmdldE5hbWUoKTsKIAkJcmV0dXJuIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJNZXNzYWdlRGVzdGluYXRpb25SZWZJdGVtUHJvdmlkZXJfVUlfMCIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCwgJE5PTi1OTFMtMiQKQEAgLTE0OCw2ICsxNTEsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1lc3NhZ2VEZXN0aW5hdGlvblJlZi5jbGFzcykpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5NRVNTQUdFX0RFU1RJTkFUSU9OX1JFRl9fTkFNRSA6CkBAIC0xNjksNiArMTczLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAKQEAgLTE4Miw2ICsxODcsNyBAQAogCSAqIGVuZC11c2VyLWRvYyAtLT4KIAkgKiAgCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CkBAIC0xOTEsNiArMTk3LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBhcmcwKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1BhcmFtVmFsdWVJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IGE2MTFkYmQuLmJlODcyMTEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvUGFyYW1WYWx1ZUl0ZW1Qcm92aWRlci5qYXZhCkBAIC0yMyw3ICsyMyw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7CkBAIC00MCw3ICszOSw3IEBACiAgKiAKICAqIEBnZW5lcmF0ZWQKICAqLwotcHVibGljIGNsYXNzIFBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworcHVibGljIGNsYXNzIFBhcmFtVmFsdWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KIAkgKiBlbmQtdXNlci1kb2MgLS0+CkBAIC01Nyw2ICs1Niw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtMTEyLDYgKzExMiw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7CiAJICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PEVSZWZlcmVuY2U+KCk7CiAvLwkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7CkBAIC0xMjYsNiArMTI3LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiaW5pdGlhbGl6X3BhcmFtZXRlciIpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMTM2LDEzICsxMzgsMTIgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJU3RyaW5nIGxhYmVsID0gKChQYXJhbVZhbHVlKSBvYmplY3QpLmdldE5hbWUoKTsKIAkJU3RyaW5nIHZhbHVlID0gKChQYXJhbVZhbHVlKSBvYmplY3QpLmdldFZhbHVlKCk7Ci0vLwkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfUGFyYW1WYWx1ZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0vLwkJCQkJQ29tbW9uRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIl9VSV9QYXJhbVZhbHVlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKICAgICAgICAgcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfUGFyYW1WYWx1ZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBsYWJlbCArICIgPSAiICsgKHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfUGFyYW1WYWx1ZV92YWx1ZSIpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgbGFiZWwgKyAiID0gIiArICh2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiBDb21tb25FZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiX1VJX1BhcmFtVmFsdWVfdmFsdWUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KIAogCS8qKgpAQCAtMTUxLDYgKzE1Miw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUGFyYW1WYWx1ZS5jbGFzcykpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5QQVJBTV9WQUxVRV9fTkFNRSA6CkBAIC0xNzEsNiArMTczLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAKQEAgLTE4NCw2ICsxODcsNyBAQAogCSAqIGVuZC11c2VyLWRvYyAtLT4KIAkgKiAgCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1FOYW1lSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1FOYW1lSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggOGM3ZWM0OS4uMTEzYzI5OCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9RTmFtZUl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvUU5hbWVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwpAQCAtMzgsNyArMzcsNyBAQAogICogCiAgKiBAZ2VuZXJhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBRTmFtZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CitwdWJsaWMgY2xhc3MgUU5hbWVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KIAkgKiBlbmQtdXNlci1kb2MgLS0+CkBAIC01NCw2ICs1Myw3IEBACiAJICogZW5kLXVzZXItZG9jIC0tPgogCSAqICAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKQEAgLTExNiw2ICsxMTYsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBRTmFtZS5naWYuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoInFuYW1lIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC0xMjQsNiArMTI1LDcgQEAKIAkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYwogCSAqIC0tPgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCVN0cmluZyBsYWJlbCA9IENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfVUlfUU5hbWVfdHlwZSIpOyAvLyROT04tTkxTLTEkCiAJCWlmICgoKFFOYW1lKSBvYmplY3QpLmdldE5hbWVzcGFjZVVSSSgpICE9IG51bGwgJiYgKCgoUU5hbWUpIG9iamVjdCkuZ2V0TG9jYWxQYXJ0KCkgIT0gbnVsbCkpIHsKQEAgLTE0MSw2ICsxNDMsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFFOYW1lLmNsYXNzKSkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlFOQU1FX19OQU1FU1BBQ0VfVVJJIDoKQEAgLTE2MSw2ICsxNjQsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIAl9CkBAIC0xNzAsNiArMTc0LDcgQEAKIAkgKiBlbmQtdXNlci1kb2MgLS0+CiAJICogIAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9SZXNvdXJjZUVudlJlZkl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9SZXNvdXJjZUVudlJlZkl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IGI3NjgwYjUuLjZiMGMxNGUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvUmVzb3VyY2VFbnZSZWZJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1Jlc291cmNlRW52UmVmSXRlbVByb3ZpZGVyLmphdmEKQEAgLTIyLDcgKzIyLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKQEAgLTM3LDcgKzM2LDcgQEAKIC8qKgogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uUmVzb3VyY2VSZWZ9b2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VFbnZSZWZJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgeworcHVibGljIGNsYXNzIFJlc291cmNlRW52UmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB7CiAKIAkvKioKIAkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCkBAIC00OSw2ICs0OCw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHJlc291cmNlX3JlZmVyZW5jZS5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJyZXNfZW52X3JlZl9vYmoiKTsgLy8kTk9OLU5MUy0xJAogCX0KQEAgLTU2LDYgKzU2LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgUmVzb3VyY2VSZWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gb2JqZWN0ID09IG51bGwgPyBudWxsIDogKChSZXNvdXJjZUVudlJlZikgb2JqZWN0KS5lQ29udGFpbmVyKCk7CiAJfQpAQCAtNjMsNiArNjQsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtMTM1LDYgKzEzNyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7CkBAIC0xNDQsNiArMTQ3LDcgQEAKIAl9CiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAiUmVzb3VyY2VFbnZSZWYgIiArICgoUmVzb3VyY2VFbnZSZWYpIG9iamVjdCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMTU0LDYgKzE1OCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2VFbnZSZWYuY2xhc3MpKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfRU5WX1JFRl9fREVTQ1JJUFRJT04gOgpAQCAtMTczLDYgKzE3OCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCkBAIC0xODYsNiArMTkyLDcgQEAKIAkgKiBlbmQtdXNlci1kb2MgLS0+CiAJICogIAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpAQCAtMTk2LDYgKzIwMyw3IEBACiAJICogZW51bWVyYXRpb24sIGFuZCB0aGlzIHRvIGNoZWNrIHRoYXQgZW51bWVyYXRpb24sIGJ1dCB3ZSBrbm93IHRoZXJlIGNhbid0IGJlIGFueSBjaGlsZHJlbiwgc28KIAkgKiB0aGlzIGlzIGZhc3Rlci4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1Jlc291cmNlUmVmSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1Jlc291cmNlUmVmSXRlbVByb3ZpZGVyLmphdmEKaW5kZXggOWQ1NjQxOC4uYzc5NTczZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9SZXNvdXJjZVJlZkl0ZW1Qcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvUmVzb3VyY2VSZWZJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwpAQCAtMzQsMTIgKzMzLDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7CiAKIAotOwotCiAvKioKICAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuY29tbW9uLlJlc291cmNlUmVmfW9iamVjdC4KICAqLwotcHVibGljIGNsYXNzIFJlc291cmNlUmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVJlZkl0ZW1Qcm92aWRlciBleHRlbmRzIENvbW1vbkl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgewogCiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgpAQCAtNTEsNiArNDgsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyByZXNvdXJjZV9yZWZlcmVuY2UuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgicmVzb3VyY2VfcmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQKIAl9CkBAIC01OCw2ICs1Niw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIFJlc291cmNlUmVmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIG9iamVjdCA9PSBudWxsID8gbnVsbCA6ICgoUmVzb3VyY2VSZWYpIG9iamVjdCkuZUNvbnRhaW5lcigpOwogCX0KQEAgLTY1LDEzICs2NCwxMiBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwogCiAJCQlDb21tb25QYWNrYWdlIHBrZyA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCQkJOwotCiAJCQkvLyBUaGlzIGlzIGZvciB0aGUgZGVzY3JpcHRpb24gZmVhdHVyZS4KIAkJCS8vCiAJCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQobmV3IEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIENvbW1vbkVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJEZXNjcmlwdGlvbl9VSV8iKSwgLy8kTk9OLU5MUy0xJApAQCAtMjEwLDYgKzIwOCw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChjaGlsZHJlblJlZmVyZW5jZXMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKG9iamVjdCk7CkBAIC0yMTksNiArMjE4LDcgQEAKIAl9CiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAiUmVzb3VyY2VSZWYgIiArICgoUmVzb3VyY2VSZWYpIG9iamVjdCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCiAJfQpAQCAtMjI5LDYgKzIyOSw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2VSZWYuY2xhc3MpKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuUkVTT1VSQ0VfUkVGX19ERVNDUklQVElPTiA6CkBAIC0yNTIsNiArMjUzLDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAKQEAgLTI2NSw2ICsyNjcsNyBAQAogCSAqIGVuZC11c2VyLWRvYyAtLT4KIAkgKiAgCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CkBAIC0yNzUsNiArMjc4LDcgQEAKIAkgKiBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QgYmUgYW55IGNoaWxkcmVuLCBzbwogCSAqIHRoaXMgaXMgZmFzdGVyLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvUnVuQXNTcGVjaWZpZWRJZGVudGl0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9SdW5Bc1NwZWNpZmllZElkZW50aXR5SXRlbVByb3ZpZGVyLmphdmEKaW5kZXggZmQzZmQyYS4uYzI2NzQ3ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9SdW5Bc1NwZWNpZmllZElkZW50aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9SdW5Bc1NwZWNpZmllZElkZW50aXR5SXRlbVByb3ZpZGVyLmphdmEKQEAgLTI0LDExICsyNCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKQEAgLTQwLDcgKzM1LDcgQEAKICAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRwYXRlciBmb3IgYSB7QGxpbmsgY29tLmlibS5ldG9vbHMuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHl9CiAgKiBvYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBSdW5Bc1NwZWNpZmllZElkZW50aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgU2VjdXJpdHlJZGVudGl0eUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKK3B1YmxpYyBjbGFzcyBSdW5Bc1NwZWNpZmllZElkZW50aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgU2VjdXJpdHlJZGVudGl0eUl0ZW1Qcm92aWRlciB7CiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgogCSAqLwpAQCAtNTEsNiArNDYsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtNzEsNiArNjcsNyBAQAogCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn1hbmQge0BsaW5rIEFkZENvbW1hbmR9YW5kCiAJICoge0BsaW5rIFJlbW92ZUNvbW1hbmR9c3VwcG9ydCBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuUmVmZXJlbmNlcyhPYmplY3Qgb2JqZWN0KSB7CiAJICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PEVSZWZlcmVuY2U+KCk7CiAvLwkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7CkBAIC04Myw2ICs4MCw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gKChFT2JqZWN0KSBvYmplY3QpLmVDb250YWluZXIoKTsKIAl9CkBAIC05MCwxMCArODgsMTIgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgUnVuQXNTcGVjaWZpZWRJZGVudGl0eS5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZWN1cml0eV9pZGVudGl0eV9vYmoiKTsvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJUnVuQXNTcGVjaWZpZWRJZGVudGl0eSBydW5Bc1NwZWNpZmllZElkZW50aXR5ID0gKChSdW5Bc1NwZWNpZmllZElkZW50aXR5KSBvYmplY3QpOwogCQlyZXR1cm4gcnVuQXNTcGVjaWZpZWRJZGVudGl0eS5nZXRJZGVudGl0eSgpLmdldFJvbGVOYW1lKCk7CkBAIC0xMDUsNiArMTA1LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7CiAJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSdW5Bc1NwZWNpZmllZElkZW50aXR5LmNsYXNzKSkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlJVTl9BU19TUEVDSUZJRURfSURFTlRJVFlfX0lERU5USVRZIDogewpAQCAtMTIyLDYgKzEyMyw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewogCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwogCkBAIC0xMzMsNiArMTM1LDcgQEAKIAkgKiBlbmQtdXNlci1kb2MgLS0+CiAJICogIAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9TZWN1cml0eUlkZW50aXR5SXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1NlY3VyaXR5SWRlbnRpdHlJdGVtUHJvdmlkZXIuamF2YQppbmRleCAwNTM2M2RhLi40NGE3ODZkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1NlY3VyaXR5SWRlbnRpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1NlY3VyaXR5SWRlbnRpdHlJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjMsNyArMjMsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKQEAgLTM0LDE0ICszMywxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uV3Njb21tb25GYWN0b3J5OwogCiAKLTsKLQotCiAKIC8qKgogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uU2VjdXJpdHlJZGVudGl0eX1vYmplY3QuCiAgKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eUlkZW50aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKK3B1YmxpYyBjbGFzcyBTZWN1cml0eUlkZW50aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7CiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgogCSAqLwpAQCAtNTIsMTMgKzQ4LDEyIEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CiAKIAkJCUNvbW1vblBhY2thZ2UgcGtnID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCQk7Ci0KIAkJCS8vIFRoaXMgaXMgZm9yIHRoZSBkZXNjcmlwdGlvbiBmZWF0dXJlLgogCQkJLy8KIAkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZChuZXcgSXRlbVByb3BlcnR5RGVzY3JpcHRvcigoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwgIkRlc2NyaXB0aW9uIiwgLy8kTk9OLU5MUy0xJApAQCAtODksNiArODQsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlblJlZmVyZW5jZXMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoY2hpbGRyZW5SZWZlcmVuY2VzID09IG51bGwpIHsKIAkJCXN1cGVyLmdldENoaWxkcmVuUmVmZXJlbmNlcyhvYmplY3QpOwpAQCAtMTAxLDYgKzk3LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgU2VjdXJpdHlJZGVudGl0eS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwogCX0KQEAgLTEwOCwxMCArMTA1LDEyIEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIFNlY3VyaXR5SWRlbnRpdHkuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZW52aXJvbm1lbnRfZW50aXR5Iik7Ly8kTk9OLU5MUy0xJAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7CiAJCVNlY3VyaXR5SWRlbnRpdHkgc2VjdXJpdHlJZGVudGl0eSA9ICgoU2VjdXJpdHlJZGVudGl0eSkgb2JqZWN0KTsKIAkJcmV0dXJuICJTZWN1cml0eUlkZW50aXR5ICIgKyBzZWN1cml0eUlkZW50aXR5LmdldERlc2NyaXB0aW9uKCk7IC8vJE5PTi1OTFMtMSQKQEAgLTEyMyw2ICsxMjIsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlY3VyaXR5SWRlbnRpdHkuY2xhc3MpKSB7CiAJCQljYXNlIENvbW1vblBhY2thZ2UuU0VDVVJJVFlfSURFTlRJVFlfX0RFU0NSSVBUSU9OIDoKQEAgLTE0MSw2ICsxNDEsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIApAQCAtMTU0LDYgKzE1NSw3IEBACiAJICogZW5kLXVzZXItZG9jIC0tPgogCSAqICAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvU2VjdXJpdHlSb2xlSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1NlY3VyaXR5Um9sZUl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IGM1MTBhNWUuLjZjMmRmMDAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvU2VjdXJpdHlSb2xlSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9TZWN1cml0eVJvbGVJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwpAQCAtMzYsNyArMzUsNyBAQAogLyoqCiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5TZWN1cml0eVJvbGV9b2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKK3B1YmxpYyBjbGFzcyBTZWN1cml0eVJvbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTQ4LDYgKzQ3LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgc2VjdXJpdHlfcm9sZS5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZWN1cml0eV9yb2xlIik7Ly8kTk9OLU5MUy0xJAogCX0KQEAgLTU1LDYgKzU1LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgU2VjdXJpdHlSb2xlLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIG9iamVjdCA9PSBudWxsID8gbnVsbCA6ICgoU2VjdXJpdHlSb2xlKSBvYmplY3QpLmVDb250YWluZXIoKTsKIAl9CkBAIC02Miw2ICs2Myw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC0xMzYsNiArMTM4LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKQEAgLTE0NSw2ICsxNDgsNyBAQAogCX0KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuICIgIiArICgoU2VjdXJpdHlSb2xlKSBvYmplY3QpLmdldFJvbGVOYW1lKCk7Ly8kTk9OLU5MUy0xJAogCX0KQEAgLTE1NSw2ICsxNTksNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKIAkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlY3VyaXR5Um9sZS5jbGFzcykpIHsKIAkJCWNhc2UgQ29tbW9uUGFja2FnZS5TRUNVUklUWV9ST0xFX19ERVNDUklQVElPTiA6CkBAIC0xNzQsNiArMTc5LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7CiAJCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7CiAKQEAgLTE4Nyw2ICsxOTMsNyBAQAogCSAqIGVuZC11c2VyLWRvYyAtLT4KIAkgKiAgCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKTsKIAl9CkBAIC0xOTcsNiArMjA0LDcgQEAKIAkgKiBlbnVtZXJhdGlvbiwgYW5kIHRoaXMgdG8gY2hlY2sgdGhhdCBlbnVtZXJhdGlvbiwgYnV0IHdlIGtub3cgdGhlcmUgY2FuJ3QgYmUgYW55IGNoaWxkcmVuLCBzbwogCSAqIHRoaXMgaXMgZmFzdGVyLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvU2VjdXJpdHlSb2xlUmVmSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1NlY3VyaXR5Um9sZVJlZkl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDBkNjNhZmEuLmUyNzU5ZDQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvU2VjdXJpdHlSb2xlUmVmSXRlbVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9TZWN1cml0eVJvbGVSZWZJdGVtUHJvdmlkZXIuamF2YQpAQCAtMjAsNyArMjAsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwpAQCAtMzQsNyArMzMsNyBAQAogLyoqCiAgKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkcGF0ZXIgZm9yIGEge0BsaW5rIGNvbS5pYm0uZXRvb2xzLmNvbW1vbi5TZWN1cml0eVJvbGVSZWZ9b2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlUmVmSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKK3B1YmxpYyBjbGFzcyBTZWN1cml0eVJvbGVSZWZJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb21tb25JdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHsKIAogCS8qKgogCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KQEAgLTQ2LDYgKzQ1LDcgQEAKIAkvKioKIAkgKiBUaGlzIHJldHVybnMgc2VjdXJpdHlfcm9sZV9yZWZlcmVuY2UuZ2lmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgic2VjdXJpdHlfcm9sZV9yZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCiAJfQpAQCAtNTMsNiArNTMsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgc2VydmxldCBvZiB0aGUgU2VjdXJpdHlSb2xlUmVmLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuIG9iamVjdCA9PSBudWxsID8gbnVsbCA6ICgoU2VjdXJpdHlSb2xlUmVmKSBvYmplY3QpLmVDb250YWluZXIoKTsKIAl9CkBAIC02MCw2ICs2MSw3IEBACiAJLyoqCiAJICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7CkBAIC0xMzMsNiArMTM1LDcgQEAKIAkgKiAKIAkgKiBAZ2VuZXJhdGVkCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5SZWZlcmVuY2VzKE9iamVjdCBvYmplY3QpIHsKIAkJaWYgKGNoaWxkcmVuUmVmZXJlbmNlcyA9PSBudWxsKSB7CiAJCQlzdXBlci5nZXRDaGlsZHJlblJlZmVyZW5jZXMob2JqZWN0KTsKQEAgLTE0Miw2ICsxNDUsNyBAQAogCX0KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJcmV0dXJuICJTZWN1cml0eVJvbGVSZWYgIiArICgoU2VjdXJpdHlSb2xlUmVmKSBvYmplY3QpLmdldE5hbWUoKTsvLyROT04tTkxTLTEkCiAJfQpAQCAtMTUyLDYgKzE1Niw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU2VjdXJpdHlSb2xlUmVmLmNsYXNzKSkgewogCQkJY2FzZSBDb21tb25QYWNrYWdlLlNFQ1VSSVRZX1JPTEVfUkVGX19OQU1FIDoKQEAgLTE3Miw2ICsxNzcsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIApAQCAtMTg1LDYgKzE5MSw3IEBACiAJICogZW5kLXVzZXItZG9jIC0tPgogCSAqICAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KQEAgLTE5NSw2ICsyMDIsNyBAQAogCSAqIGVudW1lcmF0aW9uLCBhbmQgdGhpcyB0byBjaGVjayB0aGF0IGVudW1lcmF0aW9uLCBidXQgd2Uga25vdyB0aGVyZSBjYW4ndCBiZSBhbnkgY2hpbGRyZW4sIHNvCiAJICogdGhpcyBpcyBmYXN0ZXIuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9Vc2VDYWxsZXJJZGVudGl0eUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb21tb25lZGl0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi9pbnRlcm5hbC9wcm92aWRlci9Vc2VDYWxsZXJJZGVudGl0eUl0ZW1Qcm92aWRlci5qYXZhCmluZGV4IDI4YWI5OTEuLjIyMzRjYTggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29tbW9uZWRpdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vaW50ZXJuYWwvcHJvdmlkZXIvVXNlQ2FsbGVySWRlbnRpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbW1vbmVkaXQvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL2ludGVybmFsL3Byb3ZpZGVyL1VzZUNhbGxlcklkZW50aXR5SXRlbVByb3ZpZGVyLmphdmEKQEAgLTE5LDExICsxOSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uVXNlQ2FsbGVySWRlbnRpdHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiAKQEAgLTMxLDcgKzI2LDcgQEAKIC8qKgogICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZHBhdGVyIGZvciBhIHtAbGluayBjb20uaWJtLmV0b29scy5jb21tb24uVXNlQ2FsbGVySWRlbnRpdHl9b2JqZWN0LgogICovCi1wdWJsaWMgY2xhc3MgVXNlQ2FsbGVySWRlbnRpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTZWN1cml0eUlkZW50aXR5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgeworcHVibGljIGNsYXNzIFVzZUNhbGxlcklkZW50aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgU2VjdXJpdHlJZGVudGl0eUl0ZW1Qcm92aWRlciB7CiAJLyoqCiAJICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgogCSAqLwpAQCAtNDIsNiArMzcsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewogCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewogCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwpAQCAtNTIsNiArNDgsNyBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyB0aGUgcGFyZW50IG9mIHRoZSBVc2VDYWxsZXJJZGVudGl0eS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwogCX0KQEAgLTU5LDEwICs1NiwxMiBAQAogCS8qKgogCSAqIFRoaXMgcmV0dXJucyBVc2VDYWxsZXJJZGVudGl0eS5naWYuCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7CiAJCXJldHVybiBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJzZWN1cml0eV9pZGVudGl0eV9vYmoiKTsvLyROT04tTkxTLTEkCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKIAkJVXNlQ2FsbGVySWRlbnRpdHkgdXNlQ2FsbGVySWRlbnRpdHkgPSAoKFVzZUNhbGxlcklkZW50aXR5KSBvYmplY3QpOwogCQlyZXR1cm4gIlVzZUNhbGxlcklkZW50aXR5ICIgKyB1c2VDYWxsZXJJZGVudGl0eS5nZXREZXNjcmlwdGlvbigpOyAvLyROT04tTkxTLTEkCkBAIC03NCw2ICs3Myw3IEBACiAJICogCiAJICogQGdlbmVyYXRlZAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewogCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7CiAJfQpAQCAtODUsNiArODUsNyBAQAogCSAqIAogCSAqIEBnZW5lcmF0ZWQKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKIAkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKIAl9CkBAIC05NCw2ICs5NSw3IEBACiAJICogZW5kLXVzZXItZG9jIC0tPgogCSAqICAKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKIAkJcmV0dXJuIEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29udGVudHR5cGUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29udGVudHR5cGUvSjJFRUNvbnRlbnREZXNjcmliZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvY29udGVudHR5cGUvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29udGVudHR5cGUvSjJFRUNvbnRlbnREZXNjcmliZXIuamF2YQppbmRleCA0MzQyNWE5Li45MGYxYmFmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2NvbnRlbnR0eXBlL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbnRlbnR0eXBlL0oyRUVDb250ZW50RGVzY3JpYmVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9jb250ZW50dHlwZS9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb250ZW50dHlwZS9KMkVFQ29udGVudERlc2NyaWJlci5qYXZhCkBAIC0yNiw3ICsyNiw3IEBACiAJCXN1cGVyKCk7CiAJfQogCi0JcHVibGljIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lIEpFRVZFUlNJT04gPSBuZXcgUXVhbGlmaWVkTmFtZSgiamVlLXZlcnNpb24iLCAiMS40Iik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgSkVFVkVSU0lPTiA9IG5ldyBRdWFsaWZpZWROYW1lKCJqZWUtdmVyc2lvbiIsICIxLjQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAKIAlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggNzA3YTlhZi4uOTg5YjBjMiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMTMsMTEgKzEzLDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRUpCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRWFyVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwpAQCAtMjksMTIgKzMwLDcgQEAKIAkJc3VwZXIoKTsKIAl9CiAKLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChKMkVFX0xJQl9FTEVNRU5UU19MSVNUKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCQorCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYgKFRBUkdFVF9DT01QT05FTlRTX1RPX1VSSV9NQVAuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKIAkJCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwpAQCAtNjEsMTAgKzU3LDM0IEBACiAJCQlzZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG1hcCk7CiAJCQlyZXR1cm4gbWFwOwogCQl9CisJCQorCQllbHNlIGlmIChUQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSF9NQVAuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKwkJCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOworCQkJTGlzdCBDb21wTGlzdCA9IChMaXN0KSBnZXRQcm9wZXJ0eShUQVJHRVRfQ09NUE9ORU5UX0xJU1QpOworCQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcCA9IChJVmlydHVhbENvbXBvbmVudClnZXRQcm9wZXJ0eShTT1VSQ0VfQ09NUE9ORU5UKTsKKwkJCVN0cmluZyBsaWJEaXIgPSBFYXJVdGlsaXRpZXMuZ2V0RUFSTGliRGlyKGVhckNvbXApOworCQkJaWYgKGxpYkRpciAhPSBudWxsICYmIGxpYkRpci5sZW5ndGgoKSA+IDApIHsKKwkJCQlTdHJpbmcgbGliRGlyUGF0aCA9IG5ldyBQYXRoKGxpYkRpcikubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IENvbXBMaXN0LnNpemUoKTsgaSsrKSB7CisJCQkJCWlmKG51bGwgIT0gQ29tcExpc3QuZ2V0KGkpKXsKKwkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IENvbXAgPSAoSVZpcnR1YWxDb21wb25lbnQpIENvbXBMaXN0LmdldChpKTsKKwkJCQkJCUlQcm9qZWN0IENvbXBQcm9qZWN0ID0gQ29tcC5nZXRQcm9qZWN0KCk7CisJCQkJCQlpZihKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QoQ29tcFByb2plY3QpICYmICFFSkJVdGlsaXRpZXMuaXNFSkJDbGllbnRQcm9qZWN0KENvbXBQcm9qZWN0KSAmJiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkVFQ29tcG9uZW50KGVhckNvbXApKXsKKwkJCQkJCQltYXAucHV0KENvbXAsIGxpYkRpclBhdGgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbWFwKTsKKwkJCQlyZXR1cm4gbWFwOworCQkJfSByZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisJCX0KKwkJIGVsc2UKKwkJCiAJCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKIAl9CiAKIAorCUBPdmVycmlkZQogCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7CiAJCXJldHVybiBuZXcgQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25PcChtb2RlbCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25PcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25PcC5qYXZhCmluZGV4IDlkZTQ4OTcuLmY5NzlhNDggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uT3AuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbk9wLmphdmEKQEAgLTEwLDYgKzEwLDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC0xOSwyMSArMjEsMjkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5JQ29tbW9uRU1GTW9kdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tcG9uZW50Y29yZS5KYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JRUFSTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkVhclV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5FYXJGYWNldFJ1bnRpbWVIYW5kbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwpAQCAtNDgsNiArNTgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c09wOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbXBhdGliaWxpdHlYTUlSZXNvdXJjZTsKIApAQCAtNTgsOSArNjksMTAgQEAKIAkJc3VwZXIobW9kZWwpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMyk7CisJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgNCk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCQl0cnkgewogCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5wYXVzZVVwZGF0ZXMoKTsKQEAgLTcxLDYgKzgzLDcgQEAKIAkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwogCQkJCXVwZGF0ZUVBUkREKHN1Ym1vbihtb25pdG9yLCAxKSk7CiAJCQkJdXBkYXRlTW9kdWxlUnVudGltZXMoc3VibW9uKG1vbml0b3IsIDEpKTsKKwkJCQltb2R1bGVDbGFzc3BhdGhGb3JjZVVwZGF0ZShzdWJtb24obW9uaXRvciwgMSkpOwogCQkJfQogCQkJcmV0dXJuIHN0YXR1czsKIAkJfSBmaW5hbGx5IHsKQEAgLTgwLDcgKzkzLDcgQEAKIAkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucmVzdW1lVXBkYXRlcygpOwogCQl9CiAJfQotCQorCiAJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRUFSREQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCQogCQlTdHJ1Y3R1cmVFZGl0IHNlID0gbnVsbDsKQEAgLTkwLDExICsxMDMsMjQgQEAKIAkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGVhciA9IChJVmlydHVhbENvbXBvbmVudCkgdGhpcy5tb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7CiAJCQlmaW5hbCBJUHJvamVjdCBlYXJwaiA9IGVhci5nZXRQcm9qZWN0KCk7CiAJCQlzZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHNvdXJjZUNvbXAuZ2V0UHJvamVjdCgpKTsKKwkJCQkKIAkJCWlmIChlYXJNb2RlbCAhPSBudWxsKSB7CiAJCQkJTGlzdCBsaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQkJCWZpbmFsIExpc3QgbGliTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkoyRUVfTElCX0VMRU1FTlRTX0xJU1QpOworCQkJCWlmKGxpc3QgPT0gbnVsbCkKKwkJCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCQlpZihsaXN0LmlzRW1wdHkoKSkgeworCQkJCQlJVmlydHVhbFJlZmVyZW5jZSBbXSByZWZzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRU1vZHVsZVJlZmVyZW5jZXMoZWFyKTsKKwkJCQkJaWYgKHJlZnMgIT0gbnVsbCAmJiByZWZzLmxlbmd0aCA+IDApIHsKKwkJCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCQlsaXN0LmFkZChyZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJCiAJCQkJZmluYWwgTWFwIG1hcCA9IChNYXApIG1vZGVsLmdldFByb3BlcnR5KElBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCk7Ci0JCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKKwkJCQlmaW5hbCBNYXAgZGVwbG95TWFwID0gKE1hcCkgbW9kZWwuZ2V0UHJvcGVydHkoSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSF9NQVApOworCQkJCWlmIChsaXN0LnNpemUoKSA+IDApIHsKIAkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CiAJCQkJCQkKIAkJCQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHdjID0gKElWaXJ0dWFsQ29tcG9uZW50KSBsaXN0LmdldChpKTsKQEAgLTEwOCwzMyArMTM0LDQzIEBACiAJCQkJCQkJU3RydWN0dXJlRWRpdCBjb21wc2UgPSBudWxsOwogCQkJCQkJCXRyeSB7CiAJCQkJCQkJCWNvbXBzZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKHdjLmdldFByb2plY3QoKSk7Ci0JCQkJCQkJCVdvcmtiZW5jaENvbXBvbmVudCByZWZ3YyA9IGNvbXBzZS5nZXRDb21wb25lbnQoKTsKLQkJCQkJCQkJZmluYWwgUmVmZXJlbmNlZENvbXBvbmVudCByZWYgPSBzZS5maW5kUmVmZXJlbmNlZENvbXBvbmVudChlYXJ3YywgcmVmd2MpOworCQkJCQkJCQlmaW5hbCBSZWZlcmVuY2VkQ29tcG9uZW50IHJlZiA9IGZpbmRSZWZlcmVuY2VkQ29tcG9uZW50KGVhcndjLCB3Yywgc2UsIGNvbXBzZSk7CiAJCQkJCQkJCWVhck1vZGVsLm1vZGlmeShuZXcgUnVubmFibGUoKSB7CiAJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CiAJCQkJCQkJCQkJZmluYWwgSUNvbW1vbkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKElDb21tb25BcHBsaWNhdGlvbillYXJNb2RlbC5nZXRNb2RlbE9iamVjdCgpOwogCQkJCQkJCQkJCWlmKGFwcGxpY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJYm9vbGVhbiBpc0VFNSA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRUREUHJvamVjdFZlcnNpb24oZWFycGopLmVxdWFscygKLQkJCQkJCQkJCQkJCQlKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzVfMF9URVhUKTsKLQkJCQkJCQkJCQkJaWYoaXNFRTUgJiYgKGxpYkxpc3QgIT1udWxsICYmIGxpYkxpc3QuY29udGFpbnMod2MpKSkKKwkJCQkJCQkJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBtYXAuZ2V0KHdjKTsKKwkJCQkJCQkJCQkJaWYoZGVwbG95TWFwLmNvbnRhaW5zS2V5KHdjKSkgeworCQkJCQkJCQkJCQkJU3RyaW5nIGRlcGxveVBhdGggPSAoU3RyaW5nKWRlcGxveU1hcC5nZXQod2MpOworCQkJCQkJCQkJCQkJaWYobmFtZSAhPSBudWxsICYmICFkZXBsb3lQYXRoLmVxdWFscygiLyIpKSAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJCQkJbmFtZSA9IChuZXcgUGF0aChkZXBsb3lQYXRoKSkuYXBwZW5kKG5hbWUpLnRvU3RyaW5nKCk7CisJCQkJCQkJCQkJCQlTdHJpbmcgbGliRGlyID0gRWFyVXRpbGl0aWVzLmdldEVBUkxpYkRpcihlYXIpOworCQkJCQkJCQkJCQkJSVBhdGggbGliRGlyUGF0aCA9IG51bGw7CisJCQkJCQkJCQkJCQlpZihsaWJEaXIgIT0gbnVsbCkKKwkJCQkJCQkJCQkJCQlsaWJEaXJQYXRoID0gbmV3IFBhdGgobGliRGlyKS5tYWtlUmVsYXRpdmUoKTsKKwkJCQkJCQkJCQkJCWlmKGxpYkRpclBhdGggIT0gbnVsbCAmJiAhbGliRGlyUGF0aC5pc0VtcHR5KCkgJiYgbmV3IFBhdGgoZGVwbG95UGF0aCkubWFrZVJlbGF0aXZlKCkuZXF1YWxzKGxpYkRpclBhdGgpKSB7IC8vIERvIG5vdCBjb25zaWRlciBsaWJyYXJ5IGRpcmVjdG9yeSBmaWxlcyBhcyBtb2R1bGVzCisJCQkJCQkJCQkJCQkJcmV0dXJuOworCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCWlmKG5hbWUgIT0gbnVsbCkKKwkJCQkJCQkJCQkJCW5hbWUgPSBuZXcgUGF0aChuYW1lKS5tYWtlUmVsYXRpdmUoKS50b1N0cmluZygpOworCQkJCQkJCQkJCQlJQ29tbW9uTW9kdWxlIG1vZCA9IGFkZE1vZHVsZShhcHBsaWNhdGlvbiwgd2MsIG5hbWUpOworCQkJCQkJCQkJCQlpZihtb2QgPT0gbnVsbCl7IC8vdXRpbGl0eSBwcm9qZWN0CiAJCQkJCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCQkJCUlDb21tb25Nb2R1bGUgbW9kID0gYWRkTW9kdWxlKGFwcGxpY2F0aW9uLCB3YywgKFN0cmluZykgbWFwLmdldCh3YykpOwotCQkJCQkJCQkJCQlpZihtb2QgIT0gbnVsbCl7Ci0JCQkJCQkJCQkJCQlpZiAocmVmIT1udWxsKQotCQkJCQkJCQkJCQkJCXJlZi5zZXREZXBlbmRlbnRPYmplY3QoKEVPYmplY3QpbW9kKTsKLQkJCQkJCQkJCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzU3RhdGljV2ViUHJvamVjdCh3Yy5nZXRQcm9qZWN0KCkpCi0JCQkJCQkJCQkJCQkJCXx8IEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViQ29tcG9uZW50KHdjKSkgewotCQkJCQkJCQkJCQkJCXVwZGF0ZUNvbnRleHRSb290KGVhcnBqLCB3YywgbW9kKTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQotCQkJCQkJCQkJCQkJUmVzb3VyY2UgdGhlUmVzb3VyY2UgPSAoKEVPYmplY3QpbW9kKS5lUmVzb3VyY2UoKTsKLQkJCQkJCQkJCQkJCWlmICh0aGVSZXNvdXJjZSAhPSBudWxsKQotCQkJCQkJCQkJCQkJewotCQkJCQkJCQkJCQkJCVN0cmluZyBmcmFnID0gbnVsbDsKLQkJCQkJCQkJCQkJCQlpZiAodGhlUmVzb3VyY2UgaW5zdGFuY2VvZiBDb21wYXRpYmlsaXR5WE1JUmVzb3VyY2UpCi0JCQkJCQkJCQkJCQkJCWZyYWcgPSB0aGVSZXNvdXJjZS5nZXRVUklGcmFnbWVudCgoRU9iamVjdCltb2QpOwotCQkJCQkJCQkJCQkJCSgoSUNvbW1vbkVNRk1vZHVsZSltb2QpLnNldElkKGZyYWcpOwotCQkJCQkJCQkJCQkJfQorCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCWlmIChyZWYhPW51bGwpCisJCQkJCQkJCQkJCQlyZWYuc2V0RGVwZW5kZW50T2JqZWN0KChFT2JqZWN0KW1vZCk7CisJCQkJCQkJCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzU3RhdGljV2ViUHJvamVjdCh3Yy5nZXRQcm9qZWN0KCkpCisJCQkJCQkJCQkJCQkJfHwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQod2MpKSB7CisJCQkJCQkJCQkJCQl1cGRhdGVDb250ZXh0Um9vdChlYXJwaiwgd2MsIG1vZCk7CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJUmVzb3VyY2UgdGhlUmVzb3VyY2UgPSAoKEVPYmplY3QpbW9kKS5lUmVzb3VyY2UoKTsKKwkJCQkJCQkJCQkJaWYgKHRoZVJlc291cmNlICE9IG51bGwpCisJCQkJCQkJCQkJCXsKKwkJCQkJCQkJCQkJCVN0cmluZyBmcmFnID0gbnVsbDsKKwkJCQkJCQkJCQkJCWlmICh0aGVSZXNvdXJjZSBpbnN0YW5jZW9mIENvbXBhdGliaWxpdHlYTUlSZXNvdXJjZSkKKwkJCQkJCQkJCQkJCQlmcmFnID0gdGhlUmVzb3VyY2UuZ2V0VVJJRnJhZ21lbnQoKEVPYmplY3QpbW9kKTsKKwkJCQkJCQkJCQkJCSgoSUNvbW1vbkVNRk1vZHVsZSltb2QpLnNldElkKGZyYWcpOwogCQkJCQkJCQkJCQl9CiAJCQkJCQkJCQkJfQogCQkJCQkJCQkJfQkJCQkJCQpAQCAtMTUzLDI3ICsxODksMzIgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJCXNlLnNhdmVJZk5lY2Vzc2FyeShtb25pdG9yKTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0gZmluYWxseSB7Ci0JCQlpZiAoc2UgIT0gbnVsbCkKKwkJCWlmIChzZSAhPSBudWxsKSB7CisJCQkJc2Uuc2F2ZUlmTmVjZXNzYXJ5KG1vbml0b3IpOwogCQkJCXNlLmRpc3Bvc2UoKTsKKwkJCX0KIAkJfQogCX0KIAogCXByaXZhdGUgdm9pZCB1cGRhdGVDb250ZXh0Um9vdChmaW5hbCBJUHJvamVjdCBlYXJwaiwgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgd2MsCiAJCQlJQ29tbW9uTW9kdWxlIG1vZCkgewotCQlib29sZWFuIHVzZU5ld01vZGVsID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFRERQcm9qZWN0VmVyc2lvbihlYXJwaikuZXF1YWxzKAotCQkJCUoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQpOwotCQlTdHJpbmcgY29udGV4dHJvb3QgPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0U2VydmVyQ29udGV4dFJvb3Qod2MuZ2V0UHJvamVjdCgpKTsKKwkJU3RyaW5nIGVhckREVmVyc2lvbiA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRUREUHJvamVjdFZlcnNpb24oZWFycGopOworCQlib29sZWFuIHVzZU5ld01vZGVsID0gZWFyRERWZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzVfMF9URVhUKSB8fCBlYXJERFZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNl8wX1RFWFQpOworCQlTdHJpbmcgY29udGV4dHJvb3QgPSBudWxsOworCQlpZiAod2MuaXNCaW5hcnkoKSkgeworCQkJSVBhdGggcGF0aCA9IChJUGF0aCl3Yy5nZXRBZGFwdGVyKElQYXRoLmNsYXNzKTsKKwkJCWNvbnRleHRyb290ID0gcGF0aC5yZW1vdmVGaWxlRXh0ZW5zaW9uKCkubGFzdFNlZ21lbnQoKTsKKwkJfSBlbHNlCisJCQljb250ZXh0cm9vdCA9IENvbXBvbmVudFV0aWxpdGllcy5nZXRTZXJ2ZXJDb250ZXh0Um9vdCh3Yy5nZXRQcm9qZWN0KCkpOwogCQlpZiAoY29udGV4dHJvb3QgPT0gbnVsbCkgewogCQkJY29udGV4dHJvb3QgPSB3Yy5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwogCQl9CiAJCWlmICh1c2VOZXdNb2RlbCkgewogCQkJaWYgKG1vZCBpbnN0YW5jZW9mIE1vZHVsZSkgewogCQkJCS8vIHNhZmV0eSBjaGVjawotCQkJCU1vZHVsZSBtb2R1bGUgPSAoTW9kdWxlKSBtb2Q7CiAJCQkJV2ViIHdlYiA9ICgoTW9kdWxlKSBtb2QpLmdldFdlYigpOwogCQkJCXdlYi5zZXRDb250ZXh0Um9vdChjb250ZXh0cm9vdCk7CiAJCQl9CkBAIC0xOTIsNyArMjMzLDE1IEBACiAJCUlDb21tb25Nb2R1bGUgbmV3TW9kdWxlID0gbnVsbDsKIAkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgZWFyID0gKElWaXJ0dWFsQ29tcG9uZW50KSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5UKTsKIAkJZmluYWwgSVByb2plY3QgZWFycGogPSBlYXIuZ2V0UHJvamVjdCgpOwotCQlib29sZWFuIHVzZU5ld01vZGVsID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFRERQcm9qZWN0VmVyc2lvbihlYXJwaikuZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQpOworCQkKKwkJU3RyaW5nIGVhckREVmVyc2lvbiA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRUREUHJvamVjdFZlcnNpb24oZWFycGopOworCQlib29sZWFuIHVzZU5ld01vZGVsID0gZWFyRERWZXJzaW9uLmVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzVfMF9URVhUKSB8fCBlYXJERFZlcnNpb24uZXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNl8wX1RFWFQpOworCQlpZiAod2MuaXNCaW5hcnkoKSl7CisJCQkvL1tCdWcgMjk5NTQ5XSBvcGVuIGFuZCBjYWNoZSBhcmNoaXZlIHVzaW5nIHRoZSBESVNDUklNSU5BVEVfTUFJTl9DTEFTUworCQkJLy9vcHRpb24gYmVmb3JlIGF0dGVtcHRpbmcgdGhlIEphdmFFRVF1aWNrUGVlaworCQkJSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLm9wZW5BcmNoaXZlKHdjLCB1c2VOZXdNb2RlbCk7CisJCX0KKwkJCiAJCS8vW0J1ZyAyMzgyNjRdIG5lZWQgdG8gdXNlIGNvbXBvbmVudCB0byBkZXRlcm1pbmUgdHlwZSBvZiBwcm9qZWN0IGluLWNhc2UgY29tcG9uZW50IGlzIGJpbmFyeQogCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQod2MpKSB7CiAJCQlpZiAodXNlTmV3TW9kZWwpIHsKQEAgLTI2NCw3ICszMTMsNyBAQAogCiAJcHJpdmF0ZSB2b2lkIHVwZGF0ZU1vZHVsZVJ1bnRpbWVzKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMTApOworCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDEwKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAKIAkJdHJ5IHsKQEAgLTI4Niw3ICszMzUsNDAgQEAKIAogCQkJRWFyRmFjZXRSdW50aW1lSGFuZGxlci51cGRhdGVNb2R1bGVQcm9qZWN0UnVudGltZShlYXJwaiwgbW9kdWxlUHJvamVjdHMsIHN1Ym1vbihtb25pdG9yLCA5KSk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9IGZpbmFsbHkgeworCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJCW1vbml0b3IuZG9uZSgpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIG1vZHVsZUNsYXNzcGF0aEZvcmNlVXBkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CisJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQkKKwkJdHJ5IHsKKwkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgdGhpcy5tb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7CisJCQkvLyBJZiB0aGlzIGlzIGEgY2FjaGluZyBjb21wb25lbnQsIHRoaXMgd2lsbCByZXR1cm4gdGhlIHVuZGVybHlpbmc7IG90aGVyd2lzZSBzZWxmCisJCQlFQVJWaXJ0dWFsQ29tcG9uZW50IGVhciA9IChFQVJWaXJ0dWFsQ29tcG9uZW50KWNvbXBvbmVudC5nZXRDb21wb25lbnQoKTsKKwkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkVFQ29tcG9uZW50KGVhciwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5ERF9WRVJTSU9OKSl7CisJCQkJU3RyaW5nIGRlcGxveVBhdGggPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX0RFUExPWV9QQVRIKTsKKwkJCQlTdHJpbmcgbGliRGlyID0gRWFyVXRpbGl0aWVzLmdldEVBUkxpYkRpcihlYXIpOworCQkJCUlQYXRoIGxpYkRpclBhdGggPSBudWxsOworCQkJCWlmKGxpYkRpciAhPSBudWxsKQorCQkJCQlsaWJEaXJQYXRoID0gbmV3IFBhdGgobGliRGlyKS5tYWtlUmVsYXRpdmUoKTsJCQkJCisJCQkJaWYobGliRGlyUGF0aCAhPSBudWxsICYmIGRlcGxveVBhdGggIT0gbnVsbCAmJiAhbGliRGlyUGF0aC5pc0VtcHR5KCkgJiYgbGliRGlyUGF0aC5lcXVhbHMobmV3IFBhdGgoZGVwbG95UGF0aCkubWFrZVJlbGF0aXZlKCkpKSB7CisJCQkJCS8vIHRoZSBjb21wb25lbnQgYWRkZWQgaXMgaW4gdGhlIGxpYnJhcnkgZGlyZWN0b3J5IG9mIGFuIEVBUiA1KyBwcm9qZWN0CisJCQkJCS8vIHdlIHNob3VsZCB0cmlnZ2VyIGZvcmNlIHVwZGF0ZSBvZiB0aGUgY2xhc3NwYXRoIG9mIGFsbCBtb2R1bGUgaW4gdGhlIEVBUgorCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBlYXIuZ2V0UmVmZXJlbmNlcygpOworCQkJCQlDb2xsZWN0aW9uPElQcm9qZWN0PiBwcm9qZWN0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0PigpOworCQkJCQlmb3IgKElWaXJ0dWFsUmVmZXJlbmNlIHJlZiA6IHJlZnMpIHsKKwkJCQkJCXByb2plY3RzLmFkZChyZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKSk7CisJCQkJCX0KKwkJCQkJSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKS5mb3JjZVVwZGF0ZShwcm9qZWN0cyk7CisJCQkJfQorCQkJfQogCQl9IGZpbmFsbHkgewogCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewogCQkJCW1vbml0b3IuZG9uZSgpOwpAQCAtMjk3LDI2ICszNzksNTEgQEAKIAlwcml2YXRlIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIHN1Ym1vbihmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHBhcmVudCwgZmluYWwgaW50IHRpY2tzKSB7CiAJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBudWxsIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwYXJlbnQsIHRpY2tzKSk7CiAJfQotCi0JcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkKKwlwdWJsaWMgc3RhdGljIFJlZmVyZW5jZWRDb21wb25lbnQgZmluZFJlZmVyZW5jZWRDb21wb25lbnQoV29ya2JlbmNoQ29tcG9uZW50IGFDb21wb25lbnQsIElWaXJ0dWFsQ29tcG9uZW50IGFSZWZlcmVuY2VkQ29tcG9uZW50LCBTdHJ1Y3R1cmVFZGl0IHNlLCBTdHJ1Y3R1cmVFZGl0IGNvbXBzZSkgeworCQlpZihhQ29tcG9uZW50ID09IG51bGwgfHwgYVJlZmVyZW5jZWRDb21wb25lbnQgPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlpZihhUmVmZXJlbmNlZENvbXBvbmVudC5pc0JpbmFyeSgpKXsKKwkJCUVMaXN0IHJlZmVyZW5jZWRDb21wb25lbnRzID0gYUNvbXBvbmVudC5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOworCQkJU3RyaW5nIG5hbWUgPSBudWxsOworCQkJaWYoYVJlZmVyZW5jZWRDb21wb25lbnQuZ2V0TmFtZSgpICE9IG51bGwpIHsKKwkJCQluYW1lID0gbmV3IFBhdGgoYVJlZmVyZW5jZWRDb21wb25lbnQuZ2V0TmFtZSgpKS5sYXN0U2VnbWVudCgpOworCQkJfQorCQkJaWYobmFtZSAhPSBudWxsKSB7CisJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZENvbXBvbmVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisJCQkJCVJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IChSZWZlcmVuY2VkQ29tcG9uZW50KSBpdGVyLm5leHQoKTsKKwkJCQkJVVJJIHVyaSA9IHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0SGFuZGxlKCk7CisJCQkJCWlmKCB1cmkgIT0gbnVsbCAmJiBuYW1lLmVxdWFscyh1cmkubGFzdFNlZ21lbnQoKSkpCisJCQkJCQlyZXR1cm4gcmVmZXJlbmNlZENvbXBvbmVudDsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlXb3JrYmVuY2hDb21wb25lbnQgcmVmd2MgPSBjb21wc2UuZ2V0Q29tcG9uZW50KCk7CisJCQlyZXR1cm4gc2UuZmluZFJlZmVyZW5jZWRDb21wb25lbnQoYUNvbXBvbmVudCwgcmVmd2MpOworCQl9CiAJCXJldHVybiBudWxsOwogCX0KIAorCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUVkaXRFQVIoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gT0tfU1RBVFVTOwogCQlJVmlydHVhbENvbXBvbmVudCBzb3VyY2VDb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7CiAJCUlQcm9qZWN0IHByb2plY3QgPSBzb3VyY2VDb21wLmdldFByb2plY3QoKTsKIAkJSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKCBwcm9qZWN0ICk7Ci0JCXN0YXR1cyA9IHByb3ZpZGVyLnZhbGlkYXRlRWRpdChudWxsLCBudWxsKTsKLQkJcmV0dXJuIHN0YXR1czsKKwkJaWYoIHByb3ZpZGVyICE9IG51bGwgKQorCQkJcmV0dXJuIHByb3ZpZGVyLnZhbGlkYXRlRWRpdChudWxsLCBudWxsKTsKKwkJcmV0dXJuIE9LX1NUQVRVUzsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVFZGl0KCkgewogCQlyZXR1cm4gdmFsaWRhdGVFZGl0RUFSKCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQWRkUmVmZXJlbmNlVG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQWRkUmVmZXJlbmNlVG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YmZkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BZGRSZWZlcmVuY2VUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgQWRkUmVmZXJlbmNlVG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlciAKKwlleHRlbmRzIEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIgeworCisJcHVibGljIEFkZFJlZmVyZW5jZVRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgeworCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKKwkJcHJvcGVydHlOYW1lcy5hZGQoSUFkZFJlZmVyZW5jZURhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCk7CisJCXByb3BlcnR5TmFtZXMuYWRkKElBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9SRUZFUkVOQ0VfTElTVCk7CisJCXJldHVybiBwcm9wZXJ0eU5hbWVzOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgeworCQlyZXR1cm4gbmV3IEFkZFJlZmVyZW5jZVRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uT3AobW9kZWwpOworCX0KKworCXB1YmxpYyBjbGFzcyBBZGRSZWZlcmVuY2VUb0VudGVycHJpc2VBcHBsaWNhdGlvbk9wIGV4dGVuZHMgQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25PcCB7CisJCXB1YmxpYyBBZGRSZWZlcmVuY2VUb0VudGVycHJpc2VBcHBsaWNhdGlvbk9wKElEYXRhTW9kZWwgbW9kZWwpIHsKKwkJCXN1cGVyKG1vZGVsKTsKKwkJCXNldE1pc3NpbmdQcm9wZXJ0aWVzKCk7CisJCX0KKwkJCisJCXByb3RlY3RlZCB2b2lkIHNldE1pc3NpbmdQcm9wZXJ0aWVzKCkgeworCQkJTGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gcmVmcyA9IChMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiltb2RlbC5nZXRQcm9wZXJ0eShJQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfUkVGRVJFTkNFX0xJU1QpOworCQkJTGlzdDxJVmlydHVhbENvbXBvbmVudD4gY29tcExpc3QgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOworCQkJTWFwPElWaXJ0dWFsQ29tcG9uZW50LCBTdHJpbmc+IHVyaU1hcCA9IG5ldyBIYXNoTWFwPElWaXJ0dWFsQ29tcG9uZW50LCBTdHJpbmc+KCk7CisJCQlNYXA8SVZpcnR1YWxDb21wb25lbnQsIFN0cmluZz4gZGVwbG95TWFwID0gbmV3IEhhc2hNYXA8SVZpcnR1YWxDb21wb25lbnQsIFN0cmluZz4oKTsKKwkJCUlWaXJ0dWFsUmVmZXJlbmNlIGN1cnJlbnRSZWY7CisJCQlmb3IoIGludCBpID0gMDsgaSA8IHJlZnMuc2l6ZSgpOyBpKysgKSB7CisJCQkJY3VycmVudFJlZiA9IHJlZnMuZ2V0KGkpOworCQkJCWNvbXBMaXN0LmFkZChjdXJyZW50UmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSk7CisJCQkJdXJpTWFwLnB1dChjdXJyZW50UmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSwgY3VycmVudFJlZi5nZXRBcmNoaXZlTmFtZSgpKTsKKwkJCQkvLyAgVGhpcyBtaWdodCBub3QgYmUgdGhlIGJlc3QgbGluZSwgYnV0IHNpbmNlIHRoZSBwYXJlbnQgY2xhc3Mgb25seSBoYXMgcm9vbSAKKwkJCQkvLyBmb3Igb25lIGRlcGxveSBwYXRoIGJ1dCBtdWx0aXBsZSBVUkkncyB0aGlzIGlzIGEgZGVmaWNpZW5jeSBpbiB0aGUgcGFyZW50LgorCQkJCS8vIEEgZml4IHdvdWxkIGJlIHRvIGNsb25lIEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uT3AgCisJCQkJLy8gYW5kIG1ha2UgaXQgZXh0ZW5kIEFkZFJlZmVyZW5jZXNPcAorCQkgICAgICAgIG1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSCwgY3VycmVudFJlZi5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCkpOworCQkgICAgICAgIGRlcGxveU1hcC5wdXQoY3VycmVudFJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCksIGN1cnJlbnRSZWYuZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpKTsKKwkJCX0KKwkJCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIGNvbXBMaXN0KTsKKwkJCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBtb2RlbC5nZXRQcm9wZXJ0eShJQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5UKSk7CisJCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCwgdXJpTWFwKTsKKwkJCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSF9NQVAsIGRlcGxveU1hcCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BZGRXZWJDb21wb25lbnRUb0VBUkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BZGRXZWJDb21wb25lbnRUb0VBUkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggNTNkZWM3Mi4uNGM1MTI4NyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQWRkV2ViQ29tcG9uZW50VG9FQVJEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FkZFdlYkNvbXBvbmVudFRvRUFSRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMTIsNiArMTIsOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwogCiBpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuVVRGMTY7CiBpbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKQEAgLTI2LDYgKzI4LDcgQEAKICAqLwogcHVibGljIGNsYXNzIEFkZFdlYkNvbXBvbmVudFRvRUFSRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUFkZFdlYkNvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7CiAJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwogCQlwcm9wZXJ0eU5hbWVzLmFkZChDT05URVhUX1JPT1QpOwpAQCAtNDksNiArNTIsNyBAQAogCS8qKgogCSAqIAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7CiAJCWJvb2xlYW4gbm90aWZ5ID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKIAkJaWYgKG5vdGlmeSAmJiBwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTlRFWFRfUk9PVCkpCkBAIC01OSw2ICs2Myw3IEBACiAJLyoqCiAJICogCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQkvLyBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05URVhUX1JPT1QpKQogCQkvLyByZXR1cm4gZ2V0RGVmYXVsdENvbnRleHRSb290KCk7CkBAIC02OSw2ICs3NCw3IEBACiAJLyoqCiAJICogCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAoQ09OVEVYVF9ST09ULmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CiAJCQlyZXR1cm4gdmFsaWRhdGVDb250ZXh0Um9vdChnZXRTdHJpbmdQcm9wZXJ0eShDT05URVhUX1JPT1QpKTsKQEAgLTgyLDE1ICs4OCwyNiBAQAogCSAqIEByZXR1cm4KIAkgKi8KIAlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUNvbnRleHRSb290KFN0cmluZyBjb250ZXh0Um9vdCkgewotCQlpZiAoY29udGV4dFJvb3QuZXF1YWxzKCIiKSB8fCBjb250ZXh0Um9vdCA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKKwkJaWYgKGNvbnRleHRSb290LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJcmV0dXJuIEoyRUVQbHVnaW4ubmV3RXJyb3JTdGF0dXMoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLkNvbnRleHRfUm9vdF9jYW5ub3RfYmVfZW1wdHlfMiwgbmV3IE9iamVjdFtde2NvbnRleHRSb290fSksIG51bGwpOyAKIAkJfSBlbHNlIGlmIChjb250ZXh0Um9vdC50cmltKCkuZXF1YWxzKGNvbnRleHRSb290KSkgewogCQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbnRleHRSb290LCAiLiIpOyAvLyROT04tTkxTLTEkCiAJCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKIAkJCQlTdHJpbmcgdG9rZW4gPSBzdG9rLm5leHRUb2tlbigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoKCk7IGkrKykgeworCQkJCWludCBjcDsKKwkJICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRva2VuLmxlbmd0aCgpOyBpICs9IFVURjE2LmdldENoYXJDb3VudChjcCkpIHsKKwkJICAgICAgICAgICAgY3AgPSBVVEYxNi5jaGFyQXQodG9rZW4sIGkpOwogCQkJCQlpZiAoISh0b2tlbi5jaGFyQXQoaSkgPT0gJ18nKSAmJiAhKHRva2VuLmNoYXJBdChpKSA9PSAnLScpICYmICEodG9rZW4uY2hhckF0KGkpID09ICcvJykgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCh0b2tlbi5jaGFyQXQoaSkpID09IGZhbHNlKSB7Ci0JCQkJCQlPYmplY3RbXSBpbnZhbGlkQ2hhciA9IG5ldyBPYmplY3RbXXsobmV3IENoYXJhY3Rlcih0b2tlbi5jaGFyQXQoaSkpKS50b1N0cmluZygpfTsKKwkJCQkJCVN0cmluZyBpbnZhbGlkQ2hhclN0cmluZyA9IG51bGw7CisJCQkJCQlpZiAoVVRGMTYuZ2V0Q2hhckNvdW50KGNwKT4xKQorCQkJCQkJeworCQkJCQkJCWludmFsaWRDaGFyU3RyaW5nID0gVVRGMTYudmFsdWVPZihjcCk7IAorCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWludmFsaWRDaGFyU3RyaW5nID0gKG5ldyBDaGFyYWN0ZXIodG9rZW4uY2hhckF0KGkpKSkudG9TdHJpbmcoKTsKKwkJCQkJCX0KKwkJCQkJCU9iamVjdFtdIGludmFsaWRDaGFyID0gbmV3IE9iamVjdFtde2ludmFsaWRDaGFyU3RyaW5nfTsKIAkJCQkJCVN0cmluZyBlcnJvclN0YXR1cyA9IFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhQcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5UaGVfY2hhcmFjdGVyX2lzX2ludmFsaWRfaW5fYV9jb250ZXh0X3Jvb3QsIGludmFsaWRDaGFyKTsgCiAJCQkJCQlyZXR1cm4gSjJFRVBsdWdpbi5uZXdFcnJvclN0YXR1cyhlcnJvclN0YXR1cywgbnVsbCk7CiAJCQkJCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FkZFdlYkZyYWdtZW50Q29tcG9uZW50VG9XZWJBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BZGRXZWJGcmFnbWVudENvbXBvbmVudFRvV2ViQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MzYxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BZGRXZWJGcmFnbWVudENvbXBvbmVudFRvV2ViQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgQWRkV2ViRnJhZ21lbnRDb21wb25lbnRUb1dlYkFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQWRkV2ViRnJhZ21lbnRDb21wb25lbnRUb1dlYkFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7CisKKwlwdWJsaWMgQWRkV2ViRnJhZ21lbnRDb21wb25lbnRUb1dlYkFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7CisJCXN1cGVyKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworCQlpZiAoVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUC5lcXVhbHMocHJvcGVydHlOYW1lKSkgeworCQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7CisJCQlMaXN0IGNvbXBvbmVudHMgPSAoTGlzdCkgZ2V0UHJvcGVydHkoVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5zaXplKCk7IGkrKykgeworCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgY29tcG9uZW50cy5nZXQoaSk7CisJCQkJU3RyaW5nIG5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOworCQkJCWlmKG5hbWUgIT0gbnVsbCkKKwkJCQkJbmFtZSA9IG5hbWUucmVwbGFjZSgnICcsJ18nKTsKKwkJCQluYW1lICs9IElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQ7CisJCQkJCisJCQkJbWFwLnB1dChjb21wb25lbnQsIG5hbWUpOworCQkJfQorCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBtYXApOworCQkJcmV0dXJuIG1hcDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisJfQorCisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgeworCQlyZXR1cm4gbmV3IEFkZFdlYkZyYWdtZW50Q29tcG9uZW50VG9XZWJBcHBsaWNhdGlvbk9wKG1vZGVsKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FkZFdlYkZyYWdtZW50Q29tcG9uZW50VG9XZWJBcHBsaWNhdGlvbk9wLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BZGRXZWJGcmFnbWVudENvbXBvbmVudFRvV2ViQXBwbGljYXRpb25PcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMWY4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BZGRXZWJGcmFnbWVudENvbXBvbmVudFRvV2ViQXBwbGljYXRpb25PcC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAqIENvcHlyaWdodCAoYykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNPcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CisKK3B1YmxpYyBjbGFzcyBBZGRXZWJGcmFnbWVudENvbXBvbmVudFRvV2ViQXBwbGljYXRpb25PcCBleHRlbmRzIENyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNPcCB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWV0YUluZkZvbGRlckRlcGxveVBhdGggPSAiLyI7IC8vJE5PTi1OTFMtMSQKKworCXB1YmxpYyBBZGRXZWJGcmFnbWVudENvbXBvbmVudFRvV2ViQXBwbGljYXRpb25PcChJRGF0YU1vZGVsIG1vZGVsKSB7CisJCXN1cGVyKG1vZGVsKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDQpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJdHJ5IHsKKwkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucGF1c2VVcGRhdGVzKCk7CisJCQlJU3RhdHVzICBzdGF0dXMgPSB2YWxpZGF0ZUVkaXQoKTsKKwkJCWlmKCBzdGF0dXMuaXNPSygpICl7CisJCQkJc3RhdHVzID0gc3VwZXIuZXhlY3V0ZShzdWJtb24obW9uaXRvciwgMSksIGluZm8pOworCQkJCWlmICghc3RhdHVzLmlzT0soKSkKKwkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOworCQkJfQorCQkJcmV0dXJuIHN0YXR1czsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCQltb25pdG9yLmRvbmUoKTsKKwkJCX0KKwkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucmVzdW1lVXBkYXRlcygpOworCQl9CisJfQorCisKKwlwcml2YXRlIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIHN1Ym1vbihmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHBhcmVudCwgZmluYWwgaW50IHRpY2tzKSB7CisJCXJldHVybiAocGFyZW50ID09IG51bGwgPyBudWxsIDogbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwYXJlbnQsIHRpY2tzKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHVuZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworCQlyZXR1cm4gbnVsbDsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BcHBDbGllbnRDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQXBwQ2xpZW50Q29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCA4YjIzODU4Li5iNjEzNTU2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9BcHBDbGllbnRDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0FwcENsaWVudENvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTEwLDggKzEwLDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkFwcENsaWVudENvbXBvbmVudEV4cG9ydE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuSmF2YUVFQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKIApAQCAtMjIsMTkgKzIzLDIzIEBACiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogCi0gICAgcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnRPcGVyYXRpb24obW9kZWwpOworICAgIEBPdmVycmlkZQorCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF2YUVFQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uKG1vZGVsKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZUV4dGVuc2lvbigpIHsKLSAgICAgICAgcmV0dXJuICIuamFyIjsgLy8kTk9OLU5MUy0xJAorICAgIEBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlRXh0ZW5zaW9uKCkgeworICAgICAgICByZXR1cm4gSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVDsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFdyb25nQ29tcG9uZW50VHlwZVN0cmluZyhTdHJpbmcgcHJvamVjdE5hbWUpIHsKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFdyb25nQ29tcG9uZW50VHlwZVN0cmluZyhTdHJpbmcgcHJvamVjdE5hbWUpIHsKICAgICAgICAgcmV0dXJuIEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5OT1RfQU5fQVBQX0NMSUVOVCwgbmV3IE9iamVjdFtde3Byb2plY3ROYW1lfSk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0VHlwZSgpIHsKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RUeXBlKCkgewogICAgICAgICByZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuQVBQTElDQVRJT05fQ0xJRU5UOwogICAgIH0KICAgICAvKioKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0JpbmFyeVByb2plY3RIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0JpbmFyeVByb2plY3RIZWxwZXIuamF2YQppbmRleCBmNDkzOTA5Li5kNGRmM2MxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9CaW5hcnlQcm9qZWN0SGVscGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQmluYXJ5UHJvamVjdEhlbHBlci5qYXZhCkBAIC0yNSwxMCArMjUsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiAKIHB1YmxpYyBjbGFzcyBCaW5hcnlQcm9qZWN0SGVscGVyIHsKIApAQCAtNTQsMTEgKzU0LDExIEBACiAJCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3RW50cmllcywgbW9uaXRvcik7CiAJCQkJCQkJCSAKIAkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9IAogCX0gCiAKQEAgLTcyLDcgKzcyLDcgQEAKIAkJCWlmIChlbnRyaWVzICE9IG51bGwpIHsKIAkJCQlJQ2xhc3NwYXRoRW50cnkgZW50cnlUb1JlbW92ZSA9IG51bGw7CiAJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChlbnRyaWVzW2ldLmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSAmJiBlbnRyaWVzW2ldLmdldFBhdGgoKS50b1N0cmluZygpLmVuZHNXaXRoKCJpbXBvcnRlZF9jbGFzc2VzIikgJiYgIXByb2plY3QuZ2V0Rm9sZGVyKCJpbXBvcnRlZF9jbGFzc2VzIikuZXhpc3RzKCkpIHsKKwkJCQkJaWYgKGVudHJpZXNbaV0uZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZICYmIGVudHJpZXNbaV0uZ2V0UGF0aCgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoImltcG9ydGVkX2NsYXNzZXMiKSAmJiAhcHJvamVjdC5nZXRGb2xkZXIoImltcG9ydGVkX2NsYXNzZXMiKS5leGlzdHMoKSkgeyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKIAkJCQkJCWVudHJ5VG9SZW1vdmUgPSBlbnRyaWVzW2ldOwogCQkJCQkJYnJlYWs7CiAJCQkJCX0KQEAgLTEyNyw3ICsxMjcsNyBAQAogCQkJZW50cmllcyA9IChJQ2xhc3NwYXRoRW50cnlbXSkgbmV3Q3AudG9BcnJheShuZXcgSUNsYXNzcGF0aEVudHJ5W25ld0NwLnNpemUoKV0pOwogCQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKGVudHJpZXMsIG1vbml0b3IpOwogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZXgpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihleCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0NsYXNzUGF0aFNlbGVjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ2xhc3NQYXRoU2VsZWN0aW9uLmphdmEKaW5kZXggZDIwYmIwYi4uNWViNzhmYyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ2xhc3NQYXRoU2VsZWN0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ2xhc3NQYXRoU2VsZWN0aW9uLmphdmEKQEAgLTM4LDcgKzM4LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuQXJjaGl2ZU1hbmlmZXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlLklKYXZhUHJvamVjdExpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuamF2YWxpdGUuSmF2YUNvcmVMaXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbDsKQEAgLTQ2LDIzICs0NiwyMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5EZXBlbmRlbmN5QXR0cmlidXRlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk1hbmlmZXN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5zdHJhdGVneS5Mb2FkU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuWmlwRmlsZUxvYWRTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5Db21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5FQVJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5RW5hYmxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuSkVFTWFuaWZlc3REaXNjZXJuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5FYXJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKQEAgLTc3LDEwICs3NywxMSBAQAogCiBwdWJsaWMgY2xhc3MgQ2xhc3NQYXRoU2VsZWN0aW9uIHsKIAlwcm90ZWN0ZWQgQXJjaGl2ZSBhcmNoaXZlOwotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdDsKKwlwcm90ZWN0ZWQgQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0OwogCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQ7CiAJcHJvdGVjdGVkIElQcm9qZWN0IGVhclByb2plY3Q7CiAJcHJvdGVjdGVkIElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudDsKKwlwcm90ZWN0ZWQgU3RyaW5nIGVhckxpYnJhcnlEaXJlY3RvcnkgPSBudWxsOwogCXByb3RlY3RlZCBMaXN0IGNsYXNzcGF0aEVsZW1lbnRzOwogCXByb3RlY3RlZCBNYXAgdXJpc1RvRWxlbWVudHM7CiAJcHJvdGVjdGVkIGJvb2xlYW4gbW9kaWZpZWQ7CkBAIC0xNTQsOSArMTU1LDI4IEBACiAJCXRoaXMoYUNvbXBvbmVudCk7CiAJCWVhckNvbXBvbmVudCA9IGFuRWFyQ29tcG9uZW50OwogCQllYXJQcm9qZWN0ID0gZWFyQ29tcG9uZW50LmdldFByb2plY3QoKTsKKwkJcmVmcmVzaEVBUkxpYnJhcnlEaXJlY3RvcnkoKTsKIAkJaW5pdGlhbGl6ZUVsZW1lbnRzKCk7CiAJfQogCisJcHVibGljIENsYXNzUGF0aFNlbGVjdGlvbihJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50LCBJVmlydHVhbENvbXBvbmVudCBhbkVhckNvbXBvbmVudCwgQXJjaGl2ZU1hbmlmZXN0IGFNYW5pZmVzdCkgeworCQl0aGlzKGFDb21wb25lbnQpOworCQllYXJDb21wb25lbnQgPSBhbkVhckNvbXBvbmVudDsKKwkJZWFyUHJvamVjdCA9IGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCk7CisJCW1hbmlmZXN0ID0gYU1hbmlmZXN0OworCQlyZWZyZXNoRUFSTGlicmFyeURpcmVjdG9yeSgpOworCQlpbml0aWFsaXplRWxlbWVudHMoKTsKKwl9CisJCisJcHVibGljIENsYXNzUGF0aFNlbGVjdGlvbihJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50LCBBcmNoaXZlTWFuaWZlc3QgYU1hbmlmZXN0KSB7CisJCXN1cGVyKCk7CisJCWNvbXBvbmVudCA9IGFDb21wb25lbnQ7CisJCXRhcmdldFByb2plY3ROYW1lID0gYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOworCQltYW5pZmVzdCA9IGFNYW5pZmVzdDsKKwkJaW5pdGlhbGl6ZUVsZW1lbnRzKCk7CisJfQorCQorCQogCS8qKgogCSAqIENsYXNzUGF0aFNlbGVjdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgogCSAqLwpAQCAtMTg1LDcgKzIwNSw3IEBACiAJCQlpZiggZWFyQ29uZW50Rm9sZGVyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICl7CiAJCQkJZWxlbWVudC5zZXRFYXJDb250ZW50Rm9sZGVyKCBlYXJDb25lbnRGb2xkZXIuZ2V0TmFtZSgpKTsKIAkJCX1lbHNlIHsKLQkJCQllbGVtZW50LnNldEVhckNvbnRlbnRGb2xkZXIoICIiICk7CisJCQkJZWxlbWVudC5zZXRFYXJDb250ZW50Rm9sZGVyKCAiIiApOyAvLyROT04tTkxTLTEkCiAJCQl9CiAJCX0KIAkKQEAgLTE5NywxMCArMjE3LDIxIEBACiAJfQogCiAJcHJvdGVjdGVkIENsYXNzcGF0aEVsZW1lbnQgY3JlYXRlRWxlbWVudChJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2luZ0FyY2hpdmUsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZWRBcmNoaXZlLCBTdHJpbmcgY3BFbnRyeSkgewotCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSBuZXcgQ2xhc3NwYXRoRWxlbWVudChyZWZlcmVuY2luZ0FyY2hpdmUpOworCQlJVmlydHVhbFJlZmVyZW5jZSBjaGlsZFByb2plY3RWaXJ0dWFsUmVmID0gbnVsbDsKKwkJSVZpcnR1YWxSZWZlcmVuY2VbXSBoYXJkUmVmcyA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7CisJCWZvciggaW50IGkgPSAwOyBpIDwgaGFyZFJlZnMubGVuZ3RoOyBpKysgKSB7CisJCQlpZihoYXJkUmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLmVxdWFscyhyZWZlcmVuY2luZ0FyY2hpdmUuZ2V0UHJvamVjdCgpKSkgeworCQkJCWNoaWxkUHJvamVjdFZpcnR1YWxSZWYgPSBoYXJkUmVmc1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY3JlYXRlRWxlbWVudChjaGlsZFByb2plY3RWaXJ0dWFsUmVmLCByZWZlcmVuY2VkQXJjaGl2ZSwgY3BFbnRyeSk7CisJfQorCQorCXByb3RlY3RlZCBDbGFzc3BhdGhFbGVtZW50IGNyZWF0ZUVsZW1lbnQoSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNpbmdBcmNoaXZlLCBJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2VkQXJjaGl2ZSwgU3RyaW5nIGNwRW50cnkpIHsKKwkJQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50ID0gbmV3IENsYXNzcGF0aEVsZW1lbnQocmVmZXJlbmNpbmdBcmNoaXZlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSk7CiAJCWVsZW1lbnQuc2V0VmFsaWQodHJ1ZSk7Ci0JCQkJCi0JCVN0cmluZyB1cmlTdHJpbmcgPSByZWZlcmVuY2VkQXJjaGl2ZS5nZXRBcmNoaXZlTmFtZSgpOworCQlTdHJpbmcgdXJpU3RyaW5nID0gSkVFTWFuaWZlc3REaXNjZXJuZXIuY2FsY3VsYXRlTWFuaWZlc3RSZWxhdGl2ZVJ1bnRpbWVQYXRoKHJlZmVyZW5jaW5nQXJjaGl2ZSwgcmVmZXJlbmNlZEFyY2hpdmUpLmFwcGVuZCgobmV3IFBhdGgocmVmZXJlbmNlZEFyY2hpdmUuZ2V0QXJjaGl2ZU5hbWUoKSkpLmxhc3RTZWdtZW50KCkpLnRvU3RyaW5nKCk7CiAJCQogCQllbGVtZW50LnNldFRleHQodXJpU3RyaW5nKTsKIAkJZWxlbWVudC5zZXRUYXJnZXRDb21wb25lbnQocmVmZXJlbmNlZEFyY2hpdmUuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKQEAgLTIxMCw3ICsyNDEsNyBAQAogCQkJaWYoIGVhckNvbmVudEZvbGRlci5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUiApewogCQkJCWVsZW1lbnQuc2V0RWFyQ29udGVudEZvbGRlciggZWFyQ29uZW50Rm9sZGVyLmdldE5hbWUoKSk7CiAJCQl9ZWxzZSB7Ci0JCQkJZWxlbWVudC5zZXRFYXJDb250ZW50Rm9sZGVyKCAiIiApOworCQkJCWVsZW1lbnQuc2V0RWFyQ29udGVudEZvbGRlciggIiIgKTsgLy8kTk9OLU5MUy0xJAogCQkJfQogCQl9CiAJCkBAIC0yOTcsMTMgKzMyOCwyNSBAQAogCSAqIENyZWF0ZSBhIG5ldyBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCAodXNlZCBvbmx5IGZvciBkaXNwbGF5IHB1cnBvc2VzKSB3aG9zZSBJUHJvamVjdCBpcyBzZXQgdG8gYSBkdW1teSB2YWx1ZSB3aG9zZQogCSAqIG5hbWUgaXMgYSBjb25jYXRlbnRhdGlvbiBvZiB0aGUgZXhpc3RpbmcgbmFtZSBhbmQgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgcmVmLgogCSAqIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNhc2Ugd2hlcmUgYSBzaW5nbGUgdW5pcXVlIGFyY2hpdmUgaXMgcmVmZXJlbmNlZC9jb250cmlidXRlZCBieSBtdWx0aXBsZSBkZXBlbmRlbnQgcHJvamVjdHMuCisJICogQGRlcHJlY2F0ZWQKIAkgKi8gCiAJcHVibGljIHN0YXRpYyBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCB1cGRhdGVEaXNwbGF5VmlydHVhbEFyY2hpdmVDb21wb25lbnQoZmluYWwgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgb2xkQ29tcCwgZmluYWwgSVZpcnR1YWxSZWZlcmVuY2UgbmV3UmVmKSB7Ci0JCWZpbmFsIFN0cmluZyBuZXdQcm9qTmFtZSA9IG9sZENvbXAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArICIgIiArIG5ld1JlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsgIAorCQlmaW5hbCBTdHJpbmcgbmV3UHJvak5hbWUgPSBvbGRDb21wLmdldFByb2plY3QoKS5nZXROYW1lKCkgKyAiICIgKyBuZXdSZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKS5nZXROYW1lKCk7ICAgLy8kTk9OLU5MUy0xJAogCQlmaW5hbCBJUHJvamVjdCBuZXdQcm9qID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG5ld1Byb2pOYW1lKTsKIAkJZmluYWwgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgbmV3Q29tcG9uZW50ID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBDb21wb25lbnRDb3JlLmNyZWF0ZUFyY2hpdmVDb21wb25lbnQobmV3UHJvaiwgb2xkQ29tcC5nZXROYW1lKCkpOwogCQlyZXR1cm4gbmV3Q29tcG9uZW50OwogCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCAodXNlZCBvbmx5IGZvciBkaXNwbGF5IHB1cnBvc2VzKSB3aG9zZSBJUHJvamVjdCBpcyBzZXQgdG8gYSBkdW1teSB2YWx1ZSB3aG9zZQorCSAqIG5hbWUgaXMgYSBjb25jYXRlbnRhdGlvbiBvZiB0aGUgZXhpc3RpbmcgbmFtZSBhbmQgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgcmVmLgorCSAqIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNhc2Ugd2hlcmUgYSBzaW5nbGUgdW5pcXVlIGFyY2hpdmUgaXMgcmVmZXJlbmNlZC9jb250cmlidXRlZCBieSBtdWx0aXBsZSBkZXBlbmRlbnQgcHJvamVjdHMuCisJICovCisJcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCB1cGRhdGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudERpc3BsYXkoZmluYWwgSVZpcnR1YWxDb21wb25lbnQgb2xkQ29tcCwgZmluYWwgSVZpcnR1YWxSZWZlcmVuY2UgbmV3UmVmKSB7CisJCWZpbmFsIFN0cmluZyBuZXdQcm9qTmFtZSA9IG9sZENvbXAuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArICIgIiArIG5ld1JlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsgICAvLyROT04tTkxTLTEkCisJCWZpbmFsIElQcm9qZWN0IG5ld1Byb2ogPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobmV3UHJvak5hbWUpOworCQlyZXR1cm4gQ29tcG9uZW50Q29yZS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KG5ld1Byb2osIG9sZENvbXAuZ2V0TmFtZSgpKTsKKwl9CiAJCiAJcHVibGljIENsYXNzcGF0aEVsZW1lbnRbXSBjcmVhdGVDbGFzc3BhdGhFbnRyeUVsZW1lbnRzKGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAsIGZpbmFsIElQYXRoIGFyY2hpdmVSdW50aW1lUGF0aCwgZmluYWwgSVBhdGggY2xhc3NGb2xkZXJSdW50aW1lUGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlmaW5hbCBMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwpAQCAtMzExLDkgKzM1NCw5IEBACiAJCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gY29tcC5nZXRQcm9qZWN0KCk7CiAJCQlpZiAocHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewogCQkJCWZpbmFsIElKYXZhUHJvamVjdExpdGUgamF2YVByb2plY3RMaXRlID0gSmF2YUNvcmVMaXRlLmNyZWF0ZShwcm9qZWN0KTsKKwkJCQlmaW5hbCBib29sZWFuIGlzTGVnYWN5SjJFRSA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNMZWdhY3lKMkVFQ29tcG9uZW50KGNvbXApOwogCQkJCWZpbmFsIGJvb2xlYW4gaXNXZWJBcHAgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCk7Ci0JCQkJZmluYWwgYm9vbGVhbiB3ZWJMaWJzT25seSA9IGlzV2ViQXBwICYmICFDbGFzc3BhdGhEZXBlbmRlbmN5RW5hYmxlbWVudC5pc0FsbG93Q2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jeSgpOwotCQkJCWZpbmFsIE1hcCB0YWdnZWRFbnRyaWVzID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UmF3Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGphdmFQcm9qZWN0TGl0ZSwgRGVwZW5kZW5jeUF0dHJpYnV0ZVR5cGUuQ0xBU1NQQVRIX0NPTVBPTkVOVF9ERVBFTkRFTkNZLCB3ZWJMaWJzT25seSk7CisJCQkJZmluYWwgTWFwIHRhZ2dlZEVudHJpZXMgPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRSYXdDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3RMaXRlLCBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1ksIGlzTGVnYWN5SjJFRSk7CiAJCQkJCiAJCQkJSXRlcmF0b3IgaSA9IHRhZ2dlZEVudHJpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKIAkJCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKQEAgLTMzMCw3ICszNzMsNyBAQAogCQkJCQlhZGRDbGFzc3BhdGhFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnQuZ2V0QXJjaGl2ZVVSSSgpLnRvU3RyaW5nKCkpOwogCQkJCX0KIAkJCQkKLQkJCQlmaW5hbCBMaXN0IHBvdGVudGlhbEVudHJpZXMgPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRQb3RlbnRpYWxDb21wb25lbnRDbGFzc3BhdGhEZXBlbmRlbmNpZXMoamF2YVByb2plY3RMaXRlLCB3ZWJMaWJzT25seSk7CisJCQkJZmluYWwgTGlzdCBwb3RlbnRpYWxFbnRyaWVzID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UG90ZW50aWFsQ29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGphdmFQcm9qZWN0TGl0ZSk7CiAJCQkJaSA9IHBvdGVudGlhbEVudHJpZXMuaXRlcmF0b3IoKTsKIAkJCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKIAkJCQkJZmluYWwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5ID0gKElDbGFzc3BhdGhFbnRyeSkgaS5uZXh0KCk7CkBAIC01MjIsNyArNTY1LDggQEAKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgewogCQkJSVZpcnR1YWxSZWZlcmVuY2UgYW5BcmNoaXZlID0gKElWaXJ0dWFsUmVmZXJlbmNlKSBhcmNoaXZlcy5nZXQoaSk7CiAJCQkKLQkJCVN0cmluZyBhcmNoaXZlVVJJU3RyaW5nID0gYW5BcmNoaXZlLmdldEFyY2hpdmVOYW1lKCk7CisJCQlJUGF0aCBhbkFyY2hpdmVQYXRoID0gYW5BcmNoaXZlLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlKCk7CisJCQlTdHJpbmcgYXJjaGl2ZVVSSVN0cmluZyA9IGFuQXJjaGl2ZVBhdGguYXBwZW5kKGFuQXJjaGl2ZS5nZXRBcmNoaXZlTmFtZSgpKS50b1N0cmluZygpOwogCQkJaWYgKGFyY2hpdmVVUklTdHJpbmcuZXF1YWxzKHVyaSkpCiAJCQkJcmV0dXJuIGFuQXJjaGl2ZTsKIAkJfQpAQCAtNTMxLDcgKzU3NSw3IEBACiAKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZERlcGVuZGVuY3koSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZEpBUiwgSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNpbmdKQVIpIHsKIAkJLy9ObyBvdGhlciBtb2R1bGVzIHNob3VsZCByZWZlcmVuY2Ugd2FycwotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViQ29tcG9uZW50KHJlZmVyZW5jZWRKQVIpKQorCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQocmVmZXJlbmNlZEpBUikpCiAJCQlyZXR1cm4gZmFsc2U7CiAKIAkJaWYgKCByZWZlcmVuY2VkSkFSLmdldE5hbWUoKS5lcXVhbHMoIHJlZmVyZW5jaW5nSkFSLmdldE5hbWUoKSApICkKQEAgLTU0MCw3ICs1ODQsNyBAQAogCQkvL0NsaWVudHMgY2FuIHJlZmVyZW5jZSBhbGwgYnV0IHRoZSBXQVJzLCB3aGljaCB3ZSd2ZSBhbHJlYWR5IGNvdmVyZWQKIAkJLy8gYWJvdmU7IFdBUnMgYW5kIEVKQiBKQVJzCiAJCS8vY2FuIHJlZmVyZW5jZSBhbGwgYnV0IFdBUnMsIGFib3ZlLCBvciBBcHBsaWNhdGlvbkNsaWVudHMKLQkJcmV0dXJuIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRDb21wb25lbnQocmVmZXJlbmNpbmdKQVIpIHx8ICFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50Q29tcG9uZW50KHJlZmVyZW5jZWRKQVIpOworCQlyZXR1cm4gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50Q29tcG9uZW50KHJlZmVyZW5jaW5nSkFSKSB8fCAhSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50Q29tcG9uZW50KHJlZmVyZW5jZWRKQVIpOwogCX0KIAogCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbGVtZW50cygpIHsKQEAgLTU1NSw5ICs1OTksMTEgQEAKIAkJSVZpcnR1YWxSZWZlcmVuY2Ugb3RoZXIgPSBudWxsOwogCQlDbGFzc3BhdGhFbGVtZW50IGVsZW1lbnQgPSBudWxsOwogCQlTdHJpbmdbXSBjcCA9IG5ldyBTdHJpbmdbMF07CisJCUlWaXJ0dWFsUmVmZXJlbmNlIGNoaWxkUHJvamVjdFZpcnR1YWxSZWYgPSBudWxsOworCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBudWxsOwogCQkKIAkJaWYgKGVhckNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwkJCisJCQlyZWZlcmVuY2VzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsJCQogCQkJZm9yIChpbnQgY250PTA7IGNudDxyZWZlcmVuY2VzLmxlbmd0aDsgY250KyspCiAJCQl7CiAJCQkJY2xpZW50Q29tcG9uZW50ID0gbnVsbDsKQEAgLTU2NSwxOCArNjExLDE3IEBACiAJCQkJcm9vdE1vZGVsT2JqZWN0ID0gbnVsbDsKIAkJCQllamJDbGllbnRKYXJOYW1lID0gbnVsbDsKIAkJCQljdXJyZW50Q29tcG9uZW50ID0gcmVmZXJlbmNlc1tjbnRdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJDb21wb25lbnQoY3VycmVudENvbXBvbmVudCkpCisJCQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJDb21wb25lbnQoY3VycmVudENvbXBvbmVudCkpCiAJCQkJewogCQkJCQlpZihjdXJyZW50Q29tcG9uZW50LmlzQmluYXJ5KCkpewogCQkJCQkJLy9UT0RPIGFkZCBiaW5hcnkgc3VwcG9ydAogCQkJCQkJY29udGludWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQltb2RlbFByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihjdXJyZW50Q29tcG9uZW50KTsKLQkJCQkJCWlmKG1vZGVsUHJvdmlkZXI9PW51bGwpIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCXJvb3RNb2RlbE9iamVjdCA9IG1vZGVsUHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKIAkJCQkJfQorCQkJCQltb2RlbFByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihjdXJyZW50Q29tcG9uZW50KTsKKwkJCQkJaWYobW9kZWxQcm92aWRlcj09bnVsbCkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJcm9vdE1vZGVsT2JqZWN0ID0gbW9kZWxQcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwogCQkJCQlpZiAocm9vdE1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRUpCSmFyKQogCQkJCQl7CiAJCQkJCQllamJDbGllbnRKYXJOYW1lID0gKChFSkJKYXIpcm9vdE1vZGVsT2JqZWN0KS5nZXRFamJDbGllbnRKYXIoKTsKQEAgLTYwMiwyMSArNjQ3LDQxIEBACiAJCQkKIAkJCXRyeSB7CiAJCQkJLy8JCQljcCA9IGFyY2hpdmUuZ2V0TWFuaWZlc3QoKS5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJCQltYW5pZmVzdCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLnJlYWRNYW5pZmVzdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKKwkJCQkKKwkJCQlpZiggbWFuaWZlc3QgPT0gbnVsbCApeworCQkJCQltYW5pZmVzdCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLnJlYWRNYW5pZmVzdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKKwkJCQl9CiAJCQkJY3AgPSBtYW5pZmVzdC5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKIAkJCX0gY2F0Y2ggKE1hbmlmZXN0RXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGV4KTsKIAkJCX0KLQkJCVN0cmluZyBwcm9qZWN0VXJpID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZShjb21wb25lbnQuZ2V0TmFtZSgpKS5nZXRBcmNoaXZlTmFtZSgpOworCiAJCQlhcmNoaXZlcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpKSk7CisJCQlJUGF0aCBlYXJMaWJEaXJQYXRoID0gbnVsbDsKKwkJCWlmKGVhckxpYnJhcnlEaXJlY3RvcnkgIT0gbnVsbCkKKwkJCQllYXJMaWJEaXJQYXRoID0gbmV3IFBhdGgoZWFyTGlicmFyeURpcmVjdG9yeSkubWFrZVJlbGF0aXZlKCk7CisJCQkKKwkJCWZvciggaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKyApIHsKKwkJCQlpZihyZWZlcmVuY2VzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkuZXF1YWxzKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7CisJCQkJCWNoaWxkUHJvamVjdFZpcnR1YWxSZWYgPSByZWZlcmVuY2VzW2ldOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CiAJCQkKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKIAkJCQlTdHJpbmcgY3BFbnRyeSA9IGNwW2ldOwotCQkJCVN0cmluZyB1cmkgPSBBcmNoaXZlVXRpbC5kZXJpdmVFQVJSZWxhdGl2ZVVSSShjcEVudHJ5LCBwcm9qZWN0VXJpKTsKLQotCQkJCW90aGVyID0gZ2V0VmlydHVhbFJlZmVyZW5jZSh1cmksIGFyY2hpdmVzKTsKLQkJCQlpZiAob3RoZXIgIT0gbnVsbCAmJiBpc1ZhbGlkRGVwZW5kZW5jeShvdGhlci5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCksIGNvbXBvbmVudCkpIHsKLQkJCQkJZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoY29tcG9uZW50LCBvdGhlciwgY3BFbnRyeSk7CisJCQkJUGF0aCBjcFBhdGggPSBuZXcgUGF0aChjcEVudHJ5KTsKKwkJCQlmb3IoIGludCBqID0gMDsgaiA8IHJlZmVyZW5jZXMubGVuZ3RoOyBqKysgKSB7CisJCQkJCWlmKHJlZmVyZW5jZXNbal0uZ2V0QXJjaGl2ZU5hbWUoKS5lcXVhbHMoY3BQYXRoLmxhc3RTZWdtZW50KCkpKSB7CisJCQkJCQlvdGhlciA9IHJlZmVyZW5jZXNbal07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlTdHJpbmcgdXJpU3RyaW5nID0gbnVsbDsKKwkJCQlpZihvdGhlciAhPSBudWxsKQorCQkJCQl1cmlTdHJpbmcgPSBKRUVNYW5pZmVzdERpc2Nlcm5lci5jYWxjdWxhdGVNYW5pZmVzdFJlbGF0aXZlUnVudGltZVBhdGgoY2hpbGRQcm9qZWN0VmlydHVhbFJlZiwgb3RoZXIpLmFwcGVuZCgobmV3IFBhdGgob3RoZXIuZ2V0QXJjaGl2ZU5hbWUoKSkpLmxhc3RTZWdtZW50KCkpLnRvU3RyaW5nKCk7CisJCQkJaWYgKG90aGVyICE9IG51bGwgJiYgaXNWYWxpZERlcGVuZGVuY3kob3RoZXIuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLCBjb21wb25lbnQpICYmIChlYXJMaWJyYXJ5RGlyZWN0b3J5ID09IG51bGwgfHwgZWFyTGliRGlyUGF0aCAhPSBudWxsICYmIGVhckxpYkRpclBhdGguaXNFbXB0eSgpIHx8ICFvdGhlci5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLmVxdWFscyhlYXJMaWJEaXJQYXRoKSkgJiYgKHVyaVN0cmluZyA9PSBudWxsIHx8IHVyaVN0cmluZy5lcXVhbHMoY3BFbnRyeSkpKSB7CisJCQkJCWVsZW1lbnQgPSBjcmVhdGVFbGVtZW50KGNoaWxkUHJvamVjdFZpcnR1YWxSZWYsIG90aGVyLCBjcEVudHJ5KTsKIAkJCQkJYXJjaGl2ZXMucmVtb3ZlKG90aGVyKTsKIAkJCQl9IGVsc2UgewogCQkJCQllbGVtZW50ID0gY3JlYXRlSW52YWxpZEVsZW1lbnQoY3BFbnRyeSk7CkBAIC02MzAsNyArNjk1LDcgQEAKIAkJCQkJaWYoIG90aGVyID09IG51bGwgKXsKIAkJCQkJCS8vbWFraW5nIGEgYmVzdCBndWVzcyBmb3IgdGhlIHByb2plY3QgbmFtZQogCQkJCQkJaWYoIGVsZW1lbnQuZ2V0UHJvamVjdCgpID09IG51bGwgKXsKLQkJCQkJCQlpbnQgaW5kZXggPSBjcEVudHJ5LmluZGV4T2YoIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCWludCBpbmRleCA9IGNwRW50cnkuaW5kZXhPZihJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUKTsKIAkJCQkJCQkvLyBpZiBqYXIgaXMgbmVzdGVkIGluIGEgZm9sZGVyIHlvdSBtdXN0IG5vdCBsb29rIGZvcgogCQkJCQkJCS8vIHByb2plY3QgKHNlZ21lbnRzIGluIHByb2plY3QgbmFtZSBjYXVzZSBhc3NlcnRpb24KIAkJCQkJCQkvLyBlcnJvcikKQEAgLTY1NSw3ICs3MjAsNyBAQAogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQotCQkJCWFkZENsYXNzcGF0aEVsZW1lbnQoZWxlbWVudCwgdXJpKTsKKwkJCQlhZGRDbGFzc3BhdGhFbGVtZW50KGVsZW1lbnQsIGVsZW1lbnQuZ2V0VGV4dCgpKTsKIAkJCX0KIAkJfQogCQkKQEAgLTY2NCwyNyArNzI5LDQyIEBACiAJCS8vY3JlYXRlQ2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jeUVsZW1lbnRzKGNvbXApOwogCQkKIAkJLy8gQWRkIGVsZW1lbnRzIGZvciByYXcgY2xhc3NwYXRoIGVudHJpZXMgKGVpdGhlciBhbHJlYWR5IHRhZ2dlZCBvciBwb3RlbnRpYWxseSB0YWdnYWJsZSkgCi0JCWlmKENsYXNzcGF0aERlcGVuZGVuY3lFbmFibGVtZW50LmlzQWxsb3dDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5KCkpewotCQkJdHJ5IHsKLQkJCSAgICBjcmVhdGVDbGFzc3BhdGhFbnRyeUVsZW1lbnRzKGNvbXBvbmVudCwgSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSX1BBVEgsIElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTVBPTkVOVF9QQVRIKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKEoyRUVQbHVnaW4uUExVR0lOX0lEKS5sb2dFcnJvcihjZSk7Ci0JCQl9Ci0JCX0KKy8vCQkJdHJ5IHsKKy8vCQkJICAgIGNyZWF0ZUNsYXNzcGF0aEVudHJ5RWxlbWVudHMoY29tcG9uZW50LCBJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCwgSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09NUE9ORU5UX1BBVEgpOworLy8JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisvLwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGNlKTsKKy8vCQkJfQogCQkKIAkJaWYgKGVhckNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KGFyY2hpdmVzLCBjb21wYXJhdG9yKTsKLQkJCS8vQW55dGhpbmcgdGhhdCByZW1haW5zIGluIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBhcmNoaXZlcyB0aGF0IGlzIHZhbGlkIHNob3VsZCBiZQotCQkJLy9hdmFpbGFibGUgZm9yIHNlbGVjdGlvbgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgewotCQkJCW90aGVyID0gKElWaXJ0dWFsUmVmZXJlbmNlKSBhcmNoaXZlcy5nZXQoaSk7Ci0KLQkJCQlpZiAob3RoZXIgIT0gYXJjaGl2ZSAmJiBpc1ZhbGlkRGVwZW5kZW5jeShvdGhlci5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCksIGNvbXBvbmVudCkpIHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IG90aGVyLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCk7Ci0JCQkJCWlmIChudWxsID09IHRhcmdldFByb2plY3ROYW1lIHx8IG51bGwgPT0gcHJvamVjdCB8fCAhcHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHRhcmdldFByb2plY3ROYW1lKSkgewotCQkJCQkJZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQoY29tcG9uZW50LCBvdGhlciwgbnVsbCk7Ci0JCQkJCQllbGVtZW50LnNldFByb2plY3Qob3RoZXIuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKSk7Ci0JCQkJCQlhZGRDbGFzc3BhdGhFbGVtZW50KGVsZW1lbnQsIG90aGVyLmdldEFyY2hpdmVOYW1lKCkpOworCQkJSVBhdGggZWFyTGliRGlyUGF0aCA9IG51bGw7CisJCQlpZihlYXJMaWJyYXJ5RGlyZWN0b3J5ICE9IG51bGwpCisJCQkJZWFyTGliRGlyUGF0aCA9IG5ldyBQYXRoKGVhckxpYnJhcnlEaXJlY3RvcnkpLm1ha2VSZWxhdGl2ZSgpOworCQkJCisJCQlpZihjaGlsZFByb2plY3RWaXJ0dWFsUmVmID09IG51bGwpIHsKKwkJCQlpZihyZWZlcmVuY2VzID09IG51bGwpCisJCQkJCXJlZmVyZW5jZXMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOworCQkJCWZvciggaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKyApIHsKKwkJCQkJaWYocmVmZXJlbmNlc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0UHJvamVjdCgpLmVxdWFscyhjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgeworCQkJCQkJY2hpbGRQcm9qZWN0VmlydHVhbFJlZiA9IHJlZmVyZW5jZXNbaV07CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCQorCQkJaWYoYXJjaGl2ZXMgIT1udWxsKXsKKwkJCQlDb2xsZWN0aW9ucy5zb3J0KGFyY2hpdmVzLCBjb21wYXJhdG9yKTsKKwkJCQkvL0FueXRoaW5nIHRoYXQgcmVtYWlucyBpbiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgYXJjaGl2ZXMgdGhhdCBpcyB2YWxpZCBzaG91bGQgYmUKKwkJCQkvL2F2YWlsYWJsZSBmb3Igc2VsZWN0aW9uCisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgeworCQkJCQlvdGhlciA9IChJVmlydHVhbFJlZmVyZW5jZSkgYXJjaGl2ZXMuZ2V0KGkpOworCQorCQkJCQlpZiAob3RoZXIgIT0gYXJjaGl2ZSAmJiBpc1ZhbGlkRGVwZW5kZW5jeShvdGhlci5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCksIGNvbXBvbmVudCkgJiYgKGVhckxpYnJhcnlEaXJlY3RvcnkgPT0gbnVsbCB8fCBlYXJMaWJEaXJQYXRoICE9IG51bGwgJiYgZWFyTGliRGlyUGF0aC5pc0VtcHR5KCkgfHwgIW90aGVyLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlKCkuZXF1YWxzKGVhckxpYkRpclBhdGgpKSkgeworCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IG90aGVyLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCk7CisJCQkJCQlpZiAobnVsbCA9PSB0YXJnZXRQcm9qZWN0TmFtZSB8fCBudWxsID09IHByb2plY3QgfHwgIXByb2plY3QuZ2V0TmFtZSgpLmVxdWFscyh0YXJnZXRQcm9qZWN0TmFtZSkpIHsKKwkJCQkJCQllbGVtZW50ID0gY3JlYXRlRWxlbWVudChjaGlsZFByb2plY3RWaXJ0dWFsUmVmLCBvdGhlciwgbnVsbCk7CisJCQkJCQkJZWxlbWVudC5zZXRQcm9qZWN0KG90aGVyLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkpOworCQkJCQkJCWFkZENsYXNzcGF0aEVsZW1lbnQoZWxlbWVudCwgb3RoZXIuZ2V0QXJjaGl2ZU5hbWUoKSk7CisJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBAIC02OTMsMTggKzc3MywxOSBAQAogCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG5ld3JlZnNbaV07CiAJCQkJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CiAJCQkJYm9vbGVhbiBpc0JpbmFyeSA9IHJlZmVyZW5jZWRDb21wb25lbnQuaXNCaW5hcnkoKTsKLQkJCQlpZiggaXNCaW5hcnkgKXsKKwkJCQlpZiggaXNCaW5hcnkgJiYgKGVhckxpYnJhcnlEaXJlY3RvcnkgPT0gbnVsbCB8fCBlYXJMaWJEaXJQYXRoICE9IG51bGwgJiYgZWFyTGliRGlyUGF0aC5pc0VtcHR5KCkgfHwgIXJlZi5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLmVxdWFscyhlYXJMaWJEaXJQYXRoKSkpewogCiAJCQkJCS8qKgogCQkJCQkgKiBXYXJuaW5nIGNsZWFuLXVwIDEyLzA1LzIwMDUKIAkJCQkJICovICAgCi0JCQkJCS8vU3RyaW5nIHVyaSA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlc29sdmVkUGF0aEZvckFyY2hpdmVDb21wb25lbnQocmVmZXJlbmNlZENvbXBvbmVudC5nZXROYW1lKCkpLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyB1bnJlc29sdmVkVVJJID0gcmVmLmdldEFyY2hpdmVOYW1lKCk7CisJCQkJCVN0cmluZyB1bnJlc29sdmVkVVJJID0gbnVsbDsKKwkJCQkJaWYocmVmLmdldEFyY2hpdmVOYW1lKCkgIT0gbnVsbCkKKwkJCQkJCXVucmVzb2x2ZWRVUkkgPSBKRUVNYW5pZmVzdERpc2Nlcm5lci5jYWxjdWxhdGVNYW5pZmVzdFJlbGF0aXZlUnVudGltZVBhdGgoY2hpbGRQcm9qZWN0VmlydHVhbFJlZiwgcmVmKS5hcHBlbmQoKG5ldyBQYXRoKHJlZi5nZXRBcmNoaXZlTmFtZSgpKSkubGFzdFNlZ21lbnQoKSkudG9TdHJpbmcoKTsKIAkJCQkJaWYodW5yZXNvbHZlZFVSSSA9PSBudWxsKXsKIAkJCQkJCXRyeSB7CiAJCQkJCQkJdW5yZXNvbHZlZFVSSSA9IE1vZHVsZVVSSVV0aWwuZ2V0QXJjaGl2ZU5hbWUoVVJJLmNyZWF0ZVVSSShNb2R1bGVVUklVdGlsLmdldEhhbmRsZVN0cmluZyhyZWZlcmVuY2VkQ29tcG9uZW50KSkpOwogCQkJCQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCQkJfQogCQkJCQl9CiAKQEAgLTcyMywxMCArODA0LDEwIEBACiAKIAkJCQkJCWlmKCAhYWxyZWFkeUluTGlzdCApewogCQkJCQkJCWlmKCBpbk1hbmlmZXN0KGNwLCBhcmNoaXZlVVJJLmxhc3RTZWdtZW50KCkpKXsKLQkJCQkJCQkJZWxlbWVudCA9IGNyZWF0ZUFyY2hpdmVFbGVtZW50KFVSSS5jcmVhdGVVUkkoTW9kdWxlVVJJVXRpbC5nZXRIYW5kbGVTdHJpbmcocmVmZXJlbmNlZENvbXBvbmVudCkpLCBhcmNoaXZlVVJJLmxhc3RTZWdtZW50KCksIGFyY2hpdmVVUkkubGFzdFNlZ21lbnQoKSk7CisJCQkJCQkJCWVsZW1lbnQgPSBjcmVhdGVBcmNoaXZlRWxlbWVudChhcmNoaXZlVVJJLCB1bnJlc29sdmVkVVJJLCBhcmNoaXZlVVJJLmxhc3RTZWdtZW50KCkpOwogCQkJCQkJCQlhZGRDbGFzc3BhdGhFbGVtZW50KGVsZW1lbnQsIHVucmVzb2x2ZWRVUkkpOwogCQkJCQkJCX1lbHNlewotCQkJCQkJCQllbGVtZW50ID0gY3JlYXRlQXJjaGl2ZUVsZW1lbnQoVVJJLmNyZWF0ZVVSSShNb2R1bGVVUklVdGlsLmdldEhhbmRsZVN0cmluZyhyZWZlcmVuY2VkQ29tcG9uZW50KSksIGFyY2hpdmVVUkkubGFzdFNlZ21lbnQoKSwgbnVsbCk7CisJCQkJCQkJCWVsZW1lbnQgPSBjcmVhdGVBcmNoaXZlRWxlbWVudChhcmNoaXZlVVJJLCB1bnJlc29sdmVkVVJJLCBudWxsKTsKIAkJCQkJCQkJYWRkQ2xhc3NwYXRoRWxlbWVudChlbGVtZW50LCB1bnJlc29sdmVkVVJJKTsJCQkJCQkJCiAJCQkJCQkJfQogCQkJCQkJfQpAQCAtNzUzLDcgKzgzNCw3IEBACiAKIAlib29sZWFuIGluTWFuaWZlc3QoU3RyaW5nW10gY3AsIFN0cmluZyBhcmNoaXZlTmFtZSApewogCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlTdHJpbmcgY3BFbnRyeSA9ICIiOworCQlTdHJpbmcgY3BFbnRyeSA9ICIiOyAvLyROT04tTkxTLTEkCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKIAkJCWNwRW50cnkgPSBjcFtpXTsKIAkJCWlmKCBhcmNoaXZlTmFtZS5lcXVhbHMoY3BFbnRyeSkpewpAQCAtNzg1LDE4ICs4NjYsMTcgQEAKIAkJCQkJCVppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsIHN0cmF0ID0gY3JlYXRlTG9hZFN0cmF0ZWd5KHVyaSk7CiAJCQkJCQlBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwogCQkJCQkJdHJ5IHsKLQkJCQkJCQlhcmNoaXZlID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKS5wcmltT3BlbkFyY2hpdmUoc3RyYXQsIHVyaSk7CisJCQkJCQkJYXJjaGl2ZSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5wcmltT3BlbkFyY2hpdmUoc3RyYXQsIHVyaSk7CiAJCQkJCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCQkJfQogCiAJCQkJCQlhcmNoaXZlcy5hZGQoYXJjaGl2ZSk7CiAJCQkJCQkKIAkJCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJCX0KIAkJCQl9CiAJCQkJCkBAIC04NTYsOCArOTM2LDEzIEBACiAJCWlmIChsb2FkU3RyYXQgaW5zdGFuY2VvZiBFQVJDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsKXsKIAkJCWVhckNvbXBvbmVudCA9ICgoRUFSQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCkgbG9hZFN0cmF0KS5nZXRDb21wb25lbnQoKTsKIAkJCWVhclByb2plY3QgPSAoKEVBUkNvbXBvbmVudExvYWRTdHJhdGVneUltcGwpIGxvYWRTdHJhdCkuZ2V0Q29tcG9uZW50KCkuZ2V0UHJvamVjdCgpOworCQkJcmVmcmVzaEVBUkxpYnJhcnlEaXJlY3RvcnkoKTsKIAkJfQkKIAl9CisJCisJcHJpdmF0ZSB2b2lkIHJlZnJlc2hFQVJMaWJyYXJ5RGlyZWN0b3J5KCl7CisJCWVhckxpYnJhcnlEaXJlY3RvcnkgPSBFYXJVdGlsaXRpZXMuZ2V0RUFSTGliRGlyKGVhckNvbXBvbmVudCk7CisJfQogCiAJcHJpdmF0ZSB2b2lkIHNldFR5cGUoQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50LCBBcmNoaXZlIG90aGVyKSB7CiAJCWlmIChvdGhlciA9PSBudWxsKQpAQCAtODczLDcgKzk1OCw3IEBACiAJCQlyZXR1cm47CiAJCWVsc2UgaWYgKGNsaWVudFRvRUpCSkFScy5jb250YWluc0tleShvdGhlci5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpKQogCQkJZWxlbWVudC5zZXRKYXJUeXBlKENsYXNzcGF0aEVsZW1lbnQuRUpCX0NMSUVOVF9KQVIpOwotCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQkNvbXBvbmVudChvdGhlci5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpKQorCQllbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCQ29tcG9uZW50KG90aGVyLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSkpCiAJCQllbGVtZW50LnNldEphclR5cGUoQ2xhc3NwYXRoRWxlbWVudC5FSkJfSkFSKTsKIAl9CiAKQEAgLTkyOSw3ICsxMDE0LDcgQEAKIAkJdHJ5IHsKIAkJCWNwID0gcmVmZXJlbmNlZEFyY2hpdmUuZ2V0TWFuaWZlc3QoKS5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKIAkJfSBjYXRjaCAoTWFuaWZlc3RFeGNlcHRpb24gbWZFeCkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKG1mRXgpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihtZkV4KTsKIAkJCWNwID0gbmV3IFN0cmluZ1tde307CiAJCX0KIAkJTGlzdCBwYXRocyA9IG5ldyBBcnJheUxpc3QoY3AubGVuZ3RoKTsKQEAgLTk3Myw3ICsxMDU4LDcgQEAKIAkJCWlmKCByZWZlcmVuY2VkTWFuaWZlc3QgIT0gbnVsbCApCiAJCQkJY3AgPSByZWZlcmVuY2VkTWFuaWZlc3QuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7CiAJCX0gY2F0Y2ggKE1hbmlmZXN0RXhjZXB0aW9uIG1mRXgpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihtZkV4KTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IobWZFeCk7CiAJCQljcCA9IG5ldyBTdHJpbmdbXXt9OwogCQl9CiAJCWlmKCBjcCAhPSBudWxsICl7CkBAIC05OTQsNiArMTA3OSw3IEBACiAJCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7CkBAIC0xMjA2LDEwICsxMjkyLDExIEBACiAJcHJpdmF0ZSB2b2lkIGludmVydFNlbGVjdGlvbklmUG9zc2libGUoQ2xhc3NwYXRoRWxlbWVudCBlbGVtZW50LCBDbGFzc3BhdGhFbGVtZW50IG9wcG9zaXRlKSB7CiAJCWlmIChlbGVtZW50ID09IG51bGwpCiAJCQlyZXR1cm47Ci0JCWlmIChvcHBvc2l0ZSA9PSBudWxsKQotCQkJb3Bwb3NpdGUgPSBnZXRPcHBvc2l0ZUVsZW1lbnQoZWxlbWVudCk7Ci0JCWlmIChvcHBvc2l0ZSAhPSBudWxsKSB7Ci0JCQlvcHBvc2l0ZS5zZXRTZWxlY3RlZCh0cnVlKTsKKwkJQ2xhc3NwYXRoRWxlbWVudCBpbm5lck9wcG9zaXRlID0gb3Bwb3NpdGU7CisJCWlmIChpbm5lck9wcG9zaXRlID09IG51bGwpCisJCQlpbm5lck9wcG9zaXRlID0gZ2V0T3Bwb3NpdGVFbGVtZW50KGVsZW1lbnQpOworCQlpZiAoaW5uZXJPcHBvc2l0ZSAhPSBudWxsKSB7CisJCQlpbm5lck9wcG9zaXRlLnNldFNlbGVjdGVkKHRydWUpOwogCQkJZWxlbWVudC5zZXRTZWxlY3RlZChmYWxzZSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9DbGFzc3BhdGhFbGVtZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9DbGFzc3BhdGhFbGVtZW50LmphdmEKaW5kZXggODZlZjYwNS4uOWQ2NWFkMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ2xhc3NwYXRoRWxlbWVudC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0NsYXNzcGF0aEVsZW1lbnQuamF2YQpAQCAtMjcsNyArMjcsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7CkBAIC0yOTMsMTIgKzI5MiwxMiBAQAogCX0KIAogCXB1YmxpYyBJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGhFbnRyaWVzRm9yQXJjaGl2ZSgpIHsKLQkJaWYoICFhcmNoaXZlVVJJLmVxdWFscygiIikpewotCQkJU3RyaW5nIHJlc291cmNlUGF0aCA9ICIiOworCQlpZiggIWFyY2hpdmVVUkkuZXF1YWxzKCIiKSl7IC8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZyByZXNvdXJjZVBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAogCQkJdHJ5IHsKIAkJCQlyZXNvdXJjZVBhdGggPSBNb2R1bGVVUklVdGlsLmdldEFyY2hpdmVOYW1lKGFyY2hpdmVVUkkpOwogCQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQl9CiAJCQlJUGF0aCByZXNQYXRoID0gbmV3IFBhdGgocmVzb3VyY2VQYXRoKTsKIAkJCWlmICghcmVzUGF0aC5pc0Fic29sdXRlKCkpCkBAIC0zMDYsOSArMzA1LDggQEAKIAkJCWphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShyZXNvdXJjZVBhdGgpOwogCQkJaWYoIGZpbGUuZXhpc3RzKCkgfHwgSjJFRVBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKG5ldyBQYXRoKHJlc291cmNlUGF0aCkpKXsKIAkJCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVtde0phdmFDb3JlLm5ld0xpYnJhcnlFbnRyeSggcmVzUGF0aCwgbnVsbCwgbnVsbCwgdHJ1ZSl9OwotCQkJfWVsc2V7Ci0JCQkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbXXtKYXZhQ29yZS5uZXdWYXJpYWJsZUVudHJ5KCByZXNQYXRoLCBudWxsLCBudWxsKX07CiAJCQl9CisJCQlyZXR1cm4gbmV3IElDbGFzc3BhdGhFbnRyeVtde0phdmFDb3JlLm5ld1ZhcmlhYmxlRW50cnkoIHJlc1BhdGgsIG51bGwsIG51bGwpfTsKIAkJfQkKIAkJcmV0dXJuIG5ldyBJQ2xhc3NwYXRoRW50cnlbMF07CiAJfQpAQCAtMzI1LDcgKzMyMyw3IEBACiAJCWlmIChyZXByZXNlbnRzSW1wb3J0ZWRKYXIoKSkKIAkJCXJldHVybiBuZXcgSUNsYXNzcGF0aEVudHJ5W117SmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KGdldEltcG9ydGVkSmFyQXNJRmlsZSgpLmdldEZ1bGxQYXRoKCksIG51bGwsIG51bGwpfTsKIAkJCi0JCWlmKCBhcmNoaXZlVVJJICE9IG51bGwgJiYgIWFyY2hpdmVVUkkuZXF1YWxzKCIiKSApeworCQlpZiggYXJjaGl2ZVVSSSAhPSBudWxsICYmICFhcmNoaXZlVVJJLmVxdWFscygiIikgKXsgLy8kTk9OLU5MUy0xJAogCQkJcmV0dXJuIG5ld0NsYXNzcGF0aEVudHJpZXNGb3JBcmNoaXZlKCk7CiAJCX0KIAkJaWYgKCF2YWxpZCAmJiBpc1NlbGVjdGVkKCkpCkBAIC01MDUsNiArNTAzLDcgQEAKIAkJc2V0UmVsYXRpdmVUZXh0KGNwRW50cnkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCXJldHVybiAiQ2xhc3NwYXRoZUVsZW1lbnQoIiArIGdldFRleHQoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ29tcHV0ZUVBUnNGb3JDb250ZXh0Um9vdFVwZGF0ZURhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wdXRlRUFSc0ZvckNvbnRleHRSb290VXBkYXRlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCBmMzMxM2Y4Li42ZGI4ZGNiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wdXRlRUFSc0ZvckNvbnRleHRSb290VXBkYXRlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wdXRlRUFSc0ZvckNvbnRleHRSb290VXBkYXRlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgQ29tcHV0ZUVBUnNGb3JDb250ZXh0Um9vdFVwZGF0ZURhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElVcGRhdGVNb2R1bGVDb250ZXh0Um9vdFByb3BlcnRpZXMgewogCisJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewogCQlmaW5hbCBTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoRUFSU19UT19VUERBVEUpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ29tcHV0ZUVBUnNGb3JDb250ZXh0Um9vdFVwZGF0ZU9wLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wdXRlRUFSc0ZvckNvbnRleHRSb290VXBkYXRlT3AuamF2YQppbmRleCA1N2JhYTUyLi41NDRiOGNkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wdXRlRUFSc0ZvckNvbnRleHRSb290VXBkYXRlT3AuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Db21wdXRlRUFSc0ZvckNvbnRleHRSb290VXBkYXRlT3AuamF2YQpAQCAtMTksMTMgKzE5LDEzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uV2ViTW9kdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJBcnRpZmFjdEVkaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRWFyVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKQEAgLTQ1LDE2ICs0NSwxNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgZXhlY3V0ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsKKyAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICBmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KW1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1QpOwogICAgICAgICBmaW5hbCBMaXN0IGVhcnNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgCS8vIGdldCB0aGUgc2V0IG9mIGFsbCByZWZlcmVuY2luZyBFQVJzCi0gICAgICAgIAlmaW5hbCBJUHJvamVjdFtdIGVhcnMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHByb2plY3QpOworICAgICAgICAJZmluYWwgSVByb2plY3RbXSBlYXJzID0gRWFyVXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMocHJvamVjdCk7CiAgICAgICAgIAkKICAgICAgICAgCS8vIGZvciBlYWNoIEVBUiwgY2hlY2sgaWYgdGhlIGN1cnJlbnQgY29udGV4dC1yb290IHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBvbGQgY29udGV4dC1yb290IHNldHRpbmcKICAgICAgICAgCS8vIGlmIGl0IGlzLCB1cGRhdGUgaXQgdG8gcmVmbGVjdCB0aGUgbmV3IHZhbHVlCkBAIC03Miw3ICs3Myw3IEBACiAgICAgICAgIAltb2RlbC5hZGROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfSUQsIG5lc3RlZE1vZGVsKTsKIAogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworICAgICAgICAJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKQEAgLTExNSw2ICsxMTYsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jcmVkbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCS8vIG5vLW9wCiAJCXJldHVybiBudWxsOwpAQCAtMTIzLDYgKzEyNSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiN1bmRvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJLy8gbm8tb3AKIAkJcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Db3B5QXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9Db3B5QXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uLmphdmEKaW5kZXggMjQ2YWE1Ny4uOWQzYjZhOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ29weUFyY2hpdmVJbnRvUHJvamVjdE9wZXJhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0NvcHlBcmNoaXZlSW50b1Byb2plY3RPcGVyYXRpb24uamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKQEAgLTMyLDYgKzMzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRWFyVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKQEAgLTQyLDYgKzQ0LDcgQEAKIAkJc3VwZXIoTkxTLmJpbmQoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuQ29weUFyY2hpdmVJbnRvUHJvamVjdE9wZXJhdGlvbl9Db3B5aW5nX2FyY2hpdmVfaW50b19zZWxlY3RlZF9wcm9qZV8sIHV0aWxpdHlKYXIuZ2V0TmFtZSgpKSwgdXRpbGl0eUphcik7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCU11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhKMkVFUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuQ29weUFyY2hpdmVJbnRvUHJvamVjdE9wZXJhdGlvbl9Db3B5aW5nX2FyY2hpdmVfaW50b19zZWxlY3RlZF9wcm9qZV8sIGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCkpLCBudWxsKTsKIAkJIApAQCAtNTMsMTEgKzU2LDIyIEBACiAJCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChhc3NvY2lhdGVkRUFSUHJvamVjdCk7CiAJCQkKIAkJCUlDb250YWluZXIgdW5kZXJseWluZ0ZvbGRlciA9IGVhckNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOworCQkJU3RyaW5nIHVyaU1hcHBpbmcgPSBnZXRVdGlsaXR5SmFyKCkuZ2V0TmFtZSgpOworCQkJU3RyaW5nIGVhckxpYiA9IEVhclV0aWxpdGllcy5nZXRFQVJMaWJEaXIoZWFyQ29tcG9uZW50KTsKKwkJCUlGb2xkZXIgbGliRGlyRm9sZGVyID0gbnVsbDsKKyAJCQlpZihlYXJMaWIgIT0gbnVsbCAmJiBlYXJMaWIubGVuZ3RoKCkgPiAwKSB7CisgCQkJCXVyaU1hcHBpbmcgPSAobmV3IFBhdGgoZWFyTGliKSkuYXBwZW5kKHVyaU1hcHBpbmcpLnRvU3RyaW5nKCk7IAorIAkJCQlpZih1bmRlcmx5aW5nRm9sZGVyLmlzQWNjZXNzaWJsZSgpKSB7CisgCQkJCQlsaWJEaXJGb2xkZXIgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0Rm9sZGVyKHVuZGVybHlpbmdGb2xkZXIuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoZWFyTGliKSk7CisgCQkJCX0gZWxzZSB7CisgCQkJCQlsaWJEaXJGb2xkZXIgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0Rm9sZGVyKGFzc29jaWF0ZWRFQVJQcm9qZWN0LmdldEZ1bGxQYXRoKCkuYXBwZW5kKGVhckxpYikpOworIAkJCQl9CisgCQkJfQogCQkJaWYodW5kZXJseWluZ0ZvbGRlci5pc0FjY2Vzc2libGUoKSkgewotCQkJCSBjb3BpZWRKYXJGaWxlID0gdW5kZXJseWluZ0ZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCkpKTsKKwkJCQljb3BpZWRKYXJGaWxlID0gdW5kZXJseWluZ0ZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKHVyaU1hcHBpbmcpKTsKIAkJCX0gZWxzZSB7Ci0JCQkJIGNvcGllZEphckZpbGUgPSBhc3NvY2lhdGVkRUFSUHJvamVjdC5nZXRGaWxlKGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCkpOwotCQkJfQkJCisJCQkJY29waWVkSmFyRmlsZSA9IGFzc29jaWF0ZWRFQVJQcm9qZWN0LmdldEZpbGUodXJpTWFwcGluZyk7CisJCQl9CiAgCQkJaWYgKGNvcGllZEphckZpbGUuZXhpc3RzKCkpIHsKIAkJCQlpZiAoaXNPdmVyd3JpdGVJZk5lY2Vzc2FyeSgpKQogCQkJCQljb3BpZWRKYXJGaWxlLmRlbGV0ZSh0cnVlLCB0cnVlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKQEAgLTY1LDggKzc5LDEzIEBACiAJCQkJCXN0YXR1cy5hZGQoSjJFRVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBOTFMuYmluZChFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5Db3B5QXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uX0ZvdW5kX2V4aXN0aW5nX2ZpbGVfMF8sIGNvcGllZEphckZpbGUpLCBudWxsKSk7CiAJCQkJCXJldHVybiBzdGF0dXM7CiAJCQkJfQotCQkJfSAKLQkJCQorCQkJfQorIAkJCQorIAkJCS8vIENyZWF0ZSBFQVIncyBsaWJyYXJ5IGRpcmVjdG9yeSBmb2xkZXIgaWYgaXQgZG9lc24ndCBleGlzdAorIAkJCWlmKGxpYkRpckZvbGRlciAhPSBudWxsICYmICghbGliRGlyRm9sZGVyLmV4aXN0cygpIHx8ICFsaWJEaXJGb2xkZXIuaXNBY2Nlc3NpYmxlKCkpKSB7CisgCQkJCW1rZGlycyhsaWJEaXJGb2xkZXIpOworIAkJCX0KKyAJCQkKIAkJCUZpbGVJbnB1dFN0cmVhbSBmaWxlSW5wdXRTdHJlYW0gPSBudWxsOwogCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7CiAJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBqYXJGaWxlSW5wdXRTdHJlYW0gPSBudWxsOwpAQCAtODEsOCArMTAwLDcgQEAKIAkJCQkJLy8gY2xlYXIgc3BhY2UgZm9yIEdDCiAJCQkJCWRhdGEgPSBudWxsOwogCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmKGZpbGVJbnB1dFN0cmVhbSAhPSBudWxsKSAKLQkJCQkJCWZpbGVJbnB1dFN0cmVhbS5jbG9zZSgpOworCQkJCQlmaWxlSW5wdXRTdHJlYW0uY2xvc2UoKTsKIAkJCQl9CiAKIAkJCQlqYXJGaWxlSW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9zLnRvQnl0ZUFycmF5KCkpOwpAQCAtOTAsNyArMTA4LDcgQEAKIAogCQkJCWFkZExpYnJhcnlUb0NsYXNzcGF0aChhc3NvY2lhdGVkRUFSUHJvamVjdCwgY29waWVkSmFyRmlsZSwgbW9uaXRvcik7CiAJCQkJCi0JCQkJY3JlYXRlVmlydHVhbEFyY2hpdmVDb21wb25lbnQoYXNzb2NpYXRlZEVBUlByb2plY3QsIGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCksIGNvcGllZEphckZpbGUsIG1vbml0b3IpOworCQkJCWNyZWF0ZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KGFzc29jaWF0ZWRFQVJQcm9qZWN0LCB1cmlNYXBwaW5nLCBjb3BpZWRKYXJGaWxlLCBtb25pdG9yKTsKIAkJCQkKIAkJCQkKIAkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CkBAIC0xMTgsMTAgKzEzNiwxMiBAQAogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9DcmVhdGVQcm9qZWN0V2l0aEV4dHJhY3RlZEphck9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ3JlYXRlUHJvamVjdFdpdGhFeHRyYWN0ZWRKYXJPcGVyYXRpb24uamF2YQppbmRleCA4YWUzNzJhLi5jNjVlMWE2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9DcmVhdGVQcm9qZWN0V2l0aEV4dHJhY3RlZEphck9wZXJhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0NyZWF0ZVByb2plY3RXaXRoRXh0cmFjdGVkSmFyT3BlcmF0aW9uLmphdmEKQEAgLTExLDcgKzExLDYgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CkBAIC0yMiw5ICsyMSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwpAQCAtMzUsMTAgKzMxLDggQEAKIAogCiBwdWJsaWMgY2xhc3MgQ3JlYXRlUHJvamVjdFdpdGhFeHRyYWN0ZWRKYXJPcGVyYXRpb24gZXh0ZW5kcyBKMkVFVXRpbGl0eUphckltcG9ydEFzc2lzdGFudE9wZXJhdGlvbiB7Ci0vLwlwcml2YXRlIGJvb2xlYW4gY3JlYXRlQmluYXJ5UHJvamVjdCA9IGZhbHNlOyAKIAlwcml2YXRlIFN0cmluZyBuZXdQcm9qZWN0TmFtZTsKIAlwcml2YXRlIFN0cmluZyBwcm9qZWN0Um9vdDsKLS8vCXByaXZhdGUgYm9vbGVhbiBjcmVhdGVBc0JpbmFyeTsKIAogCXB1YmxpYyBDcmVhdGVQcm9qZWN0V2l0aEV4dHJhY3RlZEphck9wZXJhdGlvbihGaWxlIHV0aWxpdHlKYXIsIFN0cmluZyBvdmVycmlkaW5nUHJvamVjdFJvb3QpIHsKIAkJc3VwZXIoTkxTLmJpbmQoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuQ3JlYXRlUHJvamVjdFdpdGhFeHRyYWN0ZWRKYXJPcGVyYXRpb25fQ3JlYXRlX3Byb2plY3Rfd2l0aF9leHRyYWN0ZWRfY29udGVfLCB1dGlsaXR5SmFyLmdldE5hbWUoKSksIHV0aWxpdHlKYXIpOwpAQCAtNDYsMjUgKzQwLDIxIEBACiAJCXByb2plY3RSb290ID0gZmluZFVuaXF1ZUxvY2F0aW9uKG92ZXJyaWRpbmdQcm9qZWN0Um9vdCwgbmV3UHJvamVjdE5hbWUpOyAKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEoyRUVQbHVnaW4uUExVR0lOX0lELCAwLCBOTFMuYmluZChFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5DcmVhdGVQcm9qZWN0V2l0aEV4dHJhY3RlZEphck9wZXJhdGlvbl9DcmVhdGVfcHJvamVjdF93aXRoX2V4dHJhY3RlZF9jb250ZV8sIGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCkpLCBudWxsKTsKLQkJQXJjaGl2ZSBhcmNoaXZlID0gbnVsbDsKIAkJdHJ5IHsKLQkJCWFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0UucHJpbU9wZW5BcmNoaXZlKGdldFV0aWxpdHlKYXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAKIAkJCUlEYXRhTW9kZWwgaW1wb3J0TW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSjJFRVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsgCiAKLQkJCWltcG9ydE1vZGVsLnNldFByb3BlcnR5KElKYXZhVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRSwgYXJjaGl2ZSk7Ci0vLwkJCWltcG9ydE1vZGVsLnNldFByb3BlcnR5KElKYXZhVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCBnZXRVdGlsaXR5SmFyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQkJaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoSUphdmFVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIGdldFV0aWxpdHlKYXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAKIAkJCWlmIChwcm9qZWN0Um9vdCAhPSBudWxsICYmIHByb2plY3RSb290Lmxlbmd0aCgpID4gMCkgewkJCQkKIAkJCQlpbXBvcnRNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSVByb2plY3RDcmVhdGlvblByb3BlcnRpZXNOZXcuVVNFX0RFRkFVTFRfTE9DQVRJT04sIGZhbHNlKTsKIAkJCQlpbXBvcnRNb2RlbC5zZXRQcm9wZXJ0eShJUHJvamVjdENyZWF0aW9uUHJvcGVydGllc05ldy5VU0VSX0RFRklORURfTE9DQVRJT04sIHByb2plY3RSb290KTsKIAkJCX0KIAotCQkJLy8gaW1wb3J0TW9kZWwuZ2V0SjJlZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbCgpLnNldEJvb2xlYW5Qcm9wZXJ0eShKMkVFUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsLkFERF9TRVJWRVJfVEFSR0VULCB0cnVlKTsKIAkJCWlmIChpc092ZXJ3cml0ZUlmTmVjZXNzYXJ5KCkpIHsKLQkJCQkvLyBpbXBvcnRNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUphdmFVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5PVkVSV1JJVEVfSEFORExFUik7CiAJCQkJSVByb2plY3QgZXhpc3RpbmdQcm9qZWN0ID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QobmV3UHJvamVjdE5hbWUpOwogCQkJCWlmIChleGlzdGluZ1Byb2plY3QuZXhpc3RzKCkpIHsKIAkJCQkJZXhpc3RpbmdQcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBtb25pdG9yKTsKQEAgLTc1LDM0ICs2NSwxOSBAQAogCQkJaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoSUphdmFVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FLCBnZXRBc3NvY2lhdGVkRUFSUHJvamVjdE5hbWUoKSk7CiAKIAkJCXN0YXR1cy5hZGQoaW1wb3J0TW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSwgaW5mbykpOyAKLQkJCQotCQkJSVByb2plY3QgYXNzb2NpYXRlZEVBUlByb2plY3QgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChnZXRBc3NvY2lhdGVkRUFSUHJvamVjdE5hbWUoKSk7Ci0gCQkJSVByb2plY3QgdXRpbGl0eUphclByb2plY3QgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChuZXdQcm9qZWN0TmFtZSk7Ci0JCQlsaW5rQXJjaGl2ZVRvRUFSKGFzc29jaWF0ZWRFQVJQcm9qZWN0LCBnZXRVdGlsaXR5SmFyKCkuZ2V0TmFtZSgpLCB1dGlsaXR5SmFyUHJvamVjdCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCQkKLQkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChKMkVFUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKEoyRUVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKEoyRUVQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoMCwgZS5nZXRNZXNzYWdlKCksIGUpOwogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCXN0YXR1cy5hZGQoSjJFRVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwogCQkJSjJFRVBsdWdpbi5sb2dFcnJvcigwLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZihhcmNoaXZlICE9IG51bGwpCi0JCQkJYXJjaGl2ZS5jbG9zZSgpOwotCQl9CisJCX0gCiAJCXJldHVybiBzdGF0dXM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0NyZWF0ZVByb2plY3RXaXRoTGlua2VkSmFyT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9DcmVhdGVQcm9qZWN0V2l0aExpbmtlZEphck9wZXJhdGlvbi5qYXZhCmluZGV4IDhiNGFiOTQuLjMzYTc3OTQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0NyZWF0ZVByb2plY3RXaXRoTGlua2VkSmFyT3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvQ3JlYXRlUHJvamVjdFdpdGhMaW5rZWRKYXJPcGVyYXRpb24uamF2YQpAQCAtMjAsNyArMjAsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwpAQCAtNDgsNiArNDcsNyBAQAogCQlwcm9qZWN0Um9vdCA9IGZpbmRVbmlxdWVMb2NhdGlvbihvdmVycmlkaW5nUHJvamVjdFJvb3QsIGdldFV0aWxpdHlKYXJQcm9qZWN0TmFtZSh1dGlsaXR5SmFyKSk7IAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoSjJFRVBsdWdpbi5QTFVHSU5fSUQsIDAsIE5MUy5iaW5kKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkNyZWF0ZVByb2plY3RXaXRoTGlua2VkSmFyT3BlcmF0aW9uX0NyZWF0aW5nX3Byb2plY3Rfd2l0aF9saW5rZWRfYXJjaGl2XywgZ2V0VXRpbGl0eUphcigpLmdldE5hbWUoKSksIG51bGwpOwogIApAQCAtNjIsNiArNjIsNyBAQAogCQkJCWNyZWF0ZVV0aWxpdHlQcm9qZWN0LnNldFByb3BlcnR5KElQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzTmV3LlVTRVJfREVGSU5FRF9MT0NBVElPTiwgcHJvamVjdFJvb3QpOwogCQkJfQogIAkJCQorCQkJY3JlYXRlVXRpbGl0eVByb2plY3Quc2V0UHJvcGVydHkoSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgdHJ1ZSk7CiAJCQljcmVhdGVVdGlsaXR5UHJvamVjdC5zZXRQcm9wZXJ0eShJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FLCBnZXRBc3NvY2lhdGVkRUFSUHJvamVjdE5hbWUoKSk7CiAJCQkKIAkJCXN0YXR1cy5hZGQoY3JlYXRlVXRpbGl0eVByb2plY3QuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgaW5mbykpOwpAQCAtNzAsNyArNzEsNyBAQAogCQkJCiAJCQkvKiBSZW1vdmUgdGhlIGRlZmF1bHQgc3JjIGZvbGRlciAqLwogCQkJSUphdmFQcm9qZWN0IHV0aWxpdHlKYXJKYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZSh1dGlsaXR5SmFyUHJvamVjdCk7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdCBzcmNGb2xkZXIgPSB1dGlsaXR5SmFySmF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdCh1dGlsaXR5SmFyUHJvamVjdC5nZXRGb2xkZXIoInNyYyIpKTsKKwkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHNyY0ZvbGRlciA9IHV0aWxpdHlKYXJKYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHV0aWxpdHlKYXJQcm9qZWN0LmdldEZvbGRlcigic3JjIikpOyAvLyROT04tTkxTLTEkCiAJCQlpZihzcmNGb2xkZXIuZXhpc3RzKCkpIHsKIAkJCQlzcmNGb2xkZXIuZGVsZXRlKElSZXNvdXJjZS5GT1JDRSwgSVBhY2thZ2VGcmFnbWVudFJvb3QuT1JJR0lOQVRJTkdfUFJPSkVDVF9DTEFTU1BBVEgsIG1vbml0b3IpOwogCQkJfQkJCQpAQCAtNzgsMjUgKzc5LDIwIEBACiAJCQkKIAkJCS8qIFJlbW92ZSB0aGUgL3NyYyBtYXBwaW5nICovCiAJCQlJVmlydHVhbENvbXBvbmVudCB1dGlsQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlzdGF0dXMuYWRkKHJlbW92ZVJvb3RNYXBwaW5nKHV0aWxDb21wb25lbnQsICIvc3JjIiwgbW9uaXRvcikpOworCQkJc3RhdHVzLmFkZChyZW1vdmVSb290TWFwcGluZyh1dGlsQ29tcG9uZW50LCAiL3NyYyIsIG1vbml0b3IpKTsgLy8kTk9OLU5MUy0xJAogCQkJCi0JCQkvKiBDcmVhdGUgdGhlIC88YXJjaGl2ZT4gbWFwcGluZyAqLwotCQkJc3RhdHVzLmFkZChjcmVhdGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudChwcm9qZWN0LCBnZXRVdGlsaXR5SmFyKCkuZ2V0TmFtZSgpLCBwcm9qZWN0LmdldEZpbGUoZ2V0VXRpbGl0eUphcigpLmdldE5hbWUoKSksIG1vbml0b3IpKTsKLQkJCSAKLQkJCS8qIE1ha2UgdGhpcyBwcm9qZWN0IGEgdXRpbGl0eSBqYXIgcHJvamVjdCBmb3IgdGhlIEVBUiAqLwotCQkJSVByb2plY3QgYXNzb2NpYXRlZEVBUlByb2plY3QgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0UHJvamVjdChnZXRBc3NvY2lhdGVkRUFSUHJvamVjdE5hbWUoKSk7CQkJCi0JCQlzdGF0dXMuYWRkKGxpbmtBcmNoaXZlVG9FQVIoYXNzb2NpYXRlZEVBUlByb2plY3QsIGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCksIHV0aWxpdHlKYXJQcm9qZWN0LCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKSk7Ci0KIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCXN0YXR1cy5hZGQoSjJFRVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5KMkVFVXRpbGl0eUphckxpc3RJbXBvcnRPcGVyYXRpb25fVUlfMiwgZSkpOwogCQl9CQkgCiAJCXJldHVybiBzdGF0dXM7IAogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uLmphdmEKaW5kZXggYjBkZTE4YS4uYWY2NWI1ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0RlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25PcGVyYXRpb24uamF2YQpAQCAtMTksOCArMTksOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLklEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5GYWNldFByb2plY3RDcmVhdGlvbk9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwpAQCAtNDIsNyArNDIsOCBAQAogICAgICAgICBzdXBlcihtb2RlbCk7CiAgICAgfQogCi0gICAgcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgQE92ZXJyaWRlCisJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KENSRUFURV9FSkIpKSB7CiAgICAgICAgICAgICAgICAgSURhdGFNb2RlbCBwcm9qZWN0TW9kZWwgPSBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfRUpCKTsKQEAgLTYxLDcgKzYyLDcgQEAKICAgICAgICAgICAgICAgICBjcmVhdGVBcHBDbGllbnRDb21wb25lbnQocHJvamVjdE1vZGVsLCBtb25pdG9yKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2coZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gT0tfU1RBVFVTOwogICAgIH0KQEAgLTExOCwxNiArMTE5LDE4IEBACiAJCQl0cnkgewogCQkJCUZhY2V0UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmFkZERlZmF1bHRGYWN0ZXRzKCBmYWNldGVkUHJvamVjdCwgcnVudGltZSApOwogCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfSAgICAJCiAgICAgfQogICAgIAotICAgIHB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgIEBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICBAT3ZlcnJpZGUKKwlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvRUFSQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCA1MjAzN2JmLi42MTk4YTUyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0VBUkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTEwLDggKzEwLDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkVBUkNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuSmF2YUVFQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKIApAQCAtMjEsMTkgKzIyLDIzIEBACiAgICAgICAgIHN1cGVyKCk7CiAgICAgfQogICAgIAotICAgIHB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRUFSQ29tcG9uZW50RXhwb3J0T3BlcmF0aW9uKG1vZGVsKTsKKyAgICBAT3ZlcnJpZGUKKwlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IEphdmFFRUNvbXBvbmVudEV4cG9ydE9wZXJhdGlvbihtb2RlbCk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVFeHRlbnNpb24oKSB7Ci0gICAgICAgIHJldHVybiAiLmVhciI7IC8vJE5PTi1OTFMtMSQKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZUV4dGVuc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIElKMkVFTW9kdWxlQ29uc3RhbnRzLkVBUl9FWFQ7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRXcm9uZ0NvbXBvbmVudFR5cGVTdHJpbmcoU3RyaW5nIHByb2plY3ROYW1lKSB7CisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRXcm9uZ0NvbXBvbmVudFR5cGVTdHJpbmcoU3RyaW5nIHByb2plY3ROYW1lKSB7CiAgICAgICAgIHJldHVybiBFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuTk9UX0FOX0VBUiwgbmV3IE9iamVjdFtde3Byb2plY3ROYW1lfSk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9qZWN0VHlwZSgpIHsKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RUeXBlKCkgewogICAgICAgICByZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuRU5URVJQUklTRV9BUFBMSUNBVElPTjsKICAgICB9CiAgICAgLyoqCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCA3Mjc2YTUxLi44ZDdlYWI0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9FQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0VBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTI0LDEyICsyNCw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQWRkV2ViQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKQEAgLTQ1LDYgKzQxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uRWpiTW9kdWxlRXh0ZW5zaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWV4dGVuc2lvbi5KY2FNb2R1bGVFeHRlbnNpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlZXh0ZW5zaW9uLldlYk1vZHVsZUV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuRUFSRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7CkBAIC0xMDIsNiArOTksNyBAQAogCiAJcHJpdmF0ZSBBcmNoaXZlV3JhcHBlciBjYWNoZWRMb2FkRXJyb3IgPSBudWxsOwogCisJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewogCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoTkVTVEVEX01PRFVMRV9ST09UKTsKQEAgLTExOSw2ICsxMTcsNyBAQAogCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCWlmIChORVNURURfTU9EVUxFX1JPT1QuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKIAkJCXJldHVybiBnZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKQEAgLTEzNiw2ICsxMzUsNyBAQAogCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7CiAJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7CiAJCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoUFJPSkVDVF9OQU1FKSkgewpAQCAtMTUyLDYgKzE1Miw3IEBACiAJCX0KIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewogCQlpZiAoQUxMX1BST0pFQ1RfTU9ERUxTX0xJU1QuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgVU5IQU5ETEVEX1BST0pFQ1RfTU9ERUxTX0xJU1QuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgSEFORExFRF9QUk9KRUNUX01PREVMU19MSVNULmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IEVBUl9OQU1FX1ZBTElEQVRJT04uZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKIAkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHByb3BlcnR5TmFtZSArICIgaXMgYW4gdW5zZXR0YWJsZSBwcm9wZXJ0eSIpOyAvLyROT04tTkxTLTEkCkBAIC0xNjUsMjcgKzE2Niw4IEBACiAJCQl1cGRhdGVNb2R1bGVSb290KCk7CiAJCQlzZXRQcm9wZXJ0eShVVElMSVRZX0xJU1QsIG51bGwpOwogCi0JCQlJRGF0YU1vZGVsIGVhclByb2plY3RNb2RlbCA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTik7CiAJCQlpZiAoZ2V0QXJjaGl2ZVdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBlYXJQcm9qZWN0TW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotCQkJCUlEYXRhTW9kZWwgZWFyRmFjZXREYXRhTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoSjJFRVByb2plY3RVdGlsaXRpZXMuRU5URVJQUklTRV9BUFBMSUNBVElPTik7Ci0KLQkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gZ2V0QXJjaGl2ZVdyYXBwZXIoKS5nZXRKYXZhRUVRdWlja1BlZWsoKTsKLQkJCQlpbnQgbWluaW11bVZlcnNpb24gPSBxdWlja1BlZWsuZ2V0VmVyc2lvbigpOwotCQkJCWlmKG5lc3RlZE1vZGVscyAhPSBudWxsKXsKLQkJCQkJLy9pbmNyZWFzZSB0aGUgSmF2YUVFIGZhY2V0IHZlcnNpb24gdG8gYWNjb21tb2RhdGUgdGhlIGhpZ2hlc3QgbW9kdWxlIHZlcnNpb24KLQkJCQkJZm9yKGludCBpPTA7aTxuZXN0ZWRNb2RlbHMuc2l6ZSgpOyBpKyspewotCQkJCQkJSURhdGFNb2RlbCBuZXN0ZWRNb2RlbCA9IChJRGF0YU1vZGVsKW5lc3RlZE1vZGVscy5nZXQoaSk7Ci0JCQkJCQlBcmNoaXZlV3JhcHBlciBuZXN0ZWRXcmFwcGVyID0gKEFyY2hpdmVXcmFwcGVyKW5lc3RlZE1vZGVsLmdldFByb3BlcnR5KEFSQ0hJVkVfV1JBUFBFUik7Ci0JCQkJCQlpbnQgbmVzdGVkRUVWZXJzaW9uID0gbmVzdGVkV3JhcHBlci5nZXRKYXZhRUVRdWlja1BlZWsoKS5nZXRKYXZhRUVWZXJzaW9uKCk7Ci0JCQkJCQlpZihuZXN0ZWRFRVZlcnNpb24gPiBtaW5pbXVtVmVyc2lvbil7Ci0JCQkJCQkJbWluaW11bVZlcnNpb24gPSBuZXN0ZWRFRVZlcnNpb247Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJU3RyaW5nIHZlcnNpb25UZXh0ID0gSjJFRVZlcnNpb25VdGlsLmdldEoyRUVUZXh0VmVyc2lvbihtaW5pbXVtVmVyc2lvbik7Ci0JCQkJZWFyRmFjZXREYXRhTW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgdmVyc2lvblRleHQpOworCQkJCXJlZnJlc2hJbnRlcnByZXRlZFNwZWNWZXJzaW9uKCk7CiAJCQl9CiAKIAkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFBST0pFQ1RfTkFNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKQEAgLTIyNiwxNSArMjA4LDEzIEBACiAJCQkJaWYgKG51bGwgIT0gcHJvamVjdCAmJiBwcm9qZWN0LmV4aXN0cygpKSB7CiAKIAkJCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJCQkJYm9vbGVhbiBjYW5Db250aW51ZSA9IHRydWU7CiAJCQkJCXRyeSB7CiAJCQkJCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKIAkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQljYW5Db250aW51ZSA9IGZhbHNlOworCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQkJfQogCi0JCQkJCWlmIChjYW5Db250aW51ZSkgeworCQkJCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCApIHsKIAkJCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSBmYWNldGVkUHJvamVjdC5nZXRSdW50aW1lKCk7CiAJCQkJCQlpZiAobnVsbCAhPSBydW50aW1lKSB7CiAJCQkJCQkJc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FLCBydW50aW1lKTsKQEAgLTI0NSw2ICsyMjUsMzAgQEAKIAkJfQogCQlyZXR1cm4gZG9TZXQ7CiAJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hJbnRlcnByZXRlZFNwZWNWZXJzaW9uKCkgeworCQlJRGF0YU1vZGVsIGVhclByb2plY3RNb2RlbCA9IG1vZGVsLmdldE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9KMkVFX0NPTVBPTkVOVF9DUkVBVElPTik7CisJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgZWFyUHJvamVjdE1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKKwkJSURhdGFNb2RlbCBlYXJGYWNldERhdGFNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChKMkVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OKTsKKwkJaW50IG1pbmltdW1WZXJzaW9uID0gZ2V0SW50ZXJwcmV0ZWRTcGVjVmVyc2lvbihnZXRBcmNoaXZlV3JhcHBlcigpKS5nZXRKYXZhRUVWZXJzaW9uKCk7CisJCWlmKG1pbmltdW1WZXJzaW9uICE9IEphdmFFRVF1aWNrUGVlay5WRVJTSU9OXzZfMCl7CisJCQlMaXN0IG5lc3RlZE1vZGVscyA9IGdldE1vZHVsZU1vZGVscygpOworCQkJaWYobmVzdGVkTW9kZWxzICE9IG51bGwpeworCQkJCS8vaW5jcmVhc2UgdGhlIEphdmFFRSBmYWNldCB2ZXJzaW9uIHRvIGFjY29tbW9kYXRlIHRoZSBoaWdoZXN0IG1vZHVsZSB2ZXJzaW9uCisJCQkJZm9yKGludCBpPTA7aTxuZXN0ZWRNb2RlbHMuc2l6ZSgpOyBpKyspeworCQkJCQlJRGF0YU1vZGVsIG5lc3RlZE1vZGVsID0gKElEYXRhTW9kZWwpbmVzdGVkTW9kZWxzLmdldChpKTsKKwkJCQkJQXJjaGl2ZVdyYXBwZXIgbmVzdGVkV3JhcHBlciA9IChBcmNoaXZlV3JhcHBlciluZXN0ZWRNb2RlbC5nZXRQcm9wZXJ0eShBUkNISVZFX1dSQVBQRVIpOworCQkJCQlpbnQgbmVzdGVkRUVWZXJzaW9uID0gZ2V0SW50ZXJwcmV0ZWRTcGVjVmVyc2lvbihuZXN0ZWRXcmFwcGVyKS5nZXRKYXZhRUVWZXJzaW9uKCk7CisJCQkJCWlmKG5lc3RlZEVFVmVyc2lvbiA+IG1pbmltdW1WZXJzaW9uKXsKKwkJCQkJCW1pbmltdW1WZXJzaW9uID0gbmVzdGVkRUVWZXJzaW9uOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCVN0cmluZyB2ZXJzaW9uVGV4dCA9IEoyRUVWZXJzaW9uVXRpbC5nZXRKMkVFVGV4dFZlcnNpb24oIG1pbmltdW1WZXJzaW9uICk7CisJCWVhckZhY2V0RGF0YU1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIHZlcnNpb25UZXh0KTsKKwl9CiAKIAlwcm90ZWN0ZWQgYm9vbGVhbiBmb3JjZVJlc2V0T25QcmVzZXJ2ZU1ldGFEYXRhKCkgewogCQlyZXR1cm4gZmFsc2U7CkBAIC0yNTksNiArMjYzLDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTkVTVEVEX1BST0pFQ1RTX1ZBTElEQVRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoRUFSX05BTUVfVkFMSURBVElPTikpIHsKIAkJCWJvb2xlYW4gY2hlY2tBZ2FpbnN0RUFSTmFtZU9ubHkgPSBwcm9wZXJ0eU5hbWUuZXF1YWxzKEVBUl9OQU1FX1ZBTElEQVRJT04pOwpAQCAtMjk5LDcgKzMwNCw4IEBACiAJCQkJCS8vIH0KIAkJCQkJdGVtcFN0YXR1cyA9IHN1YkRhdGFNb2RlbC52YWxpZGF0ZVByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FKTsKIAkJCQkJaWYgKCF0ZW1wU3RhdHVzLmlzT0soKSkgewotCQkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5iaW5kKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkVBUkltcG9ydERhdGFNb2RlbF9VSV8wLCBuZXcgT2JqZWN0W10geyB0ZW1wUHJvamVjdE5hbWUsCisJCQkJCQlTdHJpbmcgc3ViTW9kZWxQcm9qZWN0TmFtZSA9IHN1YkRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKTsKKwkJCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuYmluZChFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5FQVJJbXBvcnREYXRhTW9kZWxfVUlfMCwgbmV3IE9iamVjdFtdIHsgc3ViTW9kZWxQcm9qZWN0TmFtZSwKIAkJCQkJCQkJdGVtcEFyY2hpdmUuZ2V0UGF0aCgpIH0pKTsKIAkJCQkJfQogCQkJCQl0ZW1wU3RhdHVzID0gc3ViRGF0YU1vZGVsLnZhbGlkYXRlKCk7CkBAIC0zMTcsNyArMzIzLDcgQEAKIAkJCQkJfQogCQkJCQlpZiAocHJvamVjdHMuY29udGFpbnNLZXkodGVtcFByb2plY3ROYW1lKSkgewogCQkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5iaW5kKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkVBUkltcG9ydERhdGFNb2RlbF9VSV8yLCBuZXcgT2JqZWN0W10geyB0ZW1wUHJvamVjdE5hbWUsCi0JCQkJCQkJCXRlbXBBcmNoaXZlLmdldFBhdGgoKSwgKChBcmNoaXZlV3JhcHBlcikgcHJvamVjdHMuZ2V0KHRlbXBQcm9qZWN0TmFtZSkpLmdldFBhdGgoKSB9KSk7CisJCQkJCQkJCXRlbXBBcmNoaXZlLmdldFBhdGgoKSwgKHByb2plY3RzLmdldCh0ZW1wUHJvamVjdE5hbWUpKS5nZXRQYXRoKCkgfSkpOwogCQkJCQl9IGVsc2UgaWYgKCFXVFBQbHVnaW4uaXNQbGF0Zm9ybUNhc2VTZW5zaXRpdmUoKSkgewogCQkJCQkJU3RyaW5nIGxvd2VyQ2FzZVByb2plY3ROYW1lID0gdGVtcFByb2plY3ROYW1lLnRvTG93ZXJDYXNlKCk7CiAJCQkJCQlTdHJpbmcgY3VycmVudEtleSA9IG51bGw7CkBAIC00MjIsNyArNDI4LDcgQEAKIAkJCWN1cnJlbnRBcmNoaXZlID0gdXRpbGl0eUphcnMuZ2V0KGkpOwogCQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwogCQkJZm9yIChpbnQgaiA9IDA7IHV0aWxpdHlNb2RlbHMgIT0gbnVsbCAmJiBqIDwgdXRpbGl0eU1vZGVscy5zaXplKCkgJiYgIWFkZGVkOyBqKyspIHsKLQkJCQljdXJyZW50VXRpbGl0eU1vZGVsID0gKElEYXRhTW9kZWwpIHV0aWxpdHlNb2RlbHMuZ2V0KGopOworCQkJCWN1cnJlbnRVdGlsaXR5TW9kZWwgPSB1dGlsaXR5TW9kZWxzLmdldChqKTsKIAkJCQlpZiAoY3VycmVudFV0aWxpdHlNb2RlbC5nZXRQcm9wZXJ0eShJSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfV1JBUFBFUikuZXF1YWxzKGN1cnJlbnRBcmNoaXZlKSkgewogCQkJCQlhZGRlZCA9IHRydWU7CiAJCQkJfQpAQCAtNDM2LDIwICs0NDIsMjQgQEAKIAkJCQlsb2NhbE1vZGVsLnNldFByb3BlcnR5KElKYXZhVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVJDSElWRV9XUkFQUEVSLCBjdXJyZW50QXJjaGl2ZSk7CiAJCQkJbG9jYWxNb2RlbC5zZXRQcm9wZXJ0eShJSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUsIGdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkpOwogCQkJCWxvY2FsTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FLCBnZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpKTsKLQkJCQl1dGlsaXR5TW9kZWxzLmFkZChsb2NhbE1vZGVsKTsKKwkJCQlpZih1dGlsaXR5TW9kZWxzICE9IG51bGwpeworCQkJCQl1dGlsaXR5TW9kZWxzLmFkZChsb2NhbE1vZGVsKTsKKwkJCQl9CiAJCQkJbG9jYWxNb2RlbC5hZGRMaXN0ZW5lcihuZXN0ZWRMaXN0ZW5lcik7CiAJCQkJdXRpbGl0eUphcnNNb2RpZmllZCA9IHRydWU7CiAJCQl9CiAJCX0gLy8gUmVtb3ZlIGV4dHJhcwotCQlmb3IgKGludCBpID0gdXRpbGl0eU1vZGVscy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJY3VycmVudFV0aWxpdHlNb2RlbCA9IChJRGF0YU1vZGVsKSB1dGlsaXR5TW9kZWxzLmdldChpKTsKLQkJCWN1cnJlbnRBcmNoaXZlID0gKEFyY2hpdmVXcmFwcGVyKSBjdXJyZW50VXRpbGl0eU1vZGVsLmdldFByb3BlcnR5KElKYXZhVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVJDSElWRV9XUkFQUEVSKTsKLQkJCWlmIChudWxsID09IHV0aWxpdHlKYXJzIHx8ICF1dGlsaXR5SmFycy5jb250YWlucyhjdXJyZW50QXJjaGl2ZSkpIHsKLQkJCQljdXJyZW50VXRpbGl0eU1vZGVsLnJlbW92ZUxpc3RlbmVyKG5lc3RlZExpc3RlbmVyKTsKLQkJCQljdXJyZW50VXRpbGl0eU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNMT1NFX0FSQ0hJVkVfT05fRElTUE9TRSwgZmFsc2UpOwotCQkJCWN1cnJlbnRVdGlsaXR5TW9kZWwuZGlzcG9zZSgpOwotCQkJCXV0aWxpdHlNb2RlbHMucmVtb3ZlKGN1cnJlbnRVdGlsaXR5TW9kZWwpOwotCQkJCXV0aWxpdHlKYXJzTW9kaWZpZWQgPSB0cnVlOworCQlpZih1dGlsaXR5TW9kZWxzICE9IG51bGwpeworCQkJZm9yIChpbnQgaSA9IHV0aWxpdHlNb2RlbHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCQljdXJyZW50VXRpbGl0eU1vZGVsID0gdXRpbGl0eU1vZGVscy5nZXQoaSk7CisJCQkJY3VycmVudEFyY2hpdmUgPSAoQXJjaGl2ZVdyYXBwZXIpIGN1cnJlbnRVdGlsaXR5TW9kZWwuZ2V0UHJvcGVydHkoSUphdmFVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX1dSQVBQRVIpOworCQkJCWlmIChudWxsID09IHV0aWxpdHlKYXJzIHx8ICF1dGlsaXR5SmFycy5jb250YWlucyhjdXJyZW50QXJjaGl2ZSkpIHsKKwkJCQkJY3VycmVudFV0aWxpdHlNb2RlbC5yZW1vdmVMaXN0ZW5lcihuZXN0ZWRMaXN0ZW5lcik7CisJCQkJCWN1cnJlbnRVdGlsaXR5TW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKYXZhVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQ0xPU0VfQVJDSElWRV9PTl9ESVNQT1NFLCBmYWxzZSk7CisJCQkJCWN1cnJlbnRVdGlsaXR5TW9kZWwuZGlzcG9zZSgpOworCQkJCQl1dGlsaXR5TW9kZWxzLnJlbW92ZShjdXJyZW50VXRpbGl0eU1vZGVsKTsKKwkJCQkJdXRpbGl0eUphcnNNb2RpZmllZCA9IHRydWU7CisJCQkJfQogCQkJfQogCQl9CiAJCWFsbExpc3QgPSBnZXRQcm9qZWN0TW9kZWxzKCk7CkBAIC01MDcsNyArNTE3LDcgQEAKIAkJCQkJCQllamJKYXJzV2l0aENsaWVudHMucHV0KGxvY2FsTW9kZWwsIGNsaWVudEFyY2gpOwogCQkJCQkJfQogCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQkJfQogCiAJCQkJfSBlbHNlIGlmICh0ZW1wLmlzUkFSRmlsZSgpKSB7CkBAIC01MzQsOCArNTQ0LDggQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFcnJvciBsb2FkaW5nIG5lc3RlZCBhcmNoaXZlOiAiICsgdGVtcC5nZXRQYXRoKCkudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKCJFcnJvciBsb2FkaW5nIG5lc3RlZCBhcmNoaXZlOiAiICsgdGVtcC5nZXRQYXRoKCkudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAorCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJY2FjaGVkTG9hZEVycm9yID0gdGVtcDsKIAkJCX0KIAkJfQpAQCAtNTc0LDggKzU4NCw5IEBACiAJCQkJfQogCQkJCWlmIChkZWZhdWx0TW9kdWxlTmFtZXMuY29udGFpbnMobW9kdWxlTmFtZSArIHN1ZmZpeCkpIHsKIAkJCQkJaW50IGNvdW50ID0gMTsKLQkJCQkJZm9yICg7IGRlZmF1bHRNb2R1bGVOYW1lcy5jb250YWlucyhtb2R1bGVOYW1lICsgc3VmZml4ICsgY291bnQpICYmIGNvdW50IDwgMTA7IGNvdW50KyspCi0JCQkJCQk7CisJCQkJCWZvciAoOyBkZWZhdWx0TW9kdWxlTmFtZXMuY29udGFpbnMobW9kdWxlTmFtZSArIHN1ZmZpeCArIGNvdW50KSAmJiBjb3VudCA8IDEwOyBjb3VudCsrKXsKKwkJCQkJCS8vZG8gbm90aGluZyBzaW1wbHkgaW5jcmVtZW50aW5nIGNvdW50CisJCQkJCX0KIAkJCQkJc3VmZml4ICs9IGNvdW50OwogCQkJCX0KIAkJCQlsb2NhbE1vZGVsLnNldFByb3BlcnR5KElKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIG1vZHVsZU5hbWUgKyBzdWZmaXgpOwpAQCAtNTg1LDI1ICs1OTYsMTEgQEAKIAkJcmV0dXJuIG1vZHVsZU1vZGVsczsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgaW50IGdldFR5cGUoKSB7CiAJCXJldHVybiBYTUxSZXNvdXJjZS5BUFBMSUNBVElPTl9UWVBFOwogCX0KIAotCXByb3RlY3RlZCBBcmNoaXZlIG9wZW5BcmNoaXZlKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0Uub3BlbkVBUkZpbGUoZ2V0QXJjaGl2ZU9wdGlvbnMoKSwgdXJpKTsKLQl9Ci0KLQkvKgotCSAqIHByaXZhdGUgRUFSRmlsZSBnZXRFQVJGaWxlKCkgeyByZXR1cm4gKEVBUkZpbGUpIGdldEFyY2hpdmVGaWxlKCk7IH0KLQkgKi8KLQkvKgotCSAqIHB1YmxpYyBib29sZWFuIGhhbmRsZXNBcmNoaXZlKEFyY2hpdmUgYW5BcmNoaXZlKSB7IExpc3QgdGVtcCA9IG5ldyBBcnJheUxpc3QoKTsgTGlzdCB0ZW1wTGlzdCA9IChMaXN0KQotCSAqIGdldFByb3BlcnR5KE1PRFVMRV9NT0RFTFNfTElTVCk7IGlmIChudWxsICE9IHRlbXBMaXN0KSB7IHRlbXAuYWRkQWxsKHRlbXBMaXN0KTsgfSB0ZW1wTGlzdCA9IChMaXN0KQotCSAqIGdldFByb3BlcnR5KEVKQl9DTElFTlRfTElTVCk7IGlmIChudWxsICE9IHRlbXBMaXN0KSB7IHRlbXAuYWRkQWxsKHRlbXBMaXN0KTsgfSB0ZW1wTGlzdCA9IGdldFNlbGVjdGVkTW9kZWxzKCk7Ci0JICogZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wTGlzdC5zaXplKCk7IGkrKykgeyBpZiAoIXRlbXAuY29udGFpbnModGVtcExpc3QuZ2V0KGkpKSkgeyB0ZW1wLmFkZCh0ZW1wTGlzdC5nZXQoaSkpOyB9IH0KLQkgKiBJRGF0YU1vZGVsIGltcG9ydERNID0gbnVsbDsgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wLnNpemUoKTsgaSsrKSB7IGltcG9ydERNID0gKElEYXRhTW9kZWwpIHRlbXAuZ2V0KGkpOyBpZgotCSAqIChpbXBvcnRETS5nZXRQcm9wZXJ0eShBUkNISVZFX1dSQVBQRVIpID09IGFuQXJjaGl2ZSkgeyByZXR1cm4gdHJ1ZTsgfSB9IHJldHVybiBmYWxzZTsgfQotCSAqLwogCXByaXZhdGUgTGlzdDxJRGF0YU1vZGVsPiBnZXRQcm9qZWN0TW9kZWxzKCkgewogCQlMaXN0PElEYXRhTW9kZWw+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PElEYXRhTW9kZWw+KCk7CiAJCUxpc3QgdGVtcExpc3QgPSAoTGlzdCkgZ2V0UHJvcGVydHkoTU9EVUxFX01PREVMU19MSVNUKTsKQEAgLTY0OCwxMSArNjQ1LDcgQEAKIAkJcmV0dXJuIHJlbW92ZUhhbmRsZWRNb2RlbHMoc2VsZWN0ZWRNb2RlbHMsIHNlbGVjdGVkTW9kZWxzLCB0cnVlKTsKIAl9CiAKLQkvKgotCSAqIHB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb24oKSB7IEVBUkZpbGUgZWYgPSBnZXRFQVJGaWxlKCk7IHJldHVybiBudWxsID09IGVmID8gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQgOgotCSAqIEFyY2hpdmVVdGlsLmdldEZhc3RTcGVjVmVyc2lvbihlZik7IH0KLQkgKi8KLQorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYgKCFzdXBlci5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpKSB7CiAJCQlyZXR1cm4gZmFsc2U7CkBAIC02NjUsNiArNjU4LDcgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKIAkJc3VwZXIuZGlzcG9zZSgpOwogCQlMaXN0IGxpc3QgPSBnZXRQcm9qZWN0TW9kZWxzKCk7CkBAIC02NzMsNTMgKzY2NywxNyBAQAogCQl9CiAJfQogCi0JLyoqCi0JICogRG8gbm90IHVzZSB0aGlzIGl0IHdpbGwgYmUgZGVsZXRlZCBwb3N0IDIuMC4gIFRoaXMgbWV0aG9kIHdpbGwgYmUgbW92ZWQgdG8gYSB1dGlsaXR5IGNsYXNzLgotCSAqIEBkZXByZWNhdGVkIAotCSAqIEBwYXJhbSBlYXJGaWxlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxVdGlsaXRpZXMob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZSBlYXJGaWxlKSB7Ci0JCUxpc3QgZmlsZXMgPSBlYXJGaWxlLmdldEZpbGVzKCk7Ci0JCUxpc3QgdXRpbEphcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuRmlsZUltcGwgZmlsZSA9IChvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkZpbGVJbXBsKSBmaWxlcy5nZXQoaSk7Ci0JCQlpZiAoZmlsZS5pc0FyY2hpdmUoKSAmJiAhZmlsZS5pc01vZHVsZUZpbGUoKSAmJiBmaWxlLmdldFVSSSgpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXV0aWxKYXJzLmFkZChmaWxlKTsKLQkJCX0KLQkJCWlmIChmaWxlLmlzV0FSRmlsZSgpKSB7Ci0JCQkJdXRpbEphcnMuYWRkQWxsKGdldFdlYkxpYnMoKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGUpIGZpbGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXRpbEphcnM7Ci0JfQotCQotCS8qKgotCSAqIERvIG5vdCB1c2UgdGhpcyBpdCB3aWxsIGJlIGRlbGV0ZWQgcG9zdCAyLjAgIFRoaXMgbWV0aG9kIHdpbGwgYmUgbW92ZWQgdG8gYSB1dGlsaXR5IGNsYXNzLgotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIHdhckZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFdlYkxpYnMob3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZSB3YXJGaWxlKSB7Ci0JCXJldHVybiAoKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuV0FSRmlsZUltcGwpIHdhckZpbGUpLmdldExpYkFyY2hpdmVzKCk7Ci0JfQotCQotCS8vIFRPRE86IEltcGxlbWVudCB3aXRoIEoyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyCi0JLyoKLQkgKiBwdWJsaWMgSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsIGdldE1hdGNoaW5nRUpCSmFyT3JDbGllbnQoSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsIG1vZGVsKSB7IGlmCi0JICogKGNsaWVudEphclRvRWpiSmFyTW9kZWxzLmNvbnRhaW5zS2V5KG1vZGVsKSkgeyByZXR1cm4gKEoyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbCkKLQkgKiBjbGllbnRKYXJUb0VqYkphck1vZGVscy5nZXQobW9kZWwpOyB9IGVsc2UgaWYgKGVqYkphclRvQ2xpZW50SmFyTW9kZWxzLmNvbnRhaW5zS2V5KG1vZGVsKSkgeyByZXR1cm4KLQkgKiAoSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsKSBlamJKYXJUb0NsaWVudEphck1vZGVscy5nZXQobW9kZWwpOyB9IGVsc2UgeyByZXR1cm4gbnVsbDsgfSB9Ci0JICovCi0KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgSURhdGFNb2RlbCBjcmVhdGVKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKSB7CiAJCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRUFSRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewogCQlyZXR1cm4gbmV3IEVBUkNvbXBvbmVudEltcG9ydE9wZXJhdGlvbihtb2RlbCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgaW5pdCgpIHsKIAkJc3VwZXIuaW5pdCgpOwogCQlJRGF0YU1vZGVsIGNvbXBvbmVudENyZWF0aW9uRE0gPSBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfSjJFRV9DT01QT05FTlRfQ1JFQVRJT04pOwpAQCAtNzI5LDIxICs2ODcsMjIgQEAKIAl9CiAJCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFyY2hpdmVXcmFwcGVyIG9wZW5BcmNoaXZlV3JhcHBlcihTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24sIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIEFyY2hpdmVXcmFwcGVyIG9wZW5BcmNoaXZlV3JhcHBlcihTdHJpbmcgdXJpKSB0aHJvd3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKIAkJQXJjaGl2ZVdyYXBwZXIgd3JhcHBlciA9IHN1cGVyLm9wZW5BcmNoaXZlV3JhcHBlcih1cmkpOwogCQlpZihudWxsICE9IHdyYXBwZXIpewogCQkJSmF2YUVFUXVpY2tQZWVrIGpxcCA9ICB3cmFwcGVyLmdldEphdmFFRVF1aWNrUGVlaygpOwogCQkJaWYoanFwLmdldFR5cGUoKSAhPSBKYXZhRUVRdWlja1BlZWsuQVBQTElDQVRJT05fVFlQRSl7CiAJCQkJd3JhcHBlci5jbG9zZSgpOwotCQkJCXRocm93IG5ldyBPcGVuRmFpbHVyZUV4Y2VwdGlvbihDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhDb21tb25BcmNoaXZlUmVzb3VyY2VIYW5kbGVyLmNvdWxkX25vdF9vcGVuX0VYQ18sIChuZXcgT2JqZWN0W117dXJpfSkpKTsKKwkJCQl0aHJvdyBuZXcgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKENvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXIuY291bGRfbm90X29wZW5fRVhDXywgKG5ldyBPYmplY3RbXXt1cml9KSkpOwogCQkJfQogCQl9CiAJCXJldHVybiB3cmFwcGVyOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVbmtub3duVHlwZShKYXZhRUVRdWlja1BlZWsganFwKSB7CiAJCWpxcC5zZXRUeXBlKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEUpOwotCQlqcXAuc2V0VmVyc2lvbihKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEKTsKLQkJanFwLnNldEphdmFFRVZlcnNpb24oSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRCk7CisJCWpxcC5zZXRWZXJzaW9uKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV82XzBfSUQpOworCQlqcXAuc2V0SmF2YUVFVmVyc2lvbihKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNl8wX0lEKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKaW5kZXggM2IzNTJiNy4uOWI1MTkxOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpAQCAtMTQsNiArMTQsNiBAQAogCiBwdWJsaWMgaW50ZXJmYWNlIElBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgZXh0ZW5kcyBJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMgewogCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9MSUJfRUxFTUVOVFNfTElTVCA9ICJJQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkoyRUVfTElCX0VMRU1FTlRTX0xJU1QiOyAvLyROT04tTkxTLTEkCisJCiAKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lBZGRXZWJGcmFnbWVudENvbXBvbmVudFRvV2ViQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JQWRkV2ViRnJhZ21lbnRDb21wb25lbnRUb1dlYkFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OTYxODIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JQWRkV2ViRnJhZ21lbnRDb21wb25lbnRUb1dlYkFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOworCitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKKworcHVibGljIGludGVyZmFjZSBJQWRkV2ViRnJhZ21lbnRDb21wb25lbnRUb1dlYkFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzIElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcyB7CisKKwkKKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSU1vZHVsZUV4dGVuc2lvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0lNb2R1bGVFeHRlbnNpb25zLmphdmEKaW5kZXggMTkxMzZlMi4uM2ExOTk4MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSU1vZHVsZUV4dGVuc2lvbnMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9JTW9kdWxlRXh0ZW5zaW9ucy5qYXZhCkBAIC0xMCwxMiArMTAsMTUgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOworCisvLyBAZGVwcmVjYXRlZCBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50cworCiBwdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVFeHRlbnNpb25zIHsKIAotCXB1YmxpYyBTdHJpbmcgRE9UX1dBUiA9ICIud2FyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBTdHJpbmcgRE9UX0pBUiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgU3RyaW5nIERPVF9SQVIgPSAiLnJhciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgU3RyaW5nIERPVF9FQVIgPSAiLmVhciI7IC8vJE5PTi1OTFMtMSQKLQorCXB1YmxpYyBTdHJpbmcgRE9UX1dBUiA9IElKMkVFTW9kdWxlQ29uc3RhbnRzLldBUl9FWFQ7CisJcHVibGljIFN0cmluZyBET1RfSkFSID0gSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVDsgCisJcHVibGljIFN0cmluZyBET1RfUkFSID0gSUoyRUVNb2R1bGVDb25zdGFudHMuUkFSX0VYVDsKKwlwdWJsaWMgU3RyaW5nIERPVF9FQVIgPSBJSjJFRU1vZHVsZUNvbnN0YW50cy5FQVJfRVhUOwogCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFQXJ0aWZhY3RFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRUFydGlmYWN0RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCA3Y2IxMzQ3Li43NmQ0ZDE4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFQXJ0aWZhY3RFeHBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVBcnRpZmFjdEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTExLDkgKzExLDExIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCkBAIC03Miw2ICs3NCw3IEBACiAJCXN1cGVyKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewogCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9OQU1FKTsKQEAgLTkyLDYgKzk1LDcgQEAKIAogCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TW9kdWxlRXh0ZW5zaW9uKCk7CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEFSQ0hJVkVfREVTVElOQVRJT04pKSB7CiAJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKQEAgLTEwOSw2ICsxMTMsNyBAQAogCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lICkKIAl7CiAJICAgIGlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBPUFRJTUlaRV9GT1JfU1BFQ0lGSUNfUlVOVElNRSApICkKQEAgLTEyMyw2ICsxMjgsNyBAQAogCSAgICByZXR1cm4gdHJ1ZTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIAogCXsKIAkJYm9vbGVhbiBzZXQgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwpAQCAtMjAzLDcgKzIwOSw3IEBACiAJCSAgICB7CiAJCSAgICAgICAgZmluYWwgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKIAkJICAgICAgICAKLQkJICAgICAgICBpZiggcHJvamVjdCAhPSBudWxsICYmIHByb3BlcnR5VmFsdWUgIT0gbnVsbCApCisJCSAgICAgICAgaWYoIHByb2plY3QgIT0gbnVsbCkKIAkJICAgICAgICB7CiAJCSAgICAgICAgICAgIGZpbmFsIElSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIHByb3BlcnR5VmFsdWU7CiAJCSAgICAgICAgICAgIApAQCAtMjU4LDEwICsyNjQsMjIgQEAKIAkJCWdldENvbXBvbmVudE1hcCgpLnB1dChjb21wc1tpXS5nZXROYW1lKCksIGNvbXBzW2ldKTsKIAkJfQogCX0KLQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpeworCQlpZiggcHJvcGVydHlOYW1lLmVxdWFscyggUlVOVElNRSApICkKKwkJeworCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZ2V0UHJvcGVydHkoUlVOVElNRSk7CisJCQlpZihydW50aW1lICE9IG51bGwpCisJCQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IocnVudGltZSwgcnVudGltZS5nZXRMb2NhbGl6ZWROYW1lKCkpOworCQl9CisJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3IocHJvcGVydHlOYW1lKTsKKwl9CisJCiAJLyoqCiAJICogUG9wdWxhdGUgdGhlIHJlc291cmNlIG5hbWUgY29tYm8gd2l0aCBwcm9qZWN0cyB0aGF0IGFyZSBub3QgZW5jcnlwdGVkLgogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQkvLyBUT0RPOiBwb3B1bGF0ZSB2YWxpZCBjb21wb25lbnRzCiAJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST0pFQ1RfTkFNRSkpIHsKQEAgLTI3Niw3ICsyOTQsNyBAQAogCQkJCX0KIAkJCX0KIAotCQkJaWYgKHJlbGV2YW50Q29tcG9uZW50cyA9PSBudWxsIHx8IHJlbGV2YW50Q29tcG9uZW50cy5zaXplKCkgPT0gMCkKKwkJCWlmIChyZWxldmFudENvbXBvbmVudHMuc2l6ZSgpID09IDApCiAJCQkJcmV0dXJuIG51bGw7CiAKIAkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVsZXZhbnRDb21wb25lbnRzLnNpemUoKTsgaisrKSB7CkBAIC0yOTEsNDEgKzMwOSw0NCBAQAogICAgICAgICAgICAgZmluYWwgTGlzdDxJUnVudGltZT4gcnVudGltZXMgPSBuZXcgQXJyYXlMaXN0PElSdW50aW1lPigpOwogCQkgICAgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBnZXRQcm9wZXJ0eSggQ09NUE9ORU5UICk7CiAJCSAgICAKLQkJICAgIGlmKCBjb21wb25lbnQgIT0gbnVsbCApCi0JCSAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIGNvbXBvbmVudCAhPSBudWxsICkKKwkgICAgICAgIGlmKCBjb21wb25lbnQgIT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBjb21wb25lbnQuZ2V0UHJvamVjdCgpICk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBmb3IoIElSdW50aW1lIHJ1bnRpbWUgOiBSdW50aW1lTWFuYWdlci5nZXRSdW50aW1lcygpICkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZwcm9qID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBjb21wb25lbnQuZ2V0UHJvamVjdCgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciggSVJ1bnRpbWUgcnVudGltZSA6IFJ1bnRpbWVNYW5hZ2VyLmdldFJ1bnRpbWVzKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZwcm9qLmlzVGFyZ2V0YWJsZSggcnVudGltZSApICkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZnByb2ouaXNUYXJnZXRhYmxlKCBydW50aW1lICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZXMuYWRkKCBydW50aW1lICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVzLmFkZCggcnVudGltZSApOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb21wYXJhdG9yPElSdW50aW1lPiBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3I8SVJ1bnRpbWU+KCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoIGZpbmFsIElSdW50aW1lIHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVJ1bnRpbWUgcjIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIxLmdldE5hbWUoKS5jb21wYXJlVG8oIHIyLmdldE5hbWUoKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoIHJ1bnRpbWVzLCBjb21wYXJhdG9yICk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEoyRUVQbHVnaW4ubG9nRXJyb3IoIC0xLCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbcnVudGltZXMuc2l6ZSgpXTsKKyAgICAgICAgCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBydW50aW1lcy5pdGVyYXRvcigpOworICAgICAgICAJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIAkJCQlJUnVudGltZSBydW50aW1lID0gKElSdW50aW1lKSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgIAkJCQlkZXNjcmlwdG9yc1tpXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IocnVudGltZSwgcnVudGltZS5nZXRMb2NhbGl6ZWROYW1lKCkpOworICAgICAgICAJCQl9CisgICAgICAgIAkJCWlmKGRlc2NyaXB0b3JzLmxlbmd0aCA+IDIpeworICAgICAgICAJCQkJQXJyYXlzLnNvcnQoZGVzY3JpcHRvcnMsIDAsIGRlc2NyaXB0b3JzLmxlbmd0aCwgbmV3IENvbXBhcmF0b3IoKSB7CisgICAgICAgIAkJCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgeworICAgICAgICAJCQkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZDEgPSAoRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKWFyZzA7CisgICAgICAgIAkJCQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkMiA9IChEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IpYXJnMTsKKyAgICAgICAgCQkJCQkJcmV0dXJuIGQxLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKS5jb21wYXJlVG8oZDIuZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpKTsKKyAgICAgICAgCQkJCQl9CisgICAgICAgIAkJCQl9KTsKKyAgICAgICAgCQkJfQorICAgICAgICAJCQlyZXR1cm4gZGVzY3JpcHRvcnM7CiAgICAgICAgICAgICAgICAgfQotCQkgICAgfQotCQkgICAgCi0JCSAgICByZXR1cm4gRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmNyZWF0ZURlc2NyaXB0b3JzKCBydW50aW1lcy50b0FycmF5KCkgKTsJCSAgICAKKyAgICAgICAgICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEoyRUVQbHVnaW4ubG9nRXJyb3IoIC0xLCBlLmdldE1lc3NhZ2UoKSwgZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwkgICAgICAgIAorCSAgICAgICAgcmV0dXJuIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvci5jcmVhdGVEZXNjcmlwdG9ycyhudWxsKTsgICAgCiAJCX0KIAkJCiAJCXJldHVybiBzdXBlci5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKQEAgLTMzOCw2ICszNTksNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5XVFBPcGVyYXRpb25EYXRhTW9kZWwjZG9WYWxpZGF0ZVByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAoUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CiAJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKSBtb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwpAQCAtMzg3LDcgKzQwOSw3IEBACiAJCVN0cmluZyBkZXZpY2UgPSBwYXRoLmdldERldmljZSgpOwogCQlpZiAoZGV2aWNlID09IG51bGwpCiAJCQlyZXR1cm4gT0tfU1RBVFVTOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IGRldmljZS5sZW5ndGgoKSA9PSAxICYmIGRldmljZS5jaGFyQXQoMCkgPT0gSVBhdGguREVWSUNFX1NFUEFSQVRPUikKKwkJaWYgKGRldmljZS5sZW5ndGgoKSA9PSAxICYmIGRldmljZS5jaGFyQXQoMCkgPT0gSVBhdGguREVWSUNFX1NFUEFSQVRPUikKIAkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLkRFU1RJTkFUSU9OX0lOVkFMSUQpKTsKIAogCQlpZiAoIXBhdGgudG9GaWxlKCkuY2FuV3JpdGUoKSkgewpAQCAtNDE0LDcgKzQzNiw3IEBACiAJcHJpdmF0ZSBib29sZWFuIGNoZWNrRm9yRXhpc3RpbmdGaWxlUmVzb3VyY2UoU3RyaW5nIGZpbGVOYW1lKSB7CiAJCWlmICghbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KE9WRVJXUklURV9FWElTVElORykpIHsKIAkJCWphdmEuaW8uRmlsZSBleHRlcm5hbEZpbGUgPSBuZXcgamF2YS5pby5GaWxlKGZpbGVOYW1lKTsKLQkJCWlmIChleHRlcm5hbEZpbGUgIT0gbnVsbCAmJiBleHRlcm5hbEZpbGUuZXhpc3RzKCkpCisJCQlpZiAoZXh0ZXJuYWxGaWxlLmV4aXN0cygpKQogCQkJCXJldHVybiB0cnVlOwogCQl9CiAJCXJldHVybiBmYWxzZTsKQEAgLTQzNSwxMCArNDU3LDcgQEAKIAkgICAgewogCSAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXRQcm9qZWN0KCk7CiAJICAgIH0KLQkgICAgZWxzZQotCSAgICB7Ci0JICAgICAgICByZXR1cm4gbnVsbDsKLQkgICAgfQorCSAgICByZXR1cm4gbnVsbDsKIAl9CiAKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFQXJ0aWZhY3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCmluZGV4IGFjZmM1NTMuLmEyYjhkM2UgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVBcnRpZmFjdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMTAsMTIgKzEwLDE1IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CkBAIC0yMywyMCArMjYsMTkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlNhdmVGaWx0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVXcmFwcGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuSmF2YUVFQXJjaGl2ZVV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVDcmVhdGlvblJlc291cmNlSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLmFyY2hpdmUuQXJjaGl2ZU9wdGlvbnM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5aaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKQEAgLTUwLDYgKzUyLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vbk1lc3NhZ2VzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKQEAgLTYzLDEyICs2NiwxMCBAQAogCXByaXZhdGUgSURhdGFNb2RlbCBjb21wb25lbnRDcmVhdGlvbkRNOwogCXByaXZhdGUgVGhyb3dhYmxlIGFyY2hpdmVPcGVuRmFpbHVyZSA9IG51bGw7CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7CiAJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwogCQlwcm9wZXJ0eU5hbWVzLmFkZChGSUxFX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChGSUxFKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoU0FWRV9GSUxURVIpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChPVkVSV1JJVEVfSEFORExFUik7CiAJCXByb3BlcnR5TmFtZXMuYWRkKENMT1NFX0FSQ0hJVkVfT05fRElTUE9TRSk7CiAJCXByb3BlcnR5TmFtZXMuYWRkKFVTRV9ERUZBVUxUX1BST0pFQ1RfTkFNRSk7CiAJCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTkFNRSk7CkBAIC03OCw2ICs3OSw3IEBACiAJCXJldHVybiBwcm9wZXJ0eU5hbWVzOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGluaXQoKSB7CiAJCXN1cGVyLmluaXQoKTsKIAkJY29tcG9uZW50Q3JlYXRpb25ETSA9IGNyZWF0ZUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpOwpAQCAtODYsNiArODgsNyBAQAogCQltb2RlbC5hZGROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfSjJFRV9DT01QT05FTlRfQ1JFQVRJT04sIGNvbXBvbmVudENyZWF0aW9uRE0pOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ0xPU0VfQVJDSElWRV9PTl9ESVNQT1NFKSkgewogCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKQEAgLTEwMSw2ICsxMDQsNyBAQAogCiAJcHJpdmF0ZSBib29sZWFuIHNldHRpbmdGaWxlTmFtZSA9IGZhbHNlOwogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKIAkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQVJDSElWRV9XUkFQUEVSKSkgewogCQkJaWYocHJvcGVydHlWYWx1ZSAhPSBudWxsKXsKQEAgLTExMCwyNCArMTE0LDEwIEBACiAJCQkJdXBkYXRlRGVmYXVsdENvbXBvbmVudE5hbWUoKTsKIAkJCX0KIAkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYocHJvcGVydHlOYW1lLmVxdWFscyhGSUxFKSl7Ci0JCQlpZihwcm9wZXJ0eVZhbHVlICE9IG51bGwpewotCQkJCWlmKCFzZXR0aW5nRmlsZU5hbWUpIHsKLQkJCQkJQXJjaGl2ZVdyYXBwZXIgYXJjaGl2ZVdyYXBwZXIgPSBnZXRBcmNoaXZlV3JhcHBlcigpOwotCQkJCQlpZihudWxsID09IGFyY2hpdmVXcmFwcGVyIHx8IGFyY2hpdmVXcmFwcGVyLmdldENvbW1vbkFyY2hpdmUoKSAhPSBwcm9wZXJ0eVZhbHVlKXsKLQkJCQkJCWFyY2hpdmVXcmFwcGVyID0gbmV3IEFyY2hpdmVXcmFwcGVyKChBcmNoaXZlKXByb3BlcnR5VmFsdWUpOwotCQkJCQkJc2V0UHJvcGVydHkoQVJDSElWRV9XUkFQUEVSLCBhcmNoaXZlV3JhcHBlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTQVZFX0ZJTFRFUikgJiYgZ2V0QXJjaGl2ZVdyYXBwZXIoKSAhPSBudWxsICYmIGdldEFyY2hpdmVXcmFwcGVyKCkuZ2V0Q29tbW9uQXJjaGl2ZSgpICE9IG51bGwpIHsKLQkJCWdldEFyY2hpdmVXcmFwcGVyKCkuZ2V0Q29tbW9uQXJjaGl2ZSgpLnNldFNhdmVGaWx0ZXIoZ2V0U2F2ZUZpbHRlcigpKTsKIAkJfSBlbHNlIGlmIChGSUxFX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKIAkJCXRyeSB7CiAJCQkJYXJjaGl2ZU9wZW5GYWlsdXJlID0gbnVsbDsKIAkJCQloYW5kbGVBcmNoaXZlU2V0dXAoKFN0cmluZykgcHJvcGVydHlWYWx1ZSk7Ci0JCQl9IGNhdGNoIChPcGVuRmFpbHVyZUV4Y2VwdGlvbiBvZSkgewotCQkJCWFyY2hpdmVPcGVuRmFpbHVyZSA9IG9lOwogCQkJfSBjYXRjaCAoQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKIAkJCQlhcmNoaXZlT3BlbkZhaWx1cmUgPSBlOwogCQkJfQpAQCAtMTQxLDcgKzEzMSw3IEBACiAJCQkJdHJ5IHsKIAkJCQkJbmVzdGVkTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIHByb3BlcnR5VmFsdWUpOwogCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQl9CiAJCQl9CiAJCX0gZWxzZSBpZiggRkFDRVRfUlVOVElNRS5lcXVhbHMoIHByb3BlcnR5TmFtZSApKXsKQEAgLTE3MCwxMyArMTYwLDEyIEBACiAJCX0KIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gaGFuZGxlQXJjaGl2ZVNldHVwKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uLCBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24geworCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVBcmNoaXZlU2V0dXAoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCXNldHRpbmdGaWxlTmFtZSA9IHRydWU7CiAJCQlBcmNoaXZlV3JhcHBlciB3cmFwcGVyID0gZ2V0QXJjaGl2ZVdyYXBwZXIoKTsKIAkJCWlmICh3cmFwcGVyIT0gbnVsbCkgewogCQkJCXdyYXBwZXIuY2xvc2UoKTsKLQkJCQlzZXRQcm9wZXJ0eShGSUxFLCBudWxsKTsKIAkJCQlzZXRQcm9wZXJ0eShBUkNISVZFX1dSQVBQRVIsIG51bGwpOwogCQkJfQogCQkJU3RyaW5nIHVyaSA9IGdldFN0cmluZ1Byb3BlcnR5KEZJTEVfTkFNRSk7CkBAIC0xODUsOSArMTc0LDYgQEAKIAkJCXdyYXBwZXIgPSBvcGVuQXJjaGl2ZVdyYXBwZXIodXJpKTsKIAkJCWlmKHdyYXBwZXIgIT0gbnVsbCl7CiAJCQkJc2V0UHJvcGVydHkoQVJDSElWRV9XUkFQUEVSLCB3cmFwcGVyKTsKLQkJCQlpZih3cmFwcGVyLmdldENvbW1vbkFyY2hpdmUoKSAhPSBudWxsKXsKLQkJCQkJc2V0UHJvcGVydHkoRklMRSwgd3JhcHBlci5nZXRDb21tb25BcmNoaXZlKCkpOwotCQkJCX0KIAkJCX0KIAkJCXJldHVybiB3cmFwcGVyIT0gbnVsbDsKIAkJfSBmaW5hbGx5IHsKQEAgLTE5NiwxMSArMTgyLDMxIEBACiAKIAl9CiAKLQlwcm90ZWN0ZWQgQXJjaGl2ZVdyYXBwZXIgb3BlbkFyY2hpdmVXcmFwcGVyKFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiwgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9ueworCXByb3RlY3RlZCBBcmNoaXZlT3B0aW9ucyBnZXRBcmNoaXZlT3B0aW9ucyhJUGF0aCBhcmNoaXZlUGF0aCkgdGhyb3dzIEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7CisJCWphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShhcmNoaXZlUGF0aC50b09TU3RyaW5nKCkpOworCQlaaXBGaWxlIHppcEZpbGU7CisJCXRyeSB7CisJCQl6aXBGaWxlID0gb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkFyY2hpdmVVdGlsLm5ld1ppcEZpbGUoZmlsZSk7CisJCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7CisJCQlBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gb3BlbkZhaWx1cmVFeGNlcHRpb24gPSBuZXcgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uKGUpOworCQkJdGhyb3cgb3BlbkZhaWx1cmVFeGNlcHRpb247CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCUFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiBvcGVuRmFpbHVyZUV4Y2VwdGlvbiA9IG5ldyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24oZSk7CisJCQl0aHJvdyBvcGVuRmFpbHVyZUV4Y2VwdGlvbjsKKwkJfQorCQlaaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbCBsb2FkQWRhcHRlciA9IG5ldyBaaXBGaWxlQXJjaGl2ZUxvYWRBZGFwdGVySW1wbCh6aXBGaWxlKTsKKwkJQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKKwkJYXJjaGl2ZU9wdGlvbnMuc2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLkxPQURfQURBUFRFUiwgbG9hZEFkYXB0ZXIpOworCQlhcmNoaXZlT3B0aW9ucy5zZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuQVJDSElWRV9QQVRILCBhcmNoaXZlUGF0aCk7CisJCWFyY2hpdmVPcHRpb25zLnNldE9wdGlvbihKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLkRJU0NSSU1JTkFURV9FSkJfQU5OT1RBVElPTlMsIEJvb2xlYW4uVFJVRSk7CisJCXJldHVybiBhcmNoaXZlT3B0aW9uczsKKwl9CisJCisJcHJvdGVjdGVkIEFyY2hpdmVXcmFwcGVyIG9wZW5BcmNoaXZlV3JhcHBlcihTdHJpbmcgdXJpKSB0aHJvd3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uewogCQlJQXJjaGl2ZSBhcmNoaXZlID0gbnVsbDsKIAkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHVyaSk7Ci0JCWFyY2hpdmUgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLm9wZW5BcmNoaXZlKHBhdGgpOwotCQlhcmNoaXZlLmdldEFyY2hpdmVPcHRpb25zKCkuc2V0T3B0aW9uKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuRElTQ1JJTUlOQVRFX0VKQl9BTk5PVEFUSU9OUywgQm9vbGVhbi5UUlVFKTsKKwkJQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnMgPSBnZXRBcmNoaXZlT3B0aW9ucyhwYXRoKTsKKwkJYXJjaGl2ZSA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0Uub3BlbkFyY2hpdmUoYXJjaGl2ZU9wdGlvbnMpOwogCQlhcmNoaXZlLnNldFBhdGgocGF0aCk7CiAJCUphdmFFRVF1aWNrUGVlayBqcXAgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmdldEphdmFFRVF1aWNrUGVlayhhcmNoaXZlKTsKIAkJCkBAIC0yMTcsOCArMjIzLDYgQEAKIAlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVbmtub3duVHlwZShKYXZhRUVRdWlja1BlZWsganFwKSB7CiAJfQogCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFyY2hpdmUgb3BlbkFyY2hpdmUoU3RyaW5nIHVyaSkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uOwotCiAJcHJpdmF0ZSBib29sZWFuIGNsb3NlQXJjaGl2ZSgpIHsKIAkJaWYgKG51bGwgIT0gZ2V0QXJjaGl2ZVdyYXBwZXIoKSkgewogCQkJZ2V0QXJjaGl2ZVdyYXBwZXIoKS5jbG9zZSgpOwpAQCAtMjI2LDE0ICsyMzAsMTUgQEAKIAkJcmV0dXJuIHRydWU7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAoRklMRV9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpICYmICFpc1Byb3BlcnR5U2V0KEFSQ0hJVkVfV1JBUFBFUikpIHsKIAkJCVN0cmluZyBmaWxlTmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSk7CiAJCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCB8fCBmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKSB7CiAJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuQVJDSElWRV9GSUxFX05BTUVfRU1QVFlfRVJST1IsIG5ldyBPYmplY3RbXXtBcmNoaXZlVXRpbC5nZXRNb2R1bGVGaWxlVHlwZU5hbWUoZ2V0VHlwZSgpKX0pKTsKIAkJCX0gZWxzZSBpZiAoYXJjaGl2ZU9wZW5GYWlsdXJlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhhcmNoaXZlT3BlbkZhaWx1cmUuZ2V0TWVzc2FnZSgpKSk7Ci0JCQl9IGVsc2UgaWYgKGZpbGVOYW1lICE9IG51bGwgJiYgIWFyY2hpdmVFeGlzdHNPbkZpbGUoKSkgeworCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoYXJjaGl2ZU9wZW5GYWlsdXJlLmdldE1lc3NhZ2UoKSk7CisJCQl9IGVsc2UgaWYgKCFhcmNoaXZlRXhpc3RzT25GaWxlKCkpIHsKIAkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5GSUxFX0RPRVNfTk9UX0VYSVNUX0VSUk9SLCBuZXcgT2JqZWN0W117QXJjaGl2ZVV0aWwuZ2V0TW9kdWxlRmlsZVR5cGVOYW1lKGdldFR5cGUoKSl9KSk7CiAJCQl9CiAJCX0gZWxzZSBpZiAoTkVTVEVEX01PREVMX0oyRUVfQ09NUE9ORU5UX0NSRUFUSU9OLmVxdWFscyhwcm9wZXJ0eU5hbWUpICkgewpAQCAtMjY4LDM4ICsyNzMsMTggQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CiAJCWlmIChnZXRCb29sZWFuUHJvcGVydHkoQ0xPU0VfQVJDSElWRV9PTl9ESVNQT1NFKSkKIAkJCWNsb3NlQXJjaGl2ZSgpOwogCQlzdXBlci5kaXNwb3NlKCk7CiAJfQogCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0QXJjaGl2ZUZpbGUoQXJjaGl2ZSBhcmNoaXZlRmlsZSkgewotCQlzZXRQcm9wZXJ0eShGSUxFLCBhcmNoaXZlRmlsZSk7Ci0JfQotCQogCXByb3RlY3RlZCBmaW5hbCBBcmNoaXZlV3JhcHBlciBnZXRBcmNoaXZlV3JhcHBlcigpewogCQlyZXR1cm4gKEFyY2hpdmVXcmFwcGVyKWdldFByb3BlcnR5KEFSQ0hJVkVfV1JBUFBFUik7CiAJfQogCQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHJldHVybiB1c2UgQVJDSElWRV9XUkFQUEVSCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEFyY2hpdmUgZ2V0QXJjaGl2ZUZpbGUoKSB7Ci0JCXJldHVybiAoQXJjaGl2ZSkgZ2V0UHJvcGVydHkoRklMRSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIEFyY2hpdmVPcHRpb25zIGdldEFyY2hpdmVPcHRpb25zKCkgewotCQlBcmNoaXZlT3B0aW9ucyBvcHRzID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCW9wdHMuc2V0SXNSZWFkT25seSh0cnVlKTsKLQkJcmV0dXJuIG9wdHM7Ci0JfQotCi0JcHJpdmF0ZSBTYXZlRmlsdGVyIGdldFNhdmVGaWx0ZXIoKSB7Ci0JCXJldHVybiAoU2F2ZUZpbHRlcikgZ2V0UHJvcGVydHkoU0FWRV9GSUxURVIpOwotCX0KLQorCUBPdmVycmlkZQogCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7CiAJfQpAQCAtMzEwLDkgKzI5NSwyMyBAQAogCQl9CiAJCWlmKCBldmVudC5nZXREYXRhTW9kZWwoKSA9PSBjb21wb25lbnRDcmVhdGlvbkRNICYmIGV2ZW50LmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpKXsKIAkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEZBQ0VUX1JVTlRJTUUsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOworCQkJaWYoaXNQcm9wZXJ0eVNldChBUkNISVZFX1dSQVBQRVIpKXsKKwkJCQlyZWZyZXNoSW50ZXJwcmV0ZWRTcGVjVmVyc2lvbigpOworCQkJfQogCQl9CiAJfQogCQorCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hJbnRlcnByZXRlZFNwZWNWZXJzaW9uKCl7CisJCQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXb3JraW5nQ29weUZhY2V0VmVyc2lvbihJRGF0YU1vZGVsIG1vZHVsZURNLCBJRGF0YU1vZGVsIGZhY2V0RE0pIHsKKwkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKWZhY2V0RE0uZ2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OKTsKKwkJLy9bQnVnIDMxNDE2Ml0gSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZmFjZXQgdmVyc2lvbiBpcyBub3QgYXV0b21hdGljYWxseSB1cGRhdGVkIHNvIGl0IGhhcyB0byBiZSBkb25lIG1hbnVhbGx5CisJCUlGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwd2MgPSAoSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkpbW9kdWxlRE0uZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZKTsKKwkJZnB3Yy5jaGFuZ2VQcm9qZWN0RmFjZXRWZXJzaW9uKGZhY2V0VmVyc2lvbik7CisJfQorCQogCS8qKgogCSAqIENhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBmaXh1cCB0aGUgSlNUIGZhY2V0IHZlcnNpb24gaWYgaXQgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHNlbGVjdGVkIHJ1bnRpbWUKIAkgKiBJdCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIFNlcnZlciBSdW50aW1lIG9yIHRoZSBBcmNoaXZlIHByb3BlcnRpZXMgYXJlIHNldC4KQEAgLTM0OSwxNiArMzQ4LDg2IEBACiAJCQkJCQkJCX0KIAkJCQkJCQl9CiAJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCQogCQkJCQlpZighcnVudGltZS5zdXBwb3J0cyhmYWNldFZlcnNpb24pKXsKLQkJCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIEoyRUVDcmVhdGlvblJlc291cmNlSGFuZGxlci5WRVJTSU9OX05PVF9TVVBQT1JURUQgKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyggSjJFRUNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLlZFUlNJT05fTk9UX1NVUFBPUlRFRCApOwogCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9CiAJCXJldHVybiBPS19TVEFUVVM7CiAJfQorCQorCS8qKgorCSAqIElmIHRoZSBhcmNoaXZlIGRvZXMgbm90IGhhdmUgYSBkZXBsb3ltZW50IGRlc2NyaXB0b3IsIHRoZW4gdGhlIAorCSAqIHZlcnNpb24gd2lsbCBiZSBpbnRlcnByZXRlZCBhcyB0aGUgaGlnaGVzdCB2ZXJzaW9uIHN1cHBvcnRlZAorCSAqIGJ5IHRoZSBzZXJ2ZXIuCisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCBKYXZhRUVRdWlja1BlZWsgZ2V0SW50ZXJwcmV0ZWRTcGVjVmVyc2lvbihBcmNoaXZlV3JhcHBlciB3cmFwcGVyKXsKKwkJSmF2YUVFUXVpY2tQZWVrIGpxcCA9IHdyYXBwZXIuZ2V0SmF2YUVFUXVpY2tQZWVrKCk7CisJCUlBcmNoaXZlIGFyY2hpdmUgPSB3cmFwcGVyLmdldElBcmNoaXZlKCk7CisJCWlmKCFhcmNoaXZlLmlzT3BlbigpKXsKKwkJCXJldHVybiBqcXA7CisJCX0KKwkJaW50IGFyY2hpdmVUeXBlID0ganFwLmdldFR5cGUoKTsKKwkJU3RyaW5nIGRkVVJJID0gbnVsbDsKKwkJSVByb2plY3RGYWNldFZlcnNpb24gW10gaGlnaGVzdFByb2plY3RGYWNldFZlcnNpb24gPSBuZXcgSVByb2plY3RGYWNldFZlcnNpb24gWzJdOworCQlpbnQgW10gaGlnaGVzdEpRUFZlcnNpb24gPSBuZXcgaW50WzJdOworCQlpbnQgRUU2ID0gMDsKKwkJaW50IEVFNSA9IDE7CisJCXN3aXRjaChhcmNoaXZlVHlwZSl7CisJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkFQUExJQ0FUSU9OX1RZUEU6CisJCQlkZFVSSSA9IEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJOworCQkJaGlnaGVzdFByb2plY3RGYWNldFZlcnNpb25bRUU2XSA9IElKMkVFRmFjZXRDb25zdGFudHMuRU5URVJQUklTRV9BUFBMSUNBVElPTl82MDsKKwkJCWhpZ2hlc3RQcm9qZWN0RmFjZXRWZXJzaW9uW0VFNV0gPSBJSjJFRUZhY2V0Q29uc3RhbnRzLkVOVEVSUFJJU0VfQVBQTElDQVRJT05fNTA7CisJCQloaWdoZXN0SlFQVmVyc2lvbltFRTZdID0gSmF2YUVFUXVpY2tQZWVrLlZFUlNJT05fNl8wOworCQkJaGlnaGVzdEpRUFZlcnNpb25bRUU1XSA9IEphdmFFRVF1aWNrUGVlay5WRVJTSU9OXzVfMDsKKwkJCWJyZWFrOworCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9DTElFTlRfVFlQRToKKwkJCWRkVVJJID0gSjJFRUNvbnN0YW50cy5BUFBfQ0xJRU5UX0REX1VSSTsKKwkJCWhpZ2hlc3RQcm9qZWN0RmFjZXRWZXJzaW9uW0VFNl0gPSBJSjJFRUZhY2V0Q29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF82MDsKKwkJCWhpZ2hlc3RQcm9qZWN0RmFjZXRWZXJzaW9uW0VFNV0gPSBJSjJFRUZhY2V0Q29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF81MDsKKwkJCWhpZ2hlc3RKUVBWZXJzaW9uW0VFNl0gPSBKYXZhRUVRdWlja1BlZWsuVkVSU0lPTl82XzA7CisJCQloaWdoZXN0SlFQVmVyc2lvbltFRTVdID0gSmF2YUVFUXVpY2tQZWVrLlZFUlNJT05fNV8wOworCQkJYnJlYWs7CisJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkVKQl9UWVBFOgorCQkJZGRVUkkgPSBKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkk7CisJCQloaWdoZXN0UHJvamVjdEZhY2V0VmVyc2lvbltFRTZdID0gSUoyRUVGYWNldENvbnN0YW50cy5FSkJfMzE7CisJCQloaWdoZXN0UHJvamVjdEZhY2V0VmVyc2lvbltFRTVdID0gSUoyRUVGYWNldENvbnN0YW50cy5FSkJfMzA7CisJCQloaWdoZXN0SlFQVmVyc2lvbltFRTZdID0gSmF2YUVFUXVpY2tQZWVrLlZFUlNJT05fM18xOworCQkJaGlnaGVzdEpRUFZlcnNpb25bRUU1XSA9IEphdmFFRVF1aWNrUGVlay5WRVJTSU9OXzNfMDsKKwkJCWJyZWFrOworCQljYXNlIEphdmFFRVF1aWNrUGVlay5XRUJfVFlQRToKKwkJCWRkVVJJID0gSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJOworCQkJaGlnaGVzdFByb2plY3RGYWNldFZlcnNpb25bRUU2XSA9IElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfMzA7CisJCQloaWdoZXN0UHJvamVjdEZhY2V0VmVyc2lvbltFRTVdID0gSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQl8yNTsKKwkJCWhpZ2hlc3RKUVBWZXJzaW9uW0VFNl0gPSBKYXZhRUVRdWlja1BlZWsuVkVSU0lPTl8zXzA7CisJCQloaWdoZXN0SlFQVmVyc2lvbltFRTVdID0gSmF2YUVFUXVpY2tQZWVrLlZFUlNJT05fMl81OworCQkJYnJlYWs7CisJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkNPTk5FQ1RPUl9UWVBFOgorCQkJZGRVUkkgPSBKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkk7CisJCQloaWdoZXN0UHJvamVjdEZhY2V0VmVyc2lvbltFRTZdID0gSUoyRUVGYWNldENvbnN0YW50cy5KQ0FfMTY7CisJCQloaWdoZXN0SlFQVmVyc2lvbltFRTZdID0gSmF2YUVFUXVpY2tQZWVrLlZFUlNJT05fMV82OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4ganFwOworCQl9CisJCUlQYXRoIGRkUGF0aCA9IG5ldyBQYXRoKGRkVVJJKTsKKwkJaWYoYXJjaGl2ZS5jb250YWluc0FyY2hpdmVSZXNvdXJjZShkZFBhdGgpKXsKKwkJCXJldHVybiBqcXA7CisJCX0KKwkJCisJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FKTsKKwkJaWYoYXJjaGl2ZVR5cGUgPT0gSmF2YUVFUXVpY2tQZWVrLkNPTk5FQ1RPUl9UWVBFIHx8IHJ1bnRpbWUgPT0gbnVsbCB8fCBydW50aW1lLnN1cHBvcnRzKGhpZ2hlc3RQcm9qZWN0RmFjZXRWZXJzaW9uW0VFNl0pICl7CisJCQlyZXR1cm4gbmV3IEphdmFFRVF1aWNrUGVlayhqcXAuZ2V0VHlwZSgpLCBoaWdoZXN0SlFQVmVyc2lvbltFRTZdKTsKKwkJfSBlbHNlIGlmKHJ1bnRpbWUuc3VwcG9ydHMoaGlnaGVzdFByb2plY3RGYWNldFZlcnNpb25bRUU1XSkpeworCQkJcmV0dXJuIG5ldyBKYXZhRUVRdWlja1BlZWsoanFwLmdldFR5cGUoKSwgaGlnaGVzdEpRUFZlcnNpb25bRUU1XSk7CisJCX0gZWxzZXsKKwkJCXJldHVybiBqcXA7CisJCX0KKwl9CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCBkYzU3NTg5Li5iMzgwY2VjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMTIsMTcgKzEyLDE4IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLk1vZHVsZUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLkFyY2hpdmVXcmFwcGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51dGlsLmludGVybmFsLkphdmFFRVF1aWNrUGVlazsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GYWNldERhdGFNb2RlbE1hcDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKIAogLyoqCiAgKiBUaGlzIGRhdGFNb2RlbCBpcyBhIGNvbW1vbiBzdXBlciBjbGFzcyB1c2VkIHRvIGltcG9ydCBKMkVFIE1vZHVsZXMuCkBAIC0zNSw5ICszNiw5IEBACiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMgewogCiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7CiAJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChFWFRFTkRFRF9JTVBPUlRfRkFDVE9SWSk7CiAJCXJldHVybiBwcm9wZXJ0eU5hbWVzOwogCX0KIApAQCAtNDcsMzYgKzQ4LDQyIEBACiAJfQogCiAJLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlICNJQVJDSElWRV9XUkFQUEVSCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZUZpbGUgZ2V0TW9kdWxlRmlsZSgpIHsKLQkJcmV0dXJuIChNb2R1bGVGaWxlKSBnZXRBcmNoaXZlRmlsZSgpOwotCX0KLQkKLQkvKioKIAkgKiBVcGRhdGVzIHRoZSBKYXZhIEZhY2V0IFZlcnNpb24gc28gaXQgaXMgY29tcGxpYW50IHdpdGggdGhlIEphdmEgRUUgTW9kdWxlIHZlcnNpb24gCiAJICovCiAJcHJvdGVjdGVkIHZvaWQgdXBkYXRlSmF2YUZhY2V0VmVyc2lvbigpIHsKLQkJQXJjaGl2ZVdyYXBwZXIgd3JhcHBlciA9IGdldEFyY2hpdmVXcmFwcGVyKCk7Ci0JCWludCBqYXZhRUVWZXJzaW9uID0gd3JhcHBlci5nZXRKYXZhRUVRdWlja1BlZWsoKS5nZXRKYXZhRUVWZXJzaW9uKCk7CiAJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGphdmFGYWNldFZlcnNpb24gPSBudWxsOwotCQlzd2l0Y2ggKGphdmFFRVZlcnNpb24pewotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOgotCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOgotCQkJamF2YUZhY2V0VmVyc2lvbiA9IEphdmFGYWNldFV0aWxzLkpBVkFfMTM7Ci0JCQlicmVhazsKLQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDoKLQkJCWphdmFGYWNldFZlcnNpb24gPSBKYXZhRmFjZXRVdGlscy5KQVZBXzE0OwotCQkJYnJlYWs7Ci0JCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDoKLQkJCWphdmFGYWNldFZlcnNpb24gPSBKYXZhRmFjZXRVdGlscy5KQVZBXzUwOwotCQkJYnJlYWs7CisJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9SVU5USU1FKTsKKwkJaWYocnVudGltZSAhPSBudWxsKXsKKwkJCWlmKHJ1bnRpbWUuc3VwcG9ydHMoSmF2YUZhY2V0LlZFUlNJT05fMV82KSl7CisJCQkJamF2YUZhY2V0VmVyc2lvbiA9IEphdmFGYWNldC5WRVJTSU9OXzFfNjsKKwkJCX0gZWxzZSBpZihydW50aW1lLnN1cHBvcnRzKEphdmFGYWNldC5WRVJTSU9OXzFfNSkpeworCQkJCWphdmFGYWNldFZlcnNpb24gPSBKYXZhRmFjZXQuVkVSU0lPTl8xXzU7CisJCQl9IGVsc2UgeworCQkJCWphdmFGYWNldFZlcnNpb24gPSBKYXZhRmFjZXQuVkVSU0lPTl8xXzQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlKYXZhRUVRdWlja1BlZWsganFwID0gZ2V0SW50ZXJwcmV0ZWRTcGVjVmVyc2lvbihnZXRBcmNoaXZlV3JhcHBlcigpKTsKKwkJCWludCBqYXZhRUVWZXJzaW9uID0ganFwLmdldEphdmFFRVZlcnNpb24oKTsKKwkJCXN3aXRjaCAoamF2YUVFVmVyc2lvbil7CisJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOgorCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDoKKwkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQ6CisJCQkJamF2YUZhY2V0VmVyc2lvbiA9IEphdmFGYWNldC5WRVJTSU9OXzFfNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDoKKwkJCQlqYXZhRmFjZXRWZXJzaW9uID0gSmF2YUZhY2V0LlZFUlNJT05fMV81OworCQkJCWJyZWFrOworCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNl8wX0lEOgorCQkJCWphdmFGYWNldFZlcnNpb24gPSBKYXZhRmFjZXQuVkVSU0lPTl8xXzY7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAkJaWYoamF2YUZhY2V0VmVyc2lvbiAhPSBudWxsKXsKIAkJCUlEYXRhTW9kZWwgbW9kdWxlRE0gPSBtb2RlbC5nZXROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfSjJFRV9DT01QT05FTlRfQ1JFQVRJT04pOwogCQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBtb2R1bGVETS5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7CiAJCQlJRGF0YU1vZGVsIGphdmFGYWNldERhdGFNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbCggSjJFRVByb2plY3RVdGlsaXRpZXMuSkFWQSApOwogCQkJamF2YUZhY2V0RGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTiwgamF2YUZhY2V0VmVyc2lvbik7CisJCQl1cGRhdGVXb3JraW5nQ29weUZhY2V0VmVyc2lvbihtb2R1bGVETSwgamF2YUZhY2V0RGF0YU1vZGVsKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFySW1wb3J0QXNzaXN0YW50T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFVXRpbGl0eUphckltcG9ydEFzc2lzdGFudE9wZXJhdGlvbi5qYXZhCmluZGV4IDY0MWViNmEuLjQwY2Q5YTUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFySW1wb3J0QXNzaXN0YW50T3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRVV0aWxpdHlKYXJJbXBvcnRBc3Npc3RhbnRPcGVyYXRpb24uamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5BYnN0cmFjdE9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQYXRoVmFyaWFibGVNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKQEAgLTEwNiwxMSArMTA3LDI2IEBACiAKIAkJSVZpcnR1YWxDb21wb25lbnQgdXRpbGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudCh0YXJnZXRQcm9qZWN0LCBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5MSUJBUkNISVZFVFlQRSArIElQYXRoLlNFUEFSQVRPUiArIHV0aWxpdHlKYXJJRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7CiAKKwkJSVBhdGggdXJpTWFwcGluZ1BhdGggPSBudWxsOworCQlTdHJpbmcgdXJpID0gdXJpTWFwcGluZzsKKwkJU3RyaW5nIGRlcGxveVBhdGggPSBudWxsOworCQlpZih1cmlNYXBwaW5nICE9IG51bGwpIHsKKwkJCXVyaU1hcHBpbmdQYXRoID0gbmV3IFBhdGgodXJpTWFwcGluZyk7CisJCQl1cmkgPSB1cmlNYXBwaW5nUGF0aC5sYXN0U2VnbWVudCgpOworCQkJaWYodXJpTWFwcGluZ1BhdGguc2VnbWVudENvdW50KCkgPiAxKQorCQkJCWRlcGxveVBhdGggPSB1cmlNYXBwaW5nUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKKwkJfQorCQkKIAkJYWRkQXJjaGl2ZVByb2plY3RUb0VBUkRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgZWFyY29tcG9uZW50KTsKIAkJYWRkQXJjaGl2ZVByb2plY3RUb0VBUkRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHV0aWxjb21wb25lbnQpKTsKIAkJTWFwIHVyaU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXVyaU1hcC5wdXQodXRpbGNvbXBvbmVudCwgdXJpTWFwcGluZyk7CisJCXVyaU1hcC5wdXQodXRpbGNvbXBvbmVudCwgdXJpKTsKIAkJYWRkQXJjaGl2ZVByb2plY3RUb0VBUkRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCwgdXJpTWFwKTsKKwkJaWYoZGVwbG95UGF0aCAhPSBudWxsICYmIGRlcGxveVBhdGgubGVuZ3RoKCkgPiAwKSB7CisJCQlNYXAgZGVwbG95TWFwID0gbmV3IEhhc2hNYXAoKTsKKwkJCWRlcGxveU1hcC5wdXQodXRpbGNvbXBvbmVudCwgZGVwbG95UGF0aCk7CisJCQlhZGRBcmNoaXZlUHJvamVjdFRvRUFSRGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UU19ERVBMT1lfUEFUSF9NQVAsIGRlcGxveU1hcCk7CisJCX0KIAkJcmV0dXJuICBhZGRBcmNoaXZlUHJvamVjdFRvRUFSRGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwogCX0KIAkKQEAgLTE4MywxNSArMTk5LDIyIEBACiAKICAgICAgICAgaWYgKGxpbmtlZFBhdGhWYXJpYWJsZSA9PSBudWxsIHx8IGxpbmtlZFBhdGhWYXJpYWJsZS5sZW5ndGgoKSA9PSAwKQogICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXRoKGFyY2hpdmVGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjcmVhdGVMaW5rZWRQYXRoVmFyaWFibGUobGlua2VkUGF0aFZhcmlhYmxlLCBhcmNoaXZlRmlsZS5nZXRQYXJlbnRGaWxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXRoKGxpbmtlZFBhdGhWYXJpYWJsZSkuYXBwZW5kKGFyY2hpdmVGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgY3JlYXRlTGlua2VkUGF0aFZhcmlhYmxlKGxpbmtlZFBhdGhWYXJpYWJsZSwgYXJjaGl2ZUZpbGUuZ2V0UGFyZW50RmlsZSgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQYXRoKGxpbmtlZFBhdGhWYXJpYWJsZSkuYXBwZW5kKGFyY2hpdmVGaWxlLmdldE5hbWUoKSk7CiAgICAgfSAKICAgICAKICAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGZpbmRVbmlxdWVMb2NhdGlvbihTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHJvcG9zZWRQcm9qZWN0TmFtZSkgeyAKICAgICAJCiAgICAgCXJldHVybiBiYXNlTG9jYXRpb24gIT0gbnVsbCA/IChiYXNlTG9jYXRpb24gKyBGaWxlLnNlcGFyYXRvciArIHByb3Bvc2VkUHJvamVjdE5hbWUpIDogbnVsbDsKICAgICB9CisgICAgCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIG1rZGlycyhmaW5hbCBJRm9sZGVyIGZvbGRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgeworCQkJaWYgKGZvbGRlci5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJCQlta2RpcnMoKElGb2xkZXIpIGZvbGRlci5nZXRQYXJlbnQoKSk7CisJCQl9CisJCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOworCQl9CisJfQogCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggMzdlZTY4YS4uOGYzYmVhNCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFySW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMTYsMTEgKzE2LDEzIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9uczsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKYXZhVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LlV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwpAQCAtMjgsMzIgKzMwLDUyIEBACiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBKMkVFVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUFydGlmYWN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJSmF2YVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEoyRUVfVVRJTElUWV9KQVJfSU1QT1JUX0RNUF9JRCA9ICJqMmVlVXRpbGl0eUphckltcG9ydERhdGFNb2RlbFByb3ZpZGVyIjsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFX1VUSUxJVFlfSkFSX0lNUE9SVF9ETVBfSUQgPSAiajJlZVV0aWxpdHlKYXJJbXBvcnREYXRhTW9kZWxQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKIAorCUBPdmVycmlkZQogCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKIAkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CiAJCXByb3BlcnR5TmFtZXMuYWRkKEVBUl9QUk9KRUNUX05BTUUpOwogCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKIAl9CiAKLQlwcm90ZWN0ZWQgQXJjaGl2ZSBvcGVuQXJjaGl2ZShTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgaW50IGdldFR5cGUoKSB7CiAJCXJldHVybiAwOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7CiAJCXJldHVybiBuZXcgSjJFRVV0aWxpdHlKYXJJbXBvcnRPcGVyYXRpb25OZXcobW9kZWwpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBJRGF0YU1vZGVsIGNyZWF0ZUoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpIHsKIAkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKIAogCQlyZXR1cm4gSjJFRV9VVElMSVRZX0pBUl9JTVBPUlRfRE1QX0lEOwogCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgeworCQkgaWYgKEVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKKwkJCUxpc3QgbmVzdGVkTW9kZWxzID0gbmV3IEFycmF5TGlzdChtb2RlbC5nZXROZXN0ZWRNb2RlbHMoKSk7CisJCQlJRGF0YU1vZGVsIG5lc3RlZE1vZGVsID0gbnVsbDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkTW9kZWxzLnNpemUoKTsgaSsrKSB7CisJCQkJbmVzdGVkTW9kZWwgPSAoSURhdGFNb2RlbCkgbmVzdGVkTW9kZWxzLmdldChpKTsKKwkJCQl0cnkgeworCQkJCQluZXN0ZWRNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FLCBwcm9wZXJ0eVZhbHVlKTsKKwkJCQkJbmVzdGVkTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgdHJ1ZSk7CisJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSAKKwkJIHJldHVybiBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOworCX0KIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFySW1wb3J0T3BlcmF0aW9uTmV3LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFVXRpbGl0eUphckltcG9ydE9wZXJhdGlvbk5ldy5qYXZhCmluZGV4IGQxOWEwODIuLjMwMDYyOTggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFySW1wb3J0T3BlcmF0aW9uTmV3LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRVV0aWxpdHlKYXJJbXBvcnRPcGVyYXRpb25OZXcuamF2YQpAQCAtMTAsMTEgKzEwLDkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuc3RyYXRlZ3kuU2F2ZVN0cmF0ZWd5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuSjJFRUphdmFDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkoyRUVBcnRpZmFjdEltcG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuSjJFRUphdmFDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogCkBAIC0zMCwxMyArMjgsOSBAQAogCQlzdXBlcihkYXRhTW9kZWwpOwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBDb21wb25lbnRBcmNoaXZlU2F2ZUFkYXB0ZXIgZ2V0QXJjaGl2ZVNhdmVBZGFwdGVyKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQpewogCQlyZXR1cm4gbmV3IEoyRUVKYXZhQ29tcG9uZW50QXJjaGl2ZVNhdmVBZGFwdGVyKHZpcnR1YWxDb21wb25lbnQpOwogCX0KIAkKLQlwcm90ZWN0ZWQgU2F2ZVN0cmF0ZWd5IGNyZWF0ZVNhdmVTdHJhdGVneShJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50KSB7Ci0JCUoyRUVKYXZhQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCBzYXZlU3RyYXQgPSBuZXcgSjJFRUphdmFDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKHZpcnR1YWxDb21wb25lbnQpOwotCQlyZXR1cm4gc2F2ZVN0cmF0OwotCX0KLQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggOGY0MmQzMC4uYjViMTE1NSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0xMCwyMyArMTAsMjQgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQYXRoVmFyaWFibGVNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FQVJDcmVhdGlvblJlc291cmNlSGFuZGxlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkVBUkZhY2V0VXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CkBAIC00MywxMSArNDQsMTMgQEAKIAogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOworCXByaXZhdGUgU3RyaW5nIGxhc3RVc2VyUGF0aCA9IG51bGw7CiAKIAlwdWJsaWMgSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSB7CiAJCXN1cGVyKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCl7CiAJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwogCQlwcm9wZXJ0eU5hbWVzLmFkZChFQVJfUFJPSkVDVF9OQU1FKTsKQEAgLTY2LDYgKzY5LDcgQEAKIAkJcmV0dXJuIHByb3BlcnR5TmFtZXM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKIAogCQlib29sZWFuIG5vdGlmeSA9IHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7CkBAIC03OCwxMiArODIsNiBAQAogCQkJZWxzZQogCQkJCW1vZGVsLnNldFByb3BlcnR5KFVUSUxJVFlfSkFSX0xJU1QsIHByb3BlcnR5VmFsdWUpOwogCi0JCX0gZWxzZSBpZiAoUFJPSkVDVF9ST09ULmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlpZiAocHJvcGVydHlWYWx1ZSA9PSBudWxsIHx8ICgoU3RyaW5nKSBwcm9wZXJ0eVZhbHVlKS5sZW5ndGgoKSA9PSAwKQotCQkJCXNldEJvb2xlYW5Qcm9wZXJ0eShPVkVSUklERV9QUk9KRUNUX1JPT1QsIGZhbHNlKTsKLQkJCWVsc2UKLQkJCQlzZXRCb29sZWFuUHJvcGVydHkoT1ZFUlJJREVfUFJPSkVDVF9ST09ULCB0cnVlKTsKLQogCQl9IGVsc2UgaWYgKEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkNSRUFURV9QUk9KRUNULmVxdWFscyhwcm9wZXJ0eU5hbWUpICYmIGdldEJvb2xlYW5Qcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5DUkVBVEVfUFJPSkVDVCkpIHsKIAogCQkJc2V0Qm9vbGVhblByb3BlcnR5KExJTktfSU1QT1JULCBmYWxzZSk7CkBAIC0xMzQsNyArMTMyLDE2IEBACiAKIAogCQl9IGVsc2UgaWYgKEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLk9WRVJSSURFX1BST0pFQ1RfUk9PVC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUFJPSkVDVF9ST09ULCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOworCQkJCisJCQlpZihtb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoT1ZFUlJJREVfUFJPSkVDVF9ST09UKSl7CisJCQkJbW9kZWwuc2V0UHJvcGVydHkoUFJPSkVDVF9ST09ULCBsYXN0VXNlclBhdGgpOworCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFBST0pFQ1RfUk9PVCwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOworCQkJfWVsc2V7CisJCQkJbGFzdFVzZXJQYXRoID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9ST09UKTsKKwkJCQltb2RlbC5zZXRQcm9wZXJ0eShQUk9KRUNUX1JPT1QsIGdldERlZmF1bHRQcm9wZXJ0eShQUk9KRUNUX1JPT1QpKTsKKwkJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQUk9KRUNUX1JPT1QsIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKKwkJCX0KKwogCQl9IGVsc2UgaWYgKEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkNSRUFURV9MSU5LRURfUEFUSF9WQVJJQUJMRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewogCiAJCQlpZiAoaXNMaW5rZWRQYXRoVmFyaWFibGVJbnZhbGlkKCkpCkBAIC0xNTMsNyArMTYwLDcgQEAKIAkJCQlJUGF0aCBhdmFpbGFibGVKYXJzUGF0aCA9IG1hbmFnZXIuZ2V0VmFsdWUobGlua2VkUGF0aFZhcmlhYmxlKTsKIAkJCQlzZXRQcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5DUkVBVEVfTElOS0VEX1BBVEhfVkFSSUFCTEUsIEJvb2xlYW4udmFsdWVPZihhdmFpbGFibGVKYXJzUGF0aCAhPSBudWxsKSk7CiAKLQkJCQlTdHJpbmcgYXZhaWxhYmxlSmFyc1BhdGhTdHJpbmcgPSBhdmFpbGFibGVKYXJzUGF0aC50b09TU3RyaW5nKCk7CisJCQkJU3RyaW5nIGF2YWlsYWJsZUphcnNQYXRoU3RyaW5nID0gYXZhaWxhYmxlSmFyc1BhdGggPT0gbnVsbCA/IG51bGwgOmF2YWlsYWJsZUphcnNQYXRoLnRvT1NTdHJpbmcoKTsKIAkJCQlpZiAoYXZhaWxhYmxlSmFyc1BhdGhTdHJpbmcgIT0gbnVsbCAmJiBhdmFpbGFibGVKYXJzUGF0aFN0cmluZy5sZW5ndGgoKSA+IDApCiAJCQkJCXNldFByb3BlcnR5KEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkFWQUlMQUJMRV9KQVJTX0RJUkVDVE9SWSwgYXZhaWxhYmxlSmFyc1BhdGhTdHJpbmcpOwogCQkJfQpAQCAtMTY5LDYgKzE3Niw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLldUUE9wZXJhdGlvbkRhdGFNb2RlbCNiYXNpY0lzRW5hYmxlZChqYXZhLmxhbmcuU3RyaW5nKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYgKEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3ZpZGVyLkJJTkFSWV9JTVBPUlQuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKIAkJCXJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIuQ1JFQVRFX1BST0pFQ1QpIHx8IGdldEJvb2xlYW5Qcm9wZXJ0eShKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm92aWRlci5DUkVBVEVfTElOS0VEX1BST0pFQ1QpOwpAQCAtMjAzLDYgKzIxMSw3IEBACiAJCXJldHVybiAoY3JlYXRlUGF0aCAmJiAobGlua2VkUGF0aFZhcmlhYmxlID09IG51bGwgfHwgbGlua2VkUGF0aFZhcmlhYmxlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7IAogCQlyZXR1cm4gbmV3IEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbihtb2RlbCk7CiAJfQpAQCAtMjEyLDYgKzIyMSw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5hcHBsaWNhdGlvbi5vcGVyYXRpb25zLkoyRUVJbXBvcnREYXRhTW9kZWwjZ2V0RGVmYXVsdFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAoQ1JFQVRFX1BST0pFQ1QuZXF1YWxzKHByb3BlcnR5TmFtZSkpCiAJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwpAQCAtMjQxLDYgKzI1MSw3IEBACiAJCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCWlmIChFQVJfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CiAJCQlyZXR1cm4gRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yLmNyZWF0ZURlc2NyaXB0b3JzKGdldFZhbGlkUHJvamVjdE5hbWVzKCkpOwpAQCAtMjYzLDcgKzI3NCw3IEBACiAJCQlpZihwcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSkgewogCQkJCXRyeSB7CiAJCQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3RzW2ldKTsKLQkJCQlpZiAoZmFjZXRlZFByb2plY3QhPW51bGwgJiYgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KEVBUkZhY2V0VXRpbHMuRUFSX0ZBQ0VUKSkgeworCQkJCWlmIChmYWNldGVkUHJvamVjdCE9bnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoSUoyRUVGYWNldENvbnN0YW50cy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OX0ZBQ0VUKSkgewogCQkJCQlwcm9qZWN0c1dpdGhOYXR1cmUuYWRkKHByb2plY3RzW2ldLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7CiAJCQkJfQogCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewpAQCAtMjc1LDYgKzI4Niw3IEBACiAJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3ROYW1lc1dpdGhvdXRGb3J3YXJkU2xhc2goKFN0cmluZ1tdKSBwcm9qZWN0c1dpdGhOYXR1cmUudG9BcnJheShuZXcgU3RyaW5nW3Byb2plY3RzV2l0aE5hdHVyZS5zaXplKCldKSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAoRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSAvKiAmJiBpc1NldChFQVJfUFJPSkVDVF9OQU1FKSAqLykgewogCQkJU3RyaW5nIGVhclByb2plY3ROYW1lID0gZ2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSk7CkBAIC0zMTEsMTEgKzMyMywxNCBAQAogCX0KIAogCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVByb2plY3RSb290KCkgewotCQlpZiAoaXNQcm9wZXJ0eVNldChQUk9KRUNUX1JPT1QpICYmIGdldEJvb2xlYW5Qcm9wZXJ0eShPVkVSUklERV9QUk9KRUNUX1JPT1QpKSB7Ci0JCQlTdHJpbmcgbG9jID0gKFN0cmluZykgZ2V0UHJvcGVydHkoUFJPSkVDVF9ST09UKTsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxvYyk7Ci0JCQlpZiAoIWZpbGUuY2FuV3JpdGUoKSB8fCAhZmlsZS5pc0RpcmVjdG9yeSgpKQotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEoyRUVQbHVnaW4uUExVR0lOX0lELCAwLCBFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5KMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxfMCwgbnVsbCk7IAorCQlpZiAoZ2V0Qm9vbGVhblByb3BlcnR5KE9WRVJSSURFX1BST0pFQ1RfUk9PVCkpIHsKKwkJCVN0cmluZyBsb2MgPSAoU3RyaW5nKSBnZXRQcm9wZXJ0eShQUk9KRUNUX1JPT1QpOwkJCQorCQkJaWYgKG51bGwgIT0gbG9jKSB7CisJCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvYyk7CisJCQkJcmV0dXJuIHdvcmtzcGFjZS52YWxpZGF0ZVByb2plY3RMb2NhdGlvbihudWxsLCBwYXRoKTsKKwkJCX0KKwkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEoyRUVQbHVnaW4uUExVR0lOX0lELCAwLCBFQVJDcmVhdGlvblJlc291cmNlSGFuZGxlci5KMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxfMCwgbnVsbCk7CiAJCX0KIAkJcmV0dXJuIE9LX1NUQVRVUzsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9KMkVFVXRpbGl0eUphckxpc3RJbXBvcnRPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbi5qYXZhCmluZGV4IGJmNzAyMWYuLjQ3MjdhN2EgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0oyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbi5qYXZhCkBAIC0xNiw3ICsxNiw2IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwpAQCAtMjksNyArMjgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogCi1wdWJsaWMgY2xhc3MgSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0T3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb24gaW1wbGVtZW50cyBJVW5kb2FibGVPcGVyYXRpb24geworcHVibGljIGNsYXNzIEoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU1NJU1RBTlRfVElDS1MgPSA1OwogCkBAIC0zNyw2ICszNiw3IEBACiAJCXN1cGVyKG1vZGVsKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAogCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoSjJFRVBsdWdpbi5QTFVHSU5fSUQsIDAsIEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbl9VSV9JbXBvcnRfVXRpbGl0eV9KYXJzLCBudWxsKTsgIApAQCAtNDUsNyArNDUsNyBAQAogCQlpZiAodXRpbGl0eUphcnMgPT0gbnVsbCB8fCB1dGlsaXR5SmFycy5sZW5ndGggPT0gMCkKIAkJCXJldHVybiBKMkVFUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbl9UaGVyZV93ZXJlX25vX3V0aWxpdHlfamFyc19zZWxlY3RlZCwgbnVsbCk7CiAKLQkJbW9uaXRvci5iZWdpblRhc2soRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0T3BlcmF0aW9uX1VJX0ltcG9ydF9VdGlsaXR5X0phcnMsIHV0aWxpdHlKYXJzLmxlbmd0aCAqICgxICsgQVNTSVNUQU5UX1RJQ0tTKSk7IC8vJE5PTi1OTFMtMSQKKwkJbW9uaXRvci5iZWdpblRhc2soRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0T3BlcmF0aW9uX1VJX0ltcG9ydF9VdGlsaXR5X0phcnMsIHV0aWxpdHlKYXJzLmxlbmd0aCAqICgxICsgQVNTSVNUQU5UX1RJQ0tTKSk7IAogCiAvLwkJU3RyaW5nIGVhclByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSk7CiAvLwkJYm9vbGVhbiBpc0JpbmFyeSA9IG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5CSU5BUllfSU1QT1JUKTsKQEAgLTYyLDcgKzYyLDcgQEAKIAkJaWYodG9PdmVycmlkZVByb2plY3RSb290KQogCQkJcHJvamVjdFJvb3QgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX1JPT1QpOwogCQkKLQkJbW9uaXRvci5zdWJUYXNrKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLkoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydE9wZXJhdGlvbl9VSV9QcmVwYXJpbmdfdG9faW1wb3J0KTsgLy8kTk9OLU5MUy0xJAorCQltb25pdG9yLnN1YlRhc2soRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0T3BlcmF0aW9uX1VJX1ByZXBhcmluZ190b19pbXBvcnQpOyAKIAogCQlTdHJpbmcgYXNzb2NpYXRlZEVBUlByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVVdGlsaXR5SmFyTGlzdEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSk7CQkKIAkJCkBAIC0xMzIsMTAgKzEzMiwxMiBAQAogCQlyZXR1cm4gKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRVV0aWxpdHlKYXJMaXN0SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5MSU5LX0lNUE9SVCkgfHwgbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElKMkVFVXRpbGl0eUphckxpc3RJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9MSU5LRURfUFJPSkVDVCkpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdW5kbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9MaW5rQXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9MaW5rQXJjaGl2ZUludG9Qcm9qZWN0T3BlcmF0aW9uLmphdmEKaW5kZXggOGY3YmE5My4uZDM5MmJmZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvTGlua0FyY2hpdmVJbnRvUHJvamVjdE9wZXJhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL0xpbmtBcmNoaXZlSW50b1Byb2plY3RPcGVyYXRpb24uamF2YQpAQCAtMTQsMTggKzE0LDI0IEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRWFyVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIAogcHVibGljIGNsYXNzIExpbmtBcmNoaXZlSW50b1Byb2plY3RPcGVyYXRpb24gZXh0ZW5kcyBKMkVFVXRpbGl0eUphckltcG9ydEFzc2lzdGFudE9wZXJhdGlvbiB7CiAKQEAgLTM4LDEzICs0NCwzNCBAQAogCiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCU11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhKMkVFUGx1Z2luLlBMVUdJTl9JRCwgMCwgTkxTLmJpbmQoRUFSQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuTGlua0FyY2hpdmVJbnRvUHJvamVjdE9wZXJhdGlvbl9MaW5raW5nX2FyY2hpdmVfaW50b19zZWxlY3RlZF9wcm9qZV8sIGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCkpLCBudWxsKTsKIAogCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3QoZ2V0QXNzb2NpYXRlZEVBUlByb2plY3ROYW1lKCkpOwogCiAJCXRyeSB7Ci0JCQlJRmlsZSBsaW5rZWRKYXJGaWxlID0gcHJvamVjdC5nZXRGaWxlKGdldFV0aWxpdHlKYXIoKS5nZXROYW1lKCkpOworCQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7CisJCQlJQ29udGFpbmVyIHVuZGVybHlpbmdGb2xkZXIgPSBlYXJDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKKwkJCVN0cmluZyB1cmlNYXBwaW5nID0gZ2V0VXRpbGl0eUphcigpLmdldE5hbWUoKTsKKwkJCVN0cmluZyBlYXJMaWIgPSBFYXJVdGlsaXRpZXMuZ2V0RUFSTGliRGlyKGVhckNvbXBvbmVudCk7CisJCQlJRm9sZGVyIGxpYkRpckZvbGRlciA9IG51bGw7CisgCQkJaWYoZWFyTGliICE9IG51bGwgJiYgZWFyTGliLmxlbmd0aCgpID4gMCkgeworIAkJCQl1cmlNYXBwaW5nID0gKG5ldyBQYXRoKGVhckxpYikpLmFwcGVuZCh1cmlNYXBwaW5nKS50b1N0cmluZygpOworIAkJCQlpZih1bmRlcmx5aW5nRm9sZGVyLmlzQWNjZXNzaWJsZSgpKSB7CisgCQkJCQlsaWJEaXJGb2xkZXIgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0Rm9sZGVyKHVuZGVybHlpbmdGb2xkZXIuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoZWFyTGliKSk7CisgCQkJCX0gZWxzZSB7CisgCQkJCQlsaWJEaXJGb2xkZXIgPSBnZXRXb3Jrc3BhY2VSb290KCkuZ2V0Rm9sZGVyKHByb2plY3QuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoZWFyTGliKSk7CisgCQkJCX0KKyAJCQl9CisgCQkJCisgCQkJSUZpbGUgbGlua2VkSmFyRmlsZSA9IG51bGw7CisgCQkJaWYodW5kZXJseWluZ0ZvbGRlci5pc0FjY2Vzc2libGUoKSkgewkJCQkKKwkJCQlsaW5rZWRKYXJGaWxlID0gdW5kZXJseWluZ0ZvbGRlci5nZXRGaWxlKG5ldyBQYXRoKHVyaU1hcHBpbmcpKTsKKwkJCX0gZWxzZSB7CisJCQkJbGlua2VkSmFyRmlsZSA9IHByb2plY3QuZ2V0RmlsZSh1cmlNYXBwaW5nKTsKKwkJCX0KKyAJCQkKIAkJCWlmIChsaW5rZWRKYXJGaWxlLmV4aXN0cygpKSB7CiAJCQkJaWYgKGlzT3ZlcndyaXRlSWZOZWNlc3NhcnkoKSkKIAkJCQkJbGlua2VkSmFyRmlsZS5kZWxldGUodHJ1ZSwgdHJ1ZSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7CkBAIC01MywxMSArODAsMTcgQEAKIAkJCQkJcmV0dXJuIHN0YXR1czsKIAkJCQl9CiAJCQl9Ci0JCQlzdGF0dXMuYWRkKGNyZWF0ZUxpbmtlZEFyY2hpdmUocHJvamVjdCwgZ2V0VXRpbGl0eUphcigpLmdldE5hbWUoKSwgZ2V0VXRpbGl0eUphcigpLCBsaW5rZWRQYXRoVmFyaWFibGUsIG1vbml0b3IpKTsKKyAJCQkKKyAJCQkvLyBDcmVhdGUgRUFSJ3MgbGlicmFyeSBkaXJlY3RvcnkgZm9sZGVyIGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAJCQlpZihsaWJEaXJGb2xkZXIgIT0gbnVsbCAmJiAoIWxpYkRpckZvbGRlci5leGlzdHMoKSB8fCAhbGliRGlyRm9sZGVyLmlzQWNjZXNzaWJsZSgpKSkgeworIAkJCQlta2RpcnMobGliRGlyRm9sZGVyKTsKKyAJCQl9CisgCQkJCisJCQlzdGF0dXMuYWRkKGNyZWF0ZUxpbmtlZEFyY2hpdmUocHJvamVjdCwgbGlua2VkSmFyRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSwgZ2V0VXRpbGl0eUphcigpLCBsaW5rZWRQYXRoVmFyaWFibGUsIG1vbml0b3IpKTsKIAogCQkJYWRkTGlicmFyeVRvQ2xhc3NwYXRoKHByb2plY3QsIGxpbmtlZEphckZpbGUsIG1vbml0b3IpOwogCQkJCi0JCQljcmVhdGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudChwcm9qZWN0LCBnZXRVdGlsaXR5SmFyKCkuZ2V0TmFtZSgpLCBsaW5rZWRKYXJGaWxlLCBtb25pdG9yKTsKKwkJCWNyZWF0ZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KHByb2plY3QsIHVyaU1hcHBpbmcsIGxpbmtlZEphckZpbGUsIG1vbml0b3IpOwogCiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogCQkJc3RhdHVzLmFkZChKMkVFUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7CkBAIC02OSwxMCArMTAyLDEyIEBACiAJCXJldHVybiBzdGF0dXM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1JlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggODA2YzEyMy4uZDMxMzgyNCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIAkJc3VwZXIoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewogCQlyZXR1cm4gbmV3IFJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25PcGVyYXRpb24obW9kZWwpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1JlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25PcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1JlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25PcGVyYXRpb24uamF2YQppbmRleCBkNWJjOTNmLi43OThiMmI1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZW1vdmVDb21wb25lbnRGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uT3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbk9wZXJhdGlvbi5qYXZhCkBAIC0xOCwxMiArMTgsMjAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLkoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklFQVJNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcHBsaWNhdGlvbi5JQ29tbW9uQXBwbGljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcHBsaWNhdGlvbi5JQ29tbW9uTW9kdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLlJlbW92ZVJlZmVyZW5jZUNvbXBvbmVudE9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwpAQCAtMzYsNiArNDQsNyBAQAogCQlzdXBlcihtb2RlbCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5nZXRJbnN0YW5jZSgpLnBhdXNlVXBkYXRlcygpOwpAQCAtNTMsMzcgKzYyLDIwNCBAQAogCQkJcmV0dXJuOwogCQlKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5nZXRJbnN0YW5jZSgpLnF1ZXVlVXBkYXRlRUFSKGNvbXAuZ2V0UHJvamVjdCgpKTsKIAkJZmluYWwgSUVBUk1vZGVsUHJvdmlkZXIgZWFyTW9kZWwgPSAoSUVBUk1vZGVsUHJvdmlkZXIpTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihjb21wLmdldFByb2plY3QoKSk7Ci0JCWVhck1vZGVsLm1vZGlmeShuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSUNvbW1vbkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKElDb21tb25BcHBsaWNhdGlvbillYXJNb2RlbC5nZXRNb2RlbE9iamVjdCgpOwotCQkJCWlmIChhcHBsaWNhdGlvbiA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJTGlzdCBsaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQkJCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgd2MgPSAoSVZpcnR1YWxDb21wb25lbnQpIGxpc3QuZ2V0KGkpOwotCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlQ29tcG9uZW50ID0gd2MuZ2V0Q29tcG9uZW50KCk7Ci0JCQkJCQlpZighbW9kdWxlQ29tcG9uZW50LmlzQmluYXJ5KCkpewotCQkJCQkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGVNb2R1bGUobW9kdWxlQ29tcG9uZW50LmdldFByb2plY3QoKSk7CisJCVN0cnVjdHVyZUVkaXQgc2UgPSBudWxsOworCQl0cnkgeworCQkJc2UgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShjb21wLmdldFByb2plY3QoKSk7CisJCQlXb3JrYmVuY2hDb21wb25lbnQgZWFyd2MgPSBzZS5nZXRDb21wb25lbnQoKTsKKwkJCUxpc3QgbGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKKwkJCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CisJCQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHdjID0gKElWaXJ0dWFsQ29tcG9uZW50KSBsaXN0LmdldChpKTsKKwkJCQkJU3RydWN0dXJlRWRpdCBjb21wc2UgPSBudWxsOworCQkJCQl0cnkgeworCQkJCQkJY29tcHNlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUod2MuZ2V0UHJvamVjdCgpKTsKKwkJCQkJCWlmKGNvbXBzZSAhPSBudWxsKSB7CisJCQkJCQkJZmluYWwgUmVmZXJlbmNlZENvbXBvbmVudCByZWYgPSBBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbk9wLmZpbmRSZWZlcmVuY2VkQ29tcG9uZW50KGVhcndjLCB3Yywgc2UsIGNvbXBzZSk7CisJCQkJCQkJZWFyTW9kZWwubW9kaWZ5KG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJCQkJSUNvbW1vbkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKElDb21tb25BcHBsaWNhdGlvbillYXJNb2RlbC5nZXRNb2RlbE9iamVjdCgpOworCQkJCQkJCQkJaWYgKGFwcGxpY2F0aW9uID09IG51bGwpCisJCQkJCQkJCQkJcmV0dXJuOworCQkJCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlQ29tcG9uZW50ID0gd2MuZ2V0Q29tcG9uZW50KCk7CisJCQkJCQkJCQlpZighbW9kdWxlQ29tcG9uZW50LmlzQmluYXJ5KCkpeworCQkJCQkJCQkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGVNb2R1bGUobW9kdWxlQ29tcG9uZW50LmdldFByb2plY3QoKSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQkKKwkJCQkJCQkJCU9iamVjdCBtb2R1bGUgPSBudWxsOworCQkJCQkJCQkJU3RyaW5nIG1vZHVsZVVSSSA9IG51bGw7CisJCQkJCQkJCQlpZihyZWYgIT0gbnVsbCkgeworCQkJCQkJCQkJCW1vZHVsZSA9IGdldE1vZHVsZShlYXJNb2RlbCwgcmVmKTsKKwkJCQkJCQkJCQlpZihtb2R1bGUgIT0gbnVsbCl7CQkJCQkJCQkJCQorCQkJCQkJCQkJCQlpZihtb2R1bGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwpIHsKKwkJCQkJCQkJCQkJCW1vZHVsZVVSSSA9ICgob3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsKW1vZHVsZSkuZ2V0VXJpKCk7CisJCQkJCQkJCQkJCX0gZWxzZSBpZiAobW9kdWxlIGluc3RhbmNlb2YgTW9kdWxlSW1wbCkgeworCQkJCQkJCQkJCQkJbW9kdWxlVVJJID0gKChNb2R1bGVJbXBsKW1vZHVsZSkuZ2V0VXJpKCk7CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQkJCisJCQkJCQkJCQkJCWlmKG1vZHVsZVVSSSAhPSBudWxsKSB7CisJCQkJCQkJCQkJCQlpZighcmVtb3ZlTW9kdWxlKGFwcGxpY2F0aW9uLCBtb2R1bGUpKXsKKwkJCQkJCQkJCQkJCQltb2R1bGUgPSBudWxsOworCQkJCQkJCQkJCQkJCW1vZHVsZVVSSSA9IG51bGw7CisJCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCQkKKwkJCQkJCQkJCWlmKG1vZHVsZSA9PSBudWxsKSB7CisJCQkJCQkJCQkJaWYocmVmICE9IG51bGwgJiYgcmVmLmdldEFyY2hpdmVOYW1lKCkgIT0gbnVsbCkKKwkJCQkJCQkJCQkJbW9kdWxlID0gZ2V0TW9kdWxlRnJvbVVSSShlYXJNb2RlbCwgcmVmLmdldEFyY2hpdmVOYW1lKCkpOworCQkJCQkJCQkJCWVsc2UgeworCQkJCQkJCQkJCQlTdHJpbmcgdXJpID0gZ2V0TW9kdWxlVVJJKGVhck1vZGVsLCB3Yyk7CisJCQkJCQkJCQkJCW1vZHVsZSA9IGdldE1vZHVsZUZyb21VUkkoZWFyTW9kZWwsIHVyaSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCWlmKG1vZHVsZSAhPSBudWxsKSB7CisJCQkJCQkJCQkJCWlmKG1vZHVsZSBpbnN0YW5jZW9mIE1vZHVsZSkKKwkJCQkJCQkJCQkJCW1vZHVsZVVSSSA9ICgoTW9kdWxlKW1vZHVsZSkuZ2V0VXJpKCk7CisJCQkJCQkJCQkJCWVsc2UgaWYobW9kdWxlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsKQorCQkJCQkJCQkJCQkJbW9kdWxlVVJJID0gKChvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwpbW9kdWxlKS5nZXRVcmkoKTsKKwkJCQkJCQkJCQkJcmVtb3ZlTW9kdWxlKGFwcGxpY2F0aW9uLCBtb2R1bGUpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJCQorCQkJCQkJCQkJaWYobW9kdWxlVVJJICE9IG51bGwpeworCQkJCQkJCQkJCUlWaXJ0dWFsRmlsZSB2RmlsZSA9IGNvbXAuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUobW9kdWxlVVJJKTsKKwkJCQkJCQkJCQlJRmlsZSBpRmlsZSA9IHZGaWxlLmdldFVuZGVybHlpbmdGaWxlKCk7CisJCQkJCQkJCQkJaWYoaUZpbGUuZXhpc3RzKCkpeworCQkJCQkJCQkJCQl0cnkgeworCQkJCQkJCQkJCQkJaUZpbGUuZGVsZXRlKHRydWUsIG1vbml0b3IpOworCQkJCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CQorCQkJCQkJCQl9CisJCQkJCQkJfSwgbnVsbCk7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWVhck1vZGVsLm1vZGlmeShuZXcgUnVubmFibGUoKSB7CisJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCQkJCUlDb21tb25BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IChJQ29tbW9uQXBwbGljYXRpb24pZWFyTW9kZWwuZ2V0TW9kZWxPYmplY3QoKTsKKwkJCQkJCQkJCWlmIChhcHBsaWNhdGlvbiA9PSBudWxsKQorCQkJCQkJCQkJCXJldHVybjsKKwkJCQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZUNvbXBvbmVudCA9IHdjLmdldENvbXBvbmVudCgpOworCQkJCQkJCQkJaWYoIW1vZHVsZUNvbXBvbmVudC5pc0JpbmFyeSgpKXsKKwkJCQkJCQkJCQlKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5nZXRJbnN0YW5jZSgpLnF1ZXVlVXBkYXRlTW9kdWxlKG1vZHVsZUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOworCQkJCQkJCQkJfQorCisJCQkJCQkJCQlTdHJpbmcgbW9kdWxlVVJJID0gZ2V0TW9kdWxlVVJJKGVhck1vZGVsLCB3Yyk7CisJCQkJCQkJCQlPYmplY3QgbW9kdWxlID0gZ2V0TW9kdWxlRnJvbVVSSShlYXJNb2RlbCwgbW9kdWxlVVJJKTsKKwkJCQkJCQkJCWlmKG1vZHVsZSAhPSBudWxsKSB7CisJCQkJCQkJCQkJaWYobW9kdWxlIGluc3RhbmNlb2YgTW9kdWxlKQorCQkJCQkJCQkJCQltb2R1bGVVUkkgPSAoKE1vZHVsZSltb2R1bGUpLmdldFVyaSgpOworCQkJCQkJCQkJCWVsc2UgaWYobW9kdWxlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsKQorCQkJCQkJCQkJCQltb2R1bGVVUkkgPSAoKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTW9kdWxlSW1wbCltb2R1bGUpLmdldFVyaSgpOworCQkJCQkJCQkJCXJlbW92ZU1vZHVsZShhcHBsaWNhdGlvbiwgbW9kdWxlKTsKKwkJCQkJCQkJCX0KKwkJCQkJCQkJCQorCQkJCQkJCQkJaWYobW9kdWxlVVJJICE9IG51bGwpeworCQkJCQkJCQkJCUlWaXJ0dWFsRmlsZSB2RmlsZSA9IGNvbXAuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUobW9kdWxlVVJJKTsKKwkJCQkJCQkJCQlJRmlsZSBpRmlsZSA9IHZGaWxlLmdldFVuZGVybHlpbmdGaWxlKCk7CisJCQkJCQkJCQkJaWYoaUZpbGUuZXhpc3RzKCkpeworCQkJCQkJCQkJCQl0cnkgeworCQkJCQkJCQkJCQkJaUZpbGUuZGVsZXRlKHRydWUsIG1vbml0b3IpOworCQkJCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9LCBudWxsKTsKIAkJCQkJCX0KLQkJCQkJCVN0cmluZyBtb2R1bGVVUkkgPSBnZXRNb2R1bGVVUkkoZWFyTW9kZWwsIHdjKTsKLQkJCQkJCXJlbW92ZU1vZHVsZShhcHBsaWNhdGlvbiwgbW9kdWxlVVJJKTsgCi0JCQkJCQlJVmlydHVhbEZpbGUgdkZpbGUgPSBjb21wLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG1vZHVsZVVSSSk7Ci0JCQkJCQlJRmlsZSBpRmlsZSA9IHZGaWxlLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQkJCQlpZihpRmlsZS5leGlzdHMoKSl7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaUZpbGUuZGVsZXRlKHRydWUsIG1vbml0b3IpOwotCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQl9IGZpbmFsbHkgeworCQkJCQkJaWYgKGNvbXBzZSAhPSBudWxsKSB7CisJCQkJCQkJY29tcHNlLnNhdmVJZk5lY2Vzc2FyeShtb25pdG9yKTsKKwkJCQkJCQljb21wc2UuZGlzcG9zZSgpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChzZSAhPSBudWxsKSB7CisJCQkJc2Uuc2F2ZUlmTmVjZXNzYXJ5KG1vbml0b3IpOworCQkJCXNlLmRpc3Bvc2UoKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldE1vZHVsZShmaW5hbCBJRUFSTW9kZWxQcm92aWRlciBlYXJNb2RlbCwgZmluYWwgUmVmZXJlbmNlZENvbXBvbmVudCByZWZDb21wKSB7CisJCU9iamVjdCBhcHAgPSBlYXJNb2RlbC5nZXRNb2RlbE9iamVjdCgpOworCQlPYmplY3QgbW9kdWxlT2JqID0gcmVmQ29tcC5nZXREZXBlbmRlbnRPYmplY3QoKTsKKwkJaWYobW9kdWxlT2JqICE9IG51bGwpeworCQkJU3RyaW5nIGlkID0gbnVsbDsKKwkJCWlmKG1vZHVsZU9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTW9kdWxlSW1wbCkgeworCQkJCWlkID0gKChvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwpbW9kdWxlT2JqKS5nZXRJZCgpOworCQkJfSBlbHNlIGlmIChtb2R1bGVPYmogaW5zdGFuY2VvZiBNb2R1bGVJbXBsKSB7CisJCQkJaWQgPSAoKE1vZHVsZSltb2R1bGVPYmopLmdldElkKCk7CisJCQl9CisJCQlpZihpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDApIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCQlpZihhcHAgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbil7CisJCQlMaXN0PE1vZHVsZT4gbW9kdWxlcyA9ICgoQXBwbGljYXRpb24pYXBwKS5nZXRNb2R1bGVzKCk7CisJCQlpZihtb2R1bGVPYmogIT0gbnVsbCl7CisJCQkJZm9yIChNb2R1bGUgY3VyTW9kdWxlIDogbW9kdWxlcyApeworCQkJCQlpZihjdXJNb2R1bGUgIT0gbnVsbCAmJiBjdXJNb2R1bGUuZ2V0VXJpKCkgIT0gbnVsbCAmJiBjdXJNb2R1bGUuZ2V0SWQoKSAhPSBudWxsKSB7CisJCQkJCQlpZihtb2R1bGVPYmogaW5zdGFuY2VvZiBNb2R1bGVJbXBsICYmIGN1ck1vZHVsZS5nZXRJZCgpLmVxdWFscygoKE1vZHVsZSltb2R1bGVPYmopLmdldElkKCkpCisJCQkJCQkJCXx8IG1vZHVsZU9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTW9kdWxlSW1wbCAmJiBjdXJNb2R1bGUuZ2V0SWQoKS5lcXVhbHMoKChvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwpbW9kdWxlT2JqKS5nZXRJZCgpKSl7CisJCQkJCQkJcmV0dXJuIGN1ck1vZHVsZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIGlmIChhcHAgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbil7CisJCQlMaXN0PG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTW9kdWxlSW1wbD4gbW9kdWxlcyA9ICgob3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24pYXBwKS5nZXRNb2R1bGVzKCk7CisJCQlpZihtb2R1bGVPYmogIT0gbnVsbCl7CisJCQkJaWYobW9kdWxlT2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5Nb2R1bGVJbXBsKXsKKwkJCQkJZm9yIChvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwgY3VyTW9kdWxlIDogbW9kdWxlcyApeworCQkJCQkJaWYoY3VyTW9kdWxlICE9IG51bGwgJiYgY3VyTW9kdWxlLmdldFVyaSgpICE9IG51bGwgJiYgY3VyTW9kdWxlLmdldElkKCkgIT0gbnVsbCkgeworCQkJCQkJCWlmKG1vZHVsZU9iaiBpbnN0YW5jZW9mIE1vZHVsZUltcGwgJiYgY3VyTW9kdWxlLmdldElkKCkuZXF1YWxzKCgoTW9kdWxlKW1vZHVsZU9iaikuZ2V0SWQoKSkKKwkJCQkJCQkJCXx8IG1vZHVsZU9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuTW9kdWxlSW1wbCAmJiBjdXJNb2R1bGUuZ2V0SWQoKS5lcXVhbHMoKChvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwpbW9kdWxlT2JqKS5nZXRJZCgpKSl7CisJCQkJCQkJCXJldHVybiBjdXJNb2R1bGU7CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQl9CiAJCQkJfQotCQkJCiAJCQl9Ci0JCX0sIG51bGwpOworCQl9CisJCXJldHVybiBudWxsOwogCX0KIAkKKwlwcm90ZWN0ZWQgT2JqZWN0IGdldE1vZHVsZUZyb21VUkkoZmluYWwgSUVBUk1vZGVsUHJvdmlkZXIgZWFyTW9kZWwsIFN0cmluZyB1cmkpIHsKKwkJT2JqZWN0IGFwcCA9IGVhck1vZGVsLmdldE1vZGVsT2JqZWN0KCk7CisJCWlmKHVyaSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCVN0cmluZyBhcmNoaXZlTmFtZSA9IChuZXcgUGF0aCh1cmkpKS5sYXN0U2VnbWVudCgpOworCQlpZihhcHAgaW5zdGFuY2VvZiBBcHBsaWNhdGlvbil7CisJCQlMaXN0PE1vZHVsZT4gbW9kdWxlcyA9ICgoQXBwbGljYXRpb24pYXBwKS5nZXRNb2R1bGVzKCk7CisJCQlmb3IgKE1vZHVsZSBjdXJNb2R1bGUgOiBtb2R1bGVzICl7CisJCQkJaWYoY3VyTW9kdWxlICE9IG51bGwgJiYgY3VyTW9kdWxlLmdldFVyaSgpICE9IG51bGwpIHsKKwkJCQkJaWYobmV3IFBhdGgoY3VyTW9kdWxlLmdldFVyaSgpKS5sYXN0U2VnbWVudCgpLmVxdWFscyhhcmNoaXZlTmFtZSkpIHsKKwkJCQkJCXJldHVybiBjdXJNb2R1bGU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoYXBwIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24peworCQkJTGlzdDxvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGw+IG1vZHVsZXMgPSAoKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uKWFwcCkuZ2V0TW9kdWxlcygpOworCQkJZm9yIChvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLk1vZHVsZUltcGwgY3VyTW9kdWxlIDogbW9kdWxlcyApeworCQkJCWlmKGN1ck1vZHVsZSAhPSBudWxsICYmIGN1ck1vZHVsZS5nZXRVcmkoKSAhPSBudWxsKSB7CisJCQkJCWlmKG5ldyBQYXRoKGN1ck1vZHVsZS5nZXRVcmkoKSkubGFzdFNlZ21lbnQoKS5lcXVhbHMoYXJjaGl2ZU5hbWUpKSB7CisJCQkJCQlyZXR1cm4gY3VyTW9kdWxlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkJCQkJCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVVUkkoZmluYWwgSUVBUk1vZGVsUHJvdmlkZXIgZWFyTW9kdWxlLCBmaW5hbCBJVmlydHVhbENvbXBvbmVudCB0YXJnZXRDb21wb25lbnQpIHsKIAkJcmV0dXJuIGVhck1vZHVsZS5nZXRNb2R1bGVVUkkodGFyZ2V0Q29tcG9uZW50KTsKIAl9CkBAIC05Miw1ICsyNjgsOCBAQAogCQlJQ29tbW9uTW9kdWxlIG1vZHVsZSA9IGFwcGxpY2F0aW9uLmdldEZpcnN0RUFSTW9kdWxlKG1vZHVsZVVSSSk7CiAJCWFwcGxpY2F0aW9uLmdldEVBUk1vZHVsZXMoKS5yZW1vdmUobW9kdWxlKTsKIAl9Ci0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVNb2R1bGUoSUNvbW1vbkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBPYmplY3QgbW9kdWxlKSB7CisJCXJldHVybiBhcHBsaWNhdGlvbi5nZXRFQVJNb2R1bGVzKCkucmVtb3ZlKG1vZHVsZSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVtb3ZlUmVmZXJlbmNlRnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9SZW1vdmVSZWZlcmVuY2VGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODM5M2NlCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvUmVtb3ZlUmVmZXJlbmNlRnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOworCitwdWJsaWMgY2xhc3MgUmVtb3ZlUmVmZXJlbmNlRnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgUmVtb3ZlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7CisKKwlwdWJsaWMgUmVtb3ZlUmVmZXJlbmNlRnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgeworCQlzdXBlcigpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7CisJCXJldHVybiBuZXcgUmVtb3ZlUmVmZXJlbmNlRnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbk9wZXJhdGlvbihtb2RlbCk7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKKwkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CisJCXByb3BlcnR5TmFtZXMuYWRkKElBZGRSZWZlcmVuY2VEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9DT01QT05FTlQpOworCQlwcm9wZXJ0eU5hbWVzLmFkZChJQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfUkVGRVJFTkNFX0xJU1QpOworCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKKwl9CisKKwlwdWJsaWMgY2xhc3MgUmVtb3ZlUmVmZXJlbmNlRnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbk9wZXJhdGlvbiBleHRlbmRzIFJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25PcGVyYXRpb24geworCisJCXB1YmxpYyBSZW1vdmVSZWZlcmVuY2VGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKKwkJCXN1cGVyKG1vZGVsKTsKKwkJCXNldE1pc3NpbmdQcm9wZXJ0aWVzKCk7CisJCX0KKwkJCisJCXByb3RlY3RlZCB2b2lkIHNldE1pc3NpbmdQcm9wZXJ0aWVzKCkgeworCQkJTGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gcmVmcyA9IChMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiltb2RlbC5nZXRQcm9wZXJ0eShJQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfUkVGRVJFTkNFX0xJU1QpOworCQkJTGlzdDxJVmlydHVhbENvbXBvbmVudD4gY29tcExpc3QgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOworCQkJTWFwPElWaXJ0dWFsQ29tcG9uZW50LCBTdHJpbmc+IHVyaU1hcCA9IG5ldyBIYXNoTWFwPElWaXJ0dWFsQ29tcG9uZW50LCBTdHJpbmc+KCk7CisJCQlJVmlydHVhbFJlZmVyZW5jZSBjdXJyZW50UmVmOworCQkJZm9yKCBpbnQgaSA9IDA7IGkgPCByZWZzLnNpemUoKTsgaSsrICkgeworCQkJCWN1cnJlbnRSZWYgPSByZWZzLmdldChpKTsKKwkJCQljb21wTGlzdC5hZGQoY3VycmVudFJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOworCQkJCXVyaU1hcC5wdXQoY3VycmVudFJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCksIGN1cnJlbnRSZWYuZ2V0QXJjaGl2ZU5hbWUoKSk7CisJCQkJLy8gIFRoaXMgbWlnaHQgbm90IGJlIHRoZSBiZXN0IGxpbmUsIGJ1dCBzaW5jZSB0aGUgcGFyZW50IGNsYXNzIG9ubHkgaGFzIHJvb20gCisJCQkJLy8gZm9yIG9uZSBkZXBsb3kgcGF0aCBidXQgbXVsdGlwbGUgVVJJJ3MgdGhpcyBpcyBhIGRlZmljaWVuY3kgaW4gdGhlIHBhcmVudC4KKwkJCQkvLyBBIGZpeCB3b3VsZCBiZSB0byBjbG9uZSBBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbk9wIAorCQkJCS8vIGFuZCBtYWtlIGl0IGV4dGVuZCBBZGRSZWZlcmVuY2VzT3AKKwkJICAgICAgICBtb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgsIGN1cnJlbnRSZWYuZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpKTsKKwkJCX0KKwkJCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIGNvbXBMaXN0KTsKKwkJCW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBtb2RlbC5nZXRQcm9wZXJ0eShJQWRkUmVmZXJlbmNlRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5UKSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmluZGV4IDM2NTczYzUuLjc3MmY5YjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCkBAIC0xMCwzNyArMTAsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7CiAKLXB1YmxpYyBpbnRlcmZhY2UgVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkvKioKLQkgKiBQcm9qZWN0IG5hbWUgd2l0aCBtYW5pZmVzdCB0byB1cGRhdGUsIHR5cGUgU3RyaW5nIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJVcGRhdGVNYW5pZmVzdERhdGFNb2RlbC5QUk9KRUNUX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBqYXZhLnV0aWwuTGlzdCBvZiBTdHJpbmdzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0xJU1QgPSAiVXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuQ0xBU1NQQVRIX0xJU1QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdHJpbmcuIFRoaXMgaXMgYnVpbGQgZnJvbSB0aGUgSkFSX0xJU1QgcHJvcGVydHkuIE5ldmVyIHNldCB0aGlzIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9MSVNUX1RFWFRfVUkgPSAiVXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuQ0xBU1NQQVRIX0xJU1RfVEVYVF9VSSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEJvb2xlYW4sIHRydWUgbWVyZ2VzLCBmYWxzZSByZXBsYWNlcywgZGVmYXVsdCBpcyB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVSR0UgPSAiVXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuTUVSR0UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdHJpbmcsIG5vIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9DTEFTUyA9ICJVcGRhdGVNYW5pZmVzdERhdGFNb2RlbC5NQUlOX0NMQVNTIjsgLy8kTk9OLU5MUy0xJAotCQotCQkKLQkvKioKLQkgKiBTdHJpbmcsIG5vIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1RfRklMRSA9ICJVcGRhdGVNYW5pZmVzdERhdGFNb2RlbC5NQU5JRkVTVF9GSUxFIjsgLy8kTk9OLU5MUy0xJAkKLQkKLQorQERlcHJlY2F0ZWQKK3B1YmxpYyBpbnRlcmZhY2UgVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzIHsKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCBhNGQ1ZTBlLi5lMTM0NmE0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0xNiwxNSArMTYsNiBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnM7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKIAogLyoqCiAgKiBAYXV0aG9yIGpzaG9sbApAQCAtMzIsNjUgKzIzLDYgQEAKICAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwogICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCiAgKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0KLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChKQVJfTElTVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEpBUl9MSVNUX1RFWFRfVUkpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChNRVJHRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKE1BSU5fQ0xBU1MpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChNQU5JRkVTVF9GSUxFKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhNRVJHRSkpIHsKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKQVJfTElTVCkpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKQVJfTElTVF9URVhUX1VJKSkgewotCQkJcmV0dXJuIGdldENsYXNzcGF0aEFzU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWJvb2xlYW4gc2V0ID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSkFSX0xJU1QpICYmIGlzUHJvcGVydHlTZXQoSkFSX0xJU1RfVEVYVF9VSSkpCi0JCQlzZXRQcm9wZXJ0eShKQVJfTElTVF9URVhUX1VJLCBnZXRDbGFzc3BhdGhBc1N0cmluZygpKTsKLQkJcmV0dXJuIHNldDsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZykgZ2V0UHJvcGVydHkoUFJPSkVDVF9OQU1FKTsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc3BhdGhBc1N0cmluZygpIHsKLQkJTGlzdCBjbGFzc3BhdGhMaXN0ID0gKExpc3QpIGdldFByb3BlcnR5KEpBUl9MSVNUKTsKLQkJcmV0dXJuIGNvbnZlcnRDbGFzc3BhdGhMaXN0VG9TdHJpbmcoY2xhc3NwYXRoTGlzdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydENsYXNzcGF0aExpc3RUb1N0cmluZyhMaXN0IGxpc3QpIHsKLQkJU3RyaW5nIGNsYXNzcGF0aFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJY2xhc3NwYXRoU3RyaW5nICs9ICgoU3RyaW5nKSBsaXN0LmdldChpKSkgKyAiICI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY2xhc3NwYXRoU3RyaW5nLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgY29udmVydENsYXNzcGF0aFN0cmluZ1RvTGlzdChTdHJpbmcgc3RyaW5nKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyaW5nLCAiICIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlsaXN0LmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uKG1vZGVsKTsKLQl9CitARGVwcmVjYXRlZAorcHVibGljIGNsYXNzIFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5VcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3ZpZGVyIHsKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9VcGRhdGVNYW5pZmVzdE9wZXJhdGlvbi5qYXZhCmluZGV4IDdjMWZmMDQuLjkxNGYzZTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL2ludGVybmFsL29wZXJhdGlvbnMvVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24uamF2YQpAQCAtMTYsMTYgKzE2LDYgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKIAogCkBAIC0zNCw0NiArMjQsMTEgQEAKICAqIAogICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCiAgKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKKyAqIEBkZXByZWNhdGVkCiAgKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVNYW5pZmVzdE9wZXJhdGlvbiBleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQorcHVibGljIGNsYXNzIFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uIGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuVXBkYXRlTWFuaWZlc3RPcGVyYXRpb24geworCUBEZXByZWNhdGVkCiAJcHVibGljIFVwZGF0ZU1hbmlmZXN0T3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7CiAJCXN1cGVyKGRhdGFNb2RlbCk7CiAJfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgYWRhcHRhYmxlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IChJRmlsZSltb2RlbC5nZXRQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUFOSUZFU1RfRklMRSk7Ci0JCQotCQlTdHJpbmcgY2xhc3NQYXRoVmFsdWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuSkFSX0xJU1RfVEVYVF9VSSk7Ci0JCXRyeSB7Ci0JCQlBcmNoaXZlTWFuaWZlc3QgbWYgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5yZWFkTWFuaWZlc3QoZmlsZSk7Ci0JCQkKLQkJCWlmIChtZiA9PSBudWxsKQotCQkJCW1mID0gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoKTsKLQkJCW1mLmFkZFZlcnNpb25JZk5lY2Vzc2FyeSgpOwotCQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUVSR0UpKSB7Ci0JCQkJbWYubWVyZ2VDbGFzc1BhdGgoQXJjaGl2ZVV0aWwuZ2V0VG9rZW5zKGNsYXNzUGF0aFZhbHVlKSk7Ci0JCQl9IGVsc2UgewotCQkJCW1mLnNldENsYXNzUGF0aChjbGFzc1BhdGhWYWx1ZSk7Ci0JCQl9Ci0JCQlpZiAobW9kZWwuaXNQcm9wZXJ0eVNldChVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUFJTl9DTEFTUykpIHsKLQkJCQltZi5zZXRNYWluQ2xhc3MobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1BSU5fQ0xBU1MpKTsKLQkJCX0KLQotCQkJSjJFRVByb2plY3RVdGlsaXRpZXMud3JpdGVNYW5pZmVzdChmaWxlLCBtZik7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLGV4KTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vaW50ZXJuYWwvb3BlcmF0aW9ucy9VcGRhdGVNb2R1bGVDb250ZXh0Um9vdEluRUFST3AuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1vZHVsZUNvbnRleHRSb290SW5FQVJPcC5qYXZhCmluZGV4IGNmMTZiNTcuLjBjODA4OTcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1vZHVsZUNvbnRleHRSb290SW5FQVJPcC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi9pbnRlcm5hbC9vcGVyYXRpb25zL1VwZGF0ZU1vZHVsZUNvbnRleHRSb290SW5FQVJPcC5qYXZhCkBAIC0xNywxMSArMTcsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247CkBAIC00MCw5ICs0MCwxMCBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgZXhlY3V0ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIGlmKG1vbml0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIiIsIDEpOworICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soIiIsIDEpOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIHRyeSB7CkBAIC01OSw3ICs2MCw3IEBACiAgICAgICAgICAgICAJfQogICAgICAgICAJfQogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworICAgICAgICAJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKQEAgLTEwMCw2ICsxMDEsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jcmVkbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgcmVkbyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCS8vIG5vLW9wCiAJCXJldHVybiBudWxsOwpAQCAtMTA4LDYgKzExMCw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiN1bmRvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJLy8gbm8tb3AKIAkJcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS91dGlsL0VBUkFydGlmYWN0RWRpdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbXBvbmVudGNvcmUvdXRpbC9FQVJBcnRpZmFjdEVkaXQuamF2YQppbmRleCA4NmJmZDM3Li4yNTQxOTI0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS91dGlsL0VBUkFydGlmYWN0RWRpdC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL3V0aWwvRUFSQXJ0aWZhY3RFZGl0LmphdmEKQEAgLTY5LDcgKzY5LDcgQEAKIAogcHVibGljIGNsYXNzIEVBUkFydGlmYWN0RWRpdCBleHRlbmRzIEVudGVycHJpc2VBcnRpZmFjdEVkaXQgaW1wbGVtZW50cyBJQXJ0aWZhY3RFZGl0RmFjdG9yeSwgSUVBUk1vZGVsUHJvdmlkZXIgewogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9DT05URU5UX1RZUEUgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuZWFyREQiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfQ09OVEVOVF9UWVBFID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmVhckREIjsgLy8kTk9OLU5MUy0xJAogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzcyBBREFQVEVSX1RZUEUgPSBFQVJBcnRpZmFjdEVkaXQuY2xhc3M7CiAJCkBAIC0yNzMsNiArMjczLDcgQEAKIAkgKiBAcmV0dXJuIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgYSBKMkVFIFNwZWMgdmVyc2lvbgogCSAqIAogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBpbnQgZ2V0SjJFRVZlcnNpb24oKSB7CiAJCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwogCQlyZXR1cm4gZ2V0QXBwbGljYXRpb25YbWlSZXNvdXJjZSgpLmdldEoyRUVWZXJzaW9uSUQoKTsKQEAgLTMxMyw2ICszMTQsNyBAQAogCSAqIAogCSAqLwogCisJQE92ZXJyaWRlCiAJcHVibGljIFJlc291cmNlIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSB7CiAJCXZlcmlmeU9wZXJhdGlvblN1cHBvcnRlZCgpOwogCQlyZXR1cm4gZ2V0QXJ0aWZhY3RFZGl0TW9kZWwoKS5nZXRSZXNvdXJjZShKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSV9PQkopOwpAQCAtMzg5LDYgKzM5MSw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuRW50ZXJwcmlzZUFydGlmYWN0RWRpdCNjcmVhdGVNb2RlbFJvb3QoKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdCgpIHsKIAkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7CiAJCXJldHVybiBjcmVhdGVNb2RlbFJvb3QoZ2V0SjJFRVZlcnNpb24oKSk7CkBAIC0zOTksNiArNDAyLDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I2NyZWF0ZU1vZGVsUm9vdChqYXZhLmxhbmcuSW50ZWdlcikKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoaW50IHZlcnNpb24pIHsKIAkJdmVyaWZ5T3BlcmF0aW9uU3VwcG9ydGVkKCk7CiAJCUFwcGxpY2F0aW9uUmVzb3VyY2UgcmVzID0gKEFwcGxpY2F0aW9uUmVzb3VyY2UpIGdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKQEAgLTQzMyw3ICs0MzcsMTEgQEAKIAkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gbnVsbDsKIAkJZm9yIChJdGVyYXRvciByZWZlcmVuY2VJdHIgPSBpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IHJlZmVyZW5jZUl0ci5oYXNOZXh0KCk7ICkgewogCQkJcmVmZXJlbmNlID0gKElWaXJ0dWFsUmVmZXJlbmNlKSByZWZlcmVuY2VJdHIubmV4dCgpOwotCQkJbW9kdWxlID0gYXBwbGljYXRpb24uZ2V0Rmlyc3RNb2R1bGUocmVmZXJlbmNlLmdldEFyY2hpdmVOYW1lKCkpOworCQkJU3RyaW5nIHVyaSA9IHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpOworCQkJaWYodXJpICE9IG51bGwgJiYgcmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCkgIT0gbnVsbCkgeworCQkJCXVyaSA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLmFwcGVuZCh1cmkpLnRvU3RyaW5nKCk7CisJCQl9CisJCQltb2R1bGUgPSBhcHBsaWNhdGlvbi5nZXRGaXJzdE1vZHVsZSh1cmkpOwogCQkJaWYobW9kdWxlICE9IG51bGwpIAogCQkJCXJlZmVyZW5jZUl0ci5yZW1vdmUoKTsgCiAJCX0KQEAgLTQ1MiwxNCArNDYwLDEwIEBACiAJCUlWaXJ0dWFsUmVmZXJlbmNlIFtdIHJlZnMgPSBnZXRDb21wb25lbnQoKS5nZXRSZWZlcmVuY2VzKCk7CiAJCWZvcihpbnQgaT0wOyBpPHJlZnMubGVuZ3RoOyBpKyspewogCQkJaWYocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZXF1YWxzKG1vZHVsZUNvbXApKXsKLQkJCQlpZiAocmVmc1tpXS5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCIvIikpeworCQkJCWlmIChyZWZzW2ldLmdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKS5lcXVhbHMoIi8iKSl7IC8vJE5PTi1OTFMtMSQKIAkJCQkJcmV0dXJuIHJlZnNbaV0uZ2V0QXJjaGl2ZU5hbWUoKTsKIAkJCQl9Ci0JCQkJU3RyaW5nIHVyaSA9IHJlZnNbaV0uZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQocmVmc1tpXS5nZXRBcmNoaXZlTmFtZSgpKS50b1N0cmluZygpOwotCQkJCWlmKHVyaS5zdGFydHNXaXRoKCIvIikpewotCQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKDEpOwotCQkJCX0KLQkJCQlyZXR1cm4gdXJpOworCQkJCXJldHVybiByZWZzW2ldLmdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKHJlZnNbaV0uZ2V0QXJjaGl2ZU5hbWUoKSkudG9TdHJpbmcoKTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gbnVsbDsJCQpAQCAtNDg2LDcgKzQ5MCwxMSBAQAogCQlJVmlydHVhbFJlZmVyZW5jZSBbXSByZWZzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKIAogCQlmb3IoaW50IGk9MDtpPHJlZnMubGVuZ3RoOyBpKyspewotCQkJaWYodXJpLmVxdWFscyhyZWZzW2ldLmdldEFyY2hpdmVOYW1lKCkpKXsKKwkJCisJCQlpZihyZWZzW2ldLmdldFJ1bnRpbWVQYXRoKCkgIT0gbnVsbCAmJgorCQkJICAgcmVmc1tpXS5nZXRBcmNoaXZlTmFtZSgpICE9IG51bGwgJiYKKwkJCSAgIHVyaS5lcXVhbHMocmVmc1tpXS5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLmFwcGVuZChyZWZzW2ldLmdldEFyY2hpdmVOYW1lKCkpLnRvU3RyaW5nKCkpKXsKKwkJCQkKIAkJCQlyZXR1cm4gcmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CiAJCQl9CiAJCX0KQEAgLTUwNCwxMiArNTEyLDEzIEBACiAJcHVibGljIElWaXJ0dWFsQ29tcG9uZW50IGdldE1vZHVsZShTdHJpbmcgbW9kdWxlTmFtZSkgewogCQlpZiAobW9kdWxlTmFtZSA9PSBudWxsKQogCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChtb2R1bGVOYW1lLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQpIHx8IG1vZHVsZU5hbWUuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuV0FSX0VYVCkgfHwgbW9kdWxlTmFtZS5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhUKSkKLQkJCW1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lLnN1YnN0cmluZygwLCAobW9kdWxlTmFtZS5sZW5ndGgoKSAtIElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQubGVuZ3RoKCkpKTsKKwkJU3RyaW5nIGlubmVyTW9kdWxlTmFtZSA9IG1vZHVsZU5hbWU7CisJCWlmIChpbm5lck1vZHVsZU5hbWUuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVCkgfHwgaW5uZXJNb2R1bGVOYW1lLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLldBUl9FWFQpIHx8IGlubmVyTW9kdWxlTmFtZS5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhUKSkKKwkJCWlubmVyTW9kdWxlTmFtZSA9IGlubmVyTW9kdWxlTmFtZS5zdWJzdHJpbmcoMCwgKGlubmVyTW9kdWxlTmFtZS5sZW5ndGgoKSAtIElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQubGVuZ3RoKCkpKTsKIAkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlcygpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKIAkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IHJlZmVyZW5jZXNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJaWYgKGNvbXBvbmVudC5nZXROYW1lKCkuZXF1YWxzKG1vZHVsZU5hbWUpKSB7CisJCQlpZiAoY29tcG9uZW50LmdldE5hbWUoKS5lcXVhbHMoaW5uZXJNb2R1bGVOYW1lKSkgewogCQkJCXJldHVybiBjb21wb25lbnQ7CiAJCQl9CiAJCX0KQEAgLTU4NywxMCArNTk2LDEyIEBACiAJCXJldHVybiBnZXRFQVJBcnRpZmFjdEVkaXRGb3JXcml0ZShhQ29tcG9uZW50KTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQXJjaGl2ZSBhc0FyY2hpdmUoYm9vbGVhbiBpbmNsdWRlU291cmNlKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewogCQlyZXR1cm4gYXNBcmNoaXZlKGluY2x1ZGVTb3VyY2UsIHRydWUpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQXJjaGl2ZSBhc0FyY2hpdmUoYm9vbGVhbiBpbmNsdWRlU291cmNlLCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewogCQlyZXR1cm4gYXNBcmNoaXZlKGluY2x1ZGVTb3VyY2UsIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzLCBmYWxzZSk7CiAJfQpAQCAtNjU4LDE2ICs2NjksMTkgQEAKIAkJCQl3ZWJNb2R1bGUuc2V0Q29udGV4dFJvb3QoYUNvbnRleHRSb290KTsKIAkJfQogCX0KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIChJTW9kZWxQcm92aWRlcilnZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2plY3QpOworCQlyZXR1cm4gZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qZWN0KTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlyZXR1cm4gKElNb2RlbFByb3ZpZGVyKWdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKKwkJcmV0dXJuIGdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKIAl9CiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5FbnRlcnByaXNlQXJ0aWZhY3RFZGl0I21vZGlmeShqYXZhLmxhbmcuUnVubmFibGUsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBtb2RpZnkoUnVubmFibGUgcnVubmFibGUsIElQYXRoIG1vZGVsUGF0aCkgewogCQlzZXRXcml0YWJsZUVkaXQoZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZ2V0UHJvamVjdCgpKSk7CiAJCXRyeSB7CkBAIC02ODQsOSArNjk4LDExIEBACiAJfQogCiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZURlc2NyaWJlcigpIHsKIAkJcmV0dXJuIEVBUl9DT05URU5UX1RZUEU7CiAJfQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBVUkkgZ2V0Um9vdFVSSSgpIHsKIAkJcmV0dXJuIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJX09CSjsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS91dGlsL0VBUlZpcnR1YWxDb21wb25lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL3V0aWwvRUFSVmlydHVhbENvbXBvbmVudC5qYXZhCmluZGV4IGY4ODhlNGMuLmY4ODQ4OTIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL3V0aWwvRUFSVmlydHVhbENvbXBvbmVudC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL3V0aWwvRUFSVmlydHVhbENvbXBvbmVudC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMywgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDQwICsxMSw1NCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuSUNsYXNzcGF0aERlcGVuZGVuY3lSZWNlaXZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5qYXZhbGl0ZS5KYXZhQ29yZUxpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5JQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5EZXBlbmRlbmN5QXR0cmlidXRlVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFRGVwZW5kZW5jeUxpc3RlbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aEluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXBwbGljYXRpb24uSUNvbW1vbk1vZHVsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLklEZXBlbmRlbmN5R3JhcGg7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JQ29tcG9uZW50SW1wbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuVmlydHVhbFJlZmVyZW5jZVV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7CiAKLXB1YmxpYyBjbGFzcyBFQVJWaXJ0dWFsQ29tcG9uZW50IGV4dGVuZHMgVmlydHVhbENvbXBvbmVudCBpbXBsZW1lbnRzIElDb21wb25lbnRJbXBsRmFjdG9yeSB7Ci0JCitwdWJsaWMgY2xhc3MgRUFSVmlydHVhbENvbXBvbmVudCBleHRlbmRzIFZpcnR1YWxDb21wb25lbnQgaW1wbGVtZW50cyBJQ29tcG9uZW50SW1wbEZhY3RvcnksIElDbGFzc3BhdGhEZXBlbmRlbmN5UmVjZWl2ZXIgeworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFtdIEVYVEVOU0lPTlNfVE9fSUdOT1JFID0gbmV3IFN0cmluZyBbXSB7SUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVCwgIi56aXAiLCBJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhULCBJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUIH07ICAvLyROT04tTkxTLTEkCisKIAlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlW10gY2FjaGVkUmVmZXJlbmNlczsKIAlwcml2YXRlIGxvbmcgZGVwR3JhcGhNb2RTdGFtcDsKKwlwcml2YXRlIGxvbmcgamVlTW9kU3RhbXA7CiAJCiAJcHVibGljIEVBUlZpcnR1YWxDb21wb25lbnQoKSB7CiAJCXN1cGVyKCk7CkBAIC02MSw3OSArNzUsNDAgQEAKIAlwdWJsaWMgSVZpcnR1YWxDb21wb25lbnQgY3JlYXRlQ29tcG9uZW50KElQcm9qZWN0IGFQcm9qZWN0KSB7CiAJCXJldHVybiBuZXcgRUFSVmlydHVhbENvbXBvbmVudChhUHJvamVjdCwgbmV3IFBhdGgoIi8iKSk7IC8vJE5PTi1OTFMtMSQKIAl9Ci0JCisKIAlwdWJsaWMgSVZpcnR1YWxGb2xkZXIgY3JlYXRlRm9sZGVyKElQcm9qZWN0IGFQcm9qZWN0LCBJUGF0aCBhUnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIG5ldyBFQVJWaXJ0dWFsUm9vdEZvbGRlcihhUHJvamVjdCwgYVJ1bnRpbWVQYXRoKTsKKwkJcmV0dXJuIG5ldyBWaXJ0dWFsRm9sZGVyKGFQcm9qZWN0LCBhUnVudGltZVBhdGgpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRKYXJVUkkoZmluYWwgUmVmZXJlbmNlZENvbXBvbmVudCByZWYsIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZUNvbXApIHsKLQkJU3RyaW5nIHVyaSA9IHJlZi5nZXRBcmNoaXZlTmFtZSgpOwotCQlpZiAodXJpID09IG51bGwgfHwgdXJpLmxlbmd0aCgpIDwgMCkgewotCQkJaWYobW9kdWxlQ29tcC5pc0JpbmFyeSgpKXsKLQkJCQl1cmkgPSBuZXcgUGF0aChtb2R1bGVDb21wLmdldE5hbWUoKSkubGFzdFNlZ21lbnQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXJpID0gbW9kdWxlQ29tcC5nZXROYW1lKCkgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3RyaW5nIHByZWZpeCA9IHJlZi5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQlpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCXVyaSA9IHByZWZpeCArICIvIiArIHVyaTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7CisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQ2FjaGVSZWZlcmVuY2VzKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHJpdmF0ZSBMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiBnZXRIYXJkUmVmZXJlbmNlcyhJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQpIHsKKwkJSVZpcnR1YWxSZWZlcmVuY2VbXSBjb21wYXJpc29uID0gc3VwZXIuZ2V0UmVmZXJlbmNlcyhuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSk7CisJCUFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gcmVmczIgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPigpOworCQlyZWZzMi5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb21wYXJpc29uKSk7CisJCXJldHVybiByZWZzMjsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldEhhcmRSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCkgewotCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwotCQlMaXN0IGhhcmRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJY29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQlpZiAoY29yZSAhPSBudWxsICYmIGNvcmUuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkgewotCQkJCVdvcmtiZW5jaENvbXBvbmVudCBjb21wb25lbnQgPSBjb3JlLmdldENvbXBvbmVudCgpOwotCQkJCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCQkJCQlMaXN0IHJlZmVyZW5jZWRDb21wb25lbnRzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZWRDb21wb25lbnRzKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZWRDb21wb25lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWZlcmVuY2VkQ29tcG9uZW50ID0gKFJlZmVyZW5jZWRDb21wb25lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKHJlZmVyZW5jZWRDb21wb25lbnQgPT0gbnVsbCkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHZSZWZlcmVuY2UgPSBTdHJ1Y3R1cmVFZGl0LmNyZWF0ZVZpcnR1YWxSZWZlcmVuY2UoZWFyQ29tcG9uZW50LCByZWZlcmVuY2VkQ29tcG9uZW50KTsKLQkJCQkJCWlmICh2UmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJCQlJVmlydHVhbENvbXBvbmVudCByZWZlcmVuY2VkSVZpcnR1YWxDb21wb25lbnQgPSB2UmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCQlpZiAocmVmZXJlbmNlZElWaXJ0dWFsQ29tcG9uZW50ICE9IG51bGwgJiYgcmVmZXJlbmNlZElWaXJ0dWFsQ29tcG9uZW50LmV4aXN0cygpKSB7Ci0JCQkJCQkJCVN0cmluZyBhcmNoaXZlTmFtZSA9IG51bGw7Ci0JCQkJCQkJCWlmKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0QXJjaGl2ZU5hbWUoKSAhPSBudWxsKXsKLQkJCQkJCQkJCWFyY2hpdmVOYW1lID0gcmVmZXJlbmNlZENvbXBvbmVudC5nZXRBcmNoaXZlTmFtZSgpOwotCQkJCQkJCQkJfSBlbHNlIGlmIChyZWZlcmVuY2VkQ29tcG9uZW50LmdldERlcGVuZGVudE9iamVjdCgpICE9IG51bGwpIHsKLQkJCQkJCQkJCQlhcmNoaXZlTmFtZSA9ICgoSUNvbW1vbk1vZHVsZSkgcmVmZXJlbmNlZENvbXBvbmVudC5nZXREZXBlbmRlbnRPYmplY3QoKSkuZ2V0VXJpKCk7Ci0JCQkJCQkJCQl9ZWxzZSB7Ci0JCQkJCQkJCQkJSVByb2plY3QgcmVmZXJlbmNlZFByb2plY3QgPSByZWZlcmVuY2VkSVZpcnR1YWxDb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQkJCS8vIElmIGFyY2hpdmUgbmFtZSBpcyBub3Qgc2V0LCBhc3N1bWUKLQkJCQkJCQkJCQkvLyBjb21wbmFtZSBpcyBtb2R1bGUgbmFtZSArIHByb3BlcgotCQkJCQkJCQkJCS8vIGV4dGVuc2lvbgotCQkJCQkJCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocmVmZXJlbmNlZFByb2plY3QpIHx8IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzU3RhdGljV2ViUHJvamVjdChyZWZlcmVuY2VkUHJvamVjdCkpIHsKLQkJCQkJCQkJCQkJYXJjaGl2ZU5hbWUgPSByZWZlcmVuY2VkSVZpcnR1YWxDb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCkgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUOwotCQkJCQkJCQkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QocmVmZXJlbmNlZFByb2plY3QpKSB7Ci0JCQkJCQkJCQkJCWFyY2hpdmVOYW1lID0gcmVmZXJlbmNlZElWaXJ0dWFsQ29tcG9uZW50LmdldE5hbWUoKSArIElKMkVFTW9kdWxlQ29uc3RhbnRzLlJBUl9FWFQ7Ci0JCQkJCQkJCQkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QocmVmZXJlbmNlZFByb2plY3QpIHx8IHJlZmVyZW5jZWRJVmlydHVhbENvbXBvbmVudC5pc0JpbmFyeSgpKSB7Ci0JCQkJCQkJCQkJCWFyY2hpdmVOYW1lID0gZ2V0SmFyVVJJKHJlZmVyZW5jZWRDb21wb25lbnQsIHJlZmVyZW5jZWRJVmlydHVhbENvbXBvbmVudCk7Ci0JCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQkJYXJjaGl2ZU5hbWUgPSByZWZlcmVuY2VkSVZpcnR1YWxDb21wb25lbnQuZ2V0TmFtZSgpICsgSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVDsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQotCQkJCQkJCQl2UmVmZXJlbmNlLnNldEFyY2hpdmVOYW1lKGFyY2hpdmVOYW1lKTsKLQkJCQkJCQkJaGFyZFJlZmVyZW5jZXMuYWRkKHZSZWZlcmVuY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjdXN0b21pemVDcmVhdGVkUmVmZXJlbmNlKElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IHJlZmVyZW5jZUNvbXBvbmVudCkgeworCQlpZiggcmVmZXJlbmNlQ29tcG9uZW50IGluc3RhbmNlb2YgUmVmZXJlbmNlZENvbXBvbmVudCApCisJCXsKKwkJCWlmICgoKFJlZmVyZW5jZWRDb21wb25lbnQpIHJlZmVyZW5jZUNvbXBvbmVudCkuZ2V0QXJjaGl2ZU5hbWUoKSAhPSBudWxsKQorCQkJeworCQkJCXJlZmVyZW5jZS5zZXRBcmNoaXZlTmFtZSgoKFJlZmVyZW5jZWRDb21wb25lbnQpIHJlZmVyZW5jZUNvbXBvbmVudCkuZ2V0QXJjaGl2ZU5hbWUoKSk7CiAJCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoY29yZSAhPSBudWxsKQotCQkJCWNvcmUuZGlzcG9zZSgpOworCQkJZWxzZQorCQkJeworCQkJCXJlZmVyZW5jZS5zZXRBcmNoaXZlTmFtZShWaXJ0dWFsUmVmZXJlbmNlVXRpbGl0aWVzLklOU1RBTkNFLmdldERlZmF1bHRBcmNoaXZlTmFtZShyZWZlcmVuY2UpKTsKKwkJCX0KKwkJfWVsc2UgeyAKKwkJCQlWaXJ0dWFsUmVmZXJlbmNlVXRpbGl0aWVzLklOU1RBTkNFLmVuc3VyZVJlZmVyZW5jZXNIYXZlTmFtZXMobmV3IElWaXJ0dWFsUmVmZXJlbmNlW117cmVmZXJlbmNlfSk7CiAJCX0KLQkJcmV0dXJuIGhhcmRSZWZlcmVuY2VzOwogCX0KKwogCQogCS8qKgogCSAqIFJldHVybnMgdGhlIHJlc3VsdGluZyBsaXN0IG9mIHJlZmVyZW5jZWQgY29tcG9uZW50cyBiYXNlZCBvZmYgdGhlIGhhcmQgcmVmZXJlbmNlcyBhbmQgYXJjaGl2ZXMgbWFwcGluZyB0byB0aGUgcm9vdCBmb2xkZXIuCkBAIC0xNDQsNiArMTE5LDEwIEBACiAJICogQHJldHVybgogCSAqLwogCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0TG9vc2VBcmNoaXZlUmVmZXJlbmNlcyhFQVJWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCwgTGlzdCBoYXJkUmVmZXJlbmNlcykgeworCQlyZXR1cm4gIGdldExvb3NlQXJjaGl2ZVJlZmVyZW5jZXMoZWFyQ29tcG9uZW50LCBoYXJkUmVmZXJlbmNlcywgbnVsbCwgZWFyQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0TG9vc2VBcmNoaXZlUmVmZXJlbmNlcyhFQVJWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCwgTGlzdCBoYXJkUmVmZXJlbmNlcywgTGlzdCBkeW5hbWljUmVmZXJlbmNlcywgSVZpcnR1YWxGb2xkZXIgZm9sZGVyKSB7CiAJCU1hcDxFQVJWaXJ0dWFsQ29tcG9uZW50LCBMaXN0PiBjYWNoZSA9IEoyRUVDb21wb25lbnRDbGFzc3BhdGhJbml0aWFsaXplci5nZXRMb29zZUNvbmZpZ0NhY2hlKCk7CiAJCWlmIChjYWNoZSAhPSBudWxsKSB7CiAJCQlMaXN0IGxpc3QgPSBjYWNoZS5nZXQoZWFyQ29tcG9uZW50KTsKQEAgLTE1MSw1MCArMTMwLDYyIEBACiAJCQkJcmV0dXJuIGxpc3Q7CiAJCQl9CiAJCX0KLQkJTGlzdCBsaXN0ID0gZ2V0TG9vc2VBcmNoaXZlUmVmZXJlbmNlcyhlYXJDb21wb25lbnQsIGhhcmRSZWZlcmVuY2VzLCBudWxsLCAoRUFSVmlydHVhbFJvb3RGb2xkZXIpIGVhckNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkpOworCQlMaXN0IGxpc3QgPSBnZXRMb29zZUFyY2hpdmVSZWZlcmVuY2VzMihlYXJDb21wb25lbnQsIGhhcmRSZWZlcmVuY2VzLCBudWxsLCBmb2xkZXIpOwogCQlpZiAoY2FjaGUgIT0gbnVsbCkgewogCQkJY2FjaGUucHV0KGVhckNvbXBvbmVudCwgbGlzdCk7CiAJCX0KIAkJcmV0dXJuIGxpc3Q7Ci0JfQorCX0JCiAJCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRMb29zZUFyY2hpdmVSZWZlcmVuY2VzKEVBUlZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBMaXN0IGhhcmRSZWZlcmVuY2VzLCBMaXN0IGR5bmFtaWNSZWZlcmVuY2VzLCBFQVJWaXJ0dWFsUm9vdEZvbGRlciBmb2xkZXIpIHsKKwlwcml2YXRlIHN0YXRpYyBMaXN0IGdldExvb3NlQXJjaGl2ZVJlZmVyZW5jZXMyKEVBUlZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBMaXN0IGhhcmRSZWZlcmVuY2VzLCBMaXN0IGR5bmFtaWNSZWZlcmVuY2VzLCBJVmlydHVhbEZvbGRlciBmb2xkZXIpIHsKKwkJTGlzdCBpbm5lckR5bmFtaWNSZWZlcmVuY2VzID0gZHluYW1pY1JlZmVyZW5jZXM7CiAJCXRyeSB7Ci0JCQlJVmlydHVhbFJlc291cmNlW10gbWVtYmVycyA9IGZvbGRlci5zdXBlck1lbWJlcnMoKTsKKwkJCUlWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzID0gZm9sZGVyLm1lbWJlcnMoKTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewogCQkJCWlmIChJVmlydHVhbFJlc291cmNlLkZJTEUgPT0gbWVtYmVyc1tpXS5nZXRUeXBlKCkpIHsKLQkJCQkJaWYoZm9sZGVyLmlzRHluYW1pY0NvbXBvbmVudCgoSVZpcnR1YWxGaWxlKW1lbWJlcnNbaV0pKXsKLQkJCQkJCVN0cmluZyBhcmNoaXZlTmFtZSA9IG1lbWJlcnNbaV0uZ2V0UnVudGltZVBhdGgoKS50b1N0cmluZygpLnN1YnN0cmluZygxKTsKKwkJCQkJaWYoaXNEeW5hbWljQ29tcG9uZW50KChJVmlydHVhbEZpbGUpbWVtYmVyc1tpXSkpeworCQkJCQkJSVBhdGggYXJjaGl2ZUZ1bGxQYXRoID0gbmV3IFBhdGgobWVtYmVyc1tpXS5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCkpOwogCQkJCQkJYm9vbGVhbiBzaG91bGRJbmNsdWRlID0gdHJ1ZTsKIAkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaGFyZFJlZmVyZW5jZXMuc2l6ZSgpICYmIHNob3VsZEluY2x1ZGU7IGorKykgewotCQkJCQkJCVN0cmluZyB0ZW1wQXJjaGl2ZU5hbWUgPSAoKElWaXJ0dWFsUmVmZXJlbmNlKSBoYXJkUmVmZXJlbmNlcy5nZXQoaikpLmdldEFyY2hpdmVOYW1lKCk7Ci0JCQkJCQkJaWYgKG51bGwgIT0gdGVtcEFyY2hpdmVOYW1lICYmIHRlbXBBcmNoaXZlTmFtZS5lcXVhbHMoYXJjaGl2ZU5hbWUpKSB7CisJCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgdG1wUmVmID0gKChJVmlydHVhbFJlZmVyZW5jZSkgaGFyZFJlZmVyZW5jZXMuZ2V0KGopKTsKKwkJCQkJCQlJUGF0aCB0bXBGdWxsUGF0aCA9IHRtcFJlZi5nZXRSdW50aW1lUGF0aCgpLmFwcGVuZCh0bXBSZWYuZ2V0QXJjaGl2ZU5hbWUoKSk7CisJCQkJCQkJaWYoIHRtcEZ1bGxQYXRoLmVxdWFscyhhcmNoaXZlRnVsbFBhdGgpKQogCQkJCQkJCQlzaG91bGRJbmNsdWRlID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfQorCQkJCQkJfSAKIAkJCQkJCWlmIChzaG91bGRJbmNsdWRlKSB7CiAJCQkJCQkJSVJlc291cmNlIGlSZXNvdXJjZSA9IG1lbWJlcnNbaV0uZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CiAJCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgZHluYW1pY0NvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpLCBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5MSUJBUkNISVZFVFlQRSArIGlSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwogCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIGR5bmFtaWNSZWYgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlZmVyZW5jZShlYXJDb21wb25lbnQsIGR5bmFtaWNDb21wb25lbnQpOwotCQkJCQkJCWR5bmFtaWNSZWYuc2V0QXJjaGl2ZU5hbWUoYXJjaGl2ZU5hbWUpOwotCQkJCQkJCWlmIChudWxsID09IGR5bmFtaWNSZWZlcmVuY2VzKSB7Ci0JCQkJCQkJCWR5bmFtaWNSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOworCQkJCQkJCSgoVmlydHVhbFJlZmVyZW5jZSlkeW5hbWljUmVmKS5zZXREZXJpdmVkKHRydWUpOworCQkJCQkJCWR5bmFtaWNSZWYuc2V0QXJjaGl2ZU5hbWUoYXJjaGl2ZUZ1bGxQYXRoLmxhc3RTZWdtZW50KCkpOworCQkJCQkJCWR5bmFtaWNSZWYuc2V0UnVudGltZVBhdGgoYXJjaGl2ZUZ1bGxQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKSk7CisJCQkJCQkJaWYgKG51bGwgPT0gaW5uZXJEeW5hbWljUmVmZXJlbmNlcykgeworCQkJCQkJCQlpbm5lckR5bmFtaWNSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwogCQkJCQkJCX0KLQkJCQkJCQlkeW5hbWljUmVmZXJlbmNlcy5hZGQoZHluYW1pY1JlZik7CisJCQkJCQkJaW5uZXJEeW5hbWljUmVmZXJlbmNlcy5hZGQoZHluYW1pY1JlZik7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9IGVsc2UgaWYoSVZpcnR1YWxSZXNvdXJjZS5GT0xERVIgPT0gbWVtYmVyc1tpXS5nZXRUeXBlKCkpewotCQkJCQlkeW5hbWljUmVmZXJlbmNlcyA9IGdldExvb3NlQXJjaGl2ZVJlZmVyZW5jZXMoZWFyQ29tcG9uZW50LCBoYXJkUmVmZXJlbmNlcywgZHluYW1pY1JlZmVyZW5jZXMsIChFQVJWaXJ0dWFsUm9vdEZvbGRlciltZW1iZXJzW2ldKTsKKwkJCQkJaW5uZXJEeW5hbWljUmVmZXJlbmNlcyA9IGdldExvb3NlQXJjaGl2ZVJlZmVyZW5jZXMyKGVhckNvbXBvbmVudCwgaGFyZFJlZmVyZW5jZXMsIGlubmVyRHluYW1pY1JlZmVyZW5jZXMsIChJVmlydHVhbEZvbGRlciltZW1iZXJzW2ldKTsKIAkJCQl9CiAJCQl9CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQotCQlyZXR1cm4gZHluYW1pY1JlZmVyZW5jZXM7CisJCXJldHVybiBpbm5lckR5bmFtaWNSZWZlcmVuY2VzOworCX0KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEeW5hbWljQ29tcG9uZW50KElWaXJ0dWFsRmlsZSB2RmlsZSl7CisJCVN0cmluZyBhcmNoaXZlTmFtZSA9IHZGaWxlLmdldE5hbWUoKTsKKwkJZm9yKGludCBqID0gMDsgajxFWFRFTlNJT05TX1RPX0lHTk9SRS5sZW5ndGg7IGorKyl7CisJCQlpZihKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5lbmRzV2l0aElnbm9yZUNhc2UoYXJjaGl2ZU5hbWUsIEVYVEVOU0lPTlNfVE9fSUdOT1JFW2pdKSl7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoKSB7Ci0JCQogCQlJVmlydHVhbFJlZmVyZW5jZVtdIGNhY2hlZCA9IGdldENhY2hlZFJlZmVyZW5jZXMoKTsKIAkJaWYgKGNhY2hlZCAhPSBudWxsKQogCQkJcmV0dXJuIGNhY2hlZDsKQEAgLTIwNywyNCArMTk4LDc3IEBACiAJCWNhY2hlZFJlZmVyZW5jZXMgPSAoSVZpcnR1YWxSZWZlcmVuY2VbXSkgaGFyZFJlZmVyZW5jZXMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbaGFyZFJlZmVyZW5jZXMuc2l6ZSgpXSk7CiAJCXJldHVybiBjYWNoZWRSZWZlcmVuY2VzOwogCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRSZWZlcmVuY2VzKE1hcDxTdHJpbmcsIE9iamVjdD4gb3B0aW9ucykgeworCQlPYmplY3QgcmVmVHlwZSA9IG9wdGlvbnMuZ2V0KElWaXJ0dWFsQ29tcG9uZW50LlJFUVVFU1RFRF9SRUZFUkVOQ0VfVFlQRSk7CisJCWlmKCByZWZUeXBlICE9IG51bGwgJiYgKElWaXJ0dWFsQ29tcG9uZW50Lk5PTl9ERVJJVkVEX1JFRkVSRU5DRVMuZXF1YWxzKHJlZlR5cGUpIHx8IAorCQkJCQkJCQlJVmlydHVhbENvbXBvbmVudC5IQVJEX1JFRkVSRU5DRVMuZXF1YWxzKHJlZlR5cGUpIHx8CisJCQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50LkRJU1BMQVlBQkxFX1JFRkVSRU5DRVMuZXF1YWxzKHJlZlR5cGUpKSkgeworCQkJTGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gaGFyZFJlZmVyZW5jZXMgPSBnZXRIYXJkUmVmZXJlbmNlcyh0aGlzKTsKKwkJCXJldHVybiBoYXJkUmVmZXJlbmNlcy50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtoYXJkUmVmZXJlbmNlcy5zaXplKCldKTsKKwkJfQorCQlpZiggcmVmVHlwZSAhPSBudWxsICYmIElWaXJ0dWFsQ29tcG9uZW50LkRJU1BMQVlBQkxFX1JFRkVSRU5DRVNfQUxMLmVxdWFscyhyZWZUeXBlKSl7CisJCQljaGVja0lmU3RpbGxWYWxpZCgpOyAvLyBUaGlzIHdpbGwgY2xlYXIgdGhlIGNhY2hlIG9mIHJhdyByZWZlcmVuY2VzIGlmIG5lZWRlZC4KKwkJCXJldHVybiBnZXRBbGxSZWZlcmVuY2VzKCk7CisJCX0KKwkJCisJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGdldFJlZmVyZW5jZXMoKTsKKwkJQm9vbGVhbiBvYmpHZXRFeHBhbmRSZWZzID0gKEJvb2xlYW4pb3B0aW9ucy5nZXQoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQuR0VUX0VYUEFOREVEX0xJQl9SRUZTKTsKKwkJYm9vbGVhbiBnZXRFeHBhbmRSZWZzID0gb2JqR2V0RXhwYW5kUmVmcyAhPSBudWxsID8gb2JqR2V0RXhwYW5kUmVmcy5ib29sZWFuVmFsdWUoKSA6IGZhbHNlOworCQlpZiAoZ2V0RXhwYW5kUmVmcykgeworCQkJcmV0dXJuIEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0RXhwYW5kZWRSZWZlcmVuY2VzKHRoaXMsIHJlZnMpOworCQl9CisJCXJldHVybiByZWZzOworCX0KKwkKKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRBZGRDbGFzc3BhdGhEZXBlbmRlbmN5RGVyaXZlZFJlZmVyZW5jZSgpIHsKKwkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKKwkJZm9yKCBpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKyApIHsKKwkJCXRyeSB7CisJCQkJaWYoIHByb2plY3RzW2ldLmhhc05hdHVyZShKYXZhQ29yZUxpdGUuTkFUVVJFX0lEKSAmJiBNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3RzW2ldKSkgeworCQkJCQlNYXAgPElDbGFzc3BhdGhFbnRyeSwgSUNsYXNzcGF0aEF0dHJpYnV0ZT4gcmVzdWx0cyA9IAorCQkJCQkJQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UmF3Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKAorCQkJCQkJCUphdmFDb3JlTGl0ZS5jcmVhdGUocHJvamVjdHNbaV0pLCAKKwkJCQkJCQkJCURlcGVuZGVuY3lBdHRyaWJ1dGVUeXBlLkNMQVNTUEFUSF9DT01QT05FTlRfREVQRU5ERU5DWSk7CisJCQkJCWlmKCAhcmVzdWx0cy5pc0VtcHR5KCkpCisJCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9IGNhdGNoKENvcmVFeGNlcHRpb24gY2UpIHsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQogCS8vIFJldHVybnMgY2FjaGUgaWYgc3RpbGwgdmFsaWQgb3IgbnVsbAogCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldENhY2hlZFJlZmVyZW5jZXMoKSB7CiAJCWlmIChjYWNoZWRSZWZlcmVuY2VzICE9IG51bGwgJiYgY2hlY2tJZlN0aWxsVmFsaWQoKSkKIAkJCXJldHVybiBjYWNoZWRSZWZlcmVuY2VzOwotCQllbHNlCi0JCQlkZXBHcmFwaE1vZFN0YW1wID0gSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS5nZXRNb2RTdGFtcCgpOwogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAlwcml2YXRlIGJvb2xlYW4gY2hlY2tJZlN0aWxsVmFsaWQoKSB7Ci0JCXJldHVybiBJRGVwZW5kZW5jeUdyYXBoLklOU1RBTkNFLmdldE1vZFN0YW1wKCkgPT0gZGVwR3JhcGhNb2RTdGFtcDsKKwkJYm9vbGVhbiB2YWxpZCA9IElEZXBlbmRlbmN5R3JhcGguSU5TVEFOQ0UuZ2V0TW9kU3RhbXAoKSA9PSBkZXBHcmFwaE1vZFN0YW1wOworCQl2YWxpZCA9IHZhbGlkICYmIEoyRUVEZXBlbmRlbmN5TGlzdGVuZXIuSU5TVEFOQ0UuZ2V0TW9kU3RhbXAoKSA9PSBqZWVNb2RTdGFtcDsKKwkJaWYgKCF2YWxpZCkgeworCQkJY2xlYXJDYWNoZSgpOworCQl9CisJCXJldHVybiB2YWxpZDsKIAl9CiAJCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY2xlYXJDYWNoZSgpIHsKIAkJc3VwZXIuY2xlYXJDYWNoZSgpOwotCQkKIAkJZGVwR3JhcGhNb2RTdGFtcCA9IElEZXBlbmRlbmN5R3JhcGguSU5TVEFOQ0UuZ2V0TW9kU3RhbXAoKTsKKwkJamVlTW9kU3RhbXAgPSBKMkVFRGVwZW5kZW5jeUxpc3RlbmVyLklOU1RBTkNFLmdldE1vZFN0YW1wKCk7CiAJCWNhY2hlZFJlZmVyZW5jZXMgPSBudWxsOwogCX0KKworCXB1YmxpYyBib29sZWFuIGNhblJlY2VpdmVDbGFzc3BhdGhEZXBlbmRlbmNpZXMoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCXB1YmxpYyBJUGF0aCBnZXRDbGFzc3BhdGhGb2xkZXJQYXRoKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50IGNvbXBvbmVudCkgeworCQlyZXR1cm4gUGF0aC5FTVBUWTsKKwl9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS91dGlsL0VBUlZpcnR1YWxSb290Rm9sZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS91dGlsL0VBUlZpcnR1YWxSb290Rm9sZGVyLmphdmEKaW5kZXggODNlZjdjYy4uOWU1YTczMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbXBvbmVudGNvcmUvdXRpbC9FQVJWaXJ0dWFsUm9vdEZvbGRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL3V0aWwvRUFSVmlydHVhbFJvb3RGb2xkZXIuamF2YQpAQCAtMTgsMTggKzE4LDI0IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEZvbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7CiAKLS8vVE9ETyB0aGlzIHNob3VsZCBiZSByZW5hbWVkIHRvIEVBUlZpcnR1YWxGb2xkZXIgYmVjYXVzZSBpdCBpcyBub3QgdXNlZCBvbmx5IGZvciB0aGUgcm9vdC4KKy8qKgorICogQGRlcHJlY2F0ZWQgYXMgb2YgMy4yCisgKgorICovCitARGVwcmVjYXRlZAogcHVibGljIGNsYXNzIEVBUlZpcnR1YWxSb290Rm9sZGVyIGV4dGVuZHMgVmlydHVhbEZvbGRlciB7CiAKKwlARGVwcmVjYXRlZAogCXB1YmxpYyBFQVJWaXJ0dWFsUm9vdEZvbGRlcihJUHJvamVjdCBhQ29tcG9uZW50UHJvamVjdCwgSVBhdGggYVJ1bnRpbWVQYXRoKSB7CiAJCXN1cGVyKGFDb21wb25lbnRQcm9qZWN0LCBhUnVudGltZVBhdGgpOwogCX0KIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFtdIEVYVEVOU0lPTlNfVE9fSUdOT1JFID0gbmV3IFN0cmluZyBbXSB7Ii5qYXIiLCAiLnppcCIsICIucmFyIiwgIi53YXIiIH07CisJcHVibGljIHN0YXRpYyBTdHJpbmcgW10gRVhURU5TSU9OU19UT19JR05PUkUgPSBuZXcgU3RyaW5nIFtdIHtJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhULCAiLnppcCIsIElKMkVFTW9kdWxlQ29uc3RhbnRzLlJBUl9FWFQsIElKMkVFTW9kdWxlQ29uc3RhbnRzLldBUl9FWFQgfTsgIC8vJE5PTi1OTFMtMSQKIAkKIAlwdWJsaWMgSVZpcnR1YWxSZXNvdXJjZVtdIHN1cGVyTWVtYmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHN1cGVyTWVtYmVycyhJUmVzb3VyY2UuTk9ORSk7CkBAIC01Myw2ICs1OSw3IEBACiAJICogRm9yIG5vdywganVzdCByaXAgb3V0IGZpbGVzIHdpdGggLmphciwgLnJhciwgb3IgLndhciBmaWxlIGV4dGVuc2lvbnMsIGJlY2F1c2UgdGhlc2UgYXJlCiAJICogdGhlIG9ubHkgZmlsZXMgYXV0b21hdGljYWxseSBhZGRlZCBkeWFtaWNhbGx5CiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElWaXJ0dWFsUmVzb3VyY2VbXSBtZW1iZXJzKGludCBtZW1iZXJGbGFncykgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlJVmlydHVhbFJlc291cmNlW10gbWVtYmVycyA9IHN1cGVyTWVtYmVycyhtZW1iZXJGbGFncyk7CiAJCUxpc3QgdmlydHVhbFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9EZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCAzNDljNDEyLi44YjIzNDE4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL0RlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0xMSw2ICsxMSw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CkBAIC02MywxMSArNjQsMTQgQEAKIAlwcml2YXRlIElEYXRhTW9kZWwgamNhRmFjZXRNb2RlbDsKIAlwcml2YXRlIElEYXRhTW9kZWwgY2xpZW50TW9kZWw7CiAJcHJpdmF0ZSBJRGF0YU1vZGVsIGNsaWVudEZhY2V0TW9kZWw7CisJCisJcHJpdmF0ZSBMaXN0IDxJRGF0YU1vZGVsPiBleHRlbmRlZE1vZGVsc1RvRGlzcG9zZSA9IG5ldyBBcnJheUxpc3Q8SURhdGFNb2RlbD4oKTsKIAogCXB1YmxpYyBEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7CiAJCXN1cGVyKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewogCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9OQU1FKTsKQEAgLTkyLDEwICs5NiwxMiBAQAogCX0KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKIAkJcmV0dXJuIG5ldyBEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uT3BlcmF0aW9uKG1vZGVsKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBpbml0KCkgewogCQlpbml0TmVzdGVkQ3JlYXRpb25Nb2RlbHMoKTsKIAkJc3VwZXIuaW5pdCgpOwpAQCAtMTAzLDYgKzEwOSw3IEBACiAKIAlwcm90ZWN0ZWQgdm9pZCBpbml0TmVzdGVkQ3JlYXRpb25Nb2RlbHMoKSB7CiAJCWNsaWVudE1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFwcENsaWVudEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CisJCWV4dGVuZGVkTW9kZWxzVG9EaXNwb3NlLmFkZChjbGllbnRNb2RlbCk7CiAJCW1vZGVsLmFkZE5lc3RlZE1vZGVsKE5FU1RFRF9NT0RFTF9DTElFTlQsIGNsaWVudE1vZGVsKTsKIAkJY2xpZW50RmFjZXRNb2RlbCA9ICgoRmFjZXREYXRhTW9kZWxNYXApY2xpZW50TW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApKS5nZXRGYWNldERhdGFNb2RlbChKMkVFUHJvamVjdFV0aWxpdGllcy5BUFBMSUNBVElPTl9DTElFTlQpOwogCQljbGllbnRGYWNldE1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgZmFsc2UpOwpAQCAtMTEyLDYgKzExOSw3IEBACiAJCWlmIChlamJFeHQgIT0gbnVsbCkgewogCQkJZWpiTW9kZWwgPSBlamJFeHQuY3JlYXRlUHJvamVjdERhdGFNb2RlbCgpOwogCQkJaWYgKGVqYk1vZGVsICE9IG51bGwpeworCQkJCWV4dGVuZGVkTW9kZWxzVG9EaXNwb3NlLmFkZChlamJNb2RlbCk7CiAJCQkJbW9kZWwuYWRkTmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX0VKQiwgZWpiTW9kZWwpOwogCQkJCWVqYkZhY2V0TW9kZWwgPSAoKEZhY2V0RGF0YU1vZGVsTWFwKWVqYk1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKSkuZ2V0RmFjZXREYXRhTW9kZWwoSjJFRVByb2plY3RVdGlsaXRpZXMuRUpCKTsKIAkJCQllamJGYWNldE1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgZmFsc2UpOwpAQCAtMTIyLDYgKzEzMCw3IEBACiAJCWlmICh3ZWJFeHQgIT0gbnVsbCkgewogCQkJd2ViTW9kZWwgPSB3ZWJFeHQuY3JlYXRlUHJvamVjdERhdGFNb2RlbCgpOwogCQkJaWYgKHdlYk1vZGVsICE9IG51bGwpeworCQkJCWV4dGVuZGVkTW9kZWxzVG9EaXNwb3NlLmFkZCh3ZWJNb2RlbCk7CiAJCQkJbW9kZWwuYWRkTmVzdGVkTW9kZWwoTkVTVEVEX01PREVMX1dFQiwgd2ViTW9kZWwpOwogCQkJCXdlYkZhY2V0TW9kZWwgPSAoKEZhY2V0RGF0YU1vZGVsTWFwKXdlYk1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKSkuZ2V0RmFjZXREYXRhTW9kZWwoSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUIpOwogCQkJCXdlYkZhY2V0TW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCBmYWxzZSk7CkBAIC0xMzIsNiArMTQxLDcgQEAKIAkJaWYgKHJhckV4dCAhPSBudWxsKSB7CiAJCQlqY2FNb2RlbCA9IHJhckV4dC5jcmVhdGVQcm9qZWN0RGF0YU1vZGVsKCk7CiAJCQlpZiAoamNhTW9kZWwgIT0gbnVsbCl7CisJCQkJZXh0ZW5kZWRNb2RlbHNUb0Rpc3Bvc2UuYWRkKGpjYU1vZGVsKTsKIAkJCQltb2RlbC5hZGROZXN0ZWRNb2RlbChORVNURURfTU9ERUxfSkNBLCBqY2FNb2RlbCk7CiAJCQkJamNhRmFjZXRNb2RlbCA9ICgoRmFjZXREYXRhTW9kZWxNYXApamNhTW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApKS5nZXRGYWNldERhdGFNb2RlbChKMkVFUHJvamVjdFV0aWxpdGllcy5KQ0EpOwogCQkJCWpjYUZhY2V0TW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCBmYWxzZSk7CkBAIC0xNDAsNiArMTUwLDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKENSRUFURV9CQVNFKSkKIAkJCXJldHVybiBnZXREZWZhdWx0Q3JlYXRlVmFsdWUocHJvcGVydHlOYW1lKTsKQEAgLTE4NCw2ICsxOTUsNyBAQAogCQlyZXR1cm4gbmV3TmFtZTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewogCQlib29sZWFuIG5vdGlmeSA9IHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7CiAJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEoyRUVfVkVSU0lPTikpIHsKQEAgLTMwMyw2ICszMTUsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5XVFBPcGVyYXRpb25EYXRhTW9kZWwjZG9WYWxpZGF0ZVByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCiAJCWlmIChnZXRCb29sZWFuUHJvcGVydHkoQ1JFQVRFX0FQUENMSUVOVCkgJiYgcHJvcGVydHlOYW1lLmVxdWFscyhBUFBDTElFTlRfQ09NUE9ORU5UX05BTUUpKSB7CkBAIC00MzgsNiArNDUxLDcgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDUkVBVEVfQ09OTkVDVE9SKSkgewogCQkJaW50IHZlcnNpb24gPSBnZXRJbnRQcm9wZXJ0eShKMkVFX1ZFUlNJT04pOwpAQCAtNDU0LDQgKzQ2OCwxMyBAQAogCQkJcmV0dXJuIGdldEJvb2xlYW5Qcm9wZXJ0eShDUkVBVEVfV0VCKTsKIAkJcmV0dXJuIHN1cGVyLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSk7CiAJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisJCWZvcihJRGF0YU1vZGVsIGRtOiBleHRlbmRlZE1vZGVsc1RvRGlzcG9zZSl7CisJCQlkbS5kaXNwb3NlKCk7CisJCX0KKwkJZXh0ZW5kZWRNb2RlbHNUb0Rpc3Bvc2UuY2xlYXIoKTsKKwkJc3VwZXIuZGlzcG9zZSgpOworCX0KIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9FYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL0VhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggYTdhOTYxZi4uZTg3Y2M1ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL0VhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL0VhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTE2LDE4ICsxNiwyNyBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkoyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKIAogcHVibGljIGNsYXNzIEVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewogCisJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewogCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CiAJCW5hbWVzLmFkZChDT05URU5UX0RJUik7CkBAIC0zNiwxNiArNDUsMzUgQEAKIAkJcmV0dXJuIG5hbWVzOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRfSUQpKSB7CiAJCQlyZXR1cm4gRU5URVJQUklTRV9BUFBMSUNBVElPTjsKIAkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTlRFTlRfRElSKSkgeworCQkJaWYgKG1vZGVsLmlzUHJvcGVydHlTZXQoRkFDRVRfUFJPSkVDVF9OQU1FKSkKKwkJCXsKKwkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUpOworCQkJCUlQcm9qZWN0IHByb2plY3QgPSAocHJvamVjdE5hbWUubGVuZ3RoKCkgPiAwKSA/IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSkgOiBudWxsOworCQkJCQorCQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgcHJvamVjdC5leGlzdHMoKSkgeworCQkJCQlpZiAoTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChwcm9qZWN0KSkKKwkJCQkJeworCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIHRydWUpOworCQkJCQkJSVZpcnR1YWxGb2xkZXIgZWpicm9vdCA9IGMuZ2V0Um9vdEZvbGRlcigpOworCQkJCQkJSVBhdGggY29uZmlnRm9sZGVyUGF0aCA9IEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50LmdldERlZmF1bHREZXBsb3ltZW50RGVzY3JpcHRvckZvbGRlcihlamJyb290KTsKKwkJCQkJCWlmIChjb25maWdGb2xkZXJQYXRoICE9IG51bGwgJiYgcHJvamVjdC5nZXRGb2xkZXIoY29uZmlnRm9sZGVyUGF0aCkuZXhpc3RzKCkpCisJCQkJCQl7CisJCQkJCQkJcmV0dXJuIGNvbmZpZ0ZvbGRlclBhdGgudG9TdHJpbmcoKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KIAkJCXJldHVybiBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSjJFRVByZWZlcmVuY2VzLktleXMuQVBQTElDQVRJT05fQ09OVEVOVF9GT0xERVIpOwogCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSjJFRV9QUk9KRUNUU19MSVNUKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpBVkFfUFJPSkVDVF9MSVNUKSkgewogCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CiAJCX0gZWxzZSBpZihwcm9wZXJ0eU5hbWUuZXF1YWxzKEdFTkVSQVRFX0REKSl7Ci0JCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24gPSAoSVByb2plY3RGYWNldFZlcnNpb24pZ2V0UHJvcGVydHkoRkFDRVRfVkVSU0lPTik7Ci0JCQlpZihmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OXzUwKXsKKwkJCVN0cmluZyBmYWNldFZlcnNpb24gPSBnZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9WRVJTSU9OX1NUUik7CisJCQlpZihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludChmYWNldFZlcnNpb24pID49IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQpewogCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihKMkVFUHJlZmVyZW5jZXMuS2V5cy5BUFBMSUNBVElPTl9HRU5FUkFURV9ERCkpOwogCQkJfQogCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKQEAgLTUzLDYgKzgxLDcgQEAKIAkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBuYW1lKSB7CiAJCWlmIChuYW1lLmVxdWFscyhKMkVFX1BST0pFQ1RTX0xJU1QpKSB7CiAJCQlyZXR1cm4gdmFsaWRhdGVUYXJnZXRDb21wb25lbnRWZXJzaW9uKChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShKMkVFX1BST0pFQ1RTX0xJU1QpKTsKQEAgLTcwLDE0ICs5OSwyNyBAQAogCQkJaWYgKGNvbXAgPT0gbnVsbCkgcmV0dXJuIE9LX1NUQVRVUzsgLy9Ob3QgYSBmYWNldGVkIHByb2plY3QsIHNvIHZlcnNpb24gbm90IHJlbGV2YW50CiAJCQlpbnQgY29tcFZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludChjb21wKTsKIAkJCWlmIChlYXJWZXJzaW9uIDwgY29tcFZlcnNpb24pIHsKLQkJCQlTdHJpbmcgZXJyb3JTdGF0dXMgPSAiVGhlIE1vZHVsZSBzcGVjaWZpY2F0aW9uIGxldmVsIG9mICIgKyBoYW5kbGUuZ2V0TmFtZSgpICsgIiwgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGNvbnRhaW5pbmcgRUFSIHZlcnNpb24iOyAvLyROT04tTkxTLTEkCisJCQkJU3RyaW5nIGVycm9yU3RhdHVzID0gTkxTLmJpbmQoUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXJfVGhlX01vZHVsZV9zcGVjaWZpY2F0aW9uX2xldmVsX29mXywgaGFuZGxlLmdldE5hbWUoKSk7CiAJCQkJcmV0dXJuIEoyRUVQbHVnaW4ubmV3RXJyb3JTdGF0dXMoZXJyb3JTdGF0dXMsIG51bGwpOwogCQkJfQogCQl9CiAJCXJldHVybiBPS19TVEFUVVM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIGludCBjb252ZXJ0RmFjZXRWZXJzaW9uVG9KMkVFVmVyc2lvbihJUHJvamVjdEZhY2V0VmVyc2lvbiB2ZXJzaW9uKSB7CiAJCXJldHVybiBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludCh2ZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKSk7CiAJfQorCisgICAgQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKKyAgICAgICAgaWYgKEZBQ0VUX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkKKyAgICAgICAgeworCQkJaWYgKCFtb2RlbC5pc1Byb3BlcnR5U2V0KENPTlRFTlRfRElSKSkgeworCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKENPTlRFTlRfRElSLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKKwkJCX0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9JRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9JRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQppbmRleCA1ZmMwMjFhLi40NGFkMzU4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vSURlZmF1bHRKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL0lEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCkBAIC00MCwxOSArNDAsMTkgQEAKICAgIC8qKgogICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4gdHlwZSBCb29sZWFuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0VKQiA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNSRUFURV9FSkIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9FSkIgPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5DUkVBVEVfRUpCIjsgLy8kTk9OLU5MUy0xJAogICAgIC8qKgogICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4gdHlwZSBCb29sZWFuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1dFQiA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNSRUFURV9XRUIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9XRUIgPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5DUkVBVEVfV0VCIjsgLy8kTk9OLU5MUy0xJAogICAgIC8qKgogICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4gdHlwZSBCb29sZWFuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0FQUENMSUVOVCA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNSRUFURV9DTElFTlQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9BUFBDTElFTlQgPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5DUkVBVEVfQ0xJRU5UIjsgLy8kTk9OLU5MUy0xJAogICAgIC8qKgogICAgICAqIERlZmF1bHQgaXMgdHJ1ZS4gdHlwZSBCb29sZWFuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0NPTk5FQ1RPUiA9ICJEZWZhdWx0SjJFRUNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNSRUFURV9DT05ORUNUT1IiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9DT05ORUNUT1IgPSAiRGVmYXVsdEoyRUVDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5DUkVBVEVfQ09OTkVDVE9SIjsgLy8kTk9OLU5MUy0xJAogCiAgICAgLyoqCiAgICAgICogVXNlZCBmb3IgdmFsaWRhdGlvbiBvbmx5OyB2YWxpZGF0ZXMgbm8gY29sbHNpb25zIGJldHdlZW4gdmFyaW91cyBtb2R1bGUgbmFtZXMuIERvIG5vdCBzZXQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvRUFSUHJvamVjdE1hcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9FQVJQcm9qZWN0TWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZDU3ZGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9FQVJQcm9qZWN0TWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXA7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBFQVJQcm9qZWN0TWFwIGV4dGVuZHMgRU9iamVjdCB7fQotICogQGRlcHJlY2F0ZWQKLSAqIFVzZQotICogPHA+Ci0gKiAJCU5lZWQgdG8gdXNlIHRoZSBNb2R1bGVDb3JlIGFuZCBXb3JrYmVuY2hDb21wb25lbnQgQXBpIHRvIGdldCB0byB0aGUgcmVmZXJlbmNlZCBtb2R1bGVzCi0gKiBhcyB3aXRoIHRoZSBGbGV4aWJsZSBwcm9qZWN0IGNoYW5nZXMgYSAubW9kdWxlbWFwcyBmaWxlIHdpbGwgbm90IGV4aXN0IGluIGFuIEVBUiBtb2R1bGUgYW5kCi0gKiBhbGwgdGhlIGluZm8gdGhhdCB3YXMgY2FwdHVyZWQgaW4gLm1vZHVsZW1hcHMgZmlsZSB3aWxsIGlzIG5vdyBjYXB0dXJlZCBpbiB0aGUgLmNvbXBvbmVudCBmaWxlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRUFSUHJvamVjdE1hcCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBNYXBwaW5ncyByZWZlcmVuY2VzCi0JICovCi0JRUxpc3QgZ2V0TWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgbGlzdCBvZiBVdGlsaXR5SkFSTWFwcGluZ3MgcmVmZXJlbmNlcwotCSAqLwotCUVMaXN0IGdldFV0aWxpdHlKQVJNYXBwaW5ncygpOwotCi19IC8vRUFSUHJvamVjdE1hcApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9FQVJQcm9qZWN0TWFwSW1wbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9FQVJQcm9qZWN0TWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDUzYTg3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvRUFSUHJvamVjdE1hcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBjbGFzcyBFQVJQcm9qZWN0TWFwSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRUFSUHJvamVjdE1hcCwgRU9iamVjdCB7fQotICogQGRlcHJlY2F0ZWQKLSAqIFVzZQotICogPHA+Ci0gKiAJCU5lZWQgdG8gdXNlIHRoZSBNb2R1bGVDb3JlIGFuZCBXb3JrYmVuY2hDb21wb25lbnQgQXBpIHRvIGdldCB0byB0aGUgcmVmZXJlbmNlZCBtb2R1bGVzCi0gKiBhcyB3aXRoIHRoZSBGbGV4aWJsZSBwcm9qZWN0IGNoYW5nZXMgYSAubW9kdWxlbWFwcyBmaWxlIHdpbGwgbm90IGV4aXN0IGluIGFuIEVBUiBtb2R1bGUgYW5kCi0gKiBhbGwgdGhlIGluZm8gdGhhdCB3YXMgY2FwdHVyZWQgaW4gLm1vZHVsZW1hcHMgZmlsZSB3aWxsIGlzIG5vdyBjYXB0dXJlZCBpbiB0aGUgLmNvbXBvbmVudCBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJQcm9qZWN0TWFwSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRUFSUHJvamVjdE1hcCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG1hcHBpbmdzID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdXRpbGl0eUpBUk1hcHBpbmdzID0gbnVsbDsKLQotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRUFSUHJvamVjdE1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kdWxlbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUFSUHJvamVjdE1hcCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIEVMaXN0IGdldE1hcHBpbmdzKCkgewotCQlpZiAobWFwcGluZ3MgPT0gbnVsbCkgewotCQkJbWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoTW9kdWxlTWFwcGluZy5jbGFzcywgdGhpcywgTW9kdWxlbWFwUGFja2FnZS5FQVJfUFJPSkVDVF9NQVBfX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gbWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VXRpbGl0eUpBUk1hcHBpbmdzKCkgewotCQlpZiAodXRpbGl0eUpBUk1hcHBpbmdzID09IG51bGwpIHsKLQkJCXV0aWxpdHlKQVJNYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChVdGlsaXR5SkFSTWFwcGluZy5jbGFzcywgdGhpcywgTW9kdWxlbWFwUGFja2FnZS5FQVJfUFJPSkVDVF9NQVBfX1VUSUxJVFlfSkFSX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gdXRpbGl0eUpBUk1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5FQVJfUFJPSkVDVF9NQVBfX01BUFBJTkdTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0TWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5FQVJfUFJPSkVDVF9NQVBfX1VUSUxJVFlfSkFSX01BUFBJTkdTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0VXRpbGl0eUpBUk1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLkVBUl9QUk9KRUNUX01BUF9fTUFQUElOR1MgOgotCQkJCXJldHVybiBnZXRNYXBwaW5ncygpOwotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLkVBUl9QUk9KRUNUX01BUF9fVVRJTElUWV9KQVJfTUFQUElOR1MgOgotCQkJCXJldHVybiBnZXRVdGlsaXR5SkFSTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLkVBUl9QUk9KRUNUX01BUF9fTUFQUElOR1MgOgotCQkJCWdldE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5FQVJfUFJPSkVDVF9NQVBfX1VUSUxJVFlfSkFSX01BUFBJTkdTIDoKLQkJCQlnZXRVdGlsaXR5SkFSTWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldFV0aWxpdHlKQVJNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLkVBUl9QUk9KRUNUX01BUF9fTUFQUElOR1MgOgotCQkJCWdldE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuRUFSX1BST0pFQ1RfTUFQX19VVElMSVRZX0pBUl9NQVBQSU5HUyA6Ci0JCQkJZ2V0VXRpbGl0eUpBUk1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuRUFSX1BST0pFQ1RfTUFQX19NQVBQSU5HUyA6Ci0JCQkJcmV0dXJuIG1hcHBpbmdzICE9IG51bGwgJiYgIW1hcHBpbmdzLmlzRW1wdHkoKTsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5FQVJfUFJPSkVDVF9NQVBfX1VUSUxJVFlfSkFSX01BUFBJTkdTIDoKLQkJCQlyZXR1cm4gdXRpbGl0eUpBUk1hcHBpbmdzICE9IG51bGwgJiYgIXV0aWxpdHlKQVJNYXBwaW5ncy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0VBUlByb2plY3RNYXBJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZU1hcHBpbmcuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWU5OWVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotCi0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgTW9kdWxlTWFwcGluZyBleHRlbmRzIEVPYmplY3Qge30KLSAqIEBkZXByZWNhdGVkCi0gKiBVc2UKLSAqIDxwPgotICogTmVlZCB0byB1c2UgdGhlIE1vZHVsZUNvcmUgYW5kIFdvcmtiZW5jaENvbXBvbmVudCBBcGkgdG8gZ2V0IHRvIHRoZSByZWZlcmVuY2VkIG1vZHVsZXMKLSAqIGFzIHdpdGggdGhlIEZsZXhpYmxlIHByb2plY3QgY2hhbmdlcyBhIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBub3QgZXhpc3QgaW4gYW4gRUFSIG1vZHVsZSBhbmQKLSAqIGFsbCB0aGUgaW5mbyB0aGF0IHdhcyBjYXB0dXJlZCBpbiAubW9kdWxlbWFwcyBmaWxlIHdpbGwgaXMgbm93IGNhcHR1cmVkIGluIHRoZSAuY29tcG9uZW50IGZpbGUKLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBNb2R1bGVNYXBwaW5nIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBvZiB0aGUgUHJvamVjdE5hbWUgYXR0cmlidXRlCi0JICovCi0JU3RyaW5nIGdldFByb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgUHJvamVjdE5hbWUgYXR0cmlidXRlCi0JICovCi0Jdm9pZCBzZXRQcm9qZWN0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIFRoZSBNb2R1bGUgcmVmZXJlbmNlCi0JICovCi0JTW9kdWxlIGdldE1vZHVsZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gbAotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgTW9kdWxlIHJlZmVyZW5jZQotCSAqLwotCXZvaWQgc2V0TW9kdWxlKE1vZHVsZSB2YWx1ZSk7Ci0KLX0gLy9Nb2R1bGVNYXBwaW5nCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZU1hcHBpbmdJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZU1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzM2Y4ZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVNYXBwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5FQVJDcmVhdGlvblJlc291cmNlSGFuZGxlcjsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIE1vZHVsZU1hcHBpbmdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNb2R1bGVNYXBwaW5nLCBFT2JqZWN0IHt9Ci0gKiAqIEBkZXByZWNhdGVkCi0gKiBVc2UKLSAqIDxwPgotICogTmVlZCB0byB1c2UgdGhlIE1vZHVsZUNvcmUgYW5kIFdvcmtiZW5jaENvbXBvbmVudCBBcGkgdG8gZ2V0IHRvIHRoZSByZWZlcmVuY2VkIG1vZHVsZXMKLSAqIGFzIHdpdGggdGhlIEZsZXhpYmxlIHByb2plY3QgY2hhbmdlcyBhIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBub3QgZXhpc3QgaW4gYW4gRUFSIG1vZHVsZSBhbmQKLSAqIGFsbCB0aGUgaW5mbyB0aGF0IHdhcyBjYXB0dXJlZCBpbiAubW9kdWxlbWFwcyBmaWxlIHdpbGwgaXMgbm93IGNhcHR1cmVkIGluIHRoZSAuY29tcG9uZW50IGZpbGUKLSAqLwotcHVibGljIGNsYXNzIE1vZHVsZU1hcHBpbmdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNb2R1bGVNYXBwaW5nIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE5hbWUoKSA8ZW0+UHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0UHJvamVjdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3ROYW1lID0gUFJPSkVDVF9OQU1FX0VERUZBVUxUOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBNb2R1bGUgbW9kdWxlID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBNb2R1bGVNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRNb2R1bGVNYXBwaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIG5ld1Byb2plY3ROYW1lKSB7Ci0JCVN0cmluZyBvbGRQcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOwotCQlwcm9qZWN0TmFtZSA9IG5ld1Byb2plY3ROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2R1bGVtYXBQYWNrYWdlLk1PRFVMRV9NQVBQSU5HX19QUk9KRUNUX05BTUUsIG9sZFByb2plY3ROYW1lLCBwcm9qZWN0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIE1vZHVsZSBnZXRNb2R1bGUoKSB7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCAmJiBtb2R1bGUuZUlzUHJveHkoKSkgewotCQkJTW9kdWxlIG9sZE1vZHVsZSA9IG1vZHVsZTsKLQkJCW1vZHVsZSA9IChNb2R1bGUpIEVjb3JlVXRpbC5yZXNvbHZlKG1vZHVsZSwgdGhpcyk7Ci0JCQlpZiAobW9kdWxlICE9IG9sZE1vZHVsZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIE1vZHVsZW1hcFBhY2thZ2UuTU9EVUxFX01BUFBJTkdfX01PRFVMRSwgb2xkTW9kdWxlLCBtb2R1bGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kdWxlIGJhc2ljR2V0TW9kdWxlKCkgewotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZHVsZShNb2R1bGUgbmV3TW9kdWxlKSB7Ci0JCU1vZHVsZSBvbGRNb2R1bGUgPSBtb2R1bGU7Ci0JCW1vZHVsZSA9IG5ld01vZHVsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kdWxlbWFwUGFja2FnZS5NT0RVTEVfTUFQUElOR19fTU9EVUxFLCBvbGRNb2R1bGUsIG1vZHVsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuTU9EVUxFX01BUFBJTkdfX1BST0pFQ1RfTkFNRSA6Ci0JCQkJcmV0dXJuIGdldFByb2plY3ROYW1lKCk7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuTU9EVUxFX01BUFBJTkdfX01PRFVMRSA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRNb2R1bGUoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRNb2R1bGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuTU9EVUxFX01BUFBJTkdfX1BST0pFQ1RfTkFNRSA6Ci0JCQkJcmV0dXJuIFBST0pFQ1RfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcHJvamVjdE5hbWUgIT0gbnVsbCA6ICFQUk9KRUNUX05BTUVfRURFRkFVTFQuZXF1YWxzKHByb2plY3ROYW1lKTsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5NT0RVTEVfTUFQUElOR19fTU9EVUxFIDoKLQkJCQlyZXR1cm4gbW9kdWxlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuTU9EVUxFX01BUFBJTkdfX1BST0pFQ1RfTkFNRSA6Ci0JCQkJc2V0UHJvamVjdE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5NT0RVTEVfTUFQUElOR19fTU9EVUxFIDoKLQkJCQlzZXRNb2R1bGUoKE1vZHVsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuTU9EVUxFX01BUFBJTkdfX1BST0pFQ1RfTkFNRSA6Ci0JCQkJc2V0UHJvamVjdE5hbWUoUFJPSkVDVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuTU9EVUxFX01BUFBJTkdfX01PRFVMRSA6Ci0JCQkJc2V0TW9kdWxlKChNb2R1bGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTW9kdWxlTWFwcGluZ0ltcGxfVUlfMCIsIG5ldyBPYmplY3RbXXtwcm9qZWN0TmFtZX0pKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTW9kdWxlTWFwcGluZ0ltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzNGRiYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgTW9kdWxlbWFwQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwge30KLSAqIEBkZXByZWNhdGVkCi0gKiBVc2UKLSAqIDxwPgotICogCQlOZWVkIHRvIHVzZSB0aGUgTW9kdWxlQ29yZSBhbmQgV29ya2JlbmNoQ29tcG9uZW50IEFwaSB0byBnZXQgdG8gdGhlIHJlZmVyZW5jZWQgbW9kdWxlcwotICogYXMgd2l0aCB0aGUgRmxleGlibGUgcHJvamVjdCBjaGFuZ2VzIGEgLm1vZHVsZW1hcHMgZmlsZSB3aWxsIG5vdCBleGlzdCBpbiBhbiBFQVIgbW9kdWxlIGFuZAotICogYWxsIHRoZSBpbmZvIHRoYXQgd2FzIGNhcHR1cmVkIGluIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBpcyBub3cgY2FwdHVyZWQgaW4gdGhlIC5jb21wb25lbnQgZmlsZQotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlbWFwQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNb2R1bGVtYXBQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBNb2R1bGVtYXBBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3QpIG9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlbWFwU3dpdGNoIG1vZGVsU3dpdGNoID0gbmV3IE1vZHVsZW1hcFN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlTW9kdWxlTWFwcGluZyhNb2R1bGVNYXBwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZU1hcHBpbmdBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFQVJQcm9qZWN0TWFwKEVBUlByb2plY3RNYXAgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUFSUHJvamVjdE1hcEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZVV0aWxpdHlKQVJNYXBwaW5nKFV0aWxpdHlKQVJNYXBwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVV0aWxpdHlKQVJNYXBwaW5nQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKSBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlcy4gSXQncyB1c2VmdWwgdG8KLQkgKiBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKi8KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVBUlByb2plY3RNYXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNb2R1bGVNYXBwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVXRpbGl0eUpBUk1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Nb2R1bGVtYXBBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVtYXBGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNhMWY3Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBNb2R1bGVtYXBGYWN0b3J5IGV4dGVuZHMgRUZhY3Rvcnkge30KLSAqIEBkZXByZWNhdGVkCi0gKiBVc2UKLSAqIDxwPgotICogCQlOZWVkIHRvIHVzZSB0aGUgTW9kdWxlQ29yZSBhbmQgV29ya2JlbmNoQ29tcG9uZW50IEFwaSB0byBnZXQgdG8gdGhlIHJlZmVyZW5jZWQgbW9kdWxlcwotICogYXMgd2l0aCB0aGUgRmxleGlibGUgcHJvamVjdCBjaGFuZ2VzIGEgLm1vZHVsZW1hcHMgZmlsZSB3aWxsIG5vdCBleGlzdCBpbiBhbiBFQVIgbW9kdWxlIGFuZAotICogYWxsIHRoZSBpbmZvIHRoYXQgd2FzIGNhcHR1cmVkIGluIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBpcyBub3cgY2FwdHVyZWQgaW4gdGhlIC5jb21wb25lbnQgZmlsZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZHVsZW1hcEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZHVsZW1hcEZhY3RvcnkgZUlOU1RBTkNFID0gbmV3IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5Nb2R1bGVtYXBGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcmV0dXJuIEVBUlByb2plY3RNYXAgdmFsdWUKLQkgKi8KLQlFQVJQcm9qZWN0TWFwIGNyZWF0ZUVBUlByb2plY3RNYXAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBNb2R1bGVNYXBwaW5nIHZhbHVlCi0JICovCi0JTW9kdWxlTWFwcGluZyBjcmVhdGVNb2R1bGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVXRpbGl0eUpBUk1hcHBpbmcgdmFsdWUKLQkgKi8KLQlVdGlsaXR5SkFSTWFwcGluZyBjcmVhdGVVdGlsaXR5SkFSTWFwcGluZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JTW9kdWxlbWFwUGFja2FnZSBnZXRNb2R1bGVtYXBQYWNrYWdlKCk7Ci0KLX0gLy9Nb2R1bGVtYXBGYWN0b3J5CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcEZhY3RvcnlJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcEZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTMyZjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVtYXBGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci0KLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIE1vZHVsZW1hcEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgTW9kdWxlbWFwRmFjdG9yeSwgRUZhY3Rvcnkge30KLSAqIEBkZXByZWNhdGVkCi0gKiBVc2UKLSAqIDxwPgotICogCQlOZWVkIHRvIHVzZSB0aGUgTW9kdWxlQ29yZSBhbmQgV29ya2JlbmNoQ29tcG9uZW50IEFwaSB0byBnZXQgdG8gdGhlIHJlZmVyZW5jZWQgbW9kdWxlcwotICogYXMgd2l0aCB0aGUgRmxleGlibGUgcHJvamVjdCBjaGFuZ2VzIGEgLm1vZHVsZW1hcHMgZmlsZSB3aWxsIG5vdCBleGlzdCBpbiBhbiBFQVIgbW9kdWxlIGFuZAotICogYWxsIHRoZSBpbmZvIHRoYXQgd2FzIGNhcHR1cmVkIGluIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBpcyBub3cgY2FwdHVyZWQgaW4gdGhlIC5jb21wb25lbnQgZmlsZQotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlbWFwRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBNb2R1bGVtYXBGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBNb2R1bGVtYXBGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5NT0RVTEVfTUFQUElORyA6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZU1hcHBpbmcoKTsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5FQVJfUFJPSkVDVF9NQVAgOgotCQkJCXJldHVybiBjcmVhdGVFQVJQcm9qZWN0TWFwKCk7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuVVRJTElUWV9KQVJfTUFQUElORyA6Ci0JCQkJcmV0dXJuIGNyZWF0ZVV0aWxpdHlKQVJNYXBwaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBUlByb2plY3RNYXAgY3JlYXRlRUFSUHJvamVjdE1hcCgpIHsKLQkJRUFSUHJvamVjdE1hcEltcGwgZWFyUHJvamVjdE1hcCA9IG5ldyBFQVJQcm9qZWN0TWFwSW1wbCgpOwotCQlyZXR1cm4gZWFyUHJvamVjdE1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTW9kdWxlTWFwcGluZyBjcmVhdGVNb2R1bGVNYXBwaW5nKCkgewotCQlNb2R1bGVNYXBwaW5nSW1wbCBtb2R1bGVNYXBwaW5nID0gbmV3IE1vZHVsZU1hcHBpbmdJbXBsKCk7Ci0JCXJldHVybiBtb2R1bGVNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBVdGlsaXR5SkFSTWFwcGluZyBjcmVhdGVVdGlsaXR5SkFSTWFwcGluZygpIHsKLQkJVXRpbGl0eUpBUk1hcHBpbmdJbXBsIHV0aWxpdHlKQVJNYXBwaW5nID0gbmV3IFV0aWxpdHlKQVJNYXBwaW5nSW1wbCgpOwotCQlyZXR1cm4gdXRpbGl0eUpBUk1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE1vZHVsZW1hcFBhY2thZ2UgZ2V0TW9kdWxlbWFwUGFja2FnZSgpIHsKLQkJcmV0dXJuIChNb2R1bGVtYXBQYWNrYWdlKSBnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kdWxlbWFwUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTW9kdWxlbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vTW9kdWxlbWFwRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwSW5pdC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVtYXBJbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YTVhZWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVtYXBJbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5FeHRlbmRlZEVjb3JlVXRpbDsKLQotLy9pbXBvcnQgY29tLmlibS5ldG9vbHMuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkVBUkVkaXRNb2RlbDsKLS8qKgotKiBAZGVwcmVjYXRlZAotKiBVc2UKLSogPHA+Ci0qIAkJTmVlZCB0byB1c2UgdGhlIE1vZHVsZUNvcmUgYW5kIFdvcmtiZW5jaENvbXBvbmVudCBBcGkgdG8gZ2V0IHRvIHRoZSByZWZlcmVuY2VkIG1vZHVsZXMKLSogYXMgd2l0aCB0aGUgRmxleGlibGUgcHJvamVjdCBjaGFuZ2VzIGEgLm1vZHVsZW1hcHMgZmlsZSB3aWxsIG5vdCBleGlzdCBpbiBhbiBFQVIgbW9kdWxlIGFuZAotKiBhbGwgdGhlIGluZm8gdGhhdCB3YXMgY2FwdHVyZWQgaW4gLm1vZHVsZW1hcHMgZmlsZSB3aWxsIGlzIG5vdyBjYXB0dXJlZCBpbiB0aGUgLmNvbXBvbmVudCBmaWxlCi0qLwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlbWFwSW5pdCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKLQkJaW5pdCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdChib29sZWFuIHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkgewotCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJaW52b2tlUHJlcmVxSW5pdHMoc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcyk7Ci0JCQlpZiAoc2hvdWxkUHJlUmVnaXN0ZXJQYWNrYWdlcykgewotCQkJCUV4dGVuZGVkRWNvcmVVdGlsLnByZVJlZ2lzdGVyUGFja2FnZSgibW9kdWxlbWFwLnhtaSIsIG5ldyBFUGFja2FnZS5EZXNjcmlwdG9yKCkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXB1YmxpYyBFUGFja2FnZSBnZXRFUGFja2FnZSgpIHsKLQkJCQkJCQkJCXJldHVybiBNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCQkJCQkJfQotCQkJCQkJCQlwdWJsaWMgRUZhY3RvcnkgZ2V0RUZhY3RvcnkoKSB7Ci0JCQkJCQkJCQlyZXR1cm4gTW9kdWxlbWFwRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCX0KLQkJCS8vUmVzb3VyY2VEZXBlbmRlbmN5UmVnaXN0ZXIucmVnaXN0ZXJEZXBlbmRlbmN5KEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJX09CSiwgRUFSRWRpdE1vZGVsLk1PRFVMRV9NQVBfVVJJX09CSik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW52b2tlUHJlcmVxSW5pdHMoYm9vbGVhbiBzaG91bGRQcmVSZWdpc3RlclBhY2thZ2VzKSB7Ci0JCS8vVE9ETyBTaG91bGQgcmVtb3ZlLi4uLgotCQkvL2NvbS5pYm0uZWpzLm1vZGVscy5iYXNlLmV4dGVuc2lvbnMuaW5pdC5FeHRlbnNpb25zSW5pdC5pbml0KHNob3VsZFByZVJlZ2lzdGVyUGFja2FnZXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwUGFja2FnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVtYXBQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOGY3M2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVtYXBQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotCi0vKioKLSAqIEBsYXN0Z2VuIGludGVyZmFjZSBNb2R1bGVtYXBQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2Uge30KLSAqIEBkZXByZWNhdGVkCi0gKiBVc2UKLSAqIDxwPgotICogTmVlZCB0byB1c2UgdGhlIE1vZHVsZUNvcmUgYW5kIFdvcmtiZW5jaENvbXBvbmVudCBBcGkgdG8gZ2V0IHRvIHRoZSByZWZlcmVuY2VkIG1vZHVsZXMKLSAqIGFzIHdpdGggdGhlIEZsZXhpYmxlIHByb2plY3QgY2hhbmdlcyBhIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBub3QgZXhpc3QgaW4gYW4gRUFSIG1vZHVsZSBhbmQKLSAqIGFsbCB0aGUgaW5mbyB0aGF0IHdhcyBjYXB0dXJlZCBpbiAubW9kdWxlbWFwcyBmaWxlIHdpbGwgaXMgbm93IGNhcHR1cmVkIGluIHRoZSAuY29tcG9uZW50IGZpbGUKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2R1bGVtYXBQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAibW9kdWxlbWFwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFQVJfUFJPSkVDVF9NQVAgPSAxOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfTUFQUElORyA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IE1PRFVMRV9NQVBQSU5HX19QUk9KRUNUX05BTUUgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBNT0RVTEVfTUFQUElOR19fTU9EVUxFID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+TW9kdWxlIE1hcHBpbmc8L2VtPicgY2xhc3MuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1PRFVMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IEVBUl9QUk9KRUNUX01BUF9fTUFQUElOR1MgPSAwOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCWludCBFQVJfUFJPSkVDVF9NQVBfX1VUSUxJVFlfSkFSX01BUFBJTkdTID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RUFSIFByb2plY3QgTWFwPC9lbT4nIGNsYXNzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFQVJfUFJPSkVDVF9NQVBfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlpbnQgVVRJTElUWV9KQVJfTUFQUElORyA9IDI7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFVUSUxJVFlfSkFSX01BUFBJTkdfX1BST0pFQ1RfTkFNRSA9IDA7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JaW50IFVUSUxJVFlfSkFSX01BUFBJTkdfX1VSSSA9IDE7Ci0KLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VXRpbGl0eSBKQVIgTWFwcGluZzwvZW0+JyBjbGFzcy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVVRJTElUWV9KQVJfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gMjsKLQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAibW9kdWxlbWFwLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm1vZHVsZW1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNb2R1bGVtYXBQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5Nb2R1bGVtYXBQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gRUFSUHJvamVjdE1hcCBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0RUFSUHJvamVjdE1hcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFQVJQcm9qZWN0TWFwX01hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVBUlByb2plY3RNYXBfVXRpbGl0eUpBUk1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gTW9kdWxlTWFwcGluZyBvYmplY3QKLQkgKi8KLQlFQ2xhc3MgZ2V0TW9kdWxlTWFwcGluZygpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNb2R1bGVNYXBwaW5nX1Byb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1vZHVsZU1hcHBpbmdfTW9kdWxlKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gVXRpbGl0eUpBUk1hcHBpbmcgb2JqZWN0Ci0JICovCi0JRUNsYXNzIGdldFV0aWxpdHlKQVJNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFV0aWxpdHlKQVJNYXBwaW5nX1Byb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlFQXR0cmlidXRlIGdldFV0aWxpdHlKQVJNYXBwaW5nX1VyaSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JTW9kdWxlbWFwRmFjdG9yeSBnZXRNb2R1bGVtYXBGYWN0b3J5KCk7Ci0KLX0gLy9Nb2R1bGVtYXBQYWNrYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcFBhY2thZ2VJbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MTc4ZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9Nb2R1bGVtYXBQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FY29yZVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZlBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuQ29tbW9uUGFja2FnZUltcGw7Ci0KLQotCi0vKioKLSAqIEBsYXN0Z2VuIGNsYXNzIE1vZHVsZW1hcFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgTW9kdWxlbWFwUGFja2FnZSwgRVBhY2thZ2Uge30KLSAqIEBkZXByZWNhdGVkCi0gKiBVc2UKLSAqIDxwPgotICogCQlOZWVkIHRvIHVzZSB0aGUgTW9kdWxlQ29yZSBhbmQgV29ya2JlbmNoQ29tcG9uZW50IEFwaSB0byBnZXQgdG8gdGhlIHJlZmVyZW5jZWQgbW9kdWxlcwotICogYXMgd2l0aCB0aGUgRmxleGlibGUgcHJvamVjdCBjaGFuZ2VzIGEgLm1vZHVsZW1hcHMgZmlsZSB3aWxsIG5vdCBleGlzdCBpbiBhbiBFQVIgbW9kdWxlIGFuZAotICogYWxsIHRoZSBpbmZvIHRoYXQgd2FzIGNhcHR1cmVkIGluIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBpcyBub3cgY2FwdHVyZWQgaW4gdGhlIC5jb21wb25lbnQgZmlsZQotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlbWFwUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBNb2R1bGVtYXBQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbW9kdWxlTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWFyUHJvamVjdE1hcEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdXRpbGl0eUpBUk1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJpdmF0ZSBNb2R1bGVtYXBQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgTW9kdWxlbWFwRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kdWxlbWFwUGFja2FnZSBpbml0KCkgewotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJQ29tbW9uUGFja2FnZUltcGwuaW5pdCgpOwotCQlKYXZhUmVmUGFja2FnZUltcGwuaW5pdCgpOwotCQlBcHBsaWNhdGlvblBhY2thZ2VJbXBsLmluaXQoKTsKLQkJRWNvcmVQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZSBhbmQgaW50ZXJkZXBlbmRlbmNpZXMKLQkJTW9kdWxlbWFwUGFja2FnZUltcGwgdGhlTW9kdWxlbWFwUGFja2FnZSA9IChNb2R1bGVtYXBQYWNrYWdlSW1wbCkgKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgRVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBNb2R1bGVtYXBQYWNrYWdlSW1wbCgpKTsKLQotCQkvLyBTdGVwIDE6IGNyZWF0ZSBtZXRhLW1vZGVsIG9iamVjdHMKLQkJdGhlTW9kdWxlbWFwUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBTdGVwIDI6IGNvbXBsZXRlIGluaXRpYWxpemF0aW9uCi0JCXRoZU1vZHVsZW1hcFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCXJldHVybiB0aGVNb2R1bGVtYXBQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RUFSUHJvamVjdE1hcCgpIHsKLQkJcmV0dXJuIGVhclByb2plY3RNYXBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RUFSUHJvamVjdE1hcF9NYXBwaW5ncygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBlYXJQcm9qZWN0TWFwRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEVBUlByb2plY3RNYXBfVXRpbGl0eUpBUk1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGVhclByb2plY3RNYXBFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNb2R1bGVNYXBwaW5nKCkgewotCQlyZXR1cm4gbW9kdWxlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNb2R1bGVNYXBwaW5nX1Byb2plY3ROYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1vZHVsZU1hcHBpbmdFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TW9kdWxlTWFwcGluZ19Nb2R1bGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbW9kdWxlTWFwcGluZ0VDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFV0aWxpdHlKQVJNYXBwaW5nKCkgewotCQlyZXR1cm4gdXRpbGl0eUpBUk1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VXRpbGl0eUpBUk1hcHBpbmdfUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgdXRpbGl0eUpBUk1hcHBpbmdFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VXRpbGl0eUpBUk1hcHBpbmdfVXJpKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHV0aWxpdHlKQVJNYXBwaW5nRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBNb2R1bGVtYXBGYWN0b3J5IGdldE1vZHVsZW1hcEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoTW9kdWxlbWFwRmFjdG9yeSkgZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiBUaGlzIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uCi0JICogYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkKLQkJCXJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJbW9kdWxlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNT0RVTEVfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobW9kdWxlTWFwcGluZ0VDbGFzcywgTU9EVUxFX01BUFBJTkdfX1BST0pFQ1RfTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobW9kdWxlTWFwcGluZ0VDbGFzcywgTU9EVUxFX01BUFBJTkdfX01PRFVMRSk7Ci0KLQkJZWFyUHJvamVjdE1hcEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFQVJfUFJPSkVDVF9NQVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGVhclByb2plY3RNYXBFQ2xhc3MsIEVBUl9QUk9KRUNUX01BUF9fTUFQUElOR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVhclByb2plY3RNYXBFQ2xhc3MsIEVBUl9QUk9KRUNUX01BUF9fVVRJTElUWV9KQVJfTUFQUElOR1MpOwotCi0JCXV0aWxpdHlKQVJNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFVUSUxJVFlfSkFSX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHV0aWxpdHlKQVJNYXBwaW5nRUNsYXNzLCBVVElMSVRZX0pBUl9NQVBQSU5HX19QUk9KRUNUX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHV0aWxpdHlKQVJNYXBwaW5nRUNsYXNzLCBVVElMSVRZX0pBUl9NQVBQSU5HX19VUkkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gVGhpcyBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlCi0JICogbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkKLQkJCXJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQkvLwkJQ29tbW9uUGFja2FnZUltcGwgdGhlQ29tbW9uUGFja2FnZSA9Ci0JCS8vIChDb21tb25QYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCQkvLwkJSmF2YVJlZlBhY2thZ2VJbXBsIHRoZUphdmFSZWZQYWNrYWdlID0KLQkJLy8gKEphdmFSZWZQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShKYXZhUmVmUGFja2FnZS5lTlNfVVJJKTsKLQkJQXBwbGljYXRpb25QYWNrYWdlSW1wbCB0aGVBcHBsaWNhdGlvblBhY2thZ2UgPSAoQXBwbGljYXRpb25QYWNrYWdlSW1wbCkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQXBwbGljYXRpb25QYWNrYWdlLmVOU19VUkkpOwotCQkvLwkJRWNvcmVQYWNrYWdlSW1wbCB0aGVFY29yZVBhY2thZ2UgPQotCQkvLyAoRWNvcmVQYWNrYWdlSW1wbClFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MobW9kdWxlTWFwcGluZ0VDbGFzcywgTW9kdWxlTWFwcGluZy5jbGFzcywgIk1vZHVsZU1hcHBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE1vZHVsZU1hcHBpbmdfUHJvamVjdE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInByb2plY3ROYW1lIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TW9kdWxlTWFwcGluZ19Nb2R1bGUoKSwgdGhlQXBwbGljYXRpb25QYWNrYWdlLmdldE1vZHVsZSgpLCBudWxsLCAibW9kdWxlIiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGVhclByb2plY3RNYXBFQ2xhc3MsIEVBUlByb2plY3RNYXAuY2xhc3MsICJFQVJQcm9qZWN0TWFwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRFQVJQcm9qZWN0TWFwX01hcHBpbmdzKCksIHRoaXMuZ2V0TW9kdWxlTWFwcGluZygpLCBudWxsLCAibWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RUFSUHJvamVjdE1hcF9VdGlsaXR5SkFSTWFwcGluZ3MoKSwgdGhpcy5nZXRVdGlsaXR5SkFSTWFwcGluZygpLCBudWxsLCAidXRpbGl0eUpBUk1hcHBpbmdzIiwgbnVsbCwgMSwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh1dGlsaXR5SkFSTWFwcGluZ0VDbGFzcywgVXRpbGl0eUpBUk1hcHBpbmcuY2xhc3MsICJVdGlsaXR5SkFSTWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VXRpbGl0eUpBUk1hcHBpbmdfUHJvamVjdE5hbWUoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInByb2plY3ROYW1lIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VXRpbGl0eUpBUk1hcHBpbmdfVXJpKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJ1cmkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci19IC8vTW9kdWxlbWFwUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwU3dpdGNoLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZWFyY3JlYXRpb24vbW9kdWxlbWFwL01vZHVsZW1hcFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjVkZjRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvTW9kdWxlbWFwU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24ubW9kdWxlbWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgTW9kdWxlbWFwU3dpdGNoIHt9Ci0gKiBAZGVwcmVjYXRlZAotICogVXNlCi0gKiA8cD4KLSAqIE5lZWQgdG8gdXNlIHRoZSBNb2R1bGVDb3JlIGFuZCBXb3JrYmVuY2hDb21wb25lbnQgQXBpIHRvIGdldCB0byB0aGUgcmVmZXJlbmNlZCBtb2R1bGVzCi0gKiBhcyB3aXRoIHRoZSBGbGV4aWJsZSBwcm9qZWN0IGNoYW5nZXMgYSAubW9kdWxlbWFwcyBmaWxlIHdpbGwgbm90IGV4aXN0IGluIGFuIEVBUiBtb2R1bGUgYW5kCi0gKiBhbGwgdGhlIGluZm8gdGhhdCB3YXMgY2FwdHVyZWQgaW4gLm1vZHVsZW1hcHMgZmlsZSB3aWxsIGlzIG5vdyBjYXB0dXJlZCBpbiB0aGUgLmNvbXBvbmVudCBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2R1bGVtYXBTd2l0Y2ggewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZSA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBNb2R1bGVtYXBQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBNb2R1bGVtYXBTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTW9kdWxlbWFwUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlFQ2xhc3MgdGhlRUNsYXNzID0gdGhlRU9iamVjdC5lQ2xhc3MoKTsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlzd2l0Y2ggKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5NT0RVTEVfTUFQUElORyA6IHsKLQkJCQkJTW9kdWxlTWFwcGluZyBtb2R1bGVNYXBwaW5nID0gKE1vZHVsZU1hcHBpbmcpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTW9kdWxlTWFwcGluZyhtb2R1bGVNYXBwaW5nKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5FQVJfUFJPSkVDVF9NQVAgOiB7Ci0JCQkJCUVBUlByb2plY3RNYXAgZWFyUHJvamVjdE1hcCA9IChFQVJQcm9qZWN0TWFwKSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUVBUlByb2plY3RNYXAoZWFyUHJvamVjdE1hcCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuVVRJTElUWV9KQVJfTUFQUElORyA6IHsKLQkJCQkJVXRpbGl0eUpBUk1hcHBpbmcgdXRpbGl0eUpBUk1hcHBpbmcgPSAoVXRpbGl0eUpBUk1hcHBpbmcpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlVXRpbGl0eUpBUk1hcHBpbmcodXRpbGl0eUpBUk1hcHBpbmcpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRUFSUHJvamVjdE1hcChFQVJQcm9qZWN0TWFwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VNb2R1bGVNYXBwaW5nKE1vZHVsZU1hcHBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVV0aWxpdHlKQVJNYXBwaW5nKFV0aWxpdHlKQVJNYXBwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL01vZHVsZW1hcFN3aXRjaApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9VdGlsaXR5SkFSTWFwcGluZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9VdGlsaXR5SkFSTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTIzNTYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvVXRpbGl0eUpBUk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLQotLyoqCi0gKiBAbGFzdGdlbiBpbnRlcmZhY2UgVXRpbGl0eUpBUk1hcHBpbmcgZXh0ZW5kcyBFT2JqZWN0IHt9Ci0gKiBAZGVwcmVjYXRlZAotICogVXNlCi0gKiA8cD4KLSAqIAkJTmVlZCB0byB1c2UgdGhlIE1vZHVsZUNvcmUgYW5kIFdvcmtiZW5jaENvbXBvbmVudCBBcGkgdG8gZ2V0IHRvIHRoZSByZWZlcmVuY2VkIG1vZHVsZXMKLSAqIGFzIHdpdGggdGhlIEZsZXhpYmxlIHByb2plY3QgY2hhbmdlcyBhIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBub3QgZXhpc3QgaW4gYW4gRUFSIG1vZHVsZSBhbmQKLSAqIGFsbCB0aGUgaW5mbyB0aGF0IHdhcyBjYXB0dXJlZCBpbiAubW9kdWxlbWFwcyBmaWxlIHdpbGwgaXMgbm93IGNhcHR1cmVkIGluIHRoZSAuY29tcG9uZW50IGZpbGUKLSAqLwotcHVibGljIGludGVyZmFjZSBVdGlsaXR5SkFSTWFwcGluZyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFByb2plY3ROYW1lIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRQcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBuZXcgdmFsdWUgb2YgdGhlIFByb2plY3ROYW1lIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIFVyaSBhdHRyaWJ1dGUKLQkgKi8KLQlTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgVXJpIGF0dHJpYnV0ZQotCSAqLwotCXZvaWQgc2V0VXJpKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy9VdGlsaXR5SkFSTWFwcGluZwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9VdGlsaXR5SkFSTWFwcGluZ0ltcGwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9lYXJjcmVhdGlvbi9tb2R1bGVtYXAvVXRpbGl0eUpBUk1hcHBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MzU0NTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2VhcmNyZWF0aW9uL21vZHVsZW1hcC9VdGlsaXR5SkFSTWFwcGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyOwotCi0KLS8qKgotICogQGxhc3RnZW4gY2xhc3MgVXRpbGl0eUpBUk1hcHBpbmdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBVdGlsaXR5SkFSTWFwcGluZywgRU9iamVjdCB7fQotICogQGRlcHJlY2F0ZWQKLSAqIFVzZQotICogPHA+Ci0gKiBOZWVkIHRvIHVzZSB0aGUgTW9kdWxlQ29yZSBhbmQgV29ya2JlbmNoQ29tcG9uZW50IEFwaSB0byBnZXQgdG8gdGhlIHJlZmVyZW5jZWQgbW9kdWxlcwotICogYXMgd2l0aCB0aGUgRmxleGlibGUgcHJvamVjdCBjaGFuZ2VzIGEgLm1vZHVsZW1hcHMgZmlsZSB3aWxsIG5vdCBleGlzdCBpbiBhbiBFQVIgbW9kdWxlIGFuZAotICogYWxsIHRoZSBpbmZvIHRoYXQgd2FzIGNhcHR1cmVkIGluIC5tb2R1bGVtYXBzIGZpbGUgd2lsbCBpcyBub3cgY2FwdHVyZWQgaW4gdGhlIC5jb21wb25lbnQgZmlsZQotICovCi1wdWJsaWMgY2xhc3MgVXRpbGl0eUpBUk1hcHBpbmdJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBVdGlsaXR5SkFSTWFwcGluZyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3ROYW1lKCkgPGVtPlByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFByb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9qZWN0TmFtZSA9IFBST0pFQ1RfTkFNRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXJpKCkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXJpID0gVVJJX0VERUZBVUxUOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFV0aWxpdHlKQVJNYXBwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2R1bGVtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRVdGlsaXR5SkFSTWFwcGluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHByb2plY3ROYW1lOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3ROYW1lKFN0cmluZyBuZXdQcm9qZWN0TmFtZSkgewotCQlTdHJpbmcgb2xkUHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLQkJcHJvamVjdE5hbWUgPSBuZXdQcm9qZWN0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kdWxlbWFwUGFja2FnZS5VVElMSVRZX0pBUl9NQVBQSU5HX19QUk9KRUNUX05BTUUsIG9sZFByb2plY3ROYW1lLCBwcm9qZWN0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpKFN0cmluZyBuZXdVcmkpIHsKLQkJU3RyaW5nIG9sZFVyaSA9IHVyaTsKLQkJdXJpID0gbmV3VXJpOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2R1bGVtYXBQYWNrYWdlLlVUSUxJVFlfSkFSX01BUFBJTkdfX1VSSSwgb2xkVXJpLCB1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLlVUSUxJVFlfSkFSX01BUFBJTkdfX1BST0pFQ1RfTkFNRSA6Ci0JCQkJcmV0dXJuIGdldFByb2plY3ROYW1lKCk7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuVVRJTElUWV9KQVJfTUFQUElOR19fVVJJIDoKLQkJCQlyZXR1cm4gZ2V0VXJpKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBNb2R1bGVtYXBQYWNrYWdlLlVUSUxJVFlfSkFSX01BUFBJTkdfX1BST0pFQ1RfTkFNRSA6Ci0JCQkJcmV0dXJuIFBST0pFQ1RfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gcHJvamVjdE5hbWUgIT0gbnVsbCA6ICFQUk9KRUNUX05BTUVfRURFRkFVTFQuZXF1YWxzKHByb2plY3ROYW1lKTsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5VVElMSVRZX0pBUl9NQVBQSU5HX19VUkkgOgotCQkJCXJldHVybiBVUklfRURFRkFVTFQgPT0gbnVsbCA/IHVyaSAhPSBudWxsIDogIVVSSV9FREVGQVVMVC5lcXVhbHModXJpKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5VVElMSVRZX0pBUl9NQVBQSU5HX19QUk9KRUNUX05BTUUgOgotCQkJCXNldFByb2plY3ROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuVVRJTElUWV9KQVJfTUFQUElOR19fVVJJIDoKLQkJCQlzZXRVcmkoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIE1vZHVsZW1hcFBhY2thZ2UuVVRJTElUWV9KQVJfTUFQUElOR19fUFJPSkVDVF9OQU1FIDoKLQkJCQlzZXRQcm9qZWN0TmFtZShQUk9KRUNUX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kdWxlbWFwUGFja2FnZS5VVElMSVRZX0pBUl9NQVBQSU5HX19VUkkgOgotCQkJCXNldFVyaShVUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKEVBUkNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVXRpbGl0eUpBUk1hcHBpbmdJbXBsX1VJXzAiLCBuZXcgT2JqZWN0W117cHJvamVjdE5hbWUsIHVyaX0pKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVXRpbGl0eUpBUk1hcHBpbmdJbXBsCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0NsYXNzcGF0aERlcGVuZGVuY3lSZXNvbHZlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9DbGFzc3BhdGhEZXBlbmRlbmN5UmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTVjZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9DbGFzc3BhdGhEZXBlbmRlbmN5UmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5EZXBlbmRlbmN5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb2x2ZXJzLklSZWZlcmVuY2VSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7CisKKy8qKgorICogVGhpcyBtYXkgbmV2ZXIgYmUgdXNlZCBhbmQgbWF5IGJlIGEgY2FuZGlkYXRlIGZvciBkZWxldGlvbiwgcHJpbWFyaWx5CisgKiBiZWNhdXNlIHRoaXMgcmVmZXJlbmNlIHR5cGUgaXMgbm90IHBlcnNpc3RlZCBpbiB0aGUgY29tcG9uZW50IHhtbCAKKyAqIGFueXdoZXJlIGluc2lkZSB0aGUgamVldG9vbHMgY29kZWJhc2UuIAorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NwYXRoRGVwZW5kZW5jeVJlc29sdmVyIGltcGxlbWVudHMgSVJlZmVyZW5jZVJlc29sdmVyIHsKKworCXB1YmxpYyBib29sZWFuIGNhblJlc29sdmUoSVZpcnR1YWxDb21wb25lbnQgY29udGV4dCwKKwkJCVJlZmVyZW5jZWRDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCkgeworCQlVUkkgaGFuZGxlID0gcmVmZXJlbmNlZENvbXBvbmVudC5nZXRIYW5kbGUoKTsKKwkJU3RyaW5nIHMgPSBoYW5kbGUudG9TdHJpbmcoKTsKKwkJaWYgKHMuc3RhcnRzV2l0aChEdW1teUNsYXNzcGF0aERlcGVuZGVuY3lDb250YWluZXJWaXJ0dWFsQ29tcG9uZW50LkNPTVBPTkVOVF9JRCkpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZSByZXNvbHZlKElWaXJ0dWFsQ29tcG9uZW50IGNvbnRleHQsCisJCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQpIHsKKwkJSVByb2plY3QgcCA9IGNvbnRleHQuZ2V0UHJvamVjdCgpOworCQlEdW1teUNsYXNzcGF0aERlcGVuZGVuY3lDb250YWluZXJWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBuZXcgRHVtbXlDbGFzc3BhdGhEZXBlbmRlbmN5Q29udGFpbmVyVmlydHVhbENvbXBvbmVudCgKKwkJCQlwLCBjb250ZXh0KTsKKwkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZWZlcmVuY2UoY29udGV4dCwgY29tcCk7CisJCXJlZi5zZXRBcmNoaXZlTmFtZShyZWZlcmVuY2VkQ29tcG9uZW50LmdldEFyY2hpdmVOYW1lKCkpOworCQlyZWYuc2V0UnVudGltZVBhdGgocmVmZXJlbmNlZENvbXBvbmVudC5nZXRSdW50aW1lUGF0aCgpKTsKKwkJcmVmLnNldERlcGVuZGVuY3lUeXBlKHJlZmVyZW5jZWRDb21wb25lbnQuZ2V0RGVwZW5kZW5jeVR5cGUoKQorCQkJCS5nZXRWYWx1ZSgpKTsKKwkJcmV0dXJuIHJlZjsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBjYW5SZXNvbHZlKElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSkgeworCQlJVmlydHVhbENvbXBvbmVudCB2YyA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CisJCWlmICh2YyBpbnN0YW5jZW9mIER1bW15Q2xhc3NwYXRoRGVwZW5kZW5jeUNvbnRhaW5lclZpcnR1YWxDb21wb25lbnQpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXB1YmxpYyBSZWZlcmVuY2VkQ29tcG9uZW50IHJlc29sdmUoSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisJCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKKwkJRHVtbXlDbGFzc3BhdGhEZXBlbmRlbmN5Q29udGFpbmVyVmlydHVhbENvbXBvbmVudCBjb21wID0gKER1bW15Q2xhc3NwYXRoRGVwZW5kZW5jeUNvbnRhaW5lclZpcnR1YWxDb21wb25lbnQpdmM7CisJCVJlZmVyZW5jZWRDb21wb25lbnQgcmMgPSBDb21wb25lbnRjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9uZW50Y29yZUZhY3RvcnkoKS5jcmVhdGVSZWZlcmVuY2VkQ29tcG9uZW50KCk7CisJCXJjLnNldEFyY2hpdmVOYW1lKHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpKTsKKwkJcmMuc2V0UnVudGltZVBhdGgocmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCkpOworCQlyYy5zZXRIYW5kbGUoVVJJLmNyZWF0ZVVSSShjb21wLmdldElkKCkpKTsKKwkJLy8gTWFudWFsbHkgc2V0IGNvbnN1bWVzIQorCQlyYy5zZXREZXBlbmRlbmN5VHlwZShEZXBlbmRlbmN5VHlwZS5DT05TVU1FU19MSVRFUkFMKTsKKwkJcmV0dXJuIHJjOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvRHVtbXlDbGFzc3BhdGhEZXBlbmRlbmN5Q29udGFpbmVyVmlydHVhbENvbXBvbmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9EdW1teUNsYXNzcGF0aERlcGVuZGVuY3lDb250YWluZXJWaXJ0dWFsQ29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3ZWZjZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvRHVtbXlDbGFzc3BhdGhEZXBlbmRlbmN5Q29udGFpbmVyVmlydHVhbENvbXBvbmVudC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwubW9kdWxlY29yZS51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5BYnN0cmFjdFJlc291cmNlTGlzdFZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKKworLyoqCisgKiBBIHN0dWIgJ2R1bW15JyByZWZlcmVuY2Ugd2hpY2ggaXMgcmV0dXJuZWQgb24gYSBnZXRSZWZlcmVuY2VzKCkgY2FsbCB0byBhbiBFYXIgcHJvamVjdAorICogd2hlbiBwYXNzZWQgdGhlIElWaXJ0dWFsQ29tcG9uZW50LkRJU1BMQVlBQkxFX1JFRkVSRU5DRVMgdHlwZS4gCisgKi8KK3B1YmxpYyBjbGFzcyBEdW1teUNsYXNzcGF0aERlcGVuZGVuY3lDb250YWluZXJWaXJ0dWFsQ29tcG9uZW50IGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUxpc3RWaXJ0dWFsQ29tcG9uZW50IHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkNsYXNzcGF0aERlcGVuZGVuY2llcyI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwdWJsaWMgRHVtbXlDbGFzc3BhdGhEZXBlbmRlbmN5Q29udGFpbmVyVmlydHVhbENvbXBvbmVudChJUHJvamVjdCBwLAorCQkJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNpbmdDb21wb25lbnQpIHsKKwkJc3VwZXIocCwgcmVmZXJlbmNpbmdDb21wb25lbnQpOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0Rmlyc3RJZFNlZ21lbnQoKSB7CisJCXJldHVybiBDT01QT05FTlRfSUQ7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElDb250YWluZXJbXSBnZXRVbmRlcmx5aW5nQ29udGFpbmVycygpIHsKKwkJcmV0dXJuIG5ldyBJQ29udGFpbmVyW117fTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSVJlc291cmNlW10gZ2V0TG9vc2VSZXNvdXJjZXMoKSB7CisJCXJldHVybiBuZXcgSVJlc291cmNlW117fTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0VhckVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWNvcmUvdXRpbC9FYXJFZGl0QWRhcHRlckZhY3RvcnkuamF2YQppbmRleCA4ODlkYjgwLi4wODc5NjdkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0VhckVkaXRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvRWFyRWRpdEFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTEyLDcgKzEyLDcgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKIApAQCAtMzQsNyArMzQsNyBAQAogCiAJCWlmIChhZGFwdGVyVHlwZSA9PSBFQVJBcnRpZmFjdEVkaXQuQURBUFRFUl9UWVBFIHx8IGFkYXB0ZXJUeXBlID09IEFydGlmYWN0RWRpdC5BREFQVEVSX1RZUEUpIHsKIAkJCUFydGlmYWN0RWRpdE1vZGVsIGVkaXRNb2RlbCA9IChBcnRpZmFjdEVkaXRNb2RlbCkgYWRhcHRhYmxlT2JqZWN0OwotCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChlZGl0TW9kZWwuZ2V0UHJvamVjdCgpKSkKKwkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChlZGl0TW9kZWwuZ2V0UHJvamVjdCgpKSkKIAkJCQlyZXR1cm4gbmV3IEVBUkFydGlmYWN0RWRpdCgoQXJ0aWZhY3RFZGl0TW9kZWwpIGFkYXB0YWJsZU9iamVjdCk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0pFRU1hbmlmZXN0RGlzY2VybmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlY29yZS91dGlsL0pFRU1hbmlmZXN0RGlzY2VybmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0NzE5OAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVjb3JlL3V0aWwvSkVFTWFuaWZlc3REaXNjZXJuZXIuamF2YQpAQCAtMCwwICsxLDI2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgUm9iIFN0cnlrZXIgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLkFyY2hpdmVNYW5pZmVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5JSmF2YUNvbXBvbmVudERpc2Nlcm5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5NYW5pZmVzdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkVhclV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIG1lYW50IHRvIGRpc2NvdmVyIHBvc3NpYmxlIG1hbmlmZXN0IGVudHJpZXMgZm9yIGEgcGFyZW50IC8gY2hpbGQgY29tYm8uCisgKiBUaGlzIG1pZ2h0IGJlIGJldHRlciBpbXBsZW1lbnRlZCB1c2luZyBmbGF0IHZpcnR1YWwgY29tcG9uZW50IG1vZGVsIHRvIG1ha2UgbW9yZSAKKyAqIGFjY3VyYXRlIHVzZSBvZiBjb25zdW1lcywgZXRjLiBCdXQgdGhhdCBjYW4gY2hhbmdlIGxhdGVyIChhcyB1c3VhbCkKKyAqLworcHVibGljIGNsYXNzIEpFRU1hbmlmZXN0RGlzY2VybmVyIGltcGxlbWVudHMgSUphdmFDb21wb25lbnREaXNjZXJuZXIgeworCisJcHVibGljIElQcm9qZWN0W10gZmluZFBhcmVudFByb2plY3RzKElQcm9qZWN0IGNoaWxkKSB7CisJCXJldHVybiBFYXJVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhjaGlsZCk7CisJfQorCisJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZmluZFBvc3NpYmxlTWFuaWZlc3RFbnRyaWVzKAorCQkJSVByb2plY3QgcGFyZW50UHJvamVjdCwgSVByb2plY3QgY2hpbGRQcm9qZWN0KSB7CisJCWlmKCBFYXJVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHBhcmVudFByb2plY3QpKSB7CisJCQlBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IGFsbFBvc3NpYmxlID0gZmluZEFsbFBvc3NpYmxlRW50cmllcyhwYXJlbnRQcm9qZWN0LCBjaGlsZFByb2plY3QpOworCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBhbHJlYWR5UmVmZXJlbmNlZCA9IGZpbmRDdXJyZW50TWFuaWZlc3RFbnRyaWVzKHBhcmVudFByb2plY3QsIGNoaWxkUHJvamVjdCwgYWxsUG9zc2libGUpOworCQkJYWxsUG9zc2libGUucmVtb3ZlQWxsKEFycmF5cy5hc0xpc3QoYWxyZWFkeVJlZmVyZW5jZWQpKTsKKwkJCXJldHVybiBhbGxQb3NzaWJsZS50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVthbGxQb3NzaWJsZS5zaXplKCldKTsKKwkJfQorCQlyZXR1cm4gbmV3IElWaXJ0dWFsUmVmZXJlbmNlW117fTsKKwl9CisJCisJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZmluZFBvc3NpYmxlTWFuaWZlc3RFbnRyaWVzKAorCQkJSVByb2plY3QgcGFyZW50UHJvamVjdCwgSVByb2plY3QgY2hpbGRQcm9qZWN0LCBJVmlydHVhbFJlZmVyZW5jZVtdIGN1cnJlbnRFbnRyaWVzKSB7CisJCWlmKCBFYXJVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHBhcmVudFByb2plY3QpKSB7CisJCQlBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IGFsbFBvc3NpYmxlID0gZmluZEFsbFBvc3NpYmxlRW50cmllcyhwYXJlbnRQcm9qZWN0LCBjaGlsZFByb2plY3QpOworCQkJYWxsUG9zc2libGUucmVtb3ZlQWxsKEFycmF5cy5hc0xpc3QoY3VycmVudEVudHJpZXMpKTsKKwkJCXJldHVybiBhbGxQb3NzaWJsZS50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVthbGxQb3NzaWJsZS5zaXplKCldKTsKKwkJfQorCQlyZXR1cm4gbmV3IElWaXJ0dWFsUmVmZXJlbmNlW117fTsKKwl9CisKKwkKKwlwcm90ZWN0ZWQgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiBmaW5kQWxsUG9zc2libGVFbnRyaWVzKElQcm9qZWN0IHBhcmVudFByb2plY3QsIElQcm9qZWN0IGNoaWxkUHJvamVjdCkgeworCQlJVmlydHVhbENvbXBvbmVudCBlYXIgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwYXJlbnRQcm9qZWN0KTsKKwkJSVZpcnR1YWxSZWZlcmVuY2VbXSBoYXJkUmVmcyA9IGVhci5nZXRSZWZlcmVuY2VzKCk7CisJCUlWaXJ0dWFsUmVmZXJlbmNlW10gYWN0dWFsX3RtcCA9IHRyaW1FYXJIYXJkUmVmcyhlYXIsIGNoaWxkUHJvamVjdCwgaGFyZFJlZnMpOworCQlJVmlydHVhbFJlZmVyZW5jZVtdIGFjdHVhbF9jbGVhbiA9IGNsZWFuSGFyZFJlZnMoYWN0dWFsX3RtcCwgY2hpbGRQcm9qZWN0LCBoYXJkUmVmcyk7CisJCUFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gcmVmcyA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7CisJCXJlZnMuYWRkQWxsKEFycmF5cy5hc0xpc3QoYWN0dWFsX2NsZWFuKSk7CisJCXJldHVybiByZWZzOworCX0KKwkKKwkvKioKKwkgKiBQcnVuZSBvdXQgdW5hY2NlcHRhYmxlIHJlZmVyZW5jZSB0eXBlcworCSAqIEBwYXJhbSBjaGlsZFByb2plY3QKKwkgKiBAcGFyYW0gaGFyZFJlZnMKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBJVmlydHVhbFJlZmVyZW5jZVtdIHRyaW1FYXJIYXJkUmVmcyhJVmlydHVhbENvbXBvbmVudCBlYXIsIElQcm9qZWN0IGNoaWxkUHJvamVjdCwgSVZpcnR1YWxSZWZlcmVuY2VbXSBoYXJkUmVmcykgeworCQlTdHJpbmcgZWFyTGliRGlyID0gRWFyVXRpbGl0aWVzLmdldEVBUkxpYkRpcihlYXIpOworCQlJUGF0aCBlYXJMaWJEaXJQYXRoID0gbnVsbDsKKwkJaWYoZWFyTGliRGlyICE9IG51bGwpCisJCQllYXJMaWJEaXJQYXRoID0gbmV3IFBhdGgoZWFyTGliRGlyKS5tYWtlUmVsYXRpdmUoKTsJCQorCQlBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHJlZnMgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPigpOworCQkvLyBXZSBoYXZlIHRvIHBydW5lIG91dCBzZWxmLXJlZmVyZW5jZXMgCisJCWZvciggaW50IGkgPSAwOyBpIDwgaGFyZFJlZnMubGVuZ3RoOyBpKysgKSB7CisJCQkvLyBUaGlzIGlzIGFjdHVhbGx5IGhhcmQgdG8gbWFrZSBzdXJlIHdlJ3JlIG5vdCBhZGRpbmcgb3Vyc2VsZgorCQkJaWYoKGhhcmRSZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5pc0JpbmFyeSgpIAorCQkJCQl8fCBoYXJkUmVmc1tpXS5nZXREZXBlbmRlbmN5VHlwZSgpID09IElWaXJ0dWFsUmVmZXJlbmNlLkRFUEVOREVOQ1lfVFlQRV9DT05TVU1FUworCQkJCQl8fCAhaGFyZFJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKS5lcXVhbHMoY2hpbGRQcm9qZWN0KSkKKwkJCQkJJiYgaGFyZFJlZnNbaV0uZ2V0QXJjaGl2ZU5hbWUoKS5lbmRzV2l0aCgiamFyIikpIHsgLy8kTk9OLU5MUy0xJCAvLyBPbmx5IGphcidzIGFyZSBsZWdhbCBpbiBNQU5JRkVTVAorCQkJCWlmKGVhckxpYkRpclBhdGggPT0gbnVsbCB8fCBlYXJMaWJEaXJQYXRoLmlzRW1wdHkoKSB8fCAhaGFyZFJlZnNbaV0uZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKS5lcXVhbHMoZWFyTGliRGlyUGF0aCkpIHsvLyBKYXJzIGluIHRoZSBFQVIncyBsaWJyYXJ5IGRpcmVjdG9yeSBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBNQU5JRkVTVCBmb3IgRUU1L0VFNgorCQkJCQlyZWZzLmFkZChoYXJkUmVmc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiByZWZzLnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW3JlZnMuc2l6ZSgpXSk7CisJfQorCQorCS8qKgorCSAqIE1ha2Ugc3VyZSB0aGUgcnVudGltZSBwYXRoICsgYXJjaGl2ZU5hbWUgaXMgd2hhdCBzaG91bGQgZ28gaW4gdGhlIG1hbmlmZXN0IGZpbGUgCisJICogaWYgdGhpcyByZWZlcmVuY2UgaXMgc2VsZWN0ZWQKKwkgKiAKKwkgKiBAcGFyYW0gb3JpZ2luYWwKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBJVmlydHVhbFJlZmVyZW5jZVtdIGNsZWFuSGFyZFJlZnMoSVZpcnR1YWxSZWZlcmVuY2VbXSBvcmlnaW5hbCwgSVByb2plY3QgY2hpbGRQcm9qZWN0LCBJVmlydHVhbFJlZmVyZW5jZVtdIGhhcmRSZWZzKSB7CisJCUlWaXJ0dWFsUmVmZXJlbmNlIGNoaWxkUHJvamVjdFZpcnR1YWxSZWYgPSBudWxsOworCQlmb3IoIGludCBpID0gMDsgaSA8IGhhcmRSZWZzLmxlbmd0aDsgaSsrICkgeworCQkJaWYoaGFyZFJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKS5lcXVhbHMoY2hpbGRQcm9qZWN0KSkgeworCQkJCWNoaWxkUHJvamVjdFZpcnR1YWxSZWYgPSBoYXJkUmVmc1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQorCQlJVmlydHVhbFJlZmVyZW5jZVtdIG5ld1JlZnMgPSBuZXcgSVZpcnR1YWxSZWZlcmVuY2Vbb3JpZ2luYWwubGVuZ3RoXTsKKwkJZm9yKCBpbnQgaSA9IDA7IGkgPCBuZXdSZWZzLmxlbmd0aDsgaSsrICkgeworCQkJbmV3UmVmc1tpXSA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVmZXJlbmNlKG9yaWdpbmFsW2ldLmdldEVuY2xvc2luZ0NvbXBvbmVudCgpLCAKKwkJCQkJb3JpZ2luYWxbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLCBjYWxjdWxhdGVNYW5pZmVzdFJlbGF0aXZlUnVudGltZVBhdGgoY2hpbGRQcm9qZWN0VmlydHVhbFJlZiwgb3JpZ2luYWxbaV0pKTsKKwkJCW5ld1JlZnNbaV0uc2V0RGVwZW5kZW5jeVR5cGUob3JpZ2luYWxbaV0uZ2V0RGVwZW5kZW5jeVR5cGUoKSk7CisJCQluZXdSZWZzW2ldLnNldEFyY2hpdmVOYW1lKChuZXcgUGF0aChvcmlnaW5hbFtpXS5nZXRBcmNoaXZlTmFtZSgpKSkubGFzdFNlZ21lbnQoKSk7CisJCX0KKwkJcmV0dXJuIG5ld1JlZnM7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgSVBhdGggY2FsY3VsYXRlTWFuaWZlc3RSZWxhdGl2ZVJ1bnRpbWVQYXRoKElWaXJ0dWFsUmVmZXJlbmNlIGNoaWxkUHJvamVjdFZpcnR1YWxSZWYsIElWaXJ0dWFsUmVmZXJlbmNlIG1hbmlmZXN0RW50cnlSZWZlcmVuY2UpIHsKKwkJSVBhdGggbWFuaWZlc3RFbnRyeVBhdGggPSBtYW5pZmVzdEVudHJ5UmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCk7CisJCS8vIFJldHVybiB0aGUgbWFuaWZlc3RFbnRyeVJlZmVyZW5jZSdzIHJlbGF0aXZlIHJ1bnRpbWUgcGF0aCBpZiB0aGUgY2hpbGQgcHJvamVjdCBpcyBhdCByb290IGxldmVsCisJCWlmKGNoaWxkUHJvamVjdFZpcnR1YWxSZWYgPT0gbnVsbCB8fCBjaGlsZFByb2plY3RWaXJ0dWFsUmVmLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKCIvIikpIC8vJE5PTi1OTFMtMSQKKwkJCXJldHVybiBtYW5pZmVzdEVudHJ5UGF0aC5tYWtlUmVsYXRpdmUoKTsKKwkJSVBhdGggY2hpbGRQcm9qZWN0UnVudGltZVBhdGggPSBjaGlsZFByb2plY3RWaXJ0dWFsUmVmLmdldFJ1bnRpbWVQYXRoKCk7CisJCQorCQkvLyBSZXR1cm4gYW4gZW1wdHkgcnVudGltZSBwYXRoIGlmIHRoZSBjaGlsZCBwcm9qZWN0IGFuZCBtYW5pZmVzdCBlbnRyeSBoYXZlIHNhbWUgcnVudGltZSBwYXRoCisJCWlmKGNoaWxkUHJvamVjdFJ1bnRpbWVQYXRoLmVxdWFscyhtYW5pZmVzdEVudHJ5UGF0aCkpIAorCQkJcmV0dXJuIG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkKKwkJU3RyaW5nW10gY2hpbGRQcm9qZWN0Rm9sZGVycyA9IGNoaWxkUHJvamVjdFJ1bnRpbWVQYXRoLnNlZ21lbnRzKCk7CisJCVN0cmluZ1tdIG1hbmlmZXN0RW50cnlGb2xkZXJzID0gbWFuaWZlc3RFbnRyeVBhdGguc2VnbWVudHMoKTsKKwkJaW50IGNvbW1vbkZvbGRlckNvdW50ID0gMDsKKwkJZm9yKGludCBpID0gMDsgaSA8IGNoaWxkUHJvamVjdEZvbGRlcnMubGVuZ3RoOyBpKyspIHsKKwkJCWlmKGkgPj0gbWFuaWZlc3RFbnRyeUZvbGRlcnMubGVuZ3RoIHx8ICFjaGlsZFByb2plY3RGb2xkZXJzW2ldLmVxdWFscyhtYW5pZmVzdEVudHJ5Rm9sZGVyc1tpXSkpCisJCQkJYnJlYWs7CisJCQljb21tb25Gb2xkZXJDb3VudCsrOworCQl9CisJCWZpbmFsIFN0cmluZyB1cE9uZUxldmVsID0gIi4uLyI7IC8vJE5PTi1OTFMtMSQKKwkJU3RyaW5nIHJlc3VsdFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCisJCWZvcihpbnQgaSA9IDA7IGkgPCBjaGlsZFByb2plY3RGb2xkZXJzLmxlbmd0aCAtIGNvbW1vbkZvbGRlckNvdW50OyBpKyspIHsKKwkJCXJlc3VsdFN0cmluZyArPSB1cE9uZUxldmVsOworCQl9CisJCXJldHVybiBuZXcgUGF0aChyZXN1bHRTdHJpbmcpLmFwcGVuZChtYW5pZmVzdEVudHJ5UGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGNvbW1vbkZvbGRlckNvdW50KSk7CisJfQorCQorCisJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZmluZEN1cnJlbnRNYW5pZmVzdEVudHJpZXMoCisJCQlJUHJvamVjdCBwYXJlbnRQcm9qZWN0LCBJUHJvamVjdCBjaGlsZFByb2plY3QpIHsKKwkJcmV0dXJuIGZpbmRDdXJyZW50TWFuaWZlc3RFbnRyaWVzKHBhcmVudFByb2plY3QsIGNoaWxkUHJvamVjdCwgCisJCQkJZmluZEFsbFBvc3NpYmxlRW50cmllcyhwYXJlbnRQcm9qZWN0LCBjaGlsZFByb2plY3QpKTsKKwl9CisJCisJcHJvdGVjdGVkIElWaXJ0dWFsUmVmZXJlbmNlW10gZmluZEN1cnJlbnRNYW5pZmVzdEVudHJpZXMoCisJCQlJUHJvamVjdCBwYXJlbnRQcm9qZWN0LCBJUHJvamVjdCBjaGlsZFByb2plY3QsIEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gYWxsUG9zc2libGVFbnRyaWVzKSB7CisKKwkJQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiBjdXJyZW50RW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7CisJCQorCQlJRmlsZSBtYW5pZmVzdEZpbGUgPSBnZXRNYW5pZmVzdEZpbGUoY2hpbGRQcm9qZWN0KTsKKwkJaWYobWFuaWZlc3RGaWxlICE9IG51bGwpIHsKKwkJCUFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdCA9IE1hbmlmZXN0VXRpbGl0aWVzLmdldE1hbmlmZXN0KG1hbmlmZXN0RmlsZSk7CisJCQlMaXN0PFN0cmluZz4gZW50cmllcyA9IEFycmF5cy5hc0xpc3QobWFuaWZlc3QuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCkpOworCQkJSXRlcmF0b3I8SVZpcnR1YWxSZWZlcmVuY2U+IGkgPSBhbGxQb3NzaWJsZUVudHJpZXMuaXRlcmF0b3IoKTsKKwkJCUlWaXJ0dWFsUmVmZXJlbmNlIGN1cnJlbnRJOworCQkJCisJCQkvLyBBZGQgZW50cmllcyB0aGF0IGFyZSBpbiB0aGUgTWFuaWZlc3QKKwkJCXdoaWxlKGkuaGFzTmV4dCgpKSB7CisJCQkJY3VycmVudEkgPSBpLm5leHQoKTsKKwkJCQlTdHJpbmcgY3VycmVudEVudHJ5ID0gY3VycmVudEkuZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQoKG5ldyBQYXRoKGN1cnJlbnRJLmdldEFyY2hpdmVOYW1lKCkpKS5sYXN0U2VnbWVudCgpKS50b1N0cmluZygpOworCQkJCWlmKGVudHJpZXMuY29udGFpbnMoY3VycmVudEVudHJ5KSkKKwkJCQkJY3VycmVudEVudHJpZXMuYWRkKGN1cnJlbnRJKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gY3VycmVudEVudHJpZXMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbY3VycmVudEVudHJpZXMuc2l6ZSgpXSk7CisJfQorCisJcHJvdGVjdGVkIElGaWxlIGdldE1hbmlmZXN0RmlsZShJUHJvamVjdCBjaGlsZCkgeworCQlJVmlydHVhbENvbXBvbmVudCByb290ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoY2hpbGQpOworCQlJVmlydHVhbEZvbGRlciByb290Rm9sZGVyID0gcm9vdC5nZXRSb290Rm9sZGVyKCk7CisJCUlWaXJ0dWFsRmlsZSB2ZiA9IHJvb3RGb2xkZXIuZ2V0RmlsZShuZXcgUGF0aCgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSk7IC8vJE5PTi1OTFMtMSQKKwkJaWYoIHZmLmV4aXN0cygpICkKKwkJCXJldHVybiB2Zi5nZXRVbmRlcmx5aW5nRmlsZSgpOworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJLyoqCisJICogVGhpcyBpcyB0aGUgdXNlY2FzZSB3ZSdkIGxpa2UgdG8gZGVwcmVjYXRlLCBvbmUgZGF5LiBPbmUgZGF5Li4uLi4KKwkgKiAoVGhvdWdoIGtvbnN0YW50aW4gc2F5cyBOTykKKwkgKiBAcGFyYW0gcGFyZW50UHJvamVjdAorCSAqIEBwYXJhbSBoYXJkUmVmcworCSAqIEByZXR1cm4KKwkgKi8KKy8vCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2VbXSBMRUdBQ1lfZ2V0Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKElQcm9qZWN0IHBhcmVudFByb2plY3QsIElWaXJ0dWFsUmVmZXJlbmNlW10gaGFyZFJlZnMpIHsKKy8vCQlBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IHJldHZhbCA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7CisvLwkJQXJyYXlMaXN0PElQcm9qZWN0PiBzZWVuUHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0PigpOworLy8JCXNlZW5Qcm9qZWN0cy5hZGQocGFyZW50UHJvamVjdCk7CisvLwkJZm9yKCBpbnQgaSA9IDA7IGkgPCBoYXJkUmVmcy5sZW5ndGg7IGkrKyApIHsKKy8vCQkJaWYoIGhhcmRSZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIElDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXIpIHsKKy8vCQkJCS8vIEFscmVhZHkgZmxhZ2dlZCBjbGFzc3BhdGhzCisvLwkJCQlmaW5hbCBJQ2xhc3NwYXRoRGVwZW5kZW5jeVByb3ZpZGVyIGoyZWVDb21wID0gKElDbGFzc3BhdGhEZXBlbmRlbmN5UHJvdmlkZXIpIGhhcmRSZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKKy8vCQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGoyZWVDb21wLmdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKCk7CisvLwkJCQlmb3IoIGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKysgKSB7CisvLwkJCQkJaWYoICEoKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50KXJlZnNbal0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKS5pc0NsYXNzRm9sZGVyKCkpIHsKKy8vCQkJCQkJLy8gQ2xlYW4gdGhpcyByZWZlcmVuY2UncyBydW50aW1lIHBhdGgKKy8vCQkJCQkJSVBhdGggbmV3UnVudGltZVBhdGggPSByZWZzW2pdLmdldFJ1bnRpbWVQYXRoKCk7CisvLwkJCQkJCWlmKCBuZXdSdW50aW1lUGF0aC50b1N0cmluZygpLnN0YXJ0c1dpdGgoIi4uLyIpKSAvLyROT04tTkxTLTEkCisvLwkJCQkJCQluZXdSdW50aW1lUGF0aCA9IG5ldyBQYXRoKG5ld1J1bnRpbWVQYXRoLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpKS5tYWtlUmVsYXRpdmUoKTsKKy8vCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgdG1wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZWZlcmVuY2UocmVmc1tqXS5nZXRFbmNsb3NpbmdDb21wb25lbnQoKSwgCisvLwkJCQkJCQkJcmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCksIG5ld1J1bnRpbWVQYXRoKTsKKy8vCQkJCQkJdG1wLnNldERlcGVuZGVuY3lUeXBlKHJlZnNbal0uZ2V0RGVwZW5kZW5jeVR5cGUoKSk7CisvLwkJCQkJCXRtcC5zZXRBcmNoaXZlTmFtZShyZWZzW2pdLmdldEFyY2hpdmVOYW1lKCkpOworLy8JCQkJCQlyZXR2YWwuYWRkKHRtcCk7CisvLwkJCQkJfQorLy8JCQkJfQorLy8JCQl9CisvLwkJfQorLy8JCXJldHVybiByZXR2YWwudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbcmV0dmFsLnNpemUoKV0pOworLy8JfQorLy8JCQkvLyBOb3cgZmluZCAqcG90ZW50aWFsKiBlbnRyaWVzCisvLwkJCUlQcm9qZWN0IGNwID0gaGFyZFJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmdldFByb2plY3QoKTsKKy8vCQkJaWYoICFzZWVuUHJvamVjdHMuY29udGFpbnMoY3ApKSB7CisvLwkJCQlzZWVuUHJvamVjdHMuYWRkKGNwKTsKKy8vCQkJCUlKYXZhUHJvamVjdExpdGUgbGl0ZSA9IEphdmFDb3JlTGl0ZS5jcmVhdGUoY3ApOworLy8JCQkJdHJ5IHsKKy8vCQkJCQlMaXN0PElDbGFzc3BhdGhFbnRyeT4gZW50cmllcyA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldFBvdGVudGlhbENvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhsaXRlKTsKKy8vCQkJCQlJdGVyYXRvcjxJQ2xhc3NwYXRoRW50cnk+IGsgPSBlbnRyaWVzLml0ZXJhdG9yKCk7CisvLwkJCQkJd2hpbGUoay5oYXNOZXh0KCkpIHsKKy8vCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgdG1wID0gTEVHQUNZX2NvbnZlcnRDbGFzc3BhdGhFbnRyeShjcCwgay5uZXh0KCkpOworLy8JCQkJCQlpZiggdG1wICE9IG51bGwgKQorLy8JCQkJCQkJcmV0dmFsLmFkZCh0bXApOworLy8JCQkJCX0KKy8vCQkJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UgKSB7fQorLy8JCQl9CisvLwkJfQorCisJCisvLwkKKy8vCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2UgTEVHQUNZX2NvbnZlcnRDbGFzc3BhdGhFbnRyeShJUHJvamVjdCBwcm9qZWN0LCBJQ2xhc3NwYXRoRW50cnkgZW50cnkpIHsKKy8vCQlJVmlydHVhbENvbXBvbmVudCB0bXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKKy8vCQlmaW5hbCBJUGF0aCBlbnRyeUxvY2F0aW9uID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0RW50cnlMb2NhdGlvbihlbnRyeSk7CisvLwkJaWYoZW50cnlMb2NhdGlvbiAhPSBudWxsICYmICFDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5pc0NsYXNzRm9sZGVyRW50cnkoZW50cnkpKSB7CisvLyAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmliID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuY2hlY2tGb3JDb21wb25lbnREZXBlbmRlbmN5QXR0cmlidXRlKAorLy8gICAgICAgICAgICAJCWVudHJ5LCBEZXBlbmRlbmN5QXR0cmlidXRlVHlwZS5DTEFTU1BBVEhfQ09NUE9ORU5UX0RFUEVOREVOQ1ksIGZhbHNlKTsKKy8vICAgICAgICAgICAgYm9vbGVhbiBpc1dlYkFwcCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCk7CisvLyAgICAgICAgICAgIElQYXRoIHJ1bnRpbWVQYXRoID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0UnVudGltZVBhdGgoYXR0cmliLCBpc1dlYkFwcCwgZmFsc2UpOworLy8JCQlTdHJpbmcgY29tcG9uZW50UGF0aCA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkNMQVNTUEFUSEFSQ0hJVkVUWVBFCisvLwkJCQkrIElQYXRoLlNFUEFSQVRPUiArIGVudHJ5TG9jYXRpb24udG9Qb3J0YWJsZVN0cmluZygpOworLy8JCQlJVmlydHVhbENvbXBvbmVudCBlbnRyeUNvbXBvbmVudCA9IG5ldyBDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCgKKy8vCQkJCQlwcm9qZWN0LCBjb21wb25lbnRQYXRoLCBmYWxzZSk7CisvLwkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIGVudHJ5UmVmZXJlbmNlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZWZlcmVuY2UodG1wLCBlbnRyeUNvbXBvbmVudCwgcnVudGltZVBhdGgpOworLy8JCQkoKFZpcnR1YWxSZWZlcmVuY2UpIGVudHJ5UmVmZXJlbmNlKS5zZXREZXJpdmVkKHRydWUpOworLy8JCQllbnRyeVJlZmVyZW5jZS5zZXRBcmNoaXZlTmFtZShDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRBcmNoaXZlTmFtZShlbnRyeSkpOworLy8JCQlyZXR1cm4gZW50cnlSZWZlcmVuY2U7CisvLwkJfQorLy8JCXJldHVybiBudWxsOworLy8JfQorCQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWV4dGVuc2lvbi9FYXJNb2R1bGVFeHRlbnNpb25JbXBsLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlZXh0ZW5zaW9uL0Vhck1vZHVsZUV4dGVuc2lvbkltcGwuamF2YQppbmRleCBkNjcxMjBkLi4yNjAyMTRkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlZXh0ZW5zaW9uL0Vhck1vZHVsZUV4dGVuc2lvbkltcGwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlZXh0ZW5zaW9uL0Vhck1vZHVsZUV4dGVuc2lvbkltcGwuamF2YQpAQCAtMjcsNyArMjcsNiBAQAogCSAqLwogCXB1YmxpYyBFYXJNb2R1bGVFeHRlbnNpb25JbXBsKCkgewogCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWV4dGVuc2lvbi9FYXJNb2R1bGVFeHRlbnNpb25SZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWV4dGVuc2lvbi9FYXJNb2R1bGVFeHRlbnNpb25SZWdpc3RyeS5qYXZhCmluZGV4IDNhOWVkMTQuLjg3MjE0MWQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVleHRlbnNpb24vRWFyTW9kdWxlRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlZXh0ZW5zaW9uL0Vhck1vZHVsZUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKQEAgLTQ4LDYgKzQ4LDcgQEAKIAkgKiByZWFkRWxlbWVudCgpIC0gcGFyc2UgYW5kIGRlYWwgdy8gYW4gZXh0ZW5zaW9uIGxpa2U6IDxlYXJNb2R1bGVFeHRlbnNpb24gZXh0ZW5zaW9uQ2xhc3MgPQogCSAqICJjb20uaWJtLmV0b29scy53ZWIucGx1Z2luLldlYk1vZHVsZUV4dGVuc2lvbkltcGwiLz4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewogCQlpZiAoIWVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTEVNRU5UX0VBUk1PRFVMRV9FWFRFTlNJT04pKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtNTYsOCArNTcsNyBAQAogCQl0cnkgewogCQkJZXh0ZW5zaW9uID0gKEVhck1vZHVsZUV4dGVuc2lvbikgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKE1PRFVMRV9FWFRFTlNJT05fQ0xBU1MpOwogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9CiAJCWlmIChleHRlbnNpb24gIT0gbnVsbCkKIAkJCWFkZE1vZHVsZUV4dGVuc2lvbihleHRlbnNpb24pOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWV4dGVuc2lvbi9XZWJNb2R1bGVFeHRlbnNpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9tb2R1bGVleHRlbnNpb24vV2ViTW9kdWxlRXh0ZW5zaW9uLmphdmEKaW5kZXggY2Y5YTVkMC4uZDY2NTE2MSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL21vZHVsZWV4dGVuc2lvbi9XZWJNb2R1bGVFeHRlbnNpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvbW9kdWxlZXh0ZW5zaW9uL1dlYk1vZHVsZUV4dGVuc2lvbi5qYXZhCkBAIC0yNCw3ICsyNCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVKYXZhUHJvamVjdEluZm87Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVOYXR1cmU7CiAKIAogLyoqCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9mYWNldC9FQVJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9mYWNldC9FQVJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggOTE5MDEyYi4uOGFkNjJlMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvZmFjZXQvRUFSRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L2ZhY2V0L0VBUkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogCQlzdXBlcigpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGluaXQoKSB7CiAJCXN1cGVyLmluaXQoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9mYWNldC9VdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCBmYjdiZGI0Li43N2YzNGExIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9mYWNldC9VdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9mYWNldC9VdGlsaXR5RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMTAsMTMgKzEwLDE2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5mYWNldDsKIAoraW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5KYXZhRmFjZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSVV0aWxpdHlGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKQEAgLTI5LDYgKzMyLDcgQEAKIAkJc3VwZXIoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCWlmIChGQUNFVF9JRC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewogCQkJcmV0dXJuIFVUSUxJVFk7CkBAIC00MSwzMSArNDUsNDQgQEAKIAkJICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjIAogCQkgICAgICAgID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSBnZXRQcm9wZXJ0eSggRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSApOwogCQkgICAgCi0JCSAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqID0gZnBqd2MuZ2V0RmFjZXRlZFByb2plY3QoKTsKLQkJICAgIAotCQkgICAgaWYoIGZwai5oYXNQcm9qZWN0RmFjZXQoIEphdmFGYWNldC5GQUNFVCApICkKKwkJICAgIGlmKCB0aGlzLmphdmFGYWNldEluc3RhbGxDb25maWcgIT0gbnVsbCApCiAJCSAgICB7Ci0JCSAgICAgICAgdHJ5CisJCSAgICAgICAgZmluYWwgTGlzdDxJUGF0aD4gc291cmNlRm9sZGVycyA9IHRoaXMuamF2YUZhY2V0SW5zdGFsbENvbmZpZy5nZXRTb3VyY2VGb2xkZXJzKCk7CisJCSAgICAgICAgCisJCSAgICAgICAgaWYoICEgc291cmNlRm9sZGVycy5pc0VtcHR5KCkgKQogCQkgICAgICAgIHsKLSAgICAJCSAgICAgICAgZmluYWwgSUphdmFQcm9qZWN0IGpwaiA9IEphdmFDb3JlLmNyZWF0ZSggZnBqLmdldFByb2plY3QoKSApOwotICAgIAkJICAgICAgICAKLSAgICAJCSAgICAgICAgZm9yKCBJQ2xhc3NwYXRoRW50cnkgY3BlIDoganBqLmdldFJhd0NsYXNzcGF0aCgpICkKKwkJICAgICAgICAgICAgcmV0dXJuIHNvdXJjZUZvbGRlcnMuZ2V0KCAwICkudG9Qb3J0YWJsZVN0cmluZygpOworCQkgICAgICAgIH0KKwkJICAgIH0KKwkJICAgIGVsc2UKKwkJICAgIHsKKyAgICAJCSAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnBqID0gZnBqd2MuZ2V0RmFjZXRlZFByb2plY3QoKTsKKyAgICAJCSAgICAKKyAgICAJCSAgICBpZiggZnBqLmhhc1Byb2plY3RGYWNldCggSmF2YUZhY2V0LkZBQ0VUICkgKQorICAgIAkJICAgIHsKKyAgICAJCSAgICAgICAgdHJ5CiAgICAgCQkgICAgICAgIHsKLSAgICAJCSAgICAgICAgICAgIGlmKCBjcGUuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UgKQotICAgIAkJICAgICAgICAgICAgewotICAgIAkJICAgICAgICAgICAgICAgIHJldHVybiBjcGUuZ2V0UGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoIDEgKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0gICAgCQkgICAgICAgICAgICB9CisgICAgICAgIAkJICAgICAgICBmaW5hbCBJSmF2YVByb2plY3QganBqID0gSmF2YUNvcmUuY3JlYXRlKCBmcGouZ2V0UHJvamVjdCgpICk7CisgICAgICAgIAkJICAgICAgICAKKyAgICAgICAgCQkgICAgICAgIGZvciggSUNsYXNzcGF0aEVudHJ5IGNwZSA6IGpwai5nZXRSYXdDbGFzc3BhdGgoKSApCisgICAgICAgIAkJICAgICAgICB7CisgICAgICAgIAkJICAgICAgICAgICAgaWYoIGNwZS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSApCisgICAgICAgIAkJICAgICAgICAgICAgeworICAgICAgICAJCSAgICAgICAgICAgICAgICByZXR1cm4gY3BlLmdldFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKCAxICkudG9Qb3J0YWJsZVN0cmluZygpOworICAgICAgICAJCSAgICAgICAgICAgIH0KKyAgICAgICAgCQkgICAgICAgIH0KICAgICAJCSAgICAgICAgfQotCQkgICAgICAgIH0KLQkJICAgICAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJICAgICAgICB9CisgICAgCQkgICAgICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGUgKQorICAgIAkJICAgICAgICB7CisgICAgCQkgICAgICAgICAgICBKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworICAgIAkJICAgICAgICB9CisgICAgCQkgICAgfQogCQkgICAgfQogCQl9CiAJCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgaW50IGNvbnZlcnRGYWNldFZlcnNpb25Ub0oyRUVWZXJzaW9uKElQcm9qZWN0RmFjZXRWZXJzaW9uIHZlcnNpb24pIHsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRUFSRmFjZXRVdGlscy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRUFSRmFjZXRVdGlscy5qYXZhCmluZGV4IDkyNGE1MGIuLjNlYzI3ZWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VBUkZhY2V0VXRpbHMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9FQVJGYWNldFV0aWxzLmphdmEKQEAgLTEwLDE3ICsxMCwxOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQ7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7CiAKLXB1YmxpYyBjbGFzcyBFQVJGYWNldFV0aWxzIHsKKy8qKgorICogQGRlcHJlY2F0ZWQgVXNlIElKMkVFRmFjZXRDb25zdGFudHMgaW5zdGVhZCAKKyAqLworcHVibGljIGNsYXNzIEVBUkZhY2V0VXRpbHMgaW1wbGVtZW50cyBJSjJFRUZhY2V0Q29uc3RhbnRzIHsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBFQVJfRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfRUFSX01PRFVMRSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBFQVJfMTIgPSBFQVJfRkFDRVQuZ2V0VmVyc2lvbigiMS4yIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEVBUl8xMyA9IEVBUl9GQUNFVC5nZXRWZXJzaW9uKCIxLjMiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRUFSXzE0ID0gRUFSX0ZBQ0VULmdldFZlcnNpb24oIjEuNCIpOyAvLyROT04tTkxTLTEkCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEVBUl9GQUNFVCA9IElKMkVFRmFjZXRDb25zdGFudHMuRU5URVJQUklTRV9BUFBMSUNBVElPTl9GQUNFVDsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEVBUl8xMiA9IElKMkVFRmFjZXRDb25zdGFudHMuRU5URVJQUklTRV9BUFBMSUNBVElPTl8xMjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEVBUl8xMyA9IElKMkVFRmFjZXRDb25zdGFudHMuRU5URVJQUklTRV9BUFBMSUNBVElPTl8xMzsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEVBUl8xNCA9IElKMkVFRmFjZXRDb25zdGFudHMuRU5URVJQUklTRV9BUFBMSUNBVElPTl8xNDsKIAogCQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKaW5kZXggOGI5NDk1My4uMDRmZDk0OSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9FYXJGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgQkVBIFN5c3RlbXMsIEluYy4gYW5kIG90aGVycwogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtNywyMyArNywzMyBAQAogICoKICAqIENvbnRyaWJ1dG9yczoKICAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKiAgICBSb2JlcnRvIFNhbmNoZXogKElCTSkgLSBTZXQgZGVmYXVsdCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9sZGVyCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQ7CiAKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlhNTFdyaXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5XdHBVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJBcnRpZmFjdEVkaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLklFYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVhcmNyZWF0aW9uLklFYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXREYXRhTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwpAQCAtNTIsMTggKzYyLDQ2IEBACiAJCQljLmNyZWF0ZSgwLCBudWxsKTsKIAogCQkJZmluYWwgSVZpcnR1YWxGb2xkZXIgZWFycm9vdCA9IGMuZ2V0Um9vdEZvbGRlcigpOwotCQkJZWFycm9vdC5jcmVhdGVMaW5rKG5ldyBQYXRoKCIvIiArIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElFYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRFTlRfRElSKSksIDAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmICghZWFycm9vdC5nZXRGaWxlKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKS5leGlzdHMoKSkgewotCQkJCVN0cmluZyB2ZXIgPSBmdi5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0JCQkJaW50IG5WZXIgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludCh2ZXIpOwotCQkJCUVBUkFydGlmYWN0RWRpdC5jcmVhdGVEZXBsb3ltZW50RGVzY3JpcHRvcihwcm9qZWN0LCBuVmVyKTsKLQkJCX0KKwkJCVBhdGggY29udGVudERpclBhdGggPSBuZXcgUGF0aChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05URU5UX0RJUikpOworCQkJZWFycm9vdC5jcmVhdGVMaW5rKGNvbnRlbnREaXJQYXRoLCAwLCBudWxsKTsgCisJCQlKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5zZXREZWZhdWx0RGVwbG95bWVudERlc2NyaXB0b3JGb2xkZXIoZWFycm9vdCwgY29udGVudERpclBhdGgsIG51bGwpOyAKIAogCQkJdHJ5IHsKIAkJCQkoKElEYXRhTW9kZWxPcGVyYXRpb24pIG1vZGVsLmdldFByb3BlcnR5KEZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuTk9USUZJQ0FUSU9OX09QRVJBVElPTikpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7CiAJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJfQorCQkJCisJCQlpZiggZnYgPT0gSUoyRUVGYWNldENvbnN0YW50cy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OXzYwIHx8IGZ2ID09IElKMkVFRmFjZXRDb25zdGFudHMuRU5URVJQUklTRV9BUFBMSUNBVElPTl81MCkgeworCQkJCWlmKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuR0VORVJBVEVfREQpKXsKKwkJCQkJLy8gQ3JlYXRlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKGFwcGxpY2F0aW9uLnhtbCkgaWYgb25lIGRvZXNuJ3QgZXhpc3QKKwkJCQkJSUZpbGUgYXBwWG1sRmlsZSA9IGVhcnJvb3QuZ2V0VW5kZXJseWluZ0ZvbGRlcigpLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpKTsKKwkJCQkJaWYgKCFhcHBYbWxGaWxlLmV4aXN0cygpKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCWlmKCFhcHBYbWxGaWxlLmdldFBhcmVudCgpLmV4aXN0cygpCisJCQkJCQkJCQkmJiAoYXBwWG1sRmlsZS5nZXRQYXJlbnQoKS5nZXRUeXBlKCkgPT0gIElSZXNvdXJjZS5GT0xERVIpKXsKKwkJCQkJCQkJKChJRm9sZGVyKWFwcFhtbEZpbGUuZ2V0UGFyZW50KCkpLmNyZWF0ZSh0cnVlLCB0cnVlLCBtb25pdG9yKTsKKwkJCQkJCQl9CisJCQkJCQkJU3RyaW5nIGFwcFhtbENvbnRlbnRzID0gbnVsbDsKKwkJCQkJCQlpZihmdiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkVOVEVSUFJJU0VfQVBQTElDQVRJT05fNjApIHsKKwkJCQkJCQkJYXBwWG1sQ29udGVudHMgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG48YXBwbGljYXRpb24gaWQ9XCJBcHBsaWNhdGlvbl9JRFwiIHZlcnNpb249XCI2XCIgeG1sbnM9XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWVcIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIHhzaTpzY2hlbWFMb2NhdGlvbj1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYXBwbGljYXRpb25fNi54c2RcIj5cbiA8ZGlzcGxheS1uYW1lPiIgKyBYTUxXcml0ZXIuZ2V0RXNjYXBlZChwcm9qZWN0LmdldE5hbWUoKSkgKyAgIjwvZGlzcGxheS1uYW1lPiBcbiA8L2FwcGxpY2F0aW9uPiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQl9CisJCQkJCQkJZWxzZSB7CisJCQkJCQkJCWFwcFhtbENvbnRlbnRzID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuPGFwcGxpY2F0aW9uIGlkPVwiQXBwbGljYXRpb25fSURcIiB2ZXJzaW9uPVwiNVwiIHhtbG5zPVwiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiB4c2k6c2NoZW1hTG9jYXRpb249XCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkXCI+XG4gPGRpc3BsYXktbmFtZT4iICsgWE1MV3JpdGVyLmdldEVzY2FwZWQocHJvamVjdC5nZXROYW1lKCkpICsgICI8L2Rpc3BsYXktbmFtZT4gXG4gPC9hcHBsaWNhdGlvbj4gIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJCQkJfQorCQkJCQkJCWFwcFhtbEZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShhcHBYbWxDb250ZW50cy5nZXRCeXRlcygiVVRGLTgiKSksIHRydWUsIG1vbml0b3IpOyAvLyROT04tTkxTLTEkCisJCQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZSB7CisJCQkJaWYgKCFlYXJyb290LmdldEZpbGUoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpLmV4aXN0cygpKSB7CisJCQkJCVN0cmluZyB2ZXIgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSKTsKKwkJCQkJaW50IG5WZXIgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludCh2ZXIpOworCQkJCQlFQVJBcnRpZmFjdEVkaXQuY3JlYXRlRGVwbG95bWVudERlc2NyaXB0b3IocHJvamVjdCwgblZlcik7CisJCQkJfQogCQkJfQogCQl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEKaW5kZXggZmVlNWNhYy4uYjYwYTQ5ZSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEKQEAgLTIxLDkgKzIxLDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5JRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lYXJjcmVhdGlvbi5JRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7CkBAIC03NCw3ICs3NCw3IEBACiAJCQkJdHJ5IHsKIAkJCQkJZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwogCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQl9CiAJCQl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0UnVudGltZUhhbmRsZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0UnVudGltZUhhbmRsZXIuamF2YQppbmRleCA0ZGQxMGM3Li5iMmIzZWRhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9FYXJGYWNldFJ1bnRpbWVIYW5kbGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRSdW50aW1lSGFuZGxlci5qYXZhCkBAIC0xMiw3ICsxMiw2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwpAQCAtMjMsMTAgKzIyLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwogCiAvKiogCiAgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KQEAgLTQ3LDU2ICs0Myw5IEBACiAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCiAgICAgICAgIAogICAgIHsKLSAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCAiIiwgMSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGVhckZhY2V0ZWRQcm9qZWN0Ci0gICAgICAgICAgICAgICAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIGVhclByb2plY3QgKTsKLSAgICAgICAgCi0gICAgICAgICAgICBmaW5hbCBJUnVudGltZSBlYXJSdW50aW1lID0gZWFyRmFjZXRlZFByb2plY3QuZ2V0UnVudGltZSgpOwotICAgIAotICAgICAgICAgICAgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IG1vZHVsZUZhY2V0ZWRQcm9qZWN0IAotICAgICAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCBtb2R1bGVQcm9qZWN0ICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmKCBtb2R1bGVGYWNldGVkUHJvamVjdCAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgICEgZXF1YWxzKCBlYXJSdW50aW1lLCBtb2R1bGVGYWNldGVkUHJvamVjdC5nZXRSdW50aW1lKCkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBzdXBwb3J0cyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoIGVhclJ1bnRpbWUgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0ciA9IG1vZHVsZUZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3RGYWNldHMoKS5pdGVyYXRvcigpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICBpdHIuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhIGVhclJ1bnRpbWUuc3VwcG9ydHMoIGZ2ZXIgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggc3VwcG9ydHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlRmFjZXRlZFByb2plY3Quc2V0UnVudGltZSggZWFyUnVudGltZSwgc3VibW9uKCBtb25pdG9yLCAxICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb25pdG9yLmRvbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKwkJLy8gQXR0ZW1wdCB0byBjaGFuZ2UgdGhlIHJ1bnRpbWUgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlICAgICAgICAgICAgICAgIAorCQlKMkVFRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlLnVwZGF0ZVByb2plY3RSdW50aW1lKCBlYXJQcm9qZWN0LCBtb2R1bGVQcm9qZWN0LCBzdWJtb24oIG1vbml0b3IsIDEgKSk7CisJfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZU1vZHVsZVByb2plY3RSdW50aW1lKCBmaW5hbCBJUHJvamVjdCBlYXJQcm9qZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0IG1vZHVsZVByb2plY3RzLApAQCAtMTA1LDI5ICs1NCw5IEBACiAgICAgICAgIHRocm93cyBDb3JlRXhjZXB0aW9uCiAgICAgICAgIAogICAgIHsKLSAgICAgICAgaWYoIG1vbml0b3IgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCAiIiwgbW9kdWxlUHJvamVjdHMuc2l6ZSgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoIEl0ZXJhdG9yIGl0ciA9IG1vZHVsZVByb2plY3RzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJUHJvamVjdCBtb2R1bGVQcm9qZWN0ID0gKElQcm9qZWN0KSBpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHVwZGF0ZU1vZHVsZVByb2plY3RSdW50aW1lKCBlYXJQcm9qZWN0LCBtb2R1bGVQcm9qZWN0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9uKCBtb25pdG9yLCAxICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vbml0b3IuZG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorCQkvLyBBdHRlbXB0IHRvIGNoYW5nZSB0aGUgcnVudGltZSBvZiB0aGUgcmVmZXJlbmNlZCBtb2R1bGUgcHJvamVjdHMuCisJCUoyRUVGYWNldFJ1bnRpbWVDaGFuZ2VkRGVsZWdhdGUudXBkYXRlUHJvamVjdFJ1bnRpbWUoIGVhclByb2plY3QsIG1vZHVsZVByb2plY3RzLCBtb25pdG9yKTsKKwl9CiAgICAgCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSdW50aW1lQ2hhbmdlZERlbGVnYXRlCiAgICAgCkBAIC0xNDksOSArNzgsMTAgQEAKICAgICAKICAgICAgICAgICAgIHRyeSAKICAgICAgICAgICAgIHsKKwkJCQkvLyBDYXNjYWRlIHRoaXMgcnVudGltZSBjaGFuZ2UgdG8gcHJvamVjdHMgcmVmZXJlbmNlZCBieSB0aGlzIHByb2plY3QKKwogICAgICAgICAgICAgICAgIC8vIENvbXBpbGUgdGhlIGxpc3Qgb2YgcHJvamVjdHMgcmVmZXJlbmNlZCBieSB0aGlzIGVhciBwcm9qZWN0LgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIFNldCBtb2R1bGVQcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgICAgICAgICAgZmluYWwgU2V0PElQcm9qZWN0PiBtb2R1bGVQcm9qZWN0cyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0PigpOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGVhcnZjIAogICAgICAgICAgICAgICAgICAgICA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KCBwcm9qZWN0ICk7CkBAIC0xNzAsMTIgKzEwMCwxMSBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoIDEgKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBjaGFuZ2UgdGhlIHJ1bnRpbWUgZm9yIGVhY2ggb2YgdGhlIHJlZmVyZW5jZWQgcHJvamVjdHMuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdXBkYXRlTW9kdWxlUHJvamVjdFJ1bnRpbWUoIHByb2plY3QsIG1vZHVsZVByb2plY3RzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9uKCBtb25pdG9yLCA5ICkgKTsKLSAgICAgICAgICAgIH0KKworICAgICAgICAJCS8vIEF0dGVtcHQgdG8gY2hhbmdlIHRoZSBydW50aW1lIG9mIHRoZSByZWZlcmVuY2VkIG1vZHVsZSBwcm9qZWN0cy4KKwkJCQlKMkVFRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlLnVwZGF0ZVByb2plY3RSdW50aW1lKCBwcm9qZWN0LCBtb2R1bGVQcm9qZWN0cywKKwkJCQkJCXN1Ym1vbiggbW9uaXRvciwgOSApICk7CisJCQl9CiAgICAgICAgICAgICBmaW5hbGx5IAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKSAKQEAgLTE5MSwyNCArMTIwLDQgQEAKICAgICB7CiAgICAgICAgIHJldHVybiAoIHBhcmVudCA9PSBudWxsID8gbnVsbCA6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IoIHBhcmVudCwgdGlja3MgKSApOwogICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyggZmluYWwgT2JqZWN0IG9iajEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmoyICkKLSAgICB7Ci0gICAgICAgIGlmKCBvYmoxID09IG9iajIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKCBvYmoxID09IG51bGwgfHwgb2JqMiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG9iajEuZXF1YWxzKCBvYmoyICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAKLSAgICAKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0VmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9FYXJGYWNldFZhbGlkYXRvci5qYXZhCmluZGV4IDAyNGVjM2UuLjY1NDQ1MjUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0VmFsaWRhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRWYWxpZGF0b3IuamF2YQpAQCAtMzUsNyArMzUsNyBAQAogICAgIAogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfSUQgCi0gICAgICAgID0gSjJFRVBsdWdpbi5QTFVHSU5fSUQgKyAiLmRpZmZlcmVudFJ1bnRpbWVzRGV0ZWN0ZWQiOworICAgICAgICA9IEoyRUVQbHVnaW4uUExVR0lOX0lEICsgIi5kaWZmZXJlbnRSdW50aW1lc0RldGVjdGVkIjsgLy8kTk9OLU5MUy0xJAogICAgIAogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCBmaW5hbCBJRmFjZXRlZFByb2plY3QgZnByb2ogKSAKICAgICAKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIAotICAgICAgICBpZiggZnByb2ouaGFzUHJvamVjdEZhY2V0KCBFQVJGYWNldFV0aWxzLkVBUl9GQUNFVCApICkKKyAgICAgICAgaWYoIGZwcm9qLmhhc1Byb2plY3RGYWNldCggSUoyRUVGYWNldENvbnN0YW50cy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OX0ZBQ0VUICkgKQogICAgICAgICB7CiAgICAgICAgICAgICBmcHJvai5nZXRQcm9qZWN0KCkuZGVsZXRlTWFya2VycyggTUFSS0VSX0lELCBmYWxzZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJlc291cmNlLkRFUFRIX1pFUk8gKTsKQEAgLTY1LDcgKzY1LDkgQEAKICAgICAgICAgICAgICAgICBpZiggcmVmdmMgIT0gbnVsbCAmJiAhcmVmdmMuaXNCaW5hcnkoKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0IHJlZnBqID0gcmVmdmMuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZSggZnByb2osIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcmVmcGogKSApOworICAgICAgICAgICAgICAgICAgICBJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIHJlZnBqICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBmYWNldGVkUHJvamVjdCAhPSBudWxsICkKKyAgICAgICAgICAgICAgICAgICAgCXZhbGlkYXRlKCBmcHJvaiwgZmFjZXRlZFByb2plY3QgKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTgxLDcgKzgzLDcgQEAKICAgICAgICAgICAgICAgICBmaW5hbCBJRmFjZXRlZFByb2plY3QgcmVmZnBqCiAgICAgICAgICAgICAgICAgICAgID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKCByZWZ2Yy5nZXRQcm9qZWN0KCkgKTsKICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiggcmVmZnBqLmhhc1Byb2plY3RGYWNldCggRUFSRmFjZXRVdGlscy5FQVJfRkFDRVQgKSApCisgICAgICAgICAgICAgICAgaWYoIHJlZmZwai5oYXNQcm9qZWN0RmFjZXQoIElKMkVFRmFjZXRDb25zdGFudHMuRU5URVJQUklTRV9BUFBMSUNBVElPTl9GQUNFVCApICkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlKCByZWZmcGogKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMTUsOSArMTE3LDkgQEAKICAgICAgICAgICAgIAogICAgICAgICAgICAgZmluYWwgSU1hcmtlciBtID0gZWFyLmNyZWF0ZVdhcm5pbmdNYXJrZXIoIE1BUktFUl9JRCwgbXNnICk7CiAgICAgICAgICAgICAKLSAgICAgICAgICAgIG0uc2V0QXR0cmlidXRlKCAibW9kdWxlUHJvamVjdCIsIG1vZHVsZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICBtLnNldEF0dHJpYnV0ZSggInJ1bnRpbWUxIiwgZWFyLmdldFJ1bnRpbWUoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgICAgIG0uc2V0QXR0cmlidXRlKCAicnVudGltZTIiLCBtb2R1bGUuZ2V0UnVudGltZSgpLmdldE5hbWUoKSApOworICAgICAgICAgICAgbS5zZXRBdHRyaWJ1dGUoICJtb2R1bGVQcm9qZWN0IiwgbW9kdWxlLmdldFByb2plY3QoKS5nZXROYW1lKCkgKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgbS5zZXRBdHRyaWJ1dGUoICJydW50aW1lMSIsIGVhci5nZXRSdW50aW1lKCkuZ2V0TmFtZSgpICk7IC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIG0uc2V0QXR0cmlidXRlKCAicnVudGltZTIiLCBtb2R1bGUuZ2V0UnVudGltZSgpLmdldE5hbWUoKSApOyAvLyROT04tTkxTLTEkCiAgICAgICAgIH0KICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9FYXJGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQppbmRleCBlMTIxZTZiLi4yMGM5YTU2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9FYXJGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0VmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEKQEAgLTE0LDExICsxNCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0vKioKLSAqIFdhcm5pbmcgY2xlYW4tdXAgMTIvMDUvMjAwNQotICovICAgCi0vL2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLS8vaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwogCkBAIC00MSw3ICszNiw3IEBACiAgICAgewogICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkKICAgICAgICAgewotICAgICAgICAgICAgbW9uaXRvci5iZWdpblRhc2soICIiLCAxICk7CisgICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDEgKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICB0cnkKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0phdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0phdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCBhNjBkMGNjLi5kNjQ3ZjBlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0yNywxMCArMjcsMTIgQEAKICAqLwogcHVibGljIGNsYXNzIEphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUphdmFQcm9qZWN0TWlncmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcyB7CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBpbml0KCkgewogCQlzdXBlci5pbml0KCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewogCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9OQU1FKTsKQEAgLTQ0LDE5ICs0NiwyMyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCiAJCXJldHVybiBPS19TVEFUVVM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKIAkJcmV0dXJuIG5ldyBKYXZhUHJvamVjdE1pZ3JhdGlvbk9wZXJhdGlvbihtb2RlbCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0phdmFQcm9qZWN0TWlncmF0aW9uT3BlcmF0aW9uLmphdmEKaW5kZXggZTZmY2I4ZC4uNmRmMWNkNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KYXZhUHJvamVjdE1pZ3JhdGlvbk9wZXJhdGlvbi5qYXZhCkBAIC0xOCwxMCArMTgsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5KYXZhRmFjZXRVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSUoyRUVNb2R1bGVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7CkBAIC00MSw2ICs0Miw3IEBACiAJCXN1cGVyKG1vZGVsKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB7CiAKIApAQCAtNTksMTEgKzYxLDExIEBACiAJCQl1ZG0uc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkpOwogCQkJdWRtLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsICIxLjAiKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICAgICAgdWRtLnNldFByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5NT0RVTEVfVVJJLAotICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpICsgIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpICsgSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVCk7CiAgICAgICAgICAgICAvLyB3ZSBkbyBub3Qgd2FudCB0byBhZGQgdG8gZWFyIGJ5IGRlZmF1bHQKICAgICAgICAgICAgIHVkbS5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIGZhbHNlKTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0KIAogCQlJRGF0YU1vZGVsIGRtID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CkBAIC03Niw3ICs3OCw3IEBACiAJCXRyeSB7CiAJCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKIAkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0KIAkJcmV0dXJuIE9LX1NUQVRVUzsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KYXZhVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KYXZhVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggYmE3MzE0My4uOWUyYTc1MCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0phdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogCQlzdXBlcigpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7CiAJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwogCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUX05BTUUpOwpAQCAtMzYsNiArMzcsNyBAQAogCX0KIAkKIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewogCQlyZXR1cm4gbmV3IEphdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uKG1vZGVsKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KYXZhVXRpbGl0eVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24uamF2YQppbmRleCBhN2JhZjc1Li5mMTY5Y2YzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KYXZhVXRpbGl0eVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0phdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uLmphdmEKQEAgLTE2LDggKzE2LDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5KYXZhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GYWNldERhdGFNb2RlbE1hcDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLkZhY2V0UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uOwpAQCAtMzYsMTIgKzM2LDEzIEBACiAJfQogCQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCQogCQlJU3RhdHVzIHN0YXQgPSBPS19TVEFUVVM7CiAJCQogCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eSggSUphdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUgKTsKLQkJU3RyaW5nIGVhclByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoIElKYXZhVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSApOzsKKwkJU3RyaW5nIGVhclByb2plY3ROYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoIElKYXZhVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSApOwogCQlTdHJpbmcgamF2YVNvdXJjZUZvbGRlciA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KCBJSmF2YVV0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVIgKTsKIAkJCiAJCW9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgbW9kZWwuZ2V0UHJvcGVydHkoSUphdmFVdGlsaXR5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5SVU5USU1FKTsKQEAgLTc1LDcgKzc2LDcgQEAKIAkJdHJ5IHsKIAkJCXN0YXQgPSBvcC5leGVjdXRlKCBtb25pdG9yLCBudWxsICk7CiAJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9CiAJCXJldHVybiBzdGF0OwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKaW5kZXggOGI4MzljNi4uMGU2OWU0YSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKQEAgLTIzLDExICsyMywxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuV3RwVXRpbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuQ2xhc3NwYXRoSGVscGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLkoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0RGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKQEAgLTkxLDkgKzkwLDkgQEAKIAkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpCiAJCQkJCWNyZWF0ZU1hbmlmZXN0KHByb2plY3QsIGNvbnRhaW5lciwgbW9uaXRvcik7CiAJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAogCkBAIC0xMDQsNyArMTAzLDcgQEAKIAkJCQkvLyBDbGFzc3BhdGhIZWxwZXIuYWRkQ2xhc3NwYXRoRW50cmllcyggcHJvamVjdCwgZnYsIDxzb21ldGhpbmc+ICk7CiAJCQl9CiAKLQkJCWlmKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXJVdGlscy5nZXREZWZhdWx0VXNlRUFSTGlicmFyaWVzKCkpeworCQkJaWYoIG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuSU5TVEFMTF9FQVJfTElCUkFSWSkpewogCQkJCWZpbmFsIElQYXRoIGVhckxpYkNvbnRhaW5lciA9IG5ldyBQYXRoKEoyRUVDb21wb25lbnRDbGFzc3BhdGhDb250YWluZXIuQ09OVEFJTkVSX0lEKTsKIAkJCQlhZGRUb0NsYXNzcGF0aChqcHJvaiwgSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoZWFyTGliQ29udGFpbmVyKSk7CiAJCQl9CkBAIC0xMTIsMTMgKzExMSwxMyBAQAogCQkJdHJ5IHsKIAkJCQkoKElEYXRhTW9kZWxPcGVyYXRpb24pIG1vZGVsLmdldFByb3BlcnR5KEZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuTk9USUZJQ0FUSU9OX09QRVJBVElPTikpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7CiAJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJfQogCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewogCQkJCW1vbml0b3Iud29ya2VkKDEpOwogCQkJfQogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfSBmaW5hbGx5IHsKIAkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKIAkJCQltb25pdG9yLmRvbmUoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUuamF2YQppbmRleCA4MTQ1Mjg1Li5lNzQyZTE3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9VdGlsaXR5RmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwpAQCAtNDcsNyArNDcsNyBAQAogCQkJCX0KIAkJCX0KIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0gZmluYWxseSB7CiAJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7CiAJCQkJbW9uaXRvci5kb25lKCk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9VdGlsaXR5RmFjZXRVbkluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvVXRpbGl0eUZhY2V0VW5JbnN0YWxsRGVsZWdhdGUuamF2YQppbmRleCBhNWYzZWFkLi5kMDUyZWM5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9VdGlsaXR5RmFjZXRVbkluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlGYWNldFVuSW5zdGFsbERlbGVnYXRlLmphdmEKQEAgLTExLDI0ICsxMSwxNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQ7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0Lld0cFV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkNsYXNzcGF0aEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247CiAKLXB1YmxpYyBmaW5hbCBjbGFzcyBVdGlsaXR5RmFjZXRVbkluc3RhbGxEZWxlZ2F0ZSBleHRlbmRzIEoyRUVGYWNldEluc3RhbGxEZWxlZ2F0ZSBpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7CitwdWJsaWMgZmluYWwgY2xhc3MgVXRpbGl0eUZhY2V0VW5JbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewogCiAJcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgZmluYWwgT2JqZWN0IGNmZywgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCWlmIChtb25pdG9yICE9IG51bGwpIHsKQEAgLTQwLDIyICszMyw2IEBACiAJCQlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKCBTdHJ1Y3R1cmVFZGl0Lk1PRFVMRV9NRVRBX0ZJTEVfTkFNRSApOwogCQkJZmlsZS5kZWxldGUoIHRydWUsIG1vbml0b3IgKTsKIAkJCQotCQkJLy9yZW1vdmUgbWFuaWZlc3QgZmlsZQotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJZmluYWwgSVZpcnR1YWxGb2xkZXIgcm9vdCA9IGMuZ2V0Um9vdEZvbGRlcigpOwotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBudWxsOwotCi0JCQlpZiAocm9vdC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuc2VnbWVudENvdW50KCkgPT0gMCkgewotCQkJCWNvbnRhaW5lciA9IHByb2plY3Q7Ci0JCQl9IGVsc2UgewotCQkJCWNvbnRhaW5lciA9IHByb2plY3QuZ2V0Rm9sZGVyKHJvb3QuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLQkJCX0KLQkJCQotCQkJSUZpbGUgbWFuaWZlc3RGaWxlID0gY29udGFpbmVyLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKTsKLQkJCW1hbmlmZXN0RmlsZS5kZWxldGUoIHRydWUsIG1vbml0b3IgKTsKLQkJCQotCQkJSUZvbGRlciBtYW5pZmVzdEZvbGRlciA9IGNvbnRhaW5lci5nZXRGb2xkZXIoIG5ldyBQYXRoKEoyRUVDb25zdGFudHMuTUVUQV9JTkYpICk7Ci0JCQltYW5pZmVzdEZvbGRlci5kZWxldGUoIHRydWUsIG1vbml0b3IgKTsKIAkJICAgICAKIAkJCS8vcmVtb3ZlICBtb2R1bGUgY29yZSBuYXR1cmUKIAkJCVd0cFV0aWxzLnJlbW92ZU5hdHVyZXMoIHByb2plY3QgKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L1V0aWxpdHlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggOGU4N2ZkOC4uNDNlMDQzNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvVXRpbGl0eVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIAkJc3VwZXIoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBpbml0KCkgewogCQlzdXBlci5pbml0KCk7CiAKQEAgLTM4LDExICszOSw5IEBACiAJCQogCQlGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIGdldFByb3BlcnR5KEZBQ0VUX0RNX01BUCk7CiAJCUlEYXRhTW9kZWwgamF2YUZhY2V0ID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKEphdmFGYWNldFV0aWxzLkpBVkFfRkFDRVQuZ2V0SWQoKSk7Ci0JCQogCQlqYXZhRmFjZXQuc2V0UHJvcGVydHkoSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FLCAKIAkJCQlKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRVdGlsaXR5T3V0cHV0Rm9sZGVyTmFtZSgpKTsKIAkJCi0JCQogCQlJRGF0YU1vZGVsIHV0aWxGYWNldCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChJSjJFRUZhY2V0Q29uc3RhbnRzLlVUSUxJVFlfRkFDRVQuZ2V0SWQoKSk7CiAJCXV0aWxGYWNldC5hZGRMaXN0ZW5lcihuZXcgSURhdGFNb2RlbExpc3RlbmVyKCkgewogCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7CkBAIC01OSw2ICs1OCw3IEBACiAJCQogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7CiAJCWlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBNT0RVTEVfVVJJICkpewogCQkJRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBnZXRQcm9wZXJ0eShGQUNFVF9ETV9NQVApOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS9FbnRlcnByaXNlQXJ0aWZhY3RFZGl0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL0VudGVycHJpc2VBcnRpZmFjdEVkaXQuamF2YQppbmRleCBlOTBiZjQ3Li40ZjQ0ODVkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL0VudGVycHJpc2VBcnRpZmFjdEVkaXQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL0VudGVycHJpc2VBcnRpZmFjdEVkaXQuamF2YQpAQCAtMTY1LDcgKzE2NSw3IEBACiAJcHVibGljIEVPYmplY3QgZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkgewogCQlSZXNvdXJjZSByZXMgPSBnZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7CiAJCWlmICghcmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIChFT2JqZWN0KSByZXMuZ2V0Q29udGVudHMoKS5nZXQoMCk7CisJCQlyZXR1cm4gcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwogCQlyZXR1cm4gbnVsbDsKIAl9CiAKQEAgLTE5NSw2ICsxOTUsNyBAQAogCQkJcmV0dXJuIG51bGw7CiAJCXJldHVybiBnZXRXb3JraW5nQ29weU1hbmFnZXIoKS5nZXRXb3JraW5nQ29weShjdSwgZm9yTmV3Q1UpOwogCX0KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZFByb2plY3RWZXJzaW9uKElQcm9qZWN0IHByb2plY3QpIHsKIAkJCiAJCXJldHVybiBFbnRlcnByaXNlQXJ0aWZhY3RFZGl0LlNVUFBPUlRfTEVHQUNZX1BST0pFQ1RTIHx8IHByaW1WYWxpZFByb2plY3RWZXJzaW9uKHByb2plY3QpOwpAQCAtMjk0LDkgKzI5NSw5IEBACiAJCQlSZXNvdXJjZSByZXMgPSAoKEFydGlmYWN0RWRpdE1vZGVsKWdldFdyaXRhYmxlRWRpdCgpLmdldEFkYXB0ZXIoQXJ0aWZhY3RFZGl0TW9kZWwuQURBUFRFUl9UWVBFKSkuZ2V0UmVzb3VyY2UoVVJJLmNyZWF0ZVVSSShtb2RlbFBhdGgudG9TdHJpbmcoKSkpOwogCQkJaWYgKHJlcyAhPSBudWxsICYmICFyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCiAJCQkJcmV0dXJuIHJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWVsc2UgcmV0dXJuIG51bGw7CisJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQkJcmV0dXJuIGdldENvbnRlbnRNb2RlbFJvb3QoKTsKKwkJcmV0dXJuIGdldENvbnRlbnRNb2RlbFJvb3QoKTsKIAl9CiAKIAlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElQcm9qZWN0IHByb2plY3QpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbXBvbmVudGNvcmUvSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL0oyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5qYXZhCmluZGV4IDFjMzE4ODQuLmJmZDI4MDIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbXBvbmVudGNvcmUvSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS9KMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQuamF2YQpAQCAtMTQsOCArMTQsOSBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuTWFuaWZlc3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwpAQCAtMzIsNiArMzMsNyBAQAogCQlzdXBlcihhQ29tcG9uZW50UHJvamVjdCwgYXJjaGl2ZUxvY2F0aW9uLCBhUnVudGltZVBhdGgpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoKSB7CiAJCUxpc3QgZHluYW1pY1JlZmVyZW5jZXMgPSBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5nZXRNYW5pZmVzdFJlZmVyZW5jZXModGhpcywgbnVsbCk7CiAJCWlmIChudWxsID09IGR5bmFtaWNSZWZlcmVuY2VzKSB7CkBAIC00MiwxMyArNDQsNyBAQAogCiAJcHVibGljIFN0cmluZ1tdIGdldE1hbmlmZXN0Q2xhc3NwYXRoKCkgewogCQlpZiAobnVsbCA9PSBtYW5pZmVzdENsYXNzcGF0aCkgewotCQkJQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0ID0gSjJFRVByb2plY3RVdGlsaXRpZXMucmVhZE1hbmlmZXN0KHRoaXMpOwotCQkJaWYgKG1hbmlmZXN0ICE9IG51bGwpIHsKLQkJCQltYW5pZmVzdENsYXNzcGF0aCA9IG1hbmlmZXN0LmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQkJfQotCQkJaWYgKG1hbmlmZXN0Q2xhc3NwYXRoID09IG51bGwpIHsKLQkJCQltYW5pZmVzdENsYXNzcGF0aCA9IG5ldyBTdHJpbmdbMF07Ci0JCQl9CisJCQltYW5pZmVzdENsYXNzcGF0aCA9IE1hbmlmZXN0VXRpbGl0aWVzLmdldE1hbmlmZXN0Q2xhc3NwYXRoKHRoaXMgLCBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSkpOwogCQl9CiAJCXJldHVybiBtYW5pZmVzdENsYXNzcGF0aDsKIAl9CkBAIC02MSw0ICs1NywyMCBAQAogCQlyZXR1cm4gbGlua2VkVG9FQVI7CiAJfQogCQorCS8qCisJKiBUaGUgZm9sbG93aW5nIEFQSXMgd2VyZSB0ZW1wb3JhcnkgdG8gZml4IHNvbWUgYnVncworCSogd2hpY2ggaGF2ZSBub3cgYmVlbiBmaXhlZCBieSBhIG1vcmUgdGhvcm91Z2ggcmVmYWN0b3IgKGZsYXQgY29tcG9uZW50IG1vZGVsKQorCSovCisJQERlcHJlY2F0ZWQKKwlwcml2YXRlIElQYXRoIGRlcGxveW1lbnRQYXRoOworCQorCUBEZXByZWNhdGVkCisJcHVibGljIElQYXRoIGdldERlcGxveW1lbnRQYXRoKCkgeworCQlyZXR1cm4gZGVwbG95bWVudFBhdGg7CisJfQorCQorCUBEZXByZWNhdGVkCisJcHVibGljIHZvaWQgc2V0RGVwbG95bWVudFBhdGgoSVBhdGggcGF0aCkgeworCQl0aGlzLmRlcGxveW1lbnRQYXRoID0gcGF0aDsKKwl9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL0oyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21wb25lbnRjb3JlL0oyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50LmphdmEKaW5kZXggYTQ4MTViZC4uMWM5NTcyMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tcG9uZW50Y29yZS9KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbXBvbmVudGNvcmUvSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMTEgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMCwzMyArMTAsMzYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLklDbGFzc3BhdGhEZXBlbmRlbmN5Q29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS5JQ2xhc3NwYXRoRGVwZW5kZW5jeVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS5JQ2xhc3NwYXRoRGVwZW5kZW5jeVJlY2VpdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLk1hbmlmZXN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlLklKYXZhUHJvamVjdExpdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5qZHQuaW50ZXJuYWwuamF2YWxpdGUuSmF2YUNvcmVMaXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlLkphdmFMaXRlVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdEltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5RW5hYmxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVEZXBlbmRlbmN5TGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkVhclV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CkBAIC00NCwyMyArNDcsNDIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklDb21wb25lbnRJbXBsRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5WaXJ0dWFsUmVmZXJlbmNlVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVRhZ2dlZFZpcnR1YWxSZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKIAotcHVibGljIGNsYXNzIEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50IGV4dGVuZHMgVmlydHVhbENvbXBvbmVudCBpbXBsZW1lbnRzIElDb21wb25lbnRJbXBsRmFjdG9yeSB7CitwdWJsaWMgY2xhc3MgSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQgZXh0ZW5kcyBWaXJ0dWFsQ29tcG9uZW50IGltcGxlbWVudHMgSUNvbXBvbmVudEltcGxGYWN0b3J5LCBJQ2xhc3NwYXRoRGVwZW5kZW5jeVByb3ZpZGVyLCBJQ2xhc3NwYXRoRGVwZW5kZW5jeVJlY2VpdmVyIHsKIAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEREX0ZPTERFUl9UQUcgPSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50LkRFRkFVTFRfUk9PVF9TT1VSQ0VfVEFHOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFVF9KQVZBX1JFRlMgPSAiR0VUX0pBVkFfUkVGUyI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBHRVRfRlVaWllfRUFSX1JFRlMgPSAiR0VUX0ZVWlpZX0VBUl9SRUZTIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFVF9FWFBBTkRFRF9MSUJfUkVGUyA9ICJHRVRfRVhQQU5ERURfTElCX1JFRlMiOyAvLyROT04tTkxTLTEkCisJLyoqCisJICogVXNlIHRoaXMgdmFsdWUgdG8gcmV0cmlldmUgcmVmZXJlbmNlcyBjb25zaXN0aW5nIG9mIG9ubHkgTUVUQS1JTkYvTUFOSUZFU1QuTUYgY2xhc3NwYXRoCisJICogYXR0cmlidXRlcy4gIERvIHRoaXMgYXMgZm9sbG93czoKKwkgKiA8Y29kZT4KKwkgKiBJVmlydHVhbENvbXBvbWVudCBjb21wb25lbnQgPSBhIHZpcnR1YWwgY29tcG9uZW50CisJICogTWFwPFN0cmluZywgT2JqZWN0PiBvbmx5TWFuaWZlc3RSZWZzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJICogb25seU1hbmlmZXN0UmVmcy5wdXQoSVZpcnR1YWxDb21wb25lbnQuUkVRVUVTVEVEX1JFRkVSRU5DRV9UWVBFLCBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5PTkxZX01BTklGRVNUX1JFRkVSRU5DRVMpOworCSAqIElWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKG9ubHlNYW5pZmVzdFJlZnMpOyAKKwkgKiA8L2NvZGU+IAorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9OTFlfTUFOSUZFU1RfUkVGRVJFTkNFUyA9ICJPTkxZX01BTklGRVNUX1JFRkVSRU5DRVMiOyAvLyROT04tTkxTLTEkCiAJCiAJcHJpdmF0ZSBsb25nIGRlcEdyYXBoTW9kU3RhbXA7CisJcHJpdmF0ZSBsb25nIGplZU1vZFN0YW1wOwogCQotCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2VbXSBmdXp6eUFuZEphdmFSZWZzID0gbnVsbDsKLQlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlW10gZnV6enlSZWZzT25seSA9IG51bGw7Ci0JcHJpdmF0ZSBJVmlydHVhbFJlZmVyZW5jZVtdIGphdmFSZWZzT25seSA9IG51bGw7Ci0JcHJpdmF0ZSBJVmlydHVhbFJlZmVyZW5jZVtdIG5vbkphdmFSZWZzT25seSA9IG51bGw7CisJLyoqCisJICogQWNjZXNzb3JzIG9mIHRoaXMgZmllbGQgc2hvdWxkIGFsd2F5cyB1c2UgZ2V0SGFyZFJlZmVyZW5jZXMoKQorCSAqLworCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2VbXSBoYXJkUmVmZXJlbmNlcyA9IG51bGw7CisJcHJpdmF0ZSBJVmlydHVhbFJlZmVyZW5jZVtdIGphdmFSZWZlcmVuY2VzID0gbnVsbDsKKwlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlW10gcGFyZW50RWFyTWFuaWZlc3RSZWZlcmVuY2VzID0gbnVsbDsKKwlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlW10gZnV6enlFYXJNYW5pZmVzdFJlZmVyZW5jZXMgPSBudWxsOwogCQogCXB1YmxpYyBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCgpIHsKIAkJc3VwZXIoKTsKQEAgLTg4LDM5MCArMTEwLDQzNyBAQAogCSAqIEByZXR1cm4gSVZpcnR1YWxSZWZlcmVuY2VzIGZvciBhbGwgbm9uLUphdmEgY2xhc3NwYXRoIGVudHJ5IHJlZmVyZW5jZXMuCiAJICovCiAJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0Tm9uSmF2YVJlZmVyZW5jZXMoKSB7Ci0JCWlmKG5vbkphdmFSZWZzT25seSA9PSBudWxsIHx8ICFjaGVja0lmU3RpbGxWYWxpZCgpKSB7Ci0JCQlub25KYXZhUmVmc09ubHkgPSBnZXRSZWZlcmVuY2VzKGZhbHNlLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIG5vbkphdmFSZWZzT25seTsKKwkJcmV0dXJuIGdldFJlZmVyZW5jZXMoZmFsc2UsZmFsc2UpOwogCX0KLQkKKworCXByb3RlY3RlZCBJVmlydHVhbFJlZmVyZW5jZVtdIGdldEhhcmRSZWZlcmVuY2VzKCkgeworCQlpZiAoIWNoZWNrSWZTdGlsbFZhbGlkKCkgfHwgaGFyZFJlZmVyZW5jZXMgPT0gbnVsbCkgeworCQkJTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJCW1hcC5wdXQoUkVRVUVTVEVEX1JFRkVSRU5DRV9UWVBFLCBIQVJEX1JFRkVSRU5DRVMpOworCQkJaGFyZFJlZmVyZW5jZXMgPSBzdXBlci5nZXRSZWZlcmVuY2VzKG1hcCk7CisJCX0KKwkJcmV0dXJuIGhhcmRSZWZlcmVuY2VzOworCX0KKworCXByb3RlY3RlZCBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRIYXJkUmVmZXJlbmNlcygKKwkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQltYXAucHV0KFJFUVVFU1RFRF9SRUZFUkVOQ0VfVFlQRSwgSEFSRF9SRUZFUkVOQ0VTKTsKKwkJcmV0dXJuIGNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKG1hcCk7CisJfQorCisJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKSB7CisJCS8vYnJva2VuIGJ5IGNhY2hlCisJCS8vaWYgKGphdmFSZWZlcmVuY2VzID09IG51bGwgfHwgIWNoZWNrSWZTdGlsbFZhbGlkKCkpCisJCQlqYXZhUmVmZXJlbmNlcyA9IGdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKGdldEhhcmRSZWZlcmVuY2VzKCkpOworCQlyZXR1cm4gamF2YVJlZmVyZW5jZXM7CisJfQorCiAJQE92ZXJyaWRlCiAJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcyhNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbnMpIHsKLQkJT2JqZWN0IG9iakdldEphdmFSZWZzID0gb3B0aW9ucy5nZXQoR0VUX0pBVkFfUkVGUyk7Ci0JCU9iamVjdCBvYmpHZXRGdXp6eUVhclJlZnMgPSBvcHRpb25zLmdldChHRVRfRlVaWllfRUFSX1JFRlMpOwotCQlib29sZWFuIGdldEphdmFSZWZzID0gb2JqR2V0SmF2YVJlZnMgIT0gbnVsbCA/ICgoQm9vbGVhbilvYmpHZXRKYXZhUmVmcykuYm9vbGVhblZhbHVlKCkgOiB0cnVlOwotCQlib29sZWFuIGZpbmRGdXp6eUVBUlJlZnMgPSBvYmpHZXRGdXp6eUVhclJlZnMgIT0gbnVsbCA/ICgoQm9vbGVhbilvYmpHZXRGdXp6eUVhclJlZnMpLmJvb2xlYW5WYWx1ZSgpIDogZmFsc2U7Ci0JCQotCQlJVmlydHVhbFJlZmVyZW5jZVtdIGNhY2hlZFJlZmVyZW5jZXMgPSBnZXRDYWNoZWRSZWZlcmVuY2UoZ2V0SmF2YVJlZnMsIGZpbmRGdXp6eUVBUlJlZnMpOwotCQlpZiAoY2FjaGVkUmVmZXJlbmNlcyAhPSBudWxsKQotCQkJcmV0dXJuIGNhY2hlZFJlZmVyZW5jZXM7Ci0JCQotCQljYWNoZWRSZWZlcmVuY2VzID0gZ2V0UmVmZXJlbmNlcyhnZXRKYXZhUmVmcywgZmluZEZ1enp5RUFSUmVmcyk7Ci0JCXNldENhY2hlZFJlZmVyZW5jZXMoZ2V0SmF2YVJlZnMsIGZpbmRGdXp6eUVBUlJlZnMsIGNhY2hlZFJlZmVyZW5jZXMpOwotCQlyZXR1cm4gY2FjaGVkUmVmZXJlbmNlczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcygpIHsKLQkJaWYoamF2YVJlZnNPbmx5ID09IG51bGwgfHwgIWNoZWNrSWZTdGlsbFZhbGlkKCkpIHsKLQkJCWphdmFSZWZzT25seSA9IGdldFJlZmVyZW5jZXModHJ1ZSwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBqYXZhUmVmc09ubHk7Ci0JfQotCQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoZmluYWwgYm9vbGVhbiBnZXRKYXZhUmVmcywgZmluYWwgYm9vbGVhbiBmaW5kRnV6enlFQVJSZWZzKSB7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gY2FjaGVkUmVmZXJlbmNlcyA9IGdldENhY2hlZFJlZmVyZW5jZShnZXRKYXZhUmVmcywgZmluZEZ1enp5RUFSUmVmcyk7Ci0JCWlmIChjYWNoZWRSZWZlcmVuY2VzICE9IG51bGwpCi0JCQlyZXR1cm4gY2FjaGVkUmVmZXJlbmNlczsKLQkJCi0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gaGFyZFJlZmVyZW5jZXMgPSBnZXROb25NYW5pZmVzdFJlZmVyZW5jZXMoZ2V0SmF2YVJlZnMpOwotCQkKLQkJLy8gcmV0cmlldmUgdGhlIGR5bmFtaWMgcmVmZXJlbmNlcyBzcGVjaWZpZWQgdmlhIHRoZSBNQU5JRkVTVC5NRiBjbGFzc3BhdGggCi0JCUxpc3QgZHluYW1pY1JlZmVyZW5jZXMgPSBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudC5nZXRNYW5pZmVzdFJlZmVyZW5jZXModGhpcywgaGFyZFJlZmVyZW5jZXMsIGZpbmRGdXp6eUVBUlJlZnMpOwotCQkKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbnVsbDsKLQkJaWYgKGR5bmFtaWNSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCXJlZmVyZW5jZXMgPSBoYXJkUmVmZXJlbmNlczsKLQkJfSBlbHNlIHsKLQkJCXJlZmVyZW5jZXMgPSBuZXcgSVZpcnR1YWxSZWZlcmVuY2VbaGFyZFJlZmVyZW5jZXMubGVuZ3RoICsgZHluYW1pY1JlZmVyZW5jZXMuc2l6ZSgpXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoaGFyZFJlZmVyZW5jZXMsIDAsIHJlZmVyZW5jZXMsIDAsIGhhcmRSZWZlcmVuY2VzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGR5bmFtaWNSZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVmZXJlbmNlc1toYXJkUmVmZXJlbmNlcy5sZW5ndGggKyBpXSA9IChJVmlydHVhbFJlZmVyZW5jZSkgZHluYW1pY1JlZmVyZW5jZXMuZ2V0KGkpOworCQlPYmplY3QgdmFsID0gb3B0aW9ucy5nZXQoUkVRVUVTVEVEX1JFRkVSRU5DRV9UWVBFKTsKKwkJaWYoIHZhbCAhPSBudWxsICkgeworCQkJaWYoIEhBUkRfUkVGRVJFTkNFUy5lcXVhbHModmFsKSB8fCBOT05fREVSSVZFRF9SRUZFUkVOQ0VTLmVxdWFscyh2YWwpIHx8IERJU1BMQVlBQkxFX1JFRkVSRU5DRVMuZXF1YWxzKHZhbCkpeworCQkJCXJldHVybiBnZXRIYXJkUmVmZXJlbmNlcygpOworCQkJfSBlbHNlIGlmKERJU1BMQVlBQkxFX1JFRkVSRU5DRVNfQUxMLmVxdWFscyh2YWwpKXsKKwkJCQljaGVja0lmU3RpbGxWYWxpZCgpOyAvLyBUaGlzIHdpbGwgY2xlYXIgdGhlIGNhY2hlIG9mIHJhdyByZWZlcmVuY2VzIGlmIG5lZWRlZC4KKwkJCQlyZXR1cm4gZ2V0QWxsUmVmZXJlbmNlcygpOworCQkJfSBlbHNlIGlmIChPTkxZX01BTklGRVNUX1JFRkVSRU5DRVMuZXF1YWxzKHZhbCkpeworCQkJCUFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gYWxsID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4oKTsKKwkJCQljaGVja0lmU3RpbGxWYWxpZCgpOworCQkJCWNhY2hlTWFuaWZlc3RSZWZlcmVuY2VzKCk7CisJCQkJYWxsLmFkZEFsbChBcnJheXMuYXNMaXN0KHBhcmVudEVhck1hbmlmZXN0UmVmZXJlbmNlcykpOworCQkJCWFsbC5hZGRBbGwoQXJyYXlzLmFzTGlzdChmdXp6eUVhck1hbmlmZXN0UmVmZXJlbmNlcykpOworCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGFsbC50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVthbGwuc2l6ZSgpXSk7CisJCQkJVmlydHVhbFJlZmVyZW5jZVV0aWxpdGllcy5JTlNUQU5DRS5lbnN1cmVSZWZlcmVuY2VzSGF2ZU5hbWVzKHJlZnMpOworCQkJCXJldHVybiByZWZzOwogCQkJfQogCQl9CisJCUJvb2xlYW4gb2JqR2V0SmF2YVJlZnMgPSAoQm9vbGVhbilvcHRpb25zLmdldChHRVRfSkFWQV9SRUZTKTsKKwkJQm9vbGVhbiBvYmpHZXRGdXp6eUVhclJlZnMgPSAoQm9vbGVhbilvcHRpb25zLmdldChHRVRfRlVaWllfRUFSX1JFRlMpOworCQlCb29sZWFuIG9iakdldEV4cGFuZFJlZnMgPSAoQm9vbGVhbilvcHRpb25zLmdldChHRVRfRVhQQU5ERURfTElCX1JFRlMpOworCQlib29sZWFuIGdldEphdmFSZWZzID0gb2JqR2V0SmF2YVJlZnMgIT0gbnVsbCA/IG9iakdldEphdmFSZWZzLmJvb2xlYW5WYWx1ZSgpIDogdHJ1ZTsKKwkJYm9vbGVhbiBmaW5kRnV6enlFQVJSZWZzID0gb2JqR2V0RnV6enlFYXJSZWZzICE9IG51bGwgPyBvYmpHZXRGdXp6eUVhclJlZnMuYm9vbGVhblZhbHVlKCkgOiBmYWxzZTsKKwkJYm9vbGVhbiBnZXRFeHBhbmRSZWZzID0gb2JqR2V0RXhwYW5kUmVmcyAhPSBudWxsID8gb2JqR2V0RXhwYW5kUmVmcy5ib29sZWFuVmFsdWUoKSA6IGZhbHNlOwogCQkKLQkJc2V0Q2FjaGVkUmVmZXJlbmNlcyhnZXRKYXZhUmVmcywgZmluZEZ1enp5RUFSUmVmcywgcmVmZXJlbmNlcyk7Ci0JCXJldHVybiByZWZlcmVuY2VzOwotCX0KLQkKLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXROb25NYW5pZmVzdFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBnZXROb25NYW5pZmVzdFJlZmVyZW5jZXModHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldE5vbk1hbmlmZXN0UmVmZXJlbmNlcyhmaW5hbCBib29sZWFuIGdldEphdmFSZWZzKSB7Ci0JCWZpbmFsIExpc3QgYWxsUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCS8vIGFkZCBjb21wb25lbnQgZmlsZSByZWZlcmVuY2VzCi0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gaGFyZFJlZmVyZW5jZXMgPSBzdXBlci5nZXRSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaGFyZFJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFsbFJlZnMuYWRkKGhhcmRSZWZlcmVuY2VzW2ldKTsKLQkJfQotCi0JCS8vIGFkZCB0aGUgZHluYW1pYyByZWZlcmVuY2VzIHNwZWNpZmllZCB2aWEgc3BlY2lhbGx5IHRhZ2dlZCBKRFQgY2xhc3NwYXRoIGVudHJpZXMKLQkJaWYgKGdldEphdmFSZWZzKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIGNwUmVmcyA9IGdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKGhhcmRSZWZlcmVuY2VzKTsgCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNwUmVmcy5sZW5ndGg7IGkrKykgewotCQkJCWFsbFJlZnMuYWRkKGNwUmVmc1tpXSk7CisJCUlWaXJ0dWFsUmVmZXJlbmNlW10gbm9uTWFuaWZlc3RSZWZzID0gZ2V0Tm9uTWFuaWZlc3RSZWZzKGdldEphdmFSZWZzKTsKKwkJaWYgKHZhbCAhPSBudWxsICYmIEZMQVRURU5BQkxFX1JFRkVSRU5DRVMuZXF1YWxzKHZhbCkpIHsKKwkJCWlmIChnZXRFeHBhbmRSZWZzKSB7CisJCQkJcmV0dXJuIEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0RXhwYW5kZWRSZWZlcmVuY2VzKHRoaXMsIG5vbk1hbmlmZXN0UmVmcyk7CiAJCQl9CisJCQlyZXR1cm4gbm9uTWFuaWZlc3RSZWZzOwogCQl9CisJCUFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gYWxsID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4oKTsKKwkJYWxsLmFkZEFsbChBcnJheXMuYXNMaXN0KG5vbk1hbmlmZXN0UmVmcykpOworCQkvLyByZXRyaWV2ZSB0aGUgZHluYW1pYyByZWZlcmVuY2VzIHNwZWNpZmllZCB2aWEgdGhlIE1BTklGRVNULk1GIGNsYXNzcGF0aAorCQljYWNoZU1hbmlmZXN0UmVmZXJlbmNlcygpOworCQlBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IGR5bmFtaWNSZWZzID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4oKTsKKwkJZHluYW1pY1JlZnMuYWRkQWxsKEFycmF5cy5hc0xpc3QocGFyZW50RWFyTWFuaWZlc3RSZWZlcmVuY2VzKSk7CisJCWlmIChmaW5kRnV6enlFQVJSZWZzKQorCQkJZHluYW1pY1JlZnMuYWRkQWxsKEFycmF5cy5hc0xpc3QoZnV6enlFYXJNYW5pZmVzdFJlZmVyZW5jZXMpKTsKIAkJCi0JCXJldHVybiAoSVZpcnR1YWxSZWZlcmVuY2VbXSkgYWxsUmVmcy50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVthbGxSZWZzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFtdIGdldE1hbmlmZXN0Q2xhc3NwYXRoKElWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZUNvbXBvbmVudCkgewotCQlTdHJpbmdbXSBtYW5pZmVzdENsYXNzcGF0aCA9IG51bGw7Ci0JCWlmKCFtb2R1bGVDb21wb25lbnQuaXNCaW5hcnkoKSl7Ci0JCQlJVmlydHVhbEZpbGUgdk1hbmlmZXN0ID0gbW9kdWxlQ29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKEoyRUVDb25zdGFudHMuTUFOSUZFU1RfVVJJKTsKLQkJCWlmICh2TWFuaWZlc3QuZXhpc3RzKCkpIHsKLQkJCQlJRmlsZSBtYW5pZmVzdEZpbGUgPSB2TWFuaWZlc3QuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4gPSBtYW5pZmVzdEZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQkJQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoaW4pOwotCQkJCQltYW5pZmVzdENsYXNzcGF0aCA9IG1hbmlmZXN0LmdldENsYXNzUGF0aFRva2VuaXplZCgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpbi5jbG9zZSgpOwotCQkJCQkJCWluID0gbnVsbDsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9CisJCWZvciAoSXRlcmF0b3I8SVZpcnR1YWxSZWZlcmVuY2U+IGl0ZXJhdG9yID0gZHluYW1pY1JlZnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gaXRlcmF0b3IubmV4dCgpOworCQkJSVZpcnR1YWxDb21wb25lbnQgZHluYW1pY0NvbXBvbmVudCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CisJCQlib29sZWFuIHNob3VsZEluY2x1ZGUgPSB0cnVlOworCQkJZm9yKElWaXJ0dWFsUmVmZXJlbmNlIGhhcmRSZWYgOiBnZXRIYXJkUmVmZXJlbmNlcygpKXsKKwkJCQlpZihoYXJkUmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5lcXVhbHMoZHluYW1pY0NvbXBvbmVudCkpeworCQkJCQlzaG91bGRJbmNsdWRlID0gZmFsc2U7CisJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KLQkJfSBlbHNlIHsKLQkJCW1hbmlmZXN0Q2xhc3NwYXRoID0gKChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpbW9kdWxlQ29tcG9uZW50KS5nZXRNYW5pZmVzdENsYXNzcGF0aCgpOworCQkJaWYgKHNob3VsZEluY2x1ZGUpIHsKKwkJCQlhbGwuYWRkKHJlZmVyZW5jZSk7CisJCQl9CiAJCX0KKwkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gYWxsLnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW2FsbC5zaXplKCldKTsKKwkJVmlydHVhbFJlZmVyZW5jZVV0aWxpdGllcy5JTlNUQU5DRS5lbnN1cmVSZWZlcmVuY2VzSGF2ZU5hbWVzKHJlZnMpOwogCQkKLQkJcmV0dXJuIG1hbmlmZXN0Q2xhc3NwYXRoOwotCQkJCisJCWlmIChnZXRFeHBhbmRSZWZzKSB7CisJCQlyZXR1cm4gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRFeHBhbmRlZFJlZmVyZW5jZXModGhpcywgcmVmcyk7CisJCX0KKwkJcmV0dXJuIHJlZnM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcygpIHsKKwkJcmV0dXJuIGdldFJlZmVyZW5jZXModHJ1ZSwgZmFsc2UpOworCX0KKworCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoZmluYWwgYm9vbGVhbiBnZXRKYXZhUmVmcywgZmluYWwgYm9vbGVhbiBmaW5kRnV6enlFQVJSZWZzKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlvcHRpb25zLnB1dChHRVRfSkFWQV9SRUZTLCBuZXcgQm9vbGVhbihnZXRKYXZhUmVmcykpOworCQlvcHRpb25zLnB1dChHRVRfRlVaWllfRUFSX1JFRlMsIG5ldyBCb29sZWFuKGZpbmRGdXp6eUVBUlJlZnMpKTsKKwkJcmV0dXJuIGdldFJlZmVyZW5jZXMob3B0aW9ucyk7CisJfQorCisJLyoqCisJICogTm9uLW1hbmlmZXN0IHJlZmVyZW5jZXMgYXJlIGhhcmQgcmVmZXJlbmNlcyAqT1IqIGphdmEgY2xhc3NwYXRoCisJICogcmVmZXJlbmNlcworCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXROb25NYW5pZmVzdFJlZmVyZW5jZXMoKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlvcHRpb25zLnB1dChJVmlydHVhbENvbXBvbmVudC5SRVFVRVNURURfUkVGRVJFTkNFX1RZUEUsIElWaXJ0dWFsQ29tcG9uZW50LkZMQVRURU5BQkxFX1JFRkVSRU5DRVMpOworCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcyhvcHRpb25zKTsKIAl9CiAJCi0JcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBnZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcyhudWxsKTsKKwlARGVwcmVjYXRlZAorCXB1YmxpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldE5vbk1hbmlmZXN0UmVmZXJlbmNlcyhmaW5hbCBib29sZWFuIGdldEphdmFSZWZzKSB7CisJCU1hcDxTdHJpbmcsIE9iamVjdD4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQlvcHRpb25zLnB1dChJVmlydHVhbENvbXBvbmVudC5SRVFVRVNURURfUkVGRVJFTkNFX1RZUEUsIElWaXJ0dWFsQ29tcG9uZW50LkZMQVRURU5BQkxFX1JFRkVSRU5DRVMpOworCQlvcHRpb25zLnB1dChHRVRfSkFWQV9SRUZTLCBuZXcgQm9vbGVhbihnZXRKYXZhUmVmcykpOworCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcyhvcHRpb25zKTsKIAl9CiAJCi0JcHJpdmF0ZSBJVmlydHVhbFJlZmVyZW5jZVtdIGdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKElWaXJ0dWFsUmVmZXJlbmNlW10gaGFyZFJlZmVyZW5jZXMpIHsKKwlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0Tm9uTWFuaWZlc3RSZWZzKGZpbmFsIGJvb2xlYW4gZ2V0SmF2YVJlZnMpIHsKKwkJQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiBhbGxSZWZzID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4oKTsKKwkJSVZpcnR1YWxSZWZlcmVuY2VbXSBoYXJkUmVmcyA9IGdldEhhcmRSZWZlcmVuY2VzKCk7CisJCWFsbFJlZnMuYWRkQWxsKEFycmF5cy5hc0xpc3QoaGFyZFJlZnMpKTsKKwkJaWYgKGdldEphdmFSZWZzKQorCQkJYWxsUmVmcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChnZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcyhoYXJkUmVmcykpKTsKKwkJcmV0dXJuIGFsbFJlZnMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbYWxsUmVmcy5zaXplKCldKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE1hbmlmZXN0Q2xhc3NwYXRoKAorCQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlQ29tcG9uZW50KSB7CisJCXJldHVybiBNYW5pZmVzdFV0aWxpdGllcy5nZXRNYW5pZmVzdENsYXNzcGF0aChtb2R1bGVDb21wb25lbnQsCisJCQkJbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKTsKKwl9CisKKwlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygKKwkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gaGFyZFJlZmVyZW5jZXMpIHsKKwkJZmluYWwgYm9vbGVhbiBpc0xlZ2FjeUoyRUUgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzTGVnYWN5SjJFRUNvbXBvbmVudCh0aGlzKTsKIAkJZmluYWwgYm9vbGVhbiBpc1dlYkFwcCA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViQ29tcG9uZW50KHRoaXMpOwotCQkKLQkJaWYoIWlzV2ViQXBwICYmICFDbGFzc3BhdGhEZXBlbmRlbmN5RW5hYmxlbWVudC5pc0FsbG93Q2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jeSgpKXsKLQkJCXJldHVybiBuZXcgSVZpcnR1YWxSZWZlcmVuY2VbMF07Ci0JCX0KKwogCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwogCQlmaW5hbCBMaXN0IGNwUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCisKIAkJdHJ5IHsKLQkJCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkgfHwgIXByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlTGl0ZS5OQVRVUkVfSUQpKSB7IAorCQkJaWYgKHByb2plY3QgPT0gbnVsbCB8fCAhcHJvamVjdC5pc0FjY2Vzc2libGUoKQorCQkJCQl8fCAhcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmVMaXRlLk5BVFVSRV9JRCkpIHsKIAkJCQlyZXR1cm4gbmV3IElWaXJ0dWFsUmVmZXJlbmNlWzBdOwogCQkJfQogCiAJCQlmaW5hbCBJSmF2YVByb2plY3RMaXRlIGphdmFQcm9qZWN0TGl0ZSA9IEphdmFDb3JlTGl0ZS5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoamF2YVByb2plY3RMaXRlID09IG51bGwpIHsKKwkJCWlmIChqYXZhUHJvamVjdExpdGUgPT0gbnVsbCkKIAkJCQlyZXR1cm4gbmV3IElWaXJ0dWFsUmVmZXJlbmNlWzBdOwotCQkJfQogCiAJCQkvLyByZXRyaWV2ZSBhbGwgcmVmZXJlbmNlZCBjbGFzc3BhdGggZW50cmllcwotCQkJZmluYWwgTWFwIHJlZmVyZW5jZWRFbnRyaWVzID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwuZ2V0Q29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGphdmFQcm9qZWN0TGl0ZSwgaXNXZWJBcHApOworCQkJZmluYWwgTWFwIHJlZmVyZW5jZWRFbnRyaWVzID0gQ2xhc3NwYXRoRGVwZW5kZW5jeVV0aWwKKwkJCQkJLmdldENvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhqYXZhUHJvamVjdExpdGUsaXNMZWdhY3lKMkVFKTsKIAotCQkJaWYgKHJlZmVyZW5jZWRFbnRyaWVzLmlzRW1wdHkoKSkgeworCQkJaWYgKHJlZmVyZW5jZWRFbnRyaWVzLmlzRW1wdHkoKSkKIAkJCQlyZXR1cm4gbmV3IElWaXJ0dWFsUmVmZXJlbmNlWzBdOwotCQkJfQogCi0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIGlubmVySGFyZFJlZmVyZW5jZXMgPSBoYXJkUmVmZXJlbmNlczsKLQkJCWlmIChpbm5lckhhcmRSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCQkvLyBvbmx5IGNvbXB1dGUgdGhpcyBub3Qgc2V0IGFuZCBpZiB3ZSBoYXZlIHNvbWUgY3AgZGVwZW5kZW5jaWVzIAotCQkJCWlubmVySGFyZFJlZmVyZW5jZXMgPSBzdXBlci5nZXRSZWZlcmVuY2VzKCk7Ci0JCQl9CisJCQlJVmlydHVhbFJlZmVyZW5jZVtdIGlubmVySGFyZFJlZmVyZW5jZXMgPSBoYXJkUmVmZXJlbmNlcyA9PSBudWxsID8gCisJCQkJCWdldEhhcmRSZWZlcmVuY2VzKCkgOiBoYXJkUmVmZXJlbmNlczsKIAkJCWZpbmFsIElQYXRoW10gaGFyZFJlZlBhdGhzID0gbmV3IElQYXRoW2lubmVySGFyZFJlZmVyZW5jZXMubGVuZ3RoXTsKIAkJCWZvciAoaW50IGogPSAwOyBqIDwgaW5uZXJIYXJkUmVmZXJlbmNlcy5sZW5ndGg7IGorKykgewogCQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBpbm5lckhhcmRSZWZlcmVuY2VzW2pdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKIAkJCQlpZiAoY29tcC5pc0JpbmFyeSgpKSB7Ci0JCQkJCWZpbmFsIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IGFyY2hpdmVDb21wID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSBjb21wOwotCQkJCQlmaW5hbCBGaWxlIGRpc2tGaWxlID0gYXJjaGl2ZUNvbXAuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7Ci0JCQkJCUlQYXRoIGRpc2tQYXRoID0gbnVsbDsKLQkJCQkJaWYgKGRpc2tGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlkaXNrUGF0aCA9bmV3IFBhdGgoZGlza0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCSAgICAgICAgICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgICAgICAgICAgZmluYWwgSUZpbGUgaUZpbGUgPSBhcmNoaXZlQ29tcC5nZXRVbmRlcmx5aW5nV29ya2JlbmNoRmlsZSgpOwotCSAgICAgICAgICAgICAgICAgICAgZGlza1BhdGggPSBpRmlsZS5nZXRGdWxsUGF0aCgpOwotCSAgICAgICAgICAgICAgICB9Ci0JCQkJCWhhcmRSZWZQYXRoc1tqXSA9IGRpc2tQYXRoOworCQkJCQloYXJkUmVmUGF0aHNbal0gPSAoSVBhdGgpY29tcC5nZXRBZGFwdGVyKElQYXRoLmNsYXNzKTsKIAkJCQl9CiAJCQl9Ci0JCQkKKwogCQkJSUNvbnRhaW5lcltdIG1hcHBlZENsYXNzRm9sZGVycyA9IG51bGw7CiAJCQlmaW5hbCBJdGVyYXRvciBpID0gcmVmZXJlbmNlZEVudHJpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKIAkJCXdoaWxlIChpLmhhc05leHQoKSkgewogCQkJCWZpbmFsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IChJQ2xhc3NwYXRoRW50cnkpIGkubmV4dCgpOwotCQkJCWZpbmFsIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0cmliID0gKElDbGFzc3BhdGhBdHRyaWJ1dGUpIHJlZmVyZW5jZWRFbnRyaWVzLmdldChlbnRyeSk7CisJCQkJZmluYWwgSUNsYXNzcGF0aEF0dHJpYnV0ZSBhdHRyaWIgPSAoSUNsYXNzcGF0aEF0dHJpYnV0ZSkgcmVmZXJlbmNlZEVudHJpZXMKKwkJCQkJCS5nZXQoZW50cnkpOwogCQkJCWZpbmFsIGJvb2xlYW4gaXNDbGFzc0ZvbGRlciA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmlzQ2xhc3NGb2xkZXJFbnRyeShlbnRyeSk7Ci0JCQkJZmluYWwgSVBhdGggcnVudGltZVBhdGggPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRSdW50aW1lUGF0aChhdHRyaWIsIGlzV2ViQXBwLCBpc0NsYXNzRm9sZGVyKTsJCQkJCisJCQkJZmluYWwgSVBhdGggcnVudGltZVBhdGggPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRSdW50aW1lUGF0aChhdHRyaWIsIGlzV2ViQXBwLCBpc0NsYXNzRm9sZGVyKTsKIAkJCQlib29sZWFuIGFkZCA9IHRydWU7CiAJCQkJZmluYWwgSVBhdGggZW50cnlMb2NhdGlvbiA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldEVudHJ5TG9jYXRpb24oZW50cnkpOwogCQkJCWlmIChlbnRyeUxvY2F0aW9uID09IG51bGwpIHsKLQkJCQkJLy8gdW5hYmxlIHRvIHJldHJpZXZlIGxvY2F0aW9uIGZvciBjcCBlbnRyeSwgZG8gbm90IGNvbnRyaWJ1dGUgYXMgYSB2aXJ0dWFsIHJlZgorCQkJCQkvLyB1bmFibGUgdG8gcmV0cmlldmUgbG9jYXRpb24gZm9yIGNwIGVudHJ5LCBkbyBub3QKKwkJCQkJLy8gY29udHJpYnV0ZSBhcyBhIHZpcnR1YWwgcmVmCiAJCQkJCWFkZCA9IGZhbHNlOwogCQkJCX0gZWxzZSBpZiAoIWlzQ2xhc3NGb2xkZXIpIHsgLy8gY2hlY2sgaGFyZCBhcmNoaXZlIHJlZnMKIAkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBoYXJkUmVmUGF0aHMubGVuZ3RoOyBqKyspIHsKIAkJCQkJCWlmIChlbnRyeUxvY2F0aW9uLmVxdWFscyhoYXJkUmVmUGF0aHNbal0pKSB7Ci0JCQkJCQkJLy8gZW50cnkgcmVzb2x2ZXMgdG8gc2FtZSBmaWxlIGFzIGV4aXN0aW5nIGhhcmQgcmVmZXJlbmNlLCBjYW4gc2tpcAorCQkJCQkJCS8vIGVudHJ5IHJlc29sdmVzIHRvIHNhbWUgZmlsZSBhcyBleGlzdGluZyBoYXJkCisJCQkJCQkJLy8gcmVmZXJlbmNlLCBjYW4gc2tpcAogCQkJCQkJCWFkZCA9IGZhbHNlOwogCQkJCQkJCWJyZWFrOwogCQkJCQkJfQogCQkJCQl9Ci0JCQkJfSBlbHNlIHsgLy8gY2hlY2sgY2xhc3MgZm9sZGVycyBtYXBwZWQgaW4gY29tcG9uZW50IGZpbGUgYXMgY2xhc3MgZm9sZGVycyBhc3NvY2lhdGVkIHdpdGggbWFwcGVkIHNyYyBmb2xkZXJzCisJCQkJfSBlbHNlIHsgLy8gY2hlY2sgY2xhc3MgZm9sZGVycyBtYXBwZWQgaW4gY29tcG9uZW50IGZpbGUgYXMKKwkJCQkJLy8gY2xhc3MgZm9sZGVycyBhc3NvY2lhdGVkIHdpdGggbWFwcGVkIHNyYyBmb2xkZXJzCiAJCQkJCWlmIChtYXBwZWRDbGFzc0ZvbGRlcnMgPT0gbnVsbCkgewotCQkJCQkJTGlzdCA8SUNvbnRhaW5lcj4gY29udGFpbmVycyA9IEphdmFMaXRlVXRpbGl0aWVzLmdldEphdmFPdXRwdXRDb250YWluZXJzKHRoaXMpOwotCQkJCQkJbWFwcGVkQ2xhc3NGb2xkZXJzID0gY29udGFpbmVycy50b0FycmF5KG5ldyBJQ29udGFpbmVyW2NvbnRhaW5lcnMuc2l6ZSgpXSk7CisJCQkJCQlMaXN0PElDb250YWluZXI+IGNvbnRhaW5lcnMgPSBKYXZhTGl0ZVV0aWxpdGllcworCQkJCQkJCQkuZ2V0SmF2YU91dHB1dENvbnRhaW5lcnModGhpcyk7CisJCQkJCQltYXBwZWRDbGFzc0ZvbGRlcnMgPSBjb250YWluZXJzCisJCQkJCQkJCS50b0FycmF5KG5ldyBJQ29udGFpbmVyW2NvbnRhaW5lcnMuc2l6ZSgpXSk7CiAJCQkJCX0KIAkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtYXBwZWRDbGFzc0ZvbGRlcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmIChlbnRyeUxvY2F0aW9uLmVxdWFscyhtYXBwZWRDbGFzc0ZvbGRlcnNbal0uZ2V0RnVsbFBhdGgoKSkpIHsKLQkJCQkJCQkvLyBlbnRyeSByZXNvbHZlcyB0byBzYW1lIGZpbGUgYXMgZXhpc3RpbmcgY2xhc3MgZm9sZGVyIG1hcHBpbmcsIHNraXAKKwkJCQkJCWlmIChlbnRyeUxvY2F0aW9uLmVxdWFscyhtYXBwZWRDbGFzc0ZvbGRlcnNbal0KKwkJCQkJCQkJLmdldEZ1bGxQYXRoKCkpKSB7CisJCQkJCQkJLy8gZW50cnkgcmVzb2x2ZXMgdG8gc2FtZSBmaWxlIGFzIGV4aXN0aW5nIGNsYXNzCisJCQkJCQkJLy8gZm9sZGVyIG1hcHBpbmcsIHNraXAKIAkJCQkJCQlhZGQgPSBmYWxzZTsKIAkJCQkJCQlicmVhazsKIAkJCQkJCX0KLQkJCQkJfSAKKwkJCQkJfQogCQkJCX0KIAogCQkJCWlmIChhZGQgJiYgZW50cnlMb2NhdGlvbiAhPSBudWxsKSB7CisJCQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIGVudHJ5UmVmZXJlbmNlOwogCQkJCQlTdHJpbmcgY29tcG9uZW50UGF0aCA9IG51bGw7Ci0JCQkJCUNsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50IGVudHJ5Q29tcG9uZW50ID0gbnVsbDsKLQkJCQkJLyoKLQkJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkgewotCQkJCQkJY29tcG9uZW50UGF0aCA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkNMQVNTUEFUSEFSQ0hJVkVUWVBFOworCQkJCQkKKwkJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCkKKwkJCQkJeyAJCQkJCQogCQkJCQkJZmluYWwgSVByb2plY3QgY3BFbnRyeVByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoZW50cnkuZ2V0UGF0aCgpLmxhc3RTZWdtZW50KCkpOwotCQkJCQkJZW50cnlDb21wb25lbnQgPSAoVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChjcEVudHJ5UHJvamVjdCwgY29tcG9uZW50UGF0aCk7CisJCQkJCQlJVmlydHVhbENvbXBvbmVudCBlbnRyeUNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGNwRW50cnlQcm9qZWN0KTsKKwkJCQkJCWVudHJ5UmVmZXJlbmNlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZWZlcmVuY2UodGhpcywgZW50cnlDb21wb25lbnQsIHJ1bnRpbWVQYXRoKTsKKwkJCQkJCWVudHJ5UmVmZXJlbmNlLnNldEFyY2hpdmVOYW1lKFZpcnR1YWxSZWZlcmVuY2VVdGlsaXRpZXMuSU5TVEFOQ0UuZ2V0RGVmYXVsdFByb2plY3RBcmNoaXZlTmFtZShlbnRyeUNvbXBvbmVudCkpOwogCQkJCQl9IGVsc2UgewotCQkJCQkqLwotCQkJCQljb21wb25lbnRQYXRoID0gVmlydHVhbEFyY2hpdmVDb21wb25lbnQuQ0xBU1NQQVRIQVJDSElWRVRZUEUgKyBJUGF0aC5TRVBBUkFUT1IgKyBlbnRyeUxvY2F0aW9uLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJCQkJZW50cnlDb21wb25lbnQgPSBuZXcgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQocHJvamVjdCwgY29tcG9uZW50UGF0aCwgaXNDbGFzc0ZvbGRlcik7Ci0JCQkJCS8vfQotCQkJCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZSBlbnRyeVJlZmVyZW5jZSA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVmZXJlbmNlKHRoaXMsIGVudHJ5Q29tcG9uZW50LCBydW50aW1lUGF0aCk7Ci0JCQkJCWVudHJ5UmVmZXJlbmNlLnNldEFyY2hpdmVOYW1lKENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldEFyY2hpdmVOYW1lKGVudHJ5KSk7CisJCQkJCQljb21wb25lbnRQYXRoID0gVmlydHVhbEFyY2hpdmVDb21wb25lbnQuQ0xBU1NQQVRIQVJDSElWRVRZUEUgKyBJUGF0aC5TRVBBUkFUT1IgKyBlbnRyeUxvY2F0aW9uLnRvUG9ydGFibGVTdHJpbmcoKTsKKwkJCQkJCUNsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50IGVudHJ5Q29tcG9uZW50ID0gbmV3IENsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50KHByb2plY3QsIGNvbXBvbmVudFBhdGgsIGlzQ2xhc3NGb2xkZXIpOworCQkJCQkJZW50cnlSZWZlcmVuY2UgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlZmVyZW5jZSh0aGlzLCBlbnRyeUNvbXBvbmVudCwgcnVudGltZVBhdGgpOworCQkJCQkJKChWaXJ0dWFsUmVmZXJlbmNlKSBlbnRyeVJlZmVyZW5jZSkuc2V0RGVyaXZlZCh0cnVlKTsKKwkJCQkJCWVudHJ5UmVmZXJlbmNlLnNldEFyY2hpdmVOYW1lKENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldEFyY2hpdmVOYW1lKGVudHJ5KSk7CisJCQkJCX0KIAkJCQkJY3BSZWZzLmFkZChlbnRyeVJlZmVyZW5jZSk7CiAJCQkJfQogCQkJfQogCiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gam1lKSB7CiAJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGptZSk7Ci0JCX0gCi0JCQorCQl9CisKIAkJcmV0dXJuIChJVmlydHVhbFJlZmVyZW5jZVtdKSBjcFJlZnMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbY3BSZWZzLnNpemUoKV0pOwogCX0KIAotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNYW5pZmVzdFJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlQ29tcG9uZW50LCBJVmlydHVhbFJlZmVyZW5jZVtdIGhhcmRSZWZlcmVuY2VzKSB7Ci0JCXJldHVybiBnZXRNYW5pZmVzdFJlZmVyZW5jZXMobW9kdWxlQ29tcG9uZW50LCBoYXJkUmVmZXJlbmNlcywgZmFsc2UpOworCXByaXZhdGUgdm9pZCBjYWNoZU1hbmlmZXN0UmVmZXJlbmNlcygpIHsKKwkJaWYgKHBhcmVudEVhck1hbmlmZXN0UmVmZXJlbmNlcyA9PSBudWxsCisJCQkJfHwgZnV6enlFYXJNYW5pZmVzdFJlZmVyZW5jZXMgPT0gbnVsbCkgeworCQkJSVZpcnR1YWxSZWZlcmVuY2VbXVtdIHJlZnMgPSBjYWxjdWxhdGVNYW5pZmVzdFJlZmVyZW5jZXModGhpcywgdHJ1ZSk7CisJCQlwYXJlbnRFYXJNYW5pZmVzdFJlZmVyZW5jZXMgPSByZWZzWzBdOworCQkJZnV6enlFYXJNYW5pZmVzdFJlZmVyZW5jZXMgPSByZWZzWzFdOworCQl9CiAJfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNYW5pZmVzdFJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlQ29tcG9uZW50LCBJVmlydHVhbFJlZmVyZW5jZVtdIGhhcmRSZWZlcmVuY2VzLCBib29sZWFuIGZpbmRGdXp6eUVBUlJlZnMpIHsKLQkJTGlzdCBkeW5hbWljUmVmZXJlbmNlcyA9IG51bGw7Ci0JCVN0cmluZyBbXSBtYW5pZmVzdENsYXNzcGF0aCA9IGdldE1hbmlmZXN0Q2xhc3NwYXRoKG1vZHVsZUNvbXBvbmVudCk7IAogCi0JCUlWaXJ0dWFsUmVmZXJlbmNlIGZvdW5kUmVmID0gbnVsbDsKLQkJU3RyaW5nIGVhckFyY2hpdmVVUkkgPSBudWxsOyAvL1RoZSBVUkkgZm9yIHRoaXMgYXJjaGl2ZSBpbiB0aGUgRUFSCi0JCWJvb2xlYW4gc2ltcGxlUGF0aCA9IGZhbHNlOwotCQkKLQkJaWYgKG1hbmlmZXN0Q2xhc3NwYXRoICE9IG51bGwgJiYgbWFuaWZlc3RDbGFzc3BhdGgubGVuZ3RoID4gMCkgewotCQkJYm9vbGVhbiBbXSBmb3VuZFJlZkFscmVhZHkgPSBmaW5kRnV6enlFQVJSZWZzID8gbmV3IGJvb2xlYW5bbWFuaWZlc3RDbGFzc3BhdGgubGVuZ3RoXTogbnVsbDsKLQkJCWlmKG51bGwgIT0gZm91bmRSZWZBbHJlYWR5KXsKLQkJCQlmb3IoaW50IGk9MDsgaTxmb3VuZFJlZkFscmVhZHkubGVuZ3RoOyBpKyspewotCQkJCQlmb3VuZFJlZkFscmVhZHlbaV0gPSBmYWxzZTsKKwlwcml2YXRlIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZVtdW10gY2FsY3VsYXRlTWFuaWZlc3RSZWZlcmVuY2VzKAorCQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlQ29tcG9uZW50LCBib29sZWFuIGNoZWNrRnV6enlSZWZzKSB7CisJCVN0cmluZ1tdIG1hbmlmZXN0Q2xhc3NwYXRoID0gZ2V0TWFuaWZlc3RDbGFzc3BhdGgobW9kdWxlQ29tcG9uZW50KTsKKwkJSVByb2plY3RbXSBlYXJQcm9qZWN0cyA9IEVhclV0aWxpdGllcworCQkJCS5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKG1vZHVsZUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOworCQkvLyBFYXJseSBhYm9ydHMKKwkJaWYgKG1hbmlmZXN0Q2xhc3NwYXRoID09IG51bGwgfHwgbWFuaWZlc3RDbGFzc3BhdGgubGVuZ3RoID09IDAKKwkJCQl8fCBlYXJQcm9qZWN0cy5sZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIG5ldyBJVmlydHVhbFJlZmVyZW5jZVtdW10geyBuZXcgSVZpcnR1YWxSZWZlcmVuY2VbMF0sIG5ldyBJVmlydHVhbFJlZmVyZW5jZVswXSB9OworCQl9CisKKwkJLy8gR2V0IG91ciBmb3VuZCBjYWNoZSBnb2luZworCQlib29sZWFuW10gZm91bmRSZWZBbHJlYWR5ID0gbmV3IGJvb2xlYW5bbWFuaWZlc3RDbGFzc3BhdGgubGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmb3VuZFJlZkFscmVhZHkubGVuZ3RoOyBpKyspCisJCQlmb3VuZFJlZkFscmVhZHlbaV0gPSBmYWxzZTsKKworCQkvLyBHZXQgdGhlIHRydWUgcGFyZW50IHJlZmVyZW5jZXMKKwkJSVByb2plY3QgZmlyc3RFYXIgPSBlYXJQcm9qZWN0c1tlYXJQcm9qZWN0cy5sZW5ndGggLSAxXTsKKwkJQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiB0bXAgPSBjYWNoZU9uZUVhclByb2plY3RNYW5pZmVzdFJlZnMoCisJCQkJbW9kdWxlQ29tcG9uZW50LCBmaXJzdEVhciwgbWFuaWZlc3RDbGFzc3BhdGgsIGZvdW5kUmVmQWxyZWFkeSk7CisJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcGFyZW50RWFyTWFuaWZlc3RSZWZlcmVuY2VzID0gdG1wCisJCQkJLnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW3RtcC5zaXplKCldKTsKKworCQlBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IGR5bmFtaWNSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4oKTsKKwkJLy8gZ2V0IHRoZSBmdXp6eSByZWZlcmVuY2VzCisJCWlmIChjaGVja0Z1enp5UmVmcykgeworCQkJaWYgKGVhclByb2plY3RzLmxlbmd0aCA+IDEpIHsKKwkJCQlmb3IgKGludCBlYXJJbmRleCA9IGVhclByb2plY3RzLmxlbmd0aCAtIDI7IGVhckluZGV4ID4gLTE7IGVhckluZGV4LS0pIHsKKwkJCQkJdG1wID0gY2FjaGVPbmVFYXJQcm9qZWN0TWFuaWZlc3RSZWZzKG1vZHVsZUNvbXBvbmVudCwKKwkJCQkJCQlmaXJzdEVhciwgbWFuaWZlc3RDbGFzc3BhdGgsIGZvdW5kUmVmQWxyZWFkeSk7CisJCQkJCWR5bmFtaWNSZWZlcmVuY2VzLmFkZEFsbCh0bXApOwogCQkJCX0KIAkJCX0KLQkJCQotCQkJSVByb2plY3QgW10gZWFyUHJvamVjdHMgPSBFYXJVdGlsaXRpZXMuZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhtb2R1bGVDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCWZvciAoSVByb2plY3QgZWFyUHJvamVjdCA6IGVhclByb2plY3RzKSB7Ci0JCQkJaWYoIUphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGVhclByb2plY3QpKXsKKwkJfQorCQlJVmlydHVhbFJlZmVyZW5jZVtdIGZ1enp5RWFyTWFuaWZlc3RSZWZlcmVuY2VzID0gZHluYW1pY1JlZmVyZW5jZXMKKwkJCQkudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbZHluYW1pY1JlZmVyZW5jZXMuc2l6ZSgpXSk7CisKKwkJLy8gcmV0dXJuIG91ciB0d28gY3JlYXR1cmVzCisJCXJldHVybiBuZXcgSVZpcnR1YWxSZWZlcmVuY2VbXVtdIHsgcGFyZW50RWFyTWFuaWZlc3RSZWZlcmVuY2VzLAorCQkJCWZ1enp5RWFyTWFuaWZlc3RSZWZlcmVuY2VzIH07CisJfQorCisJcHJvdGVjdGVkIHN0YXRpYyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+IGNhY2hlT25lRWFyUHJvamVjdE1hbmlmZXN0UmVmcygKKwkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZUNvbXBvbmVudCwgSVByb2plY3QgZWFyUHJvamVjdCwKKwkJCVN0cmluZ1tdIG1hbmlmZXN0Q2xhc3NwYXRoLCBib29sZWFuW10gZm91bmRSZWZBbHJlYWR5KSB7CisJCUFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gZHluYW1pY1JlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPigpOworCisJCUlWaXJ0dWFsUmVmZXJlbmNlIGZvdW5kUmVmID0gbnVsbDsKKwkJU3RyaW5nIGVhckFyY2hpdmVVUkkgPSBudWxsOyAvLyBUaGUgVVJJIGZvciB0aGlzIGFyY2hpdmUgaW4gdGhlIEVBUgorCQlib29sZWFuIHNpbXBsZVBhdGggPSBmYWxzZTsKKwkJSVZpcnR1YWxSZWZlcmVuY2VbXSBlYXJSZWZzID0gbnVsbDsKKwkJSVZpcnR1YWxDb21wb25lbnQgdGVtcEVBUkNvbXBvbmVudCA9IENvbXBvbmVudENvcmUKKwkJCQkuY3JlYXRlQ29tcG9uZW50KGVhclByb2plY3QpOworCQlJVmlydHVhbFJlZmVyZW5jZVtdIHRlbXBFYXJSZWZzID0gdGVtcEVBUkNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7CisJCWZvciAoaW50IGogPSAwOyBqIDwgdGVtcEVhclJlZnMubGVuZ3RoICYmIGVhclJlZnMgPT0gbnVsbDsgaisrKSB7CisJCQlpZiAodGVtcEVhclJlZnNbal0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmVxdWFscyhtb2R1bGVDb21wb25lbnQpKSB7CisJCQkJZWFyUmVmcyA9IHRlbXBFYXJSZWZzOworCQkJCWZvdW5kUmVmID0gdGVtcEVhclJlZnNbal07CisJCQkJZWFyQXJjaGl2ZVVSSSA9IGZvdW5kUmVmLmdldEFyY2hpdmVOYW1lKCk7CisJCQkJc2ltcGxlUGF0aCA9IGVhckFyY2hpdmVVUkkgIT0gbnVsbCA/IGVhckFyY2hpdmVVUkkKKwkJCQkJCS5sYXN0SW5kZXhPZigiLyIpID09IC0xIDogdHJ1ZTsgLy8kTk9OLU5MUy0xJAorCQkJfQorCQl9CisJCWlmIChudWxsICE9IGVhclJlZnMpIHsKKwkJCWZvciAoaW50IG1hbmlmZXN0SW5kZXggPSAwOyBtYW5pZmVzdEluZGV4IDwgbWFuaWZlc3RDbGFzc3BhdGgubGVuZ3RoOyBtYW5pZmVzdEluZGV4KyspIHsKKwkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CisJCQkJaWYgKGZvdW5kUmVmQWxyZWFkeSAhPSBudWxsICYmIGZvdW5kUmVmQWxyZWFkeVttYW5pZmVzdEluZGV4XSkgewogCQkJCQljb250aW51ZTsKIAkJCQl9Ci0JCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBlYXJSZWZzID0gbnVsbDsKLQkJCQlJVmlydHVhbENvbXBvbmVudCB0ZW1wRUFSQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUHJvamVjdCk7Ci0JCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSB0ZW1wRWFyUmVmcyA9IHRlbXBFQVJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgdGVtcEVhclJlZnMubGVuZ3RoICYmIGVhclJlZnMgPT0gbnVsbDsgaisrKSB7Ci0JCQkJCWlmICh0ZW1wRWFyUmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZXF1YWxzKG1vZHVsZUNvbXBvbmVudCkpIHsKLQkJCQkJCWVhclJlZnMgPSB0ZW1wRWFyUmVmczsKLQkJCQkJCWZvdW5kUmVmID0gdGVtcEVhclJlZnNbal07Ci0JCQkJCQllYXJBcmNoaXZlVVJJID0gZm91bmRSZWYuZ2V0QXJjaGl2ZU5hbWUoKTsgCi0JCQkJCQlzaW1wbGVQYXRoID0gZWFyQXJjaGl2ZVVSSSAhPSBudWxsID8gZWFyQXJjaGl2ZVVSSS5sYXN0SW5kZXhPZigiLyIpID09IC0xIDogdHJ1ZTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChudWxsICE9IGVhclJlZnMpIHsKLQkJCQkJZm9yIChpbnQgbWFuaWZlc3RJbmRleCA9IDA7IG1hbmlmZXN0SW5kZXggPCBtYW5pZmVzdENsYXNzcGF0aC5sZW5ndGg7IG1hbmlmZXN0SW5kZXgrKykgewotCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQkJaWYoZm91bmRSZWZBbHJlYWR5ICE9IG51bGwgJiYgZm91bmRSZWZBbHJlYWR5W21hbmlmZXN0SW5kZXhdKXsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWFyUmVmcy5sZW5ndGggJiYgIWZvdW5kOyBqKyspIHsKLQkJCQkJCQlpZihmb3VuZFJlZiAhPSBlYXJSZWZzW2pdKXsKLQkJCQkJCQkJU3RyaW5nIGFyY2hpdmVOYW1lID0gZWFyUmVmc1tqXS5nZXRBcmNoaXZlTmFtZSgpOwotCQkJCQkJCQlpZiAobnVsbCAhPSBhcmNoaXZlTmFtZSl7Ci0JCQkJCQkJCQlib29sZWFuIHNob3VsZEFkZCA9IGZhbHNlOwotCQkJCQkJCQkJU3RyaW5nIG1hbmlmZXN0RW50cnlTdHJpbmcgPSBtYW5pZmVzdENsYXNzcGF0aFttYW5pZmVzdEluZGV4XTsKLQkJCQkJCQkJCWlmKCBtYW5pZmVzdEVudHJ5U3RyaW5nICE9IG51bGwgKXsKLQkJCQkJCQkJCQlJUGF0aCBtYW5pZmVzdFBhdGggPSBuZXcgUGF0aChtYW5pZmVzdEVudHJ5U3RyaW5nKTsKLQkJCQkJCQkJCQltYW5pZmVzdEVudHJ5U3RyaW5nID0gbWFuaWZlc3RQYXRoLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQotCQkJCQkJCQkJaWYoc2ltcGxlUGF0aCAmJiBtYW5pZmVzdEVudHJ5U3RyaW5nICE9IG51bGwgJiYgbWFuaWZlc3RFbnRyeVN0cmluZy5sYXN0SW5kZXhPZigiLyIpID09IC0xKXsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCXNob3VsZEFkZCA9IGFyY2hpdmVOYW1lLmVxdWFscyhtYW5pZmVzdEVudHJ5U3RyaW5nKTsJCi0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCVN0cmluZyBlYXJSZWxhdGl2ZVVSSSA9IEFyY2hpdmVVdGlsLmRlcml2ZUVBUlJlbGF0aXZlVVJJKG1hbmlmZXN0RW50cnlTdHJpbmcsIGVhckFyY2hpdmVVUkkpOwotCQkJCQkJCQkJCWlmKG51bGwgIT0gZWFyUmVsYXRpdmVVUkkpewotCQkJCQkJCQkJCQlzaG91bGRBZGQgPSBlYXJSZWxhdGl2ZVVSSS5lcXVhbHMoYXJjaGl2ZU5hbWUpOwkKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCWlmKHNob3VsZEFkZCl7Ci0JCQkJCQkJCQkJaWYoZmluZEZ1enp5RUFSUmVmcyAmJiBmb3VuZFJlZkFscmVhZHkgIT0gbnVsbCl7Ci0JCQkJCQkJCQkJCWZvdW5kUmVmQWxyZWFkeVttYW5pZmVzdEluZGV4XSA9IHRydWU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCQlib29sZWFuIHNob3VsZEluY2x1ZGUgPSB0cnVlOwotCQkJCQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGR5bmFtaWNDb21wb25lbnQgPSBlYXJSZWZzW2pdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCQkJCQlpZihudWxsICE9IGhhcmRSZWZlcmVuY2VzKXsKLQkJCQkJCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBoYXJkUmVmZXJlbmNlcy5sZW5ndGggJiYgc2hvdWxkSW5jbHVkZTsgaysrKSB7Ci0JCQkJCQkJCQkJCQlpZiAoaGFyZFJlZmVyZW5jZXNba10uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmVxdWFscyhkeW5hbWljQ29tcG9uZW50KSkgewotCQkJCQkJCQkJCQkJCXNob3VsZEluY2x1ZGUgPSBmYWxzZTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlpZiAoc2hvdWxkSW5jbHVkZSkgewotCQkJCQkJCQkJCQlJVmlydHVhbFJlZmVyZW5jZSBkeW5hbWljUmVmZXJlbmNlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZWZlcmVuY2UobW9kdWxlQ29tcG9uZW50LCBkeW5hbWljQ29tcG9uZW50KTsKLQkJCQkJCQkJCQkJaWYgKG51bGwgPT0gZHluYW1pY1JlZmVyZW5jZXMpIHsKLQkJCQkJCQkJCQkJCWR5bmFtaWNSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCWR5bmFtaWNSZWZlcmVuY2VzLmFkZChkeW5hbWljUmVmZXJlbmNlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9CisJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlYXJSZWZzLmxlbmd0aCAmJiAhZm91bmQ7IGorKykgeworCQkJCQlpZiAoZm91bmRSZWYgIT0gZWFyUmVmc1tqXSkgeworCQkJCQkJU3RyaW5nIGFyY2hpdmVOYW1lID0gZWFyUmVmc1tqXS5nZXRBcmNoaXZlTmFtZSgpOworCQkJCQkJaWYgKG51bGwgIT0gYXJjaGl2ZU5hbWUpIHsKKwkJCQkJCQlib29sZWFuIHNob3VsZEFkZCA9IGZhbHNlOworCQkJCQkJCVN0cmluZyBtYW5pZmVzdEVudHJ5U3RyaW5nID0gbWFuaWZlc3RDbGFzc3BhdGhbbWFuaWZlc3RJbmRleF07CisJCQkJCQkJaWYgKG1hbmlmZXN0RW50cnlTdHJpbmcgIT0gbnVsbCkgeworCQkJCQkJCQlJUGF0aCBtYW5pZmVzdFBhdGggPSBuZXcgUGF0aChtYW5pZmVzdEVudHJ5U3RyaW5nKTsKKwkJCQkJCQkJbWFuaWZlc3RFbnRyeVN0cmluZyA9IG1hbmlmZXN0UGF0aAorCQkJCQkJCQkJCS50b1BvcnRhYmxlU3RyaW5nKCk7CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKHNpbXBsZVBhdGggJiYgbWFuaWZlc3RFbnRyeVN0cmluZyAhPSBudWxsCisJCQkJCQkJCQkmJiBtYW5pZmVzdEVudHJ5U3RyaW5nLmxhc3RJbmRleE9mKCIvIikgPT0gLTEpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQlzaG91bGRBZGQgPSBhcmNoaXZlTmFtZS5lcXVhbHMobWFuaWZlc3RFbnRyeVN0cmluZyk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJU3RyaW5nIGVhclJlbGF0aXZlVVJJID0gQXJjaGl2ZVV0aWwKKwkJCQkJCQkJCQkuZGVyaXZlRUFSUmVsYXRpdmVVUkkobWFuaWZlc3RFbnRyeVN0cmluZywKKwkJCQkJCQkJCQkJCWVhckFyY2hpdmVVUkkpOworCQkJCQkJCQlpZiAobnVsbCAhPSBlYXJSZWxhdGl2ZVVSSSkgeworCQkJCQkJCQkJSVBhdGggZWFyUmVmUGF0aCA9IGVhclJlZnNbal0uZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKTsKKwkJCQkJCQkJCXNob3VsZEFkZCA9IGVhclJlbGF0aXZlVVJJLmVxdWFscyhlYXJSZWZQYXRoLmFwcGVuZChhcmNoaXZlTmFtZSkudG9TdHJpbmcoKSk7CiAJCQkJCQkJCX0KIAkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfQotCQkJCQlpZighZmluZEZ1enp5RUFSUmVmcyl7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZihmb3VuZFJlZkFscmVhZHkgIT0gbnVsbCl7Ci0JCQkJCQlib29sZWFuIGZvdW5kQWxsID0gdHJ1ZTsKLQkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBmb3VuZFJlZkFscmVhZHkubGVuZ3RoICYmIGZvdW5kQWxsOyBpKyspewotCQkJCQkJCWlmKCFmb3VuZFJlZkFscmVhZHlbaV0pewotCQkJCQkJCQlmb3VuZEFsbCA9IGZhbHNlOworCisJCQkJCQkJaWYgKHNob3VsZEFkZCkgeworCQkJCQkJCQlpZiAoZm91bmRSZWZBbHJlYWR5ICE9IG51bGwpIHsKKwkJCQkJCQkJCWZvdW5kUmVmQWxyZWFkeVttYW5pZmVzdEluZGV4XSA9IHRydWU7CisJCQkJCQkJCX0KKwkJCQkJCQkJZm91bmQgPSB0cnVlOworCQkJCQkJCQlJVmlydHVhbENvbXBvbmVudCBkeW5hbWljQ29tcG9uZW50ID0gZWFyUmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CisJCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIGR5bmFtaWNSZWZlcmVuY2UgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlZmVyZW5jZShtb2R1bGVDb21wb25lbnQsZHluYW1pY0NvbXBvbmVudCk7CisJCQkJCQkJCSgoVmlydHVhbFJlZmVyZW5jZSkgZHluYW1pY1JlZmVyZW5jZSkuc2V0RGVyaXZlZCh0cnVlKTsKKwkJCQkJCQkJZHluYW1pY1JlZmVyZW5jZXMuYWRkKGR5bmFtaWNSZWZlcmVuY2UpOwogCQkJCQkJCX0KIAkJCQkJCX0KLQkJCQkJCWlmKGZvdW5kQWxsKXsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KIAkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQogCQlyZXR1cm4gZHluYW1pY1JlZmVyZW5jZXM7CiAJfQotCQotCXByaXZhdGUgdm9pZCBzZXRDYWNoZWRSZWZlcmVuY2VzKGJvb2xlYW4gZ2V0SmF2YVJlZnMsIGJvb2xlYW4gZmluZEZ1enp5RUFSUmVmcywgSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzKSB7Ci0JCWlmKGZpbmRGdXp6eUVBUlJlZnMgJiYgZ2V0SmF2YVJlZnMpIHsKLQkJCWZ1enp5QW5kSmF2YVJlZnMgPSByZWZlcmVuY2VzOyAKLQkJfQotCQllbHNlIGlmKCFmaW5kRnV6enlFQVJSZWZzICYmICFnZXRKYXZhUmVmcykgewotCQkJbm9uSmF2YVJlZnNPbmx5ID0gcmVmZXJlbmNlczsKLQkJfQotCQllbHNlIGlmKGZpbmRGdXp6eUVBUlJlZnMpIHsKLQkJCWZ1enp5UmVmc09ubHkgPSByZWZlcmVuY2VzOwotCQl9Ci0JCWVsc2UgewotCQkJamF2YVJlZnNPbmx5ID0gcmVmZXJlbmNlczsKLQkJfQorCisJcHVibGljIHN0YXRpYyBMaXN0IGdldE1hbmlmZXN0UmVmZXJlbmNlcyhJVmlydHVhbENvbXBvbmVudCBtb2R1bGVDb21wb25lbnQsCisJCQlJVmlydHVhbFJlZmVyZW5jZVtdIGhhcmRSZWZlcmVuY2VzKSB7CisJCXJldHVybiBnZXRNYW5pZmVzdFJlZmVyZW5jZXMobW9kdWxlQ29tcG9uZW50LCBoYXJkUmVmZXJlbmNlcywgZmFsc2UpOwogCX0KLQkKLQlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0Q2FjaGVkUmVmZXJlbmNlKGJvb2xlYW4gZ2V0SmF2YVJlZnMsIGJvb2xlYW4gZmluZEZ1enp5RUFSUmVmcykgewotCQlpZihjaGVja0lmU3RpbGxWYWxpZCgpKQotCQl7Ci0JCQlpZihmaW5kRnV6enlFQVJSZWZzICYmIGdldEphdmFSZWZzKSB7Ci0JCQkJcmV0dXJuIGZ1enp5QW5kSmF2YVJlZnM7IAotCQkJfQotCQkJZWxzZSBpZighZmluZEZ1enp5RUFSUmVmcyAmJiAhZ2V0SmF2YVJlZnMpIHsKLQkJCQlyZXR1cm4gbm9uSmF2YVJlZnNPbmx5OwotCQkJfQotCQkJZWxzZSBpZihmaW5kRnV6enlFQVJSZWZzKSB7Ci0JCQkJcmV0dXJuIGZ1enp5UmVmc09ubHk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gamF2YVJlZnNPbmx5OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOworCisJcHVibGljIHN0YXRpYyBMaXN0IGdldE1hbmlmZXN0UmVmZXJlbmNlcyhJVmlydHVhbENvbXBvbmVudCBtb2R1bGVDb21wb25lbnQsCisJCQlJVmlydHVhbFJlZmVyZW5jZVtdIGhhcmRSZWZlcmVuY2VzLCBib29sZWFuIGZpbmRGdXp6eUVBUlJlZnMpIHsKKwkJSVZpcnR1YWxSZWZlcmVuY2VbXVtdIHJlZnMgPSBjYWxjdWxhdGVNYW5pZmVzdFJlZmVyZW5jZXMoCisJCQkJbW9kdWxlQ29tcG9uZW50LCBmaW5kRnV6enlFQVJSZWZzKTsKKwkJQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiB0bXAgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPigpOworCQl0bXAuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVmc1swXSkpOworCQlpZiAoZmluZEZ1enp5RUFSUmVmcykKKwkJCXRtcC5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZWZzWzFdKSk7CisJCXJldHVybiB0bXA7CiAJfQogCiAJcHJpdmF0ZSBib29sZWFuIGNoZWNrSWZTdGlsbFZhbGlkKCkgewogCQlib29sZWFuIHZhbGlkID0gSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS5nZXRNb2RTdGFtcCgpID09IGRlcEdyYXBoTW9kU3RhbXA7Ci0JCWlmKCF2YWxpZCkgeworCQl2YWxpZCA9IHZhbGlkICYmIEoyRUVEZXBlbmRlbmN5TGlzdGVuZXIuSU5TVEFOQ0UuZ2V0TW9kU3RhbXAoKSA9PSBqZWVNb2RTdGFtcDsKKwkJaWYgKCF2YWxpZCkgewogCQkJY2xlYXJDYWNoZSgpOwogCQl9CiAJCXJldHVybiB2YWxpZDsKIAl9Ci0JCisKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjbGVhckNhY2hlKCkgewogCQlzdXBlci5jbGVhckNhY2hlKCk7Ci0JCQogCQlkZXBHcmFwaE1vZFN0YW1wID0gSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS5nZXRNb2RTdGFtcCgpOwotCQlmdXp6eUFuZEphdmFSZWZzID0gbnVsbDsKLQkJZnV6enlSZWZzT25seSA9IG51bGw7Ci0JCWphdmFSZWZzT25seSA9IG51bGw7Ci0JCW5vbkphdmFSZWZzT25seSA9IG51bGw7CisJCWplZU1vZFN0YW1wID0gSjJFRURlcGVuZGVuY3lMaXN0ZW5lci5JTlNUQU5DRS5nZXRNb2RTdGFtcCgpOworCQloYXJkUmVmZXJlbmNlcyA9IG51bGw7CisJCWphdmFSZWZlcmVuY2VzID0gbnVsbDsKKwkJcGFyZW50RWFyTWFuaWZlc3RSZWZlcmVuY2VzID0gbnVsbDsKKwkJZnV6enlFYXJNYW5pZmVzdFJlZmVyZW5jZXMgPSBudWxsOwogCX0KKworCXB1YmxpYyBib29sZWFuIGNhblJlY2VpdmVDbGFzc3BhdGhEZXBlbmRlbmNpZXMoKSB7CisJCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGdldFByb2plY3QoKSk7CisJfQorCisJcHVibGljIElQYXRoIGdldENsYXNzcGF0aEZvbGRlclBhdGgoSUNsYXNzcGF0aERlcGVuZGVuY3lDb21wb25lbnQgY29tcG9uZW50KSB7CisJCWlmKCBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGdldFByb2plY3QoKSkpIHsKKwkJCXJldHVybiBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQl9JTkZfTElCKS5tYWtlQWJzb2x1dGUoKTsKKwkJfQorCQlyZXR1cm4gbmV3IFBhdGgoIi8iKTsgLy8kTk9OLU5MUy0xJAorCX0KKwkKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdERlcGxveW1lbnREZXNjcmlwdG9yRm9sZGVyKElWaXJ0dWFsRm9sZGVyIGZvbGRlciwgSVBhdGggYVByb2plY3RSZWxhdGl2ZUxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKyAgICAJaWYgKGZvbGRlciBpbnN0YW5jZW9mIElUYWdnZWRWaXJ0dWFsUmVzb3VyY2UpeworICAgIAkJSVRhZ2dlZFZpcnR1YWxSZXNvdXJjZSB0YWdnZWRGb2xkZXIgPSAoSVRhZ2dlZFZpcnR1YWxSZXNvdXJjZSlmb2xkZXI7CisgICAgCQkvL0ZpcnN0LCByZW1vdmUgdGFnIGlzIHRoZXJlIGlzIGFscmVhZHkgb25lIGZvbGRlciBhbHJlYWR5IHRhZ2dlZCAKKyAgICAJCUlQYXRoW10gcGF0aHMgPSB0YWdnZWRGb2xkZXIuZ2V0VGFnZ2VkUmVzb3VyY2VzKEREX0ZPTERFUl9UQUcpOworICAgIAkJZm9yIChJUGF0aCBwYXRoOnBhdGhzKXsKKyAgICAJCQl0YWdnZWRGb2xkZXIudGFnUmVzb3VyY2UocGF0aCwgbnVsbCwgbW9uaXRvcik7CisgICAgCQl9CisgICAgCQkvLyBOb3csIHRhZyB0aGUgY29ycmVjdCBwYXRoCisgICAgCQkoKElUYWdnZWRWaXJ0dWFsUmVzb3VyY2UpZm9sZGVyKS50YWdSZXNvdXJjZShhUHJvamVjdFJlbGF0aXZlTG9jYXRpb24sIEREX0ZPTERFUl9UQUcsIG1vbml0b3IpOworICAgIAl9CisJfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0RGVmYXVsdERlcGxveW1lbnREZXNjcmlwdG9yRm9sZGVyKElWaXJ0dWFsRm9sZGVyIGZvbGRlcikgeworICAgIAlJUGF0aCByZXR1cm5WYWx1ZSA9IG51bGw7CisgICAgCWlmIChmb2xkZXIgaW5zdGFuY2VvZiBJVGFnZ2VkVmlydHVhbFJlc291cmNlKXsKKyAgICAJCXJldHVyblZhbHVlID0gKChJVGFnZ2VkVmlydHVhbFJlc291cmNlKWZvbGRlcikuZ2V0Rmlyc3RUYWdnZWRSZXNvdXJjZShERF9GT0xERVJfVEFHKTsKKyAgICAJfQorICAgIAlyZXR1cm4gcmV0dXJuVmFsdWU7CisJfQorIAogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9BcHBDbGllbnRCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvQXBwQ2xpZW50QmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEKaW5kZXggNTgzMWFiNi4uODg2YmU3YiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9BcHBDbGllbnRCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0FwcENsaWVudEJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhCkBAIC0zOSw3ICszOSw5IEBACiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0gZmluYWxseSB7Ci0JCQloZWxwZXIuZGlzcG9zZSgpOworCQkJaWYoaGVscGVyICE9IG51bGwpeworCQkJCWhlbHBlci5kaXNwb3NlKCk7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTU0LDYgKzU2LDcgQEAKIAkJCXJldHVybiBpbnN0YW5jZTsKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewogCQkJUmVmZXJlbmNlQ291bnRlZEFwcGxpY2F0aW9uQ2xpZW50RmlsZUltcGwgYXJjaGl2ZSA9IG5ldyBSZWZlcmVuY2VDb3VudGVkQXBwbGljYXRpb25DbGllbnRGaWxlSW1wbCgpOwogCQkJcmV0dXJuIGFyY2hpdmU7CkBAIC03MCw2ICs3Myw3IEBACiAJCQl9CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIHZvaWQgY2xvc2UoKSB7CiAJCQloZWxwZXIuYWJvdXRUb0Nsb3NlKCk7CiAJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTk3LDYgKzEwMSw3IEBACiAJCQl0aGlzLmhlbHBlciA9IGhlbHBlcjsKIAkJfQogCQkKKwkJQE92ZXJyaWRlCiAJCXByb3RlY3RlZCBMb2FkU3RyYXRlZ3kgY3JlYXRlTG9hZFN0cmF0ZWd5Rm9yUmVvcGVuKEFyY2hpdmUgcGFyZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQlyZXR1cm4gY3JlYXRlQmluYXJ5TG9hZFN0cmF0ZWd5KGdldEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIoKSk7CkBAIC0xMTMsNiArMTE4LDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZ2V0RGlzY3JpbWluYXRvcigpIHsKIAkJcmV0dXJuIERpc2NyaW1pbmF0b3IuZ2V0SW5zdGFuY2UoKTsKIAl9CkBAIC0xMjIsNiArMTI4LDcgQEAKIAkJc3VwZXIoY29tcG9uZW50KTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBnZXRQcmltYXJ5Um9vdE9iamVjdCgpIHsKIAkJcmV0dXJuICgoQXBwbGljYXRpb25DbGllbnRGaWxlKSBnZXRBcmNoaXZlKCkpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9FSkJCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvRUpCQmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEKaW5kZXggMjM0ZGRiYi4uNzc3NDE5YyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9FSkJCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0VKQkJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhCkBAIC0zOSw3ICszOSw4IEBACiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0gZmluYWxseSB7Ci0JCQloZWxwZXIuZGlzcG9zZSgpOworCQkJaWYoaGVscGVyICE9IG51bGwpCisJCQkJaGVscGVyLmRpc3Bvc2UoKTsKIAkJfQogCX0KIApAQCAtNTQsNiArNTUsNyBAQAogCQkJcmV0dXJuIGluc3RhbmNlOwogCQl9CiAKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7CiAJCQlSZWZlcmVuY2VDb3VudGVkRUpCSmFyRmlsZUltcGwgYXJjaGl2ZSA9IG5ldyBSZWZlcmVuY2VDb3VudGVkRUpCSmFyRmlsZUltcGwoKTsKIAkJCXJldHVybiBhcmNoaXZlOwpAQCAtNzAsNiArNzIsNyBAQAogCQkJfQogCQl9CiAKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyB2b2lkIGNsb3NlKCkgewogCQkJaGVscGVyLmFib3V0VG9DbG9zZSgpOwogCQkJc3luY2hyb25pemVkICh0aGlzKSB7CkBAIC05Nyw2ICsxMDAsNyBAQAogCQkJdGhpcy5oZWxwZXIgPSBoZWxwZXI7CiAJCX0KIAkJCisJCUBPdmVycmlkZQogCQlwcm90ZWN0ZWQgTG9hZFN0cmF0ZWd5IGNyZWF0ZUxvYWRTdHJhdGVneUZvclJlb3BlbihBcmNoaXZlIHBhcmVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUJpbmFyeUxvYWRTdHJhdGVneShnZXRFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyKCkpOwpAQCAtMTEzLDYgKzExNyw3IEBACiAJCX0KIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIGdldERpc2NyaW1pbmF0b3IoKSB7CiAJCXJldHVybiBEaXNjcmltaW5hdG9yLmdldEluc3RhbmNlKCk7CiAJfQpAQCAtMTIxLDYgKzEyNiw3IEBACiAJCXN1cGVyKGNvbXBvbmVudCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIEVPYmplY3QgZ2V0UHJpbWFyeVJvb3RPYmplY3QoKSB7CiAJCXJldHVybiAoKEVKQkphckZpbGUpIGdldEFyY2hpdmUoKSkuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0VudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhCmluZGV4IDVkYTFhZjkuLjgzOGI0NmEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhCkBAIC0yMiwxMiArMjIsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbkFyY2hpdmVSZXNvdXJjZUhhbmRsZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7CkBAIC0zNSwxMCArMzMsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnN0cmF0ZWd5LlppcEZpbGVMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5pbnRlcm5hbC5BcmNoaXZlVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwogCkBAIC01MSwxMyArNDksMTMgQEAKIAogCXB1YmxpYyBzdGF0aWMgRW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlciBnZXRIZWxwZXIoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCl7CiAJCUVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyID0gbnVsbDsKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCQ29tcG9uZW50KGFDb21wb25lbnQpKSB7CisJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCQ29tcG9uZW50KGFDb21wb25lbnQpKSB7CiAJCQloZWxwZXIgPSBuZXcgRUpCQmluYXJ5Q29tcG9uZW50SGVscGVyKGFDb21wb25lbnQpOwotCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRDb21wb25lbnQoYUNvbXBvbmVudCkpIHsKKwkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRDb21wb25lbnQoYUNvbXBvbmVudCkpIHsKIAkJCWhlbHBlciA9IG5ldyBBcHBDbGllbnRCaW5hcnlDb21wb25lbnRIZWxwZXIoYUNvbXBvbmVudCk7Ci0JCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FDb21wb25lbnQoYUNvbXBvbmVudCkpIHsKKwkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBQ29tcG9uZW50KGFDb21wb25lbnQpKSB7CiAJCQloZWxwZXIgPSBuZXcgSkNBQmluYXJ5Q29tcG9uZW50SGVscGVyKGFDb21wb25lbnQpOwotCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYkNvbXBvbmVudChhQ29tcG9uZW50KSkgeworCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViQ29tcG9uZW50KGFDb21wb25lbnQpKSB7CiAJCQloZWxwZXIgPSBuZXcgV2ViQmluYXJ5Q29tcG9uZW50SGVscGVyKGFDb21wb25lbnQpOwogCQl9IGVsc2UgewogCQkJaGVscGVyID0gbmV3IFV0aWxpdHlCaW5hcnlDb21wb25lbnRIZWxwZXIoYUNvbXBvbmVudCk7CkBAIC04Myw3ICs4MSw3IEBACiAJCXRyeSB7CiAJCQlyZXR1cm4gb3BlbkFyY2hpdmUoKTsKIAkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CkBAIC0xMjMsMTggKzEyMSwxMSBAQAogCX0KIAogCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXJjaGl2ZVVSSSgpIHsKLQkJU3RyaW5nIGFyY2hpdmVVUkkgPSBudWxsOwotCQlWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBhcmNoaXZlQ29tcCA9IChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgZ2V0Q29tcG9uZW50KCk7Ci0JCWphdmEuaW8uRmlsZSBkaXNrRmlsZSA9IGFyY2hpdmVDb21wLmdldFVuZGVybHlpbmdEaXNrRmlsZSgpOwotCQlpZiAoZGlza0ZpbGUuZXhpc3RzKCkpCi0JCQlhcmNoaXZlVVJJID0gZGlza0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWVsc2UgewotCQkJSUZpbGUgaUZpbGUgPSBhcmNoaXZlQ29tcC5nZXRVbmRlcmx5aW5nV29ya2JlbmNoRmlsZSgpOwotCQkJYXJjaGl2ZVVSSSA9IGlGaWxlLmdldFJhd0xvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBhcmNoaXZlVVJJOworCQlqYXZhLmlvLkZpbGUgZmlsZSA9IChqYXZhLmlvLkZpbGUpZ2V0Q29tcG9uZW50KCkuZ2V0QWRhcHRlcihqYXZhLmlvLkZpbGUuY2xhc3MpOworCQlyZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewogCQlpZiAoYXJjaGl2ZSAhPSBudWxsKSB7CiAJCQlhcmNoaXZlLmNsb3NlKCk7CkBAIC0xNTYsNiArMTQ3LDcgQEAKIAogCWJvb2xlYW4gZ290UmVzb3VyY2UgPSBmYWxzZTsKIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSkgewogCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7CiAJCWlmKCFpc1BoeXNpY2FsbHlPcGVuKGdldEFyY2hpdmUoKSkpewpAQCAtMTg5LDkgKzE4MSw5IEBACiAJCXRyeSB7CiAJCQkoKEJpbmFyeVppcEZpbGVMb2FkU3RyYXRlZ3kpYXJjaGl2ZS5nZXRMb2FkU3RyYXRlZ3koKSkucGh5c2ljYWxseU9wZW4oKTsKIAkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0KIAl9CiAJCkBAIC0yMTQsMTQgKzIwNiwxMSBAQAogCQkKIAkJcHJpdmF0ZSBib29sZWFuIHBoeXNpY2FsbHlPcGVuID0gdHJ1ZTsKIAkJCi0JCXB1YmxpYyBCaW5hcnlaaXBGaWxlTG9hZFN0cmF0ZWd5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCiAJCXB1YmxpYyBCaW5hcnlaaXBGaWxlTG9hZFN0cmF0ZWd5KGphdmEuaW8uRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJc3VwZXIoZmlsZSk7CiAJCX0KIAkJCisJCUBPdmVycmlkZQogCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkJCXBoeXNpY2FsbHlPcGVuID0gZmFsc2U7CiAJCQlzdXBlci5jbG9zZSgpOwpAQCAtMjUwLDYgKzIzOSw3IEBACiAJCQl9IAogCQl9CiAJCQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKIAkJCWZpbmFsIGJvb2xlYW4gaXNQaHlzY2lhbGx5T3BlbiA9IGlzUGh5c2ljYWxseU9wZW4oKTsKIAkJCUV4Y2VwdGlvbiBjYXVnaHRFeGNlcHRpb24gPSBudWxsOwpAQCAtMjYyLDYgKzI1Miw3IEBACiAJCQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24odXJpKTsKIAogCQkJCXJldHVybiBuZXcgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtKGdldFppcEZpbGUoKS5nZXRJbnB1dFN0cmVhbShlbnRyeSkpIHsKKwkJCQkJQE92ZXJyaWRlCiAJCQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQkJCXN1cGVyLmNsb3NlKCk7CiAJCQkJCQlpZiAoIWlzUGh5c2NpYWxseU9wZW4gKSB7CkBAIC0yODYsNyArMjc3LDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0KLQl9OworCX0KIAkKIAlwdWJsaWMgc3RhdGljIGNsYXNzIEFyY2hpdmVDYWNoZSB7CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvSkNBQmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0pDQUJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhCmluZGV4IGE3ZjUxMTAuLjVhNTdhMDkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvSkNBQmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9KQ0FCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQpAQCAtMzksNyArMzksOCBAQAogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJcmV0dXJuIGZhbHNlOwogCQl9IGZpbmFsbHkgewotCQkJaGVscGVyLmRpc3Bvc2UoKTsKKwkJCWlmKGhlbHBlciAhPSBudWxsKQorCQkJCWhlbHBlci5kaXNwb3NlKCk7CiAJCX0KIAl9CiAKQEAgLTU0LDYgKzU1LDcgQEAKIAkJCXJldHVybiBpbnN0YW5jZTsKIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgQXJjaGl2ZSBjcmVhdGVDb252ZXJ0ZWRBcmNoaXZlKCkgewogCQkJUmVmZXJlbmNlQ291bnRlZFJBUkZpbGVJbXBsIGFyY2hpdmUgPSBuZXcgUmVmZXJlbmNlQ291bnRlZFJBUkZpbGVJbXBsKCk7CiAJCQlyZXR1cm4gYXJjaGl2ZTsKQEAgLTcwLDYgKzcyLDcgQEAKIAkJCX0KIAkJfQogCisJCUBPdmVycmlkZQogCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkJCWhlbHBlci5hYm91dFRvQ2xvc2UoKTsKIAkJCXN5bmNocm9uaXplZCAodGhpcykgewpAQCAtOTcsNiArMTAwLDcgQEAKIAkJCXRoaXMuaGVscGVyID0gaGVscGVyOwogCQl9CiAJCQorCQlAT3ZlcnJpZGUKIAkJcHJvdGVjdGVkIExvYWRTdHJhdGVneSBjcmVhdGVMb2FkU3RyYXRlZ3lGb3JSZW9wZW4oQXJjaGl2ZSBwYXJlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl0cnkgewogCQkJCXJldHVybiBjcmVhdGVCaW5hcnlMb2FkU3RyYXRlZ3koZ2V0RW50ZXJwcmlzZUJpbmFyeUNvbXBvbmVudEhlbHBlcigpKTsKQEAgLTExMyw2ICsxMTcsNyBAQAogCQl9CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIEFyY2hpdmVUeXBlRGlzY3JpbWluYXRvciBnZXREaXNjcmltaW5hdG9yKCkgewogCQlyZXR1cm4gRGlzY3JpbWluYXRvci5nZXRJbnN0YW5jZSgpOwogCX0KQEAgLTEyMSw2ICsxMjYsNyBAQAogCQlzdXBlcihjb21wb25lbnQpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBFT2JqZWN0IGdldFByaW1hcnlSb290T2JqZWN0KCkgewogCQlyZXR1cm4gKChSQVJGaWxlKSBnZXRBcmNoaXZlKCkpLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9KYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEKaW5kZXggZjM0ZDc5OC4uNTZhNDg1MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9KYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0phdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhCkBAIC01LDcgKzUsOSBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwogCkBAIC0yNyw2ICsyOSw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFlZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVqYkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5qY2EuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuamNhLkpjYUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb247CkBAIC0zNSw2ICszOSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlTG9hZEFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLmludGVybmFsLkFyY2hpdmVGYWN0b3J5SW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5CaW5hcnlDb21wb25lbnRIZWxwZXI7CkBAIC00Niw5ICs1MSwzNSBAQAogCXByaXZhdGUgSUFyY2hpdmUgYXJjaGl2ZTsKIAlwcml2YXRlIEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIgbGVnYWN5QmluYXJ5SGVscGVyOwogCXByaXZhdGUgYm9vbGVhbiBkZXNjcmltaW5hdGVNYWluQ2xhc3MgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiByZWZpbmVGb3JKYXZhRUUgPSB0cnVlOwogCXByaXZhdGUgaW50IGxvY2FsQXJjaGl2ZUFjY2Vzc0NvdW50ID0gMDsKKwlwcml2YXRlIGJvb2xlYW4gcmVmaW5lRm9ySmF2YUVFID0gdHJ1ZTsKIAorCXB1YmxpYyBib29sZWFuIHNob3VsZFJlZmluZUZvckphdmFFRSgpIHsKKwkJcmV0dXJuIHJlZmluZUZvckphdmFFRTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXRSZWZpbmVGb3JKYXZhRUUoYm9vbGVhbiByZWZpbmVGb3JKYXZhRUUpIHsKKwkJdGhpcy5yZWZpbmVGb3JKYXZhRUUgPSByZWZpbmVGb3JKYXZhRUU7CisJfQorCisJcHVibGljIHN0YXRpYyBKYXZhRUVRdWlja1BlZWsgZ2V0SmF2YUVFUXVpY2tQZWVrKElQYXRoIGZpbGVzeXN0ZW1QYXRoKSB7CisJCUlBcmNoaXZlIGFyY2hpdmUgPSBudWxsOyAKKwkJdHJ5IHsKKwkJCXRyeSB7CisJCQkJYXJjaGl2ZSA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0Uub3BlbkFyY2hpdmUoZmlsZXN5c3RlbVBhdGgpOworCQkJfSBjYXRjaCggQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGZhaWwpIHt9CisJCQlpZiAoYXJjaGl2ZSA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBKYXZhRUVRdWlja1BlZWsobnVsbCk7CisJCQl9CisJCQlKYXZhRUVRdWlja1BlZWsgcXAgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLklOU1RBTkNFLmdldEphdmFFRVF1aWNrUGVlayhhcmNoaXZlKTsKKwkJCXJldHVybiBxcDsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChudWxsICE9IGFyY2hpdmUpIHsKKwkJCQluZXcgQXJjaGl2ZUZhY3RvcnlJbXBsKCkuY2xvc2VBcmNoaXZlKGFyY2hpdmUpOworCQkJfQorCQl9CisJfQorCQogCXB1YmxpYyBzdGF0aWMgSmF2YUVFUXVpY2tQZWVrIGdldEphdmFFRVF1aWNrUGVlayhJVmlydHVhbENvbXBvbmVudCBhQmluYXJ5Q29tcG9uZW50KSB7CiAJCUphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSBudWxsOwogCQl0cnkgewpAQCAtNzAsNyArMTAxLDcgQEAKIAkJb3BlbkFyY2hpdmUoYUJpbmFyeUNvbXBvbmVudCwgZmFsc2UsIGZhbHNlKTsKIAl9CiAJCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBvcGVuQXJjaGl2ZShJVmlydHVhbENvbXBvbmVudCBhQmluYXJ5Q29tcG9uZW50LCBib29sZWFuIHJlZmluZUZvckphdmFFRSwgYm9vbGVhbiBkZXNjcmltaW5hdGVNYWluQ2xhc3MpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkFyY2hpdmUoSVZpcnR1YWxDb21wb25lbnQgYUJpbmFyeUNvbXBvbmVudCwgYm9vbGVhbiByZWZpbmVGb3JKYXZhRUUsIGJvb2xlYW4gZGVzY3JpbWluYXRlTWFpbkNsYXNzKSB7CiAJCUphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSBudWxsOwogCQl0cnkgewogCQkJaGVscGVyID0gbmV3IEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcihhQmluYXJ5Q29tcG9uZW50KTsKQEAgLTc4LDcgKzEwOSw3IEBACiAJCQl0cnkgewogCQkJCWhlbHBlci5vcGVuQXJjaGl2ZSgpOwogCQkJfSBjYXRjaCAoQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCWxvZ0Vycm9yKGUpOwogCQkJfQogCQl9IGZpbmFsbHkgewogCQkJaWYgKGhlbHBlciAhPSBudWxsKSB7CkBAIC0xMjIsNiArMTUzLDkgQEAKIAkJY2FzZSBKYXZhRUVRdWlja1BlZWsuQ09OTkVDVE9SX1RZUEU6CiAJCQlkZFBhdGggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLlJBUl9ERF9VUkkpOwogCQkJYnJlYWs7CisJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLldFQkZSQUdNRU5UX1RZUEU6CisJCQlkZFBhdGggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQkZSQUdNRU5UX0REX1VSSSk7CisJCQlicmVhazsKIAkJfQogCQlpZiAoZGRQYXRoICE9IG51bGwpIHsKIAkJCWlmIChnZXRBcmNoaXZlKCkuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoZGRQYXRoKSkgewpAQCAtMTYwLDYgKzE5NCwxMSBAQAogCQkJCQl3ZWJBcHAuZ2V0RGlzcGxheU5hbWVzKCkuYWRkKGRuKTsKIAkJCQkJcm9vdCA9IChFT2JqZWN0KSB3ZWJBcHA7CiAJCQkJCWJyZWFrOworCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkNPTk5FQ1RPUl9UWVBFOgorCQkJCQlDb25uZWN0b3IgY29ubmVjdG9yID0gSmNhRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29ubmVjdG9yKCk7CisJCQkJCWNvbm5lY3Rvci5nZXREaXNwbGF5TmFtZXMoKS5hZGQoZG4pOworCQkJCQlyb290ID0gKEVPYmplY3QpIGNvbm5lY3RvcjsKKwkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCXJldHVybiByb290OwogCQkJfQpAQCAtMjA5LDcgKzI0OCw3IEBACiAKIAlwdWJsaWMgdm9pZCByZWxlYXNlQXJjaGl2ZShJQXJjaGl2ZSBhcmNoaXZlKSB7CiAJCWlmIChhcmNoaXZlICE9IHRoaXMuYXJjaGl2ZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBJQXJjaGl2ZSBwYXJhbWV0ZXIgbXVzdCBiZSB0aGUgc2FtZSBJQXJjaGl2ZSByZXRyaWV2ZWQgZnJvbSBhY2Nlc3NBcmNoaXZlIik7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIElBcmNoaXZlIHBhcmFtZXRlciBtdXN0IGJlIHRoZSBzYW1lIElBcmNoaXZlIHJldHJpZXZlZCBmcm9tIGFjY2Vzc0FyY2hpdmUiKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCWlmIChudWxsICE9IGFyY2hpdmUpIHsKIAkJCUFyY2hpdmVDYWNoZSBjYWNoZSA9IEFyY2hpdmVDYWNoZS5nZXRJbnN0YW5jZSgpOwpAQCAtMjQ4LDE2ICsyODcsMTggQEAKIAlwdWJsaWMgQXJjaGl2ZSBhY2Nlc3NMZWdhY3lBcmNoaXZlKCkgewogCQlpZihsZWdhY3lCaW5hcnlIZWxwZXIgPT0gbnVsbCl7CiAJCQlKYXZhRUVRdWlja1BlZWsgcXAgPSBnZXRKYXZhRUVRdWlja1BlZWsoZ2V0Q29tcG9uZW50KCkpOwotCQkJSVBhdGggZGRQYXRoID0gbnVsbDsKIAkJCXN3aXRjaCAocXAuZ2V0VHlwZSgpKSB7CiAJCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9DTElFTlRfVFlQRToKIAkJCQlsZWdhY3lCaW5hcnlIZWxwZXIgPSBuZXcgQXBwQ2xpZW50QmluYXJ5Q29tcG9uZW50SGVscGVyKGdldENvbXBvbmVudCgpKXsKKwkJCQkJQE92ZXJyaWRlCiAJCQkJCXByb3RlY3RlZCB2b2lkIGFib3V0VG9DbG9zZSgpIHsKIAkJCQkJCXNhZmVSZWxlYXNlQXJjaGl2ZShKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIudGhpcy5hcmNoaXZlKTsKIAkJCQkJfQorCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHJvdGVjdGVkIHZvaWQgcHJlQ2xlYW51cEFmdGVyVGVtcFNhdmUoU3RyaW5nIHVyaSwgRmlsZSBvcmlnaW5hbCwgRmlsZSBkZXN0aW5hdGlvbkZpbGUpIHsKIAkJCQkJCXByZUZpbGVTd2FwKCk7CiAJCQkJCX0KKwkJCQkJQE92ZXJyaWRlCiAJCQkJCXByb3RlY3RlZCB2b2lkIHBvc3RDbGVhbnVwQWZ0ZXJUZW1wU2F2ZShTdHJpbmcgdXJpLCBGaWxlIG9yaWdpbmFsLCBGaWxlIGRlc3RpbmF0aW9uRmlsZSkgewogCQkJCQkJcG9zdEZpbGVTd2FwKCk7CiAJCQkJCX0KQEAgLTI2NSwxMiArMzA2LDE1IEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIEphdmFFRVF1aWNrUGVlay5FSkJfVFlQRToKIAkJCQlsZWdhY3lCaW5hcnlIZWxwZXIgPSBuZXcgRUpCQmluYXJ5Q29tcG9uZW50SGVscGVyKGdldENvbXBvbmVudCgpKXsKKwkJCQkJQE92ZXJyaWRlCiAJCQkJCXByb3RlY3RlZCB2b2lkIGFib3V0VG9DbG9zZSgpIHsKIAkJCQkJCXNhZmVSZWxlYXNlQXJjaGl2ZShKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIudGhpcy5hcmNoaXZlKTsKIAkJCQkJfQorCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHJvdGVjdGVkIHZvaWQgcHJlQ2xlYW51cEFmdGVyVGVtcFNhdmUoU3RyaW5nIHVyaSwgRmlsZSBvcmlnaW5hbCwgRmlsZSBkZXN0aW5hdGlvbkZpbGUpIHsKIAkJCQkJCXByZUZpbGVTd2FwKCk7CiAJCQkJCX0KKwkJCQkJQE92ZXJyaWRlCiAJCQkJCXByb3RlY3RlZCB2b2lkIHBvc3RDbGVhbnVwQWZ0ZXJUZW1wU2F2ZShTdHJpbmcgdXJpLCBGaWxlIG9yaWdpbmFsLCBGaWxlIGRlc3RpbmF0aW9uRmlsZSkgewogCQkJCQkJcG9zdEZpbGVTd2FwKCk7CiAJCQkJCX0KQEAgLTI3OCwxMiArMzIyLDE1IEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIEphdmFFRVF1aWNrUGVlay5XRUJfVFlQRToKIAkJCQlsZWdhY3lCaW5hcnlIZWxwZXIgPSBuZXcgV2ViQmluYXJ5Q29tcG9uZW50SGVscGVyKGdldENvbXBvbmVudCgpKXsKKwkJCQkJQE92ZXJyaWRlCiAJCQkJCXByb3RlY3RlZCB2b2lkIGFib3V0VG9DbG9zZSgpIHsKIAkJCQkJCXNhZmVSZWxlYXNlQXJjaGl2ZShKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIudGhpcy5hcmNoaXZlKTsKIAkJCQkJfQorCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHJvdGVjdGVkIHZvaWQgcHJlQ2xlYW51cEFmdGVyVGVtcFNhdmUoU3RyaW5nIHVyaSwgRmlsZSBvcmlnaW5hbCwgRmlsZSBkZXN0aW5hdGlvbkZpbGUpIHsKIAkJCQkJCXByZUZpbGVTd2FwKCk7CiAJCQkJCX0KKwkJCQkJQE92ZXJyaWRlCiAJCQkJCXByb3RlY3RlZCB2b2lkIHBvc3RDbGVhbnVwQWZ0ZXJUZW1wU2F2ZShTdHJpbmcgdXJpLCBGaWxlIG9yaWdpbmFsLCBGaWxlIGRlc3RpbmF0aW9uRmlsZSkgewogCQkJCQkJcG9zdEZpbGVTd2FwKCk7CiAJCQkJCX0KQEAgLTI5MSwxMiArMzM4LDE1IEBACiAJCQkJYnJlYWs7CiAJCQljYXNlIEphdmFFRVF1aWNrUGVlay5DT05ORUNUT1JfVFlQRToKIAkJCQlsZWdhY3lCaW5hcnlIZWxwZXIgPSBuZXcgSkNBQmluYXJ5Q29tcG9uZW50SGVscGVyKGdldENvbXBvbmVudCgpKXsKKwkJCQkJQE92ZXJyaWRlCiAJCQkJCXByb3RlY3RlZCB2b2lkIGFib3V0VG9DbG9zZSgpIHsKIAkJCQkJCXNhZmVSZWxlYXNlQXJjaGl2ZShKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIudGhpcy5hcmNoaXZlKTsKIAkJCQkJfQorCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHJvdGVjdGVkIHZvaWQgcHJlQ2xlYW51cEFmdGVyVGVtcFNhdmUoU3RyaW5nIHVyaSwgRmlsZSBvcmlnaW5hbCwgRmlsZSBkZXN0aW5hdGlvbkZpbGUpIHsKIAkJCQkJCXByZUZpbGVTd2FwKCk7CiAJCQkJCX0KKwkJCQkJQE92ZXJyaWRlCiAJCQkJCXByb3RlY3RlZCB2b2lkIHBvc3RDbGVhbnVwQWZ0ZXJUZW1wU2F2ZShTdHJpbmcgdXJpLCBGaWxlIG9yaWdpbmFsLCBGaWxlIGRlc3RpbmF0aW9uRmlsZSkgewogCQkJCQkJcG9zdEZpbGVTd2FwKCk7CiAJCQkJCX0KQEAgLTMwNCwxMiArMzU0LDE1IEBACiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OiAvL3V0aWxpdHkgamFyCiAJCQkJbGVnYWN5QmluYXJ5SGVscGVyID0gbmV3IFV0aWxpdHlCaW5hcnlDb21wb25lbnRIZWxwZXIoZ2V0Q29tcG9uZW50KCkpeworCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHJvdGVjdGVkIHZvaWQgYWJvdXRUb0Nsb3NlKCkgewogCQkJCQkJc2FmZVJlbGVhc2VBcmNoaXZlKEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci50aGlzLmFyY2hpdmUpOwogCQkJCQl9CisJCQkJCUBPdmVycmlkZQogCQkJCQlwcm90ZWN0ZWQgdm9pZCBwcmVDbGVhbnVwQWZ0ZXJUZW1wU2F2ZShTdHJpbmcgdXJpLCBGaWxlIG9yaWdpbmFsLCBGaWxlIGRlc3RpbmF0aW9uRmlsZSkgewogCQkJCQkJcHJlRmlsZVN3YXAoKTsKIAkJCQkJfQorCQkJCQlAT3ZlcnJpZGUKIAkJCQkJcHJvdGVjdGVkIHZvaWQgcG9zdENsZWFudXBBZnRlclRlbXBTYXZlKFN0cmluZyB1cmksIEZpbGUgb3JpZ2luYWwsIEZpbGUgZGVzdGluYXRpb25GaWxlKSB7CiAJCQkJCQlwb3N0RmlsZVN3YXAoKTsKIAkJCQkJfQpAQCAtMzI2LDcgKzM3OSw2IEBACiAJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKIAkJc3VwZXIuZGlzcG9zZSgpOwogCQlpbnQgY291bnQgPSAwOwotCQlpbnQgbGVnYWN5Q291bnQgPSAwOwogCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKIAkJCWNvdW50ID0gbG9jYWxBcmNoaXZlQWNjZXNzQ291bnQ7CiAJCX0KQEAgLTM1OCwxMSArNDEwLDQ4IEBACiAJCXRyeSB7CiAJCQlyZXR1cm4gb3BlbkFyY2hpdmUoKTsKIAkJfSBjYXRjaCAoQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIGUpIHsKLQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQlsb2dFcnJvcihlKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAKKwlzdGF0aWMgY2xhc3MgTFJVTWFwIGV4dGVuZHMgTGlua2VkSGFzaE1hcCB7CisJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisJCXByaXZhdGUgaW50IGZNYXhTaXplOworCisJCUxSVU1hcChpbnQgbWF4U2l6ZSkgeworCQkJc3VwZXIoKTsKKwkJCWZNYXhTaXplID0gbWF4U2l6ZTsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShFbnRyeSBlbGRlc3QpIHsKKwkJCXJldHVybiBzaXplKCkgPiBmTWF4U2l6ZTsKKwkJfQorCX0KKworCXN0YXRpYyBMUlVNYXAgbG9nZ2VkQmFkUGF0aHMgPSBuZXcgTFJVTWFwKDEwMDApOworCisJLyoqCisJICogVGhpcyBpcyB0byBzdXBwcmVzcyBleGNlc3NpdmUgbG9nZ2luZyBvZiBmb3IgdGhlIHNhbWUgbWlzc2luZyBhcmNoaXZlLgorCSAqIE5vdyBlYWNoIG1pc3NpbmcgYXJjaGl2ZSB3aWxsIG9ubHkgYmUgbG9nZ2VkIG9uY2UuCisJICogCisJICogQHBhcmFtIGUKKwkgKi8KKwlzdGF0aWMgdm9pZCBsb2dFcnJvcihBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gZSkgeworCQlJUGF0aCBhcmNoaXZlUGF0aCA9IGUuZ2V0QXJjaGl2ZVBhdGgoKTsKKwkJaWYgKGFyY2hpdmVQYXRoICE9IG51bGwpIHsKKwkJCWlmIChsb2dnZWRCYWRQYXRocy5jb250YWluc0tleShhcmNoaXZlUGF0aCkpIHsKKwkJCQkvLyBvbmx5IGxvZyBhbiBlcnJvciBmb3IgYSBzcGVjaWZpYyBhcmNoaXZlIHBhdGggb25jZS4KKwkJCQlyZXR1cm47CisJCQl9CisJCQlsb2dnZWRCYWRQYXRocy5wdXQoYXJjaGl2ZVBhdGgsIGFyY2hpdmVQYXRoKTsKKwkJfQorCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCX0KKwkKKwkKIAlwcm90ZWN0ZWQgSUFyY2hpdmUgb3BlbkFyY2hpdmUoKSB0aHJvd3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKIAkJQXJjaGl2ZUNhY2hlIGNhY2hlID0gQXJjaGl2ZUNhY2hlLmdldEluc3RhbmNlKCk7CiAJCUlBcmNoaXZlIGFyY2hpdmUgPSBjYWNoZS5nZXRBcmNoaXZlKGdldENvbXBvbmVudCgpKTsKQEAgLTM5NCwxNSArNDgzLDYgQEAKIAkJcmV0dXJuIGRlc2NyaW1pbmF0ZU1haW5DbGFzczsKIAl9CiAKLQlwdWJsaWMgdm9pZCBzZXRSZWZpbmVGb3JKYXZhRUUoYm9vbGVhbiBhcmNoaXZlT3B0aW9uKSB7Ci0JCXJlZmluZUZvckphdmFFRSA9IGFyY2hpdmVPcHRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkUmVmaW5lRm9ySmF2YUVFKCkgewotCQlyZXR1cm4gcmVmaW5lRm9ySmF2YUVFOwotCX0KLQkKLQkKIAkvKioKIAkgKiBUaGlzIGNhY2hlIG1hbmFnZXMgSUFyY2hpdmVzIGFjcm9zcyBhbGwKIAkgKiB7QGxpbmsgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyfSBpbnN0YW5jZXMuIElmIG11bHRpcGxlCkBAIC00MjgsMjIgKzUwOCwyNCBAQAogCiAJCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhY2Nlc3NBcmNoaXZlKElBcmNoaXZlIGFyY2hpdmUpIHsKIAkJCUludGVnZXIgY291bnQgPSBhcmNoaXZlQWNjZXNzQ291bnQuZ2V0KGFyY2hpdmUpOwotCQkJSW50ZWdlciBuZXdDb3VudCA9IG5ldyBJbnRlZ2VyKGNvdW50LmludFZhbHVlKCkgKyAxKTsKLQkJCWFyY2hpdmVBY2Nlc3NDb3VudC5wdXQoYXJjaGl2ZSwgbmV3Q291bnQpOwotCQkJaWYgKG5ld0NvdW50LmludFZhbHVlKCkgPT0gMSkgewotCQkJCUphdmFFRUJpbmFyeUNvbXBvbmVudExvYWRBZGFwdGVyIGJpbmFyeUFkYXB0ZXIgPSBudWxsOwotCQkJCWlmIChhcmNoaXZlLmdldEFyY2hpdmVPcHRpb25zKCkuaGFzT3B0aW9uKEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuV1JBUFBFRF9MT0FEX0FEQVBURVIpKSB7Ci0JCQkJCWJpbmFyeUFkYXB0ZXIgPSAoSmF2YUVFQmluYXJ5Q29tcG9uZW50TG9hZEFkYXB0ZXIpIGFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5nZXRPcHRpb24oSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5XUkFQUEVEX0xPQURfQURBUFRFUik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYmluYXJ5QWRhcHRlciA9IChKYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlcikgYXJjaGl2ZS5nZXRBcmNoaXZlT3B0aW9ucygpLmdldE9wdGlvbihBcmNoaXZlT3B0aW9ucy5MT0FEX0FEQVBURVIpOwotCQkJCX0KLQkJCQlpZiAoIWJpbmFyeUFkYXB0ZXIuaXNQaHlzaWNhbGx5T3BlbigpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQliaW5hcnlBZGFwdGVyLnBoeXNpY2FsbHlPcGVuKCk7Ci0JCQkJCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQlpZihjb3VudCAhPSBudWxsKSB7CisJCQkJSW50ZWdlciBuZXdDb3VudCA9IG5ldyBJbnRlZ2VyKGNvdW50LmludFZhbHVlKCkgKyAxKTsKKwkJCQlhcmNoaXZlQWNjZXNzQ291bnQucHV0KGFyY2hpdmUsIG5ld0NvdW50KTsKKwkJCQlpZiAobmV3Q291bnQuaW50VmFsdWUoKSA9PSAxKSB7CisJCQkJCUphdmFFRUJpbmFyeUNvbXBvbmVudExvYWRBZGFwdGVyIGJpbmFyeUFkYXB0ZXIgPSBudWxsOworCQkJCQlpZiAoYXJjaGl2ZS5nZXRBcmNoaXZlT3B0aW9ucygpLmhhc09wdGlvbihKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLldSQVBQRURfTE9BRF9BREFQVEVSKSkgeworCQkJCQkJYmluYXJ5QWRhcHRlciA9IChKYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlcikgYXJjaGl2ZS5nZXRBcmNoaXZlT3B0aW9ucygpLmdldE9wdGlvbihKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLldSQVBQRURfTE9BRF9BREFQVEVSKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWJpbmFyeUFkYXB0ZXIgPSAoSmF2YUVFQmluYXJ5Q29tcG9uZW50TG9hZEFkYXB0ZXIpIGFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5nZXRPcHRpb24oQXJjaGl2ZU9wdGlvbnMuTE9BRF9BREFQVEVSKTsKKwkJCQkJfQorCQkJCQlpZiAoIWJpbmFyeUFkYXB0ZXIuaXNQaHlzaWNhbGx5T3BlbigpKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCWJpbmFyeUFkYXB0ZXIucGh5c2ljYWxseU9wZW4oKTsKKwkJCQkJCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCQkJfQogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtNDUxLDE3ICs1MzMsMTkgQEAKIAogCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZUFyY2hpdmUoSUFyY2hpdmUgYXJjaGl2ZSkgewogCQkJSW50ZWdlciBjb3VudCA9IGFyY2hpdmVBY2Nlc3NDb3VudC5nZXQoYXJjaGl2ZSk7Ci0JCQlJbnRlZ2VyIG5ld0NvdW50ID0gbmV3IEludGVnZXIoY291bnQuaW50VmFsdWUoKSAtIDEpOwotCQkJYXJjaGl2ZUFjY2Vzc0NvdW50LnB1dChhcmNoaXZlLCBuZXdDb3VudCk7Ci0JCQlpZiAobmV3Q291bnQuaW50VmFsdWUoKSA9PSAwKSB7Ci0JCQkJSmF2YUVFQmluYXJ5Q29tcG9uZW50TG9hZEFkYXB0ZXIgYmluYXJ5QWRhcHRlciA9IG51bGw7Ci0JCQkJaWYgKGFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5oYXNPcHRpb24oSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5XUkFQUEVEX0xPQURfQURBUFRFUikpIHsKLQkJCQkJYmluYXJ5QWRhcHRlciA9IChKYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlcikgYXJjaGl2ZS5nZXRBcmNoaXZlT3B0aW9ucygpLmdldE9wdGlvbihKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLldSQVBQRURfTE9BRF9BREFQVEVSKTsKLQkJCQl9IGVsc2UgewotCQkJCQliaW5hcnlBZGFwdGVyID0gKEphdmFFRUJpbmFyeUNvbXBvbmVudExvYWRBZGFwdGVyKSBhcmNoaXZlLmdldEFyY2hpdmVPcHRpb25zKCkuZ2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLkxPQURfQURBUFRFUik7Ci0JCQkJfQotCQkJCWlmIChiaW5hcnlBZGFwdGVyLmlzUGh5c2ljYWxseU9wZW4oKSkgewotCQkJCQliaW5hcnlBZGFwdGVyLnBoeXNpY2FsbHlDbG9zZSgpOworCQkJaWYoY291bnQgIT0gbnVsbCkgeworCQkJCUludGVnZXIgbmV3Q291bnQgPSBuZXcgSW50ZWdlcihjb3VudC5pbnRWYWx1ZSgpIC0gMSk7CisJCQkJYXJjaGl2ZUFjY2Vzc0NvdW50LnB1dChhcmNoaXZlLCBuZXdDb3VudCk7CisJCQkJaWYgKG5ld0NvdW50LmludFZhbHVlKCkgPT0gMCkgeworCQkJCQlKYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlciBiaW5hcnlBZGFwdGVyID0gbnVsbDsKKwkJCQkJaWYgKGFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5oYXNPcHRpb24oSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5XUkFQUEVEX0xPQURfQURBUFRFUikpIHsKKwkJCQkJCWJpbmFyeUFkYXB0ZXIgPSAoSmF2YUVFQmluYXJ5Q29tcG9uZW50TG9hZEFkYXB0ZXIpIGFyY2hpdmUuZ2V0QXJjaGl2ZU9wdGlvbnMoKS5nZXRPcHRpb24oSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5XUkFQUEVEX0xPQURfQURBUFRFUik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQliaW5hcnlBZGFwdGVyID0gKEphdmFFRUJpbmFyeUNvbXBvbmVudExvYWRBZGFwdGVyKSBhcmNoaXZlLmdldEFyY2hpdmVPcHRpb25zKCkuZ2V0T3B0aW9uKEFyY2hpdmVPcHRpb25zLkxPQURfQURBUFRFUik7CisJCQkJCX0KKwkJCQkJaWYgKGJpbmFyeUFkYXB0ZXIuaXNQaHlzaWNhbGx5T3BlbigpKSB7CisJCQkJCQliaW5hcnlBZGFwdGVyLnBoeXNpY2FsbHlDbG9zZSgpOworCQkJCQl9CiAJCQkJfQogCQkJfQogCQl9CkBAIC01MTMsNyArNTk3LDcgQEAKIAkJcHVibGljIHN5bmNocm9uaXplZCBJQXJjaGl2ZSBvcGVuQXJjaGl2ZShKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyKSB0aHJvd3MgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKIAkJCUlBcmNoaXZlIGFyY2hpdmU7CiAJCQlpZiAoaGVscGVyLmdldENvbXBvbmVudCgpLmlzQmluYXJ5KCkpIHsKLQkJCQlpZihoZWxwZXIuc2hvdWxkUmVmaW5lRm9ySmF2YUVFKCkpeworCQkJCWlmIChoZWxwZXIuc2hvdWxkUmVmaW5lRm9ySmF2YUVFKCkpIHsKIAkJCQkJYXJjaGl2ZSA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0Uub3BlbkJpbmFyeUFyY2hpdmUoaGVscGVyLmdldENvbXBvbmVudCgpLCBoZWxwZXIuc2hvdWxkRGVzY3JpbWluYXRlTWFpbkNsYXNzKCkpOwogCQkJCX0gZWxzZSB7CiAJCQkJCUoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCBhcmNoaXZlQ29tcG9uZW50ID0gKEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgaGVscGVyLmdldENvbXBvbmVudCgpOwpAQCAtNTI0LDggKzYwOCw3IEBACiAJCQkJCWFyY2hpdmVPcHRpb25zLnNldE9wdGlvbihKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLkRJU0NSSU1JTkFURV9KQVZBX0VFLCBCb29sZWFuLkZBTFNFKTsKIAkJCQkJYXJjaGl2ZSA9IEphdmFFRUFyY2hpdmVVdGlsaXRpZXMuSU5TVEFOQ0Uub3BlbkFyY2hpdmUoYXJjaGl2ZU9wdGlvbnMpOwogCQkJCX0KLQkJCX0KLQkJCWVsc2UgeworCQkJfSBlbHNlIHsKIAkJCQlhcmNoaXZlID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5JTlNUQU5DRS5vcGVuQXJjaGl2ZShoZWxwZXIuZ2V0Q29tcG9uZW50KCkpOwogCQkJfQogCQkJY29tcG9uZW50c1RvQXJjaGl2ZXMucHV0KGhlbHBlci5nZXRDb21wb25lbnQoKSwgYXJjaGl2ZSk7CkBAIC01MzUsMyArNjE4LDQgQEAKIAl9CiAKIH0KKwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9KYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9KYXZhRUVCaW5hcnlDb21wb25lbnRMb2FkQWRhcHRlci5qYXZhCmluZGV4IGY3M2Q4MDQuLjY1NTYxZGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvSmF2YUVFQmluYXJ5Q29tcG9uZW50TG9hZEFkYXB0ZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0phdmFFRUJpbmFyeUNvbXBvbmVudExvYWRBZGFwdGVyLmphdmEKQEAgLTM1LDEzICszNSwxOCBAQAogCQlzdXBlcigpOwogCQl0aGlzLmFyY2hpdmVDb21wb25lbnQgPSBhcmNoaXZlQ29tcG9uZW50OwogCQlJUGF0aCBhcmNoaXZlUGF0aCA9IHJlY29tcHV0ZUFyY2hpdmVQYXRoKCk7Ci0JCXRyeXsKLQkJCXJlc2V0WmlwRmlsZShhcmNoaXZlUGF0aCk7Ci0JCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7Ci0JCQlBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24gb3BlbkZhaWx1cmVFeGNlcHRpb24gPSBuZXcgQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGUpOwotCQkJdGhyb3cgb3BlbkZhaWx1cmVFeGNlcHRpb247Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiBvcGVuRmFpbHVyZUV4Y2VwdGlvbiA9IG5ldyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZSk7CisJCWlmKCBhcmNoaXZlUGF0aCAhPSBudWxsICkgeworCQkJdHJ5eworCQkJCXJlc2V0WmlwRmlsZShhcmNoaXZlUGF0aCk7CisJCQl9IGNhdGNoIChaaXBFeGNlcHRpb24gZSkgeworCQkJCUFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiBvcGVuRmFpbHVyZUV4Y2VwdGlvbiA9IG5ldyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24oYXJjaGl2ZVBhdGgsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGUpOworCQkJCXRocm93IG9wZW5GYWlsdXJlRXhjZXB0aW9uOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCUFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbiBvcGVuRmFpbHVyZUV4Y2VwdGlvbiA9IG5ldyBBcmNoaXZlT3BlbkZhaWx1cmVFeGNlcHRpb24oYXJjaGl2ZVBhdGgsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGUpOworCQkJCXRocm93IG9wZW5GYWlsdXJlRXhjZXB0aW9uOworCQkJfQorCQl9IGVsc2UgeworCQkJQXJjaGl2ZU9wZW5GYWlsdXJlRXhjZXB0aW9uIG9wZW5GYWlsdXJlRXhjZXB0aW9uID0gbmV3IEFyY2hpdmVPcGVuRmFpbHVyZUV4Y2VwdGlvbihuZXcgU3RyaW5nKCkgKyBudWxsKTsKIAkJCXRocm93IG9wZW5GYWlsdXJlRXhjZXB0aW9uOwogCQl9CiAJfQpAQCAtNTQsMTMgKzU5LDE0IEBACiAJfQogCQogCXByaXZhdGUgSVBhdGggcmVjb21wdXRlQXJjaGl2ZVBhdGgoKSB7Ci0JCWphdmEuaW8uRmlsZSBkaXNrRmlsZSA9IGFyY2hpdmVDb21wb25lbnQuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7Ci0JCWlmICghZGlza0ZpbGUuZXhpc3RzKCkpIHsKLQkJCUlGaWxlIHdiRmlsZSA9IGFyY2hpdmVDb21wb25lbnQuZ2V0VW5kZXJseWluZ1dvcmtiZW5jaEZpbGUoKTsKLQkJCWRpc2tGaWxlID0gbmV3IEZpbGUod2JGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKKwkJamF2YS5pby5GaWxlIGYgPSAoamF2YS5pby5GaWxlKSBhcmNoaXZlQ29tcG9uZW50LmdldEFkYXB0ZXIoamF2YS5pby5GaWxlLmNsYXNzKTsKKwkJaWYgKGYgPT0gbnVsbCB8fCAhZi5leGlzdHMoKSkgeworCQkJSUZpbGUgd2JGaWxlID0gKElGaWxlKSBhcmNoaXZlQ29tcG9uZW50LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOworCQkJaWYgKHdiRmlsZSAhPSBudWxsKSB7CisJCQkJZiA9IG5ldyBGaWxlKHdiRmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7CisJCQl9CiAJCX0KLQkJSVBhdGggYXJjaGl2ZVBhdGggPSBuZXcgUGF0aChkaXNrRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCXJldHVybiBhcmNoaXZlUGF0aDsKKwkJcmV0dXJuIGYgPT0gbnVsbCA/IG51bGwgOiBuZXcgUGF0aChmLmdldEFic29sdXRlUGF0aCgpKTsKIAl9CiAJCiAJcHJpdmF0ZSB2b2lkIHNldEFyY2hpdmVQYXRoKElQYXRoIGFyY2hpdmVQYXRoKSB7CkBAIC03NywxNyArODMsMTcgQEAKIAkKIAlwdWJsaWMgdm9pZCBwaHlzaWNhbGx5T3BlbigpIHRocm93cyBaaXBFeGNlcHRpb24sIElPRXhjZXB0aW9uewogCQlpZighaXNQaHlzaWNhbGx5T3BlbigpKXsKLQkJCWlmKGZpbGUuZXhpc3RzKCkpeworCQkJaWYoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpewogCQkJCXNldFppcEZpbGUoQXJjaGl2ZVV0aWwubmV3WmlwRmlsZShmaWxlKSk7CiAJCQl9IGVsc2UgeyAKIAkJCQkvL2NoZWNrIGlmIHRoZSBmaWxlIGhhcyBtb3ZlZCAtLSB0aGlzIGNhbiBoYXBwZW4gd2hlbgogCQkJCS8vY2hlY2tpbmcgaW50byBDbGVhckNhc2UuCiAJCQkJSVBhdGggbmV3UGF0aCA9IHJlY29tcHV0ZUFyY2hpdmVQYXRoKCk7Ci0JCQkJaWYobmV3UGF0aC5lcXVhbHMoYXJjaGl2ZVBhdGgpKXsKLQkJCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihhcmNoaXZlUGF0aC50b09TU3RyaW5nKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc2V0WmlwRmlsZShuZXdQYXRoKTsKKwkJCQlpZihuZXdQYXRoID09IGFyY2hpdmVQYXRoIHx8IG5ld1BhdGggPT0gbnVsbCB8fCBuZXdQYXRoLmVxdWFscyhhcmNoaXZlUGF0aCkpeworCQkJCQlTdHJpbmcgbG9jID0gYXJjaGl2ZVBhdGggPT0gbnVsbCA/IG51bGwgOiBhcmNoaXZlUGF0aC50b09TU3RyaW5nKCk7CisJCQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24obG9jKTsKIAkJCQl9CisJCQkJcmVzZXRaaXBGaWxlKG5ld1BhdGgpOwogCQkJfQogCQkJcGh5c2ljYWxseU9wZW4gPSB0cnVlOwogCQl9CkBAIC0xMDUsNiArMTExLDcgQEAKIAkJfSAKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FyY2hpdmVSZXNvdXJjZShJUGF0aCByZXNvdXJjZVBhdGgpIHsKIAkJZmluYWwgYm9vbGVhbiBpc1BoeXNjaWFsbHlPcGVuID0gaXNQaHlzaWNhbGx5T3BlbigpOwogCQlFeGNlcHRpb24gY2F1Z2h0RXhjZXB0aW9uID0gbnVsbDsKQEAgLTEzMCw2ICsxMzcsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBJQXJjaGl2ZVJlc291cmNlIGdldEFyY2hpdmVSZXNvdXJjZShJUGF0aCBmaWxlUGF0aCkgewogCQlmaW5hbCBib29sZWFuIGlzUGh5c2NpYWxseU9wZW4gPSBpc1BoeXNpY2FsbHlPcGVuKCk7CiAJCUV4Y2VwdGlvbiBjYXVnaHRFeGNlcHRpb24gPSBudWxsOwpAQCAtMTgyLDYgKzE5MCw3IEBACiAJfQogCQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBqYXZhLmlvLklucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElBcmNoaXZlUmVzb3VyY2UgYUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKIAkJZmluYWwgYm9vbGVhbiBpc1BoeXNjaWFsbHlPcGVuID0gaXNQaHlzaWNhbGx5T3BlbigpOwogCQlFeGNlcHRpb24gY2F1Z2h0RXhjZXB0aW9uID0gbnVsbDsKQEAgLTE5Niw2ICsyMDUsNyBAQAogCQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24odXJpKTsKIAogCQkJcmV0dXJuIG5ldyBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW0oZ2V0WmlwRmlsZSgpLmdldElucHV0U3RyZWFtKGVudHJ5KSkgeworCQkJCUBPdmVycmlkZQogCQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQkJc3VwZXIuY2xvc2UoKTsKIAkJCQkJaWYgKCFpc1BoeXNjaWFsbHlPcGVuICkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9KYXZhRUVNb2R1bGVIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL0phdmFFRU1vZHVsZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTJjMjVjCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9KYXZhRUVNb2R1bGVIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLklNb2R1bGVIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CisKK3B1YmxpYyBjbGFzcyBKYXZhRUVNb2R1bGVIYW5kbGVyIGltcGxlbWVudHMgSU1vZHVsZUhhbmRsZXIgeworCisJcHVibGljIFN0cmluZyBnZXRBcmNoaXZlTmFtZShJUHJvamVjdCBwcm9qLElWaXJ0dWFsQ29tcG9uZW50IGNvbXApIHsKKwkJaWYgKGNvbXAgIT0gbnVsbCkKKwkJCXJldHVybiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldENvbXBvbmVudFVSSShjb21wKTsKKwkJcmV0dXJuIHByb2ouZ2V0TmFtZSgpICsgIi5qYXIiOyAvLyROT04tTkxTLTEkCisJCQorCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBzZXRDb21wb25lbnRBdHRyaWJ1dGVzKElQcm9qZWN0IHByb2opIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcHVibGljIExpc3Q8SVByb2plY3Q+IGdldEZpbHRlcmVkUHJvamVjdExpc3RGb3JBZGQoSVZpcnR1YWxDb21wb25lbnQgc291cmNlQ29tcG9uZW50LCBMaXN0PElQcm9qZWN0PiBhdmFpbGFibGVQcm9qZWN0cykgeworCQlJdGVyYXRvcjxJUHJvamVjdD4gaSA9IGF2YWlsYWJsZVByb2plY3RzLml0ZXJhdG9yKCk7CisJCUlQcm9qZWN0IHA7CisJCQorCQkKKwkJd2hpbGUoaS5oYXNOZXh0KCkpIHsKKwkJCXAgPSBpLm5leHQoKTsKKwkJCWlmKCAhcC5pc09wZW4oKSkKKwkJCQlpLnJlbW92ZSgpOworCQkJZWxzZSB7CisJCQkJSVByb2plY3QgY29tcFByb2plY3QgPSBzb3VyY2VDb21wb25lbnQuZ2V0UHJvamVjdCgpOworCQkJCWlmKCBwLmVxdWFscyhjb21wUHJvamVjdCkpCisJCQkJCWkucmVtb3ZlKCk7CisJCQkJZWxzZSBpZiAoIWlzSmF2YVByb2plY3QocCkpCisJCQkJCWkucmVtb3ZlKCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGF2YWlsYWJsZVByb2plY3RzOworCX0KKworCXByaXZhdGUgYm9vbGVhbiBpc0phdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKKwkJCisJCWlmIChwcm9qZWN0ICE9IG51bGwpCisJCQl0cnkgeworCQkJCXJldHVybiBwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQl9CisJCXJldHVybiBmYWxzZTsKKwkJCQkKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvVXRpbGl0eUJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9VdGlsaXR5QmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEKaW5kZXggZDQwMDEzNS4uYWM4MWRiZiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9VdGlsaXR5QmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9VdGlsaXR5QmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEKQEAgLTQ2LDE1ICs0NiwxOCBAQAogCQkJcmV0dXJuIGluc3RhbmNlOwogCQl9CiAKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBBcmNoaXZlIGNyZWF0ZUNvbnZlcnRlZEFyY2hpdmUoKSB7CiAJCQlSZWZlcmVuY2VDb3VudGVkQXJjaGl2ZUltcGwgYXJjaGl2ZSA9IG5ldyBSZWZlcmVuY2VDb3VudGVkQXJjaGl2ZUltcGwoKTsKIAkJCXJldHVybiBhcmNoaXZlOwogCQl9CiAKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBib29sZWFuIGNhbkltcG9ydChBcmNoaXZlIGFuQXJjaGl2ZSkgewogCQkJcmV0dXJuIHRydWU7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIEltcG9ydFN0cmF0ZWd5IGNyZWF0ZUltcG9ydFN0cmF0ZWd5KEFyY2hpdmUgb2xkLCBBcmNoaXZlIG5ld0FyY2hpdmUpIHsKIAkJCXJldHVybiBudWxsOwogCQl9CkBAIC03NCw2ICs3Nyw3IEBACiAJCQl9CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIHZvaWQgY2xvc2UoKSB7CiAJCQloZWxwZXIuYWJvdXRUb0Nsb3NlKCk7CiAJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTEwMSw2ICsxMDUsNyBAQAogCQkJdGhpcy5oZWxwZXIgPSBoZWxwZXI7CiAJCX0KIAkJCisJCUBPdmVycmlkZQogCQlwcm90ZWN0ZWQgTG9hZFN0cmF0ZWd5IGNyZWF0ZUxvYWRTdHJhdGVneUZvclJlb3BlbihBcmNoaXZlIHBhcmVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJcmV0dXJuIGNyZWF0ZUJpbmFyeUxvYWRTdHJhdGVneShnZXRFbnRlcnByaXNlQmluYXJ5Q29tcG9uZW50SGVscGVyKCkpOwpAQCAtMTE3LDEwICsxMjIsMTIgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZ2V0RGlzY3JpbWluYXRvcigpIHsKIAkJcmV0dXJuIERpc2NyaW1pbmF0b3IuZ2V0SW5zdGFuY2UoKTsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElSZWZlcmVuY2VDb3VudGVkQXJjaGl2ZSBnZXRVbmlxdWVBcmNoaXZlKCkgewogCQl0cnkgewogCQkJcmV0dXJuIG9wZW5BcmNoaXZlKCk7CkBAIC0xMjksNiArMTM2LDcgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBFT2JqZWN0IGdldFByaW1hcnlSb290T2JqZWN0KCkgewogCQlyZXR1cm4gbnVsbDsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL1dlYkJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvY29tcG9uZW50Y29yZS9XZWJCaW5hcnlDb21wb25lbnRIZWxwZXIuamF2YQppbmRleCA5Yjc1OTFlLi44YzdjNjI0IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9jb21wb25lbnRjb3JlL1dlYkJpbmFyeUNvbXBvbmVudEhlbHBlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2NvbXBvbmVudGNvcmUvV2ViQmluYXJ5Q29tcG9uZW50SGVscGVyLmphdmEKQEAgLTM5LDcgKzM5LDggQEAKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKIAkJCXJldHVybiBmYWxzZTsKIAkJfSBmaW5hbGx5IHsKLQkJCWhlbHBlci5kaXNwb3NlKCk7CisJCQlpZihoZWxwZXIgIT0gbnVsbCkKKwkJCQloZWxwZXIuZGlzcG9zZSgpOwogCQl9CiAJfQogCkBAIC01NCw2ICs1NSw3IEBACiAJCQlyZXR1cm4gaW5zdGFuY2U7CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIEFyY2hpdmUgY3JlYXRlQ29udmVydGVkQXJjaGl2ZSgpIHsKIAkJCVJlZmVyZW5jZUNvdW50ZWRXQVJGaWxlSW1wbCBhcmNoaXZlID0gbmV3IFJlZmVyZW5jZUNvdW50ZWRXQVJGaWxlSW1wbCgpOwogCQkJcmV0dXJuIGFyY2hpdmU7CkBAIC03MCw2ICs3Miw3IEBACiAJCQl9CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIHZvaWQgY2xvc2UoKSB7CiAJCQloZWxwZXIuYWJvdXRUb0Nsb3NlKCk7CiAJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKQEAgLTk3LDYgKzEwMCw3IEBACiAJCQl0aGlzLmhlbHBlciA9IGhlbHBlcjsKIAkJfQogCQkKKwkJQE92ZXJyaWRlCiAJCXByb3RlY3RlZCBMb2FkU3RyYXRlZ3kgY3JlYXRlTG9hZFN0cmF0ZWd5Rm9yUmVvcGVuKEFyY2hpdmUgcGFyZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQlyZXR1cm4gY3JlYXRlQmluYXJ5TG9hZFN0cmF0ZWd5KGdldEVudGVycHJpc2VCaW5hcnlDb21wb25lbnRIZWxwZXIoKSk7CkBAIC0xMTMsNiArMTE3LDcgQEAKIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IgZ2V0RGlzY3JpbWluYXRvcigpIHsKIAkJcmV0dXJuIERpc2NyaW1pbmF0b3IuZ2V0SW5zdGFuY2UoKTsKIAl9CkBAIC0xMjEsNiArMTI2LDcgQEAKIAkJc3VwZXIoY29tcG9uZW50KTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRU9iamVjdCBnZXRQcmltYXJ5Um9vdE9iamVjdCgpIHsKIAkJcmV0dXJuICgoV0FSRmlsZSkgZ2V0QXJjaGl2ZSgpKS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlbGV0ZS9DbGFzc3BhdGhEZWxldGVJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZWxldGUvQ2xhc3NwYXRoRGVsZXRlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmI4MzQxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlbGV0ZS9DbGFzc3BhdGhEZWxldGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVsZXRlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLS8qKgotICogQSBzaW1wbGUgc3RydWN0dXJlIHRoYXQgcmVtZW1iZXJzIGZvciBhIGdpdmVuIHByb2plY3QsIHRoZSBtYW5pZmVzdCBlbnRyaWVzIHRvIGJlIGRlbGV0ZWQgYW5kIHRoZQotICogYnVpbGQgcGF0aCBlbnRyaWVzIHRvIGJlIGRlbGV0ZWQKLSAqLwotcHVibGljIGNsYXNzIENsYXNzcGF0aERlbGV0ZUluZm8gewotCS8qKgotCSAqIFRoZSBwcm9qZWN0IGZyb20gd2hpY2ggdGhlIGRlcGVuZGVuY2llcyB3aWxsIGJlIHJlbW92ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2plY3QgdGFyZ2V0UHJvamVjdDsKLQkvKioKLQkgKiBUaGUgbGl0ZXJhbCBtYW5pZmVzdCBlbnRyaWVzIHRvIGJlIHJlbW92ZWQ7IFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBMaXN0IG1hbmlmZXN0RW50cmllczsKLQkvKioKLQkgKiBUaGUgcHJvamVjdCByZWZlcmVuY2VzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYnVpbGQgcGF0aDsgSVByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCByZWZlcmVuY2VkUHJvamVjdHM7Ci0KLQlwdWJsaWMgQ2xhc3NwYXRoRGVsZXRlSW5mbyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRhcmdldFByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1hbmlmZXN0RW50cmllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TWFuaWZlc3RFbnRyaWVzKCkgewotCQlpZiAobWFuaWZlc3RFbnRyaWVzID09IG51bGwpCi0JCQltYW5pZmVzdEVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBtYW5pZmVzdEVudHJpZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWZlcmVuY2VkUHJvamVjdHMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlZmVyZW5jZWRQcm9qZWN0cygpIHsKLQkJaWYgKHJlZmVyZW5jZWRQcm9qZWN0cyA9PSBudWxsKQotCQkJcmVmZXJlbmNlZFByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gcmVmZXJlbmNlZFByb2plY3RzOwotCX0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFyZ2V0UHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBJUHJvamVjdAotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRUYXJnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGFyZ2V0UHJvamVjdDsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlbGV0ZS9EZWxldGVNb2R1bGVPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlbGV0ZS9EZWxldGVNb2R1bGVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5ZGQ2Mi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZWxldGUvRGVsZXRlTW9kdWxlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlbGV0ZTsKLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIERvIG5vdCB1c2UgdGhpcy4gIEl0IHdpbGwgYmUgZGVsZXRlZCBpbiAzLjAKLSAqIAotICogQGRlcHJlY2F0ZWQKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVNb2R1bGVPcGVyYXRpb24geyAvL2V4dGVuZHMgV1RQT3BlcmF0aW9uIHsKLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotLy8JcHJvdGVjdGVkIERlbGV0ZU9wdGlvbnMgb3B0aW9uczsKLS8vCS8qCi0vLwkgKiBrZXkgaXMgYW4gRUFSRWRpdE1vZGVsIGFuZCB0aGUgdmFsdWUgaXMgYSBsaXN0IG9mIGRlbGV0ZSBjb21tYW5kcy4gV2UgY2FjaGUgdGhlIGNvbW1hbmRzIGFuZAotLy8JICogZXhlY3V0ZSBsYXRlciBiZWNhdXNlIHRoZSBtb2R1bGVzIHN0aWxsIG5lZWQgdG8gZXhpc3Qgd2hlbiB3ZSBnbyB0byByZW1vdmUgbW9kdWxlIGRlcGVuZGVuY3kKLS8vCSAqIHJlZmVyZW5jZXMuCi0vLwkgKi8KLS8vCXByb3RlY3RlZCBNYXAgZGVmZXJyZWRDb21tYW5kczsKLS8vCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0vLwlwcm90ZWN0ZWQgRGVsZXRlTW9kdWxlRGVwZW5kZW5jeU9wZXJhdGlvbiBkZWxldGVNb2R1bGVEZXBlbmRlbmN5T3BlcmF0aW9uOwotLy8JcHJvdGVjdGVkIExvb3NlQ29tcG9zZWRFZGl0TW9kZWwgZGVsZXRlRWRpdE1vZGVsOwotLy8JcHJvdGVjdGVkIExpc3QgZGlydHlFYXJNb2RlbHM7Ci0vLwotLy8JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgRURJVF9NT0RFTF9LRVkgPSAiREVMRVRFX01PRFVMRVMiOyAvLyROT04tTkxTLTEkCi0vLwotLy8JcHVibGljIERlbGV0ZU1vZHVsZU9wZXJhdGlvbihEZWxldGVPcHRpb25zIG9wdGlvbnMpIHsKLS8vCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogQHNlZSBIZWFkbGVzc0oyRUVPcGVyYXRpb24jZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yKQotLy8JICovCi0vLwlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgYU1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0vLwkJdGhpcy5tb25pdG9yID0gYU1vbml0b3I7Ci0vLwkJdHJ5IHsKLS8vCQkJYnVpbGREZWxldGVDb21tYW5kc0lmTmVjZXNzYXJ5KCk7Ci0vLwkJCWlmIChvcHRpb25zLnNob3VsZERlbGV0ZU1vZHVsZURlcGVuZGVuY2llcygpKSB7Ci0vLwkJCQlkZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoKTsKLS8vCQkJfQotLy8JCQljaGVja0lmRWFyc0FyZURpcnR5KCk7Ci0vLwkJCWV4ZWN1dGVEZWZlcnJlZENvbW1hbmRzKCk7Ci0vLwkJCXNhdmVNb2RlbHNJZk5lY2Vzc2FyeSgpOwotLy8JCX0gZmluYWxseSB7Ci0vLwkJCXJlbGVhc2VNb2RlbHMoKTsKLS8vCQl9Ci0vLwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCB2b2lkIGNoZWNrSWZFYXJzQXJlRGlydHkoKSB7Ci0vLwkJZGlydHlFYXJNb2RlbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJaWYgKGRlZmVycmVkQ29tbWFuZHMgPT0gbnVsbCkKLS8vCQkJcmV0dXJuOwotLy8JCUl0ZXJhdG9yIG1vZGVscyA9IGRlZmVycmVkQ29tbWFuZHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLS8vCQl3aGlsZSAobW9kZWxzLmhhc05leHQoKSkgewotLy8JCQlFQVJFZGl0TW9kZWwgbW9kZWwgPSAoRUFSRWRpdE1vZGVsKSBtb2RlbHMubmV4dCgpOwotLy8JCQlpZiAobW9kZWwuaXNEaXJ0eSgpICYmICFkaXJ0eUVhck1vZGVscy5jb250YWlucyhtb2RlbCkpIHsKLS8vCQkJCWRpcnR5RWFyTW9kZWxzLmFkZChtb2RlbCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIHZvaWQgYnVpbGREZWxldGVDb21tYW5kc0lmTmVjZXNzYXJ5KCkgewotLy8JCWlmIChkZWZlcnJlZENvbW1hbmRzICE9IG51bGwgJiYgIWRlZmVycmVkQ29tbWFuZHMuaXNFbXB0eSgpKQotLy8JCQlyZXR1cm47Ci0vLwkJZGVmZXJyZWRDb21tYW5kcyA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJTGlzdCBlYXJQcm9qZWN0cyA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0QWxsRUFSUHJvamVjdHNJbldvcmtiZW5jaCgpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgZWFyUHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJSVByb2plY3QgcCA9IChJUHJvamVjdCkgZWFyUHJvamVjdHMuZ2V0KGkpOwotLy8JCQlpZiAob3B0aW9ucy5nZXRTZWxlY3RlZFByb2plY3RzKCkuY29udGFpbnMocCkpCi0vLwkJCQlyZXR1cm47Ci0vLwkJCUVBUk5hdHVyZVJ1bnRpbWUgcnVudGltZSA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShwKTsKLS8vCQkJaWYgKHJ1bnRpbWUgIT0gbnVsbCkKLS8vCQkJCWJ1aWxkRGVsZXRlQ29tbWFuZHMocnVudGltZSk7Ci0vLwkJfQotLy8JfQotLy8KLS8vCXByb3RlY3RlZCB2b2lkIGJ1aWxkRGVsZXRlQ29tbWFuZHMoRUFSTmF0dXJlUnVudGltZSBydW50aW1lKSB7Ci0vLwkJTGlzdCBjb21tYW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlFQVJFZGl0TW9kZWwgbW9kZWwgPSBydW50aW1lLmdldEVhckVkaXRNb2RlbEZvcldyaXRlKHRoaXMpOwotLy8JCUxpc3QgcHJvamVjdHMgPSBvcHRpb25zLmdldE1vZHVsZUFuZFV0aWxpdHlQcm9qZWN0cygpOwotLy8JCXRyeSB7Ci0vLwkJCWlmIChvcHRpb25zLnNob3VsZERlbGV0ZU1vZHVsZXMoKSkgewotLy8JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5zaXplKCk7IGkrKykgewotLy8JCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHByb2plY3RzLmdldChpKTsKLS8vCQkJCQlNb2R1bGUgbSA9IHJ1bnRpbWUuZ2V0TW9kdWxlKHByb2plY3QpOwotLy8JCQkJCWlmIChtICE9IG51bGwpCi0vLwkJCQkJCWNvbW1hbmRzLmFkZChuZXcgUmVtb3ZlTW9kdWxlRnJvbUVBUlByb2plY3RDb21tYW5kKG0sIHJ1bnRpbWUuZ2V0UHJvamVjdCgpKSk7Ci0vLwkJCQkJZWxzZSB7Ci0vLwkJCQkJCVN0cmluZyB1cmkgPSBydW50aW1lLmdldEpBUlVyaShwcm9qZWN0KTsKLS8vCQkJCQkJaWYgKHVyaSAhPSBudWxsKQotLy8JCQkJCQkJY29tbWFuZHMuYWRkKG5ldyBSZW1vdmVVdGlsaXR5SkFSTWFwQ29tbWFuZChydW50aW1lLmdldFByb2plY3QoKSwgdXJpLCBwcm9qZWN0KSk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCWlmICghY29tbWFuZHMuaXNFbXB0eSgpKQotLy8JCQkJZGVmZXJyZWRDb21tYW5kcy5wdXQobW9kZWwsIGNvbW1hbmRzKTsKLS8vCQkJZWxzZQotLy8JCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLS8vCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLS8vCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLS8vCQkJdGhyb3cgZTsKLS8vCQl9IGNhdGNoIChFcnJvciBlcnIpIHsKLS8vCQkJbW9kZWwucmVsZWFzZUFjY2Vzcyh0aGlzKTsKLS8vCQkJdGhyb3cgZXJyOwotLy8JCX0KLS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIERvIHRoaXMgZm9yIHVuaGFuZGxlZCBleGNlcHRpb25zCi0vLwkgKi8KLS8vCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VNb2RlbHMoKSB7Ci0vLwkJaWYgKGRlbGV0ZUVkaXRNb2RlbCAhPSBudWxsKSB7Ci0vLwkJCS8vVE9ETyAtIFJMUywgMi8xOS8yMDA0IHdlIG5lZWQgdG8gcmV2aXNpdCB0aGUgd2hvbGUgbm90aW9uIG9mIHRoZSBsb29zZSBjb21wb3NlZCBlZGl0Ci0vLwkJCS8vbW9kZWwgYmVjY2F1c2UgdGhpcyBkb2VzIG5vdCByZWxlYXNlIHRoZSBuZXN0ZWQgbW9kZWxzIGFzIGV4cGVjdGVkLCBhbHNvIGl0IGxvb2tzCi0vLwkJCS8vIGxpa2UKLS8vCQkJLy8gdGhlIGRlbGV0ZSBlZGl0IG1vZGVsIGlzIG5ldmVyIGNyZWF0ZWQgd2hpY2ggbWVhbnMgdmFsaWRhdGUgZWRpdCBpcyBub3QgaGFwcGVuaW5nCi0vLwkJCS8vVE9ETyAtIEpBUyB3aGVuIHlvdSBsb29rIGF0IHRoaXMgY2xhc3MgdG8gY2xlYW4gdXAgdGhlIGFib3ZlLCBhbHNvIGxvb2sgYXQKLS8vCQkJLy8gUmVuYW1lTW9kdWxlT3BlcmF0aW9uCi0vLwkJCS8vYmVjYXVzZSBpdCBoYXMgdGhlIHNhbWUga2luZCBvZiBtZXNzCi0vLwkJCWRlbGV0ZUVkaXRNb2RlbC5yZWxlYXNlQWNjZXNzKHRoaXMpOwotLy8JCQlkZWxldGVFZGl0TW9kZWwgPSBudWxsOwotLy8JCX0KLS8vCQlpZiAoZGVmZXJyZWRDb21tYW5kcyAhPSBudWxsKSB7Ci0vLwkJCUl0ZXJhdG9yIGl0ZXIgPSBkZWZlcnJlZENvbW1hbmRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0vLwkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotLy8JCQkJRWRpdE1vZGVsIGVkaXRNb2RlbCA9IChFZGl0TW9kZWwpIGl0ZXIubmV4dCgpOwotLy8JCQkJZWRpdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0vLwkJCQlpdGVyLnJlbW92ZSgpOwotLy8JCQl9Ci0vLwkJfQotLy8JfQotLy8KLS8vCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0vLwkJcmVsZWFzZU1vZGVscygpOwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogQWZ0ZXIgYSBub3JtYWwgZXhlY3V0aW9uIGZsb3csIHNhdmUgdGhlIG1vZGVscyBpZiBuZWNlc3NhcnkKLS8vCSAqLwotLy8JcHJvdGVjdGVkIHZvaWQgc2F2ZU1vZGVsc0lmTmVjZXNzYXJ5KCkgewotLy8JCWlmIChkZWZlcnJlZENvbW1hbmRzID09IG51bGwpCi0vLwkJCXJldHVybjsKLS8vCQlJdGVyYXRvciBtb2RlbHMgPSBkZWZlcnJlZENvbW1hbmRzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0vLwkJd2hpbGUgKG1vZGVscy5oYXNOZXh0KCkpIHsKLS8vCQkJRUFSRWRpdE1vZGVsIG1vZGVsID0gKEVBUkVkaXRNb2RlbCkgbW9kZWxzLm5leHQoKTsKLS8vCQkJaWYgKG1vZGVsLmlzRGlydHkoKSkgewotLy8JCQkJaWYgKGRpcnR5RWFyTW9kZWxzLmNvbnRhaW5zKG1vZGVsKSkgewotLy8JCQkJCW1vZGVsLnNhdmVJZk5lY2Vzc2FyeSh0aGlzKTsKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJbW9kZWwuc2F2ZSh0aGlzKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgdm9pZCBkZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotLy8JCWdldERlbGV0ZU1vZHVsZURlcGVuZGVuY3lPcGVyYXRpb24oKS5ydW4obW9uaXRvcik7Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIERlbGV0ZU1vZHVsZURlcGVuZGVuY3lPcGVyYXRpb24gZ2V0RGVsZXRlTW9kdWxlRGVwZW5kZW5jeU9wZXJhdGlvbigpIHsKLS8vCQlpZiAoZGVsZXRlTW9kdWxlRGVwZW5kZW5jeU9wZXJhdGlvbiA9PSBudWxsKSB7Ci0vLwkJCUxpc3QgZWFyRWRpdE1vZGVscyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJSXRlcmF0b3IgaXRlciA9IGRlZmVycmVkQ29tbWFuZHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLS8vCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotLy8JCQkJZWFyRWRpdE1vZGVscy5hZGQoKChFQVJFZGl0TW9kZWwpIGl0ZXIubmV4dCgpKS5nZXRFQVJOYXR1cmUoKSk7Ci0vLwkJCWRlbGV0ZU1vZHVsZURlcGVuZGVuY3lPcGVyYXRpb24gPSBuZXcgRGVsZXRlTW9kdWxlRGVwZW5kZW5jeU9wZXJhdGlvbihlYXJFZGl0TW9kZWxzLCBuZXcgSGFzaFNldChvcHRpb25zLmdldE1vZHVsZUFuZFV0aWxpdHlQcm9qZWN0cygpKSk7Ci0vLwkJfQotLy8JCXJldHVybiBkZWxldGVNb2R1bGVEZXBlbmRlbmN5T3BlcmF0aW9uOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVEZWZlcnJlZENvbW1hbmRzKCkgewotLy8JCUl0ZXJhdG9yIGl0ID0gZGVmZXJyZWRDb21tYW5kcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0vLwkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotLy8JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0vLwkJCUxpc3QgY29tbWFuZHMgPSAoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsKLS8vCQkJZXhlY3V0ZUNvbW1hbmRzKGNvbW1hbmRzKTsKLS8vCi0vLwkJfQotLy8JfQotLy8KLS8vCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVDb21tYW5kcyhMaXN0IGNvbW1hbmRzKSB7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kcy5zaXplKCk7IGkrKykgewotLy8JCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBjb21tYW5kcy5nZXQoaSk7Ci0vLwkJCWNtZC5leGVjdXRlKCk7Ci0vLwkJfQotLy8JfQotLy8KLS8vCS8qKgotLy8JICogUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIG5vbi1yZXNvdXJjZSBmaWxlcyB0aGF0IHdpbGwgZ2V0IG1vZGlmaWVkIGFzIGEgcmVzdWx0IG9mIHJ1bm5pbmcKLS8vCSAqIHRoaXMgb3BlcmF0aW9uOyB1c2VkIGZvciB2YWxpZGF0ZSBlZGl0LgotLy8JICovCi0vLwlwcm90ZWN0ZWQgTGlzdCBnZXRBZmZlY3RlZE5vblJlc291cmNlRmlsZXMoKSB7Ci0vLwkJaWYgKG9wdGlvbnMuc2hvdWxkRGVsZXRlTW9kdWxlRGVwZW5kZW5jaWVzKCkpCi0vLwkJCXJldHVybiBnZXREZWxldGVNb2R1bGVEZXBlbmRlbmN5T3BlcmF0aW9uKCkuZ2V0QWZmZWN0ZWRGaWxlcygpOwotLy8JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogVXNlIHRoaXMgb25seSBmb3IgdmFsaWRhdGUgZWRpdHMKLS8vCSAqLwotLy8JcHVibGljIENvbXBvc2VkRWRpdE1vZGVsIGdldERlbGV0ZUVkaXRNb2RlbCgpIHsKLS8vCQlpZiAoZGVsZXRlRWRpdE1vZGVsID09IG51bGwpCi0vLwkJCWluaXRpYWxpemVEZWxldGVFZGl0TW9kZWwoKTsKLS8vCQlyZXR1cm4gZGVsZXRlRWRpdE1vZGVsOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWxldGVFZGl0TW9kZWwoKSB7Ci0vLwkJaWYgKG9wdGlvbnMuZ2V0QWxsUHJvamVjdHNUb0RlbGV0ZSgpLnNpemUoKSA9PSAwKSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKEoyRUVDcmVhdGlvblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkRlbGV0ZU1vZHVsZU9wZXJhdGlvbl9VSV8wIikpOyAvLyROT04tTkxTLTEkCi0vLwkJfQotLy8KLS8vCQlidWlsZERlbGV0ZUNvbW1hbmRzSWZOZWNlc3NhcnkoKTsKLS8vCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLS8vCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBvcHRpb25zLmdldEFsbFByb2plY3RzVG9EZWxldGUoKS5nZXQoMCk7Ci0vLwotLy8JCWRlbGV0ZUVkaXRNb2RlbCA9IG5ldyBMb29zZUNvbXBvc2VkRWRpdE1vZGVsKEVESVRfTU9ERUxfS0VZLCAoRU1GV29ya2JlbmNoQ29udGV4dCkgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RU1GQ29udGV4dChwcm9qZWN0KSkgewotLy8KLS8vCQkJLyoqCi0vLwkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwud29ya2JlbmNoLkVkaXRNb2RlbCNnZXROb25SZXNvdXJjZUZpbGVzKCkKLS8vCQkJICovCi0vLwkJCXB1YmxpYyBMaXN0IGdldE5vblJlc291cmNlRmlsZXMoKSB7Ci0vLwkJCQlMaXN0IHJlc3VsdCA9IHN1cGVyLmdldE5vblJlc291cmNlRmlsZXMoKTsKLS8vCQkJCXJlc3VsdC5hZGRBbGwoZ2V0QWZmZWN0ZWROb25SZXNvdXJjZUZpbGVzKCkpOwotLy8JCQkJcmV0dXJuIHJlc3VsdDsKLS8vCQkJfQotLy8JCX07Ci0vLwotLy8JCUl0ZXJhdG9yIGl0ID0gZGVmZXJyZWRDb21tYW5kcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotLy8JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLS8vCQkJZGVsZXRlRWRpdE1vZGVsLmFkZENoaWxkKChKMkVFRWRpdE1vZGVsKSBpdC5uZXh0KCkpOwotLy8JCX0KLS8vCX0KLS8vCi0vLwlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0vLwkJcmV0dXJuIGRlbGV0ZU1vZHVsZURlcGVuZGVuY3lPcGVyYXRpb24uZ2V0U3RhdHVzKCk7Ci0vLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlbGV0ZS9EZWxldGVPcHRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZWxldGUvRGVsZXRlT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTIxNTc3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlbGV0ZS9EZWxldGVPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZWxldGU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgRGVsZXRlT3B0aW9ucyB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VBUkRlbGV0ZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWxldGVQcm9qZWN0czsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWxldGVNb2R1bGVzOwotCXByb3RlY3RlZCBib29sZWFuIGRlbGV0ZU1vZHVsZURlcGVuZGVuY2llczsKLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZFByb2plY3RzOwotCS8qKiBBcHBsaWNhYmxlIGZvciBFQVIgZGVsZXRlICovCi0JcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVsZXRlT3B0aW9ucy4KLQkgKi8KLQlwdWJsaWMgRGVsZXRlT3B0aW9ucygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZERlbGV0ZU1vZHVsZXMoKSB7Ci0JCXJldHVybiBkZWxldGVNb2R1bGVzOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlTW9kdWxlcyhib29sZWFuIGRlbGV0ZU1vZHVsZXNGcm9tQWxsRUFScykgewotCQl0aGlzLmRlbGV0ZU1vZHVsZXMgPSBkZWxldGVNb2R1bGVzRnJvbUFsbEVBUnM7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxldGVQcm9qZWN0cygpIHsKLQkJcmV0dXJuIGRlbGV0ZVByb2plY3RzOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlUHJvamVjdHMoYm9vbGVhbiBkZWxldGVQcm9qZWN0cykgewotCQl0aGlzLmRlbGV0ZVByb2plY3RzID0gZGVsZXRlUHJvamVjdHM7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoKSB7Ci0JCXJldHVybiBkZWxldGVNb2R1bGVEZXBlbmRlbmNpZXM7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXREZWxldGVNb2R1bGVEZXBlbmRlbmNpZXMoYm9vbGVhbiBkZWxldGVSZWZlcmVuY2VzRnJvbU1vZHVsZURlcGVuZGVuY2llcykgewotCQl0aGlzLmRlbGV0ZU1vZHVsZURlcGVuZGVuY2llcyA9IGRlbGV0ZVJlZmVyZW5jZXNGcm9tTW9kdWxlRGVwZW5kZW5jaWVzOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE1vZHVsZUFuZFV0aWxpdHlQcm9qZWN0cygpIHsKLQkJaWYgKGlzRUFSRGVsZXRlKQotCQkJcmV0dXJuIGdldFNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCXJldHVybiBnZXRTZWxlY3RlZFByb2plY3RzKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWxsUHJvamVjdHNUb0RlbGV0ZSgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0U2VsZWN0ZWRQcm9qZWN0cygpKTsKLQkJcmVzdWx0LmFkZEFsbChnZXRTZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzZWxlY3RlZFByb2plY3RzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZFByb2plY3RzKCkgewotCQlpZiAoc2VsZWN0ZWRQcm9qZWN0cyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXJldHVybiBzZWxlY3RlZFByb2plY3RzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGVkUHJvamVjdHMuCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGVkUHJvamVjdHMKLQkgKiAgICAgICAgICAgIFRoZSBzZWxlY3RlZFByb2plY3RzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkUHJvamVjdHMoTGlzdCBzZWxlY3RlZFByb2plY3RzKSB7Ci0JCXRoaXMuc2VsZWN0ZWRQcm9qZWN0cyA9IHNlbGVjdGVkUHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzKCkgewotCQlpZiAoc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlyZXR1cm4gc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMuCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzCi0JICogICAgICAgICAgICBUaGUgc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoTGlzdCBzZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cykgewotCQl0aGlzLnNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzID0gc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFQVJEZWxldGUoKSB7Ci0JCXJldHVybiBpc0VBUkRlbGV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc0VBUkRlbGV0ZShib29sZWFuIGlzRUFSRGVsZXRlKSB7Ci0JCXRoaXMuaXNFQVJEZWxldGUgPSBpc0VBUkRlbGV0ZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L0oyRUVKYXZhUHJvamVjdEluZm8uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvSjJFRUphdmFQcm9qZWN0SW5mby5qYXZhCmluZGV4IGJkYmFjZGQuLmU3M2QyNDcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvSjJFRUphdmFQcm9qZWN0SW5mby5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvSjJFRUphdmFQcm9qZWN0SW5mby5qYXZhCkBAIC0yNCw3ICsyNCw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YVByb2plY3RJbmZvOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiAKIC8qKgogICogVGhpcyBjbGFzcyBzdG9yZXMgdGhlIGluZm8gcmVxdWlyZWQgZm9yIGNyZWF0aW5nIGEgbmV3IEoyRUUgcHJvamVjdDsgbm90IGFsbCBpbmZvIHdpbGwgYXBwbHkgdG8KQEAgLTEwNSw3ICsxMDcsNyBAQAogCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyeSA9IG5ldyBJQ2xhc3NwYXRoRW50cnlbMV07CiAJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGpka0phckZ1bGxQYXRoTmFtZSk7CiAJCWlmICghcGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihKMkVFQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKEoyRUVDcmVhdGlvblJlc291cmNlSGFuZGxlci5KZGtKYXJGaWxlRG9lc05vdEV4aXN0X1VJLCBuZXcgT2JqZWN0W117amRrSmFyRnVsbFBhdGhOYW1lfSkpOyAKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoSjJFRUNyZWF0aW9uUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhKMkVFQ3JlYXRpb25SZXNvdXJjZUhhbmRsZXIuSmRrSmFyRmlsZURvZXNOb3RFeGlzdF9VSSwgbmV3IE9iamVjdFtde2pka0phckZ1bGxQYXRoTmFtZX0pKTsgCiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIApAQCAtMjQzLDcgKzI0NSw3IEBACiAJICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCiAJICovCiAJcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RGVmYXVsdFVyaSgpIHsKLQkJcmV0dXJuIHByb2plY3ROYW1lLnJlcGxhY2UoJyAnLCAnXycpICsgIi5qYXIiOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBwcm9qZWN0TmFtZS5yZXBsYWNlKCcgJywgJ18nKSArIElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQ7CiAJfQogCiAJLyoqCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L0oyRUVQcm9qZWN0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L0oyRUVQcm9qZWN0VXRpbGl0aWVzLmphdmEKaW5kZXggZWVlOTEwZi4uMDMzNmViYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9KMkVFUHJvamVjdFV0aWxpdGllcy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvSjJFRVByb2plY3RVdGlsaXRpZXMuamF2YQpAQCAtMTMsNyArMTMsNiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTQzLDExICs0MiwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Xb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5wbHVnaW4uSkVNVXRpbFBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuSmVtUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5NYW5pZmVzdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5qYXZhbGl0ZS5JSmF2YVByb2plY3RMaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlLkphdmFDb3JlTGl0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmpkdC5pbnRlcm5hbC5qYXZhbGl0ZS5KYXZhTGl0ZVV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5GaWxlOwpAQCAtNTUsMTQgKzU2LDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU1hbmlmZXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkphdmFDb21wb25lbnRMb2FkU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5KMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLkphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVleHRlbnNpb24uRWFyTW9kdWxlTWFuYWdlcjsKQEAgLTE3MywxMyArMTcxLDE4IEBACiAJCUlQYXRoIHBhdGggPSBnZXRCaW5hcnlQcm9qZWN0SkFSTG9jYXRpb24oYVByb2plY3QpOwogCQlpZiAocGF0aCAhPSBudWxsKSB7CiAJCQlTdHJpbmcgbG9jYXRpb24gPSBwYXRoLnRvT1NTdHJpbmcoKTsKLQkJCUFyY2hpdmUgYW5BcmNoaXZlID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKS5wcmltT3BlbkFyY2hpdmUobG9jYXRpb24pOworCQkJQXJjaGl2ZSBhbkFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0UucHJpbU9wZW5BcmNoaXZlKGxvY2F0aW9uKTsKIAkJCWFuQXJjaGl2ZS5zZXRVUkkoamFyVXJpKTsKIAkJCXJldHVybiBhbkFyY2hpdmU7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCisJLyoqCisJICogQGRlcHJlY2F0ZWQgVXNlIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLk1hbmlmZXN0VXRpbGl0aWVzIGluc3RlYWQKKwkgKiBAcGFyYW0gYUZpbGUKKwkgKiBAcmV0dXJuCisJICovCiAJcHVibGljIHN0YXRpYyBBcmNoaXZlTWFuaWZlc3QgcmVhZE1hbmlmZXN0KElGaWxlIGFGaWxlKSB7CiAJCUlucHV0U3RyZWFtIGluID0gbnVsbDsKIAkJdHJ5IHsKQEAgLTE4OCw3ICsxOTEsNyBAQAogCQkJaW4gPSBhRmlsZS5nZXRDb250ZW50cygpOwogCQkJcmV0dXJuIG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKGluKTsKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZXgpOwogCQkJcmV0dXJuIG51bGw7CiAJCX0gZmluYWxseSB7CiAJCQlpZiAoaW4gIT0gbnVsbCkgewpAQCAtMjA5LDcgKzIxMiw3IEBACiAJCQlpbiA9IGFGaWxlLmdldENvbnRlbnRzKCk7CiAJCQlyZXR1cm4gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoaW4pOwogCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihleCk7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfSBmaW5hbGx5IHsKIAkJCWlmIChpbiAhPSBudWxsKSB7CkBAIC0yNTEsMTQgKzI1NCwxNCBAQAogCQkJCXRyeSB7CiAJCQkJCU1hbmlmZXN0RmlsZUNyZWF0aW9uQWN0aW9uLmNyZWF0ZU1hbmlmZXN0RmlsZShmaWxlLCBwKTsKIAkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZyhlKTsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7CisJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJfQogCQkJfQogCQkJcmV0dXJuIGZpbGU7CiAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coY2UpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihjZSk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtMjc0LDkgKzI3Nyw3IEBACiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZU1hbmlmZXN0KElQcm9qZWN0IGFQcm9qZWN0LCBJRmlsZSBhRmlsZSwgQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CiAJCWlmIChhRmlsZSAhPSBudWxsKSB7CiAJCQlpZihTaW1wbGVWYWxpZGF0ZUVkaXQudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtdIHsgYUZpbGUgfSkpewotCQkJCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGFGaWxlKTsKLQkJCQltYW5pZmVzdC53cml0ZVNwbGl0dGluZ0NsYXNzcGF0aChvdXQpOwotCQkJCW91dC5jbG9zZSgpOworCQkJCU1hbmlmZXN0VXRpbGl0aWVzLndyaXRlTWFuaWZlc3QoYUZpbGUsIG1hbmlmZXN0KTsKIAkJCQlKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5nZXRJbnN0YW5jZSgpLnF1ZXVlVXBkYXRlTW9kdWxlKGFQcm9qZWN0KTsKIAkJCX0KIAkJfQpAQCAtMzEwLDM4ICszMTEsMzYgQEAKIAkJCUphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSBudWxsOwogCQkJdHJ5ewogCQkJCWhlbHBlciA9IG5ldyBKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIoY29tcG9uZW50KTsKLQkJCQlpZihoZWxwZXIgIT0gbnVsbCl7Ci0JCQkJCUlBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwotCQkJCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQkJCXRyeXsKLQkJCQkJCWFyY2hpdmUgPSBoZWxwZXIuYWNjZXNzQXJjaGl2ZSgpOwotCQkJCQkJaWYobnVsbCAhPSBhcmNoaXZlKXsKLQkJCQkJCQlJUGF0aCBtYW5pZmVzdFBhdGggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSk7Ci0JCQkJCQkJaWYoYXJjaGl2ZS5jb250YWluc0FyY2hpdmVSZXNvdXJjZShtYW5pZmVzdFBhdGgpKXsKLQkJCQkJCQkJSUFyY2hpdmVSZXNvdXJjZSBtYW5pZmVzdFJlc291cmNlID0gYXJjaGl2ZS5nZXRBcmNoaXZlUmVzb3VyY2UobWFuaWZlc3RQYXRoKTsKLQkJCQkJCQkJaWYobWFuaWZlc3RSZXNvdXJjZSAhPSBudWxsKXsKLQkJCQkJCQkJCWluID0gbWFuaWZlc3RSZXNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCQkJCQkJQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IEFyY2hpdmVNYW5pZmVzdEltcGwoaW4pOwotCQkJCQkJCQkJcmV0dXJuIG1hbmlmZXN0OwotCQkJCQkJCQl9CisJCQkJSUFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7CisJCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOworCQkJCXRyeXsKKwkJCQkJYXJjaGl2ZSA9IGhlbHBlci5hY2Nlc3NBcmNoaXZlKCk7CisJCQkJCWlmKG51bGwgIT0gYXJjaGl2ZSl7CisJCQkJCQlJUGF0aCBtYW5pZmVzdFBhdGggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1BTklGRVNUX1VSSSk7CisJCQkJCQlpZihhcmNoaXZlLmNvbnRhaW5zQXJjaGl2ZVJlc291cmNlKG1hbmlmZXN0UGF0aCkpeworCQkJCQkJCUlBcmNoaXZlUmVzb3VyY2UgbWFuaWZlc3RSZXNvdXJjZSA9IGFyY2hpdmUuZ2V0QXJjaGl2ZVJlc291cmNlKG1hbmlmZXN0UGF0aCk7CisJCQkJCQkJaWYobWFuaWZlc3RSZXNvdXJjZSAhPSBudWxsKXsKKwkJCQkJCQkJaW4gPSBtYW5pZmVzdFJlc291cmNlLmdldElucHV0U3RyZWFtKCk7CisJCQkJCQkJCUFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBBcmNoaXZlTWFuaWZlc3RJbXBsKGluKTsKKwkJCQkJCQkJcmV0dXJuIG1hbmlmZXN0OwogCQkJCQkJCX0KIAkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCX0gZmluYWxseXsKLQkJCQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaW4uY2xvc2UoKTsKLQkJCQkJCQkJaW4gPSBudWxsOwotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCQl9IGZpbmFsbHl7CisJCQkJCWlmIChpbiAhPSBudWxsKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCWluLmNsb3NlKCk7CisJCQkJCQkJaW4gPSBudWxsOworCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJCQl9Ci0JCQkJCQlpZihhcmNoaXZlICE9IG51bGwpewotCQkJCQkJCWhlbHBlci5yZWxlYXNlQXJjaGl2ZShhcmNoaXZlKTsKLQkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZihhcmNoaXZlICE9IG51bGwpeworCQkJCQkJaGVscGVyLnJlbGVhc2VBcmNoaXZlKGFyY2hpdmUpOwogCQkJCQl9CiAJCQkJfQogCQkJfSBmaW5hbGx5ewpAQCAtNTEwLDcgKzUwOSw3IEBACiAJCXRyeSB7CiAJCQljcCA9IGphdmFQcm9qLmdldFJhd0NsYXNzcGF0aCgpOwogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpFTVV0aWxQbHVnaW4uZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihleCk7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQlJQ2xhc3NwYXRoRW50cnkgZmlyc3RTb3VyY2UgPSBudWxsOwpAQCAtNTMwLDcgKzUyOSw3IEBACiAJCQkJCQlpZiAoZGVmYXVsdFNvdXJjZVBhdGggPT0gbnVsbCkKIAkJCQkJCQlicmVhazsKIAkJCQkJfQotCQkJCQlpZiAoY3BbaV0uZ2V0UGF0aCgpLmVxdWFscyhkZWZhdWx0U291cmNlUGF0aCkpCisJCQkJCWlmIChjcFtpXS5nZXRQYXRoKCkuZXF1YWxzKGRlZmF1bHRTb3VyY2VQYXRoKSAmJiBkZWZhdWx0U291cmNlUGF0aCAhPSBudWxsKQogCQkJCQkJcmV0dXJuIGRlZmF1bHRTb3VyY2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7CiAJCQkJfQogCQkJfQpAQCAtNTQzLDcgKzU0Miw3IEBACiAJCQkJCQlpZiAoZGVmYXVsdFNvdXJjZVBhdGggPT0gbnVsbCkKIAkJCQkJCQlicmVhazsKIAkJCQkJfQotCQkJCQlpZiAoY3BbaV0uZ2V0UGF0aCgpLmVxdWFscyhkZWZhdWx0U291cmNlUGF0aCkpCisJCQkJCWlmIChjcFtpXS5nZXRQYXRoKCkuZXF1YWxzKGRlZmF1bHRTb3VyY2VQYXRoKSAmJiBkZWZhdWx0U291cmNlUGF0aCAhPSBudWxsKQogCQkJCQkJcmV0dXJuIGRlZmF1bHRTb3VyY2VQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7CiAJCQkJfQogCQkJfQpAQCAtNTY4LDE3ICs1NjcsMTcgQEAKIAkJdHJ5IHsKIAkJCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSkKIAkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoaXNFSkJQcm9qZWN0KHByb2plY3QpKSB7CisJCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QocHJvamVjdCkpIHsKIAkJCQlyZXR1cm4gc291cmNlRm9sZGVyLmZpbmRNZW1iZXIoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJKSAhPSBudWxsOwotCQkJfSBlbHNlIGlmIChpc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0KSkgeworCQkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2plY3QpKSB7CiAJCQkJcmV0dXJuIHNvdXJjZUZvbGRlci5maW5kTWVtYmVyKEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9VUkkpICE9IG51bGw7Ci0JCQl9IGVsc2UgaWYgKGlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKKwkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7CiAJCQkJcmV0dXJuIHNvdXJjZUZvbGRlci5maW5kTWVtYmVyKEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSSkgIT0gbnVsbDsKLQkJCX0gZWxzZSBpZiAoaXNKQ0FQcm9qZWN0KHByb2plY3QpKSB7CisJCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KHByb2plY3QpKSB7CiAJCQkJcmV0dXJuIHNvdXJjZUZvbGRlci5maW5kTWVtYmVyKEoyRUVDb25zdGFudHMuUkFSX0REX1VSSSkgIT0gbnVsbDsKIAkJCX0KIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC01OTAsNyArNTg5LDcgQEAKIAlwdWJsaWMgc3RhdGljIEFyY2hpdmUgYXNBcmNoaXZlKFN0cmluZyBqYXJVcmksIElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZXhwb3J0U291cmNlLCBib29sZWFuIGluY2x1ZGVDbGFzc3BhdGhDb21wb25lbnRzKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewogCQlKYXZhQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbCBzdHJhdCA9IG5ldyBKYXZhQ29tcG9uZW50TG9hZFN0cmF0ZWd5SW1wbChDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KSwgaW5jbHVkZUNsYXNzcGF0aENvbXBvbmVudHMpOwogCQlzdHJhdC5zZXRFeHBvcnRTb3VyY2UoZXhwb3J0U291cmNlKTsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCkucHJpbU9wZW5BcmNoaXZlKHN0cmF0LCBqYXJVcmkpOworCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZUZhY3RvcnkuZUlOU1RBTkNFLnByaW1PcGVuQXJjaGl2ZShzdHJhdCwgamFyVXJpKTsKIAl9CiAKIAkvKioKQEAgLTYwMCwzOSArNTk5LDYgQEAKIAkJcmV0dXJuIEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsdHlwZUlEKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUHJvamVjdE9mVHlwZShJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QsIFN0cmluZyB0eXBlSUQpIHsKLQotCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQodHlwZUlEKSkgewotCQkJSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQodHlwZUlEKTsKLQkJCXJldHVybiBwcm9qZWN0RmFjZXQgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VBUlByb2plY3QoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRHluYW1pY1dlYlByb2plY3QoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBEWU5BTUlDX1dFQik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VKQlByb2plY3QoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBFSkIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNKQ0FQcm9qZWN0KElGYWNldGVkUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgSkNBKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KElGYWNldGVkUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgQVBQTElDQVRJT05fQ0xJRU5UKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVXRpbGl0eVByb2plY3QoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBVVElMSVRZKTsKLQl9Ci0KIAkvKioKIAkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoSVByb2plY3QgcHJvamVjdCl9CiAJICovCkBAIC03MTcsMjYgKzY4MywxMyBAQAogCQlyZXR1cm4gRWFyVXRpbGl0aWVzLmlzU3RhbmRhbG9uZVByb2plY3QocHJvamVjdCk7CiAJfQogCQorCQogCS8qKgotCSAqIFJldHVybnMgYWxsIHJlZmVyZW5jaW5nIEVBUiBwcm9qZWN0cy4KLQkgKiBAcGFyYW0gcHJvamVjdCBQcm9qZWN0IHRvIGNoZWNrLiBJZiBudWxsIG9yIGFuIEVBUiwgcmV0dXJucyBhIHplcm8gbGVuZ3RoIGFycmF5LgotCSAqIEByZXR1cm4gQXJyYXkgb2YgcmVmZXJlbmNpbmcgRUFSIHByb2plY3RzLgorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgRWFyVXRpbGl0aWVzI2dldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMoSVByb2plY3QpfQorCSAqIAogCSAqLwogCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYocHJvamVjdCAhPSBudWxsICYmIGlzRUFSUHJvamVjdChwcm9qZWN0KSl7Ci0JCQlyZXR1cm4gbmV3IElQcm9qZWN0W10ge3Byb2plY3R9OwotCQl9Ci0JCQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCQkJSVZpcnR1YWxDb21wb25lbnRbXSByZWZDb21wb25lbnRzID0gY29tcG9uZW50LmdldFJlZmVyZW5jaW5nQ29tcG9uZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGlzRUFSUHJvamVjdChyZWZDb21wb25lbnRzW2ldLmdldFByb2plY3QoKSkpCi0JCQkJCXJlc3VsdC5hZGQocmVmQ29tcG9uZW50c1tpXS5nZXRQcm9qZWN0KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSVByb2plY3RbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElQcm9qZWN0W3Jlc3VsdC5zaXplKCldKTsKKwkJcmV0dXJuIEVhclV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHByb2plY3QpOwogCX0KIAkKIAkvKioKQEAgLTc0NSw3ICs2OTgsNyBAQAogCSAqIEByZXR1cm4gQXJyYXkgb2YgcmVmZXJlbmNpbmcgZHluYW1pYyB3ZWIgcHJvamVjdHMuCiAJICovCiAJcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldFJlZmVyZW5jaW5nV2ViUHJvamVjdHMoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQlpZihwcm9qZWN0ICE9IG51bGwgJiYgaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSl7CisJCWlmKHByb2plY3QgIT0gbnVsbCAmJiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpewogCQkJcmV0dXJuIG5ldyBJUHJvamVjdFtdIHtwcm9qZWN0fTsKIAkJfQogCQkKQEAgLTc1NCw3ICs3MDcsNyBAQAogCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKIAkJCUlWaXJ0dWFsQ29tcG9uZW50W10gcmVmQ29tcG9uZW50cyA9IGNvbXBvbmVudC5nZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMoKTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmQ29tcG9uZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpc0R5bmFtaWNXZWJQcm9qZWN0KHJlZkNvbXBvbmVudHNbaV0uZ2V0UHJvamVjdCgpKSkKKwkJCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHJlZkNvbXBvbmVudHNbaV0uZ2V0UHJvamVjdCgpKSkKIAkJCQkJcmVzdWx0LmFkZChyZWZDb21wb25lbnRzW2ldLmdldFByb2plY3QoKSk7CiAJCQl9CiAJCX0KQEAgLTgyMyw3ICs3NzYsNyBAQAogCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJLy8gTm90IEZhY2V0ZWQgcHJvamVjdCBvciBub3QgSjJFRSBQcm9qZWN0CiAJCX0KLQkJaWYgKGZhY2V0ICE9IG51bGwgJiYgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGZhY2V0KSkKKwkJaWYgKGZhY2V0ICE9IG51bGwgJiYgZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoZmFjZXQpKQogCQkJcmV0dXJuIGZhY2V0ZWRQcm9qZWN0LmdldEluc3RhbGxlZFZlcnNpb24oZmFjZXQpLmdldFZlcnNpb25TdHJpbmcoKTsKIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtODQyLDEwICs3OTUsOSBAQAogCX0KIAogCS8qKgotCSAqIFJldHJpZXZlIGFsbCB0aGUgc291cmNlIGNvbnRhaW5lcnMgZm9yIGEgZ2l2ZW4gdmlydHVhbCB3b3JrYmVuY2ggY29tcG9uZW50Ci0JICogCi0JICogQHBhcmFtIHZjCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgSVBhY2thZ2VGcmFnbWVudFJvb3RzCisJICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBKYXZhTGl0ZVV0aWxpdGllcyNnZXRKYXZhU291cmNlQ29udGFpbmVycyhJVmlydHVhbENvbXBvbmVudCl9CisJICogQHBhcmFtIHByb2plY3QKKwkgKiBAcmV0dXJuCiAJICovCiAJcHVibGljIHN0YXRpYyBJUGFja2FnZUZyYWdtZW50Um9vdFtdIGdldFNvdXJjZUNvbnRhaW5lcnMoSVByb2plY3QgcHJvamVjdCkgewogCQlJSmF2YVByb2plY3QgalByb2plY3QgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KHByb2plY3QpOwpAQCAtODczLDk1ICs4MjUsNDcgQEAKIAkJCQl9CiAJCQl9CiAJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9CiAJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudFJvb3RbXSkgbGlzdC50b0FycmF5KG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFtsaXN0LnNpemUoKV0pOwogCX0KIAkKIAkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIElDb250YWluZXJzIGZvciBhbGwgSmF2YSBvdXRwdXQgZm9sZGVycyB0aGF0IGNvcnJlc3BvbmQgdG8gc3JjIGZvbGRlcnMgdGhhdCBhcmUgbWFwcGVkIHRvIHRoZQotCSAqIHZpcnR1YWwgY29tcG9uZW50IHRyZWUgdmlhIHRoZSBjb21wb25lbnQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmMKLQkgKiBAcmV0dXJuIGFycmF5IG9mIElDb250YWluZXJzIGZvciB0aGUgb3V0cHV0IGZvbGRlcnMKKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIEphdmFMaXRlVXRpbGl0aWVzI2dldEphdmFPdXRwdXRDb250YWluZXJzKElWaXJ0dWFsQ29tcG9uZW50KX0gCisJICogQHBhcmFtIHByb2plY3QKKwkgKiBAcmV0dXJuCiAJICovCiAJcHVibGljIHN0YXRpYyBJQ29udGFpbmVyW10gZ2V0T3V0cHV0Q29udGFpbmVycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKQotCQkJCXJldHVybiBuZXcgSUNvbnRhaW5lcltdIHt9OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gc291cmNlQ29udGFpbmVycyA9IGdldFNvdXJjZUNvbnRhaW5lcnMocHJvamVjdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlQ29udGFpbmVycy5sZW5ndGg7IGkrKykgewotCQkJSUNvbnRhaW5lciBvdXRwdXRGb2xkZXIgPSBnZXRPdXRwdXRDb250YWluZXIocHJvamVjdCwgc291cmNlQ29udGFpbmVyc1tpXSk7Ci0JCQlpZiAob3V0cHV0Rm9sZGVyICE9IG51bGwgJiYgIXJlc3VsdC5jb250YWlucyhvdXRwdXRGb2xkZXIpKQotCQkJCXJlc3VsdC5hZGQob3V0cHV0Rm9sZGVyKTsKLQkJfQotCQlyZXR1cm4gKElDb250YWluZXJbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElDb250YWluZXJbcmVzdWx0LnNpemUoKV0pOworCQlJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7CisJCUxpc3QgPElDb250YWluZXI+IGNvbnRhaW5lcnMgPSBKYXZhTGl0ZVV0aWxpdGllcy5nZXRKYXZhT3V0cHV0Q29udGFpbmVycyh2aXJ0dWFsQ29tcG9uZW50KTsKKwkJcmV0dXJuIGNvbnRhaW5lcnMudG9BcnJheShuZXcgSUNvbnRhaW5lcltjb250YWluZXJzLnNpemUoKV0pOwogCX0KIAorCS8qKgorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSmF2YUxpdGVVdGlsaXRpZXMjZ2V0SmF2YU91dHB1dENvbnRhaW5lcihJSmF2YVByb2plY3RMaXRlLCBJQ2xhc3NwYXRoRW50cnkpfSAKKwkgKiAKKwkgKiB7QGxpbmsgI2dldEphdmFPdXRwdXRDb250YWluZXIoSUphdmFQcm9qZWN0TGl0ZSwgSUNsYXNzcGF0aEVudHJ5KX0KKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqIEBwYXJhbSBzb3VyY2VDb250YWluZXIKKwkgKiBAcmV0dXJuCisJICovCiAJcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIGdldE91dHB1dENvbnRhaW5lcihJUHJvamVjdCBwcm9qZWN0LCBJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VDb250YWluZXIpIHsKIAkJdHJ5IHsKLQkJCUlKYXZhUHJvamVjdCBqUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCUlQYXRoIG91dHB1dFBhdGggPSBzb3VyY2VDb250YWluZXIuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKS5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJaWYgKG91dHB1dFBhdGggPT0gbnVsbCkgewotCQkJCWlmIChqUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpLnNlZ21lbnRDb3VudCgpID09IDEpCi0JCQkJCXJldHVybiBwcm9qZWN0OwotCQkJCXJldHVybiBwcm9qZWN0LmdldEZvbGRlcihqUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpOwotCQkJfQotCQkJcmV0dXJuIHByb2plY3QuZ2V0Rm9sZGVyKG91dHB1dFBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gSmF2YUxpdGVVdGlsaXRpZXMuZ2V0SmF2YU91dHB1dENvbnRhaW5lcihKYXZhQ29yZUxpdGUuY3JlYXRlKHByb2plY3QpLCBzb3VyY2VDb250YWluZXIuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKSk7CisJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7CisJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAKIAkvKioKLQkgKiBSZXRyaWV2ZSBhbGwgSmF2YSBvdXRwdXQgY29udGFpbmVycyBtYXBwZWQgaW50byB0aGUgdmlydHVhbCByZXNvdXJjZSB0cmVlIHZpYSB0aGUgY29tcG9uZW50IGZpbGUuIEluY2x1ZGVzIGJvdGggZGlyZWN0bHkKLQkgKiBtYXBwZWQgY2xhc3MgZm9sZGVycyBhbmQgdGhlIGNsYXNzIGZvbGRlcnMgYXNzb2NpYXRlZCB3aXRoIG1hcHBlZCBzb3VyY2UgZm9sZGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gdmMKLQkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBJUGFja2FnZUZyYWdtZW50Um9vdHMKKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIEphdmFMaXRlVXRpbGl0aWVzI2dldEphdmFPdXRwdXRDb250YWluZXJzKElWaXJ0dWFsQ29tcG9uZW50KX0KKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqIEByZXR1cm4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIElDb250YWluZXJbXSBnZXRBbGxPdXRwdXRDb250YWluZXJzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUphdmFQcm9qZWN0IGpQcm9qZWN0ID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJaWYgKGpQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDb250YWluZXJbMF07Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNvbnRhaW5lcltdIHNyY091dHB1dENvbnRhaW5lcnMgPSBnZXRPdXRwdXRDb250YWluZXJzKHByb2plY3QpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNyY091dHB1dENvbnRhaW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCWxpc3QuYWRkKHNyY091dHB1dENvbnRhaW5lcnNbaV0pOwotCQl9Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcm9vdHM7Ci0JCXRyeSB7Ci0JCQlyb290cyA9IGpQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJvb3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHJvb3RzW2ldLmdldEtpbmQoKSAhPSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX0JJTkFSWSkKLQkJCQkJY29udGludWU7Ci0JCQkJSVJlc291cmNlIHJlc291cmNlID0gcm9vdHNbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCQlpZiAobnVsbCAhPSByZXNvdXJjZSkgewotCQkJCQlJVmlydHVhbFJlc291cmNlW10gdlJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKHJlc291cmNlKTsKLQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgIWZvdW5kICYmIGogPCB2UmVzb3VyY2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAodlJlc291cmNlc1tqXS5nZXRDb21wb25lbnQoKS5lcXVhbHModmMpKSB7Ci0JCQkJCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQkJCQlJQ29udGFpbmVyIG91dHB1dENvbnRhaW5lciA9IChJQ29udGFpbmVyKSByZXNvdXJjZTsKLQkJCQkJCQkJaWYgKCFsaXN0LmNvbnRhaW5zKG91dHB1dENvbnRhaW5lcikpIHsKLQkJCQkJCQkJCWxpc3QuYWRkKG91dHB1dENvbnRhaW5lcik7Ci0JCQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIChJQ29udGFpbmVyW10pIGxpc3QudG9BcnJheShuZXcgSUNvbnRhaW5lcltsaXN0LnNpemUoKV0pOworCQlyZXR1cm4gZ2V0T3V0cHV0Q29udGFpbmVycyhwcm9qZWN0KTsKIAl9Ci0KIAkKIAkvKioKIAkgKiAKQEAgLTEwNDYsMzYgKzk1MCwxNSBAQAogCQogCS8qKgogCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHJldHVybiB0cnVlLCBpZiBqZWUgdmVyc2lvbiA1LjAgKG9yIHRoZWlyIHJlc3BlY3RpdmUgZWpiLCB3ZWIsIGFwcCB2ZXJzaW9ucykKKwkgKiBAcmV0dXJuIHRydWUsIGlmIGplZSB2ZXJzaW9uIDUuMCBvciBsYXRlciAob3IgdGhlaXIgcmVzcGVjdGl2ZSBlamIsIHdlYiwgYXBwIHZlcnNpb25zKQogCSAqICwgaXQgbXVzdCBiZSBub3RlZCB0aGF0IHRoaXMgbWV0aG9kIG9ubHkgbG9va3MgYXQgdGhlIGZhY2V0ICYgdGhlaXIgdmVyc2lvbnMgdG8gZGV0ZXJtaW5lIAogCSAqIHRoZSBqZWUgbGV2ZWwuIEl0IGRvZXMgbm90IHJlYWQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKRUVQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpewotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQkKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0OwotCQl0cnkgewotCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoZmFjZXRlZFByb2plY3QgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZihpc0VBUlByb2plY3QoZmFjZXRlZFByb2plY3QpKXsKLQkJCQlJUHJvamVjdEZhY2V0IGVhckZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9NT0RVTEUpOwotCQkJCXJldCA9IGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChlYXJGYWNldC5nZXRWZXJzaW9uKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQpKSk7Ci0JCQl9IGVsc2UgaWYoaXNEeW5hbWljV2ViUHJvamVjdChmYWNldGVkUHJvamVjdCkpewotCQkJCUlQcm9qZWN0RmFjZXQgd2ViRmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSk7Ci0JCQkJcmV0ID0gZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KHdlYkZhY2V0LmdldFZlcnNpb24oSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRKMkVFVmVyc2lvbklEVG9XZWJWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRCkpKSk7Ci0JCQl9IGVsc2UgaWYoaXNFSkJQcm9qZWN0KGZhY2V0ZWRQcm9qZWN0KSl7Ci0JCQkJSVByb2plY3RGYWNldCBlamJGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9FSkJfTU9EVUxFKTsKLQkJCQlyZXQgPSBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoZWpiRmFjZXQuZ2V0VmVyc2lvbihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhKMkVFVmVyc2lvblV0aWwuY29udmVydEoyRUVWZXJzaW9uSURUb0VKQlZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEKSkpKTsKLQkJCX0gZWxzZSBpZihpc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChmYWNldGVkUHJvamVjdCkpewotCQkJCUlQcm9qZWN0RmFjZXQgYXBwRmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSk7Ci0JCQkJcmV0ID0gZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGFwcEZhY2V0LmdldFZlcnNpb24oSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRCkpKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiByZXQ7CisJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOworCQlpZihjb21wb25lbnQgIT0gbnVsbCkKKwkJCSByZXR1cm4gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0pFRUNvbXBvbmVudChjb21wb25lbnQpOworCQlyZXR1cm4gZmFsc2U7CiAJfQogCQogCS8qKgpAQCAtMTA4Myw1NCArOTY2LDEzIEBACiAJICogQHJldHVybiB0cnVlLCBpZiBqMmVlIHZlcnNpb24gMS4yLCAxLjMsIDEuNCAob3IgdGhlaXIgcmVzcGVjdGl2ZSBlamIsIHdlYiwgYXBwIHZlcnNpb25zKQogCSAqICwgaXQgbXVzdCBiZSBub3RlZCB0aGF0IHRoaXMgbWV0aG9kIG9ubHkgbG9va3MgYXQgdGhlIGZhY2V0ICYgdGhlaXIgdmVyc2lvbnMgdG8gZGV0ZXJtaW5lIAogCSAqIHRoZSBqMmVlIGxldmVsLiBJdCBkb2VzIG5vdCByZWFkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisJICogQGRlcHJlY2F0ZWQgdXNlIEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNMZWdhY3lKMkVFQ29tcG9uZW50KGV0YykKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhY3lKMkVFUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KXsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJCi0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlpZihpc0VBUlByb2plY3QoZmFjZXRlZFByb2plY3QpKXsKLQkJCQlJUHJvamVjdEZhY2V0IGVhckZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9NT0RVTEUpOwotCQkJCXJldCA9IChmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoZWFyRmFjZXQuZ2V0VmVyc2lvbihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkpKQotCQkJCQkJfHwgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGVhckZhY2V0LmdldFZlcnNpb24oSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKSkKLQkJCQkJCXx8IGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChlYXJGYWNldC5nZXRWZXJzaW9uKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSkpCi0JCQkJCSk7Ci0JCQl9IGVsc2UgaWYoaXNEeW5hbWljV2ViUHJvamVjdChmYWNldGVkUHJvamVjdCkpewotCQkJCUlQcm9qZWN0RmFjZXQgd2ViRmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSk7Ci0JCQkJcmV0ID0gKGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldCh3ZWJGYWNldC5nZXRWZXJzaW9uKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0SjJFRVZlcnNpb25JRFRvV2ViVmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSkpKQotCQkJCQkJfHwgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KHdlYkZhY2V0LmdldFZlcnNpb24oSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRKMkVFVmVyc2lvbklEVG9XZWJWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKSkpCi0JCQkJCQl8fCBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQod2ViRmFjZXQuZ2V0VmVyc2lvbihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhKMkVFVmVyc2lvblV0aWwuY29udmVydEoyRUVWZXJzaW9uSURUb1dlYlZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCkpKSkKLQkJCQkJCSk7Ci0JCQl9IGVsc2UgaWYoaXNFSkJQcm9qZWN0KGZhY2V0ZWRQcm9qZWN0KSl7Ci0JCQkJSVByb2plY3RGYWNldCBlamJGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9FSkJfTU9EVUxFKTsKLQkJCQlyZXQgPSAoZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGVqYkZhY2V0LmdldFZlcnNpb24oSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRKMkVFVmVyc2lvbklEVG9FSkJWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpKSkpCi0JCQkJCQl8fCBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoZWpiRmFjZXQuZ2V0VmVyc2lvbihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhKMkVFVmVyc2lvblV0aWwuY29udmVydEoyRUVWZXJzaW9uSURUb0VKQlZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpKSkKLQkJCQkJCXx8IGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChlamJGYWNldC5nZXRWZXJzaW9uKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0SjJFRVZlcnNpb25JRFRvRUpCVmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSkpKQotCQkJCQkJKTsKLQkJCX0gZWxzZSBpZihpc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChmYWNldGVkUHJvamVjdCkpewotCQkJCUlQcm9qZWN0RmFjZXQgYXBwRmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSk7Ci0JCQkJcmV0ID0gKGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChhcHBGYWNldC5nZXRWZXJzaW9uKEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSkpCi0JCQkJCQl8fCBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoYXBwRmFjZXQuZ2V0VmVyc2lvbihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpKQotCQkJCQkJfHwgZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGFwcEZhY2V0LmdldFZlcnNpb24oSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpKSkKLQkJCQkJCSk7Ci0JCQl9IGVsc2UgaWYoaXNKQ0FQcm9qZWN0KGZhY2V0ZWRQcm9qZWN0KSl7Ci0JCQkJSVByb2plY3RGYWNldCBqY2FGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9DT05ORUNUT1JfTU9EVUxFKTsKLQkJCQlyZXQgPSAoZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KGpjYUZhY2V0LmdldFZlcnNpb24oSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRKMkVFVmVyc2lvbklEVG9Db25uZWN0b3JWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpKSkpCi0JCQkJCQl8fCBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoamNhRmFjZXQuZ2V0VmVyc2lvbihKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhKMkVFVmVyc2lvblV0aWwuY29udmVydEoyRUVWZXJzaW9uSURUb0Nvbm5lY3RvclZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpKSkKLQkJCQkJCSk7Ci0JCQl9IGVsc2UgaWYoaXNVdGlsaXR5UHJvamVjdChmYWNldGVkUHJvamVjdCkpewotCQkJCS8vIG5vdCBzdXJlIGlmIHRoZXJlIGlzIGEgYmV0dGVyIHdheQotCQkJCXJldCA9IHRydWU7Ci0JCQl9IAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKKwkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7CisJCWlmKGNvbXBvbmVudCAhPSBudWxsKQorCQkJcmV0dXJuIEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNMZWdhY3lKMkVFQ29tcG9uZW50KGNvbXBvbmVudCk7CisJCXJldHVybiBmYWxzZTsKIAl9CiAKIAkvKioKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvTWFuaWZlc3RGaWxlQ3JlYXRpb25BY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvTWFuaWZlc3RGaWxlQ3JlYXRpb25BY3Rpb24uamF2YQppbmRleCA3OGUyY2RkLi4xOGExZGM3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L01hbmlmZXN0RmlsZUNyZWF0aW9uQWN0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9NYW5pZmVzdEZpbGVDcmVhdGlvbkFjdGlvbi5qYXZhCkBAIC0xNyw2ICsxNywxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogCisvKioKKyAqIAorICogQGRlcHJlY2F0ZWQgLSBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS51dGlsLk1hbmlmZXN0VXRpbGl0aWVzCisgKi8KK0BEZXByZWNhdGVkCiBwdWJsaWMgY2xhc3MgTWFuaWZlc3RGaWxlQ3JlYXRpb25BY3Rpb24gewogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1RfSEVBREVSID0gIk1hbmlmZXN0LVZlcnNpb246IDEuMFxyXG5DbGFzcy1QYXRoOiBcclxuXHJcbiI7IC8vJE5PTi1OTFMtMSQKQEAgLTI0LDEwICsyOSwxNSBAQAogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBNYW5pZmVzdEZpbGVDcmVhdGlvbkFjdGlvbi4KIAkgKi8KKwlARGVwcmVjYXRlZAogCXB1YmxpYyBNYW5pZmVzdEZpbGVDcmVhdGlvbkFjdGlvbigpIHsKIAkJc3VwZXIoKTsKIAl9CiAKKwkvKioKKwkgKiAKKwkgKiBAZGVwcmVjYXRlZCAtIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLk1hbmlmZXN0VXRpbGl0aWVzLmNyZWF0ZU1hbmlmZXN0RmlsZShJRmlsZSBmaWxlKQorCSAqLwogCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVNYW5pZmVzdEZpbGUoSUZpbGUgZmlsZSwgSVByb2plY3QgYUoyRUVQcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQl0cnkgewogCQkJV29ya2JlbmNoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBXb3JrYmVuY2hCeXRlQXJyYXlPdXRwdXRTdHJlYW0oZmlsZSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L1Byb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L1Byb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEKaW5kZXggOTNhOTZjNS4uMzZjYjE5ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9Qcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvUHJvamVjdFN1cHBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YQpAQCAtNTYsNiArNTYsNyBAQAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hbWVzX2Nhbm5vdF9jb250YWluX3doaXRlc3BhY2VfOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydGluZ19hcmNoaXZlOwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydGluZ19hcmNoaXZlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyX1RoZV9Nb2R1bGVfc3BlY2lmaWNhdGlvbl9sZXZlbF9vZl87CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgRFlOQU1JQ19XRUJfRElTVElOQ1RfU1JDX1dFQkNPTlRFTlRfRVJST1I7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgRFlOQU1JQ19XRUJfUEVSRk9STUFOQ0VfVkFMSURBVElPTjsKIAlwdWJsaWMgc3RhdGljIFN0cmluZyBTT1VSQ0VfT1VQVVRfRk9MREVSX0RJRkZfQllDQVNFX09OTFk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wcm9qZWN0L1NpbmdsZVJvb3RTdGF0dXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvU2luZ2xlUm9vdFN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmFmNzNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvU2luZ2xlUm9vdFN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSVNpbmdsZVJvb3RTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgU2luZ2xlUm9vdFN0YXR1cyBleHRlbmRzIFN0YXR1cyBpbXBsZW1lbnRzIElTaW5nbGVSb290U3RhdHVzIHsKLQotCUNvbXBvbmVudFJlc291cmNlIHJlc291cmNlOwotCi0JcHVibGljIFNpbmdsZVJvb3RTdGF0dXMoaW50IHR5cGUsIGludCBjb2RlLCBDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJc3VwZXIodHlwZSwgSjJFRVBsdWdpbi5QTFVHSU5fSUQsIGNvZGUsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQl9Ci0JCi0JcHVibGljIFNpbmdsZVJvb3RTdGF0dXMoaW50IGNvZGUsIENvbXBvbmVudFJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbWVzc2FnZSkgewotCQl0aGlzKGdldFNldmVyaXR5KGNvZGUpLCBjb2RlLCByZXNvdXJjZSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBDb21wb25lbnRSZXNvdXJjZSBnZXRDb21wb25lbnRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgaW50IGdldFNldmVyaXR5KGludCBjb2RlKSB7Ci0JCXJldHVybiBjb2RlID09IDAgPyAwIDogMSA8PCAoY29kZSAvIDMzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3Byb2plY3QvV1RQSkVURW1pdHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9XVFBKRVRFbWl0dGVyLmphdmEKaW5kZXggNjAzNmYxMi4uM2YzNzU5OSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9XVFBKRVRFbWl0dGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcHJvamVjdC9XVFBKRVRFbWl0dGVyLmphdmEKQEAgLTY2LDcgKzY2LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpblJlc291cmNlSGFuZGxlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50OwpAQCAtMTEzLDcgKzExMyw3IEBACiAJCXRyeSB7CiAJCQlpbml0aWFsaXplKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwogCQl9IGNhdGNoIChKRVRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0KIAl9CiAKQEAgLTE0MSw2ICsxNDEsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uamV0LkpFVEVtaXR0ZXIjaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgSkVURXhjZXB0aW9uIHsKIAogCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKCIiLCAxMCk7IC8vJE5PTi1OTFMtMSQKQEAgLTQ0NCwxMSArNDQ1LDEzIEBACiAJCVVSTCBpbnN0YWxsTG9jYXRpb24gPSBudWxsOwogCQl0cnkgewogCQkJaW5zdGFsbExvY2F0aW9uID0gUGxhdGZvcm0uYXNMb2NhbFVSTChvdXRwdXREaXJlY3RvcnkpOworCQkJRmlsZSBvdXRwdXREaXJlY3RvcnlGaWxlID0gbmV3IEZpbGUoaW5zdGFsbExvY2F0aW9uLmdldFBhdGgoKSk7Ly8gbmV3IEZpbGUobG9jYXRpb24pOworCQkJcmV0dXJuIG91dHB1dERpcmVjdG9yeUZpbGUuY2FuUmVhZCgpICYmIG91dHB1dERpcmVjdG9yeUZpbGUuaXNEaXJlY3RvcnkoKSAmJiBvdXRwdXREaXJlY3RvcnlGaWxlLmxpc3RGaWxlcygpLmxlbmd0aCA+IDA7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKEoyRUVQbHVnaW5SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJJbnN0YWxsX0xvY2F0aW9uX0Vycm9yXyIsIG5ldyBPYmplY3RbXXtpbnN0YWxsTG9jYXRpb259KSArIGUpOyAvLyROT04tTkxTLTEkCisJCQlKMkVFUGx1Z2luLmxvZ1dhcm5pbmcoSjJFRVBsdWdpblJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkluc3RhbGxfTG9jYXRpb25fRXJyb3JfIiwgbmV3IE9iamVjdFtde2luc3RhbGxMb2NhdGlvbn0pICsgZSk7IC8vJE5PTi1OTFMtMSQKIAkJfQotCQlGaWxlIG91dHB1dERpcmVjdG9yeUZpbGUgPSBuZXcgRmlsZShpbnN0YWxsTG9jYXRpb24uZ2V0UGF0aCgpKTsvLyBuZXcgRmlsZShsb2NhdGlvbik7Ci0JCXJldHVybiBvdXRwdXREaXJlY3RvcnlGaWxlLmNhblJlYWQoKSAmJiBvdXRwdXREaXJlY3RvcnlGaWxlLmlzRGlyZWN0b3J5KCkgJiYgb3V0cHV0RGlyZWN0b3J5RmlsZS5saXN0RmlsZXMoKS5sZW5ndGggPiAwOworCQlyZXR1cm4gZmFsc2U7CisJCQogCX0KIAogCS8qKgpAQCAtNDYzLDEzICs0NjYsMTMgQEAKIAkJCVN0cmluZyByZXF1aXJlcyA9IChTdHJpbmcpIGJ1bmRsZS5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfQ0xBU1NQQVRIKTsKIAkJCWVsZW1lbnRzID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlSGVhZGVyKENvbnN0YW50cy5CVU5ETEVfQ0xBU1NQQVRILCByZXF1aXJlcyk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJZWxlbWVudHMgPSBuZXcgTWFuaWZlc3RFbGVtZW50WzBdOwogCQl9CiAJCUlQYXRoIHJ1bnRpbWVMaWJGdWxsUGF0aCA9IG51bGw7CiAJCVVSTCBmdWxsdXJsID0gbnVsbDsKIAkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWlmIChidW5kbGUuZ2V0TG9jYXRpb24oKS5lbmRzV2l0aCgiLmphciIpKQorCQkJaWYgKGJ1bmRsZS5nZXRMb2NhdGlvbigpLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQpKQogCQkJCXRyeSB7CiAJCQkJCXJ1bnRpbWVMaWJGdWxsUGF0aCA9IGdldEphcnJlZFBsdWdpblBhdGgoYnVuZGxlKTsKIAkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC00ODgsMTYgKzQ5MSwxNyBAQAogCQkJdHJ5IHsKIAkJCQlydW50aW1lTGliRnVsbFBhdGggPSBuZXcgUGF0aChQbGF0Zm9ybS5hc0xvY2FsVVJMKGZ1bGx1cmwpLmdldFBhdGgoKSk7CiAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJfQogCQkJLy9UT0RPIGhhbmRsZSBqYXInZWQgcGx1Z2lucywgdGhpcyBpcyBhIGhhY2sgZm9yIG5vdywgbmVlZCB0byBmaW5kIHByb3BlciBidW5kbGUgQVBJCi0JCQlpZiAoYnVuZGxlLmdldExvY2F0aW9uKCkuZW5kc1dpdGgoIi5qYXIiKSkKKwkJCWlmIChidW5kbGUuZ2V0TG9jYXRpb24oKS5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUKSkKIAkJCQl0cnkgewogCQkJCQlydW50aW1lTGliRnVsbFBhdGggPSBnZXRKYXJyZWRQbHVnaW5QYXRoKGJ1bmRsZSk7CiAJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCX0KLQkJCWlmICghImphciIuZXF1YWxzKHJ1bnRpbWVMaWJGdWxsUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkpICYmICEiemlwIi5lcXVhbHMocnVudGltZUxpYkZ1bGxQYXRoLmdldEZpbGVFeHRlbnNpb24oKSkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQorCQkJaWYgKHJ1bnRpbWVMaWJGdWxsUGF0aCAhPSBudWxsICYmICEiamFyIi5lcXVhbHMocnVudGltZUxpYkZ1bGxQYXRoLmdldEZpbGVFeHRlbnNpb24oKSkgJiYgISJ6aXAiLmVxdWFscyhydW50aW1lTGliRnVsbFBhdGguZ2V0RmlsZUV4dGVuc2lvbigpKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJY29udGludWU7CiAJCQlhcHBlbmRUb0NsYXNzUGF0aChydW50aW1lTGliRnVsbFBhdGgscHJvamVjdCk7CiAJCX0KQEAgLTUxMSw4ICs1MTUsOCBAQAogCQkJCWNsYXNzcGF0aEVudHJpZXMuYWRkKGVudHJ5KTsKIAkJCS8vSjJFRVByb2plY3RVdGlsaXRpZXMuYXBwZW5kSmF2YUNsYXNzUGF0aChwcm9qZWN0LCBlbnRyeSk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIlByb2JsZW0gYXBwZW5kaW5nIFwiIiArIGVudHJ5LmdldFBhdGgoKSArICJcIiB0byBjbGFzc3BhdGggb2YgUHJvamVjdCBcIiIgKyBwcm9qZWN0LmdldE5hbWUoKSArICJcIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoIlByb2JsZW0gYXBwZW5kaW5nIFwiIiArIGVudHJ5LmdldFBhdGgoKSArICJcIiB0byBjbGFzc3BhdGggb2YgUHJvamVjdCBcIiIgKyBwcm9qZWN0LmdldE5hbWUoKSArICJcIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0KIAl9CiAJCkBAIC01NTgsNiArNTYyLDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmpldC5KRVRFbWl0dGVyI2FkZFZhcmlhYmxlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgYWRkVmFyaWFibGUoU3RyaW5nIHZhcmlhYmxlTmFtZSwgU3RyaW5nIHBsdWdpbklEKSB0aHJvd3MgSkVURXhjZXB0aW9uIHsKIAkJaWYgKCFpc0ludGVsbGlnZW50TGlua2luZ0VuYWJsZWQoKSkKIAkJCXN1cGVyLmFkZFZhcmlhYmxlKHZhcmlhYmxlTmFtZSwgcGx1Z2luSUQpOwpAQCAtNjEzLDcgKzYxOCw3IEBACiAJCQkvL0oyRUVQcm9qZWN0VXRpbGl0aWVzLmFwcGVuZEphdmFDbGFzc1BhdGgocHJvamVjdCwgZW50cnkpOwogCiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9CiAJfQogCkBAIC02MzEsNyArNjM2LDcgQEAKIAkJCQlqZXRDb21waWxlciA9IHRlbXBsYXRlVVJJUGF0aCA9PSBudWxsID8gbmV3IE15SkVUQ29tcGlsZXIodGVtcGxhdGVVUkksIGVuY29kaW5nKSA6IG5ldyBNeUpFVENvbXBpbGVyKHRlbXBsYXRlVVJJUGF0aCwgdGVtcGxhdGVVUkksIGVuY29kaW5nKTsKIAkJCX0KIAkJfSBjYXRjaCAoSkVURXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCX0KIAkJcmV0dXJuIGpldENvbXBpbGVyOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3JlbmFtZS9DbGFzc3BhdGhSZW5hbWVJbmZvLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9yZW5hbWUvQ2xhc3NwYXRoUmVuYW1lSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTI3ODBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3JlbmFtZS9DbGFzc3BhdGhSZW5hbWVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVuYW1lOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLS8qKgotICogQSBzaW1wbGUgc3RydWN0dXJlIHRoYXQgcmVtZW1iZXJzIGZvciBhIGdpdmVuIHByb2plY3QsIHRoZSBtYW5pZmVzdCBlbnRyaWVzIHRvIGJlIGRlbGV0ZWQgYW5kIHRoZQotICogYnVpbGQgcGF0aCBlbnRyaWVzIHRvIGJlIGRlbGV0ZWQKLSAqLwotcHVibGljIGNsYXNzIENsYXNzcGF0aFJlbmFtZUluZm8gewotCS8qKgotCSAqIFRoZSBwcm9qZWN0IGZyb20gd2hpY2ggdGhlIGRlcGVuZGVuY2llcyB3aWxsIGJlIHJlbW92ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2plY3QgdGFyZ2V0UHJvamVjdDsKLQkvKioKLQkgKiBUaGUgbGl0ZXJhbCBtYW5pZmVzdCBlbnRyaWVzIHRvIGJlIHJlbW92ZWQ7IFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBMaXN0IG1hbmlmZXN0RW50cmllczsKLQkvKioKLQkgKiBUaGUgcHJvamVjdCByZWZlcmVuY2VzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYnVpbGQgcGF0aDsgSVByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCByZWZlcmVuY2VkUHJvamVjdHM7Ci0KLQlwdWJsaWMgQ2xhc3NwYXRoUmVuYW1lSW5mbyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRhcmdldFByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1hbmlmZXN0RW50cmllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TWFuaWZlc3RFbnRyaWVzKCkgewotCQlpZiAobWFuaWZlc3RFbnRyaWVzID09IG51bGwpCi0JCQltYW5pZmVzdEVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBtYW5pZmVzdEVudHJpZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWZlcmVuY2VkUHJvamVjdHMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlZmVyZW5jZWRQcm9qZWN0cygpIHsKLQkJaWYgKHJlZmVyZW5jZWRQcm9qZWN0cyA9PSBudWxsKQotCQkJcmVmZXJlbmNlZFByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gcmVmZXJlbmNlZFByb2plY3RzOwotCX0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFyZ2V0UHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBJUHJvamVjdAotCSAqLwotCXB1YmxpYyBJUHJvamVjdCBnZXRUYXJnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGFyZ2V0UHJvamVjdDsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3JlbmFtZS9SZW5hbWVPcHRpb25zLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9yZW5hbWUvUmVuYW1lT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDQxYTI0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3JlbmFtZS9SZW5hbWVPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZQotICogYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5yZW5hbWU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgUmVuYW1lT3B0aW9ucyB7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFQVJSZW5hbWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVuYW1lUHJvamVjdHM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmVuYW1lTW9kdWxlczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXM7Ci0JcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWRQcm9qZWN0czsKLQkvKiogQXBwbGljYWJsZSBmb3IgRUFSIHJlbmFtZSAqLwotCXByb3RlY3RlZCBMaXN0IHNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzOwotCXByb3RlY3RlZCBTdHJpbmcgbmV3TmFtZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBuZXdDb250ZXh0Um9vdCA9IG51bGw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYm9ndXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmVuYW1lT3B0aW9ucy4KLQkgKi8KLQlwdWJsaWMgUmVuYW1lT3B0aW9ucygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFJlbmFtZU1vZHVsZXMoKSB7Ci0JCXJldHVybiByZW5hbWVNb2R1bGVzOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0UmVuYW1lTW9kdWxlcyhib29sZWFuIHJlbmFtZU1vZHVsZXNGcm9tQWxsRUFScykgewotCQl0aGlzLnJlbmFtZU1vZHVsZXMgPSByZW5hbWVNb2R1bGVzRnJvbUFsbEVBUnM7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZW5hbWVQcm9qZWN0cygpIHsKLQkJcmV0dXJuIHJlbmFtZVByb2plY3RzOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0UmVuYW1lUHJvamVjdHMoYm9vbGVhbiByZW5hbWVQcm9qZWN0cykgewotCQl0aGlzLnJlbmFtZVByb2plY3RzID0gcmVuYW1lUHJvamVjdHM7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMoKSB7Ci0JCXJldHVybiByZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXM7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRSZW5hbWVNb2R1bGVEZXBlbmRlbmNpZXMoYm9vbGVhbiByZW5hbWVSZWZlcmVuY2VzRnJvbU1vZHVsZURlcGVuZGVuY2llcykgewotCQl0aGlzLnJlbmFtZU1vZHVsZURlcGVuZGVuY2llcyA9IHJlbmFtZVJlZmVyZW5jZXNGcm9tTW9kdWxlRGVwZW5kZW5jaWVzOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE1vZHVsZUFuZFV0aWxpdHlQcm9qZWN0cygpIHsKLQkJaWYgKGlzRUFSUmVuYW1lKQotCQkJcmV0dXJuIGdldFNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzKCk7Ci0JCXJldHVybiBnZXRTZWxlY3RlZFByb2plY3RzKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWxsUHJvamVjdHNUb1JlbmFtZSgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoZ2V0U2VsZWN0ZWRQcm9qZWN0cygpKTsKLQkJcmVzdWx0LmFkZEFsbChnZXRTZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzZWxlY3RlZFByb2plY3RzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZFByb2plY3RzKCkgewotCQlpZiAoc2VsZWN0ZWRQcm9qZWN0cyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCXJldHVybiBzZWxlY3RlZFByb2plY3RzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGVkUHJvamVjdHMuCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGVkUHJvamVjdHMKLQkgKiAgICAgICAgICAgIFRoZSBzZWxlY3RlZFByb2plY3RzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkUHJvamVjdHMoTGlzdCBzZWxlY3RlZFByb2plY3RzKSB7Ci0JCXRoaXMuc2VsZWN0ZWRQcm9qZWN0cyA9IHNlbGVjdGVkUHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzKCkgewotCQlpZiAoc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlyZXR1cm4gc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMuCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzCi0JICogICAgICAgICAgICBUaGUgc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHMoTGlzdCBzZWxlY3RlZFJlZmVyZW5jZWRQcm9qZWN0cykgewotCQl0aGlzLnNlbGVjdGVkUmVmZXJlbmNlZFByb2plY3RzID0gc2VsZWN0ZWRSZWZlcmVuY2VkUHJvamVjdHM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFQVJSZW5hbWUoKSB7Ci0JCXJldHVybiBpc0VBUlJlbmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc0VBUlJlbmFtZShib29sZWFuIGlzRUFSUmVuYW1lKSB7Ci0JCXRoaXMuaXNFQVJSZW5hbWUgPSBpc0VBUlJlbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXdOYW1lLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmV3TmFtZSgpIHsKLQkJcmV0dXJuIG5ld05hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmV3TmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5ld05hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5ld0NvbnRleHRSb290LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmV3Q29udGV4dFJvb3QoKSB7Ci0JCXJldHVybiBuZXdDb250ZXh0Um9vdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuZXdDb250ZXh0Um9vdC4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q29udGV4dFJvb3QKLQkgKiAgICAgICAgICAgIFRoZSBuZXdDb250ZXh0Um9vdCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXdDb250ZXh0Um9vdChTdHJpbmcgbmV3Q29udGV4dFJvb3QpIHsKLQkJdGhpcy5uZXdDb250ZXh0Um9vdCA9IG5ld0NvbnRleHRSb290OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9zZXJ2ZXJ0YXJnZXQvSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvc2VydmVydGFyZ2V0L0oyRUVQcm9qZWN0U2VydmVyVGFyZ2V0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCAxYTU4MDI5Li40NTRjNzU2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9zZXJ2ZXJ0YXJnZXQvSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3NlcnZlcnRhcmdldC9KMkVFUHJvamVjdFNlcnZlclRhcmdldERhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTM1LDE1ICszNSwxOCBAQAogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEFSR0VUX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5ydW50aW1lVHlwZSI7IC8vJE5PTi1OTFMtMSQKIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGluaXQoKSB7CiAJCW1vZGVsLnNldFByb3BlcnR5KFJVTlRJTUVfVEFSR0VUX0lELCBnZXREZWZhdWx0U2VydmVyVGFyZ2V0SUQoKSk7CiAJCXN1cGVyLmluaXQoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewogCQlyZXR1cm4gbmV3IEoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0T3AobW9kZWwpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKIAkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CiAJCXByb3BlcnR5TmFtZXMuYWRkKFBST0pFQ1RfTkFNRSk7CkBAIC03MSw2ICs3NCw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLldUUE9wZXJhdGlvbkRhdGFNb2RlbCNnZXREZWZhdWx0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFJVTlRJTUVfVEFSR0VUX0lEKSkKIAkJCXJldHVybiBnZXREZWZhdWx0U2VydmVyVGFyZ2V0SUQoKTsKQEAgLTE4Myw2ICsxODcsNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5XVFBPcGVyYXRpb25EYXRhTW9kZWwjZG9HZXRWYWxpZFByb3BlcnR5VmFsdWVzKGphdmEubGFuZy5TdHJpbmcpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFJVTlRJTUVfVEFSR0VUX0lEKSkKIAkJCXJldHVybiBnZXRWYWxpZFNlcnZlclRhcmdldERlc2NyaXB0b3JzKCk7CkBAIC0yMDUsNiArMjEwLDcgQEAKIAkJcmV0dXJuIGRlc2NyaXB0b3JzOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7CiAJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEoyRUVfVkVSU0lPTl9JRCkpIHsKIAkJCUlSdW50aW1lIHRhcmdldCA9IGdldFNlcnZlclRhcmdldEJ5SUQoZ2V0U3RyaW5nUHJvcGVydHkoUlVOVElNRV9UQVJHRVRfSUQpKTsKQEAgLTI3Myw2ICsyNzksNyBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5XVFBPcGVyYXRpb25EYXRhTW9kZWwjZG9WYWxpZGF0ZVByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhSVU5USU1FX1RBUkdFVF9JRCkpCiAJCQlyZXR1cm4gdmFsaWRhdGVTZXJ2ZXJUYXJnZXQoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3NlcnZlcnRhcmdldC9KMkVFUHJvamVjdFNlcnZlclRhcmdldE9wLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9zZXJ2ZXJ0YXJnZXQvSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXRPcC5qYXZhCmluZGV4IDIxNTA2MzkuLmM2MWJkODMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3NlcnZlcnRhcmdldC9KMkVFUHJvamVjdFNlcnZlclRhcmdldE9wLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvc2VydmVydGFyZ2V0L0oyRUVQcm9qZWN0U2VydmVyVGFyZ2V0T3AuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0RGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247CkBAIC0zMSw5ICszMiw5IEBACiAgICAgICovCiAgICAgcHVibGljIEoyRUVQcm9qZWN0U2VydmVyVGFyZ2V0T3AoSURhdGFNb2RlbCBtb2RlbCkgewogICAgICAgICBzdXBlcihtb2RlbCk7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgogICAgIH0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgc2VydmVyVGFyZ2V0SWQgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRVByb2plY3RTZXJ2ZXJUYXJnZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlJVTlRJTUVfVEFSR0VUX0lEKTsKIAkJSVJ1bnRpbWUgcnVudGltZSA9IFJlc291cmNlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFJ1bnRpbWUoc2VydmVyVGFyZ2V0SWQpOwpAQCAtNTAsMjAgKzUxLDE5IEBACiAJCQkJCS8vU2VydmVyVGFyZ2V0SGVscGVyLnNldE5ld1NlcnZlclRhcmdldEZvckVBUlV0aWxpdHlKYXJzKHJ1bnRpbWUsIHByb2plY3QpOwogCQkJCX0KIAkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQl9CiAJCX0KIAkJcmV0dXJuIE9LX1NUQVRVUzsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyByZWRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3NlcnZlcnRhcmdldC9TZXJ2ZXJUYXJnZXRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3NlcnZlcnRhcmdldC9TZXJ2ZXJUYXJnZXRIZWxwZXIuamF2YQppbmRleCA4NzlhNzM1Li5kODY2Y2FjIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9zZXJ2ZXJ0YXJnZXQvU2VydmVyVGFyZ2V0SGVscGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvc2VydmVydGFyZ2V0L1NlcnZlclRhcmdldEhlbHBlci5qYXZhCkBAIC0yNiw4ICsyNiw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKQEAgLTUyLDcgKzUyLDYgQEAKIAkgKi8KIAlwdWJsaWMgU2VydmVyVGFyZ2V0SGVscGVyKCkgewogCQlzdXBlcigpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKIAl9CiAKIAlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYW5VcE5vblNlcnZlclRhcmdldENsYXNzcGF0aChJUHJvamVjdCBwcm9qZWN0KSB7CkBAIC02OCw3ICs2Nyw3IEBACiAJCXRyeSB7CiAJCQlKZW1Qcm9qZWN0VXRpbGl0aWVzLnJlbW92ZUZyb21KYXZhQ2xhc3NQYXRoKHByb2plY3QsIGV4aXN0aW5nQ2xhc3NwYXRoRW50cmllcyk7CiAJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihqbWUpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihqbWUpOwogCQl9CiAJfQogCkBAIC0xODQsNyArMTgzLDcgQEAKIAkvLyBpbmZvLmdldEphdmFQcm9qZWN0KCkuc2V0UmF3Q2xhc3NwYXRoKGluZm8uZ2V0Q2xhc3NwYXRoRW50cmllcygpLCBudWxsKTsKIAkvLyB9CiAJLy8gfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCS8vIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihqbWUpOworCS8vIEoyRUVQbHVnaW4ubG9nRXJyb3Ioam1lKTsKIAkvLyB9CiAJLy8gfQogCS8vIHB1YmxpYyBzdGF0aWMgSjJFRUphdmFQcm9qZWN0SW5mbyBnZXROZXdKMkVFUHJvamVjdEluZm8oSVByb2plY3QgcHJvamVjdCwKQEAgLTMwNSw3ICszMDQsNyBAQAogLy8JCXRyeSB7CiAvLwkJCVNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdCkuc2V0UnVudGltZVRhcmdldChydW50aW1lLCBtb25pdG9yKTsKIC8vCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0vLwkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihjZSk7CisvLwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoY2UpOwogLy8JCX0KIC8vCX0KIApAQCAtMzY2LDcgKzM2NSw3IEBACiAJCXRyeSB7CiAJCQlyZXR1cm4gcHJvamVjdC5oYXNOYXR1cmUoSkFWQV9OQVRVUkVfSUQpOwogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nVHJhY2UoY2UpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihjZSk7CiAJCX0KIAkJcmV0dXJuIGZhbHNlOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvRUpCVXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L0VKQlV0aWxpdGllcy5qYXZhCmluZGV4IGM3NDBjOWYuLmY2NTUyNDggMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvRUpCVXRpbGl0aWVzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9FSkJVdGlsaXRpZXMuamF2YQpAQCAtMTAsNzkgKzEwLDExNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3Q7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNyZWF0aW9uQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLkFyY2hpdmVNb2RlbExvYWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwogCiBwdWJsaWMgY2xhc3MgRUpCVXRpbGl0aWVzIGV4dGVuZHMgSmF2YUVFUHJvamVjdFV0aWxpdGllcyB7CiAKIAlwdWJsaWMgRUpCVXRpbGl0aWVzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKIAl9CiAKIAlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGdldEVKQkNsaWVudEphcihJVmlydHVhbENvbXBvbmVudCBlamJDb21wb25lbnQpewogCQlpZighZWpiQ29tcG9uZW50LmlzQmluYXJ5KCkpewogCQkJcmV0dXJuIGdldEVKQkNsaWVudEphcihlamJDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJfSBlbHNlIHsKLQkJCWlmKGVqYkNvbXBvbmVudC5pc0JpbmFyeSgpKXsKLQkJCQlKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIgaGVscGVyID0gbnVsbDsgCi0JCQkJdHJ5ewotCQkJCQloZWxwZXIgPSBuZXcgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyKGVqYkNvbXBvbmVudCk7Ci0JCQkJCUlBcmNoaXZlIGFyY2hpdmUgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJYXJjaGl2ZSA9IGhlbHBlci5hY2Nlc3NBcmNoaXZlKCk7Ci0JCQkJCQlJUGF0aCBkZFBhdGggPSBuZXcgUGF0aCgiTUVUQS1JTkYvZWpiLWphci54bWwiKTsKLQkJCQkJCWlmKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoZGRQYXRoKSl7Ci0JCQkJCQkJT2JqZWN0IGphciA9IGFyY2hpdmUuZ2V0TW9kZWxPYmplY3QoZGRQYXRoKTsKLQkJCQkJCQlTdHJpbmcgY2xpZW50SkFSID0gbnVsbDsKLQkJCQkJCQlpZiAoamFyICE9IG51bGwpCisJCX0gCisJCWlmKGVqYkNvbXBvbmVudC5pc0JpbmFyeSgpKXsKKwkJCUphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlciBoZWxwZXIgPSBudWxsOyAKKwkJCXRyeXsKKwkJCQloZWxwZXIgPSBuZXcgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyKGVqYkNvbXBvbmVudCk7CisJCQkJSUFyY2hpdmUgYXJjaGl2ZSA9IG51bGw7CisJCQkJdHJ5IHsKKwkJCQkJYXJjaGl2ZSA9IGhlbHBlci5hY2Nlc3NBcmNoaXZlKCk7CisJCQkJCUlQYXRoIGRkUGF0aCA9IG5ldyBQYXRoKCJNRVRBLUlORi9lamItamFyLnhtbCIpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmKGFyY2hpdmUuY29udGFpbnNBcmNoaXZlUmVzb3VyY2UoZGRQYXRoKSl7CisJCQkJCQlPYmplY3QgamFyID0gYXJjaGl2ZS5nZXRNb2RlbE9iamVjdChkZFBhdGgpOworCQkJCQkJU3RyaW5nIGNsaWVudEpBUiA9IG51bGw7CisJCQkJCQlpZiAoamFyICE9IG51bGwpCisJCQkJCQl7CisJCQkJCQkJaWYgKGphciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIpCiAJCQkJCQkJewotCQkJCQkJCQlpZiAoamFyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcikKLQkJCQkJCQkJewotCQkJCQkJCQkJY2xpZW50SkFSID0gKChvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyKWphcikuZ2V0RWpiQ2xpZW50SmFyKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAoamFyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQljbGllbnRKQVIgPSAoKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcilqYXIpLmdldEVqYkNsaWVudEphcigpOwotCQkJCQkJCQl9CisJCQkJCQkJCWNsaWVudEpBUiA9ICgob3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcilqYXIpLmdldEVqYkNsaWVudEphcigpOwogCQkJCQkJCX0KLQkJCQkJCQlpZiAoY2xpZW50SkFSICE9IG51bGwpIHsKLQkJCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWpiQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJaWYgKHJlZnNbaV0uZ2V0QXJjaGl2ZU5hbWUoKS5lcXVhbHMoY2xpZW50SkFSKSkgewotCQkJCQkJCQkJCXJldHVybiByZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYgKGphciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcikKKwkJCQkJCQl7CisJCQkJCQkJCWNsaWVudEpBUiA9ICgob3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyKWphcikuZ2V0RWpiQ2xpZW50SmFyKCk7CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQl9IGNhdGNoIChBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYoYXJjaGl2ZSAhPSBudWxsKXsKLQkJCQkJCQloZWxwZXIucmVsZWFzZUFyY2hpdmUoYXJjaGl2ZSk7CisJCQkJCQlpZiAoY2xpZW50SkFSICE9IG51bGwpIHsKKwkJCQkJCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlamJDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKKwkJCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOworCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgeworCQkJCQkJCQlpZiAocmVmc1tpXS5nZXRBcmNoaXZlTmFtZSgpLmVxdWFscyhjbGllbnRKQVIpKSB7CisJCQkJCQkJCQlyZXR1cm4gcmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CiAJCQkJCQl9CiAJCQkJCX0KKwkJCQl9IGNhdGNoIChBcmNoaXZlTW9kZWxMb2FkRXhjZXB0aW9uIGUpIHsKKwkJCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJfSBmaW5hbGx5IHsKLQkJCQkJaWYoaGVscGVyICE9IG51bGwpewotCQkJCQkJaGVscGVyLmRpc3Bvc2UoKTsKKwkJCQkJaWYoYXJjaGl2ZSAhPSBudWxsKXsKKwkJCQkJCWhlbHBlci5yZWxlYXNlQXJjaGl2ZShhcmNoaXZlKTsKIAkJCQkJfQogCQkJCX0KLQkJCX0gCi0JCX0KKwkJCX0gZmluYWxseSB7CisJCQkJaWYoaGVscGVyICE9IG51bGwpeworCQkJCQloZWxwZXIuZGlzcG9zZSgpOworCQkJCX0KKwkJCX0KKwkJfSAKIAkJcmV0dXJuIG51bGw7CiAJfQogCQorCS8qKgorCSAqIFJldHVybiBhbGwgRUpCIENsaWVudCBwcm9qZWN0cyBpbiB3b3Jrc3BhY2UgLSBmb3VuZCBieSBjb2xsZWN0aW5nIGFsbCBFSkIgcHJvamVjdHMsIGFuZCBhc2tpbmcgZm9yIGFueSBjbGllbnQKKwkgKiAKKwkgKiBAcGFyYW0gdHlwZSAtCisJICogICAgICAgICAgICB1c2Ugb25lIG9mIHRoZSBzdGF0aWMgc3RyaW5ncyBvbiB0aGlzIGNsYXNzIGFzIGEgdHlwZQorCSAqIEByZXR1cm4gSVByb2plY3RbXQorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxFSkJDbGllbnRQcm9qZWN0c0luV29ya3NwYWNlKCkgeworCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOworCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJLy8gRmlyc3QgY29sbGVjdCBhbGwgRUpCIFByb2plY3RzCisJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChpc1Byb2plY3RPZlR5cGUocHJvamVjdHNbaV0sIElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUpKQorCQkJCXJlc3VsdC5hZGQocHJvamVjdHNbaV0pOworCQl9CisJCUxpc3QgY2xpZW50UmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKKwkJCUlQcm9qZWN0IGVqYlByb2ogPSAoSVByb2plY3QpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCUlWaXJ0dWFsQ29tcG9uZW50IGVqYkNvbXBvbmVudCA9IG51bGw7CisJCQllamJDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlamJQcm9qKTsKKwkJCWlmIChlamJDb21wb25lbnQgPT0gbnVsbCkKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCVByb3BlcnRpZXMgcHJvcHMgPSBlamJDb21wb25lbnQuZ2V0TWV0YVByb3BlcnRpZXMoKTsKKwkJCVN0cmluZyBjbGllbnRQcm9qTmFtZSA9IHByb3BzLmdldFByb3BlcnR5KCJDbGllbnRQcm9qZWN0Iik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmKGNsaWVudFByb2pOYW1lICE9IG51bGwpeworCQkJCUlQcm9qZWN0IGNsaWVudFByb2ogPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGNsaWVudFByb2pOYW1lKTsKKwkJCQlpZiAoY2xpZW50UHJvaiAhPSBudWxsKQorCQkJCQljbGllbnRSZXN1bHQuYWRkKGNsaWVudFByb2opOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gY2xpZW50UmVzdWx0OworCX0KKwkKIAkKIAkvKioKIAkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgSVZpcnR1YWxDb21wb25lbnQgb2YgdGhlIEVKQkNsaWVudEphciBmb3IgYSBnaXZlbiBFSkIgcHJvamVjdApAQCAtOTksOCArMTM3LDIzIEBACiAJCVN0cmluZyBjbGllbnRDb21wTmFtZSA9IHByb3BzLmdldFByb3BlcnR5KENyZWF0aW9uQ29uc3RhbnRzLkVKQl9DTElFTlRfTkFNRSk7CiAJCWlmIChjbGllbnRDb21wTmFtZSAhPSBudWxsICYmICFjbGllbnRDb21wTmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCUlWaXJ0dWFsUmVmZXJlbmNlIHZSZWYgPSBlamJDb21wb25lbnQuZ2V0UmVmZXJlbmNlKGNsaWVudENvbXBOYW1lKTsKKwkJCQorCQkJaWYgKHZSZWYgPT0gbnVsbCkKKwkJCXsKKwkJCQkvLyBjaGVjayB0aGUgRUFSIHByb2plY3QocykKKworCQkJCUlQcm9qZWN0W10gZWFyUHJvamVjdHNMaXN0ID0gRWFyVXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMoZWpiUHJvamVjdCk7CisJCQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gbnVsbDsKKwkJCQlmb3IgKGludCBjbnQgPSAwOyBjbnQgPCBlYXJQcm9qZWN0c0xpc3QubGVuZ3RoICYmIHZSZWYgPT0gbnVsbDsgY250KyspCisJCQkJeworCQkJCQllYXJDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJQcm9qZWN0c0xpc3RbY250XSk7CisJCQkJCXZSZWYgPSBFYXJVdGlsaXRpZXMuZ2V0Q29tcG9uZW50UmVmZXJlbmNlKGVhckNvbXBvbmVudCwgY2xpZW50Q29tcE5hbWUpOworCQkJCX0KKwkJCX0KIAkJCWlmICh2UmVmICE9IG51bGwpCisJCQl7CiAJCQkJZWpiQ2xpZW50Q29tcG9uZW50ID0gdlJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CisJCQl9CiAJCX0gZWxzZSB7CiAJCQlTdHJpbmcgY2xpZW50SkFSID0gbnVsbDsKIAkJCWlmIChqYXIgIT0gbnVsbCkKQEAgLTEzOCw4ICsxOTEsMTYgQEAKIAogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNFSkJDbGllbnRKQVJQcm9qZWN0KElQcm9qZWN0IGVqYlByb2plY3QpIHsKIAorCQlpZiAoZWpiUHJvamVjdCA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAJCWlmIChnZXRFSkJDbGllbnRKYXIoZWpiUHJvamVjdCkgIT0gbnVsbCkKIAkJCXJldHVybiB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CiAJfQorCisJcHVibGljIHN0YXRpYyBib29sZWFuIGlzRUpCQ2xpZW50UHJvamVjdChJUHJvamVjdCBjb21wUHJvamVjdCkgeworCQlpZiAoY29tcFByb2plY3QgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCQlpZiAoZ2V0QWxsRUpCQ2xpZW50UHJvamVjdHNJbldvcmtzcGFjZSgpLmNvbnRhaW5zKGNvbXBQcm9qZWN0KSkKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9FYXJVdGlsaXRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvRWFyVXRpbGl0aWVzLmphdmEKaW5kZXggNjdhNmNiOC4uYjE0ZDJjMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9FYXJVdGlsaXRpZXMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L0VhclV0aWxpdGllcy5qYXZhCkBAIC0xMywxNyArMTMsMjYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVWZXJzaW9uVXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSUoyRUVNb2R1bGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSUVBUk1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcHBsaWNhdGlvbi5JQ29tbW9uQXBwbGljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlJlZmVyZW5jZWRDb21wb25lbnQ7CkBAIC0zNywyNSArNDYsMzkgQEAKIHB1YmxpYyBjbGFzcyBFYXJVdGlsaXRpZXMgZXh0ZW5kcyBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzIHsKIAogCXB1YmxpYyBFYXJVdGlsaXRpZXMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgogCX0KIAogCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBhbiBJVmlydHVhbENvbXBvbmVudCBmb3IgdGhlIGdpdmVuIG1vZHVsZSBuYW1lLiBUaGUgbWV0aG9kIHRha2UKLQkgKiBlaXRoZXIgbW9kdWxlTmFtZSBvciBtb2R1bGVOYW1lICsgIi5tb2R1bGVfZXh0ZW5zaW9uIiAobW9kdWxlX2V4dGVuc2lvbiA9ICIuamFyIiB8fCAiLndhciIgfHwKLQkgKiAiLnJhciIpIHdoaWNoIGFsbG93cyB1c2VycyB0byBnZXQgYSBJVmlydHVhbENvbXBvbmVudCBmb3IgYSBnaXZlbiBlbnRyeSBpbiBhbiBhcHBsaWNhdGlvbi54bWwKKwkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgYW4ge0BsaW5rIElWaXJ0dWFsQ29tcG9uZW50fSBmb3IgdGhlIGdpdmVuCisJICogbW9kdWxlIG5hbWUuIFRoZSBtZXRob2QgdGFrZSBlaXRoZXIgbW9kdWxlTmFtZSBvciBtb2R1bGVOYW1lICsKKwkgKiAiLm1vZHVsZV9leHRlbnNpb24iIChtb2R1bGVfZXh0ZW5zaW9uID0gIi5qYXIiIHx8ICIud2FyIiB8fCAiLnJhciIpIHdoaWNoCisJICogYWxsb3dzIHVzZXJzIHRvIGdldCBhIElWaXJ0dWFsQ29tcG9uZW50IGZvciBhIGdpdmVuIGVudHJ5IGluIGFuCisJICogYXBwbGljYXRpb24ueG1sCiAJICogCi0JICogQHJldHVybiAtIGEgSVZpcnR1YWxDb21wb25lbnQgZm9yIG1vZHVsZSBuYW1lCisJICogQHBhcmFtIGVhckNvbXBvbmVudAorCSAqICAgICAgICAgICAgVGhlIEVBUidzIHtAbGluayBJVmlydHVhbENvbXBvbmVudH0uIFBhc3NpbmcgaW4KKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgcmVzdWx0IHdpdGggPGNvZGU+bnVsbDwvY29kZT4gYmVpbmcKKwkgKiAgICAgICAgICAgIHJldHVybmVkLgorCSAqIAorCSAqIEBwYXJhbSBtb2R1bGVOYW1lCisJICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGxvb2sgZm9yLiBQYXNzaW5nIGluCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIHJlc3VsdCB3aXRoIDxjb2RlPm51bGw8L2NvZGU+IGJlaW5nCisJICogICAgICAgICAgICByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcmV0dXJuIGFuIHtAbGluayBJVmlydHVhbENvbXBvbmVudH0gZm9yIG1vZHVsZSBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+CisJICogICAgICAgICBpZiBub25lIGV4aXN0cy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIElWaXJ0dWFsQ29tcG9uZW50IGdldE1vZHVsZShJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQsIFN0cmluZyBtb2R1bGVOYW1lKSB7Ci0JCWlmIChtb2R1bGVOYW1lID09IG51bGwpCisJcHVibGljIHN0YXRpYyBJVmlydHVhbENvbXBvbmVudCBnZXRNb2R1bGUoZmluYWwgSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBmaW5hbCBTdHJpbmcgbW9kdWxlTmFtZSkgeworCQlpZiAoZWFyQ29tcG9uZW50ID09IG51bGwgfHwgbW9kdWxlTmFtZSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG1vZHVsZU5hbWUuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVCkgfHwgbW9kdWxlTmFtZS5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUKSB8fCBtb2R1bGVOYW1lLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLlJBUl9FWFQpKQotCQkJbW9kdWxlTmFtZSA9IG1vZHVsZU5hbWUuc3Vic3RyaW5nKDAsIChtb2R1bGVOYW1lLmxlbmd0aCgpIC0gSUoyRUVNb2R1bGVDb25zdGFudHMuSkFSX0VYVC5sZW5ndGgoKSkpOworCQl9CisJCVN0cmluZyBpbm5lck1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lOworCQlpZiAoaW5uZXJNb2R1bGVOYW1lLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQpIHx8IGlubmVyTW9kdWxlTmFtZS5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUKSB8fCBpbm5lck1vZHVsZU5hbWUuZW5kc1dpdGgoSUoyRUVNb2R1bGVDb25zdGFudHMuUkFSX0VYVCkpCisJCQlpbm5lck1vZHVsZU5hbWUgPSBpbm5lck1vZHVsZU5hbWUuc3Vic3RyaW5nKDAsIChpbm5lck1vZHVsZU5hbWUubGVuZ3RoKCkgLSBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhULmxlbmd0aCgpKSk7CiAJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IGdldENvbXBvbmVudFJlZmVyZW5jZXMoZWFyQ29tcG9uZW50KTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7CiAJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSByZWZlcmVuY2VzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCWlmIChjb21wb25lbnQuZ2V0TmFtZSgpLmVxdWFscyhtb2R1bGVOYW1lKSkgeworCQkJaWYgKGNvbXBvbmVudC5nZXROYW1lKCkuZXF1YWxzKGlubmVyTW9kdWxlTmFtZSkpIHsKIAkJCQlyZXR1cm4gY29tcG9uZW50OwogCQkJfQogCQl9CkBAIC02MywzNiArODYsNzcgQEAKIAl9CiAKIAkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbGlzdCBvZiBJVmlydHVhbFJlZmVyZW5jZXMgZm9yIHRoZSBKMkVFIG1vZHVsZSBjb21wb25lbnRzCi0JICogY29udGFpbmVkIGluIHRoaXMgRUFSIGFwcGxpY2F0aW9uLgorCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIG9mIHtAbGluayBJVmlydHVhbFJlZmVyZW5jZX0gZm9yIHRoZSBKMkVFCisJICogbW9kdWxlIGNvbXBvbmVudHMgY29udGFpbmVkIGluIHRoaXMgRUFSIGFwcGxpY2F0aW9uLgogCSAqIAotCSAqIEByZXR1cm4gLSBhbiBhcnJheSBvZiBJVmlydHVhbFJlZmVyZW5jZXMgZm9yIEoyRUUgbW9kdWxlcyBpbiB0aGUgRUFSCisJICogQHBhcmFtIGVhckNvbXBvbmVudAorCSAqICAgICAgICAgICAgVGhlIEVBUidzIHtAbGluayBJVmlydHVhbENvbXBvbmVudH0uIFBhc3NpbmcgaW4KKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgcmVzdWx0IHdpdGggYSB6ZXJvIGxlbmd0aAorCSAqICAgICAgICAgICAge0BsaW5rIElWaXJ0dWFsUmVmZXJlbmNlfSBhcnJheSBiZWluZyByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHtAbGluayBJVmlydHVhbFJlZmVyZW5jZX0gZm9yIEoyRUUgbW9kdWxlcyBpbiB0aGUKKwkgKiAgICAgICAgIEVBUi4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0SjJFRU1vZHVsZVJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50KSB7CisJCWlmIChlYXJDb21wb25lbnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIE5PX1JFRkVSRU5DRVM7CisJCX0KIAkJTGlzdCBqMmVlVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCWoyZWVUeXBlcy5hZGQoSUoyRUVGYWNldENvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlQpOwogCQlqMmVlVHlwZXMuYWRkKElKMkVFRmFjZXRDb25zdGFudHMuSkNBKTsKIAkJajJlZVR5cGVzLmFkZChJSjJFRUZhY2V0Q29uc3RhbnRzLkVKQik7CiAJCWoyZWVUeXBlcy5hZGQoSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQik7Ci0JCXJldHVybiBnZXRDb21wb25lbnRSZWZlcmVuY2VzKGVhckNvbXBvbmVudCwgajJlZVR5cGVzKTsKKwkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlcyhlYXJDb21wb25lbnQsIGoyZWVUeXBlcyk7CisJCVN0cmluZyBlYXJMaWIgPSBnZXRFQVJMaWJEaXIoZWFyQ29tcG9uZW50KTsKKwkJaWYgKGVhckxpYiA9PSBudWxsKQorCQkJcmV0dXJuIHJlZnM7CisJCUFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gbW9kdWxlUmVmcyA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7CisJCUlQYXRoIGVhckxpYlBhdGggPSBuZXcgUGF0aChlYXJMaWIpLm1ha2VSZWxhdGl2ZSgpOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChlYXJMaWJQYXRoLmlzRW1wdHkoKSB8fCAhcmVmc1tpXS5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpLmVxdWFscyhlYXJMaWJQYXRoKSkgeworCQkJCW1vZHVsZVJlZnMuYWRkKHJlZnNbaV0pOworCQkJfQorCQl9CisJCXJldHVybiBtb2R1bGVSZWZzLnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW21vZHVsZVJlZnMuc2l6ZSgpXSk7CiAJfQogCiAJLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGxpc3Qgb2YgSVZpcnR1YWxSZWZlcmVuY2VzIGZvciBhbGwgb2YgdGhlIGNvbXBvbmVudHMgY29udGFpbmVkIGluCi0JICogYW4gRUFSIGFwcGxpY2F0aW9uLgorCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFueSBhcnJheSBvZiB7QGxpbmsgSVZpcnR1YWxSZWZlcmVuY2V9IGZvciBhbGwgb2YKKwkgKiB0aGUgY29tcG9uZW50cyBjb250YWluZWQgaW4gYW4gRUFSIGFwcGxpY2F0aW9uLgogCSAqIAotCSAqIEByZXR1cm4gLSBhbiBhcnJheSBvZiBJVmlydHVhbFJlZmVyZW5jZXMgZm9yIGNvbXBvbmVudHMgaW4gdGhlIEVBUgorCSAqIEBwYXJhbSBlYXJDb21wb25lbnQKKwkgKiAgICAgICAgICAgIFRoZSBFQVIncyB7QGxpbmsgSVZpcnR1YWxDb21wb25lbnR9LiBQYXNzaW5nIGluCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIHJlc3VsdCB3aXRoIGEgemVybyBsZW5ndGgKKwkgKiAgICAgICAgICAgIHtAbGluayBJVmlydHVhbFJlZmVyZW5jZX0gYXJyYXkgYmVpbmcgcmV0dXJuZWQuCisJICogCisJICogQHJldHVybiBhbiBhcnJheSBvZiB7QGxpbmsgSVZpcnR1YWxSZWZlcmVuY2V9IGZvciBjb21wb25lbnRzIGluIHRoZSBFQVIuCiAJICovCiAJcHVibGljIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldENvbXBvbmVudFJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50KSB7CisJCWlmIChlYXJDb21wb25lbnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIE5PX1JFRkVSRU5DRVM7CisJCX0KIAkJcmV0dXJuIGdldENvbXBvbmVudFJlZmVyZW5jZXMoZWFyQ29tcG9uZW50LCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKIAl9CiAKIAkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgSVZpcnR1YWxSZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gbmFtZQorCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSB7QGxpbmsgSVZpcnR1YWxSZWZlcmVuY2V9IHRvIHRoZSBjb21wb25lbnQgb2YKKwkgKiB0aGUgZ2l2ZW4gbmFtZQorCSAqIAorCSAqIEBwYXJhbSBlYXJDb21wb25lbnQKKwkgKiAgICAgICAgICAgIFRoZSBFQVIncyB7QGxpbmsgSVZpcnR1YWxDb21wb25lbnR9LiBQYXNzaW5nIGluCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIHJlc3VsdCB3aXRoIDxjb2RlPm51bGw8L2NvZGU+IGJlaW5nCisJICogICAgICAgICAgICByZXR1cm5lZC4KKwkgKiBAcGFyYW0gY29tcG9uZW50TmFtZQorCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudE5hbWUgdG8gbG9vayBmb3IuIFBhc3NpbmcgaW4KKwkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgcmVzdWx0IHdpdGggPGNvZGU+bnVsbDwvY29kZT4gYmVpbmcKKwkgKiAgICAgICAgICAgIHJldHVybmVkLgogCSAqIAogCSAqIEByZXR1cm4gLSBJVmlydHVhbFJlZmVyZW5jZSBvciBudWxsIGlmIG5vdCBmb3VuZAogCSAqLwogCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2UgZ2V0Q29tcG9uZW50UmVmZXJlbmNlKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCwgU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKKwkJaWYgKGVhckNvbXBvbmVudCA9PSBudWxsIHx8IGNvbXBvbmVudE5hbWUgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KIAkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlcyhlYXJDb21wb25lbnQsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKIAkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHJlZnNbaV07CkBAIC0xMDUsMzIgKzE2OSw0NCBAQAogCiAJcHJpdmF0ZSBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRDb21wb25lbnRSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCwgTGlzdCBjb21wb25lbnRUeXBlcykgewogCQlMaXN0IGNvbXBvbmVudHMgPSBnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KGVhckNvbXBvbmVudCwgY29tcG9uZW50VHlwZXMpOwotCQlpZihjb21wb25lbnRzLnNpemUoKSA+IDApCisJCWlmIChjb21wb25lbnRzLnNpemUoKSA+IDApCiAJCQlyZXR1cm4gKElWaXJ0dWFsUmVmZXJlbmNlW10pIGNvbXBvbmVudHMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbY29tcG9uZW50cy5zaXplKCldKTsKIAkJcmV0dXJuIE5PX1JFRkVSRU5DRVM7Ci0JfSAKLQkKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBMaXN0IGdldENvbXBvbmVudFJlZmVyZW5jZXNBc0xpc3QoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50LCBMaXN0IGNvbXBvbmVudFR5cGVzKSB7CisJCXJldHVybiBnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KGVhckNvbXBvbmVudCwgY29tcG9uZW50VHlwZXMsIGZhbHNlKTsKKwl9CisKIAkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjb3BpZWQgZnJvbSBFQVJBcnRpZmFjdEVkaXQuIEFueSBidWcgZml4ZXMgc2hvdWxkIG9jY3VyIGluCisJICogYm90aCBsb2NhdGlvbnMuCiAJICogCiAJICogQHBhcmFtIGNvbXBvbmVudFR5cGVzCiAJICogQHJldHVybiBBIExpc3Qgb2Yge0BsaW5rIElWaXJ0dWFsUmVmZXJlbmNlfXMuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgY29waWVkIGZyb20gRUFSQXJ0aWZhY3RFZGl0LiAgQW55IGJ1ZyBmaXhlcyBzaG91bGQgb2NjdXIgaW4gYm90aCBsb2NhdGlvbnMuCiAJICovCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCwgTGlzdCBjb21wb25lbnRUeXBlcykgeworCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0Q29tcG9uZW50UmVmZXJlbmNlc0FzTGlzdChJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQsIExpc3QgY29tcG9uZW50VHlwZXMsIGJvb2xlYW4gZXhwYW5kTGlicmFyaWVzKSB7CiAJCUxpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKIAkJaWYgKGVhckNvbXBvbmVudCAhPSBudWxsICYmIGlzRUFSUHJvamVjdChlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZDb21wb25lbnRzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKKwkJCU1hcDxTdHJpbmcsIE9iamVjdD4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCQkJaWYgKGV4cGFuZExpYnJhcmllcykgeworCQkJCW9wdGlvbnMucHV0KEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50LkdFVF9FWFBBTkRFRF9MSUJfUkVGUywgQm9vbGVhbi5UUlVFKTsKKwkJCX0KKwkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmQ29tcG9uZW50cyA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKG9wdGlvbnMpOworCiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZkNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBtb2R1bGUgPSByZWZDb21wb25lbnRzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKKwkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSByZWZDb21wb25lbnRzW2ldOworCQkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZSA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CiAJCQkJaWYgKG1vZHVsZSA9PSBudWxsKQogCQkJCQljb250aW51ZTsKLQkJCQkvLyBpZiBjb21wb25lbnQgdHlwZXMgcGFzc2VkIGluIGlzIG51bGwgdGhlbiByZXR1cm4gYWxsIGNvbXBvbmVudHMKKworCQkJCS8vIGlmIGNvbXBvbmVudCB0eXBlcyBwYXNzZWQgaW4gaXMgbnVsbCB0aGVuIHJldHVybiBhbGwKKwkJCQkvLyBjb21wb25lbnRzCiAJCQkJaWYgKGNvbXBvbmVudFR5cGVzID09IG51bGwgfHwgY29tcG9uZW50VHlwZXMuc2l6ZSgpID09IDApCi0JCQkJCWNvbXBvbmVudHMuYWRkKHJlZkNvbXBvbmVudHNbaV0pOworCQkJCQljb21wb25lbnRzLmFkZChyZWZlcmVuY2UpOwogCQkJCWVsc2UgewogCQkJCQlpZiAoY29tcG9uZW50VHlwZXMuY29udGFpbnMoZ2V0SjJFRUNvbXBvbmVudFR5cGUobW9kdWxlKSkpIHsKLQkJCQkJCWNvbXBvbmVudHMuYWRkKHJlZkNvbXBvbmVudHNbaV0pOworCQkJCQkJY29tcG9uZW50cy5hZGQocmVmZXJlbmNlKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTE0MSwyMiArMjE3LDMwIEBACiAJLyoqCiAJICogQ2hlY2tzIGlmIHRoZSB1cmkgbWFwcGluZyBhbHJlYWR5IGV4aXN0cy4KIAkgKiAKLQkgKiBAcGFyYW0gU3RyaW5nCi0JICogICAgICAgICAgICBjdXJyZW50VVJJIC0gVGhlIGN1cnJlbnQgdXJpIG9mIHRoZSBtb2R1bGUuCisJICogQHBhcmFtIGN1cnJlbnRVUkkKKwkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IHVyaSBvZiB0aGUgbW9kdWxlLiBQYXNzaW5nIGluIDxjb2RlPm51bGw8L2NvZGU+CisJICogICAgICAgICAgICB3aWxsIHJlc3VsdCB3aXRoIDxjb2RlPmZhbHNlPC9jb2RlPiBiZWluZyByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gZWFyUHJvamVjdAorCSAqICAgICAgICAgICAgVGhlIEVBUidzIHByb2plY3QuIFBhc3NpbmcgaW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCByZXN1bHQKKwkgKiAgICAgICAgICAgIHdpdGggPGNvZGU+ZmFsc2U8L2NvZGU+IGJlaW5nIHJldHVybmVkLgogCSAqIEByZXR1cm4gYm9vbGVhbgogCSAqLwogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1cmlFeGlzdHMoU3RyaW5nIGN1cnJlbnRVUkksIElQcm9qZWN0IGVhclByb2plY3QpIHsKKwkJaWYgKGN1cnJlbnRVUkkgPT0gbnVsbCB8fCBlYXJQcm9qZWN0ID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQogCQlTdHJ1Y3R1cmVFZGl0IGVkaXQgPSBudWxsOwogCQl0cnkgewogCQkJZWRpdCA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoZWFyUHJvamVjdCk7Ci0JCQlpZiAoZWRpdCE9bnVsbCAmJiBlZGl0LmdldENvbXBvbmVudCgpIT1udWxsKSB7CisJCQlpZiAoZWRpdCAhPSBudWxsICYmIGVkaXQuZ2V0Q29tcG9uZW50KCkgIT0gbnVsbCkgewogCQkJCUxpc3QgcmVmZXJlbmNlZENvbXBzID0gZWRpdC5nZXRDb21wb25lbnQoKS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCQkJCWZvciAoaW50IGk9MDsgaTxyZWZlcmVuY2VkQ29tcHMuc2l6ZSgpOyBpKyspIHsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZWRDb21wcy5zaXplKCk7IGkrKykgewogCQkJCQlSZWZlcmVuY2VkQ29tcG9uZW50IHJlZiA9IChSZWZlcmVuY2VkQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcHMuZ2V0KGkpOwogCQkJCQlPYmplY3QgbW9kdWxlID0gcmVmLmdldERlcGVuZGVudE9iamVjdCgpOwotCQkJCQlpZiAobW9kdWxlIT1udWxsICYmIG1vZHVsZSBpbnN0YW5jZW9mIE1vZHVsZSkgewotCQkJCQkJU3RyaW5nIGV4aXN0aW5nVVJJID0gKChNb2R1bGUpbW9kdWxlKS5nZXRVcmkoKTsKLQkJCQkJCWlmIChleGlzdGluZ1VSSSE9bnVsbCAmJiBleGlzdGluZ1VSSS5lcXVhbHMoY3VycmVudFVSSSkpCisJCQkJCWlmIChtb2R1bGUgIT0gbnVsbCAmJiBtb2R1bGUgaW5zdGFuY2VvZiBNb2R1bGUpIHsKKwkJCQkJCVN0cmluZyBleGlzdGluZ1VSSSA9ICgoTW9kdWxlKSBtb2R1bGUpLmdldFVyaSgpOworCQkJCQkJaWYgKGV4aXN0aW5nVVJJICE9IG51bGwgJiYgZXhpc3RpbmdVUkkuZXF1YWxzKGN1cnJlbnRVUkkpKQogCQkJCQkJCXJldHVybiB0cnVlOwogCQkJCQl9CiAJCQkJfQpAQCAtMTcwLDE1ICsyNTQsMjAgQEAKIAogCS8qKgogCSAqIFJldHVybnMgYWxsIHJlZmVyZW5jaW5nIEVBUiBwcm9qZWN0cy4KLQkgKiBAcGFyYW0gcHJvamVjdCBQcm9qZWN0IHRvIGNoZWNrLiBJZiBudWxsIG9yIGFuIEVBUiwgcmV0dXJucyBhIHplcm8gbGVuZ3RoIGFycmF5LgorCSAqIAorCSAqIEBwYXJhbSBwcm9qZWN0CisJICogICAgICAgICAgICBQcm9qZWN0IHRvIGNoZWNrLiBJZiA8Y29kZT5udWxsPC9jb2RlPiB0aGVuIGEgemVybyBsZW5ndGgKKwkgKiAgICAgICAgICAgIGFycmF5IGlzIHJldHVybmVkLiBJZiBhbiBFQVIsIHRoZW4gYSBvbmUgZWxlbWVudCBhcnJheSB3aWxsIGJlCisJICogICAgICAgICAgICByZXR1cm5lZC4KIAkgKiBAcmV0dXJuIEFycmF5IG9mIHJlZmVyZW5jaW5nIEVBUiBwcm9qZWN0cy4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCS8vIFRPRE8gLSBzaG91bGQgdGhpcyBnbyBoZXJlLCBvciBpbiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzPwotCQlpZihwcm9qZWN0ICE9IG51bGwgJiYgaXNFQVJQcm9qZWN0KHByb2plY3QpKXsKLQkJCXJldHVybiBuZXcgSVByb2plY3RbXSB7cHJvamVjdH07CisJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKKwkJCXJldHVybiBuZXcgSVByb2plY3RbMF07CisJCX0gZWxzZSBpZiAoaXNFQVJQcm9qZWN0KHByb2plY3QpKSB7CisJCQlyZXR1cm4gbmV3IElQcm9qZWN0W10geyBwcm9qZWN0IH07CiAJCX0KLQkJCisKIAkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwogCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKQEAgLTE4OCwxNTIgKzI3NywyMzkgQEAKIAkJCQkJcmVzdWx0LmFkZChyZWZDb21wb25lbnRzW2ldLmdldFByb2plY3QoKSk7CiAJCQl9CiAJCX0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSByZXN1bHQudG9BcnJheShuZXcgSVByb2plY3RbcmVzdWx0LnNpemUoKV0pOworCisJCUlQcm9qZWN0W10gZWFyUHJvamVjdHMgPSAoSVByb2plY3RbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElQcm9qZWN0W3Jlc3VsdC5zaXplKCldKTsKKwkJLy8gc29ydCB0aGUgbGlzdCBzbyBpdCBpcyBjb25zaXN0ZW50CisJCUFycmF5cy5zb3J0KGVhclByb2plY3RzLCBuZXcgQ29tcGFyYXRvcjxJUHJvamVjdD4oKSB7CisJCQlwdWJsaWMgaW50IGNvbXBhcmUoSVByb2plY3QgcDAsIElQcm9qZWN0IHAxKSB7CisJCQkJcmV0dXJuIHAwLmdldE5hbWUoKS5jb21wYXJlVG8ocDEuZ2V0TmFtZSgpKTsKKwkJCX0KKwkJfSk7CisKKwkJcmV0dXJuIGVhclByb2plY3RzOwogCX0KIAorCS8qKgorCSAqIEVxdWl2YWxlbnQgdG8gZ2V0UmVmZXJlbmNpbmdFQVJQcm9qZWN0cyhwcm9qZWN0KS5sZW5ndGggPT0gMDsgV2lsbCByZXR1cm4KKwkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgaXMgbm90IGxpbmtlZCB0byBhbiBFQVIuCisJICogCisJICogQHByb2plY3QgUHJvamVjdCB0byBjaGVjaworCSAqIEByZXR1cm4KKwkgKi8KIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdGFuZGFsb25lUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7CiAJCXJldHVybiBnZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKHByb2plY3QpLmxlbmd0aCA9PSAwOwogCX0KIAogCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBsaXN0IG9mIElWaXJ0dWFsUmVmZXJlbmNlcyBmb3IgYWxsIG9mIHRoZSB1dGlsaXR5IG1vZHVsZXMKLQkgKiBjb250YWluZWQgaW4gdGhlIEVBUiBhcHBsaWNhdGlvbgorCSAqIEVxdWl2YWxlbnQgdG8gY2FsbGluZworCSAqIHtAbGluayAjZ2V0VXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQsIGJvb2xlYW4pfSBwYXNzaW5nCisJICogPGNvZGU+ZmFsc2U8L2NvZGU+LgogCSAqIAotCSAqIEByZXR1cm4gLSBhbiBhcnJheSBvZiBJVmlydHVhbFJlZmVyZW5jZXMgZm9yIHV0aWxpdHkgbW9kdWxlcyBpbiB0aGUgRUFSCisJICogQHBhcmFtIGVhckNvbXBvbmVudAorCSAqIEByZXR1cm4KIAkgKi8KIAlwdWJsaWMgc3RhdGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0VXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50KSB7Ci0JCWlmIChlYXJDb21wb25lbnQgIT0gbnVsbCAmJiBpc0VBUlByb2plY3QoZWFyQ29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLQkJCUxpc3QgZXhwbGljaXRVdGlsaXR5UmVmZXJlbmNlcyA9IAotCQkJCWdldENvbXBvbmVudFJlZmVyZW5jZXNBc0xpc3QoZWFyQ29tcG9uZW50LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KElKMkVFRmFjZXRDb25zdGFudHMuVVRJTElUWSkpOwotCQkJCi0JCQkvLyBmZXRjaCBvdGhlciBVdGlsaXR5IEphcnMgYXR0YWNoZWQgdG8gdGhlIEVBUiBwcm9qZWN0IAotCQkJTGlzdCBpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VUeXBlcyA9Ci0JCQkJQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAgSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSwgCi0JCQkJCQkJCQkJCSAgIElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUsICAKLQkJCQkJCQkJCQkJICAgSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRSB9KTsgCi0JCi0JCQlMaXN0IGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZXMgPSAKLQkJCQlnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KGVhckNvbXBvbmVudCwgaW1wbGljaXRVdGlsaXR5UmVmZXJlbmNlVHlwZXMpOwotCQkJCi0JCQlJRUFSTW9kZWxQcm92aWRlciBlYXJNb2RlbCA9IChJRUFSTW9kZWxQcm92aWRlcilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJSUNvbW1vbkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gKElDb21tb25BcHBsaWNhdGlvbillYXJNb2RlbC5nZXRNb2RlbE9iamVjdCgpOwotCQkJT2JqZWN0IG1vZHVsZSA9IG51bGw7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBudWxsOwotCQkJZm9yIChJdGVyYXRvciByZWZlcmVuY2VJdHIgPSBpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IHJlZmVyZW5jZUl0ci5oYXNOZXh0KCk7ICkgewotCQkJCW1vZHVsZSA9IG51bGw7Ci0JCQkJcmVmZXJlbmNlID0gKElWaXJ0dWFsUmVmZXJlbmNlKSByZWZlcmVuY2VJdHIubmV4dCgpOwotCQkJCWlmIChhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwpCi0JCQkJewotCQkJCQltb2R1bGUgPSAoKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwpYXBwbGljYXRpb24pLmdldEZpcnN0TW9kdWxlKHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXBwbGljYXRpb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCkKLQkJCQl7Ci0JCQkJCW1vZHVsZSA9ICgob3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwpYXBwbGljYXRpb24pLmdldEZpcnN0TW9kdWxlKHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpKTsgCi0JCQkJfQotCQkJCWlmKG1vZHVsZSAhPSBudWxsKSAKLQkJCQkJcmVmZXJlbmNlSXRyLnJlbW92ZSgpOyAKLQkJCX0KLQkJCQotCQkJTGlzdCBhbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWFsbFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzLmFkZEFsbChleHBsaWNpdFV0aWxpdHlSZWZlcmVuY2VzKTsKLQkJCWFsbFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzLmFkZEFsbChpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VzKTsKLQkJCQotCQkJaWYoYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMuc2l6ZSgpID4gMCkKLQkJCQlyZXR1cm4gKElWaXJ0dWFsUmVmZXJlbmNlW10pIGFsbFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzLnRvQXJyYXkobmV3IElWaXJ0dWFsUmVmZXJlbmNlW2FsbFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzLnNpemUoKV0pOwotCQl9Ci0JCXJldHVybiBOT19SRUZFUkVOQ0VTOwotCQkKKwkJcmV0dXJuIGdldFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzKGVhckNvbXBvbmVudCwgZmFsc2UpOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgYSBMaXN0IG9mIFByb2plY3RGYWNldFZlcnNpb25zIGZvciBhIGdpdmVuIG1vZHVsZSB0eXBlIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBhIGdpdmVuIGVhciB2ZXJzaW9uCi0JICogQHBhcmFtIGVhclByb2plY3RGYWNldFZlcnNpb24gLSB0aGUgUHJvamVjdEZhY2V0VmVyc2lvbiBmb3IgdGhlIEVOVEVSUFJJU0VfQVBQTElDQVRJT04gdGhhdCB0aGUgbW9kdWxlIHdpbGwgYmUgYWRkZWQgdG8KLQkgKiBAcGFyYW0gbW9kdWxlUHJvamVjdEZhY2V0IC0gdGhlIG1vZHVsZSB0eXBlIHdob3NlIGFwcHJvcHJpYXRlIFByb2plY3RGYWNldFZlcnNpb25zIGFyZSBkZXNpcmVkCi0JICogQHJldHVybiBMaXN0IG9mIGNvbXBhdGlibGUgUHJvamVjdEZhY2V0VmVyc2lvbnMgb2YgdGhlIG1vZHVsZVByb2plY3RGYWNldCB0eXBlCisJICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGFycmF5IG9mIHtAbGluayBJVmlydHVhbFJlZmVyZW5jZX0gZm9yIGFsbCBvZgorCSAqIHRoZSB1dGlsaXR5IG1vZHVsZXMgY29udGFpbmVkIGluIHRoZSBFQVIgYXBwbGljYXRpb24KKwkgKiAKKwkgKiBAcGFyYW0gZWFyQ29tcG9uZW50CisJICogICAgICAgICAgICBUaGUgRUFSJ3Mge0BsaW5rIElWaXJ0dWFsQ29tcG9uZW50fS4gUGFzc2luZyBpbgorCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gb3IgYSBub24gZWFyIHByb2plY3Qgd2lsbCByZXN1bHQgd2l0aCBhIHplcm8KKwkgKiAgICAgICAgICAgIGxlbmd0aCB7QGxpbmsgSVZpcnR1YWxSZWZlcmVuY2V9IGFycmF5IGJlaW5nIHJldHVybmVkLgorCSAqIAorCSAqIEByZXR1cm4gLSBhbiBhcnJheSBvZiB7QGxpbmsgSVZpcnR1YWxSZWZlcmVuY2V9IGZvciB1dGlsaXR5IG1vZHVsZXMgaW4KKwkgKiAgICAgICAgIHRoZSBFQVIKIAkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFN1cHBvcnRlZEZhY2V0cyhJUHJvamVjdEZhY2V0VmVyc2lvbiBlYXJQcm9qZWN0RmFjZXRWZXJzaW9uLCBJUHJvamVjdEZhY2V0IG1vZHVsZVByb2plY3RGYWNldCkKLQl7CisJcHVibGljIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCwgYm9vbGVhbiBleHBhbmRMaWJyYXJpZXMpIHsKKwkJaWYgKGVhckNvbXBvbmVudCAhPSBudWxsICYmIGlzRUFSUHJvamVjdChlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgeworCQkJTGlzdCBleHBsaWNpdFV0aWxpdHlSZWZlcmVuY2VzID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlc0FzTGlzdChlYXJDb21wb25lbnQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoSUoyRUVGYWNldENvbnN0YW50cy5VVElMSVRZKSwgZXhwYW5kTGlicmFyaWVzKTsKKworCQkJLy8gZmV0Y2ggb3RoZXIgVXRpbGl0eSBKYXJzIGF0dGFjaGVkIHRvIHRoZSBFQVIgcHJvamVjdAorCQkJTGlzdCBpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VUeXBlcyA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSwgSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSwgSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRSB9KTsKKworCQkJTGlzdCBpbXBsaWNpdFV0aWxpdHlSZWZlcmVuY2VzID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlc0FzTGlzdChlYXJDb21wb25lbnQsIGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZVR5cGVzLCBleHBhbmRMaWJyYXJpZXMpOworCisJCQlJRUFSTW9kZWxQcm92aWRlciBlYXJNb2RlbCA9IChJRUFSTW9kZWxQcm92aWRlcikgTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKKwkJCUlDb21tb25BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IChJQ29tbW9uQXBwbGljYXRpb24pIGVhck1vZGVsLmdldE1vZGVsT2JqZWN0KCk7CisJCQlPYmplY3QgbW9kdWxlID0gbnVsbDsKKwkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG51bGw7CisJCQlmb3IgKEl0ZXJhdG9yIHJlZmVyZW5jZUl0ciA9IGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgcmVmZXJlbmNlSXRyLmhhc05leHQoKTspIHsKKwkJCQltb2R1bGUgPSBudWxsOworCQkJCXJlZmVyZW5jZSA9IChJVmlydHVhbFJlZmVyZW5jZSkgcmVmZXJlbmNlSXRyLm5leHQoKTsKKwkJCQlpZiAoYXBwbGljYXRpb24gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuQXBwbGljYXRpb25JbXBsKSB7CisJCQkJCW1vZHVsZSA9ICgob3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCkgYXBwbGljYXRpb24pLmdldEZpcnN0TW9kdWxlKHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpKTsKKwkJCQl9IGVsc2UgaWYgKGFwcGxpY2F0aW9uIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGwpIHsKKwkJCQkJbW9kdWxlID0gKChvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLkFwcGxpY2F0aW9uSW1wbCkgYXBwbGljYXRpb24pLmdldEZpcnN0TW9kdWxlKHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpKTsKKwkJCQl9CisJCQkJaWYgKG1vZHVsZSAhPSBudWxsKQorCQkJCQlyZWZlcmVuY2VJdHIucmVtb3ZlKCk7CisJCQl9CisKKwkJCUxpc3QgYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCQlhbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcy5hZGRBbGwoZXhwbGljaXRVdGlsaXR5UmVmZXJlbmNlcyk7CisJCQlhbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcy5hZGRBbGwoaW1wbGljaXRVdGlsaXR5UmVmZXJlbmNlcyk7CisKKwkJCWlmIChhbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcy5zaXplKCkgPiAwKQorCQkJCXJldHVybiAoSVZpcnR1YWxSZWZlcmVuY2VbXSkgYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMuc2l6ZSgpXSk7CisJCX0KKwkJcmV0dXJuIE5PX1JFRkVSRU5DRVM7CisKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgTGlzdCBvZiBQcm9qZWN0RmFjZXRWZXJzaW9ucyBmb3IgYSBnaXZlbiBtb2R1bGUgdHlwZSB0aGF0IGFyZQorCSAqIHN1cHBvcnRlZCBieSBhIGdpdmVuIGVhciB2ZXJzaW9uCisJICogCisJICogQHBhcmFtIGVhclByb2plY3RGYWNldFZlcnNpb24KKwkgKiAgICAgICAgICAgIC0gdGhlIFByb2plY3RGYWNldFZlcnNpb24gZm9yIHRoZSBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OIHRoYXQKKwkgKiAgICAgICAgICAgIHRoZSBtb2R1bGUgd2lsbCBiZSBhZGRlZCB0bworCSAqIEBwYXJhbSBtb2R1bGVQcm9qZWN0RmFjZXQKKwkgKiAgICAgICAgICAgIC0gdGhlIG1vZHVsZSB0eXBlIHdob3NlIGFwcHJvcHJpYXRlIFByb2plY3RGYWNldFZlcnNpb25zIGFyZQorCSAqICAgICAgICAgICAgZGVzaXJlZAorCSAqIEByZXR1cm4gTGlzdCBvZiBjb21wYXRpYmxlIFByb2plY3RGYWNldFZlcnNpb25zIG9mIHRoZSBtb2R1bGVQcm9qZWN0RmFjZXQKKwkgKiAgICAgICAgIHR5cGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIExpc3Q8SVByb2plY3RGYWNldFZlcnNpb24+IGdldFN1cHBvcnRlZEZhY2V0cyhJUHJvamVjdEZhY2V0VmVyc2lvbiBlYXJQcm9qZWN0RmFjZXRWZXJzaW9uLCBJUHJvamVjdEZhY2V0IG1vZHVsZVByb2plY3RGYWNldCkgewogCQlMaXN0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiByZXRWYWwgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0RmFjZXRWZXJzaW9uPigpOwogCi0JCWlmIChlYXJQcm9qZWN0RmFjZXRWZXJzaW9uICE9IG51bGwgJiYgRU5URVJQUklTRV9BUFBMSUNBVElPTi5lcXVhbHMoZWFyUHJvamVjdEZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpKSkKLQkJeworCQlpZiAoZWFyUHJvamVjdEZhY2V0VmVyc2lvbiAhPSBudWxsICYmIEVOVEVSUFJJU0VfQVBQTElDQVRJT04uZXF1YWxzKGVhclByb2plY3RGYWNldFZlcnNpb24uZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKSkpIHsKIAkJCVN0cmluZyBtb2R1bGVQcm9qZWN0RmFjZXRJZCA9IG1vZHVsZVByb2plY3RGYWNldC5nZXRJZCgpOwogCQkJaW50IGVhclZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludChlYXJQcm9qZWN0RmFjZXRWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKSk7CiAKLQkJCWlmIChEWU5BTUlDX1dFQi5lcXVhbHMobW9kdWxlUHJvamVjdEZhY2V0SWQpKQotCQkJewotCQkJCXN3aXRjaCAoZWFyVmVyc2lvbikKLQkJCQl7CisJCQlpZiAoRFlOQU1JQ19XRUIuZXF1YWxzKG1vZHVsZVByb2plY3RGYWNldElkKSkgeworCQkJCXN3aXRjaCAoZWFyVmVyc2lvbikgeworCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl82XzA6CisJCQkJCXJldFZhbC5hZGQoRFlOQU1JQ19XRUJfMzApOwogCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzA6CiAJCQkJCXJldFZhbC5hZGQoRFlOQU1JQ19XRUJfMjUpOworCQkJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNDoKIAkJCQkJcmV0VmFsLmFkZChEWU5BTUlDX1dFQl8yNCk7CisJCQkJCS8vJEZBTEwtVEhST1VHSCQKIAkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zOgogCQkJCQlyZXRWYWwuYWRkKERZTkFNSUNfV0VCXzIzKTsKKwkJCQkJLy8kRkFMTC1USFJPVUdIJAogCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzI6CisJCQkJCS8vJEZBTEwtVEhST1VHSCQKIAkJCQkJcmV0VmFsLmFkZChEWU5BTUlDX1dFQl8yMik7CiAJCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoRUpCLmVxdWFscyhtb2R1bGVQcm9qZWN0RmFjZXRJZCkpCi0JCQl7Ci0JCQkJc3dpdGNoIChlYXJWZXJzaW9uKQotCQkJCXsKKwkJCX0gZWxzZSBpZiAoRUpCLmVxdWFscyhtb2R1bGVQcm9qZWN0RmFjZXRJZCkpIHsKKwkJCQlzd2l0Y2ggKGVhclZlcnNpb24pIHsKKwkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNl8wOgorCQkJCQlyZXRWYWwuYWRkKEVKQl8zMSk7CiAJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzVfMDoKIAkJCQkJcmV0VmFsLmFkZChFSkJfMzApOworCQkJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNDoKIAkJCQkJcmV0VmFsLmFkZChFSkJfMjEpOworCQkJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMzoKIAkJCQkJcmV0VmFsLmFkZChFSkJfMjApOworCQkJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMjoKIAkJCQkJcmV0VmFsLmFkZChFSkJfMTEpOwogCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKEpDQS5lcXVhbHMobW9kdWxlUHJvamVjdEZhY2V0SWQpKQotCQkJewotCQkJCXN3aXRjaCAoZWFyVmVyc2lvbikKLQkJCQl7CisJCQl9IGVsc2UgaWYgKEpDQS5lcXVhbHMobW9kdWxlUHJvamVjdEZhY2V0SWQpKSB7CisJCQkJc3dpdGNoIChlYXJWZXJzaW9uKSB7CisJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzZfMDoKKwkJCQkJcmV0VmFsLmFkZChKQ0FfMTYpOwogCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzA6CiAJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNDoKIAkJCQkJcmV0VmFsLmFkZChKQ0FfMTUpOworCQkJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMzoKIAkJCQkJcmV0VmFsLmFkZChKQ0FfMTApOworCQkJCQkvLyRGQUxMLVRIUk9VR0gkCiAJCQkJY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMjoKIAkJCQkJLy8gdGhlcmUgaXMgbm8gSkNBIGluIEVBUiAxLjIKIAkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChBUFBMSUNBVElPTl9DTElFTlQuZXF1YWxzKG1vZHVsZVByb2plY3RGYWNldElkKSkKLQkJCXsKLQkJCQlzd2l0Y2ggKGVhclZlcnNpb24pCi0JCQkJeworCQkJfSBlbHNlIGlmIChBUFBMSUNBVElPTl9DTElFTlQuZXF1YWxzKG1vZHVsZVByb2plY3RGYWNldElkKSkgeworCQkJCXN3aXRjaCAoZWFyVmVyc2lvbikgeworCQkJCWNhc2UgSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl82XzA6CisJCQkJCXJldFZhbC5hZGQoQVBQTElDQVRJT05fQ0xJRU5UXzYwKTsKIAkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wOgogCQkJCQlyZXRWYWwuYWRkKEFQUExJQ0FUSU9OX0NMSUVOVF81MCk7CisJCQkJCS8vJEZBTEwtVEhST1VHSCQKIAkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80OgogCQkJCQlyZXRWYWwuYWRkKEFQUExJQ0FUSU9OX0NMSUVOVF8xNCk7CisJCQkJCS8vJEZBTEwtVEhST1VHSCQKIAkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zOgogCQkJCQlyZXRWYWwuYWRkKEFQUExJQ0FUSU9OX0NMSUVOVF8xMyk7CisJCQkJCS8vJEZBTEwtVEhST1VHSCQKIAkJCQljYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yOgogCQkJCQlyZXRWYWwuYWRkKEFQUExJQ0FUSU9OX0NMSUVOVF8xMik7CiAJCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoVVRJTElUWS5lcXVhbHMobW9kdWxlUHJvamVjdEZhY2V0SWQpKQotCQkJeworCQkJfSBlbHNlIGlmIChVVElMSVRZLmVxdWFscyhtb2R1bGVQcm9qZWN0RmFjZXRJZCkpIHsKIAkJCQlyZXRWYWwuYWRkKFVUSUxJVFlfRkFDRVRfMTApOwotCQkJfQotCQkJZWxzZQotCQkJeworCQkJfSBlbHNlIHsKIAkJCQkvLyBpbnZhbGlkIG1vZHVsZSB0eXBlCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIG1vZHVsZVByb2plY3RGYWNldCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbGlkIEphdmEgRUUgbW9kdWxlIHR5cGUuIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIG1vZHVsZVByb2plY3RGYWNldCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHZhbGlkIEphdmEgRUUgbW9kdWxlIHR5cGUuIik7IC8vJE5PTi1OTFMtMSQKIAkJCX0KLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCS8vIGludmFsaWQgRUFSIGZhY2V0CiAJCQlpZiAoZWFyUHJvamVjdEZhY2V0VmVyc2lvbiA9PSBudWxsKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBlYXJQcm9qZWN0RmFjZXRWZXJzaW9uIHBhcmFtZXRlciBjYW5ub3QgYmUgbnVsbCIpOwotCQkJZWxzZQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBlYXJQcm9qZWN0RmFjZXRWZXJzaW9uIHBhcmFtZXRlciBtdXN0IGJlIGFuIEVOVEVSUFJJU0VfQVBQTElDQVRJT04gZmFjZXQuIik7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGVhclByb2plY3RGYWNldFZlcnNpb24gcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBlYXJQcm9qZWN0RmFjZXRWZXJzaW9uIHBhcmFtZXRlciBtdXN0IGJlIGFuIEVOVEVSUFJJU0VfQVBQTElDQVRJT04gZmFjZXQuIik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCiAJCXJldHVybiByZXRWYWw7CiAJfQorCisJLyoqCisJICogR2V0IHRoZSBsaWJyYXJ5IGRpcmVjdG9yeSBmcm9tIGFuIEVBUiB2aXJ0dWFsIGNvbXBvbmVudAorCSAqIAorCSAqIEBwYXJhbSBlYXJDb21wb25lbnQKKwkgKiAgICAgICAgICAgIFRoZSBFQVIncyB7QGxpbmsgSVZpcnR1YWxDb21wb25lbnR9LiBQYXNzaW5nIGluCisJICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIHJlc3VsdCB3aXRoIDxjb2RlPm51bGw8L2NvZGU+IGJlaW5nCisJICogICAgICAgICAgICByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcmV0dXJuIGEgcnVudGltZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGlicmFyeSBkaXJlY3RvcnkgcGF0aCBvciBudWxsIGlmCisJICogICAgICAgICB0aGUgRUFSJ3MgdmVyc2lvbiBpcyBsb3dlciB0aGFuIDUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFQVJMaWJEaXIoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50KSB7CisJCWlmIChlYXJDb21wb25lbnQgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQkvLyBjaGVjayBpZiB0aGUgRUFSIGNvbXBvbmVudCdzIHZlcnNpb24gaXMgNSBvciBncmVhdGVyCisJCUlQcm9qZWN0IGVhclByb2plY3QgPSBlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpOworCQlpZiAoIUphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNKRUVDb21wb25lbnQoZWFyQ29tcG9uZW50LCBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLkREX1ZFUlNJT04pIHx8ICFKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkVFQ29tcG9uZW50KGVhckNvbXBvbmVudCwgSmF2YUVFUHJvamVjdFV0aWxpdGllcy5GQUNFVF9WRVJTSU9OKSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQkvLyBkZWZhdWx0IGxpYiBkaXIgaWYgdGhlcmUgaXMgbm8gZGVwbG95bWVudCBkZXNjcmlwdG9yCisJCS8vIG9yIGlmIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZG9lcyBub3Qgb3ZlcnJpZGUKKwkJU3RyaW5nIGxpYkRpciA9IG5ldyBQYXRoKEoyRUVDb25zdGFudHMuRUFSX0RFRkFVTFRfTElCX0RJUikubWFrZVJlbGF0aXZlKCkudG9TdHJpbmcoKTsKKworCQkvLyByZXRyaWV2ZSB0aGUgbW9kZWwgcHJvdmlkZXIKKwkJSU1vZGVsUHJvdmlkZXIgbW9kZWxQcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIoZWFyUHJvamVjdCk7CisJCWlmIChtb2RlbFByb3ZpZGVyID09IG51bGwpIHsKKwkJCXJldHVybiBsaWJEaXI7CisJCX0KKworCQkvLyByZXRyaWV2ZSB0aGUgRUFSJ3MgZGVwbG95bWVudCBkZXNjcmlwdG9yIG1vZGVsIG9iamVjdAorCQlPYmplY3QgbyA9IG1vZGVsUHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpKTsKKwkJQXBwbGljYXRpb24gYXBwID0gbnVsbDsKKwkJLy8gY2hlY2sgdG8gc2VlIHRoZSB0eXBlIC0gaWYgdGhpcyBpcyBpbiBhIHByb2plY3Qgd2l0aCBhIGoyZWUgMS40IG9yCisJCS8vIG9sZGVyIGZhY2V0LCBsaWIgZGlyIGlzIHVuYXZhaWxhYmxlLgorCQlpZiAobyBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uKSB7CisJCQlhcHAgPSAoQXBwbGljYXRpb24pIG87CisJCX0KKwkJaWYgKGFwcCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbGliRGlyOworCQl9CisKKwkJLy8gcmV0cmlldmUgdGhlIGxpYnJhcnkgZGlyZWN0b3J5IGZyb20gdGhlIG1vZGVsCisJCVN0cmluZyBkZExpYkRpciA9IGFwcC5nZXRMaWJyYXJ5RGlyZWN0b3J5KCk7CisJCWlmIChkZExpYkRpciAhPSBudWxsKSB7CisJCQlsaWJEaXIgPSBkZExpYkRpcjsKKwkJfQorCisJCXJldHVybiBsaWJEaXI7CisJfQorCiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L0lTaW5nbGVSb290U3RhdHVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L0lTaW5nbGVSb290U3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OWVmN2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9JU2luZ2xlUm9vdFN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNpbmdsZVJvb3RTdGF0dXMgZXh0ZW5kcyBJU3RhdHVzIHsKLQkKLQkvLyBJbmZvcm1hdGlvbiBPbmx5IFswLTMyXQotCQotCS8vIFdhcm5pbmdzIFszMy02NV0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTT1VSQ0VfUEFUSF9OT1RfRk9VTkQgPSAzMzsKLQkKLQkvLyBFcnJvcnMgWzY2LTk4XQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0NPTVBPTkVOVF9GT1VORCA9IDY3OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSkFWQV9PVVRQVVRfR1JFQVRFUl9USEFOXzEgPSA2ODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVBUl9QUk9KRUNUX0ZPVU5EID0gNjk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU5LRURfUkVTT1VSQ0VTX0ZPVU5EID0gNzA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKQVZBX09VVFBVVF9OT1RfQV9DT05URU5UX1JPT1QgPSA3MTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpBVkFfT1VUUFVUX05PVF9XRUJJTkZfQ0xBU1NFUyA9IDcyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRMRUFTVF8xX1JFU09VUkNFX01BUF9NSVNTSU5HID0gNzM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19SRVNPVVJDRV9NQVBTX0ZPVU5EID0gNzQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTkVfQ09OVEVOVF9ST09UX1JFUVVJUkVEID0gNzU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVExFQVNUXzFfSkFWQV9TT1VSQ0VfUkVRVUlSRUQgPSA3NjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTlRJTUVfUEFUSF9OT1RfUk9PVCA9IDc3OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09VUkNFX05PVF9KQVZBX0NPTlRBSU5FUiA9IDc4OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVOVElNRV9QQVRIX05PVF9ST09UX09SX1dFQklORl9DTEFTU0VTID0gNzk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTkxZXzFfQ09OVEVOVF9ST09UX0FMTE9XRUQgPSA4MDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBMSUNJVExZX0RJU0FCTEVEID0gODE7Ci0JCi0JcHVibGljIENvbXBvbmVudFJlc291cmNlIGdldENvbXBvbmVudFJlc291cmNlKCk7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9KYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L0phdmFFRVByb2plY3RVdGlsaXRpZXMuamF2YQppbmRleCAyNTIwMjdjLi5mMjdlNmY1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L0phdmFFRVByb2plY3RVdGlsaXRpZXMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L0phdmFFRVByb2plY3RVdGlsaXRpZXMuamF2YQpAQCAtMTAsMjkgKzEwLDQ0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdDsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkNsYXNzcGF0aExpYnJhcnlFeHBhbmRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklFQVJNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklGbGF0RmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuVmlydHVhbFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5GYWNldGVkUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5WaXJ0dWFsUmVmZXJlbmNlVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKIApAQCAtNDIsMzggKzU3LDE5IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRERfVkVSU0lPTiA9IDE7CiAJCiAJcHVibGljIEphdmFFRVByb2plY3RVdGlsaXRpZXMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgogCX0KIAorCQogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb2plY3RPZlR5cGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHR5cGVJRCkgewogCQlyZXR1cm4gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihwcm9qZWN0LCB0eXBlSUQpICE9IG51bGw7CiAJfQogCiAJcHVibGljIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0eXBlSUQpewotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiBQcm9qZWN0RmFjZXRzTWFuYWdlci5pc1Byb2plY3RGYWNldERlZmluZWQodHlwZUlEKSkgewotCQkJSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQodHlwZUlEKTsKLQkJCWlmKHByb2plY3RGYWNldCA9PSBudWxsKXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBmYWNldGVkUHJvamVjdC5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKHByb2plY3RGYWNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CisJCXJldHVybiBGYWNldGVkUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKHByb2plY3QsIHR5cGVJRCk7CiAJfQogCQogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQcm9qZWN0T2ZUeXBlKElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCwgU3RyaW5nIHR5cGVJRCkgewotCi0JCWlmIChmYWNldGVkUHJvamVjdCAhPSBudWxsICYmIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCh0eXBlSUQpKSB7Ci0JCQlJUHJvamVjdEZhY2V0IHByb2plY3RGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCh0eXBlSUQpOwotCQkJcmV0dXJuIHByb2plY3RGYWNldCAhPSBudWxsICYmIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChwcm9qZWN0RmFjZXQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIEZhY2V0ZWRQcm9qZWN0VXRpbGl0aWVzLmlzUHJvamVjdE9mVHlwZShmYWNldGVkUHJvamVjdCwgdHlwZUlEKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRUFSUHJvamVjdChJRmFjZXRlZFByb2plY3QgcHJvamVjdCkgewpAQCAtMTE4LDYgKzExNCwyMSBAQAogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0R5bmFtaWNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKIAkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBEWU5BTUlDX1dFQik7CiAJfQorCQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYkZyYWdtZW50UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7CisJCXJldHVybiBpc1Byb2plY3RPZlR5cGUocHJvamVjdCwgV0VCRlJBR01FTlQpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXZWJGcmFnbWVudFByb2plY3QoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QpIHsKKwkJcmV0dXJuIGlzUHJvamVjdE9mVHlwZShwcm9qZWN0LCBXRUJGUkFHTUVOVCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYkZyYWdtZW50UHJvamVjdChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKKwkJaWYgKGNvbXBvbmVudC5pc0JpbmFyeSgpKSB7CisJCQlyZXR1cm4gaXNCaW5hcnlUeXBlKGNvbXBvbmVudCwgSmF2YUVFUXVpY2tQZWVrLldFQkZSQUdNRU5UX1RZUEUpOworCQl9CisJCXJldHVybiBpc1Byb2plY3RPZlR5cGUoY29tcG9uZW50LmdldFByb2plY3QoKSwgV0VCRlJBR01FTlQpOworCX0KIAogCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N0YXRpY1dlYlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewogCQlyZXR1cm4gaXNQcm9qZWN0T2ZUeXBlKHByb2plY3QsIFNUQVRJQ19XRUIpOwpAQCAtMTc2LDM2ICsxODcsMTAzIEBACiAJCX0KIAkJcmV0dXJuIChJUHJvamVjdFtdKSByZXN1bHQudG9BcnJheShuZXcgSVByb2plY3RbcmVzdWx0LnNpemUoKV0pOwogCX0KLQorCQorCS8qKgorCSAqIEBwYXJhbSAgSVZpcnR1YWxDb21wb25lbnQgb2YgdGhlIGVuY2xvc2luZyBjb21wb25lbnQKKwkgKiBAcGFyYW0gIElWaXJ0dWFsUmVmZXJlbmNlW10gb2YgcmVmZXJlbmNlcyBjb250YWluZWQgYnkgdGhlIGVuY2xvc2luZyBjb21wb25lbnQKKwkgKiBAcmV0dXJuIElWaXJ0dWFsUmVmZXJlbmNlW10gb2Ygb3JpZ2luYWwgcmVmZXJlbmNlcyBpbiBhZGRpdGlvbiB0byB0aGUgZXhwYW5kZWQgbGlzdCBvZiByZWZlcmVuY2VzIGZvciBhbnkKKwkgKiAgICAgICAgIGNvbnN1bWVkIHJlZmVyZW5jZXMgZm91bmQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0RXhwYW5kZWRSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzKSB7CisJCUFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gYWxsUmVmcyA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxSZWZlcmVuY2U+KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgeworCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gcmVmc1tpXTsKKwkJCWlmIChyZWZlcmVuY2UuZ2V0RGVwZW5kZW5jeVR5cGUoKT09SVZpcnR1YWxSZWZlcmVuY2UuREVQRU5ERU5DWV9UWVBFX0NPTlNVTUVTKSB7CisJCQkJTGlzdDxJVmlydHVhbFJlZmVyZW5jZT4gcmVmZXJlbmNlcyA9IGV4cGFuZENvbnN1bWVkUmVmZXJlbmNlKGNvbXBvbmVudCwgcmVmZXJlbmNlKTsKKwkJCQlmb3IgKEl0ZXJhdG9yPElWaXJ0dWFsUmVmZXJlbmNlPiBpdGVyYXRvciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworCQkJCQlhbGxSZWZzLmFkZChpdGVyYXRvci5uZXh0KCkpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCWFsbFJlZnMuYWRkKHJlZmVyZW5jZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGFsbFJlZnMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbYWxsUmVmcy5zaXplKCldKTsKKwl9CisJCisJLyoqCisJICogQHBhcmFtICBJVmlydHVhbENvbXBvbmVudCBvZiB0aGUgZW5jbG9zaW5nIGNvbXBvbmVudCB0aGF0IGlzIGRvaW5nIHRoZSBjb25zdW1pbmcKKwkgKiBAcGFyYW0gIElWaXJ0dWFsUmVmZXJlbmNlIG9mIHRoZSBjb25zdW1lZCByZWZlcmVuY2UKKwkgKiBAcmV0dXJuIExpc3QgY29udGFpbmluZyBhbiBJVmlydHVhbFJlZmVyZW5jZSBmb3IgYWxsIGFyY2hpdmVzIGNvbnN1bWVkIGJ5IHRoZSBlbmNsb3NpbmcgY29tcG9uZW50CisJICovCisJcHVibGljIHN0YXRpYyBMaXN0PElWaXJ0dWFsUmVmZXJlbmNlPiBleHBhbmRDb25zdW1lZFJlZmVyZW5jZShJVmlydHVhbENvbXBvbmVudCByb290Q29tcG9uZW50LCBJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJaWYgKHJlZmVyZW5jZS5nZXREZXBlbmRlbmN5VHlwZSgpIT1JVmlydHVhbFJlZmVyZW5jZS5ERVBFTkRFTkNZX1RZUEVfQ09OU1VNRVMpIHsKKwkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOworCQl9CisJCUxpc3QgPElWaXJ0dWFsUmVmZXJlbmNlPiBsaWJSZWZzID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbFJlZmVyZW5jZT4oKTsKKwkJdHJ5IHsKKwkJCUNsYXNzcGF0aExpYnJhcnlFeHBhbmRlciBjbGFzc3BhdGhMaWJFeHBhbmRlciA9IG5ldyBDbGFzc3BhdGhMaWJyYXJ5RXhwYW5kZXIocm9vdENvbXBvbmVudCwgcmVmZXJlbmNlKTsKKwkJCUxpc3Q8SUZsYXRGaWxlPiBmbGF0TGlicyA9IGNsYXNzcGF0aExpYkV4cGFuZGVyLmZldGNoRmxhdEZpbGVzKCk7CisJCQlmb3IgKElGbGF0RmlsZSBmbGF0RmlsZSA6IGZsYXRMaWJzKSB7CisJCQkJRmlsZSBmaWxlID0gKEZpbGUpIGZsYXRGaWxlLmdldEFkYXB0ZXIoRmlsZS5jbGFzcyk7CisJCQkJaWYgKGZpbGUgIT0gbnVsbCkgeworCQkJCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LkxJQkFSQ0hJVkVUWVBFICsgSVBhdGguU0VQQVJBVE9SOworCQkJCQlJVmlydHVhbENvbXBvbmVudCBkeW5hbWljQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KAorCQkJCQkJCXJvb3RDb21wb25lbnQuZ2V0UHJvamVjdCgpLCB0eXBlICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZmxhdEZpbGUuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkubWFrZUFic29sdXRlKCkpOworCQkJCQlJVmlydHVhbFJlZmVyZW5jZSBkeW5hbWljUmVmID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZWZlcmVuY2Uocm9vdENvbXBvbmVudCwgZHluYW1pY0NvbXBvbmVudCk7CisJCQkJCSgoVmlydHVhbFJlZmVyZW5jZSlkeW5hbWljUmVmKS5zZXREZXJpdmVkKHRydWUpOworCQkJCQlkeW5hbWljUmVmLnNldEFyY2hpdmVOYW1lKGZpbGUuZ2V0TmFtZSgpKTsKKwkJCQkJZHluYW1pY1JlZi5zZXRSdW50aW1lUGF0aChmbGF0RmlsZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5tYWtlQWJzb2x1dGUoKSk7CisJCQkJCWxpYlJlZnMuYWRkKGR5bmFtaWNSZWYpOworCQkJCX0KKwkJCX0JCisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCX0KKwkJcmV0dXJuIGxpYlJlZnM7CisJfQorCQogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCaW5hcnlUeXBlKElWaXJ0dWFsQ29tcG9uZW50IGFCaW5hcnlDb21wb25lbnQsIGludCBxdWlja1BlZWtUeXBlKXsKIAkJSmF2YUVFUXVpY2tQZWVrIHFwID0gSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLmdldEphdmFFRVF1aWNrUGVlayhhQmluYXJ5Q29tcG9uZW50KTsKIAkJaW50IHR5cGUgPSBxcC5nZXRUeXBlKCk7CiAJCXJldHVybiBxdWlja1BlZWtUeXBlID09IHR5cGU7CiAJfQogCQorCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0UXVpY2twZWVrUmVzdWx0KGludCB0eXBlKSB7CisJCXN3aXRjaCh0eXBlKXsKKwkJY2FzZSBKYXZhRUVRdWlja1BlZWsuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEU6CisJCQlyZXR1cm4gQVBQTElDQVRJT05fQ0xJRU5UOworCQljYXNlIEphdmFFRVF1aWNrUGVlay5XRUJfVFlQRToKKwkJCXJldHVybiBEWU5BTUlDX1dFQjsKKwkJY2FzZSBKYXZhRUVRdWlja1BlZWsuRUpCX1RZUEU6CisJCQlyZXR1cm4gRUpCOworCQljYXNlIEphdmFFRVF1aWNrUGVlay5DT05ORUNUT1JfVFlQRToKKwkJCXJldHVybiBKQ0E7CisJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkFQUExJQ0FUSU9OX1RZUEU6CisJCQlyZXR1cm4gRU5URVJQUklTRV9BUFBMSUNBVElPTjsKKwkJY2FzZSBKYXZhRUVRdWlja1BlZWsuV0VCRlJBR01FTlRfVFlQRToKKwkJCXJldHVybiBXRUJGUkFHTUVOVDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBVVElMSVRZOworCQl9CisJfQogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEoyRUVDb21wb25lbnRUeXBlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewogCQlpZiAobnVsbCAhPSBjb21wb25lbnQpIHsKIAkJCWlmIChjb21wb25lbnQuaXNCaW5hcnkoKSkgewogCQkJCUphdmFFRVF1aWNrUGVlayBxcCA9IEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci5nZXRKYXZhRUVRdWlja1BlZWsoY29tcG9uZW50KTsKLQkJCQlzd2l0Y2gocXAuZ2V0VHlwZSgpKXsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9DTElFTlRfVFlQRToKLQkJCQkJcmV0dXJuIEFQUExJQ0FUSU9OX0NMSUVOVDsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5XRUJfVFlQRToKLQkJCQkJcmV0dXJuIERZTkFNSUNfV0VCOwotCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkVKQl9UWVBFOgotCQkJCQlyZXR1cm4gRUpCOwotCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkNPTk5FQ1RPUl9UWVBFOgotCQkJCQlyZXR1cm4gSkNBOwotCQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkFQUExJQ0FUSU9OX1RZUEU6Ci0JCQkJCXJldHVybiBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBVVElMSVRZOwotCQkJCX0KKwkJCQlyZXR1cm4gY29udmVydFF1aWNrcGVla1Jlc3VsdChxcC5nZXRUeXBlKCkpOwogCQkJfQogCQkJcmV0dXJuIGdldEoyRUVQcm9qZWN0VHlwZShjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKIAkJfQogCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKIAl9CisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SjJFRUZpbGVUeXBlKElQYXRoIHBhdGgpIHsKKwkJaWYoIHBhdGggIT0gbnVsbCAmJiBwYXRoLnRvRmlsZSgpLmV4aXN0cygpICYmIHBhdGgudG9GaWxlKCkuaXNGaWxlKCkpIHsKKwkJCUphdmFFRVF1aWNrUGVlayBxcCA9IEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci5nZXRKYXZhRUVRdWlja1BlZWsocGF0aCk7CisJCQlyZXR1cm4gY29udmVydFF1aWNrcGVla1Jlc3VsdChxcC5nZXRUeXBlKCkpOworCQl9CisJCXJldHVybiBudWxsOworCX0KIAogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEoyRUVQcm9qZWN0VHlwZShJUHJvamVjdCBwcm9qZWN0KSB7CiAJCWlmIChudWxsICE9IHByb2plY3QgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewpAQCAtMjI5LDkgKzMwNywxMDEgQEAKIAkJCQlyZXR1cm4gU1RBVElDX1dFQjsKIAkJCWVsc2UgaWYgKGlzVXRpbGl0eVByb2plY3QoZmFjZXRlZFByb2plY3QpKQogCQkJCXJldHVybiBVVElMSVRZOworCQkJZWxzZSBpZiAoaXNXZWJGcmFnbWVudFByb2plY3QoZmFjZXRlZFByb2plY3QpKQorCQkJCXJldHVybiBXRUJGUkFHTUVOVDsKIAkJfQogCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKIAl9CisJCisJCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoZSBKYXZhIEVFIERlcGxveW1lbnQgRGVzY3JpcHRvciBleGlzdHMgZm9yIHRoZQorCSAqIHNwZWNpZmllZCBwcm9qZWN0LgorCSAqIAorCSAqIEBwYXJhbSB2aXJ0dWFsQ29tcG9uZW50CisJICogQHJldHVybgorCSAqIEBzZWUgI2dldERlcGxveW1lbnREZXNjcmlwdG9yUXVpY2tQZWVrKElQcm9qZWN0KQorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZXBsb3ltZW50RGVzY3JpcHRvckV4aXN0cyhJUHJvamVjdCBwcm9qZWN0KSB7CisJCUlWaXJ0dWFsRmlsZSBkZEZpbGUgPSBnZXRKYXZhRUVEZXBsb3ltZW50RGVzY3JpcHRvcihwcm9qZWN0KTsKKwkJcmV0dXJuIGRkRmlsZSAhPSBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBKYXZhRUVRdWlja1BlZWsgZm9yIHRoZSBKYXZhIEVFIERlcGxveW1lbnQgRGVzY3JpcHRvciBmb3IgdGhlCisJICogc3BlY2lmaWVkIHByb2plY3QuIElmIG5vIEphdmEgRUUgRGVwbG95bWVudCBEZXNjcmlwdG9yIGV4aXN0cyBudWxsIHdpbGwKKwkgKiBiZSByZXR1cm5lZC4KKwkgKiAKKwkgKiBAcGFyYW0gcHJvamVjdAorCSAqIEByZXR1cm4KKwkgKiBAc2VlICNkZXBsb3ltZW50RGVzY3JpcHRvckV4aXN0cyhJUHJvamVjdCkKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEphdmFFRVF1aWNrUGVlayBnZXREZXBsb3ltZW50RGVzY3JpcHRvclF1aWNrUGVlayhJUHJvamVjdCBwcm9qZWN0KSB7CisJCUlWaXJ0dWFsRmlsZSBkZEZpbGUgPSBnZXRKYXZhRUVEZXBsb3ltZW50RGVzY3JpcHRvcihwcm9qZWN0KTsKKwkJaWYgKGRkRmlsZSA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisJCXRyeSB7CisJCQlpbiA9IGRkRmlsZS5nZXRVbmRlcmx5aW5nRmlsZSgpLmdldENvbnRlbnRzKCk7CisJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gbmV3IEphdmFFRVF1aWNrUGVlayhpbik7CisJCQlyZXR1cm4gcXVpY2tQZWVrOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoaW4gIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCWluLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIElWaXJ0dWFsRmlsZSBmb3IgdGhlIEphdmEgRUUgRGVwbG95bWVudCBEZXNjcmlwdG9yIGZvciB0aGUKKwkgKiBzcGVjaWZpZWQgcHJvamVjdCBpZiBpdCBleGlzdHMuIFJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBKYXZhIEVFCisJICogRGVwbG95bWVudCBEZXNjcmlwdG9yCisJICogCisJICogQHBhcmFtIHZpcnR1YWxDb21wb25lbnQKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgSVZpcnR1YWxGaWxlIGdldEphdmFFRURlcGxveW1lbnREZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QpIHsKKwkJaWYgKHByb2plY3QgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisJCX0KKwkJU3RyaW5nIGRkVVJJID0gbnVsbDsKKwkJaWYgKGlzRUFSUHJvamVjdChwcm9qZWN0KSkgeworCQkJZGRVUkkgPSBKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSTsKKwkJfSBlbHNlIGlmIChpc0VKQlByb2plY3QocHJvamVjdCkpIHsKKwkJCWRkVVJJID0gSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJOworCQl9IGVsc2UgaWYgKGlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2plY3QpKSB7CisJCQlkZFVSSSA9IEoyRUVDb25zdGFudHMuQVBQX0NMSUVOVF9ERF9VUkk7CisJCX0gZWxzZSBpZiAoaXNKQ0FQcm9qZWN0KHByb2plY3QpKSB7CisJCQlkZFVSSSA9IEoyRUVDb25zdGFudHMuUkFSX0REX1VSSTsKKwkJfSBlbHNlIGlmIChpc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7CisJCQlkZFVSSSA9IEoyRUVDb25zdGFudHMuV0VCQVBQX0REX1VSSTsKKwkJfWVsc2UgaWYgKGlzV2ViRnJhZ21lbnRQcm9qZWN0KHByb2plY3QpKSB7CisJCQlkZFVSSSA9IEoyRUVDb25zdGFudHMuV0VCRlJBR01FTlRfRERfVVJJOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvamVjdDoiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGlzIG5vdCBhIEphdmEgRUUgUHJvamVjdCIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAorCQl9CisKKwkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOworCQlpZiAoY29tcCAhPSBudWxsKSB7CisJCQlJVmlydHVhbEZpbGUgdkZpbGUgPSBjb21wLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKG5ldyBQYXRoKGRkVVJJKSk7CisJCQlpZiAodkZpbGUuZXhpc3RzKCkpIHsKKwkJCQlyZXR1cm4gdkZpbGU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCQorCQorCQogCS8qKgogCSAqIFJldHVybnMgdGhlIEoyRUUgTW9kdWxlIHZlcnNpb24gYmFzZWQgb24gdGhlIEREIFhNTCBmaWxlCiAJICogQHBhcmFtIHByb2plY3QKQEAgLTI1NSw2ICs0MjUsOSBAQAogCQl9IGVsc2UgaWYgKGlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKIAkJCXR5cGUgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRTsKIAkJCWRkVVJJID0gSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJOworCQl9IGVsc2UgaWYgKGlzV2ViRnJhZ21lbnRQcm9qZWN0KHByb2plY3QpKSB7CisJCQl0eXBlID0gSjJFRVZlcnNpb25Db25zdGFudHMuV0VCRlJBR01FTlRfVFlQRTsKKwkJCWRkVVJJID0gSjJFRUNvbnN0YW50cy5XRUJGUkFHTUVOVF9ERF9VUkk7CiAJCX0gCiAKIAkJaWYodHlwZSAhPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKXsKQEAgLTI2NiwyMyArNDM5LDIzIEBACiAJCQkJCXRyeXsKIAkJCQkJCWluID0gdkZpbGUuZ2V0VW5kZXJseWluZ0ZpbGUoKS5nZXRDb250ZW50cygpOwogCQkJCQkJSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlayA9IG5ldyBKYXZhRUVRdWlja1BlZWsoaW4pOwotCQkJCQkJaW50IHZlcnMgPSAocXVpY2tQZWVrLmdldFZlcnNpb24oKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSA/IGdldEpFRVZlcnNpb24ocHJvamVjdCkgOiBxdWlja1BlZWsuZ2V0VmVyc2lvbigpOworCQkJCQkJaW50IHZlcnMgPSAocXVpY2tQZWVrLmdldFZlcnNpb24oKSA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSA/IGdldExhdGVzdFZlcnNpb24ocHJvamVjdCkgOiBxdWlja1BlZWsuZ2V0VmVyc2lvbigpOwogCQkJCQkJcmV0dXJuIEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvbkludFRvU3RyaW5nKHZlcnMpOwogCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKKwkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJCX0gZmluYWxseSB7CiAJCQkJCQlpZihpbiAhPSBudWxsKXsKIAkJCQkJCQl0cnkgewogCQkJCQkJCQlpbi5jbG9zZSgpOwogCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJfQogCQkJCQkKIAkJCQl9CiAJCQkJZWxzZQotCQkJCQlyZXR1cm4gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcoZ2V0SkVFVmVyc2lvbihwcm9qZWN0KSk7CisJCQkJCXJldHVybiBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyhnZXRMYXRlc3RWZXJzaW9uKHByb2plY3QpKTsKIAkJCX0KIAkJfQogCQkKQEAgLTI5MCwxMyArNDYzLDE3IEBACiAJfQogCiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0SkVFVmVyc2lvbihJUHJvamVjdCBwcm9qZWN0KSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IGdldExhdGVzdFZlcnNpb24oSVByb2plY3QgcHJvamVjdCkgewogCQlpZiAoaXNFQVJQcm9qZWN0KHByb2plY3QpIHx8IGlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2plY3QpKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wOworCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNl8wOwogCQlpZiAoaXNFSkJQcm9qZWN0KHByb2plY3QpKQotCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wOworCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18xOwogCQlpZiAoaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkKLQkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzJfNTsKKwkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzNfMDsKKwkJaWYgKGlzV2ViRnJhZ21lbnRQcm9qZWN0KHByb2plY3QpKQorCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fM18wOworCQlpZiAoaXNKQ0FQcm9qZWN0KHByb2plY3QpKQorCQkJcmV0dXJuIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV82OwogCQlyZXR1cm4gSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTjsKIAkJCQogCX0KQEAgLTMxMyw2NiArNDkwLDc1IEBACiAJICogCiAJICogQHBhcmFtIGNvbXBvbmVudAogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIEphdmEgRUUgdmVyc2lvbiA1IG9yIGdyZWF0ZXIsIGZhbHNlIG90aGVyd2lzZQorCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIGNvbXBvbmVudCBpcyBudWxsCiAJICovCiAJcHVibGljIHN0YXRpYyBib29sZWFuIGlzSkVFQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCl7CisJCWlmKGNvbXBvbmVudCA9PSBudWxsKXsKKwkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworCQl9CisJCQogCQlpZihjb21wb25lbnQuaXNCaW5hcnkoKSl7CiAJCQlKYXZhRUVRdWlja1BlZWsgcXAgPSBKYXZhRUVCaW5hcnlDb21wb25lbnRIZWxwZXIuZ2V0SmF2YUVFUXVpY2tQZWVrKGNvbXBvbmVudCk7CiAJCQlpbnQgamF2YUVFVmVyc2lvbiA9IHFwLmdldEphdmFFRVZlcnNpb24oKTsKIAkJCXJldHVybiBqYXZhRUVWZXJzaW9uID49IEoyRUVDb25zdGFudHMuSkVFXzVfMF9JRDsKLQkJfSBlbHNlIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBjb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkJCi0JCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24gPSBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKHByb2plY3QsIEVOVEVSUFJJU0VfQVBQTElDQVRJT04pOwotCQkJaWYoZmFjZXRWZXJzaW9uICE9IG51bGwpewotCQkJCWlmKGZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkVOVEVSUFJJU0VfQVBQTElDQVRJT05fMTIgfHwKLQkJCQkgICBmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OXzEzIHx8Ci0JCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuRU5URVJQUklTRV9BUFBMSUNBVElPTl8xNCl7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkKLQkJCWZhY2V0VmVyc2lvbiA9IGdldFByb2plY3RGYWNldFZlcnNpb24ocHJvamVjdCwgQVBQTElDQVRJT05fQ0xJRU5UKTsKLQkJCWlmKGZhY2V0VmVyc2lvbiAhPSBudWxsKXsKLQkJCQlpZihmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfMTIgfHwKLQkJCQkgICBmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfMTMgfHwKLQkJCQkgICBmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfMTQpewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCQlmYWNldFZlcnNpb24gPSBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKHByb2plY3QsIEVKQik7Ci0JCQlpZihmYWNldFZlcnNpb24gIT0gbnVsbCl7Ci0JCQkJaWYoZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuRUpCXzExIHx8Ci0JCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuRUpCXzIwIHx8Ci0JCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuRUpCXzIxKXsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJZmFjZXRWZXJzaW9uID0gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihwcm9qZWN0LCBEWU5BTUlDX1dFQik7Ci0JCQlpZihmYWNldFZlcnNpb24gIT0gbnVsbCl7Ci0JCQkJaWYoZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfMjIgfHwKLQkJCQkgICBmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQl8yMyB8fAotCQkJCSAgIGZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkRZTkFNSUNfV0VCXzI0KXsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJZmFjZXRWZXJzaW9uID0gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihwcm9qZWN0LCBKQ0EpOwotCQkJaWYoZmFjZXRWZXJzaW9uICE9IG51bGwpewotCQkJCWlmKGZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkpDQV8xMCB8fAotCQkJCSAgIGZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkpDQV8xNSApewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gZmFsc2U7CiAJCX0KKwkJSVByb2plY3QgcHJvamVjdCA9IGNvbXBvbmVudC5nZXRQcm9qZWN0KCk7CisJCQorCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24gPSBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKHByb2plY3QsIEVOVEVSUFJJU0VfQVBQTElDQVRJT04pOworCQlpZihmYWNldFZlcnNpb24gIT0gbnVsbCl7CisJCQlpZihmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OXzEyIHx8CisJCQkgICBmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OXzEzIHx8CisJCQkgICBmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OXzE0KXsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJZmFjZXRWZXJzaW9uID0gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihwcm9qZWN0LCBBUFBMSUNBVElPTl9DTElFTlQpOworCQlpZihmYWNldFZlcnNpb24gIT0gbnVsbCl7CisJCQlpZihmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfMTIgfHwKKwkJCSAgIGZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF8xMyB8fAorCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UXzE0KXsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJZmFjZXRWZXJzaW9uID0gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihwcm9qZWN0LCBFSkIpOworCQlpZihmYWNldFZlcnNpb24gIT0gbnVsbCl7CisJCQlpZihmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5FSkJfMTEgfHwKKwkJCSAgIGZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkVKQl8yMCB8fAorCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuRUpCXzIxKXsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJZmFjZXRWZXJzaW9uID0gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihwcm9qZWN0LCBEWU5BTUlDX1dFQik7CisJCWlmKGZhY2V0VmVyc2lvbiAhPSBudWxsKXsKKwkJCWlmKGZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkRZTkFNSUNfV0VCXzIyIHx8CisJCQkgICBmYWNldFZlcnNpb24gPT0gSUoyRUVGYWNldENvbnN0YW50cy5EWU5BTUlDX1dFQl8yMyB8fAorCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuRFlOQU1JQ19XRUJfMjQpeworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJCXJldHVybiB0cnVlOworCQl9CisJCQorCQlmYWNldFZlcnNpb24gPSBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKHByb2plY3QsIEpDQSk7CisJCWlmKGZhY2V0VmVyc2lvbiAhPSBudWxsKXsKKwkJCWlmKGZhY2V0VmVyc2lvbiA9PSBJSjJFRUZhY2V0Q29uc3RhbnRzLkpDQV8xMCB8fAorCQkJICAgZmFjZXRWZXJzaW9uID09IElKMkVFRmFjZXRDb25zdGFudHMuSkNBXzE1ICl7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJCisJCWZhY2V0VmVyc2lvbiA9IGdldFByb2plY3RGYWNldFZlcnNpb24ocHJvamVjdCwgV0VCRlJBR01FTlQpOworCQlpZihmYWNldFZlcnNpb24gIT0gbnVsbCl7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAkKIAkvKioKQEAgLTQ0MiwyNCArNjI4LDI3IEBACiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9CiAJCQkKKwkJCWZhY2V0VmVyc2lvbiA9IGdldFByb2plY3RGYWNldFZlcnNpb24ocHJvamVjdCwgV0VCRlJBR01FTlQpOworCQkJaWYoZmFjZXRWZXJzaW9uICE9IG51bGwpeworCQkJCXJldHVybiB0cnVlOworCQkJfQogCQkJcmV0dXJuIGZhbHNlOwogCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGRkVmVyc2lvbiA9IGdldEoyRUVERFByb2plY3RWZXJzaW9uKHByb2plY3QpOwotCQkJaW50IGoyZWVMZXZlbCA9IDA7Ci0JCQlpZiAoaXNFQVJQcm9qZWN0KHByb2plY3QpKQotCQkJCWoyZWVMZXZlbCA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KGRkVmVyc2lvbik7Ci0JCQllbHNlIGlmIChpc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKQotCQkJCWoyZWVMZXZlbCA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0V2ViVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRChkZFZlcnNpb24pOwotCQkJZWxzZSBpZiAoaXNFSkJQcm9qZWN0KHByb2plY3QpKQotCQkJCWoyZWVMZXZlbCA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0RUpCVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRChkZFZlcnNpb24pOwotCQkJZWxzZSBpZiAoaXNKQ0FQcm9qZWN0KHByb2plY3QpKQotCQkJCWoyZWVMZXZlbCA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0Q29ubmVjdG9yVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRChkZFZlcnNpb24pOwotCQkJZWxzZSBpZiAoaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvamVjdCkpCi0JCQkJajJlZUxldmVsID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRBcHBDbGllbnRWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKGRkVmVyc2lvbik7Ci0JCQkKLQkJCXJldHVybiBqMmVlTGV2ZWwgPj0gSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRDsKLQkJfQorCQlTdHJpbmcgZGRWZXJzaW9uID0gZ2V0SjJFRUREUHJvamVjdFZlcnNpb24ocHJvamVjdCk7CisJCWludCBqMmVlTGV2ZWwgPSAwOworCQlpZiAoaXNFQVJQcm9qZWN0KHByb2plY3QpKQorCQkJajJlZUxldmVsID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQoZGRWZXJzaW9uKTsKKwkJZWxzZSBpZiAoaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkKKwkJCWoyZWVMZXZlbCA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0V2ViVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRChkZFZlcnNpb24pOworCQllbHNlIGlmIChpc0VKQlByb2plY3QocHJvamVjdCkpCisJCQlqMmVlTGV2ZWwgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydEVKQlZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQoZGRWZXJzaW9uKTsKKwkJZWxzZSBpZiAoaXNKQ0FQcm9qZWN0KHByb2plY3QpKQorCQkJajJlZUxldmVsID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRDb25uZWN0b3JWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKGRkVmVyc2lvbik7CisJCWVsc2UgaWYgKGlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2plY3QpKQorCQkJajJlZUxldmVsID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRBcHBDbGllbnRWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKGRkVmVyc2lvbik7CisJCWVsc2UgaWYgKGlzV2ViRnJhZ21lbnRQcm9qZWN0KHByb2plY3QpKQorCQkJajJlZUxldmVsID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRXZWJGcmFnbWVudFZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQoZGRWZXJzaW9uKTsKKwkJcmV0dXJuIGoyZWVMZXZlbCA+PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KRUVfNV8wX0lEOwogCX0KIAkKIAkvKioKQEAgLTQ3MSw1ICs2NjAsMzYgQEAKIAlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZWdhY3lKMkVFQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCl7CiAJCXJldHVybiAhaXNKRUVDb21wb25lbnQoY29tcG9uZW50KTsKIAl9CisJLyoqCisJICogVGhpcyBjaGVja3MgdGhlIGNvbXBvbmVudCBwYXNzZWQgaWYgaXQgaXMgYW55IG9mIHRoZSAiYmxlc3NlZCIgY29tcG9uZW50IHR5cGVzCisJICogCisJICogQHBhcmFtIGNvbXBvbmVudAorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIGFueSBvZiB0aGUgSmF2YUVFIHR5cGVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VzSmF2YUVFQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCl7CisJCQorCQlpZiAoY29tcG9uZW50ICE9IG51bGwgJiYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50IAorCQkJCXx8IGNvbXBvbmVudCBpbnN0YW5jZW9mIEVBUlZpcnR1YWxDb21wb25lbnQKKwkJCQl8fCBjb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpKQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VVJJKElWaXJ0dWFsQ29tcG9uZW50IGNvbXApIHsKKwkJU3RyaW5nIG5hbWUgPSBudWxsOworCQkvL0ZpcnN0IGZpbmQgVVJJIGNvbnRhaW5lZCBpbiBFQVIKKwkJSVByb2plY3RbXSBlYXJQcm9qZWN0cyA9IEVhclV0aWxpdGllcy5nZXRSZWZlcmVuY2luZ0VBUlByb2plY3RzKGNvbXAuZ2V0UHJvamVjdCgpKTsKKwkJaWYgKGVhclByb2plY3RzLmxlbmd0aCA+IDApIHsKKwkJCUlNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihlYXJQcm9qZWN0c1swXSk7CisJCQlpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBJRUFSTW9kZWxQcm92aWRlcikJeworCQkJCW5hbWUgPSAoKElFQVJNb2RlbFByb3ZpZGVyKXByb3ZpZGVyKS5nZXRNb2R1bGVVUkkoY29tcCk7CisJCQl9CisJCX0KKwkJLy9JZiBub3QgZm91bmQsIHRoZW4gcmV0dXJuIHRoZSBkZWZhdWx0IG5hbWUgZnJvbSB0aGUgTW9kdWxlQ29yZSBBUEkKKwkJaWYoIG5hbWUgPT0gbnVsbCB8fCBuYW1lID09ICIiICl7IC8vJE5PTi1OTFMtMSQgCisJCQlyZXR1cm4gVmlydHVhbFJlZmVyZW5jZVV0aWxpdGllcy5JTlNUQU5DRS5nZXREZWZhdWx0UHJvamVjdEFyY2hpdmVOYW1lKGNvbXApOworCQl9CisJCXJldHVybiBuYW1lOworCX0KIAkKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvU2luZ2xlUm9vdFV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvU2luZ2xlUm9vdFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1MDM0Zi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L1NpbmdsZVJvb3RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LlNpbmdsZVJvb3RTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFNpbmdsZVJvb3RVdGlsIHsKLQkKLQkvKiogCi0JICogVXNlZCB0byByZXR1cm4gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZpcnN0IGVycm9yIGNvZGUgaXMgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9GSVJTVF9FUlJPUiA9IDB4MDg7Ci0JLyoqIAotCSAqIFVzZWQgdG8gY2FwdHVyZSBhbGwgc3RhdHVzIGNvZGVzIChlcnJvciwgaW5mbywgd2FybmluZykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9BTEwgPSAweDA3OwotCS8qKiAKLQkgKiBVc2VkIHRvIGNhcHR1cmUgYWxsIGVycm9yIGFuZCB3YXJuaW5nIHN0YXR1cyBjb2Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0VSUk9SU19BTkRfV0FSTklOR1MgPSAweDA2OwotCS8qKiAKLQkgKiBVc2VkIHRvIGNhcHR1cmUgYWxsIGVycm9yIHN0YXR1cyBjb2Rlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0VSUk9SUyA9IDB4MDQ7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdTID0gMHgwMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IDB4MDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAweDA7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFVTRV9TSU5HTEVfUk9PVF9QUk9QRVJUWSA9ICJ1c2VTaW5nbGVSb290IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50OwotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBjYWNoZWRTb3VyY2VDb250YWluZXJzOwotCXByaXZhdGUgSUNvbnRhaW5lcltdIGNhY2hlZE91dHB1dENvbnRhaW5lcnM7Ci0JcHJpdmF0ZSBib29sZWFuIGlzU2luZ2xlSmF2YU91dHB1dE5vblNvdXJjZTsKLQlwcml2YXRlIE11bHRpU3RhdHVzIHdyYXBwZXJTdGF0dXM7Ci0JcHJpdmF0ZSBpbnQgSU5DTFVERV9GTEFHOwotCQotCXB1YmxpYyBTaW5nbGVSb290VXRpbChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1vZHVsZSBoYXMgYSBzaW1wbGUgc3RydWN0dXJlIGJhc2VkIG9uIGEKLQkgKiBzaW5nbGUgcm9vdCBmb2xkZXIsIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICoKLQkgKiBJbiBhIHNpbmdsZSByb290IHN0cnVjdHVyZSwgYWxsIGZpbGVzIHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHJvb3QgZm9sZGVyCi0JICogYXJlIHBhcnQgb2YgdGhlIG1vZHVsZSwgYW5kIGFyZSBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IG1vZHVsZSBzdHJ1Y3R1cmUuIE5vCi0JICogbW9kdWxlIHJlc291cmNlcyBleGlzdCBvdXRzaWRlIG9mIHRoaXMgc2luZ2xlIGZvbGRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBtb2R1bGUgaGFzIGEgc2luZ2xlIHJvb3Qgc3RydWN0dXJlLCBhbmQKLQkgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xlUm9vdCgpIHsKLQkJcmV0dXJuIHZhbGlkYXRlU2luZ2xlUm9vdChJTkNMVURFX0ZJUlNUX0VSUk9SKS5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1I7Ci0JfQotCi0JLyoqCi0JICogIFZhbGlkYXRlcyB3aGV0aGVyIHRoZSBjb21wb25lbnQgbW9kdWxlIGhhcyBhIHNpbmdsZSByb290IHN0cnVjdHVyZS4KLQkgKiAgQW4gSVN0YXR1cyB3aXRoIGEgc2V2ZXJpdHkgb2YgT0sgaXMgcmV0dXJuZWQgZm9yIGEgdmFsaWQgc2luZ2xlIHJvb3QgCi0JICogIHN0cnVjdHVyZS4gIEEgTXVsdGlTdGF0dXMgY29udGFpbmluZyBjaGlsZHJlbiBvZiB0eXBlIElTaW5nbGVSb290U3RhdHVzCi0JICogIGlzIHJldHVybmVkIGlmIGFueSBzdGF0dXMgY29kZXMgd2VyZSBjYXB0dXJlZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24uCi0JICogIEEgTXVsdGlTdGF0dXMgd2l0aCBhIHNldmVyaXR5IG9mIElORk8gb3IgV0FSTklORyBpcyByZXR1cm5lZCBmb3IgYSB2YWxpZCAKLQkgKiAgc2luZ2xlIHJvb3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgc3RhdHVzIGNvZGVzIHdpdGggbm8gc2V2ZXJpdGllcyBvZiBFUlJPUi4KLQkgKiAgQSBNdWx0aVN0YXR1cyB3aXRoIGEgc2V2ZXJpdHkgb2YgRVJST1IgbWVhbnMgdGhlIGNvbXBvbmVudCBkb2VzIG5vdCBoYXZlIGEKLQkgKiAgdmFsaWQgc2luZ2xlIHJvb3Qgc3RydWN0dXJlLgotCSAqICAKLQkgKiBAcGFyYW0gZmxhZyAtIGluZGljYXRlcyB0aGUgc3RhdHVzIGNvZGVzIChieSBzZXZlcml0eSkgdG8gY2FwdHVyZSAKLQkgKiAgICAgICAgICAgICAgIGR1cmluZyB0aGUgdmFsaWRhdGlvbi4gIAotCSAqICAgICAgICAgICAgICAgVmFsaWQgZmxhZ3MgYXJlOiBJTkNMVURFX0ZJUlNUX0VSUk9SCi0JICogICAgICAgICAgICAgICAJCQkJICBJTkNMVURFX0FMTAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMVURFX0VSUk9SU19BTkRfV0FSTklOR1MKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5DTFVERV9FUlJPUlMKLQkgKiAgICAgICAgICAgICAgIAotCSAqIEByZXR1cm4gSVN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU2luZ2xlUm9vdChpbnQgZmxhZykgewotCQlJTkNMVURFX0ZMQUcgPSBmbGFnOwotCQlpc1NpbmdsZUphdmFPdXRwdXROb25Tb3VyY2UgPSBmYWxzZTsKLQkJd3JhcHBlclN0YXR1cyA9IG51bGw7Ci0JCVN0cnVjdHVyZUVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChnZXRQcm9qZWN0KCkpOwotCQkJaWYgKGVkaXQgPT0gbnVsbCB8fCBlZGl0LmdldENvbXBvbmVudCgpID09IG51bGwpIHsKLQkJCQlyZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuTk9fQ09NUE9ORU5UX0ZPVU5EKTsKLQkJCQlyZXR1cm4gZ2V0U3RhdHVzKCk7Ci0JCQl9Ci0JCQotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdiQ29tcCA9IGVkaXQuZ2V0Q29tcG9uZW50KCk7Ci0JCQlMaXN0IHJlc291cmNlTWFwcyA9IHdiQ29tcC5nZXRSZXNvdXJjZXMoKTsKLQkJCQotCQkJLy8gMjI5NjUwIC0gY2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9wZXJ0eSAndXNlU2luZ2xlUm9vdCcgaXMgZGVmaW5lZC4gSWYgaXQgaXMgc2V0IGFuZAotCQkJLy8gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpcyB0cnVlIHRoZW4gaXQgd2lsbCBvdmVycmlkZSB0aGUgbG9naWMgY2hlY2tzIGJlbG93Ci0JCQlmaW5hbCBMaXN0IGNvbXBvbmVudFByb3BlcnRpZXMgPSB3YkNvbXAuZ2V0UHJvcGVydGllcygpOwotCQkJaWYgKGNvbXBvbmVudFByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJCWZpbmFsIEl0ZXJhdG9yIGNvbXBvbmVudFByb3BlcnRpZXNJdGVyYXRvciA9IGNvbXBvbmVudFByb3BlcnRpZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoY29tcG9uZW50UHJvcGVydGllc0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlQcm9wZXJ0eSB3YlByb3BlcnR5ID0gKFByb3BlcnR5KSBjb21wb25lbnRQcm9wZXJ0aWVzSXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoVVNFX1NJTkdMRV9ST09UX1BST1BFUlRZLmVxdWFscyh3YlByb3BlcnR5LmdldE5hbWUoKSkpIHsKLQkJCQkJCWJvb2xlYW4gdXNlU2luZ2xlUm9vdCA9IEJvb2xlYW4udmFsdWVPZih3YlByb3BlcnR5LmdldFZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJaWYgKHVzZVNpbmdsZVJvb3QpIHsKLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmVwb3J0U3RhdHVzKElTaW5nbGVSb290U3RhdHVzLkVYUExJQ0lUTFlfRElTQUJMRUQpOwotCQkJCQkJCXJldHVybiBnZXRTdGF0dXMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGdldFByb2plY3QoKSkpIHsKLQkJCQkvLyBBbHdheXMgcmV0dXJuIGZhbHNlIGZvciBFQVJzIHNvIHRoYXQgbWVtYmVycyBmb3IgRUFSIGFyZSBhbHdheXMgY2FsY3VsYXRlZCBhbmQgajJlZSBtb2R1bGVzIGFyZSBmaWx0ZXJlZCBvdXQKLQkJCQlyZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuRUFSX1BST0pFQ1RfRk9VTkQpOwotCQkJCXJldHVybiBnZXRTdGF0dXMoKTsKLQkJCX0KLQkJCQotCQkJLy8gaWYgdGhlcmUgYXJlIGFueSBsaW5rZWQgcmVzb3VyY2VzIHRoZW4gdGhpcyBpcyBub3QgYSBzaW5nbGUtcm9vdCBtb2R1bGUKLQkJCWlmIChyb290Rm9sZGVyc0hhdmVMaW5rZWRDb250ZW50KCkpIHsKLQkJCQlyZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuTElOS0VEX1JFU09VUkNFU19GT1VORCk7IAotCQkJCXJldHVybiBnZXRTdGF0dXMoKTsKLQkJCX0KLQkJCQotCQkJLy8gSWYgdGhlIGxpc3QgaXMgZW1wdHksIHJldHVybiBmYWxzZQotCQkJaWYgKHJlc291cmNlTWFwcy5zaXplKCkgPCAxKSB7Ci0JCQkJcmVwb3J0U3RhdHVzKElTaW5nbGVSb290U3RhdHVzLk5PX1JFU09VUkNFX01BUFNfRk9VTkQpOwotCQkJCXJldHVybiBnZXRTdGF0dXMoKTsKLQkJCX0KLQkJCQotCQkJaWYgKHJlc291cmNlTWFwcy5zaXplKCkgPT0gMSkgewotCQkJCUNvbXBvbmVudFJlc291cmNlIG1hcHBpbmcgPSAoQ29tcG9uZW50UmVzb3VyY2UpcmVzb3VyY2VNYXBzLmdldCgwKTsgCi0JCQkJaWYgKG1hcHBpbmcuZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMoUGF0aC5ST09UKSkgewotCQkJCQlJUmVzb3VyY2Ugc291cmNlUmVzb3VyY2UgPSBnZXRQcm9qZWN0KCkuZmluZE1lbWJlcihtYXBwaW5nLmdldFNvdXJjZVBhdGgoKSk7Ci0JCQkJCWlmIChzb3VyY2VSZXNvdXJjZSAhPSBudWxsICYmIHNvdXJjZVJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCQlJUGF0aCBzb3VyY2VQYXRoID0gZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkuYXBwZW5kKG1hcHBpbmcuZ2V0U291cmNlUGF0aCgpKTsKLQkJCQkJCWlmICghaXNTb3VyY2VDb250YWluZXIoc291cmNlUGF0aCkpIHsKLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChnZXRQcm9qZWN0KCkpKSB7Ci0JCQkJLy92YWxpZGF0ZSB3ZWIgcHJvamVjdHMgZm9yIHNpbmdsZSByb290Ci0JCQkJdmFsaWRhdGVXZWJQcm9qZWN0KHJlc291cmNlTWFwcyk7Ci0JCQl9IAotCQkJZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QoZ2V0UHJvamVjdCgpKSB8fCBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChnZXRQcm9qZWN0KCkpCi0JCQkJCXx8IEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoZ2V0UHJvamVjdCgpKSB8fCBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QoZ2V0UHJvamVjdCgpKSkgewotCQkJCQotCQkJCXZhbGlkYXRlUHJvamVjdChyZXNvdXJjZU1hcHMpOwotCQkJfQotCQkJLy9yZXR1cm4gdGhlIGN1cnJlbnQgc3RhdHVzCi0JCQlyZXR1cm4gZ2V0U3RhdHVzKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQljYWNoZWRPdXRwdXRDb250YWluZXJzID0gbnVsbDsKLQkJCWNhY2hlZFNvdXJjZUNvbnRhaW5lcnMgPSBudWxsOwotCQkJaWYgKGVkaXQgIT0gbnVsbCkKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVByb2plY3QoTGlzdCByZXNvdXJjZU1hcHMpIHsJCi0JCS8vIEVuc3VyZSB0aGVyZSBhcmUgb25seSBzb3VyY2UgZm9sZGVyIGNvbXBvbmVudCByZXNvdXJjZSBtYXBwaW5ncyB0byB0aGUgcm9vdCBjb250ZW50IGZvbGRlcgotCQlpZiAoaXNSb290UmVzb3VyY2VNYXBwaW5nKHJlc291cmNlTWFwcykpIHsKLQkJCUlDb250YWluZXJbXSBqYXZhT3V0cHV0Rm9sZGVycyA9IGdldEphdmFPdXRwdXRGb2xkZXJzKCk7Ci0JCQkvLyBWZXJpZnkgb25seSBvbmUgamF2YSBvdXRwdXRmb2xkZXIKLQkJCWlmIChqYXZhT3V0cHV0Rm9sZGVycy5sZW5ndGg9PTEpIHsKLQkJCQkvLyBCeSB0aGUgdGltZSB3ZSBnZXQgaGVyZSB3ZSBrbm93OiBmb3IgYW55IGZvbGRlcnMgZGVmaW5lZCBhcyBzb3VyY2UgaW4gdGhlIAotCQkJCS8vIC5jb21wb25lbnQgZmlsZSB0aGF0IHRoZXkgYXJlIGFsc28gamF2YSBzb3VyY2UgZm9sZGVycy4KLQkJCQlpZiAoIWlzU291cmNlQ29udGFpbmVyKGphdmFPdXRwdXRGb2xkZXJzWzBdLmdldEZ1bGxQYXRoKCkpKSB7Ci0JCQkJCS8vIFRoZSBzaW5nbGUgb3V0cHV0IGZvbGRlciBpcyBOT1QgYSBzb3VyY2UgZm9sZGVyIHNvIHRoaXMgaXMgc2luZ2xlLXJvb3RlZC4gU2luY2UgdGhlCi0JCQkJCS8vIG91dHB1dCBmb2xkZXIgKHNvbWV0aGluZyBsaWtlIGNsYXNzZXMgb3IgYmluKSBpcyBub3QgYSBzb3VyY2UgZm9sZGVyLCBKRFQgY29waWVzIGFsbCBmaWxlcwotCQkJCQkvLyAoaW5jbHVkaW5nIG5vbiBKYXZhIGZpbGVzKSB0byB0aGlzIGZvbGRlciwgc28gZXZlcnkgcmVzb3VyY2UgbmVlZGVkIGF0IHJ1bnRpbWUgaXMgbG9jYXRlZCAKLQkJCQkJLy8gaW4gYSBzaW5nbGUgZGlyZWN0b3J5LgotCQkJCQlpc1NpbmdsZUphdmFPdXRwdXROb25Tb3VyY2UgID0gdHJ1ZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0gCi0JCQkJLy8gVmVyaWZ5IHRoZSBqYXZhIG91dHB1dCBmb2xkZXIgaXMgdGhlIHNhbWUgYXMgb25lIG9mIHRoZSBjb250ZW50IHJvb3RzCi0JCQkJSVBhdGggamF2YU91dHB1dFBhdGggPSBnZXRKYXZhT3V0cHV0Rm9sZGVycygpWzBdLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCQlJQ29udGFpbmVyW10gcm9vdEZvbGRlcnMgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHJvb3RGb2xkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlQYXRoIGNvbXBSb290UGF0aCA9IHJvb3RGb2xkZXJzW2ldLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJCQkJaWYgKGphdmFPdXRwdXRQYXRoLmVxdWFscyhjb21wUm9vdFBhdGgpKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlyZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuSkFWQV9PVVRQVVRfTk9UX0FfQ09OVEVOVF9ST09UKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlcG9ydFN0YXR1cyhJU2luZ2xlUm9vdFN0YXR1cy5KQVZBX09VVFBVVF9HUkVBVEVSX1RIQU5fMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVXZWJQcm9qZWN0KExpc3QgcmVzb3VyY2VNYXBzKSB7Ci0JCS8vIEVuc3VyZSB0aGVyZSBhcmUgb25seSBiYXNpYyBjb21wb25lbnQgcmVzb3VyY2UgbWFwcGluZ3MgLS0gb25lIGZvciB0aGUgY29udGVudCBmb2xkZXIgCi0JCS8vIGFuZCBhbnkgZm9yIHNyYyBmb2xkZXJzIG1hcHBlZCB0byBXRUItSU5GL2NsYXNzZXMKLQkJaWYgKGhhc0RlZmF1bHRXZWJSZXNvdXJjZU1hcHBpbmdzKHJlc291cmNlTWFwcykpIHsKLQkJCS8vIFZlcmlmeSBvbmx5IG9uZSBqYXZhIG91dHB1dCBmb2xkZXIKLQkJCWlmIChnZXRKYXZhT3V0cHV0Rm9sZGVycygpLmxlbmd0aD09MSkgewotCQkJCS8vIFZlcmlmeSB0aGUgamF2YSBvdXRwdXQgZm9sZGVyIGlzIHRvIDxjb250ZW50IHJvb3Q+L1dFQi1JTkYvY2xhc3NlcwotCQkJCUlQYXRoIGphdmFPdXRwdXRQYXRoID0gZ2V0SmF2YU91dHB1dEZvbGRlcnMoKVswXS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQkJSVBhdGggY29tcFJvb3RQYXRoID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJCWlmIChjb21wUm9vdFBhdGguYXBwZW5kKEoyRUVDb25zdGFudHMuV0VCX0lORl9DTEFTU0VTKS5lcXVhbHMoamF2YU91dHB1dFBhdGgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlcG9ydFN0YXR1cyhJU2luZ2xlUm9vdFN0YXR1cy5KQVZBX09VVFBVVF9OT1RfV0VCSU5GX0NMQVNTRVMpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlcG9ydFN0YXR1cyhJU2luZ2xlUm9vdFN0YXR1cy5KQVZBX09VVFBVVF9HUkVBVEVSX1RIQU5fMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGZvbGRlcnMgY29udGFpbmluZyBKYXZhIG91dHB1dCBpbiB0aGlzIG1vZHVsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgcG9zc2libHktZW1wdHkgYXJyYXkgb2YgSmF2YSBvdXRwdXQgZm9sZGVycwotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0SmF2YU91dHB1dEZvbGRlcnMoKSB7Ci0JCWlmIChjYWNoZWRPdXRwdXRDb250YWluZXJzID09IG51bGwpCi0JCQljYWNoZWRPdXRwdXRDb250YWluZXJzID0gZ2V0SmF2YU91dHB1dEZvbGRlcnMoZ2V0UHJvamVjdCgpKTsKLQkJcmV0dXJuIGNhY2hlZE91dHB1dENvbnRhaW5lcnM7Ci0JfQotCQotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0SmF2YU91dHB1dEZvbGRlcnMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ29udGFpbmVyWzBdOwotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0T3V0cHV0Q29udGFpbmVycyhwcm9qZWN0KTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBwYXRoIGFyZ3VtZW50IGlzIHRvIGEgc291cmNlIGNvbnRhaW5lciBmb3IgdGhlIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGEgd29ya3NwYWNlIHJlbGF0aXZlIGZ1bGwgcGF0aAotCSAqIEByZXR1cm4gaXMgcGF0aCBhIHNvdXJjZSBjb250YWluZXI/Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzU291cmNlQ29udGFpbmVyKElQYXRoIHBhdGgpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBzcmNDb250YWluZXJzID0gZ2V0U291cmNlQ29udGFpbmVycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNyY0NvbnRhaW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzcmNDb250YWluZXJzW2ldLmdldFBhdGgoKS5lcXVhbHMocGF0aCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290W10gZ2V0U291cmNlQ29udGFpbmVycygpIHsKLQkJaWYgKGNhY2hlZFNvdXJjZUNvbnRhaW5lcnMgPT0gbnVsbCkKLQkJCWNhY2hlZFNvdXJjZUNvbnRhaW5lcnMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRTb3VyY2VDb250YWluZXJzKGdldFByb2plY3QoKSk7Ci0JCXJldHVybiBjYWNoZWRTb3VyY2VDb250YWluZXJzOwotCX0KLQkKLQkvKgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm9vdCBmb2xkZXJzIG9mIHRoaXMgY29tcG9uZW50IGhhdmUgYW55IGxpbmtlZCByZXNvdXJjZXMgKGZvbGRlciBvciBmaWxlKTsKLSAgICAgKiBPdGhlcndpc2UgZmFsc2UgaXMgcmV0dXJuZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHJvb3RGb2xkZXJzSGF2ZUxpbmtlZENvbnRlbnQoKSB7Ci0gICAgCWlmICh0aGlzLmNvbXBvbmVudCAhPSBudWxsKSB7Ci0gICAgCQlmaW5hbCBJQ29udGFpbmVyW10gcm9vdEZvbGRlcnMgPSB0aGlzLmNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcnMoKTsKLSAgICAJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdEZvbGRlcnMubGVuZ3RoOyBpKyspIHsKLSAgICAJCQl0cnkgewotICAgIAkJCQlib29sZWFuIGhhc0xpbmtlZENvbnRlbnQgPSB0aGlzLmhhc0xpbmtlZENvbnRlbnQocm9vdEZvbGRlcnNbaV0pOwotICAgIAkJCQlpZiAoaGFzTGlua2VkQ29udGVudCkgewotICAgIAkJCQkJcmV0dXJuIHRydWU7Ci0gICAgCQkJCX0KLSAgICAJCQl9Ci0gICAgCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY29yZUV4KSB7Ci0gICAgCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoY29yZUV4KTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAvKgotICAgICAqIElmIHRoZSByZXNvdXJjZSB0byBjaGVjayBpcyBhIGZpbGUgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlIGlmIHRoZSBmaWxlIGlzIGxpbmtlZC4gSWYgdGhlIHJlc291cmNlIHRvCi0gICAgICogY2hlY2sgaXMgYSBmb2xkZXIgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiB0cnVlIGlmIGl0LCBhbnkgb2YgaXRzIHN1YiBkaXJlY3Rvcmllcywgb3IgYW55IGZpbGUgY29udGFpbmVkCi0gICAgICogd2l0aC1pbiB0aGlzIGRpcmVjdG9yeSBvZiBhbnkgb2YgaXQncyBzdWIgZGlyZWN0b3JpZXMgYXJlIGxpbmtlZC4gT3RoZXJ3aXNlIGZhbHNlIGlzIHJldHVybmVkLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXNMaW5rZWRDb250ZW50KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZVRvQ2hlY2spIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAJaWYgKChyZXNvdXJjZVRvQ2hlY2sgIT0gbnVsbCkgJiYgcmVzb3VyY2VUb0NoZWNrLmlzQWNjZXNzaWJsZSgpKSB7Ci0gICAgCQkvLyBza2lwIG5vbi1hY2Nlc3NpYmxlIGZpbGVzCi0gICAgCQlpZiAocmVzb3VyY2VUb0NoZWNrLmlzTGlua2VkKCkpIHsKLSAgICAJCQlyZXR1cm4gdHJ1ZTsKLSAgICAJCX0KLSAgICAJCWVsc2UgewotICAgIAkJCXN3aXRjaCAocmVzb3VyY2VUb0NoZWNrLmdldFR5cGUoKSkgewotICAgIAkJCQljYXNlIElSZXNvdXJjZS5GT0xERVI6Ci0gICAgCQkJCQkvLyByZWN1cnNpdmVseSBjaGVjayBzdWIgZGlyZWN0b3J5IGNvbnRlbnRzCi0gICAgCQkJCQlmaW5hbCBJUmVzb3VyY2VbXSBzdWJEaXJDb250ZW50cyA9ICgoSUZvbGRlcikgcmVzb3VyY2VUb0NoZWNrKS5tZW1iZXJzKCk7Ci0gICAgCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHN1YkRpckNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgCQkJCQkJaWYgKGhhc0xpbmtlZENvbnRlbnQoc3ViRGlyQ29udGVudHNbaV0pKSB7Ci0gICAgCQkJCQkJCXJldHVybiB0cnVlOwotICAgIAkJCQkJCX0KLSAgICAJCQkJCX0KLSAgICAJCQkJCWJyZWFrOwotICAgIAkJCQljYXNlIElSZXNvdXJjZS5GSUxFOgotICAgIAkJCQkJcmV0dXJuIHJlc291cmNlVG9DaGVjay5pc0xpbmtlZCgpOwotICAgIAkJCQlkZWZhdWx0OgotICAgIAkJCQkJLy8gc2tpcCBhcyB3ZSBvbmx5IGNhcmUgYWJvdXQgZmlsZXMgYW5kIGZvbGRlcnMKLSAgICAJCQkJCWJyZWFrOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfQotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKgotCSAqIEVuc3VyZSB0aGF0IGFueSBjb21wb25lbnQgcmVzb3VyY2UgbWFwcGluZ3MgYXJlIGZvciBzb3VyY2UgZm9sZGVycyBhbmQgCi0JICogdGhhdCB0aGV5IG1hcCB0byB0aGUgcm9vdCBjb250ZW50IGZvbGRlcgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZU1hcHMKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSb290UmVzb3VyY2VNYXBwaW5nKExpc3QgcmVzb3VyY2VNYXBzKSB7Ci0JCWZvciAoaW50IGk9MDsgaSA8IHJlc291cmNlTWFwcy5zaXplKCk7IGkrKykgewotCQkJQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2VNYXAgPSAoQ29tcG9uZW50UmVzb3VyY2UpIHJlc291cmNlTWFwcy5nZXQoaSk7Ci0JCQkvLyBWZXJpZnkgaXQgbWFwcyB0byAiLyIgZm9yIHRoZSBjb250ZW50IHJvb3QKLQkJCWlmICghcmVzb3VyY2VNYXAuZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMoUGF0aC5ST09UKSkgewotCQkJCXJlcG9ydFN0YXR1cyhJU2luZ2xlUm9vdFN0YXR1cy5SVU5USU1FX1BBVEhfTk9UX1JPT1QsIHJlc291cmNlTWFwKTsKLQkJCQlpZiAoSU5DTFVERV9GTEFHID09IE5PTkUpIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJLy8gdmVyaWZ5IGl0IGlzIGFsc28gYSBzcmMgY29udGFpbmVyCi0JCQlJUmVzb3VyY2Ugc291cmNlUmVzb3VyY2UgPSBnZXRQcm9qZWN0KCkuZmluZE1lbWJlcihyZXNvdXJjZU1hcC5nZXRTb3VyY2VQYXRoKCkpOwotCQkJaWYgKHNvdXJjZVJlc291cmNlICE9IG51bGwgJiYgc291cmNlUmVzb3VyY2UuZXhpc3RzKCkpewotCQkJCUlQYXRoIHNvdXJjZVBhdGggPSBnZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKS5hcHBlbmQocmVzb3VyY2VNYXAuZ2V0U291cmNlUGF0aCgpKTsKLQkJCQlpZiAoIWlzU291cmNlQ29udGFpbmVyKHNvdXJjZVBhdGgpKQotCQkJCQlyZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuU09VUkNFX05PVF9KQVZBX0NPTlRBSU5FUiwgcmVzb3VyY2VNYXApOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVwb3J0U3RhdHVzKElTaW5nbGVSb290U3RhdHVzLlNPVVJDRV9QQVRIX05PVF9GT1VORCwgcmVzb3VyY2VNYXApOwotCQkJfQotCQkJaWYgKElOQ0xVREVfRkxBRyA9PSBOT05FKSByZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEVuc3VyZSB0aGUgZGVmYXVsdCB3ZWIgc2V0dXAgaXMgY29ycmVjdCB3aXRoIG9uZSByZXNvdXJjZSBtYXAgYW5kIGFueSBudW1iZXIgb2YgamF2YSAKLQkgKiByZXNvdXJjZSBtYXBzIHRvIFdFQi1JTkYvY2xhc3NlcwotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZU1hcHMKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzRGVmYXVsdFdlYlJlc291cmNlTWFwcGluZ3MoTGlzdCByZXNvdXJjZU1hcHMpIHsKLQkJaW50IHJvb3RWYWxpZE1hcHMgPSAwOwotCQotCQlJUGF0aCB3ZWJJbmZDbGFzc2VzID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5XRUJfSU5GX0NMQVNTRVMpLm1ha2VBYnNvbHV0ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlTWFwcy5zaXplKCk7IGkrKykgewotCQkJQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2VNYXAgPSAoQ29tcG9uZW50UmVzb3VyY2UpIHJlc291cmNlTWFwcy5nZXQoaSk7Ci0JCQlJUGF0aCBzb3VyY2VQYXRoID0gZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkuYXBwZW5kKHJlc291cmNlTWFwLmdldFNvdXJjZVBhdGgoKSk7Ci0KLQkJCS8vIFZlcmlmeSBpZiB0aGUgbWFwIGlzIGZvciB0aGUgY29udGVudCByb290Ci0JCQlpZiAocmVzb3VyY2VNYXAuZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMoUGF0aC5ST09UKSkgewotCQkJCXJvb3RWYWxpZE1hcHMrKzsKLQkJCX0gCi0JCQkvLyBWZXJpZnkgaWYgdGhlIG1hcCBpcyBmb3IgYSBqYXZhIHNyYyBmb2xkZXIgYW5kIGlzIG1hcHBlZCB0byAiV0VCLUlORi9jbGFzc2VzIgotCQkJZWxzZSBpZiAocmVzb3VyY2VNYXAuZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMod2ViSW5mQ2xhc3NlcykpIHsKLQkJCQlpZiAoZXhpc3RzKHNvdXJjZVBhdGgpKSB7Ci0JCQkJCWlmICghaXNTb3VyY2VDb250YWluZXIoc291cmNlUGF0aCkpIHsKLQkJCQkJCXJlcG9ydFN0YXR1cyhJU2luZ2xlUm9vdFN0YXR1cy5TT1VSQ0VfTk9UX0pBVkFfQ09OVEFJTkVSLCByZXNvdXJjZU1hcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlcG9ydFN0YXR1cyhJU2luZ2xlUm9vdFN0YXR1cy5TT1VSQ0VfUEFUSF9OT1RfRk9VTkQsIHJlc291cmNlTWFwKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuUlVOVElNRV9QQVRIX05PVF9ST09UX09SX1dFQklORl9DTEFTU0VTLCByZXNvdXJjZU1hcCk7Ci0JCQl9Ci0JCQlpZiAoSU5DTFVERV9GTEFHID09IE5PTkUpIHJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBNYWtlIHN1cmUgb25seSBvbmUgb2YgdGhlIG1hcHMgaXMgdGhlIGNvbnRlbnQgcm9vdCwgYW5kIHRoYXQgYXQgbGVhc3Qgb25lIGlzIGZvciB0aGUgamF2YSBmb2xkZXIKLQkJaWYgKHJvb3RWYWxpZE1hcHMgIT0gMSkgewotCQkJaWYgKHJvb3RWYWxpZE1hcHMgPCAxKSB7Ci0JCQkJcmVwb3J0U3RhdHVzKElTaW5nbGVSb290U3RhdHVzLk9ORV9DT05URU5UX1JPT1RfUkVRVUlSRUQpOwotCQkJfQotCQkJZWxzZSBpZiAocm9vdFZhbGlkTWFwcyA+IDEpIHsKLQkJCQlyZXBvcnRTdGF0dXMoSVNpbmdsZVJvb3RTdGF0dXMuT05MWV8xX0NPTlRFTlRfUk9PVF9BTExPV0VEKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gSU5DTFVERV9GTEFHID09IE5PTkUgPyBmYWxzZSA6IHRydWU7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgcGF0aCBhcmd1bWVudCBleGlzdHMgcmVsYXRpdmUgdG8gdGhpcyB3b3Jrc3BhY2Ugcm9vdC4KLQkgKiAKLQkgKiBAcGFyYW0gYSB3b3Jrc3BhY2UgcmVsYXRpdmUgZnVsbCBwYXRoCi0JICogQHJldHVybiBpcyBwYXRoIGluIHRoZSB3b3Jrc3BhY2U/Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGV4aXN0cyhJUGF0aCBwYXRoKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlyZXR1cm4gd29ya3NwYWNlUm9vdC5leGlzdHMocGF0aCk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NpbmdsZUphdmFPdXRwdXROb25Tb3VyY2UoKSB7Ci0JCXJldHVybiBpc1NpbmdsZUphdmFPdXRwdXROb25Tb3VyY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlcG9ydFN0YXR1cyhpbnQgY29kZSkgewotCQlyZXBvcnRTdGF0dXMoY29kZSwgbnVsbCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlcG9ydFN0YXR1cyhpbnQgY29kZSwgQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmVwb3J0U3RhdHVzKGNvZGUsIHJlc291cmNlLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVwb3J0U3RhdHVzKGludCBjb2RlLCBDb21wb25lbnRSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJSVNpbmdsZVJvb3RTdGF0dXMgc3RhdHVzID0gbmV3IFNpbmdsZVJvb3RTdGF0dXMoY29kZSwgcmVzb3VyY2UsIG1lc3NhZ2UpOwotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJaWYgKChJTkNMVURFX0ZMQUcgJiBJTkNMVURFX0ZJUlNUX0VSUk9SKSAhPSAwKSB7Ci0JCQkJSU5DTFVERV9GTEFHID0gTk9ORTsKLQkJCQlhZGRTdGF0dXMoc3RhdHVzKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChJTkNMVURFX0ZMQUcgJiBJTkNMVURFX0VSUk9SUykgIT0gMCkgewotCQkJCWFkZFN0YXR1cyhzdGF0dXMpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORyAmJiAoSU5DTFVERV9GTEFHICYgV0FSTklOR1MpICE9IDApIHsKLQkJCWFkZFN0YXR1cyhzdGF0dXMpOwotCQl9Ci0JCWVsc2UgaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuSU5GTyAmJiAoSU5DTFVERV9GTEFHICYgSU5GTykgIT0gMCkgeyAKLQkJCWFkZFN0YXR1cyhzdGF0dXMpOwotCQl9Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlpZiAod3JhcHBlclN0YXR1cyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gd3JhcHBlclN0YXR1czsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU3RhdHVzKElTaW5nbGVSb290U3RhdHVzIHN0YXR1cykgewotCQlpZiAod3JhcHBlclN0YXR1cyA9PSBudWxsKSB7Ci0JCQl3cmFwcGVyU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEoyRUVQbHVnaW4uUExVR0lOX0lELCAwLCBuZXcgSVN0YXR1c1tdIHsgc3RhdHVzIH0sIG51bGwsIG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJd3JhcHBlclN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvV2ViVXRpbGl0aWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L1dlYlV0aWxpdGllcy5qYXZhCmluZGV4IGIzYjZlMjUuLjZjNmZkZWUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvV2ViVXRpbGl0aWVzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9XZWJVdGlsaXRpZXMuamF2YQpAQCAtMTEsMjYgKzExLDQwIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3Q7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lVdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5YTUxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLkoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwVmVyc2lvblR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwogCiBwdWJsaWMgY2xhc3MgV2ViVXRpbGl0aWVzIGV4dGVuZHMgSmF2YUVFUHJvamVjdFV0aWxpdGllcyB7CiAJcHVibGljIHN0YXRpYyBJUGF0aCBXRUJMSUIgPSBuZXcgUGF0aCgiL1dFQi1JTkYvbGliIik7IC8vJE5PTi1OTFMtMSQKIAogCXB1YmxpYyBXZWJVdGlsaXRpZXMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgogCX0KIAogCS8qKgpAQCAtNTEsNiArNjUsNyBAQAogCQllbHNlIGlmICh3ZWJBcHBSZXNvdXJjZSBpbnN0YW5jZW9mIFdlYkFwcCkKIAkJewogCQkJc3dpdGNoICgoKFdlYkFwcCl3ZWJBcHBSZXNvdXJjZSkuZ2V0VmVyc2lvbigpLmdldFZhbHVlKCkpIHsKKwkJCQkvL0VFNlRPRE8KIAkJCQljYXNlIFdlYkFwcFZlcnNpb25UeXBlLl8yNTogCiAJCQkJCXJldFZhbCA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzVfSUQ7CiAJCQkJCWJyZWFrOwpAQCAtNzYsMjUgKzkxLDc4IEBACiAJCWVsc2UKIAkJCXJldHVybiBKMkVFVmVyc2lvbkNvbnN0YW50cy5KU1BfMl8wX0lEOwogCX0KKwkKKwlwdWJsaWMgc3RhdGljIExpc3QgPElWaXJ0dWFsQ29tcG9uZW50PiBnZXRXZWJGcmFnbWVudHMoSVZpcnR1YWxDb21wb25lbnQgd2ViQ29tcG9uZW50KXsKKwkJcmV0dXJuIGdldFdlYkZyYWdtZW50cyh3ZWJDb21wb25lbnQsIGZhbHNlKTsKKwl9CiAKIAkvKioKKwkgKiBSZXR1cm5zIGEgbGlzdCBvZiBXZWJGcmFnbWVudCBjb21wb25lbnRzIGZvciB0aGUgc3BlY2lmaWVkIGR5bmFtaWMgd2ViIGNvbXBvbmVudC4KKwkgKiBAcGFyYW0gd2ViQ29tcG9uZW50CisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdCA8SVZpcnR1YWxDb21wb25lbnQ+IGdldFdlYkZyYWdtZW50cyhJVmlydHVhbENvbXBvbmVudCB3ZWJDb21wb25lbnQsIGJvb2xlYW4gZXhwYW5kTGlicmFyaWVzKXsKKwkJTGlzdCA8SVZpcnR1YWxDb21wb25lbnQ+cmVzdWx0ID0gbmV3IEFycmF5TGlzdDxJVmlydHVhbENvbXBvbmVudD4oKTsKKwkJTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisJCWlmIChleHBhbmRMaWJyYXJpZXMpIHsKKwkJCW9wdGlvbnMucHV0KEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50LkdFVF9FWFBBTkRFRF9MSUJfUkVGUywgQm9vbGVhbi5UUlVFKTsKKwkJfQorCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZkNvbXBvbmVudHMgPSB3ZWJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcyhvcHRpb25zKTsKKwkJCisJCWZvcihJVmlydHVhbFJlZmVyZW5jZSB2aXJ0dWFsUmVmZXJlbmNlIDogcmVmQ29tcG9uZW50cyl7CisJCQlpZih2aXJ0dWFsUmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKFdFQkxJQikgJiYgIUNsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmlzQ2xhc3NGb2xkZXJSZWZlcmVuY2UodmlydHVhbFJlZmVyZW5jZSkpeworCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQgPSB2aXJ0dWFsUmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKKwkJCQlpZihKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzV2ViRnJhZ21lbnRQcm9qZWN0KHZpcnR1YWxDb21wb25lbnQpKXsKKwkJCQkJcmVzdWx0LmFkZCh2aXJ0dWFsQ29tcG9uZW50KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciA9IHdlYkNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCk7CisJCUlWaXJ0dWFsRm9sZGVyIHdlYkxpYkZvbGRlciA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKFdFQkxJQik7CisJCWlmKHdlYkxpYkZvbGRlci5leGlzdHMoKSl7CisJCQl0cnkgeworCQkJCUlWaXJ0dWFsUmVzb3VyY2UgW10gd2ViTGlicyA9IHdlYkxpYkZvbGRlci5tZW1iZXJzKCk7CisJCQkJZm9yKElWaXJ0dWFsUmVzb3VyY2Ugd2ViTGliIDogd2ViTGlicyl7CisJCQkJCWlmKHdlYkxpYi5nZXRUeXBlKCkgPT0gSVZpcnR1YWxSZXNvdXJjZS5GSUxFICYmIEoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmVuZHNXaXRoSWdub3JlQ2FzZSh3ZWJMaWIuZ2V0TmFtZSgpLCBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUKSl7CisJCQkJCQlJUmVzb3VyY2UgaVJlc291cmNlID0gd2ViTGliLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOworCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudCh3ZWJDb21wb25lbnQuZ2V0UHJvamVjdCgpLCBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudC5MSUJBUkNISVZFVFlQRSArIGlSZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOworCQkJCQkJaWYoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1dlYkZyYWdtZW50UHJvamVjdCh2aXJ0dWFsQ29tcG9uZW50KSl7CisJCQkJCQkJcmVzdWx0LmFkZCh2aXJ0dWFsQ29tcG9uZW50KTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQkJfQorCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRMaWJNb2R1bGVzKElWaXJ0dWFsQ29tcG9uZW50IHdlYkNvbXBvbmVudCkgeworCQlyZXR1cm4gZ2V0TGliTW9kdWxlcyh3ZWJDb21wb25lbnQsIGZhbHNlKTsKKwl9CisJCisJCisJLyoqCiAJICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGxpc3Qgb2YgZGVwZW5kZW50IG1vZHVsZXMgd2hpY2ggYXJlIHV0aWxpdHkgamFycyBpbiB0aGUgd2ViIGxpYgogCSAqIGZvbGRlciBvZiB0aGUgZGVwbG95ZWQgcGF0aCBvZiB0aGUgbW9kdWxlLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KIAkgKiAKIAkgKiBAcmV0dXJuIGFycmF5IG9mIHRoZSB3ZWIgbGlicmFyeSBkZXBlbmRlbnQgbW9kdWxlcwogCSAqLwotCXB1YmxpYyBzdGF0aWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRMaWJNb2R1bGVzKElWaXJ0dWFsQ29tcG9uZW50IHdlYkNvbXBvbmVudCl7CisJcHVibGljIHN0YXRpYyBJVmlydHVhbFJlZmVyZW5jZVtdIGdldExpYk1vZHVsZXMoSVZpcnR1YWxDb21wb25lbnQgd2ViQ29tcG9uZW50LCBib29sZWFuIGV4cGFuZExpYnJhcmllcykgewogCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZDb21wb25lbnRzID0gbnVsbDsKLQkJaWYgKCF3ZWJDb21wb25lbnQuaXNCaW5hcnkoKSkKLQkJCXJlZkNvbXBvbmVudHMgPSAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KXdlYkNvbXBvbmVudCkuZ2V0Tm9uTWFuaWZlc3RSZWZlcmVuY2VzKCk7Ci0JCWVsc2UKLQkJCXJlZkNvbXBvbmVudHMgPSB3ZWJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOworCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKwkJb3B0aW9ucy5wdXQoSVZpcnR1YWxDb21wb25lbnQuUkVRVUVTVEVEX1JFRkVSRU5DRV9UWVBFLCBJVmlydHVhbENvbXBvbmVudC5GTEFUVEVOQUJMRV9SRUZFUkVOQ0VTKTsKKwkJaWYgKGV4cGFuZExpYnJhcmllcykgeworCQkJb3B0aW9ucy5wdXQoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQuR0VUX0VYUEFOREVEX0xJQl9SRUZTLCBCb29sZWFuLlRSVUUpOworCQl9CisJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmQ29tcG9uZW50cyA9IHdlYkNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKG9wdGlvbnMpOwogCQkvLyBDaGVjayB0aGUgZGVwbG95ZWQgcGF0aCB0byBtYWtlIHN1cmUgaXQgaGFzIGEgbGliIHBhcmVudCBmb2xkZXIgYW5kIG1hdGNocyB0aGUgd2ViLnhtbAogCQkvLyBiYXNlIHBhdGgKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVmQ29tcG9uZW50c1tpXS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhXRUJMSUIpKQotCQkJCXJlc3VsdC5hZGQocmVmQ29tcG9uZW50c1tpXSk7CisJCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSByZWZDb21wb25lbnRzW2ldOworCQkJaWYgKHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpLmVxdWFscyhXRUJMSUIpICYmICFDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5pc0NsYXNzRm9sZGVyUmVmZXJlbmNlKHJlZmVyZW5jZSkpCQkJCisJCQkJcmVzdWx0LmFkZChyZWZlcmVuY2UpOwogCQl9CiAKIAkJcmV0dXJuIChJVmlydHVhbFJlZmVyZW5jZVtdKSByZXN1bHQudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbcmVzdWx0LnNpemUoKV0pOwpAQCAtMTEwLDQgKzE3OCwxMTIgQEAKIAkJSVZpcnR1YWxDb21wb25lbnQgd2ViQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQod2ViUHJvamVjdCk7CiAJCXJldHVybiBnZXRMaWJNb2R1bGVzKHdlYkNvbXBvbmVudCk7CiAJfQorCisJLyoqCisJICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGFuIGFjY2Vzc2libGUgd2ViIHJlc291cmNlLgorCSAqIAorCSAqIDxwPgorCSAqIEFuIGFjY2Vzc2libGUgd2ViIG9iamVjdCBpcyBhIGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgY2FuIGJlIGFjY2Vzc2VkCisJICogdGhyb3VnaCBhbiBVUkkgYWZ0ZXIgZGVwbG95aW5nIG9uIGFuIGFwcGxpY2F0aW9uIHNlcnZlci4KKwkgKiA8L3A+CisJICogCisJICogPHA+CisJICogVGhpcyBpbmNsdWRlcyBhbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHVuZGVyIHRoZSBXZWJDb250ZW50CisJICogcm9vdCBkaXJlY3Rvcnkgb2YgYSBEeW5hbWljIFdlYiBQcm9qZWN0IGFuZCBhcmUgbm90IHVuZGVyIHRoZSBXRUItSU5GIGFuZAorCSAqIE1FVEEtSU5GIGZvbGRlcnMuCisJICogPC9wPgorCSAqIAorCSAqIEBwYXJhbSBvYmplY3QKKwkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gdGVzdAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYWNjZXNzaWJsZSB3ZWIgb2JqZWN0LCA8Y29kZT5mYWxzZTwvY29kZT4gLQorCSAqICAgICAgICAgb3RoZXJ3aXNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dlYlJlc291cmNlKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgeworCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgb2JqZWN0OworCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKKwkJCWlmIChjb21wb25lbnQgIT0gbnVsbCAmJiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYkNvbXBvbmVudChjb21wb25lbnQpKSB7CisJCQkJSVBhdGggcm9vdFBhdGggPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOworCQkJCUlQYXRoIHdlYkluZlBhdGggPSByb290UGF0aC5hcHBlbmQoSjJFRUNvbnN0YW50cy5XRUJfSU5GKTsKKwkJCQlJUGF0aCBtZXRhSW5mUGF0aCA9IHJvb3RQYXRoLmFwcGVuZChKMkVFQ29uc3RhbnRzLk1FVEFfSU5GKTsKKwkJCQlJUGF0aCByZXNvdXJjZVBhdGggPSByZXNvdXJjZS5nZXRGdWxsUGF0aCgpOworCQkJCXJldHVybiByb290UGF0aC5pc1ByZWZpeE9mKHJlc291cmNlUGF0aCkgJiYgCisJCQkJCQkhcm9vdFBhdGguZXF1YWxzKHJlc291cmNlUGF0aCkgJiYKKwkJCQkJCSF3ZWJJbmZQYXRoLmlzUHJlZml4T2YocmVzb3VyY2VQYXRoKSAmJiAKKwkJCQkJCSFtZXRhSW5mUGF0aC5pc1ByZWZpeE9mKHJlc291cmNlUGF0aCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZSBjb250ZXh0IHJvb3Qgb24gdGhlIGFzc29jaWF0ZWQgd29ya2JlbmNoIG1vZHVsZSB3aXRoIHRoZSBnaXZlbiBzdHJpbmcKKwkgKiB2YWx1ZSBwYXNzZWQgaW4uICBUaGlzIGNvbnRleHQgcm9vdCBpcyB1c2VkIGJ5IHRoZSBzZXJ2ZXIgYXQgcnVudGltZS4KKwkgKiAKKwkgKiBAcGFyYW0gY29udGV4dFJvb3Qgc3RyaW5nCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFNlcnZlckNvbnRleHRSb290KElQcm9qZWN0IHdlYlByb2plY3QsIFN0cmluZyBjb250ZXh0Um9vdCkKKwl7CisJCUNvbXBvbmVudFV0aWxpdGllcy5zZXRTZXJ2ZXJDb250ZXh0Um9vdCh3ZWJQcm9qZWN0LCBjb250ZXh0Um9vdCk7CisJfQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIHdpbGwgZ2V0IHRoZSBjb250ZXh0IHJvb3Qgb24gdGhlIGFzc29jaWF0ZWQgd29ya2JlbmNoIG1vZHVsZSBpZiBudWxsIGlzIHBhc3NlZCBmb3IgdGhlIGVhclByb2plY3QsIG9yIHdpbGwgdXNlIHRoZSBlYXIgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZXh0IHJvb3QuCisJICogVGhpcyBjb250ZXh0IHJvb3QgaXMgdXNlZCBieSB0aGUgc2VydmVyIGF0IHJ1bnRpbWUuCisJICogCisJICogQHBhcmFtIHdlYlByb2plY3QgSVByb2plY3QKKwkgKiBAcGFyYW0gZWFyUHJvamVjdCBJUHJvamVjdCAtIGNhbiBiZSBudWxsCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyQ29udGV4dFJvb3QoSVByb2plY3Qgd2ViUHJvamVjdCxJUHJvamVjdCBlYXJQcm9qZWN0KSB7CisgICAgCVN0cmluZyBjb250ZXh0Um9vdCA9IG51bGw7CisgICAgCWlmIChlYXJQcm9qZWN0ID09IG51bGwgfHwgIUphdmFFRVByb2plY3RVdGlsaXRpZXMuZGVwbG95bWVudERlc2NyaXB0b3JFeGlzdHMoZWFyUHJvamVjdCkpCisgICAgCQlyZXR1cm4gQ29tcG9uZW50VXRpbGl0aWVzLmdldFNlcnZlckNvbnRleHRSb290KHdlYlByb2plY3QpOworICAgIAllbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChlYXJQcm9qZWN0KSAmJiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3Qod2ViUHJvamVjdCkpIHsKKyAgICAJCUVBUkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKKyAgICAJCXRyeSB7CisgICAgCQkJZWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKGVhclByb2plY3QpOworICAgIAkJCWNvbnRleHRSb290ID0gZWRpdC5nZXRXZWJDb250ZXh0Um9vdCh3ZWJQcm9qZWN0KTsKKyAgICAJCX0gZmluYWxseSB7CisgICAgCQkJaWYgKGVkaXQhPW51bGwpCisgICAgCQkJCWVkaXQuZGlzcG9zZSgpOworICAgIAkJfQorICAgIAl9CisgICAgCXJldHVybiBjb250ZXh0Um9vdDsKKyAgICB9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCByZWZlcmVuY2luZyBXZWIgcHJvamVjdHMuCisJICogCisJICogQHBhcmFtIHByb2plY3QKKwkgKiAgICAgICAgICAgIFByb2plY3QgdG8gY2hlY2suIElmIDxjb2RlPm51bGw8L2NvZGU+IHRoZW4gYSB6ZXJvIGxlbmd0aAorCSAqICAgICAgICAgICAgYXJyYXkgaXMgcmV0dXJuZWQuIElmIGEgV0FSLCB0aGVuIGEgb25lIGVsZW1lbnQgYXJyYXkgd2lsbCBiZQorCSAqICAgICAgICAgICAgcmV0dXJuZWQuCisJICogQHJldHVybiBBcnJheSBvZiByZWZlcmVuY2luZyBXZWIgcHJvamVjdHMuCisJICovCisJcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldFJlZmVyZW5jaW5nV2ViUHJvamVjdHMoZmluYWwgSVByb2plY3QgcHJvamVjdCkgeworCQlpZiAocHJvamVjdCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbmV3IElQcm9qZWN0WzBdOworCQl9IGVsc2UgaWYgKGlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKKwkJCXJldHVybiBuZXcgSVByb2plY3RbXSB7IHByb2plY3QgfTsKKwkJfQorCisJCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOworCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKKwkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7CisJCQlJVmlydHVhbENvbXBvbmVudFtdIHJlZkNvbXBvbmVudHMgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZkNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoaXNEeW5hbWljV2ViUHJvamVjdChyZWZDb21wb25lbnRzW2ldLmdldFByb2plY3QoKSkpCisJCQkJCXJlc3VsdC5hZGQocmVmQ29tcG9uZW50c1tpXS5nZXRQcm9qZWN0KCkpOworCQkJfQorCQl9CisKKwkJSVByb2plY3RbXSB3ZWJQcm9qZWN0cyA9IChJUHJvamVjdFtdKSByZXN1bHQudG9BcnJheShuZXcgSVByb2plY3RbcmVzdWx0LnNpemUoKV0pOworCQkvLyBzb3J0IHRoZSBsaXN0IHNvIGl0IGlzIGNvbnNpc3RlbnQKKwkJQXJyYXlzLnNvcnQod2ViUHJvamVjdHMsIG5ldyBDb21wYXJhdG9yPElQcm9qZWN0PigpIHsKKwkJCXB1YmxpYyBpbnQgY29tcGFyZShJUHJvamVjdCBwMCwgSVByb2plY3QgcDEpIHsKKwkJCQlyZXR1cm4gcDAuZ2V0TmFtZSgpLmNvbXBhcmVUbyhwMS5nZXROYW1lKCkpOworCQkJfQorCQl9KTsKKworCQlyZXR1cm4gd2ViUHJvamVjdHM7CisJfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9JSjJFRUZhY2V0Q29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0lKMkVFRmFjZXRDb25zdGFudHMuamF2YQppbmRleCAyZjljODc1Li5jODU1YjY3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0lKMkVFRmFjZXRDb25zdGFudHMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0lKMkVFRmFjZXRDb25zdGFudHMuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRU5URVJQUklTRV9BUFBMSUNBVElPTl8xMyA9IEVOVEVSUFJJU0VfQVBQTElDQVRJT05fRkFDRVQuZ2V0VmVyc2lvbigiMS4zIik7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEVOVEVSUFJJU0VfQVBQTElDQVRJT05fMTQgPSBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OX0ZBQ0VULmdldFZlcnNpb24oIjEuNCIpOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBFTlRFUlBSSVNFX0FQUExJQ0FUSU9OXzUwID0gRU5URVJQUklTRV9BUFBMSUNBVElPTl9GQUNFVC5nZXRWZXJzaW9uKCI1LjAiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRU5URVJQUklTRV9BUFBMSUNBVElPTl82MCA9IEVOVEVSUFJJU0VfQVBQTElDQVRJT05fRkFDRVQuZ2V0VmVyc2lvbigiNi4wIik7IC8vJE5PTi1OTFMtMSQKIAkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9DTElFTlQgPSBJTW9kdWxlQ29uc3RhbnRzLkpTVF9BUFBDTElFTlRfTU9EVUxFOwogCXB1YmxpYyBJUHJvamVjdEZhY2V0IEFQUExJQ0FUSU9OX0NMSUVOVF9GQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChBUFBMSUNBVElPTl9DTElFTlQpOwpAQCAtMzEsNiArMzIsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gQVBQTElDQVRJT05fQ0xJRU5UXzEzID0gQVBQTElDQVRJT05fQ0xJRU5UX0ZBQ0VULmdldFZlcnNpb24oIjEuMyIpOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBBUFBMSUNBVElPTl9DTElFTlRfMTQgPSBBUFBMSUNBVElPTl9DTElFTlRfRkFDRVQuZ2V0VmVyc2lvbigiMS40Iik7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEFQUExJQ0FUSU9OX0NMSUVOVF81MCA9IEFQUExJQ0FUSU9OX0NMSUVOVF9GQUNFVC5nZXRWZXJzaW9uKCI1LjAiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gQVBQTElDQVRJT05fQ0xJRU5UXzYwID0gQVBQTElDQVRJT05fQ0xJRU5UX0ZBQ0VULmdldFZlcnNpb24oIjYuMCIpOyAvLyROT04tTkxTLTEkCiAJCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRTsKIAlwdWJsaWMgSVByb2plY3RGYWNldCBFSkJfRkFDRVQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRUpCKTsKQEAgLTM4LDYgKzQwLDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEVKQl8yMCA9IEVKQl9GQUNFVC5nZXRWZXJzaW9uKCIyLjAiKTsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gRUpCXzIxID0gRUpCX0ZBQ0VULmdldFZlcnNpb24oIjIuMSIpOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBFSkJfMzAgPSBFSkJfRkFDRVQuZ2V0VmVyc2lvbigiMy4wIik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEVKQl8zMSA9IEVKQl9GQUNFVC5nZXRWZXJzaW9uKCIzLjEiKTsgLy8kTk9OLU5MUy0xJAogCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFlOQU1JQ19XRUIgPSBJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFOwogCXB1YmxpYyBJUHJvamVjdEZhY2V0IERZTkFNSUNfV0VCX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KERZTkFNSUNfV0VCKTsKQEAgLTQ1LDYgKzQ4LDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIERZTkFNSUNfV0VCXzIzID0gRFlOQU1JQ19XRUJfRkFDRVQuZ2V0VmVyc2lvbigiMi4zIik7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIERZTkFNSUNfV0VCXzI0ID0gRFlOQU1JQ19XRUJfRkFDRVQuZ2V0VmVyc2lvbigiMi40Iik7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIERZTkFNSUNfV0VCXzI1ID0gRFlOQU1JQ19XRUJfRkFDRVQuZ2V0VmVyc2lvbigiMi41Iik7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIERZTkFNSUNfV0VCXzMwID0gRFlOQU1JQ19XRUJfRkFDRVQuZ2V0VmVyc2lvbigiMy4wIik7IC8vJE5PTi1OTFMtMSQKIAkKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX1dFQl9YRE9DTEVUID0gImpzdC53ZWIueGRvY2xldCI7IC8vJE5PTi1OTFMtMSQKIAkKQEAgLTU2LDggKzYwLDEwIEBACiAJcHVibGljIElQcm9qZWN0RmFjZXQgSkNBX0ZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KEpDQSk7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBKQ0FfMTAgPSBKQ0FfRkFDRVQuZ2V0VmVyc2lvbigiMS4wIik7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIEpDQV8xNSA9IEpDQV9GQUNFVC5nZXRWZXJzaW9uKCIxLjUiKTsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gSkNBXzE2ID0gSkNBX0ZBQ0VULmdldFZlcnNpb24oIjEuNiIpOyAvLyROT04tTkxTLTEkCiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUSUNfV0VCID0gSU1vZHVsZUNvbnN0YW50cy5XU1RfV0VCX01PRFVMRTsKIAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkEgPSBJTW9kdWxlQ29uc3RhbnRzLkpTVF9KQVZBOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkZSQUdNRU5UID0gSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCRlJBR01FTlRfTU9EVUxFOwogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9JSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKaW5kZXggOGVhZTkxMC4uMmI2MGQ5MiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9JSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0lKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCkBAIC0xNyw1ICsxNyw1IEBACiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0ZPTERFUiA9ICJJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09ORklHX0ZPTERFUiI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0VBUl9OQU1FID0gIklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5MQVNUX0VBUl9OQU1FIjsJLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9VUkkgPSAiSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLk1PRFVMRV9VUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0ZPTERFUj0iSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLk9VVFBVVF9GT0xERVIiOy8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQUxMX0VBUl9MSUJSQVJZID0gIklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5JTlNUQUxMX0VBUl9MSUJSQVJZIjsgLy8kTk9OLU5MUy0xJAogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggZGRkYTk2ZC4uZjIyNmFhMyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0oyRUVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciAgaW1wbGVtZW50cyBJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXN7CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7CiAJCVNldCBuYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKIAkJbmFtZXMuYWRkKFJVTlRJTUVfVEFSR0VUX0lEKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0oyRUVGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmluZGV4IGY3N2U3NjIuLjJiYjk4NjUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KMkVFRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQpAQCAtMjEsMTYgKzIxLDE5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuTWFuaWZlc3RGaWxlQ3JlYXRpb25BY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKQEAgLTY5LDY4ICs3Miw3NyBAQAogCQlpZiggcHJvamVjdC5leGlzdHMoKSkKIAkJCXJldHVybjsKIAkJCi0JCWZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjID0gRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuY3JlYXRlTmV3UHJvamVjdCgpOwotCQkKLQkJZnBqd2Muc2V0UHJvamVjdE5hbWUoIGVhclByb2plY3ROYW1lICk7Ci0JCQotCQlpZiggcnVudGltZSAhPSBudWxsICkKLQkJewotCQkgICAgZnBqd2Muc2V0VGFyZ2V0ZWRSdW50aW1lcyggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBydW50aW1lICkgKTsKLQkJfQotCQkKLQkJZnBqd2Muc2V0Rml4ZWRQcm9qZWN0RmFjZXRzKCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIEVBUkZhY2V0VXRpbHMuRUFSX0ZBQ0VUICkgKTsKLQkJZnBqd2Muc2V0U2VsZWN0ZWRQcmVzZXQoIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLkRFRkFVTFRfQ09ORklHVVJBVElPTl9QUkVTRVRfSUQgKTsKLQkJCi0JCWlmKCBqMmVlVmVyc2lvblRleHQgIT0gbnVsbCApCi0JCXsKLQkJICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGRlZmF1bHRFYXJGYWNldFZlcnNpb24KLQkJICAgICAgICA9IGZwandjLmdldFByb2plY3RGYWNldFZlcnNpb24oIEVBUkZhY2V0VXRpbHMuRUFSX0ZBQ0VUICk7Ci0JCSAgICAKLQkJICAgIGlmKCAhIGRlZmF1bHRFYXJGYWNldFZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpLmVxdWFscyggajJlZVZlcnNpb25UZXh0ICkgKQotCQkgICAgewotCQkgICAgICAgIFN0cmluZyBwcmVzZXRJZCA9IG51bGw7Ci0JCSAgICAgICAgCi0JCSAgICAgICAgaWYoIHJ1bnRpbWUgIT0gbnVsbCApCi0JCSAgICAgICAgewotICAgIAkJICAgICAgICBmb3IoIElSdW50aW1lQ29tcG9uZW50IHJjIDogcnVudGltZS5nZXRSdW50aW1lQ29tcG9uZW50cygpICkKLSAgICAJCSAgICAgICAgewotICAgIAkJICAgICAgICAgICAgcHJlc2V0SWQgPSBSdW50aW1lUHJlc2V0TWFwcGluZ1JlZ2lzdHJ5LklOU1RBTkNFLmdldFByZXNldElECi0gICAgCQkgICAgICAgICAgICAoIAotICAgIAkJICAgICAgICAgICAgICAgIHJjLmdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCkuZ2V0SWQoKSwKLSAgICAJCSAgICAgICAgICAgICAgICByYy5nZXRSdW50aW1lQ29tcG9uZW50VmVyc2lvbigpLmdldFZlcnNpb25TdHJpbmcoKSwgCi0gICAgCQkgICAgICAgICAgICAgICAgRUFSRmFjZXRVdGlscy5FQVJfRkFDRVQuZ2V0SWQoKSwgCi0gICAgCQkgICAgICAgICAgICAgICAgajJlZVZlcnNpb25UZXh0IAotICAgIAkJICAgICAgICAgICAgKTsKLSAgICAJCSAgICAgICAgICAgIAotICAgIAkJICAgICAgICAgICAgaWYoIHByZXNldElkICE9IG51bGwgKQotICAgIAkJICAgICAgICAgICAgewotICAgIAkJICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIAkJICAgICAgICAgICAgfQotICAgIAkJICAgICAgICB9Ci0JCSAgICAgICAgfQotCQkgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGVhckZhY2V0VmVyc2lvbgotICAgICAgICAgICAgICAgICAgICA9IEVBUkZhY2V0VXRpbHMuRUFSX0ZBQ0VULmdldFZlcnNpb24oIGoyZWVWZXJzaW9uVGV4dCApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBuZXh0IGNhbGwgaXMgbmVjZXNzYXJ5IGV2ZW4gaWYgYSBwcmVzZXQgaXMgZ29pbmcgdG8gYmUgc2VsZWN0ZWQgCi0gICAgICAgICAgICAgICAgLy8gbGF0ZXIgc2luY2UgaXQgYWxsb3dzIHRoZSBkeW5hbWljIHByZXNldCB0byBhZGp1c3QgZm9yIHRoZSBlYXIgZmFjZXQgdmVyc2lvbi4KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmcGp3Yy5zZXRQcm9qZWN0RmFjZXRzKCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGVhckZhY2V0VmVyc2lvbiApICk7Ci0gICAgICAgICAgICAgICAgCi0JCSAgICAgICAgaWYoIHByZXNldElkICE9IG51bGwgKQotCQkgICAgICAgIHsKLQkJICAgICAgICAgICAgZnBqd2Muc2V0U2VsZWN0ZWRQcmVzZXQoIHByZXNldElkICk7Ci0JCSAgICAgICAgfQotCQkgICAgfQotCQl9Ci0JCQorCQlJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyA9IG51bGw7CiAJCXRyeQotCQl7Ci0JCSAgICBmcGp3Yy5jb21taXRDaGFuZ2VzKCBudWxsICk7Ci0JCX0KLQkJY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0JCXsKLQkJICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvciggZSApOworCQl7CQorCQkJZnBqd2MgPSBGYWNldGVkUHJvamVjdEZyYW1ld29yay5jcmVhdGVOZXdQcm9qZWN0KCk7CQkKKwkJCisJCQorCQkJZnBqd2Muc2V0UHJvamVjdE5hbWUoIGVhclByb2plY3ROYW1lICk7CisJCQkKKwkJCWlmKCBydW50aW1lICE9IG51bGwgKQorCQkJeworCQkJICAgIGZwandjLnNldFRhcmdldGVkUnVudGltZXMoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggcnVudGltZSApICk7CisJCQl9CisJCQkKKwkJCWZwandjLnNldEZpeGVkUHJvamVjdEZhY2V0cyggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBJSjJFRUZhY2V0Q29uc3RhbnRzLkVOVEVSUFJJU0VfQVBQTElDQVRJT05fRkFDRVQgKSApOworCQkJZnBqd2Muc2V0U2VsZWN0ZWRQcmVzZXQoIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLkRFRkFVTFRfQ09ORklHVVJBVElPTl9QUkVTRVRfSUQgKTsKKwkJCQorCQkJaWYoIGoyZWVWZXJzaW9uVGV4dCAhPSBudWxsICkKKwkJCXsKKwkJCSAgICBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBkZWZhdWx0RWFyRmFjZXRWZXJzaW9uCisJCQkgICAgICAgID0gZnBqd2MuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbiggSUoyRUVGYWNldENvbnN0YW50cy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OX0ZBQ0VUICk7CisJCQkgICAgCisJCQkgICAgaWYoICEgZGVmYXVsdEVhckZhY2V0VmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCkuZXF1YWxzKCBqMmVlVmVyc2lvblRleHQgKSApCisJCQkgICAgeworCQkJICAgICAgICBTdHJpbmcgcHJlc2V0SWQgPSBudWxsOworCQkJICAgICAgICAKKwkJCSAgICAgICAgaWYoIHJ1bnRpbWUgIT0gbnVsbCApCisJCQkgICAgICAgIHsKKwkgICAgCQkgICAgICAgIGZvciggSVJ1bnRpbWVDb21wb25lbnQgcmMgOiBydW50aW1lLmdldFJ1bnRpbWVDb21wb25lbnRzKCkgKQorCSAgICAJCSAgICAgICAgeworCSAgICAJCSAgICAgICAgICAgIHByZXNldElkID0gUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeS5JTlNUQU5DRS5nZXRQcmVzZXRJRAorCSAgICAJCSAgICAgICAgICAgICggCisJICAgIAkJICAgICAgICAgICAgICAgIHJjLmdldFJ1bnRpbWVDb21wb25lbnRUeXBlKCkuZ2V0SWQoKSwKKwkgICAgCQkgICAgICAgICAgICAgICAgcmMuZ2V0UnVudGltZUNvbXBvbmVudFZlcnNpb24oKS5nZXRWZXJzaW9uU3RyaW5nKCksIAorCSAgICAJCSAgICAgICAgICAgICAgICBJSjJFRUZhY2V0Q29uc3RhbnRzLkVOVEVSUFJJU0VfQVBQTElDQVRJT05fRkFDRVQuZ2V0SWQoKSwgCisJICAgIAkJICAgICAgICAgICAgICAgIGoyZWVWZXJzaW9uVGV4dCAKKwkgICAgCQkgICAgICAgICAgICApOworCSAgICAJCSAgICAgICAgICAgIAorCSAgICAJCSAgICAgICAgICAgIGlmKCBwcmVzZXRJZCAhPSBudWxsICkKKwkgICAgCQkgICAgICAgICAgICB7CisJICAgIAkJICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICAJCSAgICAgICAgICAgIH0KKwkgICAgCQkgICAgICAgIH0KKwkJCSAgICAgICAgfQorCQkJICAgICAgICAKKwkgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZWFyRmFjZXRWZXJzaW9uCisJICAgICAgICAgICAgICAgICAgICA9IElKMkVFRmFjZXRDb25zdGFudHMuRU5URVJQUklTRV9BUFBMSUNBVElPTl9GQUNFVC5nZXRWZXJzaW9uKCBqMmVlVmVyc2lvblRleHQgKTsKKwkgICAgICAgICAgICAKKwkgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBuZXh0IGNhbGwgaXMgbmVjZXNzYXJ5IGV2ZW4gaWYgYSBwcmVzZXQgaXMgZ29pbmcgdG8gYmUgc2VsZWN0ZWQgCisJICAgICAgICAgICAgICAgIC8vIGxhdGVyIHNpbmNlIGl0IGFsbG93cyB0aGUgZHluYW1pYyBwcmVzZXQgdG8gYWRqdXN0IGZvciB0aGUgZWFyIGZhY2V0IHZlcnNpb24uCisJICAgICAgICAgICAgICAgIAorCSAgICAgICAgICAgICAgICBmcGp3Yy5zZXRQcm9qZWN0RmFjZXRzKCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGVhckZhY2V0VmVyc2lvbiApICk7CisJICAgICAgICAgICAgICAgIAorCQkJICAgICAgICBpZiggcHJlc2V0SWQgIT0gbnVsbCApCisJCQkgICAgICAgIHsKKwkJCSAgICAgICAgICAgIGZwandjLnNldFNlbGVjdGVkUHJlc2V0KCBwcmVzZXRJZCApOworCQkJICAgICAgICB9CisJCQkgICAgfQorCQkJfQorCQkJCisJCQl0cnkKKwkJCXsKKwkJCSAgICBmcGp3Yy5jb21taXRDaGFuZ2VzKCBudWxsICk7CisJCQl9CisJCQljYXRjaCggQ29yZUV4Y2VwdGlvbiBlICkKKwkJCXsKKwkJCSAgICBKMkVFUGx1Z2luLmxvZ0Vycm9yKCBlICk7CisJCQl9CisJCX1maW5hbGx5IHsKKwkJCWlmKGZwandjICE9IG51bGwpeworCQkJCWZwandjLmRpc3Bvc2UoKTsKKwkJCX0KIAkJfQogCX0KIAkKQEAgLTE0MSw5ICsxNTMsOSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgTWFuaWZlc3RGaWxlQ3JlYXRpb25BY3Rpb24uY3JlYXRlTWFuaWZlc3RGaWxlKGZpbGUsIHByb2plY3QpOwogICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7CisgICAgICAgICAgICBKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUpOworICAgICAgICAgICAgSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTYwLDcgKzE3Miw3IEBACiAJCXRyeSB7CiAJCQlkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7CiAJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9CiAgICAgfQogICAgIApAQCAtMTk3LDE3ICsyMDksMTkgQEAKICAgICAKICAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgb3V0cHV0IHByb3BlcnR5IG9uIHRoZSBtb2RlbCBlbGVtZW50IGZvciB0aGUgZ2l2ZW4gY29tcG9uZW50LgotICAgICAqIElmIHRoZSBzaW5nbGUgcm9vdCBzdHJ1Y3R1cmUgaXMgc2V0IGZvciBvcHRpbWl6ZWQgdXNlLCB0aGUgb3V0cHV0IGZvbGRlciB3aWxsIGJlIHRoZQotICAgICAqIGNvbnRlbnQgcm9vdC4gIE90aGVyd2lzZSB0aGUgZGVmYXVsdCB3aWxsIGJlIHVzZWQuICBUaGlzIG1heSBiZSBvdmVycmlkZWQgYnkgc3BlY2lmaWMKLSAgICAgKiBKMkVFIG1vZHVsZXMgdG8gZG8gbW9yZSBhcHByb3ByaWF0ZSBiZWhhdmlvdXIuCiAgICAgICogCiAgICAgICogQHBhcmFtIG1vZGVsCiAgICAgICogQHBhcmFtIGNvbXBvbmVudAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHNldE91dHB1dEZvbGRlcihJRGF0YU1vZGVsIG1vZGVsLCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJU3RyaW5nIG91dHB1dEZvbGRlciA9IG51bGw7Ci0JCW91dHB1dEZvbGRlciA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5PVVRQVVRfRk9MREVSKTsKLQkJY29tcG9uZW50LnNldE1ldGFQcm9wZXJ0eSgiamF2YS1vdXRwdXQtcGF0aCIsIG91dHB1dEZvbGRlciApOyAvLyROT04tTkxTLTEkCisJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKKwkJSVBhdGggY3VycmVudERlZmF1bHRPdXRwdXQgPSBudWxsOworCQl0cnkgeworCQkJY3VycmVudERlZmF1bHRPdXRwdXQgPSBqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOworCQkJY29tcG9uZW50LnNldE1ldGFQcm9wZXJ0eSgiamF2YS1vdXRwdXQtcGF0aCIsIGN1cnJlbnREZWZhdWx0T3V0cHV0LnRvU3RyaW5nKCkgKTsgLy8kTk9OLU5MUy0xJAkJCQorCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgeworCQkJb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCX0KIAl9Ci0gIAorIAogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmluZGV4IDA3MWUwNjAuLjIzNmQxN2EgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0oyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTE1LDEyICsxNSwxNCBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uRUZTOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcjsKQEAgLTM4LDEwICs0MCwxMSBAQAogcHVibGljIGNsYXNzIEoyRUVGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElKMkVFRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBTZXQ8SVByb2plY3RGYWNldD4gTU9EVUxFX0ZBQ0VUUyA9IG5ldyBIYXNoU2V0PElQcm9qZWN0RmFjZXQ+KCk7CisgICAgcHJpdmF0ZSBib29sZWFuIGNhc2VTZW5zaXRpdmVGcyA9IEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKS5pc0Nhc2VTZW5zaXRpdmUoKTsKICAgICAKICAgICBzdGF0aWMKICAgICB7Ci0gICAgICAgIGZvciggSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRHcm91cCggIm1vZHVsZXMiICkuZ2V0TWVtYmVycygpICkKKyAgICAgICAgZm9yKCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA6IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldEdyb3VwKCAibW9kdWxlcyIgKS5nZXRNZW1iZXJzKCkgKSAvLyROT04tTkxTLTEkCiAgICAgICAgIHsKICAgICAgICAgICAgIE1PRFVMRV9GQUNFVFMuYWRkKCBmdi5nZXRQcm9qZWN0RmFjZXQoKSApOwogICAgICAgICB9CkBAIC01MSwxMCArNTQsMTIgQEAKIAkJc3VwZXIoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBpbml0KCkgewogCQlzdXBlci5pbml0KCk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYgKEVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKIAkJCUlEYXRhTW9kZWwgbmVzdGVkSjJFRUZhY2V0RGF0YU1vZGVsID0gZ2V0SjJFRUZhY2V0TW9kZWwoKTsKQEAgLTY0LDYgKzY5LDcgQEAKIAkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKIAkJU2V0IG5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwogCQluYW1lcy5hZGQoRUFSX1BST0pFQ1RfTkFNRSk7CkBAIC03MiwxMyArNzgsMTQgQEAKIAkJcmV0dXJuIG5hbWVzOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAoRkFDRVRfUlVOVElNRS5lcXVhbHMocHJvcGVydHlOYW1lKSAmJiBnZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX0VBUikpIHsKIAkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gc3VwZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7CiAJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7CiAJCQkJSVJ1bnRpbWUgcnQgPSAoSVJ1bnRpbWUpIGRlc2NyaXB0b3JzW2ldLmdldFByb3BlcnR5VmFsdWUoKTsKLQkJCQlpZiAocnQgPT0gbnVsbCB8fCBydC5zdXBwb3J0cyhFQVJGYWNldFV0aWxzLkVBUl9GQUNFVCkpIHsKKwkJCQlpZiAocnQgPT0gbnVsbCB8fCBydC5zdXBwb3J0cyhJSjJFRUZhY2V0Q29uc3RhbnRzLkVOVEVSUFJJU0VfQVBQTElDQVRJT05fRkFDRVQpKSB7CiAJCQkJCWxpc3QuYWRkKGRlc2NyaXB0b3JzW2ldKTsKIAkJCQl9CiAJCQl9CkBAIC05MSw2ICs5OCw3IEBACiAJCXJldHVybiBzdXBlci5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewogCQlpZiAoRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBBRERfVE9fRUFSLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CiAJCQlJRGF0YU1vZGVsIG5lc3RlZEoyRUVGYWNldERhdGFNb2RlbCA9IGdldEoyRUVGYWNldE1vZGVsKCk7CkBAIC0xMTQsNyArMTIyLDcgQEAKIAkJCQkJCQkJc2V0UHJvcGVydHkoRkFDRVRfUlVOVElNRSwgZmFjZXRkRWFyUHJvamVjdC5nZXRSdW50aW1lKCkpOwogCQkJCQkJCX0KIAkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KQEAgLTE0NCw2ICsxNTIsNyBAQAogCQlyZXR1cm4gbnVsbDsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCWlmIChGQUNFVF9SVU5USU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CiAJCQlpZiAoZ2V0Qm9vbGVhblByb3BlcnR5KEFERF9UT19FQVIpKSB7CkBAIC0xNTgsNyArMTY3LDcgQEAKIAkJCQkJCQkJcmV0dXJuIGZhbHNlOwogCQkJCQkJCX0KIAkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KQEAgLTE2OCw2ICsxNzcsNyBAQAogCQlyZXR1cm4gc3VwZXIuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCWlmIChBRERfVE9fRUFSLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IEVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgRkFDRVRfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CiAJCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KEFERF9UT19FQVIpKSB7CkBAIC0xNzgsNiArMTg4LDEwIEBACiAJCQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuU0FNRV9NT0RVTEVfQU5EX0VBUl9OQU1FLCBuZXcgT2JqZWN0W117Z2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSl9KTsKIAkJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOwogCQkJCX0KKwkJCQlpZiAoIWNhc2VTZW5zaXRpdmVGcyAmJiBnZXRTdHJpbmdQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSkuZXF1YWxzSWdub3JlQ2FzZShnZXRTdHJpbmdQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FKSkpIHsKKwkJCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5TQU1FX01PRFVMRV9BTkRfRUFSX05BTUVfRElGRkVSRU5UX0NBU0UsIG5ldyBPYmplY3RbXXtnZXRTdHJpbmdQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FKX0pOworCQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKGVycm9yTWVzc2FnZSk7CisJCQkJfQogCQkJfQogCQl9CiAJCXJldHVybiBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwpAQCAtMTg3LDcgKzIwMSw3IEBACiAJCWlmIChlYXJOYW1lLmluZGV4T2YoIiMiKSAhPSAtMSB8fCBlYXJOYW1lLmluZGV4T2YoIi8iKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuRVJSX0lOVkFMSURfQ0hBUlMpOwogCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOwotCQl9IGVsc2UgaWYgKGVhck5hbWUgPT0gbnVsbCB8fCBlYXJOYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAorCQl9IGVsc2UgaWYgKGVhck5hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCiAJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLkVSUl9FTVBUWV9NT0RVTEVfTkFNRSk7CiAJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKGVycm9yTWVzc2FnZSk7CiAJCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSjJFRUZhY2V0UnVudGltZUNoYW5nZWREZWxlZ2F0ZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KMkVFRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlLmphdmEKaW5kZXggMjdjNDA4My4uYzRmZDQxNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KMkVFRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KMkVFRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlLmphdmEKQEAgLTEyLDIxICsxMiwzMCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQXR0cmlidXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkNsYXNzcGF0aEhlbHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JQ2xhc3NwYXRoUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRGVsZWdhdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwpAQCAtNDQsNiArNTMsOSBAQAogICAgIGltcGxlbWVudHMgSURlbGVnYXRlCiAgICAgCiB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX01FVEFEQVRBX0ZJTEVfTkFNRSAKKyAgICA9ICIuc2V0dGluZ3Mvb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJlZnMiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9XTkVSX1BST0pFQ1RfRkFDRVRTX0FUVFIgPSAib3duZXIucHJvamVjdC5mYWNldHMiOyAvLyROT04tTkxTLTEkCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgSVByb2plY3QgcHJvamVjdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNmZywKQEAgLTU0LDcgKzY2LDcgQEAKICAgICB7CiAgICAgICAgIGlmKCBtb25pdG9yICE9IG51bGwgKQogICAgICAgICB7Ci0gICAgICAgICAgICBtb25pdG9yLmJlZ2luVGFzayggIiIsIDEgKTsKKyAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCAiIiwgMTEgKTsgLy8kTk9OLU5MUy0xJAogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICB0cnkKQEAgLTczLDYgKzg1LDI3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbW9uaXRvci53b3JrZWQoIDEgKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQ2FzY2FkZSB0aGlzIHJ1bnRpbWUgY2hhbmdlIHRvIHByb2plY3RzIHJlZmVyZW5jZWQgYnkgdGhpcyBwcm9qZWN0CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIENvbXBpbGUgdGhlIGxpc3Qgb2YgcHJvamVjdHMgcmVmZXJlbmNlZCBieSB0aGlzIHByb2plY3QuCisgICAgICAgICAgICBmaW5hbCBTZXQ8SVByb2plY3Q+IGNoaWxkUHJvamVjdHMgPSBuZXcgSGFzaFNldDxJUHJvamVjdD4oKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZmluYWwgSVZpcnR1YWxDb21wb25lbnQgcHJvamVjdFZDID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoIHByb2plY3QgKTsKKyAgICAgICAgICAgIGZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlW10gdnJlZnMgPSBwcm9qZWN0VkMuZ2V0UmVmZXJlbmNlcygpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IHZyZWZzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIGZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHZyZWYgPSB2cmVmc1sgaSBdOworICAgICAgICAgICAgICAgIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHZjID0gdnJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CisgICAgICAgICAgICAgICAgY2hpbGRQcm9qZWN0cy5hZGQoIHZjLmdldFByb2plY3QoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggbW9uaXRvciAhPSBudWxsICkgeworICAgICAgICAgICAgICAgIG1vbml0b3Iud29ya2VkKCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gY2hhbmdlIHRoZSBydW50aW1lIGZvciBlYWNoIG9mIHRoZSByZWZlcmVuY2VkIHByb2plY3RzLiAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHVwZGF0ZVByb2plY3RSdW50aW1lKCBwcm9qZWN0LCBjaGlsZFByb2plY3RzLCBzdWJtb24oIG1vbml0b3IsIDkgKSApOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKICAgICAgICAgewpAQCAtOTUsMTUgKzEyOCw1NCBAQAogCQkJQ2xhc3NwYXRoSGVscGVyLnJlbW92ZUNsYXNzcGF0aEVudHJpZXMocHJvamVjdCwgZnYpOwogCX0KICAgICBwcml2YXRlIGJvb2xlYW4gaGFzQ2xhc3NwYXRoUHJlZmVyZW5jZXNOb2RlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJUHJvamVjdFNjb3BlIHNjb3BlID0gbmV3IFByb2plY3RTY29wZShwcm9qZWN0KTsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwbHVnaW5Sb290ID0gc2NvcGUuZ2V0Tm9kZShGYWNldENvcmVQbHVnaW4uUExVR0lOX0lEKTsKLQkJYm9vbGVhbiBjbGFzc3BhdGhOb2RlRXhpc3RzID0gZmFsc2U7CisgICAgCQorICAgIAlJUHJvamVjdCBwaiA9IHByb2plY3QuZ2V0UHJvamVjdCgpOworICAgICAgICBJRmlsZSBsZWdhY3lNZXRhZGF0YUZpbGUgPSBwai5nZXRGaWxlKCBMRUdBQ1lfTUVUQURBVEFfRklMRV9OQU1FICk7CisgICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIGZpbGUgZXhpc3RzCisgICAgICAgIGlmKCBsZWdhY3lNZXRhZGF0YUZpbGUuZXhpc3RzKCkgKSB7CisgICAgICAgIAlQcm9qZWN0U2NvcGUgc2NvcGUgPSBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpOworICAgICAgICAJSUVjbGlwc2VQcmVmZXJlbmNlcyBwbHVnaW5Sb290ID0gc2NvcGUuZ2V0Tm9kZShGYWNldENvcmVQbHVnaW4uUExVR0lOX0lEKTsKKyAgICAgICAgCXRyeSB7CisgICAgICAgIAkJcmV0dXJuIHBsdWdpblJvb3Qubm9kZUV4aXN0cygiY2xhc3NwYXRoLmhlbHBlciIpOyAvLyROT04tTkxTLTEkCisgICAgICAgIAl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworICAgICAgICAJfQorICAgICAgICB9CisgICAgICAgIC8vTm93IGNoZWNrIGNsYXNzcGF0aCBlbnRyaWVzIGZvciBuZXcgYXR0cmlidXRlcworICAgICAgICBJSmF2YVByb2plY3QganByb2ogPSBKYXZhQ29yZS5jcmVhdGUoIHByb2plY3QgKTsKKyAgICAgICAgcmV0dXJuIGhhc0NsYXNzcGF0aFByZWZlcmVuY2VzTm9kZShqcHJvaik7CisJCQorCX0KKwlwcml2YXRlIGJvb2xlYW4gaGFzQ2xhc3NwYXRoUHJlZmVyZW5jZXNOb2RlKElKYXZhUHJvamVjdCBqcHJvaikgeworCQkKKwkJYm9vbGVhbiBhdHRyaWJ1dGVGb3VuZCA9IGZhbHNlOworCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gbnVsbDsKIAkJdHJ5IHsKLQkJCWNsYXNzcGF0aE5vZGVFeGlzdHMgPSBwbHVnaW5Sb290Lm5vZGVFeGlzdHMoImNsYXNzcGF0aC5oZWxwZXIiKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKKwkJCWVudHJpZXMgPSBqcHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKIAkJCW9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQl9Ci0JCXJldHVybiBjbGFzc3BhdGhOb2RlRXhpc3RzOworCQlpbnQgaSA9IDA7CisJCWlmIChlbnRyaWVzICE9IG51bGwpIHsKKwkJCXdoaWxlICghYXR0cmlidXRlRm91bmQgJiYgaSA8IGVudHJpZXMubGVuZ3RoKSB7CisJCQkJSUNsYXNzcGF0aEVudHJ5IGNwZSA9IGVudHJpZXNbaV07CisJCQkJYXR0cmlidXRlRm91bmQgPSBoYXNPd25lckF0dHJpYnV0ZSggY3BlICk7CisJCQkJaSsrOworCQkJfSAKKwkJfQorCQlyZXR1cm4gYXR0cmlidXRlRm91bmQ7CisJCQorCX0KKwlwcml2YXRlIGJvb2xlYW4gaGFzT3duZXJBdHRyaWJ1dGUoSUNsYXNzcGF0aEVudHJ5IGNwZSkgeworCQkgaWYoIGNwZSAhPSBudWxsICkKKwkgICAgICAgIHsKKwkgICAgICAgICAgICBmb3IoIElDbGFzc3BhdGhBdHRyaWJ1dGUgYXR0ciA6IGNwZS5nZXRFeHRyYUF0dHJpYnV0ZXMoKSApCisJICAgICAgICAgICAgeworCSAgICAgICAgICAgICAgICBpZiggYXR0ci5nZXROYW1lKCkuZXF1YWxzKCBPV05FUl9QUk9KRUNUX0ZBQ0VUU19BVFRSICkgKQorCSAgICAgICAgICAgICAgICAJcmV0dXJuIHRydWU7CisJICAgICAgICAgICAgfQorCSAgICAgICAgfQorCQkgcmV0dXJuIGZhbHNlOwogCX0KIAlwcml2YXRlIHZvaWQgcmVtb3ZlT25seUNQRW50cmllcyhmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgZmluYWwgSUphdmFQcm9qZWN0IGpwcm9qLCBmaW5hbCBMaXN0IGNwLAogCQkJSVJ1bnRpbWUgb2xkUnVudGltZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewpAQCAtMTUzLDUgKzIyNSw4MiBAQAogCQogCQlyZXR1cm4gbGlzdDsKIAl9CisJCisgICAgcHJpdmF0ZSBzdGF0aWMgSVByb2dyZXNzTW9uaXRvciBzdWJtb24oIGZpbmFsIElQcm9ncmVzc01vbml0b3IgcGFyZW50LCBmaW5hbCBpbnQgdGlja3MgKSB7CisgICAgICAgIHJldHVybiAoIHBhcmVudCA9PSBudWxsID8gbnVsbCA6IG5ldyBTdWJQcm9ncmVzc01vbml0b3IoIHBhcmVudCwgdGlja3MgKSApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlUHJvamVjdFJ1bnRpbWUoIGZpbmFsIElQcm9qZWN0IHByb2plY3QsCisgICAgICAgICAgICBmaW5hbCBJUHJvamVjdCBjaGlsZFByb2plY3QsCisgICAgICAgICAgICBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisgICAgCWlmKCBtb25pdG9yICE9IG51bGwgKSB7CisgICAgCQltb25pdG9yLmJlZ2luVGFzayggIiIsIDEgKTsgLy8kTk9OLU5MUy0xJAorICAgIAl9CiAKKyAgICAJdHJ5CisgICAgCXsKKyAgICAJCWZpbmFsIElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSggcHJvamVjdCApOworCisgICAgCQlmaW5hbCBJUnVudGltZSBwcm9qZWN0UnVudGltZSA9IGZhY2V0ZWRQcm9qZWN0LmdldFJ1bnRpbWUoKTsKKworICAgIAkJZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGNoaWxkRmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoIGNoaWxkUHJvamVjdCApOworCisgICAgCQlpZiggY2hpbGRGYWNldGVkUHJvamVjdCAhPSBudWxsICYmIAorICAgIAkJCQkhIGVxdWFscyhwcm9qZWN0UnVudGltZSwgY2hpbGRGYWNldGVkUHJvamVjdC5nZXRSdW50aW1lKCkpKQorICAgIAkJeworICAgIAkJCWJvb2xlYW4gc3VwcG9ydHMgPSB0cnVlOworCisgICAgCQkJaWYoIHByb2plY3RSdW50aW1lICE9IG51bGwgKQorICAgIAkJCXsKKyAgICAJCQkJZm9yKCBJdGVyYXRvciBpdHIgPSBjaGlsZEZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3RGYWNldHMoKS5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyApIHsKKyAgICAJCQkJCWZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ZXIgPSAoSVByb2plY3RGYWNldFZlcnNpb24pIGl0ci5uZXh0KCk7CisKKyAgICAJCQkJCWlmKCFwcm9qZWN0UnVudGltZS5zdXBwb3J0cyhmdmVyKSkgeworICAgIAkJCQkJCXN1cHBvcnRzID0gZmFsc2U7CisgICAgCQkJCQkJYnJlYWs7CisgICAgCQkJCQl9CisgICAgCQkJCX0KKyAgICAJCQl9CisKKyAgICAJCQlpZiggc3VwcG9ydHMgKSB7CisgICAgCQkJCWNoaWxkRmFjZXRlZFByb2plY3Quc2V0UnVudGltZShwcm9qZWN0UnVudGltZSwgc3VibW9uKCBtb25pdG9yLCAxICkgKTsKKyAgICAJCQl9CisgICAgCQl9CisgICAgCX0KKyAgICAJZmluYWxseSB7CisgICAgCQlpZiggbW9uaXRvciAhPSBudWxsICkgeworICAgIAkJCW1vbml0b3IuZG9uZSgpOworICAgIAkJfQorICAgIAl9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVByb2plY3RSdW50aW1lKCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAorICAgIAkJZmluYWwgU2V0PElQcm9qZWN0PiBjaGlsZFByb2plY3RzLAorICAgIAkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgdGhyb3dzIENvcmVFeGNlcHRpb24geyAgICAgICAgCisgICAgCWlmKCBtb25pdG9yICE9IG51bGwgKSB7CisgICAgCQltb25pdG9yLmJlZ2luVGFzayggIiIsIGNoaWxkUHJvamVjdHMuc2l6ZSgpICk7IC8vJE5PTi1OTFMtMSQKKyAgICAJfQorCisgICAgCXRyeSB7CisgICAgCQlmb3IoZmluYWwgSVByb2plY3QgY2hpbGRQcm9qZWN0IDogY2hpbGRQcm9qZWN0cykgeworICAgIAkJCXVwZGF0ZVByb2plY3RSdW50aW1lKCBwcm9qZWN0LCBjaGlsZFByb2plY3QsCisgICAgCQkJCQlzdWJtb24oIG1vbml0b3IsIDEgKSApOworICAgIAkJfQorICAgIAl9CisgICAgCWZpbmFsbHkgeworICAgIAkJaWYoIG1vbml0b3IgIT0gbnVsbCApIHsKKyAgICAJCQltb25pdG9yLmRvbmUoKTsKKyAgICAJCX0KKyAgICAJfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyggZmluYWwgT2JqZWN0IG9iajEsIGZpbmFsIE9iamVjdCBvYmoyICkgeworICAgICAgICBpZiggb2JqMSA9PSBvYmoyICkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiggb2JqMSA9PSBudWxsIHx8IG9iajIgPT0gbnVsbCApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvYmoxLmVxdWFscyggb2JqMiApOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggMmM4N2MwOS4uYzk5YTUxYSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC9KMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L0oyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0xMSw2ICsxMSw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVN0YXR1czsKQEAgLTE4LDIyICsxOSwyOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5JSmF2YUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LkphdmFGYWNldFV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldEluc3RhbGxDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0SW5zdGFsbENvbmZpZy5DaGFuZ2VFdmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQcmVmZXJlbmNlcy5LZXlzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5Qcm9qZWN0U3VwcG9ydFJlc291cmNlSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GYWNldERhdGFNb2RlbE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKQEAgLTQyLDggKzQ5LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS51dGlsLklFdmVudExpc3RlbmVyOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKIApAQCAtNTMsNiArNjQsMjcgQEAKIAkgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9ISUJJVF9BRERfVE9fRUFSID0gIkoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5QUk9ISUJJVF9BRERfVE9fRUFSIjsgLy8kTk9OLU5MUy0xJAogCisgICAgcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGZwandjID0gbnVsbDsKKyAgICBwcml2YXRlIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGZwandjTGlzdGVuZXIgPSBudWxsOworICAgIHByb3RlY3RlZCBKYXZhRmFjZXRJbnN0YWxsQ29uZmlnIGphdmFGYWNldEluc3RhbGxDb25maWcgPSBudWxsOworCisgICAgcHJpdmF0ZSBJRXZlbnRMaXN0ZW5lcjxKYXZhRmFjZXRJbnN0YWxsQ29uZmlnLkNoYW5nZUV2ZW50PiBqYXZhRmFjZXRTb3VyY2VGb2xkZXJMaXN0ZW5lciAKKyAgICAgICAgPSBuZXcgSUV2ZW50TGlzdGVuZXI8SmF2YUZhY2V0SW5zdGFsbENvbmZpZy5DaGFuZ2VFdmVudD4oKQorICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoIGZpbmFsIENoYW5nZUV2ZW50IGV2ZW50ICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhbmRsZUphdmFGYWNldFNvdXJjZUZvbGRlcnNDaGFuZ2VkKCBldmVudCApOworICAgICAgICB9CisgICAgfTsKKworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUphdmFGYWNldFNvdXJjZUZvbGRlcnNDaGFuZ2VkKCBmaW5hbCBDaGFuZ2VFdmVudCBldmVudCApCisgICAgeworICAgICAgICBmaW5hbCBMaXN0PElQYXRoPiBzb3VyY2VGb2xkZXJzID0gZXZlbnQuZ2V0SmF2YUZhY2V0SW5zdGFsbENvbmZpZygpLmdldFNvdXJjZUZvbGRlcnMoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZUZvbGRlciA9ICggc291cmNlRm9sZGVycy5pc0VtcHR5KCkgPyBudWxsIDogc291cmNlRm9sZGVycy5nZXQoIDAgKS50b1BvcnRhYmxlU3RyaW5nKCkgKTsKKyAgICAgICAgZ2V0RGF0YU1vZGVsKCkuc2V0UHJvcGVydHkoIENPTkZJR19GT0xERVIsIHNvdXJjZUZvbGRlciApOworICAgIH0KKwkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7CiAJCVNldCBuYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKIAkJbmFtZXMuYWRkKEFERF9UT19FQVIpOwpAQCAtNjMsMzggKzk1LDQzIEBACiAJCW5hbWVzLmFkZChNT0RVTEVfVVJJKTsKIAkJLy8gYWRkZWQgZm9yIGplZSBtb2R1bGVzIHRoYXQgbWFrZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG9wdGlvbmFsCiAJCW5hbWVzLmFkZChJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuR0VORVJBVEVfREQpOwotCQkvL2FkZGluZyBvdXRwdXQgZm9sZGVyCi0JCW5hbWVzLmFkZChPVVRQVVRfRk9MREVSKTsKKwkJbmFtZXMuYWRkKElOU1RBTExfRUFSX0xJQlJBUlkpOwogCQlyZXR1cm4gbmFtZXM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9ISUJJVF9BRERfVE9fRUFSKSkgewogCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CiAJCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhBRERfVE9fRUFSKSkgewogCQkJcmV0dXJuIG5ldyBCb29sZWFuKCBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkFERF9UT19FQVJfQllfREVGQVVMVCkgJiYgaXNFQVJTdXBwb3J0ZWRCeVJ1bnRpbWUoKSk7CiAJCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQVJfUFJPSkVDVF9OQU1FKSkgeworCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3MgPSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoRUFSX1BST0pFQ1RfTkFNRSk7CiAJCQlpZiAobW9kZWwuaXNQcm9wZXJ0eVNldChMQVNUX0VBUl9OQU1FKSkgewogCQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZ2V0U3RyaW5nUHJvcGVydHkoTEFTVF9FQVJfTkFNRSkpOwotCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCi0JCQkJCXJldHVybiBwcm9qZWN0LmdldE5hbWUoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NzLmxlbmd0aDsgaSsrKSB7CisJCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkgJiYgcHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKGRlc2NzW2ldLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSkpeworCQkJCQkJcmV0dXJuIHByb2plY3QuZ2V0TmFtZSgpOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiBnZXREYXRhTW9kZWwoKS5nZXRTdHJpbmdQcm9wZXJ0eShGQUNFVF9QUk9KRUNUX05BTUUpICsgIkVBUiI7IC8vJE5PTi1OTFMtMSQKIAkJCX0KLQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGRlc2NzID0gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKEVBUl9QUk9KRUNUX05BTUUpOwogCQkJaWYgKGRlc2NzLmxlbmd0aCA+IDApIHsKIAkJCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgZGVzYyA9IGRlc2NzWzBdOwogCQkJCVN0cmluZyBlQVJOYW1lID0gZGVzYy5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCk7CiAJCQkJaWYgKGVBUk5hbWUgIT0gbnVsbCAmJiAhZUFSTmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQkJcmV0dXJuIGVBUk5hbWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSkgKyAiRUFSIjsgLy8kTk9OLU5MUy0xJAogCQkJCX0KLQkJCX0gZWxzZSB7CiAJCQkJcmV0dXJuIGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSkgKyAiRUFSIjsgLy8kTk9OLU5MUy0xJAogCQkJfQorCQkJcmV0dXJuIGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSkgKyAiRUFSIjsgLy8kTk9OLU5MUy0xJAorCQl9ZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhJTlNUQUxMX0VBUl9MSUJSQVJZKSl7CisJCQlyZXR1cm4gSjJFRUNvbXBvbmVudENsYXNzcGF0aENvbnRhaW5lclV0aWxzLmdldERlZmF1bHRVc2VFQVJMaWJyYXJpZXMoKTsKIAkJfQogCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKIAkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPSElCSVRfQUREX1RPX0VBUikpIHsKIAkJCXNldEJvb2xlYW5Qcm9wZXJ0eShBRERfVE9fRUFSLCBmYWxzZSk7CkBAIC0xMjAsMTIgKzE1NywxMiBAQAogCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUVBUihtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FKSk7CiAJCQlpZiAoc3RhdHVzLmlzT0soKSkgewogCQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoZ2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSkpOwotCQkJCWlmIChwcm9qZWN0LmV4aXN0cygpICYmIHByb2plY3QuaXNBY2Nlc3NpYmxlKCkgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKSB7CisJCQkJaWYgKHByb2plY3QuZXhpc3RzKCkgJiYgcHJvamVjdC5pc0FjY2Vzc2libGUoKSAmJiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSkgewogCQkJCQl0cnkgewogCQkJCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0UHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0LCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CiAJCQkJCQlzZXRQcm9wZXJ0eShGQUNFVF9SVU5USU1FLCBmYWNldFByb2ouZ2V0UnVudGltZSgpKTsKIAkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtMTMzLDE3ICsxNzAsMjEgQEAKIAkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUlVOVElNRSkpIHsKIAkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEFERF9UT19FQVIsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7CiAJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShFQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQl9ZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPVVRQVVRfRk9MREVSKSkgewotCQkJSURhdGFNb2RlbCBtYXN0ZXJNb2RlbCA9IChJRGF0YU1vZGVsKSBtb2RlbC5nZXRQcm9wZXJ0eShNQVNURVJfUFJPSkVDVF9ETSk7Ci0JCQlpZiAobWFzdGVyTW9kZWwgIT0gbnVsbCkgewotCQkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgbWFzdGVyTW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotCQkJCUlEYXRhTW9kZWwgamF2YU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKEpBVkEpOwotCQkJCWlmIChqYXZhTW9kZWwgIT0gbnVsbCkgewotCQkJCQlqYXZhTW9kZWwuc2V0UHJvcGVydHkoSUphdmFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFRkFVTFRfT1VUUFVUX0ZPTERFUl9OQU1FLAotCQkJCQkJCXByb3BlcnR5VmFsdWUpOwotCQkJCX0KLQkJCX0KIAkJfQorICAgICAgICBlbHNlIGlmKCBwcm9wZXJ0eU5hbWUuZXF1YWxzKCBGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZICkgKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmZwandjID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSBwcm9wZXJ0eVZhbHVlOworCisgICAgICAgICAgICB0aGlzLmZwandjTGlzdGVuZXIgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KCBmaW5hbCBJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlUHJvamVjdEZhY2V0c0NoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgCisgICAgICAgICAgICB0aGlzLmZwandjLmFkZExpc3RlbmVyKCB0aGlzLmZwandjTGlzdGVuZXIsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJPSkVDVF9GQUNFVFNfQ0hBTkdFRCApOworICAgICAgICB9CiAKIAkJaWYgKEFERF9UT19FQVIuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKIAkJCUlTdGF0dXMgc3RhdCA9IG1vZGVsLnZhbGlkYXRlUHJvcGVydHkocHJvcGVydHlOYW1lKTsKQEAgLTE1NSw3ICsxOTYsNTQgQEAKIAogCQlyZXR1cm4gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKIAl9CisJCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2plY3RGYWNldHNDaGFuZ2VkKCkKKyAgICB7CisgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdC5BY3Rpb24gamF2YUluc3RhbGxBY3Rpb24KKyAgICAgICAgICAgID0gdGhpcy5mcGp3Yy5nZXRQcm9qZWN0RmFjZXRBY3Rpb24oIEphdmFGYWNldFV0aWxzLkpBVkFfRkFDRVQgKTsKKyAgICAgICAgCisgICAgICAgIGlmKCBqYXZhSW5zdGFsbEFjdGlvbiAhPSBudWxsICkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbmZpZyA9IGphdmFJbnN0YWxsQWN0aW9uLmdldENvbmZpZygpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZihjb25maWcgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAlpZiggY29uZmlnIGluc3RhbmNlb2YgSmF2YUZhY2V0SW5zdGFsbENvbmZpZyApCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQl0aGlzLmphdmFGYWNldEluc3RhbGxDb25maWcgPSAoSmF2YUZhY2V0SW5zdGFsbENvbmZpZykgY29uZmlnOworICAgICAgICAgICAgCQkKKyAgICAgICAgICAgIAkJU3RyaW5nIHByb3ZpZGVySWQgPSBtb2RlbC5nZXRJRCgpOworICAgICAgICAgICAgCQlpZihwcm92aWRlcklkICE9ICIiKSAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgIAkJCWlmIChwcm92aWRlcklkLmluZGV4T2YoIldlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgIAkJCXsgdGhpcy5qYXZhRmFjZXRJbnN0YWxsQ29uZmlnLnNldERlZmF1bHRPdXRwdXRGb2xkZXIobmV3IFBhdGgoSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEtleXMuRFlOX1dFQl9PVVRQVVRfRk9MREVSKSkpOyB9CisgICAgICAgICAgICAJCQllbHNlICAgICAgICAgICAgCQkJCisgICAgICAgICAgICAJCQkJaWYocHJvdmlkZXJJZC5pbmRleE9mKCJFamJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciIpICE9IC0xKSAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAJCQkJeyB0aGlzLmphdmFGYWNldEluc3RhbGxDb25maWcuc2V0RGVmYXVsdE91dHB1dEZvbGRlcihuZXcgUGF0aChKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoS2V5cy5FSkJfT1VUUFVUX0ZPTERFUikpKTsgfQorICAgICAgICAgICAgCQkJCWVsc2UKKyAgICAgICAgICAgIAkJCQkJaWYocHJvdmlkZXJJZC5pbmRleE9mKCJBcHBDbGllbnRGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciIpICE9IC0xKSAvLyROT04tTkxTLTEkCisgICAgICAgICAgICAJCQkJCXsgdGhpcy5qYXZhRmFjZXRJbnN0YWxsQ29uZmlnLnNldERlZmF1bHRPdXRwdXRGb2xkZXIobmV3IFBhdGgoSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SjJFRVByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEtleXMuQVBQX0NMSUVOVF9PVVRQVVRfRk9MREVSKSkpOyB9CisgICAgICAgICAgICAJCQkJCWVsc2UKKyAgICAgICAgICAgICAgICAJCQkJCWlmKHByb3ZpZGVySWQuaW5kZXhPZigiQ29ubmVjdG9yRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIiKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAorICAgICAgICAgICAgICAgIAkJCQkJeyB0aGlzLmphdmFGYWNldEluc3RhbGxDb25maWcuc2V0RGVmYXVsdE91dHB1dEZvbGRlcihuZXcgUGF0aChKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRKMkVFUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoS2V5cy5KQ0FfT1VUUFVUX0ZPTERFUikpKTsgfQorICAgICAgICAgICAgICAgIAkJCQkJZWxzZQorICAgICAgICAgICAgICAgICAgICAJCQkJCWlmKHByb3ZpZGVySWQuaW5kZXhPZigiVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIikgIT0gLTEpIC8vJE5PTi1OTFMtMSQKKyAgICAgICAgICAgICAgICAgICAgCQkJCQl7IHRoaXMuamF2YUZhY2V0SW5zdGFsbENvbmZpZy5zZXREZWZhdWx0T3V0cHV0Rm9sZGVyKG5ldyBQYXRoKEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEoyRUVQcmVmZXJlbmNlcygpLmdldFV0aWxpdHlPdXRwdXRGb2xkZXJOYW1lKCkpKTsgfQorICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgCWVsc2UKKyAgICAgICAgICAgIAl7CisgICAgICAgICAgICAJCXRoaXMuamF2YUZhY2V0SW5zdGFsbENvbmZpZyA9IChKYXZhRmFjZXRJbnN0YWxsQ29uZmlnKSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIoIGNvbmZpZywgSmF2YUZhY2V0SW5zdGFsbENvbmZpZy5jbGFzcyApOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAlpZiAodGhpcy5qYXZhRmFjZXRJbnN0YWxsQ29uZmlnICE9IG51bGwpCisgICAgICAgICAgICAJeworICAgICAgICAgICAgCQl0aGlzLmphdmFGYWNldEluc3RhbGxDb25maWcuYWRkTGlzdGVuZXIoIHRoaXMuamF2YUZhY2V0U291cmNlRm9sZGVyTGlzdGVuZXIsIEphdmFGYWNldEluc3RhbGxDb25maWcuQ2hhbmdlRXZlbnQuVHlwZS5TT1VSQ0VfRk9MREVSU19DSEFOR0VEICk7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAoQUREX1RPX0VBUi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewogCQkJcmV0dXJuICFnZXRCb29sZWFuUHJvcGVydHkoUFJPSElCSVRfQUREX1RPX0VBUikgJiYgaXNFQVJTdXBwb3J0ZWRCeVJ1bnRpbWUoKTsKQEAgLTE2Niw2ICsyNTQsNyBAQAogCQlyZXR1cm4gc3VwZXIuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKIAkJaWYgKEVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKIAkJCWludCBqMmVlVmVyc2lvbiA9IGdldEoyRUVWZXJzaW9uKCk7CkBAIC0xNzUsMzAgKzI2NCwyNCBAQAogCX0KIAogCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRFQVJQcm9wZXJ0eURlc2NyaXB0b3JzKGludCBqMmVlVmVyc2lvbikgewotCQlTdHJ1Y3R1cmVFZGl0IG1jID0gbnVsbDsKIAkJQXJyYXlMaXN0IGVhckRlc2NyaXB0b3JMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwogCiAJCUlQcm9qZWN0W10gcHJvanMgPSBQcm9qZWN0VXRpbGl0aWVzLmdldEFsbFByb2plY3RzKCk7CiAKIAkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHByb2pzLmxlbmd0aDsgaW5kZXgrKykgewogCQkJSVByb2plY3QgZmxleFByb2plY3QgPSBwcm9qc1tpbmRleF07Ci0JCQl0cnkgewotCQkJCWlmIChmbGV4UHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCWlmIChNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KGZsZXhQcm9qZWN0KSkgewotCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGZsZXhQcm9qZWN0KTsKLQkJCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCQkJU3RyaW5nIHNWZXIgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFZlcnNpb24oY29tcC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJCWludCB2ZXIgPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25TdHJpbmdUb0ludChzVmVyKTsKLQkJCQkJCQlpZiAoajJlZVZlcnNpb24gPD0gdmVyKSB7Ci0JCQkJCQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkZXNjID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihjb21wLmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQkJCQkJCQllYXJEZXNjcmlwdG9yTGlzdC5hZGQoZGVzYyk7Ci0JCQkJCQkJfQorCQkJaWYgKGZsZXhQcm9qZWN0ICE9IG51bGwpIHsKKwkJCQlpZiAoTW9kdWxlQ29yZU5hdHVyZS5pc0ZsZXhpYmxlUHJvamVjdChmbGV4UHJvamVjdCkpIHsKKwkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGZsZXhQcm9qZWN0KTsKKwkJCQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXAuZ2V0UHJvamVjdCgpKSkgeworCQkJCQkJU3RyaW5nIHNWZXIgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFZlcnNpb24oY29tcC5nZXRQcm9qZWN0KCkpOworCQkJCQkJaW50IHZlciA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0VmVyc2lvblN0cmluZ1RvSW50KHNWZXIpOworCQkJCQkJaWYgKGoyZWVWZXJzaW9uIDw9IHZlcikgeworCQkJCQkJCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkZXNjID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihjb21wLmdldFByb2plY3QoKS5nZXROYW1lKCkpOworCQkJCQkJCWVhckRlc2NyaXB0b3JMaXN0LmFkZChkZXNjKTsKIAkJCQkJCX0KIAkJCQkJfQogCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKG1jICE9IG51bGwpCi0JCQkJCW1jLmRpc3Bvc2UoKTsKIAkJCX0KIAkJfQogCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbZWFyRGVzY3JpcHRvckxpc3Quc2l6ZSgpXTsKQEAgLTIwOSw2ICsyOTIsNyBAQAogCQlyZXR1cm4gZGVzY3JpcHRvcnM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIG5hbWUpIHsKIAkJaWYgKG5hbWUuZXF1YWxzKEVBUl9QUk9KRUNUX05BTUUpICYmIGdldEJvb2xlYW5Qcm9wZXJ0eShBRERfVE9fRUFSKSkgewogCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUVBUihnZXRTdHJpbmdQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FKSk7CkBAIC0yMjIsMjYgKzMwNiwyNiBAQAogCQkJfQogCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKENPTkZJR19GT0xERVIpKSB7CiAJCQlTdHJpbmcgZm9sZGVyTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KENPTkZJR19GT0xERVIpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSAgdmFsaWRhdGVGb2xkZXJzKGZvbGRlck5hbWUpOwotCQkJaWYoc3RhdHVzLmlzT0soKSl7Ci0JCQkJU3RyaW5nIG91dGZvbGRlck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShPVVRQVVRfRk9MREVSKTsKLQkJCQlzdGF0dXMgPSB2YWxpZGF0ZVNvdXJjZUFuZE91dHB1dEZvbGRlckNhc2UoZm9sZGVyTmFtZSwgb3V0Zm9sZGVyTmFtZSk7CisJCQlpZiAoZm9sZGVyTmFtZSA9PSBudWxsIHx8IGZvbGRlck5hbWUubGVuZ3RoKCkgPT0gMCB8fCBmb2xkZXJOYW1lLmVxdWFscygiLyIpIHx8IGZvbGRlck5hbWUuZXF1YWxzKCJcXCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCS8vIGFsbCBmb2xkZXJzIHdoaWNoIG1lZXQgdGhlIGNyaXRlcmlhIG9mICJDT05GSUdfRk9MREVSIiBhcmUgcmVxdWlyZWQKKwkJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlNPVVJDRUZPTERFUl9FTVBUWSk7CisJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOworCQkJfQorCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUZvbGRlck5hbWUoZm9sZGVyTmFtZSk7CisJCQlpZiAoc3RhdHVzLmlzT0soKSkKKwkJCXsKKwkJCQkvKiBidWcgMjIzMDcyIHRlc3QgaW52YWxpZCBjaGFyYWN0ZXIgLSBVUkkuRlJBR01FTlRfU0VQQVJBVE9SICovCisJCQkJaWYgKGZvbGRlck5hbWUuaW5kZXhPZignIycpICE9IC0xKSB7IAorCQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLnJlc291cmNlc19pbnZhbGlkQ2hhckluTmFtZSwgIiMiLCBmb2xkZXJOYW1lKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlzdGF0dXMgPSBuZXcgUmVzb3VyY2VTdGF0dXMoSVJlc291cmNlU3RhdHVzLklOVkFMSURfVkFMVUUsIG51bGwsIG1lc3NhZ2UpOworCQkJCX0KIAkJCX0KIAkJCXJldHVybiBzdGF0dXM7Ci0JCQkKIAkJfSBlbHNlIGlmIChuYW1lLmVxdWFscyhBRERfVE9fRUFSKSkgewogCQkJaWYgKCFpc0VBUlN1cHBvcnRlZEJ5UnVudGltZSgpKSB7CiAJCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5NT0RVTEVfTk9UX1NVUFBPUlRFRCk7CiAJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOwogCQkJfQotCQl9ZWxzZSBpZiAobmFtZS5lcXVhbHMoT1VUUFVUX0ZPTERFUikpIHsKLQkJCVN0cmluZyBmb2xkZXJOYW1lID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoT1VUUFVUX0ZPTERFUik7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlRm9sZGVycyhmb2xkZXJOYW1lKTsKLQkJCWlmKHN0YXR1cy5pc09LKCkpewotCQkJCVN0cmluZyBpbmZvbGRlck5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDT05GSUdfRk9MREVSKTsKLQkJCQlzdGF0dXMgPSB2YWxpZGF0ZVNvdXJjZUFuZE91dHB1dEZvbGRlckNhc2UoZm9sZGVyTmFtZSwgZm9sZGVyTmFtZSk7Ci0JCQl9CQkJCi0JCQlyZXR1cm4gc3RhdHVzOwogCQl9CiAJCXJldHVybiBzdXBlci52YWxpZGF0ZShuYW1lKTsKIAl9CkBAIC0yNjEsMzggKzM0NSwyNCBAQAogCQlib29sZWFuIHJldCA9IHRydWU7CiAJCUlSdW50aW1lIHJ0ID0gKElSdW50aW1lKSBtb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUpOwogCQlpZiAocnQgIT0gbnVsbCkKLQkJCXJldCA9IHJ0LnN1cHBvcnRzKEVBUkZhY2V0VXRpbHMuRUFSX0ZBQ0VUKTsKKwkJCXJldCA9IHJ0LnN1cHBvcnRzKElKMkVFRmFjZXRDb25zdGFudHMuRU5URVJQUklTRV9BUFBMSUNBVElPTl9GQUNFVCk7CiAJCXJldHVybiByZXQ7CiAJfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBjb252ZXJ0RmFjZXRWZXJzaW9uVG9KMkVFVmVyc2lvbiggSVByb2plY3RGYWNldFZlcnNpb24gdmVyc2lvbiApCisgICAgeworICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQorICAgIHsKKyAgICAgICAgaWYoIHRoaXMuZnBqd2MgIT0gbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZnBqd2MucmVtb3ZlTGlzdGVuZXIoIHRoaXMuZnBqd2NMaXN0ZW5lciApOworICAgICAgICB9CisgICAgfQogCQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUZvbGRlcnMoU3RyaW5nIGZvbGRlck5hbWUpewotCQkKLQkJaWYgKGZvbGRlck5hbWUgPT0gbnVsbCB8fCBmb2xkZXJOYW1lLmxlbmd0aCgpID09IDAgfHwgZm9sZGVyTmFtZS5lcXVhbHMoIi8iKSB8fCBmb2xkZXJOYW1lLmVxdWFscygiXFwiKSkgewotCQkJLy8gYWxsIGZvbGRlcnMgd2hpY2ggbWVldCB0aGUgY3JpdGVyaWEgb2YgIkNPTkZJR19GT0xERVIiIGFyZSByZXF1aXJlZAotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFdUUENvbW1vblBsdWdpbi5nZXRSZXNvdXJjZVN0cmluZyhXVFBDb21tb25NZXNzYWdlcy5TT1VSQ0VGT0xERVJfRU1QVFkpOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOwotCQl9IGVsc2UgewotCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUZvbGRlck5hbWUoZm9sZGVyTmFtZSk7Ci0JCQlpZiAoc3RhdHVzLmlzT0soKSl7Ci0JCQkJc3RhdHVzID0gdmFsaWRhdGVGb2xkZXJGb3JDaGFyYWN0ZXJzKGZvbGRlck5hbWUpOwotCQkJfQotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVGb2xkZXJGb3JDaGFyYWN0ZXJzKFN0cmluZyBmb2xkZXJOYW1lKXsKLQkJLyogYnVnIDIyMzA3MiB0ZXN0IGludmFsaWQgY2hhcmFjdGVyIC0gVVJJLkZSQUdNRU5UX1NFUEFSQVRPUiAqLwotCQlpZiAoZm9sZGVyTmFtZS5pbmRleE9mKCcjJykgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5yZXNvdXJjZXNfaW52YWxpZENoYXJJbk5hbWUsICIjIiwgZm9sZGVyTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAgbmV3IFJlc291cmNlU3RhdHVzKElSZXNvdXJjZVN0YXR1cy5JTlZBTElEX1ZBTFVFLCBudWxsLCBtZXNzYWdlKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVTb3VyY2VBbmRPdXRwdXRGb2xkZXJDYXNlKFN0cmluZyBzb3VyY2VGb2xkZXIsIFN0cmluZyBvdXRwdXRGb2xkZXIpewotCQlpZiggc291cmNlRm9sZGVyLmVxdWFsc0lnbm9yZUNhc2Uob3V0cHV0Rm9sZGVyKSAmJiAhc291cmNlRm9sZGVyLmVxdWFscyhvdXRwdXRGb2xkZXIpKXsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoIFByb2plY3RTdXBwb3J0UmVzb3VyY2VIYW5kbGVyLlNPVVJDRV9PVVBVVF9GT0xERVJfRElGRl9CWUNBU0VfT05MWSk7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvSjJFRU1vZHVsZVBvc3RJbXBvcnRIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTW9kdWxlUG9zdEltcG9ydEhlbHBlci5qYXZhCmluZGV4IDFmODM5ODcuLmMyYjk0MGUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTW9kdWxlUG9zdEltcG9ydEhlbHBlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9KMkVFTW9kdWxlUG9zdEltcG9ydEhlbHBlci5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW5SZXNvdXJjZUhhbmRsZXI7CiAKIApAQCAtODAsNyArODEsNyBAQAogCQkJCUoyRUVNb2R1bGVQb3N0SW1wb3J0SGFuZGxlciBwb3N0Q3JlYXRlID0gKEoyRUVNb2R1bGVQb3N0SW1wb3J0SGFuZGxlcikgcG9zdEltcG9ydEVsZW1lbnRbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3NOYW1lIik7IC8vJE5PTi1OTFMtMSQKIAkJCQlwb3N0Q3JlYXRlLm1vZHVsZUltcG9ydGVkKHByb2plY3QpOwogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJfQogCQl9CiAJfQpAQCAtMTIwLDcgKzEyMSw3IEBACiAJCQkJCX0KIAkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewogCQkJCQlpZiAoc2hvdWxkTG9nRXJyb3JzKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTEzMCwxMyArMTMxLDEzIEBACiAJCQkJaXNFeHRlbnNpb25JbnRlcmVzdGVkID0gdHJ1ZTsKIAkJCX0KIAotCQkJaWYgKGlzRXh0ZW5zaW9uSW50ZXJlc3RlZCkgeworCQkJaWYgKGlzRXh0ZW5zaW9uSW50ZXJlc3RlZCAmJiBwb3N0SW1wb3J0RWxlbWVudCAhPSBudWxsKSB7CiAJCQkJdHJ5IHsKIAkJCQkJLy90cnkgaW5zdGFudGlhdGluZyB0aGUgY2xhc3MgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgbGlzdC4KIAkJCQkJcG9zdEltcG9ydEVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3NOYW1lIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJaW50ZXJlc3RlZEV4dGVuc2lvbnMuYWRkKHBvc3RJbXBvcnRFbGVtZW50KTsKIAkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwogCQkJCX0KIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9EZXBsb3llclJlZ2lzdHJ5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95L0RlcGxveWVyUmVnaXN0cnkuamF2YQppbmRleCBlMTE1YmU1Li42NGU3NzAzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95L0RlcGxveWVyUmVnaXN0cnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95L0RlcGxveWVyUmVnaXN0cnkuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwpAQCAtMTMzLDcgKzEzNCw3IEBACiAJCQkJaWYgKHJvb3QgPT0gbnVsbCB8fCBtb2R1bGVzLmNvbnRhaW5zKGNvbXBvbmVudCkpCiAJCQkJCWNvbnRpbnVlOwogCQkJCS8vIE9yZGVyIEVhcnMgZmlyc3QuLi4KLQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKQorCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkKIAkJCQkJbW9kdWxlcy5hZGQoMCwgY29tcG9uZW50KTsKIAkJCQllbHNlCiAJCQkJCW1vZHVsZXMuYWRkKGNvbXBvbmVudCk7CkBAIC0xOTUsMjQgKzE5NiwyNCBAQAogCSAqLwogCXB1YmxpYyBMaXN0IGdldERlcGxveU1vZHVsZUV4dGVuc2lvbnMoSVByb2plY3QgcHJvamVjdCwgSVJ1bnRpbWUgcnVudGltZSkgewogCQlTdHJpbmcgdHlwZUlEID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSkKKwkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKQogCQkJdHlwZUlEID0gSjJFRVByb2plY3RVdGlsaXRpZXMuRU5URVJQUklTRV9BUFBMSUNBVElPTjsKLQkJZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvamVjdCkpCisJCWVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvamVjdCkpCiAJCQl0eXBlSUQgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5BUFBMSUNBVElPTl9DTElFTlQ7Ci0JCWVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpCisJCWVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkKIAkJCXR5cGVJRCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCOwotCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc1N0YXRpY1dlYlByb2plY3QocHJvamVjdCkpCisJCWVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNTdGF0aWNXZWJQcm9qZWN0KHByb2plY3QpKQogCQkJdHlwZUlEID0gSjJFRVByb2plY3RVdGlsaXRpZXMuU1RBVElDX1dFQjsKLQkJZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3QpKQorCQllbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChwcm9qZWN0KSkKIAkJCXR5cGVJRCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLkVKQjsKLQkJZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KHByb2plY3QpKQorCQllbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChwcm9qZWN0KSkKIAkJCXR5cGVJRCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLkpDQTsKLQkJZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdChwcm9qZWN0KSkKKwkJZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KHByb2plY3QpKQogCQkJdHlwZUlEID0gSjJFRVByb2plY3RVdGlsaXRpZXMuVVRJTElUWTsKIAkJCiAJCVN0cmluZyBydW50aW1lSUQgPSBudWxsOwogCQlpZiAocnVudGltZSA9PSBudWxsKQotCQkJcnVudGltZUlEID0gIk5vbmUiOworCQkJcnVudGltZUlEID0gIk5vbmUiOyAvLyROT04tTkxTLTEkCiAJCWVsc2UKIAkJCXJ1bnRpbWVJRCA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKS5nZXRJZCgpOwogCQlMaXN0IGRlcGxveWVycyA9IGdldERlcGxveWVycyh0eXBlSUQsIHJ1bnRpbWVJRCk7CkBAIC0yNDIsOCArMjQzLDcgQEAKIAkJCQkJCWZhY2V0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGV4Y2x1c2lvbik7CiAJCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAJCQkJCQkvL0ZhY2V0IGlkIG5vdCBmb3VuZAotCQkJCQkJLy9ObyBsb2dnaW5nIHNob3VsZCBiZSBkb25lIGhlcmUuLi4gbm90IGhhdmluZyB0aGlzIGZhY2V0IGluc3RhbGxlZCBpcyBhY3R1YWxseSBleHBlY3RlZAotCQkJCQkJLy9UaGlzIGZpbHRlcmluZyBzaG91bGQgb25seSBiZSBlbmFibGVkIGlmIHRoZSBmYWNldCBleGlzdHMgaW4gdGhpcyBlbnZpcm9ubWVudAorCQkJCQkJLy8gRG9uJ3QgbG9nIGFzIHRoaXMgY291bGQgYmUgZXhwZWN0ZWQuLi4uLgogCQkJCQl9CiAJCQkJCWlmIChmYWNldCAhPSBudWxsICYmIGZQcm9qLmhhc1Byb2plY3RGYWNldChmYWNldCkpIHsKIAkJCQkJCWV4Y2x1ZGVEZXBsb3llciA9IHRydWU7CkBAIC0yNTcsNiArMjU3LDcgQEAKIAkJcmV0dXJuIGZpbHRlcmVkRGVwbG95ZXJzOwogCX0KIAorCQogCXByaXZhdGUgTGlzdCBnZXRGYWNldEV4Y2VwdGlvbnMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGRlcGxveWVyKSB7CiAJCWlmIChmYWNldEV4Y2VwdGlvbnMuZ2V0KGRlcGxveWVyKSA9PSBudWxsKQogCQkJZmFjZXRFeGNlcHRpb25zLnB1dChkZXBsb3llciwgbmV3IEFycmF5TGlzdCgpKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3kvRGVwbG95ZXJSZWdpc3RyeVJlYWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9EZXBsb3llclJlZ2lzdHJ5UmVhZGVyLmphdmEKaW5kZXggMGZkMWExMy4uYzJhODdkOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9EZXBsb3llclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9EZXBsb3llclJlZ2lzdHJ5UmVhZGVyLmphdmEKQEAgLTU2LDYgKzU2LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CiAJCWlmICghZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKERFUExPWUVSKSkKIAkJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3kvRmF0YWxEZXBsb3llckV4Y2VwdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9GYXRhbERlcGxveWVyRXhjZXB0aW9uLmphdmEKaW5kZXggNGFkMmZlNy4uMGVhZWZkYiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9GYXRhbERlcGxveWVyRXhjZXB0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9GYXRhbERlcGxveWVyRXhjZXB0aW9uLmphdmEKQEAgLTMzLDcgKzMzLDYgQEAKIAkgKi8KIAlwdWJsaWMgRmF0YWxEZXBsb3llckV4Y2VwdGlvbigpIHsKIAkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCiAJfQogCiAJLyoqCkBAIC00MSw3ICs0MCw2IEBACiAJICovCiAJcHVibGljIEZhdGFsRGVwbG95ZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKIAkJc3VwZXIobWVzc2FnZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgogCX0KIAogCS8qKgpAQCAtNTAsNyArNDgsNiBAQAogCSAqLwogCXB1YmxpYyBGYXRhbERlcGxveWVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIobWVzc2FnZSwgY2F1c2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKIAl9CiAKIAkvKioKQEAgLTU4LDYgKzU1LDUgQEAKIAkgKi8KIAlwdWJsaWMgRmF0YWxEZXBsb3llckV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIoY2F1c2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKIAl9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95L0oyRUVEZXBsb3lIZWxwZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3kvSjJFRURlcGxveUhlbHBlci5qYXZhCmluZGV4IDIxNjhlYWQuLjEyZDIzZDcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3kvSjJFRURlcGxveUhlbHBlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3kvSjJFRURlcGxveUhlbHBlci5qYXZhCkBAIC0xOSw4ICsxOSw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuRW50ZXJwcmlzZUFydGlmYWN0RWRpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKQEAgLTQzLDcgKzQzLDcgQEAKIAkJdHJ5IHsKIAkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CiAJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KChJUHJvamVjdClyZXNvdXJjZSk7Ci0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpIHsKKwkJCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKSB7CiAJCQkJCWVkaXQgPSAoRW50ZXJwcmlzZUFydGlmYWN0RWRpdClDb21wb25lbnRVdGlsaXRpZXMuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wKTsKIAkJCQkJcmV0dXJuIChFSkJKYXIpZWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKIAkJCQl9CkBAIC02NSw3ICs2NSw3IEBACiAJCXRyeSB7CiAJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewogCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCgoSVByb2plY3QpcmVzb3VyY2UpOwotCQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXAuZ2V0UHJvamVjdCgpKSkgeworCQkJCQlpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKSB7CiAJCQkJCQllZGl0ID0gKEVudGVycHJpc2VBcnRpZmFjdEVkaXQpQ29tcG9uZW50VXRpbGl0aWVzLmdldEFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7CiAJCQkJCQlyZXR1cm4gKEFwcGxpY2F0aW9uKWVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7CiAJCQkJCX0KQEAgLTg3LDcgKzg3LDcgQEAKIAkJdHJ5IHsKIAkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CiAJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KChJUHJvamVjdClyZXNvdXJjZSk7Ci0JCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChjb21wLmdldFByb2plY3QoKSkpIHsKKwkJCQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKSB7CiAJCQkJCQllZGl0ID0gKEVudGVycHJpc2VBcnRpZmFjdEVkaXQpQ29tcG9uZW50VXRpbGl0aWVzLmdldEFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7CiAJCQkJCQlyZXR1cm4gKEFwcGxpY2F0aW9uQ2xpZW50KWVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7CiAJCQkJCX0KQEAgLTEwOSw3ICsxMDksNyBAQAogCQl0cnkgewogCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKIAkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoKElQcm9qZWN0KXJlc291cmNlKTsKLQkJCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKSB7CisJCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKSB7CiAJCQkJCQllZGl0ID0gKEVudGVycHJpc2VBcnRpZmFjdEVkaXQpQ29tcG9uZW50VXRpbGl0aWVzLmdldEFydGlmYWN0RWRpdEZvclJlYWQoY29tcCk7CiAJCQkJCQlyZXR1cm4gKFdlYkFwcCllZGl0LmdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpOwogCQkJCQl9CkBAIC0xMzEsNyArMTMxLDcgQEAKIAkJdHJ5IHsKIAkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CiAJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KChJUHJvamVjdClyZXNvdXJjZSk7Ci0JCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKSB7CisJCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpIHsKIAkJCQkJCWVkaXQgPSAoRW50ZXJwcmlzZUFydGlmYWN0RWRpdClDb21wb25lbnRVdGlsaXRpZXMuZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wKTsKIAkJCQkJCXJldHVybiAoQ29ubmVjdG9yKWVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7CiAJCQkJCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3kvSjJFRURlcGxveU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9KMkVFRGVwbG95T3BlcmF0aW9uLmphdmEKaW5kZXggNGY5NzBmYy4uMzVlYTI1ZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9KMkVFRGVwbG95T3BlcmF0aW9uLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveS9KMkVFRGVwbG95T3BlcmF0aW9uLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzUsMTIgKzM1LDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpblJlc291cmNlSGFuZGxlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247CkBAIC02NSw2ICs2NSw3IEBACiAJcHJpdmF0ZSBTZXQ8SVByb2plY3Q+IGFmZmVjdGVkUHJvamVjdHM7CiAJcHJpdmF0ZSBib29sZWFuIGlzQWxsRGVwbG95ZXJzUHJvdmlkZUFmZmVjdGVkUHJvamVjdHMgPSBmYWxzZTsKIAorCiAJLyoqCiAJICogIAogCSAqLwpAQCAtNzIsMTYgKzczLDE1IEBACiAJCXN1cGVyKCk7CiAJCXNlbGVjdGlvbiA9IGRlcGxveWFibGVPYmplY3RzOwogCQlhZmZlY3RlZFByb2plY3RzID0gbmV3IEhhc2hTZXQ8SVByb2plY3Q+KCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIHJlZG8oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAJCXJldHVybiBudWxsOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB1bmRvKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAJLyoKQEAgLTg5LDEzICs4OSwxNCBAQAogCSAqIAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5XVFBPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJdHJ5IHsgCiAJCQl0dXJuQXV0b0J1aWxkT2ZmKCk7CiAJCQlEZXBsb3llclJlZ2lzdHJ5IHJlZyA9IERlcGxveWVyUmVnaXN0cnkuaW5zdGFuY2UoKTsKIAkJCUxpc3QgY29tcG9uZW50cyA9IGdldFNlbGVjdGVkTW9kdWxlcyhzZWxlY3Rpb24pOwogCQkJbW9uaXRvci5iZWdpblRhc2soSjJFRVBsdWdpblJlc291cmNlSGFuZGxlci5KMkVFRGVwbG95T3BlcmF0aW9uX1VJXzAsIGNvbXBvbmVudHMuc2l6ZSgpKTsgCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMuc2l6ZSgpOyBpKyspIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5zaXplKCkgJiYgIW1vbml0b3IuaXNDYW5jZWxlZCgpOyBpKyspIHsKIAkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwogCQkJCWNvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgY29tcG9uZW50cy5nZXQoaSk7CiAJCQkJSVByb2plY3QgcHJvaiA9IGNvbXBvbmVudC5nZXRQcm9qZWN0KCk7CkBAIC0xNTQsNiArMTU1LDcgQEAKIAlwcml2YXRlIHZvaWQgZGVwbG95KExpc3QgdmlzaXRvcnMsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCUlQcm9qZWN0IHByb2ogPSBjb21wb25lbnQuZ2V0UHJvamVjdCgpOwogCQlib29sZWFuIGN1cklzQWxsRGVwbG95ZXJzUHJvdmlkZUFmZmVjdGVkUHJvamVjdHMgPSB0cnVlOworCiAJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlzaXRvcnMuc2l6ZSgpOyBpKyspIHsKIAkJCWlmICghKHZpc2l0b3JzLmdldChpKSBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uRWxlbWVudCkpCiAJCQkJY29udGludWU7CkBAIC0xNjEsNyArMTYzLDcgQEAKIAkJCXRyeSB7CiAJCQkJZGVwID0gKElDb21tYW5kKSAoKElDb25maWd1cmF0aW9uRWxlbWVudCkgdmlzaXRvcnMuZ2V0KGkpKS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKERlcGxveWVyUmVnaXN0cnlSZWFkZXIuREVQTE9ZRVJfQ0xBU1MpOwogCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKQEAgLTE5MSw3ICsxOTMsNyBAQAogCQkJCX0KIAkJCQlhZGRPS1N0YXR1cyhkZXAuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7CisJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihleCk7CiAJCQkJVGhyb3dhYmxlIHN0YXR1c0V4Y2VwdGlvbiA9IChleC5nZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSA/IGV4LmdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpIDogZXg7CiAJCQkJYWRkRXJyb3JTdGF0dXMoZXguZ2V0U3RhdHVzKCksIGRlcC5nZXRDbGFzcygpLmdldE5hbWUoKSwgc3RhdHVzRXhjZXB0aW9uKTsKIAkJCQljb250aW51ZTsKQEAgLTIzMiw3ICsyMzQsNyBAQAogCQkvL1N0cmluZyBlcnJvck5vdGVzID0gKG1haW5DYXVzZSAhPSBudWxsICYmIG1haW5DYXVzZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgPyBtYWluQ2F1c2UuZ2V0TWVzc2FnZSgpIDogIiI7CiAKIAkJU3RyaW5nIG1lc3NhZ2UgPSBKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmJpbmQoSjJFRVBsdWdpblJlc291cmNlSGFuZGxlci5KMkVFRGVwbG95T3BlcmF0aW9uXzNfVUlfLERlcGxveWVyTmFtZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUlTdGF0dXMgc3RhdHVzTG9jYWwgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldFBsdWdpbklEKCksIHNldmVyaXR5LCBtZXNzYWdlLCBtYWluQ2F1c2UpOyAvLyROT04tTkxTLTEkCisJCUlTdGF0dXMgc3RhdHVzTG9jYWwgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldFBsdWdpbklEKCksIHNldmVyaXR5LCBtZXNzYWdlLCBtYWluQ2F1c2UpOyAKIAkJZ2V0TXVsdGlTdGF0dXMoKS5hZGQoc3RhdHVzTG9jYWwpOwogCiAJfQpAQCAtMjc2LDcgKzI3OCw3IEBACiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAkJCQkvLyBPcmRlciBFYXJzIGZpcnN0Li4uCi0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgeworCQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewogCQkJCQljb21wb25lbnRzLmFkZCgwLGNvbXBvbmVudCk7CiAJCQkJfQogCQkJCWVsc2UgewpAQCAtMjg2LDkgKzI4OCw4IEBACiAJCX0KIAkJcmV0dXJuIGNvbXBvbmVudHM7CiAJfQotCisJCiAJcHVibGljIFNldDxJUHJvamVjdD4gZ2V0QWZmZWN0ZWRQcm9qZWN0cygpIHsKLQogCQlyZXR1cm4gdGhpcy5hZmZlY3RlZFByb2plY3RzOwogCX0KIApAQCAtMjk4LDcgKzI5OSw3IEBACiAJICogQHJldHVybiB0cnVlIGlmIGFsbCBkZXBsb3llcnMgcHJvdmlkZXMgdGhlIGFmZmVjdGVkIHByb2plY3RzIGxpc3Q7IG90aGVyd2lzZSwgcmV0dXJuIGZhbHNlLgogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzQWxsRGVwbG95ZXJzUHJvdmlkZUFmZmVjdGVkUHJvamVjdHMoKSB7Ci0gIAlyZXR1cm4gaXNBbGxEZXBsb3llcnNQcm92aWRlQWZmZWN0ZWRQcm9qZWN0czsKLSAgfQorCQlyZXR1cm4gaXNBbGxEZXBsb3llcnNQcm92aWRlQWZmZWN0ZWRQcm9qZWN0czsKKwl9CiAKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvQmluYXJ5RmlsZU1vZHVsZURlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvQmluYXJ5RmlsZU1vZHVsZURlbGVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwYTM4NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9CaW5hcnlGaWxlTW9kdWxlRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IFJlZCBIYXQgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFJlZCBIYXQgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSUoyRUVNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Nb2R1bGVGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlByb2plY3RNb2R1bGU7CisKK3B1YmxpYyBjbGFzcyBCaW5hcnlGaWxlTW9kdWxlRGVsZWdhdGUgCisJLyogU0hPVUxEIGV4dGVuZCBNb2R1bGVEZWxlZ2F0ZSAqLworCWV4dGVuZHMgUHJvamVjdE1vZHVsZSAKKwkvKiBTSE9VTEQgTk9UICovIGltcGxlbWVudHMgSUoyRUVNb2R1bGUgeworCQorCXByaXZhdGUgRmlsZSBmaWxlOworCQorCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBhIHNpbXBsZSBiaW5hcnkgc2luZ2xlLWZpbGUgbW9kdWxlCisJICogQHBhcmFtIGZpbGUgVGhlIGZpbGUKKwkgKi8KKwlwdWJsaWMgQmluYXJ5RmlsZU1vZHVsZURlbGVnYXRlKEZpbGUgZmlsZSkgeworCQl0aGlzLmZpbGUgPSBmaWxlOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKKwkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElNb2R1bGVbXSBnZXRDaGlsZE1vZHVsZXMoKSB7CisJCXJldHVybiBuZXcgSU1vZHVsZVtde307CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIElNb2R1bGVSZXNvdXJjZVtdIG1lbWJlcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlW117CisJCQkJbmV3IE1vZHVsZUZpbGUoZmlsZSwgZmlsZS5nZXROYW1lKCksIG5ldyBQYXRoKCIiKSkgLy8kTk9OLU5MUy0xJAorCQl9OworCX0KKworCQorCS8qCisJICogVGhlIGZvbGxvd2luZyAzIG1ldGhvZHMgYXJlIGhlcmUgc29sZWx5IHRvIG5vdCBicmVhayAKKwkgKiBnZW5lcmljIHNlcnZlci4gCisJICogCisJICogVGhlc2UgbWV0aG9kcyBzaG91bGQgYmUgcmVtb3ZlZCBhcyBzb29uIGFzIGdlbmVyaWMKKwkgKiBzZXJ2ZXIgc3RvcHMgYXNzdW1pbmcgYWxsIGNoaWxkIG1vZHVsZXMgYXJlIAorCSAqIFByb2plY3RNb2R1bGUgb2JqZWN0cyBvciBJSjJFRU1vZHVsZSBvYmplY3RzLAorCSAqIHdoaWNoIGFyZSBoZWF2eSBhc3N1bXB0aW9ucy4gCisJICovCisJcHVibGljIElDb250YWluZXJbXSBnZXRSZXNvdXJjZUZvbGRlcnMoKSB7CisJCXJldHVybiBuZXcgSUNvbnRhaW5lclswXTsKKwl9CisKKwlwdWJsaWMgSUNvbnRhaW5lcltdIGdldEphdmFPdXRwdXRGb2xkZXJzKCkgeworCQlyZXR1cm4gbmV3IElDb250YWluZXJbMF07CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNCaW5hcnkoKSB7CisJCXJldHVybiB0cnVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVBZGFwdGVyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVBZGFwdGVyVXRpbC5qYXZhCmluZGV4IGYxNDY3YTIuLmRjZjE3ZDEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlQWRhcHRlclV0aWwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGVwbG95YWJsZUFkYXB0ZXJVdGlsLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CkBAIC0xMTcsMTAgKzExOCwxMCBAQAogCQkJSVJlc291cmNlIGVjbGlwZVNlcnZSZXNvcnVjZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoc2VydlJlc291cmNlKTsKIAkJCXJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGVjbGlwZVNlcnZSZXNvcnVjZSk7CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQogCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCQlpZiAocmVzb3VyY2VzWzBdICE9IG51bGwpCisJCWlmIChyZXNvdXJjZXMgIT0gbnVsbCAmJiByZXNvdXJjZXNbMF0gIT0gbnVsbCkKIAkJCWNvbXBvbmVudCA9IHJlc291cmNlc1swXS5nZXRDb21wb25lbnQoKTsKIAkJcmV0dXJuIGdldE1vZHVsZShwcm9qLGNvbXBvbmVudCk7CiAJfS8vIGdldE1vZHVsZQpAQCAtMTgxLDcgKzE4Miw2IEBACiAJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0QWRhcHRlciNnZXRJZCgpCiAJICovCiAJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKQEAgLTE5MSw3ICsxOTEsNiBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdEFkYXB0ZXIjZ2V0T2JqZWN0Q2xhc3NOYW1lKCkKIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldE9iamVjdENsYXNzTmFtZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKQEAgLTIwMSw3ICsyMDAsNiBAQAogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdEFkYXB0ZXIjaXNQbHVnaW5BY3RpdmF0ZWQoKQogCSAqLwogCXB1YmxpYyBib29sZWFuIGlzUGx1Z2luQWN0aXZhdGVkKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCiAJCXJldHVybiBmYWxzZTsKIAl9CiAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KMkVFRGVwbG95YWJsZUZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KMkVFRGVwbG95YWJsZUZhY3RvcnkuamF2YQppbmRleCA0YWFhZDlkLi42YTAzNjcyIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvSjJFRURlcGxveWFibGVGYWN0b3J5LmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0oyRUVEZXBsb3lhYmxlRmFjdG9yeS5qYXZhCkBAIC0xMCw2ICsxMCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXM7CiAKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC0xNyw3ICsxOCwxMSBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7CkBAIC0yNyw2MSArMzIsODcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51dGlsLmludGVybmFsLkphdmFFRVF1aWNrUGVlazsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JQ2hpbGRNb2R1bGVSZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Nb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlNlcnZlclBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRGVsZWdhdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLmRlcGxveWFibGVzLkZsYXRDb21wb25lbnREZXBsb3lhYmxlOwogCiAvKioKICAqIEoyRUUgbW9kdWxlIGZhY3RvcnkuCiAgKi8KLXB1YmxpYyBjbGFzcyBKMkVFRGVwbG95YWJsZUZhY3RvcnkgZXh0ZW5kcyBQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgTWFwIDxJTW9kdWxlLCBNb2R1bGVEZWxlZ2F0ZT4gbW9kdWxlRGVsZWdhdGVzID0gbmV3IEhhc2hNYXA8SU1vZHVsZSwgTW9kdWxlRGVsZWdhdGU+KDUpOworcHVibGljIGNsYXNzIEoyRUVEZXBsb3lhYmxlRmFjdG9yeSBleHRlbmRzIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7CisJcHJvdGVjdGVkIE1hcCA8SU1vZHVsZSwgRmxhdENvbXBvbmVudERlcGxveWFibGU+IG1vZHVsZURlbGVnYXRlcyA9IG5ldyBIYXNoTWFwPElNb2R1bGUsIEZsYXRDb21wb25lbnREZXBsb3lhYmxlPig1KTsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnNlcnZlciI7IC8vJE5PTi1OTFMtMSQKLQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEoyRUVfSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuc2VydmVyIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTkFSWV9QUkVGSVggPSAiL2JpbmFyeToiOyAvLyROT04tTkxTLTEkCisJCisJcHVibGljIHN0YXRpYyBKMkVFRGVwbG95YWJsZUZhY3RvcnkgSjJFRV9JTlNUQU5DRTsKKwlwdWJsaWMgc3RhdGljIEoyRUVEZXBsb3lhYmxlRmFjdG9yeSBqMmVlSW5zdGFuY2UoKSB7CisJCWlmKCBKMkVFX0lOU1RBTkNFID09IG51bGwgKSB7CisJCQllbnN1cmVGYWN0b3J5TG9hZGVkKEoyRUVfSUQpOworCQl9CisJCXJldHVybiBKMkVFX0lOU1RBTkNFOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlRmFjdG9yeUxvYWRlZChTdHJpbmcgZmFjdG9yeUlkKSB7CisgICAgICAgIE1vZHVsZUZhY3RvcnlbXSBmYWN0b3JpZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0TW9kdWxlRmFjdG9yaWVzKCk7CisgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgZmFjdG9yaWVzLmxlbmd0aDsgaSsrICkgeworICAgICAgICAgICAgICAgIGlmKCBmYWN0b3JpZXNbaV0uZ2V0SWQoKS5lcXVhbHMoZmFjdG9yeUlkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzW2ldLmdldERlbGVnYXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCX0KKwkKIAlwdWJsaWMgSjJFRURlcGxveWFibGVGYWN0b3J5KCkgewogCQlzdXBlcigpOwogCX0KLQorCQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7CisJCXN1cGVyLmluaXRpYWxpemUoKTsKKwkJaWYoIGdldElkKCkuZXF1YWxzKEoyRUVfSUQpKQorCQkJSjJFRV9JTlNUQU5DRSA9IHRoaXM7CisJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOworCX0KKwkKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgSU1vZHVsZVtdIGNyZWF0ZU1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewogCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYoY29tcG9uZW50ICE9IG51bGwpeworCQlpZihjb21wb25lbnQgIT0gbnVsbCkKIAkJCXJldHVybiBjcmVhdGVNb2R1bGVEZWxlZ2F0ZXMoY29tcG9uZW50KTsKLQkJfQogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQkvKioKLQkgKiBVc2Uge0BsaW5rICNjcmVhdGVNb2R1bGUoSVByb2plY3QpfSBpbnN0ZWFkLgotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIG5hdHVyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIGNyZWF0ZU1vZHVsZXMoTW9kdWxlQ29yZU5hdHVyZSBuYXR1cmUpIHsKLQkJaWYobmF0dXJlICE9IG51bGwpewotCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZXMobmF0dXJlLmdldFByb2plY3QoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQogCisJQE92ZXJyaWRlCiAJcHVibGljIE1vZHVsZURlbGVnYXRlIGdldE1vZHVsZURlbGVnYXRlKElNb2R1bGUgbW9kdWxlKSB7CiAJCWlmIChtb2R1bGUgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwogCi0JCU1vZHVsZURlbGVnYXRlIG1kID0gKE1vZHVsZURlbGVnYXRlKSBtb2R1bGVEZWxlZ2F0ZXMuZ2V0KG1vZHVsZSk7Ci0KKwkJTW9kdWxlRGVsZWdhdGUgbWQgPSBtb2R1bGVEZWxlZ2F0ZXMuZ2V0KG1vZHVsZSk7CisJCWlmKCBtZCA9PSBudWxsICYmICgoTW9kdWxlKW1vZHVsZSkuZ2V0SW50ZXJuYWxJZCgpLnN0YXJ0c1dpdGgoQklOQVJZX1BSRUZJWCkpCisJCQlyZXR1cm4gY3JlYXRlRGVsZWdhdGUobW9kdWxlKTsKKwkJCiAJCWlmIChtZCA9PSBudWxsKSB7CiAJCQljcmVhdGVNb2R1bGVzKG1vZHVsZS5nZXRQcm9qZWN0KCkpOwotCQkJbWQgPSAoTW9kdWxlRGVsZWdhdGUpIG1vZHVsZURlbGVnYXRlcy5nZXQobW9kdWxlKTsKKwkJCW1kID0gbW9kdWxlRGVsZWdhdGVzLmdldChtb2R1bGUpOwogCQl9Ci0KIAkJcmV0dXJuIG1kOwogCX0KIAorCXByb3RlY3RlZCBib29sZWFuIGNhbkhhbmRsZVByb2plY3QoSVByb2plY3QgcCkgeworCQkvLyBGaXJzdCBjaGVjayB0aGUgY29tcG9uZW50IGlzIG9mIHR5cGUgSmF2YSBFRSwgdGhlbiBjaGVjayBKMkVFIHZlcnNpb24KKwkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHApOworCQlyZXR1cm4gKEphdmFFRVByb2plY3RVdGlsaXRpZXMudXNlc0phdmFFRUNvbXBvbmVudChjb21wKSAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0xlZ2FjeUoyRUVQcm9qZWN0KHApKTsKKwl9CisJCiAJcHJvdGVjdGVkIElNb2R1bGVbXSBjcmVhdGVNb2R1bGVEZWxlZ2F0ZXMoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7CiAJCWlmKGNvbXBvbmVudCA9PSBudWxsKXsKIAkJCXJldHVybiBudWxsOwpAQCAtODksODUgKzEyMCwxMDAgQEAKIAkJCiAJCUxpc3Q8SU1vZHVsZT4gcHJvamVjdE1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7CiAJCXRyeSB7Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNMZWdhY3lKMkVFUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotCQkJCUlNb2R1bGUgbW9kdWxlID0gbnVsbDsKKwkJCWlmIChjYW5IYW5kbGVQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7CiAJCQkJU3RyaW5nIHR5cGUgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VHlwZShjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKIAkJCQlTdHJpbmcgdmVyc2lvbiA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VmVyc2lvbihjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQkJCQltb2R1bGUgPSBjcmVhdGVNb2R1bGUoY29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpLCBjb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCksIHR5cGUsIHZlcnNpb24sIGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCUoyRUVGbGV4UHJvakRlcGxveWFibGUgbW9kdWxlRGVsZWdhdGUgPSBuZXcgSjJFRUZsZXhQcm9qRGVwbG95YWJsZShjb21wb25lbnQuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpOworCQkJCUlNb2R1bGUgbW9kdWxlID0gY3JlYXRlTW9kdWxlKGNvbXBvbmVudC5nZXROYW1lKCksIGNvbXBvbmVudC5nZXROYW1lKCksIHR5cGUsIHZlcnNpb24sIGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOworCQkJCUZsYXRDb21wb25lbnREZXBsb3lhYmxlIG1vZHVsZURlbGVnYXRlID0gY3JlYXRlTW9kdWxlRGVsZWdhdGUoY29tcG9uZW50LmdldFByb2plY3QoKSwgY29tcG9uZW50KTsKIAkJCQltb2R1bGVEZWxlZ2F0ZXMucHV0KG1vZHVsZSwgbW9kdWxlRGVsZWdhdGUpOwogCQkJCXByb2plY3RNb2R1bGVzLmFkZChtb2R1bGUpOwogCiAJCQkJLy8gQ2hlY2sgdG8gYWRkIGFueSBiaW5hcnkgbW9kdWxlcwogCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OLmVxdWFscyh0eXBlKSkKLQkJCQkJcHJvamVjdE1vZHVsZXMuYWRkQWxsKGNyZWF0ZUJpbmFyeU1vZHVsZXMoY29tcG9uZW50KSk7CisJCQkJCXByb2plY3RNb2R1bGVzLmFkZEFsbChMRUdBQ1lfY3JlYXRlQmluYXJ5TW9kdWxlcyhjb21wb25lbnQpKTsKIAkJCX0gZWxzZSB7CiAJCQkJcmV0dXJuIG51bGw7CiAJCQl9CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOwogCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfQotCQlyZXR1cm4gKElNb2R1bGVbXSkgcHJvamVjdE1vZHVsZXMudG9BcnJheShuZXcgSU1vZHVsZVtwcm9qZWN0TW9kdWxlcy5zaXplKCldKTsKKwkJcmV0dXJuIHByb2plY3RNb2R1bGVzLnRvQXJyYXkobmV3IElNb2R1bGVbcHJvamVjdE1vZHVsZXMuc2l6ZSgpXSk7CiAJfQogCi0JcHJvdGVjdGVkIExpc3Q8SU1vZHVsZT4gY3JlYXRlQmluYXJ5TW9kdWxlcyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKKwlwcm90ZWN0ZWQgRmxhdENvbXBvbmVudERlcGxveWFibGUgY3JlYXRlTW9kdWxlRGVsZWdhdGUoSVByb2plY3QgcHJvamVjdCwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7CisJCXJldHVybiBuZXcgSjJFRUZsZXhQcm9qRGVwbG95YWJsZShwcm9qZWN0LCBjb21wb25lbnQpOworCX0KKworCS8qKgorCSAqIFRoZXNlIGFyZSBoZXJlIHNvIHRoYXQgcHJldmlvdXMgbW9kdWxlcyBhcmUgYWJsZSB0byBiZSBmb3VuZCAKKwkgKiAKKwkgKiBAcGFyYW0gY29tcG9uZW50CisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCBMaXN0PElNb2R1bGU+IExFR0FDWV9jcmVhdGVCaW5hcnlNb2R1bGVzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewogCQlMaXN0PElNb2R1bGU+IHByb2plY3RNb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwogCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKIAkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZUNvbXBvbmVudCA9IHJlZmVyZW5jZXNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJLy8gSXMgcmVmZXJlbmNlZCBjb21wb25lbnQgYSBKMkVFIGJpbmFyeSBtb2R1bGUgYXJjaGl2ZSBvciBiaW5hcnkKLQkJCS8vIHV0aWxpdHkgcHJvamVjdD8KLQkJCWlmIChtb2R1bGVDb21wb25lbnQuaXNCaW5hcnkoKSkgewotCi0JCQkJSmF2YUVFUXVpY2tQZWVrIHFwID0gSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLmdldEphdmFFRVF1aWNrUGVlayhtb2R1bGVDb21wb25lbnQpOwotCQkJCS8vIElmIGl0IGlzIG5vdCBhIGoyZWUgbW9kdWxlIGFuZCB0aGUgY29tcG9uZW50IHByb2plY3QgaXMgdGhlCi0JCQkJLy8gZWFyLCBpdCBpcyBqdXN0IGFuIGFyY2hpdmUKLQkJCQkvLyBhbmQgd2UgY2FuIGlnbm9yZSBhcyBpdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgRUFSCi0JCQkJLy8gZGVwbG95YWJsZS5tZW1iZXJzKCkgbWV0aG9kCi0JCQkJaWYgKHFwLmdldFR5cGUoKSA9PSBKYXZhRUVRdWlja1BlZWsuVU5LTk9XTikgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgbW9kdWxlVHlwZSA9IG51bGw7Ci0JCQkJU3RyaW5nIG1vZHVsZVZlcnNpb24gPSBudWxsOwotCi0JCQkJc3dpdGNoIChxcC5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9DTElFTlRfVFlQRToKLQkJCQkJbW9kdWxlVHlwZSA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLkFQUExJQ0FUSU9OX0NMSUVOVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuV0VCX1RZUEU6Ci0JCQkJCW1vZHVsZVR5cGUgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5FSkJfVFlQRToKLQkJCQkJbW9kdWxlVHlwZSA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuRUpCOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5DT05ORUNUT1JfVFlQRToKLQkJCQkJbW9kdWxlVHlwZSA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuSkNBOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9UWVBFOgotCQkJCQltb2R1bGVUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQltb2R1bGVUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5VVElMSVRZOwotCQkJCQltb2R1bGVWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzBfVEVYVDsKLQkJCQl9Ci0KLQkJCQlpbnQgdmVyc2lvbiA9IHFwLmdldFZlcnNpb24oKTsKLQkJCQltb2R1bGVWZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcodmVyc2lvbik7Ci0KLQkJCQlJTW9kdWxlIG5lc3RlZE1vZHVsZSA9IGNyZWF0ZU1vZHVsZShtb2R1bGVDb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCksIG1vZHVsZUNvbXBvbmVudC5nZXREZXBsb3llZE5hbWUoKSwgbW9kdWxlVHlwZSwgbW9kdWxlVmVyc2lvbiwgbW9kdWxlQ29tcG9uZW50LmdldFByb2plY3QoKSk7CisJCQlpZiggbW9kdWxlQ29tcG9uZW50LmlzQmluYXJ5KCkpIHsKKwkJCQlKYXZhRUVRdWlja1BlZWsgcXVpY2tQZWVrID0gSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLmdldEphdmFFRVF1aWNrUGVlayhtb2R1bGVDb21wb25lbnQpOworCQkJCUlNb2R1bGUgbmVzdGVkTW9kdWxlID0gY3JlYXRlTW9kdWxlKHF1aWNrUGVlayxtb2R1bGVDb21wb25lbnQuZ2V0TmFtZSgpLAorCQkJCQkJbW9kdWxlQ29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpLCBtb2R1bGVDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKIAkJCQlpZiAobmVzdGVkTW9kdWxlICE9IG51bGwpIHsKLQkJCQkJSjJFRUZsZXhQcm9qRGVwbG95YWJsZSBtb2R1bGVEZWxlZ2F0ZSA9IG5ldyBKMkVFRmxleFByb2pEZXBsb3lhYmxlKG1vZHVsZUNvbXBvbmVudC5nZXRQcm9qZWN0KCksIG1vZHVsZUNvbXBvbmVudCk7CisJCQkJCUZsYXRDb21wb25lbnREZXBsb3lhYmxlIG1vZHVsZURlbGVnYXRlID0gZ2V0TmVzdGVkRGVsZWdhdGUobW9kdWxlQ29tcG9uZW50KTsKIAkJCQkJbW9kdWxlRGVsZWdhdGVzLnB1dChuZXN0ZWRNb2R1bGUsIG1vZHVsZURlbGVnYXRlKTsKIAkJCQkJcHJvamVjdE1vZHVsZXMuYWRkKG5lc3RlZE1vZHVsZSk7Ci0JCQkJCW1vZHVsZURlbGVnYXRlLmdldFVSSShuZXN0ZWRNb2R1bGUpOwogCQkJCX0KIAkJCX0KIAkJfQogCiAJCXJldHVybiBwcm9qZWN0TW9kdWxlczsKIAl9CisJCisJcHJvdGVjdGVkIEZsYXRDb21wb25lbnREZXBsb3lhYmxlIGdldE5lc3RlZERlbGVnYXRlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgeworCQlyZXR1cm4gbmV3IEoyRUVGbGV4UHJvakRlcGxveWFibGUoY29tcG9uZW50LmdldFByb2plY3QoKSwgY29tcG9uZW50KTsKKwl9CiAKKwlwcm90ZWN0ZWQgSU1vZHVsZSBjcmVhdGVNb2R1bGUoSmF2YUVFUXVpY2tQZWVrIHF1aWNrUGVlaywgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgSVByb2plY3QgcHJvamVjdCkgeworCQlpZiAocXVpY2tQZWVrLmdldFR5cGUoKSA9PSBKYXZhRUVRdWlja1BlZWsuVU5LTk9XTikgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKworCQlTdHJpbmcgbW9kdWxlVHlwZSA9IG51bGw7CisJCVN0cmluZyBtb2R1bGVWZXJzaW9uID0gbnVsbDsKKworCQlzd2l0Y2ggKHF1aWNrUGVlay5nZXRUeXBlKCkpIHsKKwkJY2FzZSBKYXZhRUVRdWlja1BlZWsuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEU6CisJCQltb2R1bGVUeXBlID0gSjJFRVByb2plY3RVdGlsaXRpZXMuQVBQTElDQVRJT05fQ0xJRU5UOworCQkJYnJlYWs7CisJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLldFQl9UWVBFOgorCQkJbW9kdWxlVHlwZSA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUI7CisJCQlicmVhazsKKwkJY2FzZSBKYXZhRUVRdWlja1BlZWsuRUpCX1RZUEU6CisJCQltb2R1bGVUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5FSkI7CisJCQlicmVhazsKKwkJY2FzZSBKYXZhRUVRdWlja1BlZWsuQ09OTkVDVE9SX1RZUEU6CisJCQltb2R1bGVUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5KQ0E7CisJCQlicmVhazsKKwkJY2FzZSBKYXZhRUVRdWlja1BlZWsuQVBQTElDQVRJT05fVFlQRToKKwkJCW1vZHVsZVR5cGUgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLkVOVEVSUFJJU0VfQVBQTElDQVRJT047CisJCQlicmVhazsKKwkJY2FzZSBKYXZhRUVRdWlja1BlZWsuV0VCRlJBR01FTlRfVFlQRToKKwkJCW1vZHVsZVR5cGUgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLldFQkZSQUdNRU5UOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltb2R1bGVUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5VVElMSVRZOworCQkJbW9kdWxlVmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8wX1RFWFQ7CisJCX0KKworCQlpbnQgdmVyc2lvbiA9IHF1aWNrUGVlay5nZXRWZXJzaW9uKCk7CisJCW1vZHVsZVZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydFZlcnNpb25JbnRUb1N0cmluZyh2ZXJzaW9uKTsKKworCQlJTW9kdWxlIG5lc3RlZE1vZHVsZSA9IGNyZWF0ZU1vZHVsZShpZCwgbmFtZSwgbW9kdWxlVHlwZSwgbW9kdWxlVmVyc2lvbiwgcHJvamVjdCk7CisJCXJldHVybiBuZXN0ZWRNb2R1bGU7CisJfQorCQogCS8qKgogCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHRoYXQgdGhlIG1vZHVsZSBzaG91bGQgbGlzdGVuIHRvIGZvciBzdGF0ZQogCSAqIGNoYW5nZXMuIFRoZSBwYXRocyBzaG91bGQgYmUgcHJvamVjdCByZWxhdGl2ZSBwYXRocy4gU3ViY2xhc3NlcyBjYW4KQEAgLTE3NSwxOSArMjIxLDIxIEBACiAJICogCiAJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIHBhdGhzCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElQYXRoW10gZ2V0TGlzdGVuZXJQYXRocygpIHsKLQkJcmV0dXJuIG5ldyBJUGF0aFtdIHsgbmV3IFBhdGgoIi5wcm9qZWN0IiksIC8vIG5hdHVyZQorCQlyZXR1cm4gbmV3IElQYXRoW10geyBuZXcgUGF0aCgiLnByb2plY3QiKSwgLy8gbmF0dXJlIC8vJE5PTi1OTFMtMSQKIAkJCQluZXcgUGF0aChTdHJ1Y3R1cmVFZGl0Lk1PRFVMRV9NRVRBX0ZJTEVfTkFNRSksIC8vIGNvbXBvbmVudAotCQkJCW5ldyBQYXRoKCIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sIikgLy8gZmFjZXRzCisJCQkJbmV3IFBhdGgoIi5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWwiKSAvLyBmYWNldHMgLy8kTk9OLU5MUy0xJAogCQl9OwogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGNsZWFyQ2FjaGUoSVByb2plY3QgcHJvamVjdCkgewogCQlzdXBlci5jbGVhckNhY2hlKHByb2plY3QpOwogCQlMaXN0PElNb2R1bGU+IG1vZHVsZXNUb1JlbW92ZSA9IG51bGw7CiAJCWZvciAoSXRlcmF0b3I8SU1vZHVsZT4gaXRlcmF0b3IgPSBtb2R1bGVEZWxlZ2F0ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewogCQkJSU1vZHVsZSBtb2R1bGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobW9kdWxlLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpIHsKKwkJCWlmIChtb2R1bGUuZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgbW9kdWxlLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpIHsKIAkJCQlpZiAobW9kdWxlc1RvUmVtb3ZlID09IG51bGwpIHsKIAkJCQkJbW9kdWxlc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwogCQkJCX0KQEAgLTIwMCw0ICsyNDgsNDkgQEAKIAkJCX0KIAkJfQogCX0KKwkKKwkvKioKKwkgKiBGcm9tIHRoaXMgcG9pbnQgb24sIHdoZW4gcXVlcmllZCwgcHJvamVjdHMgd2lsbCBnZW5lcmF0ZSB0aGVpciBiaW5hcnkgCisJICogY2hpbGQgbW9kdWxlcyBvbiB0aGUgZmx5IGFuZCB0aGV5IHdpbGwgYmUgc21hbGwgYW5kIGR1bWIKKwkgKiAKKwkgKiBAcGFyYW0gcGFyZW50CisJICogQHBhcmFtIGNoaWxkCisJICogQHJldHVybgorCSAqLworCXB1YmxpYyBJTW9kdWxlIGNyZWF0ZUNoaWxkTW9kdWxlKEZsYXRDb21wb25lbnREZXBsb3lhYmxlIHBhcmVudCwgSUNoaWxkTW9kdWxlUmVmZXJlbmNlIGNoaWxkKSB7CisJCUZpbGUgZmlsZSA9IGNoaWxkLmdldEZpbGUoKTsKKwkJaWYoIGZpbGUgIT0gbnVsbCApIHsKKwkJCUlQYXRoIHAgPSBuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCUphdmFFRVF1aWNrUGVlayBxcCA9IEphdmFFRUJpbmFyeUNvbXBvbmVudEhlbHBlci5nZXRKYXZhRUVRdWlja1BlZWsocCk7CisJCQlJTW9kdWxlIG1vZHVsZSA9IGNyZWF0ZU1vZHVsZShxcCwgQklOQVJZX1BSRUZJWCArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGZpbGUuZ2V0TmFtZSgpLCBwYXJlbnQuZ2V0UHJvamVjdCgpKTsKKwkJCUZsYXRDb21wb25lbnREZXBsb3lhYmxlIG1vZHVsZURlbGVnYXRlID0gZ2V0TmVzdGVkRGVsZWdhdGUoY2hpbGQuZ2V0Q29tcG9uZW50KCkpOworCQkJbW9kdWxlRGVsZWdhdGVzLnB1dChtb2R1bGUsIG1vZHVsZURlbGVnYXRlKTsKKwkJCXJldHVybiBtb2R1bGU7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCS8qKgorCSAqIENyZWF0ZSBhIG1vZHVsZSBkZWxlZ2F0ZSBvbiB0aGUgZmx5IGZvciB0aGlzIGJpbmFyeSBmaWxlCisJICogQHBhcmFtIG1vZHVsZQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgTW9kdWxlRGVsZWdhdGUgY3JlYXRlRGVsZWdhdGUoSU1vZHVsZSBtb2R1bGUpIHsKKwkJU3RyaW5nIGludGVybmFsSWQgPSAoKE1vZHVsZSltb2R1bGUpLmdldEludGVybmFsSWQoKTsKKwkJU3RyaW5nIHBhdGggPSBpbnRlcm5hbElkLnN1YnN0cmluZyhCSU5BUllfUFJFRklYLmxlbmd0aCgpKTsKKwkJRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7CisJCXJldHVybiBuZXcgQmluYXJ5RmlsZU1vZHVsZURlbGVnYXRlKGYpOworCX0KKworCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgeworCQljbGVhbkFsbERlbGVnYXRlcygpOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBjbGVhbkFsbERlbGVnYXRlcygpIHsKKwkJSXRlcmF0b3I8RmxhdENvbXBvbmVudERlcGxveWFibGU+IGkgPSBtb2R1bGVEZWxlZ2F0ZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKKwkJd2hpbGUoaS5oYXNOZXh0KCkpIHsKKwkJCWkubmV4dCgpLmNsZWFyQ2FjaGUoKTsKKwkJfQorCQltb2R1bGVzQ2hhbmdlZCgpOworCX0KIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KMkVFRmxleFByb2pEZXBsb3lhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvSjJFRUZsZXhQcm9qRGVwbG95YWJsZS5qYXZhCmluZGV4IDQ3MWM4ZjguLjg5MzkzYTQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KMkVFRmxleFByb2pEZXBsb3lhYmxlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL2RlcGxveWFibGVzL0oyRUVGbGV4UHJvakRlcGxveWFibGUuamF2YQpAQCAtMTAsODIgKzEwLDYxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXM7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2gudXRpbGl0eS5KZW1Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGFzc3BhdGhkZXAuSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuQWRkQ2xhc3NwYXRoRm9sZGVyc1BhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS5BZGRDbGFzc3BhdGhMaWJSZWZlcmVuY2VzUGFydGljaXBhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLkFkZE1hcHBlZE91dHB1dEZvbGRlcnNQYXJ0aWNpcGFudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmludGVybmFsLm1vZHVsZWNvcmUuSWdub3JlSmF2YUluU291cmNlRm9sZGVyUGFydGljaXBhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLlJlcGxhY2VNYW5pZmVzdEV4cG9ydFBhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwubW9kdWxlY29yZS5TaW5nbGVSb290RXhwb3J0UGFydGljaXBhbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5tb2R1bGVjb3JlLlNpbmdsZVJvb3RVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uamR0LmludGVybmFsLmphdmFsaXRlLkphdmFMaXRlVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJBcnRpZmFjdEVkaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5FamJNb2R1bGVFeHRlbnNpb25IZWxwZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lNYW5pZmVzdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jbGFzc3BhdGhkZXAuQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmV4cG9ydG1vZGVsLkpFRUhlaXJhcmNoeUV4cG9ydFBhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5leHBvcnRtb2RlbC5KYXZhRUVTaW5nbGVSb290Q2FsbGJhY2s7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LlNpbmdsZVJvb3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudXRpbC5pbnRlcm5hbC5KYXZhRUVRdWlja1BlZWs7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JQXBwbGljYXRpb25DbGllbnRNb2R1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklDb25uZWN0b3JNb2R1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklFSkJNb2R1bGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklFbnRlcnByaXNlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklKMkVFTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JVXRpbGl0eU1vZHVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYkZyYWdtZW50TW9kdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5JV2ViTW9kdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JQ2hpbGRNb2R1bGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUZsYXR0ZW5QYXJ0aWNpcGFudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWwuTW9kdWxlRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXMuQ29tcG9uZW50RGVwbG95YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRGVsZWdhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlcy5GbGF0Q29tcG9uZW50RGVwbG95YWJsZTsKKwogLyoqCiAgKiBKMkVFIG1vZHVsZSBzdXBlcmNsYXNzLgogICovCi1wdWJsaWMgY2xhc3MgSjJFRUZsZXhQcm9qRGVwbG95YWJsZSBleHRlbmRzIENvbXBvbmVudERlcGxveWFibGUgaW1wbGVtZW50cyBJSjJFRU1vZHVsZSwgSUVudGVycHJpc2VBcHBsaWNhdGlvbiwgSUFwcGxpY2F0aW9uQ2xpZW50TW9kdWxlLCBJQ29ubmVjdG9yTW9kdWxlLCBJRUpCTW9kdWxlLCBJV2ViTW9kdWxlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElQYXRoIFdFQl9DTEFTU0VTX1BBVEggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUyk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJUGF0aCBNQU5JRkVTVF9QQVRIID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpOwotCXByb3RlY3RlZCBzdGF0aWMgSVBhdGggV0VCTElCID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5XRUJfSU5GX0xJQikubWFrZUFic29sdXRlKCk7Ci0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290W10gY2FjaGVkU291cmNlQ29udGFpbmVyczsKLQlwcm90ZWN0ZWQgSUNvbnRhaW5lcltdIGNhY2hlZE91dHB1dENvbnRhaW5lcnM7Ci0JcHJvdGVjdGVkIEhhc2hNYXAgY2FjaGVkT3V0cHV0TWFwcGluZ3M7Ci0JcHJvdGVjdGVkIEhhc2hNYXAgY2FjaGVkU291cmNlT3V0cHV0UGFpcnM7Ci0JcHJvdGVjdGVkIExpc3QgY2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jeVVSSXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzU2luZ2xlSmF2YU91dHB1dE5vblNvdXJjZSA9IGZhbHNlOwotCXByaXZhdGUgU2luZ2xlUm9vdFV0aWwgc2luZ2xlVXRpbDsKLQorcHVibGljIGNsYXNzIEoyRUVGbGV4UHJvakRlcGxveWFibGUgZXh0ZW5kcyBGbGF0Q29tcG9uZW50RGVwbG95YWJsZSBpbXBsZW1lbnRzIAorCQkJCUlFbnRlcnByaXNlQXBwbGljYXRpb24sIElBcHBsaWNhdGlvbkNsaWVudE1vZHVsZSwgCisJCQkJSUNvbm5lY3Rvck1vZHVsZSwgSUVKQk1vZHVsZSwgSVdlYk1vZHVsZSwgSVV0aWxpdHlNb2R1bGUsIElXZWJGcmFnbWVudE1vZHVsZSB7CisJIAogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBKMkVFRmxleFByb2pEZXBsb3lhYmxlLgogCSAqIApAQCAtOTYsNyArNzUsNiBAQAogCQlzdXBlcihwcm9qZWN0LCBhQ29tcG9uZW50KTsKIAl9CiAJCi0KIAkvKioKIAkgKiBDb25zdHJ1Y3RvciBmb3IgSjJFRUZsZXhQcm9qRGVwbG95YWJsZS4KIAkgKiAKQEAgLTEwNSwyNzQgKzgzLDY0IEBACiAJcHVibGljIEoyRUVGbGV4UHJvakRlcGxveWFibGUoSVByb2plY3QgcHJvamVjdCkgewogCQlzdXBlcihwcm9qZWN0KTsKIAl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGZvbGRlcnMgZm9yIHRoZSByZXNvdXJjZXMgaW4gdGhpcyBtb2R1bGUuCi0JICogCi0JICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIHJlc291cmNlIGZvbGRlcnMKLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lcltdIGdldFJlc291cmNlRm9sZGVycygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKTsKLQkJaWYgKHZjICE9IG51bGwpIHsKLQkJCUlWaXJ0dWFsRm9sZGVyIHZGb2xkZXIgPSB2Yy5nZXRSb290Rm9sZGVyKCk7Ci0JCQlpZiAodkZvbGRlciAhPSBudWxsKSB7Ci0JCQkJSUNvbnRhaW5lcltdIHVuZGVybHlpbmdGb2xkZXJzID0gdkZvbGRlci5nZXRVbmRlcmx5aW5nRm9sZGVycygpOwotCQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdCh1bmRlcmx5aW5nRm9sZGVycykpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUNvbnRhaW5lcltdKSByZXN1bHQudG9BcnJheShuZXcgSUNvbnRhaW5lcltyZXN1bHQuc2l6ZSgpXSk7CisJCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gc2hvdWxkQ2FjaGUoKSB7CisJCXJldHVybiB0cnVlOwogCX0KIAogCS8qKgotCSAqIFJldHVybnMgdGhlIHJvb3QgZm9sZGVycyBjb250YWluaW5nIEphdmEgb3V0cHV0IGluIHRoaXMgbW9kdWxlLgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiBKYXZhIG91dHB1dCBmb2xkZXJzCisJICogQHNlZSBTaW5nbGVSb290VXRpbC5pc1NpbmdsZVJvb3QoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KQorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBtb2R1bGUgaGFzIGEgc2luZ2xlIHJvb3Qgc3RydWN0dXJlLCBhbmQKKwkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCiAJICovCi0JcHVibGljIElDb250YWluZXJbXSBnZXRKYXZhT3V0cHV0Rm9sZGVycygpIHsKLQkJaWYgKGNhY2hlZE91dHB1dENvbnRhaW5lcnMgPT0gbnVsbCkKLQkJCWNhY2hlZE91dHB1dENvbnRhaW5lcnMgPSBnZXRKYXZhT3V0cHV0Rm9sZGVycyhnZXRQcm9qZWN0KCkpOwotCQlyZXR1cm4gY2FjaGVkT3V0cHV0Q29udGFpbmVyczsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1NpbmdsZVJvb3RTdHJ1Y3R1cmUoKSB7CisJCXJldHVybiBuZXcgU2luZ2xlUm9vdFV0aWwoZ2V0Q29tcG9uZW50KCksIG5ldyBKYXZhRUVTaW5nbGVSb290Q2FsbGJhY2soKSkuaXNTaW5nbGVSb290KCk7CiAJfQogCQotCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0SmF2YU91dHB1dEZvbGRlcnMoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAocHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ29udGFpbmVyWzBdOwotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0T3V0cHV0Q29udGFpbmVycyhwcm9qZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlVXRpbGl0eUNvbXBvbmVudChJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcCxJVmlydHVhbFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMsIEFydGlmYWN0RWRpdCBlZGl0KSB7Ci0JCS8vIElmIHRoZSBjb21wb25lbnQgbW9kdWxlIGlzIGFuIEVBUiB3ZSBrbm93IGFsbCBhcmNoaXZlcyBhcmUgZmlsdGVyZWQgb3V0IG9mIHZpcnR1YWwgY29tcG9uZW50IG1lbWJlcnMKLQkJLy8gYW5kIHdlIHdpbGwgcmV0dXJuIG9ubHkgdGhvc2UgYXJjaGl2ZXMgd2hpY2ggYXJlIG5vdCBiaW5hcnkgSjJFRSBtb2R1bGVzIGluIHRoZSBFQVIgREQuICBUaGVzZSBKMkVFIG1vZHVsZXMgd2lsbAotCQkvLyBiZSByZXR1cm5lZCBieSBnZXRDaGlsZE1vZHVsZXMoKQotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQlyZXR1cm4gdmlydHVhbENvbXAgIT0gbnVsbCAmJiB2aXJ0dWFsQ29tcC5pc0JpbmFyeSgpICYmICFpc05lc3RlZEoyRUVNb2R1bGUodmlydHVhbENvbXAsIHJlZmVyZW5jZXMsIChFQVJBcnRpZmFjdEVkaXQpZWRpdCk7Ci0JCX0gZWxzZSB7IAotCQkJcmV0dXJuIHN1cGVyLnNob3VsZEluY2x1ZGVVdGlsaXR5Q29tcG9uZW50KHZpcnR1YWxDb21wLCByZWZlcmVuY2VzLCBlZGl0KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRVdGlsTWVtYmVyKElWaXJ0dWFsQ29tcG9uZW50IHBhcmVudCwgSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlLCBJUGF0aCBydW50aW1lUGF0aCkgewotCQkvLyBkbyBub3QgYWRkIGNsYXNzcGF0aCBkZXBlbmRlbmNpZXMgd2hvc2UgcnVudGltZSBwYXRoICguLi8pIG1hcHMgdG8gdGhlIHBhcmVudCBjb21wb25lbnQgb3IgdGhhdCByZXByZXNlbnQKLQkJLy8gY2xhc3MgZm9sZGVycwotCQlpZiAoIXJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5SVU5USU1FX01BUFBJTkdfSU5UT19DT05UQUlORVJfUEFUSCkgCi0JCQkJJiYgIUNsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmlzQ2xhc3NGb2xkZXJSZWZlcmVuY2UocmVmZXJlbmNlKSkgewotCQkJc3VwZXIuYWRkVXRpbE1lbWJlcihwYXJlbnQsIHJlZmVyZW5jZSwgcnVudGltZVBhdGgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRCaW5hcnlNb2R1bGVNZW1iZXJzKCkgewotCQlJUGF0aCBhcmNoaXZlUGF0aCA9ICgoSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCU1vZHVsZUZpbGUgbWYgPSBudWxsOwotCQlpZiAoYXJjaGl2ZVBhdGggIT0gbnVsbCkgeyAvL0luIFdvcmtzcGFjZQotCQkJSUZpbGUgdXRpbEZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYXJjaGl2ZVBhdGgpOwotCQkJbWYgPSBuZXcgTW9kdWxlRmlsZSh1dGlsRmlsZSwgdXRpbEZpbGUuZ2V0TmFtZSgpLCAoKEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCljb21wb25lbnQpLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlKCkpOwotCQl9IGVsc2UgewotCQkJRmlsZSBleHRGaWxlID0gKChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpY29tcG9uZW50KS5nZXRVbmRlcmx5aW5nRGlza0ZpbGUoKTsKLQkJCW1mID0gbmV3IE1vZHVsZUZpbGUoZXh0RmlsZSwgZXh0RmlsZS5nZXROYW1lKCksICgoSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJTW9kdWxlUmVzb3VyY2VbXSB7bWZ9OwotCX0KLQkKLQlwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gbWVtYmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbWVtYmVycy5jbGVhcigpOwotCQljbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5VVJJcy5jbGVhcigpOwotCi0JCS8vIEhhbmRsZSBiaW5hcnkgY29tcG9uZW50cwotCQlpZiAoY29tcG9uZW50IGluc3RhbmNlb2YgSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KQotCQkJcmV0dXJuIGdldEJpbmFyeU1vZHVsZU1lbWJlcnMoKTsKLQotCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkvLyBJZiBhbiBFQVIsIGFkZCBjbGFzc3BhdGggY29udHJpYnV0aW9ucyBmb3IgYWxsIHJlZmVyZW5jZWQgbW9kdWxlcwotCQkJYWRkUmVmZXJlbmNlZENvbXBvbmVudENsYXNzcGF0aERlcGVuZGVuY2llcyhjb21wb25lbnQsIGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJLy8gSWYgYSB3ZWIsIGFkZCBjbGFzc3BhdGggY29udHJpYnV0aW9ucyBmb3IgYWxsIFdFQi1JTkYvbGliIG1vZHVsZXMKLQkJCQlhZGRSZWZlcmVuY2VkQ29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGNvbXBvbmVudCwgdHJ1ZSk7Ci0JCQl9Ci0JCQlpZiAoY2FuRXhwb3J0Q2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jaWVzKGNvbXBvbmVudCkpewotCQkJCXNhdmVDbGFzc3BhdGhEZXBlbmRlbmN5VVJJcyhjb21wb25lbnQpOwotCQkJfQotCQkJLy8gQWRkIGFsbCBKYXZhIG91dHB1dCBmb2xkZXJzIHRoYXQgaGF2ZSBwdWJsaXNoL2V4cG9ydCBhdHRyaWJ1dGVzCi0JCQlhZGRDbGFzc0ZvbGRlckRlcGVuZGVuY2llcyhjb21wb25lbnQpOworCUBPdmVycmlkZQorCXByb3RlY3RlZCBJRmxhdHRlblBhcnRpY2lwYW50W10gZ2V0UGFydGljaXBhbnRzKCkgeworCQlMaXN0PElGbGF0dGVuUGFydGljaXBhbnQ+IHBhcnRpY2lwYW50cyA9IG5ldyBBcnJheUxpc3Q8SUZsYXR0ZW5QYXJ0aWNpcGFudD4oKTsKKwkJCisJCXBhcnRpY2lwYW50cy5hZGQobmV3IFNpbmdsZVJvb3RFeHBvcnRQYXJ0aWNpcGFudChuZXcgSmF2YUVFU2luZ2xlUm9vdENhbGxiYWNrKCkpKTsKKwkJcGFydGljaXBhbnRzLmFkZChuZXcgSkVFSGVpcmFyY2h5RXhwb3J0UGFydGljaXBhbnQoKSk7CisJCXBhcnRpY2lwYW50cy5hZGQobmV3IEFkZENsYXNzcGF0aExpYlJlZmVyZW5jZXNQYXJ0aWNpcGFudCgpKTsKKwkJcGFydGljaXBhbnRzLmFkZChuZXcgQWRkQ2xhc3NwYXRoRm9sZGVyc1BhcnRpY2lwYW50KCkpOworCQlwYXJ0aWNpcGFudHMuYWRkKG5ldyBBZGRNYXBwZWRPdXRwdXRGb2xkZXJzUGFydGljaXBhbnQoKSk7CisJCXBhcnRpY2lwYW50cy5hZGQobmV3IElnbm9yZUphdmFJblNvdXJjZUZvbGRlclBhcnRpY2lwYW50KCkpOworCQlpZiAoQ2xhc3NwYXRoRGVwZW5kZW5jeUVuYWJsZW1lbnQuaXNBbGxvd0NsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3koKSkgeworCQkJcGFydGljaXBhbnRzLmFkZChuZXcgUmVwbGFjZU1hbmlmZXN0RXhwb3J0UGFydGljaXBhbnQobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpKSk7CiAJCX0KIAkJCi0JCS8vIElmIGoyZWUgcHJvamVjdCBzdHJ1Y3R1cmUgaXMgYSBzaW5nbGUgcm9vdCBzdHJ1Y3R1cmUsIGp1c3QgcmV0dXJuIG9wdGltaXplZCBtZW1iZXJzCi0JCWlmIChpc1NpbmdsZVJvb3RTdHJ1Y3R1cmUoKSkgewotCQkJZmluYWwgSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzID0gZ2V0T3B0aW1pemVkTWVtYmVycygpOwotCQkJaWYgKCFjbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5VVJJcy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAocmVzb3VyY2VzW2ldIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikgewotCQkJCQkJSU1vZHVsZUZvbGRlciBmb2xkZXIgPSAoSU1vZHVsZUZvbGRlcikgcmVzb3VyY2VzW2ldOwotCQkJCQkJaWYgKGZvbGRlci5nZXROYW1lKCkuZXF1YWxzKEoyRUVDb25zdGFudHMuTUVUQV9JTkYpKSB7Ci0JCQkJCQkJSU1vZHVsZVJlc291cmNlW10gZmlsZXMgPSBmb2xkZXIubWVtYmVycygpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmlsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJaWYgKGZpbGVzW2pdIGluc3RhbmNlb2YgSU1vZHVsZUZpbGUpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCWZpbGVzW2pdID0gcmVwbGFjZU1hbmlmZXN0RmlsZSgoSU1vZHVsZUZpbGUpIGZpbGVzW2pdKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGFkZCB0byBhbnkgcG90ZW50aWFsbHkgbWFwcGVkIEphdmEgY2xhc3MgZm9sZGVycwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQltZW1iZXJzLmFkZChyZXNvdXJjZXNbaV0pOwotCQkJfQotCQkJYWRkQ2xhc3NwYXRoTGliRGVwZW5kZW5jaWVzKGNvbXBvbmVudCk7Ci0JCQkKLQkJCXJldHVybiAoSU1vZHVsZVJlc291cmNlW10pIG1lbWJlcnMudG9BcnJheShuZXcgSU1vZHVsZVJlc291cmNlW21lbWJlcnMuc2l6ZSgpXSk7Ci0JCX0KLQkJCi0JCWNhY2hlZFNvdXJjZUNvbnRhaW5lcnMgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRTb3VyY2VDb250YWluZXJzKGdldFByb2plY3QoKSk7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBqYXZhUGF0aCA9IFBhdGguRU1QVFk7Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkKLQkJCQlqYXZhUGF0aCA9IFdFQl9DTEFTU0VTX1BBVEg7Ci0JCQkKLQkJCWlmIChjb21wb25lbnQgIT0gbnVsbCkgewotCQkJCUlWaXJ0dWFsRm9sZGVyIHZGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yID0gZ2V0TWVtYmVycyh2Rm9sZGVyLCBQYXRoLkVNUFRZKTsKLQkJCQlpbnQgc2l6ZSA9IG1yLmxlbmd0aDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgewotCQkJCQltZW1iZXJzLmFkZChtcltqXSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlJQ29udGFpbmVyW10gamF2YUNvbnQgPSBnZXRKYXZhT3V0cHV0Rm9sZGVycygpOwkJCi0JCQlpbnQgc2l6ZSA9IGphdmFDb250Lmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJLy9JZiB0aGUgamF2YSBvdXRwdXQgaXMgaW4gdGhlIHNjb3BlIG9mIHRoZSB2aXJ0dWFsIGNvbXBvbmVudCwgaWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZXMKLQkJCQlpZiAoQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoamF2YUNvbnRbaV0pLmxlbmd0aCA+IDApIAotCQkJCQljb250aW51ZTsKLQkJCQlJTW9kdWxlUmVzb3VyY2VbXSBtciA9IGdldE1lbWJlcnMoamF2YUNvbnRbaV0sIGphdmFQYXRoLCBqYXZhUGF0aCwgamF2YUNvbnQpOwotCQkJCWludCBzaXplMiA9IG1yLmxlbmd0aDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUyOyBqKyspIHsKLQkJCQkJbWVtYmVycy5hZGQobXJbal0pOwotCQkJCX0KLQkJCX0KLQkJCQkJCQkJCQotCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQkJYWRkVXRpbE1lbWJlcnMoY29tcG9uZW50KTsKLQkJCQlMaXN0IGNvbnN1bWFibGVNZW1iZXJzID0gZ2V0Q29uc3VtYWJsZVJlZmVyZW5jZWRNZW1iZXJzKGNvbXBvbmVudCk7Ci0JCQkJaWYgKCFjb25zdW1hYmxlTWVtYmVycy5pc0VtcHR5KCkpCi0JCQkJCW1lbWJlcnMuYWRkQWxsKGNvbnN1bWFibGVNZW1iZXJzKTsKLQkJCX0KLQkJCQotCQkJSU1vZHVsZVJlc291cmNlW10gbXIgPSBuZXcgSU1vZHVsZVJlc291cmNlW21lbWJlcnMuc2l6ZSgpXTsKLQkJCW1lbWJlcnMudG9BcnJheShtcik7Ci0JCQlyZXR1cm4gbXI7Ci0JCX0gZmluYWxseSB7Ci0JCQljYWNoZWRTb3VyY2VDb250YWluZXJzID0gbnVsbDsKLQkJCWNhY2hlZE91dHB1dENvbnRhaW5lcnMgPSBudWxsOwotCQkJY2FjaGVkT3V0cHV0TWFwcGluZ3MgPSBudWxsOwotCQkJY2FjaGVkU291cmNlT3V0cHV0UGFpcnMgPSBudWxsOwotCQl9CisJCXJldHVybiBwYXJ0aWNpcGFudHMudG9BcnJheShuZXcgSUZsYXR0ZW5QYXJ0aWNpcGFudFtwYXJ0aWNpcGFudHMuc2l6ZSgpXSk7CiAJfQotCQotCXByb3RlY3RlZCBJTW9kdWxlRmlsZSBjcmVhdGVNb2R1bGVGaWxlKElGaWxlIGZpbGUsIElQYXRoIHBhdGgpIHsKLQkJLy8gaWYgdGhpcyBpcyB0aGUgTUFOSUZFU1QuTUYgZmlsZSBhbmQgd2UgaGF2ZSBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llcywgCi0JCS8vIHVwZGF0ZSBpdAotCQlyZXR1cm4gcmVwbGFjZU1hbmlmZXN0RmlsZShzdXBlci5jcmVhdGVNb2R1bGVGaWxlKGZpbGUsIHBhdGgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElNb2R1bGVGaWxlIHJlcGxhY2VNYW5pZmVzdEZpbGUoSU1vZHVsZUZpbGUgbW9kdWxlRmlsZSkgewotCQlmaW5hbCBJRmlsZSBmaWxlID0gKElGaWxlKSBtb2R1bGVGaWxlLmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQlmaW5hbCBJUGF0aCBwYXRoID0gbW9kdWxlRmlsZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKTsKLQkJLy8gaWYgdGhlIE1BTklGRVNULk1GIGlzIGJlaW5nIHJlcXVlc3RlZCBhbmQgd2UgaGF2ZSBjbGFzc3BhdGggY29tcG9uZW50IGRlcGVuZGVuY2llcywgCi0JCS8vIGR5bmFtaWNhbGx5IGdlbmVyYXRlIGEgY3VzdG9taXplZCBNQU5JRkVTVC5NRiBhbmQgcmV0dXJuIHRoYXQgCi0JCWlmIChwYXRoLmFwcGVuZChmaWxlLmdldE5hbWUoKSkuZXF1YWxzKE1BTklGRVNUX1BBVEgpICYmICFjbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5VVJJcy5pc0VtcHR5KCkpIHsKLQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCWZpbmFsIElQYXRoIHdvcmtpbmdMb2NhdGlvbiA9IHByb2plY3QuZ2V0V29ya2luZ0xvY2F0aW9uKEoyRUVQbHVnaW4uUExVR0lOX0lEKTsKLQkJCS8vIGNyZWF0ZSBwYXRoIHRvIHRlbXAgTUFOSUZFU1QuTUYKLQkJCWZpbmFsIElQYXRoIHRlbXBNYW5pZmVzdFBhdGggPSB3b3JraW5nTG9jYXRpb24uYXBwZW5kKE1BTklGRVNUX1BBVEgpOwotCQkJZmluYWwgRmlsZSBmc0ZpbGUgPSB0ZW1wTWFuaWZlc3RQYXRoLnRvRmlsZSgpOwotCQkJaWYgKCFmc0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkvLyBjcmVhdGUgcGFyZW50IGRpcnMgZm9yIHRlbXAgTUFOSUZFU1QuTUYKLQkJCQlmaW5hbCBGaWxlIHBhcmVudCA9IGZzRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpIHsKLQkJCQkJaWYgKCFwYXJlbnQubWtkaXJzKCkpIHsKLQkJCQkJCXJldHVybiBtb2R1bGVGaWxlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gY3JlYXRlIHRlbXAgTUFOSUZFU1QuTUYgdXNpbmcgdXRpbCBtZXRob2QKLQkJCXRyeSB7Ci0JCQkJQ2xhc3NwYXRoRGVwZW5kZW5jeU1hbmlmZXN0VXRpbC51cGRhdGVNYW5pZmVzdENsYXNzcGF0aChmaWxlLCBjbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmN5VVJJcywgZnNGaWxlKTsKLQkJCQkvLyBjcmVhdGUgbmV3IE1vZHVsZUZpbGUgdGhhdCBwb2ludHMgdG8gdGVtcCBNQU5JRkVTVC5NRgotCQkJCXJldHVybiBuZXcgTW9kdWxlRmlsZShmc0ZpbGUsIGZpbGUuZ2V0TmFtZSgpLCBwYXRoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCXJldHVybiBtb2R1bGVGaWxlOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2R1bGVGaWxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gaGFuZGxlSmF2YVBhdGgoSVBhdGggcGF0aCwgSVBhdGggamF2YVBhdGgsIElQYXRoIGN1clBhdGgsIElDb250YWluZXJbXSBqYXZhQ29udCwgSU1vZHVsZVJlc291cmNlW10gbXIsIElDb250YWluZXIgY2MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGN1clBhdGguZXF1YWxzKGphdmFQYXRoKSkgewotCQkJaW50IHNpemUgPSBqYXZhQ29udC5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yMiA9IGdldE1lbWJlcnMoamF2YUNvbnRbaV0sIHBhdGguYXBwZW5kKGNjLmdldE5hbWUoKSksIG51bGwsIG51bGwpOwotCQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yMyA9IG5ldyBJTW9kdWxlUmVzb3VyY2VbbXIubGVuZ3RoICsgbXIyLmxlbmd0aF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShtciwgMCwgbXIzLCAwLCBtci5sZW5ndGgpOwotCQkJCVN5c3RlbS5hcnJheWNvcHkobXIyLCAwLCBtcjMsIG1yLmxlbmd0aCwgbXIyLmxlbmd0aCk7Ci0JCQkJbXIgPSBtcjM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlib29sZWFuIGNvbnRhaW5zRm9sZGVyID0gZmFsc2U7Ci0JCQlTdHJpbmcgbmFtZSA9IGphdmFQYXRoLnNlZ21lbnQoY3VyUGF0aC5zZWdtZW50Q291bnQoKSk7Ci0JCQlpbnQgc2l6ZSA9IG1yLmxlbmd0aDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSAmJiAhY29udGFpbnNGb2xkZXI7IGkrKykgewotCQkJCWlmIChtcltpXSBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpIHsKLQkJCQkJSU1vZHVsZUZvbGRlciBtZjIgPSAoSU1vZHVsZUZvbGRlcikgbXJbaV07Ci0JCQkJCWlmIChuYW1lLmVxdWFscyhtZjIuZ2V0TmFtZSgpKSkgewotCQkJCQkJY29udGFpbnNGb2xkZXIgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIWNvbnRhaW5zRm9sZGVyICYmIGphdmFDb250Lmxlbmd0aCA+IDApIHsKLQkJCQlNb2R1bGVGb2xkZXIgbWYyID0gbmV3IE1vZHVsZUZvbGRlcihqYXZhQ29udFswXSwgbmFtZSwgY3VyUGF0aCk7Ci0JCQkJSU1vZHVsZVJlc291cmNlW10gbXJmID0gbmV3IElNb2R1bGVSZXNvdXJjZVswXTsKLQkJCQlzaXplID0gamF2YUNvbnQubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yZjIgPSBnZXRNZW1iZXJzKGphdmFDb250W2ldLCBqYXZhUGF0aCwgbnVsbCwgbnVsbCk7Ci0JCQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yZjMgPSBuZXcgSU1vZHVsZVJlc291cmNlW21yZi5sZW5ndGggKyBtcmYyLmxlbmd0aF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkobXJmLCAwLCBtcmYzLCAwLCBtcmYubGVuZ3RoKTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShtcmYyLCAwLCBtcmYzLCBtcmYubGVuZ3RoLCBtcmYyLmxlbmd0aCk7Ci0JCQkJCW1yZiA9IG1yZjM7Ci0JCQkJfQotCQkJCQotCQkJCW1mMi5zZXRNZW1iZXJzKG1yZik7Ci0JCQkJCi0JCQkJSU1vZHVsZVJlc291cmNlW10gbXIzID0gbmV3IElNb2R1bGVSZXNvdXJjZVttci5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG1yLCAwLCBtcjMsIDAsIG1yLmxlbmd0aCk7Ci0JCQkJbXIzW21yLmxlbmd0aF0gPSBtZjI7Ci0JCQkJbXIgPSBtcjM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1yOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNsYXNzcGF0aCBhcyBhIGxpc3Qgb2YgYWJzb2x1dGUgSVBhdGhzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgcGF0aHMKLSAgICAgKi8KLSAgICBwdWJsaWMgSVBhdGhbXSBnZXRDbGFzc3BhdGgoKSB7Ci0JCUxpc3QgcGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIElKYXZhUHJvamVjdCBwcm9qID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRKYXZhUHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgICBVUkxbXSB1cmxzID0gSmVtUHJvamVjdFV0aWxpdGllcy5nZXRDbGFzc3BhdGhBc1VSTEFycmF5KHByb2opOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyBpKyspIHsKLQkJCVVSTCB1cmwgPSB1cmxzW2ldOwotCQkJcGF0aHMuYWRkKFBhdGguZnJvbU9TU3RyaW5nKHVybC5nZXRQYXRoKCkpKTsKLQkJfQotICAgICAgICByZXR1cm4gIChJUGF0aFtdKSBwYXRocy50b0FycmF5KG5ldyBJUGF0aFtwYXRocy5zaXplKCldKTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSU1vZHVsZSBnYXRoZXJNb2R1bGVSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJQ2hpbGRNb2R1bGVSZWZlcmVuY2UgY2hpbGQgKSB7CisgICAgCWlmICghY2hpbGQuaXNCaW5hcnkoKSkgCisgICAgCQlyZXR1cm4gc3VwZXIuZ2F0aGVyTW9kdWxlUmVmZXJlbmNlKGNvbXBvbmVudCwgY2hpbGQpOworICAgIAlyZXR1cm4gSjJFRURlcGxveWFibGVGYWN0b3J5LmoyZWVJbnN0YW5jZSgpLmNyZWF0ZUNoaWxkTW9kdWxlKHRoaXMsIGNoaWxkKTsKICAgICB9CiAgICAgCisgICAgQE92ZXJyaWRlCisJcHJvdGVjdGVkIElNb2R1bGUgZmlsdGVyTW9kdWxlRGVsZWdhdGVzKElNb2R1bGVbXSBtb2R1bGVzKSB7CisgICAgCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgeworCQkJTW9kdWxlRGVsZWdhdGUgbWQgPSAoTW9kdWxlRGVsZWdhdGUpbW9kdWxlc1tpXS5sb2FkQWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCQlpZiAobWQgaW5zdGFuY2VvZiBKMkVFRmxleFByb2pEZXBsb3lhYmxlKSB7CisJCQkJcmV0dXJuIG1vZHVsZXNbaV07CisJCQl9CisJCX0KKwkJcmV0dXJuIHN1cGVyLmZpbHRlck1vZHVsZURlbGVnYXRlcyhtb2R1bGVzKTsKKwl9CisgICAgCisJLypfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyAgICAgKiAKKwkgKiBNZXRob2RzIGZvciBzcGVjaWZpYyBKMkVFIC8gSkVFIEludGVyZmFjZXMgYXJlIGJlbG93CisJICpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKwkgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lKFN0cmluZyBlamJOYW1lKSB7Ci0gICAgCWlmICghSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKQorICAgIAlpZiAoIUphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKQogICAgIAkJcmV0dXJuIG51bGw7CiAJCUVqYk1vZHVsZUV4dGVuc2lvbkhlbHBlciBtb2RIZWxwZXIgPSBudWxsOwogCQlFSkJKYXIgamFyID0gbnVsbDsKQEAgLTM4NSwxMjIgKzE1MywxMyBAQAogCQkJCXJldHVybiBtb2RIZWxwZXIgPT0gbnVsbCA/IG51bGwgOiBtb2RIZWxwZXIuZ2V0Sk5ESU5hbWUoamFyLCBqYXIuZ2V0RW50ZXJwcmlzZUJlYW5OYW1lZChlamJOYW1lKSk7CiAJCQl9CiAJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfSBmaW5hbGx5IHsKIAkJCWlmIChlamJFZGl0ICE9IG51bGwpCiAJCQkJZWpiRWRpdC5kaXNwb3NlKCk7CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2Qgd2lsbCBoYW5kbGUgYSBudW1iZXIgb2YgSjJFRSByZWxhdGVkIHNjZW5hcmlvcy4gIElmIHRoaXMgaXMgYW4gZWFyIGFuZCBhIGNoaWxkIG1vZHVsZSBpcyBwYXNzZWQgaW4sCi0gICAgICogdGhlIFVSSSBmb3IgdGhhdCBjaGlsZCBtb2R1bGUgd2lsbCBiZSByZXR1cm5lZC4gIElmIG5vIGNoaWxkIG1vZHVsZSB3YXMgcGFzc2VkLCB0aGUgVVJJIG9mIHRoZSBFQVIgaXMgcmV0dXJuZWQuCi0gICAgICogSWYgdGhpcyBpcyBhIGNoaWxkIGNvbXBvbmVudCBhbmQgdGhlIG1vZHVsZSBwYXNzZWQgaW4gaXMgdGhlIEVBUiwgd2UgZ3JhYiB0aGUgbW9kdWxlIHVyaSBmb3IgdGhpcyBjb21wYXJlZCB0byB0aGF0Ci0gICAgICogRUFSLiAgSWYgbm8gZWFyIG1vZHVsZSBpcyBwYXNzZWQgaW4gd2UgbG9vayBmb3Igb25lIGFuZCB1c2UgaXQgYW5kIHJldHVybiBVUkkgcmVsYXRpdmUgdG8gZm91bmQgRUFSLiAgSWYgbm8gRUFSJ3MgCi0gICAgICogYXJlIGZvdW5kIHRoZSBVUkkgaXMgcmV0dXJuZWQgaW4gYSBkZWZhdWx0IG1hbm5lci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFVSSSBzdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFVSSShJTW9kdWxlIG1vZHVsZSkgewotICAgIAkvLyBJZiB0aGUgY29tcG9uZW50IGlzIGFuIGVhciBhbmQgdGhlIG1vZHVsZSBwYXNzZWQgaW4gaXMgYSBjaGlsZCBtb2R1bGUKLSAgICAJaWYgKGNvbXBvbmVudCE9bnVsbCAmJiBtb2R1bGUhPW51bGwgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKQotIAkJCXJldHVybiBnZXRDb250YWluZWRVUkkobW9kdWxlKTsKLQotICAgIAlJVmlydHVhbENvbXBvbmVudCBlYXIgPSBudWxsOwotICAgIAlTdHJpbmcgYVVSSSA9IG51bGw7Ci0gICAgCS8vIElmIHRoZSBjb21wb25lbnQgaXMgYSBjaGlsZCBtb2R1bGUgYW5kIHRoZSBtb2R1bGUgcGFzc2VkIGluIGlzIHRoZSBlYXIKLSAgICAJaWYgKG1vZHVsZSAhPSBudWxsICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChtb2R1bGUuZ2V0UHJvamVjdCgpKSkKLSAgICAJCWVhciA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KG1vZHVsZS5nZXRQcm9qZWN0KCkpOwotICAgIAkvLyBlbHNlIGlmIHRoZSBjb21wb25lbnQgaXMgYSBjaGlsZCBtb2R1bGUgYW5kIHRoZSBtb2R1bGUgcGFzc2VkIGluIGlzIG51bGwsIHNlYXJjaCBmb3IgZmlyc3QgZWFyCi0gICAgCWVsc2UgaWYgKG1vZHVsZT09bnVsbCAmJiBjb21wb25lbnQgIT0gbnVsbCkgewotICAgIAkJSVByb2plY3RbXSBlYXJQcm9qZWN0cyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFJlZmVyZW5jaW5nRUFSUHJvamVjdHMoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JICAgICAgICBpZiAoZWFyUHJvamVjdHMubGVuZ3RoPjApCi0JICAgICAgICAJZWFyID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUHJvamVjdHNbMF0pOwotICAgIAl9Ci0gICAgCS8vIFdlIGhhdmUgYSB2YWxpZCBlYXIgYW5kIHRoZSBjb21wb25lbnQgaXMgYSB2YWxpZCBjaGlsZAotICAgIAlpZiAoZWFyICE9IG51bGwgJiYgY29tcG9uZW50ICE9IG51bGwpIHsKLSAgICAJCUVBUkFydGlmYWN0RWRpdCBlYXJFZGl0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZWFyRWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKGVhcik7Ci0JCQkJaWYgKGVhckVkaXQgIT0gbnVsbCkKLQkJCQkJYVVSSSA9IGVhckVkaXQuZ2V0TW9kdWxlVVJJKGNvbXBvbmVudCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChlYXJFZGl0ICE9IG51bGwpCi0JCQkJCWVhckVkaXQuZGlzcG9zZSgpOwotCQkJfQotICAgIAl9IAotICAgIAkvLyBXZSBoYXZlIGFuIGVhciBjb21wb25lbnQgYW5kIG5vIGNoaWxkIG1vZHVsZQotICAgIAllbHNlIGlmIChjb21wb25lbnQhPW51bGwgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQlhVVJJID0gY29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpK0lKMkVFTW9kdWxlQ29uc3RhbnRzLkVBUl9FWFQ7Ci0gICAgCX0gCi0gICAgCS8vIFdlIGhhdmUgY2hpbGQgY29tcG9uZW50cyBidXQgY291bGQgbm90IGZpbmQgdmFsaWQgZWFycwotICAgIAllbHNlIGlmIChjb21wb25lbnQgIT0gbnVsbCAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0JCQlpZiAobW9kdWxlICE9IG51bGwpIHsKLQkJCQlJVmlydHVhbENvbXBvbmVudCB3ZWJDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkJU3RyaW5nIGV4dGVuc2lvbiA9IElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQ7Ci0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QobW9kdWxlLmdldFByb2plY3QoKSkpIHsKLQkJCQkJZXh0ZW5zaW9uID0gSUoyRUVNb2R1bGVDb25zdGFudHMuV0FSX0VYVDsKLQkJCQl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChtb2R1bGUuZ2V0UHJvamVjdCgpKSkgewotCQkJCQlleHRlbnNpb24gPSBJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhUOwotCQkJCX0KLQkJCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSB3ZWJDb21wLmdldFJlZmVyZW5jZShtb2R1bGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCQkJaWYocmVmZXJlbmNlICE9IG51bGwpewotCQkJCQlhVVJJID0gQ29tcG9uZW50VXRpbGl0aWVzLmdldERlcGxveVVyaU9mQ29tcG9uZW50KHJlZmVyZW5jZSwgZXh0ZW5zaW9uKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhVVJJID0gd2ViQ29tcC5nZXREZXBsb3llZE5hbWUoKSArIGV4dGVuc2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhVVJJID0gY29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpICsgSUoyRUVNb2R1bGVDb25zdGFudHMuV0FSX0VYVDsKLQkJCX0KLQkJfSAKLSAgICAJZWxzZSBpZiAoY29tcG9uZW50IT1udWxsICYmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkgfHwgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpKSB7Ci0gICAgCQlhVVJJID0gY29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpK0lKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQ7Ci0gICAgCX0gCi0gICAgCWVsc2UgaWYgKGNvbXBvbmVudCE9bnVsbCAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pDQVByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLSAgICAJCWFVUkkgPSBjb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCkrSUoyRUVNb2R1bGVDb25zdGFudHMuUkFSX0VYVDsKLSAgICAJfQotICAgIAkKLSAgICAJaWYgKGFVUkkgIT1udWxsICYmIGFVUkkubGVuZ3RoKCk+MSAmJiBhVVJJLnN0YXJ0c1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotICAgIAkJYVVSSSA9IGFVUkkuc3Vic3RyaW5nKDEpOwotICAgIAlyZXR1cm4gYVVSSTsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCaW5hcnlNb2R1bGVBcmNoaXZlKElNb2R1bGUgbW9kdWxlKSB7Ci0gICAgCWlmIChtb2R1bGUhPW51bGwgJiYgbW9kdWxlLmdldE5hbWUoKS5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUKSB8fCBtb2R1bGUuZ2V0TmFtZSgpLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLldBUl9FWFQpIHx8Ci0gICAgCQkJbW9kdWxlLmdldE5hbWUoKS5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhUKSkgewotICAgIAkJaWYgKGNvbXBvbmVudCE9bnVsbCAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpCi0gICAgCQkJcmV0dXJuIHRydWU7Ci0gICAgCX0KLSAgICAJcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRDb250YWluZWRVUkkoSU1vZHVsZSBtb2R1bGUpIHsKLSAgICAJaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCB8fCBpc0JpbmFyeU1vZHVsZUFyY2hpdmUobW9kdWxlKSkKLSAgICAJCXJldHVybiBuZXcgUGF0aChtb2R1bGUuZ2V0TmFtZSgpKS5sYXN0U2VnbWVudCgpOwotICAgIAkKLSAgICAJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KG1vZHVsZS5nZXRQcm9qZWN0KCkpOwotICAgIAlTdHJpbmcgYVVSSSA9IG51bGw7Ci0gICAgCWlmIChjb21wIT1udWxsICYmIGNvbXBvbmVudCE9bnVsbCAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLQkJCUVBUkFydGlmYWN0RWRpdCBlYXJFZGl0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZWFyRWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXBvbmVudCk7Ci0JCQkJaWYgKGVhckVkaXQgIT0gbnVsbCkKLQkJCQkJYVVSSSA9IGVhckVkaXQuZ2V0TW9kdWxlVVJJKGNvbXApOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZWFyRWRpdCAhPSBudWxsKQotCQkJCQllYXJFZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLSAgICAJfQotICAgIAlpZiAoYVVSSSAhPW51bGwgJiYgYVVSSS5sZW5ndGgoKT4xICYmIGFVUkkuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0gICAgCQlhVVJJID0gYVVSSS5zdWJzdHJpbmcoMSk7Ci0gICAgCXJldHVybiBhVVJJOwotCX0KICAgICAKICAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBjb250ZXh0IHJvb3QgcHJvcGVydHkgZnJvbSB0aGUgZGVwbG95YWJsZSBwcm9qZWN0J3MgLmNvbXBvbmVudCBmaWxlCkBAIC01MTYsNyArMTc1LDcgQEAKICAgICAgKiBUaGlzIG1ldGhvZCBpcyBhcHBsaWNhYmxlIGZvciBhIHdlYiBkZXBsb3lhYmxlLiAgVGhlIG1vZHVsZSBwYXNzZWQgaW4gc2hvdWxkIGVpdGhlciBiZSBudWxsIG9yCiAgICAgICogdGhlIEVBUiBtb2R1bGUgdGhlIHdlYiBkZXBsb3lhYmxlIGlzIGNvbnRhaW5lZCBpbi4gIEl0IHdpbGwgcmV0dXJuIHRoZSBjb250ZXh0IHJvb3QgZnJvbSB0aGUgRUFSCiAgICAgICogaWYgaXQgaGFzIG9uZSBvciByZXR1cm4gdGhlIC5jb21wb25lbnQgdmFsdWUgaW4gdGhlIHdlYiBwcm9qZWN0IGlmIGl0IGlzIHN0YW5kYWxvbmUuCi0gICAgICogIAorICAgICAqIAogICAgICAqIEBwYXJhbSBtb2R1bGUKICAgICAgKiBAcmV0dXJuIGNvbnRleHRSb290IFN0cmluZwogICAgICAqLwpAQCAtNTI1LDcgKzE4NCw3IEBACiAgICAgCVN0cmluZyBjb250ZXh0Um9vdCA9IG51bGw7CiAgICAgCWlmIChlYXJNb2R1bGUgPT0gbnVsbCkKICAgICAJCXJldHVybiBnZXRDb250ZXh0Um9vdCgpOwotICAgIAllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoZWFyTW9kdWxlLmdldFByb2plY3QoKSkgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChkZXBsb3lQcm9qZWN0KSkgeworICAgIAllbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChlYXJNb2R1bGUuZ2V0UHJvamVjdCgpKSAmJiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoZGVwbG95UHJvamVjdCkpIHsKICAgICAJCUVBUkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKICAgICAJCXRyeSB7CiAgICAgCQkJZWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKGVhck1vZHVsZS5nZXRQcm9qZWN0KCkpOwpAQCAtNTM4LDQzMyArMTk3LDU4IEBACiAgICAgCXJldHVybiBjb250ZXh0Um9vdDsKICAgICB9CiAgICAgCisgICAgCisJLyoqCisJICogUmV0dXJucyB0aGUgcm9vdCBmb2xkZXJzIGZvciB0aGUgcmVzb3VyY2VzIGluIHRoaXMgbW9kdWxlLgorCSAqIAorCSAqIEByZXR1cm4gYSBwb3NzaWJseS1lbXB0eSBhcnJheSBvZiByZXNvdXJjZSBmb2xkZXJzCisJICovCisJcHVibGljIElDb250YWluZXJbXSBnZXRSZXNvdXJjZUZvbGRlcnMoKSB7CisJCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKTsKKwkJaWYgKHZjICE9IG51bGwpIHsKKwkJCUlWaXJ0dWFsRm9sZGVyIHZGb2xkZXIgPSB2Yy5nZXRSb290Rm9sZGVyKCk7CisJCQlpZiAodkZvbGRlciAhPSBudWxsKQorCQkJCXJldHVybiB2Rm9sZGVyLmdldFVuZGVybHlpbmdGb2xkZXJzKCk7CisJCX0KKwkJcmV0dXJuIG5ldyBJQ29udGFpbmVyW117fTsKKwl9CisJCisJLyoqCisJICogUmV0dXJucyB0aGUgcm9vdCBmb2xkZXJzIGNvbnRhaW5pbmcgSmF2YSBvdXRwdXQgaW4gdGhpcyBtb2R1bGUuCisJICogCisJICogQHJldHVybiBhIHBvc3NpYmx5LWVtcHR5IGFycmF5IG9mIEphdmEgb3V0cHV0IGZvbGRlcnMKKwkgKiBAZGVwcmVjYXRlZAorCSAqLworCXB1YmxpYyBJQ29udGFpbmVyW10gZ2V0SmF2YU91dHB1dEZvbGRlcnMoKSB7CisJCXJldHVybiBnZXRKYXZhT3V0cHV0Rm9sZGVycyhjb21wb25lbnQpOworCX0KKwkKKwkvKioKKwkgKiBAcGFyYW0gY29tcG9uZW50CisJICogQGRlcHJlY2F0ZWQKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIElDb250YWluZXJbXSBnZXRKYXZhT3V0cHV0Rm9sZGVycyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKKwkJaWYgKGNvbXBvbmVudCA9PSBudWxsKQorCQkJcmV0dXJuIG5ldyBJQ29udGFpbmVyWzBdOworCQlMaXN0PElDb250YWluZXI+IGwgPSBKYXZhTGl0ZVV0aWxpdGllcy5nZXRKYXZhT3V0cHV0Q29udGFpbmVycyhjb21wb25lbnQpOworCQlyZXR1cm4gbC50b0FycmF5KG5ldyBJQ29udGFpbmVyW2wuc2l6ZSgpXSk7CisJfQkKKwkKICAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBzb3VyY2UgY29udGFpbmVyLCBpZiBhbnksIGZvciB0aGUgZ2l2ZW4gZmlsZS4KKyAgICAgKiBSZXR1cm5zIHRoZSBjbGFzc3BhdGggYXMgYSBsaXN0IG9mIGFic29sdXRlIElQYXRocy4KICAgICAgKiAKLSAgICAgKiBAcGFyYW0gZmlsZQotICAgICAqIEByZXR1cm4gSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlQ29udGFpbmVyIGZvciBJRmlsZQorICAgICAqIEBkZXByZWNhdGVkCisgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBwYXRocwogICAgICAqLwotICAgIHByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRTb3VyY2VDb250YWluZXIoSUZpbGUgZmlsZSkgewotICAgIAlpZiAoZmlsZSA9PSBudWxsKQotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCUlQYWNrYWdlRnJhZ21lbnRSb290W10gc3JjQ29udGFpbmVycyA9IGdldFNvdXJjZUNvbnRhaW5lcnMoKTsKLSAgICAJZm9yIChpbnQgaT0wOyBpPHNyY0NvbnRhaW5lcnMubGVuZ3RoOyBpKyspIHsKLSAgICAJCUlQYXRoIHNyY1BhdGggPSBzcmNDb250YWluZXJzW2ldLmdldFBhdGgoKTsKLSAgICAJCWlmIChzcmNQYXRoLmlzUHJlZml4T2YoZmlsZS5nZXRGdWxsUGF0aCgpKSkKLSAgICAJCQlyZXR1cm4gc3JjQ29udGFpbmVyc1tpXTsKLSAgICAJfQotICAgIAlyZXR1cm4gbnVsbDsKKyAgICBwdWJsaWMgSVBhdGhbXSBnZXRDbGFzc3BhdGgoKSB7CisJCUxpc3Q8SVBhdGg+IHBhdGhzID0gbmV3IEFycmF5TGlzdDxJUGF0aD4oKTsKKyAgICAgICAgSUphdmFQcm9qZWN0IHByb2ogPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldEphdmFQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIFVSTFtdIHVybHMgPSBKZW1Qcm9qZWN0VXRpbGl0aWVzLmdldENsYXNzcGF0aEFzVVJMQXJyYXkocHJvaik7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgdXJscy5sZW5ndGg7IGkrKykgeworCQkJVVJMIHVybCA9IHVybHNbaV07CisJCQlwYXRocy5hZGQoUGF0aC5mcm9tT1NTdHJpbmcodXJsLmdldFBhdGgoKSkpOworCQl9CisgICAgICAgIHJldHVybiBwYXRocy50b0FycmF5KG5ldyBJUGF0aFtwYXRocy5zaXplKCldKTsKICAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRWl0aGVyIHJldHVybnMgdmFsdWUgZnJvbSBjYWNoZSBvciBzdG9yZXMgcmVzdWx0IGFzIHZhbHVlIGluIGNhY2hlIGZvciB0aGUgY29ycmVzcG9uZGluZwotICAgICAqIG91dHB1dCBjb250YWluZXIgZm9yIHRoZSBnaXZlbiBzb3VyY2UgY29udGFpbmVyLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzb3VyY2VDb250YWluZXIKLSAgICAgKiBAcmV0dXJuIElDb250YWluZXIgb3V0cHV0IGNvbnRhaW5lciBmb3IgZ2l2ZW4gc291cmNlIGNvbnRhaW5lcgotICAgICAqLwotICAgIHByb3RlY3RlZCBJQ29udGFpbmVyIGdldE91dHB1dENvbnRhaW5lcihJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VDb250YWluZXIpIHsKLSAgICAJaWYgKHNvdXJjZUNvbnRhaW5lciA9PSBudWxsKQotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCQotICAgIAlIYXNoTWFwIHBhaXJzID0gZ2V0Q2FjaGVkU291cmNlT3V0cHV0UGFpcnMoKTsKLSAgICAJSUNvbnRhaW5lciBvdXRwdXQgPSAoSUNvbnRhaW5lcikgcGFpcnMuZ2V0KHNvdXJjZUNvbnRhaW5lcik7Ci0gICAgCWlmIChvdXRwdXQgPT0gbnVsbCkgewotICAgIAkJb3V0cHV0ID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0T3V0cHV0Q29udGFpbmVyKGdldFByb2plY3QoKSwgc291cmNlQ29udGFpbmVyKTsKLSAgICAJCXBhaXJzLnB1dChzb3VyY2VDb250YWluZXIsb3V0cHV0KTsKLSAgICAJfQotICAgIAlyZXR1cm4gb3V0cHV0OwotICAgIH0KLSAgICAKLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290W10gZ2V0U291cmNlQ29udGFpbmVycygpIHsKLQkJaWYgKGNhY2hlZFNvdXJjZUNvbnRhaW5lcnMgIT0gbnVsbCkKLQkJCXJldHVybiBjYWNoZWRTb3VyY2VDb250YWluZXJzOwotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0U291cmNlQ29udGFpbmVycyhnZXRQcm9qZWN0KCkpOwotCX0KLSAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRDb25zdW1hYmxlUmVmZXJlbmNlZE1lbWJlcnMoSVZpcnR1YWxDb21wb25lbnQgdmMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTGlzdCBjb25zdW1hYmxlTWVtYmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZDb21wb25lbnRzID0gdmMuZ2V0UmVmZXJlbmNlcygpOwotICAgIAlmb3IgKGludCBpID0gMDsgaSA8IHJlZkNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHJlZkNvbXBvbmVudHNbaV07Ci0gICAgCQlpZiAocmVmZXJlbmNlICE9IG51bGwgJiYgcmVmZXJlbmNlLmdldERlcGVuZGVuY3lUeXBlKCk9PUlWaXJ0dWFsUmVmZXJlbmNlLkRFUEVOREVOQ1lfVFlQRV9DT05TVU1FUykgewotICAgIAkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbnN1bWVkQ29tcG9uZW50ID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLSAgICAJCQlpZiAoY29uc3VtZWRDb21wb25lbnQhPW51bGwgJiYgaXNQcm9qZWN0T2ZUeXBlKGNvbnN1bWVkQ29tcG9uZW50LmdldFByb2plY3QoKSxJTW9kdWxlQ29uc3RhbnRzLkpTVF9VVElMSVRZX01PRFVMRSkpIHsKLSAgICAJCQkJaWYgKGNvbnN1bWVkQ29tcG9uZW50ICE9IG51bGwgJiYgY29uc3VtZWRDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpIT1udWxsKSB7Ci0gICAgCQkJCQlJVmlydHVhbEZvbGRlciB2Rm9sZGVyID0gY29uc3VtZWRDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotICAgIAkJCQkJSU1vZHVsZVJlc291cmNlW10gbXIgPSBnZXRNZW1iZXJzKHZGb2xkZXIsIHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpLm1ha2VSZWxhdGl2ZSgpKTsKLSAgICAJCQkJCWludCBzaXplID0gbXIubGVuZ3RoOwotICAgIAkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLSAgICAJCQkJCQlpZiAoIW1lbWJlcnMuY29udGFpbnMobXJbal0pKQotICAgIAkJCQkJCQltZW1iZXJzLmFkZChtcltqXSk7Ci0gICAgCQkJCQl9Ci0gICAgCQkJCQlhZGRVdGlsTWVtYmVycyhjb25zdW1lZENvbXBvbmVudCk7Ci0gICAgCQkJCQlMaXN0IGNoaWxkQ29uc3VtYWJsZU1lbWJlcnMgPSBnZXRDb25zdW1hYmxlUmVmZXJlbmNlZE1lbWJlcnMoY29uc3VtZWRDb21wb25lbnQpOwotICAgIAkJCQkJaWYgKCFjaGlsZENvbnN1bWFibGVNZW1iZXJzLmlzRW1wdHkoKSkKLSAgICAJCQkJCQltZW1iZXJzLmFkZEFsbChjaGlsZENvbnN1bWFibGVNZW1iZXJzKTsKLSAgICAJCQkJfQotICAgIAkJCQkKLSAgICAJCQkJSUNvbnRhaW5lcltdIGphdmFDb250ID0gZ2V0SmF2YU91dHB1dEZvbGRlcnMoY29uc3VtZWRDb21wb25lbnQuZ2V0UHJvamVjdCgpKTsJCQotICAgIAkJCQlpbnQgc2l6ZSA9IGphdmFDb250Lmxlbmd0aDsKLSAgICAJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLSAgICAJCQkJCUlNb2R1bGVSZXNvdXJjZVtdIG1yID0gZ2V0TWVtYmVycyhqYXZhQ29udFtqXSwgcmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCksIHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpLCBqYXZhQ29udCk7Ci0gICAgCQkJCQlpbnQgc2l6ZTIgPSBtci5sZW5ndGg7Ci0gICAgCQkJCQlmb3IgKGludCBrID0gMDsgayA8IHNpemUyOyBrKyspIHsKLSAgICAJCQkJCQlpZiAoIW1lbWJlcnMuY29udGFpbnMobXJba10pKQotICAgIAkJCQkJCQltZW1iZXJzLmFkZChtcltrXSk7Ci0gICAgCQkJCQl9Ci0gICAgCQkJCX0KLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLQkJcmV0dXJuIGNvbnN1bWFibGVNZW1iZXJzOwotCX0KLSAgICAKLSAgICBwcm90ZWN0ZWQgSU1vZHVsZSBnYXRoZXJNb2R1bGVSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJVmlydHVhbENvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgKSB7Ci0gICAgCUlNb2R1bGUgbW9kdWxlID0gc3VwZXIuZ2F0aGVyTW9kdWxlUmVmZXJlbmNlKGNvbXBvbmVudCwgdGFyZ2V0Q29tcG9uZW50KTsKLSAgICAJLy8gSGFuZGxlIGJpbmFyeSBtb2R1bGUgY29tcG9uZW50cwotICAgIAlpZiAodGFyZ2V0Q29tcG9uZW50IGluc3RhbmNlb2YgSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7Ci0gICAgCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpIHx8IHRhcmdldENvbXBvbmVudC5nZXRQcm9qZWN0KCkhPWNvbXBvbmVudC5nZXRQcm9qZWN0KCkpCi0gICAgCQkJbW9kdWxlID0gU2VydmVyVXRpbC5nZXRNb2R1bGUoSjJFRURlcGxveWFibGVGYWN0b3J5LklEKyI6Iit0YXJnZXRDb21wb25lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgIAl9Ci0JCXJldHVybiBtb2R1bGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIERldGVybWluZSBpZiB0aGUgY29tcG9uZW50IGlzIG5lc3RlZCBKMkVFIG1vZHVsZSBvbiB0aGUgYXBwbGljYXRpb24ueG1sIG9mIHRoaXMgRUFSCi0gICAgICogQHBhcmFtIGFDb21wb25lbnQKLSAgICAgKiBAcmV0dXJuIGJvb2xlYW4gaXMgcGFzc2VkIGluIGNvbXBvbmVudCBhIG5lc3RlZCBKMkVFIG1vZHVsZSBvbiB0aGlzIEVBUgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc05lc3RlZEoyRUVNb2R1bGUoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCwgSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzLCBFQVJBcnRpZmFjdEVkaXQgZWRpdCkgewotICAgIAlpZiAoZWRpdD09bnVsbCkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUFwcGxpY2F0aW9uIGFwcCA9IGVkaXQuZ2V0QXBwbGljYXRpb24oKTsKLQkJaWYgKGFwcCA9PSBudWxsKSB7IC8vIGlmIG5vIGFwcGxpY2F0aW9uLnhtbCwgcmV0dXJuIGZhbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlID0gZ2V0UmVmZXJlbmNlTmFtZWQocmVmZXJlbmNlcyxhQ29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCS8vIEVuc3VyZSBtb2R1bGUgVVJJIGV4aXN0cyBvbiBFQVIgREQgZm9yIGJpbmFyeSBhcmNoaXZlCi0JCWJvb2xlYW4gaW5ERCA9IGFwcC5nZXRGaXJzdE1vZHVsZShyZWZlcmVuY2UuZ2V0QXJjaGl2ZU5hbWUoKSkgIT0gbnVsbDsKLQkJcmV0dXJuIGluREQgJiYgSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLmdldEphdmFFRVF1aWNrUGVlayhhQ29tcG9uZW50KS5nZXRUeXBlKCkgIT0gSmF2YUVFUXVpY2tQZWVrLlVOS05PV047Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBJVmlydHVhbFJlZmVyZW5jZSBnZXRSZWZlcmVuY2VOYW1lZChJVmlydHVhbFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMsIFN0cmluZyBuYW1lKSB7Ci0gICAgCWZvciAoaW50IGk9MDsgaTxyZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgCQlpZiAocmVmZXJlbmNlc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLSAgICAJCQlyZXR1cm4gcmVmZXJlbmNlc1tpXTsKLSAgICAJfQotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIEFydGlmYWN0RWRpdCBnZXRDb21wb25lbnRBcnRpZmFjdEVkaXRGb3JSZWFkKCkgewotCQlyZXR1cm4gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIFRoZSByZWZlcmVuY2VzIGZvciBKMkVFIG1vZHVsZSBkZXBsb3ltZW50IGFyZSBvbmx5IHRob3NlIGNoaWxkIG1vZHVsZXMgb2YgRUFScyBvciB3ZWIgbW9kdWxlcwotICAgICAqLwotICAgIHByb3RlY3RlZCBJVmlydHVhbFJlZmVyZW5jZVtdIGdldFJlZmVyZW5jZXMoSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgewotICAgIAlpZiAoYUNvbXBvbmVudCA9PSBudWxsIHx8IGFDb21wb25lbnQuaXNCaW5hcnkoKSkgewotICAgIAkJcmV0dXJuIG5ldyBJVmlydHVhbFJlZmVyZW5jZVtdIHt9OwotICAgIAl9IGVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoYUNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKSB7Ci0gICAgCQlyZXR1cm4gZ2V0V2ViTGliTW9kdWxlcygoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpYUNvbXBvbmVudCk7Ci0gICAgCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGFDb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotICAgIAkJcmV0dXJuIHN1cGVyLmdldFJlZmVyZW5jZXMoYUNvbXBvbmVudCk7Ci0gICAgCX0gZWxzZSB7Ci0gICAgCQlyZXR1cm4gbmV3IElWaXJ0dWFsUmVmZXJlbmNlW10ge307Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGxpc3Qgb2YgZGVwZW5kZW50IG1vZHVsZXMgd2hpY2ggYXJlIHV0aWxpdHkgamFycyBpbiB0aGUgd2ViIGxpYgotCSAqIGZvbGRlciBvZiB0aGUgZGVwbG95ZWQgcGF0aCBvZiB0aGUgbW9kdWxlLiBJdCB3aWxsIG5vdCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFycmF5IG9mIHRoZSB3ZWIgbGlicmFyeSBkZXBlbmRlbnQgbW9kdWxlcwotCSAqLwotCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRXZWJMaWJNb2R1bGVzKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50IGNvbXApIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmQ29tcG9uZW50cyA9IGNvbXAuZ2V0Tm9uTWFuaWZlc3RSZWZlcmVuY2VzKCk7Ci0JCS8vIENoZWNrIHRoZSBkZXBsb3llZCBwYXRoIHRvIG1ha2Ugc3VyZSBpdCBoYXMgYSBsaWIgcGFyZW50IGZvbGRlciBhbmQgbWF0Y2hzIHRoZSB3ZWIueG1sCi0JCS8vIGJhc2UgcGF0aAotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZkNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyZWZDb21wb25lbnRzW2ldLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKFdFQkxJQikpCi0JCQkJcmVzdWx0LmFkZChyZWZDb21wb25lbnRzW2ldKTsKLQkJfQotCQlyZXR1cm4gKElWaXJ0dWFsUmVmZXJlbmNlW10pIHJlc3VsdC50b0FycmF5KG5ldyBJVmlydHVhbFJlZmVyZW5jZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRDbGFzc3BhdGhMaWJEZXBlbmRlbmNpZXMoZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCWlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBjcFJlZnMgPSAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KWNvbXBvbmVudCkuZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKTsKLQkJCWZpbmFsIFNldCBhYnNvbHV0ZVBhdGhzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3BSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2UgY3BSZWYgPSBjcFJlZnNbaV07Ci0JCQkJSVBhdGggY3BSZWZSdW50aW1lUGF0aCA9IGNwUmVmLmdldFJ1bnRpbWVQYXRoKCk7Ci0JCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IGNwUmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQotCQkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50IGluc3RhbmNlb2YgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQpIHsKLQkJCQkJLy8gd2FudCB0byBhdm9pZCBhZGRpbmcgZHVwcwotCQkJCQlDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCBjcENvbXAgPSAoQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQpIHJlZmVyZW5jZWRDb21wb25lbnQ7Ci0JCQkJCS8vIGRvbid0IHdhbnQgdG8gcHJvY2VzcyBjbGFzcyBmb2xkZXIgcmVmcyBoZXJlCi0JCQkJCWlmIChjcENvbXAuaXNDbGFzc0ZvbGRlcigpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQkKLQkJCQkJaWYgKGNwUmVmUnVudGltZVBhdGguZXF1YWxzKElDbGFzc3BhdGhEZXBlbmRlbmN5Q29uc3RhbnRzLlJVTlRJTUVfTUFQUElOR19JTlRPX0NPTlRBSU5FUl9QQVRIKSkgCi0JCQkJCQljb250aW51ZTsKLQotCQkJCQlmaW5hbCBJUGF0aCBhYnNvbHV0ZVBhdGggPSBDbGFzc3BhdGhEZXBlbmRlbmN5VXRpbC5nZXRDbGFzc3BhdGhWaXJ0dWFsUmVmZXJlbmNlTG9jYXRpb24oY3BSZWYpOwotCQkJCQlpZiAoYWJzb2x1dGVQYXRocy5jb250YWlucyhhYnNvbHV0ZVBhdGgpKSB7Ci0JCQkJCQkvLyBoYXZlIGFscmVhZHkgYWRkZWQgYSBtZW1iZXIgZm9yIHRoaXMgYXJjaGl2ZQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhZGRVdGlsTWVtYmVyKGNvbXBvbmVudCwgY3BSZWYsIGNwUmVmUnVudGltZVBhdGgpOwotCQkJCQkJYWJzb2x1dGVQYXRocy5hZGQoYWJzb2x1dGVQYXRoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIEFkZCBhbnkgY2xhc3NwYXRoIGNvbXBvbmVudCBkZXBlbmRlbmNpZXMgZnJvbSB0aGlzIGNvbXBvbmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRSZWZlcmVuY2VkQ29tcG9uZW50Q2xhc3NwYXRoRGVwZW5kZW5jaWVzKGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgZmluYWwgYm9vbGVhbiB3ZWIpIHsKLQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJZmluYWwgU2V0IGFic29sdXRlUGF0aHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IHJlZnNbaV07Ci0JCQlmaW5hbCBJUGF0aCBydW50aW1lUGF0aCA9IHJlZmVyZW5jZS5nZXRSdW50aW1lUGF0aCgpOwotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IHJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkKLQkJCS8vIGlmIHdlIGFyZSBhZGRpbmcgdG8gYSB3ZWIgcHJvamVjdCwgb25seSBwcm9jZXNzIHJlZmVyZW5jZXMgd2l0aCB0aGUgL1dFQi1JTkYvbGliIHJ1bnRpbWUgcGF0aAotCQkJaWYgKHdlYiAmJiAhcnVudGltZVBhdGguZXF1YWxzKFdFQkxJQikpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gaWYgdGhlIHJlZmVyZW5jZSBjYW5ub3QgZXhwb3J0IGRlcGVuZGVuY2llcywgc2tpcAotCQkJaWYgKCFjYW5FeHBvcnRDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmNpZXMocmVmZXJlbmNlZENvbXBvbmVudCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYgKCFyZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCkgJiYgcmVmZXJlbmNlZENvbXBvbmVudCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBjcFJlZnMgPSAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSByZWZlcmVuY2VkQ29tcG9uZW50KS5nZXRKYXZhQ2xhc3NwYXRoUmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3BSZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIGNwUmVmID0gY3BSZWZzW2pdOwotCQkJCQlJUGF0aCBjcFJlZlJ1bnRpbWVQYXRoID0gY3BSZWYuZ2V0UnVudGltZVBhdGgoKTsKLQotCQkJCQlpZiAoY3BSZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpIGluc3RhbmNlb2YgQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQpIHsKLQkJCQkJCS8vIHdhbnQgdG8gYXZvaWQgYWRkaW5nIGR1cHMKLQkJCQkJCUNsYXNzcGF0aERlcGVuZGVuY3lWaXJ0dWFsQ29tcG9uZW50IGNwQ29tcCA9IChDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCkgY3BSZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCQkJLy8gZG9uJ3Qgd2FudCB0byBwcm9jZXNzIGNsYXNzIGZvbGRlciByZWZzIGhlcmUKLQkJCQkJCWlmIChjcENvbXAuaXNDbGFzc0ZvbGRlcigpKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQkvL2lmIHBhdGggaXNuJ3QgLi4vLCBpdCBzaG91bGRuJ3QgYmUgYWRkZWQgaGVyZSBbYnVnIDI0NzA5MF0KLQkJCQkJCWlmICghY3BSZWZSdW50aW1lUGF0aC5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSX1BBVEgpKSAKLQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkJLy8gcnVudGltZSBwYXRoIHdpdGhpbiBkZXBsb3llZCBhcHAgd2lsbCBiZSBydW50aW1lIHBhdGggb2YgcGFyZW50IGNvbXBvbmVudAotCQkJCQkJY3BSZWZSdW50aW1lUGF0aCA9IHJ1bnRpbWVQYXRoOwotCQkJCQkJCQkJCQkJCi0KLQkJCQkJCWZpbmFsIElQYXRoIGFic29sdXRlUGF0aCA9IENsYXNzcGF0aERlcGVuZGVuY3lVdGlsLmdldENsYXNzcGF0aFZpcnR1YWxSZWZlcmVuY2VMb2NhdGlvbihjcFJlZik7Ci0JCQkJCQlpZiAoYWJzb2x1dGVQYXRocy5jb250YWlucyhhYnNvbHV0ZVBhdGgpKSB7Ci0JCQkJCQkJLy8gaGF2ZSBhbHJlYWR5IGFkZGVkIGEgbWVtYmVyIGZvciB0aGlzIGFyY2hpdmUKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYWRkVXRpbE1lbWJlcihjb21wb25lbnQsIGNwUmVmLCBjcFJlZlJ1bnRpbWVQYXRoKTsKLQkJCQkJCQlhYnNvbHV0ZVBhdGhzLmFkZChhYnNvbHV0ZVBhdGgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjYW5FeHBvcnRDbGFzc3BhdGhDb21wb25lbnREZXBlbmRlbmNpZXMoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBjb21wb25lbnQuZ2V0UHJvamVjdCgpOwotCQkvLyBjaGVjayBmb3IgdmFsaWQgcHJvamVjdCB0eXBlCi0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QocHJvamVjdCkgCi0JCQkJfHwgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KQotCQkJCXx8IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChwcm9qZWN0KQotICAgIAkJCXx8IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QocHJvamVjdCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNhdmVDbGFzc3BhdGhEZXBlbmRlbmN5VVJJcyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJaWYgKCFjb21wb25lbnQuaXNCaW5hcnkoKSAmJiBjb21wb25lbnQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCkgewotCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2VbXSBjcFJlZnMgPSAoKEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSBjb21wb25lbnQpLmdldEphdmFDbGFzc3BhdGhSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNwUmVmcy5sZW5ndGg7IGorKykgewotCQkJCWZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIGNwUmVmID0gY3BSZWZzW2pdOwotCQkJCS8vIGlmIHdlIGFyZSBhZGRpbmcgdG8gYW4gRUFSIHByb2plY3QsIG9ubHkgcHJvY2VzcyByZWZlcmVuY2VzIHdpdGggdGhlIHJvb3QgbWFwcGluZwotCQkJCWlmICghY3BSZWYuZ2V0UnVudGltZVBhdGgoKS5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09OVEFJTkVSX1BBVEgpKSB7Ci0JCQkJCS8vIGZhaWxzIHRoZSBydW50aW1lIHBhdGggdGVzdAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNwUmVmLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7Ci0JCQkJCWNsYXNzcGF0aENvbXBvbmVudERlcGVuZGVuY3lVUklzLmFkZChjcFJlZi5nZXRBcmNoaXZlTmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZENsYXNzRm9sZGVyRGVwZW5kZW5jaWVzKGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIWNvbXBvbmVudC5pc0JpbmFyeSgpICYmIGNvbXBvbmVudCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIGNwUmVmcyA9ICgoSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQpIGNvbXBvbmVudCkuZ2V0SmF2YUNsYXNzcGF0aFJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3BSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZmluYWwgSVZpcnR1YWxSZWZlcmVuY2UgY3BSZWYgPSBjcFJlZnNbaV07Ci0JCQkJZmluYWwgSVBhdGggcnVudGltZVBhdGggPSBjcFJlZi5nZXRSdW50aW1lUGF0aCgpOwotCQkJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBjcFJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJaWYgKGNvbXAgaW5zdGFuY2VvZiBDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCkgewotCQkJCQlmaW5hbCBDbGFzc3BhdGhEZXBlbmRlbmN5VmlydHVhbENvbXBvbmVudCBjcENvbXAgPSAoQ2xhc3NwYXRoRGVwZW5kZW5jeVZpcnR1YWxDb21wb25lbnQpIGNvbXA7Ci0JCQkJCWlmIChjcENvbXAuaXNDbGFzc0ZvbGRlcigpKSB7Ci0JCQkJCQlJUGF0aCB0YXJnZXRQYXRoID0gbnVsbDsKLQkJCQkJCWlmIChydW50aW1lUGF0aC5lcXVhbHMoSUNsYXNzcGF0aERlcGVuZGVuY3lDb25zdGFudHMuUlVOVElNRV9NQVBQSU5HX0lOVE9fQ09NUE9ORU5UX1BBVEgpKSB7Ci0JCQkJCQkJdGFyZ2V0UGF0aCA9IFBhdGguRU1QVFk7Ci0JCQkJCQl9IGVsc2UgaWYgKHJ1bnRpbWVQYXRoLmVxdWFscyhJQ2xhc3NwYXRoRGVwZW5kZW5jeUNvbnN0YW50cy5XRUJfSU5GX0NMQVNTRVNfUEFUSCkpIHsKLQkJCQkJCQl0YXJnZXRQYXRoID0gIFdFQl9DTEFTU0VTX1BBVEg7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJZmluYWwgSUNvbnRhaW5lciBjb250YWluZXIgPSBjcENvbXAuZ2V0Q2xhc3NGb2xkZXIoKTsKLQkJCQkJCWZpbmFsIElNb2R1bGVSZXNvdXJjZVtdIG1yID0gZ2V0TWVtYmVycyhjb250YWluZXIsIHRhcmdldFBhdGgsIHRhcmdldFBhdGgsIG5ldyBJQ29udGFpbmVyW117Y29udGFpbmVyfSk7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1yLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJbWVtYmVycy5hZGQobXJbal0pOwotCQkJCQkJfQkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotICAgCi0KLSAgIAotCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBtb2R1bGUgaGFzIGEgc2ltcGxlIHN0cnVjdHVyZSBiYXNlZCBvbiBhCi0JICogc2luZ2xlIHJvb3QgZm9sZGVyLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiA8cD4KLQkgKiBJbiBhIHNpbmdsZSByb290IHN0cnVjdHVyZSwgYWxsIGZpbGVzIHRoYXQgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHJvb3QgZm9sZGVyCi0JICogYXJlIHBhcnQgb2YgdGhlIG1vZHVsZSwgYW5kIGFyZSBhbHJlYWR5IGluIHRoZSBjb3JyZWN0IG1vZHVsZSBzdHJ1Y3R1cmUuIE5vCi0JICogbW9kdWxlIHJlc291cmNlcyBleGlzdCBvdXRzaWRlIG9mIHRoaXMgc2luZ2xlIGZvbGRlci4KLQkgKiAKLQkgKiBGb3IgSjJFRSwgdGhpcyBtZXRob2Qgd2lsbCBjaGVjayBpZiB0aGUgcHJvamVjdCBpcyBhbHJlYWR5IGluIEoyRUUgc3BlYyBzdGFuZGFyZCBvdXRwdXQgZm9ybS4gIAotCSAqIFRoZSBwcm9qZWN0IG11c3QgZm9sbG93IGNlcnRhaW4gcnVsZXMsIGJ1dCBpbiBnZW5lcmFsLCB0aGUgcHJvamVjdCdzIGNvbnRlbnQgcm9vdHMgbXVzdCBiZSBzb3VyY2UgZm9sZGVycwotCSAqIGFuZCB0aGUgb3V0cHV0IGZvbGRlciBtdXN0IGFsc28gYmUgdGhlIHRoZSBjb250ZW50IHJvb3QgZm9sZGVyLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgbW9kdWxlIGhhcyBhIHNpbmdsZSByb290IHN0cnVjdHVyZSwgYW5kCi0JICogICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xlUm9vdFN0cnVjdHVyZSgpIHsKLQkJYm9vbGVhbiBpc1NpbmdsZVJvb3QgPSBnZXRTaW5nbGVVdGlsKCkuaXNTaW5nbGVSb290KCk7Ci0JCWlzU2luZ2xlSmF2YU91dHB1dE5vblNvdXJjZSA9IGdldFNpbmdsZVV0aWwoKS5pc1NpbmdsZUphdmFPdXRwdXROb25Tb3VyY2UoKTsKLQkJcmV0dXJuIGlzU2luZ2xlUm9vdDsKLQl9Ci0JCi0JcHJpdmF0ZSBTaW5nbGVSb290VXRpbCBnZXRTaW5nbGVVdGlsKCkgewotCQlpZiAoc2luZ2xlVXRpbCA9PSBudWxsKSB7Ci0JCQlzaW5nbGVVdGlsID0gbmV3IFNpbmdsZVJvb3RVdGlsKGNvbXBvbmVudCk7Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZVV0aWw7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBhZGRlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gSXQgY2FuIE9OTFkgYmUgY2FsbGVkIHdoZW4gdGhlIHByb2plY3QgaXMgc2luZ2xlIHJvb3QuCi0JICogQHNlZSBpc1NpbmdsZVJvb3RTdHJ1Y3R1cmUoKS4gIElmIHRoZSBwcm9qZWN0IGhhcyBhbiBvdXRwdXQgZm9sZGVyIHRoYXQgaXMgYWxzbyBhIHNvdXJjZSBmb2xkZXIgdGhlbiwKLQkgKiBpdCBhc3N1bWVzIHRoZSB2aXJ0dWFsIGNvbXBvbmVudCBpcyBub3QgdXNpbmcgYW55IGZsZXhpYmxlIGZlYXR1cmVzIGFuZCBpcyBpbiBhIHN0YW5kYXJkIEoyRUUgZm9ybWF0Ci0JICogd2l0aCBvbmUgY29tcG9uZW50IHJvb3QgZm9sZGVyIGFuZCBhbiBvdXRwdXQgZm9sZGVyIHRoZSBzYW1lIGFzIGl0cyBjb250ZW50IGZvbGRlci4gIFRoaXMgd2lsbCBieXBhc3MgCi0JICogdGhlIHZpcnR1YWwgY29tcG9uZW50IEFQSSBhbmQganVzdCByZXR1cm4gdGhlIG1vZHVsZSByZXNvdXJjZXMgYXMgdGhleSBhcmUgb24gZGlzay4KLQkgKiAKLQkgKiBAcmV0dXJuIGFycmF5IG9mIE1vZHVsZVJlc291cmNlcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgSU1vZHVsZVJlc291cmNlW10gZ2V0T3B0aW1pemVkTWVtYmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlpZiAoaXNTaW5nbGVKYXZhT3V0cHV0Tm9uU291cmNlICkgewotCQkJCS8vIFdlIGRldGVybWluZWQgd2hlbiB0ZXN0aW5nIGZvciBhIHNpbmdsZSByb290IHN0cnVjdHVyZSB0aGF0IHRoaXMgcHJvamVjdCBoYXMKLQkJCQkvLyBvbmUgb3V0cHV0IGZvbGRlciBhbmQgdGhhdCBvdXRwdXQgZm9sZGVyIGlzIG5vdCBhIHNvdXJjZSBmb2xkZXIuIFNpbmNlIHRoZQotCQkJCS8vIG91dHB1dCBmb2xkZXIgKGZvciBleGFtcGxlLCBjbGFzc2VzIG9yIGJpbikgaXMgbm90IGEgc291cmNlIGZvbGRlciwgSkRUIGNvcGllcyBhbGwgZmlsZXMKLQkJCQkvLyAoaW5jbHVkaW5nIG5vbiBKYXZhIGZpbGVzKSB0byB0aGlzIGZvbGRlciwgc28gZXZlcnkgcmVzb3VyY2UgbmVlZGVkIGF0IHJ1bnRpbWUgaXMgbG9jYXRlZCAKLQkJCQkvLyBpbiB0aGF0IHNpbmdsZSBvdXRwdXQgZGlyZWN0b3J5LgotCQkJCXJldHVybiBnZXRNb2R1bGVSZXNvdXJjZXMoUGF0aC5FTVBUWSwgZ2V0SmF2YU91dHB1dEZvbGRlcnMoKVswXSk7Ci0JCQl9Ci0JCQkvLyBGb3IgSjJFRSBtb2R1bGVzLCB3ZSB1c2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250ZW50IHJvb3QKLQkJCWVsc2UgewotCQkJCUlWaXJ0dWFsRm9sZGVyIHZGb2xkZXIgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQkJCXJldHVybiBnZXRNb2R1bGVSZXNvdXJjZXMoUGF0aC5FTVBUWSwgdkZvbGRlci5nZXRVbmRlcmx5aW5nRm9sZGVyKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgSU1vZHVsZVJlc291cmNlW10ge307Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGZyb20gY2FjaGUgb3IgYWRkIHRvIGNhY2hlIHdoZXRoZXIgb3Igbm90IGFuIG91dHB1dCBjb250YWluZXIKLQkgKiBpcyBtYXBwZWQgaW4gdGhlIHZpcnR1YWwgY29tcG9uZW50LgotCSAqIAotCSAqIEBwYXJhbSBvdXRwdXRDb250YWluZXIKLQkgKiBAcmV0dXJuIGlmIG91dHB1dCBjb250YWluZXIgaXMgbWFwcGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzT3V0cHV0Q29udGFpbmVyTWFwcGVkKElDb250YWluZXIgb3V0cHV0Q29udGFpbmVyKSB7Ci0JCWlmIChvdXRwdXRDb250YWluZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCUhhc2hNYXAgb3V0cHV0TWFwcyA9IGdldENhY2hlZE91dHB1dE1hcHBpbmdzKCk7Ci0JCUJvb2xlYW4gcmVzdWx0ID0gKEJvb2xlYW4pIG91dHB1dE1hcHMuZ2V0KG91dHB1dENvbnRhaW5lcik7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJLy8gSWYgdGhlcmUgYXJlIGFueSBjb21wb25lbnQgcmVzb3VyY2VzIGZvciB0aGUgY29udGFpbmVyLCB3ZSBrbm93IGl0IGlzIG1hcHBlZAotCQkJaWYgKENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKG91dHB1dENvbnRhaW5lcikubGVuZ3RoID4gMCkKLQkJCQlyZXN1bHQgPSBCb29sZWFuLlRSVUU7CQotCQkJLy8gT3RoZXJ3aXNlIGl0IGlzIG5vdCBtYXBwZWQKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPSBCb29sZWFuLkZBTFNFOwotCQkJLy8gQ2FjaGUgdGhlIHJlc3VsdCBpbiB0aGUgbWFwIGZvciB0aGlzIG91dHB1dCBjb250YWluZXIKLQkJCW91dHB1dE1hcHMucHV0KG91dHB1dENvbnRhaW5lciwgcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBMYXp5IGluaXRpYWxpemUgdGhlIGNhY2hlZCBvdXRwdXQgbWFwcGluZ3MKLQkgKiBAcmV0dXJuIEhhc2hNYXAKLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0Q2FjaGVkT3V0cHV0TWFwcGluZ3MoKSB7Ci0JCWlmIChjYWNoZWRPdXRwdXRNYXBwaW5ncz09bnVsbCkKLQkJCWNhY2hlZE91dHB1dE1hcHBpbmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGNhY2hlZE91dHB1dE1hcHBpbmdzOwotCX0KLQkKLQkvKioKLQkgKiBMYXp5IGluaXRpYWxpemUgdGhlIGNhY2hlZCBzb3VyY2UgLSBvdXRwdXQgcGFpcmluZ3MKLQkgKiBAcmV0dXJuIEhhc2hNYXAKLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0Q2FjaGVkU291cmNlT3V0cHV0UGFpcnMoKSB7Ci0JCWlmIChjYWNoZWRTb3VyY2VPdXRwdXRQYWlycz09bnVsbCkKLQkJCWNhY2hlZFNvdXJjZU91dHB1dFBhaXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGNhY2hlZFNvdXJjZU91dHB1dFBhaXJzOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGZpbGUgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBtZW1iZXJzIGxpc3QgZnJvbSB0aGUgdmlydHVhbCBjb21wb25lbnQgbWFwcyBvbmx5IGlmOgotCSAqIGEpIGl0IGlzIG5vdCBpbiBhIHNvdXJjZSBmb2xkZXIKLQkgKiBiKSBpdCBpcyBpbiBhIHNvdXJjZSBmb2xkZXIsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgZm9sZGVyIGlzIGEgbWFwcGVkIGNvbXBvbmVudCByZXNvdXJjZQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiBzaG91bGQgZmlsZSBiZSBhZGRlZCB0byBtZW1iZXJzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkQWRkQ29tcG9uZW50RmlsZShJRmlsZSBmaWxlKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZUNvbnRhaW5lciA9IGdldFNvdXJjZUNvbnRhaW5lcihmaWxlKTsKLQkJLy8gSWYgdGhlIGZpbGUgaXMgbm90IGluIGEgc291cmNlIGNvbnRhaW5lciwgcmV0dXJuIHRydWUKLQkJaWYgKHNvdXJjZUNvbnRhaW5lcj09bnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCS8vIEVsc2UgaWYgaXQgaXMgYSBzb3VyY2UgY29udGFpbmVyIGFuZCB0aGUgb3V0cHV0IGNvbnRhaW5lciBpcyBtYXBwZWQgaW4gdGhlIGNvbXBvbmVudCwgcmV0dXJuIHRydWUKLQkJLy8gT3RoZXJ3aXNlLCByZXR1cm4gZmFsc2UuCi0JCX0gZWxzZSB7Ci0JCQlJQ29udGFpbmVyIG91dHB1dENvbnRhaW5lciA9IGdldE91dHB1dENvbnRhaW5lcihzb3VyY2VDb250YWluZXIpOwotCQkJcmV0dXJuIG91dHB1dENvbnRhaW5lciE9bnVsbCAmJiBpc091dHB1dENvbnRhaW5lck1hcHBlZChvdXRwdXRDb250YWluZXIpOwkJCi0JCX0KLQl9CiB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0lKMkVFTW9kdWxlQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0lKMkVFTW9kdWxlQ29uc3RhbnRzLmphdmEKaW5kZXggODA5OWYzZi4uMjhhMGE5NiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9JSjJFRU1vZHVsZUNvbnN0YW50cy5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSUoyRUVNb2R1bGVDb25zdGFudHMuamF2YQpAQCAtMjksOCArMjksNCBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTVF9XRUJfVEVNUExBVEUgPSAidGVtcGxhdGUuanN0LndlYiI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU1RfV0VCX1RFTVBMQVRFID0gInRlbXBsYXRlLndzdC53ZWIiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNUX0NPTVBPTkVOVF9GSUxFID0gIm9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50IjsvLyROT04tTkxTLTEkCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfTFRLX1JFRkFDVE9SSU5HID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnVzZWx0a3JlZmFjdG9yaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRV9TVFJJTkcgPSAidHJ1ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFX1NUUklORyA9ICJmYWxzZSI7Ly8kTk9OLU5MUy0xJAogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVQbHVnaW4uamF2YQppbmRleCA1OTQ5NjViLi43NWFiZmFkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVQbHVnaW4uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVQbHVnaW4uamF2YQpAQCAtMzksNiArMzksNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwpAQCAtNTIsNyArNTMsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLlVJQ29udGV4dERldGVybWluYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKQEAgLTI4MiwxOCArMjgyLDI3IEBACiAJICovCiAJcHVibGljIHN0YXRpYyBVUkwgZ2V0SW1hZ2VVUkwoU3RyaW5nIGtleSwgQnVuZGxlIGJ1bmRsZSkgewogCQlTdHJpbmcgZ2lmID0gIi8iICsga2V5ICsgIi5naWYiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSVBhdGggcGF0aCA9IG51bGw7CisJCVN0cmluZyBwbmcgPSAiLyIgKyBrZXkgKyAiLnBuZyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlJUGF0aCBnaWZQYXRoLCBwbmdQYXRoICA9IG51bGw7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgSUNPTl9ESVJTLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXRoID0gbmV3IFBhdGgoSUNPTl9ESVJTW2ldKS5hcHBlbmQoZ2lmKTsKLQkJCWlmIChQbGF0Zm9ybS5maW5kKGJ1bmRsZSxwYXRoKSA9PSBudWxsKQorCQkJZ2lmUGF0aCA9IG5ldyBQYXRoKElDT05fRElSU1tpXSkuYXBwZW5kKGdpZik7CisJCQlwbmdQYXRoID0gbmV3IFBhdGgoSUNPTl9ESVJTW2ldKS5hcHBlbmQocG5nKTsKKwkJCWlmIChQbGF0Zm9ybS5maW5kKGJ1bmRsZSxwbmdQYXRoKSAhPSBudWxsKXsKKwkJCQl0cnkgeworCQkJCQlyZXR1cm4gbmV3IFVSTCggYnVuZGxlLmdldEVudHJ5KCIvIiksIHBuZ1BhdGgudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgCisJCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGV4Y2VwdGlvbik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0JCisJCQl9IGVsc2UgaWYgKFBsYXRmb3JtLmZpbmQoYnVuZGxlLGdpZlBhdGgpICE9IG51bGwpeworCQkJCXRyeSB7CisJCQkJCXJldHVybiBuZXcgVVJMKCBidW5kbGUuZ2V0RW50cnkoIi8iKSwgZ2lmUGF0aC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAKKwkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQkJCW9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nV2FybmluZyhKMkVFUGx1Z2luUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTG9hZF9JbWFnZV9FcnJvcl8iLCBuZXcgT2JqZWN0W117a2V5fSkpOyAvLyROT04tTkxTLTEkCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX1lbHNlIAogCQkJCWNvbnRpbnVlOwotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IFVSTCggYnVuZGxlLmdldEVudHJ5KCIvIiksIHBhdGgudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlci5nZXRMb2dnZXIoKS5sb2dXYXJuaW5nKEoyRUVQbHVnaW5SZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJMb2FkX0ltYWdlX0Vycm9yXyIsIG5ldyBPYmplY3RbXXtrZXl9KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJY29udGludWU7Ci0JCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQpAQCAtMzg4LDExICszOTcsMTIgQEAKIAkJCQlTdHJpbmcgaW5zdGFsbFN0ciA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChpbnN0YWxsUGF0aC50b1N0cmluZygpKSkuZ2V0RmlsZSgpOwogCQkJCXJldHVybiBuZXcgUGF0aChpbnN0YWxsU3RyKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX07CisJCQl9CiAJCX0KIAkJcmV0dXJuIG51bGw7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQbHVnaW5QcmVmZXJlbmNlcygpIHsKIAkJZ2V0SjJFRVByZWZlcmVuY2VzKCkuaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpOwogCX0KQEAgLTQ1MSw3ICs0NjEsNiBAQAogCQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKGdldEJ1bmRsZSgpLCBrZXkpOwogCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXgpIHsKIAkJCS8vVE9ETyBEb24ndCB0aHJvdyBlcnJvciAtIGp1c3Qgc2hvdyB1bnJlc29sdmVkIGtleQotCQkJLy9Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwogCQkJcmV0dXJuICchJyArIGtleSArICchJzsKIAkJfQogCX0KQEAgLTQ5OSw2ICs1MDgsNyBAQAogCX0KIAogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3VwZXIuc3RhcnQoY29udGV4dCk7CiAJCQkJCkBAIC01MDcsOSArNTE3LDYgQEAKIAkJLy9IYXZlIHRvIGRvIHRoZSBuZXh0IGxpbmUgaW1tZWRpYXRlbHkgdG8gZml4IHRpbWluZyBwcm9ibGVtcyB3aXRoIGZhY3RvcnkgcmVnaXN0cmF0aW9uCiAJCUFyY2hpdmVJbml0LmluaXQoZmFsc2UpOwogCQkJCi0JCS8vTW9kdWxlTWFwcyBhcmUgdGhlIG1hcHMgZnJvbSBtb2R1bGVzIGluIGFuIGVhciBwcm9qZWN0IHRvIHRoZSBqMmVlIHByb2plY3RzIGZvciB0aGUKLQkJLy8gbW9kdWxlcwotCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lYXJjcmVhdGlvbi5tb2R1bGVtYXAuTW9kdWxlbWFwSW5pdC5pbml0KGZhbHNlKTsKIAkJZW5zdXJlRmFjdG9yeVJlZ2lzdHJhdGlvbigpOwogCQlWYWxpZGF0b3JNYW5hZ2VyLnNldFJlc291cmNlVXRpbENsYXNzKFJlc291cmNlVXRpbC5jbGFzcyk7CiAJCUlBZGFwdGVyTWFuYWdlciBtYW5hZ2VyID0gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKTsKQEAgLTUxOSwxNiArNTI2LDIwIEBACiAJCQogCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JpbmdMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBQcm9qZWN0UmVmYWN0b3JpbmdMaXN0ZW5lcigpOy8vUHJvamVjdERlcGVuZGVuY3lDYWNoZS5nZXRDYWNoZSgpKTsKIAkJLy8gcmVnaXN0ZXIgdGhlIHByb2plY3QgcmVuYW1lL2RlbGV0ZSByZWZhY3RvcmluZyBsaXN0ZW5lcgotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFKTsKKwkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIsCisJCQkJSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFICk7CisJCQogCQkvLyByZWdpc3RlciB0aGUgSUVsZW1lbnRDaGFuZ2VkTGlzdGVyIHRoYXQgdXBkYXRlcyB0aGUgLmNvbXBvbmVudCBmaWxlIGluIAogCQkvLyByZXNwb25zZSB0byAuY2xhc3NwYXRoIGNoYW5nZXMKIAkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcihuZXcgSjJFRUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoKSwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSk7CisJCQogCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihKMkVFQ29tcG9uZW50Q2xhc3NwYXRoVXBkYXRlci5nZXRJbnN0YW5jZSgpLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpOwogCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihKMkVFRGVwZW5kZW5jeUxpc3RlbmVyLklOU1RBTkNFLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUpOwogCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihDbGVhbkJ1aWxkQ2FjaGVDbGVhbmVyTGlzdGVuZXIuSU5TVEFOQ0UsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCk7CiAJCUlEZXBlbmRlbmN5R3JhcGguSU5TVEFOQ0UuYWRkTGlzdGVuZXIoSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKSk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3VwZXIuc3RvcChjb250ZXh0KTsKIAkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXIuZ2V0SW5zdGFuY2UoKSk7CkBAIC01MzcsOSArNTQ4LDkgQEAKIAkJCW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuam9pbiggSjJFRUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIuUFJPSkVDVF9DT01QT05FTlRfVVBEQVRFX0pPQl9GQU1JTFksCiAJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkgKTsKIAkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUuZ2V0TWVzc2FnZSgpKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwogCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCkpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlLmdldE1lc3NhZ2UoKSk7CiAJCX0JCQogCX0KIApAQCAtNTkxLDYgKzYwMiw3IEBACiAJCX07CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFN0cmluZyBnZXRQbHVnaW5JRCgpIHsKIAkJcmV0dXJuIFBMVUdJTl9JRDsKIAl9CkBAIC02OTIsNiArNzA0LDIzIEBACiAKIAlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKIAkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGV4Y2VwdGlvbi5nZXRTdGF0dXMoKSApOworCX0KKworCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSkgeworCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UpKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCU11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQTFVHSU5fSUQsSVN0YXR1cy5FUlJPUixuZXcgSVN0YXR1c1tde2V4Y2VwdGlvbi5nZXRTdGF0dXMoKX0sbWVzc2FnZSxleGNlcHRpb24pOworCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggc3RhdHVzICk7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKKwkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coY3JlYXRlU3RhdHVzKElTdGF0dXMuV0FSTklORywgbWVzc2FnZSkpOwogCX0gCiAKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVByZWZlcmVuY2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0oyRUVQcmVmZXJlbmNlcy5qYXZhCmluZGV4IGMzZmE2MTguLmRlYTNjMjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vSjJFRVByZWZlcmVuY2VzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KMkVFUHJlZmVyZW5jZXMuamF2YQpAQCAtMTgsMjcxICsxOCwxMDIgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MuQ29tbW9uRnJhbWV3b3Jrc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZXNTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LklQcm9kdWN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlByb2R1Y3RNYW5hZ2VyOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwogCiAKIC8qKgogICogQGF1dGhvciBtZGVsZGVyCisgKiBAZGVwcmVjYXRlZAogICovCisKIHB1YmxpYyBjbGFzcyBKMkVFUHJlZmVyZW5jZXMgewogCi0JcHVibGljIGludGVyZmFjZSBLZXlzIHsKLQkJCi0JCQotCQkvKioKLQkJICogQGRlcHJlY2F0ZWQsIHVzZSBDb21tb25GcmFtZXdvcmtzUGx1Z2luLkRFRkFVTFRfU09VUkNFX0ZPTERFUiBvciB1c2UKLQkJICogZ2V0SmF2YVNvdXJjZUZvbGRlck5hbWUoKQotCQkgKiBkbyBub3QgY2FsbCBKMkVFUGx1Z2luLmdldEoyRUVQcmVmZXJlbmNlcy5nZXRTdHJpbmcoSkFWQV9TT1VSQ0UpCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9TT1VSQ0UgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZS5qYXZhU291cmNlTmFtZSI7IC8vJE5PTi1OTFMtMSQKKwkKKwlwdWJsaWMgaW50ZXJmYWNlIEtleXMgZXh0ZW5kcyBKYXZhRUVQcmVmZXJlbmNlc0luaXRpYWxpemVyLktleXN7fQogCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1RBUkdFVF9TVVBQT1JUID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnByZWZlcmVuY2Uuc2VydmVydGFyZ2V0c3VwcG9ydCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRUpCX0NMSUVOVF9KQVIgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZS5jcmVhdGVDbGllbnRKYXIiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9WRVJTSU9OID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByZWZlcmVuY2UuajJlZVZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0NMSUVOVF9KQVJfQ1BfQ09NUEFUSUJJTElUWSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcmVmZXJlbmNlLmNsaWVudGphci5jcC5jb21wYXRpYmlsaXR5IjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIElOQ1JFTUVOVEFMX0RFUExPWU1FTlRfU1VQUE9SVCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcmVmZXJlbmNlLmluY3JlbWVudGFsRGVwbG95bWVudCI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFX0VBUl9MSUJSQVJJRVMgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZXMudXNlRUFSTGlicmFyaWVzIjsvLyROT04tTkxTLTEkCi0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFX1dFQl9BUFBfTElCUkFSSUVTID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnByZWZlcmVuY2VzLnVzZVdlYkFwcExpYnJhcmllcyI7Ly8kTk9OLU5MUy0xJAotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRV9FQVJfTElCUkFSSUVTX0pEVF9FWFBPUlQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZXMudXNlRUFSTGlicmFyaWVzSkRURXhwb3J0IjsvLyROT04tTkxTLTEkCi0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgQUxMT1dfQ0xBU1NQQVRIX0RFUCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcmVmZXJlbmNlcy5hbGxvd0NsYXNzcGF0aERlcCI7Ly8kTk9OLU5MUy0xJAorCXB1YmxpYyBpbnRlcmZhY2UgVmFsdWVzIGV4dGVuZHMgSmF2YUVFUHJlZmVyZW5jZXNJbml0aWFsaXplci5WYWx1ZXMge30KIAotCQkvKioKLQkJICogQGRlcHJlY2F0ZWQsIAotCQkgKiBidXQgc2hvdWxkIGl0IGJlIGRlcHJlY2F0ZWQgPyBpcyBqMmVlX3dlYl9jb250ZW50IGEgYmV0dGVyIG5hbWUgdGhhbiB3ZWJfY29udGVudF9mb2xkZXIgPwotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEoyRUVfV0VCX0NPTlRFTlQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZS5qMmVlV2ViQ29udGVudE5hbWUiOyAvLyROT04tTkxTLTEkCi0JCS8qKgotCQkgKiBAZGVwcmVjYXRlZCwgc3RhdGljIHdlYiBjb250ZW50IGlzIGdvdCBmcm9tIFByb2R1Y3RNYW5hZ2VyCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX1dFQl9DT05URU5UID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnByZWZlcmVuY2Uuc3RhdGljV2ViQ29udGVudE5hbWUiOyAvLyROT04tTkxTLTEkCi0JCS8qKgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0NPTlRFTlRfRk9MREVSID0gSVByb2R1Y3RDb25zdGFudHMuQVBQTElDQVRJT05fQ09OVEVOVF9GT0xERVI7Ci0JCS8qKgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9DT05URU5UX0ZPTERFUiA9IElQcm9kdWN0Q29uc3RhbnRzLldFQl9DT05URU5UX0ZPTERFUjsKLQkJLyoqCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0NPTlRFTlRfRk9MREVSID0gSVByb2R1Y3RDb25zdGFudHMuRUpCX0NPTlRFTlRfRk9MREVSOwotCQkvKioKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX0NPTlRFTlRfRk9MREVSID0gSVByb2R1Y3RDb25zdGFudHMuQVBQX0NMSUVOVF9DT05URU5UX0ZPTERFUjsKLQkJLyoqCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0NPTlRFTlRfRk9MREVSID0gSVByb2R1Y3RDb25zdGFudHMuSkNBX0NPTlRFTlRfRk9MREVSOwotCQkKLQkJLyoqCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1RPX0VBUl9CWV9ERUZBVUxUID0gSVByb2R1Y3RDb25zdGFudHMuQUREX1RPX0VBUl9CWV9ERUZBVUxUOwotCQkvKioKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9HRU5FUkFURV9ERCA9ICJhcHBsaWNhdGlvbl9nZW5lcmF0ZV9kZCI7IC8vJE5PTi1OTFMtMSQKLQkJLyoqCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRFlOQU1JQ19XRUJfR0VORVJBVEVfREQgPSAiZHluYW1pY193ZWJfZ2VuZXJhdGVfZGQiOyAvLyROT04tTkxTLTEkCi0JCS8qKgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9HRU5FUkFURV9ERCA9ICJlamJfZ2VuZXJhdGVfZGQiOyAvLyROT04tTkxTLTEkCi0JCS8qKgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfR0VORVJBVEVfREQgPSAiYXBwX2NsaWVudF9nZW5lcmF0ZV9kZCI7IC8vJE5PTi1OTFMtMSQKLQkJLyoqCi0JCSAqIEBzaW5jZSAzLjAKLQkJICovCi0JCXN0YXRpYyBTdHJpbmcgSURfUEVSU1BFQ1RJVkVfSElFUkFSQ0hZX1ZJRVcgPSAicGVyc3BlY3RpdmVfaGllcmFyY2h5X3ZpZXdfaWQiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKioKLQkJICogCi0JCSAqLwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERZTl9XRUJfU1JDX0ZPTERFUiA9ICJkeW5XZWJTb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERZTl9XRUJfT1VUUFVUX0ZPTERFUiA9IElQcm9kdWN0Q29uc3RhbnRzLkRZTl9XRUJfT1VUUFVUX0ZPTERFUjsKLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfT1VUUFVUX0ZPTERFUiA9IElQcm9kdWN0Q29uc3RhbnRzLkVKQl9PVVRQVVRfRk9MREVSOwotCQkKLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkgICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX09VVFBVVF9GT0xERVIgPSBJUHJvZHVjdENvbnN0YW50cy5BUFBfQ0xJRU5UX09VVFBVVF9GT0xERVI7Ci0JICAgIAotCQkvKioKLQkJICogCi0JCSAqLwotCSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9PVVRQVVRfRk9MREVSID0gSVByb2R1Y3RDb25zdGFudHMuSkNBX09VVFBVVF9GT0xERVI7IAkKKwlwdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRzIGV4dGVuZHMgSmF2YUVFUHJlZmVyZW5jZXNJbml0aWFsaXplci5EZWZhdWx0cyB7fQogCi0JfQotCi0JcHVibGljIGludGVyZmFjZSBWYWx1ZXMgewotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIEoyRUVfVkVSU0lPTl8xXzIgPSAiSjJFRV8xXzIiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgSjJFRV9WRVJTSU9OXzFfMyA9ICJKMkVFXzFfMyI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgc3RhdGljIFN0cmluZyBKMkVFX1ZFUlNJT05fMV80ID0gIkoyRUVfMV80IjsgLy8kTk9OLU5MUy0xJAotCi0JCS8qKgotCQkgKiBAZGVwcmVjYXRlZCwgc2VlIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSBpdCB1c2VzIFByb2R1Y3RNYW5hZ2VyCi0JCSAqLwotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIEoyRUVfV0VCX0NPTlRFTlQgPSBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5XRUJfQ09OVEVOVF9GT0xERVIpOwotCQkvKioKLQkJICogQGRlcHJlY2F0ZWQsIHNlZSBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgaXQgdXNlcyBQcm9kdWN0TWFuYWdlcgotCQkgKi8KLQkJZmluYWwgc3RhdGljIFN0cmluZyBTVEFUSUNfV0VCX0NPTlRFTlQgPSBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5XRUJfQ09OVEVOVF9GT0xERVIpOwotCQkvKioKLQkJICogQGRlcHJlY2F0ZWQsIHVzZSBDb21tb25GcmFtZXdvcmtzUGx1Z2luLkRFRkFVTFRfU09VUkNFX0ZPTERFUgotCQkgKi8KLQkJZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX1NPVVJDRSA9IENvbW1vbkZyYW1ld29ya3NQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkZyYW1ld29ya3NQbHVnaW4uREVGQVVMVF9TT1VSQ0VfRk9MREVSKTsKLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRzIHsKLQotCQkvKioKLQkJICogQGRlcHJlY2F0ZWQsIHNlZSBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgaXQgdXNlcyBQcm9kdWN0TWFuYWdlcgotCQkgKi8KLQkJZmluYWwgc3RhdGljIFN0cmluZyBKMkVFX1dFQl9DT05URU5UID0gVmFsdWVzLkoyRUVfV0VCX0NPTlRFTlQ7Ci0JCS8qKgotCQkgKiBAZGVwcmVjYXRlZCwgc2VlIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSBpdCB1c2VzIFByb2R1Y3RNYW5hZ2VyCi0JCSAqLwotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRJQ19XRUJfQ09OVEVOVCA9IFZhbHVlcy5TVEFUSUNfV0VCX0NPTlRFTlQ7Ci0JCS8qKgotCQkgKiBAZGVwcmVjYXRlZCwgc2VlIERFRkFVTFRfU09VUkNFX0ZPTERFUgotCQkgKi8KLQkJZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX1NPVVJDRSA9IFZhbHVlcy5KQVZBX1NPVVJDRTsKLQkJZmluYWwgc3RhdGljIFN0cmluZyBKMkVFX1ZFUlNJT04gPSBWYWx1ZXMuSjJFRV9WRVJTSU9OXzFfNDsKLQkJZmluYWwgc3RhdGljIGludCBKMkVFX1ZFUlNJT05fSUQgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJZmluYWwgc3RhdGljIGJvb2xlYW4gQ1JFQVRFX0VKQl9DTElFTlRfSkFSID0gZmFsc2U7Ci0JCWZpbmFsIHN0YXRpYyBib29sZWFuIEVKQl9DTElFTlRfSkFSX0NQX0NPTVBBVElCSUxJVFkgPSB0cnVlOwotCQlmaW5hbCBzdGF0aWMgYm9vbGVhbiBJTkNSRU1FTlRBTF9ERVBMT1lNRU5UX1NVUFBPUlQgPSB0cnVlOwotCQlmaW5hbCBzdGF0aWMgYm9vbGVhbiBVU0VfRUFSX0xJQlJBUklFU19KRFRfRVhQT1JUID0gZmFsc2U7Ci0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgSURfUEVSU1BFQ1RJVkVfSElFUkFSQ0hZX1ZJRVcgPSAib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgc3RhdGljIGJvb2xlYW4gQUxMT1dfQ0xBU1NQQVRIX0RFUCA9IHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBQbHVnaW4gb3duZXIgPSBudWxsOwotCXByaXZhdGUgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBudWxsOwogCXByaXZhdGUgYm9vbGVhbiBwZXJzaXN0T25DaGFuZ2UgPSBmYWxzZTsKIAogCXB1YmxpYyBKMkVFUHJlZmVyZW5jZXMoUGx1Z2luIG93bmVyKSB7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKIAl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCi0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkoyRUVfVkVSU0lPTiwgRGVmYXVsdHMuSjJFRV9WRVJTSU9OKTsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuQ1JFQVRFX0VKQl9DTElFTlRfSkFSLCBEZWZhdWx0cy5DUkVBVEVfRUpCX0NMSUVOVF9KQVIpOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5FSkJfQ0xJRU5UX0pBUl9DUF9DT01QQVRJQklMSVRZLCBEZWZhdWx0cy5FSkJfQ0xJRU5UX0pBUl9DUF9DT01QQVRJQklMSVRZKTsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuSU5DUkVNRU5UQUxfREVQTE9ZTUVOVF9TVVBQT1JULCBEZWZhdWx0cy5JTkNSRU1FTlRBTF9ERVBMT1lNRU5UX1NVUFBPUlQpOwotCQkKLQkJLy8gc2luY2UgMi4wCi0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkoyRUVfV0VCX0NPTlRFTlQsIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLldFQl9DT05URU5UX0ZPTERFUikpOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5TVEFUSUNfV0VCX0NPTlRFTlQsIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLldFQl9DT05URU5UX0ZPTERFUikpOwotCQkvLyBzaW5jZSAyLjAKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuSkFWQV9TT1VSQ0UsIEZhY2V0Q29yZVBsdWdpbi5nZXRKYXZhU3JjRm9sZGVyKCkpOwotCQkvLyBkb25lIGluIENvbW1vbkZyYW1ld29ya3NQcmVmLi5Jbml0aWFsaXplcgotCQkvL2dldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkRFRkFVTFRfU09VUkNFX0ZPTERFUiwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuREVGQVVMVF9TT1VSQ0VfRk9MREVSKSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkFQUExJQ0FUSU9OX0NPTlRFTlRfRk9MREVSLCBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5BUFBMSUNBVElPTl9DT05URU5UX0ZPTERFUikpOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5XRUJfQ09OVEVOVF9GT0xERVIsIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLldFQl9DT05URU5UX0ZPTERFUikpOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5BUFBfQ0xJRU5UX0NPTlRFTlRfRk9MREVSLCBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5BUFBfQ0xJRU5UX0NPTlRFTlRfRk9MREVSKSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkVKQl9DT05URU5UX0ZPTERFUiwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuRUpCX0NPTlRFTlRfRk9MREVSKSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkpDQV9DT05URU5UX0ZPTERFUiwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuSkNBX0NPTlRFTlRfRk9MREVSKSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkFERF9UT19FQVJfQllfREVGQVVMVCwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuQUREX1RPX0VBUl9CWV9ERUZBVUxUKSk7Ci0JCS8vIGRvbmUgaW4gQ29tbW9uRnJhbWV3b3Jrc1ByZWYuLkluaXRpYWxpemVyCi0JCS8vZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuT1VUUFVUX0ZPTERFUiwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuT1VUUFVUX0ZPTERFUikpOwotCQkKLQkJLy8gc2luY2UgMi4wLCBmb3IgamF2YSBlZSBwcm9qZWN0cwotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5BUFBMSUNBVElPTl9HRU5FUkFURV9ERCwgZmFsc2UpOwotCQkvLyBmb3IgZWU1IGplZSB3ZWIgcHJvamVjdHMgZGVmYXVsdCBpdCB0byB0cnVlIHNvIHRoYXQgd2UgY2FuIGNyZWF0ZSBzZXJ2bGV0cywgb3RoZXJ3aXNlIGZhbHNlCi0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkRZTkFNSUNfV0VCX0dFTkVSQVRFX0RELCB0cnVlKTsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuRUpCX0dFTkVSQVRFX0RELCBmYWxzZSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkFQUF9DTElFTlRfR0VORVJBVEVfREQsIGZhbHNlKTsJCi0JCQotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5VU0VfRUFSX0xJQlJBUklFUywgdHJ1ZSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLlVTRV9XRUJfQVBQX0xJQlJBUklFUywgdHJ1ZSk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLlVTRV9FQVJfTElCUkFSSUVTX0pEVF9FWFBPUlQsIERlZmF1bHRzLlVTRV9FQVJfTElCUkFSSUVTX0pEVF9FWFBPUlQpOwotCQlTdHJpbmcgcGVyc3BlY3RpdmVJRCA9IFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLklEX1BFUlNQRUNUSVZFX0hJRVJBUkNIWV9WSUVXKTsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuSURfUEVSU1BFQ1RJVkVfSElFUkFSQ0hZX1ZJRVcsIChwZXJzcGVjdGl2ZUlEICE9IG51bGwpID8gcGVyc3BlY3RpdmVJRCA6IERlZmF1bHRzLklEX1BFUlNQRUNUSVZFX0hJRVJBUkNIWV9WSUVXKTsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KEtleXMuQUxMT1dfQ0xBU1NQQVRIX0RFUCwgRGVmYXVsdHMuQUxMT1dfQ0xBU1NQQVRIX0RFUCk7Ci0JCQotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5EWU5fV0VCX1NSQ19GT0xERVIsIGdldER5bmFtaWNXZWJEZWZhdWx0U291cmNlRm9sZGVyKCkpOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5EWU5fV0VCX09VVFBVVF9GT0xERVIsIGdldER5bmFtaWNXZWJEZWZhdWx0T3VwdXRGb2xkZXJOYW1lKCkpOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldERlZmF1bHQoS2V5cy5BUFBfQ0xJRU5UX09VVFBVVF9GT0xERVIsICBnZXRBcHBDbGllbnREZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSgpICk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkVKQl9PVVRQVVRfRk9MREVSLCBnZXRFSkJEZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSgpICk7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChLZXlzLkpDQV9PVVRQVVRfRk9MREVSLCBnZXRKQ0FEZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSgpICk7Ci0JfQorLyoqCisgKiBAZGVwcmVjYXRlZAorICogU2VlIEphdmFFRVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcworICogd2hpY2ggd2lsbCBnZXQgY2FsbGVkIGxhemlseS4gTm8gbmVlZCB0byBleHBsaWNpdGx5IGNhbGwgdGhpcyBtZXRob2QgCisgKiBmb3IgaW5pdGlhbGl6YXRpb24gYW55bW9yZS4KKyAqLworCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7fQogCiAJCiAJcHVibGljIFN0cmluZyBnZXRTZXR0aW5nKFN0cmluZyBrZXkpewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoa2V5KTsKKwkJcmV0dXJuIGdldFN0cmluZyhrZXkpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCBzZXRTZXR0aW5nKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSl7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoa2V5LCB2YWx1ZSk7CisJCWdldEluc3RhbmNlUHJlZmVyZW5jZU5vZGUoSjJFRVBsdWdpbi5QTFVHSU5fSUQpLnB1dChrZXksIHZhbHVlKTsKIAkJZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCk7CiAJfQogCQogCXB1YmxpYyBib29sZWFuIGdldFVzZUVBUkxpYnJhcmllcygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihLZXlzLlVTRV9FQVJfTElCUkFSSUVTKTsKKwkJcmV0dXJuIGdldEJvb2xlYW4oS2V5cy5VU0VfRUFSX0xJQlJBUklFUyk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHNldFVzZUVBUkxpYnJhcmllcyhib29sZWFuIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5VU0VfRUFSX0xJQlJBUklFUywgdmFsdWUpOworCQlnZXRJbnN0YW5jZVByZWZlcmVuY2VOb2RlKEoyRUVQbHVnaW4uUExVR0lOX0lEKS5wdXRCb29sZWFuKEtleXMuVVNFX0VBUl9MSUJSQVJJRVMsIHZhbHVlKTsKIAkJZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCk7CiAJfQogCQogCXB1YmxpYyBib29sZWFuIGdldFVzZUVBUkxpYnJhcmllc0pEVEV4cG9ydCgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihLZXlzLlVTRV9FQVJfTElCUkFSSUVTX0pEVF9FWFBPUlQpOworCQlyZXR1cm4gZ2V0Qm9vbGVhbihLZXlzLlVTRV9FQVJfTElCUkFSSUVTX0pEVF9FWFBPUlQpOwogCX0KIAkKIAlwdWJsaWMgdm9pZCBzZXRVc2VFQVJMaWJyYXJpZXNKRFRFeHBvcnQoYm9vbGVhbiB2YWx1ZSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKEtleXMuVVNFX0VBUl9MSUJSQVJJRVNfSkRUX0VYUE9SVCwgdmFsdWUpOworCQlnZXRJbnN0YW5jZVByZWZlcmVuY2VOb2RlKEoyRUVQbHVnaW4uUExVR0lOX0lEKS5wdXRCb29sZWFuKEtleXMuVVNFX0VBUl9MSUJSQVJJRVNfSkRUX0VYUE9SVCwgdmFsdWUpOwogCQlmaXJlUHJlZmVyZW5jZUNoYW5nZWQoKTsKIAl9CiAJCiAJcHVibGljIGJvb2xlYW4gZ2V0VXNlV2ViTGliYXJpZXMoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oS2V5cy5VU0VfV0VCX0FQUF9MSUJSQVJJRVMpOworCQlyZXR1cm4gZ2V0Qm9vbGVhbihLZXlzLlVTRV9XRUJfQVBQX0xJQlJBUklFUyk7CiAJfQogCQogCXB1YmxpYyB2b2lkIHNldFVzZVdlYkxpYnJhcmllcyhib29sZWFuIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5VU0VfV0VCX0FQUF9MSUJSQVJJRVMsIHZhbHVlKTsKKwkJZ2V0SW5zdGFuY2VQcmVmZXJlbmNlTm9kZShKMkVFUGx1Z2luLlBMVUdJTl9JRCkucHV0Qm9vbGVhbihLZXlzLlVTRV9XRUJfQVBQX0xJQlJBUklFUywgdmFsdWUpOwogCQlmaXJlUHJlZmVyZW5jZUNoYW5nZWQoKTsKIAl9CiAJCisJLyoqCisJICogQHJldHVybgorCSAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UuIFRoZSBBTExPV19DTEFTU1BBVEhfREVQIHByZWZlcmVuY2UgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgaXRzIGFiaWxpdHkgdG8gZGlzYWJsZSBkeW5hbWljIG1hbmlmZXN0IHVwZGF0ZXMgd2lsbCBzb29uIGJlIHJlbW92ZWQuCisJICovCiAJcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dDbGFzc3BhdGhEZXAoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oS2V5cy5BTExPV19DTEFTU1BBVEhfREVQKTsKKwkJcmV0dXJuIGdldEJvb2xlYW4oS2V5cy5BTExPV19DTEFTU1BBVEhfREVQKTsKIAl9CiAJCisJLyoqCisJICogQHBhcmFtIHZhbHVlCisJICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZS4gVGhlIEFMTE9XX0NMQVNTUEFUSF9ERVAgcHJlZmVyZW5jZSBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCBpdHMgYWJpbGl0eSB0byBkaXNhYmxlIGR5bmFtaWMgbWFuaWZlc3QgdXBkYXRlcyB3aWxsIHNvb24gYmUgcmVtb3ZlZC4KKwkgKi8KIAlwdWJsaWMgdm9pZCBzZXRBbGxvd0NsYXNzcGF0aERlcChib29sZWFuIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5BTExPV19DTEFTU1BBVEhfREVQLCB2YWx1ZSk7CisJCWdldEluc3RhbmNlUHJlZmVyZW5jZU5vZGUoSjJFRVBsdWdpbi5QTFVHSU5fSUQpLnB1dEJvb2xlYW4oS2V5cy5BTExPV19DTEFTU1BBVEhfREVQLCB2YWx1ZSk7CiAJCWZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpOwogCX0KIAkKKwlwdWJsaWMgSUVjbGlwc2VQcmVmZXJlbmNlcyBnZXRJbnN0YW5jZVByZWZlcmVuY2VOb2RlKFN0cmluZyBxdWFsaWZpZXIpeworCQlyZXR1cm4gbmV3IEluc3RhbmNlU2NvcGUoKS5nZXROb2RlKEoyRUVQbHVnaW4uUExVR0lOX0lEKTsgCisJfQorCQogCXB1YmxpYyBTdHJpbmcgZ2V0SjJFRVdlYkNvbnRlbnRGb2xkZXJOYW1lKCkgewotCQkvL3JldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldFN0cmluZyhLZXlzLkoyRUVfV0VCX0NPTlRFTlQpOwotCQkvL2J1dCBzaG91bGQgaXQgYmUgZGVwcmVjYXRlZCA/IGlzIGoyZWVfd2ViX2NvbnRlbnQgYSBiZXR0ZXIgbmFtZSB0aGFuIHdlYl9jb250ZW50X2ZvbGRlciA/Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldFN0cmluZyhLZXlzLldFQl9DT05URU5UX0ZPTERFUik7Ci0JCQorCQlyZXR1cm4gZ2V0U3RyaW5nKEtleXMuV0VCX0NPTlRFTlRfRk9MREVSKTsKIAl9CiAKIAkvKioKQEAgLTI5MCw3ICsxMjEsNyBAQAogCSAqIEBkZXByZWNhdGVkIAogCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdGljV2ViQ29udGVudEZvbGRlck5hbWUoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldFN0cmluZyhLZXlzLlNUQVRJQ19XRUJfQ09OVEVOVCk7CisJCXJldHVybiBnZXRTdHJpbmcoS2V5cy5TVEFUSUNfV0VCX0NPTlRFTlQpOwogCX0KIAogCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVNvdXJjZUZvbGRlck5hbWUoKSB7CkBAIC0zMDAsMTggKzEzMSwxOCBAQAogCX0KIAogCXB1YmxpYyBTdHJpbmcgZ2V0SGlnaGVzdEoyRUVWZXJzaW9uU2V0dGluZygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKEtleXMuSjJFRV9WRVJTSU9OKTsKKwkJcmV0dXJuIGdldFN0cmluZyhLZXlzLkoyRUVfVkVSU0lPTik7CiAJfQogCiAJcHVibGljIGJvb2xlYW4gaXNTZXJ2ZXJUYXJnZXRpbmdFbmFibGVkKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEtleXMuU0VSVkVSX1RBUkdFVF9TVVBQT1JUKTsKKwkJcmV0dXJuIGdldEJvb2xlYW4oS2V5cy5TRVJWRVJfVEFSR0VUX1NVUFBPUlQpOwogCX0KIAogCS8vLwogCXB1YmxpYyB2b2lkIHNldEoyRUVXZWJDb250ZW50Rm9sZGVyTmFtZShTdHJpbmcgdmFsdWUpIHsKIAkJLy9nZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKEtleXMuSjJFRV9XRUJfQ09OVEVOVCwgdmFsdWUpOwogCQkvLyBUT0RPIGJ1dCBzaG91bGQgaXQgYmUgZGVwcmVjYXRlZCA/IGlzIGoyZWVfd2ViX2NvbnRlbnQgYSBiZXR0ZXIgbmFtZSB0aGFuIHdlYl9jb250ZW50X2ZvbGRlciA/Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5XRUJfQ09OVEVOVF9GT0xERVIsIHZhbHVlKTsKKwkJZ2V0SW5zdGFuY2VQcmVmZXJlbmNlTm9kZShKMkVFUGx1Z2luLlBMVUdJTl9JRCkucHV0KEtleXMuV0VCX0NPTlRFTlRfRk9MREVSLCB2YWx1ZSk7CiAJCWZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpOwogCX0KIApAQCAtMzIwLDcgKzE1MSw3IEBACiAJICogQGRlcHJlY2F0ZWQKIAkgKi8KIAlwdWJsaWMgdm9pZCBzZXRTdGF0aWNXZWJDb250ZW50Rm9sZGVyTmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShLZXlzLlNUQVRJQ19XRUJfQ09OVEVOVCwgdmFsdWUpOworCQlnZXRJbnN0YW5jZVByZWZlcmVuY2VOb2RlKEoyRUVQbHVnaW4uUExVR0lOX0lEKS5wdXQoS2V5cy5TVEFUSUNfV0VCX0NPTlRFTlQsIHZhbHVlKTsKIAkJZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCk7CiAJfQogCkBAIC0zMzMsMjIgKzE2NCwyMiBAQAogCX0KIAogCXB1YmxpYyB2b2lkIHNldEhpZ2hlc3RKMkVFVmVyc2lvblNldHRpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5KMkVFX1ZFUlNJT04sIHZhbHVlKTsKKwkJZ2V0SW5zdGFuY2VQcmVmZXJlbmNlTm9kZShKMkVFUGx1Z2luLlBMVUdJTl9JRCkucHV0KEtleXMuSjJFRV9WRVJTSU9OLCB2YWx1ZSk7CiAJCWZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpOwogCX0KIAogCXB1YmxpYyB2b2lkIHNldFNlcnZlclRhcmdldGluZ0VuYWJsZWQoYm9vbGVhbiB2YWx1ZSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKEtleXMuU0VSVkVSX1RBUkdFVF9TVVBQT1JULCB2YWx1ZSk7CisJCWdldEluc3RhbmNlUHJlZmVyZW5jZU5vZGUoSjJFRVBsdWdpbi5QTFVHSU5fSUQpLnB1dEJvb2xlYW4oS2V5cy5TRVJWRVJfVEFSR0VUX1NVUFBPUlQsIHZhbHVlKTsKIAkJZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCk7CiAJfQogCiAJcHVibGljIHZvaWQgc2V0SW5jcmVtZW50YWxEZXBsb3ltZW50RW5hYmxlZChib29sZWFuIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoS2V5cy5JTkNSRU1FTlRBTF9ERVBMT1lNRU5UX1NVUFBPUlQsIHZhbHVlKTsKKwkJZ2V0SW5zdGFuY2VQcmVmZXJlbmNlTm9kZShKMkVFUGx1Z2luLlBMVUdJTl9JRCkucHV0Qm9vbGVhbihLZXlzLklOQ1JFTUVOVEFMX0RFUExPWU1FTlRfU1VQUE9SVCwgdmFsdWUpOwogCQlmaXJlUHJlZmVyZW5jZUNoYW5nZWQoKTsKIAl9CiAKIAlwdWJsaWMgYm9vbGVhbiBpc0luY3JlbWVudGFsRGVwbG95bWVudEVuYWJsZWQoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oS2V5cy5JTkNSRU1FTlRBTF9ERVBMT1lNRU5UX1NVUFBPUlQpOworCQlyZXR1cm4gZ2V0Qm9vbGVhbihLZXlzLklOQ1JFTUVOVEFMX0RFUExPWU1FTlRfU1VQUE9SVCk7CiAJfQogCiAJLyoqCkBAIC0zNzAsNyArMjAxLDExIEBACiAJfQogCiAJcHVibGljIHZvaWQgcGVyc2lzdCgpIHsKLQkJZ2V0T3duZXIoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKKwkJdHJ5IHsKKwkJCWdldEluc3RhbmNlUHJlZmVyZW5jZU5vZGUoSjJFRVBsdWdpbi5QTFVHSU5fSUQpLmZsdXNoKCk7CisJCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7CisJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJfQogCX0KIAogCS8qKgpAQCAtMzg4LDE4ICsyMjMsOCBAQAogCQl0aGlzLnBlcnNpc3RPbkNoYW5nZSA9IHBlcnNpc3RPbkNoYW5nZTsKIAl9CiAKLQlwcml2YXRlIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlpZiAodGhpcy5wcmVmZXJlbmNlcyA9PSBudWxsKQotCQkJdGhpcy5wcmVmZXJlbmNlcyA9IGdldE93bmVyKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXM7Ci0JfQogCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBvd25lci4KLQkgKi8KLQlwcml2YXRlIFBsdWdpbiBnZXRPd25lcigpIHsKLQkJcmV0dXJuIHRoaXMub3duZXI7Ci0JfQorCQogCiAJLyoqCiAJICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGJvb2xlYW4tdmFsdWVkIHByb3BlcnR5CkBAIC00MTAsMTAgKzIzNSwxMSBAQAogCSAqIFRoZSBnaXZlbiBuYW1lIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgogCSAqCiAJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJvcGVydHkKKwkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcm9wZXJ0eS4gSWYgZGVmYXVsdCB2YWx1ZSAKKwkgKiBpcyBub3Qgc2V0LCBhIGZhbHNlIHdpbGwgYmUgcmV0dXJuZWQKIAkgKi8KIAlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihuYW1lKTsKKwkJcmV0dXJuIG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKEoyRUVQbHVnaW4uUExVR0lOX0lEKS5nZXRCb29sZWFuKG5hbWUsIERlZmF1bHRzLkJPT0xFQU5fREVGQVVMVF9ERUZBVUxUKTsKIAl9CiAJLyoqCiAJICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYm9vbGVhbi12YWx1ZWQgcHJvcGVydHkgd2l0aCB0aGUKQEAgLTQyMSwxMCArMjQ3LDEyIEBACiAJICogVGhlIGdpdmVuIG5hbWUgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCiAJICoKIAkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIHRoZSBib29sZWFuLXZhbHVlZCBwcm9wZXJ0eQorCSAqIEByZXR1cm4gdGhlIGJvb2xlYW4tdmFsdWVkIHByb3BlcnR5LiBJZiBwcm9wZXJ0eSB2YWx1ZSBpcyBub3Qgc2V0LCBhIGZhbHNlIGlzIHJldHVybmVkLgogCSAqLwogCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihuYW1lKTsKKwkJSVByZWZlcmVuY2VzU2VydmljZSBwcmVmZXJlbmNlc1NlcnZpY2UgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKTsKKwkJSVNjb3BlQ29udGV4dFtdIGxvb2t1cE9yZGVyID0gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OworCQlyZXR1cm4gcHJlZmVyZW5jZXNTZXJ2aWNlLmdldEJvb2xlYW4oSjJFRVBsdWdpbi5QTFVHSU5fSUQsIG5hbWUsIERlZmF1bHRzLkJPT0xFQU5fREVGQVVMVF9ERUZBVUxULCBsb29rdXBPcmRlcik7CiAJfQogCiAJLyoqCkBAIC00MzQsNyArMjYyLDcgQEAKIAkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQogCSAqLwogCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUobmFtZSwgdmFsdWUpOworCQlnZXRJbnN0YW5jZVByZWZlcmVuY2VOb2RlKEoyRUVQbHVnaW4uUExVR0lOX0lEKS5wdXRCb29sZWFuKG5hbWUsIHZhbHVlKTsKIAkJZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCk7CiAJfQogCkBAIC00NTAsNyArMjc4LDcgQEAKIAkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcm9wZXJ0eQogCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKG5hbWUpOworCQlyZXR1cm4gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoSjJFRVBsdWdpbi5QTFVHSU5fSUQpLmdldChuYW1lLCBEZWZhdWx0cy5TVFJJTkdfREVGQVVMVF9ERUZBVUxUKTsKIAl9CQogCQogCS8qKgpAQCAtNDY0LDcgKzI5Miw3IEBACiAJICogQHJldHVybiB0aGUgc3RyaW5nLXZhbHVlZCBwcm9wZXJ0eQogCSAqLwogCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldFN0cmluZyhuYW1lKTsKKwkJcmV0dXJuIEphdmFFRVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuZ2V0U3RyaW5nKG5hbWUpOwogCX0KIAogCS8qKgpAQCAtNDc0LDkxICszMDIsNDcgQEAKIAkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQogCSAqLwogCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7CisJCWdldEluc3RhbmNlUHJlZmVyZW5jZU5vZGUoSjJFRVBsdWdpbi5QTFVHSU5fSUQpLnB1dChuYW1lLCB2YWx1ZSk7CiAJCWZpcmVQcmVmZXJlbmNlQ2hhbmdlZCgpOwogCX0KLQkKLQkKKworCQkKKwkJCiAJcHVibGljIFN0cmluZyBnZXREeW5hbWljV2ViRGVmYXVsdFNvdXJjZUZvbGRlcigpewotCQlyZXR1cm4gZ2V0U2luZ2xlUm9vdERlZmF1bHRKYXZhU3JjRm9sZGVyKCk7CisJCXJldHVybiBKYXZhRUVQcmVmZXJlbmNlc0luaXRpYWxpemVyLmdldER5bmFtaWNXZWJEZWZhdWx0U291cmNlRm9sZGVyKCk7CiAJfQogCQogCXB1YmxpYyBTdHJpbmcgZ2V0RHluYW1pY1dlYkRlZmF1bHRPdXB1dEZvbGRlck5hbWUoKXsKLQkJaWYgKCBQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkgKXsKLQkJCXJldHVybiBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5XRUJfQ09OVEVOVF9GT0xERVIpICsgIi8iKyBKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUzsKKwkJcmV0dXJuIEphdmFFRVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuZ2V0RHluYW1pY1dlYkRlZmF1bHRPdXB1dEZvbGRlck5hbWUoKTsgCiAJCX0KLQkJcmV0dXJuIGdldERlZmF1bHRPdXRwdXRGb2xkZXJOYW1lKCk7Ci0JfQogCQogCXB1YmxpYyBTdHJpbmcgZ2V0QXBwQ2xpZW50RGVmYXVsdE91dHB1dEZvbGRlck5hbWUoKXsKLQkJaWYgKFByb2R1Y3RNYW5hZ2VyLnNob3VsZFVzZVNpbmdsZVJvb3RTdHJ1Y3R1cmUoKSkKLQkJCXJldHVybiBnZXRTdHJpbmcoSjJFRVByZWZlcmVuY2VzLktleXMuQVBQX0NMSUVOVF9DT05URU5UX0ZPTERFUik7Ci0JCXJldHVybiBnZXREZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSgpOworCQlyZXR1cm4gSmF2YUVFUHJlZmVyZW5jZXNJbml0aWFsaXplci5nZXRBcHBDbGllbnREZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSgpOwogCX0KIAkKIAlwdWJsaWMgU3RyaW5nIGdldEVKQkRlZmF1bHRPdXRwdXRGb2xkZXJOYW1lKCl7Ci0JCWlmIChQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkpCi0JCQlyZXR1cm4gZ2V0U3RyaW5nKEoyRUVQcmVmZXJlbmNlcy5LZXlzLkVKQl9DT05URU5UX0ZPTERFUik7Ci0JCXJldHVybiBnZXREZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSgpOworCQlyZXR1cm4gSmF2YUVFUHJlZmVyZW5jZXNJbml0aWFsaXplci5nZXRFSkJEZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSgpOwogCX0KLQorCQogCXB1YmxpYyBTdHJpbmcgZ2V0SkNBRGVmYXVsdE91dHB1dEZvbGRlck5hbWUoKXsKLQkJaWYgKFByb2R1Y3RNYW5hZ2VyLnNob3VsZFVzZVNpbmdsZVJvb3RTdHJ1Y3R1cmUoKSkKLQkJCXJldHVybiBnZXRTdHJpbmcoSjJFRVByZWZlcmVuY2VzLktleXMuSkNBX0NPTlRFTlRfRk9MREVSKTsKLQkJcmV0dXJuIGdldERlZmF1bHRPdXRwdXRGb2xkZXJOYW1lKCk7CisJCXJldHVybiBKYXZhRUVQcmVmZXJlbmNlc0luaXRpYWxpemVyLmdldEpDQURlZmF1bHRPdXRwdXRGb2xkZXJOYW1lKCk7CiAJfQogCQogCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE91dHB1dEZvbGRlck5hbWUoKXsKLQkJCi0JCWlmIChQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkpCi0JCQlyZXR1cm4gZ2V0U2luZ2xlUm9vdERlZmF1bHRKYXZhU3JjRm9sZGVyKCk7Ci0JCQotICAgICAgICBTdHJpbmcgb3V0cHV0Rm9sZGVyID0gZ2V0UHJvZHVjdFByb3BlcnR5KCAiZGVmYXVsdEphdmFPdXRwdXRGb2xkZXIiICk7Ci0gICAgICAgIAotICAgICAgICBpZiggb3V0cHV0Rm9sZGVyID09IG51bGwgKXsKLSAgICAgICAgICAgIG91dHB1dEZvbGRlciA9IGdldFByb2R1Y3RQcm9wZXJ0eSggIm91dHB1dEZvbGRlciIgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYoIG91dHB1dEZvbGRlciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0Rm9sZGVyID0gImJ1aWxkL2NsYXNzZXMiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXRwdXRGb2xkZXI7CisJCXJldHVybiBKYXZhRUVQcmVmZXJlbmNlc0luaXRpYWxpemVyLmdldERlZmF1bHRPdXRwdXRGb2xkZXJOYW1lKCk7CiAJfQotICAgICAgICAKLQlwdWJsaWMgU3RyaW5nIGdldFNpbmdsZVJvb3REZWZhdWx0SmF2YVNyY0ZvbGRlcigpewotICAgIAlTdHJpbmcgc3JjRm9sZGVyID0gRmFjZXRDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoRmFjZXRDb3JlUGx1Z2luLlBST0RfUFJPUF9TT1VSQ0VfRk9MREVSX0xFR0FDWSk7Ci0gICAgCWlmKCBzcmNGb2xkZXIgPT0gbnVsbCB8fCBzcmNGb2xkZXIuZXF1YWxzKCIiKSApeyAvLyROT04tTkxTLTEkCi0gICAgCQlpZiggUGxhdGZvcm0uZ2V0UHJvZHVjdCgpICE9IG51bGwgKXsKLSAgICAJCQlzcmNGb2xkZXIgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0UHJvcGVydHkoICJkZWZhdWx0SmF2YVNvdXJjZUZvbGRlciIgKTsKLSAgICAJCSAgICBpZiggc3JjRm9sZGVyID09IG51bGwgfHwgc3JjRm9sZGVyLmVxdWFscygiIikpeyAvLyROT04tTkxTLTEkCi0gICAgCQkgICAgCXNyY0ZvbGRlciA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXRQcm9wZXJ0eSggRmFjZXRDb3JlUGx1Z2luLlBST0RfUFJPUF9TT1VSQ0VfRk9MREVSX0xFR0FDWSApOwotICAgIAkJICAgIH0gICAgICAJCQkKLSAgICAJCX0KLQkgICAgCWlmKCBzcmNGb2xkZXIgPT0gbnVsbCB8fCBzcmNGb2xkZXIuZXF1YWxzKCIiKSApeyAvLyROT04tTkxTLTEkCi0JICAgIAkJc3JjRm9sZGVyID0gRmFjZXRDb3JlUGx1Z2luLkRFRkFVTFRfU09VUkNFX0ZPTERFUjsKLQkgICAgCX0KLQotICAgIAl9Ci0JICAgIHJldHVybiBzcmNGb2xkZXI7Ci0gICAgfQorCSAgICAKKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRKYXZhU3JjRm9sZGVyKCl7CisJCXJldHVybiBKYXZhRUVQcmVmZXJlbmNlc0luaXRpYWxpemVyLmdldERlZmF1bHRKYXZhU3JjRm9sZGVyKCk7CisJfQogCQogCQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm9kdWN0UHJvcGVydHkoIGZpbmFsIFN0cmluZyBwcm9wTmFtZSApewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgICAgICBpZiggUGxhdGZvcm0uZ2V0UHJvZHVjdCgpICE9IG51bGwgKXsKLSAgICAgICAgICAgIHZhbHVlID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldFByb3BlcnR5KCBwcm9wTmFtZSApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgCiAJcHVibGljIFN0cmluZyBnZXRVdGlsaXR5T3V0cHV0Rm9sZGVyTmFtZSgpewogCQkKLSAgICAJU3RyaW5nIG91dHB1dEZvbGRlciA9IEZhY2V0Q29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoRmFjZXRDb3JlUGx1Z2luLk9VVFBVVF9GT0xERVIpOwotICAgIAlpZiggb3V0cHV0Rm9sZGVyID09IG51bGwgfHwgb3V0cHV0Rm9sZGVyLmVxdWFscygiIikgKXsgLy8kTk9OLU5MUy0xJAotICAgIAkJcmV0dXJuIGdldERlZmF1bHRPdXRwdXRGb2xkZXJOYW1lKCk7Ci0gICAgCX0KKwkJU3RyaW5nIG91dHB1dEZvbGRlciA9IEZhY2V0Q29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoRmFjZXRDb3JlUGx1Z2luLk9VVFBVVF9GT0xERVIpOworCQlpZiggb3V0cHV0Rm9sZGVyID09IG51bGwgfHwgb3V0cHV0Rm9sZGVyLmVxdWFscygiIikgKXsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIGdldERlZmF1bHRPdXRwdXRGb2xkZXJOYW1lKCk7CisJCX0KIAkgICAgcmV0dXJuIG91dHB1dEZvbGRlcjsKLQotCX0gICAgCisJfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KYXZhRUVQcmVmZXJlbmNlc0luaXRpYWxpemVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0phdmFFRVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDMwYjZkCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9KYXZhRUVQcmVmZXJlbmNlc0luaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSwzODEgQEAKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luOworCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzLkNvbW1vbkZyYW1ld29ya3NQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRDb3JlUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuSVByb2R1Y3RDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuUHJvZHVjdE1hbmFnZXI7CisKK3B1YmxpYyBjbGFzcyBKYXZhRUVQcmVmZXJlbmNlc0luaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgeworCisJcHVibGljIGludGVyZmFjZSBLZXlzIHsKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1NPVVJDRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcmVmZXJlbmNlLmphdmFTb3VyY2VOYW1lIjsgLy8kTk9OLU5MUy0xJAorCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1RBUkdFVF9TVVBQT1JUID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnByZWZlcmVuY2Uuc2VydmVydGFyZ2V0c3VwcG9ydCI7IC8vJE5PTi1OTFMtMSQKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRUpCX0NMSUVOVF9KQVIgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZS5jcmVhdGVDbGllbnRKYXIiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgSjJFRV9WRVJTSU9OID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByZWZlcmVuY2UuajJlZVZlcnNpb24iOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0NMSUVOVF9KQVJfQ1BfQ09NUEFUSUJJTElUWSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcmVmZXJlbmNlLmNsaWVudGphci5jcC5jb21wYXRpYmlsaXR5IjsgLy8kTk9OLU5MUy0xJAorCQlzdGF0aWMgZmluYWwgU3RyaW5nIElOQ1JFTUVOVEFMX0RFUExPWU1FTlRfU1VQUE9SVCA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcmVmZXJlbmNlLmluY3JlbWVudGFsRGVwbG95bWVudCI7IC8vJE5PTi1OTFMtMSQKKwkJCisJCWZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFX0VBUl9MSUJSQVJJRVMgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZXMudXNlRUFSTGlicmFyaWVzIjsvLyROT04tTkxTLTEkCisJCWZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFX1dFQl9BUFBfTElCUkFSSUVTID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnByZWZlcmVuY2VzLnVzZVdlYkFwcExpYnJhcmllcyI7Ly8kTk9OLU5MUy0xJAorCQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRV9FQVJfTElCUkFSSUVTX0pEVF9FWFBPUlQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZXMudXNlRUFSTGlicmFyaWVzSkRURXhwb3J0IjsvLyROT04tTkxTLTEkCisJCS8qKgorCQkgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlLiBUaGUgQUxMT1dfQ0xBU1NQQVRIX0RFUCBwcmVmZXJlbmNlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIGl0cyBhYmlsaXR5IHRvIGRpc2FibGUgZHluYW1pYyBtYW5pZmVzdCB1cGRhdGVzIHdpbGwgc29vbiBiZSByZW1vdmVkLgorCQkgKi8KKwkJZmluYWwgc3RhdGljIFN0cmluZyBBTExPV19DTEFTU1BBVEhfREVQID0gSVByb2R1Y3RDb25zdGFudHMuQUxMT1dfQ0xBU1NQQVRIX0RFUDsKKwkJZmluYWwgc3RhdGljIFN0cmluZyBWQUxJREFURV9EVVBMSUNBVEVfQ0xBU1NQQVRIX0NPTVBPTkVOVF9VUkk9IElQcm9kdWN0Q29uc3RhbnRzLlZBTElEQVRFX0RVUExJQ0FURV9DTEFTU1BBVEhfQ09NUE9ORU5UX1VSSTsKKworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEoyRUVfV0VCX0NPTlRFTlQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUucHJlZmVyZW5jZS5qMmVlV2ViQ29udGVudE5hbWUiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDX1dFQl9DT05URU5UID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnByZWZlcmVuY2Uuc3RhdGljV2ViQ29udGVudE5hbWUiOyAvLyROT04tTkxTLTEkCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fQ09OVEVOVF9GT0xERVIgPSBJUHJvZHVjdENvbnN0YW50cy5BUFBMSUNBVElPTl9DT05URU5UX0ZPTERFUjsKKwkJLyoqCisJCSAqIEBzaW5jZSAyLjAKKwkJICovCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0NPTlRFTlRfRk9MREVSID0gSVByb2R1Y3RDb25zdGFudHMuV0VCX0NPTlRFTlRfRk9MREVSOworCQkvKioKKwkJICogQHNpbmNlIDIuMAorCQkgKi8KKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfQ09OVEVOVF9GT0xERVIgPSBJUHJvZHVjdENvbnN0YW50cy5FSkJfQ09OVEVOVF9GT0xERVI7CisJCS8qKgorCQkgKiBAc2luY2UgMi4wCisJCSAqLworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfQ09OVEVOVF9GT0xERVIgPSBJUHJvZHVjdENvbnN0YW50cy5BUFBfQ0xJRU5UX0NPTlRFTlRfRk9MREVSOworCQkvKioKKwkJICogQHNpbmNlIDIuMAorCQkgKi8KKwkJc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfQ09OVEVOVF9GT0xERVIgPSBJUHJvZHVjdENvbnN0YW50cy5KQ0FfQ09OVEVOVF9GT0xERVI7CisJCQorCQkvKioKKwkJICogQHNpbmNlIDIuMAorCQkgKi8KKwkJc3RhdGljIGZpbmFsIFN0cmluZyBBRERfVE9fRUFSX0JZX0RFRkFVTFQgPSBJUHJvZHVjdENvbnN0YW50cy5BRERfVE9fRUFSX0JZX0RFRkFVTFQ7CisJCS8qKgorCQkgKiBAc2luY2UgMi4wCisJCSAqLworCQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0dFTkVSQVRFX0REID0gImFwcGxpY2F0aW9uX2dlbmVyYXRlX2RkIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogQHNpbmNlIDIuMAorCQkgKi8KKwkJc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX1dFQl9HRU5FUkFURV9ERCA9IElQcm9kdWN0Q29uc3RhbnRzLkRZTkFNSUNfV0VCX0dFTkVSQVRFX0REOworCQkvKioKKwkJICogQHNpbmNlIDMuMgorCQkgKi8KKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFRTZfRFlOQU1JQ19XRUJfR0VORVJBVEVfREQgPSAiZWU2X2R5bmFtaWNfd2ViX2dlbmVyYXRlX2RkIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogQHNpbmNlIDIuMAorCQkgKi8KKwkJc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfR0VORVJBVEVfREQgPSAiZWpiX2dlbmVyYXRlX2RkIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogQHNpbmNlIDIuMAorCQkgKi8KKwkJc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX0dFTkVSQVRFX0REID0gImFwcF9jbGllbnRfZ2VuZXJhdGVfZGQiOyAvLyROT04tTkxTLTEkCisJCS8qKgorCQkgKiBAc2luY2UgMy4wCisJCSAqLworCQlzdGF0aWMgU3RyaW5nIElEX1BFUlNQRUNUSVZFX0hJRVJBUkNIWV9WSUVXID0gInBlcnNwZWN0aXZlX2hpZXJhcmNoeV92aWV3X2lkIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogQHNpbmNlIDMuMQorCQkgKi8KKwkJc3RhdGljIFN0cmluZyBTSE9XX0pBVkFfRUVfTU9EVUxFX0RFUEVOREVOQ1lfUEFHRSA9ICJzaG93SmF2YUVFTW9kdWxlRGVwZW5kZW5jeVBhZ2UiOyAvLyROT04tTkxTLTEkCisJCQorCQkKKwkJLyoqCisJCSAqIAorCQkgKi8KKwkJc3RhdGljIGZpbmFsIFN0cmluZyBEWU5fV0VCX1NSQ19GT0xERVIgPSAiZHluV2ViU291cmNlIjsgLy8kTk9OLU5MUy0xJAorCQkvKioKKwkJICogCisJCSAqLworCQkKKwkJc3RhdGljIGZpbmFsIFN0cmluZyBEWU5fV0VCX09VVFBVVF9GT0xERVIgPSBJUHJvZHVjdENvbnN0YW50cy5EWU5fV0VCX09VVFBVVF9GT0xERVI7CisJCS8qKgorCQkgKiAKKwkJICovCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX09VVFBVVF9GT0xERVIgPSBJUHJvZHVjdENvbnN0YW50cy5FSkJfT1VUUFVUX0ZPTERFUjsKKwkJCisJCS8qKgorCQkgKiAKKwkJICovCisJICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9PVVRQVVRfRk9MREVSID0gSVByb2R1Y3RDb25zdGFudHMuQVBQX0NMSUVOVF9PVVRQVVRfRk9MREVSOworCSAgICAKKwkJLyoqCisJCSAqIAorCQkgKi8KKwkgICAgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfT1VUUFVUX0ZPTERFUiA9IElQcm9kdWN0Q29uc3RhbnRzLkpDQV9PVVRQVVRfRk9MREVSOworCSAgICAKKwkgICAgLyoqCisJICAgICAqIEBzaW5jZSAzLjIKKwkgICAgICovCisJCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUU2X0NPTk5FQ1RPUl9HRU5FUkFURV9ERCA9ICJlZTZfY29ubmVjdG9yX2dlbmVyYXRlX2RkIjsgLy8kTk9OLU5MUy0xJAorCisJfQorCisJcHVibGljIGludGVyZmFjZSBWYWx1ZXMgeworCQlmaW5hbCBzdGF0aWMgU3RyaW5nIEoyRUVfVkVSU0lPTl8xXzIgPSAiSjJFRV8xXzIiOyAvLyROT04tTkxTLTEkCisJCWZpbmFsIHN0YXRpYyBTdHJpbmcgSjJFRV9WRVJTSU9OXzFfMyA9ICJKMkVFXzFfMyI7IC8vJE5PTi1OTFMtMSQKKwkJZmluYWwgc3RhdGljIFN0cmluZyBKMkVFX1ZFUlNJT05fMV80ID0gIkoyRUVfMV80IjsgLy8kTk9OLU5MUy0xJAorCisJCS8qKgorCQkgKiBAZGVwcmVjYXRlZCwgc2VlIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSBpdCB1c2VzIFByb2R1Y3RNYW5hZ2VyCisJCSAqLworCQlmaW5hbCBzdGF0aWMgU3RyaW5nIEoyRUVfV0VCX0NPTlRFTlQgPSBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5XRUJfQ09OVEVOVF9GT0xERVIpOworCQkvKioKKwkJICogQGRlcHJlY2F0ZWQsIHNlZSBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgaXQgdXNlcyBQcm9kdWN0TWFuYWdlcgorCQkgKi8KKwkJZmluYWwgc3RhdGljIFN0cmluZyBTVEFUSUNfV0VCX0NPTlRFTlQgPSBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5XRUJfQ09OVEVOVF9GT0xERVIpOworCQkvKioKKwkJICogQGRlcHJlY2F0ZWQsIHVzZSBDb21tb25GcmFtZXdvcmtzUGx1Z2luLkRFRkFVTFRfU09VUkNFX0ZPTERFUgorCQkgKi8KKwkJZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX1NPVVJDRSA9IENvbW1vbkZyYW1ld29ya3NQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkZyYW1ld29ya3NQbHVnaW4uREVGQVVMVF9TT1VSQ0VfRk9MREVSKTsKKwl9CisKKwlwdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRzIHsKKworCQkvKioKKwkJICogQGRlcHJlY2F0ZWQsIHNlZSBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgaXQgdXNlcyBQcm9kdWN0TWFuYWdlcgorCQkgKi8KKwkJZmluYWwgc3RhdGljIFN0cmluZyBKMkVFX1dFQl9DT05URU5UID0gVmFsdWVzLkoyRUVfV0VCX0NPTlRFTlQ7CisJCS8qKgorCQkgKiBAZGVwcmVjYXRlZCwgc2VlIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSBpdCB1c2VzIFByb2R1Y3RNYW5hZ2VyCisJCSAqLworCQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNUQVRJQ19XRUJfQ09OVEVOVCA9IFZhbHVlcy5TVEFUSUNfV0VCX0NPTlRFTlQ7CisJCS8qKgorCQkgKiBAZGVwcmVjYXRlZCwgc2VlIERFRkFVTFRfU09VUkNFX0ZPTERFUgorCQkgKi8KKwkJZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX1NPVVJDRSA9IFZhbHVlcy5KQVZBX1NPVVJDRTsKKwkJZmluYWwgc3RhdGljIFN0cmluZyBKMkVFX1ZFUlNJT04gPSBWYWx1ZXMuSjJFRV9WRVJTSU9OXzFfNDsKKwkJZmluYWwgc3RhdGljIGludCBKMkVFX1ZFUlNJT05fSUQgPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKKwkJZmluYWwgc3RhdGljIGJvb2xlYW4gQ1JFQVRFX0VKQl9DTElFTlRfSkFSID0gZmFsc2U7CisJCWZpbmFsIHN0YXRpYyBib29sZWFuIEVKQl9DTElFTlRfSkFSX0NQX0NPTVBBVElCSUxJVFkgPSB0cnVlOworCQlmaW5hbCBzdGF0aWMgYm9vbGVhbiBJTkNSRU1FTlRBTF9ERVBMT1lNRU5UX1NVUFBPUlQgPSB0cnVlOworCQlmaW5hbCBzdGF0aWMgYm9vbGVhbiBVU0VfRUFSX0xJQlJBUklFU19KRFRfRVhQT1JUID0gZmFsc2U7CisJCWZpbmFsIHN0YXRpYyBTdHJpbmcgSURfUEVSU1BFQ1RJVkVfSElFUkFSQ0hZX1ZJRVcgPSAib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciI7IC8vJE5PTi1OTFMtMSQKKwkJLyoqCisJCSAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UuIFRoZSBBTExPV19DTEFTU1BBVEhfREVQIHByZWZlcmVuY2UgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgaXRzIGFiaWxpdHkgdG8gZGlzYWJsZSBkeW5hbWljIG1hbmlmZXN0IHVwZGF0ZXMgd2lsbCBzb29uIGJlIHJlbW92ZWQuCisJCSAqLworCQlmaW5hbCBzdGF0aWMgYm9vbGVhbiBBTExPV19DTEFTU1BBVEhfREVQID0gdHJ1ZTsKKwkJZmluYWwgc3RhdGljIGJvb2xlYW4gVkFMSURBVEVfRFVQTElDQVRFX0NMQVNTUEFUSF9DT01QT05FTlRfVVJJID0gdHJ1ZTsKKwkJZmluYWwgc3RhdGljIGJvb2xlYW4gU0hPV19KQVZBX0VFX01PRFVMRV9ERVBFTkRFTkNZX1BBR0UgPSB0cnVlOworCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfREVGQVVMVF9ERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEJPT0xFQU5fREVGQVVMVF9ERUZBVUxUID0gZmFsc2U7CisJCWZpbmFsIHN0YXRpYyBib29sZWFuIERZTkFNSUNfV0VCX0dFTkVSQVRFX0REID0gZmFsc2U7CisJCWZpbmFsIHN0YXRpYyBib29sZWFuIEVFNl9DT05ORUNUT1JfR0VORVJBVEVfREQgPSBmYWxzZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKKwkJCisJCUlFY2xpcHNlUHJlZmVyZW5jZXMgbm9kZSA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKEoyRUVQbHVnaW4uUExVR0lOX0lEKTsKKwkJCisJCW5vZGUucHV0KEtleXMuSjJFRV9WRVJTSU9OLCBEZWZhdWx0cy5KMkVFX1ZFUlNJT04pOworCQlub2RlLnB1dEJvb2xlYW4oS2V5cy5DUkVBVEVfRUpCX0NMSUVOVF9KQVIsIERlZmF1bHRzLkNSRUFURV9FSkJfQ0xJRU5UX0pBUik7CisJCW5vZGUucHV0Qm9vbGVhbihLZXlzLkVKQl9DTElFTlRfSkFSX0NQX0NPTVBBVElCSUxJVFksIERlZmF1bHRzLkVKQl9DTElFTlRfSkFSX0NQX0NPTVBBVElCSUxJVFkpOworCQlub2RlLnB1dEJvb2xlYW4oS2V5cy5JTkNSRU1FTlRBTF9ERVBMT1lNRU5UX1NVUFBPUlQsIERlZmF1bHRzLklOQ1JFTUVOVEFMX0RFUExPWU1FTlRfU1VQUE9SVCk7CisJCQorCQkvLyBzaW5jZSAyLjAKKwkJbm9kZS5wdXQoS2V5cy5KMkVFX1dFQl9DT05URU5ULCBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5XRUJfQ09OVEVOVF9GT0xERVIpKTsKKwkJbm9kZS5wdXQoS2V5cy5TVEFUSUNfV0VCX0NPTlRFTlQsIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLldFQl9DT05URU5UX0ZPTERFUikpOworCQkvLyBzaW5jZSAyLjAKKwkJbm9kZS5wdXQoS2V5cy5KQVZBX1NPVVJDRSwgRmFjZXRDb3JlUGx1Z2luLmdldEphdmFTcmNGb2xkZXIoKSk7CisJCS8vIGRvbmUgaW4gQ29tbW9uRnJhbWV3b3Jrc1ByZWYuLkluaXRpYWxpemVyCisJCS8vbm9kZS5wdXQoS2V5cy5ERUZBVUxUX1NPVVJDRV9GT0xERVIsIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkRFRkFVTFRfU09VUkNFX0ZPTERFUikpOworCQlub2RlLnB1dChLZXlzLkFQUExJQ0FUSU9OX0NPTlRFTlRfRk9MREVSLCBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5BUFBMSUNBVElPTl9DT05URU5UX0ZPTERFUikpOworCQlub2RlLnB1dChLZXlzLldFQl9DT05URU5UX0ZPTERFUiwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuV0VCX0NPTlRFTlRfRk9MREVSKSk7CisJCW5vZGUucHV0KEtleXMuQVBQX0NMSUVOVF9DT05URU5UX0ZPTERFUiwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuQVBQX0NMSUVOVF9DT05URU5UX0ZPTERFUikpOworCQlub2RlLnB1dChLZXlzLkVKQl9DT05URU5UX0ZPTERFUiwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuRUpCX0NPTlRFTlRfRk9MREVSKSk7CisJCW5vZGUucHV0KEtleXMuSkNBX0NPTlRFTlRfRk9MREVSLCBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5KQ0FfQ09OVEVOVF9GT0xERVIpKTsKKwkJbm9kZS5wdXQoS2V5cy5BRERfVE9fRUFSX0JZX0RFRkFVTFQsIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkFERF9UT19FQVJfQllfREVGQVVMVCkpOworCQkvLyBkb25lIGluIENvbW1vbkZyYW1ld29ya3NQcmVmLi5Jbml0aWFsaXplcgorCQkvL25vZGUucHV0KEtleXMuT1VUUFVUX0ZPTERFUiwgUHJvZHVjdE1hbmFnZXIuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuT1VUUFVUX0ZPTERFUikpOworCQkKKwkJLy8gc2luY2UgMi4wLCBmb3IgamF2YSBlZSBwcm9qZWN0cworCQlub2RlLnB1dEJvb2xlYW4oS2V5cy5BUFBMSUNBVElPTl9HRU5FUkFURV9ERCwgZmFsc2UpOworCQkvLyBmb3IgZWU1IGplZSB3ZWIgcHJvamVjdHMgZGVmYXVsdCBpdCB0byB0cnVlIHNvIHRoYXQgd2UgY2FuIGNyZWF0ZSBzZXJ2bGV0cywgb3RoZXJ3aXNlIGZhbHNlCisJCVN0cmluZyBnZW5lcmF0ZUR5bmFtaWNXZWJERCA9IFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkRZTkFNSUNfV0VCX0dFTkVSQVRFX0REKTsKKwkJYm9vbGVhbiBnZW5lcmF0ZUR5bmFtaWNXZWJERERlZmF1bHQgPSAoZ2VuZXJhdGVEeW5hbWljV2ViREQgIT0gbnVsbCkgPyBCb29sZWFuLnBhcnNlQm9vbGVhbihnZW5lcmF0ZUR5bmFtaWNXZWJERCkgOiBEZWZhdWx0cy5EWU5BTUlDX1dFQl9HRU5FUkFURV9ERDsKKwkJbm9kZS5wdXRCb29sZWFuKEtleXMuRFlOQU1JQ19XRUJfR0VORVJBVEVfREQsIGdlbmVyYXRlRHluYW1pY1dlYkRERGVmYXVsdCk7CisJCW5vZGUucHV0Qm9vbGVhbihLZXlzLkVFNl9EWU5BTUlDX1dFQl9HRU5FUkFURV9ERCwgZmFsc2UpOworCQlub2RlLnB1dEJvb2xlYW4oS2V5cy5FSkJfR0VORVJBVEVfREQsIGZhbHNlKTsKKwkJbm9kZS5wdXRCb29sZWFuKEtleXMuQVBQX0NMSUVOVF9HRU5FUkFURV9ERCwgZmFsc2UpOwkKKwkJU3RyaW5nIGVlNkNvbm5lY3RvckdlbmVyYXRlREQgPSBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5FRTZfQ09OTkVDVE9SX0dFTkVSQVRFX0REKTsKKwkJYm9vbGVhbiBlZTZDb25uZWN0b3JHZW5lcmF0ZURERGVmYXVsdCA9IChlZTZDb25uZWN0b3JHZW5lcmF0ZUREICE9IG51bGwpID8gQm9vbGVhbi5wYXJzZUJvb2xlYW4oZWU2Q29ubmVjdG9yR2VuZXJhdGVERCkgOiBEZWZhdWx0cy5FRTZfQ09OTkVDVE9SX0dFTkVSQVRFX0REOworCQlub2RlLnB1dEJvb2xlYW4oS2V5cy5FRTZfQ09OTkVDVE9SX0dFTkVSQVRFX0RELCBlZTZDb25uZWN0b3JHZW5lcmF0ZURERGVmYXVsdCk7CisJCQorCQlub2RlLnB1dEJvb2xlYW4oS2V5cy5VU0VfRUFSX0xJQlJBUklFUywgdHJ1ZSk7CisJCW5vZGUucHV0Qm9vbGVhbihLZXlzLlVTRV9XRUJfQVBQX0xJQlJBUklFUywgdHJ1ZSk7CisJCW5vZGUucHV0Qm9vbGVhbihLZXlzLlVTRV9FQVJfTElCUkFSSUVTX0pEVF9FWFBPUlQsIERlZmF1bHRzLlVTRV9FQVJfTElCUkFSSUVTX0pEVF9FWFBPUlQpOworCQlTdHJpbmcgcGVyc3BlY3RpdmVJRCA9IFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLklEX1BFUlNQRUNUSVZFX0hJRVJBUkNIWV9WSUVXKTsKKwkJbm9kZS5wdXQoS2V5cy5JRF9QRVJTUEVDVElWRV9ISUVSQVJDSFlfVklFVywgKHBlcnNwZWN0aXZlSUQgIT0gbnVsbCkgPyBwZXJzcGVjdGl2ZUlEIDogRGVmYXVsdHMuSURfUEVSU1BFQ1RJVkVfSElFUkFSQ0hZX1ZJRVcpOworCQlTdHJpbmcgYWxsb3dDbGFzc3BhdGhEZXAgPSBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5BTExPV19DTEFTU1BBVEhfREVQKTsKKwkJYm9vbGVhbiBhbGxvd0NsYXNzcGF0aERlcERlZmF1bHQgPSAoYWxsb3dDbGFzc3BhdGhEZXAgIT0gbnVsbCkgPyBCb29sZWFuLnBhcnNlQm9vbGVhbihhbGxvd0NsYXNzcGF0aERlcCkgOiBEZWZhdWx0cy5BTExPV19DTEFTU1BBVEhfREVQOworCQlub2RlLnB1dEJvb2xlYW4oS2V5cy5BTExPV19DTEFTU1BBVEhfREVQLCBhbGxvd0NsYXNzcGF0aERlcERlZmF1bHQpOworCQlTdHJpbmcgdmFsaWRhdGVEdXBDbGFzc3BhdGhDb21wVVJJcyA9IFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLlZBTElEQVRFX0RVUExJQ0FURV9DTEFTU1BBVEhfQ09NUE9ORU5UX1VSSSk7CisJCWJvb2xlYW4gdmFsaWRhdGVEdXBDbGFzc3BhdGhDb21wVVJJc0RlZmF1bHQgPSAodmFsaWRhdGVEdXBDbGFzc3BhdGhDb21wVVJJcyAhPSBudWxsKSA/IEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbGlkYXRlRHVwQ2xhc3NwYXRoQ29tcFVSSXMpIDogRGVmYXVsdHMuVkFMSURBVEVfRFVQTElDQVRFX0NMQVNTUEFUSF9DT01QT05FTlRfVVJJOworCQlub2RlLnB1dEJvb2xlYW4oS2V5cy5WQUxJREFURV9EVVBMSUNBVEVfQ0xBU1NQQVRIX0NPTVBPTkVOVF9VUkksIHZhbGlkYXRlRHVwQ2xhc3NwYXRoQ29tcFVSSXNEZWZhdWx0KTsKKwkJU3RyaW5nIHNob3dKYXZhRUVNb2R1bGVEZXBlbmRlbmN5UGFnZSA9IFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLlNIT1dfSkFWQV9FRV9NT0RVTEVfREVQRU5ERU5DWV9QQUdFKTsKKwkJYm9vbGVhbiBzaG93SmF2YUVFTW9kdWxlRGVwZW5kZW5jeVBhZ2VEZWZhdWx0ID0gKHNob3dKYXZhRUVNb2R1bGVEZXBlbmRlbmN5UGFnZSAhPSBudWxsKSA/IEJvb2xlYW4ucGFyc2VCb29sZWFuKHNob3dKYXZhRUVNb2R1bGVEZXBlbmRlbmN5UGFnZSkgOiBEZWZhdWx0cy5TSE9XX0pBVkFfRUVfTU9EVUxFX0RFUEVOREVOQ1lfUEFHRTsKKwkJbm9kZS5wdXRCb29sZWFuKEtleXMuU0hPV19KQVZBX0VFX01PRFVMRV9ERVBFTkRFTkNZX1BBR0UsIHNob3dKYXZhRUVNb2R1bGVEZXBlbmRlbmN5UGFnZURlZmF1bHQpOworCQkKKwkJbm9kZS5wdXQoS2V5cy5EWU5fV0VCX1NSQ19GT0xERVIsIGdldER5bmFtaWNXZWJEZWZhdWx0U291cmNlRm9sZGVyKCkpOworCQlub2RlLnB1dChLZXlzLkRZTl9XRUJfT1VUUFVUX0ZPTERFUiwgZ2V0RHluYW1pY1dlYkRlZmF1bHRPdXB1dEZvbGRlck5hbWUoKSk7CisJCW5vZGUucHV0KEtleXMuQVBQX0NMSUVOVF9PVVRQVVRfRk9MREVSLCAgZ2V0QXBwQ2xpZW50RGVmYXVsdE91dHB1dEZvbGRlck5hbWUoKSApOworCQlub2RlLnB1dChLZXlzLkVKQl9PVVRQVVRfRk9MREVSLCBnZXRFSkJEZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSgpICk7CisJCW5vZGUucHV0KEtleXMuSkNBX09VVFBVVF9GT0xERVIsIGdldEpDQURlZmF1bHRPdXRwdXRGb2xkZXJOYW1lKCkgKTsJCisJCX0KKworCQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBhbnl3aGVyZSBvdXRzaWRlIHRoaXMgY2xhc3MuIAorCSAqIFRoaXMgd2lsbCBiZSBtYWRlIHByaXZhdGUgb25jZSB0aGUgZGVwcmVjYXRlZCBKMkVFUHJlZmVyZW5jZXMgY2xhc3MgaXMgZGVsZXRlZCAKKwkgKi8KKwlzdGF0aWMgU3RyaW5nIGdldER5bmFtaWNXZWJEZWZhdWx0U291cmNlRm9sZGVyKCl7CisJCXJldHVybiBnZXREZWZhdWx0SmF2YVNyY0ZvbGRlcigpOworCX0KKwkKKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBhbnl3aGVyZSBvdXRzaWRlIHRoaXMgY2xhc3MuIAorCSAqIFRoaXMgd2lsbCBiZSBtYWRlIHByaXZhdGUgb25jZSB0aGUgZGVwcmVjYXRlZCBKMkVFUHJlZmVyZW5jZXMgY2xhc3MgaXMgZGVsZXRlZCAKKwkgKi8KKwlzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRKYXZhU3JjRm9sZGVyKCl7CisJCVN0cmluZyBzcmNGb2xkZXIgPSBGYWNldENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdFN0cmluZyhGYWNldENvcmVQbHVnaW4uUFJPRF9QUk9QX1NPVVJDRV9GT0xERVJfTEVHQUNZKTsKKwkJaWYoIHNyY0ZvbGRlciA9PSBudWxsIHx8IHNyY0ZvbGRlci5lcXVhbHMoIiIpICl7IC8vJE5PTi1OTFMtMSQKKwkJCWlmKCBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkgIT0gbnVsbCApeworCQkJCXNyY0ZvbGRlciA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXRQcm9wZXJ0eSggImRlZmF1bHRKYXZhU291cmNlRm9sZGVyIiApOyAvLyROT04tTkxTLTEkCisJCQkgICAgaWYoIHNyY0ZvbGRlciA9PSBudWxsIHx8IHNyY0ZvbGRlci5lcXVhbHMoIiIpKXsgLy8kTk9OLU5MUy0xJAorCQkJICAgIAlzcmNGb2xkZXIgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0UHJvcGVydHkoIEZhY2V0Q29yZVBsdWdpbi5QUk9EX1BST1BfU09VUkNFX0ZPTERFUl9MRUdBQ1kgKTsKKwkJCSAgICB9ICAgICAgCQkJCisJCQl9CisJICAgIAlpZiggc3JjRm9sZGVyID09IG51bGwgfHwgc3JjRm9sZGVyLmVxdWFscygiIikgKXsgLy8kTk9OLU5MUy0xJAorCSAgICAJCXNyY0ZvbGRlciA9IEZhY2V0Q29yZVBsdWdpbi5ERUZBVUxUX1NPVVJDRV9GT0xERVI7CisJICAgIAl9CisJCisJCX0KKwkgICAgcmV0dXJuIHNyY0ZvbGRlcjsKKwl9CisJCisJCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGFueXdoZXJlIG91dHNpZGUgdGhpcyBjbGFzcy4gCisJICogVGhpcyB3aWxsIGJlIG1hZGUgcHJpdmF0ZSBvbmNlIHRoZSBkZXByZWNhdGVkIEoyRUVQcmVmZXJlbmNlcyBjbGFzcyBpcyBkZWxldGVkIAorCSAqLworCXN0YXRpYyBTdHJpbmcgZ2V0RHluYW1pY1dlYkRlZmF1bHRPdXB1dEZvbGRlck5hbWUoKXsKKwkJaWYgKCBQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkgKXsKKwkJCXJldHVybiBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5XRUJfQ09OVEVOVF9GT0xERVIpICsgIi8iKyBKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUzsgLy8kTk9OLU5MUy0xJAorCQl9CisJCXJldHVybiBnZXREZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSgpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYW55d2hlcmUgb3V0c2lkZSB0aGlzIGNsYXNzLiAKKwkgKiBUaGlzIHdpbGwgYmUgbWFkZSBwcml2YXRlIG9uY2UgdGhlIGRlcHJlY2F0ZWQgSjJFRVByZWZlcmVuY2VzIGNsYXNzIGlzIGRlbGV0ZWQgCisJICovCisJc3RhdGljIFN0cmluZyBnZXRBcHBDbGllbnREZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSgpeworCQlpZiAoUHJvZHVjdE1hbmFnZXIuc2hvdWxkVXNlU2luZ2xlUm9vdFN0cnVjdHVyZSgpKQorCQkJcmV0dXJuIGdldERlZmF1bHRTdHJpbmcoS2V5cy5BUFBfQ0xJRU5UX0NPTlRFTlRfRk9MREVSKTsKKwkJcmV0dXJuIGdldERlZmF1bHRPdXRwdXRGb2xkZXJOYW1lKCk7CisJfQorCQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBhbnl3aGVyZSBvdXRzaWRlIHRoaXMgY2xhc3MuIAorCSAqIFRoaXMgd2lsbCBiZSBtYWRlIHByaXZhdGUgb25jZSB0aGUgZGVwcmVjYXRlZCBKMkVFUHJlZmVyZW5jZXMgY2xhc3MgaXMgZGVsZXRlZCAKKwkgKi8KKwlzdGF0aWMgU3RyaW5nIGdldEVKQkRlZmF1bHRPdXRwdXRGb2xkZXJOYW1lKCl7CisJCWlmIChQcm9kdWN0TWFuYWdlci5zaG91bGRVc2VTaW5nbGVSb290U3RydWN0dXJlKCkpCisJCQlyZXR1cm4gZ2V0RGVmYXVsdFN0cmluZyhLZXlzLkVKQl9DT05URU5UX0ZPTERFUik7CisJCXJldHVybiBnZXREZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSgpOworCX0KKwkKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgYW55d2hlcmUgb3V0c2lkZSB0aGlzIGNsYXNzLiAKKwkgKiBUaGlzIHdpbGwgYmUgbWFkZSBwcml2YXRlIG9uY2UgdGhlIGRlcHJlY2F0ZWQgSjJFRVByZWZlcmVuY2VzIGNsYXNzIGlzIGRlbGV0ZWQgCisJICovCisJc3RhdGljIFN0cmluZyBnZXRKQ0FEZWZhdWx0T3V0cHV0Rm9sZGVyTmFtZSgpeworCQlpZiAoUHJvZHVjdE1hbmFnZXIuc2hvdWxkVXNlU2luZ2xlUm9vdFN0cnVjdHVyZSgpKQorCQkJcmV0dXJuIGdldERlZmF1bHRTdHJpbmcoS2V5cy5KQ0FfQ09OVEVOVF9GT0xERVIpOworCQlyZXR1cm4gZ2V0RGVmYXVsdE91dHB1dEZvbGRlck5hbWUoKTsKKwl9CisJCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGFueXdoZXJlIG91dHNpZGUgdGhpcyBjbGFzcy4gCisJICogVGhpcyB3aWxsIGJlIG1hZGUgcHJpdmF0ZSBvbmNlIHRoZSBkZXByZWNhdGVkIEoyRUVQcmVmZXJlbmNlcyBjbGFzcyBpcyBkZWxldGVkIAorCSAqLworCXN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBuYW1lKSB7CisJCUlQcmVmZXJlbmNlc1NlcnZpY2UgcHJlZmVyZW5jZXNTZXJ2aWNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7CisJCUlTY29wZUNvbnRleHRbXSBsb29rdXBPcmRlciA9IG5ldyBJU2NvcGVDb250ZXh0W117bmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKKwkJcmV0dXJuIHByZWZlcmVuY2VzU2VydmljZS5nZXRTdHJpbmcoSjJFRVBsdWdpbi5QTFVHSU5fSUQsIG5hbWUsIERlZmF1bHRzLlNUUklOR19ERUZBVUxUX0RFRkFVTFQsIGxvb2t1cE9yZGVyKTsKKwkJfQorCisJLyoqCisJICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGFueXdoZXJlIG91dHNpZGUgdGhpcyBjbGFzcy4gCisJICogVGhpcyB3aWxsIGJlIG1hZGUgcHJpdmF0ZSBvbmNlIHRoZSBkZXByZWNhdGVkIEoyRUVQcmVmZXJlbmNlcyBjbGFzcyBpcyBkZWxldGVkIAorCSAqLworCXN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdE91dHB1dEZvbGRlck5hbWUoKXsKKwkJaWYgKFByb2R1Y3RNYW5hZ2VyLnNob3VsZFVzZVNpbmdsZVJvb3RTdHJ1Y3R1cmUoKSkKKwkJCXJldHVybiBnZXREZWZhdWx0SmF2YVNyY0ZvbGRlcigpOworCSAgICBTdHJpbmcgb3V0cHV0Rm9sZGVyID0gZ2V0UHJvZHVjdFByb3BlcnR5KCAiZGVmYXVsdEphdmFPdXRwdXRGb2xkZXIiICk7IC8vJE5PTi1OTFMtMSQKKwkgICAgaWYoIG91dHB1dEZvbGRlciA9PSBudWxsICl7CisJICAgICAgICBvdXRwdXRGb2xkZXIgPSBnZXRQcm9kdWN0UHJvcGVydHkoICJvdXRwdXRGb2xkZXIiICk7IC8vJE5PTi1OTFMtMSQKKwkgICAgfQorCSAgICAKKwkgICAgaWYoIG91dHB1dEZvbGRlciA9PSBudWxsICkKKwkgICB7CisJICAgICAgICBvdXRwdXRGb2xkZXIgPSBGYWNldENvcmVQbHVnaW4uREVGVUFMVF9PVVRQVVRfRk9MREVSOworCSAgICB9CisJICAgIHJldHVybiBvdXRwdXRGb2xkZXI7CisJfQorCQorCS8qKgorCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCBhbnl3aGVyZSBvdXRzaWRlIHRoaXMgY2xhc3MuIAorCSAqIFRoaXMgd2lsbCBiZSBtYWRlIHByaXZhdGUgb25jZSB0aGUgZGVwcmVjYXRlZCBKMkVFUHJlZmVyZW5jZXMgY2xhc3MgaXMgZGVsZXRlZCAKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJvZHVjdFByb3BlcnR5KCBmaW5hbCBTdHJpbmcgcHJvcE5hbWUgKXsKKwkgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKKwkgICAgaWYoIFBsYXRmb3JtLmdldFByb2R1Y3QoKSAhPSBudWxsICl7CisJICAgICAgICB2YWx1ZSA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXRQcm9wZXJ0eSggcHJvcE5hbWUgKTsKKwkgICAgfQorCSAgICByZXR1cm4gdmFsdWU7CisJfQorCQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGJvb2xlYW4tdmFsdWVkIHByb3BlcnR5CisJICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPmZhbHNlPC9jb2RlPikgaWYgdGhlcmUKKwkgKiBpcyBubyBkZWZhdWx0IHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAorCSAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgYm9vbGVhbi4KKwkgKiBUaGUgZ2l2ZW4gbmFtZSBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByb3BlcnR5LiBJZiBkZWZhdWx0IHZhbHVlIAorCSAqIGlzIG5vdCBzZXQsIGEgZmFsc2Ugd2lsbCBiZSByZXR1cm5lZAorCSAqLworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoSjJFRVBsdWdpbi5QTFVHSU5fSUQpLmdldEJvb2xlYW4obmFtZSwgRGVmYXVsdHMuQk9PTEVBTl9ERUZBVUxUX0RFRkFVTFQpOworCX0KKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3RyaW5nLXZhbHVlZCBwcm9wZXJ0eQorCSAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCisJICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICh0aGUgZW1wdHkgc3RyaW5nIDxjb2RlPiIiPC9jb2RlPikgCisJICogaXMgbm8gZGVmYXVsdCBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKKwkgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIHN0cmluZy4KKwkgKiBUaGUgZ2l2ZW4gbmFtZSBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByb3BlcnR5CisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoSjJFRVBsdWdpbi5QTFVHSU5fSUQpLmdldChuYW1lLCBEZWZhdWx0cy5TVFJJTkdfREVGQVVMVF9ERUZBVUxUKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0xpYkNvcHlCdWlsZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvcGx1Z2luL0xpYkNvcHlCdWlsZGVyLmphdmEKaW5kZXggN2JhZDQyZi4uY2U5ZGQzMSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3BsdWdpbi9MaWJDb3B5QnVpbGRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC9wbHVnaW4vTGliQ29weUJ1aWxkZXIuamF2YQpAQCAtMTAyLDYgKzEwMiw3IEBACiAJICogW0lzc3VlOiB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHByb2JhYmx5IHVzZSBhIHdvcmtzcGFjZSBydW5uYWJsZS5dCiAJICogPC9wPgogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBJUHJvamVjdFtdIGJ1aWxkKGludCBraW5kLCBNYXAgYXJncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCS8vIHRoaXMgYnVpbGRlciBpcyB1bm5lY2Vzc2FyeSBpbiBXVFAgMS41CiAJCXJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vQVdvcmtiZW5jaE1PRkhlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vQVdvcmtiZW5jaE1PRkhlbHBlci5qYXZhCmluZGV4IDdiNWZjN2QuLmUzNzI2OGYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL0FXb3JrYmVuY2hNT0ZIZWxwZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9BV29ya2JlbmNoTU9GSGVscGVyLmphdmEKQEAgLTExLDggKzExLDYgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbjsKIAogCi1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOwpAQCAtMjAsOCArMTgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wbHVnaW4uSmF2YUVNRk5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQ7CkBAIC0zMyw2ICsyOSw3IEBACiAgKiBzeW1ib2xpYyBtb2RlbCBuYW1lLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQVdvcmtiZW5jaE1PRkhlbHBlciBleHRlbmRzIFdvcmtiZW5jaENvbnRleHQgeworCUBPdmVycmlkZQogCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoT2JqZWN0IG9iaikgewogCQlJUmVzb3VyY2UgcmVzID0gbnVsbDsKIAkJaWYgKChvYmogIT0gbnVsbCkgJiYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpKSB7CkBAIC01OSwxMyArNTYsNyBAQAogCQl0cnkgewogCQkJZGVzYyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IEoyRUVQbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiV29ya2JlbmNoQ29udGV4dC5nZXRNT0ZOYXR1cmUoSVByb2plY3QpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuRklORSwgZW50cnkpOwotCQkJfQorCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihleGMpOwogCQkJcmV0dXJuIG51bGw7CiAJCX0KIApAQCAtNzgsMTMgKzY5LDcgQEAKIAkJCQl9CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewogCQkJCS8vIGxvZyBhbmQgYXR0ZW1wdCBuZXh0IG5hdHVyZQotCQkJCUxvZ2dlciBsb2dnZXIgPSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLkZJTkUpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gSjJFRVBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiV29ya2JlbmNoQ29udGV4dC5nZXRNT0ZOYXR1cmUoSVByb2plY3QpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5GSU5FLCBlbnRyeSk7Ci0JCQkJfQorCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZXhjKTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL0FwcGxpY2F0aW9uQ2xpZW50SGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9BcHBsaWNhdGlvbkNsaWVudEhlbHBlci5qYXZhCmluZGV4IGRkMGM4ZTMuLjdiNWMxODEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL0FwcGxpY2F0aW9uQ2xpZW50SGVscGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vQXBwbGljYXRpb25DbGllbnRIZWxwZXIuamF2YQpAQCAtMTUsMTAgKzE1LDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuY29tcG9uZW50Y29yZS51dGlsLkFwcENsaWVudEFydGlmYWN0RWRpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQXBwbGljYXRpb25DbGllbnRNZXNzYWdlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CkBAIC00OCw2ICs0OCw3IEBACiAJICogR2l2ZW4gYSByZXNvdXJjZSwgcmV0dXJuIGl0cyBub24tZWNsaXBzZS1zcGVjaWZpYyBsb2NhdGlvbi4gSWYgdGhpcyByZXNvdXJjZSwgb3IgdHlwZSBvZgogCSAqIHJlc291cmNlLCBpc24ndCBoYW5kbGVkIGJ5IHRoaXMgaGVscGVyLCByZXR1cm4gbnVsbC4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKIAkJaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkpIHsKIAkJCXJldHVybiBudWxsOwpAQCAtNjksNyArNzAsNyBAQAogCQkJYXBwQ2xpZW50RmlsZSA9IChBcHBsaWNhdGlvbkNsaWVudEZpbGUpKChBcHBDbGllbnRBcnRpZmFjdEVkaXQpIGVkaXQpLmFzQXJjaGl2ZShmYWxzZSk7CiAJCQlyZXR1cm4gYXBwQ2xpZW50RmlsZTsKIAkJfSBjYXRjaCAoT3BlbkZhaWx1cmVFeGNlcHRpb24gZTEpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZTEpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlMSk7CiAJCX1maW5hbGx5IHsKIAkJCWlmIChlZGl0ICE9IG51bGwpIHsKIAkJCQllZGl0LmRpc3Bvc2UoKTsKQEAgLTc4LDYgKzc5LDcgQEAKIAkJcmV0dXJuIG51bGw7CiAJfQkKIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBjbGVhbnVwKFdvcmtiZW5jaFJlcG9ydGVyIHJlcG9ydGVyKSB7CiAJCWNsb3NlQXBwbGljYXRpb25DbGllbnRGaWxlKCk7CiAJCXN1cGVyLmNsZWFudXAocmVwb3J0ZXIpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vRGVwZW5kZW5jeVV0aWwuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlcGVuZGVuY3lVdGlsLmphdmEKaW5kZXggZDEzZmM1Ni4uNjU5NDc4MSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vRGVwZW5kZW5jeVV0aWwuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZXBlbmRlbmN5VXRpbC5qYXZhCkBAIC0xMiw3ICsxMiw2IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CkBAIC0yMCw4ICsxOSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIuTG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIAogLyoqCkBAIC0xMDksMTMgKzEwNiw3IEBACiAJCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIHJlc3VsdCwgMCwgY291bnQpOwogCQkJcmV0dXJuIHJlc3VsdDsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gSjJFRVBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJEZXBlbmRlbmN5Q2FjaGU6OmdldFJlcXVpcmVkUHJvamVjdHMoIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9CisJCQlKMkVFUGx1Z2luLmxvZyhKMkVFUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIHByb2plY3QuZ2V0TmFtZSgpLCBleGMpKTsKIAogCQkJcmV0dXJuIEVNUFRZX1BST0pFQ1RTOwogCQl9CkBAIC0xNDgsMTMgKzEzOSw3IEBACiAJCQl0ZW1wU2V0LnRvQXJyYXkoZGVwZW5kZW5jeSk7CiAJCQlyZXR1cm4gZGVwZW5kZW5jeTsKIAkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJTG9nRW50cnkgZW50cnkgPSBKMkVFUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJZW50cnkuc2V0U291cmNlSUQoIkRlcGVuZGVuY3lDYWNoZTo6Z2V0RGVwZW5kZW50SmF2YVByb2plY3RzKCIgKyBqYXZhcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9CisJCQlKMkVFUGx1Z2luLmxvZyhKMkVFUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIGphdmFwcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCksIGV4YykpOwogCiAJCQlyZXR1cm4gRU1QVFlfSkFWQVBST0pFQ1RTOwogCQl9CkBAIC0xNzEsMTMgKzE1Niw4IEBACiAJCXRyeSB7CiAJCQlJSmF2YU1vZGVsIGptID0gamF2YXByb2plY3QuZ2V0SmF2YU1vZGVsKCk7CiAJCQlpZiAoam0gPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBKMkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBKMkVFUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFNvdXJjZUlEKCJEZXBlbmRlbmN5Q2FjaGU6OmdldFJlcXVpcmVkSmF2YVByb2plY3RzKCIgKyBqYXZhcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCQkvL2VudHJ5LnNldFRleHQoIklKYXZhTW9kZWwgPT0gbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJJSmF2YU1vZGVsID09IG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KKwkJCQlKMkVFUGx1Z2luLmxvZyhKMkVFUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsICJEZXBlbmRlbmN5Q2FjaGU6OmdldFJlcXVpcmVkSmF2YVByb2plY3RzKCIgKyBqYXZhcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIikgSUphdmFNb2RlbCA9PSBudWxsIiwgbnVsbCkpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKKwogCQkJCXJldHVybiBFTVBUWV9KQVZBUFJPSkVDVFM7CiAJCQl9CiAKQEAgLTIwNSwxMyArMTg1LDggQEAKIAogCQkJCQl0ZW1wW2NvdW50KytdID0ganA7CiAJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gSjJFRVBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJZW50cnkuc2V0U291cmNlSUQoIkRlcGVuZGVuY3lDYWNoZTo6Z2V0UmVxdWlyZWRKYXZhUHJvamVjdHMoIiArIGphdmFwcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJCX0KKwkJCQkJSjJFRVBsdWdpbi5sb2coSjJFRVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBqYXZhcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBleGMpKTsKKwkJCQkJCiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAkJCX0KQEAgLTIyOCwxMyArMjAzLDcgQEAKIAkJCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBjb3VudCk7CiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IEoyRUVQbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRTb3VyY2VJRCgiRGVwZW5kZW5jeUNhY2hlOjpnZXRSZXF1aXJlZEphdmFQcm9qZWN0cygiICsgamF2YXByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArICIpIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQorCQkJSjJFRVBsdWdpbi5sb2coSjJFRVBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBqYXZhcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBleGMpKTsKIAogCQkJcmV0dXJuIEVNUFRZX0pBVkFQUk9KRUNUUzsKIAkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vRWFySGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FYXJIZWxwZXIuamF2YQppbmRleCBkYjQzOTRkLi5mZmMwZmExIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FYXJIZWxwZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FYXJIZWxwZXIuamF2YQpAQCAtMTUsMTMgKzE1LDEzIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5BcHBsaWNhdGlvbkltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSQXJ0aWZhY3RFZGl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5Db21wb25lbnRVdGlsaXRpZXM7CkBAIC01Myw2ICs1Myw3IEBACiAJICogR2l2ZW4gYSByZXNvdXJjZSwgcmV0dXJuIGl0cyBub24tZWNsaXBzZS1zcGVjaWZpYyBsb2NhdGlvbi4gSWYgdGhpcyByZXNvdXJjZSwgb3IgdHlwZSBvZgogCSAqIHJlc291cmNlLCBpc24ndCBoYW5kbGVkIGJ5IHRoaXMgaGVscGVyLCByZXR1cm4gbnVsbC4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFBvcnRhYmxlTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKIAkJaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkpIHsKIAkJCXJldHVybiBudWxsOwpAQCAtNjEsNiArNjIsNyBAQAogCQlyZXR1cm4gImFwcGxpY2F0aW9uLnhtbCI7IC8vJE5PTi1OTFMtMSQKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE9iamVjdE5hbWUoT2JqZWN0IG9iaikgewogCQlzdXBlci5nZXRUYXJnZXRPYmplY3ROYW1lKG9iaik7CiAKQEAgLTg3LDcgKzg5LDcgQEAKIAkJCWVhckZpbGUgPSAoRUFSRmlsZSlhcmNoaXZlOwogCQkJcmV0dXJuIGFyY2hpdmU7CiAJCX0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIGUxKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nKGUxKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZTEpOwogCQl9CiAJCXJldHVybiBudWxsOwogCX0KQEAgLTk5LDYgKzEwMSw3IEBACiAJCX0KIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgY2xlYW51cChXb3JrYmVuY2hSZXBvcnRlciByZXBvcnRlcikgewogCQlpZiAoZWRpdCAhPSBudWxsKSB7CiAJCQllZGl0LmRpc3Bvc2UoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0aW9uSGVscGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KMkVFVmFsaWRhdGlvbkhlbHBlci5qYXZhCmluZGV4IGIxMDNlYzcuLjA3ODY4MmQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL0oyRUVWYWxpZGF0aW9uSGVscGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vSjJFRVZhbGlkYXRpb25IZWxwZXIuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogCS8qCiAJICogQHNlZSBJV29ya2JlbmNoQ29udGV4dCNnZXRGaWxlKE9iamVjdCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKE9iamVjdCBvYmplY3QpIHsKIAkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwogCQlpZiAob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkKQEAgLTk4LDYgKzk5LDcgQEAKIAkgKiAKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSVdvcmtiZW5jaENvbnRleHQjZ2V0VGFyZ2V0T2JqZWN0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqZWN0KSB7CiAJCWlmIChvYmplY3QgIT0gbnVsbCkKIAkJCXJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL1VJQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL1VJQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3IuamF2YQppbmRleCA3NGVjYzM0Li4xNjQwNzdhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9VSUFwcGxpY2F0aW9uQ2xpZW50VmFsaWRhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vVUlBcHBsaWNhdGlvbkNsaWVudFZhbGlkYXRvci5qYXZhCkBAIC0xNCw4ICsxNCw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uQXBwbGljYXRpb25DbGllbnRWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7CkBAIC00MywxMiArNDMsMTMgQEAKIAkgKiBEb2VzIHRoZSB2YWxpZGF0aW9uLgogCSAqLwogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKQogCSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CiAJCVVJQXBwbGljYXRpb25DbGllbnRIZWxwZXIgaGVscGVyID0gKFVJQXBwbGljYXRpb25DbGllbnRIZWxwZXIpIGluSGVscGVyOwogCQlJUHJvamVjdCBwcm9qID0gKChJV29ya2JlbmNoQ29udGV4dCkgaW5IZWxwZXIpLmdldFByb2plY3QoKTsKIAkJSVZpcnR1YWxDb21wb25lbnQgdmlyQ29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2opOwotICAgICAgICAgICAgaWYoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvaikpIHsKKyAgICAgICAgICAgIGlmKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QocHJvaikpIHsKIAkJCQlJVmlydHVhbEZpbGUgZGRGaWxlID0gdmlyQ29tcC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJKTsKIAkJCQlpZiggZGRGaWxlLmV4aXN0cygpKSB7CQkJCQkJCiAJCQkJCXN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlSW5Kb2IoaGVscGVyLCBpblJlcG9ydGVyKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL1VJRWFyVmFsaWRhdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2oyZWVwbHVnaW4vb3JnL2VjbGlwc2UvanN0L2oyZWUvaW50ZXJuYWwvdmFsaWRhdGlvbi9VSUVhclZhbGlkYXRvci5qYXZhCmluZGV4IDcxNDVmZDUuLjU4ZGJjMWIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvajJlZXBsdWdpbi9vcmcvZWNsaXBzZS9qc3QvajJlZS9pbnRlcm5hbC92YWxpZGF0aW9uL1VJRWFyVmFsaWRhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9qMmVlcGx1Z2luL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ludGVybmFsL3ZhbGlkYXRpb24vVUlFYXJWYWxpZGF0b3IuamF2YQpAQCAtMzYsNyArMzYsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC51dGlsaXR5LkplbVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uRWpiTW9kdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKQEAgLTYxLDcgKzYwLDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSQXJ0aWZhY3RFZGl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY2xhc3NwYXRoZGVwLkNsYXNzcGF0aERlcGVuZGVuY3lFbmFibGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNsYXNzcGF0aGRlcC5EdXBsaWNhdGVDbGFzc3BhdGhDb21wb25lbnRVUklWYWxpZGF0b3JFbmFibGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5FYXJWYWxpZGF0b3I7CkBAIC0xMDcsNiArMTA4LDcgQEAKIAkJc3VwZXIoKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgQ29tbWFuZCBjcmVhdGVWYWxpZGF0ZVhNTENvbW1hbmQoKSB7CiAKIAkJVmFsaWRhdGVYbWxDb21tYW5kIGNtZCA9IChWYWxpZGF0ZVhtbENvbW1hbmQpIHN1cGVyLmNyZWF0ZVZhbGlkYXRlWE1MQ29tbWFuZCgpOwpAQCAtMTE0LDYgKzExNiw3IEBACiAJCXJldHVybiBjbWQ7CiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZU5hbWUoKSB7CiAJCXJldHVybiAoKEVhckhlbHBlcikgX2hlbHBlcikuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKIAl9CkBAIC0xMzIsNiArMTM1LDcgQEAKIAkvKioKIAkgKiAgCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgY2xlYW5VcFN1YlRhc2tNZXNzYWdlcyhFT2JqZWN0IHJlZikgewogCQlTdHJpbmcgZ3JvdXBOYW1lID0gRUpCX1JFRl9HUk9VUF9OQU1FOwogCQlpZiAocmVmIGluc3RhbmNlb2YgRWpiUmVmKQpAQCAtMTYyLDYgKzE2Niw3IEBACiAJCX0KIAl9CiAKKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwQWxsUmVmU3ViVGFza01lc3NhZ2VzKFJlc291cmNlIHJlcykgewogCQlpZiAocmVzICE9IG51bGwpIHsKIAkJCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlcyk7CkBAIC0yMjEsMTggKzIyNiwyMSBAQAogCQllYXJIZWxwZXIgPSBuZXdFYXJIZWxwZXI7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgdmFsaWRhdGVJbkpvYihJVmFsaWRhdGlvbkNvbnRleHQgaW5IZWxwZXIsIElSZXBvcnRlciBpblJlcG9ydGVyKSB0aHJvd3Mgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uIHsKIAkJSVN0YXR1cyBzdGF0dXMgPSBJVmFsaWRhdG9ySm9iLk9LX1NUQVRVUzsKIAkJSVByb2plY3QgZWFyUHJvaiA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGluSGVscGVyKS5nZXRQcm9qZWN0KCk7CiAJCUlWaXJ0dWFsQ29tcG9uZW50IGVhck1vZHVsZSA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclByb2opOwotICAgICAgICAgICAgaWYoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGVhclByb2opKXsKKyAgICAgICAgICAgIGlmKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGVhclByb2opKXsKIAkJCQlJVmlydHVhbEZpbGUgZGRGaWxlID0gZWFyTW9kdWxlLmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fRERfVVJJKTsKIAkJCQlpZiggZGRGaWxlLmV4aXN0cygpKSB7CiAJCQkJCWluUmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyk7CisJCQkJCQogCQkJCQlJVmlydHVhbFJlZmVyZW5jZVtdIGVhclJlZmVyZW5jZXM7CiAJCQkJCWJvb2xlYW4gaXNNaXhlZEVBUiA9IGZhbHNlOwogCQkJCQlib29sZWFuIGlzSmF2YUVFRml2ZVByb2plY3QgPSBmYWxzZTsKIAkJCQkJYm9vbGVhbiBpc0xlZ2FjeUVBUiA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzTGVnYWN5SjJFRVByb2plY3QoZWFyUHJvaik7CisJCQkJCQogCQkJCQkvL2JlY2F1c2Ugb2YgWzIyNDQ4NF0gNS4wIEVBUnMgbWF5IGdldCB0byB0aGlzIHZhbGlkYXRvciB3aGVuIHRoZXkgc2hvdWxkIG5vdCwgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QgdGhpcwogCQkJCQlpZihpc0xlZ2FjeUVBUikgewogCQkJCQkJZWFyUmVmZXJlbmNlcyA9IGVhck1vZHVsZS5nZXRSZWZlcmVuY2VzKCk7CkBAIC0yNDEsNiArMjQ5LDcgQEAKIAkJCQkJCS8vW0J1ZyAgMjQxNTI1XSBuZWVkIHRvIHVzZSByZWZlcmVuY2VkIGNvbXBvbmVudHMgYmVjYXVzZSByZWZlcmVuY2VkIHByb2plY3RzIHJldHVybiB0aGUgRUFSIGZvciByZWZlcmVuY2VkIGJpbmFyeSBhcmNoaXZlcwogCQkJCQkJZm9yKElWaXJ0dWFsUmVmZXJlbmNlIGVhclJlZmVyZW5jZSA6IGVhclJlZmVyZW5jZXMpIHsKIAkJCQkJCQlyZWZlcmVuY2VkQ29tcG9uZW5ldCA9IGVhclJlZmVyZW5jZS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CisJCQkJCQkJCiAJCQkJCQkJLy9bQnVnICAyNDE1MjVdaWYgaXRzIGEgVmlydHVhbEFyY2hpdmVDb21wb25lbnQgdGhlbiB3ZSBuZWVkIHRvIHVzZQogCQkJCQkJCS8vCWNvbXBvbmVudHMgdG8gZ2V0IHZlcnNpb24sIG90aGVyd2lzZSB1c2UgSVByb2plY3QKIAkJCQkJCQlpZihyZWZlcmVuY2VkQ29tcG9uZW5ldCBpbnN0YW5jZW9mIFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7CkBAIC0yNDksNiArMjU4LDcgQEAKIAkJCQkJCQkJZWFyUmVmZWRQcm9qID0gcmVmZXJlbmNlZENvbXBvbmVuZXQuZ2V0UHJvamVjdCgpOwogCQkJCQkJCQlpc0phdmFFRUZpdmVQcm9qZWN0ID0gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKRUVQcm9qZWN0KGVhclJlZmVkUHJvaik7CiAJCQkJCQkJfQorCQkJCQkJCQogCQkJCQkJCWlmKGlzSmF2YUVFRml2ZVByb2plY3QpIHsKIAkJCQkJCQkJIC8vSEFDSzogdGhpcyBpcyBub3JtYWxseSBkb25lIGJ5IHRoZSBjYWxsIHRvIHN1cGVyLnZhbGlkYXRlSW5Kb2IgYnV0IGluIHRoaXMgY2FzZSB3ZSBhcmUgcHVycG9zZWx5IGF2b2lkaW5nIHRoYXQgY2FsbAogCQkJCQkJCQlfcmVwb3J0ZXIgPSBpblJlcG9ydGVyOwpAQCAtMjU2LDcgKzI2Niw5IEBACiAJCQkJCQkJCVN0cmluZ1tdIHBhcmFtcyA9IHtlYXJQcm9qLmdldE5hbWUoKSwgcmVmZXJlbmNlZENvbXBvbmVuZXQuZ2V0TmFtZSgpfTsKIAkJCQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEVBUlZhbGlkYXRpb25NZXNzYWdlUmVzb3VyY2VIYW5kbGVyLkpFRTVfUFJPSkVDVF9SRUZFUkVOQ0VEX0JZX1BSRV9KRUU1X0VBUiwgcGFyYW1zKTsKIAkJCQkJCQkJYWRkTG9jYWxpemVkV2FybmluZyhtc2csZWFyUHJvaik7CisJCQkJCQkJCiAJCQkJCQkJfQorCQkJCQkJCQogCQkJCQkJCS8vaWYgYW55IHJlZmVyZW5jZWQgcHJvamVjdCBpcyBhIEpFRSA1IHByb2plY3QgdGhlbiBlYXIgaXMgbWl4ZWQKIAkJCQkJCQlpZighaXNNaXhlZEVBUikgewogCQkJCQkJCQlpc01peGVkRUFSID0gaXNKYXZhRUVGaXZlUHJvamVjdDsKQEAgLTI2NCwyMSArMjc2LDI2IEBACiAJCQkJCQl9CiAJCQkJCQkKIAkJCQkJfQorCQkJCQkKIAkJCQkJLy9zaG91bGQgb25seSBjb250aW51ZSB2YWxpZGF0aW9uIGlmIHRoaXMgaXMgbm90IGFuIGludmFsaWQgbWl4ZWQgRUFSCiAJCQkJCS8vaXNMZWdhY3lFQVIgY2hlY2sgbmVlZGVkIGJlY2F1c2Ugb2YgWzIyNDQ4NF0gNS4wIEVBUnMgbWF5IGdldCB0byB0aGlzIHZhbGlkYXRvciB3aGVuIHRoZXkgc2hvdWxkIG5vdCwgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QgdGhpcwogCQkJCQlpZihpc0xlZ2FjeUVBUiAmJiAhaXNNaXhlZEVBUikgewogCQkJCQkJc3RhdHVzID0gc3VwZXIudmFsaWRhdGVJbkpvYihpbkhlbHBlciwgaW5SZXBvcnRlcik7CiAJCQkJCQl2YWxpZGF0ZU1vZHVsZU1hcHMoZWFyTW9kdWxlKTsKIAkJCQkJCXZhbGlkYXRlTWFuaWZlc3RzKCk7Ci0JCQkJCQlpZihDbGFzc3BhdGhEZXBlbmRlbmN5RW5hYmxlbWVudC5pc0FsbG93Q2xhc3NwYXRoQ29tcG9uZW50RGVwZW5kZW5jeSgpKXsKKwkJCQkJCWlmKER1cGxpY2F0ZUNsYXNzcGF0aENvbXBvbmVudFVSSVZhbGlkYXRvckVuYWJsZW1lbnQuc2hvdWxkVmFsaWRhdGVEdXBsaWNhdGVDbGFzc3BhdGhDb21wb25lbnRVUkkoKSl7CiAJCQkJCQkJdmFsaWRhdGVEdXBsaWNhdGVDbGFzc3BhdGhDb21wb25lbnRVUklzKGVhck1vZHVsZSk7CiAJCQkJCQl9CisJCS8vCQkJCXZhbGlkYXRlVXRpbEphck1hcHMoZWFyRWRpdCxlYXJNb2R1bGUpOworCQkvLwkJCQl2YWxpZGF0ZVVyaUFscmVhZHlFeGlzdHNJbkVhcihlYXJFZGl0LGVhck1vZHVsZSk7CisJCS8vCQkJCXZhbGlkYXRlRG9jVHlwZShlYXJFZGl0LGVhck1vZHVsZSk7CiAJCQkJCX0KIAkJCQl9CiAgICAgICAgICAgICB9CiAJCXJldHVybiBzdGF0dXM7CiAJfQkKIAorCUBPdmVycmlkZQogCXB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgewogCQlJU2NoZWR1bGluZ1J1bGUgY29tYmluZWRSdWxlID0gbnVsbDsKIAkJSVByb2plY3QgcHJvamVjdCA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwpAQCAtNDEyLDExICs0MjksOSBAQAogCQl0cnl7CiAJCQltYW5pZmVzdCA9IGFuQXJjaGl2ZS5nZXRNYW5pZmVzdCgpOwogCQl9Y2F0Y2goIE1hbmlmZXN0RXhjZXB0aW9uIG1mKXsKLQkJCS8vbWYucHJpbnRTdGFja1RyYWNlKCk7CiAJCQltZi5nZXRNZXNzYWdlKCk7CiAJCQlTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1tde2FuQXJjaGl2ZS5nZXRVUkkoKX07CiAJCQlTdHJpbmcgdG1wID0gTkxTLmJpbmQoRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuRVJST1JfUkVBRElOR19NQU5JRkVTVF9FUlJPUl8sIGFyZ3MpOwotCQkJCiAJCQlhZGRMb2NhbGl6ZWRFcnJvcih0bXAsIGFyZ3MpOwogCQl9CiAJCQpAQCAtNDkzLDcgKzUwOCw2IEBACiAJfQogCiAJcHJvdGVjdGVkIHZvaWQgYWRkTGluZUxlbmd0aEVycm9yKEFyY2hpdmUgYW5BcmNoaXZlLCBJRmlsZSB0YXJnZXQsIGludCBsaW5lTm8pIHsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIxODY2NyAtIENoYW5naW5nIHRoaXMgdG8gd2FybmluZwogCQlTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1syXTsKIAkJYXJnc1swXSA9IEludGVnZXIudG9TdHJpbmcobGluZU5vKTsKIAkJYXJnc1sxXSA9IGFuQXJjaGl2ZS5nZXRVUkkoKTsKQEAgLTUwMSw5ICs1MTUsOSBAQAogCQlTdHJpbmcgdG1wID0gTkxTLmJpbmQoRUFSVmFsaWRhdGlvbk1lc3NhZ2VSZXNvdXJjZUhhbmRsZXIuTUFOSUZFU1RfTElORV9FWENFRURTX0xFTkdUSF9FUlJPUl8sIGFyZ3MpOwogCQkKIAkJaWYoIGxpbmVObyA+PSAwICl7Ci0JCQlhZGRMb2NhbGl6ZWRXYXJuaW5nKHRtcCwgdGFyZ2V0LCBNQU5JRkVTVF9HUk9VUF9OQU1FLCBsaW5lTm8gKTsKKwkJCWFkZExvY2FsaXplZEVycm9yKHRtcCwgdGFyZ2V0LCBNQU5JRkVTVF9HUk9VUF9OQU1FLCBsaW5lTm8gKTsKIAkJfWVsc2V7Ci0JCQlhZGRMb2NhbGl6ZWRXYXJuaW5nKHRtcCwgdGFyZ2V0LCBNQU5JRkVTVF9HUk9VUF9OQU1FICk7CisJCQlhZGRMb2NhbGl6ZWRFcnJvcih0bXAsIHRhcmdldCwgTUFOSUZFU1RfR1JPVVBfTkFNRSApOwogCQl9CiAKIAl9CkBAIC01MjAsNyArNTM0LDcgQEAKIAl9CiAKIAlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVNYW5pZmVzdEV4Y2VwdGlvbihJT0V4Y2VwdGlvbiBleCwgQXJjaGl2ZSBhbkFyY2hpdmUpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKKwkJSjJFRVBsdWdpbi5sb2dFcnJvcihleCk7CiAJCVN0cmluZyB0bXAgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5FUlJPUl9SRUFESU5HX01BTklGRVNUX0VSUk9SXywgbmV3IFN0cmluZ1tde2FuQXJjaGl2ZS5nZXRVUkkoKX0pOwkJCiAJCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCB0bXApOwogCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihtZXNzYWdlLCBleCk7CkBAIC02OTIsMTMgKzcwNiwxMyBAQAogCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTW9kdWxlVVJJRXh0ZW5zaW9uKE1vZHVsZSBtb2R1bGUpIHsKIAkJU3RyaW5nIG5ld1VyaSA9IG1vZHVsZS5nZXRVcmkoKTsKIAkJaWYgKG5ld1VyaSAhPSBudWxsICYmIG5ld1VyaS5sZW5ndGgoKSA+IDApIHsKLQkJCWlmIChtb2R1bGUgaW5zdGFuY2VvZiBFamJNb2R1bGUgJiYgIW5ld1VyaS5lbmRzV2l0aCgiLmphciIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChtb2R1bGUgaW5zdGFuY2VvZiBFamJNb2R1bGUgJiYgIW5ld1VyaS5lbmRzV2l0aChJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUKSkgewogCQkJCVN0cmluZ1tdIHBhcmFtcyA9IG5ldyBTdHJpbmdbMV07CiAJCQkJcGFyYW1zWzBdID0gbW9kdWxlLmdldFVyaSgpOwogCQkJCUlSZXNvdXJjZSB0YXJnZXQgPSBlYXJIZWxwZXIuZ2V0UHJvamVjdCgpLmdldEZpbGUoQXJjaGl2ZUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpOwogCQkJCVN0cmluZyB0bXAgPSBOTFMuYmluZChFQVJWYWxpZGF0aW9uTWVzc2FnZVJlc291cmNlSGFuZGxlci5JTlZBTElEX1VSSV9GT1JfTU9EVUxFX0VSUk9SXywgcGFyYW1zKTsKIAkJCQlhZGRMb2NhbGl6ZWRXYXJuaW5nKHRtcCwgdGFyZ2V0KTsKLQkJCX0gZWxzZSBpZiAobW9kdWxlIGluc3RhbmNlb2YgV2ViTW9kdWxlICYmICFuZXdVcmkuZW5kc1dpdGgoIi53YXIiKSkgeyAvLyROT04tTkxTLTEkCisJCQl9IGVsc2UgaWYgKG1vZHVsZSBpbnN0YW5jZW9mIFdlYk1vZHVsZSAmJiAhbmV3VXJpLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLldBUl9FWFQpKSB7CiAJCQkJU3RyaW5nW10gcGFyYW1zID0gbmV3IFN0cmluZ1sxXTsKIAkJCQlwYXJhbXNbMF0gPSBtb2R1bGUuZ2V0VXJpKCk7CiAJCQkJSVJlc291cmNlIHRhcmdldCA9IGVhckhlbHBlci5nZXRQcm9qZWN0KCkuZ2V0RmlsZShBcmNoaXZlQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSk7CkBAIC03MDksMTIgKzcyMywxNCBAQAogCX0KIAkKIAorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7CiAJCWlmIChlYXJIZWxwZXIgIT0gbnVsbCkKIAkJCWVhckhlbHBlci5jbG9zZUVBUkZpbGUoKTsKIAkJc3VwZXIuY2xlYW51cChyZXBvcnRlcik7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgY2xlYW51cCgpIHsKIAogCX0KQEAgLTc4MSwxMiArNzk3LDEzIEBACiAJCQkJCQlhZGRMb2NhbGl6ZWRXYXJuaW5nKHRtcCwgYXBwREQpOwogCQkJCQl9CiAJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoaWFlKTsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihpYWUpOwogCQkJCX0KIAkJCX0KIAkJfQogCX0KIAorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKEVPYmplY3QgZU9iamVjdCwgU3RyaW5nIGdyb3VwTmFtZSkgewogCQlSZXNvdXJjZSByZXMgPSBlT2JqZWN0LmVSZXNvdXJjZSgpOwogCQlpZihyZXMgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9sdGtiYXNlZHJlZmFjdG9yaW5nL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvbHRrL2NvcmUvY2hhbmdlL0RlbGV0ZUVKQkNsaWVudFByb2plY3RDaGFuZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvbHRrYmFzZWRyZWZhY3RvcmluZy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2x0ay9jb3JlL2NoYW5nZS9EZWxldGVFSkJDbGllbnRQcm9qZWN0Q2hhbmdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg5YmRmOQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvbHRrYmFzZWRyZWZhY3RvcmluZy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2x0ay9jb3JlL2NoYW5nZS9EZWxldGVFSkJDbGllbnRQcm9qZWN0Q2hhbmdlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmx0ay5jb3JlLmNoYW5nZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlJlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmx0ay5jb3JlLm5scy5SZWZhY3RvcmluZ1Jlc291cmNlSGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKKworcHVibGljIGNsYXNzIERlbGV0ZUVKQkNsaWVudFByb2plY3RDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2V7CisKKwlJUHJvamVjdCBlamJDbGllbnRQcm9qZWN0ID0gbnVsbDsKKwkKKwlwdWJsaWMgRGVsZXRlRUpCQ2xpZW50UHJvamVjdENoYW5nZShJUHJvamVjdCBjbGllbnRQcm9qLCBib29sZWFuIGZvcmNlT3V0T2ZTeW5jLCBib29sZWFuIGZvcmNlRGVsZXRlKSB7CisJCWVqYkNsaWVudFByb2plY3QgPSBjbGllbnRQcm9qOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlpZighZWpiQ2xpZW50UHJvamVjdC5pc0FjY2Vzc2libGUoKSkKKwkJCXJldHVybiBudWxsOworCQl0cnl7CisJCQllamJDbGllbnRQcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKwkJfWNhdGNoKFJlc291cmNlRXhjZXB0aW9uIGUpeworCQkJZWpiQ2xpZW50UHJvamVjdC5kZWxldGUoZmFsc2UsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworCQl9CisJCXJldHVybiBudWxsOworCQkKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlTdHJpbmcgbmFtZSA9IE5MUy5iaW5kKAorCQkJCVJlZmFjdG9yaW5nUmVzb3VyY2VIYW5kbGVyLkRlbGV0ZV9FSkJfQ2xpZW50X1Byb2plY3QsCisJCQkJbmV3IE9iamVjdFtdIHsgZWpiQ2xpZW50UHJvamVjdC5nZXROYW1lKCl9KTsKKwkJcmV0dXJuIG5hbWU7CQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sCisJCQlPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CisJCXJldHVybiBudWxsOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvbHRrYmFzZWRyZWZhY3RvcmluZy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2x0ay9jb3JlL2NoYW5nZS9FQVJSZWZlcmVuY2VSZW1vdmVDaGFuZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvbHRrYmFzZWRyZWZhY3RvcmluZy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2x0ay9jb3JlL2NoYW5nZS9FQVJSZWZlcmVuY2VSZW1vdmVDaGFuZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWZlOTBhCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9sdGtiYXNlZHJlZmFjdG9yaW5nL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvbHRrL2NvcmUvY2hhbmdlL0VBUlJlZmVyZW5jZVJlbW92ZUNoYW5nZS5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUubHRrLmNvcmUuY2hhbmdlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5jbGFzc3BhdGguSjJFRUNvbXBvbmVudENsYXNzcGF0aFVwZGF0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSUVBUk1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5sdGsuY29yZS5ubHMuUmVmYWN0b3JpbmdSZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcHBsaWNhdGlvbi5JQ29tbW9uQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcHBsaWNhdGlvbi5JQ29tbW9uTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKKworCitwdWJsaWMgY2xhc3MgRUFSUmVmZXJlbmNlUmVtb3ZlQ2hhbmdlIGV4dGVuZHMgQ2hhbmdlIHsKKworCQorCXB1YmxpYyBFQVJSZWZlcmVuY2VSZW1vdmVDaGFuZ2UoSVByb2plY3QgcmVmZXJlbmNpbmdFQVJQcm9qZWN0LCBJUHJvamVjdCBwcm9qZWN0VG9SZW1vdmUpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5yZWZlcmVuY2luZ0VBUlByb2plY3QgPSByZWZlcmVuY2luZ0VBUlByb2plY3Q7CisJCXRoaXMucHJvamVjdFRvUmVtb3ZlID0gcHJvamVjdFRvUmVtb3ZlOworCQl0aGlzLnJlZmVyZW5jaW5nRUFSUHJvamVjdENvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChyZWZlcmVuY2luZ0VBUlByb2plY3QpOworCQljYWNoZWRSZWZzID0gcmVmZXJlbmNpbmdFQVJQcm9qZWN0Q29tcC5nZXRSZWZlcmVuY2VzKCk7CisJCXRoaXMucHJvamVjdFRvUmVtb3ZlQ29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3RUb1JlbW92ZSk7CisJCWVhck1vZGVsID0gKElFQVJNb2RlbFByb3ZpZGVyKU1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocmVmZXJlbmNpbmdFQVJQcm9qZWN0KTsKKwkJbW9kdWxlVVJJID0gZWFyTW9kZWwuZ2V0TW9kdWxlVVJJKHByb2plY3RUb1JlbW92ZUNvbXApOworCX0KKworCUlQcm9qZWN0IHJlZmVyZW5jaW5nRUFSUHJvamVjdCA9IG51bGw7CisJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNpbmdFQVJQcm9qZWN0Q29tcCA9IG51bGw7CisJSVByb2plY3QgcHJvamVjdFRvUmVtb3ZlID0gbnVsbDsKKwlJVmlydHVhbENvbXBvbmVudCBwcm9qZWN0VG9SZW1vdmVDb21wID0gbnVsbDsKKwlJVmlydHVhbFJlZmVyZW5jZVtdIGNhY2hlZFJlZnMgPSBudWxsOworCUlFQVJNb2RlbFByb3ZpZGVyIGVhck1vZGVsID0gbnVsbDsKKwlTdHJpbmcgbW9kdWxlVVJJID0gbnVsbDsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlTdHJpbmcgbmFtZSA9IE5MUy5iaW5kKCBSZWZhY3RvcmluZ1Jlc291cmNlSGFuZGxlci5SZW1vdmVfSmF2YUVFX1JlZmVyZW5jZXMsIAorCQkJCW5ldyBPYmplY3RbXSB7cHJvamVjdFRvUmVtb3ZlLmdldE5hbWUoKX0pOworCQluYW1lICs9IHJlZmVyZW5jaW5nRUFSUHJvamVjdC5nZXROYW1lKCk7CisJCXJldHVybiBuYW1lOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGlzVmFsaWQoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sCisJCQlPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7CisJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENoYW5nZSBwZXJmb3JtKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJdXBkYXRlRUFSREQoKTsKKwkJcmVtb3ZlUmVmZXJlbmNlZENvbXBvbmVudHMocG0pOworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIENoYW5nZURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCQorCXByaXZhdGUgdm9pZCB1cGRhdGVFQVJERCgpIHsKKwkJaWYgKCFyZWZlcmVuY2luZ0VBUlByb2plY3QuaXNBY2Nlc3NpYmxlKCkpCisJCQlyZXR1cm47CisJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGVFQVIocmVmZXJlbmNpbmdFQVJQcm9qZWN0KTsKKwkJYm9vbGVhbiBtb2R1bGVJblhNTCA9IGZhbHNlOworCQkvL0NoZWNrIGlmIG1vZHVsZSB0byByZW1vdmUgaXMgaW4geG1sCisJCUlDb21tb25BcHBsaWNhdGlvbiBtZXJnZWRBcHAgPSAoSUNvbW1vbkFwcGxpY2F0aW9uKWVhck1vZGVsLmdldE1vZGVsT2JqZWN0KCk7CisJCUlDb21tb25Nb2R1bGUgbW9kdWxlID0gbWVyZ2VkQXBwLmdldEZpcnN0RUFSTW9kdWxlKG1vZHVsZVVSSSk7CisJCWlmIChtb2R1bGUgIT0gbnVsbCkgeworCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKEVPYmplY3QpbW9kdWxlKTsKKwkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSkKKwkJCQltb2R1bGVJblhNTCA9IHRydWU7CisJCX0KKwkJZWFyTW9kZWwubW9kaWZ5KG5ldyBSdW5uYWJsZSgpIHsKKwkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQlJQ29tbW9uQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSAoSUNvbW1vbkFwcGxpY2F0aW9uKWVhck1vZGVsLmdldE1vZGVsT2JqZWN0KCk7CisJCQkJaWYgKGFwcGxpY2F0aW9uID09IG51bGwpCisJCQkJCXJldHVybjsKKwkJCQlJVmlydHVhbENvbXBvbmVudCBtb2R1bGVDb21wb25lbnQgPSBwcm9qZWN0VG9SZW1vdmVDb21wLmdldENvbXBvbmVudCgpOworCQkJCWlmKCFtb2R1bGVDb21wb25lbnQuaXNCaW5hcnkoKSl7CisJCQkJCUoyRUVDb21wb25lbnRDbGFzc3BhdGhVcGRhdGVyLmdldEluc3RhbmNlKCkucXVldWVVcGRhdGVNb2R1bGUobW9kdWxlQ29tcG9uZW50LmdldFByb2plY3QoKSk7CisJCQkJfQorCQkJCQorCQkJCXJlbW92ZU1vZHVsZShhcHBsaWNhdGlvbiwgbW9kdWxlVVJJKTsgCisJCQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gcmVmZXJlbmNpbmdFQVJQcm9qZWN0Q29tcC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShtb2R1bGVVUkkpOworCQkJCUlGaWxlIGlGaWxlID0gdkZpbGUuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKKwkJCQlpZihpRmlsZS5leGlzdHMoKSl7CisJCQkJCXRyeSB7CisJCQkJCQlpRmlsZS5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQorCQkJfQorCQl9LCBudWxsKTsKKwkJLy9JZiBjaGFuZ2UgaXMgdG8gIm1lcmdlZCBtb2RlbCIgb25seSAtIHJlbW92ZSBmcm9tIG1lcmdlZCBtb2RlbAorCQlpZiAoIW1vZHVsZUluWE1MKQorCQkJbWVyZ2VkQXBwLmdldEVBUk1vZHVsZXMoKS5yZW1vdmUobW9kdWxlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTW9kdWxlKElDb21tb25BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgU3RyaW5nIG1vZHVsZVVSSSkgeworCQlJQ29tbW9uTW9kdWxlIG1vZHVsZSA9IGFwcGxpY2F0aW9uLmdldEZpcnN0RUFSTW9kdWxlKG1vZHVsZVVSSSk7CisJCWFwcGxpY2F0aW9uLmdldEVBUk1vZHVsZXMoKS5yZW1vdmUobW9kdWxlKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVmZXJlbmNlZENvbXBvbmVudHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQorCQlpZiAocmVmZXJlbmNpbmdFQVJQcm9qZWN0Q29tcCA9PSBudWxsIHx8ICFyZWZlcmVuY2luZ0VBUlByb2plY3RDb21wLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSB8fCByZWZlcmVuY2luZ0VBUlByb2plY3RDb21wLmlzQmluYXJ5KCkpIHJldHVybjsKKwkJCisJCUlWaXJ0dWFsUmVmZXJlbmNlIFtdIGV4aXN0aW5nUmVmZXJlbmNlc0FycmF5ID0gY2FjaGVkUmVmczsKKwkJaWYoZXhpc3RpbmdSZWZlcmVuY2VzQXJyYXkgPT0gbnVsbCB8fCBleGlzdGluZ1JlZmVyZW5jZXNBcnJheS5sZW5ndGggPT0gMCl7CisJCQlyZXR1cm47CisJCX0KKwkJTGlzdCBleGlzdGluZ1JlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvcihpbnQgaT0wO2k8ZXhpc3RpbmdSZWZlcmVuY2VzQXJyYXkubGVuZ3RoOyBpKyspeworCQkJZXhpc3RpbmdSZWZlcmVuY2VzLmFkZChleGlzdGluZ1JlZmVyZW5jZXNBcnJheVtpXSk7CisJCX0KKwkJTGlzdCB0YXJnZXRwcm9qZWN0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJaWYgKHByb2plY3RUb1JlbW92ZUNvbXA9PW51bGwgKQorCQkJCXJldHVybjsKKwkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gZmluZE1hdGNoaW5nUmVmZXJlbmNlKGV4aXN0aW5nUmVmZXJlbmNlcywgcHJvamVjdFRvUmVtb3ZlQ29tcCwgbnVsbCk7CisJCS8vaWYgYSByZWYgd2FzIGZvdW5kIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgZGVwbG95UGF0aCwgdGhlbiByZW1vdmUgaXQKKwkJaWYocmVmICE9IG51bGwpeworCQkJcmVtb3ZlUmVmZXJlbmVjZUluQ29tcG9uZW50KHJlZmVyZW5jaW5nRUFSUHJvamVjdENvbXAsIHJlZik7CisJCQlleGlzdGluZ1JlZmVyZW5jZXMucmVtb3ZlKHJlZik7CisJCQkvL2FmdGVyIHJlbW92aW5nIHRoZSByZWYsIGNoZWNrIHRvIHNlZSBpZiBpdCB3YXMgdGhlIGxhc3QgcmVmIHJlbW92ZWQgdG8gdGhhdCBjb21wb25lbnQKKwkJCS8vYW5kIGlmIGl0IHdhcywgdGhlbiBhbHNvIHJlbW92ZSB0aGUgcHJvamVjdCByZWZlcmVuY2UKKwkJCXJlZiA9IGZpbmRNYXRjaGluZ1JlZmVyZW5jZShleGlzdGluZ1JlZmVyZW5jZXMsIHByb2plY3RUb1JlbW92ZUNvbXApOworCQkJaWYocmVmID09IG51bGwpeworCQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSBwcm9qZWN0VG9SZW1vdmVDb21wLmdldFByb2plY3QoKTsKKwkJCQl0YXJnZXRwcm9qZWN0TGlzdC5hZGQodGFyZ2V0UHJvamVjdCk7CisJCQl9CisJCX0KKwkJCisJCXRyeSB7CisJCQlQcm9qZWN0VXRpbGl0aWVzLnJlbW92ZVJlZmVyZW5jZVByb2plY3RzKHJlZmVyZW5jaW5nRUFSUHJvamVjdENvbXAuZ2V0UHJvamVjdCgpLHRhcmdldHByb2plY3RMaXN0KTsKKwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOworCQl9CQkKKwkJCisJfQorCQorCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2UgZmluZE1hdGNoaW5nUmVmZXJlbmNlKExpc3QgZXhpc3RpbmdSZWZlcmVuY2VzLCBJVmlydHVhbENvbXBvbmVudCBjb21wKSB7CisJCXJldHVybiBmaW5kTWF0Y2hpbmdSZWZlcmVuY2UoZXhpc3RpbmdSZWZlcmVuY2VzLCBjb21wLCBudWxsKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZWZlcmVuZWNlSW5Db21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJKChWaXJ0dWFsQ29tcG9uZW50KWNvbXBvbmVudC5nZXRDb21wb25lbnQoKSkucmVtb3ZlUmVmZXJlbmNlKHJlZmVyZW5jZSk7CisJfQorCQorCXByaXZhdGUgSVZpcnR1YWxSZWZlcmVuY2UgZmluZE1hdGNoaW5nUmVmZXJlbmNlKExpc3QgZXhpc3RpbmdSZWZlcmVuY2VzLCBJVmlydHVhbENvbXBvbmVudCBjb21wLCBJUGF0aCBwYXRoKSB7CisJCWZvcihpbnQgaT0wO2k8ZXhpc3RpbmdSZWZlcmVuY2VzLnNpemUoKTsgaSsrKXsKKwkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IChJVmlydHVhbFJlZmVyZW5jZSlleGlzdGluZ1JlZmVyZW5jZXMuZ2V0KGkpOworCQkJSVZpcnR1YWxDb21wb25lbnQgYyA9IHJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CisJCQlpZihjICE9IG51bGwgJiYgYy5nZXROYW1lKCkuZXF1YWxzKGNvbXAuZ2V0TmFtZSgpKSl7CisJCQkJaWYocGF0aCA9PSBudWxsKXsKKwkJCQkJcmV0dXJuIHJlZjsKKwkJCQl9IGVsc2UgaWYocGF0aC5lcXVhbHMocmVmLmdldFJ1bnRpbWVQYXRoKCkpKXsKKwkJCQkJcmV0dXJuIHJlZjsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvbHRrYmFzZWRyZWZhY3RvcmluZy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2x0ay9jb3JlL2NoYW5nZS9Ob25FQVJNb2R1bGVSZWZlcmVuY2VSZW1vdmVDaGFuZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvbHRrYmFzZWRyZWZhY3RvcmluZy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2x0ay9jb3JlL2NoYW5nZS9Ob25FQVJNb2R1bGVSZWZlcmVuY2VSZW1vdmVDaGFuZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDNkNjU5Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9sdGtiYXNlZHJlZmFjdG9yaW5nL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvbHRrL2NvcmUvY2hhbmdlL05vbkVBUk1vZHVsZVJlZmVyZW5jZVJlbW92ZUNoYW5nZS5qYXZhCkBAIC0wLDAgKzEsMzM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUubHRrLmNvcmUuY2hhbmdlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uQ3JlYXRpb25Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUubHRrLmNvcmUubmxzLlJlZmFjdG9yaW5nUmVzb3VyY2VIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOworCisKK3B1YmxpYyBjbGFzcyBOb25FQVJNb2R1bGVSZWZlcmVuY2VSZW1vdmVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgeworCisJCisJcHVibGljIE5vbkVBUk1vZHVsZVJlZmVyZW5jZVJlbW92ZUNoYW5nZShJUHJvamVjdCByZWZlcmVuY2luZ0VBUlByb2plY3QsIElQcm9qZWN0IHByb2plY3RUb1JlbW92ZSkgeworCQlzdXBlcigpOworCQl0aGlzLnJlZmVyZW5jaW5nTW9kdWxlUHJvamVjdCA9IHJlZmVyZW5jaW5nRUFSUHJvamVjdDsKKwkJdGhpcy5wcm9qZWN0VG9SZW1vdmUgPSBwcm9qZWN0VG9SZW1vdmU7CisJCXRoaXMucmVmZXJlbmNpbmdNb2R1bGVQcm9qZWN0Q29tcCA9IChWaXJ0dWFsQ29tcG9uZW50KUNvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHJlZmVyZW5jaW5nRUFSUHJvamVjdCk7CisJCWNhY2hlZFJlZnMgPSByZWZlcmVuY2luZ01vZHVsZVByb2plY3RDb21wLmdldFJlZmVyZW5jZXMoKTsKKwkJdGhpcy5wcm9qZWN0VG9SZW1vdmVDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdFRvUmVtb3ZlKTsKKwl9CisJCisJSVByb2plY3QgcmVmZXJlbmNpbmdNb2R1bGVQcm9qZWN0ID0gbnVsbDsKKwlWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jaW5nTW9kdWxlUHJvamVjdENvbXAgPSBudWxsOworCUlQcm9qZWN0IHByb2plY3RUb1JlbW92ZSA9IG51bGw7CisJSVZpcnR1YWxDb21wb25lbnQgcHJvamVjdFRvUmVtb3ZlQ29tcCA9IG51bGw7CisJSVZpcnR1YWxSZWZlcmVuY2VbXSBjYWNoZWRSZWZzID0gbnVsbDsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQkKKwkJU3RyaW5nIG5hbWUgPSBOTFMuYmluZCgKKwkJCQlSZWZhY3RvcmluZ1Jlc291cmNlSGFuZGxlci5SZW1vdmVfSmF2YUVFX1JlZmVyZW5jZXMsCisJCQkJbmV3IE9iamVjdFtdIHtwcm9qZWN0VG9SZW1vdmUuZ2V0TmFtZSgpfSk7CisJCQorCQluYW1lICs9IHJlZmVyZW5jaW5nTW9kdWxlUHJvamVjdC5nZXROYW1lKCk7CisJCXJldHVybiBuYW1lOworCQkKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgeworCQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLAorCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24geworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQkKKwkJdHJ5IHsKKwkJCXJlbW92ZU1vZHVsZURlcGVuZGVuY3koKTsKKwkJCWlmKGlzRUpCQ2xpZW50RGVsZXRpb24oKSl7CisJCQkJdXBkYXRlRUpCRERXaXRoRUpCQ2xpZW50RGVsZXRpb24oKTsKKwkJCX0KKwkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBDaGFuZ2VEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7CisJCXJldHVybiBudWxsOworCX0KKwkKKwlwcml2YXRlIGJvb2xlYW4gaXNFSkJDbGllbnREZWxldGlvbigpeworCQkKKwkJaWYoIUphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHJlZmVyZW5jaW5nTW9kdWxlUHJvamVjdCkpCisJCQlyZXR1cm4gZmFsc2U7CisJCVByb3BlcnRpZXMgcHJvcHMgPSByZWZlcmVuY2luZ01vZHVsZVByb2plY3RDb21wLmdldE1ldGFQcm9wZXJ0aWVzKCk7CisJCVN0cmluZyBjbGllbnRDb21wTmFtZSA9IHByb3BzLmdldFByb3BlcnR5KENyZWF0aW9uQ29uc3RhbnRzLkVKQl9DTElFTlRfTkFNRSk7CisJCWlmKGNsaWVudENvbXBOYW1lID09IG51bGwgfHwgY2xpZW50Q29tcE5hbWUubGVuZ3RoKCkgPT0gMCl7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJCQorCQkgaWYoY2xpZW50Q29tcE5hbWUuZXF1YWxzKHByb2plY3RUb1JlbW92ZS5nZXROYW1lKCkpKXsKKwkJCSByZXR1cm4gdHJ1ZTsKKwkJIH0KKwkgICAgICAgIHJldHVybiBmYWxzZTsKKwl9CisJCisJCisJLyoKKwkgKiBSZW1vdmUgdGhlIGNsaWVudCBKQVIgZW50cnkgZnJvbSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCisJICogVGhpcyBtZXRob2QgaXMgdG8gYmUgdXNlZCBvbmx5IHRvIHJlbW92ZSBFSkIgQ2xpZW50IGphciBlbnRyeSBmcm9tCisJICogRUpCIERECisJICovCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZUVKQkREV2l0aEVKQkNsaWVudERlbGV0aW9uKCkgeworCQlJTW9kZWxQcm92aWRlciBlamJNb2RlbCA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocmVmZXJlbmNpbmdNb2R1bGVQcm9qZWN0KTsKKyAgICAgICAgZWpiTW9kZWwubW9kaWZ5KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBJTW9kZWxQcm92aWRlciB3cml0YWJsZUVqYk1vZGVsID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihyZWZlcmVuY2luZ01vZHVsZVByb2plY3QpOworICAgICAgICAgICAgICAgIE9iamVjdCBtb2RlbE9iamVjdCA9IHdyaXRhYmxlRWpiTW9kZWwuZ2V0TW9kZWxPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyIGVqYnJlcyA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXIpIHdyaXRhYmxlRWpiTW9kZWwuZ2V0TW9kZWxPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVqYnJlcyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAJZWpicmVzLnNldEVqYkNsaWVudEphcihudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIgZWpicmVzID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXIpIHdyaXRhYmxlRWpiTW9kZWwuZ2V0TW9kZWxPYmplY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgZWpicmVzLnNldEVqYkNsaWVudEphcihudWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAJUHJvcGVydGllcyBwcm9wcyA9IHJlZmVyZW5jaW5nTW9kdWxlUHJvamVjdENvbXAuZ2V0TWV0YVByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIAlwcm9wcy5yZW1vdmUoQ3JlYXRpb25Db25zdGFudHMuQ0xJRU5UX0pBUl9VUkkpOworICAgICAgICAgICAgCXByb3BzLnJlbW92ZShDcmVhdGlvbkNvbnN0YW50cy5FSkJfQ0xJRU5UX05BTUUpOworICAgICAgICAgICAgCXJlZmVyZW5jaW5nTW9kdWxlUHJvamVjdENvbXAuY2xlYXJNZXRhUHJvcGVydGllcygpOworICAgICAgICAgICAgCXJlZmVyZW5jaW5nTW9kdWxlUHJvamVjdENvbXAuc2V0TWV0YVByb3BlcnRpZXMocHJvcHMpOworICAgICAgICAgCQkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSxudWxsKTsKKwl9CisKKwkKKwkKKwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNb2R1bGVEZXBlbmRlbmN5KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCQorCQkvLyBjcmVhdGUgSVZpcnR1YWxDb21wb25lbnRzIGZvciB0aGUgZGVwZW5kZW50IGFuZCB0aGUgcmVmYWN0b3JlZCBwcm9qZWN0CisJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHJlZmFjdG9yZWRDb21wID0gcHJvamVjdFRvUmVtb3ZlQ29tcDsKKwkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJLy8gRG9lcyB0aGUgZGVwZW5kZW50IHByb2plY3QgaGF2ZSBhIC5jb21wb25lbnQgcmVmZXJlbmNlIG9uIHRoZSByZWZhY3RvcmVkIHByb2plY3Q/CisJCQorCQkvLyByZW1vdmUgdGhlIGNvbXBvbmVudCByZWZlcmVuY2Ugb24gdGhlIGRlbGV0ZWQgcHJvamVjdAorCQlpZiAocmVmYWN0b3JlZENvbXAgIT0gbnVsbCkgeworCQkJcmVtb3ZlUmVmZXJlbmNlZENvbXBvbmVudHMobW9uaXRvcik7CisJCX0KKwkJCisJCS8vIHVwZGF0ZSB0aGUgbWFuaWZlc3QKKwkJCXVwZGF0ZU1hbmlmZXN0RGVwZW5kZW5jeSh0cnVlKTsKKwl9CisJCisJCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWFuaWZlc3REZXBlbmRlbmN5KGZpbmFsIGJvb2xlYW4gcmVtb3ZlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKwkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgZGVwZW5kZW50Q29tcCA9IHJlZmVyZW5jaW5nTW9kdWxlUHJvamVjdENvbXA7CisJCUlQcm9qZWN0IHByb2plY3Q9IGRlcGVuZGVudENvbXAuZ2V0UHJvamVjdCgpOworCQlpZihwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKXsKKwkJCWZpbmFsIFN0cmluZyBkZXBlbmRlbnRQcm9qTmFtZSA9IHJlZmVyZW5jaW5nTW9kdWxlUHJvamVjdC5nZXROYW1lKCk7CisJCQlmaW5hbCBTdHJpbmcgcmVmYWN0b3JlZFByb2pOYW1lID0gcHJvamVjdFRvUmVtb3ZlLmdldE5hbWUoKTsKKwkJCWZpbmFsIElWaXJ0dWFsRmlsZSB2ZiA9IGRlcGVuZGVudENvbXAuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NQU5JRkVTVF9VUkkpICk7CisJCQlmaW5hbCBJRmlsZSBtYW5pZmVzdG1mID0gdmYuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKKwkJCS8vIGFkZGluZyB0aGlzIGNoZWNrIGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTcwMDc0CisJCQkvLyAoc29tZSBhZG9wdGVycyBoYXZlIG5vbi1qc3QuZWFyIG1vZHVsZSBwcm9qZWN0cyB0aGF0IGFyZSBtaXNzaW5nIG1hbmlmZXN0cykKKwkJCWlmICghbWFuaWZlc3RtZi5leGlzdHMoKSkgeyAgCisJCQkJcmV0dXJuOworCQkJfQorCQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKKwkJCWZpbmFsIElEYXRhTW9kZWwgdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlcigpKTsKKwkJCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIGRlcGVuZGVudFByb2pOYW1lKTsKKwkJCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShVcGRhdGVNYW5pZmVzdERhdGFNb2RlbFByb3BlcnRpZXMuTUVSR0UsIGZhbHNlKTsKKwkJCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5NQU5JRkVTVF9GSUxFLCBtYW5pZmVzdG1mKTsKKwkJCWZpbmFsIEFyY2hpdmVNYW5pZmVzdCBtYW5pZmVzdCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLnJlYWRNYW5pZmVzdChtYW5pZmVzdG1mKTsKKwkJCVN0cmluZ1tdIGNwID0gbWFuaWZlc3QuZ2V0Q2xhc3NQYXRoVG9rZW5pemVkKCk7CisJCQlMaXN0IGNwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKwkJCVN0cmluZyBuZXdqYXJDcCA9IHJlZmFjdG9yZWRQcm9qTmFtZSArIElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQ7CisJCQlTdHJpbmcgbmV3cmFyQ3AgPSByZWZhY3RvcmVkUHJvak5hbWUgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhUOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjcC5sZW5ndGg7IGkrKykgeworCQkJCWlmICghY3BbaV0uZXF1YWxzKG5ld2phckNwKSAmJiAhY3BbaV0uZXF1YWxzKG5ld3JhckNwKSkgeworCQkJCQljcExpc3QuYWRkKGNwW2ldKTsKKwkJCQl9CisJCQl9CisJCQkKKwkJCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5KQVJfTElTVCwgY3BMaXN0KTsKKwkJCXRyeSB7CisJCQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCApOworCQkJfSBjYXRjaCAob3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb24gZSkgeworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7CisJCQl9CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVmZXJlbmNlZENvbXBvbmVudHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQorCQlpZiAocmVmZXJlbmNpbmdNb2R1bGVQcm9qZWN0Q29tcCA9PSBudWxsIHx8ICFyZWZlcmVuY2luZ01vZHVsZVByb2plY3RDb21wLmdldFByb2plY3QoKS5pc0FjY2Vzc2libGUoKSB8fCByZWZlcmVuY2luZ01vZHVsZVByb2plY3RDb21wLmlzQmluYXJ5KCkpIHJldHVybjsKKwkJCisJCUlWaXJ0dWFsUmVmZXJlbmNlIFtdIGV4aXN0aW5nUmVmZXJlbmNlc0FycmF5ID0gY2FjaGVkUmVmczsKKwkJaWYoZXhpc3RpbmdSZWZlcmVuY2VzQXJyYXkgPT0gbnVsbCB8fCBleGlzdGluZ1JlZmVyZW5jZXNBcnJheS5sZW5ndGggPT0gMCl7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCUxpc3QgZXhpc3RpbmdSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOworCQlmb3IoaW50IGk9MDtpPGV4aXN0aW5nUmVmZXJlbmNlc0FycmF5Lmxlbmd0aDsgaSsrKXsKKwkJCWV4aXN0aW5nUmVmZXJlbmNlcy5hZGQoZXhpc3RpbmdSZWZlcmVuY2VzQXJyYXlbaV0pOworCQl9CisJCQorCQlMaXN0IHRhcmdldHByb2plY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOworCQkJaWYgKHByb2plY3RUb1JlbW92ZUNvbXA9PW51bGwgKQorCQkJCXJldHVybjsKKworCQkJSVZpcnR1YWxSZWZlcmVuY2UgcmVmID0gZmluZE1hdGNoaW5nUmVmZXJlbmNlKGV4aXN0aW5nUmVmZXJlbmNlcywgcHJvamVjdFRvUmVtb3ZlQ29tcCwgbnVsbCk7CisJCQkvL2lmIGEgcmVmIHdhcyBmb3VuZCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIGRlcGxveVBhdGgsIHRoZW4gcmVtb3ZlIGl0CisJCQlpZihyZWYgIT0gbnVsbCl7CisJCQkJcmVtb3ZlUmVmZXJlbmVjZUluQ29tcG9uZW50KHJlZmVyZW5jaW5nTW9kdWxlUHJvamVjdENvbXAsIHJlZik7CisJCQkJZXhpc3RpbmdSZWZlcmVuY2VzLnJlbW92ZShyZWYpOworCQkJCS8vYWZ0ZXIgcmVtb3ZpbmcgdGhlIHJlZiwgY2hlY2sgdG8gc2VlIGlmIGl0IHdhcyB0aGUgbGFzdCByZWYgcmVtb3ZlZCB0byB0aGF0IGNvbXBvbmVudAorCQkJCS8vYW5kIGlmIGl0IHdhcywgdGhlbiBhbHNvIHJlbW92ZSB0aGUgcHJvamVjdCByZWZlcmVuY2UKKwkJCQlyZWYgPSBmaW5kTWF0Y2hpbmdSZWZlcmVuY2UoZXhpc3RpbmdSZWZlcmVuY2VzLCBwcm9qZWN0VG9SZW1vdmVDb21wKTsKKwkJCQlpZihyZWYgPT0gbnVsbCl7CisJCQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSBwcm9qZWN0VG9SZW1vdmVDb21wLmdldFByb2plY3QoKTsKKwkJCQkJdGFyZ2V0cHJvamVjdExpc3QuYWRkKHRhcmdldFByb2plY3QpOworCQkJCX0KKwkJCX0KKwkJCisJCQorCQl0cnkgeworCQkJUHJvamVjdFV0aWxpdGllcy5yZW1vdmVSZWZlcmVuY2VQcm9qZWN0cyhyZWZlcmVuY2luZ01vZHVsZVByb2plY3RDb21wLmdldFByb2plY3QoKSx0YXJnZXRwcm9qZWN0TGlzdCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJfQkJCisJCQorCX0KKwkKKwlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlIGZpbmRNYXRjaGluZ1JlZmVyZW5jZShMaXN0IGV4aXN0aW5nUmVmZXJlbmNlcywgSVZpcnR1YWxDb21wb25lbnQgY29tcCkgeworCQlyZXR1cm4gZmluZE1hdGNoaW5nUmVmZXJlbmNlKGV4aXN0aW5nUmVmZXJlbmNlcywgY29tcCwgbnVsbCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVmZXJlbmVjZUluQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgSVZpcnR1YWxSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisJCSgoVmlydHVhbENvbXBvbmVudCljb21wb25lbnQuZ2V0Q29tcG9uZW50KCkpLnJlbW92ZVJlZmVyZW5jZShyZWZlcmVuY2UpOworCX0KKwkKKwlwcml2YXRlIElWaXJ0dWFsUmVmZXJlbmNlIGZpbmRNYXRjaGluZ1JlZmVyZW5jZShMaXN0IGV4aXN0aW5nUmVmZXJlbmNlcywgSVZpcnR1YWxDb21wb25lbnQgY29tcCwgSVBhdGggcGF0aCkgeworCQlmb3IoaW50IGk9MDtpPGV4aXN0aW5nUmVmZXJlbmNlcy5zaXplKCk7IGkrKyl7CisJCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSAoSVZpcnR1YWxSZWZlcmVuY2UpZXhpc3RpbmdSZWZlcmVuY2VzLmdldChpKTsKKwkJCUlWaXJ0dWFsQ29tcG9uZW50IGMgPSByZWYuZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOworCQkJaWYoYyAhPSBudWxsICYmIGMuZ2V0TmFtZSgpLmVxdWFscyhjb21wLmdldE5hbWUoKSkpeworCQkJCWlmKHBhdGggPT0gbnVsbCl7CisJCQkJCXJldHVybiByZWY7CisJCQkJfSBlbHNlIGlmKHBhdGguZXF1YWxzKHJlZi5nZXRSdW50aW1lUGF0aCgpKSl7CisJCQkJCXJldHVybiByZWY7CisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKwkKKwkKKwkvKioKKwkgKiBEb2VzIHRoZSBkZXBlbmRlbnQgcHJvamVjdCBoYXZlIGEgLmNvbXBvbmVudCByZWZlcmVuY2Ugb24gdGhlIHJlZmFjdG9yZWQgcHJvamVjdD8KKwkgKiBAcmV0dXJuIElWaXJ0dWFsUmVmZXJlbmNlIG9yIG51bGwgaWYgb25lIGRpZG4ndCBleGlzdC4KKwkgKi8KKwlwcm90ZWN0ZWQgSVZpcnR1YWxSZWZlcmVuY2UgaGFkUmVmZXJlbmNlKCkgeworCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCByZWZhY3RvcmVkQ29tcCA9IHByb2plY3RUb1JlbW92ZUNvbXA7CisJCWlmIChyZWZhY3RvcmVkQ29tcCA9PSBudWxsKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlmaW5hbCBJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBjYWNoZWRSZWZzOworCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBudWxsOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChyZWZzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5lcXVhbHMocmVmYWN0b3JlZENvbXApKSB7CisJCQkJcmVmID0gcmVmc1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmVmOworCX0KKwkKKwkvKioKKwkgKiBEb2VzIHRoZSBkZXBlbmRlbnQgcHJvamVjdCBoYXZlIGEgLnByb2plY3QgcmVmZXJlbmNlIG9uIHRoZSByZWZhY3RvcmVkIHByb2plY3Q/CisJICogKGR5bmFtaWMgcHJvamVjdCByZWZzIGRvbid0IGNvdW50KQorCSAqIEByZXR1cm4gVHJ1ZSBpZiBhIHByb2plY3QgcmVmZXJlbmNlIGV4aXN0cy4KKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBoYWRQcm9qZWN0UmVmZXJlbmNlKCkgeworCQl0cnkgeworCQkJZmluYWwgSVByb2plY3RbXSByZWZzID0gcmVmZXJlbmNpbmdNb2R1bGVQcm9qZWN0LmdldERlc2NyaXB0aW9uKCkuZ2V0UmVmZXJlbmNlZFByb2plY3RzKCk7CisJCQlmaW5hbCBJUHJvamVjdCByZWZhY3RvcmVkUHJvamVjdD0gcHJvamVjdFRvUmVtb3ZlOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKHJlZnNbaV0uZXF1YWxzKHJlZmFjdG9yZWRQcm9qZWN0KSkgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9CisJCQl9IAorCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGNlKTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVwZW5kZW5jeSB3YXMgYSB3ZWIgbGlicmFyeSBkZXBlbmRlbmN5LiAKKwkgKiBAcGFyYW0gcmVmCisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNXZWJMaWJEZXBlbmRlbmN5KGZpbmFsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZikgeworCQlpZiAocmVmID09IG51bGwpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gcmVmLmdldFJ1bnRpbWVQYXRoKCkuZXF1YWxzKG5ldyBQYXRoKCIvV0VCLUlORi9saWIiKSk7IC8vJE5PTi1OTFMtMSQKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvbHRrYmFzZWRyZWZhY3RvcmluZy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2x0ay9jb3JlL2Rlc2NyaXB0b3IvRUFSUmVmZXJlbmNlUmVtb3ZlRGVzY3JpcHRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9sdGtiYXNlZHJlZmFjdG9yaW5nL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvbHRrL2NvcmUvZGVzY3JpcHRvci9FQVJSZWZlcmVuY2VSZW1vdmVEZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4MjNlNAotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvbHRrYmFzZWRyZWZhY3RvcmluZy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2x0ay9jb3JlL2Rlc2NyaXB0b3IvRUFSUmVmZXJlbmNlUmVtb3ZlRGVzY3JpcHRvci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5sdGsuY29yZS5kZXNjcmlwdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3Jpbmc7CitpbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOworCitwdWJsaWMgY2xhc3MgRUFSUmVmZXJlbmNlUmVtb3ZlRGVzY3JpcHRvciBleHRlbmRzIFJlZmFjdG9yaW5nRGVzY3JpcHRvciB7CisKKwlwdWJsaWMgRUFSUmVmZXJlbmNlUmVtb3ZlRGVzY3JpcHRvcigpeworCQlzdXBlciAobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgLTEpOworCX0KKwlwcm90ZWN0ZWQgRUFSUmVmZXJlbmNlUmVtb3ZlRGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBwcm9qZWN0LAorCQkJU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgY29tbWVudCwgaW50IGZsYWdzKSB7CisJCXN1cGVyKGlkLCBwcm9qZWN0LCBkZXNjcmlwdGlvbiwgY29tbWVudCwgZmxhZ3MpOworCQl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVmYWN0b3JpbmcgY3JlYXRlUmVmYWN0b3JpbmcoUmVmYWN0b3JpbmdTdGF0dXMgc3RhdHVzKQorCQkJdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJCisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvbHRrYmFzZWRyZWZhY3RvcmluZy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2x0ay9jb3JlL25scy9SZWZhY3RvcmluZ1Jlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9sdGtiYXNlZHJlZmFjdG9yaW5nL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvbHRrL2NvcmUvbmxzL1JlZmFjdG9yaW5nUmVzb3VyY2VIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY1ZjczMQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvbHRrYmFzZWRyZWZhY3RvcmluZy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2x0ay9jb3JlL25scy9SZWZhY3RvcmluZ1Jlc291cmNlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmphdmFlZS5sdGsuY29yZS5ubHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOworCitwdWJsaWMgY2xhc3MgUmVmYWN0b3JpbmdSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBOTFMgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gInJlZmFjdG9yaW5nIjsvLyROT04tTkxTLTEkCisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlX0VCX0Zyb21fREQ7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlX01EQl9Gcm9tX0REOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZV9TQl9Gcm9tX0REOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZV9KYXZhRUVfUmVmZXJlbmNlczsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXZhRUVfUmVmYWN0b3JpbmdzX1BhcnRpY2lwYW50X3RpdGxlOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZV9FSkJfQ2xpZW50X1Byb2plY3Q7CisKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGVja1N0YXRlVGVzdGVyX0NvdWxkX25vdF9maW5kX0NoZWNrX1N0YXRlX1Rlc3Rlcl9FXzsKKwkKKwlwcml2YXRlIFJlZmFjdG9yaW5nUmVzb3VyY2VIYW5kbGVyKCkgeworCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKKwl9CisJCisJc3RhdGljIHsKKwkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUmVmYWN0b3JpbmdSZXNvdXJjZUhhbmRsZXIuY2xhc3MpOworCX0JCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2x0a2Jhc2VkcmVmYWN0b3Jpbmcvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9sdGsvY29yZS9wYXJ0aWNpcGFudC9KYXZhRUVSZWZhY3RvcmluZ1BhcnRpY2lwYW50LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2x0a2Jhc2VkcmVmYWN0b3Jpbmcvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9sdGsvY29yZS9wYXJ0aWNpcGFudC9KYXZhRUVSZWZhY3RvcmluZ1BhcnRpY2lwYW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwMTUwZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvbHRrYmFzZWRyZWZhY3RvcmluZy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2x0ay9jb3JlL3BhcnRpY2lwYW50L0phdmFFRVJlZmFjdG9yaW5nUGFydGljaXBhbnQuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmx0ay5jb3JlLnBhcnRpY2lwYW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuRUpCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmx0ay5jb3JlLmNoYW5nZS5EZWxldGVFSkJDbGllbnRQcm9qZWN0Q2hhbmdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUubHRrLmNvcmUuY2hhbmdlLkVBUlJlZmVyZW5jZVJlbW92ZUNoYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmx0ay5jb3JlLmNoYW5nZS5Ob25FQVJNb2R1bGVSZWZlcmVuY2VSZW1vdmVDaGFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5sdGsuY29yZS5ubHMuUmVmYWN0b3JpbmdSZXNvdXJjZUhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5sdGsuY29yZS5yZWZhY3RvcmluZ2NoZWNrZXIuQ2hlY2tTdGF0ZVRlc3RlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmx0ay5jb3JlLnJlZmFjdG9yaW5nY2hlY2tlci5JUmVmYWN0b3JpbmdDaGVja1N0YXRlVGVzdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkRlbGV0ZVBhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmJ1aWxkZXIuSURlcGVuZGVuY3lHcmFwaDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OworCisKK3B1YmxpYyBjbGFzcyBKYXZhRUVSZWZhY3RvcmluZ1BhcnRpY2lwYW50IGV4dGVuZHMgRGVsZXRlUGFydGljaXBhbnQgeworCisJcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0VG9EZWxldGUgPSBudWxsOworCXByaXZhdGUgSVByb2plY3QgZWpiQ2xpZW50UHJvamVjdCA9IG51bGw7CisJQE92ZXJyaWRlCisJcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLAorCQkJQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24geworCQkKKwkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uLAorCQkJT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24geworCisJCUNvbXBvc2l0ZUNoYW5nZSByZXN1bHQ9IG51bGw7CisJCXJlc3VsdCA9IGNyZWF0ZUNoYW5nZU9iamVjdHMocmVzdWx0LHByb2plY3RUb0RlbGV0ZSk7CisJCQorCQlpZihlamJDbGllbnRQcm9qZWN0ICE9IG51bGwpeworCQkJCisJCQlyZXN1bHQgPSBjcmVhdGVDaGFuZ2VPYmplY3RzIChyZXN1bHQsIGVqYkNsaWVudFByb2plY3QpOworCQkJRGVsZXRlRUpCQ2xpZW50UHJvamVjdENoYW5nZSBkYz0gbmV3IERlbGV0ZUVKQkNsaWVudFByb2plY3RDaGFuZ2UoZWpiQ2xpZW50UHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7CisJCQlyZXN1bHQuYWRkKGRjKTsKKwkJfQorCQkKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJCisJCisJcHJpdmF0ZSBDb21wb3NpdGVDaGFuZ2UgY3JlYXRlQ2hhbmdlT2JqZWN0cyhDb21wb3NpdGVDaGFuZ2UgY29tcG9zaXRlQ2hhbmdlLCBJUHJvamVjdCBwcm9qZWN0VG9CZURlbGV0ZWQpeworCQlTZXQ8SVByb2plY3Q+IHJlZmVyZW5jaW5nQ29tcG9uZW50cyA9IElEZXBlbmRlbmN5R3JhcGguSU5TVEFOQ0UuZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKHByb2plY3RUb0JlRGVsZXRlZCk7CisJCUlQcm9qZWN0W10gZGVwZW5kZW50UHJvamVjdExpc3QgPSByZWZlcmVuY2luZ0NvbXBvbmVudHMudG9BcnJheShuZXcgSVByb2plY3RbcmVmZXJlbmNpbmdDb21wb25lbnRzLnNpemUoKV0pOworCQorCQlDb21wb3NpdGVDaGFuZ2UgaW5uZXJDb21wb3NpdGVDaGFuZ2UgPSBjb21wb3NpdGVDaGFuZ2U7CisJCWlmIChkZXBlbmRlbnRQcm9qZWN0TGlzdC5sZW5ndGggPiAwKXsKKwkJCWlmKGlubmVyQ29tcG9zaXRlQ2hhbmdlID09IG51bGwpeworCQkJCWlubmVyQ29tcG9zaXRlQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShnZXROYW1lKCkpOworCQkJfQorCQkJCisJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVudFByb2plY3RMaXN0Lmxlbmd0aDsgaSsrKXsKKwkJCQlJUHJvamVjdCBkZXBlbmRlbnRQcm9qZWN0ID0gZGVwZW5kZW50UHJvamVjdExpc3RbaV07CisJCQkJaWYoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoZGVwZW5kZW50UHJvamVjdExpc3RbaV0pKXsKKwkJCQkJRUFSUmVmZXJlbmNlUmVtb3ZlQ2hhbmdlIGVjID0gbmV3IEVBUlJlZmVyZW5jZVJlbW92ZUNoYW5nZShkZXBlbmRlbnRQcm9qZWN0LCBwcm9qZWN0VG9CZURlbGV0ZWQpOworCQkJCQlpZihzaG91bGRVbmNoZWNrRGVsZXRpb24ocHJvamVjdFRvQmVEZWxldGVkKSl7CisJCQkJCQllYy5zZXRFbmFibGVkKGZhbHNlKTsJCisJCQkJCX0KKwkJCQkJaW5uZXJDb21wb3NpdGVDaGFuZ2UuYWRkKGVjKTsKKwkJCQl9ZWxzZXsKKwkJCQkJTm9uRUFSTW9kdWxlUmVmZXJlbmNlUmVtb3ZlQ2hhbmdlIG5jID0gbmV3IE5vbkVBUk1vZHVsZVJlZmVyZW5jZVJlbW92ZUNoYW5nZShkZXBlbmRlbnRQcm9qZWN0LCBwcm9qZWN0VG9CZURlbGV0ZWQpOworCQkJCQlpZihzaG91bGRVbmNoZWNrRGVsZXRpb24ocHJvamVjdFRvQmVEZWxldGVkKSl7CisJCQkJCQluYy5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQkJfQorCQkJCQlpbm5lckNvbXBvc2l0ZUNoYW5nZS5hZGQobmMpOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gaW5uZXJDb21wb3NpdGVDaGFuZ2U7CisJfQorCQorCQorCXByaXZhdGUgSVByb2plY3QgZ2V0Q2xpZW50UHJvamVjdChJUHJvamVjdCBlamJQcm9qZWN0KSB7CisJCWlmKCBlamJQcm9qZWN0LmV4aXN0cygpICYmIGVqYlByb2plY3QuaXNBY2Nlc3NpYmxlKCkpeworCQkJSVZpcnR1YWxDb21wb25lbnQgY2xpZW50Q29tcG9uZW50ID0gRUpCVXRpbGl0aWVzLmdldEVKQkNsaWVudEphcihlamJQcm9qZWN0KTsKKwkJCWlmKGNsaWVudENvbXBvbmVudCAhPSBudWxsKXsKKwkJCQlyZXR1cm4gY2xpZW50Q29tcG9uZW50LmdldFByb2plY3QoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCisJCVN0cmluZyBuYW1lID0gTkxTLmJpbmQoCisJCQkJUmVmYWN0b3JpbmdSZXNvdXJjZUhhbmRsZXIuSmF2YUVFX1JlZmFjdG9yaW5nc19QYXJ0aWNpcGFudF90aXRsZSwKKwkJCQluZXcgT2JqZWN0W10geyBwcm9qZWN0VG9EZWxldGUuZ2V0TmFtZSgpIH0pOworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7CisJCWlmKCEoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSkKKwkJCXJldHVybiBmYWxzZTsKKwkJcHJvamVjdFRvRGVsZXRlID0gKElQcm9qZWN0KSBlbGVtZW50OworCQlpZihKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCUHJvamVjdChwcm9qZWN0VG9EZWxldGUpKXsKKwkJCWVqYkNsaWVudFByb2plY3QgPSBnZXRDbGllbnRQcm9qZWN0KHByb2plY3RUb0RlbGV0ZSk7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFVuY2hlY2tEZWxldGlvbihJUHJvamVjdCBwcm9qZWN0KXsKKwkJQ2hlY2tTdGF0ZVRlc3RlciBjc3QgPSBDaGVja1N0YXRlVGVzdGVyLklOU1RBTkNFOworCQlBcnJheUxpc3Q8SVJlZmFjdG9yaW5nQ2hlY2tTdGF0ZVRlc3Rlcj4gdGVzdGVycyA9IGNzdC5nZXRDaGVja1N0YXRlVGVzdGVycygpOworCQlmb3IoSVJlZmFjdG9yaW5nQ2hlY2tTdGF0ZVRlc3RlciB0ZXN0ZXIgOiB0ZXN0ZXJzKXsKKwkJCWlmKHRlc3Rlci50ZXN0VW5jaGVja1N0YXRlKHByb2plY3QpID09IHRydWUpeworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2x0a2Jhc2VkcmVmYWN0b3Jpbmcvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9sdGsvY29yZS9yZWZhY3RvcmluZ2NoZWNrZXIvQWJzdHJhY3RSZWZhY3RvcmluZ0NoZWNrU3RhdGVUZXN0ZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvbHRrYmFzZWRyZWZhY3RvcmluZy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2x0ay9jb3JlL3JlZmFjdG9yaW5nY2hlY2tlci9BYnN0cmFjdFJlZmFjdG9yaW5nQ2hlY2tTdGF0ZVRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjE5OTUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2x0a2Jhc2VkcmVmYWN0b3Jpbmcvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9sdGsvY29yZS9yZWZhY3RvcmluZ2NoZWNrZXIvQWJzdHJhY3RSZWZhY3RvcmluZ0NoZWNrU3RhdGVUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDExIEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUubHRrLmNvcmUucmVmYWN0b3JpbmdjaGVja2VyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CisKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVmYWN0b3JpbmdDaGVja1N0YXRlVGVzdGVyIGltcGxlbWVudHMgSVJlZmFjdG9yaW5nQ2hlY2tTdGF0ZVRlc3RlcnsKKworCXB1YmxpYyBib29sZWFuIHRlc3RVbmNoZWNrU3RhdGUoSVByb2plY3QgcHJvamVjdCl7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2x0a2Jhc2VkcmVmYWN0b3Jpbmcvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9sdGsvY29yZS9yZWZhY3RvcmluZ2NoZWNrZXIvQ2hlY2tTdGF0ZVRlc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9sdGtiYXNlZHJlZmFjdG9yaW5nL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvbHRrL2NvcmUvcmVmYWN0b3JpbmdjaGVja2VyL0NoZWNrU3RhdGVUZXN0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWZlMzg4Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9sdGtiYXNlZHJlZmFjdG9yaW5nL29yZy9lY2xpcHNlL2pzdC9qYXZhZWUvbHRrL2NvcmUvcmVmYWN0b3JpbmdjaGVja2VyL0NoZWNrU3RhdGVUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUubHRrLmNvcmUucmVmYWN0b3JpbmdjaGVja2VyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5sdGsuY29yZS5ubHMuUmVmYWN0b3JpbmdSZXNvdXJjZUhhbmRsZXI7CisKKworcHVibGljIGNsYXNzIENoZWNrU3RhdGVUZXN0ZXIgeworCQorCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVCA9ICJSZWZhY3RvcmluZ0NoZWNrZXIiOy8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIENoZWNrU3RhdGVUZXN0ZXIgSU5TVEFOQ0UgPSBuZXcgQ2hlY2tTdGF0ZVRlc3RlcigpOworCXByaXZhdGUgQXJyYXlMaXN0PElSZWZhY3RvcmluZ0NoZWNrU3RhdGVUZXN0ZXI+IGNoZWNrU3RhdGVUZXN0ZXJzID0gbmV3IEFycmF5TGlzdCgpOworCXByaXZhdGUgYm9vbGVhbiByZWdpc3RyeUlzUmVhZCA9IGZhbHNlOworCQorCQorCXByaXZhdGUgdm9pZCByZWFkUmVnaXN0cnkoKXsKKwkJCXJlZ2lzdHJ5SXNSZWFkID0gdHJ1ZTsKKwkJCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoSjJFRVBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVCk7CisJCQlpZiAocG9pbnQgPT0gbnVsbCkgeworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoUmVmYWN0b3JpbmdSZXNvdXJjZUhhbmRsZXIuQ2hlY2tTdGF0ZVRlc3Rlcl9Db3VsZF9ub3RfZmluZF9DaGVja19TdGF0ZV9UZXN0ZXJfRV8pOworCQkJCXJldHVybjsKKwkJCX0KKwkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7CisJCQlmb3IoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ6IGVsZW1lbnRzKXsKKwkJCQlPYmplY3QgbzsKKwkJCQl0cnkgeworCQkJCQlvID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCisJCQkJCWlmKG8gaW5zdGFuY2VvZiBJUmVmYWN0b3JpbmdDaGVja1N0YXRlVGVzdGVyKXsKKwkJCQkJCWNoZWNrU3RhdGVUZXN0ZXJzLmFkZCgoSVJlZmFjdG9yaW5nQ2hlY2tTdGF0ZVRlc3RlcilvKTsKKwkJCQkJfQorCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQlvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKKwkJCQl9CisJCQl9CisJfQorCQorCXB1YmxpYyBBcnJheUxpc3Q8SVJlZmFjdG9yaW5nQ2hlY2tTdGF0ZVRlc3Rlcj4gZ2V0Q2hlY2tTdGF0ZVRlc3RlcnMoKXsKKwkJaWYocmVnaXN0cnlJc1JlYWQgPT0gZmFsc2UpeworCQkJcmVhZFJlZ2lzdHJ5KCk7CisJCX0KKwkJcmV0dXJuIGNoZWNrU3RhdGVUZXN0ZXJzOworCX0KK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvbHRrYmFzZWRyZWZhY3RvcmluZy9vcmcvZWNsaXBzZS9qc3QvamF2YWVlL2x0ay9jb3JlL3JlZmFjdG9yaW5nY2hlY2tlci9JUmVmYWN0b3JpbmdDaGVja1N0YXRlVGVzdGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2x0a2Jhc2VkcmVmYWN0b3Jpbmcvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9sdGsvY29yZS9yZWZhY3RvcmluZ2NoZWNrZXIvSVJlZmFjdG9yaW5nQ2hlY2tTdGF0ZVRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZjM1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL2x0a2Jhc2VkcmVmYWN0b3Jpbmcvb3JnL2VjbGlwc2UvanN0L2phdmFlZS9sdGsvY29yZS9yZWZhY3RvcmluZ2NoZWNrZXIvSVJlZmFjdG9yaW5nQ2hlY2tTdGF0ZVRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsOCBAQAorcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmx0ay5jb3JlLnJlZmFjdG9yaW5nY2hlY2tlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworCitwdWJsaWMgaW50ZXJmYWNlIElSZWZhY3RvcmluZ0NoZWNrU3RhdGVUZXN0ZXIgeworCisJYm9vbGVhbiB0ZXN0VW5jaGVja1N0YXRlKElQcm9qZWN0IHByb2plY3QpOworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcGx1Z2luLnByb3BlcnRpZXMKaW5kZXggYzVkN2JkNi4uZGQyOTIzNSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wbHVnaW4ucHJvcGVydGllcworKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC04LDEyICs4LDEyIEBACiAjIENvbnRyaWJ1dG9yczoKICMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1lYXJfdmFsaWRhdG9yX1VJXz1FQVIgVmFsaWRhdG9yCitlYXJfdmFsaWRhdG9yX1VJXz1FbnRlcnByaXNlIEFwcGxpY2F0aW9uICgxLngpIFZhbGlkYXRvcgogd2FyX3ZhbGlkYXRvcl9VSV89V0FSIFZhbGlkYXRvcgotYXBwbGljYXRpb25fY2xpZW50X3ZhbGlkYXRvcl9VSV89QXBwbGljYXRpb24gQ2xpZW50IFZhbGlkYXRvcgorYXBwbGljYXRpb25fY2xpZW50X3ZhbGlkYXRvcl9VSV89QXBwbGljYXRpb24gQ2xpZW50ICgxLngpIFZhbGlkYXRvcgogdmFsaWRhdGlvbl9VSV89TWlncmF0aW9uIE9mIFZhbGlkYXRpb24KIF9VSV9QYXJhbVZhbHVlX3R5cGU9UGFyYW06Ci1FQVJfVkFMSURBVElPTl9QUk9CTEVNTUFSS0VSX05BTUU9RUFSIFZhbGlkYXRvciBNZXNzYWdlCitFQVJfVkFMSURBVElPTl9QUk9CTEVNTUFSS0VSX05BTUU9RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBWYWxpZGF0b3IgTWVzc2FnZQogRUFSX0ZBQ0VUX0xBQkVMPUVBUgogRUFSX0ZBQ0VUX0RFU0NSSVBUSU9OPUVuYWJsZXMgdGhlIHByb2plY3QgdG8gYmUgZGVwbG95ZWQgYXMgYW4gRUFSIG1vZHVsZS4KIEVBUl9GQUNFVF9URU1QTEFURT1FQVIgUHJvamVjdApAQCAtMjQsNyArMjQsNyBAQAogQVBQQ0xJRU5UX0ZBQ0VUX0RFU0NSSVBUSU9OPUVuYWJsZXMgdGhlIHByb2plY3QgdG8gYmUgZGVwbG95ZWQgYXMgYSBKYXZhIEVFIEFwcGxpY2F0aW9uIENsaWVudCBtb2R1bGUuCiBBUFBDTElFTlRfRkFDRVRfVEVNUExBVEU9QXBwbGljYXRpb24gQ2xpZW50IFByb2plY3QKIGRpZmZlcmVudFJ1bnRpbWVzRGV0ZWN0ZWRNYXJrZXJOYW1lID0gRmFjZXRlZCBQcm9qZWN0IFByb2JsZW0gKE1pc21hdGNoZWQgUnVudGltZXMpCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZworQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KIEJ1bmRsZS1OYW1lLjAgPSBKYXZhIEVFIENvbXBvbmVudAogY2xhc3NwYXRoX2NvbXBvbmVudF9kZXBlbmRlbmN5X3ZhbGlkYXRvcl9VSV89Q2xhc3NwYXRoIERlcGVuZGVuY3kgVmFsaWRhdG9yCiBjbGFzc3BhdGhfZGVwZW5kZW5jeV92YWxpZGF0b3JfcHJvYmxlbW1hcmtlcl9uYW1lPUNsYXNzcGF0aCBEZXBlbmRlbmN5IFZhbGlkYXRvciBNZXNzYWdlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3BsdWdpbi54bWwKaW5kZXggMDRiMTRmMS4uNDJhNDQzNyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wbHVnaW4ueG1sCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcGx1Z2luLnhtbApAQCAtMjIsNiArMjIsOCBAQAogICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY2xhc3NwYXRoZGVwIiBuYW1lPSJjbGFzc3BhdGhkZXAiIHNjaGVtYT0ic2NoZW1hL0NsYXNzcGF0aERlcC5leHNkIi8+CiAgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJKMkVFTW9kZWxQcm92aWRlciIgbmFtZT0iSjJFRSBNb2RlbCBQcm92aWRlciIgc2NoZW1hPSJzY2hlbWEvSjJFRU1vZGVsUHJvdmlkZXIuZXhzZCIvPgogICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iYXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50cyIgbmFtZT0iQXJjaGl2ZSBFeHBvcnQgUGFydGljaXBhbnRzIEV4dGVuc2lvbiBQb2ludCIgc2NoZW1hPSJzY2hlbWEvYXJjaGl2ZUV4cG9ydFBhcnRpY2lwYW50cy5leHNkIi8+CisgICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJSZWZhY3RvcmluZ0NoZWNrZXIiIG5hbWU9IlJlZmFjdG9yaW5nQ2hlY2tlciIgc2NoZW1hPSJzY2hlbWEvUmVmYWN0b3JpbmdDaGVja2VyLmV4c2QiLz4KKyAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IkNsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb24iIG5hbWU9IkNsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb24iIHNjaGVtYT0ic2NoZW1hL0NsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb24uZXhzZCIvPgogCiA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgogPCEtLSBNb2R1bGUgQ29yZSBOYXR1cmUgICAgICAgICAtLT4KQEAgLTE2NCw5ICsxNjYsOSBAQAogICAgICAgICAgbmFtZT0iJWNsYXNzcGF0aF9jb21wb25lbnRfZGVwZW5kZW5jeV92YWxpZGF0b3JfVUlfIgogICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+CiAgICAgICA8dmFsaWRhdG9yPgotICAgICAgICAgPGZhY2V0Ci0gICAgICAgICAgICAgICBmYWNldElkPSJqc3QuamF2YSI+Ci0gICAgICAgICA8L2ZhY2V0PgorICAgICAgICAgPGVuYWJsZW1lbnQ+CisgICAgICAgIAkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpzdC5qYXZhIi8+CisJCSA8L2VuYWJsZW1lbnQ+CiAgICAgICAgICA8ZmlsdGVyCiAgICAgICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCiAgICAgICAgICAgICAgICBuYW1lRmlsdGVyPSIuY2xhc3NwYXRoIj4KQEAgLTI1NCwyOSArMjU2LDYgQEAKICAgICAgICAgIDwvcnVuU3RyYXRlZ3k+CiAgICAgICA8L3ZhbGlkYXRvcj4KICAgIDwvZXh0ZW5zaW9uPgotPCEtLU1vZHVsZU1hcEluaXQtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEoyRUUgRXh0ZW5zaW9uIFBvaW50IFJlZ2lzdHJ5LS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJtb2R1bGVtYXAueG1pIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLm1vZHVsZW1hcC5Nb2R1bGVtYXBQYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFJlZ2lzdGVyIHBhY2thZ2UgbWFwcGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gU2V2ZXJhbCB0aGF0IGhhdmUgbm90IGNoYW5nZWQgYXJlIHN0aWxsIHJlZ2lzdGVyZWQgYXMgIC0tPgotPCEtLSBhIHBsYWNlIGhvbGRlciBmb3IgdGhlIGZ1dHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZi5wYWNrYWdlVVJJTWFwIj4KLSAgICAgIDxtYXAKLSAgICAgICAgICAgIHVyaT0ibW9kdWxlbWFwLnhtaSIKLSAgICAgICAgICAgIHByZWZpeD0ibW9kdWxlbWFwIj4KLSAgICAgIDwvbWFwPgotICAgPC9leHRlbnNpb24+CiA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIDwhLS0gRXh0ZW5kYWJsZSBPcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgogPCEtLSBUaGVzZSBvcGVyYXRpb24gYXJlIGV4dGVuZGFibGUgaW4gb3RoZXIgcGx1Z2lucyAgICAgICAgLS0+CkBAIC0zMjYsMTUgKzMwNSw2IEBACiAgICA8L2V4dGVuc2lvbj4KICAgIDxleHRlbnNpb24KICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+Ci0gICAgICA8YWRhcHRlckZhY3RvcnkKLSAgICAgICAgICAgIGZ1bmN0aW9uR3JvdXBJRD0ib3JnLmVjbGlwc2UuanN0LmoyZWUiCi0gICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLk1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgcGFja2FnZVVSST0ibW9kdWxlbWFwLnhtaSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5lYXIubW9kdWxlbWFwLnByb3ZpZGVyLk1vZHVsZW1hcEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgIDwvYWRhcHRlckZhY3Rvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5hZGFwdGVyRmFjdG9yeSI+CiAgICAgICA8YWRhcHRlckZhY3RvcnkgCiAgICAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiCiAgICAgICAgICAgICBwYWNrYWdlVVJJPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UiCkBAIC0zNzksNiArMzQ5LDE2IEBACiAgICAgICAgICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCiAgICAgICAgICAgICAgICB2ZXJzaW9ucz0iMS4wIj4KICAgICAgICAgIDwvbW9kdWxlVHlwZT4KKyAgICAgICAgIDxlbmFibGVtZW50PgorCQkJPG9yPgorICAgICAgICAJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIHZhbHVlPSJqc3QuYXBwY2xpZW50OjEuNF0iLz4KKwkJICAJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIHZhbHVlPSJqc3QuZWpiOjIuMV0iLz4KKwkJICAJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIHZhbHVlPSJqc3QudXRpbGl0eToxLjBdIi8+CisJICAJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiB2YWx1ZT0ianN0LmNvbm5lY3RvcjoxLjVdIi8+CisJICAJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiB2YWx1ZT0ianN0LndlYjoyLjRdIi8+CisJICAJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiB2YWx1ZT0ianN0LmVhcjoxLjRdIi8+CisJCQk8L29yPgorCQk8L2VuYWJsZW1lbnQ+ICAgCiAgICAgICA8L21vZHVsZUZhY3Rvcnk+CiAgICA8L2V4dGVuc2lvbj4KIApAQCAtNDExLDcgKzM5MSw3IEBACiAgICAgICA8bGFiZWw+JUVBUl9GQUNFVF9MQUJFTDwvbGFiZWw+CiAgICAgICA8ZGVzY3JpcHRpb24+JUVBUl9GQUNFVF9ERVNDUklQVElPTjwvZGVzY3JpcHRpb24+CiAgICAgICA8aWNvbj5pY29ucy9FQVIuZ2lmPC9pY29uPgotICAgICAgPGRlZmF1bHQtdmVyc2lvbiB2ZXJzaW9uPSIxLjQiLz4KKyAgICAgIDxkZWZhdWx0LXZlcnNpb24gdmVyc2lvbj0iNi4wIi8+CiAgICAgPC9wcm9qZWN0LWZhY2V0PgogCiAgICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmVhciIgdmVyc2lvbj0iMS4yIj4KQEAgLTQ0MywxNyArNDIzLDM5IEBACiAgICAgICA8L2NvbnN0cmFpbnQ+CiAgICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJtb2R1bGVzIi8+ICAgICAgCiAgICAgPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0gICAgICAgIAotICAgIDxhY3Rpb24gZmFjZXQ9ImpzdC5lYXIiIHZlcnNpb249IlsxLjItMS40XSIgdHlwZT0iSU5TVEFMTCIgaWQ9ImpzdC5lYXIuaW5zdGFsbCI+CisgICAgCisgICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmVhciIgdmVyc2lvbj0iNS4wIj4KKyAgICAgIDxjb25zdHJhaW50PgorICAgICAgICA8YW5kPgorICAgICAgICAgIDxjb25mbGljdHMgZ3JvdXA9Im1vZHVsZXMiLz4KKyAgICAgICAgICA8Y29uZmxpY3RzIGZhY2V0PSJqc3QuamF2YSIvPgorICAgICAgICA8L2FuZD4KKyAgICAgIDwvY29uc3RyYWludD4KKyAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4gICAgIAorICAgICAgICAgICAgIAorICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgorICAgIAorICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5lYXIiIHZlcnNpb249IjYuMCI+CisgICAgICA8Y29uc3RyYWludD4KKyAgICAgICAgPGFuZD4KKyAgICAgICAgICA8Y29uZmxpY3RzIGdyb3VwPSJtb2R1bGVzIi8+CisgICAgICAgICAgPGNvbmZsaWN0cyBmYWNldD0ianN0LmphdmEiLz4KKyAgICAgICAgPC9hbmQ+CisgICAgICA8L2NvbnN0cmFpbnQ+CisgICAgICA8Z3JvdXAtbWVtYmVyIGlkPSJtb2R1bGVzIi8+ICAgICAKKyAgICAgICAgICAgICAKKyAgICA8L3Byb2plY3QtZmFjZXQtdmVyc2lvbj4KKyAgICAgICAgICAgIAorICAgIDxhY3Rpb24gZmFjZXQ9ImpzdC5lYXIiIHZlcnNpb249IlsxLjItNi4wXSIgdHlwZT0iSU5TVEFMTCIgaWQ9ImpzdC5lYXIuaW5zdGFsbCI+CiAgICAgICA8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuRWFyRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KICAgICAgIDxjb25maWctZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWFyY3JlYXRpb24uRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIiLz4KICAgICA8L2FjdGlvbj4KICAgICAgIAotICAgIDxldmVudC1oYW5kbGVyIGZhY2V0PSJqc3QuZWFyIiB2ZXJzaW9uPSJbMS4yLTEuNF0iIHR5cGU9IlBPU1RfSU5TVEFMTCI+CisgICAgPGV2ZW50LWhhbmRsZXIgZmFjZXQ9ImpzdC5lYXIiIHZlcnNpb249IlsxLjItNi4wXSIgdHlwZT0iUE9TVF9JTlNUQUxMIj4KICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5FYXJGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUiLz4KICAgICA8L2V2ZW50LWhhbmRsZXI+ICAKIAotICAgIDxldmVudC1oYW5kbGVyIGZhY2V0PSJqc3QuZWFyIiB2ZXJzaW9uPSJbMS4yLTEuNF0iIHR5cGU9IlJVTlRJTUVfQ0hBTkdFRCI+CisgICAgPGV2ZW50LWhhbmRsZXIgZmFjZXQ9ImpzdC5lYXIiIHZlcnNpb249IlsxLjItNi4wXSIgdHlwZT0iUlVOVElNRV9DSEFOR0VEIj4KICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5FYXJGYWNldFJ1bnRpbWVIYW5kbGVyJFJ1bnRpbWVDaGFuZ2VkRGVsZWdhdGUiLz4KIAk8L2V2ZW50LWhhbmRsZXI+CiAKQEAgLTQ3MCw3ICs0NzIsNiBAQAogICAgICAgPC9hY3Rpb24+CiAgICAgICA8YWN0aW9uIHR5cGU9InVuaW5zdGFsbCI+CiAgICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5VdGlsaXR5RmFjZXRVbkluc3RhbGxEZWxlZ2F0ZSIvPgotICAgICAgICA8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuVXRpbGl0eUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIi8+CiAgICAgICA8L2FjdGlvbj4KICAgICAgIDxldmVudC1oYW5kbGVyIHR5cGU9IlJVTlRJTUVfQ0hBTkdFRCI+CiAgICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlIi8+CkBAIC00OTMsNyArNDk0LDcgQEAKICAgICAgIDxsYWJlbD4lQVBQQ0xJRU5UX0ZBQ0VUX0xBQkVMPC9sYWJlbD4KICAgICAgIDxkZXNjcmlwdGlvbj4lQVBQQ0xJRU5UX0ZBQ0VUX0RFU0NSSVBUSU9OPC9kZXNjcmlwdGlvbj4KICAgICAgIDxpY29uPmljb25zL2Vhci5naWY8L2ljb24+Ci0gICAgICA8ZGVmYXVsdC12ZXJzaW9uIHZlcnNpb249IjEuNCIvPgorICAgICAgPGRlZmF1bHQtdmVyc2lvbiB2ZXJzaW9uPSI2LjAiLz4KICAgICA8L3Byb2plY3QtZmFjZXQ+CiAKICAgICA8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqc3QuYXBwY2xpZW50IiB2ZXJzaW9uPSIxLjIiPgpAQCAtNTM1LDE3ICs1MzYsMjcgQEAKICAgICAgIDwvY29uc3RyYWludD4KICAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4gICAgIAogICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgorICAgIAorICAgIDxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpzdC5hcHBjbGllbnQiIHZlcnNpb249IjYuMCI+CisgICAgICA8Y29uc3RyYWludD4KKyAgICAgICAgPGFuZD4KKyAgICAgICAgICA8cmVxdWlyZXMgZmFjZXQ9ImpzdC5qYXZhIiB2ZXJzaW9uPSJbNi4wIi8+CisgICAgICAgICAgPGNvbmZsaWN0cyBncm91cD0ibW9kdWxlcyIvPgorICAgICAgICA8L2FuZD4KKyAgICAgIDwvY29uc3RyYWludD4KKyAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4gICAgIAorICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgogICAgICAgICAgICAgCi0gICAgPGFjdGlvbiB0eXBlPSJpbnN0YWxsIiBmYWNldD0ianN0LmFwcGNsaWVudCIgdmVyc2lvbj0iWzEuMi01LjBdIiBpZD0ianN0LmFwcGNsaWVudC5pbnN0YWxsIj4KKyAgICA8YWN0aW9uIHR5cGU9Imluc3RhbGwiIGZhY2V0PSJqc3QuYXBwY2xpZW50IiB2ZXJzaW9uPSJbMS4yLTYuMF0iIGlkPSJqc3QuYXBwY2xpZW50Lmluc3RhbGwiPgogICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkFwcENsaWVudEZhY2V0SW5zdGFsbERlbGVnYXRlIi8+CiAgICAgICA8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuQXBwQ2xpZW50RmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIiLz4KICAgICA8L2FjdGlvbj4KIAkgIAotICAgIDxldmVudC1oYW5kbGVyIHR5cGU9IlBPU1RfSU5TVEFMTCIgZmFjZXQ9ImpzdC5hcHBjbGllbnQiIHZlcnNpb249IlsxLjItNS4wXSI+CisgICAgPGV2ZW50LWhhbmRsZXIgdHlwZT0iUE9TVF9JTlNUQUxMIiBmYWNldD0ianN0LmFwcGNsaWVudCIgdmVyc2lvbj0iWzEuMi02LjBdIj4KICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5BcHBDbGllbnRGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUiLz4KICAgICA8L2V2ZW50LWhhbmRsZXI+CiAgICAgICAgIAotICAgIDxldmVudC1oYW5kbGVyIHR5cGU9IlJVTlRJTUVfQ0hBTkdFRCIgZmFjZXQ9ImpzdC5hcHBjbGllbnQiIHZlcnNpb249IlsxLjItNS4wXSI+CisgICAgPGV2ZW50LWhhbmRsZXIgdHlwZT0iUlVOVElNRV9DSEFOR0VEIiBmYWNldD0ianN0LmFwcGNsaWVudCIgdmVyc2lvbj0iWzEuMi02LjBdIj4KICAgICAgIDxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KMkVFRmFjZXRSdW50aW1lQ2hhbmdlZERlbGVnYXRlIi8+CiAgICAgPC9ldmVudC1oYW5kbGVyPgogCQpAQCAtNjU5LDkgKzY3MCwxNyBAQAogICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuSjJFRU1vZHVsZVZpcnR1YWxDb21wb25lbnQiPgogICAgICAgPC9jb21wb25lbnRpbXBsPgogICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUuY29tcG9uZW50aW1wbCI+CisgICAgICA8Y29tcG9uZW50aW1wbAorICAgICAgICAgICAgdHlwZUlEPSJqc3Qud2ViZnJhZ21lbnQiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbENvbXBvbmVudCI+CisgICAgICA8L2NvbXBvbmVudGltcGw+CisgICA8L2V4dGVuc2lvbj4KICAgIAogICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUuY29udGVudFR5cGVzIj4KICAgICAgIDxjb250ZW50LXR5cGUKICAgICAgICAgICAgIGZpbGUtbmFtZXM9ImVqYi1qYXIueG1sIgogICAgICAgICAgICAgaWQ9ImVqYkREIgpAQCAtNjc1LDcgKzY5NCw3IEBACiAgIAk8L2V4dGVuc2lvbj4gICAKICAgCQogICAJIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlLmNvbnRlbnRUeXBlcyI+CiAgICAgICA8Y29udGVudC10eXBlCiAgICAgICAgICAgICBmaWxlLW5hbWVzPSJ3ZWIueG1sIgogICAgICAgICAgICAgaWQ9IndlYkREIgpAQCAtNjg5LDcgKzcwOCw3IEBACiAgIAk8L2V4dGVuc2lvbj4gICAKICAgCQogICAJIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlLmNvbnRlbnRUeXBlcyI+CiAgICAgICA8Y29udGVudC10eXBlCiAgICAgICAgICAgICBmaWxlLW5hbWVzPSJhcHBsaWNhdGlvbi54bWwiCiAgICAgICAgICAgICBpZD0iZWFyREQiCkBAIC03MDQsNyArNzIzLDcgQEAKICAgCQogICAJCiAgIAkgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUuY29udGVudFR5cGVzIj4KICAgICAgIDxjb250ZW50LXR5cGUKICAgICAgICAgICAgIGZpbGUtbmFtZXM9ImFwcGxpY2F0aW9uLWNsaWVudC54bWwiCiAgICAgICAgICAgICBpZD0iYXBwY2xpZW50REQiCkBAIC03MTgsNyArNzM3LDcgQEAKICAgCTwvZXh0ZW5zaW9uPiAgIAogICAJCiAgIAk8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+CisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZS5jb250ZW50VHlwZXMiPgogICAgICAgPGNvbnRlbnQtdHlwZQogICAgICAgICAgICAgZmlsZS1uYW1lcz0icmEueG1sIgogICAgICAgICAgICAgaWQ9ImNvbm5lY3RvckREIgpAQCAtNzYwLDkgKzc3OSwxMyBAQAogICAgICAgcHJvcGVydGllcz0icHJvamVjdEZhY2V0IgogICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyIj4KICAgICA8L3Byb3BlcnR5VGVzdGVyPgotICA8L2V4dGVuc2lvbj4KLSAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KKyAgICA8cHJvcGVydHlUZXN0ZXIKKyAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uV3RwUHJlZmVyZW5jZVByb3BlcnR5VGVzdGVyIgorICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCisgICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIgorICAgICAgcHJvcGVydGllcz0icHJlZmVyZW5jZUlkIgorICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFUHJlZmVyZW5jZVByb3BlcnR5VGVzdGVyIj4KKyAgICA8L3Byb3BlcnR5VGVzdGVyPgogCTxwcm9wZXJ0eVRlc3RlcgogICAJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm92aWRlci5GYWNldGVkUHJvamVjdFByb3BlcnR5VGVzdGVyIgogICAJCXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVJdGVtUHJvdmlkZXIiCkBAIC03NzIsNCArNzk1LDYyIEBACiAJPC9wcm9wZXJ0eVRlc3Rlcj4KICAgPC9leHRlbnNpb24+CiAgIAorICA8IS0tCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAqIFdUUCBVc2VyIExpYnJhcnkgUHJvdmlkZXIgKgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC0tPgorICAgIAorICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJyYXJ5UHJvdmlkZXJzIj4KKyAgICA8cHJvdmlkZXIgaWQ9Ind0cC11c2VyLWxpYnJhcnktcHJvdmlkZXIiIGFic3RyYWN0PSJ0cnVlIiBleHRlbmRzPSJ1c2VyLWxpYnJhcnktcHJvdmlkZXIiPgorICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KKyAgICAgICAgPGNvbmZpZyBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5XdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyIvPgorICAgICAgICA8b3BlcmF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLld0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uIi8+CisgICAgICA8L2FjdGlvbj4KKyAgICA8L3Byb3ZpZGVyPgorICA8L2V4dGVuc2lvbj4KKyAgCisgIDwhLS0KKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgKiBXVFAgT1NHaSBCdW5kbGVzIExpYnJhcnkgUHJvdmlkZXIgKgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLS0+CisgICAgCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnJhcnlQcm92aWRlcnMiPgorICAgIDxwcm92aWRlciBpZD0id3RwLW9zZ2ktYnVuZGxlcy1saWJyYXJ5LXByb3ZpZGVyIiBhYnN0cmFjdD0idHJ1ZSIgZXh0ZW5kcz0ib3NnaS1idW5kbGVzLWxpYnJhcnktcHJvdmlkZXIiPgorICAgICAgPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KKyAgICAgICAgPGNvbmZpZyBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5XdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWciLz4KKyAgICAgICAgPG9wZXJhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5XdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb24iLz4KKyAgICAgIDwvYWN0aW9uPgorICAgIDwvcHJvdmlkZXI+CisgIDwvZXh0ZW5zaW9uPgorCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmRlbGV0ZVBhcnRpY2lwYW50cyI+CisgICAgIDxkZWxldGVQYXJ0aWNpcGFudAorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5sdGsuY29yZS5wYXJ0aWNpcGFudC5KYXZhRUVSZWZhY3RvcmluZ1BhcnRpY2lwYW50IgorICAgICAgICAgICBpZD0iSmF2YUVFUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCIKKyAgICAgICAgICAgbmFtZT0iSmF2YUVFUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCI+CisgICAgICAgIDxlbmFibGVtZW50PjwvZW5hYmxlbWVudD4KKyAgICAgPC9kZWxldGVQYXJ0aWNpcGFudD4KKyAgPC9leHRlbnNpb24+CisgIAorICAgPCEtLSBpbml0aWFsaXplIEphdmEgRUUgcHJlZmVyZW5jZXMgLS0+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KKwkJPGluaXRpYWxpemVyCisJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkphdmFFRVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIiIC8+CisJPC9leHRlbnNpb24+CisgPGV4dGVuc2lvbgorICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUucmVmZXJlbmNlUmVzb2x2ZXIiPgorICAgIDxyZXNvbHZlcgorICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5tb2R1bGVjb3JlLnV0aWwuQ2xhc3NwYXRoRGVwZW5kZW5jeVJlc29sdmVyIgorICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuQ2xhc3NwYXRoRGVwZW5kZW5jeVJlc29sdmVyIgorICAgICAgICAgIHdlaWdodD0iNSI+CisgICAgPC9yZXNvbHZlcj4KKyA8L2V4dGVuc2lvbj4KKyA8ZXh0ZW5zaW9uCisgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3Jrcy5KYXZhQ29tcG9uZW50RGlzY2VybmVyIj4KKyAgICA8ZGlzY2VybmVyCisgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLm1vZHVsZWNvcmUudXRpbC5KRUVNYW5pZmVzdERpc2Nlcm5lciI+CisgICAgPC9kaXNjZXJuZXI+CisgPC9leHRlbnNpb24+CiA8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJlZmVyZW5jZXMuaW5pIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcmVmZXJlbmNlcy5pbmkKaW5kZXggMTBhZTdlNy4uOGQxNThjZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcmVmZXJlbmNlcy5pbmkKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcmVmZXJlbmNlcy5pbmkKQEAgLTEgKzEgQEAKLWR5bmFtaWNUcmFuc2xhdGlvbk9mSmV0VGVtcGxhdGVzID0gdHJ1ZQorZHluYW1pY1RyYW5zbGF0aW9uT2ZKZXRUZW1wbGF0ZXMgPSBmYWxzZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9jb21tb25lZGl0LnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2NvbW1vbmVkaXQucHJvcGVydGllcwppbmRleCA3MGIwYzUyLi40ZThjM2JlIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2NvbW1vbmVkaXQucHJvcGVydGllcworKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2NvbW1vbmVkaXQucHJvcGVydGllcwpAQCAtMjEwLDcgKzIxMCw3IEBACiBSZW5hbWVfY291bGRfbm90X2JlX2NvbXBsZXRlZF84PVJlbmFtZSBjb3VsZCBub3QgYmUgY29tcGxldGVkCiBSZW5hbWVfZXJyb3JfOT1SZW5hbWUgZXJyb3IKIFdoYXRfd291bGRfeW91X2xpa2VfdG9fcmVuYW1lX3RoaXNfdG9fXzEwPVdoYXQgd291bGQgeW91IGxpa2UgdG8gcmVuYW1lIHRoaXMgdG8/Ci1Db250ZXh0X1Jvb3RfXzExPUNvbnRleHQgUm9vdDoKK0NvbnRleHRfUm9vdF9fMTE9Q29udGV4dCByb290OgogUmVuYW1lX3NlbGVjdGVkX0VudGVycHJpc2VfQXBwbGljYXRpb25fcHJvamVjdF9vbmx5XzEyPVJlbmFtZSBzZWxlY3RlZCBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3Qgb25seQogQWxzb19yZW5hbWVfbW9kdWxlX2FuZF91dGlsaXR5X0phdmFfcHJvamVjdHNfMTM9QWxzbyByZW5hbWUgbW9kdWxlIGFuZCB1dGlsaXR5IEphdmEgcHJvamVjdHMKIFNvdXJjZV8xPVNvdXJjZQpAQCAtMzMzLDcgKzMzMyw2IEBACiBEZXN0aW5hdGlvbl9fMT1EZXN0aW5hdGlvbjoKIFJlc291cmNlX18yPVJlc291cmNlOgogVGhlX2ZpbGVfZG9lc19ub3RfZXhpc3QuXzE9VGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuCi1SZXNvdXJjZV9fMj1SZXNvdXJjZToKIE11c3RfYmVfYW5fSjJFRTEyX01vZHVsZV9Pbmx5X1VJXz1NdXN0IGJlIGEgSmF2YSBFRSAxLjIgTGV2ZWwgbW9kdWxlIGZpbGUgb25seS4KIFByb2plY3RfbG9jYXRpb25fXzE9UHJvamVjdCBsb2NhdGlvbjoKIFByb2plY3RfXzE9UHJvamVjdDoKQEAgLTM3NCw3ICszNzMsNiBAQAogQ2Fubm90X1NldF9TZXJ2ZXJfVGFyZ2V0X1VJXz1Db3VsZCBub3Qgc2V0IHNlcnZlciB0YXJnZXRcblxuCiBfVUlfRUpCTG9jYWxSZWZfbG9jYWxIb21lX2ZlYXR1cmU9TG9jYWwgSG9tZQogX1VJX0VKQkxvY2FsUmVmX2xvY2FsX2ZlYXR1cmU9TG9jYWwKLV9VSV9FSkJMb2NhbFJlZl90eXBlPUxvY2FsIFJlZgogX1VJX1FOYW1lX3R5cGU9UU5hbWU6CiBfVUlfQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBfZGVzY3JpcHRpb25fZmVhdHVyZT1EZXNjcmlwdGlvbgogX1VJX0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwX2Rlc2NyaXB0aW9uX2ZlYXR1cmVfZGVzYz0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvajJlZWNyZWF0aW9uLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL2oyZWVjcmVhdGlvbi5wcm9wZXJ0aWVzCmluZGV4IDRlNTdmNDEuLjViMjIxNDkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvajJlZWNyZWF0aW9uLnByb3BlcnRpZXMKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9qMmVlY3JlYXRpb24ucHJvcGVydGllcwpAQCAtMTM2LDcgKzEzNiw3IEBACiAKIFVTRV9SRU1PVEVfRk9SX0RJRkZFUkVOVF9FQVI9QmVzdCBwcmFjdGljZSBpcyB0byBjcmVhdGUgJ3JlbW90ZScgcmVmZXJlbmNlIGZvciBhbiBFSkIgaWYgaXQncyBpbiBkaWZmZXJlbnQgRUFSLgogVVNFX0xPQ0FMX0ZPUl9ESUZGRVJFTlRfRUFSPUJlc3QgcHJhY3RpY2UgaXMgdG8gY3JlYXRlICdsb2NhbCcgcmVmZXJlbmNlIGZvciBhbiBFSkIgaWYgaXRzIGluIHNhbWUgRUFSLgotVEFSR0VUX0FMU09fRVhJU1RfSU5fU0FNRV9FQVI9VGhlIHNlbGVjdGVkICBFSkIgd2FzIGRldGVjdGVkIGluICcnezB9JycgRUFSIHdoaWNoIGNvbnRhaW5zIHRoZSAnJ3sxfScnIG1vZHVsZSBwcm9qZWN0IC4gRGlkIHlvdSBtZWFuIHRvIHNlbGVjdCB0aGUgRUpCIGZyb20gdGhlICcnezB9JycgRUFSPworVEFSR0VUX0FMU09fRVhJU1RfSU5fU0FNRV9FQVI9VGhlIHNlbGVjdGVkICBFSkIgd2FzIGRldGVjdGVkIGluICcnezB9JycgRUFSIC4gRGlkIHlvdSBtZWFuIHRvIHNlbGVjdCB0aGUgRUpCIGZyb20gdGhlICcnezB9JycgRUFSPwogQVBQX0NMSUVOVF9PTkxZX0hBVkVfUkVNT1RFPUFwcGxpY2F0aW9uIGNsaWVudCBtb2R1bGUgY2FuIG9ubHkgaGF2ZSByZW1vdGUgcmVmZXJlbmNlcy4KIEoyRUVfMV8yX09OTFlfSEFWRV9SRU1PVEU9SjJFRSAxLjIgbW9kdWxlcyBjYW4gb25seSBoYXZlIHJlbW90ZSByZWZlcmVuY2VzLgogQ09NUE9ORU5UX0FMUkVBRFlJTkVBUj1UaGUgc3BlY2lmaWVkIGNvbXBvbmVudCBuYW1lIGlzIGFscmVhZHkgaW4gdGhlIEVBUi4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvajJlZXd0cHBsdWdpbi5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9qMmVld3RwcGx1Z2luLnByb3BlcnRpZXMKaW5kZXggMGRhNjAwNS4uNzFiMTM2NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9qMmVld3RwcGx1Z2luLnByb3BlcnRpZXMKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9qMmVld3RwcGx1Z2luLnByb3BlcnRpZXMKQEAgLTUyLDUgKzUyLDUgQEAKIEoyRUVEZXBsb3lPcGVyYXRpb25fM19VSV89RGVwbG95bWVudCBmcm9tIHswfSBoYWQgZXJyb3JzOiB7MX0gXHJcbgogSjJFRURlcGxveU9wZXJhdGlvbl80X1VJXz1EZXBsb3lpbmcgezB9CiBORVNURURfSkFWQV9PVVRQVVRfRVJST1I9TmVzdGVkIEphdmEgb3V0cHV0IHBhdGhzIGRlZmluZWQgaW4gLnd0cG1vZHVsZXMgZmlsZSBhcmUgbm90IGFsbG93ZWQuCi1fVUlfUGFyYW1WYWx1ZV90eXBlPVBhcmFtCisKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9wcm9qZWN0c3VwcG9ydC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9wcm9qZWN0c3VwcG9ydC5wcm9wZXJ0aWVzCmluZGV4IDA0NTEzZTUuLmJmZjM3MDEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvcHJvamVjdHN1cHBvcnQucHJvcGVydGllcworKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3Byb3BlcnR5X2ZpbGVzL3Byb2plY3RzdXBwb3J0LnByb3BlcnRpZXMKQEAgLTI2LDkgKzI2LDkgQEAKIE5vdF9hX3dlYl9wcm9qZWN0XzI5PU5vdCBhIHdlYiBwcm9qZWN0CiBBX3dlYl9wcm9qZWN0X211c3RfYmVfb3Blbl9hbmRfbXVzdF9leGlzdF9mb3JfcHJvcGVydGllc190b19iZV9lZGl0ZWRfMzA9QSB3ZWIgcHJvamVjdCBtdXN0IGJlIG9wZW4gYW5kIG11c3QgZXhpc3QgZm9yIHByb3BlcnRpZXMgdG8gYmUgZWRpdGVkCiBJbnZhbGlkX1NlcnZsZXRfTGV2ZWxfc2V0X29uX1dlYk5hdHVyZV8zX0VYQ189SVdBRTAwMTBFIEludmFsaWQgU2VydmxldCBMZXZlbCBzZXQgb24gV2ViTmF0dXJlCi1Db250ZXh0X1Jvb3RfY2Fubm90X2JlX2VtcHR5XzI9Q29udGV4dCBSb290IGNhbm5vdCBiZSBlbXB0eQorQ29udGV4dF9Sb290X2Nhbm5vdF9iZV9lbXB0eV8yPUNvbnRleHQgcm9vdCBjYW5ub3QgYmUgZW1wdHkKIE5hbWVzX2Nhbm5vdF9iZWdpbl9vcl9lbmRfd2l0aF93aGl0ZXNwYWNlXzU9TmFtZXMgY2Fubm90IGJlZ2luIG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UKLU5hbWVzX2Nhbm5vdF9jb250YWluX3doaXRlc3BhY2VfPUNvbnRleHQgUm9vdCBjYW5ub3QgY29udGFpbiB3aGl0ZXNwYWNlIAorTmFtZXNfY2Fubm90X2NvbnRhaW5fd2hpdGVzcGFjZV89Q29udGV4dCByb290IGNhbm5vdCBjb250YWluIHdoaXRlc3BhY2UgCiBUaGVfY2hhcmFjdGVyX2lzX2ludmFsaWRfaW5fYV9jb250ZXh0X3Jvb3Q9VGhlIGNoYXJhY3RlciAnJ3swfScnIGlzIGludmFsaWQgaW4gYSBjb250ZXh0IHJvb3QuCiBGb2xkZXJfbmFtZV9jYW5ub3RfYmVfZW1wdHlfMj1Gb2xkZXIgbmFtZSBjYW5ub3QgYmUgZW1wdHkKIEZvbGRlcl9uYW1lc19jYW5ub3RfYmVfZXF1YWxfND1Gb2xkZXIgbmFtZXMgY2Fubm90IGJlIGVxdWFsCkBAIC00NSw2ICs0NSw3IEBACiBVTkFCTEVfVE9fTE9BRF9NT0RVTEVfRVJST1JfPVVOQUJMRV9UT19MT0FEX01PRFVMRV9FUlJPUl8KIEltcG9ydGluZ19hcmNoaXZlPUltcG9ydGluZyBhcmNoaXZlICcnezB9JycuCiBFeHBvcnRpbmdfYXJjaGl2ZT1FeHBvcnRpbmcgYXJjaGl2ZSAnJ3swfScnLgorRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXJfVGhlX01vZHVsZV9zcGVjaWZpY2F0aW9uX2xldmVsX29mXz1UaGUgTW9kdWxlIHNwZWNpZmljYXRpb24gbGV2ZWwgb2YgezB9LCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY29udGFpbmluZyBFQVIgdmVyc2lvbgogRFlOQU1JQ19XRUJfRElTVElOQ1RfU1JDX1dFQkNPTlRFTlRfRVJST1I9RHluYW1pYyBXZWIgUHJvamVjdCBDb250ZW50IGFuZCBTb3VyY2UgZm9sZGVyIHNob3VsZCBiZSBkaXN0aW5jdAogRFlOQU1JQ19XRUJfUEVSRk9STUFOQ0VfVkFMSURBVElPTj1EeW5hbWljIFdlYiBkZWZhdWx0IG91dHB1dCBmb2xkZXIgc2hvdWxkIGJlIHNldCB0byB7MH0gdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQogU09VUkNFX09VUFVUX0ZPTERFUl9ESUZGX0JZQ0FTRV9PTkxZPVNvdXJjZSBhbmQgb3V0cHV0IGZvbGRlciBkaWZmZXIgYnkgY2FzZSBvbmx5IApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvcmVmYWN0b3JpbmcucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcHJvcGVydHlfZmlsZXMvcmVmYWN0b3JpbmcucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTljZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9wcm9wZXJ0eV9maWxlcy9yZWZhY3RvcmluZy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNyBAQAorRGVsZXRlX0VCX0Zyb21fREQ9RGVsZXRlIEVudGl0eSBCZWFuICggezB9ICkgZnJvbSBERAorRGVsZXRlX01EQl9Gcm9tX0REPURlbGV0ZSBNZXNzYWdlIERyaXZlbiBCZWFuICggezB9ICkgZnJvbSBERAorRGVsZXRlX1NCX0Zyb21fREQ9RGVsZXRlIFNlc3Npb24gQmVhbiAoIHswfSApIGZyb20gREQKK1JlbW92ZV9KYXZhRUVfUmVmZXJlbmNlcz1SZW1vdmUgSmF2YSBFRSBSZWZlcmVuY2VzIHRvIHswfSBpbiAKK0phdmFFRV9SZWZhY3RvcmluZ3NfUGFydGljaXBhbnRfdGl0bGU9SmF2YSBFRSBSZWZhY3RvcmluZ3MgZm9yIHswfQorRGVsZXRlX0VKQl9DbGllbnRfUHJvamVjdD1EZWxldGUgezB9CitDaGVja1N0YXRlVGVzdGVyX0NvdWxkX25vdF9maW5kX0NoZWNrX1N0YXRlX1Rlc3Rlcl9FXz1Db3VsZCBub3QgZmluZCBDaGVjayBTdGF0ZSBUZXN0ZXIgRXh0ZW5zaW9uIFBvaW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9Qcm9qZWN0RGVwZW5kZW5jeUNhY2hlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL1Byb2plY3REZXBlbmRlbmN5Q2FjaGUuamF2YQppbmRleCA3NWM1ZTJmLi4wOGFiYWMzIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL1Byb2plY3REZXBlbmRlbmN5Q2FjaGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL1Byb2plY3REZXBlbmRlbmN5Q2FjaGUuamF2YQpAQCAtMjAsNyArMjAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwogCiAvKioKICAqIE1haW50YWlucyBhIGNhY2hlIG9mIHByb2plY3QgZGVwZW5kZW5jaWVzIGFzIHJlcHJlc2VudGVkIGJ5IHJlZmVyZW5jZXMgaW4gdGhlIC5wcm9qZWN0IGZpbGUuCkBAIC0zOCw3ICszOCw3IEBACiAJCQl0cnkgewogCQkJCWNhY2hlID0gbmV3IFByb2plY3REZXBlbmRlbmN5Q2FjaGUoKTsKIAkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2UpOworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoY2UpOwogCQkJfQogCQl9CiAJCXJldHVybiBjYWNoZTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3IvbGlzdGVuZXJzL0oyRUVFbGVtZW50Q2hhbmdlZExpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL2xpc3RlbmVycy9KMkVFRWxlbWVudENoYW5nZWRMaXN0ZW5lci5qYXZhCmluZGV4IDczODc0Y2YuLjQ5Nzk2YjIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3IvbGlzdGVuZXJzL0oyRUVFbGVtZW50Q2hhbmdlZExpc3RlbmVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9saXN0ZW5lcnMvSjJFRUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIuamF2YQpAQCAtMjgsMTcgKzI4LDE4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50RGVsdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7CkBAIC05OCw2ICs5OSw4IEBACiAJCS8vIG1ha2UgY2VydGFpbiB0aGlzIGlzIGEgSjJFRSBwcm9qZWN0CiAJCWlmIChNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KHByb2plY3QpKSB7CiAJCQlJVmlydHVhbENvbXBvbmVudCBjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7CisJCQlpZihjID09IG51bGwpCisJCQkJcmV0dXJuOwogCQkJdHJ5IHsKIAkJCQkvLyBEaWQgdGhlIGNsYXNzcGF0aCBjaGFuZ2U/CiAJCQkJaWYgKChmbGFncyAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pID09IElKYXZhRWxlbWVudERlbHRhLkZfQ0hJTERSRU4pIHsKQEAgLTExMiw3ICsxMTUsNyBAQAogCQkJCX0KIAkJCiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcihKMkVFUGx1Z2luLlBMVUdJTl9JRCkubG9nRXJyb3IoY2UpOworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoY2UpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJCXVwZGF0ZU1hcHBpbmdzSW5Kb2IocGF0aHNUb0FkZCwgcGF0aHNUb1JlbW92ZSk7CkBAIC0xMjgsNyArMTMxLDcgQEAKIAkJCXRyeSB7CiAJCQkJZ2V0Tm9uSmF2YUZvbGRlck1hcHBpbmdzKGRlbHRhcywgbnVsbCwgcGF0aHNUb0FkZCwgcGF0aHNUb1JlbW92ZSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcihKMkVFUGx1Z2luLlBMVUdJTl9JRCkubG9nRXJyb3IoY2UpOworCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoY2UpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQpAQCAtMTQyLDcgKzE0NSw4IEBACiAJcHJpdmF0ZSB2b2lkIHVwZGF0ZU1hcHBpbmdzSW5Kb2IoZmluYWwgTGlzdCBwYXRoc1RvQWRkLCBmaW5hbCBMaXN0IHBhdGhzVG9SZW1vdmUpIHsKIAkJLy8gSWYgdGhlcmUgYXJlIGNvcnJlY3Rpb25zIHRvIHRoZSB2aXJ0dWFsIHBhdGggbWFwcGluZ3MsIGV4ZWN1dGUgdGhlbSBpbiBhIEpvYgogCQlpZiAoIXBhdGhzVG9BZGQuaXNFbXB0eSgpIHx8ICFwYXRoc1RvUmVtb3ZlLmlzRW1wdHkoKSkgewotCQkJV29ya3NwYWNlSm9iIGpvYiA9IG5ldyBXb3Jrc3BhY2VKb2IoIkoyRUVDb21wb25lbnRNYXBwaW5nVXBkYXRlSm9iIikgewkJCQkJCQkKKwkJCVdvcmtzcGFjZUpvYiBqb2IgPSBuZXcgV29ya3NwYWNlSm9iKFJlZmFjdG9yTWVzc2FnZXMuSjJFRUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXJfSjJFRV9Db21wb25lbnRfTWFwcGluZ19VcGRhdGVfKSB7CQkJCQkJCQorCQkJCUBPdmVycmlkZQogCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQkJCQlmb3IoaW50IGk9MDtpPHBhdGhzVG9BZGQuc2l6ZSgpOyBpKyspewogCQkJCQkJT2JqZWN0W10gdG9BZGQgPSAoT2JqZWN0W10pIHBhdGhzVG9BZGQuZ2V0KGkpOwpAQCAtMTU4LDExICsxNjIsMTMgQEAKIAkJCQkJfQogCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKIAkJCQl9CisJCQkJQE92ZXJyaWRlCiAJCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKGZpbmFsIE9iamVjdCBmYW1pbHkpIHsKIAkJCQkJcmV0dXJuIFBST0pFQ1RfQ09NUE9ORU5UX1VQREFURV9KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOwogCQkJCX0KIAkJCX07CiAJCQlqb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKKwkJCWpvYi5zZXRTeXN0ZW0odHJ1ZSk7CiAJCQlqb2Iuc2NoZWR1bGUoKTsKIAkJfQkJCQkJCQogCX0KQEAgLTI1NSwyMiArMjYxLDI0IEBACiAJICogUHJvY2Vzc2VzIGEgc2luZ2xlIElSZXNvdXJjZURlbHRhLgogCSAqLwogCXByaXZhdGUgdm9pZCBwcm9jZXNzUmVzb3VyY2VEZWx0YShmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSwgSVZpcnR1YWxGb2xkZXIgcm9vdEZvbGRlciwgTWFwIHNvdXJjZVRvUnVudGltZSwgZmluYWwgTGlzdCBwYXRoc1RvQWRkLCBmaW5hbCBMaXN0IHBhdGhzVG9SZW1vdmUsIGZpbmFsIExpc3QgY2hhbmdlZEphdmFQYXRocykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJVmlydHVhbEZvbGRlciBsb2NhbFJvb3RGb2xkZXIgPSByb290Rm9sZGVyOworCQlNYXAgbG9jYWxTb3VyY2VUb1J1bnRpbWUgPSBzb3VyY2VUb1J1bnRpbWU7CiAJCWZpbmFsIGludCBraW5kID0gZGVsdGEuZ2V0S2luZCgpOwogCQlpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSB7CiAJCQlJUmVzb3VyY2VEZWx0YVtdIGNoaWxkRGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwogCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZERlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCXByb2Nlc3NSZXNvdXJjZURlbHRhKGNoaWxkRGVsdGFzW2ldLCByb290Rm9sZGVyLCBzb3VyY2VUb1J1bnRpbWUsIHBhdGhzVG9BZGQsIHBhdGhzVG9SZW1vdmUsIGNoYW5nZWRKYXZhUGF0aHMpOworCQkJCXByb2Nlc3NSZXNvdXJjZURlbHRhKGNoaWxkRGVsdGFzW2ldLCBsb2NhbFJvb3RGb2xkZXIsIGxvY2FsU291cmNlVG9SdW50aW1lLCBwYXRoc1RvQWRkLCBwYXRoc1RvUmVtb3ZlLCBjaGFuZ2VkSmF2YVBhdGhzKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWZpbmFsIGludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7CiAJCQlpZiAoKGZsYWdzICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgPT0gSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgewotCQkJCWlmIChyb290Rm9sZGVyID09IG51bGwpIHsKKwkJCQlpZiAobG9jYWxSb290Rm9sZGVyID09IG51bGwpIHsKIAkJCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IGRlbHRhLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpOwogCQkJCQkvLyBtYWtlIGNlcnRhaW4gdGhpcyBpcyBhIEoyRUUgcHJvamVjdAogCQkJCQlpZiAoTW9kdWxlQ29yZU5hdHVyZS5nZXRNb2R1bGVDb3JlTmF0dXJlKHByb2plY3QpICE9IG51bGwpIHsKIAkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCQkJCXJvb3RGb2xkZXIgPSBjLmdldFJvb3RGb2xkZXIoKTsKLQkJCQkJCXNvdXJjZVRvUnVudGltZSA9IGdldFJlc291cmNlTWFwcGluZ3MocHJvamVjdCk7CisJCQkJCQlsb2NhbFJvb3RGb2xkZXIgPSBjLmdldFJvb3RGb2xkZXIoKTsKKwkJCQkJCWxvY2FsU291cmNlVG9SdW50aW1lID0gZ2V0UmVzb3VyY2VNYXBwaW5ncyhwcm9qZWN0KTsKIAkJCQkJfSBlbHNlIHsKIAkJCQkJCS8vIG5vdCBhIEoyRUUgcHJvamVjdAogCQkJCQkJcmV0dXJuOwpAQCAtMjgyLDEwICsyOTAsMTAgQEAKIAkJCQkJcmV0dXJuOwogCQkJCX0KIAkJCQlmaW5hbCBJUGF0aCBtb3ZlZFRvID0gZGVsdGEuZ2V0RnVsbFBhdGgoKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQkJCWZpbmFsIElQYXRoIHJ1bnRpbWVQYXRoID0gKElQYXRoKSBzb3VyY2VUb1J1bnRpbWUuZ2V0KG1vdmVkRnJvbSk7CisJCQkJZmluYWwgSVBhdGggcnVudGltZVBhdGggPSAoSVBhdGgpIGxvY2FsU291cmNlVG9SdW50aW1lLmdldChtb3ZlZEZyb20pOwogCQkJCS8vIGRvZXMgdGhlIG9sZCBwYXRoIGhhdmUgYSB2aXJ0dWFsIGNvbXBvbmVudCBtYXBwaW5nPwogCQkJCWlmIChydW50aW1lUGF0aCAhPSBudWxsKSB7Ci0JCQkJCWZpbmFsIElWaXJ0dWFsRm9sZGVyIGZvbGRlciA9IHJvb3RGb2xkZXIuZ2V0Rm9sZGVyKHJ1bnRpbWVQYXRoKTsKKwkJCQkJZmluYWwgSVZpcnR1YWxGb2xkZXIgZm9sZGVyID0gbG9jYWxSb290Rm9sZGVyLmdldEZvbGRlcihydW50aW1lUGF0aCk7CiAJCQkJCS8vIG9ubHkgYWRkIGlmIHRoZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGhzIGFyZSBub3QgZXF1YWwgKHRoZXNlIGNhbiBiZSBlcXVhbCB3aGVuIHRoZSByb290IGZvbGRlciBpcyBtYXBwZWQgYW5kIHRoZSBwcm9qZWN0IGlzIHJlbmFtZWQpCiAJCQkJCWlmICghbW92ZWRGcm9tLmVxdWFscyhtb3ZlZFRvKSkgewogCQkJCQkJcGF0aHNUb1JlbW92ZS5hZGQobmV3IE9iamVjdFtde21vdmVkRnJvbSwgZm9sZGVyfSk7CkBAIC0zMjMsMTMgKzMzMSw1NCBAQAogCSAqLwogCXByaXZhdGUgSVZpcnR1YWxGb2xkZXIgZ2V0RGVzdGluYXRpb25Gb2xkZXIoZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYykgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlmaW5hbCBJVmlydHVhbEZvbGRlciByb290ID0gYy5nZXRSb290Rm9sZGVyKCk7Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGMuZ2V0UHJvamVjdCgpKSkgewotCQkJLy8gd2ViIHByb2plY3RzIG1hcCB0byBXRUItSU5GL2NsYXNzZXMKLQkJCXJldHVybiByb290LmdldEZvbGRlcihuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUykpOworCQkKKwkJaWYoIEphdmFFRVByb2plY3RVdGlsaXRpZXMudXNlc0phdmFFRUNvbXBvbmVudChjICkpeworCQkJaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChjLmdldFByb2plY3QoKSkpIHsKKwkJCQlyZXR1cm4gcm9vdC5nZXRGb2xkZXIobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5XRUJfSU5GX0NMQVNTRVMpKTsKKwkJCX0KKwkJCXJldHVybiByb290OwogCQl9Ci0JCS8vIGFsbCBvdGhlciBKMkVFIHByb2plY3QgdHlwZXMgKHRoYXQgYXJlIEphdmEgcHJvamVjdHMpIG1hcCAKLQkJLy8gSmF2YSBzcmMgZm9sZGVycyB0byB0aGUgcHJvamVjdCByb290CisJCS8vZ2V0IHNvdXJjZSBmb2xkZXJzCisJCUxpc3Q8SVBhdGg+IHNyY0ZvbGRlcnMgPSBnZXRTb3VyY2VGb2xkZXJzKGMuZ2V0UHJvamVjdCgpKTsKKwkJLy9nZXQgZXhpc3RpbmcgZGVwbG95IG1hcHBpbmdzCisJCU1hcCBtYXBwaW5nID0gZ2V0UmVzb3VyY2VNYXBwaW5ncyhjLmdldFByb2plY3QoKSk7CisJCUlQYXRoIGRlcGxveVBhdGggPSBudWxsOworCQkKKwkJLy9pZiBleGlzdGluZyBzb3VyY2UgZm9sZGVyIGhhcyBtYXBwaW5nIHNldCBmb3IgdGhpcyBvbmUKKwkJZm9yKCBJUGF0aCBzcmNGb2xkZXIgOiBzcmNGb2xkZXJzICkKKwkJeworCQkJaWYoIG1hcHBpbmcuY29udGFpbnNLZXkoc3JjRm9sZGVyKSApeworCQkJCWRlcGxveVBhdGggPSAoSVBhdGgpbWFwcGluZy5nZXQoc3JjRm9sZGVyKTsKKwkJCQlpZiggZGVwbG95UGF0aCA9PSBudWxsICkKKwkJCQkJcmV0dXJuIHJvb3Q7CisJCQkJcmV0dXJuIHJvb3QuZ2V0Rm9sZGVyKGRlcGxveVBhdGgpOworCQkJfQorCQl9CiAJCXJldHVybiByb290OwogCX0KIAkKKwlwcm90ZWN0ZWQgc3RhdGljIExpc3Q8SVBhdGg+IGdldFNvdXJjZUZvbGRlcnMoSVByb2plY3QgcHJvamVjdCkgeworCQkKKwkJSUphdmFQcm9qZWN0IGphdmFQcm9qID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOworCQlpZiAoamF2YVByb2ogPT0gbnVsbCkKKwkJCXJldHVybiBudWxsOworCQlpZiggIWphdmFQcm9qLmV4aXN0cygpICkKKwkJCXJldHVybiBudWxsOworCQkKKwkJSUNsYXNzcGF0aEVudHJ5W10gY3AgPSBudWxsOworCQl0cnkgeworCQkJY3AgPSBqYXZhUHJvai5nZXRSYXdDbGFzc3BhdGgoKTsKKwkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7CisJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGV4KTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCUxpc3Qgc291cmNlUGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgY3AubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChjcFtpXS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgeworCQkJCXNvdXJjZVBhdGhzLmFkZChjcFtpXS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHNvdXJjZVBhdGhzOworCX0KKwkKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3IvbGlzdGVuZXJzL1Byb2plY3RSZWZhY3RvcmluZ0xpc3RlbmVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL2xpc3RlbmVycy9Qcm9qZWN0UmVmYWN0b3JpbmdMaXN0ZW5lci5qYXZhCmluZGV4IDE1YzY4ZDMuLjk4MWQ2ZjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3IvbGlzdGVuZXJzL1Byb2plY3RSZWZhY3RvcmluZ0xpc3RlbmVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9saXN0ZW5lcnMvUHJvamVjdFJlZmFjdG9yaW5nTGlzdGVuZXIuamF2YQpAQCAtMTEsOCArMTEsMTIgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5saXN0ZW5lcnM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKQEAgLTI3LDE5ICszMSwyNSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkVhclV0aWxpdGllczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5SZWZhY3RvclJlc291cmNlSGFuZGxlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zLk9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdERlbGV0ZURhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9ucy5Qcm9qZWN0UmVmYWN0b3JpbmdEYXRhTW9kZWxQcm92aWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zLlByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuYnVpbGRlci5EZXBlbmRlbmN5R3JhcGhNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5idWlsZGVyLklEZXBlbmRlbmN5R3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXJXb3JraW5nQ29weTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKIAogLyoqCiAgKiBMaXN0ZW5zIGZvciBwcm9qZWN0IHJlbmFtZS9kZWxldGUgZXZlbnRzIGFuZCwgaWYgdGhlIHByb2plY3QgaGFkIHRoZQpAQCAtNTcsMjggKzY3LDExIEBACiAJICogTWFwIGZyb20gbmFtZSBvZiBkZWxldGVkIHByb2plY3QgdG8gUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgaW5zdGFuY2VzLgogCSAqLwogCXByaXZhdGUgZmluYWwgTWFwIGRlbGV0ZWRQcm9qZWN0TWV0YWRhdGEgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1c2VMVEsgPSBmYWxzZTsKIAkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVc2VMVEsoKSB7Ci0JCXJldHVybiB1c2VMVEs7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFVzZUxUSyhib29sZWFuIHVzZUxUSykgewotCQlQcm9qZWN0UmVmYWN0b3JpbmdMaXN0ZW5lci51c2VMVEsgPSB1c2VMVEs7Ci0JfQotCiAJLyoqCiAJICogTWFpbnRhaW5zIGEgY2FjaGUgb2YgcHJvamVjdCBkZXBlbmNlbmNpZXM7CiAJICovCi0JLy9wcml2YXRlIGZpbmFsIFByb2plY3REZXBlbmRlbmN5Q2FjaGUgY2FjaGU7Ci0JCi0JcHVibGljIFByb2plY3RSZWZhY3RvcmluZ0xpc3RlbmVyKCkgey8vZmluYWwgUHJvamVjdERlcGVuZGVuY3lDYWNoZSBkZXBlbmRlbmN5Q2FjaGUpIHsKLQkJLy9jYWNoZSA9IGRlcGVuZGVuY3lDYWNoZTsKLQkJLy8gZm9yY2UgYSByZWZyZXNoIG9mIHRoZSBEZXBlbmRlbmN5R3JhcGhNYW5hZ2VyOyB3YXMgaGl0dGluZyBhbiBOUEUKLQkJLy8gaW4gU3RydWN0dXJlRWRpdCB3aGVuIHRoZSBER00gd2FzIGdldHRpbmcgY29uc3RydWN0ZWQgZHVyaW5nIHRoZSByZWNlaXB0IG9mIHRoZQotCQkvLyBmaXJzdCBwcmUtZGVsZXRlIGV2ZW50Ci0JCURlcGVuZGVuY3lHcmFwaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKKwlwdWJsaWMgUHJvamVjdFJlZmFjdG9yaW5nTGlzdGVuZXIoKSB7CiAJfQogCQogCS8qIChub24tSmF2YWRvYykKQEAgLTkyLDcgKzg1LDcgQEAKIAkJCQkvLyBmb3Igbm93LCBvbmx5IGRlcGVuZGVuY2llcyBvbiBNb2R1bGVDb3JlTmF0dXJlIHByb2plY3RzCiAJCQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZXZlbnQuZ2V0UmVzb3VyY2UoKTsKICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgcHJvamVjdCBpcyBhY2Nlc3NpYmxlIGFuZCBoYXMgYm90aCBtb2R1bGUgY29yZSBhbmQgZmFjZXRlZCBuYXR1cmVzCi0JCQkJaWYgKE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KSAhPSBudWxsCisJCQkJaWYgKE1vZHVsZUNvcmVOYXR1cmUuaXNGbGV4aWJsZVByb2plY3QocHJvamVjdCkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KSAhPSBudWxsKSB7CiAJCQkJCWNhY2hlRGVsZXRlZFByb2plY3RNZXRhZGF0YShwcm9qZWN0KTsKIAkJCQl9CkBAIC0xMDAsNyArOTMsNyBAQAogCQkJCWV2ZW50LmdldERlbHRhKCkuYWNjZXB0KHRoaXMpOwogCQkJfQogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2UpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihjZSk7CiAJCX0KIAl9CiAJCkBAIC0xMDksOSArMTAyLDQwIEBACiAJCS8vIHByZWNvbXB1dGUgdGhlIG1ldGFkYXRhIHdoaWxlIHRoZSBwcm9qZWN0IHN0aWxsIGV4aXN0cwogCQltZXRhZGF0YS5jb21wdXRlTWV0YWRhdGEoKTsKIAkJbWV0YWRhdGEuY29tcHV0ZVNlcnZlcnMoKTsKLQkJbWV0YWRhdGEuY29tcHV0ZURlcGVuZGVudE1ldGFkYXRhKFByb2plY3RSZWZhY3Rvck1ldGFkYXRhLlJFRl9DQUNISU5HLAotCQkJCURlcGVuZGVuY3lHcmFwaE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXREZXBlbmRlbmN5R3JhcGgoKS5nZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMocHJvamVjdCkpOwotCQkvLywgY2FjaGUuZ2V0RGVwZW5kZW50UHJvamVjdHMocHJvamVjdCkpOworCQkvL3RoZSBsaXN0IG9mIHJlZmVyZW5jZSBwcm9qZWN0cyB0aGF0IGhhdmUgYSAuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnQgZW50cnkKKwkJLy90eXBpY2FsbHkgdGhlc2Ugd2lsbCBiZSBFQVIgcHJvamVjdHMKKwkJU2V0PElQcm9qZWN0PiBkb3RDb21wb25lbnRSZWZlcmVuY2VzID0gSURlcGVuZGVuY3lHcmFwaC5JTlNUQU5DRS5nZXRSZWZlcmVuY2luZ0NvbXBvbmVudHMocHJvamVjdCk7CisJCVNldDxJUHJvamVjdD4gbW9kdWxlc0FscmVhZHlDaGVja2VkID0gbmV3IEhhc2hTZXQ8SVByb2plY3Q+KCk7CisJCW1vZHVsZXNBbHJlYWR5Q2hlY2tlZC5hZGQocHJvamVjdCk7CisJCW1vZHVsZXNBbHJlYWR5Q2hlY2tlZC5hZGRBbGwoZG90Q29tcG9uZW50UmVmZXJlbmNlcyk7CisJCVNldDxJUHJvamVjdD4gYWxsUmVmZXJlbmNlcyA9IG5ldyBIYXNoU2V0IDxJUHJvamVjdD4oKTsKKwkJZm9yKElQcm9qZWN0IGVhclByb2plY3Q6IGRvdENvbXBvbmVudFJlZmVyZW5jZXMpeworCQkJYWxsUmVmZXJlbmNlcy5hZGQoZWFyUHJvamVjdCk7CisJCQlpZihFYXJVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGVhclByb2plY3QpKXsKKwkJCQkvL2ZvciBlYWNoIGVhciwgZ2V0IHRoZSBtb2R1bGVzLCBhbmQgCisJCQkJLy9mb3IgZWFjaCBtb2R1bGUgc2VlIGlmIGl0IGhhcyBhIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSBwcm9qZWN0IGJlaW5nIGRlbGV0ZWQKKwkJCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJQcm9qZWN0KTsKKwkJCQlJVmlydHVhbFJlZmVyZW5jZSBbXSBlYXJSZWZzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKKwkJCQlmb3IoSVZpcnR1YWxSZWZlcmVuY2UgZWFyUmVmIDogZWFyUmVmcyl7CisJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZUNvbXBvbmVudCA9IGVhclJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CisJCQkJCUlQcm9qZWN0IG1vZHVsZVByb2plY3QgPSBtb2R1bGVDb21wb25lbnQuZ2V0UHJvamVjdCgpOworCQkJCQlpZighbW9kdWxlQ29tcG9uZW50LmlzQmluYXJ5KCkgJiYgIW1vZHVsZXNBbHJlYWR5Q2hlY2tlZC5jb250YWlucyhtb2R1bGVQcm9qZWN0KSl7CisJCQkJCQltb2R1bGVzQWxyZWFkeUNoZWNrZWQuYWRkKG1vZHVsZVByb2plY3QpOworCQkJCQkJSVZpcnR1YWxSZWZlcmVuY2UgW10gbW9kdWxlUmVmcyA9IG1vZHVsZUNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7CisJCQkJCQlmb3IgKElWaXJ0dWFsUmVmZXJlbmNlIG1vZHVsZVJlZiA6IG1vZHVsZVJlZnMpIHsKKwkJCQkJCQlJVmlydHVhbENvbXBvbmVudCBtYW5pZmVzdENvbXBvbmVudCA9IG1vZHVsZVJlZi5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7CisJCQkJCQkJaWYobWFuaWZlc3RDb21wb25lbnQuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSl7CisJCQkJCQkJCWFsbFJlZmVyZW5jZXMuYWRkKG1vZHVsZVByb2plY3QpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCUlQcm9qZWN0IFtdIHJlZmVyZW5jaW5nUHJvamVjdHMgPSBhbGxSZWZlcmVuY2VzLnRvQXJyYXkobmV3IElQcm9qZWN0W2FsbFJlZmVyZW5jZXMuc2l6ZSgpXSk7CisJCW1ldGFkYXRhLmNvbXB1dGVEZXBlbmRlbnRNZXRhZGF0YShQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YS5SRUZfQ0FDSElORywgcmVmZXJlbmNpbmdQcm9qZWN0cyk7CiAJCWRlbGV0ZWRQcm9qZWN0TWV0YWRhdGEucHV0KHByb2plY3QuZ2V0TmFtZSgpLCBtZXRhZGF0YSk7CiAJfQogCQpAQCAtMTM4LDE1ICsxNjIsMTUgQEAKIAogCQlpZiAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7CiAJCQlpZiAoaGFzRGVsZXRlZFJlbW92ZWRGbGFncyhmbGFncykpIHsKLQkJCQkvLyBSZW1vdmUgYWxsIGVudHJpZXMgaW50IHRoZSBwcm9qZWN0IGRlcGVuZGVuY3kgY2FjaGUKLQkJCQkvL2NhY2hlLnJlbW92ZVByb2plY3QocHJvamVjdCk7CiAJCQkJLy8gaWYgdGhlIGtpbmQgaXMgUkVNT1ZFRCBhbmQgdGhlcmUgYXJlIG5vIHNwZWNpYWwgZmxhZ3MsIHRoZSBwcm9qZWN0IHdhcyBkZWxldGVkCiAJCQkJUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgbWV0YWRhdGEgPSAoUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpIGRlbGV0ZWRQcm9qZWN0TWV0YWRhdGEucmVtb3ZlKHByb2plY3QuZ2V0TmFtZSgpKTsgCiAJCQkJLy8gbm90ZTogb25seSBwcm9qZWN0cyB3aXRoIE1vZHVsZUNvcmVOYXR1cmUgd2lsbCBoYXZlIGNhY2hlZCBtZXRhZGF0YQogCQkJCWlmIChtZXRhZGF0YSAhPSBudWxsICYmIE9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyLmdldEluc3RhbmNlKCkuc2hvdWxkUmVmYWN0b3JEZWxldGVkUHJvamVjdChtZXRhZGF0YSkpIHsKLQkJCQkJaWYodXNlTFRLID09IGZhbHNlKXsKLQkJCQkJCXByb2Nlc3NEZWxldGUobWV0YWRhdGEpOwotCQkJCQl9CisJCQkJCS8vRGVsZXRlIHJlZmFjdG9yaW5nIGlzIG5vdyBiZWluZyBkb25lIGJ5IHRoZSBMVEsgcmVmYWN0b3JpbmcgZnJhbWV3b3JrCisJCQkJCS8vZm9yIGFsbCBqYXZhIGVlIG1vZHVsZXMuIFBsZWFzZSByZWZlciB0byBKYXZhRUVSZWZhY3RvcmluZ1BhcnRpY2lwYW50CisJCQkJCS8vd2UgYXJlIG9ubHkgY2xlYW5pbmcgdXAgdGhlIHNlcnZlciByZWZlcmVuY2VzIGhlcmUKKwkJCQkJdXBkYXRlU2VydmVyUmVmcyhtZXRhZGF0YSk7CisJCQkJCQogCQkJCX0gCiAJCQl9IAogCQl9IGVsc2UgaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQURERUQgJiYgaGFzUmVuYW1lZEFkZGVkRmxhZ3MoZmxhZ3MpKSB7IC8vIHdhcyByZW5hbWVkCkBAIC0xNjEsMTggKzE4NSw4IEBACiAJCQlpZiAob3JpZ2luYWxNZXRhZGF0YSAhPSBudWxsICYmIE9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyLmdldEluc3RhbmNlKCkuc2hvdWxkUmVmYWN0b3JSZW5hbWVkUHJvamVjdChvcmlnaW5hbE1ldGFkYXRhKSkgewogCQkJCW5ld01ldGFkYXRhLmNvbXB1dGVNZXRhZGF0YShvcmlnaW5hbE1ldGFkYXRhLmdldFByb2plY3QoKSk7CiAJCQkJcHJvY2Vzc1JlbmFtZShvcmlnaW5hbE1ldGFkYXRhLCBuZXdNZXRhZGF0YSwgZGVsdGEpOwotCQkJCS8vIFJlbmFtZSBhbGwgZW50cmllcyBpbiB0aGUgcHJvamVjdCBkZXBlbmRlbmN5IGNhY2hlCi0JCQkJLy9jYWNoZS5yZXBsYWNlUHJvamVjdChvcmlnaW5hbFByb2plY3QsIHByb2plY3QpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBsaWtlbHkgZHVlIHRvIG1pc3NpbmcgdGhlIHByZS1kZWxldGUgZXZlbnQsIHNvIHNldCB0aGUgb3JpZ2luYWwgdG8gYSBtZXRhZGF0YSBiYXNlZCBvbiBuZXcgcHJvamVjdAotCQkJCS8vIGFuZCByZXNldCBwcm9qZWN0IHRvIG9uZSBiYXNlZCBvbiBvcmlnaW5hbCBuYW1lCi0JCQkJLy9Mb2dnZXIuZ2V0TG9nZ2VyKCkubG9nV2FybmluZyhSZWZhY3RvclJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoInByZV9kZWxldGVfbm90X3JlY2VpdmVkX2Zvcl9yZW5hbWVkIiwgbmV3IE9iamVjdFtde29yaWdpbmFsTmFtZSArICIgIiArIGZsYWdzfSkpOwotCQkJfQorCQkJfSAKIAkJfSAKLQkJLy9lbHNlIGlmIChraW5kID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgfHwga2luZCA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCkgeyAKLQkJLy8gKHJlKWNvbXB1dGUgdGhlIGRlcGVuZGVuY2llcwotCQkvL2NhY2hlLnJlZnJlc2hEZXBlbmRlbmNpZXMocHJvamVjdCk7Ci0JCS8vfQkJCiAJfQogCQogCS8qCkBAIC0yMDEsNyArMjE1LDggQEAKIAkgKiBQcm9jZXNzZXMgdGhlIHJlbmFtaW5nIG9mIGEgcHJvamVjdC4KIAkgKi8KIAlwcml2YXRlIHZvaWQgcHJvY2Vzc1JlbmFtZShmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBvcmlnaW5hbE1ldGFkYXRhLCBmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBuZXdNZXRhZGF0YSwgZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJV29ya3NwYWNlSm9iIGpvYiA9IG5ldyBXb3Jrc3BhY2VKb2IoIkoyRUVQcm9qZWN0UmVuYW1lSm9iIikgeworCQlXb3Jrc3BhY2VKb2Igam9iID0gbmV3IFdvcmtzcGFjZUpvYihSZWZhY3Rvck1lc3NhZ2VzLlByb2plY3RSZWZhY3RvcmluZ0xpc3RlbmVyX0oyRUVfUHJvamVjdF9SZW5hbWVfKSB7CisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQkJCWZpbmFsIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlcigpKTsKIAkJCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoUHJvamVjdFJlZmFjdG9yaW5nRGF0YU1vZGVsUHJvdmlkZXIuUFJPSkVDVF9NRVRBREFUQSwgbmV3TWV0YWRhdGEpOwpAQCAtMjEwLDE0ICsyMjUsMTUgQEAKIAkJCQl0cnkgewogCQkJCQlkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7CiAJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZmluYWwgU3RyaW5nIG1zZyA9IFJlZmFjdG9yUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZXJyb3JfdXBkYXRpbmdfcHJvamVjdF9vbl9yZW5hbWUiLCBuZXcgT2JqZWN0W117b3JpZ2luYWxNZXRhZGF0YS5nZXRQcm9qZWN0TmFtZSgpfSk7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihtc2cpOwotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CisJCQkJCWZpbmFsIFN0cmluZyBtc2cgPSBSZWZhY3RvclJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImVycm9yX3VwZGF0aW5nX3Byb2plY3Rfb25fcmVuYW1lIiwgbmV3IE9iamVjdFtde29yaWdpbmFsTWV0YWRhdGEuZ2V0UHJvamVjdE5hbWUoKX0pOyAvLyROT04tTkxTLTEkCisJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IobXNnKTsKKwkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoU3RhdHVzLkVSUk9SLCBKMkVFUGx1Z2luLlBMVUdJTl9JRCwgMCwgbXNnLCBlKTsKIAkJCQl9CQkJCQogCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwogCQkJfQogCQkJCisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBib29sZWFuIGJlbG9uZ3NUbyhmaW5hbCBPYmplY3QgZmFtaWx5KSB7CiAJCQkJcmV0dXJuIFBST0pFQ1RfUkVGQUNUT1JJTkdfSk9CX0ZBTUlMWS5lcXVhbHMoZmFtaWx5KTsKIAkJCX0KQEAgLTIyNywzMSArMjQzLDQ3IEBACiAJCWpvYi5zY2hlZHVsZSgpOwogCX0KIAkKLQkvKgotCSAqIFByb2Nlc3NlcyB0aGUgZGVsZXRpb24gb2YgYSBwcm9qZWN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzRGVsZXRlKGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG1ldGFkYXRhKSB7Ci0JCVdvcmtzcGFjZUpvYiBqb2IgPSBuZXcgV29ya3NwYWNlSm9iKCJKMkVFUHJvamVjdERlbGV0ZUpvYiIpIHsKKwlwcml2YXRlIHZvaWQgdXBkYXRlU2VydmVyUmVmcyhmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3Rvck1ldGFkYXRhKSB7CisJCVdvcmtzcGFjZUpvYiBqb2IgPSBuZXcgV29ya3NwYWNlSm9iKCJTZXJ2ZXJSZWZyZXNoSm9iIikgeyAvLyROT04tTkxTLTEkCisJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCWZpbmFsIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFByb2plY3REZWxldGVEYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoUHJvamVjdFJlZmFjdG9yaW5nRGF0YU1vZGVsUHJvdmlkZXIuUFJPSkVDVF9NRVRBREFUQSwgbWV0YWRhdGEpOwotCQkJCXRyeSB7Ci0JCQkJCWRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlmaW5hbCBTdHJpbmcgbXNnID0gUmVmYWN0b3JSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJlcnJvcl91cGRhdGluZ19wcm9qZWN0X29uX2RlbGV0ZSIsIG5ldyBPYmplY3RbXXttZXRhZGF0YS5nZXRQcm9qZWN0TmFtZSgpfSk7Ci0JCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihtc2cpOwotCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgSjJFRVBsdWdpbi5QTFVHSU5fSUQsIDAsIG1zZywgZSk7CisJCQkJZmluYWwgSU1vZHVsZVtdIG1vZHVsZXNUb1JlbW92ZSA9IHJlZmFjdG9yTWV0YWRhdGEuZ2V0TW9kdWxlcygpOworCQkJCWlmIChtb2R1bGVzVG9SZW1vdmUgPT0gbnVsbCB8fCBtb2R1bGVzVG9SZW1vdmUubGVuZ3RoID09IDApIHsKKwkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCQkJfQorCQkJCWZvciggaW50IGogPSAwOyBqIDwgbW9kdWxlc1RvUmVtb3ZlLmxlbmd0aDsgaisrICkgeworCQkJCQlJU2VydmVyW10gYWZmZWN0ZWRTZXJ2ZXJzID0gcmVmYWN0b3JNZXRhZGF0YS5nZXRTZXJ2ZXJzKG1vZHVsZXNUb1JlbW92ZVtqXSk7CisJCQkJCUlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IG51bGw7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWZmZWN0ZWRTZXJ2ZXJzLmxlbmd0aDsgaSsrKSB7CisJCQkJCQl0cnkgeworCQkJCQkJCXdjID0gYWZmZWN0ZWRTZXJ2ZXJzW2ldLmNyZWF0ZVdvcmtpbmdDb3B5KCk7CisJCQkJCQkJTGlzdCBsaXN0ID0gQXJyYXlzLmFzTGlzdChhZmZlY3RlZFNlcnZlcnNbaV0uZ2V0TW9kdWxlcygpKTsKKwkJCQkJCQlpZiAobGlzdC5jb250YWlucyhtb2R1bGVzVG9SZW1vdmVbal0pKSB7CisJCQkJCQkJCVNlcnZlclV0aWwubW9kaWZ5TW9kdWxlcyh3YywgbnVsbCwgbmV3IElNb2R1bGVbXXttb2R1bGVzVG9SZW1vdmVbal19LCBudWxsKTsKKwkJCQkJCQl9CisJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7CisJCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihjZSk7CisJCQkJCQl9IGZpbmFsbHkgeworCQkJCQkJCXRyeSB7CisJCQkJCQkJCWlmICh3YyAhPSBudWxsKSB7CisJCQkJCQkJCQl3Yy5zYXZlQWxsKHRydWUsIG51bGwpOworCQkJCQkJCQl9CisJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgeworCQkJCQkJCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGNlKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KIAkJCQl9CiAJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CiAJCQl9CiAJCQkKKwkJCUBPdmVycmlkZQogCQkJcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKGZpbmFsIE9iamVjdCBmYW1pbHkpIHsKLQkJCQlyZXR1cm4gUFJPSkVDVF9SRUZBQ1RPUklOR19KT0JfRkFNSUxZLmVxdWFscyhmYW1pbHkpOworCQkJCXJldHVybiBQcm9qZWN0UmVmYWN0b3JpbmdMaXN0ZW5lci5QUk9KRUNUX1JFRkFDVE9SSU5HX0pPQl9GQU1JTFkuZXF1YWxzKGZhbWlseSk7CiAJCQl9CiAJCX07Ci0JCS8vIFhYWCBub3RlOiBtaWdodCB3YW50IHRvIGNvbnNpZGVyIHN3aXRjaGluZyB0byBhIE11bHRpUnVsZSBmb3Igb3B0aW1pemF0aW9uCiAJCWpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwogCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci19CisJfQkKKwkKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL2xpc3RlbmVycy9SZWZhY3Rvck1lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL2xpc3RlbmVycy9SZWZhY3Rvck1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljMzM3NgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3IvbGlzdGVuZXJzL1JlZmFjdG9yTWVzc2FnZXMuamF2YQpAQCAtMCwwICsxLDE1IEBACitwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLmxpc3RlbmVyczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7CisKK3B1YmxpYyBjbGFzcyBSZWZhY3Rvck1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLmxpc3RlbmVycy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBKMkVFRWxlbWVudENoYW5nZWRMaXN0ZW5lcl9KMkVFX0NvbXBvbmVudF9NYXBwaW5nX1VwZGF0ZV87CisJcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdFJlZmFjdG9yaW5nTGlzdGVuZXJfSjJFRV9Qcm9qZWN0X1JlbmFtZV87CisKKwlzdGF0aWMgeworCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBSZWZhY3Rvck1lc3NhZ2VzLmNsYXNzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3IvbGlzdGVuZXJzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL2xpc3RlbmVycy9tZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NjJkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL2xpc3RlbmVycy9tZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMiBAQAorSjJFRUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXJfSjJFRV9Db21wb25lbnRfTWFwcGluZ19VcGRhdGVfPUoyRUUgQ29tcG9uZW50IE1hcHBpbmcgVXBkYXRlCitQcm9qZWN0UmVmYWN0b3JpbmdMaXN0ZW5lcl9KMkVFX1Byb2plY3RfUmVuYW1lXz1KMkVFIFByb2plY3QgUmVuYW1lCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvQ3JlYXRlT3B0aW9uYWxSZWZlcmVuY2VPcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL0NyZWF0ZU9wdGlvbmFsUmVmZXJlbmNlT3AuamF2YQppbmRleCAzNWIwZmI5Li4xNTJmZGNkIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvQ3JlYXRlT3B0aW9uYWxSZWZlcmVuY2VPcC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9DcmVhdGVPcHRpb25hbFJlZmVyZW5jZU9wLmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIAkJc3VwZXIobW9kZWwpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJaWYgKCF2YWxpZGF0ZUVkaXQoKS5pc09LKCkpCiAJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvQ3JlYXRlT3B0aW9uYWxSZWZlcmVuY2VPcERhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvQ3JlYXRlT3B0aW9uYWxSZWZlcmVuY2VPcERhdGFNb2RlbFByb3ZpZGVyLmphdmEKaW5kZXggMzQ4NTE3Yi4uMjA5MmRlZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL0NyZWF0ZU9wdGlvbmFsUmVmZXJlbmNlT3BEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9DcmVhdGVPcHRpb25hbFJlZmVyZW5jZU9wRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMjIsMjEgKzIyLDIzIEBACiAJICogUHJvcGVydHkgdGhhdCBob2xkcyBhIEJvb2xlbiB3aGljaCBjb250cm9scyB3aGV0aGVyIHRoZSBjb21wb25lbnQgcmVmZXJlbmNlIGlzCiAJICogYWRkZWQvcmVtb3ZlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfQ09NUE9ORU5UX1JFRiA9ICJJT3B0aW9uYWxSZWZlcmVuY2VQcm9wZXJ0aWVzLkNSRUFURV9DT01QT05FTlRfUkVGIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfQ09NUE9ORU5UX1JFRiA9ICJJT3B0aW9uYWxSZWZlcmVuY2VQcm9wZXJ0aWVzLkNSRUFURV9DT01QT05FTlRfUkVGIjsgLy8kTk9OLU5MUy0xJAogCS8qKgogCSAqIFByb3BlcnR5IHRoYXQgaG9sZHMgYSBCb29sZW4gd2hpY2ggY29udHJvbHMgd2hldGhlciB0aGUgLnByb2plY3QgcmVmZXJlbmNlIGlzCiAJICogYWRkZWQvcmVtb3ZlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfUFJPSkVDVF9SRUYgPSAiSU9wdGlvbmFsUmVmZXJlbmNlUHJvcGVydGllcy5DUkVBVEVfUFJPSkVDVF9SRUYiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9QUk9KRUNUX1JFRiA9ICJJT3B0aW9uYWxSZWZlcmVuY2VQcm9wZXJ0aWVzLkNSRUFURV9QUk9KRUNUX1JFRiI7IC8vJE5PTi1OTFMtMSQKIAogCQogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRPcGVyYXRpb24oKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7CiAJCXJldHVybiBuZXcgQ3JlYXRlT3B0aW9uYWxSZWZlcmVuY2VPcChtb2RlbCk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKIAkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CiAJCXByb3BlcnR5TmFtZXMuYWRkKENSRUFURV9DT01QT05FTlRfUkVGKTsKQEAgLTQ0LDYgKzQ2LDcgQEAKIAkJcmV0dXJuIHByb3BlcnR5TmFtZXM7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAoQ1JFQVRFX0NPTVBPTkVOVF9SRUYuZXF1YWxzKHByb3BlcnR5TmFtZSkgCiAJCQkJfHxDUkVBVEVfUFJPSkVDVF9SRUYuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9PcHRpb25hbFJlZmFjdG9ySGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL09wdGlvbmFsUmVmYWN0b3JIYW5kbGVyLmphdmEKaW5kZXggYWMzZDdkZC4uNTNhOGUwOCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL09wdGlvbmFsUmVmYWN0b3JIYW5kbGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL09wdGlvbmFsUmVmYWN0b3JIYW5kbGVyLmphdmEKQEAgLTk5LDcgKzk5LDcgQEAKIAogCXByaXZhdGUgY2xhc3MgT3B0aW9uYWxSZWZhY3RvckhhbmRsZXJSZWdpc3RyeVJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKIAotCQlwcml2YXRlIExpc3QgaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0KCk7IAorCQlwcml2YXRlIExpc3QgaW5uZXJIYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsgCiAJCQogCQlwdWJsaWMgT3B0aW9uYWxSZWZhY3RvckhhbmRsZXJSZWdpc3RyeVJlYWRlcigpIHsKIAkJCXN1cGVyKEoyRUVQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlQpOwpAQCAtMTA4LDYgKzEwOCw3IEBACiAJCS8qKgogCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQogCQkgKi8KKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBib29sZWFuIHJlYWRFbGVtZW50KGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7CiAJCQlpZiAoVEFHX09QVElPTkFMX1JFRkFDVE9SLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKIApAQCAtMTMwLDE2ICsxMzEsMTYgQEAKIAogCQkJCX0pOwogCi0JCQkJaGFuZGxlcnMuYWRkKGhhbmRsZXJBcnJheVswXSk7CisJCQkJaW5uZXJIYW5kbGVycy5hZGQoaGFuZGxlckFycmF5WzBdKTsKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJCX0KIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCQkKIAkJcHVibGljIElPcHRpb25hbFJlZmFjdG9ySGFuZGxlciBbXSBnZXRIYW5kbGVycygpIHsKLQkJCUlPcHRpb25hbFJlZmFjdG9ySGFuZGxlciBbXSBoYW5kbGVyc0FycmF5ID0gbmV3IElPcHRpb25hbFJlZmFjdG9ySGFuZGxlcltoYW5kbGVycy5zaXplKCldOworCQkJSU9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyIFtdIGhhbmRsZXJzQXJyYXkgPSBuZXcgSU9wdGlvbmFsUmVmYWN0b3JIYW5kbGVyW2lubmVySGFuZGxlcnMuc2l6ZSgpXTsKIAkJCWZvcihpbnQgaT0wO2k8aGFuZGxlcnNBcnJheS5sZW5ndGg7aSsrKXsKLQkJCQloYW5kbGVyc0FycmF5W2ldID0gKElPcHRpb25hbFJlZmFjdG9ySGFuZGxlciloYW5kbGVycy5nZXQoaSk7CisJCQkJaGFuZGxlcnNBcnJheVtpXSA9IChJT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIpaW5uZXJIYW5kbGVycy5nZXQoaSk7CiAJCQl9CiAJCQlyZXR1cm4gaGFuZGxlcnNBcnJheTsKIAkJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3REZWxldGVEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3REZWxldGVEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDZhYmVlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0RGVsZXRlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIHJmcm9zdEBiZWEuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5yZWZhY3Rvci5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdERlbGV0ZURhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMJUHJvamVjdFJlZmFjdG9yaW5nRGF0YU1vZGVsUHJvdmlkZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdE9wZXJhdGlvbigpCi0JICovCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQcm9qZWN0RGVsZXRlT3BlcmF0aW9uKG1vZGVsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0RGVsZXRlT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdERlbGV0ZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGMxNTc1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0RGVsZXRlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiByZnJvc3RAYmVhLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIFN1YmNsYXNzIG9mIDxjb2RlPlByb2plY3RSZWZhY3Rvck9wZXJhdGlvbjwvY29kZT4gdGhhdCBjb250YWlucyBkZWxldGlvbi1zcGVjaWZpYyBsb2dpYy4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3REZWxldGVPcGVyYXRpb24gZXh0ZW5kcyBQcm9qZWN0UmVmYWN0b3JPcGVyYXRpb24gewotCi0JcHVibGljIFByb2plY3REZWxldGVPcGVyYXRpb24oZmluYWwgSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yT3BlcmF0aW9uI3VwZGF0ZVByb2plY3Qob3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVmYWN0b3Iub3BlcmF0aW9ucy5Qcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9qZWN0KGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIHJlZmFjdG9yZWRNZXRhZGF0YSkgCi0JCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIG1ldGFkYXRhIGZvciBkZXBlbmRlbnQgcHJvamVjdHMKLQkgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlcGVuZGVudFByb2plY3RzKGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIHJlZmFjdG9yZWRNZXRhZGF0YSwKLQkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JICAgIC8vIElmIHRoaXMgaXMgbm90IGFuIEVBUiwgdXBkYXRlIG1ldGFkYXRhIGZvciBkZXBlbmRlbnQgcHJvamVjdHMKLSAgICAgICAgLy8gKG5vdCBwZXJmb3JtaW5nIGFueSByZWZhY3RvcmluZyBmb3IgcHJvamVjdHMgdGhhdCBkZXBlbmQgb24gRUFSJ3MgcmlnaHQgbm93KQotICAgICAgICBpZiAoIXJlZmFjdG9yZWRNZXRhZGF0YS5pc0VBUigpKSB7Ci0gICAgICAgICAgICBzdXBlci51cGRhdGVEZXBlbmRlbnRQcm9qZWN0cyhyZWZhY3RvcmVkTWV0YWRhdGEsIG1vbml0b3IpOwotICAgICAgICB9Ci0JCS8vIHVwZGF0ZSBhbnkgc2VydmVyIGluc3RhbmNlIHJlZnMgdG8gdGhlIHJlZmFjdG9yZWQgcHJvamVjdAotCQlzdXBlci51cGRhdGVTZXJ2ZXJSZWZzKHJlZmFjdG9yZWRNZXRhZGF0YSwgbnVsbCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yT3BlcmF0aW9uI3VwZGF0ZURlcGVuZGVudEVBUlByb2plY3Qob3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVmYWN0b3Iub3BlcmF0aW9ucy5Qcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSwgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucmVmYWN0b3Iub3BlcmF0aW9ucy5Qcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZXBlbmRlbnRFQVJQcm9qZWN0KGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhLCAKLQkJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIHJlZmFjdG9yZWRNZXRhZGF0YSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChPcHRpb25hbFJlZmFjdG9ySGFuZGxlci5nZXRJbnN0YW5jZSgpLnNob3VsZFJlZmFjdG9yRGVwZW5kZW50UHJvamVjdE9uRGVsZXRlKHJlZmFjdG9yZWRNZXRhZGF0YSwgZGVwZW5kZW50TWV0YWRhdGEpKSB7Ci0gICAgICAgICAgICBmaW5hbCBJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IGNyZWF0ZURhdGFNb2RlbChkZXBlbmRlbnRNZXRhZGF0YSwgcmVmYWN0b3JlZE1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICBuZXcgVXBkYXRlRGVwZW5kZW50RUFSb25EZWxldGVQcm92aWRlcigpKTsKLSAgICAgICAgICAgIGRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLSAgICAgICAgfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5yZWZhY3Rvci5vcGVyYXRpb25zLlByb2plY3RSZWZhY3Rvck9wZXJhdGlvbiN1cGRhdGVEZXBlbmRlbnRNb2R1bGVQcm9qZWN0KG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEsIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnJlZmFjdG9yLm9wZXJhdGlvbnMuUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVwZW5kZW50TW9kdWxlUHJvamVjdChmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBkZXBlbmRlbnRNZXRhZGF0YSwgCi0JCQlmaW5hbCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSByZWZhY3RvcmVkTWV0YWRhdGEpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotICAgICAgICBpZiAoT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIuZ2V0SW5zdGFuY2UoKS5zaG91bGRSZWZhY3RvckRlcGVuZGVudFByb2plY3RPbkRlbGV0ZShyZWZhY3RvcmVkTWV0YWRhdGEsIGRlcGVuZGVudE1ldGFkYXRhKSkgewotICAgICAgICAgICAgZmluYWwgSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBjcmVhdGVEYXRhTW9kZWwoZGVwZW5kZW50TWV0YWRhdGEsIHJlZmFjdG9yZWRNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IFVwZGF0ZURlcGVuZGVudE1vZHVsZW9uRGVsZXRlUHJvdmlkZXIoKSk7Ci0gICAgICAgICAgICBkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQl9Ci0KLQlwcml2YXRlIElEYXRhTW9kZWwgY3JlYXRlRGF0YU1vZGVsKGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhLCAKLQkJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIHJlZmFjdG9yZWRNZXRhZGF0YSwKLQkJCWZpbmFsIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJZmluYWwgSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChwcm92aWRlcik7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShQUk9KRUNUX01FVEFEQVRBLCByZWZhY3RvcmVkTWV0YWRhdGEpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoREVQRU5ERU5UX1BST0pFQ1RfTUVUQURBVEEsIGRlcGVuZGVudE1ldGFkYXRhKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVmYWN0b3JNZXRhZGF0YS5qYXZhCmluZGV4IDI5MDUzNTYuLjhlZDQ1YjAgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVmYWN0b3JNZXRhZGF0YS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVmYWN0b3JNZXRhZGF0YS5qYXZhCkBAIC0yNCw3ICsyNCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSUVBUk1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CkBAIC01NiwxMiArNTYsMTIgQEAKIAkKIAlwcml2YXRlIGludCBfdmlydHVhbENvbXBDYWNoaW5nID0gTk9OX0NBQ0hJTkc7CiAJcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBfcHJvamVjdDsKLQlwcml2YXRlIElTZXJ2ZXJbXSBzZXJ2ZXJzOworCXByaXZhdGUgTWFwPElNb2R1bGUsIElTZXJ2ZXJbXT4gc2VydmVyTWFwOwogCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXAgPSBudWxsOwogCXByaXZhdGUgZmluYWwgTGlzdCBkZXBlbmRlbnRNZXRhZGF0YSA9IG5ldyBBcnJheUxpc3QoKTsKIAlwcml2YXRlIGJvb2xlYW4gamF2YU5hdHVyZTsKIAlwcml2YXRlIGJvb2xlYW4gbW9kdWxlQ29yZU5hdHVyZTsKLQlwcml2YXRlIElNb2R1bGUgbW9kdWxlOworCXByaXZhdGUgSU1vZHVsZVtdIG1vZHVsZXM7CiAJcHJpdmF0ZSBTZXQgZmFjZXRzID0gbmV3IEhhc2hTZXQoKTsKIAlwcml2YXRlIGZpbmFsIE1hcCBlYXJUb01vZHVsZVVSSSA9IG5ldyBIYXNoTWFwKCk7CiAJCkBAIC04MCw3ICs4MCw3IEBACiAgICAgcHVibGljIHZvaWQgY29tcHV0ZU1ldGFkYXRhKGZpbmFsIElQcm9qZWN0IG9sZFByb2plY3QpIHsKIAkJdHJ5IHsKIAkJCWphdmFOYXR1cmUgPSBfcHJvamVjdC5oYXNOYXR1cmUoIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQkJbW9kdWxlQ29yZU5hdHVyZSA9IE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShfcHJvamVjdCkgIT0gbnVsbDsKKwkJCW1vZHVsZUNvcmVOYXR1cmUgPSBNb2R1bGVDb3JlTmF0dXJlLmlzRmxleGlibGVQcm9qZWN0KF9wcm9qZWN0KTsKIAkJCWlmIChtb2R1bGVDb3JlTmF0dXJlKSB7CiAJCQkJaWYgKF92aXJ0dWFsQ29tcENhY2hpbmcgPT0gUkVGX0NBQ0hJTkcpIHsKIAkJCQkJdmlydHVhbENvbXAgPSBuZXcgUmVmQ2FjaGluZ1ZpcnR1YWxDb21wb25lbnQoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoX3Byb2plY3QpKTsKQEAgLTkwLDI3ICs5MCw0OCBAQAogCQkJCQl2aXJ0dWFsQ29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KF9wcm9qZWN0KTsJCQkKIAkJCQl9CiAJCQkJZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKF9wcm9qZWN0KTsKLQkJCQltb2R1bGUgPSBTZXJ2ZXJVdGlsLmdldE1vZHVsZShfcHJvamVjdCk7CisJCQkJbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhfcHJvamVjdCk7CiAgICAgICAgICAgICAgICAgLy8gWFhYIER1ZSB0byByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIgb3JkZXIgdW5jZXJ0YWludHksIHRoZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUKICAgICAgICAgICAgICAgICAvLyBtb2R1bGUgbWF5IGJlIGVpdGhlciB0aGUgbmV3IChjb3JyZWN0KSBwcm9qZWN0IG9yIHRoZSBvbGQgcHJvamVjdCBzbyBuZWVkIHRvIHRyeSBib3RoCi0gICAgICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSBudWxsICYmICFfcHJvamVjdC5lcXVhbHMob2xkUHJvamVjdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlID0gU2VydmVyVXRpbC5nZXRNb2R1bGUob2xkUHJvamVjdCk7CisgICAgICAgICAgICAgICAgaWYgKChtb2R1bGVzID09IG51bGwgfHwgbW9kdWxlcy5sZW5ndGggPT0gMCApJiYgIV9wcm9qZWN0LmVxdWFscyhvbGRQcm9qZWN0KSkgeworICAgICAgICAgICAgICAgICAgICBtb2R1bGVzID0gU2VydmVyVXRpbC5nZXRNb2R1bGVzKG9sZFByb2plY3QpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggbW9kdWxlcyA9PSBudWxsICkKKyAgICAgICAgICAgICAgICAJbW9kdWxlcyA9IG5ldyBJTW9kdWxlW117fTsKKyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBmYWNldHMgPSBmYWNldGVkUHJvamVjdC5nZXRQcm9qZWN0RmFjZXRzKCk7CiAgICAgICAgICAgICAgICAgfQogCQkJfQogCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2UpOworCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihjZSk7CiAJCX0gCiAJfQogCiAJcHVibGljIHZvaWQgY29tcHV0ZVNlcnZlcnMoKSB7Ci0JCXNlcnZlcnMgPSBTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShtb2R1bGUsIG51bGwpOworCQlzZXJ2ZXJNYXAgPSBuZXcgSGFzaE1hcDxJTW9kdWxlLCBJU2VydmVyW10+KCk7CisJCWZvciggaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKyApIHsKKwkJCXNlcnZlck1hcC5wdXQobW9kdWxlc1tpXSxTZXJ2ZXJVdGlsLmdldFNlcnZlcnNCeU1vZHVsZShtb2R1bGVzW2ldLCBudWxsKSk7CisJCX0KIAl9CiAJCisJLyoqCisJICogVGhpcyB3aWxsIGdldCB0aGUgc2VydmVycyBmb3IgdGhlIGZpcnN0IG1vZHVsZSBvZiB0aGUgcHJvamVjdAorCSAqLworCUBEZXByZWNhdGVkCiAJcHVibGljIElTZXJ2ZXJbXSBnZXRTZXJ2ZXJzKCkgewotCQlyZXR1cm4gc2VydmVyczsKKwkJaWYoIG1vZHVsZXMgPT0gbnVsbCB8fCBtb2R1bGVzLmxlbmd0aCA9PSAwICkKKwkJCXJldHVybiBuZXcgSVNlcnZlcltde307CisJCXJldHVybiBzZXJ2ZXJNYXAuZ2V0KG1vZHVsZXNbMF0pID09IG51bGwgPyBuZXcgSVNlcnZlcltde30gOiBzZXJ2ZXJNYXAuZ2V0KG1vZHVsZXNbMF0pOworCX0KKwkKKwkvKioKKwkgKiBHZXQgdGhlIGxpc3Qgb2Ygc2VydmVycyB0aGlzIG1vZHVsZSBpcyBvbgorCSAqIEBwYXJhbSBtb2R1bGUKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIElTZXJ2ZXJbXSBnZXRTZXJ2ZXJzKElNb2R1bGUgbW9kdWxlKSB7CisJCXJldHVybiBzZXJ2ZXJNYXAuZ2V0KG1vZHVsZSkgPT0gbnVsbCA/IG5ldyBJU2VydmVyW117fSA6IHNlcnZlck1hcC5nZXQobW9kdWxlKTsKIAl9CiAJCiAJcHVibGljIHZvaWQgY29tcHV0ZURlcGVuZGVudE1ldGFkYXRhKGZpbmFsIGludCB2aXJ0dWFsQ29tcG9uZW50Q2FjaGluZywgZmluYWwgSVByb2plY3RbXSBkZXBlbmRlbnRQcm9qZWN0cykgewpAQCAtMTYyLDggKzE4MywxNyBAQAogCSAqIFJldHJpZXZlcyB0aGUgSU1vZHVsZSBmb3IgdGhlIHByb2plY3QsIG9yIG51bGwgaWYgbm8gSU1vZHVsZSByZXByZXNlbnRhdGlvbgogCSAqIGV4aXN0cy4KIAkgKi8KKwlARGVwcmVjYXRlZAogCXB1YmxpYyBJTW9kdWxlIGdldE1vZHVsZSgpIHsKLQkJcmV0dXJuIG1vZHVsZTsKKwkJcmV0dXJuIG1vZHVsZXMgPT0gbnVsbCB8fCBtb2R1bGVzLmxlbmd0aCA9PSAwID8gbnVsbCA6IG1vZHVsZXNbMF07CisJfQorCQorCS8qKgorCSAqIEdldCBhbGwgbW9kdWxlcyBpbiB0aGlzIHByb2plY3QKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKCkgeworCQlyZXR1cm4gbW9kdWxlczsKIAl9CiAJCiAJLyoqCkBAIC0yNzYsNiArMzA2LDkgQEAKIAkJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcygpIHsKIAkJCXJldHVybiBfY29tcC5nZXRSZWZlcmVuY2VzKCk7CiAJCX0KKwkJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcyhNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbnMpIHsKKwkJCXJldHVybiBfY29tcC5nZXRSZWZlcmVuY2VzKG9wdGlvbnMpOworCQl9CiAJCXB1YmxpYyB2b2lkIHNldENhY2hpbmcoYm9vbGVhbiBjYWNoaW5nKSB7CiAJCQlfY2FjaGluZyA9IGNhY2hpbmc7CiAJCX0KQEAgLTMwNCwxNCArMzM3LDE3IEBACiAJCQlyZXR1cm4gX2NvbXAuZ2V0QWRhcHRlcihhZGFwdGVyKTsKIAkJfQogCQkKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQkJcmV0dXJuIF9jb21wLmVxdWFscyhvKTsKIAkJfQogCQkKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAJCQlyZXR1cm4gX2NvbXAuaGFzaENvZGUoKTsKIAkJfQogCQkKKwkJQE92ZXJyaWRlCiAJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCQlyZXR1cm4gX2NvbXAudG9TdHJpbmcoKTsKIAkJfQpAQCAtMzMwLDYgKzM2Niw3IEBACiAJCQl9CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlIGdldFJlZmVyZW5jZShTdHJpbmcgYUNvbXBvbmVudE5hbWUpIHsKIAkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGdldFJlZmVyZW5jZXMoKTsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewpAQCAtMzQyLDYgKzM3OSw3IEBACiAJCQl9CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQorCQlAT3ZlcnJpZGUKIAkJcHVibGljIElWaXJ0dWFsUmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcygpIHsKIAkJCWlmIChfY2FjaGluZykgewogCQkJCXJldHVybiBjYWNoZWRSZWZzOwpAQCAtMzU0LDExICszOTIsMTIgQEAKIAkJcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudFtdIGNhY2hlZFJlZmVyZXJzOwogCQlwdWJsaWMgUmVmZXJlckNhY2hpbmdWaXJ0dWFsQ29tcG9uZW50KGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXApIHsKIAkJCXN1cGVyKGNvbXApOwotCQkJaWYoY29tcCAhPSBudWxsKXsKKwkJCWlmKGNvbXAhPSBudWxsKXsKIAkJCQljYWNoZWRSZWZlcmVycyA9IGNvbXAuZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKCk7CiAJCQl9CiAJCX0KIAorCQlAT3ZlcnJpZGUKIAkJcHVibGljIElWaXJ0dWFsQ29tcG9uZW50W10gZ2V0UmVmZXJlbmNpbmdDb21wb25lbnRzKCkgewogCQkJaWYgKF9jYWNoaW5nKSB7CiAJCQkJcmV0dXJuIGNhY2hlZFJlZmVyZXJzOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3RSZWZhY3Rvck9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3RSZWZhY3Rvck9wZXJhdGlvbi5qYXZhCmluZGV4IDcyYTlmZDIuLjQyMjBjY2MgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVmYWN0b3JPcGVyYXRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdFJlZmFjdG9yT3BlcmF0aW9uLmphdmEKQEAgLTE1LDcgKzE1LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwpAQCAtMjUsMTIgKzI0LDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyV29ya2luZ0NvcHk7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlclV0aWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLkRlbGV0ZWRNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLk1vZHVsZTsKIAogLyoqCiAgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBwcm9qZWN0IHJlZmFjdG9yaW5nIG9wZXJhdGlvbnMuCkBAIC00OSw2ICs0Niw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIHJlZmFjdG9yZWRNZXRhZGF0YSA9IGdldFByb2plY3RNZXRhZGF0YSgpOwpAQCAtODMsNyArODEsNyBAQAogCQkvLyBnZXQgdGhlIG1ldGFkYXRhIGZvciBhbGwgZGVwZW5kZW50IHByb2plY3RzCiAJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhW10gZGVwZW5kZW50TWV0YWRhdGEgPSByZWZhY3RvcmVkTWV0YWRhdGEuZ2V0RGVwZW5kZW50TWV0YWRhdGEoKTsKIAkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5iZWdpblRhc2soUmVmYWN0b3JSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJ0YXNrX25hbWUiKSwgZGVwZW5kZW50TWV0YWRhdGEubGVuZ3RoKTsgCisJCQltb25pdG9yLmJlZ2luVGFzayhSZWZhY3RvclJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoInRhc2tfbmFtZSIpLCBkZXBlbmRlbnRNZXRhZGF0YS5sZW5ndGgpOyAgLy8kTk9OLU5MUy0xJAogCQl9CiAJCVByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG1ldGFkYXRhOwogCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVudE1ldGFkYXRhLmxlbmd0aDsgaSsrKSB7CkBAIC0xMDksNiArMTA3LDcgQEAKIAkJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG5ld01ldGFkYXRhKQogCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJZmluYWwgSU1vZHVsZSBvcmlnaW5hbE1vZHVsZSA9IG9yaWdpbmFsTWV0YWRhdGEuZ2V0TW9kdWxlKCk7CisKIAkJaWYgKG9yaWdpbmFsTW9kdWxlID09IG51bGwpIHsKIAkJCS8vIG5vIG1vZHVsZSBmb3IgdGhlIG9yaWdpbmFsIHByb2plY3QsIHNvIHJldHVybgogCQkJcmV0dXJuOwpAQCAtMTIxLDE5ICsxMjAsMTcgQEAKIAkJSU1vZHVsZSBuZXdNb2R1bGUgPSBudWxsOwogCQlJTW9kdWxlW10gdG9BZGQgPSBuZXcgSU1vZHVsZVswXTsKIAkJaWYgKG5ld01ldGFkYXRhICE9IG51bGwpIHsKKwkJCS8qIAorCQkJICogRHVlIHRvIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQyOTIsCisJCQkgKiBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBJTW9kdWxlIGZvciB0aGUgcmVuYW1lZCBwcm9qZWN0IGhhcyB0aGUKKwkJCSAqIGlzIHRoZSBuZXdlc3QgYXZhaWxhYmxlIGZyb20gdGhlIG1vZHVsZSBmYWN0b3J5LiAKKwkJCSAqLworCQkJbmV3TWV0YWRhdGEuY29tcHV0ZU1ldGFkYXRhKCk7CiAJCQluZXdNb2R1bGUgPSBuZXdNZXRhZGF0YS5nZXRNb2R1bGUoKTsKIAkJCWlmIChuZXdNb2R1bGUgPT0gbnVsbCkgewogCQkJCS8vIG5vIG1vZHVsZSBmb3IgdGhlIG5ldyBwcm9qZWN0LCBzbyByZXR1cm4KIAkJCQlyZXR1cm47CiAJCQl9Ci0JCQkvLyBYWFggRHVlIHRvIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQyOTIsCi0JCQkvLyBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBJTW9kdWxlIGZvciB0aGUgcmVuYW1lZCBwcm9qZWN0IGhhcyB0aGUKLQkJCS8vIGlkIGFuZCBuYW1lIGZvciB0aGUgcmVuYW1lZCBJUHJvamVjdCBhbmQgbm90IHRoZSBvbGQgbmFtZQotCQkJZmluYWwgSVByb2plY3QgbmV3UHJvamVjdCA9IG5ld01ldGFkYXRhLmdldFByb2plY3QoKTsKLQkJCWZpbmFsIElNb2R1bGVUeXBlIG1vZHVsZVR5cGUgPSBuZXdNb2R1bGUuZ2V0TW9kdWxlVHlwZSgpOwotICAgICAgICAgICAgKChNb2R1bGUpIG5ld01vZHVsZSkuZ2V0TW9kdWxlRmFjdG9yeSgpLmdldE1vZHVsZXMoKTsKLQkJCW5ld01vZHVsZSA9IG5ldyBNb2R1bGUoKChNb2R1bGUpIG5ld01vZHVsZSkuZ2V0TW9kdWxlRmFjdG9yeSgpLCBuZXdQcm9qZWN0LmdldE5hbWUoKSwgbmV3UHJvamVjdC5nZXROYW1lKCksIG1vZHVsZVR5cGUuZ2V0SWQoKSwgCi0JCQkJCW1vZHVsZVR5cGUuZ2V0VmVyc2lvbigpLCBuZXdQcm9qZWN0KTsKIAkJCXRvQWRkID0gbmV3IElNb2R1bGVbXXtuZXdNb2R1bGV9OwogCQl9CiAJCQpAQCAtMTQ4LDEzICsxNDUsMTQgQEAKIAkJCQkJU2VydmVyVXRpbC5tb2RpZnlNb2R1bGVzKHdjLCB0b0FkZCwgdG9SZW1vdmUsIG51bGwpOwogCQkJCX0KIAkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKFJlZmFjdG9yUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZXJyb3JfdXBkYXRpbmdfc2VydmVyIiwgCisJCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihSZWZhY3RvclJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImVycm9yX3VwZGF0aW5nX3NlcnZlciIsICAvLyROT04tTkxTLTEkCiAJCQkJCQluZXcgT2JqZWN0W117c2VydmVyW2ldLmdldElkKCksIG9yaWdpbmFsTWV0YWRhdGEuZ2V0UHJvamVjdE5hbWUoKX0pLCBjZSk7CiAJCQl9IGZpbmFsbHkgewogCQkJCXRyeSB7Ci0JCQkJCXdjLnNhdmVBbGwodHJ1ZSwgbnVsbCk7CisJCQkJCWlmKHdjICE9IG51bGwpCisJCQkJCQl3Yy5zYXZlQWxsKHRydWUsIG51bGwpOwogCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihSZWZhY3RvclJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImVycm9yX3VwZGF0aW5nX3NlcnZlciIsIAorCQkJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKFJlZmFjdG9yUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZXJyb3JfdXBkYXRpbmdfc2VydmVyIiwgIC8vJE5PTi1OTFMtMSQKIAkJCQkJCQluZXcgT2JqZWN0W117c2VydmVyW2ldLmdldElkKCksIG9yaWdpbmFsTWV0YWRhdGEuZ2V0UHJvamVjdE5hbWUoKX0pLCBjZSk7CQkJCQkKIAkJCQl9CiAJCQl9CkBAIC0xODQsNiArMTgyLDcgQEAKIAkgKiBPdmVycmlkZSB0byBkaXNhYmxlIHJlZG8gc3VwcG9ydAogCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNjYW5SZWRvKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBjYW5SZWRvKCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMTkyLDYgKzE5MSw3IEBACiAJICogT3ZlcnJpZGUgdG8gZGlzYWJsZSB1bmRvIHN1cHBvcnQuCiAJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2NhblVuZG8oKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdFJlZmFjdG9yaW5nRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVmYWN0b3JpbmdEYXRhTW9kZWxQcm92aWRlci5qYXZhCmluZGV4IDUzNjczYWIuLjQ3Zjg1OWQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVmYWN0b3JpbmdEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVmYWN0b3JpbmdEYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lcygpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewogCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKIAkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVF9NRVRBREFUQSk7CkBAIC0zNSw2ICszNiw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoamF2YS5sYW5nLlN0cmluZykKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCUl0ZXJhdG9yIGkgPSBnZXRQcm9wZXJ0eU5hbWVzKCkuaXRlcmF0b3IoKTsKIAkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwpAQCAtNDYsNyArNDgsNyBAQAogCQl9CiAJCWlmICghdmFsaWQpIHsKIAkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEoyRUVQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLk9LLCAKLQkJCQkJUmVmYWN0b3JSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJpbnZhbGlkX3Byb3BlcnR5X25hbWUiLCBuZXcgT2JqZWN0W117cHJvcGVydHlOYW1lfSksIG51bGwpOworCQkJCQlSZWZhY3RvclJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImludmFsaWRfcHJvcGVydHlfbmFtZSIsIG5ldyBPYmplY3RbXXtwcm9wZXJ0eU5hbWV9KSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCQlyZXR1cm4gT0tfU1RBVFVTOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVuYW1lRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVuYW1lRGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCAxZmU1ZmZmLi40MzYxYmI2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0xNSwxMiArMTUsMTIgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKIAotcHVibGljIGNsYXNzIFByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzCVByb2plY3RSZWZhY3RvcmluZ0RhdGFNb2RlbFByb3ZpZGVyIAotCWltcGxlbWVudHMgUHJvamVjdFJlZmFjdG9yaW5nUHJvcGVydGllcyB7CitwdWJsaWMgY2xhc3MgUHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMJUHJvamVjdFJlZmFjdG9yaW5nRGF0YU1vZGVsUHJvdmlkZXJ7CiAJCiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lcygpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewogCQlTZXQgcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKICAgICAgICAgcHJvcGVydHlOYW1lcy5hZGQoT1JJR0lOQUxfUFJPSkVDVF9NRVRBREFUQSk7CkBAIC0zMSw2ICszMSw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdE9wZXJhdGlvbigpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKIAkJcmV0dXJuIG5ldyBQcm9qZWN0UmVuYW1lT3BlcmF0aW9uKG1vZGVsKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdFJlbmFtZU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1Byb2plY3RSZW5hbWVPcGVyYXRpb24uamF2YQppbmRleCAyZmZmMDA1Li5mZmFiMDNmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUHJvamVjdFJlbmFtZU9wZXJhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9Qcm9qZWN0UmVuYW1lT3BlcmF0aW9uLmphdmEKQEAgLTE3LDIwICsxNywyNSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVGYWNldENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb3BlcnR5OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CkBAIC00NSw2ICs1MCw3IEBACiAJLyoqCiAJICogT3ZlcnJpZGUgdG8gcmV0dXJuIHRoZSBwcmUtcmVuYW1lIG1ldGFkYXRhLgogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSBnZXRQcm9qZWN0TWV0YWRhdGEoKSB7CiAgICAgICAgIHJldHVybiAoUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpIG1vZGVsLmdldFByb3BlcnR5KFByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlci5PUklHSU5BTF9QUk9KRUNUX01FVEFEQVRBKTsKIAl9CkBAIC01Miw2ICs1OCw3IEBACiAJLyoqCiAJICogVXBkYXRlcyB0aGUgcHJvamVjdCdzIG93biBtZXRhZGF0YS4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9qZWN0KGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG9yaWdpbmFsTWV0YWRhdGEpIAogCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJICAKQEAgLTY4LDE1ICs3NSwzMCBAQAogCQlTdHJ1Y3R1cmVFZGl0IGNvcmUgPSBudWxsOwogCQlXb3JrYmVuY2hDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKIAkJdHJ5ewotCQljb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUocmVmYWN0b3JlZE1ldGFkYXRhLmdldFByb2plY3QoKSk7Ci0JCWlmKGNvcmUgIT0gbnVsbCl7Ci0JCWNvbXBvbmVudCA9IGNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCX0KKwkJCWNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShyZWZhY3RvcmVkTWV0YWRhdGEuZ2V0UHJvamVjdCgpKTsKKwkJCWlmKGNvcmUgIT0gbnVsbCl7CisJCQkJY29tcG9uZW50ID0gY29yZS5nZXRDb21wb25lbnQoKTsKKwkJCX0KIAkKLQkJLy8gaWYgdGhlIGRlcGxveS1uYW1lIGVxdWFscyB0aGUgb2xkIHByb2plY3QgbmFtZSwgdXBkYXRlIGl0IGluIHRoZSBtb2R1bGUtc3BlY2lmaWMgZGVwbG95bWVudCBkZXNjcmlwdG9yCi0JCWlmIChjb21wb25lbnQgIT0gbnVsbCAmJiBjb21wb25lbnQuZ2V0TmFtZSgpLmVxdWFscyhvcmlnaW5hbE1ldGFkYXRhLmdldFByb2plY3ROYW1lKCkpKSB7Ci0JCQljb21wb25lbnQuc2V0TmFtZShyZWZhY3RvcmVkTWV0YWRhdGEuZ2V0UHJvamVjdE5hbWUoKSk7Ci0JCX0KKwkJCS8vIGlmIHRoZSBkZXBsb3ktbmFtZSBlcXVhbHMgdGhlIG9sZCBwcm9qZWN0IG5hbWUsIHVwZGF0ZSBpdCBpbiB0aGUgbW9kdWxlLXNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorCQkJaWYgKGNvbXBvbmVudCAhPSBudWxsICYmIGNvbXBvbmVudC5nZXROYW1lKCkuZXF1YWxzKG9yaWdpbmFsTWV0YWRhdGEuZ2V0UHJvamVjdE5hbWUoKSkpIHsKKwkJCQljb21wb25lbnQuc2V0TmFtZShyZWZhY3RvcmVkTWV0YWRhdGEuZ2V0UHJvamVjdE5hbWUoKSk7CisJCQl9CisJCQkKKwkJCS8vdXBkYXRlIHRoZSBqYXZhLW91dHB1dC1wYXRoIHByb3BlcnR5CisJCQlpZiAoY29tcG9uZW50ICE9IG51bGwpeworCQkJCUxpc3Q8UHJvcGVydHk+IHByb3BlcnRpZXMgPSBjb21wb25lbnQuZ2V0UHJvcGVydGllcygpOworCQkJCWZvciAoUHJvcGVydHkgcHJvcGVydHk6cHJvcGVydGllcyl7CisJCQkJCWlmIChwcm9wZXJ0eS5nZXROYW1lKCkuZXF1YWxzKElNb2R1bGVDb25zdGFudHMuUFJPSl9SRUxfSkFWQV9PVVRQVVRfUEFUSCkpeworCQkJCQkJSVBhdGggamF2YU91dHB1dFBhdGggPSBuZXcgUGF0aChwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKKwkJCQkJCUlQYXRoIG9sZFByb2plY3ROYW1lUGF0aCA9IG5ldyBQYXRoKG9sZFByb2plY3ROYW1lKS5tYWtlQWJzb2x1dGUoKTsJCQkJCQorCQkJCQkJaWYgKG9sZFByb2plY3ROYW1lUGF0aC5pc1ByZWZpeE9mKGphdmFPdXRwdXRQYXRoKSl7CisJCQkJCQkJSVBhdGggbmV3SmF2YU91dHB1dFBhdGggPSBuZXcgUGF0aChuZXdQcm9qZWN0TmFtZSkuYXBwZW5kKGphdmFPdXRwdXRQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpLm1ha2VBYnNvbHV0ZSgpOwkJCQkJCQorCQkJCQkJCXByb3BlcnR5LnNldFZhbHVlKG5ld0phdmFPdXRwdXRQYXRoLnRvU3RyaW5nKCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQkJCQorCQkJfQogCQl9ZmluYWxseSB7CiAJCQlpZihjb3JlICE9IG51bGwpIHsKIAkJCQljb3JlLnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKQEAgLTg0LDExICsxMDYsMTIgQEAKIAkJCX0KIAkJfQogCQlmaW5hbCBJUHJvamVjdCByZWZhY3RvcmVkUHJvamVjdCA9IHJlZmFjdG9yZWRNZXRhZGF0YS5nZXRQcm9qZWN0KCk7Ci0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc1V0aWxpdHlQcm9qZWN0KHJlZmFjdG9yZWRQcm9qZWN0KSkgewotCQkJLy8gc2tpcCBpZiBhIHV0aWxpdHkgcHJvamVjdCAod2lsbCBub3QgaGF2ZSBhIE1vZGVsUHJvdmlkZXIgYW5kIGNoZWNraW5nIGxvZ3MgYW4gZXJyb3IKKwkJU3RyaW5nIHBUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFR5cGUocmVmYWN0b3JlZFByb2plY3QpOworCQlpZihJSjJFRUZhY2V0Q29uc3RhbnRzLlVUSUxJVFkuZXF1YWxzKHBUeXBlKSB8fCAiIi5lcXVhbHMocFR5cGUpIHx8IElKMkVFRmFjZXRDb25zdGFudHMuU1RBVElDX1dFQi5lcXVhbHMocFR5cGUpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCS8vIHNraXAgaWYgYSB1dGlsaXR5IG9yIHN0YXRpYyB3ZWIgcHJvamVjdCAod2lsbCBub3QgaGF2ZSBhIE1vZGVsUHJvdmlkZXIgYW5kIGNoZWNraW5nIGxvZ3MgYW4gZXJyb3IKIAkJCXJldHVybjsKIAkJfQotCQlmaW5hbCBJTW9kZWxQcm92aWRlciBtb2RlbCA9IChJTW9kZWxQcm92aWRlcilNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHJlZmFjdG9yZWRQcm9qZWN0KTsKKwkJZmluYWwgSU1vZGVsUHJvdmlkZXIgbW9kZWwgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHJlZmFjdG9yZWRQcm9qZWN0KTsKIAkJaWYgKG1vZGVsICE9IG51bGwpIHsKIAkJCW1vZGVsLm1vZGlmeShuZXcgUnVubmFibGUoKSB7CiAJCQkJcHVibGljIHZvaWQgcnVuKCkgewpAQCAtMTI3LDYgKzE1MCw3IEBACiAJICogVXBkYXRlcyB0aGUgbWV0YWRhdGEgZm9yIGRlcGVuZGVudCBwcm9qZWN0cwogCSAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uCiAJICovCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVwZW5kZW50UHJvamVjdHMoZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgb3JpZ2luYWxNZXRhZGF0YSwKIAkJCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJICAgIC8vIElmIHRoaXMgaXMgbm90IGFuIEVBUiwgdXBkYXRlIG1ldGFkYXRhIGZvciBkZXBlbmRlbnQgcHJvamVjdHMKQEAgLTE0NCw2ICsxNjgsNyBAQAogCS8qKgogCSAqIFVwZGF0ZXMgdGhlIGRlcGVuZGVudCBFQVIgcHJvamVjdCB0byBhY2NvdW50IGZvciB0aGUgcmVuYW1pbmcgb2YgdGhlIHJlZmVyZW5jZWQgcHJvamVjdC4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZXBlbmRlbnRFQVJQcm9qZWN0KGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhLCAKIAkJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG9yaWdpbmFsTWV0YWRhdGEpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogICAgICAgICBpZiAoT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIuZ2V0SW5zdGFuY2UoKS5zaG91bGRSZWZhY3RvckRlcGVuZGVudFByb2plY3RPblJlbmFtZShvcmlnaW5hbE1ldGFkYXRhLCBkZXBlbmRlbnRNZXRhZGF0YSkpIHsKQEAgLTE1Niw2ICsxODEsNyBAQAogCS8qKgogCSAqIFVwZGF0ZXMgdGhlIGRlcGVuZGVudCBtb2R1bGUgcHJvamVjdCB0byBhY2NvdW50IGZvciB0aGUgcmVuYW1pbmcgb2YgdGhlIHJlZmVyZW5jZWQgcHJvamVjdC4KIAkgKi8KKwlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZXBlbmRlbnRNb2R1bGVQcm9qZWN0KGZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhLCAKIAkJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIG9yaWdpbmFsTWV0YWRhdGEpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogICAgICAgICBpZiAoT3B0aW9uYWxSZWZhY3RvckhhbmRsZXIuZ2V0SW5zdGFuY2UoKS5zaG91bGRSZWZhY3RvckRlcGVuZGVudFByb2plY3RPblJlbmFtZShvcmlnaW5hbE1ldGFkYXRhLCBkZXBlbmRlbnRNZXRhZGF0YSkpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9SZW1vdmVEZWxldGVkQ29tcG9uZW50RnJvbUVBUkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUmVtb3ZlRGVsZXRlZENvbXBvbmVudEZyb21FQVJEYXRhTW9kZWxQcm92aWRlci5qYXZhCmluZGV4IDMxNTk2ZDAuLjFmNWUxYjEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9SZW1vdmVEZWxldGVkQ29tcG9uZW50RnJvbUVBUkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1JlbW92ZURlbGV0ZWRDb21wb25lbnRGcm9tRUFSRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMTUsNiArMTUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlJlbW92ZUNvbXBvbmVudEZyb21FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSUoyRUVNb2R1bGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247CiAKQEAgLTI2LDYgKzI3LDcgQEAKIAkJX21ldGFkYXRhID0gbWV0YWRhdGE7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewogCQlpZiAoVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewogCQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7CkBAIC0zNSwxMyArMzcsMTMgQEAKIC8vCQkJCUlQcm9qZWN0IHByb2plY3QgPSBjb21wb25lbnQuZ2V0UHJvamVjdCgpOwogCQkJCVN0cmluZyBuYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKIAkJCQlpZiAoX21ldGFkYXRhLmlzV2ViKCkpIHsKLQkJCQkJbmFtZSArPSAiLndhciI7IC8vJE5PTi1OTFMtMSQJCQkKKwkJCQkJbmFtZSArPSBJSjJFRU1vZHVsZUNvbnN0YW50cy5XQVJfRVhUOwogCQkJCX0gZWxzZSBpZiAoX21ldGFkYXRhLmlzRUpCKCkpIHsKLQkJCQkJbmFtZSArPSAiLmphciI7IC8vJE5PTi1OTFMtMSQJCQkKKwkJCQkJbmFtZSArPSBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUOwogCQkJCX0gZWxzZSBpZiAoX21ldGFkYXRhLmlzQXBwQ2xpZW50KCkpIHsKLQkJCQkJbmFtZSArPSAiLmphciI7IC8vJE5PTi1OTFMtMSQJCQkKKwkJCQkJbmFtZSArPSBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUOwogCQkJCX0gZWxzZSBpZiAoX21ldGFkYXRhLmlzQ29ubmVjdG9yKCkpIHsKLQkJCQkJbmFtZSArPSAiLnJhciI7IC8vJE5PTi1OTFMtMSQJCQkKKwkJCQkJbmFtZSArPSBJSjJFRU1vZHVsZUNvbnN0YW50cy5SQVJfRVhUOwogCQkJCX0KIAkJCQltYXAucHV0KGNvbXBvbmVudCwgbmFtZSk7CiAJCQl9CkBAIC01MCw2ICs1Miw3IEBACiAJCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewogCQlyZXR1cm4gbmV3IFJlbW92ZURlbGV0ZWRDb21wb25lbnRGcm9tRUFST3BlcmF0aW9uKG1vZGVsKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvUmVtb3ZlRGVsZXRlZENvbXBvbmVudEZyb21FQVJPcGVyYXRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9SZW1vdmVEZWxldGVkQ29tcG9uZW50RnJvbUVBUk9wZXJhdGlvbi5qYXZhCmluZGV4IGE3NmMwZmEuLjMxNTMxZDUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9SZW1vdmVEZWxldGVkQ29tcG9uZW50RnJvbUVBUk9wZXJhdGlvbi5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9SZW1vdmVEZWxldGVkQ29tcG9uZW50RnJvbUVBUk9wZXJhdGlvbi5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiAJCXN1cGVyKG1vZGVsKTsKIAl9CiAJCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kdWxlVVJJKGZpbmFsIElFQVJNb2RlbFByb3ZpZGVyIGVhck1vZGVsLCBmaW5hbCBJVmlydHVhbENvbXBvbmVudCB0YXJnZXRDb21wb25lbnQpIHsKIAkJU3RyaW5nIHVyaSA9IGVhck1vZGVsLmdldE1vZHVsZVVSSSh0YXJnZXRDb21wb25lbnQpOwogCQlpZiAodXJpID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRFQVJvbkRlbGV0ZU9wLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50RUFSb25EZWxldGVPcC5qYXZhCmluZGV4IDU1YTY2MGEuLjM2NmU0NGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRFQVJvbkRlbGV0ZU9wLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudEVBUm9uRGVsZXRlT3AuamF2YQpAQCAtNDIsNiArNDIsNyBAQAogCS8qIChub24tSmF2YWRvYykKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhID0gKFByb2plY3RSZWZhY3Rvck1ldGFkYXRhKSBtb2RlbC5nZXRQcm9wZXJ0eShERVBFTkRFTlRfUFJPSkVDVF9NRVRBREFUQSk7CiAJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIHJlZmFjdG9yZWRNZXRhZGF0YSA9IChQcm9qZWN0UmVmYWN0b3JNZXRhZGF0YSkgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVF9NRVRBREFUQSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50RUFSb25EZWxldGVQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudEVBUm9uRGVsZXRlUHJvdmlkZXIuamF2YQppbmRleCAxYTRmMGNhLi41N2IyYjdhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50RUFSb25EZWxldGVQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRFQVJvbkRlbGV0ZVByb3ZpZGVyLmphdmEKQEAgLTEyLDEwICsxMiw5IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVEZXBlbmRlbnRFQVJvbkRlbGV0ZVByb3ZpZGVyIGV4dGVuZHMgVXBkYXRlRGVwZW5kZW50UHJvamVjdERhdGFNb2RlbFByb3ZpZGVyIAotCWltcGxlbWVudHMgUHJvamVjdFJlZmFjdG9yaW5nUHJvcGVydGllcyB7CitwdWJsaWMgY2xhc3MgVXBkYXRlRGVwZW5kZW50RUFSb25EZWxldGVQcm92aWRlciBleHRlbmRzIFVwZGF0ZURlcGVuZGVudFByb2plY3REYXRhTW9kZWxQcm92aWRlciB7CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKIAkJcmV0dXJuIG5ldyBVcGRhdGVEZXBlbmRlbnRFQVJvbkRlbGV0ZU9wKG1vZGVsKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50RUFSb25SZW5hbWVPcC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudEVBUm9uUmVuYW1lT3AuamF2YQppbmRleCBkZTg1MmRkLi4wODkwNjkxIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50RUFSb25SZW5hbWVPcC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRFQVJvblJlbmFtZU9wLmphdmEKQEAgLTQzLDYgKzQzLDcgQEAKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuSVVuZG9hYmxlT3BlcmF0aW9uI2V4ZWN1dGUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogCQkKIAkJZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgZGVwZW5kZW50TWV0YWRhdGEgPSAoUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpIG1vZGVsLmdldFByb3BlcnR5KERFUEVOREVOVF9QUk9KRUNUX01FVEFEQVRBKTsKQEAgLTkwLDcgKzkxLDcgQEAKIAkJCXJlZmRtLnNldEJvb2xlYW5Qcm9wZXJ0eShDcmVhdGVPcHRpb25hbFJlZmVyZW5jZU9wRGF0YU1vZGVsUHJvdmlkZXIuQ1JFQVRFX1BST0pFQ1RfUkVGLGhhZFByb2plY3RSZWZlcmVuY2UpOwogCQkJcmVmZG0uZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7CiAJCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKFJlZmFjdG9yUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygibWlzc2luZ19uYXR1cmVzIiksIG51bGwpOworCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihSZWZhY3RvclJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIm1pc3NpbmdfbmF0dXJlcyIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRFQVJvblJlbmFtZVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50RUFSb25SZW5hbWVQcm92aWRlci5qYXZhCmluZGV4IGU5YWJjMWIuLmEzMzM5YjkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRFQVJvblJlbmFtZVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudEVBUm9uUmVuYW1lUHJvdmlkZXIuamF2YQpAQCAtMTMsOSArMTMsOSBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwogCi1wdWJsaWMgY2xhc3MgVXBkYXRlRGVwZW5kZW50RUFSb25SZW5hbWVQcm92aWRlciBleHRlbmRzIFVwZGF0ZURlcGVuZGVudFByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlciAKLQlpbXBsZW1lbnRzIFByb2plY3RSZWZhY3RvcmluZ1Byb3BlcnRpZXMgeworcHVibGljIGNsYXNzIFVwZGF0ZURlcGVuZGVudEVBUm9uUmVuYW1lUHJvdmlkZXIgZXh0ZW5kcyBVcGRhdGVEZXBlbmRlbnRQcm9qZWN0UmVuYW1lRGF0YU1vZGVsUHJvdmlkZXJ7CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewogCQlyZXR1cm4gbmV3IFVwZGF0ZURlcGVuZGVudEVBUm9uUmVuYW1lT3AobW9kZWwpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRNb2R1bGVvbkRlbGV0ZU9wLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50TW9kdWxlb25EZWxldGVPcC5qYXZhCmluZGV4IGRlMWFiN2YuLmYxMDJiNDkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRNb2R1bGVvbkRlbGV0ZU9wLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudE1vZHVsZW9uRGVsZXRlT3AuamF2YQpAQCAtNyw2ICs3LDcgQEAKICAqIAogICogQ29udHJpYnV0b3JzOgogICogcmZyb3N0QGJlYS5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIElCTSAtIGJ1ZyAyODEzODIgY2xlYW4gdXAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLm9wZXJhdGlvbnM7CkBAIC0zMiw2ICszMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlTWFuaWZlc3RJbXBsOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLklKMkVFTW9kdWxlQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnJlZmFjdG9yLlJlZmFjdG9yUmVzb3VyY2VIYW5kbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5SZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXI7CkBAIC01OCw2ICs2MCw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgZGVwZW5kZW50TWV0YWRhdGEgPSAoUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEpIG1vZGVsLmdldFByb3BlcnR5KERFUEVOREVOVF9QUk9KRUNUX01FVEFEQVRBKTsKIAkJZmluYWwgUHJvamVjdFJlZmFjdG9yTWV0YWRhdGEgcmVmYWN0b3JlZE1ldGFkYXRhID0gKFByb2plY3RSZWZhY3Rvck1ldGFkYXRhKSBtb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUX01FVEFEQVRBKTsKQEAgLTEyMSw3ICsxMjQsNyBAQAogCQkJZmluYWwgQXJjaGl2ZU1hbmlmZXN0IG1hbmlmZXN0ID0gZ2V0QXJjaGl2ZU1hbmlmZXN0KG1hbmlmZXN0bWYpOwogCQkJU3RyaW5nW10gY3AgPSBtYW5pZmVzdC5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKIAkJCUxpc3QgY3BMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJU3RyaW5nIG5ld0NwID0gcmVmYWN0b3JlZFByb2pOYW1lICsgIi5qYXIiOy8vJE5PTi1OTFMtMSQKKwkJCVN0cmluZyBuZXdDcCA9IHJlZmFjdG9yZWRQcm9qTmFtZSArIElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQ7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7CiAJCQkJaWYgKCFjcFtpXS5lcXVhbHMobmV3Q3ApKSB7CiAJCQkJCWNwTGlzdC5hZGQoY3BbaV0pOwpAQCAtMTQyLDkgKzE0NSw5IEBACiAJCQlBcmNoaXZlTWFuaWZlc3QgbWYgPSBuZXcgQXJjaGl2ZU1hbmlmZXN0SW1wbChuZXcgTWFuaWZlc3QoaW4pKTsKIAkJCXJldHVybiBtZjsKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihSZWZhY3RvclJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImVycm9yX3JlYWRpbmdfbWFuaWZlc3QiKSwgY2UpOworCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihSZWZhY3RvclJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoImVycm9yX3JlYWRpbmdfbWFuaWZlc3QiKSwgY2UpOyAvLyROT04tTkxTLTEkCiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKFJlZmFjdG9yUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZXJyb3JfcmVhZGluZ19tYW5pZmVzdCIpLCBpbyk7CisJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKFJlZmFjdG9yUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiZXJyb3JfcmVhZGluZ19tYW5pZmVzdCIpLCBpbyk7IC8vJE5PTi1OTFMtMSQKIAkJfSBmaW5hbGx5IHsKIAkJCWlmIChpbiAhPSBudWxsKSB7CiAJCQkJdHJ5IHsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRNb2R1bGVvbkRlbGV0ZVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50TW9kdWxlb25EZWxldGVQcm92aWRlci5qYXZhCmluZGV4IGMzMzY1YzYuLjU0MjU1MTIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRNb2R1bGVvbkRlbGV0ZVByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudE1vZHVsZW9uRGVsZXRlUHJvdmlkZXIuamF2YQpAQCAtMTIsMTAgKzEyLDkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucmVmYWN0b3Iub3BlcmF0aW9uczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFVwZGF0ZURlcGVuZGVudE1vZHVsZW9uRGVsZXRlUHJvdmlkZXIgZXh0ZW5kcyBVcGRhdGVEZXBlbmRlbnRQcm9qZWN0RGF0YU1vZGVsUHJvdmlkZXIgCi0JaW1wbGVtZW50cyBQcm9qZWN0UmVmYWN0b3JpbmdQcm9wZXJ0aWVzIHsKK3B1YmxpYyBjbGFzcyBVcGRhdGVEZXBlbmRlbnRNb2R1bGVvbkRlbGV0ZVByb3ZpZGVyIGV4dGVuZHMgVXBkYXRlRGVwZW5kZW50UHJvamVjdERhdGFNb2RlbFByb3ZpZGVyewogCQorCUBPdmVycmlkZQogCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7CiAJCXJldHVybiBuZXcgVXBkYXRlRGVwZW5kZW50TW9kdWxlb25EZWxldGVPcChtb2RlbCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudE1vZHVsZW9uUmVuYW1lT3AuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRNb2R1bGVvblJlbmFtZU9wLmphdmEKaW5kZXggNDIyZmNiNS4uNzkzOWMyOSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudE1vZHVsZW9uUmVuYW1lT3AuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50TW9kdWxlb25SZW5hbWVPcC5qYXZhCkBAIC0zOCw2ICszOCw3IEBACiAJLyogKG5vbi1KYXZhZG9jKQogCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKIAkJCiAJCWZpbmFsIFByb2plY3RSZWZhY3Rvck1ldGFkYXRhIGRlcGVuZGVudE1ldGFkYXRhID0gKFByb2plY3RSZWZhY3Rvck1ldGFkYXRhKSBtb2RlbC5nZXRQcm9wZXJ0eShERVBFTkRFTlRfUFJPSkVDVF9NRVRBREFUQSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50TW9kdWxlb25SZW5hbWVQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudE1vZHVsZW9uUmVuYW1lUHJvdmlkZXIuamF2YQppbmRleCAyOTFiNDBjLi45OGE1NmY2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50TW9kdWxlb25SZW5hbWVQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRNb2R1bGVvblJlbmFtZVByb3ZpZGVyLmphdmEKQEAgLTEzLDkgKzEzLDkgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbjsKIAotcHVibGljIGNsYXNzIFVwZGF0ZURlcGVuZGVudE1vZHVsZW9uUmVuYW1lUHJvdmlkZXIgZXh0ZW5kcyBVcGRhdGVEZXBlbmRlbnRQcm9qZWN0UmVuYW1lRGF0YU1vZGVsUHJvdmlkZXIgCi0JaW1wbGVtZW50cyBQcm9qZWN0UmVmYWN0b3JpbmdQcm9wZXJ0aWVzIHsKK3B1YmxpYyBjbGFzcyBVcGRhdGVEZXBlbmRlbnRNb2R1bGVvblJlbmFtZVByb3ZpZGVyIGV4dGVuZHMgVXBkYXRlRGVwZW5kZW50UHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyIHsKIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewogCQlyZXR1cm4gbmV3IFVwZGF0ZURlcGVuZGVudE1vZHVsZW9uUmVuYW1lT3AobW9kZWwpOwogCX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRQcm9qZWN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRQcm9qZWN0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCA1NzRmZDQwLi5kZWQxNTVmIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50UHJvamVjdERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudFByb2plY3REYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0xMywxMiArMTMsMTIgQEAKIAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVcGRhdGVEZXBlbmRlbnRQcm9qZWN0RGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBQcm9qZWN0UmVmYWN0b3JpbmdEYXRhTW9kZWxQcm92aWRlciAKLQlpbXBsZW1lbnRzIFByb2plY3RSZWZhY3RvcmluZ1Byb3BlcnRpZXMgeworcHVibGljIGFic3RyYWN0IGNsYXNzIFVwZGF0ZURlcGVuZGVudFByb2plY3REYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIFByb2plY3RSZWZhY3RvcmluZ0RhdGFNb2RlbFByb3ZpZGVyIHsKIAkKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlciNnZXRQcm9wZXJ0eU5hbWVzKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7CiAJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwogCQlwcm9wZXJ0eU5hbWVzLmFkZChERVBFTkRFTlRfUFJPSkVDVF9NRVRBREFUQSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50UHJvamVjdE9wLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50UHJvamVjdE9wLmphdmEKaW5kZXggODI0ODJhOC4uYjczNTE2OCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudFByb2plY3RPcC5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRQcm9qZWN0T3AuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxPcGVyYXRpb247CkBAIC03Miw3ICs3Miw3IEBACiAJCQkJfQogCQkJfSAKIAkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNlKTsKKwkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoY2UpOwogCQl9CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC05Myw2ICs5Myw3IEBACiAJICogT3ZlcnJpZGUgdG8gZGlzYWJsZSByZWRvIHN1cHBvcnQKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb2FibGVPcGVyYXRpb24jY2FuUmVkbygpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gY2FuUmVkbygpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTEwMSw2ICsxMDIsNyBAQAogCSAqIE92ZXJyaWRlIHRvIGRpc2FibGUgdW5kbyBzdXBwb3J0LgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLklVbmRvYWJsZU9wZXJhdGlvbiNjYW5VbmRvKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudFByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9yZWZhY3Rvci9vcmcvZWNsaXBzZS9qc3QvajJlZS9yZWZhY3Rvci9vcGVyYXRpb25zL1VwZGF0ZURlcGVuZGVudFByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlci5qYXZhCmluZGV4IGZlOWQ0ZmUuLmVmODg5MWIgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvcmVmYWN0b3Ivb3JnL2VjbGlwc2UvanN0L2oyZWUvcmVmYWN0b3Ivb3BlcmF0aW9ucy9VcGRhdGVEZXBlbmRlbnRQcm9qZWN0UmVuYW1lRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3JlZmFjdG9yL29yZy9lY2xpcHNlL2pzdC9qMmVlL3JlZmFjdG9yL29wZXJhdGlvbnMvVXBkYXRlRGVwZW5kZW50UHJvamVjdFJlbmFtZURhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTEzLDEyICsxMywxMiBAQAogCiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIFVwZGF0ZURlcGVuZGVudFByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIFByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlciAKLQlpbXBsZW1lbnRzIFByb2plY3RSZWZhY3RvcmluZ1Byb3BlcnRpZXMgeworcHVibGljIGFic3RyYWN0IGNsYXNzIFVwZGF0ZURlcGVuZGVudFByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIFByb2plY3RSZW5hbWVEYXRhTW9kZWxQcm92aWRlcnsKIAkKIAkvKiAobm9uLUphdmFkb2MpCiAJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlciNnZXRQcm9wZXJ0eU5hbWVzKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7CiAJCVNldCBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwogCQlwcm9wZXJ0eU5hbWVzLmFkZChERVBFTkRFTlRfUFJPSkVDVF9NRVRBREFUQSk7CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9DbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9uLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9DbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9uLmV4c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3ZTUwNQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmoyZWUvc2NoZW1hL0NsYXNzcGF0aERlcGVuZGVuY3lFeHRlbnNpb24uZXhzZApAQCAtMCwwICsxLDExOSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Cis8c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Cis8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUiIGlkPSJDbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9uIiBuYW1lPSJDbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9uIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxpbmNsdWRlIHNjaGVtYUxvY2F0aW9uPSJzY2hlbWE6Ly9vcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3NjaGVtYS9leHByZXNzaW9uTGFuZ3VhZ2UuZXhzZCIvPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KKyAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgVGhpcyBleHRlbnNpb24gaXMgdXNlZCBieSBleHRlbmRlcnMgdG8gaW5kaWNhdGUgaWYgYSBwYXJ0aWN1bGFyIHByb2plY3Qgd2lsbCBoYW5kbGUgdGhlIGV4cG9ydGluZyBvZiBleHRlcm5hbCBqYXJzIHJlZmVyZW5jZWQgaW4gdGhlIGNsYXNzcGF0aC4gIEl0IGFsc28gYWxsb3dzIHRoZSBleHRlbmRlciB0byBwcm92aWRlIHRoZSBwYXRoIG9yIHdoZXJlIHRoZSBleHRlcm5hbCBqYXIgd2lsbCBiZSBsb2NhdGVkIGluIGFuIGV4cG9ydGVkIHByb2plY3QuCisgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNsYXNzcGF0aGRlcGVuZGVuY3kiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgIDwvc2VxdWVuY2U+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KKyAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0iY2xhc3NwYXRoZGVwZW5kZW5jeSI+CisgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgVGhpcyBlbGVtZW50IGFsbG93cyB0aGUgZXh0ZW5kZXIgdG8gcHJvdmlkZSBhbiBlbmFibGVtZW50IGNoaWxkIGVsZW1lbnQuICBUaGUgZW5hYmxlbWVudCBlbGVtZW50IGFsbG93cyB0aGUgZXh0ZW5kZXIgdG8gaW5kaWNhdGUgYXQgYSBoaWdoIGxldmVsIGlmIHRoaXMgcHJvamVjdCBhcHBsaWVzIHRvIHRoZW0uICBJZiBubyBlbmFibGVtZW50IGVsZW1lbnQgaXMgcHJvdmlkZWQgYW4gZW5hYmxlbWVudCB2YWx1ZSBvZiB0cnVlIGlzIGFzc3VtZWQuICBUaGUgY2xhc3NwYXRoZGVwZW5kZW5jeSBlbGVtZW50IGFsc28gcmVxdWlyZXMgdGhhdCBhIGNsYXNzIGF0dHJpYnV0ZSBiZSBzcGVjaWZpZWQuICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgY2xhc3MgYXR0cmlidXRlIGZvciBtb3JlIGRldGFpbHMuCisgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICA8L2Fubm90YXRpb24+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CisgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICBUaGlzIGNsYXNzIGFsbG93cyB0aGUgZXh0ZW5kZXIgdG8gc3BlY2lmeSB0d28gdGhpbmdzLgorCisxKSB3aXRoIHRoZSBwcm9qZWN0SGFuZGxlc0V4cG9ydCBtZXRob2QgdGhlIGV4dGVuZGVyIGNhbiB2ZXJpZnkgaW4gbW9yZSBkZXRhaWwgaWYgdGhpcyBwcm9qZWN0IGFuZCBjbGFzc3BhdGggZW50cnkgYXBwbGllcyB0byB0aGVtLiAgUmV0dXJuaW5nIHRydWUgaW5kaWNhdGVzIHRoYXQgdGhlIHByb2plY3QgYW5kIGNsYXNzcGF0aCBhcHBsaWVzIHRvIHRoZWlyIHNpdHVhdGlvbiBhbmQgbWVjaGFuaXNtIGlzIGluIHBsYWNlIGV4cG9ydCBleHRlcm5hbGx5IHJlZmVyZW5jZWQgamFyIGZpbGVzLgorCisyKSB3aXRoIHRoZSBnZXRDbGFzc3BhdGhkZXBlbmRlbmN5QXR0cmlidXRlIG1ldGhvZCB0aGUgZXh0ZW5kZXIgY2FuIGluZGljYXRlIHRoZSBsb2NhdGlvbiBvZiBhbiBleHRlcm5hbCBqYXIgZmlsZSBpbiBhbiBleHBvcnRlZCBwcm9qZWN0LiAgSWYgdGhlIGV4dGVuZGVyIHdhbnRzIHRoZSBkZWZhdWx0IFdUUCBjYWxjdWxhdGVkIHBhdGggdmFsdWUgdGhlbiBudWxsIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgIDxhcHBJbmZvPgorICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsYXNzcGF0aGRlcC5DbGFzc3BhdGhEZXBlbmRlbmN5RXh0ZW5zaW9uOiIvPgorICAgICAgICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KKyAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgIDwvYW5ub3RhdGlvbj4KKworICAgPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvUmVmYWN0b3JpbmdDaGVja2VyLmV4c2QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qMmVlL3NjaGVtYS9SZWZhY3RvcmluZ0NoZWNrZXIuZXhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDcyNWY3Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuajJlZS9zY2hlbWEvUmVmYWN0b3JpbmdDaGVja2VyLmV4c2QKQEAgLTAsMCArMSwxMTQgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgorPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgorPGFubm90YXRpb24+CisgICAgICA8YXBwSW5mbz4KKyAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIiBpZD0iUmVmYWN0b3JpbmdDaGVja2VyIiBuYW1lPSJSZWZhY3RvcmluZ0NoZWNrZXIiLz4KKyAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIHVzZXJzIG9mIHRoZSBKYXZhIEVFIGRlbGV0ZSByZWZhY3RvcmluZyBjYXBhYmlsaXR5IHRvIHNwZWNpZnkgaWYgdGhlIGRlbGV0aW9uIGNoZWNrIGJveCBzaG91bGQgYmUgY2hlY2tlZCBvciB1bmNoZWNrZWQgYnkgZGVmYXVsdC4gUGxlYXNlIHNlZSBleGFtcGxlIHRhYiBmb3Igc2FtcGxlIHVzYWdlLgorICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgorICAgICAgPGFubm90YXRpb24+CisgICAgICAgICA8YXBwSW5mbz4KKyAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KKyAgICAgICAgIDwvYXBwSW5mbz4KKyAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+CisgICAgICAgICAgICA8YW5ub3RhdGlvbj4KKyAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+CisgICAgICAgICAgICA8L2Fubm90YXRpb24+CisgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KKyAgICAgICAgICAgIDxhbm5vdGF0aW9uPgorICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KKyAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgPC9jb21wbGV4VHlwZT4KKyAgIDwvZWxlbWVudD4KKworICAgPGVsZW1lbnQgbmFtZT0iY2hlY2tlciI+CisgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgorICAgICAgICAgICAgPGFubm90YXRpb24+CisgICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgICAgICAgICAgICAgPGFwcEluZm8+CisgICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5sdGsuY29yZS5yZWZhY3RvcmluZ2NoZWNrZXIuQWJzdHJhY3RSZWZhY3RvcmluZ0NoZWNrU3RhdGVUZXN0ZXI6b3JnLmVjbGlwc2UuanN0LmphdmFlZS5sdGsuY29yZS5yZWZhY3RvcmluZ2NoZWNrZXIuSVJlZmFjdG9yaW5nQ2hlY2tTdGF0ZVRlc3RlciIvPgorICAgICAgICAgICAgICAgPC9hcHBJbmZvPgorICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgorICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICA8L2NvbXBsZXhUeXBlPgorICAgPC9lbGVtZW50PgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBXVFAgMy4yCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgICAgICZsdDtleHRlbnNpb24KKyAgICAgICAgaWQ9JnF1b3Q7eW91cmV4dGVuc2lvbklEJnF1b3Q7CisgICAgICAgIG5hbWU9JnF1b3Q7eW91cmV4dGVuc2lvbm5hbWUmcXVvdDsKKyAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LmoyZWUuUmVmYWN0b3JpbmdDaGVja2VyJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7Y2hlY2tlciBjbGFzcz15b3VyIHRlc3RlciBjbGFzcyB0aGF0IGV4dGVuZHMgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5sdGsuY29yZS5yZWZhY3RvcmluZ2NoZWNrZXIuQWJzdHJhY3RSZWZhY3RvcmluZ0NoZWNrU3RhdGVUZXN0ZXImcXVvdDsvJmd0OworICAmbHQ7L2V4dGVuc2lvbiZndDsKKworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCisgICA8YW5ub3RhdGlvbj4KKyAgICAgIDxhcHBJbmZvPgorICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+CisgICAgICA8L2FwcEluZm8+CisgICAgICA8ZG9jdW1lbnRhdGlvbj4KKyAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCisgICAgICA8L2RvY3VtZW50YXRpb24+CisgICA8L2Fubm90YXRpb24+CisKKyAgIDxhbm5vdGF0aW9uPgorICAgICAgPGFwcEluZm8+CisgICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgorICAgICAgPC9hcHBJbmZvPgorICAgICAgPGRvY3VtZW50YXRpb24+CisgICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OworQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKK2F2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKK3RoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCitocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OworICAgICAgPC9kb2N1bWVudGF0aW9uPgorICAgPC9hbm5vdGF0aW9uPgorCis8L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS8uY2xhc3NwYXRoIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5jdnNpZ25vcmUgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyMmJjOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NjMzZTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmplZS51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4MTBmOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1RodSBNYXkgMTAgMTg6MzY6NDEgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTU5OWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuamVlLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDYucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qZWU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamI7YnVuZGxlLXZlcnNpb249IlsxLjEuMTAzLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDIsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDMsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmFwcGNsaWVudCwKLSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5kbmQsCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYiwKLSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIsCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4sCi0gb3JnLmVjbGlwc2UuanN0LmplZS51aS5wcm9qZWN0LmZhY2V0CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvYWJvdXQuaHRtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzk5YmRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvYnVpbGQucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjhlMTgxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy8zMF9lamJqYXJfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy8zMF9lamJqYXJfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViZjUyZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvMzBfZWpiamFyX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvYXBwY2xpZW50XzUwLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9hcHBjbGllbnRfNTAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTNhYjE2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9hcHBjbGllbnRfNTAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2FwcGNsaWVudGdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvYXBwY2xpZW50Z3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc2ODQyOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvYXBwY2xpZW50Z3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9lYXJfNTAuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2Vhcl81MC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMGUzNjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2Vhcl81MC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9lYXJncm91cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWViM2VmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9lYXJncm91cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2VqYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvZWpiZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBhZGIzZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvZWpiZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9mdWxsL2N0b29sMTYvZGVwX2Rlc2MuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9kZXBfZGVzYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZWNiN2EuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9kZXBfZGVzYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL2J1c2luZXNzX2xvY2FsX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL2J1c2luZXNzX2xvY2FsX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODc4MjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9idXNpbmVzc19sb2NhbF9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9idXNpbmVzc19yZW1vdGVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvYnVzaW5lc3NfcmVtb3RlX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMTRlMzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9idXNpbmVzc19yZW1vdGVfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvaG9tZV9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9ob21lX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYmZlNzguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9ob21lX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL2xvY2FsX2hvbWVfb3ZyLmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvbG9jYWxfaG9tZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzgyNzM0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvbG9jYWxfaG9tZV9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9sb2NhbF9vdnIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL292ci9sb2NhbF9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2UxNjU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvbG9jYWxfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvcmVtb3RlX292ci5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvb3ZyL3JlbW90ZV9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWM5Y2FlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy9vdnIvcmVtb3RlX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvd2ViYXBwXzI1LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy93ZWJhcHBfMjUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmI4YzFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9pY29ucy93ZWJhcHBfMjUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL2ljb25zL3dlYmdyb3VwX29iai5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvd2ViZ3JvdXBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0ZDM2MS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvaWNvbnMvd2ViZ3JvdXBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9wbHVnaW4ucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzMDE4YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2UuanN0LmplZS51aQotQnVuZGxlLU5hbWUuMCA9IFVpIFBsdWctaW4KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1jcmVhdGVfZGVwbG95X2ZpbGVzPUdlbmVyYXRlIERlcGxveW1lbnQgRGVzY3JpcHRvciBTdHViCi1qMmVlPUphdmEgRUUKLWoyZWUuYWN0aW9ucy5kZXNjcmlwdGlvbl91aV89QWN0aW9ucyBmb3IgSmF2YSBFRSBEZXZlbG9wbWVudAotRU5URVJQUklTRV9CRUFOX0RFQ09SQVRPUj1KYXZhIEVFIDUgRW50ZXJwcmlzZSBCZWFucyBhbmQgSW50ZXJmYWNlcyBEZWNvcmF0b3IKLUVOVEVSUFJJU0VfQkVBTl9ERUNPUkFUT1IuREVTQ1JJUFRJT049SmF2YSBFRSA1IEVudGVycHJpc2UgQmVhbnMgYXJlIGRlY29yYXRlZCBhY2NvcmRpbmcgdG8gdGhlaXIgdHlwZSBTZXNzaW9uL01lc3NhZ2UgRHJpdmVuL0VudGl0eS4gVGhlIHNhbWUgZGVjb3JhdG9yIGlzIHVzZWQgdG8gbWFyayBCdXNpbmVzcyBhbmQgMi54IGludGVyZmFjZXMKLUpBVkFfRUVfNV9QUk9CTEVNX01BUktFUl9SRVNPVVJDRV9ERUNPUkFUT1I9SmF2YSBFRSA1IFByb2plY3QgUHJvYmxlbSBNYXJrZXIgUmVzb3VyY2UgRGVjb3JhdG9yCi1KQVZBX0VFXzVfUFJPQkxFTV9NQVJLRVJfUkVTT1VSQ0VfREVDT1JBVE9SLkRFU0NSSVBUSU9OPVJlc291cmNlIERlY29yYXRvciBlbmFibGVzIGVycm9yIG1hcmtlcnMgdG8gYmUgcHV0IG9uIHRoZSBwcm9qZWN0IG5vZGUuCi1qZWVQcm9qZWN0RGVjb3JhdG9yPUphdmEgRUUgNSBQcm9qZWN0IERlY29yYXRvcgotamVlUHJvamVjdERlY29yYXRvci5kZXNjcmlwdGlvbj1EZWNvcmF0b3IgaXMgdXNlZCB0byBtYXJrIEphdmEgRUUgNSBwcm9qZWN0cyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvcGx1Z2luLnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDdlOWI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS53aXphcmRQYWdlcyI+Ci0gICAgPHdpemFyZC1wYWdlcyBhY3Rpb249ImpzdC5lYXIjNS4wI2luc3RhbGwiPgotICAgICAgPHBhZ2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkucHJvamVjdC5mYWNldC5FYXJKYXZhRUVGYWNldEluc3RhbGxQYWdlIi8+Ci0gICAgPC93aXphcmQtcGFnZXM+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgPC9mYWN0b3J5PgotCi0gICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iPgotICAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiCi0gICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICAgIDxhZGFwdGVyCi0gICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiPgotICAgICAgICAgICA8L2FkYXB0ZXI+Ci0gICAgICAgIDwvZmFjdG9yeT4KLQotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICAgPC9mYWN0b3J5PgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQiPgotICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICAgPC9mYWN0b3J5PgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgPC9mYWN0b3J5PgotICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICA8L2ZhY3Rvcnk+ICAgICAgIAotICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIj4KLSAgICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgIDwvZmFjdG9yeT4gCi0KLSAgIDwvZXh0ZW5zaW9uPiAgCi0KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotICAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4gCi0gICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ij4KLSAgICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPiAKLSAgICAgICAgPC9mYWN0b3J5PgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+IAotICAgICAgIDwvZmFjdG9yeT4KLQotCSAgIAk8ZmFjdG9yeQotCSAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0JICAgICAJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyIj4KLQkgICAgIAk8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPiAKLQkJPC9mYWN0b3J5PgotCQkKLQkJPGZhY3RvcnkKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotCSAgICAgCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuIj4KLQkgICAgIAk8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPiAKLQkgICAJPC9mYWN0b3J5PgotCSAgIAkJCi0JCTxmYWN0b3J5Ci0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLQkgICAgIAlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiI+Ci0JICAgICAJPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4gCi0JICAgCTwvZmFjdG9yeT4JCi0JICAgCQotCSAgIAk8ZmFjdG9yeQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0JICAgICAJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50aXR5QmVhbiI+Ci0JICAgICAJPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4gCi0JICAgCTwvZmFjdG9yeT4gICAgICAgCi0gICA8L2V4dGVuc2lvbj4gCi0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlQXJ0aWZhY3RBZGFwdGVycyI+Ci0gIAotICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUuc2VydmVyLmVhcjEiCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb24iLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gCi0gICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnNlcnZlci5lYXIyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgIAk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVhcjo1LjAiIC8+Ci0JCQkgPC9hZGFwdD4KLSAgICAgICAgICAgICAKLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICAKLSAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnNlcnZlci5lYXIzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgICAgIAk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVhcjo1LjAiIC8+Ci0JCQkgPC9hZGFwdD4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5zZXJ2ZXIuZWFyNCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgIDx3aXRoCi0gICAgICAgICAgICAgICAgICB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICA8L2V4dGVuc2lvbj4KLQotCi0gPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50OiBvcmcuZWNsaXBzZS5ldG9vbHMuc2VydmVyLmNvcmUubW9kdWxlT2JqZWN0QWRhcHRlcnMgLS0+Ci08IS0tIFB1cnBvc2U6IERlZmluZSBhZGFwdGVycyBmb3IgV2ViIHJlc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIj4gIAotICAgIAotICAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLndlYi5zZXJ2ZXIud2VicmVzb3VyY2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+ICAgICAKLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIi8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPiAKLSAgICAgICAKLSAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLndlYi5zZXJ2ZXIud2VicmVzb3VyY2UyIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4gICAgICAKLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICAKLSAgICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS53ZWIuc2VydmVyLndlYnJlc291cmNlMyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4gICAgIAotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWI6Mi41IiAvPgotCQkJIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4gICAgIAotICAgICAgIAotICAgICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS53ZWIuc2VydmVyLndlYnJlc291cmNlNCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgICAgIDx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCXZhbHVlPSJqc3Qud2ViOjIuNSIgLz4KLQkJCSA8L2FkYXB0PgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0KLSAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLndlYi5zZXJ2ZXIud2VicmVzb3VyY2U1IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgIAotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ij4KLSAgICAgICAgICAgICA8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWI6Mi41IiAvPiAgICAgICAgICAgICAKLSAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gUHVycG9zZTogRGVmaW5lIGFkYXB0ZXJzIGZvciBFSkIgcmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIEV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZUFydGlmYWN0QWRhcHRlcnMgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlQXJ0aWZhY3RBZGFwdGVycyI+Ci0gICAgICAgCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuc2VydmVyLmVqYiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyIi8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnNlcnZlci5lamIyIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbiIvPgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5zZXJ2ZXIuZWpiMyIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQiLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5zZXJ2ZXIuZWpiNCIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgICA8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVqYjozLjAiIC8+Ci0JCQkgPC9hZGFwdD4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5zZXJ2ZXIuZWpiNSIKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC5lamI6My4wIiAvPgotCQkJIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuc2VydmVyLmVqYjYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuIi8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvbW9kdWxlQXJ0aWZhY3RBZGFwdGVyPgotICAgICAgCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuc2VydmVyLmVqYjciCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW4iLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICAgICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kdWxlQXJ0aWZhY3RBZGFwdGVycyI+Ci0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnNlcnZlci5lamIiPgotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICA8d2l0aAotICAgICAgICAgICAgICAgICAgdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC5lamI6My4wIj4KLSAgICAgICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgIDxtb2R1bGVBcnRpZmFjdEFkYXB0ZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUuc2VydmVyLmVqYjc3Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPHdpdGgKLSAgICAgICAgICAgICAgICAgIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFSkJQcm92aWRlciI+Ci0gICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuQ3JlYXRlRGVwbG95bWVudEZpbGVzQWN0aW9uIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLkNyZWF0ZURlcGxveW1lbnRGaWxlc0FjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9kZXBfZGVzYy5naWYiCi0gICAgICAgICAgICAgICBpZD0iY3JlYXRlRGVwbG95bWVudEZpbGVzIgotICAgICAgICAgICAgICAgbGFiZWw9IiVjcmVhdGVfZGVwbG95X2ZpbGVzIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImphdmVlVUlQb3B1cE1lbnVDYXRlZ29yeS9zbG90MiI+Ci0JCTwvYWN0aW9uPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgIAkgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVqYjpbMy4wIiAvPgotCQkJCSAgPC9hZGFwdD4KLQkJCQkgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LndlYjpbMi41IiAvPgotCQkJCSAgPC9hZGFwdD4KLQkJCQkgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmVhcjpbNS4wIiAvPgotCQkJCSAgPC9hZGFwdD4KLQkJCQkgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LmFwcGNsaWVudDpbNS4wIiAvPgotCQkJCSAgPC9hZGFwdD4KLQkJICAgIDwvb3I+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+ICAgICAgICAgCQkgICAJCQotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0ic2hvd19kZXBfcHJvcF9wYWdlIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuTW9kdWxlc05vZGUiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5TaG93RGVwUHJvcFBhZ2VBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9InNob3dfZGVwX3Byb3BfcGFnZSIKLSAgICAgICAgICAgICAgIGxhYmVsPSJBZGQvUmVtb3ZlIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5PcGVyYXRpb25FeHRlbnNpb24iCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5leHRlbmRlZCI+Ci0gICAgICA8b3BlcmF0aW9uRXh0ZW5zaW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5DcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxPcGVyYXRpb24iCi0gICAgICAgICAgICBwb3N0T3BlcmF0aW9uQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwudGVzdHMuZXh0ZW5kZWQuQiIKLSAgICAgICAgICAgIHByZU9wZXJhdGlvbkNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLnRlc3RzLmV4dGVuZGVkLkEiLz4KLSAKLSAJPC9leHRlbnNpb24+Ci0gICAgLS0+Ci0gICAgPGV4dGVuc2lvbiAgCi0JICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQiPgotICAgPG5hdmlnYXRvckNvbnRlbnQKLSAgICAgICAgIGFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgIGNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuRWpiM0NvbnRlbnRQcm92aWRlciIKLSAgICAgICAgIGljb249Imljb25zL2VqYmdyb3VwX29iai5naWYiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5lamIiCi0gICAgICAgICBsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5FamIzTGFiZWxQcm92aWRlciIKLSAgICAgICAgIG5hbWU9IkpFRSBOYXZpZ2F0b3IgQ29udGVudCBFSkIiCi0gICAgICAgICBwcmlvcml0eT0iaGlnaGVzdCI+Ci0gICAgIDx0cmlnZ2VyUG9pbnRzPgotICAgICAgICA8b3I+Ci0gICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmVqYjozLjAiLz4KLSAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmFwcGNsaWVudDo1LjAiPgotICAgICAgICAgICAgICAgICA8L3Rlc3Q+Ci0gICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgIDwvYWRhcHQ+Ci0JCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RERE5vZGUiIC8+Ci0JCSAJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuTm9kZSIgLz4KLSAgCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3QiIC8+Ci0gICA8aW5zdGFuY2VvZgotICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlciI+Ci0gICA8L2luc3RhbmNlb2Y+Ci0gICA8aW5zdGFuY2VvZgotICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgPC9vcj4KLSAgICAgPC90cmlnZ2VyUG9pbnRzPgotICAgICA8cG9zc2libGVDaGlsZHJlbj4KLSAgICAgICAgPG9yPgotCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlIiAvPgotCQkgCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbk5vZGUiIC8+Ci0gIAkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0IiAvPgotICAgPGluc3RhbmNlb2YKLSAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXIiPgotICAgPC9pbnN0YW5jZW9mPgotICAgICAgICA8L29yPgotICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+Ci0gICAgCi0KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aSIKLSAgICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aS5pbnRlcm5hbC53aXphcmQuQWRkU2Vzc2lvbkJlYW5XaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkdyb3VwRUpCUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFamJTZXNzaW9uIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4iPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbkludGVyZmFjZU5vZGUiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbk5vZGUiPgotICAgICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuYmVhblR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJpc1Nlc3Npb25CZWFuIj4KLSAgICAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpIgotICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuZWpiLnVpLmludGVybmFsLndpemFyZC5BZGRNZXNzYWdlRHJpdmVuQmVhbldpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuR3JvdXBFSkJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVqYk1lc3NhZ2VEcml2ZW4iPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5NZXNzYWdlRHJpdmVuQmVhbiI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuTm9kZSI+Ci0gICAgICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5iZWFuVHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImlzTWVzc2FnZURyaXZlbkJlYW4iPgotICAgICAgICAgICAgICAgICAgICA8L3Rlc3Q+Ci0gICAgICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+PC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgCi0gICAgIAotICAgICA8YWN0aW9uUHJvdmlkZXIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkpFRUFjdGlvblByb3ZpZGVyIgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS51aS5KRUVBY3Rpb25Qcm92aWRlciI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZSIvPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5Ob2RlIi8+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbkludGVyZmFjZU5vZGUiLz4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3QiIC8+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmFwcGNsaWVudC5Hcm91cEFwcENsaWVudFByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvYWN0aW9uUHJvdmlkZXI+Ci0gICAgIAotCi0gICAgIDxhY3Rpb25Qcm92aWRlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucy5OZXdBY3Rpb25Qcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLkpFRU5ld0FjdGlvbnMiPgotCQkJPGVuYWJsZW1lbnQ+Ci0gICAgPG9yPgotICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlIj4KLSAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyIj4KLSAgICAgICA8L2luc3RhbmNlb2Y+Ci0KLSAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuQWJzdHJhY3RTdWJXZWJQcm92aWRlcnMiPgotICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgPC9pbnN0YW5jZW9mPjwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JIDwvYWN0aW9uUHJvdmlkZXI+Ci0gICAgCi0gICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLlJlc291cmNlTWdtdEFjdGlvblByb3ZpZGVyIgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLkpFRVJlc291cmNlTWdtdEFjdGlvbiI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZSI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLQotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvYWN0aW9uUHJvdmlkZXI+Ci0gICAgIDxhY3Rpb25Qcm92aWRlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLldvcmtNYW5hZ2VtZW50QWN0aW9uUHJvdmlkZXIiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuSkVFV29ya01nbXRBY3Rpb24iPgotICAgICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RERE5vZGUiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0KLQkJICAgICAgIDxpbnN0YW5jZW9mCi0JCSAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdCI+Ci0JCSAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgIDwvYWRhcHQ+Ci0KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2FjdGlvblByb3ZpZGVyPgotICAgICA8YWN0aW9uUHJvdmlkZXIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucy5Qb3J0aW5nQWN0aW9uUHJvdmlkZXIiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuSkVFUG9ydGluZ0FjdGlvbiI+Ci0gICAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZSI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLQotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvYWN0aW9uUHJvdmlkZXI+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIuZXhwb3J0MSIKLSAgICAgICAgICAgdHlwZT0iZXhwb3J0IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aS5pbnRlcm5hbC53aXphcmQuRUpCQ29tcG9uZW50RXhwb3J0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICAJIAotICAgICAJIAotICA8L25hdmlnYXRvckNvbnRlbnQ+Ci0gIAotICA8bmF2aWdhdG9yQ29udGVudAotICAgICAgICBjb250ZW50UHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLldlYjI1Q29udGVudFByb3ZpZGVyIgotICAgICAgICBpY29uPSJpY29ucy93ZWJncm91cF9vYmouZ2lmIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS51aS53ZWIiCi0gICAgICAgIGxhYmVsUHJvdmlkZXI9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLldlYjI1TGFiZWxQcm92aWRlciIKLSAgICAgICAgbmFtZT0iSkVFIE5hdmlnYXRvciBDb250ZW50IFdFQiIKLSAgICAgICAgcHJpb3JpdHk9ImhpZ2hlc3QiPgotICAgICA8dHJpZ2dlclBvaW50cz4KLSAgICAgICAgPG9yPgotICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC53ZWI6Mi41Ii8+Ci0gICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgIDwvYWRhcHQ+Ci0gICA8aW5zdGFuY2VvZgotICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlciI+Ci0gICA8L2luc3RhbmNlb2Y+Ci0gICA8aW5zdGFuY2VvZgotICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlciI+Ci0gICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgIDwvb3I+Ci0gICAgIDwvdHJpZ2dlclBvaW50cz4KLSAgICAgPHBvc3NpYmxlQ2hpbGRyZW4+Ci0gICAgICAgIDxvcj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlciI+Ci0gICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlciI+Ci0gICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcnRpZmFjdE5vZGUiPgotICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdCI+Ci0gICAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICA8L29yPgotICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+Ci0gICAgIAotICAgICAKLSAgICAgPGFjdGlvblByb3ZpZGVyCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuUmVzb3VyY2VNZ210QWN0aW9uUHJvdmlkZXIiCi0gICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuSkVFV2ViUmVzb3VyY2VNZ210QWN0aW9uIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5BYnN0cmFjdFN1YldlYlByb3ZpZGVycyI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPCEtLTxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+LS0+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9hY3Rpb25Qcm92aWRlcj4KLSAgICAgPGFjdGlvblByb3ZpZGVyCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuV29ya01hbmFnZW1lbnRBY3Rpb25Qcm92aWRlciIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMuYWN0aW9ucy5KRUVXZWJXcmtNbmdtbnRBY3Rpb24iPgotICAgICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkFic3RyYWN0U3ViV2ViUHJvdmlkZXJzIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotCi0JCSAgICAgICA8aW5zdGFuY2VvZgotCQkgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3QiPgotCQkgICAgICAgPC9pbnN0YW5jZW9mPgotCi0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9hY3Rpb25Qcm92aWRlcj4KLSAgICAgPGFjdGlvblByb3ZpZGVyCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuUG9ydGluZ0FjdGlvblByb3ZpZGVyIgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubmF2aWdhdG9yLnJlc291cmNlcy5hY3Rpb25zLkpFRVdlYlBvcnRpbmdBY3Rpb24iPgotICAgICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkFic3RyYWN0U3ViV2ViUHJvdmlkZXJzIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+LS0+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9hY3Rpb25Qcm92aWRlcj4KLSAgICAgCi0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkud2ViY2xhc3MiCi0gICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRTZXJ2bGV0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cFNlcnZsZXRJdGVtUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0Ij4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkdyb3VwU2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPC9vcj48L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLndlYmNsYXNzIgotICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQWRkRmlsdGVyV2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cEZpbHRlcnNJdGVtUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXIiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBGaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRmlsdGVyTWFwcGluZyI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQiPgotICAgICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDwvb3I+PC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aS53ZWJjbGFzcyIKLSAgICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLkFkZExpc3RlbmVyV2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cExpc3RlbmVySXRlbVByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkxpc3RlbmVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8L29yPjwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIuZXhwb3J0IgotICAgICAgICAgICB0eXBlPSJleHBvcnQiCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgPC9uYXZpZ2F0b3JDb250ZW50PgotICA8bmF2aWdhdG9yQ29udGVudAotICAgICAgICBhY3RpdmVCeURlZmF1bHQ9InRydWUiCi0gICAgICAgIGNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuRWFyNUNvbnRlbnRQcm92aWRlciIKLSAgICAgICAgaWNvbj0iaWNvbnMvZWFyZ3JvdXBfb2JqLmdpZiIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuZWFyIgotICAgICAgICBsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5FYXI1TGFiZWxQcm92aWRlciIKLSAgICAgICAgbmFtZT0iSkVFIE5hdmlnYXRvciBDb250ZW50IEVBUiIKLSAgICAgICAgcHJpb3JpdHk9ImhpZ2hlc3QiPgotICAgICA8dHJpZ2dlclBvaW50cz4KLSAgICAgICAgPG9yPgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuQnVuZGxlZE5vZGUiPgotICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC5lYXI6NS4wIj4KLSAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLk1vZHVsZXNOb2RlIj4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkJ1bmRsZWRMaWJzTm9kZSI+Ci0gICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgPC9vcj4KLSAgICAgPC90cmlnZ2VyUG9pbnRzPgotICAgICA8cG9zc2libGVDaGlsZHJlbj4KLSAgICAgICAgPG9yPgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0iamF2YS5pby5GaWxlIj4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC53ZWIiPgotICAgICAgICAgICAgICAgICA8L3Rlc3Q+Ci0gICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC5lamIiPgotICAgICAgICAgICAgICAgICA8L3Rlc3Q+Ci0gICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC51dGlsaXR5Ij4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuZWFyIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuYXBwY2xpZW50Ij4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuY29ubmVjdG9yIj4KLSAgICAgICAgICAgICAgICAgPC90ZXN0PgotICAgICAgICAgICAgICA8L29yPgotICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLk1vZHVsZXNOb2RlIi8+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuQnVuZGxlZE5vZGUiLz4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLkZpbGUiPgotICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXJQYWNrYWdlRnJhZ21lbnRSb290Ij4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUHJvamVjdCI+Ci0gICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2UiPgotICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgIDwvb3I+Ci0gICAgIDwvcG9zc2libGVDaGlsZHJlbj4KLSAgICAgPGNvbW1vblNvcnRlcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkFwcGxpY2F0aW9uNVZpZXdlclNvcnRlciIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUubmF2aWdhdG9yLmludGVybmFsLkFwcGxpY2F0aW9uVmlld2VyU29ydGVyIj4KLSAgICAgPC9jb21tb25Tb3J0ZXI+Ci0gICAgIDxkcm9wQXNzaXN0YW50Ci0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5kbmQuQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudCIKLSAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUubmF2aWdhdG9yLnVpLkFkZE1vZHVsZXNUb0VBUiI+Ci0gICAgICAgIDxwb3NzaWJsZURyb3BUYXJnZXRzPgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9ImpzdC5lYXIiPgotICAgICAgICAgICAgICAgICA8L3Rlc3Q+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZgotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkFic3RyYWN0RWFyTm9kZSI+Ci0gICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L3Bvc3NpYmxlRHJvcFRhcmdldHM+Ci0gICAgIDwvZHJvcEFzc2lzdGFudD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVhci51aSIKLSAgICAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmVqYi51aS5wcm9qZWN0LmZhY2V0LkVqYlByb2plY3RXaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPjwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lYXIudWkiCi0gICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQuV2ViUHJvamVjdFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lYXIudWkiCi0gICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuRWFyUHJvamVjdFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lYXIudWkiCi0gICAgICAgICAgIHR5cGU9Im5ldyIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuYXBwY2xpZW50LkFwcENsaWVudFByb2plY3RXaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWFyLnVpIgotICAgICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudWkuaW50ZXJuYWwud2l6YXJkLkNvbm5lY3RvclByb2plY3RXaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWFyLnVpLmV4cG9ydCIKLSAgICAgICAgICAgdHlwZT0iZXhwb3J0IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkVBUkNvbXBvbmVudEV4cG9ydFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lYXIudWkuaW1wb3J0IgotICAgICAgICAgICB0eXBlPSJpbXBvcnQiCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVhci51aS5pbXBvcnQiCi0gICAgICAgICAgIHR5cGU9ImltcG9ydCIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5FQVJDb21wb25lbnRJbXBvcnRXaXphcmQiPgotICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXIiPgotICAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgIDwvY29tbW9uV2l6YXJkPgotICAgICA8Y29tbW9uV2l6YXJkCi0gICAgICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS5qc3QuZWFyLnVpLmltcG9ydCIKLSAgICAgICAgICAgdHlwZT0iaW1wb3J0IgotICAgICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVVdGlsaXR5SmFySW1wb3J0V2l6YXJkTmV3Ij4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVhci51aS5pbXBvcnQiCi0gICAgICAgICAgIHR5cGU9ImltcG9ydCIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5lamIudWkuaW50ZXJuYWwud2l6YXJkLkVKQkNvbXBvbmVudEltcG9ydFdpemFyZCI+Ci0gICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlciI+Ci0gICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgPC9jb21tb25XaXphcmQ+Ci0gICAgIDxjb21tb25XaXphcmQKLSAgICAgICAgICAgbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpzdC5lYXIudWkuaW1wb3J0IgotICAgICAgICAgICB0eXBlPSJpbXBvcnQiCi0gICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgICAgPGNvbW1vbldpemFyZAotICAgICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanN0LmVhci51aS5pbXBvcnQiCi0gICAgICAgICAgIHR5cGU9ImltcG9ydCIKLSAgICAgICAgICAgd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS51aS5pbnRlcm5hbC53aXphcmQuQ29ubmVjdG9yQ29tcG9uZW50SW1wb3J0V2l6YXJkIj4KLSAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyIj4KLSAgICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9lbmFibGVtZW50PgotICAgICA8L2NvbW1vbldpemFyZD4KLSAgPC9uYXZpZ2F0b3JDb250ZW50PgotICA8bmF2aWdhdG9yQ29udGVudAotICAgICAgICBhY3RpdmVCeURlZmF1bHQ9InRydWUiCi0gICAgICAgIGNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQXBwQ2xpZW50NUNvbnRlbnRQcm92aWRlciIKLSAgICAgICAgaWNvbj0iaWNvbnMvYXBwY2xpZW50Z3JvdXBfb2JqLmdpZiIKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuYXBwY2xpZW50IgotICAgICAgICBsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BcHBDbGllbnQ1TGFiZWxQcm92aWRlciIKLSAgICAgICAgbmFtZT0iSkVFIE5hdmlnYXRvciBDb250ZW50IEFwcCBDbGllbnQiCi0gICAgICAgIHByaW9yaXR5PSJoaWdoZXN0Ij4KLSAgICAgPHRyaWdnZXJQb2ludHM+Ci0gICAgICAgIDxvcj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLSAgICAgICAgICAgPC9pbnN0YW5jZW9mPgotICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotICAgICAgICAgICAgICA8dGVzdAotICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJqc3QuYXBwY2xpZW50OjUuMCI+Ci0gICAgICAgICAgICAgIDwvdGVzdD4KLSAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3QiPgotICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgIDwvb3I+Ci0gICAgIDwvdHJpZ2dlclBvaW50cz4KLSAgICAgPHBvc3NpYmxlQ2hpbGRyZW4+Ci0gICAgICAgIDxvcj4KLSAgICAgICAgICAgPGluc3RhbmNlb2YKLSAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3QiPgotICAgICAgICAgICA8L2luc3RhbmNlb2Y+Ci0gICAgICAgICAgIDxhZGFwdAotICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgIDxvcj4KLSAgICAgICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ianN0LmFwcGNsaWVudDo1LjAiPgotICAgICAgICAgICAgICAgICA8L3Rlc3Q+Ci0gICAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgIDwvb3I+Ci0gICAgIDwvcG9zc2libGVDaGlsZHJlbj4KLSAgPC9uYXZpZ2F0b3JDb250ZW50PgotCTwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkdyb3VwRUpCUHJvdmlkZXIiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGFkYXB0ZXIKLSAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiPgotICAgICAgICAgPC9hZGFwdGVyPgotICAgICAgPC9mYWN0b3J5PgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3QiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiPgotICAgICAgICAgPGFkYXB0ZXIKLSAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiPgotICAgICAgICAgPC9hZGFwdGVyPgotICAgICAgPC9mYWN0b3J5PgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzLkVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8YWRhcHRlcgotICAgICAgICAgICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSI+Ci0gICAgICAgICA8L2FkYXB0ZXI+Ci0gICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAKLSAgICAKLSAgICA8ZmFjdG9yeQotICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3QiCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFRU1GQWRhcHRlckZhY3RvcnkiPgotICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPgotICAgIDwvZmFjdG9yeT4KLSAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnZpZXdlciI+Ci0gICAgICA8dmlld2VyQWN0aW9uQmluZGluZyB2aWV3ZXJJZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciI+Ci0gICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICA8YWN0aW9uRXh0ZW5zaW9uIHBhdHRlcm49Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUudWkuSkVFQWN0aW9uUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L3ZpZXdlckFjdGlvbkJpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5kZWNvcmF0b3JzIj4KLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGxvY2F0aW9uPSJUT1BfUklHSFQiCi0gICAgICAgICAgICBsaWdodHdlaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIGxhYmVsPSIlRU5URVJQUklTRV9CRUFOX0RFQ09SQVRPUiIKLSAgICAgICAgICAgIHN0YXRlPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuRGVjb3JhdG9yIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuRGVjb3JhdG9yIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuSW50ZXJmYWNlTm9kZSI+Ci0gICAgICAgICAgICA8L29iamVjdENsYXNzPgotICAgICAgICAgICAgPG9iamVjdENsYXNzCi0gICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbk5vZGUiPgotICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVFTlRFUlBSSVNFX0JFQU5fREVDT1JBVE9SLkRFU0NSSVBUSU9OCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9kZWNvcmF0b3I+Ci0gICA8L2V4dGVuc2lvbj4gIAotICAgICAgPGV4dGVuc2lvbgotICAgCQkgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiPgotICAgICAgPHZpZXdlckNvbnRlbnRCaW5kaW5nCi0gICAgICAgICB2aWV3ZXJJZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciI+Ci0gICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgIDxjb250ZW50RXh0ZW5zaW9uIHBhdHRlcm49Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuKiIvPgotICAgICAgICAgICA8Y29udGVudEV4dGVuc2lvbiBwYXR0ZXJuPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmZpbHRlcnMuKiIvPgotICAgICAgICAgICA8Y29udGVudEV4dGVuc2lvbgotICAgICAgICAgICAgICAgICBwYXR0ZXJuPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci4qIj4KLSAgICAgICAgICAgPC9jb250ZW50RXh0ZW5zaW9uPgotICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDwvdmlld2VyQ29udGVudEJpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgICAgCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgIExhYmVsIERlY29yYXRvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZGVjb3JhdG9ycyI+Ci0gICAgICA8ZGVjb3JhdG9yCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBsb2NhdGlvbj0iVE9QX0xFRlQiCi0gICAgICAgICAgICBsaWdodHdlaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIGxhYmVsPSIlamVlUHJvamVjdERlY29yYXRvciIKLSAgICAgICAgICAgIHN0YXRlPSJ0cnVlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFUHJvamVjdERlY29yYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLm5hdmlnYXRvci5pbnRlcm5hbC5KRUVQcm9qZWN0RGVjb3JhdG9yIj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICA8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KLSAgICAgICAgICAgIDxvYmplY3RDbGFzcyBuYW1lPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3QiLz4KLSAgICAgICAgICAgPC9vcj4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVqZWVQcm9qZWN0RGVjb3JhdG9yLmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9kZWNvcmF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmRlY29yYXRvcnMiPgotICAgICAgPGRlY29yYXRvcgotICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgbGFiZWw9IiVKQVZBX0VFXzVfUFJPQkxFTV9NQVJLRVJfUkVTT1VSQ0VfREVDT1JBVE9SIgotICAgICAgICAgICAgc3RhdGU9InRydWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuamR0LnVpLlByb2JsZW1zTGFiZWxEZWNvcmF0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS5uYXZpZ2F0b3IudWkuamF2YS5yZXNvdXJjZS5kZWNvcmF0b3IiPgotICAgICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPiAKLSAgICAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVKQVZBX0VFXzVfUFJPQkxFTV9NQVJLRVJfUkVTT1VSQ0VfREVDT1JBVE9SLkRFU0NSSVBUSU9OCi0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9kZWNvcmF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0gICAgICA8cHJvcGVydHlUZXN0ZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbk5vZGVQcm9wZXJ0eVRlc3RlciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLkJlYW5Ob2RlUHJvcGVydHlUZXN0ZXIiCi0gICAgICAgICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkiCi0gICAgICAgICAgICBwcm9wZXJ0aWVzPSJiZWFuVHlwZSIKLSAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuTm9kZSI+Ci0gICAgICA8L3Byb3BlcnR5VGVzdGVyPgotICAgPC9leHRlbnNpb24+ICAKLSAgICAgIAotICAgICAgCi0gICAgICAKLSAgIDwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL0NyZWF0ZURlcGxveW1lbnRGaWxlc0FjdGlvbkRlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvQ3JlYXRlRGVwbG95bWVudEZpbGVzQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYzYzFlZS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvQ3JlYXRlRGVwbG95bWVudEZpbGVzQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFjdGlvbnMuQmFzZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldC5JQXBwQ2xpZW50Q3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQuSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0LklFSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldC5JRWFyQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQuSVdlYkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgcmFtYW5kYXkKLSAqIAotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0KLSAqIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVEZXBsb3ltZW50RmlsZXNBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEJhc2VBY3Rpb24gewotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiBhY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiBhU2VsZWN0aW9uKSB7Ci0JCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQoYWN0aW9uLCBhU2VsZWN0aW9uKTsKLQkJYm9vbGVhbiBpc0VuYWJsZWQgPSBmYWxzZTsKLQkJaWYgKGFTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgYVNlbGVjdGlvbjsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qoc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQlpc0VuYWJsZWQgPSBpc1ZhbGlkU2VsZWN0aW9uKHByb2plY3QsIG51bGwpOwotCQl9Ci0JCXNldEVuYWJsZWQoaXNFbmFibGVkKTsKLQkJYWN0aW9uLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFNlbGVjdGlvbihJUHJvamVjdCBwcm9qZWN0LCBTaGVsbCBzaGVsbCkgewotCQlyZXR1cm4gKHByb2plY3QgIT0gbnVsbAotCQkJCSYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkVFUHJvamVjdChwcm9qZWN0KQotCQkJCSYmICFoYXNEZXBsb3ltZW50RGVzY3JpcHRvcihwcm9qZWN0LCBzaGVsbCkpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBpbmZvcm1JbnZhbGlkU2VsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbmZvcm1JbnZhbGlkU2VsZWN0aW9uKFNoZWxsIHNoZWxsKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCBNZXNzYWdlcy5JTlZBTElEX0RFUF9ERVNDX1NFTEVDVElPTl9USVRMRSwKLQkJCQlNZXNzYWdlcy5JTkZPUk1fSU5WQUxJRF9ERVBfREVTQ19TRUxFQ1RJT04pOyAgCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0RlcGxveW1lbnREZXNjcmlwdG9yKElQcm9qZWN0IHByb2plY3QsIFNoZWxsIHNoZWxsKSB7Ci0JCWJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQkJSVBhdGggZGRGaWxlUGF0aCA9IG51bGw7Ci0JCWlmKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSl7Ci0JCQlkZEZpbGVQYXRoID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpOwotCQl9IGVsc2UgaWYoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3QpKXsKLQkJCWRkRmlsZVBhdGggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkVKQkpBUl9ERF9VUkkpOwotCQl9IGVsc2UgaWYoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSl7Ci0JCQlkZEZpbGVQYXRoID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJKTsKLQkJfSBlbHNlIGlmKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2plY3QpKXsKLQkJCWRkRmlsZVBhdGggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJKTsKLQkJfQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYoY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKSAhPSBudWxsCi0JCQkJJiYgY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCkgIT0gbnVsbCl7Ci0JCQlJRmlsZSBkZFhtbEZpbGUgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKS5nZXRGaWxlKGRkRmlsZVBhdGgpOwotCQkJcmV0ID0gZGRYbWxGaWxlLmV4aXN0cygpOwotCQkJaWYoc2hlbGwgIT0gbnVsbCAmJiByZXQpCi0JCQkJaW5mb3JtSW52YWxpZFNlbGVjdGlvbihzaGVsbCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQotCS8qCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVJ1bihTaGVsbCBzaGVsbCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCWlmICghdmFsaWRhdGVTZWxlY3Rpb24ocHJvamVjdCwgc2hlbGwpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJZ2V0RGF0YU1vZGVsKHByb2plY3QpLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoSVByb2plY3QgcHJvamVjdCkgewotCQlDbGFzcyBkYXRhTW9kZWxDbGFzcyA9IG51bGw7Ci0JCWlmKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSl7Ci0JCQlkYXRhTW9kZWxDbGFzcyA9IElFYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmNsYXNzOwotCQl9IGVsc2UgaWYoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3QpKXsKLQkJCWRhdGFNb2RlbENsYXNzID0gSUVKQkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuY2xhc3M7Ci0JCX0gZWxzZSBpZihKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKXsKLQkJCWRhdGFNb2RlbENsYXNzID0gSVdlYkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuY2xhc3M7Ci0JCX0gZWxzZSBpZihKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChwcm9qZWN0KSl7Ci0JCQlkYXRhTW9kZWxDbGFzcyA9IElBcHBDbGllbnRDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmNsYXNzOwotCQl9Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoZGF0YU1vZGVsQ2xhc3MpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX1BST0pFQ1QsIHByb2plY3QpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVTZWxlY3Rpb24oSVByb2plY3QgcHJvamVjdCwgU2hlbGwgc2hlbGwpIHsKLQkJYm9vbGVhbiB2YWxpZFNlbGVjdGlvbiA9IHRydWU7Ci0JCWlmICghaXNWYWxpZFNlbGVjdGlvbihwcm9qZWN0LCBzaGVsbCkpIHsKLQkJCXZhbGlkU2VsZWN0aW9uID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkU2VsZWN0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9NZXNzYWdlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzJhYTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkFMSURfREVQX0RFU0NfU0VMRUNUSU9OX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElORk9STV9JTlZBTElEX0RFUF9ERVNDX1NFTEVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERVBMT1lNRU5UX0RFU0NSSVBUT1I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VTU0lPTl9CRUFOUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfQkVBTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9EUklWRU5fQkVBTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVElFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRFUlBSSVNFX0JFQU5fQ0xBU1NfREVTQ1JJUFRJT047Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9JVEVNX1BST1ZJREVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExJU1RFTkVSX0lURU1fUFJPVklERVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRklMVEVSU19JVEVNX1BST1ZJREVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZJTFRFUl9NQVBQSU5HX0lURU1fUFJPVklERVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9NQVBQSU5HX0lURU1fUFJPVklERVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfUEFHRVNfSVRFTV9QUk9WSURFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXRUxDT01FX1BBR0VTX0lURU1fUFJPVklERVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVEVYVF9QQVJBTVNfSVRFTV9QUk9WSURFUjsKLQkKLQkKLQkKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRUZFUkVOQ0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVTkRMRURfTElCUkFSSUVTX05PREU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTElCUkFSWV9ESVJFQ1RPUlk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUFSX01PRFVMRVNfTk9ERTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFSkJMT0NBTF9SRUZFUkVOQ0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVKQl9SRUZFUkVOQ0VTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVklST01FTlRfRU5UUklFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRVNPVVJDRV9FTlZJUk9NRU5UX0VOVFJJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VfUkVGRVJFTkNFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWSUNFX1JFRkVSRU5DRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9UaGVfZHJhZ2dlZF9wcm9qZWN0X2Nhbm5vdF9iZV9hZGRlZF87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9UaGVfcHJvamVjdF8wX2Nhbm5vdF9iZV9hY2Nlc3NlXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X0NvdWxkX25vdF9hZGRfbW9kdWxlX3RvX0VudGVycHJpc2VfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZE1vZHVsZVRvRWFyRHJvcEFzc2lzdGFudF9BZGRpbmdfbW9kdWxlX3RvX2VhXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRKRUVNb2R1bGVEcm9wQXNzaXN0YW50X0ltcG9ydGluZ19KYXZhX0VudGVycHJpc2VfRWRpdGlvbl9hcnRpZmFjdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0SkVFTW9kdWxlRHJvcEFzc2lzdGFudF9Db3VsZF9ub3RfcmVjb2duaXplX2V4dGVuc2lvbl8wXzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjNkZDYxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxOCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIEVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgTW9kdWxlQXJ0aWZhY3RBZGFwdGVyRGVsZWdhdGUgaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3NbXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc1tde0lMYXVuY2hhYmxlLmNsYXNzfTsKLQl9Ci0KLQlwdWJsaWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIEVKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJVdGlsLmdldE1vZHVsZU9iamVjdChvYmopOwotCX0KLQlwdWJsaWMgSU1vZHVsZUFydGlmYWN0W10gZ2V0TW9kdWxlQXJ0aWZhY3RzKE9iamVjdCBvYmopIHsKLQkJCi0JCSBpZiAob2JqIGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pCi0JCQlyZXR1cm4gRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlclV0aWwuZ2V0TW9kdWxlT2JqZWN0cygoU2Vzc2lvbkJlYW4pIG9iaik7Ci0JCSBJTW9kdWxlQXJ0aWZhY3QgYXJ0aWZhY3QgPSBnZXRNb2R1bGVBcnRpZmFjdChvYmopOwotCQkJaWYgKGFydGlmYWN0ICE9IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBJTW9kdWxlQXJ0aWZhY3RbXSB7IGFydGlmYWN0IH07Ci0JCSByZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FSkJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL0VKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNWY1NjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL0VKQkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGl0eUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5KRUVGbGV4UHJvakRlcGxveWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLkVKQkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuTnVsbE1vZHVsZUFydGlmYWN0OwotCi0vKioKLSAqIEB2ZXJzaW9uIDEuMAotICogQGF1dGhvcgotICovCi1wdWJsaWMgY2xhc3MgRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlclV0aWwgewotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFSkJEZXBsb3lhYmxlT2JqZWN0QWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgRUpCRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlclV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVKQkphcikKLQkJCXJldHVybiBnZXRNb2R1bGVPYmplY3QoKEVKQkphcikgb2JqKTsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pCi0JCQlyZXR1cm4gZ2V0TW9kdWxlT2JqZWN0KChTZXNzaW9uQmVhbikgb2JqKTsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbkJlYW4pCi0JCQlyZXR1cm4gZ2V0TW9kdWxlT2JqZWN0KChNZXNzYWdlRHJpdmVuQmVhbikgb2JqKTsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRW50aXR5QmVhbikKLQkJCXJldHVybiBnZXRNb2R1bGVPYmplY3QoKEVudGl0eUJlYW4pIG9iaik7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KSAKLQkJCXJldHVybiAgZ2V0TW9kdWxlT2JqZWN0KChJUHJvamVjdCkgb2JqKTsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSAKLQkJCXJldHVybiAgZ2V0TW9kdWxlT2JqZWN0KCgoSUphdmFQcm9qZWN0KSBvYmopLmdldFByb2plY3QoKSk7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElGaWxlKQotCQkJcmV0dXJuIGdldE1vZHVsZU9iamVjdCgoSUZpbGUpIG9iaik7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpCi0JCQlyZXR1cm4gZ2V0TW9kdWxlT2JqZWN0KChJQ29tcGlsYXRpb25Vbml0KSBvYmopOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaGFzSW50ZXJlc3RlZENvbXBvbmVudHMoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KHByb2plY3QpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0KLQkJdHJ5IHsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGN1LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJaWYgKGhhc0ludGVyZXN0ZWRDb21wb25lbnRzKHByb2plY3QpKSB7Ci0JCQkJcmV0dXJuIGdldE1vZHVsZUphdmFPYmplY3QoZmlsZSk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KEVKQkphciBlamJKYXIpIHsKLQkJSU1vZHVsZSBkZXAgPSBnZXRNb2R1bGUoKEVPYmplY3QpZWpiSmFyKTsKLQkJcmV0dXJuIGNyZWF0ZU1vZHVsZU9iamVjdChkZXAsIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KFNlc3Npb25CZWFuIGVqYikgewotCQlJTW9kdWxlIGRlcCA9IGdldE1vZHVsZSgoRU9iamVjdCllamIpOwotCQlyZXR1cm4gY3JlYXRlTW9kdWxlT2JqZWN0KGRlcCwgZWpiLmdldEVqYk5hbWUoKSwgZmFsc2UsIGZhbHNlKTsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KEVudGl0eUJlYW4gZWpiKSB7Ci0JCUlNb2R1bGUgZGVwID0gZ2V0TW9kdWxlKChFT2JqZWN0KWVqYik7Ci0JCXJldHVybiBjcmVhdGVNb2R1bGVPYmplY3QoZGVwLCBlamIuZ2V0RWpiTmFtZSgpLCBmYWxzZSwgZmFsc2UpOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoTWVzc2FnZURyaXZlbkJlYW4gZWpiKSB7Ci0JCUlNb2R1bGUgZGVwID0gZ2V0TW9kdWxlKChFT2JqZWN0KWVqYik7Ci0JCXJldHVybiBjcmVhdGVNb2R1bGVPYmplY3QoZGVwLCBlamIuZ2V0RWpiTmFtZSgpLCBmYWxzZSwgZmFsc2UpOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdFtdIGdldE1vZHVsZU9iamVjdHMoU2Vzc2lvbkJlYW4gZWpiKSB7Ci0JCUxpc3QgbW9kQXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJTW9kdWxlIGRlcCA9IGdldE1vZHVsZSgoRU9iamVjdCllamIpOwotCQlMaXN0IGJ1c0xvY2FscyA9IGVqYi5nZXRCdXNpbmVzc0xvY2FscygpOwotCQlMaXN0IGJ1c1JlbW90ZXMgPSBlamIuZ2V0QnVzaW5lc3NSZW1vdGVzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBidXNMb2NhbHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGxvY2FsTmFtZSA9IChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW1vZEFydGlmYWN0cy5hZGQoY3JlYXRlTW9kdWxlT2JqZWN0Rm9yU2Vzc2lvbkJlYW4oZGVwLCBlamIuZ2V0RWpiTmFtZSgpLCBsb2NhbE5hbWUsIGZhbHNlLHRydWUpKTsKLQkJCQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBidXNSZW1vdGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyByZW1vdGVOYW1lID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJbW9kQXJ0aWZhY3RzLmFkZChjcmVhdGVNb2R1bGVPYmplY3RGb3JTZXNzaW9uQmVhbihkZXAsIGVqYi5nZXRFamJOYW1lKCksIHJlbW90ZU5hbWUsIHRydWUsIGZhbHNlKSk7Ci0JCX0KLQkJcmV0dXJuIChJTW9kdWxlQXJ0aWZhY3RbXSltb2RBcnRpZmFjdHMudG9BcnJheShuZXcgSU1vZHVsZUFydGlmYWN0W21vZEFydGlmYWN0cy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoaGFzSW50ZXJlc3RlZENvbXBvbmVudHMocHJvamVjdCkpIHsKLQkJCUlNb2R1bGUgZGVwID0gZ2V0TW9kdWxlKHByb2plY3QsIG51bGwpOwotCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZU9iamVjdChkZXAsIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KElGaWxlIGZpbGUpIHsKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGZpbGUpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCQlpZiAocmVzb3VyY2VzWzBdICE9IG51bGwgfHwgcmVzb3VyY2VzLmxlbmd0aCA8PSAwKQotCQkJY29tcG9uZW50ID0gcmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpOwotCQlpZiAoaGFzSW50ZXJlc3RlZENvbXBvbmVudHMoZmlsZS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQlTdHJpbmcgZXh0ID0gZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlpZiAoImphdmEiLmVxdWFscyhleHQpIHx8ICJjbGFzcyIuZXF1YWxzKGV4dCkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybiBnZXRNb2R1bGVKYXZhT2JqZWN0KGZpbGUpOwotCQkJaWYgKGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoSjJFRUNvbnN0YW50cy5FSkJKQVJfRERfVVJJKSkKLQkJCQlyZXR1cm4gY3JlYXRlTW9kdWxlT2JqZWN0KGdldE1vZHVsZShmaWxlLmdldFByb2plY3QoKSwgY29tcG9uZW50KSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlKEVPYmplY3QgcmVmT2JqZWN0KSB7Ci0JCUlQcm9qZWN0IHByb2ogPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocmVmT2JqZWN0KTsKLQkJUmVzb3VyY2UgcmVmUmVzb3VyY2UgPSByZWZPYmplY3QuZVJlc291cmNlKCk7Ci0JCUlWaXJ0dWFsUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBudWxsOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCQl0cnkgewotCQkJSVJlc291cmNlIGVjbGlwZVNlcnZSZXNvcnVjZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVmUmVzb3VyY2UpOwotCQkJcmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZWNsaXBlU2VydlJlc29ydWNlKTsKLQkJCWlmIChyZXNvdXJjZXNbMF0gIT0gbnVsbCkKLQkJCQljb21wb25lbnQgPSByZXNvdXJjZXNbMF0uZ2V0Q29tcG9uZW50KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBnZXRNb2R1bGUocHJvaiwgY29tcG9uZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlKElQcm9qZWN0IHByb2plY3QsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlJTW9kdWxlIGRlcGxveWFibGUgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QoU2VydmVyVXRpbC5nZXRNb2R1bGVzKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkVKQikpLml0ZXJhdG9yKCk7ICAKLQkJU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBudWxsOwotCQlpZiAoY29tcG9uZW50ICE9IG51bGwpCi0JCQljb21wb25lbnROYW1lID0gY29tcG9uZW50LmdldE5hbWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldE1vZHVsZVByb2plY3QocHJvamVjdCwgaXRlcmF0b3IpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgSU1vZHVsZSkgewotCQkJCWRlcGxveWFibGUgPSAoSU1vZHVsZSkgbmV4dDsKLQkJCQlpZiAoZGVwbG95YWJsZS5nZXROYW1lKCkuZXF1YWxzKGNvbXBvbmVudE5hbWUpKSB7Ci0JCQkJCXJldHVybiBkZXBsb3lhYmxlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZVByb2plY3QoSVByb2plY3QgcHJvamVjdCwgSXRlcmF0b3IgaXRlcmF0b3IpIHsKLQkJSU1vZHVsZSBkZXBsb3lhYmxlID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQlkZXBsb3lhYmxlID0gKElNb2R1bGUpIG5leHQ7Ci0JCQkJaWYgKGRlcGxveWFibGUuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQkJcmV0dXJuIGRlcGxveWFibGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVKYXZhT2JqZWN0KElGaWxlIGZpbGUpIHsKLQotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IChJVmlydHVhbENvbXBvbmVudClmaWxlLmdldEFkYXB0ZXIoSVZpcnR1YWxDb21wb25lbnQuY2xhc3MpOwotCQkJLy8gVE9ETyB3aGF0IGRvIHdlIHJldHVybiBmb3IgSmF2YSBjbGFzcz8KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgY3JlYXRlTW9kdWxlT2JqZWN0KElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgZWpiTmFtZSwgYm9vbGVhbiByZW1vdGUsIGJvb2xlYW4gbG9jYWwpIHsKLQkJaWYgKG1vZHVsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgam5kaU5hbWUgPSBudWxsOwotCQkJaWYgKGVqYk5hbWUgIT0gbnVsbCkgewotCQkJCW1vZHVsZS5sb2FkQWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJSkVFRmxleFByb2pEZXBsb3lhYmxlIG1vZHVsZURlbGVnYXRlID0gKEpFRUZsZXhQcm9qRGVwbG95YWJsZSltb2R1bGUuZ2V0QWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcyk7Ci0JCQkJam5kaU5hbWUgPSBtb2R1bGVEZWxlZ2F0ZS5nZXRKTkRJTmFtZShlamJOYW1lKTsKLQkJCQlyZXR1cm4gbmV3IEVKQkJlYW4obW9kdWxlLCBqbmRpTmFtZSwgcmVtb3RlLCBsb2NhbCxFSkJCZWFuLkVKQl8zMCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE51bGxNb2R1bGVBcnRpZmFjdChtb2R1bGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGNyZWF0ZU1vZHVsZU9iamVjdEZvclNlc3Npb25CZWFuKElNb2R1bGUgbW9kdWxlLCBTdHJpbmcgZWpiTmFtZSwgU3RyaW5nIGludGVyZmFjZU5hbWUsIGJvb2xlYW4gcmVtb3RlLCBib29sZWFuIGxvY2FsKSB7Ci0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGpuZGlOYW1lID0gbnVsbDsKLQkJCWlmIChlamJOYW1lICE9IG51bGwpIHsKLQkJCQltb2R1bGUubG9hZEFkYXB0ZXIoTW9kdWxlRGVsZWdhdGUuY2xhc3MsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCUpFRUZsZXhQcm9qRGVwbG95YWJsZSBtb2R1bGVEZWxlZ2F0ZSA9IChKRUVGbGV4UHJvakRlcGxveWFibGUpbW9kdWxlLmdldEFkYXB0ZXIoTW9kdWxlRGVsZWdhdGUuY2xhc3MpOwotCQkJCWpuZGlOYW1lID0gbW9kdWxlRGVsZWdhdGUuZ2V0Sk5ESU5hbWUoZWpiTmFtZSwgaW50ZXJmYWNlTmFtZSk7Ci0JCQkJcmV0dXJuIG5ldyBFSkJCZWFuKG1vZHVsZSwgam5kaU5hbWUsIHJlbW90ZSwgbG9jYWwsRUpCQmVhbi5FSkJfMzAsIGludGVyZmFjZU5hbWUpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBOdWxsTW9kdWxlQXJ0aWZhY3QobW9kdWxlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVBZGFwdGVyVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL0VudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVBZGFwdGVyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQ5YjQyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlQWRhcHRlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLk51bGxNb2R1bGVBcnRpZmFjdDsKLQotLyoqCi0gKiBDcmVhdGVzIHRoZSBPYmplY3QgYWRhcHRlciBmb3IgZWFyIHByb2plY3RzLgotICovCi1wdWJsaWMgY2xhc3MgRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGVwbG95YWJsZUFkYXB0ZXJVdGlsIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlT2JqZWN0QWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGVwbG95YWJsZUFkYXB0ZXJVdGlsKCkgewotCQlzdXBlcigpOwotCX0vLyBFbnRlcnByaXNlQXBwbGljYXRpb25EZXBsb3lhYmxlT2JqZWN0QWRhcHRlcgotCi0JLyoqCi0JICogR2V0cyB0aGUgb2JqZWN0IGZvciBhIHR5cGUgb2Ygb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBPYmplY3QKLQkgKiAgICAgICAgICAgIG9iaiAtIE9iamVjdCB0byBhZGFwdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQXBwbGljYXRpb24pCi0JCQlyZXR1cm4gZ2V0TW9kdWxlT2JqZWN0KChBcHBsaWNhdGlvbikgb2JqKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElQcm9qZWN0KQotCQkJcmV0dXJuIGdldE1vZHVsZU9iamVjdCgoSVByb2plY3QpIG9iaik7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJRmlsZSkKLQkJCXJldHVybiBnZXRNb2R1bGVPYmplY3QoKElGaWxlKSBvYmopOwotCQlyZXR1cm4gbnVsbDsKLQl9Ly8gZ2V0RGVwbG95YWJsZU9iamVjdAotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVwbG95YWJsZSBvYmplY3QgZm9yIGVhciBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gQXBwbGljYXRpb24KLQkgKiAgICAgICAgICAgIGFwcGxpY2F0aW9uIC0gRUFSIGluc3RhbmNlLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZU9iamVjdChBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgewotCQlJTW9kdWxlIGRlcCA9IGdldE1vZHVsZSgoRU9iamVjdClhcHBsaWNhdGlvbik7Ci0JCXJldHVybiBjcmVhdGVNb2R1bGVPYmplY3QoZGVwKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXBsb3lhYmxlIG9iamVjdCBmb3IgcHJvamVjdCBpbnN0YW5jZXMuCi0JICogCi0JICogQHBhcmFtIElQcm9qZWN0Ci0JICogICAgICAgICAgICBwcm9qZWN0IC0gUHJvamVjdCBpbnN0YW5jZS4KLQkgKiBAcmV0dXJuIElNb2R1bGVPYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlJTW9kdWxlIGRlcCA9IGdldE1vZHVsZShwcm9qZWN0LG51bGwpOwotCQlyZXR1cm4gY3JlYXRlTW9kdWxlT2JqZWN0KGRlcCk7Ci0JfS8vIGdldE1vZHVsZU9iamVjdAotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVwbG95YWJsZSBvYmplY3QgZm9yIGZpbGUgaW5zdGFuY2VzLgotCSAqIAotCSAqIEBwYXJhbSBJRmlsZQotCSAqICAgICAgICAgICAgZmlsZSAtIEZpbGUgaW5zdGFuY2UuCi0JICogQHJldHVybiBJTW9kdWxlT2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlQXJ0aWZhY3QgZ2V0TW9kdWxlT2JqZWN0KElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoSjJFRUNvbnN0YW50cy5BUFBMSUNBVElPTl9ERF9VUkkpKSB7Ci0JCQl7Ci0JCQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IENvbXBvbmVudENvcmUuY3JlYXRlUmVzb3VyY2VzKGZpbGUpOwotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7Ci0JCQkJaWYgKHJlc291cmNlc1swXSAhPSBudWxsIHx8IHJlc291cmNlcy5sZW5ndGggPD0gMCkKLQkJCQkJY29tcG9uZW50ID0gcmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpOwotCQkJCXJldHVybiBjcmVhdGVNb2R1bGVPYmplY3QoZ2V0TW9kdWxlKGZpbGUuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpKTsKLQkJCX0KLQkJfS8vIGlmCi0JCXJldHVybiBudWxsOwotCX0vLyBnZXRNb2R1bGVPYmplY3QKLQotCS8qKgotCSAqIEdldHMgdGhlIGRlcGxveWFibGUgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBFT2JqZWN0Ci0JICogICAgICAgICAgICByZWZPYmplY3QgLSBUaGUgY3VycmVudCByZWZPYmplY3QuCi0JICogQHJldHVybiBJTW9kdWxlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShFT2JqZWN0IHJlZk9iamVjdCkgewotCQlJUHJvamVjdCBwcm9qID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHJlZk9iamVjdCk7Ci0JCVJlc291cmNlIHNlcnZSZXNvdXJjZSA9IHJlZk9iamVjdC5lUmVzb3VyY2UoKTsKLQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2UgZWNsaXBlU2VydlJlc29ydWNlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShzZXJ2UmVzb3VyY2UpOwotCQkJcmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZWNsaXBlU2VydlJlc29ydWNlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJaWYgKHJlc291cmNlc1swXSAhPSBudWxsKQotCQkJY29tcG9uZW50ID0gcmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpOwotCQlyZXR1cm4gZ2V0TW9kdWxlKHByb2osY29tcG9uZW50KTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZVByb2plY3QoSVByb2plY3QgcHJvamVjdCwgSXRlcmF0b3IgaXRlcmF0b3IpIHsKLQkJSU1vZHVsZSBkZXBsb3lhYmxlID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQlkZXBsb3lhYmxlID0gKElNb2R1bGUpIG5leHQ7Ci0JCQkJaWYgKGRlcGxveWFibGUuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQkJcmV0dXJuIGRlcGxveWFibGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZShJUHJvamVjdCBwcm9qZWN0LCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSU1vZHVsZSBkZXBsb3lhYmxlID0gbnVsbDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KFNlcnZlclV0aWwuZ2V0TW9kdWxlcyhKMkVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OKSkuaXRlcmF0b3IoKTsgCi0JCVN0cmluZyBjb21wb25lbnROYW1lID0gbnVsbDsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKQotCQkJY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBnZXRNb2R1bGVQcm9qZWN0KHByb2plY3QsIGl0ZXJhdG9yKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQlkZXBsb3lhYmxlID0gKElNb2R1bGUpIG5leHQ7Ci0JCQkJaWYgKGRlcGxveWFibGUuZ2V0TmFtZSgpLmVxdWFscyhjb21wb25lbnROYW1lKSkgewotCQkJCQlyZXR1cm4gZGVwbG95YWJsZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVwbG95YWJsZSBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIElNb2R1bGVPYmplY3QKLQkgKiAgICAgICAgICAgIGRlcGxveWFibGUgLSBUaGUgY3VycmVudCBtb2R1bGUgb2JqZWN0LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSU1vZHVsZUFydGlmYWN0IGNyZWF0ZU1vZHVsZU9iamVjdChJTW9kdWxlIG1vZHVsZSkgewotCi0JCWlmIChtb2R1bGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBOdWxsTW9kdWxlQXJ0aWZhY3QobW9kdWxlKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0vLyBjcmVhdGVEZXBsb3lhYmxlT2JqZWN0Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3RBZGFwdGVyI2dldElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdEFkYXB0ZXIjZ2V0T2JqZWN0Q2xhc3NOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdENsYXNzTmFtZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3RBZGFwdGVyI2lzUGx1Z2luQWN0aXZhdGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BsdWdpbkFjdGl2YXRlZCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19Ly8gRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGVwbG95YWJsZU9iamVjdEFkYXB0ZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9FbnRlcnByaXNlRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2NGFiNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvRW50ZXJwcmlzZURlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEphbiAxOCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5kZXBsb3lhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZUFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZTsKLQotcHVibGljIGNsYXNzIEVudGVycHJpc2VEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSBleHRlbmRzIE1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlIGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5ICB7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXSB7SUxhdW5jaGFibGUuY2xhc3MgfTsKLQl9Ci0KLQlwdWJsaWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIEVudGVycHJpc2VBcHBsaWNhdGlvbkRlcGxveWFibGVBZGFwdGVyVXRpbC5nZXRNb2R1bGVPYmplY3Qob2JqKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YzJkODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXXtJTGF1bmNoYWJsZS5jbGFzc307Ci0JfQotCi0KLQlwdWJsaWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFdlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwuZ2V0TW9kdWxlT2JqZWN0KG9iaik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvV2ViRGVwbG95YWJsZUFydGlmYWN0VXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL2RlcGxveWFibGVzL1dlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxZTY4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvV2ViRGVwbG95YWJsZUFydGlmYWN0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuamZhY2VzLmV4dGVuc2lvbi5GaWxlVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5qZmFjZXMuZXh0ZW5zaW9uLkZpbGVVUkxFeHRlbnNpb25SZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlVybFBhdHRlcm5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLmltcGwuU2VydmxldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGVBcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5XZWJSZXNvdXJjZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIFdlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwgewotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBHRU5FUklDX1NFUlZMRVRfQ0xBU1NfVFlQRSA9ICJqYXZheC5zZXJ2bGV0LkdlbmVyaWNTZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDQUNUVVNfU0VSVkxFVF9DTEFTU19UWVBFID0gIm9yZy5hcGFjaGUuY2FjdHVzLnNlcnZlci5TZXJ2bGV0VGVzdFJlZGlyZWN0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgV2ViRGVwbG95YWJsZUFydGlmYWN0VXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVPYmplY3QoT2JqZWN0IG9iaikgewotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgSVJlc291cmNlKQotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBvYmo7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJTW9kdWxlQXJ0aWZhY3QpCi0JCQlyZXNvdXJjZSA9ICgoSU1vZHVsZUFydGlmYWN0KSBvYmopLmdldE1vZHVsZSgpLmdldFByb2plY3QoKTsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBvYmopLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmVzb3VyY2UgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoKEVPYmplY3QpIG9iaik7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU2VydmxldCkgewotCQkJCVNlcnZsZXRJbXBsIHNlcnZsZXQgPSAoKFNlcnZsZXRJbXBsKSBvYmopOwotCQkJCVJlc291cmNlIHNlcnZSZXNvdXJjZSA9IHNlcnZsZXQuZVJlc291cmNlKCk7Ci0JCQkJSVZpcnR1YWxSZXNvdXJjZVtdIHJlc291cmNlcyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJSVJlc291cmNlIGVjbGlwZVNlcnZSZXNvcnVjZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoc2VydlJlc291cmNlKTsKLQkJCQkJcmVzb3VyY2VzID0gQ29tcG9uZW50Q29yZS5jcmVhdGVSZXNvdXJjZXMoZWNsaXBlU2VydlJlc29ydWNlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCQkJCWlmIChyZXNvdXJjZXNbMF0gIT0gbnVsbCkKLQkJCQkJY29tcG9uZW50ID0gcmVzb3VyY2VzWzBdLmdldENvbXBvbmVudCgpOwotCQkJCVN0cmluZyBtYXBwaW5nID0gbnVsbDsKLQkJCQlqYXZhLnV0aWwuTGlzdCBtYXBwaW5ncyA9IGdldFNlcnZsZXRNYXBwaW5ncyhyZXNvdXJjZSwgc2VydmxldC5nZXRTZXJ2bGV0Q2xhc3MoKSk7Ci0KLQkJCQlpZiAobWFwcGluZ3MgIT0gbnVsbCAmJiAhbWFwcGluZ3MuaXNFbXB0eSgpKSB7Ci0JCQkJCVNlcnZsZXRNYXBwaW5nIG1hcCA9IChTZXJ2bGV0TWFwcGluZykgbWFwcGluZ3MuZ2V0KDApOwotCQkJCQlVcmxQYXR0ZXJuVHlwZSB1cmxQYXR0ZXJuID0gKFVybFBhdHRlcm5UeXBlKW1hcC5nZXRVcmxQYXR0ZXJucygpLmdldCgwKTsKLQkJCQkJbWFwcGluZyA9IHVybFBhdHRlcm4uZ2V0VmFsdWUoKTsKLQkJCQl9Ci0JCQkJaWYgKG1hcHBpbmcgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIG5ldyBQYXRoKG1hcHBpbmcpKTsKLQkJCQl9Ci0JCQkJCi0vLwkJCQlXZWJUeXBlIHdlYlR5cGUgPSAoKFNlcnZsZXQpIG9iaikuZ2V0V2ViVHlwZSgpOwotLy8JCQkJaWYgKHdlYlR5cGUuaXNKc3BUeXBlKCkpIHsKLS8vCQkJCQlyZXNvdXJjZSA9ICgoSVByb2plY3QpIHJlc291cmNlKS5nZXRGaWxlKCgoSlNQVHlwZSkgd2ViVHlwZSkuZ2V0SnNwRmlsZSgpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJfSBlbHNlIGlmICh3ZWJUeXBlLmlzU2VydmxldFR5cGUoKSkgewotLy8JCQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHJlc291cmNlLmdldFByb2plY3QoKSwgY29tcG9uZW50KSwgbmV3IFBhdGgoInNlcnZsZXQvIiArICgoU2VydmxldFR5cGUpIHdlYlR5cGUpLmdldENsYXNzTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKLQkJCWlmIChoYXNJbnRlcmVzdGVkQ29tcG9uZW50cyhwcm9qZWN0KSkKLQkJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShwcm9qZWN0LCBudWxsKSwgcHJvamVjdC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQl9Ci0JCQotCQlpZiAoIWhhc0ludGVyZXN0ZWRDb21wb25lbnRzKHJlc291cmNlLmdldFByb2plY3QoKSkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQkJaWYgKGlzQ2FjdHVzSnVuaXRUZXN0KHJlc291cmNlKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlQYXRoIHJlc291cmNlUGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JCUlWaXJ0dWFsUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlc291cmNlcyhyZXNvdXJjZSk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZXMubGVuZ3RoIDw9IDAgfHwgcmVzb3VyY2VzWzBdID09IG51bGwgKQotCQkJcmV0dXJuIG51bGw7Ci0JCWNvbXBvbmVudCA9IHJlc291cmNlc1swXS5nZXRDb21wb25lbnQoKTsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldFNlcnZsZXRDbGFzc05hbWUocmVzb3VyY2UpOwotCQlpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY29tcG9uZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBtYXBwaW5nID0gZ2V0U2VydmxldE1hcHBpbmcocmVzb3VyY2UsIHRydWUsIGNsYXNzTmFtZSwgY29tcG9uZW50LmdldE5hbWUoKSk7Ci0JCQlpZiAobWFwcGluZyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBXZWJSZXNvdXJjZShnZXRNb2R1bGUocmVzb3VyY2UuZ2V0UHJvamVjdCgpLCBjb21wb25lbnQpLCBuZXcgUGF0aChtYXBwaW5nKSk7Ci0JCQl9Ci0JCQkvLyBpZiB0aGVyZSBpcyBubyBzZXJ2bGV0IG1hcHBpbmcsIHByb3ZpZGUgZGlyZWN0IGFjY2VzcyB0byB0aGUgc2VydmxldAotCQkJLy8gdGhyb3VnaCB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLQkJCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHJlc291cmNlLmdldFByb2plY3QoKSwgY29tcG9uZW50KSwgbmV3IFBhdGgoInNlcnZsZXQvIiArIGNsYXNzTmFtZSkpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKLS8vCQkJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotLy8JCQl0cnkgewotLy8JCQkJd2ViRWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXBvbmVudCk7Ci0vLwkJCQlMaXN0IHNlcnZsZXRzID0gd2ViRWRpdC5nZXRXZWJBcHAoKS5nZXRTZXJ2bGV0cygpOwotLy8JCQkJZm9yIChpbnQgaT0wOyBpPHNlcnZsZXRzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCQkJU2VydmxldCBzZXJ2bGV0ID0gKFNlcnZsZXQpIHNlcnZsZXRzLmdldChpKTsKLS8vCQkJCQlXZWJUeXBlIHR5cGUgPSBzZXJ2bGV0LmdldFdlYlR5cGUoKTsKLS8vCQkJCQlpZiAodHlwZS5pc0pzcFR5cGUoKSkgewotLy8JCQkJCQlKU1BUeXBlIGpzcCA9IChKU1BUeXBlKXR5cGU7Ci0vLwkJCQkJCVN0cmluZyBqc3BQYXRoID0gcmVzb3VyY2UuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkudG9TdHJpbmcoKTsKLS8vCQkJCQkJaWYgKGpzcC5nZXRKc3BGaWxlKCkuZXF1YWxzKGpzcFBhdGgpKSB7Ci0vLwkJCQkJCQlMaXN0IG1hcHBpbmdzID0gc2VydmxldC5nZXRNYXBwaW5ncygpOwotLy8JCQkJCQkJU3RyaW5nIG1hcHBpbmcgPSBudWxsOwotLy8JCQkJCQkJaWYgKG1hcHBpbmdzICE9IG51bGwgJiYgIW1hcHBpbmdzLmlzRW1wdHkoKSkgewotLy8JCQkJCQkJCVNlcnZsZXRNYXBwaW5nIG1hcCA9IChTZXJ2bGV0TWFwcGluZykgbWFwcGluZ3MuZ2V0KDApOwotLy8JCQkJCQkJCW1hcHBpbmcgPSBtYXAuZ2V0VXJsUGF0dGVybigpOwotLy8JCQkJCQkJCWlmIChtYXBwaW5nICE9IG51bGwpIAotLy8JCQkJCQkJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIG5ldyBQYXRoKG1hcHBpbmcpKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfSBmaW5hbGx5IHsKLS8vCQkJCWlmICh3ZWJFZGl0ICE9IG51bGwpCi0vLwkJCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0vLwkJCX0KLQkJfQotICAgICAgICByZXNvdXJjZVBhdGggPSByZXNvdXJjZXNbMF0uZ2V0UnVudGltZVBhdGgoKTsKLSAgICAgICAgCi0JCXRyeSB7Ly9hZGRpbmcgdHJ5L2NhdGNoIHRvIGF2b2lkIGZ1dHVyZSBpc3N1ZXMgdGhhdCB3b3VsZCByZXF1aXJlIGNvbW1lbnRpbmcgdGhpcyBvdXQuCi0JCQkvLyBFeHRlbnNpb24gcmVhZCB0byBnZXQgdGhlIGNvcnJlY3QgVVJMIGZvciBKYXZhIFNlcnZlciBGYWNlcyBmaWxlIGlmCi0JCQkvLyB0aGUganNwIGlzIG9mIHR5cGUganNmYWNlcy4KLQkJCUZpbGVVUkwganNwVVJMID0gRmlsZVVSTEV4dGVuc2lvblJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEZpbGVzVVJMKCk7Ci0JCQlpZiAoanNwVVJMICE9IG51bGwpIHsKLQkJCQlJUGF0aCBjb3JyZWN0SlNQUGF0aCA9IGpzcFVSTC5nZXRGaWxlVVJMKHJlc291cmNlLCByZXNvdXJjZVBhdGgpOwotCQkJCWlmIChjb3JyZWN0SlNQUGF0aCAhPSBudWxsICYmIGNvcnJlY3RKU1BQYXRoLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKQotCQkJCQlyZXR1cm4gbmV3IFdlYlJlc291cmNlKGdldE1vZHVsZShyZXNvdXJjZS5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCksIGNvcnJlY3RKU1BQYXRoKTsKLQkJCX0KLQkJfWNhdGNoIChFeGNlcHRpb24gZSkge30KLQkJCi0JCXJldHVybiBuZXcgV2ViUmVzb3VyY2UoZ2V0TW9kdWxlKHJlc291cmNlLmdldFByb2plY3QoKSwgY29tcG9uZW50KSwgcmVzb3VyY2VQYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElNb2R1bGUgZ2V0TW9kdWxlKElQcm9qZWN0IHByb2plY3QsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlJTW9kdWxlIGRlcGxveWFibGUgPSBudWxsOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QoU2VydmVyVXRpbC5nZXRNb2R1bGVzKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCKSkuaXRlcmF0b3IoKTsgCi0JCVN0cmluZyBjb21wb25lbnROYW1lID0gbnVsbDsKLQkJaWYgKGNvbXBvbmVudCAhPSBudWxsKQotCQkJY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5nZXROYW1lKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBnZXRNb2R1bGVQcm9qZWN0KHByb2plY3QsIGl0ZXJhdG9yKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQlkZXBsb3lhYmxlID0gKElNb2R1bGUpIG5leHQ7Ci0JCQkJaWYgKGRlcGxveWFibGUuZ2V0TmFtZSgpLmVxdWFscyhjb21wb25lbnROYW1lKSkgewotCQkJCQlyZXR1cm4gZGVwbG95YWJsZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlIGdldE1vZHVsZVByb2plY3QoSVByb2plY3QgcHJvamVjdCwgSXRlcmF0b3IgaXRlcmF0b3IpIHsKLQkJSU1vZHVsZSBkZXBsb3lhYmxlID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dCBpbnN0YW5jZW9mIElNb2R1bGUpIHsKLQkJCQlkZXBsb3lhYmxlID0gKElNb2R1bGUpIG5leHQ7Ci0JCQkJaWYgKGRlcGxveWFibGUuZ2V0UHJvamVjdCgpLmVxdWFscyhwcm9qZWN0KSkKLQkJCQkJcmV0dXJuIGRlcGxveWFibGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogVmVyeSB0ZW1wb3JhcnkgYXBpIC0gVE9ETyAtIHJpcCB0aGlzIG91dCBieSAxLjAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2FjdHVzSnVuaXRUZXN0KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lRm9yVHlwZShyZXNvdXJjZSwgQ0FDVFVTX1NFUlZMRVRfQ0xBU1NfVFlQRSkgIT0gbnVsbDsKLQl9Ci0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgSVR5cGVbXSBnZXRUeXBlcyhJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQl0cnkgewotCQkJaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSAhPSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJcmV0dXJuICgoSUNvbXBpbGF0aW9uVW5pdCkgZWxlbWVudCkuZ2V0QWxsVHlwZXMoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmxldENsYXNzTmFtZShJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIGdldENsYXNzTmFtZUZvclR5cGUocmVzb3VyY2UsIEdFTkVSSUNfU0VSVkxFVF9DTEFTU19UWVBFKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWVGb3JUeXBlKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHN1cGVyVHlwZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JCQlpZiAoIXByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkgfHwgcGF0aCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSBwcm9qZWN0LmdldE5hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQkJaWYgKCFqYXZhUHJvamVjdC5pc09wZW4oKSkKLQkJCQlqYXZhUHJvamVjdC5vcGVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCQkvLyBvdXRwdXQgbG9jYXRpb24gbWF5IG5vdCBiZSBvbiBjbGFzc3BhdGgKLQkJCUlQYXRoIG91dHB1dFBhdGggPSBqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJaWYgKG91dHB1dFBhdGggIT0gbnVsbCAmJiAiY2xhc3MiLmVxdWFscyhwYXRoLmdldEZpbGVFeHRlbnNpb24oKSkgJiYgb3V0cHV0UGF0aC5pc1ByZWZpeE9mKHBhdGgpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgY291bnQgPSBvdXRwdXRQYXRoLnNlZ21lbnRDb3VudCgpOwotCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoY291bnQpOwotCQkJfQotCi0JCQkvLyByZW1vdmUgaW5pdGlhbCBwYXJ0IG9mIGNsYXNzcGF0aAotCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NQYXRoRW50cnkgPSBqYXZhUHJvamVjdC5nZXRSZXNvbHZlZENsYXNzcGF0aCh0cnVlKTsKLQkJCWlmIChjbGFzc1BhdGhFbnRyeSAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSBjbGFzc1BhdGhFbnRyeS5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJSVBhdGggY2xhc3NQYXRoID0gY2xhc3NQYXRoRW50cnlbaV0uZ2V0UGF0aCgpOwotCQkJCQlpZiAoY2xhc3NQYXRoLmlzUHJlZml4T2YocGF0aCkpIHsKLQkJCQkJCWludCBjb3VudCA9IGNsYXNzUGF0aC5zZWdtZW50Q291bnQoKTsKLQkJCQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoY291bnQpOwotCQkJCQkJaSArPSBzaXplOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBnZXQgamF2YSBlbGVtZW50Ci0JCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBqYXZhUHJvamVjdC5maW5kRWxlbWVudChwYXRoKTsKLQotCQkJSVR5cGVbXSB0eXBlcyA9IGdldFR5cGVzKGphdmFFbGVtZW50KTsKLQkJCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUyID0gdHlwZXMubGVuZ3RoOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTI7IGkrKykgewotCQkJCQlpZiAoaGFzU3VwZXJjbGFzcyh0eXBlc1tpXSwgc3VwZXJUeXBlKSkKLQkJCQkJCXJldHVybiB0eXBlc1tpXS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1N1cGVyY2xhc3MoSVR5cGUgdHlwZSwgU3RyaW5nIHN1cGVyQ2xhc3NOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlJVHlwZUhpZXJhcmNoeSBoaWVyYXJjaHkgPSB0eXBlLm5ld1N1cGVydHlwZUhpZXJhcmNoeShudWxsKTsKLQkJCUlUeXBlW10gc3VwZXJDbGFzc2VzID0gaGllcmFyY2h5LmdldEFsbFN1cGVyY2xhc3Nlcyh0eXBlKTsKLQotCQkJaW50IHNpemUgPSBzdXBlckNsYXNzZXMubGVuZ3RoOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlpZiAoc3VwZXJDbGFzc05hbWUuZXF1YWxzKHN1cGVyQ2xhc3Nlc1tpXS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmxldE1hcHBpbmcoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGlzU2VydmxldCwgU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgY29tcG9uZW50TmFtZSkgewotCQlpZiAodHlwZU5hbWUgPT0gbnVsbCB8fCB0eXBlTmFtZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUlNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlciggcmVzb3VyY2UuZ2V0UHJvamVjdCgpICk7Ci0JCU9iamVjdCBtT2JqID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCi0JCWlmICggbU9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCl7Ci0JCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHAgd2ViQXBwPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSBtT2JqOwotCQkJTGlzdCBzZXJ2bGV0cyA9IHdlYkFwcC5nZXRTZXJ2bGV0cygpOwotCQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJCS8vIEVuc3VyZSB0aGUgZGlzcGxheSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGluIHRoZSB3ZWIgYXBwbGljYXRpb24KLQkJCWlmIChzZXJ2bGV0cyAhPSBudWxsICYmICFzZXJ2bGV0cy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZsZXRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQgc2VydmxldCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0KXNlcnZsZXRzLmdldChpKTsKLQkJCQkJaWYoIHNlcnZsZXQuZ2V0U2VydmxldENsYXNzKCkuZXF1YWxzKHR5cGVOYW1lKSl7Ci0JCQkJCi0JCQkJCQlqYXZhLnV0aWwuTGlzdCBtYXBwaW5ncyA9IHdlYkFwcC5nZXRTZXJ2bGV0TWFwcGluZ3MoKTsKLQkJCQkJCWlmIChtYXBwaW5ncyAhPSBudWxsICYmICFtYXBwaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlJdGVyYXRvciBpdCA9IG1hcHBpbmdzLml0ZXJhdG9yKCk7Ci0JCQkJCQkJd2hpbGUoIGl0Lmhhc05leHQoKSApewotCQkJCQkJCQlvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0TWFwcGluZyBtYXAgPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcpIGl0Lm5leHQoKTsKLQkJCQkJCQkJaWYoIG1hcC5nZXRTZXJ2bGV0TmFtZSgpLmVxdWFscyhzZXJ2bGV0LmdldFNlcnZsZXROYW1lKCkpKXsKLQkJCQkJCQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZSB1cmxQYXR0ZXJuID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5VcmxQYXR0ZXJuVHlwZSltYXAuZ2V0VXJsUGF0dGVybnMoKS5nZXQoMCk7Ci0JCQkJCQkJCQlyZXR1cm4gIHVybFBhdHRlcm4uZ2V0VmFsdWUoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCi0JCQkJfQotCQkJfQotCi0JCQkKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNJbnRlcmVzdGVkQ29tcG9uZW50cyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0U2VydmxldE1hcHBpbmdzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHR5cGVOYW1lKXsgCi0JCUlNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlciggcmVzb3VyY2UuZ2V0UHJvamVjdCgpICk7Ci0JCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKXByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCk7Ci0JCQotCQlMaXN0IHNlcnZsZXRzID0gd2ViQXBwLmdldFNlcnZsZXRzKCk7Ci0JCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoc2VydmxldHMgIT0gbnVsbCAmJiAhc2VydmxldHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlcnZsZXRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU2VydmxldCBzZXJ2bGV0ID0gKFNlcnZsZXQpc2VydmxldHMuZ2V0KGkpOwotCQkJCWlmKCBzZXJ2bGV0LmdldFNlcnZsZXRDbGFzcygpLmVxdWFscyh0eXBlTmFtZSkpewotCQkJCi0JCQkJCWphdmEudXRpbC5MaXN0IG1hcHBpbmdzID0gd2ViQXBwLmdldFNlcnZsZXRNYXBwaW5ncygpOwotCQkJCQlpZiAobWFwcGluZ3MgIT0gbnVsbCAmJiAhbWFwcGluZ3MuaXNFbXB0eSgpKSB7Ci0JCQkJCQlJdGVyYXRvciBpdCA9IG1hcHBpbmdzLml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSggaXQuaGFzTmV4dCgpICl7Ci0JCQkJCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmcgbWFwID0gKG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXRNYXBwaW5nKSBpdC5uZXh0KCk7Ci0JCQkJCQkJaWYoIG1hcC5nZXRTZXJ2bGV0TmFtZSgpLmVxdWFscyhzZXJ2bGV0LmdldFNlcnZsZXROYW1lKCkpKXsKLQkJCQkJCQkJbGlzdC5hZGQobWFwKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbWVzc2FnZXMucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzdjZWM1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotSU5WQUxJRF9ERVBfREVTQ19TRUxFQ1RJT05fVElUTEU9SW52YWxpZCBTZWxlY3Rpb24KLUlORk9STV9JTlZBTElEX0RFUF9ERVNDX1NFTEVDVElPTj1PbmUgb3IgbW9yZSBKYXZhIEVFIHByb2plY3RzIHNlbGVjdGVkIGFscmVhZHkgaGFzIGEgRGVwbG95bWVudCBEZXNjcmlwdG9yLgotCi1JTlZBTElEX0RFUF9ERVNDX1NFTEVDVElPTl9USVRMRT1JbnZhbGlkIFNlbGVjdGlvbgotSU5GT1JNX0lOVkFMSURfREVQX0RFU0NfU0VMRUNUSU9OPU9uZSBvciBtb3JlIEphdmEgRUUgcHJvamVjdHMgc2VsZWN0ZWQgYWxyZWFkeSBoYXMgYSBEZXBsb3ltZW50IERlc2NyaXB0b3IuCi1ERVBMT1lNRU5UX0RFU0NSSVBUT1I9RGVwbG95bWVudCBEZXNjcmlwdG9yOiAKLVNFU1NJT05fQkVBTlM9U2Vzc2lvbiBCZWFucwotRU5USVRZX0JFQU5TPUVudGl0eSBCZWFucygxLngtMi54KQotTUVTU0FHRV9EUklWRU5fQkVBTlM9TWVzc2FnZS1Ecml2ZW4gQmVhbnMKLUFDVElWQVRJT05fQ09ORklHX1BST1BFUlRJRVM9QWN0aXZhdGlvbiBDb25maWcgUHJvcGVydGllcwotRU5URVJQUklTRV9CRUFOX0NMQVNTX0RFU0NSSVBUSU9OPUVudGVycHJpc2UgQmVhbiBDbGFzcyAtIAotCi1TRVJWTEVUX0lURU1fUFJPVklERVI9U2VydmxldHMKLUxJU1RFTkVSX0lURU1fUFJPVklERVI9TGlzdGVuZXJzCi1GSUxURVJTX0lURU1fUFJPVklERVI9RmlsdGVycwotRklMVEVSX01BUFBJTkdfSVRFTV9QUk9WSURFUj1GaWx0ZXIgTWFwcGluZ3MKLVNFUlZMRVRfTUFQUElOR19JVEVNX1BST1ZJREVSPVNlcnZsZXQgTWFwcGluZ3MKLUVSUk9SX1BBR0VTX0lURU1fUFJPVklERVI9RXJyb3IgUGFnZXMKLVdFTENPTUVfUEFHRVNfSVRFTV9QUk9WSURFUj1XZWxjb21lIFBhZ2VzCi1DT05URVhUX1BBUkFNU19JVEVNX1BST1ZJREVSPUNvbnRleHQgUGFyYW1ldGVycwotQlVORExFRF9MSUJSQVJJRVNfTk9ERT1CdW5kbGVkIExpYnJhcmllcwotTElCUkFSWV9ESVJFQ1RPUlk9TGlicmFyeSBEaXJlY3RvcnkKLUVBUl9NT0RVTEVTX05PREU9TW9kdWxlcwotRUpCTE9DQUxfUkVGRVJFTkNFUz1FamIgTG9jYWwgUmVmZXJlbmNlcwotRUpCX1JFRkVSRU5DRVM9RWpiIFJlZmVyZW5jZXMKLUVOVklST01FTlRfRU5UUklFUz1FbnZpcm9ubWVudCBFbnRyaWVzCi1SRVNPVVJDRV9FTlZJUk9NRU5UX0VOVFJJRVM9UmVzb3VyY2UgRW52aXJvbm1lbnQgRW50cmllcwotUkVTT1VSQ0VfUkVGRVJFTkNFUz1SZXNvdXJjZSBSZWZlcmVuY2VzCi1TRVJWSUNFX1JFRkVSRU5DRVM9U2VydmljZSBSZWZlcmVuY2VzCi1SRUZFUkVOQ0VTPVJlZmVyZW5jZXMKLQotQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9UaGVfZHJhZ2dlZF9wcm9qZWN0X2Nhbm5vdF9iZV9hZGRlZF89VGhlIGRyYWdnZWQgcHJvamVjdCBjYW5ub3QgYmUgYWRkZWQKLUFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfVGhlX3Byb2plY3RfMF9jYW5ub3RfYmVfYWNjZXNzZV89VGhlIHByb2plY3QgY2Fubm90IGJlIGFjY2Vzc2VkCi1BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X0NvdWxkX25vdF9hZGRfbW9kdWxlX3RvX0VudGVycHJpc2VfPUNvdWxkIG5vdCBhZGQgbW9kdWxlIHRvIEVudGVycHJpc2UKLUFkZE1vZHVsZVRvRWFyRHJvcEFzc2lzdGFudF9BZGRpbmdfbW9kdWxlX3RvX2VhXz1BZGRpbmcgbW9kdWxlIHRvIGVhcgotSW1wb3J0SkVFTW9kdWxlRHJvcEFzc2lzdGFudF9JbXBvcnRpbmdfSmF2YV9FbnRlcnByaXNlX0VkaXRpb25fYXJ0aWZhY3RzPUltcG9ydGluZyBKYXZhIEVudGVycHJpc2UgRWRpdGlvbiBhcnRpZmFjdHMKLUltcG9ydEpFRU1vZHVsZURyb3BBc3Npc3RhbnRfQ291bGRfbm90X3JlY29nbml6ZV9leHRlbnNpb25fMF89Q291bGQgbm90IHJlY29nbml6ZSBleHRlbnNpb24KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQWJzdHJhY3RERE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQWJzdHJhY3RERE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0MDI0MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0Fic3RyYWN0REROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBBYnN0cmFjdCBEZXBsb3ltZW50IERlc2NyaXB0b3IgTm9kZSBpcyBhbiBhYnN0cmFjdCB3cmFwcGVyIGNsYXNzIGZvciB0aGUgbm9kZXMgaW4gdGhlIERlcGxveW1lbnQKLSAqIERlc2NyaXB0b3IgaXQgY2FuIGNvbnRhaW4gaW5mb3JtYXRpb24gZm9yIHRoZSBsYWJlbCBwcm92aWRlciBzb21lIGRlc2NyaXB0aW9uIGZvciB0b29sIHRpcCwgYW4gaW1hZ2UKLSAqIGFuZCB0aGUgb2JqZWN0IHRoYXQgaXQgaXMgd3JhcHBpbmcuCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERETm9kZSB7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGFkYXB0ZXJOb2RlOwotCXByb3RlY3RlZCBJbWFnZSBpbWFnZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRleHQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcwotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyTm9kZSAtIHRoZSB3cmFwcGVkIG9iamVjdCAKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RERE5vZGUoT2JqZWN0IGFkYXB0ZXJOb2RlKXsKLQkJdGhpcy5hZGFwdGVyTm9kZSA9IGFkYXB0ZXJOb2RlOwotCQlpbWFnZSA9IG51bGw7Ci0JCXRleHQgPSBudWxsOwotCQlkZXNjcmlwdGlvbiA9IG51bGw7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IExpc3QgZ2V0Q2hpbGRyZW4oKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc0NoaWxkcmVuKCk7Ci0KLQlwdWJsaWMgdm9pZCBkZWNvcmF0ZShJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcsIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlCi0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7IAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlck5vZGUoKSB7Ci0JCXJldHVybiBhZGFwdGVyTm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWluaXQoSmF2YUVFT2JqZWN0IG1vZGVsT2JqZWN0KSB7Ci0JCWFkYXB0ZXJOb2RlID0gbW9kZWxPYmplY3Q7Ci0JfQkJCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQWJzdHJhY3RHcm91cFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0Fic3RyYWN0R3JvdXBQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDkxZWRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQWJzdHJhY3RHcm91cFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEFic3RyYWN0IGdyb3VwIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlIHRoYXQgaGFzIGEgbnVtYmVyIG9mIHN1YiBub2RlcyAKLSAqIChsaWtlIEVudGl0eSBCZWFucywgU2Vzc2lvbiBCZWFucywgTWVzc2FnZSBEcml2ZW4gQmVhbnMpLgotICogCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RHcm91cFByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JcHJvdGVjdGVkIEphdmFFRU9iamVjdCBqYXZhZWU7Ci0JcHJvdGVjdGVkICBTdHJpbmcgdGV4dDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQotCXB1YmxpYyB2b2lkIHNldFZhbGlkKGJvb2xlYW4gaXNWYWxpZCkgewotCQl0aGlzLmlzVmFsaWQgPSBpc1ZhbGlkOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdEdyb3VwUHJvdmlkZXIoSmF2YUVFT2JqZWN0IGphdmFlZSkgewotCQl0aGlzLmphdmFlZSA9IGphdmFlZTsKLQkJdGV4dCA9IE1lc3NhZ2VzLkRFUExPWU1FTlRfREVTQ1JJUFRPUiArIGphdmFlZS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldENoaWxkcmVuKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSW1hZ2UgZ2V0SW1hZ2UoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQgOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gIWdldENoaWxkcmVuKCkuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBKYXZhRUVPYmplY3QgZ2V0SmF2YUVFT2JqZWN0KCkgewotCQlyZXR1cm4gamF2YWVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdChKYXZhRUVPYmplY3QgbW9kZWxPYmplY3QpIHsKLQkJdGhpcy5qYXZhZWUgPSBtb2RlbE9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCl7Ci0JCXJldHVybiBpc1ZhbGlkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9BcHBDbGllbnQ1Q29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0FwcENsaWVudDVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFkZDQyNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0FwcENsaWVudDVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuYXBwY2xpZW50Lkdyb3VwQXBwQ2xpZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLk1vZHVsZXNOb2RlOwotCi0vKioKLSAqIEVhciA1LjAgQ29udGVudCBwcm92aWRlciBpcyBEZXBsb3ltZW50IERlc2NyaXB0b3IgY29udGVudCBwcm92aWRlciwgCi0gKiB1c2VkIGZvciBjb25zdHJ1Y3Rpbmcgb2YgdGhlIGRlc2NyaXB0b3IgdHJlZSBpbiBwcm9qZWN0IGV4cGxvcmVyLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIEFwcENsaWVudDVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBKRUU1Q29udGVudFByb3ZpZGVyIHsKLQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgYVBhcmVudEVsZW1lbnQpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIpIHsKLQkJCWNoaWxkcmVuLmFkZEFsbCgoKEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIpIGFQYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbigpKTsKLQkJfSBlbHNlIGlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCXByb2plY3QgPSAoSVByb2plY3QpICgoSUFkYXB0YWJsZSkgYVBhcmVudEVsZW1lbnQpLmdldEFkYXB0ZXIoSVBST0pFQ1RfQ0xBU1MpOwotCQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2plY3QpICYmCi0JCQkJCUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkVFUHJvamVjdChwcm9qZWN0KSkgewotCQkJCWNoaWxkcmVuLmFkZCgoR3JvdXBBcHBDbGllbnRQcm92aWRlcikgZ2V0Q2FjaGVkQ29udGVudFByb3ZpZGVyKHByb2plY3QpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCX0KLQotCi0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIpIHsKLQkJCXJldHVybiAhKChHcm91cEFwcENsaWVudFByb3ZpZGVyKSBlbGVtZW50KS5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLQkJfSBlbHNlIAotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1vZHVsZXNOb2RlKXsKLQkJCXJldHVybiAoKE1vZHVsZXNOb2RlKSBvYmplY3QpLmdldEVhclByb2plY3QoKTsgCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCi0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdEdyb3VwUHJvdmlkZXIgZ2V0TmV3Q29udGVudFByb3ZpZGVySW5zdGFuY2UoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIoKEFwcGxpY2F0aW9uQ2xpZW50KSBnZXRDYWNoZWRNb2RlbFByb3ZpZGVyKHByb2plY3QpLmdldE1vZGVsT2JqZWN0KCksIHByb2plY3QpOwotCX0KLQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9BcHBDbGllbnQ1TGFiZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9BcHBDbGllbnQ1TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmY5MzA4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQXBwQ2xpZW50NUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmFwcGNsaWVudC5Hcm91cEFwcENsaWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBBcHBsaWNhdGlvbiBDbGVudCA1LjAgTGFiZWwgcHJvdmlkZXIgaXMgRGVwbG95bWVudCBEZXNjcmlwdG9yIGxhYmVsIHByb3ZpZGVyLCAKLSAqIHVzZWQgZm9yIGRlY29yYXRpbmcgb2YgdGhlIGRlc2NyaXB0b3IgdHJlZSBpbiBwcm9qZWN0IGV4cGxvcmVyLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIEFwcENsaWVudDVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgSjJFRUxhYmVsUHJvdmlkZXIgewotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlJbWFnZSByZXQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIpIHsKLQkJCXJldCA9ICgoR3JvdXBBcHBDbGllbnRQcm92aWRlcillbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9IAotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlTdHJpbmcgcmV0ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBHcm91cEFwcENsaWVudFByb3ZpZGVyKSB7Ci0JCQlyZXQgPSAgKChHcm91cEFwcENsaWVudFByb3ZpZGVyKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvRWFyNUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9FYXI1Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNWJjMjMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9FYXI1Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkFic3RyYWN0RWFyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogQXBwbGljYXRpb24gQ2xpZW50IDUuMCBDb250ZW50IHByb3ZpZGVyIGlzIERlcGxveW1lbnQgRGVzY3JpcHRvciBjb250ZW50IHByb3ZpZGVyLCAKLSAqIHVzZWQgZm9yIGNvbnN0cnVjdGluZyBvZiB0aGUgZGVzY3JpcHRvciB0cmVlIGluIHByb2plY3QgZXhwbG9yZXIuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi1wdWJsaWMgY2xhc3MgRWFyNUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEpFRTVDb250ZW50UHJvdmlkZXIgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRUFSX0RFRkFVTFRfTElCID0gIi9saWIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIExpc3QgZ2V0Q29tcG9uZW50UmVmZXJlbmNlc0FzTGlzdChMaXN0IGNvbXBvbmVudFR5cGVzLCBJVmlydHVhbENvbXBvbmVudCB2aXJ0dWFsQ29tcG9uZW50LCBJUGF0aCBydW50aW1lUGF0aCkgewotCQlMaXN0IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGVhckNvbXBvbmVudCA9IHZpcnR1YWxDb21wb25lbnQ7Ci0JCWlmIChlYXJDb21wb25lbnQgIT0gbnVsbCApIHsKLQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmQ29tcG9uZW50cyA9IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZkNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJVmlydHVhbENvbXBvbmVudCBtb2R1bGUgPSByZWZDb21wb25lbnRzW2ldLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQlpZiAobW9kdWxlID09IG51bGwpIGNvbnRpbnVlOwotCQkJCS8vIGlmIGNvbXBvbmVudCB0eXBlcyBwYXNzZWQgaW4gaXMgbnVsbCB0aGVuIHJldHVybiBhbGwgY29tcG9uZW50cwotCQkJCWlmIChjb21wb25lbnRUeXBlcyA9PSBudWxsIHx8IGNvbXBvbmVudFR5cGVzLnNpemUoKSA9PSAwKSB7Ci0JCQkJCWNvbXBvbmVudHMuYWRkKHJlZkNvbXBvbmVudHNbaV0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChjb21wb25lbnRUeXBlcy5jb250YWlucyhKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVDb21wb25lbnRUeXBlKG1vZHVsZSkpKSB7Ci0JCQkJCQljb21wb25lbnRzLmFkZChyZWZDb21wb25lbnRzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tcG9uZW50czsKLQl9Ci0KLQlwdWJsaWMgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsgIAotCQlMaXN0IGV4cGxpY2l0VXRpbGl0eVJlZmVyZW5jZXMgPSAKLQkJCWdldENvbXBvbmVudFJlZmVyZW5jZXNBc0xpc3QoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChKMkVFUHJvamVjdFV0aWxpdGllcy5VVElMSVRZKSwgY29tcG9uZW50LCBudWxsKTsKLQotCQkvLyBmZXRjaCBvdGhlciBVdGlsaXR5IEphcnMgYXR0YWNoZWQgdG8gdGhlIEVBUiBwcm9qZWN0IAotCQlMaXN0IGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZVR5cGVzID0KLQkJCUFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIAotCQkJCQlJTW9kdWxlQ29uc3RhbnRzLkpTVF9BUFBDTElFTlRfTU9EVUxFLAotCQkJCQlJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFLAkgCi0JCQkJCUlNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUgCi0JCQl9KTsKLQotCQlMaXN0IGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZXMgPSAKLQkJCWdldENvbXBvbmVudFJlZmVyZW5jZXNBc0xpc3QoaW1wbGljaXRVdGlsaXR5UmVmZXJlbmNlVHlwZXMsIGNvbXBvbmVudCwgbnVsbCk7Ci0KLQkJTGlzdCBhbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMuYWRkQWxsKGV4cGxpY2l0VXRpbGl0eVJlZmVyZW5jZXMpOwotCQlhbGxVdGlsaXR5TW9kdWxlUmVmZXJlbmNlcy5hZGRBbGwoaW1wbGljaXRVdGlsaXR5UmVmZXJlbmNlcyk7Ci0KLQkJaWYoYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiAoSVZpcnR1YWxSZWZlcmVuY2VbXSkgYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMudG9BcnJheShuZXcgSVZpcnR1YWxSZWZlcmVuY2VbYWxsVXRpbGl0eU1vZHVsZVJlZmVyZW5jZXMuc2l6ZSgpXSk7Ci0JCXJldHVybiBuZXcgSVZpcnR1YWxSZWZlcmVuY2VbMF07Ci0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGFQYXJlbnRFbGVtZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBHcm91cEVBUlByb3ZpZGVyKSB7Ci0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSAoKEdyb3VwRUFSUHJvdmlkZXIpYVBhcmVudEVsZW1lbnQpLmdldFByb2plY3QoKTsKLQotCQkJSVZpcnR1YWxDb21wb25lbnQgcHJvamVjdENvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJdHJ5IHsKLQkJCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwgJiYgCi0JCQkJCQlmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoCi0JCQkJCQkJCVByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFKS5nZXRWZXJzaW9uKAotCQkJCQkJCQkJCUoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQpKSkgewotCi0JCQkJCUxpc3QgbGlicyA9IGdldENvbXBvbmVudFJlZmVyZW5jZXNBc0xpc3QoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChKMkVFUHJvamVjdFV0aWxpdGllcy5VVElMSVRZKSwgcHJvamVjdENvbXBvbmVudCwKLQkJCQkJCQluZXcgUGF0aCgiLyIgKyBFQVJfREVGQVVMVF9MSUIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQkJQXJyYXlMaXN0IGJ1bmRsZWRMaWJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCUFycmF5TGlzdCBhcHBMaWJzSW5UaGVSb290ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChJVmlydHVhbFJlZmVyZW5jZSkgbGlicy5nZXQoaSk7Ci0JCQkJCQkJCUlQYXRoIHJ1bnRpbWVQYXRoID0gcmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCk7Ci0KLQkJCQkJCQkJaWYgKHJ1bnRpbWVQYXRoICE9IG51bGwgJiYgcnVudGltZVBhdGguc2VnbWVudCgwKSAhPSBudWxsICYmIAotLy8JCQkJCQkJCQkJcnVudGltZVBhdGguZXF1YWxzKG5ldyBQYXRoKEVBUl9ERUZBVUxUX0xJQikpKSB7Ci0JCQkJCQkJCQkhcnVudGltZVBhdGguaXNSb290KCkpIHsKLQkJCQkJCQkJCWJ1bmRsZWRMaWJzLmFkZChsaWJzLmdldChpKSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlhcHBMaWJzSW5UaGVSb290LmFkZChsaWJzLmdldChpKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJU3RyaW5nIGxpYkRpciA9IEVBUl9ERUZBVUxUX0xJQjsKLQkJCQkJCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKRUVQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCQkJCVN0cmluZyBvbGRMaWJEaXIgPSAoKEFwcGxpY2F0aW9uKU1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCkuZ2V0TW9kZWxPYmplY3QoKSkuZ2V0TGlicmFyeURpcmVjdG9yeSgpOwotCQkJCQkJCQlpZiAob2xkTGliRGlyID09IG51bGwpIG9sZExpYkRpciA9IEVBUl9ERUZBVUxUX0xJQjsKLQkJCQkJCQkJbGliRGlyID0gb2xkTGliRGlyOwotCQkJCQkJCX0KLS8vCi0vLwkJCQkJCQlMaXN0IGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZVR5cGVzID0KLS8vCQkJCQkJCQlBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICAKLS8vCQkJCQkJCQkJCUlNb2R1bGVDb25zdGFudHMuSlNUX0FQUENMSUVOVF9NT0RVTEUsCi0vLwkJCQkJCQkJCQlJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFLAotLy8JCQkJCQkJCQkJSU1vZHVsZUNvbnN0YW50cy5KU1RfRUpCX01PRFVMRSwKLS8vCQkJCQkJCQkJCUlNb2R1bGVDb25zdGFudHMuSlNUX0NPTk5FQ1RPUl9NT0RVTEV9KTsKLS8vCi0KLS8vCQkJCQkJCUxpc3QgbW9kdWxlcyA9IGdldENvbXBvbmVudFJlZmVyZW5jZXNBc0xpc3QoaW1wbGljaXRVdGlsaXR5UmVmZXJlbmNlVHlwZXMsIHByb2plY3RDb21wb25lbnQsIG5ldyBQYXRoKCIvIikpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCQlNb2R1bGVzTm9kZSBtb2R1bGVzTm9kZSA9IG5ldyBNb2R1bGVzTm9kZShwcm9qZWN0KTsKLQotLy8JCQkJCQkJY2hpbGRyZW4uYWRkKG1vZHVsZXNOb2RlKTsKLS8vCQkJCQkJCWNoaWxkcmVuLmFkZChidW5kbGVkTGlic05vZGUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtc2cgPSAiRXJyb3IgaW4gdGhlIEpFRUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbigpIGZvciBwYXJlbnQ6IiArICBhUGFyZW50RWxlbWVudDsgLy8kTk9OLU5MUy0xJAotCQkJCUpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5sb2dFcnJvcihtc2csIGUpOwotCQkJfQotCQl9IGVsc2UgaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RFYXJOb2RlKSB7Ci0JCQlyZXR1cm4gKChBYnN0cmFjdEVhck5vZGUpIGFQYXJlbnRFbGVtZW50KS5nZXRNb2R1bGVzKCkudG9BcnJheSgpOwotCQl9IGVsc2UgaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBhUGFyZW50RWxlbWVudCkuZ2V0QWRhcHRlcihJUFJPSkVDVF9DTEFTUyk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChwcm9qZWN0KSkgewotCQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdDsKLQkJCQl0cnkgewotCQkJCQlmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQkJaWYgKGZhY2V0ZWRQcm9qZWN0ICE9IG51bGwgJiYgCi0JCQkJCQkJZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KAotCQkJCQkJCQkJUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuSlNUX0VBUl9NT0RVTEUpLmdldFZlcnNpb24oCi0JCQkJCQkJCQkJCUoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fNV8wX1RFWFQpKSkgewotCQkJCQkJR3JvdXBFQVJQcm92aWRlciBlbGVtZW50ID0gKEdyb3VwRUFSUHJvdmlkZXIpIGdldENhY2hlZENvbnRlbnRQcm92aWRlcihwcm9qZWN0KTsKLQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlTdHJpbmcgbXNnID0gIkVycm9yIGluIHRoZSBKRUVDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKSBmb3IgcGFyZW50OiIgKyAgYVBhcmVudEVsZW1lbnQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZ0Vycm9yKG1zZywgZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEVhck5vZGUpIHsKLQkJCXJldHVybiAoKEFic3RyYWN0RWFyTm9kZSkgZWxlbWVudCkuZ2V0TW9kdWxlcygpLnNpemUoKSA+IDA7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdyb3VwRUFSUHJvdmlkZXIpewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSByZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWJzdHJhY3RFYXJOb2RlKXsKLQkJCXJldHVybiAoKEFic3RyYWN0RWFyTm9kZSkgb2JqZWN0KS5nZXRFYXJQcm9qZWN0KCk7IAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdEdyb3VwUHJvdmlkZXIgZ2V0TmV3Q29udGVudFByb3ZpZGVySW5zdGFuY2UoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEdyb3VwRUFSUHJvdmlkZXIoKEFwcGxpY2F0aW9uKSBnZXRDYWNoZWRNb2RlbFByb3ZpZGVyKHByb2plY3QpLmdldE1vZGVsT2JqZWN0KCksIChFQVJWaXJ0dWFsQ29tcG9uZW50KUNvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpKTsKLQl9Ci0KLQlwdWJsaWMgRWFyTGliVmlzaXRvciBnZXRWaXNpdG9yKCkgewotCQlyZXR1cm4gbmV3IEVhckxpYlZpc2l0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRWFyTGliVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0KLQkJcHJpdmF0ZSBTZXQ8SVByb2plY3Q+IHByb2plY3RzID0gbmV3IEhhc2hTZXQ8SVByb2plY3Q+KCk7Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCUlSZXNvdXJjZURlbHRhW10gYWZmZWN0ZWRDaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oSVJlc291cmNlRGVsdGEuQURERUQgfCBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIHwgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpOwotCQkJaWYgKGFmZmVjdGVkQ2hpbGRyZW4gIT0gbnVsbCl7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZmZlY3RlZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChhZmZlY3RlZENoaWxkcmVuW2ldLmdldFJlc291cmNlKCkgIT0gbnVsbCAmJiBhZmZlY3RlZENoaWxkcmVuW2ldLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpICE9IG51bGwKLQkJCQkJCQkmJiBhZmZlY3RlZENoaWxkcmVuW2ldLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXIiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXByb2plY3RzLmFkZChhZmZlY3RlZENoaWxkcmVuW2ldLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFNldDxJUHJvamVjdD4gZ2V0Q2hhbmdlZFByb2plY3QoKSB7Ci0JCQlyZXR1cm4gcHJvamVjdHM7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlzdXBlci5yZXNvdXJjZUNoYW5nZWQoZXZlbnQpOwotCQlpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKXsKLQkJCUVhckxpYlZpc2l0b3IgdmlzaXRvciA9IGdldFZpc2l0b3IoKTsKLQkJCWlmICh2aXNpdG9yID09IG51bGwpewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJZXZlbnQuZ2V0RGVsdGEoKS5hY2NlcHQodmlzaXRvcik7Ci0JCQkJU2V0PElQcm9qZWN0PiBjaGFuZ2VkUHJvamVjdCA9IHZpc2l0b3IuZ2V0Q2hhbmdlZFByb2plY3QoKTsKLQkJCQlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBjaGFuZ2VkUHJvamVjdCkgewotCQkJCQlwcm9qZWN0Q2hhbmdlZChwcm9qZWN0KTsKLQkJCQl9Ci0JCQkJCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlKRUVVSVBsdWdpbi5sb2dFcnJvcigiQ291bGQgbm90IHJlZnJlc2ggY2hhbmdlZCBwcm9qZWN0LiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9IAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0VhcjVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0VhcjVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOGM5NDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9FYXI1TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5KMkVFTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwucGx1Z2luLkoyRUVOYXZpZ2F0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5KYXZhRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmRuZC5JTW9kdWxlRXh0ZW5zaW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuQWJzdHJhY3RFYXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotLyoqCi0gKiBFQVIgNS4wIExhYmVsIHByb3ZpZGVyIGlzIERlcGxveW1lbnQgRGVzY3JpcHRvciBsYWJlbCBwcm92aWRlciwgCi0gKiB1c2VkIGZvciBkZWNvcmF0aW5nIG9mIHRoZSBkZXNjcmlwdG9yIHRyZWUgaW4gcHJvamVjdCBleHBsb3Jlci4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBjbGFzcyBFYXI1TGFiZWxQcm92aWRlciBleHRlbmRzIEoyRUVMYWJlbFByb3ZpZGVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgSU1HX01PRFVMRVNfTk9ERTsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgSU1HX01PRFVMRV9VVElMOwotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBJTUdfTU9EVUxFX1dFQjsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgSU1HX01PRFVMRV9FSkI7Ci0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIElNR19NT0RVTEVfQ0xJRU5UOwotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBJTUdfTU9EVUxFX0NPTk5FQ1RPUjsKLQotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlJTUdfTU9EVUxFU19OT0RFID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmb2xkZXIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCUlNR19NT0RVTEVfVVRJTCA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoInV0aWxqYXJfb2JqIikpOyAvLyROT04tTkxTLTEkCi0JCQlJTUdfTU9EVUxFX1dFQiA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvbW9kdWxlX3dlYl9vYmoiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUlNR19NT0RVTEVfRUpCID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9tb2R1bGVfZWpiX29iaiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJSU1HX01PRFVMRV9DTElFTlQgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCgoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJtb2R1bGVfY2xpZW50YXBwX29iaiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJSU1HX01PRFVMRV9DT05ORUNUT1IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCgoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmdWxsL29iajE2L2Nvbm5lY3Rvcl9tb2R1bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZ0Vycm9yKG1zZywgZSk7Ci0JCQlJTUdfTU9EVUxFU19OT0RFID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCUlNR19NT0RVTEVfVVRJTCA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQlJTUdfTU9EVUxFX1dFQiA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQlJTUdfTU9EVUxFX0VKQiA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQlJTUdfTU9EVUxFX0NMSUVOVCA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQlJTUdfTU9EVUxFX0NPTk5FQ1RPUiA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgcmV0ID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0RWFyTm9kZSkgewotCQkJcmV0ID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoSU1HX01PRFVMRVNfTk9ERSk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElWaXJ0dWFsUmVmZXJlbmNlKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSAoKElWaXJ0dWFsUmVmZXJlbmNlKSBlbGVtZW50KS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQlpZiAoY29tcG9uZW50LmlzQmluYXJ5KCkpIHsgCi0JCQkJcmV0ID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoSU1HX01PRFVMRV9VVElMKTsKLQkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJDb21wb25lbnQoY29tcG9uZW50KSkgewotCQkJCXJldCA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKElNR19NT0RVTEVfV0VCKTsKLQkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0VKQkNvbXBvbmVudChjb21wb25lbnQpKSB7Ci0JCQkJcmV0ID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoSU1HX01PRFVMRV9FSkIpOwotCQkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRDb21wb25lbnQoY29tcG9uZW50KSkgewotCQkJCXJldCA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKElNR19NT0RVTEVfQ0xJRU5UKTsKLQkJCX0gZWxzZSBpZiAoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5pc0pDQUNvbXBvbmVudChjb21wb25lbnQpKSB7Ci0JCQkJcmV0ID0gSjJFRU5hdmlnYXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoSU1HX01PRFVMRV9DT05ORUNUT1IpOwotCQkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzVXRpbGl0eVByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLQkJCQlyZXQgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZShJTUdfTU9EVUxFX1VUSUwpOwotCQkJfSBlbHNlIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgewotCQkJCXJldCA9IEoyRUVOYXZpZ2F0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKElNR19NT0RVTEVfVVRJTCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdyb3VwRUFSUHJvdmlkZXIpewotCQkJcmV0ID0gKChHcm91cEVBUlByb3ZpZGVyKSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCVN0cmluZyByZXQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0RWFyTm9kZSkgewotCQkJcmV0ID0gICgoQWJzdHJhY3RFYXJOb2RlKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElWaXJ0dWFsUmVmZXJlbmNlKSB7Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSAoKElWaXJ0dWFsUmVmZXJlbmNlKSBlbGVtZW50KS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0KLQkJCWlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYkNvbXBvbmVudChjb21wb25lbnQpKSB7Ci0JCQkJaWYgKCFjb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJCQlyZXQgPSAiV2ViICIgKyBjb21wb25lbnQuZ2V0TmFtZSgpICsgSU1vZHVsZUV4dGVuc2lvbnMuRE9UX1dBUjsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGNvbXBvbmVudC5nZXREZXBsb3llZE5hbWUoKSk7Ci0JCQkJCXJldHVybiBwYXRoLmxhc3RTZWdtZW50KCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUpCQ29tcG9uZW50KGNvbXBvbmVudCkpIHsKLQkJCQlpZiAoIWNvbXBvbmVudC5pc0JpbmFyeSgpKSB7Ci0JCQkJCXJldCA9ICJFSkIgIiArIGNvbXBvbmVudC5nZXROYW1lKCkgKyBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfSkFSOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoY29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpKTsKLQkJCQkJcmV0dXJuIHBhdGgubGFzdFNlZ21lbnQoKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudENvbXBvbmVudChjb21wb25lbnQpKXsKLQkJCQlpZiAoIWNvbXBvbmVudC5pc0JpbmFyeSgpKSB7Ci0JCQkJCXJldCA9ICJBUFAgQ2xpZW50ICIgKyBjb21wb25lbnQuZ2V0TmFtZSgpICsgSU1vZHVsZUV4dGVuc2lvbnMuRE9UX0pBUjsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGNvbXBvbmVudC5nZXREZXBsb3llZE5hbWUoKSk7Ci0JCQkJCXJldHVybiBwYXRoLmxhc3RTZWdtZW50KCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotCQkJCXJldCA9ICJDb25uZWN0b3IgIiArIGNvbXBvbmVudC5nZXROYW1lKCkgKyBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfSkFSOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNVdGlsaXR5UHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotCQkJCXJldCA9IGNvbXBvbmVudC5nZXROYW1lKCkgKyBJTW9kdWxlRXh0ZW5zaW9ucy5ET1RfSkFSOwotCQkJfSBlbHNlIGlmIChjb21wb25lbnQuaXNCaW5hcnkoKSkgewotCQkJCVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50IHZpcnR1YWxBcmNoaXZlQ29tcG9uZW50ID0gKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KWNvbXBvbmVudDsKLQkJCQlTdHJpbmcgZGVwbG95ZWROYW1lID0gdmlydHVhbEFyY2hpdmVDb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCk7Ci0JCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZGVwbG95ZWROYW1lKTsKLQkJCQlyZXR1cm4gcGF0aC5sYXN0U2VnbWVudCgpOwotCQkJfQotCQl9ICBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgR3JvdXBFQVJQcm92aWRlcil7Ci0JCQlyZXQgPSAoKEdyb3VwRUFSUHJvdmlkZXIpIGVsZW1lbnQpLmdldFRleHQoKTsgCi0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvRWpiM0NvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9FamIzQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTgyMzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9FamIzQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkpuZGlSZWZOb2RlLktJTkRTOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbkludGVyZmFjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBFamIgMy4wIENvbnRlbnQgcHJvdmlkZXIgaXMgRGVwbG95bWVudCBEZXNjcmlwdG9yIGNvbnRlbnQgcHJvdmlkZXIsIAotICogdXNlZCBmb3IgY29uc3RydWN0aW5nIG9mIHRoZSBkZXNjcmlwdG9yIHRyZWUgaW4gcHJvamVjdCBleHBsb3Jlci4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBjbGFzcyBFamIzQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgSkVFNUNvbnRlbnRQcm92aWRlciB7Ci0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgYVBhcmVudEVsZW1lbnQpIHsKLQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCi0JCWlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0R3JvdXBQcm92aWRlcikgewotCQkJTGlzdCBsc3QgPSAoKEFic3RyYWN0R3JvdXBQcm92aWRlcikgYVBhcmVudEVsZW1lbnQpLmdldENoaWxkcmVuKCk7Ci0JCQljaGlsZHJlbi5hZGRBbGwobHN0KTsKLQkJfSBlbHNlIGlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0REROb2RlKSB7Ci0JCQlMaXN0IGxzdCA9ICgoQWJzdHJhY3RERE5vZGUpIGFQYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbigpOwotCQkJY2hpbGRyZW4uYWRkQWxsKGxzdCk7Ci0JCX0gZWxzZSBpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikgewotCQkJU2Vzc2lvbkJlYW4gc2IgPSAoKFNlc3Npb25CZWFuKWFQYXJlbnRFbGVtZW50KTsKLQkJCWFkZFNlc3Npb25CZWFuU3ViTm9kZXMoc2IsIGNoaWxkcmVuKTsKLQotCQl9IGVsc2UgaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRW50aXR5QmVhbikgewotCQkJRW50aXR5QmVhbiBlYiA9ICgoRW50aXR5QmVhbilhUGFyZW50RWxlbWVudCk7Ci0KLQkJCWFkZEVudGl0eUJlYW5TdWJOb2RlcyhlYiwgY2hpbGRyZW4pOwotCi0JCX0gZWxzZSBpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuQmVhbikgewotCQkJT2JqZWN0IG1zZ0JlYW4gPSBuZXcgQmVhbk5vZGUoKE1lc3NhZ2VEcml2ZW5CZWFuKSBhUGFyZW50RWxlbWVudCk7Ci0JCQlhZGRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygoTWVzc2FnZURyaXZlbkJlYW4pIGFQYXJlbnRFbGVtZW50LCBjaGlsZHJlbik7Ci0JCQljaGlsZHJlbi5hZGQobXNnQmVhbik7Ci0JCX0gZWxzZSAKLQkJCWlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCQlwcm9qZWN0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIGFQYXJlbnRFbGVtZW50KQotCQkJCS5nZXRBZGFwdGVyKElQUk9KRUNUX0NMQVNTKTsKLQkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCWlmIChpc0VqYk1vZHVsZVByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJCUdyb3VwRUpCUHJvdmlkZXIgcm9vdCA9IChHcm91cEVKQlByb3ZpZGVyKSBnZXRDYWNoZWRDb250ZW50UHJvdmlkZXIocHJvamVjdCk7Ci0JCQkJCQljaGlsZHJlbi5hZGQocm9vdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKE1lc3NhZ2VEcml2ZW5CZWFuIHBhcmVudEVsZW1lbnQsCi0JCQlMaXN0PE9iamVjdD4gY2hpbGRyZW4pIHsKLQkJaWYgKHBhcmVudEVsZW1lbnQuZ2V0QWN0aXZhdGlvbkNvbmZpZygpICE9IG51bGwgJiYgcGFyZW50RWxlbWVudC5nZXRBY3RpdmF0aW9uQ29uZmlnKCkuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMoKSAhPSBudWxsICYmICFwYXJlbnRFbGVtZW50LmdldEFjdGl2YXRpb25Db25maWcoKS5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcygpLmlzRW1wdHkoKSl7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKHBhcmVudEVsZW1lbnQuZ2V0QWN0aXZhdGlvbkNvbmZpZygpLmdldEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzKCkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFbnRpdHlCZWFuU3ViTm9kZXMoRW50aXR5QmVhbiBlYiwgTGlzdDxPYmplY3Q+IGNoaWxkcmVuKSB7Ci0JCWlmIChlYi5nZXRMb2NhbCgpICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmFkZChuZXcgQmVhbkludGVyZmFjZU5vZGUoZWIsIChTdHJpbmcpZWIuZ2V0TG9jYWwoKSwgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuTE9DQUwpKTsKLQkJfQotCQlpZiAoZWIuZ2V0TG9jYWxIb21lKCkgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uYWRkKG5ldyBCZWFuSW50ZXJmYWNlTm9kZShlYiwgKFN0cmluZyllYi5nZXRMb2NhbEhvbWUoKSwgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuTE9DQUxfSE9NRSkpOwotCQl9Ci0KLQkJaWYgKGViLmdldFJlbW90ZSgpICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmFkZChuZXcgQmVhbkludGVyZmFjZU5vZGUoZWIsIChTdHJpbmcpZWIuZ2V0UmVtb3RlKCksIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLlJFTU9URSkpOwotCQl9Ci0JCWlmIChlYi5nZXRIb21lKCkgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uYWRkKG5ldyBCZWFuSW50ZXJmYWNlTm9kZShlYiwgKFN0cmluZyllYi5nZXRIb21lKCksIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLlJFTU9URV9IT01FKSk7Ci0JCX0KLQotCi0JCWNoaWxkcmVuLmFkZChuZXcgQmVhbk5vZGUoKEVudGl0eUJlYW4pIGViKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkU2Vzc2lvbkJlYW5TdWJOb2RlcyhTZXNzaW9uQmVhbiBzYiwgTGlzdCBjaGlsZHJlbikgewotCQlhZGRDbGFzc1JlbGF0ZWRJbmZvKHNiLCBjaGlsZHJlbik7Ci0JCWFkZFNlc3Npb25KTkRJUmVmSW5mbyhzYiwgY2hpbGRyZW4pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRTZXNzaW9uSk5ESVJlZkluZm8oU2Vzc2lvbkJlYW4gc2IsIExpc3QgY2hpbGRyZW4pIHsKLQkJaWYgKHNiLmdldEVqYkxvY2FsUmVmcygpICE9IG51bGwgJiYgIXNiLmdldEVqYkxvY2FsUmVmcygpLmlzRW1wdHkoKSl7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEpuZGlSZWZOb2RlKHNiLmdldEVqYkxvY2FsUmVmcygpLCBLSU5EUy5FSkJMT0NBTFJFRikpOwotCQl9Ci0KLQkJaWYgKHNiLmdldEVqYlJlZnMoKSAhPSBudWxsICYmICFzYi5nZXRFamJSZWZzKCkuaXNFbXB0eSgpKXsKLQkJCWNoaWxkcmVuLmFkZChuZXcgSm5kaVJlZk5vZGUoc2IuZ2V0RWpiUmVmcygpLCBLSU5EUy5FSkJSRUYpKTsKLQkJfQotCi0JCWlmIChzYi5nZXRSZXNvdXJjZUVudlJlZnMoKSAhPSBudWxsICYmICFzYi5nZXRSZXNvdXJjZUVudlJlZnMoKS5pc0VtcHR5KCkpewotCQkJY2hpbGRyZW4uYWRkKG5ldyBKbmRpUmVmTm9kZShzYi5nZXRSZXNvdXJjZUVudlJlZnMoKSwgS0lORFMuUkVTRU5WRU5UWSkpOwotCQl9Ci0JCWlmIChzYi5nZXRFbnZFbnRyaWVzKCkgIT0gbnVsbCAmJiAhc2IuZ2V0RW52RW50cmllcygpLmlzRW1wdHkoKSl7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEpuZGlSZWZOb2RlKHNiLmdldEVudkVudHJpZXMoKSwgS0lORFMuRU5WRU5UUlkpKTsKLQkJfQotCi0JCWlmIChzYi5nZXRSZXNvdXJjZVJlZnMoKSAhPSBudWxsICYmICFzYi5nZXRSZXNvdXJjZVJlZnMoKS5pc0VtcHR5KCkpewotCQkJY2hpbGRyZW4uYWRkKG5ldyBKbmRpUmVmTm9kZShzYi5nZXRSZXNvdXJjZVJlZnMoKSwgS0lORFMuUkVTUkVGKSk7Ci0JCX0KLQotCQlpZiAoc2IuZ2V0U2VydmljZVJlZnMoKSAhPSBudWxsICYmICFzYi5nZXRTZXJ2aWNlUmVmcygpLmlzRW1wdHkoKSl7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEpuZGlSZWZOb2RlKHNiLmdldFNlcnZpY2VSZWZzKCksIEtJTkRTLlNFUlZJQ0VSRUYpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRTZXNzaW9uSk5ESVJlZkluZm8oRW50aXR5QmVhbiBlYiwgTGlzdCBjaGlsZHJlbikgewotCQlpZiAoZWIuZ2V0RWpiTG9jYWxSZWZzKCkgIT0gbnVsbCAmJiAhZWIuZ2V0RWpiTG9jYWxSZWZzKCkuaXNFbXB0eSgpKXsKLQkJCWNoaWxkcmVuLmFkZChuZXcgSm5kaVJlZk5vZGUoZWIuZ2V0RWpiTG9jYWxSZWZzKCksIEtJTkRTLkVKQkxPQ0FMUkVGKSk7Ci0JCX0KLQotCQlpZiAoZWIuZ2V0RWpiUmVmcygpICE9IG51bGwgJiYgIWViLmdldEVqYlJlZnMoKS5pc0VtcHR5KCkpewotCQkJY2hpbGRyZW4uYWRkKG5ldyBKbmRpUmVmTm9kZShlYi5nZXRFamJSZWZzKCksIEtJTkRTLkVKQlJFRikpOwotCQl9Ci0KLQkJaWYgKGViLmdldFJlc291cmNlRW52UmVmcygpICE9IG51bGwgJiYgIWViLmdldFJlc291cmNlRW52UmVmcygpLmlzRW1wdHkoKSl7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEpuZGlSZWZOb2RlKGViLmdldFJlc291cmNlRW52UmVmcygpLCBLSU5EUy5SRVNFTlZFTlRZKSk7Ci0JCX0KLQkJaWYgKGViLmdldEVudkVudHJpZXMoKSAhPSBudWxsICYmICFlYi5nZXRFbnZFbnRyaWVzKCkuaXNFbXB0eSgpKXsKLQkJCWNoaWxkcmVuLmFkZChuZXcgSm5kaVJlZk5vZGUoZWIuZ2V0RW52RW50cmllcygpLCBLSU5EUy5FTlZFTlRSWSkpOwotCQl9Ci0KLQkJaWYgKGViLmdldFJlc291cmNlUmVmcygpICE9IG51bGwgJiYgIWViLmdldFJlc291cmNlUmVmcygpLmlzRW1wdHkoKSl7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEpuZGlSZWZOb2RlKGViLmdldFJlc291cmNlUmVmcygpLCBLSU5EUy5SRVNSRUYpKTsKLQkJfQotCi0JCWlmIChlYi5nZXRTZXJ2aWNlUmVmcygpICE9IG51bGwgJiYgIWViLmdldFNlcnZpY2VSZWZzKCkuaXNFbXB0eSgpKXsKLQkJCWNoaWxkcmVuLmFkZChuZXcgSm5kaVJlZk5vZGUoZWIuZ2V0U2VydmljZVJlZnMoKSwgS0lORFMuU0VSVklDRVJFRikpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENsYXNzUmVsYXRlZEluZm8oU2Vzc2lvbkJlYW4gc2IsIExpc3QgY2hpbGRyZW4pIHsKLQkJaWYgKHNiLmdldExvY2FsKCkgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uYWRkKG5ldyBCZWFuSW50ZXJmYWNlTm9kZShzYiwgKFN0cmluZylzYi5nZXRMb2NhbCgpLCBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5MT0NBTCkpOwotCQl9Ci0JCQotCQlpZiAoc2IuZ2V0TG9jYWxIb21lKCkgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uYWRkKG5ldyBCZWFuSW50ZXJmYWNlTm9kZShzYiwgKFN0cmluZylzYi5nZXRMb2NhbEhvbWUoKSwgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuTE9DQUxfSE9NRSkpOwotCQl9Ci0KLQkJaWYgKHNiLmdldFJlbW90ZSgpICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmFkZChuZXcgQmVhbkludGVyZmFjZU5vZGUoc2IsIChTdHJpbmcpc2IuZ2V0UmVtb3RlKCksIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLlJFTU9URSkpOwotCQl9Ci0JCQotCQlpZiAoc2IuZ2V0SG9tZSgpICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmFkZChuZXcgQmVhbkludGVyZmFjZU5vZGUoc2IsIChTdHJpbmcpc2IuZ2V0SG9tZSgpLCBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5SRU1PVEVfSE9NRSkpOwotCQl9Ci0KLQkJaWYgKHNiLmdldEVqYkNsYXNzKCkgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uYWRkKG5ldyBCZWFuTm9kZSgoU2Vzc2lvbkJlYW4pIHNiKSk7Ci0JCX0KLQkJCi0JCUxpc3QgciA9IHNiLmdldEJ1c2luZXNzTG9jYWxzKCk7Ci0JCWZvciAoT2JqZWN0IGxvY2FscyA6IHIpIHsKLQkJCWNoaWxkcmVuLmFkZChuZXcgQmVhbkludGVyZmFjZU5vZGUoc2IsIChTdHJpbmcpbG9jYWxzLCBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5CVVNTSU5FU1NfTE9DQUwpKTsKLQkJfQotCQkKLQkJciA9IHNiLmdldEJ1c2luZXNzUmVtb3RlcygpOwotCQlmb3IgKE9iamVjdCBsb2NhbHMgOiByKSB7Ci0JCQljaGlsZHJlbi5hZGQobmV3IEJlYW5JbnRlcmZhY2VOb2RlKHNiLCAoU3RyaW5nKWxvY2FscywgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuQlVTU0lORVNTX1JFTU9URSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRWpiTW9kdWxlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBpbnN0YWxsZWRWZXJzaW9uID0gZmFjZXRlZFByb2plY3QuZ2V0SW5zdGFsbGVkVmVyc2lvbihQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSUoyRUVGYWNldENvbnN0YW50cy5FSkIpLmdldFZlcnNpb24oSUoyRUVGYWNldENvbnN0YW50cy5FSkJfMzAuZ2V0VmVyc2lvblN0cmluZygpKS5nZXRQcm9qZWN0RmFjZXQoKSk7Ci0JCQlyZXR1cm4gaW5zdGFsbGVkVmVyc2lvbiAhPSBudWxsOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUpFRVVJUGx1Z2luLmxvZ0Vycm9yKCJDYW4gbm90IGFjY2VzIHByb2plY3QiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0R3JvdXBQcm92aWRlcikgewotCQkJcmV0dXJuICgoQWJzdHJhY3RHcm91cFByb3ZpZGVyKSBlbGVtZW50KS5oYXNDaGlsZHJlbigpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdERETm9kZSkgewotCQkJcmV0dXJuICgoQWJzdHJhY3RERE5vZGUpIGVsZW1lbnQpLmhhc0NoaWxkcmVuKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRW50aXR5QmVhbikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbkJlYW4pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RHcm91cFByb3ZpZGVyIGdldE5ld0NvbnRlbnRQcm92aWRlckluc3RhbmNlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSU1vZGVsUHJvdmlkZXIgY2FjaGVkTW9kZWxQcm92aWRlciA9IGdldENhY2hlZE1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0JCUdyb3VwRUpCUHJvdmlkZXIgcm9vdCA9IG5ldyBHcm91cEVKQlByb3ZpZGVyKChFSkJKYXIpIGNhY2hlZE1vZGVsUHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKSk7Ci0JCXJvb3Quc2V0UHJvamVjdE5hbWUocHJvamVjdC5nZXROYW1lKCkpOwotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0VqYjNMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0VqYjNMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYThhMzcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9FamIzTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRUFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSUoyRUVOYXZpZ2F0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5Mb2FkaW5nREROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FamJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzb3VyY2VFbnZSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkR5bmFtaWNBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBFamIgMy4wIExhYmVsIHByb3ZpZGVyIGlzIERlcGxveW1lbnQgRGVzY3JpcHRvciBsYWJlbCBwcm92aWRlciwgCi0gKiB1c2VkIGZvciBkZWNvcmF0aW5nIG9mIHRoZSBkZXNjcmlwdG9yIHRyZWUgaW4gcHJvamVjdCBleHBsb3Jlci4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBjbGFzcyBFamIzTGFiZWxQcm92aWRlciBleHRlbmRzIEoyRUVMYWJlbFByb3ZpZGVyIHsKLQotICBwcml2YXRlIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBkZWxlZ2F0ZUxhYmVsUHJvdmlkZXI7Ci0gIAotICBwdWJsaWMgRWpiM0xhYmVsUHJvdmlkZXIoKSB7Ci0gICAgZGVsZWdhdGVMYWJlbFByb3ZpZGVyID0gbmV3IEoyRUVBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIobmV3IER5bmFtaWNBZGFwdGVyRmFjdG9yeShJSjJFRU5hdmlnYXRvckNvbnN0YW50cy5WSUVXRVJfSUQpKTsKLSAgfQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlJbWFnZSByZXQgPSBudWxsOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTG9hZGluZ0RETm9kZSkKLSAgICAgICAgICByZXR1cm4gKChMb2FkaW5nREROb2RlKWVsZW1lbnQpLmdldEltYWdlKCk7Ci0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpCi0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICBpZihlbGVtZW50IGluc3RhbmNlb2YgR3JvdXBFSkJQcm92aWRlcikgewotICAgICAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKRUVVSVBsdWdpbkljb25zLklNR19FSkJFRU1PREVMKTsKLSAgICAgICAgcmV0dXJuIGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgICAgfQotICAgICAgaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0REROb2RlKXsKLSAgICAgICAgcmV0dXJuICgoQWJzdHJhY3RERE5vZGUpZWxlbWVudCApLmdldEltYWdlKCk7Ci0gICAgICAgIAotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlc3Npb25CZWFuKXsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoInNlc3Npb25CZWFuX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbkJlYW4pewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgibWVzc2FnZV9iZWFuX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRW50aXR5QmVhbil7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJjbXBFbnRpdHlfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0KLSAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRWpiTG9jYWxSZWYgfHwgZWxlbWVudCBpbnN0YW5jZW9mIEVqYlJlZil7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJlamJSZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVudkVudHJ5KXsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoInJlc291cmNlUmVmX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXNvdXJjZUVudlJlZil7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJyZXNvdXJjZVJlZl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVzb3VyY2VSZWYpewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgicmVzb3VyY2VSZWZfb2JqIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLSAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiYXR0cmlidXRlX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9IGVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSl7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJhY2Nlc3NfaW50ZW50X29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIAotICAgICAgICAKLSAgICAgIHJldHVybiByZXQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCVN0cmluZyByZXQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlc3Npb25CZWFuIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuQmVhbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgRW50aXR5QmVhbikgewotCQkJcmV0ID0gKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbikgPyAoKFNlc3Npb25CZWFuKSBlbGVtZW50KS5nZXRFamJOYW1lKCkgOiAKLQkJCSAgICAgICAgICAoZWxlbWVudCBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKSA/ICgoTWVzc2FnZURyaXZlbkJlYW4pIGVsZW1lbnQpLmdldEVqYk5hbWUoKSA6IAotCQkJICAgICAgICAgICAgKGVsZW1lbnQgaW5zdGFuY2VvZiBFbnRpdHlCZWFuKSA/ICgoRW50aXR5QmVhbikgZWxlbWVudCkuZ2V0RWpiTmFtZSgpIDogbnVsbDsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RERE5vZGUpIHsKLQkJCXJldCA9ICgoQWJzdHJhY3RERE5vZGUpIGVsZW1lbnQpLmdldFRleHQoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RHcm91cFByb3ZpZGVyKSB7Ci0JCQlyZXQgPSAoKEFic3RyYWN0R3JvdXBQcm92aWRlcikgZWxlbWVudCkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFamJMb2NhbFJlZiB8fCBlbGVtZW50IGluc3RhbmNlb2YgRWpiUmVmKXsKLQkJICByZXQgID0gZWxlbWVudCBpbnN0YW5jZW9mIEVqYkxvY2FsUmVmID8gKChFamJMb2NhbFJlZillbGVtZW50KS5nZXRFamJSZWZOYW1lKCkgOiBlbGVtZW50IGluc3RhbmNlb2YgRWpiUmVmID8gKChFamJSZWYpZWxlbWVudCkuZ2V0RWpiUmVmTmFtZSgpIDogbnVsbDsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRW52RW50cnkpewotCQkgIHJldCA9ICgoRW52RW50cnkpIGVsZW1lbnQpLmdldEVudkVudHJ5TmFtZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSZXNvdXJjZUVudlJlZil7Ci0JCSAgcmV0ID0gKChSZXNvdXJjZUVudlJlZikgZWxlbWVudCkuZ2V0UmVzb3VyY2VFbnZSZWZOYW1lKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJlc291cmNlUmVmKXsKLQkJICByZXQgPSAoKFJlc291cmNlUmVmKSBlbGVtZW50KS5nZXRSZXNSZWZOYW1lKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZpY2VSZWYpewotCQkgIHJldCA9ICgoU2VydmljZVJlZikgZWxlbWVudCkuZ2V0U2VydmljZVJlZk5hbWUoKTsKLQkJfWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSl7Ci0JCSAgcmV0ID0gKChBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkpZWxlbWVudCkuZ2V0QWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5TmFtZSgpICsgIjoiICsoKEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSllbGVtZW50KS5nZXRBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHlWYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0JICAgIH0KLQotCQlyZXR1cm4gcmV0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IGFuRWxlbWVudCkgewotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBzdXBlci5nZXREZXNjcmlwdGlvbihhbkVsZW1lbnQpOwotCi0JCWlmIChhbkVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdERETm9kZSkgewotCQkJU3RyaW5nIGRlc2MgPSAoKEFic3RyYWN0REROb2RlKSBhbkVsZW1lbnQpLmdldERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJZGVzY3JpcHRpb24gPSBkZXNjOwotCQkJfQotCQl9IAotCi0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSkVFNUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9KRUU1Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMGZhMDUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9KRUU1Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5FTUZSb290T2JqZWN0UHJvdmlkZXIuSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEpFRTVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciwgSVJlZnJlc2hIYW5kbGVyTGlzdGVuZXIsIElNb2RlbFByb3ZpZGVyTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBWaWV3ZXIgdmlld2VyOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3MgSVBST0pFQ1RfQ0xBU1MgPSBJUHJvamVjdC5jbGFzczsKLQotCXByb3RlY3RlZCBzdGF0aWMgTWFwPElQcm9qZWN0LCBJTW9kZWxQcm92aWRlcj4gZ3JvdXBQcm92aWRlcnNNYXAgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgSU1vZGVsUHJvdmlkZXI+KCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIE1hcDxJUHJvamVjdCwgQWJzdHJhY3RHcm91cFByb3ZpZGVyPiBncm91cENvbnRlbnRQcm92aWRlcnMgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgQWJzdHJhY3RHcm91cFByb3ZpZGVyPigpOwotCi0KLQlwdWJsaWMgSkVFNUNvbnRlbnRQcm92aWRlcigpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBhVmlld2VyLCBPYmplY3QgYW5PbGRJbnB1dCwgT2JqZWN0IGFOZXdJbnB1dCkgewotCQl2aWV3ZXIgPSBhVmlld2VyOwotCX0KLQotCi0JcHJvdGVjdGVkIElNb2RlbFByb3ZpZGVyIGdldENhY2hlZE1vZGVsUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IGdyb3VwUHJvdmlkZXJzTWFwLmdldChwcm9qZWN0KTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpewotCQkJcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotCQkJcHJvdmlkZXIuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCQlncm91cFByb3ZpZGVyc01hcC5wdXQocHJvamVjdCxwcm92aWRlcik7Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEdyb3VwUHJvdmlkZXIgZ2V0Q2FjaGVkQ29udGVudFByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJQWJzdHJhY3RHcm91cFByb3ZpZGVyIHByb3ZpZGVyID0gZ3JvdXBDb250ZW50UHJvdmlkZXJzLmdldChwcm9qZWN0KTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpewotCQkJcHJvdmlkZXIgPSBnZXROZXdDb250ZW50UHJvdmlkZXJJbnN0YW5jZShwcm9qZWN0KTsKLQkJCWdyb3VwQ29udGVudFByb3ZpZGVycy5wdXQocHJvamVjdCwgcHJvdmlkZXIpOwotCQl9IGVsc2UgewotCQkJT2JqZWN0IG1vZGVsT2JqZWN0ID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihwcm9qZWN0KS5nZXRNb2RlbE9iamVjdCgpOwotCQkJaWYgKHByb3ZpZGVyLmdldEphdmFFRU9iamVjdCgpICE9IG1vZGVsT2JqZWN0KXsKLQkJCQlpZiAobW9kZWxPYmplY3QgPT0gbnVsbCl7Ci0JCQkJCXByb3ZpZGVyLnNldFZhbGlkKGZhbHNlKTsKLQkJCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJCX0KLQotCQkJCXByb3ZpZGVyLnJlaW5pdCgoSmF2YUVFT2JqZWN0KW1vZGVsT2JqZWN0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0R3JvdXBQcm92aWRlciBnZXROZXdDb250ZW50UHJvdmlkZXJJbnN0YW5jZShJUHJvamVjdCBwcm9qZWN0KTsKLQotCi0JcHVibGljIHZvaWQgcHJvamVjdENoYW5nZWQoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJUnVubmFibGUgcmVmcmVzaFRocmVhZCA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQkJdHJ5ewotCQkJCQkJCWlmKCB2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSApewotCQkJCQkJCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0JCQkJCQkJCUlTZWxlY3Rpb24gc2VsID0gKChUcmVlVmlld2VyKSB2aWV3ZXIpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSAoKElUcmVlQ29udGVudFByb3ZpZGVyKSAoKFRyZWVWaWV3ZXIpIHZpZXdlcikKLQkJCQkJCQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCkpOwotCQkJCQkJCQljb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocHJvamVjdCk7Ci0JCQkJCQkJCQotCQkJCQkJCQlPYmplY3RbXSBleHBhbmRlZEVsZW1lbnRzID0gKChUcmVlVmlld2VyKSB2aWV3ZXIpLmdldEV4cGFuZGVkRWxlbWVudHMoKTsKLQkJCQkJCQkJCi0JCQkJCQkJCSgoU3RydWN0dXJlZFZpZXdlcikgdmlld2VyKS5yZWZyZXNoKHByb2plY3QpOwotCQkJCQkJCQkoKFRyZWVWaWV3ZXIpIHZpZXdlcikuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JCQkJCQkJCQotCQkJCQkJCQlBcnJheUxpc3Q8T2JqZWN0PiBuZXdFeHBhbmRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkJCQkJCQotCQkJCQkJCQlBcnJheUxpc3Q8T2JqZWN0PiBhbGxFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCQkJCQlnZXRWaWV3ZXJFbGVtZW50cyhhbGxFbGVtZW50cywgKChUcmVlVmlld2VyKSB2aWV3ZXIpLmdldENvbnRyb2woKSk7Ci0JCQkJCQkJCQotCQkJCQkJCQlPYmplY3RbXSBleHBhbmRlZEVsZW1lbnRzQWZ0ZXJSZWZyZXNoID0gKChUcmVlVmlld2VyKSB2aWV3ZXIpLmdldEV4cGFuZGVkRWxlbWVudHMoKTsKLQkJCQkJCQkJbmV3RXhwYW5kZWRFbGVtZW50cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChleHBhbmRlZEVsZW1lbnRzQWZ0ZXJSZWZyZXNoKSk7Ci0JCQkJCQkJCWZvcihpbnQgaT0wO2kgPCBleHBhbmRlZEVsZW1lbnRzLmxlbmd0aDtpKyspewotCQkJCQkJCQkJYm9vbGVhbiBleHBhbmRlZCA9IGZhbHNlOwotCQkJCQkJCQkJZm9yKGludCBqPTA7aiA8IGV4cGFuZGVkRWxlbWVudHNBZnRlclJlZnJlc2gubGVuZ3RoOyBqKyspewotCQkJCQkJCQkJCWlmKGV4cGFuZGVkRWxlbWVudHNbaV0uZXF1YWxzKGV4cGFuZGVkRWxlbWVudHNBZnRlclJlZnJlc2hbal0pKXsKLQkJCQkJCQkJCQkJZXhwYW5kZWQgPSB0cnVlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmKCFleHBhbmRlZCl7Ci0JCQkJCQkJCQkJZm9yKE9iamVjdCBvYiA6IGFsbEVsZW1lbnRzKXsKLQkJCQkJCQkJCQkJaWYob2IgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbgotCQkJCQkJCQkJCQkJCSYmIGV4cGFuZGVkRWxlbWVudHNbaV0gaW5zdGFuY2VvZiBTZXNzaW9uQmVhbil7Ci0JCQkJCQkJCQkJCQlTZXNzaW9uQmVhbiBiZWFuID0gKFNlc3Npb25CZWFuKSBvYjsKLQkJCQkJCQkJCQkJCVNlc3Npb25CZWFuIGJlYW4yID0gKFNlc3Npb25CZWFuKSBleHBhbmRlZEVsZW1lbnRzW2ldOwotCQkJCQkJCQkJCQkJaWYoYmVhbi5nZXRFamJOYW1lKCkuZXF1YWxzKGJlYW4yLmdldEVqYk5hbWUoKSkpewotCQkJCQkJCQkJCQkJCW5ld0V4cGFuZGVkRWxlbWVudHMuYWRkKG9iKTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQlpZihvYiBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuCi0JCQkJCQkJCQkJCQkJJiYgZXhwYW5kZWRFbGVtZW50c1tpXSBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKXsKLQkJCQkJCQkJCQkJCU1lc3NhZ2VEcml2ZW5CZWFuIGJlYW4gPSAoTWVzc2FnZURyaXZlbkJlYW4pIG9iOwotCQkJCQkJCQkJCQkJTWVzc2FnZURyaXZlbkJlYW4gYmVhbjIgPSAoTWVzc2FnZURyaXZlbkJlYW4pIGV4cGFuZGVkRWxlbWVudHNbaV07Ci0JCQkJCQkJCQkJCQlpZihiZWFuLmdldEVqYk5hbWUoKS5lcXVhbHMoYmVhbjIuZ2V0RWpiTmFtZSgpKSl7Ci0JCQkJCQkJCQkJCQkJbmV3RXhwYW5kZWRFbGVtZW50cy5hZGQob2IpOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCWlmKG9iIGluc3RhbmNlb2YgRW50aXR5QmVhbgotCQkJCQkJCQkJCQkJCSYmIGV4cGFuZGVkRWxlbWVudHNbaV0gaW5zdGFuY2VvZiBFbnRpdHlCZWFuKXsKLQkJCQkJCQkJCQkJCUVudGl0eUJlYW4gYmVhbiA9IChFbnRpdHlCZWFuKSBvYjsKLQkJCQkJCQkJCQkJCUVudGl0eUJlYW4gYmVhbjIgPSAoRW50aXR5QmVhbikgZXhwYW5kZWRFbGVtZW50c1tpXTsKLQkJCQkJCQkJCQkJCWlmKGJlYW4uZ2V0RWpiTmFtZSgpLmVxdWFscyhiZWFuMi5nZXRFamJOYW1lKCkpKXsKLQkJCQkJCQkJCQkJCQluZXdFeHBhbmRlZEVsZW1lbnRzLmFkZChvYik7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJKChUcmVlVmlld2VyKSB2aWV3ZXIpLnNldEV4cGFuZGVkRWxlbWVudHMobmV3RXhwYW5kZWRFbGVtZW50cy50b0FycmF5KCkpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX1maW5hbGx5ewotCQkJCQkJCWlmKCB2aWV3ZXIuZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSApewotCQkJCQkJCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHJlZnJlc2hUaHJlYWQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJewotCQkJSkVFVUlQbHVnaW4ubG9nRXJyb3IoIkVycm9yIGR1cmluZyByZWZyZXNoIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRWaWV3ZXJFbGVtZW50cyhMaXN0IHJlc3VsdCwgV2lkZ2V0IHdpZGdldCkgewotCQlJdGVtW10gaXRlbXMgPSBnZXRDaGlsZHJlbih3aWRnZXQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJdGVtIGl0ZW0gPSBpdGVtc1tpXTsKLQkJCXJlc3VsdC5hZGQoaXRlbS5nZXREYXRhKCkpOwotCQkJZ2V0Vmlld2VyRWxlbWVudHMocmVzdWx0LCBpdGVtKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlbVtdIGdldENoaWxkcmVuKFdpZGdldCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLQkJCXJldHVybiAoKFRyZWVJdGVtKSBvKS5nZXRJdGVtcygpOwotCQl9Ci0JCWlmIChvIGluc3RhbmNlb2YgVHJlZSkgewotCQkJcmV0dXJuICgoVHJlZSkgbykuZ2V0SXRlbXMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW9kZWxzQ2hhbmdlZChJTW9kZWxQcm92aWRlckV2ZW50IGV2ZW50KSB7Ci0JCXByb2plY3RDaGFuZ2VkKGV2ZW50LmdldFByb2plY3QoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBvblJlZnJlc2goZmluYWwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZVZpZXdlcikgewotCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpIHsKLQkJCQkoKEFic3RyYWN0VHJlZVZpZXdlcikgdmlld2VyKS5yZWZyZXNoKGVsZW1lbnQsIHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBDcmVhdGUgYW5kIHNjaGVkdWxlIGEgVUkgSm9iIHRvIHVwZGF0ZSB0aGUgTmF2aWdhdG9yIENvbnRlbnQgVmlld2VyICovCi0JCQkJSm9iIGpvYiA9IG5ldyBVSUpvYigiVXBkYXRlIHRoZSBOYXZpZ2F0b3IgQ29udGVudCBWaWV3ZXIgSm9iIikgeyAvLyROT04tTkxTLTEkCi0JCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCQkoKEFic3RyYWN0VHJlZVZpZXdlcikgdmlld2VyKS5yZWZyZXNoKGVsZW1lbnQsIHRydWUpOwotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUlTY2hlZHVsaW5nUnVsZSBydWxlID0gbmV3IElTY2hlZHVsaW5nUnVsZSgpIHsKLQkJCQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJCQkJCXJldHVybiBydWxlID09IHRoaXM7CQotCQkJCQl9Ci0JCQkJCXB1YmxpYyBib29sZWFuIGlzQ29uZmxpY3RpbmcoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJCQkJCXJldHVybiBydWxlID09IHRoaXM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmIChydWxlICE9IG51bGwpIHsKLQkJCQkJam9iLnNldFJ1bGUocnVsZSk7Ci0JCQkJfQotCQkJCWpvYi5zY2hlZHVsZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZ3JvdXBQcm92aWRlcnNNYXAuY2xlYXIoKTsKLQkJZ3JvdXBDb250ZW50UHJvdmlkZXJzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSAmJiBldmVudC5nZXRSZXNvdXJjZSgpICE9IG51bGwgJiYgZXZlbnQuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpewotCQkJZ3JvdXBDb250ZW50UHJvdmlkZXJzLnJlbW92ZShldmVudC5nZXRSZXNvdXJjZSgpKTsJCi0JCQlncm91cFByb3ZpZGVyc01hcC5yZW1vdmUoZXZlbnQuZ2V0UmVzb3VyY2UoKSk7CQkKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pFRUFjdGlvblByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pFRUFjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTdlYjQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9KRUVBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLnV0aWwuQXJjaGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5KYXZhRUVBcmNoaXZlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50QXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvdmlkZXIuSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS5hcmNoaXZlLklBcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhci5Hcm91cEVBUlByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5CZWFuSW50ZXJmYWNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkdyb3VwRUpCUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuT3BlbldpdGhNZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLm5hdmlnYXRvci5yZXNvdXJjZXMucGx1Z2luLldvcmtiZW5jaE5hdmlnYXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25BY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25NZW51Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXI7Ci0KLS8qKgotICogU3RhbmRhcmQgb3BlcmF0aW9ucyBKYXZhIEVFIEFjdGlvbiBQcm92aWRlci4KLSAqIEludHJvZHVjZXMgc3RhbmRhcmQgb3BlcmF0aW9ucyBmb3IgRGVwbG95bWVudCBkZXNjcmlwdG9yIHRyZWUgbm9kZXMuIChsaWtlIG9wZW4pIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEpFRUFjdGlvblByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uQWN0aW9uUHJvdmlkZXIgewotCi1wcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJUkVTT1VSQ0VfQ0xBU1MgPSBJUmVzb3VyY2UuY2xhc3M7Ci0JCi0JcHJpdmF0ZSBPcGVuSkVFUmVzb3VyY2VBY3Rpb24gb3BlbkFjdGlvbjsgCi0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEpFRUFjdGlvblByb3ZpZGVyKCkgewotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubmF2aWdhdG9yLmludGVybmFsLnZpZXdzLmFjdGlvbnMuSUNvbW1vbkFjdGlvblByb3ZpZGVyI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuZXh0ZW5zaW9ucy5OYXZpZ2F0b3JDb250ZW50U2VydmljZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlIGFDb25maWcpIHsJICAKLQkJb3BlbkFjdGlvbiA9IG5ldyBPcGVuSkVFUmVzb3VyY2VBY3Rpb24oKTsgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5hY3Rpb25zLklDb21tb25BY3Rpb25Qcm92aWRlciNzZXRBY3Rpb25Db250ZXh0KG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEFjdGlvbkNvbnRleHQgYUNvbnRleHQpIHsKLQkJCi0JCWlmIChhQ29udGV4dCAhPSBudWxsICYmIGFDb250ZXh0LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgYUNvbnRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCi0JCQlPYmplY3RbXSBhcnJheSA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlpZiAoaXNVdGlsaXR5SmFycyhhcnJheSkpIHsKLQkJCQlKMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlciB1dGlsaXR5SmFySXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJCQlMaXN0IG5ld1NlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXV0aWxpdHlKYXJJdGVtUHJvdmlkZXIgPSAoSjJFRVV0aWxpdHlKYXJJdGVtUHJvdmlkZXIpIGFycmF5W2ldOwotCQkJCQluZXdTZWxlY3Rpb24uYWRkQWxsKHV0aWxpdHlKYXJJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4obnVsbCkpOwotCQkJCX0KLQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JCXN1cGVyLnNldENvbnRleHQoYUNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5uYXZpZ2F0b3IuaW50ZXJuYWwudmlld3MuYWN0aW9ucy5JQ29tbW9uQWN0aW9uUHJvdmlkZXIjZmlsbEFjdGlvbkJhcnMob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgdGhlQWN0aW9uQmFycykgewotCQlpZihvcGVuQWN0aW9uLmlzRW5hYmxlZCgpKSAKLQkJCXRoZUFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJQ29tbW9uQWN0aW9uQ29uc3RhbnRzLk9QRU4sIG9wZW5BY3Rpb24pOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm5hdmlnYXRvci5pbnRlcm5hbC52aWV3cy5hY3Rpb25zLklDb21tb25BY3Rpb25Qcm92aWRlciNmaWxsQ29udGV4dE1lbnUob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIGFNZW51KSB7CQkKLQkJaWYgKGdldENvbnRleHQoKT09bnVsbCB8fCBnZXRDb250ZXh0KCkuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldENvbnRleHQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYoIWFkYXB0c1RvUmVzb3VyY2Uoc2VsZWN0aW9uLnRvQXJyYXkoKSkpIHsKLQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotLy8JCQljcmVhdGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQkJaWYgKG9wZW5BY3Rpb24uaXNFbmFibGVkKCkpCi0JCQkJYU1lbnUuaW5zZXJ0QWZ0ZXIoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfT1BFTiwgb3BlbkFjdGlvbik7Ci0vLwkJCWlmIChjcmVhdGVBY3Rpb24uaXNFbmFibGVkKCkpCi0vLwkJCQlhTWVudS5pbnNlcnRBZnRlcihJQ29tbW9uTWVudUNvbnN0YW50cy5HUk9VUF9PUEVOLCBjcmVhdGVBY3Rpb24pOwotCQkJYWRkT3BlbldpdGhNZW51KGFNZW51KTsKLQkJCQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFkYXB0c1RvUmVzb3VyY2UoT2JqZWN0W10gb2JqZWN0cykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKG9iamVjdHNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAob2JqZWN0c1tpXSBpbnN0YW5jZW9mIElBZGFwdGFibGUgJiYgKCgoSUFkYXB0YWJsZSlvYmplY3RzW2ldKS5nZXRBZGFwdGVyKElSRVNPVVJDRV9DTEFTUykgIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc1V0aWxpdHlKYXJzKE9iamVjdFtdIGl0ZW1zKSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGl0ZW1zW2ldID09IG51bGwgfHwgaXRlbXNbaV0uZ2V0Q2xhc3MoKSAhPSBKMkVFVXRpbGl0eUphckl0ZW1Qcm92aWRlci5jbGFzcykKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0gCi0JIAotCXByaXZhdGUgdm9pZCBhZGRPcGVuV2l0aE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb249IGdldENvbnRleHQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkgfHwgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pc2VsZWN0aW9uOwotCQlpZiAoc3Muc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm47Ci0KLQkJT2JqZWN0IHNyY09iamVjdCA9IHNzLmdldEZpcnN0RWxlbWVudCgpOwotCQlPYmplY3QgcmVzb3VyY2UgPSBudWxsOwotCQkKLQkJaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJlc291cmNlID0gb3BlbkVPYmplY3QoKEVPYmplY3QpIHNyY09iamVjdCk7Ci0JCX0gZWxzZSBpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgQmVhbkludGVyZmFjZU5vZGUpIHsKLQkJCXJlc291cmNlID0gKChCZWFuSW50ZXJmYWNlTm9kZSkgc3JjT2JqZWN0KS5nZXRfZnFuKCk7Ci0JCX0gZWxzZSBpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgQmVhbk5vZGUpIHsKLQkJCXJlc291cmNlID0gKChCZWFuTm9kZSkgc3JjT2JqZWN0KS5nZXRFamJDbGFzc1F1YWxpZmllZE5hbWUoKTsKLQotCQl9IGVsc2UgaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIFdlYkFwcFByb3ZpZGVyKSB7Ci0JCQlJRmlsZSBmaWxlID0gKChXZWJBcHBQcm92aWRlcikgc3JjT2JqZWN0KS5nZXREREZpbGUoKTsKLQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKXsJCQkJCi0JCQkJcmVzb3VyY2UgPSBmaWxlOwotCQkJfQotCQl9IGVsc2UgaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEdyb3VwRUpCUHJvdmlkZXIpIHsKLQkJCXJlc291cmNlID0gb3BlbkVPYmplY3QoKEVPYmplY3QpICgoR3JvdXBFSkJQcm92aWRlcilzcmNPYmplY3QpLmdldEVqYkphcigpKTsKLQkJfSBlbHNlIGlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBHcm91cEVBUlByb3ZpZGVyKSB7Ci0JCQlJRmlsZSBmaWxlID0gKChHcm91cEVBUlByb3ZpZGVyKSBzcmNPYmplY3QpLmdldERERmlsZSgpOwotCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpewotCQkJCXJlc291cmNlID0gZmlsZTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkpCi0JCQlyZXR1cm47IAotCi0JCS8vIENyZWF0ZSBhIG1lbnUuCi0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlNZW51TWFuYWdlciBzdWJtZW51PSBuZXcgTWVudU1hbmFnZXIoV29ya2JlbmNoTmF2aWdhdG9yTWVzc2FnZXMuT3BlbkFjdGlvblByb3ZpZGVyX09wZW5XaXRoTWVudV9sYWJlbCwgCi0JCQkJSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfT1BFTl9XSVRIKTsgCi0JCXN1Ym1lbnUuYWRkKG5ldyBPcGVuV2l0aE1lbnUocGFnZSwgKElGaWxlKSByZXNvdXJjZSkpOwotCi0JCS8vIEFkZCB0aGUgc3VibWVudS4KLQkJbWVudS5hcHBlbmRUb0dyb3VwKElDb21tb25NZW51Q29uc3RhbnRzLkdST1VQX09QRU4sIHN1Ym1lbnUpOwotCX0KLQkKLQlwcml2YXRlIElSZXNvdXJjZSBvcGVuRU9iamVjdChFT2JqZWN0IF9zcmNPYmplY3QpIHsKLQkJRU9iamVjdCBybyA9IChFT2JqZWN0KSBfc3JjT2JqZWN0OwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlcgotCQkuZ2V0RmlsZSgoRU9iamVjdCkgX3NyY09iamVjdCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0gZWxzZSB7Ci0JCQlNb2R1bGVGaWxlIG1vZHVsZUZpbGUgPSBBcmNoaXZlVXRpbC5nZXRNb2R1bGVGaWxlKHJvKTsKLQkJCWlmIChtb2R1bGVGaWxlICE9IG51bGwpIHsKLQkJCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbW9kdWxlRmlsZS5nZXRPcHRpb25zKCk7Ci0JCQkJaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBDb21wb25lbnRBcmNoaXZlT3B0aW9ucykgewotCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSAoKENvbXBvbmVudEFyY2hpdmVPcHRpb25zKSBvcHRpb25zKQotCQkJCQkuZ2V0Q29tcG9uZW50KCk7Ci0vLwkJCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKGNvbXBvbmVudCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlJQXJjaGl2ZSBhcmNoaXZlID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5maW5kQXJjaGl2ZShybyk7Ci0JCQkJaWYoYXJjaGl2ZSAhPSBudWxsKXsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gSmF2YUVFQXJjaGl2ZVV0aWxpdGllcy5maW5kQ29tcG9uZW50KGFyY2hpdmUpOwotCQkJCQlpZihjb21wb25lbnQgIT0gbnVsbCl7Ci0vLwkJCQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihjb21wb25lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSm5kaVJlZk5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSm5kaVJlZk5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5YTUzYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0puZGlSZWZOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBKTkRJIHJlZmVyZW5jZXMuCi0gKiBMaWtlOiBFamIgcmVmZXJlbmNlLCBFamIgTG9jYWwgUmVmZXJlbmNlLCBSZXNvdXJjZSBSZWZlcmVuY2UsIFJlc291cmNlIEVudmlyb25tZW50IFJlZmVyZW5jZSwKLSAqIEVudmlyb25tZW50IEVudHJ5LCBTZXJ2aWNlIFJlZmVyZW5jZSAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKbmRpUmVmTm9kZSBleHRlbmRzIEFic3RyYWN0REROb2RlIHsKLQotICBwcml2YXRlIGZpbmFsIGludCBraW5kOwotCi0gIHB1YmxpYyBjbGFzcyBLSU5EUyB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUpCTE9DQUxSRUYgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVKQlJFRiA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5WRU5UUlkgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU0VOVkVOVFkgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU1JFRiA9IDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRVJFRiA9IDU7Ci0gIH0KLQotICBwdWJsaWMgSm5kaVJlZk5vZGUoT2JqZWN0IGFkYXB0ZXJOb2RlLCBpbnQga2luZCkgewotICAgIHN1cGVyKGFkYXB0ZXJOb2RlKTsKLSAgICB0aGlzLmtpbmQgPSBraW5kOwotCi0gIH0KLQotICBwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0gICAgcmV0dXJuIGtpbmQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgcmV0dXJuIChMaXN0KSBhZGFwdGVyTm9kZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0gICAgc3dpdGNoIChraW5kKSB7Ci0gICAgY2FzZSBLSU5EUy5FSkJMT0NBTFJFRjoKLSAgICAgIHJldHVybiBNZXNzYWdlcy5FSkJMT0NBTF9SRUZFUkVOQ0VTOwotCi0gICAgY2FzZSBLSU5EUy5FSkJSRUY6Ci0gICAgICByZXR1cm4gTWVzc2FnZXMuRUpCX1JFRkVSRU5DRVM7Ci0gICAgY2FzZSBLSU5EUy5FTlZFTlRSWToKLSAgICAgIHJldHVybiBNZXNzYWdlcy5FTlZJUk9NRU5UX0VOVFJJRVM7Ci0gICAgY2FzZSBLSU5EUy5SRVNFTlZFTlRZOgotICAgICAgcmV0dXJuIE1lc3NhZ2VzLlJFU09VUkNFX0VOVklST01FTlRfRU5UUklFUzsKLSAgICBjYXNlIEtJTkRTLlJFU1JFRjoKLSAgICAgIHJldHVybiBNZXNzYWdlcy5SRVNPVVJDRV9SRUZFUkVOQ0VTOwotICAgIGNhc2UgS0lORFMuU0VSVklDRVJFRjoKLSAgICAgIHJldHVybiBNZXNzYWdlcy5TRVJWSUNFX1JFRkVSRU5DRVM7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5nZXRUZXh0KCk7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0gICAgc3dpdGNoIChraW5kKSB7Ci0gICAgY2FzZSBLSU5EUy5FSkJMT0NBTFJFRjp7Ci0gICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZWpiUmVmX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgIH0KLSAgICBjYXNlIEtJTkRTLkVKQlJFRjp7Ci0gICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiZWpiUmVmX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfQotICAgIAotICAgIGNhc2UgS0lORFMuRU5WRU5UUlk6Ci0gICAgICB7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJyZXNvdXJjZVJlZl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfQotICAgIGNhc2UgS0lORFMuUkVTRU5WRU5UWToKLSAgICAgIHsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoInJlc291cmNlUmVmX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9Ci0gICAgY2FzZSBLSU5EUy5SRVNSRUY6Ci0gICAgICB7Ci0gICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJyZXNvdXJjZVJlZl9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotICAgICAgfQotICAgIGNhc2UgS0lORFMuU0VSVklDRVJFRjoKLSAgICAgIHsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoInJlc291cmNlUmVmX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5nZXRJbWFnZSgpOwotICB9Ci0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvT3BlbkpFRVJlc291cmNlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL09wZW5KRUVSZXNvdXJjZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdhNWYyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvT3BlbkpFRVJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5qYXZhZWRpdG9yLkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkFic3RyYWN0T3BlbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkNvbXBvbmVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuSmF2YUVFQXJjaGl2ZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21wb25lbnRjb3JlLkNvbXBvbmVudEFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm92aWRlci5KMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5CZWFuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuYXJjaGl2ZS5JQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5hcHBjbGllbnQuR3JvdXBBcHBDbGllbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuR3JvdXBFQVJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamIuQmVhbkludGVyZmFjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiLkJlYW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYi5Hcm91cEVKQlByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNldFNlbGVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi0vKioKLSAqIE9wZW4gQWN0aW9uIGZvciBEZXBsb3ltZW50IGRlc2NyaXB0b3IgdHJlZSBub2Rlcy4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkpFRVJlc291cmNlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuQWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImNvbS5zYXAuaWRlLmoyZWUudWkuYWN0aW9ucy5PcGVuSkVFUmVzb3VyY2VBY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9FRElUT1JfSUQgPSAib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuZWpiLnVpLmphdmEuRW50ZXJwcmlzZUJlYW5KYXZhRWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfSkFWQV9FRElUT1JfSUQgPSAib3JnLmVjbGlwc2UuamR0LnVpLkNvbXBpbGF0aW9uVW5pdEVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgSUVkaXRvckRlc2NyaXB0b3IgamF2YUVkaXRvckRlc2NyaXB0b3I7Ci0JcHJvdGVjdGVkIHN0YXRpYyBJRWRpdG9yRGVzY3JpcHRvciBiYXNlSmF2YUVkaXRvckRlc2NyaXB0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwotCSAqLwotCXB1YmxpYyBPcGVuSkVFUmVzb3VyY2VBY3Rpb24oKSB7Ci0JCXN1cGVyKCJPcGVuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3Rpb24gSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJRCgpIHsKLQkJcmV0dXJuIElEOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUVkaXRvckRlc2NyaXB0b3IgZ2V0SmF2YUVkaXRvckRlc2NyaXB0b3IoKSB7Ci0JCWlmIChqYXZhRWRpdG9yRGVzY3JpcHRvciA9PSBudWxsKQotCQkJamF2YUVkaXRvckRlc2NyaXB0b3IgPSBmaW5kRWRpdG9yRGVzY3JpcHRvcihKQVZBX0VESVRPUl9JRCk7Ci0JCXJldHVybiBqYXZhRWRpdG9yRGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElFZGl0b3JEZXNjcmlwdG9yIGdldEJhc2VKYXZhRWRpdG9yRGVzY3JpcHRvcigpIHsKLQkJaWYgKGJhc2VKYXZhRWRpdG9yRGVzY3JpcHRvciA9PSBudWxsKQotCQkJYmFzZUphdmFFZGl0b3JEZXNjcmlwdG9yID0gZmluZEVkaXRvckRlc2NyaXB0b3IoQkFTRV9KQVZBX0VESVRPUl9JRCk7Ci0JCXJldHVybiBiYXNlSmF2YUVkaXRvckRlc2NyaXB0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFwcHJvcHJpYXRlRWRpdG9yKFN0cmluZyBjKSB7Ci0JCWlmKGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIFRyZWVTZWxlY3Rpb24pewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgKChUcmVlUGF0aCkoKFRyZWVTZWxlY3Rpb24pZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpKS5nZXRQYXRocygpWzBdKS5nZXRTZWdtZW50KDApOwotCQkJSVR5cGUgZmluZFR5cGU7Ci0JCQl0cnkgewotCQkJCWZpbmRUeXBlID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpLmZpbmRUeXBlKGMpOwotCQkJCWlmKGZpbmRUeXBlID09IG51bGwpewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihmaW5kVHlwZS5nZXRSZXNvdXJjZSgpKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSkVFVUlQbHVnaW4ubG9nRXJyb3IoIkVycm9yIGR1cmluZyBvcGVuIGVkaXRvciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCi0JfQotCXByb3RlY3RlZCB2b2lkIG9wZW5BcHByb3ByaWF0ZUVkaXRvcihJVmlydHVhbENvbXBvbmVudCBjKSB7Ci0JCWlmIChjID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gbnVsbDsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJZWRpdG9yID0gcGFnZS5vcGVuRWRpdG9yKG5ldyBDb21wb25lbnRFZGl0b3JJbnB1dChjKSwKLQkJCQkJY3VycmVudERlc2NyaXB0b3IuZ2V0SWQoKSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkKLQkJCQkoKElTZXRTZWxlY3Rpb25UYXJnZXQpIGVkaXRvcikKLQkJCQkuc2VsZWN0UmV2ZWFsKGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlRGlhbG9nCi0JCQkub3BlbkVycm9yKAotCQkJCQlwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCUoyRUVVSU1lc3NhZ2VzCi0JCQkJCS5nZXRSZXNvdXJjZVN0cmluZygiUHJvYmxlbXNfT3BlbmluZ19FZGl0b3JfRVJST1JfIiksIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9ibGVtcyBPcGVuaW5nIEVkaXRvciIKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9wZW5BcHByb3ByaWF0ZUVkaXRvcihJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCUphdmFVSS5vcGVuSW5FZGl0b3IoZWxlbWVudCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlRGlhbG9nCi0JCQkub3BlbkVycm9yKAotCQkJCQlwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCUoyRUVVSU1lc3NhZ2VzCi0JCQkJCS5nZXRSZXNvdXJjZVN0cmluZygiUHJvYmxlbXNfT3BlbmluZ19FZGl0b3JfRVJST1JfIiksIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9ibGVtcyBPcGVuaW5nIEVkaXRvciIKLQkJfQotCX0KLQotCS8qKgotCSAqIG9wZW4gdGhlIGFwcHJvcHJpYXRlIGVkaXRvcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BcHByb3ByaWF0ZUVkaXRvcihJUmVzb3VyY2UgcikgewotCQlpZiAociA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gbnVsbDsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJU3RyaW5nIElEID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpLmdldERlZmF1bHRFZGl0b3Ioci5nZXRMb2NhdGlvbigpCi0JCQkJCS50b1BvcnRhYmxlU3RyaW5nKCkpLmdldElkKCk7Ci0JCQllZGl0b3IgPSBwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dCgoSUZpbGUpIHIpLCBJRCk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVNldFNlbGVjdGlvblRhcmdldCkKLQkJCQkoKElTZXRTZWxlY3Rpb25UYXJnZXQpIGVkaXRvcikKLQkJCQkuc2VsZWN0UmV2ZWFsKGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlRGlhbG9nCi0JCQkub3BlbkVycm9yKAotCQkJCQlwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCUoyRUVVSU1lc3NhZ2VzCi0JCQkJCS5nZXRSZXNvdXJjZVN0cmluZygiUHJvYmxlbXNfT3BlbmluZ19FZGl0b3JfRVJST1JfIiksIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9ibGVtcyBPcGVuaW5nIEVkaXRvciIKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSB1c2VyIGhhcyBpbnZva2VkIHRoaXMgYWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoIWlzRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpIHsKLQkJCSgoSjJFRUphdmFDbGFzc1Byb3ZpZGVySGVscGVyKSBzcmNPYmplY3QpLm9wZW5JbkVkaXRvcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvL1tCdWcgMjQwNTEyXSBkZWFsIHdpdGggaWYgYW55IG9mIHRoZXNlIG5vZGUgdHlwZXMgbmRvIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgY2xhc3MKLQkJaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIFNlc3Npb25CZWFuIHx8Ci0JCQkJc3JjT2JqZWN0IGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbkJlYW4gfHwKLQkJCQlzcmNPYmplY3QgaW5zdGFuY2VvZiBFbnRpdHlCZWFuIHx8Ci0JCQkJc3JjT2JqZWN0IGluc3RhbmNlb2YgU2VydmxldCB8fAotCQkJCXNyY09iamVjdCBpbnN0YW5jZW9mIEZpbHRlciB8fAotCQkJCXNyY09iamVjdCBpbnN0YW5jZW9mIExpc3RlbmVyKXsKLQkJCQotCQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYoIHNyY09iamVjdCBpbnN0YW5jZW9mIFNlc3Npb25CZWFuICl7Ci0JCQkJU2Vzc2lvbkJlYW4gYmVhbiA9IChTZXNzaW9uQmVhbilzcmNPYmplY3Q7Ci0JCQkJbmFtZSA9IGJlYW4uZ2V0RWpiQ2xhc3MoKTsKLQkJCX0gZWxzZSBpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuQmVhbil7Ci0JCQkJTWVzc2FnZURyaXZlbkJlYW4gIGJlYW4gPSAoTWVzc2FnZURyaXZlbkJlYW4pc3JjT2JqZWN0OwotCQkJCW5hbWUgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCQl9IGVsc2UgaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgRW50aXR5QmVhbil7Ci0JCQkJRW50aXR5QmVhbiBiZWFuID0gKEVudGl0eUJlYW4pc3JjT2JqZWN0OwotCQkJCW5hbWUgPSBiZWFuLmdldEVqYkNsYXNzKCk7Ci0JCQl9IGVsc2UgaWYoc3JjT2JqZWN0IGluc3RhbmNlb2YgU2VydmxldCl7Ci0JCQkJU2VydmxldCBzZXJ2bGV0ID0gKFNlcnZsZXQpc3JjT2JqZWN0OwotCQkJCW5hbWUgPSBzZXJ2bGV0LmdldFNlcnZsZXRDbGFzcygpOwotCQkJfSBlbHNlIGlmKHNyY09iamVjdCBpbnN0YW5jZW9mIEZpbHRlcikgewotCSAgICAgICAgCUZpbHRlciBmaWx0ZXIgPSAoRmlsdGVyKXNyY09iamVjdDsJCQotCSAgICAgICAgCW5hbWUgPSBmaWx0ZXIuZ2V0RmlsdGVyQ2xhc3MoKTsKLQkJCX0gZWxzZSBpZihzcmNPYmplY3QgaW5zdGFuY2VvZiBMaXN0ZW5lcil7Ci0JICAgICAgICAJTGlzdGVuZXIgbGlzdGVuZXIgPSAoTGlzdGVuZXIpc3JjT2JqZWN0OwotCSAgICAgICAgCW5hbWUgPSBsaXN0ZW5lci5nZXRMaXN0ZW5lckNsYXNzKCk7Ci0JCQl9Ci0JCQkKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKEVPYmplY3Qpc3JjT2JqZWN0KTsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7CQkJCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZihqYXZhUHJvamVjdC5leGlzdHMoKSl7Ci0JCQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJLy9pZiBuYW1lIGlzIG51bGwgdGhlbiBjYW4ndCBnZXQgdHlwZQotCQkJCQlpZihuYW1lICE9IG51bGwpIHsKLQkJCQkJCXR5cGUgPSBqYXZhUHJvamVjdC5maW5kVHlwZSggbmFtZSApOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvL2lmIHR5cGUgaXMgbnVsbCB0aGVuIGNhbid0IG9wZW4gaXRzIGVkaXRvciwgc28gb3BlbiBlZGl0b3IgZm9yIHRoZSByZXNvdXJjZQotCQkJCQlpZih0eXBlICE9IG51bGwpIHsKLQkJCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCQkJRWRpdG9yVXRpbGl0eS5vcGVuSW5FZGl0b3IoY3UpOwotCQkJCQl9IGVsc2V7Ci0JCQkJCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJSkVFVUlQbHVnaW4ubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJSkVFVUlQbHVnaW4ubG9nRXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJCi0JCWlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlvcGVuRU9iamVjdCgoRU9iamVjdCkgc3JjT2JqZWN0KTsKLQkJfSBlbHNlIGlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBCZWFuSW50ZXJmYWNlTm9kZSkgewotCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKCgoQmVhbkludGVyZmFjZU5vZGUpIHNyY09iamVjdCkuZ2V0X2ZxbigpKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIGlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBCZWFuTm9kZSkgewotCQkJb3BlbkFwcHJvcHJpYXRlRWRpdG9yKCgoQmVhbk5vZGUpIHNyY09iamVjdCkuZ2V0RWpiQ2xhc3NRdWFsaWZpZWROYW1lKCkpOwotCQkJcmV0dXJuOwotCi0JCX0gZWxzZSBpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgV2ViQXBwUHJvdmlkZXIpIHsKLQkJCUlGaWxlIGZpbGUgPSAoKFdlYkFwcFByb3ZpZGVyKSBzcmNPYmplY3QpLmdldERERmlsZSgpOwotCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpewkJCQkKLQkJCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoZmlsZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGVsc2UgaWYgKHNyY09iamVjdCBpbnN0YW5jZW9mIEdyb3VwRUpCUHJvdmlkZXIpIHsKLQkJCW9wZW5FT2JqZWN0KChFT2JqZWN0KSAoKEdyb3VwRUpCUHJvdmlkZXIpc3JjT2JqZWN0KS5nZXRFamJKYXIoKSk7Ci0JCX0gZWxzZSBpZiAoc3JjT2JqZWN0IGluc3RhbmNlb2YgR3JvdXBFQVJQcm92aWRlcikgewotCQkJSUZpbGUgZmlsZSA9ICgoR3JvdXBFQVJQcm92aWRlcikgc3JjT2JqZWN0KS5nZXREREZpbGUoKTsKLQkJCWlmIChmaWxlLmlzQWNjZXNzaWJsZSgpKXsKLQkJCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoZmlsZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCSBlbHNlIGlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBHcm91cEFwcENsaWVudFByb3ZpZGVyKSB7Ci0JCQkJSUZpbGUgZmlsZSA9ICgoR3JvdXBBcHBDbGllbnRQcm92aWRlcikgc3JjT2JqZWN0KS5nZXREREZpbGUoKTsKLQkJCQlpZiAoZmlsZS5pc0FjY2Vzc2libGUoKSl7Ci0JCQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihmaWxlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX1lbHNlIGlmIChzcmNPYmplY3QgaW5zdGFuY2VvZiBSZXNvdXJjZSkKLQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihXb3JrYmVuY2hSZXNvdXJjZUhlbHBlcgotCQkJCQkuZ2V0RmlsZSgoUmVzb3VyY2UpIHNyY09iamVjdCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRU9iamVjdChFT2JqZWN0IF9zcmNPYmplY3QpIHsKLQkJRU9iamVjdCBybyA9IChFT2JqZWN0KSBfc3JjT2JqZWN0OwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlcgotCQkuZ2V0RmlsZSgoRU9iamVjdCkgX3NyY09iamVjdCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IocmVzb3VyY2UpOwotCQl9IGVsc2UgewotCQkJTW9kdWxlRmlsZSBtb2R1bGVGaWxlID0gQXJjaGl2ZVV0aWwuZ2V0TW9kdWxlRmlsZShybyk7Ci0JCQlpZiAobW9kdWxlRmlsZSAhPSBudWxsKSB7Ci0JCQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG1vZHVsZUZpbGUuZ2V0T3B0aW9ucygpOwotCQkJCWlmIChvcHRpb25zIGluc3RhbmNlb2YgQ29tcG9uZW50QXJjaGl2ZU9wdGlvbnMpIHsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKChDb21wb25lbnRBcmNoaXZlT3B0aW9ucykgb3B0aW9ucykKLQkJCQkJLmdldENvbXBvbmVudCgpOwotCQkJCQlvcGVuQXBwcm9wcmlhdGVFZGl0b3IoY29tcG9uZW50KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUlBcmNoaXZlIGFyY2hpdmUgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmZpbmRBcmNoaXZlKHJvKTsKLQkJCQlpZihhcmNoaXZlICE9IG51bGwpewotCQkJCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBKYXZhRUVBcmNoaXZlVXRpbGl0aWVzLmZpbmRDb21wb25lbnQoYXJjaGl2ZSk7Ci0JCQkJCWlmKGNvbXBvbmVudCAhPSBudWxsKXsKLQkJCQkJCW9wZW5BcHByb3ByaWF0ZUVkaXRvcihjb21wb25lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIFRoZSBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCBpbiB0aGUgd29ya2JlbmNoLiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJlYWN0IHRvIHRoZSBjaGFuZ2UuIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWN0aW9uCi0JICogc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoaXMgc2VsZWN0aW9uLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIAotCSAqIFdoZW4gdGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiwgdGhlIHN1cGVyIG1ldGhvZCBtdXN0IGFsd2F5cyBiZSBpbnZva2VkLgotCSAqIElmIHRoZSBzdXBlciBtZXRob2QgcmV0dXJucyBmYWxzZSwgdGhpcyBtZXRob2QgbXVzdCBhbHNvIHJldHVybiBmYWxzZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsCi0JICogICAgICAgICAgICB0aGUgbmV3IHN0cnVjdHVyZWQgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMpIHsKLQkJaWYgKCFzdXBlci51cGRhdGVTZWxlY3Rpb24ocykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoaXMgaXMgb25lIG9mIHRoZSBzZWxlY3Rpb25zIHdlIGNhbiBoYW5kbGUsCi0JCS8vIHRoZW4gc2V0IHRoZSBzb3VyY2Ugb2JqZWN0IGFzIGlzLiBUaGUgcnVuKCkgd2lsbCBkbyB0aGUgaGFyZCBzdHVmZi4KLQkJT2JqZWN0IG9iaiA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCXNldFRleHQoIk9wZW4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBKMkVFSmF2YUNsYXNzUHJvdmlkZXJIZWxwZXIpCi0JCQljdXJyZW50RGVzY3JpcHRvciA9IGdldEphdmFFZGl0b3JEZXNjcmlwdG9yKCk7Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJlYW5MaW5rKQotCQkJY3VycmVudERlc2NyaXB0b3IgPSBnZXRCYXNlSmF2YUVkaXRvckRlc2NyaXB0b3IoKTsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoRU9iamVjdCkgb2JqKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCQkJY3VycmVudERlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TmFtZSgpLAotCQkJCQkJY29udGVudFR5cGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZigoKEVPYmplY3QpIG9iaikuZVJlc291cmNlKCkgIT0gbnVsbCl7Ci0JCQkJCVN0cmluZyBuYW1lID0gKG5ldyBQYXRoKCgoRU9iamVjdCkgb2JqKS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCS50b1N0cmluZygpKSkubGFzdFNlZ21lbnQoKTsKLQkJCQkJY3VycmVudERlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKG5hbWUsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoUmVzb3VyY2UpIG9iaik7Ci0JCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoZmlsZS5nZXROYW1lKCksCi0JCQkJCWNvbnRlbnRUeXBlKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBHcm91cEVBUlByb3ZpZGVyKSB7Ci0JCQlJRmlsZSBmaWxlID0gKChHcm91cEVBUlByb3ZpZGVyKSBvYmopLmdldERERmlsZSgpOwotCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpewotCQkJCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCQkJY3VycmVudERlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TmFtZSgpLAotCQkJCQkJY29udGVudFR5cGUpOwotCQkJfWVsc2V7Ci0JCQkJY3VycmVudERlc2NyaXB0b3IgPSBudWxsOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBHcm91cEFwcENsaWVudFByb3ZpZGVyKSB7Ci0JCQlJRmlsZSBmaWxlID0gKChHcm91cEFwcENsaWVudFByb3ZpZGVyKSBvYmopLmdldERERmlsZSgpOwotCQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpewotCQkJCUlFZGl0b3JSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCQkJY3VycmVudERlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TmFtZSgpLAotCQkJCQkJY29udGVudFR5cGUpOwotCQkJfWVsc2V7Ci0JCQkJY3VycmVudERlc2NyaXB0b3IgPSBudWxsOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXZWJBcHBQcm92aWRlcikgewotCQkJSUZpbGUgZmlsZSA9ICgoV2ViQXBwUHJvdmlkZXIpIG9iaikuZ2V0RERGaWxlKCk7Ci0JCQlpZiAoZmlsZS5pc0FjY2Vzc2libGUoKSl7Ci0JCQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoZmlsZS5nZXROYW1lKCksCi0JCQkJCQljb250ZW50VHlwZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQmVhbk5vZGUpIHsKLQotCQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCQlKYXZhRUVPYmplY3QgZW50ZXJwcmlzZUJlYW4gPSAoKEJlYW5Ob2RlKSBvYmopLmdldEVudGVycHJpc2VCZWFuKCk7Ci0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoRU9iamVjdCllbnRlcnByaXNlQmVhbik7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gSURFLmdldENvbnRlbnRUeXBlKGZpbGUpOwotCQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlLmdldE5hbWUoKSwKLQkJCQkJCWNvbnRlbnRUeXBlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYoKChFT2JqZWN0KSBlbnRlcnByaXNlQmVhbikuZVJlc291cmNlKCkgIT0gbnVsbCl7Ci0JCQkJCVN0cmluZyBuYW1lID0gKG5ldyBQYXRoKCgoRU9iamVjdCkgZW50ZXJwcmlzZUJlYW4pLmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJCQkJLnRvU3RyaW5nKCkpKS5sYXN0U2VnbWVudCgpOwotCQkJCQljdXJyZW50RGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IobmFtZSwgbnVsbCk7Ci0JCQkJfQotCQkJfSAgICAgIAotCQl9IGVsc2UgIGlmIChvYmogaW5zdGFuY2VvZiBCZWFuSW50ZXJmYWNlTm9kZSkgewotCi0JCQlJRWRpdG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJCUphdmFFRU9iamVjdCBiZWFuSW50ZXJmYWNlID0gKEphdmFFRU9iamVjdCkgKChCZWFuSW50ZXJmYWNlTm9kZSkgb2JqKS5nZXRBZGFwdGVyTm9kZSgpOwotCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKEVPYmplY3QpYmVhbkludGVyZmFjZSk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gSURFLmdldENvbnRlbnRUeXBlKGZpbGUpOwotCQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcihmaWxlLmdldE5hbWUoKSwKLQkJCQkJCWNvbnRlbnRUeXBlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYoKChFT2JqZWN0KSBiZWFuSW50ZXJmYWNlKS5lUmVzb3VyY2UoKSAhPSBudWxsKXsKLQkJCQkJU3RyaW5nIG5hbWUgPSAobmV3IFBhdGgoKChFT2JqZWN0KSBiZWFuSW50ZXJmYWNlKS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b1N0cmluZygpKSkubGFzdFNlZ21lbnQoKTsKLQkJCQkJY3VycmVudERlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKG5hbWUsIG51bGwpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyBmcW4gPSAoKEJlYW5JbnRlcmZhY2VOb2RlKSBvYmopLmdldF9mcW4oKTsKLQkJCQkJaWYgKGZxbiAhPSBudWxsKXsKLQkJCQkJCWN1cnJlbnREZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0RGVmYXVsdEVkaXRvcigoKEJlYW5JbnRlcmZhY2VOb2RlKSBvYmopLmdldFRleHQoKSwgbnVsbCk7Ci0vLwkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCQlzZXRBdHRyaWJ1dGVzRnJvbURlc2NyaXB0b3IoKTsKLQkJc3JjT2JqZWN0ID0gb2JqOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL1dlYjI1Q29udGVudFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL1dlYjI1Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNmUyODYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9XZWIyNUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLldlYkFwcFByb3ZpZGVyOwotCi0vKioKLSAqIFdlYiAyLjUgQ29udGVudCBwcm92aWRlciBpcyBEZXBsb3ltZW50IERlc2NyaXB0b3IgY29udGVudCBwcm92aWRlciwgCi0gKiB1c2VkIGZvciBjb25zdHJ1Y3Rpbmcgb2YgdGhlIGRlc2NyaXB0b3IgdHJlZSBpbiBwcm9qZWN0IGV4cGxvcmVyLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIFdlYjI1Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgSkVFNUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGFQYXJlbnRFbGVtZW50KSB7Ci0KLQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlpZiAoYVBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIGFQYXJlbnRFbGVtZW50KS5nZXRBZGFwdGVyKElQUk9KRUNUX0NMQVNTKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlBYnN0cmFjdEdyb3VwUHJvdmlkZXIgY2FjaGVkQ29udGVudFByb3ZpZGVyID0gZ2V0Q2FjaGVkQ29udGVudFByb3ZpZGVyKHByb2plY3QpOwotCQkJCWlmIChjYWNoZWRDb250ZW50UHJvdmlkZXIuaXNWYWxpZCgpKXsKLQkJCQkJY2hpbGRyZW4uYWRkKGNhY2hlZENvbnRlbnRQcm92aWRlcik7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGFQYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgV2ViQXBwUHJvdmlkZXIpewotCQkJY2hpbGRyZW4uYWRkQWxsKCgoV2ViQXBwUHJvdmlkZXIpIGFQYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbigpKTsKLQkJfSBlbHNlIGlmIChhUGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEFic3RyYWN0R3JvdXBQcm92aWRlcil7Ci0JCQljaGlsZHJlbi5hZGRBbGwoKChBYnN0cmFjdEdyb3VwUHJvdmlkZXIpIGFQYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbigpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXZWJBcHBQcm92aWRlcikgewotCQkJcmV0dXJuICgoV2ViQXBwUHJvdmlkZXIpZWxlbWVudCkuaXNWYWxpZCgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEdyb3VwUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKEFic3RyYWN0R3JvdXBQcm92aWRlcikgZWxlbWVudCkuaGFzQ2hpbGRyZW4oKTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RHcm91cFByb3ZpZGVyIGdldE5ld0NvbnRlbnRQcm92aWRlckluc3RhbmNlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBXZWJBcHBQcm92aWRlcigoV2ViQXBwKSBnZXRDYWNoZWRNb2RlbFByb3ZpZGVyKHByb2plY3QpLmdldE1vZGVsT2JqZWN0KCksIHByb2plY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvV2ViMjVMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL1dlYjI1TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY1ZTA3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvV2ViMjVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuVXJsUGF0dGVyblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5GaWx0ZXJNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkdyb3VwQ29udGV4dFBhcmFtc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBFcnJvclBhZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cEZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViLkdyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5Hcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXJ0aWZhY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIFdlYiAyLjUgTGFiZWwgcHJvdmlkZXIgaXMgRGVwbG95bWVudCBEZXNjcmlwdG9yIGxhYmVsIHByb3ZpZGVyLCAKLSAqIHVzZWQgZm9yIGRlY29yYXRpbmcgb2YgdGhlIGRlc2NyaXB0b3IgdHJlZSBpbiBwcm9qZWN0IGV4cGxvcmVyLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIFdlYjI1TGFiZWxQcm92aWRlciBleHRlbmRzIEoyRUVMYWJlbFByb3ZpZGVyIHsKLQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlJbWFnZSByZXQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdlYkFwcFByb3ZpZGVyKSB7Ci0JCQlyZXQgPSAoKFdlYkFwcFByb3ZpZGVyKSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBYnN0cmFjdEdyb3VwUHJvdmlkZXIpewotCQkJcmV0ID0gKChBYnN0cmFjdEdyb3VwUHJvdmlkZXIpIGVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZsZXQpewotCQkJcmV0ID0gR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyLmdldFNlcnZsZXRJbWFnZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2bGV0TWFwcGluZyl7Ci0JCQlyZXQgPSBHcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmdldFNlcnZsZXRNYXBwaW5nSW1hZ2UoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsdGVyKXsKLQkJCXJldCA9IEdyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlci5nZXRGaWx0ZXJzSW1hZ2UoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlzdGVuZXIpewotCQkJcmV0ID0gR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlci5nZXRMaXN0ZW5lcnNJbWFnZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWx0ZXJNYXBwaW5nKXsKLQkJCXJldCA9IEdyb3VwRmlsdGVyTWFwcGluZ0l0ZW1Qcm92aWRlci5nZXRGaWx0ZXJNYXBwaW5nSW1hZ2UoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViQXJ0aWZhY3ROb2RlKXsKLQkJICByZXQgPSAoKFdlYkFydGlmYWN0Tm9kZSllbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFcnJvclBhZ2UpewotCQkgIHJldCA9IEdyb3VwRXJyb3JQYWdlc0l0ZW1Qcm92aWRlci5nZXRFcnJvclBhZ2VzSW1hZ2UoKEVycm9yUGFnZSllbGVtZW50KTsgCi0gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBhcmFtVmFsdWUpewotICAgICAgICAgIHJldCA9IEdyb3VwQ29udGV4dFBhcmFtc0l0ZW1Qcm92aWRlci5nZXRDb250ZXh0UGFyYW1zSW1hZ2UoKTsgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0ID0gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0gICAgICAgIH0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHJldCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViQXBwUHJvdmlkZXIpIHsKLQkJCXJldCA9ICgoV2ViQXBwUHJvdmlkZXIpIGVsZW1lbnQpLmdldFRleHQoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RHcm91cFByb3ZpZGVyKXsKLQkJCXJldCA9ICgoQWJzdHJhY3RHcm91cFByb3ZpZGVyKSBlbGVtZW50KS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNlcnZsZXQpewotCQkJcmV0ID0gKChTZXJ2bGV0KSBlbGVtZW50KS5nZXRTZXJ2bGV0TmFtZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZXJ2bGV0TWFwcGluZykgewotCQkJcmV0ID0gZ2V0U2VydmxldE1hcHBpbmdEaXNwbGF5KChTZXJ2bGV0TWFwcGluZykgZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbHRlcil7Ci0JCQlyZXQgPSAoKEZpbHRlcikgZWxlbWVudCkuZ2V0RmlsdGVyTmFtZSgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaXN0ZW5lcil7Ci0JCQlyZXQgPSAoKExpc3RlbmVyKSBlbGVtZW50KS5nZXRMaXN0ZW5lckNsYXNzKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbHRlck1hcHBpbmcpIHsKLQkJCXJldCA9IGdldEZpbHRlck1hcHBpbmdEaXNwbGF5KChGaWx0ZXJNYXBwaW5nKSBlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV2ViQXJ0aWZhY3ROb2RlKSB7Ci0gICAgICAgICAgICByZXQgPSAoKFdlYkFydGlmYWN0Tm9kZSkgZWxlbWVudCkuZ2V0VGV4dCgpOyAKLSAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRXJyb3JQYWdlICl7Ci0gICAgICAgIAlFcnJvclBhZ2UgcGFnZSA9ICgoRXJyb3JQYWdlKSBlbGVtZW50KTsKLQkJCWlmIChwYWdlLmdldEVycm9yQ29kZSgpID09IG51bGwpIHsKLQkJCQlyZXQgPSBwYWdlLmdldEV4Y2VwdGlvblR5cGUoKSArICIgLT4gIiArIHBhZ2UuZ2V0TG9jYXRpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyZXQgPSBwYWdlLmdldEVycm9yQ29kZSgpICsgIiAtPiAiICsgcGFnZS5nZXRMb2NhdGlvbigpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBhcmFtVmFsdWUpewotICAgICAgICAJcmV0ID0gKChQYXJhbVZhbHVlKWVsZW1lbnQpLmdldFBhcmFtTmFtZSgpICsgIiA9ICIgKyAoKFBhcmFtVmFsdWUpZWxlbWVudCkuZ2V0UGFyYW1WYWx1ZSgpOy8vJE5PTi1OTFMtMSQgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlyZXQgPSBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotICAgICAgICB9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsdGVyTWFwcGluZ0Rpc3BsYXkoRmlsdGVyTWFwcGluZyBlbGVtZW50KSB7Ci0JCVVybFBhdHRlcm5UeXBlIHVybFBhdHRlcm5zID0gbnVsbDsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0VXJsUGF0dGVybnMoKS5zaXplKCkgPiAwKXsKLQkJCXVybFBhdHRlcm5zID0gKFVybFBhdHRlcm5UeXBlKSBlbGVtZW50LmdldFVybFBhdHRlcm5zKCkuZ2V0KDApOwotCQkJdmFsdWUgPSB1cmxQYXR0ZXJucy5nZXRWYWx1ZSgpOwotCQl9ZWxzZXsKLQkJCUZlYXR1cmVNYXAgZ3JvdXAgPSBlbGVtZW50LmdldEdyb3VwKCk7Ci0JCQlpZiAoZ3JvdXAuc2l6ZSgpID4wKSB7Ci0JCQkJRW50cnkgZW50cnkgPSBncm91cC5nZXQoMCk7Ci0JCQkJdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlICsgIi0+ICIgKyBlbGVtZW50LmdldEZpbHRlck5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFNlcnZsZXRNYXBwaW5nRGlzcGxheShTZXJ2bGV0TWFwcGluZyBlbGVtZW50KSB7Ci0JCVVybFBhdHRlcm5UeXBlIHVybFBhdHRlcm5zID0gKFVybFBhdHRlcm5UeXBlKSBlbGVtZW50LmdldFVybFBhdHRlcm5zKCkuZ2V0KDApOwotCQlyZXR1cm4gdXJsUGF0dGVybnMuZ2V0VmFsdWUoKSArICItPiAiICsgZWxlbWVudC5nZXRTZXJ2bGV0TmFtZSgpOyAvLyROT04tTkxTLTEkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9hcHBjbGllbnQvR3JvdXBBcHBDbGllbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9hcHBjbGllbnQvR3JvdXBBcHBDbGllbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWYzMmVhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvYXBwY2xpZW50L0dyb3VwQXBwQ2xpZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5hcHBjbGllbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLQotLyoqCi0gKiBBcHBsaWNhdGlvbiBDbGllbnQgNS4wIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cEFwcENsaWVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyIHsKLQotCQotCXByaXZhdGUgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLQotCi0JcHVibGljIEdyb3VwQXBwQ2xpZW50UHJvdmlkZXIoQXBwbGljYXRpb25DbGllbnQgamF2YWVlLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKGphdmFlZSk7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfUkVMQVRJVkVfUEFUSCA9ICJNRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIEltYWdlIEFQUF9DTElFTlQ1MDsKLQotCXByaXZhdGUgSUZpbGUgZGRGaWxlOwotCi0KLQlwcml2YXRlIEFwcGxpY2F0aW9uQ2xpZW50IGdldE1vZGVsKCkgewotCQlpZiAodGhpcy5qYXZhZWUgIT0gbnVsbCkKLQkJCXJldHVybiAoQXBwbGljYXRpb25DbGllbnQpIHRoaXMuamF2YWVlOwotCQlJTW9kZWxQcm92aWRlciBtb2RlbFByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIKLQkJLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0JCU9iamVjdCBtb2RlbE9iamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbE9iamVjdCA9IG1vZGVsUHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUpFRVVJUGx1Z2luLmxvZ0Vycm9yKCJFcnJvciBkdXJpbmcgaW5pdGlhbGl6aW5nIG1vZGVsIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChtb2RlbE9iamVjdCAhPSBudWxsICYmIG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgQXBwbGljYXRpb25DbGllbnQpIHsKLQkJCXJldHVybiAoQXBwbGljYXRpb25DbGllbnQpIG1vZGVsT2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh0aGlzLnByb2plY3QgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gTWVzc2FnZXMuREVQTE9ZTUVOVF9ERVNDUklQVE9SOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gTWVzc2FnZXMuREVQTE9ZTUVOVF9ERVNDUklQVE9SICsgdGhpcy5wcm9qZWN0LmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGphdmFlZSAhPSBudWxsKXsKLQkJCXJlc3VsdC5hZGRBbGwoKChBcHBsaWNhdGlvbkNsaWVudCkgamF2YWVlKS5nZXRFamJSZWZzKCkpOwotCQkJLy9yZXN1bHQuYWRkQWxsKCgoQXBwbGljYXRpb25DbGllbnQpIGphdmFlZSkuZ2V0RWpiTG9jYWxSZWZzKCkpOwotCQkJcmVzdWx0LmFkZEFsbCgoKEFwcGxpY2F0aW9uQ2xpZW50KSBqYXZhZWUpLmdldFJlc291cmNlUmVmcygpKTsKLQkJCXJlc3VsdC5hZGRBbGwoKChBcHBsaWNhdGlvbkNsaWVudCkgamF2YWVlKS5nZXRSZXNvdXJjZUVudlJlZnMoKSk7Ci0JCQlyZXN1bHQuYWRkQWxsKCgoQXBwbGljYXRpb25DbGllbnQpIGphdmFlZSkuZ2V0RW52RW50cmllcygpKTsKLQkJCXJlc3VsdC5hZGRBbGwoKChBcHBsaWNhdGlvbkNsaWVudCkgamF2YWVlKS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpOwotCQkJLy9yZXN1bHQuYWRkQWxsKCgoQXBwbGljYXRpb25DbGllbnQpIGphdmFlZSkuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpKTsKLQkJCXJlc3VsdC5hZGRBbGwoKChBcHBsaWNhdGlvbkNsaWVudCkgamF2YWVlKS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCkpOwotCQkJcmVzdWx0LmFkZEFsbCgoKEFwcGxpY2F0aW9uQ2xpZW50KSBqYXZhZWUpLmdldFNlcnZpY2VSZWZzKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKEFQUF9DTElFTlQ1MCA9PSBudWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKRUVVSVBsdWdpbkljb25zLkFQUF9DTElFTlQ1MCk7Ci0JCQlBUFBfQ0xJRU5UNTAgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gQVBQX0NMSUVOVDUwOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgZ2V0RERGaWxlKCkgewotCQlpZiAoZGRGaWxlICE9IG51bGwpewotCQkJcmV0dXJuIGRkRmlsZTsKLQkJfQotCQlJVmlydHVhbEZvbGRlciB2aXJ0dWFsRm9sZGVyID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCkuZ2V0Um9vdEZvbGRlcigpOwotCQlkZEZpbGUgPSB2aXJ0dWFsRm9sZGVyLmdldEZpbGUoUFJPSkVDVF9SRUxBVElWRV9QQVRIKS5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQlyZXR1cm4gZGRGaWxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZG5kL0FkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZG5kL0FkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiZjZiYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2RuZC9BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkphclBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTG9jYWxTZWxlY3Rpb25UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuUmVtb3ZlQ29tcG9uZW50RnJvbUVudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVNYW5pZmVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5KMkVFVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5EZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5JSjJFRU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb3ZpZGVyLkoyRUVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLnBsdWdpbi5KMkVFTmF2aWdhdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuRUFSRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkFic3RyYWN0RWFyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lYXIuQnVuZGxlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyLkdyb3VwRUFSUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25Ecm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuQ29tbW9uRHJvcEFkYXB0ZXJBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QbHVnaW5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5SZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBIYW5kbGVzIGRyb3Agb2YgSkVFIHJlc291cmNlcyBvbiBFQVIgcHJvamVjdCB0aHVzIGFkZGluZyB0aGVtIGFzIG1vZHVsZXMuCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnQgZXh0ZW5kcyBDb21tb25Ecm9wQWRhcHRlckFzc2lzdGFudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJUFJPSkVDVF9DTEFTUyA9IElQcm9qZWN0LmNsYXNzOwotCXByaXZhdGUgSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gbnVsbDsKLQlwcml2YXRlIElQcm9qZWN0IGVhclByb2plY3QgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGxpYkRpciA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHJlc29sdmVDb25mbGljdHMgPSBmYWxzZTsKLQotCXB1YmxpYyBBZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGVkVHlwZShUcmFuc2ZlckRhdGEgYVRyYW5zZmVyVHlwZSkgewotCQlyZXR1cm4gTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmlzU3VwcG9ydGVkVHlwZShhVHJhbnNmZXJUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBoYW5kbGVEcm9wKENvbW1vbkRyb3BBZGFwdGVyIGFEcm9wQWRhcHRlciwgRHJvcFRhcmdldEV2ZW50IGFEcm9wVGFyZ2V0RXZlbnQsIGZpbmFsIE9iamVjdCBhVGFyZ2V0KSB7Ci0JCWlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuaXNTdXBwb3J0ZWRUeXBlKGFEcm9wQWRhcHRlci5nZXRDdXJyZW50VHJhbnNmZXIoKSkpIHsKLQkJCWZpbmFsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLmdldFNlbGVjdGlvbigpOwotCQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJCXJlc29sdmVDb25mbGljdHMgPSBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3Igc2VsZWN0aW9uSXRlcmF0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgc2VsZWN0aW9uSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBzb3VyY2VPYmplY3QgPSBzZWxlY3Rpb25JdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKHNvdXJjZU9iamVjdCBpbnN0YW5jZW9mIElWaXJ0dWFsUmVmZXJlbmNlKSB7Ci0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChJVmlydHVhbFJlZmVyZW5jZSkgc291cmNlT2JqZWN0OwotCQkJCQkvKgotCQkJCQkgKiBJZiBhIHJlZmVyZW5jZSBpcyBtb3ZlZCBmcm9tIHRoZSByb290IHRvIHRoZSBsaWIKLQkJCQkJICogZGlyZWN0b3J5IGNoZWNrIGZvciBjb25mbGljdHMgd2l0aCBwcm9qZWN0cyByZWZlcmVuY2VkIGJ5Ci0JCQkJCSAqIHRoZSBlYXIgcmVmZXJlbmNpbmcgdGhlIHNhbWUgbGliCi0JCQkJCSAqLwotCQkJCQlJUGF0aCBsaWJEaXJQYXRoID0gbnVsbDsKLQkJCQkJaWYobGliRGlyICE9IG51bGwpCi0JCQkJCQlsaWJEaXJQYXRoID0gbmV3IFBhdGgobGliRGlyKS5tYWtlUmVsYXRpdmUoKTsKLQkJCQkJaWYgKGxpYkRpci5sZW5ndGgoKSA+IDAgJiYgbGliRGlyUGF0aCAhPSBudWxsICYmICFsaWJEaXJQYXRoLmVxdWFscyhyZWZlcmVuY2UuZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKSkpIHsKLQkJCQkJCWlmIChoYXNDb25mbGljdGluZ1Byb2plY3RJbk1ldGFJbmYocmVmZXJlbmNlKSkgewotCQkJCQkJCURlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cgZGxnID0gbmV3IERlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2coZ2V0U2hlbGwoKSwgRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZy5ETEdfVFlQRV8yKTsKLQkJCQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nLkJUTl9JRF9DQU5DRUwpIHsKLQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJlc29sdmVDb25mbGljdHMgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChsaWJEaXIubGVuZ3RoKCkgPiAwKXsKLQkJCQkJCUlQcm9qZWN0IHByb2plY3RUb0FkZCA9IGdldFByb2plY3Qoc291cmNlT2JqZWN0KTsKLQkJCQkJCWlmIChoYXNDb25mbGljdGluZ1Byb2plY3RJbk1ldGFJbmYocHJvamVjdFRvQWRkKSkgewotCQkJCQkJCURlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2cgZGxnID0gbmV3IERlcGVuZGVuY3lDb25mbGljdFJlc29sdmVEaWFsb2coZ2V0U2hlbGwoKSwgRGVwZW5kZW5jeUNvbmZsaWN0UmVzb2x2ZURpYWxvZy5ETEdfVFlQRV8yKTsKLQkJCQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBEZXBlbmRlbmN5Q29uZmxpY3RSZXNvbHZlRGlhbG9nLkJUTl9JRF9DQU5DRUwpIHsKLQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJlc29sdmVDb25mbGljdHMgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUpvYiBhZGRQcm9qZWN0VG9FYXJKb2IgPSBuZXcgSm9iKGdldEpvYlRpdGxlKGVhckNvbXBvbmVudCkpIHsKLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCi0JCQkJCUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IGNvbXBvbmVudHNUb0FkZCA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+KCk7Ci0JCQkJCUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IGNvbXBvbmVudHNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+KCk7Ci0KLQkJCQkJZm9yIChJdGVyYXRvciBzZWxlY3Rpb25JdGVyYXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBzZWxlY3Rpb25JdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3Qgc291cmNlT2JqZWN0ID0gc2VsZWN0aW9uSXRlcmF0b3IubmV4dCgpOwotCi0JCQkJCQlpZiAoc291cmNlT2JqZWN0IGluc3RhbmNlb2YgSmFyUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJCQkJCUphclBhY2thZ2VGcmFnbWVudFJvb3QgamFyUGFja2FnZUZyYWdtZW50ID0gKEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHNvdXJjZU9iamVjdDsKLQotCQkJCQkJCVN0cmluZyB0eXBlID0gVmlydHVhbEFyY2hpdmVDb21wb25lbnQuTElCQVJDSElWRVRZUEUgKyBJUGF0aC5TRVBBUkFUT1I7Ci0JCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgYXJjaGl2ZSA9IENvbXBvbmVudENvcmUuY3JlYXRlQXJjaGl2ZUNvbXBvbmVudChlYXJDb21wb25lbnQuZ2V0UHJvamVjdCgpLCB0eXBlICsgamFyUGFja2FnZUZyYWdtZW50LmdldFBhdGgoKS50b1N0cmluZygpKTsKLQkJCQkJCQljb21wb25lbnRzVG9BZGQuYWRkKGFyY2hpdmUpOwotCQkJCQkJfSBlbHNlIGlmIChzb3VyY2VPYmplY3QgaW5zdGFuY2VvZiBJVmlydHVhbFJlZmVyZW5jZSkgewotCQkJCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChJVmlydHVhbFJlZmVyZW5jZSkgc291cmNlT2JqZWN0OwotCQkJCQkJCWlmIChyZXNvbHZlQ29uZmxpY3RzKSB7Ci0JCQkJCQkJCXN0YXR1cyA9IHJlc29sdmVDb25mbGljdHMocmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKSk7Ci0JCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlJVmlydHVhbENvbXBvbmVudCBhcmNoaXZlID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCQljb21wb25lbnRzVG9SZW1vdmUuYWRkKGFyY2hpdmUpOwotCQkJCQkJCXN0YXR1cyA9IHJlbW92ZUNvbXBvbmVudHNGcm9tRWFyKGNvbXBvbmVudHNUb1JlbW92ZSwgcmVmZXJlbmNlLmdldFJ1bnRpbWVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCQkJCWNvbXBvbmVudHNUb0FkZC5hZGQoYXJjaGl2ZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUlQcm9qZWN0IHByb2plY3RUb0FkZCA9IGdldFByb2plY3Qoc291cmNlT2JqZWN0KTsKLQkJCQkJCQlpZiAocmVzb2x2ZUNvbmZsaWN0cykgewotCQkJCQkJCQlzdGF0dXMgPSByZXNvbHZlQ29uZmxpY3RzKENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3RUb0FkZCkpOwotCQkJCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY29tcG9uZW50c1RvQWRkLmFkZChDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0VG9BZGQpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmICghY29tcG9uZW50c1RvQWRkLmlzRW1wdHkoKSkgewotCQkJCQkJc3RhdHVzID0gYWRkQ29tcG9uZW50c1RvRWFyKGNvbXBvbmVudHNUb0FkZCwgbGliRGlyKTsKLQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIHN0YXR1czsKLQkJCQl9Ci0KLQkJCX07Ci0JCQlzZXJ2aWNlLnNob3dJbkRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIGFkZFByb2plY3RUb0VhckpvYik7Ci0JCQlhZGRQcm9qZWN0VG9FYXJKb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJCWFkZFByb2plY3RUb0VhckpvYi5zY2hlZHVsZSgpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRHJvcChPYmplY3QgdGFyZ2V0LCBpbnQgb3BlcmF0aW9uLCBUcmFuc2ZlckRhdGEgdHJhbnNmZXJUeXBlKSB7Ci0JCWxpYkRpciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyVHlwZSkgfHwgUGx1Z2luVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJUeXBlKSkgewotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBMb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQllYXJQcm9qZWN0ID0gZ2V0UHJvamVjdCh0YXJnZXQpOwotCQkJCWlmIChlYXJQcm9qZWN0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCX0KLQkJCQllYXJDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChlYXJQcm9qZWN0KTsKLQkJCQlpbnQgZWFyVmVyc2lvbiA9IGdldEVhclZlcnNpb24oZWFyUHJvamVjdCk7Ci0JCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIEJ1bmRsZWROb2RlICYmICgoQnVuZGxlZE5vZGUpIHRhcmdldCkuZ2V0QnVuZGxlZExpYnNEaXJlY3RvcnlOb2RlKCkgPT0gbnVsbCkgewotCQkJCQlsaWJEaXIgPSAoKEFwcGxpY2F0aW9uKSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKGVhclByb2plY3QpLmdldE1vZGVsT2JqZWN0KCkpLmdldExpYnJhcnlEaXJlY3RvcnkoKTsKLQkJCQkJaWYgKGxpYkRpciA9PSBudWxsKSB7Ci0JCQkJCQlsaWJEaXIgPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkVBUl9ERUZBVUxUX0xJQl9ESVIpLm1ha2VSZWxhdGl2ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCi0JCQkJCS8vY2hlY2sgaWYgbGlicmFyeSBpcyBwaHlzaWNhbGx5IHByZXNlbnQgaW4gdGhlIEVhciBwYXRoCi0JCQkJCWlmIChJVmlydHVhbFJlZmVyZW5jZS5jbGFzcy5pc0luc3RhbmNlKG5leHQpKXsKLQkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHJlZmVyZW5jZWRDb21wb25lbnQgPSAoKElWaXJ0dWFsUmVmZXJlbmNlKW5leHQpLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCQkJCWlmIChyZWZlcmVuY2VkQ29tcG9uZW50LmlzQmluYXJ5KCkgJiYgVmlydHVhbEFyY2hpdmVDb21wb25lbnQuY2xhc3MuaXNJbnN0YW5jZShyZWZlcmVuY2VkQ29tcG9uZW50KSl7Ci0JCQkJCQkJaWYgKGlzUGh5c2ljYWxseUFkZGVkKChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCkgcmVmZXJlbmNlZENvbXBvbmVudCkpewotCQkJCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBJVmlydHVhbFJlZmVyZW5jZSkgewotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQotCQkJCQkvKgotCQkJCQkgKiBDaGVjayBpZiB3ZSB0cnkgdG8gYWRkIGEgSmFyUGFja2FnZUZyYWdtZW50IHRoYXQgaXMKLQkJCQkJICogYWxyZWFkeSByZWZlcmVuY2VkCi0JCQkJCSAqLwotCQkJCQlpZiAobmV4dCBpbnN0YW5jZW9mIEphclBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQkJCUphclBhY2thZ2VGcmFnbWVudFJvb3QgamFyID0gKEphclBhY2thZ2VGcmFnbWVudFJvb3QpIG5leHQ7Ci0JCQkJCQlmb3IgKElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSA6IGVhckNvbXBvbmVudC5nZXRSZWZlcmVuY2VzKCkpIHsKLQkJCQkJCQlpZiAocmVmZXJlbmNlLmdldEFyY2hpdmVOYW1lKCkuZXF1YWxzKGphci5nZXRFbGVtZW50TmFtZSgpKSkgewotCQkJCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQotCQkJCQkvKgotCQkJCQkgKiBDaGVjayBpZiB3ZSB0cnkgdG8gYWRkIGEgbW9kdWxlIHRoYXQgaXMgYWxyZWFkeQotCQkJCQkgKiByZWZlcmVuY2VkIGJ5IHRoZSBlYXIgYnV0IGF0IHRoZSBzYW1lIHRpbWUgYWxsb3cgdG8KLQkJCQkJICogY2hhbmdlIGl0cyBsb2NhdGlvbiBmcm9tIHRoZSByb290IHRvIHRoZSBsaWIgZGlyZWN0b3J5Ci0JCQkJCSAqIGFuZCB0aGUgb3Bwb3NpdGUuCi0JCQkJCSAqLwotCQkJCQlJUHJvamVjdCBwcm9qZWN0VG9BZGQgPSBnZXRQcm9qZWN0KG5leHQpOwotCQkJCQloYXNDb25mbGljdGluZ1Byb2plY3RJbk1ldGFJbmYoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdFRvQWRkKSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKElQcm9qZWN0IHJlZmVyZW5jZWRQcm9qZWN0IDogZWFyUHJvamVjdC5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKSkgewotCQkJCQkJCWlmIChyZWZlcmVuY2VkUHJvamVjdCA9PSBwcm9qZWN0VG9BZGQpIHsKLQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogZS50b1N0cmluZygpOwotCQkJCQkJc3RhdHVzID0gSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBtc2csIGUpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKChzdGF0dXMgPSB2YWxpZGF0ZVByb2plY3RNYXlCZUFkZGVkKGVhclByb2plY3QsIHByb2plY3RUb0FkZCwgZWFyVmVyc2lvbikpLmlzT0soKSkKLQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNQaHlzaWNhbGx5QWRkZWQoVmlydHVhbEFyY2hpdmVDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXRyeSB7Ci0JCQljb21wb25lbnQuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9CQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldAotCSAqLwotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVByb2plY3RNYXlCZUFkZGVkKElQcm9qZWN0IGVhclByb2plY3QsIElQcm9qZWN0IHByb2plY3RUb0FkZCwgaW50IGVhclZlcnNpb24pIHsKLQkJaWYgKGVhclByb2plY3QgPT0gbnVsbCB8fCBwcm9qZWN0VG9BZGQgPT0gbnVsbCB8fCBlYXJWZXJzaW9uIDwgMCkKLQkJCXJldHVybiBKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIE1lc3NhZ2VzLkFkZFByb2plY3RUb0VBUkRyb3BBc3Npc3RhbnRfQ291bGRfbm90X2FkZF9tb2R1bGVfdG9fRW50ZXJwcmlzZV8sIG51bGwpOwotCQllbHNlIGlmICghZWFyUHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJcmV0dXJuIEoyRUVOYXZpZ2F0b3JQbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoMCwgTkxTLmJpbmQoTWVzc2FnZXMuQWRkUHJvamVjdFRvRUFSRHJvcEFzc2lzdGFudF9UaGVfcHJvamVjdF8wX2Nhbm5vdF9iZV9hY2Nlc3NlXywgZWFyUHJvamVjdC5nZXROYW1lKCkpLCBudWxsKTsKLQkJfSBlbHNlIGlmICghcHJvamVjdFRvQWRkLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlyZXR1cm4gSjJFRU5hdmlnYXRvclBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cygwLCBNZXNzYWdlcy5BZGRQcm9qZWN0VG9FQVJEcm9wQXNzaXN0YW50X1RoZV9kcmFnZ2VkX3Byb2plY3RfY2Fubm90X2JlX2FkZGVkXywgbnVsbCk7Ci0JCX0KLQotCQlJU3RhdHVzIGlzVmFsaWQgPSB2YWxpZGF0ZVByb2plY3RUb0FkZChwcm9qZWN0VG9BZGQsIGVhclZlcnNpb24pOwotCQlpZiAoIWlzVmFsaWQuaXNPSygpKSB7Ci0JCQlyZXR1cm4gaXNWYWxpZDsKLQkJfQotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiAtMSBvbiBlcnJvcgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0RWFyVmVyc2lvbihJUHJvamVjdCBlYXJQcm9qZWN0KSB7Ci0JCWludCBlYXJWZXJzaW9uID0gLTE7Ci0JCUlNb2RlbFByb3ZpZGVyIG1vZGVsUHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKGVhclByb2plY3QpOwotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoZWFyUHJvamVjdCk7Ci0KLQkJCWlmIChmYWNldGVkUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJZG91YmxlIGRvdWJsZTEgPSBEb3VibGUucGFyc2VEb3VibGUoZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihFQVJGYWNldFV0aWxzLkVBUl9GQUNFVCkuZ2V0VmVyc2lvblN0cmluZygpKTsKLQkJCQllYXJWZXJzaW9uID0gKGludCkgKGRvdWJsZTEgKiAxMCk7Ci0JCQl9IGVsc2UgewotCQkJCUpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5sb2dFcnJvcigiQ291bGQgbm90IGFjcXVpcmUgbW9kZWwgZWxlbWVudHMgZm9yIHByb2plY3QgXCIiICsgZWFyUHJvamVjdC5nZXROYW1lKCkgKyAiXCIuIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQlTdHJpbmcgbXNnID0gZTEuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBlMS5nZXRNZXNzYWdlKCkgOiBlMS50b1N0cmluZygpOwotCQkJSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZ0Vycm9yKG1zZywgZTEpOwotCQl9Ci0KLQkJcmV0dXJuIGVhclZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZhY2V0ZWRQcm9qZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc0VhckZhY2V0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQlTdHJpbmcgbXNnID0gZTEuZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBlMS5nZXRNZXNzYWdlKCkgOiBlMS50b1N0cmluZygpOwotCQkJSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZ0Vycm9yKG1zZywgZTEpOwotCQl9Ci0JCXJldHVybiBmYWNldGVkUHJvamVjdCAhPSBudWxsICYmIGZhY2V0ZWRQcm9qZWN0Lmhhc1Byb2plY3RGYWNldChFQVJGYWNldFV0aWxzLkVBUl9GQUNFVCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBjYWxjdWxhdGVWYWxpZFByb2plY3ROYW1lKGZpbmFsIFN0cmluZyBvcmlnaW5hbE5hbWUpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCVN0cmluZyB2YWxpZE5hbWUgPSBvcmlnaW5hbE5hbWU7Ci0JCWludCBjb3VudCA9IDE7Ci0JCXdoaWxlIChyb290LmdldFByb2plY3QodmFsaWROYW1lKS5leGlzdHMoKSkgewotCQkJdmFsaWROYW1lID0gb3JpZ2luYWxOYW1lICsgY291bnQrKzsKLQkJfQotCQlyZXR1cm4gdmFsaWROYW1lOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Sm9iVGl0bGUoSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50KSB7Ci0JCXJldHVybiBOTFMuYmluZChNZXNzYWdlcy5BZGRNb2R1bGVUb0VhckRyb3BBc3Npc3RhbnRfQWRkaW5nX21vZHVsZV90b19lYV8sIGVhckNvbXBvbmVudC5nZXROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlUHJvamVjdFRvQWRkKElQcm9qZWN0IHByb2plY3RUb0FkZCwgaW50IGVhclZlcnNpb24pIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQl0cnkgewotCQkJLy8gY2hlY2sgaWYgdGhlIHByb2plY3QgdG8gYWRkIGlzIG5vdCBhbiBFQVIgaXRzZWxmCi0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdFRvQWRkKTsKLQkJCWlmIChmYWNldGVkUHJvamVjdCA9PSBudWxsKSB7Ci0JCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdFRvQWRkLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBqYXZhZmFjZXR2ZXJzaW9uID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuSlNUX0pBVkEpLmdldERlZmF1bHRWZXJzaW9uKCk7Ci0JCQkJZmFjZXRlZFByb2plY3QuaW5zdGFsbFByb2plY3RGYWNldChqYXZhZmFjZXR2ZXJzaW9uLCBudWxsLCBudWxsKTsKLQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiB1dGlsaXR5ZmFjZXR2ZXJzaW9uID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuSlNUX1VUSUxJVFlfTU9EVUxFKS5nZXREZWZhdWx0VmVyc2lvbigpOwotCQkJCWZhY2V0ZWRQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQodXRpbGl0eWZhY2V0dmVyc2lvbiwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCQlpZiAoZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KEVBUkZhY2V0VXRpbHMuRUFSX0ZBQ0VUKSkKLQkJCQlzdGF0dXMgPSBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCWVsc2UKLQkJCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCQkvLyBjaGVjayBpZiB0aGUgcHJvamVjdCB0byBhZGQgaXMgd2l0aCBKYXZhIEVFIHZlcnNpb24gZXF1YWwgb3IKLQkJCS8vIGxlc3NlciB0aGFuIHRoYXQgb2YgdGhlIEVBUgotCQkJU3RyaW5nIHZlclN0ciA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVQcm9qZWN0VmVyc2lvbihwcm9qZWN0VG9BZGQpOwotCQkJaWYgKHZlclN0ciAhPSBudWxsKSB7Ci0JCQkJaW50IHZlcnNpb247Ci0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzQXBwbGljYXRpb25DbGllbnRQcm9qZWN0KHByb2plY3RUb0FkZCkpCi0JCQkJCXZlcnNpb24gPSBKMkVFVmVyc2lvblV0aWwuY29udmVydEFwcENsaWVudFZlcnNpb25TdHJpbmdUb0oyRUVWZXJzaW9uSUQodmVyU3RyKTsKLQkJCQllbHNlIGlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QocHJvamVjdFRvQWRkKSkKLQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0RUpCVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJTdHIpOwotCQkJCWVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdFRvQWRkKSkKLQkJCQkJdmVyc2lvbiA9IEoyRUVWZXJzaW9uVXRpbC5jb252ZXJ0V2ViVmVyc2lvblN0cmluZ1RvSjJFRVZlcnNpb25JRCh2ZXJTdHIpOwotCQkJCWVsc2UgaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzSkNBUHJvamVjdChwcm9qZWN0VG9BZGQpKQotCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRDb25uZWN0b3JWZXJzaW9uU3RyaW5nVG9KMkVFVmVyc2lvbklEKHZlclN0cik7Ci0JCQkJZWxzZQotCQkJCQl2ZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uU3RyaW5nVG9JbnQodmVyU3RyKTsKLQotCQkJCWlmICh2ZXJzaW9uID4gZWFyVmVyc2lvbikKLQkJCQkJc3RhdHVzID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJZWxzZQotCQkJCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQlzdGF0dXMgPSBKMkVFTmF2aWdhdG9yUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKDAsIG1zZywgZSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpCi0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoSVBST0pFQ1RfQ0xBU1MpOwotCQllbHNlCi0JCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIoZWxlbWVudCwgSVBST0pFQ1RfQ0xBU1MpOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWJzdHJhY3RFYXJOb2RlKSB7Ci0JCQlwcm9qZWN0ID0gKChBYnN0cmFjdEVhck5vZGUpIGVsZW1lbnQpLmdldEVhclByb2plY3QoKTsKLQkJfQotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgR3JvdXBFQVJQcm92aWRlcikgewotCQkJcHJvamVjdCA9ICgoR3JvdXBFQVJQcm92aWRlcikgZWxlbWVudCkuZ2V0UHJvamVjdCgpOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJVmlydHVhbFJlZmVyZW5jZSkgewotCQkJcHJvamVjdCA9ICgoSVZpcnR1YWxSZWZlcmVuY2UpIGVsZW1lbnQpLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KChFT2JqZWN0KSBlbGVtZW50KTsKLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEoyRUVJdGVtUHJvdmlkZXIpIHsKLQkJCQlJRmlsZSBhc3NvY2lhdGVkRmlsZSA9ICgoSjJFRUl0ZW1Qcm92aWRlcikgZWxlbWVudCkuZ2V0QXNzb2NpYXRlZEZpbGUoKTsKLQkJCQlpZiAoYXNzb2NpYXRlZEZpbGUgIT0gbnVsbCkKLQkJCQkJcHJvamVjdCA9IGFzc29jaWF0ZWRGaWxlLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0VVJJKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gY29tcG9uZW50LmdldFByb2plY3QoKTsKLQkJU3RyaW5nIG5hbWUgPSBjb21wb25lbnQuZ2V0TmFtZSgpOwotCi0JCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQluYW1lICs9IElNb2R1bGVFeHRlbnNpb25zLkRPVF9XQVI7Ci0JCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQluYW1lICs9IElNb2R1bGVFeHRlbnNpb25zLkRPVF9FQVI7Ci0JCX0gZWxzZSBpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQluYW1lICs9IElNb2R1bGVFeHRlbnNpb25zLkRPVF9SQVI7Ci0JCX0gZWxzZSB7Ci0JCQluYW1lICs9IElNb2R1bGVFeHRlbnNpb25zLkRPVF9KQVI7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0NvbmZsaWN0aW5nUHJvamVjdEluTWV0YUluZihPYmplY3QgbGliKSB7Ci0JCUlQcm9qZWN0IGxpYlByb2ogPSBudWxsOyAKLQkJCWlmIChsaWIgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCWxpYlByb2ogPSAoSVByb2plY3QpIGxpYjsgCi0JCQl9IGVsc2UgaWYgKGxpYiBpbnN0YW5jZW9mIElWaXJ0dWFsQ29tcG9uZW50KSB7Ci0JCQkJbGliUHJvaiA9ICgoSVZpcnR1YWxDb21wb25lbnQpIGxpYikuZ2V0UHJvamVjdCgpOyAKLQkJCX0gZWxzZSBpZiAobGliIGluc3RhbmNlb2YgSVZpcnR1YWxSZWZlcmVuY2UpewotCQkJCWxpYlByb2ogPSAoKElWaXJ0dWFsUmVmZXJlbmNlKSBsaWIpLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCWlmKGxpYlByb2ogPT0gbnVsbCl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSVByb2plY3QgZWFyUHJvamVjdCA9IGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdFtdIGVhclJlZlByb2plY3RzID0gZWFyUHJvamVjdC5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWFyUmVmUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChlYXJSZWZQcm9qZWN0c1tpXSkgJiYgIWVhclJlZlByb2plY3RzW2ldLmVxdWFscyhsaWJQcm9qKSkgewotCQkJCQlJVmlydHVhbENvbXBvbmVudCBjbXAxID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUmVmUHJvamVjdHNbaV0pOwotCQkJCQlpZiAoY21wMSA9PSBudWxsKXsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNtcDEuZ2V0UmVmZXJlbmNlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmIChyZWZzW2pdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5nZXRQcm9qZWN0KCkuZXF1YWxzKGxpYlByb2opKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlpbnQgayA9IDA7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGFkZENvbXBvbmVudHNUb0VhcihMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjb21wb25lbnRzLCBTdHJpbmcgbGliRGlyKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJSURhdGFNb2RlbCBkYXRhbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQotCQlNYXAgY29tcG9uZW50VG9VUklNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlJVmlydHVhbENvbXBvbmVudCBtb2R1bGVDb21wb25lbnQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCW1vZHVsZUNvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgaXRyLm5leHQoKTsKLQkJCWNvbXBvbmVudFRvVVJJTWFwLnB1dChtb2R1bGVDb21wb25lbnQsIGdldERlZmF1bHRVUkkobW9kdWxlQ29tcG9uZW50KSk7Ci0JCX0KLQkJZGF0YW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBlYXJDb21wb25lbnQpOwotCQlkYXRhbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgY29tcG9uZW50cyk7Ci0JCWRhdGFtb2RlbC5zZXRQcm9wZXJ0eShJQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRTX1RPX1VSSV9NQVAsIGNvbXBvbmVudFRvVVJJTWFwKTsKLQkJU3RyaW5nIGxpYkRpclBhdGggPSBsaWJEaXI7IAotCQlpZihsaWJEaXIgIT0gbnVsbCAmJiBsaWJEaXIubGVuZ3RoKCkgPiAwKQotCQkJbGliRGlyUGF0aCA9IG5ldyBQYXRoKGxpYkRpcikubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKTsKLQkJZGF0YW1vZGVsLnNldFByb3BlcnR5KElBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgsIGxpYkRpclBhdGgpOwotCQl0cnkgewotCQkJcmV0dXJuIGRhdGFtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQlKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3IobXNnLCBlKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJlbW92ZUNvbXBvbmVudHNGcm9tRWFyKExpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IGNvbXBvbmVudHMsIFN0cmluZyBsaWJEaXIpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlJRGF0YU1vZGVsIGRhdGFtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSZW1vdmVDb21wb25lbnRGcm9tRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWRhdGFtb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgZWFyQ29tcG9uZW50KTsKLQkJZGF0YW1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIGNvbXBvbmVudHMpOwotCQl0cnkgewotCQkJc3RhdHVzID0gZGF0YW1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQlKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3IobXNnLCBlKTsKLQkJfQotCQlyZXR1cm4gcmVtb3ZlUmVmZXJlbmNlcyhjb21wb25lbnRzLCBsaWJEaXIsIGVhckNvbXBvbmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcmVtb3ZlUmVmZXJlbmNlcyhMaXN0PElWaXJ0dWFsQ29tcG9uZW50PiBjb21wb25lbnRzLCBTdHJpbmcgbGliRGlyLCBJVmlydHVhbENvbXBvbmVudCBzb3VyY2VDb21wb25lbnQpIHsKLQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZzID0gc291cmNlQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJZm9yIChJVmlydHVhbFJlZmVyZW5jZSByZWYgOiByZWZzKSB7Ci0JCQlyZWYuZ2V0UnVudGltZVBhdGgoKTsKLQkJfQotCQlNYXAgY29tcG9uZW50VG9VUklNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZUNvbXBvbmVudCA9IChJVmlydHVhbENvbXBvbmVudCkgaXRyLm5leHQoKTsKLQkJCWNvbXBvbmVudFRvVVJJTWFwLnB1dChtb2R1bGVDb21wb25lbnQsIGdldERlZmF1bHRVUkkobW9kdWxlQ29tcG9uZW50KSk7Ci0JCX0KLQkJZmluYWwgSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBSZW1vdmVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfVE9fVVJJX01BUCwgY29tcG9uZW50VG9VUklNYXApOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuU09VUkNFX0NPTVBPTkVOVCwgc291cmNlQ29tcG9uZW50KTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNyZWF0ZVJlZmVyZW5jZUNvbXBvbmVudHNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9DT01QT05FTlRfTElTVCwgY29tcG9uZW50cyk7Ci0JCWlmIChsaWJEaXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQltb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVFNfREVQTE9ZX1BBVEgsIG5ldyBQYXRoKGxpYkRpcikubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJldHVybiBtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQlKRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkubG9nRXJyb3IobXNnLCBlKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcmVzb2x2ZUNvbmZsaWN0cyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJSVByb2plY3QgZWFyUHJvamVjdCA9IGVhckNvbXBvbmVudC5nZXRQcm9qZWN0KCk7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdFtdIGVhclJlZlByb2plY3RzID0gZWFyUHJvamVjdC5nZXRSZWZlcmVuY2VkUHJvamVjdHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWFyUmVmUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChlYXJSZWZQcm9qZWN0c1tpXSkpIHsKLQkJCQkJSVZpcnR1YWxDb21wb25lbnQgY21wMSA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVhclJlZlByb2plY3RzW2ldKTsKLQkJCQkJaWYoY21wMSA9PSBudWxsKXsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gcmVmcyA9IGNtcDEuZ2V0UmVmZXJlbmNlcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmIChyZWZzW2pdLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKS5lcXVhbHMoY29tcG9uZW50KSkgewotCQkJCQkJCUxpc3Q8SVZpcnR1YWxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0PElWaXJ0dWFsQ29tcG9uZW50PigpOwotCQkJCQkJCWNvbXBvbmVudHMuYWRkKHJlZnNbal0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpKTsKLQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHJlbW92ZVJlZmVyZW5jZXMoY29tcG9uZW50cywgcmVmc1tqXS5nZXRSdW50aW1lUGF0aCgpLnRvU3RyaW5nKCksIHJlZnNbal0uZ2V0RW5jbG9zaW5nQ29tcG9uZW50KCkpOwotCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJCQkJCX0KLQkJCQkJCQl0cnkgewotCQkJCQkJCQlyZW1vdmVNYW5pZmVzdERlcGVuZGVuY3kocmVmc1tqXS5nZXRFbmNsb3NpbmdDb21wb25lbnQoKSwgcmVmc1tqXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkpOwotCQkJCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQkJCUpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5sb2dFcnJvcihtc2csIGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJaW50IGsgPSAwOwotCQl9Ci0JCS8vIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1hbmlmZXN0RGVwZW5kZW5jeShmaW5hbCBJVmlydHVhbENvbXBvbmVudCBzb3VyY2UsIGZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHRhcmdldCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBzb3VyY2VQcm9qTmFtZSA9IHNvdXJjZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgdGFyZ2V0UHJvak5hbWU7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHsKLQkJCXRhcmdldFByb2pOYW1lID0gKChKMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQpIHRhcmdldCkuZ2V0TmFtZSgpOwotCQkJU3RyaW5nW10gcGF0aFNlZ21lbnRzID0gdGFyZ2V0UHJvak5hbWUuc3BsaXQoIiIgKyBJUGF0aC5TRVBBUkFUT1IpOyAvLyROT04tTkxTLTEkCi0JCQl0YXJnZXRQcm9qTmFtZSA9IHBhdGhTZWdtZW50c1twYXRoU2VnbWVudHMubGVuZ3RoIC0gMV07Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRQcm9qTmFtZSA9IHRhcmdldC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCWZpbmFsIElGaWxlIG1hbmlmZXN0bWYgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRNYW5pZmVzdEZpbGUoc291cmNlLmdldFByb2plY3QoKSk7Ci0JCWZpbmFsIEFyY2hpdmVNYW5pZmVzdCBtZiA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLnJlYWRNYW5pZmVzdChzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKG1mID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIElEYXRhTW9kZWwgdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuc2V0UHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgc291cmNlUHJvak5hbWUpOwotCQl1cGRhdGVNYW5pZmVzdERhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoVXBkYXRlTWFuaWZlc3REYXRhTW9kZWxQcm9wZXJ0aWVzLk1FUkdFLCBmYWxzZSk7Ci0JCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5NQU5JRkVTVF9GSUxFLCBtYW5pZmVzdG1mKTsKLQkJU3RyaW5nW10gY3AgPSBtZi5nZXRDbGFzc1BhdGhUb2tlbml6ZWQoKTsKLQkJTGlzdCBjcExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZyBjcFRvUmVtb3ZlID0gKHRhcmdldFByb2pOYW1lLmVuZHNXaXRoKElKMkVFTW9kdWxlQ29uc3RhbnRzLkpBUl9FWFQpKSA/IAotCQkJCXRhcmdldFByb2pOYW1lIDogdGFyZ2V0UHJvak5hbWUgKyBJSjJFRU1vZHVsZUNvbnN0YW50cy5KQVJfRVhUOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNwLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWNwW2ldLmVxdWFscyhjcFRvUmVtb3ZlKSkgewotCQkJCWNwTGlzdC5hZGQoY3BbaV0pOwotCQkJfQotCQl9Ci0JCXVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsLnNldFByb3BlcnR5KFVwZGF0ZU1hbmlmZXN0RGF0YU1vZGVsUHJvcGVydGllcy5KQVJfTElTVCwgY3BMaXN0KTsKLQkJdXBkYXRlTWFuaWZlc3REYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9kbmQvSU1vZHVsZUV4dGVuc2lvbnMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZG5kL0lNb2R1bGVFeHRlbnNpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YWUxNTUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9kbmQvSU1vZHVsZUV4dGVuc2lvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmRuZDsKLQotcHVibGljIGludGVyZmFjZSBJTW9kdWxlRXh0ZW5zaW9ucyB7Ci0KLQlTdHJpbmcgRE9UX1dBUiA9ICIud2FyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBET1RfSkFSID0gIi5qYXIiOyAvLyROT04tTkxTLTEkIAotCVN0cmluZyBET1RfUkFSID0gIi5yYXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERPVF9FQVIgPSAiLmVhciI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL0Fic3RyYWN0RWFyTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvQWJzdHJhY3RFYXJOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNGZkOTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvQWJzdHJhY3RFYXJOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuSmF2YUVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi0vKioKLSAqIEBhdXRob3IgZ29ybW92Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFYXJOb2RlIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVBUl9ERUZBVUxUX0xJQiA9ICJsaWIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGludCBNT0RVTEVTX1RZUEUgPSAwOyAgICAKLQlwdWJsaWMgc3RhdGljIGludCBMSUJTX1RZUEUgPSAxOwotCi0JcHJvdGVjdGVkIGludCB0eXBlOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZVR5cGVzID0KLQkJQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAgCi0JCQkJSU1vZHVsZUNvbnN0YW50cy5KU1RfQVBQQ0xJRU5UX01PRFVMRSwKLQkJCQlJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFLAotCQkJCUlNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEUsCi0JCQkJSU1vZHVsZUNvbnN0YW50cy5KU1RfQ09OTkVDVE9SX01PRFVMRX0pOwotCi0JcHJpdmF0ZSBJUHJvamVjdCBlYXJQcm9qZWN0OwotCi0JcHVibGljIEFic3RyYWN0RWFyTm9kZShJUHJvamVjdCBlYXJQcm9qZWN0KSB7Ci0JCXRoaXMuZWFyUHJvamVjdCA9IGVhclByb2plY3Q7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldEVhclByb2plY3QoKSB7Ci0JCXJldHVybiBlYXJQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBMaXN0IGdldE1vZHVsZXMoKTsKLQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFRleHQoKTsKLQotCXByb3RlY3RlZCBMaXN0IGdldENvbXBvbmVudFJlZmVyZW5jZXNBc0xpc3QoTGlzdCBjb21wb25lbnRUeXBlcywgSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJTGlzdCBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQgPSB2aXJ0dWFsQ29tcG9uZW50OwotCQlpZiAoZWFyQ29tcG9uZW50ICE9IG51bGwgKSB7Ci0JCQlJUGF0aCByZWxhdGl2ZVJ1bnRpbWVQYXRoID0gbnVsbDsKLQkJCWlmIChydW50aW1lUGF0aCAhPSBudWxsKXsKLQkJCQlyZWxhdGl2ZVJ1bnRpbWVQYXRoID0gcnVudGltZVBhdGgubWFrZVJlbGF0aXZlKCk7Ci0JCQl9Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZkNvbXBvbmVudHMgPSBlYXJDb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZDb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVZpcnR1YWxDb21wb25lbnQgbW9kdWxlID0gcmVmQ29tcG9uZW50c1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCk7Ci0JCQkJaWYgKG1vZHVsZSA9PSBudWxsKSBjb250aW51ZTsKLQkJCQkvLyBpZiBjb21wb25lbnQgdHlwZXMgcGFzc2VkIGluIGlzIG51bGwgdGhlbiByZXR1cm4gYWxsIGNvbXBvbmVudHMKLQkJCQlpZiAoY29tcG9uZW50VHlwZXMgPT0gbnVsbCB8fCBjb21wb25lbnRUeXBlcy5zaXplKCkgPT0gMCkgewotCQkJCQljb21wb25lbnRzLmFkZChyZWZDb21wb25lbnRzW2ldKTsKLQkJCQl9IGVsc2UgaWYgKHJlbGF0aXZlUnVudGltZVBhdGggIT0gbnVsbCl7Ci0JCQkJCUlQYXRoIHJ1bnRpbWVQYXRoMiA9IGdldFJlYWxSdW50aW1lUGF0aChyZWZDb21wb25lbnRzW2ldKTsKLQkJCQkJaWYgKCFyZWxhdGl2ZVJ1bnRpbWVQYXRoLmlzRW1wdHkoKSAmJiBydW50aW1lUGF0aDIubWFrZVJlbGF0aXZlKCkuZXF1YWxzKHJlbGF0aXZlUnVudGltZVBhdGgpICYmIGNvbXBvbmVudFR5cGVzLmNvbnRhaW5zKEphdmFFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRUNvbXBvbmVudFR5cGUobW9kdWxlKSkpIHsKLQkJCQkJCWNvbXBvbmVudHMuYWRkKHJlZkNvbXBvbmVudHNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb21wb25lbnRzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGNvbXBsZXRlIGxpc3Qgb2YgdGhlIGJpbmFyaWVzIGNvbnRhaW5lZCBpbiB0aGUgbGliIGRpci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlydHVhbENvbXBvbmVudAotCSAqIEBwYXJhbSBydW50aW1lUGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRCaW5hcmllc0luTGliRGlyKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQsIElQYXRoIHJ1bnRpbWVQYXRoLCBMaXN0IGNvbXBvbmVudFR5cGVzKSB7Ci0JCUxpc3QgY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50ID0gdmlydHVhbENvbXBvbmVudDsKLQkJaWYgKGVhckNvbXBvbmVudCAhPSBudWxsICkgewotCQkJSVBhdGggcmVsYXRpdmVSdW50aW1lUGF0aCA9IG51bGw7Ci0JCQlpZiAocnVudGltZVBhdGggIT0gbnVsbCl7Ci0JCQkJcmVsYXRpdmVSdW50aW1lUGF0aCA9IHJ1bnRpbWVQYXRoLm1ha2VSZWxhdGl2ZSgpOwotCQkJfQotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZDb21wb25lbnRzID0gZWFyQ29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmQ29tcG9uZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZSA9IHJlZkNvbXBvbmVudHNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCWlmIChtb2R1bGUgPT0gbnVsbCkgY29udGludWU7Ci0JCQkJLy8gaWYgY29tcG9uZW50IHR5cGVzIHBhc3NlZCBpbiBpcyBudWxsIHRoZW4gcmV0dXJuIGFsbCBjb21wb25lbnRzCi0JCQkJaWYgKG1vZHVsZS5pc0JpbmFyeSgpICYmIHJlbGF0aXZlUnVudGltZVBhdGggIT0gbnVsbCAmJiAhcmVsYXRpdmVSdW50aW1lUGF0aC5pc0VtcHR5KCkgJiYgZ2V0UmVhbFJ1bnRpbWVQYXRoKHJlZkNvbXBvbmVudHNbaV0pLm1ha2VSZWxhdGl2ZSgpLmVxdWFscyhyZWxhdGl2ZVJ1bnRpbWVQYXRoKSkgewotCQkJCQlpZiAoY29tcG9uZW50VHlwZXMgIT0gbnVsbCAmJiAhY29tcG9uZW50VHlwZXMuY29udGFpbnMoSmF2YUVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFQ29tcG9uZW50VHlwZShtb2R1bGUpKSApIHsKLQkJCQkJCWlmIChydW50aW1lUGF0aCAhPSBudWxsICYmICFydW50aW1lUGF0aC5lcXVhbHMobmV3IFBhdGgoIi8iKSkpey8vJE5PTi1OTFMtMSQKLQkJCQkJCQljb21wb25lbnRzLmFkZChyZWZDb21wb25lbnRzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvbXBvbmVudHMuYWRkKHJlZkNvbXBvbmVudHNbaV0pOwotCQkJCQl9Ci0KLQotCQkJCX0gCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbXBvbmVudHM7Ci0JfQotCQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFsbCB0aGUgYmluYXJpZXMgY29udGFpbmVkIGluIHRoZSBsaWIgZGlyLgotCSAqIEl0IHdpbGwgbm90IGNvbnNpZGVyIG1vZHVsZXMgaW4gbGliIGRpciBhcyBsaWJyYXJpZXMgZm9yIHRoYXQgdXNlIAotCSAqIGdldEJpbmFyaWVzSW5MaWJEaXIoSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCwgSVBhdGggcnVudGltZVBhdGgsIExpc3QgY29tcG9uZW50VHlwZXMpCi0JICogCi0JICogQHBhcmFtIHZpcnR1YWxDb21wb25lbnQKLQkgKiBAcGFyYW0gcnVudGltZVBhdGgKLQkgKiBAcmV0dXJuCi0JICogQGRlcHJlY2F0ZWQgc2luY2UgaXQgaXMgbm90IHJldHVybmluZyB0aGUgY29tcGxldGUgbGlzdCBvZiBsaWJyYXJpZXMKLQkgKiAgdXNlOiBnZXRCaW5hcmllc0luTGliRGlyKElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQsIElQYXRoIHJ1bnRpbWVQYXRoLCBMaXN0IGNvbXBvbmVudFR5cGVzKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEJpbmFyaWVzSW5MaWJEaXIoSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXBvbmVudCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIGdldEJpbmFyaWVzSW5MaWJEaXIodmlydHVhbENvbXBvbmVudCwgcnVudGltZVBhdGgsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcmVjb21wdXRlTGliRm9sZGVyKElQcm9qZWN0IHByb2plY3QpewotCQlJTW9kZWxQcm92aWRlciBtb2RlbFByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihwcm9qZWN0KTsKLQkJT2JqZWN0IG1vZGVsT2JqZWN0ID0gbW9kZWxQcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQlpZiAoQXBwbGljYXRpb24uY2xhc3MuaXNJbnN0YW5jZShtb2RlbE9iamVjdCkpewotCQkJU3RyaW5nIGxpYnJhcnlEaXJlY3RvcnkgPSAoKEFwcGxpY2F0aW9uKW1vZGVsT2JqZWN0KS5nZXRMaWJyYXJ5RGlyZWN0b3J5KCk7Ci0JCQlyZXR1cm4gbGlicmFyeURpcmVjdG9yeSAhPSBudWxsID8gbGlicmFyeURpcmVjdG9yeSA6IEVBUl9ERUZBVUxUX0xJQjsKLQkJfQotCQlyZXR1cm4gRUFSX0RFRkFVTFRfTElCOwotCX0KLQotCXByb3RlY3RlZCBJUGF0aCBnZXRSZWFsUnVudGltZVBhdGgoSVZpcnR1YWxSZWZlcmVuY2UgdnIpewotCQlJUGF0aCBydW50aW1lUGF0aDIgPSB2ci5nZXRSdW50aW1lUGF0aCgpOwotCQlpZih2ci5nZXRBcmNoaXZlTmFtZSgpICE9IG51bGwpewotCQkJSVBhdGggbmFtZVBhdGggPSBuZXcgUGF0aCAodnIuZ2V0QXJjaGl2ZU5hbWUoKSk7Ci0JCQlpZiAobmFtZVBhdGguc2VnbWVudENvdW50KCk+MSAmJiBydW50aW1lUGF0aDIuc2VnbWVudENvdW50KCk9PTApewotCQkJCXJ1bnRpbWVQYXRoMiA9IG5ldyBQYXRoKCIvIituYW1lUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9Qb3J0YWJsZVN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBydW50aW1lUGF0aDI7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL0FwcGxpY2F0aW9uNVZpZXdlclNvcnRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvQXBwbGljYXRpb241Vmlld2VyU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZDExN2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvQXBwbGljYXRpb241Vmlld2VyU29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm5hdmlnYXRvci5pbnRlcm5hbC5BcHBsaWNhdGlvblZpZXdlclNvcnRlcjsKLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uNVZpZXdlclNvcnRlciBleHRlbmRzIEFwcGxpY2F0aW9uVmlld2VyU29ydGVyIHsKLSAgCi0gIHB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotICAgIGlmKGUxIGluc3RhbmNlb2YgQnVuZGxlZE5vZGUpewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmKGUyIGluc3RhbmNlb2YgQnVuZGxlZE5vZGUpewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvQnVuZGxlZE5vZGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL0J1bmRsZWROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYWM4MjAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvQnVuZGxlZE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotCi0vKioKLSAqIAotICogQnVuZGxlZCBMaWJyYXJpZXMgbm9kZS4gU3ViLW5vZGUgb2YgRUFSIDUgRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEJ1bmRsZWROb2RlIGV4dGVuZHMgQWJzdHJhY3RFYXJOb2RlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBVVElMSVRZID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChKMkVFUHJvamVjdFV0aWxpdGllcy5VVElMSVRZKTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBub2RlTmFtZTsKLQlwcml2YXRlIGZpbmFsIEJ1bmRsZWROb2RlIGJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZTsKLQotCQotCi0JcHVibGljIEJ1bmRsZWROb2RlKElQcm9qZWN0IGVhclByb2plY3QsIFN0cmluZyBub2RlTmFtZSwgQnVuZGxlZE5vZGUgYnVuZGxlZExpYnNEaXJlY3RvcnlOb2RlKSB7Ci0JCXN1cGVyKGVhclByb2plY3QpOwotCQl0aGlzLm5vZGVOYW1lID0gbm9kZU5hbWU7Ci0JCXRoaXMuYnVuZGxlZExpYnNEaXJlY3RvcnlOb2RlID0gYnVuZGxlZExpYnNEaXJlY3RvcnlOb2RlOwotCQl0eXBlID0gTElCU19UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBub2RlTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBub2RlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlZE5vZGUgZ2V0QnVuZGxlZExpYnNEaXJlY3RvcnlOb2RlKCkgewotCQlyZXR1cm4gYnVuZGxlZExpYnNEaXJlY3RvcnlOb2RlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0IGdldE1vZHVsZXMoKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHByb2plY3RDb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChnZXRFYXJQcm9qZWN0KCkpOwotCi0JCVBhdGggbGliUGF0aCA9IG5ldyBQYXRoKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZSA9PSBudWxsKXsKLQkJCWxpYlBhdGggPSBuZXcgUGF0aCgiLyIgKyByZWNvbXB1dGVMaWJGb2xkZXIoZ2V0RWFyUHJvamVjdCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJTGlzdCBsaWJzID0gZ2V0Q29tcG9uZW50UmVmZXJlbmNlc0FzTGlzdChVVElMSVRZLCBwcm9qZWN0Q29tcG9uZW50LAotCQkJCWxpYlBhdGgpOwotCQlsaWJzLmFkZEFsbChnZXRCaW5hcmllc0luTGliRGlyKHByb2plY3RDb21wb25lbnQsbGliUGF0aCwgVVRJTElUWSkpOwotCi0JCUxpc3QgbW9kdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaWJzLnNpemUoKTsgaSsrKSB7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSAoSVZpcnR1YWxSZWZlcmVuY2UpIGxpYnMuZ2V0KGkpOwotCQkJCi0JCQlJUGF0aCBydW50aW1lUGF0aCA9ICBnZXRSZWFsUnVudGltZVBhdGgocmVmZXJlbmNlKTsKLQotCQkJaWYgKHJ1bnRpbWVQYXRoICE9IG51bGwgJiYgcnVudGltZVBhdGguc2VnbWVudCgwKSAhPSBudWxsICYmICFsaWJQYXRoLm1ha2VSZWxhdGl2ZSgpLmlzRW1wdHkoKSAmJgotCQkJCQlydW50aW1lUGF0aC5tYWtlUmVsYXRpdmUoKS5lcXVhbHMobGliUGF0aC5tYWtlUmVsYXRpdmUoKSkpIHsKLQkJCQlpZiAoYnVuZGxlZExpYnNEaXJlY3RvcnlOb2RlID09IG51bGwpewotCQkJCQltb2R1bGVzLmFkZChsaWJzLmdldChpKSk7Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCWlmIChidW5kbGVkTGlic0RpcmVjdG9yeU5vZGUgIT0gbnVsbCl7Ci0JCQkJCW1vZHVsZXMuYWRkKGxpYnMuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZSAhPSBudWxsKXsKLQkJCW1vZHVsZXMuYWRkKGJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZSk7Ci0JCX0KLQkJcmV0dXJuIG1vZHVsZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9Hcm91cEVBUlByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9Hcm91cEVBUlByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NWQ0MmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvR3JvdXBFQVJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVhcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUlZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0R3JvdXBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogRWFyIDUgRGVwbG95bWVudCBkZXNjcmlwdG9yIG5vZGUuCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBFQVJQcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9SRUxBVElWRV9QQVRIID0gIk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFQVJfREVGQVVMVF9MSUIgPSAibGliIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEltYWdlIEVBUl9JTUFHRTsKLQlwcml2YXRlIEVBUlZpcnR1YWxDb21wb25lbnQgZWFyQ29tcG9uZW50OwotCXByaXZhdGUgSUZpbGUgZGRGaWxlOwotCQotCXByaXZhdGUgQnVuZGxlZE5vZGUgYnVuZGxlZExpYnNOb2RlOwotCXByaXZhdGUgTW9kdWxlc05vZGUgbW9kdWxlc05vZGU7Ci0JCi0JcHVibGljIEdyb3VwRUFSUHJvdmlkZXIoQXBwbGljYXRpb24gYXBwbGljYXRpb24sIEVBUlZpcnR1YWxDb21wb25lbnQgd3RwQ29tcG9uZW50KSB7Ci0JCXN1cGVyKGFwcGxpY2F0aW9uKTsKLQkJZWFyQ29tcG9uZW50ID0gd3RwQ29tcG9uZW50OwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZWFyQ29tcG9uZW50LmdldFByb2plY3QoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiAiRGVwbG95bWVudCBEZXNjcmlwdG9yOiAiICsgZWFyQ29tcG9uZW50LmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBFQVJWaXJ0dWFsQ29tcG9uZW50IGdldEVBUlZpcnR1YWxDb21wb25lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmVhckNvbXBvbmVudDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQotCQlJVmlydHVhbENvbXBvbmVudCBwcm9qZWN0Q29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCXRyeSB7Ci0JCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlpZiAoZmFjZXRlZFByb2plY3QgIT0gbnVsbCAmJiAKLQkJCQkJZmFjZXRlZFByb2plY3QuaGFzUHJvamVjdEZhY2V0KAotCQkJCQkJCVByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9FQVJfTU9EVUxFKS5nZXRWZXJzaW9uKAotCQkJCQkJCQkJSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81XzBfVEVYVCkpKSB7Ci0KLQkJCQlpZihidW5kbGVkTGlic05vZGUgPT0gbnVsbCl7Ci0JCQkJCUJ1bmRsZWROb2RlIGJ1bmRsZWRMaWJzRGlyZWN0b3J5Tm9kZSA9IG5ldyBCdW5kbGVkTm9kZShwcm9qZWN0LCBNZXNzYWdlcy5MSUJSQVJZX0RJUkVDVE9SWSArICI6IC8iICsgRUFSX0RFRkFVTFRfTElCLCBudWxsKTsvLyROT04tTkxTLTEkCi0JCQkJCWJ1bmRsZWRMaWJzTm9kZSA9IG5ldyBCdW5kbGVkTm9kZShwcm9qZWN0LCBNZXNzYWdlcy5CVU5ETEVEX0xJQlJBUklFU19OT0RFLCBidW5kbGVkTGlic0RpcmVjdG9yeU5vZGUpOwotCQkJCX0KLQkJCQkKLQkJCQlpZihtb2R1bGVzTm9kZSA9PSBudWxsKXsKLQkJCQkJbW9kdWxlc05vZGUgPSBuZXcgTW9kdWxlc05vZGUocHJvamVjdCk7Ci0JCQkJfQotCQkJCQotCi0JCQkJY2hpbGRyZW4uYWRkKG1vZHVsZXNOb2RlKTsKLQkJCQljaGlsZHJlbi5hZGQoYnVuZGxlZExpYnNOb2RlKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gIkVycm9yIGluIHRoZSBKRUVDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKSBmb3IgcGFyZW50OiIgKyAgdGhpczsgLy8kTk9OLU5MUy0xJAotCQkJSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmxvZ0Vycm9yKG1zZywgZSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGdldEVhckltYWdlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRFYXJJbWFnZSgpIHsKLQkJaWYgKEVBUl9JTUFHRSA9PSBudWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKRUVVSVBsdWdpbkljb25zLkVBUl9JTUFHRSk7Ci0JCQlFQVJfSU1BR0UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gRUFSX0lNQUdFOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gIWdldENoaWxkcmVuKCkuaXNFbXB0eSgpOwotCX0KLQlwdWJsaWMgSUZpbGUgZ2V0RERGaWxlKCkgewotCQlpZiAoZGRGaWxlICE9IG51bGwpewotCQkJcmV0dXJuIGRkRmlsZTsKLQkJfQotCQlJVmlydHVhbEZvbGRlciB2aXJ0dWFsRm9sZGVyID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKS5nZXRSb290Rm9sZGVyKCk7Ci0JCWRkRmlsZSA9IHZpcnR1YWxGb2xkZXIuZ2V0RmlsZShQUk9KRUNUX1JFTEFUSVZFX1BBVEgpLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCXJldHVybiBkZEZpbGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9Nb2R1bGVzTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lYXIvTW9kdWxlc05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM2OTJkMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9Nb2R1bGVzTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLS8qKgotICogCi0gKiBNb2R1bGVzIHN1Yi1ub2RlIG9mIEVBUiBEZXBsb3ltZW50IGRlc2NyaXB0b3Igbm9kZSBKYXZhIEVFIDUgCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlc05vZGUgZXh0ZW5kcyBBYnN0cmFjdEVhck5vZGUgewotCi0JcHVibGljIE1vZHVsZXNOb2RlKElQcm9qZWN0IGVhclByb2plY3QpIHsKLQkJc3VwZXIoZWFyUHJvamVjdCk7Ci0JCXR5cGUgPSBNT0RVTEVTX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkgICAgcmV0dXJuIE1lc3NhZ2VzLkVBUl9NT0RVTEVTX05PREU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gTWVzc2FnZXMuRUFSX01PRFVMRVNfTk9ERTsKLQl9Ci0JCi0JIHB1YmxpYyBMaXN0IGdldE1vZHVsZXMoKSB7Ci0JICAgIAlJVmlydHVhbENvbXBvbmVudCBwcm9qZWN0Q29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0RWFyUHJvamVjdCgpKTsKLQkgICAgCXJldHVybiBnZXRDb21wb25lbnRSZWZlcmVuY2VzQXNMaXN0KGltcGxpY2l0VXRpbGl0eVJlZmVyZW5jZVR5cGVzLCBwcm9qZWN0Q29tcG9uZW50LCBuZXcgUGF0aCgiLyIpKTsgLy8kTk9OLU5MUy0xJAotCSB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2Vhci9TaG93RGVwUHJvcFBhZ2VBY3Rpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL1Nob3dEZXBQcm9wUGFnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWEzMzk1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWFyL1Nob3dEZXBQcm9wUGFnZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWFyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuUHJvcGVydHlEaWFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBTaG93RGVwUHJvcFBhZ2VBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUKLXsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWw7CQotCQotICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHNlbCA9IHNlbGVjdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0gICAgfQotCSAgCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChzZWwgPT0gbnVsbCl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgTW9kdWxlc05vZGUpIHsKLQkJCUlQcm9qZWN0IGVhclByb2plY3QgPSAoKE1vZHVsZXNOb2RlKXNlbGVjdGVkT2JqZWN0KS5nZXRFYXJQcm9qZWN0KCk7Ci0JCQlQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByb3BlcnR5RGlhbG9nLmNyZWF0ZURpYWxvZ09uKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuCi0gICAgICAgICAgICAgICAgICAgIGdldFNoZWxsKCksICJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFRGVwZW5kZW5jaWVzUGFnZSIsIGVhclByb2plY3QpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZGlhbG9nICE9IG51bGwpIHsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJfQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0FjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzFjOWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZSB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0aWVzIGV4dGVuZHMgQWJzdHJhY3RERE5vZGUgewotCi0gIHB1YmxpYyBBY3RpdmF0aW9uQ29uZmlnUHJvcGVydGllcyhPYmplY3QgYWRhcHRlck5vZGUpIHsKLSAgICBzdXBlcihhZGFwdGVyTm9kZSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0gICAgcmV0dXJuIChMaXN0KSBhZGFwdGVyTm9kZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICByZXR1cm4gTWVzc2FnZXMuQUNUSVZBVElPTl9DT05GSUdfUFJPUEVSVElFUzsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLSAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgiYWNjZXNzX2ludGVudF9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpLmNyZWF0ZUltYWdlKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQmVhbkRlY29yYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQmVhbkRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmVkNTc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0JlYW5EZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbi5KRUVVSVBsdWdpbkljb25zOwotCi1wdWJsaWMgY2xhc3MgQmVhbkRlY29yYXRvciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciB7Ci0KLQlwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJlYW5JbnRlcmZhY2VOb2RlKXsKLQkJCUJlYW5JbnRlcmZhY2VOb2RlIGJlYW5JbnRlcmFjZU5vZGUgPSAoQmVhbkludGVyZmFjZU5vZGUpIGVsZW1lbnQ7Ci0JCQlzd2l0Y2ggKGJlYW5JbnRlcmFjZU5vZGUuZ2V0S2luZCgpKSB7Ci0JCQljYXNlIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLkJVU1NJTkVTU19MT0NBTDoKLQkJCQlhcHBseURlY29yYXRvcihKRUVVSVBsdWdpbkljb25zLkJVU1NJTkVTU19MT0NBTCwgZGVjb3JhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLkJVU1NJTkVTU19SRU1PVEU6Ci0JCQkJYXBwbHlEZWNvcmF0b3IoSkVFVUlQbHVnaW5JY29ucy5CVVNTSU5FU1NfUkVNT1RFLCBkZWNvcmF0aW9uKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuUkVNT1RFOgotCQkJCWFwcGx5RGVjb3JhdG9yKEpFRVVJUGx1Z2luSWNvbnMuUkVNT1RFLCBkZWNvcmF0aW9uKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQmVhbkludGVyZmFjZU5vZGUuS0lORFMuUkVNT1RFX0hPTUU6Ci0JCQkJYXBwbHlEZWNvcmF0b3IoSkVFVUlQbHVnaW5JY29ucy5SRU1PVEVfSE9NRSwgZGVjb3JhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJlYW5JbnRlcmZhY2VOb2RlLktJTkRTLkxPQ0FMOgotCQkJCWFwcGx5RGVjb3JhdG9yKEpFRVVJUGx1Z2luSWNvbnMuTE9DQUwsIGRlY29yYXRpb24pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCZWFuSW50ZXJmYWNlTm9kZS5LSU5EUy5MT0NBTF9IT01FOgotCQkJCWFwcGx5RGVjb3JhdG9yKEpFRVVJUGx1Z2luSWNvbnMuTE9DQUxfSE9NRSwgZGVjb3JhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJlYW5Ob2RlKXsKLQkJICBkZWNvcmF0aW9uLmFkZE92ZXJsYXkoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImVqYl9tb2R1bGVfb3ZyIikpOyAvLyROT04tTkxTLTEkCi0JCX0JCQotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBseURlY29yYXRvcihTdHJpbmcgaWQsIElEZWNvcmF0aW9uIGRlY29yYXRpb24pIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEpFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoaWQpOwotCQlkZWNvcmF0aW9uLmFkZE92ZXJsYXkoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9CZWFuSW50ZXJmYWNlTm9kZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQmVhbkludGVyZmFjZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlYTQ2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9CZWFuSW50ZXJmYWNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdERETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUgdGhhdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBTZXNzaW9uIG9yIEVudGl0eQotICogYmVhbnMgaW50ZXJmYWNlcyAoQnVzaW5lc3MsIENvbXBvbmVudCBhbmQgTG9jYWwgaW50ZXJmYWNlcykuCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLXB1YmxpYyBjbGFzcyBCZWFuSW50ZXJmYWNlTm9kZSBleHRlbmRzIEFic3RyYWN0REROb2RlIHsKLQotCXByaXZhdGUgZmluYWwgaW50IGtpbmQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZxbjsKLQotCXB1YmxpYyBjbGFzcyBLSU5EUyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVU1NJTkVTU19MT0NBTCA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVU1NJTkVTU19SRU1PVEUgPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTCA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMX0hPTUUgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVEUgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVEVfSE9NRSA9IDU7Ci0JfQotCi0JcHVibGljIEJlYW5JbnRlcmZhY2VOb2RlKE9iamVjdCBhZGFwdGVyTm9kZSwgU3RyaW5nIF9mcW4sIGludCBraW5kKSB7Ci0JCXN1cGVyKGFkYXB0ZXJOb2RlKTsKLQkJdGhpcy5fZnFuID0gX2ZxbjsKLQkJdGhpcy5raW5kID0ga2luZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShfZnFuKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX09CSlNfQ1VOSVQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0X2ZxbigpIHsKLQkJcmV0dXJuIF9mcW47Ci0JfQotCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0JlYW5Ob2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9CZWFuTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDU0ZjQ5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0JlYW5Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRpdHlCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLk1lc3NhZ2VEcml2ZW5CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLlNlc3Npb25CZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RERE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgRW50ZXJwcmlzZSBiZWFucy4KLSAqIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEJlYW5Ob2RlIGV4dGVuZHMgQWJzdHJhY3RERE5vZGUgewotICAKLSAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIEJFQU5fT1ZSOwotICBwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgV0VCX1NFUlZJQ0VfT1ZSOwotICAKLSAgcHVibGljIEJlYW5Ob2RlKEphdmFFRU9iamVjdCBiZWFuKSB7Ci0gICAgc3VwZXIoYmVhbik7Ci0gICAgaW1hZ2UgPSBudWxsOwotICAgIFN0cmluZyBxdWFsaWZpZWQgPSBnZXRFamJDbGFzc1F1YWxpZmllZE5hbWUoKTsKLSAgICBpZiAocXVhbGlmaWVkICE9IG51bGwpIHsKLSAgICAgIHRleHQgPSBTaWduYXR1cmUuZ2V0U2ltcGxlTmFtZShxdWFsaWZpZWQpOwotICAgICAgZGVzY3JpcHRpb24gPSBNZXNzYWdlcy5FTlRFUlBSSVNFX0JFQU5fQ0xBU1NfREVTQ1JJUFRJT04gKyBxdWFsaWZpZWQ7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgU3RyaW5nIGdldEVqYkNsYXNzUXVhbGlmaWVkTmFtZSgpIHsKLSAgICBpZiAoYWRhcHRlck5vZGUgaW5zdGFuY2VvZiBTZXNzaW9uQmVhbil7Ci0gICAgICByZXR1cm4gKChTZXNzaW9uQmVhbilhZGFwdGVyTm9kZSkuZ2V0RWpiQ2xhc3MoKTsKLSAgICB9IGVsc2UgaWYgKGFkYXB0ZXJOb2RlIGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbkJlYW4pewotICAgICAgcmV0dXJuICgoTWVzc2FnZURyaXZlbkJlYW4pYWRhcHRlck5vZGUpLmdldEVqYkNsYXNzKCk7Ci0gICAgfWVsc2UgaWYgKGFkYXB0ZXJOb2RlIGluc3RhbmNlb2YgRW50aXR5QmVhbil7Ci0gICAgICByZXR1cm4gKChFbnRpdHlCZWFuKWFkYXB0ZXJOb2RlKS5nZXRFamJDbGFzcygpOwotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBKYXZhRUVPYmplY3QgZ2V0RW50ZXJwcmlzZUJlYW4oKXsKLQkgIHJldHVybiAoSmF2YUVFT2JqZWN0KSBhZGFwdGVyTm9kZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0gICAgcmV0dXJuIEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX09CSlNfQ1VOSVQpOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQmVhbk5vZGVQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvQmVhbk5vZGVQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODM1NWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0JlYW5Ob2RlUHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47Ci0KLXB1YmxpYyBjbGFzcyBCZWFuTm9kZVByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVBTl9UWVBFID0gImJlYW5UeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1NFU1NJT05fQkVBTiA9ICJpc1Nlc3Npb25CZWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX01FU1NBR0VfRFJJVkVOID0gImlzTWVzc2FnZURyaXZlbkJlYW4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLAotCQkJT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQotCQlpZiAoIShyZWNlaXZlciBpbnN0YW5jZW9mIEJlYW5Ob2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJT2JqZWN0IGFkYXB0ZXJOb2RlID0gKChCZWFuTm9kZSkgcmVjZWl2ZXIpLmdldEFkYXB0ZXJOb2RlKCk7Ci0KLQkJU3RyaW5nIHZhbCA9IChTdHJpbmcpIGV4cGVjdGVkVmFsdWU7Ci0JCWlmIChCRUFOX1RZUEUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJaWYgKElTX1NFU1NJT05fQkVBTi5lcXVhbHModmFsKSkgewotCQkJCXJldHVybiBpc1Nlc3Npb25CZWFuKGFkYXB0ZXJOb2RlKTsKLQkJCX0gZWxzZSBpZiAoSVNfTUVTU0FHRV9EUklWRU4uZXF1YWxzKHZhbCkpIHsKLQkJCQlyZXR1cm4gaXNNZXNzYWdlRHJpdmVuQmVhbihhZGFwdGVyTm9kZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc01lc3NhZ2VEcml2ZW5CZWFuKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1lc3NhZ2VEcml2ZW5CZWFuKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU2Vzc2lvbkJlYW4oT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvR3JvdXBFSkJQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci9lamIvR3JvdXBFSkJQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmYzYjk2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0dyb3VwRUpCUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLmVqYjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotLyoqCi0gKiBEZXBsb3ltZW50IERlc2NyaXB0b3Igcm9vdCBub2RlLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cEVKQlByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyIHsKLQotCXByaXZhdGUgR3JvdXBFamJTZXNzaW9uIGdyb3VwRWpiU2Vzc2lvbjsKLQlwcml2YXRlIEdyb3VwRWpiTWVzc2FnZURyaXZlbiBncm91cEVqYk1lc3NhZ2VEcml2ZW47Ci0JcHJpdmF0ZSBHcm91cEVqYkVudGl0eSBncm91cEVqYkVudGl0eTsKLQlwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZSA9IG51bGw7Ci0KLQotCXB1YmxpYyBHcm91cEVKQlByb3ZpZGVyKEVKQkphciBlamJKYXIpIHsKLQkJc3VwZXIoZWpiSmFyKTsKLQotCQlncm91cEVqYlNlc3Npb24gPSBuZXcgR3JvdXBFamJTZXNzaW9uKGVqYkphcik7Ci0JCWdyb3VwRWpiTWVzc2FnZURyaXZlbiA9IG5ldyBHcm91cEVqYk1lc3NhZ2VEcml2ZW4oZWpiSmFyKTsKLQkJZ3JvdXBFamJFbnRpdHkgPSBuZXcgR3JvdXBFamJFbnRpdHkoZWpiSmFyKTsKLQotCQljaGlsZHJlbi5hZGQoZ3JvdXBFamJTZXNzaW9uKTsKLQkJY2hpbGRyZW4uYWRkKGdyb3VwRWpiTWVzc2FnZURyaXZlbik7Ci0JCWNoaWxkcmVuLmFkZChncm91cEVqYkVudGl0eSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgRUpCSmFyIGdldEVqYkphcigpIHsKLQkJcmV0dXJuIChFSkJKYXIpIGphdmFlZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5ERVBMT1lNRU5UX0RFU0NSSVBUT1IgKyBwcm9qZWN0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdE5hbWUoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCXRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlaW5pdChKYXZhRUVPYmplY3QgbW9kZWxPYmplY3QpIHsKLQkJc3VwZXIucmVpbml0KG1vZGVsT2JqZWN0KTsKLQkJZ3JvdXBFamJTZXNzaW9uLnJlaW5pdChtb2RlbE9iamVjdCk7Ci0JCWdyb3VwRWpiTWVzc2FnZURyaXZlbi5yZWluaXQobW9kZWxPYmplY3QpOwotCQlncm91cEVqYkVudGl0eS5yZWluaXQobW9kZWxPYmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0dyb3VwRWpiRW50aXR5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYkVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTQ3ZTU0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0dyb3VwRWpiRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5lamI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRW50ZXJwcmlzZUJlYW5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RERE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEVudGl0eSBCZWFucyBncm91cCBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZSB0aGF0IGhhcyBhIG51bWJlciBvZiBzdWIgbm9kZXMgCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBFamJFbnRpdHkgZXh0ZW5kcyBBYnN0cmFjdERETm9kZSB7Ci0KLQlwdWJsaWMgR3JvdXBFamJFbnRpdHkoRUpCSmFyIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotICAgIGltYWdlID0gbnVsbDsKLSAgICB0ZXh0ID0gTWVzc2FnZXMuRU5USVRZX0JFQU5TOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGVudGl0aWVzID0gbnVsbDsKLQkJIEVudGVycHJpc2VCZWFucyBlbnRlcnByaXNlQmVhbnMgPSAoKEVKQkphcikgYWRhcHRlck5vZGUpLmdldEVudGVycHJpc2VCZWFucygpOwotCQkgaWYgKGVudGVycHJpc2VCZWFucyAhPSBudWxsKQotCQkJIGVudGl0aWVzID0gZW50ZXJwcmlzZUJlYW5zLmdldEVudGl0eUJlYW5zKCk7Ci0JCWlmIChlbnRpdGllcyAhPSBudWxsICYmIGVudGl0aWVzLnNpemUoKSA+MCl7Ci0JCQljaGlsZHJlbi5hZGRBbGwoZW50aXRpZXMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCSAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoImNtcEVudGl0eV9vYmoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYk1lc3NhZ2VEcml2ZW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0dyb3VwRWpiTWVzc2FnZURyaXZlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWE2NjdlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0dyb3VwRWpiTWVzc2FnZURyaXZlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFuczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLS8qKgotICogTWVzc2FnZSBEcml2ZW4gQmVhbnMgZ3JvdXAgRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUgdGhhdCBoYXMgYSBudW1iZXIgb2Ygc3ViIG5vZGVzIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwRWpiTWVzc2FnZURyaXZlbiBleHRlbmRzIEFic3RyYWN0REROb2RlIHsKLQotCXB1YmxpYyBHcm91cEVqYk1lc3NhZ2VEcml2ZW4oRUpCSmFyIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQlpbWFnZSA9IG51bGw7Ci0JCXRleHQgPSBNZXNzYWdlcy5NRVNTQUdFX0RSSVZFTl9CRUFOUzsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBtc2dCZWFucyA9IG51bGw7Ci0JCUVudGVycHJpc2VCZWFucyBlbnRlcnByaXNlQmVhbnMgPSAoKEVKQkphcikgYWRhcHRlck5vZGUpLmdldEVudGVycHJpc2VCZWFucygpOwotCQkgaWYgKGVudGVycHJpc2VCZWFucyAhPSBudWxsKQotCQkJIG1zZ0JlYW5zID0gZW50ZXJwcmlzZUJlYW5zLmdldE1lc3NhZ2VEcml2ZW5CZWFucygpOwotCQlpZiAobXNnQmVhbnMgIT0gbnVsbCAmJiBtc2dCZWFucy5zaXplKCk+MCl7Ci0JCQljaGlsZHJlbi5hZGRBbGwobXNnQmVhbnMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCVVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJtZXNzYWdlX2JlYW5fb2JqIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCkuY3JlYXRlSW1hZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL2VqYi9Hcm91cEVqYlNlc3Npb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0dyb3VwRWpiU2Vzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmU3Yzg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvZWpiL0dyb3VwRWpiU2Vzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuZWpiOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVudGVycHJpc2VCZWFuczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLkFic3RyYWN0REROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIFNlc3Npb24gQmVhbnMgZ3JvdXAgRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUgdGhhdCBoYXMgYSBudW1iZXIgb2Ygc3ViIG5vZGVzIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBFamJTZXNzaW9uIGV4dGVuZHMgQWJzdHJhY3RERE5vZGUgewotCi0JcHVibGljIEdyb3VwRWpiU2Vzc2lvbihFSkJKYXIgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0gICAgaW1hZ2UgPSBudWxsOwotICAgIHRleHQgPSBNZXNzYWdlcy5TRVNTSU9OX0JFQU5TOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHNlc3Npb25CZWFucyA9IG51bGw7Ci0JCSBFbnRlcnByaXNlQmVhbnMgZW50ZXJwcmlzZUJlYW5zID0gKChFSkJKYXIpIGFkYXB0ZXJOb2RlKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJIGlmIChlbnRlcnByaXNlQmVhbnMgIT0gbnVsbCkKLQkJCSBzZXNzaW9uQmVhbnMgPSBlbnRlcnByaXNlQmVhbnMuZ2V0U2Vzc2lvbkJlYW5zKCk7Ci0JCSAKLQkJaWYgKHNlc3Npb25CZWFucyAhPSBudWxsICYmIHNlc3Npb25CZWFucy5zaXplKCk+MCl7Ci0JCQljaGlsZHJlbi5hZGRBbGwoc2Vzc2lvbkJlYW5zKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiAhdGhpcy5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCSAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoInNlc3Npb25CZWFuX29iaiIpOyAvLyROT04tTkxTLTEkCi0gICAgICByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKS5jcmVhdGVJbWFnZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwQ29udGV4dFBhcmFtc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBDb250ZXh0UGFyYW1zSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNGQyMmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBDb250ZXh0UGFyYW1zSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIENvbnRleHQgUGFyYW1ldGVycyBncm91cCBpbiBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZS4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBDb250ZXh0UGFyYW1zSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgQ09OVEVYVF9QQVJBTV9JTUFHRTsKLQotICAgIHB1YmxpYyBHcm91cENvbnRleHRQYXJhbXNJdGVtUHJvdmlkZXIoV2ViQXBwIHdlYkFwcCkgewotICAgICAgICBzdXBlcih3ZWJBcHApOwotICAgICAgICB0ZXh0ID0gTWVzc2FnZXMuQ09OVEVYVF9QQVJBTVNfSVRFTV9QUk9WSURFUjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgaWYgKGphdmFlZSAhPSBudWxsKXsKLSAgICAgICAgICAgIHJldHVybiAoKFdlYkFwcCkgamF2YWVlKS5nZXRDb250ZXh0UGFyYW1zKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKCkgewotICAgICAgICByZXR1cm4gZ2V0Q29udGV4dFBhcmFtc0ltYWdlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0gICAgICAgIHJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRDb250ZXh0UGFyYW1zSW1hZ2UoKSB7Ci0gICAgICAgIGlmIChDT05URVhUX1BBUkFNX0lNQUdFID09IG51bGwpIHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKEpFRVVJUGx1Z2luSWNvbnMuR1JPVVBfQ09OVEVYVF9QQVJBTSk7Ci0gICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsgCi0gICAgICAgICAgICBDT05URVhUX1BBUkFNX0lNQUdFID0gaW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENPTlRFWFRfUEFSQU1fSU1BR0U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cEVycm9yUGFnZXNJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwRXJyb3JQYWdlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODZhOGUwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwRXJyb3JQYWdlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogRXJyb3IgcGFnZXMgZ3JvdXAgaW4gRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwRXJyb3JQYWdlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlcnsKLQotICAgIHByaXZhdGUgc3RhdGljIEltYWdlIEVSUk9SX1BBR0VTOwotICAgIHByaXZhdGUgc3RhdGljIEltYWdlIEVYQ0VQVElPTl9FUlJPUl9QQUdFUzsKLQotICAgIHB1YmxpYyBHcm91cEVycm9yUGFnZXNJdGVtUHJvdmlkZXIoV2ViQXBwIHdlYkFwcCkgewotICAgICAgICBzdXBlcih3ZWJBcHApOwotICAgICAgICB0ZXh0ID0gTWVzc2FnZXMuRVJST1JfUEFHRVNfSVRFTV9QUk9WSURFUjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLSAgICAgICAgaWYgKGphdmFlZSAhPSBudWxsKXsKLSAgICAgICAgICAgIHJldHVybiAoKFdlYkFwcCkgamF2YWVlKS5nZXRFcnJvclBhZ2VzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKCkgewotICAgICAgICByZXR1cm4gZ2V0RXJyb3JQYWdlc0ltYWdlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oKSB7Ci0gICAgICAgIHJldHVybiAhZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRFcnJvclBhZ2VzSW1hZ2UoKSB7Ci0gICAgICAgIGlmIChFUlJPUl9QQUdFUyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShKRUVVSVBsdWdpbkljb25zLkdST1VQX0VSUk9SX1BBR0UpOwotICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7IAotICAgICAgICAgICAgRVJST1JfUEFHRVMgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gRVJST1JfUEFHRVM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJbWFnZSBnZXRFcnJvclBhZ2VzSW1hZ2UoRXJyb3JQYWdlIGVsZW1lbnQpIHsKLSAgICAgIGlmIChlbGVtZW50LmdldEVycm9yQ29kZSgpICE9IG51bGwpewotICAgICAgICAKLSAgICAgIH0KLSAgICAgIGlmIChFWENFUFRJT05fRVJST1JfUEFHRVMgPT0gbnVsbCkgewotICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShKRUVVSVBsdWdpbkljb25zLkdST1VQX0VSUk9SX1BBR0UpOwotICAgICAgICBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsgCi0gICAgICAgIEVYQ0VQVElPTl9FUlJPUl9QQUdFUyA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgIH0KLSAgICByZXR1cm4gRVhDRVBUSU9OX0VSUk9SX1BBR0VTOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBGaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cEZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlZWVhMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cEZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogRmlsdGVyIG1hcHBpbmdzIGdyb3VwIGluIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cEZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEdyb3VwUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgRklMVEVSX01BUFBJTkc7Ci0KLQlwdWJsaWMgR3JvdXBGaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyKFdlYkFwcCB3ZWJBcHApIHsKLQkJc3VwZXIod2ViQXBwKTsKLQkJdGV4dCA9IE1lc3NhZ2VzLkZJTFRFUl9NQVBQSU5HX0lURU1fUFJPVklERVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8Pz4gZ2V0Q2hpbGRyZW4oKSB7Ci0JCWlmIChqYXZhZWUgIT0gbnVsbCl7Ci0JCQlyZXR1cm4gKChXZWJBcHApIGphdmFlZSkuZ2V0RmlsdGVyTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBnZXRGaWx0ZXJNYXBwaW5nSW1hZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEZpbHRlck1hcHBpbmdJbWFnZSgpIHsKLQkJaWYgKEZJTFRFUl9NQVBQSU5HID09IG51bGwpIHsKLQkJCVVSTCB1cmwgPSAoVVJMKSBKMkVFUGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKEpFRVVJUGx1Z2luSWNvbnMuR1JPVVBfRklMVEVSX01BUFBJTkcpOwotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7IAotCQkJRklMVEVSX01BUFBJTkcgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gRklMVEVSX01BUFBJTkc7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBGaWx0ZXJzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OGYyOTIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBGaWx0ZXJzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEZpbHRlcnMgZ3JvdXAgaW4gRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0R3JvdXBQcm92aWRlcnsKLQotCXByaXZhdGUgc3RhdGljIEltYWdlIEZJTFRFUjsKLQotCXB1YmxpYyBHcm91cEZpbHRlcnNJdGVtUHJvdmlkZXIoV2ViQXBwIHdlYkFwcCkgewotCQlzdXBlcih3ZWJBcHApOwotCQl0ZXh0ID0gTWVzc2FnZXMuRklMVEVSU19JVEVNX1BST1ZJREVSOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotCQlpZiAoamF2YWVlICE9IG51bGwpewotCQkJcmV0dXJuICgoV2ViQXBwKSBqYXZhZWUpLmdldEZpbHRlcnMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBnZXRGaWx0ZXJzSW1hZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEZpbHRlcnNJbWFnZSgpIHsKLQkJaWYgKEZJTFRFUiA9PSBudWxsKSB7Ci0JCQlVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShKRUVVSVBsdWdpbkljb25zLkZJTFRFUl9NQVBQSU5HKTsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOyAKLQkJCUZJTFRFUiA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQl9Ci0JCXJldHVybiBGSUxURVI7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwTGlzdGVuZXJJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwTGlzdGVuZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwMzM4Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cExpc3RlbmVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIExpc3RlbmVyIGdyb3VwIGluIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cExpc3RlbmVySXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyewotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgTElTVEVORVI7Ci0KLQlwdWJsaWMgR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlcihXZWJBcHAgd2ViQXBwKSB7Ci0JCXN1cGVyKHdlYkFwcCk7Ci0JCXRleHQgPSBNZXNzYWdlcy5MSVNURU5FUl9JVEVNX1BST1ZJREVSOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotCQlpZiAoamF2YWVlICE9IG51bGwpewotCQlyZXR1cm4gKChXZWJBcHApIGphdmFlZSkuZ2V0TGlzdGVuZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gZ2V0TGlzdGVuZXJzSW1hZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldExpc3RlbmVyc0ltYWdlKCkgewotCQlpZiAoTElTVEVORVIgPT0gbnVsbCkgewotCQkJVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5HUk9VUF9MSVNURU5FUik7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsgCi0JCQlMSVNURU5FUiA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCSAgICAgIH0KLQkgICAgICByZXR1cm4gTElTVEVORVI7Ci0JfQotCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFJlZmVyZW5jZUl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBSZWZlcmVuY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYzZjU2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFJlZmVyZW5jZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3Iud2ViOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEpOREkgUmVmZXJlbmNlcyBncm91cCBpbiBEZXBsb3ltZW50IERlc2NyaXB0b3Igbm9kZS4gCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgR3JvdXBSZWZlcmVuY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEdyb3VwUHJvdmlkZXJ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBJbWFnZSBSRUZFUkVOQ0VTOwotCi0gICAgcHVibGljIEdyb3VwUmVmZXJlbmNlSXRlbVByb3ZpZGVyKFdlYkFwcCB3ZWJBcHApIHsKLSAgICAgICAgc3VwZXIod2ViQXBwKTsKLSAgICAgICAgdGV4dCA9IE1lc3NhZ2VzLlJFRkVSRU5DRVM7Ci0gICAgfQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLSAgICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBpZiAoamF2YWVlICE9IG51bGwpewotICAgICAgICAgIHJlc3VsdC5hZGRBbGwoKChXZWJBcHApIGphdmFlZSkuZ2V0RWpiUmVmcygpKTsKLSAgICAgICAgICByZXN1bHQuYWRkQWxsKCgoV2ViQXBwKSBqYXZhZWUpLmdldEVqYkxvY2FsUmVmcygpKTsKLSAgICAgICAgICByZXN1bHQuYWRkQWxsKCgoV2ViQXBwKSBqYXZhZWUpLmdldFJlc291cmNlUmVmcygpKTsKLSAgICAgICAgICByZXN1bHQuYWRkQWxsKCgoV2ViQXBwKSBqYXZhZWUpLmdldFJlc291cmNlRW52UmVmcygpKTsKLSAgICAgICAgICByZXN1bHQuYWRkQWxsKCgoV2ViQXBwKSBqYXZhZWUpLmdldEVudkVudHJpZXMoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgamF2YWVlKS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpOwotICAgICAgICAgIHJlc3VsdC5hZGRBbGwoKChXZWJBcHApIGphdmFlZSkuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpKTsKLSAgICAgICAgICByZXN1bHQuYWRkQWxsKCgoV2ViQXBwKSBqYXZhZWUpLmdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFkZEFsbCgoKFdlYkFwcCkgamF2YWVlKS5nZXRTZXJ2aWNlUmVmcygpKTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gIWdldENoaWxkcmVuKCkuaXNFbXB0eSgpOwotICAgIH0KLQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKCkgewotICAgICAgICByZXR1cm4gZ2V0UmVmZXJlbmNlc0ltYWdlKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlIGdldFJlZmVyZW5jZXNJbWFnZSgpIHsKLSAgICAgICAgaWYgKFJFRkVSRU5DRVMgPT0gbnVsbCkgewotICAgICAgICAgICAgVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5SRVNPVVJDRV9SRUZFUkVOQ0VfT0JKKTsKLSAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOyAKLSAgICAgICAgICAgIFJFRkVSRU5DRVMgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUkVGRVJFTkNFUzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwU2VydmxldEl0ZW1Qcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNzI2OWUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFNlcnZsZXRzIGdyb3VwIGluIERlcGxveW1lbnQgRGVzY3JpcHRvciBub2RlLiAKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBHcm91cFNlcnZsZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEdyb3VwUHJvdmlkZXJ7Ci0KLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBTRVJWTEVUOwotCi0JcHVibGljIEdyb3VwU2VydmxldEl0ZW1Qcm92aWRlcihXZWJBcHAgd2ViQXBwKSB7Ci0JCXN1cGVyKHdlYkFwcCk7Ci0JCXRleHQgPSBNZXNzYWdlcy5TRVJWTEVUX0lURU1fUFJPVklERVI7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJaWYgKGphdmFlZSAhPSBudWxsKXsKLQkJCXJldHVybiAoKFdlYkFwcCkgamF2YWVlKS5nZXRTZXJ2bGV0cygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gIWdldENoaWxkcmVuKCkuaXNFbXB0eSgpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gZ2V0U2VydmxldEltYWdlKCk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldFNlcnZsZXRJbWFnZSgpIHsKLQkJaWYgKFNFUlZMRVQgPT0gbnVsbCkgewotCQkJVVJMIHVybCA9IChVUkwpIEoyRUVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoSkVFVUlQbHVnaW5JY29ucy5HUk9VUF9TRVJWTEVUKTsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOyAKLQkJCVNFUlZMRVQgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gU0VSVkxFVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwU2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwU2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2MTZiZi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFNlcnZsZXQgTWFwcGluZ3MgZ3JvdXAgaW4gRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwU2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEdyb3VwUHJvdmlkZXJ7Ci0KLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBTRVJWTEVUTUFQUElORzsKLQotCXB1YmxpYyBHcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyKFdlYkFwcCB3ZWJBcHApIHsKLQkJc3VwZXIod2ViQXBwKTsKLQkJdGV4dCA9IE1lc3NhZ2VzLlNFUlZMRVRfTUFQUElOR19JVEVNX1BST1ZJREVSOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0IGdldENoaWxkcmVuKCkgewotCQlpZiAoamF2YWVlICE9IG51bGwpewotCQkJcmV0dXJuICgoV2ViQXBwKSBqYXZhZWUpLmdldFNlcnZsZXRNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGdldFNlcnZsZXRNYXBwaW5nSW1hZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuICFnZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldFNlcnZsZXRNYXBwaW5nSW1hZ2UoKSB7Ci0JCWlmIChTRVJWTEVUTUFQUElORyA9PSBudWxsKSB7Ci0JCQlVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShKRUVVSVBsdWdpbkljb25zLlNFUlZMRVRfTUFQUElORyk7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsgCi0JCQlTRVJWTEVUTUFQUElORyA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQl9Ci0JCXJldHVybiBTRVJWTEVUTUFQUElORzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwV2VsY29tZVBhZ2VzSXRlbVByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9Hcm91cFdlbGNvbWVQYWdlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2RjYzI1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9pbnRlcm5hbC9uYXZpZ2F0b3Ivd2ViL0dyb3VwV2VsY29tZVBhZ2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2VsY29tZUZpbGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQWJzdHJhY3RHcm91cFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkucGx1Z2luLkpFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFdlbGNvbWUgcGFnZXMgZ3JvdXAgaW4gRGVwbG95bWVudCBEZXNjcmlwdG9yIG5vZGUuIAotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIEdyb3VwV2VsY29tZVBhZ2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgV0VMQ09NRV9QQUdFUzsKLQotICAgIHByaXZhdGUgc3RhdGljIEltYWdlIFdFTENPTUVfUEFHRTsKLSAgICAKLSAgICBwcml2YXRlIExpc3QgY2hpbGRyZW4gPSBudWxsOwotCi0gICAgcHVibGljIEdyb3VwV2VsY29tZVBhZ2VzSXRlbVByb3ZpZGVyKFdlYkFwcCB3ZWJBcHApIHsKLSAgICAgICAgc3VwZXIod2ViQXBwKTsKLSAgICAgICAgdGV4dCA9IE1lc3NhZ2VzLldFTENPTUVfUEFHRVNfSVRFTV9QUk9WSURFUjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLSAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKXsKLSAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwotICAgICAgfQotICAgICAgICBpZiAoamF2YWVlICE9IG51bGwpewotICAgICAgICAgIExpc3Qgd2VsY29tZUZpbGVMaXN0cyA9ICgoV2ViQXBwKSBqYXZhZWUpLmdldFdlbGNvbWVGaWxlTGlzdHMoKTsKLSAgICAgICAgICBpZiAod2VsY29tZUZpbGVMaXN0cy5zaXplKCk+MCl7Ci0gICAgICAgICAgICBjaGlsZHJlbiA9ICBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCBvYmplY3QgOiB3ZWxjb21lRmlsZUxpc3RzKSB7Ci0gICAgICAgICAgICAgIExpc3Qgd2VsY29tZUZpbGVzID0gKChXZWxjb21lRmlsZUxpc3Qpb2JqZWN0KS5nZXRXZWxjb21lRmlsZXMoKTsKLSAgICAgICAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0MiA6IHdlbGNvbWVGaWxlcykgewotICAgICAgICAgICAgICAgIGlmKG9iamVjdDIgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKCAoKFN0cmluZylvYmplY3QyKS50cmltKCkpKXsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgY2hpbGRyZW4uYWRkKG5ldyBXZWJBcnRpZmFjdE5vZGUoKFN0cmluZykgb2JqZWN0MiwgZ2V0V2VsY29tZVBhZ2VJbWFnZSgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2hpbGRyZW47Ci0gICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKCkgewotICAgICAgICByZXR1cm4gZ2V0V2VsY29tZVBhZ2VzSW1hZ2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLSAgICAgICAgcmV0dXJuICFnZXRDaGlsZHJlbigpLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEltYWdlIGdldFdlbGNvbWVQYWdlc0ltYWdlKCkgewotICAgICAgICBpZiAoV0VMQ09NRV9QQUdFUyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShKRUVVSVBsdWdpbkljb25zLkdST1VQX1dFTENPTUVfUEFHRVMpOwotICAgICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7IAotICAgICAgICAgICAgV0VMQ09NRV9QQUdFUyA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBXRUxDT01FX1BBR0VTOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEltYWdlIGdldFdlbGNvbWVQYWdlSW1hZ2UoKSB7Ci0gICAgICBpZiAoV0VMQ09NRV9QQUdFID09IG51bGwpIHsKLSAgICAgICAgICBVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZShKRUVVSVBsdWdpbkljb25zLkdST1VQX1dFTENPTUVfUEFHRSk7Ci0gICAgICAgICAgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKHVybCk7IAotICAgICAgICAgIFdFTENPTUVfUEFHRSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIFdFTENPTUVfUEFHRTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9XZWJBcHBQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvV2ViQXBwUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllOGEyMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9XZWJBcHBQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci5BYnN0cmFjdEdyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51aS5wbHVnaW4uSkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLQotLyoqCi0gKiBDb250ZW50IGFuZCBMYWJlbCBQcm92aWRlciBoZWxwZXIgY2xhc3MgZm9yIFdlYkFwcCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIFdlYkFwcFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RHcm91cFByb3ZpZGVyIHsKLSAgCi0gIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX1JFTEFUSVZFX1BBVEggPSAiV0VCLUlORi93ZWIueG1sIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXByaXZhdGUgR3JvdXBFcnJvclBhZ2VzSXRlbVByb3ZpZGVyIGVycm9yczsKLQlwcml2YXRlIEdyb3VwU2VydmxldEl0ZW1Qcm92aWRlciBzZXJ2bGV0czsKLQlwcml2YXRlIEdyb3VwRmlsdGVyc0l0ZW1Qcm92aWRlciBmaWx0ZXJzOwotCXByaXZhdGUgR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlciBsaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBHcm91cFNlcnZsZXRNYXBwaW5nSXRlbVByb3ZpZGVyIHNlcnZsZXRNYXBwaW5nOwotCXByaXZhdGUgR3JvdXBGaWx0ZXJNYXBwaW5nSXRlbVByb3ZpZGVyIGZpbHRlck1hcHBpbmc7Ci0JcHJpdmF0ZSBHcm91cFJlZmVyZW5jZUl0ZW1Qcm92aWRlciByZWZlcmVuY2VzOwotCXByaXZhdGUgR3JvdXBXZWxjb21lUGFnZXNJdGVtUHJvdmlkZXIgd2VsY29tZTsKLQlwcml2YXRlIEdyb3VwQ29udGV4dFBhcmFtc0l0ZW1Qcm92aWRlciBjb250ZXh0UGFyYW1zOwotCQotCXByaXZhdGUgTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQlwcml2YXRlIEltYWdlIFdFQl9BUFBfSU1BR0U7Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBwcmpjdCA9IG51bGw7Ci0JcHJpdmF0ZSBJRmlsZSBkZEZpbGUgPSBudWxsOwotCi0KLSAgCi0KLQkKLQlwdWJsaWMgV2ViQXBwUHJvdmlkZXIoV2ViQXBwIHdlYkFwcCwgSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcih3ZWJBcHApOwotCQl0ZXh0ID0gTWVzc2FnZXMuREVQTE9ZTUVOVF9ERVNDUklQVE9SICsgcHJvamVjdC5nZXROYW1lKCk7Ci0JCWNvbnRleHRQYXJhbXMgPSBuZXcgR3JvdXBDb250ZXh0UGFyYW1zSXRlbVByb3ZpZGVyKHdlYkFwcCk7Ci0JCWVycm9ycyA9IG5ldyBHcm91cEVycm9yUGFnZXNJdGVtUHJvdmlkZXIod2ViQXBwKTsKLQkJc2VydmxldHMgPSBuZXcgR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyKHdlYkFwcCk7Ci0JCXNlcnZsZXRNYXBwaW5nID0gbmV3IEdyb3VwU2VydmxldE1hcHBpbmdJdGVtUHJvdmlkZXIod2ViQXBwKTsKLQkJZmlsdGVycyA9IG5ldyBHcm91cEZpbHRlcnNJdGVtUHJvdmlkZXIod2ViQXBwKTsKLQkJZmlsdGVyTWFwcGluZyA9IG5ldyBHcm91cEZpbHRlck1hcHBpbmdJdGVtUHJvdmlkZXIod2ViQXBwKTsKLQkJbGlzdGVuZXJzID0gbmV3IEdyb3VwTGlzdGVuZXJJdGVtUHJvdmlkZXIod2ViQXBwKTsKLQkJcmVmZXJlbmNlcyA9IG5ldyBHcm91cFJlZmVyZW5jZUl0ZW1Qcm92aWRlcih3ZWJBcHApOwotCQl3ZWxjb21lID0gbmV3IEdyb3VwV2VsY29tZVBhZ2VzSXRlbVByb3ZpZGVyKHdlYkFwcCk7Ci0JCWNoaWxkcmVuLmFkZChjb250ZXh0UGFyYW1zKTsKLQkJY2hpbGRyZW4uYWRkKGVycm9ycyk7Ci0JCWNoaWxkcmVuLmFkZChzZXJ2bGV0cyk7Ci0JCWNoaWxkcmVuLmFkZChmaWx0ZXJzKTsKLQkJY2hpbGRyZW4uYWRkKGxpc3RlbmVycyk7Ci0JCWNoaWxkcmVuLmFkZChzZXJ2bGV0TWFwcGluZyk7Ci0JCWNoaWxkcmVuLmFkZChmaWx0ZXJNYXBwaW5nKTsKLQkJY2hpbGRyZW4uYWRkKHJlZmVyZW5jZXMpOwotCQljaGlsZHJlbi5hZGQod2VsY29tZSk7Ci0JCXByamN0ID0gcHJvamVjdDsKLQl9Ci0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW4oKXsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlpZiAoV0VCX0FQUF9JTUFHRSA9PSBudWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VXZWJEZXNjcmlwdG9yID0gSkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEpFRVVJUGx1Z2luSWNvbnMuSU1HX1dFQkVFTU9ERUwpOwotCQkJV0VCX0FQUF9JTUFHRSA9IGltYWdlV2ViRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQl9Ci0JCXJldHVybiBXRUJfQVBQX0lNQUdFOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCl7Ci0JCXJldHVybiBwcmpjdDsKLQl9Ci0JcHVibGljIElGaWxlIGdldERERmlsZSgpIHsKLQkJaWYgKGRkRmlsZSAhPSBudWxsKXsKLQkJCXJldHVybiBkZEZpbGU7Ci0JCX0KLQotCQlJVmlydHVhbEZvbGRlciB2aXJ0dWFsRm9sZGVyID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKS5nZXRSb290Rm9sZGVyKCk7Ci0JCXJldHVybiB2aXJ0dWFsRm9sZGVyLmdldEZpbGUoUFJPSkVDVF9SRUxBVElWRV9QQVRIKS5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZWluaXQoSmF2YUVFT2JqZWN0IG1vZGVsT2JqZWN0KSB7Ci0JCXN1cGVyLnJlaW5pdChtb2RlbE9iamVjdCk7Ci0JCWZvciAoT2JqZWN0IGNoaWxkIDogY2hpbGRyZW4pIHsKLQkJCSgoQWJzdHJhY3RHcm91cFByb3ZpZGVyKWNoaWxkKS5yZWluaXQobW9kZWxPYmplY3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL2ludGVybmFsL25hdmlnYXRvci93ZWIvV2ViQXJ0aWZhY3ROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9XZWJBcnRpZmFjdE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4NzA4Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL3dlYi9XZWJBcnRpZmFjdE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiAKLSAqIFdyYXBwZXIgbm9kZSBmb3IgcmVwcmVzZW50aW5nIHN0cmluZyB2YWx1ZXMgb2YgdGhlIG1vZGVsIGluIERlcGxveW1lbnQgZGVzY3JpcHRvciB0cmVlLgotICogKGUuZy4gV2VsY29tZSBGaWxlcykKLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJBcnRpZmFjdE5vZGUgewotCi0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQlwcml2YXRlIFN0cmluZyB0ZXh0OwotCi0JcHVibGljIFdlYkFydGlmYWN0Tm9kZShTdHJpbmcgdGV4dCwgSW1hZ2UgaW1hZ2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvcGx1Z2luL0pFRVVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvcGx1Z2luL0pFRVVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMzg4MzYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3BsdWdpbi9KRUVVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgSkVFVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qZWUudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgSkVFVUlQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKRUVVSVBsdWdpbigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpFRVVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgZ2V0cyBhIC5naWYgZnJvbSB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCVVSTCBnaWZJbWFnZVVSTCA9IGdldEltYWdlVVJMKGtleSk7Ci0JCWlmIChnaWZJbWFnZVVSTCAhPSBudWxsKQotCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoZ2lmSW1hZ2VVUkwpOwotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBVUkwgZ2V0SW1hZ2VVUkwoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gSjJFRVBsdWdpbi5nZXRJbWFnZVVSTChrZXksIGdldEJ1bmRsZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogUmVjb3JkIGEgbWVzc2FnZSBhZ2FpbnN0IHRoaXMgcGx1Z2luJ3MgbG9nLiAKLQkgKiAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgc2V2ZXJpdHksIGludCBhQ29kZSwgU3RyaW5nIGFNZXNzYWdlLAotCQkJVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlsb2coY3JlYXRlU3RhdHVzKHNldmVyaXR5LCBhQ29kZSwgYU1lc3NhZ2UsIGV4Y2VwdGlvbikpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBzdGF0dXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGx1Z2luLgotCSAqICAKLQkgKiBAcGFyYW0gc2V2ZXJpdHkKLQkgKiBAcGFyYW0gYUNvZGUKLQkgKiBAcGFyYW0gYU1lc3NhZ2UKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogQHJldHVybiBBIHN0YXR1cyBjb25maWd1cmVkIHdpdGggdGhpcyBwbHVnaW4ncyBpZCBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIGludCBhQ29kZSwKLQkJCVN0cmluZyBhTWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBhQ29kZSwKLQkJCQlhTWVzc2FnZSAhPSBudWxsID8gYU1lc3NhZ2UgOiAiTm8gbWVzc2FnZS4iLCBleGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIAotCSAqIFJlY29yZCBhIHN0YXR1cyBhZ2FpbnN0IHRoaXMgcGx1Z2luJ3MgbG9nLiAKLQkgKiAKLQkgKiBAcGFyYW0gYVN0YXR1cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBhU3RhdHVzKSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coYVN0YXR1cyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gZSkgewotCQlsb2coSVN0YXR1cy5FUlJPUiwgSVN0YXR1cy5FUlJPUixtZXNzYWdlLGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9wbHVnaW4vSkVFVUlQbHVnaW5JY29ucy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3BsdWdpbi9KRUVVSVBsdWdpbkljb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOWU5NTguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3BsdWdpbi9KRUVVSVBsdWdpbkljb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnBsdWdpbjsKLQotCi1wdWJsaWMgY2xhc3MgSkVFVUlQbHVnaW5JY29ucyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTUdfRUpCRUVNT0RFTCA9ICIzMF9lamJqYXJfb2JqIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElNR19XRUJFRU1PREVMID0gIndlYmFwcF8yNSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX01BUFBJTkcgPSAid2VidWlJY29ucy9zZXJ2bGV0X21hcHBpbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRklMVEVSX01BUFBJTkcgPSAid2VidWlJY29ucy9maWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JPVVBfRklMVEVSX01BUFBJTkcgPSAid2VidWlJY29ucy9maWx0ZXJfbWFwcGluZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUk9VUF9MSVNURU5FUiA9ICJ3ZWJ1aUljb25zL2xpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdST1VQX1NFUlZMRVQgPSAid2VidWlJY29ucy9zZXJ2bGV0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdST1VQX0VSUk9SX1BBR0UgPSAid2VidWlJY29ucy9lcnJvcl9wYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdST1VQX0NPTlRFWFRfUEFSQU0gPSAid2VidWlJY29ucy9pbml0aWFsaXpfcGFyYW1ldGVyX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JPVVBfV0VMQ09NRV9QQUdFUyA9ICJ3ZWJ1aUljb25zL3dlbGNvbWVfbGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUk9VUF9XRUxDT01FX1BBR0UgPSAid2VidWlJY29ucy93ZWxjb21lX2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVTT1VSQ0VfUkVGRVJFTkNFX09CSiA9ICJyZXNvdXJjZVJlZl9vYmoiOyAvLyROT04tTkxTLTEkCi0JCi0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVU1NJTkVTU19MT0NBTCA9ICJvdnIvYnVzaW5lc3NfbG9jYWxfb3ZyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJVU1NJTkVTU19SRU1PVEUgPSAib3ZyL2J1c2luZXNzX3JlbW90ZV9vdnIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1RFID0gIm92ci9yZW1vdGVfb3ZyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9URV9IT01FID0gIm92ci9ob21lX292ciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMT0NBTCA9ICJvdnIvbG9jYWxfb3ZyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExPQ0FMX0hPTUUgPSAib3ZyL2xvY2FsX2hvbWVfb3ZyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVBUl9JTUFHRT0iZWFyXzUwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFQUF9DTElFTlQ1MD0iYXBwY2xpZW50XzUwIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvcHJvamVjdC9mYWNldC9FYXJKYXZhRUVGYWNldEluc3RhbGxQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvcHJvamVjdC9mYWNldC9FYXJKYXZhRUVGYWNldEluc3RhbGxQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZTFmYWIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3Byb2plY3QvZmFjZXQvRWFySmF2YUVFRmFjZXRJbnN0YWxsUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLnByb2plY3QuZmFjZXQ7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlCi0gKiBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotcHVibGljIGNsYXNzIEVhckphdmFFRUZhY2V0SW5zdGFsbFBhZ2UgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5qc3QuajJlZS51aS5wcm9qZWN0LmZhY2V0LkVhckZhY2V0SW5zdGFsbFBhZ2UgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiBhZGRERDsKLQotCXB1YmxpYyBFYXJKYXZhRUVGYWNldEluc3RhbGxQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQkJY3JlYXRlRERTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVERFNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWFkZEREID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWFkZERELnNldFRleHQoTWVzc2FnZXMuRWFySmF2YUVFRmFjZXRJbnN0YWxsUGFnZV8wKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChhZGRERCwgR0VORVJBVEVfREQsIG51bGwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWFkZERELnNldExheW91dERhdGEoZ2QpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9wcm9qZWN0L2ZhY2V0L01lc3NhZ2VzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvcHJvamVjdC9mYWNldC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWVlMDhkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2plZS91aS9wcm9qZWN0L2ZhY2V0L01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS51aS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmplZS51aS5wcm9qZWN0LmZhY2V0Lm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVhckphdmFFRUZhY2V0SW5zdGFsbFBhZ2VfMDsKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvcHJvamVjdC9mYWNldC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvamVlL3VpL3Byb2plY3QvZmFjZXQvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4MzA3OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qZWUvdWkvcHJvamVjdC9mYWNldC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRWFySmF2YUVFRmFjZXRJbnN0YWxsUGFnZV8wPUdlbmVyYXRlIERlcGxveW1lbnQgRGVzY3JpcHRvcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLy5jbGFzc3BhdGggYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5NmY0OS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZWFycHJvamVjdCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImplZWNyZWF0aW9uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvLmN2c2lnbm9yZSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTFiMjc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1AZG90CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvLnByb2plY3QgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZWY1ZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmplZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkZDJmMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotI1NhdCBOb3YgMTAgMDM6Mjg6NDIgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlY3JlYXRlTW9kaWZpZWRDbGFzc0ZpbGVJbk91dHB1dEZvbGRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODE5N2M1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1NhdCBOb3YgMTAgMDM6Mjg6NDIgRVNUIDIwMDcKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MQotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5taXNzaW5nLXBhY2thZ2VzPTIKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0yCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0xCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTEKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0xCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTEKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjc4MzhjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuamVlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDQucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QuamVlLkpFRVBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5jb21tb247YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC53ZWI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDMsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2E7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qZWUsCi0gb3JnLmVjbGlwc2UuanN0LmplZS5jb250ZW50dHlwZSwKLSBvcmcuZWNsaXBzZS5qc3QuamVlLmludGVybmFsLmRlcGxveWFibGVzLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5jb21tb24sCi0gb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzLAotIG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldAotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTliZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNzhkZTMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IGVhcnByb2plY3QvLFwKLSAgICAgICAgICAgamVlY3JlYXRpb24vLFwKLSAgICAgICAgICAgY29tbW9uLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8sXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL2NvbW1vbi9BYnN0cmFjdEFubm90YXRpb25GYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvY29tbW9uL0Fic3RyYWN0QW5ub3RhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3ZDMxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvY29tbW9uL0Fic3RyYWN0QW5ub3RhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkluamVjdGlvblRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YWVlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUmVzQXV0aFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc1NoYXJpbmdTY29wZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SdW5BczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47Ci0KLS8qKgotICogQGF1dGhvciBLaXJpbCBNaXRvdiBrLm1pdG92QHNhcC5jb20KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgInZhbHVlIiBpcyBhbiBhcnJheSBvZiBvYmplY3RzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0FycmF5T2ZPYmplY3QoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBPYmplY3RbXS5jbGFzcy5pc0luc3RhbmNlKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldEFubm90YXRlZFZhbHVlKFN0cmluZyBuYW1lLCBJTWVtYmVyVmFsdWVQYWlyW10gbWVtYmVyVmFsdWVQYWlycykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWZvciAoSU1lbWJlclZhbHVlUGFpciBwYWlyIDogbWVtYmVyVmFsdWVQYWlycykgewotCQkJaWYgKG5hbWUuZXF1YWxzKHBhaXIuZ2V0TWVtYmVyTmFtZSgpKSkgewotCQkJCXJldHVybiBwYWlyLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNJbXBvcnQoSUNvbXBpbGF0aW9uVW5pdCB1bml0LCBTdHJpbmcgaW1wb3J0dCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWZvciAoSUltcG9ydERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uIDogdW5pdC5nZXRJbXBvcnRzKCkpIHsKLQkJCWlmIChkZWNsYXJhdGlvbi5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhpbXBvcnR0KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgZ2l2ZW4gPGNvZGU+dG9SZXNvbHZlPC9jb2RlPiBzdHJpbmcgdG8gYW4gSVR5cGUgaW4gdGhlCi0JICogY29udGV4dCBvZiA8Y29kZT5kZWNsYXJpbmdUeXBlPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBkZWNsYXJpbmdUeXBlCi0JICogQHBhcmFtIHRvUmVzb2x2ZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgdGhhdCBzaG91bGQgYmUgcmVzb2x2ZWQuCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZWQgdHlwZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBzdWNoIHR5cGUgY2FuIG5vdCBiZQotCSAqICAgICAgICAgcmVzb2x2ZWQuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdG9SZXNvbHZlIGlzCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIElUeXBlIHJlc29sdmVUeXBlKElUeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyB0b1Jlc29sdmUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodG9SZXNvbHZlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nW11bXSBmdWxsVHlwZU5hbWUgPSBkZWNsYXJpbmdUeXBlLnJlc29sdmVUeXBlKHRvUmVzb2x2ZSk7Ci0JCWlmIChmdWxsVHlwZU5hbWUgIT0gbnVsbCkKLQkJCXJldHVybiBkZWNsYXJpbmdUeXBlLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoZnVsbFR5cGVOYW1lWzBdWzBdLCBmdWxsVHlwZU5hbWVbMF1bMV0pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWpiQW5ub3RhdGlvbihJQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBMaXN0PEVqYkxvY2FsUmVmPiBsb2NhbFJlZnMsIElNZW1iZXIgbWVtYmVyLAotCQkJQ29sbGVjdGlvbjxJVHlwZT4gZGVwZW5kZWRUeXBlcykgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWludCBtZW1iZXJUeXBlID0gbWVtYmVyLmdldEVsZW1lbnRUeXBlKCk7Ci0JCUlNZW1iZXJWYWx1ZVBhaXJbXSBwYWlycyA9IGFubm90YXRpb24uZ2V0TWVtYmVyVmFsdWVQYWlycygpOwotCi0JCVN0cmluZyBiZWFuSW50ZXJmYWNlVmFsdWUgPSAoU3RyaW5nKSBnZXRBbm5vdGF0ZWRWYWx1ZSgiYmVhbkludGVyZmFjZSIsIHBhaXJzKTsKLQkJYmVhbkludGVyZmFjZVZhbHVlID0gaW50ZXJuYWxQcm9jZXNzSW5qZWN0aW9uKGJlYW5JbnRlcmZhY2VWYWx1ZSwgbWVtYmVyLCBkZXBlbmRlZFR5cGVzKTsKLQkJaWYgKGJlYW5JbnRlcmZhY2VWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8qCi0JCSAqIFRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2Ugc2hvdWxkIGJlIHRoZSB2YWx1ZSBvZiB0aGUgIm5hbWUiCi0JCSAqIGF0dHJpYnV0ZS4gSWYgdGhlcmUgaXMgbm8gIm5hbWUiIGF0dHJpYnV0ZSB0aGVuIHRoZSBuYW1lIG9mIHRoZQotCQkgKiByZWZlcmVuY2UgaXMgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBtZW1iZXIuIENoZWNrIHRoaXMgYXQKLQkJICogRW50ZXJwcmlzZSBKYXZhIEJlYW5zLCAzLjAsIFNlY3Rpb24gMTQuMS41LjMKLQkJICovCi0JCVN0cmluZyByZWZOYW1lID0gKFN0cmluZykgZ2V0QW5ub3RhdGVkVmFsdWUoIm5hbWUiLCBwYWlycyk7Ci0JCWlmIChyZWZOYW1lID09IG51bGwpIHsKLQkJCXJlZk5hbWUgPSBnZXRNZW1iZXJRdWFsaWZpZWROYW1lKG1lbWJlcik7Ci0JCX0KLQkJRWpiTG9jYWxSZWYgcmVmID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWpiTG9jYWxSZWYoKTsKLQkJcmVmLnNldEVqYlJlZk5hbWUocmVmTmFtZSk7Ci0JCWxvY2FsUmVmcy5hZGQocmVmKTsKLQkJcmVmLnNldExvY2FsKGJlYW5JbnRlcmZhY2VWYWx1ZSk7Ci0JCXJlZi5zZXRMb2NhbEhvbWUoYmVhbkludGVyZmFjZVZhbHVlKTsKLQkJcmVmLnNldEVqYkxpbmsoKFN0cmluZykgZ2V0QW5ub3RhdGVkVmFsdWUoImJlYW5OYW1lIiwgcGFpcnMpKTsKLQkJcmVmLnNldE1hcHBlZE5hbWUoKFN0cmluZykgZ2V0QW5ub3RhdGVkVmFsdWUoIm1hcHBlZE5hbWUiLCBwYWlycykpOwotCQlpZiAobWVtYmVyVHlwZSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EIHx8IG1lbWJlclR5cGUgPT0gSUphdmFFbGVtZW50LkZJRUxEKSB7Ci0JCQljcmVhdGVJbmplY3Rpb25UYXJnZXQocmVmTmFtZSwgcmVmLmdldEluamVjdGlvblRhcmdldHMoKSwgYW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSW5qZWN0aW9uVGFyZ2V0KFN0cmluZyByZWZOYW1lLCBMaXN0PEluamVjdGlvblRhcmdldD4gaW5qZWN0aW9uVGFyZ2V0cywgSUFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlJbmplY3Rpb25UYXJnZXQgaW5qZWN0aW9uVGFyZ2V0ID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5qZWN0aW9uVGFyZ2V0KCk7Ci0JCWludCBpbmRleCA9IHJlZk5hbWUuaW5kZXhPZignLycpOwotCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCWluamVjdGlvblRhcmdldC5zZXRJbmplY3Rpb25UYXJnZXRDbGFzcyhyZWZOYW1lLnN1YnN0cmluZygwLCBpbmRleCkpOwotCQkJaW5qZWN0aW9uVGFyZ2V0LnNldEluamVjdGlvblRhcmdldE5hbWUocmVmTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbmplY3Rpb25UYXJnZXQuc2V0SW5qZWN0aW9uVGFyZ2V0TmFtZShyZWZOYW1lKTsKLQkJCWluamVjdGlvblRhcmdldC5zZXRJbmplY3Rpb25UYXJnZXRDbGFzcygiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWluamVjdGlvblRhcmdldHMuYWRkKGluamVjdGlvblRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb3VyY2UgYW5ub3RhdGlvbiBjYW4gYmUgcGxhY2VkIG9uIGNsYXNzLCBtZXRob2QsIGZpZWxkLgotCSAqIAotCSAqIENoZWNrcyBhcmUgbWFkZSBpZiB0aGUgcmVzb3VyY2UgYW5ub3RhdGlvbiBpcyB2YWxpZC4KLQkgKiA8cD4KLQkgKiBJZiBvbiBjbGFzcyB0aGVyZSBzaG91bGQgYmUgYSAidHlwZSIgYXR0cmlidXRlLiBJZiBvbiBtZXRob2QgdGhlIG1ldGhvZAotCSAqIG11c3QgaGF2ZSBvbmUgcGFyYW0gd2l0aCB0eXBlIHRoYXQgaXMgYW4gaW50ZXJmYWNlLiBJZiBvbiBmaWVsZCB0aGUgZmllbGQKLQkgKiB0eXBlIG11c3QgYmUgYW4gaW50ZXJmYWNlLgotCSAqIAotCSAqIElmIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QvZmllbGQgY2FuIG5vdCBiZSByZXNvbHZlZCB0aGUgcmVzdWx0IHdpbGwKLQkgKiBjb250YWluIHRoZSB1bnJlc29sdmVkIHZhbHVlLgotCSAqIAotCSAqIEluIGNhc2UgdGhlIHR5cGUgb2YgbWV0aG9kL2ZpZWxkIGlzIGFycmF5LCB3aWxkY2FyZCwgc2ltcGxlIHR5cGUgdGhpcyBpcwotCSAqIG5vdCBhIHBsYWNlIGZvciB0aGUgYW5ub3RhdGlvbi4KLQkgKiA8L3A+Ci0JICogCi0JICogPHA+Ci0JICogSW4gY2FzZSBvZiBtZXRob2QvZmllbGQgdGhlIHR5cGUgc3BlY2lmaWVkIHVzaW5nIHRoZSAidHlwZSIgYXR0cmlidXRlIGhhcwotCSAqIGEgaGlnaGVyIHByaW9yaXR5IHRoYXQgdGhlIG1ldGhvZC9maWVsZCB0eXBlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiA8cD4KLQkgKiBPbmx5IHJlc29sdmVkIHR5cGVzIGFyZSBhZGRlZCB0byBkZXBlbmRlZFR5cGVzCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzZXNzaW9uQmVhbgotCSAqIEBwYXJhbSBtZW1iZXIKLQkgKiBAcGFyYW0gYW5ub3RhdGlvbgotCSAqIEBwYXJhbSBkZXBlbmRlZFR5cGVzCi0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUmVzb3VyY2VSZWZBbm5vdGF0aW9uKElBbm5vdGF0aW9uIGFubm90YXRpb24sIExpc3Q8UmVzb3VyY2VSZWY+IHJlc291cmNlUmVmcywgSU1lbWJlciBtZW1iZXIsCi0JCQlDb2xsZWN0aW9uPElUeXBlPiBkZXBlbmRlZFR5cGVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQotCQlJTWVtYmVyVmFsdWVQYWlyW10gcGFpcnMgPSBhbm5vdGF0aW9uLmdldE1lbWJlclZhbHVlUGFpcnMoKTsKLQkJU3RyaW5nIHNwZWNpZmllZFR5cGUgPSAoU3RyaW5nKSBnZXRBbm5vdGF0ZWRWYWx1ZSgidHlwZSIsIHBhaXJzKTsKLQkJc3BlY2lmaWVkVHlwZSA9IGludGVybmFsUHJvY2Vzc0luamVjdGlvbihzcGVjaWZpZWRUeXBlLCBtZW1iZXIsIGRlcGVuZGVkVHlwZXMpOwotCQlpZiAoc3BlY2lmaWVkVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgcmVmTmFtZSA9IChTdHJpbmcpIGdldEFubm90YXRlZFZhbHVlKCJuYW1lIiwgcGFpcnMpOwotCQlpZiAocmVmTmFtZSA9PSBudWxsKQotCQkJcmVmTmFtZSA9IGdldE1lbWJlclF1YWxpZmllZE5hbWUobWVtYmVyKTsKLQkJUmVzb3VyY2VSZWYgcmVmID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VSZWYoKTsKLQkJcmVmLnNldFJlc1JlZk5hbWUocmVmTmFtZSk7Ci0JCXJlZi5zZXRSZXNUeXBlKHNwZWNpZmllZFR5cGUpOwotCQlyZWYuc2V0TWFwcGVkTmFtZSgoU3RyaW5nKSBnZXRBbm5vdGF0ZWRWYWx1ZSgibWFwcGVkTmFtZSIsIHBhaXJzKSk7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IChTdHJpbmcpIGdldEFubm90YXRlZFZhbHVlKCJkZXNjcmlwdGlvbiIsIHBhaXJzKTsKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCURlc2NyaXB0aW9uIGRlc2MgPSBKYXZhZWVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpOwotCQkJZGVzYy5zZXRWYWx1ZShkZXNjcmlwdGlvbik7Ci0JCQlyZWYuZ2V0RGVzY3JpcHRpb25zKCkuY2xlYXIoKTsKLQkJCXJlZi5nZXREZXNjcmlwdGlvbnMoKS5hZGQoZGVzYyk7Ci0JCX0KLQkJaWYgKG1lbWJlci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5NRVRIT0QgfHwgbWVtYmVyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkZJRUxEKSB7Ci0JCQljcmVhdGVJbmplY3Rpb25UYXJnZXQocmVmTmFtZSwgcmVmLmdldEluamVjdGlvblRhcmdldHMoKSwgYW5ub3RhdGlvbik7Ci0JCX0KLQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZ2V0QW5ub3RhdGVkVmFsdWUoImF1dGhlbnRpY2F0aW9uVHlwZSIsIHBhaXJzKTsKLQkJLyoKLQkJICogdGhlIGRlZmF1bHQgdmFsdWUgaXMgQXV0aGVudGljYXRpb25UeXBlLkFQUExJQ0FUSU9OIHdoaWNoIGlzIGhhbmRsZWQKLQkJICogYnkgdGhlIEVNRi4gbm8gbmVlZCB0byBjaGVjayBmb3IgdGhpcyB2YWx1ZQotCQkgKi8KLQkJaWYgKCJBdXRoZW50aWNhdGlvblR5cGUuQ09OVEFJTkVSIi5lcXVhbHModmFsdWUpKSB7Ci0JCQlyZWYuc2V0UmVzQXV0aChSZXNBdXRoVHlwZS5DT05UQUlORVJfTElURVJBTCk7Ci0JCX0gZWxzZSBpZiAoIkNPTlRBSU5FUiIuZXF1YWxzKHZhbHVlKQotCQkJCSYmIGNvbnRhaW5zSW1wb3J0KG1lbWJlci5nZXRDb21waWxhdGlvblVuaXQoKSwgIkF1dGhlbnRpY2F0aW9uVHlwZS5DT05UQUlORVIiKSkgewotCQkJcmVmLnNldFJlc0F1dGgoUmVzQXV0aFR5cGUuQ09OVEFJTkVSX0xJVEVSQUwpOwotCQl9Ci0JCUJvb2xlYW4gc2hhcmVhYmxlID0gKEJvb2xlYW4pIGdldEFubm90YXRlZFZhbHVlKCJzaGFyZWFibGUiLCBwYWlycyk7Ci0JCS8qCi0JCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBzaGFyYWJsZSBpcyB0cnVlLiBDaGVjayBhbmQgcHJvY2VzcyBvbmx5Ci0JCSAqIHVuc2hhcmFibGUKLQkJICovCi0JCWlmIChCb29sZWFuLkZBTFNFLmVxdWFscyhzaGFyZWFibGUpKQotCQkJcmVmLnNldFJlc1NoYXJpbmdTY29wZShSZXNTaGFyaW5nU2NvcGVUeXBlLlVOU0hBUkVBQkxFX0xJVEVSQUwpOwotCi0JCXJlc291cmNlUmVmcy5hZGQocmVmKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWV0aG9kIGhhcyB0aGUgdGFzayBvZiBwcm9jZXNzaW5nIHRoZSBtZW1iZXIgYWxvbmcgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogbWVtYmVyIGFuZCByZXR1cm4gYSBTdHJpbmcuIFRoZSByZXN1bHQgaXMgdG8gYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSB2YWx1ZQotCSAqIGZvciB0aGUgaW5qZWN0aW9uIG9uIHRoaXMgbWVtYmVyLiBVc2FnZSBhcmUgdGhlCi0JICogCi0JICogQEVKQiBhbmQKLQkgKiBAUmVzb3VyY2UgYW5ub3RhdGlvbnMuCi0JICogCi0JICogPHA+Ci0JICogSWYgdGhlIHNwZWNpZmllZFR5cGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gYW5kIG1lbWJlciBpcyBvZiB0eXBlCi0JICogSUphdmFFbGVtZW50LlRZUEUgdGhlIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogPC9wPgotCSAqIAotCSAqIDxwPgotCSAqIElmIHRoZSB0eXBlIG9mIHRoZSBtZW1iZXIgY2FuIGJlIHJlc29sdmVkIGFuZCBpcyBhbiBpbnRlcmZhY2UgdGhlIG1ldGhvZAotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uIEhlcmUgdGhlICJ0eXBlIiBvZiB0aGUgbWVtYmVyIGlzIHRoZSByZXN1bHQKLQkgKiBmcm9tIHtAbGluayAjZ2V0VW5yZXNvbHZlZFR5cGUoSU1lbWJlcil9Ci0JICogPC9wPgotCSAqIAotCSAqIAotCSAqIE9ubHkgaWYgdGhlIHNwZWNpZmllZFR5cGUgY2FuIGJlIGNhbGN1bGF0ZWQgYW5kIGlzIHJlc29sdmVkIGl0IGlzIGFkZGVkCi0JICogdG8gdGhlIGRlcGVuZGVkVHlwZXMuIElmIHRoZSBzcGVjaWZpZWRUeXBlIGNhbiBub3QgYmUgcmVzb2x2ZWQgbm90aGluZyBpcwotCSAqIGFkZGVkIHRvIGRlcGVuZGVkVHlwZXMuCi0JICogCi0JICogQHNlZSB7QGxpbmsgI3Byb2Nlc3NFamJBbm5vdGF0aW9uKElBbm5vdGF0aW9uLCBTZXNzaW9uQmVhbiwgSU1lbWJlciwgQ29sbGVjdGlvbil9Ci0JICogQHNlZSAjcHJvY2Vzc1Jlc291cmNlUmVmQW5ub3RhdGlvbihTZXNzaW9uQmVhbiwgSU1lbWJlciwgSUFubm90YXRpb24sCi0JICogICAgICBDb2xsZWN0aW9uKQotCSAqIAotCSAqIEBwYXJhbSBzcGVjaWZpZWRUeXBlCi0JICogQHBhcmFtIG1lbWJlcgotCSAqIEBwYXJhbSBkZXBlbmRlZFR5cGVzCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxQcm9jZXNzSW5qZWN0aW9uKFN0cmluZyBzcGVjaWZpZWRUeXBlLCBJTWVtYmVyIG1lbWJlciwgQ29sbGVjdGlvbjxJVHlwZT4gZGVwZW5kZWRUeXBlcykKLQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlib29sZWFuIG1ldGhvZE9yRmllbGQgPSBtZW1iZXIuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9ECi0JCQkJfHwgbWVtYmVyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkZJRUxEOwotCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gKElUeXBlKSAobWVtYmVyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEUgPyBtZW1iZXIgOiBtZW1iZXIKLQkJCQkuZ2V0RGVjbGFyaW5nVHlwZSgpKTsKLQkJU3RyaW5nIG1lbWJlclR5cGUgPSBnZXRVbnJlc29sdmVkVHlwZShtZW1iZXIpOwotCQkvLyBub3QgdHlwZSBmb3IgdGhpcyBtZW1iZXIgY2FuIGJlIHJldHJpZXZlZC4gSWYgbWVtYmVyIGlzIGEgbWV0aG9kIG9yCi0JCS8vIGZpZWxkIHRoaXMgbWVhbnMgdGhlcmUgaXMgYW4gZXJyb3IuCi0JCWlmIChnZXRDbGFzc1R5cGVTaWduYXR1cmUobWVtYmVyVHlwZSkgPT0gbnVsbCAmJiBtZXRob2RPckZpZWxkKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gYm90aCB0eXBlIGFyZSBudWxsLiBUaGlzIGlzIG5vdCBhIHZhbGlkIGNhc2UuIFRoaXMgd2lsbCBoYXBlbiBmb3IgYQotCQkvLyB0eXBlIHdpdGhvdXQgc3BlY2lmaWVkIHR5cGUuCi0JCWlmIChzcGVjaWZpZWRUeXBlID09IG51bGwgJiYgbWVtYmVyVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVR5cGUgcmVzb2x2ZWRUeXBlID0gcmVzb2x2ZVR5cGUoZGVjbGFyaW5nVHlwZSwgbWVtYmVyVHlwZSk7Ci0JCS8vIHdlIHdlcmUgYWJsZSB0byBnZXQgYSB0eXBlIGZvciB0aGUgcGFyYW0gb2YgYSBtZXRob2Qgb3IgdHlwZSBvZgotCQkvLyBhIGZpZWxkLgotCQkvLyBjaGVjayBpZiBpdCBpcyBhbiBpbnRlcmZhY2UuIEl0IG1pZ2h0IG5vdCBiZSByZXNvbHZlZCwgYnV0IHdlIGhhdmUgYQotCQkvLyB2YWx1ZQotCQkvLyBmb3IgdW5yZXNvbHZlZC4KLQkJaWYgKG1ldGhvZE9yRmllbGQpIHsKLQkJCS8vIGlmIHRoZSByZXNvbHZlZCB0eXBlIGlzIG5vdCBudWxsIGFuZCBpdCBpcyBub3QgYW4gaW50ZXJmYWNlIHRoaXMKLQkJCS8vIGFubm90YXRpb24gaXMgbm90IHZhbGlkCi0JCQlpZiAocmVzb2x2ZWRUeXBlICE9IG51bGwpIHsKLQkJCQlpZiAocmVzb2x2ZWRUeXBlLmlzSW50ZXJmYWNlKCkpCi0JCQkJCW1lbWJlclR5cGUgPSByZXNvbHZlZFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJZWxzZQotCQkJCQkvLyBpbnZhbGlkIC0gaWYgdGhlIG1ldGhvZCBpcyB3aXRoIHBhcmFtIHRoYXQgaXMgbm90IGFuCi0JCQkJCS8vIGludGVyZmFjZS4gT3IgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIGlzIG5vdCBhbiBpbnRlcmZhY2UuCi0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCS8vIGZyb20gbm93IG9uZSB1c2Ugb25seSB0aGUgc3BlY2lmaWVkIHR5cGUgZm9yIHR5cGUgcmVzb2x2aW5nLiBJZiB0aGVyZQotCQkvLyBpcyBubyBzcGVjaWZpZWQgdHlwZSB1c2UgdGhlIG1lbWJlciB0eXBlLiBUaGUgY2hlY2sgZm9yIHdoZXRoZXIgdGhleQotCQkvLyB3ZXJlIGJvdGggbnVsbCBpcyBwcmV2aW91c2x5IG1hZGUKLQkJSVR5cGUgcmVzb2x2ZWRTcGVjaWZpZWRUeXBlID0gbnVsbDsKLQkJaWYgKHNwZWNpZmllZFR5cGUgPT0gbnVsbCkgewotCQkJc3BlY2lmaWVkVHlwZSA9IG1lbWJlclR5cGU7Ci0JCQlyZXNvbHZlZFNwZWNpZmllZFR5cGUgPSByZXNvbHZlZFR5cGU7Ci0JCX0gZWxzZQotCQkJcmVzb2x2ZWRTcGVjaWZpZWRUeXBlID0gcmVzb2x2ZVR5cGUoZGVjbGFyaW5nVHlwZSwgc3BlY2lmaWVkVHlwZSk7Ci0JCWlmIChyZXNvbHZlZFNwZWNpZmllZFR5cGUgIT0gbnVsbCkgewotCQkJaWYgKHJlc29sdmVkU3BlY2lmaWVkVHlwZS5pc0ludGVyZmFjZSgpKSB7Ci0JCQkJc3BlY2lmaWVkVHlwZSA9IHJlc29sdmVkU3BlY2lmaWVkVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCQlkZXBlbmRlZFR5cGVzLmFkZChyZXNvbHZlZFNwZWNpZmllZFR5cGUpOwotCQkJfSBlbHNlCi0JCQkJLy8gd2UgaGF2ZSByZXNvbHZlZCB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIGl0IGlzIG5vdCBhbgotCQkJCS8vIGludGVyZmFjZS4gTm90IGEgdmFsaWQgYW5ub3RhdGlvbi4KLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3BlY2lmaWVkVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcXVhbGlmaWVkIG5hbWUgZm9yIHRoaXMgbWVtYmVyLiBUaGUgbmFtZSBpcyB0byBiZQotCSAqIHVzZWQgYXMgZWpiLXJlZi1uYW1lLgotCSAqIAotCSAqIElmIHRoZSBtZW1iZXIgaXMgYSB0eXBlIHRoZW4gZnVsbHlRdWFsaWZpZWROYW1lIG9mIHRoZSB0eXBlIGlzIHJldHVybmVkLgotCSAqIAotCSAqIElmIHRoZSBtZW1iZXIgaXMgYSA8Y29kZT5maWVsZDwvY29kZT4gZGVjbGFyZWQgaW4gYSA8Y29kZT50eXBlPC9jb2RlPgotCSAqIHRoZW4gdGhlIHJlc3VsdCBpcwotCSAqIDxjb2RlPnR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgKyIvIiArIGZpZWxkLmVsZW1lbnROYW1lPC9jb2RlPgotCSAqIAotCSAqIElmIHRoZSBtZW1iZXIgaXMgYSA8Y29kZT5tZXRob2Q8L2NvZGU+IGRlY2xhcmVkIGluIGEgPGNvZGU+dHlwZTwvY29kZT4KLQkgKiBhbmQgbWV0aG9kIG5hbWUgYmVnaW5zIHdpdGggInNldCIgdGhlbjogZm9yIHR5cGUgbmFtZSA9Ci0JICogIm9yZy5lY2xpcHNlLkJlYW4iIGFuZCBtZXRob2QgbmFtZSA9ICJzZXRNZXRob2RPbmUoKSIgdGhlIHJlc3VsdCBpcwotCSAqICJvcmcuZWNsaXBzZS5CZWFuL21ldGhvZE9uZSIKLQkgKiAKLQkgKiBDaGVjayB0aGlzIGF0IEVudGVycHJpc2UgSmF2YSBCZWFucywgMy4wLCBTZWN0aW9uIDE0LjEuNS4zCi0JICogCi0JICogQHBhcmFtIG1lbWJlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRNZW1iZXJRdWFsaWZpZWROYW1lKElNZW1iZXIgbWVtYmVyKSB7Ci0JCVN0cmluZyBtZW1iZXJOYW1lID0gbWVtYmVyLmdldEVsZW1lbnROYW1lKCk7Ci0JCWludCBlbGVtZW50VHlwZSA9IG1lbWJlci5nZXRFbGVtZW50VHlwZSgpOwotCQlpZiAoZWxlbWVudFR5cGUgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCAmJiBtZW1iZXJOYW1lLnN0YXJ0c1dpdGgoInNldCIpKSB7Ci0JCQljaGFyIGNoID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1lbWJlck5hbWUuY2hhckF0KDMpKTsKLQkJCW1lbWJlck5hbWUgPSBjaCArIG1lbWJlck5hbWUuc3Vic3RyaW5nKDQpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50VHlwZSA9PSBJSmF2YUVsZW1lbnQuVFlQRSA/ICgoSVR5cGUpIG1lbWJlcikuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgOiBtZW1iZXIuZ2V0RGVjbGFyaW5nVHlwZSgpCi0JCQkJLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpCi0JCQkJKyAiLyIgKyBtZW1iZXJOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgamF2YWVlIHR5cGUgb2YgdGhpcyBtZW1iZXIuIEZvciB0eXBlcyByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogRm9yIG1ldGhvZHMgd2l0aCBvbmUgcGFyYW0gcmV0dXJuIHRoZSBqYXZhIHR5cGUgb2YgdGhpcyBwYXJhbS4gRm9yIGZpZWxkcwotCSAqIHJldHVybiB0aGUgcmV0dXJuIHRoZSBqYXZhIHR5cGUgb2YgdGhlIGZpZWxkLgotCSAqIAotCSAqIElmIHRoZSByZXN1bHQgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiB0aGlzIG1lbWJlciBpcyBub3QgdmFsaWQgYW5kIGEKLQkgKiBqYXZhZWUgdHlwZSBjYW4gbm90IGJlIHJldHVybmVkLiBUaGlzIG1heSBoYXBwZW4gZm9yIGEgbWV0aG9kIHdpdGggbW9yZQotCSAqIHRoZW4gb25lIHBhcmFtIG9yIGZvciBhIGZpZWxkIHdpdGggYSBjbGFzcyB0eXBlIG9yIHByaW1pdGl2ZSB0eXBlCi0JICogCi0JICogQHBhcmFtIG1lbWJlcgotCSAqIEBwYXJhbSBtZW1iZXJUeXBlCi0JICogCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VW5yZXNvbHZlZFR5cGUoSU1lbWJlciBtZW1iZXIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpbnQgbWVtYmVyVHlwZSA9IG1lbWJlci5nZXRFbGVtZW50VHlwZSgpOwotCQlJVHlwZSBkZWNsYXJpbmdUeXBlID0gbWVtYmVyLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJU3RyaW5nIHVucmVzb2x2ZWRUeXBlTmFtZSA9IG51bGw7Ci0JCWlmIChtZW1iZXJUeXBlID09IElKYXZhRWxlbWVudC5GSUVMRCkgewotCQkJdW5yZXNvbHZlZFR5cGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKCgoSUZpZWxkKSBtZW1iZXIpLmdldFR5cGVTaWduYXR1cmUoKSk7Ci0JCX0gZWxzZSBpZiAobWVtYmVyVHlwZSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0JCQlJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBtZW1iZXI7Ci0JCQlpZiAobWV0aG9kLmdldE51bWJlck9mUGFyYW1ldGVycygpICE9IDEpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl1bnJlc29sdmVkVHlwZU5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKClbMF0pOwotCQl9IGVsc2UgaWYgKG1lbWJlclR5cGUgPT0gSUphdmFFbGVtZW50LlRZUEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHVucmVzb2x2ZWRUeXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIHNpZ25hdHVyZSBmb3IgdG9SZXNvbHZlIG9ubHkgaWYgdG9SZXNvbHZlIGlzIGEgY2xhc3Mgb3IKLQkgKiBpbnRlcmZhY2UuCi0JICogCi0JICogQHBhcmFtIHRvUmVzb2x2ZQotCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdG9SZXNvbHZlIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIHNpbXBsZQotCSAqICAgICAgICAgdHlwZSwgYXJyYXkgdHlwZSwgd2lsZGNhcmQgdHlwZQotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENsYXNzVHlwZVNpZ25hdHVyZShTdHJpbmcgdG9SZXNvbHZlKSB7Ci0JCWlmICh0b1Jlc29sdmUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0b1Jlc29sdmUgPSBTaWduYXR1cmUuY3JlYXRlVHlwZVNpZ25hdHVyZSh0b1Jlc29sdmUsIGZhbHNlKTsKLQkJaWYgKFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZCh0b1Jlc29sdmUpICE9IFNpZ25hdHVyZS5DTEFTU19UWVBFX1NJR05BVFVSRSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdG9SZXNvbHZlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NEZWNsYXJlUm9sZXMoUmVzdWx0IHJlc3VsdCwgTGlzdDxTZWN1cml0eVJvbGVSZWY+IHNlY3VyaXR5Um9sZVJlZnMsIElBbm5vdGF0aW9uIGFubm90YXRpb24sCi0JCQlJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSU1lbWJlclZhbHVlUGFpcltdIHBhaXJzID0gYW5ub3RhdGlvbi5nZXRNZW1iZXJWYWx1ZVBhaXJzKCk7Ci0JCU9iamVjdCB2YWx1ZXMgPSBnZXRBbm5vdGF0ZWRWYWx1ZSgidmFsdWUiLCBwYWlycyk7Ci0JCWlmICghaXNBcnJheU9mT2JqZWN0KHZhbHVlcykpCi0JCQlyZXR1cm47Ci0JCWZvciAoT2JqZWN0IHJvbGVOYW1lIDogKE9iamVjdFtdKSB2YWx1ZXMpIHsKLQkJCVNlY3VyaXR5Um9sZSByb2xlID0gSmF2YWVlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JCQlyb2xlLnNldFJvbGVOYW1lKChTdHJpbmcpIHJvbGVOYW1lKTsKLQkJCXJlc3VsdC5nZXRBZGRpdGlvbmFsKCkuYWRkKHJvbGUpOwotCQkJU2VjdXJpdHlSb2xlUmVmIHJlZiA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3VyaXR5Um9sZVJlZigpOwotCQkJcmVmLnNldFJvbGVOYW1lKChTdHJpbmcpIHJvbGVOYW1lKTsKLQkJCXNlY3VyaXR5Um9sZVJlZnMuYWRkKHJlZik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUmVzb3VyY2VzQW5ub3RhdGlvbihJQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBMaXN0PFJlc291cmNlUmVmPiByZXNvdXJjZVJlZnMsIElUeXBlIHR5cGUsCi0JCQlDb2xsZWN0aW9uPElUeXBlPiBkZXBlbmRlZFR5cGVzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSU1lbWJlclZhbHVlUGFpcltdIHBhaXJzID0gYW5ub3RhdGlvbi5nZXRNZW1iZXJWYWx1ZVBhaXJzKCk7Ci0JCWlmICghaXNBcnJheU9mT2JqZWN0KHBhaXJzWzBdLmdldFZhbHVlKCkpKQotCQkJcmV0dXJuOwotCQlPYmplY3RbXSB2YWx1ZXMgPSAoT2JqZWN0W10pIHBhaXJzWzBdLmdldFZhbHVlKCk7Ci0JCWZvciAoT2JqZWN0IHJlc291cmNlQW5ub3RhdGlvbiA6IHZhbHVlcykgewotCQkJcHJvY2Vzc1Jlc291cmNlUmVmQW5ub3RhdGlvbigoSUFubm90YXRpb24pIHJlc291cmNlQW5ub3RhdGlvbiwgcmVzb3VyY2VSZWZzLCB0eXBlLCBkZXBlbmRlZFR5cGVzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NSdW5BcyhJQW5ub3RhdGlvbiBhbm5vdGF0aW9uLFJ1bkFzIHJ1bkFzKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSU1lbWJlclZhbHVlUGFpcltdIHBhaXJzID0gYW5ub3RhdGlvbi5nZXRNZW1iZXJWYWx1ZVBhaXJzKCk7Ci0JCWlmIChwYWlycy5sZW5ndGggPT0gMSkgewotCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZ2V0QW5ub3RhdGVkVmFsdWUoInZhbHVlIiwgcGFpcnMpOwotCQkJcnVuQXMuc2V0Um9sZU5hbWUodmFsdWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL2NvbW1vbi9BYnN0cmFjdEFubm90YXRpb25Nb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvY29tbW9uL0Fic3RyYWN0QW5ub3RhdGlvbk1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzN2YzNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvY29tbW9uL0Fic3RyYWN0QW5ub3RhdGlvbk1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5TZXNzaW9uQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLkpFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci0KLS8qKgotICogQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgbW9kZWwgcHJvdmlkZXJzIGJhc2VkIG9uIGFubm90YXRpb25zIGluIGphdmEgZmlsZXMuCi0gKiAKLSAqIExpc3RlbmVycyBjYW4gYmUgcmVnaXN0ZXJlZCB3aXRoIHtAbGluayAjYWRkTGlzdGVuZXIoSU1vZGVsUHJvdmlkZXJMaXN0ZW5lcil9Ci0gKiAKLSAqIEBhdXRob3IgS2lyaWwgTWl0b3Ygay5taXRvdkBzYXAuY29tCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QW5ub3RhdGlvbk1vZGVsUHJvdmlkZXI8VD4gaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciwgSU1vZGVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfRVhURU5TSU9OID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBGaW5kIHRoZSBzZWN1cml0eSByb2xlIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhlIGdpdmVuIGFzc2VtYmx5Ci0JICogZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gYXNzZW1ibHkKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgYSBzZWN1cml0eSByb2xlIHdpdGggdGhpcyBuYW1lIGNhbiBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU2VjdXJpdHlSb2xlIGZpbmRSb2xlKENvbGxlY3Rpb248U2VjdXJpdHlSb2xlPiBzZWN1cml0eVJvbGVzLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKFNlY3VyaXR5Um9sZSByb2xlIDogc2VjdXJpdHlSb2xlcykgewotCQkJaWYgKHJvbGUuZ2V0Um9sZU5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIHJvbGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFQgbW9kZWxPYmplY3Q7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SU1vZGVsUHJvdmlkZXJMaXN0ZW5lcj4gbGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBMb2NrIGxpc3RlbmVyc0xvY2sgPSBuZXcgUmVlbnRyYW50TG9jaygpOwotCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdDsKLQotCXByaXZhdGUgTWFueVRvT25lUmVsYXRpb248U2VjdXJpdHlSb2xlUmVmLCBTZWN1cml0eVJvbGU+IHJvbGVzVG9Sb2xlc1JlZiA9IG5ldyBNYW55VG9PbmVSZWxhdGlvbjxTZWN1cml0eVJvbGVSZWYsIFNlY3VyaXR5Um9sZT4oKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgQW5ub3RhdGlvblJlYWRlciBmb3IgdGhpcyBmYWNldGVkIHByb2plY3QuIEFuIGlsbGVnYWwKLQkgKiBhcmd1bWVudCBpZiBhIHByb2plY3Qgd2l0aCB2YWx1ZSA8Y29kZT5udWxsPC9jb2RlPiBpcyBwYXNzZWQuIE5vIGxvYWRpbmcKLQkgKiBpcyBkb25lIGluIHRoaXMgY29uc3RydWN0b3IuIExvYWRpbmcgdGhlIG1vZGVsIGlzIG1hZGUgb24gZGVtYW5kIHdoZW4KLQkgKiBjYWxsaW5nIHtAbGluayAjZ2V0TW9kZWxPYmplY3QoKX0uCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHRoZSBlamIgcHJvamVjdC4gQ2FuIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEFubm90YXRpb25Nb2RlbFByb3ZpZGVyKElGYWNldGVkUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcHJvamVjdCBhcmd1bWVudCBjYW4gbm90IGJlIG51bGwiKTsKLQkJdGhpcy5mYWNldGVkUHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHVibGljIFQgZ2V0Q29uY3JldGVNb2RlbCgpIHsKLQkJaWYgKG1vZGVsT2JqZWN0ID09IG51bGwpIHsKLQkJCXByZUxvYWQoKTsKLQkJCXRyeSB7Ci0JCQkJbG9hZE1vZGVsKCk7Ci0JCQkJLyoKLQkJCQkgKiBBZGRpbmcgdGhlIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lciBhZnRlciBsb2FkaW5nIHRoZSBtb2RlbC4KLQkJCQkgKiBObyByZXNvdXJjZSBjaGFuZ2UgZXZlbnQgYXJlIGFjY2VwdGFibGUgd2hpbGUgbG9hZGluZyB0aGUKLQkJCQkgKiBtb2RlbC4KLQkJCQkgKi8KLQkJCQlwb3N0TG9hZCgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbE9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1vZGVsT2JqZWN0KCkgewotCQlyZXR1cm4gZ2V0Q29uY3JldGVNb2RlbCgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoSVBhdGggbW9kZWxQYXRoKSB7Ci0JCXJldHVybiBnZXRDb25jcmV0ZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbG9hZE1vZGVsKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVMb2FkKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvc3RMb2FkKCkgewotCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgd2l0aCB0aGlzIG1vZGVsIGV2ZW50LiBJZiB0aGUKLQkgKiB7QGxpbmsgSU1vZGVsUHJvdmlkZXJFdmVudCNnZXRDaGFuZ2VkUmVzb3VyY2VzKCl9IGlzIGVtcHR5IG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gdGhlIG1ldGhvZCByZXR1cm5zIGltbWVkaWF0ZWx5LgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIGV2ZW50IHRoYXQgc2hvdWxkIGJlIHNlbmQgdG8gdGhlIGxpc3RlbmVycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhmaW5hbCBJTW9kZWxQcm92aWRlckV2ZW50IGV2ZW50KSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbGlzdGVuZXJzTG9jay5sb2NrKCk7Ci0JCXRyeSB7Ci0JCQlJTW9kZWxQcm92aWRlckxpc3RlbmVyW10gYmFja3VwID0gbGlzdGVuZXJzLnRvQXJyYXkobmV3IElNb2RlbFByb3ZpZGVyTGlzdGVuZXJbbGlzdGVuZXJzLnNpemUoKV0pOwotCQkJbm90aWZ5TGlzdGVuZXJzKGJhY2t1cCwgZXZlbnQpOwotCQkJYmFja3VwID0gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCWxpc3RlbmVyc0xvY2sudW5sb2NrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGxpc3Qgb2YgbGlzdGVuZXJzLiBObyBub3RpZmljYXRpb25zIGNhbiBvY2N1ciB3aGlsZSBjbGVhcmluZwotCSAqIHRoZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJMaXN0ZW5lcnMoKSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWxpc3RlbmVyc0xvY2subG9jaygpOwotCQkJbGlzdGVuZXJzLmNsZWFyKCk7Ci0JCQlsaXN0ZW5lcnMgPSBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJbGlzdGVuZXJzTG9jay51bmxvY2soKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoZmluYWwgSU1vZGVsUHJvdmlkZXJMaXN0ZW5lcltdIGFMaXN0ZW5lcnMsIGZpbmFsIElNb2RlbFByb3ZpZGVyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKSA9PSBudWxsIHx8IGV2ZW50LmdldENoYW5nZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCWZvciAoZmluYWwgSU1vZGVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lciA6IGFMaXN0ZW5lcnMpIHsKLQkJCVNhZmVSdW5uZXIucnVuKG5ldyBJU2FmZVJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCWxpc3RlbmVyLm1vZGVsc0NoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgY3VycmVudGx5IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElNb2RlbFByb3ZpZGVyTGlzdGVuZXI+IGdldExpc3RlbmVycygpIHsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElNb2RlbFByb3ZpZGVyTGlzdGVuZXI+KCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhpcyBpbnN0YW5jZS4gTm8gbGlzdGVuZXJzIGNhbiBiZSBhZGRlZCBkdXJpbmcKLQkgKiBub3RpZnlpbmcgdGhlIGN1cnJlbnQgbGlzdGVuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElNb2RlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzTG9jay5sb2NrKCk7Ci0JCXRyeSB7Ci0JCQlnZXRNb2RlbE9iamVjdCgpOwotCQkJZ2V0TGlzdGVuZXJzKCkuYWRkKGxpc3RlbmVyKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWxpc3RlbmVyc0xvY2sudW5sb2NrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoaXMgaW5zdGFuY2UuIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsCi0JICogbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTW9kZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVyc0xvY2subG9jaygpOwotCQl0cnkgewotCQkJZ2V0TGlzdGVuZXJzKCkucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWxpc3RlbmVyc0xvY2sudW5sb2NrKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBqYXZhUHJvamVjdAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gcHJvamVjdCBjb250YWlucyByZXNvdXJjZXMgdGhhdCBhcmUgcmVsYXRpdmUgdG8KLQkgKiAgICAgICAgIHRoZSBtb2RlbC4gVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBmb3IgdGhlCi0JICogICAgICAgICBlamJQcm9qZWN0IG9uIHdoaWNoIHRoaXMgaW5zdGFuY2UgaXMgd29ya2luZyBhIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogICAgICAgICBmb3IgaXRzIGNsaWVudCBwcm9qZWN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUHJvamVjdFJlbGF0aXZlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCB8fCBmYWNldGVkUHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlIGlmIChqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZXF1YWxzKGZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3QoKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UgdGhlIGN1cnJlbnQgaW5zdGFuY2UuIFRoZSBhY3R1YWwgZGlzcG9zZSBtYXkgb2NjdXIgaW4gYW5vdGhlcgotCSAqIHRocmVhZC4gVXNlIHtAbGluayAjYWRkTGlzdGVuZXIoSU1vZGVsUHJvdmlkZXJMaXN0ZW5lcil9IHRvIHJlZ2lzdGVyIGEKLQkgKiBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgZGlzcG9zZWQuIEFmdGVyIGFsbAotCSAqIHRoZSBsaXN0ZW5lcnMgYXJlIG5vdGlmaWVkIHRoZSBsaXN0IG9mIGxpc3RlbmVycyBpcyBjbGVhcmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUlNb2RlbFByb3ZpZGVyRXZlbnQgbW9kZWxFdmVudCA9IGNyZWF0ZU1vZGVsUHJvdmlkZXJFdmVudCgpOwotCQltb2RlbEV2ZW50LmFkZFJlc291cmNlKGZhY2V0ZWRQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCW1vZGVsRXZlbnQuc2V0RXZlbnRDb2RlKElNb2RlbFByb3ZpZGVyRXZlbnQuVU5MT0FERURfUkVTT1VSQ0UpOwotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQltb2RlbE9iamVjdCA9IG51bGw7Ci0JCW5vdGlmeUxpc3RlbmVycyhtb2RlbEV2ZW50KTsKLQkJY2xlYXJMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIGEgdW5pdCBhcyAicmVtb3ZlZCIuIFRoZSBtZXRob2QgaXMgYWxsb3dlZCBub3QgdG8gbWFrZSBjaGVja3MKLQkgKiB3aGV0aGVyIHRoZSB1bml0IHdhcyBhZGRlZC9yZW1vdmVkL2NoYW5nZS4gSXQgaXMgcHJvY2Vzc2luZyB0aGUgdW5pdCBhcwotCSAqICJyZW1vdmVkIi4KLQkgKiAKLQkgKiBJZiBubyBtb2RlbCBvYmplY3QgZGVwZW5kcyBvbiB0aGUgZ2l2ZW4gZmlsZSAibW9kZWxFdmVudCIgaXMgbm90IGNoYW5nZWQuCi0JICogCi0JICogQHNlZSAjcHJvY2Vzc0FkZGVkQ29tcGlsYXRpb25Vbml0KElNb2RlbFByb3ZpZGVyRXZlbnQsIElDb21waWxhdGlvblVuaXQpCi0JICogQHBhcmFtIG1vZGVsRXZlbnQKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gYmUgcmVtb3ZlZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgZHVyaW5nIHBhcnNpbmcgdGhlIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChJTW9kZWxQcm92aWRlckV2ZW50IG1vZGVsRXZlbnQsIElDb21waWxhdGlvblVuaXQgdW5pdCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUHJvY2VzcyBhIHVuaXQgYXMgImFkZGVkIi4gVGhlIG1ldGhvZCBpcyBhbGxvd2VkIG5vdCB0byBtYWtlIGNoZWNrcwotCSAqIHdoZXRoZXIgdGhlIHVuaXQgd2FzIGFkZGVkL3JlbW92ZWQvY2hhbmdlLiBJdCBpcyBwcm9jZXNzaW5nIHRoZSBmaWxlIGFzCi0JICogImFkZGVkIi4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gbWFrZSBzdXJlIHRoZQotCSAqIHByb2Nlc3Npbmcgb2YgdGhlIGZpbGUgYXMgYWRkZWQgd2lsbCBub3QgbGVhdmUgdGhlIG1vZGVsIGluIGEgd3JvbmcKLQkgKiBzdGF0ZS4KLQkgKiAKLQkgKiBtb2RlbEV2ZW50IGlzIGNoYW5nZWQgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYWRkZWQgbW9kZWxPYmplY3QuCi0JICogCi0JICogQHNlZSAjcHJvY2Vzc1JlbW92ZWRDb21waWxhdGlvblVuaXQoSU1vZGVsUHJvdmlkZXJFdmVudCwKLQkgKiAgICAgIElDb21waWxhdGlvblVuaXQpCi0JICogQHBhcmFtIG1vZGVsRXZlbnQKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdGhhdCB3YXMgYWRkZWQKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcm9jZXNzQWRkZWRDb21waWxhdGlvblVuaXQoSU1vZGVsUHJvdmlkZXJFdmVudCBtb2RlbEV2ZW50LCBJQ29tcGlsYXRpb25Vbml0IGZpbGUpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFByb2Nlc3MgYSB1bml0IGFzICJjaGFuZ2VkIi4gVGhlIG1ldGhvZCBpcyBhbGxvd2VkIG5vdCB0byBtYWtlIGNoZWNrcwotCSAqIHdoZXRoZXIgdGhlIHVuaXQgd2FzIGFkZGVkL3JlbW92ZWQvY2hhbmdlLiBJdCBpcyBwcm9jZXNzaW5nIHRoZSB1bml0IGFzCi0JICogImNoYW5nZWQiLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBtYWtlIHN1cmUgdGhlCi0JICogcHJvY2Vzc2luZyBvZiB0aGUgZmlsZSBhcyAiY2hhbmdlZCIgd2lsbCBub3QgbGVhdmUgdGhlIG1vZGVsIGluIGEgd3JvbmcKLQkgKiBzdGF0ZS4KLQkgKiAKLQkgKiBAc2VlICNwcm9jZXNzQWRkZWRDb21waWxhdGlvblVuaXQoSU1vZGVsUHJvdmlkZXJFdmVudCwgSUNvbXBpbGF0aW9uVW5pdCkKLQkgKiBAc2VlICNwcm9jZXNzUmVtb3ZlZENvbXBpbGF0aW9uVW5pdChJTW9kZWxQcm92aWRlckV2ZW50LAotCSAqICAgICAgSUNvbXBpbGF0aW9uVW5pdCkKLQkgKiBAcGFyYW0gbW9kZWxFdmVudAotCSAqIEBwYXJhbSB1bml0Ci0JICogICAgICAgICAgICB0aGUgdW50aSB0aGF0IHdhcyBjaGFuZ2VkCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc0NoYW5nZWRDb21waWxhdGlvblVuaXQoSU1vZGVsUHJvdmlkZXJFdmVudCBtb2RlbEV2ZW50LCBJQ29tcGlsYXRpb25Vbml0IGZpbGUpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCXByb3RlY3RlZCB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCX0KLQotCXByb3RlY3RlZCBNeU1vZGVsUHJvdmlkZXJFdmVudCBjcmVhdGVNb2RlbFByb3ZpZGVyRXZlbnQoKSB7Ci0JCXJldHVybiBuZXcgTXlNb2RlbFByb3ZpZGVyRXZlbnQoMCwgbnVsbCwgZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS1TRUNVUklUWSBST0xFUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCXByb3RlY3RlZCBhYnN0cmFjdCBDb2xsZWN0aW9uPFNlY3VyaXR5Um9sZT4gZ2V0U2VjdXJpdHlSb2xlcygpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbGxlY3Rpb248U2VjdXJpdHlSb2xlUmVmPiBnZXRTZWN1cml0eVJvbGVSZWZzKEphdmFFRU9iamVjdCB0YXJnZXQpOwotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgY29ubmVjdGlvbiBtYWludGFpbmVkIGJ5IHRoZSBnaXZlbiBiZWFuIGFuZCB0aGUgc2VjdXJpdHkKLQkgKiByb2xlcyBkZWZpbmVkIGluIHRoZSBiZWFuLiBJZiB0aGlzIGlzIHRoZSBvbmx5IGJlYW4gaW4gd2hpY2ggdGhlIHJvbGUgaXMKLQkgKiBkZWZpbmVkLCB0aGUgcm9sZSB3aWxsIGFsc28gYmUgZGVsZXRlZC4gQ2FsbGluZyB0aGlzIG1ldGhvZCBtYWtlcyBzZW5zZQotCSAqIG9ubHkgaWYgdGhlIGJlYW4gYW5kIHRoZSBzZWN1cml0eSByb2xlIGFuZCB0aGUgYmVhbiB3ZXJlIGNvbm5lY3RlZCB3aXRoCi0JICoge0BsaW5rICNjb25uZWN0V2l0aFJvbGUoU2VjdXJpdHlSb2xlLCBTZXNzaW9uQmVhbil9Ci0JICogCi0JICogPHA+Ci0JICogSWYgdGhlIGJlYW4gaXMgbm90IG9mIHR5cGUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW4gdGhlCi0JICogbWV0aG9kIHJldHVybnMgaW1tZWRpYXRlbHkuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgI2Nvbm5lY3RXaXRoUm9sZShTZWN1cml0eVJvbGUsIFNlc3Npb25CZWFuKQotCSAqIEBzZWUgI3JvbGVzVG9Sb2xlc1JlZgotCSAqIEBwYXJhbSBiZWFuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzY29ubmVjdEZyb21Sb2xlcyhKYXZhRUVPYmplY3QgdGFyZ2V0KSB7Ci0JCUNvbGxlY3Rpb248U2VjdXJpdHlSb2xlPiByb2xlcyA9IGdldFNlY3VyaXR5Um9sZXMoKTsKLQkJaWYgKHJvbGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNvbGxlY3Rpb248U2VjdXJpdHlSb2xlUmVmPiByZWZzID0gZ2V0U2VjdXJpdHlSb2xlUmVmcyh0YXJnZXQpOwotCQlpZiAocmVmcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKFNlY3VyaXR5Um9sZVJlZiByZWYgOiByZWZzKSB7Ci0JCQlTZWN1cml0eVJvbGUgcm9sZSA9IHJvbGVzVG9Sb2xlc1JlZi5nZXRUYXJnZXQocmVmKTsKLQkJCXJvbGVzVG9Sb2xlc1JlZi5kaXNjb25uZWN0U291cmNlKHJlZik7Ci0JCQlpZiAoIXJvbGVzVG9Sb2xlc1JlZi5jb250YWluc1RhcmdldChyb2xlKSkgewotCQkJCWdldFNlY3VyaXR5Um9sZXMoKS5yZW1vdmUocm9sZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIHNlY3VyaXR5IHJvbGUgd2FzIGZvdW5kIGluIHRoZSBnaXZlbiBmaWxlLiBBZGQgdGhpcyBzZWN1cml0eSByb2xlIHRvCi0JICogdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IuIElmIHRoZSBlamJKYXIgZG9lcyBub3QgaGF2ZSBhbiBhc3NlbWJseQotCSAqIGRlc2NyaXB0b3IgYSBuZXcgb25lIGlzIGNyZWF0ZWQuCi0JICogCi0JICogQHNlZSAjY29ubmVjdFJvbGVXaXRoQmVhbihTZWN1cml0eVJvbGUsIFNlc3Npb25CZWFuKXMKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBzZWN1cml0eVJvbGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWN1cml0eVJvbGVGb3VuZChKYXZhRUVPYmplY3Qgb2JqZWN0LCBTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlKSB7Ci0JCWNvbm5lY3RXaXRoUm9sZShzZWN1cml0eVJvbGUsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQSBzZWN1cml0eSByb2xlIGNhbiBiZSBkZWZpbmVkIGluIG1vcmUgdGhlIG9uZSBiZWFuLiBBIGJlYW4gY2FuIGRlZmluZQotCSAqIG1vcmUgdGhlbiBvbmUgc2VjdXJpdHkgcm9sZS4gVGhpcyBtZWFucyB3ZSBoYXZlIGEgbWFueS10by1tYW55IHJlbGF0aW9uCi0JICogYmV0d2VlbiBzZXNzaW9uQmVhbnMgYW5kIHNlY3VyaXR5Um9sZXMuCi0JICogCi0JICogPHA+Ci0JICogTHVja2lseSBhIHNlc3Npb25CZWFuIGNvbnRhaW5zIGEgbGlzdCBvZiBzZWN1cml0eVJvbGVSZWZzLiBUaGlzIG1ldGhvZAotCSAqIGNyZWF0ZXMgYSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIHNlY3VyaXR5Um9sZSBjb250YWluZWQgaW4gdGhlIGFzc2VtYmx5Ci0JICogZGVzY3JpcHRvciBhbmQgdGhlIHNlY3VyaXR5IHJvbGUgcmVmIGNvbnRhaW5lZCBpbiB0aGUgYmVhbi4KLQkgKiAKLQkgKiBJZiBhIHNlY3VyaXR5IHJvbGUgaXMgZGVmaW5lIG9ubHkgaW4gb25lIGJlYW4sIGRlbGV0aW5nIHRoZSBiZWFuIG1lYW5zCi0JICogZGVsZXRpbmcgdGhlIHNlY3VyaXR5IHJvbGUuIEJ1dCBpZiB0aGUgc2VjdXJpdHkgcm9sZSBpcyBkZWZpbmVkIGluIHR3bwotCSAqIGJlYW5zIG9ubHkgZGVsZXRpbmcgYm90aCBiZWFucyB3aWxsIHJlc3VsdCBpbiBkZWxldGluZyB0aGUgc2VjdXJpdHkgcm9sZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSAjZGlzY29ubmVjdEZyb21Sb2xlcyhKYXZhRUVPYmplY3QpCi0JICogQHNlZSAjcm9sZXNUb1JvbGVzUmVmCi0JICogQHBhcmFtIHNlY3VyaXR5Um9sZQotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29ubmVjdFdpdGhSb2xlKFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGUsIEphdmFFRU9iamVjdCB0YXJnZXQpIHsKLQkJQ29sbGVjdGlvbjxTZWN1cml0eVJvbGU+IHJvbGVzID0gZ2V0U2VjdXJpdHlSb2xlcygpOwotCQlpZiAocm9sZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ29sbGVjdGlvbjxTZWN1cml0eVJvbGVSZWY+IHJlZnMgPSBnZXRTZWN1cml0eVJvbGVSZWZzKHRhcmdldCk7Ci0JCWlmIChyZWZzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8qCi0JCSAqIElmIHRoZXJlIGlzIGEgc2VjdXJpdHkgcm9sZSB3aXRoIHRoaXMgbmFtZSB1c2UgdGhlIGV4aXN0aW5nIHNlY3VyaXR5Ci0JCSAqIHJvbGUuCi0JCSAqLwotCQlTZWN1cml0eVJvbGUgcm9sZSA9IGZpbmRSb2xlKHJvbGVzLCBzZWN1cml0eVJvbGUuZ2V0Um9sZU5hbWUoKSk7Ci0JCWlmIChyb2xlID09IG51bGwpIHsKLQkJCXJvbGVzLmFkZChzZWN1cml0eVJvbGUpOwotCQkJcm9sZSA9IHNlY3VyaXR5Um9sZTsKLQkJfQotCQlmb3IgKFNlY3VyaXR5Um9sZVJlZiByZWYgOiByZWZzKSB7Ci0JCQlpZiAocmVmLmdldFJvbGVOYW1lKCkuZXF1YWxzKHJvbGUuZ2V0Um9sZU5hbWUoKSkpCi0JCQkJcm9sZXNUb1JvbGVzUmVmLmNvbm5lY3QocmVmLCByb2xlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKGZpbmFsIEVsZW1lbnRDaGFuZ2VkRXZlbnQgamF2YUV2ZW50KSB7Ci0JCWlmIChqYXZhRXZlbnQuZ2V0VHlwZSgpID09IEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9SRUNPTkNJTEUpCi0JCQlpbnRlcm5hbFBvc3RSZWNvbmNpbGUoamF2YUV2ZW50KTsKLQkJZWxzZSBpZiAoamF2YUV2ZW50LmdldFR5cGUoKSA9PSBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFKQotCQkJaW50ZXJuYWxQb3N0Q2hhbmdlKGphdmFFdmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsUG9zdENoYW5nZShFbGVtZW50Q2hhbmdlZEV2ZW50IGphdmFFdmVudCkgewotCQlJTW9kZWxQcm92aWRlckV2ZW50IG1vZGVsRXZlbnQgPSBjcmVhdGVNb2RlbFByb3ZpZGVyRXZlbnQoKTsKLQkJLy8gaGFuZGxlcyBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFIC0gdGhlIGNhc2Ugd2hlbiB0aGUKLQkJLy8gY29tcGlsYXRpb24gdW5pdCBoYXMgYmVlbiBjaGFuZ2VkCi0JCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGQgOiBqYXZhRXZlbnQuZ2V0RGVsdGEoKS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCWlmIChjaGlsZC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLQkJCQlwcm9jZXNzQ2hhbmdlZFByb2plY3QobW9kZWxFdmVudCwgY2hpbGQpOwotCQkJCW5vdGlmeUxpc3RlbmVycyhtb2RlbEV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFBvc3RSZWNvbmNpbGUoZmluYWwgRWxlbWVudENoYW5nZWRFdmVudCBqYXZhRXZlbnQpIHsKLQkJSU1vZGVsUHJvdmlkZXJFdmVudCBtb2RlbEV2ZW50ID0gY3JlYXRlTW9kZWxQcm92aWRlckV2ZW50KCk7Ci0JCWlmIChqYXZhRXZlbnQuZ2V0RGVsdGEoKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQlyZWN1cnNldmlseVByb2Nlc3NDb21waWxhdGlvblVuaXRzKG1vZGVsRXZlbnQsIGphdmFFdmVudC5nZXREZWx0YSgpKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhtb2RlbEV2ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NDaGFuZ2VkUHJvamVjdChJTW9kZWxQcm92aWRlckV2ZW50IGV2ZW50LCBJSmF2YUVsZW1lbnREZWx0YSBwcm9qZWN0RGVsdGEpIHsKLQkJaWYgKCFpc1Byb2plY3RSZWxhdGl2ZShwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpLmdldEphdmFQcm9qZWN0KCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQXNzZXJ0LmlzVHJ1ZShwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0LAotCQkJCSJBbiBpbnZhbGlkIGNoYW5nZSBub3RpZmljYXRpb24gaGFzIG9jY3VyZWQuIEVsZW1lbnQgaXMgPCIgKyBwcm9qZWN0RGVsdGEuZ2V0RWxlbWVudCgpICsgIj4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJaWYgKCgocHJvamVjdERlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX09QRU5FRCkgIT0gMCkKLQkJCQl8fCBwcm9qZWN0RGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkFEREVEKSB7Ci0JCQl0cnkgewotCQkJCWxvYWRNb2RlbCgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJSkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coCi0JCQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luSUQoKSwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJCX0KLQkJfQotCi0JCWlmICgoKHByb2plY3REZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DTE9TRUQpICE9IDApCi0JCQkJfHwgcHJvamVjdERlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5SRU1PVkVEKSB7Ci0JCQlkaXNwb3NlKCk7Ci0JCX0KLQotCQlwcm9jZXNzQ2hhbmdlZFByb2plY3RDaGlsZHJlbihldmVudCwgcHJvamVjdERlbHRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ2hhbmdlZFByb2plY3RDaGlsZHJlbihJTW9kZWxQcm92aWRlckV2ZW50IGV2ZW50LCBJSmF2YUVsZW1lbnREZWx0YSBwcm9qZWN0RGVsdGEpIHsKLQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZERlbHRhIDogcHJvamVjdERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkgewotCQkJaWYgKCEoY2hpbGREZWx0YS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICgoY2hpbGREZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9DSElMRFJFTikgIT0gMCkgewotCQkJCXJlY3Vyc2V2aWx5UHJvY2Vzc1BhY2thZ2VzKGV2ZW50LCBjaGlsZERlbHRhKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlY3Vyc2V2aWx5UHJvY2Vzc1BhY2thZ2VzKElNb2RlbFByb3ZpZGVyRXZlbnQgbW9kZWxFdmVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKGRlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQpIHsKLQkJCXRyeSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCA9IChJUGFja2FnZUZyYWdtZW50KSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5BRERFRCkgewotCQkJCQlmb3IgKElDb21waWxhdGlvblVuaXQgdW5pdCA6IGZyYWdtZW50LmdldENvbXBpbGF0aW9uVW5pdHMoKSkgewotCQkJCQkJcHJvY2Vzc0FkZGVkQ29tcGlsYXRpb25Vbml0KG1vZGVsRXZlbnQsIHVuaXQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuUkVNT1ZFRCkgewotCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQpIHsKLQkJCQkJCXByb2Nlc3NSZW1vdmVkUGFja2FnZShtb2RlbEV2ZW50LCBkZWx0YSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEKSB7Ci0JCQkJCXJlY3Vyc2V2aWx5UHJvY2Vzc0NvbXBpbGF0aW9uVW5pdHMobW9kZWxFdmVudCwgZGVsdGEpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUpFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpbklEKCksIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKElKYXZhRWxlbWVudERlbHRhIGNoaWxkRGVsdGEgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCQlyZWN1cnNldmlseVByb2Nlc3NQYWNrYWdlcyhtb2RlbEV2ZW50LCBjaGlsZERlbHRhKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByb2Nlc3NSZW1vdmVkUGFja2FnZShJTW9kZWxQcm92aWRlckV2ZW50IG1vZGVsRXZlbnQsIElKYXZhRWxlbWVudERlbHRhIGRlbHRhKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCByZWN1cnNldmlseVByb2Nlc3NDb21waWxhdGlvblVuaXRzKElNb2RlbFByb3ZpZGVyRXZlbnQgbW9kZWxFdmVudCwgSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKGRlbHRhLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElDb21waWxhdGlvblVuaXQpIHsKLQkJCWlmICghaXNQcm9qZWN0UmVsYXRpdmUoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEphdmFQcm9qZWN0KCkpKQotCQkJCXJldHVybjsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdCB1bml0ID0gKElDb21waWxhdGlvblVuaXQpIGRlbHRhLmdldEVsZW1lbnQoKTsKLQotCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQURERUQpIHsKLQkJCQkJcHJvY2Vzc0FkZGVkQ29tcGlsYXRpb25Vbml0KG1vZGVsRXZlbnQsIHVuaXQpOwotCQkJCX0KLQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLlJFTU9WRUQpIHsKLQkJCQkJcHJvY2Vzc1JlbW92ZWRDb21waWxhdGlvblVuaXQobW9kZWxFdmVudCwgdW5pdCk7Ci0JCQkJfQotCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCkgewotCQkJCQlpZiAoKChkZWx0YS5nZXRGbGFncygpICYgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1JFU09VUkNFKSA9PSAwKQotCQkJCQkJCXx8ICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9XT1JLSU5HX0NPUFkpID09IDApKSB7Ci0JCQkJCQlwcm9jZXNzQ2hhbmdlZENvbXBpbGF0aW9uVW5pdChtb2RlbEV2ZW50LCB1bml0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUpFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotCQkJCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpbklEKCksIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKElKYXZhRWxlbWVudERlbHRhIGNoaWxkRGVsdGEgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCQlyZWN1cnNldmlseVByb2Nlc3NDb21waWxhdGlvblVuaXRzKG1vZGVsRXZlbnQsIGNoaWxkRGVsdGEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXRKYXZhRmlsZXMoZmluYWwgQ29sbGVjdGlvbjxJQ29tcGlsYXRpb25Vbml0PiBqYXZhRmlsZXMsIGZpbmFsIElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChyb290LmdldEtpbmQoKSAhPSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkKLQkJCXJldHVybjsKLQkJcm9vdC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKS5hY2NlcHQobmV3IElSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQlpZiAocHJveHkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuIiArIEpBVkFfRVhURU5TSU9OKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJCWlmICghcm9vdC5nZXRKYXZhUHJvamVjdCgpLmlzT25DbGFzc3BhdGgoZmlsZSkpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJaWYgKCFmaWxlLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9PTkUpKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCWphdmFGaWxlcy5hZGQoSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSwgSUNvbnRhaW5lci5OT05FKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9jb21tb24vQWJzdHJhY3RNZXJnZWRNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvY29tbW9uL0Fic3RyYWN0TWVyZ2VkTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGYzNTU1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9jb21tb24vQWJzdHJhY3RNZXJnZWRNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5jb21tb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUuSkVFUGx1Z2luOwotCi0vKioKLSAqIEEgYmFzZSBjbGFzcyBmb3IgbW9kZWwgcHJvdmlkZXJzIHByb3ZpZGluZyBhIG1lcmdlZCB2aWV3IGJldHdlZW4gdHdvCi0gKiBkaWZmZXJlbnQgbW9kZWwgcHJvdmlkZXJzLiBUaGUgaW5zdGFuY2Ugd2lsbCBiZSBjYWxsZWQgIm1lcmdlZE1vZGVsUHJvdmlkZXIiCi0gKiB3aGVyZSB0aGUgdHdvIGNvbXBvc2VkIHByb3ZpZGVycyB3aWxsIGJlIGNhbGxlZCAiaW50ZXJuYWxQcm92aWRlcnMiCi0gKiAKLSAqIFRoaXMgY2xhc3MgaW50cm9kdWNlcyB0aGUgbm90YXRpb24gb2YgYSBkaXNwb3NlZCBzdGF0ZS4ge0BsaW5rICNkaXNwb3NlKCl9IGlzCi0gKiB1c2VkIHRvIGRpc3Bvc2UgdGhlIG1vZGVsIHByb3ZpZGVyLiB7QGxpbmsgI2lzRGlzcG9zZWQoKX0gaXMgdXNlZCB0byBnZXQgdGhlCi0gKiBzdGF0ZSBvZiB0aGUgcHJvdmlkZXIuIElmIHRoZSBtZXRob2Qge0BsaW5rICNnZXRNb2RlbE9iamVjdCgpfSBpcyBjYWxsZWQgZm9yCi0gKiBhIG1vZGVsIHByb3ZpZGVyIGluIGEgZGlzcG9zZWQgc3RhdGUsIHRoZSBwcm92aWRlciBzaG91bGQgdHJ5IHRvIG1vdmUgdG8gYQotICogbm9uIGRpc3Bvc2VkIHN0YXRlIGFuZCByZXR1cm4gYSBjb3JyZWN0IG1vZGVsIG9iamVjdC4KLSAqIHtAbGluayAjZ2V0TW9kZWxPYmplY3QoKX0gaXMgbG9hZGluZyB0aGUgbW9kZWwuIFNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBtYXkKLSAqIHRocm93IGV4Y2VwdGlvbnMgc28gY2FsbGluZyB7QGxpbmsgI2dldE1vZGVsT2JqZWN0KCl9IG9uIGEgZGlzcG9zZWQgcHJvdmlkZXIKLSAqIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IGNhbGxpbmcge0BsaW5rICNpc0Rpc3Bvc2VkKCl9IGFmdGVyIHRoYXQgd2lsbCByZXR1cm4KLSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLSAqIAotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG1heSBlbmFibGUvZGlzYWJsZSBub3RpZmljYXRpb25zIGZyb20gaW50ZXJuYWxQcm92aWRlcnMgd2l0aCB0aGUKLSAqIG1ldGhvZHMge0BsaW5rICNlbmFibGVJbnRlcm5hbE5vdGlmaWNhdGlvbnMoKX0gYW5kCi0gKiB7QGxpbmsgI2Rpc2FibGVJbnRlcm5hbE5vdGlmaWNhdGlvbnMoKX0uCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogaW50ZXJuYWxQcm92aWRlcnMgYXJlIGxvYWRlZCB3aXRoIHtAbGluayAjbG9hZERlcGxveW1lbnREZXNjcmlwdG9yTW9kZWwoKX0KLSAqIGFuZCB7QGxpbmsgI2xvYWRBbm5vdGF0aW9uTW9kZWwoT2JqZWN0KX0uIFRoaXMgbWV0aG9kcyBzaG91bGQgYmUgb3ZlcnJpZGUgdG8KLSAqIHByb3ZpZGUgc3BlY2lmaWMgbW9kZWwgcHJvdmlkZXJzLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIFRoZSBtZXJnZWRNb2RlbFByb3ZpZGVyIGlzIGEgbGlzdGVuZXIgdG8gdGhlIGludGVybmFsUHJvdmlkZXJzLiBBZnRlcgotICogZGlzcG9zaW5nIHRoZSBpbnN0YW5jZSBvZiBhIG1lcmdlZE1vZGVsUHJvdmlkZXIgaXQgc2hvdWxkIG5vIGxvbmdlciBhY2NlcHQKLSAqIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgaW50ZXJuYWxQcm92aWRlcnMuIEl0IHNob3VsZCBhbHNvIHByb3Blcmx5ICJkaXNwb3NlIgotICogdGhlIGludGVybmFsUHJvdmlkZXJzIGlmIG5lZWRlZC4KLSAqIDwvcD4KLSAqIAotICogQGF1dGhvciBLaXJpbCBNaXRvdiBrLm1pdG92QHNhcC5jb20KLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXJnZWRNb2RlbFByb3ZpZGVyPFQ+IGltcGxlbWVudHMgSU1vZGVsUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIElNb2RlbFByb3ZpZGVyIGRkUHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgSU1vZGVsUHJvdmlkZXIgYW5ub3RhdGlvbk1vZGVsUHJvdmlkZXI7Ci0KLQlwcml2YXRlIGNsYXNzIEFubm90YXRpb25Nb2RlbExpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsUHJvdmlkZXJMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1vZGVsc0NoYW5nZWQoSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCkgewotCQkJaWYgKGlzRGlzcG9zZWQoKSB8fCBtZXJnZWRNb2RlbCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmIChzaG91bGREaXNwb3NlKGV2ZW50KSkgewotCQkJCWRpc3Bvc2UoKTsKLQkJCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCUFic3RyYWN0TWVyZ2VkTW9kZWxQcm92aWRlci50aGlzLmFubm90YXRpb25Nb2RlbENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBYbWxNb2RlbExpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsUHJvdmlkZXJMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1vZGVsc0NoYW5nZWQoSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCkgewotCQkJaWYgKGlzRGlzcG9zZWQoKSB8fCBtZXJnZWRNb2RlbCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmIChzaG91bGREaXNwb3NlKGV2ZW50KSkgewotCQkJCW1lcmdlZE1vZGVsID0gbnVsbDsKLQkJCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCUFic3RyYWN0TWVyZ2VkTW9kZWxQcm92aWRlci50aGlzLnhtbE1vZGVsQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SU1vZGVsUHJvdmlkZXJMaXN0ZW5lcj4gbGlzdGVuZXJzOwotCi0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Ci0KLQlwcml2YXRlIEFubm90YXRpb25Nb2RlbExpc3RlbmVyIGFubm90YXRpb25Nb2RlbExpc3RlbmVyOwotCXByaXZhdGUgWG1sTW9kZWxMaXN0ZW5lciB4bWxNb2RlbExpc3RlbmVyOwotCi0JcHJvdGVjdGVkIFQgbWVyZ2VkTW9kZWw7Ci0KLQlwdWJsaWMgQWJzdHJhY3RNZXJnZWRNb2RlbFByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTW9kZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldExpc3RlbmVycygpLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kZWwgbWVyZ2VkIGZyb20gYW5ub3RhdGlvbiBhbmQgeG1sIG1vZGVsLiBJZiB0aGUgcHJvamVjdCBpcwotCSAqIGNsb3NlZCBvciBkb2VzIG5vdCBleGlzdCB0aGUgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXIjZ2V0TW9kZWxPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoKSB7Ci0JCXJldHVybiBnZXRNZXJnZWRNb2RlbCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXIjbW9kaWZ5KGphdmEubGFuZy5SdW5uYWJsZSwKLQkgKiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5KFJ1bm5hYmxlIHJ1bm5hYmxlLCBJUGF0aCBtb2RlbFBhdGgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTW9kZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldExpc3RlbmVycygpLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZQotCSAqIG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyI3ZhbGlkYXRlRWRpdChvcmcuZWNsaXBzZS5jb3JlCi0JICogLnJ1bnRpbWUuSVBhdGgsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVFZGl0KElQYXRoIG1vZGVsUGF0aCwgT2JqZWN0IGNvbnRleHQpIHsKLQkJaWYgKGRkUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWdldE1vZGVsT2JqZWN0KCk7Ci0JCXJldHVybiBkZFByb3ZpZGVyLnZhbGlkYXRlRWRpdChtb2RlbFBhdGgsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBhbm5vdGF0aW9uTW9kZWwgaGFzIGNoYW5nZWQuIFNlZSBhbHNvCi0JICoge0BsaW5rICNlbmFibGVJbnRlcm5hbE5vdGlmaWNhdGlvbnMoKX0gYW5kCi0JICoge0BsaW5rICNkaXNhYmxlSW50ZXJuYWxOb3RpZmljYXRpb25zKCl9Ci0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYW5ub3RhdGlvbk1vZGVsQ2hhbmdlZChJTW9kZWxQcm92aWRlckV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSB4bWxNb2RlbCBoYXMgY2hhbmdlZC4gU2VlIGFsc28KLQkgKiB7QGxpbmsgI2VuYWJsZUludGVybmFsTm90aWZpY2F0aW9ucygpfSBhbmQKLQkgKiB7QGxpbmsgI2Rpc2FibGVJbnRlcm5hbE5vdGlmaWNhdGlvbnMoKX0KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB4bWxNb2RlbENoYW5nZWQoSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBtZXJnZWQgdmlldyBvZiB0aGUgdHdvIHBhc3NlZCBtb2RlbHMuCi0JICogCi0JICogQHBhcmFtIGRkTW9kZWwKLQkgKiBAcGFyYW0gYW5ub3RhdGlvbnNNb2RlbAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVCBtZXJnZShUIGRkTW9kZWwsIFQgYW5ub3RhdGlvbnNNb2RlbCk7Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBhbm5vdGF0aW9uIG1vZGVsIGluIHRoZSBjb250ZXh0IG9mIHRoZSBkZE1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBkZE1vZGVsCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJTW9kZWxQcm92aWRlciBsb2FkQW5ub3RhdGlvbk1vZGVsKFQgZGRNb2RlbCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElNb2RlbFByb3ZpZGVyIGxvYWREZXBsb3ltZW50RGVzY3JpcHRvck1vZGVsKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJTW9kZWxQcm92aWRlckxpc3RlbmVyPiBnZXRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCWxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SU1vZGVsUHJvdmlkZXJMaXN0ZW5lcj4oKTsKLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgVCBnZXRNZXJnZWRNb2RlbCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChtZXJnZWRNb2RlbCA9PSBudWxsKQotCQkJCW1lcmdlZE1vZGVsID0gbG9hZE1vZGVsKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSkVFUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbWVyZ2VkTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBhIG1lcmdlZCB2aWV3IG9mIHRoZSBtb2RlbHMgZnJvbSB0aGUgaW50ZXJuYWxQcm92aWRlcnMuIFRoaXMgbWF5Ci0JICogICAgICAgICBpbmNsdWRlIGxvYWRpbmcgdGhlIGludGVybmFsUHJvdmlkZXJzLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBUIGxvYWRNb2RlbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHByb2plY3QuaXNBY2Nlc3NpYmxlKCkgPT0gZmFsc2UpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgcHJvamVjdCA8IiArIHByb2plY3QgKyAiPiBpcyBub3QgYWNjZXNzaWJsZS4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJaWYgKGRkUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWRkUHJvdmlkZXIgPSBsb2FkRGVwbG95bWVudERlc2NyaXB0b3JNb2RlbCgpOwotCQlpZiAoZGRQcm92aWRlciA9PSBudWxsIHx8IGRkUHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChhbm5vdGF0aW9uTW9kZWxQcm92aWRlciA9PSBudWxsKQotCQkJYW5ub3RhdGlvbk1vZGVsUHJvdmlkZXIgPSBsb2FkQW5ub3RhdGlvbk1vZGVsKChUKSBkZFByb3ZpZGVyLmdldE1vZGVsT2JqZWN0KCkpOwotCQlpZiAoYW5ub3RhdGlvbk1vZGVsUHJvdmlkZXIgPT0gbnVsbCB8fCBhbm5vdGF0aW9uTW9kZWxQcm92aWRlci5nZXRNb2RlbE9iamVjdCgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVCBkZE1vZGVsID0gKFQpIGRkUHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQkJVCBhbm5vdGF0aW9uTW9kZWwgPSAoVCkgYW5ub3RhdGlvbk1vZGVsUHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLQkJbWVyZ2VkTW9kZWwgPSBjcmVhdGVOZXdNb2RlbEluc3RhbmNlKCk7Ci0JCWluaXRNZXJnZWRNb2RlbFJlc291cmNlKChFT2JqZWN0KSBkZE1vZGVsKTsKLQotCQllbmFibGVJbnRlcm5hbE5vdGlmaWNhdGlvbnMoKTsKLQkJcmV0dXJuIG1lcmdlKGRkTW9kZWwsIGFubm90YXRpb25Nb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIG1lcmdlZE1vZGVsCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBUIGNyZWF0ZU5ld01vZGVsSW5zdGFuY2UoKTsKLQotCXByb3RlY3RlZCB2b2lkIGluaXRNZXJnZWRNb2RlbFJlc291cmNlKEVPYmplY3QgZGRNb2RlbCkgewotCQlSZXNvdXJjZSByZXNvdXJjZUREID0gZGRNb2RlbC5lUmVzb3VyY2UoKTsKLQkJUmVzb3VyY2UgcmVzb3VyY2VNTSA9ICgoRU9iamVjdCkgbWVyZ2VkTW9kZWwpLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2VERCAhPSBudWxsICYmIHJlc291cmNlTU0gPT0gbnVsbCkgewotCQkJUmVzb3VyY2VJbXBsIHJlc1JlcyA9IG5ldyBSZXNvdXJjZUltcGwocmVzb3VyY2VERC5nZXRVUkkoKSk7Ci0JCQlyZXNSZXMuZ2V0Q29udGVudHMoKS5hZGQoKEVPYmplY3QpIG1lcmdlZE1vZGVsKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhlIG1ldGhvZCBpcyB1c2VkIGZvciBlbmFibGluZyBub3RpZmljYXRpb25zIGZyb20gdGhlIGludGVybmFsUHJvdmlkZXJzLgotCSAqIFRoaXMgd2lsbCBhZGQgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIHRvIHRoZSBpbnRlcm5hbFByb3ZpZGVycyBzbyB0aGF0Ci0JICoge0BsaW5rICNhbm5vdGF0aW9uTW9kZWxDaGFuZ2VkKElNb2RlbFByb3ZpZGVyRXZlbnQpfSBhbmQKLQkgKiB7QGxpbmsgI3htbE1vZGVsQ2hhbmdlZChJTW9kZWxQcm92aWRlckV2ZW50KX0gYXJlIGNhbGxlZCB3aGVuIG5lZWRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBlbmFibGVJbnRlcm5hbE5vdGlmaWNhdGlvbnMoKSB7Ci0JCXhtbE1vZGVsTGlzdGVuZXIgPSBuZXcgWG1sTW9kZWxMaXN0ZW5lcigpOwotCQlkZFByb3ZpZGVyLmFkZExpc3RlbmVyKHhtbE1vZGVsTGlzdGVuZXIpOwotCQlhbm5vdGF0aW9uTW9kZWxMaXN0ZW5lciA9IG5ldyBBbm5vdGF0aW9uTW9kZWxMaXN0ZW5lcigpOwotCQlhbm5vdGF0aW9uTW9kZWxQcm92aWRlci5hZGRMaXN0ZW5lcihhbm5vdGF0aW9uTW9kZWxMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRGlzYWJsZSBub3RpZmljYXRpb25zIGZyb20gaW50ZXJuYWxQcm92aWRlcnMuIFNlZSBhbHNvCi0JICoge0BsaW5rICNlbmFibGVJbnRlcm5hbE5vdGlmaWNhdGlvbnMoKX0KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBkaXNhYmxlSW50ZXJuYWxOb3RpZmljYXRpb25zKCkgewotCQlkZFByb3ZpZGVyLnJlbW92ZUxpc3RlbmVyKHhtbE1vZGVsTGlzdGVuZXIpOwotCQlhbm5vdGF0aW9uTW9kZWxQcm92aWRlci5yZW1vdmVMaXN0ZW5lcihhbm5vdGF0aW9uTW9kZWxMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGZpbmFsIElNb2RlbFByb3ZpZGVyRXZlbnQgZXZlbnQpIHsKLQkJZXZlbnQuc2V0TW9kZWwodGhpcyk7Ci0JCWV2ZW50LnNldFByb2plY3QocHJvamVjdCk7Ci0JCWZpbmFsIENvbGxlY3Rpb248SU1vZGVsUHJvdmlkZXJMaXN0ZW5lcj4gbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKCk7Ci0JCUlNb2RlbFByb3ZpZGVyTGlzdGVuZXJbXSBiYWNrdXAgPSBsaXN0ZW5lcnMudG9BcnJheShuZXcgSU1vZGVsUHJvdmlkZXJMaXN0ZW5lcltsaXN0ZW5lcnMuc2l6ZSgpXSk7Ci0JCWZvciAoZmluYWwgSU1vZGVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lciA6IGJhY2t1cCkgewotCQkJU2FmZVJ1bm5lci5ydW4obmV3IElTYWZlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQkJbGlzdGVuZXIubW9kZWxzQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJYmFja3VwID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREaXNwb3NlKElNb2RlbFByb3ZpZGVyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChldmVudC5nZXRFdmVudENvZGUoKSA9PSBJTW9kZWxQcm92aWRlckV2ZW50LlVOTE9BREVEX1JFU09VUkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwb3NlIHN0YXRlIG9mIHRoaXMgbW9kZWwgcHJvdmlkZXIuIFdoZW4gdGhlIHByb3ZpZGVyIGlzCi0JICogZGlzcG9zZWQgaXQgY2FuIG5vdCBiZSB1c2VkIHVudGlsIGdldE1vZGVsT2JqZWN0IGlzIGNhbGxlZCBhZ2Fpbi4KLQkgKiAKLQkgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIHByb3ZpZGVyIGlzIHRvIGJlIHRyZWF0ZWQgYXMgZGlzcG9zZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlyZXR1cm4gKGRkUHJvdmlkZXIgPT0gbnVsbCAmJiBhbm5vdGF0aW9uTW9kZWxQcm92aWRlciA9PSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIHRoZSBtb2RlbCBwcm92aWRlci4gSWYgdGhlIHByb3ZpZGVyIGlzIGFscmVhZHkgZGlzcG9zZWQgdGhlCi0JICogbWV0aG9kIGhhcyBubyBlZmZlY3QuCi0JICogCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHNlZSAjaXNEaXNwb3NlZCgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJZGlzYWJsZUludGVybmFsTm90aWZpY2F0aW9ucygpOwotCQlkZFByb3ZpZGVyID0gbnVsbDsKLQkJYW5ub3RhdGlvbk1vZGVsUHJvdmlkZXIgPSBudWxsOwotCQltZXJnZWRNb2RlbCA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvY29tbW9uL01hbnlUb09uZVJlbGF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvY29tbW9uL01hbnlUb09uZVJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MTExZGEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL2NvbW1vbi9NYW55VG9PbmVSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogSW50cm9kdWNlcyB0aGUgbm90YXRpb24gb2YgbWFueS10by1vbmUgcmVsYXRpb24uIFRoaXMgaXMgd2hlcmUgdGhlIE0gYW5kIE8gb2YKLSAqIHRoZSB0eXBlIHNpZ25hdHVyZSBjb21lcyBmcm9tLgotICogCi0gKiBNYW55IHVuaXF1ZSAic291cmNlIiBvYmplY3RzIHJlZmVyIHRvIG9uZSBhbmQgb25seSAidGFyZ2V0IiBvYmplY3QuCi0gKiAKLSAqIFRoZSBjbGFzcyBtYWludGFpbnMgYSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIHRhcmdldCBhbmQgYWxsIHRoZSBzb3VyY2VzIHRoYXQKLSAqIGFyZSByZWZlcnJpbmcgdG8gaXQuCi0gKiAKLSAqIEBhdXRob3IgS2lyaWwgTWl0b3Ygay5taXRvdkBzYXAuY29tCi0gKiAKLSAqIEBwYXJhbSA8TT4KLSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlICJzb3VyY2UiIG9iamVjdHMuCi0gKiBAcGFyYW0gPE8+Ci0gKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoZSAidGFyZ2V0IiBvYmplY3RzLgotICovCi1wdWJsaWMgY2xhc3MgTWFueVRvT25lUmVsYXRpb248TSwgTz4gewotCi0JcHJpdmF0ZSBNYXA8TSwgTz4gbWFueVRvT25lID0gbmV3IEhhc2hNYXA8TSwgTz4oKTsKLQotCS8qKgotCSAqIENvbm5lY3RzIHRoZSBnaXZlbiBzb3VyY2Ugd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0LiBJZiB0aGlzIHNvdXJjZSB3YXMKLQkgKiBwcmV2aW91c2x5IGNvbm5lY3RlZCB3aXRoIGFub3RoZXIgdGFyZ2V0IHRoZSBvbGQgY29ubmVjdGlvbiBpcyBsb3N0LgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbm5lY3QoTSBzb3VyY2UsIE8gdGFyZ2V0KSB7Ci0JCW1hbnlUb09uZS5wdXQoc291cmNlLCB0YXJnZXQpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlbGF0aW9uIGNvbnRhaW5zIHRoZSBnaXZlbiBzb3VyY2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1NvdXJjZShNIHNvdXJjZSkgewotCQlyZXR1cm4gbWFueVRvT25lLmNvbnRhaW5zS2V5KHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlbGF0aW9uIGNvbnRhaW5zIHRoZSBnaXZlbiB0YXJnZXQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1RhcmdldChPIHRhcmdldCkgewotCQlyZXR1cm4gbWFueVRvT25lLmNvbnRhaW5zVmFsdWUodGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHJldHVybiB0aGUgdGFyZ2V0IHdpdGggd2hpY2ggdGhpcyBzb3VyY2UgaXMgY29ubmVjdGVkCi0JICovCi0JcHVibGljIE8gZ2V0VGFyZ2V0KE0gc291cmNlKSB7Ci0JCXJldHVybiBtYW55VG9PbmUuZ2V0KHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4gYWxsIHRoZSB0YXJnZXRzIHRoYXQgYXJlIGNvbm5lY3RlZCB3aXRoIHRoaXMgc291cmNlIG9yIGVtcHR5Ci0JICogICAgICAgICBjb2xsZWN0aW9uIGlmIHRoZXJlIGFyZSBubyBzb3VyY2VzIGNvbm5lY3RlZCB3aXRoIHRoaXMgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPE0+IGdldFNvdXJjZXMoTyB0YXJnZXQpIHsKLQkJQ29sbGVjdGlvbjxNPiBmaWxlcyA9IG5ldyBMaW5rZWRMaXN0PE0+KCk7Ci0JCWZvciAoTWFwLkVudHJ5PE0sIE8+IGVudHJ5IDogbWFueVRvT25lLmVudHJ5U2V0KCkpIHsKLQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpLmVxdWFscyh0YXJnZXQpKQotCQkJCWZpbGVzLmFkZChlbnRyeS5nZXRLZXkoKSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGlzIHNvdXJjZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0LgotCSAqIE90aGVyIHNvdXJjZXMgd2lsbCBzdGlsbCBwb2ludCB0byB0aGUgc2FtZSB0YXJnZXQuCi0JICogCi0JICogVGhlIHRhcmdldCBpcyByZW1vdmVkIGlmIHRoaXMgd2FzIHRoZSBvbmx5IHNvdXJjZSBwb2ludGluZyB0byBpdCBhbmQKLQkgKiB7QGxpbmsgI2NvbnRhaW5zVGFyZ2V0KE9iamVjdCl9IHdpbGwgcmV0dXJuIGZhbHNlLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0U291cmNlKE0gc291cmNlKSB7Ci0JCW1hbnlUb09uZS5yZW1vdmUoc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiB0YXJnZXQgZnJvbSB0aGUgcmVsYXRpb24uIEFsbCB0aGUgc291cmNlcyB0aGF0IGFyZQotCSAqIHBvaW50aW5nIHRvIHRoaXMgdGFyZ2V0IGFyZSBhbHNvIHJlbW92ZWQuCi0JICogCi0JICogSWYgeW91IHRha2UgdGhlICJyZXN1bHQiIG9mIHtAbGluayAjZ2V0U291cmNlcyh0YXJnZXQpfSBhbmQgYWZ0ZXIgdGhhdAotCSAqIGNhbGwgdGhpcyBtZXRob2QgdGhlbiB7QGxpbmsgI2NvbnRhaW5zU291cmNlKE9iamVjdCl9IHdpbGwgcmV0dXJuCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBldmVyeSBvYmplY3QgaW4gInJlc3VsdCIuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoTyB0YXJnZXQpIHsKLQkJZm9yIChJdGVyYXRvcjxPPiBpdGVyID0gbWFueVRvT25lLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKGl0ZXIubmV4dCgpLmVxdWFscyh0YXJnZXQpKQotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiB0aGUgdGFyZ2V0cy4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxPPiBnZXRUYXJnZXRzKCkgewotCQlyZXR1cm4gbWFueVRvT25lLnZhbHVlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL2NvbW1vbi9NeU1vZGVsUHJvdmlkZXJFdmVudC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL2NvbW1vbi9NeU1vZGVsUHJvdmlkZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjVlZjc5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9jb21tb24vTXlNb2RlbFByb3ZpZGVyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwuY29tbW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyRXZlbnQ7Ci0KLS8qKgotICogQGF1dGhvciAgS2lyaWwgTWl0b3Ygay5taXRvdkBzYXAuY29tCi0gKgotICovCi1jbGFzcyBNeU1vZGVsUHJvdmlkZXJFdmVudCBpbXBsZW1lbnRzIElNb2RlbFByb3ZpZGVyRXZlbnQgewotCXByaXZhdGUgSU1vZGVsUHJvdmlkZXIgbW9kZWw7Ci0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qOwotCXByaXZhdGUgaW50IGV2ZW50OwotCi0JcHJpdmF0ZSBMaXN0IHJlc291cmNlczsKLQotCXB1YmxpYyBNeU1vZGVsUHJvdmlkZXJFdmVudChpbnQgYW5FdmVudENvZGUsIElNb2RlbFByb3ZpZGVyIG1vZGVsLCBJUHJvamVjdCBwcm9qKSB7Ci0JCXNldEV2ZW50Q29kZShhbkV2ZW50Q29kZSk7Ci0JCXNldE1vZGVsKG1vZGVsKTsKLQkJc2V0UHJvamVjdChwcm9qKTsKLQkJcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlwcm9qID0gcHJvamVjdDsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlKE9iamVjdCByZXNvdXJjZSkgewotCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZXMoQ29sbGVjdGlvbjxPYmplY3Q+IHNvbWVSZXNvdXJjZXMpIHsKLQkJcmVzb3VyY2VzLmFkZEFsbChzb21lUmVzb3VyY2VzKTsKLQotCX0KLQotCXB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEV2ZW50Q29kZSgpIHsKLQkJcmV0dXJuIGV2ZW50OwotCX0KLQotCXB1YmxpYyBJTW9kZWxQcm92aWRlciBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoYW5nZWRSZXNvdXJjZXMoTGlzdDxPYmplY3Q+IG5ld0NoYW5nZWRSZXNvdXJjZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXZlbnRDb2RlKGludCBuZXdFdmVudENvZGUpIHsKLQkJZXZlbnQgPSBuZXdFdmVudENvZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoSU1vZGVsUHJvdmlkZXIgbmV3TW9kZWwpIHsKLQkJbW9kZWwgPSBuZXdNb2RlbDsKLQotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gcHJvajsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9jb21tb24vUmVzdWx0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvY29tbW9uL1Jlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjUxOWFmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9jb21tb24vUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLmNvbW1vbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuSmF2YUVFT2JqZWN0OwotCi0vKioKLSAqIEBhdXRob3IgS2lyaWwgTWl0b3Ygay5taXRvdkBzYXAuY29tCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlc3VsdCB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SVR5cGU+IGRlcGVuZGVkVHlwZXM7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SmF2YUVFT2JqZWN0PiBtb2RlbE9iamVjdHM7Ci0KLQlwcml2YXRlIEphdmFFRU9iamVjdCBtYWluT2JqZWN0OwotCi0JcHVibGljIFJlc3VsdCgpIHsKLQkJZGVwZW5kZWRUeXBlcyA9IG5ldyBIYXNoU2V0PElUeXBlPigpOwotCQkvLyBtb3N0IG9mIHRoZSB0aW1lIHRoZXJlIHdpbGwgYmUgb25seSBvbmUgb2JqZWN0IGluIHRoZSBtb2RlbCBvYmplY3RzCi0JCS8vIGxpc3QuIEV4Y2VwdGlvbnMgYXJlIG1hZGUgZm9yIHJlc3VsdHMgdGhhdCB3aWxsIGNvbnRhaW4gc2VjdXJpdHkKLQkJLy8gcm9sZXMgZm9yIGV4YW1wbGUuIFRoaXMgaXMgd2F5IGhlcmUgdGhlIG1vZGVsT2JqZWN0cyBjb2xsZWN0aW9uIGlzCi0JCS8vIEFycmF5TGlzdCB3aXRoIHNpemUgMQotCQltb2RlbE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PEphdmFFRU9iamVjdD4oMSk7Ci0JfQotCi0JcHVibGljIEphdmFFRU9iamVjdCBnZXRNYWluT2JqZWN0KCkgewotCQlyZXR1cm4gbWFpbk9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYWluT2JqZWN0KEphdmFFRU9iamVjdCBtYWluT2JqZWN0KSB7Ci0JCXRoaXMubWFpbk9iamVjdCA9IG1haW5PYmplY3Q7Ci0JCW1vZGVsT2JqZWN0cy5hZGQobWFpbk9iamVjdCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb248SmF2YUVFT2JqZWN0PiBnZXRBZGRpdGlvbmFsKCkgewotCQlyZXR1cm4gbW9kZWxPYmplY3RzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPElUeXBlPiBnZXREZXBlbmRlZFR5cGVzKCkgewotCQlyZXR1cm4gZGVwZW5kZWRUeXBlczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIG1haW5PYmplY3QgPT0gbnVsbCAmJiBnZXRBZGRpdGlvbmFsKCkuaXNFbXB0eSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL0Jhc2VSZWZzTWVyZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9CYXNlUmVmc01lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWU0NWY2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL0Jhc2VSZWZzTWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLm1lcmdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIEpOREkgbWVyZ2VycwotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVJlZnNNZXJnZXIgZXh0ZW5kcyBNb2RlbEVsZW1lbnRzTWVyZ2VyIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUxpc3QgLQotCSAqICAgICAgICAgICAgYmFzZSBsaXN0IG9mIHJlZmVyZW5jZXMgdGhhdCBoYXZlIGhpZ2hlciBwcmlvcml0eSBhbmQgYXJlCi0JICogICAgICAgICAgICByZXN1bHQgb2YgdGhlIG1lcmdlLgotCSAqIEBwYXJhbSB0b01lcmdlTGlzdCAtCi0JICogICAgICAgICAgICB0b01lcmdlIGxpc3Qgb2YgcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBCYXNlUmVmc01lcmdlcihMaXN0IGJhc2VMaXN0LCBMaXN0IHRvTWVyZ2VMaXN0KSB7Ci0JCXN1cGVyKGJhc2VMaXN0LCB0b01lcmdlTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogV2hlbiBhbiBlbnRyeSB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgcHJlc2VudCBpbiBib3RoIGxpc3RzLCBtaXNzaW5nIHZhbHVzZQotCSAqIGluIGJhc2UgYXJlIGZpbGxlZCBieSB0b01lcmdlIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGJhc2VMaXN0IC0KLQkgKiAgICAgICAgICAgIGJhc2UgbGlzdCBvZiByZWZlcmVuY2VzCi0JICogQHBhcmFtIHRvTWVyZ2VMaXN0IC0KLQkgKiAgICAgICAgICAgIHRvTWVyZ2UgbGlzdCBvZiByZWZlcmVuY2VzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoT2JqZWN0IGJhc2UsIE9iamVjdCB0b01lcmdlKTsKLQotCS8qKgotCSAqIEBwYXJhbSBpdExpc3RCYXNlCi0JICogQHBhcmFtIGl0TGlzdFRvTWVyZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIExpc3QgbWVyZ2VJbmdlY3Rpb25UYXJnZXRzKExpc3QgaXRMaXN0QmFzZSwgTGlzdCBpdExpc3RUb01lcmdlKSB7Ci0JCS8vIFRPRE8KLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyTGlzdEJhc2UKLQkgKiBAcGFyYW0gZGVzY3JMaXN0VG9NZXJnZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBtZXJnZURlc2NyaXB0aW9ucyhMaXN0IGRlc2NyTGlzdEJhc2UsIExpc3QgZGVzY3JMaXN0VG9NZXJnZSkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL0VKQlJlZnNNZXJnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL0VKQlJlZnNNZXJnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkMTU4ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9FSkJSZWZzTWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuRWpiTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVqYlJlZjsKLQotLyoqCi0gKiBFamJSZWYgYW5kIEVqYkxvY2FsUmVmIG1lcmdlci4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIEVKQlJlZnNNZXJnZXIgZXh0ZW5kcyBCYXNlUmVmc01lcmdlciB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBFamJSZWZzIG1lcmdlci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gX2Jhc2VFamJSZWZzIC0gYmFzZSBsaXN0IG9mIHJlZmVyZW5jZXMgdGhhdCBoYXZlIGhpZ2hlciBwcmlvcml0eSBhbmQgYXJlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuCi0gICAgICogQHBhcmFtIF90b01lcmdlRWpiUmVmcyAtIHRvTWVyZ2UgbGlzdCBvZiByZWZlcmVuY2VzCi0gICAgICovCi0gICAgcHVibGljIEVKQlJlZnNNZXJnZXIoTGlzdCBfYmFzZUVqYlJlZnMsIExpc3QgX3RvTWVyZ2VFamJSZWZzKSB7Ci0gICAgICAgIHN1cGVyKF9iYXNlRWpiUmVmcywgX3RvTWVyZ2VFamJSZWZzKTsKLSAgICAgICAgCi0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLm1vZGVsLm1lcmdlcnMuY29tbW9uLk1vZGVsRWxlbWVudHNNZXJnZXIjcHJvY2VzcygpCi0gICAgICovCi0gICAgcHVibGljIExpc3QgcHJvY2VzcygpIHRocm93cyBNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Qgd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGlmIChnZXRUb01lcmdlRWxlbWV0cygpID09IG51bGwgfHwgZ2V0VG9NZXJnZUVsZW1ldHMoKS5pc0VtcHR5KCkpewotICAgICAgICAgIHJldHVybiB3YXJuaW5nczsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChPYmplY3Qgb2JqZWN0IDogZ2V0VG9NZXJnZUVsZW1ldHMoKSkgewotICAgICAgICAgIE9iamVjdCBmaW5kTWF0Y2hpbmdSZWYgPSBudWxsOwotICAgICAgICAgIGlmKG9iamVjdCBpbnN0YW5jZW9mIEVqYkxvY2FsUmVmKXsKLSAgICAgICAgICAgIGZpbmRNYXRjaGluZ1JlZiA9IGZpbmRNYXRjaGluZ0xvY2FsUmVmKGdldEJhc2VFbGVtZW50cygpLCBvYmplY3QpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5kTWF0Y2hpbmdSZWYgPSBmaW5kTWF0Y2hpbmdSZWYoZ2V0QmFzZUVsZW1lbnRzKCksIG9iamVjdCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChmaW5kTWF0Y2hpbmdSZWYgIT0gbnVsbCl7Ci0gICAgICAgICAgICBjb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZShmaW5kTWF0Y2hpbmdSZWYsIG9iamVjdCk7Ci0gICAgICAgICAgfSBlbHNlewotICAgICAgICAgICAgZ2V0QmFzZUVsZW1lbnRzKCkuYWRkKEVjb3JlVXRpbC5jb3B5KChFT2JqZWN0KSBvYmplY3QpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHdhcm5pbmdzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEVqYlJlZiBmaW5kTWF0Y2hpbmdSZWYoTGlzdCB4bWxSZWZzLAotICAgICAgICAgICAgT2JqZWN0IHJlZikgdGhyb3dzIE1vZGVsRXhjZXB0aW9uIHsKLSAgICAJRWpiUmVmIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGZvciAoT2JqZWN0IGN1cnJlbnRYTUxSZWY6IHhtbFJlZnMpIHsKLSAgICAgICAgICAgIGlmIChpc01hdGNoaW5nUmVmKGN1cnJlbnRYTUxSZWYsIHJlZikpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAoRWpiUmVmKSBjdXJyZW50WE1MUmVmOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEVqYkxvY2FsUmVmIGZpbmRNYXRjaGluZ0xvY2FsUmVmKExpc3QgeG1sUmVmcywKLSAgICAgICAgT2JqZWN0IHJlZikgdGhyb3dzIE1vZGVsRXhjZXB0aW9uIHsKLSAgICAgIEVqYkxvY2FsUmVmIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChPYmplY3QgY3VycmVudFhNTFJlZjogeG1sUmVmcykgewotICAgICAgICBpZiAoaXNNYXRjaGluZ1JlZihjdXJyZW50WE1MUmVmLCByZWYpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoRWpiTG9jYWxSZWYpIGN1cnJlbnRYTUxSZWY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01hdGNoaW5nUmVmKE9iamVjdCB4bWxSZWYsCi0gICAgICAgICAgICBPYmplY3QgYW5ub3RhdGVkUmVmKSB0aHJvd3MgTW9kZWxFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICBTdHJpbmcgeG1sUmVmTmFtZSA9ICh4bWxSZWYgaW5zdGFuY2VvZiBFamJSZWYpID8gKChFamJSZWYpeG1sUmVmKS5nZXRFamJSZWZOYW1lKCkgOiAoKEVqYkxvY2FsUmVmKXhtbFJlZikuZ2V0RWpiUmVmTmFtZSgpOwotICAgICAgICBTdHJpbmcgYW5ub3RhdGVkUmVmTmFtZSA9IChhbm5vdGF0ZWRSZWYgaW5zdGFuY2VvZiBFamJSZWYpID8gKChFamJSZWYpYW5ub3RhdGVkUmVmKS5nZXRFamJSZWZOYW1lKCkgOiAoKEVqYkxvY2FsUmVmKWFubm90YXRlZFJlZikuZ2V0RWpiUmVmTmFtZSgpOwotICAgICAgICBpZiAoeG1sUmVmTmFtZS5lcXVhbHMoYW5ub3RhdGVkUmVmTmFtZSkpIHsKLS8vICAgICAgICAgICAgaWYoIWlzTWF0Y2hpbmdUYXJnZXRCZWFuKHhtbFJlZiwgYW5ub3RhdGVkUmVmKSl7Ci0vLyAgICAgICAgICAgIAkvL1RPRE8gICBjaGVjayBpZiBjb3JyZWN0Ci0vLyAgICAgICAgICAgIAlyZXR1cm4gZmFsc2U7Ci0vLyAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNYXRjaGluZ1RhcmdldEJlYW4oT2JqZWN0IGxvY2FsUmVmLAotICAgICAgICAgICAgT2JqZWN0IGFubm90YXRlZFJlZikgdGhyb3dzIE1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGxvY2FsUmVmRUpCTGluayA9IChsb2NhbFJlZiBpbnN0YW5jZW9mIEVqYlJlZikgPyAoKEVqYlJlZilsb2NhbFJlZikuZ2V0RWpiTGluaygpIDogKChFamJMb2NhbFJlZilsb2NhbFJlZikuZ2V0RWpiTGluaygpOwotICAgICAgICBpZihsb2NhbFJlZkVKQkxpbmsgPT0gbnVsbCl7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1tdIHRva2VuaXplRWpiTGluayA9IHRva2VuaXplRWpiTGluayhsb2NhbFJlZkVKQkxpbmspOwotICAgICAgICBTdHJpbmcgbG9jYWxSZWZFSkJOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKHRva2VuaXplRWpiTGluayAhPSBudWxsICYmIHRva2VuaXplRWpiTGluay5sZW5ndGg+MCl7Ci0gICAgICAgICAgbG9jYWxSZWZFSkJOYW1lID0gdG9rZW5pemVFamJMaW5rWzFdOyAgCi0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYW5uUmVmUmVmZXJlbmNpbmdCZWFuID0gYW5uUmVmUmVmZXJlbmNpbmdCZWFuID0gKGxvY2FsUmVmIGluc3RhbmNlb2YgRWpiUmVmKSA/ICgoRWpiUmVmKWxvY2FsUmVmKS5nZXRFamJMaW5rKCkgOiAoKEVqYkxvY2FsUmVmKWxvY2FsUmVmKS5nZXRFamJMaW5rKCk7Ci0gICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGxvY2FsUmVmRUpCTmFtZSAhPSBudWxsICYmIGFublJlZlJlZmVyZW5jaW5nQmVhbiAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgbG9jYWxSZWZFSkJOYW1lLmVxdWFscyhhbm5SZWZSZWZlcmVuY2luZ0JlYW4pOwotICAgIH0KLQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRva2VuaXplRWpiTGluayhTdHJpbmcgbGluaykgewotICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nWzJdOwotICAgICAgICAKLSAgICAgICAgaW50IGluZGV4ID0gbGluay5pbmRleE9mKCcjJyk7Ci0gICAgICAgIGlmIChpbmRleCAhPSAtMSkgewotICAgICAgICAgICAgcmVzdWx0WzBdID0gbGluay5zdWJzdHJpbmcoMCxpbmRleCk7Ci0gICAgICAgICAgICByZXN1bHRbMV0gPSBsaW5rLnN1YnN0cmluZyhpbmRleCsxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdFsxXSA9IGxpbms7IAotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoT2JqZWN0IGJhc2UsIE9iamVjdCB0b01lcmdlKSB7Ci0JICBpZihiYXNlIGluc3RhbmNlb2YgRWpiUmVmKXsKLQkgICAgY29weUVqYlJlZlByb3BzSW5CYXNlKChFamJSZWYpYmFzZSwgKEVqYlJlZil0b01lcmdlKTsKLQkgIH0gZWxzZSBpZiAoYmFzZSBpbnN0YW5jZW9mIEVqYkxvY2FsUmVmKXsKLQkgICAgY29weUVqYkxvY2FsUmVmUHJvcHNJbkJhc2UoKEVqYkxvY2FsUmVmKWJhc2UsIChFamJMb2NhbFJlZil0b01lcmdlKTsKLQkgIH0KLQl9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlFamJMb2NhbFJlZlByb3BzSW5CYXNlKEVqYkxvY2FsUmVmIGJhc2UsIEVqYkxvY2FsUmVmIHRvTWVyZ2UpIHsKLSAgICBpZiAoYmFzZS5nZXRFamJMaW5rKCkgPT0gbnVsbCl7Ci0gICAgICBiYXNlLnNldEVqYkxpbmsodG9NZXJnZS5nZXRFamJMaW5rKCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoYmFzZS5nZXRNYXBwZWROYW1lKCkgPT0gbnVsbCl7Ci0gICAgICBiYXNlLnNldE1hcHBlZE5hbWUodG9NZXJnZS5nZXRNYXBwZWROYW1lKCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoIWJhc2UuaXNTZXRFamJSZWZUeXBlKCkpewotICAgICAgYmFzZS5zZXRFamJSZWZUeXBlKHRvTWVyZ2UuZ2V0RWpiUmVmVHlwZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGJhc2UuZ2V0TG9jYWwoKSA9PSBudWxsKXsKLSAgICAgIGJhc2Uuc2V0TG9jYWwodG9NZXJnZS5nZXRMb2NhbCgpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGJhc2UuZ2V0TG9jYWxIb21lKCkgPT0gbnVsbCl7Ci0gICAgICBiYXNlLnNldExvY2FsSG9tZSh0b01lcmdlLmdldExvY2FsSG9tZSgpKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICBwcml2YXRlIHZvaWQgY29weUVqYlJlZlByb3BzSW5CYXNlKEVqYlJlZiBiYXNlLCBFamJSZWYgdG9NZXJnZSkgewotICAgIGlmIChiYXNlLmdldEVqYkxpbmsoKSA9PSBudWxsKXsKLSAgICAgIGJhc2Uuc2V0RWpiTGluayh0b01lcmdlLmdldEVqYkxpbmsoKSk7Ci0gICAgfQotICAgIAotICAgIGlmIChiYXNlLmdldE1hcHBlZE5hbWUoKSA9PSBudWxsKXsKLSAgICAgIGJhc2Uuc2V0TWFwcGVkTmFtZSh0b01lcmdlLmdldE1hcHBlZE5hbWUoKSk7Ci0gICAgfQotICAgIAotICAgIGlmICghYmFzZS5pc1NldEVqYlJlZlR5cGUoKSl7Ci0gICAgICBiYXNlLnNldEVqYlJlZlR5cGUodG9NZXJnZS5nZXRFamJSZWZUeXBlKCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoYmFzZS5nZXRSZW1vdGUoKSA9PSBudWxsKXsKLSAgICAgIGJhc2Uuc2V0UmVtb3RlKHRvTWVyZ2UuZ2V0UmVtb3RlKCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoYmFzZS5nZXRIb21lKCkgPT0gbnVsbCl7Ci0gICAgICBiYXNlLnNldEhvbWUodG9NZXJnZS5nZXRIb21lKCkpOwotICAgIH0KLSAgICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvRW52RW50cmllc01lcmdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvRW52RW50cmllc01lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVlMWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL0VudkVudHJpZXNNZXJnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwubWVyZ2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkVudkVudHJ5OwotCi0vKioKLSAqIE1lcmdlcyBFbnZpcm9ubWVudCBFbnRyaWVzLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi1wdWJsaWMgY2xhc3MgRW52RW50cmllc01lcmdlciBleHRlbmRzIEJhc2VSZWZzTWVyZ2VyIHsKLQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFzZUxpc3QgLSBiYXNlIGxpc3Qgd2l0aCBlbnZpcm9ubWVudCBlbnRyaWVzCi0gICAgICogQHBhcmFtIHRvTWVyZ2VMaXN0IC0gdG9NZXJnZSBsaXN0IHdpdGggZW52aXJvbm1lbnQgZW50cmllcwotICAgICAqLwotICAgIHB1YmxpYyBFbnZFbnRyaWVzTWVyZ2VyKExpc3QgYmFzZUxpc3QsIExpc3QgdG9NZXJnZUxpc3QpIHsKLSAgICAgICAgc3VwZXIoYmFzZUxpc3QsIHRvTWVyZ2VMaXN0KTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5tb2RlbC5tZXJnZXJzLmNvbW1vbi5Nb2RlbEVsZW1lbnRzTWVyZ2VyI3Byb2Nlc3MoKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHByb2Nlc3MoKSB0aHJvd3MgTW9kZWxFeGNlcHRpb24gewotICAgICAgICBMaXN0IHdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKE9iamVjdCBvVG9NZXJnZSA6IGdldFRvTWVyZ2VFbGVtZXRzKCkpIHsKLQkJCUVudkVudHJ5IGVudkVudHJ5ID0gKEVudkVudHJ5KSBvVG9NZXJnZTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoT2JqZWN0IG9CYXNlIDogZ2V0QmFzZUVsZW1lbnRzKCkpIHsKLQkJCQlFbnZFbnRyeSBlbnZFbnRyeUJhc2UgPSAoRW52RW50cnkpIG9CYXNlOwotCQkJCWlmIChlbnZFbnRyeUJhc2UuZ2V0RW52RW50cnlOYW1lKCkuZXF1YWxzKGVudkVudHJ5LmdldEVudkVudHJ5TmFtZSgpKSl7Ci0JCQkJCWNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKGVudkVudHJ5QmFzZSwgZW52RW50cnkpOwotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmb3VuZCl7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlnZXRCYXNlRWxlbWVudHMoKS5hZGQoRWNvcmVVdGlsLmNvcHkoKEVPYmplY3QpIG9Ub01lcmdlKSk7Ci0JCX0KLSAgICAgICAgcmV0dXJuIHdhcm5pbmdzOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZShFbnZFbnRyeSBiYXNlRWxlbWVudCwgRW52RW50cnkgdG9NZXJnZUVsZW1lbnQpIHsKLSAgICAJaWYoYmFzZUVsZW1lbnQuZ2V0RW52RW50cnlWYWx1ZSgpID09IG51bGwpewotICAgIAkJYmFzZUVsZW1lbnQuc2V0RW52RW50cnlWYWx1ZSh0b01lcmdlRWxlbWVudC5nZXRFbnZFbnRyeVZhbHVlKCkpOwotICAgIAl9Ci0gICAgCQotICAgIAlpZihiYXNlRWxlbWVudC5nZXRNYXBwZWROYW1lKCkgPT0gbnVsbCl7Ci0gICAgCQliYXNlRWxlbWVudC5zZXRNYXBwZWROYW1lKHRvTWVyZ2VFbGVtZW50LmdldE1hcHBlZE5hbWUoKSk7Ci0gICAgCX0KLSAgICAJCi0gICAgCWlmKCFiYXNlRWxlbWVudC5pc1NldEVudkVudHJ5VHlwZSgpKXsKLSAgICAgICAgICBiYXNlRWxlbWVudC5zZXRFbnZFbnRyeVR5cGUodG9NZXJnZUVsZW1lbnQuZ2V0RW52RW50cnlUeXBlKCkpOwotICAgICAgfQotCi0gICAgICAgIG1lcmdlSW5nZWN0aW9uVGFyZ2V0cyhiYXNlRWxlbWVudC5nZXRJbmplY3Rpb25UYXJnZXRzKCksIHRvTWVyZ2VFbGVtZW50LmdldEluamVjdGlvblRhcmdldHMoKSk7Ci0gICAgICAgIG1lcmdlRGVzY3JpcHRpb25zKGJhc2VFbGVtZW50LmdldERlc2NyaXB0aW9ucygpLCB0b01lcmdlRWxlbWVudC5nZXREZXNjcmlwdGlvbnMoKSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKE9iamVjdCBiYXNlLCBPYmplY3QgdG9NZXJnZSl7Ci0gICAgCWNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKChFbnZFbnRyeSkgYmFzZSwgKEVudkVudHJ5KSB0b01lcmdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9JTWVyZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9JTWVyZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjQ2MjIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvSU1lcmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQmFzZSBpbnRlcmZhY2UgZm9yIGFsbCBtZXJnZXIgY2xhc3Nlcy4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVyZ2VyIHsKLQotICAvKioKLSAgICogUHJvY2VzcyBtZXRob2QgaXMgdGhlIGFjdHVhbCBtZXJnZSBwcm9jZXNzLiBJdCB3aWxsIGdlbmVyYXRlIGxpc3Qgb2Ygd2Fybm5ncyBvciB0aHJvdyBleGNlcHRpb24uCi0gICAqICAKLSAgICogQHJldHVybiBsaXN0IG9mIHdhcm5pbmdzIGdhdGhlcmVkIGR1cmluZyBleGVjdXRpb24uCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgTGlzdCBwcm9jZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL0pORElSZWZzTWVyZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9KTkRJUmVmc01lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQ1YTRiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL0pORElSZWZzTWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhRUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuTWVzc2FnZURyaXZlbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwOwotCi0vKioKLSAqIAotICogSk5ESSBSZWZlcmVuY2VzIG1lcmdlci4gSXQgY2FuIGJlIGFwcGxpZWQgb24gRW50ZXJwcmlzZSBiZWFucyBvciBXZWIgcmVzb3VyY2UgYXJ0aWZhY3RzLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICovCi1wdWJsaWMgY2xhc3MgSk5ESVJlZnNNZXJnZXIgZXh0ZW5kcyBNb2RlbEVsZW1lbnRNZXJnZXIgewotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGJhc2UgLSBiYXNlIGxpc3Qgb2YgcmVmZXJlbmNlcyB0aGF0IGhhdmUgaGlnaGVyIHByaW9yaXR5IGFuZCBhcmUgcmVzdWx0IG9mIHRoZSBtZXJnZS4gCi0gICAgICogQHBhcmFtIHRvTWVyZ2UgLSB0b01lcmdlIGxpc3Qgb2YgcmVmZXJlbmNlcwotICAgICAqIEBwYXJhbSBraW5kCi0gICAgICovCi0gICAgcHVibGljIEpORElSZWZzTWVyZ2VyKEphdmFFRU9iamVjdCBiYXNlLAotICAgICAgICBKYXZhRUVPYmplY3QgdG9NZXJnZSwgaW50IGtpbmQpIHsKLSAgICAgICAgc3VwZXIoYmFzZSwgdG9NZXJnZSwga2luZCk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBTZXNzaW9uQmVhbiBnZXRCYXNlU2Vzc2lvbkJlYW4oKSB7Ci0gICAgICAgIHJldHVybiAoU2Vzc2lvbkJlYW4pIGdldEJhc2UoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgU2Vzc2lvbkJlYW4gZ2V0VG9NZXJnZVNlc3Npb25CZWFuICgpIHsKLSAgICAgICAgcmV0dXJuIChTZXNzaW9uQmVhbikgZ2V0VG9NZXJnZSgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgTWVzc2FnZURyaXZlbkJlYW4gZ2V0QmFzZU1kYkJlYW4oKSB7Ci0gICAgICByZXR1cm4gKE1lc3NhZ2VEcml2ZW5CZWFuKSBnZXRCYXNlKCk7Ci0gIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBNZXNzYWdlRHJpdmVuQmVhbiBnZXRUb01lcmdlTWRiQmVhbiAoKSB7Ci0gICAgICByZXR1cm4gKE1lc3NhZ2VEcml2ZW5CZWFuKSBnZXRUb01lcmdlKCk7Ci0gIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgV2ViQXBwIGdldEJhc2VXZWJBcHAoKSB7Ci0gICAgICByZXR1cm4gKFdlYkFwcCkgZ2V0QmFzZSgpOwotICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgV2ViQXBwIGdldFRvTWVyZ2VXZWJBcHAoKSB7Ci0gICAgICByZXR1cm4gKFdlYkFwcCkgZ2V0VG9NZXJnZSgpOwotICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBwcm9jZXNzKCkgdGhyb3dzIE1vZGVsRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdCB3YXJuaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgaWYoZ2V0QmFzZSgpIGluc3RhbmNlb2YgU2Vzc2lvbkJlYW4pewotICAgICAgICAgIHdhcm5pbmdzLmFkZEFsbChuZXcgRW52RW50cmllc01lcmdlcihnZXRCYXNlU2Vzc2lvbkJlYW4oKS5nZXRFbnZFbnRyaWVzKCksIGdldFRvTWVyZ2VTZXNzaW9uQmVhbigpLmdldEVudkVudHJpZXMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IFJlc291cmNlRW52UmVmc01lcmdlcihnZXRCYXNlU2Vzc2lvbkJlYW4oKS5nZXRSZXNvdXJjZUVudlJlZnMoKSwgZ2V0VG9NZXJnZVNlc3Npb25CZWFuKCkuZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBSZXNvdXJjZVJlZnNNZXJnZXIoZ2V0QmFzZVNlc3Npb25CZWFuKCkuZ2V0UmVzb3VyY2VSZWZzKCksIGdldFRvTWVyZ2VTZXNzaW9uQmVhbigpLmdldFJlc291cmNlUmVmcygpKS5wcm9jZXNzKCkpOwotICAgICAgICAgIHdhcm5pbmdzLmFkZEFsbChuZXcgTWVzc2FnZURlc3RpbmF0aW9uUmVmc01lcmdlcihnZXRCYXNlU2Vzc2lvbkJlYW4oKS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIGdldFRvTWVyZ2VTZXNzaW9uQmVhbigpLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IFNlcnZpY2VSZWZzTWVyZ2VyKGdldEJhc2VTZXNzaW9uQmVhbigpLmdldFNlcnZpY2VSZWZzKCksIGdldFRvTWVyZ2VTZXNzaW9uQmVhbigpLmdldFNlcnZpY2VSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBQZXJzaXN0ZW5jZUNvbnRleHRSZWZzTWVyZ2VyKGdldEJhc2VTZXNzaW9uQmVhbigpLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSwgZ2V0VG9NZXJnZVNlc3Npb25CZWFuKCkuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpKS5wcm9jZXNzKCkpOwotICAgICAgICAgIHdhcm5pbmdzLmFkZEFsbChuZXcgUGVyc2lzdGVuY2VVbml0UmVmc01lcmdlcihnZXRCYXNlU2Vzc2lvbkJlYW4oKS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCksIGdldFRvTWVyZ2VTZXNzaW9uQmVhbigpLmdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IEVKQlJlZnNNZXJnZXIoZ2V0QmFzZVNlc3Npb25CZWFuKCkuZ2V0RWpiTG9jYWxSZWZzKCksIGdldFRvTWVyZ2VTZXNzaW9uQmVhbigpLmdldEVqYkxvY2FsUmVmcygpKS5wcm9jZXNzKCkpOwotICAgICAgICAgIHdhcm5pbmdzLmFkZEFsbChuZXcgRUpCUmVmc01lcmdlcihnZXRCYXNlU2Vzc2lvbkJlYW4oKS5nZXRFamJSZWZzKCksIGdldFRvTWVyZ2VTZXNzaW9uQmVhbigpLmdldEVqYlJlZnMoKSkucHJvY2VzcygpKTsgIAotICAgICAgICB9IGVsc2UgaWYoZ2V0QmFzZSgpIGluc3RhbmNlb2YgTWVzc2FnZURyaXZlbkJlYW4pIHsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IEVudkVudHJpZXNNZXJnZXIoZ2V0QmFzZU1kYkJlYW4oKS5nZXRFbnZFbnRyaWVzKCksIGdldFRvTWVyZ2VNZGJCZWFuKCkuZ2V0RW52RW50cmllcygpKS5wcm9jZXNzKCkpOwotICAgICAgICAgIHdhcm5pbmdzLmFkZEFsbChuZXcgUmVzb3VyY2VFbnZSZWZzTWVyZ2VyKGdldEJhc2VNZGJCZWFuKCkuZ2V0UmVzb3VyY2VFbnZSZWZzKCksIGdldFRvTWVyZ2VNZGJCZWFuKCkuZ2V0UmVzb3VyY2VFbnZSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBSZXNvdXJjZVJlZnNNZXJnZXIoZ2V0QmFzZU1kYkJlYW4oKS5nZXRSZXNvdXJjZVJlZnMoKSwgZ2V0VG9NZXJnZU1kYkJlYW4oKS5nZXRSZXNvdXJjZVJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IE1lc3NhZ2VEZXN0aW5hdGlvblJlZnNNZXJnZXIoZ2V0QmFzZU1kYkJlYW4oKS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCksIGdldFRvTWVyZ2VNZGJCZWFuKCkuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpKS5wcm9jZXNzKCkpOwotICAgICAgICAgIHdhcm5pbmdzLmFkZEFsbChuZXcgU2VydmljZVJlZnNNZXJnZXIoZ2V0QmFzZU1kYkJlYW4oKS5nZXRTZXJ2aWNlUmVmcygpLCBnZXRUb01lcmdlTWRiQmVhbigpLmdldFNlcnZpY2VSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBQZXJzaXN0ZW5jZUNvbnRleHRSZWZzTWVyZ2VyKGdldEJhc2VNZGJCZWFuKCkuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmcygpLCBnZXRUb01lcmdlTWRiQmVhbigpLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IFBlcnNpc3RlbmNlVW5pdFJlZnNNZXJnZXIoZ2V0QmFzZU1kYkJlYW4oKS5nZXRQZXJzaXN0ZW5jZVVuaXRSZWZzKCksIGdldFRvTWVyZ2VNZGJCZWFuKCkuZ2V0UGVyc2lzdGVuY2VVbml0UmVmcygpKS5wcm9jZXNzKCkpOwotICAgICAgICAgIHdhcm5pbmdzLmFkZEFsbChuZXcgRUpCUmVmc01lcmdlcihnZXRCYXNlTWRiQmVhbigpLmdldEVqYkxvY2FsUmVmcygpLCBnZXRUb01lcmdlTWRiQmVhbigpLmdldEVqYkxvY2FsUmVmcygpKS5wcm9jZXNzKCkpOwotICAgICAgICAgIHdhcm5pbmdzLmFkZEFsbChuZXcgRUpCUmVmc01lcmdlcihnZXRCYXNlTWRiQmVhbigpLmdldEVqYlJlZnMoKSwgZ2V0VG9NZXJnZU1kYkJlYW4oKS5nZXRFamJSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgIH0gZWxzZSBpZihnZXRCYXNlKCkgaW5zdGFuY2VvZiBXZWJBcHApIHsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IEVudkVudHJpZXNNZXJnZXIoZ2V0QmFzZVdlYkFwcCgpLmdldEVudkVudHJpZXMoKSwgZ2V0VG9NZXJnZVdlYkFwcCgpLmdldEVudkVudHJpZXMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IFJlc291cmNlRW52UmVmc01lcmdlcihnZXRCYXNlV2ViQXBwKCkuZ2V0UmVzb3VyY2VFbnZSZWZzKCksIGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRSZXNvdXJjZUVudlJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IFJlc291cmNlUmVmc01lcmdlcihnZXRCYXNlV2ViQXBwKCkuZ2V0UmVzb3VyY2VSZWZzKCksIGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRSZXNvdXJjZVJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IE1lc3NhZ2VEZXN0aW5hdGlvblJlZnNNZXJnZXIoZ2V0QmFzZVdlYkFwcCgpLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSwgZ2V0VG9NZXJnZVdlYkFwcCgpLmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IFNlcnZpY2VSZWZzTWVyZ2VyKGdldEJhc2VXZWJBcHAoKS5nZXRTZXJ2aWNlUmVmcygpLCBnZXRUb01lcmdlV2ViQXBwKCkuZ2V0U2VydmljZVJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IFBlcnNpc3RlbmNlQ29udGV4dFJlZnNNZXJnZXIoZ2V0QmFzZVdlYkFwcCgpLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSwgZ2V0VG9NZXJnZVdlYkFwcCgpLmdldFBlcnNpc3RlbmNlQ29udGV4dFJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IFBlcnNpc3RlbmNlVW5pdFJlZnNNZXJnZXIoZ2V0QmFzZVdlYkFwcCgpLmdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSwgZ2V0VG9NZXJnZVdlYkFwcCgpLmdldFBlcnNpc3RlbmNlVW5pdFJlZnMoKSkucHJvY2VzcygpKTsKLSAgICAgICAgICB3YXJuaW5ncy5hZGRBbGwobmV3IEVKQlJlZnNNZXJnZXIoZ2V0QmFzZVdlYkFwcCgpLmdldEVqYkxvY2FsUmVmcygpLCBnZXRUb01lcmdlV2ViQXBwKCkuZ2V0RWpiTG9jYWxSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgICAgd2FybmluZ3MuYWRkQWxsKG5ldyBFSkJSZWZzTWVyZ2VyKGdldEJhc2VXZWJBcHAoKS5nZXRFamJSZWZzKCksIGdldFRvTWVyZ2VXZWJBcHAoKS5nZXRFamJSZWZzKCkpLnByb2Nlc3MoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdhcm5pbmdzOwotICAgIH0KLSB9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9NZXNzYWdlRGVzdGluYXRpb25SZWZzTWVyZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9NZXNzYWdlRGVzdGluYXRpb25SZWZzTWVyZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMTcyNTkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvTWVzc2FnZURlc3RpbmF0aW9uUmVmc01lcmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotCi0vKioKLSAqIE1lc3NhZ2VEZXN0aW5hdGlvblJlZnNNZXJnZXIgbWVyZ2VzIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBvYmplY3RzLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvblJlZnNNZXJnZXIgZXh0ZW5kcyBCYXNlUmVmc01lcmdlciB7Ci0gIAotICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBiYXNlIC0gYmFzZSBsaXN0IHdpdGggbWVzc2FnZSBkZXN0aW5hdGlvbiByZWZlcmVuY2VzLgotICAgICAqICAgICAgICAgICAgICAgdGhhdCBoYXZlIGhpZ2hlciBwcmlvcml0eSBhbmQgYXJlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuIAotICAgICAqIEBwYXJhbSB0b01lcmdlIC0gdG9NZXJnZSBsaXN0IHRvIGJlIGltcG9ydGVkIGluIGJhc2UgbGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uUmVmc01lcmdlcihMaXN0IGJhc2UsIExpc3QgdG9NZXJnZSkgewotICAgICAgICBzdXBlcihiYXNlLCB0b01lcmdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHByb2Nlc3MoKSB0aHJvd3MgTW9kZWxFeGNlcHRpb24gewotICAgICAgICBMaXN0PFN0cmluZz4gd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChPYmplY3Qgb1RvTWVyZ2UgOiBnZXRUb01lcmdlRWxlbWV0cygpKSB7Ci0JCQlNZXNzYWdlRGVzdGluYXRpb25SZWYgZW52RW50cnkgPSAoTWVzc2FnZURlc3RpbmF0aW9uUmVmKSBvVG9NZXJnZTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoT2JqZWN0IG9CYXNlIDogZ2V0QmFzZUVsZW1lbnRzKCkpIHsKLQkJCSAgTWVzc2FnZURlc3RpbmF0aW9uUmVmIGVudkVudHJ5QmFzZSA9IChNZXNzYWdlRGVzdGluYXRpb25SZWYpIG9CYXNlOwotCQkJCWlmIChlbnZFbnRyeUJhc2UuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmTmFtZSgpLmVxdWFscyhlbnZFbnRyeS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZOYW1lKCkpKXsKLQkJCQkJY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoZW52RW50cnlCYXNlLCBlbnZFbnRyeSk7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kKXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWdldEJhc2VFbGVtZW50cygpLmFkZChFY29yZVV0aWwuY29weSgoRU9iamVjdCkgb1RvTWVyZ2UpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2FybmluZ3M7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBiYXNlRWxlbWVudCwgTWVzc2FnZURlc3RpbmF0aW9uUmVmIHRvTWVyZ2VFbGVtZW50KSB7Ci0gICAgCQotICAgIAlpZihiYXNlRWxlbWVudC5nZXRNYXBwZWROYW1lKCkgPT0gbnVsbCl7Ci0gICAgCQliYXNlRWxlbWVudC5zZXRNYXBwZWROYW1lKHRvTWVyZ2VFbGVtZW50LmdldE1hcHBlZE5hbWUoKSk7Ci0gICAgCX0KLSAgICAJCi0gICAgCWlmKGJhc2VFbGVtZW50LmdldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSA9PSBudWxsKXsKLSAgICAgICAgICBiYXNlRWxlbWVudC5zZXRNZXNzYWdlRGVzdGluYXRpb25MaW5rKHRvTWVyZ2VFbGVtZW50LmdldE1lc3NhZ2VEZXN0aW5hdGlvbkxpbmsoKSk7Ci0gICAgICB9Ci0gICAgCQotICAgIAlpZihiYXNlRWxlbWVudC5nZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkgPT0gbnVsbCl7Ci0gICAgICAgICAgYmFzZUVsZW1lbnQuc2V0TWVzc2FnZURlc3RpbmF0aW9uVHlwZSh0b01lcmdlRWxlbWVudC5nZXRNZXNzYWdlRGVzdGluYXRpb25UeXBlKCkpOwotICAgICAgfQotICAgIAkKLSAgICAJaWYoIWJhc2VFbGVtZW50LmlzU2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKSl7Ci0gICAgICAgICAgYmFzZUVsZW1lbnQuc2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UodG9NZXJnZUVsZW1lbnQuZ2V0TWVzc2FnZURlc3RpbmF0aW9uVXNhZ2UoKSk7Ci0gICAgICB9Ci0KLSAgICAgICAgbWVyZ2VJbmdlY3Rpb25UYXJnZXRzKGJhc2VFbGVtZW50LmdldEluamVjdGlvblRhcmdldHMoKSwgdG9NZXJnZUVsZW1lbnQuZ2V0SW5qZWN0aW9uVGFyZ2V0cygpKTsKLSAgICAgICAgbWVyZ2VEZXNjcmlwdGlvbnMoYmFzZUVsZW1lbnQuZ2V0RGVzY3JpcHRpb25zKCksIHRvTWVyZ2VFbGVtZW50LmdldERlc2NyaXB0aW9ucygpKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoT2JqZWN0IGJhc2UsIE9iamVjdCB0b01lcmdlKXsKLSAgICAJY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoKE1lc3NhZ2VEZXN0aW5hdGlvblJlZikgYmFzZSwgKE1lc3NhZ2VEZXN0aW5hdGlvblJlZikgdG9NZXJnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvTW9kZWxFbGVtZW50TWVyZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9Nb2RlbEVsZW1lbnRNZXJnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmMzdkZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9Nb2RlbEVsZW1lbnRNZXJnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwubWVyZ2VyczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkphdmFFRU9iamVjdDsKLQotLyoqCi0gKiBNb2RlbCBlbGVtZW50IG1lcmdlciBpcyBiZWFzZSBjbGFzcyBmb3IgSmF2YSBFRSBtZXJnZXJzLiAKLSAqIEl0IGNvbnRhaW5zIHRoZSBiYXNlIGFuZCB0b01lcmdlIGVsZW1lbnRzLgotICogCi0gKiBCYXNlIGVsZW1lbnQgaXMgdGhlIG1haW4gZWxlbWVudCB0aGF0IHZhbHVlcyB3aWxsIGJlIHRha2VuIHdpdGggaGlnaGVzdCBwcmlvcml0eS4KLSAqIHRvTWVyZ2UgZWxlbWVudCB3aWxsIGdpdmUgYWxsIG9mIGhpcyBleHRyYSB2YWx1ZXMgdG8gYmFzZS4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsRWxlbWVudE1lcmdlciBpbXBsZW1lbnRzIElNZXJnZXIgewotCQotCXB1YmxpYyBzdGF0aWMgaW50IEFERCA9IDB4MTsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBDSEFOR0UgPSAweDI7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgUkVNT1ZFID0gMHg0OwotCQotCUphdmFFRU9iamVjdCBiYXNlOwotCUphdmFFRU9iamVjdCB0b01lcmdlcjsKLQotCXByaXZhdGUgaW50IGtpbmQ7Ci0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBvZiB0aGUgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIF9iYXNlIGVsZW1lbnQgaXMgdGhlIG1haW4gZWxlbWVudCB0aGF0IHZhbHVlcyB3aWxsIGJlIHRha2VuIHdpdGggaGlnaGVzdCBwcmlvcml0eS4KLQkgKiBAcGFyYW0gX3RvTWVyZ2UgZWxlbWVudCB3aWxsIGdpdmUgYWxsIG9mIGhpcyBleHRyYSB2YWx1ZXMgdG8gYmFzZS4KLQkgKiBAcGFyYW0gX2tpbmQKLQkgKi8KLQlwdWJsaWMgTW9kZWxFbGVtZW50TWVyZ2VyKEphdmFFRU9iamVjdCBfYmFzZSwgSmF2YUVFT2JqZWN0IF90b01lcmdlLCBpbnQgX2tpbmQpIHsKLQkJYmFzZSA9IF9iYXNlOwotCQl0b01lcmdlciA9IF90b01lcmdlOwotCQlraW5kID0gX2tpbmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBlbGVtZW50LCB3aGljaCBpcyBhbHNvIHRoZSBtZXJnZWQgcmVzdWx0LgotCSAqIAotCSAqIEByZXR1cm4gYmFzZSBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBKYXZhRUVPYmplY3QgZ2V0QmFzZSgpIHsKLQkJcmV0dXJuIGJhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0b01lcmdlIGVsZW1lbnQsIHdoaWNoIHdpbGwgYmUgbWVyZ2VkIGluIGJhc2UuCi0JICovCi0JcHJvdGVjdGVkIEphdmFFRU9iamVjdCBnZXRUb01lcmdlKCkgewotCQlyZXR1cm4gdG9NZXJnZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIubW9kZWwubWVyZ2Vycy5NZXJnZXIjcHJvY2VzcygpCi0JICovCi0JcHVibGljIGFic3RyYWN0IExpc3QgcHJvY2VzcygpIHRocm93cyBNb2RlbEV4Y2VwdGlvbjsKLQkKLQlwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0JCXJldHVybiBraW5kOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL01vZGVsRWxlbWVudHNNZXJnZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL01vZGVsRWxlbWVudHNNZXJnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzMWFiNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9Nb2RlbEVsZW1lbnRzTWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLm1lcmdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEJhc2UgbWVyZ2VyIGFkYXB0ZWQgdG8gZGVhbCB3aXRoIExpc3RzLgotICogCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsRWxlbWVudHNNZXJnZXIgaW1wbGVtZW50cyBJTWVyZ2VyIHsKLQotICAgIHByaXZhdGUgTGlzdCBiYXNlRWxlbWVudHM7Ci0gICAgcHJpdmF0ZSBMaXN0IHRvTWVyZ2VMaXN0OwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBfYmFzZUxpc3QKLSAgICAgKiBAcGFyYW0gX3RvTWVyZ2VMaXN0Ci0gICAgICovCi0gICAgcHVibGljIE1vZGVsRWxlbWVudHNNZXJnZXIoTGlzdCBfYmFzZUxpc3QsIExpc3QgX3RvTWVyZ2VMaXN0KSB7Ci0gICAgICAgIGJhc2VFbGVtZW50cyA9IF9iYXNlTGlzdDsKLSAgICAgICAgdG9NZXJnZUxpc3QgPSBfdG9NZXJnZUxpc3Q7Ci0gICAgfQotCi0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBMaXN0IGdldEJhc2VFbGVtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIGJhc2VFbGVtZW50czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIExpc3QgZ2V0VG9NZXJnZUVsZW1ldHMoKSB7Ci0gICAgICAgIHJldHVybiB0b01lcmdlTGlzdDsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIubW9kZWwubWVyZ2Vycy5NZXJnZXIjcHJvY2VzcygpCi0gICAgICovCi0gICAgcHVibGljIExpc3QgcHJvY2VzcygpIHRocm93cyBNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Qgd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7IAotICAgICAgICByZXR1cm4gd2FybmluZ3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvTW9kZWxFeGNlcHRpb24uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL01vZGVsRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NThkMGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvTW9kZWxFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWwubWVyZ2VyczsKLQotLyoqCi0gKiBNb2RlbEV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBpbnZhbGlkIHZhbHVlcyBvciBpbmNvbnNpc3RlbmNpZXMgYXJlIGRldGVjdGVkIGluIHRoZSBtb2RlbC4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICAvKioKLSAgICogCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTIzOTIyMzE4MTUyNjA2MDczOEw7Ci0KLQotICBwdWJsaWMgTW9kZWxFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLSAgICBzdXBlcihlKTsKLSAgfQotCi0KLSAgcHVibGljIE1vZGVsRXhjZXB0aW9uKCkgewotICAgIHN1cGVyKCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvUGVyc2lzdGVuY2VDb250ZXh0UmVmc01lcmdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvUGVyc2lzdGVuY2VDb250ZXh0UmVmc01lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTNjZWZkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL1BlcnNpc3RlbmNlQ29udGV4dFJlZnNNZXJnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLm1lcmdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5QZXJzaXN0ZW5jZUNvbnRleHRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLlByb3BlcnR5VHlwZTsKLQotLyoqCi0gKiBNZXJnZXMgcGVyc2lzdGVuY2UgY29udGV4dCByZWZlcmVuY2VzIGFydGlmYWN0cy4KLSAqIAotICogQGF1dGhvciBEaW1pdGFyIEdpb3Jtb3YKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZUNvbnRleHRSZWZzTWVyZ2VyIGV4dGVuZHMgQmFzZVJlZnNNZXJnZXIgewotCQotICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzLiAKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gYmFzZSAtIGJhc2UgbGlzdCB3aXRoIHBlcnNpc3RlbmNlIGNvbnRleHQgcmVmZXJlbmNlcy4KLSAgICAgKiAgICAgICAgICAgICAgIHRoYXQgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgYW5kIGFyZSByZXN1bHQgb2YgdGhlIG1lcmdlLiAKLSAgICAgKiBAcGFyYW0gdG9NZXJnZSAtIHRvTWVyZ2UgbGlzdCB0byBiZSBpbXBvcnRlZCBpbiBiYXNlIGxpc3QuCi0gICAgICovCi0gICAgcHVibGljIFBlcnNpc3RlbmNlQ29udGV4dFJlZnNNZXJnZXIoTGlzdCBfYmFzZSwgTGlzdCBfdG9NZXJnZSkgewotICAgICAgICBzdXBlcihfYmFzZSwgX3RvTWVyZ2UpOwotICAgIH0KLQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLm1vZGVsLm1lcmdlcnMuY29tbW9uLk1vZGVsRWxlbWVudHNNZXJnZXIjcHJvY2VzcygpCi0gICAgICovCi0gICAgcHVibGljIExpc3QgcHJvY2VzcygpIHRocm93cyBNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Qgd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IG9Ub01lcmdlIDogZ2V0VG9NZXJnZUVsZW1ldHMoKSkgewotCQkJUGVyc2lzdGVuY2VDb250ZXh0UmVmIGVudkVudHJ5ID0gKFBlcnNpc3RlbmNlQ29udGV4dFJlZikgb1RvTWVyZ2U7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKE9iamVjdCBvQmFzZSA6IGdldEJhc2VFbGVtZW50cygpKSB7Ci0JCQkJUGVyc2lzdGVuY2VDb250ZXh0UmVmIGVudkVudHJ5QmFzZSA9IChQZXJzaXN0ZW5jZUNvbnRleHRSZWYpIG9CYXNlOwotCQkJCWlmIChlbnZFbnRyeUJhc2UuZ2V0UGVyc2lzdGVuY2VDb250ZXh0UmVmTmFtZSgpLmVxdWFscyhlbnZFbnRyeS5nZXRQZXJzaXN0ZW5jZUNvbnRleHRSZWZOYW1lKCkpKXsKLQkJCQkJY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoZW52RW50cnlCYXNlLCBlbnZFbnRyeSk7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kKXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWdldEJhc2VFbGVtZW50cygpLmFkZChFY29yZVV0aWwuY29weSgoRU9iamVjdCkgb1RvTWVyZ2UpKTsKLQkJfQotICAgICAgICByZXR1cm4gd2FybmluZ3M7Ci0gICAgfQotICAgIAotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoUGVyc2lzdGVuY2VDb250ZXh0UmVmIGJhc2VFbGVtZW50LCBQZXJzaXN0ZW5jZUNvbnRleHRSZWYgdG9NZXJnZUVsZW1lbnQpIHsKLSAgICAJaWYoYmFzZUVsZW1lbnQuZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpID09IG51bGwpewotICAgIAkJYmFzZUVsZW1lbnQuc2V0UGVyc2lzdGVuY2VVbml0TmFtZSh0b01lcmdlRWxlbWVudC5nZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkpOwotICAgIAl9Ci0gICAgCQotICAgIAlpZihiYXNlRWxlbWVudC5nZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKCkgPT0gbnVsbCl7Ci0gICAgCQliYXNlRWxlbWVudC5zZXRQZXJzaXN0ZW5jZUNvbnRleHRUeXBlKHRvTWVyZ2VFbGVtZW50LmdldFBlcnNpc3RlbmNlQ29udGV4dFR5cGUoKSk7Ci0gICAgCX0KLSAgICAJCi0gICAgCWlmKGJhc2VFbGVtZW50LmdldE1hcHBlZE5hbWUoKSA9PSBudWxsKXsKLSAgICAgICAgICBiYXNlRWxlbWVudC5zZXRNYXBwZWROYW1lKHRvTWVyZ2VFbGVtZW50LmdldE1hcHBlZE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgCQotICAgIAljb3B5TWlzc2luZ1BlcnNpc3RlbnRQcm9wZXJ0aWVzSW5CYXNlKGJhc2VFbGVtZW50LmdldFBlcnNpc3RlbmNlUHJvcGVydGllcygpLCB0b01lcmdlRWxlbWVudC5nZXRQZXJzaXN0ZW5jZVByb3BlcnRpZXMoKSk7Ci0gICAgfQotICAgIAotICAgIAotICAgIHByaXZhdGUgdm9pZCBjb3B5TWlzc2luZ1BlcnNpc3RlbnRQcm9wZXJ0aWVzSW5CYXNlKAotICAgICAgICBMaXN0IHBlcnNpc3RlbmNlUHJvcGVydGllcywgTGlzdCBwZXJzaXN0ZW5jZVByb3BlcnRpZXMyKSB7Ci0gICAgICBmb3IgKE9iamVjdCBtZXJnZVByb3BzIDogcGVyc2lzdGVuY2VQcm9wZXJ0aWVzMikgewotICAgICAgICBQcm9wZXJ0eVR5cGUgbVByb3AgPSAoUHJvcGVydHlUeXBlKSBtZXJnZVByb3BzOwotICAgICAgICBpZighY29udGFpbnNQcm9wZXJ0eShwZXJzaXN0ZW5jZVByb3BlcnRpZXMgLCBtUHJvcCkpewotICAgICAgICAgIHBlcnNpc3RlbmNlUHJvcGVydGllcy5hZGQoIG1Qcm9wKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zUHJvcGVydHkoTGlzdCBsaXN0LCBQcm9wZXJ0eVR5cGUgcCl7Ci0gICAgICBmb3IgKE9iamVjdCBiYXNlUHJvcHMgOiBsaXN0KSB7Ci0gICAgICAgIFByb3BlcnR5VHlwZSBiUHJvcCA9IChQcm9wZXJ0eVR5cGUpIGJhc2VQcm9wczsKLSAgICAgICAgaWYocC5nZXROYW1lKCkuZXF1YWxzKGJQcm9wLmdldE5hbWUoKSkpewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZShPYmplY3QgYmFzZSwgT2JqZWN0IHRvTWVyZ2UpewotICAgIAljb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZSgoUGVyc2lzdGVuY2VDb250ZXh0UmVmKSBiYXNlLCAoUGVyc2lzdGVuY2VDb250ZXh0UmVmKSB0b01lcmdlKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9QZXJzaXN0ZW5jZVVuaXRSZWZzTWVyZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9QZXJzaXN0ZW5jZVVuaXRSZWZzTWVyZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYTlkNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvUGVyc2lzdGVuY2VVbml0UmVmc01lcmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5tZXJnZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmNvcmUuUGVyc2lzdGVuY2VVbml0UmVmOwotCi0vKioKLSAqIAotICogTWVyZ2VzIHBlcnNpc3RlbmNlIHVuaXQgcmVmZXJlbmNlcyBhcnRpZmFjdHMuCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKi8KLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdFJlZnNNZXJnZXIgZXh0ZW5kcyBCYXNlUmVmc01lcmdlciB7Ci0JCi0gIC8qKgotICAgKiAgQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcy4gCi0gICAqIAotICAgKiBAcGFyYW0gYmFzZSAtIGJhc2UgbGlzdCB3aXRoIHBlcnNpc3RlbmNlIHVuaXQgcmVmZXJlbmNlcy4KLSAgICogICAgICAgICAgICAgICB0aGF0IGhhdmUgaGlnaGVyIHByaW9yaXR5IGFuZCBhcmUgcmVzdWx0IG9mIHRoZSBtZXJnZS4gCi0gICAqIEBwYXJhbSB0b01lcmdlIC0gdG9NZXJnZSBsaXN0IHRvIGJlIGltcG9ydGVkIGluIGJhc2UgbGlzdC4KLSAgICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFJlZnNNZXJnZXIoTGlzdCBiYXNlLCBMaXN0IHRvTWVyZ2UpIHsKLSAgICAgICAgc3VwZXIoYmFzZSwgdG9NZXJnZSk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIubW9kZWwubWVyZ2Vycy5jb21tb24uTW9kZWxFbGVtZW50c01lcmdlciNwcm9jZXNzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdCBwcm9jZXNzKCkgdGhyb3dzIE1vZGVsRXhjZXB0aW9uIHsKLSAgICAgIExpc3Qgd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICBmb3IgKE9iamVjdCBvVG9NZXJnZSA6IGdldFRvTWVyZ2VFbGVtZXRzKCkpIHsKLSAgICAgICAgICBQZXJzaXN0ZW5jZVVuaXRSZWYgcmVzUmVmID0gKFBlcnNpc3RlbmNlVW5pdFJlZikgb1RvTWVyZ2U7Ci0gICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgIGZvciAoT2JqZWN0IG9CYXNlIDogZ2V0QmFzZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFBlcnNpc3RlbmNlVW5pdFJlZiByZXNSZWZCYXNlID0gKFBlcnNpc3RlbmNlVW5pdFJlZikgb0Jhc2U7Ci0gICAgICAgICAgICAgIGlmIChyZXNSZWZCYXNlLmdldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUoKS5lcXVhbHMocmVzUmVmLmdldFBlcnNpc3RlbmNlVW5pdFJlZk5hbWUoKSkpewotICAgICAgICAgICAgICAgICAgY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UocmVzUmVmQmFzZSwgcmVzUmVmKTsKLSAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChmb3VuZCl7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBnZXRCYXNlRWxlbWVudHMoKS5hZGQoRWNvcmVVdGlsLmNvcHkoKEVPYmplY3QpIG9Ub01lcmdlKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gd2FybmluZ3M7Ci0gICAgfQotICAgIAotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKFBlcnNpc3RlbmNlVW5pdFJlZiBiYXNlRWxlbWVudCwgUGVyc2lzdGVuY2VVbml0UmVmIHRvTWVyZ2VFbGVtZW50KSB7ICAgIAkKLSAgICAJaWYoYmFzZUVsZW1lbnQuZ2V0UGVyc2lzdGVuY2VVbml0TmFtZSgpID09IG51bGwpewotICAgIAkJYmFzZUVsZW1lbnQuc2V0UGVyc2lzdGVuY2VVbml0TmFtZSh0b01lcmdlRWxlbWVudC5nZXRQZXJzaXN0ZW5jZVVuaXROYW1lKCkpOwotICAgIAl9Ci0gICAgCWlmKGJhc2VFbGVtZW50LmdldE1hcHBlZE5hbWUoKSA9PSBudWxsKXsKLSAgICAgICAgICBiYXNlRWxlbWVudC5zZXRNYXBwZWROYW1lKHRvTWVyZ2VFbGVtZW50LmdldE1hcHBlZE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKE9iamVjdCBiYXNlLCBPYmplY3QgdG9NZXJnZSl7Ci0gICAgCWNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKChQZXJzaXN0ZW5jZVVuaXRSZWYpIGJhc2UsIChQZXJzaXN0ZW5jZVVuaXRSZWYpIHRvTWVyZ2UpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL1Jlc291cmNlRW52UmVmc01lcmdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvUmVzb3VyY2VFbnZSZWZzTWVyZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTdhMmEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvUmVzb3VyY2VFbnZSZWZzTWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLm1lcmdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZUVudlJlZjsKLQotLyoqCi0gKiBNZXJnZXMgUmVzb3VyY2UgRW52aXJvbm1lbnQgUmVmZXJlbmNlcyBhcnRpZmFjdHMuCi0gKiAgCi0gKiBAYXV0aG9yIERpbWl0YXIgR2lvcm1vdgotICoKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlRW52UmVmc01lcmdlciBleHRlbmRzIEJhc2VSZWZzTWVyZ2VyIHsKLSAgICAKLSAgLyoqCi0gICAqICBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzLiAKLSAgICogCi0gICAqIEBwYXJhbSBiYXNlIC0gYmFzZSBsaXN0IHdpdGggcmVzb3VyY2UgZW52aXJvbm1lbnQgcmVmZXJlbmNlcy4KLSAgICogICAgICAgICAgICAgICB0aGF0IGhhdmUgaGlnaGVyIHByaW9yaXR5IGFuZCBhcmUgcmVzdWx0IG9mIHRoZSBtZXJnZS4gCi0gICAqIEBwYXJhbSB0b01lcmdlIC0gdG9NZXJnZSBsaXN0IHRvIGJlIGltcG9ydGVkIGluIGJhc2UgbGlzdC4KLSAgICovCi0gICAgcHVibGljIFJlc291cmNlRW52UmVmc01lcmdlcihMaXN0IGJhc2UsIExpc3QgdG9NZXJnZSkgewotICAgICAgICBzdXBlcihiYXNlLCB0b01lcmdlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5tb2RlbC5tZXJnZXJzLmNvbW1vbi5Nb2RlbEVsZW1lbnRzTWVyZ2VyI3Byb2Nlc3MoKQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IHByb2Nlc3MoKSB0aHJvd3MgTW9kZWxFeGNlcHRpb24gewotICAgICAgICBMaXN0IHdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKE9iamVjdCBvVG9NZXJnZSA6IGdldFRvTWVyZ2VFbGVtZXRzKCkpIHsKLQkJCVJlc291cmNlRW52UmVmIHJlc0VudlJlZiA9IChSZXNvdXJjZUVudlJlZikgb1RvTWVyZ2U7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKE9iamVjdCBvQmFzZSA6IGdldEJhc2VFbGVtZW50cygpKSB7Ci0JCQkJUmVzb3VyY2VFbnZSZWYgcmVzb3VyY2VFbnZSZWZCYXNlID0gKFJlc291cmNlRW52UmVmKSBvQmFzZTsKLQkJCQlpZiAocmVzb3VyY2VFbnZSZWZCYXNlLmdldFJlc291cmNlRW52UmVmTmFtZSgpLmVxdWFscyhyZXNFbnZSZWYuZ2V0UmVzb3VyY2VFbnZSZWZOYW1lKCkpKXsKLQkJCQkJY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UocmVzb3VyY2VFbnZSZWZCYXNlLCByZXNFbnZSZWYpOwotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmb3VuZCl7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlnZXRCYXNlRWxlbWVudHMoKS5hZGQoRWNvcmVVdGlsLmNvcHkoKEVPYmplY3QpIG9Ub01lcmdlKSk7Ci0JCX0KLSAgICAgICAgcmV0dXJuIHdhcm5pbmdzOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZShSZXNvdXJjZUVudlJlZiBiYXNlUmVmLCBSZXNvdXJjZUVudlJlZiB0b01lcmdlUmVmKSB7Ci0gICAgCWlmKGJhc2VSZWYuZ2V0UmVzb3VyY2VFbnZSZWZUeXBlKCkgPT0gbnVsbCl7Ci0gICAgCQliYXNlUmVmLnNldFJlc291cmNlRW52UmVmVHlwZSh0b01lcmdlUmVmLmdldFJlc291cmNlRW52UmVmVHlwZSgpKTsKLSAgICAJfQotICAgIAkKLSAgICAJaWYoYmFzZVJlZi5nZXRNYXBwZWROYW1lKCkgPT0gbnVsbCl7Ci0gICAgCQliYXNlUmVmLnNldE1hcHBlZE5hbWUodG9NZXJnZVJlZi5nZXRNYXBwZWROYW1lKCkpOwotICAgIAl9Ci0gICAgCQotICAgICAgbWVyZ2VJbmdlY3Rpb25UYXJnZXRzKGJhc2VSZWYuZ2V0SW5qZWN0aW9uVGFyZ2V0cygpLCB0b01lcmdlUmVmLmdldEluamVjdGlvblRhcmdldHMoKSk7Ci0gICAgICBtZXJnZURlc2NyaXB0aW9ucyhiYXNlUmVmLmdldERlc2NyaXB0aW9ucygpLCB0b01lcmdlUmVmLmdldERlc2NyaXB0aW9ucygpKTsKLSAgICB9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZShPYmplY3QgYmFzZSwgT2JqZWN0IHRvTWVyZ2UpIHsKLQkJY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoKFJlc291cmNlRW52UmVmKSBiYXNlLCAoUmVzb3VyY2VFbnZSZWYpdG9NZXJnZSk7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL1Jlc291cmNlUmVmc01lcmdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvUmVzb3VyY2VSZWZzTWVyZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzU3OTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL21lcmdlcnMvUmVzb3VyY2VSZWZzTWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLm1lcmdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5SZXNvdXJjZVJlZjsKLQotLyoqCi0gKiBNZXJnZXMgUmVzb3VyY2UgUmVmZXJlbmNlcyBhcnRpZmFjdHMuCi0gKiAKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VSZWZzTWVyZ2VyIGV4dGVuZHMgQmFzZVJlZnNNZXJnZXIgewotICAgIAotICAvKioKLSAgICogIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuIAotICAgKiAKLSAgICogQHBhcmFtIGJhc2UgLSBiYXNlIGxpc3Qgd2l0aCByZXNvdXJjZSByZWZlcmVuY2VzLgotICAgKiAgICAgICAgICAgICAgIHRoYXQgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgYW5kIGFyZSByZXN1bHQgb2YgdGhlIG1lcmdlLiAKLSAgICogQHBhcmFtIHRvTWVyZ2UgLSB0b01lcmdlIGxpc3QgdG8gYmUgaW1wb3J0ZWQgaW4gYmFzZSBsaXN0LgotICAgKi8KLQlwdWJsaWMgUmVzb3VyY2VSZWZzTWVyZ2VyKExpc3QgYmFzZSwgTGlzdCB0b01lcmdlKSB7Ci0gICAgICAgIHN1cGVyKGJhc2UsIHRvTWVyZ2UpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLm1vZGVsLm1lcmdlcnMuY29tbW9uLk1vZGVsRWxlbWVudHNNZXJnZXIjcHJvY2VzcygpCi0gICAgICovCi0gICAgcHVibGljIExpc3QgcHJvY2VzcygpIHRocm93cyBNb2RlbEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Qgd2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IG9Ub01lcmdlIDogZ2V0VG9NZXJnZUVsZW1ldHMoKSkgewotCQkJUmVzb3VyY2VSZWYgcmVzUmVmID0gKFJlc291cmNlUmVmKSBvVG9NZXJnZTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoT2JqZWN0IG9CYXNlIDogZ2V0QmFzZUVsZW1lbnRzKCkpIHsKLQkJCQlSZXNvdXJjZVJlZiByZXNSZWZCYXNlID0gKFJlc291cmNlUmVmKSBvQmFzZTsKLQkJCQlpZiAocmVzUmVmQmFzZS5nZXRSZXNSZWZOYW1lKCkuZXF1YWxzKHJlc1JlZi5nZXRSZXNSZWZOYW1lKCkpKXsKLQkJCQkJY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UocmVzUmVmQmFzZSwgcmVzUmVmKTsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZm91bmQpewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZ2V0QmFzZUVsZW1lbnRzKCkuYWRkKEVjb3JlVXRpbC5jb3B5KChFT2JqZWN0KSBvVG9NZXJnZSkpOwotCQl9Ci0gICAgICAgIHJldHVybiB3YXJuaW5nczsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoUmVzb3VyY2VSZWYgYmFzZUVsZW1lbnQsIFJlc291cmNlUmVmIHRvTWVyZ2VFbGVtZW50KSB7Ci0gICAgCWlmKGJhc2VFbGVtZW50LmdldFJlc1R5cGUoKSA9PSBudWxsKXsKLSAgICAJCWJhc2VFbGVtZW50LnNldFJlc1R5cGUodG9NZXJnZUVsZW1lbnQuZ2V0UmVzVHlwZSgpKTsKLSAgICAJfQotICAgIAkKLSAgICAJaWYoIWJhc2VFbGVtZW50LmlzU2V0UmVzQXV0aCgpKXsKLSAgICAJCWJhc2VFbGVtZW50LnNldFJlc0F1dGgodG9NZXJnZUVsZW1lbnQuZ2V0UmVzQXV0aCgpKTsKLSAgICAJfQotICAgIAkKLSAgICAJaWYoIWJhc2VFbGVtZW50LmlzU2V0UmVzU2hhcmluZ1Njb3BlKCkpewotICAgIAkJYmFzZUVsZW1lbnQuc2V0UmVzU2hhcmluZ1Njb3BlKHRvTWVyZ2VFbGVtZW50LmdldFJlc1NoYXJpbmdTY29wZSgpKTsKLSAgICAJfQotICAgIAkKLSAgICAJaWYoYmFzZUVsZW1lbnQuZ2V0TWFwcGVkTmFtZSgpID09IG51bGwpewotICAgIAkJYmFzZUVsZW1lbnQuc2V0TWFwcGVkTmFtZSh0b01lcmdlRWxlbWVudC5nZXRNYXBwZWROYW1lKCkpOwotICAgIAl9Ci0KLQotICAgIH0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKE9iamVjdCBiYXNlLCBPYmplY3QgdG9NZXJnZSkgewotCQljb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZSgoUmVzb3VyY2VSZWYpIGJhc2UsIChSZXNvdXJjZVJlZiApdG9NZXJnZSk7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL1NlcnZpY2VSZWZzTWVyZ2VyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvbWVyZ2Vycy9TZXJ2aWNlUmVmc01lcmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2NlMDRlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9tZXJnZXJzL1NlcnZpY2VSZWZzTWVyZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsLm1lcmdlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5TZXJ2aWNlUmVmOwotCi0vKioKLSAqIEBhdXRob3IgRGltaXRhciBHaW9ybW92Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZVJlZnNNZXJnZXIgZXh0ZW5kcyBCYXNlUmVmc01lcmdlciB7Ci0KLQotICAvKioKLSAgICogIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuIAotICAgKiAKLSAgICogQHBhcmFtIGJhc2UgLSBiYXNlIGxpc3Qgd2l0aCBzZXJ2aWNlIHJlZmVyZW5jZXMuCi0gICAqICAgICAgICAgICAgICAgdGhhdCBoYXZlIGhpZ2hlciBwcmlvcml0eSBhbmQgYXJlIHJlc3VsdCBvZiB0aGUgbWVyZ2UuIAotICAgKiBAcGFyYW0gdG9NZXJnZSAtIHRvTWVyZ2UgbGlzdCB0byBiZSBpbXBvcnRlZCBpbiBiYXNlIGxpc3QuCi0gICAqLwotICBwdWJsaWMgU2VydmljZVJlZnNNZXJnZXIoTGlzdCBfYmFzZVJlZnMsIExpc3QgX3RvTWVyZ2VSZWZzKSB7Ci0gICAgc3VwZXIoX2Jhc2VSZWZzLCBfdG9NZXJnZVJlZnMpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLm1vZGVsLm1lcmdlcnMuY29tbW9uLk1vZGVsRWxlbWVudHNNZXJnZXIjcHJvY2VzcygpCi0gICAqLwotICBwdWJsaWMgTGlzdCBwcm9jZXNzKCkgdGhyb3dzIE1vZGVsRXhjZXB0aW9uIHsKLSAgICBMaXN0IHdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGZvciAoT2JqZWN0IG9Ub01lcmdlIDogZ2V0VG9NZXJnZUVsZW1ldHMoKSkgewotICAgICAgU2VydmljZVJlZiBzZXJ2aXZjZVJlZiA9IChTZXJ2aWNlUmVmKSBvVG9NZXJnZTsKLSAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgIGZvciAoT2JqZWN0IG9CYXNlIDogZ2V0QmFzZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgU2VydmljZVJlZiBTZXJ2aWNlUmVmQmFzZSA9IChTZXJ2aWNlUmVmKSBvQmFzZTsKLSAgICAgICAgaWYgKFNlcnZpY2VSZWZCYXNlLmdldFNlcnZpY2VSZWZOYW1lKCkuZXF1YWxzKHNlcnZpdmNlUmVmLmdldFNlcnZpY2VSZWZOYW1lKCkpKXsKLSAgICAgICAgICBjb3B5TWlzc2luZ1Byb3BlcnRlc0luQmFzZShTZXJ2aWNlUmVmQmFzZSwgc2Vydml2Y2VSZWYpOwotICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZvdW5kKXsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBnZXRCYXNlRWxlbWVudHMoKS5hZGQoRWNvcmVVdGlsLmNvcHkoKEVPYmplY3QpIG9Ub01lcmdlKSk7Ci0gICAgfQotICAgIHJldHVybiB3YXJuaW5nczsKLSAgfQotCi0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKE9iamVjdCBiYXNlLCBPYmplY3QgdG9NZXJnZSkgewotICAgIGNvcHlNaXNzaW5nUHJvcGVydGVzSW5CYXNlKChTZXJ2aWNlUmVmKSBiYXNlLCAoU2VydmljZVJlZikgdG9NZXJnZSk7Ci0gIH0KLSAgcHJvdGVjdGVkIHZvaWQgY29weU1pc3NpbmdQcm9wZXJ0ZXNJbkJhc2UoU2VydmljZVJlZiBiYXNlLCBTZXJ2aWNlUmVmIHRvTWVyZ2UpIHsKLSAgICBpZiAoYmFzZS5nZXRNYXBwZWROYW1lKCkgPT0gbnVsbCl7Ci0gICAgICBiYXNlLnNldE1hcHBlZE5hbWUodG9NZXJnZS5nZXRNYXBwZWROYW1lKCkpOwotICAgIH0KLQotICAgIGlmIChiYXNlLmdldFdzZGxGaWxlKCkgPT0gbnVsbCl7Ci0gICAgICBiYXNlLnNldFdzZGxGaWxlKHRvTWVyZ2UuZ2V0V3NkbEZpbGUoKSk7Ci0gICAgfQotICAgIC8vCSAgaWYgKGJhc2UuZ2V0U2VydmljZUludGVyZmFjZSgpLmVxdWFscygiamF2YXgueG1sLndzLlNlcnZpY2UiKSkgewotICAgIGlmIChiYXNlLmdldFNlcnZpY2VJbnRlcmZhY2UoKSA9PSBudWxsKSB7Ci0gICAgICBiYXNlLnNldFNlcnZpY2VJbnRlcmZhY2UodG9NZXJnZS5nZXRTZXJ2aWNlSW50ZXJmYWNlKCkpOwotICAgIH0KLSAgICAvLwkgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvY29tcG9uZW50LnhtbCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmI3YjE0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuamVlIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlIiBmcmFnbWVudD0iZmFsc2UiLz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLmVqYiIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmplZS53ZWIiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2plZS9KRUVQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qZWUvSkVFUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDkxZGIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2plZS9KRUVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEpFRVBsdWdpbiBleHRlbmRzIFdUUFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuamVlIjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKRUVQbHVnaW4gcGx1Z2luOwotCQotCXByaXZhdGUgSkVFUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBudWxsOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKRUVQbHVnaW4oKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBKRUVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkgICAvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5XVFBQbHVnaW4jZ2V0UGx1Z2luSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBQTFVHSU5fSUQ7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIEpFRVByZWZlcmVuY2VzIGdldEpFRVByZWZlcmVuY2VzKCkgewotCQlpZiAodGhpcy5wcmVmZXJlbmNlcyA9PSBudWxsKQotCQkJdGhpcy5wcmVmZXJlbmNlcyA9IG5ldyBKRUVQcmVmZXJlbmNlcyh0aGlzKTsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXM7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKSB7Ci0JCWdldEpFRVByZWZlcmVuY2VzKCkuaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2plZS9KRUVQcmVmZXJlbmNlcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2plZS9KRUVQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDU0ODBlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qZWUvSkVFUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDI2LCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotCi0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBKRUVQcmVmZXJlbmNlcyB7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIEtleXMgewotCQkKLQkJCi0KLQl9Ci0KLQkKLQotCQotCi0JcHJpdmF0ZSBQbHVnaW4gb3duZXIgPSBudWxsOwotCXByaXZhdGUgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBwZXJzaXN0T25DaGFuZ2UgPSBmYWxzZTsKLQotCXB1YmxpYyBKRUVQcmVmZXJlbmNlcyhQbHVnaW4gb3duZXIpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0KLQkJLy8gcGxhY2Vob2xkZXIKLQkJLy8gd2UgaGFkIHRvIG1vdmUgZ2VuZXJhdGVfZGQgdG8ganN0LmoyZWUgYXMganN0LmplZSBpcyBub3QgaW4gdGhlIHByZS1yZXEgb2YgbWFueSBwbHVnLWlucwotCX0KLQotCQotCi0JCi0KLQkKLQlwdWJsaWMgdm9pZCBmaXJlUHJlZmVyZW5jZUNoYW5nZWQoKSB7Ci0JCWlmIChpc1BlcnNpc3RPbkNoYW5nZSgpKQotCQkJcGVyc2lzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcnNpc3QoKSB7Ci0JCWdldE93bmVyKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwZXJzaXN0T25DaGFuZ2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0T25DaGFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnBlcnNpc3RPbkNoYW5nZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGVyc2lzdE9uQ2hhbmdlCi0JICogICAgICAgICAgICBUaGUgcGVyc2lzdE9uQ2hhbmdlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0T25DaGFuZ2UoYm9vbGVhbiBwZXJzaXN0T25DaGFuZ2UpIHsKLQkJdGhpcy5wZXJzaXN0T25DaGFuZ2UgPSBwZXJzaXN0T25DaGFuZ2U7Ci0JfQotCi0JcHVibGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCQlpZiAodGhpcy5wcmVmZXJlbmNlcyA9PSBudWxsKQotCQkJdGhpcy5wcmVmZXJlbmNlcyA9IGdldE93bmVyKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBvd25lci4KLQkgKi8KLQlwcml2YXRlIFBsdWdpbiBnZXRPd25lcigpIHsKLQkJcmV0dXJuIHRoaXMub3duZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJvb2xlYW4tdmFsdWVkIHByb3BlcnR5IHdpdGggdGhlCi0JICogZ2l2ZW4gbmFtZS4KLQkgKiBUaGUgZ2l2ZW4gbmFtZSBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gdGhlIGJvb2xlYW4tdmFsdWVkIHByb3BlcnR5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJvb2xlYW4tdmFsdWVkIHByb3BlcnR5IHdpdGggdGhlCi0JICogZ2l2ZW4gbmFtZS4gVGhlIGdpdmVuIG5hbWUgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQkJZmlyZVByZWZlcmVuY2VDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvamVlL2ludGVybmFsL2RlcGxveWFibGVzL0pFRURlcGxveWFibGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvamVlL2ludGVybmFsL2RlcGxveWFibGVzL0pFRURlcGxveWFibGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTU1NmQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2plZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KRUVEZXBsb3lhYmxlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUuaW50ZXJuYWwuZGVwbG95YWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uSjJFRVZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbXBvbmVudGNvcmUuSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzLkoyRUVGbGV4UHJvakRlcGxveWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmplZS51dGlsLmludGVybmFsLkphdmFFRVF1aWNrUGVlazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuTW9kdWxlQ29yZU5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLlByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGU7Ci0KLS8qKgotICogSjJFRSBtb2R1bGUgZmFjdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIEpFRURlcGxveWFibGVGYWN0b3J5IGV4dGVuZHMgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSB7Ci0JcHJvdGVjdGVkIE1hcCA8SU1vZHVsZSwgTW9kdWxlRGVsZWdhdGU+IG1vZHVsZURlbGVnYXRlcyA9IG5ldyBIYXNoTWFwPElNb2R1bGUsIE1vZHVsZURlbGVnYXRlPig1KTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpzdC5qZWUuc2VydmVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEpFRURlcGxveWFibGVGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBJTW9kdWxlW10gY3JlYXRlTW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYoY29tcCAhPSBudWxsKXsKLQkJCXJldHVybiBjcmVhdGVNb2R1bGVEZWxlZ2F0ZXMoY29tcCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVXNlIHtAbGluayAjY3JlYXRlTW9kdWxlKElQcm9qZWN0KX0gaW5zdGVhZC4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBwYXJhbSBuYXR1cmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElNb2R1bGVbXSBjcmVhdGVNb2R1bGVzKE1vZHVsZUNvcmVOYXR1cmUgbmF0dXJlKSB7Ci0JCWlmKG5hdHVyZSAhPSBudWxsKXsKLQkJCXJldHVybiBjcmVhdGVNb2R1bGVzKG5hdHVyZS5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBNb2R1bGVEZWxlZ2F0ZSBnZXRNb2R1bGVEZWxlZ2F0ZShJTW9kdWxlIG1vZHVsZSkgewotCQlpZiAobW9kdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlNb2R1bGVEZWxlZ2F0ZSBtZCA9IChNb2R1bGVEZWxlZ2F0ZSkgbW9kdWxlRGVsZWdhdGVzLmdldChtb2R1bGUpOwotCi0JCWlmIChtZCA9PSBudWxsKSB7Ci0JCQljcmVhdGVNb2R1bGVzKG1vZHVsZS5nZXRQcm9qZWN0KCkpOwotCQkJbWQgPSAoTW9kdWxlRGVsZWdhdGUpIG1vZHVsZURlbGVnYXRlcy5nZXQobW9kdWxlKTsKLQkJfQotCi0JCXJldHVybiBtZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZHVsZVtdIGNyZWF0ZU1vZHVsZURlbGVnYXRlcyhJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJaWYoY29tcG9uZW50ID09IG51bGwpewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTGlzdCBwcm9qZWN0TW9kdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0pFRVByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLQkJCQlJTW9kdWxlIG1vZHVsZSA9IG51bGw7Ci0JCQkJU3RyaW5nIHR5cGUgPSBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFR5cGUoY29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCAmJiAhdHlwZS5lcXVhbHMoIiIpKSB7Ci0JCQkJCVN0cmluZyB2ZXJzaW9uID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0SjJFRVByb2plY3RWZXJzaW9uKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCQltb2R1bGUgPSBjcmVhdGVNb2R1bGUoY29tcG9uZW50LmdldERlcGxveWVkTmFtZSgpLCBjb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCksIHR5cGUsIHZlcnNpb24sIGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQkJCQlKRUVGbGV4UHJvakRlcGxveWFibGUgbW9kdWxlRGVsZWdhdGUgPSBuZXcgSkVFRmxleFByb2pEZXBsb3lhYmxlKGNvbXBvbmVudC5nZXRQcm9qZWN0KCksIGNvbXBvbmVudCk7Ci0JCQkJCW1vZHVsZURlbGVnYXRlcy5wdXQobW9kdWxlLCBtb2R1bGVEZWxlZ2F0ZSk7Ci0JCQkJCXByb2plY3RNb2R1bGVzLmFkZChtb2R1bGUpOwotCQkJCX0KLQkJCQkvLyBDaGVjayB0byBhZGQgYW55IGJpbmFyeSBtb2R1bGVzCi0JCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkVOVEVSUFJJU0VfQVBQTElDQVRJT04uZXF1YWxzKHR5cGUpKQotCQkJCQlwcm9qZWN0TW9kdWxlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjcmVhdGVCaW5hcnlNb2R1bGVzKGNvbXBvbmVudCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkud3JpdGUoZSk7Ci0JCX0KLQkJcmV0dXJuIChJTW9kdWxlW10pIHByb2plY3RNb2R1bGVzLnRvQXJyYXkobmV3IElNb2R1bGVbcHJvamVjdE1vZHVsZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2R1bGVbXSBjcmVhdGVCaW5hcnlNb2R1bGVzKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlMaXN0IHByb2plY3RNb2R1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IG1vZHVsZUNvbXBvbmVudCA9IHJlZmVyZW5jZXNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJLy8gSXMgcmVmZXJlbmNlZCBjb21wb25lbnQgYSBKMkVFIGJpbmFyeSBtb2R1bGUgYXJjaGl2ZSBvciBiaW5hcnkKLQkJCS8vIHV0aWxpdHkgcHJvamVjdD8KLQkJCWlmIChtb2R1bGVDb21wb25lbnQuaXNCaW5hcnkoKSkgewotCi0JCQkJSmF2YUVFUXVpY2tQZWVrIHFwID0gSmF2YUVFQmluYXJ5Q29tcG9uZW50SGVscGVyLmdldEphdmFFRVF1aWNrUGVlayhtb2R1bGVDb21wb25lbnQpOwotCQkJCS8vIElmIGl0IGlzIG5vdCBhIGoyZWUgbW9kdWxlIGFuZCB0aGUgY29tcG9uZW50IHByb2plY3QgaXMgdGhlCi0JCQkJLy8gZWFyLCBpdCBpcyBqdXN0IGFuIGFyY2hpdmUKLQkJCQkvLyBhbmQgd2UgY2FuIGlnbm9yZSBhcyBpdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgRUFSCi0JCQkJLy8gZGVwbG95YWJsZS5tZW1iZXJzKCkgbWV0aG9kCi0JCQkJaWYgKHFwLmdldFR5cGUoKSA9PSBKYXZhRUVRdWlja1BlZWsuVU5LTk9XTikgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgbW9kdWxlVHlwZSA9IG51bGw7Ci0JCQkJU3RyaW5nIG1vZHVsZVZlcnNpb24gPSBudWxsOwotCi0JCQkJc3dpdGNoIChxcC5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9DTElFTlRfVFlQRToKLQkJCQkJbW9kdWxlVHlwZSA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLkFQUExJQ0FUSU9OX0NMSUVOVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuV0VCX1RZUEU6Ci0JCQkJCW1vZHVsZVR5cGUgPSBKYXZhRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5FSkJfVFlQRToKLQkJCQkJbW9kdWxlVHlwZSA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuRUpCOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5DT05ORUNUT1JfVFlQRToKLQkJCQkJbW9kdWxlVHlwZSA9IEphdmFFRVByb2plY3RVdGlsaXRpZXMuSkNBOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9UWVBFOgotCQkJCQltb2R1bGVUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5FTlRFUlBSSVNFX0FQUExJQ0FUSU9OOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQltb2R1bGVUeXBlID0gSmF2YUVFUHJvamVjdFV0aWxpdGllcy5VVElMSVRZOwotCQkJCQltb2R1bGVWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzBfVEVYVDsKLQkJCQl9Ci0KLQkJCQlpbnQgdmVyc2lvbiA9IHFwLmdldFZlcnNpb24oKTsKLQkJCQltb2R1bGVWZXJzaW9uID0gSjJFRVZlcnNpb25VdGlsLmNvbnZlcnRWZXJzaW9uSW50VG9TdHJpbmcodmVyc2lvbik7Ci0KLQkJCQlJTW9kdWxlIG5lc3RlZE1vZHVsZSA9IGNyZWF0ZU1vZHVsZShtb2R1bGVDb21wb25lbnQuZ2V0RGVwbG95ZWROYW1lKCksIG1vZHVsZUNvbXBvbmVudC5nZXREZXBsb3llZE5hbWUoKSwgbW9kdWxlVHlwZSwgbW9kdWxlVmVyc2lvbiwgbW9kdWxlQ29tcG9uZW50LmdldFByb2plY3QoKSk7Ci0JCQkJaWYgKG5lc3RlZE1vZHVsZSAhPSBudWxsKSB7Ci0JCQkJCUoyRUVGbGV4UHJvakRlcGxveWFibGUgbW9kdWxlRGVsZWdhdGUgPSBuZXcgSjJFRUZsZXhQcm9qRGVwbG95YWJsZShtb2R1bGVDb21wb25lbnQuZ2V0UHJvamVjdCgpLCBtb2R1bGVDb21wb25lbnQpOwotCQkJCQltb2R1bGVEZWxlZ2F0ZXMucHV0KG5lc3RlZE1vZHVsZSwgbW9kdWxlRGVsZWdhdGUpOwotCQkJCQlwcm9qZWN0TW9kdWxlcy5hZGQobmVzdGVkTW9kdWxlKTsKLQkJCQkJbW9kdWxlRGVsZWdhdGUuZ2V0VVJJKG5lc3RlZE1vZHVsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChJTW9kdWxlW10pIHByb2plY3RNb2R1bGVzLnRvQXJyYXkobmV3IElNb2R1bGVbcHJvamVjdE1vZHVsZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiByZXNvdXJjZXMgdGhhdCB0aGUgbW9kdWxlIHNob3VsZCBsaXN0ZW4gdG8gZm9yIHN0YXRlCi0JICogY2hhbmdlcy4gVGhlIHBhdGhzIHNob3VsZCBiZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGhzLiBTdWJjbGFzc2VzIGNhbgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIHBhdGhzLgotCSAqIAotCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBwYXRocwotCSAqLwotCXByb3RlY3RlZCBJUGF0aFtdIGdldExpc3RlbmVyUGF0aHMoKSB7Ci0JCXJldHVybiBuZXcgSVBhdGhbXSB7IG5ldyBQYXRoKCIucHJvamVjdCIpLCAvLyBuYXR1cmUKLQkJCQluZXcgUGF0aChTdHJ1Y3R1cmVFZGl0Lk1PRFVMRV9NRVRBX0ZJTEVfTkFNRSksIC8vIGNvbXBvbmVudAotCQkJCW5ldyBQYXRoKCIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sIikgLy8gZmFjZXRzCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNsZWFyQ2FjaGUoSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlci5jbGVhckNhY2hlKHByb2plY3QpOwotCQlMaXN0PElNb2R1bGU+IG1vZHVsZXNUb1JlbW92ZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3I8SU1vZHVsZT4gaXRlcmF0b3IgPSBtb2R1bGVEZWxlZ2F0ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSU1vZHVsZSBtb2R1bGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobW9kdWxlLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpIHsKLQkJCQlpZiAobW9kdWxlc1RvUmVtb3ZlID09IG51bGwpIHsKLQkJCQkJbW9kdWxlc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwotCQkJCX0KLQkJCQltb2R1bGVzVG9SZW1vdmUuYWRkKG1vZHVsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1vZHVsZXNUb1JlbW92ZSAhPSBudWxsKSB7Ci0JCQlmb3IgKElNb2R1bGUgbW9kdWxlIDogbW9kdWxlc1RvUmVtb3ZlKSB7Ci0JCQkJbW9kdWxlRGVsZWdhdGVzLnJlbW92ZShtb2R1bGUpOwotCQkJfQotCQl9Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2plZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KRUVGbGV4UHJvakRlcGxveWFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qZWUvaW50ZXJuYWwvZGVwbG95YWJsZXMvSkVFRmxleFByb2pEZXBsb3lhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Nzc5MDYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2plZS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9KRUVGbGV4UHJvakRlcGxveWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS5KMkVFTW9kdWxlVmlydHVhbEFyY2hpdmVDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5FamJNb2R1bGVFeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSUVKQk1vZGVsRXh0ZW5kZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRlcGxveWFibGVzLkoyRUVGbGV4UHJvakRlcGxveWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JRUFSTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5FbnRlcnByaXNlQmVhbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuU2Vzc2lvbkJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotCi0vKioKLSAqIEpFRSBtb2R1bGUgc3VwZXJjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIEpFRUZsZXhQcm9qRGVwbG95YWJsZSBleHRlbmRzIEoyRUVGbGV4UHJvakRlcGxveWFibGUgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEpFRUZsZXhQcm9qRGVwbG95YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEBwYXJhbSBhQ29tcG9uZW50Ci0JICovCi0JcHVibGljIEpFRUZsZXhQcm9qRGVwbG95YWJsZShJUHJvamVjdCBwcm9qZWN0LCBJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50KSB7Ci0JCXN1cGVyKHByb2plY3QsIGFDb21wb25lbnQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBKRUVGbGV4UHJvakRlcGxveWFibGUuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKi8KLQlwdWJsaWMgSkVFRmxleFByb2pEZXBsb3lhYmxlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIocHJvamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkSW5jbHVkZVV0aWxpdHlDb21wb25lbnQoSVZpcnR1YWxDb21wb25lbnQgdmlydHVhbENvbXAsSVZpcnR1YWxSZWZlcmVuY2VbXSByZWZlcmVuY2VzLCBJRUFSTW9kZWxQcm92aWRlciBtb2RlbCkgewotCQkvLyBJZiB0aGUgY29tcG9uZW50IG1vZHVsZSBpcyBhbiBFQVIgd2Uga25vdyBhbGwgYXJjaGl2ZXMgYXJlIGZpbHRlcmVkIG91dCBvZiB2aXJ0dWFsIGNvbXBvbmVudCBtZW1iZXJzCi0JCS8vIGFuZCB3ZSB3aWxsIHJldHVybiBvbmx5IHRob3NlIGFyY2hpdmVzIHdoaWNoIGFyZSBub3QgYmluYXJ5IEoyRUUgbW9kdWxlcyBpbiB0aGUgRUFSIERELiAgVGhlc2UgSjJFRSBtb2R1bGVzIHdpbGwKLQkJLy8gYmUgcmV0dXJuZWQgYnkgZ2V0Q2hpbGRNb2R1bGVzKCkKLQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRUFSUHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkKLQkJCXJldHVybiB2aXJ0dWFsQ29tcCAhPSBudWxsICYmIHZpcnR1YWxDb21wLmlzQmluYXJ5KCkgJiYgIWlzTmVzdGVkSjJFRU1vZHVsZSh2aXJ0dWFsQ29tcCwgcmVmZXJlbmNlcywgbW9kZWwpOwotCQllbHNlIAotCQkJcmV0dXJuIHN1cGVyLnNob3VsZEluY2x1ZGVVdGlsaXR5Q29tcG9uZW50KHZpcnR1YWxDb21wLCByZWZlcmVuY2VzLCBudWxsKTsKLQl9Ci0JICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWUoU3RyaW5nIGVqYk5hbWUsIFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7Ci0gICAgCWlmICghSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFSkJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpKQotICAgIAkJcmV0dXJuIG51bGw7Ci0KLQkJRWpiTW9kdWxlRXh0ZW5zaW9uSGVscGVyIG1vZEhlbHBlciA9IG51bGw7Ci0JCUVKQkphciBqYXIgPSBudWxsOwotCQkKLQkJSU1vZGVsUHJvdmlkZXIgbW9kZWwgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJamFyID0gKEVKQkphcikgbW9kZWwuZ2V0TW9kZWxPYmplY3QoKTsKLQkJCVNlc3Npb25CZWFuIGJlYW4gPSBnZXRTZXNzaW9uQmVhbk5hbWVkKGphciwgZWpiTmFtZSk7Ci0JCQltb2RIZWxwZXIgPSBJRUpCTW9kZWxFeHRlbmRlck1hbmFnZXIuSU5TVEFOQ0UuZ2V0RUpCTW9kdWxlRXh0ZW5zaW9uKG51bGwpOwotCQkJcmV0dXJuIG1vZEhlbHBlciA9PSBudWxsID8gbnVsbCA6IG1vZEhlbHBlci5nZXRKYXZhRUVKTkRJTmFtZShqYXIsIGJlYW4sIGludGVyZmFjZU5hbWUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0gICAgLyoqCi0gICAgICogUmV0dXJuIExpc3Qgb2YgU2Vzc2lvbiBiZWFucyBpbiB0aGlzIGphci4KLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0Ci0gICAgICovCi0gICAgcHVibGljIFNlc3Npb25CZWFuIGdldFNlc3Npb25CZWFuTmFtZWQoRUpCSmFyIGphciwgU3RyaW5nIGJlYW5OYW1lKSB7Ci0gICAgCQotICAgIAlFbnRlcnByaXNlQmVhbnMgYWxsQmVhbnMgPSBqYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0gICAgCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhbGxCZWFucy5nZXRTZXNzaW9uQmVhbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlTZXNzaW9uQmVhbiBiZWFuID0gKFNlc3Npb25CZWFuKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgCQlpZiAoYmVhbi5nZXRFamJOYW1lKCkuZXF1YWxzKGJlYW5OYW1lKSkKLSAgICAJCQlyZXR1cm4gYmVhbjsKLSAgICAJfQotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAKLSAgICAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRDb250YWluZWRVUkkoSU1vZHVsZSBtb2R1bGUpIHsKLSAgICAJaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIEoyRUVNb2R1bGVWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCB8fCBpc0JpbmFyeU1vZHVsZUFyY2hpdmUobW9kdWxlKSkKLSAgICAJCXJldHVybiBuZXcgUGF0aChtb2R1bGUuZ2V0TmFtZSgpKS5sYXN0U2VnbWVudCgpOwotICAgIAkKLSAgICAJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KG1vZHVsZS5nZXRQcm9qZWN0KCkpOwotICAgIAlTdHJpbmcgYVVSSSA9IG51bGw7Ci0gICAgCWlmIChjb21wIT1udWxsICYmIGNvbXBvbmVudCE9bnVsbCAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VBUlByb2plY3QoY29tcG9uZW50LmdldFByb2plY3QoKSkpIHsKLQkJCS8vVE9ETyB3aGVuIG5ldyBKRUUgbW9kZWwgYXBpIGlzIGF2YWlsYWJsZSBsb29rIGF0IHRoaXMgY29kZSBhZ2FpbgotICAgIAkJLy8gc2VlIGJ1ZyAxODMzMjAKLSAgICAJCUlWaXJ0dWFsUmVmZXJlbmNlIFtdIHJlZnMgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNlcygpOwotICAgIAkJZm9yKGludCBpPTA7IGk8cmVmcy5sZW5ndGg7IGkrKyl7Ci0gICAgCQkJaWYocmVmc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50KCkuZXF1YWxzKGNvbXApKXsKLSAgICAJCQkJYVVSSSA9IHJlZnNbaV0uZ2V0QXJjaGl2ZU5hbWUoKTsKLSAgICAJCQkJYnJlYWs7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAkJRUFSQXJ0aWZhY3RFZGl0IGVhckVkaXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQllYXJFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQkJCQlpZiAoZWFyRWRpdCAhPSBudWxsKQotCQkJCQlhVVJJID0gZWFyRWRpdC5nZXRNb2R1bGVVUkkoY29tcCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChlYXJFZGl0ICE9IG51bGwpCi0JCQkJCWVhckVkaXQuZGlzcG9zZSgpOwotCQkJfQotICAgIAl9Ci0gICAgCWlmIChhVVJJICE9bnVsbCAmJiBhVVJJLmxlbmd0aCgpPjEgJiYgYVVSSS5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLSAgICAJCWFVUkkgPSBhVVJJLnN1YnN0cmluZygxKTsKLSAgICAJcmV0dXJuIGFVUkk7Ci0JfSAKLSAgICAKLSAgICBwcm90ZWN0ZWQgSU1vZHVsZSBnYXRoZXJNb2R1bGVSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJVmlydHVhbENvbXBvbmVudCB0YXJnZXRDb21wb25lbnQgKSB7Ci0gICAgCUlNb2R1bGUgbW9kdWxlID0gc3VwZXIuZ2F0aGVyTW9kdWxlUmVmZXJlbmNlKGNvbXBvbmVudCwgdGFyZ2V0Q29tcG9uZW50KTsKLSAgICAJLy8gSGFuZGxlIGJpbmFyeSBtb2R1bGUgY29tcG9uZW50cwotICAgIAlpZiAodGFyZ2V0Q29tcG9uZW50IGluc3RhbmNlb2YgSjJFRU1vZHVsZVZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KSB7Ci0gICAgCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNFQVJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpIHx8IHRhcmdldENvbXBvbmVudC5nZXRQcm9qZWN0KCkhPWNvbXBvbmVudC5nZXRQcm9qZWN0KCkpCi0gICAgCQkJbW9kdWxlID0gU2VydmVyVXRpbC5nZXRNb2R1bGUoSkVFRGVwbG95YWJsZUZhY3RvcnkuSUQrIjoiK3RhcmdldENvbXBvbmVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgCX0KLQkJcmV0dXJuIG1vZHVsZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBjb21wb25lbnQgaXMgbmVzdGVkIEoyRUUgbW9kdWxlIG9uIHRoZSBhcHBsaWNhdGlvbi54bWwgb2YgdGhpcyBFQVIKLSAgICAgKiBAcGFyYW0gYUNvbXBvbmVudAotICAgICAqIEByZXR1cm4gYm9vbGVhbiBpcyBwYXNzZWQgaW4gY29tcG9uZW50IGEgbmVzdGVkIEoyRUUgbW9kdWxlIG9uIHRoaXMgRUFSCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTmVzdGVkSjJFRU1vZHVsZShJVmlydHVhbENvbXBvbmVudCBhQ29tcG9uZW50LCBJVmlydHVhbFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMsIElFQVJNb2RlbFByb3ZpZGVyIG1vZGVsKSB7Ci0gICAgCWlmIChtb2RlbD09bnVsbCkgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUFwcGxpY2F0aW9uIGFwcCA9IChBcHBsaWNhdGlvbiltb2RlbC5nZXRNb2RlbE9iamVjdCgpOwotCQlJVmlydHVhbFJlZmVyZW5jZSByZWZlcmVuY2UgPSBnZXRSZWZlcmVuY2VOYW1lZChyZWZlcmVuY2VzLGFDb21wb25lbnQuZ2V0TmFtZSgpKTsKLQkJLy8gRW5zdXJlIG1vZHVsZSBVUkkgZXhpc3RzIG9uIEVBUiBERCBmb3IgYmluYXJ5IGFyY2hpdmUKLQkJcmV0dXJuIGFwcC5nZXRGaXJzdE1vZHVsZShyZWZlcmVuY2UuZ2V0QXJjaGl2ZU5hbWUoKSkgIT0gbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9FYXJGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQxN2MxLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9lYXJwcm9qZWN0L29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9FYXJGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuV3RwVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lYXJjcmVhdGlvbi5JRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRWFyRmFjZXRJbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgZmluYWwgT2JqZWN0IGNmZywgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCUlEYXRhTW9kZWwgbW9kZWwgPSAoSURhdGFNb2RlbCkgY2ZnOwotCi0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl9Ci0JCQkvLyBBZGQgV1RQIG5hdHVyZXMuCi0KLQkJCVd0cFV0aWxzLmFkZE5hdHVyZXN0b0VBUihwcm9qZWN0KTsKLQotCQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgYyA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QsIGZhbHNlKTsKLQkJCWMuY3JlYXRlKDAsIG51bGwpOwotCi0JCQlmaW5hbCBJVmlydHVhbEZvbGRlciBlYXJyb290ID0gYy5nZXRSb290Rm9sZGVyKCk7Ci0JCQllYXJyb290LmNyZWF0ZUxpbmsobmV3IFBhdGgoIi8iICsgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVOVF9ESVIpKSwgMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJdHJ5IHsKLQkJCQkoKElEYXRhTW9kZWxPcGVyYXRpb24pIG1vZGVsLmdldFByb3BlcnR5KEZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuTk9USUZJQ0FUSU9OX09QRVJBVElPTikpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCWlmKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuR0VORVJBVEVfREQpKXsKLQkJCQkvLyBDcmVhdGUgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciAod2ViLnhtbCkgaWYgb25lIGRvZXNuJ3QgZXhpc3QKLQkJCQlJRmlsZSBhcHBYbWxGaWxlID0gZWFycm9vdC5nZXRVbmRlcmx5aW5nRm9sZGVyKCkuZ2V0RmlsZShuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSkpOwotCQkJCWlmICghYXBwWG1sRmlsZS5leGlzdHMoKSkgewotCQkJCQl0cnkgewotCQkJCQkJaWYoIWFwcFhtbEZpbGUuZ2V0UGFyZW50KCkuZXhpc3RzKCkKLQkJCQkJCQkJJiYgKGFwcFhtbEZpbGUuZ2V0UGFyZW50KCkuZ2V0VHlwZSgpID09ICBJUmVzb3VyY2UuRk9MREVSKSl7Ci0JCQkJCQkJKChJRm9sZGVyKWFwcFhtbEZpbGUuZ2V0UGFyZW50KCkpLmNyZWF0ZSh0cnVlLCB0cnVlLCBtb25pdG9yKTsKLQkJCQkJCX0KLQkJCQkJCWZpbmFsIFN0cmluZyBhcHBYbWxDb250ZW50cyA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbjxhcHBsaWNhdGlvbiBpZD1cIkFwcGxpY2F0aW9uX0lEXCIgdmVyc2lvbj1cIjVcIiB4bWxucz1cImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZVwiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeHNpOnNjaGVtYUxvY2F0aW9uPVwiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9hcHBsaWNhdGlvbl81LnhzZFwiPlxuIDxkaXNwbGF5LW5hbWU+IiArIHByb2plY3QuZ2V0TmFtZSgpICsgICI8L2Rpc3BsYXktbmFtZT4gXG4gPC9hcHBsaWNhdGlvbj4gIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYXBwWG1sRmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGFwcFhtbENvbnRlbnRzLmdldEJ5dGVzKCJVVEYtOCIpKSwgdHJ1ZSwgbW9uaXRvcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCWZpbmFsbHkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvZWFycHJvamVjdC9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvRWFyRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkOGFkMGUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2VhcnByb2plY3Qvb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0VhckZhY2V0UG9zdEluc3RhbGxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQWRkQ29tcG9uZW50VG9FbnRlcnByaXNlQXBwbGljYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lYXJjcmVhdGlvbi5JRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSmF2YVByb2plY3RNaWdyYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRWFyRmFjZXRQb3N0SW5zdGFsbERlbGVnYXRlIGltcGxlbWVudHMgSURlbGVnYXRlIHsKLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIGZpbmFsIE9iamVjdCBjZmcsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXRyeSB7Ci0JCQlJRGF0YU1vZGVsIG1vZGVsID0gKElEYXRhTW9kZWwpIGNmZzsKLQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCi0JCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0KLQkJCVNldCBkZXBlbmRlbnRQcm9qZWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlkZXBlbmRlbnRQcm9qZWN0cy5hZGRBbGwoKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElFYXJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkoyRUVfUFJPSkVDVFNfTElTVCkpOwotCQkJZGVwZW5kZW50UHJvamVjdHMuYWRkQWxsKChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRWFyRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BST0pFQ1RfTElTVCkpOwotCQkJaWYgKCFkZXBlbmRlbnRQcm9qZWN0cy5pc0VtcHR5KCkpIHsKLQkJCQlMaXN0IGRlcGVuZGVudENvbXBvbmVudHMgPSBuZXcgQXJyYXlMaXN0KGRlcGVuZGVudFByb2plY3RzLnNpemUoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlcGVuZGVudFByb2plY3RzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJSVByb2plY3QgZGVwUHJvamVjdCA9IChJUHJvamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlJVmlydHVhbENvbXBvbmVudCBkZXBDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZGVwUHJvamVjdCk7Ci0JCQkJCWlmIChkZXBDb21wID09IG51bGwpIHsKLQkJCQkJCUphdmFQcm9qZWN0TWlncmF0aW9uT3BlcmF0aW9uIHV0aWxPcCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmNyZWF0ZUZsZXhKYXZhUHJvamVjdEZvclByb2plY3RPcGVyYXRpb24oZGVwUHJvamVjdCk7Ci0JCQkJCQl1dGlsT3AuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCQkJCWRlcENvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChkZXBQcm9qZWN0KTsKLQkJCQkJfQotCi0JCQkJCWRlcGVuZGVudENvbXBvbmVudHMuYWRkKGRlcENvbXApOwotCQkJCX0KLQotCQkJCWZpbmFsIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFkZENvbXBvbmVudFRvRW50ZXJwcmlzZUFwcGxpY2F0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBjKTsKLQkJCQlMaXN0IG1vZExpc3QgPSAoTGlzdCkgZGF0YU1vZGVsLmdldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QpOwotCQkJCW1vZExpc3QuYWRkQWxsKGRlcGVuZGVudENvbXBvbmVudHMpOwotCQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNULCBtb2RMaXN0KTsKLQkJCQl0cnkgewotCQkJCQlkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL2NvbnRlbnR0eXBlL0pFRUNvbnRlbnREZXNjcmliZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL2NvbnRlbnR0eXBlL0pFRUNvbnRlbnREZXNjcmliZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1ZmMwNS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9jb250ZW50dHlwZS9KRUVDb250ZW50RGVzY3JpYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwotCi0vKioKLSAqIEEgY29udGVudCBkZXNjcmliZXIgZm9yIGRldGVjdGluZyBhIGoyZWUgbW9kdWxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKRUVDb250ZW50RGVzY3JpYmVyIGltcGxlbWVudHMgSUNvbnRlbnREZXNjcmliZXIgewotCXB1YmxpYyBKRUVDb250ZW50RGVzY3JpYmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBKRUVWRVJTSU9OID0gbmV3IFF1YWxpZmllZE5hbWUoImplZS12ZXJzaW9uIiwgIjUuMCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCUphdmFFRVF1aWNrUGVlayBxdWlja1BlZWsgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKGNvbnRlbnRzKTsKLQkJc3dpdGNoIChxdWlja1BlZWsuZ2V0VHlwZSgpKSB7Ci0JCWNhc2UgSmF2YUVFUXVpY2tQZWVrLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFOgotCQljYXNlIEphdmFFRVF1aWNrUGVlay5BUFBMSUNBVElPTl9UWVBFOgotCQkJc3dpdGNoIChxdWlja1BlZWsuZ2V0VmVyc2lvbigpKSB7Ci0JCQljYXNlIEphdmFFRVF1aWNrUGVlay5KRUVfNV8wX0lEOgotCQkJCXJldHVybiBWQUxJRDsKLQkJCX0KLQkJCXJldHVybiBJTlZBTElEOwotCQljYXNlIEphdmFFRVF1aWNrUGVlay5FSkJfVFlQRToKLQkJCXN3aXRjaCAocXVpY2tQZWVrLmdldFZlcnNpb24oKSkgewotCQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuRUpCXzNfMF9JRDoKLQkJCQlyZXR1cm4gVkFMSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gSU5WQUxJRDsKLQkJY2FzZSBKYXZhRUVRdWlja1BlZWsuV0VCX1RZUEU6Ci0JCQlzd2l0Y2ggKHF1aWNrUGVlay5nZXRWZXJzaW9uKCkpIHsKLQkJCWNhc2UgSmF2YUVFUXVpY2tQZWVrLldFQl8yXzVfSUQ6Ci0JCQkJcmV0dXJuIFZBTElEOwotCQkJfQotCQkJcmV0dXJuIElOVkFMSUQ7Ci0JCX0KLQotCQlyZXR1cm4gSU5WQUxJRDsKLQl9Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZVtdIGdldFN1cHBvcnRlZE9wdGlvbnMoKSB7Ci0KLQkJcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lW10geyBKRUVWRVJTSU9OIH07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9BcHBDbGllbnQ1TW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvQXBwQ2xpZW50NU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQyNTBjMy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9BcHBDbGllbnQ1TW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudERlcGxveW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuQXBwbGljYXRpb25jbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuSUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50NU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBKRUU1TW9kZWxQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUENMSUVOVDVfQ09OVEVOVF9UWVBFID0gIm9yZy5lY2xpcHNlLmpzdC5qZWUuZWU1YXBwY2xpZW50REQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIEFwcENsaWVudDVNb2RlbFByb3ZpZGVyKElQcm9qZWN0IHByb2opIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcm9qID0gcHJvajsKLQkJc2V0RGVmYXVsdFJlc291cmNlUGF0aChuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfRERfVVJJKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXIjZ2V0TW9kZWxPYmplY3Qob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoSVBhdGggbW9kZWxQYXRoKSB7Ci0JCUlBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIGFwcFJlcyA9IChJQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSlnZXRNb2RlbFJlc291cmNlKG1vZGVsUGF0aCk7Ci0JCWlmIChhcHBSZXMgIT0gbnVsbCAmJiBhcHBSZXMuZ2V0Um9vdE9iamVjdCgpICE9IG51bGwpIAotCQkJcmV0dXJuIGFwcFJlcy5nZXRBcHBsaWNhdGlvbkNsaWVudCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZURlc2NyaWJlcigpIHsKLQkJcmV0dXJuIEFQUENMSUVOVDVfQ09OVEVOVF9UWVBFOwotCX0KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZVJvb3QoWE1MUmVzb3VyY2VJbXBsIHJlcywgU3RyaW5nIG5hbWUpIHsKLQkJQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvciBkZCA9IEFwcGxpY2F0aW9uY2xpZW50RmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXBwbGljYXRpb25DbGllbnREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQlkZC5nZXRYTUxOU1ByZWZpeE1hcCgpLnB1dCgiIiwgSjJFRUNvbnN0YW50cy5KQVZBRUVfTlNfVVJMKTsgIC8vJE5PTi1OTFMtMSQKLQkJZGQuZ2V0WE1MTlNQcmVmaXhNYXAoKS5wdXQoInhzaSIsIEoyRUVDb25zdGFudHMuWFNJX05TX1VSTCk7IC8vJE5PTi1OTFMtMSQKLQkJZGQuZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5wdXQoSjJFRUNvbnN0YW50cy5KQVZBRUVfTlNfVVJMLCBKMkVFQ29uc3RhbnRzLkFQUF9DTElFTlRfU0NIRU1BX0xPQ181KTsKLQkJQXBwbGljYXRpb25DbGllbnQgY2xpZW50ID0gQXBwbGljYXRpb25jbGllbnRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpOwotCQlEaXNwbGF5TmFtZSBkbiA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0JCWRuLnNldFZhbHVlKG5hbWUpOwotCQljbGllbnQuZ2V0RGlzcGxheU5hbWVzKCkuYWRkKGRuKTsKLQkJZGQuc2V0QXBwbGljYXRpb25DbGllbnQoY2xpZW50KTsKLQkJY2xpZW50LnNldFZlcnNpb24oSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81X1RFWFQpOwotCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQoKEVPYmplY3QpIGRkKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvQXBwQ2xpZW50NU1vZGVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9BcHBDbGllbnQ1TW9kZWxQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1NzU4Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9BcHBDbGllbnQ1TW9kZWxQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLm1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnQ1TW9kZWxQcm92aWRlckZhY3RvcnkgaW1wbGVtZW50cyBJTW9kZWxQcm92aWRlckZhY3RvcnkgewotCi0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgQXBwQ2xpZW50NU1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0JfQotCi0JcHVibGljIElNb2RlbFByb3ZpZGVyIGNyZWF0ZShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIG5ldyBBcHBDbGllbnQ1TW9kZWxQcm92aWRlcihjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL0VBUjVNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9FQVI1TW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWNkNDg5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL0VBUjVNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5XZWJNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklFQVJNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uSUFwcGxpY2F0aW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5KYXZhZWVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIEVBUjVNb2RlbFByb3ZpZGVyIGV4dGVuZHMgSkVFNU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJRUFSTW9kZWxQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUjVfQ09OVEVOVF9UWVBFID0gIm9yZy5lY2xpcHNlLmpzdC5qZWUuZWU1ZWFyREQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIEVBUjVNb2RlbFByb3ZpZGVyKElQcm9qZWN0IHByb2opIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcm9qID0gcHJvajsKLQkJc2V0RGVmYXVsdFJlc291cmNlUGF0aChuZXcgUGF0aChKMkVFQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0REX1VSSSkpOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlRGVzY3JpYmVyKCkgewotCQlyZXR1cm4gRUFSNV9DT05URU5UX1RZUEU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXIjZ2V0TW9kZWxPYmplY3Qob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoSVBhdGggbW9kZWxQYXRoKSB7Ci0JCUlBcHBsaWNhdGlvblJlc291cmNlIGVhclJlcyA9IChJQXBwbGljYXRpb25SZXNvdXJjZSlnZXRNb2RlbFJlc291cmNlKG1vZGVsUGF0aCk7Ci0JCWlmIChlYXJSZXMgIT0gbnVsbCAmJiBlYXJSZXMuZ2V0Um9vdE9iamVjdCgpICE9IG51bGwpIAotCQkJcmV0dXJuIGVhclJlcy5nZXRBcHBsaWNhdGlvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1vZHVsZVVSSShJVmlydHVhbENvbXBvbmVudCBtb2R1bGVDb21wKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qKTsKLQkJSVZpcnR1YWxSZWZlcmVuY2UgW10gcmVmcyA9IGNvbXAuZ2V0UmVmZXJlbmNlcygpOwotCQlmb3IoaW50IGk9MDsgaTxyZWZzLmxlbmd0aDsgaSsrKXsKLQkJCWlmKHJlZnNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpLmVxdWFscyhtb2R1bGVDb21wKSl7Ci0JCQkJcmV0dXJuIHJlZnNbaV0uZ2V0QXJjaGl2ZU5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgY29udGV4dCByb290IGluIHRoaXMgYXBwbGljYXRpb24gZm9yIHRoZSBwYXNzZWQgaW4gd2ViIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHdlYlByb2plY3QKLQkgKiBAcmV0dXJuIGNvbnRleHRSb290IFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2ViQ29udGV4dFJvb3QoSVByb2plY3Qgd2ViUHJvamVjdCkgewotCQlpZiAod2ViUHJvamVjdCA9PSBudWxsIHx8ICFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHdlYlByb2plY3QpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHdlYkNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCh3ZWJQcm9qZWN0KTsKLQkJU3RyaW5nIHdlYk1vZHVsZVVSSSA9IGdldE1vZHVsZVVSSSh3ZWJDb21wKTsKLQkJaWYgKHdlYk1vZHVsZVVSSSAhPSBudWxsKSB7Ci0JCQlNb2R1bGUgd2ViTW9kdWxlID0gKE1vZHVsZSkgKChBcHBsaWNhdGlvbilnZXRNb2RlbE9iamVjdCgpKS5nZXRNb2R1bGUod2ViTW9kdWxlVVJJLCBudWxsKTsKLQkJCWlmICh3ZWJNb2R1bGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gd2ViTW9kdWxlLmdldFdlYigpLmdldENvbnRleHRSb290KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyB2b2lkIHBvcHVsYXRlUm9vdChYTUxSZXNvdXJjZUltcGwgcmVzLCBTdHJpbmcgbmFtZSkgewotCQlBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yIGRkID0gQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcHBsaWNhdGlvbkRlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0JCWRkLmdldFhNTE5TUHJlZml4TWFwKCkucHV0KCIiLCBKMkVFQ29uc3RhbnRzLkpBVkFFRV9OU19VUkwpOyAgLy8kTk9OLU5MUy0xJAotCQlkZC5nZXRYTUxOU1ByZWZpeE1hcCgpLnB1dCgieHNpIiwgSjJFRUNvbnN0YW50cy5YU0lfTlNfVVJMKTsgLy8kTk9OLU5MUy0xJAotCQlkZC5nZXRYU0lTY2hlbWFMb2NhdGlvbigpLnB1dChKMkVFQ29uc3RhbnRzLkpBVkFFRV9OU19VUkwsIEoyRUVDb25zdGFudHMuQVBQTElDQVRJT05fU0NIRU1BX0xPQ181KTsKLQkJQXBwbGljYXRpb24gZWFyID0gQXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcHBsaWNhdGlvbigpOwotCQlEaXNwbGF5TmFtZSBkbiA9IEphdmFlZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0JCWRuLnNldFZhbHVlKG5hbWUpOwotCQllYXIuZ2V0RGlzcGxheU5hbWVzKCkuYWRkKGRuKTsKLQkJZWFyLnNldFZlcnNpb24oSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl81X1RFWFQpOwotCQlkZC5zZXRBcHBsaWNhdGlvbihlYXIpOwotCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQoKEVPYmplY3QpIGRkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHNldCB0aGUgY29udGV4dCByb290IG9uIHRoZSBhcHBsaWNhdGlvbiBmb3IgdGhlIHBhc3NlZCBpbiBjb250ZXh0Um9vdC4KLQkgKiAKLQkgKiBAcGFyYW0gd2ViUHJvamVjdAotCSAqIEBwYXJhbSBhQ29udGV4dFJvb3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXZWJDb250ZXh0Um9vdChJUHJvamVjdCB3ZWJQcm9qZWN0LCBTdHJpbmcgYUNvbnRleHRSb290KSB7Ci0JCWlmICh3ZWJQcm9qZWN0ID09IG51bGwgfHwgIUoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3Qod2ViUHJvamVjdCkpCi0JCQlyZXR1cm47Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IHdlYkNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudCh3ZWJQcm9qZWN0KTsKLQkJU3RyaW5nIHdlYk1vZHVsZVVSSSA9IGdldE1vZHVsZVVSSSh3ZWJDb21wKTsKLQkJaWYgKHdlYk1vZHVsZVVSSSAhPSBudWxsKSB7Ci0JCQlXZWJNb2R1bGUgd2ViTW9kdWxlID0gKFdlYk1vZHVsZSkgKChBcHBsaWNhdGlvbilnZXRNb2RlbE9iamVjdCgpKS5nZXRNb2R1bGUod2ViTW9kdWxlVVJJLCBudWxsKTsKLQkJCWlmICh3ZWJNb2R1bGUgIT0gbnVsbCkKLQkJCQl3ZWJNb2R1bGUuc2V0Q29udGV4dFJvb3QoYUNvbnRleHRSb290KTsKLQkJCS8vIFRPRE8gLSBzaG91bGQgdGhpcyBtZXRob2Qgc2F2ZT8gIE9yIHNob3VsZCB0aGUgY2FsbGVyIGJlIHJlcXVpcmVkIHRvIHNhdmU/Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9tb2RlbC9pbnRlcm5hbC9FQVI1TW9kZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL0VBUjVNb2RlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzY0ODMwLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL0VBUjVNb2RlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUubW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIEVBUjVNb2RlbFByb3ZpZGVyRmFjdG9yeSBpbXBsZW1lbnRzIElNb2RlbFByb3ZpZGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBFQVI1TW9kZWxQcm92aWRlcihwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsUHJvdmlkZXIgY3JlYXRlKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgewotCQlyZXR1cm4gbmV3IEVBUjVNb2RlbFByb3ZpZGVyKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvSkVFNU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL21vZGVsL2ludGVybmFsL0pFRTVNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMzAwOTYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvbW9kZWwvaW50ZXJuYWwvSkVFNU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLkZsZXhpYmxlUHJvamVjdFJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUuRW50ZXJwcmlzZUFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuY29yZS5pbnRlcm5hbC51dGlsLkphdmFlZVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLkpFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5Nb2R1bGVVUklVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5XVFBSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKRUU1TW9kZWxQcm92aWRlciBpbXBsZW1lbnRzIElNb2RlbFByb3ZpZGVyLCBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciwgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciwgSU1vZGVsUHJvdmlkZXJMaXN0ZW5lcnsKLQotCXByb3RlY3RlZCBYTUxSZXNvdXJjZUltcGwgd3JpdGFibGVSZXNvdXJjZTsKLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvajsKLQlwcm90ZWN0ZWQgSVBhdGggZGVmYXVsdFJlc291cmNlUGF0aDsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvciBzdGF0ZVZhbGlkYXRvcjsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VBZGFwdGVyIHJlc291cmNlQWRhcHRlciA9IG5ldyBSZXNvdXJjZUFkYXB0ZXIoKTsKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkvL3ByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lckVuYWJsZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgTGlzdCBtb2RlbFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVAotCQkJCQkmJiBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQpIHsKLQkJCQlyZXNvdXJjZUlzTG9hZGVkQ2hhbmdlZCgoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBub3RpZmljYXRpb24uZ2V0T2xkQm9vbGVhblZhbHVlKCksIG5vdGlmaWNhdGlvbi5nZXROZXdCb29sZWFuVmFsdWUoKSk7Ci0JCQl9IGVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQobnVsbCkgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVEKQotCQkJCXJlc291cmNlQ2hhbmdlZCgoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSkVFNU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb2plY3RSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChJUHJvamVjdCBwcm9qMikgewotCQlyZXR1cm4gKFByb2plY3RSZXNvdXJjZVNldClXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2VTZXQocHJvaik7Ci0JfQotCi0JcHVibGljIFhNTFJlc291cmNlSW1wbCBnZXRXcml0YWJsZVJlc291cmNlKCkgewotCQlyZXR1cm4gd3JpdGFibGVSZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXcml0YWJsZVJlc291cmNlKFhNTFJlc291cmNlSW1wbCB3cml0YWJsZVJlc291cmNlKSB7Ci0JCXRoaXMud3JpdGFibGVSZXNvdXJjZSA9IHdyaXRhYmxlUmVzb3VyY2U7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlc291cmNlQ2hhbmdlZChSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGhhc0xpc3RlbmVycygpKSB7Ci0JCQlpbnQgZXZlbnRDb2RlID0gTW9kZWxQcm92aWRlckV2ZW50LktOT1dOX1JFU09VUkNFU19DSEFOR0VEOwotCQkJTW9kZWxQcm92aWRlckV2ZW50IGV2dCA9IG5ldyBNb2RlbFByb3ZpZGVyRXZlbnQoZXZlbnRDb2RlLCB0aGlzLCBwcm9qKTsKLQkJCWV2dC5hZGRSZXNvdXJjZShhUmVzb3VyY2UpOwotCQkJbm90aWZ5TGlzdGVuZXJzKGV2dCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQoUmVzb3VyY2UgYVJlc291cmNlLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWlmIChoYXNMaXN0ZW5lcnMoKSkgewotCQkJaW50IGV2ZW50Q29kZSA9IG5ld1ZhbHVlID8gTW9kZWxQcm92aWRlckV2ZW50LkxPQURFRF9SRVNPVVJDRSA6IE1vZGVsUHJvdmlkZXJFdmVudC5VTkxPQURFRF9SRVNPVVJDRTsKLQkJCU1vZGVsUHJvdmlkZXJFdmVudCBldnQgPSBuZXcgTW9kZWxQcm92aWRlckV2ZW50KGV2ZW50Q29kZSwgdGhpcywgcHJvaik7Ci0JCQlldnQuYWRkUmVzb3VyY2UoYVJlc291cmNlKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhldnQpOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBhZGRNYW5hZ2VkUmVzb3VyY2UoWE1MUmVzb3VyY2VJbXBsIHJlcykgewotCQltb2RlbFJlc291cmNlcy5hZGQocmVzKTsKLQkJaWYgKCFyZXMuZUFkYXB0ZXJzKCkuY29udGFpbnMocmVzb3VyY2VBZGFwdGVyKSkKLQkJCXJlcy5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VBZGFwdGVyKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgbGlzdGVuZXJzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gIWxpc3RlbmVycy5pc0VtcHR5KCk7Ci0JfQotCQotCXByaXZhdGUgVVJJIGdldE1vZHVsZVVSSShVUkkgdXJpKSB7Ci0JCVVSSSBtb2R1bGV1cmkgPSBNb2R1bGVVUklVdGlsLmZ1bGx5UXVhbGlmeVVSSShwcm9qLGdldENvbnRlbnRUeXBlRGVzY3JpYmVyKCkpOwotCQlJUGF0aCByZXF1ZXN0UGF0aCA9IG5ldyBQYXRoKG1vZHVsZXVyaS5wYXRoKCkpLmFwcGVuZChuZXcgUGF0aCh1cmkucGF0aCgpKSk7Ci0JCVVSSSByZXNvdXJjZVVSSSA9IFVSSS5jcmVhdGVVUkkoUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLk1PRFVMRV9QUk9UT0NPTCArIHJlcXVlc3RQYXRoLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gcmVzb3VyY2VVUkk7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTFJlc291cmNlSW1wbCBnZXRNb2RlbFJlc291cmNlKElQYXRoIG1vZGVsUGF0aCkgewotCQlpZiAod3JpdGFibGVSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlhZGRNYW5hZ2VkUmVzb3VyY2Uod3JpdGFibGVSZXNvdXJjZSk7Ci0JCQlyZXR1cm4gd3JpdGFibGVSZXNvdXJjZTsKLQkJfQotCQlpZiAoKG1vZGVsUGF0aCA9PSBudWxsKSB8fCBtb2RlbFBhdGguZXF1YWxzKElNb2RlbFByb3ZpZGVyLkZPUkNFU0FWRSkpCi0JCQltb2RlbFBhdGggPSBnZXREZWZhdWx0UmVzb3VyY2VQYXRoKCk7Ci0JCVByb2plY3RSZXNvdXJjZVNldCByZXNTZXQgPSBnZXRSZXNvdXJjZVNldChwcm9qKTsKLQkJSVZpcnR1YWxGb2xkZXIgY29udGFpbmVyID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvaikuZ2V0Um9vdEZvbGRlcigpOwotCQlTdHJpbmcgbW9kZWxQYXRoVVJJID0gbW9kZWxQYXRoLnRvU3RyaW5nKCk7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKG1vZGVsUGF0aFVSSSk7Ci0JCQotCQlJUGF0aCBwcm9qVVJJUGF0aCA9IG5ldyBQYXRoKCIiKTsvLyROT04tTkxTLTEkCi0JCXByb2pVUklQYXRoID0gcHJvalVSSVBhdGguYXBwZW5kKGNvbnRhaW5lci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQlwcm9qVVJJUGF0aCA9IHByb2pVUklQYXRoLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCXByb2pVUklQYXRoID0gcHJvalVSSVBhdGguYXBwZW5kKG1vZGVsUGF0aCk7Ci0JCVVSSSBwcm9qVVJJID0gVVJJLmNyZWF0ZVVSSShwcm9qVVJJUGF0aC50b1N0cmluZygpKTsKLQkJWE1MUmVzb3VyY2VJbXBsIHJlcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAocHJvai5nZXRGaWxlKHByb2pVUkkudG9TdHJpbmcoKSkuZXhpc3RzKCkpCi0JCQl7Ci0JCQkJcmVzID0gKFhNTFJlc291cmNlSW1wbCkgcmVzU2V0LmdldFJlc291cmNlKGdldE1vZHVsZVVSSSh1cmkpLHRydWUpOwotCQkJCWFkZE1hbmFnZWRSZXNvdXJjZShyZXMpOwotLy8JCQkJaWYgKCFyZXNvdXJjZUNoYW5nZUxpc3RlbmVyRW5hYmxlZCkKLS8vCQkJCXsKLS8vCQkJCQlyZXNvdXJjZUNoYW5nZUxpc3RlbmVyRW5hYmxlZCA9IHRydWU7Ci0vLwkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIobmV3IFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotLy8JCQkJfQotCQkJfSBlbHNlIHsvL0ZpcnN0IGZpbmQgaW4gcmVzb3VyY2Ugc2V0LCB0aGVuIGNyZWF0ZSBpZiBub3QgZm91bmQgbmV3IEVtcHR5IFJlc291cmNlLgotCQkJCVhNTFJlc291cmNlSW1wbCBuZXdSZXMgPSAgY3JlYXRlTW9kZWxSZXNvdXJjZShtb2RlbFBhdGgsIHJlc1NldCwgcHJvalVSSSk7Ci0JCQkJYWRkTWFuYWdlZFJlc291cmNlKG5ld1Jlcyk7Ci0JCQkJcmV0dXJuIG5ld1JlczsKLQkJCX0KLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQllbHNlIHRocm93IGV4OwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCi0JcHJvdGVjdGVkIFhNTFJlc291cmNlSW1wbCBjcmVhdGVNb2RlbFJlc291cmNlKElQYXRoIG1vZGVsUGF0aCwgUHJvamVjdFJlc291cmNlU2V0IHJlc291cmNlU2V0LCBVUkkgdXJpKSB7Ci0JCS8vIEZpcnN0IHRyeSB0byBmaW5kIGV4aXN0aW5nIGNhY2hlZCByZXNvdXJjZS4KLQkJWE1MUmVzb3VyY2VJbXBsIHJlcyA9IChYTUxSZXNvdXJjZUltcGwpcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoZ2V0TW9kdWxlVVJJKHVyaSksIGZhbHNlKTsKLQkJaWYgKHJlcyA9PSBudWxsIHx8ICFyZXMuaXNMb2FkZWQoKSkgewotCQkJLy8gQ3JlYXRlIHRlbXAgcmVzb3VyY2UgaWYgbm8gZmlsZSBleGlzdHMKLQkJCXJlcz0gIChYTUxSZXNvdXJjZUltcGwpKChGbGV4aWJsZVByb2plY3RSZXNvdXJjZVNldClyZXNvdXJjZVNldCkuY3JlYXRlUmVzb3VyY2UoZ2V0TW9kdWxlVVJJKHVyaSksV1RQUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeSh1cmksIGdldENvbnRlbnRUeXBlKGdldENvbnRlbnRUeXBlRGVzY3JpYmVyKCkpKSk7Ci0JCQlwb3B1bGF0ZVJvb3QocmVzLCByZXNvdXJjZVNldC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHBvcHVsYXRlUm9vdChYTUxSZXNvdXJjZUltcGwgcmVzLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHJpdmF0ZSBJQ29udGVudERlc2NyaXB0aW9uIGdldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZURlc2NyaWJlcikgewotCQkKLQkJCWlmIChjb250ZW50VHlwZURlc2NyaWJlciAhPSBudWxsKQotCQkJCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZURlc2NyaWJlcikuZ2V0RGVmYXVsdERlc2NyaXB0aW9uKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJfQotCi0JcHVibGljIElQYXRoIGdldERlZmF1bHRSZXNvdXJjZVBhdGgoKSB7Ci0JCXJldHVybiBkZWZhdWx0UmVzb3VyY2VQYXRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRSZXNvdXJjZVBhdGgoSVBhdGggZGVmYXVsdFJlc291cmNlUGF0aCkgewotCQl0aGlzLmRlZmF1bHRSZXNvdXJjZVBhdGggPSBkZWZhdWx0UmVzb3VyY2VQYXRoOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoKSB7Ci0JCXJldHVybiBnZXRNb2RlbE9iamVjdChnZXREZWZhdWx0UmVzb3VyY2VQYXRoKCkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWxPYmplY3QoSVBhdGggbW9kZWxQYXRoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgdG8gb3B0aW9uYWxseSBkZWZpbmUgYW4gYXNzb2NpYXRlZCBjb250ZW50IHR5cGUgZm9yIFhNTCBmaWxlIGNyZWF0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGVEZXNjcmliZXIoKSB7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChJUGF0aCBtb2RlbFBhdGgsIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmIChtb2RlbFBhdGggPT0gbnVsbCkKLQkJCW1vZGVsUGF0aCA9IGdldERlZmF1bHRSZXNvdXJjZVBhdGgoKTsKLQkJSVdvcmtzcGFjZSB3b3JrID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShnZXRNb2RlbFJlc291cmNlKG1vZGVsUGF0aCkpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCUlGaWxlW10gZmlsZXMgPSB7IGZpbGUgfTsKLQkJCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQkJY29udGV4dCA9IElXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUOwotCQkJcmV0dXJuIHdvcmsudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnkoUnVubmFibGUgcnVubmFibGUsIElQYXRoIG1vZGVsUGF0aCkgewotCQkvL0Fib3V0IHRvIG1vZGlmeSBhbmQgc2F2ZSB0aGlzIG1vZGVsCi0JCXRyeSB7Ci0JCQlKYXZhZWVSZXNvdXJjZUltcGwgcmVzID0gKEphdmFlZVJlc291cmNlSW1wbClnZXRNb2RlbFJlc291cmNlKG1vZGVsUGF0aCk7Ci0JCQlpZiAocmVzICE9IG51bGwpCi0JCQkJc2V0V3JpdGFibGVSZXNvdXJjZShyZXMpOwotCQkJcnVubmFibGUucnVuKCk7Ci0JCQl0cnkgewotCQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCQlpZiAobW9kZWxQYXRoICE9IG51bGwgJiYgbW9kZWxQYXRoLmVxdWFscyhJTW9kZWxQcm92aWRlci5GT1JDRVNBVkUpKQotCQkJCQkJcmVzLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQLHRydWUpOwotCQkJCQllbHNlCi0JCQkJCQlyZXMuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJc2V0V3JpdGFibGVSZXNvdXJjZShudWxsKTsKLQkJfQotCQkKLQl9Ci0KLS8vCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLS8vCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLS8vCQkJSVJlc291cmNlRGVsdGEgZGVsdGE9IGV2ZW50LmdldERlbHRhKCk7Ci0vLwkJCS8vIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIGEgZGVsdGEgKHNpbmNlIHNvbWUgZXZlbnRzIGRvbid0IGhhdmUgb25lKQotLy8JCQlpZiAoZGVsdGEgIT0gbnVsbCkKLS8vCQkJewotLy8JCQkJSVJlc291cmNlRGVsdGFbXSBhZmZlY3RlZENoaWxkcmVuPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKElSZXNvdXJjZURlbHRhLkNIQU5HRUQgfCBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEICwgSVJlc291cmNlLkZJTEUpOwotLy8JCQkJSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhID0gbnVsbDsKLS8vCQkJCUlSZXNvdXJjZSBjaGFuZ2VkUmVzb3VyY2UgPSBudWxsOyAKLS8vCQkJCUlQcm9qZWN0IGNoYW5nZWRQcm9qZWN0ID0gbnVsbDsKLS8vCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IG51bGw7Ci0vLwotLy8JCQkJZm9yIChpbnQgaT0gMDsgaSA8IGFmZmVjdGVkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLS8vCQkJCQlwcm9qZWN0RGVsdGEgPSBhZmZlY3RlZENoaWxkcmVuW2ldOwotLy8JCQkJCWNoYW5nZWRSZXNvdXJjZSA9IHByb2plY3REZWx0YS5nZXRSZXNvdXJjZSgpOyAKLS8vCQkJCQljaGFuZ2VkUHJvamVjdCA9IGNoYW5nZWRSZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0vLwkJCQkJSGFzaFNldDxJUGF0aD4gY3VycmVudFJlc291cmNlcyA9IG1vZGVsUmVzb3VyY2VzLmdldChjaGFuZ2VkUHJvamVjdCk7Ci0vLwkJCQkJLy8gb25seSBkZWFsIHdpdGggdGhlIHByb2plY3RzIHRoYXQgaGF2ZSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkIAotLy8JCQkJCWlmIChjdXJyZW50UmVzb3VyY2VzICE9IG51bGwpCi0vLwkJCQkJewotLy8JCQkJCQkvLyBpZiB0aGlzIGlzIGEgcHJvamVjdCBkZWxldGlvbiwgcmVtb3ZlIHRoZSBwcm9qZWN0IGZyb20gdGhlIEhhc2hNYXAuCi0vLwkJCQkJCWlmIChjaGFuZ2VkUmVzb3VyY2UgPT0gY2hhbmdlZFByb2plY3QgJiYgcHJvamVjdERlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKQotLy8JCQkJCQl7Ci0vLwkJCQkJCQltb2RlbFJlc291cmNlcy5yZW1vdmUoY2hhbmdlZFByb2plY3QpOwotLy8JCQkJCQkJLy8gaWYgbW9kZWxSZXNvdXJjZXMgaXMgZW1wdHksIHdlIHNob3VsZCBzZWxmLWRlc3RydWN0Ci0vLwkJCQkJCQlpZiAobW9kZWxSZXNvdXJjZXMuaXNFbXB0eSgpKQotLy8JCQkJCQkJewotLy8JCQkJCQkJCXJlc291cmNlQ2hhbmdlTGlzdGVuZXJFbmFibGVkID0gZmFsc2U7Ci0vLwkJCQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQkJZWxzZQotLy8JCQkJCQl7Ci0vLwkJCQkJCQlJdGVyYXRvcjxJUGF0aD4gaXRlciA9IGN1cnJlbnRSZXNvdXJjZXMuaXRlcmF0b3IoKTsKLS8vCQkJCQkJCUFycmF5TGlzdDxJUGF0aD4gdG9VbmxvYWQgPSBuZXcgQXJyYXlMaXN0PElQYXRoPigpOwotLy8JCQkJCQkJLy8gY2hlY2sgZWFjaCByZXNvdXJjZSB0aGF0IHdhcyBsb2FkZWQgZnJvbSB0aGUgcHJvamVjdCB0byBzZWUgaWYgaXQgaXMgcGFydCBvZiB0aGUgY2hhbmdlCi0vLwkJCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0vLwkJCQkJCQl7Ci0vLwkJCQkJCQkJcmVzb3VyY2VQYXRoID0gaXRlci5uZXh0KCk7Ci0vLwkJCQkJCQkJaWYgKHByb2plY3REZWx0YS5maW5kTWVtYmVyKHJlc291cmNlUGF0aCkgIT0gbnVsbCkKLS8vCQkJCQkJCQl7Ci0vLwkJCQkJCQkJCS8vIGxpbWl0IHRoZSBsaXN0IG9mIHJlc291cmNlcyB0aGF0IG5lZWQgdG8gYmUgdW5sb2FkZWQgdG8gdGhvc2UgdGhhdCBoYXZlIGNoYW5nZWQKLS8vCQkJCQkJCQkJdG9VbmxvYWQuYWRkKHJlc291cmNlUGF0aCk7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJfQotLy8JCQkJCQkJaWYgKHRvVW5sb2FkLnNpemUoKSA+IDApCi0vLwkJCQkJCQl7Ci0vLwkJCQkJCQkJUmVzb3VyY2UgY3VycmVudCA9IG51bGw7Ci0vLwkJCQkJCQkJUHJvamVjdFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZ2V0UmVzb3VyY2VTZXQoY2hhbmdlZFByb2plY3QpOwotLy8JCQkJCQkJCVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKTsKLS8vCQkJCQkJCQlIYXNoU2V0PFVSST4gcmVzb3VyY2VVUklzID0gbmV3IEhhc2hTZXQ8VVJJPigpOwotLy8JCQkJCQkJCWl0ZXIgPSB0b1VubG9hZC5pdGVyYXRvcigpOwotLy8JCQkJCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkKLS8vCQkJCQkJCQl7Ci0vLwkJCQkJCQkJCS8vIGNvbnZlcnQgYWxsIG9mIHRoZSByZXNvdXJjZXMgdG8gVVJJcyAtIHRoaXMgaXMgYSBmYXN0ZXIgbWF0Y2ggZHVyaW5nIHRoZSBjb21wYXJlCi0vLwkJCQkJCQkJCXJlc291cmNlVVJJcy5hZGQodXJpQ29udmVydGVyLm5vcm1hbGl6ZShVUkkuY3JlYXRlVVJJKGl0ZXIubmV4dCgpLnRvU3RyaW5nKCkpKSk7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJCUl0ZXJhdG9yPFJlc291cmNlPiBpdGVyMiA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7Ci0vLwkJCQkJCQkJd2hpbGUgKGl0ZXIyLmhhc05leHQoKSkKLS8vCQkJCQkJCQl7Ci0vLwkJCQkJCQkJCWN1cnJlbnQgPSBpdGVyMi5uZXh0KCk7Ci0vLwkJCQkJCQkJCWlmIChyZXNvdXJjZVVSSXMuY29udGFpbnMoY3VycmVudC5nZXRVUkkoKSkpCi0vLwkJCQkJCQkJCXsKLS8vCQkJCQkJCQkJCWN1cnJlbnQudW5sb2FkKCk7Ci0vLwkJCQkJCQkJCX0KLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTW9kZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQotCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTW9kZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCS8qKgotCSAqIFNhdmUgb25seSByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIGJlIHNhdmVkIChpLmUuLCBubyBvdGhlciByZWZlcmVuY2VzKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbHNDaGFuZ2VkKElNb2RlbFByb3ZpZGVyRXZlbnQgYW5FdmVudCkgewotCQlpbnQgY29kZSA9IGFuRXZlbnQuZ2V0RXZlbnRDb2RlKCk7Ci0JCXN3aXRjaCAoY29kZSkgewotCQkJY2FzZSBJTW9kZWxQcm92aWRlckV2ZW50LlJFTU9WRURfUkVTT1VSQ0UgOiB7Ci0JCQkJaWYgKGhhc1Jlc291cmNlUmVmZXJlbmNlKGFuRXZlbnQuZ2V0Q2hhbmdlZFJlc291cmNlcygpKSkKLQkJCQkJcmVtb3ZlUmVzb3VyY2VzKGFuRXZlbnQuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoaGFzTGlzdGVuZXJzKCkpIHsKLQkJCWFuRXZlbnQuc2V0TW9kZWwodGhpcyk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoYW5FdmVudCk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVzb3VyY2VzKExpc3QgYUxpc3QpIHsKLQkJUmVzb3VyY2UgcmVzOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlyZXMgPSAoUmVzb3VyY2UpIGFMaXN0LmdldChpKTsKLQkJCXJlbW92ZVJlc291cmNlKHJlcykgOwotCQl9Ci0JfQotCS8qKgotCSAqIFJlbW92ZSByZWZlcmVuY2UgdG8gdGhlIGFSZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVSZXNvdXJjZShSZXNvdXJjZSBhUmVzb3VyY2UpIHsKLQkJaWYgKGFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlhUmVzb3VyY2UuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQWRhcHRlcik7Ci0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKGFSZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgUmVzb3VyY2UgaW4gdGhlIGxpc3Qgb2YKLQkgKiAKLQkgKiBAcmVzb3VyY2VzIGlzIHJlZmVyZW5jZWQgYnkgbWUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUmVzb3VyY2VSZWZlcmVuY2UoTGlzdCB0UmVzb3VyY2VzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdFJlc291cmNlcy5zaXplKCk7IGkrKykgewotCQkJaWYgKGhhc1Jlc291cmNlUmVmZXJlbmNlKChSZXNvdXJjZSkgdFJlc291cmNlcy5nZXQoaSkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYVJlc291cmNlIGlzIHJlZmVyZW5jZWQgYnkgbWUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUmVzb3VyY2VSZWZlcmVuY2UoUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCWlmIChhUmVzb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRSZXNvdXJjZXMoKS5jb250YWlucyhhUmVzb3VyY2UpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YKLQkgKiAKLQkgKiBAYW5FdmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSU1vZGVsUHJvdmlkZXJFdmVudCBhbkV2ZW50KSB7Ci0JCQotCQlOb3RpZnlSdW5uZXIgbm90aWZpZXIgPSBuZXcgTm90aWZ5UnVubmVyKGFuRXZlbnQpOyAKLQkJCi0JCU9iamVjdFtdIG5vdGlmeUxpc3QgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7IAotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vdGlmeUxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCW5vdGlmaWVyLnNldExpc3RlbmVyKCAoSU1vZGVsUHJvdmlkZXJMaXN0ZW5lcikgbm90aWZ5TGlzdFtpXSApOwotCQkJU2FmZVJ1bm5lci5ydW4obm90aWZpZXIpOwotCQl9Ci0JfQotCXB1YmxpYyBjbGFzcyBOb3RpZnlSdW5uZXIgaW1wbGVtZW50cyBJU2FmZVJ1bm5hYmxlIHsgCi0JCQotCQlwcml2YXRlIGZpbmFsIElNb2RlbFByb3ZpZGVyRXZlbnQgZXZlbnQ7Ci0JCXByaXZhdGUgSU1vZGVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcjsKLQkJCi0JCXB1YmxpYyBOb3RpZnlSdW5uZXIoSU1vZGVsUHJvdmlkZXJFdmVudCBldmVudCkgewotCQkJQXNzZXJ0LmlzTm90TnVsbChldmVudCk7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihJTW9kZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgeyAKLQkJCUpFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSkVFUGx1Z2luLlBMVUdJTl9JRCwgMCwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKSk7Ci0JCQkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQkJaWYobGlzdGVuZXIgIT0gbnVsbCkKLQkJCQlsaXN0ZW5lci5tb2RlbHNDaGFuZ2VkKGV2ZW50KTsgCi0JCX0KLQkJCi0JfQotCXB1YmxpYyBSZXNvdXJjZVN0YXRlVmFsaWRhdG9yIGdldFN0YXRlVmFsaWRhdG9yKCkgewotCQlpZiAoc3RhdGVWYWxpZGF0b3IgPT0gbnVsbCkKLQkJCXN0YXRlVmFsaWRhdG9yID0gY3JlYXRlU3RhdGVWYWxpZGF0b3IoKTsKLQkJcmV0dXJuIHN0YXRlVmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBjcmVhdGVTdGF0ZVZhbGlkYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIFJlc291cmNlU3RhdGVWYWxpZGF0b3IKLQkgKi8KLQlwcml2YXRlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgY3JlYXRlU3RhdGVWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGwodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGVycHJpc2VBcnRpZmFjdEVkaXQgY3JlYXRlQXJ0aWZhY3RFZGl0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGVja0FjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZ2V0U3RhdGVWYWxpZGF0b3IoKS5jaGVja0FjdGl2YXRpb24ocHJlc2VudGVyKTsKLQkJCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tSZWFkT25seSgpIHsKLQkJcmV0dXJuIGdldFN0YXRlVmFsaWRhdG9yKCkuY2hlY2tSZWFkT25seSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrU2F2ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0U3RhdGVWYWxpZGF0b3IoKS5jaGVja1NhdmUocHJlc2VudGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb3N0QWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlnZXRTdGF0ZVZhbGlkYXRvcigpLmxvc3RBY3RpdmF0aW9uKHByZXNlbnRlcik7Ci0JCQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlU3RhdGUoUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHByZXNlbnRlciA9PSBudWxsKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCXJldHVybiBnZXRTdGF0ZVZhbGlkYXRvcigpLnZhbGlkYXRlU3RhdGUocHJlc2VudGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjYWNoZU5vblJlc291cmNlVmFsaWRhdGVTdGF0ZShMaXN0IHJvTm9uUmVzb3VyY2VGaWxlcykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIExpc3QgZ2V0Tm9uUmVzb3VyY2VGaWxlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Tm9uUmVzb3VyY2VJbmNvbnNpc3RlbnRGaWxlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW9kZWxSZXNvdXJjZXM7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQkKLQkJCUxpc3QgbGlzdCA9IGdldFJlc291cmNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKCgoUmVzb3VyY2UpIGxpc3QuZ2V0KGkpKS5pc01vZGlmaWVkKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjQ2Y2QuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9BcHBDbGllbnRDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzCi0JCUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVdlYkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMgewotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQXBwQ2xpZW50Q3JlYXRlRGVwbG95bWVudEZpbGVzT3BlcmF0aW9uKG1vZGVsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvQXBwQ2xpZW50Q3JlYXRlRGVwbG95bWVudEZpbGVzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0FwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjRjZDE5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvQXBwQ2xpZW50Q3JlYXRlRGVwbG95bWVudEZpbGVzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50Q3JlYXRlRGVwbG95bWVudEZpbGVzT3BlcmF0aW9uIGV4dGVuZHMKLQkJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCi0JcHVibGljIEFwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVwbG95bWVudEZpbGVzKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmaW5hbCBJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJZmluYWwgSU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBNb2RlbFByb3ZpZGVyTWFuYWdlci5nZXRNb2RlbFByb3ZpZGVyKHByb2plY3QpOwotCQlwcm92aWRlci5tb2RpZnkobmV3IFJ1bm5hYmxlKCl7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl9Ci0JCX0sIElNb2RlbFByb3ZpZGVyLkZPUkNFU0FWRSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0NyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbE9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9DcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwOGJlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0NyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIENyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbE9wZXJhdGlvbiBleHRlbmRzCi0JCUFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uIHsKLQotCXB1YmxpYyBDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gKElQcm9qZWN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfUFJPSkVDVCk7Ci0JCWNyZWF0ZURlcGxveW1lbnRGaWxlcyh0YXJnZXRQcm9qZWN0LCBtb25pdG9yKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXBsb3ltZW50RmlsZXMoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlYjU4OC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0NyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcwotCQlBYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMgewotCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZihJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5HRU5FUkFURV9ERC5lcXVhbHMocHJvcGVydHlOYW1lKSl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEdFTkVSQVRFX0REKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVEFSR0VUX1BST0pFQ1QpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxPcGVyYXRpb24obW9kZWwpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9FSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9FSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDE5Njc2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvRUpCQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRUpCQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcwotCQlDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IEVKQkNyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbihtb2RlbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0VKQkNyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9FSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzODZlYS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0VKQkNyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIEVKQkNyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbiBleHRlbmRzCi0JCUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQotCXB1YmxpYyBFSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlcGxveW1lbnRGaWxlcyhJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWZpbmFsIElNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihwcm9qZWN0KTsKLQkJcHJvdmlkZXIubW9kaWZ5KG5ldyBSdW5uYWJsZSgpewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJfQotCQl9LCBJTW9kZWxQcm92aWRlci5GT1JDRVNBVkUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9FYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9FYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzMyMDU4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvRWFyQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWFyQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIgZXh0ZW5kcwotCQlDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotICAgICAgICByZXR1cm4gbmV3IEVhckNyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbihtb2RlbCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0VhckNyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9FYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxMmE2Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0VhckNyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuSU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuTW9kZWxQcm92aWRlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIEVhckNyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbiBleHRlbmRzCi0JCUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQotCXB1YmxpYyBFYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24oSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlcGxveW1lbnRGaWxlcyhJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCWZpbmFsIElNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihwcm9qZWN0KTsKLQkJCXByb3ZpZGVyLm1vZGlmeShuZXcgUnVubmFibGUoKXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUlWaXJ0dWFsUmVmZXJlbmNlW10gY29tcG9uZW50UmVmZXJlbmNlcyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEoyRUVNb2R1bGVSZWZlcmVuY2VzKGNvbXBvbmVudCk7Ci0JCQkJCWlmKGNvbXBvbmVudFJlZmVyZW5jZXMgIT0gbnVsbCAmJiBjb21wb25lbnRSZWZlcmVuY2VzLmxlbmd0aCA+IDApewkJCQkJCi0JCQkJCQlmaW5hbCBJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBZGRDb21wb25lbnRUb0VudGVycHJpc2VBcHBsaWNhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQkJCQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5TT1VSQ0VfQ09NUE9ORU5ULCBjb21wb25lbnQpOwotCQkJCQkJTGlzdCBtb2RMaXN0ID0gKExpc3QpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShJQ3JlYXRlUmVmZXJlbmNlQ29tcG9uZW50c0RhdGFNb2RlbFByb3BlcnRpZXMuVEFSR0VUX0NPTVBPTkVOVF9MSVNUKTsKLQkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJSVZpcnR1YWxDb21wb25lbnQgcmVmZXJlbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudFJlZmVyZW5jZXNbaV0uZ2V0UmVmZXJlbmNlZENvbXBvbmVudCgpOwotCQkJCQkJCW1vZExpc3QuYWRkKHJlZmVyZW5jZWRDb21wb25lbnQpOwotCQkJCQkJfQotCQkJCQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElDcmVhdGVSZWZlcmVuY2VDb21wb25lbnRzRGF0YU1vZGVsUHJvcGVydGllcy5UQVJHRVRfQ09NUE9ORU5UX0xJU1QsIG1vZExpc3QpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0sIElNb2RlbFByb3ZpZGVyLkZPUkNFU0FWRSk7Ci0JCQkJCi0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9JQXBwQ2xpZW50Q3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9JQXBwQ2xpZW50Q3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWQzYmU2Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSUFwcENsaWVudENyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElBcHBDbGllbnRDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMKLQkJSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMgewotCS8qKgotCSAqIFRoaXMgZmllbGQgc2hvdWxkIG5vdCBiZSB1c2VkLiAgSXQgaXMgbm90IHBhcnQgb2YgdGhlIEFQSSBhbmQgbWF5IGJlIG1vZGlmaWVkIGluIHRoZSBmdXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzcyBfcHJvdmlkZXJfY2xhc3MgPSBBcHBDbGllbnRDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlci5jbGFzczsKLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9JQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9JQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNhYjVmLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmplZS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzCi0JCUlEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9QUk9KRUNUID0gIklDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBUkdFVF9QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqICBib29sZWFuIHByb3BlcnR5IGZvciBKYXZhIEVFIDUgcHJvamVjdHMsIHRvIGNyZWF0ZS9ub3QgY3JlYXRlIGEgZGVwbG95bWVudCBkZXNjcmlwdG9yLCAKLQkgKiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9ERCA9ICJJQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcy5HRU5FUkFURV9ERCI7IC8vJE5PTi1OTFMtMSQgCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSUVKQkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSUVKQkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJkNTBlMi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0lFSkJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldDsKLQotcHVibGljIGludGVyZmFjZSBJRUpCQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzCi0JCUlDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gRUpCQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuY2xhc3M7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSUVhckNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSUVhckNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxZDU5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0lFYXJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldDsKLQotcHVibGljIGludGVyZmFjZSBJRWFyQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzCi0JCUlDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gRWFyQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuY2xhc3M7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSVdlYkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSVdlYkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzMzM3Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0lXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldDsKLQotcHVibGljIGludGVyZmFjZSBJV2ViQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvcGVydGllcyBleHRlbmRzCi0JCUlDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkvKioKLQkgKiBUaGlzIGZpZWxkIHNob3VsZCBub3QgYmUgdXNlZC4gIEl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBBUEkgYW5kIG1heSBiZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgX3Byb3ZpZGVyX2NsYXNzID0gV2ViQ3JlYXRlRGVwbG95bWVudEZpbGVzRGF0YU1vZGVsUHJvdmlkZXIuY2xhc3M7Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSkVFRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvSkVFRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRjYzEyOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L0pFRUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkoyRUVGYWNldEluc3RhbGxEZWxlZ2F0ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEpFRUZhY2V0SW5zdGFsbERlbGVnYXRlIGV4dGVuZHMgSjJFRUZhY2V0SW5zdGFsbERlbGVnYXRlIHsKLQkvLyB0aGlzIGNsYXNzIHVzZWQgdG8gaGF2ZSBtZXRob2RzIGJ1dCBub3cgZHVlIHRvIHJlZmFjdG9yaW5nL21vZGVsIHN1cHBvcnQgaXQgZG9lcyBub3QuCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L1dlYkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L1dlYkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NmM3ZTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2plZWNyZWF0aW9uL29yZy9lY2xpcHNlL2pzdC9qZWUvcHJvamVjdC9mYWNldC9XZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzCi0JCUNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVdlYkNyZWF0ZURlcGxveW1lbnRGaWxlc0RhdGFNb2RlbFByb3BlcnRpZXMgewotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViQ3JlYXRlRGVwbG95bWVudEZpbGVzT3BlcmF0aW9uKG1vZGVsKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvV2ViQ3JlYXRlRGVwbG95bWVudEZpbGVzT3BlcmF0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvamVlY3JlYXRpb24vb3JnL2VjbGlwc2UvanN0L2plZS9wcm9qZWN0L2ZhY2V0L1dlYkNyZWF0ZURlcGxveW1lbnRGaWxlc09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDg2ZDQ3Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9qZWVjcmVhdGlvbi9vcmcvZWNsaXBzZS9qc3QvamVlL3Byb2plY3QvZmFjZXQvV2ViQ3JlYXRlRGVwbG95bWVudEZpbGVzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5Nb2RlbFByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWxjb21lRmlsZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBXZWJDcmVhdGVEZXBsb3ltZW50RmlsZXNPcGVyYXRpb24gZXh0ZW5kcwotCQlDcmVhdGVEZXBsb3ltZW50RmlsZXNEYXRhTW9kZWxPcGVyYXRpb24gewotCi0KLQlwdWJsaWMgV2ViQ3JlYXRlRGVwbG95bWVudEZpbGVzT3BlcmF0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXBsb3ltZW50RmlsZXMoSVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlmaW5hbCBJTW9kZWxQcm92aWRlciBwcm92aWRlciA9IE1vZGVsUHJvdmlkZXJNYW5hZ2VyLmdldE1vZGVsUHJvdmlkZXIocHJvamVjdCk7Ci0KLQkJCXByb3ZpZGVyLm1vZGlmeShuZXcgUnVubmFibGUoKXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBwcm92aWRlci5nZXRNb2RlbE9iamVjdCgpOwotCQkJCQkKLQkJCQkJLy8gd2VsY29tZSBmaWxlIGxpc3QKLQkJCQkJTGlzdDxTdHJpbmc+IHdlbGNvbWVGaWxlcyA9IEFycmF5cy5hc0xpc3QoCi0JCQkJCQkJImluZGV4Lmh0bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJImluZGV4Lmh0bSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkiaW5kZXguanNwIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSJkZWZhdWx0Lmh0bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJImRlZmF1bHQuaHRtIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSJkZWZhdWx0LmpzcCIgLy8kTk9OLU5MUy0xJAotCQkJCQkpOwotCQkJCQkKLQkJCQkJLy8gQWRkIHRoZSB3ZWxjb21lLWZpbGUtbGlzdCB0YWcKLQkJCQkJV2VsY29tZUZpbGVMaXN0IHdlbGNvbWVGaWxlTGlzdCA9IChXZWxjb21lRmlsZUxpc3QpIFdlYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlbGNvbWVGaWxlTGlzdCgpOwotCQkJCQl3ZWxjb21lRmlsZUxpc3QuZ2V0V2VsY29tZUZpbGVzKCkuYWRkQWxsKHdlbGNvbWVGaWxlcyk7IAotCQkJCQl3ZWJBcHAuZ2V0V2VsY29tZUZpbGVMaXN0cygpLmFkZCh3ZWxjb21lRmlsZUxpc3QpOwotCQkJCX0KLQkJCX0sIElNb2RlbFByb3ZpZGVyLkZPUkNFU0FWRSk7Ci0JCQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvbGljZW5zZS9iZXJrZWxleV9saWNlbnNlLmh0bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvbGljZW5zZS9iZXJrZWxleV9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMmU2NmYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL2xpY2Vuc2UvYmVya2VsZXlfbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+ICAgICAgICAgICAgICAgICAgICAgICAgCi08dGl0bGU+TGljZW5zZTwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPHA+Ci08Yj5Db3B5cmlnaHQgMTk5NC0yMDA2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsICBSaWdodHMgUmVzZXJ2ZWQuPC9iPgotPC9wPiAgICAgIAotPHA+UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgCi1hcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci08L3A+Ci08dWw+Ci08bGk+UmVkaXN0cmlidXRpb24gb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgIAotbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuPGJyPjxicj48L2xpPgotPGxpPlJlZGlzdHJpYnV0aW9uIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCAKLXRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIAotb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi48L2xpPgotPC91bD4KLTxwPk5laXRoZXIgdGhlIG5hbWUgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBvciB0aGUgbmFtZXMgb2YgY29udHJpYnV0b3JzIG1heSAKLWJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgCi1zcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi08L3A+Ci08cD5UaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICZxdW90O0FTIElTLCZxdW90OyB3aXRob3V0IGEgd2FycmFudHkgb2YgYW55IGtpbmQuIAotQUxMIEVYUFJFU1MgT1IgSU1QTElFRCBDT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyAKLUFOWSBJTVBMSUVEIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgCi1OT04tSU5GUklOR0VNRU5ULCBBUkUgSEVSRUJZIEVYQ0xVREVELiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuICgmcXVvdDtTVU4mcXVvdDspIAotQU5EIElUUyBMSUNFTlNPUlMgU0hBTEwgTk9UIEJFIExJQUJMRSBGT1IgQU5ZIERBTUFHRVMgU1VGRkVSRUQgQlkgTElDRU5TRUUgCi1BUyBBIFJFU1VMVCBPRiBVU0lORywgTU9ESUZZSU5HIE9SIERJU1RSSUJVVElORyBUSElTIFNPRlRXQVJFIE9SIElUUyAKLURFUklWQVRJVkVTLiBJTiBOTyBFVkVOVCBXSUxMIFNVTiBPUiBJVFMgTElDRU5TT1JTIEJFIExJQUJMRSBGT1IgQU5ZIAotTE9TVCBSRVZFTlVFLCBQUk9GSVQgT1IgREFUQSwgT1IgRk9SIERJUkVDVCwgSU5ESVJFQ1QsIFNQRUNJQUwsIAotQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCBPUiBQVU5JVElWRSBEQU1BR0VTLCBIT1dFVkVSIENBVVNFRCBBTkQgCi1SRUdBUkRMRVNTIE9GIFRIRSBUSEVPUlkgT0YgTElBQklMSVRZLCBBUklTSU5HIE9VVCBPRiBUSEUgVVNFIE9GIE9SIAotSU5BQklMSVRZIFRPIFVTRSBUSElTIFNPRlRXQVJFLCBFVkVOIElGIFNVTiBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSAKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLTwvcD4KLTxwPllvdSBhY2tub3dsZWRnZSB0aGF0IHRoaXMgc29mdHdhcmUgaXMgbm90IGRlc2lnbmVkLCBsaWNlbnNlZCBvciBpbnRlbmRlZCAKLWZvciB1c2UgaW4gdGhlIGRlc2lnbiwgY29uc3RydWN0aW9uLCBvcGVyYXRpb24gb3IgbWFpbnRlbmFuY2Ugb2YgYW55IG51Y2xlYXIgZmFjaWxpdHkuCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KLQotCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MzA5YmIuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBwcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLmpzdC5qZWUKLUJ1bmRsZS1OYW1lLjAgPSBKRUUgY29tbW9uIFBsdWctaW4KLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi1lZTVlamJDb250ZW50VHlwZT1KYXZhIEVFIDUgRUpCIENvbnRlbnQKLWVlNXdlYkNvbnRlbnRUeXBlPUphdmEgRUUgNSBXZWIgQ29udGVudAotZWU1ZWFyQ29udGVudFR5cGU9SmF2YSBFRSA1IEVBUiBDb250ZW50Ci1lZTVhcHBjbGllbnRDb250ZW50VHlwZT1KYXZhIEVFIDUgQXBwbGljYXRpb24gQ2xpZW50IENvbnRlbnQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9wbHVnaW4ueG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNWFlYWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3QuamVlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJqZWVNb2RlbEV4dGVuc2lvbiIgbmFtZT0iSkVFIE1vZGVsIEV4dGVuc2lvbiIgc2NoZW1hPSJzY2hlbWEvamVlTW9kZWxFeHRlbnNpb24uZXhzZCIvPgotCi0JPCEtLUogRUU1ICAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5mYWNldHMiPgotICAgICAgICAgCi0gICAgPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianN0LmVhciIgdmVyc2lvbj0iNS4wIj4KLSAgICAgIDxjb25zdHJhaW50PgotICAgICAgICA8YW5kPgotICAgICAgICAgIDxjb25mbGljdHMgZ3JvdXA9Im1vZHVsZXMiLz4KLSAgICAgICAgICA8Y29uZmxpY3RzIGZhY2V0PSJqc3QuamF2YSIvPgotICAgICAgICA8L2FuZD4KLSAgICAgIDwvY29uc3RyYWludD4KLSAgICAgIDxncm91cC1tZW1iZXIgaWQ9Im1vZHVsZXMiLz4gICAgIAotICAgICAgICAgICAgIAotICAgIDwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCi0gICAgPGFjdGlvbiBmYWNldD0ianN0LmVhciIgdmVyc2lvbj0iNS4wIiB0eXBlPSJJTlNUQUxMIiBpZD0ianN0LmVhciM1LjAjaW5zdGFsbCI+Ci0gICAgICAJICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLnByb2plY3QuZmFjZXQuRWFyRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KLSAgCQkgICA8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVhcmNyZWF0aW9uLkVhckZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIi8+Ci0gICAgPC9hY3Rpb24+Ci0gICAgICAKLSAgICA8ZXZlbnQtaGFuZGxlciBmYWNldD0ianN0LmVhciIgdmVyc2lvbj0iNS4wIiB0eXBlPSJQT1NUX0lOU1RBTEwiPgotICAgICAgCQk8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUucHJvamVjdC5mYWNldC5FYXJGYWNldFBvc3RJbnN0YWxsRGVsZWdhdGUiLz4KLSAgICA8L2V2ZW50LWhhbmRsZXI+ICAKLSAgICAKLSAgICA8ZXZlbnQtaGFuZGxlciBmYWNldD0ianN0LmVhciIgdmVyc2lvbj0iNS4wIiB0eXBlPSJSVU5USU1FX0NIQU5HRUQiPgotICAgICAgPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LkVhckZhY2V0UnVudGltZUhhbmRsZXIkUnVudGltZUNoYW5nZWREZWxlZ2F0ZSIvPgotCTwvZXZlbnQtaGFuZGxlcj4gICAgIAotICAgIAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5yZXNvdXJjZUZhY3RvcmllcyI+Ci0gICAgIDxyZXNvdXJjZUZhY3RvcnkKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLnV0aWwuV2ViUmVzb3VyY2VGYWN0b3J5SW1wbCIKLSAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgc2hvcnRTZWdtZW50PSJ3ZWIueG1sIj4KLSAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLmVlNXdlYkREIj4KLSAgICAgICAgPC9jb250ZW50VHlwZUJpbmRpbmc+Ci0gICAgIDwvcmVzb3VyY2VGYWN0b3J5PgotICAgICA8cmVzb3VyY2VGYWN0b3J5Ci0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmVqYi5pbnRlcm5hbC51dGlsLkVqYlJlc291cmNlRmFjdG9yeUltcGwiCi0gICAgICAgICAgIGlzRGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgIHNob3J0U2VnbWVudD0iZWpiLWphci54bWwiPgotICAgICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0gICAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUuZWU1ZWpiREQiPgotICAgICAgICA8L2NvbnRlbnRUeXBlQmluZGluZz4KLSAgICAgPC9yZXNvdXJjZUZhY3Rvcnk+Ci0gICAgIDxyZXNvdXJjZUZhY3RvcnkKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwudXRpbC5BcHBsaWNhdGlvbmNsaWVudFJlc291cmNlRmFjdG9yeUltcGwiCi0gICAgICAgICAgIGlzRGVmYXVsdD0iZmFsc2UiCi0gICAgICAgICAgIHNob3J0U2VnbWVudD0iYXBwbGljYXRpb24tY2xpZW50LnhtbCI+Ci0gICAgICAgIDxjb250ZW50VHlwZUJpbmRpbmcKLSAgICAgICAgICAgICAgY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmplZS5lZTVhcHBjbGllbnRERCI+Ci0gICAgICAgIDwvY29udGVudFR5cGVCaW5kaW5nPgotICAgICA8L3Jlc291cmNlRmFjdG9yeT4KLSAgICAgPHJlc291cmNlRmFjdG9yeQotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC51dGlsLkFwcGxpY2F0aW9uUmVzb3VyY2VGYWN0b3J5SW1wbCIKLSAgICAgICAgICAgaXNEZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgc2hvcnRTZWdtZW50PSJhcHBsaWNhdGlvbi54bWwiPgotICAgICAgICA8Y29udGVudFR5cGVCaW5kaW5nCi0gICAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qZWUuZWU1ZWFyREQiPgotICAgICAgICA8L2NvbnRlbnRUeXBlQmluZGluZz4KLSAgICAgPC9yZXNvdXJjZUZhY3Rvcnk+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5jb3JlLmludGVybmFsLm1ldGFkYXRhLkphdmFlZVBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9lamItamFyXzNfMC54c2QiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5lamIuaW50ZXJuYWwubWV0YWRhdGEuRWpiUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uLWNsaWVudF81LnhzZCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamF2YWVlLmFwcGxpY2F0aW9uY2xpZW50LmludGVybmFsLm1ldGFkYXRhLkFwcGxpY2F0aW9uY2xpZW50UGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL2FwcGxpY2F0aW9uXzUueHNkIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUuYXBwbGljYXRpb24uaW50ZXJuYWwubWV0YWRhdGEuQXBwbGljYXRpb25QYWNrYWdlIj4KLSAgICAgIDwvcGFja2FnZT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLmludGVybmFsLm1ldGFkYXRhLldlYlBhY2thZ2UiPgotICAgICAgPC9wYWNrYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICAgIDxwYWNrYWdlCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS9qc3AiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmphdmFlZS5qc3AuaW50ZXJuYWwubWV0YWRhdGEuSnNwUGFja2FnZSI+Ci0gICAgICA8L3BhY2thZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZHVsZUZhY3RvcmllcyI+Ci0gICAgICA8bW9kdWxlRmFjdG9yeQotICAgICAgICAgICAgcHJvamVjdHM9InRydWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5KRUVEZXBsb3lhYmxlRmFjdG9yeSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuamVlLnNlcnZlciI+Ci0gICAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgICAgICAgdHlwZXM9ImpzdC5lYXIiCi0gICAgICAgICAgICAgICB2ZXJzaW9ucz0iNS4wIj4KLSAgICAgICAgIDwvbW9kdWxlVHlwZT4KLSAgICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICAgICAgICB0eXBlcz0ianN0LmFwcGNsaWVudCIKLSAgICAgICAgICAgICAgIHZlcnNpb25zPSI1LjAsMS4yLDEuMywxLjQiPgotICAgICAgICAgPC9tb2R1bGVUeXBlPgotICAgICAgICAgPG1vZHVsZVR5cGUKLSAgICAgICAgICAgICAgIHR5cGVzPSJqc3Qud2ViIgotICAgICAgICAgICAgICAgdmVyc2lvbnM9IjIuNSwyLjIsMi4zLDIuNCI+Ci0gICAgICAgICA8L21vZHVsZVR5cGU+Ci0gICAgICAgICA8bW9kdWxlVHlwZQotICAgICAgICAgICAgICAgdHlwZXM9ImpzdC5lamIiCi0gICAgICAgICAgICAgICB2ZXJzaW9ucz0iMy4wLDEuMSwyLjAsMi4xIj4KLSAgICAgICAgIDwvbW9kdWxlVHlwZT4KLSAgICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICAgICAgICB0eXBlcz0ianN0LmNvbm5lY3RvciIKLSAgICAgICAgICAgICAgIHZlcnNpb25zPSIxLjAsMS41Ij4KLSAgICAgICAgIDwvbW9kdWxlVHlwZT4KLSAgICAgICAgIDxtb2R1bGVUeXBlCi0gICAgICAgICAgICAgICB0eXBlcz0ianN0LnV0aWxpdHkiCi0gICAgICAgICAgICAgICB2ZXJzaW9ucz0iMS4wIj4KLSAgICAgICAgIDwvbW9kdWxlVHlwZT4gICAgICAgICAKLSAgICAgIDwvbW9kdWxlRmFjdG9yeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotICAgICAgPGNvbnRlbnQtdHlwZQotICAgICAgICAgICAgZmlsZS1uYW1lcz0iZWpiLWphci54bWwiCi0gICAgICAgICAgICBpZD0iZWU1ZWpiREQiCi0gICAgICAgICAgICBiYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0gICAgICAgICAgICBuYW1lPSIlZWU1ZWpiQ29udGVudFR5cGUiCi0gICAgICAgICAgICBwcmlvcml0eT0iaGlnaCI+Ci0gICAgICAgICA8ZGVzY3JpYmVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS5jb250ZW50dHlwZS5KRUVDb250ZW50RGVzY3JpYmVyIj4KLSAgICAgICAgIDwvZGVzY3JpYmVyPgotICAgICAgPC9jb250ZW50LXR5cGU+Ci0gIAk8L2V4dGVuc2lvbj4gICAKLSAgCQotICAJIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLSAgICAgIDxjb250ZW50LXR5cGUKLSAgICAgICAgICAgIGZpbGUtbmFtZXM9IndlYi54bWwiCi0gICAgICAgICAgICBpZD0iZWU1d2ViREQiCi0gICAgICAgICAgICBiYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0gICAgICAgICAgICBuYW1lPSIlZWU1d2ViQ29udGVudFR5cGUiCi0gICAgICAgICAgICBwcmlvcml0eT0iaGlnaCI+Ci0gICAgICAgICA8ZGVzY3JpYmVyCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS5jb250ZW50dHlwZS5KRUVDb250ZW50RGVzY3JpYmVyIj4KLSAgICAgICAgIDwvZGVzY3JpYmVyPgotICAgICAgPC9jb250ZW50LXR5cGU+Ci0gIAk8L2V4dGVuc2lvbj4gICAKLSAgCQotICAJIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLSAgICAgIDxjb250ZW50LXR5cGUKLSAgICAgICAgICAgIGZpbGUtbmFtZXM9ImFwcGxpY2F0aW9uLnhtbCIKLSAgICAgICAgICAgIGlkPSJlZTVlYXJERCIKLSAgICAgICAgICAgIGJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVlZTVlYXJDb250ZW50VHlwZSIKLSAgICAgICAgICAgIHByaW9yaXR5PSJoaWdoIj4KLSAgICAgICAgIDxkZXNjcmliZXIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuamVlLmNvbnRlbnR0eXBlLkpFRUNvbnRlbnREZXNjcmliZXIiPgotICAgICAgICAgPC9kZXNjcmliZXI+Ci0gICAgICA8L2NvbnRlbnQtdHlwZT4KLSAgCTwvZXh0ZW5zaW9uPiAgIAotICAJCi0gIAkKLSAgCSA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0gICAgICA8Y29udGVudC10eXBlCi0gICAgICAgICAgICBmaWxlLW5hbWVzPSJhcHBsaWNhdGlvbi1jbGllbnQueG1sIgotICAgICAgICAgICAgaWQ9ImVlNWFwcGNsaWVudEREIgotICAgICAgICAgICAgYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotICAgICAgICAgICAgbmFtZT0iJWVlNWFwcGNsaWVudENvbnRlbnRUeXBlIgotICAgICAgICAgICAgcHJpb3JpdHk9ImhpZ2giPgotICAgICAgICAgPGRlc2NyaWJlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qZWUuY29udGVudHR5cGUuSkVFQ29udGVudERlc2NyaWJlciI+Ci0gICAgICAgICA8L2Rlc2NyaWJlcj4KLSAgICAgIDwvY29udGVudC10eXBlPgotICAJPC9leHRlbnNpb24+ICAKLSAgCQotICAJPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRU1vZGVsUHJvdmlkZXIiPgotICAgICAgCTxwcm92aWRlcj4KLSAgICAgICAgCTxtb2RlbFByb3ZpZGVyIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5FQVI1TW9kZWxQcm92aWRlckZhY3RvcnkiLz4JCi0gICAgICAJCTxmYWNldCBpZD0ianN0LmVhciIgdmVyc2lvbnM9IjUuMCIvPgotICAgICAgCTwvcHJvdmlkZXI+Ci0gIDwvZXh0ZW5zaW9uPiAKLQotICAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRU1vZGVsUHJvdmlkZXIiPgotICAgICAgCTxwcm92aWRlcj4KLSAgICAgICAgCTxtb2RlbFByb3ZpZGVyIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanN0LmplZS5tb2RlbC5pbnRlcm5hbC5BcHBDbGllbnQ1TW9kZWxQcm92aWRlckZhY3RvcnkiLz4JCi0gICAgICAJCTxmYWNldCBpZD0ianN0LmFwcGNsaWVudCIgdmVyc2lvbnM9IjUuMCIvPgotICAgICAgCTwvcHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgCSAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9zY2hlbWEvamVlTW9kZWxFeHRlbnNpb24uZXhzZCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LmplZS9zY2hlbWEvamVlTW9kZWxFeHRlbnNpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2ZGE2MC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5qZWUvc2NoZW1hL2plZU1vZGVsRXh0ZW5zaW9uLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanN0LmplZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmplZSIgaWQ9ImplZU1vZGVsRXh0ZW5zaW9uIiBuYW1lPSJKRUUgTW9kZWwgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iamVlTW9kZWxFeHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJRCB1c2VkIHRvIGlkZW50aWZ5IGEgbW9kZWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIElKRUVNb2RlbCBpbnRlcmZhY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwcmlvcml0eSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBQcmlvcml0eSB1c2VkIHRvIGRldGVybWluZSB3aGljaCBpbXBsZW1lbnRhdGlvbiBpcyBhY3RpdmUKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLmNsYXNzcGF0aCBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlYjNmMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNlcnZsZXRfdWkiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS8uY3ZzaWdub3JlIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk5MTNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1zZXJ2bGV0dWkuamFyCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5wcm9qZWN0IGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwOWJlOC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPmNvbS5pYm0uZXRvb2xzLmN0Yy5qYXZhcHJvamVjdG5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5YTgxNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSNNb24gRmViIDE4IDE1OjU3OjA5IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjYjNjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjA0LnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLlNlcnZsZXRVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblZlbmRvcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWksCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2U7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndlYjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndlYi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0O2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuamVlLnVpO2J1bmRsZS12ZXJzaW9uPSIxLjAuMTAwIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9hYm91dC5odG1sIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWJmNTZiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc2VydmxldF91aS8sXAotICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvZXhwb3J0d2FyX3dpei5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkODU5ZC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9leHBvcnR3YXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L2ltcG9ydHdhcl93aXouZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmMwNjYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvaW1wb3J0d2FyX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdmaWx0ZXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2ZpbHRlcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmNhZmMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2ZpbHRlcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3bGlzdGVuZXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld2xpc3RlbmVyX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZjJhODkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvbmV3bGlzdGVuZXJfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3NlcnZsZXRfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3NlcnZsZXRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1ZWFkYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXdzZXJ2bGV0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXd3YXJfd2l6LmdpZiBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWFjNmJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvd2ViLXdpei1iYW5uZXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvd2ViLXdpei1iYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk0NGU5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYi13aXotYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYi13aXotaWNvbi5naWYgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWItd2l6LWljb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWFjNmJlLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3dlYi13aXotaWNvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWJqYXZhLWljb24uZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy9mdWxsL2N0b29sMTYvd2ViamF2YS1pY29uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdjYjRlNy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi93ZWJqYXZhLWljb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy93YXIuZ2lmIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9pY29ucy93YXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWVjYjdhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvaWNvbnMvd2FyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzhhZTk4Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZT1XVFAgU2VydmxldCBVSSBQbHVnLWluCi1wbHVnaW5WZW5kb3I9RWNsaXBzZS5vcmcKLWNyZWF0ZS53ZWIubW9kdWxlX3VpXz1DcmVhdGUgYSBKMkVFIFdlYiBNb2R1bGUKLWNyZWF0ZS53ZWIucHJvamVjdF91aV89Q3JlYXRlIGEgSjJFRSBXZWIgbW9kdWxlCi13ZWIuYWN0aW9ucy5kZXNjcmlwdGlvbl91aV89QWN0aW9ucyBmb3IgSjJFRSBXZWIgRGV2ZWxvcG1lbnQKLWNyZWF0ZV9zZXJ2bGV0X3VpXz1DcmVhdGUgSmF2YSBTZXJ2bGV0IGZpbGUKLXdhci5pbXBvcnQuZGVzY3JpcHRpb25fdWlfPUltcG9ydCBhbiBleHRlcm5hbCBXQVIgZmlsZSBpbnRvIGFuIFdlYiBwcm9qZWN0Ci13YXIuaW1wb3J0LmFjdGlvbi5kZXNjcmlwdGlvbl91aV89SW1wb3J0IFdBUiBGaWxlLi4uCi13YXIuZXhwb3J0LmRlc2NyaXB0aW9uX3VpXz1FeHBvcnQgYSBXZWIgcHJvamVjdCBpbnRvIGEgV0FSIGZpbGUKLXdhci5leHBvcnQuYWN0aW9uLmRlc2NyaXB0aW9uX3VpXz1FeHBvcnQgV0FSIEZpbGUuLi4KLVdhcmV4cG9ydFdpemFyZC5uYW1lPVdBUiBmaWxlCi1XYXJleHBvcnRXaXphcmQuZGVzY3JpcHRpb249RXhwb3J0IGEgV2ViIE1vZHVsZSBpbnRvIGFuIGV4dGVybmFsIFdBUiBmaWxlCi1XYXJJbXBvcnRXaXphcmQubmFtZT1XQVIgZmlsZQotV2FySW1wb3J0V2l6YXJkLmRlc2NyaXB0aW9uPUltcG9ydCBhbiBleHRlcm5hbCBXQVIgZmlsZSBpbnRvIGEgV2ViIFByb2plY3QKLXdlYi5jYXRlZ29yeV91aV89V2ViCi13ZWIucHJvamVjdF91aV89RHluYW1pYyBXZWIgUHJvamVjdAotc3RhdGljLndlYi5wcm9qZWN0X3VpXz1TdGF0aWMgV2ViIFByb2plY3QKLW5ldy53ZWIucHJvamVjdC5kZXNjcmlwdGlvbl91aV89Q3JlYXRlIGEgRHluYW1pYyBXZWIgcHJvamVjdAotQ29udmVydFdlYlByb2plY3RUeXBlPUNvbnZlcnQgV2ViIFByb2plY3QKLWNvbnZlcnRXZWJQcm9qZWN0VHlwZUFjdGlvbi5sYWJlbD1Db252ZXJ0IHRvIGEgRHluYW1pYyBXZWIgcHJvamVjdC4uLgotQ29udmVydFdlYlByb2plY3RUeXBlQWN0aW9uLnRvb2x0aXA9V2ViIE1vZHVsZSBDb252ZXJzaW9uIFdpemFyZAotY29udmVydFRvRHluYW1pYz1Db252ZXJ0IHRvIFdlYiBNb2R1bGUuLi4KLVNlcnZsZXRXZWJSZWdpb25XaXphcmQubmFtZT1TZXJ2bGV0Ci1TZXJ2bGV0V2ViUmVnaW9uV2l6YXJkLmRlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBTZXJ2bGV0Ci1TZXJ2bGV0V2ViUmVnaW9uV2l6YXJkLnRpdGxlPU5ldyBTZXJ2bGV0Ci1TZXJ2bGV0X1VJXz1TZXJ2bGV0Li4uCi1GaWx0ZXJXZWJSZWdpb25XaXphcmQubmFtZT1GaWx0ZXIKLUZpbHRlcldlYlJlZ2lvbldpemFyZC5kZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgRmlsdGVyCi1zZXJ2bGV0QW5ub3RhdGlvbkRlY29yYXRvcj1TZXJ2bGV0IEFubm90YXRpb24gRGVjb3JhdG9yCi1zZXJ2bGV0QW5ub3RhdGlvbkRlY29yYXRvci5kZXNjcmlwdGlvbj1BZGRzIGEgZGVjb3JhdG9yIHRvIGFuIGFubm90YXRlZCBzZXJ2bGV0Lgotd2ViLXByb2plY3Qtd2l6YXJkLW5hbWUgPSBXZWIgUHJvamVjdAotd2ViLXByb2plY3Qtd2l6YXJkLWRlc2NyaXB0aW9uID0gQ3JlYXRlIGEgV2ViIHByb2plY3QKLXdlYkFwcExpYnJhcmllc0NvbnRhaW5lck5hbWUgPSBXZWIgQXBwIExpYnJhcmllcwotCi1MaXN0ZW5lcldlYlJlZ2lvbldpemFyZC5uYW1lPUxpc3RlbmVyCi1MaXN0ZW5lcldlYlJlZ2lvbldpemFyZC5kZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgQXBwbGljYXRpb24gTGlmZWN5Y2xlIExpc3RlbmVyCi0KLWVuaGFuY2VkLmphdmEuZm9yLndlYi5uYW1lPUVuaGFuY2VkIEphdmEgUmVuZGVyaW5nIGZvciBXZWIKLWoyZWU9SmF2YSBFRQotajJlZS5hY3Rpb25zLmRlc2NyaXB0aW9uX3VpXz1BY3Rpb25zIGZvciBKMkVFIERldmVsb3BtZW50CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3BsdWdpbi54bWwgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOTE2YmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotICAgPCEtLSBDcmVhdGUgSmF2YSBFRSBQcm9qZWN0cyBkcm9wIGRvd24gdG9vbGJhciBidXR0b24gLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBsYWJlbD0iJWoyZWUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWoyZWUuYWN0aW9ucy5kZXNjcmlwdGlvbl91aV8iCi0gICAgICAgICAgICB2aXNpYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMmVlTWFpbkFjdGlvblNldCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5OZXdKYXZhRUVBcnRpZmFjdCIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJKMkVFTWFpbiIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLk5ld0phdmFFRUFydGlmYWN0RHJvcERvd25BY3Rpb24iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3c2VydmxldF93aXouZ2lmIgotICAgICAgICAgICAgICAgbGFiZWw9IiVTZXJ2bGV0V2ViUmVnaW9uV2l6YXJkLm5hbWUiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVsbGRvd24iCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlU2VydmxldFdlYlJlZ2lvbldpemFyZC5kZXNjcmlwdGlvbiIgLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLk5ld0phdmFFRVByb2plY3QiCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0iSjJFRU1haW4iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYWN0aW9ucy5OZXdKYXZhRUVQcm9qZWN0RHJvcERvd25BY3Rpb24iCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3d2FyX3dpei5naWYiCi0gICAgICAgICAgICAgICBsYWJlbD0iJXdlYi5wcm9qZWN0X3VpXyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdWxsZG93biIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVuZXcud2ViLnByb2plY3QuZGVzY3JpcHRpb25fdWlfIiAvPgotICAgICAgPC9hY3Rpb25TZXQ+IAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDwhLS0gV2ViIE1vZHVsZSBXaXphcmQgLS0+Ci0gICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IkoyRUVVSVByb2plY3RXaXphcmRzIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIld2ViLmNhdGVnb3J5X3VpXyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBuYW1lPSIld2ViLnByb2plY3RfdWlfIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld3dhcl93aXouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgICAgICBwcm9qZWN0PSJ0cnVlIgotICAgICAgICAgICAgZmluYWxQZXJzcGVjdGl2ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuSjJFRVBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQuV2ViUHJvamVjdFdpemFyZCI+Ci0gICAgICAgICA8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQuV2ViUHJvamVjdFdpemFyZCI+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9ImphdmFlZXByb2plY3QiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lbnVJbmRleCIgdmFsdWU9IjEwIiAvPgotICAgICAgICAgPC9jbGFzcz4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVuZXcud2ViLnByb2plY3QuZGVzY3JpcHRpb25fdWlfCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4KLSAgICAgIDwvd2l6YXJkPgotCi0gICAgICA8IS0tbmV3IHNlcnZsZXQgY29udHJpYnV0aW9uLS0+Ci0gCSAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJVNlcnZsZXRXZWJSZWdpb25XaXphcmQubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9uZXdzZXJ2bGV0X3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQWRkU2VydmxldFdpemFyZCI+Ci0gICAgICAgICA8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRTZXJ2bGV0V2l6YXJkIj4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0iamF2YWVlYXJ0aWZhY3QiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8cGFyYW1ldGVyIG5hbWU9Im1lbnVJbmRleCIgdmFsdWU9IjEwIiAvPgotICAgICAgICAgPC9jbGFzcz4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVTZXJ2bGV0V2ViUmVnaW9uV2l6YXJkLmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICAKLSAgICAgIDwhLS1uZXcgZmlsdGVyIGNvbnRyaWJ1dGlvbi0tPiAgICAgIAotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3ZmlsdGVyX3dpei5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLkFkZEZpbHRlcldpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVGaWx0ZXJXZWJSZWdpb25XaXphcmQubmFtZSI+Ci0gICAgICAgICA8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5BZGRGaWx0ZXJXaXphcmQiPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJqYXZhZWVhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWVudUluZGV4IiB2YWx1ZT0iMjAiIC8+Ci0gICAgICAgICA8L2NsYXNzPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJUZpbHRlcldlYlJlZ2lvbldpemFyZC5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgCi0gICAgICA8IS0tbmV3IGxpc3RlbmVyIGNvbnRyaWJ1dGlvbi0tPgotIAkgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVMaXN0ZW5lcldlYlJlZ2lvbldpemFyZC5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L25ld2xpc3RlbmVyX3dpei5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQWRkTGlzdGVuZXJXaXphcmQiPgotICAgICAgICAgPGNsYXNzIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQWRkTGlzdGVuZXJXaXphcmQiPgotICAgICAgICAgICAgPHBhcmFtZXRlciBuYW1lPSJqYXZhZWVhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4KLSAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ibWVudUluZGV4IiB2YWx1ZT0iMzAiIC8+Ci0gICAgICAgICA8L2NsYXNzPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgJUxpc3RlbmVyV2ViUmVnaW9uV2l6YXJkLmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAgICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iJXdlYi5jYXRlZ29yeV91aV8iCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSI+Ci0gICAgICA8L2NhdGVnb3J5PiAgICAgICAgIAotICAgIDx3aXphcmQKLSAgICAgICAgICAgIG5hbWU9IiVXYXJJbXBvcnRXaXphcmQubmFtZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi9pbXBvcnR3YXJfd2l6LmdpZiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkNvbXBvbmVudEltcG9ydFdpemFyZCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAlV2FySW1wb3J0V2l6YXJkLmRlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlbGVjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0gICAgICAgICA8L3NlbGVjdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgICAgCi0gICAgPC9leHRlbnNpb24+Ci0gICAgCi0gIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBuYW1lPSIld2ViLmNhdGVnb3J5X3VpXyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIj4KLSAgICAgIDwvY2F0ZWdvcnk+ICAgICAgICAgCi0gICAgPHdpemFyZAotICAgICAgICAgICAgbmFtZT0iJVdhcmV4cG9ydFdpemFyZC5uYW1lIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9jdG9vbDE2L2V4cG9ydHdhcl93aXouZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5XZWJDb21wb25lbnRFeHBvcnRXaXphcmQiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVXYXJleHBvcnRXaXphcmQuZGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VsZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLSAgICAgICAgIDwvc2VsZWN0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWkuZXh0ZW5kYWJsZVdpemFyZCI+Ci0gICAgICA8ZXh0ZW5kYWJsZVdpemFyZAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLldlYk1vZHVsZUNyZWF0aW9uV2l6YXJkIj4KLSAgICAgIDwvZXh0ZW5kYWJsZVdpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0JCTxhY3Rpb25TZXQKLQkJCWxhYmVsPSIlQ29udmVydFdlYlByb2plY3RUeXBlIgotCQkJZGVzY3JpcHRpb249IiVDb252ZXJ0V2ViUHJvamVjdFR5cGUiCi0JCQl2aXNpYmxlPSJ0cnVlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmFjdGlvbnMuQ29udmVydFRvV2ViTW9kdWxlVHlwZUFjdGlvblNldCI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVjb252ZXJ0V2ViUHJvamVjdFR5cGVBY3Rpb24ubGFiZWwiCi0JCQkJdG9vbHRpcD0iJUNvbnZlcnRXZWJQcm9qZWN0VHlwZUFjdGlvbi50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJwcm9qZWN0L2FkZGl0aW9ucyIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuYWN0aW9ucy5Db252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uIgotCQkJCWVuYWJsZXNGb3I9IjEiCi0JCQkJaWQ9ImNvbnZlcnRUb1dlYk1vZHVsZVR5cGVBY3Rpb24iPiAgIAotCQkJCTxlbmFibGVtZW50PgotCQkJCQk8YW5kPgotCQkJCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+Ci0JCQkJCQk8IS0tPG9iamVjdFN0YXRlCi0JICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJmYWNldCIKLQkgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJ3c3Qud2ViIj4KLQkgICAgICAgICAgICAgICAgICAgICA8L29iamVjdFN0YXRlPiAtLT4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9lbmFibGVtZW50PiAgICAgICAgICAgIAotCQkJPC9hY3Rpb24+Ci0JCTwvYWN0aW9uU2V0PgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkID0gImNvbnZlcnRUb1dlYk1vZHVsZVR5cGVBY3Rpb24iPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGxhYmVsPSIlc3RhdGljLndlYi5wcm9qZWN0X3VpXyIKLSAgICAgICAgICAgICAgIHBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGlkPSJDb252ZXJ0V2ViUHJvamVjdFR5cGUiPgotICAgICAgICAgICAgPHNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgbmFtZT0iQ29udmVydFdlYlByb2plY3RUeXBlIj4KLSAgICAgICAgICAgIDwvc2VwYXJhdG9yPgotICAgICAgICAgPC9tZW51PgotICAgICAgICA8YWN0aW9uCi0JCQkJbGFiZWw9IiVjb252ZXJ0V2ViUHJvamVjdFR5cGVBY3Rpb24ubGFiZWwiCi0JCQkJdG9vbHRpcD0iJUNvbnZlcnRXZWJQcm9qZWN0VHlwZUFjdGlvbi50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJDb252ZXJ0V2ViUHJvamVjdFR5cGUvQ29udmVydFdlYlByb2plY3RUeXBlIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5hY3Rpb25zLkNvbnZlcnRUb1dlYk1vZHVsZVR5cGVBY3Rpb24iCi0JCQkJZW5hYmxlc0Zvcj0iMSIKLQkJCQlpZD0iY29udmVydFRvV2ViTW9kdWxlVHlwZUFjdGlvbiI+Ci0JCTwvYWN0aW9uPgotCQk8ZW5hYmxlbWVudD4KLQkJICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9IndzdC53ZWIiIC8+Ci0JCQkJCTwvYWRhcHQ+Ci0JCTwvZW5hYmxlbWVudD4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgCi0gICAgPC9leHRlbnNpb24+Ci0KLSAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRXh0ZW5zaW9uIHBvaW50OiBvcmcuZWNsaXBzZS5ldG9vbHMuc2VydmVyLmNvcmUubW9kdWxlT2JqZWN0QWRhcHRlcnMgLS0+Ci08IS0tIFB1cnBvc2U6IERlZmluZSBhZGFwdGVycyBmb3IgV2ViIHJlc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2R1bGVBcnRpZmFjdEFkYXB0ZXJzIj4gIAotICAgICAgCi0gICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53ZWIuc2VydmVyLndlYnJlc291cmNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4gICAgIAotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAiLz4KLSAgICAgICAgICAgPC93aXRoPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+IAotICAgICAgCi0gICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYi5zZXJ2ZXIud2VicmVzb3VyY2UyIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+ICAgICAgCi0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5TZXJ2bGV0Ii8+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLSAgICAgICAKLSAgICAgICA8bW9kdWxlQXJ0aWZhY3RBZGFwdGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndlYi5zZXJ2ZXIud2VicmVzb3VyY2UzIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzLldlYkRlcGxveWFibGVBcnRpZmFjdEFkYXB0ZXJGYWN0b3J5Ij4gICAgIAotICAgICAgICAgPGVuYWJsZW1lbnQ+Ci0gICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJzZWxlY3Rpb24iPgotICAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgPHRlc3QgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJdmFsdWU9ImpzdC53ZWI6Mi40XSIgLz4KLQkJCSA8L2FkYXB0PgotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+ICAgICAKLSAgICAgICAKLSAgICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53ZWIuc2VydmVyLndlYnJlc291cmNlNCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLSAgICAgICAgICAgICA8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LndlYjoyLjRdIiAvPgotCQkJIDwvYWRhcHQ+Ci0gICAgICAgICAgIDwvd2l0aD4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgICA8L21vZHVsZUFydGlmYWN0QWRhcHRlcj4KLQotICAgICAgPG1vZHVsZUFydGlmYWN0QWRhcHRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53ZWIuc2VydmVyLndlYnJlc291cmNlNSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgICAgCi0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgPHdpdGggdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQiPgotICAgICAgICAgICAgIDx0ZXN0IGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LndlYjoyLjRdIiAvPgotCQkJPC9hZGFwdD4JCQkJICAgICAgICAgICAgIAotICAgICAgICAgICA8L3dpdGg+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPC9tb2R1bGVBcnRpZmFjdEFkYXB0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICAgPC9mYWN0b3J5PgotICAgICAgICA8ZmFjdG9yeQotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeSIKLSAgICAgICAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0Ij4KLSAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldCI+Ci0gICAgICAgICAgICAgPGFkYXB0ZXIgdHlwZT0gIm9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSUxhdW5jaGFibGUiLz4KLSAgICAgICA8L2ZhY3Rvcnk+Ci0gICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwIj4KLSAgICAgICAgICAgICA8YWRhcHRlciB0eXBlPSAib3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JTGF1bmNoYWJsZSIvPgotICAgICAgIDwvZmFjdG9yeT4gCi0gICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuZGVwbG95YWJsZXMuV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkiCi0gICAgICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLlNlcnZsZXQiPgotICAgICAgICAgICAgIDxhZGFwdGVyIHR5cGU9ICJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlIi8+Ci0gICAgICAgPC9mYWN0b3J5PgotICAgICAgICAgIAotICAgPC9leHRlbnNpb24+ICAKLSAgCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gICAgICAgICAgIExhYmVsIERlY29yYXRvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gIAotICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5kZWNvcmF0b3JzIj4KLSAgICAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgICAgIGxpZ2h0d2VpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgbGFiZWw9IiVzZXJ2bGV0QW5ub3RhdGlvbkRlY29yYXRvciIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC51aS51dGlsLkFubm90YXRpb25JY29uRGVjb3JhdG9yIgotICAgICAgICAgICAgICAgc3RhdGU9InRydWUiCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iVE9QX0xFRlQiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudWkudXRpbC5Bbm5vdGF0aW9uSWNvbkRlY29yYXRvcl9zZXJ2bGV0Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICVzZXJ2bGV0QW5ub3RhdGlvbkRlY29yYXRvci5kZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgICA8b2JqZWN0Q2xhc3MKLSAgICAgICAgICAgICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0Ij4KLSAgICAgICAgICAgICAgPC9vYmplY3RDbGFzcz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvZGVjb3JhdG9yPgotICAgIDwvZXh0ZW5zaW9uPiAKLSAgICAKLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLndpemFyZFBhZ2VzIj4KLSAgICA8d2l6YXJkLXBhZ2VzIGFjdGlvbj0ianN0LndlYi5pbnN0YWxsIj4KLSAgICAgIDxwYWdlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0LldlYkZhY2V0SW5zdGFsbFBhZ2UiLz4KLSAgICA8L3dpemFyZC1wYWdlcz4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkuaW1hZ2VzIj4KLSAgICA8aW1hZ2UgZmFjZXQ9ImpzdC53ZWIiIHBhdGg9Imljb25zL3dhci5naWYiLz4KLSAgPC9leHRlbnNpb24+Ci0gIAotICA8ZXh0ZW5zaW9uCi0gICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5jbGFzc3BhdGhDb250YWluZXJQYWdlIj4KLSAgICA8Y2xhc3NwYXRoQ29udGFpbmVyUGFnZQotICAgICAgbmFtZT0iJXdlYkFwcExpYnJhcmllc0NvbnRhaW5lck5hbWUiCi0gICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLldlYkFwcExpYnJhcmllc0NvbnRhaW5lclBhZ2UiCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmNvbnRhaW5lciI+Ci0gICAgPC9jbGFzc3BhdGhDb250YWluZXJQYWdlPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQiPgotICAgICA8bmF2aWdhdG9yQ29udGVudAotICAgICAgICAgICBhY3RpdmVCeURlZmF1bHQ9InRydWUiCi0gICAgICAgICAgIGNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLldlYkphdmFDb250ZW50UHJvdmlkZXIiCi0gICAgICAgICAgIGljb249Imljb25zL2Z1bGwvY3Rvb2wxNi93ZWJqYXZhLWljb24uZ2lmIgotICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuRW5oYW5jZWRKYXZhUmVuZGVyaW5nIgotICAgICAgICAgICBsYWJlbFByb3ZpZGVyPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuV2ViSmF2YUxhYmVsUHJvdmlkZXIiCi0gICAgICAgICAgIG5hbWU9IiVlbmhhbmNlZC5qYXZhLmZvci53ZWIubmFtZSIKLSAgICAgICAgICAgcHJpb3JpdHk9ImhpZ2hlciI+Ci0gICAgICAgIDxvdmVycmlkZQotICAgICAgICAgICAgICBwb2xpY3k9Ikludm9rZU9ubHlJZlN1cHByZXNzZWRFeHRBbHNvVmlzaWJsZUFuZEFjdGl2ZSIKLSAgICAgICAgICAgICAgc3VwcHJlc3NlZEV4dGVuc2lvbklkPSJvcmcuZWNsaXBzZS5qZHQuamF2YS51aS5qYXZhQ29udGVudCIvPgkJCQkJICAgCi0gICAgICAgIDx0cmlnZ2VyUG9pbnRzPgotICAgICAgICAJPG9yPgotCQkJCTxhbmQ+Ci0JCQkJCTxhZGFwdAotCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJPG9yPiAKLQkJCQkJCQk8dGVzdCBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2FuZD4KLQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLklDb21wcmVzc2VkTm9kZSIgLz4KLQkJCTwvb3I+ICAgICAgICAKLSAgICAgICAgPC90cmlnZ2VyUG9pbnRzPgotICAgICAgICA8cG9zc2libGVDaGlsZHJlbj4KLSAgICAgICAgICAgPG9yPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLkNvbXByZXNzZWRKYXZhUHJvamVjdCIvPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3QiLz4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQiLz4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXIiLz4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldy5DbGFzc1BhdGhDb250YWluZXIiLz4KLSAgICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5Db21wcmVzc2VkSmF2YUxpYnJhcmllcyIvPgotICAgICAgICAgICA8L29yPgotICAgICAgICA8L3Bvc3NpYmxlQ2hpbGRyZW4+IAotCQk8YWN0aW9uUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IucmVzb3VyY2VzLmFjdGlvbnMuTmV3QWN0aW9uUHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuRW5oYW5jZWRKYXZhUmVuZGVyaW5nLmFjdGlvbnMuTmV3QWN0aW9uUHJvdmlkZXIiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPGluc3RhbmNlb2YKLQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5JQ29tcHJlc3NlZE5vZGUiIC8+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvYWN0aW9uUHJvdmlkZXI+ICAgICAgICAKLSAgICAgICAgPGNvbW1vblNvcnRlcgotICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLkNvbXByZXNzZWRKYXZhU29ydGVyIgotICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuRW5oYW5jZWRKYXZhUmVuZGVyaW5nLnNvcnRlciI+Ci0gICAgICAgICAgIDxwYXJlbnRFeHByZXNzaW9uPgotICAgICAgICAgICAgICA8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLkNvbXByZXNzZWRKYXZhUHJvamVjdCIvPgotICAgICAgICAgICA8L3BhcmVudEV4cHJlc3Npb24+Ci0gICAgICAgIDwvY29tbW9uU29ydGVyPgotIAotCQkgICA8Y29tbW9uV2l6YXJkCi0JCSAgICAgICAgdHlwZT0ibmV3IgotCQkgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdQYWNrYWdlQ3JlYXRpb25XaXphcmQiPgotCQkgICAgIDxlbmFibGVtZW50PgotCQkJCTxpbnN0YW5jZW9mCi0JCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSUNvbXByZXNzZWROb2RlIiAvPgotCQkgICAgIDwvZW5hYmxlbWVudD4KLQkJICA8L2NvbW1vbldpemFyZD4KLQkJICA8Y29tbW9uV2l6YXJkCi0JCSAgICAgICAgdHlwZT0ibmV3IgotCQkgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdDbGFzc0NyZWF0aW9uV2l6YXJkIj4KLQkJICAgICA8ZW5hYmxlbWVudD4KLQkJCQk8aW5zdGFuY2VvZgotCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLklDb21wcmVzc2VkTm9kZSIgLz4KLQkJICAgICA8L2VuYWJsZW1lbnQ+Ci0JCSAgPC9jb21tb25XaXphcmQ+Ci0KLSAgIAkgICAgICA8Y29tbW9uV2l6YXJkCi0JCSAgICAgICAgdHlwZT0ibmV3IgotCQkgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdJbnRlcmZhY2VDcmVhdGlvbldpemFyZCI+Ci0JCSAgICAgPGVuYWJsZW1lbnQ+Ci0JCQkJPGluc3RhbmNlb2YKLQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5JQ29tcHJlc3NlZE5vZGUiIC8+Ci0JCSAgICAgPC9lbmFibGVtZW50PgotCQkgIDwvY29tbW9uV2l6YXJkPiAKLQkJICAgIDxjb21tb25XaXphcmQKLQkJICAgICAgICAgIHR5cGU9Im5ldyIKLQkJICAgICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdTb3VyY2VGb2xkZXJDcmVhdGlvbldpemFyZCI+Ci0JCQkJPGVuYWJsZW1lbnQ+CQkJCSAgICAgICAgCi0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yLklDb21wcmVzc2VkTm9kZSIgLz4KLQkJCSAgICAgPC9lbmFibGVtZW50PgotCQkJIDwvY29tbW9uV2l6YXJkPiAgICAgICAgCQkJIAotICAgICA8L25hdmlnYXRvckNvbnRlbnQ+Ci0gIDwvZXh0ZW5zaW9uPgotICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3Iudmlld2VyIj4KLSAgICAgPHZpZXdlckNvbnRlbnRCaW5kaW5nIHZpZXdlcklkPSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIj4KLSAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICA8Y29udGVudEV4dGVuc2lvbiBwYXR0ZXJuPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5FbmhhbmNlZEphdmFSZW5kZXJpbmciLz4KLSAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgPC92aWV3ZXJDb250ZW50QmluZGluZz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgIDxmYWN0b3J5Ci0gICAgICAgICAgIGFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvci5Db21wcmVzc2VkSmF2YVByb2plY3QiCi0gICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQ29tcHJlc3NlZE5vZGVBZGFwdGVyRmFjdG9yeSI+Ci0gICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdCIvPgotICAgICAgICA8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQiLz4KLSAgICAgPC9mYWN0b3J5PgotICA8L2V4dGVuc2lvbj4KLSAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvcHJvcGVydHlfZmlsZXMvd2ViX3VpLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3Byb3BlcnR5X2ZpbGVzL3dlYl91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzgyOTZjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvcHJvcGVydHlfZmlsZXMvd2ViX3VpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1fMD1GYWlsZWQgdG8gZmluZCB0aGUgaW1hZ2UgInswfSIuCi1fMT1OZXcgRHluYW1pYyBXZWIgUHJvamVjdAotXzI9U2VydmxldCB2ZXJzaW9uOgotXzM9RHluYW1pYyBXZWIgUHJvamVjdAotXzQ9Q3JlYXRlIGEgc3RhbmRhbG9uZSBEeW5hbWljIFdlYiBwcm9qZWN0IG9yIGFkZCBpdCB0byBhIG5ldyBvciBleGlzdGluZyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uLgotXzU9V2ViIHByb2plY3Q6Ci1fNj1XQVIgZmlsZToKLV83PUltcG9ydCBhIFdBUiBmaWxlIGZyb20gdGhlIGZpbGUgc3lzdGVtCi1fOD1XQVIgSW1wb3J0Ci1fOT1XQVIgRXhwb3J0Ci1fMTA9RXhwb3J0IFdlYiBwcm9qZWN0IHRvIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS4KLV8xMT1Db250ZXh0IFJvb3Q6Ci1fMTI9Q29udmVydCBTaW1wbGUgV2ViIHRvIFdlYiBNb2R1bGUKLV8xMz1Db252ZXJ0IFNpbXBsZSBXZWIgdG8gV2ViIE1vZHVsZS4KLV8xND1XQVIgSW1wb3J0OiBXZWIgbGlicmFyaWVzCi1fMTU9U2VsZWN0IHRoZSB3ZWIgbGlicmFyeSBqYXJzIGZyb20gdGhlIGxpc3QgYmVsb3cgdG8gYmUgaW1wb3J0ZWQgYXMgd2ViIGxpYnJhcnkgcHJvamVjdHMuICBVbnNlbGVjdGVkIHdlYiBsaWJyYXJpZXMgd2lsbCBiZSBpbXBvcnRlZCBhcyBqYXJzIGluIHRoZSBXRUItSU5GL2xpYiBkaXJlY3RvcnkuCi1fMTY9U2VsZWN0IEFsbAotXzE3PURlc2VsZWN0IEFsbAotCi1BRERfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFPUNyZWF0ZSBTZXJ2bGV0Ci1BRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRT1DcmVhdGUgU2VydmxldAotQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfREVTQz1FbnRlciBzZXJ2bGV0IGRlcGxveW1lbnQgZGVzY3JpcHRvciBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KLQotQUREX0ZJTFRFUl9XSVpBUkRfV0lORE9XX1RJVExFPUNyZWF0ZSBGaWx0ZXIKLUFERF9GSUxURVJfV0laQVJEX1BBR0VfVElUTEU9Q3JlYXRlIEZpbHRlcgotQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9ERVNDPUVudGVyIHNlcnZsZXQgZmlsdGVyIGRlcGxveW1lbnQgZGVzY3JpcHRvciBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KLQotQUREX0xJU1RFTkVSX1dJWkFSRF9XSU5ET1dfVElUTEU9Q3JlYXRlIExpc3RlbmVyCi1BRERfTElTVEVORVJfV0laQVJEX1BBR0VfVElUTEU9Q3JlYXRlIExpc3RlbmVyCi1BRERfTElTVEVORVJfV0laQVJEX1BBR0VfREVTQz1TZWxlY3QgdGhlIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBldmVudHMgdG8gbGlzdGVuIHRvLiAKLQotRElTUEFUQ0hFUl9SRVFVRVNUPVJFUVVFU1QKLURJU1BBVENIRVJfRk9SV0FSRD1GT1JXQVJECi1ESVNQQVRDSEVSX0lOQ0xVREU9SU5DTFVERQotRElTUEFUQ0hFUl9FUlJPUj1FUlJPUgotCi1ERUZBVUxUX1BBQ0tBR0U9KGRlZmF1bHQgcGFja2FnZSkKLVNFTEVDVF9DTEFTU19USVRMRT1TZWxlY3QgQ2xhc3MKLU1BUF9DTEFTU19OQU1FX1RPX0NMQVNTX0VSUk9SX01TRz1JV0FFMDA2MEUgQ291bGQgbm90IHVuaXF1ZWx5IG1hcCB0aGUgY2xhc3MgbmFtZSB0byBhIGNsYXNzLgotRU1QVFlfTElTVF9NU0c9RW1wdHkgTGlzdAotQUREX0xBQkVMPUFkZAotVVNFX0VYSVNUSU5HX1NFUlZMRVRfQ0xBU1M9VXNlIGFuIGV4aXN0aW5nIFNlcnZsZXQgY2xhc3Mgb3IgSlNQCi1VU0VfRVhJU1RJTkdfRklMVEVSX0NMQVNTPVVzZSBleGlzdGluZyBGaWx0ZXIgY2xhc3MKLVVTRV9FWElTVElOR19MSVNURU5FUl9DTEFTUz1Vc2UgZXhpc3RpbmcgTGlzdGVuZXIgY2xhc3MKLUlOSVRfUEFSQU1fVElUTEU9SW5pdGlhbGl6YXRpb24gUGFyYW1ldGVycwotSU5JVF9QQVJBTV9MQUJFTD1Jbml0aWFsaXphdGlvbiBQYXJhbWV0ZXJzOgotVVJMX01BUFBJTkdTX1RJVExFPVVSTCBNYXBwaW5ncwotVVJMX01BUFBJTkdTX0xBQkVMPVVSTCBNYXBwaW5nczoKLUNIT09TRV9TRVJWTEVUX0NMQVNTPUNob29zZSBhIHNlcnZsZXQgY2xhc3M6Ci0KLU5FV19TRVJWTEVUX1dJWkFSRF9XSU5ET1dfVElUTEU9TmV3IFNlcnZsZXQKLU5FV19TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFPVNlcnZsZXQKLU5FV19TRVJWTEVUX1dJWkFSRF9QQUdFX0RFU0M9Q3JlYXRlIGEgbmV3IHNlcnZsZXQuCi1TRVJWTEVUX1BBQ0tBR0VfTEFCRUw9SmF2YSBwYWNrYWdlOgotU0VSVkxFVF9OQU1FX0xBQkVMPVNlcnZsZXQgbmFtZToKLQotTkVXX0ZJTFRFUl9XSVpBUkRfV0lORE9XX1RJVExFPU5ldyBGaWx0ZXIKLUNIT09TRV9GSUxURVJfQ0xBU1M9Q2hvb3NlIGEgZmlsdGVyIGNsYXNzCi1TRVJWTEVUX01BUFBJTkdTX0xBQkVMPVNlcnZsZXQgTWFwcGluZ3M6Ci1GSUxURVJfTUFQUElOR1NfTEFCRUw9RmlsdGVyIE1hcHBpbmdzOgotCi1BRERfTElTVEVORVJfV0laQVJEX1NFUlZMRVRfQ09OVEVYVF9FVkVOVFM9U2VydmxldCBDb250ZXh0IEV2ZW50cwotQUREX0xJU1RFTkVSX1dJWkFSRF9IVFRQX1NFU1NJT05fRVZFTlRTPUhUVFAgU2Vzc2lvbiBFdmVudHMKLUFERF9MSVNURU5FUl9XSVpBUkRfU0VSVkxFVF9SRVFVRVNUX0VWRU5UUz1TZXJ2bGV0IFJlcXVlc3QgRXZlbnRzCi1BRERfTElTVEVORVJfV0laQVJEX0xJRkVDWUNMRT1MaWZlY3ljbGUKLUFERF9MSVNURU5FUl9XSVpBUkRfQ0hBTkdFU19UT19BVFRSSUJVVEVTPUNoYW5nZXMgdG8gYXR0cmlidXRlcwotQUREX0xJU1RFTkVSX1dJWkFSRF9TRVNTSU9OX01JR1JBVElPTj1TZXNzaW9uIG1pZ3JhdGlvbgotQUREX0xJU1RFTkVSX1dJWkFSRF9PQkpFQ1RfQklORElORz1PYmplY3QgYmluZGluZwotCi1BRERfQlVUVE9OX0xBQkVMPUFkZC4uLgotRURJVF9CVVRUT05fTEFCRUw9RWRpdC4uLgotUkVNT1ZFX0JVVFRPTl9MQUJFTD1SZW1vdmUKLVVSTF9QQVRURVJOX1RJVExFPVVSTCBQYXR0ZXJucwotVVJMX1BBVFRFUk5fTEFCRUw9UGF0dGVybjoKLUZPTERFUl9MQUJFTD1Gb2xkZXI6Ci1KQVZBX1BBQ0tBR0VfTEFCRUw9SmF2YSBwYWNrYWdlOgotQ0xBU1NfTkFNRV9MQUJFTD1DbGFzcyBuYW1lOgotU1VQRVJDTEFTU19MQUJFTD1TdXBlcmNsYXNzOgotQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVElUTEU9Q29udGFpbmVyIFNlbGVjdGlvbgotQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfREVTQz1DaG9vc2UgYSBDb250YWluZXI6Ci1DT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19WQUxJREFUT1JfTUVTRz1DaG9vc2UgdGhlIFdlYiBDb250ZW50IEZvbGRlciBvciBpdHMgc3ViZm9sZGVyCi1QQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfVElUTEU9UGFja2FnZSBTZWxlY3Rpb24KLVBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDPUNob29zZSBhIHBhY2thZ2U6Ci1QQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfTVNHX05PTkU9Tm8gcGFja2FnZXMgdG8gY2hvb3NlIGZyb20KLVNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19USVRMRT1TdXBlcmNsYXNzIFNlbGVjdGlvbgotU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX0RFU0M9Q2hvb3NlIGEgc3VwZXJjbGFzczoKLUlOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFPUludGVyZmFjZSBTZWxlY3Rpb24KLUlOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX0RFU0M9Q2hvb3NlIGludGVyZmFjZXM6Ci1JTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORT0nJ3swfScnIGFkZGVkLgotSkFWQV9DTEFTU19NT0RJRklFUlNfTEFCRUw9TW9kaWZpZXJzOgotSkFWQV9DTEFTU19QVUJMSUNfQ0hFQ0tCT1hfTEFCRUw9UHVibGljCi1KQVZBX0NMQVNTX0FCU1RSQUNUX0NIRUNLQk9YX0xBQkVMPUFic3RyYWN0Ci1KQVZBX0NMQVNTX0ZJTkFMX0NIRUNLQk9YX0xBQkVMPUZpbmFsCi1KQVZBX0NMQVNTX0lOVEVSRkFDRVNfTEFCRUw9SW50ZXJmYWNlczoKLUpBVkFfQ0xBU1NfTUVUSE9EX1NUVUJTX0xBQkVMPVdoaWNoIG1ldGhvZCBzdHVicyB3b3VsZCB5b3UgbGlrZSB0byBjcmVhdGU/Ci1KQVZBX0NMQVNTX01BSU5fQ0hFQ0tCT1hfTEFCRUw9cHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLUpBVkFfQ0xBU1NfQ09OU1RSVUNUT1JfQ0hFQ0tCT1hfTEFCRUw9Q29uc3RydWN0b3JzIGZyb20gc3VwZXJjbGFzcwotSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMPUluaGVyaXRlZCBhYnN0cmFjdCBtZXRob2RzCi1KQVZBX0NMQVNTX0JST1dFUl9ESUFMT0dfVElUTEU9SmF2YSBDbGFzcyBCcm93c2VyCi1KQVZBX0NMQVNTX0JST1dFUl9ESUFMT0dfTUVTU0FHRT1Ccm93c2UgZm9yIGEgSmF2YSBjbGFzcwotCi1OQU1FX1RJVExFPU5hbWUKLU5BTUVfTEFCRUw9TmFtZToKLURFU0NSSVBUSU9OX1RJVExFPURlc2NyaXB0aW9uCi1ERVNDUklQVElPTl9MQUJFTD1EZXNjcmlwdGlvbjoKLVZBTFVFX1RJVExFPVZhbHVlCi1WQUxVRV9MQUJFTD1WYWx1ZToKLVVSTF9TRVJWTEVUX0xBQkVMPVVSTCBQYXR0ZXJuIC8gU2VydmxldCBOYW1lCi1ESVNQQVRDSEVSU19MQUJFTD1EaXNwYXRjaGVycwotCi1CUk9XU0VfQlVUVE9OX0xBQkVMPUJyb3dzZS4uLgotUkVNT1ZFX0JVVFRPTj1SZW1vdmUKLVNFTEVDVF9BTExfQlVUVE9OPVNlbGVjdCAmQWxsCi1DTEVBUl9CVVRUT049JkNsZWFyCi0KLU5FV19KQVZBX0NMQVNTX0RFU1RJTkFUSU9OX1dJWkFSRF9QQUdFX0RFU0M9U3BlY2lmeSBjbGFzcyBmaWxlIGRlc3RpbmF0aW9uLgotTkVXX0pBVkFfQ0xBU1NfT1BUSU9OU19XSVpBUkRfUEFHRV9ERVNDPVNwZWNpZnkgbW9kaWZpZXJzLCBpbnRlcmZhY2VzIHRvIGltcGxlbWVudCwgYW5kIG1ldGhvZCBzdHVicyB0byBnZW5lcmF0ZS4KLQotSW1wb3J0V0FSQWN0aW9uX1VJXz1JbXBvcnQgV2ViIE1vZHVsZS4uLgotRXhwb3J0V0FSQWN0aW9uX1VJXz1FeHBvcnQgV0FSIGZpbGUuLi4KLQotTk9fV0VCX1BST0pFQ1RTPU5vIFdlYiBQcm9qZWN0cwotCi1TRVJWTEVUUyA9U2VydmxldHMKLQotV0VCX0NPTlRfTkFNRSA9IFdlYkFwcENvbnRhaW5lclBhZ2UKLVdFQl9DT05UX1BBR0VfVElUTEUgPSBXZWIgQXBwIExpYnJhcmllcyBDb250YWluZXIKLVdFQl9DT05UX1BBR0VfREVTQ1JJUFRJT04gPSBUaGlzIGNvbnRhaW5lciBkeW5hbWljYWxseSBwb3B1bGF0ZXMgY2xhc3NwYXRoIGVudHJpZXMgZnJvbSB0aGUgV0VCLUlORi9saWIgYW5kIFdFQi1JTkYvY2xhc3NlcyBkaXJlY3RvcmllcyBvZiBhIHdlYiBhcHAuCi1XRUJfQ09OVF9QQUdFX0NPTVBfTEFCRUwgPSBDb21wb25lbnQ6Ci1XRUJDT05URU5UPVdlYiBDb250ZW50IGZvbGRlcjoKLQotCi1Db21wcmVzc2VkX0xpYnJhcmllcz0gTGlicmFyaWVzCi1Db21wcmVzc2VkX0phdmFSZXNvdXJjZXM9IEphdmEgUmVzb3VyY2VzezB9Ci0KLUNvbnZlcnRUb1dlYlRpdGxlPUNvbnZlcnQgdG8gRHluYW1pYyBXZWIgUHJvamVjdAotU2VsZWN0V2ViVmVyc2lvbj1TZWxlY3QgYSBEeW5hbWljIFdlYiBtb2R1bGUgdmVyc2lvbjoKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9JV2ViVUlDb250ZXh0SWRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvSVdlYlVJQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjYxNWYzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9JV2ViVUlDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aTsKLQotcHVibGljIGludGVyZmFjZSBJV2ViVUlDb250ZXh0SWRzIHsKLQotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX1NFUlZMRVRfVUkgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19EWU5BTUlDX1dFQl9QUk9KRUNUX1BBR0UxID0gUExVR0lOX1NFUlZMRVRfVUkgKyAid2VidzEwMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RZTkFNSUNfV0VCX1BST0pFQ1RfUEFHRTIgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJ3ZWJ3MTEwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRFlOQU1JQ19XRUJfUFJPSkVDVF9QQUdFMyA9IFBMVUdJTl9TRVJWTEVUX1VJICsgIndlYncxMjAwIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUl9JTVBPUlRfUEFHRTEgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJ3ZWJpMTAwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfSU1QT1JUX1BBR0UyID0gUExVR0lOX1NFUlZMRVRfVUkgKyAid2ViaTExMDAiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSX0VYUE9SVF9QQUdFMSA9IFBMVUdJTl9TRVJWTEVUX1VJICsgIndlYmUxMDAwIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkVESVRPUl9TRVJWTEVUX1BBR0VfQUREX1NFUlZMRVRfV0laQVJEXzEgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJzcnZ3MTA1MCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJFRElUT1JfU0VSVkxFVF9QQUdFX0FERF9TRVJWTEVUX1dJWkFSRF8yID0gUExVR0lOX1NFUlZMRVRfVUkgKyAic3J2dzExMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCRURJVE9SX1NFUlZMRVRfUEFHRV9BRERfU0VSVkxFVF9XSVpBUkRfMyA9IFBMVUdJTl9TRVJWTEVUX1VJICsgInNydncxMjAwIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkVESVRPUl9MSVNURU5FUl9QQUdFX0FERF9MSVNURU5FUl9XSVpBUkRfMSA9IFBMVUdJTl9TRVJWTEVUX1VJICsgImxzdHcxMDUwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJFRElUT1JfTElTVEVORVJfUEFHRV9BRERfTElTVEVORVJfV0laQVJEXzIgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJsc3R3MTEwMCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCRURJVE9SX0xJU1RFTkVSX1BBR0VfQUREX0xJU1RFTkVSX1dJWkFSRF8zID0gUExVR0lOX1NFUlZMRVRfVUkgKyAibHN0dzEyMDAiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCRURJVE9SX0ZJTFRFUl9QQUdFX0FERF9GSUxURVJfV0laQVJEXzEgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJmbHR3MTA1MCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCRURJVE9SX0ZJTFRFUl9QQUdFX0FERF9GSUxURVJfV0laQVJEXzIgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJmbHR3MTEwMCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCRURJVE9SX0ZJTFRFUl9QQUdFX0FERF9GSUxURVJfV0laQVJEXzMgPSBQTFVHSU5fU0VSVkxFVF9VSSArICJmbHR3MTIwMCI7Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvYWN0aW9ucy9Db252ZXJ0VG9XZWJNb2R1bGVUeXBlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjFmNTEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2FjdGlvbnMvQ29udmVydFRvV2ViTW9kdWxlVHlwZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LkphdmFFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklDb252ZXJ0U3RhdGljV2ViVG9EeWFtbmljRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuQ29udmVydFRvV2ViTW9kdWxlVHlwZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogQ29udmVydCBhIHNpbXBsZSBzdGF0aWMgd2ViIHByb2plY3QgdG8gYSBKMkVFIER5bmFtaWMgV2ViIFByb2plY3QKLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRUb1dlYk1vZHVsZVR5cGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbiA9IG51bGw7Ci0JSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JSVdvcmtiZW5jaFdpbmRvdyBmV2luZG93OwotCi0JLyoqCi0JICogQ29udmVydExpbmtzRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbnZlcnRUb1dlYk1vZHVsZVR5cGVBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogbWFrZSBzdXJlIGEgd2ViIHByb2plY3QgaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFByb2plY3QoSVByb2plY3QgYVByb2plY3QpIHsKLQkJcmV0dXJuIEphdmFFRVByb2plY3RVdGlsaXRpZXMuaXNTdGF0aWNXZWJQcm9qZWN0KGFQcm9qZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBzZWxlY3Rpb25DaGFuZ2VkIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWJvb2xlYW4gYkVuYWJsZSA9IGZhbHNlOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWZTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWJFbmFibGUgPSB2YWxpZGF0ZVNlbGVjdGVkKGZTZWxlY3Rpb24pOwotCQl9Ci0JCSgoQWN0aW9uKSBhY3Rpb24pLnNldEVuYWJsZWQoYkVuYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogc2VsZWN0aW9uQ2hhbmdlZCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVNlbGVjdGVkKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmICghKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJT2JqZWN0IHNlbGVjdGVkUHJvamVjdCA9IGZTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmICghKHNlbGVjdGVkUHJvamVjdCBpbnN0YW5jZW9mIElQcm9qZWN0KSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlwcm9qZWN0ID0gKElQcm9qZWN0KSBzZWxlY3RlZFByb2plY3Q7Ci0JCXJldHVybiBpc1ZhbGlkUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBEZWZhdWx0Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkvLyBEZWZhdWx0Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0V29ya2JlbmNoV2luZG93cygpWzBdOwotCQkJQ29udmVydFRvV2ViTW9kdWxlVHlwZURpYWxvZyBkaWFsb2cgPSBuZXcgQ29udmVydFRvV2ViTW9kdWxlVHlwZURpYWxvZyh3aW5kb3cuZ2V0U2hlbGwoKSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCWRvQ29udmVydChDb252ZXJ0VG9XZWJNb2R1bGVUeXBlRGlhbG9nLmdldFNlbGVjdGVkVmVyc2lvbigpKTsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb0NvbnZlcnQoU3RyaW5nIHNlbGVjdGVkVmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJRGF0YU1vZGVsIG1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoSUNvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNEYXRhTW9kZWxQcm9wZXJ0aWVzLmNsYXNzKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSUNvbnZlcnRTdGF0aWNXZWJUb0R5YW1uaWNEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1QsIHByb2plY3QpOwotCQltb2RlbC5zZXRTdHJpbmdQcm9wZXJ0eShJQ29udmVydFN0YXRpY1dlYlRvRHlhbW5pY0RhdGFNb2RlbFByb3BlcnRpZXMuQ09OVkVSVF9UT19XRUJfVkVSU0lPTiwgQ29udmVydFRvV2ViTW9kdWxlVHlwZURpYWxvZy5nZXRTZWxlY3RlZFZlcnNpb24oKSk7Ci0JCW1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9hY3Rpb25zL05ld1dlYkNvbXBvbmVudEFjdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2FjdGlvbnMvTmV3V2ViQ29tcG9uZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMWVmNDQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL2FjdGlvbnMvTmV3V2ViQ29tcG9uZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hY3Rpb25zLkFic3RyYWN0T3BlbldpemFyZFdvcmtiZW5jaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5XRUJVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLnByb2plY3QuZmFjZXQuV2ViUHJvamVjdFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi1wdWJsaWMgY2xhc3MgTmV3V2ViQ29tcG9uZW50QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RPcGVuV2l6YXJkV29ya2JlbmNoQWN0aW9uIHsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQUJFTCA9IFdFQlVJTWVzc2FnZXMuV0VCX01PRFVMRV9XSVpfVElUTEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT04gPSAid2FyX3dpeiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgTmV3V2ViQ29tcG9uZW50QWN0aW9uKCkgewotCQlzdXBlcigpOwotCQlzZXRUZXh0KExBQkVMKTsgCi0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJQ09OKSk7Ci0JfQotCQotCXB1YmxpYyBOZXdXZWJDb21wb25lbnRBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFN0cmluZyBsYWJlbCwgQ2xhc3NbXSBhY3RpdmF0ZWRPblR5cGVzLCBib29sZWFuIGFjY2VwdEVtcHR5U2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHdvcmtiZW5jaCwgbGFiZWwsIGFjdGl2YXRlZE9uVHlwZXMsIGFjY2VwdEVtcHR5U2VsZWN0aW9uKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0JCi0JcHVibGljIE5ld1dlYkNvbXBvbmVudEFjdGlvbihJV29ya2JlbmNoIHdvcmtiZW5jaCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGFjY2VwdEVtcHR5U2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHdvcmtiZW5jaCwgbGFiZWwsIGFjY2VwdEVtcHR5U2VsZWN0aW9uKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElDT04pKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgV2l6YXJkIGNyZWF0ZVdpemFyZCgpIHsKLQkJcmV0dXJuIG5ldyBXZWJQcm9qZWN0V2l6YXJkKCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEFjY2VwdEVsZW1lbnQoT2JqZWN0IG9iaikgeyAKLQkJcmV0dXJuIHRydWU7IC8qIE5ld0dyb3VwLmlzT25CdWlsZFBhdGgob2JqKSAmJiAhTmV3R3JvdXAuaXNJbkFyY2hpdmUob2JqKTsgKi8KLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dUZXh0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvZGVwbG95YWJsZXMvV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWY0YzBjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9kZXBsb3lhYmxlcy9XZWJEZXBsb3lhYmxlQXJ0aWZhY3RBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLmRlcGxveWFibGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklMYXVuY2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5kZXBsb3lhYmxlcy5XZWJEZXBsb3lhYmxlQXJ0aWZhY3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUFydGlmYWN0QWRhcHRlckRlbGVnYXRlOwotCi1wdWJsaWMgY2xhc3MgV2ViRGVwbG95YWJsZUFydGlmYWN0QWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBNb2R1bGVBcnRpZmFjdEFkYXB0ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENsYXNzW10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NbXXtJTGF1bmNoYWJsZS5jbGFzc307Ci0JfQotCi0KLQlwdWJsaWMgSU1vZHVsZUFydGlmYWN0IGdldE1vZHVsZUFydGlmYWN0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFdlYkRlcGxveWFibGVBcnRpZmFjdFV0aWwuZ2V0TW9kdWxlT2JqZWN0KG9iaik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0NvbXByZXNzZWRKYXZhTGlicmFyaWVzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0NvbXByZXNzZWRKYXZhTGlicmFyaWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNjM4MDMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9Db21wcmVzc2VkSmF2YUxpYnJhcmllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLldFQlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMgaW1wbGVtZW50cyBJQ29tcHJlc3NlZE5vZGUgewotCQotCQotCXByaXZhdGUgQ29tcHJlc3NlZEphdmFQcm9qZWN0IGNvbXByZXNzZWRQcm9qZWN0OwotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0KLQlwdWJsaWMgQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMoQ29tcHJlc3NlZEphdmFQcm9qZWN0IGNvbXByZXNzZWRQcm9qZWN0KSB7IAotCQl0aGlzLmNvbXByZXNzZWRQcm9qZWN0ID0gY29tcHJlc3NlZFByb2plY3Q7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsgCi0JCWlmKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlID0gSmF2YVVJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfTElCUkFSWSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewkJCi0JCXJldHVybiBXRUJVSU1lc3NhZ2VzLkNvbXByZXNzZWRfTGlicmFyaWVzOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oSVRyZWVDb250ZW50UHJvdmlkZXIgZGVsZWdhdGVDb250ZW50UHJvdmlkZXIpIHsKLQkJCi0JCUxpc3QgY2xhc3NwYXRoQ29udGFpbmVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0W10gZGVsZWdhdGVDaGlsZHJlbiA9IGRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKGNvbXByZXNzZWRQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsZWdhdGVDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRlbGVnYXRlQ2hpbGRyZW5baV0gaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJCXRyeSB7Ci0JCQkJCUlDbGFzc3BhdGhFbnRyeSByYXdDbGFzc3BhdGhFbnRyeSA9ICgoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGRlbGVnYXRlQ2hpbGRyZW5baV0pLmdldFJhd0NsYXNzcGF0aEVudHJ5KCk7Ci0JCQkJCWlmIChyYXdDbGFzc3BhdGhFbnRyeS5nZXRFbnRyeUtpbmQoKSAhPSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiAmJiAKLQkJCQkJCQkJcmF3Q2xhc3NwYXRoRW50cnkuZ2V0RW50cnlLaW5kKCkgIT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpCi0JCQkJCQljbGFzc3BhdGhDb250YWluZXJzLmFkZChkZWxlZ2F0ZUNoaWxkcmVuW2ldKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCi0JCQkJfQotCQkJfSBlbHNlIGlmICghKGRlbGVnYXRlQ2hpbGRyZW5baV0gaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpICYmICEoZGVsZWdhdGVDaGlsZHJlbltpXSBpbnN0YW5jZW9mIElSZXNvdXJjZSkpIHsKLQkJCQljbGFzc3BhdGhDb250YWluZXJzLmFkZChkZWxlZ2F0ZUNoaWxkcmVuW2ldKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2xhc3NwYXRoQ29udGFpbmVycy50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIENvbXByZXNzZWRKYXZhUHJvamVjdCBnZXRDb21wcmVzc2VkUHJvamVjdCgpIHsKLQkJcmV0dXJuIGNvbXByZXNzZWRQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoKSB7IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQ29tcHJlc3NlZEphdmFQcm9qZWN0LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0NvbXByZXNzZWRKYXZhUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGYwMjVkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQ29tcHJlc3NlZEphdmFQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLlNlcnZsZXRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIENvbXByZXNzZWRKYXZhUHJvamVjdCBpbXBsZW1lbnRzIElDb21wcmVzc2VkTm9kZSwgSUFkYXB0YWJsZSB7IAotCQotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQlwcml2YXRlIENvbXByZXNzZWRKYXZhTGlicmFyaWVzIGNvbXByZXNzZWRMaWJyYXJpZXM7Ci0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsgCi0gCi0JcHVibGljIENvbXByZXNzZWRKYXZhUHJvamVjdChTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciwgSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OyAKLQotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYoaW1hZ2UgPT0gbnVsbCkKLQkJCWltYWdlID0gSmF2YVVJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfUEFDS0ZSQUdfUk9PVCk7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gZGV0ZXJtaW5lTGFiZWwoKTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmxhdHRlbmluZ1NvdXJjZUZvbGRlcigpIHsKLQkJcmV0dXJuIGdldE5vbkV4dGVybmFsU291cmNlRm9sZGVycygpLnNpemUoKSA9PSAxOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRldGVybWluZUxhYmVsKCkgewotCQlMaXN0IG5vbmV4dFNvdXJjZUZvbGRlcnMgPSBnZXROb25FeHRlcm5hbFNvdXJjZUZvbGRlcnMoKTsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgc2luZ2xlUm9vdCA9IG51bGw7Ci0JCWlmIChub25leHRTb3VyY2VGb2xkZXJzLnNpemUoKSA9PSAxKSB7Ci0JCQlzaW5nbGVSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBub25leHRTb3VyY2VGb2xkZXJzLmdldCgwKTsKLQkJfQotCQlyZXR1cm4gTkxTLmJpbmQoV0VCVUlNZXNzYWdlcy5Db21wcmVzc2VkX0phdmFSZXNvdXJjZXMsICgoc2luZ2xlUm9vdCAhPSBudWxsKSA/ICI6ICIgKyBzaW5nbGVSb290LmdldEVsZW1lbnROYW1lKCkgOiAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKElUcmVlQ29udGVudFByb3ZpZGVyIGRlbGVnYXRlQ29udGVudFByb3ZpZGVyKSB7Ci0JCQotCQlMaXN0IG5vbkV4dGVybmFsU291cmNlRm9sZGVycyA9IGdldE5vbkV4dGVybmFsU291cmNlRm9sZGVycygpOwotCQlpZiAobm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3RbXSBzb3VyY2VGb2xkZXJDaGlsZHJlbiA9IGRlbGVnYXRlQ29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKG5vbkV4dGVybmFsU291cmNlRm9sZGVycy5nZXQoMCkpOwotCQkJbm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzLmNsZWFyKCk7Ci0JCQlub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMuYWRkQWxsKEFycmF5cy5hc0xpc3Qoc291cmNlRm9sZGVyQ2hpbGRyZW4pKTsKLQkJfSAKLQkJbm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzLmFkZChnZXRDb21wcmVzc2VkSmF2YUxpYnJhcmllcygpKTsKLQkJcmV0dXJuIG5vbkV4dGVybmFsU291cmNlRm9sZGVycy50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Tm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzKCkgewotCQlMaXN0IG5vbkV4dGVybmFsU291cmNlRm9sZGVycyA9IG51bGw7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gc291cmNlRm9sZGVyczsKLQkJdHJ5IHsKLQkJCUlKYXZhUHJvamVjdCBqUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCXNvdXJjZUZvbGRlcnMgPSBqUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJbm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHNvdXJjZUZvbGRlcnMpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vbkV4dGVybmFsU291cmNlRm9sZGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAocm9vdC5pc0V4dGVybmFsKCkgfHwgcm9vdC5pc0FyY2hpdmUoKSB8fCByb290LmdldEtpbmQoKT09SVBhY2thZ2VGcmFnbWVudFJvb3QuS19CSU5BUlkpCi0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlTZXJ2bGV0VUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMgIT0gbnVsbCA/IG5vbkV4dGVybmFsU291cmNlRm9sZGVycyA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCXB1YmxpYyBDb21wcmVzc2VkSmF2YUxpYnJhcmllcyBnZXRDb21wcmVzc2VkSmF2YUxpYnJhcmllcygpIHsJCQotCQlpZihjb21wcmVzc2VkTGlicmFyaWVzID09IG51bGwpIAotCQkJY29tcHJlc3NlZExpYnJhcmllcyA9IG5ldyBDb21wcmVzc2VkSmF2YUxpYnJhcmllcyh0aGlzKTsKLQkJcmV0dXJuIGNvbXByZXNzZWRMaWJyYXJpZXM7Ci0JCQotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7IAotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoKSB7Ci0JCUxpc3Qgbm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzID0gZ2V0Tm9uRXh0ZXJuYWxTb3VyY2VGb2xkZXJzKCk7Ci0JCWlmIChub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMuc2l6ZSgpID09IDEpIHsKLQkJCXJldHVybiAoSUphdmFFbGVtZW50KSBub25FeHRlcm5hbFNvdXJjZUZvbGRlcnMuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0NvbXByZXNzZWRKYXZhU29ydGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0NvbXByZXNzZWRKYXZhU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODE0ODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9Db21wcmVzc2VkSmF2YVNvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50U29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tcHJlc3NlZEphdmFTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCQotCXByaXZhdGUgSmF2YUVsZW1lbnRTb3J0ZXIgc29ydGVyID0gbmV3IEphdmFFbGVtZW50U29ydGVyKCk7Ci0JCi0JcHVibGljIGludCBjYXRlZ29yeShPYmplY3QgZWxlbWVudCkgeyAKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIENvbXByZXNzZWRKYXZhTGlicmFyaWVzKQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UgcmV0dXJuIDA7Ci0JfQotCQotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpZihlMSBpbnN0YW5jZW9mIENvbXByZXNzZWRKYXZhTGlicmFyaWVzKQotCQkJcmV0dXJuIDE7Ci0JCWVsc2UgaWYoZTIgaW5zdGFuY2VvZiBDb21wcmVzc2VkSmF2YUxpYnJhcmllcykKLQkJCXJldHVybiAtMTsKLQkJCi0JCXJldHVybiBzb3J0ZXIuY29tcGFyZSh2aWV3ZXIsIGUxLCBlMik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0NvbXByZXNzZWROb2RlQWRhcHRlckZhY3RvcnkuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQ29tcHJlc3NlZE5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzNiMDg1Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvQ29tcHJlc3NlZE5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotCi0vLyAKLXB1YmxpYyBjbGFzcyBDb21wcmVzc2VkTm9kZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5IHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJSkFWQV9QUk9KRUNUX0NMQVNTID0gSUphdmFQcm9qZWN0LmNsYXNzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIElKQVZBX0VMRU1FTlRfQ0xBU1MgPSBJSmF2YUVsZW1lbnQuY2xhc3M7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3NbXSBBREFQVEVSX0xJU1QgPSBuZXcgQ2xhc3NbXSB7IElKQVZBX1BST0pFQ1RfQ0xBU1MgfTsKLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZihhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBDb21wcmVzc2VkSmF2YVByb2plY3QpIHsKLQkJCWlmKGFkYXB0ZXJUeXBlID09IElKQVZBX1BST0pFQ1RfQ0xBU1MpIHsKLQkJCQlyZXR1cm4gKChDb21wcmVzc2VkSmF2YVByb2plY3QpYWRhcHRhYmxlT2JqZWN0KS5nZXRQcm9qZWN0KCk7Ci0JCQl9IGVsc2UgaWYgKGFkYXB0ZXJUeXBlID09IElKQVZBX0VMRU1FTlRfQ0xBU1MpIHsKLQkJCQlyZXR1cm4gKChDb21wcmVzc2VkSmF2YVByb2plY3QpYWRhcHRhYmxlT2JqZWN0KS5nZXRKYXZhRWxlbWVudCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgeyAKLQkJcmV0dXJuIEFEQVBURVJfTElTVDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSUNvbXByZXNzZWROb2RlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0lDb21wcmVzc2VkTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDFiYjczLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSUNvbXByZXNzZWROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIAotICogUHJvdmlkZXMgYSBzaW1wbGUgaW50ZXJmYWNlIHRoYXQgaXMgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSByZW5kZXJpbmcgb2YgSmF2YSBlbGVtZW50cyB0byBhIGZvcm1hdAotICogdGhhdCBpcyBmcmllbmRsaWVyIGZvciBXZWIgUHJvamVjdHMuCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29tcHJlc3NlZE5vZGUgICB7Ci0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgaW1hZ2UgdG8gZGlzcGxheSBmb3IgdGhpcyBub2RlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgdGV4dCBsYWJlbCB0byBkaXNwbGF5IGZvciB0aGlzIG5vZGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGRlbGVnYXRlQ29udGVudFByb3ZpZGVyCi0JICogICAgICAgICAgICBUaGUgY29udGVudCBwcm92aWRlciB0aGF0IHNob3VsZCB1c2VkIGZvciBhbnkgY2hpbGRyZW4gdGhhdCBJIGNhbm5vdCBwcm92aWRlCi0JICogICAgICAgICAgICBjaGlsZHJlbiBmb3IuCi0JICogQHJldHVybiBUaGUgY2hpbGRyZW4gZWl0aGVyIGZyb20gbWUgb3IgdGhlIGRlbGVnYXRlQ29udGVudFByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihJVHJlZUNvbnRlbnRQcm92aWRlciBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcik7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBKYXZhIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZSwgaWYgYW55LgotCSAqLwotCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoKTsKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvV2ViSmF2YUNvbnRlbnRQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9XZWJKYXZhQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOWNiNzAuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9XZWJKYXZhQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmxldFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50RXh0ZW5zaW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSU5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklOYXZpZ2F0b3JDb250ZW50U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSVBpcGVsaW5lZFRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlBpcGVsaW5lZFNoYXBlTW9kaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5QaXBlbGluZWRWaWV3ZXJVcGRhdGU7Ci0KLXB1YmxpYyBjbGFzcyBXZWJKYXZhQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVBpcGVsaW5lZFRyZWVDb250ZW50UHJvdmlkZXIgIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIE5PX0NISUxEUkVOID0gbmV3IE9iamVjdFswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV9FWFRFTlNJT05fSUQgPSAib3JnLmVjbGlwc2UuamR0LmphdmEudWkuamF2YUNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIEpEVCBsaWtlcyB0byBtYWtlIGl0IGludGVyZXN0aW5nIHNvIGp1c3Qgb25lIG9mIHRoZWlyIHZpZXdlciB0eXBlcyBpcyBtYWRlIGludGVybmFsIFRvIGF2b2lkCi0JICogdGhlIGRlcGVuZGVuY3ksIHdlIHVzZSBzb21lIHJlZmxlY3Rpb24gaGVyZSB0byBmaWx0ZXIgdGhlIHR5cGUuCi0JICovCi0KLQlwcml2YXRlIHN0YXRpYyBDbGFzcyBJTlRFUk5BTF9DT05UQUlORVJfQ0xBU1M7Ci0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCUlOVEVSTkFMX0NPTlRBSU5FUl9DTEFTUyA9IENsYXNzLmZvck5hbWUoIm9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldy5DbGFzc1BhdGhDb250YWluZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJLy8gaWdub3JlIGlmIHRoZSBjbGFzcyBoYXMgYmVlbiByZW1vdmVkIG9yIHJlbmFtZWQuCi0JCQlJTlRFUk5BTF9DT05UQUlORVJfQ0xBU1MgPSBudWxsOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIENvbW1vblZpZXdlciBjb21tb25WaWV3ZXI7Ci0JcHJpdmF0ZSBJVHJlZUNvbnRlbnRQcm92aWRlciBkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcjsKLQlwcml2YXRlIGZpbmFsIE1hcCBjb21wcmVzc2VkTm9kZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIHZvaWQgZ2V0UGlwZWxpbmVkQ2hpbGRyZW4oT2JqZWN0IGFQYXJlbnQsIFNldCB0aGVDdXJyZW50Q2hpbGRyZW4pIHsKLQkJdHJ5IHsKLQkJCWlmIChhUGFyZW50IGluc3RhbmNlb2YgSVByb2plY3QgJiYgKChJUHJvamVjdClhUGFyZW50KS5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KChJUHJvamVjdClhUGFyZW50KSkgewotCQkJCWNsZWFuSmF2YUNvbnRyaWJ1dGlvbih0aGVDdXJyZW50Q2hpbGRyZW4pOwotCQkJCXRoZUN1cnJlbnRDaGlsZHJlbi5hZGQoZ2V0Q29tcHJlc3NlZE5vZGUoKElQcm9qZWN0KWFQYXJlbnQpKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTZXJ2bGV0VUlQbHVnaW4ubG9nKGUpOwotCQl9IAotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhbkphdmFDb250cmlidXRpb24oU2V0IHRoZUN1cnJlbnRDaGlsZHJlbikgewotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoZUN1cnJlbnRDaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSVJlc291cmNlICYmICgoZWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZSgoSVJlc291cmNlKSBjaGlsZCkpICE9IG51bGwpICYmIGVsZW1lbnQuZXhpc3RzKCkpCi0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCWVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgSUphdmFFbGVtZW50KQotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQllbHNlIGlmIChJTlRFUk5BTF9DT05UQUlORVJfQ0xBU1MgIT0gbnVsbCAmJiBJTlRFUk5BTF9DT05UQUlORVJfQ0xBU1MuaXNJbnN0YW5jZShjaGlsZCkpCi0JCQkJaXRlci5yZW1vdmUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29tcHJlc3NlZEphdmFQcm9qZWN0IGdldENvbXByZXNzZWROb2RlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJaWYgKCFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbXByZXNzZWRKYXZhUHJvamVjdCByZXN1bHQgPSAoQ29tcHJlc3NlZEphdmFQcm9qZWN0KSBjb21wcmVzc2VkTm9kZXMuZ2V0KHByb2plY3QpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCWNvbXByZXNzZWROb2Rlcy5wdXQocHJvamVjdCwgcmVzdWx0ID0gbmV3IENvbXByZXNzZWRKYXZhUHJvamVjdChjb21tb25WaWV3ZXIsIHByb2plY3QpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGdldFBpcGVsaW5lZEVsZW1lbnRzKE9iamVjdCBhbklucHV0LCBTZXQgdGhlQ3VycmVudEVsZW1lbnRzKSB7IAotCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQaXBlbGluZWRQYXJlbnQoT2JqZWN0IGFuT2JqZWN0LCBPYmplY3QgYVN1Z2dlc3RlZFBhcmVudCkgewotCi0JCXRyeSB7Ci0JCQlpZiAoYW5PYmplY3QgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIGFuT2JqZWN0OwotCQkJCWlmICghcm9vdC5pc0V4dGVybmFsKCkpIHsKLQkJCQkJaWYoIGFTdWdnZXN0ZWRQYXJlbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QgKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0Q29tcHJlc3NlZE5vZGUoICgoSUphdmFQcm9qZWN0KSBhU3VnZ2VzdGVkUGFyZW50KS5nZXRQcm9qZWN0KCkgKTsKLQkJCQkJfSBlbHNlIGlmICggYVN1Z2dlc3RlZFBhcmVudCBpbnN0YW5jZW9mIElQcm9qZWN0ICYmICgoSVByb2plY3QpYVN1Z2dlc3RlZFBhcmVudCkuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdCgoSVByb2plY3QpYVN1Z2dlc3RlZFBhcmVudCkgKXsKLQkJCQkJCXJldHVybiBnZXRDb21wcmVzc2VkTm9kZSggKChJUHJvamVjdCkgYVN1Z2dlc3RlZFBhcmVudCkgKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZihJTlRFUk5BTF9DT05UQUlORVJfQ0xBU1MuaXNJbnN0YW5jZShhbk9iamVjdCkpIHsKLQkJCQlpZiggYVN1Z2dlc3RlZFBhcmVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCApIHsKLQkJCQkJcmV0dXJuIGdldENvbXByZXNzZWROb2RlKCAoKElKYXZhUHJvamVjdCkgYVN1Z2dlc3RlZFBhcmVudCkuZ2V0UHJvamVjdCgpICkuZ2V0Q29tcHJlc3NlZEphdmFMaWJyYXJpZXMoKTsKLQkJCQl9IGVsc2UgaWYgKCBhU3VnZ2VzdGVkUGFyZW50IGluc3RhbmNlb2YgSVByb2plY3QgJiYgKChJUHJvamVjdClhU3VnZ2VzdGVkUGFyZW50KS5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSAmJiBKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KChJUHJvamVjdClhU3VnZ2VzdGVkUGFyZW50KSl7Ci0JCQkJCXJldHVybiBnZXRDb21wcmVzc2VkTm9kZSggKChJUHJvamVjdCkgYVN1Z2dlc3RlZFBhcmVudCkgKS5nZXRDb21wcmVzc2VkSmF2YUxpYnJhcmllcygpOwotCQkJCX0gCi0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU2VydmxldFVJUGx1Z2luLmxvZyhlKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFBpcGVsaW5lZFNoYXBlTW9kaWZpY2F0aW9uIGludGVyY2VwdEFkZChQaXBlbGluZWRTaGFwZU1vZGlmaWNhdGlvbiBhbkFkZE1vZGlmaWNhdGlvbikgewotCQlPYmplY3QgcGFyZW50ID0gYW5BZGRNb2RpZmljYXRpb24uZ2V0UGFyZW50KCk7Ci0JCQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZUZvbGRlciA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcGFyZW50OwotCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3Qoc291cmNlRm9sZGVyLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSkgewotCQkJCUNvbXByZXNzZWRKYXZhUHJvamVjdCBjb21wcmVzc2VkTm9kZSA9IGdldENvbXByZXNzZWROb2RlKHNvdXJjZUZvbGRlci5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCQkJaWYoY29tcHJlc3NlZE5vZGUuaXNGbGF0dGVuaW5nU291cmNlRm9sZGVyKCkpIHsKLQkJCQkJYW5BZGRNb2RpZmljYXRpb24uc2V0UGFyZW50KGNvbXByZXNzZWROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gCi0JCQotCQlyZXR1cm4gYW5BZGRNb2RpZmljYXRpb247Ci0JfQotCQotCi0JcHVibGljIFBpcGVsaW5lZFNoYXBlTW9kaWZpY2F0aW9uIGludGVyY2VwdFJlbW92ZShQaXBlbGluZWRTaGFwZU1vZGlmaWNhdGlvbiBhUmVtb3ZlTW9kaWZpY2F0aW9uKSB7Ci0KLQkJT2JqZWN0IHBhcmVudCA9IGFSZW1vdmVNb2RpZmljYXRpb24uZ2V0UGFyZW50KCk7Ci0JCQotCQlTZXQgY2hpbGRyZW4gPSBhUmVtb3ZlTW9kaWZpY2F0aW9uLmdldENoaWxkcmVuKCk7Ci0JCQotCQlmb3IgKE9iamVjdCBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRm9sZGVyKXsKLQkJCQl0cnkgewotCQkJCQlJUGFja2FnZUZyYWdtZW50IGxvY2F0ZVBhY2thZ2VGcmFnbWVudCA9IGxvY2F0ZVBhY2thZ2VGcmFnbWVudCgoSUZvbGRlciljaGlsZCk7Ci0JCQkJCWlmKGxvY2F0ZVBhY2thZ2VGcmFnbWVudCAhPSBudWxsKXsKLQkJCQkJCWFSZW1vdmVNb2RpZmljYXRpb24uZ2V0Q2hpbGRyZW4oKS5yZW1vdmUoY2hpbGQpOwotCQkJCQkJYVJlbW92ZU1vZGlmaWNhdGlvbi5nZXRDaGlsZHJlbigpLmFkZChsb2NhdGVQYWNrYWdlRnJhZ21lbnQpOwotCQkJCQkJCi0JCQkJCQlyZXR1cm4gYVJlbW92ZU1vZGlmaWNhdGlvbjsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZUZvbGRlciA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcGFyZW50OwotCQkJaWYgKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3Qoc291cmNlRm9sZGVyLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSkgewotCQkJCUNvbXByZXNzZWRKYXZhUHJvamVjdCBjb21wcmVzc2VkTm9kZSA9IGdldENvbXByZXNzZWROb2RlKHNvdXJjZUZvbGRlci5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCQkJaWYoY29tcHJlc3NlZE5vZGUuaXNGbGF0dGVuaW5nU291cmNlRm9sZGVyKCkpIHsKLQkJCQkJYVJlbW92ZU1vZGlmaWNhdGlvbi5zZXRQYXJlbnQoY29tcHJlc3NlZE5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9IAotCQkKLQkJcmV0dXJuIGFSZW1vdmVNb2RpZmljYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGxvY2F0ZVBhY2thZ2VGcmFnbWVudChJRm9sZGVyIGNoaWxkKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGNoaWxkLmdldFByb2plY3QoKSk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQotCQlJSmF2YUVsZW1lbnQgZWxlbSA9IEphdmFDb3JlLmNyZWF0ZShjaGlsZCk7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewotCQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSAoSVBhY2thZ2VGcmFnbWVudCllbGVtOwotCQkJZm9yIChJSmF2YUVsZW1lbnQgamF2YUVsZW0gPSBwYWNrYWdlRnJhZ21lbnQgOyBqYXZhRWxlbSAhPSBudWxsIDsgamF2YUVsZW0gPSBqYXZhRWxlbS5nZXRQYXJlbnQoKSkgewotCQkJCWlmIChqYXZhRWxlbSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IGZyYWdtZW50Um9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdClqYXZhRWxlbTsKLQkJCQkJaWYgKCFmcmFnbWVudFJvb3QuaXNSZWFkT25seSgpICYmICFmcmFnbWVudFJvb3QuaXNFeHRlcm5hbCgpKSB7Ci0JCQkJCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGludGVyY2VwdFJlZnJlc2goUGlwZWxpbmVkVmlld2VyVXBkYXRlIGFSZWZyZXNoU3luY2hyb25pemF0aW9uKSB7Ci0JCQotCQlTZXQgcmVmcmVzaFRhcmdldHMgPSBhUmVmcmVzaFN5bmNocm9uaXphdGlvbi5nZXRSZWZyZXNoVGFyZ2V0cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZyZXNoVGFyZ2V0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCByZWZyZXNoVGFyZ2V0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVmcmVzaFRhcmdldCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSByZWZyZXNoVGFyZ2V0OwotCQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHNvdXJjZUZvbGRlci5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSkpIHsKLQkJCQkJQ29tcHJlc3NlZEphdmFQcm9qZWN0IGNvbXByZXNzZWROb2RlID0gZ2V0Q29tcHJlc3NlZE5vZGUoc291cmNlRm9sZGVyLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJCQkJaWYoY29tcHJlc3NlZE5vZGUuaXNGbGF0dGVuaW5nU291cmNlRm9sZGVyKCkpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7IC8vIHZvaWRzIHRoZSBpdGVyIGJ1dCBpcyBva2F5IGJlY2F1c2Ugd2UncmUgZG9uZSB3aXRoIGl0Ci0JCQkJCQlyZWZyZXNoVGFyZ2V0cy5hZGQoY29tcHJlc3NlZE5vZGUpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGludGVyY2VwdFVwZGF0ZShQaXBlbGluZWRWaWV3ZXJVcGRhdGUgYW5VcGRhdGVTeW5jaHJvbml6YXRpb24pIHsKLQkJU2V0IHJlZnJlc2hUYXJnZXRzID0gYW5VcGRhdGVTeW5jaHJvbml6YXRpb24uZ2V0UmVmcmVzaFRhcmdldHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmcmVzaFRhcmdldHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcmVmcmVzaFRhcmdldCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZnJlc2hUYXJnZXQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZUZvbGRlciA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgcmVmcmVzaFRhcmdldDsKLQkJCQlpZiAoc291cmNlRm9sZGVyLmdldEphdmFQcm9qZWN0KCkhPW51bGwgJiYgc291cmNlRm9sZGVyLmdldEphdmFQcm9qZWN0KCkuZXhpc3RzKCkgJiYgc291cmNlRm9sZGVyLmdldEphdmFQcm9qZWN0KCkuaXNPcGVuKCkgJiYgSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChzb3VyY2VGb2xkZXIuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCUNvbXByZXNzZWRKYXZhUHJvamVjdCBjb21wcmVzc2VkTm9kZSA9IGdldENvbXByZXNzZWROb2RlKHNvdXJjZUZvbGRlci5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCQkJCWlmKGNvbXByZXNzZWROb2RlLmlzRmxhdHRlbmluZ1NvdXJjZUZvbGRlcigpKSB7Ci0JCQkJCQlpdGVyLnJlbW92ZSgpOyAvLyB2b2lkcyB0aGUgaXRlcmF0b3I7IGJ1dCBpcyBva2F5IGJlY2F1c2Ugd2UncmUgZG9uZSB3aXRoIGl0Ci0JCQkJCQlyZWZyZXNoVGFyZ2V0cy5hZGQoY29tcHJlc3NlZE5vZGUpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsgCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGUgYVNpdGUpIHsgCi0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbXByZXNzZWRKYXZhUHJvamVjdCkgewotCQkJCXJldHVybiAoKENvbXByZXNzZWRKYXZhUHJvamVjdClwYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbihkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcik7Ci0JCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb21wcmVzc2VkSmF2YUxpYnJhcmllcykgeyAKLQkJCQlyZXR1cm4gKChDb21wcmVzc2VkSmF2YUxpYnJhcmllcylwYXJlbnRFbGVtZW50KS5nZXRDaGlsZHJlbihkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE5PX0NISUxEUkVOOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcHJlc3NlZEphdmFQcm9qZWN0KQotCQkJcmV0dXJuICgoQ29tcHJlc3NlZEphdmFQcm9qZWN0KSBlbGVtZW50KS5nZXRQcm9qZWN0KCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMpIAotCQkJcmV0dXJuICgoQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMpIGVsZW1lbnQpLmdldENvbXByZXNzZWRQcm9qZWN0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbXByZXNzZWRKYXZhUHJvamVjdCB8fCBlbGVtZW50IGluc3RhbmNlb2YgQ29tcHJlc3NlZEphdmFMaWJyYXJpZXMpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBOT19DSElMRFJFTjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeyAKLQkJY29tcHJlc3NlZE5vZGVzLmNsZWFyKCk7IAotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgQ29tbW9uVmlld2VyKSB7Ci0JCQljb21tb25WaWV3ZXIgPSAoQ29tbW9uVmlld2VyKSB2aWV3ZXI7Ci0JCQlJTmF2aWdhdG9yQ29udGVudFNlcnZpY2Ugc2VydmljZSA9IGNvbW1vblZpZXdlci5nZXROYXZpZ2F0b3JDb250ZW50U2VydmljZSgpOwotCQkJSU5hdmlnYXRvckNvbnRlbnRFeHRlbnNpb24gamF2YWV4dCA9IHNlcnZpY2UuZ2V0Q29udGVudEV4dGVuc2lvbkJ5SWQoSkFWQV9FWFRFTlNJT05fSUQpOwotCQkJaWYgKGphdmFleHQgIT0gbnVsbCkKLQkJCQlkZWxlZ2F0ZUNvbnRlbnRQcm92aWRlciA9IGphdmFleHQuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQljb21wcmVzc2VkTm9kZXMuY2xlYXIoKTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIGFNZW1lbnRvKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gYU1lbWVudG8pIHsKLQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0NsYXNzcGF0aENvbnRhaW5lcihPYmplY3QgbykgewkJCi0JCXJldHVybiBJTlRFUk5BTF9DT05UQUlORVJfQ0xBU1MgIT0gbnVsbCAmJiBJTlRFUk5BTF9DT05UQUlORVJfQ0xBU1MuaXNJbnN0YW5jZShvKTsKLQl9IAotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL1dlYkphdmFMYWJlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL1dlYkphdmFMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4N2VkNWQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL25hdmlnYXRvci9XZWJKYXZhTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFdlYkphdmFMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIgewotCQotCXByaXZhdGUgSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvciA9IG5ldyBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yKCk7Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSUNvbXByZXNzZWROb2RlKQotCQkJaW1hZ2UgPSAoKElDb21wcmVzc2VkTm9kZSllbGVtZW50KS5nZXRJbWFnZSgpOyAKLQkJCi0JCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IG51bGw7Ci0JCWlmKGltYWdlICE9IG51bGwgJiYgKCBqYXZhRWxlbWVudCA9ICgoSUNvbXByZXNzZWROb2RlKWVsZW1lbnQpLmdldEphdmFFbGVtZW50KCkpICE9IG51bGwgKSB7CQkJCi0JCQlpbWFnZSA9IGRlY29yYXRvci5kZWNvcmF0ZUltYWdlKGltYWdlLCBqYXZhRWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29tcHJlc3NlZE5vZGUpCi0JCQl0ZXh0ID0gKChJQ29tcHJlc3NlZE5vZGUpZWxlbWVudCkuZ2V0TGFiZWwoKTsgCi0KLQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gbnVsbDsKLQkJaWYodGV4dCAhPSBudWxsICYmICggamF2YUVsZW1lbnQgPSAoKElDb21wcmVzc2VkTm9kZSllbGVtZW50KS5nZXRKYXZhRWxlbWVudCgpKSAhPSBudWxsICkgewotCQkJdGV4dCA9IGRlY29yYXRvci5kZWNvcmF0ZVRleHQodGV4dCwgamF2YUVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsgCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeyAKLQkJZGVjb3JhdG9yLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeyAKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsgCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9wbHVnaW4vU2VydmxldFVJUGx1Z2luLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvcGx1Z2luL1NlcnZsZXRVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTQ1YWIyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9wbHVnaW4vU2VydmxldFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgamxhbnV0aQotICoKLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aSI7IC8vJE5PTi1OTFMtMSQKLQkvLwlUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFNlcnZsZXRVSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTZXJ2bGV0VUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlcnZsZXRVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBFeGNlcHRpb24gZSApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCkgKyAiIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBsb2coIG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBlICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nKCBmaW5hbCBJU3RhdHVzIHN0YXR1cyApCi0gICAgewotICAgICAgICBnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKCBzdGF0dXMgKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvcGx1Z2luL1dFQlVJTWVzc2FnZXMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9wbHVnaW4vV0VCVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTJlZWNjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC9wbHVnaW4vV0VCVUlNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLXB1YmxpYyBjbGFzcyBXRUJVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJ3ZWJfdWkiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV0VCVUlNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkVXX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRk9MREVSX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSTF9NQVBQSU5HU19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUkxfTUFQUElOR1NfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9NQVBQSU5HU19MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGSUxURVJfTUFQUElOR1NfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVJMX1NFUlZMRVRfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRElTUEFUQ0hFUlNfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19NT0RJRklFUlNfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1VQRVJDTEFTU19MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJfQ09OVF9QQUdFX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfUEFDS0FHRV9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfTVNHX05PTkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19BQlNUUkFDVF9DSEVDS0JPWF9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9GSUxURVJfV0laQVJEX1dJTkRPV19USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfRklMVEVSX1dJWkFSRF9QQUdFX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfTUFJTl9DSEVDS0JPWF9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTVBUWV9MSVNUX01TRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRXQVJBY3Rpb25fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PX1dFQl9QUk9KRUNUUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlRFUkZBQ0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19CUk9XRVJfRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkVXX0pBVkFfQ0xBU1NfREVTVElOQVRJT05fV0laQVJEX1BBR0VfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX1BVQkxJQ19DSEVDS0JPWF9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUkxfUEFUVEVSTl9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT05UQUlORVJfU0VMRUNUSU9OX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXRUJfQ09OVF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVSTF9QQVRURVJOX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1ZBTElEQVRPUl9NRVNHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFU0NSSVBUSU9OX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRV9FWElTVElOR19TRVJWTEVUX0NMQVNTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRV9FWElTVElOR19GSUxURVJfQ0xBU1M7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVVNFX0VYSVNUSU5HX0xJU1RFTkVSX0NMQVNTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfRklOQUxfQ0hFQ0tCT1hfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfREVTQzsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfRklMVEVSX1dJWkFSRF9QQUdFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VMRUNUX0NMQVNTX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfQlJPV0VSX0RJQUxPR19NRVNTQUdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFdBUkFjdGlvbl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19NRVRIT0RfU1RVQlNfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19DT05TVFJVQ1RPUl9DSEVDS0JPWF9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX1BBQ0tBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQX0NMQVNTX05BTUVfVE9fQ0xBU1NfRVJST1JfTVNHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJST1dTRV9CVVRUT05fTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVNT1ZFX0JVVFRPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTklUX1BBUkFNX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOSVRfUEFSQU1fTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VSVkxFVF9OQU1FX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENMQVNTX05BTUVfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzE3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8xNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKQVZBX1BBQ0tBR0VfTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzE1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8xNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8xMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfQlVUVE9OX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVESVRfQlVUVE9OX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8xMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkVXX0pBVkFfQ0xBU1NfT1BUSU9OU19XSVpBUkRfUEFHRV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRV9CVVRUT05fTEFCRUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkVXX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBORVdfRklMVEVSX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkFNRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOQU1FX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTFVFX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTFVFX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQl9DT05UX1BBR0VfQ09NUF9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDSE9PU0VfU0VSVkxFVF9DTEFTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDSE9PU0VfRklMVEVSX0NMQVNTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5FV19TRVJWTEVUX1dJWkFSRF9QQUdFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQl9DT05UX1BBR0VfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19JTlRFUkZBQ0VTX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQkNPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VMRUNUX0FMTF9CVVRUT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ0xFQVJfQlVUVE9OOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXByZXNzZWRfTGlicmFyaWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXByZXNzZWRfSmF2YVJlc291cmNlczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb252ZXJ0VG9XZWJUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RXZWJWZXJzaW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfV0lORE9XX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX1BBR0VfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX1NFUlZMRVRfQ09OVEVYVF9FVkVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9IVFRQX1NFU1NJT05fRVZFTlRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfU0VSVkxFVF9SRVFVRVNUX0VWRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX0xJRkVDWUNMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX0NIQU5HRVNfVE9fQVRUUklCVVRFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX1NFU1NJT05fTUlHUkFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfT0JKRUNUX0JJTkRJTkc7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRElTUEFUQ0hFUl9SRVFVRVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERJU1BBVENIRVJfRk9SV0FSRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBESVNQQVRDSEVSX0lOQ0xVREU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRElTUEFUQ0hFUl9FUlJPUjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFdFQlVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFX0xPQURfRVJST1IgPSBfMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTU9EVUxFX1dJWl9USVRMRSA9IF8xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9WRVJTSU9OX0xCTCA9IF8yOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9QUk9KRUNUX01BSU5fUEdfVElUTEUgPSBfMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUFJPSkVDVF9NQUlOX1BHX0RFU0MgPSBfNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUFJPSkVDVF9MQkwgPSBfNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfRklMRV9MQkwgPSBfNjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU1QT1JUX01BSU5fUEdfREVTQyA9IF83OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTVBPUlRfTUFJTl9QR19USVRMRSA9IF84OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9FWFBPUlRfTUFJTl9QR19USVRMRSA9IF85OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9FWFBPUlRfTUFJTl9QR19ERVNDID0gXzEwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTVBPUlRfQ09OVEVYVF9ST09UID0gXzExOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9DT05WRVJUX01BSU5fUEdfREVTQyA9IF8xMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfQ09OVkVSVF9NQUlOX1BHX1RJVExFID0gXzEzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTVBPUlRfV0VCX0xJQl9QR19USVRMRSA9IF8xNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfSU1QT1JUX1dFQl9MSUJfUEdfREVTQyA9IF8xNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfSU1QT1JUX1NFTEVDVF9BTExfTElCU19CVVRUT04gPSBfMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FSX0lNUE9SVF9ERVNFTEVDVF9BTExfTElCU19CVVRUT04gPSBfMTc7Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZEVkaXRGaWx0ZXJNYXBwaW5nRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZEVkaXRGaWx0ZXJNYXBwaW5nRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0N2ViZDkuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRFZGl0RmlsdGVyTWFwcGluZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuRVJST1I7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkZPUldBUkQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLklOQ0xVREU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlJFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlVSTF9QQVRURVJOX0xBQkVMOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuVHdvQXJyYXlRdWlja1NvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5GaWx0ZXJNYXBwaW5nSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JRmlsdGVyTWFwcGluZ0l0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVycy5XZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLklNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLk1vZGVsUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLlNlcnZsZXRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25TdGF0dXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubGF5b3V0LkNlbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDcvMzAvMjAwMSAxMToxNjozNiBBTSkKLSAqLwotcHVibGljIGNsYXNzIEFkZEVkaXRGaWx0ZXJNYXBwaW5nRGlhbG9nIGV4dGVuZHMgU2VsZWN0aW9uU3RhdHVzRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUeXBlUmVuZGVyZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbWFnZSBTRVJWTEVUX0lDT04gPSAKLSAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKChVUkwpIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInNlcnZsZXQiKSkuY3JlYXRlSW1hZ2UoKTsKLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgZWxlbWVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBTRVJWTEVUX0lDT047Ci0gICAgICAgIH0KLQotCX0KLQkKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRVJWTEVUID0gMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBVUkxfUEFUVEVSTiA9IDE7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmU2VydmxldEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZVUkxQYXR0ZXJuQnV0dG9uOwotCXByb3RlY3RlZCBpbnQgZlNlbGVjdGlvbiA9IC0xOwotCXByb3RlY3RlZCBQYWdlQm9vayBmUGFnZUJvb2sgPSBudWxsOwotCXByb3RlY3RlZCBDb250cm9sIGZVUkxQYXR0ZXJuQ29udHJvbCA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbnRyb2wgZlNlcnZsZXRDb250cm9sID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGZDaGlsZCA9IG51bGw7Ci0JLy8gY29uc3RydWN0aW9uIHBhcmFtZXRlcnMKLQlwcm90ZWN0ZWQgSVJ1bm5hYmxlQ29udGV4dCBmUnVubmFibGVDb250ZXh0OwotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBmRWxlbWVudFJlbmRlcmVyOwotCXByaXZhdGUgT2JqZWN0W10gZkVsZW1lbnRzOwotCXByaXZhdGUgYm9vbGVhbiBmSWdub3JlQ2FzZSA9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlVwcGVyTGlzdExhYmVsOwotCi0JLy8gU1dUIHdpZGdldHMKLQlwcml2YXRlIFRhYmxlIGZVcHBlckxpc3Q7Ci0JcHJvdGVjdGVkIFRleHQgZlVSTFRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmU2VydmxldE5hbWVzOwotCXByaXZhdGUgU3RyaW5nW10gZlJlbmRlcmVkU3RyaW5nczsKLQlwcml2YXRlIGludCBkaXNwYXRjaGVyczsKLQlwcml2YXRlIEJ1dHRvbiBmUmVxdWVzdDsKLQlwcml2YXRlIEJ1dHRvbiBmRm9yd2FyZDsKLQlwcml2YXRlIEJ1dHRvbiBmSW5jbHVkZTsKLQlwcml2YXRlIEJ1dHRvbiBmRXJvcnI7Ci0JcHJpdmF0ZSBJRmlsdGVyTWFwcGluZ0l0ZW0gc2VsZWN0ZWRJdGVtOwotCi0JLyoqCi0JICogTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gcGFyZW50IFNoZWxsCi0JICogQHBhcmFtIHRpdGxlIFN0cmluZwotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqIEBwYXJlbnQgZXh0ZW5zaW9ucyBTdHJpbmdbXQotCSAqIEBwYXJhbSBhbGxvd011bHRpcGxlIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgQWRkRWRpdEZpbHRlck1hcHBpbmdEaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIElQcm9qZWN0IHByb2plY3QsIAotCSAgICAgICAgTGlzdDxJRmlsdGVyTWFwcGluZ0l0ZW0+IGVsZW1lbnRzLCBJRmlsdGVyTWFwcGluZ0l0ZW0gaXRlbSkgewotCQlzdXBlcihwYXJlbnQpOwotCQlzZWxlY3RlZEl0ZW0gPSBpdGVtOwotCQlzZXRTaGVsbFN0eWxlKFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IFNXVC5SRVNJWkUpOwotCi0JCWlmICh0aXRsZSA9PSBudWxsKQotCQkJc2V0VGl0bGUoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIkZpbGVfU2VsZWN0aW9uX1VJXyIpKTsgLy8kTk9OLU5MUy0xJAotCQllbHNlIHNldFRpdGxlKHRpdGxlKTsKLQkJCi0JCVN0YXR1cyBjdXJyU3RhdHVzID0gbmV3IFN0YXR1cyhTdGF0dXMuT0ssIFNlcnZsZXRVSVBsdWdpbi5QTFVHSU5fSUQsIFN0YXR1cy5PSywgIiIsIG51bGwpOwotCQkKLQkJdXBkYXRlU3RhdHVzKGN1cnJTdGF0dXMpOwotCQlmRWxlbWVudFJlbmRlcmVyID0gbmV3IFR5cGVSZW5kZXJlcigpOwotCQlmUnVubmFibGVDb250ZXh0ID0gU2VydmxldFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJdHJ5IHsKLSAgICAgICAgICAgIElNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gTW9kZWxQcm92aWRlck1hbmFnZXIuZ2V0TW9kZWxQcm92aWRlcihwcm9qZWN0KTsKLSAgICAgICAgICAgIE9iamVjdCBtT2JqID0gcHJvdmlkZXIuZ2V0TW9kZWxPYmplY3QoKTsKLSAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHNlcnZsZXRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgaWYgKG1PYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHApIHsKLSAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHAgd2ViQXBwID0gKG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcCkgbU9iajsKLSAgICAgICAgICAgICAgICBMaXN0PFNlcnZsZXQ+IHNlcnZsZXRzID0gd2ViQXBwLmdldFNlcnZsZXRzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTZXJ2bGV0IHNlcnZsZXQgOiBzZXJ2bGV0cykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmxldE5hbWUgPSBzZXJ2bGV0LmdldFNlcnZsZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc2VydmxldE5hbWUuZXF1YWxzKGl0ZW0gIT0gbnVsbCA/IGl0ZW0uZ2V0TmFtZSgpIDogbnVsbCkgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbHJlYWR5QWRkZWQoc2VydmxldE5hbWUsIGVsZW1lbnRzKSkgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZsZXRzTGlzdC5hZGQoc2VydmxldE5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobU9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCkgewotICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCB3ZWJBcHA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApIG1PYmo7Ci0gICAgICAgICAgICAgICAgTGlzdDxvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5TZXJ2bGV0PiBzZXJ2bGV0cyA9IHdlYkFwcC5nZXRTZXJ2bGV0cygpOwotICAgICAgICAgICAgICAgIGZvciAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuU2VydmxldCBzZXJ2bGV0IDogc2VydmxldHMpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlcnZsZXROYW1lID0gc2VydmxldC5nZXRTZXJ2bGV0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXNlcnZsZXROYW1lLmVxdWFscyhpdGVtICE9IG51bGwgPyBpdGVtLmdldE5hbWUoKSA6IG51bGwpICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWxyZWFkeUFkZGVkKHNlcnZsZXROYW1lLCBlbGVtZW50cykpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0c0xpc3QuYWRkKHNlcnZsZXROYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICBmU2VydmxldE5hbWVzID0gKFN0cmluZ1tdKSBzZXJ2bGV0c0xpc3QudG9BcnJheShuZXcgU3RyaW5nW3NlcnZsZXRzTGlzdC5zaXplKCldKTsKLSAgICAgICAgICAgIHNlcnZsZXRzTGlzdCA9IG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTZXJ2bGV0VUlQbHVnaW4ubG9nKGUpOwotICAgICAgICB9Ci0JfQotCQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0FscmVhZHlBZGRlZChTdHJpbmcgc2VydmxldCwgTGlzdDxJRmlsdGVyTWFwcGluZ0l0ZW0+IGVsZW1lbnRzKSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBJRmlsdGVyTWFwcGluZ0l0ZW0gaXRlbSA9IChJRmlsdGVyTWFwcGluZ0l0ZW0pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChpdGVtLmlzU2VydmxldE5hbWVUeXBlKCkgJiYgaXRlbS5nZXROYW1lKCkuZXF1YWxzKHNlcnZsZXQpKSAKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0JICogQHByaXZhdGUKLQkgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVzdWx0KCkgewotICAgICAgICBpZiAoZlNlbGVjdGlvbiA9PSBVUkxfUEFUVEVSTikgewotICAgICAgICAgICAgamF2YS51dGlsLkxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgxKTsgICAgICAgICAgIAotICAgICAgICAgICAgZGlzcGF0Y2hlcnMgPSBnZXREaXNwYXRjaGVycygpOwotICAgICAgICAgICAgRmlsdGVyTWFwcGluZ0l0ZW0gbWFwcGluZ0l0ZW0gPSAKLSAgICAgICAgICAgICAgICBuZXcgRmlsdGVyTWFwcGluZ0l0ZW0oRmlsdGVyTWFwcGluZ0l0ZW0uVVJMX1BBVFRFUk4sIGZVUkxUZXh0LmdldFRleHQoKS50cmltKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcnMpOwotICAgICAgICAgICAgcmVzdWx0LmFkZChtYXBwaW5nSXRlbSk7Ci0gICAgICAgICAgICBzZXRSZXN1bHQocmVzdWx0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBzZXJ2bGV0TmFtZSA9IChTdHJpbmcpIGdldFdpZGdldFNlbGVjdGlvbigpOwotICAgICAgICAgICAgaWYgKHNlcnZsZXROYW1lID09IG51bGwpIHsKLS8vICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VsZWN0X0NsYXNzX1VJXyIpOyAvLyROT04tTkxTLTEkID0gIlNlbGVjdCBDbGFzcyIKLS8vICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDb3VsZF9ub3RfdW5pcXVlbHlfbWFwX3RoZV9FUlJPUl8iKTsgLy8kTk9OLU5MUy0xJCA9ICJDb3VsZCBub3QgdW5pcXVlbHkgbWFwIHRoZSBjbGFzcyBuYW1lIHRvIGEgY2xhc3MuIgotLy8gICAgICAgICAgICAgIE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICBzZXRSZXN1bHQobnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRpc3BhdGNoZXJzID0gZ2V0RGlzcGF0Y2hlcnMoKTsKLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDEpOwotICAgICAgICAgICAgICAgIEZpbHRlck1hcHBpbmdJdGVtIG1hcHBpbmdJdGVtID0gCi0gICAgICAgICAgICAgICAgICAgIG5ldyBGaWx0ZXJNYXBwaW5nSXRlbShGaWx0ZXJNYXBwaW5nSXRlbS5TRVJWTEVUX05BTUUsIHNlcnZsZXROYW1lLCBkaXNwYXRjaGVycyk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChtYXBwaW5nSXRlbSk7Ci0gICAgICAgICAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXREaXNwYXRjaGVycygpIHsKLSAgICAgICAgaW50IGRpc3BhdGNoZXJzID0gMDsKLSAgICAgICAgaWYgKGZSZXF1ZXN0LmdldFNlbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICBkaXNwYXRjaGVycyB8PSBJRmlsdGVyTWFwcGluZ0l0ZW0uUkVRVUVTVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZkZvcndhcmQuZ2V0U2VsZWN0aW9uKCkpIHsKLSAgICAgICAgICAgIGRpc3BhdGNoZXJzIHw9IElGaWx0ZXJNYXBwaW5nSXRlbS5GT1JXQVJEOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmSW5jbHVkZS5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgZGlzcGF0Y2hlcnMgfD0gSUZpbHRlck1hcHBpbmdJdGVtLklOQ0xVREU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZFcm9yci5nZXRTZWxlY3Rpb24oKSkgewotICAgICAgICAgICAgZGlzcGF0Y2hlcnMgfD0gSUZpbHRlck1hcHBpbmdJdGVtLkVSUk9SOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkaXNwYXRjaGVyczsKLSAgICB9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLSAgICAgICAgaWYgKHNlbGVjdGVkSXRlbSA9PSBudWxsICYmIChmU2VydmxldE5hbWVzICE9IG51bGwgJiYgZlNlcnZsZXROYW1lcy5sZW5ndGggPiAwKSkgZlNlbGVjdGlvbiA9IFNFUlZMRVQ7IAotCQl1cGRhdGVPa1N0YXRlKCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZGlhbG9nJ3MgCi0JICogYnV0dG9uIGJhci4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+RGlhbG9nPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZyYW1ld29yayBtZXRob2QKLQkgKiBsYXlzIG91dCBhIGJ1dHRvbiBiYXIgYW5kIGNhbGxzIHRoZSA8Y29kZT5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyPC9jb2RlPgotCSAqIGZyYW1ld29yayBtZXRob2QgdG8gcG9wdWxhdGUgaXQuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUgdG8gY29udGFpbiB0aGUgYnV0dG9uIGJhcgotCSAqIEByZXR1cm4gdGhlIGJ1dHRvbiBiYXIgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0KLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCi0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlMiA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJLy8gY3JlYXRlIGEgbGF5b3V0IHdpdGggc3BhY2luZyBhbmQgbWFyZ2lucyBhcHByb3ByaWF0ZSBmb3IgdGhlIGZvbnQgc2l6ZS4KLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAwOyAvLyB0aGlzIGlzIGluY3JlbWVudGVkIGJ5IGNyZWF0ZUJ1dHRvbgotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCi0JCWNvbXBvc2l0ZTIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCWNvbXBvc2l0ZTIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljb21wb3NpdGUyLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJLy8gQWRkIHRoZSBidXR0b25zIHRvIHRoZSBidXR0b24gYmFyLgotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKGNvbXBvc2l0ZTIpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCS8qCi0JICogQHByaXZhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQotCQlmQ2hpbGQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGZDaGlsZCwgImNvbS5pYm0uZXRvb2xzLndlYmFwcGxpY2F0aW9uZWRpdC53ZWJ4MjAxMCIpOyAvLyROT04tTkxTLTEkCi0JCUdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotCQlnbC5udW1Db2x1bW5zID0gMjsKLQkJZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZkNoaWxkLnNldExheW91dChnbCk7Ci0KLQkJZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWZDaGlsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLyBDcmVhdGUgdGhlIFdlYiBUeXBlIHJhZGlvIGJ1dHRvbnMgYW5kIHRleHQgZmllbGRzLgotCQlmU2VydmxldEJ1dHRvbiA9IG5ldyBCdXR0b24oZkNoaWxkLCBTV1QuUkFESU8pOwotCQlmU2VydmxldEJ1dHRvbi5zZXRUZXh0KFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZXJ2bGV0X1VJXyIpKTsgLy8kTk9OLU5MUy0xJCA9IFNlcnZsZXQKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZlNlcnZsZXRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZTZXJ2bGV0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCWZVUkxQYXR0ZXJuQnV0dG9uID0gbmV3IEJ1dHRvbihmQ2hpbGQsIFNXVC5SQURJTyk7Ci0JCWZVUkxQYXR0ZXJuQnV0dG9uLnNldFRleHQoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlVSTF9wYXR0ZXJuX1VJXyIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlmVVJMUGF0dGVybkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZlVSTFBhdHRlcm5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy9DcmVhdGUgVVJMIFBhdHRlcm4gcGFnZSAKLQkJZlBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGZDaGlsZCwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZQYWdlQm9vay5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGZQYWdlQm9vaywgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLSAgICAgICAgbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotICAgICAgICBsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLSAgICAgICAgCi0gICAgICAgIExhYmVsIG1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0VGV4dChVUkxfUEFUVEVSTl9MQUJFTCk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBmVVJMVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0gICAgICAgIEdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoKTsKLSAgICAgICAgc3BlYy5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotICAgICAgICBzcGVjLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICBzcGVjLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgICAgICBzcGVjLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotICAgICAgICBmVVJMVGV4dC5zZXRMYXlvdXREYXRhKHNwZWMpOwotICAgICAgICBMaXN0ZW5lciBsID0gbmV3IExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlT2tTdGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBmVVJMVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBsKTsKLSAgICAgICAgZlVSTFBhdHRlcm5Db250cm9sID0gY29tcG9zaXRlOwotCi0gICAgICAgIC8vQ3JlYXRlIFNlcnZsZXQgcGFnZQotICAgICAgICBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGZQYWdlQm9vaywgU1dULk5PTkUpOwotICAgICAgICBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0gICAgICAgIGxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLSAgICAgICAgbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLSAgICAgICAgbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBtZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDaG9vc2VfYV9zZXJ2bGV0X18yIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgZlVwcGVyTGlzdCA9IGNyZWF0ZVVwcGVyTGlzdChjb21wb3NpdGUpOwotCi0gICAgICAgIGZTZXJ2bGV0Q29udHJvbCA9IGNvbXBvc2l0ZTsKLQotICAgICAgICAvL0NyZWF0ZSBEaXNwYXRjaGVycyBjb250cm9sCi0gICAgICAgIEdyb3VwIGRpc3BhdGNoZXJzID0gbmV3IEdyb3VwKGZDaGlsZCwgU1dULlNIQURPV19JTik7Ci0gICAgICAgIGRpc3BhdGNoZXJzLnNldFRleHQoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlbGVjdF9EaXNwYXRjaGVyc19VSV8iKSk7Ci0gICAgICAgIGRpc3BhdGNoZXJzLnNldExheW91dChuZXcgQ2VsbExheW91dCgyKS5zZXRNYXJnaW5zKDEwLDEwKS5zZXRTcGFjaW5nKDUsNSkpOwotICAgICAgICBHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotICAgICAgICBncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0gICAgICAgIGRpc3BhdGNoZXJzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotICAgICAgICBmUmVxdWVzdCA9IG5ldyBCdXR0b24oZGlzcGF0Y2hlcnMsIFNXVC5DSEVDSyk7Ci0gICAgICAgIGZSZXF1ZXN0LnNldFRleHQoUkVRVUVTVCk7Ci0gICAgICAgIGZGb3J3YXJkID0gbmV3IEJ1dHRvbihkaXNwYXRjaGVycywgU1dULkNIRUNLKTsKLSAgICAgICAgZkZvcndhcmQuc2V0VGV4dChGT1JXQVJEKTsKLSAgICAgICAgZkluY2x1ZGUgPSBuZXcgQnV0dG9uKGRpc3BhdGNoZXJzLCBTV1QuQ0hFQ0spOwotICAgICAgICBmSW5jbHVkZS5zZXRUZXh0KElOQ0xVREUpOwotICAgICAgICBmRXJvcnIgPSBuZXcgQnV0dG9uKGRpc3BhdGNoZXJzLCBTV1QuQ0hFQ0spOwotICAgICAgICBmRXJvcnIuc2V0VGV4dChFUlJPUik7Ci0gICAgICAgIAotICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW0uaXNVcmxQYXR0ZXJuVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgZlNlbGVjdGlvbiA9IFVSTF9QQVRURVJOOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmU2VsZWN0aW9uID0gU0VSVkxFVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmU2VydmxldE5hbWVzID09IG51bGwgfHwgZlNlcnZsZXROYW1lcy5sZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgIGZTZWxlY3Rpb24gPSBVUkxfUEFUVEVSTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB1cGRhdGVVcHBlckxpc3RXaWRnZXQoKTsKLQotICAgICAgICBmU2VydmxldEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICBpZiAoZlNlbGVjdGlvbiA9PSBVUkxfUEFUVEVSTikgewotICAgICAgICAgICAgZlVSTFBhdHRlcm5CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgICAgZlBhZ2VCb29rLnNob3dQYWdlKGZVUkxQYXR0ZXJuQ29udHJvbCk7Ci0gICAgICAgICAgICBmU2VydmxldEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotICAgICAgICAgICAgaWYgKGZTZXJ2bGV0TmFtZXMgPT0gbnVsbCB8fCBmU2VydmxldE5hbWVzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZlNlcnZsZXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmVVJMVGV4dC5zZXRUZXh0KHNlbGVjdGVkSXRlbS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHNldERpc3BhdGNoZXJzKHNlbGVjdGVkSXRlbS5nZXREaXNwYXRjaGVycygpKTsgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZlNlcnZsZXRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICAgICAgZlBhZ2VCb29rLnNob3dQYWdlKGZTZXJ2bGV0Q29udHJvbCk7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmVXBwZXJMaXN0LnNldFNlbGVjdGlvbihnZXRTZXJ2bGV0SW5kZXgoZlVwcGVyTGlzdCwgc2VsZWN0ZWRJdGVtLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgIHNldERpc3BhdGNoZXJzKHNlbGVjdGVkSXRlbS5nZXREaXNwYXRjaGVycygpKTsgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JCXVwZGF0ZU9rU3RhdGUoKTsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0JCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U2VydmxldEluZGV4KFRhYmxlIGxpc3QsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFRhYmxlSXRlbVtdIGl0ZW1zID0gbGlzdC5nZXRJdGVtcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gdGFibGVJdGVtID0gaXRlbXNbaV07Ci0gICAgICAgICAgICBpZiAodGFibGVJdGVtLmdldFRleHQoKS5lcXVhbHMobmFtZSkpIHJldHVybiBpOyAKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0JcHJpdmF0ZSB2b2lkIHNldERpc3BhdGNoZXJzKGludCBkaXNwYXRjaGVycykgewotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLlJFUVVFU1QpID4gMCkgewotICAgICAgICAgICAgZlJlcXVlc3Quc2V0U2VsZWN0aW9uKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGlzcGF0Y2hlcnMgJiBJRmlsdGVyTWFwcGluZ0l0ZW0uRk9SV0FSRCkgPiAwKSB7Ci0gICAgICAgICAgICBmRm9yd2FyZC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkaXNwYXRjaGVycyAmIElGaWx0ZXJNYXBwaW5nSXRlbS5JTkNMVURFKSA+IDApIHsKLSAgICAgICAgICAgIGZJbmNsdWRlLnNldFNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRpc3BhdGNoZXJzICYgSUZpbHRlck1hcHBpbmdJdGVtLkVSUk9SKSA+IDApIHsKLSAgICAgICAgICAgIGZFcm9yci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCB3aWRnZXQgYW5kIHNldHMgbGF5b3V0IGRhdGEuCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0Ci0JICovCi0JcHJpdmF0ZSBUYWJsZSBjcmVhdGVVcHBlckxpc3QoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoZlVwcGVyTGlzdExhYmVsICE9IG51bGwpCi0JCQkgKG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKSkuc2V0VGV4dChmVXBwZXJMaXN0TGFiZWwpOwotCi0JCVRhYmxlIGxpc3QgPSBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLS8vCQlsaXN0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLS8vCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0vLwkJCQloYW5kbGVVcHBlclNlbGVjdGlvbkNoYW5nZWQoKTsKLS8vCQkJfQotLy8JCX0pOwotCQlsaXN0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJCQloYW5kbGVVcHBlckRvdWJsZUNsaWNrKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaXN0LmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlmRWxlbWVudFJlbmRlcmVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoKTsKLQkJc3BlYy53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNTApOwotCQlzcGVjLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDQpOwotCQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxpc3Quc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIElEIG9mIHRoZSBidXR0b24gdGhhdCBpcyAncHJlc3NlZCcgb24gZG91YmxlQ2xpY2sgaW4gdGhlIGxpc3RzLgotCSAqIEJ5IGRlZmF1bHQgaXQgaXMgdGhlIE9LIGJ1dHRvbi4KLQkgKiBPdmVycmlkZSB0byBjaGFuZ2UgdGhpcyBzZXR0aW5nLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdEJ1dHRvbklEKCkgewotCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5PS19JRDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiBmU2VsZWN0aW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFdpZGdldFNlbGVjdGlvbigpIHsKLSAgICAgICAgaW50IGluZGV4ID0gZlVwcGVyTGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IGZFbGVtZW50c1tpbmRleF0gOiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVMb3dlckRvdWJsZUNsaWNrKCkgewotCQlpZiAoZ2V0V2lkZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkKLQkJCWJ1dHRvblByZXNzZWQoZ2V0RGVmYXVsdEJ1dHRvbklEKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVMb3dlclNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCXVwZGF0ZU9rU3RhdGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlVXBwZXJEb3VibGVDbGljaygpIHsKLQkJaWYgKGdldFdpZGdldFNlbGVjdGlvbigpICE9IG51bGwpCi0JCQlidXR0b25QcmVzc2VkKGdldERlZmF1bHRCdXR0b25JRCgpKTsKLQl9Ci0JCi0JcHVibGljIGludCBvcGVuKCkgewotICAgICAgICBpZiAoZlNlcnZsZXROYW1lcyA9PSBudWxsIHx8IGZTZXJ2bGV0TmFtZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIGZTZWxlY3Rpb24gPSBVUkxfUEFUVEVSTjsKLSAgICAgICAgfQotCi0gICAgICAgIHNldEVsZW1lbnRzKGZTZXJ2bGV0TmFtZXMpOwotICAgICAgICBzZXRJbml0aWFsU2VsZWN0aW9ucyhuZXcgT2JqZWN0W10geyAiIiB9KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gc3VwZXIub3BlbigpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCSAqIEBwYXJhbSBwIG9yZy5lY2xpcHNlLmpmYWNlLmVsZW1lbnRzLklJbmRleGVkUHJvcGVydHkKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIHJlbmRlclN0cmluZ3MoT2JqZWN0W10gcCkgewotCQlTdHJpbmdbXSBzdHJpbmdzID0gbmV3IFN0cmluZ1twLmxlbmd0aF07Ci0JCWludCBzaXplID0gc3RyaW5ncy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlzdHJpbmdzW2ldID0gZkVsZW1lbnRSZW5kZXJlci5nZXRUZXh0KHBbaV0pOwotCQl9Ci0JCW5ldyBUd29BcnJheVF1aWNrU29ydGVyKGZJZ25vcmVDYXNlKS5zb3J0KHN0cmluZ3MsIHApOwotCQlyZXR1cm4gc3RyaW5nczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhPYmplY3RbXSBlbGVtZW50cykgewotCSAgICBpZiAoZWxlbWVudHMgPT0gbnVsbCkgZWxlbWVudHMgPSBuZXcgT2JqZWN0WzBdOyAKLQkJZkVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCWZSZW5kZXJlZFN0cmluZ3MgPSByZW5kZXJTdHJpbmdzKGZFbGVtZW50cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJdGVtKGludCBuZXdTZWxlY3Rpb24pIHsKLQkJZlNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU9rU3RhdGUoKSB7Ci0JCUJ1dHRvbiBva0J1dHRvbiA9IGdldE9rQnV0dG9uKCk7Ci0JCWlmIChva0J1dHRvbiAhPSBudWxsKQotCQkgICAgaWYgKGZTZWxlY3Rpb24gPT0gU0VSVkxFVCkgewotCQkgICAgICAgIG9rQnV0dG9uLnNldEVuYWJsZWQoZ2V0V2lkZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCk7Ci0JCSAgICB9IGVsc2UgewotCQkgICAgICAgIFN0cmluZyByZXN1bHQgPSBmVVJMVGV4dC5nZXRUZXh0KCkudHJpbSgpOwkJICAgICAgICAKLQkJICAgICAgICBva0J1dHRvbi5zZXRFbmFibGVkKHJlc3VsdC5sZW5ndGgoKSA+IDApOwotCQkgICAgfQotCX0KLQkKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVXBwZXJMaXN0V2lkZ2V0KCkgewotICAgICAgICBmVXBwZXJMaXN0LnNldFJlZHJhdyhmYWxzZSk7Ci0gICAgICAgIGZVcHBlckxpc3QuY2xlYXJBbGwoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmUmVuZGVyZWRTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUYWJsZUl0ZW0gdGkgPSBuZXcgVGFibGVJdGVtKGZVcHBlckxpc3QsIFNXVC5OT05FKTsKLSAgICAgICAgICAgIHRpLnNldFRleHQoZlJlbmRlcmVkU3RyaW5nc1tpXSk7Ci0gICAgICAgICAgICAvLyBYWFg6IDFHNjVMREc6IEpGVUlGOldJTjIwMDAgLSBJTGFiZWxQcm92aWRlciB1c2VkIG91dHNpZGUgYSB2aWV3ZXIKLSAgICAgICAgICAgIEltYWdlIGltZyA9IGZFbGVtZW50UmVuZGVyZXIuZ2V0SW1hZ2UoZlJlbmRlcmVkU3RyaW5nc1tpXSk7Ci0gICAgICAgICAgICB0aS5zZXRJbWFnZShpbWcpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmVXBwZXJMaXN0LmdldEl0ZW1Db3VudCgpID4gMCkgewotICAgICAgICAgICAgZlVwcGVyTGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZlVwcGVyTGlzdC5zZXRSZWRyYXcodHJ1ZSk7Ci0gICAgfQotCQotCS8qKgotCSAqIFNlbnQgd2hlbiBkZWZhdWx0IHNlbGVjdGlvbiBvY2N1cnMgaW4gdGhlIGNvbnRyb2wuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIG9uIHNvbWUgcGxhdGZvcm1zIGRlZmF1bHQgc2VsZWN0aW9uIG9jY3VycwotCSAqIGluIGEgTGlzdCB3aGVuIHRoZSB1c2VyIGRvdWJsZS1jbGlja3MgYW4gaXRlbSBvciB0eXBlcwotCSAqIHJldHVybiBpbiBhIFRleHQuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGUgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGVmYXVsdCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkvLyBEbyBub3RoaW5nCi0JfQotCQotCS8qKgotCSAqIFNlbnQgd2hlbiBzZWxlY3Rpb24gb2NjdXJzIGluIHRoZSBjb250cm9sLgotCSAqIDxwPgotCSAqIEZvciBleGFtcGxlLCBvbiBzb21lIHBsYXRmb3JtcyBzZWxlY3Rpb24gb2NjdXJzIGluCi0JICogYSBMaXN0IHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhbiBpdGVtIG9yIGl0ZW1zLgotCSAqIDwvcD4KLQkgKgotCSAqIEBwYXJhbSBlIGFuIGV2ZW50IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IGZVUkxQYXR0ZXJuQnV0dG9uKSB7Ci0JCQlmU2VsZWN0aW9uID0gVVJMX1BBVFRFUk47Ci0JCQlmUGFnZUJvb2suc2hvd1BhZ2UoZlVSTFBhdHRlcm5Db250cm9sKTsKLQkJCXVwZGF0ZU9rU3RhdGUoKTsKLQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSBmU2VydmxldEJ1dHRvbikgewotCQkJZlNlbGVjdGlvbiA9IFNFUlZMRVQ7Ci0JCQlmUGFnZUJvb2suc2hvd1BhZ2UoZlNlcnZsZXRDb250cm9sKTsKLQkJCWdldFNoZWxsKCkucGFjaygpOwotCQl9IGVsc2UKLQkJCWZTZWxlY3Rpb24gPSAtMTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZEZpbHRlcldpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRGaWx0ZXJXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3ZmVkOS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZEZpbHRlcldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfRklMVEVSX1dJWkFSRF9QQUdFX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfRklMVEVSX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5FV19KQVZBX0NMQVNTX0RFU1RJTkFUSU9OX1dJWkFSRF9QQUdFX0RFU0M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5FV19KQVZBX0NMQVNTX09QVElPTlNfV0laQVJEX1BBR0VfREVTQzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5OZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLklXZWJVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIE5ldyBzZXJ2bGV0IGZpbHRlciB3aXphcmQKLSAqLwotcHVibGljIGNsYXNzIEFkZEZpbHRlcldpemFyZCBleHRlbmRzIE5ld1dlYkFydGlmYWN0V2l6YXJkIHsKLQkKLSAgICBwdWJsaWMgQWRkRmlsdGVyV2l6YXJkKCkgewotICAgICAgICB0aGlzKG51bGwpOwotICAgIH0KLQotCXB1YmxpYyBBZGRGaWx0ZXJXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIEFERF9GSUxURVJfV0laQVJEX1dJTkRPV19USVRMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlKCkgewotCQlyZXR1cm4gZ2V0SW1hZ2VGcm9tSjJFRVBsdWdpbigibmV3ZmlsdGVyX3dpeiIpOyAvLyROT04tTkxTLTEkCi0JfQotICAgIAotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCU5ld0ZpbHRlckNsYXNzV2l6YXJkUGFnZSBwYWdlMSA9IG5ldyBOZXdGaWx0ZXJDbGFzc1dpemFyZFBhZ2UoCi0JCSAgICAgICAgZ2V0RGF0YU1vZGVsKCksCi0JCSAgICAgICAgUEFHRV9PTkUsCi0JCSAgICAgICAgTkVXX0pBVkFfQ0xBU1NfREVTVElOQVRJT05fV0laQVJEX1BBR0VfREVTQywKLQkJCQlBRERfRklMVEVSX1dJWkFSRF9QQUdFX1RJVExFLCAKLQkJCQlKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQik7Ci0JCXBhZ2UxLnNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldFQkVESVRPUl9GSUxURVJfUEFHRV9BRERfRklMVEVSX1dJWkFSRF8xKTsKLQkJYWRkUGFnZShwYWdlMSk7Ci0KLQkJQWRkRmlsdGVyV2l6YXJkUGFnZSBwYWdlMiA9IG5ldyBBZGRGaWx0ZXJXaXphcmRQYWdlKGdldERhdGFNb2RlbCgpLCBQQUdFX1RXTyk7Ci0JCXBhZ2UyLnNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldFQkVESVRPUl9GSUxURVJfUEFHRV9BRERfRklMVEVSX1dJWkFSRF8yKTsKLQkJYWRkUGFnZShwYWdlMik7Ci0gICAgICAgIAotICAgICAgICBOZXdGaWx0ZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlIHBhZ2UzID0gbmV3IE5ld0ZpbHRlckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UoCi0gICAgICAgICAgICAgICAgZ2V0RGF0YU1vZGVsKCksIAotICAgICAgICAgICAgICAgIFBBR0VfVEhSRUUsCi0gICAgICAgICAgICAgICAgTkVXX0pBVkFfQ0xBU1NfT1BUSU9OU19XSVpBUkRfUEFHRV9ERVNDLAotICAgICAgICAgICAgICAgIEFERF9GSUxURVJfV0laQVJEX1BBR0VfVElUTEUpOwotICAgICAgICBwYWdlMy5zZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5XRUJFRElUT1JfRklMVEVSX1BBR0VfQUREX0ZJTFRFUl9XSVpBUkRfMyk7Ci0gICAgICAgIGFkZFBhZ2UocGFnZTMpOwotCX0KLSAgICAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9zdFBlcmZvcm1GaW5pc2goKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0gICAgCS8vb3BlbiBuZXcgZmlsdGVyIGNsYXNzIGluIGphdmEgZWRpdG9yCi0gICAgICAgIG9wZW5KYXZhQ2xhc3MoKTsKLSAgICB9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZEZpbHRlcldpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkRmlsdGVyV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTkzM2IyLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkRmlsdGVyV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5GSUxURVJfTUFQUElOR1M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5JVF9QQVJBTTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ERVNDUklQVElPTjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ESVNQTEFZX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuVVNFX0VYSVNUSU5HX0NMQVNTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfQlVUVE9OX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfRklMVEVSX1dJWkFSRF9QQUdFX0RFU0M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9GSUxURVJfV0laQVJEX1BBR0VfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkRFU0NSSVBUSU9OX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ERVNDUklQVElPTl9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuRElTUEFUQ0hFUlNfTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkVESVRfQlVUVE9OX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5JTklUX1BBUkFNX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5JTklUX1BBUkFNX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5OQU1FX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5OQU1FX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5OT19XRUJfUFJPSkVDVFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlJFTU9WRV9CVVRUT05fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlVSTF9TRVJWTEVUX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5WQUxVRV9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVkFMVUVfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkZpbHRlck1hcHBpbmdJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklGaWx0ZXJNYXBwaW5nSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBGaWx0ZXIgV2l6YXJkIFNldHRpbmcgUGFnZQotICovCi1wdWJsaWMgY2xhc3MgQWRkRmlsdGVyV2l6YXJkUGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgewotCQotCWZpbmFsIHN0YXRpYyBTdHJpbmdbXSBGSUxURVJFWFRFTlNJT05TID0geyJqYXZhIn07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGV4dCBkaXNwbGF5TmFtZVRleHQ7Ci0KLQlGaWx0ZXJNYXBwaW5nc0FycmF5VGFibGVXaXphcmRTZWN0aW9uIG1hcHBpbmdTZWN0aW9uOwotCi0JcHVibGljIEFkZEZpbHRlcldpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldERlc2NyaXB0aW9uKEFERF9GSUxURVJfV0laQVJEX1BBR0VfREVTQyk7Ci0JCXNldFRpdGxlKEFERF9GSUxURVJfV0laQVJEX1BBR0VfVElUTEUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7IERJU1BMQVlfTkFNRSwgCi0JCSAgICAgICAgSU5JVF9QQVJBTSwgCi0JCSAgICAgICAgRklMVEVSX01BUFBJTkdTIH07Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljcmVhdGVOYW1lRGVzY3JpcHRpb24oY29tcG9zaXRlKTsKLQkJCi0JCVN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb25DYWxsYmFjaygpOwotCQlTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbiBpbml0U2VjdGlvbiA9IG5ldyBTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbigKLQkJCQljb21wb3NpdGUsIAotCQkJCUlOSVRfUEFSQU1fTEFCRUwsIAotCQkJCUlOSVRfUEFSQU1fVElUTEUsIAotCQkJCUFERF9CVVRUT05fTEFCRUwsIAotCQkJCUVESVRfQlVUVE9OX0xBQkVMLCAKLQkJCQlSRU1PVkVfQlVUVE9OX0xBQkVMLCAKLQkJCQluZXcgU3RyaW5nW10geyBOQU1FX1RJVExFLCBWQUxVRV9USVRMRSwgREVTQ1JJUFRJT05fVElUTEUgfSwgCi0JCQkJbmV3IFN0cmluZ1tdIHsgTkFNRV9MQUJFTCwgVkFMVUVfTEFCRUwsIERFU0NSSVBUSU9OX0xBQkVMIH0sIAotCQkJCW51bGwsLy8gV2ViUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgiaW5pdGlhbGl6X3BhcmFtZXRlciIpLAotCQkJCW1vZGVsLCAKLQkJCQlJTklUX1BBUkFNKTsKLQkJaW5pdFNlY3Rpb24uc2V0Q2FsbGJhY2soY2FsbGJhY2spOwotCQkKLQkJU3RyaW5nW10gYnV0dG9ucyA9IG5ldyBTdHJpbmdbXSB7Ci0JCSAgICAgICAgQUREX0JVVFRPTl9MQUJFTCwgCi0JCSAgICAgICAgRURJVF9CVVRUT05fTEFCRUwsIAotCQkgICAgICAgIFJFTU9WRV9CVVRUT05fTEFCRUwKLQkJfTsKLQkJU3RyaW5nW10gY29sdW1uTmFtZXMgPSBuZXcgU3RyaW5nW10gewotCQkgICAgICAgIG51bGwsCi0JCSAgICAgICAgVVJMX1NFUlZMRVRfTEFCRUwsCi0JCSAgICAgICAgRElTUEFUQ0hFUlNfTEFCRUwKLQkJfTsKLQkJbWFwcGluZ1NlY3Rpb24gPSBuZXcgRmlsdGVyTWFwcGluZ3NBcnJheVRhYmxlV2l6YXJkU2VjdGlvbihjb21wb3NpdGUsIAotCQkgICAgICAgICBtb2RlbCwgRklMVEVSX01BUFBJTkdTKTsKLQotCQlTdHJpbmcgdGV4dCA9IGRpc3BsYXlOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCS8vIFNldCBkZWZhdWx0IFVSTCBQYXR0ZXJuCi0JCUxpc3QgaW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlucHV0LmFkZChuZXcgRmlsdGVyTWFwcGluZ0l0ZW0oSUZpbHRlck1hcHBpbmdJdGVtLlVSTF9QQVRURVJOLCAiLyIgKyB0ZXh0KSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1hcHBpbmdTZWN0aW9uICE9IG51bGwpCi0JCSAgICBtYXBwaW5nU2VjdGlvbi5zZXRJbnB1dChpbnB1dCk7Ci0JCWRpc3BsYXlOYW1lVGV4dC5zZXRGb2N1cygpOwotCi0JCUlTdGF0dXMgcHJvamVjdFN0YXR1cyA9IHZhbGlkYXRlUHJvamVjdE5hbWUoKTsKLQkJaWYgKCFwcm9qZWN0U3RhdHVzLmlzT0soKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKHByb2plY3RTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCWNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0TmFtZSgpIHsKLQkJLy8gY2hlY2sgZm9yIGVtcHR5Ci0JCWlmIChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpID09IG51bGwgfHwgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhOT19XRUJfUFJPSkVDVFMpOwotCQl9Ci0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5hbWVEZXNjcmlwdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJLy8gZGlzcGxheSBuYW1lCi0JCUxhYmVsIGRpc3BsYXlOYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWRpc3BsYXlOYW1lTGFiZWwuc2V0VGV4dChOQU1FX0xBQkVMKTsKLQkJZGlzcGxheU5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQlkaXNwbGF5TmFtZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZGlzcGxheU5hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlkaXNwbGF5TmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBkaXNwbGF5TmFtZVRleHQuZ2V0VGV4dCgpOwotCQkJCS8vIFNldCBkZWZhdWx0IFVSTCBQYXR0ZXJuCi0JCQkJTGlzdCBpbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpbnB1dC5hZGQobmV3IEZpbHRlck1hcHBpbmdJdGVtKElGaWx0ZXJNYXBwaW5nSXRlbS5VUkxfUEFUVEVSTiwgIi8iICsgdGV4dCkpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKG1hcHBpbmdTZWN0aW9uICE9IG51bGwpCi0JCQkJICAgIG1hcHBpbmdTZWN0aW9uLnNldElucHV0KGlucHV0KTsKLQkJCX0KLQotCQl9KTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGRpc3BsYXlOYW1lVGV4dCwgRElTUExBWV9OQU1FLCBudWxsKTsKLQotCQkvLyBkZXNjcmlwdGlvbgotCQlMYWJlbCBkZXNjTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWRlc2NMYWJlbC5zZXRUZXh0KERFU0NSSVBUSU9OX0xBQkVMKTsKLQkJZGVzY0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCVRleHQgZGVzY1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZGVzY1RleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVGV4dChkZXNjVGV4dCwgREVTQ1JJUFRJT04sIG51bGwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBkaXNwbGF5TmFtZVRleHQuZ2V0VGV4dCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VfRVhJU1RJTkdfQ0xBU1MpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3VwZXIuY2FuRmxpcFRvTmV4dFBhZ2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd1ZhbGlkYXRpb25FcnJvcnNPbkVudGVyKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZExpc3RlbmVyV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZExpc3RlbmVyV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOTAwMjEuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRMaXN0ZW5lcldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfTElTVEVORVJfV0laQVJEX1BBR0VfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9MSVNURU5FUl9XSVpBUkRfV0lORE9XX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ORVdfSkFWQV9DTEFTU19ERVNUSU5BVElPTl9XSVpBUkRfUEFHRV9ERVNDOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ORVdfSkFWQV9DTEFTU19PUFRJT05TX1dJWkFSRF9QQUdFX0RFU0M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLklXZWJVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIE5ldyBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgbGlzdGVuZXIgd2l6YXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRMaXN0ZW5lcldpemFyZCBleHRlbmRzIE5ld1dlYkFydGlmYWN0V2l6YXJkIHsKLQkKLQlwdWJsaWMgQWRkTGlzdGVuZXJXaXphcmQoKSB7Ci0JICAgIHRoaXMobnVsbCk7Ci0JfQotCQotCXB1YmxpYyBBZGRMaXN0ZW5lcldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gQUREX0xJU1RFTkVSX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGdldEltYWdlRnJvbUoyRUVQbHVnaW4oIm5ld2xpc3RlbmVyX3dpeiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCU5ld0xpc3RlbmVyQ2xhc3NXaXphcmRQYWdlIHBhZ2UxID0gbmV3IE5ld0xpc3RlbmVyQ2xhc3NXaXphcmRQYWdlKAotCQkJCWdldERhdGFNb2RlbCgpLCAKLQkJCQlQQUdFX09ORSwKLQkJCQlORVdfSkFWQV9DTEFTU19ERVNUSU5BVElPTl9XSVpBUkRfUEFHRV9ERVNDLAotCQkJCUFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9USVRMRSwgSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUIpOwotCQlwYWdlMS5zZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5XRUJFRElUT1JfTElTVEVORVJfUEFHRV9BRERfTElTVEVORVJfV0laQVJEXzEpOwotCQlhZGRQYWdlKHBhZ2UxKTsKLQkJQWRkTGlzdGVuZXJXaXphcmRQYWdlIHBhZ2UyID0gbmV3IEFkZExpc3RlbmVyV2l6YXJkUGFnZShnZXREYXRhTW9kZWwoKSwgUEFHRV9UV08pOwotCQlwYWdlMi5zZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5XRUJFRElUT1JfTElTVEVORVJfUEFHRV9BRERfTElTVEVORVJfV0laQVJEXzIpOwotCQlhZGRQYWdlKHBhZ2UyKTsKLQkJTmV3TGlzdGVuZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlIHBhZ2UzID0gbmV3IE5ld0xpc3RlbmVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZSgKLQkJCQlnZXREYXRhTW9kZWwoKSwgCi0JCQkJUEFHRV9USFJFRSwKLQkJCQlORVdfSkFWQV9DTEFTU19PUFRJT05TX1dJWkFSRF9QQUdFX0RFU0MsCi0JCQkJQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX1RJVExFKTsKLQkJcGFnZTMuc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuV0VCRURJVE9SX0xJU1RFTkVSX1BBR0VfQUREX0xJU1RFTkVSX1dJWkFSRF8zKTsKLQkJYWRkUGFnZShwYWdlMyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvc3RQZXJmb3JtRmluaXNoKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkvLyBvcGVuIG5ldyBsaXN0ZW5lciBjbGFzcyBpbiBqYXZhIGVkaXRvcgotCQlvcGVuSmF2YUNsYXNzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTmV3TGlzdGVuZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRMaXN0ZW5lcldpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkTGlzdGVuZXJXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYzE3ODQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRMaXN0ZW5lcldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOVEVSRkFDRVM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld0xpc3RlbmVyQ2xhc3NEYXRhTW9kZWxQcm92aWRlci5MSVNURU5FUl9JTlRFUkZBQ0VTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9BQ1RJVkFUSU9OX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9BVFRSSUJVVEVfTElTVEVORVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfSFRUUF9TRVNTSU9OX0JJTkRJTkdfTElTVEVORVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfSFRUUF9TRVNTSU9OX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfQ09OVEVYVF9BVFRSSUJVVEVfTElTVEVORVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9DT05URVhUX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuSVNlcnZsZXRDb25zdGFudHMuUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9BVFRSSUJVVEVfTElTVEVORVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVF9SRVFVRVNUX0xJU1RFTkVSOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfTElTVEVORVJfV0laQVJEX0NIQU5HRVNfVE9fQVRUUklCVVRFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0xJU1RFTkVSX1dJWkFSRF9IVFRQX1NFU1NJT05fRVZFTlRTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfTElTVEVORVJfV0laQVJEX0xJRkVDWUNMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0xJU1RFTkVSX1dJWkFSRF9PQkpFQ1RfQklORElORzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX0RFU0M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQUREX0xJU1RFTkVSX1dJWkFSRF9TRVJWTEVUX0NPTlRFWFRfRVZFTlRTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfTElTVEVORVJfV0laQVJEX1NFUlZMRVRfUkVRVUVTVF9FVkVOVFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9MSVNURU5FUl9XSVpBUkRfU0VTU0lPTl9NSUdSQVRJT047Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkNMRUFSX0JVVFRPTjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuU0VMRUNUX0FMTF9CVVRUT047Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuSmF2YVBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLQotcHVibGljIGNsYXNzIEFkZExpc3RlbmVyV2l6YXJkUGFnZSBleHRlbmRzIERhdGFNb2RlbFdpemFyZFBhZ2UgIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSU5URVJGQUNFID0gSmF2YVBsdWdpbkltYWdlcy5nZXQoSmF2YVBsdWdpbkltYWdlcy5JTUdfT0JKU19JTlRFUkZBQ0UpOwotCi0JcHJvdGVjdGVkIFNlcnZsZXREYXRhTW9kZWxTeW5jSGVscGVyIHN5bmNoSGVscGVyOwotCQotCXB1YmxpYyBBZGRMaXN0ZW5lcldpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldERlc2NyaXB0aW9uKEFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9ERVNDKTsKLQkJc2V0VGl0bGUoQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX1RJVExFKTsKLQkJc3luY2hIZWxwZXIgPSBpbml0aWFsaXplU3luY2hIZWxwZXIobW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgU2VydmxldERhdGFNb2RlbFN5bmNIZWxwZXIgaW5pdGlhbGl6ZVN5bmNoSGVscGVyKElEYXRhTW9kZWwgZG0pIHsKLQkJcmV0dXJuIG5ldyBTZXJ2bGV0RGF0YU1vZGVsU3luY0hlbHBlcihkbSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJY3JlYXRlU2VydmxldENvbnRleHRFdmVudHMoY29tcG9zaXRlKTsKLQkJY3JlYXRlSHR0cFNlc3Npb25FdmVudHMoY29tcG9zaXRlKTsKLQkJY3JlYXRlU2VydmxldFJlcXVlc3RFdmVudHMoY29tcG9zaXRlKTsKLQkJY3JlYXRlU2VsZWN0QWxsR3JvdXAoY29tcG9zaXRlKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgCi0JCQkJSU5URVJGQUNFUwotCQl9OwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW50ZXIoKSB7Ci0JCXN1cGVyLmVudGVyKCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoVUlXaXRoTW9kZWwoSU5URVJGQUNFUywgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VydmxldENvbnRleHRFdmVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgQUREX0xJU1RFTkVSX1dJWkFSRF9TRVJWTEVUX0NPTlRFWFRfRVZFTlRTKTsKLQotCQljcmVhdGVFdmVudExpc3RlbmVyUm93KGdyb3VwLCAKLQkJCQlBRERfTElTVEVORVJfV0laQVJEX0xJRkVDWUNMRSwgCi0JCQkJUVVBTElGSUVEX1NFUlZMRVRfQ09OVEVYVF9MSVNURU5FUiwKLQkJCQlJTlRFUkZBQ0VTKTsKLQotCQljcmVhdGVFdmVudExpc3RlbmVyUm93KGdyb3VwLCAKLQkJCQlBRERfTElTVEVORVJfV0laQVJEX0NIQU5HRVNfVE9fQVRUUklCVVRFUywgCi0JCQkJUVVBTElGSUVEX1NFUlZMRVRfQ09OVEVYVF9BVFRSSUJVVEVfTElTVEVORVIsIAotCQkJCUlOVEVSRkFDRVMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlSHR0cFNlc3Npb25FdmVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgQUREX0xJU1RFTkVSX1dJWkFSRF9IVFRQX1NFU1NJT05fRVZFTlRTKTsKLQkJCi0JCWNyZWF0ZUV2ZW50TGlzdGVuZXJSb3coZ3JvdXAsIAotCQkJCUFERF9MSVNURU5FUl9XSVpBUkRfTElGRUNZQ0xFLCAKLQkJCQlRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0xJU1RFTkVSLCAKLQkJCQlJTlRFUkZBQ0VTKTsKLQkJCi0JCWNyZWF0ZUV2ZW50TGlzdGVuZXJSb3coZ3JvdXAsIAotCQkJCUFERF9MSVNURU5FUl9XSVpBUkRfQ0hBTkdFU19UT19BVFRSSUJVVEVTLCAKLQkJCQlRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0FUVFJJQlVURV9MSVNURU5FUiwgCi0JCQkJSU5URVJGQUNFUyk7Ci0JCQotCQljcmVhdGVFdmVudExpc3RlbmVyUm93KGdyb3VwLCAKLQkJCQlBRERfTElTVEVORVJfV0laQVJEX1NFU1NJT05fTUlHUkFUSU9OLCAKLQkJCQlRVUFMSUZJRURfSFRUUF9TRVNTSU9OX0FDVElWQVRJT05fTElTVEVORVIsIAotCQkJCUlOVEVSRkFDRVMpOwotCQkKLQkJY3JlYXRlRXZlbnRMaXN0ZW5lclJvdyhncm91cCwgCi0JCQkJQUREX0xJU1RFTkVSX1dJWkFSRF9PQkpFQ1RfQklORElORywgCi0JCQkJUVVBTElGSUVEX0hUVFBfU0VTU0lPTl9CSU5ESU5HX0xJU1RFTkVSLCAKLQkJCQlJTlRFUkZBQ0VTKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlcnZsZXRSZXF1ZXN0RXZlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIEFERF9MSVNURU5FUl9XSVpBUkRfU0VSVkxFVF9SRVFVRVNUX0VWRU5UUyk7Ci0JCQotCQljcmVhdGVFdmVudExpc3RlbmVyUm93KGdyb3VwLCAKLQkJCQlBRERfTElTVEVORVJfV0laQVJEX0xJRkVDWUNMRSwgCi0JCQkJUVVBTElGSUVEX1NFUlZMRVRfUkVRVUVTVF9MSVNURU5FUiwgCi0JCQkJSU5URVJGQUNFUyk7Ci0KLQkJY3JlYXRlRXZlbnRMaXN0ZW5lclJvdyhncm91cCwgCi0JCQkJQUREX0xJU1RFTkVSX1dJWkFSRF9DSEFOR0VTX1RPX0FUVFJJQlVURVMsIAotCQkJCVFVQUxJRklFRF9TRVJWTEVUX1JFUVVFU1RfQVRUUklCVVRFX0xJU1RFTkVSLCAKLQkJCQlJTlRFUkZBQ0VTKTsKLQl9Ci0JCi0JcHJpdmF0ZSBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCi0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJZ3JvdXAuc2V0VGV4dCh0ZXh0KTsKLQkJCi0JCXJldHVybiBncm91cDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUV2ZW50TGlzdGVuZXJSb3coQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGV2ZW50LCBTdHJpbmcgbGlzdGVuZXIsIFN0cmluZyBwcm9wZXJ0eSkgewotCQljcmVhdGVDaGVja2JveChwYXJlbnQsIGV2ZW50LCBsaXN0ZW5lciwgcHJvcGVydHkpOwotCQljcmVhdGVJbnRlcmZhY2VJY29uKHBhcmVudCk7Ci0JCWNyZWF0ZUludGVyZmFjZUxhYmVsKHBhcmVudCwgbGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQkKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCB0cnVlKSk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goYnV0dG9uLCB2YWx1ZSwgcHJvcGVydHksIG51bGwpOwotCQkKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVJbnRlcmZhY2VJY29uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSA1MDsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5SSUdIVCk7Ci0JCWxhYmVsLnNldEltYWdlKElNR19JTlRFUkZBQ0UpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQlwcml2YXRlIExhYmVsIGNyZWF0ZUludGVyZmFjZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQkKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VsZWN0QWxsR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCQotCQlCdXR0b24gc2VsZWN0QWxsID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsLnNldFRleHQoU0VMRUNUX0FMTF9CVVRUT04pOwotCQlzZWxlY3RBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlU2VsZWN0QWxsKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQnV0dG9uIGNsZWFyID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJY2xlYXIuc2V0VGV4dChDTEVBUl9CVVRUT04pOwotCQljbGVhci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTZWxlY3ROb25lKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZWxlY3RBbGwoKSB7Ci0JCUxpc3QgaW50ZXJmYWNlcyA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJTlRFUkZBQ0VTKTsKLQkJaWYgKGludGVyZmFjZXMgPT0gbnVsbCkgewotCQkJaW50ZXJmYWNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCW1vZGVsLnNldFByb3BlcnR5KElOVEVSRkFDRVMsIGludGVyZmFjZXMpOwotCQl9Ci0JCQotCQlmb3IgKFN0cmluZyBpZmFjZSA6IExJU1RFTkVSX0lOVEVSRkFDRVMpIHsKLQkJCWlmICghaW50ZXJmYWNlcy5jb250YWlucyhpZmFjZSkpIHsKLQkJCQlpbnRlcmZhY2VzLmFkZChpZmFjZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXN5bmNoSGVscGVyLnN5bmNoVUlXaXRoTW9kZWwoSU5URVJGQUNFUywgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQkJbW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoSU5URVJGQUNFUywgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0Tm9uZSgpIHsKLQkJTGlzdCBpbnRlcmZhY2VzID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElOVEVSRkFDRVMpOwotCQlpZiAoaW50ZXJmYWNlcyA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbW9kZWwuc2V0UHJvcGVydHkoSU5URVJGQUNFUywgaW50ZXJmYWNlcyk7Ci0JCX0KLQkJCi0JCWludGVyZmFjZXMucmVtb3ZlQWxsKEFycmF5cy5hc0xpc3QoTElTVEVORVJfSU5URVJGQUNFUykpOwotCQkKLQkJc3luY2hIZWxwZXIuc3luY2hVSVdpdGhNb2RlbChJTlRFUkZBQ0VTLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShJTlRFUkZBQ0VTLCBEYXRhTW9kZWxFdmVudC5WQUxVRV9DSEcpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9BZGRTZXJ2bGV0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZFNlcnZsZXRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNhMzVkNi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZFNlcnZsZXRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JU19TRVJWTEVUX1RZUEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ORVdfSkFWQV9DTEFTU19ERVNUSU5BVElPTl9XSVpBUkRfUEFHRV9ERVNDOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ORVdfSkFWQV9DTEFTU19PUFRJT05TX1dJWkFSRF9QQUdFX0RFU0M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5OZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5JV2ViVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLQotLyoqCi0gKiBOZXcgc2VydmxldCB3aXphcmQKLSAqLwotcHVibGljIGNsYXNzIEFkZFNlcnZsZXRXaXphcmQgZXh0ZW5kcyBOZXdXZWJBcnRpZmFjdFdpemFyZCB7Ci0JCi0JcHVibGljIEFkZFNlcnZsZXRXaXphcmQoKSB7Ci0JICAgIHRoaXMobnVsbCk7Ci0JfQotCQotCXB1YmxpYyBBZGRTZXJ2bGV0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBBRERfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigibmV3c2VydmxldF93aXoiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlOZXdTZXJ2bGV0Q2xhc3NXaXphcmRQYWdlIHBhZ2UxID0gbmV3IE5ld1NlcnZsZXRDbGFzc1dpemFyZFBhZ2UoCi0JCQkJZ2V0RGF0YU1vZGVsKCksIAotCQkJCVBBR0VfT05FLAotCQkJCU5FV19KQVZBX0NMQVNTX0RFU1RJTkFUSU9OX1dJWkFSRF9QQUdFX0RFU0MsCi0JCQkJQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEUsIEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCKTsKLQkJcGFnZTEuc2V0SW5mb3BvcElEKElXZWJVSUNvbnRleHRJZHMuV0VCRURJVE9SX1NFUlZMRVRfUEFHRV9BRERfU0VSVkxFVF9XSVpBUkRfMSk7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCQlBZGRTZXJ2bGV0V2l6YXJkUGFnZSBwYWdlMiA9IG5ldyBBZGRTZXJ2bGV0V2l6YXJkUGFnZShnZXREYXRhTW9kZWwoKSwgUEFHRV9UV08pOwotCQlwYWdlMi5zZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5XRUJFRElUT1JfU0VSVkxFVF9QQUdFX0FERF9TRVJWTEVUX1dJWkFSRF8yKTsKLQkJYWRkUGFnZShwYWdlMik7Ci0JCU5ld1NlcnZsZXRDbGFzc09wdGlvbnNXaXphcmRQYWdlIHBhZ2UzID0gbmV3IE5ld1NlcnZsZXRDbGFzc09wdGlvbnNXaXphcmRQYWdlKAotCQkJCWdldERhdGFNb2RlbCgpLCAKLQkJCQlQQUdFX1RIUkVFLAotCQkJCU5FV19KQVZBX0NMQVNTX09QVElPTlNfV0laQVJEX1BBR0VfREVTQywKLQkJCQlBRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRSk7Ci0JCXBhZ2UzLnNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldFQkVESVRPUl9TRVJWTEVUX1BBR0VfQUREX1NFUlZMRVRfV0laQVJEXzMpOwotCQlhZGRQYWdlKHBhZ2UzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFBlcmZvcm1GaW5pc2goKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gaXNTZXJ2bGV0ID0gZ2V0RGF0YU1vZGVsKCkuZ2V0Qm9vbGVhblByb3BlcnR5KElTX1NFUlZMRVRfVFlQRSk7Ci0JCWlmIChpc1NlcnZsZXQpIHsKLQkJCS8vIG9wZW4gbmV3IHNlcnZsZXQgY2xhc3MgaW4gamF2YSBlZGl0b3IKLQkJCW9wZW5KYXZhQ2xhc3MoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIG9wZW4gbmV3IGpzcCBmaWxlIGluIGpzcCBlZGl0b3IKLQkJCW9wZW5XZWJGaWxlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkU2VydmxldFdpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQWRkU2VydmxldFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4NjFjYi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0FkZFNlcnZsZXRXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqICAgICBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSVRfUEFSQU07Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVSTF9NQVBQSU5HUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ERVNDUklQVElPTjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ESVNQTEFZX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdXZWJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuVVNFX0VYSVNUSU5HX0NMQVNTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfQlVUVE9OX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9ERVNDOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5BRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuREVTQ1JJUFRJT05fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkRFU0NSSVBUSU9OX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5FRElUX0JVVFRPTl9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuSU5JVF9QQVJBTV9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuSU5JVF9QQVJBTV9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTkFNRV9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTkFNRV9USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuTk9fV0VCX1BST0pFQ1RTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5SRU1PVkVfQlVUVE9OX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5VUkxfTUFQUElOR1NfTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlVSTF9NQVBQSU5HU19USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVVJMX1BBVFRFUk5fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlVSTF9QQVRURVJOX1RJVExFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5WQUxVRV9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVkFMVUVfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5TdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIFNlcnZsZXQgV2l6YXJkIFNldHRpbmcgUGFnZQotICovCi1wdWJsaWMgY2xhc3MgQWRkU2VydmxldFdpemFyZFBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIHsKLQlmaW5hbCBzdGF0aWMgU3RyaW5nW10gSlNQRVhURU5TSU9OUyA9IHsianNwIn07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGV4dCBkaXNwbGF5TmFtZVRleHQ7Ci0KLQlwcml2YXRlIFN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uIHVybFNlY3Rpb247Ci0KLQlwdWJsaWMgQWRkU2VydmxldFdpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldERlc2NyaXB0aW9uKEFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX0RFU0MpOwotCQl0aGlzLnNldFRpdGxlKEFERF9TRVJWTEVUX1dJWkFSRF9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS51dGlsLnVpLndpemFyZC5XVFBXaXphcmRQYWdlI2dldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBESVNQTEFZX05BTUUsIElOSVRfUEFSQU0sIFVSTF9NQVBQSU5HUyB9OwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IDMwMDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY3JlYXRlTmFtZURlc2NyaXB0aW9uKGNvbXBvc2l0ZSk7Ci0JCQotCQlTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbkNhbGxiYWNrIGNhbGxiYWNrID0gbmV3IFN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uQ2FsbGJhY2soKTsKLQkJU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24gaW5pdFNlY3Rpb24gPSBuZXcgU3RyaW5nQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24oCi0JCQkJY29tcG9zaXRlLCAKLQkJCQlJTklUX1BBUkFNX0xBQkVMLCAKLQkJCQlJTklUX1BBUkFNX1RJVExFLCAKLQkJCQlBRERfQlVUVE9OX0xBQkVMLCAKLQkJCQlFRElUX0JVVFRPTl9MQUJFTCwgCi0JCQkJUkVNT1ZFX0JVVFRPTl9MQUJFTCwgCi0JCQkJbmV3IFN0cmluZ1tdIHsgTkFNRV9USVRMRSwgVkFMVUVfVElUTEUsIERFU0NSSVBUSU9OX1RJVExFIH0sIAotCQkJCW5ldyBTdHJpbmdbXSB7IE5BTUVfTEFCRUwsIFZBTFVFX0xBQkVMLCBERVNDUklQVElPTl9MQUJFTCB9LCAKLQkJCQludWxsLC8vIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoImluaXRpYWxpel9wYXJhbWV0ZXIiKSwKLQkJCQltb2RlbCwgCi0JCQkJSU5JVF9QQVJBTSk7Ci0JCWluaXRTZWN0aW9uLnNldENhbGxiYWNrKGNhbGxiYWNrKTsKLQkJdXJsU2VjdGlvbiA9IG5ldyBTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbigKLQkJCQljb21wb3NpdGUsIAotCQkJCVVSTF9NQVBQSU5HU19MQUJFTCwgCi0JCQkJVVJMX01BUFBJTkdTX1RJVExFLCAKLQkJCQlBRERfQlVUVE9OX0xBQkVMLCAKLQkJCQlFRElUX0JVVFRPTl9MQUJFTCwgCi0JCQkJUkVNT1ZFX0JVVFRPTl9MQUJFTCwKLQkJCQluZXcgU3RyaW5nW10geyBVUkxfUEFUVEVSTl9USVRMRSB9LCAKLQkJCQluZXcgU3RyaW5nW10geyBVUkxfUEFUVEVSTl9MQUJFTCB9LCAKLQkJCQludWxsLC8vIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInVybF90eXBlIiksCi0JCQkJbW9kZWwsIAotCQkJCVVSTF9NQVBQSU5HUyk7Ci0JCXVybFNlY3Rpb24uc2V0Q2FsbGJhY2soY2FsbGJhY2spOwotCQkKLQkJU3RyaW5nIHRleHQgPSBkaXNwbGF5TmFtZVRleHQuZ2V0VGV4dCgpOwotCQkvLyBTZXQgZGVmYXVsdCBVUkwgUGF0dGVybgotCQlMaXN0IGlucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnB1dC5hZGQobmV3IFN0cmluZ1tdeyIvIiArIHRleHR9KTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsU2VjdGlvbiAhPSBudWxsKQotCQkJdXJsU2VjdGlvbi5zZXRJbnB1dChpbnB1dCk7Ci0JCWRpc3BsYXlOYW1lVGV4dC5zZXRGb2N1cygpOwotCi0JCUlTdGF0dXMgcHJvamVjdFN0YXR1cyA9IHZhbGlkYXRlUHJvamVjdE5hbWUoKTsKLQkJaWYgKCFwcm9qZWN0U3RhdHVzLmlzT0soKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKHByb2plY3RTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCWNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVQcm9qZWN0TmFtZSgpIHsKLQkJLy8gY2hlY2sgZm9yIGVtcHR5Ci0JCWlmIChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpID09IG51bGwgfHwgbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoUFJPSkVDVF9OQU1FKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhOT19XRUJfUFJPSkVDVFMpOwotCQl9Ci0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5hbWVEZXNjcmlwdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJLy8gZGlzcGxheSBuYW1lCi0JCUxhYmVsIGRpc3BsYXlOYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWRpc3BsYXlOYW1lTGFiZWwuc2V0VGV4dChOQU1FX0xBQkVMKTsKLQkJZGlzcGxheU5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQlkaXNwbGF5TmFtZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZGlzcGxheU5hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlkaXNwbGF5TmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBkaXNwbGF5TmFtZVRleHQuZ2V0VGV4dCgpOwotCQkJCS8vIFNldCBkZWZhdWx0IFVSTCBQYXR0ZXJuCi0JCQkJTGlzdCBpbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpbnB1dC5hZGQobmV3IFN0cmluZ1tdeyIvIiArIHRleHR9KTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh1cmxTZWN0aW9uICE9IG51bGwpCi0JCQkJCXVybFNlY3Rpb24uc2V0SW5wdXQoaW5wdXQpOwotCQkJfQotCi0JCX0pOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoZGlzcGxheU5hbWVUZXh0LCBESVNQTEFZX05BTUUsIG51bGwpOwotCi0JCS8vIGRlc2NyaXB0aW9uCi0JCUxhYmVsIGRlc2NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJZGVzY0xhYmVsLnNldFRleHQoREVTQ1JJUFRJT05fTEFCRUwpOwotCQlkZXNjTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJVGV4dCBkZXNjVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlkZXNjVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGRlc2NUZXh0LCBERVNDUklQVElPTiwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGRpc3BsYXlOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlpZiAobW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVTRV9FWElTVElOR19DTEFTUykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBlci5jYW5GbGlwVG9OZXh0UGFnZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93VmFsaWRhdGlvbkVycm9yc09uRW50ZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlV2ViTGliUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQXZhaWxhYmxlV2ViTGliUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlNWU0YS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0F2YWlsYWJsZVdlYkxpYlByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUuQXJjaGl2ZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkF2YWlsYWJsZUphcnNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBBdmFpbGFibGVXZWJMaWJQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyBBdmFpbGFibGVXZWJMaWJQcm92aWRlcigpIHsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgQXJjaGl2ZVdyYXBwZXIpIHsKLQkJCU9iamVjdFtdIGFycmF5ID0gKChBcmNoaXZlV3JhcHBlcikgaW5wdXRFbGVtZW50KS5nZXRXZWJMaWJzKCkudG9BcnJheSgpOwotCQkJQXJyYXlzLnNvcnQoYXJyYXksIG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQlyZXR1cm4gZ2V0Q29sdW1uVGV4dChvMSwgMCkuY29tcGFyZVRvKGdldENvbHVtblRleHQobzIsIDApKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCXJldHVybiBBdmFpbGFibGVKYXJzUHJvdmlkZXIuZ2V0VXRpbEltYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJQXJjaGl2ZVdyYXBwZXIgd3JhcHBlciA9IChBcmNoaXZlV3JhcHBlcillbGVtZW50OwotCQlyZXR1cm4gd3JhcHBlci5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0NvbnZlcnRUb1dlYk1vZHVsZVR5cGVEaWFsb2cuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQ29udmVydFRvV2ViTW9kdWxlVHlwZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDRkN2MzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvQ29udmVydFRvV2ViTW9kdWxlVHlwZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuSVNoZWxsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGNsYXNzIENvbnZlcnRUb1dlYk1vZHVsZVR5cGVEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCQotCXByaXZhdGUgU3RyaW5nIGZTaGVsbFRpdGxlID0gSVdlYldpemFyZENvbnN0YW50cy5DT05WRVJUX1RPX1dFQl9USVRMRTsKLQlwcml2YXRlIFN0cmluZyBmTGFiZWxUZXh0ID0gSVdlYldpemFyZENvbnN0YW50cy5TRUxFQ1RfV0VCX1ZFUlNJT047Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZTZWxlY3Rpb249IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBmQWxsb3dlZFN0cmluZ3MgPSBuZXcgU3RyaW5nW10ge0oyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8yX1RFWFQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl8zX1RFWFQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl80X1RFWFQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMl81X1RFWFR9OwotCXByaXZhdGUgaW50IGZJbml0aWFsU2VsZWN0aW9uSW5kZXggPSBmQWxsb3dlZFN0cmluZ3MubGVuZ3RoLTE7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRWZXJzaW9uKCkgewotCQlyZXR1cm4gZlNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgQ29udmVydFRvV2ViTW9kdWxlVHlwZURpYWxvZyhJU2hlbGxQcm92aWRlciBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JfQotCi0JcHVibGljIENvbnZlcnRUb1dlYk1vZHVsZVR5cGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlnZXRTaGVsbCgpLnNldFRleHQoZlNoZWxsVGl0bGUpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlDb21wb3NpdGUgaW5uZXJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlpbm5lckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJR3JpZExheW91dCBnbD0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2wubnVtQ29sdW1ucz0gMjsKLQkJaW5uZXJDb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLQkJCi0JCUxhYmVsIGxhYmVsPSBuZXcgTGFiZWwoaW5uZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChmTGFiZWxUZXh0KTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJZmluYWwgQ29tYm8gY29tYm89IG5ldyBDb21ibyhpbm5lckNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkFsbG93ZWRTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb21iby5hZGQoZkFsbG93ZWRTdHJpbmdzW2ldKTsKLQkJfQotCQljb21iby5zZWxlY3QoZkluaXRpYWxTZWxlY3Rpb25JbmRleCk7Ci0JCWZTZWxlY3Rpb249IGNvbWJvLmdldEl0ZW0oY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCUdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZlNlbGVjdGlvbj0gY29tYm8uZ2V0SXRlbShjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9GaWx0ZXJNYXBwaW5nc0FycmF5VGFibGVXaXphcmRTZWN0aW9uLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0ZpbHRlck1hcHBpbmdzQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhN2ZlYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0ZpbHRlck1hcHBpbmdzQXJyYXlUYWJsZVdpemFyZFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkFERF9CVVRUT05fTEFCRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkRJU1BBVENIRVJTX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5FRElUX0JVVFRPTl9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuRklMVEVSX01BUFBJTkdTX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5SRU1PVkVfQlVUVE9OX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5VUkxfU0VSVkxFVF9MQUJFTDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5GaWx0ZXJNYXBwaW5nSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JRmlsdGVyTWFwcGluZ0l0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnBsdWdpbi5XZWJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVycy5XZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRmlsdGVyTWFwcGluZ3NBcnJheVRhYmxlV2l6YXJkU2VjdGlvbiBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU3RyaW5nQXJyYXlMaXN0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlzdCkgewotCQkJCXJldHVybiAoKExpc3Q8RmlsdGVyTWFwcGluZ0l0ZW0+KSBlbGVtZW50KS50b0FycmF5KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFWaWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkvL0RlZmF1bHQgbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkvL0RlZmF1bHQgbm90aGluZwotCQl9Ci0JfQotCXByb3RlY3RlZCBjbGFzcyBTdHJpbmdBcnJheUxpc3RMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEltYWdlIFVSTF9QQVRURVJOX0lDT04gPSAKLSAgICAgICAgICAgIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKChVUkwpIFdlYlBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoInVybF9tYXBwaW5nIikpLmNyZWF0ZUltYWdlKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSW1hZ2UgU0VSVkxFVF9JQ09OID0gCi0gICAgICAgICAgICBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCgoVVJMKSBXZWJQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzZXJ2bGV0IikpLmNyZWF0ZUltYWdlKCk7Ci0KLSAgICAgICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJICAgIGlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCSAgICAgICAgRmlsdGVyTWFwcGluZ0l0ZW0gaXRlbSA9IChGaWx0ZXJNYXBwaW5nSXRlbSkgZWxlbWVudDsKLQkJICAgICAgICBpZiAoaXRlbS5pc1NlcnZsZXROYW1lVHlwZSgpKSB7Ci0JCSAgICAgICAgICAgIHJldHVybiBTRVJWTEVUX0lDT047Ci0JCSAgICAgICAgfSBlbHNlIGlmIChpdGVtLmlzVXJsUGF0dGVyblR5cGUoKSkgewotCQkgICAgICAgICAgICByZXR1cm4gVVJMX1BBVFRFUk5fSUNPTjsKLQkJICAgICAgICB9Ci0JCSAgICAgICAgCi0JCSAgICB9Ci0JCSAgICByZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJICAgIGlmIChjb2x1bW5JbmRleCA9PSAxKSB7Ci0JCSAgICAgICAgcmV0dXJuICgoRmlsdGVyTWFwcGluZ0l0ZW0pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJICAgIH0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMikgewotCQkgICAgICAgIHJldHVybiAoKEZpbHRlck1hcHBpbmdJdGVtKSBlbGVtZW50KS5nZXREaXNwYXRjaGVyc0FzU3RyaW5nKCk7Ci0JCSAgICB9Ci0JCSAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0JfQotCQotCWZpbmFsIHN0YXRpYyBpbnQgSUNPTl9XSURUSCA9IDI1OwotCWZpbmFsIHN0YXRpYyBpbnQgRElTUEFUQ0hFUlNfV0lEVEggPSAxMDA7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElDT05fUFJPUCA9ICJJQ09OX1BST1AiOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBOQU1FX1BST1AgPSAiTkFNRV9QUk9QIjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElTUEFUQ0hFUlNfUFJPUCA9ICJESVNQQVRDSEVSU19QUk9QIjsKLQkKLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZWRpdEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIG1vZGVsOwotCXByaXZhdGUgU3RyaW5nIHByb3BlcnR5TmFtZTsKLQotICAgIHB1YmxpYyBGaWx0ZXJNYXBwaW5nc0FycmF5VGFibGVXaXphcmRTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkgICAgc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JICAgIAotICAgICAgICB0aGlzLm1vZGVsID0gbW9kZWw7Ci0gICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotICAgICAgICAKLSAgICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0gICAgICAgIGxheW91dC5tYXJnaW5IZWlnaHQgPSA0OwotICAgICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotICAgICAgICB0aGlzLnNldExheW91dChsYXlvdXQpOwotICAgICAgICB0aGlzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0gICAgICAgIExhYmVsIHRpdGxlTGFiZWwgPSBuZXcgTGFiZWwodGhpcywgU1dULkxFRlQpOwotICAgICAgICB0aXRsZUxhYmVsLnNldFRleHQoRklMVEVSX01BUFBJTkdTX0xBQkVMKTsKLSAgICAgICAgR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLSAgICAgICAgdGl0bGVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0gICAgICAgIFRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHRoaXMsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIpOwotICAgICAgICB2aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotICAgICAgICB0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLSAgICAgICAgdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU3RyaW5nQXJyYXlMaXN0Q29udGVudFByb3ZpZGVyKCkpOwotICAgICAgICB2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgU3RyaW5nQXJyYXlMaXN0TGFiZWxQcm92aWRlcigpKTsKLQotCQlmaW5hbCBDb21wb3NpdGUgYnV0dG9uQ29tcG8gPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OVUxMKTsKLSAgICAgICAgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICAgICAgbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0gICAgICAgIGJ1dHRvbkNvbXBvLnNldExheW91dChsYXlvdXQpOwotICAgICAgICBidXR0b25Db21wby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLSAgICAgICAgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wbywgU1dULlBVU0gpOwotICAgICAgICBhZGRCdXR0b24uc2V0VGV4dChBRERfQlVUVE9OX0xBQkVMKTsKLSAgICAgICAgYWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyB8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotICAgICAgICBhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVBZGRCdXR0b25TZWxlY3RlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgLy9EbyBub3RoaW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIGVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvLCBTV1QuUFVTSCk7Ci0gICAgICAgIGVkaXRCdXR0b24uc2V0VGV4dChFRElUX0JVVFRPTl9MQUJFTCk7Ci0gICAgICAgIGVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgICAgIGVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFZGl0QnV0dG9uU2VsZWN0ZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIC8vRG8gbm90aGluZwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvLCBTV1QuUFVTSCk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRUZXh0KFJFTU9WRV9CVVRUT05fTEFCRUwpOwotICAgICAgICByZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAvL0RvIG5vdGhpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgICAgICB2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChlZGl0QnV0dG9uICE9IG51bGwpIHsKLQkJCQkJYm9vbGVhbiBlbmFibGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCkgPT0gMTsKLQkJCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCX0KLSAgICAgICAgICAgICAgICByZW1vdmVCdXR0b24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICAKLQkJaWYgKGVkaXRCdXR0b24gIT0gbnVsbCkgewotCQkJdmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQkJaGFuZGxlRWRpdEJ1dHRvblNlbGVjdGVkKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0gICAgICAgIFRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCXRhYmxlQ29sdW1uLnNldFdpZHRoKElDT05fV0lEVEgpOwotCQl0YWJsZUNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCQl0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotICAgICAgICB0YWJsZUNvbHVtbi5zZXRUZXh0KFVSTF9TRVJWTEVUX0xBQkVMKTsKLSAgICAgICAgdGFibGVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotICAgICAgICB0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotICAgICAgICB0YWJsZUNvbHVtbi5zZXRUZXh0KERJU1BBVENIRVJTX0xBQkVMKTsKLSAgICAgICAgdGFibGVDb2x1bW4uc2V0V2lkdGgoRElTUEFUQ0hFUlNfV0lEVEgpOwotICAgICAgICB0YWJsZUNvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotICAgICAgICB2aWV3ZXIuc2V0Q29sdW1uUHJvcGVydGllcyhuZXcgU3RyaW5nW10ge0lDT05fUFJPUCwgTkFNRV9QUk9QLCBESVNQQVRDSEVSU19QUk9QfSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRoaXMuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCSAgICAgICAgVGFibGUgdGFibGUgPSB2aWV3ZXIuZ2V0VGFibGUoKTsKLQkJICAgICAgICBUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCSAgICAgICAgUG9pbnQgYnV0dG9uQXJlYSA9IGJ1dHRvbkNvbXBvLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCSAgICAgICAgUmVjdGFuZ2xlIGFyZWEgPSB0YWJsZS5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCSAgICAgICAgUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHZpZXdlci5nZXRUYWJsZSgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCSAgICAgICAgaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIqdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKSAtIGJ1dHRvbkFyZWEueCAtIGNvbHVtbnMubGVuZ3RoKjI7Ci0JCSAgICAgICAgaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0ICsgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCkpIHsKLQkJICAgICAgICAgICAgLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4gd2lkdGgKLQkJICAgICAgICAgICAgLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotCQkgICAgICAgICAgICBQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotCQkgICAgICAgICAgICB3aWR0aCAtPSB2QmFyU2l6ZS54OwotCQkgICAgICAgIH0KLQkJICAgICAgICBQb2ludCBvbGRTaXplID0gdGFibGUuZ2V0U2l6ZSgpOwotCQkgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJICAgICAgICAgICAgaWYgKG9sZFNpemUueCA+IGFyZWEud2lkdGgpIHsKLQkJICAgICAgICAgICAgICAgIC8vIHRhYmxlIGlzIGdldHRpbmcgc21hbGxlciBzbyBtYWtlIHRoZSBjb2x1bW5zIAotCQkgICAgICAgICAgICAgICAgLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCSAgICAgICAgICAgICAgICAvLyBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJICAgICAgICAgICAgICAgIGlmIChpID09IDEpIGNvbHVtbnNbaV0uc2V0V2lkdGgod2lkdGggLSBJQ09OX1dJRFRIIC0gRElTUEFUQ0hFUlNfV0lEVEgpOwotCQkgICAgICAgICAgICAgICAgdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoIC0gYnV0dG9uQXJlYS54IC0gY29sdW1ucy5sZW5ndGgqMiwgYXJlYS5oZWlnaHQpOwotCQkgICAgICAgICAgICB9IGVsc2UgewotCQkgICAgICAgICAgICAgICAgLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUgCi0JCSAgICAgICAgICAgICAgICAvLyBiaWdnZXIgZmlyc3QgYW5kIHRoZW4gbWFrZSB0aGUgY29sdW1ucyB3aWRlcgotCQkgICAgICAgICAgICAgICAgLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCSAgICAgICAgICAgICAgICB0YWJsZS5zZXRTaXplKGFyZWEud2lkdGggLSBidXR0b25BcmVhLnggLSBjb2x1bW5zLmxlbmd0aCoyLCBhcmVhLmhlaWdodCk7Ci0JCSAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSBjb2x1bW5zW2ldLnNldFdpZHRoKHdpZHRoIC0gSUNPTl9XSURUSCAtIERJU1BBVENIRVJTX1dJRFRIKTsKLQkJICAgICAgICAgICAgfQotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUFkZEJ1dHRvblNlbGVjdGVkKCkgewotCSAgICBTdHJpbmcgdGl0bGUgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQWRkX0ZpbHRlcl9NYXBwaW5nX1RpdGxlX1VJXyIpOwotCSAgICBJUHJvamVjdCBwID0gKElQcm9qZWN0KSBtb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUKTsKLQkgICAgTGlzdCB2YWx1ZUxpc3QgPSAoTGlzdCkgdmlld2VyLmdldElucHV0KCk7Ci0JICAgIEFkZEVkaXRGaWx0ZXJNYXBwaW5nRGlhbG9nIGRpYWxvZyA9IAotCSAgICAgICAgbmV3IEFkZEVkaXRGaWx0ZXJNYXBwaW5nRGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCBwLCB2YWx1ZUxpc3QsIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQotCQlhZGRGaWx0ZXJNYXBwaW5nKChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQubGVuZ3RoID4gMCkgPyAoSUZpbHRlck1hcHBpbmdJdGVtKSByZXN1bHRbMF0gOiBudWxsKTsKLQl9Ci0KLSAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUVkaXRCdXR0b25TZWxlY3RlZCgpIHsKLSAgICAgICAgIFN0cmluZyB0aXRsZSA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJFZGl0X0ZpbHRlcl9NYXBwaW5nX1RpdGxlX1VJXyIpOwotCQlJU2VsZWN0aW9uIHMgPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghKHMgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgczsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgIT0gMSkKLQkJCXJldHVybjsKLQkJTGlzdCB2YWx1ZUxpc3QgPSAoTGlzdCkgdmlld2VyLmdldElucHV0KCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iaiA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJRmlsdGVyTWFwcGluZ0l0ZW0gdmFsdWUgPSAoRmlsdGVyTWFwcGluZ0l0ZW0pIHNlbGVjdGVkT2JqOwotCQlJUHJvamVjdCBwID0gKElQcm9qZWN0KSBtb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUKTsKLQkJQWRkRWRpdEZpbHRlck1hcHBpbmdEaWFsb2cgZGlhbG9nID0gCi0gICAgICAgICAgICBuZXcgQWRkRWRpdEZpbHRlck1hcHBpbmdEaWFsb2coZ2V0U2hlbGwoKSwgdGl0bGUsIHAsIHZhbHVlTGlzdCwgdmFsdWUpOwotCQlkaWFsb2cub3BlbigpOwotCQlPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCB8fCByZXN1bHQubGVuZ3RoID09IDApIHJldHVybjsKLQkJZWRpdEZpbHRlck1hcHBpbmcodmFsdWUsIChJRmlsdGVyTWFwcGluZ0l0ZW0pIHJlc3VsdFswXSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVSZW1vdmVCdXR0b25TZWxlY3RlZCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKQotCQkJcmV0dXJuOwotCQlMaXN0IHNlbGVjdGVkT2JqID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0xpc3QoKTsKLQkJcmVtb3ZlRmlsdGVyTWFwcGluZ3Moc2VsZWN0ZWRPYmopOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkRmlsdGVyTWFwcGluZyhJRmlsdGVyTWFwcGluZ0l0ZW0gZmlsdGVyTWFwcGluZykgewotCQlpZiAoZmlsdGVyTWFwcGluZyA9PSBudWxsKSByZXR1cm47Ci0JCUxpc3QgdmFsdWVMaXN0ID0gKExpc3QpIHZpZXdlci5nZXRJbnB1dCgpOwotCQlpZiAodmFsdWVMaXN0ID09IG51bGwpIHsKLQkJCXZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQl2YWx1ZUxpc3QuYWRkKGZpbHRlck1hcHBpbmcpOwotCQlzZXRJbnB1dCh2YWx1ZUxpc3QpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdEZpbHRlck1hcHBpbmcoSUZpbHRlck1hcHBpbmdJdGVtIG9sZEZpbHRlck1hcHBpbmcsIElGaWx0ZXJNYXBwaW5nSXRlbSBuZXdGaWx0ZXJNYXBwaW5nKSB7Ci0JCWlmIChuZXdGaWx0ZXJNYXBwaW5nID09IG51bGwpIHJldHVybjsJCQotCQlMaXN0IHZhbHVlTGlzdCA9IChMaXN0KSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLQkJaWYgKHZhbHVlTGlzdCA9PSBudWxsKSB7Ci0JCQl2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJaW50IGluZGV4ID0gdmFsdWVMaXN0LmluZGV4T2Yob2xkRmlsdGVyTWFwcGluZyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJdmFsdWVMaXN0LmFkZChuZXdGaWx0ZXJNYXBwaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXZhbHVlTGlzdC5zZXQoaW5kZXgsIG5ld0ZpbHRlck1hcHBpbmcpOwotCQl9Ci0JCQotCQlzZXRJbnB1dCh2YWx1ZUxpc3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVGaWx0ZXJNYXBwaW5ncyhDb2xsZWN0aW9uIHNlbGVjdGVkRmlsdGVyTWFwcGluZ3MpIHsKLQkJTGlzdCB2YWx1ZUxpc3QgPSAoTGlzdCkgdmlld2VyLmdldElucHV0KCk7Ci0JCXZhbHVlTGlzdC5yZW1vdmVBbGwoc2VsZWN0ZWRGaWx0ZXJNYXBwaW5ncyk7Ci0JCXNldElucHV0KHZhbHVlTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoTGlzdCBpbnB1dCkgewotCQl2aWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQkvLyBDcmVhdGUgYSBuZXcgbGlzdCB0byB0cmlnZ2VyIHByb3BlcnR5IGNoYW5nZQotCQlMaXN0IG5ld0lucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQluZXdJbnB1dC5hZGRBbGwoaW5wdXQpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG5ld0lucHV0KTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0SW5wdXQoKSB7Ci0JICAgIExpc3QgdmFsdWVMaXN0ID0gKExpc3QpIHZpZXdlci5nZXRJbnB1dCgpOwotICAgICAgICBpZiAodmFsdWVMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWVMaXN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9JV2ViV2l6YXJkQ29uc3RhbnRzLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0lXZWJXaXphcmRDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyNzUzMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL0lXZWJXaXphcmRDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLQotcHVibGljIGludGVyZmFjZSBJV2ViV2l6YXJkQ29uc3RhbnRzIHsKLQkKLQkvLyBBZGRTZXJ2bGV0V2l6YXJkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRSA9IFdFQlVJTWVzc2FnZXMuQUREX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRSA9IFdFQlVJTWVzc2FnZXMuQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfREVTQyA9IFdFQlVJTWVzc2FnZXMuQUREX1NFUlZMRVRfV0laQVJEX1BBR0VfREVTQzsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUEFDS0FHRSA9IFdFQlVJTWVzc2FnZXMuREVGQVVMVF9QQUNLQUdFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFTEVDVF9DTEFTU19USVRMRSA9IFdFQlVJTWVzc2FnZXMuU0VMRUNUX0NMQVNTX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BUF9DTEFTU19OQU1FX1RPX0NMQVNTX0VSUk9SX01TRyA9IFdFQlVJTWVzc2FnZXMuTUFQX0NMQVNTX05BTUVfVE9fQ0xBU1NfRVJST1JfTVNHOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVNUFRZX0xJU1RfTVNHID0gV0VCVUlNZXNzYWdlcy5FTVBUWV9MSVNUX01TRzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkFERF9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VfRVhJU1RJTkdfU0VSVkxFVF9DTEFTUyA9IFdFQlVJTWVzc2FnZXMuVVNFX0VYSVNUSU5HX1NFUlZMRVRfQ0xBU1M7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5JVF9QQVJBTV9USVRMRSA9IFdFQlVJTWVzc2FnZXMuSU5JVF9QQVJBTV9USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTklUX1BBUkFNX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5JTklUX1BBUkFNX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVSTF9NQVBQSU5HU19USVRMRSA9IFdFQlVJTWVzc2FnZXMuVVJMX01BUFBJTkdTX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVSTF9NQVBQSU5HU19MQUJFTCA9IFdFQlVJTWVzc2FnZXMuVVJMX01BUFBJTkdTX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENIT09TRV9TRVJWTEVUX0NMQVNTID0gV0VCVUlNZXNzYWdlcy5DSE9PU0VfU0VSVkxFVF9DTEFTUzsKLQkKLQkvLyBOZXdTZXJ2bGV0V2l6YXJkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRSA9IFdFQlVJTWVzc2FnZXMuTkVXX1NFUlZMRVRfV0laQVJEX1dJTkRPV19USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBORVdfU0VSVkxFVF9XSVpBUkRfUEFHRV9USVRMRSA9IFdFQlVJTWVzc2FnZXMuTkVXX1NFUlZMRVRfV0laQVJEX1BBR0VfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX1NFUlZMRVRfV0laQVJEX1BBR0VfREVTQyA9IFdFQlVJTWVzc2FnZXMuTkVXX1NFUlZMRVRfV0laQVJEX1BBR0VfREVTQzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTRVJWTEVUX1BBQ0tBR0VfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLlNFUlZMRVRfUEFDS0FHRV9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTRVJWTEVUX05BTUVfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLlNFUlZMRVRfTkFNRV9MQUJFTDsKLQkKLSAgICAvLyBBZGRGaWx0ZXJXaXphcmQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfRklMVEVSX1dJWkFSRF9XSU5ET1dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLkFERF9GSUxURVJfV0laQVJEX1dJTkRPV19USVRMRTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfRklMVEVSX1dJWkFSRF9QQUdFX1RJVExFID0gV0VCVUlNZXNzYWdlcy5BRERfRklMVEVSX1dJWkFSRF9QQUdFX1RJVExFOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9GSUxURVJfV0laQVJEX1BBR0VfREVTQyA9IFdFQlVJTWVzc2FnZXMuQUREX0ZJTFRFUl9XSVpBUkRfUEFHRV9ERVNDOwotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFX0VYSVNUSU5HX0ZJTFRFUl9DTEFTUyA9IFdFQlVJTWVzc2FnZXMuVVNFX0VYSVNUSU5HX0ZJTFRFUl9DTEFTUzsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDSE9PU0VfRklMVEVSX0NMQVNTID0gV0VCVUlNZXNzYWdlcy5DSE9PU0VfRklMVEVSX0NMQVNTOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUlZMRVRfTUFQUElOR1NfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLlNFUlZMRVRfTUFQUElOR1NfTEFCRUw7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklMVEVSX01BUFBJTkdTX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5GSUxURVJfTUFQUElOR1NfTEFCRUw7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMX1NFUlZMRVRfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLlVSTF9TRVJWTEVUX0xBQkVMOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJU1BBVENIRVJTX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5ESVNQQVRDSEVSU19MQUJFTDsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBSRVFVRVNUID0gV0VCVUlNZXNzYWdlcy5ESVNQQVRDSEVSX1JFUVVFU1Q7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRk9SV0FSRCA9IFdFQlVJTWVzc2FnZXMuRElTUEFUQ0hFUl9GT1JXQVJEOyAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTkNMVURFID0gV0VCVUlNZXNzYWdlcy5ESVNQQVRDSEVSX0lOQ0xVREU7IAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SID0gV0VCVUlNZXNzYWdlcy5ESVNQQVRDSEVSX0VSUk9SOyAKLSAgICAKLSAgICAvLyBOZXdGaWx0ZXJXaXphcmQKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBORVdfRklMVEVSX1dJWkFSRF9XSU5ET1dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLk5FV19GSUxURVJfV0laQVJEX1dJTkRPV19USVRMRTsKLQotCS8vIEFkZExpc3RlbmVyV2l6YXJkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9XSU5ET1dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLkFERF9MSVNURU5FUl9XSVpBUkRfV0lORE9XX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9USVRMRSA9IFdFQlVJTWVzc2FnZXMuQUREX0xJU1RFTkVSX1dJWkFSRF9QQUdFX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfUEFHRV9ERVNDID0gV0VCVUlNZXNzYWdlcy5BRERfTElTVEVORVJfV0laQVJEX1BBR0VfREVTQzsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRV9FWElTVElOR19MSVNURU5FUl9DTEFTUyA9IFdFQlVJTWVzc2FnZXMuVVNFX0VYSVNUSU5HX0xJU1RFTkVSX0NMQVNTOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfU0VSVkxFVF9DT05URVhUX0VWRU5UUyA9IFdFQlVJTWVzc2FnZXMuQUREX0xJU1RFTkVSX1dJWkFSRF9TRVJWTEVUX0NPTlRFWFRfRVZFTlRTOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfSFRUUF9TRVNTSU9OX0VWRU5UUyA9IFdFQlVJTWVzc2FnZXMuQUREX0xJU1RFTkVSX1dJWkFSRF9IVFRQX1NFU1NJT05fRVZFTlRTOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfU0VSVkxFVF9SRVFVRVNUX0VWRU5UUyA9IFdFQlVJTWVzc2FnZXMuQUREX0xJU1RFTkVSX1dJWkFSRF9TRVJWTEVUX1JFUVVFU1RfRVZFTlRTOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9MSVNURU5FUl9XSVpBUkRfTElGRUNZQ0xFID0gV0VCVUlNZXNzYWdlcy5BRERfTElTVEVORVJfV0laQVJEX0xJRkVDWUNMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX0NIQU5HRVNfVE9fQVRUUklCVVRFUyA9IFdFQlVJTWVzc2FnZXMuQUREX0xJU1RFTkVSX1dJWkFSRF9DSEFOR0VTX1RPX0FUVFJJQlVURVM7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0xJU1RFTkVSX1dJWkFSRF9TRVNTSU9OX01JR1JBVElPTiA9IFdFQlVJTWVzc2FnZXMuQUREX0xJU1RFTkVSX1dJWkFSRF9TRVNTSU9OX01JR1JBVElPTjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBRERfTElTVEVORVJfV0laQVJEX09CSkVDVF9CSU5ESU5HID0gV0VCVUlNZXNzYWdlcy5BRERfTElTVEVORVJfV0laQVJEX09CSkVDVF9CSU5ESU5HOwotCQotCS8vIGNvbW1vbgotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFERF9CVVRUT05fTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkFERF9CVVRUT05fTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRURJVF9CVVRUT05fTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkVESVRfQlVUVE9OX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTU9WRV9CVVRUT05fTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLlJFTU9WRV9CVVRUT05fTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVJMX1BBVFRFUk5fVElUTEUgPSBXRUJVSU1lc3NhZ2VzLlVSTF9QQVRURVJOX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVSTF9QQVRURVJOX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5VUkxfUEFUVEVSTl9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT0xERVJfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkZPTERFUl9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX1BBQ0tBR0VfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkpBVkFfUEFDS0FHRV9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19OQU1FX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5DTEFTU19OQU1FX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVUEVSQ0xBU1NfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLlNVUEVSQ0xBU1NfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLkNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX0RFU0MgPSBXRUJVSU1lc3NhZ2VzLkNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX0RFU0M7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVkFMSURBVE9SX01FU0cgPSBXRUJVSU1lc3NhZ2VzLkNPTlRBSU5FUl9TRUxFQ1RJT05fRElBTE9HX1ZBTElEQVRPUl9NRVNHOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19USVRMRSA9IFdFQlVJTWVzc2FnZXMuUEFDS0FHRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19ERVNDID0gV0VCVUlNZXNzYWdlcy5QQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfREVTQzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQQUNLQUdFX1NFTEVDVElPTl9ESUFMT0dfTVNHX05PTkUgPSBXRUJVSU1lc3NhZ2VzLlBBQ0tBR0VfU0VMRUNUSU9OX0RJQUxPR19NU0dfTk9ORTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLlNVUEVSQ0xBU1NfU0VMRUNUSU9OX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVVBFUkNMQVNTX1NFTEVDVElPTl9ESUFMT0dfREVTQyA9IFdFQlVJTWVzc2FnZXMuU1VQRVJDTEFTU19TRUxFQ1RJT05fRElBTE9HX0RFU0M7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLklOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX0RFU0MgPSBXRUJVSU1lc3NhZ2VzLklOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX0RFU0M7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5URVJGQUNFX1NFTEVDVElPTl9ESUFMT0dfTVNHX05PTkUgPSBXRUJVSU1lc3NhZ2VzLklOVEVSRkFDRV9TRUxFQ1RJT05fRElBTE9HX01TR19OT05FOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfTU9ESUZJRVJTX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5KQVZBX0NMQVNTX01PRElGSUVSU19MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0lOVEVSRkFDRVNfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfSU5URVJGQUNFU19MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX01FVEhPRF9TVFVCU19MQUJFTCA9IFdFQlVJTWVzc2FnZXMuSkFWQV9DTEFTU19NRVRIT0RfU1RVQlNfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19QVUJMSUNfQ0hFQ0tCT1hfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfUFVCTElDX0NIRUNLQk9YX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfQUJTVFJBQ1RfQ0hFQ0tCT1hfTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkpBVkFfQ0xBU1NfQUJTVFJBQ1RfQ0hFQ0tCT1hfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9DTEFTU19GSU5BTF9DSEVDS0JPWF9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuSkFWQV9DTEFTU19GSU5BTF9DSEVDS0JPWF9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBKQVZBX0NMQVNTX0NPTlNUUlVDVE9SX0NIRUNLQk9YX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5KQVZBX0NMQVNTX0NPTlNUUlVDVE9SX0NIRUNLQk9YX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfTUFJTl9DSEVDS0JPWF9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuSkFWQV9DTEFTU19NQUlOX0NIRUNLQk9YX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfSU5IRVJJVF9DSEVDS0JPWF9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfQlJPV0VSX0RJQUxPR19USVRMRSA9IFdFQlVJTWVzc2FnZXMuSkFWQV9DTEFTU19CUk9XRVJfRElBTE9HX1RJVExFOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfQ0xBU1NfQlJPV0VSX0RJQUxPR19NRVNTQUdFID0gV0VCVUlNZXNzYWdlcy5KQVZBX0NMQVNTX0JST1dFUl9ESUFMT0dfTUVTU0FHRTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUVfVElUTEUgPSBXRUJVSU1lc3NhZ2VzLk5BTUVfVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFNRV9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuTkFNRV9MQUJFTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBERVNDUklQVElPTl9USVRMRSA9IFdFQlVJTWVzc2FnZXMuREVTQ1JJUFRJT05fVElUTEU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT05fTEFCRUwgPSBXRUJVSU1lc3NhZ2VzLkRFU0NSSVBUSU9OX0xBQkVMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTFVFX1RJVExFID0gV0VCVUlNZXNzYWdlcy5WQUxVRV9USVRMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxVRV9MQUJFTCA9IFdFQlVJTWVzc2FnZXMuVkFMVUVfTEFCRUw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBCUk9XU0VfQlVUVE9OX0xBQkVMID0gV0VCVUlNZXNzYWdlcy5CUk9XU0VfQlVUVE9OX0xBQkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9CVVRUT04gPSBXRUJVSU1lc3NhZ2VzLlJFTU9WRV9CVVRUT047Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VMRUNUX0FMTF9CVVRUT04gPSBXRUJVSU1lc3NhZ2VzLlNFTEVDVF9BTExfQlVUVE9OOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENMRUFSX0JVVFRPTiA9IFdFQlVJTWVzc2FnZXMuQ0xFQVJfQlVUVE9OOwotCQotICAgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FV19KQVZBX0NMQVNTX0RFU1RJTkFUSU9OX1dJWkFSRF9QQUdFX0RFU0MgPSBXRUJVSU1lc3NhZ2VzLk5FV19KQVZBX0NMQVNTX0RFU1RJTkFUSU9OX1dJWkFSRF9QQUdFX0RFU0M7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX0pBVkFfQ0xBU1NfT1BUSU9OU19XSVpBUkRfUEFHRV9ERVNDID0gV0VCVUlNZXNzYWdlcy5ORVdfSkFWQV9DTEFTU19PUFRJT05TX1dJWkFSRF9QQUdFX0RFU0M7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSW1wb3J0V0FSQWN0aW9uX1VJXyA9IFdFQlVJTWVzc2FnZXMuSW1wb3J0V0FSQWN0aW9uX1VJXzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBFeHBvcnRXQVJBY3Rpb25fVUlfID0gV0VCVUlNZXNzYWdlcy5FeHBvcnRXQVJBY3Rpb25fVUlfOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5PX1dFQl9QUk9KRUNUUyA9IFdFQlVJTWVzc2FnZXMuTk9fV0VCX1BST0pFQ1RTOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRTID0gV0VCVUlNZXNzYWdlcy5TRVJWTEVUUzsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJUX1RPX1dFQl9USVRMRSA9IFdFQlVJTWVzc2FnZXMuQ29udmVydFRvV2ViVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX1dFQl9WRVJTSU9OID0gV0VCVUlNZXNzYWdlcy5TZWxlY3RXZWJWZXJzaW9uOwotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9NdWx0aVNlbGVjdEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZy5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9NdWx0aVNlbGVjdEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM2Y2I5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9TRVJWTEVUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5ERUZBVUxUX1BBQ0tBR0U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZUhpZXJhcmNoeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5GaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5Ud29BcnJheVF1aWNrU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmRpYWxvZ3MuVHlwZWRGaWxlVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5wcm92aWRlcnMuV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmxldFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNy8zMC8yMDAxIDExOjE2OjM2IEFNKQotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcwotCQlGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYWNrYWdlUmVuZGVyZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBJbWFnZSBQQUNLQUdFX0lDT04gPSBKYXZhVUkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19QQUNLQUdFKTsgCi0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlJVHlwZSB0eXBlID0gKElUeXBlKSBlbGVtZW50OwotCQkJU3RyaW5nIHAgPSB0eXBlLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlpZiAoIiIuZXF1YWxzKHApKSAvLyROT04tTkxTLTEkCi0JCQkJcCA9IERFRkFVTFRfUEFDS0FHRTsKLQkJCXJldHVybiAocCArICIgLSAiICsgdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBQQUNLQUdFX0lDT047Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUeXBlUmVuZGVyZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBJbWFnZSBDTEFTU19JQ09OID0gSmF2YVVJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfQ0xBU1MpOyAKLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCUlUeXBlIGUgPSAoKElUeXBlKSBlbGVtZW50KTsKLQkJCXJldHVybiBlLmdldEVsZW1lbnROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBDTEFTU19JQ09OOwotCQl9Ci0KLQl9Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSlNQID0gMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRVJWTEVUID0gMTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZTZXJ2bGV0QnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZkpTUEJ1dHRvbjsKLQlwcm90ZWN0ZWQgaW50IGZTZWxlY3Rpb24gPSAtMTsKLQlwcm90ZWN0ZWQgUGFnZUJvb2sgZlBhZ2VCb29rID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29udHJvbCBmSnNwQ29udHJvbCA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbnRyb2wgZlNlcnZsZXRDb250cm9sID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGZDaGlsZCA9IG51bGw7Ci0JLy8gY29uc3RydWN0aW9uIHBhcmFtZXRlcnMKLQlwcm90ZWN0ZWQgSVJ1bm5hYmxlQ29udGV4dCBmUnVubmFibGVDb250ZXh0OwotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBmRWxlbWVudFJlbmRlcmVyOwotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBmUXVhbGlmaWVyUmVuZGVyZXI7Ci0JcHJpdmF0ZSBPYmplY3RbXSBmRWxlbWVudHM7Ci0JcHJpdmF0ZSBib29sZWFuIGZJZ25vcmVDYXNlID0gdHJ1ZTsKLQlwcml2YXRlIFN0cmluZyBmVXBwZXJMaXN0TGFiZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkxvd2VyTGlzdExhYmVsOwotCS8vIFNXVCB3aWRnZXRzCi0JcHJpdmF0ZSBUYWJsZSBmVXBwZXJMaXN0OwotCXByaXZhdGUgVGFibGUgZkxvd2VyTGlzdDsKLQlwcm90ZWN0ZWQgVGV4dCBmVGV4dDsKLQlwcml2YXRlIElUeXBlW10gZklUOwotCXByaXZhdGUgU3RyaW5nW10gZlJlbmRlcmVkU3RyaW5nczsKLQlwcml2YXRlIGludFtdIGZFbGVtZW50TWFwOwotCXByaXZhdGUgSW50ZWdlcltdIGZRdWFsaWZpZXJNYXA7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgZkxvY2FsVmFsaWRhdG9yID0gbnVsbDsKLQkvKioKLQkgKiBNdWx0aVNlbGVjdEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBwYXJlbnQgU2hlbGwKLQkgKiBAcGFyYW0gdGl0bGUgU3RyaW5nCi0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICogQHBhcmVudCBleHRlbnNpb25zIFN0cmluZ1tdCi0JICogQHBhcmFtIGFsbG93TXVsdGlwbGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBNdWx0aVNlbGVjdEZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGV4dGVuc2lvbnMsIGJvb2xlYW4gYWxsb3dNdWx0aXBsZSwgSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcihwYXJlbnQsIHRpdGxlLCBtZXNzYWdlLCBleHRlbnNpb25zLCBhbGxvd011bHRpcGxlKTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuUkVTSVpFKTsKLQotCQlpZiAodGl0bGUgPT0gbnVsbCkKLQkJCXNldFRpdGxlKFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGaWxlX1NlbGVjdGlvbl9VSV8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkKLQkJCW1lc3NhZ2UgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VsZWN0X2FfZmlsZV9fVUlfIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJc2V0RXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJYWRkRmlsdGVyKG5ldyBUeXBlZEZpbGVWaWV3ZXJGaWx0ZXIoZXh0ZW5zaW9ucykpOwotCQlmTG9jYWxWYWxpZGF0b3IgPSBuZXcgU2ltcGxlVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yKG5ldyBDbGFzc1tdIHsgSUZpbGUuY2xhc3MgfSwgYWxsb3dNdWx0aXBsZSk7Ci0JCXNldFZhbGlkYXRvcihmTG9jYWxWYWxpZGF0b3IpOwotCQkKLQkJLy9TdGF0dXNJbmZvIGN1cnJTdGF0dXMgPSBuZXcgU3RhdHVzSW5mbygpOwotCQkvL2N1cnJTdGF0dXMuc2V0T0soKTsKLQkJU3RhdHVzIGN1cnJTdGF0dXMgPSBuZXcgU3RhdHVzKFN0YXR1cy5PSywgU2VydmxldFVJUGx1Z2luLlBMVUdJTl9JRCwgU3RhdHVzLk9LLCAiIiwgbnVsbCk7Ci0JCQotCQl1cGRhdGVTdGF0dXMoY3VyclN0YXR1cyk7Ci0JCWZFbGVtZW50UmVuZGVyZXIgPSBuZXcgVHlwZVJlbmRlcmVyKCk7Ci0JCWZRdWFsaWZpZXJSZW5kZXJlciA9IG5ldyBQYWNrYWdlUmVuZGVyZXIoKTsKLQkJZlJ1bm5hYmxlQ29udGV4dCA9IFNlcnZsZXRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCXRyeSB7Ci0JCQlJSmF2YUVsZW1lbnQgamVsZW0gPSBudWxsOwotCQkJSVByb2plY3QgcHJvaiA9IG51bGw7Ci0JCQlqZWxlbSA9IChJSmF2YUVsZW1lbnQpIHByb2plY3QuZ2V0QWRhcHRlcihJSmF2YUVsZW1lbnQuY2xhc3MpOwotCQkJaWYgKGplbGVtID09IG51bGwpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBwcm9qZWN0LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlwcm9qID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCQlpZiAocHJvaiAhPSBudWxsKSB7Ci0JCQkJCQlqZWxlbSA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlLmNyZWF0ZShwcm9qKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUlKYXZhUHJvamVjdCBqcCA9IGplbGVtLmdldEphdmFQcm9qZWN0KCk7Ci0KLQkJCUlUeXBlIHNlcnZsZXRUeXBlID0ganAuZmluZFR5cGUoUVVBTElGSUVEX1NFUlZMRVQpOwotCQkJLy8gbmV4dCAzIGxpbmVzIGZpeCBkZWZlY3QgMTc3Njg2Ci0JCQlpZiAoc2VydmxldFR5cGUgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJQXJyYXlMaXN0IHNlcnZsZXRDbGFzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSVR5cGVIaWVyYXJjaHkgdEggPSBzZXJ2bGV0VHlwZS5uZXdUeXBlSGllcmFyY2h5KGpwLCBudWxsKTsKLQkJCUlUeXBlW10gdHlwZXMgPSB0SC5nZXRBbGxTdWJ0eXBlcyhzZXJ2bGV0VHlwZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHR5cGVzW2ldLmlzQ2xhc3MoKSAmJiAhc2VydmxldENsYXNzZXMuY29udGFpbnModHlwZXNbaV0pKQotCQkJCQlzZXJ2bGV0Q2xhc3Nlcy5hZGQodHlwZXNbaV0pOwotCQkJfQotCQkJZklUID0gKElUeXBlW10pIHNlcnZsZXRDbGFzc2VzLnRvQXJyYXkobmV3IElUeXBlW3NlcnZsZXRDbGFzc2VzLnNpemUoKV0pOwotCQkJc2VydmxldENsYXNzZXMgPSBudWxsOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTZXJ2bGV0VUlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwcml2YXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcHV0ZVJlc3VsdCgpIHsKLQkJaWYgKGZTZWxlY3Rpb24gPT0gSlNQKSB7Ci0JCQlzdXBlci5jb21wdXRlUmVzdWx0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlJVHlwZSB0eXBlID0gKElUeXBlKSBnZXRXaWRnZXRTZWxlY3Rpb24oKTsKLQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWxlY3RfQ2xhc3NfVUlfIik7IC8vJE5PTi1OTFMtMSQgPSAiU2VsZWN0IENsYXNzIgotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDb3VsZF9ub3RfdW5pcXVlbHlfbWFwX3RoZV9FUlJPUl8iKTsgLy8kTk9OLU5MUy0xJCA9ICJDb3VsZCBub3QgdW5pcXVlbHkgbWFwIHRoZSBjbGFzcyBuYW1lIHRvIGEgY2xhc3MuIgotCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJCXNldFJlc3VsdChudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQlqYXZhLnV0aWwuTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJCQlyZXN1bHQuYWRkKHR5cGUpOwotCQkJCQlzZXRSZXN1bHQocmVzdWx0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQkJZlRleHQuc2V0Rm9jdXMoKTsKLQkJcmVtYXRjaCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJdXBkYXRlT2tTdGF0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIGRpYWxvZydzIAotCSAqIGJ1dHRvbiBiYXIuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPkRpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kCi0JICogbGF5cyBvdXQgYSBidXR0b24gYmFyIGFuZCBjYWxscyB0aGUgPGNvZGU+Y3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcjwvY29kZT4KLQkgKiBmcmFtZXdvcmsgbWV0aG9kIHRvIHBvcHVsYXRlIGl0LiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGJ1dHRvbiBiYXIKLQkgKiBAcmV0dXJuIHRoZSBidXR0b24gYmFyIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0KLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCi0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlMiA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJLy8gY3JlYXRlIGEgbGF5b3V0IHdpdGggc3BhY2luZyBhbmQgbWFyZ2lucyBhcHByb3ByaWF0ZSBmb3IgdGhlIGZvbnQgc2l6ZS4KLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAwOyAvLyB0aGlzIGlzIGluY3JlbWVudGVkIGJ5IGNyZWF0ZUJ1dHRvbgotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCi0JCWNvbXBvc2l0ZTIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7Ci0JCWNvbXBvc2l0ZTIuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQljb21wb3NpdGUyLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJLy8gQWRkIHRoZSBidXR0b25zIHRvIHRoZSBidXR0b24gYmFyLgotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKGNvbXBvc2l0ZTIpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCS8qCi0JICogQHByaXZhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQotCQlmQ2hpbGQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGZDaGlsZCwgImNvbS5pYm0uZXRvb2xzLndlYmFwcGxpY2F0aW9uZWRpdC53ZWJ4MjAxMCIpOyAvLyROT04tTkxTLTEkCi0JCUdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotCQlnbC5udW1Db2x1bW5zID0gMjsKLQkJZ2wubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZkNoaWxkLnNldExheW91dChnbCk7Ci0KLQkJZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWZDaGlsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLyBDcmVhdGUgdGhlIFdlYiBUeXBlIHJhZGlvIGJ1dHRvbnMgYW5kIHRleHQgZmllbGRzLgotCQlmU2VydmxldEJ1dHRvbiA9IG5ldyBCdXR0b24oZkNoaWxkLCBTV1QuUkFESU8pOwotCQlmU2VydmxldEJ1dHRvbi5zZXRUZXh0KFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZXJ2bGV0X1VJXyIpKTsgLy8kTk9OLU5MUy0xJCA9IFNlcnZsZXQKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZlNlcnZsZXRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWZTZXJ2bGV0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCWZKU1BCdXR0b24gPSBuZXcgQnV0dG9uKGZDaGlsZCwgU1dULlJBRElPKTsKLQkJZkpTUEJ1dHRvbi5zZXRUZXh0KCJKU1AiKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlmSlNQQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlmSlNQQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCWlmIChmU2VsZWN0aW9uID09IEpTUCkKLQkJCWZKU1BCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQllbHNlIHsKLQkJCWZTZXJ2bGV0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZTZWxlY3Rpb24gPSBTRVJWTEVUOwotCQl9Ci0KLQkJZlBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGZDaGlsZCwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ2QuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZQYWdlQm9vay5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkpzcENvbnRyb2wgPSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKGZQYWdlQm9vayk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZlBhZ2VCb29rLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCUxhYmVsIG1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQltZXNzYWdlTGFiZWwuc2V0VGV4dChXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ2hvb3NlX2Ffc2VydmxldF9fMSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZUZXh0ID0gY3JlYXRlVGV4dChjb21wb3NpdGUpOwotCi0JCW1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJbWVzc2FnZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQltZXNzYWdlTGFiZWwuc2V0VGV4dChXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiTWF0Y2hpbmdfc2VydmxldHNfXzIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmVXBwZXJMaXN0ID0gY3JlYXRlVXBwZXJMaXN0KGNvbXBvc2l0ZSk7Ci0KLQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQltZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJRdWFsaWZpZXJfXzMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmTG93ZXJMaXN0ID0gY3JlYXRlTG93ZXJMaXN0KGNvbXBvc2l0ZSk7Ci0KLQkJZlNlcnZsZXRDb250cm9sID0gY29tcG9zaXRlOwotCi0JCWlmIChmU2VsZWN0aW9uID09IEpTUCkKLQkJCWZQYWdlQm9vay5zaG93UGFnZShmSnNwQ29udHJvbCk7Ci0JCWVsc2UKLQkJCWZQYWdlQm9vay5zaG93UGFnZShmU2VydmxldENvbnRyb2wpOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsaXN0IHdpZGdldCBhbmQgc2V0cyBsYXlvdXQgZGF0YS4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QKLQkgKi8KLQlwcml2YXRlIFRhYmxlIGNyZWF0ZUxvd2VyTGlzdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChmTG93ZXJMaXN0TGFiZWwgIT0gbnVsbCkKLQkJCSAobmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpKS5zZXRUZXh0KGZMb3dlckxpc3RMYWJlbCk7Ci0KLQkJVGFibGUgbGlzdCA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlsaXN0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotCQkJCWhhbmRsZUxvd2VyU2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJbGlzdC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3VibGVDbGljaywgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCQkJaGFuZGxlTG93ZXJEb3VibGVDbGljaygpOwotCQkJfQotCQl9KTsKLQkJbGlzdC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJZlF1YWxpZmllclJlbmRlcmVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoKTsKLQkJc3BlYy53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNTApOwotCQlzcGVjLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxpc3Quc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRleHQgd2lkZ2V0IGFuZCBzZXRzIGxheW91dCBkYXRhLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dAotCSAqLwotCXByaXZhdGUgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXNwZWMudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJTGlzdGVuZXIgbCA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotCQkJCXJlbWF0Y2goZlRleHQuZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfTsKLQkJdGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBsKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxpc3Qgd2lkZ2V0IGFuZCBzZXRzIGxheW91dCBkYXRhLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdAotCSAqLwotCXByaXZhdGUgVGFibGUgY3JlYXRlVXBwZXJMaXN0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGZVcHBlckxpc3RMYWJlbCAhPSBudWxsKQotCQkJIChuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkpLnNldFRleHQoZlVwcGVyTGlzdExhYmVsKTsKLQotCQlUYWJsZSBsaXN0ID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCWxpc3QuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCQkJaGFuZGxlVXBwZXJTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaXN0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJCQloYW5kbGVVcHBlckRvdWJsZUNsaWNrKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaXN0LmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlmRWxlbWVudFJlbmRlcmVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoKTsKLQkJc3BlYy53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNTApOwotCQlzcGVjLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDE1KTsKLQkJc3BlYy5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXNwZWMudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsaXN0LnNldExheW91dERhdGEoc3BlYyk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBJRCBvZiB0aGUgYnV0dG9uIHRoYXQgaXMgJ3ByZXNzZWQnIG9uIGRvdWJsZUNsaWNrIGluIHRoZSBsaXN0cy4KLQkgKiBCeSBkZWZhdWx0IGl0IGlzIHRoZSBPSyBidXR0b24uCi0JICogT3ZlcnJpZGUgdG8gY2hhbmdlIHRoaXMgc2V0dGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRCdXR0b25JRCgpIHsKLQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuT0tfSUQ7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gZlNlbGVjdGlvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRXaWRnZXRTZWxlY3Rpb24oKSB7Ci0JCWludCBpID0gZkxvd2VyTGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoZlF1YWxpZmllck1hcCAhPSBudWxsKSB7Ci0JCQlpZiAoZlF1YWxpZmllck1hcC5sZW5ndGggPT0gMSkKLQkJCQlpID0gMDsKLQkJCWlmIChpIDwgMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfSAKLQkJCUludGVnZXIgaW5kZXggPSBmUXVhbGlmaWVyTWFwW2ldOwotCQkJcmV0dXJuIGZFbGVtZW50c1tpbmRleC5pbnRWYWx1ZSgpXTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlTG93ZXJEb3VibGVDbGljaygpIHsKLQkJaWYgKGdldFdpZGdldFNlbGVjdGlvbigpICE9IG51bGwpCi0JCQlidXR0b25QcmVzc2VkKGdldERlZmF1bHRCdXR0b25JRCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgaGFuZGxlTG93ZXJTZWxlY3Rpb25DaGFuZ2VkKCkgewotCQl1cGRhdGVPa1N0YXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZVVwcGVyRG91YmxlQ2xpY2soKSB7Ci0JCWlmIChnZXRXaWRnZXRTZWxlY3Rpb24oKSAhPSBudWxsKQotCQkJYnV0dG9uUHJlc3NlZChnZXREZWZhdWx0QnV0dG9uSUQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZVVwcGVyU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJaW50IHNlbGVjdGlvbiA9IGZVcHBlckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKHNlbGVjdGlvbiA+PSAwKSB7Ci0JCQlpbnQgaSA9IGZFbGVtZW50TWFwW3NlbGVjdGlvbl07Ci0JCQlpbnQgayA9IGk7Ci0JCQlpbnQgbGVuZ3RoID0gZlJlbmRlcmVkU3RyaW5ncy5sZW5ndGg7Ci0JCQl3aGlsZSAoayA8IGxlbmd0aCAmJiBmUmVuZGVyZWRTdHJpbmdzW2tdLmVxdWFscyhmUmVuZGVyZWRTdHJpbmdzW2ldKSkgewotCQkJCWsrKzsKLQkJCX0KLQkJCXVwZGF0ZUxvd2VyTGlzdFdpZGdldChpLCBrKTsKLQkJfSBlbHNlCi0JCQl1cGRhdGVMb3dlckxpc3RXaWRnZXQoMCwgMCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgb3BlbigpIHsKLQotCQlpZiAoZklUID09IG51bGwgfHwgZklULmxlbmd0aCA9PSAwKSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihnZXRTaGVsbCgpLCBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRW1wdHlfTGlzdF8xIiksIFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJfSU5GT19Ob19zZXJ2bGV0c19leGlzdF90b19hZGQuXzEiKSk7ICAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBDQU5DRUw7Ci0JCX0KLQotCQlzZXRFbGVtZW50cyhmSVQpOwotCQlzZXRJbml0aWFsU2VsZWN0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3VwZXIub3BlbigpOwotCX0KLQkKLQkvKioKLQkgKiB1cGRhdGUgdGhlIGxpc3QgdG8gcmVmbGVjdCBhIG5ldyBtYXRjaCBzdHJpbmcuCi0JICogQHBhcmFtIG1hdGNoU3RyaW5nIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW1hdGNoKFN0cmluZyBtYXRjaFN0cmluZykgewotCQlpbnQgayA9IDA7Ci0JCVN0cmluZyB0ZXh0ID0gZlRleHQuZ2V0VGV4dCgpOwotCQlTdHJpbmdNYXRjaGVyIG1hdGNoZXIgPSBuZXcgU3RyaW5nTWF0Y2hlcih0ZXh0ICsgIioiLCBmSWdub3JlQ2FzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsYXN0U3RyaW5nID0gbnVsbDsKLQkJaW50IGxlbmd0aCA9IGZFbGVtZW50cy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXdoaWxlIChpIDwgbGVuZ3RoICYmIGZSZW5kZXJlZFN0cmluZ3NbaV0uZXF1YWxzKGxhc3RTdHJpbmcpKQotCQkJCWkrKzsKLQkJCWlmIChpIDwgbGVuZ3RoKSB7Ci0JCQkJbGFzdFN0cmluZyA9IGZSZW5kZXJlZFN0cmluZ3NbaV07Ci0JCQkJaWYgKG1hdGNoZXIubWF0Y2goZlJlbmRlcmVkU3RyaW5nc1tpXSkpIHsKLQkJCQkJZkVsZW1lbnRNYXBba10gPSBpOwotCQkJCQlrKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZFbGVtZW50TWFwW2tdID0gLTE7Ci0KLQkJdXBkYXRlVXBwZXJMaXN0V2lkZ2V0KGZFbGVtZW50TWFwLCBrKTsKLQl9Ci0JCi0JLyoqCi0JCSAqIAotCQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCQkgKiBAcGFyYW0gcCBvcmcuZWNsaXBzZS5qZmFjZS5lbGVtZW50cy5JSW5kZXhlZFByb3BlcnR5Ci0JCSAqLwotCXByaXZhdGUgU3RyaW5nW10gcmVuZGVyU3RyaW5ncyhPYmplY3RbXSBwKSB7Ci0JCVN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW3AubGVuZ3RoXTsKLQkJaW50IHNpemUgPSBzdHJpbmdzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXN0cmluZ3NbaV0gPSBmRWxlbWVudFJlbmRlcmVyLmdldFRleHQocFtpXSk7Ci0JCX0KLQkJbmV3IFR3b0FycmF5UXVpY2tTb3J0ZXIoZklnbm9yZUNhc2UpLnNvcnQoc3RyaW5ncywgcCk7Ci0JCXJldHVybiBzdHJpbmdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRzKE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCWZFbGVtZW50cyA9IGVsZW1lbnRzOwotCQlmRWxlbWVudE1hcCA9IG5ldyBpbnRbZkVsZW1lbnRzLmxlbmd0aCArIDFdOwotCQlmUmVuZGVyZWRTdHJpbmdzID0gcmVuZGVyU3RyaW5ncyhmRWxlbWVudHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkSXRlbShpbnQgbmV3U2VsZWN0aW9uKSB7Ci0JCWZTZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUxvd2VyTGlzdFdpZGdldChpbnQgZnJvbSwgaW50IHRvKSB7Ci0JCWZMb3dlckxpc3QucmVtb3ZlQWxsKCk7Ci0JCWZRdWFsaWZpZXJNYXAgPSBuZXcgSW50ZWdlclt0byAtIGZyb21dOwotCQlTdHJpbmdbXSBxdWFsaWZpZXJzID0gbmV3IFN0cmluZ1t0byAtIGZyb21dOwotCQlmb3IgKGludCBpID0gZnJvbTsgaSA8IHRvOyBpKyspIHsKLQkJCS8vIFhYWDogMUc2NUxERzogSkZVSUY6V0lOMjAwMCAtIElMYWJlbFByb3ZpZGVyIHVzZWQgb3V0c2lkZSBhIHZpZXdlcgotCQkJcXVhbGlmaWVyc1tpIC0gZnJvbV0gPSBmUXVhbGlmaWVyUmVuZGVyZXIuZ2V0VGV4dChmRWxlbWVudHNbaV0pOwotCQkJZlF1YWxpZmllck1hcFtpIC0gZnJvbV0gPSBuZXcgSW50ZWdlcihpKTsKLQkJfQotCi0JCW5ldyBUd29BcnJheVF1aWNrU29ydGVyKGZJZ25vcmVDYXNlKS5zb3J0KHF1YWxpZmllcnMsIGZRdWFsaWZpZXJNYXApOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG8gLSBmcm9tOyBpKyspIHsKLQkJCVRhYmxlSXRlbSB0aSA9IG5ldyBUYWJsZUl0ZW0oZkxvd2VyTGlzdCwgaSk7Ci0JCQl0aS5zZXRUZXh0KHF1YWxpZmllcnNbaV0pOwotCQkJLy8gWFhYOiAxRzY1TERHOiBKRlVJRjpXSU4yMDAwIC0gSUxhYmVsUHJvdmlkZXIgdXNlZCBvdXRzaWRlIGEgdmlld2VyCi0JCQlJbWFnZSBpbWcgPSBmUXVhbGlmaWVyUmVuZGVyZXIuZ2V0SW1hZ2UoZkVsZW1lbnRzW2Zyb20gKyBpXSk7Ci0JCQlpZiAoaW1nICE9IG51bGwpCi0JCQkJdGkuc2V0SW1hZ2UoaW1nKTsKLQkJfQotCi0JCWlmIChmTG93ZXJMaXN0LmdldEl0ZW1Db3VudCgpID4gMCkKLQkJCWZMb3dlckxpc3Quc2V0U2VsZWN0aW9uKDApOwotCQl1cGRhdGVPa1N0YXRlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVPa1N0YXRlKCkgewotCQlCdXR0b24gb2tCdXR0b24gPSBnZXRPa0J1dHRvbigpOwotCQlpZiAob2tCdXR0b24gIT0gbnVsbCkKLQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZ2V0V2lkZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVVcHBlckxpc3RXaWRnZXQoaW50W10gaW5kaWNlcywgaW50IHNpemUpIHsKLQkJZlVwcGVyTGlzdC5zZXRSZWRyYXcoZmFsc2UpOwotCQlpbnQgaXRlbUNvdW50ID0gZlVwcGVyTGlzdC5nZXRJdGVtQ291bnQoKTsKLQkJaWYgKHNpemUgPCBpdGVtQ291bnQpCi0JCQlmVXBwZXJMaXN0LnJlbW92ZSgwLCBpdGVtQ291bnQgLSBzaXplIC0gMSk7Ci0JCVRhYmxlSXRlbVtdIGl0ZW1zID0gZlVwcGVyTGlzdC5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJVGFibGVJdGVtIHRpID0gbnVsbDsKLQkJCWlmIChpIDwgaXRlbUNvdW50KQotCQkJCXRpID0gaXRlbXNbaV07Ci0JCQllbHNlCi0JCQkJdGkgPSBuZXcgVGFibGVJdGVtKGZVcHBlckxpc3QsIGkpOwotCQkJdGkuc2V0VGV4dChmUmVuZGVyZWRTdHJpbmdzW2luZGljZXNbaV1dKTsKLQkJCS8vIFhYWDogMUc2NUxERzogSkZVSUY6V0lOMjAwMCAtIElMYWJlbFByb3ZpZGVyIHVzZWQgb3V0c2lkZSBhIHZpZXdlcgotCQkJSW1hZ2UgaW1nID0gZkVsZW1lbnRSZW5kZXJlci5nZXRJbWFnZShmRWxlbWVudHNbaW5kaWNlc1tpXV0pOwotCQkJaWYgKGltZyAhPSBudWxsKQotCQkJCXRpLnNldEltYWdlKGltZyk7Ci0JCX0KLQkJaWYgKGZVcHBlckxpc3QuZ2V0SXRlbUNvdW50KCkgPiAwKQotCQkJZlVwcGVyTGlzdC5zZXRTZWxlY3Rpb24oMCk7Ci0JCWZVcHBlckxpc3Quc2V0UmVkcmF3KHRydWUpOwotCQloYW5kbGVVcHBlclNlbGVjdGlvbkNoYW5nZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2VudCB3aGVuIGRlZmF1bHQgc2VsZWN0aW9uIG9jY3VycyBpbiB0aGUgY29udHJvbC4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgb24gc29tZSBwbGF0Zm9ybXMgZGVmYXVsdCBzZWxlY3Rpb24gb2NjdXJzCi0JICogaW4gYSBMaXN0IHdoZW4gdGhlIHVzZXIgZG91YmxlLWNsaWNrcyBhbiBpdGVtIG9yIHR5cGVzCi0JICogcmV0dXJuIGluIGEgVGV4dC4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gZSBhbiBldmVudCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZWZhdWx0IHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0JCi0JLyoqCi0JICogU2VudCB3aGVuIHNlbGVjdGlvbiBvY2N1cnMgaW4gdGhlIGNvbnRyb2wuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIG9uIHNvbWUgcGxhdGZvcm1zIHNlbGVjdGlvbiBvY2N1cnMgaW4KLQkgKiBhIExpc3Qgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIGl0ZW0gb3IgaXRlbXMuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGUgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gZkpTUEJ1dHRvbikgewotCQkJZlNlbGVjdGlvbiA9IEpTUDsKLQkJCWZQYWdlQm9vay5zaG93UGFnZShmSnNwQ29udHJvbCk7Ci0JCQl1cGRhdGVPS1N0YXR1cygpOwotCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IGZTZXJ2bGV0QnV0dG9uKSB7Ci0JCQlmU2VsZWN0aW9uID0gU0VSVkxFVDsKLQkJCWZQYWdlQm9vay5zaG93UGFnZShmU2VydmxldENvbnRyb2wpOwotCQl9IGVsc2UKLQkJCWZTZWxlY3Rpb24gPSAtMTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyN1cGRhdGVPS1N0YXR1cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT0tTdGF0dXMoKSB7Ci0JCXN1cGVyLnVwZGF0ZU9LU3RhdHVzKCk7Ci0JCUJ1dHRvbiBva0J1dHRvbiA9IGdldE9rQnV0dG9uKCk7Ci0JCWlmIChva0J1dHRvbiAhPSBudWxsKQotCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmTG9jYWxWYWxpZGF0b3IudmFsaWRhdGUoZ2V0UmVzdWx0KCkpLmlzT0soKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL011bHRpU2VsZWN0RmlsdGVyZWRGaWx0ZXJGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL011bHRpU2VsZWN0RmlsdGVyZWRGaWx0ZXJGaWxlU2VsZWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDIwODguLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9NdWx0aVNlbGVjdEZpbHRlcmVkRmlsdGVyRmlsZVNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9GSUxURVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkRFRkFVTFRfUEFDS0FHRTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLkZpbHRlcmVkRmlsZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kaWFsb2dzLlR3b0FycmF5UXVpY2tTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5UeXBlZEZpbGVWaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLnByb3ZpZGVycy5XZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5TZXJ2bGV0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoNy8zMC8yMDAxIDExOjE2OjM2IEFNKQotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbHRlckZpbGVTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcwotCQlGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cgewotCQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFja2FnZVJlbmRlcmVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCXByaXZhdGUgZmluYWwgSW1hZ2UgUEFDS0FHRV9JQ09OID0gSmF2YVVJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfUEFDS0FHRSk7IAotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJSVR5cGUgdHlwZSA9IChJVHlwZSkgZWxlbWVudDsKLQkJCVN0cmluZyBwID0gdHlwZS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQkJaWYgKCIiLmVxdWFscyhwKSkgLy8kTk9OLU5MUy0xJAotCQkJCXAgPSBERUZBVUxUX1BBQ0tBR0U7Ci0JCQlyZXR1cm4gKHAgKyAiIC0gIiArIHR5cGUuZ2V0UGFja2FnZUZyYWdtZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gUEFDS0FHRV9JQ09OOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZVJlbmRlcmVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCXByaXZhdGUgZmluYWwgSW1hZ2UgQ0xBU1NfSUNPTiA9IEphdmFVSS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShJU2hhcmVkSW1hZ2VzLklNR19PQkpTX0NMQVNTKTsgCi0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlJVHlwZSBlID0gKChJVHlwZSkgZWxlbWVudCk7Ci0JCQlyZXR1cm4gZS5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gQ0xBU1NfSUNPTjsKLQkJfQotCi0JfQotCXByb3RlY3RlZCBQYWdlQm9vayBmUGFnZUJvb2sgPSBudWxsOwotCXByb3RlY3RlZCBDb250cm9sIGZTZXJ2bGV0Q29udHJvbCA9IG51bGw7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBmQ2hpbGQgPSBudWxsOwotCS8vIGNvbnN0cnVjdGlvbiBwYXJhbWV0ZXJzCi0JcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgZlJ1bm5hYmxlQ29udGV4dDsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgZkVsZW1lbnRSZW5kZXJlcjsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgZlF1YWxpZmllclJlbmRlcmVyOwotCXByaXZhdGUgT2JqZWN0W10gZkVsZW1lbnRzOwotCXByaXZhdGUgYm9vbGVhbiBmSWdub3JlQ2FzZSA9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZlVwcGVyTGlzdExhYmVsOwotCXByaXZhdGUgU3RyaW5nIGZMb3dlckxpc3RMYWJlbDsKLQkvLyBTV1Qgd2lkZ2V0cwotCXByaXZhdGUgVGFibGUgZlVwcGVyTGlzdDsKLQlwcml2YXRlIFRhYmxlIGZMb3dlckxpc3Q7Ci0JcHJvdGVjdGVkIFRleHQgZlRleHQ7Ci0JcHJpdmF0ZSBJVHlwZVtdIGZJVDsKLQlwcml2YXRlIFN0cmluZ1tdIGZSZW5kZXJlZFN0cmluZ3M7Ci0JcHJpdmF0ZSBpbnRbXSBmRWxlbWVudE1hcDsKLQlwcml2YXRlIEludGVnZXJbXSBmUXVhbGlmaWVyTWFwOwotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIGZMb2NhbFZhbGlkYXRvciA9IG51bGw7Ci0JLyoqCi0JICogVGhpcyBpcyBhIHNlbGVjdGlvbiBkaWFsb2cgZm9yIGF2YWlsYWJsZSBzZXJ2bGV0LgotCSAqIEBwYXJhbSBwYXJlbnQgU2hlbGwKLQkgKiBAcGFyYW0gdGl0bGUgU3RyaW5nCi0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICogQHBhcmVudCBleHRlbnNpb25zIFN0cmluZ1tdCi0JICogQHBhcmFtIGFsbG93TXVsdGlwbGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBNdWx0aVNlbGVjdEZpbHRlcmVkRmlsdGVyRmlsZVNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGV4dGVuc2lvbnMsIGJvb2xlYW4gYWxsb3dNdWx0aXBsZSwgSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcihwYXJlbnQsIHRpdGxlLCBtZXNzYWdlLCBleHRlbnNpb25zLCBhbGxvd011bHRpcGxlKTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuUkVTSVpFKTsKLQotCQlpZiAodGl0bGUgPT0gbnVsbCkKLQkJCXNldFRpdGxlKFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJGaWxlX1NlbGVjdGlvbl9VSV8iKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkKLQkJCW1lc3NhZ2UgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiU2VsZWN0X2FfZmlsZV9fVUlfIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJc2V0RXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJYWRkRmlsdGVyKG5ldyBUeXBlZEZpbGVWaWV3ZXJGaWx0ZXIoZXh0ZW5zaW9ucykpOwotCQlmTG9jYWxWYWxpZGF0b3IgPSBuZXcgU2ltcGxlVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yKG5ldyBDbGFzc1tdIHsgSUZpbGUuY2xhc3MgfSwgYWxsb3dNdWx0aXBsZSk7Ci0JCXNldFZhbGlkYXRvcihmTG9jYWxWYWxpZGF0b3IpOwotCQkKLQkJLy9TdGF0dXNJbmZvIGN1cnJTdGF0dXMgPSBuZXcgU3RhdHVzSW5mbygpOwotCQkvL2N1cnJTdGF0dXMuc2V0T0soKTsKLQkJU3RhdHVzIGN1cnJTdGF0dXMgPSBuZXcgU3RhdHVzKFN0YXR1cy5PSywgU2VydmxldFVJUGx1Z2luLlBMVUdJTl9JRCwgU3RhdHVzLk9LLCAiIiwgbnVsbCk7Ci0JCQotCQl1cGRhdGVTdGF0dXMoY3VyclN0YXR1cyk7Ci0JCWZFbGVtZW50UmVuZGVyZXIgPSBuZXcgVHlwZVJlbmRlcmVyKCk7Ci0JCWZRdWFsaWZpZXJSZW5kZXJlciA9IG5ldyBQYWNrYWdlUmVuZGVyZXIoKTsKLQkJZlJ1bm5hYmxlQ29udGV4dCA9IFNlcnZsZXRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCXRyeSB7Ci0JCQlJSmF2YUVsZW1lbnQgamVsZW0gPSBudWxsOwotCQkJSVByb2plY3QgcHJvaiA9IG51bGw7Ci0JCQlqZWxlbSA9IChJSmF2YUVsZW1lbnQpIHByb2plY3QuZ2V0QWRhcHRlcihJSmF2YUVsZW1lbnQuY2xhc3MpOwotCQkJaWYgKGplbGVtID09IG51bGwpIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoSVJlc291cmNlKSBwcm9qZWN0LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlwcm9qID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCQlpZiAocHJvaiAhPSBudWxsKSB7Ci0JCQkJCQlqZWxlbSA9IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlLmNyZWF0ZShwcm9qKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUlKYXZhUHJvamVjdCBqcCA9IGplbGVtLmdldEphdmFQcm9qZWN0KCk7Ci0JCQkgSVR5cGUgZmlsdGVyVHlwZSA9IGpwLmZpbmRUeXBlKFFVQUxJRklFRF9GSUxURVIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBuZXh0IDMgbGluZXMgZml4IGRlZmVjdCAxNzc2ODYKLQkJCWlmIChmaWx0ZXJUeXBlID09IG51bGwpIHsKLQkJCSAgICByZXR1cm47Ci0JCQl9Ci0JCQlBcnJheUxpc3QgZmlsdGVyQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlUeXBlSGllcmFyY2h5IHRIID0gZmlsdGVyVHlwZS5uZXdUeXBlSGllcmFyY2h5KGpwLCBudWxsKTsKLQkJCUlUeXBlW10gdHlwZXMgPSB0SC5nZXRBbGxTdWJ0eXBlcyhmaWx0ZXJUeXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCSAgICBpZiAodHlwZXNbaV0uaXNDbGFzcygpICYmICFmaWx0ZXJDbGFzc2VzLmNvbnRhaW5zKHR5cGVzW2ldKSkKLQkJCSAgICAgICAgZmlsdGVyQ2xhc3Nlcy5hZGQodHlwZXNbaV0pOwotCQkJfQotCQkJZklUID0gKElUeXBlW10pIGZpbHRlckNsYXNzZXMudG9BcnJheShuZXcgSVR5cGVbZmlsdGVyQ2xhc3Nlcy5zaXplKCldKTsKLQkJCWZpbHRlckNsYXNzZXMgPSBudWxsOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU2VydmxldFVJUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcHJpdmF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXB1dGVSZXN1bHQoKSB7Ci0JICAgIElUeXBlIHR5cGUgPSAoSVR5cGUpIGdldFdpZGdldFNlbGVjdGlvbigpOwotCSAgICBpZiAodHlwZSAhPSBudWxsKSB7Ci0JICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0JICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlNlbGVjdF9DbGFzc19VSV8iKTsgLy8kTk9OLU5MUy0xJCA9ICJTZWxlY3QgQ2xhc3MiCi0JICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiQ291bGRfbm90X3VuaXF1ZWx5X21hcF90aGVfRVJST1JfIik7IC8vJE5PTi1OTFMtMSQgPSAiQ291bGQgbm90IHVuaXF1ZWx5IG1hcCB0aGUgY2xhc3MgbmFtZSB0byBhIGNsYXNzLiIKLQkgICAgICAgICAgICBNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSk7Ci0JICAgICAgICAgICAgc2V0UmVzdWx0KG51bGwpOwotCSAgICAgICAgfSBlbHNlIHsKLQkgICAgICAgICAgICBqYXZhLnV0aWwuTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDEpOwotCSAgICAgICAgICAgIHJlc3VsdC5hZGQodHlwZSk7Ci0JICAgICAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCk7Ci0JICAgICAgICB9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQkJZlRleHQuc2V0Rm9jdXMoKTsKLQkJcmVtYXRjaCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJdXBkYXRlT2tTdGF0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGlzIGRpYWxvZydzIAotCSAqIGJ1dHRvbiBiYXIuCi0JICogPHA+Ci0JICogVGhlIDxjb2RlPkRpYWxvZzwvY29kZT4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmcmFtZXdvcmsgbWV0aG9kCi0JICogbGF5cyBvdXQgYSBidXR0b24gYmFyIGFuZCBjYWxscyB0aGUgPGNvZGU+Y3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcjwvY29kZT4KLQkgKiBmcmFtZXdvcmsgbWV0aG9kIHRvIHBvcHVsYXRlIGl0LiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZS4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGJ1dHRvbiBiYXIKLQkgKiBAcmV0dXJuIHRoZSBidXR0b24gYmFyIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCi0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZTIgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCS8vIGNyZWF0ZSBhIGxheW91dCB3aXRoIHNwYWNpbmcgYW5kIG1hcmdpbnMgYXBwcm9wcmlhdGUgZm9yIHRoZSBmb250IHNpemUuCi0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMDsgLy8gdGhpcyBpcyBpbmNyZW1lbnRlZCBieSBjcmVhdGVCdXR0b24KLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMob3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQotCQljb21wb3NpdGUyLnNldExheW91dChsYXlvdXQpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOwotCQljb21wb3NpdGUyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY29tcG9zaXRlMi5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCS8vIEFkZCB0aGUgYnV0dG9ucyB0byB0aGUgYnV0dG9uIGJhci4KLQkJc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihjb21wb3NpdGUyKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQkvKgotCSAqIEBwcml2YXRlCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0KLQkJZkNoaWxkID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChmQ2hpbGQsICJjb20uaWJtLmV0b29scy53ZWJhcHBsaWNhdGlvbmVkaXQud2VieDIwMTAiKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2wubnVtQ29sdW1ucyA9IDI7Ci0JCWdsLm1hcmdpbkhlaWdodCA9IDU7Ci0JCWZDaGlsZC5zZXRMYXlvdXQoZ2wpOwotCi0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZkNoaWxkLnNldExheW91dERhdGEoZ2QpOwotCi0JCWZQYWdlQm9vayA9IG5ldyBQYWdlQm9vayhmQ2hpbGQsIFNXVC5OT05FKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWdkLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmUGFnZUJvb2suc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoZlBhZ2VCb29rKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShmUGFnZUJvb2ssIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX01BUkdJTik7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJTGFiZWwgbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQltZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgICAgIG1lc3NhZ2VMYWJlbC5zZXRUZXh0KFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJDaG9vc2VfYV9maWx0ZXJfXzEiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBmVGV4dCA9IGNyZWF0ZVRleHQoY29tcG9zaXRlKTsKLQotCQltZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICAgICAgbWVzc2FnZUxhYmVsLnNldFRleHQoV2ViQXBwRWRpdFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIk1hdGNoaW5nX2ZpbHRlcnNfXzIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmVXBwZXJMaXN0ID0gY3JlYXRlVXBwZXJMaXN0KGNvbXBvc2l0ZSk7Ci0KLQkJbWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQltZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCW1lc3NhZ2VMYWJlbC5zZXRUZXh0KFdlYkFwcEVkaXRSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJRdWFsaWZpZXJfXzMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmTG93ZXJMaXN0ID0gY3JlYXRlTG93ZXJMaXN0KGNvbXBvc2l0ZSk7Ci0KLQkJZlNlcnZsZXRDb250cm9sID0gY29tcG9zaXRlOwotCi0JCWZQYWdlQm9vay5zaG93UGFnZShmU2VydmxldENvbnRyb2wpOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsaXN0IHdpZGdldCBhbmQgc2V0cyBsYXlvdXQgZGF0YS4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QKLQkgKi8KLQlwcml2YXRlIFRhYmxlIGNyZWF0ZUxvd2VyTGlzdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChmTG93ZXJMaXN0TGFiZWwgIT0gbnVsbCkKLQkJCSAobmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpKS5zZXRUZXh0KGZMb3dlckxpc3RMYWJlbCk7Ci0KLQkJVGFibGUgbGlzdCA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlsaXN0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotCQkJCWhhbmRsZUxvd2VyU2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQkJbGlzdC5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3VibGVDbGljaywgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCQkJaGFuZGxlTG93ZXJEb3VibGVDbGljaygpOwotCQkJfQotCQl9KTsKLQkJbGlzdC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJZlF1YWxpZmllclJlbmRlcmVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoKTsKLQkJc3BlYy53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNTApOwotCQlzcGVjLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJc3BlYy5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJc3BlYy52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxpc3Quc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRleHQgd2lkZ2V0IGFuZCBzZXRzIGxheW91dCBkYXRhLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dAotCSAqLwotCXByaXZhdGUgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YSgpOwotCQlzcGVjLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXNwZWMudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJTGlzdGVuZXIgbCA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2dCkgewotCQkJCXJlbWF0Y2goZlRleHQuZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfTsKLQkJdGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCBsKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxpc3Qgd2lkZ2V0IGFuZCBzZXRzIGxheW91dCBkYXRhLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdAotCSAqLwotCXByaXZhdGUgVGFibGUgY3JlYXRlVXBwZXJMaXN0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGZVcHBlckxpc3RMYWJlbCAhPSBudWxsKQotCQkJIChuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkpLnNldFRleHQoZlVwcGVyTGlzdExhYmVsKTsKLQotCQlUYWJsZSBsaXN0ID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCWxpc3QuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZ0KSB7Ci0JCQkJaGFuZGxlVXBwZXJTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaXN0LmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvdWJsZUNsaWNrLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldnQpIHsKLQkJCQloYW5kbGVVcHBlckRvdWJsZUNsaWNrKCk7Ci0JCQl9Ci0JCX0pOwotCQlsaXN0LmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlmRWxlbWVudFJlbmRlcmVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCUdyaWREYXRhIHNwZWMgPSBuZXcgR3JpZERhdGEoKTsKLQkJc3BlYy53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNTApOwotCQlzcGVjLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDE1KTsKLQkJc3BlYy5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXNwZWMuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXNwZWMuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXNwZWMudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsaXN0LnNldExheW91dERhdGEoc3BlYyk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBJRCBvZiB0aGUgYnV0dG9uIHRoYXQgaXMgJ3ByZXNzZWQnIG9uIGRvdWJsZUNsaWNrIGluIHRoZSBsaXN0cy4KLQkgKiBCeSBkZWZhdWx0IGl0IGlzIHRoZSBPSyBidXR0b24uCi0JICogT3ZlcnJpZGUgdG8gY2hhbmdlIHRoaXMgc2V0dGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRCdXR0b25JRCgpIHsKLQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuT0tfSUQ7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZ2V0V2lkZ2V0U2VsZWN0aW9uKCkgewotCQlpbnQgaSA9IGZMb3dlckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGZRdWFsaWZpZXJNYXAgIT0gbnVsbCkgewotCQkJaWYgKGZRdWFsaWZpZXJNYXAubGVuZ3RoID09IDEpCi0JCQkJaSA9IDA7Ci0JCQlpZiAoaSA8IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gCi0JCQlJbnRlZ2VyIGluZGV4ID0gZlF1YWxpZmllck1hcFtpXTsKLQkJCXJldHVybiBmRWxlbWVudHNbaW5kZXguaW50VmFsdWUoKV07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZUxvd2VyRG91YmxlQ2xpY2soKSB7Ci0JCWlmIChnZXRXaWRnZXRTZWxlY3Rpb24oKSAhPSBudWxsKQotCQkJYnV0dG9uUHJlc3NlZChnZXREZWZhdWx0QnV0dG9uSUQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGhhbmRsZUxvd2VyU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJdXBkYXRlT2tTdGF0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVVcHBlckRvdWJsZUNsaWNrKCkgewotCQlpZiAoZ2V0V2lkZ2V0U2VsZWN0aW9uKCkgIT0gbnVsbCkKLQkJCWJ1dHRvblByZXNzZWQoZ2V0RGVmYXVsdEJ1dHRvbklEKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBoYW5kbGVVcHBlclNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCWludCBzZWxlY3Rpb24gPSBmVXBwZXJMaXN0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChzZWxlY3Rpb24gPj0gMCkgewotCQkJaW50IGkgPSBmRWxlbWVudE1hcFtzZWxlY3Rpb25dOwotCQkJaW50IGsgPSBpOwotCQkJaW50IGxlbmd0aCA9IGZSZW5kZXJlZFN0cmluZ3MubGVuZ3RoOwotCQkJd2hpbGUgKGsgPCBsZW5ndGggJiYgZlJlbmRlcmVkU3RyaW5nc1trXS5lcXVhbHMoZlJlbmRlcmVkU3RyaW5nc1tpXSkpIHsKLQkJCQlrKys7Ci0JCQl9Ci0JCQl1cGRhdGVMb3dlckxpc3RXaWRnZXQoaSwgayk7Ci0JCX0gZWxzZQotCQkJdXBkYXRlTG93ZXJMaXN0V2lkZ2V0KDAsIDApOwotCX0KLQkKLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCWlmIChmSVQgPT0gbnVsbCB8fCBmSVQubGVuZ3RoID09IDApIHsKLQkJICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGdldFNoZWxsKCksIAotCQkgICAgICAgICAgICBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiRW1wdHlfTGlzdF8xIiksIAotCQkgICAgICAgICAgICBXZWJBcHBFZGl0UmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiX0lORk9fTm9fZmlsdGVyc19leGlzdF90b19hZGQuXzEiKSk7ICAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBDQU5DRUw7Ci0JCX0KLQotCQlzZXRFbGVtZW50cyhmSVQpOwotCQlzZXRJbml0aWFsU2VsZWN0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gc3VwZXIub3BlbigpOwotCX0KLQkKLQkvKioKLQkgKiB1cGRhdGUgdGhlIGxpc3QgdG8gcmVmbGVjdCBhIG5ldyBtYXRjaCBzdHJpbmcuCi0JICogQHBhcmFtIG1hdGNoU3RyaW5nIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW1hdGNoKFN0cmluZyBtYXRjaFN0cmluZykgewotCQlpbnQgayA9IDA7Ci0JCVN0cmluZyB0ZXh0ID0gZlRleHQuZ2V0VGV4dCgpOwotCQlTdHJpbmdNYXRjaGVyIG1hdGNoZXIgPSBuZXcgU3RyaW5nTWF0Y2hlcih0ZXh0ICsgIioiLCBmSWdub3JlQ2FzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsYXN0U3RyaW5nID0gbnVsbDsKLQkJaW50IGxlbmd0aCA9IGZFbGVtZW50cy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXdoaWxlIChpIDwgbGVuZ3RoICYmIGZSZW5kZXJlZFN0cmluZ3NbaV0uZXF1YWxzKGxhc3RTdHJpbmcpKQotCQkJCWkrKzsKLQkJCWlmIChpIDwgbGVuZ3RoKSB7Ci0JCQkJbGFzdFN0cmluZyA9IGZSZW5kZXJlZFN0cmluZ3NbaV07Ci0JCQkJaWYgKG1hdGNoZXIubWF0Y2goZlJlbmRlcmVkU3RyaW5nc1tpXSkpIHsKLQkJCQkJZkVsZW1lbnRNYXBba10gPSBpOwotCQkJCQlrKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZFbGVtZW50TWFwW2tdID0gLTE7Ci0KLQkJdXBkYXRlVXBwZXJMaXN0V2lkZ2V0KGZFbGVtZW50TWFwLCBrKTsKLQl9Ci0JCi0JLyoqCi0JCSAqIAotCQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCQkgKiBAcGFyYW0gcCBvcmcuZWNsaXBzZS5qZmFjZS5lbGVtZW50cy5JSW5kZXhlZFByb3BlcnR5Ci0JCSAqLwotCXByaXZhdGUgU3RyaW5nW10gcmVuZGVyU3RyaW5ncyhPYmplY3RbXSBwKSB7Ci0JCVN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW3AubGVuZ3RoXTsKLQkJaW50IHNpemUgPSBzdHJpbmdzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXN0cmluZ3NbaV0gPSBmRWxlbWVudFJlbmRlcmVyLmdldFRleHQocFtpXSk7Ci0JCX0KLQkJbmV3IFR3b0FycmF5UXVpY2tTb3J0ZXIoZklnbm9yZUNhc2UpLnNvcnQoc3RyaW5ncywgcCk7Ci0JCXJldHVybiBzdHJpbmdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRzKE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCWZFbGVtZW50cyA9IGVsZW1lbnRzOwotCQlmRWxlbWVudE1hcCA9IG5ldyBpbnRbZkVsZW1lbnRzLmxlbmd0aCArIDFdOwotCQlmUmVuZGVyZWRTdHJpbmdzID0gcmVuZGVyU3RyaW5ncyhmRWxlbWVudHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVMb3dlckxpc3RXaWRnZXQoaW50IGZyb20sIGludCB0bykgewotCQlmTG93ZXJMaXN0LnJlbW92ZUFsbCgpOwotCQlmUXVhbGlmaWVyTWFwID0gbmV3IEludGVnZXJbdG8gLSBmcm9tXTsKLQkJU3RyaW5nW10gcXVhbGlmaWVycyA9IG5ldyBTdHJpbmdbdG8gLSBmcm9tXTsKLQkJZm9yIChpbnQgaSA9IGZyb207IGkgPCB0bzsgaSsrKSB7Ci0JCQkvLyBYWFg6IDFHNjVMREc6IEpGVUlGOldJTjIwMDAgLSBJTGFiZWxQcm92aWRlciB1c2VkIG91dHNpZGUgYSB2aWV3ZXIKLQkJCXF1YWxpZmllcnNbaSAtIGZyb21dID0gZlF1YWxpZmllclJlbmRlcmVyLmdldFRleHQoZkVsZW1lbnRzW2ldKTsKLQkJCWZRdWFsaWZpZXJNYXBbaSAtIGZyb21dID0gbmV3IEludGVnZXIoaSk7Ci0JCX0KLQotCQluZXcgVHdvQXJyYXlRdWlja1NvcnRlcihmSWdub3JlQ2FzZSkuc29ydChxdWFsaWZpZXJzLCBmUXVhbGlmaWVyTWFwKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvIC0gZnJvbTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gdGkgPSBuZXcgVGFibGVJdGVtKGZMb3dlckxpc3QsIGkpOwotCQkJdGkuc2V0VGV4dChxdWFsaWZpZXJzW2ldKTsKLQkJCS8vIFhYWDogMUc2NUxERzogSkZVSUY6V0lOMjAwMCAtIElMYWJlbFByb3ZpZGVyIHVzZWQgb3V0c2lkZSBhIHZpZXdlcgotCQkJSW1hZ2UgaW1nID0gZlF1YWxpZmllclJlbmRlcmVyLmdldEltYWdlKGZFbGVtZW50c1tmcm9tICsgaV0pOwotCQkJaWYgKGltZyAhPSBudWxsKQotCQkJCXRpLnNldEltYWdlKGltZyk7Ci0JCX0KLQotCQlpZiAoZkxvd2VyTGlzdC5nZXRJdGVtQ291bnQoKSA+IDApCi0JCQlmTG93ZXJMaXN0LnNldFNlbGVjdGlvbigwKTsKLQkJdXBkYXRlT2tTdGF0ZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlT2tTdGF0ZSgpIHsKLQkJQnV0dG9uIG9rQnV0dG9uID0gZ2V0T2tCdXR0b24oKTsKLQkJaWYgKG9rQnV0dG9uICE9IG51bGwpCi0JCQlva0J1dHRvbi5zZXRFbmFibGVkKGdldFdpZGdldFNlbGVjdGlvbigpICE9IG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlVXBwZXJMaXN0V2lkZ2V0KGludFtdIGluZGljZXMsIGludCBzaXplKSB7Ci0JCWZVcHBlckxpc3Quc2V0UmVkcmF3KGZhbHNlKTsKLQkJaW50IGl0ZW1Db3VudCA9IGZVcHBlckxpc3QuZ2V0SXRlbUNvdW50KCk7Ci0JCWlmIChzaXplIDwgaXRlbUNvdW50KQotCQkJZlVwcGVyTGlzdC5yZW1vdmUoMCwgaXRlbUNvdW50IC0gc2l6ZSAtIDEpOwotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IGZVcHBlckxpc3QuZ2V0SXRlbXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVRhYmxlSXRlbSB0aSA9IG51bGw7Ci0JCQlpZiAoaSA8IGl0ZW1Db3VudCkKLQkJCQl0aSA9IGl0ZW1zW2ldOwotCQkJZWxzZQotCQkJCXRpID0gbmV3IFRhYmxlSXRlbShmVXBwZXJMaXN0LCBpKTsKLQkJCXRpLnNldFRleHQoZlJlbmRlcmVkU3RyaW5nc1tpbmRpY2VzW2ldXSk7Ci0JCQkvLyBYWFg6IDFHNjVMREc6IEpGVUlGOldJTjIwMDAgLSBJTGFiZWxQcm92aWRlciB1c2VkIG91dHNpZGUgYSB2aWV3ZXIKLQkJCUltYWdlIGltZyA9IGZFbGVtZW50UmVuZGVyZXIuZ2V0SW1hZ2UoZkVsZW1lbnRzW2luZGljZXNbaV1dKTsKLQkJCWlmIChpbWcgIT0gbnVsbCkKLQkJCQl0aS5zZXRJbWFnZShpbWcpOwotCQl9Ci0JCWlmIChmVXBwZXJMaXN0LmdldEl0ZW1Db3VudCgpID4gMCkKLQkJCWZVcHBlckxpc3Quc2V0U2VsZWN0aW9uKDApOwotCQlmVXBwZXJMaXN0LnNldFJlZHJhdyh0cnVlKTsKLQkJaGFuZGxlVXBwZXJTZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JfQotCQotCS8qKgotCSAqIFNlbnQgd2hlbiBkZWZhdWx0IHNlbGVjdGlvbiBvY2N1cnMgaW4gdGhlIGNvbnRyb2wuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIG9uIHNvbWUgcGxhdGZvcm1zIGRlZmF1bHQgc2VsZWN0aW9uIG9jY3VycwotCSAqIGluIGEgTGlzdCB3aGVuIHRoZSB1c2VyIGRvdWJsZS1jbGlja3MgYW4gaXRlbSBvciB0eXBlcwotCSAqIHJldHVybiBpbiBhIFRleHQuCi0JICogPC9wPgotCSAqCi0JICogQHBhcmFtIGUgYW4gZXZlbnQgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGVmYXVsdCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkvLyBEbyBub3RoaW5nCi0JfQotCQotCS8qKgotCSAqIEBzZWUgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cjdXBkYXRlT0tTdGF0dXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9LU3RhdHVzKCkgewotCQlzdXBlci51cGRhdGVPS1N0YXR1cygpOwotCQlCdXR0b24gb2tCdXR0b24gPSBnZXRPa0J1dHRvbigpOwotCQlpZiAob2tCdXR0b24gIT0gbnVsbCkKLQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZkxvY2FsVmFsaWRhdG9yLnZhbGlkYXRlKGdldFJlc3VsdCgpKS5pc09LKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdGaWx0ZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0ZpbHRlckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhNTljMC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0ZpbHRlckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuREVTVFJPWTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19GSUxURVI7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5JVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLklTZXJ2bGV0Q29uc3RhbnRzLlFVQUxJRklFRF9GSUxURVI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLkZpbHRlclN1cGVydHlwZXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIE5ld0ZpbHRlckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UgZXh0ZW5kcwotCQlOZXdXZWJDbGFzc09wdGlvbnNXaXphcmRQYWdlIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBpbml0QnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZGVzdHJveUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRvRmlsdGVyQnV0dG9uOwotCQotCXB1YmxpYyBOZXdGaWx0ZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHBhZ2VEZXNjLCBTdHJpbmcgcGFnZVRpdGxlKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgcGFnZURlc2MsIHBhZ2VUaXRsZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgY29tcG9zaXRlIHdpdGggYWxsIHRoZSBzdHVicwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVN0dWJzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlU3R1YnNDb21wb3NpdGUocGFyZW50KTsKLQotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUobWV0aG9kU3R1YnMsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWluaXRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWluaXRCdXR0b24uc2V0VGV4dCgiJmluaXQiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGluaXRCdXR0b24sIElOSVQsIG51bGwpOwotCi0JCWRlc3Ryb3lCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWRlc3Ryb3lCdXR0b24uc2V0VGV4dCgiZGVzdHJvJnkiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGRlc3Ryb3lCdXR0b24sIERFU1RST1ksIG51bGwpOwotCi0JCWRvRmlsdGVyQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkb0ZpbHRlckJ1dHRvbi5zZXRUZXh0KCJkbyZGaWx0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGRvRmlsdGVyQnV0dG9uLCBET19GSUxURVIsIG51bGwpOwotCQkKLQkJaW50ZXJmYWNlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJCi0JICAgIERpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCi0JCS8vIGlmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHksIHRoZW4gdGhlIHJlbW92ZSBidXR0b24gaXMgZGlzYWJsZWQKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gaWYgdGhlIHNlbGVjdGlvbiBpcyBub24tZW1wdHkgYW5kIHRoZSBmaWx0ZXIgZXh0ZW5kcyBhIGNsYXNzIHdoaWNoCi0JCS8vIGltcGxlbWVudHMgamF2YXguc2VydmxldC5GaWx0ZXIsIHRoZW4gdGhlIHJlbW92ZSBidXR0b24gaXMgZW5hYmxlZAotCQlpZiAoRmlsdGVyU3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0ZpbHRlclN1cGVyY2xhc3MobW9kZWwpKSB7Ci0JCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXJldHVybjsKLQkJfSAKLQkJCi0JCS8vIGlmIHRoZSBzZWxlY3Rpb24gaXMgbm9uLWVtcHR5IGFuZCB0aGUgZmlsdGVyIGRvZXMgbm90IGV4dGVuZCBhIGNsYXNzCi0JCS8vIHdoaWNoIGltcGxlbWVudHMgamF2YXguc2VydmxldC5GaWx0ZXIsIHRoZW4gdGhlIHJlbW92ZSBidXR0b24gaXMKLQkJLy8gZGlzYWJsZWQgb25seSBpZiB0aGUgRmlsdGVyIGludGVyZmFjZSBpcyBpbiB0aGUgc2VsZWN0aW9uCi0JCUl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoUVVBTElGSUVEX0ZJTFRFUi5lcXVhbHMoaXRlci5uZXh0KCkpKQotCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gaW4gYWxsIG90aGVyIGNhc2VzIHRoZSByZW1vdmUgYnV0dG9uIGlzIGVuYWJsZWQKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdGaWx0ZXJDbGFzc1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3RmlsdGVyQ2xhc3NXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5OTBlNTcuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdGaWx0ZXJDbGFzc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5VU0VfRVhJU1RJTkdfQ0xBU1M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLkNIT09TRV9GSUxURVJfQ0xBU1M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5FV19GSUxURVJfV0laQVJEX1dJTkRPV19USVRMRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuVVNFX0VYSVNUSU5HX0ZJTFRFUl9DTEFTUzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViRmlsdGVyc0dyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBGaWx0ZXJzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBOZXdGaWx0ZXJDbGFzc1dpemFyZFBhZ2UgZXh0ZW5kcyBOZXdXZWJDbGFzc1dpemFyZFBhZ2UgewotCQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIEZJTFRFUkVYVEVOU0lPTlMgPSB7ICJqYXZhIiB9OyAvLyROT04tTkxTLTEkCi0gICAgCi0JcHVibGljIE5ld0ZpbHRlckNsYXNzV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyBwYWdlRGVzYywgU3RyaW5nIHBhZ2VUaXRsZSwgU3RyaW5nIG1vZHVsZVR5cGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBwYWdlRGVzYywgcGFnZVRpdGxlLCBtb2R1bGVUeXBlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVc2VFeGlzdGluZ0NoZWNrYm94VGV4dCgpIHsKLQkJcmV0dXJuIFVTRV9FWElTVElOR19GSUxURVJfQ0xBU1M7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlRXhpc3RpbmdQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIFVTRV9FWElTVElOR19DTEFTUzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldEV4dGVuZGVkU2VsZWN0ZWRQcm9qZWN0KE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFdlYkZpbHRlcnNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApKChXZWJGaWx0ZXJzR3JvdXBJdGVtUHJvdmlkZXIpIHNlbGVjdGlvbikuZ2V0UGFyZW50KCk7Ci0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHdlYkFwcCk7Ci0JCX1lbHNlIGlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFdlYkFwcFByb3ZpZGVyKXsKLQkJCXJldHVybiAoKFdlYkFwcFByb3ZpZGVyKSBzZWxlY3Rpb24pLmdldFByb2plY3QoKTsKLQkJfSBpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBHcm91cEZpbHRlcnNJdGVtUHJvdmlkZXIpewotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYkFwcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApICgoR3JvdXBGaWx0ZXJzSXRlbVByb3ZpZGVyKSBzZWxlY3Rpb24pLmdldEphdmFFRU9iamVjdCgpOwotCQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh3ZWJBcHApOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0RXh0ZW5kZWRTZWxlY3RlZFByb2plY3Qoc2VsZWN0aW9uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2xhc3NCdXR0b25TZWxlY3RlZCgpIHsKLSAgICAgICAgZ2V0Q29udHJvbCgpLnNldEN1cnNvcihuZXcgQ3Vyc29yKGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBTV1QuQ1VSU09SX1dBSVQpKTsKLSAgICAgICAgSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgbW9kZWwuZ2V0UHJvcGVydHkoUFJPSkVDVCk7Ci0gICAgICAgIElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotICAgICAgICBNdWx0aVNlbGVjdEZpbHRlcmVkRmlsdGVyRmlsZVNlbGVjdGlvbkRpYWxvZyBtcyA9IG5ldyBNdWx0aVNlbGVjdEZpbHRlcmVkRmlsdGVyRmlsZVNlbGVjdGlvbkRpYWxvZygKLSAgICAgICAgICAgICAgICBnZXRTaGVsbCgpLAotICAgICAgICAgICAgICAgIE5FV19GSUxURVJfV0laQVJEX1dJTkRPV19USVRMRSwKLSAgICAgICAgICAgICAgICBDSE9PU0VfRklMVEVSX0NMQVNTLCAKLSAgICAgICAgICAgICAgICBGSUxURVJFWFRFTlNJT05TLCAKLSAgICAgICAgICAgICAgICBmYWxzZSwgCi0gICAgICAgICAgICAgICAgcHJvamVjdCk7Ci0gICAgICAgIElDb250YWluZXIgcm9vdCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwotICAgICAgICBtcy5zZXRJbnB1dChyb290KTsKLSAgICAgICAgbXMub3BlbigpOwotICAgICAgICBpZiAobXMuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotICAgICAgICAgICAgU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBJVHlwZSB0eXBlID0gKElUeXBlKSBtcy5nZXRGaXJzdFJlc3VsdCgpOwotICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHF1YWxpZmllZENsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleGlzdGluZ0NsYXNzVGV4dC5zZXRUZXh0KHF1YWxpZmllZENsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0Q29udHJvbCgpLnNldEN1cnNvcihudWxsKTsKLSAgICB9Ci0JCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0xpc3RlbmVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdMaXN0ZW5lckNsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ0ZDI2NS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0xpc3RlbmVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIE5ld0xpc3RlbmVyQ2xhc3NPcHRpb25zV2l6YXJkUGFnZSBleHRlbmRzIE5ld1dlYkNsYXNzT3B0aW9uc1dpemFyZFBhZ2UgIHsKLQkKLQlwdWJsaWMgTmV3TGlzdGVuZXJDbGFzc09wdGlvbnNXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHBhZ2VEZXNjLCBTdHJpbmcgcGFnZVRpdGxlKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgcGFnZURlc2MsIHBhZ2VUaXRsZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdMaXN0ZW5lckNsYXNzV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdMaXN0ZW5lckNsYXNzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmZjMzNhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3TGlzdGVuZXJDbGFzc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggU0FQIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1dlYkNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5VU0VfRVhJU1RJTkdfQ0xBU1M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlVTRV9FWElTVElOR19MSVNURU5FUl9DTEFTUzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53YXIudWkudXRpbC5XZWJMaXN0ZW5lckdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuV2ViQXBwUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIE5ld0xpc3RlbmVyQ2xhc3NXaXphcmRQYWdlIGV4dGVuZHMgTmV3V2ViQ2xhc3NXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBOZXdMaXN0ZW5lckNsYXNzV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyBwYWdlRGVzYywgU3RyaW5nIHBhZ2VUaXRsZSwgU3RyaW5nIG1vZHVsZVR5cGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBwYWdlRGVzYywgcGFnZVRpdGxlLCBtb2R1bGVUeXBlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVc2VFeGlzdGluZ0NoZWNrYm94VGV4dCgpIHsKLQkJcmV0dXJuIFVTRV9FWElTVElOR19MSVNURU5FUl9DTEFTUzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVc2VFeGlzdGluZ1Byb3BlcnR5KCkgewotCQlyZXR1cm4gVVNFX0VYSVNUSU5HX0NMQVNTOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLmNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKHBhcmVudCk7Ci0JCQotCQlleGlzdGluZ0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRFeHRlbmRlZFNlbGVjdGVkUHJvamVjdChPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBXZWJMaXN0ZW5lckdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlXZWJBcHAgd2ViQXBwID0gKFdlYkFwcCkoKFdlYkxpc3RlbmVyR3JvdXBJdGVtUHJvdmlkZXIpIHNlbGVjdGlvbikuZ2V0UGFyZW50KCk7Ci0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHdlYkFwcCk7Ci0JCX1lbHNlIGlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFdlYkFwcFByb3ZpZGVyKXsKLQkJCXJldHVybiAoKFdlYkFwcFByb3ZpZGVyKSBzZWxlY3Rpb24pLmdldFByb2plY3QoKTsKLQkJfSBlbHNlIGlmKHNlbGVjdGlvbiBpbnN0YW5jZW9mIEdyb3VwTGlzdGVuZXJJdGVtUHJvdmlkZXIpewotCQkJb3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwIHdlYkFwcCA9IChvcmcuZWNsaXBzZS5qc3QuamF2YWVlLndlYi5XZWJBcHApICgoR3JvdXBMaXN0ZW5lckl0ZW1Qcm92aWRlcikgc2VsZWN0aW9uKS5nZXRKYXZhRUVPYmplY3QoKTsKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qod2ViQXBwKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldEV4dGVuZGVkU2VsZWN0ZWRQcm9qZWN0KHNlbGVjdGlvbik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNsYXNzQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdTZXJ2bGV0Q2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdTZXJ2bGV0Q2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzcyMjMzLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3U2VydmxldENsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERhdmlkIFNjaG5laWRlciwgZGF2aWQuc2NobmVpZGVyQHVuaXN5cy5jb20gLSBidWcgMTQyNTAwCi0gKiAgICAgS2lyaWwgTWl0b3YsIGsubWl0b3ZAc2FwLmNvbQktIGJ1ZyAyMDQxNjAKLSAqICAgICBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5JU2VydmxldENvbnN0YW50cy5RVUFMSUZJRURfU0VSVkxFVDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLlNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIE5ld1NlcnZsZXRDbGFzc09wdGlvbnNXaXphcmRQYWdlIGV4dGVuZHMKLQkJTmV3V2ViQ2xhc3NPcHRpb25zV2l6YXJkUGFnZSBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQotCXByb3RlY3RlZCBCdXR0b24gaW5pdEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRlc3Ryb3lCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBnZXRDb25maWdCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBnZXRJbmZvQnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gc2VydmljZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRvR2V0QnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZG9Qb3N0QnV0dG9uOwotCXByb3RlY3RlZCBCdXR0b24gZG9QdXRCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkb0RlbGV0ZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRvSGVhZEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRvT3B0aW9uc0J1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGRvVHJhY2VCdXR0b247Ci0JCi0JcHVibGljIE5ld1NlcnZsZXRDbGFzc09wdGlvbnNXaXphcmRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgU3RyaW5nIHBhZ2VEZXNjLCBTdHJpbmcgcGFnZVRpdGxlKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgcGFnZURlc2MsIHBhZ2VUaXRsZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVudGVyKCkgewotCQlzdXBlci5lbnRlcigpOwotCQkKLQkJYm9vbGVhbiBodHRwU2VydmxldCA9IFNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzSHR0cFNlcnZsZXRTdXBlcmNsYXNzKG1vZGVsKTsKLQkJZG9HZXRCdXR0b24uc2V0VmlzaWJsZShodHRwU2VydmxldCk7Ci0JCWRvUG9zdEJ1dHRvbi5zZXRWaXNpYmxlKGh0dHBTZXJ2bGV0KTsKLQkJZG9QdXRCdXR0b24uc2V0VmlzaWJsZShodHRwU2VydmxldCk7Ci0JCWRvRGVsZXRlQnV0dG9uLnNldFZpc2libGUoaHR0cFNlcnZsZXQpOwotCQlkb0hlYWRCdXR0b24uc2V0VmlzaWJsZShodHRwU2VydmxldCk7Ci0JCWRvT3B0aW9uc0J1dHRvbi5zZXRWaXNpYmxlKGh0dHBTZXJ2bGV0KTsKLQkJZG9UcmFjZUJ1dHRvbi5zZXRWaXNpYmxlKGh0dHBTZXJ2bGV0KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBjb21wb3NpdGUgd2l0aCBhbGwgdGhlIHN0dWJzCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU3R1YnNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVTdHVic0NvbXBvc2l0ZShwYXJlbnQpOwotCQkKLQkJaW5oZXJpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYm9vbGVhbiBlbmFibGUgPSBpbmhlcml0QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJCWVuYWJsZUdlbmVyaWNTZXJ2bGV0QnV0dG9ucyhlbmFibGUpOwotCQkJCWVuYWJsZUh0dHBTZXJ2bGV0QnV0dG9ucyhlbmFibGUpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vRG8gbm90aGluZwotCQkJfQotCQkJCi0JCQlwcml2YXRlIHZvaWQgZW5hYmxlR2VuZXJpY1NlcnZsZXRCdXR0b25zKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCQkJaWYgKFNlcnZsZXRTdXBlcnR5cGVzVmFsaWRhdG9yLmlzR2VuZXJpY1NlcnZsZXRTdXBlcmNsYXNzKG1vZGVsKSkgewotCQkJCQlpbml0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQkJZGVzdHJveUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJCWdldENvbmZpZ0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJCWdldEluZm9CdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCQlzZXJ2aWNlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXByaXZhdGUgdm9pZCBlbmFibGVIdHRwU2VydmxldEJ1dHRvbnMoYm9vbGVhbiBlbmFibGUpIHsKLQkJCQlkb0dldEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJZG9Qb3N0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQlkb1B1dEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJZG9EZWxldGVCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCWRvSGVhZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJZG9PcHRpb25zQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQlkb1RyYWNlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUobWV0aG9kU3R1YnMsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQljb21wLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWluaXRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWluaXRCdXR0b24uc2V0VGV4dCgiJmluaXQiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGluaXRCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSVQsIG51bGwpOwotCi0JCWRlc3Ryb3lCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWRlc3Ryb3lCdXR0b24uc2V0VGV4dCgiZGVzdHJvJnkiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGRlc3Ryb3lCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRFU1RST1ksIG51bGwpOwotCi0JCWdldENvbmZpZ0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJZ2V0Q29uZmlnQnV0dG9uLnNldFRleHQoImdldFNlcnZsZXQmQ29uZmlnIik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChnZXRDb25maWdCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFVF9TRVJWTEVUX0NPTkZJRywgbnVsbCk7Ci0KLQkJZ2V0SW5mb0J1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJZ2V0SW5mb0J1dHRvbi5zZXRUZXh0KCJnZXRTZXJ2bGV0SSZuZm8iKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGdldEluZm9CdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFVF9TRVJWTEVUX0lORk8sIG51bGwpOwotCQkKLQkJc2VydmljZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJc2VydmljZUJ1dHRvbi5zZXRUZXh0KCImc2VydmljZSIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goc2VydmljZUJ1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU0VSVklDRSwgbnVsbCk7Ci0JCQotCQlkb0dldEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJZG9HZXRCdXR0b24uc2V0VGV4dCgiZG8mR2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChkb0dldEJ1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fR0VULCBudWxsKTsKLQotCQlkb1Bvc3RCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXAsIFNXVC5DSEVDSyk7Ci0JCWRvUG9zdEJ1dHRvbi5zZXRUZXh0KCJkbyZQb3N0Iik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChkb1Bvc3RCdXR0b24sIElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRPX1BPU1QsIG51bGwpOwotCi0JCWRvUHV0QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkb1B1dEJ1dHRvbi5zZXRUZXh0KCJkb1AmdXQiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGRvUHV0QnV0dG9uLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19QVVQsIG51bGwpOwotCi0JCWRvRGVsZXRlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkb0RlbGV0ZUJ1dHRvbi5zZXRUZXh0KCJkbyZEZWxldGUiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGRvRGVsZXRlQnV0dG9uLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19ERUxFVEUsIG51bGwpOwotCi0JCWRvSGVhZEJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcCwgU1dULkNIRUNLKTsKLQkJZG9IZWFkQnV0dG9uLnNldFRleHQoImRvJkhlYWQiKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGRvSGVhZEJ1dHRvbiwgSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuRE9fSEVBRCwgbnVsbCk7Ci0KLQkJZG9PcHRpb25zQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkb09wdGlvbnNCdXR0b24uc2V0VGV4dCgiZG8mT3B0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goZG9PcHRpb25zQnV0dG9uLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19PUFRJT05TLCBudWxsKTsKLQotCQlkb1RyYWNlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wLCBTV1QuQ0hFQ0spOwotCQlkb1RyYWNlQnV0dG9uLnNldFRleHQoImRvJlRyYWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChkb1RyYWNlQnV0dG9uLCBJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ET19UUkFDRSwgbnVsbCk7Ci0JCQotCQlpbnRlcmZhY2VWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkKLQkgICAgRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGNhblJlbW92ZVNlbGVjdGVkSW50ZXJmYWNlcyhzZWxlY3Rpb24pKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEtleUxpc3RlbmVyIGdldEludGVyZmFjZUtleUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEtleUxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChlLmtleUNvZGUgPT0gU1dULkRFTCkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGludGVyZmFjZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGNhblJlbW92ZVNlbGVjdGVkSW50ZXJmYWNlcyhzZWxlY3Rpb24pKSB7Ci0JCQkJCQloYW5kbGVJbnRlcmZhY2VSZW1vdmVCdXR0b25TZWxlY3RlZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCX07Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjYW5SZW1vdmVTZWxlY3RlZEludGVyZmFjZXMoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGlmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHksIHRoZW4gcmVtb3ZlIGlzIG5vdCBwb3NzaWJsZQotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkvLyBpZiB0aGUgc2VsZWN0aW9uIGlzIG5vbi1lbXB0eSBhbmQgdGhlIHNlcnZsZXQgZXh0ZW5kcyBHZW5lcmljU2VydmxldCwgdGhlbgotCQkvLyByZW1vdmUgaXMgcG9zc2libGUgCi0JCWlmIChTZXJ2bGV0U3VwZXJ0eXBlc1ZhbGlkYXRvci5pc0dlbmVyaWNTZXJ2bGV0U3VwZXJjbGFzcyhtb2RlbCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IAotCQkKLQkJLy8gaWYgdGhlIHNlbGVjdGlvbiBpcyBub24tZW1wdHkgYW5kIHRoZSBzZXJ2bGV0IGRvZXMgbm90IGV4dGVuZCBHZW5lcmljU2VydmxldCwgCi0JCS8vIHRoZW4gcmVtb3ZlIGlzIG5vdCBwb3NzaWJsZSBvbmx5IGlmIHRoZSBTZXJ2bGV0IGludGVyZmFjZSBpcyBpbiB0aGUgc2VsZWN0aW9uCi0JCUl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoUVVBTElGSUVEX1NFUlZMRVQuZXF1YWxzKGl0ZXIubmV4dCgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIGluIGFsbCBvdGhlciBjYXNlcyByZW1vdmUgaXMgcG9zc2libGUKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdTZXJ2bGV0Q2xhc3NXaXphcmRQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZsZXRDbGFzc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViN2Y2Ny4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1NlcnZsZXRDbGFzc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSVNfU0VSVkxFVF9UWVBFOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5JTmV3V2ViQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlVTRV9FWElTVElOR19DTEFTUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQ0hPT1NFX1NFUlZMRVRfQ0xBU1M7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLk5FV19TRVJWTEVUX1dJWkFSRF9XSU5ET1dfVElUTEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZC5JV2ViV2l6YXJkQ29uc3RhbnRzLlVTRV9FWElTVElOR19TRVJWTEVUX0NMQVNTOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2FyLnVpLnV0aWwuV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnVpLmludGVybmFsLm5hdmlnYXRvci53ZWIuR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qZWUudWkuaW50ZXJuYWwubmF2aWdhdG9yLndlYi5XZWJBcHBQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBOZXdTZXJ2bGV0Q2xhc3NXaXphcmRQYWdlIGV4dGVuZHMgTmV3V2ViQ2xhc3NXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIEpTUEVYVEVOU0lPTlMgPSB7ICJqc3AiIH07IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgTmV3U2VydmxldENsYXNzV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyBwYWdlRGVzYywgU3RyaW5nIHBhZ2VUaXRsZSwgU3RyaW5nIG1vZHVsZVR5cGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBwYWdlRGVzYywgcGFnZVRpdGxlLCBtb2R1bGVUeXBlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVc2VFeGlzdGluZ0NoZWNrYm94VGV4dCgpIHsKLQkJcmV0dXJuIFVTRV9FWElTVElOR19TRVJWTEVUX0NMQVNTOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVzZUV4aXN0aW5nUHJvcGVydHkoKSB7Ci0JCXJldHVybiBVU0VfRVhJU1RJTkdfQ0xBU1M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldEV4dGVuZGVkU2VsZWN0ZWRQcm9qZWN0KE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFdlYlNlcnZsZXRHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJV2ViQXBwIHdlYkFwcCA9IChXZWJBcHApICgoV2ViU2VydmxldEdyb3VwSXRlbVByb3ZpZGVyKSBzZWxlY3Rpb24pLmdldFBhcmVudCgpOwotCQkJcmV0dXJuIFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdCh3ZWJBcHApOwotCQl9IGVsc2UgaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgV2ViQXBwUHJvdmlkZXIpewotCQkJcmV0dXJuICgoV2ViQXBwUHJvdmlkZXIpIHNlbGVjdGlvbikuZ2V0UHJvamVjdCgpOwotCQl9IGVsc2UgaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgR3JvdXBTZXJ2bGV0SXRlbVByb3ZpZGVyKXsKLQkJCW9yZy5lY2xpcHNlLmpzdC5qYXZhZWUud2ViLldlYkFwcCB3ZWJBcHAgPSAob3JnLmVjbGlwc2UuanN0LmphdmFlZS53ZWIuV2ViQXBwKSAoKEdyb3VwU2VydmxldEl0ZW1Qcm92aWRlcikgc2VsZWN0aW9uKS5nZXRKYXZhRUVPYmplY3QoKTsKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3Qod2ViQXBwKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldEV4dGVuZGVkU2VsZWN0ZWRQcm9qZWN0KHNlbGVjdGlvbik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNsYXNzQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCWdldENvbnRyb2woKS5zZXRDdXJzb3IobmV3IEN1cnNvcihnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKSk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIG1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1QpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cgbXMgPSBuZXcgTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2coCi0JCQkJZ2V0U2hlbGwoKSwKLQkJCQlORVdfU0VSVkxFVF9XSVpBUkRfV0lORE9XX1RJVExFLAotCQkJCUNIT09TRV9TRVJWTEVUX0NMQVNTLCAKLQkJCQlKU1BFWFRFTlNJT05TLCAKLQkJCQlmYWxzZSwgCi0JCQkJcHJvamVjdCk7Ci0JCUlDb250YWluZXIgcm9vdCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwotCQltcy5zZXRJbnB1dChyb290KTsKLQkJbXMub3BlbigpOwotCQlpZiAobXMuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJU3RyaW5nIHF1YWxpZmllZENsYXNzTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobXMuZ2V0U2VsZWN0ZWRJdGVtKCkgPT0gTXVsdGlTZWxlY3RGaWx0ZXJlZEZpbGVTZWxlY3Rpb25EaWFsb2cuSlNQKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IG1zLmdldEZpcnN0UmVzdWx0KCk7Ci0JCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgb2JqOwotCQkJCQkJSVBhdGggcEZ1bGwgPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCQlJUGF0aCBwQmFzZSA9IHJvb3QuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCUlQYXRoIHBhdGggPSBwRnVsbC5yZW1vdmVGaXJzdFNlZ21lbnRzKHBCYXNlLnNlZ21lbnRDb3VudCgpKTsKLQkJCQkJCXF1YWxpZmllZENsYXNzTmFtZSA9IHBhdGgubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKTsKLQkJCQkJCW1vZGVsLnNldFByb3BlcnR5KElTX1NFUlZMRVRfVFlQRSwgbmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gCi0JCQllbHNlIHsKLQkJCQlJVHlwZSB0eXBlID0gKElUeXBlKSBtcy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQkJcXVhbGlmaWVkQ2xhc3NOYW1lID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCQkJbW9kZWwuc2V0UHJvcGVydHkoSVNfU0VSVkxFVF9UWVBFLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJfQotCQkJfQotCQkJZXhpc3RpbmdDbGFzc1RleHQuc2V0VGV4dChxdWFsaWZpZWRDbGFzc05hbWUpOwotCQl9Ci0JCWdldENvbnRyb2woKS5zZXRDdXJzb3IobnVsbCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJBcnRpZmFjdFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJBcnRpZmFjdFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzE4NDY0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3V2ViQXJ0aWZhY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLk9QRU5fSU5fRURJVE9SOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5RVUFMSUZJRURfQ0xBU1NfTkFNRTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRUVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLlNlcnZsZXRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXdXZWJBcnRpZmFjdFdpemFyZCBleHRlbmRzIE5ld1dlYldpemFyZCB7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9PTkUgPSAicGFnZU9uZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX1RXTyA9ICJwYWdlVHdvIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfVEhSRUUgPSAicGFnZVRocmVlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE5ld1dlYkFydGlmYWN0V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShnZXRUaXRsZSgpKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZ2V0SW1hZ2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcnVuRm9ya2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIGdldERhdGFNb2RlbCgpLmlzVmFsaWQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRUaXRsZSgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2UoKTsKLQkKLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRnJvbUoyRUVQbHVnaW4oU3RyaW5nIGtleSkgewotCQlVUkwgdXJsID0gKFVSTCkgSjJFRVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2Uoa2V5KTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkphdmFDbGFzcygpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBnZXREYXRhTW9kZWwoKS5nZXRTdHJpbmdQcm9wZXJ0eShRVUFMSUZJRURfQ0xBU1NfTkFNRSk7Ci0JCQlJUHJvamVjdCBwID0gKElQcm9qZWN0KSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShQUk9KRUNUKTsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEoyRUVFZGl0b3JVdGlsaXR5LmdldEphdmFQcm9qZWN0KHApOwotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgamF2YVByb2plY3QuZmluZFR5cGUoY2xhc3NOYW1lKS5nZXRSZXNvdXJjZSgpOwotCQkJb3BlbkVkaXRvcihmaWxlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGNhbnRPcGVuKSB7Ci0JCQlTZXJ2bGV0VUlQbHVnaW4ubG9nKGNhbnRPcGVuKTsKLQkJfQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgb3BlbldlYkZpbGUoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoQ0xBU1NfTkFNRSk7Ci0JCQlJUHJvamVjdCBwID0gKElQcm9qZWN0KSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShQUk9KRUNUKTsKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHApOwotCQkJSUNvbnRhaW5lciB3ZWJDb250ZW50ID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7Ci0JCQlJRmlsZSBmaWxlID0gd2ViQ29udGVudC5nZXRGaWxlKG5ldyBQYXRoKGNsYXNzTmFtZSkpOwotCQkJb3BlbkVkaXRvcihmaWxlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGNhbnRPcGVuKSB7Ci0JCQlTZXJ2bGV0VUlQbHVnaW4ubG9nKGNhbnRPcGVuKTsKLQkJfQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuRWRpdG9yKGZpbmFsIElGaWxlIGZpbGUpIHsKLQkJaWYgKGdldERhdGFNb2RlbCgpLmdldEJvb2xlYW5Qcm9wZXJ0eShPUEVOX0lOX0VESVRPUikpIHsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJU2VydmxldFVJUGx1Z2luLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1dlYkNsYXNzT3B0aW9uc1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3V2ViQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTU1Y2NhLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3V2ViQ2xhc3NPcHRpb25zV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBTQVAgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogS2Fsb3lhbiBSYWV2LCBrYWxveWFuLnJhZXZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5BQlNUUkFDVF9NRVRIT0RTOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5DT05TVFJVQ1RPUjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSU5URVJGQUNFUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuSkFWQV9DTEFTU19DT05TVFJVQ1RPUl9DSEVDS0JPWF9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuSkFWQV9DTEFTU19JTkhFUklUX0NIRUNLQk9YX0xBQkVMOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQuSVdlYldpemFyZENvbnN0YW50cy5KQVZBX0NMQVNTX01FVEhPRF9TVFVCU19MQUJFTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5OZXdKYXZhQ2xhc3NPcHRpb25zV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgTmV3V2ViQ2xhc3NPcHRpb25zV2l6YXJkUGFnZSBleHRlbmRzIE5ld0phdmFDbGFzc09wdGlvbnNXaXphcmRQYWdlICB7Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBtZXRob2RTdHViczsKLQkKLQlwdWJsaWMgTmV3V2ViQ2xhc3NPcHRpb25zV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyBwYWdlRGVzYywgU3RyaW5nIHBhZ2VUaXRsZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUsIHBhZ2VEZXNjLCBwYWdlVGl0bGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBJTlRFUkZBQ0VTIH07Ci0JfQotCQotCUBPdmVycmlkZQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTdHVic0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIHN0dWJMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJc3R1YkxhYmVsLnNldFRleHQoSkFWQV9DTEFTU19NRVRIT0RfU1RVQlNfTEFCRUwpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzdHViTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQltZXRob2RTdHVicyA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCW1ldGhvZFN0dWJzLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTU7Ci0JCW1ldGhvZFN0dWJzLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY29uc3RydWN0b3JCdXR0b24gPSBuZXcgQnV0dG9uKG1ldGhvZFN0dWJzLCBTV1QuQ0hFQ0spOwotCQljb25zdHJ1Y3RvckJ1dHRvbi5zZXRUZXh0KEpBVkFfQ0xBU1NfQ09OU1RSVUNUT1JfQ0hFQ0tCT1hfTEFCRUwpOwotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGNvbnN0cnVjdG9yQnV0dG9uLCBDT05TVFJVQ1RPUiwgbnVsbCk7Ci0JCQotCQlpbmhlcml0QnV0dG9uID0gbmV3IEJ1dHRvbihtZXRob2RTdHVicywgU1dULkNIRUNLKTsKLQkJaW5oZXJpdEJ1dHRvbi5zZXRUZXh0KEpBVkFfQ0xBU1NfSU5IRVJJVF9DSEVDS0JPWF9MQUJFTCk7Ci0JCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goaW5oZXJpdEJ1dHRvbiwgQUJTVFJBQ1RfTUVUSE9EUywgbnVsbCk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJDbGFzc1dpemFyZFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3V2ViQ2xhc3NXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhN2VmOTQuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9OZXdXZWJDbGFzc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IFNBUCBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBLYWxveWFuIFJhZXYsIGthbG95YW4ucmFldkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFubm90YXRpb25zRGF0YU1vZGVsLlVTRV9BTk5PVEFUSU9OUzsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ0xBU1NfTkFNRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQlJPV1NFX0JVVFRPTl9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkLklXZWJXaXphcmRDb25zdGFudHMuQ0xBU1NfTkFNRV9MQUJFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkdFTkVSQVRFX0REOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuQW5ub3RhdGlvbnNTdGFuZGFsb25lR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLk5ld0phdmFDbGFzc1dpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuV2ViRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuQ29tcHJlc3NlZEphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5TZXJ2bGV0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLldFQlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXdXZWJDbGFzc1dpemFyZFBhZ2UgZXh0ZW5kcyBOZXdKYXZhQ2xhc3NXaXphcmRQYWdlIHsKLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cCBhbm5vdGF0aW9uc0dyb3VwOwotCQotCXByb3RlY3RlZCBCdXR0b24gZXhpc3RpbmdDbGFzc0J1dHRvbjsKLQlwcm90ZWN0ZWQgTGFiZWwgZXhpc3RpbmdDbGFzc0xhYmVsOwotCXByb3RlY3RlZCBUZXh0IGV4aXN0aW5nQ2xhc3NUZXh0OwotCXByb3RlY3RlZCBCdXR0b24gZXhpc3RpbmdCdXR0b247Ci0JCi0JcHVibGljIE5ld1dlYkNsYXNzV2l6YXJkUGFnZShJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyBwYWdlRGVzYywgU3RyaW5nIHBhZ2VUaXRsZSwgU3RyaW5nIG1vZHVsZVR5cGUpIHsKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBwYWdlRGVzYywgcGFnZVRpdGxlLCBtb2R1bGVUeXBlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQkKLQkJcHJvamVjdE5hbWVMYWJlbC5zZXRUZXh0KFdFQlVJTWVzc2FnZXMuV0VCX1BST0pFQ1RfTEJMKTsKLQkJCi0JCWFkZFNlcGVyYXRvcihjb21wb3NpdGUsIDMpOwotCQljcmVhdGVVc2VFeGlzdGluZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUFubm90YXRpb25zR3JvdXAoY29tcG9zaXRlKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRFeHRlbmRlZFNlbGVjdGVkUHJvamVjdChPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBDb21wcmVzc2VkSmF2YVByb2plY3QpIHsKLQkJCXJldHVybiAoKENvbXByZXNzZWRKYXZhUHJvamVjdCkgc2VsZWN0aW9uKS5nZXRQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0RXh0ZW5kZWRTZWxlY3RlZFByb2plY3Qoc2VsZWN0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRVc2VFeGlzdGluZ0NoZWNrYm94VGV4dCgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VXNlRXhpc3RpbmdQcm9wZXJ0eSgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZUNsYXNzQnV0dG9uU2VsZWN0ZWQoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYW5ub3RhdGlvbnMgZ3JvdXAgYW5kIHNldCBkZWZhdWx0IGVuYWJsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbnNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChpc1dlYkRvY2xldFByb2plY3QoKSkgewotCQkJYW5ub3RhdGlvbnNHcm91cCA9IG5ldyBBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cChwYXJlbnQsIG1vZGVsLCBKMkVFUHJvamVjdFV0aWxpdGllcy5FSkIuZXF1YWxzKHByb2plY3RUeXBlKSwKLQkJCQkJSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUIuZXF1YWxzKHByb2plY3RUeXBlKSk7Ci0JCQlpZiAoIW1vZGVsLmlzUHJvcGVydHlTZXQoUFJPSkVDVF9OQU1FKSkKLQkJCQlyZXR1cm47Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFBST0pFQ1RfTkFNRSkpOwotCQkJYW5ub3RhdGlvbnNHcm91cC5zZXRFbmFibGVtZW50KHByb2plY3QpOwotCQkJLy8gYW5ub3RhdGlvbnNHcm91cC5zZXRVc2VBbm5vdGF0aW9ucyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCS8vIG5vdCBhIFdlYiBEb2NsZXQgcHJvamVjdCAtIG1ha2Ugc3VyZSB0aGF0IHRoZSBVU0VfQU5OT1RBVElPTlMgcHJvcGVydHkgaXMgb2ZmCi0JCQltb2RlbC5zZXRQcm9wZXJ0eShVU0VfQU5OT1RBVElPTlMsIGZhbHNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVVc2VFeGlzdGluZ0dyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJZXhpc3RpbmdCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZXhpc3RpbmdCdXR0b24uc2V0VGV4dChnZXRVc2VFeGlzdGluZ0NoZWNrYm94VGV4dCgpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZXhpc3RpbmdCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChleGlzdGluZ0J1dHRvbiwgZ2V0VXNlRXhpc3RpbmdQcm9wZXJ0eSgpLCBudWxsKTsKLQkJZXhpc3RpbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlRXhpc3RpbmdCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWV4aXN0aW5nQ2xhc3NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJZXhpc3RpbmdDbGFzc0xhYmVsLnNldFRleHQoQ0xBU1NfTkFNRV9MQUJFTCk7Ci0JCWV4aXN0aW5nQ2xhc3NMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQlleGlzdGluZ0NsYXNzTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJZXhpc3RpbmdDbGFzc1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWV4aXN0aW5nQ2xhc3NUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlleGlzdGluZ0NsYXNzVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGV4aXN0aW5nQ2xhc3NUZXh0LCBDTEFTU19OQU1FLCBudWxsKTsKLQotCQlleGlzdGluZ0NsYXNzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJZXhpc3RpbmdDbGFzc0J1dHRvbi5zZXRUZXh0KEJST1dTRV9CVVRUT05fTEFCRUwpOwotCQlleGlzdGluZ0NsYXNzQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlleGlzdGluZ0NsYXNzQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlleGlzdGluZ0NsYXNzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUNsYXNzQnV0dG9uU2VsZWN0ZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVFeGlzdGluZ0J1dHRvblNlbGVjdGVkKCkgewotCQlib29sZWFuIGVuYWJsZSA9IGV4aXN0aW5nQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlleGlzdGluZ0NsYXNzTGFiZWwuc2V0RW5hYmxlZChlbmFibGUpOwotCQlleGlzdGluZ0NsYXNzQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJcGFja2FnZVRleHQuc2V0RW5hYmxlZCghZW5hYmxlKTsKLQkJcGFja2FnZUJ1dHRvbi5zZXRFbmFibGVkKCFlbmFibGUpOwotCQlwYWNrYWdlTGFiZWwuc2V0RW5hYmxlZCghZW5hYmxlKTsKLQkJY2xhc3NUZXh0LnNldEVuYWJsZWQoIWVuYWJsZSk7Ci0JCWNsYXNzTGFiZWwuc2V0RW5hYmxlZCghZW5hYmxlKTsKLQkJc3VwZXJUZXh0LnNldEVuYWJsZWQoIWVuYWJsZSk7Ci0JCXN1cGVyQnV0dG9uLnNldEVuYWJsZWQoIWVuYWJsZSk7Ci0JCXN1cGVyTGFiZWwuc2V0RW5hYmxlZCghZW5hYmxlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNXZWJEb2NsZXRQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQlpZihwcm9qZWN0TmFtZSAhPSBudWxsICYmICEiIi5lcXVhbHMocHJvamVjdE5hbWUudHJpbSgpKSl7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCXRyeSB7Ci0JCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotCQkJCXJldHVybiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQoV2ViRmFjZXRVdGlscy5XRUJfWERPQ0xFVF9GQUNFVCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlTZXJ2bGV0VUlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVByb2plY3RSZXF1aXJlbWVudHMoSVByb2plY3QgcHJvamVjdCkKLQl7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlpZihjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpICE9IG51bGwKLQkJCQkmJiBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFVuZGVybHlpbmdGb2xkZXIoKSAhPSBudWxsKXsKLQkJCUlGaWxlIGRkWG1sRmlsZSA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpLmdldEZpbGUobmV3IFBhdGgoSjJFRUNvbnN0YW50cy5XRUJBUFBfRERfVVJJKSk7Ci0JCQlpZiAoIWRkWG1sRmlsZS5leGlzdHMoKSkKLQkJCXsKLQkJCQkvLyBhZGQgYSBmbGFnIGludG8gdGhlIG1vZGVsIHRvIGNyZWF0ZSB0aGUgREQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb3BlcmF0aW9uCi0JCQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEdFTkVSQVRFX0RELCBCb29sZWFuLlRSVUUpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8vIGRvbid0IGNyZWF0ZSBhIERELCBzaW5jZSBvbmUgYWxyZWFkeSBleGlzdHMuCi0JCQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEdFTkVSQVRFX0RELCBCb29sZWFuLkZBTFNFKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3V2ViV2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld1dlYldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWY2ZmI5Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvTmV3V2ViV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIEthbG95YW4gUmFldiwga2Fsb3lhbi5yYWV2QHNhcC5jb20KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uU2VydmxldFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZDsKLQotLyoqCi0gKiBAYXV0aG9yIGpsYW51dGkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5ld1dlYldpemFyZCBleHRlbmRzIERhdGFNb2RlbFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICovCi0JcHVibGljIE5ld1dlYldpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIE5ld1dlYldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZ2V0RGF0YU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldEN1cnJlbnRTZWxlY3Rpb24oKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gU2VydmxldFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9TZXJ2bGV0RGF0YU1vZGVsU3luY0hlbHBlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9TZXJ2bGV0RGF0YU1vZGVsU3luY0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2EwNzdjLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvU2VydmxldERhdGFNb2RlbFN5bmNIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFN5bmNoSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgU2VydmxldERhdGFNb2RlbFN5bmNIZWxwZXIgZXh0ZW5kcyBEYXRhTW9kZWxTeW5jaEhlbHBlciB7Ci0JcHJvdGVjdGVkIE1hcCB3aWRnZXRUb1ZhbHVlSGFzaDsKLQlwcm90ZWN0ZWQgTXVsdGlwbGVDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyIG11bHRpcGxlQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCXB1YmxpYyBTZXJ2bGV0RGF0YU1vZGVsU3luY0hlbHBlcihJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgVUkgdG8gaGF2ZSB0aGUgcHJvcGVydHkgdmFsdWUgZGVmaW5lZCBpbiB0aGUgbW9kZWwKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogQGxpbmsgSURhdGFNb2RlbExpc3RlbmVyIGZvciB0aGUgZmxhZyB2YWx1ZXMuCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hVSVdpdGhNb2RlbChmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBpbnQgZmxhZykgewotCQlpZiAobnVsbCAhPSBwcm9wZXJ0eVRvV2lkZ2V0SGFzaCAmJiBwcm9wZXJ0eVRvV2lkZ2V0SGFzaC5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0IG9iaiA9IHByb3BlcnR5VG9XaWRnZXRIYXNoLmdldChwcm9wZXJ0eU5hbWUpOwotCQkJCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCQkJTGlzdCB3aWRnZXRzID0gKExpc3QpIG9iajsKLQkJCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3aWRnZXRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJCQljdXJyZW50V2lkZ2V0ID0gKFdpZGdldCkgd2lkZ2V0cy5nZXQoaSk7Ci0JCQkJCQkJCQlzeW5jaFVJV2l0aE1vZGVsKHByb3BlcnR5TmFtZSwgZmxhZywgY3VycmVudFdpZGdldCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljdXJyZW50V2lkZ2V0ID0gKFdpZGdldCkgb2JqOwotCQkJCQkJCQlzeW5jaFVJV2l0aE1vZGVsKHByb3BlcnR5TmFtZSwgZmxhZywgY3VycmVudFdpZGdldCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJY3VycmVudFdpZGdldCA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaFVJV2l0aE1vZGVsKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIGludCBmbGFnLCBXaWRnZXQgY3VycmVudFdpZGdldCkgewotCQlpZiAoY3VycmVudFdpZGdldCAhPSBudWxsICYmIGN1cnJlbnRXaWRnZXQgIT0gY3VycmVudFdpZGdldEZyb21FdmVudCkgewotCQkJLy9XZSBtdXN0IGhvbGQgYSBjb3B5IGluIGEgdGVtcCB2YXJpYWJsZSBiZWNhdXNlIHNldHRpbmcgdGhlIHdpZGdldCB2YWx1ZQotCQkJLy9tYXkgdHJpZ2dlciBhbiBldmVudCB0aGF0IHdpbGwgY2F1c2UgdGhpcyBtZXRob2QgdG8gYmUgY2FsbGVkIGFnYWluLgotCQkJV2lkZ2V0IHdpZGdldCA9IGN1cnJlbnRXaWRnZXQ7Ci0JCQl0cnkgewotCQkJCWlnbm9yZU1vZGlmeUV2ZW50ID0gdHJ1ZTsKLQkJCQlpZiAoY3VycmVudFdpZGdldCBpbnN0YW5jZW9mIFRleHQpCi0JCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKFRleHQpIGN1cnJlbnRXaWRnZXQpOwotCQkJCWVsc2UgaWYgKGN1cnJlbnRXaWRnZXQgaW5zdGFuY2VvZiBDb21ibykgewotCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChDb21ibykgY3VycmVudFdpZGdldCk7Ci0JCQkJfSBlbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgQnV0dG9uKQotCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChCdXR0b24pIGN1cnJlbnRXaWRnZXQpOwotCQkJCWVsc2UgaWYgKGN1cnJlbnRXaWRnZXQgaW5zdGFuY2VvZiBMYWJlbCkKLQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoTGFiZWwpIGN1cnJlbnRXaWRnZXQpOwotCQkJCWVsc2UgaWYgKGN1cnJlbnRXaWRnZXQgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlzZXRXaWRnZXRWYWx1ZShwcm9wZXJ0eU5hbWUsIGZsYWcsIChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0KSBjdXJyZW50V2lkZ2V0KTsKLQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgVGFibGUpCi0JCQkJCXNldFdpZGdldFZhbHVlKHByb3BlcnR5TmFtZSwgZmxhZywgKFRhYmxlKSBjdXJyZW50V2lkZ2V0KTsKLQkJCQllbHNlIGlmIChjdXJyZW50V2lkZ2V0IGluc3RhbmNlb2YgVHJlZSkKLQkJCQkJc2V0V2lkZ2V0VmFsdWUocHJvcGVydHlOYW1lLCBmbGFnLCAoVHJlZSkgY3VycmVudFdpZGdldCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlnbm9yZU1vZGlmeUV2ZW50ID0gZmFsc2U7Ci0JCQl9Ci0JCQkvL1Bhc3MgdGhlIGNvcHkgb2YgdGhlIGN1cnJlbnRXaWRnZXQKLQkJCXNldEVuYWJsZW1lbnQoKENvbnRyb2wpIHdpZGdldCwgZGF0YU1vZGVsLmlzUHJvcGVydHlFbmFibGVkKHByb3BlcnR5TmFtZSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFdpZGdldFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBmbGFnLCBCdXR0b24gYnV0dG9uKSB7Ci0JCWlmICgoYnV0dG9uLmdldFN0eWxlKCkgJiBTV1QuQ0hFQ0spID09IFNXVC5DSEVDSykgewotCQkJT2JqZWN0IHByb3BlcnR5VmFsdWUgPSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJCWlmIChwcm9wZXJ0eVZhbHVlIGluc3RhbmNlb2YgamF2YS51dGlsLkxpc3QpIHsKLQkJCQlMaXN0IHZhbHVlID0gKExpc3QpIHByb3BlcnR5VmFsdWU7Ci0JCQkJT2JqZWN0IGJ1dHRvblZhbHVlID0gd2lkZ2V0VG9WYWx1ZUhhc2guZ2V0KGJ1dHRvbik7Ci0JCQkJYm9vbGVhbiBleGlzdHMgPSB2YWx1ZS5jb250YWlucyhidXR0b25WYWx1ZSk7Ci0JCQkJaWYgKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAhPSBleGlzdHMpIHsKLQkJCQkJYnV0dG9uLnNldFNlbGVjdGlvbihleGlzdHMpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBNdWx0aXBsZUNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKGN1cnJlbnRXaWRnZXQgPT0gYnV0dG9uKQotCQkJCXJldHVybjsKLQkJCXRyeSB7Ci0JCQkJY3VycmVudFdpZGdldEZyb21FdmVudCA9IGJ1dHRvbjsKLQkJCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gKFN0cmluZykgd2lkZ2V0VG9Qcm9wZXJ0eUhhc2guZ2V0KGJ1dHRvbik7Ci0JCQkJT2JqZWN0IHByb3BlcnR5VmFsdWUgPSB3aWRnZXRUb1ZhbHVlSGFzaC5nZXQoYnV0dG9uKTsKLQkJCQkKLQkJCQlPYmplY3QgY29udGVudHMgPSBkYXRhTW9kZWwuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJCQkKLQkJCQlpZiAoY29udGVudHMgPT0gbnVsbCkgewotCQkJCQljb250ZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnRzIGluc3RhbmNlb2YgamF2YS51dGlsLkxpc3QpIHsKLQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIGNvbnRlbnRzOwotCQkJCQlpZiAoYnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCQlpZiAoIWxpc3QuY29udGFpbnMocHJvcGVydHlWYWx1ZSkpIAotCQkJCQkJCWxpc3QuYWRkKHByb3BlcnR5VmFsdWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbGlzdC5yZW1vdmUocHJvcGVydHlWYWx1ZSk7Ci0JCQkJCX0KLQkJCQkJc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBsaXN0KTsKLQkJCQkJZGF0YU1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5TmFtZSwgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWN1cnJlbnRXaWRnZXRGcm9tRXZlbnQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJCi0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaENoZWNrYm94KEJ1dHRvbiBjaGVja2JveCwgU3RyaW5nIHRleHRWYWx1ZSwgU3RyaW5nIHByb3BlcnR5TmFtZSwgQ29udHJvbFtdIGRlcGVuZGVudENvbnRyb2xzKSB7Ci0JCXNldENvbXBvc2l0ZVZhbHVlKGNoZWNrYm94LCB0ZXh0VmFsdWUpOwotCQlzeW5jaENvbXBvc2l0ZShjaGVja2JveCwgcHJvcGVydHlOYW1lLCBkZXBlbmRlbnRDb250cm9scyk7Ci0JCWlmIChtdWx0aXBsZUNoZWNrYm94U2VsZWN0aW9uTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJbXVsdGlwbGVDaGVja2JveFNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IE11bHRpcGxlQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl9Ci0JCWNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG11bHRpcGxlQ2hlY2tib3hTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldENvbXBvc2l0ZVZhbHVlKFdpZGdldCB3aWRnZXQsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAod2lkZ2V0VG9WYWx1ZUhhc2ggPT0gbnVsbCkKLQkJCXdpZGdldFRvVmFsdWVIYXNoID0gbmV3IEhhc2hNYXAoKTsKLQkJd2lkZ2V0VG9WYWx1ZUhhc2gucHV0KHdpZGdldCwgdmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaENvbXBvc2l0ZShXaWRnZXQgd2lkZ2V0LCBTdHJpbmcgcHJvcGVydHlOYW1lLCBDb250cm9sW10gZGVwQ29udHJvbHMpIHsKLQkJaWYgKG51bGwgPT0gd2lkZ2V0VG9Qcm9wZXJ0eUhhc2gpCi0JCQl3aWRnZXRUb1Byb3BlcnR5SGFzaCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChwcm9wZXJ0eVRvV2lkZ2V0SGFzaCA9PSBudWxsKQotCQkJcHJvcGVydHlUb1dpZGdldEhhc2ggPSBuZXcgSGFzaE1hcCgpOwotCQl3aWRnZXRUb1Byb3BlcnR5SGFzaC5wdXQod2lkZ2V0LCBwcm9wZXJ0eU5hbWUpOwotCQlPYmplY3QgdmFsdWUgPSBwcm9wZXJ0eVRvV2lkZ2V0SGFzaC5nZXQocHJvcGVydHlOYW1lKTsKLQkJTGlzdCB3aWRnZXRzOwotCQlpZiAodmFsdWUgPT0gbnVsbCB8fCAhKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkpIHsKLQkJCXdpZGdldHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQl3aWRnZXRzID0gKExpc3QpIHZhbHVlOwotCQl9Ci0JCXdpZGdldHMuYWRkKHdpZGdldCk7Ci0JCXByb3BlcnR5VG9XaWRnZXRIYXNoLnB1dChwcm9wZXJ0eU5hbWUsIHdpZGdldHMpOwotCQkKLQkJaWYgKGRlcENvbnRyb2xzICE9IG51bGwpIHsKLQkJCWlmICh3aWRnZXRUb0RlcENvbnRyb2xzID09IG51bGwpCi0JCQkJd2lkZ2V0VG9EZXBDb250cm9scyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl3aWRnZXRUb0RlcENvbnRyb2xzLnB1dCh3aWRnZXQsIGRlcENvbnRyb2xzKTsKLQkJfQotCQlzeW5jaFVJV2l0aE1vZGVsKHByb3BlcnR5TmFtZSwgRGF0YU1vZGVsRXZlbnQuVkFMVUVfQ0hHKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1NpbXBsZVR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9TaW1wbGVUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1Y2NhNC4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1NpbXBsZVR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLlNlcnZsZXRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgYSA8Y29kZT5JU2VsZWN0aW9uVmFsaWRhdG9yPC9jb2RlPiB0byB2YWxpZGF0ZSB0aGUgdHlwZQotICogb2YgYW4gZWxlbWVudC4gRW1wdHkgc2VsZWN0aW9ucyBhcmUgbm90IGFjY2VwdGVkLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yIGltcGxlbWVudHMgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciB7Ci0KLQlwcml2YXRlIElTdGF0dXMgZmdFcnJvclN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU2VydmxldFVJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJU3RhdHVzIGZnT0tTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFNlcnZsZXRVSVBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDbGFzc1tdIGZBY2NlcHRlZFR5cGVzOwotCXByaXZhdGUgYm9vbGVhbiBmQWxsb3dNdWx0aXBsZVNlbGVjdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBhY2NlcHRlZFR5cGVzCi0JICogICAgICAgICAgICBUaGUgdHlwZXMgYWNjZXB0ZWQgYnkgdGhlIHZhbGlkYXRvcgotCSAqIEBwYXJhbSBhbGxvd011bHRpcGxlU2VsZWN0aW9uCi0JICogICAgICAgICAgICBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSB2YWxpZGF0b3IgYWxsb3dzCi0JICogICAgICAgICAgICBtdWx0aXBsZSBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIFNpbXBsZVR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvcihDbGFzc1tdIGFjY2VwdGVkVHlwZXMsIGJvb2xlYW4gYWxsb3dNdWx0aXBsZVNlbGVjdGlvbikgewotCQlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0LmlzTm90TnVsbChhY2NlcHRlZFR5cGVzKTsKLQkJZkFjY2VwdGVkVHlwZXMgPSBhY2NlcHRlZFR5cGVzOwotCQlmQWxsb3dNdWx0aXBsZVNlbGVjdGlvbiA9IGFsbG93TXVsdGlwbGVTZWxlY3Rpb247Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSVNlbGVjdGlvblZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJaWYgKGlzVmFsaWQoZWxlbWVudHMpKSB7Ci0JCQlyZXR1cm4gZmdPS1N0YXR1czsKLQkJfQotCQlyZXR1cm4gZmdFcnJvclN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNPZkFjY2VwdGVkVHlwZShPYmplY3QgbykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZBY2NlcHRlZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZkFjY2VwdGVkVHlwZXNbaV0uaXNJbnN0YW5jZShvKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChPYmplY3RbXSBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFmQWxsb3dNdWx0aXBsZVNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubGVuZ3RoICE9IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgbyA9IHNlbGVjdGlvbltpXTsKLQkJCWlmICghaXNPZkFjY2VwdGVkVHlwZShvKSkgIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9TdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbkNhbGxiYWNrLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1N0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1ZjZjMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1N0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uQ2FsbGJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLlN0cmluZ0FycmF5VGFibGVXaXphcmRTZWN0aW9uLlN0cmluZ0FycmF5RGlhbG9nQ2FsbGJhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+U3RyaW5nQXJyYXlEaWFsb2dDYWxsYmFjazwvY29kZT4gaW50ZXJmYWNlIGZvciAKLSAqIGJvdGggIkluaXRpYWxpemF0aW9uIFBhcmFtZXRlcnMiIGFuZCAiVVJMIE1hcHBpbmdzIiB0YWJsZSB2aWV3cy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdBcnJheVRhYmxlV2l6YXJkU2VjdGlvbkNhbGxiYWNrIGltcGxlbWVudHMKLQkJU3RyaW5nQXJyYXlEaWFsb2dDYWxsYmFjayB7Ci0KLQkvKioKLQkgKiBUaGUgZmlyc3QgdGV4dCBmaWVsZCBzaG91bGQgbm90IGJlIGVtcHR5LiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShUZXh0W10gdGV4dHMpIHsKLQkJaWYgKHRleHRzLmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiB0ZXh0c1swXS5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMDsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogVHJpbXMgdGhlIHRleHQgdmFsdWVzLiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gcmV0cmlldmVSZXN1bHRTdHJpbmdzKFRleHRbXSB0ZXh0cykgewotCQlpbnQgbiA9IHRleHRzLmxlbmd0aDsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tuXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IHRleHRzW2ldLmdldFRleHQoKS50cmltKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvU3RyaW5nTWF0Y2hlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9TdHJpbmdNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDMwNGYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9TdHJpbmdNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIAotICogICAgIE5vdGU6IHRoaXMgY2xhc3Mgd2FzIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpzdC5pbnRlcm5hbC51aS51dGlsCi0gKiAgICAgSXQgaGFzIG11Y2ggcmVxdWVzdGVkIGFzIGFuIEFQSSBzaW5jZSB0aGVyZSBhcmUgYSBkb3plbiBzdWNoIGNvcGllcyB0aHJvdWdob3V0IAotICogICAgIEVjbGlwc2UgYW5kIHJlbGF0ZWQgcHJvamVjdHMuIChTdWNoIGFzLCBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyMjE0KQotICogICAgIFRoZXNlIHJlcXVlc3RzIGhhdmUgYmVlbiByZWplY3RlZCBzaW5jZSwgYWxsIHVzZXJzIHNob3VsZCBldmVudHVhbGx5IG1pZ3JhdGUgdG8gdXNlIGphdmF4LnJlZ3gKLSAqICAgICBjb3VudGVycGFydHMgaW5zdGVhZC4gIAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEEgc3RyaW5nIHBhdHRlcm4gbWF0Y2hlci4gU3VwcG9ydHMgJyonIGFuZCAnPycgd2lsZGNhcmRzLgotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nTWF0Y2hlciB7Ci0JcHJvdGVjdGVkIFN0cmluZyBmUGF0dGVybjsKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGg7IC8vIHBhdHRlcm4gbGVuZ3RoCi0JcHJvdGVjdGVkIGJvb2xlYW4gZklnbm9yZVdpbGRDYXJkczsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSWdub3JlQ2FzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGFzTGVhZGluZ1N0YXI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZkhhc1RyYWlsaW5nU3RhcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTZWdtZW50c1tdOyAvL3RoZSBnaXZlbiBwYXR0ZXJuIGlzIHNwbGl0IGludG8gKiBzZXBhcmF0ZWQgc2VnbWVudHMKLQotCS8qIGJvdW5kYXJ5IHZhbHVlIGJleW9uZCB3aGljaCB3ZSBkb24ndCBuZWVkIHRvIHNlYXJjaCBpbiB0aGUgdGV4dCAqLwotCXByb3RlY3RlZCBpbnQgZkJvdW5kPSAwOwotCQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIGZTaW5nbGVXaWxkQ2FyZD0gJ1x1MDAwMCc7Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQb3NpdGlvbiB7Ci0JCWludCBzdGFydDsgLy9pbmNsdXNpdmUKLQkJaW50IGVuZDsgLy9leGNsdXNpdmUKLQkJcHVibGljIFBvc2l0aW9uKGludCBzdGFydCwgaW50IGVuZCkgewotCQkJdGhpcy5zdGFydD0gc3RhcnQ7Ci0JCQl0aGlzLmVuZD0gZW5kOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCQlyZXR1cm4gc3RhcnQ7Ci0JCX0KLQkJcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCQlyZXR1cm4gZW5kOwotCQl9Ci0JfQotCS8qKgotCSAqIFN0cmluZ01hdGNoZXIgY29uc3RydWN0b3IgdGFrZXMgaW4gYSBTdHJpbmcgb2JqZWN0IHRoYXQgaXMgYSBzaW1wbGUgCi0JICogcGF0dGVybi4gVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gJyonIGZvciAwIGFuZCBtYW55IGNoYXJhY3RlcnMgYW5kCi0JICogJz8nIGZvciBleGFjdGx5IG9uZSBjaGFyYWN0ZXIuICAKLQkgKgotCSAqIExpdGVyYWwgJyonIGFuZCAnPycgY2hhcmFjdGVycyBtdXN0IGJlIGVzY2FwZWQgaW4gdGhlIHBhdHRlcm4gCi0JICogZS5nLiwgIlwqIiBtZWFucyBsaXRlcmFsICIqIiwgZXRjLgotCSAqCi0JICogRXNjYXBpbmcgYW55IG90aGVyIGNoYXJhY3RlciAoaW5jbHVkaW5nIHRoZSBlc2NhcGUgY2hhcmFjdGVyIGl0c2VsZiksIAotCSAqIGp1c3QgcmVzdWx0cyBpbiB0aGF0IGNoYXJhY3RlciBpbiB0aGUgcGF0dGVybi4KLQkgKiBlLmcuLCAiXGEiIG1lYW5zICJhIiBhbmQgIlxcIiBtZWFucyAiXCIKLQkgKgotCSAqIElmIGludm9raW5nIHRoZSBTdHJpbmdNYXRjaGVyIHdpdGggc3RyaW5nIGxpdGVyYWxzIGluIEphdmEsIGRvbid0IGZvcmdldAotCSAqIGVzY2FwZSBjaGFyYWN0ZXJzIGFyZSByZXByZXNlbnRlZCBieSAiXFwiLgotCSAqCi0JICogQHBhcmFtIHBhdHRlcm4gdGhlIHBhdHRlcm4gdG8gbWF0Y2ggdGV4dCBhZ2FpbnN0Ci0JICogQHBhcmFtIGlnbm9yZUNhc2UgaWYgdHJ1ZSwgY2FzZSBpcyBpZ25vcmVkCi0JICogQHBhcmFtIGlnbm9yZVdpbGRDYXJkcyBpZiB0cnVlLCB3aWxkIGNhcmRzIGFuZCB0aGVpciBlc2NhcGUgc2VxdWVuY2VzIGFyZSBpZ25vcmVkCi0JICogCQkgIChldmVyeXRoaW5nIGlzIHRha2VuIGxpdGVyYWxseSkuCi0JICovCi0JcHVibGljIFN0cmluZ01hdGNoZXIoU3RyaW5nIHBhdHRlcm4sIGJvb2xlYW4gaWdub3JlQ2FzZSwgYm9vbGVhbiBpZ25vcmVXaWxkQ2FyZHMpIHsKLQkJaWYgKHBhdHRlcm4gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJZklnbm9yZUNhc2U9IGlnbm9yZUNhc2U7Ci0JCWZJZ25vcmVXaWxkQ2FyZHM9IGlnbm9yZVdpbGRDYXJkczsKLQkJZlBhdHRlcm49IHBhdHRlcm47Ci0JCWZMZW5ndGg9IHBhdHRlcm4ubGVuZ3RoKCk7Ci0JCQotCQlpZiAoZklnbm9yZVdpbGRDYXJkcykgewotCQkJcGFyc2VOb1dpbGRDYXJkcygpOwotCQl9IGVsc2UgewotCQkJcGFyc2VXaWxkQ2FyZHMoKTsKLQkJfQotCX0KLQkvKioKLQkgKiBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBwYXR0ZXJuIGJldHdlZW4gPGNvZGU+c3RhcnQ8L2NvZGUpKGluY2x1c2l2ZSkgCi0JICogYW5kIDxjb2RlPmVuZDwvY29kZT4oZXhjbHVzaXZlKS4gIAotCSAqIEBwYXJhbSB0ZXh0IHRoZSBTdHJpbmcgb2JqZWN0IHRvIHNlYXJjaCBpbiAKLQkgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGluZGV4IG9mIHRoZSBzZWFyY2ggcmFuZ2UsIGluY2x1c2l2ZQotCSAqIEBwYXJhbSBlbmQgdGhlIGVuZGluZyBpbmRleCBvZiB0aGUgc2VhcmNoIHJhbmdlLCBleGNsdXNpdmUKLQkgKiBAcmV0dXJuIGFuIDxjb2RlPlN0cmluZ01hdGNoZXIuUG9zaXRpb248L2NvZGU+IG9iamVjdCB0aGF0IGtlZXBzIHRoZSBzdGFydGluZyAKLQkgKiAoaW5jbHVzaXZlKSBhbmQgZW5kaW5nIHBvc2l0aW9ucyAoZXhjbHVzaXZlKSBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgCi0JICogcGF0dGVybiBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIHRoZSB0ZXh0OyByZXR1cm4gbnVsbCBpZiBub3QgZm91bmQgb3Igc3VidGV4dAotCSAqIGlzIGVtcHR5IChzdGFydD09ZW5kKS4gQSBwYWlyIG9mIHplcm9zIGlzIHJldHVybmVkIGlmIHBhdHRlcm4gaXMgZW1wdHkgc3RyaW5nCi0JICogTm90ZSB0aGF0IGZvciBwYXR0ZXJuIGxpa2UgIiphYmMqIiB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHN0YXJzLCBwb3NpdGlvbiBvZiAiYWJjIgotCSAqIGlzIHJldHVybmVkLiBGb3IgYSBwYXR0ZXJuIGxpa2UiKj8/KiIgaW4gdGV4dCAiYWJjZGYiLCAoMSwzKSBpcyByZXR1cm5lZAotCSAqLwotCXB1YmxpYyBTdHJpbmdNYXRjaGVyLlBvc2l0aW9uIGZpbmQoU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCi0JCWludCB0bGVuPSB0ZXh0Lmxlbmd0aCgpOwotCQlpZiAoc3RhcnQgPCAwKQotCQkJc3RhcnQ9IDA7Ci0JCWlmIChlbmQgPiB0bGVuKQotCQkJZW5kPSB0bGVuOwotCQlpZiAoZW5kIDwgMCB8fHN0YXJ0ID49IGVuZCApCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGZMZW5ndGggPT0gMCkKLQkJCXJldHVybiBuZXcgUG9zaXRpb24oc3RhcnQsIHN0YXJ0KTsKLQkJaWYgKGZJZ25vcmVXaWxkQ2FyZHMpIHsKLQkJCWludCB4PSBwb3NJbih0ZXh0LCBzdGFydCwgZW5kKTsKLQkJCWlmICh4IDwgMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBuZXcgUG9zaXRpb24oeCwgeCtmTGVuZ3RoKTsKLQkJfQotCi0JCWludCBzZWdDb3VudD0gZlNlZ21lbnRzLmxlbmd0aDsKLQkJaWYgKHNlZ0NvdW50ID09IDApLy9wYXR0ZXJuIGNvbnRhaW5zIG9ubHkgJyonKHMpCi0JCQlyZXR1cm4gbmV3IFBvc2l0aW9uIChzdGFydCwgZW5kKTsKLQkJCQkJCi0JCWludCBjdXJQb3M9IHN0YXJ0OwotCQlpbnQgbWF0Y2hTdGFydD0gLTE7Ci0JCWludCBpOwotCQlmb3IgKGk9IDA7IGkgPCBzZWdDb3VudCAmJiBjdXJQb3MgPCBlbmQ7ICsraSkgewotCQkJU3RyaW5nIGN1cnJlbnQ9IGZTZWdtZW50c1tpXTsKLQkJCWludCBuZXh0TWF0Y2g9IHJlZ0V4cFBvc0luKHRleHQsIGN1clBvcywgZW5kLCBjdXJyZW50KTsKLQkJCWlmIChuZXh0TWF0Y2ggPCAwICkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmKGkgPT0gMCkKLQkJCQltYXRjaFN0YXJ0PSBuZXh0TWF0Y2g7Ci0JCQljdXJQb3M9IG5leHRNYXRjaCArIGN1cnJlbnQubGVuZ3RoKCk7Ci0JCX0KLQkJaWYgKGkgPCBzZWdDb3VudCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IFBvc2l0aW9uKG1hdGNoU3RhcnQsIGN1clBvcyk7Ci0JfQotCS8qKgotCSAqIG1hdGNoIHRoZSBnaXZlbiA8Y29kZT50ZXh0PC9jb2RlPiB3aXRoIHRoZSBwYXR0ZXJuIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBtYXRjaGVkIGVpdGhlcndpc2UgZmFsc2UKLQkgKiBAcGFyYW0gdGV4dCBhIFN0cmluZyBvYmplY3QgCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG1hdGNoKHRleHQsIDAsIHRleHQubGVuZ3RoKCkpOwotCX0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3RhcnRpbmcgKGluY2x1c2l2ZSkgYW5kIHRoZSBlbmRpbmcgKGV4Y2x1c2l2ZSkgcG9zaXRpb25zIGluIHRoZSAgIAotCSAqIDxjb2RlPnRleHQ8L2NvZGU+LCBkZXRlcm1pbmUgaWYgdGhlIGdpdmVuIHN1YnN0cmluZyBtYXRjaGVzIHdpdGggYVBhdHRlcm4gIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBvcnRpb24gb2YgdGhlIHRleHQgbWF0Y2hlcyB0aGUgcGF0dGVybgotCSAqIEBwYXJhbSB0ZXh0IGEgU3RyaW5nIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzdWJzdHJpbmcgdG8gbWF0Y2ggCi0JICogQHBhcmFtIHN0YXJ0IG1hcmtzIHRoZSBzdGFydGluZyBwb3NpdGlvbiAoaW5jbHVzaXZlKSBvZiB0aGUgc3Vic3RyaW5nCi0JICogQHBhcmFtIGVuZCBtYXJrcyB0aGUgZW5kaW5nIGluZGV4IChleGNsdXNpdmUpIG9mIHRoZSBzdWJzdHJpbmcgCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAobnVsbCA9PSB0ZXh0KQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJCi0JCWlmIChzdGFydCA+IGVuZCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChmSWdub3JlV2lsZENhcmRzKQotCQkJcmV0dXJuIChlbmQgLSBzdGFydCA9PSBmTGVuZ3RoKSAmJiBmUGF0dGVybi5yZWdpb25NYXRjaGVzKGZJZ25vcmVDYXNlLCAwLCB0ZXh0LCBzdGFydCwgZkxlbmd0aCk7Ci0JCWludCBzZWdDb3VudD0gZlNlZ21lbnRzLmxlbmd0aDsKLQkJaWYgKHNlZ0NvdW50ID09IDAgJiYgKGZIYXNMZWFkaW5nU3RhciB8fCBmSGFzVHJhaWxpbmdTdGFyKSkgIC8vIHBhdHRlcm4gY29udGFpbnMgb25seSAnKicocykKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoc3RhcnQgPT0gZW5kKQotCQkJcmV0dXJuIGZMZW5ndGggPT0gMDsKLQkJaWYgKGZMZW5ndGggPT0gMCkKLQkJCXJldHVybiBzdGFydCA9PSBlbmQ7CQotCQkgCi0JCWludCB0bGVuPSB0ZXh0Lmxlbmd0aCgpOwotCQlpZiAoc3RhcnQgPCAwKQotCQkJc3RhcnQ9IDA7Ci0JCWlmIChlbmQgPiB0bGVuKQotCQkJZW5kPSB0bGVuOyAKLQkJCQkJCi0JCWludCB0Q3VyUG9zPSBzdGFydDsKLQkJaW50IGJvdW5kPSBlbmQgLSBmQm91bmQ7Ci0JCWlmICggYm91bmQgPCAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgaT0wOwotCQlTdHJpbmcgY3VycmVudD0gZlNlZ21lbnRzW2ldOwotCQlpbnQgc2VnTGVuZ3RoPSBjdXJyZW50Lmxlbmd0aCgpOwotCi0JCS8qIHByb2Nlc3MgZmlyc3Qgc2VnbWVudCAqLwotCQlpZiAoIWZIYXNMZWFkaW5nU3Rhcil7IAotCQkJaWYoIXJlZ0V4cFJlZ2lvbk1hdGNoZXModGV4dCwgc3RhcnQsIGN1cnJlbnQsIDAsIHNlZ0xlbmd0aCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCSsraTsKLQkJCQl0Q3VyUG9zPSB0Q3VyUG9zICsgc2VnTGVuZ3RoOwotCQkJfQotCQl9Ci0JCWlmICgoZlNlZ21lbnRzLmxlbmd0aCA9PSAxKSAmJiAoIWZIYXNMZWFkaW5nU3RhcikgJiYgKCFmSGFzVHJhaWxpbmdTdGFyKSkgewotCQkJLy8gb25seSBvbmUgc2VnbWVudCB0byBtYXRjaCwgbm8gd2lsZGNhcmRzIHNwZWNpZmllZAotCQkJcmV0dXJuIHRDdXJQb3MgPT0gZW5kOwotCQl9Ci0JCS8qIHByb2Nlc3MgbWlkZGxlIHNlZ21lbnRzICovCQotCQl3aGlsZSAoaSA8IHNlZ0NvdW50KSB7Ci0JCQljdXJyZW50PSBmU2VnbWVudHNbaV07Ci0JCQlpbnQgY3VycmVudE1hdGNoOwotCQkJaW50IGs9IGN1cnJlbnQuaW5kZXhPZihmU2luZ2xlV2lsZENhcmQpOwotCQkJaWYgKGsgPCAwKSB7Ci0JCQkJY3VycmVudE1hdGNoPSB0ZXh0UG9zSW4odGV4dCwgdEN1clBvcywgZW5kLCBjdXJyZW50KTsKLQkJCQlpZiAoY3VycmVudE1hdGNoIDwgMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsgCi0JCQkJY3VycmVudE1hdGNoPSByZWdFeHBQb3NJbih0ZXh0LCB0Q3VyUG9zLCBlbmQsIGN1cnJlbnQpOwotCQkJCWlmIChjdXJyZW50TWF0Y2ggPCAwKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQl0Q3VyUG9zPSBjdXJyZW50TWF0Y2ggKyBjdXJyZW50Lmxlbmd0aCgpOwotCQkJaSsrOwotCQl9Ci0KLQkJLyogcHJvY2VzcyBmaW5hbCBzZWdtZW50ICovCi0JCWlmICghZkhhc1RyYWlsaW5nU3RhciAmJiB0Q3VyUG9zICE9IGVuZCkgewotCQkJaW50IGNsZW49IGN1cnJlbnQubGVuZ3RoKCk7Ci0JCQlyZXR1cm4gcmVnRXhwUmVnaW9uTWF0Y2hlcyh0ZXh0LCBlbmQgLSBjbGVuLCBjdXJyZW50LCAwLCBjbGVuKTsKLQkJfQotCQlyZXR1cm4gaSA9PSBzZWdDb3VudCA7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBnaXZlbiBwYXR0ZXJuIGludG8gc2VnbWVudHMgc2VwZXJhdGVkIGJ5IHdpbGRjYXJkICcqJyBjaGFyYWN0ZXJzLgotCSAqIFNpbmNlIHdpbGRjYXJkcyBhcmUgbm90IGJlaW5nIHVzZWQgaW4gdGhpcyBjYXNlLCB0aGUgcGF0dGVybiBjb25zaXN0cyBvZiBhIHNpbmdsZSBzZWdtZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZU5vV2lsZENhcmRzKCkgewotCQlmU2VnbWVudHM9IG5ldyBTdHJpbmdbMV07Ci0JCWZTZWdtZW50c1swXT0gZlBhdHRlcm47Ci0JCWZCb3VuZD0gZkxlbmd0aDsKLQl9Ci0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBwYXR0ZXJuIGludG8gc2VnbWVudHMgc2VwZXJhdGVkIGJ5IHdpbGRjYXJkICcqJyBjaGFyYWN0ZXJzLgotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZVdpbGRDYXJkcygpIHsKLQkJaWYoZlBhdHRlcm4uc3RhcnRzV2l0aCgiKiIpKS8vJE5PTi1OTFMtMSQKLQkJCWZIYXNMZWFkaW5nU3Rhcj0gdHJ1ZTsKLQkJaWYoZlBhdHRlcm4uZW5kc1dpdGgoIioiKSkgey8vJE5PTi1OTFMtMSQKLQkJCS8qIG1ha2Ugc3VyZSBpdCdzIG5vdCBhbiBlc2NhcGVkIHdpbGRjYXJkICovCi0JCQlpZiAoZkxlbmd0aCA+IDEgJiYgZlBhdHRlcm4uY2hhckF0KGZMZW5ndGggLSAyKSAhPSAnXFwnKSB7Ci0JCQkJZkhhc1RyYWlsaW5nU3Rhcj0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCVZlY3RvciB0ZW1wPSBuZXcgVmVjdG9yKCk7Ci0KLQkJaW50IHBvcz0gMDsKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAocG9zIDwgZkxlbmd0aCkgewotCQkJY2hhciBjPSBmUGF0dGVybi5jaGFyQXQocG9zKyspOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnXFwnOgotCQkJCQlpZiAocG9zID49IGZMZW5ndGgpIHsKLQkJCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljaGFyIG5leHQ9IGZQYXR0ZXJuLmNoYXJBdChwb3MrKyk7Ci0JCQkJCQkvKiBpZiBpdCdzIGFuIGVzY2FwZSBzZXF1ZW5jZSAqLwotCQkJCQkJaWYgKG5leHQgPT0gJyonIHx8IG5leHQgPT0gJz8nIHx8IG5leHQgPT0gJ1xcJykgewotCQkJCQkJCWJ1Zi5hcHBlbmQobmV4dCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8qIG5vdCBhbiBlc2NhcGUgc2VxdWVuY2UsIGp1c3QgaW5zZXJ0IGxpdGVyYWxseSAqLwotCQkJCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQkJCQkJYnVmLmFwcGVuZChuZXh0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCWJyZWFrOwotCQkJCWNhc2UgJyonOgotCQkJCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCQkJLyogbmV3IHNlZ21lbnQgKi8KLQkJCQkJCXRlbXAuYWRkRWxlbWVudChidWYudG9TdHJpbmcoKSk7Ci0JCQkJCQlmQm91bmQgKz0gYnVmLmxlbmd0aCgpOwotCQkJCQkJYnVmLnNldExlbmd0aCgwKTsKLQkJCQkJfQotCQkJCWJyZWFrOwotCQkJCWNhc2UgJz8nOgotCQkJCQkvKiBhcHBlbmQgc3BlY2lhbCBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHNpbmdsZSBtYXRjaCB3aWxkY2FyZCAqLwotCQkJCQlidWYuYXBwZW5kKGZTaW5nbGVXaWxkQ2FyZCk7Ci0JCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnVmLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCi0JCS8qIGFkZCBsYXN0IGJ1ZmZlciB0byBzZWdtZW50IGxpc3QgKi8KLQkJaWYgKGJ1Zi5sZW5ndGgoKSA+IDApIHsKLQkJCXRlbXAuYWRkRWxlbWVudChidWYudG9TdHJpbmcoKSk7Ci0JCQlmQm91bmQgKz0gYnVmLmxlbmd0aCgpOwotCQl9Ci0JCQkKLQkJZlNlZ21lbnRzPSBuZXcgU3RyaW5nW3RlbXAuc2l6ZSgpXTsKLQkJdGVtcC5jb3B5SW50byhmU2VnbWVudHMpOwotCX0KLQkvKiogCi0JICogQHBhcmFtIHRleHQgYSBzdHJpbmcgd2hpY2ggY29udGFpbnMgbm8gd2lsZGNhcmQKLQkgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IGZvciBzZWFyY2gsIGluY2x1c2l2ZQotCSAqIEBwYXJhbSBlbmQgdGhlIHN0b3BwaW5nIHBvaW50IG9mIHNlYXJjaCwgZXhjbHVzaXZlCi0JICogQHJldHVybiB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgb2YgdGhlIHBhdHRlcm4gLCBvciAtMSBpZiBub3QgZm91bmQgCi0JICovCi0JcHJvdGVjdGVkIGludCBwb3NJbihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ly9ubyB3aWxkIGNhcmQgaW4gcGF0dGVybgotCQlpbnQgbWF4PSBlbmQgLSBmTGVuZ3RoOwotCQkKLQkJaWYgKCFmSWdub3JlQ2FzZSkgewotCQkJaW50IGk9IHRleHQuaW5kZXhPZihmUGF0dGVybiwgc3RhcnQpOwotCQkJaWYgKGkgPT0gLTEgfHwgaSA+IG1heCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCQkKLQkJZm9yIChpbnQgaT0gc3RhcnQ7IGkgPD0gbWF4OyArK2kpIHsKLQkJCWlmICh0ZXh0LnJlZ2lvbk1hdGNoZXModHJ1ZSwgaSwgZlBhdHRlcm4sIDAsIGZMZW5ndGgpKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCQotCQlyZXR1cm4gLTE7Ci0JfQotCS8qKiAKLQkgKiBAcGFyYW0gdGV4dCBhIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXkgb25seSBjb250YWluICc/JyhzKQotCSAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgZm9yIHNlYXJjaCwgaW5jbHVzaXZlCi0JICogQHBhcmFtIGVuZCB0aGUgc3RvcHBpbmcgcG9pbnQgb2Ygc2VhcmNoLCBleGNsdXNpdmUKLQkgKiBAcGFyYW0gcCBhIHNpbXBsZSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXkgY29udGFpbnMgJz8nCi0JICogQHJldHVybiB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgb2YgdGhlIHBhdHRlcm4gLCBvciAtMSBpZiBub3QgZm91bmQgCi0JICovCi0JcHJvdGVjdGVkIGludCByZWdFeHBQb3NJbihTdHJpbmcgdGV4dCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBTdHJpbmcgcCkgewotCQlpbnQgcGxlbj0gcC5sZW5ndGgoKTsKLQkJCi0JCWludCBtYXg9IGVuZCAtIHBsZW47Ci0JCWZvciAoaW50IGk9IHN0YXJ0OyBpIDw9IG1heDsgKytpKSB7Ci0JCQlpZiAocmVnRXhwUmVnaW9uTWF0Y2hlcyh0ZXh0LCBpLCBwLCAwLCBwbGVuKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVnRXhwUmVnaW9uTWF0Y2hlcyhTdHJpbmcgdGV4dCwgaW50IHRTdGFydCwgU3RyaW5nIHAsIGludCBwU3RhcnQsIGludCBwbGVuKSB7Ci0JCXdoaWxlIChwbGVuLS0gPiAwKSB7Ci0JCQljaGFyIHRjaGFyPSB0ZXh0LmNoYXJBdCh0U3RhcnQrKyk7Ci0JCQljaGFyIHBjaGFyPSBwLmNoYXJBdChwU3RhcnQrKyk7Ci0KLQkJCS8qIHByb2Nlc3Mgd2lsZCBjYXJkcyAqLwotCQkJaWYgKCFmSWdub3JlV2lsZENhcmRzKSB7Ci0JCQkJLyogc2tpcCBzaW5nbGUgd2lsZCBjYXJkcyAqLwotCQkJCWlmIChwY2hhciA9PSBmU2luZ2xlV2lsZENhcmQpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHBjaGFyID09IHRjaGFyKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGZJZ25vcmVDYXNlKSB7Ci0JCQkJaWYgKENoYXJhY3Rlci50b1VwcGVyQ2FzZSh0Y2hhcikgPT0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHBjaGFyKSkKLQkJCQkJY29udGludWU7Ci0JCQkJLy8gY29tcGFyaW5nIGFmdGVyIGNvbnZlcnRpbmcgdG8gdXBwZXIgY2FzZSBkb2Vzbid0IGhhbmRsZSBhbGwgY2FzZXM7Ci0JCQkJLy8gYWxzbyBjb21wYXJlIGFmdGVyIGNvbnZlcnRpbmcgdG8gbG93ZXIgY2FzZQotCQkJCWlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UodGNoYXIpID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShwY2hhcikpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiogCi0JICogQHBhcmFtIHRleHQgdGhlIHN0cmluZyB0byBtYXRjaAotCSAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgZm9yIHNlYXJjaCwgaW5jbHVzaXZlCi0JICogQHBhcmFtIGVuZCB0aGUgc3RvcHBpbmcgcG9pbnQgb2Ygc2VhcmNoLCBleGNsdXNpdmUKLQkgKiBAcGFyYW0gcCBhIHN0cmluZyB0aGF0IGhhcyBubyB3aWxkY2FyZAotCSAqIEByZXR1cm4gdGhlIHN0YXJ0aW5nIGluZGV4IGluIHRoZSB0ZXh0IG9mIHRoZSBwYXR0ZXJuICwgb3IgLTEgaWYgbm90IGZvdW5kIAotCSAqLwotCXByb3RlY3RlZCBpbnQgdGV4dFBvc0luKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIFN0cmluZyBwKSB7IAotCQkKLQkJaW50IHBsZW49IHAubGVuZ3RoKCk7Ci0JCWludCBtYXg9IGVuZCAtIHBsZW47Ci0JCQotCQlpZiAoIWZJZ25vcmVDYXNlKSB7Ci0JCQlpbnQgaT0gdGV4dC5pbmRleE9mKHAsIHN0YXJ0KTsKLQkJCWlmIChpID09IC0xIHx8IGkgPiBtYXgpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmV0dXJuIGk7Ci0JCX0KLQkJCi0JCWZvciAoaW50IGk9IHN0YXJ0OyBpIDw9IG1heDsgKytpKSB7Ci0JCQlpZiAodGV4dC5yZWdpb25NYXRjaGVzKHRydWUsIGksIHAsIDAsIHBsZW4pKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCQotCQlyZXR1cm4gLTE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJBcHBMaWJyYXJpZXNDb250YWluZXJQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5OGE5Yi4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgQkVBIFN5c3RlbXMsIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLklDbGFzc3BhdGhDb250YWluZXJQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLklDbGFzc3BhdGhDb250YWluZXJQYWdlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0VsZW1lbnRXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5jbGFzc3BhdGguV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LldlYkZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLlNlcnZsZXRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotCi1wdWJsaWMgY2xhc3MgV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyUGFnZSAKLQotICAgIGV4dGVuZHMgTmV3RWxlbWVudFdpemFyZFBhZ2UgCi0gICAgaW1wbGVtZW50cyBJQ2xhc3NwYXRoQ29udGFpbmVyUGFnZSwgSUNsYXNzcGF0aENvbnRhaW5lclBhZ2VFeHRlbnNpb24gCi0gICAgCi17Ci0gICAgcHJpdmF0ZSBJUHJvamVjdCBvd25lclByb2plY3Q7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbGlic1Byb2plY3ROYW1lOwotICAgIHByaXZhdGUgQ29tYm8gcHJvamVjdHNDb21ibzsKLSAgICAKLSAgICBwdWJsaWMgV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyUGFnZSgpIAotICAgIHsKLSAgICAgICAgc3VwZXIoICJXZWJBcHBMaWJyYXJpZXNDb250YWluZXJQYWdlIiApOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBzZXRUaXRsZSggUmVzb3VyY2VzLnBhZ2VUaXRsZSApOwotICAgICAgICBzZXREZXNjcmlwdGlvbiggUmVzb3VyY2VzLnBhZ2VEZXNjcmlwdGlvbiApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUNsYXNzcGF0aEVudHJ5IGdldFNlbGVjdGlvbigpIAotICAgIHsKLSAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKCBXZWJBcHBMaWJyYXJpZXNDb250YWluZXIuQ09OVEFJTkVSX0lEICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSB0aGlzLnByb2plY3RzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLSAgICAgICAgaWYoaW5kZXggIT0gLTEpewotCSAgICAgICAgZmluYWwgU3RyaW5nIHNlbGVjdGVkUHJvamVjdE5hbWUgPSB0aGlzLnByb2plY3RzQ29tYm8uZ2V0SXRlbSggaW5kZXggKTsKLQkgICAgICAgIAotCSAgICAgICAgaWYoIHRoaXMub3duZXJQcm9qZWN0ID09IG51bGwgfHwgCi0JICAgICAgICAgICAgISBzZWxlY3RlZFByb2plY3ROYW1lLmVxdWFscyggdGhpcy5vd25lclByb2plY3QuZ2V0TmFtZSgpICkgKQotCSAgICAgICAgewotCSAgICAgICAgICAgIHBhdGggPSBwYXRoLmFwcGVuZCggc2VsZWN0ZWRQcm9qZWN0TmFtZSApOwotCSAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gSmF2YUNvcmUubmV3Q29udGFpbmVyRW50cnkoIHBhdGggKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oIGZpbmFsIElDbGFzc3BhdGhFbnRyeSBjcGVudHJ5ICkgCi0gICAgewotICAgICAgICBmaW5hbCBJUGF0aCBwYXRoID0gY3BlbnRyeSA9PSBudWxsID8gbnVsbCA6IGNwZW50cnkuZ2V0UGF0aCgpOwotICAgICAgICAKLSAgICAgICAgaWYoIHBhdGggPT0gbnVsbCB8fCBwYXRoLnNlZ21lbnRDb3VudCgpID09IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggdGhpcy5vd25lclByb2plY3QgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5saWJzUHJvamVjdE5hbWUgPSB0aGlzLm93bmVyUHJvamVjdC5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmxpYnNQcm9qZWN0TmFtZSA9IHBhdGguc2VnbWVudCggMSApOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woIGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQgKSAKLSAgICB7Ci0gICAgICAgIGZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoIG5ldyBHcmlkTGF5b3V0KCAyLCBmYWxzZSApICk7Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCggY29tcG9zaXRlLCBTV1QuTk9ORSApOwotICAgICAgICBsYWJlbC5zZXRUZXh0KCBSZXNvdXJjZXMucHJvamVjdHNMYWJlbCApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgU3RyaW5nW10gd2ViUHJvamVjdHMgPSBnZXRXZWJQcm9qZWN0cygpOwotICAgICAgICAKLSAgICAgICAgdGhpcy5wcm9qZWN0c0NvbWJvID0gbmV3IENvbWJvKCBjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkgKTsKLSAgICAgICAgdGhpcy5wcm9qZWN0c0NvbWJvLnNldEl0ZW1zKCB3ZWJQcm9qZWN0cyApOwotICAgICAgICAKLSAgICAgICAgZmluYWwgaW50IGluZGV4OwotICAgICAgICAKLSAgICAgICAgaWYoIHRoaXMub3duZXJQcm9qZWN0ICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmRleCA9IGluZGV4T2YoIHdlYlByb2plY3RzLCB0aGlzLmxpYnNQcm9qZWN0TmFtZSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIHRoaXMucHJvamVjdHNDb21iby5nZXRJdGVtQ291bnQoKSA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiggaW5kZXggIT0gLTEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnByb2plY3RzQ29tYm8uc2VsZWN0KCBpbmRleCApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBmaW5hbCBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgICAgICBnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLSAgICAgICAgZ2QubWluaW11bVdpZHRoID0gMTAwOwotICAgICAgICAKLSAgICAgICAgdGhpcy5wcm9qZWN0c0NvbWJvLnNldExheW91dERhdGEoIGdkICk7Ci0gICAgICAgIAotICAgICAgICBzZXRDb250cm9sKCBjb21wb3NpdGUgKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZmluaXNoKCkgCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSggZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGN1cnJlbnRFbnRyaWVzICkgCi0gICAgewotICAgICAgICB0aGlzLm93bmVyUHJvamVjdCA9ICggcHJvamVjdCA9PSBudWxsID8gbnVsbCA6IHByb2plY3QuZ2V0UHJvamVjdCgpICk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFdlYlByb2plY3RzKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTZXQgcHJvamVjdHMKLSAgICAgICAgICAgICAgICA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldEZhY2V0ZWRQcm9qZWN0cyggV2ViRmFjZXRVdGlscy5XRUJfRkFDRVQgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nWyBwcm9qZWN0cy5zaXplKCkgXTsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKCBJdGVyYXRvciBpdHIgPSBwcm9qZWN0cy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIElGYWNldGVkUHJvamVjdCBmcHJvaiA9IChJRmFjZXRlZFByb2plY3QpIGl0ci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgbmFtZXNbIGkgXSA9IGZwcm9qLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFycmF5cy5zb3J0KCBuYW1lcyApOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gbmFtZXM7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2goIENvcmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlcnZsZXRVSVBsdWdpbi5sb2coIGUuZ2V0U3RhdHVzKCkgKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWyAwIF07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2YoIGZpbmFsIFN0cmluZ1tdIGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RyICkKLSAgICB7Ci0gICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggYXJyYXlbIGkgXS5lcXVhbHMoIHN0ciApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZXMKLSAgICAKLSAgICAgICAgZXh0ZW5kcyBOTFMKLSAgICAgICAgCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlVGl0bGU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZ2VEZXNjcmlwdGlvbjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvamVjdHNMYWJlbDsKLSAgICAgICAgCi0gICAgICAgIHN0YXRpYwotICAgICAgICB7Ci0gICAgICAgICAgICBpbml0aWFsaXplTWVzc2FnZXMoIFdlYkFwcExpYnJhcmllc0NvbnRhaW5lclBhZ2UuY2xhc3MuZ2V0TmFtZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmNsYXNzICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkFwcExpYnJhcmllc0NvbnRhaW5lclBhZ2UucHJvcGVydGllcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyUGFnZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTYyMWFiLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQXBwTGlicmFyaWVzQ29udGFpbmVyUGFnZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGFnZVRpdGxlID0gV2ViIEFwcCBMaWJyYXJpZXMKLXBhZ2VEZXNjcmlwdGlvbiA9IFRoaXMgY29udGFpbmVyIGR5bmFtaWNhbGx5IG1hbmFnZXMgY2xhc3NwYXRoIGVudHJpZXMgZm9yIHR5cGVzIGluIHRoZSBXRUItSU5GL2xpYiBhbmQgV0VCLUlORi9jbGFzc2VzIGRpcmVjdG9yaWVzLgotcHJvamVjdHNMYWJlbCA9IFByb2plY3Q6XCAKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50RXhwb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRFeHBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NzE2Y2UuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRFeHBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRU1vZHVsZUV4cG9ydFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuSVdlYlVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBXZWJDb21wb25lbnRFeHBvcnRQYWdlIGV4dGVuZHMgSjJFRU1vZHVsZUV4cG9ydFBhZ2UgewotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBXZWJDb21wb25lbnRFeHBvcnRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLQkJc2V0VGl0bGUoV0VCVUlNZXNzYWdlcy5XRUJfRVhQT1JUX01BSU5fUEdfVElUTEUpOwotCQlzZXREZXNjcmlwdGlvbihXRUJVSU1lc3NhZ2VzLldFQl9FWFBPUlRfTUFJTl9QR19ERVNDKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLldFQl9FWFBPUlRfV0laQVJEX0JBTk5FUikpOwotCQlzZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5XQVJfRVhQT1JUX1BBR0UxKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmludGVybmFsLmludGVybmFsLnVpLndpemFyZC5KMkVFSW1wb3J0UGFnZSNnZXRQcm9qZWN0SW1wb3J0TGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG9uZW50TGFiZWwoKSB7Ci0JCXJldHVybiBKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5XRUJfUFJPSl9MQkwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuaW50ZXJuYWwuaW50ZXJuYWwudWkud2l6YXJkLkoyRUVJbXBvcnRQYWdlI2dldEZpbHRlckV4cHJlc3Npb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyIqLndhciJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5pbnRlcm5hbC5pbnRlcm5hbC51aS53aXphcmQuSjJFRUV4cG9ydFBhZ2UjaXNNZXRhVHlwZVN1cHBvcnRlZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTWV0YVR5cGVTdXBwb3J0ZWQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wbmVudElEKCkgewotCQlyZXR1cm4gIkpTVF9XRUIiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRFeHBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyMWYwMS4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEV4cG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUFydGlmYWN0RXhwb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIDxwPgotICogV2l6YXJkIHVzZWQgdG8gZXhwb3J0IEoyRUUgV2ViIEFwcGxpY2F0aW9uIG1vZHVsZSBzdHJ1Y3R1cmVzIAotICogZnJvbSB0aGUgRWNsaXBzZSBXb3JrYmVuY2ggdG8gYSBkZXBsb3lhYmxlIFdlYiBBcHBsaWNhdGlvbiAKLSAqIEFyY2hpdmUgKi53YXIgZmlsZS4gIAotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV2ViQ29tcG9uZW50RXhwb3J0V2l6YXJkIGV4dGVuZHMgSjJFRUFydGlmYWN0RXhwb3J0V2l6YXJkIGltcGxlbWVudHMgSUV4cG9ydFdpemFyZCB7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgCi0JICogbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubyBvcGVyYXRpb24gaW5zdGFuY2UuIFRoZSBtb2RlbCBhbmQgCi0JICogb3BlcmF0aW9uIHdpbGwgYmUgY3JlYXRlZCBhcyBuZWVkZWQuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBXZWJDb21wb25lbnRFeHBvcnRXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIDxwPgotCSAqIFRoZSBtb2RlbCBpcyB1c2VkIHRvIHByZXBvcHVsYXRlIHRoZSB3aXphcmQgY29udHJvbHMKLQkgKiBhbmQgaW50ZXJmYWNlIHdpdGggdGhlIG9wZXJhdGlvbi4KLQkgKiA8L3A+Ci0JICogQHBhcmFtIG1vZGVsIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIFdlYkNvbXBvbmVudEV4cG9ydFdpemFyZChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0gICAgCi0gICAgcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKTsKLSAgICB9Ci0JLyoqCi0JICogPHA+Ci0JICogQWRkcyB0aGUgZm9sbG93aW5nIHBhZ2VzOgotCSAqIDx1bD4KLQkgKiAJPGxpPiB7QGxpbmsgV2ViQ29tcG9uZW50RXhwb3J0UGFnZX0gYXMgdGhlIG1haW4gd2l6YXJkIHBhZ2UgKHtAbGluayAjTUFJTl9QR30pIAotCSAqIDwvdWw+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRvQWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobmV3IFdlYkNvbXBvbmVudEV4cG9ydFBhZ2UoZ2V0RGF0YU1vZGVsKCksIE1BSU5fUEcsIGdldFNlbGVjdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfSAgIAotCSAqIAotCSAqIDxwPgotCSAqIFNldHMgdXAgdGhlIGRlZmF1bHQgd2l6YXJkIHBhZ2UgaW1hZ2UuIAotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0luaXQoKSB7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEoyRUVVSVBsdWdpbkljb25zLldFQl9FWFBPUlRfV0laQVJEX0JBTk5FUikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50SW1wb3J0UGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTljZWYuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRJbXBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gRGVjIDMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndpemFyZC5KMkVFTW9kdWxlSW1wb3J0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5JV2ViVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLmludGVybmFsLnBsdWdpbi5XRUJVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGNicmlkZ2hhCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlCi0gKiBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJDb21wb25lbnRJbXBvcnRQYWdlIGV4dGVuZHMgSjJFRU1vZHVsZUltcG9ydFBhZ2UgewotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEBwYXJhbSBwYWdlTmFtZQotCSAqLwotCXB1YmxpYyBXZWJDb21wb25lbnRJbXBvcnRQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShXRUJVSU1lc3NhZ2VzLldFQl9JTVBPUlRfTUFJTl9QR19USVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKFdFQlVJTWVzc2FnZXMuV0VCX0lNUE9SVF9NQUlOX1BHX0RFU0MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuV0VCX0lNUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JCXNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLldBUl9JTVBPUlRfUEFHRTEpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUltcG9ydExhYmVsKCkgewotCQlyZXR1cm4gV0VCVUlNZXNzYWdlcy5XRUJfRklMRV9MQkw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117Iioud2FyIn07IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RJbXBvcnRMYWJlbCgpIHsKLQkJcmV0dXJuIFdFQlVJTWVzc2FnZXMuV0VCX1BST0pFQ1RfTEJMOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFubm90YXRpb25zU3RhbmRhbG9uZUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gVE9ETzogaW1wbGVtZW50IHdpdGggbmV3IGltcG9ydCB3aXphcmRzCi0JCS8vIG5ldyBBbm5vdGF0aW9uc1N0YW5kYWxvbmVHcm91cChjb21wb3NpdGUsIGdldFdlYkRhdGFNb2RlbCgpLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVGYWNldElEKCl7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQjsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRJbXBvcnRXZWJMaWJzUGFnZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRJbXBvcnRXZWJMaWJzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGRhNmQ0Li4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9pbnRlcm5hbC93aXphcmQvV2ViQ29tcG9uZW50SW1wb3J0V2ViTGlic1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5BcmNoaXZlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW5JY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUltcG9ydFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpLklXZWJVSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwucGx1Z2luLldFQlVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotCi0vKioKLSAqIEBhdXRob3IgY2JyaWRnaGEKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUKLSAqIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYkNvbXBvbmVudEltcG9ydFdlYkxpYnNQYWdlIGV4dGVuZHMgSjJFRUltcG9ydFBhZ2UgewotCXByaXZhdGUgQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbjsKLQlwcm90ZWN0ZWQgQXJjaGl2ZVdyYXBwZXIgYXJjaGl2ZVdyYXBwZXI7Ci0JcHVibGljIENoZWNrYm94VGFibGVWaWV3ZXIgYXZhaWxhYmxlSkFSc1ZpZXdlcjsKLQlwdWJsaWMgYm9vbGVhbiB1dGlsSmFyU2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICovCi0JcHVibGljIFdlYkNvbXBvbmVudEltcG9ydFdlYkxpYnNQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShXRUJVSU1lc3NhZ2VzLldFQl9JTVBPUlRfV0VCX0xJQl9QR19USVRMRSk7Ci0JCXNldERlc2NyaXB0aW9uKFdFQlVJTWVzc2FnZXMuV0VCX0lNUE9SVF9XRUJfTElCX1BHX0RFU0MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuV0VCX0lNUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5XQVJfSU1QT1JUX1BBR0UyKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY3JlYXRlQXZhaWxhYmxlSmFyc0xpc3QoY29tcG9zaXRlKTsKLQkJY3JlYXRlQnV0dG9uc0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoKLQkgKiBVcGRhdGVzIHRoZSBlbmFibGUgc3RhdGUgb2YgdGhlIGFsbCBidXR0b25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9uRW5hYmxlbWVudHMoKSB7Ci0JCXV0aWxKYXJTZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdmFpbGFibGVKYXJzTGlzdChDb21wb3NpdGUgbGlzdEdyb3VwKSB7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIgPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChsaXN0R3JvdXAsIFNXVC5CT1JERVIgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBnRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEggfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKTsKLQkJZ0RhdGEud2lkdGhIaW50ID0gMjAwOwotCQlnRGF0YS5oZWlnaHRIaW50ID0gODA7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ0RhdGEpOwotCQlBdmFpbGFibGVXZWJMaWJQcm92aWRlciBsaWJzUHJvdmlkZXIgPSBuZXcgQXZhaWxhYmxlV2ViTGliUHJvdmlkZXIoKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobGlic1Byb3ZpZGVyKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxpYnNQcm92aWRlcik7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWF2YWlsYWJsZUpBUkNoZWNrU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVCdXR0b25FbmFibGVtZW50cygpOwotCQkJfQotCQl9KTsKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0JCWF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKGZhbHNlKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0KLQkJbW9kZWwuYWRkTGlzdGVuZXIobmV3IElEYXRhTW9kZWxMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoSVdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuV0VCX0xJQl9BUkNISVZFU19TRUxFQ1RFRCkpIHsKLQkJCQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoKChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5XRUJfTElCX0FSQ0hJVkVTX1NFTEVDVEVEKSkudG9BcnJheSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKSB7Ci0JCUFycmF5TGlzdCBlbXB0eVNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLldFQl9MSUJfQVJDSElWRVNfU0VMRUNURUQsIGVtcHR5U2VsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2VsZWN0QWxsQnV0dG9uUHJlc3NlZCgpIHsKLQkJQXJyYXlMaXN0IGFsbFNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCU9iamVjdCBzZWxlY3Rpb24gPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgKG51bGwgIT0gKHNlbGVjdGlvbiA9IGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0RWxlbWVudEF0KGkpKSk7IGkrKykgewotCQkJYWxsU2VsZWN0aW9uLmFkZChzZWxlY3Rpb24pOwotCQl9Ci0JCW1vZGVsLnNldFByb3BlcnR5KElXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLldFQl9MSUJfQVJDSElWRVNfU0VMRUNURUQsIGFsbFNlbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0dyb3VwKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGJ1dHRvbkdyb3VwID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWJ1dHRvbkdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlidXR0b25Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkdyb3VwLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KFdFQlVJTWVzc2FnZXMuV0FSX0lNUE9SVF9TRUxFQ1RfQUxMX0xJQlNfQlVUVE9OKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlnZC5oZWlnaHRIaW50ID0gU1dULkRFRkFVTFQ7Ci0JCWdkLndpZHRoSGludCA9IFNXVC5ERUZBVUxUOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVTZWxlY3RBbGxCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWRlc2VsZWN0QWxsQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRUZXh0KFdFQlVJTWVzc2FnZXMuV0FSX0lNUE9SVF9ERVNFTEVDVF9BTExfTElCU19CVVRUT04pOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdkLmhlaWdodEhpbnQgPSBTV1QuREVGQVVMVDsKLQkJZ2Qud2lkdGhIaW50ID0gU1dULkRFRkFVTFQ7Ci0JCWRlc2VsZWN0QWxsQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVEZXNlbGVjdEFsbEJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hFQVJGaWxlSWZOZWNlc3NhcnkoKSB7Ci0JCWlmIChpc0VBUkZpbGVDaGFuZ2VkKCkpIHsKLQkJCWFyY2hpdmVXcmFwcGVyID0gKEFyY2hpdmVXcmFwcGVyKSBtb2RlbC5nZXRQcm9wZXJ0eShJSjJFRUNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuQVJDSElWRV9XUkFQUEVSKTsKLQkJCXJlZnJlc2goKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEpBUnNDb21wb3NpdGVFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQlhdmFpbGFibGVKQVJzVmlld2VyLmdldFRhYmxlKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRBbGxHcmF5ZWQoIWVuYWJsZWQpOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaCgpIHsKLQkJYXZhaWxhYmxlSkFSc1ZpZXdlci5zZXRJbnB1dChhcmNoaXZlV3JhcHBlcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFQVJGaWxlQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIGFyY2hpdmVXcmFwcGVyICE9IG1vZGVsLmdldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5BUkNISVZFX1dSQVBQRVIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVudGVyKCkgewotCQlzdXBlci5lbnRlcigpOwotCQlyZWZyZXNoRUFSRmlsZUlmTmVjZXNzYXJ5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXZhaWxhYmxlSkFSQ2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQltb2RlbC5zZXRQcm9wZXJ0eShJV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5XRUJfTElCX0FSQ0hJVkVTX1NFTEVDVEVELCBnZXRKQVJzRm9yUHJvamVjdHMoKSk7Ci0JCXZhbGlkYXRlUGFnZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEpBUnNGb3JQcm9qZWN0cygpIHsKLQkJcmVmcmVzaEVBUkZpbGVJZk5lY2Vzc2FyeSgpOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGF2YWlsYWJsZUpBUnNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGxPckVtcHR5KFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBhU3RyaW5nID09IG51bGwgfHwgYVN0cmluZy5sZW5ndGgoKSA9PSAwOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXt9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVXaWRnZXRWYWx1ZXMoKSB7Ci0JCS8vIFRoaXMgcGFnZSBkb2Vzbid0IGltcGxlbWVudC4uLgotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotCQkvLyBUaGlzIHBhZ2UgZG9lc24ndCBpbXBsZW1lbnQuLi4KLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL2ludGVybmFsL3dpemFyZC9XZWJDb21wb25lbnRJbXBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5ZjFiYy4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvaW50ZXJuYWwvd2l6YXJkL1dlYkNvbXBvbmVudEltcG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbkljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLkoyRUVDb21wb25lbnRJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LklQcm9kdWN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlByb2R1Y3RNYW5hZ2VyOwotCi0vKioKLSAqIDxwPgotICogV2l6YXJkIHVzZWQgdG8gaW1wb3J0IEoyRUUgV2ViIEFwcGxpY2F0aW9uIG1vZHVsZSBzdHJ1Y3R1cmVzIGludG8gdGhlIEVjbGlwc2UgV29ya2JlbmNoIGZyb20gYW4KLSAqIGV4aXN0aW5nIFdlYiBBcHBsaWNhdGlvbiAqLndhciBmaWxlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgV2ViQ29tcG9uZW50SW1wb3J0V2l6YXJkIGV4dGVuZHMgSjJFRUNvbXBvbmVudEltcG9ydFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfTElCU19QRyA9ICJXRUJfTElCU19QRyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIHdpemFyZCB3aXRoIG5vIHNlbGVjdGlvbiwgbm8gbW9kZWwgaW5zdGFuY2UsIGFuZCBubwotCSAqIG9wZXJhdGlvbiBpbnN0YW5jZS4gVGhlIG1vZGVsIGFuZCBvcGVyYXRpb24gd2lsbCBiZSBjcmVhdGVkIGFzIG5lZWRlZC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIFdlYkNvbXBvbmVudEltcG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGUgbW9kZWwgaXMgdXNlZCB0byBwcmVwb3B1bGF0ZSB0aGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUgb3BlcmF0aW9uLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIFRoZSBtb2RlbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwcmUtcG9wdWxhdGUgd2l6YXJkIGNvbnRyb2xzIGFuZCBpbnRlcmZhY2Ugd2l0aCB0aGUKLQkgKiAgICAgICAgICAgIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBXZWJDb21wb25lbnRJbXBvcnRXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogQWRkcyBhbiB7QGxpbmsgV0FSSW1wb3J0UGFnZX0gYXMgdGhlIG1haW4gd2l6YXJkIHBhZ2UgKHtAbGluayAjTUFJTl9QR30pLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlhZGRQYWdlKG5ldyBXZWJDb21wb25lbnRJbXBvcnRQYWdlKGdldERhdGFNb2RlbCgpLCBNQUlOX1BHKSk7Ci0JCWFkZFBhZ2UobmV3IFdlYkNvbXBvbmVudEltcG9ydFdlYkxpYnNQYWdlKGdldERhdGFNb2RlbCgpLCBXRUJfTElCU19QRykpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKiAKLQkgKiA8cD4KLQkgKiBTZXRzIHVwIHRoZSBkaWFsb2cgd2luZG93IHRpdGxlIGFuZCBkZWZhdWx0IHdpemFyZCBwYWdlIGltYWdlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBkb0luaXQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEoyRUVVSU1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVVSU1lc3NhZ2VzLklNUE9SVF9XSVpfVElUTEUpKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSjJFRVVJUGx1Z2luSWNvbnMuV0VCX0lNUE9SVF9XSVpBUkRfQkFOTkVSKSk7Ci0JCS8vIHVwZGF0ZUVBUlRvTW9kZWxGcm9tU2VsZWN0aW9uKGdldFNwZWNpZmljRGF0YU1vZGVsKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRNb2R1bGVWYWxpZGF0b3JTdHJpbmdzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdeyJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIudmFsaWRhdGlvbi5VSVdhclZhbGlkYXRvciJ9OyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvLyBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpIHsKLQkvLyAvLyBKMkVFQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwgcHJvakNyZWF0aW9uTW9kZWwgPQotCS8vIC8vIGdldFNwZWNpZmljRGF0YU1vZGVsKCkuZ2V0SjJFRU1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsKCk7Ci0JLy8gLy8gcmV0dXJuIHByb2pDcmVhdGlvbk1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkZJTkFMX1BFUlNQRUNUSVZFKTsKLQkvLyByZXR1cm4gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuRklOQUxfUEVSU1BFQ1RJVkUpOwotCS8vIH0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFdlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0gICAgICAgIHJldHVybiBQcm9kdWN0TWFuYWdlci5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9XRUIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbFBhZ2UuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODViM2U1Ni4uMDAwMDAwMAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJGYWNldEluc3RhbGxQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IEJFQSBTeXN0ZW1zLCBJbmMuIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtvbnN0YW50aW4gS29taXNzYXJjaGlrIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICBEYXZpZCBTY2huZWlkZXIsIGRhdmlkLnNjaG5laWRlckB1bmlzeXMuY29tIC0gWzE0MjUwMF0gV1RQIHByb3BlcnRpZXMgcGFnZXMgZm9udHMgZG9uJ3QgZm9sbG93IEVjbGlwc2UgcHJlZmVyZW5jZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRU1vZHVsZUZhY2V0SW5zdGFsbFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuV2ViRmFjZXRVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5JV2ViVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprb3N0YUBiZWEuY29tIj5Lb25zdGFudGluIEtvbWlzc2FyY2hpazwvYT4KLSAqLwotcHVibGljIGNsYXNzIFdlYkZhY2V0SW5zdGFsbFBhZ2UgZXh0ZW5kcyBKMkVFTW9kdWxlRmFjZXRJbnN0YWxsUGFnZSBpbXBsZW1lbnRzIElXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQlwcml2YXRlIExhYmVsIGNvbnRleHRSb290TGFiZWw7Ci0JcHJpdmF0ZSBUZXh0IGNvbnRleHRSb290OwotCXByaXZhdGUgTGFiZWwgY29udGVudERpckxhYmVsOwotCXByaXZhdGUgVGV4dCBjb250ZW50RGlyOwotCXByaXZhdGUgVGV4dCBzb3VyY2VEaXI7Ci0JcHJpdmF0ZSBMYWJlbCBzb3VyY2VEaXJMYWJlbDsKLQkKLQlwcml2YXRlIFRleHQgb3V0cHV0Rm9sZGVyOwotCXByaXZhdGUgTGFiZWwgb3V0cHV0Rm9sZGVyTGFiZWw7Ci0JCi0JcHVibGljIFdlYkZhY2V0SW5zdGFsbFBhZ2UoKSB7Ci0JCXN1cGVyKCJ3ZWIuZmFjZXQuaW5zdGFsbC5wYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoUmVzb3VyY2VzLnBhZ2VUaXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKFJlc291cmNlcy5wYWdlRGVzY3JpcHRpb24pOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlzZXRJbmZvcG9wSUQoSVdlYlVJQ29udGV4dElkcy5ORVdfRFlOQU1JQ19XRUJfUFJPSkVDVF9QQUdFMyk7Ci0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJdGhpcy5jb250ZXh0Um9vdExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl0aGlzLmNvbnRleHRSb290TGFiZWwuc2V0VGV4dChSZXNvdXJjZXMuY29udGV4dFJvb3RMYWJlbCk7Ci0JCXRoaXMuY29udGV4dFJvb3RMYWJlbC5zZXRMYXlvdXREYXRhKGdkaGZpbGwoKSk7Ci0KLQkJdGhpcy5jb250ZXh0Um9vdCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXRoaXMuY29udGV4dFJvb3Quc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCQl0aGlzLmNvbnRleHRSb290LnNldERhdGEoImxhYmVsIiwgdGhpcy5jb250ZXh0Um9vdExhYmVsKTsgLy8kTk9OLU5MUy0xJAotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQoY29udGV4dFJvb3QsIENPTlRFWFRfUk9PVCwgbmV3IENvbnRyb2xbXXtjb250ZXh0Um9vdExhYmVsfSk7Ci0KLQkJdGhpcy5jb250ZW50RGlyTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXRoaXMuY29udGVudERpckxhYmVsLnNldFRleHQoUmVzb3VyY2VzLmNvbnRlbnREaXJMYWJlbCk7Ci0JCXRoaXMuY29udGVudERpckxhYmVsLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQotCQl0aGlzLmNvbnRlbnREaXIgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl0aGlzLmNvbnRlbnREaXIuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCQl0aGlzLmNvbnRlbnREaXIuc2V0RGF0YSgibGFiZWwiLCB0aGlzLmNvbnRlbnREaXJMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KGNvbnRlbnREaXIsIENPTkZJR19GT0xERVIsIG51bGwpOwotCQkKLQkJdGhpcy5zb3VyY2VEaXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGhpcy5zb3VyY2VEaXJMYWJlbC5zZXRUZXh0KFJlc291cmNlcy5zb3VyY2VEaXJMYWJlbCk7Ci0JCXRoaXMuc291cmNlRGlyTGFiZWwuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCQkKLQkJdGhpcy5zb3VyY2VEaXIgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl0aGlzLnNvdXJjZURpci5zZXRMYXlvdXREYXRhKGdkaGZpbGwoKSk7Ci0JCXRoaXMuc291cmNlRGlyLnNldERhdGEoImxhYmVsIiwgdGhpcy5zb3VyY2VEaXJMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KHNvdXJjZURpciwgU09VUkNFX0ZPTERFUiwgbnVsbCk7Ci0JCQotCQlvdXRwdXRGb2xkZXJMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJb3V0cHV0Rm9sZGVyTGFiZWwuc2V0VGV4dChKMkVFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZVN0cmluZyhKMkVFVUlNZXNzYWdlcy5PVVRQVVRGT0xERVIpKTsKLQkJb3V0cHV0Rm9sZGVyTGFiZWwuc2V0TGF5b3V0RGF0YShnZGhmaWxsKCkpOwotCQkKLQkJb3V0cHV0Rm9sZGVyID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJb3V0cHV0Rm9sZGVyLnNldExheW91dERhdGEoZ2RoZmlsbCgpKTsKLQkJb3V0cHV0Rm9sZGVyLnNldERhdGEoImxhYmVsIiwgdGhpcy5vdXRwdXRGb2xkZXJMYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJc3luY2hIZWxwZXIuc3luY2hUZXh0KG91dHB1dEZvbGRlciwgT1VUUFVUX0ZPTERFUiwgbnVsbCk7Ci0JCQotCQljcmVhdGVHZW5lcmF0ZURlc2NyaXB0b3JDb250cm9sKCBjb21wb3NpdGUgKTsKLQkJcmVnaXN0ZXJGYWNldFZlcnNpb25DaGFuZ2VMaXN0ZW5lcigpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotICAgICAgICAKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRmFjZXRWZXJzaW9uQ2hhbmdlZEV2ZW50KCkKLQl7Ci0JICAgIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KCBGQUNFVF9WRVJTSU9OICk7Ci0JICAgIHRoaXMuYWRkREQuc2V0VmlzaWJsZSggZnYgPT0gV2ViRmFjZXRVdGlscy5XRUJfMjUgKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0VBUl9QUk9KRUNUX05BTUUsIENPTlRFWFRfUk9PVCwgQ09ORklHX0ZPTERFUiwgU09VUkNFX0ZPTERFUiwgT1VUUFVUX0ZPTERFUn07Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQkJcHVibGljIHN0YXRpYyBTdHJpbmcgcGFnZVRpdGxlOwotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWdlRGVzY3JpcHRpb247Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRleHRSb290TGFiZWw7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRleHRSb290TGFiZWxJbnZhbGlkOwotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZW50RGlyTGFiZWw7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRlbnREaXJMYWJlbEludmFsaWQ7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNvdXJjZURpckxhYmVsOwotCi0KLQkJc3RhdGljIHsKLQkJCWluaXRpYWxpemVNZXNzYWdlcyhXZWJGYWNldEluc3RhbGxQYWdlLmNsYXNzLmdldE5hbWUoKSwgUmVzb3VyY2VzLmNsYXNzKTsKLQkJfQotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViRmFjZXRJbnN0YWxsUGFnZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTdmYTRkLi4wMDAwMDAwCi0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkvc2VydmxldF91aS9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC91aS9wcm9qZWN0L2ZhY2V0L1dlYkZhY2V0SW5zdGFsbFBhZ2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFnZVRpdGxlID0gV2ViIE1vZHVsZQotcGFnZURlc2NyaXB0aW9uID0gQ29uZmlndXJlIHdlYiBtb2R1bGUgc2V0dGluZ3MuCi1jb250ZXh0Um9vdExhYmVsID0gQ29udGV4dCBSb290OgotY29udGV4dFJvb3RMYWJlbEludmFsaWQgPSBDb250ZXh0IFJvb3QgKGludmFsaWQpOgotY29udGVudERpckxhYmVsID0gQ29udGVudCBEaXJlY3Rvcnk6Ci1jb250ZW50RGlyTGFiZWxJbnZhbGlkID0gQ29udGVudCBEaXJlY3RvcnkgKGludmFsaWQpOgotc291cmNlRGlyTGFiZWwgPSBKYXZhIFNvdXJjZSBEaXJlY3Rvcnk6CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJQcm9qZWN0Rmlyc3RQYWdlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJQcm9qZWN0Rmlyc3RQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTc0YmMuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViUHJvamVjdEZpcnN0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5wcm9qZWN0LmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuSmF2YUZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVVJUGx1Z2luSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuSjJFRUNvbXBvbmVudEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LldlYkZhY2V0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkuSVdlYlVJQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBXZWJQcm9qZWN0Rmlyc3RQYWdlIGV4dGVuZHMgSjJFRUNvbXBvbmVudEZhY2V0Q3JlYXRpb25XaXphcmRQYWdlIHsKLQotCXB1YmxpYyBXZWJQcm9qZWN0Rmlyc3RQYWdlKElEYXRhTW9kZWwgbW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihtb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShXRUJVSU1lc3NhZ2VzLldFQl9QUk9KRUNUX01BSU5fUEdfVElUTEUpOwotCQlzZXREZXNjcmlwdGlvbihXRUJVSU1lc3NhZ2VzLldFQl9QUk9KRUNUX01BSU5fUEdfREVTQyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihKMkVFVUlQbHVnaW5JY29ucy5XRUJfUFJPSkVDVF9XSVpBUkRfQkFOTkVSKSk7Ci0JCXNldEluZm9wb3BJRChJV2ViVUlDb250ZXh0SWRzLk5FV19EWU5BTUlDX1dFQl9QUk9KRUNUX1BBR0UxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZUZhY2V0SUQoKSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZ2V0RmFjZXRDb25maWd1cmF0aW9uKCBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBwcmltYXJ5RmFjZXRWZXJzaW9uICkKLQl7Ci0JICAgIGZpbmFsIFNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gZmFjZXRzID0gbmV3IEhhc2hTZXQ8SVByb2plY3RGYWNldFZlcnNpb24+KCAyICk7Ci0JICAgIAotCSAgICBmYWNldHMuYWRkKCBwcmltYXJ5RmFjZXRWZXJzaW9uICk7Ci0JICAgIAotCSAgICBpZiggcHJpbWFyeUZhY2V0VmVyc2lvbiA9PSBXZWJGYWNldFV0aWxzLldFQl8yNSApCi0JICAgIHsKLQkgICAgICAgIGZhY2V0cy5hZGQoIEphdmFGYWNldFV0aWxzLkpBVkFfNTAgKTsKLQkgICAgfQotCSAgICBlbHNlIGlmKCBwcmltYXJ5RmFjZXRWZXJzaW9uID09IFdlYkZhY2V0VXRpbHMuV0VCXzI0ICkKLQkgICAgewotCSAgICAgICAgZmFjZXRzLmFkZCggSmF2YUZhY2V0VXRpbHMuSkFWQV8xNCApOwotCSAgICB9Ci0JICAgIGVsc2UgaWYoIHByaW1hcnlGYWNldFZlcnNpb24gPT0gV2ViRmFjZXRVdGlscy5XRUJfMjMgfHwKLQkgICAgICAgICAgICAgcHJpbWFyeUZhY2V0VmVyc2lvbiA9PSBXZWJGYWNldFV0aWxzLldFQl8yMiApCi0JICAgIHsKLQkgICAgICAgIGZhY2V0cy5hZGQoIEphdmFGYWNldFV0aWxzLkpBVkFfMTMgKTsKLQkgICAgfQotCSAgICAKLQkgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCggZmFjZXRzICk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJQcm9qZWN0V2l6YXJkLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpL3NlcnZsZXRfdWkvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdWkvcHJvamVjdC9mYWNldC9XZWJQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMTQ3ZmUuLjAwMDAwMDAKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS9zZXJ2bGV0X3VpL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3VpL3Byb2plY3QvZmFjZXQvV2ViUHJvamVjdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudWkucHJvamVjdC5mYWNldDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5pbnRlcm5hbC5wbHVnaW4uV0VCVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LklQcm9kdWN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5wcm9qZWN0LmZhY2V0LlByb2R1Y3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdQcm9qZWN0RGF0YU1vZGVsRmFjZXRXaXphcmQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIFdlYlByb2plY3RXaXphcmQgZXh0ZW5kcyBOZXdQcm9qZWN0RGF0YU1vZGVsRmFjZXRXaXphcmQgewotCi0JcHVibGljIFdlYlByb2plY3RXaXphcmQoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JCXNldFdpbmRvd1RpdGxlKFdFQlVJTWVzc2FnZXMuV0VCX01PRFVMRV9XSVpfVElUTEUpOwotCX0KLQkKLQlwdWJsaWMgV2ViUHJvamVjdFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0V2luZG93VGl0bGUoV0VCVUlNZXNzYWdlcy5XRUJfTU9EVUxFX1dJWl9USVRMRSk7Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbCgpIHsKLQkgICAgdHJ5Ci0JICAgIHsKLQkgICAgICAgIHJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkgICAgfQotCSAgICBjYXRjaCggRXhjZXB0aW9uIGUgKQotCSAgICB7Ci0JICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotCSAgICAgICAgcmV0dXJuIG51bGw7Ci0JICAgIH0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGUgZ2V0VGVtcGxhdGUoKSB7Ci0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRUZW1wbGF0ZSgidGVtcGxhdGUuanN0LndlYiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIElXaXphcmRQYWdlIGNyZWF0ZUZpcnN0UGFnZSgpIHsKLQkJcmV0dXJuIG5ldyBXZWJQcm9qZWN0Rmlyc3RQYWdlKG1vZGVsLCAiZmlyc3QucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgZ2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCWZpbmFsIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnVpIik7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgVVJMIHVybCA9IGJ1bmRsZS5nZXRFbnRyeSgiaWNvbnMvZnVsbC9jdG9vbDE2L3dlYi13aXotYmFubmVyLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbmFsUGVyc3BlY3RpdmVJRCgpIHsKLSAgICAgICAgcmV0dXJuIFByb2R1Y3RNYW5hZ2VyLmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX1dFQik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggODY2NWMxZi4uNTFjMjg4OSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0xLDY5ICsxLDk3IEBACi0jVGh1IE1heSAxMCAxODozOToxOCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKKyNUdWUgU2VwIDI5IDEwOjQyOjA2IEVEVCAyMDA5CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5jb21wYXJpbmdJZGVudGljYWw9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudFN1cGVyaW50ZXJmYWNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU3luY2hyb25pemVkT25Jbmhlcml0ZWRNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdIYXNoQ29kZU1ldGhvZD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpbmFsRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5hcmd1bWVudFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkV4ZW1wdEV4Y2VwdGlvbkFuZFRocm93YWJsZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWVycm9yCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQogb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZWFkQ29kZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlVW5jaGVja2VkRXhjZXB0aW9ucz1kaXNhYmxlZAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPXdhcm5pbmcKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD1lcnJvcgorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKK2luc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZworb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwMjIwMwotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsNiBAQAorI1R1ZSBTZXAgMjkgMTA6NDI6MDYgRURUIDIwMDkKK29yZy5lY2xpcHNlLmpkdC51aS5leGNlcHRpb24ubmFtZT1lCitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LnVpLmtleXdvcmR0aGlzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQudWkub3ZlcnJpZGVhbm5vdGF0aW9uPXRydWUKK29yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA1MDdkMTA1Li4wZTMxMmI4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0yLDcgKzIsNyBAQAogQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgogQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Qud2ViOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjA3LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDEuMS40MDMucXVhbGlmaWVyCiBCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLldTVFdlYlBsdWdpbgogQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCkBAIC0xMywxNyArMTMsMTcgQEAKICBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLm9wZXJhdGlvbjt4LWludGVybmFsOj10cnVlCiBSZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAogIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCiAgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKKyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMiwyLjAuMCkiLAogIG9yZy5lY2xpcHNlLmplbS51dGlsO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCiAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiLAorIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSIzLjguMSIsCiAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbnZpcm9ubWVudDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIgogRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL2J1aWxkLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvYnVpbGQucHJvcGVydGllcwppbmRleCA3MDU4NTAxLi4xODJiOTRhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvYnVpbGQucHJvcGVydGllcworKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvYnVpbGQucHJvcGVydGllcwpAQCAtNSwxMCArNSw3IEBACiAgICAgICAgICAgICAgICBhYm91dC5odG1sLFwKICAgICAgICAgICAgICAgIC4KIGphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwsXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKK3NyYy5pbmNsdWRlcyA9IGNvbXBvbmVudC54bWwKIG91dHB1dC4uID0gYmluLwogc291cmNlLi4gPSBzdGF0aWNfd2ViX3Byb2plY3QvLFwKICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvcGx1Z2luLnByb3BlcnRpZXMgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvcGx1Z2luLnByb3BlcnRpZXMKaW5kZXggNjRhNjg5MS4uZDY4NmE3NCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9wbHVnaW4ucHJvcGVydGllcwpAQCAtMyw3ICszLDcgQEAKICMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCitCdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQogQnVuZGxlLU5hbWUuMCA9IFNpbXBsZSBXZWIgUGx1Zy1pbgogCiBTSU1QTEVfV0VCX0xBQkVMPVN0YXRpYyBXZWIgTW9kdWxlCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvcHJvcGVydHlfZmlsZXMvc3RhdGljd2VicHJvamVjdC5wcm9wZXJ0aWVzIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3Byb3BlcnR5X2ZpbGVzL3N0YXRpY3dlYnByb2plY3QucHJvcGVydGllcwppbmRleCBiMTc0NWVjLi5jM2MzNjg3IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvcHJvcGVydHlfZmlsZXMvc3RhdGljd2VicHJvamVjdC5wcm9wZXJ0aWVzCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9wcm9wZXJ0eV9maWxlcy9zdGF0aWN3ZWJwcm9qZWN0LnByb3BlcnRpZXMKQEAgLTEwLDExICsxMCwxNCBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogU3RhdGljV2ViUHJvamVjdENyZWF0aW9uV2l6YXJkX1dpemFyZF9UaXRsZT1OZXcgU3RhdGljIFdlYiBQcm9qZWN0CiBTdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2VfUGFnZV9EZXNjcmlwdGlvbj1DcmVhdGUgYSBXZWIgcHJvamVjdCBmb3Igc2ltcGxlIGNvbnRlbnQgKEhUTUwgZmlsZXMpIG9ubHkuCi1TdGF0aWNXZWJTZXR0aW5nc1Byb3BlcnRpZXNQYWdlX1dlYl9Db250ZW50X0xhYmVsPVdlYiBjb250ZW50IGZvbGRlciBuYW1lOgotU3RhdGljQ29udGV4dFJvb3RDb21wb3NpdGVfQ29udGV4dF9Sb290X0xhYmVsPUNvbnRleHQgcm9vdAorU3RhdGljV2ViU2V0dGluZ3NQcm9wZXJ0aWVzUGFnZV9XZWJfQ29udGVudF9MYWJlbD0mV2ViIGNvbnRlbnQgZm9sZGVyIG5hbWU6CitTdGF0aWNDb250ZXh0Um9vdENvbXBvc2l0ZV9Db250ZXh0X1Jvb3RfTGFiZWw9JkNvbnRleHQgcm9vdDoKIFN0YXRpY1dlYlByb2plY3RXaXphcmRCYXNlUGFnZV9QYWdlX1RpdGxlPVN0YXRpYyBXZWIgUHJvamVjdAogU3RhdGljV2ViU2V0dGluZ3NQcm9wZXJ0aWVzUGFnZV9Ob3RfYXZhaWxhYmxlX2Zvcl9jbG9zZWRfcHJvamVjdHM9V2ViIHNldHRpbmdzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBhIGNsb3NlZCBwcm9qZWN0LgotVGFyZ2V0UnVudGltZT1UYXJnZXQgUnVudGltZQorVGFyZ2V0UnVudGltZT1UYXJnZXQgciZ1bnRpbWUKIE5ld0RvdERvdERvdD1OJmV3Li4uCiBJbnZhbGlkU2VydmVyVGFyZ2V0PUludmFsaWQgdGFyZ2V0IHNlcnZlciBzZWxlY3RlZC4KLUNvbmZpZ3VyZVNldHRpbmdzPUNvbmZpZ3VyZSBTdGF0aWMgV2ViIG1vZHVsZSBzZXR0aW5ncy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitDb25maWd1cmVTZXR0aW5ncz1Db25maWd1cmUgU3RhdGljIFdlYiBtb2R1bGUgc2V0dGluZ3MuCitDb250ZXh0X1Jvb3RfY2Fubm90X2JlX2VtcHR5XzI9Q29udGV4dCByb290IGNhbm5vdCBiZSBlbXB0eQorTmFtZXNfY2Fubm90X2NvbnRhaW5fd2hpdGVzcGFjZT1Db250ZXh0IHJvb3QgY2Fubm90IGNvbnRhaW4gd2hpdGVzcGFjZQorVGhlX2NoYXJhY3Rlcl9pc19pbnZhbGlkX2luX2FfY29udGV4dF9yb290PVRoZSBjaGFyYWN0ZXIgJyd7MH0nJyBpcyBpbnZhbGlkIGluIGEgY29udGV4dCByb290LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvSVByb2R1Y3RDb25zdGFudHMuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvSVByb2R1Y3RDb25zdGFudHMuamF2YQppbmRleCBjNzkyYmFiLi42ZWYzYjZiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L0lQcm9kdWN0Q29uc3RhbnRzLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9JUHJvZHVjdENvbnN0YW50cy5qYXZhCkBAIC0zMiwxNSArMzIsMjIgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfRk9MREVSID0gIm91dHB1dEZvbGRlciI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfU0lOR0xFX1JPT1RfU1RSVUNUVVJFID0gInVzZVNpbmdsZVJvb3RTdHJ1Y3R1cmUiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfUEVSU1BFQ1RJVkVfSElFUkFSQ0hZX1ZJRVcgPSAiaWRQZXJzcGVjdGl2ZUhpZXJhcmNoeVZpZXciOyAvLyROT04tTkxTLTEkCi0JCQorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfSkFWQV9FRV9NT0RVTEVfREVQRU5ERU5DWV9QQUdFID0gInNob3dKYXZhRUVNb2R1bGVEZXBlbmRlbmN5UGFnZSI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX1dFQl9HRU5FUkFURV9ERCA9ICJkeW5hbWljX3dlYl9nZW5lcmF0ZV9kZCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRTZfQ09OTkVDVE9SX0dFTkVSQVRFX0REID0gImVlNl9jb25uZWN0b3JfZ2VuZXJhdGVfZGQiOyAvLyROT04tTkxTLTEkCisJCisJLyoqCisJICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZS4gVGhlIEFMTE9XX0NMQVNTUEFUSF9ERVAgcHJlZmVyZW5jZSBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCBpdHMgYWJpbGl0eSB0byBkaXNhYmxlIGR5bmFtaWMgbWFuaWZlc3QgdXBkYXRlcyB3aWxsIHNvb24gYmUgcmVtb3ZlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExPV19DTEFTU1BBVEhfREVQID0gImFsbG93Q2xhc3NwYXRoRGVwIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX0RVUExJQ0FURV9DTEFTU1BBVEhfQ09NUE9ORU5UX1VSSSA9ICJ2YWxpZGF0ZUR1cENsYXNzcGF0aENvbXBVUkkiOyAvLyROT04tTkxTLTEkCisJCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFlOX1dFQl9PVVRQVVRfRk9MREVSID0gImR5bldlYk91dHB1dCI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfT1VUUFVUX0ZPTERFUiA9ICJlamJPdXRwdXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9PVVRQVVRfRk9MREVSID0gImFwcENsaWVudE91dHB1dCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQ0FfT1VUUFVUX0ZPTERFUiA9ICJqY2FPdXRwdXQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRJTElUWV9PVVRQVVRfRk9MREVSID0idXRpbE91dHB1dCI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAKLSAgICAKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfQ0xJRU5UX09VVFBVVF9GT0xERVIgPSAiYXBwQ2xpZW50T3V0cHV0IjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9PVVRQVVRfRk9MREVSID0gImpjYU91dHB1dCI7IC8vJE5PTi1OTFMtMSQKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVElMSVRZX09VVFBVVF9GT0xERVIgPSJ1dGlsT3V0cHV0IjsgLy8kTk9OLU5MUy0xJAorCQogCS8qKgogICAgICAqIEFsdGVycyB0aGUgZmluYWwgcGVyc3BlY3RpdmUgdXNlZCBieSB0aGUgZm9sbG93aW5nIG5ldyBwcm9qZWN0IHdpemFyZHMKICAgICAgKi8KQEAgLTUxLDYgKzU4LDcgQEAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9QRVJTUEVDVElWRV9KQ0EgPSAiZmluYWxQZXJzcGVjdGl2ZUpjYSI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9QRVJTUEVDVElWRV9VVElMSVRZID0gImZpbmFsUGVyc3BlY3RpdmVVdGlsaXR5IjsgLy8kTk9OLU5MUy0xJAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkFMX1BFUlNQRUNUSVZFX1NUQVRJQ1dFQiA9ICJmaW5hbFBlcnNwZWN0aXZlU3RhdGljV2ViIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkFMX1BFUlNQRUNUSVZFX1dFQkZSQUdNRU5UID0gImZpbmFsUGVyc3BlY3RpdmVXZWJGcmFnbWVudCI7IC8vJE5PTi1OTFMtMSQKIAkKIAkvKioKIAkgKiBBYmlsaXR5IHRvIGRlZmF1bHQgaW5pdGlhbCBydW50aW1lcyBjaG9zZW4gaW4gd2l6YXJkcwpAQCAtNTgsNiArNjYsNyBAQAogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUlVOVElNRV8xID0gImRlZmF1bHRSdW50aW1lMSI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JVTlRJTUVfMiA9ICJkZWZhdWx0UnVudGltZTIiOyAvLyROT04tTkxTLTEkCiAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SVU5USU1FXzMgPSAiZGVmYXVsdFJ1bnRpbWUzIjsgLy8kTk9OLU5MUy0xJAorCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUlVOVElNRV80ID0gImRlZmF1bHRSdW50aW1lNCI7IC8vJE5PTi1OTFMtMSQKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXRVJfU1lOQ19GT1JfV0VCU0VSVklDRVMgPSAidmlld2VyU3luY0ZvcldlYnNlcnZpY2VzIjsgLy8kTk9OLU5MUy0xJAogCQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9Qcm9kdWN0TWFuYWdlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9Qcm9kdWN0TWFuYWdlci5qYXZhCmluZGV4IDQ1OWFhMmIuLjFhNTRhNzQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvUHJvZHVjdE1hbmFnZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1Byb2R1Y3RNYW5hZ2VyLmphdmEKQEAgLTE3LDEwICsxNywxMCBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLldTVFdlYlBsdWdpbjsKIAogcHVibGljIGNsYXNzIFByb2R1Y3RNYW5hZ2VyIHsKIApAQCAtMzgsMTIgKzM4LDE2IEBACiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9TSU5HTEVfUk9PVF9TVFJVQ1RVUkUgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdFUl9TWU5DX0ZPUl9XRUJTRVJWSUNFUyA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9QRVJTUEVDVElWRV9ISUVSQVJDSFlfVklFVyA9ICJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuUHJvamVjdEV4cGxvcmVyIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9XX0pBVkFfRUVfTU9EVUxFX0RFUEVOREVOQ1lfUEFHRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5BTF9QRVJTUEVDVElWRSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5KMkVFUGVyc3BlY3RpdmUiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkFMX1dFQl9QRVJTUEVDVElWRSA9ICJvcmcuZWNsaXBzZS53c3Qud2ViLnVpLndlYkRldlBlcnNwZWN0aXZlIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEWU5BTUlDX1dFQl9HRU5FUkFURV9ERCA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUlVOVElNRV9TRVBBUkFUT1IgPSAnOic7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9SVU5USU1FX0tFWVMgPSAKIAkJCQkJCQluZXcgU3RyaW5nW117SVByb2R1Y3RDb25zdGFudHMuREVGQVVMVF9SVU5USU1FXzEsCiAJCQkJCQkJCQkJSVByb2R1Y3RDb25zdGFudHMuREVGQVVMVF9SVU5USU1FXzIsCi0JCQkJCQkJCQkJSVByb2R1Y3RDb25zdGFudHMuREVGQVVMVF9SVU5USU1FXzN9OworCQkJCQkJCQkJCUlQcm9kdWN0Q29uc3RhbnRzLkRFRkFVTFRfUlVOVElNRV8zLAorCQkJCQkJCQkJCUlQcm9kdWN0Q29uc3RhbnRzLkRFRkFVTFRfUlVOVElNRV80fTsKIAkKIAkvKioKIAkgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgYXNzb2NpYXRlZCBrZXkgZnJvbSB0aGUgUGxhdGZvcm0gUHJvZHVjdCByZWdpc3RyeSBvciByZXR1cm4gdGhlCkBAIC01OCw2ICs2MiwxMCBAQAogCQlTdHJpbmcgdmFsdWUgPSBudWxsOwogCQlpZiAoUGxhdGZvcm0uZ2V0UHJvZHVjdCgpIT1udWxsKQogCQkJdmFsdWUgPSBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0UHJvcGVydHkoa2V5KTsKKwkJaWYgKHZhbHVlID09IG51bGwpCisJCXsKKwkJCXZhbHVlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFdTVFdlYlBsdWdpbi5QTFVHSU5fSUQsIGtleSwgbnVsbCwgbnVsbCk7CisJCX0KIAkJaWYgKHZhbHVlID09IG51bGwpIHsKIAkJCWlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLkFQUExJQ0FUSU9OX0NPTlRFTlRfRk9MREVSKSkKIAkJCQlyZXR1cm4gQVBQTElDQVRJT05fQ09OVEVOVF9GT0xERVI7CkBAIC05MCwxMSArOTgsMTUgQEAKIAkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfSkNBKSkKIAkJCQlyZXR1cm4gRklOQUxfUEVSU1BFQ1RJVkU7CiAJCQllbHNlIGlmIChrZXkuZXF1YWxzKElQcm9kdWN0Q29uc3RhbnRzLkZJTkFMX1BFUlNQRUNUSVZFX1NUQVRJQ1dFQikpCi0JCQkJcmV0dXJuIG51bGw7CisJCQkJcmV0dXJuIEZJTkFMX1dFQl9QRVJTUEVDVElWRTsKIAkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuRklOQUxfUEVSU1BFQ1RJVkVfVVRJTElUWSkpCiAJCQkJcmV0dXJuIEZJTkFMX1BFUlNQRUNUSVZFOwogCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJUHJvZHVjdENvbnN0YW50cy5GSU5BTF9QRVJTUEVDVElWRV9XRUIpKQogCQkJCXJldHVybiBGSU5BTF9QRVJTUEVDVElWRTsKKwkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuU0hPV19KQVZBX0VFX01PRFVMRV9ERVBFTkRFTkNZX1BBR0UpKQorCQkJCXJldHVybiBTSE9XX0pBVkFfRUVfTU9EVUxFX0RFUEVOREVOQ1lfUEFHRTsKKwkJCWVsc2UgaWYgKGtleS5lcXVhbHMoSVByb2R1Y3RDb25zdGFudHMuRFlOQU1JQ19XRUJfR0VORVJBVEVfREQpKQorCQkJCXJldHVybiBEWU5BTUlDX1dFQl9HRU5FUkFURV9ERDsKIAkJfQogCQlyZXR1cm4gdmFsdWU7CiAJfQpAQCAtMTI0LDcgKzEzNiw3IEBACiAJCQkJZGVmYXVsdFJ1bnRpbWUgPSBnZXRNYXRjaGluZ1J1bnRpbWUoREVGQVVMVF9SVU5USU1FX0tFWVNbaV0sIHJ1bnRpbWVzKTsKIAkJCQlpZiAoZGVmYXVsdFJ1bnRpbWUgIT0gbnVsbCkgewogCQkJCQlpZiAodGhlUnVudGltZXMgPT0gbnVsbCkgewotCQkJCQkJdGhlUnVudGltZXMgPSBuZXcgQXJyYXlMaXN0KDMpOworCQkJCQkJdGhlUnVudGltZXMgPSBuZXcgQXJyYXlMaXN0KERFRkFVTFRfUlVOVElNRV9LRVlTLmxlbmd0aCk7CiAJCQkJCX0KIAkJCQkJdGhlUnVudGltZXMuYWRkKGRlZmF1bHRSdW50aW1lKTsKIAkJCQl9CkBAIC0xNDYsNyArMTU4LDcgQEAKIAkJaW50IHNlcGVyYXRvckluZGV4ID0gZGVmYXVsdFByb2R1Y3RSdW50aW1lS2V5LmluZGV4T2YoUlVOVElNRV9TRVBBUkFUT1IpOwogCQlpZiAoc2VwZXJhdG9ySW5kZXggPCAwICYmIHNlcGVyYXRvckluZGV4IDwgZGVmYXVsdFByb2R1Y3RSdW50aW1lS2V5Lmxlbmd0aCgpKSB7CiAJCQkvL0NvbnNpZGVyIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBoZXJlLgotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJJbnZhbGlkIGRlZmF1bHQgcHJvZHVjdCBydW50aW1lIGlkLiAgSXQgc2hvdWxkIGZvbGxvdyB0aGUgZm9ybWF0IDxmYWNldCBydW50aW1lIGlkPjo8ZmFjZXQgdmVyc2lvbj4uICBJZCBwcm9jZXNzZWQ6ICIgKyBkZWZhdWx0UHJvZHVjdFJ1bnRpbWVLZXkpOworCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJJbnZhbGlkIGRlZmF1bHQgcHJvZHVjdCBydW50aW1lIGlkLiAgSXQgc2hvdWxkIGZvbGxvdyB0aGUgZm9ybWF0IDxmYWNldCBydW50aW1lIGlkPjo8ZmFjZXQgdmVyc2lvbj4uICBJZCBwcm9jZXNzZWQ6ICIgKyBkZWZhdWx0UHJvZHVjdFJ1bnRpbWVLZXkpOyAvLyROT04tTkxTLTEkCiAJCQlyZXR1cm4gbnVsbDsKIAkJfQogCQlTdHJpbmcgZGVmYXVsdFJ1bnRpbWVJRCA9IGRlZmF1bHRQcm9kdWN0UnVudGltZUtleS5zdWJzdHJpbmcoMCwgc2VwZXJhdG9ySW5kZXgpOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9TaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9TaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmluZGV4IGM2YzQ1MmEuLmM1NTE0MDcgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1NpbXBsZVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKQEAgLTEyLDkgKzEyLDI1IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5yZXNvdXJjZXMuUmVzb3VyY2VTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC51dGlscy5NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwuRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsLlJlc291cmNlSGFuZGxlcjsKKworaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuVVRGMTY7CitpbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiAKIHB1YmxpYyBjbGFzcyBTaW1wbGVXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIGltcGxlbWVudHMgSVNpbXBsZVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgewogCkBAIC0yMiw2ICszOCw3IEBACiAJCXN1cGVyKCk7CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewogCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7CiAJCW5hbWVzLmFkZChDT05URU5UX0RJUik7CkBAIC0yOSwyMSArNDYsMTA0IEBACiAJCXJldHVybiBuYW1lczsKIAl9CiAKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7CiAJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTlRFTlRfRElSKSkgewogCQkJcmV0dXJuICJXZWJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAogCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OVEVYVF9ST09UKSkgewotCQkJcmV0dXJuIGdldFByb3BlcnR5KEZBQ0VUX1BST0pFQ1RfTkFNRSk7CisJCQlyZXR1cm4gZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKS5yZXBsYWNlKCcgJywgJ18nKTsKIAkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZBQ0VUX0lEKSkgewogCQkJcmV0dXJuIElNb2R1bGVDb25zdGFudHMuV1NUX1dFQl9NT0RVTEU7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwogCX0KIAkKKwlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewogCQlpZiAoRkFDRVRfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CiAJCQltb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShDT05URVhUX1JPT1QsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7CiAJCX0KIAkJcmV0dXJuIHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7CiAJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBuYW1lKSB7CisJCWlmIChuYW1lLmVxdWFscyhDT05URVhUX1JPT1QpKSB7CisJCQlyZXR1cm4gdmFsaWRhdGVDb250ZXh0Um9vdChnZXRTdHJpbmdQcm9wZXJ0eShDT05URVhUX1JPT1QpKTsKKwkJfSAKKwkJZWxzZSBpZiAobmFtZS5lcXVhbHMoQ09OVEVOVF9ESVIpKSB7CisJCQlTdHJpbmcgZm9sZGVyTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KENPTlRFTlRfRElSKTsKKwkJCWlmIChmb2xkZXJOYW1lID09IG51bGwgfHwgZm9sZGVyTmFtZS5sZW5ndGgoKSA9PSAwIHx8IGZvbGRlck5hbWUuZXF1YWxzKCIvIikgfHwgZm9sZGVyTmFtZS5lcXVhbHMoIlxcIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQkJLy8gYWxsIGZvbGRlcnMgd2hpY2ggbWVldCB0aGUgY3JpdGVyaWEgb2YgIkNPTkZJR19GT0xERVIiIGFyZSByZXF1aXJlZAorCQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuV0VCQ09OVEVOVEZPTERFUl9FTVBUWSk7CisJCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1lc3NhZ2UpOworCQkJfQorCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUZvbGRlck5hbWUoZm9sZGVyTmFtZSk7CisJCQlpZiAoc3RhdHVzLmlzT0soKSkKKwkJCXsKKwkJCQlpZiAoZm9sZGVyTmFtZS5pbmRleE9mKCcjJykgIT0gLTEpIHsgCisJCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMucmVzb3VyY2VzX2ludmFsaWRDaGFySW5OYW1lLCAiIyIsIGZvbGRlck5hbWUpOyAvLyROT04tTkxTLTEkCisJCQkJCXN0YXR1cyA9IG5ldyBSZXNvdXJjZVN0YXR1cyhJUmVzb3VyY2VTdGF0dXMuSU5WQUxJRF9WQUxVRSwgbnVsbCwgbWVzc2FnZSk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQkKKwkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKG5hbWUpOworCX0KKwkKKwlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUNvbnRleHRSb290KFN0cmluZyBjb250ZXh0Um9vdCkgeworCQlpZiAoY29udGV4dFJvb3QgPT0gbnVsbCB8fCBjb250ZXh0Um9vdC5sZW5ndGgoKSA9PSAwKSB7CisJCQlyZXR1cm4gbmV3IFJlc291cmNlU3RhdHVzKElSZXNvdXJjZVN0YXR1cy5JTlZBTElEX1ZBTFVFLCBudWxsLCBSZXNvdXJjZUhhbmRsZXIuQ29udGV4dF9Sb290X2Nhbm5vdF9iZV9lbXB0eV8yKTsKKwkJfSBlbHNlIGlmIChjb250ZXh0Um9vdC50cmltKCkuZXF1YWxzKGNvbnRleHRSb290KSkgeworCQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbnRleHRSb290LCAiLiIpOyAvLyROT04tTkxTLTEkCisJCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKKwkJCQlTdHJpbmcgdG9rZW4gPSBzdG9rLm5leHRUb2tlbigpOworCQkJCWludCBjcDsKKwkJICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRva2VuLmxlbmd0aCgpOyBpICs9IFVURjE2LmdldENoYXJDb3VudChjcCkpIHsKKwkJICAgICAgICAgICAgY3AgPSBVVEYxNi5jaGFyQXQodG9rZW4sIGkpOworCQkJCQlpZih0b2tlbi5jaGFyQXQoaSkgPT0gJyAnKQorCQkJCQl7CisJCQkJCQlyZXR1cm4gbmV3IFJlc291cmNlU3RhdHVzKElSZXNvdXJjZVN0YXR1cy5JTlZBTElEX1ZBTFVFLCBudWxsLCBSZXNvdXJjZUhhbmRsZXIuTmFtZXNfY2Fubm90X2NvbnRhaW5fd2hpdGVzcGFjZSk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoISh0b2tlbi5jaGFyQXQoaSkgPT0gJ18nKSAmJiAhKHRva2VuLmNoYXJBdChpKSA9PSAnLScpICYmICEodG9rZW4uY2hhckF0KGkpID09ICcvJykgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdCh0b2tlbi5jaGFyQXQoaSkpID09IGZhbHNlKSB7CisJCQkJCQlTdHJpbmcgaW52YWxpZENoYXJTdHJpbmcgPSBudWxsOworCQkJCQkJaWYgKFVURjE2LmdldENoYXJDb3VudChjcCk+MSkKKwkJCQkJCXsKKwkJCQkJCQlpbnZhbGlkQ2hhclN0cmluZyA9IFVURjE2LnZhbHVlT2YoY3ApOyAKKwkJCQkJCX0KKwkJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlpbnZhbGlkQ2hhclN0cmluZyA9IChuZXcgQ2hhcmFjdGVyKHRva2VuLmNoYXJBdChpKSkpLnRvU3RyaW5nKCk7CisJCQkJCQl9CisJCQkJCQlPYmplY3RbXSBpbnZhbGlkQ2hhciA9IG5ldyBPYmplY3RbXXtpbnZhbGlkQ2hhclN0cmluZ307CisJCQkJCQlTdHJpbmcgZXJyb3JTdGF0dXMgPSBSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFJlc291cmNlSGFuZGxlci5UaGVfY2hhcmFjdGVyX2lzX2ludmFsaWRfaW5fYV9jb250ZXh0X3Jvb3QsIGludmFsaWRDaGFyKTsgCisJCQkJCQlyZXR1cm4gbmV3IFJlc291cmNlU3RhdHVzKElSZXNvdXJjZVN0YXR1cy5JTlZBTElEX1ZBTFVFLCBudWxsLCBlcnJvclN0YXR1cyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZQorCQl7CisJCQlyZXR1cm4gbmV3IFJlc291cmNlU3RhdHVzKElSZXNvdXJjZVN0YXR1cy5JTlZBTElEX1ZBTFVFLCBudWxsLCBSZXNvdXJjZUhhbmRsZXIuTmFtZXNfY2Fubm90X2NvbnRhaW5fd2hpdGVzcGFjZSk7CisJCX0KKwkJcmV0dXJuIE9LX1NUQVRVUzsKKwl9CisJCisJCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlRm9sZGVyTmFtZShTdHJpbmcgZm9sZGVyTmFtZSkgeworCQkvLyB0aGUgZGlyZWN0b3J5IGlzIG5vdCByZXF1aXJlZCwgYnV0IGlmIHRoZSBuYW1lIGlzIGVudGVyZWQgZW5zdXJlIHRoYXQgaXQgCisJCS8vIGNvbnRhaW5zIG9ubHkgdmFsaWQgY2hhcmFjdGVycy4KKwkJaWYgKGZvbGRlck5hbWUgPT0gbnVsbCB8fCBmb2xkZXJOYW1lLmxlbmd0aCgpID09IDApIHsKKwkJCXJldHVybiBPS19TVEFUVVM7CisJCX0KKwkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmb2xkZXJOYW1lKTsKKwkJZm9yIChpbnQgaSA9IDAsIG1heCA9IHBhdGguc2VnbWVudENvdW50KCk7IGkgPCBtYXg7IGkrKykgeworCQkJSVN0YXR1cyBzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVOYW1lKHBhdGguc2VnbWVudChpKSwgSVJlc291cmNlLkZPTERFUik7CisJCQlpZiAoISBzdGF0dXMuaXNPSygpKQorCQkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQkvLyBhbGwgb2YgdGhlIHBvdGVudGlhbCBzZWdtZW50cyBvZiB0aGUgZm9sZGVyIGhhdmUgYmVlbiB2ZXJpZmllZAorCQlyZXR1cm4gT0tfU1RBVFVTOworCX0KIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQppbmRleCAwMGM1NmY0Li4xNTI3NmQ2IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1NpbXBsZVdlYkZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3QvcHJvamVjdC9mYWNldC9TaW1wbGVXZWJGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5GYWNldERhdGFNb2RlbFByb3ZpZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKQEAgLTMxLDYgKzMwLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuV1NUV2ViUGx1Z2luOwogCiBwdWJsaWMgY2xhc3MgU2ltcGxlV2ViRmFjZXRJbnN0YWxsRGVsZWdhdGUgaW1wbGVtZW50cyBJRGVsZWdhdGUgewogCkBAIC01OCw3ICs1OCw3IEBACiAJCQl0cnkgewogCQkJCSgoSURhdGFNb2RlbE9wZXJhdGlvbikgbW9kZWwuZ2V0UHJvcGVydHkoRmFjZXREYXRhTW9kZWxQcm92aWRlci5OT1RJRklDQVRJT05fT1BFUkFUSU9OKSkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKIAkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOworCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfSBmaW5hbGx5IHsKIAkJCWlmIChtb25pdG9yICE9IG51bGwpCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC9wcm9qZWN0L2ZhY2V0L1NpbXBsZVdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvU2ltcGxlV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmluZGV4IDc5NDlmNmIuLjkwMDIwZmYgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvU2ltcGxlV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3Byb2plY3QvZmFjZXQvU2ltcGxlV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiAJCXN1cGVyKCk7CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIGluaXQoKSB7CiAJCXN1cGVyLmluaXQoKTsKIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL0RlbGVnYXRlQ29uZmlndXJhdGlvbkVsZW1lbnQuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9EZWxlZ2F0ZUNvbmZpZ3VyYXRpb25FbGVtZW50LmphdmEKaW5kZXggYmY4YmQ0Ny4uN2FkZDU0OCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL0RlbGVnYXRlQ29uZmlndXJhdGlvbkVsZW1lbnQuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvRGVsZWdhdGVDb25maWd1cmF0aW9uRWxlbWVudC5qYXZhCkBAIC05LDEwICs5LDcgQEAKICAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKLSAqIENyZWF0ZWQgb24gRGVjIDE0LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKKyAqIENyZWF0ZWQgb24gRGVjZW1iZXIgMTQsIDIwMDQKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud2ViLmludGVybmFsOwogCkBAIC01Miw2ICs0OSw3IEBACiAJICogCiAJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAJCWlmIChkZWxlZ2F0ZUVsZW1lbnQgPT0gbnVsbCkKIAkJCXJldHVybiBmYWxzZTsKQEAgLTE3Niw2ICsxNzQsNyBAQAogCSAqIAogCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCiAJICovCisJQE92ZXJyaWRlCiAJcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAkJaWYgKGRlbGVnYXRlRWxlbWVudCA9PSBudWxsKQogCQkJcmV0dXJuIC0xOwpAQCAtMTk3LDYgKzE5Niw3IEBACiAJICogCiAJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKIAkgKi8KKwlAT3ZlcnJpZGUKIAlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpCiAJCQlyZXR1cm4gREVMRUdBVEVfTlVMTF9TVFJJTkc7CkBAIC0yMDQsNyArMjA0LDYgQEAKIAl9CiAKIAlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IHRvRXF1aW5veCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgogCQlyZXR1cm4gbnVsbDsKIAl9CiAKQEAgLTIyMCw0ICsyMTksMTYgQEAKIAkJcmV0dXJuIGRlbGVnYXRlRWxlbWVudC5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7CiAJfQogCisJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI5NjEyMgorCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGxvY2FsZSkgdGhyb3dzIEludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbiB7CisJCWlmIChkZWxlZ2F0ZUVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisJCXJldHVybiBkZWxlZ2F0ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJOYW1lLCBsb2NhbGUpOworCX0KKworCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yOTYxMjIKKwlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKFN0cmluZyBsb2NhbGUpIHRocm93cyBJbnZhbGlkUmVnaXN0cnlPYmplY3RFeGNlcHRpb24geworCQlpZiAoZGVsZWdhdGVFbGVtZW50ID09IG51bGwpIHJldHVybiBudWxsOworCQlyZXR1cm4gZGVsZWdhdGVFbGVtZW50LmdldFZhbHVlKGxvY2FsZSk7CisJfQorCiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1Jlc291cmNlSGFuZGxlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1Jlc291cmNlSGFuZGxlci5qYXZhCmluZGV4IDg3YzI3ZGMuLjcxNjc3MjQgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9SZXNvdXJjZUhhbmRsZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvUmVzb3VyY2VIYW5kbGVyLmphdmEKQEAgLTMwLDggKzMwLDE1IEBACiAJcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RG90RG90RG90OwogCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRTZXJ2ZXJUYXJnZXQ7CiAJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlU2V0dGluZ3M7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGV4dF9Sb290X2Nhbm5vdF9iZV9lbXB0eV8yOworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hbWVzX2Nhbm5vdF9jb250YWluX3doaXRlc3BhY2U7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgVGhlX2NoYXJhY3Rlcl9pc19pbnZhbGlkX2luX2FfY29udGV4dF9yb290OwogCiAJc3RhdGljIHsKIAkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUmVzb3VyY2VIYW5kbGVyLmNsYXNzKTsKIAl9CisJCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKKwkJcmV0dXJuIE5MUy5iaW5kKGtleSwgYXJncyk7CisJfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9XU1RXZWJQbHVnaW4uamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9XU1RXZWJQbHVnaW4uamF2YQppbmRleCBhODU2ZTU3Li5kMTRiNmM4IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvV1NUV2ViUGx1Z2luLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dTVFdlYlBsdWdpbi5qYXZhCkBAIC02Miw2ICs2Miw3IEBACiAJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CiAJfQogCQorCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVEZWZhdWx0UGx1Z2luUHJlZmVyZW5jZXMoKSB7CiAJCWdldFdTVFdlYlByZWZlcmVuY2VzKCkuaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpOwogCX0KQEAgLTk0LDQgKzk1LDEyIEBACiAJCU11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQTFVHSU5fSUQsSVN0YXR1cy5FUlJPUixuZXcgSVN0YXR1c1tde2V4Y2VwdGlvbi5nZXRTdGF0dXMoKX0sbWVzc2FnZSxleGNlcHRpb24pOwogCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCkpLmxvZyggc3RhdHVzICk7CiAJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBleGNlcHRpb24pIHsKKwkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKwkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpKS5sb2coIGV4Y2VwdGlvbi5nZXRTdGF0dXMoKSApOworCX0KIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9XZWJQcm9wZXJ0aWVzVXRpbC5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dlYlByb3BlcnRpZXNVdGlsLmphdmEKaW5kZXggZWYyNDk4MS4uZWZhOTJkMCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dlYlByb3BlcnRpZXNVdGlsLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL1dlYlByb3BlcnRpZXNVdGlsLmphdmEKQEAgLTM0LDcgKzM0LDcgQEAKIAkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7CiAKIAkJU3RyaW5nIG5hbWUgPSBjb250ZXh0Um9vdDsKLQkJaWYgKG5hbWUuZXF1YWxzKCIiKSB8fCBuYW1lID09IG51bGwpIHsgLy8kTk9OLU5MUy0xJAorCQlpZiAobmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKIAkJCS8vICB0aGlzIHdhcyBhZGRlZCBiZWNhdXNlIHRoZSBlcnJvciBtZXNzYWdlIHNob3VsZG50IGJlIHNob3duIGluaXRpYWxseS4gSXQgc2hvdWxkIGJlCiAJCQkvLyBzaG93biBvbmx5IGlmIGNvbnRleHQgcm9vdCBmaWVsZCBpcyBlZGl0ZWQgdG8KIAkJCWVycm9yTWVzc2FnZSA9IFJlc291cmNlSGFuZGxlci5TdGF0aWNXZWJQcm9qZWN0V2l6YXJkQmFzZVBhZ2VfUGFnZV9UaXRsZTsgCmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvQ29tcG9uZW50RGVwbG95YWJsZS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL0NvbXBvbmVudERlcGxveWFibGUuamF2YQppbmRleCBkMzUxMzYwLi4yNTFkYjg5IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvQ29tcG9uZW50RGVwbG95YWJsZS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9Db21wb25lbnREZXBsb3lhYmxlLmphdmEKQEAgLTIwLDEzICsyMCwxMSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnJlc291cmNlcy5WaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb250YWluZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKQEAgLTM3LDE3ICszNSwyMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Nb2R1bGVGb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlRm9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5JTW9kdWxlUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuTW9kdWxlRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Nb2R1bGVGb2xkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuUHJvamVjdE1vZHVsZTsKIAorLyoqCisgKiBAZGVwcmVjYXRlZCBhcyBvZiBXVFAgMy4yCisgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnREZXBsb3lhYmxlIGV4dGVuZHMgUHJvamVjdE1vZHVsZSB7CiAKIAlwcm90ZWN0ZWQgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgTGlzdCBtZW1iZXJzID0gbmV3IEFycmF5TGlzdCgpOworCXByb3RlY3RlZCBMaXN0PElNb2R1bGVSZXNvdXJjZT4gbWVtYmVycyA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZVJlc291cmNlPigpOwogCQogCXB1YmxpYyBDb21wb25lbnREZXBsb3lhYmxlKElQcm9qZWN0IHByb2plY3QpIHsKIAkJdGhpcyhwcm9qZWN0LENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpKTsKQEAgLTcyLDcgKzczLDcgQEAKIAkgKiBAcGFyYW0gTW9kdWxlRm9sZGVyIG1mCiAJICogQHBhcmFtIElNb2R1bGVSZXNvdXJjZVtdIG1yCiAJICovCi0JcHJpdmF0ZSB2b2lkIGFkZE1lbWJlcnNUb01vZHVsZUZvbGRlcihNb2R1bGVGb2xkZXIgbWYsIElNb2R1bGVSZXNvdXJjZVtdIG1yKSB7CisJcHJvdGVjdGVkIHZvaWQgYWRkTWVtYmVyc1RvTW9kdWxlRm9sZGVyKE1vZHVsZUZvbGRlciBtZiwgSU1vZHVsZVJlc291cmNlW10gbXIpIHsKIAkJLy8gSWYgdGhlIGZvbGRlciBpcyBudWxsIG9yIHRoZSByZXNvdXJjZXMgdG8gYWRkIGFyZSBudWxsIG9yIGVtcHR5LCBiYWlsIGFuZCByZXR1cm4KIAkJaWYgKG1mID09IG51bGwgfHwgbXIgPT0gbnVsbCB8fCBtci5sZW5ndGg9PTApIAogCQkJcmV0dXJuOwpAQCAtOTksMTIgKzEwMCwxMyBAQAogICAgICAqIAogICAgICAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVbXQogICAgICAqLwotICAgIHB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKCkgeworICAgIEBPdmVycmlkZQorCXB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKCkgewogICAgICAgICByZXR1cm4gZ2V0TW9kdWxlcygpOwogICAgIH0KICAgICAKICAgICBwdWJsaWMgSU1vZHVsZVtdIGdldE1vZHVsZXMoKSB7Ci0JCUxpc3QgbW9kdWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKwkJTGlzdDxJTW9kdWxlPiBtb2R1bGVzID0gbmV3IEFycmF5TGlzdDxJTW9kdWxlPigpOwogCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKIAkgICAgCUlWaXJ0dWFsUmVmZXJlbmNlW10gY29tcG9uZW50cyA9IGdldFJlZmVyZW5jZXMoY29tcG9uZW50KTsKIAkgICAgCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykgewpAQCAtMTE3LDcgKzExOSw3IEBACiAJCQkJfQogCQkJfQogCQl9Ci0gICAgICAgIHJldHVybiAoSU1vZHVsZVtdKSBtb2R1bGVzLnRvQXJyYXkobmV3IElNb2R1bGVbbW9kdWxlcy5zaXplKCldKTsKKyAgICAgICAgcmV0dXJuIG1vZHVsZXMudG9BcnJheShuZXcgSU1vZHVsZVttb2R1bGVzLnNpemUoKV0pOwogCX0KICAgICAKICAgICBwcm90ZWN0ZWQgSVZpcnR1YWxSZWZlcmVuY2VbXSBnZXRSZWZlcmVuY2VzKElWaXJ0dWFsQ29tcG9uZW50IGFDb21wb25lbnQpIHsKQEAgLTE0Nyw3ICsxNDksNyBAQAogCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBnZXRNZW1iZXJzKElDb250YWluZXIgY29udCwgSVBhdGggcGF0aCwgSVBhdGggamF2YVBhdGgsIElDb250YWluZXJbXSBqYXZhQ29udCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQlJUmVzb3VyY2VbXSByZXMgPSBjb250Lm1lbWJlcnMoKTsKIAkJaW50IHNpemUyID0gcmVzLmxlbmd0aDsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChzaXplMik7CisJCUxpc3Q8SU1vZHVsZUZpbGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGVGaWxlPihzaXplMik7CiAJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewogCQkJaWYgKHJlc1tqXSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKIAkJCQlJQ29udGFpbmVyIGNjID0gKElDb250YWluZXIpIHJlc1tqXTsKQEAgLTE5NSwxMyArMTk3LDEzIEBACiAJfQogCQogCXByb3RlY3RlZCBJTW9kdWxlRmlsZSBjcmVhdGVNb2R1bGVGaWxlKGZpbmFsIElGaWxlIGZpbGUsIGZpbmFsIElQYXRoIHBhdGgpIHsKLQkJcmV0dXJuIG5ldyBNb2R1bGVGaWxlKGZpbGUsIGZpbGUuZ2V0TmFtZSgpLCBwYXRoLCBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkgKyBmaWxlLmdldExvY2FsVGltZVN0YW1wKCkpOworCQlyZXR1cm4gbmV3IE1vZHVsZUZpbGUoZmlsZSwgZmlsZS5nZXROYW1lKCksIHBhdGgpOwogCX0KIAkKIAlwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gZ2V0TWVtYmVycyhJVmlydHVhbENvbnRhaW5lciBjb250LCBJUGF0aCBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CiAJCUlWaXJ0dWFsUmVzb3VyY2VbXSByZXMgPSBjb250Lm1lbWJlcnMoKTsKIAkJaW50IHNpemUyID0gcmVzLmxlbmd0aDsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChzaXplMik7CisJCUxpc3Q8SU1vZHVsZUZpbGU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGVGaWxlPihzaXplMik7CiAJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTI7IGorKykgewogCQkJaWYgKHJlc1tqXSBpbnN0YW5jZW9mIElWaXJ0dWFsQ29udGFpbmVyKSB7CiAJCQkJSVZpcnR1YWxDb250YWluZXIgY2MgPSAoSVZpcnR1YWxDb250YWluZXIpIHJlc1tqXTsKQEAgLTMyMCw2ICszMjIsNyBAQAogCQlyZXR1cm4gbmV3IElNb2R1bGVSZXNvdXJjZVtde307CiAJfQogCQorCUBPdmVycmlkZQogCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewogCQltZW1iZXJzLmNsZWFyKCk7CiAJCUlWaXJ0dWFsQ29tcG9uZW50IHZjID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZ2V0UHJvamVjdCgpKTsKQEAgLTM2MiwyMSArMzY1LDE4IEBACiAJCiAJcHJvdGVjdGVkIHZvaWQgYWRkVXRpbE1lbWJlcihJVmlydHVhbENvbXBvbmVudCBwYXJlbnQsIElWaXJ0dWFsUmVmZXJlbmNlIHJlZmVyZW5jZSwgSVBhdGggcnVudGltZVBhdGgpIHsKIAkJSU1vZHVsZUZpbGUgbWYgPSBudWxsOwotCQlmaW5hbCBTdHJpbmcgYXJjaGl2ZU5hbWUgPSByZWZlcmVuY2UuZ2V0QXJjaGl2ZU5hbWUoKTsKKwkJZmluYWwgU3RyaW5nIGFyY2hpdmVOYW1lMiA9IHJlZmVyZW5jZS5nZXRBcmNoaXZlTmFtZSgpOworCQlmaW5hbCBTdHJpbmcgYXJjaGl2ZU5hbWUgPSBuZXcgUGF0aChhcmNoaXZlTmFtZTIpLmxhc3RTZWdtZW50KCk7CiAJCWZpbmFsIElWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wID0gcmVmZXJlbmNlLmdldFJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJZmluYWwgSVBhdGggYXJjaGl2ZVBhdGggPSAoKFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50KXZpcnR1YWxDb21wKS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJaWYgKGFyY2hpdmVQYXRoICE9IG51bGwpIHsgLy9JbiBXb3Jrc3BhY2UKLQkJCUlGaWxlIHV0aWxGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGFyY2hpdmVQYXRoKTsKLQkJCVN0cmluZyBuYW1lID0gbnVsbCAhPSBhcmNoaXZlTmFtZSA/IGFyY2hpdmVOYW1lIDogdXRpbEZpbGUuZ2V0TmFtZSgpOwotCQkJbWYgPSBuZXcgTW9kdWxlRmlsZSh1dGlsRmlsZSwgbmFtZSwgcnVudGltZVBhdGgubWFrZVJlbGF0aXZlKCkpOworCQlJRmlsZSBpZmlsZSA9IChJRmlsZSl2aXJ0dWFsQ29tcC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKKwkJaWYgKGlmaWxlICE9IG51bGwpIHsgLy9JbiBXb3Jrc3BhY2UKKwkJCVN0cmluZyBuYW1lID0gbnVsbCAhPSBhcmNoaXZlTmFtZSA/IGFyY2hpdmVOYW1lIDogaWZpbGUuZ2V0TmFtZSgpOworCQkJbWYgPSBuZXcgTW9kdWxlRmlsZShpZmlsZSwgbmFtZSwgcnVudGltZVBhdGgubWFrZVJlbGF0aXZlKCkpOwogCQl9IGVsc2UgewotCQkJRmlsZSBleHRGaWxlID0gKChWaXJ0dWFsQXJjaGl2ZUNvbXBvbmVudCl2aXJ0dWFsQ29tcCkuZ2V0VW5kZXJseWluZ0Rpc2tGaWxlKCk7CisJCQlGaWxlIGV4dEZpbGUgPSAoRmlsZSl2aXJ0dWFsQ29tcC5nZXRBZGFwdGVyKEZpbGUuY2xhc3MpOwogCQkJU3RyaW5nIG5hbWUgPSBudWxsICE9IGFyY2hpdmVOYW1lID8gYXJjaGl2ZU5hbWUgOiBleHRGaWxlLmdldE5hbWUoKTsKIAkJCW1mID0gbmV3IE1vZHVsZUZpbGUoZXh0RmlsZSwgbmFtZSwgcnVudGltZVBhdGgubWFrZVJlbGF0aXZlKCkpOwogCQl9Ci0JCWlmIChtZiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KIAkJSU1vZHVsZVJlc291cmNlIG1vZHVsZVBhcmVudCA9IGdldEV4aXN0aW5nTW9kdWxlUmVzb3VyY2UobWVtYmVycywgbWYuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkpOwogCQlpZiAobW9kdWxlUGFyZW50ICE9IG51bGwgJiYgbW9kdWxlUGFyZW50IGluc3RhbmNlb2YgTW9kdWxlRm9sZGVyKSB7CiAJCQlhZGRNZW1iZXJzVG9Nb2R1bGVGb2xkZXIoKE1vZHVsZUZvbGRlciltb2R1bGVQYXJlbnQsIG5ldyBJTW9kdWxlUmVzb3VyY2VbXXttZn0pOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL0ZsYXRDb21wb25lbnREZXBsb3lhYmxlLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvRmxhdENvbXBvbmVudERlcGxveWFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjg2ODliCi0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL0ZsYXRDb21wb25lbnREZXBsb3lhYmxlLmphdmEKQEAgLTAsMCArMSwzNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVkIEhhdCBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgUmVkIEhhdCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuZGVwbG95YWJsZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkZsYXRWaXJ0dWFsQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LkZsYXRWaXJ0dWFsQ29tcG9uZW50LkZsYXRDb21wb25lbnRUYXNrTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmZsYXQuSUNoaWxkTW9kdWxlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklGbGF0RmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdEZvbGRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdFJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5mbGF0LklGbGF0VmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuZmxhdC5JRmxhdHRlblBhcnRpY2lwYW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLlZpcnR1YWxSZWZlcmVuY2VVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZUZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRGVsZWdhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLnV0aWwuTW9kdWxlRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Qcm9qZWN0TW9kdWxlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmxhdENvbXBvbmVudERlcGxveWFibGUgZXh0ZW5kcyBQcm9qZWN0TW9kdWxlIHsKKworCS8qCisJICogUmVnaXN0ZXIgYW4gYWRhcHQgSU1vZHVsZSB0byBJVmlydHVhbENvbXBvbmVudCAKKwkgKi8KKwlzdGF0aWMgeworCQlQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLnJlZ2lzdGVyQWRhcHRlcnMobmV3IElBZGFwdGVyRmFjdG9yeSgpIHsKKwkJCXB1YmxpYyBDbGFzc1tdIGdldEFkYXB0ZXJMaXN0KCkgeworCQkJCXJldHVybiBuZXcgQ2xhc3NbXSB7IElWaXJ0dWFsQ29tcG9uZW50LmNsYXNzIH07CisJCQl9CisKKwkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBDbGFzcyBhZGFwdGVyVHlwZSkgeworCQkJCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJTW9kdWxlKSB7CisJCQkJCUlNb2R1bGUgbW9kdWxlID0gKElNb2R1bGUpIGFkYXB0YWJsZU9iamVjdDsKKwkJCQkJRmxhdENvbXBvbmVudERlcGxveWFibGUgZGVwbG95YWJsZSA9IChGbGF0Q29tcG9uZW50RGVwbG95YWJsZSkgbW9kdWxlLmxvYWRBZGFwdGVyKEZsYXRDb21wb25lbnREZXBsb3lhYmxlLmNsYXNzLCBudWxsKTsKKwkJCQkJaWYoZGVwbG95YWJsZSAhPSBudWxsKXsKKwkJCQkJCUlWaXJ0dWFsQ29tcG9uZW50IHZpcnR1YWxDb21wb25lbnQgPSBkZXBsb3lhYmxlLmdldENvbXBvbmVudCgpOworCQkJCQkJcmV0dXJuIHZpcnR1YWxDb21wb25lbnQ7CisJCQkJCX0KKwkJCQl9CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0sIElNb2R1bGUuY2xhc3MpOworCX0KKwkKKwlwcm90ZWN0ZWQgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKKwlwcm90ZWN0ZWQgTGlzdDxJTW9kdWxlUmVzb3VyY2U+IG1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGVSZXNvdXJjZT4oKTsKKwkKKwlwdWJsaWMgRmxhdENvbXBvbmVudERlcGxveWFibGUoSVByb2plY3QgcHJvamVjdCkgeworCQl0aGlzKHByb2plY3QsQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCkpOworCX0KKwkKKwlwdWJsaWMgRmxhdENvbXBvbmVudERlcGxveWFibGUoSVByb2plY3QgcHJvamVjdCwgSVZpcnR1YWxDb21wb25lbnQgYUNvbXBvbmVudCkgeworCQlzdXBlcihwcm9qZWN0KTsKKwkJdGhpcy5jb21wb25lbnQgPSBhQ29tcG9uZW50OworCX0KKworCXB1YmxpYyBJVmlydHVhbENvbXBvbmVudCBnZXRDb21wb25lbnQoKSB7CisJCXJldHVybiBjb21wb25lbnQ7CisJfQorCQorCS8qKgorCSAqIFdlIHdpbGwgY2FjaGUgdGhlIGZsYXR0ZW5lZCBwaWVjZSBoZXJlLCBhbmQgaW5zdGVhZCByZWRpcmVjdAorCSAqIHRoZSBtb2R1bGUgZmFjdG9yaWVzIHRvIHJlY3JlYXRlIHRoZSBtb2R1bGVzICp3aGVuZXZlciogdGhlcmUgaXMgCisJICogYSB3b3Jrc3BhY2UgY2hhbmdlLiBUaGlzIHdpbGwgc3RpbGwgYmUgbXVjaCBtb3JlIGVmZmljaWVudCB0aGFuCisJICogdHJhdmVyc2luZyB0aGUgdHJlZSBlYWNoIHRpbWUgYSBjYWxsIHRvIGdldFJlc291cmNlcygpIG9yIGdldENoaWxkTW9kdWxlcygpLiAKKwkgKi8KKwlwcml2YXRlIEZsYXRWaXJ0dWFsQ29tcG9uZW50IGNhY2hlRmxhdHRlbmVkID0gbnVsbDsKKworCQorCXB1YmxpYyBib29sZWFuIHNob3VsZENhY2hlKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoKSB7CisJCWNhY2hlRmxhdHRlbmVkID0gbnVsbDsKKwl9CisJCisJLyoqCisJICogVGhlIGV4cG9ydCBtb2RlbCBpcyB3aGF0IGRvZXMgdGhlIGdydW50IG9mIHRoZSB3b3JrCisJICogQHJldHVybgorCSAqLworCXByb3RlY3RlZCBJRmxhdFZpcnR1YWxDb21wb25lbnQgZ2V0RmxhdENvbXBvbmVudCgpIHsKKwkJaWYoICFzaG91bGRDYWNoZSgpIHx8IGNhY2hlRmxhdHRlbmVkID09IG51bGwgKSB7CisJCQlGbGF0Q29tcG9uZW50VGFza01vZGVsIG9wdGlvbnMgPSBuZXcgRmxhdENvbXBvbmVudFRhc2tNb2RlbCgpOworCQkJb3B0aW9ucy5wdXQoRmxhdFZpcnR1YWxDb21wb25lbnQuUEFSVElDSVBBTlRfTElTVCwgQXJyYXlzLmFzTGlzdChnZXRQYXJ0aWNpcGFudHMoKSkpOworCQkJRmxhdFZpcnR1YWxDb21wb25lbnQgdG1wID0gbmV3IEZsYXRWaXJ0dWFsQ29tcG9uZW50KGNvbXBvbmVudCwgb3B0aW9ucyk7CisJCQlpZiggc2hvdWxkQ2FjaGUoKSkKKwkJCQljYWNoZUZsYXR0ZW5lZCA9IHRtcDsKKwkJCXJldHVybiB0bXA7CisJCX0KKwkJcmV0dXJuIGNhY2hlRmxhdHRlbmVkOworCX0KKwkKKwkvKioKKwkgKiBTdWJjbGFzc2VzIGNhbiBwcm92aWRlIGEgbGlzdCBvZiBwYXJ0aWNpcGFudHMgd2hvIG1heQorCSAqIGJlIGludm9sdmVkIGluIGZvcm1pbmcgdGhlIGV4cG9ydCBtb2RlbAorCSAqIAorCSAqIEEgZGVwbG95YWJsZSB3aXRoIG5vIHBhcnRpY2lwYW50IHNob3VsZCBzdGlsbCBwcm9wZXJseQorCSAqIGNvbnN1bWUgY29uc3VtZWQgcmVmZXJlbmNlcyBhbmQgdHJhdmVyc2UgdGhlIG1vZGVsIGFwcHJvcHJpYXRlbHkKKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJcHJvdGVjdGVkIElGbGF0dGVuUGFydGljaXBhbnRbXSBnZXRQYXJ0aWNpcGFudHMoKSB7CisJCXJldHVybiBuZXcgSUZsYXR0ZW5QYXJ0aWNpcGFudFtdeworCQl9OworCX0KKwkKKwlwdWJsaWMgYm9vbGVhbiBpc0JpbmFyeSgpIHsKKwkJcmV0dXJuIGNvbXBvbmVudCA9PSBudWxsID8gZmFsc2UgOiBjb21wb25lbnQuaXNCaW5hcnkoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgSU1vZHVsZVJlc291cmNlW10gbWVtYmVycygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJaWYoIGNvbXBvbmVudC5pc0JpbmFyeSgpICkgCisJCQlyZXR1cm4gTEVHQUNZX2JpbmFyeU1lbWJlcnMoKTsKKwkJCisJCUlGbGF0VmlydHVhbENvbXBvbmVudCBlbSA9IGdldEZsYXRDb21wb25lbnQoKTsKKwkJSUZsYXRSZXNvdXJjZVtdIHJlc291cmNlcyA9IGVtLmZldGNoUmVzb3VyY2VzKCk7CisJCXJldHVybiBjb252ZXJ0KHJlc291cmNlcyk7CisJCQorCX0KKworCXByb3RlY3RlZCBJTW9kdWxlUmVzb3VyY2VbXSBMRUdBQ1lfYmluYXJ5TWVtYmVycygpIHsKKwkJSUZpbGUgaWZpbGUgPSAoSUZpbGUpY29tcG9uZW50LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOworCQlGaWxlIGZpbGUgPSAoRmlsZSljb21wb25lbnQuZ2V0QWRhcHRlcihGaWxlLmNsYXNzKTsKKwkJTW9kdWxlRmlsZSBtZiA9IGlmaWxlICE9IG51bGwgPyBuZXcgTW9kdWxlRmlsZShpZmlsZSwgaWZpbGUuZ2V0TmFtZSgpLCBuZXcgUGF0aCgiIikpICAvLyROT04tTkxTLTEkCisJCSAJCTogbmV3IE1vZHVsZUZpbGUoZmlsZSwgZmlsZS5nZXROYW1lKCksIG5ldyBQYXRoKCIiKSk7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIG5ldyBJTW9kdWxlUmVzb3VyY2VbXXttZn07CisJfQorCQorCSAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjaGlsZCBtb2R1bGVzIG9mIHRoaXMgbW9kdWxlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVbXQorICAgICAqLworICAgIEBPdmVycmlkZQorCXB1YmxpYyBJTW9kdWxlW10gZ2V0Q2hpbGRNb2R1bGVzKCkgeworICAgICAgICByZXR1cm4gZ2V0TW9kdWxlcygpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgLyogbm9uIGFwaSAqLyBJQ2hpbGRNb2R1bGVSZWZlcmVuY2VbXSBnZXRFeHBvcnRNb2RlbENoaWxkcmVuKCkgdGhyb3dzIENvcmVFeGNlcHRpb24geworICAgIAlJRmxhdFZpcnR1YWxDb21wb25lbnQgZW0gPSBnZXRGbGF0Q29tcG9uZW50KCk7CisgICAgCUlDaGlsZE1vZHVsZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0gZW0uZ2V0Q2hpbGRNb2R1bGVzKCk7CisgICAgCXJldHVybiBjaGlsZHJlbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKCkgeworICAgIAkvLyBMZWdhY3ksIGhlcmUgaW4gY2FzZSB0aGUgb2xkIG1vZHVsZXMgYXJlIHVzZWQKKyAgICAJaWYoIGNvbXBvbmVudC5pc0JpbmFyeSgpICkgCisgICAgCQlyZXR1cm4gbmV3IElNb2R1bGVbXXt9OworICAgIAkJCisgICAgCXRyeSB7CisgICAgCQlMaXN0PElNb2R1bGU+IG1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PElNb2R1bGU+KCk7CisJICAgIAlJQ2hpbGRNb2R1bGVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9IGdldEV4cG9ydE1vZGVsQ2hpbGRyZW4oKTsKKwkgICAgCWZvciggaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKysgKSB7CisJICAgIAkJSU1vZHVsZSBjaGlsZCA9IGdhdGhlck1vZHVsZVJlZmVyZW5jZShjb21wb25lbnQsIGNoaWxkcmVuW2ldKTsKKwkgICAgCQlpZiggY2hpbGQgIT0gbnVsbCApCisJICAgIAkJCW1vZHVsZXMuYWRkKGNoaWxkKTsKKwkgICAgCX0KKwkgICAgCXJldHVybiBtb2R1bGVzLnRvQXJyYXkobmV3IElNb2R1bGVbbW9kdWxlcy5zaXplKCldKTsKKyAgICAJfSBjYXRjaCggQ29yZUV4Y2VwdGlvbiBjZSApIHsKKyAgICAJfQorICAgIAlyZXR1cm4gbmV3IElNb2R1bGVbXXt9OworCX0KKyAgICAKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFBhdGgoSU1vZHVsZSBtKSB7CisJCXJldHVybiBnZXRVUkkobSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgVVJJIG9mIHRoZSBnaXZlbiBjb250YWluZWQgQ0hJTEQgbW9kdWxlLgorCSAqIAorCSAqIFNPRlQgcmVxdWlyZW1lbnRzIChOT1QgQVBJISEpIGluIHVzZSBieSBzb21lIGFkb3B0ZXJzCisJICogSWYgdGhlIHBhc3NlZCBpbiBtb2R1bGUgaXMgZXF1YWwgdG8gdGhpcyBtb2R1bGUsIHJldHVybiBvdXIgb3duIGRlcGxveWVkIG5hbWUKKwkgKgorCSAqIEBwYXJhbSBtb2R1bGUgYSBtb2R1bGUKKwkgKiBAcmV0dXJuIHRoZSBVUkkgb2YgdGhlIGdpdmVuIG1vZHVsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIFVSSSBjb3VsZAorCSAqICAgIG5vdCBiZSBmb3VuZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKElNb2R1bGUgbW9kdWxlKSB7CisJCVByb2plY3RNb2R1bGUgbWQgPSAoUHJvamVjdE1vZHVsZSltb2R1bGUubG9hZEFkYXB0ZXIoUHJvamVjdE1vZHVsZS5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCWlmKCBtZCA9PSB0aGlzICkgeworCQkJLy8gZ3Vlc3MgbXkgb3duIG5hbWUKKwkJCXJldHVybiBWaXJ0dWFsUmVmZXJlbmNlVXRpbGl0aWVzLklOU1RBTkNFLmdldERlZmF1bHRQcm9qZWN0QXJjaGl2ZU5hbWUodGhpcy5jb21wb25lbnQpOworCQl9CisJCXRyeSB7CisJCQlGbGF0Q29tcG9uZW50RGVwbG95YWJsZSBjZCA9IChGbGF0Q29tcG9uZW50RGVwbG95YWJsZSltb2R1bGUubG9hZEFkYXB0ZXIoRmxhdENvbXBvbmVudERlcGxveWFibGUuY2xhc3MsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOworCQkJaWYoIGNkICE9IG51bGwgKSB7CisJCSAgICAJSUZsYXRWaXJ0dWFsQ29tcG9uZW50IGVtID0gZ2V0RmxhdENvbXBvbmVudCgpOworCQkgICAgCUlDaGlsZE1vZHVsZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0gZW0uZ2V0Q2hpbGRNb2R1bGVzKCk7CisJCSAgICAJZm9yKCBpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApIHsKKwkJICAgIAkJSU1vZHVsZSBjaGlsZCA9IGdhdGhlck1vZHVsZVJlZmVyZW5jZShjb21wb25lbnQsIGNoaWxkcmVuW2ldKTsKKwkJICAgIAkJaWYoIGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0SWQoKS5lcXVhbHMobW9kdWxlLmdldElkKCkpKQorCQkgICAgCQkJcmV0dXJuIGNoaWxkcmVuW2ldLmdldFJlbGF0aXZlVVJJKCkudG9TdHJpbmcoKTsKKwkJICAgIAl9CisJCQl9CisJCX0gY2F0Y2goIENvcmVFeGNlcHRpb24gY2UgKSB7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorICAgIAorICAgIC8qKgorICAgICAqIElmIEkga25vdyBob3cgdG8gZmluZCBhbiBJTW9kdWxlIGZvciB0aGlzIGNoaWxkLCBkbyBzbyBub3cKKyAgICAgKiAKKyAgICAgKiBJIHdvdWxkIGxvdmUgdG8gc2VlIHRoaXMgcmVwbGFjZWQgd2l0aCBzb21lIEFQSSB0byBsb2NhdGUgYSAKKyAgICAgKiBwb3NzaWJsZSBjaGlsZCBtb2R1bGUgYmFzZWQgb24gYSB2aXJ0dWFsIGNvbXBvbmVudC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50CisgICAgICogQHBhcmFtIHRhcmdldENvbXBvbmVudAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSU1vZHVsZSBnYXRoZXJNb2R1bGVSZWZlcmVuY2UoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBJQ2hpbGRNb2R1bGVSZWZlcmVuY2UgY2hpbGQpIHsKKyAgICAJLy8gSGFuZGxlIHdvcmtzcGFjZSBwcm9qZWN0IG1vZHVsZSBjb21wb25lbnRzCisgICAgCS8vIFN1YmNsYXNzZXMgc2hvdWxkIGV4dGVuZCAKKyAgICAJSVZpcnR1YWxDb21wb25lbnQgdGFyZ2V0Q29tcG9uZW50ID0gY2hpbGQuZ2V0Q29tcG9uZW50KCk7CisgICAgCWlmICh0YXJnZXRDb21wb25lbnQgIT0gbnVsbCAmJiB0YXJnZXRDb21wb25lbnQuZ2V0UHJvamVjdCgpIT0gY29tcG9uZW50LmdldFByb2plY3QoKSkgeworCQkJaWYgKCF0YXJnZXRDb21wb25lbnQuaXNCaW5hcnkoKSkgeworCQkJCXJldHVybiBmaWx0ZXJNb2R1bGVEZWxlZ2F0ZXMoU2VydmVyVXRpbC5nZXRNb2R1bGVzKHRhcmdldENvbXBvbmVudC5nZXRQcm9qZWN0KCkpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCQorICAgIC8qKgorICAgICAqIEFuIGV4dGVuZGVyIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIGNvbnRyb2wgd2hpY2gKKyAgICAgKiBkZWxlZ2F0ZSBpcyByZXR1cm5lZCBpbiB0aGUgc2NlbmFyaW8gd2hlcmUgbW9yZSB0aGFuIG9uZSBleGlzdC4gIEJ5IGRlZmF1bHQKKyAgICAgKiB0aGUgZmlyc3Qgb25lIGZvdW5kIGlzIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBJTW9kdWxlW10gbW9kdWxlcworICAgICAqIEByZXR1cm4gSU1vZHVsZVtdCisgICAgICovCisgICAgcHJvdGVjdGVkIElNb2R1bGUgZmlsdGVyTW9kdWxlRGVsZWdhdGVzKElNb2R1bGVbXSBtb2R1bGVzKSB7CisgICAgCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgeworCQkJTW9kdWxlRGVsZWdhdGUgbWQgPSAoTW9kdWxlRGVsZWdhdGUpbW9kdWxlc1tpXS5sb2FkQWRhcHRlcihNb2R1bGVEZWxlZ2F0ZS5jbGFzcywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCQlpZiAobWQgaW5zdGFuY2VvZiBQcm9qZWN0TW9kdWxlKSB7CisJCQkJcmV0dXJuIG1vZHVsZXNbaV07CisJCQl9CisJCX0KKyAgICAJcmV0dXJuIG1vZHVsZXMubGVuZ3RoID4gMCA/IG1vZHVsZXNbMF0gOiBudWxsOworCX0KKyAgICAKKyAgICAvKgorICAgICAqIEJlbG93IGFyZSBTVEFUSUMgdXRpbGl0eSBjbGFzc2VzIGFuZCBtZXRob2RzCisgICAgICovCisJcHJvdGVjdGVkIHN0YXRpYyBJTW9kdWxlUmVzb3VyY2VbXSBjb252ZXJ0KElGbGF0UmVzb3VyY2VbXSByZXNvdXJjZXMpIHsKKwkJQXJyYXlMaXN0PElNb2R1bGVSZXNvdXJjZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SU1vZHVsZVJlc291cmNlPigpOworCQlmb3IoIGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKyApIHsKKwkJCWlmKCByZXNvdXJjZXNbaV0gaW5zdGFuY2VvZiBJRmxhdEZpbGUpCisJCQkJbGlzdC5hZGQobmV3IENvbXBvbmVudE1vZHVsZUZpbGUocmVzb3VyY2VzW2ldKSk7CisJCQllbHNlIGlmKCByZXNvdXJjZXNbaV0gaW5zdGFuY2VvZiBJRmxhdEZvbGRlcikgCisJCQkJbGlzdC5hZGQobmV3IENvbXBvbmVudE1vZHVsZUZvbGRlcihyZXNvdXJjZXNbaV0pKTsKKwkJfQorCQlyZXR1cm4gbGlzdC50b0FycmF5KG5ldyBJTW9kdWxlUmVzb3VyY2VbbGlzdC5zaXplKCldKTsKKwl9CisJCisJcHVibGljIHN0YXRpYyBjbGFzcyBDb21wb25lbnRNb2R1bGVSZXNvdXJjZSB7CisJCXByb3RlY3RlZCBJRmxhdFJlc291cmNlIGRlbGVnYXRlOworCQlwdWJsaWMgQ29tcG9uZW50TW9kdWxlUmVzb3VyY2UoSUZsYXRSZXNvdXJjZSByZXNvdXJjZSkgeworCQkJdGhpcy5kZWxlZ2F0ZSA9IHJlc291cmNlOworCQl9CisJCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCkgeworCQkJcmV0dXJuICgoSUZsYXRGaWxlKWRlbGVnYXRlKS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOworCQl9CisJCQorCQlwdWJsaWMgSVBhdGggZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkgeworCQkJcmV0dXJuIGRlbGVnYXRlLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpOworCQl9CisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiBkZWxlZ2F0ZS5nZXROYW1lKCk7CisJCX0KKwkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKKwkJCXJldHVybiBkZWxlZ2F0ZS5nZXRBZGFwdGVyKGFkYXB0ZXIpOworCQl9CisJCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzKCkgeworCQkJSUZsYXRSZXNvdXJjZVtdIGNoaWxkcmVuID0gKChJRmxhdEZvbGRlcilkZWxlZ2F0ZSkubWVtYmVycygpOworCQkJcmV0dXJuIGNvbnZlcnQoY2hpbGRyZW4pOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBjbGFzcyBDb21wb25lbnRNb2R1bGVGaWxlIGV4dGVuZHMgQ29tcG9uZW50TW9kdWxlUmVzb3VyY2UgaW1wbGVtZW50cyBJTW9kdWxlRmlsZXsKKwkJcHVibGljIENvbXBvbmVudE1vZHVsZUZpbGUoSUZsYXRSZXNvdXJjZSByZXNvdXJjZSkgeworCQkJc3VwZXIocmVzb3VyY2UpOworCQl9CisJCQorCQlAT3ZlcnJpZGUKKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKwkJCWlmIChvYmogPT0gdGhpcykKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQorCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSU1vZHVsZUZpbGUpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCQorCQkJSU1vZHVsZUZpbGUgbWYgPSAoSU1vZHVsZUZpbGUpIG9iajsKKwkJCWlmICghZ2V0TmFtZSgpLmVxdWFscyhtZi5nZXROYW1lKCkpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWlmICghZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkuZXF1YWxzKG1mLmdldE1vZHVsZVJlbGF0aXZlUGF0aCgpKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQkKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCQlyZXR1cm4gZ2V0TmFtZSgpLmhhc2hDb2RlKCkgKiAzNyArIGdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLmhhc2hDb2RlKCk7CisJCX0KKwl9CisKKwlwdWJsaWMgc3RhdGljIGNsYXNzIENvbXBvbmVudE1vZHVsZUZvbGRlciBleHRlbmRzIENvbXBvbmVudE1vZHVsZVJlc291cmNlIGltcGxlbWVudHMgSU1vZHVsZUZvbGRlciB7CisJCXB1YmxpYyBDb21wb25lbnRNb2R1bGVGb2xkZXIoSUZsYXRSZXNvdXJjZSByZXNvdXJjZSkgeworCQkJc3VwZXIocmVzb3VyY2UpOworCQl9CisKKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisJCQlpZiAob2JqID09IHRoaXMpCisJCQkJcmV0dXJuIHRydWU7CisJCQkKKwkJCWlmICghKG9iaiBpbnN0YW5jZW9mIElNb2R1bGVGb2xkZXIpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCQorCQkJSU1vZHVsZUZvbGRlciBtZiA9IChJTW9kdWxlRm9sZGVyKSBvYmo7CisJCQlpZiAoIWdldE5hbWUoKS5lcXVhbHMobWYuZ2V0TmFtZSgpKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlpZiAoIWdldE1vZHVsZVJlbGF0aXZlUGF0aCgpLmVxdWFscyhtZi5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKSkpCisJCQkJcmV0dXJuIGZhbHNlOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQkJcmV0dXJuIGdldE5hbWUoKS5oYXNoQ29kZSgpICogMzcgKyBnZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS5oYXNoQ29kZSgpOworCQl9CisJCQorCX0KKworCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1Byb2plY3RPZlR5cGUoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHR5cGVJRCkgeworCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBudWxsOworCQl0cnkgeworCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7CisJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCQorCQlpZiAoZmFjZXRlZFByb2plY3QgIT1udWxsICYmIFByb2plY3RGYWNldHNNYW5hZ2VyLmlzUHJvamVjdEZhY2V0RGVmaW5lZCh0eXBlSUQpKSB7CisJCQlJUHJvamVjdEZhY2V0IHByb2plY3RGYWNldCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCh0eXBlSUQpOworCQkJcmV0dXJuIHByb2plY3RGYWNldCE9bnVsbCAmJiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGUuamF2YSBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9TdGF0aWNXZWJEZXBsb3lhYmxlLmphdmEKaW5kZXggOTg3MjA3Ny4uYThlMGI5YSAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGUuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZS5qYXZhCkBAIC0xMywxNyArMTMsMTQgQEAKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsLklTdGF0aWNXZWI7CiAKLXB1YmxpYyBjbGFzcyBTdGF0aWNXZWJEZXBsb3lhYmxlIGV4dGVuZHMgQ29tcG9uZW50RGVwbG95YWJsZSBpbXBsZW1lbnRzIElTdGF0aWNXZWIgeworcHVibGljIGNsYXNzIFN0YXRpY1dlYkRlcGxveWFibGUgZXh0ZW5kcyBGbGF0Q29tcG9uZW50RGVwbG95YWJsZSBpbXBsZW1lbnRzIElTdGF0aWNXZWIgewogCiAJcHVibGljIFN0YXRpY1dlYkRlcGxveWFibGUoSVByb2plY3QgcHJvamVjdCwgSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7CiAJCXN1cGVyKHByb2plY3QpOwpAQCAtMzYsMjAgKzMzLDIxIEBACiAJICAgIHJldHVybiBjb21wb25lbnQuZ2V0TmFtZSgpOwogICAgIH0KIAkKLQkgcHVibGljIFN0cmluZyBnZXRVUkkoSU1vZHVsZSBtb2R1bGUpIHsKLQkgICAgSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KG1vZHVsZS5nZXRQcm9qZWN0KCkpOwotCSAgICBTdHJpbmcgYVVSSSA9IG51bGw7Ci0JICAgIGlmIChjb21wICE9bnVsbCkgewotCSAgICAJaWYgKCFjb21wLmlzQmluYXJ5KCkgJiYgaXNQcm9qZWN0T2ZUeXBlKG1vZHVsZS5nZXRQcm9qZWN0KCksSU1vZHVsZUNvbnN0YW50cy5XU1RfV0VCX01PRFVMRSkpIHsKLSAgICAgICAgCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNlKGNvbXAuZ2V0TmFtZSgpKTsKLSAgICAgICAgCQlhVVJJID0gcmVmLmdldFJ1bnRpbWVQYXRoKCkuYXBwZW5kKGNvbXAuZ2V0TmFtZSgpKyIud2FyIikudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAJfQotCSAgICB9Ci0JICAgIAkKLSAgICAJaWYgKGFVUkkgIT1udWxsICYmIGFVUkkubGVuZ3RoKCk+MSAmJiBhVVJJLnN0YXJ0c1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotICAgIAkJYVVSSSA9IGFVUkkuc3Vic3RyaW5nKDEpOwotICAgIAlyZXR1cm4gYVVSSTsKLQkgfQorCS8qIFRPRE8gVGhpcyBpcyBuZXZlciBjYWxsZWQgPz8gKi8KKy8vCSBwdWJsaWMgU3RyaW5nIGdldFVSSShJTW9kdWxlIG1vZHVsZSkgeworLy8JICAgIElWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChtb2R1bGUuZ2V0UHJvamVjdCgpKTsKKy8vCSAgICBTdHJpbmcgYVVSSSA9IG51bGw7CisvLwkgICAgaWYgKGNvbXAgIT1udWxsKSB7CisvLwkgICAgCWlmICghY29tcC5pc0JpbmFyeSgpICYmIGlzUHJvamVjdE9mVHlwZShtb2R1bGUuZ2V0UHJvamVjdCgpLElNb2R1bGVDb25zdGFudHMuV1NUX1dFQl9NT0RVTEUpKSB7CisvLyAgICAgICAgCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBjb21wb25lbnQuZ2V0UmVmZXJlbmNlKGNvbXAuZ2V0TmFtZSgpKTsKKy8vICAgICAgICAJCWFVUkkgPSByZWYuZ2V0UnVudGltZVBhdGgoKS5hcHBlbmQoY29tcC5nZXROYW1lKCkrIi53YXIiKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCisvLyAgICAgICAgCX0KKy8vCSAgICB9CisvLwkgICAgCQorLy8gICAgCWlmIChhVVJJICE9bnVsbCAmJiBhVVJJLmxlbmd0aCgpPjEgJiYgYVVSSS5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKKy8vICAgIAkJYVVSSSA9IGFVUkkuc3Vic3RyaW5nKDEpOworLy8gICAgCXJldHVybiBhVVJJOworLy8JIH0KIAkgCiAJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewogCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBudWxsOwpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVGYWN0b3J5LmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZUZhY3RvcnkuamF2YQppbmRleCBhNTBkNTNlLi40YzRjNmYwIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZUZhY3RvcnkuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZGVwbG95YWJsZXMvU3RhdGljV2ViRGVwbG95YWJsZUZhY3RvcnkuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Nb2R1bGVDb3JlTmF0dXJlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwpAQCAtMjksNiArMjgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5tb2RlbC5Nb2R1bGVEZWxlZ2F0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUudXRpbC5Qcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIuaW50ZXJuYWwuV1NUV2ViUGx1Z2luOwogCiBwdWJsaWMgY2xhc3MgU3RhdGljV2ViRGVwbG95YWJsZUZhY3RvcnkgZXh0ZW5kcyBQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LndlYi5pbnRlcm5hbC5kZXBsb3lhYmxlcy5zdGF0aWMiOyAvLyROT04tTkxTLTEkCkBAIC03Nyw2ICs3Nyw3IEBACiAJICogCiAJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuTW9kdWxlRmFjdG9yeURlbGVnYXRlI2dldE1vZHVsZURlbGVnYXRlKG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlKQogCSAqLworCUBPdmVycmlkZQogCXB1YmxpYyBNb2R1bGVEZWxlZ2F0ZSBnZXRNb2R1bGVEZWxlZ2F0ZShJTW9kdWxlIG1vZHVsZSkgewogCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2R1bGVEZWxlZ2F0ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CiAJCQlNb2R1bGVEZWxlZ2F0ZSBlbGVtZW50ID0gKE1vZHVsZURlbGVnYXRlKSBpdGVyLm5leHQoKTsKQEAgLTg3LDEzICs4OCwxNCBAQAogCiAJfQogCisJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIElNb2R1bGVbXSBjcmVhdGVNb2R1bGVzKElQcm9qZWN0IHByb2plY3QpIHsKIAkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7CiAJCWlmKGNvbXBvbmVudCAhPSBudWxsKXsKIAkJCXRyeSB7CiAJCQkJcmV0dXJuIGNyZWF0ZU1vZHVsZURlbGVnYXRlcyhjb21wb25lbnQpOwogCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLndyaXRlKGUpOworCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcihlKTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gbnVsbDsKQEAgLTExMiw3ICsxMTQsNyBAQAogCQkJCW1vZHVsZURlbGVnYXRlLmluaXRpYWxpemUobW9kdWxlKTsKIAkJCX0KIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS53cml0ZShlKTsKKwkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcihlKTsKIAkJfSBmaW5hbGx5IHsKIAkJCWlmIChtb2R1bGUgIT0gbnVsbCkgewogCQkJCWlmIChnZXRNb2R1bGVEZWxlZ2F0ZShtb2R1bGUpID09IG51bGwpCkBAIC0xMzEsNiArMTMzLDcgQEAKIAkgKgogCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBwYXRocwogCSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBJUGF0aFtdIGdldExpc3RlbmVyUGF0aHMoKSB7CiAJCXJldHVybiBuZXcgSVBhdGhbXSB7CiAJCQluZXcgUGF0aCgiLnByb2plY3QiKSwgLy8gbmF0dXJlIC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9kZXBsb3lhYmxlcy9TdGF0aWNXZWJEZXBsb3lhYmxlT2JqZWN0QWRhcHRlci5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyLmphdmEKaW5kZXggZjI5OTM4ZS4uYjRlZDZhZCAxMDA2NDQKLS0tIGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyLmphdmEKKysrIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2RlcGxveWFibGVzL1N0YXRpY1dlYkRlcGxveWFibGVPYmplY3RBZGFwdGVyLmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIAkJcmV0dXJuIG5ldyBDbGFzc1tde0lTdGF0aWNXZWJNb2R1bGVBcnRpZmFjdC5jbGFzc307CiAJfQogCisJQE92ZXJyaWRlCiAJcHVibGljIElNb2R1bGVBcnRpZmFjdCBnZXRNb2R1bGVBcnRpZmFjdChPYmplY3Qgb2JqKSB7CiAJCXJldHVybiBTdGF0aWNXZWJEZXBsb3lhYmxlT2JqZWN0QWRhcHRlclV0aWwuZ2V0TW9kdWxlT2JqZWN0KG9iaik7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2ZhY2V0L01hcHBpbmdEZXNjcmlwdG9yLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZmFjZXQvTWFwcGluZ0Rlc2NyaXB0b3IuamF2YQppbmRleCBhMzQ5MDQyLi44YjVmM2M1IDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZmFjZXQvTWFwcGluZ0Rlc2NyaXB0b3IuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZmFjZXQvTWFwcGluZ0Rlc2NyaXB0b3IuamF2YQpAQCAtMzgsMTkgKzM4LDIwIEBACiAJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShSdW50aW1lUHJlc2V0TWFwcGluZ1JlZ2lzdHJ5LkFUVFJJQlVURV9QUkVTRVRfSUQpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmLmFwcGVuZCgiaWQ6Iik7CisJCWJ1ZmYuYXBwZW5kKCJpZDoiKTsgLy8kTk9OLU5MUy0xJAogCQlidWZmLmFwcGVuZChnZXRJRCgpKTsKLQkJYnVmZi5hcHBlbmQoIiBmYWNldFJ1bnRpbWVUeXBlSUQ6Iik7CisJCWJ1ZmYuYXBwZW5kKCIgZmFjZXRSdW50aW1lVHlwZUlEOiIpOyAvLyROT04tTkxTLTEkCiAJCWJ1ZmYuYXBwZW5kKGdldEZhY2V0UnVudGltZVR5cGVJRCgpKTsKLQkJYnVmZi5hcHBlbmQoIiBmYWNldFJ1bnRpbWVWZXJzaW9uOiIpOworCQlidWZmLmFwcGVuZCgiIGZhY2V0UnVudGltZVZlcnNpb246Iik7IC8vJE5PTi1OTFMtMSQKIAkJYnVmZi5hcHBlbmQoZ2V0RmFjZXRSdW50aW1lVmVyc2lvbigpKTsKLQkJYnVmZi5hcHBlbmQoIiBmYWNldElEOiIpOworCQlidWZmLmFwcGVuZCgiIGZhY2V0SUQ6Iik7IC8vJE5PTi1OTFMtMSQKIAkJYnVmZi5hcHBlbmQoZ2V0RmFjZXRJRCgpKTsKLQkJYnVmZi5hcHBlbmQoIiBmYWNldFZlcnNpb246Iik7CisJCWJ1ZmYuYXBwZW5kKCIgZmFjZXRWZXJzaW9uOiIpOyAvLyROT04tTkxTLTEkCiAJCWJ1ZmYuYXBwZW5kKGdldEZhY2V0VmVyc2lvbigpKTsKLQkJYnVmZi5hcHBlbmQoIiBwcmVzZXRJRDoiKTsKKwkJYnVmZi5hcHBlbmQoIiBwcmVzZXRJRDoiKTsgLy8kTk9OLU5MUy0xJAogCQlidWZmLmFwcGVuZChnZXRQcmVzZXRJRCgpKTsKIAkJcmV0dXJuIGJ1ZmYudG9TdHJpbmcoKTsKIAl9CmRpZmYgLS1naXQgYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZmFjZXQvUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeS5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL2ZhY2V0L1J1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnkuamF2YQppbmRleCA4MzczMjI1Li5iMmJjZDBiIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvZmFjZXQvUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeS5qYXZhCisrKyBiL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9mYWNldC9SdW50aW1lUHJlc2V0TWFwcGluZ1JlZ2lzdHJ5LmphdmEKQEAgLTE4LDIxICsxOCwyMSBAQAogCiBwdWJsaWMgY2xhc3MgUnVudGltZVByZXNldE1hcHBpbmdSZWdpc3RyeSB7CiAKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVCA9ICJydW50aW1lUHJlc2V0TWFwcGluZ3MiOworCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UID0gInJ1bnRpbWVQcmVzZXRNYXBwaW5ncyI7IC8vJE5PTi1OTFMtMSQKIAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9NQVBQSU5HID0gIm1hcHBpbmciOworCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9NQVBQSU5HID0gIm1hcHBpbmciOyAvLyROT04tTkxTLTEkCiAKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9JRCA9ICJpZCI7CisJc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCiAKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9GQUNFVF9SVU5USU1FX1RZUEVfSUQgPSAiZmFjZXRSdW50aW1lVHlwZUlEIjsKKwlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9GQUNFVF9SVU5USU1FX1RZUEVfSUQgPSAiZmFjZXRSdW50aW1lVHlwZUlEIjsgLy8kTk9OLU5MUy0xJAogCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfRkFDRVRfUlVOVElNRV9WRVJTSU9OID0gImZhY2V0UnVudGltZVZlcnNpb24iOworCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0ZBQ0VUX1JVTlRJTUVfVkVSU0lPTiA9ICJmYWNldFJ1bnRpbWVWZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAogCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfRkFDRVRfSUQgPSAiZmFjZXRJRCI7CisJc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfRkFDRVRfSUQgPSAiZmFjZXRJRCI7IC8vJE5PTi1OTFMtMSQKIAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0ZBQ0VUX1ZFUlNJT04gPSAiZmFjZXRWZXJzaW9uIjsKKwlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9GQUNFVF9WRVJTSU9OID0gImZhY2V0VmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKIAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1BSRVNFVF9JRCA9ICJwcmVzZXRJRCI7CisJc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfUFJFU0VUX0lEID0gInByZXNldElEIjsgLy8kTk9OLU5MUy0xJAogCiAJcHVibGljIHN0YXRpYyBSdW50aW1lUHJlc2V0TWFwcGluZ1JlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IFJ1bnRpbWVQcmVzZXRNYXBwaW5nUmVnaXN0cnkoKTsKIApAQCAtNjYsMTQgKzY2LDE0IEBACiAJICogQHJldHVybgogCSAqLwogCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgdmFsdWUsIFN0cmluZyBwYXR0ZXJuKXsKLQkJU3RyaW5nVG9rZW5pemVyIHN0clRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0dGVybiwgIiwiKTsKKwkJU3RyaW5nVG9rZW5pemVyIHN0clRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0dGVybiwgIiwiKTsgLy8kTk9OLU5MUy0xJAogCQl3aGlsZShzdHJUb2suaGFzTW9yZVRva2VucygpKXsKIAkJCVN0cmluZyBzaW1wbGVQYXR0ZXJuID0gc3RyVG9rLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWlmKHNpbXBsZVBhdHRlcm4uc3RhcnRzV2l0aCgiKiIpKXsKKwkJCWlmKHNpbXBsZVBhdHRlcm4uc3RhcnRzV2l0aCgiKiIpKXsgLy8kTk9OLU5MUy0xJAogCQkJCWlmKHNpbXBsZVBhdHRlcm4ubGVuZ3RoKCkgPCAyKXsKIAkJCQkJcmV0dXJuIHRydWU7IC8vIGkuZS4gKgogCQkJCX0KLQkJCQlpZihzaW1wbGVQYXR0ZXJuLmVuZHNXaXRoKCIqIikpeworCQkJCWlmKHNpbXBsZVBhdHRlcm4uZW5kc1dpdGgoIioiKSl7IC8vJE5PTi1OTFMtMSQKIAkJCQkJaWYoc2ltcGxlUGF0dGVybi5sZW5ndGgoKSA8IDMpeyAKIAkJCQkJCXJldHVybiB0cnVlOyAvLyBpLmUuICoqCiAJCQkJCX0KQEAgLTg1LDcgKzg1LDcgQEAKIAkJCQkJCXJldHVybiB0cnVlOwogCQkJCQl9CiAJCQkJfQotCQkJfSBlbHNlIGlmKHNpbXBsZVBhdHRlcm4uZW5kc1dpdGgoIioiKSl7CisJCQl9IGVsc2UgaWYoc2ltcGxlUGF0dGVybi5lbmRzV2l0aCgiKiIpKXsgLy8kTk9OLU5MUy0xJAogCQkJCWlmKHZhbHVlLnN0YXJ0c1dpdGgoc2ltcGxlUGF0dGVybi5zdWJzdHJpbmcoMCwgc2ltcGxlUGF0dGVybi5sZW5ndGgoKS0yKSkpewogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCQl9CkBAIC05OCwxMCArOTgsMTAgQEAKIAkKIAlwcml2YXRlIHN0YXRpYyBMaXN0IDxTdHJpbmc+IGdldFN0YXRpY1Rva2VucyhTdHJpbmcgcGF0dGVybil7CiAJCUxpc3QgPFN0cmluZz4gc3RhdGljVG9rZW5zID0gbmV3IEFycmF5TGlzdCA8U3RyaW5nPiAoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0clRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0dGVybiwgIiwiKTsKKwkJU3RyaW5nVG9rZW5pemVyIHN0clRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0dGVybiwgIiwiKTsgLy8kTk9OLU5MUy0xJAogCQl3aGlsZShzdHJUb2suaGFzTW9yZVRva2VucygpKXsKIAkJCVN0cmluZyBzaW1wbGVQYXR0ZXJuID0gc3RyVG9rLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWlmKCFzaW1wbGVQYXR0ZXJuLnN0YXJ0c1dpdGgoIioiKSAmJiAhc2ltcGxlUGF0dGVybi5lbmRzV2l0aCgiKiIpKXsKKwkJCWlmKCFzaW1wbGVQYXR0ZXJuLnN0YXJ0c1dpdGgoIioiKSAmJiAhc2ltcGxlUGF0dGVybi5lbmRzV2l0aCgiKiIpKXsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJc3RhdGljVG9rZW5zLmFkZChzaW1wbGVQYXR0ZXJuKTsKIAkJCX0KIAkJfQpAQCAtMTIwLDEzICsxMjAsMTMgQEAKIAkJCWlmIChFTEVNRU5UX01BUFBJTkcuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewogCQkJCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9JRCk7CiAJCQkJaWYgKG51bGwgPT0gaWQgfHwgaWQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFeHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQgKyAiIEVsZW1lbnQ6ICIgKyBFTEVNRU5UX01BUFBJTkcgKyAiIGlzIG1pc3NpbmcgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfSUQpOworCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgaXMgbWlzc2luZyBhdHRyaWJ1dGUgIiArIEFUVFJJQlVURV9JRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAogCQkJCVN0cmluZyBydW50aW1lSUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfRkFDRVRfUlVOVElNRV9UWVBFX0lEKTsKIAkJCQlpZiAobnVsbCA9PSBydW50aW1lSUQgfHwgcnVudGltZUlELnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBpcyBtaXNzaW5nIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX0ZBQ0VUX1JVTlRJTUVfVFlQRV9JRCk7CisJCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBpcyBtaXNzaW5nIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX0ZBQ0VUX1JVTlRJTUVfVFlQRV9JRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIApAQCAtMTM5LDEzICsxMzksMTMgQEAKIAkJCQkJCQlzdGF0aWNSdW50aW1lVHlwZXMuYWRkKHJ1bnRpbWVUeXBlKTsKIAkJCQkJCX0KIAkJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBkZWZpbmVkIGludmFsaWQgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfRkFDRVRfUlVOVElNRV9UWVBFX0lEICsgIjogIiArIHJ1bnRpbWVJRCArIiB1bmFibGUgdG8gcmVzb2x2ZSBydW50aW1lOiAiK3N0YXRpY1J1bnRpbWVJRCwgZSk7CisJCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgZGVmaW5lZCBpbnZhbGlkIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX0ZBQ0VUX1JVTlRJTUVfVFlQRV9JRCArICI6ICIgKyBydW50aW1lSUQgKyIgdW5hYmxlIHRvIHJlc29sdmUgcnVudGltZTogIitzdGF0aWNSdW50aW1lSUQsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKIAkJCQkJfQogCQkJCX0KIAkJCQkJCiAJCQkJU3RyaW5nIHJ1bnRpbWVWZXJzaW9uU3RyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX0ZBQ0VUX1JVTlRJTUVfVkVSU0lPTik7CiAJCQkJaWYgKG51bGwgPT0gcnVudGltZVZlcnNpb25TdHIgfHwgcnVudGltZVZlcnNpb25TdHIudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFeHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQgKyAiIEVsZW1lbnQ6ICIgKyBFTEVNRU5UX01BUFBJTkcgKyAiIGlzIG1pc3NpbmcgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfRkFDRVRfUlVOVElNRV9WRVJTSU9OKTsKKwkJCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFeHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQgKyAiIEVsZW1lbnQ6ICIgKyBFTEVNRU5UX01BUFBJTkcgKyAiIGlzIG1pc3NpbmcgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfRkFDRVRfUlVOVElNRV9WRVJTSU9OKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCWlmKCFzdGF0aWNSdW50aW1lVHlwZXMuaXNFbXB0eSgpKXsKQEAgLTE1NSwyNiArMTU1LDI2IEBACiAJCQkJCQlmb3IoaW50IGs9MDtrPHN0YXRpY1J1bnRpbWVUeXBlcy5zaXplKCkgJiYgIWZvdW5kVmVyc2lvbjtrKyspewogCQkJCQkJCUlSdW50aW1lQ29tcG9uZW50VHlwZSBydW50aW1lVHlwZSA9IHN0YXRpY1J1bnRpbWVUeXBlcy5nZXQoayk7CiAJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uIHZlcnNpb24gPSBydW50aW1lVHlwZS5nZXRWZXJzaW9uKHN0YXRpY1ZlcnNpb24pOworCQkJCQkJCQlydW50aW1lVHlwZS5nZXRWZXJzaW9uKHN0YXRpY1ZlcnNpb24pOwogCQkJCQkJCQlmb3VuZFZlcnNpb24gPSB0cnVlOwogCQkJCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAJCQkJCQkJCS8vZWF0IGl0CiAJCQkJCQkJfQogCQkJCQkJfQogCQkJCQkJaWYoIWZvdW5kVmVyc2lvbil7Ci0JCQkJCQkJU3RyaW5nQnVmZmVyIHZhbGlkVmVyc2lvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKCIgdmFsaWQgdmVyc2lvbnMgaW5jbHVkZTogIik7CisJCQkJCQkJU3RyaW5nQnVmZmVyIHZhbGlkVmVyc2lvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKCIgdmFsaWQgdmVyc2lvbnMgaW5jbHVkZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCQlmb3IoSVJ1bnRpbWVDb21wb25lbnRUeXBlIHJ1bnRpbWVUeXBlIDogc3RhdGljUnVudGltZVR5cGVzKSB7Ci0JCQkJCQkJCXZhbGlkVmVyc2lvbnMuYXBwZW5kKCJcbiIpOworCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZChydW50aW1lVHlwZS5nZXRJZCgpKTsKLQkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoIjogIik7CisJCQkJCQkJCXZhbGlkVmVyc2lvbnMuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJCWZvciAoSXRlcmF0b3I8SVJ1bnRpbWVDb21wb25lbnRWZXJzaW9uPiBpdGVyYXRvciA9IHJ1bnRpbWVUeXBlLmdldFZlcnNpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewogCQkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoaXRlcmF0b3IubmV4dCgpLmdldFZlcnNpb25TdHJpbmcoKSk7CiAJCQkJCQkJCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoIiAiKTsKKwkJCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJCQl9CiAJCQkJCQkJCX0KIAkJCQkJCQl9Ci0JCQkJCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFeHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQgKyAiIEVsZW1lbnQ6ICIgKyBFTEVNRU5UX01BUFBJTkcgKyAiIGRlZmluZWQgaW52YWxpZCBhdHRyaWJ1dGUgIiArIEFUVFJJQlVURV9GQUNFVF9SVU5USU1FX1ZFUlNJT04gKyAiOiAiICsgc3RhdGljVmVyc2lvbgorCQkJCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBkZWZpbmVkIGludmFsaWQgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfRkFDRVRfUlVOVElNRV9WRVJTSU9OICsgIjogIiArIHN0YXRpY1ZlcnNpb24gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAogCQkJCQkJCQkJKyB2YWxpZFZlcnNpb25zKTsKIAkJCQkJCX0KIAkJCQkJfQpAQCAtMTgyLDcgKzE4Miw3IEBACiAJCQkJCiAJCQkJU3RyaW5nIGZhY2V0SUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSSUJVVEVfRkFDRVRfSUQpOwogCQkJCWlmIChudWxsID09IGZhY2V0SUQgfHwgZmFjZXRJRC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgaXMgbWlzc2luZyBhdHRyaWJ1dGUgIiArIEFUVFJJQlVURV9GQUNFVF9JRCk7CisJCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBpcyBtaXNzaW5nIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX0ZBQ0VUX0lEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCQpAQCAtMTk1LDEzICsxOTUsMTMgQEAKIAkJCQkJCQlzdGF0aWNGYWNldHMuYWRkKGZhY2V0KTsKIAkJCQkJCX0KIAkJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBkZWZpbmVkIGludmFsaWQgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfRkFDRVRfSUQgKyAiOiAiICsgc3RhdGljRmFjZXRJRCwgZSk7CisJCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgZGVmaW5lZCBpbnZhbGlkIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX0ZBQ0VUX0lEICsgIjogIiArIHN0YXRpY0ZhY2V0SUQsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCiAJCQkJCX0KIAkJCQl9CiAJCQkJCiAJCQkJU3RyaW5nIGZhY2V0VmVyc2lvblN0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9GQUNFVF9WRVJTSU9OKTsKIAkJCQlpZiAobnVsbCA9PSBmYWNldFZlcnNpb25TdHIgfHwgZmFjZXRWZXJzaW9uU3RyLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBpcyBtaXNzaW5nIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX0ZBQ0VUX1ZFUlNJT04pOworCQkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCArICIgRWxlbWVudDogIiArIEVMRU1FTlRfTUFQUElORyArICIgaXMgbWlzc2luZyBhdHRyaWJ1dGUgIiArIEFUVFJJQlVURV9GQUNFVF9WRVJTSU9OKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAkJCQkJY29udGludWU7CiAJCQkJfQogCQkJCUxpc3QgPFN0cmluZz5zdGF0aWNGYWNldFZlcnNpb25TdHJzID0gZ2V0U3RhdGljVG9rZW5zKGZhY2V0VmVyc2lvblN0cik7CkBAIC0yMjAsMTkgKzIyMCwxOSBAQAogCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJCWlmKCFmb3VuZEZhY2V0VmVyc2lvbil7Ci0JCQkJCQkJU3RyaW5nQnVmZmVyIHZhbGlkVmVyc2lvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKCIgdmFsaWQgdmVyc2lvbnMgaW5jbHVkZTogIik7CisJCQkJCQkJU3RyaW5nQnVmZmVyIHZhbGlkVmVyc2lvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKCIgdmFsaWQgdmVyc2lvbnMgaW5jbHVkZTogIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCQlmb3IoSVByb2plY3RGYWNldCBzdGF0aWNGYWNldDpzdGF0aWNGYWNldHMpewotCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZCgiXG4iKTsKKwkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKIAkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoc3RhdGljRmFjZXQuZ2V0SWQoKSk7Ci0JCQkJCQkJCXZhbGlkVmVyc2lvbnMuYXBwZW5kKCI6ICIpOworCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAogCQkJCQkJCQlmb3IgKEl0ZXJhdG9yPElQcm9qZWN0RmFjZXRWZXJzaW9uPiBpdGVyYXRvciA9IHN0YXRpY0ZhY2V0LmdldFZlcnNpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewogCQkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoaXRlcmF0b3IubmV4dCgpLmdldFZlcnNpb25TdHJpbmcoKSk7CiAJCQkJCQkJCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCQkJdmFsaWRWZXJzaW9ucy5hcHBlbmQoIiAiKTsKKwkJCQkJCQkJCQl2YWxpZFZlcnNpb25zLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQkJCQl9CiAJCQkJCQkJCX0KIAkJCQkJCQl9Ci0JCQkJCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFeHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQgKyAiIEVsZW1lbnQ6ICIgKyBFTEVNRU5UX01BUFBJTkcgKyAiIGRlZmluZWQgaW52YWxpZCBhdHRyaWJ1dGUgIiArIEFUVFJJQlVURV9GQUNFVF9WRVJTSU9OICsgIjogIiArIHN0YXRpY0ZhY2V0VmVyc2lvbgorCQkJCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBkZWZpbmVkIGludmFsaWQgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfRkFDRVRfVkVSU0lPTiArICI6ICIgKyBzdGF0aWNGYWNldFZlcnNpb24gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAogCQkJCQkJCQkJKyB2YWxpZFZlcnNpb25zKTsKIAkJCQkJCQljb250aW51ZTsKIAkJCQkJCX0KQEAgLTI0MCwyMCArMjQwLDIwIEBACiAJCQkJfQogCQkJCVN0cmluZyBwcmVzZXRJRCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9QUkVTRVRfSUQpOwogCQkJCWlmIChudWxsID09IHByZXNldElEIHx8IHByZXNldElELnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBpcyBtaXNzaW5nIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX1BSRVNFVF9JRCk7CisJCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBpcyBtaXNzaW5nIGF0dHJpYnV0ZSAiICsgQVRUUklCVVRFX1BSRVNFVF9JRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAkJCQl0cnkgewogCQkJCQlQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcmVzZXQocHJlc2V0SUQpOwogCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRXh0ZW5zaW9uOiAiICsgRVhURU5TSU9OX1BPSU5UICsgIiBFbGVtZW50OiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiBkZWZpbmVkIGludmFsaWQgYXR0cmlidXRlICIgKyBBVFRSSUJVVEVfUFJFU0VUX0lEICsgIjogIiArIHByZXNldElELCBlKTsKKwkJCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFeHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQgKyAiIEVsZW1lbnQ6ICIgKyBFTEVNRU5UX01BUFBJTkcgKyAiIGRlZmluZWQgaW52YWxpZCBhdHRyaWJ1dGUgIiArIEFUVFJJQlVURV9QUkVTRVRfSUQgKyAiOiAiICsgcHJlc2V0SUQsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAkJCQlNYXBwaW5nRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IE1hcHBpbmdEZXNjcmlwdG9yKGVsZW1lbnQpOwogCQkJCWRlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKIAkJCX0gZWxzZSB7Ci0JCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFbGVtZW50cyBtdXN0IGJlIG5hbWVkOiAiICsgRUxFTUVOVF9NQVBQSU5HICsgIiB3aXRoaW4gdGhlIGV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCk7Ci0JCQkJV1NUV2ViUGx1Z2luLmxvZ0Vycm9yKCJFbGVtZW50OiAiICsgZWxlbWVudC5nZXROYW1lKCkgKyAiIGlzIGludmFsaWQgd2l0aGluIHRoZSBleHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQpOworCQkJCVdTVFdlYlBsdWdpbi5sb2dFcnJvcigiRWxlbWVudHMgbXVzdCBiZSBuYW1lZDogIiArIEVMRU1FTlRfTUFQUElORyArICIgd2l0aGluIHRoZSBleHRlbnNpb246ICIgKyBFWFRFTlNJT05fUE9JTlQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQlXU1RXZWJQbHVnaW4ubG9nRXJyb3IoIkVsZW1lbnQ6ICIgKyBlbGVtZW50LmdldE5hbWUoKSArICIgaXMgaW52YWxpZCB3aXRoaW4gdGhlIGV4dGVuc2lvbjogIiArIEVYVEVOU0lPTl9QT0lOVCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL29wZXJhdGlvbi9XZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL1dlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQppbmRleCA5MGFhZmY0Li5iNjAyZjVhIDEwMDY0NAotLS0gYS9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL1dlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL1dlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpAQCAtMjksNiArMjksNyBAQAogCQlzdXBlcigpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBTZXQgZ2V0UHJvcGVydHlOYW1lcygpIHsKIAkJU2V0IG5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwogCQluYW1lcy5hZGQoUFJPSkVDVCk7CkBAIC0zNiw2ICszNyw3IEBACiAJCXJldHVybiBuYW1lczsKIAl9CiAJCisJQE92ZXJyaWRlCiAJcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKIAkJcmV0dXJuIG5ldyBXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZU9wZXJhdGlvbihtb2RlbCk7CiAJfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL29wZXJhdGlvbi9XZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZU9wZXJhdGlvbi5qYXZhIGIvcGx1Z2lucy9vcmcuZWNsaXBzZS53c3Qud2ViL3N0YXRpY193ZWJfcHJvamVjdC9vcmcvZWNsaXBzZS93c3Qvd2ViL2ludGVybmFsL29wZXJhdGlvbi9XZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZU9wZXJhdGlvbi5qYXZhCmluZGV4IDY3MWFlMmMuLjcxYWI2ZTkgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LndlYi9zdGF0aWNfd2ViX3Byb2plY3Qvb3JnL2VjbGlwc2Uvd3N0L3dlYi9pbnRlcm5hbC9vcGVyYXRpb24vV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVPcGVyYXRpb24uamF2YQorKysgYi9wbHVnaW5zL29yZy5lY2xpcHNlLndzdC53ZWIvc3RhdGljX3dlYl9wcm9qZWN0L29yZy9lY2xpcHNlL3dzdC93ZWIvaW50ZXJuYWwvb3BlcmF0aW9uL1dlYlByb2plY3RQcm9wZXJ0aWVzVXBkYXRlT3BlcmF0aW9uLmphdmEKQEAgLTM5LDYgKzM5LDcgQEAKIAkJc3VwZXIobW9kZWwpOwogCX0KIAorCUBPdmVycmlkZQogCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewogCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KW1vZGVsLmdldFByb3BlcnR5KCBJV2ViUHJvamVjdFByb3BlcnRpZXNVcGRhdGVEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1QgKTsKIAkJU3RyaW5nIGNvbnRleHRSb290ID0gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoIElXZWJQcm9qZWN0UHJvcGVydGllc1VwZGF0ZURhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEVYVF9ST09UICk7Cg==